~kris/9p

9hist

58f1fd5a79ce9468ed1adecf2d0beed5abe72c00 — David du Colombier 35 years ago d7bc960
Plan 9 from Bell Labs 1991-06-19
5 files changed, 61 insertions(+), 31 deletions(-)

M pc/l.s
M port/devbit.c
M port/fault.c
M port/portfns.h
M port/sysproc.c
M pc/l.s => pc/l.s +43 -18
@@ 1,6 1,6 @@

/*
 * Boot first processor
 *  boot first processor
 */
TEXT	start(SB),$0



@@ 9,6 9,9 @@ TEXT	start(SB),$0
	/* never returns */


/*
 *  trap vector, each instruction is 4 bytes long
 */
TEXT	traptab(SB),$0

	CALL	noerrcode(SB)	/* divide */


@@ 270,23 273,45 @@ TEXT	traptab(SB),$0
	CALL	noerrcode(SB)

TEXT	noerrcode(SB),$0
	PUSH	EAX
	/* drop through */

	PUSHL	EAX
	MOVL	4(ESP),EAX
/*	JMP	george /**/

TEXT	errcode(SB),$0
	PUSH	EAX
	PUSH	EBX
	PUSH	ECX
	PUSH	EDX
	PUSH	EBP
	PUSH	ESI
	PUSH	EDI

	XCHGL	(ESP),EAX
	/* fall through */

TEXT	saveregs(SB),$0

george:
	PUSHL	EBX
	MOVL	$noerrcode(SB),EBX	/* calculate trap number */
	SUBL	EAX,EBX			/* ... */
	SHRL	$1,EBX			/* ... */
	PUSHL	ECX
	PUSHL	EDX
	PUSHL	EBP
	PUSHL	ESI
	PUSHL	EDI
	PUSHL	EBX			/* save trap number */
	CALL	trap(SB)
	POP	EDI
	POP	ESI
	POP	EBP
	POP	EDX
	POP	ECX
	POP	EBX
	POP	EAX
	ADD	$8,ESP	/* jump over error code + return addr */
	ADDL	$4,ESP			/* drop trap number */
	POPL	EDI
	POPL	ESI
	POPL	EBP
	POPL	EDX
	POPL	ECX
	POPL	EBX
	POPL	EAX
	ADDL	$4,ESP			/* drop error code */
	IRET

TEXT	trap(SB),$0

	RET

TEXT	main(SB),$0

	RET

M port/devbit.c => port/devbit.c +5 -3
@@ 1009,9 1009,11 @@ bitwrite(Chan *c, void *va, long n, ulong offset)
				error(Ebadblt);
			pt1.x = GLONG(p+1);
			pt1.y = GLONG(p+5);
			mouse.xy = pt1;
			mouse.track = 1;
			mouseclock();
			if(!eqpt(mouse.xy, pt1)){
				mouse.xy = pt1;
				mouse.track = 1;
				mouseclock();
			}
			m -= 9;
			p += 9;
			break;

M port/fault.c => port/fault.c +11 -8
@@ 264,7 264,7 @@ validaddr(ulong addr, ulong len, int write)
 * &s[0] is known to be a valid address.
 */
void*
vmemchr(void *s, int c, int n)
vmemchr(void *s, int c, ulong n)
{
	int m;
	char *t;


@@ 272,18 272,21 @@ vmemchr(void *s, int c, int n)

	a = (ulong)s;
	m = BY2PG - (a & (BY2PG-1));
	if(m < n){
		t = vmemchr(s, c, m);
	while(n){
		if(n < m)
			m = n;
		t = memchr(s, c, m);
		if(t)
			return t;
		if(n == m)
			return 0;
		if(!(a & KZERO))
			validaddr(a+m, 1, 0);
		return vmemchr((void*)(a+m), c, n-m);
		n -= m;
		a += m;
		m = BY2PG;
	}
	/*
	 * All in one page
	 */
	return memchr(s, c, n);
	return 0;
}

Seg*

M port/portfns.h => port/portfns.h +1 -1
@@ 187,6 187,6 @@ void	unusepage(Page*, int);
void	usepage(Page*, int);
void	userinit(void);
void	validaddr(ulong, ulong, int);
void*	vmemchr(void*, int, int);
void*	vmemchr(void*, int, ulong);
void	wakeme(Alarm*);
void	wakeup(Rendez*);

M port/sysproc.c => port/sysproc.c +1 -1
@@ 237,7 237,7 @@ sysexec(ulong *arg)
		if(((ulong)argp&(BY2PG-1)) < BY2WD)
			validaddr((ulong)argp, BY2WD, 0);
		validaddr((ulong)a, 1, 0);
		nbytes += (vmemchr(a, 0, 0xFFFFFFFF) - a) + 1;
		nbytes += (vmemchr(a, 0, ~0) - a) + 1;
		nargs++;
	}
	ssize = BY2WD*(nargs+1) + ((nbytes+(BY2WD-1)) & ~(BY2WD-1));