M carrera/dat.h => carrera/dat.h +11 -4
@@ 87,6 87,13 @@ struct Notsave
#define NCALLBACK 32
+typedef struct Callbk Callbk;
+struct Callbk
+{
+ void (*func)(void*);
+ void* arg;
+};
+
/* First FOUR members offsets known by l.s */
struct Mach
{
@@ 114,10 121,10 @@ struct Mach
Schedq hiq;
Schedq loq;
- void (**cbin)(void);
- void (**cbout)(void);
- void (**cbend)(void);
- void (*calls[NCALLBACK])(void);
+ Callbk* cbin;
+ Callbk* cbout;
+ Callbk* cbend;
+ Callbk calls[NCALLBACK];
int pfault;
int cs;
M carrera/fns.h => carrera/fns.h +1 -1
@@ 122,7 122,7 @@ void hnputs(void*, ushort v);
ulong nhgetl(void*);
ushort nhgets(void*);
-void ifwrite(void*, Block*);
+void ifwrite(void*, Block*, int);
void* ifinit(int);
void ifjab(void);
ulong ifaddr(void*);
M port/devmouse.c => port/devmouse.c +1 -0
@@ 313,6 313,7 @@ mousewrite(Chan *c, void *va, long n, ulong offset)
Point pt;
char buf[64];
+ USED(offset);
p = va;
switch(c->qid.path){
case CHDIR:
M port/portdat.h => port/portdat.h +1 -1
@@ 580,7 580,7 @@ struct Proc
/* statistics */
ulong counter[Pcounter]; /* specialized per process counters */
ulong syscall[NSYSCALL];
-
+ulong qpc;
/*
* machine specific MMU
*/
M port/portfns.h => port/portfns.h +1 -1
@@ 16,7 16,7 @@ void buzz(int, int);
void cachedel(Image*, ulong);
void cachepage(Page*, Image*);
void callbacks(void);
-int newcallback(void (*)(void));
+void newcallback(void (*)(void*), void*);
int cangetc(void*);
int canlock(Lock*);
int canpage(Proc*);
M port/proc.c => port/proc.c +15 -14
@@ 107,29 107,30 @@ anyready(void)
return m->hiq.head != 0 || m->loq.head != 0;
}
-int
-newcallback(void (*func)(void))
+void
+newcallback(void (*func)(void*), void *a)
{
- *m->cbin = func;
+ Callbk *c;
+
+ c = m->cbin;
if(++m->cbin >= m->cbend)
m->cbin = m->calls;
- if(m->hiq.head == 0 && m->loq.head == 0)
- return 1;
-
- return 0;
+ c->func = func;
+ c->arg = a;
}
void
callbacks(void)
{
- void (*func)(void);
+ Callbk *c;
while(m->cbin != m->cbout) {
- func = *m->cbout;
+ c = m->cbout;
if(++m->cbout >= m->cbend)
m->cbout = m->calls;
- func();
+
+ c->func(c->arg);
}
}
@@ 710,9 711,9 @@ procdump(void)
s = p->psstate;
if(s == 0)
s = "kproc";
- print("%3d:%10s pc %8lux %8s (%s) ut %ld st %ld bss %lux\n",
+ print("%3d:%10s pc %8lux %8s (%s) q %lux ut %ld st %ld bss %lux\n",
p->pid, p->text, p->pc, s, statename[p->state],
- p->time[0], p->time[1], bss);
+ p->qpc, p->time[0], p->time[1], bss);
}
}
@@ 843,7 844,7 @@ killbig(void)
if(p->state == Dead || p->kp)
continue;
l = 0;
- for(i=1; i<NSEG; i++){
+ for(i=1; i<NSEG; i++) {
s = p->seg[i];
if(s)
l += s->top - s->base;
@@ 853,7 854,7 @@ killbig(void)
max = l;
}
}
- print("%d: %s killed because no swap configured", kp->pid, kp->text);
+ print("%d: %s killed because no swap configured\n", kp->pid, kp->text);
kp->procctl = Proc_exitme;
postnote(kp, 1, "killed: proc too big", NExit);
}
M port/qlock.c => port/qlock.c +2 -1
@@ 10,7 10,7 @@ qlock(QLock *q)
{
Proc *p, *mp;
-if(up==0) { iprint("QLOCK at ilevel PC=%lux\n", getcallerpc(0)); for(;;); }
+up->qpc = getcallerpc(0);
lock(&q->use);
if(!q->locked) {
@@ 34,6 34,7 @@ if(up==0) { iprint("QLOCK at ilevel PC=%lux\n", getcallerpc(0)); for(;;); }
int
canqlock(QLock *q)
{
+up->qpc = getcallerpc(0);
if(!canlock(&q->use))
return 0;
if(q->locked){