[PATCH v4 0/3] KVM: arm64: mixed-width check should be skipped for uninitialized vCPUs
Reiji Watanabe
reijiw at google.com
Sun Mar 13 23:19:56 PDT 2022
KVM allows userspace to configure either all EL1 32bit or 64bit vCPUs
for a guest. At vCPU reset, vcpu_allowed_register_width() checks
if the vcpu's register width is consistent with all other vCPUs'.
Since the checking is done even against vCPUs that are not initialized
(KVM_ARM_VCPU_INIT has not been done) yet, the uninitialized vCPUs
are erroneously treated as 64bit vCPU, which causes the function to
incorrectly detect a mixed-width VM.
This series will fix this problem by introducing a new VM flag that
indicates the guest needs to be configured with all 32bit or 64bit
vCPUs and checking vcpu's register width against the new flag at
the vcpu's KVM_ARM_VCPU_INIT (instead of against other vCPUs'
register width).
Patch-1 introduces a new field 'flags' for kvm_arch (authored by Marc [1]).
The flags will replace a set of booleans for VM features.
Patch-2 introduces KVM_ARCH_FLAG_EL1_32BIT and
KVM_ARCH_FLAG_REG_WIDTH_CONFIGURED bits for kvm->arch.flags and
uses them to check vcpu's register width to fix the problem.
Patch-3 introduces a selftest that can test non-mixed-width vCPUs (all
64bit vCPUs or all 32bit vcPUs) can be configured, and mixed-width
vCPUs cannot be configured.
The series is based on v5.17-rc7.
v4:
- Use different implementation of vcpu_el1_is_32bit() depending on
the context. [Marc]
- Rename kvm_register_width_check_or_init() to kvm_set_vm_width(), and
call it from kvm_rest_vcpu() instead of from kvm_vcpu_set_target()
- Remove vcpu_allowed_register_width(), and does the same checking
in kvm_set_vm_width() instead.
v3: https://lore.kernel.org/all/20220303035408.3708241-1-reijiw@google.com/
- Introduced 'flags' to kvm_arch, and use bits of the flags for
a set of booleans for VM feature.
- Changed 'el1_reg_width' to two bits of 'flags' of kvm_arch.
v2: https://lore.kernel.org/all/20220118041923.3384602-1-reijiw@google.com/
- Introduced 'el1_reg_width' for kvm_arch and use it to check vcpu's
register width against the flag at the vcpu's KVM_ARM_VCPU_INIT.
v1: https://lore.kernel.org/all/20220110054042.1079932-1-reijiw@google.com/
[1] https://lore.kernel.org/all/20210715163159.1480168-2-maz@kernel.org/
Marc Zyngier (1):
KVM: arm64: Generalise VM features into a set of flags
Reiji Watanabe (2):
KVM: arm64: mixed-width check should be skipped for uninitialized
vCPUs
KVM: arm64: selftests: Introduce vcpu_width_config
arch/arm64/include/asm/kvm_emulate.h | 27 ++--
arch/arm64/include/asm/kvm_host.h | 21 ++-
arch/arm64/kvm/arm.c | 5 +-
arch/arm64/kvm/mmio.c | 3 +-
arch/arm64/kvm/reset.c | 64 ++++++---
tools/testing/selftests/kvm/.gitignore | 1 +
tools/testing/selftests/kvm/Makefile | 1 +
.../selftests/kvm/aarch64/vcpu_width_config.c | 125 ++++++++++++++++++
8 files changed, 209 insertions(+), 38 deletions(-)
create mode 100644 tools/testing/selftests/kvm/aarch64/vcpu_width_config.c
--
2.35.1.723.g4982287a31-goog
More information about the linux-arm-kernel
mailing list