Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'kvmarm-fixes-5.9-2' of git://git.kernel.org/pub/scm/linux/kernel/git/kvmarm/kvmarm into kvm-master

KVM/arm64 fixes for 5.9, take #2

- Fix handling of S1 Page Table Walk permission fault at S2
on instruction fetch
- Cleanup kvm_vcpu_dabt_iswrite()

+14 -6
+11 -3
arch/arm64/include/asm/kvm_emulate.h
··· 298 298 return (kvm_vcpu_get_esr(vcpu) & ESR_ELx_SRT_MASK) >> ESR_ELx_SRT_SHIFT; 299 299 } 300 300 301 - static __always_inline bool kvm_vcpu_dabt_iss1tw(const struct kvm_vcpu *vcpu) 301 + static __always_inline bool kvm_vcpu_abt_iss1tw(const struct kvm_vcpu *vcpu) 302 302 { 303 303 return !!(kvm_vcpu_get_esr(vcpu) & ESR_ELx_S1PTW); 304 304 } 305 305 306 + /* Always check for S1PTW *before* using this. */ 306 307 static __always_inline bool kvm_vcpu_dabt_iswrite(const struct kvm_vcpu *vcpu) 307 308 { 308 - return !!(kvm_vcpu_get_esr(vcpu) & ESR_ELx_WNR) || 309 - kvm_vcpu_dabt_iss1tw(vcpu); /* AF/DBM update */ 309 + return kvm_vcpu_get_esr(vcpu) & ESR_ELx_WNR; 310 310 } 311 311 312 312 static inline bool kvm_vcpu_dabt_is_cm(const struct kvm_vcpu *vcpu) ··· 333 333 static inline bool kvm_vcpu_trap_is_iabt(const struct kvm_vcpu *vcpu) 334 334 { 335 335 return kvm_vcpu_trap_get_class(vcpu) == ESR_ELx_EC_IABT_LOW; 336 + } 337 + 338 + static inline bool kvm_vcpu_trap_is_exec_fault(const struct kvm_vcpu *vcpu) 339 + { 340 + return kvm_vcpu_trap_is_iabt(vcpu) && !kvm_vcpu_abt_iss1tw(vcpu); 336 341 } 337 342 338 343 static __always_inline u8 kvm_vcpu_trap_get_fault(const struct kvm_vcpu *vcpu) ··· 377 372 378 373 static inline bool kvm_is_write_fault(struct kvm_vcpu *vcpu) 379 374 { 375 + if (kvm_vcpu_abt_iss1tw(vcpu)) 376 + return true; 377 + 380 378 if (kvm_vcpu_trap_is_iabt(vcpu)) 381 379 return false; 382 380
+1 -1
arch/arm64/kvm/hyp/include/hyp/switch.h
··· 445 445 kvm_vcpu_trap_get_fault_type(vcpu) == FSC_FAULT && 446 446 kvm_vcpu_dabt_isvalid(vcpu) && 447 447 !kvm_vcpu_abt_issea(vcpu) && 448 - !kvm_vcpu_dabt_iss1tw(vcpu); 448 + !kvm_vcpu_abt_iss1tw(vcpu); 449 449 450 450 if (valid) { 451 451 int ret = __vgic_v2_perform_cpuif_access(vcpu);
+2 -2
arch/arm64/kvm/mmu.c
··· 1849 1849 struct kvm_s2_mmu *mmu = vcpu->arch.hw_mmu; 1850 1850 1851 1851 write_fault = kvm_is_write_fault(vcpu); 1852 - exec_fault = kvm_vcpu_trap_is_iabt(vcpu); 1852 + exec_fault = kvm_vcpu_trap_is_exec_fault(vcpu); 1853 1853 VM_BUG_ON(write_fault && exec_fault); 1854 1854 1855 1855 if (fault_status == FSC_PERM && !write_fault && !exec_fault) { ··· 2131 2131 goto out; 2132 2132 } 2133 2133 2134 - if (kvm_vcpu_dabt_iss1tw(vcpu)) { 2134 + if (kvm_vcpu_abt_iss1tw(vcpu)) { 2135 2135 kvm_inject_dabt(vcpu, kvm_vcpu_get_hfar(vcpu)); 2136 2136 ret = 1; 2137 2137 goto out_unlock;