11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*- 21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (c) 1990 The Regents of the University of California. 31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * All rights reserved. 41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * This code is derived from software contributed to Berkeley by 61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * William Jolitz. 71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Redistribution and use in source and binary forms, with or without 91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * modification, are permitted provided that the following conditions 101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * are met: 111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * notice, this list of conditions and the following disclaimer. 131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * documentation and/or other materials provided with the distribution. 161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 4. Neither the name of the University nor the names of its contributors 171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * may be used to endorse or promote products derived from this software 181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * without specific prior written permission. 191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * SUCH DAMAGE. 311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * from: @(#)npx.h 5.3 (Berkeley) 1/18/91 331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * $FreeBSD: src/sys/i386/include/npx.h,v 1.29.2.1 2006/07/01 00:57:55 davidxu Exp $ 341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 287/387 NPX Coprocessor Data Structures and Constants 381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * W. Jolitz 1/90 391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef _MACHINE_NPX_H_ 421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define _MACHINE_NPX_H_ 431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* Environment information of floating point unit */ 451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstruct env87 { 461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project long en_cw; /* control word (16bits) */ 471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project long en_sw; /* status word (16bits) */ 481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project long en_tw; /* tag word (16bits) */ 491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project long en_fip; /* floating point instruction pointer */ 501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_short en_fcs; /* floating code segment selector */ 511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_short en_opcode; /* opcode last executed (11 bits ) */ 521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project long en_foo; /* floating operand offset */ 531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project long en_fos; /* floating operand segment selector */ 541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}; 551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* Contents of each floating point accumulator */ 571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstruct fpacc87 { 581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef dontdef /* too unportable */ 591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_long fp_mantlo; /* mantissa low (31:0) */ 601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_long fp_manthi; /* mantissa high (63:32) */ 611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int fp_exp:15; /* exponent */ 621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int fp_sgn:1; /* mantissa sign */ 631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else 641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_char fp_bytes[10]; 651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}; 671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* Floating point context */ 691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstruct save87 { 701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct env87 sv_env; /* floating point control/status */ 711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct fpacc87 sv_ac[8]; /* accumulator contents, 0-7 */ 721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_char sv_pad0[4]; /* padding for (now unused) saved status word */ 731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* 741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Bogus padding for emulators. Emulators should use their own 751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * struct and arrange to store into this struct (ending here) 761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * before it is inspected for ptracing or for core dumps. Some 771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * emulators overwrite the whole struct. We have no good way of 781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * knowing how much padding to leave. Leave just enough for the 791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * GPL emulator's i387_union (176 bytes total). 801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_char sv_pad[64]; /* padding; used by emulators */ 821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}; 831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstruct envxmm { 851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int16_t en_cw; /* control word (16bits) */ 861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int16_t en_sw; /* status word (16bits) */ 871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int16_t en_tw; /* tag word (16bits) */ 881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int16_t en_opcode; /* opcode last executed (11 bits ) */ 891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int32_t en_fip; /* floating point instruction pointer */ 901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int16_t en_fcs; /* floating code segment selector */ 911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int16_t en_pad0; /* padding */ 921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int32_t en_foo; /* floating operand offset */ 931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int16_t en_fos; /* floating operand segment selector */ 941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int16_t en_pad1; /* padding */ 951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int32_t en_mxcsr; /* SSE sontorol/status register */ 961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int32_t en_mxcsr_mask; /* valid bits in mxcsr */ 971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}; 981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* Contents of each SSE extended accumulator */ 1001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstruct xmmacc { 1011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_char xmm_bytes[16]; 1021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}; 1031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstruct savexmm { 1051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct envxmm sv_env; 1061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct { 1071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct fpacc87 fp_acc; 1081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_char fp_pad[6]; /* padding */ 1091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } sv_fp[8]; 1101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct xmmacc sv_xmm[8]; 1111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_char sv_pad[224]; 1121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} __aligned(16); 1131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectunion savefpu { 1151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct save87 sv_87; 1161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct savexmm sv_xmm; 1171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}; 1181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 1201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * The hardware default control word for i387's and later coprocessors is 1211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 0x37F, giving: 1221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 1231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * round to nearest 1241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 64-bit precision 1251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * all exceptions masked. 1261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 1271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * We modify the affine mode bit and precision bits in this to give: 1281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 1291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * affine mode for 287's (if they work at all) (1 in bitfield 1<<12) 1301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 53-bit precision (2 in bitfield 3<<8) 1311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 1321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 64-bit precision often gives bad results with high level languages 1331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * because it makes the results of calculations depend on whether 1341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * intermediate values are stored in memory or in FPU registers. 1351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 1361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define __INITIAL_NPXCW__ 0x127F 1371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define __INITIAL_MXCSR__ 0x1F80 1381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef _KERNEL 1401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define IO_NPX 0x0F0 /* Numeric Coprocessor */ 1421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define IO_NPXSIZE 16 /* 80387/80487 NPX registers */ 1431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define IRQ_NPX 13 1451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* full reset on some systems, NOP on others */ 1471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define npx_full_reset() outb(IO_NPX + 1, 0) 1481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint npxdna(void); 1501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid npxdrop(void); 1511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid npxexit(struct thread *td); 1521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint npxformat(void); 1531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint npxgetregs(struct thread *td, union savefpu *addr); 1541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid npxinit(u_short control); 1551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid npxsave(union savefpu *addr); 1561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid npxsetregs(struct thread *td, union savefpu *addr); 1571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint npxtrap(void); 1581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 1591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* !_MACHINE_NPX_H_ */ 161