mirror of
https://github.com/xemu-project/xemu.git
synced 2024-11-24 03:59:52 +00:00
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);
|
||||
|
||||
/* reinitialize each config register to be emulated */
|
||||
rc = xen_pt_config_init(s);
|
||||
if (rc) {
|
||||
XEN_PT_ERR(d, "PCI Config space initialisation failed.\n");
|
||||
xen_pt_config_init(s, &err);
|
||||
if (err) {
|
||||
error_append_hint(&err, "PCI Config space initialisation failed");
|
||||
error_report_err(err);
|
||||
rc = -1;
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
|
@ -230,7 +230,7 @@ struct XenPCIPassthroughState {
|
||||
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);
|
||||
XenPTRegGroup *xen_pt_find_reg_grp(XenPCIPassthroughState *s, 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;
|
||||
}
|
||||
|
||||
static int xen_pt_config_reg_init(XenPCIPassthroughState *s,
|
||||
XenPTRegGroup *reg_grp, XenPTRegInfo *reg)
|
||||
static void xen_pt_config_reg_init(XenPCIPassthroughState *s,
|
||||
XenPTRegGroup *reg_grp, XenPTRegInfo *reg,
|
||||
Error **errp)
|
||||
{
|
||||
XenPTReg *reg_entry;
|
||||
uint32_t data = 0;
|
||||
@ -1907,12 +1908,13 @@ static int xen_pt_config_reg_init(XenPCIPassthroughState *s,
|
||||
reg_grp->base_offset + reg->offset, &data);
|
||||
if (rc < 0) {
|
||||
g_free(reg_entry);
|
||||
return rc;
|
||||
error_setg(errp, "Init emulate register fail");
|
||||
return;
|
||||
}
|
||||
if (data == XEN_PT_INVALID_REG) {
|
||||
/* free unused BAR register entry */
|
||||
g_free(reg_entry);
|
||||
return 0;
|
||||
return;
|
||||
}
|
||||
/* Sync up the data to dev.config */
|
||||
offset = reg_grp->base_offset + reg->offset;
|
||||
@ -1930,7 +1932,8 @@ static int xen_pt_config_reg_init(XenPCIPassthroughState *s,
|
||||
if (rc) {
|
||||
/* Serious issues when we cannot read the host values! */
|
||||
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
|
||||
* 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;
|
||||
|
||||
if (val & ~size_mask) {
|
||||
XEN_PT_ERR(&s->dev,"Offset 0x%04x:0x%04x expands past register size(%d)!\n",
|
||||
offset, val, reg->size);
|
||||
error_setg(errp, "Offset 0x%04x:0x%04x expands past"
|
||||
" register size (%d)", offset, val, reg->size);
|
||||
g_free(reg_entry);
|
||||
return -ENXIO;
|
||||
return;
|
||||
}
|
||||
/* 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
|
||||
@ -1978,13 +1981,12 @@ static int xen_pt_config_reg_init(XenPCIPassthroughState *s,
|
||||
}
|
||||
/* list add register entry */
|
||||
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;
|
||||
Error *err = NULL;
|
||||
|
||||
QLIST_INIT(&s->reg_grps);
|
||||
|
||||
@ -2027,11 +2029,12 @@ int xen_pt_config_init(XenPCIPassthroughState *s)
|
||||
reg_grp_offset,
|
||||
®_grp_entry->size);
|
||||
if (rc < 0) {
|
||||
XEN_PT_LOG(&s->dev, "Failed to initialize %d/%ld, type=0x%x, rc:%d\n",
|
||||
i, ARRAY_SIZE(xen_pt_emu_reg_grps),
|
||||
error_setg(&err, "Failed to initialize %d/%zu, type = 0x%x,"
|
||||
" rc: %d", i, ARRAY_SIZE(xen_pt_emu_reg_grps),
|
||||
xen_pt_emu_reg_grps[i].grp_type, rc);
|
||||
error_propagate(errp, err);
|
||||
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) {
|
||||
int j = 0;
|
||||
XenPTRegInfo *regs = xen_pt_emu_reg_grps[i].emu_regs;
|
||||
|
||||
/* initialize capability register */
|
||||
for (j = 0; regs->size != 0; j++, regs++) {
|
||||
/* initialize capability register */
|
||||
rc = xen_pt_config_reg_init(s, reg_grp_entry, regs);
|
||||
if (rc < 0) {
|
||||
XEN_PT_LOG(&s->dev, "Failed to initialize %d/%ld reg 0x%x in grp_type=0x%x (%d/%ld), rc=%d\n",
|
||||
j, ARRAY_SIZE(xen_pt_emu_reg_grps[i].emu_regs),
|
||||
regs->offset, xen_pt_emu_reg_grps[i].grp_type,
|
||||
i, ARRAY_SIZE(xen_pt_emu_reg_grps), rc);
|
||||
xen_pt_config_reg_init(s, reg_grp_entry, regs, &err);
|
||||
if (err) {
|
||||
error_append_hint(&err, "Failed to initialize %d/%zu"
|
||||
" reg 0x%x in grp_type = 0x%x (%d/%zu)",
|
||||
j, ARRAY_SIZE(xen_pt_emu_reg_grps[i].emu_regs),
|
||||
regs->offset, xen_pt_emu_reg_grps[i].grp_type,
|
||||
i, ARRAY_SIZE(xen_pt_emu_reg_grps));
|
||||
error_propagate(errp, err);
|
||||
xen_pt_config_delete(s);
|
||||
return rc;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* delete all emulate register */
|
||||
|
Loading…
Reference in New Issue
Block a user