~kris/9p

9hist

59decfa97947c5cfec39b1c5a19202f653206083 — David du Colombier 35 years ago 723e986
Plan 9 from Bell Labs 1991-01-11
8 files changed, 145 insertions(+), 51 deletions(-)

A port/devXXX.c
M port/devroot.c
M ss/faultsparc.c
M ss/io.h
M ss/l.s
M ss/main.c
M ss/mem.h
M ss/mmu.c
A port/devXXX.c => port/devXXX.c +118 -0
@@ 0,0 1,118 @@
/*
 *  template for making a new device
 */

#include	"u.h"
#include	"lib.h"
#include	"mem.h"
#include	"dat.h"
#include	"fns.h"
#include	"errno.h"

#include	"devtab.h"

enum{
	XXXdirqid,
	XXXdataqid,
};
Dirtab XXXtab[]={
	"data",		XXXdataqid,		0,	0600,
};
#define NXXXtab (sizeof(XXXTab)/sizeof(Dirtab))

void
XXXreset(void)
{
}

void
XXXinit(void)
{
}

Chan *
XXXattach(char *spec)
{
	return devattach('X', spec);
}

Chan *
XXXclone(Chan *c, Chan *nc)
{
	return devclone(c, nc);
}

int
XXXwalk(Chan *c, char *name)
{
	return devwalk(c, name, XXXtab, (long)NXXXtab, devgen);
}

void
XXXstat(Chan *c, char *db)
{
	devstat(c, db, XXXtab, (long)NXXXtab, devgen);
}

Chan *
XXXopen(Chan *c, int omode)
{
	if(c->qid == CHDIR){
		if(omode != OREAD)
			error(0, Eperm);
	}
	c->mode = openmode(omode);
	c->flag |= COPEN;
	c->offset = 0;
	return c;
}

void
XXXcreate(Chan *c, char *name, int omode, ulong perm)
{
	error(0, Eperm);
}

void
XXXremove(Chan *c)
{
	error(0, Eperm);
}

void
XXXwstat(Chan *c, char *dp)
{
	error(0, Eperm);
}

void
XXXclose(Chan *c)
{
}

long
XXXread(Chan *c, void *a, long n)
{
	switch((int)(c->qid&~CHDIR)){
	case XXXdirqid:
		return devdirread(c, a, n, XXXtab, NXXXtab, devgen);
	case XXXdataqid:
		break;
	default:
		n=0;
		break;
	}
	return n;
}

long
XXXwrite(Chan *c, char *a, long n)
{
	switch((int)(c->qid&~CHDIR)){
	case XXXdataqid:
		break;
	default:
		error(0, Ebadusefd);
	}
	return n;
}

M port/devroot.c => port/devroot.c +0 -2
@@ 94,9 94,7 @@ rootread(Chan *c, void *buf, long n)
			return 0;
		if(c->offset+n > sizeof bootcode)
			n = sizeof bootcode - c->offset;
ck("1");
		memcpy(buf, ((char*)bootcode)+c->offset, n);
ck("2");
		return n;

	case Qdev:

M ss/faultsparc.c => ss/faultsparc.c +1 -14
@@ 6,12 6,6 @@
#include	"ureg.h"
#include	"errno.h"

ck(char *s)
{
	if(u->p->seg[SSEG].o->flag == 0)
		panic(s);
}

void
faultsparc(Ureg *ur)
{


@@ 34,8 28,7 @@ faultsparc(Ureg *ur)
		return;
	}
	spllo();
print("fault: %s pc=0x%lux addr %lux %d\n", excname(tbr), ur->pc, addr, read); /**/
ck("faultsparc");
/* print("fault: %s pc=0x%lux addr %lux %d\n", excname(tbr), ur->pc, addr, read); /**/
	if(u == 0){
		dumpregs(ur);
		panic("fault u==0 pc=%lux", ur->pc);


@@ 48,11 41,6 @@ ck("faultsparc");
	user = !(ur->psr&PSRPSUPER);

	if(fault(addr, read) < 0){
print("death read %lux %d sizes %lux-%lux %lux-%lux, %lux-%lux %lux-%lux\n", addr, read,
u->p->seg[SSEG].minva, u->p->seg[SSEG].maxva, 
u->p->seg[TSEG].minva, u->p->seg[TSEG].maxva, 
u->p->seg[DSEG].minva, u->p->seg[DSEG].maxva, 
u->p->seg[BSEG].minva, u->p->seg[BSEG].maxva); 
		if(user){
			pprint("user %s error addr=0x%lux\n", read? "read" : "write", badvaddr);
			pprint("psr=0x%lux pc=0x%lux sp=0x%lux\n", ur->psr, ur->pc, ur->sp);


@@ 64,7 52,6 @@ u->p->seg[BSEG].minva, u->p->seg[BSEG].maxva);
		exit();
	}
	u->p->insyscall = insyscall;
ck("faultsparc return");
}

void

M ss/io.h => ss/io.h +0 -4
@@ 8,7 8,3 @@ typedef struct	Duart	Duart;
#define	ETHER		0xF8C00000	/* RDP, RAP */
#define	EEPROM		0xF2000000
#define	INTRREG		0xF5000000	/* interrupt register, IO space */

#define	ENAB		0x40000000	/* ASI 2, System Enable Register */
#define	ENABCACHE	0x10
#define	ENABRESET	0x04

M ss/l.s => ss/l.s +1 -1
@@ 1,6 1,6 @@
#include "mem.h"

#define	SYSPSR	(SPL(0xF)|PSRSUPER)
#define	SYSPSR	(SPL(0x0)|PSRSUPER)

TEXT	start(SB), $-4


M ss/main.c => ss/main.c +10 -7
@@ 66,9 66,10 @@ main(void)
	confinit();
	mmuinit();
	printinit();
	print("sparc plan 9\n");
	print("sparc plan 9 %lux\n", getb2(ENAB));
	trapinit();
	kmapinit();
	print("sparc plan 9 %lux\n", getb2(ENAB));
	cacheinit();
	intrinit();
	procinit0();


@@ 220,8 221,7 @@ exit(void)
	u = 0;
	splhi();
	print("exiting\n");
for(;;)
	delay(60*1000);
	delay(30*1000);
	reset();
}



@@ 301,12 301,15 @@ confinit(void)
	conf.nmach = 1;
	if(conf.nmach > MAXMACH)
		panic("confinit");
	conf.npage0 = (6*1024*1024)/BY2PG;	/* BUG */
	conf.npage = conf.npage0;
	conf.npage0 = (4*1024*1024)/BY2PG;	/* BUG */
	conf.npage1 = 0*(4*1024*1024)/BY2PG;	/* BUG */
	conf.base0 = 0;
	conf.base1 = 16*1024*1024;
	conf.npage = conf.npage0+conf.npage1;
	conf.maxialloc = 4*1024*1024;		/* BUG */
	mul = 2;
	mul = 1;
	if(conf.npage1 > 0)
		mul = 2;
	conf.nproc = 50*mul;
	conf.npgrp = 12*mul;
	conf.npte = 1400*mul;


@@ 320,7 323,7 @@ confinit(void)
	conf.nmtab = 50*mul;
	conf.nmount = 80*mul;
	conf.nmntdev = 10*mul;
	conf.nmntbuf = conf.nmntdev+3;
	conf.nmntbuf = conf.nmntdev+6;
	conf.nmnthdr = 2*conf.nmntdev;
	conf.nstream = 40 + 32*mul;
	conf.nqueue = 5 * conf.nstream;

M ss/mem.h => ss/mem.h +4 -0
@@ 99,10 99,14 @@
 * Weird addresses in various ASI's
 */
#define	CACHETAGS	0x80000000		/* ASI 2 */
#define	CACHEDATA	0x90000000		/* ASI 2 */
#define	SER		0x60000000		/* ASI 2 */
#define	SEVAR		0x60000004		/* ASI 2 */
#define	ASER		0x60000008		/* ASI 2 */
#define	ASEVAR		0x6000000C		/* ASI 2 */
#define	ENAB		0x40000000		/* ASI 2 */
#define	ENABCACHE	0x10
#define	ENABRESET	0x04

/*
 * Virtual addresses

M ss/mmu.c => ss/mmu.c +11 -23
@@ 14,7 14,7 @@ struct
	KMap	arena[(IOEND-IOSEGM)/BY2PG];
}kmapalloc;

#define	NKLUDGE	8
#define	NKLUDGE	12

/*
 * On SPARC, tlbpid i == context i-1 so that 0 means unallocated


@@ 77,6 77,7 @@ newpid(Proc *p)
	m->pidproc[i] = p;
	m->lastpid = i;
	putcontext(i-1);

	/*
	 * kludge: each context is allowed NKLUDGE pmegs, NKLUDGE-1 for text & data and 1 for stack
	 */


@@ 153,10 154,17 @@ mmuinit(void)
		/*
		 * Invalidate user addresses
		 */

		for(l=UZERO; l<(KZERO&VAMASK); l+=BY2SEGM)
			putsegm(l, INVALIDPMEG);

#ifdef doesntwork
		/*
		 * Invalidate high kernel addresses
		 */
		for(l=conf.maxialloc; l<IOSEGM0; l+=BY2SEGM)
			putsegm(l, INVALIDPMEG);
#endif

		/*
		 * One segment for screen
		 */


@@ 210,7 218,7 @@ putmmu(ulong tlbvirt, ulong tlbphys)
	 */
	if(tlbvirt>=TSTKTOP || (UZERO+(NKLUDGE-1)*BY2SEGM<=tlbvirt && tlbvirt<(TSTKTOP-BY2SEGM))){
		pprint("putmmu %lux", tlbvirt);
		pexit("Suicide", 0);
		pexit("Suicide", 1);
	}
	putpmeg(tlbvirt, tlbphys);
	spllo();


@@ 309,27 317,7 @@ kmappa(ulong pa, ulong flag)
	 * must use NOCACHE or else extreme cleverness elsewhere.
	 */
	s = splhi();
#ifdef stupid
{
	int i, c, d;

	c = u->p->pidonmach[m->machno];
	/*
	 * Flush old entries from cache
	 */
	for(d=0; d<NCONTEXT; d++){
		putcontext(d);
		for(i=0; i<0x100; i+=16)
			putwD16(k->va+(i<<4), 0);
	}
	putcontext(c-1);
	if(u && u->p)
		m->pidhere[c] = 1;	/* UGH! */
	putw4(k->va, PPN(pa)|PTEVALID|PTEKERNEL|PTEWRITE|PTENOCACHE|flag);
}
#else
	putpmeg(k->va, PPN(pa)|PTEVALID|PTEKERNEL|PTEWRITE|PTENOCACHE|flag);
#endif
	splx(s);
	return k;
}