mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 16:23:55 -06:00

There're 2 QMP commands: query-sgx and query-sgx-capabilities, but their outputs are very similar and the documentation lacks clear differentiation. From the codes, query-sgx is used to gather guest's SGX capabilities (including SGX related CPUIDs and EPC sections' size, in SGXInfo), and if guest doesn't have SGX, then QEMU will report the error message. On the other hand, query-sgx-capabilities is used to gather host's SGX capabilities (descripted by SGXInfo as well). And if host doesn't support SGX, then QEMU will also report the error message. Considering that SGXInfo is already documented and both these 2 commands have enough error messages (for the exception case in their codes). Therefore the QAPI documentation for these two commands only needs to emphasize that one of them applies to the guest and the other to the host. Fix their documentation to reflect this difference. Reported-by: Markus Armbruster <armbru@redhat.com> Suggested-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Zhao Liu <zhao1.liu@intel.com> Acked-by: Markus Armbruster <armbru@redhat.com> Link: https://lore.kernel.org/r/20250513143131.2008078-3-zhao1.liu@intel.com Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
509 lines
11 KiB
Python
509 lines
11 KiB
Python
# -*- Mode: Python -*-
|
|
# vim: filetype=python
|
|
#
|
|
|
|
##
|
|
# @rtc-reset-reinjection:
|
|
#
|
|
# This command will reset the RTC interrupt reinjection backlog. Can
|
|
# be used if another mechanism to synchronize guest time is in effect,
|
|
# for example QEMU guest agent's guest-set-time command.
|
|
#
|
|
# Since: 2.1
|
|
#
|
|
# .. qmp-example::
|
|
#
|
|
# -> { "execute": "rtc-reset-reinjection" }
|
|
# <- { "return": {} }
|
|
##
|
|
{ 'command': 'rtc-reset-reinjection',
|
|
'if': 'TARGET_I386' }
|
|
|
|
##
|
|
# @SevState:
|
|
#
|
|
# An enumeration of SEV state information used during @query-sev.
|
|
#
|
|
# @uninit: The guest is uninitialized.
|
|
#
|
|
# @launch-update: The guest is currently being launched; plaintext
|
|
# data and register state is being imported.
|
|
#
|
|
# @launch-secret: The guest is currently being launched; ciphertext
|
|
# data is being imported.
|
|
#
|
|
# @running: The guest is fully launched or migrated in.
|
|
#
|
|
# @send-update: The guest is currently being migrated out to another
|
|
# machine.
|
|
#
|
|
# @receive-update: The guest is currently being migrated from another
|
|
# machine.
|
|
#
|
|
# Since: 2.12
|
|
##
|
|
{ 'enum': 'SevState',
|
|
'data': ['uninit', 'launch-update', 'launch-secret', 'running',
|
|
'send-update', 'receive-update' ],
|
|
'if': 'TARGET_I386' }
|
|
|
|
##
|
|
# @SevGuestType:
|
|
#
|
|
# An enumeration indicating the type of SEV guest being run.
|
|
#
|
|
# @sev: The guest is a legacy SEV or SEV-ES guest.
|
|
#
|
|
# @sev-snp: The guest is an SEV-SNP guest.
|
|
#
|
|
# Since: 6.2
|
|
##
|
|
{ 'enum': 'SevGuestType',
|
|
'data': [ 'sev', 'sev-snp' ],
|
|
'if': 'TARGET_I386' }
|
|
|
|
##
|
|
# @SevGuestInfo:
|
|
#
|
|
# Information specific to legacy SEV/SEV-ES guests.
|
|
#
|
|
# @policy: SEV policy value
|
|
#
|
|
# @handle: SEV firmware handle
|
|
#
|
|
# Since: 2.12
|
|
##
|
|
{ 'struct': 'SevGuestInfo',
|
|
'data': { 'policy': 'uint32',
|
|
'handle': 'uint32' },
|
|
'if': 'TARGET_I386' }
|
|
|
|
##
|
|
# @SevSnpGuestInfo:
|
|
#
|
|
# Information specific to SEV-SNP guests.
|
|
#
|
|
# @snp-policy: SEV-SNP policy value
|
|
#
|
|
# Since: 9.1
|
|
##
|
|
{ 'struct': 'SevSnpGuestInfo',
|
|
'data': { 'snp-policy': 'uint64' },
|
|
'if': 'TARGET_I386' }
|
|
|
|
##
|
|
# @SevInfo:
|
|
#
|
|
# Information about Secure Encrypted Virtualization (SEV) support
|
|
#
|
|
# @enabled: true if SEV is active
|
|
#
|
|
# @api-major: SEV API major version
|
|
#
|
|
# @api-minor: SEV API minor version
|
|
#
|
|
# @build-id: SEV FW build id
|
|
#
|
|
# @state: SEV guest state
|
|
#
|
|
# @sev-type: Type of SEV guest being run
|
|
#
|
|
# Since: 2.12
|
|
##
|
|
{ 'union': 'SevInfo',
|
|
'base': { 'enabled': 'bool',
|
|
'api-major': 'uint8',
|
|
'api-minor' : 'uint8',
|
|
'build-id' : 'uint8',
|
|
'state' : 'SevState',
|
|
'sev-type' : 'SevGuestType' },
|
|
'discriminator': 'sev-type',
|
|
'data': {
|
|
'sev': 'SevGuestInfo',
|
|
'sev-snp': 'SevSnpGuestInfo' },
|
|
'if': 'TARGET_I386' }
|
|
|
|
|
|
##
|
|
# @query-sev:
|
|
#
|
|
# Returns information about SEV
|
|
#
|
|
# Returns: @SevInfo
|
|
#
|
|
# Since: 2.12
|
|
#
|
|
# .. qmp-example::
|
|
#
|
|
# -> { "execute": "query-sev" }
|
|
# <- { "return": { "enabled": true, "api-major" : 0, "api-minor" : 0,
|
|
# "build-id" : 0, "policy" : 0, "state" : "running",
|
|
# "handle" : 1 } }
|
|
##
|
|
{ 'command': 'query-sev', 'returns': 'SevInfo',
|
|
'if': 'TARGET_I386' }
|
|
|
|
##
|
|
# @SevLaunchMeasureInfo:
|
|
#
|
|
# SEV Guest Launch measurement information
|
|
#
|
|
# @data: the measurement value encoded in base64
|
|
#
|
|
# Since: 2.12
|
|
##
|
|
{ 'struct': 'SevLaunchMeasureInfo', 'data': {'data': 'str'},
|
|
'if': 'TARGET_I386' }
|
|
|
|
##
|
|
# @query-sev-launch-measure:
|
|
#
|
|
# Query the SEV guest launch information.
|
|
#
|
|
# Returns: The @SevLaunchMeasureInfo for the guest
|
|
#
|
|
# Since: 2.12
|
|
#
|
|
# .. qmp-example::
|
|
#
|
|
# -> { "execute": "query-sev-launch-measure" }
|
|
# <- { "return": { "data": "4l8LXeNlSPUDlXPJG5966/8%YZ" } }
|
|
##
|
|
{ 'command': 'query-sev-launch-measure', 'returns': 'SevLaunchMeasureInfo',
|
|
'if': 'TARGET_I386' }
|
|
|
|
##
|
|
# @SevCapability:
|
|
#
|
|
# The struct describes capability for a Secure Encrypted
|
|
# Virtualization feature.
|
|
#
|
|
# @pdh: Platform Diffie-Hellman key (base64 encoded)
|
|
#
|
|
# @cert-chain: PDH certificate chain (base64 encoded)
|
|
#
|
|
# @cpu0-id: Unique ID of CPU0 (base64 encoded) (since 7.1)
|
|
#
|
|
# @cbitpos: C-bit location in page table entry
|
|
#
|
|
# @reduced-phys-bits: Number of physical Address bit reduction when
|
|
# SEV is enabled
|
|
#
|
|
# Since: 2.12
|
|
##
|
|
{ 'struct': 'SevCapability',
|
|
'data': { 'pdh': 'str',
|
|
'cert-chain': 'str',
|
|
'cpu0-id': 'str',
|
|
'cbitpos': 'int',
|
|
'reduced-phys-bits': 'int'},
|
|
'if': 'TARGET_I386' }
|
|
|
|
##
|
|
# @query-sev-capabilities:
|
|
#
|
|
# This command is used to get the SEV capabilities, and is supported
|
|
# on AMD X86 platforms only.
|
|
#
|
|
# Returns: SevCapability objects.
|
|
#
|
|
# Since: 2.12
|
|
#
|
|
# .. qmp-example::
|
|
#
|
|
# -> { "execute": "query-sev-capabilities" }
|
|
# <- { "return": { "pdh": "8CCDD8DDD", "cert-chain": "888CCCDDDEE",
|
|
# "cpu0-id": "2lvmGwo+...61iEinw==",
|
|
# "cbitpos": 47, "reduced-phys-bits": 1}}
|
|
##
|
|
{ 'command': 'query-sev-capabilities', 'returns': 'SevCapability',
|
|
'if': 'TARGET_I386' }
|
|
|
|
##
|
|
# @sev-inject-launch-secret:
|
|
#
|
|
# This command injects a secret blob into memory of SEV guest.
|
|
#
|
|
# @packet-header: the launch secret packet header encoded in base64
|
|
#
|
|
# @secret: the launch secret data to be injected encoded in base64
|
|
#
|
|
# @gpa: the guest physical address where secret will be injected.
|
|
#
|
|
# Since: 6.0
|
|
##
|
|
{ 'command': 'sev-inject-launch-secret',
|
|
'data': { 'packet-header': 'str', 'secret': 'str', '*gpa': 'uint64' },
|
|
'if': 'TARGET_I386' }
|
|
|
|
##
|
|
# @SevAttestationReport:
|
|
#
|
|
# The struct describes attestation report for a Secure Encrypted
|
|
# Virtualization feature.
|
|
#
|
|
# @data: guest attestation report (base64 encoded)
|
|
#
|
|
# Since: 6.1
|
|
##
|
|
{ 'struct': 'SevAttestationReport',
|
|
'data': { 'data': 'str'},
|
|
'if': 'TARGET_I386' }
|
|
|
|
##
|
|
# @query-sev-attestation-report:
|
|
#
|
|
# This command is used to get the SEV attestation report, and is
|
|
# supported on AMD X86 platforms only.
|
|
#
|
|
# @mnonce: a random 16 bytes value encoded in base64 (it will be
|
|
# included in report)
|
|
#
|
|
# Returns: SevAttestationReport objects.
|
|
#
|
|
# Since: 6.1
|
|
#
|
|
# .. qmp-example::
|
|
#
|
|
# -> { "execute" : "query-sev-attestation-report",
|
|
# "arguments": { "mnonce": "aaaaaaa" } }
|
|
# <- { "return" : { "data": "aaaaaaaabbbddddd"} }
|
|
##
|
|
{ 'command': 'query-sev-attestation-report',
|
|
'data': { 'mnonce': 'str' },
|
|
'returns': 'SevAttestationReport',
|
|
'if': 'TARGET_I386' }
|
|
|
|
##
|
|
# @GICCapability:
|
|
#
|
|
# The struct describes capability for a specific GIC (Generic
|
|
# Interrupt Controller) version. These bits are not only decided by
|
|
# QEMU/KVM software version, but also decided by the hardware that the
|
|
# program is running upon.
|
|
#
|
|
# @version: version of GIC to be described. Currently, only 2 and 3
|
|
# are supported.
|
|
#
|
|
# @emulated: whether current QEMU/hardware supports emulated GIC
|
|
# device in user space.
|
|
#
|
|
# @kernel: whether current QEMU/hardware supports hardware accelerated
|
|
# GIC device in kernel.
|
|
#
|
|
# Since: 2.6
|
|
##
|
|
{ 'struct': 'GICCapability',
|
|
'data': { 'version': 'int',
|
|
'emulated': 'bool',
|
|
'kernel': 'bool' },
|
|
'if': 'TARGET_ARM' }
|
|
|
|
##
|
|
# @query-gic-capabilities:
|
|
#
|
|
# This command is ARM-only. It will return a list of GICCapability
|
|
# objects that describe its capability bits.
|
|
#
|
|
# Returns: a list of GICCapability objects.
|
|
#
|
|
# Since: 2.6
|
|
#
|
|
# .. qmp-example::
|
|
#
|
|
# -> { "execute": "query-gic-capabilities" }
|
|
# <- { "return": [{ "version": 2, "emulated": true, "kernel": false },
|
|
# { "version": 3, "emulated": false, "kernel": true } ] }
|
|
##
|
|
{ 'command': 'query-gic-capabilities', 'returns': ['GICCapability'],
|
|
'if': 'TARGET_ARM' }
|
|
|
|
##
|
|
# @SgxEpcSection:
|
|
#
|
|
# Information about intel SGX EPC section
|
|
#
|
|
# @node: the numa node
|
|
#
|
|
# @size: the size of EPC section
|
|
#
|
|
# Since: 7.0
|
|
##
|
|
{ 'struct': 'SgxEpcSection',
|
|
'data': { 'node': 'int',
|
|
'size': 'uint64'}}
|
|
|
|
##
|
|
# @SgxInfo:
|
|
#
|
|
# Information about intel Safe Guard eXtension (SGX) support
|
|
#
|
|
# @sgx: true if SGX is supported
|
|
#
|
|
# @sgx1: true if SGX1 is supported
|
|
#
|
|
# @sgx2: true if SGX2 is supported
|
|
#
|
|
# @flc: true if FLC is supported
|
|
#
|
|
# @sections: The EPC sections information (Since: 7.0)
|
|
#
|
|
# Since: 6.2
|
|
##
|
|
{ 'struct': 'SgxInfo',
|
|
'data': { 'sgx': 'bool',
|
|
'sgx1': 'bool',
|
|
'sgx2': 'bool',
|
|
'flc': 'bool',
|
|
'sections': ['SgxEpcSection']},
|
|
'if': 'TARGET_I386' }
|
|
|
|
##
|
|
# @query-sgx:
|
|
#
|
|
# Returns information about configured SGX capabilities of guest
|
|
#
|
|
# Returns: @SgxInfo
|
|
#
|
|
# Since: 6.2
|
|
#
|
|
# .. qmp-example::
|
|
#
|
|
# -> { "execute": "query-sgx" }
|
|
# <- { "return": { "sgx": true, "sgx1" : true, "sgx2" : true,
|
|
# "flc": true,
|
|
# "sections": [{"node": 0, "size": 67108864},
|
|
# {"node": 1, "size": 29360128}]} }
|
|
##
|
|
{ 'command': 'query-sgx', 'returns': 'SgxInfo', 'if': 'TARGET_I386' }
|
|
|
|
##
|
|
# @query-sgx-capabilities:
|
|
#
|
|
# Returns information about SGX capabilities of host
|
|
#
|
|
# Returns: @SgxInfo
|
|
#
|
|
# Since: 6.2
|
|
#
|
|
# .. qmp-example::
|
|
#
|
|
# -> { "execute": "query-sgx-capabilities" }
|
|
# <- { "return": { "sgx": true, "sgx1" : true, "sgx2" : true,
|
|
# "flc": true,
|
|
# "section" : [{"node": 0, "size": 67108864},
|
|
# {"node": 1, "size": 29360128}]} }
|
|
##
|
|
{ 'command': 'query-sgx-capabilities', 'returns': 'SgxInfo', 'if': 'TARGET_I386' }
|
|
|
|
|
|
##
|
|
# @EvtchnPortType:
|
|
#
|
|
# An enumeration of Xen event channel port types.
|
|
#
|
|
# @closed: The port is unused.
|
|
#
|
|
# @unbound: The port is allocated and ready to be bound.
|
|
#
|
|
# @interdomain: The port is connected as an interdomain interrupt.
|
|
#
|
|
# @pirq: The port is bound to a physical IRQ (PIRQ).
|
|
#
|
|
# @virq: The port is bound to a virtual IRQ (VIRQ).
|
|
#
|
|
# @ipi: The post is an inter-processor interrupt (IPI).
|
|
#
|
|
# Since: 8.0
|
|
##
|
|
{ 'enum': 'EvtchnPortType',
|
|
'data': ['closed', 'unbound', 'interdomain', 'pirq', 'virq', 'ipi'],
|
|
'if': 'TARGET_I386' }
|
|
|
|
##
|
|
# @EvtchnInfo:
|
|
#
|
|
# Information about a Xen event channel port
|
|
#
|
|
# @port: the port number
|
|
#
|
|
# @vcpu: target vCPU for this port
|
|
#
|
|
# @type: the port type
|
|
#
|
|
# @remote-domain: remote domain for interdomain ports
|
|
#
|
|
# @target: remote port ID, or virq/pirq number
|
|
#
|
|
# @pending: port is currently active pending delivery
|
|
#
|
|
# @masked: port is masked
|
|
#
|
|
# Since: 8.0
|
|
##
|
|
{ 'struct': 'EvtchnInfo',
|
|
'data': {'port': 'uint16',
|
|
'vcpu': 'uint32',
|
|
'type': 'EvtchnPortType',
|
|
'remote-domain': 'str',
|
|
'target': 'uint16',
|
|
'pending': 'bool',
|
|
'masked': 'bool'},
|
|
'if': 'TARGET_I386' }
|
|
|
|
|
|
##
|
|
# @xen-event-list:
|
|
#
|
|
# Query the Xen event channels opened by the guest.
|
|
#
|
|
# Returns: list of open event channel ports.
|
|
#
|
|
# Since: 8.0
|
|
#
|
|
# .. qmp-example::
|
|
#
|
|
# -> { "execute": "xen-event-list" }
|
|
# <- { "return": [
|
|
# {
|
|
# "pending": false,
|
|
# "port": 1,
|
|
# "vcpu": 1,
|
|
# "remote-domain": "qemu",
|
|
# "masked": false,
|
|
# "type": "interdomain",
|
|
# "target": 1
|
|
# },
|
|
# {
|
|
# "pending": false,
|
|
# "port": 2,
|
|
# "vcpu": 0,
|
|
# "remote-domain": "",
|
|
# "masked": false,
|
|
# "type": "virq",
|
|
# "target": 0
|
|
# }
|
|
# ]
|
|
# }
|
|
##
|
|
{ 'command': 'xen-event-list',
|
|
'returns': ['EvtchnInfo'],
|
|
'if': 'TARGET_I386' }
|
|
|
|
##
|
|
# @xen-event-inject:
|
|
#
|
|
# Inject a Xen event channel port (interrupt) to the guest.
|
|
#
|
|
# @port: The port number
|
|
#
|
|
# Since: 8.0
|
|
#
|
|
# .. qmp-example::
|
|
#
|
|
# -> { "execute": "xen-event-inject", "arguments": { "port": 1 } }
|
|
# <- { "return": { } }
|
|
##
|
|
{ 'command': 'xen-event-inject',
|
|
'data': { 'port': 'uint32' },
|
|
'if': 'TARGET_I386' }
|