summaryrefslogtreecommitdiffstats
path: root/src/lib
diff options
context:
space:
mode:
authorPatrick Williams <iawillia@us.ibm.com>2012-08-22 17:18:45 -0500
committerA. Patrick Williams III <iawillia@us.ibm.com>2012-09-07 10:13:22 -0500
commit8fdce540fed17630af2fe1412c963167e0a63a9c (patch)
treebaefefaf8a330b0fffead8f693cd96a356328413 /src/lib
parent4af5b97526d99ecb9e232b1933c804858a298876 (diff)
downloadtalos-hostboot-8fdce540fed17630af2fe1412c963167e0a63a9c.tar.gz
talos-hostboot-8fdce540fed17630af2fe1412c963167e0a63a9c.zip
Memory profiling tools.
Change-Id: I4a9cfc1f55c09ff6d02dce80889ac2e3150ab137 RTC: 44504 Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/1619 Tested-by: Jenkins Server Reviewed-by: Douglas R. Gilbert <dgilbert@us.ibm.com> Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com> Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/makefile48
-rw-r--r--src/lib/stdlib.C108
2 files changed, 109 insertions, 47 deletions
diff --git a/src/lib/makefile b/src/lib/makefile
index b7cd3196e..4b1d006db 100644
--- a/src/lib/makefile
+++ b/src/lib/makefile
@@ -1,25 +1,25 @@
-# IBM_PROLOG_BEGIN_TAG
-# This is an automatically generated prolog.
-#
-# $Source: src/lib/makefile $
-#
-# 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/makefile $
+#
+# 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
ROOTPATH = ../..
OBJS = string.o string_ext.o stdlib.o ctype.o assert.o stdio.o math.o
@@ -27,4 +27,8 @@ OBJS += syscall_stub.o syscall_task.o syscall_msg.o
OBJS += syscall_mmio.o syscall_time.o sync.o syscall_misc.o
OBJS += syscall_mm.o splaytree.o cxxtest_data.o
+ifdef HOSTBOOT_MEMORY_LEAKS
+EXTRACOMMONFLAGS += -DHOSTBOOT_MEMORY_LEAKS=1
+endif
+
include ${ROOTPATH}/config.mk
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;
}
+
OpenPOWER on IntegriCloud