This patch enables 'query-cpu-model-expansion' on all architectures. Only architectures that implement the command will return results, others will return an error message as before.
This patch lays the groundwork for parsing a -cpu cpu,help option as specified in https://gitlab.com/qemu-project/qemu/-/issues/1480 Signed-off-by: Dinah Baum <dinahbaum...@gmail.com> --- cpu.c | 20 ++++++++++++ include/exec/cpu-common.h | 8 +++++ qapi/machine-target-common.json | 51 +++++++++++++++++++++++++++++ qapi/machine-target.json | 56 -------------------------------- target/arm/arm-qmp-cmds.c | 7 ++-- target/arm/cpu.h | 7 +++- target/i386/cpu-sysemu.c | 7 ++-- target/i386/cpu.h | 6 ++++ target/s390x/cpu.h | 7 ++++ target/s390x/cpu_models_sysemu.c | 6 ++-- 10 files changed, 108 insertions(+), 67 deletions(-) diff --git a/cpu.c b/cpu.c index 849bac062c..daf4e1ff0d 100644 --- a/cpu.c +++ b/cpu.c @@ -292,6 +292,26 @@ void list_cpus(const char *optarg) #endif } +CpuModelExpansionInfo *get_cpu_model_expansion_info(CpuModelExpansionType type, + CpuModelInfo *model, + Error **errp) +{ + /* XXX: implement cpu_model_expansion for targets that still miss it */ +#if defined(cpu_model_expansion) + return cpu_model_expansion(type, model, errp); +#else + error_setg(errp, "Could not query cpu model information"); + return NULL; +#endif +} + +CpuModelExpansionInfo *qmp_query_cpu_model_expansion(CpuModelExpansionType type, + CpuModelInfo *model, + Error **errp) +{ + return get_cpu_model_expansion_info(type, model, errp); +} + #if defined(CONFIG_USER_ONLY) void tb_invalidate_phys_addr(target_ulong addr) { diff --git a/include/exec/cpu-common.h b/include/exec/cpu-common.h index 6feaa40ca7..ec6024dfde 100644 --- a/include/exec/cpu-common.h +++ b/include/exec/cpu-common.h @@ -7,6 +7,8 @@ #include "exec/hwaddr.h" #endif +#include "qapi/qapi-commands-machine-target-common.h" + /** * vaddr: * Type wide enough to contain any #target_ulong virtual address. @@ -166,5 +168,11 @@ int cpu_memory_rw_debug(CPUState *cpu, vaddr addr, extern int singlestep; void list_cpus(const char *optarg); +typedef void (*cpu_model_expansion_func)(CpuModelExpansionType type, + CpuModelInfo *model, + Error **errp); +CpuModelExpansionInfo *get_cpu_model_expansion_info(CpuModelExpansionType type, + CpuModelInfo *model, + Error **errp); #endif /* CPU_COMMON_H */ diff --git a/qapi/machine-target-common.json b/qapi/machine-target-common.json index 1e6da3177d..44713e9935 100644 --- a/qapi/machine-target-common.json +++ b/qapi/machine-target-common.json @@ -77,3 +77,54 @@ ## { 'enum': 'CpuModelCompareResult', 'data': [ 'incompatible', 'identical', 'superset', 'subset' ] } + +## +# @CpuModelExpansionInfo: +# +# The result of a cpu model expansion. +# +# @model: the expanded CpuModelInfo. +# +# Since: 2.8 +## +{ 'struct': 'CpuModelExpansionInfo', + 'data': { 'model': 'CpuModelInfo' } } + +## +# @query-cpu-model-expansion: +# +# Expands a given CPU model (or a combination of CPU model + additional options) +# to different granularities, allowing tooling to get an understanding what a +# specific CPU model looks like in QEMU under a certain configuration. +# +# This interface can be used to query the "host" CPU model. +# +# The data returned by this command may be affected by: +# +# * QEMU version: CPU models may look different depending on the QEMU version. +# (Except for CPU models reported as "static" in query-cpu-definitions.) +# * machine-type: CPU model may look different depending on the machine-type. +# (Except for CPU models reported as "static" in query-cpu-definitions.) +# * machine options (including accelerator): in some architectures, CPU models +# may look different depending on machine and accelerator options. (Except for +# CPU models reported as "static" in query-cpu-definitions.) +# * "-cpu" arguments and global properties: arguments to the -cpu option and +# global properties may affect expansion of CPU models. Using +# query-cpu-model-expansion while using these is not advised. +# +# Some architectures may not support all expansion types. s390x supports +# "full" and "static". Arm only supports "full". +# +# Returns: a CpuModelExpansionInfo. Returns an error if expanding CPU models is +# not supported, if the model cannot be expanded, if the model contains +# an unknown CPU definition name, unknown properties or properties +# with a wrong type. Also returns an error if an expansion type is +# not supported. +# +# Since: 2.8 +## +{ 'command': 'query-cpu-model-expansion', + 'data': { 'type': 'CpuModelExpansionType', + 'model': 'CpuModelInfo' }, + 'returns': 'CpuModelExpansionInfo' } + diff --git a/qapi/machine-target.json b/qapi/machine-target.json index 1cacfde88e..cfc8b0c7f8 100644 --- a/qapi/machine-target.json +++ b/qapi/machine-target.json @@ -130,62 +130,6 @@ 'returns': 'CpuModelBaselineInfo', 'if': 'TARGET_S390X' } -## -# @CpuModelExpansionInfo: -# -# The result of a cpu model expansion. -# -# @model: the expanded CpuModelInfo. -# -# Since: 2.8 -## -{ 'struct': 'CpuModelExpansionInfo', - 'data': { 'model': 'CpuModelInfo' }, - 'if': { 'any': [ 'TARGET_S390X', - 'TARGET_I386', - 'TARGET_ARM' ] } } - -## -# @query-cpu-model-expansion: -# -# Expands a given CPU model (or a combination of CPU model + additional options) -# to different granularities, allowing tooling to get an understanding what a -# specific CPU model looks like in QEMU under a certain configuration. -# -# This interface can be used to query the "host" CPU model. -# -# The data returned by this command may be affected by: -# -# * QEMU version: CPU models may look different depending on the QEMU version. -# (Except for CPU models reported as "static" in query-cpu-definitions.) -# * machine-type: CPU model may look different depending on the machine-type. -# (Except for CPU models reported as "static" in query-cpu-definitions.) -# * machine options (including accelerator): in some architectures, CPU models -# may look different depending on machine and accelerator options. (Except for -# CPU models reported as "static" in query-cpu-definitions.) -# * "-cpu" arguments and global properties: arguments to the -cpu option and -# global properties may affect expansion of CPU models. Using -# query-cpu-model-expansion while using these is not advised. -# -# Some architectures may not support all expansion types. s390x supports -# "full" and "static". Arm only supports "full". -# -# Returns: a CpuModelExpansionInfo. Returns an error if expanding CPU models is -# not supported, if the model cannot be expanded, if the model contains -# an unknown CPU definition name, unknown properties or properties -# with a wrong type. Also returns an error if an expansion type is -# not supported. -# -# Since: 2.8 -## -{ 'command': 'query-cpu-model-expansion', - 'data': { 'type': 'CpuModelExpansionType', - 'model': 'CpuModelInfo' }, - 'returns': 'CpuModelExpansionInfo', - 'if': { 'any': [ 'TARGET_S390X', - 'TARGET_I386', - 'TARGET_ARM' ] } } - ## # @CpuDefinitionInfo: # diff --git a/target/arm/arm-qmp-cmds.c b/target/arm/arm-qmp-cmds.c index c8fa524002..e591e7c362 100644 --- a/target/arm/arm-qmp-cmds.c +++ b/target/arm/arm-qmp-cmds.c @@ -21,6 +21,7 @@ */ #include "qemu/osdep.h" +#include "cpu.h" #include "hw/boards.h" #include "kvm_arm.h" #include "qapi/error.h" @@ -99,9 +100,9 @@ static const char *cpu_model_advertised_features[] = { NULL }; -CpuModelExpansionInfo *qmp_query_cpu_model_expansion(CpuModelExpansionType type, - CpuModelInfo *model, - Error **errp) +CpuModelExpansionInfo *get_cpu_model_expansion(CpuModelExpansionType type, + CpuModelInfo *model, + Error **errp) { CpuModelExpansionInfo *expansion_info; const QDict *qdict_in = NULL; diff --git a/target/arm/cpu.h b/target/arm/cpu.h index c097cae988..d5dcc2ef11 100644 --- a/target/arm/cpu.h +++ b/target/arm/cpu.h @@ -2660,7 +2660,12 @@ bool write_cpustate_to_list(ARMCPU *cpu, bool kvm_sync); #define TYPE_ARM_HOST_CPU "host-" TYPE_ARM_CPU #define cpu_list arm_cpu_list - +#ifdef CONFIG_SOFTMMU +CpuModelExpansionInfo *get_cpu_model_expansion(CpuModelExpansionType type, + CpuModelInfo *model, + Error **errp); +#define cpu_model_expansion get_cpu_model_expansion +#endif /* ARM has the following "translation regimes" (as the ARM ARM calls them): * * If EL3 is 64-bit: diff --git a/target/i386/cpu-sysemu.c b/target/i386/cpu-sysemu.c index 28115edf44..c01c85839c 100644 --- a/target/i386/cpu-sysemu.c +++ b/target/i386/cpu-sysemu.c @@ -176,10 +176,9 @@ out: return xc; } -CpuModelExpansionInfo * -qmp_query_cpu_model_expansion(CpuModelExpansionType type, - CpuModelInfo *model, - Error **errp) +CpuModelExpansionInfo *get_cpu_model_expansion(CpuModelExpansionType type, + CpuModelInfo *model, + Error **errp) { X86CPU *xc = NULL; Error *err = NULL; diff --git a/target/i386/cpu.h b/target/i386/cpu.h index d243e290d3..7ab633c642 100644 --- a/target/i386/cpu.h +++ b/target/i386/cpu.h @@ -2209,6 +2209,12 @@ uint64_t cpu_get_tsc(CPUX86State *env); #endif #define cpu_list x86_cpu_list +#ifdef CONFIG_SOFTMMU +CpuModelExpansionInfo *get_cpu_model_expansion(CpuModelExpansionType type, + CpuModelInfo *model, + Error **errp); +#define cpu_model_expansion get_cpu_model_expansion +#endif /* MMU modes definitions */ #define MMU_KSMAP_IDX 0 diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h index c47e7adcb1..da5d9b4bf9 100644 --- a/target/s390x/cpu.h +++ b/target/s390x/cpu.h @@ -810,6 +810,13 @@ void s390_cpu_list(void); void s390_set_qemu_cpu_model(uint16_t type, uint8_t gen, uint8_t ec_ga, const S390FeatInit feat_init); +#ifdef CONFIG_SOFTMMU +/* cpu_models-sysemu.c */ +CpuModelExpansionInfo *get_cpu_model_expansion(CpuModelExpansionType type, + CpuModelInfo *model, + Error **errp); +#define cpu_model_expansion get_cpu_model_expansion +#endif /* helper.c */ #define S390_CPU_TYPE_SUFFIX "-" TYPE_S390_CPU diff --git a/target/s390x/cpu_models_sysemu.c b/target/s390x/cpu_models_sysemu.c index 63981bf36b..ef3845f11c 100644 --- a/target/s390x/cpu_models_sysemu.c +++ b/target/s390x/cpu_models_sysemu.c @@ -213,9 +213,9 @@ static void cpu_info_from_model(CpuModelInfo *info, const S390CPUModel *model, } } -CpuModelExpansionInfo *qmp_query_cpu_model_expansion(CpuModelExpansionType type, - CpuModelInfo *model, - Error **errp) +CpuModelExpansionInfo *get_cpu_model_expansion(CpuModelExpansionType type, + CpuModelInfo *model, + Error **errp) { Error *err = NULL; CpuModelExpansionInfo *expansion_info = NULL; -- 2.30.2