aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexandru Elisei <alexandru.elisei@arm.com>2020-04-14 15:39:44 +0100
committerWill Deacon <will@kernel.org>2020-04-15 16:27:59 +0100
commit5d6dd281f4d94e7ecdcda49cc1b40479029e07b9 (patch)
tree01d2fc963523811fbfe66cac2cc5953881edf97a
parent8f160708e68f4322cd698052d17ade8708d0982c (diff)
downloadkvmtool-5d6dd281f4d94e7ecdcda49cc1b40479029e07b9.tar.gz
hw/vesa: Don't ignore fatal errors
Failling an mmap call or creating a memslot means that device emulation will not work, don't ignore it. Reviewed-by: Andre Przywara <andre.przywara@arm.com> Signed-off-by: Alexandru Elisei <alexandru.elisei@arm.com> Signed-off-by: Will Deacon <will@kernel.org>
-rw-r--r--hw/vesa.c28
1 files changed, 20 insertions, 8 deletions
diff --git a/hw/vesa.c b/hw/vesa.c
index 5646a5af..ad09373e 100644
--- a/hw/vesa.c
+++ b/hw/vesa.c
@@ -63,22 +63,25 @@ struct framebuffer *vesa__init(struct kvm *kvm)
if (!kvm->cfg.vnc && !kvm->cfg.sdl && !kvm->cfg.gtk)
return NULL;
- r = pci_get_io_port_block(PCI_IO_SIZE);
- r = ioport__register(kvm, r, &vesa_io_ops, PCI_IO_SIZE, NULL);
+ vesa_base_addr = pci_get_io_port_block(PCI_IO_SIZE);
+ r = ioport__register(kvm, vesa_base_addr, &vesa_io_ops, PCI_IO_SIZE, NULL);
if (r < 0)
- return ERR_PTR(r);
+ goto out_error;
- vesa_base_addr = (u16)r;
vesa_pci_device.bar[0] = cpu_to_le32(vesa_base_addr | PCI_BASE_ADDRESS_SPACE_IO);
r = device__register(&vesa_device);
if (r < 0)
- return ERR_PTR(r);
+ goto unregister_ioport;
mem = mmap(NULL, VESA_MEM_SIZE, PROT_RW, MAP_ANON_NORESERVE, -1, 0);
- if (mem == MAP_FAILED)
- return ERR_PTR(-errno);
+ if (mem == MAP_FAILED) {
+ r = -errno;
+ goto unregister_device;
+ }
- kvm__register_dev_mem(kvm, VESA_MEM_ADDR, VESA_MEM_SIZE, mem);
+ r = kvm__register_dev_mem(kvm, VESA_MEM_ADDR, VESA_MEM_SIZE, mem);
+ if (r < 0)
+ goto unmap_dev;
vesafb = (struct framebuffer) {
.width = VESA_WIDTH,
@@ -90,4 +93,13 @@ struct framebuffer *vesa__init(struct kvm *kvm)
.kvm = kvm,
};
return fb__register(&vesafb);
+
+unmap_dev:
+ munmap(mem, VESA_MEM_SIZE);
+unregister_device:
+ device__unregister(&vesa_device);
+unregister_ioport:
+ ioport__unregister(kvm, vesa_base_addr);
+out_error:
+ return ERR_PTR(r);
}