diff mbox series

sun4u: remap ebus BAR0 to use unassigned_io_ops instead of alias to PCI IO space

Message ID 20240311064345.2531197-1-mark.cave-ayland@ilande.co.uk
State New
Headers show
Series sun4u: remap ebus BAR0 to use unassigned_io_ops instead of alias to PCI IO space | expand

Commit Message

Mark Cave-Ayland March 11, 2024, 6:43 a.m. UTC
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>
---

[MCA: I'd like to merge this for 9.0 since I've been carrying various local workarounds
to allow OpenBSD to boot on SPARC64 for some time.]

 hw/sparc64/sun4u.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

Comments

Philippe Mathieu-Daudé March 11, 2024, 8:28 a.m. UTC | #1
On 11/3/24 07:43, Mark Cave-Ayland wrote:
> 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>

> ---
> 
> [MCA: I'd like to merge this for 9.0 since I've been carrying various local workarounds
> to allow OpenBSD to boot on SPARC64 for some time.]

Sure.

>   hw/sparc64/sun4u.c | 9 +++++++--
>   1 file changed, 7 insertions(+), 2 deletions(-)
Philippe Mathieu-Daudé March 12, 2024, 8:17 a.m. UTC | #2
On 11/3/24 09:28, Philippe Mathieu-Daudé wrote:
> On 11/3/24 07:43, Mark Cave-Ayland wrote:
>> 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>
> 
>> ---
>>
>> [MCA: I'd like to merge this for 9.0 since I've been carrying various 
>> local workarounds
>> to allow OpenBSD to boot on SPARC64 for some time.]
> 
> Sure.

Patch queued!
diff mbox series

Patch

diff --git a/hw/sparc64/sun4u.c b/hw/sparc64/sun4u.c
index eda9b58a21..cff6d5abaf 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);