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

Reply via email to