Re: [PATCH 1/23] Make register values available to panic notifiers

From: David VomLehn
Date: Wed Apr 14 2010 - 16:47:57 EST


Heiko Carstens wrote:
On Sun, Apr 11, 2010 at 11:06:09PM -0700, David VomLehn wrote:
This patch makes panic() and die() registers available to, for example,
panic notifier functions. Panic notifier functions are quite useful
for recording crash information, but they don't get passed the register
values. This makes it hard to print register contents, do stack
backtraces, etc. The changes in this patch save the register state when
panic() is called and introduce a function for die() to call that allows
it to pass in the registers it was passed.

Following this patch are more patches, one per architecture. These include
two types of changes:
o A save_ptregs() function for the processor. I've taken a whack at
doing this for all of the processors. I have tested x86 and MIPS
versions. I was able to find cross compilers for ARM, ... and the
code compiles cleanly. Everything else, well, what you see is sheer
fantasy. You are welcome to chortle with merriment.
o When I could figure it out, I replaced the calls to panic() in
exception handling functions with calls to panic_with_regs() so
that everyone can leverage these changes without much effort. Again,
not all the code was transparent, so there are likely some places
that should have additional work done.

Note that the pointer to the struct pt_regs may be NULL. This is to
accomodate those processors which don't have a working save_ptregs(). I'd
love to eliminate this case by providing a save_ptregs() for all
architectures, but I'll need help to so.

Wouldn't it be much easier to implement panic with an illegal op and let
the exception handler set up the pt regs structure instead? Just like some
architectures do that already for warnings.
Have a look at lib/bug.c and at various arch/<...>/include/asm/bug.h.
BUG_FLAG_PANIC would do the trick.
You could do this so long as your exception handler wasn't compromised. When
you get here, your system is already known to have failed, so the idea is to be
as gentle as possible.
But I'm still wondering what the use case would be. You haven't posted any
code that would actually use this.
I'm working my way towards this, but the general idea is to be able to log all system
state from within a panic handler. So, you'd want to print the registers, the stack,
the window of memory around instructions, the stack trace, etc., all of which need
some set of the register values.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/