target/riscv: Enable privileged spec version 1.12
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. This commit enforces the privilege version for csrs introduced in v1.12 or after. Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Signed-off-by: Atish Patra <atishp@rivosinc.com> Message-Id: <20220303185440.512391-7-atishp@rivosinc.com> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
This commit is contained in:
parent
29a9ec9bd8
commit
7100fe6c24
|
@ -150,7 +150,7 @@ static void riscv_any_cpu_init(Object *obj)
|
||||||
#elif defined(TARGET_RISCV64)
|
#elif defined(TARGET_RISCV64)
|
||||||
set_misa(env, MXL_RV64, RVI | RVM | RVA | RVF | RVD | RVC | RVU);
|
set_misa(env, MXL_RV64, RVI | RVM | RVA | RVF | RVD | RVC | RVU);
|
||||||
#endif
|
#endif
|
||||||
set_priv_version(env, PRIV_VERSION_1_11_0);
|
set_priv_version(env, PRIV_VERSION_1_12_0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(TARGET_RISCV64)
|
#if defined(TARGET_RISCV64)
|
||||||
|
@ -503,7 +503,9 @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cpu->cfg.priv_spec) {
|
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;
|
priv_version = PRIV_VERSION_1_11_0;
|
||||||
} else if (!g_strcmp0(cpu->cfg.priv_spec, "v1.10.0")) {
|
} else if (!g_strcmp0(cpu->cfg.priv_spec, "v1.10.0")) {
|
||||||
priv_version = PRIV_VERSION_1_10_0;
|
priv_version = PRIV_VERSION_1_10_0;
|
||||||
|
@ -518,7 +520,7 @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp)
|
||||||
if (priv_version) {
|
if (priv_version) {
|
||||||
set_priv_version(env, priv_version);
|
set_priv_version(env, priv_version);
|
||||||
} else if (!env->priv_ver) {
|
} 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) {
|
if (cpu->cfg.mmu) {
|
||||||
|
|
|
@ -2975,6 +2975,7 @@ static inline RISCVException riscv_csrrw_check(CPURISCVState *env,
|
||||||
{
|
{
|
||||||
/* check privileges and return RISCV_EXCP_ILLEGAL_INST if check fails */
|
/* check privileges and return RISCV_EXCP_ILLEGAL_INST if check fails */
|
||||||
int read_only = get_field(csrno, 0xC00) == 3;
|
int read_only = get_field(csrno, 0xC00) == 3;
|
||||||
|
int csr_min_priv = csr_ops[csrno].min_priv_ver;
|
||||||
#if !defined(CONFIG_USER_ONLY)
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
int effective_priv = env->priv;
|
int effective_priv = env->priv;
|
||||||
|
|
||||||
|
@ -3007,6 +3008,10 @@ static inline RISCVException riscv_csrrw_check(CPURISCVState *env,
|
||||||
return RISCV_EXCP_ILLEGAL_INST;
|
return RISCV_EXCP_ILLEGAL_INST;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (env->priv_ver < csr_min_priv) {
|
||||||
|
return RISCV_EXCP_ILLEGAL_INST;
|
||||||
|
}
|
||||||
|
|
||||||
return csr_ops[csrno].predicate(env, csrno);
|
return csr_ops[csrno].predicate(env, csrno);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue