From: Yinghai Lu <yinghai.lu@oracle.com>
To: Ingo Molnar <mingo@elte.hu>, "H. Peter Anvin" <hpa@zytor.com>,
Thomas Gleixner <tglx@linutronix.de>,
Andrew Morton <akpm@linux-foundation.org>
Cc: Pekka Enberg <penberg@cs.helsinki.fi>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: [PATCH] x86: Setup early console as early as possible
Date: Sun, 11 Jul 2010 14:44:07 -0700 [thread overview]
Message-ID: <4C3A3B27.7020009@oracle.com> (raw)
Analyze "console=uart8250,io,0x3f8,115200n8" in i386_start_kernel/x86_64_start_kernel,
and call setup_early_serial8250_console() to init early serial console.
only can handle io port kind of 8250. because mmio need ioremap.
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
---
arch/x86/include/asm/setup.h | 1 +
arch/x86/kernel/head.c | 32 ++++++++++++++++++++++++++++++++
arch/x86/kernel/head32.c | 2 ++
arch/x86/kernel/head64.c | 11 +++++++++++
kernel/printk.c | 4 ++++
5 files changed, 50 insertions(+)
Index: linux-2.6/arch/x86/include/asm/setup.h
===================================================================
--- linux-2.6.orig/arch/x86/include/asm/setup.h
+++ linux-2.6/arch/x86/include/asm/setup.h
@@ -42,6 +42,7 @@ static inline void visws_early_detect(vo
#endif
extern unsigned long saved_video_mode;
+void setup_early_console(void);
extern void reserve_standard_io_resources(void);
extern void i386_reserve_resources(void);
Index: linux-2.6/arch/x86/kernel/head.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/head.c
+++ linux-2.6/arch/x86/kernel/head.c
@@ -53,3 +53,35 @@ void __init reserve_ebda_region(void)
/* reserve all memory between lowmem and the 1MB mark */
reserve_early_overlap_ok(lowmem, 0x100000, "BIOS reserved");
}
+
+#ifdef CONFIG_SERIAL_8250_CONSOLE
+int setup_early_serial8250_console(char *cmdline);
+
+void __init setup_early_console(void)
+{
+ char constr[64], *p, *q;
+
+ /* Can not handle mmio type 8250 uart yet, too early */
+ p = strstr(boot_command_line, "console=uart8250,io,");
+ if (!p)
+ p = strstr(boot_command_line, "console=uart,io,");
+ if (!p)
+ return;
+
+ p += 8; /* sizeof "console=" */
+ q = strchr(p, ' ');
+ if ((q - p) >= sizeof(constr))
+ return;
+
+ memset(constr, 0, sizeof(constr));
+ memcpy(constr, p, q - p);
+
+ lockdep_init();
+
+ setup_early_serial8250_console(constr);
+}
+#else
+void __init setup_early_console(void)
+{
+}
+#endif
Index: linux-2.6/arch/x86/kernel/head32.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/head32.c
+++ linux-2.6/arch/x86/kernel/head32.c
@@ -30,6 +30,8 @@ static void __init i386_default_early_se
void __init i386_start_kernel(void)
{
+ setup_early_console();
+
#ifdef CONFIG_X86_TRAMPOLINE
/*
* But first pinch a few for the stack/trampoline stuff
Index: linux-2.6/arch/x86/kernel/head64.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/head64.c
+++ linux-2.6/arch/x86/kernel/head64.c
@@ -41,15 +41,21 @@ static void __init clear_bss(void)
(unsigned long) __bss_stop - (unsigned long) __bss_start);
}
+static int __initdata bootdata_copied;
static void __init copy_bootdata(char *real_mode_data)
{
char * command_line;
+ if (bootdata_copied)
+ return;
+
memcpy(&boot_params, real_mode_data, sizeof boot_params);
if (boot_params.hdr.cmd_line_ptr) {
command_line = __va(boot_params.hdr.cmd_line_ptr);
memcpy(boot_command_line, command_line, COMMAND_LINE_SIZE);
}
+
+ bootdata_copied = 1;
}
void __init x86_64_start_kernel(char * real_mode_data)
@@ -73,6 +79,10 @@ void __init x86_64_start_kernel(char * r
/* clear bss before set_intr_gate with early_idt_handler */
clear_bss();
+ /* boot_params is in bss */
+ copy_bootdata(__va(real_mode_data));
+ setup_early_console();
+
/* Make NULL pointers segfault */
zap_identity_mappings();
@@ -97,6 +107,7 @@ void __init x86_64_start_kernel(char * r
void __init x86_64_start_reservations(char *real_mode_data)
{
copy_bootdata(__va(real_mode_data));
+ setup_early_console();
reserve_early(__pa_symbol(&_text), __pa_symbol(&__bss_stop), "TEXT DATA BSS");
Index: linux-2.6/kernel/printk.c
===================================================================
--- linux-2.6.orig/kernel/printk.c
+++ linux-2.6/kernel/printk.c
@@ -1203,6 +1203,10 @@ void register_console(struct console *ne
if (console_drivers && newcon->flags & CON_BOOT) {
/* find the last or real console */
for_each_console(bcon) {
+ /* not again */
+ if (bcon == newcon)
+ return;
+
if (!(bcon->flags & CON_BOOT)) {
printk(KERN_INFO "Too late to register bootconsole %s%d\n",
newcon->name, newcon->index);
next reply other threads:[~2010-07-11 21:48 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-07-11 21:44 Yinghai Lu [this message]
2010-07-12 8:58 ` Pekka Enberg
2010-07-12 15:47 ` H. Peter Anvin
2010-07-12 16:21 ` Yinghai Lu
2010-07-12 17:30 ` H. Peter Anvin
2010-07-13 17:43 ` Pekka Enberg
2010-07-13 20:35 ` Yinghai Lu
2010-07-13 20:46 ` Pekka Enberg
2010-07-14 2:07 ` [PATCH] x86: only set early_serial_base after port is initialized Yinghai Lu
2010-07-14 8:41 ` Pekka Enberg
2010-07-14 18:26 ` [PATCH -v2] x86: only set early_serial_base after port is initialized in setup code Yinghai Lu
2010-07-14 19:12 ` [tip:x86/setup] x86, setup: Only set early_serial_base after port is initialized tip-bot for Yinghai Lu
2010-07-13 21:12 ` [tip:x86/setup] x86, setup: Make the setup code also accept console=uart8250 tip-bot for Yinghai Lu
2010-07-12 17:44 ` [PATCH] x86: Setup early console as early as possible Cyrill Gorcunov
2010-07-12 18:09 ` H. Peter Anvin
2010-07-12 18:11 ` Yinghai Lu
2010-07-12 22:57 ` Jeremy Fitzhardinge
2010-07-12 23:37 ` Yinghai Lu
[not found] <f5czp-42V-9@gated-at.bofh.it>
[not found] ` <f5n1M-2lt-21@gated-at.bofh.it>
[not found] ` <f5tqz-3ll-37@gated-at.bofh.it>
[not found] ` <f5u3g-4mj-11@gated-at.bofh.it>
[not found] ` <f5v90-5Wo-7@gated-at.bofh.it>
2010-07-12 20:57 ` Bodo Eggert
2010-07-12 21:52 ` H. Peter Anvin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4C3A3B27.7020009@oracle.com \
--to=yinghai.lu@oracle.com \
--cc=akpm@linux-foundation.org \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=penberg@cs.helsinki.fi \
--cc=tglx@linutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome