[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 14/49] qapi,risc-v: add query-cpu-model-expansion
|
From: |
Alistair Francis |
|
Subject: |
[PULL 14/49] qapi,risc-v: add query-cpu-model-expansion |
|
Date: |
Tue, 7 Nov 2023 12:29:10 +1000 |
From: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
This API is used to inspect the characteristics of a given CPU model. It
also allows users to validate a CPU model with a certain configuration,
e.g. if "-cpu X,a=true,b=false" is a valid setup for a given QEMU
binary. We'll start implementing the first part. The second requires
more changes in RISC-V CPU boot flow.
The implementation is inspired by the existing ARM
query-cpu-model-expansion impl in target/arm/arm-qmp-cmds.c. We'll
create a RISCVCPU object with the required model, fetch its existing
properties, add a couple of relevant boolean options (pmp and mmu) and
display it to users.
Here's an usage example:
./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": {"zicond": false, "x-zvfh":
false, "mmu": true, "x-zvfbfwma": false, "x-zvfbfmin": false, "xtheadbs":
false, "xtheadbb": false, "xtheadba": false, "xtheadmemidx": false,
"smstateen": false, "zfinx": false, "Zve64f": false, "Zve32f": false,
"x-zvfhmin": false, "xventanacondops": false, "xtheadcondmov": false, "svpbmt":
false, "zbs": true, "zbc": true, "zbb": true, "zba": true, "zicboz": true,
"xtheadmac": false, "Zfh": false, "Zfa": true, "zbkx": false, "zbkc": false,
"zbkb": false, "Zve64d": false, "x-zfbfmin": false, "zk": false, "x-epmp":
false, "xtheadmempair": false, "zkt": false, "zks": false, "zkr": false, "zkn":
false, "Zfhmin": false, "zksh": false, "zknh": false, "zkne": false, "zknd":
false, "zhinx": false, "Zicsr": true, "sscofpmf": false, "Zihintntl": true,
"sstc": true, "xtheadcmo": false, "x-zvbb": false, "zksed": false, "x-zvkned":
false, "xtheadsync": false, "x-zvkg": false, "zhinxmin": false, "svadu": true,
"xtheadfmv": false, "x-zvksed": false, "svnapot": false, "pmp": true,
"x-zvknhb": false, "x-zvknha": false, "xtheadfmemidx": false, "x-zvksh": false,
"zdinx": false, "zicbom": true, "Zihintpause": true, "svinval": false, "zcf":
false, "zce": false, "zcd": false, "zcb": false, "zca": false, "x-ssaia":
false, "x-smaia": false, "zmmul": false, "x-zvbc": false, "Zifencei": true,
"zcmt": false, "zcmp": false, "Zawrs": true}}}}
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Message-ID: <20231018195638.211151-3-dbarboza@ventanamicro.com>
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
---
qapi/machine-target.json | 6 ++-
target/riscv/riscv-qmp-cmds.c | 75 +++++++++++++++++++++++++++++++++++
2 files changed, 79 insertions(+), 2 deletions(-)
diff --git a/qapi/machine-target.json b/qapi/machine-target.json
index c8d7d9868d..7b7149f81c 100644
--- a/qapi/machine-target.json
+++ b/qapi/machine-target.json
@@ -231,7 +231,8 @@
'if': { 'any': [ 'TARGET_S390X',
'TARGET_I386',
'TARGET_ARM',
- 'TARGET_LOONGARCH64' ] } }
+ 'TARGET_LOONGARCH64',
+ 'TARGET_RISCV' ] } }
##
# @query-cpu-model-expansion:
@@ -277,7 +278,8 @@
'if': { 'any': [ 'TARGET_S390X',
'TARGET_I386',
'TARGET_ARM',
- 'TARGET_LOONGARCH64' ] } }
+ 'TARGET_LOONGARCH64',
+ 'TARGET_RISCV' ] } }
##
# @CpuDefinitionInfo:
diff --git a/target/riscv/riscv-qmp-cmds.c b/target/riscv/riscv-qmp-cmds.c
index 5ecff1afb3..2170562e3a 100644
--- a/target/riscv/riscv-qmp-cmds.c
+++ b/target/riscv/riscv-qmp-cmds.c
@@ -24,8 +24,12 @@
#include "qemu/osdep.h"
+#include "qapi/error.h"
#include "qapi/qapi-commands-machine-target.h"
+#include "qapi/qmp/qdict.h"
+#include "qom/qom-qobject.h"
#include "cpu-qom.h"
+#include "cpu.h"
static void riscv_cpu_add_definition(gpointer data, gpointer user_data)
{
@@ -55,3 +59,74 @@ CpuDefinitionInfoList *qmp_query_cpu_definitions(Error
**errp)
return cpu_list;
}
+
+static void riscv_obj_add_qdict_prop(Object *obj, QDict *qdict_out,
+ const char *name)
+{
+ ObjectProperty *prop = object_property_find(obj, name);
+
+ if (prop) {
+ QObject *value;
+
+ assert(prop->get);
+ value = object_property_get_qobject(obj, name, &error_abort);
+
+ qdict_put_obj(qdict_out, name, value);
+ }
+}
+
+static void riscv_obj_add_multiext_props(Object *obj, QDict *qdict_out,
+ const RISCVCPUMultiExtConfig *arr)
+{
+ for (int i = 0; arr[i].name != NULL; i++) {
+ riscv_obj_add_qdict_prop(obj, qdict_out, arr[i].name);
+ }
+}
+
+CpuModelExpansionInfo *qmp_query_cpu_model_expansion(CpuModelExpansionType
type,
+ CpuModelInfo *model,
+ Error **errp)
+{
+ CpuModelExpansionInfo *expansion_info;
+ QDict *qdict_out;
+ ObjectClass *oc;
+ Object *obj;
+
+ if (type != CPU_MODEL_EXPANSION_TYPE_FULL) {
+ error_setg(errp, "The requested expansion type is not supported");
+ return NULL;
+ }
+
+ oc = cpu_class_by_name(TYPE_RISCV_CPU, model->name);
+ if (!oc) {
+ error_setg(errp, "The CPU type '%s' is not a known RISC-V CPU type",
+ model->name);
+ return NULL;
+ }
+
+ obj = object_new(object_class_get_name(oc));
+
+ expansion_info = g_new0(CpuModelExpansionInfo, 1);
+ expansion_info->model = g_malloc0(sizeof(*expansion_info->model));
+ expansion_info->model->name = g_strdup(model->name);
+
+ qdict_out = qdict_new();
+
+ 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);
+
+ /* Add our CPU boolean options too */
+ riscv_obj_add_qdict_prop(obj, qdict_out, "mmu");
+ riscv_obj_add_qdict_prop(obj, qdict_out, "pmp");
+
+ if (!qdict_size(qdict_out)) {
+ qobject_unref(qdict_out);
+ } else {
+ expansion_info->model->props = QOBJECT(qdict_out);
+ }
+
+ object_unref(obj);
+
+ return expansion_info;
+}
--
2.41.0
- [PULL 04/49] target/riscv: rename ext_icboz to ext_zicboz, (continued)
- [PULL 04/49] target/riscv: rename ext_icboz to ext_zicboz, Alistair Francis, 2023/11/06
- [PULL 05/49] target/riscv: Without H-mode mask all HS mode inturrupts in mie., Alistair Francis, 2023/11/06
- [PULL 06/49] target/riscv: Check for async flag in case of RISCV_EXCP_SEMIHOST., Alistair Francis, 2023/11/06
- [PULL 07/49] target/riscv: Set VS* bits to one in mideleg when H-Ext is enabled, Alistair Francis, 2023/11/06
- [PULL 08/49] target/riscv: Split interrupt logic from riscv_cpu_update_mip., Alistair Francis, 2023/11/06
- [PULL 09/49] target/riscv: Add M-mode virtual interrupt and IRQ filtering support., Alistair Francis, 2023/11/06
- [PULL 10/49] target/riscv: Add HS-mode virtual interrupt and IRQ filtering support., Alistair Francis, 2023/11/06
- [PULL 12/49] docs/system/riscv: update 'virt' machine core limit, Alistair Francis, 2023/11/06
- [PULL 13/49] target/riscv/kvm/kvm-cpu.c: add missing property getters(), Alistair Francis, 2023/11/06
- [PULL 11/49] linux-user/riscv: change default cpu to 'max', Alistair Francis, 2023/11/06
- [PULL 14/49] qapi,risc-v: add query-cpu-model-expansion,
Alistair Francis <=
- [PULL 16/49] target/riscv: handle custom props in qmp_query_cpu_model_expansion, Alistair Francis, 2023/11/06
- [PULL 15/49] target/riscv/tcg: add tcg_cpu_finalize_features(), Alistair Francis, 2023/11/06
- [PULL 17/49] target/riscv: add riscv_cpu_accelerator_compatible(), Alistair Francis, 2023/11/06
- [PULL 20/49] target/riscv: pmp: Clear pmp/smepmp bits on reset, Alistair Francis, 2023/11/06
- [PULL 21/49] target/riscv: pmp: Ignore writes when RW=01, Alistair Francis, 2023/11/06
- [PULL 18/49] target/riscv/riscv-qmp-cmds.c: check CPU accel in query-cpu-model-expansion, Alistair Francis, 2023/11/06
- [PULL 22/49] target/riscv: add zicntr extension flag for TCG, Alistair Francis, 2023/11/06
- [PULL 19/49] Add epmp to extensions list and rename it to smepmp, Alistair Francis, 2023/11/06
- [PULL 23/49] target/riscv/kvm: add zicntr reg, Alistair Francis, 2023/11/06
- [PULL 24/49] target/riscv: add zihpm extension flag for TCG, Alistair Francis, 2023/11/06