ref: b607812f14bc1d254ce04c6ed4f8619b22339735
parent: a7318c750f7d3ec1728c4ec05b16faa70585be94
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Thu May 30 19:26:21 EDT 2013
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().
--- a/sys/src/9/alphapc/trap.c
+++ b/sys/src/9/alphapc/trap.c
@@ -523,10 +523,6 @@
if(up->nnote == 0)
return 0;
- spllo();
- qlock(&up->debug);
- up->notepending = 0;
-
if(up->fpstate == FPactive){savefpregs(&up->fpsave);
up->fpstate = FPinactive;
@@ -533,6 +529,10 @@
}
up->fpstate |= FPillegal;
+ spllo();
+ qlock(&up->debug);
+ up->notepending = 0;
+
n = &up->note[0];
if(strncmp(n->msg, "sys:", 4) == 0) {l = strlen(n->msg);
@@ -712,12 +712,6 @@
scallnr = ur->r0;
up->scallnr = ur->r0;
-
- if(scallnr == RFORK && up->fpstate == FPactive){- savefpregs(&up->fpsave);
- up->fpstate = FPinactive;
-//print("SR=%lux+", up->fpsave.fpstatus);- }
spllo();
sp = ur->sp;
--- a/sys/src/9/bcm/fns.h
+++ b/sys/src/9/bcm/fns.h
@@ -82,9 +82,8 @@
extern void fpunotify(Ureg*);
extern void fpuprocrestore(Proc*);
extern void fpuprocsave(Proc*);
+extern void fpuprocfork(Proc*);
extern void fpusysprocsetup(Proc*);
-extern void fpusysrfork(Ureg*);
-extern void fpusysrforkchild(Proc*, Ureg*, Proc*);
extern int fpuemu(Ureg*);
/*
* Things called from port.
--- a/sys/src/9/bcm/vfp3.c
+++ b/sys/src/9/bcm/vfp3.c
@@ -239,33 +239,6 @@
up->fpstate &= ~FPillegal;
}
-/*
- * Called early in the non-interruptible path of
- * sysrfork() via the machine-dependent syscall() routine.
- * Save the state so that it can be easily copied
- * to the child process later.
- */
-void
-fpusysrfork(Ureg*)
-{- if(up->fpstate == FPactive){- fpsave(&up->fpsave);
- up->fpstate = FPinactive;
- }
-}
-
-/*
- * Called later in sysrfork() via the machine-dependent
- * sysrforkchild() routine.
- * Copy the parent FPU state to the child.
- */
-void
-fpusysrforkchild(Proc *p, Ureg *, Proc *up)
-{- /* don't penalize the child, it hasn't done FP in a note handler. */
- p->fpstate = up->fpstate & ~FPillegal;
-}
-
/* should only be called if p->fpstate == FPactive */
void
fpsave(FPsave *fps)
@@ -330,6 +303,28 @@
void
fpuprocrestore(Proc *)
{+}
+
+/*
+ * The current process has been forked,
+ * save and copy neccesary state to child.
+ */
+void
+fpuprocfork(Proc *p)
+{+ int s;
+
+ s = splhi();
+ switch(up->fpstate & ~FPillegal){+ case FPactive:
+ fpsave(&up->fpsave);
+ up->fpstate = FPinactive;
+ /* no break */
+ case FPinactive:
+ p->fpsave = up->fpsave;
+ p->fpstate = FPinactive;
+ }
+ splx(s);
}
/*
--- a/sys/src/9/kw/fns.h
+++ b/sys/src/9/kw/fns.h
@@ -99,8 +99,6 @@
extern void fpuprocrestore(Proc*);
extern void fpuprocsave(Proc*);
extern void fpusysprocsetup(Proc*);
-extern void fpusysrfork(Ureg*);
-extern void fpusysrforkchild(Proc*, Ureg *, Proc*);
extern int fpuemu(Ureg*);
/*
--- a/sys/src/9/kw/softfpu.c
+++ b/sys/src/9/kw/softfpu.c
@@ -42,27 +42,6 @@
}
void
-fpusysrfork(Ureg*)
-{- /*
- * Called early in the non-interruptible path of
- * sysrfork() via the machine-dependent syscall() routine.
- * Save the state so that it can be easily copied
- * to the child process later.
- */
-}
-
-void
-fpusysrforkchild(Proc*, Ureg*, Proc*)
-{- /*
- * Called later in sysrfork() via the machine-dependent
- * sysrforkchild() routine.
- * Copy the parent FPU state to the child.
- */
-}
-
-void
fpuprocsave(Proc*)
{/*
--- a/sys/src/9/kw/syscall.c
+++ b/sys/src/9/kw/syscall.c
@@ -201,8 +201,6 @@
scallnr = ureg->r0;
up->scallnr = scallnr;
- if(scallnr == RFORK)
- fpusysrfork(ureg);
spllo();
sp = ureg->sp;
@@ -332,6 +330,4 @@
/* Things from bottom of syscall which were never executed */
p->psstate = 0;
p->insyscall = 0;
-
- fpusysrforkchild(p, cureg, up);
}
--- a/sys/src/9/omap/arch.c
+++ b/sys/src/9/omap/arch.c
@@ -134,6 +134,8 @@
{p->kentry = up->kentry;
p->pcycles = -p->kentry;
+
+ fpuprocfork(p);
}
/*
--- a/sys/src/9/omap/fns.h
+++ b/sys/src/9/omap/fns.h
@@ -114,8 +114,7 @@
extern void fpuprocrestore(Proc*);
extern void fpuprocsave(Proc*);
extern void fpusysprocsetup(Proc*);
-extern void fpusysrfork(Ureg*);
-extern void fpusysrforkchild(Proc*, Ureg*, Proc*);
+extern void fpuprocfork(Proc*);
extern int fpuemu(Ureg*);
/*
--- a/sys/src/9/omap/softfpu.c
+++ b/sys/src/9/omap/softfpu.c
@@ -42,27 +42,6 @@
}
void
-fpusysrfork(Ureg*)
-{- /*
- * Called early in the non-interruptible path of
- * sysrfork() via the machine-dependent syscall() routine.
- * Save the state so that it can be easily copied
- * to the child process later.
- */
-}
-
-void
-fpusysrforkchild(Proc*, Ureg *, Proc*)
-{- /*
- * Called later in sysrfork() via the machine-dependent
- * sysrforkchild() routine.
- * Copy the parent FPU state to the child.
- */
-}
-
-void
fpuprocsave(Proc*)
{/*
@@ -82,6 +61,15 @@
* 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.
*/
}
--- a/sys/src/9/omap/syscall.c
+++ b/sys/src/9/omap/syscall.c
@@ -205,8 +205,6 @@
scallnr = ureg->r0;
up->scallnr = scallnr;
- if(scallnr == RFORK)
- fpusysrfork(ureg);
spllo();
sp = ureg->sp;
@@ -328,6 +326,4 @@
/* Things from bottom of syscall which were never executed */
p->psstate = 0;
p->insyscall = 0;
-
- fpusysrforkchild(p, cureg, up);
}
--- a/sys/src/9/ppc/trap.c
+++ b/sys/src/9/ppc/trap.c
@@ -633,10 +633,6 @@
scallnr = ureg->r3;
up->scallnr = ureg->r3;
- if(scallnr == RFORK && up->fpstate == FPactive){- fpsave(&up->fpsave);
- up->fpstate = FPinactive;
- }
spllo();
sp = ureg->usp;
@@ -714,6 +710,12 @@
if(up->nnote == 0)
return 0;
+ if(up->fpstate == FPactive){+ fpsave(&up->fpsave);
+ up->fpstate = FPinactive;
+ }
+ up->fpstate |= FPillegal;
+
s = spllo();
qlock(&up->debug);
up->notepending = 0;
@@ -742,12 +744,6 @@
qunlock(&up->debug);
pexit(n->msg, n->flag!=NDebug);
}
-
- if(up->fpstate == FPactive){- fpsave(&up->fpsave);
- up->fpstate = FPinactive;
- }
- up->fpstate |= FPillegal;
sp = ur->usp & ~(BY2V-1);
sp -= sizeof(Ureg);
--- a/sys/src/9/teg2/fns.h
+++ b/sys/src/9/teg2/fns.h
@@ -172,8 +172,6 @@
extern void fpuprocrestore(Proc*);
extern void fpuprocsave(Proc*);
extern void fpusysprocsetup(Proc*);
-extern void fpusysrfork(Ureg*);
-extern void fpusysrforkchild(Proc*, Ureg*, Proc*);
extern int fpuemu(Ureg*);
/*
--- a/sys/src/9/teg2/softfpu.c
+++ b/sys/src/9/teg2/softfpu.c
@@ -42,27 +42,6 @@
}
void
-fpusysrfork(Ureg*)
-{- /*
- * Called early in the non-interruptible path of
- * sysrfork() via the machine-dependent syscall() routine.
- * Save the state so that it can be easily copied
- * to the child process later.
- */
-}
-
-void
-fpusysrforkchild(Proc*, Ureg *, Proc*)
-{- /*
- * Called later in sysrfork() via the machine-dependent
- * sysrforkchild() routine.
- * Copy the parent FPU state to the child.
- */
-}
-
-void
fpuprocsave(Proc*)
{/*
--- a/sys/src/9/teg2/syscall.c
+++ b/sys/src/9/teg2/syscall.c
@@ -209,8 +209,6 @@
scallnr = ureg->r0;
up->scallnr = scallnr;
- if(scallnr == RFORK)
- fpusysrfork(ureg);
spllo();
sp = ureg->sp;
@@ -361,6 +359,4 @@
/* Things from bottom of syscall which were never executed */
p->psstate = 0;
p->insyscall = 0;
-
- fpusysrforkchild(p, cureg, up);
}
--- a/sys/src/9/teg2/vfp3.c
+++ b/sys/src/9/teg2/vfp3.c
@@ -239,33 +239,6 @@
up->fpstate &= ~FPillegal;
}
-/*
- * Called early in the non-interruptible path of
- * sysrfork() via the machine-dependent syscall() routine.
- * Save the state so that it can be easily copied
- * to the child process later.
- */
-void
-fpusysrfork(Ureg*)
-{- if(up->fpstate == FPactive){- fpsave(&up->fpsave);
- up->fpstate = FPinactive;
- }
-}
-
-/*
- * Called later in sysrfork() via the machine-dependent
- * sysrforkchild() routine.
- * Copy the parent FPU state to the child.
- */
-void
-fpusysrforkchild(Proc *p, Ureg *, Proc *up)
-{- /* don't penalize the child, it hasn't done FP in a note handler. */
- p->fpstate = up->fpstate & ~FPillegal;
-}
-
/* should only be called if p->fpstate == FPactive */
void
fpsave(FPsave *fps)
--
⑨