Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-12:Update
xen.10697
5b323e3c-x86-EFI-fix-FPU-state-handling-around-...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 5b323e3c-x86-EFI-fix-FPU-state-handling-around-runtime-calls.patch of Package xen.10697
# Commit 23839a0fa0bbe78c174cd2bb49083e153f0f99df # Date 2018-06-26 15:23:08 +0200 # Author Jan Beulich <jbeulich@suse.com> # Committer Jan Beulich <jbeulich@suse.com> x86/EFI: further correct FPU state handling around runtime calls We must not leave a vCPU with CR0.TS clear when it is not in fully eager mode and has not touched non-lazy state. Instead of adding a 3rd invocation of stts() to vcpu_restore_fpu_eager(), consolidate all of them into a single one done at the end of the function. Rename the function at the same time to better reflect its purpose, as the patches touches all of its occurences anyway. The new function parameter is not really well named, but "need_stts_if_not_fully_eager" seemed excessive to me. Signed-off-by: Jan Beulich <jbeulich@suse.com> Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com> Reviewed-by: Paul Durrant <paul.durrant@citrix.com> --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -1569,7 +1569,7 @@ static void __context_switch(void) if ( xcr0 != get_xcr0() && !set_xcr0(xcr0) ) BUG(); } - vcpu_restore_fpu_eager(n); + vcpu_restore_fpu_nonlazy(n, 0); n->arch.ctxt_switch_to(n); } --- a/xen/arch/x86/efi/runtime.c +++ b/xen/arch/x86/efi/runtime.c @@ -128,7 +128,7 @@ void efi_rs_leave(struct efi_rs_state *s irq_exit(); efi_rs_on_cpu = NR_CPUS; spin_unlock(&efi_rs_lock); - vcpu_restore_fpu_eager(curr); + vcpu_restore_fpu_nonlazy(curr, 1); } bool_t efi_rs_using_pgtables(void) --- a/xen/arch/x86/i387.c +++ b/xen/arch/x86/i387.c @@ -212,7 +212,7 @@ static inline void fpu_fsave(struct vcpu /* VCPU FPU Functions */ /*******************************/ /* Restore FPU state whenever VCPU is schduled in. */ -void vcpu_restore_fpu_eager(struct vcpu *v) +void vcpu_restore_fpu_nonlazy(struct vcpu *v, bool_t need_stts) { if ( v->arch.fully_eager_fpu ) { @@ -230,8 +230,7 @@ void vcpu_restore_fpu_eager(struct vcpu v->fpu_dirtied = 1; /* Xen doesn't need TS set, but the guest might. */ - if ( is_pv_vcpu(v) && (v->arch.pv_vcpu.ctrlreg[0] & X86_CR0_TS) ) - stts(); + need_stts = is_pv_vcpu(v) && (v->arch.pv_vcpu.ctrlreg[0] & X86_CR0_TS); } /* save the nonlazy extended state which is not tracked by CR0.TS bit */ else if ( v->arch.nonlazy_xstate_used ) @@ -241,8 +240,11 @@ void vcpu_restore_fpu_eager(struct vcpu /* Avoid recursion */ clts(); fpu_xrstor(v, XSTATE_NONLAZY); - stts(); + need_stts = 1; } + + if ( need_stts ) + stts(); } /* --- a/xen/include/asm-x86/i387.h +++ b/xen/include/asm-x86/i387.h @@ -35,7 +35,7 @@ struct ix87_state { } __attribute__((__packed__)) r[8]; }; -void vcpu_restore_fpu_eager(struct vcpu *v); +void vcpu_restore_fpu_nonlazy(struct vcpu *v, bool_t need_stts); void vcpu_restore_fpu_lazy(struct vcpu *v); void vcpu_save_fpu(struct vcpu *v); void save_fpu_enable(void);
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor