shithub: drawcpu

Download patch

ref: a25a94e8f04e1d852c4ac2e8924f243e2fb70cbb
parent: 6ca7a7fcb03e0ef651368e5a782b29c392e16149
author: halfwit <michaelmisch1985@gmail.com>
date: Fri Jan 9 09:32:49 EST 2026

Build out more of the proc space

--- a/kern/dat.h
+++ b/kern/dat.h
@@ -485,7 +485,7 @@
 	Ureg    *noteureg;
 	Ureg    *dbgreg;
 
-
+	int		hang;
 	Chan	*slash;
 	Chan	*dot;
 
--- a/kern/devproc.c
+++ b/kern/devproc.c
@@ -309,6 +309,38 @@
 }
 
 static int
+readfd1(Chan *c, Proc *p, char *buf, int nbuf)
+{
+	Fgrp *fg;
+	int n, i;
+
+	fg = p->fgrp;
+	if(fg == nil || p->dot == nil || p->pid != PID(c->qid))
+		return 0;
+
+	if(c->nrock == 0){
+		c->nrock = 1;
+		return snprint(buf, nbuf, "%s\n", p->dot->path->s);
+	}
+
+	lock(fg);
+	n = 0;
+	for(;;){
+		i = c->nrock-1;
+		if(i < 0 || i > fg->maxfd)
+			break;
+		c->nrock++;
+		if(fg->fd[i] != nil){
+			n = procfdprint(fg->fd[i], i, buf, nbuf);
+			break;
+		}
+	}
+	unlock(fg);
+
+	return n;
+}
+
+static int
 readns1(Chan *c, Proc *p, char *buf, int nbuf)
 {
 	Pgrp *pg;
@@ -468,7 +500,7 @@
 	case Qnotepg:
 		if(p->kp || omode != OWRITE)
 			error(Eperm); 
-		//pid = p->noteid;
+		pid = p->noteid;
 		break;
 
 	case Qprofile:
@@ -680,8 +712,8 @@
 		do {
 			if(QID(c->qid) == Qns)
 				j = readns1(c, p, statbuf, sizeof(statbuf));
-	//		else
-	//			j = readfd1(c, p, statbuf, sizeof(statbuf));
+			else
+				j = readfd1(c, p, statbuf, sizeof(statbuf));
 			if(j == 0)
 				break;
 			c->mrock += j;
@@ -710,24 +742,24 @@
 		break;
 
 	case Qnote:
-	//	if(n < 1)	/* must accept at least the '\0' */
-	//		error(Etoosmall);
-	//	if(p->nnote == 0)
-	//		n = 0;
-	//	else {
-	//		assert(p->note[0] != nil);
-	//		i = strlen(p->note[0]->msg) + 1;
-	//		if(i < n)
-	//			n = i;
-	//		memmove(va, p->note[0]->msg, n-1);
-	//		((char*)va)[n-1] = '\0';
-	//		freenote(p->note[0]);
-	//		if(--p->nnote == 0)
-	//			p->notepending = 0;
-	//		else
-	//			memmove(&p->note[0], &p->note[1], p->nnote*sizeof(Note*));
-	//		p->note[p->nnote] = nil;
-	//	}
+		if(n < 1)	/* must accept at least the '\0' */
+			error(Etoosmall);
+		if(p->nnote == 0)
+			n = 0;
+		else {
+			assert(p->note[0] != nil);
+			i = strlen(p->note[0]->msg) + 1;
+			if(i < n)
+				n = i;
+			memmove(va, p->note[0]->msg, n-1);
+			((char*)va)[n-1] = '\0';
+			freenote(p->note[0]);
+			if(--p->nnote == 0)
+				p->notepending = 0;
+			else
+				memmove(&p->note[0], &p->note[1], p->nnote*sizeof(Note*));
+			p->note[p->nnote] = nil;
+		}
 		break;
 
 	default:
@@ -758,7 +790,7 @@
 			error(Etoobig);
 		memmove(buf, va, n);
 		buf[n] = 0;
-	//	postnotepg(NOTEID(c->qid), buf, NUser);
+		postnotepg(NOTEID(c->qid), buf, NUser);
 		return n;
 	}
 
@@ -777,9 +809,7 @@
 			error(Etoobig);
 		memmove(buf, va, n);
 		buf[n] = 0;
-	//	kstrdup(&p->args, buf);
-	//	p->nargs = 0;
-	//	p->setargs = 1;
+		kstrdup(&p->arg, buf);
 		break;
 
 	case Qctl:
@@ -800,7 +830,7 @@
 			error(Etoobig);
 		memmove(buf, va, n);
 		buf[n] = 0;
-	//	changenoteid(p, atoi(buf));
+		p->noteid = atoi(buf);
 		break;
 
 	default:
@@ -818,18 +848,22 @@
 void
 killproc(Proc *p, int ctl)
 {
-	int new;
+	static Note killnote = {
+		"sys: killed",
+		NExit,
+		1,
+	};
 
-	if(p->pid == 0 || p->kp)
+	if(p->state <= New || p->pid == 0 || p->kp)
 		return;
+	//if(p->state == Broken){
+	//	unbreak(p);
+	//	return;
+	//}
 	if(ctl != 0)
 		p->procctl = ctl;
-	// 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;
+	incref(&killnote.ref);
+	pushnote(p, &killnote);
 	//if(p->state == Stopped)
 	//	ready(p);
 }
@@ -915,7 +949,32 @@
 	return devstat(c, db, n, nil, 0, procgen);
 }
 
+static void
+changenoteid(Proc *p, ulong noteid)
+{
+	Proc *pp;
+	int i;
 
+	if(noteid <= 0)
+		error(Ebadarg);
+	if(noteid == p->noteid)
+		return;
+	if(noteid == p->pid){
+		p->noteid = noteid;
+		return;
+	}
+	for(i = 0; (pp = proctab(i)) != nil; i++){
+		if(pp->noteid != noteid || pp->kp)
+			continue;
+		if(strcmp(pp->user, p->user) == 0){
+			nonone(pp);
+			p->noteid = noteid;
+			return;
+		}
+	}
+	error(Eperm);
+}
+
 static void
 procctlreq(Proc *p, char *va, int n)
 {
@@ -943,18 +1002,17 @@
 		procctlclosefiles(p, 1, 0);
 		break;
 	case CMhang:
-	//	p->hang = 1;
+		p->hang = 1;
 		break;
 	case CMkill:
-	//	killproc(p, Proc_exitme);
+		killproc(p, Proc_exitme);
 		break;
 	case CMnohang:
-	//	p->hang = 0;
+		p->hang = 0;
 		break;
 	case CMnoswap:
-	//	p->noswap = 1;
+		error(Enoswap);
 		break;
-// TODO: procpriority --> osprocpriority call
 	case CMpri:
 	//	pri = atoi(cb->f[1]);
 	//	if(pri > PriNormal && !iseve())
@@ -1008,11 +1066,11 @@
 		//procstopwait(p, Proc_traceme);
 		break;
 	case CMstartsyscall:
-		//if(p->state != Stopped)
-		//	error(Ebadctl);
-		//p->procctl = Proc_tracesyscall;
+		if(p->state != Stopped)
+			error(Ebadctl);
+		p->procctl = Proc_tracesyscall;
 		//ready(p);
-		//procstopwait(p, Proc_tracesyscall);
+		procstopwait(p, Proc_tracesyscall);
 		break;
 	case CMstop:
 		procstopwait(p, Proc_stopme);
@@ -1033,13 +1091,13 @@
 	//	}
 		break;
 	case CMinterrupt:
-	//	procinterrupt(p);
+		procinterrupt(p);
 		break;
 	case CMnointerrupt:
-	//	if(p->nnote == 0)
-	//		p->notepending = 0;
-	//	else
-	//		error("notes pending");
+		if(p->nnote == 0)
+			p->notepending = 0;
+		else
+			error("notes pending");
 		break;
 	}
 
@@ -1059,47 +1117,42 @@
 {
 	Segment *s;
 	int i;
-
+/*
 	qlock(&p->seglock);
 	if(waserror()) {
-		qunlock(&p->seglock);
+		qunlock(&p->rw);
 		nexterror();
 	}
 	if(p->pid != PID(c->qid))
 		error(Eprocdied);
-	//s = seg(p, offset, 1);
-	//if(s == nil)
-	//	error(Ebadarg);
-	//if(waserror()){
-	//	qunlock(s);
-	//	nexterror();
-	//}
-	//for(i = 0; i < NSEG; i++) {
-	//	if(p->seg[i] == s)
-	//		break;
-	//}
-	//if(i == NSEG)
-	//	error(Egreg);	/* segment gone */
-	//if(!read && (s->type&SG_TYPE) == SG_TEXT) {
-	//	p->seg[i] = txt2data(s);
-	//	qunlock(s);
-	//	putseg(s);
-	//	s = p->seg[i];
-	//} else {
-	//	qunlock(s);
-	//}
-	//poperror();
-	//incref(s);		/* for us while we copy */
+	s = seg(p, offset, 1);
+	if(s == nil)
+		error(Ebadarg);
+	if(waserror()){
+		qunlock(&s->rw);
+		nexterror();
+	}
+	if(!read && (s->type&SG_TYPE) == SG_TEXT) {
+		p->seg[i] = txt2data(s);
+		qunlock(&s->qlock);
+		putseg(s);
+		s = p->seg[i];
+	} else {
+		qunlock(s);
+	}
+	poperror();
+	incref(&s->ref);		// for us while we copy 
 	qunlock(&p->seglock);
 	poperror();
 
-	//if(waserror()) {
-	//	putseg(s);
-	//	nexterror();
-	//}
-	//offset -= s->start;
-	//putseg(s);
-	//poperror(); 
+	if(waserror()) {
+		putseg(s);
+		nexterror();
+	}
+	offset -= s->start;
+	putseg(s);
+	poperror(); 
+	*/
 	return n;
 }
 
--- a/kern/error.c
+++ b/kern/error.c
@@ -13,6 +13,7 @@
 char Ebadchar[] = "bad character in file name";
 char Efilename[] = "file name syntax";
 char Eperm[] = "permission denied";
+char Enoswap[] = "unable to toggle swap on Drawcpu";
 char Ebadusefd[] = "inappropriate use of fd";
 char Ebadarg[] = "bad arg in system call";
 char Einuse[] = "device or object already in use";
--- a/kern/fns.h
+++ b/kern/fns.h
@@ -74,6 +74,7 @@
 void		free(void*);
 void		freeb(Block*);
 void		freeblist(Block*);
+void        freenote(Note*);
 void        freesegs(void);
 uintptr		getmalloctag(void*);
 uintptr		getrealloctag(void*);
@@ -153,6 +154,7 @@
 Pgrp*		pgrptab(int);
 #define		poperror()		up->nerrlab--
 int		    postnote(Proc*, int, char*, int);
+void        postnotepg(ulong, char*, int);
 int	        pprint(char*, ...);
 int		    procfdprint(Chan*, int, char*, int);
 void		procinit0(void);
@@ -162,6 +164,7 @@
 int		    pullblock(Block**, int);
 Block*		pullupblock(Block*, int);
 Block*		pullupqueue(Queue*, int);
+int         pushnote(Proc*, Note*);
 void		putmhead(Mhead*);
 void		putstr(char*);
 void		putstrn(char*, int);
--- a/kern/postnote.c
+++ b/kern/postnote.c
@@ -71,7 +71,7 @@
 	return n;
 }
 
-static int
+int
 pushnote(Proc *p, Note *n)
 {
 	if(p->state <= New || p->state == Broken || p->pid == 0){
@@ -107,4 +107,25 @@
 		qunlock(&p->debug);
 
 	return ret;
+}
+
+void
+postnotepg(ulong noteid, char *msg, int flag)
+{
+	Note *n;
+	Proc *p;
+	int i;
+
+	n = mknote(msg, flag);
+	for(i = 0; (p = proctab(i)) != nil; i++){
+		if(p == up || p->noteid != noteid || p->kp)
+			continue;
+		qlock(&p->debug);
+		if(p->noteid == noteid && !p->kp){
+			incref(n);
+			pushnote(p, n);
+		}
+		qunlock(&p->debug);
+	}
+	freenote(n);
 }
--- a/kern/seg.c
+++ b/kern/seg.c
@@ -4,6 +4,24 @@
 #include "fns.h"
 
 Segment *
+seg(Proc *p, uintptr offset, int unused)
+{ 
+	USED(unused);
+
+	Segment *s;
+	int i;
+	for(i = 0; i < NSEG; i++){
+		s = up->seg[i];
+		qlock(&s->rw);
+		print("start %ul, end %ul, offset %ul", s->start, s->start + s->size, offset);
+		if(s->start <= offset && s->start + s->size >= offset)
+			return s;
+		qunlock(&s->rw);
+	}
+	return nil;
+}
+
+Segment *
 newseg(u32int start, u32int size, int idx)
 {
 	Segment *s;
--