Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 4 Aug 2014 09:02:49 +0000 (UTC)
From:      Roger Pau Monné <royger@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r269514 - head/sys/dev/xen/console
Message-ID:  <53df4c39.5feb.53a075b7@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?53df4c39.5feb.53a075b7>