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:
parent
a3abecbef0
commit
095fe72a12
@ -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),
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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 },
|
||||||
|
@ -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)) {
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user