Thanks for the feedback!

You're right — I missed initializing csr_priv.
In this case, we only want to check for privilege M-mode CSRs along with
the smaia condition.
I’ll fix it by adding:

"int csr_priv = get_field(csrno, 0x300);"

Jay

On Wed, Mar 19, 2025 at 8:59 PM Daniel Henrique Barboza <
dbarb...@ventanamicro.com> wrote:

>
>
> On 3/18/25 4:01 AM, Jay Chang wrote:
> > RISC-V AIA Spec states:
> > "For a machine-level environment, extension Smaia encompasses all added
> > CSRs and all modifications to interrupt response behavior that the AIA
> > specifies for a hart, over all privilege levels. For a supervisor-level
> > environment, extension Ssaia is essentially the same as Smaia except
> > excluding the machine-level CSRs and behavior not directly visible to
> > supervisor level."
> >
> > Since midelegh is an AIA machine-mode CSR, add Smaia extension check in
> > aia_smode32 predicate.
> >
> > Reviewed-by: Frank Chang <frank.ch...@sifive.com>
> > Signed-off-by: Jay Chang <jay.ch...@sifive.com>
> > ---
> >   target/riscv/csr.c | 7 +++++--
> >   1 file changed, 5 insertions(+), 2 deletions(-)
> >
> > diff --git a/target/riscv/csr.c b/target/riscv/csr.c
> > index 975d6e307f..c3dd8e6cda 100644
> > --- a/target/riscv/csr.c
> > +++ b/target/riscv/csr.c
> > @@ -372,8 +372,11 @@ static RISCVException aia_smode(CPURISCVState *env,
> int csrno)
> >   static RISCVException aia_smode32(CPURISCVState *env, int csrno)
> >   {
> >       int ret;
> > +    int csr_priv;
> >
> > -    if (!riscv_cpu_cfg(env)->ext_ssaia) {
> > +    if (csr_priv == PRV_M && !riscv_cpu_cfg(env)->ext_smaia) {
> > +        return RISCV_EXCP_ILLEGAL_INST;
> > +    } else if (!riscv_cpu_cfg(env)->ext_ssaia) {
> >           return RISCV_EXCP_ILLEGAL_INST;
> >       }
>
> I believe this won't compile:
>
> ../target/riscv/csr.c: In function ‘aia_smode32’:
> ../target/riscv/csr.c:377:8: error: ‘csr_priv’ is used uninitialized
> [-Werror=uninitialized]
>    377 |     if (csr_priv == PRV_M && !riscv_cpu_cfg(env)->ext_smaia) {
>        |        ^
> ../target/riscv/csr.c:375:9: note: ‘csr_priv’ was declared here
>    375 |     int csr_priv;
>        |         ^~~~~~~~
> cc1: all warnings being treated as errors
> [2171/2988] Compiling C object
> libqemu-riscv64-softmmu.a.p/target_riscv_translate.c.o
> ninja: build stopped: subcommand failed.
>
>
> Perhaps the idea here is doing a "int csr_priv = env->priv;", but in that
> case you
> might as well just use env->priv directly. Thanks,
>
>
> Daniel
>
> >
> > @@ -5832,7 +5835,7 @@ riscv_csr_operations csr_ops[CSR_TABLE_SIZE] = {
> >       [CSR_MVIP]     = { "mvip",     aia_any, NULL, NULL, rmw_mvip    },
> >
> >       /* Machine-Level High-Half CSRs (AIA) */
> > -    [CSR_MIDELEGH] = { "midelegh", aia_any32, NULL, NULL, rmw_midelegh
> },
> > +    [CSR_MIDELEGH] = { "midelegh", aia_smode32, NULL, NULL,
> rmw_midelegh },
> >       [CSR_MIEH]     = { "mieh",     aia_any32, NULL, NULL, rmw_mieh
>  },
> >       [CSR_MVIENH]   = { "mvienh",   aia_any32, NULL, NULL, rmw_mvienh
>  },
> >       [CSR_MVIPH]    = { "mviph",    aia_any32, NULL, NULL, rmw_mviph
> },
>
>

Reply via email to