static void pci_uart_drain(int fd, enum ev_type ev, void *arg) { struct pci_uart_softc *sc; int ch; sc = arg; assert(fd == STDIN_FILENO); assert(ev == EVF_READ); /* * This routine is called in the context of the mevent thread * to take out the softc lock to protect against concurrent * access from a vCPU i/o exit */ pthread_mutex_lock(&sc->mtx); if ((sc->mcr & MCR_LOOPBACK) != 0) { (void) ttyread(); } else { while (fifo_available(&sc->rxfifo) && ((ch = ttyread()) != -1)) { fifo_putchar(&sc->rxfifo, ch); } pci_uart_toggle_intr(sc); } pthread_mutex_unlock(&sc->mtx); }
static int console_handler(struct vmctx *ctx, int vcpu, int in, int port, int bytes, uint32_t *eax, void *arg) { static int opened; if (bytes == 2 && in) { *eax = BVM_CONS_SIG; return (0); } /* * Guests might probe this port to look for old ISA devices * using single-byte reads. Return 0xff for those. */ if (bytes == 1 && in) { *eax = 0xff; return (0); } if (bytes != 4) return (-1); if (!opened) { ttyopen(); opened = 1; } if (in) *eax = ttyread(); else ttywrite(*eax); return (0); }