[Qemu-devel] [PATCH v1 20/22] RISC-V: vectored traps are optional
Vectored traps for asynchrounous interrupts are optional. The mtvec/stvec mode field is WARL and hence does not trap if an illegal value is written. Illegal values are ignored. Signed-off-by: Michael ClarkSigned-off-by: Palmer Dabbelt --- target/riscv/op_helper.c | 14 ++ 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/target/riscv/op_helper.c b/target/riscv/op_helper.c index f79716a..aa101cc 100644 --- a/target/riscv/op_helper.c +++ b/target/riscv/op_helper.c @@ -262,11 +262,10 @@ void csr_write_helper(CPURISCVState *env, target_ulong val_to_write, env->sepc = val_to_write; break; case CSR_STVEC: -if (val_to_write & 1) { -qemu_log_mask(LOG_UNIMP, "CSR_STVEC: vectored traps not supported"); -goto do_illegal; +/* we do not support vectored traps for asynchrounous interrupts */ +if ((val_to_write & 3) == 0) { +env->stvec = val_to_write >> 2 << 2; } -env->stvec = val_to_write >> 2 << 2; break; case CSR_SCOUNTEREN: env->scounteren = val_to_write; @@ -284,11 +283,10 @@ void csr_write_helper(CPURISCVState *env, target_ulong val_to_write, env->mepc = val_to_write; break; case CSR_MTVEC: -if (val_to_write & 1) { -qemu_log_mask(LOG_UNIMP, "CSR_MTVEC: vectored traps not supported"); -goto do_illegal; +/* we do not support vectored traps for asynchrounous interrupts */ +if ((val_to_write & 3) == 0) { +env->mtvec = val_to_write >> 2 << 2; } -env->mtvec = val_to_write >> 2 << 2; break; case CSR_MCOUNTEREN: env->mcounteren = val_to_write; -- 2.7.0
[Qemu-devel] [PATCH v1 20/22] RISC-V: vectored traps are optional
Vectored traps for asynchrounous interrupts are optional. The mtvec/stvec mode field is WARL and hence does not trap if an illegal value is written. Illegal values are ignored. Signed-off-by: Michael ClarkSigned-off-by: Palmer Dabbelt --- target/riscv/op_helper.c | 14 ++ 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/target/riscv/op_helper.c b/target/riscv/op_helper.c index f79716a..aa101cc 100644 --- a/target/riscv/op_helper.c +++ b/target/riscv/op_helper.c @@ -262,11 +262,10 @@ void csr_write_helper(CPURISCVState *env, target_ulong val_to_write, env->sepc = val_to_write; break; case CSR_STVEC: -if (val_to_write & 1) { -qemu_log_mask(LOG_UNIMP, "CSR_STVEC: vectored traps not supported"); -goto do_illegal; +/* we do not support vectored traps for asynchrounous interrupts */ +if ((val_to_write & 3) == 0) { +env->stvec = val_to_write >> 2 << 2; } -env->stvec = val_to_write >> 2 << 2; break; case CSR_SCOUNTEREN: env->scounteren = val_to_write; @@ -284,11 +283,10 @@ void csr_write_helper(CPURISCVState *env, target_ulong val_to_write, env->mepc = val_to_write; break; case CSR_MTVEC: -if (val_to_write & 1) { -qemu_log_mask(LOG_UNIMP, "CSR_MTVEC: vectored traps not supported"); -goto do_illegal; +/* we do not support vectored traps for asynchrounous interrupts */ +if ((val_to_write & 3) == 0) { +env->mtvec = val_to_write >> 2 << 2; } -env->mtvec = val_to_write >> 2 << 2; break; case CSR_MCOUNTEREN: env->mcounteren = val_to_write; -- 2.7.0