[Skiboot] [PATCH RFC v2 00/12] opal-prd updates for p9
Stewart Smith
stewart at linux.vnet.ibm.com
Tue Jun 6 18:56:20 AEST 2017
Daniel M Crowell <dcrowell at us.ibm.com> writes:
> I thought things were working now so that is new news to me.
weirdly, if I build a statically linked opal-prd, it does work... well,
fails somewhere deeper in HBRT with:
HBRT: Assertion failed @0x3fffa6f60e2c on line 96.
Which isn't so clear...
Here's a (completely untested) patch that would make the assert notice
from HB/HBRT also include source file name and line number. Feel free to
grab/try or I could probably clean it up a bit and submit upstream if
that'd help.
diff --git a/src/include/assert.h b/src/include/assert.h
index c3f7ea0c4b1d..39372b928bc0 100644
--- a/src/include/assert.h
+++ b/src/include/assert.h
@@ -93,7 +93,11 @@ enum AssertBehavior
* user-space dispatching.
*/
NO_RETURN
-void __assert(AssertBehavior i_assertb, int i_line);
+void __assert(AssertBehavior i_assertb, int i_line, const char *msg);
+
+#define stringify(expr) stringify_1(expr)
+/* Double-indirection required to stringify expansions */
+#define stringify_1(expr) #expr
#ifdef __HOSTBOOT_MODULE // Only allow traced assert in module code.
@@ -132,7 +136,8 @@ void __assert(AssertBehavior i_assertb, int i_line);
__ASSERT_DO_TRACE(expr, __VA_ARGS__); \
__assert((__ASSERT_HAS_TRACE(__VA_ARGS__) ? \
ASSERT_TRACE_DONE : ASSERT_TRACE_NOTDONE),\
- __LINE__);\
+ __LINE__,
+ __FILE__ ":" stringify(__LINE__) ":" stringify(expr));\
}\
}
@@ -147,7 +152,7 @@ void __assert(AssertBehavior i_assertb, int i_line);
{\
if (unlikely(!(expr)))\
{\
- __assert(ASSERT_KERNEL, __LINE__);\
+ __assert(ASSERT_KERNEL, __LINE__, __FILE__ ":" stringify(__LINE__) ":" stringify(expr));\
}\
}
diff --git a/src/lib/assert.C b/src/lib/assert.C
index 953393c314f5..fe48a8ee290f 100644
--- a/src/lib/assert.C
+++ b/src/lib/assert.C
@@ -41,7 +41,7 @@
/** Hook location for trace module to set up when loaded. */
namespace TRACE { void (*traceCallback)(void*, size_t) = NULL; };
-extern "C" void __assert(AssertBehavior i_assertb, int i_line)
+extern "C" void __assert(AssertBehavior i_assertb, int i_line, const char *msg)
{
if ((i_assertb == ASSERT_CRITICAL) && (KernelMisc::in_kernel_mode()))
{
@@ -61,23 +61,23 @@ extern "C" void __assert(AssertBehavior i_assertb, int i_line)
}
else
{
- printk("Assertion failed @%p on line %d.\n",
- linkRegister(), i_line);
+ printk("Assertion failed @%p: %s\n",
+ linkRegister(), msg);
}
task_crash();
break;
case ASSERT_CRITICAL: // Critical task, trace not available.
- printk("Assertion failed @%p on line %d.(Crit_Assert)\n",
- linkRegister(), i_line);
+ printk("Assertion failed @%p (Crit_Assert): %s\n",
+ linkRegister(), msg);
// Need to call the external CritAssert system call
cpu_crit_assert(reinterpret_cast<uint64_t>(linkRegister()));
break;
case ASSERT_KERNEL: // Kernel assert called.
- printk("Assertion failed @%p on line %d. (kassert)\n",
- linkRegister(), i_line);
+ printk("Assertion failed @%p (kassert): %s\n",
+ linkRegister(), msg);
/*@
* @errortype
diff --git a/src/runtime/rt_assert.C b/src/runtime/rt_assert.C
index a22fe461a10f..4e8a787b4a70 100644
--- a/src/runtime/rt_assert.C
+++ b/src/runtime/rt_assert.C
@@ -28,12 +28,13 @@
/** Hook location for trace module to set up when loaded. */
namespace TRACE { void (*traceCallback)(void*, size_t) = NULL; };
-extern "C" void __assert(AssertBehavior i_assertb, int i_line)
+extern "C" void __assert(AssertBehavior i_assertb, int i_line, const char *msg)
{
+ (void)i_line;
if (i_assertb != ASSERT_TRACE_DONE)
{
- printk("Assertion failed @%p on line %d.\n",
- linkRegister(), i_line);
+ printk("Assertion failed @%p: %s.\n",
+ linkRegister(), msg);
}
g_hostInterfaces->assert();
--
Stewart Smith
OPAL Architect, IBM.
More information about the Skiboot
mailing list