diff options
author | Patrick Williams <iawillia@us.ibm.com> | 2010-05-21 16:03:32 -0500 |
---|---|---|
committer | Patrick Williams <iawillia@us.ibm.com> | 2010-05-21 16:03:32 -0500 |
commit | a0e3bdeaed824af328e0bafc59e69ebfd1b3de4e (patch) | |
tree | 469c99443aface768c7b70a018d34409cec432d8 | |
parent | 343cc75d83b7d71a23adb49e0d530eb59997a154 (diff) | |
download | talos-hostboot-a0e3bdeaed824af328e0bafc59e69ebfd1b3de4e.tar.gz talos-hostboot-a0e3bdeaed824af328e0bafc59e69ebfd1b3de4e.zip |
malloc / free support
-rw-r--r-- | src/include/kernel/heapmgr.H | 4 | ||||
-rw-r--r-- | src/include/kernel/pagemgr.H | 2 | ||||
-rw-r--r-- | src/include/stdlib.h | 18 | ||||
-rw-r--r-- | src/kernel/heapmgr.C | 7 | ||||
-rw-r--r-- | src/kernel/kernel.C | 5 | ||||
-rw-r--r-- | src/kernel/pagemgr.C | 5 | ||||
-rw-r--r-- | src/lib/makefile | 2 | ||||
-rw-r--r-- | src/lib/stdlib.C | 35 |
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); + } +} |