shithub: drawcpu

Download patch

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;
 }
 
--