WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-ppc-devel

[XenPPC] [pushed] [ppc] more code for DomU console support for OFH

To: xen-ppc-devel@xxxxxxxxxxxxxxxxxxx
Subject: [XenPPC] [pushed] [ppc] more code for DomU console support for OFH
From: jimix@xxxxxxxxxxxxxx
Date: Tue, 04 Apr 2006 08:26:09 -0400
Delivery-date: Tue, 04 Apr 2006 05:24:16 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-ppc-devel-request@lists.xensource.com?subject=help>
List-id: Xen PPC development <xen-ppc-devel.lists.xensource.com>
List-post: <mailto:xen-ppc-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-ppc-devel>, <mailto:xen-ppc-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-ppc-devel>, <mailto:xen-ppc-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-ppc-devel-bounces@xxxxxxxxxxxxxxxxxxx
changeset:   9752:62eaa86f6658869d62f8882c731409941e9b2b2b
user:        jimix@xxxxxxxxxxxxxxxxxxxxx
date:        Tue Apr  4 08:22:02 2006 -0400
files:       xen/arch/ppc/of_handler/console.c 
xen/arch/ppc/of_handler/devtree.c xen/arch/ppc/of_handler/ofh.h 
xen/arch/ppc/of_handler/vdevice.c
description:
[ppc] more code for DomU console support for OFH


diff -r d8726d7827b42c4c3254751aaafb306cc0f12590 -r 
62eaa86f6658869d62f8882c731409941e9b2b2b xen/arch/ppc/of_handler/console.c
--- a/xen/arch/ppc/of_handler/console.c Tue Apr  4 08:20:42 2006 -0400
+++ b/xen/arch/ppc/of_handler/console.c Tue Apr  4 08:22:02 2006 -0400
@@ -19,6 +19,7 @@
 #include "ofh.h"
 #include "papr.h"
 #include <xen/string.h>
+#include <asm/system.h>
 
 union chpack {
     u64 oct[2];
@@ -29,7 +30,7 @@ union chpack {
 /* used for internal printing */
 static struct ofh_ihandle *ofh_ihp;
 
-static s32 ofh_papr_read(s32 chan, void *buf, u32 count, s32 *actual)
+static s32 ofh_papr_read(s32 chan, void *buf, u32 count, s32 *actual, ulong b)
 {
     s32 rc;
     ulong ret[5];
@@ -44,7 +45,8 @@ static s32 ofh_papr_read(s32 chan, void 
     return OF_SUCCESS;
 }
 
-static s32 ofh_papr_write(s32 chan, const void *buf, u32 count, s32 *actual)
+static s32 ofh_papr_write(s32 chan, const void *buf, u32 count, s32 *actual,
+                          ulong b)
 {
     const char *str = (const char *)buf;
     u32 i;
@@ -95,7 +97,8 @@ extern long xen_hvcall(ulong code, ...);
 extern long xen_hvcall(ulong code, ...);
 
 #define XENCOMM_MINI_AREA (sizeof(struct xencomm_mini) * 2)
-static s32 ofh_xen_dom0_read(s32 chan, void *buf, u32 count, s32 *actual)
+static s32 ofh_xen_dom0_read(s32 chan, void *buf, u32 count, s32 *actual,
+                             ulong b)
 {
     char __storage[XENCOMM_MINI_AREA];
     struct xencomm_desc *desc;
@@ -120,7 +123,8 @@ static s32 ofh_xen_dom0_read(s32 chan, v
     return OF_SUCCESS;
 }
 
-static s32 ofh_xen_dom0_write(s32 chan, const void *buf, u32 count, s32 
*actual)
+static s32 ofh_xen_dom0_write(s32 chan, const void *buf, u32 count,
+                              s32 *actual, ulong b)
 {
     char __storage[XENCOMM_MINI_AREA];
     struct xencomm_desc *desc;
@@ -148,13 +152,59 @@ static s32 ofh_xen_dom0_write(s32 chan, 
     return OF_SUCCESS;
 }
 
+static s32 ofh_xen_domu_read(s32 chan, void *buf, u32 count, s32 *actual,
+                             ulong b)
+{
+       struct xencons_interface *intf;
+       XENCONS_RING_IDX cons, prod;
+    s32 ret;
+
+    intf = DRELA(ofh_ihp, b)->ofi_intf;
+    cons = intf->in_cons;
+    prod = intf->in_prod;
+    mb();
+
+    ret = prod - cons;
+
+    if (ret > 0) {
+        ret = (ret < count) ? ret : count;
+        memcpy(buf, intf->in+MASK_XENCONS_IDX(cons,intf->in), ret);
+    }
+
+    *actual = (ret < 0) ? 0 : ret;
+    return OF_SUCCESS;
+}
+
+static s32 ofh_xen_domu_write(s32 chan, const void *buf, u32 count,
+                              s32 *actual, ulong b)
+{
+       struct xencons_interface *intf;
+       XENCONS_RING_IDX cons, prod;
+    s32 ret;
+
+    intf = DRELA(ofh_ihp, b)->ofi_intf;
+    cons = intf->in_cons;
+    prod = intf->in_prod;
+    mb();
+
+    ret = prod - cons;
+    /* FIXME: Do we have to write the whole thing or are partial writes ok? */
+    if (ret > 0) {
+        ret = (ret < count) ? ret : count;
+        memcpy(intf->in+MASK_XENCONS_IDX(cons,intf->in), buf, ret);
+    }
+
+    *actual = (ret < 0) ? 0 : ret;
+    return OF_SUCCESS;
+}
+
 /* for emergency printing in the OFH */
 s32 ofh_cons_write(const void *buf, u32 count, s32 *actual)
 {
     ulong b = get_base();
     struct ofh_ihandle *ihp = DRELA(ofh_ihp, b);
 
-    return ihp->ofi_write(ihp->ofi_chan, buf, count, actual);
+    return ihp->ofi_write(ihp->ofi_chan, buf, count, actual, b);
 }
 
 s32 ofh_cons_close(void)
@@ -163,22 +213,19 @@ s32 ofh_cons_close(void)
 }
 
 void
-ofh_cons_init(s32 chan, struct ofh_ihandle *ihp, ulong b)
-{
-    switch (chan) {
-    case OFH_CONS_XEN_DOM0:
-        ihp->ofi_write = ofh_xen_dom0_write;
-        ihp->ofi_read = ofh_xen_dom0_read;
-        break;
-    case OFH_CONS_XEN_DOMU:
-        ihp->ofi_write = ofh_xen_dom0_write;
-        ihp->ofi_read = ofh_xen_dom0_read;
-        break;
-    default:
+ofh_cons_init(struct ofh_ihandle *ihp, ulong b)
+{
+    if (ihp->ofi_chan == OFH_CONS_XEN) {
+        if (ihp->ofi_intf == NULL) {
+            ihp->ofi_write = ofh_xen_dom0_write;
+            ihp->ofi_read = ofh_xen_dom0_read;
+        } else {
+            ihp->ofi_write = ofh_xen_domu_write;
+            ihp->ofi_read = ofh_xen_domu_read;
+        }
+    } else {
         ihp->ofi_write = ofh_papr_write;
         ihp->ofi_read = ofh_papr_read;
-        break;
-    }
-    ihp->ofi_chan = chan;
+    }
     *DRELA(&ofh_ihp, b) = ihp;
 }
diff -r d8726d7827b42c4c3254751aaafb306cc0f12590 -r 
62eaa86f6658869d62f8882c731409941e9b2b2b xen/arch/ppc/of_handler/devtree.c
--- a/xen/arch/ppc/of_handler/devtree.c Tue Apr  4 08:20:42 2006 -0400
+++ b/xen/arch/ppc/of_handler/devtree.c Tue Apr  4 08:22:02 2006 -0400
@@ -232,9 +232,10 @@ ofh_instance_to_path(u32 nargs, u32 nret
             void *mem = ofd_mem(b);
 
             ph = ih->ofi_node;
-            *len = ofd_node_to_path(mem, ph, buf, sz);
-
-            return OF_SUCCESS;
+            if (ph > 0) {
+                *len = ofd_node_to_path(mem, ph, buf, sz);
+                return OF_SUCCESS;
+            }
         }
     }
     return OF_FAILURE;
@@ -251,13 +252,14 @@ ofh_package_to_path(u32 nargs, u32 nrets
             s32 *len = &retp[0];
             void *mem = ofd_mem(b);
 
-            *len = ofd_node_to_path(mem, ph, buf, sz);
-
-            return OF_SUCCESS;
-        }
-    }
-    return OF_FAILURE;
-}
-
-
-
+            if (ph > 0) {
+                *len = ofd_node_to_path(mem, ph, buf, sz);
+                return OF_SUCCESS;
+            }
+        }
+    }
+    return OF_FAILURE;
+}
+
+
+
diff -r d8726d7827b42c4c3254751aaafb306cc0f12590 -r 
62eaa86f6658869d62f8882c731409941e9b2b2b xen/arch/ppc/of_handler/ofh.h
--- a/xen/arch/ppc/of_handler/ofh.h     Tue Apr  4 08:20:42 2006 -0400
+++ b/xen/arch/ppc/of_handler/ofh.h     Tue Apr  4 08:22:02 2006 -0400
@@ -23,6 +23,7 @@
 #include <xen/types.h>
 #include <public/of-devtree.h>
 #include <public/xencomm.h>
+#include <public/io/console.h>
 
 #define MIN(x,y) (((x)<(y))?(x):(y))
 
@@ -91,10 +92,12 @@ struct ofh_methods {
 
 struct ofh_ihandle {
     s32 (*ofi_close)(void);
-    s32 (*ofi_read)(s32 chan, void *buf, u32 count, s32 *actual);
-    s32 (*ofi_write)(s32 chan, const void *buf, u32 count, s32 *actual);
+    s32 (*ofi_read)(s32 chan, void *buf, u32 count, s32 *actual, ulong b);
+    s32 (*ofi_write)(s32 chan, const void *buf, u32 count, s32 *actual,
+                     ulong b);
     s32 (*ofi_seek)(u32 pos_hi, u32 pos_lo, u32 *status);
     struct ofh_methods *ofi_methods;
+    struct xencons_interface *ofi_intf;
     s32 ofi_node;
     s32 ofi_chan;
 };
@@ -116,9 +119,8 @@ extern s32 ofh_start(struct ofh_args *);
 extern s32 ofh_start(struct ofh_args *);
 extern void _start(void);
 
-#define OFH_CONS_XEN_DOM0 -1
-#define OFH_CONS_XEN_DOMU -2
-extern void ofh_cons_init(s32 chan, struct ofh_ihandle *ihp, ulong b);
+#define OFH_CONS_XEN -1
+extern void ofh_cons_init(struct ofh_ihandle *ihp, ulong b);
 extern s32 ofh_cons_read(s32 chan, void *buf, u32 count, s32 *actual);
 extern s32 ofh_cons_write(const void *buf, u32 count, s32 *actual);
 extern s32 ofh_cons_close(void);
diff -r d8726d7827b42c4c3254751aaafb306cc0f12590 -r 
62eaa86f6658869d62f8882c731409941e9b2b2b xen/arch/ppc/of_handler/vdevice.c
--- a/xen/arch/ppc/of_handler/vdevice.c Tue Apr  4 08:20:42 2006 -0400
+++ b/xen/arch/ppc/of_handler/vdevice.c Tue Apr  4 08:22:02 2006 -0400
@@ -26,18 +26,17 @@ ofh_vty_init(ofdn_t chosen, ulong b)
     void *mem = ofd_mem(b);
     u32 ih = DRELA((u32)&_ih_cons, b);
     struct ofh_ihandle *ihp = (struct ofh_ihandle *)((ulong)ih);
-    ofdn_t n;
+    ofdn_t n = 0;
     s32 ret;
-    u32 chan = 0;
+    u32 chan = OFH_CONS_XEN;
+
+    ihp->ofi_intf = NULL;
 
     /* find the vty */
     n = ofd_node_find(mem,
                         DRELA((const char *)"/vdevice/vty", b));
     if (n > 0) {
         /* PAPR VTERM */
-
-        ihp->ofi_node = n;
-
         ret = ofd_getprop(mem, n, DRELA((const char *)"reg", b),
                           &chan, sizeof (chan));
         if (ret != (s32)sizeof (chan)) {
@@ -45,20 +44,25 @@ ofh_vty_init(ofdn_t chosen, ulong b)
         }
     } else {
         /* xen console */
-        s32 domain;
+        u32 addr;
 
-        n = ofd_node_find(mem, DRELA((const char *)"/xen", b));
+        n = ofd_node_find(mem, DRELA((const char *)"/xen/console", b));
         if (n > 0) {
             ret = ofd_getprop(mem, n, DRELA((const char *)"reg", b),
-                              &domain, sizeof (domain));
-            if (domain == 0) {
-                chan = OFH_CONS_XEN_DOM0;
+                              &addr, sizeof (addr));
+            if (addr == 0) {
+                ihp->ofi_intf = NULL;
             } else {
-                chan = OFH_CONS_XEN_DOMU;
+                ihp->ofi_intf = (struct xencons_interface *)(ulong)addr;
             }
         }
     }
-    ofh_cons_init(chan, ihp, b);
+    if (n > 0) {
+        ihp->ofi_node = n;
+    }
+    ihp->ofi_chan = chan;
+    ofh_cons_init(ihp, b);
+
     ofd_prop_add(mem, chosen, DRELA((const char *)"stdout", b),
                  &ih, sizeof (ih));
     ofd_prop_add(mem, chosen, DRELA((const char *)"stdin", b),



_______________________________________________
Xen-ppc-devel mailing list
Xen-ppc-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ppc-devel

<Prev in Thread] Current Thread [Next in Thread>
  • [XenPPC] [pushed] [ppc] more code for DomU console support for OFH, jimix <=