M carrera/trap.c => carrera/trap.c +11 -0
@@ 681,3 681,14 @@ setregisters(Ureg *xp, char *pureg, char *uva, int n)
memmove(pureg, uva, n);
xp->status = status;
}
+
+/* Give enough context in the ureg to produce a kernel stack for
+ * a sleeping process
+ */
+void
+setkernur(Ureg *xp, Proc *p)
+{
+ xp->pc = p->sched.pc;
+ xp->sp = p->sched.sp;
+ xp->r31 = (ulong)sched;
+}
M pc/trap.c => pc/trap.c +10 -0
@@ 591,3 591,13 @@ setregisters(Ureg *xp, char *pureg, char *uva, int n)
xp->cs = cs;
xp->ss = ss;
}
+
+/* Give enough context in the ureg to produce a kernel stack for
+ * a sleeping process
+ */
+void
+setkernur(Ureg *xp, Proc *p)
+{
+ xp->pc = p->sched.pc;
+ xp->sp = p->sched.sp;
+}
M port/cache.c => port/cache.c +1 -0
@@ 555,6 555,7 @@ cwrite(Chan* c, uchar *buf, int len, ulong offset)
m->list = e;
else
p->next = e;
+
if(tail != 0)
tail->next = f;
}
M port/devproc.c => port/devproc.c +1 -3
@@ 350,9 350,7 @@ procread(Chan *c, void *va, long n, ulong offset)
case Qkregs:
memset(&kur, 0, sizeof(Ureg));
- kur.pc = p->sched.pc;
- kur.sp = p->sched.sp;
- kur.r31 = (ulong)sched;
+ setkernur(&kur, p);
rptr = (uchar*)&kur;
rsize = sizeof(Ureg);
goto regread;
M port/portfns.h => port/portfns.h +1 -0
@@ 230,6 230,7 @@ long seconds(void);
ulong segattach(Proc*, ulong, char *, ulong, ulong);
void segpage(Segment*, Page*);
int setcolor(ulong, ulong, ulong, ulong);
+void setkernur(Ureg*, Proc*);
int setlabel(Label*);
void setregisters(Ureg*, char*, char*, int);
void setswapchan(Chan*);
M power/trap.c => power/trap.c +11 -0
@@ 647,3 647,14 @@ setregisters(Ureg *xp, char *pureg, char *uva, int n)
memmove(pureg, uva, n);
xp->status = status;
}
+
+/* Give enough context in the ureg to produce a kernel stack for
+ * a sleeping process
+ */
+void
+setkernur(Ureg *xp, Proc *p)
+{
+ xp->pc = p->sched.pc;
+ xp->sp = p->sched.sp;
+ xp->r31 = (ulong)sched;
+}