[prev in list] [next in list] [prev in thread] [next in thread] 

List:       openbsd-arm
Subject:    Re: OpenBSD 7.4+ does not boot on qemu/sbsa-ref with Neoverse-V1/N2 or max cpu core
From:       Jonathan Gray <jsg () jsg ! id ! au>
Date:       2024-03-15 12:06:31
Message-ID: ZfQ5x3kxr-rYMHKp () largo ! jsg ! id ! au
[Download RAW message or body]

On Fri, Mar 15, 2024 at 11:29:28AM +0100, Marcin Juszkiewicz via arm wrote:
> W dniu 15.03.2024 o 03:30, Jonathan Gray pisze:
> > > OpenBSD 7.3 boots fine on all core types. OpenBSD 7.4 fails on
> > > Neoverse-V1/N2/max. Same situation with today's 7.5-current snapshot.
> > > 
> > > To track the problem I opened a bug against QEMU [1] to have all
> > > information in one place.
> > > 
> > > 1.https://gitlab.com/qemu-project/qemu/-/issues/2224
> > > 
> > > If I use older cores (like Neoverse-N1 which is default for sbsa-ref)
> > > then installer boots fine:
> 
> > I see the same with sbsa-ref using qemu 8.2.1 and the edk2
> > firmware you reference in the qemu issue.
> 
> What made me wonder is that it feels like error on OpenBSD side.
> 7.3 release boots, 7.4 and later do not.

I tracked it down to PAC.

https://github.com/openbsd/src/commit/4171e492c627a295b38565e1f04e0b7ba62913f8

If I disable it, qemu sbsa-ref with cpu max boots.

diff --git sys/arch/arm64/arm64/cpu.c sys/arch/arm64/arm64/cpu.c
index b11bf3699ac..1fa647ff6b5 100644
--- sys/arch/arm64/arm64/cpu.c
+++ sys/arch/arm64/arm64/cpu.c
@@ -970,24 +970,29 @@ cpu_attach(struct device *parent, struct device *dev, void *aux)
 		/*
 		 * Lenovo X13s ships with broken EL2 firmware that
 		 * hangs the machine if we enable PAuth.
 		 */
 		if (hw_vendor && hw_prod && strcmp(hw_vendor, "LENOVO") == 0) {
 			if (strncmp(hw_prod, "21BX", 4) == 0 ||
 			    strncmp(hw_prod, "21BY", 4) == 0) {
 				cpu_id_aa64isar1 &= ~ID_AA64ISAR1_APA_MASK;
 				cpu_id_aa64isar1 &= ~ID_AA64ISAR1_GPA_MASK;
 			}
 		}
 
+		if (hw_vendor && strcmp(hw_vendor, "QEMU") == 0) {
+			cpu_id_aa64isar1 &= ~ID_AA64ISAR1_APA_MASK;
+			cpu_id_aa64isar1 &= ~ID_AA64ISAR1_GPA_MASK;
+		}
+
 		cpu_identify(ci);
 
 		if (OF_getproplen(ci->ci_node, "clocks") > 0) {
 			cpu_node = ci->ci_node;
 			cpu_cpuspeed = cpu_clockspeed;
 		}
 
 		cpu_init();
 #ifdef MULTIPROCESSOR
 	}
 #endif
 

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic