1 | /*-
|
---|
2 | * Copyright (c) 1990 The Regents of the University of California.
|
---|
3 | * All rights reserved.
|
---|
4 | *
|
---|
5 | * This code is derived from software contributed to Berkeley by
|
---|
6 | * William Jolitz.
|
---|
7 | *
|
---|
8 | * Redistribution and use in source and binary forms, with or without
|
---|
9 | * modification, are permitted provided that the following conditions
|
---|
10 | * are met:
|
---|
11 | * 1. Redistributions of source code must retain the above copyright
|
---|
12 | * notice, this list of conditions and the following disclaimer.
|
---|
13 | * 2. Redistributions in binary form must reproduce the above copyright
|
---|
14 | * notice, this list of conditions and the following disclaimer in the
|
---|
15 | * documentation and/or other materials provided with the distribution.
|
---|
16 | * 3. All advertising materials mentioning features or use of this software
|
---|
17 | * must display the following acknowledgement:
|
---|
18 | * This product includes software developed by the University of
|
---|
19 | * California, Berkeley and its contributors.
|
---|
20 | * 4. Neither the name of the University nor the names of its contributors
|
---|
21 | * may be used to endorse or promote products derived from this software
|
---|
22 | * without specific prior written permission.
|
---|
23 | *
|
---|
24 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
---|
25 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
---|
26 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
---|
27 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
---|
28 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
---|
29 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
---|
30 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
---|
31 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
---|
32 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
---|
33 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
---|
34 | * SUCH DAMAGE.
|
---|
35 | *
|
---|
36 | * from: @(#)npx.h 5.3 (Berkeley) 1/18/91
|
---|
37 | * $FreeBSD: src/sys/i386/include/npx.h,v 1.26 2002/09/23 05:55:10 peter Exp $
|
---|
38 | */
|
---|
39 |
|
---|
40 | /*
|
---|
41 | * 287/387 NPX Coprocessor Data Structures and Constants
|
---|
42 | * W. Jolitz 1/90
|
---|
43 | */
|
---|
44 |
|
---|
45 | /** @file
|
---|
46 | * FreeBSD 5.1
|
---|
47 | */
|
---|
48 |
|
---|
49 | #ifndef _MACHINE_NPX_H_
|
---|
50 | #define _MACHINE_NPX_H_
|
---|
51 |
|
---|
52 | /* Environment information of floating point unit */
|
---|
53 | struct env87 {
|
---|
54 | long en_cw; /* control word (16bits) */
|
---|
55 | long en_sw; /* status word (16bits) */
|
---|
56 | long en_tw; /* tag word (16bits) */
|
---|
57 | long en_fip; /* floating point instruction pointer */
|
---|
58 | u_short en_fcs; /* floating code segment selector */
|
---|
59 | u_short en_opcode; /* opcode last executed (11 bits ) */
|
---|
60 | long en_foo; /* floating operand offset */
|
---|
61 | long en_fos; /* floating operand segment selector */
|
---|
62 | };
|
---|
63 |
|
---|
64 | /* Contents of each floating point accumulator */
|
---|
65 | struct fpacc87 {
|
---|
66 | #ifdef dontdef /* too unportable */
|
---|
67 | u_long fp_mantlo; /* mantissa low (31:0) */
|
---|
68 | u_long fp_manthi; /* mantissa high (63:32) */
|
---|
69 | int fp_exp:15; /* exponent */
|
---|
70 | int fp_sgn:1; /* mantissa sign */
|
---|
71 | #else
|
---|
72 | u_char fp_bytes[10];
|
---|
73 | #endif
|
---|
74 | };
|
---|
75 |
|
---|
76 | /* Floating point context */
|
---|
77 | struct save87 {
|
---|
78 | struct env87 sv_env; /* floating point control/status */
|
---|
79 | struct fpacc87 sv_ac[8]; /* accumulator contents, 0-7 */
|
---|
80 | u_char sv_pad0[4]; /* padding for (now unused) saved status word */
|
---|
81 | /*
|
---|
82 | * Bogus padding for emulators. Emulators should use their own
|
---|
83 | * struct and arrange to store into this struct (ending here)
|
---|
84 | * before it is inspected for ptracing or for core dumps. Some
|
---|
85 | * emulators overwrite the whole struct. We have no good way of
|
---|
86 | * knowing how much padding to leave. Leave just enough for the
|
---|
87 | * GPL emulator's i387_union (176 bytes total).
|
---|
88 | */
|
---|
89 | u_char sv_pad[64]; /* padding; used by emulators */
|
---|
90 | };
|
---|
91 |
|
---|
92 | struct envxmm {
|
---|
93 | u_int16_t en_cw; /* control word (16bits) */
|
---|
94 | u_int16_t en_sw; /* status word (16bits) */
|
---|
95 | u_int16_t en_tw; /* tag word (16bits) */
|
---|
96 | u_int16_t en_opcode; /* opcode last executed (11 bits ) */
|
---|
97 | u_int32_t en_fip; /* floating point instruction pointer */
|
---|
98 | u_int16_t en_fcs; /* floating code segment selector */
|
---|
99 | u_int16_t en_pad0; /* padding */
|
---|
100 | u_int32_t en_foo; /* floating operand offset */
|
---|
101 | u_int16_t en_fos; /* floating operand segment selector */
|
---|
102 | u_int16_t en_pad1; /* padding */
|
---|
103 | u_int32_t en_mxcsr; /* SSE sontorol/status register */
|
---|
104 | u_int32_t en_pad2; /* padding */
|
---|
105 | };
|
---|
106 |
|
---|
107 | /* Contents of each SSE extended accumulator */
|
---|
108 | struct xmmacc {
|
---|
109 | u_char xmm_bytes[16];
|
---|
110 | };
|
---|
111 |
|
---|
112 | struct savexmm {
|
---|
113 | struct envxmm sv_env;
|
---|
114 | struct {
|
---|
115 | struct fpacc87 fp_acc;
|
---|
116 | u_char fp_pad[6]; /* padding */
|
---|
117 | } sv_fp[8];
|
---|
118 | struct xmmacc sv_xmm[8];
|
---|
119 | u_char sv_pad[224];
|
---|
120 | } __aligned(16);
|
---|
121 |
|
---|
122 | union savefpu {
|
---|
123 | struct save87 sv_87;
|
---|
124 | struct savexmm sv_xmm;
|
---|
125 | };
|
---|
126 |
|
---|
127 | /*
|
---|
128 | * The hardware default control word for i387's and later coprocessors is
|
---|
129 | * 0x37F, giving:
|
---|
130 | *
|
---|
131 | * round to nearest
|
---|
132 | * 64-bit precision
|
---|
133 | * all exceptions masked.
|
---|
134 | *
|
---|
135 | * We modify the affine mode bit and precision bits in this to give:
|
---|
136 | *
|
---|
137 | * affine mode for 287's (if they work at all) (1 in bitfield 1<<12)
|
---|
138 | * 53-bit precision (2 in bitfield 3<<8)
|
---|
139 | *
|
---|
140 | * 64-bit precision often gives bad results with high level languages
|
---|
141 | * because it makes the results of calculations depend on whether
|
---|
142 | * intermediate values are stored in memory or in FPU registers.
|
---|
143 | */
|
---|
144 | #define __INITIAL_NPXCW__ 0x127F
|
---|
145 |
|
---|
146 | #ifdef _KERNEL
|
---|
147 | int npxdna(void);
|
---|
148 | void npxdrop(void);
|
---|
149 | void npxexit(struct thread *td);
|
---|
150 | int npxformat(void);
|
---|
151 | int npxgetregs(struct thread *td, union savefpu *addr);
|
---|
152 | void npxinit(u_short control);
|
---|
153 | void npxsave(union savefpu *addr);
|
---|
154 | void npxsetregs(struct thread *td, union savefpu *addr);
|
---|
155 | int npxtrap(void);
|
---|
156 | #endif
|
---|
157 |
|
---|
158 | #endif /* !_MACHINE_NPX_H_ */
|
---|