Author: royger
Date: Mon Aug  4 09:02:49 2014
New Revision: 269514
URL: http://svnweb.freebsd.org/changeset/base/269514

Log:
  xen: Dom0 console fixes
  
  Minor fixes to make the Xen Dom0 console work. This includes always
  returning there's pending input in xencons_has_input, because on Dom0
  there's no shared ring and we cannot test the indexes. The second
  fix is to use the CONSOLEIO_read hypercall in order to read input
  data from the Xen console.
  
  Sponsored by: Citrix Systems R&D
  
  dev/xen/console/xencons_ring.c:
   - Always return true in xencons_has_input for Dom0.
   - Implement Dom0 console support for xencons_handle_input.

Modified:
  head/sys/dev/xen/console/xencons_ring.c

Modified: head/sys/dev/xen/console/xencons_ring.c
==============================================================================
--- head/sys/dev/xen/console/xencons_ring.c     Mon Aug  4 09:01:21 2014        
(r269513)
+++ head/sys/dev/xen/console/xencons_ring.c     Mon Aug  4 09:02:49 2014        
(r269514)
@@ -35,6 +35,7 @@ xen_intr_handle_t console_handle;
 extern struct mtx              cn_mtx;
 extern device_t xencons_dev;
 extern bool cnsl_evt_reg;
+#define DOM0_BUFFER_SIZE       16
 
 static inline struct xencons_interface *
 xencons_interface(void)
@@ -48,6 +49,18 @@ xencons_has_input(void)
 {
        struct xencons_interface *intf; 
 
+       if (xen_initial_domain()) {
+               /*
+                * Since the Dom0 console works with hypercalls
+                * there's no way to know if there's input unless
+                * we actually try to retrieve it, so always return
+                * like there's pending data. Then if the hypercall
+                * returns no input, we can handle it without problems
+                * in xencons_handle_input().
+                */
+               return 1;
+       }
+
        intf = xencons_interface();             
 
        return (intf->in_cons != intf->in_prod);
@@ -98,6 +111,19 @@ xencons_handle_input(void *unused)
        XENCONS_RING_IDX cons, prod;
 
        CN_LOCK(cn_mtx);
+
+       if (xen_initial_domain()) {
+               static char rbuf[DOM0_BUFFER_SIZE];
+               int         l;
+
+               while ((l = HYPERVISOR_console_io(CONSOLEIO_read,
+                   DOM0_BUFFER_SIZE, rbuf)) > 0)
+                       xencons_rx(rbuf, l);
+
+               CN_UNLOCK(cn_mtx);
+               return;
+       }
+
        intf = xencons_interface();
 
        cons = intf->in_cons;
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to