Date: Fri, 6 Jan 2006 04:28:18 GMT From: Kip Macy <kmacy@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 89249 for review Message-ID: <200601060428.k064SI85069957@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=89249 Change 89249 by kmacy@kmacy:freebsd7_xen3 on 2006/01/06 04:27:21 first *small* changes for DOM0 support add PHYSDEV_ACCESS option add DOM0 support to console driver Affected files ... .. //depot/projects/xen3/src/sys/conf/options.i386-xen#2 edit .. //depot/projects/xen3/src/sys/dev/xen/console/console.c#2 edit Differences ... ==== //depot/projects/xen3/src/sys/conf/options.i386-xen#2 (text+ko) ==== @@ -32,8 +32,14 @@ # Change KVM size. Changes things all over the kernel. KVA_PAGES opt_global.h + +# support xen hypervisor. XEN opt_global.h +# support physical device access +XEN_PHYSDEV_ACCESS opt_global.h + + # Physical address extensions and support for >4G ram. As above. PAE opt_global.h ==== //depot/projects/xen3/src/sys/dev/xen/console/console.c#2 (text+ko) ==== @@ -16,11 +16,13 @@ #include <machine/stdarg.h> #include <machine/xen-os.h> #include <machine/hypervisor.h> +#include <machine/xen_intr.h> #include <sys/cons.h> #include <dev/xen/console/xencons_ring.h> #include <machine/xen-public/io/console.h> + #include "opt_ddb.h" #ifdef DDB #include <ddb/ddb.h> @@ -39,12 +41,14 @@ static void xc_shutdown(void *arg, int howto); static int xc_mute; -void xcons_force_flush(void); +static void xcons_force_flush(void); +static void xencons_priv_interrupt(void *); static cn_probe_t xccnprobe; static cn_init_t xccninit; static cn_getc_t xccngetc; static cn_putc_t xccnputc; +static cn_putc_t xccnputc_dom0; static cn_checkc_t xccncheckc; #define XC_POLLTIME (hz/10) @@ -106,16 +110,16 @@ static void xccnprobe(struct consdev *cp) { - cp->cn_pri = CN_REMOTE; - cp->cn_tp = xccons; - sprintf(cp->cn_name, "%s0", driver_name); + cp->cn_pri = CN_REMOTE; + cp->cn_tp = xccons; + sprintf(cp->cn_name, "%s0", driver_name); } static void xccninit(struct consdev *cp) { - CN_LOCK_INIT(cn_mtx,"XCONS LOCK"); + CN_LOCK_INIT(cn_mtx,"XCONS LOCK"); } int @@ -140,16 +144,16 @@ int xccncheckc(struct consdev *dev) { - int ret = (xc_mute ? 0 : -1); - int flags; - CN_LOCK(cn_mtx, flags); - if ( (rp - rc) ){ - /* we need to return only one char */ - ret = (int)rbuf[RBUF_MASK(rc)]; - rc++; - } - CN_UNLOCK(cn_mtx, flags); - return(ret); + int ret = (xc_mute ? 0 : -1); + int flags; + CN_LOCK(cn_mtx, flags); + if ( (rp - rc) ){ + /* we need to return only one char */ + ret = (int)rbuf[RBUF_MASK(rc)]; + rc++; + } + CN_UNLOCK(cn_mtx, flags); + return(ret); } static void @@ -161,6 +165,12 @@ CN_UNLOCK(cn_mtx, flags); } +static void +xccnputc_dom0(struct consdev *dev, int c) +{ + HYPERVISOR_console_io(CONSOLEIO_write, 1, (char *)&c); +} + static boolean_t xcons_putc(int c) { @@ -213,32 +223,47 @@ static int xc_attach(device_t dev) { - struct xc_softc *sc = (struct xc_softc *)device_get_softc(dev); - TRACE_ENTER; + struct xc_softc *sc = (struct xc_softc *)device_get_softc(dev); + + + if (xen_start_info->flags & SIF_INITDOMAIN) { + xc_consdev.cn_putc = xccnputc_dom0; + } - sc->xc_dev = make_dev(&xc_cdevsw, 0, UID_ROOT, GID_WHEEL, 0600, "xc%r", 0); - xccons = ttymalloc(NULL); + sc->xc_dev = make_dev(&xc_cdevsw, 0, UID_ROOT, GID_WHEEL, 0600, "xc%r", 0); + xccons = ttymalloc(NULL); - sc->xc_dev->si_drv1 = (void *)sc; - sc->xc_dev->si_tty = xccons; + sc->xc_dev->si_drv1 = (void *)sc; + sc->xc_dev->si_tty = xccons; - xccons->t_oproc = xcstart; - xccons->t_param = xcparam; - xccons->t_stop = xcstop; - xccons->t_dev = sc->xc_dev; + xccons->t_oproc = xcstart; + xccons->t_param = xcparam; + xccons->t_stop = xcstop; + xccons->t_dev = sc->xc_dev; + + callout_init(&xc_callout, 0); - callout_init(&xc_callout, 0); + xencons_ring_init(); - xencons_ring_init(); + cnsl_evt_reg = 1; + callout_reset(&xc_callout, XC_POLLTIME, xc_timeout, xccons); + + if (xen_start_info->flags & SIF_INITDOMAIN) { + PANIC_IF(bind_virq_to_irqhandler( + VIRQ_CONSOLE, + 0, + "console", + xencons_priv_interrupt, + INTR_TYPE_TTY) < 0); + + } - cnsl_evt_reg = 1; - callout_reset(&xc_callout, XC_POLLTIME, xc_timeout, xccons); - /* register handler to flush console on shutdown */ - if ((EVENTHANDLER_REGISTER(shutdown_post_sync, xc_shutdown, - NULL, SHUTDOWN_PRI_DEFAULT)) == NULL) + /* register handler to flush console on shutdown */ + if ((EVENTHANDLER_REGISTER(shutdown_post_sync, xc_shutdown, + NULL, SHUTDOWN_PRI_DEFAULT)) == NULL) printf("xencons: shutdown event registration failed!\n"); - + TRACE_EXIT; return (0); } @@ -250,9 +275,7 @@ xc_shutdown(void *arg, int howto) { xc_mute = 1; -#ifdef notyet xcons_force_flush(); -#endif } void @@ -310,17 +333,20 @@ __xencons_tx_flush(); CN_UNLOCK(cn_mtx, flags); } -#ifdef nomore -static void -xencons_tx_flush_task_routine(void * data, int arg) + +static void +xencons_priv_interrupt(void *arg) { - int flags; - CN_LOCK(cn_mtx, flags); - xc_tx_task_queued = FALSE; - __xencons_tx_flush(); - CN_UNLOCK(cn_mtx, flags); + + static char rbuf[16]; + int l; + + while ((l = HYPERVISOR_console_io(CONSOLEIO_read, 16, rbuf)) > 0) + xencons_rx(rbuf, l); + + xencons_tx(); } -#endif + int xcopen(struct cdev *dev, int flag, int mode, struct thread *td) { @@ -484,59 +510,45 @@ static device_method_t xc_methods[] = { - DEVMETHOD(device_identify, xc_identify), - DEVMETHOD(device_probe, xc_probe), - DEVMETHOD(device_attach, xc_attach), - {0, 0} + DEVMETHOD(device_identify, xc_identify), + DEVMETHOD(device_probe, xc_probe), + DEVMETHOD(device_attach, xc_attach), + {0, 0} }; static driver_t xc_driver = { - driver_name, - xc_methods, - sizeof(struct xc_softc), + driver_name, + xc_methods, + sizeof(struct xc_softc), }; -#if 0 + /*** Forcibly flush console data before dying. ***/ void xcons_force_flush(void) { - int sz; + int sz; - /* - * We use dangerous control-interface functions that require a quiescent - * system and no interrupts. Try to ensure this with a global cli(). - */ - cli(); + if (xen_start_info->flags & SIF_INITDOMAIN) + return; - /* Spin until console data is flushed through to the domain controller. */ - while ( (wc != wp) && !ctrl_if_transmitter_empty() ) - { - /* Interrupts are disabled -- we must manually reap responses. */ - ctrl_if_discard_responses(); + /* Spin until console data is flushed through to the domain controller. */ + while (wc != wp) { + int sent = 0; + if ((sz = wp - wc) == 0) + continue; + + sent = xencons_ring_send(&wbuf[WBUF_MASK(wc)], sz); + if (sent > 0) + wc += sent; + } +} - if ( (sz = wp - wc) == 0 ) - continue; - if ( sz > sizeof(msg.msg) ) - sz = sizeof(msg.msg); - if ( sz > (WBUF_SIZE - WBUF_MASK(wc)) ) - sz = WBUF_SIZE - WBUF_MASK(wc); - - msg.type = CMSG_CONSOLE; - msg.subtype = CMSG_CONSOLE_DATA; - msg.length = sz; - memcpy(msg.msg, &wbuf[WBUF_MASK(wc)], sz); - - if ( ctrl_if_send_message_noblock(&msg, NULL, 0) == 0 ) - wc += sz; - } -} -#endif DRIVER_MODULE(xc, nexus, xc_driver, xc_devclass, 0, 0); /* * Local variables: * mode: C * c-set-style: "BSD" - * c-basic-offset: 4 + * c-basic-offset: 8 * tab-width: 4 * indent-tabs-mode: t * End:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200601060428.k064SI85069957>