u-isdn/patches/panicreboot

121 lines
3.7 KiB
Plaintext

Dieser Patch loest eienen Reboot-nach-Panic aus, damit ein Server
unbeaufsichtigt neustarten kann.
Optional.
diff -rub --unidir /pub/src/linux/kernel/linux/kernel/panic.c ./kernel/panic.c
--- /pub/src/linux/kernel/linux/kernel/panic.c Wed Mar 1 12:31:54 1995
+++ ./kernel/panic.c Fri Mar 3 05:32:15 1995
@@ -13,20 +13,38 @@
#include <linux/kernel.h>
#include <linux/sched.h>
+#include <linux/delay.h>
+
asmlinkage void sys_sync(void); /* it's really int */
+extern void hard_reset_now(void);
+
+int in_panic = 0;
NORET_TYPE void panic(const char * fmt, ...)
{
static char buf[1024];
va_list args;
+ cli();
+
va_start(args, fmt);
vsprintf(buf, fmt, args);
va_end(args);
+
+ if(!in_panic++) {
printk(KERN_EMERG "Kernel panic: %s\n",buf);
+ *((char *)0)=0;
+ }
+
+#if 0
if (current == task[0])
printk(KERN_EMERG "In swapper task - not syncing\n");
else
sys_sync();
- for(;;);
+#endif
+ {
+ int i,j;
+ for(i=0;i<300;i++) for(j=0;j<1000;j++) udelay(1000);
+ }
+ hard_reset_now();
}
diff -rub --unidir /pub/src/linux/kernel/linux/arch/i386/kernel/traps.c ./arch/i386/kernel/traps.c
--- /pub/src/linux/kernel/linux/arch/i386/kernel/traps.c Wed Feb 8 12:54:00 1995
+++ ./arch/i386/kernel/traps.c Wed Mar 22 15:33:47 1995
@@ -100,6 +100,7 @@
unsigned short ss;
unsigned long *stack, addr, module_start, module_end;
extern char start_kernel, etext;
+ extern int in_panic;
esp = (unsigned long) &regs->esp;
ss = KERNEL_DS;
@@ -109,29 +110,27 @@
esp = regs->esp;
ss = regs->ss;
}
- console_verbose();
- printk("%s: %04lx\n", str, err & 0xffff);
- printk("EIP: %04x:%08lx\nEFLAGS: %08lx\n", 0xffff & regs->cs,regs->eip,regs->eflags);
- printk("eax: %08lx ebx: %08lx ecx: %08lx edx: %08lx\n",
+ console_verbose(); cli();
+ printk("\n" KERN_EMERG "%s: %04lx ", str, err & 0xffff);
+ printk(KERN_EMERG "EIP: %04x:%08lx EFLAGS: %08lx\n", 0xffff & regs->cs,regs->eip,regs->eflags);
+ printk(KERN_EMERG "eax: %08lx ebx: %08lx ecx: %08lx edx: %08lx\n",
regs->eax, regs->ebx, regs->ecx, regs->edx);
- printk("esi: %08lx edi: %08lx ebp: %08lx esp: %08lx\n",
+ printk(KERN_EMERG "esi: %08lx edi: %08lx ebp: %08lx esp: %08lx\n",
regs->esi, regs->edi, regs->ebp, esp);
- printk("ds: %04x es: %04x fs: %04x gs: %04x ss: %04x\n",
+ printk(KERN_EMERG "ds: %04x es: %04x fs: %04x gs: %04x ss: %04x\n",
regs->ds, regs->es, regs->fs, regs->gs, ss);
store_TR(i);
if (STACK_MAGIC != *(unsigned long *)current->kernel_stack_page)
- printk("Corrupted stack page\n");
- printk("Process %s (pid: %d, process nr: %d, stackpage=%08lx)\nStack: ",
+ printk(KERN_EMERG "Corrupted stack page; ");
+ printk(KERN_EMERG "Process %s (pid: %d, process nr: %d, stackpage=%08lx)\nStack: ",
current->comm, current->pid, 0xffff & i, current->kernel_stack_page);
stack = (unsigned long *) esp;
for(i=0; i < kstack_depth_to_print; i++) {
if (((long) stack & 4095) == 0)
break;
- if (i && ((i % 8) == 0))
- printk("\n ");
- printk("%08lx ", get_seg_long(ss,stack++));
+ printk("%lx ", get_seg_long(ss,stack++));
}
- printk("\nCall Trace: ");
+ printk("\n" KERN_EMERG "Call Trace: ");
stack = (unsigned long *) esp;
i = 1;
module_start = ((high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1));
@@ -149,16 +148,12 @@
if (((addr >= (unsigned long) &start_kernel) &&
(addr <= (unsigned long) &etext)) ||
((addr >= module_start) && (addr <= module_end))) {
- if (i && ((i % 8) == 0))
- printk("\n ");
- printk("%08lx ", addr);
+ printk("%lx ", addr);
i++;
}
}
- printk("\nCode: ");
- for(i=0;i<20;i++)
- printk("%02x ",0xff & get_seg_byte(regs->cs,(i+(char *)regs->eip)));
- printk("\n");
+ in_panic++;
+ panic("Crash");
do_exit(SIGSEGV);
}