aboutsummaryrefslogtreecommitdiff
path: root/hw/sparc64
diff options
context:
space:
mode:
authorMark Cave-Ayland <mark.cave-ayland@ilande.co.uk>2024-03-11 06:43:45 +0000
committerPhilippe Mathieu-Daudé <philmd@linaro.org>2024-03-11 22:10:18 +0100
commitc1c73b31d941220392ead0ea5ab6966943cb1b55 (patch)
tree8b6e65e1a7db5d9bb0c90452f2e49abd54bcddc0 /hw/sparc64
parentb691b250d3860f007799b1b427689c707b796bba (diff)
downloadqemu-c1c73b31d941220392ead0ea5ab6966943cb1b55.zip
qemu-c1c73b31d941220392ead0ea5ab6966943cb1b55.tar.gz
qemu-c1c73b31d941220392ead0ea5ab6966943cb1b55.tar.bz2
sun4u: remap ebus BAR0 to use unassigned_io_ops instead of alias to PCI IO space
During kernel startup OpenBSD accesses addresses mapped by BAR0 of the ebus device but at offsets where no IO devices exist. Before commit 4aa07e8649 ("hw/sparc64/ebus: Access memory regions via pci_address_space_io()") BAR0 was mapped to legacy IO space which allows accesses to unmapped devices to succeed, but afterwards these accesses to unmapped PCI IO space cause a memory fault which prevents OpenBSD from booting. Since no devices are mapped at the addresses accessed by OpenBSD, change ebus BAR0 from a PCI IO space alias to an IO memory region using unassigned_io_ops which allows these accesses to succeed and so allows OpenBSD to boot once again. Fixes: 4aa07e8649 ("hw/sparc64/ebus: Access memory regions via pci_address_space_io()") Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Message-ID: <20240311064345.2531197-1-mark.cave-ayland@ilande.co.uk> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Diffstat (limited to 'hw/sparc64')
-rw-r--r--hw/sparc64/sun4u.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/hw/sparc64/sun4u.c b/hw/sparc64/sun4u.c
index eda9b58..cff6d5a 100644
--- a/hw/sparc64/sun4u.c
+++ b/hw/sparc64/sun4u.c
@@ -360,8 +360,13 @@ static void ebus_realize(PCIDevice *pci_dev, Error **errp)
pci_dev->config[0x09] = 0x00; // programming i/f
pci_dev->config[0x0D] = 0x0a; // latency_timer
- memory_region_init_alias(&s->bar0, OBJECT(s), "bar0",
- pci_address_space_io(pci_dev), 0, 0x1000000);
+ /*
+ * BAR0 is accessed by OpenBSD but not for ebus device access: allow any
+ * memory access to this region to succeed which allows the OpenBSD kernel
+ * to boot.
+ */
+ memory_region_init_io(&s->bar0, OBJECT(s), &unassigned_io_ops, s,
+ "bar0", 0x1000000);
pci_register_bar(pci_dev, 0, PCI_BASE_ADDRESS_SPACE_MEMORY, &s->bar0);
memory_region_init_alias(&s->bar1, OBJECT(s), "bar1",
pci_address_space_io(pci_dev), 0, 0x8000);