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-changelog

[Xen-changelog] [xen-unstable] minios pcifront: translate physical into

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] minios pcifront: translate physical into virtual addresses
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Wed, 14 Oct 2009 01:15:11 -0700
Delivery-date: Wed, 14 Oct 2009 01:15:20 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1255505467 -3600
# Node ID af81d6f7363958cbe7d002495b84e15f7de8bbce
# Parent  bc6fe0a7622ac677e17007b1429f851dc329b805
minios pcifront: translate physical into virtual addresses

Qemu understands physical pci addresses while pciback expects virtual
pci addresses: this patch adds a translation function in pcifront to
make the conversion.

Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
---
 extras/mini-os/pcifront.c |   65 ++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 63 insertions(+), 2 deletions(-)

diff -r bc6fe0a7622a -r af81d6f73639 extras/mini-os/pcifront.c
--- a/extras/mini-os/pcifront.c Wed Oct 14 08:29:56 2009 +0100
+++ b/extras/mini-os/pcifront.c Wed Oct 14 08:31:07 2009 +0100
@@ -191,10 +191,10 @@ void pcifront_scan(struct pcifront_dev *
     n = xenbus_read_integer(path);
 
     for (i = 0; i < n; i++) {
-        snprintf(path, sizeof(path), "%s/vdev-%d", dev->backend, i);
+        snprintf(path, sizeof(path), "%s/dev-%d", dev->backend, i);
         msg = xenbus_read(XBT_NIL, path, &s);
         if (msg) {
-            printk("Error %s when reading the PCI root name at %s\n", path);
+            printk("Error %s when reading the PCI root name at %s\n", msg, 
path);
             continue;
         }
 
@@ -260,6 +260,55 @@ close_pcifront:
     free_pcifront(dev);
 }
 
+int pcifront_physical_to_virtual (struct pcifront_dev *dev,
+                                  unsigned int *dom,
+                                  unsigned int *bus,
+                                  unsigned int *slot,
+                                  unsigned long *fun)
+{
+    char path[strlen(dev->backend) + 1 + 5 + 10 + 1];
+    int i, n;
+    char *s, *msg = NULL;
+    unsigned int dom1, bus1, slot1, fun1;
+
+    snprintf(path, sizeof(path), "%s/num_devs", dev->backend);
+    n = xenbus_read_integer(path);
+
+    for (i = 0; i < n; i++) {
+        snprintf(path, sizeof(path), "%s/dev-%d", dev->backend, i);
+        msg = xenbus_read(XBT_NIL, path, &s);
+        if (msg) {
+            printk("Error %s when reading the PCI root name at %s\n", msg, 
path);
+            continue;
+        }
+
+        if (sscanf(s, "%x:%x:%x.%x", &dom1, &bus1, &slot1, &fun1) != 4) {
+            printk("\"%s\" does not look like a PCI device address\n", s);
+            free(s);
+            continue;
+        }
+        free(s);
+
+        if (dom1 == *dom && bus1 == *bus && slot1 == *slot && fun1 == *fun) {
+            snprintf(path, sizeof(path), "%s/vdev-%d", dev->backend, i);
+            msg = xenbus_read(XBT_NIL, path, &s);
+            if (msg) {
+                printk("Error %s when reading the PCI root name at %s\n", msg, 
path);
+                continue;
+            }
+
+            if (sscanf(s, "%x:%x:%x.%x", dom, bus, slot, fun) != 4) {
+                printk("\"%s\" does not look like a PCI device address\n", s);
+                free(s);
+                continue;
+            }
+            free(s);
+
+            return 0;
+        }
+    }
+    return -1;
+}
 
 void pcifront_op(struct pcifront_dev *dev, struct xen_pci_op *op)
 {
@@ -283,6 +332,8 @@ int pcifront_conf_read(struct pcifront_d
 {
     struct xen_pci_op op;
 
+    if (pcifront_physical_to_virtual(dev, &dom, &bus, &slot, &fun) < 0)
+        return XEN_PCI_ERR_dev_not_found;
     memset(&op, 0, sizeof(op));
 
     op.cmd = XEN_PCI_OP_conf_read;
@@ -309,6 +360,8 @@ int pcifront_conf_write(struct pcifront_
 {
     struct xen_pci_op op;
 
+    if (pcifront_physical_to_virtual(dev, &dom, &bus, &slot, &fun) < 0)
+        return XEN_PCI_ERR_dev_not_found;
     memset(&op, 0, sizeof(op));
 
     op.cmd = XEN_PCI_OP_conf_write;
@@ -331,6 +384,8 @@ int pcifront_enable_msi(struct pcifront_
 {
     struct xen_pci_op op;
 
+    if (pcifront_physical_to_virtual(dev, &dom, &bus, &slot, &fun) < 0)
+        return XEN_PCI_ERR_dev_not_found;
     memset(&op, 0, sizeof(op));
 
     op.cmd = XEN_PCI_OP_enable_msi;
@@ -352,6 +407,8 @@ int pcifront_disable_msi(struct pcifront
 {
     struct xen_pci_op op;
 
+    if (pcifront_physical_to_virtual(dev, &dom, &bus, &slot, &fun) < 0)
+        return XEN_PCI_ERR_dev_not_found;
     memset(&op, 0, sizeof(op));
 
     op.cmd = XEN_PCI_OP_disable_msi;
@@ -371,6 +428,8 @@ int pcifront_enable_msix(struct pcifront
 {
     struct xen_pci_op op;
 
+    if (pcifront_physical_to_virtual(dev, &dom, &bus, &slot, &fun) < 0)
+        return XEN_PCI_ERR_dev_not_found;
     if (n > SH_INFO_MAX_VEC)
         return XEN_PCI_ERR_op_failed;
 
@@ -401,6 +460,8 @@ int pcifront_disable_msix(struct pcifron
 {
     struct xen_pci_op op;
 
+    if (pcifront_physical_to_virtual(dev, &dom, &bus, &slot, &fun) < 0)
+        return XEN_PCI_ERR_dev_not_found;
     memset(&op, 0, sizeof(op));
 
     op.cmd = XEN_PCI_OP_disable_msix;

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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] minios pcifront: translate physical into virtual addresses, Xen patchbot-unstable <=