[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH for-4.20 3/4] x86/fpu: Combine fpu_ctxt and xsave_area in arch_vcpu
On 09.07.2024 17:52, Alejandro Vallejo wrote: > --- a/xen/arch/x86/domctl.c > +++ b/xen/arch/x86/domctl.c > @@ -1343,7 +1343,8 @@ void arch_get_info_guest(struct vcpu *v, > vcpu_guest_context_u c) > #define c(fld) (c.nat->fld) > #endif > > - memcpy(&c.nat->fpu_ctxt, v->arch.fpu_ctxt, sizeof(c.nat->fpu_ctxt)); > + memcpy(&c.nat->fpu_ctxt, &v->arch.xsave_area->fpu_sse, > + sizeof(c.nat->fpu_ctxt)); Now that the middle argument has proper type, maybe take the opportunity and add BUILD_BUG_ON(sizeof(...) == sizeof(...))? (Also in e.g. hvm_save_cpu_ctxt() then.) > --- a/xen/arch/x86/include/asm/domain.h > +++ b/xen/arch/x86/include/asm/domain.h > @@ -591,12 +591,7 @@ struct pv_vcpu > > struct arch_vcpu > { > - /* > - * guest context (mirroring struct vcpu_guest_context) common > - * between pv and hvm guests > - */ > - > - void *fpu_ctxt; > + /* Fixed point registers */ > struct cpu_user_regs user_regs; Not exactly, no. Selector registers are there as well for example, which I wouldn't consider "fixed point" ones. I wonder why the existing comment cannot simply be kept, perhaps extended to mention that fpu_ctxt now lives elsewhere. > --- a/xen/arch/x86/x86_emulate/blk.c > +++ b/xen/arch/x86/x86_emulate/blk.c > @@ -11,7 +11,8 @@ > !defined(X86EMUL_NO_SIMD) > # ifdef __XEN__ > # include <asm/xstate.h> > -# define FXSAVE_AREA current->arch.fpu_ctxt > +# define FXSAVE_AREA ((struct x86_fxsr *) \ > + (void*)¤t->arch.xsave_area->fpu_sse) Nit: Blank missing after before *. > --- a/xen/arch/x86/xstate.c > +++ b/xen/arch/x86/xstate.c > @@ -507,9 +507,16 @@ int xstate_alloc_save_area(struct vcpu *v) > unsigned int size; > > if ( !cpu_has_xsave ) > - return 0; > - > - if ( !is_idle_vcpu(v) || !cpu_has_xsavec ) > + { > + /* > + * This is bigger than FXSAVE_SIZE by 64 bytes, but it helps treating > + * the FPU state uniformly as an XSAVE buffer even if XSAVE is not > + * available in the host. Note the alignment restriction of the XSAVE > + * area are stricter than those of the FXSAVE area. > + */ > + size = XSTATE_AREA_MIN_SIZE; What exactly would break if just (a little over) 512 bytes worth were allocated when there's no XSAVE? If it was exactly 512, something like xstate_all() would need to apply a little more care, I guess. Yet for that having just always-zero xstate_bv and xcomp_bv there would already suffice (e.g. using offsetof(..., xsave_hdr.reserved) here, to cover further fields gaining meaning down the road). Remember that due to xmalloc() overhead and the 64-byte-aligned requirement, you can only have 6 of them in a page the way you do it, when the alternative way 7 would fit (if I got my math right). Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |