summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPatrick Williams <iawillia@us.ibm.com>2010-05-21 16:03:32 -0500
committerPatrick Williams <iawillia@us.ibm.com>2010-05-21 16:03:32 -0500
commita0e3bdeaed824af328e0bafc59e69ebfd1b3de4e (patch)
tree469c99443aface768c7b70a018d34409cec432d8 /src
parent343cc75d83b7d71a23adb49e0d530eb59997a154 (diff)
downloadtalos-hostboot-a0e3bdeaed824af328e0bafc59e69ebfd1b3de4e.tar.gz
talos-hostboot-a0e3bdeaed824af328e0bafc59e69ebfd1b3de4e.zip
malloc / free support
Diffstat (limited to 'src')
-rw-r--r--src/include/kernel/heapmgr.H4
-rw-r--r--src/include/kernel/pagemgr.H2
-rw-r--r--src/include/stdlib.h18
-rw-r--r--src/kernel/heapmgr.C7
-rw-r--r--src/kernel/kernel.C5
-rw-r--r--src/kernel/pagemgr.C5
-rw-r--r--src/lib/makefile2
-rw-r--r--src/lib/stdlib.C35
8 files changed, 75 insertions, 3 deletions
diff --git a/src/include/kernel/heapmgr.H b/src/include/kernel/heapmgr.H
index 41a3e2cf5..6e189da93 100644
--- a/src/include/kernel/heapmgr.H
+++ b/src/include/kernel/heapmgr.H
@@ -7,12 +7,16 @@
class HeapManager
{
public:
+ static void init();
+
static void* allocate(size_t n);
static void free(void *);
enum
{
BUCKETS = 8,
+
+ MAX_ALLOC_SIZE = (1 << (BUCKETS + 4)) - 8,
};
protected:
diff --git a/src/include/kernel/pagemgr.H b/src/include/kernel/pagemgr.H
index b99cedff2..fded2c6c1 100644
--- a/src/include/kernel/pagemgr.H
+++ b/src/include/kernel/pagemgr.H
@@ -11,6 +11,8 @@
class PageManager
{
public:
+ static void init();
+
static void* allocatePage(size_t n = 1);
static void freePage(void*, size_t n = 1);
diff --git a/src/include/stdlib.h b/src/include/stdlib.h
new file mode 100644
index 000000000..46c463119
--- /dev/null
+++ b/src/include/stdlib.h
@@ -0,0 +1,18 @@
+#ifndef __STDLIB_H
+#define __STDLIB_H
+
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+void* malloc(size_t);
+void free(void*);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif
diff --git a/src/kernel/heapmgr.C b/src/kernel/heapmgr.C
index 43a9cd23c..b6e47140c 100644
--- a/src/kernel/heapmgr.C
+++ b/src/kernel/heapmgr.C
@@ -3,6 +3,11 @@
#include <kernel/console.H>
#include <kernel/pagemgr.H>
+void HeapManager::init()
+{
+ Singleton<HeapManager>::instance();
+}
+
void* HeapManager::allocate(size_t n)
{
HeapManager& hmgr = Singleton<HeapManager>::instance();
@@ -37,7 +42,7 @@ void HeapManager::_free(void* p)
{
if (NULL == p) return;
- chunk_t* chunk = (chunk_t*)((size_t*)p)-1;
+ chunk_t* chunk = (chunk_t*)(((size_t*)p)-1);
push_bucket(chunk, chunk->len);
}
diff --git a/src/kernel/kernel.C b/src/kernel/kernel.C
index 2872c398f..cba5d231c 100644
--- a/src/kernel/kernel.C
+++ b/src/kernel/kernel.C
@@ -4,6 +4,8 @@
#include <kernel/heapmgr.H>
#include <util/singleton.H>
+#include <stdlib.h>
+
class Kernel
{
public:
@@ -41,6 +43,7 @@ void Kernel::cppBootstrap()
void Kernel::memBootstrap()
{
- PageManager::freePage(PageManager::allocatePage());
+ PageManager::init();
+ HeapManager::init();
}
diff --git a/src/kernel/pagemgr.C b/src/kernel/pagemgr.C
index 400ad118b..a184ee23f 100644
--- a/src/kernel/pagemgr.C
+++ b/src/kernel/pagemgr.C
@@ -2,6 +2,11 @@
#include <util/singleton.H>
#include <kernel/console.H>
+void PageManager::init()
+{
+ Singleton<PageManager>::instance();
+}
+
void* PageManager::allocatePage(size_t n)
{
PageManager& pmgr = Singleton<PageManager>::instance();
diff --git a/src/lib/makefile b/src/lib/makefile
index 105f74a05..b4e27e478 100644
--- a/src/lib/makefile
+++ b/src/lib/makefile
@@ -1,7 +1,7 @@
OBJDIR = ../../obj
include ../../config.mk
-OBJS = string.o
+OBJS = string.o stdlib.o
OBJECTS = $(addprefix ${OBJDIR}/, ${OBJS})
all: ${OBJECTS}
diff --git a/src/lib/stdlib.C b/src/lib/stdlib.C
new file mode 100644
index 000000000..5bf0d87f6
--- /dev/null
+++ b/src/lib/stdlib.C
@@ -0,0 +1,35 @@
+#include <stdlib.h>
+#include <kernel/heapmgr.H>
+#include <kernel/pagemgr.H>
+
+void* malloc(size_t s)
+{
+ if (s > HeapManager::MAX_ALLOC_SIZE)
+ {
+ size_t pages = (s+8) / PageManager::PAGESIZE;
+ void* v = PageManager::allocatePage(pages);
+ size_t* len = (size_t*)v;
+ *len = pages << 8;
+ len++;
+ return len;
+ }
+ else
+ return HeapManager::allocate(s);
+}
+
+void free(void* p)
+{
+ if (NULL == p) return;
+
+ size_t* len = (size_t*)p;
+ len--;
+
+ if ((*len) > 0xff)
+ {
+ PageManager::freePage(len, (*len) >> 8);
+ }
+ else
+ {
+ HeapManager::free(p);
+ }
+}
OpenPOWER on IntegriCloud