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
--
⑨