> Date: Sun, 12 Jan 2025 16:18:34 +0100
> From: Jeremie Courreges-Anglas <[email protected]>
> 
> Whenever I leave dpb run on this mac mini m2 pro, I get the following
> crash.  Typed by hand, the machine is still in ddb(4) waiting for
> possibly useful commands.
> 
> SError: 20bf445228 esr be000000 far 20bf445228
> l2c_err_sts 0x80
> l2c_err_adr 0x3030002a3e59480
> l2c_err_inf 0x100000002
> panic: do_el0_error
> Stopped at    panic+0x140: cmp w21, #0x0
>     TID    PID     UID      PRFLAGS     PFLAGS  CPU  COMMAND
>   32448  95426      55    0x1000040          0    0  riscv64-unknown-elf-gcc
> *143274   3941      55    0x1000002          0    4  perl
>  452101  77879      55    0x1000002          0    9  c++
>  286721  39121      55    0x1000002          0    7  cc
>  457707  71634      55    0x1000002 0x40000000    1  rustc
>  477236  76220      55    0x1000002          0    8  c++
>  414461  56314      55    0x1000002          0    3  c++
>  503649  61351      55    0x3200002          0    6  python3.12
>  190805   3825      55    0x1000002 0x40000000    5  rustc
>   95219   4348      55    0x1000002 0x40000000    2  rustc
> db_enter() at panic+0x13c
> panic() at do_el0_error+0x18
> serror() at at handle_el0_error+0x70
> handle_el0_error() at 0x20bf445224
> end of kernel
> ...
> ddb{4}>

Can you try the attached diff?

If this works, I fear you'll get a "RTKit crashed:" message, hopefully
with some additional details.


Index: arch/arm64/arm64/pmap.c
===================================================================
RCS file: /cvs/src/sys/arch/arm64/arm64/pmap.c,v
diff -u -p -r1.110 pmap.c
--- arch/arm64/arm64/pmap.c     3 Feb 2025 17:59:40 -0000       1.110
+++ arch/arm64/arm64/pmap.c     10 Feb 2025 22:26:07 -0000
@@ -783,8 +783,14 @@ _pmap_kenter_pa(vaddr_t va, paddr_t pa, 
 void
 pmap_kenter_pa(vaddr_t va, paddr_t pa, vm_prot_t prot)
 {
-       _pmap_kenter_pa(va, pa, prot, prot,
-           (pa & PMAP_NOCACHE) ? PMAP_CACHE_CI : PMAP_CACHE_WB);
+       int cache = PMAP_CACHE_WB;
+
+       if (pa & PMAP_NOCACHE)
+               cache = PMAP_CACHE_CI;
+       if (pa & PMAP_DEVICE)
+               cache = PMAP_CACHE_DEV_NGNRNE;
+       
+       _pmap_kenter_pa(va, pa, prot, prot, cache);
 }
 
 void
Index: arch/arm64/dev/aplsmc.c
===================================================================
RCS file: /cvs/src/sys/arch/arm64/dev/aplsmc.c,v
diff -u -p -r1.28 aplsmc.c
--- arch/arm64/dev/aplsmc.c     4 Nov 2024 09:33:16 -0000       1.28
+++ arch/arm64/dev/aplsmc.c     10 Feb 2025 22:26:07 -0000
@@ -22,6 +22,8 @@
 #include <sys/sensors.h>
 #include <sys/signalvar.h>
 
+#include <uvm/uvm_extern.h>
+
 #include <machine/apmvar.h>
 #include <machine/bus.h>
 #include <machine/fdt.h>
@@ -124,6 +126,7 @@ struct aplsmc_softc {
        void                    *sc_ih;
 
        struct rtkit_state      *sc_rs;
+       struct rtkit            sc_rk;
        uint8_t                 sc_msgid;
        uint64_t                sc_data;
 
@@ -188,6 +191,7 @@ struct cfdriver aplsmc_cd = {
        NULL, "aplsmc", DV_DULL
 };
 
+paddr_t        aplsmc_logmap(void *, bus_addr_t);
 void   aplsmc_callback(void *, uint64_t);
 int    aplsmc_send_cmd(struct aplsmc_softc *, uint16_t, uint32_t, uint16_t);
 int    aplsmc_wait_cmd(struct aplsmc_softc *sc);
@@ -240,7 +244,11 @@ aplsmc_attach(struct device *parent, str
                return;
        }
 
-       sc->sc_rs = rtkit_init(faa->fa_node, NULL, RK_WAKEUP, NULL);
+       sc->sc_rk.rk_cookie = sc;
+       sc->sc_rk.rk_dmat = faa->fa_dmat;
+       sc->sc_rk.rk_logmap = aplsmc_logmap;
+
+       sc->sc_rs = rtkit_init(faa->fa_node, NULL, RK_WAKEUP, &sc->sc_rk);
        if (sc->sc_rs == NULL) {
                printf(": can't map mailbox channel\n");
                return;
@@ -381,6 +389,12 @@ aplsmc_activate(struct device *self, int
 #endif
 
        return 0;
+}
+
+paddr_t
+aplsmc_logmap(void *cookie, bus_addr_t addr)
+{
+       return addr | PMAP_DEVICE;
 }
 
 void
Index: arch/arm64/dev/rtkit.c
===================================================================
RCS file: /cvs/src/sys/arch/arm64/dev/rtkit.c,v
diff -u -p -r1.17 rtkit.c
--- arch/arm64/dev/rtkit.c      29 Oct 2024 21:19:25 -0000      1.17
+++ arch/arm64/dev/rtkit.c      10 Feb 2025 22:26:07 -0000
@@ -468,7 +468,7 @@ rtkit_handle_crashlog_buffer(void *arg)
        bus_size_t size = state->crashlog_size;
 
        if (addr) {
-               paddr_t pa = addr;
+               paddr_t pa = addr | PMAP_NOCACHE;
                vaddr_t va;
 
                if (rk && rk->rk_logmap) {
@@ -482,8 +482,7 @@ rtkit_handle_crashlog_buffer(void *arg)
                va = (vaddr_t)state->crashlog;
 
                while (size-- > 0) {
-                       pmap_kenter_cache(va, pa, PROT_READ,
-                           PMAP_CACHE_CI);
+                       pmap_kenter_pa(va, pa, PROT_READ);
                        va += PAGE_SIZE;
                        pa += PAGE_SIZE;
                }

Reply via email to