Message ID | 20220120200735.2739543-6-atishp@rivosinc.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Privilege version update | expand |
On Fri, Jan 21, 2022 at 12:16 AM Atish Patra <atishp@rivosinc.com> wrote: > Virt machine uses privileged specification version 1.12 now. > All other machine continue to use the default one defined for that > machine unless changed to 1.12 by the user explicitly. > > Signed-off-by: Atish Patra <atishp@rivosinc.com> > --- > target/riscv/cpu.c | 8 +++++--- > target/riscv/csr.c | 10 ++++++++++ > 2 files changed, 15 insertions(+), 3 deletions(-) > > diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c > index 9bc25d3055d4..cec5791151e7 100644 > --- a/target/riscv/cpu.c > +++ b/target/riscv/cpu.c > @@ -153,7 +153,7 @@ static void riscv_any_cpu_init(Object *obj) > #elif defined(TARGET_RISCV64) > set_misa(env, MXL_RV64, RVI | RVM | RVA | RVF | RVD | RVC | RVU); > #endif > - set_priv_version(env, PRIV_VERSION_1_11_0); > + set_priv_version(env, PRIV_VERSION_1_12_0); > } > > #if defined(TARGET_RISCV64) > @@ -439,7 +439,9 @@ static void riscv_cpu_realize(DeviceState *dev, Error > **errp) > } > > if (cpu->cfg.priv_spec) { > - if (!g_strcmp0(cpu->cfg.priv_spec, "v1.11.0")) { > + if (!g_strcmp0(cpu->cfg.priv_spec, "v1.12.0")) { > + priv_version = PRIV_VERSION_1_12_0; > + } else if (!g_strcmp0(cpu->cfg.priv_spec, "v1.11.0")) { > priv_version = PRIV_VERSION_1_11_0; > } else if (!g_strcmp0(cpu->cfg.priv_spec, "v1.10.0")) { > priv_version = PRIV_VERSION_1_10_0; > @@ -454,7 +456,7 @@ static void riscv_cpu_realize(DeviceState *dev, Error > **errp) > if (priv_version) { > set_priv_version(env, priv_version); > } else if (!env->priv_ver) { > - set_priv_version(env, PRIV_VERSION_1_11_0); > + set_priv_version(env, PRIV_VERSION_1_12_0); > } > > if (cpu->cfg.mmu) { > diff --git a/target/riscv/csr.c b/target/riscv/csr.c > index a4bbae7a1bbd..62d429cc3f17 100644 > --- a/target/riscv/csr.c > +++ b/target/riscv/csr.c > @@ -1874,6 +1874,12 @@ static inline RISCVException > riscv_csrrw_check(CPURISCVState *env, > int read_only = get_field(csrno, 0xC00) == 3; > #if !defined(CONFIG_USER_ONLY) > int effective_priv = env->priv; > + int csr_min_priv = csr_ops[csrno].min_priv_ver; > + > + /* The default privilege specification version supported is 1.10 */ > + if (!csr_min_priv) { > + csr_min_priv = PRIV_VERSION_1_10_0; > + } > > if (riscv_has_ext(env, RVH) && > env->priv == PRV_S && > @@ -1904,6 +1910,10 @@ static inline RISCVException > riscv_csrrw_check(CPURISCVState *env, > return RISCV_EXCP_ILLEGAL_INST; > } > > + if (env->priv_ver < csr_min_priv) { > + return RISCV_EXCP_ILLEGAL_INST; > + } > This does not compile if CONFIG_USER_ONLY is defined. > + > return csr_ops[csrno].predicate(env, csrno); > } > > -- > 2.30.2 > >
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c index 9bc25d3055d4..cec5791151e7 100644 --- a/target/riscv/cpu.c +++ b/target/riscv/cpu.c @@ -153,7 +153,7 @@ static void riscv_any_cpu_init(Object *obj) #elif defined(TARGET_RISCV64) set_misa(env, MXL_RV64, RVI | RVM | RVA | RVF | RVD | RVC | RVU); #endif - set_priv_version(env, PRIV_VERSION_1_11_0); + set_priv_version(env, PRIV_VERSION_1_12_0); } #if defined(TARGET_RISCV64) @@ -439,7 +439,9 @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp) } if (cpu->cfg.priv_spec) { - if (!g_strcmp0(cpu->cfg.priv_spec, "v1.11.0")) { + if (!g_strcmp0(cpu->cfg.priv_spec, "v1.12.0")) { + priv_version = PRIV_VERSION_1_12_0; + } else if (!g_strcmp0(cpu->cfg.priv_spec, "v1.11.0")) { priv_version = PRIV_VERSION_1_11_0; } else if (!g_strcmp0(cpu->cfg.priv_spec, "v1.10.0")) { priv_version = PRIV_VERSION_1_10_0; @@ -454,7 +456,7 @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp) if (priv_version) { set_priv_version(env, priv_version); } else if (!env->priv_ver) { - set_priv_version(env, PRIV_VERSION_1_11_0); + set_priv_version(env, PRIV_VERSION_1_12_0); } if (cpu->cfg.mmu) { diff --git a/target/riscv/csr.c b/target/riscv/csr.c index a4bbae7a1bbd..62d429cc3f17 100644 --- a/target/riscv/csr.c +++ b/target/riscv/csr.c @@ -1874,6 +1874,12 @@ static inline RISCVException riscv_csrrw_check(CPURISCVState *env, int read_only = get_field(csrno, 0xC00) == 3; #if !defined(CONFIG_USER_ONLY) int effective_priv = env->priv; + int csr_min_priv = csr_ops[csrno].min_priv_ver; + + /* The default privilege specification version supported is 1.10 */ + if (!csr_min_priv) { + csr_min_priv = PRIV_VERSION_1_10_0; + } if (riscv_has_ext(env, RVH) && env->priv == PRV_S && @@ -1904,6 +1910,10 @@ static inline RISCVException riscv_csrrw_check(CPURISCVState *env, return RISCV_EXCP_ILLEGAL_INST; } + if (env->priv_ver < csr_min_priv) { + return RISCV_EXCP_ILLEGAL_INST; + } + return csr_ops[csrno].predicate(env, csrno); }
Virt machine uses privileged specification version 1.12 now. All other machine continue to use the default one defined for that machine unless changed to 1.12 by the user explicitly. Signed-off-by: Atish Patra <atishp@rivosinc.com> --- target/riscv/cpu.c | 8 +++++--- target/riscv/csr.c | 10 ++++++++++ 2 files changed, 15 insertions(+), 3 deletions(-)