Skip to content

Commit b73815a

Browse files
committed
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()
2 parents 7d1f869 + 620cf45 commit b73815a

File tree

3 files changed

+14
-6
lines changed

3 files changed

+14
-6
lines changed

arch/arm64/include/asm/kvm_emulate.h

+11-3
Original file line numberDiff line numberDiff line change
@@ -298,15 +298,15 @@ static __always_inline int kvm_vcpu_dabt_get_rd(const struct kvm_vcpu *vcpu)
298298
return (kvm_vcpu_get_esr(vcpu) & ESR_ELx_SRT_MASK) >> ESR_ELx_SRT_SHIFT;
299299
}
300300

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)
302302
{
303303
return !!(kvm_vcpu_get_esr(vcpu) & ESR_ELx_S1PTW);
304304
}
305305

306+
/* Always check for S1PTW *before* using this. */
306307
static __always_inline bool kvm_vcpu_dabt_iswrite(const struct kvm_vcpu *vcpu)
307308
{
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;
310310
}
311311

312312
static inline bool kvm_vcpu_dabt_is_cm(const struct kvm_vcpu *vcpu)
@@ -335,6 +335,11 @@ static inline bool kvm_vcpu_trap_is_iabt(const struct kvm_vcpu *vcpu)
335335
return kvm_vcpu_trap_get_class(vcpu) == ESR_ELx_EC_IABT_LOW;
336336
}
337337

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);
341+
}
342+
338343
static __always_inline u8 kvm_vcpu_trap_get_fault(const struct kvm_vcpu *vcpu)
339344
{
340345
return kvm_vcpu_get_esr(vcpu) & ESR_ELx_FSC;
@@ -372,6 +377,9 @@ static __always_inline int kvm_vcpu_sys_get_rt(struct kvm_vcpu *vcpu)
372377

373378
static inline bool kvm_is_write_fault(struct kvm_vcpu *vcpu)
374379
{
380+
if (kvm_vcpu_abt_iss1tw(vcpu))
381+
return true;
382+
375383
if (kvm_vcpu_trap_is_iabt(vcpu))
376384
return false;
377385

arch/arm64/kvm/hyp/include/hyp/switch.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -445,7 +445,7 @@ static inline bool fixup_guest_exit(struct kvm_vcpu *vcpu, u64 *exit_code)
445445
kvm_vcpu_trap_get_fault_type(vcpu) == FSC_FAULT &&
446446
kvm_vcpu_dabt_isvalid(vcpu) &&
447447
!kvm_vcpu_abt_issea(vcpu) &&
448-
!kvm_vcpu_dabt_iss1tw(vcpu);
448+
!kvm_vcpu_abt_iss1tw(vcpu);
449449

450450
if (valid) {
451451
int ret = __vgic_v2_perform_cpuif_access(vcpu);

arch/arm64/kvm/mmu.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -1849,7 +1849,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
18491849
struct kvm_s2_mmu *mmu = vcpu->arch.hw_mmu;
18501850

18511851
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);
18531853
VM_BUG_ON(write_fault && exec_fault);
18541854

18551855
if (fault_status == FSC_PERM && !write_fault && !exec_fault) {
@@ -2131,7 +2131,7 @@ int kvm_handle_guest_abort(struct kvm_vcpu *vcpu)
21312131
goto out;
21322132
}
21332133

2134-
if (kvm_vcpu_dabt_iss1tw(vcpu)) {
2134+
if (kvm_vcpu_abt_iss1tw(vcpu)) {
21352135
kvm_inject_dabt(vcpu, kvm_vcpu_get_hfar(vcpu));
21362136
ret = 1;
21372137
goto out_unlock;

0 commit comments

Comments
 (0)