X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fdevices%2Fpci.c;h=42e4c3a6e9511478b8950f804eb2fb225c29e2ec;hb=ef99d19f9ee3ff28d07f83c240a557938b3ab0d5;hp=acac19783dd8c8d49a4e7f413ef46119c4d11ab6;hpb=3938dc8f325981eab29bda77f43fa1be1d91c54f;p=palacios.git diff --git a/palacios/src/devices/pci.c b/palacios/src/devices/pci.c index acac197..42e4c3a 100644 --- a/palacios/src/devices/pci.c +++ b/palacios/src/devices/pci.c @@ -632,7 +632,7 @@ static int scan_pci_caps(struct pci_device * pci) { } -int v3_pci_enable_capability(struct pci_device * pci, pci_cap_type_t cap_type, int mask) { +int v3_pci_enable_capability(struct pci_device * pci, pci_cap_type_t cap_type) { uint32_t size = 0; struct pci_cap * tmp_cap = NULL; struct pci_cap * cap = NULL; @@ -697,18 +697,18 @@ int v3_pci_enable_capability(struct pci_device * pci, pci_cap_type_t cap_type, i size = 8; } - if (mask) { - V3_Print("Hooking capability range (offset=%d, size=%d)\n", cap->offset, size); - if (v3_pci_hook_config_range(pci, cap->offset, size + 2, - cap_write, NULL, cap) == -1) { - PrintError("Could not hook config range (start=%d, size=%d)\n", - cap->offset + 2, size); - return -1; - } + V3_Print("Hooking capability range (offset=%d, size=%d)\n", cap->offset, size); + + if (v3_pci_hook_config_range(pci, cap->offset, size + 2, + cap_write, NULL, cap) == -1) { + PrintError("Could not hook config range (start=%d, size=%d)\n", + cap->offset + 2, size); + return -1; } + // link it to the active capabilities list pci->config_space[cap->offset + 1] = pci->config_header.cap_ptr; pci->config_header.cap_ptr = cap->offset; // add to the head of the list @@ -1114,7 +1114,7 @@ static int pci_save(struct v3_chkpt_ctx * ctx, void * private_data) { struct pci_device * dev = NULL; struct v3_chkpt_ctx * bus_ctx = NULL; - snprintf(buf, 128, "pci-%d\n", i); + snprintf(buf, 128, "pci-%d", i); bus_ctx = v3_chkpt_open_ctx(ctx->chkpt, ctx, buf); @@ -1156,7 +1156,7 @@ static int pci_load(struct v3_chkpt_ctx * ctx, void * private_data) { struct pci_device * dev = NULL; struct v3_chkpt_ctx * bus_ctx = NULL; - snprintf(buf, 128, "pci-%d\n", i); + snprintf(buf, 128, "pci-%d", i); bus_ctx = v3_chkpt_open_ctx(ctx->chkpt, ctx, buf); @@ -1202,6 +1202,12 @@ static struct v3_device_ops dev_ops = { static int pci_init(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) { struct pci_internal * pci_state = V3_Malloc(sizeof(struct pci_internal)); + + if (!pci_state) { + PrintError("Cannot allocate in init\n"); + return -1; + } + int i = 0; char * dev_id = v3_cfg_val(cfg, "ID"); int ret = 0; @@ -1396,6 +1402,8 @@ int v3_pci_raise_acked_irq(struct vm_device * pci_bus, struct pci_device * dev, memset(&ipi, 0, sizeof(struct v3_gen_ipi)); + // decode MSI fields into IPI + ipi.vector = data->vector + vec.irq; ipi.mode = data->del_mode; ipi.logical = addr->dst_mode; @@ -1403,9 +1411,6 @@ int v3_pci_raise_acked_irq(struct vm_device * pci_bus, struct pci_device * dev, ipi.dst_shorthand = 0; ipi.dst = addr->dst_id; - // decode MSI fields into IPI - - V3_Print("Decode MSI\n"); v3_apic_send_ipi(dev->vm, &ipi, dev->apic_dev); @@ -1436,6 +1441,7 @@ int v3_pci_raise_acked_irq(struct vm_device * pci_bus, struct pci_device * dev, data = &(msix_table->entries[vec.irq].data); addr = &(msix_table->entries[vec.irq].addr);; + // decode MSIX fields into IPI ipi.vector = data->vector + vec.irq; ipi.mode = data->del_mode; ipi.logical = addr->dst_mode; @@ -1443,7 +1449,7 @@ int v3_pci_raise_acked_irq(struct vm_device * pci_bus, struct pci_device * dev, ipi.dst_shorthand = 0; ipi.dst = addr->dst_id; - // decode MSIX fields into IPI + V3_Print("Decode MSIX\n");