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)){
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(0) print("%s %lud: notify %#p %#p %#p %s\n",
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);
}

View file

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