From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
To: Alexander Kuleshov <kuleshovmail@gmail.com>
Cc: Thomas Gleixner <tglx@linutronix.de>,
Ingo Molnar <mingo@redhat.com>, "H. Peter Anvin" <hpa@zytor.com>,
LKML <linux-kernel@vger.kernel.org>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Borislav Petkov <bp@suse.de>,
Mark Rustad <mark.d.rustad@intel.com>,
Yinghai Lu <yinghai@kernel.org>
Subject: Re: [PATCH v11 4/5] x86/earlyprintk: setup earlyprintk as early as possible
Date: Tue, 09 Jun 2015 20:00:51 +0300 [thread overview]
Message-ID: <1433869251.26331.114.camel@linux.intel.com> (raw)
In-Reply-To: <1433848301-5296-1-git-send-email-kuleshovmail@gmail.com>
On Tue, 2015-06-09 at 17:11 +0600, Alexander Kuleshov wrote:
> The early_printk function is usable only after the setup_early_printk will
> be executed. We pass 'earlyprintk' through the kernel command line, so it
> will be usable only after the 'parse_early_param' will be executed. This means
> that we have usable earlyprintk only during early boot, kernel decompression
> and after call of the 'parse_early_param'. This patchset makes earlyprintk
> usable before the call of the 'parse_early_param'.
>
> This patch makes the setup_early_printk visible for head{32,64}.c. So the
> 'early_printk' function will be usabable after decompression of the
> kernel and before parse_early_param will be called. It also must be
> safe if CONFIG_CMDLINE_BOOL and CONFIG_CMDLINE_OVERRIDE are set, because
> setup_cmdline function will be called before setup_early_printk.
>
> It provides earlyprintk only for serial console, because other needs in
> ioremap which is not initialized yet.
>
> Tested it with qemu and real hardware, so early_printk() is usable and
> prints to serial console right after setup_early_printk function called.
>
One topic to discuss below.
> Signed-off-by: Alexander Kuleshov <kuleshovmail@gmail.com>
> ---
> arch/x86/include/asm/setup.h | 6 ++++++
> arch/x86/kernel/early_printk.c | 33 ++++++++++++++++++++++++++++++---
> arch/x86/kernel/head32.c | 3 +++
> arch/x86/kernel/head64.c | 5 ++++-
> 4 files changed, 43 insertions(+), 4 deletions(-)
>
> diff --git a/arch/x86/include/asm/setup.h b/arch/x86/include/asm/setup.h
> index 59efd0d..180bda4 100644
> --- a/arch/x86/include/asm/setup.h
> +++ b/arch/x86/include/asm/setup.h
> @@ -120,0 +120,0 @@ asmlinkage void __init x86_64_start_reservations(char *real_mode_data);
>
> #endif /* __i386__ */
> void __init setup_builtin_cmdline(void);
> +#ifdef CONFIG_EARLY_PRINTK
> +/* used by arch/x86/kernel/head{32,64}.c */
> +extern int __init setup_early_serial_console(void);
> +#else
> +static inline int __init setup_early_serial_console(void) { return 0; }
> +#endif /* CONFIG_EARLY_PRINTK */
> #endif /* _SETUP */
> #else
> #define RESERVE_BRK(name,sz) \
> diff --git a/arch/x86/kernel/early_printk.c b/arch/x86/kernel/early_printk.c
> index 89427d8..6442cd2 100644
> --- a/arch/x86/kernel/early_printk.c
> +++ b/arch/x86/kernel/early_printk.c
> @@ -342,19 +342,22 @@ static int __init setup_early_printk(char *buf)
> keep = (strstr(buf, "keep") != NULL);
>
> while (*buf != '\0') {
> - if (!strncmp(buf, "serial", 6)) {
> + if (!strncmp(buf, "serial", 6) &&
> + early_serial_console.index == -1) {
> buf += 6;
> early_serial_init(buf);
> early_console_register(&early_serial_console, keep);
> if (!strncmp(buf, ",ttyS", 5))
> buf += 5;
> }
> - if (!strncmp(buf, "ttyS", 4)) {
> + if (!strncmp(buf, "ttyS", 4) &&
> + early_serial_console.index == -1) {
> early_serial_init(buf + 4);
> early_console_register(&early_serial_console, keep);
> }
> #ifdef CONFIG_PCI
> - if (!strncmp(buf, "pciserial", 9)) {
> + if (!strncmp(buf, "pciserial", 9) &&
> + early_serial_console.index == -1) {
> early_pci_serial_init(buf + 9);
> early_console_register(&early_serial_console, keep);
> buf += 9; /* Keep from match the above "serial" */
> @@ -385,4 +388,28 @@ static int __init setup_early_printk(char *buf)
> return 0;
> }
>
> +int __init setup_early_serial_console(void)
> +{
> + char *arg;
> +
> + /*
> + * make sure that we have:
> + * "serial,0x3f8,115200"
> + * "serial,ttyS0,115200"
> + * "ttyS0,115200"
> + */
> + arg = strstr(boot_command_line, "earlyprintk=serial");
> + if (!arg)
> + arg = strstr(boot_command_line, "earlyprintk=ttyS");
> + if (!arg)
> + return -1;
> +
> + arg = strstr(boot_command_line, "earlyprintk=");
> +
> + /* += strlen("earlyprintk="); */
> + arg += 12;
> +
> + return setup_early_printk(arg);
> +}
I'm still not convincing by this code to be in that form and here. What
about to refactor setup_early_printk() to helper which will do parse
parameters to a let say structure where one of the flag will be
struct early_printk_param {
…
const char *arg;
bool serial;
}
Your function will be something like this
struct early_printk_param epp;
parse_early_printk_param(&epp);
if (!epp->serial)
return /* whatever error code */;
return setup_early_printk(epp.arg);
> +
> early_param("earlyprintk", setup_early_printk);
> diff --git a/arch/x86/kernel/head32.c b/arch/x86/kernel/head32.c
> index f28d10f..908ee47 100644
> --- a/arch/x86/kernel/head32.c
> +++ b/arch/x86/kernel/head32.c
> @@ -38,0 +38,0 @@ asmlinkage __visible void __init i386_start_kernel(void)
> /* Allocate early log buffer */
> setup_log_buf(1);
>
> + setup_early_serial_console();
> + early_printk("Early printk is initialized\n");
> +
> cr4_init_shadow();
> sanitize_boot_params(&boot_params);
>
> diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c
> index 53662d2..041be2c 100644
> --- a/arch/x86/kernel/head64.c
> +++ b/arch/x86/kernel/head64.c
> @@ -176,0 +176,0 @@ asmlinkage __visible void __init x86_64_start_kernel(char * real_mode_data)
>
> /* Allocate early log buffer */
> setup_log_buf(1);
>
> + setup_early_serial_console();
> + early_printk("Early printk is initialized\n");
> +
> /*
> * Load microcode early on BSP.
> */
--
Andy Shevchenko <andriy.shevchenko@intel.com>
Intel Finland Oy
next prev parent reply other threads:[~2015-06-09 17:01 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-09 11:10 [PATCH v11 0/5] x86/earlyprintk: setup serial earlyprintk as early as possible Alexander Kuleshov
2015-06-09 11:11 ` [PATCH v11 1/5] x86/setup: introduce setup_bultin_cmdline Alexander Kuleshov
2015-06-09 15:32 ` Andy Shevchenko
2015-06-09 11:11 ` [PATCH v11 2/5] x86/setup: handle builtin command line as early as possible Alexander Kuleshov
2015-06-09 11:11 ` [PATCH v11 3/5] x86/earlyprintk: Allocate early log_buf " Alexander Kuleshov
2015-06-09 15:58 ` Andy Shevchenko
2015-06-09 16:07 ` Borislav Petkov
2015-06-09 17:37 ` Alexander Kuleshov
2015-06-10 9:04 ` Borislav Petkov
2015-06-10 9:25 ` Alexander Kuleshov
2015-06-09 11:11 ` [PATCH v11 4/5] x86/earlyprintk: setup earlyprintk " Alexander Kuleshov
2015-06-09 17:00 ` Andy Shevchenko [this message]
2015-06-09 18:00 ` Alexander Kuleshov
2015-06-10 9:44 ` Andy Shevchenko
2015-06-10 10:36 ` Alexander Kuleshov
2015-06-10 10:41 ` Alexander Kuleshov
2015-06-09 11:11 ` [PATCH v11 5/5] x86/earlyprintk: Patch for testing earlyprintk Alexander Kuleshov
2015-06-09 15:30 ` Andy Shevchenko
2015-06-09 16:11 ` Borislav Petkov
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=1433869251.26331.114.camel@linux.intel.com \
--to=andriy.shevchenko@linux.intel.com \
--cc=bp@suse.de \
--cc=gregkh@linuxfoundation.org \
--cc=hpa@zytor.com \
--cc=kuleshovmail@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mark.d.rustad@intel.com \
--cc=mingo@redhat.com \
--cc=tglx@linutronix.de \
--cc=yinghai@kernel.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.