> 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;
}