[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH RFC v1 27/74] xen/console: Introduce console=xen
From: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> This specifies whether to use Xen specific console output. There are two variants: one is the hypervisor console, the other is the magic debug port 0xe9. Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx> --- xen/drivers/char/console.c | 33 +++++++++++++++++++++++++++++++++ xen/include/asm-x86/guest/hypercall.h | 13 +++++++++++++ 2 files changed, 46 insertions(+) diff --git a/xen/drivers/char/console.c b/xen/drivers/char/console.c index 19d0e74f17..51c1454b8e 100644 --- a/xen/drivers/char/console.c +++ b/xen/drivers/char/console.c @@ -30,6 +30,7 @@ #include <xen/hypercall.h> /* for do_console_io */ #include <xen/early_printk.h> #include <xen/warning.h> +#include <asm/guest.h> /* console: comma-separated list of console outputs. */ static char __initdata opt_console[30] = OPT_CONSOLE_STR; @@ -83,6 +84,8 @@ static uint32_t conringc, conringp; static int __read_mostly sercon_handle = -1; +static bool __read_mostly opt_console_xen; /* console=xen */ + static DEFINE_SPINLOCK(console_lock); /* @@ -432,6 +435,14 @@ static void notify_dom0_con_ring(unsigned long unused) static DECLARE_SOFTIRQ_TASKLET(notify_dom0_con_ring_tasklet, notify_dom0_con_ring, 0); +static inline void xen_console_write_debug_port(const char *buf, size_t len) +{ + unsigned long tmp; + asm volatile ( "rep outsb;" + : "=&S" (tmp), "=&c" (tmp) + : "0" (buf), "1" (len), "d" (0xe9) ); +} + static long guest_console_write(XEN_GUEST_HANDLE_PARAM(char) buffer, int count) { char kbuf[128]; @@ -458,6 +469,16 @@ static long guest_console_write(XEN_GUEST_HANDLE_PARAM(char) buffer, int count) sercon_puts(kbuf); video_puts(kbuf); + if ( opt_console_xen ) + { + size_t len = strlen(kbuf); + + if ( xen_guest ) + xen_hypercall_console_write(kbuf, len); + else + xen_console_write_debug_port(kbuf, len); + } + if ( opt_console_to_ring ) { conring_puts(kbuf); @@ -567,6 +588,16 @@ static void __putstr(const char *str) sercon_puts(str); video_puts(str); + if ( opt_console_xen ) + { + size_t len = strlen(str); + + if ( xen_guest ) + xen_hypercall_console_write(str, len); + else + xen_console_write_debug_port(str, len); + } + conring_puts(str); if ( !console_locks_busted ) @@ -762,6 +793,8 @@ void __init console_init_preirq(void) p++; if ( !strncmp(p, "vga", 3) ) video_init(); + else if ( !strncmp(p, "xen", 3) ) + opt_console_xen = true; else if ( !strncmp(p, "none", 4) ) continue; else if ( (sh = serial_parse_handle(p)) >= 0 ) diff --git a/xen/include/asm-x86/guest/hypercall.h b/xen/include/asm-x86/guest/hypercall.h index 4bb749f240..d5fe535c03 100644 --- a/xen/include/asm-x86/guest/hypercall.h +++ b/xen/include/asm-x86/guest/hypercall.h @@ -99,6 +99,13 @@ static inline long xen_hypercall_memory_op(unsigned int cmd, void *arg) /* * Higher level hypercall helpers */ +static inline void xen_hypercall_console_write( + const char *buf, unsigned int count) +{ + (void)_hypercall64_3(long, __HYPERVISOR_console_io, + CONSOLEIO_write, count, buf); +} + static inline long xen_hypercall_shutdown(unsigned int reason) { return xen_hypercall_sched_op(SCHEDOP_shutdown, &reason); @@ -106,6 +113,12 @@ static inline long xen_hypercall_shutdown(unsigned int reason) #else /* CONFIG_XEN_GUEST */ +static inline void xen_hypercall_console_write( + const char *buf, unsigned int count) +{ + ASSERT_UNREACHABLE(); +} + static inline long xen_hypercall_shutdown(unsigned int reason) { ASSERT_UNREACHABLE(); -- 2.11.0 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |