diff options
author | Andrew Jeffery <andrewrj@au1.ibm.com> | 2018-09-17 17:23:06 +0930 |
---|---|---|
committer | Daniel M. Crowell <dcrowell@us.ibm.com> | 2018-10-02 14:39:58 -0500 |
commit | 797f6fc918229a8a12fe3d45605fa8e7050e636f (patch) | |
tree | 78fdb75d42358492be0a9658c134365118aefb69 /src/lib | |
parent | 8a4663c131e113ac85337a55ba72ce9e1688ec49 (diff) | |
download | talos-hostboot-797f6fc918229a8a12fe3d45605fa8e7050e636f.tar.gz talos-hostboot-797f6fc918229a8a12fe3d45605fa8e7050e636f.zip |
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 <andrewrj@au1.ibm.com>
Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/66118
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Reviewed-by: Corey V. Swenson <cswenson@us.ibm.com>
Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/assert.C | 17 |
1 files changed, 15 insertions, 2 deletions
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 <kernel/terminate.H> #include <sys/misc.h> #include <kernel/kernel_reasoncodes.H> +#include <kernel/taskmgr.H> /** 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<uint64_t>(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 |