Some of the arm64 systems out there have an IPA space that is
positively tiny. Nonetheless, they make great KVM hosts.

Add support for 36bit IPA support with 4kB pages, which makes
some of the fruity machines happy. Whilst we're at it, add support
for 64kB pages as well, though these boxes have no support for it.

16kB is left as a exercise for the eager reviewer.

Signed-off-by: Marc Zyngier <[email protected]>
---
 tools/testing/selftests/kvm/include/kvm_util.h      | 2 ++
 tools/testing/selftests/kvm/lib/aarch64/processor.c | 8 ++++++++
 tools/testing/selftests/kvm/lib/guest_modes.c       | 4 ++++
 tools/testing/selftests/kvm/lib/kvm_util.c          | 6 ++++++
 4 files changed, 20 insertions(+)

diff --git a/tools/testing/selftests/kvm/include/kvm_util.h 
b/tools/testing/selftests/kvm/include/kvm_util.h
index d2ba830a1faf..a8f7605ddf48 100644
--- a/tools/testing/selftests/kvm/include/kvm_util.h
+++ b/tools/testing/selftests/kvm/include/kvm_util.h
@@ -48,6 +48,8 @@ enum vm_guest_mode {
        VM_MODE_PXXV48_4K,      /* For 48bits VA but ANY bits PA */
        VM_MODE_P47V64_4K,
        VM_MODE_P44V64_4K,
+       VM_MODE_P36V48_4K,
+       VM_MODE_P36V48_64K,
        NUM_VM_MODES,
 };
 
diff --git a/tools/testing/selftests/kvm/lib/aarch64/processor.c 
b/tools/testing/selftests/kvm/lib/aarch64/processor.c
index b4eeeafd2a70..a313fbed53a0 100644
--- a/tools/testing/selftests/kvm/lib/aarch64/processor.c
+++ b/tools/testing/selftests/kvm/lib/aarch64/processor.c
@@ -264,6 +264,14 @@ void aarch64_vcpu_setup(struct kvm_vm *vm, uint32_t 
vcpuid, struct kvm_vcpu_init
                tcr_el1 |= 1ul << 14; /* TG0 = 64KB */
                tcr_el1 |= 2ul << 32; /* IPS = 40 bits */
                break;
+       case VM_MODE_P36V48_4K:
+               tcr_el1 |= 0ul << 14; /* TG0 = 4KB */
+               tcr_el1 |= 1ul << 32; /* IPS = 36 bits */
+               break;
+       case VM_MODE_P36V48_64K:
+               tcr_el1 |= 1ul << 14; /* TG0 = 64KB */
+               tcr_el1 |= 1ul << 32; /* IPS = 36 bits */
+               break;
        default:
                TEST_FAIL("Unknown guest mode, mode: 0x%x", vm->mode);
        }
diff --git a/tools/testing/selftests/kvm/lib/guest_modes.c 
b/tools/testing/selftests/kvm/lib/guest_modes.c
index 8db9ea2c4032..f1d3b0c012c7 100644
--- a/tools/testing/selftests/kvm/lib/guest_modes.c
+++ b/tools/testing/selftests/kvm/lib/guest_modes.c
@@ -72,6 +72,10 @@ void guest_modes_append_default(void)
                        if (ps4k)
                                vm_mode_default = VM_MODE_P40V48_4K;
                }
+               if (limit >= 36) {
+                       guest_mode_append(VM_MODE_P36V48_4K, ps4k, ps4k);
+                       guest_mode_append(VM_MODE_P36V48_64K, ps64k, ps64k);
+               }
 
                /* Pick the largest supported IPA size */
                for (i = 0;
diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c 
b/tools/testing/selftests/kvm/lib/kvm_util.c
index daf6fdb217a7..3dc554430082 100644
--- a/tools/testing/selftests/kvm/lib/kvm_util.c
+++ b/tools/testing/selftests/kvm/lib/kvm_util.c
@@ -172,6 +172,8 @@ const char *vm_guest_mode_string(uint32_t i)
                [VM_MODE_PXXV48_4K]     = "PA-bits:ANY, VA-bits:48,  4K pages",
                [VM_MODE_P47V64_4K]     = "PA-bits:47,  VA-bits:64,  4K pages",
                [VM_MODE_P44V64_4K]     = "PA-bits:44,  VA-bits:64,  4K pages",
+               [VM_MODE_P36V48_4K]     = "PA-bits:36,  VA-bits:48,  4K pages",
+               [VM_MODE_P36V48_64K]    = "PA-bits:36,  VA-bits:48, 64K pages",
        };
        _Static_assert(sizeof(strings)/sizeof(char *) == NUM_VM_MODES,
                       "Missing new mode strings?");
@@ -191,6 +193,8 @@ const struct vm_guest_mode_params vm_guest_mode_params[] = {
        [VM_MODE_PXXV48_4K]     = {  0,  0,  0x1000, 12 },
        [VM_MODE_P47V64_4K]     = { 47, 64,  0x1000, 12 },
        [VM_MODE_P44V64_4K]     = { 44, 64,  0x1000, 12 },
+       [VM_MODE_P36V48_4K]     = { 36, 48,  0x1000, 12 },
+       [VM_MODE_P36V48_64K]    = { 36, 48, 0x10000, 16 },
 };
 _Static_assert(sizeof(vm_guest_mode_params)/sizeof(struct 
vm_guest_mode_params) == NUM_VM_MODES,
               "Missing new mode params?");
@@ -252,9 +256,11 @@ struct kvm_vm *vm_create(enum vm_guest_mode mode, uint64_t 
phy_pages, int perm)
                vm->pgtable_levels = 3;
                break;
        case VM_MODE_P40V48_4K:
+       case VM_MODE_P36V48_4K:
                vm->pgtable_levels = 4;
                break;
        case VM_MODE_P40V48_64K:
+       case VM_MODE_P36V48_64K:
                vm->pgtable_levels = 3;
                break;
        case VM_MODE_PXXV48_4K:
-- 
2.30.2

_______________________________________________
kvmarm mailing list
[email protected]
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm

Reply via email to