qapi,risc-v: add query-cpu-model-expansion
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>
This commit is contained in:
parent
456a65546f
commit
aeb2bc5950
@ -231,7 +231,8 @@
|
|||||||
'if': { 'any': [ 'TARGET_S390X',
|
'if': { 'any': [ 'TARGET_S390X',
|
||||||
'TARGET_I386',
|
'TARGET_I386',
|
||||||
'TARGET_ARM',
|
'TARGET_ARM',
|
||||||
'TARGET_LOONGARCH64' ] } }
|
'TARGET_LOONGARCH64',
|
||||||
|
'TARGET_RISCV' ] } }
|
||||||
|
|
||||||
##
|
##
|
||||||
# @query-cpu-model-expansion:
|
# @query-cpu-model-expansion:
|
||||||
@ -277,7 +278,8 @@
|
|||||||
'if': { 'any': [ 'TARGET_S390X',
|
'if': { 'any': [ 'TARGET_S390X',
|
||||||
'TARGET_I386',
|
'TARGET_I386',
|
||||||
'TARGET_ARM',
|
'TARGET_ARM',
|
||||||
'TARGET_LOONGARCH64' ] } }
|
'TARGET_LOONGARCH64',
|
||||||
|
'TARGET_RISCV' ] } }
|
||||||
|
|
||||||
##
|
##
|
||||||
# @CpuDefinitionInfo:
|
# @CpuDefinitionInfo:
|
||||||
|
@ -24,8 +24,12 @@
|
|||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
|
||||||
|
#include "qapi/error.h"
|
||||||
#include "qapi/qapi-commands-machine-target.h"
|
#include "qapi/qapi-commands-machine-target.h"
|
||||||
|
#include "qapi/qmp/qdict.h"
|
||||||
|
#include "qom/qom-qobject.h"
|
||||||
#include "cpu-qom.h"
|
#include "cpu-qom.h"
|
||||||
|
#include "cpu.h"
|
||||||
|
|
||||||
static void riscv_cpu_add_definition(gpointer data, gpointer user_data)
|
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;
|
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;
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user