~kris/9p

9hist

b9d1887753998ed4f7feeb52ea2af19e696cd03c — David du Colombier 34 years ago d80a9f4
Plan 9 from Bell Labs 1991-11-11
8 files changed, 37 insertions(+), 19 deletions(-)

M port/devproc.c
M port/portfns.h
M power/dat.h
M power/fns.h
M power/trap.c
M ss/clock.c
M ss/dat.h
M ss/trap.c
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");
}