From de0851f7cf3e76ad75abe1eb7c5281591d87a56a Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Fri, 22 Oct 1993 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1993-10-22 --- carrera/trap.c | 11 +++++++++++ pc/trap.c | 10 ++++++++++ port/cache.c | 1 + port/devproc.c | 4 +--- port/portfns.h | 1 + power/trap.c | 11 +++++++++++ 6 files changed, 35 insertions(+), 3 deletions(-) diff --git a/carrera/trap.c b/carrera/trap.c index 1c7a1e159e6757615d260bf1c552ef5bc90acafb..84250fb056d2da4dbffd3225166ea8bd9d2d2431 100644 --- a/carrera/trap.c +++ b/carrera/trap.c @@ -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; +} diff --git a/pc/trap.c b/pc/trap.c index ddbc73e940ce145952f72cbe4ce05443ab4e8282..aeb8d43e6ee17ab89b90a709da658d3ebc769c87 100644 --- a/pc/trap.c +++ b/pc/trap.c @@ -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; +} diff --git a/port/cache.c b/port/cache.c index d3dc9f7a4e160adc3144810e213676f00727c858..fb65b3a36c8f75d3300f160f9a85e38c6b880ddf 100644 --- a/port/cache.c +++ b/port/cache.c @@ -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; } diff --git a/port/devproc.c b/port/devproc.c index 33a52def7f1fc362c922c869ae9c3e9e60e81b31..93b0ed1a74e3dce2241c97962dd70ceed39667a4 100644 --- a/port/devproc.c +++ b/port/devproc.c @@ -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; diff --git a/port/portfns.h b/port/portfns.h index 7ac65db57d346da3d465ec2364c58b6b39842d94..beea71666ee8463da8d3a8744190c14c8b2830a7 100644 --- a/port/portfns.h +++ b/port/portfns.h @@ -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*); diff --git a/power/trap.c b/power/trap.c index f2a8d668d49f30642bc63ec0794fc0139164b54d..2a06c77877356cb452b37f60f0fd2a2bb284dbee 100644 --- a/power/trap.c +++ b/power/trap.c @@ -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; +}