FROMLIST: KVM: arm64: Refactor __populate_fault_info()
Refactor __populate_fault_info() to introduce __get_fault_info() which will be used once the host is wrapped in a stage 2. Acked-by: Will Deacon <will@kernel.org> Signed-off-by: Quentin Perret <qperret@google.com> Link: https://lore.kernel.org/r/20210315143536.214621-25-qperret@google.com Bug: 178098380 Change-Id: I93df8600e08ec5bf6c797603de62c0b6391c8b4d
This commit is contained in:
@@ -160,19 +160,9 @@ static inline bool __translate_far_to_hpfar(u64 far, u64 *hpfar)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool __populate_fault_info(struct kvm_vcpu *vcpu)
|
static inline bool __get_fault_info(u64 esr, struct kvm_vcpu_fault_info *fault)
|
||||||
{
|
{
|
||||||
u8 ec;
|
fault->far_el2 = read_sysreg_el2(SYS_FAR);
|
||||||
u64 esr;
|
|
||||||
u64 hpfar, far;
|
|
||||||
|
|
||||||
esr = vcpu->arch.fault.esr_el2;
|
|
||||||
ec = ESR_ELx_EC(esr);
|
|
||||||
|
|
||||||
if (ec != ESR_ELx_EC_DABT_LOW && ec != ESR_ELx_EC_IABT_LOW)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
far = read_sysreg_el2(SYS_FAR);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The HPFAR can be invalid if the stage 2 fault did not
|
* The HPFAR can be invalid if the stage 2 fault did not
|
||||||
@@ -188,17 +178,29 @@ static inline bool __populate_fault_info(struct kvm_vcpu *vcpu)
|
|||||||
if (!(esr & ESR_ELx_S1PTW) &&
|
if (!(esr & ESR_ELx_S1PTW) &&
|
||||||
(cpus_have_final_cap(ARM64_WORKAROUND_834220) ||
|
(cpus_have_final_cap(ARM64_WORKAROUND_834220) ||
|
||||||
(esr & ESR_ELx_FSC_TYPE) == FSC_PERM)) {
|
(esr & ESR_ELx_FSC_TYPE) == FSC_PERM)) {
|
||||||
if (!__translate_far_to_hpfar(far, &hpfar))
|
if (!__translate_far_to_hpfar(fault->far_el2, &fault->hpfar_el2))
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
hpfar = read_sysreg(hpfar_el2);
|
fault->hpfar_el2 = read_sysreg(hpfar_el2);
|
||||||
}
|
}
|
||||||
|
|
||||||
vcpu->arch.fault.far_el2 = far;
|
|
||||||
vcpu->arch.fault.hpfar_el2 = hpfar;
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool __populate_fault_info(struct kvm_vcpu *vcpu)
|
||||||
|
{
|
||||||
|
u8 ec;
|
||||||
|
u64 esr;
|
||||||
|
|
||||||
|
esr = vcpu->arch.fault.esr_el2;
|
||||||
|
ec = ESR_ELx_EC(esr);
|
||||||
|
|
||||||
|
if (ec != ESR_ELx_EC_DABT_LOW && ec != ESR_ELx_EC_IABT_LOW)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return __get_fault_info(esr, &vcpu->arch.fault);
|
||||||
|
}
|
||||||
|
|
||||||
/* Check for an FPSIMD/SVE trap and handle as appropriate */
|
/* Check for an FPSIMD/SVE trap and handle as appropriate */
|
||||||
static inline bool __hyp_handle_fpsimd(struct kvm_vcpu *vcpu)
|
static inline bool __hyp_handle_fpsimd(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user