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);
 }
 
