This adds and enables the console used on XEN kernels. --- sys/amd64/amd64/machdep.c | 4 +++ sys/conf/files | 4 +- sys/dev/xen/console/console.c | 45 ++++++++++++++++++++++------------- sys/dev/xen/console/xencons_ring.c | 15 ++++++++---- sys/i386/include/xen/xen-os.h | 1 - sys/i386/xen/xen_machdep.c | 17 ------------- sys/xen/xen-os.h | 4 +++ 7 files changed, 48 insertions(+), 42 deletions(-) diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c index a73e33e..1880f23 100644 --- a/sys/amd64/amd64/machdep.c +++ b/sys/amd64/amd64/machdep.c _at__at_ -1709,6 +1709,8 _at__at_ hammer_time_xen(start_info_t *si, u_int64_t xenstack) KASSERT((si != NULL && xenstack != 0), ("invalid start_info or xenstack")); + xc_printf("FreeBSD PVH running on %s\n", si->magic); + /* We use 3 pages of xen stack for the boot pagetables */ physfree = xenstack + 3 * PAGE_SIZE - KERNBASE; _at__at_ -1726,6 +1728,8 _at__at_ hammer_time_xen(start_info_t *si, u_int64_t xenstack) */ xen_store = (struct xenstore_domain_interface *) (ptoa(si->store_mfn) + KERNBASE); + console_page = + (char *)(ptoa(si->console.domU.mfn) + KERNBASE); xen_domain_type = XEN_PV_DOMAIN; vm_guest = VM_GUEST_XEN; diff --git a/sys/conf/files b/sys/conf/files index a73d31e..f55479d 100644 --- a/sys/conf/files +++ b/sys/conf/files _at__at_ -2523,8 +2523,8 _at__at_ dev/xe/if_xe_pccard.c optional xe pccard dev/xen/balloon/balloon.c optional xen | xenhvm dev/xen/blkfront/blkfront.c optional xen | xenhvm dev/xen/blkback/blkback.c optional xen | xenhvm -dev/xen/console/console.c optional xen -dev/xen/console/xencons_ring.c optional xen +dev/xen/console/console.c optional xen | xenhvm +dev/xen/console/xencons_ring.c optional xen | xenhvm dev/xen/control/control.c optional xen | xenhvm dev/xen/netback/netback.c optional xen | xenhvm dev/xen/netfront/netfront.c optional xen | xenhvm diff --git a/sys/dev/xen/console/console.c b/sys/dev/xen/console/console.c index 23eaee2..e8079da 100644 --- a/sys/dev/xen/console/console.c +++ b/sys/dev/xen/console/console.c _at__at_ -69,11 +69,14 _at__at_ struct mtx cn_mtx; static char wbuf[WBUF_SIZE]; static char rbuf[RBUF_SIZE]; static int rc, rp; -static unsigned int cnsl_evt_reg; +unsigned int cnsl_evt_reg; static unsigned int wc, wp; /* write_cons, write_prod */ xen_intr_handle_t xen_intr_handle; device_t xencons_dev; +/* Virt address of the shared console page */ +char *console_page; + #ifdef KDB static int xc_altbrk; #endif _at__at_ -110,9 +113,28 _at__at_ static struct ttydevsw xc_ttydevsw = { .tsw_outwakeup = xcoutwakeup, }; +/*----------------------------- Debug function -------------------------------*/ +#define XC_PRINTF_BUFSIZE 1024 +void +xc_printf(const char *fmt, ...) +{ + __va_list ap; + int retval; + static char buf[XC_PRINTF_BUFSIZE]; + + va_start(ap, fmt); + retval = vsnprintf(buf, XC_PRINTF_BUFSIZE - 1, fmt, ap); + va_end(ap); + buf[retval] = 0; + HYPERVISOR_console_write(buf, retval); +} + static void xc_cnprobe(struct consdev *cp) { + if (!xen_pv_domain()) + return; + cp->cn_pri = CN_REMOTE; sprintf(cp->cn_name, "%s0", driver_name); } _at__at_ -175,7 +197,7 _at__at_ static void xc_cnputc(struct consdev *dev, int c) { - if (xen_start_info->flags & SIF_INITDOMAIN) + if (xen_initial_domain()) xc_cnputc_dom0(dev, c); else xc_cnputc_domu(dev, c); _at__at_ -206,22 +228,12 _at__at_ xcons_putc(int c) xcons_force_flush(); #endif } - if (cnsl_evt_reg) - __xencons_tx_flush(); + __xencons_tx_flush(); /* inform start path that we're pretty full */ return ((wp - wc) >= WBUF_SIZE - 100) ? TRUE : FALSE; } -static void -xc_identify(driver_t *driver, device_t parent) -{ - device_t child; - child = BUS_ADD_CHILD(parent, 0, driver_name, 0); - device_set_driver(child, driver); - device_set_desc(child, "Xen Console"); -} - static int xc_probe(device_t dev) { _at__at_ -245,7 +257,7 _at__at_ xc_attach(device_t dev) cnsl_evt_reg = 1; callout_reset(&xc_callout, XC_POLLTIME, xc_timeout, xccons); - if (xen_start_info->flags & SIF_INITDOMAIN) { + if (xen_initial_domain()) { error = xen_intr_bind_virq(dev, VIRQ_CONSOLE, 0, NULL, xencons_priv_interrupt, NULL, INTR_TYPE_TTY, &xen_intr_handle); _at__at_ -309,7 +321,7 _at__at_ __xencons_tx_flush(void) sz = wp - wc; if (sz > (WBUF_SIZE - WBUF_MASK(wc))) sz = WBUF_SIZE - WBUF_MASK(wc); - if (xen_start_info->flags & SIF_INITDOMAIN) { + if (xen_initial_domain()) { HYPERVISOR_console_io(CONSOLEIO_write, sz, &wbuf[WBUF_MASK(wc)]); wc += sz; } else { _at__at_ -405,7 +417,6 _at__at_ xc_timeout(void *v) } static device_method_t xc_methods[] = { - DEVMETHOD(device_identify, xc_identify), DEVMETHOD(device_probe, xc_probe), DEVMETHOD(device_attach, xc_attach), _at__at_ -424,7 +435,7 _at__at_ xcons_force_flush(void) { int sz; - if (xen_start_info->flags & SIF_INITDOMAIN) + if (xen_initial_domain()) return; /* Spin until console data is flushed through to the domain controller. */ diff --git a/sys/dev/xen/console/xencons_ring.c b/sys/dev/xen/console/xencons_ring.c index 3701551..d826363 100644 --- a/sys/dev/xen/console/xencons_ring.c +++ b/sys/dev/xen/console/xencons_ring.c _at__at_ -32,9 +32,9 _at__at_ __FBSDID("$FreeBSD$"); #define console_evtchn console.domU.evtchn xen_intr_handle_t console_handle; -extern char *console_page; extern struct mtx cn_mtx; extern device_t xencons_dev; +extern int cnsl_evt_reg; static inline struct xencons_interface * xencons_interface(void) _at__at_ -60,6 +60,8 _at__at_ xencons_ring_send(const char *data, unsigned len) struct xencons_interface *intf; XENCONS_RING_IDX cons, prod; int sent; + struct evtchn_send send = { .port = + HYPERVISOR_start_info->console_evtchn }; intf = xencons_interface(); cons = intf->out_cons; _at__at_ -76,7 +78,10 _at__at_ xencons_ring_send(const char *data, unsigned len) wmb(); intf->out_prod = prod; - xen_intr_signal(console_handle); + if (cnsl_evt_reg) + xen_intr_signal(console_handle); + else + HYPERVISOR_event_channel_op(EVTCHNOP_send, &send); return sent; _at__at_ -125,11 +130,11 _at__at_ xencons_ring_init(void) { int err; - if (!xen_start_info->console_evtchn) + if (!HYPERVISOR_start_info->console_evtchn) return 0; err = xen_intr_bind_local_port(xencons_dev, - xen_start_info->console_evtchn, NULL, xencons_handle_input, NULL, + HYPERVISOR_start_info->console_evtchn, NULL, xencons_handle_input, NULL, INTR_TYPE_MISC | INTR_MPSAFE, &console_handle); if (err) { return err; _at__at_ -145,7 +150,7 _at__at_ void xencons_suspend(void) { - if (!xen_start_info->console_evtchn) + if (!HYPERVISOR_start_info->console_evtchn) return; xen_intr_unbind(&console_handle); diff --git a/sys/i386/include/xen/xen-os.h b/sys/i386/include/xen/xen-os.h index a8fba61..3d1ef04 100644 --- a/sys/i386/include/xen/xen-os.h +++ b/sys/i386/include/xen/xen-os.h _at__at_ -45,7 +45,6 _at__at_ static inline void rep_nop(void) #define cpu_relax() rep_nop() #ifndef XENHVM -void xc_printf(const char *fmt, ...); #ifdef SMP extern int gdtset; diff --git a/sys/i386/xen/xen_machdep.c b/sys/i386/xen/xen_machdep.c index fd575ee..09c01f1 100644 --- a/sys/i386/xen/xen_machdep.c +++ b/sys/i386/xen/xen_machdep.c _at__at_ -186,21 +186,6 _at__at_ xen_boothowto(char *envp) return howto; } -#define XC_PRINTF_BUFSIZE 1024 -void -xc_printf(const char *fmt, ...) -{ - __va_list ap; - int retval; - static char buf[XC_PRINTF_BUFSIZE]; - - va_start(ap, fmt); - retval = vsnprintf(buf, XC_PRINTF_BUFSIZE - 1, fmt, ap); - va_end(ap); - buf[retval] = 0; - (void)HYPERVISOR_console_write(buf, retval); -} - #define XPQUEUE_SIZE 128 _at__at_ -745,8 +730,6 _at__at_ void initvalues(start_info_t *startinfo); struct xenstore_domain_interface; extern struct xenstore_domain_interface *xen_store; -char *console_page; - void * bootmem_alloc(unsigned int size) { diff --git a/sys/xen/xen-os.h b/sys/xen/xen-os.h index e8a5a99..e005ccd 100644 --- a/sys/xen/xen-os.h +++ b/sys/xen/xen-os.h _at__at_ -55,6 +55,7 _at__at_ extern start_info_t *HYPERVISOR_start_info; /* XXX: we need to get rid of this and use HYPERVISOR_start_info directly */ extern struct xenstore_domain_interface *xen_store; +extern char *console_page; enum xen_domain_type { XEN_NATIVE, /* running on bare hardware */ _at__at_ -89,6 +90,9 _at__at_ xen_initial_domain(void) HYPERVISOR_start_info->flags & SIF_INITDOMAIN); } +/* Debug function, prints directly to hypervisor console */ +void xc_printf(const char *, ...); + #ifndef xen_mb #define xen_mb() mb() #endif -- 1.7.7.5 (Apple Git-26)Received on Thu Dec 19 2013 - 17:55:26 UTC
This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:40:45 UTC