* [PATCH v13 00/26] riscv: RVA22 profiles support
@ 2023-12-18 12:53 Daniel Henrique Barboza
2023-12-18 12:53 ` [PATCH v13 01/26] target/riscv: create TYPE_RISCV_VENDOR_CPU Daniel Henrique Barboza
` (27 more replies)
0 siblings, 28 replies; 48+ messages in thread
From: Daniel Henrique Barboza @ 2023-12-18 12:53 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-riscv, alistair.francis, bmeng, liwei1518, zhiwei_liu,
palmer, ajones, Daniel Henrique Barboza
Hi,
This is a merge of the two profile series:
"[PATCH for-9.0 v12 00/18] riscv: rv64i/rva22u64 CPUs, RVA22U64 profile support"
"[PATCH for-9.0 v2 0/8] target/riscv: implement RVA22S64 profile"
I'm sending them together since the second series is dependent on the first.
Quick summary of the major features added:
- A new rv64i CPU type. This is a CPU that has only RVI enabled;
- 'rva22u64' and 'rva22s64' profile flags. They were designed to be used
with the 'rv64i' CPU but can be used with other generic CPUs like
rv64;
- Two new profile CPUs: 'rva22u64' and 'rva22s64'. A profile CPU is an
alias of '-cpu rv64,profile=on' and it's the most convenient way of
using profiles. E.g to launch an rva22s64 'virt' machine:
./qemu-system-riscv64 -M virt -cpu rva22s64 (...)
To test an application with an rva22u64 profile with linux-user mode:
./qemu-riscv64 -cpu rva22u64 (...)
The series can also be fetch via:
https://gitlab.com/danielhb/qemu/-/tree/rva22_v13
Patches rebased on top of Alistair riscv-to-apply.next.
All patches acked.
Daniel Henrique Barboza (26):
target/riscv: create TYPE_RISCV_VENDOR_CPU
target/riscv/tcg: do not use "!generic" CPU checks
target/riscv/tcg: update priv_ver on user_set extensions
target/riscv: add rv64i CPU
target/riscv: add zicbop extension flag
target/riscv/tcg: add 'zic64b' support
riscv-qmp-cmds.c: expose named features in cpu_model_expansion
target/riscv: add rva22u64 profile definition
target/riscv/kvm: add 'rva22u64' flag as unavailable
target/riscv/tcg: add user flag for profile support
target/riscv/tcg: add MISA user options hash
target/riscv/tcg: add riscv_cpu_write_misa_bit()
target/riscv/tcg: handle profile MISA bits
target/riscv/tcg: add hash table insert helpers
target/riscv/tcg: honor user choice for G MISA bits
target/riscv/tcg: validate profiles during finalize
riscv-qmp-cmds.c: add profile flags in cpu-model-expansion
target/riscv: add 'rva22u64' CPU
target/riscv: implement svade
target/riscv: add priv ver restriction to profiles
target/riscv/cpu.c: finalize satp_mode earlier
target/riscv/cpu.c: add riscv_cpu_is_32bit()
target/riscv: add satp_mode profile support
target/riscv: add 'parent' in profile description
target/riscv: add RVA22S64 profile
target/riscv: add rva22s64 cpu
hw/riscv/virt.c | 5 +
target/riscv/cpu-qom.h | 5 +
target/riscv/cpu.c | 201 +++++++++++++--
target/riscv/cpu.h | 18 ++
target/riscv/cpu_cfg.h | 4 +
target/riscv/kvm/kvm-cpu.c | 7 +-
target/riscv/riscv-qmp-cmds.c | 44 +++-
target/riscv/tcg/tcg-cpu.c | 450 +++++++++++++++++++++++++++++++---
8 files changed, 672 insertions(+), 62 deletions(-)
--
2.43.0
^ permalink raw reply [flat|nested] 48+ messages in thread
* [PATCH v13 01/26] target/riscv: create TYPE_RISCV_VENDOR_CPU
2023-12-18 12:53 [PATCH v13 00/26] riscv: RVA22 profiles support Daniel Henrique Barboza
@ 2023-12-18 12:53 ` Daniel Henrique Barboza
2023-12-18 12:53 ` [PATCH v13 02/26] target/riscv/tcg: do not use "!generic" CPU checks Daniel Henrique Barboza
` (26 subsequent siblings)
27 siblings, 0 replies; 48+ messages in thread
From: Daniel Henrique Barboza @ 2023-12-18 12:53 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-riscv, alistair.francis, bmeng, liwei1518, zhiwei_liu,
palmer, ajones, Daniel Henrique Barboza
We want to add a new CPU type for bare CPUs that will inherit specific
traits of the 2 existing types:
- it will allow for extensions to be enabled/disabled, like generic
CPUs;
- it will NOT inherit defaults, like vendor CPUs.
We can make this conditions met by adding an explicit type for the
existing vendor CPUs and change the existing logic to not imply that
"not generic" means vendor CPUs.
Let's add the "vendor" CPU type first.
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
---
target/riscv/cpu-qom.h | 1 +
target/riscv/cpu.c | 30 +++++++++++++++++++++---------
2 files changed, 22 insertions(+), 9 deletions(-)
diff --git a/target/riscv/cpu-qom.h b/target/riscv/cpu-qom.h
index 91b3361dec..ca7dd509e3 100644
--- a/target/riscv/cpu-qom.h
+++ b/target/riscv/cpu-qom.h
@@ -23,6 +23,7 @@
#define TYPE_RISCV_CPU "riscv-cpu"
#define TYPE_RISCV_DYNAMIC_CPU "riscv-dynamic-cpu"
+#define TYPE_RISCV_VENDOR_CPU "riscv-vendor-cpu"
#define RISCV_CPU_TYPE_SUFFIX "-" TYPE_RISCV_CPU
#define RISCV_CPU_TYPE_NAME(name) (name RISCV_CPU_TYPE_SUFFIX)
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
index 70bf10aa7c..bb91bcacee 100644
--- a/target/riscv/cpu.c
+++ b/target/riscv/cpu.c
@@ -1778,6 +1778,13 @@ void riscv_cpu_list(void)
.instance_init = initfn \
}
+#define DEFINE_VENDOR_CPU(type_name, initfn) \
+ { \
+ .name = type_name, \
+ .parent = TYPE_RISCV_VENDOR_CPU, \
+ .instance_init = initfn \
+ }
+
static const TypeInfo riscv_cpu_type_infos[] = {
{
.name = TYPE_RISCV_CPU,
@@ -1795,21 +1802,26 @@ static const TypeInfo riscv_cpu_type_infos[] = {
.parent = TYPE_RISCV_CPU,
.abstract = true,
},
+ {
+ .name = TYPE_RISCV_VENDOR_CPU,
+ .parent = TYPE_RISCV_CPU,
+ .abstract = true,
+ },
DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_ANY, riscv_any_cpu_init),
DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_MAX, riscv_max_cpu_init),
#if defined(TARGET_RISCV32)
DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_BASE32, rv32_base_cpu_init),
- DEFINE_CPU(TYPE_RISCV_CPU_IBEX, rv32_ibex_cpu_init),
- DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_E31, rv32_sifive_e_cpu_init),
- DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_E34, rv32_imafcu_nommu_cpu_init),
- DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_U34, rv32_sifive_u_cpu_init),
+ DEFINE_VENDOR_CPU(TYPE_RISCV_CPU_IBEX, rv32_ibex_cpu_init),
+ DEFINE_VENDOR_CPU(TYPE_RISCV_CPU_SIFIVE_E31, rv32_sifive_e_cpu_init),
+ DEFINE_VENDOR_CPU(TYPE_RISCV_CPU_SIFIVE_E34, rv32_imafcu_nommu_cpu_init),
+ DEFINE_VENDOR_CPU(TYPE_RISCV_CPU_SIFIVE_U34, rv32_sifive_u_cpu_init),
#elif defined(TARGET_RISCV64)
DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_BASE64, rv64_base_cpu_init),
- DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_E51, rv64_sifive_e_cpu_init),
- DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_U54, rv64_sifive_u_cpu_init),
- DEFINE_CPU(TYPE_RISCV_CPU_SHAKTI_C, rv64_sifive_u_cpu_init),
- DEFINE_CPU(TYPE_RISCV_CPU_THEAD_C906, rv64_thead_c906_cpu_init),
- DEFINE_CPU(TYPE_RISCV_CPU_VEYRON_V1, rv64_veyron_v1_cpu_init),
+ DEFINE_VENDOR_CPU(TYPE_RISCV_CPU_SIFIVE_E51, rv64_sifive_e_cpu_init),
+ DEFINE_VENDOR_CPU(TYPE_RISCV_CPU_SIFIVE_U54, rv64_sifive_u_cpu_init),
+ DEFINE_VENDOR_CPU(TYPE_RISCV_CPU_SHAKTI_C, rv64_sifive_u_cpu_init),
+ DEFINE_VENDOR_CPU(TYPE_RISCV_CPU_THEAD_C906, rv64_thead_c906_cpu_init),
+ DEFINE_VENDOR_CPU(TYPE_RISCV_CPU_VEYRON_V1, rv64_veyron_v1_cpu_init),
DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_BASE128, rv128_base_cpu_init),
#endif
};
--
2.43.0
^ permalink raw reply related [flat|nested] 48+ messages in thread
* [PATCH v13 02/26] target/riscv/tcg: do not use "!generic" CPU checks
2023-12-18 12:53 [PATCH v13 00/26] riscv: RVA22 profiles support Daniel Henrique Barboza
2023-12-18 12:53 ` [PATCH v13 01/26] target/riscv: create TYPE_RISCV_VENDOR_CPU Daniel Henrique Barboza
@ 2023-12-18 12:53 ` Daniel Henrique Barboza
2023-12-18 12:53 ` [PATCH v13 03/26] target/riscv/tcg: update priv_ver on user_set extensions Daniel Henrique Barboza
` (25 subsequent siblings)
27 siblings, 0 replies; 48+ messages in thread
From: Daniel Henrique Barboza @ 2023-12-18 12:53 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-riscv, alistair.francis, bmeng, liwei1518, zhiwei_liu,
palmer, ajones, Daniel Henrique Barboza
Our current logic in get/setters of MISA and multi-letter extensions
works because we have only 2 CPU types, generic and vendor, and by using
"!generic" we're implying that we're talking about vendor CPUs. When adding
a third CPU type this logic will break so let's handle it beforehand.
In set_misa_ext_cfg() and set_multi_ext_cfg(), check for "vendor" cpu instead
of "not generic". The "generic CPU" checks remaining are from
riscv_cpu_add_misa_properties() and cpu_add_multi_ext_prop() before
applying default values for the extensions.
This leaves us with:
- vendor CPUs will not allow extension enablement, all other CPUs will;
- generic CPUs will inherit default values for extensions, all others
won't.
And now we can add a new, third CPU type, that will allow extensions to
be enabled and will not inherit defaults, without changing the existing
logic.
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
---
target/riscv/tcg/tcg-cpu.c | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c
index 8a35683a34..7670120673 100644
--- a/target/riscv/tcg/tcg-cpu.c
+++ b/target/riscv/tcg/tcg-cpu.c
@@ -663,6 +663,11 @@ static bool riscv_cpu_is_generic(Object *cpu_obj)
return object_dynamic_cast(cpu_obj, TYPE_RISCV_DYNAMIC_CPU) != NULL;
}
+static bool riscv_cpu_is_vendor(Object *cpu_obj)
+{
+ return object_dynamic_cast(cpu_obj, TYPE_RISCV_VENDOR_CPU) != NULL;
+}
+
/*
* We'll get here via the following path:
*
@@ -731,7 +736,7 @@ static void cpu_set_misa_ext_cfg(Object *obj, Visitor *v, const char *name,
target_ulong misa_bit = misa_ext_cfg->misa_bit;
RISCVCPU *cpu = RISCV_CPU(obj);
CPURISCVState *env = &cpu->env;
- bool generic_cpu = riscv_cpu_is_generic(obj);
+ bool vendor_cpu = riscv_cpu_is_vendor(obj);
bool prev_val, value;
if (!visit_type_bool(v, name, &value, errp)) {
@@ -745,7 +750,7 @@ static void cpu_set_misa_ext_cfg(Object *obj, Visitor *v, const char *name,
}
if (value) {
- if (!generic_cpu) {
+ if (vendor_cpu) {
g_autofree char *cpuname = riscv_cpu_get_name(cpu);
error_setg(errp, "'%s' CPU does not allow enabling extensions",
cpuname);
@@ -850,7 +855,7 @@ static void cpu_set_multi_ext_cfg(Object *obj, Visitor *v, const char *name,
{
const RISCVCPUMultiExtConfig *multi_ext_cfg = opaque;
RISCVCPU *cpu = RISCV_CPU(obj);
- bool generic_cpu = riscv_cpu_is_generic(obj);
+ bool vendor_cpu = riscv_cpu_is_vendor(obj);
bool prev_val, value;
if (!visit_type_bool(v, name, &value, errp)) {
@@ -874,7 +879,7 @@ static void cpu_set_multi_ext_cfg(Object *obj, Visitor *v, const char *name,
return;
}
- if (value && !generic_cpu) {
+ if (value && vendor_cpu) {
g_autofree char *cpuname = riscv_cpu_get_name(cpu);
error_setg(errp, "'%s' CPU does not allow enabling extensions",
cpuname);
--
2.43.0
^ permalink raw reply related [flat|nested] 48+ messages in thread
* [PATCH v13 03/26] target/riscv/tcg: update priv_ver on user_set extensions
2023-12-18 12:53 [PATCH v13 00/26] riscv: RVA22 profiles support Daniel Henrique Barboza
2023-12-18 12:53 ` [PATCH v13 01/26] target/riscv: create TYPE_RISCV_VENDOR_CPU Daniel Henrique Barboza
2023-12-18 12:53 ` [PATCH v13 02/26] target/riscv/tcg: do not use "!generic" CPU checks Daniel Henrique Barboza
@ 2023-12-18 12:53 ` Daniel Henrique Barboza
2024-01-04 4:02 ` Alistair Francis
2023-12-18 12:53 ` [PATCH v13 04/26] target/riscv: add rv64i CPU Daniel Henrique Barboza
` (24 subsequent siblings)
27 siblings, 1 reply; 48+ messages in thread
From: Daniel Henrique Barboza @ 2023-12-18 12:53 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-riscv, alistair.francis, bmeng, liwei1518, zhiwei_liu,
palmer, ajones, Daniel Henrique Barboza
We'll add a new bare CPU type that won't have any default priv_ver. This
means that the CPU will default to priv_ver = 0, i.e. 1.10.0.
At the same we'll allow these CPUs to enable extensions at will, but
then, if the extension has a priv_ver newer than 1.10, we'll end up
disabling it. Users will then need to manually set priv_ver to something
other than 1.10 to enable the extensions they want, which is not ideal.
Change the setter() of extensions to allow user enabled extensions to
bump the priv_ver of the CPU. This will make it convenient for users to
enable extensions for CPUs that doesn't set a default priv_ver.
This change does not affect any existing CPU: vendor CPUs does not allow
extensions to be enabled, and generic CPUs are already set to priv_ver
LATEST.
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
---
target/riscv/tcg/tcg-cpu.c | 32 ++++++++++++++++++++++++++++++++
1 file changed, 32 insertions(+)
diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c
index 7670120673..aee98db6f8 100644
--- a/target/riscv/tcg/tcg-cpu.c
+++ b/target/riscv/tcg/tcg-cpu.c
@@ -114,6 +114,26 @@ static int cpu_cfg_ext_get_min_version(uint32_t ext_offset)
g_assert_not_reached();
}
+static void cpu_bump_multi_ext_priv_ver(CPURISCVState *env,
+ uint32_t ext_offset)
+{
+ int ext_priv_ver;
+
+ if (env->priv_ver == PRIV_VERSION_LATEST) {
+ return;
+ }
+
+ ext_priv_ver = cpu_cfg_ext_get_min_version(ext_offset);
+
+ if (env->priv_ver < ext_priv_ver) {
+ /*
+ * Note: the 'priv_spec' command line option, if present,
+ * will take precedence over this priv_ver bump.
+ */
+ env->priv_ver = ext_priv_ver;
+ }
+}
+
static void cpu_cfg_ext_auto_update(RISCVCPU *cpu, uint32_t ext_offset,
bool value)
{
@@ -757,6 +777,14 @@ static void cpu_set_misa_ext_cfg(Object *obj, Visitor *v, const char *name,
return;
}
+ if (misa_bit == RVH && env->priv_ver < PRIV_VERSION_1_12_0) {
+ /*
+ * Note: the 'priv_spec' command line option, if present,
+ * will take precedence over this priv_ver bump.
+ */
+ env->priv_ver = PRIV_VERSION_1_12_0;
+ }
+
env->misa_ext |= misa_bit;
env->misa_ext_mask |= misa_bit;
} else {
@@ -886,6 +914,10 @@ static void cpu_set_multi_ext_cfg(Object *obj, Visitor *v, const char *name,
return;
}
+ if (value) {
+ cpu_bump_multi_ext_priv_ver(&cpu->env, multi_ext_cfg->offset);
+ }
+
isa_ext_update_enabled(cpu, multi_ext_cfg->offset, value);
}
--
2.43.0
^ permalink raw reply related [flat|nested] 48+ messages in thread
* [PATCH v13 04/26] target/riscv: add rv64i CPU
2023-12-18 12:53 [PATCH v13 00/26] riscv: RVA22 profiles support Daniel Henrique Barboza
` (2 preceding siblings ...)
2023-12-18 12:53 ` [PATCH v13 03/26] target/riscv/tcg: update priv_ver on user_set extensions Daniel Henrique Barboza
@ 2023-12-18 12:53 ` Daniel Henrique Barboza
2024-01-04 4:11 ` Alistair Francis
2023-12-18 12:53 ` [PATCH v13 05/26] target/riscv: add zicbop extension flag Daniel Henrique Barboza
` (23 subsequent siblings)
27 siblings, 1 reply; 48+ messages in thread
From: Daniel Henrique Barboza @ 2023-12-18 12:53 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-riscv, alistair.francis, bmeng, liwei1518, zhiwei_liu,
palmer, ajones, Daniel Henrique Barboza
We don't have any form of a 'bare bones' CPU. rv64, our default CPUs,
comes with a lot of defaults. This is fine for most regular uses but
it's not suitable when more control of what is actually loaded in the
CPU is required.
A bare-bones CPU would be annoying to deal with if not by profile
support, a way to load a multitude of extensions with a single flag.
Profile support is going to be implemented shortly, so let's add a CPU
for it.
The new 'rv64i' CPU will have only RVI loaded. It is inspired in the
profile specification that dictates, for RVA22U64 [1]:
"RVA22U64 Mandatory Base
RV64I is the mandatory base ISA for RVA22U64"
And so it seems that RV64I is the mandatory base ISA for all profiles
listed in [1], making it an ideal CPU to use with profile support.
rv64i is a CPU of type TYPE_RISCV_BARE_CPU. It has a mix of features
from pre-existent CPUs:
- it allows extensions to be enabled, like generic CPUs;
- it will not inherit extension defaults, like vendor CPUs.
This is the minimum extension set to boot OpenSBI and buildroot using
rv64i:
./build/qemu-system-riscv64 -nographic -M virt \
-cpu rv64i,sv39=true,g=true,c=true,s=true,u=true
Our minimal riscv,isa in this case will be:
# cat /proc/device-tree/cpus/cpu@0/riscv,isa
rv64imafdc_zicntr_zicsr_zifencei_zihpm_zca_zcd#
[1] https://github.com/riscv/riscv-profiles/blob/main/profiles.adoc
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
---
target/riscv/cpu-qom.h | 2 ++
target/riscv/cpu.c | 46 ++++++++++++++++++++++++++++++++++++++++++
2 files changed, 48 insertions(+)
diff --git a/target/riscv/cpu-qom.h b/target/riscv/cpu-qom.h
index ca7dd509e3..4d1aa54311 100644
--- a/target/riscv/cpu-qom.h
+++ b/target/riscv/cpu-qom.h
@@ -24,6 +24,7 @@
#define TYPE_RISCV_CPU "riscv-cpu"
#define TYPE_RISCV_DYNAMIC_CPU "riscv-dynamic-cpu"
#define TYPE_RISCV_VENDOR_CPU "riscv-vendor-cpu"
+#define TYPE_RISCV_BARE_CPU "riscv-bare-cpu"
#define RISCV_CPU_TYPE_SUFFIX "-" TYPE_RISCV_CPU
#define RISCV_CPU_TYPE_NAME(name) (name RISCV_CPU_TYPE_SUFFIX)
@@ -33,6 +34,7 @@
#define TYPE_RISCV_CPU_BASE32 RISCV_CPU_TYPE_NAME("rv32")
#define TYPE_RISCV_CPU_BASE64 RISCV_CPU_TYPE_NAME("rv64")
#define TYPE_RISCV_CPU_BASE128 RISCV_CPU_TYPE_NAME("x-rv128")
+#define TYPE_RISCV_CPU_RV64I RISCV_CPU_TYPE_NAME("rv64i")
#define TYPE_RISCV_CPU_IBEX RISCV_CPU_TYPE_NAME("lowrisc-ibex")
#define TYPE_RISCV_CPU_SHAKTI_C RISCV_CPU_TYPE_NAME("shakti-c")
#define TYPE_RISCV_CPU_SIFIVE_E31 RISCV_CPU_TYPE_NAME("sifive-e31")
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
index bb91bcacee..34102f6869 100644
--- a/target/riscv/cpu.c
+++ b/target/riscv/cpu.c
@@ -370,6 +370,17 @@ static void set_satp_mode_max_supported(RISCVCPU *cpu,
/* Set the satp mode to the max supported */
static void set_satp_mode_default_map(RISCVCPU *cpu)
{
+ /*
+ * Bare CPUs do not default to the max available.
+ * Users must set a valid satp_mode in the command
+ * line.
+ */
+ if (object_dynamic_cast(OBJECT(cpu), TYPE_RISCV_BARE_CPU) != NULL) {
+ warn_report("No satp mode set. Defaulting to 'bare'");
+ cpu->cfg.satp_mode.map = (1 << VM_1_10_MBARE);
+ return;
+ }
+
cpu->cfg.satp_mode.map = cpu->cfg.satp_mode.supported;
}
#endif
@@ -552,6 +563,28 @@ static void rv128_base_cpu_init(Object *obj)
set_satp_mode_max_supported(RISCV_CPU(obj), VM_1_10_SV57);
#endif
}
+
+static void rv64i_bare_cpu_init(Object *obj)
+{
+ CPURISCVState *env = &RISCV_CPU(obj)->env;
+ riscv_cpu_set_misa(env, MXL_RV64, RVI);
+
+ /* Remove the defaults from the parent class */
+ RISCV_CPU(obj)->cfg.ext_zicntr = false;
+ RISCV_CPU(obj)->cfg.ext_zihpm = false;
+
+ /* Set to QEMU's first supported priv version */
+ env->priv_ver = PRIV_VERSION_1_10_0;
+
+ /*
+ * Support all available satp_mode settings. The default
+ * value will be set to MBARE if the user doesn't set
+ * satp_mode manually (see set_satp_mode_default()).
+ */
+#ifndef CONFIG_USER_ONLY
+ set_satp_mode_max_supported(RISCV_CPU(obj), VM_1_10_SV64);
+#endif
+}
#else
static void rv32_base_cpu_init(Object *obj)
{
@@ -1785,6 +1818,13 @@ void riscv_cpu_list(void)
.instance_init = initfn \
}
+#define DEFINE_BARE_CPU(type_name, initfn) \
+ { \
+ .name = type_name, \
+ .parent = TYPE_RISCV_BARE_CPU, \
+ .instance_init = initfn \
+ }
+
static const TypeInfo riscv_cpu_type_infos[] = {
{
.name = TYPE_RISCV_CPU,
@@ -1807,6 +1847,11 @@ static const TypeInfo riscv_cpu_type_infos[] = {
.parent = TYPE_RISCV_CPU,
.abstract = true,
},
+ {
+ .name = TYPE_RISCV_BARE_CPU,
+ .parent = TYPE_RISCV_CPU,
+ .abstract = true,
+ },
DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_ANY, riscv_any_cpu_init),
DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_MAX, riscv_max_cpu_init),
#if defined(TARGET_RISCV32)
@@ -1823,6 +1868,7 @@ static const TypeInfo riscv_cpu_type_infos[] = {
DEFINE_VENDOR_CPU(TYPE_RISCV_CPU_THEAD_C906, rv64_thead_c906_cpu_init),
DEFINE_VENDOR_CPU(TYPE_RISCV_CPU_VEYRON_V1, rv64_veyron_v1_cpu_init),
DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_BASE128, rv128_base_cpu_init),
+ DEFINE_BARE_CPU(TYPE_RISCV_CPU_RV64I, rv64i_bare_cpu_init),
#endif
};
--
2.43.0
^ permalink raw reply related [flat|nested] 48+ messages in thread
* [PATCH v13 05/26] target/riscv: add zicbop extension flag
2023-12-18 12:53 [PATCH v13 00/26] riscv: RVA22 profiles support Daniel Henrique Barboza
` (3 preceding siblings ...)
2023-12-18 12:53 ` [PATCH v13 04/26] target/riscv: add rv64i CPU Daniel Henrique Barboza
@ 2023-12-18 12:53 ` Daniel Henrique Barboza
2024-01-04 4:12 ` Alistair Francis
2023-12-18 12:53 ` [PATCH v13 06/26] target/riscv/tcg: add 'zic64b' support Daniel Henrique Barboza
` (22 subsequent siblings)
27 siblings, 1 reply; 48+ messages in thread
From: Daniel Henrique Barboza @ 2023-12-18 12:53 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-riscv, alistair.francis, bmeng, liwei1518, zhiwei_liu,
palmer, ajones, Daniel Henrique Barboza
QEMU already implements zicbom (Cache Block Management Operations) and
zicboz (Cache Block Zero Operations). Commit 59cb29d6a5 ("target/riscv:
add Zicbop cbo.prefetch{i, r, m} placeholder") added placeholders for
what would be the instructions for zicbop (Cache Block Prefetch
Operations), which are now no-ops.
The RVA22U64 profile mandates zicbop, which means that applications that
run with this profile might expect zicbop to be present in the riscv,isa
DT and might behave badly if it's absent.
Adding zicbop as an extension will make our future RVA22U64
implementation more in line with what userspace expects and, if/when
cache block prefetch operations became relevant to QEMU, we already have
the extension flag to turn then on/off as needed.
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
---
hw/riscv/virt.c | 5 +++++
target/riscv/cpu.c | 3 +++
target/riscv/cpu_cfg.h | 2 ++
3 files changed, 10 insertions(+)
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
index d2eac24156..da650865e5 100644
--- a/hw/riscv/virt.c
+++ b/hw/riscv/virt.c
@@ -273,6 +273,11 @@ static void create_fdt_socket_cpus(RISCVVirtState *s, int socket,
cpu_ptr->cfg.cboz_blocksize);
}
+ if (cpu_ptr->cfg.ext_zicbop) {
+ qemu_fdt_setprop_cell(ms->fdt, cpu_name, "riscv,cbop-block-size",
+ cpu_ptr->cfg.cbop_blocksize);
+ }
+
qemu_fdt_setprop_string(ms->fdt, cpu_name, "compatible", "riscv");
qemu_fdt_setprop_string(ms->fdt, cpu_name, "status", "okay");
qemu_fdt_setprop_cell(ms->fdt, cpu_name, "reg",
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
index 34102f6869..86e3514cc8 100644
--- a/target/riscv/cpu.c
+++ b/target/riscv/cpu.c
@@ -78,6 +78,7 @@ const uint32_t misa_bits[] = {RVI, RVE, RVM, RVA, RVF, RVD, RVV,
*/
const RISCVIsaExtData isa_edata_arr[] = {
ISA_EXT_DATA_ENTRY(zicbom, PRIV_VERSION_1_12_0, ext_zicbom),
+ ISA_EXT_DATA_ENTRY(zicbop, PRIV_VERSION_1_12_0, ext_zicbop),
ISA_EXT_DATA_ENTRY(zicboz, PRIV_VERSION_1_12_0, ext_zicboz),
ISA_EXT_DATA_ENTRY(zicond, PRIV_VERSION_1_12_0, ext_zicond),
ISA_EXT_DATA_ENTRY(zicntr, PRIV_VERSION_1_12_0, ext_zicntr),
@@ -1376,6 +1377,7 @@ const RISCVCPUMultiExtConfig riscv_cpu_extensions[] = {
MULTI_EXT_CFG_BOOL("zhinxmin", ext_zhinxmin, false),
MULTI_EXT_CFG_BOOL("zicbom", ext_zicbom, true),
+ MULTI_EXT_CFG_BOOL("zicbop", ext_zicbop, true),
MULTI_EXT_CFG_BOOL("zicboz", ext_zicboz, true),
MULTI_EXT_CFG_BOOL("zmmul", ext_zmmul, false),
@@ -1510,6 +1512,7 @@ Property riscv_cpu_options[] = {
DEFINE_PROP_UINT16("elen", RISCVCPU, cfg.elen, 64),
DEFINE_PROP_UINT16("cbom_blocksize", RISCVCPU, cfg.cbom_blocksize, 64),
+ DEFINE_PROP_UINT16("cbop_blocksize", RISCVCPU, cfg.cbop_blocksize, 64),
DEFINE_PROP_UINT16("cboz_blocksize", RISCVCPU, cfg.cboz_blocksize, 64),
DEFINE_PROP_END_OF_LIST(),
diff --git a/target/riscv/cpu_cfg.h b/target/riscv/cpu_cfg.h
index f4605fb190..bd2ff87cc8 100644
--- a/target/riscv/cpu_cfg.h
+++ b/target/riscv/cpu_cfg.h
@@ -65,6 +65,7 @@ struct RISCVCPUConfig {
bool ext_zicntr;
bool ext_zicsr;
bool ext_zicbom;
+ bool ext_zicbop;
bool ext_zicboz;
bool ext_zicond;
bool ext_zihintntl;
@@ -142,6 +143,7 @@ struct RISCVCPUConfig {
uint16_t vlen;
uint16_t elen;
uint16_t cbom_blocksize;
+ uint16_t cbop_blocksize;
uint16_t cboz_blocksize;
bool mmu;
bool pmp;
--
2.43.0
^ permalink raw reply related [flat|nested] 48+ messages in thread
* [PATCH v13 06/26] target/riscv/tcg: add 'zic64b' support
2023-12-18 12:53 [PATCH v13 00/26] riscv: RVA22 profiles support Daniel Henrique Barboza
` (4 preceding siblings ...)
2023-12-18 12:53 ` [PATCH v13 05/26] target/riscv: add zicbop extension flag Daniel Henrique Barboza
@ 2023-12-18 12:53 ` Daniel Henrique Barboza
2024-01-04 5:00 ` Alistair Francis
2023-12-18 12:53 ` [PATCH v13 07/26] riscv-qmp-cmds.c: expose named features in cpu_model_expansion Daniel Henrique Barboza
` (21 subsequent siblings)
27 siblings, 1 reply; 48+ messages in thread
From: Daniel Henrique Barboza @ 2023-12-18 12:53 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-riscv, alistair.francis, bmeng, liwei1518, zhiwei_liu,
palmer, ajones, Daniel Henrique Barboza
zic64b is defined in the RVA22U64 profile [1] as a named feature for
"Cache blocks must be 64 bytes in size, naturally aligned in the address
space". It's a fantasy name for 64 bytes cache blocks. The RVA22U64
profile mandates this feature, meaning that applications using this
profile expects 64 bytes cache blocks.
To make the upcoming RVA22U64 implementation complete, we'll zic64b as
a 'named feature', not a regular extension. This means that:
- it won't be exposed to users;
- it won't be written in riscv,isa.
This will be extended to other named extensions in the future, so we're
creating some common boilerplate for them as well.
zic64b is default to 'true' since we're already using 64 bytes blocks.
If any cache block size (cbo{m,p,z}_blocksize) is changed to something
different than 64, zic64b is set to 'false'.
Our profile implementation will then be able to check the current state
of zic64b and take the appropriate action (e.g. throw a warning).
[1] https://github.com/riscv/riscv-profiles/releases/download/v1.0/profiles.pdf
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
---
target/riscv/cpu.c | 6 ++++++
target/riscv/cpu.h | 1 +
target/riscv/cpu_cfg.h | 1 +
target/riscv/tcg/tcg-cpu.c | 26 ++++++++++++++++++++++++++
4 files changed, 34 insertions(+)
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
index 86e3514cc8..b2e539f807 100644
--- a/target/riscv/cpu.c
+++ b/target/riscv/cpu.c
@@ -1444,6 +1444,12 @@ const RISCVCPUMultiExtConfig riscv_cpu_experimental_exts[] = {
DEFINE_PROP_END_OF_LIST(),
};
+const RISCVCPUMultiExtConfig riscv_cpu_named_features[] = {
+ MULTI_EXT_CFG_BOOL("zic64b", zic64b, true),
+
+ DEFINE_PROP_END_OF_LIST(),
+};
+
/* Deprecated entries marked for future removal */
const RISCVCPUMultiExtConfig riscv_cpu_deprecated_exts[] = {
MULTI_EXT_CFG_BOOL("Zifencei", ext_zifencei, true),
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
index d74b361be6..5fb4ca2324 100644
--- a/target/riscv/cpu.h
+++ b/target/riscv/cpu.h
@@ -767,6 +767,7 @@ typedef struct RISCVCPUMultiExtConfig {
extern const RISCVCPUMultiExtConfig riscv_cpu_extensions[];
extern const RISCVCPUMultiExtConfig riscv_cpu_vendor_exts[];
extern const RISCVCPUMultiExtConfig riscv_cpu_experimental_exts[];
+extern const RISCVCPUMultiExtConfig riscv_cpu_named_features[];
extern const RISCVCPUMultiExtConfig riscv_cpu_deprecated_exts[];
extern Property riscv_cpu_options[];
diff --git a/target/riscv/cpu_cfg.h b/target/riscv/cpu_cfg.h
index bd2ff87cc8..90f18eb601 100644
--- a/target/riscv/cpu_cfg.h
+++ b/target/riscv/cpu_cfg.h
@@ -116,6 +116,7 @@ struct RISCVCPUConfig {
bool ext_smepmp;
bool rvv_ta_all_1s;
bool rvv_ma_all_1s;
+ bool zic64b;
uint32_t mvendorid;
uint64_t marchid;
diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c
index aee98db6f8..3319ba8e4e 100644
--- a/target/riscv/tcg/tcg-cpu.c
+++ b/target/riscv/tcg/tcg-cpu.c
@@ -114,6 +114,19 @@ static int cpu_cfg_ext_get_min_version(uint32_t ext_offset)
g_assert_not_reached();
}
+static bool cpu_cfg_offset_is_named_feat(uint32_t ext_offset)
+{
+ const RISCVCPUMultiExtConfig *feat;
+
+ for (feat = riscv_cpu_named_features; feat->name != NULL; feat++) {
+ if (feat->offset == ext_offset) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
static void cpu_bump_multi_ext_priv_ver(CPURISCVState *env,
uint32_t ext_offset)
{
@@ -123,6 +136,10 @@ static void cpu_bump_multi_ext_priv_ver(CPURISCVState *env,
return;
}
+ if (cpu_cfg_offset_is_named_feat(ext_offset)) {
+ return;
+ }
+
ext_priv_ver = cpu_cfg_ext_get_min_version(ext_offset);
if (env->priv_ver < ext_priv_ver) {
@@ -293,6 +310,13 @@ static void riscv_cpu_disable_priv_spec_isa_exts(RISCVCPU *cpu)
}
}
+static void riscv_cpu_update_named_features(RISCVCPU *cpu)
+{
+ cpu->cfg.zic64b = cpu->cfg.cbom_blocksize == 64 &&
+ cpu->cfg.cbop_blocksize == 64 &&
+ cpu->cfg.cboz_blocksize == 64;
+}
+
/*
* Check consistency between chosen extensions while setting
* cpu->cfg accordingly.
@@ -657,6 +681,8 @@ void riscv_tcg_cpu_finalize_features(RISCVCPU *cpu, Error **errp)
return;
}
+ riscv_cpu_update_named_features(cpu);
+
if (cpu->cfg.ext_smepmp && !cpu->cfg.pmp) {
/*
* Enhanced PMP should only be available
--
2.43.0
^ permalink raw reply related [flat|nested] 48+ messages in thread
* [PATCH v13 07/26] riscv-qmp-cmds.c: expose named features in cpu_model_expansion
2023-12-18 12:53 [PATCH v13 00/26] riscv: RVA22 profiles support Daniel Henrique Barboza
` (5 preceding siblings ...)
2023-12-18 12:53 ` [PATCH v13 06/26] target/riscv/tcg: add 'zic64b' support Daniel Henrique Barboza
@ 2023-12-18 12:53 ` Daniel Henrique Barboza
2024-01-04 5:13 ` Alistair Francis
2023-12-18 12:53 ` [PATCH v13 08/26] target/riscv: add rva22u64 profile definition Daniel Henrique Barboza
` (20 subsequent siblings)
27 siblings, 1 reply; 48+ messages in thread
From: Daniel Henrique Barboza @ 2023-12-18 12:53 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-riscv, alistair.francis, bmeng, liwei1518, zhiwei_liu,
palmer, ajones, Daniel Henrique Barboza
Named features (zic64b the sole example at this moment) aren't expose to
users, thus we need another way to expose them.
Go through each named feature, get its boolean value, do the needed
conversions (bool to qbool, qbool to QObject) and add it to output dict.
Another adjustment is needed: named features are evaluated during
finalize(), so riscv_cpu_finalize_features() needs to be mandatory
regardless of whether we have an input dict or not. Otherwise zic64b
will always return 'false', which is incorrect: the default values of
cache blocksizes ([cbom/cbop/cboz]_blocksize) are set to 64, satisfying
the conditions for zic64b.
Here's an API usage example after this patch:
$ ./build/qemu-system-riscv64 -S -M virt -display none
-qmp tcp:localhost:1234,server,wait=off
$ ./scripts/qmp/qmp-shell localhost:1234
Welcome to the QMP low-level shell!
Connected to QEMU 8.1.50
(QEMU) query-cpu-model-expansion type=full model={"name":"rv64"}
{"return": {"model":
{"name": "rv64", "props": {... "zic64b": true, ...}}}}
zic64b is set to 'true', as expected, since all cache sizes are 64
bytes by default.
If we change one of the cache blocksizes, zic64b is returned as 'false':
(QEMU) query-cpu-model-expansion type=full model={"name":"rv64","props":{"cbom_blocksize":128}}
{"return": {"model":
{"name": "rv64", "props": {... "zic64b": false, ...}}}}
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
---
target/riscv/riscv-qmp-cmds.c | 30 +++++++++++++++++++++++++-----
1 file changed, 25 insertions(+), 5 deletions(-)
diff --git a/target/riscv/riscv-qmp-cmds.c b/target/riscv/riscv-qmp-cmds.c
index 2f2dbae7c8..5ada279776 100644
--- a/target/riscv/riscv-qmp-cmds.c
+++ b/target/riscv/riscv-qmp-cmds.c
@@ -26,6 +26,7 @@
#include "qapi/error.h"
#include "qapi/qapi-commands-machine-target.h"
+#include "qapi/qmp/qbool.h"
#include "qapi/qmp/qdict.h"
#include "qapi/qmp/qerror.h"
#include "qapi/qobject-input-visitor.h"
@@ -99,6 +100,22 @@ static void riscv_obj_add_multiext_props(Object *obj, QDict *qdict_out,
}
}
+static void riscv_obj_add_named_feats_qdict(Object *obj, QDict *qdict_out)
+{
+ const RISCVCPUMultiExtConfig *named_cfg;
+ RISCVCPU *cpu = RISCV_CPU(obj);
+ QObject *value;
+ bool flag_val;
+
+ for (int i = 0; riscv_cpu_named_features[i].name != NULL; i++) {
+ named_cfg = &riscv_cpu_named_features[i];
+ flag_val = isa_ext_is_enabled(cpu, named_cfg->offset);
+ value = QOBJECT(qbool_from_bool(flag_val));
+
+ qdict_put_obj(qdict_out, named_cfg->name, value);
+ }
+}
+
static void riscv_cpuobj_validate_qdict_in(Object *obj, QObject *props,
const QDict *qdict_in,
Error **errp)
@@ -129,11 +146,6 @@ static void riscv_cpuobj_validate_qdict_in(Object *obj, QObject *props,
goto err;
}
- riscv_cpu_finalize_features(RISCV_CPU(obj), &local_err);
- if (local_err) {
- goto err;
- }
-
visit_end_struct(visitor, NULL);
err:
@@ -191,6 +203,13 @@ CpuModelExpansionInfo *qmp_query_cpu_model_expansion(CpuModelExpansionType type,
}
}
+ riscv_cpu_finalize_features(RISCV_CPU(obj), &local_err);
+ if (local_err) {
+ error_propagate(errp, local_err);
+ object_unref(obj);
+ return NULL;
+ }
+
expansion_info = g_new0(CpuModelExpansionInfo, 1);
expansion_info->model = g_malloc0(sizeof(*expansion_info->model));
expansion_info->model->name = g_strdup(model->name);
@@ -200,6 +219,7 @@ CpuModelExpansionInfo *qmp_query_cpu_model_expansion(CpuModelExpansionType type,
riscv_obj_add_multiext_props(obj, qdict_out, riscv_cpu_extensions);
riscv_obj_add_multiext_props(obj, qdict_out, riscv_cpu_experimental_exts);
riscv_obj_add_multiext_props(obj, qdict_out, riscv_cpu_vendor_exts);
+ riscv_obj_add_named_feats_qdict(obj, qdict_out);
/* Add our CPU boolean options too */
riscv_obj_add_qdict_prop(obj, qdict_out, "mmu");
--
2.43.0
^ permalink raw reply related [flat|nested] 48+ messages in thread
* [PATCH v13 08/26] target/riscv: add rva22u64 profile definition
2023-12-18 12:53 [PATCH v13 00/26] riscv: RVA22 profiles support Daniel Henrique Barboza
` (6 preceding siblings ...)
2023-12-18 12:53 ` [PATCH v13 07/26] riscv-qmp-cmds.c: expose named features in cpu_model_expansion Daniel Henrique Barboza
@ 2023-12-18 12:53 ` Daniel Henrique Barboza
2023-12-18 12:53 ` [PATCH v13 09/26] target/riscv/kvm: add 'rva22u64' flag as unavailable Daniel Henrique Barboza
` (19 subsequent siblings)
27 siblings, 0 replies; 48+ messages in thread
From: Daniel Henrique Barboza @ 2023-12-18 12:53 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-riscv, alistair.francis, bmeng, liwei1518, zhiwei_liu,
palmer, ajones, Daniel Henrique Barboza
The rva22U64 profile, described in:
https://github.com/riscv/riscv-profiles/blob/main/profiles.adoc#rva22-profiles
Contains a set of CPU extensions aimed for 64-bit userspace
applications. Enabling this set to be enabled via a single user flag
makes it convenient to enable a predictable set of features for the CPU,
giving users more predicability when running/testing their workloads.
QEMU implements all possible extensions of this profile. All the so
called 'synthetic extensions' described in the profile that are cache
related are ignored/assumed enabled (Za64rs, Zic64b, Ziccif, Ziccrse,
Ziccamoa, Zicclsm) since we do not implement a cache model.
An abstraction called RISCVCPUProfile is created to store the profile.
'ext_offsets' contains mandatory extensions that QEMU supports. Same
thing with the 'misa_ext' mask. Optional extensions must be enabled
manually in the command line if desired.
The design here is to use the common target/riscv/cpu.c file to store
the profile declaration and export it to the accelerator files. Each
accelerator is then responsible to expose it (or not) to users and how
to enable the extensions.
Next patches will implement the profile for TCG and KVM.
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
Acked-by: Alistair Francis <alistair.francis@wdc.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
---
target/riscv/cpu.c | 32 ++++++++++++++++++++++++++++++++
target/riscv/cpu.h | 12 ++++++++++++
2 files changed, 44 insertions(+)
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
index b2e539f807..b9057c8da2 100644
--- a/target/riscv/cpu.c
+++ b/target/riscv/cpu.c
@@ -1524,6 +1524,38 @@ Property riscv_cpu_options[] = {
DEFINE_PROP_END_OF_LIST(),
};
+/*
+ * RVA22U64 defines some 'named features' or 'synthetic extensions'
+ * that are cache related: Za64rs, Zic64b, Ziccif, Ziccrse, Ziccamoa
+ * and Zicclsm. We do not implement caching in QEMU so we'll consider
+ * all these named features as always enabled.
+ *
+ * There's no riscv,isa update for them (nor for zic64b, despite it
+ * having a cfg offset) at this moment.
+ */
+static RISCVCPUProfile RVA22U64 = {
+ .name = "rva22u64",
+ .misa_ext = RVI | RVM | RVA | RVF | RVD | RVC | RVU,
+ .ext_offsets = {
+ CPU_CFG_OFFSET(ext_zicsr), CPU_CFG_OFFSET(ext_zihintpause),
+ CPU_CFG_OFFSET(ext_zba), CPU_CFG_OFFSET(ext_zbb),
+ CPU_CFG_OFFSET(ext_zbs), CPU_CFG_OFFSET(ext_zfhmin),
+ CPU_CFG_OFFSET(ext_zkt), CPU_CFG_OFFSET(ext_zicntr),
+ CPU_CFG_OFFSET(ext_zihpm), CPU_CFG_OFFSET(ext_zicbom),
+ CPU_CFG_OFFSET(ext_zicbop), CPU_CFG_OFFSET(ext_zicboz),
+
+ /* mandatory named features for this profile */
+ CPU_CFG_OFFSET(zic64b),
+
+ RISCV_PROFILE_EXT_LIST_END
+ }
+};
+
+RISCVCPUProfile *riscv_profiles[] = {
+ &RVA22U64,
+ NULL,
+};
+
static Property riscv_cpu_properties[] = {
DEFINE_PROP_BOOL("debug", RISCVCPU, cfg.debug, true),
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
index 5fb4ca2324..5ff629650d 100644
--- a/target/riscv/cpu.h
+++ b/target/riscv/cpu.h
@@ -76,6 +76,18 @@ const char *riscv_get_misa_ext_description(uint32_t bit);
#define CPU_CFG_OFFSET(_prop) offsetof(struct RISCVCPUConfig, _prop)
+typedef struct riscv_cpu_profile {
+ const char *name;
+ uint32_t misa_ext;
+ bool enabled;
+ bool user_set;
+ const int32_t ext_offsets[];
+} RISCVCPUProfile;
+
+#define RISCV_PROFILE_EXT_LIST_END -1
+
+extern RISCVCPUProfile *riscv_profiles[];
+
/* Privileged specification version */
enum {
PRIV_VERSION_1_10_0 = 0,
--
2.43.0
^ permalink raw reply related [flat|nested] 48+ messages in thread
* [PATCH v13 09/26] target/riscv/kvm: add 'rva22u64' flag as unavailable
2023-12-18 12:53 [PATCH v13 00/26] riscv: RVA22 profiles support Daniel Henrique Barboza
` (7 preceding siblings ...)
2023-12-18 12:53 ` [PATCH v13 08/26] target/riscv: add rva22u64 profile definition Daniel Henrique Barboza
@ 2023-12-18 12:53 ` Daniel Henrique Barboza
2023-12-18 12:53 ` [PATCH v13 10/26] target/riscv/tcg: add user flag for profile support Daniel Henrique Barboza
` (18 subsequent siblings)
27 siblings, 0 replies; 48+ messages in thread
From: Daniel Henrique Barboza @ 2023-12-18 12:53 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-riscv, alistair.francis, bmeng, liwei1518, zhiwei_liu,
palmer, ajones, Daniel Henrique Barboza
KVM does not have the means to support enabling the rva22u64 profile.
The main reasons are:
- we're missing support for some mandatory rva22u64 extensions in the
KVM module;
- we can't make promises about enabling a profile since it all depends
on host support in the end.
We'll revisit this decision in the future if needed. For now mark the
'rva22u64' profile as unavailable when running a KVM CPU:
$ qemu-system-riscv64 -machine virt,accel=kvm -cpu rv64,rva22u64=true
qemu-system-riscv64: can't apply global rv64-riscv-cpu.rva22u64=true:
'rva22u64' is not available with KVM
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Reviewed-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
---
target/riscv/kvm/kvm-cpu.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/target/riscv/kvm/kvm-cpu.c b/target/riscv/kvm/kvm-cpu.c
index 62a1e51f0a..ea8b1b1259 100644
--- a/target/riscv/kvm/kvm-cpu.c
+++ b/target/riscv/kvm/kvm-cpu.c
@@ -414,7 +414,7 @@ static void cpu_set_cfg_unavailable(Object *obj, Visitor *v,
}
if (value) {
- error_setg(errp, "extension %s is not available with KVM",
+ error_setg(errp, "'%s' is not available with KVM",
propname);
}
}
@@ -495,6 +495,11 @@ static void kvm_riscv_add_cpu_user_properties(Object *cpu_obj)
riscv_cpu_add_kvm_unavail_prop_array(cpu_obj, riscv_cpu_extensions);
riscv_cpu_add_kvm_unavail_prop_array(cpu_obj, riscv_cpu_vendor_exts);
riscv_cpu_add_kvm_unavail_prop_array(cpu_obj, riscv_cpu_experimental_exts);
+
+ /* We don't have the needed KVM support for profiles */
+ for (i = 0; riscv_profiles[i] != NULL; i++) {
+ riscv_cpu_add_kvm_unavail_prop(cpu_obj, riscv_profiles[i]->name);
+ }
}
static int kvm_riscv_get_regs_core(CPUState *cs)
--
2.43.0
^ permalink raw reply related [flat|nested] 48+ messages in thread
* [PATCH v13 10/26] target/riscv/tcg: add user flag for profile support
2023-12-18 12:53 [PATCH v13 00/26] riscv: RVA22 profiles support Daniel Henrique Barboza
` (8 preceding siblings ...)
2023-12-18 12:53 ` [PATCH v13 09/26] target/riscv/kvm: add 'rva22u64' flag as unavailable Daniel Henrique Barboza
@ 2023-12-18 12:53 ` Daniel Henrique Barboza
2024-01-04 6:19 ` Alistair Francis
2023-12-18 12:53 ` [PATCH v13 11/26] target/riscv/tcg: add MISA user options hash Daniel Henrique Barboza
` (17 subsequent siblings)
27 siblings, 1 reply; 48+ messages in thread
From: Daniel Henrique Barboza @ 2023-12-18 12:53 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-riscv, alistair.francis, bmeng, liwei1518, zhiwei_liu,
palmer, ajones, Daniel Henrique Barboza
The TCG emulation implements all the extensions described in the
RVA22U64 profile, both mandatory and optional. The mandatory extensions
will be enabled via the profile flag. We'll leave the optional
extensions to be enabled by hand.
Given that this is the first profile we're implementing in TCG we'll
need some ground work first:
- all profiles declared in riscv_profiles[] will be exposed to users.
TCG is the main accelerator we're considering when adding profile
support in QEMU, so for now it's safe to assume that all profiles in
riscv_profiles[] will be relevant to TCG;
- we'll not support user profile settings for vendor CPUs. The flags
will still be exposed but users won't be able to change them;
- profile support, albeit available for all non-vendor CPUs, will be
based on top of the new 'rv64i' CPU. Setting a profile to 'true' means
enable all mandatory extensions of this profile, setting it to 'false'
will disable all mandatory profile extensions of the CPU, which will
obliterate preset defaults. This is not a problem for a bare CPU like
rv64i but it can allow for silly scenarios when using other CPUs. E.g.
an user can do "-cpu rv64,rva22u64=false" and have a bunch of default
rv64 extensions disabled. The recommended way of using profiles is the
rv64i CPU, but users are free to experiment.
For now we'll handle multi-letter extensions only. MISA extensions need
additional steps that we'll take care later. At this point we can boot a
Linux buildroot using rva22u64 using the following options:
-cpu rv64i,rva22u64=true,sv39=true,g=true,c=true,s=true
Note that being an usermode/application profile we still need to
explicitly set 's=true' to enable Supervisor mode to boot Linux.
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
---
target/riscv/tcg/tcg-cpu.c | 80 ++++++++++++++++++++++++++++++++++++++
1 file changed, 80 insertions(+)
diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c
index 3319ba8e4e..83d4dd00cf 100644
--- a/target/riscv/tcg/tcg-cpu.c
+++ b/target/riscv/tcg/tcg-cpu.c
@@ -127,6 +127,19 @@ static bool cpu_cfg_offset_is_named_feat(uint32_t ext_offset)
return false;
}
+static void riscv_cpu_enable_named_feat(RISCVCPU *cpu, uint32_t feat_offset)
+{
+ switch (feat_offset) {
+ case CPU_CFG_OFFSET(zic64b):
+ cpu->cfg.cbom_blocksize = 64;
+ cpu->cfg.cbop_blocksize = 64;
+ cpu->cfg.cboz_blocksize = 64;
+ break;
+ default:
+ g_assert_not_reached();
+ }
+}
+
static void cpu_bump_multi_ext_priv_ver(CPURISCVState *env,
uint32_t ext_offset)
{
@@ -885,6 +898,71 @@ static void riscv_cpu_add_misa_properties(Object *cpu_obj)
}
}
+static void cpu_set_profile(Object *obj, Visitor *v, const char *name,
+ void *opaque, Error **errp)
+{
+ RISCVCPUProfile *profile = opaque;
+ RISCVCPU *cpu = RISCV_CPU(obj);
+ bool value;
+ int i, ext_offset;
+
+ if (riscv_cpu_is_vendor(obj)) {
+ error_setg(errp, "Profile %s is not available for vendor CPUs",
+ profile->name);
+ return;
+ }
+
+ if (cpu->env.misa_mxl != MXL_RV64) {
+ error_setg(errp, "Profile %s only available for 64 bit CPUs",
+ profile->name);
+ return;
+ }
+
+ if (!visit_type_bool(v, name, &value, errp)) {
+ return;
+ }
+
+ profile->user_set = true;
+ profile->enabled = value;
+
+ for (i = 0; profile->ext_offsets[i] != RISCV_PROFILE_EXT_LIST_END; i++) {
+ ext_offset = profile->ext_offsets[i];
+
+ if (profile->enabled) {
+ if (cpu_cfg_offset_is_named_feat(ext_offset)) {
+ riscv_cpu_enable_named_feat(cpu, ext_offset);
+ }
+
+ cpu_bump_multi_ext_priv_ver(&cpu->env, ext_offset);
+ }
+
+ 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 cpu_get_profile(Object *obj, Visitor *v, const char *name,
+ void *opaque, Error **errp)
+{
+ RISCVCPUProfile *profile = opaque;
+ bool value = profile->enabled;
+
+ visit_type_bool(v, name, &value, errp);
+}
+
+static void riscv_cpu_add_profiles(Object *cpu_obj)
+{
+ for (int i = 0; riscv_profiles[i] != NULL; i++) {
+ const RISCVCPUProfile *profile = riscv_profiles[i];
+
+ object_property_add(cpu_obj, profile->name, "bool",
+ cpu_get_profile, cpu_set_profile,
+ NULL, (void *)profile);
+ }
+}
+
static bool cpu_ext_is_deprecated(const char *ext_name)
{
return isupper(ext_name[0]);
@@ -1012,6 +1090,8 @@ static void riscv_cpu_add_user_properties(Object *obj)
riscv_cpu_add_multiext_prop_array(obj, riscv_cpu_deprecated_exts);
+ riscv_cpu_add_profiles(obj);
+
for (Property *prop = riscv_cpu_options; prop && prop->name; prop++) {
qdev_property_add_static(DEVICE(obj), prop);
}
--
2.43.0
^ permalink raw reply related [flat|nested] 48+ messages in thread
* [PATCH v13 11/26] target/riscv/tcg: add MISA user options hash
2023-12-18 12:53 [PATCH v13 00/26] riscv: RVA22 profiles support Daniel Henrique Barboza
` (9 preceding siblings ...)
2023-12-18 12:53 ` [PATCH v13 10/26] target/riscv/tcg: add user flag for profile support Daniel Henrique Barboza
@ 2023-12-18 12:53 ` Daniel Henrique Barboza
2023-12-18 12:53 ` [PATCH v13 12/26] target/riscv/tcg: add riscv_cpu_write_misa_bit() Daniel Henrique Barboza
` (16 subsequent siblings)
27 siblings, 0 replies; 48+ messages in thread
From: Daniel Henrique Barboza @ 2023-12-18 12:53 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-riscv, alistair.francis, bmeng, liwei1518, zhiwei_liu,
palmer, ajones, Daniel Henrique Barboza
We already track user choice for multi-letter extensions because we
needed to honor user choice when enabling/disabling extensions during
realize(). We refrained from adding the same mechanism for MISA
extensions since we didn't need it.
Profile support requires tne need to check for user choice for MISA
extensions, so let's add the corresponding hash now. It works like the
existing multi-letter hash (multi_ext_user_opts) but tracking MISA bits
options in the cpu_set_misa_ext_cfg() callback.
Note that we can't re-use the same hash from multi-letter extensions
because that hash uses cpu->cfg offsets as keys, while for MISA
extensions we're using MISA bits as keys.
After adding the user hash in cpu_set_misa_ext_cfg(), setting default
values with object_property_set_bool() in add_misa_properties() will end
up marking the user choice hash with them. Set the default value
manually to avoid it.
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Reviewed-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
---
target/riscv/tcg/tcg-cpu.c | 15 ++++++++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c
index 83d4dd00cf..2affc1f771 100644
--- a/target/riscv/tcg/tcg-cpu.c
+++ b/target/riscv/tcg/tcg-cpu.c
@@ -34,6 +34,7 @@
/* Hash that stores user set extensions */
static GHashTable *multi_ext_user_opts;
+static GHashTable *misa_ext_user_opts;
static bool cpu_cfg_ext_is_user_set(uint32_t ext_offset)
{
@@ -802,6 +803,10 @@ static void cpu_set_misa_ext_cfg(Object *obj, Visitor *v, const char *name,
return;
}
+ g_hash_table_insert(misa_ext_user_opts,
+ GUINT_TO_POINTER(misa_bit),
+ (gpointer)value);
+
prev_val = env->misa_ext & misa_bit;
if (value == prev_val) {
@@ -873,6 +878,7 @@ static const RISCVCPUMisaExtConfig misa_ext_cfgs[] = {
*/
static void riscv_cpu_add_misa_properties(Object *cpu_obj)
{
+ CPURISCVState *env = &RISCV_CPU(cpu_obj)->env;
bool use_def_vals = riscv_cpu_is_generic(cpu_obj);
int i;
@@ -893,7 +899,13 @@ static void riscv_cpu_add_misa_properties(Object *cpu_obj)
NULL, (void *)misa_cfg);
object_property_set_description(cpu_obj, name, desc);
if (use_def_vals) {
- object_property_set_bool(cpu_obj, name, misa_cfg->enabled, NULL);
+ if (misa_cfg->enabled) {
+ env->misa_ext |= bit;
+ env->misa_ext_mask |= bit;
+ } else {
+ env->misa_ext &= ~bit;
+ env->misa_ext_mask &= ~bit;
+ }
}
}
}
@@ -1142,6 +1154,7 @@ static void tcg_cpu_instance_init(CPUState *cs)
RISCVCPU *cpu = RISCV_CPU(cs);
Object *obj = OBJECT(cpu);
+ misa_ext_user_opts = g_hash_table_new(NULL, g_direct_equal);
multi_ext_user_opts = g_hash_table_new(NULL, g_direct_equal);
riscv_cpu_add_user_properties(obj);
--
2.43.0
^ permalink raw reply related [flat|nested] 48+ messages in thread
* [PATCH v13 12/26] target/riscv/tcg: add riscv_cpu_write_misa_bit()
2023-12-18 12:53 [PATCH v13 00/26] riscv: RVA22 profiles support Daniel Henrique Barboza
` (10 preceding siblings ...)
2023-12-18 12:53 ` [PATCH v13 11/26] target/riscv/tcg: add MISA user options hash Daniel Henrique Barboza
@ 2023-12-18 12:53 ` Daniel Henrique Barboza
2023-12-18 12:53 ` [PATCH v13 13/26] target/riscv/tcg: handle profile MISA bits Daniel Henrique Barboza
` (15 subsequent siblings)
27 siblings, 0 replies; 48+ messages in thread
From: Daniel Henrique Barboza @ 2023-12-18 12:53 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-riscv, alistair.francis, bmeng, liwei1518, zhiwei_liu,
palmer, ajones, Daniel Henrique Barboza
We have two instances of the setting/clearing a MISA bit from
env->misa_ext and env->misa_ext_mask pattern. And the next patch will
end up adding one more.
Create a helper to avoid code repetition.
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Reviewed-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
---
target/riscv/tcg/tcg-cpu.c | 32 ++++++++++++++++++--------------
1 file changed, 18 insertions(+), 14 deletions(-)
diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c
index 2affc1f771..f8c35ba060 100644
--- a/target/riscv/tcg/tcg-cpu.c
+++ b/target/riscv/tcg/tcg-cpu.c
@@ -42,6 +42,20 @@ static bool cpu_cfg_ext_is_user_set(uint32_t ext_offset)
GUINT_TO_POINTER(ext_offset));
}
+static void riscv_cpu_write_misa_bit(RISCVCPU *cpu, uint32_t bit,
+ bool enabled)
+{
+ CPURISCVState *env = &cpu->env;
+
+ if (enabled) {
+ env->misa_ext |= bit;
+ env->misa_ext_mask |= bit;
+ } else {
+ env->misa_ext &= ~bit;
+ env->misa_ext_mask &= ~bit;
+ }
+}
+
static void riscv_cpu_synchronize_from_tb(CPUState *cs,
const TranslationBlock *tb)
{
@@ -828,13 +842,9 @@ static void cpu_set_misa_ext_cfg(Object *obj, Visitor *v, const char *name,
*/
env->priv_ver = PRIV_VERSION_1_12_0;
}
-
- env->misa_ext |= misa_bit;
- env->misa_ext_mask |= misa_bit;
- } else {
- env->misa_ext &= ~misa_bit;
- env->misa_ext_mask &= ~misa_bit;
}
+
+ riscv_cpu_write_misa_bit(cpu, misa_bit, value);
}
static void cpu_get_misa_ext_cfg(Object *obj, Visitor *v, const char *name,
@@ -878,7 +888,6 @@ static const RISCVCPUMisaExtConfig misa_ext_cfgs[] = {
*/
static void riscv_cpu_add_misa_properties(Object *cpu_obj)
{
- CPURISCVState *env = &RISCV_CPU(cpu_obj)->env;
bool use_def_vals = riscv_cpu_is_generic(cpu_obj);
int i;
@@ -899,13 +908,8 @@ static void riscv_cpu_add_misa_properties(Object *cpu_obj)
NULL, (void *)misa_cfg);
object_property_set_description(cpu_obj, name, desc);
if (use_def_vals) {
- if (misa_cfg->enabled) {
- env->misa_ext |= bit;
- env->misa_ext_mask |= bit;
- } else {
- env->misa_ext &= ~bit;
- env->misa_ext_mask &= ~bit;
- }
+ riscv_cpu_write_misa_bit(RISCV_CPU(cpu_obj), bit,
+ misa_cfg->enabled);
}
}
}
--
2.43.0
^ permalink raw reply related [flat|nested] 48+ messages in thread
* [PATCH v13 13/26] target/riscv/tcg: handle profile MISA bits
2023-12-18 12:53 [PATCH v13 00/26] riscv: RVA22 profiles support Daniel Henrique Barboza
` (11 preceding siblings ...)
2023-12-18 12:53 ` [PATCH v13 12/26] target/riscv/tcg: add riscv_cpu_write_misa_bit() Daniel Henrique Barboza
@ 2023-12-18 12:53 ` Daniel Henrique Barboza
2023-12-18 12:53 ` [PATCH v13 14/26] target/riscv/tcg: add hash table insert helpers Daniel Henrique Barboza
` (14 subsequent siblings)
27 siblings, 0 replies; 48+ messages in thread
From: Daniel Henrique Barboza @ 2023-12-18 12:53 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-riscv, alistair.francis, bmeng, liwei1518, zhiwei_liu,
palmer, ajones, Daniel Henrique Barboza
The profile support is handling multi-letter extensions only. Let's add
support for MISA bits as well.
We'll go through every known MISA bit. If the profile doesn't declare
the bit as mandatory, ignore it. Otherwise, set the bit in env->misa_ext
and env->misa_ext_mask.
Now that we're setting profile MISA bits, one can use the rv64i CPU to boot
Linux using the following options:
-cpu rv64i,rva22u64=true,rv39=true,s=true,zifencei=true
In the near future, when rva22s64 (where, 's', 'zifencei' and sv39 are
mandatory), is implemented, rv64i will be able to boot Linux loading
rva22s64 and no additional flags.
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
Reviewed-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
---
target/riscv/tcg/tcg-cpu.c | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c
index f8c35ba060..f2e0ce0f3d 100644
--- a/target/riscv/tcg/tcg-cpu.c
+++ b/target/riscv/tcg/tcg-cpu.c
@@ -941,6 +941,27 @@ static void cpu_set_profile(Object *obj, Visitor *v, const char *name,
profile->user_set = true;
profile->enabled = value;
+ for (i = 0; misa_bits[i] != 0; i++) {
+ uint32_t bit = misa_bits[i];
+
+ if (!(profile->misa_ext & bit)) {
+ continue;
+ }
+
+ if (bit == RVI && !profile->enabled) {
+ /*
+ * Disabling profiles will not disable the base
+ * ISA RV64I.
+ */
+ continue;
+ }
+
+ g_hash_table_insert(misa_ext_user_opts,
+ GUINT_TO_POINTER(bit),
+ (gpointer)value);
+ riscv_cpu_write_misa_bit(cpu, bit, profile->enabled);
+ }
+
for (i = 0; profile->ext_offsets[i] != RISCV_PROFILE_EXT_LIST_END; i++) {
ext_offset = profile->ext_offsets[i];
--
2.43.0
^ permalink raw reply related [flat|nested] 48+ messages in thread
* [PATCH v13 14/26] target/riscv/tcg: add hash table insert helpers
2023-12-18 12:53 [PATCH v13 00/26] riscv: RVA22 profiles support Daniel Henrique Barboza
` (12 preceding siblings ...)
2023-12-18 12:53 ` [PATCH v13 13/26] target/riscv/tcg: handle profile MISA bits Daniel Henrique Barboza
@ 2023-12-18 12:53 ` Daniel Henrique Barboza
2024-01-04 6:25 ` Alistair Francis
2023-12-18 12:53 ` [PATCH v13 15/26] target/riscv/tcg: honor user choice for G MISA bits Daniel Henrique Barboza
` (13 subsequent siblings)
27 siblings, 1 reply; 48+ messages in thread
From: Daniel Henrique Barboza @ 2023-12-18 12:53 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-riscv, alistair.francis, bmeng, liwei1518, zhiwei_liu,
palmer, ajones, Daniel Henrique Barboza
Previous patches added several g_hash_table_insert() patterns. Add two
helpers, one for each user hash, to make the code cleaner.
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
---
target/riscv/tcg/tcg-cpu.c | 28 ++++++++++++++++------------
1 file changed, 16 insertions(+), 12 deletions(-)
diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c
index f2e0ce0f3d..01d2cc9f94 100644
--- a/target/riscv/tcg/tcg-cpu.c
+++ b/target/riscv/tcg/tcg-cpu.c
@@ -42,6 +42,18 @@ static bool cpu_cfg_ext_is_user_set(uint32_t ext_offset)
GUINT_TO_POINTER(ext_offset));
}
+static void cpu_cfg_ext_add_user_opt(uint32_t ext_offset, bool value)
+{
+ g_hash_table_insert(multi_ext_user_opts, GUINT_TO_POINTER(ext_offset),
+ (gpointer)value);
+}
+
+static void cpu_misa_ext_add_user_opt(uint32_t bit, bool value)
+{
+ g_hash_table_insert(misa_ext_user_opts, GUINT_TO_POINTER(bit),
+ (gpointer)value);
+}
+
static void riscv_cpu_write_misa_bit(RISCVCPU *cpu, uint32_t bit,
bool enabled)
{
@@ -817,9 +829,7 @@ static void cpu_set_misa_ext_cfg(Object *obj, Visitor *v, const char *name,
return;
}
- g_hash_table_insert(misa_ext_user_opts,
- GUINT_TO_POINTER(misa_bit),
- (gpointer)value);
+ cpu_misa_ext_add_user_opt(misa_bit, value);
prev_val = env->misa_ext & misa_bit;
@@ -956,9 +966,7 @@ static void cpu_set_profile(Object *obj, Visitor *v, const char *name,
continue;
}
- g_hash_table_insert(misa_ext_user_opts,
- GUINT_TO_POINTER(bit),
- (gpointer)value);
+ cpu_misa_ext_add_user_opt(bit, profile->enabled);
riscv_cpu_write_misa_bit(cpu, bit, profile->enabled);
}
@@ -973,9 +981,7 @@ static void cpu_set_profile(Object *obj, Visitor *v, const char *name,
cpu_bump_multi_ext_priv_ver(&cpu->env, ext_offset);
}
- g_hash_table_insert(multi_ext_user_opts,
- GUINT_TO_POINTER(ext_offset),
- (gpointer)profile->enabled);
+ cpu_cfg_ext_add_user_opt(ext_offset, profile->enabled);
isa_ext_update_enabled(cpu, ext_offset, profile->enabled);
}
}
@@ -1038,9 +1044,7 @@ static void cpu_set_multi_ext_cfg(Object *obj, Visitor *v, const char *name,
multi_ext_cfg->name, lower);
}
- g_hash_table_insert(multi_ext_user_opts,
- GUINT_TO_POINTER(multi_ext_cfg->offset),
- (gpointer)value);
+ cpu_cfg_ext_add_user_opt(multi_ext_cfg->offset, value);
prev_val = isa_ext_is_enabled(cpu, multi_ext_cfg->offset);
--
2.43.0
^ permalink raw reply related [flat|nested] 48+ messages in thread
* [PATCH v13 15/26] target/riscv/tcg: honor user choice for G MISA bits
2023-12-18 12:53 [PATCH v13 00/26] riscv: RVA22 profiles support Daniel Henrique Barboza
` (13 preceding siblings ...)
2023-12-18 12:53 ` [PATCH v13 14/26] target/riscv/tcg: add hash table insert helpers Daniel Henrique Barboza
@ 2023-12-18 12:53 ` Daniel Henrique Barboza
2023-12-18 12:53 ` [PATCH v13 16/26] target/riscv/tcg: validate profiles during finalize Daniel Henrique Barboza
` (12 subsequent siblings)
27 siblings, 0 replies; 48+ messages in thread
From: Daniel Henrique Barboza @ 2023-12-18 12:53 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-riscv, alistair.francis, bmeng, liwei1518, zhiwei_liu,
palmer, ajones, Daniel Henrique Barboza
RVG behaves like a profile: a single flag enables a set of bits. Right
now we're considering user choice when handling RVG and zicsr/zifencei
and ignoring user choice on MISA bits.
We'll add user warnings for profiles when the user disables its
mandatory extensions in the next patch. We'll do the same thing with RVG
now to keep consistency between RVG and profile handling.
First and foremost, create a new RVG only helper to avoid clogging
riscv_cpu_validate_set_extensions(). We do not want to annoy users with
RVG warnings like we did in the past (see 9b9741c38f), thus we'll only
warn if RVG was user set and the user disabled a RVG extension in the
command line.
For every RVG MISA bit (IMAFD), zicsr and zifencei, the logic then
becomes:
- if enabled, do nothing;
- if disabled and not user set, enable it;
- if disabled and user set, throw a warning that it's a RVG mandatory
extension.
This same logic will be used for profiles in the next patch.
Note that this is a behavior change, where we would error out if the
user disabled either zicsr or zifencei. As long as users are explicitly
disabling things in the command line we'll let them have a go at it, at
least in this step. We'll error out later in the validation if needed.
Other notable changes from the previous RVG code:
- use riscv_cpu_write_misa_bit() instead of manually updating both
env->misa_ext and env->misa_ext_mask;
- set zicsr and zifencei directly. We're already checking if they
were user set and priv version will never fail for these
extensions, making cpu_cfg_ext_auto_update() redundant.
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
---
target/riscv/tcg/tcg-cpu.c | 73 +++++++++++++++++++++++++-------------
1 file changed, 48 insertions(+), 25 deletions(-)
diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c
index 01d2cc9f94..c9df783c51 100644
--- a/target/riscv/tcg/tcg-cpu.c
+++ b/target/riscv/tcg/tcg-cpu.c
@@ -42,6 +42,12 @@ static bool cpu_cfg_ext_is_user_set(uint32_t ext_offset)
GUINT_TO_POINTER(ext_offset));
}
+static bool cpu_misa_ext_is_user_set(uint32_t misa_bit)
+{
+ return g_hash_table_contains(misa_ext_user_opts,
+ GUINT_TO_POINTER(misa_bit));
+}
+
static void cpu_cfg_ext_add_user_opt(uint32_t ext_offset, bool value)
{
g_hash_table_insert(multi_ext_user_opts, GUINT_TO_POINTER(ext_offset),
@@ -357,6 +363,46 @@ static void riscv_cpu_update_named_features(RISCVCPU *cpu)
cpu->cfg.cboz_blocksize == 64;
}
+static void riscv_cpu_validate_g(RISCVCPU *cpu)
+{
+ const char *warn_msg = "RVG mandates disabled extension %s";
+ uint32_t g_misa_bits[] = {RVI, RVM, RVA, RVF, RVD};
+ bool send_warn = cpu_misa_ext_is_user_set(RVG);
+
+ for (int i = 0; i < ARRAY_SIZE(g_misa_bits); i++) {
+ uint32_t bit = g_misa_bits[i];
+
+ if (riscv_has_ext(&cpu->env, bit)) {
+ continue;
+ }
+
+ if (!cpu_misa_ext_is_user_set(bit)) {
+ riscv_cpu_write_misa_bit(cpu, bit, true);
+ continue;
+ }
+
+ if (send_warn) {
+ warn_report(warn_msg, riscv_get_misa_ext_name(bit));
+ }
+ }
+
+ if (!cpu->cfg.ext_zicsr) {
+ if (!cpu_cfg_ext_is_user_set(CPU_CFG_OFFSET(ext_zicsr))) {
+ cpu->cfg.ext_zicsr = true;
+ } else if (send_warn) {
+ warn_report(warn_msg, "zicsr");
+ }
+ }
+
+ if (!cpu->cfg.ext_zifencei) {
+ if (!cpu_cfg_ext_is_user_set(CPU_CFG_OFFSET(ext_zifencei))) {
+ cpu->cfg.ext_zifencei = true;
+ } else if (send_warn) {
+ warn_report(warn_msg, "zifencei");
+ }
+ }
+}
+
/*
* Check consistency between chosen extensions while setting
* cpu->cfg accordingly.
@@ -366,31 +412,8 @@ void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)
CPURISCVState *env = &cpu->env;
Error *local_err = NULL;
- /* Do some ISA extension error checking */
- if (riscv_has_ext(env, RVG) &&
- !(riscv_has_ext(env, RVI) && riscv_has_ext(env, RVM) &&
- riscv_has_ext(env, RVA) && riscv_has_ext(env, RVF) &&
- riscv_has_ext(env, RVD) &&
- cpu->cfg.ext_zicsr && cpu->cfg.ext_zifencei)) {
-
- if (cpu_cfg_ext_is_user_set(CPU_CFG_OFFSET(ext_zicsr)) &&
- !cpu->cfg.ext_zicsr) {
- error_setg(errp, "RVG requires Zicsr but user set Zicsr to false");
- return;
- }
-
- if (cpu_cfg_ext_is_user_set(CPU_CFG_OFFSET(ext_zifencei)) &&
- !cpu->cfg.ext_zifencei) {
- error_setg(errp, "RVG requires Zifencei but user set "
- "Zifencei to false");
- return;
- }
-
- cpu_cfg_ext_auto_update(cpu, CPU_CFG_OFFSET(ext_zicsr), true);
- cpu_cfg_ext_auto_update(cpu, CPU_CFG_OFFSET(ext_zifencei), true);
-
- env->misa_ext |= RVI | RVM | RVA | RVF | RVD;
- env->misa_ext_mask |= RVI | RVM | RVA | RVF | RVD;
+ if (riscv_has_ext(env, RVG)) {
+ riscv_cpu_validate_g(cpu);
}
if (riscv_has_ext(env, RVI) && riscv_has_ext(env, RVE)) {
--
2.43.0
^ permalink raw reply related [flat|nested] 48+ messages in thread
* [PATCH v13 16/26] target/riscv/tcg: validate profiles during finalize
2023-12-18 12:53 [PATCH v13 00/26] riscv: RVA22 profiles support Daniel Henrique Barboza
` (14 preceding siblings ...)
2023-12-18 12:53 ` [PATCH v13 15/26] target/riscv/tcg: honor user choice for G MISA bits Daniel Henrique Barboza
@ 2023-12-18 12:53 ` Daniel Henrique Barboza
2024-01-04 6:27 ` Alistair Francis
2023-12-18 12:53 ` [PATCH v13 17/26] riscv-qmp-cmds.c: add profile flags in cpu-model-expansion Daniel Henrique Barboza
` (11 subsequent siblings)
27 siblings, 1 reply; 48+ messages in thread
From: Daniel Henrique Barboza @ 2023-12-18 12:53 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-riscv, alistair.francis, bmeng, liwei1518, zhiwei_liu,
palmer, ajones, Daniel Henrique Barboza
Enabling a profile and then disabling some of its mandatory extensions
is a valid use. It can be useful for debugging and testing. But the
common expected use of enabling a profile is to enable all its mandatory
extensions.
Add an user warning when mandatory extensions from an enabled profile
are disabled in the command line. We're also going to disable the
profile flag in this case since the profile must include all the
mandatory extensions. This flag can be exposed by QMP to indicate the
actual profile state after the CPU is realized.
After this patch, this will throw warnings:
-cpu rv64,rva22u64=true,zihintpause=false,zicbom=false,zicboz=false
qemu-system-riscv64: warning: Profile rva22u64 mandates disabled extension zihintpause
qemu-system-riscv64: warning: Profile rva22u64 mandates disabled extension zicbom
qemu-system-riscv64: warning: Profile rva22u64 mandates disabled extension zicboz
Note that the following will NOT throw warnings because the profile is
being enabled last, hence all its mandatory extensions will be enabled:
-cpu rv64,zihintpause=false,zicbom=false,zicboz=false,rva22u64=true
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
---
target/riscv/tcg/tcg-cpu.c | 69 ++++++++++++++++++++++++++++++++++++++
1 file changed, 69 insertions(+)
diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c
index c9df783c51..005d8be26b 100644
--- a/target/riscv/tcg/tcg-cpu.c
+++ b/target/riscv/tcg/tcg-cpu.c
@@ -147,6 +147,26 @@ static int cpu_cfg_ext_get_min_version(uint32_t ext_offset)
g_assert_not_reached();
}
+static const char *cpu_cfg_ext_get_name(uint32_t ext_offset)
+{
+ const RISCVCPUMultiExtConfig *feat;
+ const RISCVIsaExtData *edata;
+
+ for (edata = isa_edata_arr; edata->name != NULL; edata++) {
+ if (edata->ext_enable_offset == ext_offset) {
+ return edata->name;
+ }
+ }
+
+ for (feat = riscv_cpu_named_features; feat->name != NULL; feat++) {
+ if (feat->offset == ext_offset) {
+ return feat->name;
+ }
+ }
+
+ g_assert_not_reached();
+}
+
static bool cpu_cfg_offset_is_named_feat(uint32_t ext_offset)
{
const RISCVCPUMultiExtConfig *feat;
@@ -727,6 +747,54 @@ void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)
riscv_cpu_disable_priv_spec_isa_exts(cpu);
}
+static void riscv_cpu_validate_profile(RISCVCPU *cpu,
+ RISCVCPUProfile *profile)
+{
+ const char *warn_msg = "Profile %s mandates disabled extension %s";
+ bool send_warn = profile->user_set && profile->enabled;
+ bool profile_impl = true;
+ int i;
+
+ for (i = 0; misa_bits[i] != 0; i++) {
+ uint32_t bit = misa_bits[i];
+
+ if (!(profile->misa_ext & bit)) {
+ continue;
+ }
+
+ if (!riscv_has_ext(&cpu->env, bit)) {
+ profile_impl = false;
+
+ if (send_warn) {
+ warn_report(warn_msg, profile->name,
+ riscv_get_misa_ext_name(bit));
+ }
+ }
+ }
+
+ for (i = 0; profile->ext_offsets[i] != RISCV_PROFILE_EXT_LIST_END; i++) {
+ int ext_offset = profile->ext_offsets[i];
+
+ if (!isa_ext_is_enabled(cpu, ext_offset)) {
+ profile_impl = false;
+
+ if (send_warn) {
+ warn_report(warn_msg, profile->name,
+ cpu_cfg_ext_get_name(ext_offset));
+ }
+ }
+ }
+
+ profile->enabled = profile_impl;
+}
+
+static void riscv_cpu_validate_profiles(RISCVCPU *cpu)
+{
+ for (int i = 0; riscv_profiles[i] != NULL; i++) {
+ riscv_cpu_validate_profile(cpu, riscv_profiles[i]);
+ }
+}
+
void riscv_tcg_cpu_finalize_features(RISCVCPU *cpu, Error **errp)
{
CPURISCVState *env = &cpu->env;
@@ -745,6 +813,7 @@ void riscv_tcg_cpu_finalize_features(RISCVCPU *cpu, Error **errp)
}
riscv_cpu_update_named_features(cpu);
+ riscv_cpu_validate_profiles(cpu);
if (cpu->cfg.ext_smepmp && !cpu->cfg.pmp) {
/*
--
2.43.0
^ permalink raw reply related [flat|nested] 48+ messages in thread
* [PATCH v13 17/26] riscv-qmp-cmds.c: add profile flags in cpu-model-expansion
2023-12-18 12:53 [PATCH v13 00/26] riscv: RVA22 profiles support Daniel Henrique Barboza
` (15 preceding siblings ...)
2023-12-18 12:53 ` [PATCH v13 16/26] target/riscv/tcg: validate profiles during finalize Daniel Henrique Barboza
@ 2023-12-18 12:53 ` Daniel Henrique Barboza
2024-01-04 6:29 ` Alistair Francis
2023-12-18 12:53 ` [PATCH v13 18/26] target/riscv: add 'rva22u64' CPU Daniel Henrique Barboza
` (10 subsequent siblings)
27 siblings, 1 reply; 48+ messages in thread
From: Daniel Henrique Barboza @ 2023-12-18 12:53 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-riscv, alistair.francis, bmeng, liwei1518, zhiwei_liu,
palmer, ajones, Daniel Henrique Barboza
Expose all profile flags for all CPUs when executing
query-cpu-model-expansion. This will allow callers to quickly determine
if a certain profile is implemented by a given CPU. This includes vendor
CPUs - the fact that they don't have profile user flags doesn't mean
that they don't implement the profile.
After this change it's possible to quickly determine if our stock CPUs
implement the existing rva22u64 profile. Here's a few examples:
$ ./build/qemu-system-riscv64 -S -M virt -display none
-qmp tcp:localhost:1234,server,wait=off
$ ./scripts/qmp/qmp-shell localhost:1234
Welcome to the QMP low-level shell!
Connected to QEMU 8.1.50
- As expected, the 'max' CPU implements the rva22u64 profile.
(QEMU) query-cpu-model-expansion type=full model={"name":"max"}
{"return": {"model":
{"name": "rv64", "props": {... "rva22u64": true, ...}}}}
- rv64 is missing "zba", "zbb", "zbs", "zkt" and "zfhmin":
query-cpu-model-expansion type=full model={"name":"rv64"}
{"return": {"model":
{"name": "rv64", "props": {... "rva22u64": false, ...}}}}
query-cpu-model-expansion type=full model={"name":"rv64",
"props":{"zba":true,"zbb":true,"zbs":true,"zkt":true,"zfhmin":true}}
{"return": {"model":
{"name": "rv64", "props": {... "rva22u64": true, ...}}}}
We have no vendor CPUs that supports rva22u64 (veyron-v1 is the closest
- it is missing just 'zkt').
In short, aside from the 'max' CPU, we have no CPUs that supports
rva22u64 by default.
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
---
target/riscv/riscv-qmp-cmds.c | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/target/riscv/riscv-qmp-cmds.c b/target/riscv/riscv-qmp-cmds.c
index 5ada279776..205aaabeb9 100644
--- a/target/riscv/riscv-qmp-cmds.c
+++ b/target/riscv/riscv-qmp-cmds.c
@@ -116,6 +116,19 @@ static void riscv_obj_add_named_feats_qdict(Object *obj, QDict *qdict_out)
}
}
+static void riscv_obj_add_profiles_qdict(Object *obj, QDict *qdict_out)
+{
+ RISCVCPUProfile *profile;
+ QObject *value;
+
+ for (int i = 0; riscv_profiles[i] != NULL; i++) {
+ profile = riscv_profiles[i];
+ value = QOBJECT(qbool_from_bool(profile->enabled));
+
+ qdict_put_obj(qdict_out, profile->name, value);
+ }
+}
+
static void riscv_cpuobj_validate_qdict_in(Object *obj, QObject *props,
const QDict *qdict_in,
Error **errp)
@@ -220,6 +233,7 @@ CpuModelExpansionInfo *qmp_query_cpu_model_expansion(CpuModelExpansionType type,
riscv_obj_add_multiext_props(obj, qdict_out, riscv_cpu_experimental_exts);
riscv_obj_add_multiext_props(obj, qdict_out, riscv_cpu_vendor_exts);
riscv_obj_add_named_feats_qdict(obj, qdict_out);
+ riscv_obj_add_profiles_qdict(obj, qdict_out);
/* Add our CPU boolean options too */
riscv_obj_add_qdict_prop(obj, qdict_out, "mmu");
--
2.43.0
^ permalink raw reply related [flat|nested] 48+ messages in thread
* [PATCH v13 18/26] target/riscv: add 'rva22u64' CPU
2023-12-18 12:53 [PATCH v13 00/26] riscv: RVA22 profiles support Daniel Henrique Barboza
` (16 preceding siblings ...)
2023-12-18 12:53 ` [PATCH v13 17/26] riscv-qmp-cmds.c: add profile flags in cpu-model-expansion Daniel Henrique Barboza
@ 2023-12-18 12:53 ` Daniel Henrique Barboza
2024-01-04 6:31 ` Alistair Francis
2023-12-18 12:53 ` [PATCH v13 19/26] target/riscv: implement svade Daniel Henrique Barboza
` (9 subsequent siblings)
27 siblings, 1 reply; 48+ messages in thread
From: Daniel Henrique Barboza @ 2023-12-18 12:53 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-riscv, alistair.francis, bmeng, liwei1518, zhiwei_liu,
palmer, ajones, Daniel Henrique Barboza
This CPU was suggested by Alistair [1] and others during the profile
design discussions. It consists of the bare 'rv64i' CPU with rva22u64
enabled by default, like an alias of '-cpu rv64i,rva22u64=true'.
Users now have an even easier way of consuming this user-mode profile by
doing '-cpu rva22u64'. Extensions can be enabled/disabled at will on top
of it.
We can boot Linux with this "user-mode" CPU by doing:
-cpu rva22u64,sv39=true,s=true,zifencei=true
[1] https://lore.kernel.org/qemu-riscv/CAKmqyKP7xzZ9Sx=-Lbx2Ob0qCfB7Z+JO944FQ2TQ+49mqo0q_Q@mail.gmail.com/
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
---
target/riscv/cpu-qom.h | 1 +
target/riscv/cpu.c | 17 +++++++++++++++++
target/riscv/tcg/tcg-cpu.c | 9 +++++++++
3 files changed, 27 insertions(+)
diff --git a/target/riscv/cpu-qom.h b/target/riscv/cpu-qom.h
index 4d1aa54311..12fe78fc52 100644
--- a/target/riscv/cpu-qom.h
+++ b/target/riscv/cpu-qom.h
@@ -35,6 +35,7 @@
#define TYPE_RISCV_CPU_BASE64 RISCV_CPU_TYPE_NAME("rv64")
#define TYPE_RISCV_CPU_BASE128 RISCV_CPU_TYPE_NAME("x-rv128")
#define TYPE_RISCV_CPU_RV64I RISCV_CPU_TYPE_NAME("rv64i")
+#define TYPE_RISCV_CPU_RVA22U64 RISCV_CPU_TYPE_NAME("rva22u64")
#define TYPE_RISCV_CPU_IBEX RISCV_CPU_TYPE_NAME("lowrisc-ibex")
#define TYPE_RISCV_CPU_SHAKTI_C RISCV_CPU_TYPE_NAME("shakti-c")
#define TYPE_RISCV_CPU_SIFIVE_E31 RISCV_CPU_TYPE_NAME("sifive-e31")
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
index b9057c8da2..a38d78b2d6 100644
--- a/target/riscv/cpu.c
+++ b/target/riscv/cpu.c
@@ -1576,6 +1576,15 @@ static Property riscv_cpu_properties[] = {
DEFINE_PROP_END_OF_LIST(),
};
+#if defined(TARGET_RISCV64)
+static void rva22u64_profile_cpu_init(Object *obj)
+{
+ rv64i_bare_cpu_init(obj);
+
+ RVA22U64.enabled = true;
+}
+#endif
+
static const gchar *riscv_gdb_arch_name(CPUState *cs)
{
RISCVCPU *cpu = RISCV_CPU(cs);
@@ -1866,6 +1875,13 @@ void riscv_cpu_list(void)
.instance_init = initfn \
}
+#define DEFINE_PROFILE_CPU(type_name, initfn) \
+ { \
+ .name = type_name, \
+ .parent = TYPE_RISCV_BARE_CPU, \
+ .instance_init = initfn \
+ }
+
static const TypeInfo riscv_cpu_type_infos[] = {
{
.name = TYPE_RISCV_CPU,
@@ -1910,6 +1926,7 @@ static const TypeInfo riscv_cpu_type_infos[] = {
DEFINE_VENDOR_CPU(TYPE_RISCV_CPU_VEYRON_V1, rv64_veyron_v1_cpu_init),
DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_BASE128, rv128_base_cpu_init),
DEFINE_BARE_CPU(TYPE_RISCV_CPU_RV64I, rv64i_bare_cpu_init),
+ DEFINE_PROFILE_CPU(TYPE_RISCV_CPU_RVA22U64, rva22u64_profile_cpu_init),
#endif
};
diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c
index 005d8be26b..04aedf3840 100644
--- a/target/riscv/tcg/tcg-cpu.c
+++ b/target/riscv/tcg/tcg-cpu.c
@@ -1095,6 +1095,15 @@ static void riscv_cpu_add_profiles(Object *cpu_obj)
object_property_add(cpu_obj, profile->name, "bool",
cpu_get_profile, cpu_set_profile,
NULL, (void *)profile);
+
+ /*
+ * CPUs might enable a profile right from the start.
+ * Enable its mandatory extensions right away in this
+ * case.
+ */
+ if (profile->enabled) {
+ object_property_set_bool(cpu_obj, profile->name, true, NULL);
+ }
}
}
--
2.43.0
^ permalink raw reply related [flat|nested] 48+ messages in thread
* [PATCH v13 19/26] target/riscv: implement svade
2023-12-18 12:53 [PATCH v13 00/26] riscv: RVA22 profiles support Daniel Henrique Barboza
` (17 preceding siblings ...)
2023-12-18 12:53 ` [PATCH v13 18/26] target/riscv: add 'rva22u64' CPU Daniel Henrique Barboza
@ 2023-12-18 12:53 ` Daniel Henrique Barboza
2024-01-04 22:59 ` Alistair Francis
2023-12-18 12:53 ` [PATCH v13 20/26] target/riscv: add priv ver restriction to profiles Daniel Henrique Barboza
` (8 subsequent siblings)
27 siblings, 1 reply; 48+ messages in thread
From: Daniel Henrique Barboza @ 2023-12-18 12:53 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-riscv, alistair.francis, bmeng, liwei1518, zhiwei_liu,
palmer, ajones, Daniel Henrique Barboza
'svade' is a RVA22S64 profile requirement, a profile we're going to add
shortly. It is a named feature (i.e. not a formal extension, not defined
in riscv,isa DT at this moment) defined in [1] as:
"Page-fault exceptions are raised when a page is accessed when A bit is
clear, or written when D bit is clear.".
As far as the spec goes, 'svade' is one of the two distinct modes of
handling PTE_A and PTE_D. The other way, i.e. update PTE_A/PTE_D when
they're cleared, is defined by the 'svadu' extension. Checking
cpu_helper.c, get_physical_address(), we can verify that QEMU is
compliant with that: we will update PTE_A/PTE_D if 'svadu' is enabled,
or throw a page-fault exception if 'svadu' isn't enabled.
So, as far as we're concerned, 'svade' translates to 'svadu must be
disabled'.
We'll implement it like 'zic64b': an internal flag that profiles can
enable. The flag will not be exposed to users.
[1] https://github.com/riscv/riscv-profiles/blob/main/profiles.adoc
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
---
target/riscv/cpu.c | 1 +
target/riscv/cpu_cfg.h | 1 +
target/riscv/tcg/tcg-cpu.c | 5 +++++
3 files changed, 7 insertions(+)
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
index a38d78b2d6..a76bc1b86a 100644
--- a/target/riscv/cpu.c
+++ b/target/riscv/cpu.c
@@ -1445,6 +1445,7 @@ const RISCVCPUMultiExtConfig riscv_cpu_experimental_exts[] = {
};
const RISCVCPUMultiExtConfig riscv_cpu_named_features[] = {
+ MULTI_EXT_CFG_BOOL("svade", svade, true),
MULTI_EXT_CFG_BOOL("zic64b", zic64b, true),
DEFINE_PROP_END_OF_LIST(),
diff --git a/target/riscv/cpu_cfg.h b/target/riscv/cpu_cfg.h
index 90f18eb601..46b06db68b 100644
--- a/target/riscv/cpu_cfg.h
+++ b/target/riscv/cpu_cfg.h
@@ -116,6 +116,7 @@ struct RISCVCPUConfig {
bool ext_smepmp;
bool rvv_ta_all_1s;
bool rvv_ma_all_1s;
+ bool svade;
bool zic64b;
uint32_t mvendorid;
diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c
index 04aedf3840..e395e2449e 100644
--- a/target/riscv/tcg/tcg-cpu.c
+++ b/target/riscv/tcg/tcg-cpu.c
@@ -188,6 +188,9 @@ static void riscv_cpu_enable_named_feat(RISCVCPU *cpu, uint32_t feat_offset)
cpu->cfg.cbop_blocksize = 64;
cpu->cfg.cboz_blocksize = 64;
break;
+ case CPU_CFG_OFFSET(svade):
+ cpu->cfg.ext_svadu = false;
+ break;
default:
g_assert_not_reached();
}
@@ -381,6 +384,8 @@ static void riscv_cpu_update_named_features(RISCVCPU *cpu)
cpu->cfg.zic64b = cpu->cfg.cbom_blocksize == 64 &&
cpu->cfg.cbop_blocksize == 64 &&
cpu->cfg.cboz_blocksize == 64;
+
+ cpu->cfg.svade = !cpu->cfg.ext_svadu;
}
static void riscv_cpu_validate_g(RISCVCPU *cpu)
--
2.43.0
^ permalink raw reply related [flat|nested] 48+ messages in thread
* [PATCH v13 20/26] target/riscv: add priv ver restriction to profiles
2023-12-18 12:53 [PATCH v13 00/26] riscv: RVA22 profiles support Daniel Henrique Barboza
` (18 preceding siblings ...)
2023-12-18 12:53 ` [PATCH v13 19/26] target/riscv: implement svade Daniel Henrique Barboza
@ 2023-12-18 12:53 ` Daniel Henrique Barboza
2024-01-04 23:02 ` Alistair Francis
2023-12-18 12:53 ` [PATCH v13 21/26] target/riscv/cpu.c: finalize satp_mode earlier Daniel Henrique Barboza
` (7 subsequent siblings)
27 siblings, 1 reply; 48+ messages in thread
From: Daniel Henrique Barboza @ 2023-12-18 12:53 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-riscv, alistair.francis, bmeng, liwei1518, zhiwei_liu,
palmer, ajones, Daniel Henrique Barboza
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>
---
target/riscv/cpu.c | 1 +
target/riscv/cpu.h | 2 ++
target/riscv/tcg/tcg-cpu.c | 31 +++++++++++++++++++++++++++++++
3 files changed, 34 insertions(+)
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
index a76bc1b86a..1ba85c6d1c 100644
--- a/target/riscv/cpu.c
+++ b/target/riscv/cpu.c
@@ -1537,6 +1537,7 @@ Property riscv_cpu_options[] = {
static RISCVCPUProfile RVA22U64 = {
.name = "rva22u64",
.misa_ext = RVI | RVM | RVA | RVF | RVD | RVC | RVU,
+ .priv_spec = RISCV_PROFILE_ATTR_UNUSED,
.ext_offsets = {
CPU_CFG_OFFSET(ext_zicsr), CPU_CFG_OFFSET(ext_zihintpause),
CPU_CFG_OFFSET(ext_zba), CPU_CFG_OFFSET(ext_zbb),
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
index 5ff629650d..1f34eda1e4 100644
--- a/target/riscv/cpu.h
+++ b/target/riscv/cpu.h
@@ -81,10 +81,12 @@ typedef struct riscv_cpu_profile {
uint32_t misa_ext;
bool enabled;
bool user_set;
+ int priv_spec;
const int32_t ext_offsets[];
} RISCVCPUProfile;
#define RISCV_PROFILE_EXT_LIST_END -1
+#define RISCV_PROFILE_ATTR_UNUSED -1
extern RISCVCPUProfile *riscv_profiles[];
diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c
index e395e2449e..4d25fc43d2 100644
--- a/target/riscv/tcg/tcg-cpu.c
+++ b/target/riscv/tcg/tcg-cpu.c
@@ -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,
const TranslationBlock *tb)
{
@@ -755,11 +769,24 @@ void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)
static void riscv_cpu_validate_profile(RISCVCPU *cpu,
RISCVCPUProfile *profile)
{
+ CPURISCVState *env = &cpu->env;
const char *warn_msg = "Profile %s mandates disabled extension %s";
bool send_warn = profile->user_set && profile->enabled;
bool profile_impl = true;
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++) {
uint32_t bit = misa_bits[i];
@@ -1048,6 +1075,10 @@ static void cpu_set_profile(Object *obj, Visitor *v, const char *name,
profile->user_set = true;
profile->enabled = value;
+ if (profile->enabled) {
+ cpu->env.priv_ver = profile->priv_spec;
+ }
+
for (i = 0; misa_bits[i] != 0; i++) {
uint32_t bit = misa_bits[i];
--
2.43.0
^ permalink raw reply related [flat|nested] 48+ messages in thread
* [PATCH v13 21/26] target/riscv/cpu.c: finalize satp_mode earlier
2023-12-18 12:53 [PATCH v13 00/26] riscv: RVA22 profiles support Daniel Henrique Barboza
` (19 preceding siblings ...)
2023-12-18 12:53 ` [PATCH v13 20/26] target/riscv: add priv ver restriction to profiles Daniel Henrique Barboza
@ 2023-12-18 12:53 ` Daniel Henrique Barboza
2024-01-04 23:02 ` Alistair Francis
2023-12-18 12:53 ` [PATCH v13 22/26] target/riscv/cpu.c: add riscv_cpu_is_32bit() Daniel Henrique Barboza
` (6 subsequent siblings)
27 siblings, 1 reply; 48+ messages in thread
From: Daniel Henrique Barboza @ 2023-12-18 12:53 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-riscv, alistair.francis, bmeng, liwei1518, zhiwei_liu,
palmer, ajones, Daniel Henrique Barboza
Profiles will need to validate satp_mode during their own finalize
methods. This will occur inside riscv_tcg_cpu_finalize_features() for
TCG. Given that satp_mode does not have any pre-req from the accelerator
finalize() method, it's safe to finalize it earlier.
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
---
target/riscv/cpu.c | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
index 1ba85c6d1c..6af1148cf5 100644
--- a/target/riscv/cpu.c
+++ b/target/riscv/cpu.c
@@ -1056,6 +1056,14 @@ void riscv_cpu_finalize_features(RISCVCPU *cpu, Error **errp)
{
Error *local_err = NULL;
+#ifndef CONFIG_USER_ONLY
+ riscv_cpu_satp_mode_finalize(cpu, &local_err);
+ if (local_err != NULL) {
+ error_propagate(errp, local_err);
+ return;
+ }
+#endif
+
/*
* KVM accel does not have a specialized finalize()
* callback because its extensions are validated
@@ -1068,14 +1076,6 @@ void riscv_cpu_finalize_features(RISCVCPU *cpu, Error **errp)
return;
}
}
-
-#ifndef CONFIG_USER_ONLY
- riscv_cpu_satp_mode_finalize(cpu, &local_err);
- if (local_err != NULL) {
- error_propagate(errp, local_err);
- return;
- }
-#endif
}
static void riscv_cpu_realize(DeviceState *dev, Error **errp)
--
2.43.0
^ permalink raw reply related [flat|nested] 48+ messages in thread
* [PATCH v13 22/26] target/riscv/cpu.c: add riscv_cpu_is_32bit()
2023-12-18 12:53 [PATCH v13 00/26] riscv: RVA22 profiles support Daniel Henrique Barboza
` (20 preceding siblings ...)
2023-12-18 12:53 ` [PATCH v13 21/26] target/riscv/cpu.c: finalize satp_mode earlier Daniel Henrique Barboza
@ 2023-12-18 12:53 ` Daniel Henrique Barboza
2024-01-04 23:04 ` Alistair Francis
2023-12-18 12:53 ` [PATCH v13 23/26] target/riscv: add satp_mode profile support Daniel Henrique Barboza
` (5 subsequent siblings)
27 siblings, 1 reply; 48+ messages in thread
From: Daniel Henrique Barboza @ 2023-12-18 12:53 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-riscv, alistair.francis, bmeng, liwei1518, zhiwei_liu,
palmer, ajones, Daniel Henrique Barboza,
Philippe Mathieu-Daudé
Next patch will need to retrieve if a given RISCVCPU is 32 or 64 bit.
The existing helper riscv_is_32bit() (hw/riscv/boot.c) will always check
the first CPU of a given hart array, not any given CPU.
Create a helper to retrieve the info for any given CPU, not the first
CPU of the hart array. The helper is using the same 32 bit check that
riscv_cpu_satp_mode_finalize() was doing.
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
target/riscv/cpu.c | 7 ++++++-
target/riscv/cpu.h | 1 +
2 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
index 6af1148cf5..1dea5db52d 100644
--- a/target/riscv/cpu.c
+++ b/target/riscv/cpu.c
@@ -53,6 +53,11 @@ const uint32_t misa_bits[] = {RVI, RVE, RVM, RVA, RVF, RVD, RVV,
#define BYTE(x) (x)
#endif
+bool riscv_cpu_is_32bit(RISCVCPU *cpu)
+{
+ return riscv_cpu_mxl(&cpu->env) == MXL_RV32;
+}
+
#define ISA_EXT_DATA_ENTRY(_name, _min_ver, _prop) \
{#_name, _min_ver, CPU_CFG_OFFSET(_prop)}
@@ -980,7 +985,7 @@ static void riscv_cpu_disas_set_info(CPUState *s, disassemble_info *info)
#ifndef CONFIG_USER_ONLY
static void riscv_cpu_satp_mode_finalize(RISCVCPU *cpu, Error **errp)
{
- bool rv32 = riscv_cpu_mxl(&cpu->env) == MXL_RV32;
+ bool rv32 = riscv_cpu_is_32bit(cpu);
uint8_t satp_mode_map_max, satp_mode_supported_max;
/* The CPU wants the OS to decide which satp mode to use */
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
index 1f34eda1e4..485d2da3c2 100644
--- a/target/riscv/cpu.h
+++ b/target/riscv/cpu.h
@@ -695,6 +695,7 @@ void cpu_get_tb_cpu_state(CPURISCVState *env, vaddr *pc,
uint64_t *cs_base, uint32_t *pflags);
void riscv_cpu_update_mask(CPURISCVState *env);
+bool riscv_cpu_is_32bit(RISCVCPU *cpu);
RISCVException riscv_csrrw(CPURISCVState *env, int csrno,
target_ulong *ret_value,
--
2.43.0
^ permalink raw reply related [flat|nested] 48+ messages in thread
* [PATCH v13 23/26] target/riscv: add satp_mode profile support
2023-12-18 12:53 [PATCH v13 00/26] riscv: RVA22 profiles support Daniel Henrique Barboza
` (21 preceding siblings ...)
2023-12-18 12:53 ` [PATCH v13 22/26] target/riscv/cpu.c: add riscv_cpu_is_32bit() Daniel Henrique Barboza
@ 2023-12-18 12:53 ` Daniel Henrique Barboza
2024-01-04 23:07 ` Alistair Francis
2023-12-18 12:53 ` [PATCH v13 24/26] target/riscv: add 'parent' in profile description Daniel Henrique Barboza
` (4 subsequent siblings)
27 siblings, 1 reply; 48+ messages in thread
From: Daniel Henrique Barboza @ 2023-12-18 12:53 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-riscv, alistair.francis, bmeng, liwei1518, zhiwei_liu,
palmer, ajones, Daniel Henrique Barboza
'satp_mode' is a requirement for supervisor profiles like RVA22S64.
User-mode/application profiles like RVA22U64 doesn't care.
Add 'satp_mode' to the profile description. If a profile requires it,
set it during cpu_set_profile(). We'll also check it during finalize()
to validate if the running config implements the profile.
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
---
target/riscv/cpu.c | 1 +
target/riscv/cpu.h | 1 +
target/riscv/tcg/tcg-cpu.c | 40 ++++++++++++++++++++++++++++++++++++++
3 files changed, 42 insertions(+)
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
index 1dea5db52d..6795f5da41 100644
--- a/target/riscv/cpu.c
+++ b/target/riscv/cpu.c
@@ -1543,6 +1543,7 @@ static RISCVCPUProfile RVA22U64 = {
.name = "rva22u64",
.misa_ext = RVI | RVM | RVA | RVF | RVD | RVC | RVU,
.priv_spec = RISCV_PROFILE_ATTR_UNUSED,
+ .satp_mode = RISCV_PROFILE_ATTR_UNUSED,
.ext_offsets = {
CPU_CFG_OFFSET(ext_zicsr), CPU_CFG_OFFSET(ext_zihintpause),
CPU_CFG_OFFSET(ext_zba), CPU_CFG_OFFSET(ext_zbb),
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
index 485d2da3c2..6c5fceb5f5 100644
--- a/target/riscv/cpu.h
+++ b/target/riscv/cpu.h
@@ -82,6 +82,7 @@ typedef struct riscv_cpu_profile {
bool enabled;
bool user_set;
int priv_spec;
+ int satp_mode;
const int32_t ext_offsets[];
} RISCVCPUProfile;
diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c
index 4d25fc43d2..152f95718b 100644
--- a/target/riscv/tcg/tcg-cpu.c
+++ b/target/riscv/tcg/tcg-cpu.c
@@ -766,6 +766,31 @@ void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)
riscv_cpu_disable_priv_spec_isa_exts(cpu);
}
+#ifndef CONFIG_USER_ONLY
+static bool riscv_cpu_validate_profile_satp(RISCVCPU *cpu,
+ RISCVCPUProfile *profile,
+ bool send_warn)
+{
+ int satp_max = satp_mode_max_from_map(cpu->cfg.satp_mode.supported);
+
+ if (profile->satp_mode > satp_max) {
+ if (send_warn) {
+ bool is_32bit = riscv_cpu_is_32bit(cpu);
+ const char *req_satp = satp_mode_str(profile->satp_mode, is_32bit);
+ const char *cur_satp = satp_mode_str(satp_max, is_32bit);
+
+ warn_report("Profile %s requires satp mode %s, "
+ "but satp mode %s was set", profile->name,
+ req_satp, cur_satp);
+ }
+
+ return false;
+ }
+
+ return true;
+}
+#endif
+
static void riscv_cpu_validate_profile(RISCVCPU *cpu,
RISCVCPUProfile *profile)
{
@@ -775,6 +800,13 @@ static void riscv_cpu_validate_profile(RISCVCPU *cpu,
bool profile_impl = true;
int i;
+#ifndef CONFIG_USER_ONLY
+ if (profile->satp_mode != RISCV_PROFILE_ATTR_UNUSED) {
+ profile_impl = riscv_cpu_validate_profile_satp(cpu, profile,
+ send_warn);
+ }
+#endif
+
if (profile->priv_spec != RISCV_PROFILE_ATTR_UNUSED &&
profile->priv_spec != env->priv_ver) {
profile_impl = false;
@@ -1079,6 +1111,14 @@ static void cpu_set_profile(Object *obj, Visitor *v, const char *name,
cpu->env.priv_ver = profile->priv_spec;
}
+#ifndef CONFIG_USER_ONLY
+ if (profile->satp_mode != RISCV_PROFILE_ATTR_UNUSED) {
+ const char *satp_prop = satp_mode_str(profile->satp_mode,
+ riscv_cpu_is_32bit(cpu));
+ object_property_set_bool(obj, satp_prop, profile->enabled, NULL);
+ }
+#endif
+
for (i = 0; misa_bits[i] != 0; i++) {
uint32_t bit = misa_bits[i];
--
2.43.0
^ permalink raw reply related [flat|nested] 48+ messages in thread
* [PATCH v13 24/26] target/riscv: add 'parent' in profile description
2023-12-18 12:53 [PATCH v13 00/26] riscv: RVA22 profiles support Daniel Henrique Barboza
` (22 preceding siblings ...)
2023-12-18 12:53 ` [PATCH v13 23/26] target/riscv: add satp_mode profile support Daniel Henrique Barboza
@ 2023-12-18 12:53 ` Daniel Henrique Barboza
2024-01-05 2:21 ` Alistair Francis
2023-12-18 12:53 ` [PATCH v13 25/26] target/riscv: add RVA22S64 profile Daniel Henrique Barboza
` (3 subsequent siblings)
27 siblings, 1 reply; 48+ messages in thread
From: Daniel Henrique Barboza @ 2023-12-18 12:53 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-riscv, alistair.francis, bmeng, liwei1518, zhiwei_liu,
palmer, ajones, Daniel Henrique Barboza
Certain S-mode profiles, like RVA22S64 and RVA23S64, mandate all the
mandatory extensions of their respective U-mode profiles. RVA22S64
includes all mandatory extensions of RVA22U64, and the same happens with
RVA23 profiles.
Add a 'parent' field to allow profiles to enable other profiles. This
will allow us to describe S-mode profiles by specifying their parent
U-mode profile, then adding just the S-mode specific extensions.
We're naming the field 'parent' to consider the possibility of other
uses (e.g. a s-mode profile including a previous s-mode profile) in the
future.
Suggested-by: Andrew Jones <ajones@ventanamicro.com>
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
---
target/riscv/cpu.c | 1 +
target/riscv/cpu.h | 1 +
target/riscv/tcg/tcg-cpu.c | 14 +++++++++++++-
3 files changed, 15 insertions(+), 1 deletion(-)
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
index 6795f5da41..aa33e7a1cf 100644
--- a/target/riscv/cpu.c
+++ b/target/riscv/cpu.c
@@ -1540,6 +1540,7 @@ Property riscv_cpu_options[] = {
* having a cfg offset) at this moment.
*/
static RISCVCPUProfile RVA22U64 = {
+ .parent = NULL,
.name = "rva22u64",
.misa_ext = RVI | RVM | RVA | RVF | RVD | RVC | RVU,
.priv_spec = RISCV_PROFILE_ATTR_UNUSED,
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
index 6c5fceb5f5..44fb0a9ca8 100644
--- a/target/riscv/cpu.h
+++ b/target/riscv/cpu.h
@@ -77,6 +77,7 @@ const char *riscv_get_misa_ext_description(uint32_t bit);
#define CPU_CFG_OFFSET(_prop) offsetof(struct RISCVCPUConfig, _prop)
typedef struct riscv_cpu_profile {
+ struct riscv_cpu_profile *parent;
const char *name;
uint32_t misa_ext;
bool enabled;
diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c
index 152f95718b..6284d36809 100644
--- a/target/riscv/tcg/tcg-cpu.c
+++ b/target/riscv/tcg/tcg-cpu.c
@@ -797,7 +797,7 @@ static void riscv_cpu_validate_profile(RISCVCPU *cpu,
CPURISCVState *env = &cpu->env;
const char *warn_msg = "Profile %s mandates disabled extension %s";
bool send_warn = profile->user_set && profile->enabled;
- bool profile_impl = true;
+ bool parent_enabled, profile_impl = true;
int i;
#ifndef CONFIG_USER_ONLY
@@ -850,6 +850,13 @@ static void riscv_cpu_validate_profile(RISCVCPU *cpu,
}
profile->enabled = profile_impl;
+
+ if (profile->parent != NULL) {
+ parent_enabled = object_property_get_bool(OBJECT(cpu),
+ profile->parent->name,
+ NULL);
+ profile->enabled = profile->enabled && parent_enabled;
+ }
}
static void riscv_cpu_validate_profiles(RISCVCPU *cpu)
@@ -1107,6 +1114,11 @@ static void cpu_set_profile(Object *obj, Visitor *v, const char *name,
profile->user_set = true;
profile->enabled = value;
+ if (profile->parent != NULL) {
+ object_property_set_bool(obj, profile->parent->name,
+ profile->enabled, NULL);
+ }
+
if (profile->enabled) {
cpu->env.priv_ver = profile->priv_spec;
}
--
2.43.0
^ permalink raw reply related [flat|nested] 48+ messages in thread
* [PATCH v13 25/26] target/riscv: add RVA22S64 profile
2023-12-18 12:53 [PATCH v13 00/26] riscv: RVA22 profiles support Daniel Henrique Barboza
` (23 preceding siblings ...)
2023-12-18 12:53 ` [PATCH v13 24/26] target/riscv: add 'parent' in profile description Daniel Henrique Barboza
@ 2023-12-18 12:53 ` Daniel Henrique Barboza
2024-01-05 2:24 ` Alistair Francis
2023-12-18 12:53 ` [PATCH v13 26/26] target/riscv: add rva22s64 cpu Daniel Henrique Barboza
` (2 subsequent siblings)
27 siblings, 1 reply; 48+ messages in thread
From: Daniel Henrique Barboza @ 2023-12-18 12:53 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-riscv, alistair.francis, bmeng, liwei1518, zhiwei_liu,
palmer, ajones, Daniel Henrique Barboza
The RVA22S64 profile consists of the following:
- all mandatory extensions of RVA22U64;
- priv spec v1.12.0;
- satp mode sv39;
- Ssccptr, a cache related named feature that we're assuming always
enable since we don't implement a cache;
- Other named features already implemented: Sstvecd, Sstvala,
Sscounterenw;
- the new Svade named feature that was recently added.
Most of the work is already done, so this patch is enough to implement
the profile.
After this patch, the 'rva22s64' user flag alone can be used with the
rva64i CPU to boot Linux:
-cpu rv64i,rva22s64=true
This is the /proc/cpuinfo with this profile enabled:
# cat /proc/cpuinfo
processor : 0
hart : 0
isa : rv64imafdc_zicbom_zicbop_zicboz_zicntr_zicsr_zifencei_zihintpause_zihpm_zfhmin_zca_zcd_zba_zbb_zbs_zkt_svinval_svpbmt
mmu : sv39
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
---
target/riscv/cpu.c | 32 ++++++++++++++++++++++++++++++++
1 file changed, 32 insertions(+)
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
index aa33e7a1cf..f57a9ee298 100644
--- a/target/riscv/cpu.c
+++ b/target/riscv/cpu.c
@@ -1560,8 +1560,40 @@ static RISCVCPUProfile RVA22U64 = {
}
};
+/*
+ * As with RVA22U64, RVA22S64 also defines 'named features'.
+ *
+ * Cache related features that we consider enabled since we don't
+ * implement cache: Ssccptr
+ *
+ * Other named features that we already implement: Sstvecd, Sstvala,
+ * Sscounterenw
+ *
+ * Named features that we need to enable: svade
+ *
+ * The remaining features/extensions comes from RVA22U64.
+ */
+static RISCVCPUProfile RVA22S64 = {
+ .parent = &RVA22U64,
+ .name = "rva22s64",
+ .misa_ext = RVS,
+ .priv_spec = PRIV_VERSION_1_12_0,
+ .satp_mode = VM_1_10_SV39,
+ .ext_offsets = {
+ /* rva22s64 exts */
+ CPU_CFG_OFFSET(ext_zifencei), CPU_CFG_OFFSET(ext_svpbmt),
+ CPU_CFG_OFFSET(ext_svinval),
+
+ /* rva22s64 named features */
+ CPU_CFG_OFFSET(svade),
+
+ RISCV_PROFILE_EXT_LIST_END
+ }
+};
+
RISCVCPUProfile *riscv_profiles[] = {
&RVA22U64,
+ &RVA22S64,
NULL,
};
--
2.43.0
^ permalink raw reply related [flat|nested] 48+ messages in thread
* [PATCH v13 26/26] target/riscv: add rva22s64 cpu
2023-12-18 12:53 [PATCH v13 00/26] riscv: RVA22 profiles support Daniel Henrique Barboza
` (24 preceding siblings ...)
2023-12-18 12:53 ` [PATCH v13 25/26] target/riscv: add RVA22S64 profile Daniel Henrique Barboza
@ 2023-12-18 12:53 ` Daniel Henrique Barboza
2024-01-05 2:25 ` Alistair Francis
2024-01-02 11:40 ` [PATCH v13 00/26] riscv: RVA22 profiles support Daniel Henrique Barboza
2024-01-05 2:39 ` Alistair Francis
27 siblings, 1 reply; 48+ messages in thread
From: Daniel Henrique Barboza @ 2023-12-18 12:53 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-riscv, alistair.francis, bmeng, liwei1518, zhiwei_liu,
palmer, ajones, Daniel Henrique Barboza
Add a new profile CPU 'rva22s64' to work as an alias of
-cpu rv64i,rva22s64
Like the existing rva22u64 CPU already does with the RVA22U64 profile.
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
---
target/riscv/cpu-qom.h | 1 +
target/riscv/cpu.c | 8 ++++++++
2 files changed, 9 insertions(+)
diff --git a/target/riscv/cpu-qom.h b/target/riscv/cpu-qom.h
index 12fe78fc52..9219c2fcc3 100644
--- a/target/riscv/cpu-qom.h
+++ b/target/riscv/cpu-qom.h
@@ -36,6 +36,7 @@
#define TYPE_RISCV_CPU_BASE128 RISCV_CPU_TYPE_NAME("x-rv128")
#define TYPE_RISCV_CPU_RV64I RISCV_CPU_TYPE_NAME("rv64i")
#define TYPE_RISCV_CPU_RVA22U64 RISCV_CPU_TYPE_NAME("rva22u64")
+#define TYPE_RISCV_CPU_RVA22S64 RISCV_CPU_TYPE_NAME("rva22s64")
#define TYPE_RISCV_CPU_IBEX RISCV_CPU_TYPE_NAME("lowrisc-ibex")
#define TYPE_RISCV_CPU_SHAKTI_C RISCV_CPU_TYPE_NAME("shakti-c")
#define TYPE_RISCV_CPU_SIFIVE_E31 RISCV_CPU_TYPE_NAME("sifive-e31")
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
index f57a9ee298..959c97c869 100644
--- a/target/riscv/cpu.c
+++ b/target/riscv/cpu.c
@@ -1624,6 +1624,13 @@ static void rva22u64_profile_cpu_init(Object *obj)
RVA22U64.enabled = true;
}
+
+static void rva22s64_profile_cpu_init(Object *obj)
+{
+ rv64i_bare_cpu_init(obj);
+
+ RVA22S64.enabled = true;
+}
#endif
static const gchar *riscv_gdb_arch_name(CPUState *cs)
@@ -1968,6 +1975,7 @@ static const TypeInfo riscv_cpu_type_infos[] = {
DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_BASE128, rv128_base_cpu_init),
DEFINE_BARE_CPU(TYPE_RISCV_CPU_RV64I, rv64i_bare_cpu_init),
DEFINE_PROFILE_CPU(TYPE_RISCV_CPU_RVA22U64, rva22u64_profile_cpu_init),
+ DEFINE_PROFILE_CPU(TYPE_RISCV_CPU_RVA22S64, rva22s64_profile_cpu_init),
#endif
};
--
2.43.0
^ permalink raw reply related [flat|nested] 48+ messages in thread
* Re: [PATCH v13 00/26] riscv: RVA22 profiles support
2023-12-18 12:53 [PATCH v13 00/26] riscv: RVA22 profiles support Daniel Henrique Barboza
` (25 preceding siblings ...)
2023-12-18 12:53 ` [PATCH v13 26/26] target/riscv: add rva22s64 cpu Daniel Henrique Barboza
@ 2024-01-02 11:40 ` Daniel Henrique Barboza
2024-01-02 15:12 ` Andrew Jones
2024-01-05 2:39 ` Alistair Francis
27 siblings, 1 reply; 48+ messages in thread
From: Daniel Henrique Barboza @ 2024-01-02 11:40 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-riscv, alistair.francis, bmeng, liwei1518, zhiwei_liu,
palmer, ajones
Hi,
Drew brought to my attention the following post on the tech-unprivileged mailing
list:
"Architecture Review Committee meeting minutes, 12/19/23"
https://lists.riscv.org/g/tech-unprivileged/message/611
Second paragraph mentions:
"In response to some recent discussion in the Apps and Tools HC about how profiles should
be represented in GCC/LLVM, the ARC provides this answer: compilers should use a single parameter
for an ISA string. An ISA string begins with either a base ISA name (e.g. rv64i) or a profile name
(e.g. rva23u64) and is optionally followed by additional extensions (e.g. rv64imac_zicond or
rva23u64_zfh_zicond). If the ISA string begins with a profile name, it is equivalent to
replacing the profile name with its mandatory base ISA and its mandatory extensions; any
optional extensions in a profile must be explicitly named if their inclusion is desired.
ISAs are sets, and concatenating strings takes the union, so redundancy is legal (e.g.
rva23u64, rva23u64_zicsr, and rva23u64_zicsr_zicsr are all valid and equivalent)."
The takeaways from it:
- this implementation is compliant with how profiles are interpreted, i.e. a profile is
considered a set of the mandatory base ISA and mandatory extensions, and any additional/optional
extensions must be explicitly named;
- our ISA string format is also since we use the base ISA name + extensions format already.
This series don't change/add anything in this regard.
If we have enough demand for it, I can do a follow-up to add support for the ISA string
profile format. I.e. this:
$ build/qemu-system-riscv64 -M virt -cpu rva22s64 (...)
# cat /proc/device-tree/cpus/cpu@0/riscv,isa
rv64imafdc_zicbom_zicbop_zicboz_zicntr_zicsr_zifencei_zihintpause_zihpm_zfhmin_zca_zcd_zba_zbb_zbs_zkt_svinval_svpbmt
Would become this:
# cat /proc/device-tree/cpus/cpu@0/riscv,isa
rva22s64
Feel free to comment here if you, as a toolchain/application developer, thinks that this
ISA string profile format makes it easier to deal with profiles or if you're fine with
just parsing all the extensions in the current ISA string format.
All of this relies on this series being upstreamed first, of course. Alistair, let me
know if we're missing anything.
Thanks,
Daniel
On 12/18/23 09:53, Daniel Henrique Barboza wrote:
> Hi,
>
> This is a merge of the two profile series:
>
> "[PATCH for-9.0 v12 00/18] riscv: rv64i/rva22u64 CPUs, RVA22U64 profile support"
> "[PATCH for-9.0 v2 0/8] target/riscv: implement RVA22S64 profile"
>
> I'm sending them together since the second series is dependent on the first.
>
> Quick summary of the major features added:
>
> - A new rv64i CPU type. This is a CPU that has only RVI enabled;
>
> - 'rva22u64' and 'rva22s64' profile flags. They were designed to be used
> with the 'rv64i' CPU but can be used with other generic CPUs like
> rv64;
>
> - Two new profile CPUs: 'rva22u64' and 'rva22s64'. A profile CPU is an
> alias of '-cpu rv64,profile=on' and it's the most convenient way of
> using profiles. E.g to launch an rva22s64 'virt' machine:
>
> ./qemu-system-riscv64 -M virt -cpu rva22s64 (...)
>
> To test an application with an rva22u64 profile with linux-user mode:
>
> ./qemu-riscv64 -cpu rva22u64 (...)
>
>
> The series can also be fetch via:
>
> https://gitlab.com/danielhb/qemu/-/tree/rva22_v13
>
> Patches rebased on top of Alistair riscv-to-apply.next.
>
> All patches acked.
>
> Daniel Henrique Barboza (26):
> target/riscv: create TYPE_RISCV_VENDOR_CPU
> target/riscv/tcg: do not use "!generic" CPU checks
> target/riscv/tcg: update priv_ver on user_set extensions
> target/riscv: add rv64i CPU
> target/riscv: add zicbop extension flag
> target/riscv/tcg: add 'zic64b' support
> riscv-qmp-cmds.c: expose named features in cpu_model_expansion
> target/riscv: add rva22u64 profile definition
> target/riscv/kvm: add 'rva22u64' flag as unavailable
> target/riscv/tcg: add user flag for profile support
> target/riscv/tcg: add MISA user options hash
> target/riscv/tcg: add riscv_cpu_write_misa_bit()
> target/riscv/tcg: handle profile MISA bits
> target/riscv/tcg: add hash table insert helpers
> target/riscv/tcg: honor user choice for G MISA bits
> target/riscv/tcg: validate profiles during finalize
> riscv-qmp-cmds.c: add profile flags in cpu-model-expansion
> target/riscv: add 'rva22u64' CPU
> target/riscv: implement svade
> target/riscv: add priv ver restriction to profiles
> target/riscv/cpu.c: finalize satp_mode earlier
> target/riscv/cpu.c: add riscv_cpu_is_32bit()
> target/riscv: add satp_mode profile support
> target/riscv: add 'parent' in profile description
> target/riscv: add RVA22S64 profile
> target/riscv: add rva22s64 cpu
>
> hw/riscv/virt.c | 5 +
> target/riscv/cpu-qom.h | 5 +
> target/riscv/cpu.c | 201 +++++++++++++--
> target/riscv/cpu.h | 18 ++
> target/riscv/cpu_cfg.h | 4 +
> target/riscv/kvm/kvm-cpu.c | 7 +-
> target/riscv/riscv-qmp-cmds.c | 44 +++-
> target/riscv/tcg/tcg-cpu.c | 450 +++++++++++++++++++++++++++++++---
> 8 files changed, 672 insertions(+), 62 deletions(-)
>
^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: Re: [PATCH v13 00/26] riscv: RVA22 profiles support
2024-01-02 11:40 ` [PATCH v13 00/26] riscv: RVA22 profiles support Daniel Henrique Barboza
@ 2024-01-02 15:12 ` Andrew Jones
0 siblings, 0 replies; 48+ messages in thread
From: Andrew Jones @ 2024-01-02 15:12 UTC (permalink / raw)
To: Daniel Henrique Barboza
Cc: qemu-devel, qemu-riscv, alistair.francis, bmeng, liwei1518,
zhiwei_liu, palmer
On Tue, Jan 02, 2024 at 08:40:48AM -0300, Daniel Henrique Barboza wrote:
> Hi,
>
> Drew brought to my attention the following post on the tech-unprivileged mailing
> list:
>
> "Architecture Review Committee meeting minutes, 12/19/23"
> https://lists.riscv.org/g/tech-unprivileged/message/611
>
> Second paragraph mentions:
>
> "In response to some recent discussion in the Apps and Tools HC about how profiles should
> be represented in GCC/LLVM, the ARC provides this answer: compilers should use a single parameter
> for an ISA string. An ISA string begins with either a base ISA name (e.g. rv64i) or a profile name
> (e.g. rva23u64) and is optionally followed by additional extensions (e.g. rv64imac_zicond or
> rva23u64_zfh_zicond). If the ISA string begins with a profile name, it is equivalent to
> replacing the profile name with its mandatory base ISA and its mandatory extensions; any
> optional extensions in a profile must be explicitly named if their inclusion is desired.
> ISAs are sets, and concatenating strings takes the union, so redundancy is legal (e.g.
> rva23u64, rva23u64_zicsr, and rva23u64_zicsr_zicsr are all valid and equivalent)."
>
> The takeaways from it:
>
> - this implementation is compliant with how profiles are interpreted, i.e. a profile is
> considered a set of the mandatory base ISA and mandatory extensions, and any additional/optional
> extensions must be explicitly named;
Yes, it's good QEMU's RISC-V CPU model command line will be consistent
with the above paragraph (and then presumably with RISC-V compiler
"ISA strings")
>
> - our ISA string format is also since we use the base ISA name + extensions format already.
> This series don't change/add anything in this regard.
>
>
> If we have enough demand for it, I can do a follow-up to add support for the ISA string
> profile format. I.e. this:
>
> $ build/qemu-system-riscv64 -M virt -cpu rva22s64 (...)
>
> # cat /proc/device-tree/cpus/cpu@0/riscv,isa
> rv64imafdc_zicbom_zicbop_zicboz_zicntr_zicsr_zifencei_zihintpause_zihpm_zfhmin_zca_zcd_zba_zbb_zbs_zkt_svinval_svpbmt
>
> Would become this:
>
> # cat /proc/device-tree/cpus/cpu@0/riscv,isa
> rva22s64
We can't do that. The "ISA string" referred to in the above command line
isn't the ISA string specified in "ISA Extension Naming Conventions" of
the unpriv spec, it's the string given to the compiler to tell it which
extensions it may assume when generating instructions.
Thanks,
drew
^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: [PATCH v13 03/26] target/riscv/tcg: update priv_ver on user_set extensions
2023-12-18 12:53 ` [PATCH v13 03/26] target/riscv/tcg: update priv_ver on user_set extensions Daniel Henrique Barboza
@ 2024-01-04 4:02 ` Alistair Francis
0 siblings, 0 replies; 48+ messages in thread
From: Alistair Francis @ 2024-01-04 4:02 UTC (permalink / raw)
To: Daniel Henrique Barboza
Cc: qemu-devel, qemu-riscv, alistair.francis, bmeng, liwei1518,
zhiwei_liu, palmer, ajones
On Mon, Dec 18, 2023 at 10:58 PM Daniel Henrique Barboza
<dbarboza@ventanamicro.com> wrote:
>
> We'll add a new bare CPU type that won't have any default priv_ver. This
> means that the CPU will default to priv_ver = 0, i.e. 1.10.0.
>
> At the same we'll allow these CPUs to enable extensions at will, but
> then, if the extension has a priv_ver newer than 1.10, we'll end up
> disabling it. Users will then need to manually set priv_ver to something
> other than 1.10 to enable the extensions they want, which is not ideal.
>
> Change the setter() of extensions to allow user enabled extensions to
> bump the priv_ver of the CPU. This will make it convenient for users to
> enable extensions for CPUs that doesn't set a default priv_ver.
>
> This change does not affect any existing CPU: vendor CPUs does not allow
> extensions to be enabled, and generic CPUs are already set to priv_ver
> LATEST.
>
> Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
> Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> target/riscv/tcg/tcg-cpu.c | 32 ++++++++++++++++++++++++++++++++
> 1 file changed, 32 insertions(+)
>
> diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c
> index 7670120673..aee98db6f8 100644
> --- a/target/riscv/tcg/tcg-cpu.c
> +++ b/target/riscv/tcg/tcg-cpu.c
> @@ -114,6 +114,26 @@ static int cpu_cfg_ext_get_min_version(uint32_t ext_offset)
> g_assert_not_reached();
> }
>
> +static void cpu_bump_multi_ext_priv_ver(CPURISCVState *env,
> + uint32_t ext_offset)
> +{
> + int ext_priv_ver;
> +
> + if (env->priv_ver == PRIV_VERSION_LATEST) {
> + return;
> + }
> +
> + ext_priv_ver = cpu_cfg_ext_get_min_version(ext_offset);
> +
> + if (env->priv_ver < ext_priv_ver) {
> + /*
> + * Note: the 'priv_spec' command line option, if present,
> + * will take precedence over this priv_ver bump.
> + */
> + env->priv_ver = ext_priv_ver;
> + }
> +}
> +
> static void cpu_cfg_ext_auto_update(RISCVCPU *cpu, uint32_t ext_offset,
> bool value)
> {
> @@ -757,6 +777,14 @@ static void cpu_set_misa_ext_cfg(Object *obj, Visitor *v, const char *name,
> return;
> }
>
> + if (misa_bit == RVH && env->priv_ver < PRIV_VERSION_1_12_0) {
> + /*
> + * Note: the 'priv_spec' command line option, if present,
> + * will take precedence over this priv_ver bump.
> + */
> + env->priv_ver = PRIV_VERSION_1_12_0;
> + }
> +
> env->misa_ext |= misa_bit;
> env->misa_ext_mask |= misa_bit;
> } else {
> @@ -886,6 +914,10 @@ static void cpu_set_multi_ext_cfg(Object *obj, Visitor *v, const char *name,
> return;
> }
>
> + if (value) {
> + cpu_bump_multi_ext_priv_ver(&cpu->env, multi_ext_cfg->offset);
> + }
> +
> isa_ext_update_enabled(cpu, multi_ext_cfg->offset, value);
> }
>
> --
> 2.43.0
>
>
^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: [PATCH v13 04/26] target/riscv: add rv64i CPU
2023-12-18 12:53 ` [PATCH v13 04/26] target/riscv: add rv64i CPU Daniel Henrique Barboza
@ 2024-01-04 4:11 ` Alistair Francis
0 siblings, 0 replies; 48+ messages in thread
From: Alistair Francis @ 2024-01-04 4:11 UTC (permalink / raw)
To: Daniel Henrique Barboza
Cc: qemu-devel, qemu-riscv, alistair.francis, bmeng, liwei1518,
zhiwei_liu, palmer, ajones
On Mon, Dec 18, 2023 at 10:56 PM Daniel Henrique Barboza
<dbarboza@ventanamicro.com> wrote:
>
> We don't have any form of a 'bare bones' CPU. rv64, our default CPUs,
> comes with a lot of defaults. This is fine for most regular uses but
> it's not suitable when more control of what is actually loaded in the
> CPU is required.
>
> A bare-bones CPU would be annoying to deal with if not by profile
> support, a way to load a multitude of extensions with a single flag.
> Profile support is going to be implemented shortly, so let's add a CPU
> for it.
>
> The new 'rv64i' CPU will have only RVI loaded. It is inspired in the
> profile specification that dictates, for RVA22U64 [1]:
>
> "RVA22U64 Mandatory Base
> RV64I is the mandatory base ISA for RVA22U64"
>
> And so it seems that RV64I is the mandatory base ISA for all profiles
> listed in [1], making it an ideal CPU to use with profile support.
>
> rv64i is a CPU of type TYPE_RISCV_BARE_CPU. It has a mix of features
> from pre-existent CPUs:
>
> - it allows extensions to be enabled, like generic CPUs;
> - it will not inherit extension defaults, like vendor CPUs.
>
> This is the minimum extension set to boot OpenSBI and buildroot using
> rv64i:
>
> ./build/qemu-system-riscv64 -nographic -M virt \
> -cpu rv64i,sv39=true,g=true,c=true,s=true,u=true
>
> Our minimal riscv,isa in this case will be:
>
> # cat /proc/device-tree/cpus/cpu@0/riscv,isa
> rv64imafdc_zicntr_zicsr_zifencei_zihpm_zca_zcd#
>
> [1] https://github.com/riscv/riscv-profiles/blob/main/profiles.adoc
>
> Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
> Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> target/riscv/cpu-qom.h | 2 ++
> target/riscv/cpu.c | 46 ++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 48 insertions(+)
>
> diff --git a/target/riscv/cpu-qom.h b/target/riscv/cpu-qom.h
> index ca7dd509e3..4d1aa54311 100644
> --- a/target/riscv/cpu-qom.h
> +++ b/target/riscv/cpu-qom.h
> @@ -24,6 +24,7 @@
> #define TYPE_RISCV_CPU "riscv-cpu"
> #define TYPE_RISCV_DYNAMIC_CPU "riscv-dynamic-cpu"
> #define TYPE_RISCV_VENDOR_CPU "riscv-vendor-cpu"
> +#define TYPE_RISCV_BARE_CPU "riscv-bare-cpu"
>
> #define RISCV_CPU_TYPE_SUFFIX "-" TYPE_RISCV_CPU
> #define RISCV_CPU_TYPE_NAME(name) (name RISCV_CPU_TYPE_SUFFIX)
> @@ -33,6 +34,7 @@
> #define TYPE_RISCV_CPU_BASE32 RISCV_CPU_TYPE_NAME("rv32")
> #define TYPE_RISCV_CPU_BASE64 RISCV_CPU_TYPE_NAME("rv64")
> #define TYPE_RISCV_CPU_BASE128 RISCV_CPU_TYPE_NAME("x-rv128")
> +#define TYPE_RISCV_CPU_RV64I RISCV_CPU_TYPE_NAME("rv64i")
> #define TYPE_RISCV_CPU_IBEX RISCV_CPU_TYPE_NAME("lowrisc-ibex")
> #define TYPE_RISCV_CPU_SHAKTI_C RISCV_CPU_TYPE_NAME("shakti-c")
> #define TYPE_RISCV_CPU_SIFIVE_E31 RISCV_CPU_TYPE_NAME("sifive-e31")
> diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
> index bb91bcacee..34102f6869 100644
> --- a/target/riscv/cpu.c
> +++ b/target/riscv/cpu.c
> @@ -370,6 +370,17 @@ static void set_satp_mode_max_supported(RISCVCPU *cpu,
> /* Set the satp mode to the max supported */
> static void set_satp_mode_default_map(RISCVCPU *cpu)
> {
> + /*
> + * Bare CPUs do not default to the max available.
> + * Users must set a valid satp_mode in the command
> + * line.
> + */
> + if (object_dynamic_cast(OBJECT(cpu), TYPE_RISCV_BARE_CPU) != NULL) {
> + warn_report("No satp mode set. Defaulting to 'bare'");
> + cpu->cfg.satp_mode.map = (1 << VM_1_10_MBARE);
> + return;
> + }
> +
> cpu->cfg.satp_mode.map = cpu->cfg.satp_mode.supported;
> }
> #endif
> @@ -552,6 +563,28 @@ static void rv128_base_cpu_init(Object *obj)
> set_satp_mode_max_supported(RISCV_CPU(obj), VM_1_10_SV57);
> #endif
> }
> +
> +static void rv64i_bare_cpu_init(Object *obj)
> +{
> + CPURISCVState *env = &RISCV_CPU(obj)->env;
> + riscv_cpu_set_misa(env, MXL_RV64, RVI);
> +
> + /* Remove the defaults from the parent class */
> + RISCV_CPU(obj)->cfg.ext_zicntr = false;
> + RISCV_CPU(obj)->cfg.ext_zihpm = false;
> +
> + /* Set to QEMU's first supported priv version */
> + env->priv_ver = PRIV_VERSION_1_10_0;
> +
> + /*
> + * Support all available satp_mode settings. The default
> + * value will be set to MBARE if the user doesn't set
> + * satp_mode manually (see set_satp_mode_default()).
> + */
> +#ifndef CONFIG_USER_ONLY
> + set_satp_mode_max_supported(RISCV_CPU(obj), VM_1_10_SV64);
> +#endif
> +}
> #else
> static void rv32_base_cpu_init(Object *obj)
> {
> @@ -1785,6 +1818,13 @@ void riscv_cpu_list(void)
> .instance_init = initfn \
> }
>
> +#define DEFINE_BARE_CPU(type_name, initfn) \
> + { \
> + .name = type_name, \
> + .parent = TYPE_RISCV_BARE_CPU, \
> + .instance_init = initfn \
> + }
> +
> static const TypeInfo riscv_cpu_type_infos[] = {
> {
> .name = TYPE_RISCV_CPU,
> @@ -1807,6 +1847,11 @@ static const TypeInfo riscv_cpu_type_infos[] = {
> .parent = TYPE_RISCV_CPU,
> .abstract = true,
> },
> + {
> + .name = TYPE_RISCV_BARE_CPU,
> + .parent = TYPE_RISCV_CPU,
> + .abstract = true,
> + },
> DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_ANY, riscv_any_cpu_init),
> DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_MAX, riscv_max_cpu_init),
> #if defined(TARGET_RISCV32)
> @@ -1823,6 +1868,7 @@ static const TypeInfo riscv_cpu_type_infos[] = {
> DEFINE_VENDOR_CPU(TYPE_RISCV_CPU_THEAD_C906, rv64_thead_c906_cpu_init),
> DEFINE_VENDOR_CPU(TYPE_RISCV_CPU_VEYRON_V1, rv64_veyron_v1_cpu_init),
> DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_BASE128, rv128_base_cpu_init),
> + DEFINE_BARE_CPU(TYPE_RISCV_CPU_RV64I, rv64i_bare_cpu_init),
> #endif
> };
>
> --
> 2.43.0
>
>
^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: [PATCH v13 05/26] target/riscv: add zicbop extension flag
2023-12-18 12:53 ` [PATCH v13 05/26] target/riscv: add zicbop extension flag Daniel Henrique Barboza
@ 2024-01-04 4:12 ` Alistair Francis
0 siblings, 0 replies; 48+ messages in thread
From: Alistair Francis @ 2024-01-04 4:12 UTC (permalink / raw)
To: Daniel Henrique Barboza
Cc: qemu-devel, qemu-riscv, alistair.francis, bmeng, liwei1518,
zhiwei_liu, palmer, ajones
On Mon, Dec 18, 2023 at 10:54 PM Daniel Henrique Barboza
<dbarboza@ventanamicro.com> wrote:
>
> QEMU already implements zicbom (Cache Block Management Operations) and
> zicboz (Cache Block Zero Operations). Commit 59cb29d6a5 ("target/riscv:
> add Zicbop cbo.prefetch{i, r, m} placeholder") added placeholders for
> what would be the instructions for zicbop (Cache Block Prefetch
> Operations), which are now no-ops.
>
> The RVA22U64 profile mandates zicbop, which means that applications that
> run with this profile might expect zicbop to be present in the riscv,isa
> DT and might behave badly if it's absent.
>
> Adding zicbop as an extension will make our future RVA22U64
> implementation more in line with what userspace expects and, if/when
> cache block prefetch operations became relevant to QEMU, we already have
> the extension flag to turn then on/off as needed.
>
> Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
> Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> hw/riscv/virt.c | 5 +++++
> target/riscv/cpu.c | 3 +++
> target/riscv/cpu_cfg.h | 2 ++
> 3 files changed, 10 insertions(+)
>
> diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
> index d2eac24156..da650865e5 100644
> --- a/hw/riscv/virt.c
> +++ b/hw/riscv/virt.c
> @@ -273,6 +273,11 @@ static void create_fdt_socket_cpus(RISCVVirtState *s, int socket,
> cpu_ptr->cfg.cboz_blocksize);
> }
>
> + if (cpu_ptr->cfg.ext_zicbop) {
> + qemu_fdt_setprop_cell(ms->fdt, cpu_name, "riscv,cbop-block-size",
> + cpu_ptr->cfg.cbop_blocksize);
> + }
> +
> qemu_fdt_setprop_string(ms->fdt, cpu_name, "compatible", "riscv");
> qemu_fdt_setprop_string(ms->fdt, cpu_name, "status", "okay");
> qemu_fdt_setprop_cell(ms->fdt, cpu_name, "reg",
> diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
> index 34102f6869..86e3514cc8 100644
> --- a/target/riscv/cpu.c
> +++ b/target/riscv/cpu.c
> @@ -78,6 +78,7 @@ const uint32_t misa_bits[] = {RVI, RVE, RVM, RVA, RVF, RVD, RVV,
> */
> const RISCVIsaExtData isa_edata_arr[] = {
> ISA_EXT_DATA_ENTRY(zicbom, PRIV_VERSION_1_12_0, ext_zicbom),
> + ISA_EXT_DATA_ENTRY(zicbop, PRIV_VERSION_1_12_0, ext_zicbop),
> ISA_EXT_DATA_ENTRY(zicboz, PRIV_VERSION_1_12_0, ext_zicboz),
> ISA_EXT_DATA_ENTRY(zicond, PRIV_VERSION_1_12_0, ext_zicond),
> ISA_EXT_DATA_ENTRY(zicntr, PRIV_VERSION_1_12_0, ext_zicntr),
> @@ -1376,6 +1377,7 @@ const RISCVCPUMultiExtConfig riscv_cpu_extensions[] = {
> MULTI_EXT_CFG_BOOL("zhinxmin", ext_zhinxmin, false),
>
> MULTI_EXT_CFG_BOOL("zicbom", ext_zicbom, true),
> + MULTI_EXT_CFG_BOOL("zicbop", ext_zicbop, true),
> MULTI_EXT_CFG_BOOL("zicboz", ext_zicboz, true),
>
> MULTI_EXT_CFG_BOOL("zmmul", ext_zmmul, false),
> @@ -1510,6 +1512,7 @@ Property riscv_cpu_options[] = {
> DEFINE_PROP_UINT16("elen", RISCVCPU, cfg.elen, 64),
>
> DEFINE_PROP_UINT16("cbom_blocksize", RISCVCPU, cfg.cbom_blocksize, 64),
> + DEFINE_PROP_UINT16("cbop_blocksize", RISCVCPU, cfg.cbop_blocksize, 64),
> DEFINE_PROP_UINT16("cboz_blocksize", RISCVCPU, cfg.cboz_blocksize, 64),
>
> DEFINE_PROP_END_OF_LIST(),
> diff --git a/target/riscv/cpu_cfg.h b/target/riscv/cpu_cfg.h
> index f4605fb190..bd2ff87cc8 100644
> --- a/target/riscv/cpu_cfg.h
> +++ b/target/riscv/cpu_cfg.h
> @@ -65,6 +65,7 @@ struct RISCVCPUConfig {
> bool ext_zicntr;
> bool ext_zicsr;
> bool ext_zicbom;
> + bool ext_zicbop;
> bool ext_zicboz;
> bool ext_zicond;
> bool ext_zihintntl;
> @@ -142,6 +143,7 @@ struct RISCVCPUConfig {
> uint16_t vlen;
> uint16_t elen;
> uint16_t cbom_blocksize;
> + uint16_t cbop_blocksize;
> uint16_t cboz_blocksize;
> bool mmu;
> bool pmp;
> --
> 2.43.0
>
>
^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: [PATCH v13 06/26] target/riscv/tcg: add 'zic64b' support
2023-12-18 12:53 ` [PATCH v13 06/26] target/riscv/tcg: add 'zic64b' support Daniel Henrique Barboza
@ 2024-01-04 5:00 ` Alistair Francis
0 siblings, 0 replies; 48+ messages in thread
From: Alistair Francis @ 2024-01-04 5:00 UTC (permalink / raw)
To: Daniel Henrique Barboza
Cc: qemu-devel, qemu-riscv, alistair.francis, bmeng, liwei1518,
zhiwei_liu, palmer, ajones
On Mon, Dec 18, 2023 at 10:54 PM Daniel Henrique Barboza
<dbarboza@ventanamicro.com> wrote:
>
> zic64b is defined in the RVA22U64 profile [1] as a named feature for
> "Cache blocks must be 64 bytes in size, naturally aligned in the address
> space". It's a fantasy name for 64 bytes cache blocks. The RVA22U64
> profile mandates this feature, meaning that applications using this
> profile expects 64 bytes cache blocks.
>
> To make the upcoming RVA22U64 implementation complete, we'll zic64b as
> a 'named feature', not a regular extension. This means that:
>
> - it won't be exposed to users;
> - it won't be written in riscv,isa.
>
> This will be extended to other named extensions in the future, so we're
> creating some common boilerplate for them as well.
>
> zic64b is default to 'true' since we're already using 64 bytes blocks.
> If any cache block size (cbo{m,p,z}_blocksize) is changed to something
> different than 64, zic64b is set to 'false'.
>
> Our profile implementation will then be able to check the current state
> of zic64b and take the appropriate action (e.g. throw a warning).
>
> [1] https://github.com/riscv/riscv-profiles/releases/download/v1.0/profiles.pdf
>
> Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
> Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> target/riscv/cpu.c | 6 ++++++
> target/riscv/cpu.h | 1 +
> target/riscv/cpu_cfg.h | 1 +
> target/riscv/tcg/tcg-cpu.c | 26 ++++++++++++++++++++++++++
> 4 files changed, 34 insertions(+)
>
> diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
> index 86e3514cc8..b2e539f807 100644
> --- a/target/riscv/cpu.c
> +++ b/target/riscv/cpu.c
> @@ -1444,6 +1444,12 @@ const RISCVCPUMultiExtConfig riscv_cpu_experimental_exts[] = {
> DEFINE_PROP_END_OF_LIST(),
> };
>
> +const RISCVCPUMultiExtConfig riscv_cpu_named_features[] = {
> + MULTI_EXT_CFG_BOOL("zic64b", zic64b, true),
> +
> + DEFINE_PROP_END_OF_LIST(),
> +};
> +
> /* Deprecated entries marked for future removal */
> const RISCVCPUMultiExtConfig riscv_cpu_deprecated_exts[] = {
> MULTI_EXT_CFG_BOOL("Zifencei", ext_zifencei, true),
> diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
> index d74b361be6..5fb4ca2324 100644
> --- a/target/riscv/cpu.h
> +++ b/target/riscv/cpu.h
> @@ -767,6 +767,7 @@ typedef struct RISCVCPUMultiExtConfig {
> extern const RISCVCPUMultiExtConfig riscv_cpu_extensions[];
> extern const RISCVCPUMultiExtConfig riscv_cpu_vendor_exts[];
> extern const RISCVCPUMultiExtConfig riscv_cpu_experimental_exts[];
> +extern const RISCVCPUMultiExtConfig riscv_cpu_named_features[];
> extern const RISCVCPUMultiExtConfig riscv_cpu_deprecated_exts[];
> extern Property riscv_cpu_options[];
>
> diff --git a/target/riscv/cpu_cfg.h b/target/riscv/cpu_cfg.h
> index bd2ff87cc8..90f18eb601 100644
> --- a/target/riscv/cpu_cfg.h
> +++ b/target/riscv/cpu_cfg.h
> @@ -116,6 +116,7 @@ struct RISCVCPUConfig {
> bool ext_smepmp;
> bool rvv_ta_all_1s;
> bool rvv_ma_all_1s;
> + bool zic64b;
>
> uint32_t mvendorid;
> uint64_t marchid;
> diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c
> index aee98db6f8..3319ba8e4e 100644
> --- a/target/riscv/tcg/tcg-cpu.c
> +++ b/target/riscv/tcg/tcg-cpu.c
> @@ -114,6 +114,19 @@ static int cpu_cfg_ext_get_min_version(uint32_t ext_offset)
> g_assert_not_reached();
> }
>
> +static bool cpu_cfg_offset_is_named_feat(uint32_t ext_offset)
> +{
> + const RISCVCPUMultiExtConfig *feat;
> +
> + for (feat = riscv_cpu_named_features; feat->name != NULL; feat++) {
> + if (feat->offset == ext_offset) {
> + return true;
> + }
> + }
> +
> + return false;
> +}
> +
> static void cpu_bump_multi_ext_priv_ver(CPURISCVState *env,
> uint32_t ext_offset)
> {
> @@ -123,6 +136,10 @@ static void cpu_bump_multi_ext_priv_ver(CPURISCVState *env,
> return;
> }
>
> + if (cpu_cfg_offset_is_named_feat(ext_offset)) {
> + return;
> + }
> +
> ext_priv_ver = cpu_cfg_ext_get_min_version(ext_offset);
>
> if (env->priv_ver < ext_priv_ver) {
> @@ -293,6 +310,13 @@ static void riscv_cpu_disable_priv_spec_isa_exts(RISCVCPU *cpu)
> }
> }
>
> +static void riscv_cpu_update_named_features(RISCVCPU *cpu)
> +{
> + cpu->cfg.zic64b = cpu->cfg.cbom_blocksize == 64 &&
> + cpu->cfg.cbop_blocksize == 64 &&
> + cpu->cfg.cboz_blocksize == 64;
> +}
> +
> /*
> * Check consistency between chosen extensions while setting
> * cpu->cfg accordingly.
> @@ -657,6 +681,8 @@ void riscv_tcg_cpu_finalize_features(RISCVCPU *cpu, Error **errp)
> return;
> }
>
> + riscv_cpu_update_named_features(cpu);
> +
> if (cpu->cfg.ext_smepmp && !cpu->cfg.pmp) {
> /*
> * Enhanced PMP should only be available
> --
> 2.43.0
>
>
^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: [PATCH v13 07/26] riscv-qmp-cmds.c: expose named features in cpu_model_expansion
2023-12-18 12:53 ` [PATCH v13 07/26] riscv-qmp-cmds.c: expose named features in cpu_model_expansion Daniel Henrique Barboza
@ 2024-01-04 5:13 ` Alistair Francis
0 siblings, 0 replies; 48+ messages in thread
From: Alistair Francis @ 2024-01-04 5:13 UTC (permalink / raw)
To: Daniel Henrique Barboza
Cc: qemu-devel, qemu-riscv, alistair.francis, bmeng, liwei1518,
zhiwei_liu, palmer, ajones
On Mon, Dec 18, 2023 at 10:57 PM Daniel Henrique Barboza
<dbarboza@ventanamicro.com> wrote:
>
> Named features (zic64b the sole example at this moment) aren't expose to
> users, thus we need another way to expose them.
>
> Go through each named feature, get its boolean value, do the needed
> conversions (bool to qbool, qbool to QObject) and add it to output dict.
>
> Another adjustment is needed: named features are evaluated during
> finalize(), so riscv_cpu_finalize_features() needs to be mandatory
> regardless of whether we have an input dict or not. Otherwise zic64b
> will always return 'false', which is incorrect: the default values of
> cache blocksizes ([cbom/cbop/cboz]_blocksize) are set to 64, satisfying
> the conditions for zic64b.
>
> Here's an API usage example after this patch:
>
> $ ./build/qemu-system-riscv64 -S -M virt -display none
> -qmp tcp:localhost:1234,server,wait=off
>
> $ ./scripts/qmp/qmp-shell localhost:1234
> Welcome to the QMP low-level shell!
> Connected to QEMU 8.1.50
>
> (QEMU) query-cpu-model-expansion type=full model={"name":"rv64"}
> {"return": {"model":
> {"name": "rv64", "props": {... "zic64b": true, ...}}}}
>
> zic64b is set to 'true', as expected, since all cache sizes are 64
> bytes by default.
>
> If we change one of the cache blocksizes, zic64b is returned as 'false':
>
> (QEMU) query-cpu-model-expansion type=full model={"name":"rv64","props":{"cbom_blocksize":128}}
> {"return": {"model":
> {"name": "rv64", "props": {... "zic64b": false, ...}}}}
>
> Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
> Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> target/riscv/riscv-qmp-cmds.c | 30 +++++++++++++++++++++++++-----
> 1 file changed, 25 insertions(+), 5 deletions(-)
>
> diff --git a/target/riscv/riscv-qmp-cmds.c b/target/riscv/riscv-qmp-cmds.c
> index 2f2dbae7c8..5ada279776 100644
> --- a/target/riscv/riscv-qmp-cmds.c
> +++ b/target/riscv/riscv-qmp-cmds.c
> @@ -26,6 +26,7 @@
>
> #include "qapi/error.h"
> #include "qapi/qapi-commands-machine-target.h"
> +#include "qapi/qmp/qbool.h"
> #include "qapi/qmp/qdict.h"
> #include "qapi/qmp/qerror.h"
> #include "qapi/qobject-input-visitor.h"
> @@ -99,6 +100,22 @@ static void riscv_obj_add_multiext_props(Object *obj, QDict *qdict_out,
> }
> }
>
> +static void riscv_obj_add_named_feats_qdict(Object *obj, QDict *qdict_out)
> +{
> + const RISCVCPUMultiExtConfig *named_cfg;
> + RISCVCPU *cpu = RISCV_CPU(obj);
> + QObject *value;
> + bool flag_val;
> +
> + for (int i = 0; riscv_cpu_named_features[i].name != NULL; i++) {
> + named_cfg = &riscv_cpu_named_features[i];
> + flag_val = isa_ext_is_enabled(cpu, named_cfg->offset);
> + value = QOBJECT(qbool_from_bool(flag_val));
> +
> + qdict_put_obj(qdict_out, named_cfg->name, value);
> + }
> +}
> +
> static void riscv_cpuobj_validate_qdict_in(Object *obj, QObject *props,
> const QDict *qdict_in,
> Error **errp)
> @@ -129,11 +146,6 @@ static void riscv_cpuobj_validate_qdict_in(Object *obj, QObject *props,
> goto err;
> }
>
> - riscv_cpu_finalize_features(RISCV_CPU(obj), &local_err);
> - if (local_err) {
> - goto err;
> - }
> -
> visit_end_struct(visitor, NULL);
>
> err:
> @@ -191,6 +203,13 @@ CpuModelExpansionInfo *qmp_query_cpu_model_expansion(CpuModelExpansionType type,
> }
> }
>
> + riscv_cpu_finalize_features(RISCV_CPU(obj), &local_err);
> + if (local_err) {
> + error_propagate(errp, local_err);
> + object_unref(obj);
> + return NULL;
> + }
> +
> expansion_info = g_new0(CpuModelExpansionInfo, 1);
> expansion_info->model = g_malloc0(sizeof(*expansion_info->model));
> expansion_info->model->name = g_strdup(model->name);
> @@ -200,6 +219,7 @@ CpuModelExpansionInfo *qmp_query_cpu_model_expansion(CpuModelExpansionType type,
> riscv_obj_add_multiext_props(obj, qdict_out, riscv_cpu_extensions);
> riscv_obj_add_multiext_props(obj, qdict_out, riscv_cpu_experimental_exts);
> riscv_obj_add_multiext_props(obj, qdict_out, riscv_cpu_vendor_exts);
> + riscv_obj_add_named_feats_qdict(obj, qdict_out);
>
> /* Add our CPU boolean options too */
> riscv_obj_add_qdict_prop(obj, qdict_out, "mmu");
> --
> 2.43.0
>
>
^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: [PATCH v13 10/26] target/riscv/tcg: add user flag for profile support
2023-12-18 12:53 ` [PATCH v13 10/26] target/riscv/tcg: add user flag for profile support Daniel Henrique Barboza
@ 2024-01-04 6:19 ` Alistair Francis
0 siblings, 0 replies; 48+ messages in thread
From: Alistair Francis @ 2024-01-04 6:19 UTC (permalink / raw)
To: Daniel Henrique Barboza
Cc: qemu-devel, qemu-riscv, alistair.francis, bmeng, liwei1518,
zhiwei_liu, palmer, ajones
On Tue, Dec 19, 2023 at 12:09 AM Daniel Henrique Barboza
<dbarboza@ventanamicro.com> wrote:
>
> The TCG emulation implements all the extensions described in the
> RVA22U64 profile, both mandatory and optional. The mandatory extensions
> will be enabled via the profile flag. We'll leave the optional
> extensions to be enabled by hand.
>
> Given that this is the first profile we're implementing in TCG we'll
> need some ground work first:
>
> - all profiles declared in riscv_profiles[] will be exposed to users.
> TCG is the main accelerator we're considering when adding profile
> support in QEMU, so for now it's safe to assume that all profiles in
> riscv_profiles[] will be relevant to TCG;
>
> - we'll not support user profile settings for vendor CPUs. The flags
> will still be exposed but users won't be able to change them;
>
> - profile support, albeit available for all non-vendor CPUs, will be
> based on top of the new 'rv64i' CPU. Setting a profile to 'true' means
> enable all mandatory extensions of this profile, setting it to 'false'
> will disable all mandatory profile extensions of the CPU, which will
> obliterate preset defaults. This is not a problem for a bare CPU like
> rv64i but it can allow for silly scenarios when using other CPUs. E.g.
> an user can do "-cpu rv64,rva22u64=false" and have a bunch of default
> rv64 extensions disabled. The recommended way of using profiles is the
> rv64i CPU, but users are free to experiment.
>
> For now we'll handle multi-letter extensions only. MISA extensions need
> additional steps that we'll take care later. At this point we can boot a
> Linux buildroot using rva22u64 using the following options:
>
> -cpu rv64i,rva22u64=true,sv39=true,g=true,c=true,s=true
>
> Note that being an usermode/application profile we still need to
> explicitly set 's=true' to enable Supervisor mode to boot Linux.
>
> Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
> Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> target/riscv/tcg/tcg-cpu.c | 80 ++++++++++++++++++++++++++++++++++++++
> 1 file changed, 80 insertions(+)
>
> diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c
> index 3319ba8e4e..83d4dd00cf 100644
> --- a/target/riscv/tcg/tcg-cpu.c
> +++ b/target/riscv/tcg/tcg-cpu.c
> @@ -127,6 +127,19 @@ static bool cpu_cfg_offset_is_named_feat(uint32_t ext_offset)
> return false;
> }
>
> +static void riscv_cpu_enable_named_feat(RISCVCPU *cpu, uint32_t feat_offset)
> +{
> + switch (feat_offset) {
> + case CPU_CFG_OFFSET(zic64b):
> + cpu->cfg.cbom_blocksize = 64;
> + cpu->cfg.cbop_blocksize = 64;
> + cpu->cfg.cboz_blocksize = 64;
> + break;
> + default:
> + g_assert_not_reached();
> + }
> +}
> +
> static void cpu_bump_multi_ext_priv_ver(CPURISCVState *env,
> uint32_t ext_offset)
> {
> @@ -885,6 +898,71 @@ static void riscv_cpu_add_misa_properties(Object *cpu_obj)
> }
> }
>
> +static void cpu_set_profile(Object *obj, Visitor *v, const char *name,
> + void *opaque, Error **errp)
> +{
> + RISCVCPUProfile *profile = opaque;
> + RISCVCPU *cpu = RISCV_CPU(obj);
> + bool value;
> + int i, ext_offset;
> +
> + if (riscv_cpu_is_vendor(obj)) {
> + error_setg(errp, "Profile %s is not available for vendor CPUs",
> + profile->name);
> + return;
> + }
> +
> + if (cpu->env.misa_mxl != MXL_RV64) {
> + error_setg(errp, "Profile %s only available for 64 bit CPUs",
> + profile->name);
> + return;
> + }
> +
> + if (!visit_type_bool(v, name, &value, errp)) {
> + return;
> + }
> +
> + profile->user_set = true;
> + profile->enabled = value;
> +
> + for (i = 0; profile->ext_offsets[i] != RISCV_PROFILE_EXT_LIST_END; i++) {
> + ext_offset = profile->ext_offsets[i];
> +
> + if (profile->enabled) {
> + if (cpu_cfg_offset_is_named_feat(ext_offset)) {
> + riscv_cpu_enable_named_feat(cpu, ext_offset);
> + }
> +
> + cpu_bump_multi_ext_priv_ver(&cpu->env, ext_offset);
> + }
> +
> + 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 cpu_get_profile(Object *obj, Visitor *v, const char *name,
> + void *opaque, Error **errp)
> +{
> + RISCVCPUProfile *profile = opaque;
> + bool value = profile->enabled;
> +
> + visit_type_bool(v, name, &value, errp);
> +}
> +
> +static void riscv_cpu_add_profiles(Object *cpu_obj)
> +{
> + for (int i = 0; riscv_profiles[i] != NULL; i++) {
> + const RISCVCPUProfile *profile = riscv_profiles[i];
> +
> + object_property_add(cpu_obj, profile->name, "bool",
> + cpu_get_profile, cpu_set_profile,
> + NULL, (void *)profile);
> + }
> +}
> +
> static bool cpu_ext_is_deprecated(const char *ext_name)
> {
> return isupper(ext_name[0]);
> @@ -1012,6 +1090,8 @@ static void riscv_cpu_add_user_properties(Object *obj)
>
> riscv_cpu_add_multiext_prop_array(obj, riscv_cpu_deprecated_exts);
>
> + riscv_cpu_add_profiles(obj);
> +
> for (Property *prop = riscv_cpu_options; prop && prop->name; prop++) {
> qdev_property_add_static(DEVICE(obj), prop);
> }
> --
> 2.43.0
>
>
^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: [PATCH v13 14/26] target/riscv/tcg: add hash table insert helpers
2023-12-18 12:53 ` [PATCH v13 14/26] target/riscv/tcg: add hash table insert helpers Daniel Henrique Barboza
@ 2024-01-04 6:25 ` Alistair Francis
0 siblings, 0 replies; 48+ messages in thread
From: Alistair Francis @ 2024-01-04 6:25 UTC (permalink / raw)
To: Daniel Henrique Barboza
Cc: qemu-devel, qemu-riscv, alistair.francis, bmeng, liwei1518,
zhiwei_liu, palmer, ajones
On Mon, Dec 18, 2023 at 10:57 PM Daniel Henrique Barboza
<dbarboza@ventanamicro.com> wrote:
>
> Previous patches added several g_hash_table_insert() patterns. Add two
> helpers, one for each user hash, to make the code cleaner.
>
> Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
> Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> target/riscv/tcg/tcg-cpu.c | 28 ++++++++++++++++------------
> 1 file changed, 16 insertions(+), 12 deletions(-)
>
> diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c
> index f2e0ce0f3d..01d2cc9f94 100644
> --- a/target/riscv/tcg/tcg-cpu.c
> +++ b/target/riscv/tcg/tcg-cpu.c
> @@ -42,6 +42,18 @@ static bool cpu_cfg_ext_is_user_set(uint32_t ext_offset)
> GUINT_TO_POINTER(ext_offset));
> }
>
> +static void cpu_cfg_ext_add_user_opt(uint32_t ext_offset, bool value)
> +{
> + g_hash_table_insert(multi_ext_user_opts, GUINT_TO_POINTER(ext_offset),
> + (gpointer)value);
> +}
> +
> +static void cpu_misa_ext_add_user_opt(uint32_t bit, bool value)
> +{
> + g_hash_table_insert(misa_ext_user_opts, GUINT_TO_POINTER(bit),
> + (gpointer)value);
> +}
> +
> static void riscv_cpu_write_misa_bit(RISCVCPU *cpu, uint32_t bit,
> bool enabled)
> {
> @@ -817,9 +829,7 @@ static void cpu_set_misa_ext_cfg(Object *obj, Visitor *v, const char *name,
> return;
> }
>
> - g_hash_table_insert(misa_ext_user_opts,
> - GUINT_TO_POINTER(misa_bit),
> - (gpointer)value);
> + cpu_misa_ext_add_user_opt(misa_bit, value);
>
> prev_val = env->misa_ext & misa_bit;
>
> @@ -956,9 +966,7 @@ static void cpu_set_profile(Object *obj, Visitor *v, const char *name,
> continue;
> }
>
> - g_hash_table_insert(misa_ext_user_opts,
> - GUINT_TO_POINTER(bit),
> - (gpointer)value);
> + cpu_misa_ext_add_user_opt(bit, profile->enabled);
> riscv_cpu_write_misa_bit(cpu, bit, profile->enabled);
> }
>
> @@ -973,9 +981,7 @@ static void cpu_set_profile(Object *obj, Visitor *v, const char *name,
> cpu_bump_multi_ext_priv_ver(&cpu->env, ext_offset);
> }
>
> - g_hash_table_insert(multi_ext_user_opts,
> - GUINT_TO_POINTER(ext_offset),
> - (gpointer)profile->enabled);
> + cpu_cfg_ext_add_user_opt(ext_offset, profile->enabled);
> isa_ext_update_enabled(cpu, ext_offset, profile->enabled);
> }
> }
> @@ -1038,9 +1044,7 @@ static void cpu_set_multi_ext_cfg(Object *obj, Visitor *v, const char *name,
> multi_ext_cfg->name, lower);
> }
>
> - g_hash_table_insert(multi_ext_user_opts,
> - GUINT_TO_POINTER(multi_ext_cfg->offset),
> - (gpointer)value);
> + cpu_cfg_ext_add_user_opt(multi_ext_cfg->offset, value);
>
> prev_val = isa_ext_is_enabled(cpu, multi_ext_cfg->offset);
>
> --
> 2.43.0
>
>
^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: [PATCH v13 16/26] target/riscv/tcg: validate profiles during finalize
2023-12-18 12:53 ` [PATCH v13 16/26] target/riscv/tcg: validate profiles during finalize Daniel Henrique Barboza
@ 2024-01-04 6:27 ` Alistair Francis
0 siblings, 0 replies; 48+ messages in thread
From: Alistair Francis @ 2024-01-04 6:27 UTC (permalink / raw)
To: Daniel Henrique Barboza
Cc: qemu-devel, qemu-riscv, alistair.francis, bmeng, liwei1518,
zhiwei_liu, palmer, ajones
On Mon, Dec 18, 2023 at 10:57 PM Daniel Henrique Barboza
<dbarboza@ventanamicro.com> wrote:
>
> Enabling a profile and then disabling some of its mandatory extensions
> is a valid use. It can be useful for debugging and testing. But the
> common expected use of enabling a profile is to enable all its mandatory
> extensions.
>
> Add an user warning when mandatory extensions from an enabled profile
> are disabled in the command line. We're also going to disable the
> profile flag in this case since the profile must include all the
> mandatory extensions. This flag can be exposed by QMP to indicate the
> actual profile state after the CPU is realized.
>
> After this patch, this will throw warnings:
>
> -cpu rv64,rva22u64=true,zihintpause=false,zicbom=false,zicboz=false
>
> qemu-system-riscv64: warning: Profile rva22u64 mandates disabled extension zihintpause
> qemu-system-riscv64: warning: Profile rva22u64 mandates disabled extension zicbom
> qemu-system-riscv64: warning: Profile rva22u64 mandates disabled extension zicboz
>
> Note that the following will NOT throw warnings because the profile is
> being enabled last, hence all its mandatory extensions will be enabled:
>
> -cpu rv64,zihintpause=false,zicbom=false,zicboz=false,rva22u64=true
>
> Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
> Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> target/riscv/tcg/tcg-cpu.c | 69 ++++++++++++++++++++++++++++++++++++++
> 1 file changed, 69 insertions(+)
>
> diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c
> index c9df783c51..005d8be26b 100644
> --- a/target/riscv/tcg/tcg-cpu.c
> +++ b/target/riscv/tcg/tcg-cpu.c
> @@ -147,6 +147,26 @@ static int cpu_cfg_ext_get_min_version(uint32_t ext_offset)
> g_assert_not_reached();
> }
>
> +static const char *cpu_cfg_ext_get_name(uint32_t ext_offset)
> +{
> + const RISCVCPUMultiExtConfig *feat;
> + const RISCVIsaExtData *edata;
> +
> + for (edata = isa_edata_arr; edata->name != NULL; edata++) {
> + if (edata->ext_enable_offset == ext_offset) {
> + return edata->name;
> + }
> + }
> +
> + for (feat = riscv_cpu_named_features; feat->name != NULL; feat++) {
> + if (feat->offset == ext_offset) {
> + return feat->name;
> + }
> + }
> +
> + g_assert_not_reached();
> +}
> +
> static bool cpu_cfg_offset_is_named_feat(uint32_t ext_offset)
> {
> const RISCVCPUMultiExtConfig *feat;
> @@ -727,6 +747,54 @@ void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)
> riscv_cpu_disable_priv_spec_isa_exts(cpu);
> }
>
> +static void riscv_cpu_validate_profile(RISCVCPU *cpu,
> + RISCVCPUProfile *profile)
> +{
> + const char *warn_msg = "Profile %s mandates disabled extension %s";
> + bool send_warn = profile->user_set && profile->enabled;
> + bool profile_impl = true;
> + int i;
> +
> + for (i = 0; misa_bits[i] != 0; i++) {
> + uint32_t bit = misa_bits[i];
> +
> + if (!(profile->misa_ext & bit)) {
> + continue;
> + }
> +
> + if (!riscv_has_ext(&cpu->env, bit)) {
> + profile_impl = false;
> +
> + if (send_warn) {
> + warn_report(warn_msg, profile->name,
> + riscv_get_misa_ext_name(bit));
> + }
> + }
> + }
> +
> + for (i = 0; profile->ext_offsets[i] != RISCV_PROFILE_EXT_LIST_END; i++) {
> + int ext_offset = profile->ext_offsets[i];
> +
> + if (!isa_ext_is_enabled(cpu, ext_offset)) {
> + profile_impl = false;
> +
> + if (send_warn) {
> + warn_report(warn_msg, profile->name,
> + cpu_cfg_ext_get_name(ext_offset));
> + }
> + }
> + }
> +
> + profile->enabled = profile_impl;
> +}
> +
> +static void riscv_cpu_validate_profiles(RISCVCPU *cpu)
> +{
> + for (int i = 0; riscv_profiles[i] != NULL; i++) {
> + riscv_cpu_validate_profile(cpu, riscv_profiles[i]);
> + }
> +}
> +
> void riscv_tcg_cpu_finalize_features(RISCVCPU *cpu, Error **errp)
> {
> CPURISCVState *env = &cpu->env;
> @@ -745,6 +813,7 @@ void riscv_tcg_cpu_finalize_features(RISCVCPU *cpu, Error **errp)
> }
>
> riscv_cpu_update_named_features(cpu);
> + riscv_cpu_validate_profiles(cpu);
>
> if (cpu->cfg.ext_smepmp && !cpu->cfg.pmp) {
> /*
> --
> 2.43.0
>
>
^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: [PATCH v13 17/26] riscv-qmp-cmds.c: add profile flags in cpu-model-expansion
2023-12-18 12:53 ` [PATCH v13 17/26] riscv-qmp-cmds.c: add profile flags in cpu-model-expansion Daniel Henrique Barboza
@ 2024-01-04 6:29 ` Alistair Francis
0 siblings, 0 replies; 48+ messages in thread
From: Alistair Francis @ 2024-01-04 6:29 UTC (permalink / raw)
To: Daniel Henrique Barboza
Cc: qemu-devel, qemu-riscv, alistair.francis, bmeng, liwei1518,
zhiwei_liu, palmer, ajones
On Mon, Dec 18, 2023 at 10:56 PM Daniel Henrique Barboza
<dbarboza@ventanamicro.com> wrote:
>
> Expose all profile flags for all CPUs when executing
> query-cpu-model-expansion. This will allow callers to quickly determine
> if a certain profile is implemented by a given CPU. This includes vendor
> CPUs - the fact that they don't have profile user flags doesn't mean
> that they don't implement the profile.
>
> After this change it's possible to quickly determine if our stock CPUs
> implement the existing rva22u64 profile. Here's a few examples:
>
> $ ./build/qemu-system-riscv64 -S -M virt -display none
> -qmp tcp:localhost:1234,server,wait=off
>
> $ ./scripts/qmp/qmp-shell localhost:1234
> Welcome to the QMP low-level shell!
> Connected to QEMU 8.1.50
>
> - As expected, the 'max' CPU implements the rva22u64 profile.
>
> (QEMU) query-cpu-model-expansion type=full model={"name":"max"}
> {"return": {"model":
> {"name": "rv64", "props": {... "rva22u64": true, ...}}}}
>
> - rv64 is missing "zba", "zbb", "zbs", "zkt" and "zfhmin":
>
> query-cpu-model-expansion type=full model={"name":"rv64"}
> {"return": {"model":
> {"name": "rv64", "props": {... "rva22u64": false, ...}}}}
>
> query-cpu-model-expansion type=full model={"name":"rv64",
> "props":{"zba":true,"zbb":true,"zbs":true,"zkt":true,"zfhmin":true}}
> {"return": {"model":
> {"name": "rv64", "props": {... "rva22u64": true, ...}}}}
>
> We have no vendor CPUs that supports rva22u64 (veyron-v1 is the closest
> - it is missing just 'zkt').
>
> In short, aside from the 'max' CPU, we have no CPUs that supports
> rva22u64 by default.
>
> Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
> Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> target/riscv/riscv-qmp-cmds.c | 14 ++++++++++++++
> 1 file changed, 14 insertions(+)
>
> diff --git a/target/riscv/riscv-qmp-cmds.c b/target/riscv/riscv-qmp-cmds.c
> index 5ada279776..205aaabeb9 100644
> --- a/target/riscv/riscv-qmp-cmds.c
> +++ b/target/riscv/riscv-qmp-cmds.c
> @@ -116,6 +116,19 @@ static void riscv_obj_add_named_feats_qdict(Object *obj, QDict *qdict_out)
> }
> }
>
> +static void riscv_obj_add_profiles_qdict(Object *obj, QDict *qdict_out)
> +{
> + RISCVCPUProfile *profile;
> + QObject *value;
> +
> + for (int i = 0; riscv_profiles[i] != NULL; i++) {
> + profile = riscv_profiles[i];
> + value = QOBJECT(qbool_from_bool(profile->enabled));
> +
> + qdict_put_obj(qdict_out, profile->name, value);
> + }
> +}
> +
> static void riscv_cpuobj_validate_qdict_in(Object *obj, QObject *props,
> const QDict *qdict_in,
> Error **errp)
> @@ -220,6 +233,7 @@ CpuModelExpansionInfo *qmp_query_cpu_model_expansion(CpuModelExpansionType type,
> riscv_obj_add_multiext_props(obj, qdict_out, riscv_cpu_experimental_exts);
> riscv_obj_add_multiext_props(obj, qdict_out, riscv_cpu_vendor_exts);
> riscv_obj_add_named_feats_qdict(obj, qdict_out);
> + riscv_obj_add_profiles_qdict(obj, qdict_out);
>
> /* Add our CPU boolean options too */
> riscv_obj_add_qdict_prop(obj, qdict_out, "mmu");
> --
> 2.43.0
>
>
^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: [PATCH v13 18/26] target/riscv: add 'rva22u64' CPU
2023-12-18 12:53 ` [PATCH v13 18/26] target/riscv: add 'rva22u64' CPU Daniel Henrique Barboza
@ 2024-01-04 6:31 ` Alistair Francis
0 siblings, 0 replies; 48+ messages in thread
From: Alistair Francis @ 2024-01-04 6:31 UTC (permalink / raw)
To: Daniel Henrique Barboza
Cc: qemu-devel, qemu-riscv, alistair.francis, bmeng, liwei1518,
zhiwei_liu, palmer, ajones
On Mon, Dec 18, 2023 at 10:56 PM Daniel Henrique Barboza
<dbarboza@ventanamicro.com> wrote:
>
> This CPU was suggested by Alistair [1] and others during the profile
> design discussions. It consists of the bare 'rv64i' CPU with rva22u64
> enabled by default, like an alias of '-cpu rv64i,rva22u64=true'.
>
> Users now have an even easier way of consuming this user-mode profile by
> doing '-cpu rva22u64'. Extensions can be enabled/disabled at will on top
> of it.
>
> We can boot Linux with this "user-mode" CPU by doing:
>
> -cpu rva22u64,sv39=true,s=true,zifencei=true
>
> [1] https://lore.kernel.org/qemu-riscv/CAKmqyKP7xzZ9Sx=-Lbx2Ob0qCfB7Z+JO944FQ2TQ+49mqo0q_Q@mail.gmail.com/
>
> Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
> Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> target/riscv/cpu-qom.h | 1 +
> target/riscv/cpu.c | 17 +++++++++++++++++
> target/riscv/tcg/tcg-cpu.c | 9 +++++++++
> 3 files changed, 27 insertions(+)
>
> diff --git a/target/riscv/cpu-qom.h b/target/riscv/cpu-qom.h
> index 4d1aa54311..12fe78fc52 100644
> --- a/target/riscv/cpu-qom.h
> +++ b/target/riscv/cpu-qom.h
> @@ -35,6 +35,7 @@
> #define TYPE_RISCV_CPU_BASE64 RISCV_CPU_TYPE_NAME("rv64")
> #define TYPE_RISCV_CPU_BASE128 RISCV_CPU_TYPE_NAME("x-rv128")
> #define TYPE_RISCV_CPU_RV64I RISCV_CPU_TYPE_NAME("rv64i")
> +#define TYPE_RISCV_CPU_RVA22U64 RISCV_CPU_TYPE_NAME("rva22u64")
> #define TYPE_RISCV_CPU_IBEX RISCV_CPU_TYPE_NAME("lowrisc-ibex")
> #define TYPE_RISCV_CPU_SHAKTI_C RISCV_CPU_TYPE_NAME("shakti-c")
> #define TYPE_RISCV_CPU_SIFIVE_E31 RISCV_CPU_TYPE_NAME("sifive-e31")
> diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
> index b9057c8da2..a38d78b2d6 100644
> --- a/target/riscv/cpu.c
> +++ b/target/riscv/cpu.c
> @@ -1576,6 +1576,15 @@ static Property riscv_cpu_properties[] = {
> DEFINE_PROP_END_OF_LIST(),
> };
>
> +#if defined(TARGET_RISCV64)
> +static void rva22u64_profile_cpu_init(Object *obj)
> +{
> + rv64i_bare_cpu_init(obj);
> +
> + RVA22U64.enabled = true;
> +}
> +#endif
> +
> static const gchar *riscv_gdb_arch_name(CPUState *cs)
> {
> RISCVCPU *cpu = RISCV_CPU(cs);
> @@ -1866,6 +1875,13 @@ void riscv_cpu_list(void)
> .instance_init = initfn \
> }
>
> +#define DEFINE_PROFILE_CPU(type_name, initfn) \
> + { \
> + .name = type_name, \
> + .parent = TYPE_RISCV_BARE_CPU, \
> + .instance_init = initfn \
> + }
> +
> static const TypeInfo riscv_cpu_type_infos[] = {
> {
> .name = TYPE_RISCV_CPU,
> @@ -1910,6 +1926,7 @@ static const TypeInfo riscv_cpu_type_infos[] = {
> DEFINE_VENDOR_CPU(TYPE_RISCV_CPU_VEYRON_V1, rv64_veyron_v1_cpu_init),
> DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_BASE128, rv128_base_cpu_init),
> DEFINE_BARE_CPU(TYPE_RISCV_CPU_RV64I, rv64i_bare_cpu_init),
> + DEFINE_PROFILE_CPU(TYPE_RISCV_CPU_RVA22U64, rva22u64_profile_cpu_init),
> #endif
> };
>
> diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c
> index 005d8be26b..04aedf3840 100644
> --- a/target/riscv/tcg/tcg-cpu.c
> +++ b/target/riscv/tcg/tcg-cpu.c
> @@ -1095,6 +1095,15 @@ static void riscv_cpu_add_profiles(Object *cpu_obj)
> object_property_add(cpu_obj, profile->name, "bool",
> cpu_get_profile, cpu_set_profile,
> NULL, (void *)profile);
> +
> + /*
> + * CPUs might enable a profile right from the start.
> + * Enable its mandatory extensions right away in this
> + * case.
> + */
> + if (profile->enabled) {
> + object_property_set_bool(cpu_obj, profile->name, true, NULL);
> + }
> }
> }
>
> --
> 2.43.0
>
>
^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: [PATCH v13 19/26] target/riscv: implement svade
2023-12-18 12:53 ` [PATCH v13 19/26] target/riscv: implement svade Daniel Henrique Barboza
@ 2024-01-04 22:59 ` Alistair Francis
0 siblings, 0 replies; 48+ messages in thread
From: Alistair Francis @ 2024-01-04 22:59 UTC (permalink / raw)
To: Daniel Henrique Barboza
Cc: qemu-devel, qemu-riscv, alistair.francis, bmeng, liwei1518,
zhiwei_liu, palmer, ajones
On Mon, Dec 18, 2023 at 10:57 PM Daniel Henrique Barboza
<dbarboza@ventanamicro.com> wrote:
>
> 'svade' is a RVA22S64 profile requirement, a profile we're going to add
> shortly. It is a named feature (i.e. not a formal extension, not defined
> in riscv,isa DT at this moment) defined in [1] as:
>
> "Page-fault exceptions are raised when a page is accessed when A bit is
> clear, or written when D bit is clear.".
>
> As far as the spec goes, 'svade' is one of the two distinct modes of
> handling PTE_A and PTE_D. The other way, i.e. update PTE_A/PTE_D when
> they're cleared, is defined by the 'svadu' extension. Checking
> cpu_helper.c, get_physical_address(), we can verify that QEMU is
> compliant with that: we will update PTE_A/PTE_D if 'svadu' is enabled,
> or throw a page-fault exception if 'svadu' isn't enabled.
>
> So, as far as we're concerned, 'svade' translates to 'svadu must be
> disabled'.
>
> We'll implement it like 'zic64b': an internal flag that profiles can
> enable. The flag will not be exposed to users.
>
> [1] https://github.com/riscv/riscv-profiles/blob/main/profiles.adoc
>
> Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
> Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> target/riscv/cpu.c | 1 +
> target/riscv/cpu_cfg.h | 1 +
> target/riscv/tcg/tcg-cpu.c | 5 +++++
> 3 files changed, 7 insertions(+)
>
> diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
> index a38d78b2d6..a76bc1b86a 100644
> --- a/target/riscv/cpu.c
> +++ b/target/riscv/cpu.c
> @@ -1445,6 +1445,7 @@ const RISCVCPUMultiExtConfig riscv_cpu_experimental_exts[] = {
> };
>
> const RISCVCPUMultiExtConfig riscv_cpu_named_features[] = {
> + MULTI_EXT_CFG_BOOL("svade", svade, true),
> MULTI_EXT_CFG_BOOL("zic64b", zic64b, true),
>
> DEFINE_PROP_END_OF_LIST(),
> diff --git a/target/riscv/cpu_cfg.h b/target/riscv/cpu_cfg.h
> index 90f18eb601..46b06db68b 100644
> --- a/target/riscv/cpu_cfg.h
> +++ b/target/riscv/cpu_cfg.h
> @@ -116,6 +116,7 @@ struct RISCVCPUConfig {
> bool ext_smepmp;
> bool rvv_ta_all_1s;
> bool rvv_ma_all_1s;
> + bool svade;
> bool zic64b;
>
> uint32_t mvendorid;
> diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c
> index 04aedf3840..e395e2449e 100644
> --- a/target/riscv/tcg/tcg-cpu.c
> +++ b/target/riscv/tcg/tcg-cpu.c
> @@ -188,6 +188,9 @@ static void riscv_cpu_enable_named_feat(RISCVCPU *cpu, uint32_t feat_offset)
> cpu->cfg.cbop_blocksize = 64;
> cpu->cfg.cboz_blocksize = 64;
> break;
> + case CPU_CFG_OFFSET(svade):
> + cpu->cfg.ext_svadu = false;
> + break;
> default:
> g_assert_not_reached();
> }
> @@ -381,6 +384,8 @@ static void riscv_cpu_update_named_features(RISCVCPU *cpu)
> cpu->cfg.zic64b = cpu->cfg.cbom_blocksize == 64 &&
> cpu->cfg.cbop_blocksize == 64 &&
> cpu->cfg.cboz_blocksize == 64;
> +
> + cpu->cfg.svade = !cpu->cfg.ext_svadu;
> }
>
> static void riscv_cpu_validate_g(RISCVCPU *cpu)
> --
> 2.43.0
>
>
^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: [PATCH v13 20/26] target/riscv: add priv ver restriction to profiles
2023-12-18 12:53 ` [PATCH v13 20/26] target/riscv: add priv ver restriction to profiles Daniel Henrique Barboza
@ 2024-01-04 23:02 ` Alistair Francis
0 siblings, 0 replies; 48+ messages in thread
From: Alistair Francis @ 2024-01-04 23:02 UTC (permalink / raw)
To: Daniel Henrique Barboza
Cc: qemu-devel, qemu-riscv, alistair.francis, bmeng, liwei1518,
zhiwei_liu, palmer, ajones
On Tue, Dec 19, 2023 at 12:23 AM Daniel Henrique Barboza
<dbarboza@ventanamicro.com> wrote:
>
> 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>
Alistair
> ---
> target/riscv/cpu.c | 1 +
> target/riscv/cpu.h | 2 ++
> target/riscv/tcg/tcg-cpu.c | 31 +++++++++++++++++++++++++++++++
> 3 files changed, 34 insertions(+)
>
> diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
> index a76bc1b86a..1ba85c6d1c 100644
> --- a/target/riscv/cpu.c
> +++ b/target/riscv/cpu.c
> @@ -1537,6 +1537,7 @@ Property riscv_cpu_options[] = {
> static RISCVCPUProfile RVA22U64 = {
> .name = "rva22u64",
> .misa_ext = RVI | RVM | RVA | RVF | RVD | RVC | RVU,
> + .priv_spec = RISCV_PROFILE_ATTR_UNUSED,
> .ext_offsets = {
> CPU_CFG_OFFSET(ext_zicsr), CPU_CFG_OFFSET(ext_zihintpause),
> CPU_CFG_OFFSET(ext_zba), CPU_CFG_OFFSET(ext_zbb),
> diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
> index 5ff629650d..1f34eda1e4 100644
> --- a/target/riscv/cpu.h
> +++ b/target/riscv/cpu.h
> @@ -81,10 +81,12 @@ typedef struct riscv_cpu_profile {
> uint32_t misa_ext;
> bool enabled;
> bool user_set;
> + int priv_spec;
> const int32_t ext_offsets[];
> } RISCVCPUProfile;
>
> #define RISCV_PROFILE_EXT_LIST_END -1
> +#define RISCV_PROFILE_ATTR_UNUSED -1
>
> extern RISCVCPUProfile *riscv_profiles[];
>
> diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c
> index e395e2449e..4d25fc43d2 100644
> --- a/target/riscv/tcg/tcg-cpu.c
> +++ b/target/riscv/tcg/tcg-cpu.c
> @@ -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,
> const TranslationBlock *tb)
> {
> @@ -755,11 +769,24 @@ void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)
> static void riscv_cpu_validate_profile(RISCVCPU *cpu,
> RISCVCPUProfile *profile)
> {
> + CPURISCVState *env = &cpu->env;
> const char *warn_msg = "Profile %s mandates disabled extension %s";
> bool send_warn = profile->user_set && profile->enabled;
> bool profile_impl = true;
> 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++) {
> uint32_t bit = misa_bits[i];
>
> @@ -1048,6 +1075,10 @@ static void cpu_set_profile(Object *obj, Visitor *v, const char *name,
> profile->user_set = true;
> profile->enabled = value;
>
> + if (profile->enabled) {
> + cpu->env.priv_ver = profile->priv_spec;
> + }
> +
> for (i = 0; misa_bits[i] != 0; i++) {
> uint32_t bit = misa_bits[i];
>
> --
> 2.43.0
>
>
^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: [PATCH v13 21/26] target/riscv/cpu.c: finalize satp_mode earlier
2023-12-18 12:53 ` [PATCH v13 21/26] target/riscv/cpu.c: finalize satp_mode earlier Daniel Henrique Barboza
@ 2024-01-04 23:02 ` Alistair Francis
0 siblings, 0 replies; 48+ messages in thread
From: Alistair Francis @ 2024-01-04 23:02 UTC (permalink / raw)
To: Daniel Henrique Barboza
Cc: qemu-devel, qemu-riscv, alistair.francis, bmeng, liwei1518,
zhiwei_liu, palmer, ajones
On Mon, Dec 18, 2023 at 10:56 PM Daniel Henrique Barboza
<dbarboza@ventanamicro.com> wrote:
>
> Profiles will need to validate satp_mode during their own finalize
> methods. This will occur inside riscv_tcg_cpu_finalize_features() for
> TCG. Given that satp_mode does not have any pre-req from the accelerator
> finalize() method, it's safe to finalize it earlier.
>
> Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
> Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> target/riscv/cpu.c | 16 ++++++++--------
> 1 file changed, 8 insertions(+), 8 deletions(-)
>
> diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
> index 1ba85c6d1c..6af1148cf5 100644
> --- a/target/riscv/cpu.c
> +++ b/target/riscv/cpu.c
> @@ -1056,6 +1056,14 @@ void riscv_cpu_finalize_features(RISCVCPU *cpu, Error **errp)
> {
> Error *local_err = NULL;
>
> +#ifndef CONFIG_USER_ONLY
> + riscv_cpu_satp_mode_finalize(cpu, &local_err);
> + if (local_err != NULL) {
> + error_propagate(errp, local_err);
> + return;
> + }
> +#endif
> +
> /*
> * KVM accel does not have a specialized finalize()
> * callback because its extensions are validated
> @@ -1068,14 +1076,6 @@ void riscv_cpu_finalize_features(RISCVCPU *cpu, Error **errp)
> return;
> }
> }
> -
> -#ifndef CONFIG_USER_ONLY
> - riscv_cpu_satp_mode_finalize(cpu, &local_err);
> - if (local_err != NULL) {
> - error_propagate(errp, local_err);
> - return;
> - }
> -#endif
> }
>
> static void riscv_cpu_realize(DeviceState *dev, Error **errp)
> --
> 2.43.0
>
>
^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: [PATCH v13 22/26] target/riscv/cpu.c: add riscv_cpu_is_32bit()
2023-12-18 12:53 ` [PATCH v13 22/26] target/riscv/cpu.c: add riscv_cpu_is_32bit() Daniel Henrique Barboza
@ 2024-01-04 23:04 ` Alistair Francis
0 siblings, 0 replies; 48+ messages in thread
From: Alistair Francis @ 2024-01-04 23:04 UTC (permalink / raw)
To: Daniel Henrique Barboza
Cc: qemu-devel, qemu-riscv, alistair.francis, bmeng, liwei1518,
zhiwei_liu, palmer, ajones, Philippe Mathieu-Daudé
On Mon, Dec 18, 2023 at 11:01 PM Daniel Henrique Barboza
<dbarboza@ventanamicro.com> wrote:
>
> Next patch will need to retrieve if a given RISCVCPU is 32 or 64 bit.
> The existing helper riscv_is_32bit() (hw/riscv/boot.c) will always check
> the first CPU of a given hart array, not any given CPU.
>
> Create a helper to retrieve the info for any given CPU, not the first
> CPU of the hart array. The helper is using the same 32 bit check that
> riscv_cpu_satp_mode_finalize() was doing.
>
> Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
> Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> target/riscv/cpu.c | 7 ++++++-
> target/riscv/cpu.h | 1 +
> 2 files changed, 7 insertions(+), 1 deletion(-)
>
> diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
> index 6af1148cf5..1dea5db52d 100644
> --- a/target/riscv/cpu.c
> +++ b/target/riscv/cpu.c
> @@ -53,6 +53,11 @@ const uint32_t misa_bits[] = {RVI, RVE, RVM, RVA, RVF, RVD, RVV,
> #define BYTE(x) (x)
> #endif
>
> +bool riscv_cpu_is_32bit(RISCVCPU *cpu)
> +{
> + return riscv_cpu_mxl(&cpu->env) == MXL_RV32;
> +}
> +
> #define ISA_EXT_DATA_ENTRY(_name, _min_ver, _prop) \
> {#_name, _min_ver, CPU_CFG_OFFSET(_prop)}
>
> @@ -980,7 +985,7 @@ static void riscv_cpu_disas_set_info(CPUState *s, disassemble_info *info)
> #ifndef CONFIG_USER_ONLY
> static void riscv_cpu_satp_mode_finalize(RISCVCPU *cpu, Error **errp)
> {
> - bool rv32 = riscv_cpu_mxl(&cpu->env) == MXL_RV32;
> + bool rv32 = riscv_cpu_is_32bit(cpu);
> uint8_t satp_mode_map_max, satp_mode_supported_max;
>
> /* The CPU wants the OS to decide which satp mode to use */
> diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
> index 1f34eda1e4..485d2da3c2 100644
> --- a/target/riscv/cpu.h
> +++ b/target/riscv/cpu.h
> @@ -695,6 +695,7 @@ void cpu_get_tb_cpu_state(CPURISCVState *env, vaddr *pc,
> uint64_t *cs_base, uint32_t *pflags);
>
> void riscv_cpu_update_mask(CPURISCVState *env);
> +bool riscv_cpu_is_32bit(RISCVCPU *cpu);
>
> RISCVException riscv_csrrw(CPURISCVState *env, int csrno,
> target_ulong *ret_value,
> --
> 2.43.0
>
>
^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: [PATCH v13 23/26] target/riscv: add satp_mode profile support
2023-12-18 12:53 ` [PATCH v13 23/26] target/riscv: add satp_mode profile support Daniel Henrique Barboza
@ 2024-01-04 23:07 ` Alistair Francis
0 siblings, 0 replies; 48+ messages in thread
From: Alistair Francis @ 2024-01-04 23:07 UTC (permalink / raw)
To: Daniel Henrique Barboza
Cc: qemu-devel, qemu-riscv, alistair.francis, bmeng, liwei1518,
zhiwei_liu, palmer, ajones
On Mon, Dec 18, 2023 at 10:56 PM Daniel Henrique Barboza
<dbarboza@ventanamicro.com> wrote:
>
> 'satp_mode' is a requirement for supervisor profiles like RVA22S64.
> User-mode/application profiles like RVA22U64 doesn't care.
>
> Add 'satp_mode' to the profile description. If a profile requires it,
> set it during cpu_set_profile(). We'll also check it during finalize()
> to validate if the running config implements the profile.
>
> Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
> Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Acked-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> target/riscv/cpu.c | 1 +
> target/riscv/cpu.h | 1 +
> target/riscv/tcg/tcg-cpu.c | 40 ++++++++++++++++++++++++++++++++++++++
> 3 files changed, 42 insertions(+)
>
> diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
> index 1dea5db52d..6795f5da41 100644
> --- a/target/riscv/cpu.c
> +++ b/target/riscv/cpu.c
> @@ -1543,6 +1543,7 @@ static RISCVCPUProfile RVA22U64 = {
> .name = "rva22u64",
> .misa_ext = RVI | RVM | RVA | RVF | RVD | RVC | RVU,
> .priv_spec = RISCV_PROFILE_ATTR_UNUSED,
> + .satp_mode = RISCV_PROFILE_ATTR_UNUSED,
> .ext_offsets = {
> CPU_CFG_OFFSET(ext_zicsr), CPU_CFG_OFFSET(ext_zihintpause),
> CPU_CFG_OFFSET(ext_zba), CPU_CFG_OFFSET(ext_zbb),
> diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
> index 485d2da3c2..6c5fceb5f5 100644
> --- a/target/riscv/cpu.h
> +++ b/target/riscv/cpu.h
> @@ -82,6 +82,7 @@ typedef struct riscv_cpu_profile {
> bool enabled;
> bool user_set;
> int priv_spec;
> + int satp_mode;
> const int32_t ext_offsets[];
> } RISCVCPUProfile;
>
> diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c
> index 4d25fc43d2..152f95718b 100644
> --- a/target/riscv/tcg/tcg-cpu.c
> +++ b/target/riscv/tcg/tcg-cpu.c
> @@ -766,6 +766,31 @@ void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)
> riscv_cpu_disable_priv_spec_isa_exts(cpu);
> }
>
> +#ifndef CONFIG_USER_ONLY
> +static bool riscv_cpu_validate_profile_satp(RISCVCPU *cpu,
> + RISCVCPUProfile *profile,
> + bool send_warn)
> +{
> + int satp_max = satp_mode_max_from_map(cpu->cfg.satp_mode.supported);
> +
> + if (profile->satp_mode > satp_max) {
> + if (send_warn) {
> + bool is_32bit = riscv_cpu_is_32bit(cpu);
> + const char *req_satp = satp_mode_str(profile->satp_mode, is_32bit);
> + const char *cur_satp = satp_mode_str(satp_max, is_32bit);
> +
> + warn_report("Profile %s requires satp mode %s, "
> + "but satp mode %s was set", profile->name,
> + req_satp, cur_satp);
> + }
> +
> + return false;
> + }
> +
> + return true;
> +}
> +#endif
> +
> static void riscv_cpu_validate_profile(RISCVCPU *cpu,
> RISCVCPUProfile *profile)
> {
> @@ -775,6 +800,13 @@ static void riscv_cpu_validate_profile(RISCVCPU *cpu,
> bool profile_impl = true;
> int i;
>
> +#ifndef CONFIG_USER_ONLY
> + if (profile->satp_mode != RISCV_PROFILE_ATTR_UNUSED) {
> + profile_impl = riscv_cpu_validate_profile_satp(cpu, profile,
> + send_warn);
> + }
> +#endif
> +
> if (profile->priv_spec != RISCV_PROFILE_ATTR_UNUSED &&
> profile->priv_spec != env->priv_ver) {
> profile_impl = false;
> @@ -1079,6 +1111,14 @@ static void cpu_set_profile(Object *obj, Visitor *v, const char *name,
> cpu->env.priv_ver = profile->priv_spec;
> }
>
> +#ifndef CONFIG_USER_ONLY
> + if (profile->satp_mode != RISCV_PROFILE_ATTR_UNUSED) {
> + const char *satp_prop = satp_mode_str(profile->satp_mode,
> + riscv_cpu_is_32bit(cpu));
> + object_property_set_bool(obj, satp_prop, profile->enabled, NULL);
> + }
> +#endif
> +
> for (i = 0; misa_bits[i] != 0; i++) {
> uint32_t bit = misa_bits[i];
>
> --
> 2.43.0
>
>
^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: [PATCH v13 24/26] target/riscv: add 'parent' in profile description
2023-12-18 12:53 ` [PATCH v13 24/26] target/riscv: add 'parent' in profile description Daniel Henrique Barboza
@ 2024-01-05 2:21 ` Alistair Francis
0 siblings, 0 replies; 48+ messages in thread
From: Alistair Francis @ 2024-01-05 2:21 UTC (permalink / raw)
To: Daniel Henrique Barboza
Cc: qemu-devel, qemu-riscv, alistair.francis, bmeng, liwei1518,
zhiwei_liu, palmer, ajones
On Mon, Dec 18, 2023 at 11:00 PM Daniel Henrique Barboza
<dbarboza@ventanamicro.com> wrote:
>
> Certain S-mode profiles, like RVA22S64 and RVA23S64, mandate all the
> mandatory extensions of their respective U-mode profiles. RVA22S64
> includes all mandatory extensions of RVA22U64, and the same happens with
> RVA23 profiles.
>
> Add a 'parent' field to allow profiles to enable other profiles. This
> will allow us to describe S-mode profiles by specifying their parent
> U-mode profile, then adding just the S-mode specific extensions.
>
> We're naming the field 'parent' to consider the possibility of other
> uses (e.g. a s-mode profile including a previous s-mode profile) in the
> future.
>
> Suggested-by: Andrew Jones <ajones@ventanamicro.com>
> Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
> Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> target/riscv/cpu.c | 1 +
> target/riscv/cpu.h | 1 +
> target/riscv/tcg/tcg-cpu.c | 14 +++++++++++++-
> 3 files changed, 15 insertions(+), 1 deletion(-)
>
> diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
> index 6795f5da41..aa33e7a1cf 100644
> --- a/target/riscv/cpu.c
> +++ b/target/riscv/cpu.c
> @@ -1540,6 +1540,7 @@ Property riscv_cpu_options[] = {
> * having a cfg offset) at this moment.
> */
> static RISCVCPUProfile RVA22U64 = {
> + .parent = NULL,
> .name = "rva22u64",
> .misa_ext = RVI | RVM | RVA | RVF | RVD | RVC | RVU,
> .priv_spec = RISCV_PROFILE_ATTR_UNUSED,
> diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
> index 6c5fceb5f5..44fb0a9ca8 100644
> --- a/target/riscv/cpu.h
> +++ b/target/riscv/cpu.h
> @@ -77,6 +77,7 @@ const char *riscv_get_misa_ext_description(uint32_t bit);
> #define CPU_CFG_OFFSET(_prop) offsetof(struct RISCVCPUConfig, _prop)
>
> typedef struct riscv_cpu_profile {
> + struct riscv_cpu_profile *parent;
> const char *name;
> uint32_t misa_ext;
> bool enabled;
> diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c
> index 152f95718b..6284d36809 100644
> --- a/target/riscv/tcg/tcg-cpu.c
> +++ b/target/riscv/tcg/tcg-cpu.c
> @@ -797,7 +797,7 @@ static void riscv_cpu_validate_profile(RISCVCPU *cpu,
> CPURISCVState *env = &cpu->env;
> const char *warn_msg = "Profile %s mandates disabled extension %s";
> bool send_warn = profile->user_set && profile->enabled;
> - bool profile_impl = true;
> + bool parent_enabled, profile_impl = true;
> int i;
>
> #ifndef CONFIG_USER_ONLY
> @@ -850,6 +850,13 @@ static void riscv_cpu_validate_profile(RISCVCPU *cpu,
> }
>
> profile->enabled = profile_impl;
> +
> + if (profile->parent != NULL) {
> + parent_enabled = object_property_get_bool(OBJECT(cpu),
> + profile->parent->name,
> + NULL);
> + profile->enabled = profile->enabled && parent_enabled;
> + }
> }
>
> static void riscv_cpu_validate_profiles(RISCVCPU *cpu)
> @@ -1107,6 +1114,11 @@ static void cpu_set_profile(Object *obj, Visitor *v, const char *name,
> profile->user_set = true;
> profile->enabled = value;
>
> + if (profile->parent != NULL) {
> + object_property_set_bool(obj, profile->parent->name,
> + profile->enabled, NULL);
> + }
> +
> if (profile->enabled) {
> cpu->env.priv_ver = profile->priv_spec;
> }
> --
> 2.43.0
>
>
^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: [PATCH v13 25/26] target/riscv: add RVA22S64 profile
2023-12-18 12:53 ` [PATCH v13 25/26] target/riscv: add RVA22S64 profile Daniel Henrique Barboza
@ 2024-01-05 2:24 ` Alistair Francis
0 siblings, 0 replies; 48+ messages in thread
From: Alistair Francis @ 2024-01-05 2:24 UTC (permalink / raw)
To: Daniel Henrique Barboza
Cc: qemu-devel, qemu-riscv, alistair.francis, bmeng, liwei1518,
zhiwei_liu, palmer, ajones
On Mon, Dec 18, 2023 at 11:00 PM Daniel Henrique Barboza
<dbarboza@ventanamicro.com> wrote:
>
> The RVA22S64 profile consists of the following:
>
> - all mandatory extensions of RVA22U64;
> - priv spec v1.12.0;
> - satp mode sv39;
> - Ssccptr, a cache related named feature that we're assuming always
> enable since we don't implement a cache;
> - Other named features already implemented: Sstvecd, Sstvala,
> Sscounterenw;
> - the new Svade named feature that was recently added.
>
> Most of the work is already done, so this patch is enough to implement
> the profile.
>
> After this patch, the 'rva22s64' user flag alone can be used with the
> rva64i CPU to boot Linux:
>
> -cpu rv64i,rva22s64=true
>
> This is the /proc/cpuinfo with this profile enabled:
>
> # cat /proc/cpuinfo
> processor : 0
> hart : 0
> isa : rv64imafdc_zicbom_zicbop_zicboz_zicntr_zicsr_zifencei_zihintpause_zihpm_zfhmin_zca_zcd_zba_zbb_zbs_zkt_svinval_svpbmt
> mmu : sv39
>
> Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
> Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> target/riscv/cpu.c | 32 ++++++++++++++++++++++++++++++++
> 1 file changed, 32 insertions(+)
>
> diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
> index aa33e7a1cf..f57a9ee298 100644
> --- a/target/riscv/cpu.c
> +++ b/target/riscv/cpu.c
> @@ -1560,8 +1560,40 @@ static RISCVCPUProfile RVA22U64 = {
> }
> };
>
> +/*
> + * As with RVA22U64, RVA22S64 also defines 'named features'.
> + *
> + * Cache related features that we consider enabled since we don't
> + * implement cache: Ssccptr
> + *
> + * Other named features that we already implement: Sstvecd, Sstvala,
> + * Sscounterenw
> + *
> + * Named features that we need to enable: svade
> + *
> + * The remaining features/extensions comes from RVA22U64.
> + */
> +static RISCVCPUProfile RVA22S64 = {
> + .parent = &RVA22U64,
> + .name = "rva22s64",
> + .misa_ext = RVS,
> + .priv_spec = PRIV_VERSION_1_12_0,
> + .satp_mode = VM_1_10_SV39,
> + .ext_offsets = {
> + /* rva22s64 exts */
> + CPU_CFG_OFFSET(ext_zifencei), CPU_CFG_OFFSET(ext_svpbmt),
> + CPU_CFG_OFFSET(ext_svinval),
> +
> + /* rva22s64 named features */
> + CPU_CFG_OFFSET(svade),
> +
> + RISCV_PROFILE_EXT_LIST_END
> + }
> +};
> +
> RISCVCPUProfile *riscv_profiles[] = {
> &RVA22U64,
> + &RVA22S64,
> NULL,
> };
>
> --
> 2.43.0
>
>
^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: [PATCH v13 26/26] target/riscv: add rva22s64 cpu
2023-12-18 12:53 ` [PATCH v13 26/26] target/riscv: add rva22s64 cpu Daniel Henrique Barboza
@ 2024-01-05 2:25 ` Alistair Francis
0 siblings, 0 replies; 48+ messages in thread
From: Alistair Francis @ 2024-01-05 2:25 UTC (permalink / raw)
To: Daniel Henrique Barboza
Cc: qemu-devel, qemu-riscv, alistair.francis, bmeng, liwei1518,
zhiwei_liu, palmer, ajones
On Mon, Dec 18, 2023 at 11:01 PM Daniel Henrique Barboza
<dbarboza@ventanamicro.com> wrote:
>
> Add a new profile CPU 'rva22s64' to work as an alias of
>
> -cpu rv64i,rva22s64
>
> Like the existing rva22u64 CPU already does with the RVA22U64 profile.
>
> Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
> Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> target/riscv/cpu-qom.h | 1 +
> target/riscv/cpu.c | 8 ++++++++
> 2 files changed, 9 insertions(+)
>
> diff --git a/target/riscv/cpu-qom.h b/target/riscv/cpu-qom.h
> index 12fe78fc52..9219c2fcc3 100644
> --- a/target/riscv/cpu-qom.h
> +++ b/target/riscv/cpu-qom.h
> @@ -36,6 +36,7 @@
> #define TYPE_RISCV_CPU_BASE128 RISCV_CPU_TYPE_NAME("x-rv128")
> #define TYPE_RISCV_CPU_RV64I RISCV_CPU_TYPE_NAME("rv64i")
> #define TYPE_RISCV_CPU_RVA22U64 RISCV_CPU_TYPE_NAME("rva22u64")
> +#define TYPE_RISCV_CPU_RVA22S64 RISCV_CPU_TYPE_NAME("rva22s64")
> #define TYPE_RISCV_CPU_IBEX RISCV_CPU_TYPE_NAME("lowrisc-ibex")
> #define TYPE_RISCV_CPU_SHAKTI_C RISCV_CPU_TYPE_NAME("shakti-c")
> #define TYPE_RISCV_CPU_SIFIVE_E31 RISCV_CPU_TYPE_NAME("sifive-e31")
> diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
> index f57a9ee298..959c97c869 100644
> --- a/target/riscv/cpu.c
> +++ b/target/riscv/cpu.c
> @@ -1624,6 +1624,13 @@ static void rva22u64_profile_cpu_init(Object *obj)
>
> RVA22U64.enabled = true;
> }
> +
> +static void rva22s64_profile_cpu_init(Object *obj)
> +{
> + rv64i_bare_cpu_init(obj);
> +
> + RVA22S64.enabled = true;
> +}
> #endif
>
> static const gchar *riscv_gdb_arch_name(CPUState *cs)
> @@ -1968,6 +1975,7 @@ static const TypeInfo riscv_cpu_type_infos[] = {
> DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_BASE128, rv128_base_cpu_init),
> DEFINE_BARE_CPU(TYPE_RISCV_CPU_RV64I, rv64i_bare_cpu_init),
> DEFINE_PROFILE_CPU(TYPE_RISCV_CPU_RVA22U64, rva22u64_profile_cpu_init),
> + DEFINE_PROFILE_CPU(TYPE_RISCV_CPU_RVA22S64, rva22s64_profile_cpu_init),
> #endif
> };
>
> --
> 2.43.0
>
>
^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: [PATCH v13 00/26] riscv: RVA22 profiles support
2023-12-18 12:53 [PATCH v13 00/26] riscv: RVA22 profiles support Daniel Henrique Barboza
` (26 preceding siblings ...)
2024-01-02 11:40 ` [PATCH v13 00/26] riscv: RVA22 profiles support Daniel Henrique Barboza
@ 2024-01-05 2:39 ` Alistair Francis
27 siblings, 0 replies; 48+ messages in thread
From: Alistair Francis @ 2024-01-05 2:39 UTC (permalink / raw)
To: Daniel Henrique Barboza
Cc: qemu-devel, qemu-riscv, alistair.francis, bmeng, liwei1518,
zhiwei_liu, palmer, ajones
On Mon, Dec 18, 2023 at 10:55 PM Daniel Henrique Barboza
<dbarboza@ventanamicro.com> wrote:
>
> Hi,
>
> This is a merge of the two profile series:
>
> "[PATCH for-9.0 v12 00/18] riscv: rv64i/rva22u64 CPUs, RVA22U64 profile support"
> "[PATCH for-9.0 v2 0/8] target/riscv: implement RVA22S64 profile"
>
> I'm sending them together since the second series is dependent on the first.
>
> Quick summary of the major features added:
>
> - A new rv64i CPU type. This is a CPU that has only RVI enabled;
>
> - 'rva22u64' and 'rva22s64' profile flags. They were designed to be used
> with the 'rv64i' CPU but can be used with other generic CPUs like
> rv64;
>
> - Two new profile CPUs: 'rva22u64' and 'rva22s64'. A profile CPU is an
> alias of '-cpu rv64,profile=on' and it's the most convenient way of
> using profiles. E.g to launch an rva22s64 'virt' machine:
>
> ./qemu-system-riscv64 -M virt -cpu rva22s64 (...)
>
> To test an application with an rva22u64 profile with linux-user mode:
>
> ./qemu-riscv64 -cpu rva22u64 (...)
>
>
> The series can also be fetch via:
>
> https://gitlab.com/danielhb/qemu/-/tree/rva22_v13
>
> Patches rebased on top of Alistair riscv-to-apply.next.
>
> All patches acked.
>
> Daniel Henrique Barboza (26):
> target/riscv: create TYPE_RISCV_VENDOR_CPU
> target/riscv/tcg: do not use "!generic" CPU checks
> target/riscv/tcg: update priv_ver on user_set extensions
> target/riscv: add rv64i CPU
> target/riscv: add zicbop extension flag
> target/riscv/tcg: add 'zic64b' support
> riscv-qmp-cmds.c: expose named features in cpu_model_expansion
> target/riscv: add rva22u64 profile definition
> target/riscv/kvm: add 'rva22u64' flag as unavailable
> target/riscv/tcg: add user flag for profile support
> target/riscv/tcg: add MISA user options hash
> target/riscv/tcg: add riscv_cpu_write_misa_bit()
> target/riscv/tcg: handle profile MISA bits
> target/riscv/tcg: add hash table insert helpers
> target/riscv/tcg: honor user choice for G MISA bits
> target/riscv/tcg: validate profiles during finalize
> riscv-qmp-cmds.c: add profile flags in cpu-model-expansion
> target/riscv: add 'rva22u64' CPU
> target/riscv: implement svade
> target/riscv: add priv ver restriction to profiles
> target/riscv/cpu.c: finalize satp_mode earlier
> target/riscv/cpu.c: add riscv_cpu_is_32bit()
> target/riscv: add satp_mode profile support
> target/riscv: add 'parent' in profile description
> target/riscv: add RVA22S64 profile
> target/riscv: add rva22s64 cpu
Thanks!
Applied to riscv-to-apply.next
Alistair
>
> hw/riscv/virt.c | 5 +
> target/riscv/cpu-qom.h | 5 +
> target/riscv/cpu.c | 201 +++++++++++++--
> target/riscv/cpu.h | 18 ++
> target/riscv/cpu_cfg.h | 4 +
> target/riscv/kvm/kvm-cpu.c | 7 +-
> target/riscv/riscv-qmp-cmds.c | 44 +++-
> target/riscv/tcg/tcg-cpu.c | 450 +++++++++++++++++++++++++++++++---
> 8 files changed, 672 insertions(+), 62 deletions(-)
>
> --
> 2.43.0
>
>
^ permalink raw reply [flat|nested] 48+ messages in thread
end of thread, other threads:[~2024-01-05 2:40 UTC | newest]
Thread overview: 48+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-12-18 12:53 [PATCH v13 00/26] riscv: RVA22 profiles support Daniel Henrique Barboza
2023-12-18 12:53 ` [PATCH v13 01/26] target/riscv: create TYPE_RISCV_VENDOR_CPU Daniel Henrique Barboza
2023-12-18 12:53 ` [PATCH v13 02/26] target/riscv/tcg: do not use "!generic" CPU checks Daniel Henrique Barboza
2023-12-18 12:53 ` [PATCH v13 03/26] target/riscv/tcg: update priv_ver on user_set extensions Daniel Henrique Barboza
2024-01-04 4:02 ` Alistair Francis
2023-12-18 12:53 ` [PATCH v13 04/26] target/riscv: add rv64i CPU Daniel Henrique Barboza
2024-01-04 4:11 ` Alistair Francis
2023-12-18 12:53 ` [PATCH v13 05/26] target/riscv: add zicbop extension flag Daniel Henrique Barboza
2024-01-04 4:12 ` Alistair Francis
2023-12-18 12:53 ` [PATCH v13 06/26] target/riscv/tcg: add 'zic64b' support Daniel Henrique Barboza
2024-01-04 5:00 ` Alistair Francis
2023-12-18 12:53 ` [PATCH v13 07/26] riscv-qmp-cmds.c: expose named features in cpu_model_expansion Daniel Henrique Barboza
2024-01-04 5:13 ` Alistair Francis
2023-12-18 12:53 ` [PATCH v13 08/26] target/riscv: add rva22u64 profile definition Daniel Henrique Barboza
2023-12-18 12:53 ` [PATCH v13 09/26] target/riscv/kvm: add 'rva22u64' flag as unavailable Daniel Henrique Barboza
2023-12-18 12:53 ` [PATCH v13 10/26] target/riscv/tcg: add user flag for profile support Daniel Henrique Barboza
2024-01-04 6:19 ` Alistair Francis
2023-12-18 12:53 ` [PATCH v13 11/26] target/riscv/tcg: add MISA user options hash Daniel Henrique Barboza
2023-12-18 12:53 ` [PATCH v13 12/26] target/riscv/tcg: add riscv_cpu_write_misa_bit() Daniel Henrique Barboza
2023-12-18 12:53 ` [PATCH v13 13/26] target/riscv/tcg: handle profile MISA bits Daniel Henrique Barboza
2023-12-18 12:53 ` [PATCH v13 14/26] target/riscv/tcg: add hash table insert helpers Daniel Henrique Barboza
2024-01-04 6:25 ` Alistair Francis
2023-12-18 12:53 ` [PATCH v13 15/26] target/riscv/tcg: honor user choice for G MISA bits Daniel Henrique Barboza
2023-12-18 12:53 ` [PATCH v13 16/26] target/riscv/tcg: validate profiles during finalize Daniel Henrique Barboza
2024-01-04 6:27 ` Alistair Francis
2023-12-18 12:53 ` [PATCH v13 17/26] riscv-qmp-cmds.c: add profile flags in cpu-model-expansion Daniel Henrique Barboza
2024-01-04 6:29 ` Alistair Francis
2023-12-18 12:53 ` [PATCH v13 18/26] target/riscv: add 'rva22u64' CPU Daniel Henrique Barboza
2024-01-04 6:31 ` Alistair Francis
2023-12-18 12:53 ` [PATCH v13 19/26] target/riscv: implement svade Daniel Henrique Barboza
2024-01-04 22:59 ` Alistair Francis
2023-12-18 12:53 ` [PATCH v13 20/26] target/riscv: add priv ver restriction to profiles Daniel Henrique Barboza
2024-01-04 23:02 ` Alistair Francis
2023-12-18 12:53 ` [PATCH v13 21/26] target/riscv/cpu.c: finalize satp_mode earlier Daniel Henrique Barboza
2024-01-04 23:02 ` Alistair Francis
2023-12-18 12:53 ` [PATCH v13 22/26] target/riscv/cpu.c: add riscv_cpu_is_32bit() Daniel Henrique Barboza
2024-01-04 23:04 ` Alistair Francis
2023-12-18 12:53 ` [PATCH v13 23/26] target/riscv: add satp_mode profile support Daniel Henrique Barboza
2024-01-04 23:07 ` Alistair Francis
2023-12-18 12:53 ` [PATCH v13 24/26] target/riscv: add 'parent' in profile description Daniel Henrique Barboza
2024-01-05 2:21 ` Alistair Francis
2023-12-18 12:53 ` [PATCH v13 25/26] target/riscv: add RVA22S64 profile Daniel Henrique Barboza
2024-01-05 2:24 ` Alistair Francis
2023-12-18 12:53 ` [PATCH v13 26/26] target/riscv: add rva22s64 cpu Daniel Henrique Barboza
2024-01-05 2:25 ` Alistair Francis
2024-01-02 11:40 ` [PATCH v13 00/26] riscv: RVA22 profiles support Daniel Henrique Barboza
2024-01-02 15:12 ` Andrew Jones
2024-01-05 2:39 ` Alistair Francis
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).