mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-10 02:54:58 -06:00
target/riscv: Add Smdbltrp CSRs handling
Add `ext_smdbltrp`in RISCVCPUConfig and implement MSTATUS.MDT behavior. Also set MDT to 1 at reset according to the specification. Signed-off-by: Clément Léger <cleger@rivosinc.com> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Message-ID: <20250110125441.3208676-7-cleger@rivosinc.com> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
This commit is contained in:
parent
b0edcbe755
commit
d2e92f1c6d
4 changed files with 18 additions and 0 deletions
|
@ -1064,6 +1064,9 @@ static void riscv_cpu_reset_hold(Object *obj, ResetType type)
|
||||||
env->mstatus_hs = set_field(env->mstatus_hs,
|
env->mstatus_hs = set_field(env->mstatus_hs,
|
||||||
MSTATUS64_UXL, env->misa_mxl);
|
MSTATUS64_UXL, env->misa_mxl);
|
||||||
}
|
}
|
||||||
|
if (riscv_cpu_cfg(env)->ext_smdbltrp) {
|
||||||
|
env->mstatus = set_field(env->mstatus, MSTATUS_MDT, 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
env->mcause = 0;
|
env->mcause = 0;
|
||||||
env->miclaim = MIP_SGEIP;
|
env->miclaim = MIP_SGEIP;
|
||||||
|
|
|
@ -559,6 +559,7 @@
|
||||||
#define MSTATUS_MPELP 0x020000000000 /* zicfilp */
|
#define MSTATUS_MPELP 0x020000000000 /* zicfilp */
|
||||||
#define MSTATUS_GVA 0x4000000000ULL
|
#define MSTATUS_GVA 0x4000000000ULL
|
||||||
#define MSTATUS_MPV 0x8000000000ULL
|
#define MSTATUS_MPV 0x8000000000ULL
|
||||||
|
#define MSTATUS_MDT 0x40000000000ULL /* Smdbltrp extension */
|
||||||
|
|
||||||
#define MSTATUS64_UXL 0x0000000300000000ULL
|
#define MSTATUS64_UXL 0x0000000300000000ULL
|
||||||
#define MSTATUS64_SXL 0x0000000C00000000ULL
|
#define MSTATUS64_SXL 0x0000000C00000000ULL
|
||||||
|
|
|
@ -84,6 +84,7 @@ struct RISCVCPUConfig {
|
||||||
bool ext_smcsrind;
|
bool ext_smcsrind;
|
||||||
bool ext_sscsrind;
|
bool ext_sscsrind;
|
||||||
bool ext_ssdbltrp;
|
bool ext_ssdbltrp;
|
||||||
|
bool ext_smdbltrp;
|
||||||
bool ext_svadu;
|
bool ext_svadu;
|
||||||
bool ext_svinval;
|
bool ext_svinval;
|
||||||
bool ext_svnapot;
|
bool ext_svnapot;
|
||||||
|
|
|
@ -1954,6 +1954,13 @@ static RISCVException write_mstatus(CPURISCVState *env, int csrno,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (riscv_cpu_cfg(env)->ext_smdbltrp) {
|
||||||
|
mask |= MSTATUS_MDT;
|
||||||
|
if ((val & MSTATUS_MDT) != 0) {
|
||||||
|
val &= ~MSTATUS_MIE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (xl != MXL_RV32 || env->debugger) {
|
if (xl != MXL_RV32 || env->debugger) {
|
||||||
if (riscv_has_ext(env, RVH)) {
|
if (riscv_has_ext(env, RVH)) {
|
||||||
mask |= MSTATUS_MPV | MSTATUS_GVA;
|
mask |= MSTATUS_MPV | MSTATUS_GVA;
|
||||||
|
@ -1996,6 +2003,12 @@ static RISCVException write_mstatush(CPURISCVState *env, int csrno,
|
||||||
uint64_t valh = (uint64_t)val << 32;
|
uint64_t valh = (uint64_t)val << 32;
|
||||||
uint64_t mask = riscv_has_ext(env, RVH) ? MSTATUS_MPV | MSTATUS_GVA : 0;
|
uint64_t mask = riscv_has_ext(env, RVH) ? MSTATUS_MPV | MSTATUS_GVA : 0;
|
||||||
|
|
||||||
|
if (riscv_cpu_cfg(env)->ext_smdbltrp) {
|
||||||
|
mask |= MSTATUS_MDT;
|
||||||
|
if ((valh & MSTATUS_MDT) != 0) {
|
||||||
|
mask |= MSTATUS_MIE;
|
||||||
|
}
|
||||||
|
}
|
||||||
env->mstatus = (env->mstatus & ~mask) | (valh & mask);
|
env->mstatus = (env->mstatus & ~mask) | (valh & mask);
|
||||||
|
|
||||||
return RISCV_EXCP_NONE;
|
return RISCV_EXCP_NONE;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue