mirror of https://github.com/xemu-project/xemu.git
target/riscv: add priv ver restriction to profiles
Some profiles, like RVA22S64, has a priv_spec requirement. Make this requirement explicit for all profiles. We'll validate this requirement finalize() time and, in case the user chooses an incompatible priv_spec while activating a profile, a warning will be shown. Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com> Reviewed-by: Andrew Jones <ajones@ventanamicro.com> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Message-ID: <20231218125334.37184-21-dbarboza@ventanamicro.com> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
This commit is contained in:
parent
48531f5adb
commit
1a7d4fcb3f
|
@ -1536,6 +1536,7 @@ Property riscv_cpu_options[] = {
|
||||||
static RISCVCPUProfile RVA22U64 = {
|
static RISCVCPUProfile RVA22U64 = {
|
||||||
.name = "rva22u64",
|
.name = "rva22u64",
|
||||||
.misa_ext = RVI | RVM | RVA | RVF | RVD | RVC | RVU,
|
.misa_ext = RVI | RVM | RVA | RVF | RVD | RVC | RVU,
|
||||||
|
.priv_spec = RISCV_PROFILE_ATTR_UNUSED,
|
||||||
.ext_offsets = {
|
.ext_offsets = {
|
||||||
CPU_CFG_OFFSET(ext_zicsr), CPU_CFG_OFFSET(ext_zihintpause),
|
CPU_CFG_OFFSET(ext_zicsr), CPU_CFG_OFFSET(ext_zihintpause),
|
||||||
CPU_CFG_OFFSET(ext_zba), CPU_CFG_OFFSET(ext_zbb),
|
CPU_CFG_OFFSET(ext_zba), CPU_CFG_OFFSET(ext_zbb),
|
||||||
|
|
|
@ -81,10 +81,12 @@ typedef struct riscv_cpu_profile {
|
||||||
uint32_t misa_ext;
|
uint32_t misa_ext;
|
||||||
bool enabled;
|
bool enabled;
|
||||||
bool user_set;
|
bool user_set;
|
||||||
|
int priv_spec;
|
||||||
const int32_t ext_offsets[];
|
const int32_t ext_offsets[];
|
||||||
} RISCVCPUProfile;
|
} RISCVCPUProfile;
|
||||||
|
|
||||||
#define RISCV_PROFILE_EXT_LIST_END -1
|
#define RISCV_PROFILE_EXT_LIST_END -1
|
||||||
|
#define RISCV_PROFILE_ATTR_UNUSED -1
|
||||||
|
|
||||||
extern RISCVCPUProfile *riscv_profiles[];
|
extern RISCVCPUProfile *riscv_profiles[];
|
||||||
|
|
||||||
|
|
|
@ -74,6 +74,20 @@ static void riscv_cpu_write_misa_bit(RISCVCPU *cpu, uint32_t bit,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char *cpu_priv_ver_to_str(int priv_ver)
|
||||||
|
{
|
||||||
|
switch (priv_ver) {
|
||||||
|
case PRIV_VERSION_1_10_0:
|
||||||
|
return "v1.10.0";
|
||||||
|
case PRIV_VERSION_1_11_0:
|
||||||
|
return "v1.11.0";
|
||||||
|
case PRIV_VERSION_1_12_0:
|
||||||
|
return "v1.12.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
g_assert_not_reached();
|
||||||
|
}
|
||||||
|
|
||||||
static void riscv_cpu_synchronize_from_tb(CPUState *cs,
|
static void riscv_cpu_synchronize_from_tb(CPUState *cs,
|
||||||
const TranslationBlock *tb)
|
const TranslationBlock *tb)
|
||||||
{
|
{
|
||||||
|
@ -760,11 +774,24 @@ void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)
|
||||||
static void riscv_cpu_validate_profile(RISCVCPU *cpu,
|
static void riscv_cpu_validate_profile(RISCVCPU *cpu,
|
||||||
RISCVCPUProfile *profile)
|
RISCVCPUProfile *profile)
|
||||||
{
|
{
|
||||||
|
CPURISCVState *env = &cpu->env;
|
||||||
const char *warn_msg = "Profile %s mandates disabled extension %s";
|
const char *warn_msg = "Profile %s mandates disabled extension %s";
|
||||||
bool send_warn = profile->user_set && profile->enabled;
|
bool send_warn = profile->user_set && profile->enabled;
|
||||||
bool profile_impl = true;
|
bool profile_impl = true;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
if (profile->priv_spec != RISCV_PROFILE_ATTR_UNUSED &&
|
||||||
|
profile->priv_spec != env->priv_ver) {
|
||||||
|
profile_impl = false;
|
||||||
|
|
||||||
|
if (send_warn) {
|
||||||
|
warn_report("Profile %s requires priv spec %s, "
|
||||||
|
"but priv ver %s was set", profile->name,
|
||||||
|
cpu_priv_ver_to_str(profile->priv_spec),
|
||||||
|
cpu_priv_ver_to_str(env->priv_ver));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; misa_bits[i] != 0; i++) {
|
for (i = 0; misa_bits[i] != 0; i++) {
|
||||||
uint32_t bit = misa_bits[i];
|
uint32_t bit = misa_bits[i];
|
||||||
|
|
||||||
|
@ -1053,6 +1080,10 @@ static void cpu_set_profile(Object *obj, Visitor *v, const char *name,
|
||||||
profile->user_set = true;
|
profile->user_set = true;
|
||||||
profile->enabled = value;
|
profile->enabled = value;
|
||||||
|
|
||||||
|
if (profile->enabled) {
|
||||||
|
cpu->env.priv_ver = profile->priv_spec;
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; misa_bits[i] != 0; i++) {
|
for (i = 0; misa_bits[i] != 0; i++) {
|
||||||
uint32_t bit = misa_bits[i];
|
uint32_t bit = misa_bits[i];
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue