M port/devproc.c => port/devproc.c +15 -4
@@ 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;
M port/portfns.h => port/portfns.h +1 -0
@@ 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*);
M power/dat.h => power/dat.h +1 -1
@@ 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;
M power/fns.h => power/fns.h +0 -1
@@ 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*);
M power/trap.c => power/trap.c +2 -2
@@ 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)
M ss/clock.c => ss/clock.c +1 -2
@@ 67,8 67,7 @@ clock(Ureg *ur)
}
if((ur->psr&PSRPSUPER) == 0){
/* *(ulong*)(USTKTOP-BY2WD) += TK2MS(1); /**/
- if(u->nnote)
- notify(ur);
+ notify(ur);
}
}
}
M ss/dat.h => ss/dat.h +1 -0
@@ 174,6 174,7 @@ struct User
Note lastnote;
int (*notify)(void*, char*);
void *ureg;
+ void *dbgreg; /* User registers for debugging in proc */
};
/*
M ss/trap.c => ss/trap.c +16 -9
@@ 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");
+}