diff --git a/disasm/isa_parser.cc b/disasm/isa_parser.cc index 32acb0d047..bb00484da3 100644 --- a/disasm/isa_parser.cc +++ b/disasm/isa_parser.cc @@ -251,6 +251,8 @@ isa_parser_t::isa_parser_t(const char* str, const char *priv) extension_table[EXT_SMEPMP] = true; } else if (ext_str == "smstateen") { extension_table[EXT_SMSTATEEN] = true; + } else if (ext_str == "smpmpmt") { + extension_table[EXT_SMPMPMT] = true; } else if (ext_str == "smrnmi") { extension_table[EXT_SMRNMI] = true; } else if (ext_str == "sscofpmf") { diff --git a/riscv/csrs.cc b/riscv/csrs.cc index 608c6a6333..5308236410 100644 --- a/riscv/csrs.cc +++ b/riscv/csrs.cc @@ -249,7 +249,10 @@ bool pmpcfg_csr_t::unlogged_write(const reg_t val) noexcept { if (i < proc->n_pmp) { const bool locked = (state->pmpaddr[i]->cfg & PMP_L); if (rlb || !locked) { - uint8_t cfg = (val >> (8 * (i - i0))) & (PMP_R | PMP_W | PMP_X | PMP_A | PMP_L); + uint8_t all_cfg_fields = (PMP_R | PMP_W | PMP_X | PMP_A | + (proc->extension_enabled(EXT_SMPMPMT) ? PMP_MT : 0) | + PMP_L); + uint8_t cfg = (val >> (8 * (i - i0))) & all_cfg_fields; // Drop R=0 W=1 when MML = 0 // Remove the restriction when MML = 1 if (!mml) { @@ -258,6 +261,9 @@ bool pmpcfg_csr_t::unlogged_write(const reg_t val) noexcept { // Disallow A=NA4 when granularity > 4 if (proc->lg_pmp_granularity != PMP_SHIFT && (cfg & PMP_A) == PMP_NA4) cfg |= PMP_NAPOT; + // MT value 0x3 is reserved + if (get_field(cfg, PMP_MT) == 0x3) + cfg = set_field(cfg, PMP_MT, 0); /* * Adding a rule with executable privileges that either is M-mode-only or a locked Shared-Region * is not possible and such pmpcfg writes are ignored, leaving pmpcfg unchanged. diff --git a/riscv/encoding.h b/riscv/encoding.h index f9782d6dd7..1fb0e51df7 100644 --- a/riscv/encoding.h +++ b/riscv/encoding.h @@ -4,7 +4,7 @@ /* * This file is auto-generated by running 'make' in - * https://github.com/riscv/riscv-opcodes (26e2c04) + * https://github.com/riscv/riscv-opcodes (56f9011) */ #ifndef RISCV_CSR_ENCODING_H @@ -375,6 +375,7 @@ #define PMP_W 0x02 #define PMP_X 0x04 #define PMP_A 0x18 +#define PMP_MT 0x60 #define PMP_L 0x80 #define PMP_SHIFT 2 diff --git a/riscv/isa_parser.h b/riscv/isa_parser.h index 6e927006ce..9206bc2cf0 100644 --- a/riscv/isa_parser.h +++ b/riscv/isa_parser.h @@ -40,6 +40,7 @@ typedef enum { EXT_ZVFOFP8MIN, EXT_SMEPMP, EXT_SMSTATEEN, + EXT_SMPMPMT, EXT_SMRNMI, EXT_SSCOFPMF, EXT_SVADU,