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

[Xen-devel] [Patch][2/2][BIOS] Support BCV table



Hi,

This patch is qemu parts.

Signed-off-by: Akio Takebe <takebe_akio@xxxxxxxxxxxxxx>

Best Regards,

Akio Takebe
diff --git a/hw/pass-through.c b/hw/pass-through.c
index f23bdbb..43a5e20 100644
--- a/hw/pass-through.c
+++ b/hw/pass-through.c
@@ -27,6 +27,8 @@
 #include "pci/pci.h"
 #include "pt-msi.h"
 #include "qemu-xen.h"
+#include "xen/hvm/hvm_info_table.h"
+#include <sys/mman.h>
 #include <unistd.h>
 
 struct php_dev {
@@ -3634,6 +3636,60 @@ static int pt_pmcsr_reg_restore(struct pt_dev *ptdev,
     return 0;
 }
 
+static int
+pt_register_bootable_device(uint32_t e_devfn, int pci_boot)
+{
+    uint8_t *hvm_info_page;
+    struct hvm_info_table *hvm_info;
+    int i;
+    uint8_t sum;
+    uint32_t devfn; 
+    int rc = -1;
+
+    if (pci_boot <= 0 ) {
+        PT_LOG("Error: pci_boot=%d\n", pci_boot);
+        goto out;
+    }
+
+    hvm_info_page = xc_map_foreign_range(xc_handle, domid, XC_PAGE_SIZE,
+                                            PROT_READ|PROT_WRITE, 
HVM_INFO_PFN);
+    if (hvm_info_page == NULL){
+        PT_LOG("Error: xc_map_foreign_rage(HVM_INFO_PFN) error %d\n", errno);
+        goto out;
+    }
+    hvm_info = (struct hvm_info_table *)(hvm_info_page+HVM_INFO_OFFSET);
+
+    if ( strncmp(hvm_info->signature, "HVM INFO", 8) ) {
+        PT_LOG("Error: Bad hvm info signature(%s)\n", hvm_info->signature);
+        goto free;
+    }
+
+    for ( i = 0; i < MAX_PCI_BOOT; i++ ) { 
+        if ( hvm_info->pci_sbdf[i] == 0 ) {
+            hvm_info->pci_sbdf[i] = e_devfn;
+            break;
+        } else {
+            if ( i == MAX_PCI_BOOT ){
+                PT_LOG("Error: cannot enable bootable option (devfn=%x:%x)\n",
+                        (e_devfn>>3)&&0x1f, e_devfn&&0x7);
+                goto free;
+            }
+        }
+    }
+
+    hvm_info->checksum = 0;
+    for ( i = 0, sum = 0; i < hvm_info->length; i++ )
+        sum += ((uint8_t *)hvm_info)[i];
+    hvm_info->checksum = -sum;
+    rc = 0;
+
+free:
+    munmap(hvm_info_page, XC_PAGE_SIZE);
+out:
+    return rc;
+}
+
+
 struct pt_dev * register_real_device(PCIBus *e_bus,
         const char *e_dev_name, int e_devfn, uint8_t r_bus, uint8_t r_dev,
         uint8_t r_func, uint32_t machine_irq, struct pci_access *pci_access,
@@ -3647,6 +3703,7 @@ struct pt_dev * register_real_device(PCIBus *e_bus,
     int free_slot = -1;
     char *key, *val;
     int msi_translate, power_mgmt;
+    int pci_boot = 0;
 
     PT_LOG("Assigning real physical device %02x:%02x.%x ...\n",
         r_bus, r_dev, r_func);
@@ -3716,6 +3773,19 @@ struct pt_dev * register_real_device(PCIBus *e_bus,
             else
                 PT_LOG("Error: unrecognized value for power_mgmt=\n");
         }
+        else if (strcmp(key, "boot") == 0)
+            if (strcmp(val, "0") == 0 || strcmp(val, "no") == 0)
+            {
+                PT_LOG("Disable boot option\n");
+                pci_boot = 0;
+            }
+            else if (strcmp(val, "1") == 0 || strcmp(val, "yes") == 0)
+            {
+                PT_LOG("Enable boot option\n");
+                pci_boot = 1;
+            }
+            else
+                PT_LOG("Error: unrecognized value for boot=\n");
         else
             PT_LOG("Error: unrecognized PCI assignment option \"%s=%s\"\n", 
key, val);
 
@@ -3810,6 +3880,12 @@ struct pt_dev * register_real_device(PCIBus *e_bus,
             *(uint16_t *)(&assigned_device->dev.config[0x04]));
     }
 
+    if (pci_boot){
+        rc = pt_register_bootable_device(e_devfn, pci_boot);
+        if ( rc < 0 )
+            return NULL;
+    }
+
 out:
     PT_LOG("Real physical device %02x:%02x.%x registered successfuly!\n"
            "IRQ type = %s\n", r_bus, r_dev, r_func,
diff --git a/hw/pc.c b/hw/pc.c
index 878069d..bd376a0 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -215,6 +215,8 @@ static int boot_device2nibble(char boot_device)
         return 0x03; /* CD-ROM boot */
     case 'n':
         return 0x04; /* Network boot */
+    case 'p':
+        return 0x05; /* Pass-trough device */
     }
     return 0;
 }
diff --git a/vl.c b/vl.c
index 5801e42..9476218 100644
--- a/vl.c
+++ b/vl.c
@@ -3944,7 +3944,9 @@ static void help(int exitcode)
            "-mtdblock file  use 'file' as on-board Flash memory image\n"
            "-sd file        use 'file' as SecureDigital card image\n"
            "-pflash file    use 'file' as a parallel flash image\n"
-           "-boot [a|c|d|n] boot on floppy (a), hard disk (c), CD-ROM (d), or 
network (n)\n"
+           "-boot [a|c|d|n|p]\n"
+           "                boot on floppy (a), hard disk (c), CD-ROM (d), 
network (n)\n"
+           "                or PCI pass-through(p)\n"
            "-snapshot       write to temporary files instead of disk image 
files\n"
            "-m megs         set virtual RAM size to megs MB [default=%d]\n"
 #ifndef _WIN32
@@ -4982,7 +4984,8 @@ int main(int argc, char **argv, char **envp)
                          * a b     : floppy disk drives
                          * c ... f : IDE disk drives
                          * g ... m : machine implementation dependant drives
-                         * n ... p : network devices
+                         * n ... o : network devices
+                         * p       : PCI pass-through devices
                          * It's up to each machine implementation to check
                          * if the given boot devices match the actual hardware
                          * implementation and firmware features.
@@ -5525,7 +5528,7 @@ int main(int argc, char **argv, char **envp)
         kqemu_allowed = 0;
 #endif
     linux_boot = (kernel_filename != NULL);
-    net_boot = (boot_devices_bitmap >> ('n' - 'a')) & 0xF;
+    net_boot = (boot_devices_bitmap >> ('n' - 'a')) & 0x2;
 
     if (!linux_boot && net_boot == 0 &&
         !machine->nodisk_ok && nb_drives_opt == 0)
_______________________________________________
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®.