1154abd99SDavid du Colombier #include "u.h"
2154abd99SDavid du Colombier #include "../port/lib.h"
3154abd99SDavid du Colombier #include "mem.h"
4154abd99SDavid du Colombier #include "dat.h"
5154abd99SDavid du Colombier #include "fns.h"
6154abd99SDavid du Colombier
7154abd99SDavid du Colombier int
fpudevprocio(Proc * proc,void * a,long n,uintptr offset,int write)8154abd99SDavid du Colombier fpudevprocio(Proc* proc, void* a, long n, uintptr offset, int write)
9154abd99SDavid du Colombier {
10154abd99SDavid du Colombier /*
11154abd99SDavid du Colombier * Called from procdevtab.read and procdevtab.write
12154abd99SDavid du Colombier * allow user process access to the FPU registers.
13154abd99SDavid du Colombier * This is the only FPU routine which is called directly
14154abd99SDavid du Colombier * from the port code; it would be nice to have dynamic
15154abd99SDavid du Colombier * creation of entries in the device file trees...
16154abd99SDavid du Colombier */
17154abd99SDavid du Colombier USED(proc, a, n, offset, write);
18154abd99SDavid du Colombier
19154abd99SDavid du Colombier return 0;
20154abd99SDavid du Colombier }
21154abd99SDavid du Colombier
22154abd99SDavid du Colombier void
fpunotify(Ureg *)23154abd99SDavid du Colombier fpunotify(Ureg*)
24154abd99SDavid du Colombier {
25154abd99SDavid du Colombier /*
26154abd99SDavid du Colombier * Called when a note is about to be delivered to a
27154abd99SDavid du Colombier * user process, usually at the end of a system call.
28154abd99SDavid du Colombier * Note handlers are not allowed to use the FPU so
29154abd99SDavid du Colombier * the state is marked (after saving if necessary) and
30154abd99SDavid du Colombier * checked in the Device Not Available handler.
31154abd99SDavid du Colombier */
32154abd99SDavid du Colombier }
33154abd99SDavid du Colombier
34154abd99SDavid du Colombier void
fpunoted(void)35154abd99SDavid du Colombier fpunoted(void)
36154abd99SDavid du Colombier {
37154abd99SDavid du Colombier /*
38154abd99SDavid du Colombier * Called from sysnoted() via the machine-dependent
39154abd99SDavid du Colombier * noted() routine.
40154abd99SDavid du Colombier * Clear the flag set above in fpunotify().
41154abd99SDavid du Colombier */
42154abd99SDavid du Colombier }
43154abd99SDavid du Colombier
44154abd99SDavid du Colombier void
fpusysrfork(Ureg *)45154abd99SDavid du Colombier fpusysrfork(Ureg*)
46154abd99SDavid du Colombier {
47154abd99SDavid du Colombier /*
48154abd99SDavid du Colombier * Called early in the non-interruptible path of
49154abd99SDavid du Colombier * sysrfork() via the machine-dependent syscall() routine.
50154abd99SDavid du Colombier * Save the state so that it can be easily copied
51154abd99SDavid du Colombier * to the child process later.
52154abd99SDavid du Colombier */
53154abd99SDavid du Colombier }
54154abd99SDavid du Colombier
55154abd99SDavid du Colombier void
fpusysrforkchild(Proc *,Ureg *,Proc *)56*b1c4f505SDavid du Colombier fpusysrforkchild(Proc*, Ureg*, Proc*)
57154abd99SDavid du Colombier {
58154abd99SDavid du Colombier /*
59154abd99SDavid du Colombier * Called later in sysrfork() via the machine-dependent
60154abd99SDavid du Colombier * sysrforkchild() routine.
61154abd99SDavid du Colombier * Copy the parent FPU state to the child.
62154abd99SDavid du Colombier */
63154abd99SDavid du Colombier }
64154abd99SDavid du Colombier
65154abd99SDavid du Colombier void
fpuprocsave(Proc *)66154abd99SDavid du Colombier fpuprocsave(Proc*)
67154abd99SDavid du Colombier {
68154abd99SDavid du Colombier /*
69154abd99SDavid du Colombier * Called from sched() and sleep() via the machine-dependent
70154abd99SDavid du Colombier * procsave() routine.
71154abd99SDavid du Colombier * About to go in to the scheduler.
72154abd99SDavid du Colombier * If the process wasn't using the FPU
73154abd99SDavid du Colombier * there's nothing to do.
74154abd99SDavid du Colombier */
75154abd99SDavid du Colombier }
76154abd99SDavid du Colombier
77154abd99SDavid du Colombier void
fpuprocrestore(Proc *)78154abd99SDavid du Colombier fpuprocrestore(Proc*)
79154abd99SDavid du Colombier {
80154abd99SDavid du Colombier /*
81154abd99SDavid du Colombier * The process has been rescheduled and is about to run.
82154abd99SDavid du Colombier * Nothing to do here right now. If the process tries to use
83154abd99SDavid du Colombier * the FPU again it will cause a Device Not Available
84154abd99SDavid du Colombier * exception and the state will then be restored.
85154abd99SDavid du Colombier */
86154abd99SDavid du Colombier }
87154abd99SDavid du Colombier
88154abd99SDavid du Colombier void
fpusysprocsetup(Proc *)89154abd99SDavid du Colombier fpusysprocsetup(Proc*)
90154abd99SDavid du Colombier {
91154abd99SDavid du Colombier /*
92154abd99SDavid du Colombier * Disable the FPU.
93154abd99SDavid du Colombier * Called from sysexec() via sysprocsetup() to
94154abd99SDavid du Colombier * set the FPU for the new process.
95154abd99SDavid du Colombier */
96154abd99SDavid du Colombier }
97154abd99SDavid du Colombier
98154abd99SDavid du Colombier void
fpuinit(void)99154abd99SDavid du Colombier fpuinit(void)
100154abd99SDavid du Colombier {
101154abd99SDavid du Colombier }
102154abd99SDavid du Colombier
103154abd99SDavid du Colombier int
fpuemu(Ureg * ureg)104154abd99SDavid du Colombier fpuemu(Ureg* ureg)
105154abd99SDavid du Colombier {
106154abd99SDavid du Colombier int nfp;
107154abd99SDavid du Colombier
108154abd99SDavid du Colombier if(waserror()){
109154abd99SDavid du Colombier splhi();
110154abd99SDavid du Colombier postnote(up, 1, up->errstr, NDebug);
111154abd99SDavid du Colombier return 1;
112154abd99SDavid du Colombier }
113154abd99SDavid du Colombier spllo();
114154abd99SDavid du Colombier nfp = fpiarm(ureg);
115154abd99SDavid du Colombier splhi();
116154abd99SDavid du Colombier poperror();
117154abd99SDavid du Colombier
118154abd99SDavid du Colombier return nfp;
119154abd99SDavid du Colombier }
120