diff options
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 |