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