summaryrefslogtreecommitdiffstats
path: root/src/lib/assert.C
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/assert.C
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/assert.C')
-rw-r--r--src/lib/assert.C53
1 files changed, 48 insertions, 5 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();
+ }
}
OpenPOWER on IntegriCloud