From b9d1887753998ed4f7feeb52ea2af19e696cd03c Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Mon, 11 Nov 1991 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1991-11-11 --- port/devproc.c | 19 +++++++++++++++---- port/portfns.h | 1 + power/dat.h | 2 +- power/fns.h | 1 - power/trap.c | 4 ++-- ss/clock.c | 3 +-- ss/dat.h | 1 + ss/trap.c | 25 ++++++++++++++++--------- 8 files changed, 37 insertions(+), 19 deletions(-) diff --git a/port/devproc.c b/port/devproc.c index f71bb4a1d74cbba46130f132ad6c4f306ac409b5..a7fefbf75de6285630986a7d90da4ab91332a9a4 100644 --- a/port/devproc.c +++ b/port/devproc.c @@ -306,6 +306,8 @@ procread(Chan *c, void *va, long n, ulong offset) memmove(&up->note[0], &up->note[1], up->nnote*sizeof(Note)); n = ERRLEN; } + if(up->nnote == 0) + p->notepending = 0; kunmap(k); poperror(); unlock(&p->debug); @@ -365,6 +367,7 @@ procwrite(Chan *c, void *va, long n, ulong offset) User *pxu; Page *pg; char *a = va, *b; + ulong hi; if(c->qid.path & CHDIR) error(Eisdir); @@ -397,15 +400,23 @@ procwrite(Chan *c, void *va, long n, ulong offset) k = kmap(pg); b = (char*)VA(k); pxu = (User*)b; - if(offset < (ulong)pxu->dbgreg || offset+n >= (ulong)pxu->dbgreg+sizeof(Ureg)) { + hi = offset+n; + /* Check for floating point registers */ + if(offset >= (ulong)&u->fpsave && hi <= (ulong)&u->fpsave+sizeof(FPsave)){ + memmove(b+(offset-USERADDR), a, n); + break; + } + /* Check user register set for process at kernel entry */ + ur = pxu->dbgreg; + if(offset < (ulong)ur || hi > (ulong)ur+sizeof(Ureg)) { kunmap(k); errors("bad u-area address"); } - ur = (Ureg*)(b+((ulong)pxu->dbgreg-USERADDR)); - setregisters(ur, (char*)pxu+(offset-USERADDR), a, n); + ur = (Ureg*)(b+((ulong)ur-USERADDR)); + setregisters(ur, b+(offset-USERADDR), a, n); kunmap(k); } - else + else /* Try user memory segments */ n = procctlmemio(p, offset, n, va, 0); break; diff --git a/port/portfns.h b/port/portfns.h index 17f6e34c599f870ef0552e0a76eed577a2d736c0..8c21a29ac7830ae91b22ae5a816e5aa811ddfafe 100644 --- a/port/portfns.h +++ b/port/portfns.h @@ -203,6 +203,7 @@ ulong segattach(Proc*, ulong, char *, ulong, ulong); void segpage(Segment*, Page*); int setcolor(ulong, ulong, ulong, ulong); int setlabel(Label*); +void setregisters(Ureg*, char*, char*, int); void setswapchan(Chan*); void simpleputpage(Page*); char* skipslash(char*); diff --git a/power/dat.h b/power/dat.h index 8b0cca27cb0554ea132b0060863cb901248cc40c..438d7907d4b9e86f484a85a75134fb0edae4aea1 100644 --- a/power/dat.h +++ b/power/dat.h @@ -213,10 +213,10 @@ struct struct User { Proc *p; + FPsave fpsave; /* address of this is known by db */ int nerrlab; Label errlab[NERR]; char error[ERRLEN]; - FPsave fpsave; /* address of this is known by db */ char elem[NAMELEN]; /* last name element from namec */ Chan *slash; Chan *dot; diff --git a/power/fns.h b/power/fns.h index 089383b90be81f838509e53284feafe7b4007b3c..6d9749bc80ad53ec1061839ea2be0fe4ef483d11 100644 --- a/power/fns.h +++ b/power/fns.h @@ -55,7 +55,6 @@ int readlog(ulong, char*, ulong); void restfpregs(FPsave*, ulong); #define screenputs void setvmevec(int, void (*)(int)); -void setregisters(Ureg*, char*, char*, int); void sinit(void); uchar* smap(int, uchar*); void sunmap(int, uchar*); diff --git a/power/trap.c b/power/trap.c index 37c0b6334e8045e0bdc6267ce9817e2ba049e645..79d69c0cd2b3013aef43f9818df42d396e83d28e 100644 --- a/power/trap.c +++ b/power/trap.c @@ -566,8 +566,8 @@ setvmevec(int v, void (*f)(int)) vmevec[v] = f; } -/* This routine must save the values of registers the user is not permitted to write from devproc - * and the restore them before returning +/* This routine must save the values of registers the user is not permitted to write + * from devproc and the restore the saved values before returning */ void setregisters(Ureg *xp, char *pureg, char *uva, int n) diff --git a/ss/clock.c b/ss/clock.c index d66bf8ce76810b01f4261026cd0c7130e1624e58..0ed0eae6786144248552367ff19d710f3d70d362 100644 --- a/ss/clock.c +++ b/ss/clock.c @@ -67,8 +67,7 @@ clock(Ureg *ur) } if((ur->psr&PSRPSUPER) == 0){ /* *(ulong*)(USTKTOP-BY2WD) += TK2MS(1); /**/ - if(u->nnote) - notify(ur); + notify(ur); } } } diff --git a/ss/dat.h b/ss/dat.h index 04d5961903a8276812d9937fb6b503ef7f6be21c..5bf244c7ccab8f5480def5080dd58caea64a7ed7 100644 --- a/ss/dat.h +++ b/ss/dat.h @@ -174,6 +174,7 @@ struct User Note lastnote; int (*notify)(void*, char*); void *ureg; + void *dbgreg; /* User registers for debugging in proc */ }; /* diff --git a/ss/trap.c b/ss/trap.c index d58cec59c186e6f9eef9f2eeb1deb2356866c628..cfe85e2087c18e9e903bd44482836d723948fbc6 100644 --- a/ss/trap.c +++ b/ss/trap.c @@ -121,6 +121,7 @@ trap(Ureg *ur) default: break; } + Error: if(user){ spllo(); sprint(buf, "sys: trap: pc=0x%lux %s", ur->pc, excname(tbr)); @@ -128,7 +129,6 @@ trap(Ureg *ur) sprint(buf+strlen(buf), " FSR %lux", u->fpsave.fsr); postnote(u->p, 1, buf, NDebug); }else{ - Error: print("kernel trap: %s pc=0x%lux\n", excname(tbr), ur->pc); dumpregs(ur); for(;;); @@ -136,10 +136,7 @@ trap(Ureg *ur) } Return: if(user) { - if(u->p->procctl) - procctl(u->p); - if(u->nnote) - notify(ur); + notify(ur); if(u->p->fpstate == FPinactive) { restfpregs(&u->fpsave); u->p->fpstate = FPactive; @@ -219,6 +216,10 @@ notify(Ureg *ur) { ulong sp; + if(u->p->procctl) + procctl(u->p); + if(u->nnote == 0) + return; lock(&u->p->debug); u->p->notepending = 0; if(u->nnote==0){ @@ -345,9 +346,6 @@ syscall(Ureg *aur) } spllo(); - if(u->p->procctl) - procctl(u->p); - r7 = ur->r7; sp = ur->usp; @@ -382,7 +380,7 @@ syscall(Ureg *aur) u->p->psstate = 0; if(r7 == NOTED) /* ugly hack */ noted(&aur, *(ulong*)(sp+1*BY2WD)); /* doesn't return */ - if(u->nnote && r7!=FORK){ + if(u->p->procctl || (u->nnote && r7!=FORK)){ ur->r7 = ret; notify(ur); } @@ -394,3 +392,12 @@ execpc(ulong entry) { ((Ureg*)UREGADDR)->pc = entry - 4; /* syscall advances it */ } + +/* This routine must save the values of registers the user is not permitted + * to write from devproc and restore them before returning + */ +void +setregisters(Ureg *xp, char *pureg, char *uva, int n) +{ + print("setregisters: no idea\n"); +}