4a60012500ce48156c12b8636b42c918b006a4a0
[coreboot.git] / src / lib / malloc.c
1 #include <stdlib.h>
2 #include <console/console.h>
3
4 #if 0
5 #define MALLOCDBG(x)
6 #else
7 #define MALLOCDBG(x) printk_spew x
8 #endif
9 extern unsigned char _heap, _eheap;
10 static size_t free_mem_ptr = (size_t)&_heap;            /* Start of heap */
11 static size_t free_mem_end_ptr = (size_t)&_eheap;       /* End of heap */
12
13
14 void malloc_mark(malloc_mark_t *place)
15 {
16         *place = free_mem_ptr;
17         printk_spew("malloc_mark 0x%08lx\n", (unsigned long)free_mem_ptr);
18 }
19
20 void malloc_release(malloc_mark_t *ptr)
21 {
22         free_mem_ptr = *ptr;
23         printk_spew("malloc_release 0x%08lx\n", (unsigned long)free_mem_ptr);
24 }
25
26 void *malloc(size_t size)
27 {
28         void *p;
29
30         MALLOCDBG(("%s Enter, size %d, free_mem_ptr %p\n", __FUNCTION__, size, free_mem_ptr));
31         if (size < 0)
32                 die("Error! malloc: Size < 0");
33         if (free_mem_ptr <= 0)
34                 die("Error! malloc: Free_mem_ptr <= 0");
35
36         free_mem_ptr = (free_mem_ptr + 3) & ~3; /* Align */
37
38         p = (void *) free_mem_ptr;
39         free_mem_ptr += size;
40
41         if (free_mem_ptr >= free_mem_end_ptr)
42                 die("Error! malloc: Free_mem_ptr >= free_mem_end_ptr");
43
44         MALLOCDBG(("malloc 0x%08lx\n", (unsigned long)p));
45
46         return p;
47 }
48
49 void *realloc(void *mem, size_t size)
50 {
51         void *new_mem;
52
53         if (mem == 0)
54                 return malloc(size);
55         if (size == 0) {
56                 free(mem);
57                 return 0;
58         }
59
60         new_mem = malloc(size);
61         memcpy(new_mem, mem, size);
62         free(mem);
63         return new_mem;
64 }
65
66 void free(void *where)
67 {
68         /* Don't care */
69 }