plan9fox/sys/src/9/omap/softfpu.c
cinap_lenrek d94ffb4808 kernel: do all fp state fork from procfork() (like pc kernel)
this simplifies the arm ports and keeps all the stuff in one place
instead of spreading it thru notify(), trap() and syscall() functions
and prevents useless fp state copying for kernel procs.

also make sure to save fp in notify while still splhi().
2013-05-30 23:26:21 +02:00

108 lines
1.9 KiB
C

#include "u.h"
#include "../port/lib.h"
#include "mem.h"
#include "dat.h"
#include "fns.h"
int
fpudevprocio(Proc* proc, void* a, long n, uintptr offset, int write)
{
/*
* Called from procdevtab.read and procdevtab.write
* allow user process access to the FPU registers.
* This is the only FPU routine which is called directly
* from the port code; it would be nice to have dynamic
* creation of entries in the device file trees...
*/
USED(proc, a, n, offset, write);
return 0;
}
void
fpunotify(Ureg*)
{
/*
* Called when a note is about to be delivered to a
* user process, usually at the end of a system call.
* Note handlers are not allowed to use the FPU so
* the state is marked (after saving if necessary) and
* checked in the Device Not Available handler.
*/
}
void
fpunoted(void)
{
/*
* Called from sysnoted() via the machine-dependent
* noted() routine.
* Clear the flag set above in fpunotify().
*/
}
void
fpuprocsave(Proc*)
{
/*
* Called from sched() and sleep() via the machine-dependent
* procsave() routine.
* About to go in to the scheduler.
* If the process wasn't using the FPU
* there's nothing to do.
*/
}
void
fpuprocrestore(Proc*)
{
/*
* The process has been rescheduled and is about to run.
* Nothing to do here right now. If the process tries to use
* the FPU again it will cause a Device Not Available
* exception and the state will then be restored.
*/
}
void
fpuprocfork(Proc*)
{
/*
* The current process has been forked, save and copy neccesary
* state to child. Nothing to do here, child proc starts with FPinit.
*/
}
void
fpusysprocsetup(Proc*)
{
/*
* Disable the FPU.
* Called from sysexec() via sysprocsetup() to
* set the FPU for the new process.
*/
}
void
fpuinit(void)
{
}
int
fpuemu(Ureg* ureg)
{
int nfp;
if(waserror()){
splhi();
postnote(up, 1, up->errstr, NDebug);
return 1;
}
spllo();
nfp = fpiarm(ureg);
splhi();
poperror();
return nfp;
}