|
@@ -705,7 +705,10 @@ void redraw_screen(struct vc_data *vc, int is_switch)
|
|
|
update_attr(vc);
|
|
|
clear_buffer_attributes(vc);
|
|
|
}
|
|
|
- if (update && vc->vc_mode != KD_GRAPHICS)
|
|
|
+
|
|
|
+ /* Forcibly update if we're panicing */
|
|
|
+ if ((update && vc->vc_mode != KD_GRAPHICS) ||
|
|
|
+ vt_force_oops_output(vc))
|
|
|
do_update_region(vc, vc->vc_origin, vc->vc_screenbuf_size / 2);
|
|
|
}
|
|
|
set_cursor(vc);
|
|
@@ -743,6 +746,7 @@ static void visual_init(struct vc_data *vc, int num, int init)
|
|
|
vc->vc_hi_font_mask = 0;
|
|
|
vc->vc_complement_mask = 0;
|
|
|
vc->vc_can_do_color = 0;
|
|
|
+ vc->vc_panic_force_write = false;
|
|
|
vc->vc_sw->con_init(vc, init);
|
|
|
if (!vc->vc_complement_mask)
|
|
|
vc->vc_complement_mask = vc->vc_can_do_color ? 0x7700 : 0x0800;
|
|
@@ -2506,7 +2510,7 @@ static void vt_console_print(struct console *co, const char *b, unsigned count)
|
|
|
goto quit;
|
|
|
}
|
|
|
|
|
|
- if (vc->vc_mode != KD_TEXT)
|
|
|
+ if (vc->vc_mode != KD_TEXT && !vt_force_oops_output(vc))
|
|
|
goto quit;
|
|
|
|
|
|
/* undraw cursor first */
|
|
@@ -3784,7 +3788,8 @@ void do_unblank_screen(int leaving_gfx)
|
|
|
return;
|
|
|
}
|
|
|
vc = vc_cons[fg_console].d;
|
|
|
- if (vc->vc_mode != KD_TEXT)
|
|
|
+ /* Try to unblank in oops case too */
|
|
|
+ if (vc->vc_mode != KD_TEXT && !vt_force_oops_output(vc))
|
|
|
return; /* but leave console_blanked != 0 */
|
|
|
|
|
|
if (blankinterval) {
|
|
@@ -3793,7 +3798,7 @@ void do_unblank_screen(int leaving_gfx)
|
|
|
}
|
|
|
|
|
|
console_blanked = 0;
|
|
|
- if (vc->vc_sw->con_blank(vc, 0, leaving_gfx))
|
|
|
+ if (vc->vc_sw->con_blank(vc, 0, leaving_gfx) || vt_force_oops_output(vc))
|
|
|
/* Low-level driver cannot restore -> do it ourselves */
|
|
|
update_screen(vc);
|
|
|
if (console_blank_hook)
|