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).
This commit is contained in:
cinap_lenrek 2019-09-08 19:02:01 +02:00
parent 6ad06b36b2
commit 62eec43340
2 changed files with 6 additions and 1 deletions

View file

@ -877,8 +877,10 @@ notify(Ureg* ureg)
if(n->flag!=NUser && (up->notified || up->notify==0)){ if(n->flag!=NUser && (up->notified || up->notify==0)){
qunlock(&up->debug); qunlock(&up->debug);
if(n->flag == NDebug) if(n->flag == NDebug){
up->fpstate &= ~FPillegal;
pprint("suicide: %s\n", n->msg); pprint("suicide: %s\n", n->msg);
}
pexit(n->msg, n->flag!=NDebug); pexit(n->msg, n->flag!=NDebug);
} }
@ -901,6 +903,7 @@ if(0) print("%s %lud: notify %#p %#p %#p %s\n",
if(!okaddr((uintptr)up->notify, 1, 0) if(!okaddr((uintptr)up->notify, 1, 0)
|| !okaddr(sp-ERRMAX-4*BY2WD, sizeof(Ureg)+ERRMAX+4*BY2WD, 1)){ || !okaddr(sp-ERRMAX-4*BY2WD, sizeof(Ureg)+ERRMAX+4*BY2WD, 1)){
qunlock(&up->debug); qunlock(&up->debug);
up->fpstate &= ~FPillegal;
pprint("suicide: bad address in notify\n"); pprint("suicide: bad address in notify\n");
pexit("Suicide", 0); pexit("Suicide", 0);
} }

View file

@ -1094,6 +1094,7 @@ pexit(char *exitstr, int freemem)
Chan *dot; Chan *dot;
void (*pt)(Proc*, int, vlong); void (*pt)(Proc*, int, vlong);
up->fpstate &= ~FPillegal;
up->alarm = 0; up->alarm = 0;
timerdel(up); timerdel(up);
pt = proctrace; pt = proctrace;
@ -1466,6 +1467,7 @@ procctl(void)
switch(up->procctl) { switch(up->procctl) {
case Proc_exitbig: case Proc_exitbig:
spllo(); spllo();
up->fpstate &= ~FPillegal;
pprint("Killed: Insufficient physical memory\n"); pprint("Killed: Insufficient physical memory\n");
pexit("Killed: Insufficient physical memory", 1); pexit("Killed: Insufficient physical memory", 1);