Unverified Commit 1d1ee552 authored by Michael Clark's avatar Michael Clark
Browse files

RISC-V: Make mtvec/stvec ignore vectored traps



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.

Later we can add RISCV_FEATURE_VECTORED_TRAPS however
until then the correct behavior for WARL (Write Any, Read
Legal) fields is to drop writes to unsupported bits.

Cc: Sagar Karandikar <sagark@eecs.berkeley.edu>
Cc: Bastian Koppelmann <kbastian@mail.uni-paderborn.de>
Cc: Palmer Dabbelt <palmer@sifive.com>
Cc: Alistair Francis <Alistair.Francis@wdc.com>
Signed-off-by: default avatarMichael Clark <mjc@sifive.com>
parent 6fce529c
Loading
Loading
Loading
Loading
+8 −6
Original line number Diff line number Diff line
@@ -287,11 +287,12 @@ 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) {
        /* bits [1:0] encode mode; 0 = direct, 1 = vectored, 2 >= reserved */
        if ((val_to_write & 3) == 0) {
            env->stvec = val_to_write >> 2 << 2;
        } else {
            qemu_log_mask(LOG_UNIMP, "CSR_STVEC: vectored traps not supported");
            goto do_illegal;
        }
        env->stvec = val_to_write >> 2 << 2;
        break;
    case CSR_SCOUNTEREN:
        if (env->priv_ver >= PRIV_VERSION_1_10_0) {
@@ -313,11 +314,12 @@ 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) {
        /* bits [1:0] indicate mode; 0 = direct, 1 = vectored, 2 >= reserved */
        if ((val_to_write & 3) == 0) {
            env->mtvec = val_to_write >> 2 << 2;
        } else {
            qemu_log_mask(LOG_UNIMP, "CSR_MTVEC: vectored traps not supported");
            goto do_illegal;
        }
        env->mtvec = val_to_write >> 2 << 2;
        break;
    case CSR_MCOUNTEREN:
        if (env->priv_ver >= PRIV_VERSION_1_10_0) {