diff options
author | YenHaoChen <howard25336284@gmail.com> | 2022-12-09 08:59:44 +0800 |
---|---|---|
committer | YenHaoChen <howard25336284@gmail.com> | 2022-12-10 19:44:12 +0800 |
commit | f94ba5f4234b968c553db75b9dc9db4bb886266a (patch) | |
tree | d44ec42fda3e83aa6a61d166892594e8251966ce /riscv/triggers.cc | |
parent | f6f1509ad0045e57f8c7f8e24c4dab51afd7af94 (diff) | |
download | riscv-isa-sim-f94ba5f4234b968c553db75b9dc9db4bb886266a.zip riscv-isa-sim-f94ba5f4234b968c553db75b9dc9db4bb886266a.tar.gz riscv-isa-sim-f94ba5f4234b968c553db75b9dc9db4bb886266a.tar.bz2 |
triggers: add mcontext and hcontext CSRs
Diffstat (limited to 'riscv/triggers.cc')
-rw-r--r-- | riscv/triggers.cc | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/riscv/triggers.cc b/riscv/triggers.cc index ae54ef5..35ba9e6 100644 --- a/riscv/triggers.cc +++ b/riscv/triggers.cc @@ -8,6 +8,7 @@ #define VMIDMAX(HSXLEN) (HSXLEN == 32 ? 7 : 14) #define HGATP_VMID(HSXLEN) (HSXLEN == 32 ? HGATP32_VMID : HGATP64_VMID) +#define CSR_TEXTRA_MHVALUE_LENGTH(XLEN) (XLEN == 32 ? CSR_TEXTRA32_MHVALUE_LENGTH : CSR_TEXTRA64_MHVALUE_LENGTH) #define CSR_TEXTRA_MHVALUE(XLEN) (XLEN == 32 ? CSR_TEXTRA32_MHVALUE : CSR_TEXTRA64_MHVALUE) #define CSR_TEXTRA_MHSELECT(XLEN) (XLEN == 32 ? CSR_TEXTRA32_MHSELECT : CSR_TEXTRA64_MHSELECT) #define CSR_TEXTRA_SBYTEMASK(XLEN) (XLEN == 32 ? CSR_TEXTRA32_SBYTEMASK : CSR_TEXTRA64_SBYTEMASK) @@ -29,16 +30,15 @@ action_t trigger_t::legalize_action(reg_t val) const noexcept { } unsigned trigger_t::legalize_mhselect(bool h_enabled) const noexcept { - // consider a mask with lowest bit 0 unsigned convert[8] = { (unsigned) 0 , // 0 - (unsigned) 0 , // 1 + (unsigned)(h_enabled ? 1 : 0), // 1 (unsigned)(h_enabled ? 2 : 0), // 2 (unsigned) 0 , // 3 - (unsigned) 0 , // 4 - (unsigned) 0 , // 5 - (unsigned)(h_enabled ? 6 : 0), // 6 - (unsigned) 0 // 7 + (unsigned) 4 , // 4 + (unsigned)(h_enabled ? 5 : 4), // 5 + (unsigned)(h_enabled ? 6 : 4), // 6 + (unsigned) 4 // 7 }; assert(mhselect < 8); return convert[mhselect]; @@ -102,7 +102,11 @@ bool trigger_t::textra_match(processor_t * const proc) const noexcept } mhselect_mode_t mode = mhselect_mode(proc->extension_enabled('H')); - if (mode == MHSELECT_MODE_VMID) { // 2 and 6 are vmid + if (mode == MHSELECT_MODE_MCONTEXT) { // 4, 1, and 5 are mcontext + reg_t mask = (1 << (CSR_TEXTRA_MHVALUE_LENGTH(xlen) + 1)) - 1; + if ((state->mcontext->read() & mask) != mhselect_compare(proc->extension_enabled('H'))) + return false; + } else if (mode == MHSELECT_MODE_VMID) { // 2 and 6 are vmid const reg_t vmid = get_field(state->hgatp->read(), HGATP_VMID(hsxlen)); if (vmid != (mhselect_compare(proc->extension_enabled('H')) & ((1 << VMIDMAX(hsxlen)) - 1))) return false; |