[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 11/16] pci-assign: propagate errors from assigned_de
From: |
Laszlo Ersek |
Subject: |
[Qemu-devel] [PATCH 11/16] pci-assign: propagate errors from assigned_device_pci_cap_init() |
Date: |
Thu, 10 Apr 2014 10:24:40 +0200 |
Signed-off-by: Laszlo Ersek <address@hidden>
---
hw/i386/kvm/pci-assign.c | 45 +++++++++++++++++++--------------------------
1 file changed, 19 insertions(+), 26 deletions(-)
diff --git a/hw/i386/kvm/pci-assign.c b/hw/i386/kvm/pci-assign.c
index c6d1094..2de6559 100644
--- a/hw/i386/kvm/pci-assign.c
+++ b/hw/i386/kvm/pci-assign.c
@@ -1235,11 +1235,11 @@ static void assigned_dev_setup_cap_read(AssignedDevice
*dev, uint32_t offset,
{
assigned_dev_direct_config_read(dev, offset, len);
assigned_dev_emulate_config_read(dev, offset + PCI_CAP_LIST_NEXT, 1);
}
-static int assigned_device_pci_cap_init(PCIDevice *pci_dev)
+static int assigned_device_pci_cap_init(PCIDevice *pci_dev, Error **errp)
{
AssignedDevice *dev = DO_UPCAST(AssignedDevice, dev, pci_dev);
PCIRegion *pci_region = dev->real_device.regions;
int ret, pos;
Error *local_err = NULL;
@@ -1254,21 +1254,19 @@ static int assigned_device_pci_cap_init(PCIDevice
*pci_dev)
* MSI capability is the 1st capability in capability config */
pos = pci_find_cap_offset(pci_dev, PCI_CAP_ID_MSI, 0);
if (pos != 0 && kvm_check_extension(kvm_state, KVM_CAP_ASSIGN_DEV_IRQ)) {
verify_irqchip_in_kernel(&local_err);
if (local_err) {
- error_report("%s", error_get_pretty(local_err));
- error_free(local_err);
+ error_propagate(errp, local_err);
return -ENOTSUP;
}
dev->cap.available |= ASSIGNED_DEVICE_CAP_MSI;
/* Only 32-bit/no-mask currently supported */
ret = pci_add_capability2(pci_dev, PCI_CAP_ID_MSI, pos, 10,
&local_err);
if (ret < 0) {
- error_report("%s", error_get_pretty(local_err));
- error_free(local_err);
+ error_propagate(errp, local_err);
return ret;
}
pci_dev->msi_cap = pos;
pci_set_word(pci_dev->config + pos + PCI_MSI_FLAGS,
@@ -1289,20 +1287,18 @@ static int assigned_device_pci_cap_init(PCIDevice
*pci_dev)
int bar_nr;
uint32_t msix_table_entry;
verify_irqchip_in_kernel(&local_err);
if (local_err) {
- error_report("%s", error_get_pretty(local_err));
- error_free(local_err);
+ error_propagate(errp, local_err);
return -ENOTSUP;
}
dev->cap.available |= ASSIGNED_DEVICE_CAP_MSIX;
ret = pci_add_capability2(pci_dev, PCI_CAP_ID_MSIX, pos, 12,
&local_err);
if (ret < 0) {
- error_report("%s", error_get_pretty(local_err));
- error_free(local_err);
+ error_propagate(errp, local_err);
return ret;
}
pci_dev->msix_cap = pos;
pci_set_word(pci_dev->config + pos + PCI_MSIX_FLAGS,
@@ -1328,12 +1324,11 @@ static int assigned_device_pci_cap_init(PCIDevice
*pci_dev)
uint16_t pmc;
ret = pci_add_capability2(pci_dev, PCI_CAP_ID_PM, pos, PCI_PM_SIZEOF,
&local_err);
if (ret < 0) {
- error_report("%s", error_get_pretty(local_err));
- error_free(local_err);
+ error_propagate(errp, local_err);
return ret;
}
assigned_dev_setup_cap_read(dev, pos, PCI_PM_SIZEOF);
@@ -1367,12 +1362,12 @@ static int assigned_device_pci_cap_init(PCIDevice
*pci_dev)
* PCIe v3.0 spec that regs should exist and be read as 0,
* not optionally provided and shorten the struct size.
*/
size = MIN(0x3c, PCI_CONFIG_SPACE_SIZE - pos);
if (size < 0x34) {
- error_report("%s: Invalid size PCIe cap-id 0x%x",
- __func__, PCI_CAP_ID_EXP);
+ error_setg(errp, "Invalid size PCIe cap-id 0x%x",
+ PCI_CAP_ID_EXP);
return -EINVAL;
} else if (size != 0x3c) {
error_report("WARNING, %s: PCIe cap-id 0x%x has "
"non-standard size 0x%x; std size should be 0x3c",
__func__, PCI_CAP_ID_EXP, size);
@@ -1389,31 +1384,30 @@ static int assigned_device_pci_cap_init(PCIDevice
*pci_dev)
size = 0x3c;
}
}
if (size == 0) {
- error_report("%s: Unsupported PCI express capability version %d",
- __func__, version);
+ error_setg(errp, "Unsupported PCI express capability version %d",
+ version);
return -EINVAL;
}
ret = pci_add_capability2(pci_dev, PCI_CAP_ID_EXP, pos, size,
&local_err);
if (ret < 0) {
- error_report("%s", error_get_pretty(local_err));
- error_free(local_err);
+ error_propagate(errp, local_err);
return ret;
}
assigned_dev_setup_cap_read(dev, pos, size);
type = pci_get_word(pci_dev->config + pos + PCI_EXP_FLAGS);
type = (type & PCI_EXP_FLAGS_TYPE) >> 4;
if (type != PCI_EXP_TYPE_ENDPOINT &&
type != PCI_EXP_TYPE_LEG_END && type != PCI_EXP_TYPE_RC_END) {
- error_report("Device assignment only supports endpoint assignment,"
- " device type %d", type);
+ error_setg(errp, "Device assignment only supports endpoint "
+ "assignment, device type %d", type);
return -EINVAL;
}
/* capabilities, pass existing read-only copy
* PCI_EXP_FLAGS_IRQ: updated by hardware, should be direct read */
@@ -1474,12 +1468,11 @@ static int assigned_device_pci_cap_init(PCIDevice
*pci_dev)
/* Only expose the minimum, 8 byte capability */
ret = pci_add_capability2(pci_dev, PCI_CAP_ID_PCIX, pos, 8,
&local_err);
if (ret < 0) {
- error_report("%s", error_get_pretty(local_err));
- error_free(local_err);
+ error_propagate(errp, local_err);
return ret;
}
assigned_dev_setup_cap_read(dev, pos, 8);
@@ -1503,12 +1496,11 @@ static int assigned_device_pci_cap_init(PCIDevice
*pci_dev)
if (pos) {
/* Direct R/W passthrough */
ret = pci_add_capability2(pci_dev, PCI_CAP_ID_VPD, pos, 8,
&local_err);
if (ret < 0) {
- error_report("%s", error_get_pretty(local_err));
- error_free(local_err);
+ error_propagate(errp, local_err);
return ret;
}
assigned_dev_setup_cap_read(dev, pos, 8);
@@ -1522,12 +1514,11 @@ static int assigned_device_pci_cap_init(PCIDevice
*pci_dev)
uint8_t len = pci_get_byte(pci_dev->config + pos + PCI_CAP_FLAGS);
/* Direct R/W passthrough */
ret = pci_add_capability2(pci_dev, PCI_CAP_ID_VNDR, pos, len,
&local_err);
if (ret < 0) {
- error_report("%s", error_get_pretty(local_err));
- error_free(local_err);
+ error_propagate(errp, local_err);
return ret;
}
assigned_dev_setup_cap_read(dev, pos, len);
@@ -1787,11 +1778,13 @@ static int assigned_initfn(struct PCIDevice *pci_dev)
qerror_report_err(local_err);
error_free(local_err);
goto out;
}
- if (assigned_device_pci_cap_init(pci_dev) < 0) {
+ if (assigned_device_pci_cap_init(pci_dev, &local_err) < 0) {
+ qerror_report_err(local_err);
+ error_free(local_err);
goto out;
}
/* intercept MSI-X entry page in the MMIO */
if (dev->cap.available & ASSIGNED_DEVICE_CAP_MSIX) {
--
1.8.3.1
- Re: [Qemu-devel] [PATCH 10/16] pci-assign: propagate errors from get_real_device(), (continued)
- [Qemu-devel] [PATCH 05/16] pci-assign: propagate errors from get_real_id(), Laszlo Ersek, 2014/04/10
- [Qemu-devel] [PATCH 11/16] pci-assign: propagate errors from assigned_device_pci_cap_init(),
Laszlo Ersek <=
- [Qemu-devel] [PATCH 13/16] pci-assign: propagate errors from assigned_dev_register_regions(), Laszlo Ersek, 2014/04/10
- [Qemu-devel] [PATCH 14/16] pci-assign: propagate errors from assign_device(), Laszlo Ersek, 2014/04/10
- [Qemu-devel] [PATCH 15/16] pci-assign: propagate errors from assign_intx(), Laszlo Ersek, 2014/04/10
- [Qemu-devel] [PATCH 12/16] pci-assign: propagate errors from assigned_dev_register_msix_mmio(), Laszlo Ersek, 2014/04/10