blob: 2e700f78e56be3d70a34a0afc2b9d7a5207f8998 [file] [log] [blame]
Eric Biederman8ca8d762003-04-22 19:02:15 +00001#include <stdlib.h>
2#include <console/console.h>
3
Uwe Hermanna953f372010-11-10 00:14:32 +00004#if CONFIG_DEBUG_MALLOC
Stefan Reinauerc02b4fc2010-03-22 11:42:32 +00005#define MALLOCDBG(x...) printk(BIOS_SPEW, x)
Uwe Hermanna953f372010-11-10 00:14:32 +00006#else
Peter Stuge5015f792010-11-10 02:00:32 +00007#define MALLOCDBG(x...)
Eric Biederman8ca8d762003-04-22 19:02:15 +00008#endif
Uwe Hermanna953f372010-11-10 00:14:32 +00009
Eric Biederman8ca8d762003-04-22 19:02:15 +000010extern unsigned char _heap, _eheap;
Stefan Reinauer054c7232009-03-06 17:22:35 +000011static void *free_mem_ptr = &_heap; /* Start of heap */
12static void *free_mem_end_ptr = &_eheap; /* End of heap */
Eric Biederman8ca8d762003-04-22 19:02:15 +000013
Ron Minnicheb596362012-04-11 10:30:15 -070014/* We don't restrict the boundary. This is firmware,
15 * you are supposed to know what you are doing.
16 */
17void *memalign(size_t boundary, size_t size)
Eric Biederman8ca8d762003-04-22 19:02:15 +000018{
19 void *p;
20
Ron Minnicheb596362012-04-11 10:30:15 -070021 MALLOCDBG("%s Enter, boundary %ld, size %ld, free_mem_ptr %p\n",
22 __func__, boundary, size, free_mem_ptr);
Stefan Reinauer6bd571e2009-09-25 21:59:57 +000023
Stefan Reinauer6bd571e2009-09-25 21:59:57 +000024 /* Overzealous linker check */
Eric Biederman8ca8d762003-04-22 19:02:15 +000025 if (free_mem_ptr <= 0)
Ron Minnicheb596362012-04-11 10:30:15 -070026 die("Error! memalign: Free_mem_ptr <= 0");
Eric Biederman8ca8d762003-04-22 19:02:15 +000027
Ron Minnicheb596362012-04-11 10:30:15 -070028 free_mem_ptr = (void *)ALIGN((unsigned long)free_mem_ptr, boundary);
Eric Biederman8ca8d762003-04-22 19:02:15 +000029
Ron Minnicheb596362012-04-11 10:30:15 -070030 p = free_mem_ptr;
Eric Biederman8ca8d762003-04-22 19:02:15 +000031 free_mem_ptr += size;
32
33 if (free_mem_ptr >= free_mem_end_ptr)
Ron Minnicheb596362012-04-11 10:30:15 -070034 die("Error! memalign: Out of memory (free_mem_ptr >= free_mem_end_ptr)");
Eric Biederman8ca8d762003-04-22 19:02:15 +000035
Ron Minnicheb596362012-04-11 10:30:15 -070036 MALLOCDBG("memalign %p\n", p);
Eric Biederman8ca8d762003-04-22 19:02:15 +000037
38 return p;
39}
40
Ron Minnicheb596362012-04-11 10:30:15 -070041void *malloc(size_t size)
42{
43 return memalign(sizeof(u64), size);
44}
45
Eric Biederman8ca8d762003-04-22 19:02:15 +000046void free(void *where)
47{
48 /* Don't care */
Stefan Reinauer6bd571e2009-09-25 21:59:57 +000049 MALLOCDBG("free %p\n", where);
Eric Biederman8ca8d762003-04-22 19:02:15 +000050}