From 797f6fc918229a8a12fe3d45605fa8e7050e636f Mon Sep 17 00:00:00 2001 From: Andrew Jeffery Date: Mon, 17 Sep 2018 17:23:06 +0930 Subject: assert: Print the backtrace for critical and kernel assertions Improve debug ergonomics by allowing developers to backtrack from the assertion through the call-stack. This is important for generic code, for example, when dealing with assertions inside free(). Change-Id: I0c9c767c50acf3ee3bbe0a891441429299e2d239 Signed-off-by: Andrew Jeffery Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/66118 Tested-by: Jenkins Server Tested-by: Jenkins OP Build CI Tested-by: Jenkins OP HW Tested-by: FSP CI Jenkins Reviewed-by: Corey V. Swenson Reviewed-by: Daniel M. Crowell --- src/lib/assert.C | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) (limited to 'src/lib') diff --git a/src/lib/assert.C b/src/lib/assert.C index bd55ae546..abc4c1489 100644 --- a/src/lib/assert.C +++ b/src/lib/assert.C @@ -37,6 +37,7 @@ #include #include #include +#include /** Hook location for trace module to set up when loaded. */ namespace TRACE { void (*traceCallback)(void*, size_t) = NULL; }; @@ -44,9 +45,17 @@ namespace TRACE { void (*traceCallback)(void*, size_t) = NULL; }; extern "C" void __assert(AssertBehavior i_assertb, const char* i_file, int i_line) { - if ((i_assertb == ASSERT_CRITICAL) && (KernelMisc::in_kernel_mode())) + + task_t* task = NULL; + + if (KernelMisc::in_kernel_mode()) { - i_assertb = ASSERT_KERNEL; + task = TaskManager::getCurrentTask(); + + if (i_assertb == ASSERT_CRITICAL) + { + i_assertb = ASSERT_KERNEL; + } } switch (i_assertb) @@ -72,6 +81,8 @@ extern "C" void __assert(AssertBehavior i_assertb, const char* i_file, printk("Assertion failed @%p on line %s:%d. (Crit_Assert)\n", linkRegister(), i_file, i_line); + KernelMisc::printkBacktrace(task); + // Need to call the external CritAssert system call cpu_crit_assert(reinterpret_cast(linkRegister())); break; @@ -80,6 +91,8 @@ extern "C" void __assert(AssertBehavior i_assertb, const char* i_file, printk("Assertion failed @%p on line %s:%d. (kassert)\n", linkRegister(), i_file, i_line); + KernelMisc::printkBacktrace(task); + /*@ * @errortype * @moduleid KERNEL::MOD_KERNEL_INVALID -- cgit v1.2.1