Add early printk support via hvc console From: Gerd Hoffmann Add early printk support via hvc console, enable using "earlyprintk=xen" on the kernel command line. Signed-off-by: Jeremy Fitzhardinge Signed-off-by: Chris Wright Signed-off-by: Andi Kleen Acked-by: Ingo Molnar --- arch/x86_64/kernel/early_printk.c | 5 +++++ drivers/char/hvc_xen.c | 25 +++++++++++++++++++++++++ drivers/xen/Makefile | 1 + include/xen/hvc-console.h | 6 ++++++ 4 files changed, 37 insertions(+) =================================================================== Index: linux/arch/x86_64/kernel/early_printk.c =================================================================== --- linux.orig/arch/x86_64/kernel/early_printk.c +++ linux/arch/x86_64/kernel/early_printk.c @@ -6,6 +6,7 @@ #include #include #include +#include /* Simple VGA output */ @@ -242,6 +243,10 @@ static int __init setup_early_printk(cha simnow_init(buf + 6); early_console = &simnow_console; keep_early = 1; +#ifdef CONFIG_XEN + } else if (!strncmp(buf, "xen", 3)) { + early_console = &xenboot_console; +#endif } if (keep_early) Index: linux/drivers/char/hvc_xen.c =================================================================== --- linux.orig/drivers/char/hvc_xen.c +++ linux/drivers/char/hvc_xen.c @@ -28,6 +28,7 @@ #include #include #include +#include #include "hvc_console.h" @@ -132,3 +133,27 @@ static int xen_cons_init(void) module_init(xen_init); module_exit(xen_fini); console_initcall(xen_cons_init); + +static void xenboot_write_console(struct console *console, const char *string, + unsigned len) +{ + unsigned int linelen, off = 0; + const char *pos; + + while (off < len && NULL != (pos = strchr(string+off, '\n'))) { + linelen = pos-string+off; + if (off + linelen > len) + break; + write_console(0, string+off, linelen); + write_console(0, "\r\n", 2); + off += linelen + 1; + } + if (off < len) + write_console(0, string+off, len-off); +} + +struct console xenboot_console = { + .name = "xenboot", + .write = xenboot_write_console, + .flags = CON_PRINTBUFFER | CON_BOOT, +}; Index: linux/drivers/xen/Makefile =================================================================== --- /dev/null +++ linux/drivers/xen/Makefile @@ -0,0 +1 @@ +obj-y += grant-table.o Index: linux/include/xen/hvc-console.h =================================================================== --- /dev/null +++ linux/include/xen/hvc-console.h @@ -0,0 +1,6 @@ +#ifndef XEN_HVC_CONSOLE_H +#define XEN_HVC_CONSOLE_H + +extern struct console xenboot_console; + +#endif /* XEN_HVC_CONSOLE_H */