| From 6813455556ff7288ff4848083d1084ae363f3871 Mon Sep 17 00:00:00 2001 |
| From: Thomas Gleixner <tglx@linutronix.de> |
| Date: Sat, 23 Jul 2011 11:04:08 +0200 |
| Subject: [PATCH 057/274] early-printk-consolidate.patch |
| |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| --- |
| arch/arm/kernel/early_printk.c | 17 +++-------------- |
| arch/blackfin/kernel/early_printk.c | 2 -- |
| arch/microblaze/kernel/early_printk.c | 26 ++++---------------------- |
| arch/mips/kernel/early_printk.c | 10 ++++------ |
| arch/powerpc/kernel/udbg.c | 6 ++---- |
| arch/sh/kernel/sh_bios.c | 2 -- |
| arch/sparc/kernel/setup_32.c | 1 + |
| arch/sparc/kernel/setup_64.c | 8 +++++++- |
| arch/tile/kernel/early_printk.c | 26 ++++---------------------- |
| arch/um/kernel/early_printk.c | 8 +++++--- |
| arch/unicore32/kernel/early_printk.c | 12 ++++-------- |
| arch/x86/kernel/early_printk.c | 21 ++------------------- |
| include/linux/console.h | 1 + |
| include/linux/printk.h | 5 +++++ |
| kernel/printk.c | 30 +++++++++++++++++++++++------- |
| 15 files changed, 65 insertions(+), 110 deletions(-) |
| |
| diff --git a/arch/arm/kernel/early_printk.c b/arch/arm/kernel/early_printk.c |
| index 85aa2b2..4307653 100644 |
| --- a/arch/arm/kernel/early_printk.c |
| +++ b/arch/arm/kernel/early_printk.c |
| @@ -29,28 +29,17 @@ static void early_console_write(struct console *con, const char *s, unsigned n) |
| early_write(s, n); |
| } |
| |
| -static struct console early_console = { |
| +static struct console early_console_dev = { |
| .name = "earlycon", |
| .write = early_console_write, |
| .flags = CON_PRINTBUFFER | CON_BOOT, |
| .index = -1, |
| }; |
| |
| -asmlinkage void early_printk(const char *fmt, ...) |
| -{ |
| - char buf[512]; |
| - int n; |
| - va_list ap; |
| - |
| - va_start(ap, fmt); |
| - n = vscnprintf(buf, sizeof(buf), fmt, ap); |
| - early_write(buf, n); |
| - va_end(ap); |
| -} |
| - |
| static int __init setup_early_printk(char *buf) |
| { |
| - register_console(&early_console); |
| + early_console = &early_console_dev; |
| + register_console(&early_console_dev); |
| return 0; |
| } |
| |
| diff --git a/arch/blackfin/kernel/early_printk.c b/arch/blackfin/kernel/early_printk.c |
| index 84ed837..61fbd2d 100644 |
| --- a/arch/blackfin/kernel/early_printk.c |
| +++ b/arch/blackfin/kernel/early_printk.c |
| @@ -25,8 +25,6 @@ extern struct console *bfin_earlyserial_init(unsigned int port, |
| extern struct console *bfin_jc_early_init(void); |
| #endif |
| |
| -static struct console *early_console; |
| - |
| /* Default console */ |
| #define DEFAULT_PORT 0 |
| #define DEFAULT_CFLAG CS8|B57600 |
| diff --git a/arch/microblaze/kernel/early_printk.c b/arch/microblaze/kernel/early_printk.c |
| index aba1f9a..b099a86 100644 |
| --- a/arch/microblaze/kernel/early_printk.c |
| +++ b/arch/microblaze/kernel/early_printk.c |
| @@ -21,7 +21,6 @@ |
| #include <asm/setup.h> |
| #include <asm/prom.h> |
| |
| -static u32 early_console_initialized; |
| static u32 base_addr; |
| |
| #ifdef CONFIG_SERIAL_UARTLITE_CONSOLE |
| @@ -109,27 +108,11 @@ static struct console early_serial_uart16550_console = { |
| }; |
| #endif /* CONFIG_SERIAL_8250_CONSOLE */ |
| |
| -static struct console *early_console; |
| - |
| -void early_printk(const char *fmt, ...) |
| -{ |
| - char buf[512]; |
| - int n; |
| - va_list ap; |
| - |
| - if (early_console_initialized) { |
| - va_start(ap, fmt); |
| - n = vscnprintf(buf, 512, fmt, ap); |
| - early_console->write(early_console, buf, n); |
| - va_end(ap); |
| - } |
| -} |
| - |
| int __init setup_early_printk(char *opt) |
| { |
| int version = 0; |
| |
| - if (early_console_initialized) |
| + if (early_console) |
| return 1; |
| |
| base_addr = of_early_console(&version); |
| @@ -159,7 +142,6 @@ int __init setup_early_printk(char *opt) |
| } |
| |
| register_console(early_console); |
| - early_console_initialized = 1; |
| return 0; |
| } |
| return 1; |
| @@ -169,7 +151,7 @@ int __init setup_early_printk(char *opt) |
| * only for early console because of performance degression */ |
| void __init remap_early_printk(void) |
| { |
| - if (!early_console_initialized || !early_console) |
| + if (!early_console) |
| return; |
| printk(KERN_INFO "early_printk_console remapping from 0x%x to ", |
| base_addr); |
| @@ -195,9 +177,9 @@ void __init remap_early_printk(void) |
| |
| void __init disable_early_printk(void) |
| { |
| - if (!early_console_initialized || !early_console) |
| + if (!early_console) |
| return; |
| printk(KERN_WARNING "disabling early console\n"); |
| unregister_console(early_console); |
| - early_console_initialized = 0; |
| + early_console = NULL; |
| } |
| diff --git a/arch/mips/kernel/early_printk.c b/arch/mips/kernel/early_printk.c |
| index 9ae813e..973c995 100644 |
| --- a/arch/mips/kernel/early_printk.c |
| +++ b/arch/mips/kernel/early_printk.c |
| @@ -25,20 +25,18 @@ early_console_write(struct console *con, const char *s, unsigned n) |
| } |
| } |
| |
| -static struct console early_console __initdata = { |
| +static struct console early_console_prom = { |
| .name = "early", |
| .write = early_console_write, |
| .flags = CON_PRINTBUFFER | CON_BOOT, |
| .index = -1 |
| }; |
| |
| -static int early_console_initialized __initdata; |
| - |
| void __init setup_early_printk(void) |
| { |
| - if (early_console_initialized) |
| + if (early_console) |
| return; |
| - early_console_initialized = 1; |
| + early_console = &early_console_prom; |
| |
| - register_console(&early_console); |
| + register_console(&early_console_prom); |
| } |
| diff --git a/arch/powerpc/kernel/udbg.c b/arch/powerpc/kernel/udbg.c |
| index c39c1ca..8b00aab 100644 |
| --- a/arch/powerpc/kernel/udbg.c |
| +++ b/arch/powerpc/kernel/udbg.c |
| @@ -179,15 +179,13 @@ static struct console udbg_console = { |
| .index = 0, |
| }; |
| |
| -static int early_console_initialized; |
| - |
| /* |
| * Called by setup_system after ppc_md->probe and ppc_md->early_init. |
| * Call it again after setting udbg_putc in ppc_md->setup_arch. |
| */ |
| void __init register_early_udbg_console(void) |
| { |
| - if (early_console_initialized) |
| + if (early_console) |
| return; |
| |
| if (!udbg_putc) |
| @@ -197,7 +195,7 @@ void __init register_early_udbg_console(void) |
| printk(KERN_INFO "early console immortal !\n"); |
| udbg_console.flags &= ~CON_BOOT; |
| } |
| - early_console_initialized = 1; |
| + early_console = &udbg_console; |
| register_console(&udbg_console); |
| } |
| |
| diff --git a/arch/sh/kernel/sh_bios.c b/arch/sh/kernel/sh_bios.c |
| index 47475cc..a5b51b9 100644 |
| --- a/arch/sh/kernel/sh_bios.c |
| +++ b/arch/sh/kernel/sh_bios.c |
| @@ -144,8 +144,6 @@ static struct console bios_console = { |
| .index = -1, |
| }; |
| |
| -static struct console *early_console; |
| - |
| static int __init setup_early_printk(char *buf) |
| { |
| int keep_early = 0; |
| diff --git a/arch/sparc/kernel/setup_32.c b/arch/sparc/kernel/setup_32.c |
| index d444468..a000aa5 100644 |
| --- a/arch/sparc/kernel/setup_32.c |
| +++ b/arch/sparc/kernel/setup_32.c |
| @@ -221,6 +221,7 @@ void __init setup_arch(char **cmdline_p) |
| |
| boot_flags_init(*cmdline_p); |
| |
| + early_console = &prom_early_console; |
| register_console(&prom_early_console); |
| |
| /* Set sparc_cpu_model */ |
| diff --git a/arch/sparc/kernel/setup_64.c b/arch/sparc/kernel/setup_64.c |
| index 1414d16..8b37e5a 100644 |
| --- a/arch/sparc/kernel/setup_64.c |
| +++ b/arch/sparc/kernel/setup_64.c |
| @@ -487,6 +487,12 @@ static void __init init_sparc64_elf_hwcap(void) |
| popc_patch(); |
| } |
| |
| +static inline void register_prom_console(void) |
| +{ |
| + early_console = &prom_early_console; |
| + register_console(&prom_early_console); |
| +} |
| + |
| void __init setup_arch(char **cmdline_p) |
| { |
| /* Initialize PROM console and command line. */ |
| @@ -498,7 +504,7 @@ void __init setup_arch(char **cmdline_p) |
| #ifdef CONFIG_EARLYFB |
| if (btext_find_display()) |
| #endif |
| - register_console(&prom_early_console); |
| + register_prom_console(); |
| |
| if (tlb_type == hypervisor) |
| printk("ARCH: SUN4V\n"); |
| diff --git a/arch/tile/kernel/early_printk.c b/arch/tile/kernel/early_printk.c |
| index afb9c9a..ff25220 100644 |
| --- a/arch/tile/kernel/early_printk.c |
| +++ b/arch/tile/kernel/early_printk.c |
| @@ -33,25 +33,8 @@ static struct console early_hv_console = { |
| }; |
| |
| /* Direct interface for emergencies */ |
| -static struct console *early_console = &early_hv_console; |
| -static int early_console_initialized; |
| static int early_console_complete; |
| |
| -static void early_vprintk(const char *fmt, va_list ap) |
| -{ |
| - char buf[512]; |
| - int n = vscnprintf(buf, sizeof(buf), fmt, ap); |
| - early_console->write(early_console, buf, n); |
| -} |
| - |
| -void early_printk(const char *fmt, ...) |
| -{ |
| - va_list ap; |
| - va_start(ap, fmt); |
| - early_vprintk(fmt, ap); |
| - va_end(ap); |
| -} |
| - |
| void early_panic(const char *fmt, ...) |
| { |
| va_list ap; |
| @@ -69,14 +52,13 @@ static int __initdata keep_early; |
| |
| static int __init setup_early_printk(char *str) |
| { |
| - if (early_console_initialized) |
| + if (early_console) |
| return 1; |
| |
| if (str != NULL && strncmp(str, "keep", 4) == 0) |
| keep_early = 1; |
| |
| early_console = &early_hv_console; |
| - early_console_initialized = 1; |
| register_console(early_console); |
| |
| return 0; |
| @@ -85,12 +67,12 @@ static int __init setup_early_printk(char *str) |
| void __init disable_early_printk(void) |
| { |
| early_console_complete = 1; |
| - if (!early_console_initialized || !early_console) |
| + if (!early_console) |
| return; |
| if (!keep_early) { |
| early_printk("disabling early console\n"); |
| unregister_console(early_console); |
| - early_console_initialized = 0; |
| + early_console = NULL; |
| } else { |
| early_printk("keeping early console\n"); |
| } |
| @@ -98,7 +80,7 @@ void __init disable_early_printk(void) |
| |
| void warn_early_printk(void) |
| { |
| - if (early_console_complete || early_console_initialized) |
| + if (early_console_complete || early_console) |
| return; |
| early_printk("\ |
| Machine shutting down before console output is fully initialized.\n\ |
| diff --git a/arch/um/kernel/early_printk.c b/arch/um/kernel/early_printk.c |
| index ec649bf..183060f 100644 |
| --- a/arch/um/kernel/early_printk.c |
| +++ b/arch/um/kernel/early_printk.c |
| @@ -16,7 +16,7 @@ static void early_console_write(struct console *con, const char *s, unsigned int |
| um_early_printk(s, n); |
| } |
| |
| -static struct console early_console = { |
| +static struct console early_console_dev = { |
| .name = "earlycon", |
| .write = early_console_write, |
| .flags = CON_BOOT, |
| @@ -25,8 +25,10 @@ static struct console early_console = { |
| |
| static int __init setup_early_printk(char *buf) |
| { |
| - register_console(&early_console); |
| - |
| + if (!early_console) { |
| + early_console = &early_console_dev; |
| + register_console(&early_console_dev); |
| + } |
| return 0; |
| } |
| |
| diff --git a/arch/unicore32/kernel/early_printk.c b/arch/unicore32/kernel/early_printk.c |
| index 3922255..9be0d5d 100644 |
| --- a/arch/unicore32/kernel/early_printk.c |
| +++ b/arch/unicore32/kernel/early_printk.c |
| @@ -33,21 +33,17 @@ static struct console early_ocd_console = { |
| .index = -1, |
| }; |
| |
| -/* Direct interface for emergencies */ |
| -static struct console *early_console = &early_ocd_console; |
| - |
| -static int __initdata keep_early; |
| - |
| static int __init setup_early_printk(char *buf) |
| { |
| - if (!buf) |
| + int keep_early; |
| + |
| + if (!buf || early_console) |
| return 0; |
| |
| if (strstr(buf, "keep")) |
| keep_early = 1; |
| |
| - if (!strncmp(buf, "ocd", 3)) |
| - early_console = &early_ocd_console; |
| + early_console = &early_ocd_console; |
| |
| if (keep_early) |
| early_console->flags &= ~CON_BOOT; |
| diff --git a/arch/x86/kernel/early_printk.c b/arch/x86/kernel/early_printk.c |
| index 9b9f18b..d15f575 100644 |
| --- a/arch/x86/kernel/early_printk.c |
| +++ b/arch/x86/kernel/early_printk.c |
| @@ -169,25 +169,9 @@ static struct console early_serial_console = { |
| .index = -1, |
| }; |
| |
| -/* Direct interface for emergencies */ |
| -static struct console *early_console = &early_vga_console; |
| -static int __initdata early_console_initialized; |
| - |
| -asmlinkage void early_printk(const char *fmt, ...) |
| -{ |
| - char buf[512]; |
| - int n; |
| - va_list ap; |
| - |
| - va_start(ap, fmt); |
| - n = vscnprintf(buf, sizeof(buf), fmt, ap); |
| - early_console->write(early_console, buf, n); |
| - va_end(ap); |
| -} |
| - |
| static inline void early_console_register(struct console *con, int keep_early) |
| { |
| - if (early_console->index != -1) { |
| + if (con->index != -1) { |
| printk(KERN_CRIT "ERROR: earlyprintk= %s already used\n", |
| con->name); |
| return; |
| @@ -207,9 +191,8 @@ static int __init setup_early_printk(char *buf) |
| if (!buf) |
| return 0; |
| |
| - if (early_console_initialized) |
| + if (early_console) |
| return 0; |
| - early_console_initialized = 1; |
| |
| keep = (strstr(buf, "keep") != NULL); |
| |
| diff --git a/include/linux/console.h b/include/linux/console.h |
| index 7201ce4..dec7f97 100644 |
| --- a/include/linux/console.h |
| +++ b/include/linux/console.h |
| @@ -133,6 +133,7 @@ struct console { |
| for (con = console_drivers; con != NULL; con = con->next) |
| |
| extern int console_set_on_cmdline; |
| +extern struct console *early_console; |
| |
| extern int add_preferred_console(char *name, int idx, char *options); |
| extern int update_console_cmdline(char *name, int idx, char *name_new, int idx_new, char *options); |
| diff --git a/include/linux/printk.h b/include/linux/printk.h |
| index 0525927..c8d7f7b 100644 |
| --- a/include/linux/printk.h |
| +++ b/include/linux/printk.h |
| @@ -88,8 +88,13 @@ int no_printk(const char *fmt, ...) |
| return 0; |
| } |
| |
| +#ifdef CONFIG_EARLY_PRINTK |
| extern asmlinkage __printf(1, 2) |
| void early_printk(const char *fmt, ...); |
| +#else |
| +static inline __printf(1, 2) __cold |
| +void early_printk(const char *s, ...) { } |
| +#endif |
| |
| extern int printk_needs_cpu(int cpu); |
| extern void printk_tick(void); |
| diff --git a/kernel/printk.c b/kernel/printk.c |
| index b663c2c..c442606 100644 |
| --- a/kernel/printk.c |
| +++ b/kernel/printk.c |
| @@ -47,13 +47,6 @@ |
| #define CREATE_TRACE_POINTS |
| #include <trace/events/printk.h> |
| |
| -/* |
| - * Architectures can override it: |
| - */ |
| -void asmlinkage __attribute__((weak)) early_printk(const char *fmt, ...) |
| -{ |
| -} |
| - |
| #define __LOG_BUF_LEN (1 << CONFIG_LOG_BUF_SHIFT) |
| |
| /* printk's without a loglevel use this.. */ |
| @@ -524,6 +517,29 @@ static void __call_console_drivers(unsigned start, unsigned end) |
| } |
| } |
| |
| +#ifdef CONFIG_EARLY_PRINTK |
| +struct console *early_console; |
| + |
| +static void early_vprintk(const char *fmt, va_list ap) |
| +{ |
| + if (early_console) { |
| + char buf[512]; |
| + int n = vscnprintf(buf, sizeof(buf), fmt, ap); |
| + |
| + early_console->write(early_console, buf, n); |
| + } |
| +} |
| + |
| +asmlinkage void early_printk(const char *fmt, ...) |
| +{ |
| + va_list ap; |
| + |
| + va_start(ap, fmt); |
| + early_vprintk(fmt, ap); |
| + va_end(ap); |
| +} |
| +#endif |
| + |
| static bool __read_mostly ignore_loglevel; |
| |
| static int __init ignore_loglevel_setup(char *str) |
| -- |
| 1.7.10.4 |
| |