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() -----BEGIN PGP SIGNATURE----- iQJDBAABCgAtFiEEn9UcU+C1Yxj9lZw9I9DQutE9ekMFAl9k6LYPHG1hekBrZXJu ZWwub3JnAAoJECPQ0LrRPXpDe6UP+gMRK9yEgY7eBg23nfOVDiF7t8dvj+J5eSws 8YP3nRew9pL710SLClGJCrVyVaCEMPN7cL7O926IALqGPMsPgKFPX7RcshjVUOUo otjQPfT3hMOKfmAGCHyQHeudQ8KMEZX9ikdvGd19zT3F2t2CojUn0uFZPgjIXKOe x4Un5F/QuOVFoI85BctqpNRJsc9yzjpIu/J2YjO+QeKyMoK1gp+GLIACDczfbaLq IWSRApDPP3vyxImxtWaahI/IlAk4XcDV4EFmUMN2GDuK64bFTcky1YLr88njp0ZV VVrxw4Z/lGGKl1MqNV8/OVBS+z1+L8G8+uNFELFL1veDc+eDn+P/Sr/SoDxT93uO Dz9/gWJd2GEtneJ/PspjxLdzpAkUluV7vRQBikjVtBld7OivnDYeylJsA88olXzI PUY+Y9p1K3T/u5oeiKEnDvufzisDiYZSKpE81KtJP+++biOULVIm7rkCmg5IvUAF GhxnQ/n2RW9Q+FCXy7FTss8gxl7FBKdWSCnGQ1ZYa+hwnIa9WU1GLG94Zx/qc/GO zIYstUKsYtn2ViHn9XTbbewUz1XeCaedmb/R1Uu14j6WrzgirhJOfVHE2US9Xlji w/GruENw4Xqlb842q5NbZnv2XtTFQWLAduthAotclnIecYRvqIWRR8JVf64XVvjR K0JmH08N =D7jg -----END PGP SIGNATURE----- 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()
This commit is contained in:
Коммит
b73815a18d
|
@ -298,15 +298,15 @@ static __always_inline int kvm_vcpu_dabt_get_rd(const struct kvm_vcpu *vcpu)
|
||||||
return (kvm_vcpu_get_esr(vcpu) & ESR_ELx_SRT_MASK) >> ESR_ELx_SRT_SHIFT;
|
return (kvm_vcpu_get_esr(vcpu) & ESR_ELx_SRT_MASK) >> ESR_ELx_SRT_SHIFT;
|
||||||
}
|
}
|
||||||
|
|
||||||
static __always_inline bool kvm_vcpu_dabt_iss1tw(const struct kvm_vcpu *vcpu)
|
static __always_inline bool kvm_vcpu_abt_iss1tw(const struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
return !!(kvm_vcpu_get_esr(vcpu) & ESR_ELx_S1PTW);
|
return !!(kvm_vcpu_get_esr(vcpu) & ESR_ELx_S1PTW);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Always check for S1PTW *before* using this. */
|
||||||
static __always_inline bool kvm_vcpu_dabt_iswrite(const struct kvm_vcpu *vcpu)
|
static __always_inline bool kvm_vcpu_dabt_iswrite(const struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
return !!(kvm_vcpu_get_esr(vcpu) & ESR_ELx_WNR) ||
|
return kvm_vcpu_get_esr(vcpu) & ESR_ELx_WNR;
|
||||||
kvm_vcpu_dabt_iss1tw(vcpu); /* AF/DBM update */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool kvm_vcpu_dabt_is_cm(const struct kvm_vcpu *vcpu)
|
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)
|
||||||
return kvm_vcpu_trap_get_class(vcpu) == ESR_ELx_EC_IABT_LOW;
|
return kvm_vcpu_trap_get_class(vcpu) == ESR_ELx_EC_IABT_LOW;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool kvm_vcpu_trap_is_exec_fault(const struct kvm_vcpu *vcpu)
|
||||||
|
{
|
||||||
|
return kvm_vcpu_trap_is_iabt(vcpu) && !kvm_vcpu_abt_iss1tw(vcpu);
|
||||||
|
}
|
||||||
|
|
||||||
static __always_inline u8 kvm_vcpu_trap_get_fault(const struct kvm_vcpu *vcpu)
|
static __always_inline u8 kvm_vcpu_trap_get_fault(const struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
return kvm_vcpu_get_esr(vcpu) & ESR_ELx_FSC;
|
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)
|
||||||
|
|
||||||
static inline bool kvm_is_write_fault(struct kvm_vcpu *vcpu)
|
static inline bool kvm_is_write_fault(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
|
if (kvm_vcpu_abt_iss1tw(vcpu))
|
||||||
|
return true;
|
||||||
|
|
||||||
if (kvm_vcpu_trap_is_iabt(vcpu))
|
if (kvm_vcpu_trap_is_iabt(vcpu))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|
|
@ -445,7 +445,7 @@ static inline bool fixup_guest_exit(struct kvm_vcpu *vcpu, u64 *exit_code)
|
||||||
kvm_vcpu_trap_get_fault_type(vcpu) == FSC_FAULT &&
|
kvm_vcpu_trap_get_fault_type(vcpu) == FSC_FAULT &&
|
||||||
kvm_vcpu_dabt_isvalid(vcpu) &&
|
kvm_vcpu_dabt_isvalid(vcpu) &&
|
||||||
!kvm_vcpu_abt_issea(vcpu) &&
|
!kvm_vcpu_abt_issea(vcpu) &&
|
||||||
!kvm_vcpu_dabt_iss1tw(vcpu);
|
!kvm_vcpu_abt_iss1tw(vcpu);
|
||||||
|
|
||||||
if (valid) {
|
if (valid) {
|
||||||
int ret = __vgic_v2_perform_cpuif_access(vcpu);
|
int ret = __vgic_v2_perform_cpuif_access(vcpu);
|
||||||
|
|
|
@ -1849,7 +1849,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
|
||||||
struct kvm_s2_mmu *mmu = vcpu->arch.hw_mmu;
|
struct kvm_s2_mmu *mmu = vcpu->arch.hw_mmu;
|
||||||
|
|
||||||
write_fault = kvm_is_write_fault(vcpu);
|
write_fault = kvm_is_write_fault(vcpu);
|
||||||
exec_fault = kvm_vcpu_trap_is_iabt(vcpu);
|
exec_fault = kvm_vcpu_trap_is_exec_fault(vcpu);
|
||||||
VM_BUG_ON(write_fault && exec_fault);
|
VM_BUG_ON(write_fault && exec_fault);
|
||||||
|
|
||||||
if (fault_status == FSC_PERM && !write_fault && !exec_fault) {
|
if (fault_status == FSC_PERM && !write_fault && !exec_fault) {
|
||||||
|
@ -2131,7 +2131,7 @@ int kvm_handle_guest_abort(struct kvm_vcpu *vcpu)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (kvm_vcpu_dabt_iss1tw(vcpu)) {
|
if (kvm_vcpu_abt_iss1tw(vcpu)) {
|
||||||
kvm_inject_dabt(vcpu, kvm_vcpu_get_hfar(vcpu));
|
kvm_inject_dabt(vcpu, kvm_vcpu_get_hfar(vcpu));
|
||||||
ret = 1;
|
ret = 1;
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче