~kris/9p

9hist

ad3bbb3be02c09e9996085109f130e4566eb93b1 — David du Colombier 34 years ago 5ad7f26
Plan 9 from Bell Labs 1992-08-10
7 files changed, 78 insertions(+), 30 deletions(-)

M ss/dat.h
M ss/fns.h
M ss/io.h
M ss/l.s
M ss/main.c
M ss/screen.c
M ss/trap.c
M ss/dat.h => ss/dat.h +1 -1
@@ 65,9 65,9 @@ struct Conf
{
	int	nmach;		/* processors */
	int	nproc;		/* processes */
	ulong	monitor;	/* graphics monitor id; 0 for none */
	char	ss2;		/* is a sparcstation 2 */
	char	ss2cachebug;	/* has sparcstation2 cache bug */
	char	monitor;	/* has graphics monitor */
	int	ncontext;	/* in mmu */
	int	npmeg;
	int	vacsize;	/* size of virtual address cache, in bytes */

M ss/fns.h => ss/fns.h +2 -0
@@ 22,6 22,7 @@ void	fpsave(FPsave*);
int	fptrap(void);
int	getfpq(ulong*);
ulong	getfsr(void);
ulong	getpsr(void);
void	intrinit(void);
void	ioinit(void);
int	kbdstate(IOQ*, int);


@@ 58,6 59,7 @@ void	screeninit(void);
void	screenputc(int);
void	screenputs(char*, int);
void	scsiintr(void);
void	setpsr(ulong);
void	spldone(void);
ulong	tas(ulong*);
void	touser(ulong);

M ss/io.h => ss/io.h +2 -1
@@ 1,4 1,5 @@
#define	DISPLAYRAM	0x1E800000
#define	FRAMEBUFID	0xFE000000
#define	DISPLAYRAM	0xFE800000
#define	EPROM		0xF6000000
#define	CLOCK		0xF3000000
#define	CLOCKFREQ	1000000		/* one microsecond increments */

M ss/l.s => ss/l.s +6 -0
@@ 342,6 342,12 @@ TEXT	getpsr(SB), $0
	MOVW	PSR, R7
	RETURN

TEXT	setpsr(SB), $0

	MOVW	R7, PSR
	NOOP
	RETURN

TEXT	putsegm(SB), $0

	MOVW	4(FP), R8

M ss/main.c => ss/main.c +29 -18
@@ 5,18 5,18 @@
#include	"fns.h"
#include	"io.h"
#include	"init.h"
#include	"rom.h"

#include	<libg.h>
#include	<gnot.h>

uchar	*intrreg;
uchar	idprom[32];
ROM	*rom;		/* open boot rom vector */
ulong	rom;		/* open boot rom vector */
int	cpuserver;
void	(*romputcxsegm)(int, ulong, int);
ulong	romputcxsegm;
ulong	bank[2];
char	mempres[256];
Label	catch;

typedef struct Sysparam Sysparam;
struct Sysparam


@@ 29,18 29,17 @@ struct Sysparam
	int	ncontext;	/* Number of MMU contexts */
	int	npmeg;		/* Number of process maps */
	char	cachebug;	/* Machine needs cache bug work around */
	char	monitor;	/* Needs to be computed */
	int	memscan;	/* Number of Meg to scan looking for memory */
}
sysparam[] =
{
	{ 0x51, "1 4/60",   0, 65536, 16,  8, 128, 0, 1, 64 },
	{ 0x52, "IPC 4/40", 0, 65536, 16,  8, 128, 0, 1, 64 },
	{ 0x53, "1+ 4/65",  0, 65536, 16,  8, 128, 0, 1, 64 },
	{ 0x54, "SLC 4/20", 0, 65536, 16,  8, 128, 0, 1, 64 },
	{ 0x55, "2 4/75",   1, 65536, 32, 16, 256, 1, 0, 64 },
	{ 0x56, "ELC 4/25", 1, 65536, 32, 16, 256, 1, 0, 64 },
	{ 0x57, "IPX 4/50", 1, 65536, 32, 16, 256, 1, 0, 64 },
	{ 0x51, "1 4/60",   0, 65536, 16,  8, 128, 0, 64 },
	{ 0x52, "IPC 4/40", 0, 65536, 16,  8, 128, 0, 64 },
	{ 0x53, "1+ 4/65",  0, 65536, 16,  8, 128, 0, 64 },
	{ 0x54, "SLC 4/20", 0, 65536, 16,  8, 128, 0, 64 },
	{ 0x55, "2 4/75",   1, 65536, 32, 16, 256, 1, 64 },
	{ 0x56, "ELC 4/25", 1, 65536, 32, 16, 256, 1, 64 },
	{ 0x57, "IPX 4/50", 1, 65536, 32, 16, 256, 1, 64 },
	{ 0 }
};
Sysparam *sparam;


@@ 54,16 53,15 @@ main(void)
	machinit();
	active.exiting = 0;
	active.machs = 1;
	trapinit();
	confinit();
	xinit();
	mmuinit();
	if(conf.monitor)
		screeninit();
	screeninit();
	printinit();
	trapinit();
	kmapinit();
	ioinit();
	if(!conf.monitor)
	if(conf.monitor == 0)
		sccspecial(2, &printq, &kbdq, 9600);
	pageinit();
	cacheinit();


@@ 90,7 88,7 @@ intrinit(void)
void
systemreset(void)
{
	delay(100);
	delay(200);
	putenab(ENABRESET);
}



@@ 137,6 135,7 @@ init0(void)

	print("Sun Sparcstation %s\n", sparam->name);
	print("bank 0: %dM  1: %dM\n", bank[0], bank[1]);
	print("frame buffer id %lux\n", conf.monitor);

	u->slash = (*devtab[0].attach)(0);
	u->dot = clone(u->slash, 0);


@@ 286,6 285,19 @@ confinit(void)
		*(ulong*)va = 0;
	putw4(va, INVALIDPTE);

	/* map frame buffer id */
	putw4(va, ((FRAMEBUFID>>PGSHIFT)&0xFFFF)|PTEVALID|PTEKERNEL|PTENOCACHE|PTEIO);
	i = getpsr();
	conf.monitor = 0;
	/* if frame buffer not present, we will trap, so prepare to catch it */
	if(setlabel(&catch) == 0){
		setpsr(i|PSRET|(0xF<<8));	/* enable traps, not interrupts */
		conf.monitor = *(ulong*)va;
	}
	setpsr(i);
	catch.pc = 0;
	putw4(va, INVALIDPTE);

	for(sparam = sysparam; sparam->id; sparam++)
		if(sparam->id == idprom[1])
			break;


@@ 300,7 312,6 @@ confinit(void)
	conf.ncontext = sparam->ncontext;
	conf.npmeg = sparam->npmeg;
	conf.ss2cachebug = sparam->cachebug;
	conf.monitor = sparam->monitor;		/* BUG */

	/* Chart memory */
	scanmem(mempres, sparam->memscan);


@@ 333,7 344,7 @@ confinit(void)
			conf.upages +=  i - ((6*MB)/BY2PG);
	}

	romputcxsegm = rom->putcxsegm;
	romputcxsegm = *(ulong*)(rom+260);

	ktop = PGROUND((ulong)end);
	ktop = PADDR(ktop);

M ss/screen.c => ss/screen.c +30 -9
@@ 22,14 22,16 @@ struct{

void	(*kprofp)(ulong);

GBitmap	gscreen =
GBitmap gscreen;

struct screens
{
	(ulong*)SCREENSEGM,
	0,
	1152/32,
	0,
	{0, 0, 1152, 900},
	{0, 0, 1152, 900},
	ulong	type;
	int	x;
	int	y;
	int	ld;
}screens[] = {
	{ 0xFE010104, 1152, 900, 0 },
	0
};



@@ 38,8 40,27 @@ Lock screenlock;
void
screeninit(void)
{
	if(!conf.monitor)
		return;
	struct screens *s;

	for(s=screens; s->type; s++)
		if(s->type == conf.monitor)
			goto found;
	/* default is 0th element of table */
	if(conf.monitor){
		s = screens;
		goto found;
	]
	conf.monitor = 0;
	return;

    found:
	gscreen.base = (ulong*)SCREENSEGM;
	gscreen.zero = 0;
	gscreen.width = (s->x<<s->ld)/32;
	gscreen.ldepth = s->ld;
	gscreen.r = Rect(0, 0, s->x, s->y);
	gscreen.clipr = gscreen.r;
	gscreen.cache = 0;
	defont = &defont0;
	gbitblt(&gscreen, Pt(0, 0), &gscreen, gscreen.r, 0);
	out.pos.x = MINX;

M ss/trap.c => ss/trap.c +8 -1
@@ 11,6 11,7 @@ void	noted(Ureg**, ulong);
void	rfnote(Ureg**);
int	domuldiv(ulong, Ureg*);

extern	Label catch;
extern	void traplink(void);
extern	void syslink(void);



@@ 102,12 103,18 @@ trap(Ureg *ur)
	char buf[64];
	ulong tbr, iw;

	tbr = (ur->tbr&0xFFF)>>4;
	/*
	 * Hack to catch bootstrap fault during probe
	 */
	if(catch.pc)
		longjmp(&catch, 1);

	if(u)
		u->dbgreg = ur;

	fpunsafe = 0;
	user = !(ur->psr&PSRPSUPER);
	tbr = (ur->tbr&0xFFF)>>4;
	/* SS2 bug: flush cache line holding trap entry in table */
	if(conf.ss2cachebug)
		putsysspace(CACHETAGS+((TRAPS+16*tbr)&(conf.vacsize-1)), 0);