shithub: riscv

Download patch

ref: 435a9a150ea5d3eae891503be0224ea9c9d29bab
parent: 859d5c9146a31c65c538ce799ed3eccd30e1e78d
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Thu Nov 16 18:15:08 EST 2017

9pc64: handle special case in fpurestore() for procexec()/procsetup()

when a process does an exec, it calls procsetup() which
unconditionally sets the sets the TS flag and fpstate=FPinit
and fpurestore() should not revert the fpstate.

--- a/sys/src/9/pc64/main.c
+++ b/sys/src/9/pc64/main.c
@@ -721,16 +721,14 @@
 fpurestore(int ostate)
 {
 	int astate = up->fpstate;
-	if((astate & ~(FPnouser|FPkernel|FPindexm)) == FPactive)
-		_stts();
-	if((astate & FPindexm) == (ostate & FPindexm)){
-		if((ostate & ~(FPnouser|FPkernel|FPindexm)) == FPactive){
-			if((astate & ~(FPpush|FPnouser|FPkernel|FPindexm)) != FPactive)
-				goto saved;
+	if(astate == (FPpush | (ostate & ~FPillegal))){
+		if((ostate & ~(FPnouser|FPkernel|FPindexm)) == FPactive)
 			_clts();
-		}
 	} else {
-	saved:
+		if(astate == FPinit)	/* don't restore on procexec()/procsetup() */
+			return;
+		if((astate & ~(FPnouser|FPkernel|FPindexm)) == FPactive)
+			_stts();
 		up->fpsave = up->fpslot[ostate>>FPindexs];
 		ostate = FPinactive | (ostate & (FPillegal|FPpush|FPnouser|FPkernel|FPindexm));
 	}