summaryrefslogtreecommitdiff
path: root/sys/src/9/mtx
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2022-08-17 15:21:22 +0000
committercinap_lenrek <cinap_lenrek@felloff.net>2022-08-17 15:21:22 +0000
commitc8e25d2a18c0395431abc5818a1d2f0561b0181f (patch)
treea087f5850d7374b5cfd624244237e97b7937d5fe /sys/src/9/mtx
parent7828ffb8a486e188b61394436a434e8cae4fd487 (diff)
kernel: simplify notify() adding common popnote() function
Handlin notes is common for all architectures except how the note has to be pushed on the user stack. This change adds a popnote() function that returns only the note string or nil if the process should not be notified (no notes or user notes hold off). Popnote() also handles common errors like notify during note handling or missing note handler and will suicide the process in that case.
Diffstat (limited to 'sys/src/9/mtx')
-rw-r--r--sys/src/9/mtx/trap.c33
1 files changed, 4 insertions, 29 deletions
diff --git a/sys/src/9/mtx/trap.c b/sys/src/9/mtx/trap.c
index 962401dd4..8e97dc7f6 100644
--- a/sys/src/9/mtx/trap.c
+++ b/sys/src/9/mtx/trap.c
@@ -677,9 +677,8 @@ syscall(Ureg* ureg)
int
notify(Ureg* ur)
{
- int l;
ulong s, sp;
- Note *n;
+ char *msg;
if(up->procctl)
procctl();
@@ -688,32 +687,13 @@ notify(Ureg* ur)
s = spllo();
qlock(&up->debug);
- up->notepending = 0;
- n = &up->note[0];
- if(strncmp(n->msg, "sys:", 4) == 0){
- l = strlen(n->msg);
- if(l > ERRMAX-15) /* " pc=0x12345678\0" */
- l = ERRMAX-15;
- sprint(n->msg+l, " pc=0x%.8lux", ur->pc);
- }
-
- if(n->flag!=NUser && (up->notified || up->notify==0)){
- qunlock(&up->debug);
- if(n->flag == NDebug)
- pprint("suicide: %s\n", n->msg);
- pexit(n->msg, n->flag!=NDebug);
- }
-
- if(up->notified) {
+ msg = popnote(ur);
+ if(msg == nil){
qunlock(&up->debug);
splhi();
return 0;
}
- if(!up->notify) {
- qunlock(&up->debug);
- pexit(n->msg, n->flag!=NDebug);
- }
sp = ur->usp & ~(BY2V-1);
sp -= sizeof(Ureg);
@@ -728,7 +708,7 @@ notify(Ureg* ur)
*(Ureg**)(sp-BY2WD) = up->ureg; /* word under Ureg is old up->ureg */
up->ureg = (void*)sp;
sp -= BY2WD+ERRMAX;
- memmove((char*)sp, up->note[0].msg, ERRMAX);
+ memmove((char*)sp, msg, ERRMAX);
sp -= 3*BY2WD;
*(ulong*)(sp+2*BY2WD) = sp+3*BY2WD; /* arg 2 is string */
ur->r1 = (long)up->ureg; /* arg 1 is ureg* */
@@ -736,11 +716,6 @@ notify(Ureg* ur)
((ulong*)sp)[0] = 0; /* arg 0 is pc */
ur->usp = sp;
ur->pc = (ulong)up->notify;
- up->notified = 1;
- up->nnote--;
- memmove(&up->lastnote, &up->note[0], sizeof(Note));
- memmove(&up->note[0], &up->note[1], up->nnote*sizeof(Note));
-
qunlock(&up->debug);
splx(s);
return 1;