Move the rule kvm_set_ipa_limit() applies to PARange into a helper beside kvm_get_parange(), which bounds the same field by a different rule, so the hypervisor can size a guest's IPA space by it. No functional change intended. Signed-off-by: Fuad Tabba --- arch/arm64/include/asm/kvm_pgtable.h | 15 +++++++++++++++ arch/arm64/kvm/reset.c | 12 +----------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/arch/arm64/include/asm/kvm_pgtable.h b/arch/arm64/include/asm/kvm_pgtable.h index 41a8687938eb6..8096b0bf381c2 100644 --- a/arch/arm64/include/asm/kvm_pgtable.h +++ b/arch/arm64/include/asm/kvm_pgtable.h @@ -48,6 +48,21 @@ static inline u64 kvm_get_parange(u64 mmfr0) return parange; } +/* + * The largest IPA size a VM can be given. Unlike VTCR_EL2.PS + * (kvm_get_parange()), it isn't clamped to the kernel's PA configuration. + */ +static inline u32 kvm_get_ipa_max(u64 mmfr0) +{ + unsigned int parange = cpuid_feature_extract_unsigned_field(mmfr0, + ID_AA64MMFR0_EL1_PARANGE_SHIFT); + + if (!kvm_lpa2_is_enabled() && PAGE_SIZE != SZ_64K) + parange = min(parange, (unsigned int)ID_AA64MMFR0_EL1_PARANGE_48); + + return id_aa64mmfr0_parange_to_phys_shift(parange); +} + typedef u64 kvm_pte_t; #define KVM_PTE_VALID BIT(0) diff --git a/arch/arm64/kvm/reset.c b/arch/arm64/kvm/reset.c index 10eb7249aa9e8..757adbce2faac 100644 --- a/arch/arm64/kvm/reset.c +++ b/arch/arm64/kvm/reset.c @@ -231,19 +231,9 @@ u32 get_kvm_ipa_limit(void) int __init kvm_set_ipa_limit(void) { - unsigned int parange; u64 mmfr0; mmfr0 = read_sanitised_ftr_reg(SYS_ID_AA64MMFR0_EL1); - parange = cpuid_feature_extract_unsigned_field(mmfr0, - ID_AA64MMFR0_EL1_PARANGE_SHIFT); - /* - * IPA size beyond 48 bits for 4K and 16K page size is only supported - * when LPA2 is available. So if we have LPA2, enable it, else cap to 48 - * bits, in case it's reported as larger on the system. - */ - if (!kvm_lpa2_is_enabled() && PAGE_SIZE != SZ_64K) - parange = min(parange, (unsigned int)ID_AA64MMFR0_EL1_PARANGE_48); /* * Check with ARMv8.5-GTG that our PAGE_SIZE is supported at @@ -264,7 +254,7 @@ int __init kvm_set_ipa_limit(void) return -EINVAL; } - kvm_ipa_limit = id_aa64mmfr0_parange_to_phys_shift(parange); + kvm_ipa_limit = kvm_get_ipa_max(mmfr0); kvm_info("IPA Size Limit: %d bits%s\n", kvm_ipa_limit, ((kvm_ipa_limit < KVM_PHYS_SHIFT) ? " (Reduced IPA size, limited VM/VMM compatibility)" : "")); -- 2.39.5