> Date: Mon, 10 Feb 2025 23:29:06 +0100
> From: Mark Kettenis <[email protected]>
>
> > 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.
I managed to reproduce the issue on a machine here. This diff isn't
quite right. I'll send out a better diff in a moment.
> 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;
> }
>
>