Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 10 Jan 2002 09:22:17 -0700
From:      Nate Williams <nate@yogotech.com>
To:        Dan Eischen <eischen@vigrid.com>
Cc:        Peter Wemm <peter@wemm.org>, Nate Williams <nate@yogotech.com>, Daniel Eischen <eischen@pcnet1.pcnet.com>, Archie Cobbs <archie@dellroad.org>, Alfred Perlstein <bright@mu.org>, arch@FreeBSD.ORG
Subject:   Re: Request for review: getcontext, setcontext, etc
Message-ID:  <15421.49081.206713.580230@caddis.yogotech.com>
In-Reply-To: <3C3D8C47.D3B11B87@vigrid.com>
References:  <20020110091018.0788A38CC@overcee.netplex.com.au> <3C3D8C47.D3B11B87@vigrid.com>

next in thread | previous in thread | raw e-mail | index | archive | help
> > FWIW, this is no longer the case.  On all current CPUs, there are a whole
> > stack more registers.  The context save buffer is 512 bytes long. It isn't
> > all used yet, but will be at some point in the future as long as you use
> > the defined fxsave/fxrstor instructions.
> > 
> > struct  envxmm {
> >         u_int16_t       en_cw;          /* control word (16bits) */
> >         u_int16_t       en_sw;          /* status word (16bits) */
> >         u_int16_t       en_tw;          /* tag word (16bits) */
> >         u_int16_t       en_opcode;      /* opcode last executed (11 bits ) */
> >         u_int32_t       en_fip;         /* floating point instruction pointer */
> >         u_int16_t       en_fcs;         /* floating code segment selector */
> >         u_int16_t       en_pad0;        /* padding */
> >         u_int32_t       en_foo;         /* floating operand offset */
> >         u_int16_t       en_fos;         /* floating operand segment selector */
> >         u_int16_t       en_pad1;        /* padding */
> >         u_int32_t       en_mxcsr;       /* SSE sontorol/status register */
> >         u_int32_t       en_pad2;        /* padding */
> > };
> > struct fpacc87 {
> >         u_char  fp_bytes[10];
> > };
> > struct  xmmacc {
> >         u_char  xmm_bytes[16];
> > };
> > struct  savexmm {
> >         struct  envxmm  sv_env;
> >         struct {
> >                 struct fpacc87  fp_acc;
> >                 u_char          fp_pad[6];      /* padding */
> >         } sv_fp[8];
> >         struct xmmacc   sv_xmm[8];
> >         u_long sv_ex_sw;        /* status word for last exception */
> >         u_char sv_pad[220];
> > } __attribute__((aligned(16)));
> > 
> > There are eight 10-byte registers, and eight 16-byte registers.
> > 
> > union   savefpu {
> >         struct  save87  sv_87;
> >         struct  savexmm sv_xmm;
> > };
> > 
> > /* and this is what we save for userland state */
> > struct pcb {
> > ...
> >         union   savefpu pcb_save;
> > };
> > 
> > When a userland application does a getcontext(), the kernel looks at
> > fpcurthread to see if the calling process/thread/whatever has got its
> > context stored in the pcb or in the live registers.  There is no need to
> > copy state to the FPU solely in order for the userland to save a copy.
> 
> I think we determined that the only time we care about the FP state is
> when sending a signal.

Bruce stated this, but I'm not sure I agree since it's not obvious (to
me anyway) that this always works when doing yield's and such which
don't cause a signal to be sent.

> In that case, the kernel should know how to get the FPU state and copy
> it out to the context.  If there are different FPU formats, there is a
> flags word that can be set accordingly and the userland setcontext()
> can be made to account for different floating point formats.

See above.

> Currently the kernel doesn't save the FPU state in the sigcontext,
> but it should.  Wouldn't this solve the problem?

I believe so, given the comments stated on this thread.



Nate

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-arch" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?15421.49081.206713.580230>