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.
This commit is contained in:
Roger Pau Monné 2014-08-04 09:02:49 +00:00
parent c0c19cce9e
commit 2382778f40
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=269514

View file

@ -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;