blob: 347ef0d67b8558d32f9ff2182abbbfa63d39c77b [file] [log] [blame]
Eric Biederman8ca8d762003-04-22 19:02:15 +00001#include <stdlib.h>
2#include <console/console.h>
3
4#if 0
5#define MALLOCDBG(x)
6#else
Stefan Reinauer054c7232009-03-06 17:22:35 +00007#define MALLOCDBG(x...) printk_spew(x)
Eric Biederman8ca8d762003-04-22 19:02:15 +00008#endif
9extern unsigned char _heap, _eheap;
Stefan Reinauer054c7232009-03-06 17:22:35 +000010static void *free_mem_ptr = &_heap; /* Start of heap */
11static void *free_mem_end_ptr = &_eheap; /* End of heap */
Eric Biederman8ca8d762003-04-22 19:02:15 +000012
13
14void malloc_mark(malloc_mark_t *place)
15{
Stefan Reinauer054c7232009-03-06 17:22:35 +000016 *place = (malloc_mark_t)free_mem_ptr;
17 printk_spew("malloc_mark %p\n", free_mem_ptr);
Eric Biederman8ca8d762003-04-22 19:02:15 +000018}
19
20void malloc_release(malloc_mark_t *ptr)
21{
Stefan Reinauer054c7232009-03-06 17:22:35 +000022 free_mem_ptr = (void *)*ptr;
23 printk_spew("malloc_release %p\n", free_mem_ptr);
Eric Biederman8ca8d762003-04-22 19:02:15 +000024}
25
26void *malloc(size_t size)
27{
28 void *p;
29
Stefan Reinauer054c7232009-03-06 17:22:35 +000030 MALLOCDBG("%s Enter, size %ld, free_mem_ptr %p\n", __func__, size, free_mem_ptr);
Eric Biederman8ca8d762003-04-22 19:02:15 +000031 if (size < 0)
32 die("Error! malloc: Size < 0");
33 if (free_mem_ptr <= 0)
34 die("Error! malloc: Free_mem_ptr <= 0");
35
Stefan Reinauer054c7232009-03-06 17:22:35 +000036 free_mem_ptr = (void *)(((unsigned long)free_mem_ptr + 3) & ~3); /* Align */
Eric Biederman8ca8d762003-04-22 19:02:15 +000037
38 p = (void *) free_mem_ptr;
39 free_mem_ptr += size;
40
41 if (free_mem_ptr >= free_mem_end_ptr)
arch import user (historical)ef03afa2005-07-06 17:15:30 +000042 die("Error! malloc: free_mem_ptr >= free_mem_end_ptr");
Eric Biederman8ca8d762003-04-22 19:02:15 +000043
Stefan Reinauer054c7232009-03-06 17:22:35 +000044 MALLOCDBG("malloc %p\n", p);
Eric Biederman8ca8d762003-04-22 19:02:15 +000045
46 return p;
47}
48
Eric Biederman8ca8d762003-04-22 19:02:15 +000049void free(void *where)
50{
51 /* Don't care */
52}