malloc: size is unsigned, don't test for size < 0
[coreboot.git] / src / lib / malloc.c
index 347ef0d67b8558d32f9ff2182abbbfa63d39c77b..c10750d5e99d3d774db1fc5adbea521068576a8a 100644 (file)
@@ -1,45 +1,33 @@
 #include <stdlib.h>
 #include <console/console.h>
 
-#if 0
-#define MALLOCDBG(x)
+#if CONFIG_DEBUG_MALLOC
+#define MALLOCDBG(x...) printk(BIOS_SPEW, x)
 #else
-#define MALLOCDBG(x...) printk_spew(x)
+#define MALLOCDBG(x...)
 #endif
+
 extern unsigned char _heap, _eheap;
 static void *free_mem_ptr = &_heap;            /* Start of heap */
 static void *free_mem_end_ptr = &_eheap;       /* End of heap */
 
-
-void malloc_mark(malloc_mark_t *place)
-{
-       *place = (malloc_mark_t)free_mem_ptr;
-       printk_spew("malloc_mark %p\n", free_mem_ptr);
-}
-
-void malloc_release(malloc_mark_t *ptr)
-{
-       free_mem_ptr = (void *)*ptr;
-       printk_spew("malloc_release %p\n", free_mem_ptr);
-}
-
 void *malloc(size_t size)
 {
        void *p;
 
        MALLOCDBG("%s Enter, size %ld, free_mem_ptr %p\n", __func__, size, free_mem_ptr);
-       if (size < 0)
-               die("Error! malloc: Size < 0");
+
+       /* Overzealous linker check */
        if (free_mem_ptr <= 0)
                die("Error! malloc: Free_mem_ptr <= 0");
 
-       free_mem_ptr = (void *)(((unsigned long)free_mem_ptr + 3) & ~3);        /* Align */
+       free_mem_ptr = (void *)ALIGN((unsigned long)free_mem_ptr, 4);
 
        p = (void *) free_mem_ptr;
        free_mem_ptr += size;
 
        if (free_mem_ptr >= free_mem_end_ptr)
-               die("Error! malloc: free_mem_ptr >= free_mem_end_ptr");
+               die("Error! malloc: Out of memory (free_mem_ptr >= free_mem_end_ptr)");
 
        MALLOCDBG("malloc %p\n", p);
 
@@ -49,4 +37,5 @@ void *malloc(size_t size)
 void free(void *where)
 {
        /* Don't care */
+       MALLOCDBG("free %p\n", where);
 }