mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-17 05:43:59 +00:00
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:
parent
c0c19cce9e
commit
2382778f40
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=269514
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue