summaryrefslogtreecommitdiff
path: root/payloads/libpayload/libc/malloc.c
diff options
context:
space:
mode:
authorMarc Jones <marc.jones@se-eng.com>2012-03-20 16:53:44 -0600
committerPeter Stuge <peter@stuge.se>2012-03-21 21:03:24 +0100
commitccee6256b48ad619d16c4479a25937fa95b93efc (patch)
tree5e1455e3ad48cd7dd68348b4881f5cdfe7a72960 /payloads/libpayload/libc/malloc.c
parent06253cd9a5742078386f355a06c0f13bebbcc5ce (diff)
downloadcoreboot-ccee6256b48ad619d16c4479a25937fa95b93efc.tar.xz
Fix libpayload alloc() size and gcc pointer optimization problems.
The previous commit was incomplete and missed setting the entire alloc area. There are also additional problems with gcc optimizations of the pointer math. The "auto" casting by gcc wouldn't return warnings, but it was causing the optimization to be incorrect. We are now very explicit in the casting in the pointer math. Change-Id: I020808c8d1dda544fe862b9efb0e5345eeab5aab Signed-off-by: Marc Jones <marc.jones@se-eng.com> Reviewed-on: http://review.coreboot.org/804 Tested-by: build bot (Jenkins) Reviewed-by: Peter Stuge <peter@stuge.se>
Diffstat (limited to 'payloads/libpayload/libc/malloc.c')
-rw-r--r--payloads/libpayload/libc/malloc.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/payloads/libpayload/libc/malloc.c b/payloads/libpayload/libc/malloc.c
index 9412cab189..3c5a3fd2a2 100644
--- a/payloads/libpayload/libc/malloc.c
+++ b/payloads/libpayload/libc/malloc.c
@@ -96,7 +96,7 @@ static void *alloc(int len)
/* Make sure the region is setup correctly. */
if (!HAS_MAGIC(*ptr))
- setup(ptr, len);
+ setup(ptr, (int)((&_eheap - &_heap) - HDRSIZE));
/* Find some free space. */
do {
@@ -112,7 +112,7 @@ static void *alloc(int len)
if (header & FLAG_FREE) {
if (len <= size) {
- hdrtype_t volatile *nptr = ptr + (HDRSIZE + len);
+ hdrtype_t volatile *nptr = (hdrtype_t volatile *)((int)ptr + HDRSIZE + len);
int nsize = size - (HDRSIZE + len);
/* If there is still room in this block,
@@ -131,11 +131,11 @@ static void *alloc(int len)
*ptr = USED_BLOCK(size);
}
- return (void *)(ptr + HDRSIZE);
+ return (void *)((int)ptr + HDRSIZE);
}
}
- ptr += HDRSIZE + size;
+ ptr = (hdrtype_t volatile *)((int)ptr + HDRSIZE + size);
} while (ptr < (hdrtype_t *) hend);
@@ -422,7 +422,7 @@ void print_malloc_map(void)
if (free_memory && (minimal_free > free_memory))
minimal_free = free_memory;
- printf("Maximum memory consumption: %d bytes",
+ printf("Maximum memory consumption: %d bytes\n",
(unsigned int)(&_eheap - &_heap) - HDRSIZE - minimal_free);
}
#endif