diff options
Diffstat (limited to 'src/lib/stdlib.C')
-rw-r--r-- | src/lib/stdlib.C | 108 |
1 files changed, 83 insertions, 25 deletions
diff --git a/src/lib/stdlib.C b/src/lib/stdlib.C index f0c3fad74..50d776cd5 100644 --- a/src/lib/stdlib.C +++ b/src/lib/stdlib.C @@ -1,25 +1,25 @@ -// IBM_PROLOG_BEGIN_TAG -// This is an automatically generated prolog. -// -// $Source: src/lib/stdlib.C $ -// -// IBM CONFIDENTIAL -// -// COPYRIGHT International Business Machines Corp. 2010 - 2011 -// -// p1 -// -// Object Code Only (OCO) source materials -// Licensed Internal Code Source Materials -// IBM HostBoot Licensed Internal Code -// -// The source code for this program is not published or other- -// wise divested of its trade secrets, irrespective of what has -// been deposited with the U.S. Copyright Office. -// -// Origin: 30 -// -// IBM_PROLOG_END +/* IBM_PROLOG_BEGIN_TAG */ +/* This is an automatically generated prolog. */ +/* */ +/* $Source: src/lib/stdlib.C $ */ +/* */ +/* IBM CONFIDENTIAL */ +/* */ +/* COPYRIGHT International Business Machines Corp. 2010,2012 */ +/* */ +/* p1 */ +/* */ +/* Object Code Only (OCO) source materials */ +/* Licensed Internal Code Source Materials */ +/* IBM HostBoot Licensed Internal Code */ +/* */ +/* The source code for this program is not published or otherwise */ +/* divested of its trade secrets, irrespective of what has been */ +/* deposited with the U.S. Copyright Office. */ +/* */ +/* Origin: 30 */ +/* */ +/* IBM_PROLOG_END_TAG */ #include <limits.h> #include <stdlib.h> #include <string.h> @@ -27,6 +27,46 @@ #include <kernel/pagemgr.H> #include <kernel/console.H> +#ifdef HOSTBOOT_MEMORY_LEAKS +#include <arch/ppc.H> + +/** Memory allocation function type + * + * These are used as parameters to the magic instruction so that the debug + * tools can determine what memory allocation function was being called. + */ +enum MemoryLeak_FunctionType +{ + MEMORYLEAK_MALLOC = 0, + MEMORYLEAK_REALLOC = 1, + MEMORYLEAK_FREE = 2 +}; + +/** @fn memoryleak_magic_instruction + * @brief Triggers the simics memoryleak analysis magic hap-handler. + * + * Arranges the memory allocation parameters into registers according to the + * Power ABI and triggers the magic instruction. The ABI puts parameter 0-3 + * into registers r3-r6. + * + * Function attribute of "noinline" is required to ensure that the compiler + * treats this as a real function instead of attempting to inline it. If it + * were to inline it then the parameters wouldn't end up in the right register. + */ +static void memoryleak_magic_instruction(MemoryLeak_FunctionType func, + size_t size, + void* ptr, + void* ptr2) __attribute__((noinline)); + +static void memoryleak_magic_instruction(MemoryLeak_FunctionType func, + size_t size, + void* ptr, + void* ptr2) +{ + MAGIC_INSTRUCTION(MAGIC_MEMORYLEAK_FUNCTION); + return; +} +#endif #ifdef MEM_ALLOC_PROFILE // alloc profile @@ -58,7 +98,14 @@ void* malloc(size_t s) else if (s <= 2048) ++g_2k; else ++g_big; #endif - return HeapManager::allocate(s); + + void* result = HeapManager::allocate(s); + +#ifdef HOSTBOOT_MEMORY_LEAKS + memoryleak_magic_instruction(MEMORYLEAK_MALLOC, s, result, NULL); +#endif + + return result; } @@ -66,6 +113,10 @@ void free(void* p) { if (NULL == p) return; +#ifdef HOSTBOOT_MEMORY_LEAKS + memoryleak_magic_instruction(MEMORYLEAK_FREE, 0, p, NULL); +#endif + HeapManager::free(p); } @@ -74,8 +125,14 @@ void* realloc(void* p, size_t s) { if (NULL == p) return malloc(s); - return HeapManager::realloc(p,s); -} + void* result = HeapManager::realloc(p,s); + +#ifdef HOSTBOOT_MEMORY_LEAKS + memoryleak_magic_instruction(MEMORYLEAK_REALLOC, s, result, p); +#endif + + return result; +} void* calloc(size_t num, size_t size) { @@ -92,3 +149,4 @@ void* calloc(size_t num, size_t size) return mem; } + |