Merge branch kvm-arm64/fpsimd-doc into kvmarm-master/next
* kvm-arm64/fpsimd-doc: : . : FPSIMD documentation update, courtesy of Mark Brown : . arm64/fpsimd: Clarify the purpose of using last in fpsimd_save() KVM: arm64: Add some more comments in kvm_hyp_handle_fpsimd() KVM: arm64: Add comments for context flush and sync callbacks Signed-off-by: Marc Zyngier <maz@kernel.org>
This commit is contained in:
commit
64330073b8
@ -348,7 +348,13 @@ static void task_fpsimd_load(void)
|
||||
|
||||
/*
|
||||
* Ensure FPSIMD/SVE storage in memory for the loaded context is up to
|
||||
* date with respect to the CPU registers.
|
||||
* date with respect to the CPU registers. Note carefully that the
|
||||
* current context is the context last bound to the CPU stored in
|
||||
* last, if KVM is involved this may be the guest VM context rather
|
||||
* than the host thread for the VM pointed to by current. This means
|
||||
* that we must always reference the state storage via last rather
|
||||
* than via current, other than the TIF_ flags which KVM will
|
||||
* carefully maintain for us.
|
||||
*/
|
||||
static void fpsimd_save(void)
|
||||
{
|
||||
|
@ -84,6 +84,11 @@ void kvm_arch_vcpu_load_fp(struct kvm_vcpu *vcpu)
|
||||
vcpu->arch.flags |= KVM_ARM64_HOST_SVE_ENABLED;
|
||||
}
|
||||
|
||||
/*
|
||||
* Called just before entering the guest once we are no longer
|
||||
* preemptable. Syncs the host's TIF_FOREIGN_FPSTATE with the KVM
|
||||
* mirror of the flag used by the hypervisor.
|
||||
*/
|
||||
void kvm_arch_vcpu_ctxflush_fp(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
if (test_thread_flag(TIF_FOREIGN_FPSTATE))
|
||||
@ -93,10 +98,11 @@ void kvm_arch_vcpu_ctxflush_fp(struct kvm_vcpu *vcpu)
|
||||
}
|
||||
|
||||
/*
|
||||
* If the guest FPSIMD state was loaded, update the host's context
|
||||
* tracking data mark the CPU FPSIMD regs as dirty and belonging to vcpu
|
||||
* so that they will be written back if the kernel clobbers them due to
|
||||
* kernel-mode NEON before re-entry into the guest.
|
||||
* Called just after exiting the guest. If the guest FPSIMD state
|
||||
* was loaded, update the host's context tracking data mark the CPU
|
||||
* FPSIMD regs as dirty and belonging to vcpu so that they will be
|
||||
* written back if the kernel clobbers them due to kernel-mode NEON
|
||||
* before re-entry into the guest.
|
||||
*/
|
||||
void kvm_arch_vcpu_ctxsync_fp(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
|
@ -173,6 +173,8 @@ static bool kvm_hyp_handle_fpsimd(struct kvm_vcpu *vcpu, u64 *exit_code)
|
||||
return false;
|
||||
|
||||
/* Valid trap. Switch the context: */
|
||||
|
||||
/* First disable enough traps to allow us to update the registers */
|
||||
if (has_vhe()) {
|
||||
reg = CPACR_EL1_FPEN;
|
||||
if (sve_guest)
|
||||
@ -188,11 +190,13 @@ static bool kvm_hyp_handle_fpsimd(struct kvm_vcpu *vcpu, u64 *exit_code)
|
||||
}
|
||||
isb();
|
||||
|
||||
/* Write out the host state if it's in the registers */
|
||||
if (vcpu->arch.flags & KVM_ARM64_FP_HOST) {
|
||||
__fpsimd_save_state(vcpu->arch.host_fpsimd_state);
|
||||
vcpu->arch.flags &= ~KVM_ARM64_FP_HOST;
|
||||
}
|
||||
|
||||
/* Restore the guest state */
|
||||
if (sve_guest)
|
||||
__hyp_sve_restore_guest(vcpu);
|
||||
else
|
||||
|
Loading…
x
Reference in New Issue
Block a user