mirror of https://github.com/xemu-project/xemu.git
Add Error **errp for xen_pt_config_init()
To catch the error message. Also modify the caller Signed-off-by: Cao jin <caoj.fnst@cn.fujitsu.com> Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
This commit is contained in:
parent
5226bb59f7
commit
d50a6e58e8
|
@ -825,9 +825,11 @@ static int xen_pt_initfn(PCIDevice *d)
|
||||||
xen_pt_register_regions(s, &cmd);
|
xen_pt_register_regions(s, &cmd);
|
||||||
|
|
||||||
/* reinitialize each config register to be emulated */
|
/* reinitialize each config register to be emulated */
|
||||||
rc = xen_pt_config_init(s);
|
xen_pt_config_init(s, &err);
|
||||||
if (rc) {
|
if (err) {
|
||||||
XEN_PT_ERR(d, "PCI Config space initialisation failed.\n");
|
error_append_hint(&err, "PCI Config space initialisation failed");
|
||||||
|
error_report_err(err);
|
||||||
|
rc = -1;
|
||||||
goto err_out;
|
goto err_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -230,7 +230,7 @@ struct XenPCIPassthroughState {
|
||||||
bool listener_set;
|
bool listener_set;
|
||||||
};
|
};
|
||||||
|
|
||||||
int xen_pt_config_init(XenPCIPassthroughState *s);
|
void xen_pt_config_init(XenPCIPassthroughState *s, Error **errp);
|
||||||
void xen_pt_config_delete(XenPCIPassthroughState *s);
|
void xen_pt_config_delete(XenPCIPassthroughState *s);
|
||||||
XenPTRegGroup *xen_pt_find_reg_grp(XenPCIPassthroughState *s, uint32_t address);
|
XenPTRegGroup *xen_pt_find_reg_grp(XenPCIPassthroughState *s, uint32_t address);
|
||||||
XenPTReg *xen_pt_find_reg(XenPTRegGroup *reg_grp, uint32_t address);
|
XenPTReg *xen_pt_find_reg(XenPTRegGroup *reg_grp, uint32_t address);
|
||||||
|
|
|
@ -1887,8 +1887,9 @@ static uint8_t find_cap_offset(XenPCIPassthroughState *s, uint8_t cap)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int xen_pt_config_reg_init(XenPCIPassthroughState *s,
|
static void xen_pt_config_reg_init(XenPCIPassthroughState *s,
|
||||||
XenPTRegGroup *reg_grp, XenPTRegInfo *reg)
|
XenPTRegGroup *reg_grp, XenPTRegInfo *reg,
|
||||||
|
Error **errp)
|
||||||
{
|
{
|
||||||
XenPTReg *reg_entry;
|
XenPTReg *reg_entry;
|
||||||
uint32_t data = 0;
|
uint32_t data = 0;
|
||||||
|
@ -1907,12 +1908,13 @@ static int xen_pt_config_reg_init(XenPCIPassthroughState *s,
|
||||||
reg_grp->base_offset + reg->offset, &data);
|
reg_grp->base_offset + reg->offset, &data);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
g_free(reg_entry);
|
g_free(reg_entry);
|
||||||
return rc;
|
error_setg(errp, "Init emulate register fail");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
if (data == XEN_PT_INVALID_REG) {
|
if (data == XEN_PT_INVALID_REG) {
|
||||||
/* free unused BAR register entry */
|
/* free unused BAR register entry */
|
||||||
g_free(reg_entry);
|
g_free(reg_entry);
|
||||||
return 0;
|
return;
|
||||||
}
|
}
|
||||||
/* Sync up the data to dev.config */
|
/* Sync up the data to dev.config */
|
||||||
offset = reg_grp->base_offset + reg->offset;
|
offset = reg_grp->base_offset + reg->offset;
|
||||||
|
@ -1930,7 +1932,8 @@ static int xen_pt_config_reg_init(XenPCIPassthroughState *s,
|
||||||
if (rc) {
|
if (rc) {
|
||||||
/* Serious issues when we cannot read the host values! */
|
/* Serious issues when we cannot read the host values! */
|
||||||
g_free(reg_entry);
|
g_free(reg_entry);
|
||||||
return rc;
|
error_setg(errp, "Cannot read host values");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
/* Set bits in emu_mask are the ones we emulate. The dev.config shall
|
/* Set bits in emu_mask are the ones we emulate. The dev.config shall
|
||||||
* contain the emulated view of the guest - therefore we flip the mask
|
* contain the emulated view of the guest - therefore we flip the mask
|
||||||
|
@ -1955,10 +1958,10 @@ static int xen_pt_config_reg_init(XenPCIPassthroughState *s,
|
||||||
val = data;
|
val = data;
|
||||||
|
|
||||||
if (val & ~size_mask) {
|
if (val & ~size_mask) {
|
||||||
XEN_PT_ERR(&s->dev,"Offset 0x%04x:0x%04x expands past register size(%d)!\n",
|
error_setg(errp, "Offset 0x%04x:0x%04x expands past"
|
||||||
offset, val, reg->size);
|
" register size (%d)", offset, val, reg->size);
|
||||||
g_free(reg_entry);
|
g_free(reg_entry);
|
||||||
return -ENXIO;
|
return;
|
||||||
}
|
}
|
||||||
/* This could be just pci_set_long as we don't modify the bits
|
/* This could be just pci_set_long as we don't modify the bits
|
||||||
* past reg->size, but in case this routine is run in parallel or the
|
* past reg->size, but in case this routine is run in parallel or the
|
||||||
|
@ -1978,13 +1981,12 @@ static int xen_pt_config_reg_init(XenPCIPassthroughState *s,
|
||||||
}
|
}
|
||||||
/* list add register entry */
|
/* list add register entry */
|
||||||
QLIST_INSERT_HEAD(®_grp->reg_tbl_list, reg_entry, entries);
|
QLIST_INSERT_HEAD(®_grp->reg_tbl_list, reg_entry, entries);
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int xen_pt_config_init(XenPCIPassthroughState *s)
|
void xen_pt_config_init(XenPCIPassthroughState *s, Error **errp)
|
||||||
{
|
{
|
||||||
int i, rc;
|
int i, rc;
|
||||||
|
Error *err = NULL;
|
||||||
|
|
||||||
QLIST_INIT(&s->reg_grps);
|
QLIST_INIT(&s->reg_grps);
|
||||||
|
|
||||||
|
@ -2027,11 +2029,12 @@ int xen_pt_config_init(XenPCIPassthroughState *s)
|
||||||
reg_grp_offset,
|
reg_grp_offset,
|
||||||
®_grp_entry->size);
|
®_grp_entry->size);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
XEN_PT_LOG(&s->dev, "Failed to initialize %d/%ld, type=0x%x, rc:%d\n",
|
error_setg(&err, "Failed to initialize %d/%zu, type = 0x%x,"
|
||||||
i, ARRAY_SIZE(xen_pt_emu_reg_grps),
|
" rc: %d", i, ARRAY_SIZE(xen_pt_emu_reg_grps),
|
||||||
xen_pt_emu_reg_grps[i].grp_type, rc);
|
xen_pt_emu_reg_grps[i].grp_type, rc);
|
||||||
|
error_propagate(errp, err);
|
||||||
xen_pt_config_delete(s);
|
xen_pt_config_delete(s);
|
||||||
return rc;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2039,24 +2042,24 @@ int xen_pt_config_init(XenPCIPassthroughState *s)
|
||||||
if (xen_pt_emu_reg_grps[i].emu_regs) {
|
if (xen_pt_emu_reg_grps[i].emu_regs) {
|
||||||
int j = 0;
|
int j = 0;
|
||||||
XenPTRegInfo *regs = xen_pt_emu_reg_grps[i].emu_regs;
|
XenPTRegInfo *regs = xen_pt_emu_reg_grps[i].emu_regs;
|
||||||
|
|
||||||
/* initialize capability register */
|
/* initialize capability register */
|
||||||
for (j = 0; regs->size != 0; j++, regs++) {
|
for (j = 0; regs->size != 0; j++, regs++) {
|
||||||
/* initialize capability register */
|
xen_pt_config_reg_init(s, reg_grp_entry, regs, &err);
|
||||||
rc = xen_pt_config_reg_init(s, reg_grp_entry, regs);
|
if (err) {
|
||||||
if (rc < 0) {
|
error_append_hint(&err, "Failed to initialize %d/%zu"
|
||||||
XEN_PT_LOG(&s->dev, "Failed to initialize %d/%ld reg 0x%x in grp_type=0x%x (%d/%ld), rc=%d\n",
|
" reg 0x%x in grp_type = 0x%x (%d/%zu)",
|
||||||
j, ARRAY_SIZE(xen_pt_emu_reg_grps[i].emu_regs),
|
j, ARRAY_SIZE(xen_pt_emu_reg_grps[i].emu_regs),
|
||||||
regs->offset, xen_pt_emu_reg_grps[i].grp_type,
|
regs->offset, xen_pt_emu_reg_grps[i].grp_type,
|
||||||
i, ARRAY_SIZE(xen_pt_emu_reg_grps), rc);
|
i, ARRAY_SIZE(xen_pt_emu_reg_grps));
|
||||||
|
error_propagate(errp, err);
|
||||||
xen_pt_config_delete(s);
|
xen_pt_config_delete(s);
|
||||||
return rc;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* delete all emulate register */
|
/* delete all emulate register */
|
||||||
|
|
Loading…
Reference in New Issue