summaryrefslogtreecommitdiff
path: root/kern/bmcpanic-2.6.0.patch
diff options
context:
space:
mode:
Diffstat (limited to 'kern/bmcpanic-2.6.0.patch')
-rw-r--r--kern/bmcpanic-2.6.0.patch162
1 files changed, 162 insertions, 0 deletions
diff --git a/kern/bmcpanic-2.6.0.patch b/kern/bmcpanic-2.6.0.patch
new file mode 100644
index 0000000..da24915
--- /dev/null
+++ b/kern/bmcpanic-2.6.0.patch
@@ -0,0 +1,162 @@
+--- linux-2.6.0-test3orig/drivers/char/ipmi/ipmi_msghandler.c 2003-08-09 00:37:25.000000000 -0400
++++ linux-2.6.0-test3/drivers/char/ipmi/ipmi_msghandler.c 2003-08-14 09:40:49.000000000 -0400
+@@ -1813,7 +1813,9 @@
+ {
+ }
+
+-static void send_panic_events(void)
++#define EVENT_VALID 0x80
++
++static void send_panic_events(int evt, char *str)
+ {
+ struct ipmi_msg msg;
+ ipmi_smi_t intf;
+@@ -1837,12 +1839,17 @@
+ data[4] = 0x6f; /* Sensor specific, IPMI table 36-1 */
+ data[5] = 0xa1; /* Runtime stop OEM bytes 2 & 3. */
+
+- /* These used to have the first three bytes of the panic string,
+- but not only is that not terribly useful, it's not available
+- any more. */
+- data[3] = 0;
+- data[6] = 0;
+- data[7] = 0;
++ /*
++ * Add whatever breadcrumbs we can to indicate the type of panic.
++ * In kernel 2.6.0 an event code and panic string are passed in.
++ */
++ if (evt != 0)
++ data[7] = EVENT_VALID | (evt & 0x7f);
++ if (str != NULL) {
++ data[3] = str[0];
++ data[6] = str[1];
++ if (evt == 0) data[7] = str[2];
++ }
+
+ smi_msg.done = dummy_smi_done_handler;
+ recv_msg.done = dummy_recv_done_handler;
+@@ -1891,7 +1898,7 @@
+ }
+
+ #ifdef CONFIG_IPMI_PANIC_EVENT
+- send_panic_events();
++ send_panic_events(event,(char *)ptr);
+ #endif
+
+ return NOTIFY_DONE;
+--- linux-2.6.0-test3orig/arch/i386/kernel/traps.c 2003-08-09 00:33:15.000000000 -0400
++++ linux-2.6.0-test3/arch/i386/kernel/traps.c 2003-08-13 17:37:50.789828552 -0400
+@@ -288,6 +288,8 @@
+ return address;
+ }
+
++extern int last_trapnr;
++
+ static inline void do_trap(int trapnr, int signr, char *str, int vm86,
+ struct pt_regs * regs, long error_code, siginfo_t *info)
+ {
+@@ -312,8 +314,10 @@
+ }
+
+ kernel_trap: {
+- if (!fixup_exception(regs))
++ if (!fixup_exception(regs)) {
++ last_trapnr = trapnr;
+ die(str, regs, error_code);
++ }
+ return;
+ }
+
+@@ -387,8 +391,10 @@
+ return;
+
+ gp_in_kernel:
+- if (!fixup_exception(regs))
++ if (!fixup_exception(regs)) {
++ last_trapnr = 13;
+ die("general protection fault", regs, error_code);
++ }
+ }
+
+ static void mem_parity_error(unsigned char reason, struct pt_regs * regs)
+@@ -721,6 +727,7 @@
+ error_code);
+ return;
+ }
++ last_trapnr = 19;
+ die_if_kernel("cache flush denied", regs, error_code);
+ current->thread.trap_no = 19;
+ current->thread.error_code = error_code;
+--- linux-2.6.0-test3orig/kernel/ksyms.c 2003-08-09 00:31:15.000000000 -0400
++++ linux-2.6.0-test3/kernel/ksyms.c 2003-08-13 17:39:00.000000000 -0400
+@@ -71,6 +71,7 @@
+ extern struct timezone sys_tz;
+
+ extern int panic_timeout;
++extern int last_trapnr;
+
+ /* process memory management */
+ EXPORT_SYMBOL(do_mmap_pgoff);
+@@ -504,6 +505,7 @@
+ EXPORT_SYMBOL(panic);
+ EXPORT_SYMBOL(panic_notifier_list);
+ EXPORT_SYMBOL(panic_timeout);
++EXPORT_SYMBOL(last_trapnr);
+ EXPORT_SYMBOL(sprintf);
+ EXPORT_SYMBOL(snprintf);
+ EXPORT_SYMBOL(sscanf);
+--- linux-2.6.0-test3orig/kernel/panic.c 2003-08-09 00:41:41.000000000 -0400
++++ linux-2.6.0-test3/kernel/panic.c 2003-08-13 17:38:49.000000000 -0400
+@@ -20,9 +20,15 @@
+
+ asmlinkage void sys_sync(void); /* it's really int */
+
++/* values for panic event */
++#define EVENT_VALID 0x80
++#define PANIC_IN_INTERRUPT 0x40
++#define TRAP_INIT 0x80
++
+ int panic_timeout;
+ int panic_on_oops;
+ int tainted;
++int last_trapnr = TRAP_INIT;
+
+ struct notifier_block *panic_notifier_list;
+
+@@ -47,6 +53,7 @@
+ {
+ static char buf[1024];
+ va_list args;
++ int event = 0;
+ #if defined(CONFIG_ARCH_S390)
+ unsigned long caller = (unsigned long) __builtin_return_address(0);
+ #endif
+@@ -56,11 +63,16 @@
+ vsnprintf(buf, sizeof(buf), fmt, args);
+ va_end(args);
+ printk(KERN_EMERG "Kernel panic: %s\n",buf);
+- if (in_interrupt())
++ if (last_trapnr != TRAP_INIT) {
++ /* should be <= 30 trapnr values, so packing in 0x3f is ok */
++ event = EVENT_VALID + (last_trapnr & 0x3f);
++ }
++ if (in_interrupt()) {
++ event |= PANIC_IN_INTERRUPT; /*0x40*/
+ printk(KERN_EMERG "In interrupt handler - not syncing\n");
+- else if (!current->pid)
++ } else if (!current->pid)
+ printk(KERN_EMERG "In idle task - not syncing\n");
+- else
++ else
+ sys_sync();
+ bust_spinlocks(0);
+
+@@ -68,7 +80,7 @@
+ smp_send_stop();
+ #endif
+
+- notifier_call_chain(&panic_notifier_list, 0, buf);
++ notifier_call_chain(&panic_notifier_list, event, buf);
+
+ if (panic_timeout > 0)
+ {