shithub: riscv

Download patch

ref: 62eec43340340fa981340e4b521908b40b84b782
parent: 6ad06b36b2a61ce20cb6a6e4c5fd15ec8ac142f8
author: cinap_lenrek <[email protected]>
date: Sun Sep 8 15:02:01 EDT 2019

kernel: clear FPillegal in pexit() and before pprint()

pexit() and pprint() can get called outside of a syscall
(from procctl()) with a process that is in active note
handling and require floating point in the kernel on amd64
for aesni (devtls).

--- a/sys/src/9/pc64/trap.c
+++ b/sys/src/9/pc64/trap.c
@@ -877,8 +877,10 @@
 
 	if(n->flag!=NUser && (up->notified || up->notify==0)){
 		qunlock(&up->debug);
-		if(n->flag == NDebug)
+		if(n->flag == NDebug){
+			up->fpstate &= ~FPillegal;
 			pprint("suicide: %s\n", n->msg);
+		}
 		pexit(n->msg, n->flag!=NDebug);
 	}
 
@@ -901,6 +903,7 @@
 	if(!okaddr((uintptr)up->notify, 1, 0)
 	|| !okaddr(sp-ERRMAX-4*BY2WD, sizeof(Ureg)+ERRMAX+4*BY2WD, 1)){
 		qunlock(&up->debug);
+		up->fpstate &= ~FPillegal;
 		pprint("suicide: bad address in notify\n");
 		pexit("Suicide", 0);
 	}
--- a/sys/src/9/port/proc.c
+++ b/sys/src/9/port/proc.c
@@ -1094,6 +1094,7 @@
 	Chan *dot;
 	void (*pt)(Proc*, int, vlong);
 
+	up->fpstate &= ~FPillegal;
 	up->alarm = 0;
 	timerdel(up);
 	pt = proctrace;
@@ -1466,6 +1467,7 @@
 	switch(up->procctl) {
 	case Proc_exitbig:
 		spllo();
+		up->fpstate &= ~FPillegal;
 		pprint("Killed: Insufficient physical memory\n");
 		pexit("Killed: Insufficient physical memory", 1);