xref: /plan9/sys/src/9/teg2/softfpu.c (revision 3de6a9c0b3d5cf34fc4090d0bf1930d83799a7fd)
1*3de6a9c0SDavid du Colombier #include "u.h"
2*3de6a9c0SDavid du Colombier #include "../port/lib.h"
3*3de6a9c0SDavid du Colombier #include "mem.h"
4*3de6a9c0SDavid du Colombier #include "dat.h"
5*3de6a9c0SDavid du Colombier #include "fns.h"
6*3de6a9c0SDavid du Colombier 
7*3de6a9c0SDavid du Colombier int
fpudevprocio(Proc * proc,void * a,long n,uintptr offset,int write)8*3de6a9c0SDavid du Colombier fpudevprocio(Proc* proc, void* a, long n, uintptr offset, int write)
9*3de6a9c0SDavid du Colombier {
10*3de6a9c0SDavid du Colombier 	/*
11*3de6a9c0SDavid du Colombier 	 * Called from procdevtab.read and procdevtab.write
12*3de6a9c0SDavid du Colombier 	 * allow user process access to the FPU registers.
13*3de6a9c0SDavid du Colombier 	 * This is the only FPU routine which is called directly
14*3de6a9c0SDavid du Colombier 	 * from the port code; it would be nice to have dynamic
15*3de6a9c0SDavid du Colombier 	 * creation of entries in the device file trees...
16*3de6a9c0SDavid du Colombier 	 */
17*3de6a9c0SDavid du Colombier 	USED(proc, a, n, offset, write);
18*3de6a9c0SDavid du Colombier 
19*3de6a9c0SDavid du Colombier 	return 0;
20*3de6a9c0SDavid du Colombier }
21*3de6a9c0SDavid du Colombier 
22*3de6a9c0SDavid du Colombier void
fpunotify(Ureg *)23*3de6a9c0SDavid du Colombier fpunotify(Ureg*)
24*3de6a9c0SDavid du Colombier {
25*3de6a9c0SDavid du Colombier 	/*
26*3de6a9c0SDavid du Colombier 	 * Called when a note is about to be delivered to a
27*3de6a9c0SDavid du Colombier 	 * user process, usually at the end of a system call.
28*3de6a9c0SDavid du Colombier 	 * Note handlers are not allowed to use the FPU so
29*3de6a9c0SDavid du Colombier 	 * the state is marked (after saving if necessary) and
30*3de6a9c0SDavid du Colombier 	 * checked in the Device Not Available handler.
31*3de6a9c0SDavid du Colombier 	 */
32*3de6a9c0SDavid du Colombier }
33*3de6a9c0SDavid du Colombier 
34*3de6a9c0SDavid du Colombier void
fpunoted(void)35*3de6a9c0SDavid du Colombier fpunoted(void)
36*3de6a9c0SDavid du Colombier {
37*3de6a9c0SDavid du Colombier 	/*
38*3de6a9c0SDavid du Colombier 	 * Called from sysnoted() via the machine-dependent
39*3de6a9c0SDavid du Colombier 	 * noted() routine.
40*3de6a9c0SDavid du Colombier 	 * Clear the flag set above in fpunotify().
41*3de6a9c0SDavid du Colombier 	 */
42*3de6a9c0SDavid du Colombier }
43*3de6a9c0SDavid du Colombier 
44*3de6a9c0SDavid du Colombier void
fpusysrfork(Ureg *)45*3de6a9c0SDavid du Colombier fpusysrfork(Ureg*)
46*3de6a9c0SDavid du Colombier {
47*3de6a9c0SDavid du Colombier 	/*
48*3de6a9c0SDavid du Colombier 	 * Called early in the non-interruptible path of
49*3de6a9c0SDavid du Colombier 	 * sysrfork() via the machine-dependent syscall() routine.
50*3de6a9c0SDavid du Colombier 	 * Save the state so that it can be easily copied
51*3de6a9c0SDavid du Colombier 	 * to the child process later.
52*3de6a9c0SDavid du Colombier 	 */
53*3de6a9c0SDavid du Colombier }
54*3de6a9c0SDavid du Colombier 
55*3de6a9c0SDavid du Colombier void
fpusysrforkchild(Proc *,Ureg *,Proc *)56*3de6a9c0SDavid du Colombier fpusysrforkchild(Proc*, Ureg *, Proc*)
57*3de6a9c0SDavid du Colombier {
58*3de6a9c0SDavid du Colombier 	/*
59*3de6a9c0SDavid du Colombier 	 * Called later in sysrfork() via the machine-dependent
60*3de6a9c0SDavid du Colombier 	 * sysrforkchild() routine.
61*3de6a9c0SDavid du Colombier 	 * Copy the parent FPU state to the child.
62*3de6a9c0SDavid du Colombier 	 */
63*3de6a9c0SDavid du Colombier }
64*3de6a9c0SDavid du Colombier 
65*3de6a9c0SDavid du Colombier void
fpuprocsave(Proc *)66*3de6a9c0SDavid du Colombier fpuprocsave(Proc*)
67*3de6a9c0SDavid du Colombier {
68*3de6a9c0SDavid du Colombier 	/*
69*3de6a9c0SDavid du Colombier 	 * Called from sched() and sleep() via the machine-dependent
70*3de6a9c0SDavid du Colombier 	 * procsave() routine.
71*3de6a9c0SDavid du Colombier 	 * About to go in to the scheduler.
72*3de6a9c0SDavid du Colombier 	 * If the process wasn't using the FPU
73*3de6a9c0SDavid du Colombier 	 * there's nothing to do.
74*3de6a9c0SDavid du Colombier 	 */
75*3de6a9c0SDavid du Colombier }
76*3de6a9c0SDavid du Colombier 
77*3de6a9c0SDavid du Colombier void
fpuprocrestore(Proc *)78*3de6a9c0SDavid du Colombier fpuprocrestore(Proc*)
79*3de6a9c0SDavid du Colombier {
80*3de6a9c0SDavid du Colombier 	/*
81*3de6a9c0SDavid du Colombier 	 * The process has been rescheduled and is about to run.
82*3de6a9c0SDavid du Colombier 	 * Nothing to do here right now. If the process tries to use
83*3de6a9c0SDavid du Colombier 	 * the FPU again it will cause a Device Not Available
84*3de6a9c0SDavid du Colombier 	 * exception and the state will then be restored.
85*3de6a9c0SDavid du Colombier 	 */
86*3de6a9c0SDavid du Colombier }
87*3de6a9c0SDavid du Colombier 
88*3de6a9c0SDavid du Colombier void
fpusysprocsetup(Proc *)89*3de6a9c0SDavid du Colombier fpusysprocsetup(Proc*)
90*3de6a9c0SDavid du Colombier {
91*3de6a9c0SDavid du Colombier 	/*
92*3de6a9c0SDavid du Colombier 	 * Disable the FPU.
93*3de6a9c0SDavid du Colombier 	 * Called from sysexec() via sysprocsetup() to
94*3de6a9c0SDavid du Colombier 	 * set the FPU for the new process.
95*3de6a9c0SDavid du Colombier 	 */
96*3de6a9c0SDavid du Colombier }
97*3de6a9c0SDavid du Colombier 
98*3de6a9c0SDavid du Colombier void
fpuinit(void)99*3de6a9c0SDavid du Colombier fpuinit(void)
100*3de6a9c0SDavid du Colombier {
101*3de6a9c0SDavid du Colombier }
102*3de6a9c0SDavid du Colombier 
103*3de6a9c0SDavid du Colombier int
fpuemu(Ureg * ureg)104*3de6a9c0SDavid du Colombier fpuemu(Ureg* ureg)
105*3de6a9c0SDavid du Colombier {
106*3de6a9c0SDavid du Colombier 	int nfp;
107*3de6a9c0SDavid du Colombier 
108*3de6a9c0SDavid du Colombier 	if(waserror()){
109*3de6a9c0SDavid du Colombier 		splhi();
110*3de6a9c0SDavid du Colombier 		postnote(up, 1, up->errstr, NDebug);
111*3de6a9c0SDavid du Colombier 		return 1;
112*3de6a9c0SDavid du Colombier 	}
113*3de6a9c0SDavid du Colombier 	spllo();
114*3de6a9c0SDavid du Colombier 	nfp = fpiarm(ureg);
115*3de6a9c0SDavid du Colombier 	splhi();
116*3de6a9c0SDavid du Colombier 	poperror();
117*3de6a9c0SDavid du Colombier 
118*3de6a9c0SDavid du Colombier 	return nfp;
119*3de6a9c0SDavid du Colombier }
120*3de6a9c0SDavid du Colombier 
121*3de6a9c0SDavid du Colombier void
fpon(void)122*3de6a9c0SDavid du Colombier fpon(void)
123*3de6a9c0SDavid du Colombier {
124*3de6a9c0SDavid du Colombier }
125*3de6a9c0SDavid du Colombier 
126*3de6a9c0SDavid du Colombier void
fpoff(void)127*3de6a9c0SDavid du Colombier fpoff(void)
128*3de6a9c0SDavid du Colombier {
129*3de6a9c0SDavid du Colombier }
130