summaryrefslogtreecommitdiffstats
path: root/src/lib/stdlib.C
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/lib/stdlib.C
parent343cc75d83b7d71a23adb49e0d530eb59997a154 (diff)
downloadtalos-hostboot-a0e3bdeaed824af328e0bafc59e69ebfd1b3de4e.tar.gz
talos-hostboot-a0e3bdeaed824af328e0bafc59e69ebfd1b3de4e.zip
malloc / free support
Diffstat (limited to 'src/lib/stdlib.C')
-rw-r--r--src/lib/stdlib.C35
1 files changed, 35 insertions, 0 deletions
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