[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH v7 03/19] xen: add and enable Xen console for PVH guests



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
@@ -1709,6 +1709,8 @@ 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;
 
@@ -1726,6 +1728,8 @@ 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
@@ -2523,8 +2523,8 @@ 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
@@ -69,11 +69,14 @@ 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
@@ -110,9 +113,28 @@ 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);
 }
@@ -175,7 +197,7 @@ 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);
@@ -206,22 +228,12 @@ 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)
 {
@@ -245,7 +257,7 @@ 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);
@@ -309,7 +321,7 @@ __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 {
@@ -405,7 +417,6 @@ 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),
 
@@ -424,7 +435,7 @@ 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
@@ -32,9 +32,9 @@ __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)
@@ -60,6 +60,8 @@ 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;
@@ -76,7 +78,10 @@ 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;
 
@@ -125,11 +130,11 @@ 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;
@@ -145,7 +150,7 @@ 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
@@ -45,7 +45,6 @@ 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
@@ -186,21 +186,6 @@ 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
 
@@ -745,8 +730,6 @@ 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
@@ -55,6 +55,7 @@ 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    */
@@ -89,6 +90,9 @@ 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)


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.