@@ -106,6 +106,7 @@ NORET_TYPE void panic(const char * fmt,
* Delay timeout seconds before rebooting the machine.
* We can't use the "normal" timers since we just panicked..
*/
+ printk("\n");
printk(KERN_EMERG "Rebooting in %d seconds..",panic_timeout);
for (i = 0; i < panic_timeout*1000; ) {
touch_nmi_watchdog();
@@ -124,6 +125,7 @@ NORET_TYPE void panic(const char * fmt,
extern int stop_a_enabled;
/* Make sure the user can actually press Stop-A (L1-A) */
stop_a_enabled = 1;
+ printk ("\n");
printk(KERN_EMERG "Press Stop-A (L1-A) to return to the boot prom\n");
}
#endif
@@ -136,6 +138,33 @@ NORET_TYPE void panic(const char * fmt,
i += panic_blink(i);
mdelay(1);
i++;
+#ifdef __sparc__
+ {
+ /*
+ * L1-A processing only works if KBD stuff OK.
+ * So to debug before KBD up you require this.
+ * Maybe make this part of the early console stuf.
+ */
+ static int stop_l1;
+ int ch;
+ extern int prom_nbgetchar(void);
+
+ if ((ch = prom_nbgetchar()) != -1)
+ {
+ if ((ch == 0x7F) ||
+ (ch == 0xFE) || (ch == 0xFF))
+ stop_l1 = 0;
+ if ((ch & 0x7F) == 0x01)
+ stop_l1 = 1;
+ if (stop_l1 && ((ch & 0x7F) == 77))
+ {
+ extern void sun_do_break(void);
+
+ sun_do_break();
+ }
+ }
+ }
+#endif /* __sparc__ */
}
}
@@ -429,6 +429,7 @@
/* Wait for BREAK to deassert to avoid potentially
* confusing the PROM.
*/
+ sun_do_break(); /* On Sun4c, the while loop hangs */
while (1) {
status = readb(&channel->control);
ZSDELAY();
@@ -105,6 +105,7 @@
this_cpu);
dump_stack();
spin_unlock(&print_lock);
+ panic ("Sun4c can't cope with soft lockups\n");
}
}