diff --git a/QMP/qmp-shell b/QMP/qmp-shell index 24b665c8c0..d126e63ad1 100755 --- a/QMP/qmp-shell +++ b/QMP/qmp-shell @@ -101,7 +101,12 @@ class QMPShell(qmp.QEMUMonitorProtocol): try: value = int(opt[1]) except ValueError: - value = opt[1] + if opt[1] == 'true': + value = True + elif opt[1] == 'false': + value = False + else: + value = opt[1] qmpcmd['arguments'][opt[0]] = value return qmpcmd diff --git a/hmp-commands.hx b/hmp-commands.hx index df44906ef9..3d98604f77 100644 --- a/hmp-commands.hx +++ b/hmp-commands.hx @@ -1643,6 +1643,8 @@ show qdev device model list show roms @item info tpm show the TPM device +@item info cpu_max +show the number of CPUs supported by the machine being emulated. @end table ETEXI diff --git a/hmp.c b/hmp.c index b0a861cfbb..c12c495dc4 100644 --- a/hmp.c +++ b/hmp.c @@ -631,11 +631,11 @@ void hmp_info_tpm(Monitor *mon, const QDict *qdict) c, TpmModel_lookup[ti->model]); monitor_printf(mon, " \\ %s: type=%s", - ti->id, TpmType_lookup[ti->type]); + ti->id, TpmTypeOptionsKind_lookup[ti->options->kind]); - switch (ti->tpm_options->kind) { - case TPM_TYPE_OPTIONS_KIND_TPM_PASSTHROUGH_OPTIONS: - tpo = ti->tpm_options->tpm_passthrough_options; + switch (ti->options->kind) { + case TPM_TYPE_OPTIONS_KIND_PASSTHROUGH: + tpo = ti->options->passthrough; monitor_printf(mon, "%s%s%s%s", tpo->has_path ? ",path=" : "", tpo->has_path ? tpo->path : "", @@ -748,6 +748,14 @@ void hmp_ringbuf_read(Monitor *mon, const QDict *qdict) g_free(data); } +void hmp_query_cpu_max(Monitor *mon, const QDict *qdict) +{ + int cpu_max; + + cpu_max = qmp_query_cpu_max(NULL); + monitor_printf(mon, "Maximum number of CPUs is %d\n", cpu_max); +} + static void hmp_cont_cb(void *opaque, int err) { if (!err) { diff --git a/hmp.h b/hmp.h index 95fe76e218..80e8b412d4 100644 --- a/hmp.h +++ b/hmp.h @@ -42,6 +42,7 @@ void hmp_stop(Monitor *mon, const QDict *qdict); void hmp_system_reset(Monitor *mon, const QDict *qdict); void hmp_system_powerdown(Monitor *mon, const QDict *qdict); void hmp_cpu(Monitor *mon, const QDict *qdict); +void hmp_query_cpu_max(Monitor *mon, const QDict *qdict); void hmp_memsave(Monitor *mon, const QDict *qdict); void hmp_pmemsave(Monitor *mon, const QDict *qdict); void hmp_ringbuf_write(Monitor *mon, const QDict *qdict); diff --git a/monitor.c b/monitor.c index 2d9e8878eb..e450919269 100644 --- a/monitor.c +++ b/monitor.c @@ -2745,6 +2745,13 @@ static mon_cmd_t info_cmds[] = { .help = "show the TPM device", .mhandler.cmd = hmp_info_tpm, }, + { + .name = "cpu_max", + .args_type = "", + .params = "", + .help = "Get maximum number of VCPUs supported by machine", + .mhandler.cmd = hmp_query_cpu_max, + }, { .name = NULL, }, diff --git a/qapi-schema.json b/qapi-schema.json index 088f4e150f..af499bd926 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -1831,6 +1831,17 @@ ## { 'command': 'query-migrate-cache-size', 'returns': 'int' } +## +## @query-cpu-max +## +## query maximum number of CPUs supported by machine +## +## Returns: number of CPUs +## +## Since: 1.5 +### +{ 'command': 'query-cpu-max', 'returns': 'int' } + ## # @ObjectPropertyInfo: # @@ -3403,13 +3414,12 @@ # # A union referencing different TPM backend types' configuration options # -# @tpm-passthough-options: TPMPassthroughOptions describing the TPM -# passthrough configuration options +# @passthrough: The configuration options for the TPM passthrough type # # Since: 1.5 ## { 'union': 'TpmTypeOptions', - 'data': { 'tpm-passthrough-options' : 'TPMPassthroughOptions' } } + 'data': { 'passthrough' : 'TPMPassthroughOptions' } } ## # @TpmInfo: @@ -3420,17 +3430,14 @@ # # @model: The TPM frontend model # -# @type: The TPM (backend) type being used -# -# @tpm-options: The TPM (backend) type configuration options +# @options: The TPM (backend) type configuration options # # Since: 1.5 ## { 'type': 'TPMInfo', 'data': {'id': 'str', 'model': 'TpmModel', - 'type': 'TpmType', - 'tpm-options': 'TpmTypeOptions' } } + 'options': 'TpmTypeOptions' } } ## # @query-tpm: diff --git a/qemu-options.hx b/qemu-options.hx index d7afeab8b0..c40ba554f9 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -2241,7 +2241,8 @@ Backend type must be: @option{passthrough}. The specific backend type will determine the applicable options. -The @code{-tpmdev} option requires a @code{-device} option. +The @code{-tpmdev} option creates the TPM backend and requires a +@code{-device} option that specifies the TPM frontend interface model. Options to each backend are described below. diff --git a/qmp-commands.hx b/qmp-commands.hx index b370060848..2051fcb49c 100644 --- a/qmp-commands.hx +++ b/qmp-commands.hx @@ -382,6 +382,28 @@ Example: Note: CPUs' indexes are obtained with the 'query-cpus' command. +EQMP + + { + .name = "query-cpu-max", + .args_type = "", + .mhandler.cmd_new = qmp_marshal_input_query_cpu_max, + }, + +SQMP +query-cpu-max +------------- + +Get the maximum CPUs supported by the machine being currently +emulated. + +Returns json-int. + +Example: + +-> { "execute": "query-cpu-max" } +<- { "return": 255 } + EQMP { @@ -2721,18 +2743,76 @@ EQMP .mhandler.cmd_new = qmp_marshal_input_query_tpm, }, +SQMP +query-tpm +--------- + +Return information about the TPM device. + +Arguments: None + +Example: + +-> { "execute": "query-tpm" } +<- { "return": + [ + { "model": "tpm-tis", + "options": + { "type": "passthrough", + "data": + { "cancel-path": "/sys/class/misc/tpm0/device/cancel", + "path": "/dev/tpm0" + } + }, + "id": "tpm0" + } + ] + } + +EQMP + { .name = "query-tpm-models", .args_type = "", .mhandler.cmd_new = qmp_marshal_input_query_tpm_models, }, +SQMP +query-tpm-models +---------------- + +Return a list of supported TPM models. + +Arguments: None + +Example: + +-> { "execute": "query-tpm-models" } +<- { "return": [ "tpm-tis" ] } + +EQMP + { .name = "query-tpm-types", .args_type = "", .mhandler.cmd_new = qmp_marshal_input_query_tpm_types, }, +SQMP +query-tpm-types +--------------- + +Return a list of supported TPM types. + +Arguments: None + +Example: + +-> { "execute": "query-tpm-types" } +<- { "return": [ "passthrough" ] } + +EQMP + { .name = "chardev-add", .args_type = "id:s,backend:q", diff --git a/tpm/tpm.c b/tpm/tpm.c index ffd24956d7..ae00eae618 100644 --- a/tpm/tpm.c +++ b/tpm/tpm.c @@ -257,14 +257,13 @@ static TPMInfo *qmp_query_tpm_inst(TPMBackend *drv) res->id = g_strdup(drv->id); res->model = drv->fe_model; - res->type = drv->ops->type; - res->tpm_options = g_new0(TpmTypeOptions, 1); + res->options = g_new0(TpmTypeOptions, 1); - switch (res->type) { + switch (drv->ops->type) { case TPM_TYPE_PASSTHROUGH: - res->tpm_options->kind = TPM_TYPE_OPTIONS_KIND_TPM_PASSTHROUGH_OPTIONS; + res->options->kind = TPM_TYPE_OPTIONS_KIND_PASSTHROUGH; tpo = g_new0(TPMPassthroughOptions, 1); - res->tpm_options->tpm_passthrough_options = tpo; + res->options->passthrough = tpo; if (drv->path) { tpo->path = g_strdup(drv->path); tpo->has_path = true; diff --git a/vl.c b/vl.c index aeed7f435d..7643f16351 100644 --- a/vl.c +++ b/vl.c @@ -662,6 +662,11 @@ StatusInfo *qmp_query_status(Error **errp) return info; } +int64_t qmp_query_cpu_max(Error **errp) +{ + return current_machine->max_cpus; +} + /***********************************************************/ /* real time host monotonic timer */