mirror of https://gitee.com/openkylin/qemu.git
s390x/pci: fix reg_irqs()
In reg_irqs(), present code assumes that map_indicator() always issues successfully. Let's check it and return the error to caller in order to inform guest. Signed-off-by: Yi Min Zhao <zyimin@linux.vnet.ibm.com> Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com> Reviewed-by: Pierre Morel <pmorel@linux.vnet.ibm.com> Reviewed-by: Dong Jia Shi <bjsdjshi@linux.vnet.ibm.com> Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
This commit is contained in:
parent
3f6ec642ae
commit
bac45d5147
|
@ -634,8 +634,15 @@ static int reg_irqs(CPUS390XState *env, S390PCIBusDevice *pbdev, ZpciFib fib)
|
|||
len = BITS_TO_LONGS(FIB_DATA_NOI(ldl_p(&fib.data))) * sizeof(unsigned long);
|
||||
pbdev->indicator = get_indicator(ldq_p(&fib.aibv), len);
|
||||
|
||||
map_indicator(&pbdev->routes.adapter, pbdev->summary_ind);
|
||||
map_indicator(&pbdev->routes.adapter, pbdev->indicator);
|
||||
ret = map_indicator(&pbdev->routes.adapter, pbdev->summary_ind);
|
||||
if (ret) {
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = map_indicator(&pbdev->routes.adapter, pbdev->indicator);
|
||||
if (ret) {
|
||||
goto out;
|
||||
}
|
||||
|
||||
pbdev->routes.adapter.summary_addr = ldq_p(&fib.aisb);
|
||||
pbdev->routes.adapter.summary_offset = FIB_DATA_AISBO(ldl_p(&fib.data));
|
||||
|
@ -647,6 +654,12 @@ static int reg_irqs(CPUS390XState *env, S390PCIBusDevice *pbdev, ZpciFib fib)
|
|||
|
||||
DPRINTF("reg_irqs adapter id %d\n", pbdev->routes.adapter.adapter_id);
|
||||
return 0;
|
||||
out:
|
||||
release_indicator(&pbdev->routes.adapter, pbdev->summary_ind);
|
||||
release_indicator(&pbdev->routes.adapter, pbdev->indicator);
|
||||
pbdev->summary_ind = NULL;
|
||||
pbdev->indicator = NULL;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int dereg_irqs(S390PCIBusDevice *pbdev)
|
||||
|
|
Loading…
Reference in New Issue