return unregister_real_device(php_slot);
}
-int pt_init(PCIBus *e_bus, const char *direct_pci)
+int pt_init(PCIBus *e_bus)
{
- int seg, b, d, f, s, status = -1;
- struct pt_dev *pt_dev;
struct pci_access *pci_access;
- char *vslots;
- char slot_str[8];
- char *direct_pci_head = NULL;
- char *direct_pci_p = NULL;
- char *opt;
/* Initialize libpci */
pci_access = pci_alloc();
dpci_infos.pci_access = pci_access;
dpci_infos.e_bus = e_bus;
- if ( !direct_pci || strlen(direct_pci) == 0 ) {
- return 0;
- }
-
- if ( !(direct_pci_head = direct_pci_p = strdup(direct_pci)) )
- return 0;
-
- /* The minimal format of direct_pci: xxxx:xx:xx.x-xxxx:xx:xx.x-... It may
- * be even longer considering the per-device opts(see the parsing for
- * '/local/domain/0/backend/pci/XX/YY/opts-ZZ' in
- * xenstore_parse_domain_config().
- *
- * The format of vslots(virtual pci slots of all pass-through devs):
- * 0xXX;0xXX;... (see the code below).
- *
- * We're sure the length of direct_pci is bigger than that of vslots.
- */
- vslots = qemu_mallocz(strlen(direct_pci) + 1);
- if ( vslots == NULL )
- {
- status = -1;
- goto err;
- }
-
- /* Assign given devices to guest */
- while ( next_bdf(&direct_pci_p, &seg, &b, &d, &f, &opt, &s) )
- {
- /* Register real device with the emulated bus */
- pt_dev = register_real_device(e_bus, "DIRECT PCI", s,
- b, d, f, PT_MACHINE_IRQ_AUTO, pci_access, opt);
- if ( pt_dev == NULL )
- {
- PT_LOG("Error: Registration failed (%02x:%02x.%x)\n", b, d, f);
- goto err;
- }
-
- /* Record the virtual slot info */
- sprintf(slot_str, "0x%02x;", PCI_SLOT(pt_dev->dev.devfn));
-
- strcat(vslots, slot_str);
- }
-
- /* Write virtual slots info to xenstore for Control panel use */
- xenstore_write_vslots(vslots);
-
- status = 0;
-err:
- qemu_free(vslots);
- free(direct_pci_head);
-
- return status;
+ return 0;
}
const char *boot_device,
const char *kernel_filename, const char *kernel_cmdline,
const char *initrd_filename,
- int pci_enabled, const char *cpu_model,
- const char *direct_pci)
+ int pci_enabled, const char *cpu_model)
{
char buf[1024];
int ret, linux_boot, i;
*/
if ( pci_enabled )
{
- rc = pt_init(pci_bus, direct_pci);
+ rc = pt_init(pci_bus);
if ( rc < 0 )
{
fprintf(logfile, "Error: Initialization failed for pass-through devices\n");
{
pc_init1(ram_size, vga_ram_size, boot_device,
kernel_filename, kernel_cmdline,
- initrd_filename, 1, cpu_model,
- direct_pci);
+ initrd_filename, 1, cpu_model);
}
static void pc_init_isa(ram_addr_t ram_size, int vga_ram_size,
{
pc_init1(ram_size, vga_ram_size, boot_device,
kernel_filename, kernel_cmdline,
- initrd_filename, 0, cpu_model,
- direct_pci);
+ initrd_filename, 0, cpu_model);
}
/* set CMOS shutdown status register (index 0xF) as S3_resume(0xFE)
qemu_irq *pic, int devfn_min, int nirq);
/* pass-through.c */
-int pt_init(PCIBus *e_bus, const char *direct_pci_opt);
+int pt_init(PCIBus *e_bus);
#endif
}
}
- if (strlen(direct_pci_str) > 0)
- direct_pci = direct_pci_str;
-
machine->init(ram_size, vga_ram_size, boot_devices,
kernel_filename, kernel_cmdline, initrd_filename, cpu_model,
direct_pci);
return already_computed;
}
-#define DIRECT_PCI_STR_LEN 512
#define PT_PCI_MSITRANSLATE_DEFAULT 1
#define PT_PCI_POWER_MANAGEMENT_DEFAULT 0
-char direct_pci_str[DIRECT_PCI_STR_LEN];
int direct_pci_msitranslate;
int direct_pci_power_mgmt;
void xenstore_parse_domain_config(int hvm_domid)
goto out;
num = atoi(params);
- for ( i = 0; i < num; i++ ) {
- if (pasprintf(&buf, "/local/domain/0/backend/pci/%u/%u/dev-%d",
- hvm_domid, pci_devid, i) != -1) {
- free(dev);
- dev = xs_read(xsh, XBT_NULL, buf, &len);
-
- if ( strlen(dev) + strlen(direct_pci_str) > DIRECT_PCI_STR_LEN - 1) {
- fprintf(stderr, "qemu: too many pci pass-through devices\n");
- memset(direct_pci_str, 0, DIRECT_PCI_STR_LEN);
- goto out;
- }
-
-
- /* append to direct_pci_str */
- if ( !dev )
- continue;
-
- strcat(direct_pci_str, dev);
-
- if (pasprintf(&buf, "/local/domain/0/backend/pci/%u/%u/vslot-%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);
- 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);
- }
-
- strcat(direct_pci_str, "-");
- }
- }
-
/* get the pci pass-through parameter */
if (pasprintf(&buf, "/local/domain/0/backend/pci/%u/%u/msitranslate",
hvm_domid, pci_devid) != -1)