@@ -264,6 +264,41 @@ static void riscv_cpu_disable_priv_spec_isa_exts(RISCVCPU *cpu)
}
}
+static void riscv_cpu_commit_profile(RISCVCPU *cpu, RISCVCPUProfile *profile)
+{
+ int i;
+
+ for (i = 0;; i++) {
+ int ext_offset = profile->ext_offsets[i];
+
+ if (ext_offset == RISCV_PROFILE_EXT_LIST_END) {
+ break;
+ }
+
+ if (cpu_cfg_ext_is_user_set(ext_offset)) {
+ continue;
+ }
+
+ g_hash_table_insert(multi_ext_user_opts,
+ GUINT_TO_POINTER(ext_offset),
+ (gpointer)profile->enabled);
+ isa_ext_update_enabled(cpu, ext_offset, profile->enabled);
+ }
+}
+
+static void riscv_cpu_manage_profiles(RISCVCPU *cpu)
+{
+ for (int i = 0; riscv_profiles[i] != NULL; i++) {
+ RISCVCPUProfile *profile = riscv_profiles[i];
+
+ if (!profile->user_set) {
+ continue;
+ }
+
+ riscv_cpu_commit_profile(cpu, profile);
+ }
+}
+
/*
* Check consistency between chosen extensions while setting
* cpu->cfg accordingly.
@@ -273,6 +308,8 @@ void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)
CPURISCVState *env = &cpu->env;
Error *local_err = NULL;
+ riscv_cpu_manage_profiles(cpu);
+
/* Do some ISA extension error checking */
if (riscv_has_ext(env, RVG) &&
!(riscv_has_ext(env, RVI) && riscv_has_ext(env, RVM) &&
To 'commit' a profile means enabling/disabling all its mandatory extensions after taking into account individual user choice w.r.t MISA and multi-letter extensions. We'll handle multi-letter extennsions now - MISA extensions needs additional steps that we'll take care later. riscv_cpu_manage_profiles() will scroll through all profiles available in QEMU and call riscv_cpu_commit_profile() for any profile that the user set, either to 'true' or 'false'. Setting a profile to 'true' means 'enable all mandatory extensions of this profile'. Setting it to 'false' means disabling all its mandatory extensions. Since we're doing it during realize() time we already have all user choices for individual extensions sorted out, and they'll take precedence. This will make us independent of left-to-right ordering in the QEMU command line, i.e. the following QEMU command lines: -cpu rv64,zicbom=false,rva22u64=true,Zifencei=false -cpu rv64,zicbom=false,Zifencei=false,rva22u64=true -cpu rv64,rva22u64=true,zicbom=false,Zifencei=false They mean the same thing: "enable all mandatory extensions of the rva22u64 profile while keeping zicbom and Zifencei disabled". Enabling extensions in the profile is also considered an user choice, so all extensions enabled will be added in the multi_ext_user_opts hash. Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com> --- target/riscv/tcg/tcg-cpu.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+)