aboutsummaryrefslogtreecommitdiff
path: root/riscv/triggers.cc
diff options
context:
space:
mode:
authorYenHaoChen <howard25336284@gmail.com>2022-12-09 08:59:44 +0800
committerYenHaoChen <howard25336284@gmail.com>2022-12-10 19:44:12 +0800
commitf94ba5f4234b968c553db75b9dc9db4bb886266a (patch)
treed44ec42fda3e83aa6a61d166892594e8251966ce /riscv/triggers.cc
parentf6f1509ad0045e57f8c7f8e24c4dab51afd7af94 (diff)
downloadriscv-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.cc18
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;