pc64: fix mistake fpurestore() mistake

cannot just reenable the fpu in FPactive case as we might have
been procsaved() an rescheduled on another cpu. what was i thinking...
thanks qu7uux for reproducing the problem.
This commit is contained in:
cinap_lenrek 2017-11-14 00:16:21 +01:00
parent f4880742fd
commit 753f64a877

View file

@ -712,20 +712,25 @@ int
fpusave(void) fpusave(void)
{ {
int ostate = up->fpstate; int ostate = up->fpstate;
if((up->fpstate & ~(FPnouser|FPkernel|FPindexm)) == FPactive) if((ostate & ~(FPnouser|FPkernel|FPindexm)) == FPactive)
_stts(); _stts();
up->fpstate = FPpush | (up->fpstate & ~FPillegal); up->fpstate = FPpush | (ostate & ~FPillegal);
return ostate; return ostate;
} }
void void
fpurestore(int ostate) fpurestore(int ostate)
{ {
if((up->fpstate & ~(FPnouser|FPkernel|FPindexm)) == FPactive) int astate = up->fpstate;
if((astate & ~(FPnouser|FPkernel|FPindexm)) == FPactive)
_stts(); _stts();
if((ostate & FPindexm) == (up->fpstate & FPindexm)){ if((astate & FPindexm) == (ostate & FPindexm)){
if((ostate & ~(FPnouser|FPkernel|FPindexm)) == FPactive) if((ostate & ~(FPnouser|FPkernel|FPindexm)) == FPactive){
if((astate & ~(FPpush|FPnouser|FPkernel|FPindexm)) != FPactive)
goto saved;
_clts(); _clts();
}
} else { } else {
saved:
up->fpsave = up->fpslot[ostate>>FPindexs]; up->fpsave = up->fpslot[ostate>>FPindexs];
ostate = FPinactive | (ostate & (FPillegal|FPpush|FPnouser|FPkernel|FPindexm)); ostate = FPinactive | (ostate & (FPillegal|FPpush|FPnouser|FPkernel|FPindexm));
} }