Hi Marc, On Tue, Nov 23, 2021 at 2:23 PM Marc Zyngier <maz@xxxxxxxxxx> wrote: > > Protected KVM is trying to turn AArch32 exceptions into an illegal > exception entry. Unfortunately, it does that it a way that is a bit Small nit: s/it/in > abrupt, and too early for PSTATE to be available. > Instead, move it to the fixup code, which is a more reasonable place > for it. This will also be useful for the NV code. This approach seems to be easier to generalize for other cases than the previous one. Reviewed-by: Fuad Tabba <tabba@xxxxxxxxxx> Cheers, /fuad > > Signed-off-by: Marc Zyngier <maz@xxxxxxxxxx> > --- > arch/arm64/kvm/hyp/include/hyp/switch.h | 8 ++++++++ > arch/arm64/kvm/hyp/nvhe/switch.c | 8 +------- > arch/arm64/kvm/hyp/vhe/switch.c | 4 ++++ > 3 files changed, 13 insertions(+), 7 deletions(-) > > diff --git a/arch/arm64/kvm/hyp/include/hyp/switch.h b/arch/arm64/kvm/hyp/include/hyp/switch.h > index d79fd101615f..96c5f3fb7838 100644 > --- a/arch/arm64/kvm/hyp/include/hyp/switch.h > +++ b/arch/arm64/kvm/hyp/include/hyp/switch.h > @@ -403,6 +403,8 @@ typedef bool (*exit_handler_fn)(struct kvm_vcpu *, u64 *); > > static const exit_handler_fn *kvm_get_exit_handler_array(struct kvm_vcpu *vcpu); > > +static void early_exit_filter(struct kvm_vcpu *vcpu, u64 *exit_code); > + > /* > * Allow the hypervisor to handle the exit with an exit handler if it has one. > * > @@ -435,6 +437,12 @@ static inline bool fixup_guest_exit(struct kvm_vcpu *vcpu, u64 *exit_code) > */ > vcpu->arch.ctxt.regs.pstate = read_sysreg_el2(SYS_SPSR); > > + /* > + * Check whether we want to repaint the state one way or > + * another. > + */ > + early_exit_filter(vcpu, exit_code); > + > if (ARM_EXCEPTION_CODE(*exit_code) != ARM_EXCEPTION_IRQ) > vcpu->arch.fault.esr_el2 = read_sysreg_el2(SYS_ESR); > > diff --git a/arch/arm64/kvm/hyp/nvhe/switch.c b/arch/arm64/kvm/hyp/nvhe/switch.c > index c0e3fed26d93..d13115a12434 100644 > --- a/arch/arm64/kvm/hyp/nvhe/switch.c > +++ b/arch/arm64/kvm/hyp/nvhe/switch.c > @@ -233,7 +233,7 @@ static const exit_handler_fn *kvm_get_exit_handler_array(struct kvm_vcpu *vcpu) > * Returns false if the guest ran in AArch32 when it shouldn't have, and > * thus should exit to the host, or true if a the guest run loop can continue. > */ > -static bool handle_aarch32_guest(struct kvm_vcpu *vcpu, u64 *exit_code) > +static void early_exit_filter(struct kvm_vcpu *vcpu, u64 *exit_code) > { > struct kvm *kvm = kern_hyp_va(vcpu->kvm); > > @@ -248,10 +248,7 @@ static bool handle_aarch32_guest(struct kvm_vcpu *vcpu, u64 *exit_code) > vcpu->arch.target = -1; > *exit_code &= BIT(ARM_EXIT_WITH_SERROR_BIT); > *exit_code |= ARM_EXCEPTION_IL; > - return false; > } > - > - return true; > } > > /* Switch to the guest for legacy non-VHE systems */ > @@ -316,9 +313,6 @@ int __kvm_vcpu_run(struct kvm_vcpu *vcpu) > /* Jump in the fire! */ > exit_code = __guest_enter(vcpu); > > - if (unlikely(!handle_aarch32_guest(vcpu, &exit_code))) > - break; > - > /* And we're baaack! */ > } while (fixup_guest_exit(vcpu, &exit_code)); > > diff --git a/arch/arm64/kvm/hyp/vhe/switch.c b/arch/arm64/kvm/hyp/vhe/switch.c > index 5a2cb5d9bc4b..fbb26b93c347 100644 > --- a/arch/arm64/kvm/hyp/vhe/switch.c > +++ b/arch/arm64/kvm/hyp/vhe/switch.c > @@ -112,6 +112,10 @@ static const exit_handler_fn *kvm_get_exit_handler_array(struct kvm_vcpu *vcpu) > return hyp_exit_handlers; > } > > +static void early_exit_filter(struct kvm_vcpu *vcpu, u64 *exit_code) > +{ > +} > + > /* Switch to the guest for VHE systems running in EL2 */ > static int __kvm_vcpu_run_vhe(struct kvm_vcpu *vcpu) > { > -- > 2.30.2 > _______________________________________________ kvmarm mailing list kvmarm@xxxxxxxxxxxxxxxxxxxxx https://lists.cs.columbia.edu/mailman/listinfo/kvmarm