Hi Marc, On Tue, Nov 23, 2021 at 2:23 PM Marc Zyngier <maz@xxxxxxxxxx> wrote: > > In order to be able to use promitives such as vcpu_mode_is_32bit(), > we need to synchronize the guest PSTATE. However, this is currently > done deep imto the bowels of the world-switch code, and we do have > helpers evaluating this much earlier (__vgic_v3_perform_cpuif_access > and handle_aarch32_guest, for example). Couple of nits: s/promitives/primitives s/imto/into > > Move the saving of the guest pstate into the early fixups, which > cures the first issue. The second one will be addressed separately. > > Signed-off-by: Marc Zyngier <maz@xxxxxxxxxx> > --- > arch/arm64/kvm/hyp/include/hyp/switch.h | 6 ++++++ > arch/arm64/kvm/hyp/include/hyp/sysreg-sr.h | 7 ++++++- > 2 files changed, 12 insertions(+), 1 deletion(-) > > diff --git a/arch/arm64/kvm/hyp/include/hyp/switch.h b/arch/arm64/kvm/hyp/include/hyp/switch.h > index 7a0af1d39303..d79fd101615f 100644 > --- a/arch/arm64/kvm/hyp/include/hyp/switch.h > +++ b/arch/arm64/kvm/hyp/include/hyp/switch.h > @@ -429,6 +429,12 @@ static inline bool kvm_hyp_handle_exit(struct kvm_vcpu *vcpu, u64 *exit_code) > */ > static inline bool fixup_guest_exit(struct kvm_vcpu *vcpu, u64 *exit_code) > { > + /* > + * Save PSTATE early so that we can evaluate the vcpu mode > + * early on. > + */ > + vcpu->arch.ctxt.regs.pstate = read_sysreg_el2(SYS_SPSR); > + > 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/include/hyp/sysreg-sr.h b/arch/arm64/kvm/hyp/include/hyp/sysreg-sr.h > index de7e14c862e6..7ecca8b07851 100644 > --- a/arch/arm64/kvm/hyp/include/hyp/sysreg-sr.h > +++ b/arch/arm64/kvm/hyp/include/hyp/sysreg-sr.h > @@ -70,7 +70,12 @@ static inline void __sysreg_save_el1_state(struct kvm_cpu_context *ctxt) > static inline void __sysreg_save_el2_return_state(struct kvm_cpu_context *ctxt) > { > ctxt->regs.pc = read_sysreg_el2(SYS_ELR); > - ctxt->regs.pstate = read_sysreg_el2(SYS_SPSR); > + /* > + * Guest PSTATE gets saved at guest fixup time in all > + * cases. We still need to handle the nVHE host side here. > + */ > + if (!has_vhe() && ctxt->__hyp_running_vcpu) > + ctxt->regs.pstate = read_sysreg_el2(SYS_SPSR); > > if (cpus_have_final_cap(ARM64_HAS_RAS_EXTN)) > ctxt_sys_reg(ctxt, DISR_EL1) = read_sysreg_s(SYS_VDISR_EL2); > -- > 2.30.2 > I see that now that you're storing pstate early at the guest exit, and therefore no need for vhe path to check for it for the guest when saving the return state. Going through the various possibilities, I think that all cases are covered. I tested this code as well and it ran fine. Tested-by: Fuad Tabba <tabba@xxxxxxxxxx> Reviewed-by: Fuad Tabba <tabba@xxxxxxxxxx> Thanks, /fuad _______________________________________________ kvmarm mailing list kvmarm@xxxxxxxxxxxxxxxxxxxxx https://lists.cs.columbia.edu/mailman/listinfo/kvmarm