提交 99b7de33 编写于 作者: S Stas Sergeev 提交者: Linus Torvalds

[PATCH] x86: early printk handling fixes

The history is that -mm kernels do not work for me for a few months
already.  The things started from crashing somewhere after starting init,
and for the last month - no boot at all, just "Uncompressing...  OK,
booting kernel", and silence.  Early console didn't work too.  With the
latest releases this degraded into an infinite stream of the "Unknown
interrupt or fault" messages.  So today my patience ran out and I started
to think how can I collect at least some info for the bug-report.  Attached
is the patch that allows to gather some valueable debug info on the problem
by making an early console more useable.  I can't properly test the patch,
as the kernel still doesn't boot, so I'll explain it in details in a hope
someone else can justify the intrusive changes.

arch_hooks.h: added prototypes for setup_early_printk() and early_printk().

setup.c: killed wrong setup_early_printk() prototype.  Moved
setup_early_printk() a bit earlier, as it was not "early enough" to cover
the bug I was fighting with.

early_printk.c: made it to start printing from the bottom of the screen,
otherwise the messages interfere with the ones of the boot-loader, so you
can't read them.
Signed-off-by: NStas Sergeev <stsp@aknet.ru>
Cc: Andi Kleen <ak@muc.de>
Cc: Zwane Mwaikambo <zwane@arm.linux.org.uk>
Signed-off-by: NAndrew Morton <akpm@osdl.org>
Signed-off-by: NLinus Torvalds <torvalds@osdl.org>
上级 8bed51cd
...@@ -1459,6 +1459,16 @@ void __init setup_arch(char **cmdline_p) ...@@ -1459,6 +1459,16 @@ void __init setup_arch(char **cmdline_p)
parse_cmdline_early(cmdline_p); parse_cmdline_early(cmdline_p);
#ifdef CONFIG_EARLY_PRINTK
{
char *s = strstr(*cmdline_p, "earlyprintk=");
if (s) {
setup_early_printk(strchr(s, '=') + 1);
printk("early console enabled\n");
}
}
#endif
max_low_pfn = setup_memory(); max_low_pfn = setup_memory();
/* /*
...@@ -1483,19 +1493,6 @@ void __init setup_arch(char **cmdline_p) ...@@ -1483,19 +1493,6 @@ void __init setup_arch(char **cmdline_p)
* NOTE: at this point the bootmem allocator is fully available. * NOTE: at this point the bootmem allocator is fully available.
*/ */
#ifdef CONFIG_EARLY_PRINTK
{
char *s = strstr(*cmdline_p, "earlyprintk=");
if (s) {
extern void setup_early_printk(char *);
setup_early_printk(strchr(s, '=') + 1);
printk("early console enabled\n");
}
}
#endif
dmi_scan_machine(); dmi_scan_machine();
#ifdef CONFIG_X86_GENERICARCH #ifdef CONFIG_X86_GENERICARCH
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
#define MAX_XPOS max_xpos #define MAX_XPOS max_xpos
static int max_ypos = 25, max_xpos = 80; static int max_ypos = 25, max_xpos = 80;
static int current_ypos = 1, current_xpos = 0; static int current_ypos = 25, current_xpos = 0;
static void early_vga_write(struct console *con, const char *str, unsigned n) static void early_vga_write(struct console *con, const char *str, unsigned n)
{ {
...@@ -244,6 +244,7 @@ int __init setup_early_printk(char *opt) ...@@ -244,6 +244,7 @@ int __init setup_early_printk(char *opt)
&& SCREEN_INFO.orig_video_isVGA == 1) { && SCREEN_INFO.orig_video_isVGA == 1) {
max_xpos = SCREEN_INFO.orig_video_cols; max_xpos = SCREEN_INFO.orig_video_cols;
max_ypos = SCREEN_INFO.orig_video_lines; max_ypos = SCREEN_INFO.orig_video_lines;
current_ypos = max_ypos;
early_console = &early_vga_console; early_console = &early_vga_console;
} else if (!strncmp(buf, "simnow", 6)) { } else if (!strncmp(buf, "simnow", 6)) {
simnow_init(buf + 6); simnow_init(buf + 6);
......
...@@ -24,4 +24,7 @@ extern void trap_init_hook(void); ...@@ -24,4 +24,7 @@ extern void trap_init_hook(void);
extern void time_init_hook(void); extern void time_init_hook(void);
extern void mca_nmi_hook(void); extern void mca_nmi_hook(void);
extern int setup_early_printk(char *);
extern void early_printk(const char *fmt, ...) __attribute__((format(printf,1,2)));
#endif #endif
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册