malloc: size is unsigned, don't test for size < 0
[coreboot.git] / src / lib / malloc.c
index f2b8fd286ea18c9f01ce5f18b636d663f695cfc4..c10750d5e99d3d774db1fc5adbea521068576a8a 100644 (file)
@@ -1,47 +1,35 @@
 #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 size_t free_mem_ptr = (size_t)&_heap;           /* Start of heap */
-static size_t free_mem_end_ptr = (size_t)&_eheap;      /* End of heap */
-
-
-void malloc_mark(malloc_mark_t *place)
-{
-       *place = free_mem_ptr;
-       printk_spew("malloc_mark 0x%08lx\n", (unsigned long)free_mem_ptr);
-}
 
-void malloc_release(malloc_mark_t *ptr)
-{
-       free_mem_ptr = *ptr;
-       printk_spew("malloc_release 0x%08lx\n", (unsigned long)free_mem_ptr);
-}
+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(size_t size)
 {
        void *p;
 
-       MALLOCDBG(("%s Enter, size %ld, free_mem_ptr 0x%08lx\n", __func__, size, free_mem_ptr));
-       if (size < 0)
-               die("Error! malloc: Size < 0");
+       MALLOCDBG("%s Enter, size %ld, free_mem_ptr %p\n", __func__, size, free_mem_ptr);
+
+       /* Overzealous linker check */
        if (free_mem_ptr <= 0)
                die("Error! malloc: Free_mem_ptr <= 0");
 
-       free_mem_ptr = (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 0x%08lx\n", (unsigned long)p));
+       MALLOCDBG("malloc %p\n", p);
 
        return p;
 }
@@ -49,4 +37,5 @@ void *malloc(size_t size)
 void free(void *where)
 {
        /* Don't care */
+       MALLOCDBG("free %p\n", where);
 }