1/*-
2 * Copyright (c) 1990 William Jolitz.
3 * Copyright (c) 1991 The Regents of the University of California.
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
--- 17 unchanged lines hidden (view full) ---
26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 * SUCH DAMAGE.
29 *
30 * from: @(#)npx.c 7.2 (Berkeley) 5/12/91
31 */
32
33#include <sys/cdefs.h>
34__FBSDID("$FreeBSD: head/sys/i386/isa/npx.c 158996 2006-05-28 04:40:45Z davidxu $");
35
36#include "opt_cpu.h"
37#include "opt_isa.h"
38#include "opt_npx.h"
39
40#include <sys/param.h>
41#include <sys/systm.h>
42#include <sys/bus.h>
--- 894 unchanged lines hidden (view full) ---
937 intr_restore(s);
938 } else {
939 intr_restore(s);
940 bcopy(addr, &td->td_pcb->pcb_save, sizeof(*addr));
941 }
942 curthread->td_pcb->pcb_flags |= PCB_NPXINITDONE;
943}
944
945/*
946 * POSIX requires new thread to inherit floating-point environment.
947 */
948void
949npx_fork_thread(struct thread *td, struct thread *newtd)
950{
951 union savefpu *state;
952 u_int32_t mxcsr;
953 u_int32_t cw;
954
955 if (!(td->td_pcb->pcb_flags & PCB_NPXINITDONE)) {
956 newtd->td_pcb->pcb_flags &= ~PCB_NPXINITDONE;
957 return;
958 }
959
960 state = &newtd->td_pcb->pcb_save;
961 /* get control word */
962 if (npxgetregs(td, state))
963 return;
964 if (cpu_fxsr) {
965 mxcsr = state->sv_xmm.sv_env.en_mxcsr;
966 cw = state->sv_xmm.sv_env.en_cw;
967 } else {
968 cw = state->sv_87.sv_env.en_cw;
969 mxcsr = 0;
970 }
971 bcopy(&npx_cleanstate, state, sizeof(*state));
972 if (cpu_fxsr) {
973 state->sv_xmm.sv_env.en_cw = cw;
974 state->sv_xmm.sv_env.en_mxcsr = mxcsr;
975 } else
976 state->sv_87.sv_env.en_cw = cw;
977 newtd->td_pcb->pcb_flags |= PCB_NPXINITDONE;
978}
979
980static void
981fpusave(addr)
982 union savefpu *addr;
983{
984
985#ifdef CPU_ENABLE_SSE
986 if (cpu_fxsr)
987 fxsave(addr);
--- 159 unchanged lines hidden ---
2 * Copyright (c) 1990 William Jolitz.
3 * Copyright (c) 1991 The Regents of the University of California.
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
--- 17 unchanged lines hidden (view full) ---
26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 * SUCH DAMAGE.
29 *
30 * from: @(#)npx.c 7.2 (Berkeley) 5/12/91
31 */
32
33#include <sys/cdefs.h>
34__FBSDID("$FreeBSD: head/sys/i386/isa/npx.c 158996 2006-05-28 04:40:45Z davidxu $");
35
36#include "opt_cpu.h"
37#include "opt_isa.h"
38#include "opt_npx.h"
39
40#include <sys/param.h>
41#include <sys/systm.h>
42#include <sys/bus.h>
--- 894 unchanged lines hidden (view full) ---
937 intr_restore(s);
938 } else {
939 intr_restore(s);
940 bcopy(addr, &td->td_pcb->pcb_save, sizeof(*addr));
941 }
942 curthread->td_pcb->pcb_flags |= PCB_NPXINITDONE;
943}
944
945/*
946 * POSIX requires new thread to inherit floating-point environment.
947 */
948void
949npx_fork_thread(struct thread *td, struct thread *newtd)
950{
951 union savefpu *state;
952 u_int32_t mxcsr;
953 u_int32_t cw;
954
955 if (!(td->td_pcb->pcb_flags & PCB_NPXINITDONE)) {
956 newtd->td_pcb->pcb_flags &= ~PCB_NPXINITDONE;
957 return;
958 }
959
960 state = &newtd->td_pcb->pcb_save;
961 /* get control word */
962 if (npxgetregs(td, state))
963 return;
964 if (cpu_fxsr) {
965 mxcsr = state->sv_xmm.sv_env.en_mxcsr;
966 cw = state->sv_xmm.sv_env.en_cw;
967 } else {
968 cw = state->sv_87.sv_env.en_cw;
969 mxcsr = 0;
970 }
971 bcopy(&npx_cleanstate, state, sizeof(*state));
972 if (cpu_fxsr) {
973 state->sv_xmm.sv_env.en_cw = cw;
974 state->sv_xmm.sv_env.en_mxcsr = mxcsr;
975 } else
976 state->sv_87.sv_env.en_cw = cw;
977 newtd->td_pcb->pcb_flags |= PCB_NPXINITDONE;
978}
979
980static void
981fpusave(addr)
982 union savefpu *addr;
983{
984
985#ifdef CPU_ENABLE_SSE
986 if (cpu_fxsr)
987 fxsave(addr);
--- 159 unchanged lines hidden ---