summaryrefslogtreecommitdiffstats
path: root/src/lib
diff options
context:
space:
mode:
authorPatrick Williams <iawillia@us.ibm.com>2011-06-24 10:13:59 -0500
committerA. Patrick Williams III <iawillia@us.ibm.com>2011-07-06 13:32:14 -0500
commit9ada6b493e33fe43057b03897d57f2ad931d219f (patch)
treebbf89ebdb16bf9b1fe2b466979d610835e8e58fb /src/lib
parent6c77e26e9454c6753d989f33430c4e361f6ff003 (diff)
downloadtalos-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.C53
-rw-r--r--src/lib/sync.C2
-rw-r--r--src/lib/syscall_mmio.C2
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;
OpenPOWER on IntegriCloud