shithub: n900

Download patch

ref: 2ceb1b254eeb3e4c4f530c64c74e2fcedd53058b
parent: e5e153803e3a361c15bd907917b06c56581921dd
author: mia soweli <mia@soweli.net>
date: Sun Aug 3 17:10:34 EDT 2025

trap: call fpukenter() and fpukexit()

--- a/sys/src/9/omap/fns.h
+++ b/sys/src/9/omap/fns.h
@@ -77,6 +77,7 @@
 void fpsave(FPsave *);
 void fprestore(FPsave *);
 
+void fpuinit(void);
 void fpukenter(Ureg *u);
 void fpukexit(Ureg *u);
 void fpuprocfork(Proc *p);
@@ -83,4 +84,4 @@
 void fpuprocsave(Proc *p);
 void fpuprocsetup(Proc *p);
 void fpuprocrestore(Proc *p);
-
+void mathtrap(Ureg *u);
--- a/sys/src/9/omap/main.c
+++ b/sys/src/9/omap/main.c
@@ -165,6 +165,9 @@
 	sp = (char**)(USTKTOP - sizeof(Tos) - 8 - sizeof(sp[0])*4);
 	sp[3] = sp[2] = sp[1] = nil;
 	strcpy(sp[0] = (char*)&sp[4], "boot");
+
+	splhi();
+	fpukexit(nil);
 	touser(sp);
 }
 
@@ -183,6 +186,7 @@
 
 	xinit();
 	trapinit();
+	fpuinit();
 	intrinit();
 	timerinit();
 	timersinit();
--- a/sys/src/9/omap/trap.c
+++ b/sys/src/9/omap/trap.c
@@ -266,30 +266,6 @@
 }
 
 static void
-trapfpu(void)
-{
-	int s;
-
-	switch(up->fpstate) {
-	case FPinit:
-		s = splhi();
-		fpinit(); up->fpstate = FPactive;
-		splx(s);
-		break;
-
-	case FPinactive:
-		s = splhi();
-		fprestore(up->fpsave); up->fpstate = FPactive;
-		splx(s);
-		break;
-
-	case FPactive:
-		postnote(up, 1, "sys: floating point error", NDebug);
-		break;
-	}
-}
-
-static void
 traparm(Ureg *ureg, ulong fsr, uintptr far)
 {
 	int user;
@@ -346,9 +322,11 @@
 trap(Ureg *ureg)
 {
 	int user;
+	int math;
 	u32int op, cp;
 
 	user = kenter(ureg);
+	math = 0;
 	switch(ureg->type) {
 	case PsrMfiq:
 	case PsrMirq:
@@ -358,6 +336,7 @@
 
 	case PsrMiabt:
 		ureg->pc -= 4;
+		fpukenter(ureg);
 		traparm(ureg, getifsr(), getifar());
 		break;
 
@@ -369,6 +348,7 @@
 			goto out;
 		}
 
+		fpukenter(ureg);
 		traparm(ureg, getdfsr(), getdfar());
 		break;
 
@@ -381,20 +361,24 @@
 				if((op & 0x0f000000) == 0x0e000000 || (op & 0x0e000000) == 0x0c000000) {
 					cp = op >> 8 & 15;
 					if(cp == 10 || cp == 11) {
-						fpukenter(ureg);
+						math = 1;
+						mathtrap(ureg);
 						break;
 					}
 				}
 			}
-				
+			
+			fpukenter(ureg);
 			postnote(up, 1, "sys: trap: invalid opcode", NDebug);
 			break;
 		}
 
+		fpukenter(ureg);
 		panic("invalid opcode at pc=%#.8lux lr=%#.8lux", ureg->pc, ureg->r14);
 		break;
 
 	default:
+		fpukenter(ureg);
 		panic("unknown trap at pc=%#.8lux lr=%#.8lux", ureg->pc, ureg->r14);
 		break;
 	}
@@ -407,6 +391,9 @@
 
 		kexit(ureg);
 	}
+
+	if(!math)
+		fpukexit(ureg);
 }
 
 void
@@ -414,6 +401,7 @@
 {
 	if(!kenter(ureg))
 		panic("syscall: from kernel: pc=%#.8lux", ureg->pc);
+	fpukenter(ureg);
 
 	dosyscall(ureg->r0, (Sargs*)(ureg->sp + BY2WD), &ureg->r0);
 	if(up->procctl || up->nnote)
@@ -422,6 +410,7 @@
 		sched();
 
 	kexit(ureg);
+	fpukexit(ureg);
 }
 
 int
--