@@ -340,8 +340,11 @@ u32 get_kvm_ipa_limit(void)
340
340
void kvm_set_ipa_limit (void )
341
341
{
342
342
unsigned int ipa_max , pa_max , va_max , parange ;
343
+ u64 mmfr0 ;
343
344
344
- parange = read_sanitised_ftr_reg (SYS_ID_AA64MMFR0_EL1 ) & 0x7 ;
345
+ mmfr0 = read_sanitised_ftr_reg (SYS_ID_AA64MMFR0_EL1 );
346
+ parange = cpuid_feature_extract_unsigned_field (mmfr0 ,
347
+ ID_AA64MMFR0_PARANGE_SHIFT );
345
348
pa_max = id_aa64mmfr0_parange_to_phys_shift (parange );
346
349
347
350
/* Clamp the IPA limit to the PA size supported by the kernel */
@@ -387,7 +390,7 @@ void kvm_set_ipa_limit(void)
387
390
*/
388
391
int kvm_arm_setup_stage2 (struct kvm * kvm , unsigned long type )
389
392
{
390
- u64 vtcr = VTCR_EL2_FLAGS ;
393
+ u64 vtcr = VTCR_EL2_FLAGS , mmfr0 ;
391
394
u32 parange , phys_shift ;
392
395
u8 lvls ;
393
396
@@ -403,7 +406,9 @@ int kvm_arm_setup_stage2(struct kvm *kvm, unsigned long type)
403
406
phys_shift = KVM_PHYS_SHIFT ;
404
407
}
405
408
406
- parange = read_sanitised_ftr_reg (SYS_ID_AA64MMFR0_EL1 ) & 7 ;
409
+ mmfr0 = read_sanitised_ftr_reg (SYS_ID_AA64MMFR0_EL1 );
410
+ parange = cpuid_feature_extract_unsigned_field (mmfr0 ,
411
+ ID_AA64MMFR0_PARANGE_SHIFT );
407
412
if (parange > ID_AA64MMFR0_PARANGE_MAX )
408
413
parange = ID_AA64MMFR0_PARANGE_MAX ;
409
414
vtcr |= parange << VTCR_EL2_PS_SHIFT ;
0 commit comments