On Tue, Nov 18, 2025 at 9:42 PM Radim Krčmář <[email protected]>
wrote:

> 2025-11-18T18:59:35+08:00, <[email protected]>:
> > From: Frank Chang <[email protected]>
> >
> > mstatus.MPV only records the previous virtualization state, and does not
> > affect pointer masking according to the Zjpm specification.
> >
> > This patch rewrites riscv_pm_get_pmm() to follow the architectural
> > definition of Smmpm, Smnpm, and Ssnpm.
> >
> > The resulting PMM source for each mode is summarized below:
> >
> >   * Smmpm + Smnpm + Ssnpm:
> >       M-mode:  mseccfg.PMM
> >       S-mode:  menvcfg.PMM
> >       U-mode:  senvcfg.PMM
> >       VS-mode: henvcfg.PMM
> >       VU-mode: senvcfg.PMM
> >
> >   * Smmpm + Smnpm (RVS implemented):
> >       M-mode:  mseccfg.PMM
> >       S-mode:  menvcfg.PMM
> >       U/VS/VU: disabled (Ssnpm not present)
> >
> >   * Smmpm + Smnpm (RVS not implemented):
> >       M-mode:  mseccfg.PMM
> >       U-mode:  menvcfg.PMM
> >       S/VS/VU: disabled (no S-mode)
> >
> >   * Smmpm only:
> >       M-mode:  mseccfg.PMM
> >       Other existing modes: pointer masking disabled
> >
> > Signed-off-by: Frank Chang <[email protected]>
> > ---
> > diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
> > @@ -154,22 +154,30 @@ RISCVPmPmm riscv_pm_get_pmm(CPURISCVState *env)
> >          }
> >          break;
> >      case PRV_S:
> > -        if (riscv_cpu_cfg(env)->ext_smnpm) {
> > -            if (get_field(env->mstatus, MSTATUS_MPV)) {
> > -                return get_field(env->henvcfg, HENVCFG_PMM);
> > -            } else {
> > +        if (!env->virt_enabled) {
> > +            if (riscv_cpu_cfg(env)->ext_smnpm) {
>
> It wasn't correct before, but it doesn't seem correct now either.
> MPRV+MPV+MPP change the effective access mode to VS without setting
> virt_enabled, and henvcfg is supposed to be used in that case.
>

Hi Radim,

Thanks for the review.

I've sent out the v2 patchset to address these issues:
https://lore.kernel.org/qemu-riscv/[email protected]/

Regards,
Frank Chang


>
> I liked the way you described the desired behavior in the commit
> message:
>
>   M-mode:  mseccfg.PMM
>   S-mode:  menvcfg.PMM
>   U-mode:  senvcfg.PMM
>   VS-mode: henvcfg.PMM
>   VU-mode: senvcfg.PMM
>
> Can we have a "switch (get_effective_access_mode(env))" with the same
> structure?
>
> Thanks.
>
> ---
> Other bugs I noticed while skimming the adjust_addr_body() and
> riscv_pm_get_pmm():
> * Sign extension for HLV/HSV must be performed when vsatp.MODE != Bare.
> * The sign extension also depends on the effective mode, and not on the
>   current mode.
> * MXR should set PMLEN=0 for all accesses that aren't M to M, not just
>   when using MPRV.
>

Reply via email to