ref: 0a0c16460f953250153a4f12d4b6cb267c34a377
parent: 830f663db481f4566d0da79d2c29069d1e38a36d
author: halfwit <michaelmisch1985@gmail.com>
date: Wed Jan 7 12:21:28 EST 2026
Update to use a unified note handling mechanism, call actual wstat
--- a/kern/dat.h
+++ b/kern/dat.h
@@ -439,7 +439,6 @@
uint mach;
ulong pid;
- ulong noteid;
ulong procmode;
Pgrp *pgrp; /* Process group for namespace */
@@ -477,20 +476,16 @@
u32int FPSR;
double F[Nfpregs];
- /* Notes */
+ /* Note handling */
Note *lastnote;
Note *note[NNOTE];
short nnote;
- //short notified; /* sysnoted is due */
- //int (*notify)(void*, char*);
+ short notified; /* sysnoted is due */
+ int (*notify)(void*, char*);
+ Ureg *noteureg;
+ Ureg *dbgreg;
- u32int notehandler;
- int innote;
- jmp_buf notejmp;
- char notes[ERRMAX][NNOTE];
- long notein, noteout;
-
Chan *slash;
Chan *dot;
@@ -497,6 +492,7 @@
Proc *qnext;
Proc *parent;
Proc *child;
+ ulong noteid; /* Equivalent of note group */
int nchild;
int procctl;
@@ -506,8 +502,6 @@
char oproc[1024]; /* reserved for os */
u32int R[16]; /* general purpose registers / PC (R15) */
- Ureg *ureg;
- Ureg *dbgreg;
Segment *seg[NSEG];
QLock seglock;
};
--- a/kern/devproc.c
+++ b/kern/devproc.c
@@ -547,7 +547,7 @@
return readnum(offset, va, n, p->pid, NUMSIZE);
case Qnoteid:
- return readnum(offset, va, n, p->notein, NUMSIZE);
+ return readnum(offset, va, n, p->noteid, NUMSIZE);
case Qppid:
if(!p->parent)
@@ -824,11 +824,12 @@
return;
if(ctl != 0)
p->procctl = ctl;
- new = up->notein + 1;
- if((new - up->noteout) % NNOTE == 0)
- return;
- strncpy(up->notes[up->notein % NNOTE], "sys: killed", ERRMAX - 1);
- up->notein = new;
+ // No, fix this.
+ //new = up->nnote + 1;
+ //if((new - up->noteout) % NNOTE == 0)
+ // return;
+ //strncpy(up->notes[up->notein % NNOTE], "sys: killed", ERRMAX - 1);
+ //up->notein = new;
//if(p->state == Stopped)
// ready(p);
}
--- a/kern/fns.h
+++ b/kern/fns.h
@@ -1,6 +1,5 @@
#define ROUND(s, sz) (((s)+(sz-1))&~(sz-1))
-void addnote(char*);
Block* adjustblock(Block*, int);
Block* allocb(int);
int blocklen(Block*);
@@ -56,7 +55,6 @@
Walkqid* devwalk(Chan*, Chan*, char**, int, Dirtab*, int, Devgen*);
int devwstat(Chan*, uchar*, int);
Dir* dirchanstat(Chan*);
-void donote(char *, ulong);
void dump(void);
Fgrp* dupfgrp(Fgrp*);
Segment* dupseg(Segment**, int, int);
--- a/kern/postnote.c
+++ b/kern/postnote.c
@@ -1,34 +1,72 @@
-#include <u.h>
-#include <signal.h>
-#include <libc.h>
+#include "u.h"
+#include "lib.h"
+#include "dat.h"
+#include "fns.h"
+#include "error.h"
-extern int _p9strsig(char*);
-
-int
-postnote(int who, int pid, char *msg)
+void
+freenote(Note *n)
{- int sig;
+ if(n == nil || decref(&n->ref))
+ return;
+ free(n);
+}
- sig = _p9strsig(msg);
- if(sig == 0){- werrstr("unknown note");- return -1;
+void
+freenotes(Proc *p)
+{+ while(p->nnote > 0){+ freenote(p->note[--p->nnote]);
+ up->note[p->nnote] = nil;
}
+}
- if(pid <= 0){- werrstr("bad pid in postnote");- return -1;
- }
+static Note*
+mknote(char *msg, int flag)
+{+ Note *n;
- switch(who){- default:
- werrstr("bad who in postnote");- return -1;
- case PNPROC:
- return kill(pid, sig);
- case PNGROUP:
- if((pid = getpgid(pid)) < 0)
- return -1;
- return killpg(pid, sig);
+ n = smalloc(sizeof(Note));
+ kstrcpy(n->msg, msg, ERRMAX);
+ n->flag = flag;
+ n->ref.ref = 1;
+ return n;
+}
+
+static int
+pushnote(Proc *p, Note *n)
+{+ if(p->state <= New || p->state == Broken || p->pid == 0){+ freenote(n);
+ return 0;
}
+ assert(n->ref.ref > 0);
+ if(n->flag != NUser && (p->notify == nil || p->notified))
+ freenotes(p);
+ if(p->nnote < NNOTE){+ p->note[p->nnote++] = n;
+ procinterrupt(p);
+ return 1;
+ }
+ freenote(n);
+ return 0;
+}
+
+int
+postnote(Proc *p, int dolock, char *msg, int flag)
+{+ Note *n;
+ int ret;
+
+ if(p == nil)
+ return 0;
+
+ n = mknote(msg, flag);
+ if(dolock)
+ qlock(&p->debug);
+ ret = pushnote(p, n);
+ if(dolock)
+ qunlock(&p->debug);
+
+ return ret;
}
--- a/kern/procinit.c
+++ b/kern/procinit.c
@@ -14,6 +14,7 @@
p->rgrp = newrgrp();
p->pgrp = newpgrp();
p->egrp = newegrp();
+ p->kp = 1;
_setproc(p);
up->slash = namec("#/", Atodir, 0, 0);--- a/kern/syscall.c
+++ b/kern/syscall.c
@@ -395,13 +395,18 @@
static void
_sysnotify(void)
{- u32int handler;
+ u32int ft;
+ Segment *s;
+ int (*f)(void*, char*);
+
#ifdef DSYSCALL
print("sysnotify: pid=%d\n", up->pid);#endif
- handler = arg(0);
- up->notehandler = handler;
+ ft = arg(0);
+ f = vaddr(ft, 0, &s);
+ up->notify = f;
up->R[0] = 0;
+ segunlock(s);
}
static void
@@ -408,15 +413,34 @@
_sysnoted(void)
{u32int v;
-
+ // TODO: Move to Ureg structure outright
+
v = arg(0);
#ifdef DSYSCALL
print("sysnoted: pid=%d\n", up->pid);#endif
- if(up->innote)
- longjmp(up->notejmp, v + 1);
- cherrstr("the front fell off");- up->R[0] = -1;
+
+ switch(v){+ case NCONT: /* Resume at point where notified */
+ case NRSTR: /* Restore from NSAVE point*/
+ /* word under Ureg is old ureg */
+ //up->noteureg = *(Ureg**)((uintptr)nureg-8);
+ /* wet floor */
+ case NSAVE: /* Set save point to return to */
+ //if(noted(up->dbgreg, nureg, arg)){+ // pprint("suicide: trap in noted\n");+ // pexit("Suicide", 0);+ //}
+ break;
+ default:
+ up->lastnote->flag = NDebug;
+ /* fall through */
+ case NDFLT: /* Perform default action */
+ //noted(up->dbgreg, nureg, v); /* for debugging */
+ if(up->lastnote->flag == NDebug)
+ pprint("suicide: %s\n", up->lastnote->msg);+ pexit(up->lastnote->msg, up->lastnote->flag!=NDebug);
+ }
}
static void
@@ -878,7 +902,7 @@
[ERRSTR] = _syserrstr,
[STAT] = _sysstat,
[FSTAT] = _sysfstat,
- [WSTAT] = _sysfwstat,
+ [WSTAT] = _syswstat,
[FWSTAT] = _sysfwstat,
[MOUNT] = _sysmount,
[AWAIT] = _sysawait,
--- a/kern/sysproc.c
+++ b/kern/sysproc.c
@@ -129,67 +129,34 @@
return NULL;
}
-void
-addnote(char *msg)
+static void
+donote(void)
{- int new;
-
- new = up->notein + 1;
- if((new - up->noteout) % NNOTE == 0)
- return;
+ Note *n;
+ char msg[ERRMAX];
- strncpy(up->notes[up->notein % NNOTE], msg, ERRMAX - 1);
- up->notein = new;
-}
+ if(up->nnote == 0)
+ return;
-void
-donote(char *msg, ulong type)
-{- int rc;
- u32int *ureg, *sp, uregp, msgp;
- char *msgb;
+ n = up->note[0];
+ strncpy(msg, n->msg, ERRMAX-1);
+ msg[ERRMAX-1] = 0;
- if(up->notehandler == 0)
- exits(msg);
+ memmove(up->note, up->note+1, (up->nnote-1)*sizeof(Note));
+ up->nnote--;
- clrex();
- uregp = up->R[13] - 18 * 4;
- ureg = vaddrnol(uregp, 18 * 4);
- memcpy(ureg, up->R, 15 * 4);
- ureg[15] = type;
- ureg[16] = up->CPSR;
- ureg[17] = up->R[15];
- up->R[13] = uregp;
- msgp = up->R[13] -= ERRMAX;
- msgb = vaddrnol(msgp, ERRMAX);
- strncpy(msgb, msg, ERRMAX);
- up->R[13] -= 3 * 4;
- sp = vaddrnol(up->R[13], 3 * 4);
- sp[0] = 0;
- sp[2] = msgp;
- up->R[0] = uregp;
- up->R[15] = up->notehandler;
- up->innote = 1;
- switch(rc = setjmp(up->notejmp) - 1) {- case -1:
- for(;;) {-#ifdef DREGS
- dump();
-#endif
- step();
- }
- case NDFLT:
- exits(msg);
- case NCONT:
- break;
- default:
- panic("unhandled noted argument %d", rc);+ up->notepending = (up->nnote > 0);
+
+ if(up->notify == nil){+ /* Default action: die on interrupt, ignore others */
+ if(strncmp(msg, "interrupt", 9) == 0)
+ pexit(msg, 1);
+ return;
}
- up->innote = 0;
- ureg = vaddrnol(uregp, 18 * 4); /* just to be sure */
- memcpy(up->R, ureg, 15 * 4);
- up->CPSR = ureg[16];
- up->R[15] = ureg[17];
+
+ /* Call user handler */
+ (*up->notify)(up, msg);
+
}
static void
@@ -313,8 +280,6 @@
copyname(file);
- // TODO: Notes.
- up->notehandler = up->innote = up->notein = up->noteout = 0;
freesegs();
memset(up->R, 0, sizeof(up->R));
up->CPSR = 0;
@@ -355,11 +320,9 @@
#ifdef DREGS
dump();
#endif
+ if(up->notepending)
+ donote();
step();
- while((up->notein - up->noteout) % NNOTE) {- donote(up->notes[up->noteout % NNOTE], 0);
- up->noteout++;
- }
}
}
@@ -416,8 +379,7 @@
}
if(flag & RFNOTEG){qlock(&up->debug);
- // TODO: Notegroups
- //setnoteid(up, 0); /* can't error() with 0 argument */
+ up->noteid = 0;
qunlock(&up->debug);
}
return 0;
@@ -430,15 +392,14 @@
strecpy(p->text, p->text+sizeof p->text, up->text);
p->kp = 0;
- /* TODO: Notes */
- //p->nnote = 0;
- //p->notify = up->notify;
- //p->notified = 0;
- //p->notepending = 0;
- //p->lastnote = nil;
+ p->nnote = 0;
+ p->notify = up->notify;
+ p->notified = 0;
+ p->notepending = 0;
+ p->lastnote = nil;
- //if((flag & RFNOTEG) == 0)
- // p->noteid = up->noteid;
+ if((flag & RFNOTEG) == 0)
+ p->noteid = up->noteid;
/* Copy regs over */
for(i = 1; i <= 15; i++)
@@ -447,10 +408,6 @@
p->CPSR = up->CPSR;
p->FPSR = up->FPSR;
- //strcpy(&p->args, "");
- //p->nargs = 0;
- //p->setargs = 0;
-
if(up->procctl == Proc_tracesyscall)
p->procctl = Proc_tracesyscall;
@@ -529,6 +486,5 @@
}
osproc(p);
- up->child = p;
return p->pid;
}
--- a/main.c
+++ b/main.c
@@ -57,7 +57,6 @@
if(strncmp(note, "emu:", 4) == 0)
exits(note);
- addnote(note);
return;
}
--
⑨