As setup_earlyprintk passed to the early_param, it will be usable only after
'parse_early_param' function will be called from the 'setup_arch'. So we have
earlyprintk during early boot and decompression. Next point after decompression
of the kernel where we can use early_printk is after call of the
'parse_early_param'.
This patch removes 'earlyprintk' from the early_param and setup it right after
boot data copying. So 'early_printk' function will be usabable after
decompression of kernel and before parse_early_param will be called.
Signed-off-by: Alexander Kuleshov <[email protected]>
---
arch/x86/kernel/early_printk.c | 4 +---
arch/x86/kernel/head64.c | 1 +
include/linux/printk.h | 1 +
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/arch/x86/kernel/early_printk.c b/arch/x86/kernel/early_printk.c
index a62536a..4b0577b 100644
--- a/arch/x86/kernel/early_printk.c
+++ b/arch/x86/kernel/early_printk.c
@@ -329,7 +329,7 @@ static inline void early_console_register(struct console *con, int keep_early)
register_console(early_console);
}
-static int __init setup_early_printk(char *buf)
+int __init setup_early_printk(char *buf)
{
int keep;
@@ -390,5 +390,3 @@ static int __init setup_early_printk(char *buf)
}
return 0;
}
-
-early_param("earlyprintk", setup_early_printk);
diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c
index c4f8d46..0141de7 100644
--- a/arch/x86/kernel/head64.c
+++ b/arch/x86/kernel/head64.c
@@ -171,6 +171,7 @@ asmlinkage __visible void __init x86_64_start_kernel(char * real_mode_data)
load_idt((const struct desc_ptr *)&idt_descr);
copy_bootdata(__va(real_mode_data));
+ setup_early_printk(boot_command_line);
/*
* Load microcode early on BSP.
diff --git a/include/linux/printk.h b/include/linux/printk.h
index baa3f97..47e3919 100644
--- a/include/linux/printk.h
+++ b/include/linux/printk.h
@@ -115,6 +115,7 @@ int no_printk(const char *fmt, ...)
#ifdef CONFIG_EARLY_PRINTK
extern asmlinkage __printf(1, 2)
void early_printk(const char *fmt, ...);
+int setup_early_printk(char *buf);
#else
static inline __printf(1, 2) __cold
void early_printk(const char *s, ...) { }
--
2.3.3.611.g09038fc.dirty
* Alexander Kuleshov <[email protected]> wrote:
> As setup_earlyprintk passed to the early_param, it will be usable only after
> 'parse_early_param' function will be called from the 'setup_arch'. So we have
> earlyprintk during early boot and decompression. Next point after decompression
> of the kernel where we can use early_printk is after call of the
> 'parse_early_param'.
>
> This patch removes 'earlyprintk' from the early_param and setup it right after
> boot data copying. So 'early_printk' function will be usabable after
> decompression of kernel and before parse_early_param will be called.
>
> Signed-off-by: Alexander Kuleshov <[email protected]>
> ---
> arch/x86/kernel/early_printk.c | 4 +---
> arch/x86/kernel/head64.c | 1 +
> include/linux/printk.h | 1 +
> 3 files changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/arch/x86/kernel/early_printk.c b/arch/x86/kernel/early_printk.c
> index a62536a..4b0577b 100644
> --- a/arch/x86/kernel/early_printk.c
> +++ b/arch/x86/kernel/early_printk.c
> @@ -329,7 +329,7 @@ static inline void early_console_register(struct console *con, int keep_early)
> register_console(early_console);
> }
>
> -static int __init setup_early_printk(char *buf)
> +int __init setup_early_printk(char *buf)
> {
> int keep;
>
> @@ -390,5 +390,3 @@ static int __init setup_early_printk(char *buf)
> }
> return 0;
> }
> -
> -early_param("earlyprintk", setup_early_printk);
> diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c
> index c4f8d46..0141de7 100644
> --- a/arch/x86/kernel/head64.c
> +++ b/arch/x86/kernel/head64.c
> @@ -171,6 +171,7 @@ asmlinkage __visible void __init x86_64_start_kernel(char * real_mode_data)
> load_idt((const struct desc_ptr *)&idt_descr);
>
> copy_bootdata(__va(real_mode_data));
> + setup_early_printk(boot_command_line);
>
> /*
> * Load microcode early on BSP.
> diff --git a/include/linux/printk.h b/include/linux/printk.h
> index baa3f97..47e3919 100644
> --- a/include/linux/printk.h
> +++ b/include/linux/printk.h
> @@ -115,6 +115,7 @@ int no_printk(const char *fmt, ...)
> #ifdef CONFIG_EARLY_PRINTK
> extern asmlinkage __printf(1, 2)
> void early_printk(const char *fmt, ...);
> +int setup_early_printk(char *buf);
> #else
> static inline __printf(1, 2) __cold
> void early_printk(const char *s, ...) { }
This looks useful.
It would be nice to test it via a well placed printk() and check that
before the patch the message doesn't go to the serial console and
after the patch the message indeed arrives on the early serial console
- or something like that.
Thanks,
Ingo
2015-04-07 15:52 GMT+06:00 Ingo Molnar <[email protected]>:
>
> It would be nice to test it via a well placed printk() and check that
> before the patch the message doesn't go to the serial console and
> after the patch the message indeed arrives on the early serial console
> - or something like that.
I have tested this patch when i wrote it and early_printk does not print
anything before the parse_early_param. But i don't know how to show this
in code in a correct way. Maybe we should to give back early_printk call
which i removed in the previous patch
(https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git/commit/?id=91d8f0416f3989e248d3a3d3efb821eda10a85d2)?
Any one another question about this. I submited patch only for head64.c
and it does not affect kernel for i386, because i'm not sure where is
the best place to setup earlyprintk in the head32.c. I thought to put
it in the start of i386_start_kernel(void) (from head32.c) but not sure
about it.
* Alexander Kuleshov <[email protected]> wrote:
> 2015-04-07 15:52 GMT+06:00 Ingo Molnar <[email protected]>:
> >
> > It would be nice to test it via a well placed printk() and check that
> > before the patch the message doesn't go to the serial console and
> > after the patch the message indeed arrives on the early serial console
> > - or something like that.
>
> I have tested this patch when i wrote it and early_printk does not print
> anything before the parse_early_param. But i don't know how to show this
> in code in a correct way. [...]
Just add a debug printk() for your own testing, right after the param
initialization call, to be confident that the early console indeed
works.
> which i removed in the previous patch
> (https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git/commit/?id=91d8f0416f3989e248d3a3d3efb821eda10a85d2)?
>
> Any one another question about this. I submited patch only for
> head64.c and it does not affect kernel for i386, because i'm not
> sure where is the best place to setup earlyprintk in the head32.c. I
> thought to put it in the start of i386_start_kernel(void) (from
> head32.c) but not sure about it.
I'd use i386_start_kernel() on 32-bit and x86_64_start_kernel() on
64-bit - but I haven't tested whether it actually works.
Thanks,
Ingo
> Ingo Molnar <[email protected]>: wrote:
>
> Just add a debug printk() for your own testing, right after the param
> initialization call, to be confident that the early console indeed
> works.
>
I already tested it as you said when was writing this patch and it works.
>
> I'd use i386_start_kernel() on 32-bit and x86_64_start_kernel() on
> 64-bit - but I haven't tested whether it actually works.
>
As i already wrote, i tested it for x86_64 and it works. I will put earlyprintk
setup in the start of the i386_start_kernel, will test it with 32-bit
and resend two
patches if they will be good.
* Alexander Kuleshov <[email protected]> wrote:
> > Ingo Molnar <[email protected]>: wrote:
> >
> > Just add a debug printk() for your own testing, right after the param
> > initialization call, to be confident that the early console indeed
> > works.
> >
>
> I already tested it as you said when was writing this patch and it works.
The changelog does not tell us this and it should.
Thanks,
Ingo
On Tue, Apr 7, 2015 at 3:31 AM, Alexander Kuleshov
<[email protected]> wrote:
>
> As i already wrote, i tested it for x86_64 and it works. I will put earlyprintk
> setup in the start of the i386_start_kernel, will test it with 32-bit
> and resend two
> patches if they will be good.
No, that is not enough.
early_printk would handle not only serial console with io port accessing.
You need to make sure all other path including pciserial/dbgp/efi is safe.
They are using early_ioremap, and you can not call early_ioremap()
before early_ioremap.
otherwise you may need to just search "serial string in boot command line" like
i did in moving earlycon early patch.
Yinghai
On Tue, Apr 7, 2015 at 12:07 PM, Yinghai Lu <[email protected]> wrote:
> On Tue, Apr 7, 2015 at 3:31 AM, Alexander Kuleshov
> <[email protected]> wrote:
>
>>
>> As i already wrote, i tested it for x86_64 and it works. I will put earlyprintk
>> setup in the start of the i386_start_kernel, will test it with 32-bit
>> and resend two
>> patches if they will be good.
>
> No, that is not enough.
> early_printk would handle not only serial console with io port accessing.
> You need to make sure all other path including pciserial/dbgp/efi is safe.
> They are using early_ioremap, and you can not call early_ioremap()
> before early_ioremap.
They are using early_ioremap, and you can not call early_ioremap()
before early_ioremap_init.
>
> otherwise you may need to just search "serial string in boot command line" like
> i did in moving earlycon early patch.
>
> Yinghai