Add epmp to extensions list and rename it to smepmp

Smepmp is a ratified extension which qemu refers to as epmp.
Rename epmp to smepmp and add it to extension list so that
it is added to the isa string.

Signed-off-by: Himanshu Chauhan <hchauhan@ventanamicro.com>
Signed-off-by: Mayuresh Chitale <mchitale@ventanamicro.com>
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Message-ID: <20231019065546.1431579-1-mchitale@ventanamicro.com>
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
This commit is contained in:
Himanshu Chauhan 2023-10-19 12:25:46 +05:30 committed by Alistair Francis
parent a3abecbef0
commit 095fe72a12
5 changed files with 15 additions and 17 deletions

View File

@ -134,7 +134,7 @@ const RISCVIsaExtData isa_edata_arr[] = {
ISA_EXT_DATA_ENTRY(zhinx, PRIV_VERSION_1_12_0, ext_zhinx), ISA_EXT_DATA_ENTRY(zhinx, PRIV_VERSION_1_12_0, ext_zhinx),
ISA_EXT_DATA_ENTRY(zhinxmin, PRIV_VERSION_1_12_0, ext_zhinxmin), ISA_EXT_DATA_ENTRY(zhinxmin, PRIV_VERSION_1_12_0, ext_zhinxmin),
ISA_EXT_DATA_ENTRY(smaia, PRIV_VERSION_1_12_0, ext_smaia), ISA_EXT_DATA_ENTRY(smaia, PRIV_VERSION_1_12_0, ext_smaia),
ISA_EXT_DATA_ENTRY(smepmp, PRIV_VERSION_1_12_0, epmp), ISA_EXT_DATA_ENTRY(smepmp, PRIV_VERSION_1_12_0, ext_smepmp),
ISA_EXT_DATA_ENTRY(smstateen, PRIV_VERSION_1_12_0, ext_smstateen), ISA_EXT_DATA_ENTRY(smstateen, PRIV_VERSION_1_12_0, ext_smstateen),
ISA_EXT_DATA_ENTRY(ssaia, PRIV_VERSION_1_12_0, ext_ssaia), ISA_EXT_DATA_ENTRY(ssaia, PRIV_VERSION_1_12_0, ext_ssaia),
ISA_EXT_DATA_ENTRY(sscofpmf, PRIV_VERSION_1_12_0, ext_sscofpmf), ISA_EXT_DATA_ENTRY(sscofpmf, PRIV_VERSION_1_12_0, ext_sscofpmf),
@ -600,12 +600,11 @@ static void rv32_ibex_cpu_init(Object *obj)
#ifndef CONFIG_USER_ONLY #ifndef CONFIG_USER_ONLY
set_satp_mode_max_supported(cpu, VM_1_10_MBARE); set_satp_mode_max_supported(cpu, VM_1_10_MBARE);
#endif #endif
cpu->cfg.epmp = true;
/* inherited from parent obj via riscv_cpu_init() */ /* inherited from parent obj via riscv_cpu_init() */
cpu->cfg.ext_zifencei = true; cpu->cfg.ext_zifencei = true;
cpu->cfg.ext_zicsr = true; cpu->cfg.ext_zicsr = true;
cpu->cfg.pmp = true; cpu->cfg.pmp = true;
cpu->cfg.ext_smepmp = true;
} }
static void rv32_imafcu_nommu_cpu_init(Object *obj) static void rv32_imafcu_nommu_cpu_init(Object *obj)
@ -1280,6 +1279,7 @@ const RISCVCPUMultiExtConfig riscv_cpu_extensions[] = {
MULTI_EXT_CFG_BOOL("zve64d", ext_zve64d, false), MULTI_EXT_CFG_BOOL("zve64d", ext_zve64d, false),
MULTI_EXT_CFG_BOOL("sstc", ext_sstc, true), MULTI_EXT_CFG_BOOL("sstc", ext_sstc, true),
MULTI_EXT_CFG_BOOL("smepmp", ext_smepmp, false),
MULTI_EXT_CFG_BOOL("smstateen", ext_smstateen, false), MULTI_EXT_CFG_BOOL("smstateen", ext_smstateen, false),
MULTI_EXT_CFG_BOOL("svadu", ext_svadu, true), MULTI_EXT_CFG_BOOL("svadu", ext_svadu, true),
MULTI_EXT_CFG_BOOL("svinval", ext_svinval, false), MULTI_EXT_CFG_BOOL("svinval", ext_svinval, false),
@ -1345,8 +1345,6 @@ const RISCVCPUMultiExtConfig riscv_cpu_vendor_exts[] = {
/* These are experimental so mark with 'x-' */ /* These are experimental so mark with 'x-' */
const RISCVCPUMultiExtConfig riscv_cpu_experimental_exts[] = { const RISCVCPUMultiExtConfig riscv_cpu_experimental_exts[] = {
/* ePMP 0.9.3 */
MULTI_EXT_CFG_BOOL("x-epmp", epmp, false),
MULTI_EXT_CFG_BOOL("x-smaia", ext_smaia, false), MULTI_EXT_CFG_BOOL("x-smaia", ext_smaia, false),
MULTI_EXT_CFG_BOOL("x-ssaia", ext_ssaia, false), MULTI_EXT_CFG_BOOL("x-ssaia", ext_ssaia, false),

View File

@ -102,6 +102,7 @@ struct RISCVCPUConfig {
bool ext_smaia; bool ext_smaia;
bool ext_ssaia; bool ext_ssaia;
bool ext_sscofpmf; bool ext_sscofpmf;
bool ext_smepmp;
bool rvv_ta_all_1s; bool rvv_ta_all_1s;
bool rvv_ma_all_1s; bool rvv_ma_all_1s;
@ -134,7 +135,6 @@ struct RISCVCPUConfig {
uint16_t cboz_blocksize; uint16_t cboz_blocksize;
bool mmu; bool mmu;
bool pmp; bool pmp;
bool epmp;
bool debug; bool debug;
bool misa_w; bool misa_w;

View File

@ -524,9 +524,9 @@ static RISCVException pmp(CPURISCVState *env, int csrno)
return RISCV_EXCP_ILLEGAL_INST; return RISCV_EXCP_ILLEGAL_INST;
} }
static RISCVException epmp(CPURISCVState *env, int csrno) static RISCVException smepmp(CPURISCVState *env, int csrno)
{ {
if (riscv_cpu_cfg(env)->epmp) { if (riscv_cpu_cfg(env)->ext_smepmp) {
return RISCV_EXCP_NONE; return RISCV_EXCP_NONE;
} }
@ -4762,7 +4762,7 @@ riscv_csr_operations csr_ops[CSR_TABLE_SIZE] = {
[CSR_VSIPH] = { "vsiph", aia_hmode32, NULL, NULL, rmw_vsiph }, [CSR_VSIPH] = { "vsiph", aia_hmode32, NULL, NULL, rmw_vsiph },
/* Physical Memory Protection */ /* Physical Memory Protection */
[CSR_MSECCFG] = { "mseccfg", epmp, read_mseccfg, write_mseccfg, [CSR_MSECCFG] = { "mseccfg", smepmp, read_mseccfg, write_mseccfg,
.min_priv_ver = PRIV_VERSION_1_11_0 }, .min_priv_ver = PRIV_VERSION_1_11_0 },
[CSR_PMPCFG0] = { "pmpcfg0", pmp, read_pmpcfg, write_pmpcfg }, [CSR_PMPCFG0] = { "pmpcfg0", pmp, read_pmpcfg, write_pmpcfg },
[CSR_PMPCFG1] = { "pmpcfg1", pmp, read_pmpcfg, write_pmpcfg }, [CSR_PMPCFG1] = { "pmpcfg1", pmp, read_pmpcfg, write_pmpcfg },

View File

@ -91,7 +91,7 @@ static bool pmp_write_cfg(CPURISCVState *env, uint32_t pmp_index, uint8_t val)
if (pmp_index < MAX_RISCV_PMPS) { if (pmp_index < MAX_RISCV_PMPS) {
bool locked = true; bool locked = true;
if (riscv_cpu_cfg(env)->epmp) { if (riscv_cpu_cfg(env)->ext_smepmp) {
/* mseccfg.RLB is set */ /* mseccfg.RLB is set */
if (MSECCFG_RLB_ISSET(env)) { if (MSECCFG_RLB_ISSET(env)) {
locked = false; locked = false;
@ -340,9 +340,9 @@ bool pmp_hart_has_privs(CPURISCVState *env, target_ulong addr,
/* /*
* Convert the PMP permissions to match the truth table in the * Convert the PMP permissions to match the truth table in the
* ePMP spec. * Smepmp spec.
*/ */
const uint8_t epmp_operation = const uint8_t smepmp_operation =
((env->pmp_state.pmp[i].cfg_reg & PMP_LOCK) >> 4) | ((env->pmp_state.pmp[i].cfg_reg & PMP_LOCK) >> 4) |
((env->pmp_state.pmp[i].cfg_reg & PMP_READ) << 2) | ((env->pmp_state.pmp[i].cfg_reg & PMP_READ) << 2) |
(env->pmp_state.pmp[i].cfg_reg & PMP_WRITE) | (env->pmp_state.pmp[i].cfg_reg & PMP_WRITE) |
@ -367,7 +367,7 @@ bool pmp_hart_has_privs(CPURISCVState *env, target_ulong addr,
* If mseccfg.MML Bit set, do the enhanced pmp priv check * If mseccfg.MML Bit set, do the enhanced pmp priv check
*/ */
if (mode == PRV_M) { if (mode == PRV_M) {
switch (epmp_operation) { switch (smepmp_operation) {
case 0: case 0:
case 1: case 1:
case 4: case 4:
@ -398,7 +398,7 @@ bool pmp_hart_has_privs(CPURISCVState *env, target_ulong addr,
g_assert_not_reached(); g_assert_not_reached();
} }
} else { } else {
switch (epmp_operation) { switch (smepmp_operation) {
case 0: case 0:
case 8: case 8:
case 9: case 9:
@ -574,7 +574,7 @@ void mseccfg_csr_write(CPURISCVState *env, target_ulong val)
} }
} }
if (riscv_cpu_cfg(env)->epmp) { if (riscv_cpu_cfg(env)->ext_smepmp) {
/* Sticky bits */ /* Sticky bits */
val |= (env->mseccfg & (MSECCFG_MMWP | MSECCFG_MML)); val |= (env->mseccfg & (MSECCFG_MMWP | MSECCFG_MML));
if ((val ^ env->mseccfg) & (MSECCFG_MMWP | MSECCFG_MML)) { if ((val ^ env->mseccfg) & (MSECCFG_MMWP | MSECCFG_MML)) {

View File

@ -565,12 +565,12 @@ void riscv_tcg_cpu_finalize_features(RISCVCPU *cpu, Error **errp)
return; return;
} }
if (cpu->cfg.epmp && !cpu->cfg.pmp) { if (cpu->cfg.ext_smepmp && !cpu->cfg.pmp) {
/* /*
* Enhanced PMP should only be available * Enhanced PMP should only be available
* on harts with PMP support * on harts with PMP support
*/ */
error_setg(errp, "Invalid configuration: EPMP requires PMP support"); error_setg(errp, "Invalid configuration: Smepmp requires PMP support");
return; return;
} }