Merge pull request #1995 from apparentlymart/f-qemu-backport-wfi-umode

[QEMU backport] riscv: fix wfi exception behavior
This commit is contained in:
lazymio 2024-09-04 15:36:00 +08:00 committed by GitHub
commit 379791ad56
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 9 additions and 4 deletions

View File

@ -427,6 +427,7 @@
#define HSTATUS_SP2P 0x00000100 #define HSTATUS_SP2P 0x00000100
#define HSTATUS_SP2V 0x00000200 #define HSTATUS_SP2V 0x00000200
#define HSTATUS_VTVM 0x00100000 #define HSTATUS_VTVM 0x00100000
#define HSTATUS_VTW 0x00200000
#define HSTATUS_VTSR 0x00400000 #define HSTATUS_VTSR 0x00400000
#define HSTATUS32_WPRI 0xFF8FF87E #define HSTATUS32_WPRI 0xFF8FF87E

View File

@ -172,11 +172,15 @@ target_ulong helper_mret(CPURISCVState *env, target_ulong cpu_pc_deb)
void helper_wfi(CPURISCVState *env) void helper_wfi(CPURISCVState *env)
{ {
CPUState *cs = env_cpu(env); CPUState *cs = env_cpu(env);
bool rvs = riscv_has_ext(env, RVS);
bool prv_u = env->priv == PRV_U;
bool prv_s = env->priv == PRV_S;
if ((env->priv == PRV_S && if (((prv_s || (!rvs && prv_u)) && get_field(env->mstatus, MSTATUS_TW)) ||
env->priv_ver >= PRIV_VERSION_1_10_0 && (rvs && prv_u && !riscv_cpu_virt_enabled(env))) {
get_field(env->mstatus, MSTATUS_TW)) || riscv_raise_exception(env, RISCV_EXCP_ILLEGAL_INST, GETPC());
riscv_cpu_virt_enabled(env)) { } else if (riscv_cpu_virt_enabled(env) && (prv_u ||
(prv_s && get_field(env->hstatus, HSTATUS_VTW)))) {
riscv_raise_exception(env, RISCV_EXCP_ILLEGAL_INST, GETPC()); riscv_raise_exception(env, RISCV_EXCP_ILLEGAL_INST, GETPC());
} else { } else {
cs->halted = 1; cs->halted = 1;