Re: My ARM64 boot just broke (undefined instruction)

From: John F Carr <jfc_at_mit.edu>
Date: Thu, 02 Feb 2023 15:57:07 UTC

> On Feb 2, 2023, at 05:13, Martin Cracauer <cracauer@cons.org> wrote:
> 
> I am getting a new boot panic on 14-current.
> 
> Platform:
> - Apple Mac M1 mini
> - QEMU 7.2.0 to arm64
> - Last working kernel: Jan 25 main-n260242-f5924ad8fde4
> - kern config GENERIC-NODEBUG
> 
> [...]
> generic_timer0: <ARM Generic Timer> irq 34,35,36 on acpi0
> Undefined instruction: d53be228

That opcode disassembles to
  mrs    x8, CNTP_CTL_EL0
The instruction is in function get_ctrl in sys/arm/arm/generic_timer.c.

Three possibilities:

1. Apple didn't implement the CNTP_CTL_EL0 register to spec.
2. qemu does not handle privileged access properly.
3. There is something non-obvious wrong with the change below.  Copying its author Andrew Turner.  You could try reverting it.

commit c57694ce94712ce1fe0341ae51d70446a7dbbfa2
Author: Andrew Turner <andrew@FreeBSD.org>
Date:   Sat Jan 28 17:36:24 2023 +0000

    Disable the arm physical timer when an irq exists
         Some firmware leaves the timers enabled. Ensure they are disabled if
    there are any physical timer interrupt resources to ensure we don't
    receive any unexpected interrupts from them.

diff --git a/sys/arm/arm/generic_timer.c b/sys/arm/arm/generic_timer.c
index 2527af9b9068..0556643032c2 100644
--- a/sys/arm/arm/generic_timer.c
+++ b/sys/arm/arm/generic_timer.c
@@ -521,7 +521,8 @@ arm_tmr_attach(device_t dev)
        if (sc->res[GT_VIRT] != NULL)
                arm_tmr_disable(false);
        /* And the physical */
-       if (sc->physical)
+       if (sc->res[GT_PHYS_SECURE] != NULL ||
+           sc->res[GT_PHYS_NONSECURE] != NULL)
                arm_tmr_disable(true);