xref: /plan9-contrib/sys/src/9/kw/softfpu.c (revision b1c4f5054848283efc84bb5787a75d679feda9b8)
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