[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 25/39] hw/arm/virt: KVM: The IPA lower bound is 32
From: |
Peter Maydell |
Subject: |
[PULL 25/39] hw/arm/virt: KVM: The IPA lower bound is 32 |
Date: |
Fri, 12 Mar 2021 13:51:26 +0000 |
From: Andrew Jones <drjones@redhat.com>
The virt machine already checks KVM_CAP_ARM_VM_IPA_SIZE to get the
upper bound of the IPA size. If that bound is lower than the highest
possible GPA for the machine, then QEMU will error out. However, the
IPA is set to 40 when the highest GPA is less than or equal to 40,
even when KVM may support an IPA limit as low as 32. This means KVM
may fail the VM creation unnecessarily. Additionally, 40 is selected
with the value 0, which means use the default, and that gets around
a check in some versions of KVM, causing a difficult to debug fail.
Always use the IPA size that corresponds to the highest possible GPA,
unless it's lower than 32, in which case use 32. Also, we must still
use 0 when KVM only supports the legacy fixed 40 bit IPA.
Suggested-by: Marc Zyngier <maz@kernel.org>
Signed-off-by: Andrew Jones <drjones@redhat.com>
Reviewed-by: Eric Auger <eric.auger@redhat.com>
Reviewed-by: Marc Zyngier <maz@kernel.org>
Message-id: 20210310135218.255205-3-drjones@redhat.com
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
target/arm/kvm_arm.h | 6 ++++--
hw/arm/virt.c | 23 ++++++++++++++++-------
target/arm/kvm.c | 4 +++-
3 files changed, 23 insertions(+), 10 deletions(-)
diff --git a/target/arm/kvm_arm.h b/target/arm/kvm_arm.h
index 68ec970c4f4..34f8daa3775 100644
--- a/target/arm/kvm_arm.h
+++ b/target/arm/kvm_arm.h
@@ -311,10 +311,12 @@ bool kvm_arm_sve_supported(void);
/**
* kvm_arm_get_max_vm_ipa_size:
* @ms: Machine state handle
+ * @fixed_ipa: True when the IPA limit is fixed at 40. This is the case
+ * for legacy KVM.
*
* Returns the number of bits in the IPA address space supported by KVM
*/
-int kvm_arm_get_max_vm_ipa_size(MachineState *ms);
+int kvm_arm_get_max_vm_ipa_size(MachineState *ms, bool *fixed_ipa);
/**
* kvm_arm_sync_mpstate_to_kvm:
@@ -409,7 +411,7 @@ static inline void kvm_arm_add_vcpu_properties(Object *obj)
g_assert_not_reached();
}
-static inline int kvm_arm_get_max_vm_ipa_size(MachineState *ms)
+static inline int kvm_arm_get_max_vm_ipa_size(MachineState *ms, bool
*fixed_ipa)
{
g_assert_not_reached();
}
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index c08bf112973..aa2bbd14e09 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -2548,27 +2548,36 @@ static HotplugHandler
*virt_machine_get_hotplug_handler(MachineState *machine,
static int virt_kvm_type(MachineState *ms, const char *type_str)
{
VirtMachineState *vms = VIRT_MACHINE(ms);
- int max_vm_pa_size = kvm_arm_get_max_vm_ipa_size(ms);
- int requested_pa_size;
+ int max_vm_pa_size, requested_pa_size;
+ bool fixed_ipa;
+
+ max_vm_pa_size = kvm_arm_get_max_vm_ipa_size(ms, &fixed_ipa);
/* we freeze the memory map to compute the highest gpa */
virt_set_memmap(vms);
requested_pa_size = 64 - clz64(vms->highest_gpa);
+ /*
+ * KVM requires the IPA size to be at least 32 bits.
+ */
+ if (requested_pa_size < 32) {
+ requested_pa_size = 32;
+ }
+
if (requested_pa_size > max_vm_pa_size) {
error_report("-m and ,maxmem option values "
"require an IPA range (%d bits) larger than "
"the one supported by the host (%d bits)",
requested_pa_size, max_vm_pa_size);
- exit(1);
+ exit(1);
}
/*
- * By default we return 0 which corresponds to an implicit legacy
- * 40b IPA setting. Otherwise we return the actual requested PA
- * logsize
+ * We return the requested PA log size, unless KVM only supports
+ * the implicit legacy 40b IPA setting, in which case the kvm_type
+ * must be 0.
*/
- return requested_pa_size > 40 ? requested_pa_size : 0;
+ return fixed_ipa ? 0 : requested_pa_size;
}
static void virt_machine_class_init(ObjectClass *oc, void *data)
diff --git a/target/arm/kvm.c b/target/arm/kvm.c
index bebea901229..d8381ba2245 100644
--- a/target/arm/kvm.c
+++ b/target/arm/kvm.c
@@ -230,12 +230,14 @@ bool kvm_arm_pmu_supported(void)
return kvm_check_extension(kvm_state, KVM_CAP_ARM_PMU_V3);
}
-int kvm_arm_get_max_vm_ipa_size(MachineState *ms)
+int kvm_arm_get_max_vm_ipa_size(MachineState *ms, bool *fixed_ipa)
{
KVMState *s = KVM_STATE(ms->accelerator);
int ret;
ret = kvm_check_extension(s, KVM_CAP_ARM_VM_IPA_SIZE);
+ *fixed_ipa = ret <= 0;
+
return ret > 0 ? ret : 40;
}
--
2.20.1
- [PULL 29/39] hw/arm: Connect PWM fans in NPCM7XX boards, (continued)
- [PULL 29/39] hw/arm: Connect PWM fans in NPCM7XX boards, Peter Maydell, 2021/03/12
- [PULL 35/39] hw/display/pxa2xx_lcd: Remove dest_width state field, Peter Maydell, 2021/03/12
- [PULL 26/39] hw/misc: Add GPIOs for duty in NPCM7xx PWM, Peter Maydell, 2021/03/12
- [PULL 34/39] hw/display/pxa2xx_lcd: Remove dead code for non-32-bpp surfaces, Peter Maydell, 2021/03/12
- [PULL 16/39] target/arm: Update WHILE for PREDDESC, Peter Maydell, 2021/03/12
- [PULL 23/39] hw/timer/sse-timer: Propagate eventual error in sse_timer_realize(), Peter Maydell, 2021/03/12
- [PULL 12/39] target/arm: Fix sve_punpk_p vs odd vector lengths, Peter Maydell, 2021/03/12
- [PULL 19/39] tests/acceptance/boot_linux_console: remove Armbian 19.11.3 bionic test for orangepi-pc machine, Peter Maydell, 2021/03/12
- [PULL 20/39] tests/acceptance/boot_linux_console: change URL for test_arm_orangepi_bionic_20_08, Peter Maydell, 2021/03/12
- [PULL 10/39] target/arm: Fix sve_uzp_p vs odd vector lengths, Peter Maydell, 2021/03/12
- [PULL 25/39] hw/arm/virt: KVM: The IPA lower bound is 32,
Peter Maydell <=
- [PULL 22/39] tests/acceptance: drop ARMBIAN_ARTIFACTS_CACHED condition for orangepi-pc, cubieboard tests, Peter Maydell, 2021/03/12
- [PULL 30/39] tests/qtest: Test PWM fan RPM using MFT in PWM test, Peter Maydell, 2021/03/12
- [PULL 31/39] hw/display/pl110: Remove dead code for non-32-bpp surfaces, Peter Maydell, 2021/03/12
- [PULL 32/39] hw/display/pl110: Pull included-once parts of template header into pl110.c, Peter Maydell, 2021/03/12
- [PULL 28/39] hw/arm: Add MFT device to NPCM7xx Soc, Peter Maydell, 2021/03/12
- [PULL 33/39] hw/display/pl110: Remove use of BITS from pl110_template.h, Peter Maydell, 2021/03/12
- [PULL 37/39] hw/display/pxa2xx: Apply brace-related coding style fixes to template header, Peter Maydell, 2021/03/12
- [PULL 38/39] hw/display/pxa2xx: Apply whitespace-only coding style fixes to template header, Peter Maydell, 2021/03/12
- [PULL 39/39] hw/display/pxa2xx: Inline template header, Peter Maydell, 2021/03/12
- [PULL 17/39] target/arm: Update sve reduction vs simd_desc, Peter Maydell, 2021/03/12