From 435a9a150ea5d3eae891503be0224ea9c9d29bab Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Thu, 16 Nov 2017 23:15:08 +0100 Subject: [PATCH] 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. --- sys/src/9/pc64/main.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/sys/src/9/pc64/main.c b/sys/src/9/pc64/main.c index 458ff0c16..c6580c63d 100644 --- a/sys/src/9/pc64/main.c +++ b/sys/src/9/pc64/main.c @@ -721,16 +721,14 @@ void 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)); }