From f5b76fe9e9dc179cc0e29f724d132e530f88b401 Mon Sep 17 00:00:00 2001 From: Julius Werner Date: Thu, 19 May 2016 13:15:16 -0700 Subject: libpayload: Fix CONFIG_LP_DEBUG_MALLOC for 64-bit archs New compilers are a little more stringent about defining the same prototype more than once, so some of our CONFIG_LP_DEBUG_MALLOC wrappers don't quite work the way they are written anymore. Also, several of the printf()s weren't written 64-bit safe. And let's add some double-evaluation safety while I'm here anyway... and I have no idea why this ever depended on CONFIG_LP_USB, that just seems like a typo. Change-Id: Ib54ebc3cfba99f372690365b78c7ceb372c0bd45 Signed-off-by: Julius Werner Reviewed-on: https://review.coreboot.org/c/coreboot/+/14921 Tested-by: build bot (Jenkins) Reviewed-by: Hung-Te Lin --- payloads/libpayload/Kconfig | 1 - payloads/libpayload/include/stdlib.h | 186 +++++++++++++++++------------------ payloads/libpayload/libc/malloc.c | 6 +- 3 files changed, 91 insertions(+), 102 deletions(-) (limited to 'payloads/libpayload') diff --git a/payloads/libpayload/Kconfig b/payloads/libpayload/Kconfig index fd967c1a52..5dce89ae6f 100644 --- a/payloads/libpayload/Kconfig +++ b/payloads/libpayload/Kconfig @@ -415,7 +415,6 @@ menu "Debugging" config DEBUG_MALLOC bool "Debug memory allocator" - depends on USB default n help Select this option if you want to debug the memory allocator. This diff --git a/payloads/libpayload/include/stdlib.h b/payloads/libpayload/include/stdlib.h index aaacc87973..3f94d2119a 100644 --- a/payloads/libpayload/include/stdlib.h +++ b/payloads/libpayload/include/stdlib.h @@ -45,104 +45,6 @@ * @defgroup malloc Memory allocation functions * @{ */ -#if CONFIG(LP_DEBUG_MALLOC) && !defined(IN_MALLOC_C) -#define free(p) \ - ({ \ - extern void print_malloc_map(void); \ - extern void free(void *); \ - printf("free(%p) called from %s:%s:%d...\n", p, __FILE__, __func__, \ - __LINE__);\ - printf("PRE free()\n"); \ - print_malloc_map(); \ - free(p); \ - printf("POST free()\n"); \ - print_malloc_map(); \ - }) -#define malloc(s) \ - ({ \ - extern void print_malloc_map(void); \ - extern void *malloc(size_t); \ - void *ptr; \ - printf("malloc(%u) called from %s:%s:%d...\n", s, __FILE__, __func__, \ - __LINE__);\ - printf("PRE malloc\n"); \ - print_malloc_map(); \ - ptr = malloc(s); \ - printf("POST malloc (ptr = %p)\n", ptr); \ - print_malloc_map(); \ - ptr; \ - }) -#define calloc(n,s) \ - ({ \ - extern void print_malloc_map(void); \ - extern void *calloc(size_t,size_t); \ - void *ptr; \ - printf("calloc(%u, %u) called from %s:%s:%d...\n", n, s, __FILE__, \ - __func__, __LINE__);\ - printf("PRE calloc\n"); \ - print_malloc_map(); \ - ptr = calloc(n,s); \ - printf("POST calloc (ptr = %p)\n", ptr); \ - print_malloc_map(); \ - ptr; \ - }) -#define realloc(p,s) \ - ({ \ - extern void print_malloc_map(void); \ - extern void *realloc(void*,size_t); \ - void *ptr; \ - printf("realloc(%p, %u) called from %s:%s:%d...\n", p, s, __FILE__, \ - __func__, __LINE__);\ - printf("PRE realloc\n"); \ - print_malloc_map(); \ - ptr = realloc(p,s); \ - printf("POST realloc (ptr = %p)\n", ptr); \ - print_malloc_map(); \ - ptr; \ - }) -#define memalign(a,s) \ - ({ \ - extern void print_malloc_map(void); \ - extern void *memalign(size_t, size_t); \ - void *ptr; \ - printf("memalign(%u, %u) called from %s:%s:%d...\n", a, s, __FILE__, \ - __func__, __LINE__);\ - printf("PRE memalign\n"); \ - print_malloc_map(); \ - ptr = memalign(a,s); \ - printf("POST memalign (ptr = %p)\n", ptr); \ - print_malloc_map(); \ - ptr; \ - }) -#define dma_malloc(s) \ - ({ \ - extern void print_malloc_map(void); \ - extern void *dma_malloc(size_t); \ - void *ptr; \ - printf("dma_malloc(%u) called from %s:%s:%d...\n", s, __FILE__, \ - __func__, __LINE__);\ - printf("PRE dma_malloc\n"); \ - print_malloc_map(); \ - ptr = dma_malloc(s); \ - printf("POST dma_malloc (ptr = %p)\n", ptr); \ - print_malloc_map(); \ - ptr; \ - }) -#define dma_memalign(a,s) \ - ({ \ - extern void print_malloc_map(void); \ - extern void *dma_memalign(size_t, size_t); \ - void *ptr; \ - printf("dma_memalign(%u, %u) called from %s:%s:%d...\n", a, s, \ - __FILE__, __func__, __LINE__);\ - printf("PRE dma_memalign\n"); \ - print_malloc_map(); \ - ptr = dma_memalign(a,s); \ - printf("POST dma_memalign (ptr = %p)\n", ptr); \ - print_malloc_map(); \ - ptr; \ - }) -#else void free(void *ptr); void *malloc(size_t size); void *calloc(size_t nmemb, size_t size); @@ -150,7 +52,95 @@ void *realloc(void *ptr, size_t size); void *memalign(size_t align, size_t size); void *dma_malloc(size_t size); void *dma_memalign(size_t align, size_t size); + +#if CONFIG(LP_DEBUG_MALLOC) && !defined(IN_MALLOC_C) +#include +void print_malloc_map(void); +#define free(p) ({ \ + void *__p = p; \ + printf("free(%p) called from %s:%s:%d...\n", __p, __FILE__, __func__, \ + __LINE__);\ + printf("PRE free()\n"); \ + print_malloc_map(); \ + free(__p); \ + printf("POST free()\n"); \ + print_malloc_map(); \ +}) +#define malloc(s) ({ \ + size_t __s = s; \ + void *ptr; \ + printf("malloc(%zu) called from %s:%s:%d...\n", __s, __FILE__, \ + __func__, __LINE__);\ + printf("PRE malloc\n"); \ + print_malloc_map(); \ + ptr = malloc(__s); \ + printf("POST malloc (ptr = %p)\n", ptr); \ + print_malloc_map(); \ + ptr; \ +}) +#define calloc(n, s) ({ \ + size_t __n = n, __s = s; \ + void *ptr; \ + printf("calloc(%zu, %zu) called from %s:%s:%d...\n", __n, __s, \ + __FILE__, __func__, __LINE__);\ + printf("PRE calloc\n"); \ + print_malloc_map(); \ + ptr = calloc(__n, __s); \ + printf("POST calloc (ptr = %p)\n", ptr); \ + print_malloc_map(); \ + ptr; \ +}) +#define realloc(p, s) ({ \ + void *__p = p; \ + size_t __s = s; \ + void *ptr; \ + printf("realloc(%p, %zu) called from %s:%s:%d...\n", __p, __s, \ + __FILE__, __func__, __LINE__);\ + printf("PRE realloc\n"); \ + print_malloc_map(); \ + ptr = realloc(__p, __s); \ + printf("POST realloc (ptr = %p)\n", ptr); \ + print_malloc_map(); \ + ptr; \ +}) +#define memalign(a, s) ({ \ + size_t __a = a, __s = s; \ + void *ptr; \ + printf("memalign(%zu, %zu) called from %s:%s:%d...\n", __a, __s, \ + __FILE__, __func__, __LINE__);\ + printf("PRE memalign\n"); \ + print_malloc_map(); \ + ptr = memalign(__a, __s); \ + printf("POST memalign (ptr = %p)\n", ptr); \ + print_malloc_map(); \ + ptr; \ +}) +#define dma_malloc(s) ({ \ + size_t __s = s; \ + void *ptr; \ + printf("dma_malloc(%zu) called from %s:%s:%d...\n", __s, __FILE__, \ + __func__, __LINE__);\ + printf("PRE dma_malloc\n"); \ + print_malloc_map(); \ + ptr = dma_malloc(__s); \ + printf("POST dma_malloc (ptr = %p)\n", ptr); \ + print_malloc_map(); \ + ptr; \ +}) +#define dma_memalign(a, s) ({ \ + size_t __a = a, __s = s; \ + void *ptr; \ + printf("dma_memalign(%zu, %zu) called from %s:%s:%d...\n", __a, __s, \ + __FILE__, __func__, __LINE__);\ + printf("PRE dma_memalign\n"); \ + print_malloc_map(); \ + ptr = dma_memalign(__a, __s); \ + printf("POST dma_memalign (ptr = %p)\n", ptr); \ + print_malloc_map(); \ + ptr; \ +}) #endif + void init_dma_memory(void *start, u32 size); int dma_initialized(void); int dma_coherent(void *ptr); diff --git a/payloads/libpayload/libc/malloc.c b/payloads/libpayload/libc/malloc.c index 957f0e07b0..510758970e 100644 --- a/payloads/libpayload/libc/malloc.c +++ b/payloads/libpayload/libc/malloc.c @@ -480,7 +480,7 @@ look_further: if ((reg->alignment == align) && (reg->free >= (size + align - 1)/align)) { #if CONFIG(LP_DEBUG_MALLOC) - printf(" found memalign region. %x free, %x required\n", reg->free, (size + align - 1)/align); + printf(" found memalign region. %u free, %zu required\n", reg->free, (size + align - 1)/align); #endif break; } @@ -563,7 +563,7 @@ again: /* FIXME: Verify the size of the block. */ - printf("%s %x: %s (%x bytes)\n", type->name, + printf("%s %x: %s (%llx bytes)\n", type->name, (unsigned int)(ptr - type->start), hdr & FLAG_FREE ? "FREE" : "USED", SIZE(hdr)); @@ -575,7 +575,7 @@ again: if (free_memory && (type->minimal_free > free_memory)) type->minimal_free = free_memory; - printf("%s: Maximum memory consumption: %u bytes\n", type->name, + printf("%s: Maximum memory consumption: %zu bytes\n", type->name, (type->end - type->start) - HDRSIZE - type->minimal_free); if (type != dma) { -- cgit v1.2.3