summaryrefslogtreecommitdiff
path: root/tools/testing/selftests/kvm/lib/guest_modes.c
diff options
context:
space:
mode:
authorMarc Zyngier <maz@kernel.org>2021-12-27 12:48:06 +0000
committerMarc Zyngier <maz@kernel.org>2021-12-28 11:04:20 +0000
commit0303ffdb9ecffac4654b16bbf69ba84d131eb8b7 (patch)
treea21976a88e6d42ca0047d2d062d9dfaa87081ce3 /tools/testing/selftests/kvm/lib/guest_modes.c
parent357c628e1248dd53f5c43a768246a83478a7f489 (diff)
KVM: selftests: arm64: Check for supported page sizes
Just as arm64 implemenations don't necessary support all IPA ranges, they don't all support the same page sizes either. Fun. Create a dummy VM to snapshot the page sizes supported by the host, and filter the supported modes. Signed-off-by: Marc Zyngier <maz@kernel.org> Reviewed-by: Andrew Jones <drjones@redhat.com> Link: https://lore.kernel.org/r/20211227124809.1335409-4-maz@kernel.org
Diffstat (limited to 'tools/testing/selftests/kvm/lib/guest_modes.c')
-rw-r--r--tools/testing/selftests/kvm/lib/guest_modes.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/tools/testing/selftests/kvm/lib/guest_modes.c b/tools/testing/selftests/kvm/lib/guest_modes.c
index 5e3fdbd992fd..67144fdac433 100644
--- a/tools/testing/selftests/kvm/lib/guest_modes.c
+++ b/tools/testing/selftests/kvm/lib/guest_modes.c
@@ -5,6 +5,7 @@
#include "guest_modes.h"
#ifdef __aarch64__
+#include "processor.h"
enum vm_guest_mode vm_mode_default;
#endif
@@ -17,20 +18,24 @@ void guest_modes_append_default(void)
#else
{
unsigned int limit = kvm_check_cap(KVM_CAP_ARM_VM_IPA_SIZE);
+ bool ps4k, ps16k, ps64k;
int i;
+ aarch64_get_supported_page_sizes(limit, &ps4k, &ps16k, &ps64k);
+
vm_mode_default = NUM_VM_MODES;
if (limit >= 52)
- guest_mode_append(VM_MODE_P52V48_64K, true, true);
+ guest_mode_append(VM_MODE_P52V48_64K, ps64k, ps64k);
if (limit >= 48) {
- guest_mode_append(VM_MODE_P48V48_4K, true, true);
- guest_mode_append(VM_MODE_P48V48_64K, true, true);
+ guest_mode_append(VM_MODE_P48V48_4K, ps4k, ps4k);
+ guest_mode_append(VM_MODE_P48V48_64K, ps64k, ps64k);
}
if (limit >= 40) {
- guest_mode_append(VM_MODE_P40V48_4K, true, true);
- guest_mode_append(VM_MODE_P40V48_64K, true, true);
- vm_mode_default = VM_MODE_P40V48_4K;
+ guest_mode_append(VM_MODE_P40V48_4K, ps4k, ps4k);
+ guest_mode_append(VM_MODE_P40V48_64K, ps64k, ps64k);
+ if (ps4k)
+ vm_mode_default = VM_MODE_P40V48_4K;
}
/*