From owner-freebsd-hackers Sun Apr 30 7: 0:48 2000 Delivered-To: freebsd-hackers@freebsd.org Received: from pcnet1.pcnet.com (pcnet1.pcnet.com [204.213.232.3]) by hub.freebsd.org (Postfix) with ESMTP id 7AB4E37BAD8 for ; Sun, 30 Apr 2000 07:00:44 -0700 (PDT) (envelope-from eischen@vigrid.com) Received: (from eischen@localhost) by pcnet1.pcnet.com (8.8.7/PCNet) id KAA08167; Sun, 30 Apr 2000 10:00:12 -0400 (EDT) Date: Sun, 30 Apr 2000 10:00:12 -0400 (EDT) From: Daniel Eischen To: Marco van de Voort Cc: hackers@FreeBSD.ORG Subject: Re: fp statusword in sigcontext In-Reply-To: <20000430134619.C29D82E806@hermes.tue.nl> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: owner-freebsd-hackers@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.ORG 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 and . 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