Date: Sun, 30 Apr 2000 10:00:12 -0400 (EDT) From: Daniel Eischen <eischen@vigrid.com> To: Marco van de Voort <marcov@stack.nl> Cc: hackers@FreeBSD.ORG Subject: Re: fp statusword in sigcontext Message-ID: <Pine.SUN.3.91.1000430095431.7649A-100000@pcnet1.pcnet.com> In-Reply-To: <20000430134619.C29D82E806@hermes.tue.nl>
next in thread | previous in thread | raw e-mail | index | archive | help
On Sun, 30 Apr 2000, Marco van de Voort wrote:
> I want a signalhandler, which splits out sigfpe to the different copro
> signals. I found a linux example, which is based on the statusword field of the
> sigcontext structure passed to the signalhandler set
>
> Problem is that the linux sigcontext has a field for the floatingpoint statusword,
> while the BSD sigcontext (machine/signal.h) has only two arrays of int's:
>
> (FPU part struct sigcontext
> * XXX FPU state is 27 * 4 bytes h/w, 1 * 4 bytes s/w (probably not
> * needed here), or that + 16 * 4 bytes for emulators (probably all
> * needed here). The "spare" bytes are mostly not spare.
> */
> int sc_fpregs[28]; /* machine state (FPU): */
> int sc_spare[17];
> };
>
> Does somebody know how to distille the FP statusword from this struct?
See <machine/reg.h> and <machine/npx.h>.
struct fpreg {
/*
* XXX should get struct from npx.h. Here we give a slightly
* simplified struct. This may be too much detail. Perhaps
* an array of unsigned longs is best.
*/
unsigned long fpr_env[7];
unsigned char fpr_acc[8][10];
unsigned long fpr_ex_sw;
unsigned char fpr_pad[64];
};
fpr_env should correspond to struct env87 in npx.h:
/* Environment information of floating point unit */
struct env87 {
long en_cw; /* control word (16bits) */
long en_sw; /* status word (16bits) */
long en_tw; /* tag word (16bits) */
long en_fip; /* floating point instruction pointer */
u_short en_fcs; /* floating code segment selector */
u_short en_opcode; /* opcode last executed (11 bits ) */
long en_foo; /* floating operand offset */
long en_fos; /* floating operand segment selector */
};
So your status word should be in sc_fpregs[1].
--
Dan Eischen
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.SUN.3.91.1000430095431.7649A-100000>
