diff -urNp x-ref/drivers/char/console.c x/drivers/char/console.c --- x-ref/drivers/char/console.c Fri Aug 9 14:52:09 2002 +++ x/drivers/char/console.c Mon Sep 30 03:12:08 2002 @@ -112,6 +112,8 @@ const struct consw *conswitchp; +static void __console_callback(void); + /* A bitmap for codes <32. A bit of 1 indicates that the code * corresponding to that bit number invokes some special action * (such as cursor movement) and should not be displayed as a @@ -242,9 +244,16 @@ static inline void scrolldelta(int lines schedule_console_callback(); } +extern int machine_paniced; + void schedule_console_callback(void) { - schedule_task(&console_callback_tq); + /* Don't care about locking after panic - but I want to switch the console + NOW */ + if (machine_paniced) + __console_callback(); + else + schedule_task(&console_callback_tq); } static void scrup(int currcons, unsigned int t, unsigned int b, int nr) @@ -2036,10 +2045,15 @@ out: * with other console code and prevention of re-entrancy is * ensured with console_sem. */ -static void console_callback(void *ignored) +static void console_callback(void *unused) { acquire_console_sem(); + __console_callback(); + release_console_sem(); +} +static void __console_callback(void) +{ if (want_console >= 0) { if (want_console != fg_console && vc_cons_allocated(want_console)) { hide_cursor(fg_console); @@ -2061,8 +2075,6 @@ static void console_callback(void *ignor sw->con_scrolldelta(vc_cons[currcons].d, scrollback_delta); scrollback_delta = 0; } - - release_console_sem(); } void set_console(int nr) diff -urNp x-ref/kernel/panic.c x/kernel/panic.c --- x-ref/kernel/panic.c Thu Sep 26 04:14:30 2002 +++ x/kernel/panic.c Mon Sep 30 03:12:25 2002 @@ -31,6 +31,8 @@ static int __init panic_setup(char *str) __setup("panic=", panic_setup); +int machine_paniced; + /** * panic - halt the system * @fmt: The text string to print @@ -49,6 +51,7 @@ NORET_TYPE void panic(const char * fmt, unsigned long caller = (unsigned long) __builtin_return_address(0); #endif + machine_paniced = 1; bust_spinlocks(1); va_start(args, fmt); vsprintf(buf, fmt, args);