]> xenbits.xensource.com Git - people/dariof/xen.git/commitdiff
x86/guest: use PV console for Xen/Dom0 I/O
authorSergey Dyasli <sergey.dyasli@citrix.com>
Fri, 24 Nov 2017 11:21:17 +0000 (11:21 +0000)
committerWei Liu <wei.liu2@citrix.com>
Tue, 16 Jan 2018 18:34:04 +0000 (18:34 +0000)
Signed-off-by: Sergey Dyasli <sergey.dyasli@citrix.com>
Signed-off-by: Wei Liu <wei.liu2@citrix.com>
docs/misc/xen-command-line.markdown
xen/arch/x86/guest/xen.c
xen/drivers/char/console.c

index 38fc0e5fdac3ae2a2c2e9e01688e0f6adb223134..34e05ee9a13b0fbe7230cb988f76a33e2b24695a 100644 (file)
@@ -381,7 +381,7 @@ The following are examples of correct specifications:
 Specify the size of the console ring buffer.
 
 ### console
-> `= List of [ vga | com1[H,L] | com2[H,L] | dbgp | none ]`
+> `= List of [ vga | com1[H,L] | com2[H,L] | pv | dbgp | none ]`
 
 > Default: `console=com1,vga`
 
@@ -397,6 +397,9 @@ the converse; transmitted and received characters will have their MSB
 cleared.  This allows a single port to be shared by two subsystems
 (e.g. console and debugger).
 
+`pv` indicates that Xen should use Xen's PV console. This option is
+only available when used together with `pv-in-pvh`.
+
 `dbgp` indicates that Xen should use a USB debug port.
 
 `none` indicates that Xen should not use a console.  This option only
index 59871170c84f07d5757d94d4072a4ce24535974f..d4968b47aaeb552e831384048191b674736af5fe 100644 (file)
@@ -23,6 +23,7 @@
 #include <xen/pfn.h>
 #include <xen/rangeset.h>
 #include <xen/types.h>
+#include <xen/pv_console.h>
 
 #include <asm/apic.h>
 #include <asm/e820.h>
@@ -194,6 +195,8 @@ static void xen_evtchn_upcall(struct cpu_user_regs *regs)
     vcpu_info->evtchn_upcall_pending = 0;
     write_atomic(&vcpu_info->evtchn_pending_sel, 0);
 
+    pv_console_rx(regs);
+
     ack_APIC_irq();
 }
 
index d05ebf9f70ce0f220e06ecdb98ffa6a74976aa8c..8acd35839547985d525ff3b55f3d546210171b60 100644 (file)
@@ -32,6 +32,7 @@
 #include <xen/warning.h>
 
 #ifdef CONFIG_X86
+#include <xen/pv_console.h>
 #include <asm/guest.h>
 #endif
 
@@ -344,6 +345,11 @@ static void sercon_puts(const char *s)
         (*serial_steal_fn)(s);
     else
         serial_puts(sercon_handle, s);
+
+#ifdef CONFIG_X86
+    /* Copy all serial output into PV console */
+    pv_console_puts(s);
+#endif
 }
 
 static void dump_console_ring_key(unsigned char key)
@@ -805,6 +811,8 @@ void __init console_init_preirq(void)
         if ( !strncmp(p, "vga", 3) )
             video_init();
 #ifdef CONFIG_X86
+       else if ( !strncmp(p, "pv", 2) )
+            pv_console_init();
         else if ( !strncmp(p, "xen", 3) )
             opt_console_xen = true;
 #endif
@@ -828,6 +836,10 @@ void __init console_init_preirq(void)
 
     serial_set_rx_handler(sercon_handle, serial_rx);
 
+#ifdef CONFIG_X86
+    pv_console_set_rx_handler(serial_rx);
+#endif
+
     /* HELLO WORLD --- start-of-day banner text. */
     spin_lock(&console_lock);
     __putstr(xen_banner());
@@ -880,6 +892,10 @@ void __init console_init_postirq(void)
 {
     serial_init_postirq();
 
+#ifdef CONFIG_X86
+    pv_console_init_postirq();
+#endif
+
     if ( conring != _conring )
         return;