diff options
author | Patrick Williams <iawillia@us.ibm.com> | 2011-06-24 10:13:59 -0500 |
---|---|---|
committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2011-07-06 13:32:14 -0500 |
commit | 9ada6b493e33fe43057b03897d57f2ad931d219f (patch) | |
tree | bbf89ebdb16bf9b1fe2b466979d610835e8e58fb /src/lib | |
parent | 6c77e26e9454c6753d989f33430c4e361f6ff003 (diff) | |
download | talos-hostboot-9ada6b493e33fe43057b03897d57f2ad931d219f.tar.gz talos-hostboot-9ada6b493e33fe43057b03897d57f2ad931d219f.zip |
Improve assert handling and options.
- Allow a custom assert trace as an optional parameter.
- Call a trace function instead of printk for most cases.
- Provide a critical library assert (for syslibs, trace, etc.)
- Provide a kassert function for kernel code.
Change-Id: If24d57d0832a587258503b3fd0046c21da3712b5
Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/159
Tested-by: Jenkins Server
Reviewed-by: Andrew J. Geissler <andrewg@us.ibm.com>
Reviewed-by: CAMVAN T. NGUYEN <ctnguyen@us.ibm.com>
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/assert.C | 53 | ||||
-rw-r--r-- | src/lib/sync.C | 2 | ||||
-rw-r--r-- | src/lib/syscall_mmio.C | 2 |
3 files changed, 50 insertions, 7 deletions
diff --git a/src/lib/assert.C b/src/lib/assert.C index 953068d4a..c8b454a2f 100644 --- a/src/lib/assert.C +++ b/src/lib/assert.C @@ -1,10 +1,53 @@ +/** @file assert.C + * @brief Common handling functions for assert paths. + */ + +#include <builtins.h> #include <kernel/console.H> +#include <assert.h> +#include <sys/task.h> +#include <arch/ppc.H> + +/** Hook location for trace module to set up when loaded. */ +namespace TRACE { void (*traceCallback)(void*, size_t) = NULL; }; -extern "C" void __assert(bool expr, const char *exprStr, - const char *file, int line) +extern "C" void __assert(AssertBehavior i_assertb, int i_line) { - // TODO - printk("Assert in %s (%d): %s\n", file, line, exprStr); - while (true); + switch (i_assertb) + { + case ASSERT_TRACE_DONE: // Custom trace was provided. + task_end(); + break; + + case ASSERT_TRACE_NOTDONE: // Do a normal trace. + if (NULL != TRACE::traceCallback) + { + (*TRACE::traceCallback)(linkRegister(), i_line); + } + else + { + printk("Assertion failed @%p on line %d.\n", + linkRegister(), i_line); + } + task_end(); + break; + + case ASSERT_CRITICAL: // Critical task, trace not available. + printk("Assertion failed @%p on line %d.\n", + linkRegister(), i_line); + task_end(); + break; + + case ASSERT_KERNEL: // Kernel assert called. + printk("Assertion failed @%p on line %d.\n", + linkRegister(), i_line); + break; + } + + // Loop forever if we make it here. Should only happen in kernel code. + while (true) + { + setThreadPriorityLow(); + } } diff --git a/src/lib/sync.C b/src/lib/sync.C index 093c7f41e..788ecb1c4 100644 --- a/src/lib/sync.C +++ b/src/lib/sync.C @@ -33,7 +33,7 @@ void barrier_init (barrier_t * o_barrier, uint64_t i_count) void barrier_destroy (barrier_t * i_barrier) { - assert(i_barrier->iv_missing == i_barrier->iv_count); + crit_assert(i_barrier->iv_missing == i_barrier->iv_count); return; } diff --git a/src/lib/syscall_mmio.C b/src/lib/syscall_mmio.C index 83a4f8f82..754666a35 100644 --- a/src/lib/syscall_mmio.C +++ b/src/lib/syscall_mmio.C @@ -33,7 +33,7 @@ mutex_t * mmio_xscom_mutex() asm volatile("mr %0, 13" : "=r"(task)); // Ensure task is pinned. - assert(task->affinity_pinned); + crit_assert(task->affinity_pinned); // Return mutex from cpu structure. return &task->cpu->xscom_mutex; |