~kris/9p

9hist

8d14e26acff106daabec089207f5e472f8069f9f — David du Colombier 32 years ago 4fa1a84
Plan 9 from Bell Labs 1994-06-12
M carrera/dat.h => carrera/dat.h +3 -2
@@ 15,7 15,7 @@ typedef struct Ureg	Ureg;
/*
 *  parameters for sysproc.c
 */
#define AOUT_MAGIC	V_MAGIC
#define EXEC_MAGIC(magic)	(magic==V_MAGIC||magic==M_MAGIC)

/*
 *  machine dependent definitions used by ../port/dat.h


@@ 81,7 81,8 @@ struct PMMU
struct Notsave
{
	ulong	svstatus;
	ulong	svr1;
	long	svr1;
	long	svhr1;
};

#include "../port/portdat.h"

M carrera/fptrap.c => carrera/fptrap.c +1 -1
@@ 174,7 174,7 @@ fpunimp(ulong iw)
	return 0;
}

static ulong*
static long*
reg(Ureg *ur, int regno)
{
	/* regs go from R31 down in ureg, R29 is missing */

M carrera/l.s => carrera/l.s +93 -116
@@ 12,30 12,21 @@
/*
 *  R4000 instructions
 */
#define	LD(offset, base, rt)	WORD	$((067<<26)|((base)<<21)|((rt)<<16)|((offset)&0xFFFF))
#define	STD(rt, offset, base)	WORD	$((077<<26)|((base)<<21)|((rt)<<16)|((offset)&0xFFFF))
#define	DSLL(sa, rt, rd)	WORD	$(((rt)<<16)|((rd)<<11)|((sa)<<6)|070)
#define	DSRA(sa, rt, rd)	WORD	$(((rt)<<16)|((rd)<<11)|((sa)<<6)|073)
#define	LL(base, rt)		WORD	$((060<<26)|((base)<<21)|((rt)<<16))
#define	SC(base, rt)		WORD	$((070<<26)|((base)<<21)|((rt)<<16))

#define DBG(S)	CONST(0xa0001000, R20);CONST(S, R21);MOVW	R21,(R20)

/*
 * Boot first processor
 */
TEXT	start(SB), $-4

DBG(0x55aa0000)
	MOVW	$setR30(SB), R30
	MOVW	$(CU1|INTR7|INTR6|INTR5|INTR4|INTR3|INTR2|INTR1|INTR0), R1
	MOVW	R1, M(STATUS)
	WAIT
DBG(0x55aa0001)

	MOVW	$TLBROFF, R1
	MOVW	R1, M(WIRED)
DBG(0x55aa0002)

	MOVW	$((0x1C<<7)|(1<<24)), R1
	MOVW	R1, FCR31	/* permit only inexact and underflow */


@@ 57,19 48,14 @@ DBG(0x55aa0002)
	MOVD	F24, F18
	MOVD	F24, F20
	MOVD	F24, F22
DBG(0x55aa0003)

	MOVW	$MACHADDR, R(MACH)
	ADDU	$(BY2PG-4), R(MACH), SP
	MOVW	$0, R(USER)
DBG(0x55aa0010)
MOVW R(MACH),4(R20)
	MOVW	R0, 0(R(MACH))
DBG(0x55aa0011)

	MOVW	$edata(SB), R1
	MOVW	$end(SB), R2
DBG(0x55aa0004)

clrbss:
	MOVB	$0, (R1)


@@ 93,7 79,7 @@ TEXT	touser(SB), $-4
	MOVW	M(STATUS), R4
	WAIT
	AND	$(~KMODEMASK), R4
	OR	$(KUSER|EXL|IE), R4
	OR	$(KUSER|EXL|IE|UX), R4
	MOVW	R4, M(STATUS)
	WAIT
	MOVW	R1, SP


@@ 384,14 370,14 @@ wasuser:
	MOVW	8(R27), R26		/* R26 = m->proc */
	MOVW	8(R26), R27		/* R27 = m->proc->kstack */
	MOVW	SP, R26			/* save user sp */
	ADDU	$(KSTACK-UREGSIZE-2*BY2WD), R27, SP
	ADDU	$(KSTACK-UREGSIZE), R27, SP

	MOVW	R26, 0x10(SP)			/* user SP */
	MOVW	R31, 0x28(SP)
	MOVW	R30, 0x2C(SP)
	MOVW	R26, Ureg_sp(SP)	/* user SP */
	MOVV	R31, Ureg_r31(SP)
	MOVV	R30, Ureg_r30(SP)
	MOVW	M(CAUSE), R26
	MOVW	R(MACH), 0x3C(SP)
	MOVW	R(USER), 0x40(SP)
	MOVV	R(MACH), Ureg_r25(SP)
	MOVV	R(USER), Ureg_r24(SP)
	AND	$(EXCMASK<<2), R26
	SUBU	$(CSYS<<2), R26



@@ 407,13 393,13 @@ wasuser:
	JAL	syscall(SB)

sysrestore:
	MOVW	0x28(SP), R31
	MOVW	0x08(SP), R26
	MOVW	0x2C(SP), R30
	MOVV	Ureg_r31(SP), R31
	MOVW	Ureg_status(SP), R26
	MOVV	Ureg_r30(SP), R30
	MOVW	R26, M(STATUS)
	WAIT
	MOVW	0x0C(SP), R26		/* old pc */
	MOVW	0x10(SP), SP
	MOVW	Ureg_pc(SP), R26		/* old pc */
	MOVW	Ureg_sp(SP), SP
	MOVW	R26, M(EPC)
	ERET



@@ 421,25 407,28 @@ notsys:
	JAL	trap(SB)
restore:
	JAL	restregs(SB)
	MOVW	0x28(SP), R31
	MOVW	0x2C(SP), R30
	MOVW	0x3C(SP), R(MACH)
	MOVW	0x40(SP), R(USER)
	MOVW	0x10(SP), SP
	MOVV	Ureg_r31(SP), R31
	MOVV	Ureg_r30(SP), R30
	MOVV	Ureg_r25(SP), R(MACH)
	MOVV	Ureg_r24(SP), R(USER)
	MOVW	Ureg_sp(SP), SP
	MOVW	R26, M(EPC)
	ERET

waskernel:
	MOVW	$1, R26			/* not syscall */
	MOVW	SP, -(UREGSIZE-16)(SP)
	MOVW	SP, R26
	SUBU	$UREGSIZE, SP
	MOVW	R31, 0x28(SP)
	OR	$7, SP
	XOR	$7, SP
	MOVW	R26, Ureg_sp(SP)
	MOVV	R31, Ureg_r31(SP)
	MOVW	$1, R26			/* not syscall */
	JAL	saveregs(SB)
	MOVW	4(SP), R1		/* first arg for trap */
	JAL	trap(SB)
	JAL	restregs(SB)
	MOVW	0x28(SP), R31
	ADDU	$UREGSIZE, SP
	MOVV	Ureg_r31(SP), R31
	MOVW	Ureg_sp(SP), SP
	MOVW	R26, M(EPC)
	ERET



@@ 448,21 437,17 @@ TEXT	forkret(SB), $0
	JMP	sysrestore

TEXT	saveregs(SB), $-4
	MOVW	R1, 0x9C(SP)
	MOVW	R2, 0x98(SP)
	/* save R5, R6 as 64 bits */
	ADDU	$(UREGSIZE-16), SP, R1
	MOVW	$~7, R2			/* don't let him use R28 */
	AND		R2, R1
	STD		(5, 0,(1))
	STD		(6, 8,(1))
	ADDU	$8, SP, R1
	MOVW	R1, 0x04(SP)		/* arg to base of regs */
	MOVV	R1, Ureg_r1(SP)
	MOVV	R2, Ureg_r2(SP)
	MOVV	R5, Ureg_r5(SP)
	MOVV	R6, Ureg_r6(SP)
	ADDU	$Uoffset, SP, R1
	MOVW	R1, 4(SP)		/* arg to base of regs */
	MOVW	M(STATUS), R1
	MOVW	M(EPC), R2
	WAIT
	MOVW	R1, 0x08(SP)
	MOVW	R2, 0x0C(SP)
	MOVW	R1, Ureg_status(SP)
	MOVW	R2, Ureg_pc(SP)

	MOVW	$(~KMODEMASK),R2	/* don't let him use R28 */
	AND	R2, R1


@@ 473,88 458,80 @@ TEXT	saveregs(SB), $-4
	MOVW	M(CAUSE), R1
	MOVW	M(BADVADDR), R2
	NOOP
	MOVW	R1, 0x14(SP)
	MOVW	R1, Ureg_cause(SP)
	MOVW	M(TLBVIRT), R1
	NOOP
	MOVW	R2, 0x18(SP)
	MOVW	R1, 0x1C(SP)
	MOVW	HI, R1
	MOVW	LO, R2
	MOVW	R1, 0x20(SP)
	MOVW	R2, 0x24(SP)
	MOVW	R2, Ureg_badvaddr(SP)
	MOVW	R1, Ureg_tlbvirt(SP)

	MOVV	HI, R1
	MOVV	LO, R2
	MOVV	R1, Ureg_hi(SP)
	MOVV	R2, Ureg_lo(SP)
					/* LINK,SB,SP missing */
	MOVW	R28, 0x30(SP)
	MOVV	R28, Ureg_r28(SP)
					/* R27, R26 not saved */
					/* R25, R24 missing */
	MOVW	R23, 0x44(SP)
	MOVW	R22, 0x48(SP)
	MOVW	R21, 0x4C(SP)
	MOVW	R20, 0x50(SP)
	MOVW	R19, 0x54(SP)
	MOVW	R18, 0x58(SP)
	MOVW	R17, 0x5C(SP)
	MOVW	R16, 0x60(SP)
	MOVW	R15, 0x64(SP)
	MOVW	R14, 0x68(SP)
	MOVW	R13, 0x6C(SP)
	MOVW	R12, 0x70(SP)
	MOVW	R11, 0x74(SP)
	MOVW	R10, 0x78(SP)
	MOVW	R9, 0x7C(SP)
	MOVW	R8, 0x80(SP)
	MOVW	R7, 0x84(SP)
	MOVW	R6, 0x88(SP)
	MOVW	R5, 0x8C(SP)
	MOVW	R4, 0x90(SP)
	MOVW	R3, 0x94(SP)
	MOVV	R23, Ureg_r23(SP)
	MOVV	R22, Ureg_r22(SP)
	MOVV	R21, Ureg_r21(SP)
	MOVV	R20, Ureg_r20(SP)
	MOVV	R19, Ureg_r19(SP)
	MOVV	R18, Ureg_r18(SP)
	MOVV	R17, Ureg_r17(SP)
	MOVV	R16, Ureg_r16(SP)
	MOVV	R15, Ureg_r15(SP)
	MOVV	R14, Ureg_r14(SP)
	MOVV	R13, Ureg_r13(SP)
	MOVV	R12, Ureg_r12(SP)
	MOVV	R11, Ureg_r11(SP)
	MOVV	R10, Ureg_r10(SP)
	MOVV	R9, Ureg_r9(SP)
	MOVV	R8, Ureg_r8(SP)
	MOVV	R7, Ureg_r7(SP)
	MOVV	R6, Ureg_r6(SP)
	MOVV	R5, Ureg_r5(SP)
	MOVV	R4, Ureg_r4(SP)
	MOVV	R3, Ureg_r3(SP)
return:
	RET

TEXT	restregs(SB), $-4
					/* LINK,SB,SP missing */
	MOVW	0x30(SP), R28
	MOVV	Ureg_r28(SP), R28
					/* R27, R26 not saved */
					/* R25, R24 missing */
	MOVW	0x44(SP), R23
	MOVW	0x48(SP), R22
	MOVW	0x4C(SP), R21
	MOVW	0x50(SP), R20
	MOVW	0x54(SP), R19
	MOVW	0x58(SP), R18
	MOVW	0x5C(SP), R17
	MOVW	0x60(SP), R16
	MOVW	0x64(SP), R15
	MOVW	0x68(SP), R14
	MOVW	0x6C(SP), R13
	MOVW	0x70(SP), R12
	MOVW	0x74(SP), R11
	MOVW	0x78(SP), R10
	MOVW	0x7C(SP), R9
	MOVW	0x80(SP), R8
	MOVW	0x84(SP), R7
	/*
	 * restored below
	 * MOVW	0x88(SP), R6
	 * MOVW	0x8C(SP), R5
	 */
	MOVW	0x90(SP), R4
	MOVW	0x94(SP), R3
	MOVW	0x24(SP), R2
	MOVW	0x20(SP), R1
	MOVW	R2, LO
	MOVW	R1, HI
	/* restore 64-bit R5, R6 */
	ADDU	$(UREGSIZE-16), SP, R1
	MOVW	$~7, R2			/* don't let him use R28 */
	AND		R2, R1
	LD		(0,(1), 5)
	LD		(8,(1), 6)
	MOVW	0x08(SP), R1
	MOVW	0x98(SP), R2
	MOVV	Ureg_r23(SP), R23
	MOVV	Ureg_r22(SP), R22
	MOVV	Ureg_r21(SP), R21
	MOVV	Ureg_r20(SP), R20
	MOVV	Ureg_r19(SP), R19
	MOVV	Ureg_r18(SP), R18
	MOVV	Ureg_r17(SP), R17
	MOVV	Ureg_r16(SP), R16
	MOVV	Ureg_r15(SP), R15
	MOVV	Ureg_r14(SP), R14
	MOVV	Ureg_r13(SP), R13
	MOVV	Ureg_r12(SP), R12
	MOVV	Ureg_r11(SP), R11
	MOVV	Ureg_r10(SP), R10
	MOVV	Ureg_r9(SP), R9
	MOVV	Ureg_r8(SP), R8
	MOVV	Ureg_r7(SP), R7
	MOVV	Ureg_r6(SP), R6
	MOVV	Ureg_r5(SP), R5
	MOVV	Ureg_r4(SP), R4
	MOVV	Ureg_r3(SP), R3
	MOVV	Ureg_lo(SP), R2
	MOVV	Ureg_hi(SP), R1
	MOVV	R2, LO
	MOVV	R1, HI
	MOVW	Ureg_status(SP), R1
	MOVV	Ureg_r2(SP), R2
	MOVW	R1, M(STATUS)
	WAIT
	MOVW	0x9C(SP), R1
	MOVW	0x0C(SP), R26		/* old pc */
	MOVV	Ureg_r1(SP), R1
	MOVW	Ureg_pc(SP), R26
	RET

TEXT	rfnote(SB), $0

M carrera/main.c => carrera/main.c +0 -1
@@ 460,7 460,6 @@ procsave(Proc *p)
	USED(p);

	/* keep track of tlbfaults */
	up->counter[TLBCNTR] += m->tlbfault - m->otlbfault;
	m->otlbfault = m->tlbfault;
}


M carrera/mem.h => carrera/mem.h +48 -2
@@ 66,6 66,7 @@
#define ERL		0x00000004
#define KSUPER		0x00000008
#define KUSER		0x00000010
#define UX		0x00000020
#define INTMASK		0x0000ff00
#define INTR0		0x00000100
#define INTR1		0x00000200


@@ 98,11 99,56 @@
 * Fundamental addresses
 */
#define	MACHADDR	(KTZERO-MAXMACH*BY2PG)	/* warning: rdbg is near here */
/* Sizeof(Ureg)+R5,R6+16 bytes slop+retpc & ur */
#define	UREGSIZE	0xC0		
#define	MACHP(n)	((Mach *)(MACHADDR+(n)*BY2PG))

/*
 * offsets in ureg.h for l.s
 */
#define	Ureg_status	(Uoffset+0)
#define	Ureg_pc		(Uoffset+4)
#define	Ureg_sp		(Uoffset+8)
#define	Ureg_cause	(Uoffset+12)
#define	Ureg_badvaddr	(Uoffset+16)
#define	Ureg_tlbvirt	(Uoffset+20)

#define	Ureg_hi		(Uoffset+28-4)
#define	Ureg_lo		(Uoffset+36-4)
#define	Ureg_r31	(Uoffset+44-4)
#define	Ureg_r30	(Uoffset+52-4)
#define	Ureg_r28	(Uoffset+60-4)
#define	Ureg_r27	(Uoffset+68-4)
#define	Ureg_r26	(Uoffset+76-4)
#define	Ureg_r25	(Uoffset+84-4)
#define	Ureg_r24	(Uoffset+92-4)
#define	Ureg_r23	(Uoffset+100-4)
#define	Ureg_r22	(Uoffset+108-4)
#define	Ureg_r21	(Uoffset+116-4)
#define	Ureg_r20	(Uoffset+124-4)
#define	Ureg_r19	(Uoffset+132-4)
#define	Ureg_r18	(Uoffset+140-4)
#define	Ureg_r17	(Uoffset+148-4)
#define	Ureg_r16	(Uoffset+156-4)
#define	Ureg_r15	(Uoffset+164-4)
#define	Ureg_r14	(Uoffset+172-4)
#define	Ureg_r13	(Uoffset+180-4)
#define	Ureg_r12	(Uoffset+188-4)
#define	Ureg_r11	(Uoffset+196-4)
#define	Ureg_r10	(Uoffset+204-4)
#define	Ureg_r9		(Uoffset+212-4)
#define	Ureg_r8		(Uoffset+220-4)
#define	Ureg_r7		(Uoffset+228-4)
#define	Ureg_r6		(Uoffset+236-4)
#define	Ureg_r5		(Uoffset+244-4)
#define	Ureg_r4		(Uoffset+252-4)
#define	Ureg_r3		(Uoffset+260-4)
#define	Ureg_r2		(Uoffset+268-4)
#define	Ureg_r1		(Uoffset+276-4)

/* Sizeof(Ureg) + (R5,R6) + 16 bytes slop + retpc + ur */
#define	UREGSIZE	((Ureg_r1+8-Uoffset) + 16 + 16 + 4 + 4)
#define	Uoffset		8

/*
 * MMU
 */
#define	PGSZ4K		(0x00<<13)

M carrera/trap.c => carrera/trap.c +13 -8
@@ 253,7 253,7 @@ trap(Ureg *ur)
			postnote(up, 1, buf, NDebug);
			break;
		}
		print("kernel %s pc=%llux\n", excname[ecode], ur->pc);
		print("kernel %s pc=%lux\n", excname[ecode], ur->pc);
		dumpregs(ur);
		dumpstack();
		if(m->machno == 0)


@@ 392,7 392,7 @@ fpexcname(Ureg *ur, ulong fcr31, char *buf)
{
	int i;
	char *s;
	uvlong fppc;
	ulong fppc;

	fppc = ur->pc;
	if(ur->cause & (1<<31))	/* branch delay */


@@ 411,7 411,7 @@ fpexcname(Ureg *ur, ulong fcr31, char *buf)
	if(s == 0)
		return "no floating point exception";

	sprint(buf, "%s fppc=0x%llux", s, fppc);
	sprint(buf, "%s fppc=0x%lux", s, fppc);
	return buf;
}



@@ 421,7 421,7 @@ void
kernfault(Ureg *ur, int code)
{
	print("kfault %s badvaddr=0x%lux\n", excname[code], ur->badvaddr);
	print("UP=0x%lux SR=0x%lux PC=0x%llux R31=%llux SP=0x%llux\n",
	print("UP=0x%lux SR=0x%lux PC=0x%lux R31=%lux SP=0x%lux\n",
				up, ur->status, ur->pc, ur->r31, ur->sp);

	dumpregs(ur);


@@ 487,7 487,7 @@ notify(Ureg *ur)
		if(l > ERRLEN-23)	/* " pc=0x12345678\0" */
			l = ERRLEN-23;

		sprint(n->msg+l, " pc=0x%llux", ur->pc);
		sprint(n->msg+l, " pc=0x%lux", ur->pc);
	}

	if(n->flag != NUser && (up->notified || up->notify==0)) {


@@ 526,7 526,11 @@ notify(Ureg *ur)
	sp -= 3*BY2WD;
	*(ulong*)(sp+2*BY2WD) = sp+3*BY2WD;	/* arg 2 is string */
	up->svr1 = ur->r1;			/* save away r1 */
	ur->r1 = (ulong)up->ureg;		/* arg 1 is ureg* */
	up->svhr1 = ur->hr1;			/* save away r1 */
	ur->r1 = (long)up->ureg;		/* arg 1 is ureg* */
	ur->hr1 = 0;
	if(ur->r1 < 0)
		ur->hr1 = ~0;
	((ulong*)sp)[1] = (ulong)up->ureg;	/* arg 1 0(FP) is ureg* */
	((ulong*)sp)[0] = 0;			/* arg 0 is pc */
	ur->usp = sp;


@@ 566,6 570,7 @@ noted(Ureg **urp, ulong arg0)

	memmove(*urp, up->ureg, sizeof(Ureg));
	(*urp)->r1 = up->svr1;
	(*urp)->hr1 = up->svhr1;
	switch(arg0) {
	case NCONT:
		if(!okaddr(nur->pc, 1, 0) || !okaddr(nur->usp, BY2WD, 0)){


@@ 627,13 632,13 @@ syscall(Ureg *aur)
		goto error;

	if(up->scallnr >= nsyscall){
		pprint("bad sys call %d pc %llux\n", up->scallnr, ur->pc);
		pprint("bad sys call %d pc %lux\n", up->scallnr, ur->pc);
		postnote(up, 1, "sys: bad sys call", NDebug);
		error(Ebadarg);
	}

	if(sp & (BY2WD-1)){
		pprint("odd sp in sys call pc %llux sp %llux\n", ur->pc, ur->sp);
		pprint("odd sp in sys call pc %lux sp %lux\n", ur->pc, ur->sp);
		postnote(up, 1, "sys: odd stack", NDebug);
		error(Ebadarg);
	}

M carrera/ureg.h => carrera/ureg.h +38 -36
@@ 1,44 1,46 @@
struct Ureg
{
	ulong	status;
	ulong	pc;
	union{
		ulong	sp;		/* r29 */
		ulong	usp;		/* r29 */
	long	pc;
	union
	{
		long	sp;		/* r29 */
		long	usp;		/* r29 */
	};
	ulong	cause;
	ulong	badvaddr;
	ulong	tlbvirt;
	ulong	hi;
	ulong	lo;
	ulong	r31;
	ulong	r30;
	ulong	r28;
	ulong	r27;		/* unused */
	ulong	r26;		/* unused */
	ulong	r25;
	ulong	r24;
	ulong	r23;
	ulong	r22;
	ulong	r21;
	ulong	r20;
	ulong	r19;
	ulong	r18;
	ulong	r17;
	ulong	r16;
	ulong	r15;
	ulong	r14;
	ulong	r13;
	ulong	r12;
	ulong	r11;
	ulong	r10;
	ulong	r9;
	ulong	r8;
	ulong	r7;
	ulong	r6;
	ulong	r5;
	ulong	r4;
	ulong	r3;
	ulong	r2;
	ulong	r1;

	long	hhi;	long	hi;
	long	hlo;	long	lo;
	long	hr31;	long	r31;
	long	hr30;	long	r30;
	long	hr28;	long	r28;
	long	hr27;	long	r27;
	long	hr26;	long	r26;
	long	hr25;	long	r25;
	long	hr24;	long	r24;
	long	hr23;	long	r23;
	long	hr22;	long	r22;
	long	hr21;	long	r21;
	long	hr20;	long	r20;
	long	hr19;	long	r19;
	long	hr18;	long	r18;
	long	hr17;	long	r17;
	long	hr16;	long	r16;
	long	hr15;	long	r15;
	long	hr14;	long	r14;
	long	hr13;	long	r13;
	long	hr12;	long	r12;
	long	hr11;	long	r11;
	long	hr10;	long	r10;
	long	hr9;	long	r9;
	long	hr8;	long	r8;
	long	hr7;	long	r7;
	long	hr6;	long	r6;
	long	hr5;	long	r5;
	long	hr4;	long	r4;
	long	hr3;	long	r3;
	long	hr2;	long	r2;
	long	hr1;	long	r1;
};

M pc/dat.h => pc/dat.h +1 -1
@@ 20,7 20,7 @@ extern  void	(*kprofp)(ulong);
/*
 *  parameters for sysproc.c
 */
#define AOUT_MAGIC	I_MAGIC
#define EXEC_MAGIC(magic)	(magic==I_MAGIC)

struct Lock
{

M pc/trap.c => pc/trap.c +0 -1
@@ 414,7 414,6 @@ syscall(Ureg *ur, void *arg)
			postnote(up, 1, "sys: bad sys call", NDebug);
			error(Ebadarg);
		}
		up->syscall[up->scallnr]++;

		if(sp<(USTKTOP-BY2PG) || sp>(USTKTOP-(1+MAXSYSARG)*BY2WD))
			validaddr(sp, (1+MAXSYSARG)*BY2WD, 0);

M port/devproc.c => port/devproc.c +0 -50
@@ 23,7 23,6 @@ enum
	Qregs,
	Qsegment,
	Qstatus,
	Qcounters,
	Qtext,
	Qwait,
};


@@ 31,7 30,6 @@ enum
#define	STATSIZE	(2*NAMELEN+12+7*12)
Dirtab procdir[] =
{
	"counters",	{Qcounters},	0,			0444,
	"ctl",		{Qctl},		0,			0000,
	"fpregs",	{Qfpregs},	sizeof(FPsave),		0000,
	"kregs",	{Qkregs},	sizeof(Ureg),		0000,


@@ 73,7 71,6 @@ Chan*	proctext(Chan*, Proc*);
Segment* txt2data(Proc*, Segment*);
int	procstopped(void*);
void	mntscan(Mntwalk*);
ulong	readcounters(Proc*, ulong, void*, int);

int
procgen(Chan *c, Dirtab *tab, int ntab, int s, Dir *dp)


@@ 121,11 118,6 @@ procgen(Chan *c, Dirtab *tab, int ntab, int s, Dir *dp)
void
procinit(void)
{
	/* standard counters - this ordering is important */
	proccounter("sched");
	proccounter("fault");
	proccounter("tlbmiss");

	if(conf.nproc >= (1<<(16-QSHIFT))-1)
		print("warning: too many procs for devproc\n");
}


@@ 196,7 188,6 @@ procopen(Chan *c, int omode)
			error(Eperm);
		break;

	case Qcounters:
	case Qctl:
	case Qnote:
	case Qnoteid:


@@ 375,9 366,6 @@ procread(Chan *c, void *va, long n, ulong offset)
		memmove(a, rptr+offset, n);
		return n;

	case Qcounters:
		return readcounters(p, offset, va, n);

	case Qstatus:
		if(offset >= STATSIZE)
			return 0;


@@ 863,41 851,3 @@ data2txt(Segment *s)

	return ps;
}

static char *counter[Pcounter];
int ncounter;

int
proccounter(char *name)
{
	if(ncounter >= Pcounter)
		panic("too many process counters");
	counter[ncounter] = name;
	return ncounter++;
}

ulong
readcounters(Proc *p, ulong offset, void *va, int n)
{
	char *bp;
	int i, j, m;
	extern char *sysctab[];

	bp = smalloc((nsyscall+ncounter)*(NAMELEN+8));
	m = 0;
	for(i = 0; i < Pcounter; i++)
		if(counter[i])
			m += sprint(bp+m, "%s\t%8d\n", counter[i], p->counter[i]);
	j = 0;
	for(i = 0; i < nsyscall; i++)
		j += p->syscall[i];
	m += sprint(bp+m, "syscall\t%8d\n", j);
	for(i = 0; i < nsyscall; i++)
		if(p->syscall[i])
			m += sprint(bp+m, "%s\t%8d\n", sysctab[i], p->syscall[i]);
	n = readstr(offset, va, n, bp);
	free(bp);
	memset(p->counter, 0, sizeof(p->counter));
	memset(p->syscall, 0, sizeof(p->syscall));
	return n;
}

M port/fault.c => port/fault.c +0 -1
@@ 18,7 18,6 @@ fault(ulong addr, int read)
	spllo();

	m->pfault++;
	up->counter[FAULTCNTR]++;
	for(;;) {
		s = seg(up, addr, 1);
		if(s == 0) {

M port/portdat.h => port/portdat.h +0 -4
@@ 581,10 581,6 @@ struct Proc
	void	*dbgreg;	/* User registers for devproc */
	Notsave;

	/* statistics */
	ulong	counter[Pcounter];	/* specialized per process counters */
	ulong	*syscall;

	/*
	 *  machine specific MMU
	 */

M port/proc.c => port/proc.c +1 -6
@@ 82,7 82,6 @@ sched(void)

		/* statistics */
		m->cs++;
		up->counter[CSCNTR]++;

		procsave(up);
		if(setlabel(&up->sched)) {


@@ 229,8 228,6 @@ newproc(void)
		panic("pidalloc");
	if(p->kstack == 0)
		p->kstack = smalloc(KSTACK);
	memset(p->counter, 0, sizeof(p->counter));
	memset(p->syscall, 0, sizeof(p->syscall));

	return p;
}


@@ 245,10 242,8 @@ procinit0(void)		/* bad planning - clashes with devproc.c */
	procalloc.arena = procalloc.free;

	p = procalloc.free;
	for(i=0; i<conf.nproc-1; i++,p++){
	for(i=0; i<conf.nproc-1; i++,p++)
		p->qnext = p+1;
		p->syscall = xalloc(nsyscall * sizeof(ulong));
	}
	p->qnext = 0;
}


M port/sysproc.c => port/sysproc.c +1 -2
@@ 12,7 12,6 @@ int	shargs(char*, int, char**);
long
sysr1(ulong *arg)
{
	xsummary();
	print("[%s %s %d] r1 = %d\n", up->user, up->text, up->pid, arg[0]);
	return 0;
}


@@ 216,7 215,7 @@ sysexec(ulong *arg)
	magic = l2be(exec.magic);
	text = l2be(exec.text);
	entry = l2be(exec.entry);
	if(n==sizeof(Exec) && (magic==AOUT_MAGIC)){
	if(n==sizeof(Exec) && EXEC_MAGIC(magic)){
		if((text&KZERO)
		|| entry < UTZERO+sizeof(Exec)
		|| entry >= UTZERO+sizeof(Exec)+text)

M power/dat.h => power/dat.h +1 -1
@@ 14,7 14,7 @@ typedef struct Ureg	Ureg;
/*
 *  parameters for sysproc.c
 */
#define AOUT_MAGIC	V_MAGIC
#define EXEC_MAGIC(magic)	(magic==V_MAGIC)

/*
 *  machine dependent definitions used by ../port/dat.h