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

[Xen-devel] [rfc 18/18] ioemu: Allow virtual function to be speficied for PCI pass-through



Signed-off-by: Simon Horman <horms@xxxxxxxxxxxx>

--- 
Fri, 13 Feb 2009 13:45:22 +1100
* Fix parsing of vslot - the regex was incorrect
* Allow 0x to prefix hex values that are parsed

Index: ioemu-remote/hw/pass-through.c
===================================================================
--- ioemu-remote.orig/hw/pass-through.c 2009-02-17 17:52:08.000000000 +0900
+++ ioemu-remote/hw/pass-through.c      2009-02-17 17:52:13.000000000 +0900
@@ -866,14 +866,15 @@ err:
 #define RE_BDF_OPT RE_BDF RE_OPT "\\?"
 
 #define RE_VDEV  "\\(0x\\)\\?\\([01]\\?[0-9a-fA-F]\\)"
-#define RE_BDF_OPT_SLOT RE_BDF_OPT "\\(@" RE_VDEV "\\)\\?"
+#define RE_VDEVFN RE_VDEV "\\(\\." RE_FUNC "\\)\\?"
+#define RE_BDF_OPT_SLOT RE_BDF_OPT "\\(@" RE_VDEVFN "\\)\\?"
 
 static struct php_dev *parse_bdf(const char *str)
 {
     struct php_dev *list = NULL, *e;
     regex_t preg;
-    regmatch_t pmatch[14];
-    int err, nmemb = 0;
+    regmatch_t pmatch[17];
+    int err, nmemb = 0, v_func = 0;
     char *err_str;
 
     if ((err = regcomp(&preg, RE_BDF_OPT_SLOT, 0)))
@@ -891,7 +892,7 @@ static struct php_dev *parse_bdf(const c
 
     while (1)
     {
-        if ((err = regexec(&preg, str, 14, pmatch, 0)))
+        if ((err = regexec(&preg, str, 17, pmatch, 0)))
         {
             PT_LOG("Error: invalid PCI assignment \"%s\"\n", str);
             goto err;
@@ -917,7 +918,12 @@ static struct php_dev *parse_bdf(const c
 
         if (pmatch[12].rm_so >= 0)
         {
-            e->v_devfn = PCI_DEVFN(strtol(str + pmatch[12].rm_so, NULL, 16), 
0);
+            if (pmatch[15].rm_so >= 0)
+            {
+                v_func = strtol(str + pmatch[15].rm_so, NULL, 16);
+            }
+            e->v_devfn = PCI_DEVFN(strtol(str + pmatch[12].rm_so, NULL, 16),
+                                   v_func);
         }
 
         e->valid = 1;
Index: ioemu-remote/xenstore.c
===================================================================
--- ioemu-remote.orig/xenstore.c        2009-02-17 17:28:06.000000000 +0900
+++ ioemu-remote/xenstore.c     2009-02-17 17:52:13.000000000 +0900
@@ -582,6 +582,24 @@ void xenstore_parse_domain_config(int hv
 
             strcat(direct_pci_str, dev);
 
+            if (pasprintf(&buf, "/local/domain/0/backend/pci/%u/%u/vdevfn-%d",
+                          hvm_domid, pci_devid, i) != -1) {
+                free(dev);
+                dev = xs_read(xsh, XBT_NULL, buf, &len);
+            }
+            if ( dev ) {
+                if (strlen(dev) + strlen(direct_pci_str) >
+                    DIRECT_PCI_STR_LEN - 2) {
+                    fprintf(stderr, "qemu: too many pci pass-through "
+                            "devices\n");
+                    memset(direct_pci_str, 0, DIRECT_PCI_STR_LEN);
+                    goto out;
+                }
+                strcat(direct_pci_str, "@");
+                strcat(direct_pci_str, dev);
+            }
+
+
             if (pasprintf(&buf, "/local/domain/0/backend/pci/%u/%u/opts-%d",
                           hvm_domid, pci_devid, i) != -1) {
                 free(dev);

-- 

-- 
Simon Horman
  VA Linux Systems Japan K.K., Sydney, Australia Satellite Office
  H: www.vergenet.net/~horms/             W: www.valinux.co.jp/en


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


 


Rackspace

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