Docs: KVM: Add doc for the bitmap firmware registers
Add the documentation for the bitmap firmware registers in hypercalls.rst and api.rst. This includes the details for KVM_REG_ARM_STD_BMAP, KVM_REG_ARM_STD_HYP_BMAP, and KVM_REG_ARM_VENDOR_HYP_BMAP registers. Since the document is growing to carry other hypercall related information, make necessary adjustments to present the document in a generic sense, rather than being PSCI focused. Signed-off-by: Raghavendra Rao Ananta <rananta@google.com> Reviewed-by: Gavin Shan <gshan@redhat.com> [maz: small scale reformat, move things about, random typo fixes] Signed-off-by: Marc Zyngier <maz@kernel.org> Link: https://lore.kernel.org/r/20220502233853.1233742-7-rananta@google.com
This commit is contained in:
parent
f1ced23a9b
commit
fa246c68a0
|
@ -2601,6 +2601,24 @@ EINVAL.
|
||||||
After the vcpu's SVE configuration is finalized, further attempts to
|
After the vcpu's SVE configuration is finalized, further attempts to
|
||||||
write this register will fail with EPERM.
|
write this register will fail with EPERM.
|
||||||
|
|
||||||
|
arm64 bitmap feature firmware pseudo-registers have the following bit pattern::
|
||||||
|
|
||||||
|
0x6030 0000 0016 <regno:16>
|
||||||
|
|
||||||
|
The bitmap feature firmware registers exposes the hypercall services that
|
||||||
|
are available for userspace to configure. The set bits corresponds to the
|
||||||
|
services that are available for the guests to access. By default, KVM
|
||||||
|
sets all the supported bits during VM initialization. The userspace can
|
||||||
|
discover the available services via KVM_GET_ONE_REG, and write back the
|
||||||
|
bitmap corresponding to the features that it wishes guests to see via
|
||||||
|
KVM_SET_ONE_REG.
|
||||||
|
|
||||||
|
Note: These registers are immutable once any of the vCPUs of the VM has
|
||||||
|
run at least once. A KVM_SET_ONE_REG in such a scenario will return
|
||||||
|
a -EBUSY to userspace.
|
||||||
|
|
||||||
|
(See Documentation/virt/kvm/arm/hypercalls.rst for more details.)
|
||||||
|
|
||||||
|
|
||||||
MIPS registers are mapped using the lower 32 bits. The upper 16 of that is
|
MIPS registers are mapped using the lower 32 bits. The upper 16 of that is
|
||||||
the register group type:
|
the register group type:
|
||||||
|
|
|
@ -1,32 +1,32 @@
|
||||||
.. SPDX-License-Identifier: GPL-2.0
|
.. SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
=========================================
|
=======================
|
||||||
Power State Coordination Interface (PSCI)
|
ARM Hypercall Interface
|
||||||
=========================================
|
=======================
|
||||||
|
|
||||||
KVM implements the PSCI (Power State Coordination Interface)
|
KVM handles the hypercall services as requested by the guests. New hypercall
|
||||||
specification in order to provide services such as CPU on/off, reset
|
services are regularly made available by the ARM specification or by KVM (as
|
||||||
and power-off to the guest.
|
vendor services) if they make sense from a virtualization point of view.
|
||||||
|
|
||||||
The PSCI specification is regularly updated to provide new features,
|
This means that a guest booted on two different versions of KVM can observe
|
||||||
and KVM implements these updates if they make sense from a virtualization
|
two different "firmware" revisions. This could cause issues if a given guest
|
||||||
point of view.
|
is tied to a particular version of a hypercall service, or if a migration
|
||||||
|
causes a different version to be exposed out of the blue to an unsuspecting
|
||||||
This means that a guest booted on two different versions of KVM can
|
guest.
|
||||||
observe two different "firmware" revisions. This could cause issues if
|
|
||||||
a given guest is tied to a particular PSCI revision (unlikely), or if
|
|
||||||
a migration causes a different PSCI version to be exposed out of the
|
|
||||||
blue to an unsuspecting guest.
|
|
||||||
|
|
||||||
In order to remedy this situation, KVM exposes a set of "firmware
|
In order to remedy this situation, KVM exposes a set of "firmware
|
||||||
pseudo-registers" that can be manipulated using the GET/SET_ONE_REG
|
pseudo-registers" that can be manipulated using the GET/SET_ONE_REG
|
||||||
interface. These registers can be saved/restored by userspace, and set
|
interface. These registers can be saved/restored by userspace, and set
|
||||||
to a convenient value if required.
|
to a convenient value as required.
|
||||||
|
|
||||||
The following register is defined:
|
The following registers are defined:
|
||||||
|
|
||||||
* KVM_REG_ARM_PSCI_VERSION:
|
* KVM_REG_ARM_PSCI_VERSION:
|
||||||
|
|
||||||
|
KVM implements the PSCI (Power State Coordination Interface)
|
||||||
|
specification in order to provide services such as CPU on/off, reset
|
||||||
|
and power-off to the guest.
|
||||||
|
|
||||||
- Only valid if the vcpu has the KVM_ARM_VCPU_PSCI_0_2 feature set
|
- Only valid if the vcpu has the KVM_ARM_VCPU_PSCI_0_2 feature set
|
||||||
(and thus has already been initialized)
|
(and thus has already been initialized)
|
||||||
- Returns the current PSCI version on GET_ONE_REG (defaulting to the
|
- Returns the current PSCI version on GET_ONE_REG (defaulting to the
|
||||||
|
@ -74,4 +74,65 @@ The following register is defined:
|
||||||
KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2_NOT_REQUIRED:
|
KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2_NOT_REQUIRED:
|
||||||
The workaround is always active on this vCPU or it is not needed.
|
The workaround is always active on this vCPU or it is not needed.
|
||||||
|
|
||||||
|
|
||||||
|
Bitmap Feature Firmware Registers
|
||||||
|
---------------------------------
|
||||||
|
|
||||||
|
Contrary to the above registers, the following registers exposes the
|
||||||
|
hypercall services in the form of a feature-bitmap to the userspace. This
|
||||||
|
bitmap is translated to the services that are available to the guest.
|
||||||
|
There is a register defined per service call owner and can be accessed via
|
||||||
|
GET/SET_ONE_REG interface.
|
||||||
|
|
||||||
|
By default, these registers are set with the upper limit of the features
|
||||||
|
that are supported. This way userspace can discover all the usable
|
||||||
|
hypercall services via GET_ONE_REG. The user-space can write-back the
|
||||||
|
desired bitmap back via SET_ONE_REG. The features for the registers that
|
||||||
|
are untouched, probably because userspace isn't aware of them, will be
|
||||||
|
exposed as is to the guest.
|
||||||
|
|
||||||
|
Note that KVM will not allow the userspace to configure the registers
|
||||||
|
anymore once any of the vCPUs has run at least once. Instead, it will
|
||||||
|
return a -EBUSY.
|
||||||
|
|
||||||
|
The pseudo-firmware bitmap register are as follows:
|
||||||
|
|
||||||
|
* KVM_REG_ARM_STD_BMAP:
|
||||||
|
Controls the bitmap of the ARM Standard Secure Service Calls.
|
||||||
|
|
||||||
|
The following bits are accepted:
|
||||||
|
|
||||||
|
Bit-0: KVM_REG_ARM_STD_BIT_TRNG_V1_0:
|
||||||
|
The bit represents the services offered under v1.0 of ARM True Random
|
||||||
|
Number Generator (TRNG) specification, ARM DEN0098.
|
||||||
|
|
||||||
|
* KVM_REG_ARM_STD_HYP_BMAP:
|
||||||
|
Controls the bitmap of the ARM Standard Hypervisor Service Calls.
|
||||||
|
|
||||||
|
The following bits are accepted:
|
||||||
|
|
||||||
|
Bit-0: KVM_REG_ARM_STD_HYP_BIT_PV_TIME:
|
||||||
|
The bit represents the Paravirtualized Time service as represented by
|
||||||
|
ARM DEN0057A.
|
||||||
|
|
||||||
|
* KVM_REG_ARM_VENDOR_HYP_BMAP:
|
||||||
|
Controls the bitmap of the Vendor specific Hypervisor Service Calls.
|
||||||
|
|
||||||
|
The following bits are accepted:
|
||||||
|
|
||||||
|
Bit-0: KVM_REG_ARM_VENDOR_HYP_BIT_FUNC_FEAT
|
||||||
|
The bit represents the ARM_SMCCC_VENDOR_HYP_KVM_FEATURES_FUNC_ID
|
||||||
|
and ARM_SMCCC_VENDOR_HYP_CALL_UID_FUNC_ID function-ids.
|
||||||
|
|
||||||
|
Bit-1: KVM_REG_ARM_VENDOR_HYP_BIT_PTP:
|
||||||
|
The bit represents the Precision Time Protocol KVM service.
|
||||||
|
|
||||||
|
Errors:
|
||||||
|
|
||||||
|
======= =============================================================
|
||||||
|
-ENOENT Unknown register accessed.
|
||||||
|
-EBUSY Attempt a 'write' to the register after the VM has started.
|
||||||
|
-EINVAL Invalid bitmap written to the register.
|
||||||
|
======= =============================================================
|
||||||
|
|
||||||
.. [1] https://developer.arm.com/-/media/developer/pdf/ARM_DEN_0070A_Firmware_interfaces_for_mitigating_CVE-2017-5715.pdf
|
.. [1] https://developer.arm.com/-/media/developer/pdf/ARM_DEN_0070A_Firmware_interfaces_for_mitigating_CVE-2017-5715.pdf
|
||||||
|
|
Loading…
Reference in New Issue