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 /src/lib/stdlib.C | |
| parent | 343cc75d83b7d71a23adb49e0d530eb59997a154 (diff) | |
| download | talos-hostboot-a0e3bdeaed824af328e0bafc59e69ebfd1b3de4e.tar.gz talos-hostboot-a0e3bdeaed824af328e0bafc59e69ebfd1b3de4e.zip | |
malloc / free support
Diffstat (limited to 'src/lib/stdlib.C')
| -rw-r--r-- | src/lib/stdlib.C | 35 |
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); + } +} |

