summaryrefslogtreecommitdiff
path: root/sys/src/9/pc64/trap.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2019-09-08 19:02:01 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2019-09-08 19:02:01 +0200
commit62eec43340340fa981340e4b521908b40b84b782 (patch)
treea1139b52ca33fd09c4d632ab3f39756ef1da650e /sys/src/9/pc64/trap.c
parent6ad06b36b2a61ce20cb6a6e4c5fd15ec8ac142f8 (diff)
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).
Diffstat (limited to 'sys/src/9/pc64/trap.c')
-rw-r--r--sys/src/9/pc64/trap.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/sys/src/9/pc64/trap.c b/sys/src/9/pc64/trap.c
index 0f6eed294..7fc8b55fa 100644
--- a/sys/src/9/pc64/trap.c
+++ b/sys/src/9/pc64/trap.c
@@ -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);
}