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