~kris/9p

9hist

3eff877ca4b1c18ed5e6f801a8343d7d8c2882f9 — David du Colombier 35 years ago 59decfa
Plan 9 from Bell Labs 1991-01-12
M gnot/devcons.c => gnot/devcons.c +3 -0
@@ 308,6 308,9 @@ echo(int c)
		case 'q':
			dumpqueues();
			return;
		case 'r':
			panic("you asked for it");
			break;
		case 'm':
			mntdump();
			return;

M gnot/l.s => gnot/l.s +18 -0
@@ 215,6 215,24 @@ TEXT	tacintr(SB), $0			/* level 1 */
	MOVL	(A7)+, R0
	RTE

#ifdef asdf
TEXT	portintr(SB), $0		/* level 2 */

	SUBL	$((8+8+1)*BY2WD), A7
	MOVEM	$0x7FFF, (A7)
	MOVL	$a6base(SB), A6
	MOVL	USP, A0
	MOVL	A0, ((8+8)*BY2WD)(A7)
	MOVL	A7, -(A7)
	BSR	devportintr(SB)
	ADDL	$4, A7
	MOVL	((8+8)*BY2WD)(A7), A0
	MOVL	A0, USP
	MOVEM	(A7), $0x7FFF
	ADDL	$((8+8+1)*BY2WD), A7
	RTE
#endif

TEXT	dkintr(SB), $0			/* level 2 */

	SUBL	$((8+8+1)*BY2WD), A7

M gnot/screen.c => gnot/screen.c +2 -2
@@ 158,7 158,7 @@ uchar keymap[]={
	0x98,	0x99,	0x9a,	0x9b,	0x58,	0x58,	0x58,	0x58,
/*A0*/	0x58,	0xa1,	0xa2,	0xa3,	0xa4,	0xa5,	0xa6,	0xa7,
	0x58,	0x58,	0x58,	0x58,	0x58,	0x58,	0xae,	0xaf,
/*B0*/	0xb0,	0xb1,	0xb2,	0xb3,	0xb4,	0xb5,	0x80,	0xb7,
/*B0*/	0xb0,	0xb1,	0xb2,	0xb3,	0xb4,	0xb5,	0xb6,	0xb7,
	0xb8,	0xb9,	0x00,	0xbb,	0x1e,	0xbd,	0x60,	0x1f,
/*C0*/	0xc0,	0xc1,	0xc2,	0xc3,	0xc4,	0x58,	0xc6,	0x0a,
	0xc8,	0xc9,	0xca,	0xcb,	0xcc,	0xcd,	0xce,	0xcf,


@@ 167,7 167,7 @@ uchar keymap[]={
/*E0*/	0x58,	0x58,	0xe2,	0x1b,	0x0d,	0xe5,	0x58,	0x0a,
	0xe8,	0xe9,	0xea,	0xeb,	0xec,	0xed,	0xee,	0xef,
/*F0*/	0x09,	0x08,	0xb2,	0x1b,	0x0d,	0xf5,	0x81,	0x58,
	0x58,	0x58,	0x58,	0x58,	0x58,	0x58,	0x7f,	0xb2,
	0x58,	0x58,	0x58,	0x58,	0x58,	0x58,	0x7f,	0x80,
};

void

M gnot/vec.s => gnot/vec.s +2 -1
@@ 31,7 31,8 @@ TEXT	vectors0<>(SB), $0
	LONG	illegal(SB)		/* 24 */
/* origin	0064, vector 25 */
	LONG	tacintr(SB)		/* level 1 autovector */
	LONG	illegal(SB)		/* level 2 autovector (port)*/
/*	LONG	portintr(SB)		/* level 2 autovector */
	LONG	illegal(SB)		/* level 2 autovector */
	LONG	dkintr(SB)		/* level 3 autovector */
	LONG	mouseintr(SB)		/* level 4 autovector */
	LONG	uartintr(SB)		/* level 5 autovector */

M port/devnonet.c => port/devnonet.c +1 -1
@@ 781,7 781,7 @@ listen(Chan *c, Noifc *ifc)
		 */
		ep = &ifc->conv[conf.nnoconv];
		for(cp = &ifc->conv[0]; cp < ep; cp++){
			if(cp->state>Cannounced && call.circuit==cp->rcvcircuit
			if(cp->state>Cannounced && (call.circuit^1)==cp->rcvcircuit
			&& strcmp(call.raddr, cp->raddr)==0)
				break;
		}

M port/devscsi.c => port/devscsi.c +2 -2
@@ 318,7 318,7 @@ typedef struct Scsictl {
#define	DEV	((Scsictl *)&PORT[Scsiaddr])

static long	poot;
#define	WAIT	(poot=0, (poot==0?0:poot))
#define	WAIT	(poot=0, poot==0?0:poot)

#define	PUT(a,d)	(DEV->asr=(a), WAIT, DEV->data=(d))
#define	GET(a)		(DEV->asr=(a), WAIT, DEV->data)


@@ 470,7 470,7 @@ scsiintr(void)
void
scsidmaintr(void)
{
	uchar *p=0;
		uchar *p = 0;
/*
 *	if (scsirflag) {
 *		unsigned char *p;

M port/devwren.c => port/devwren.c +105 -31
@@ 9,22 9,38 @@

#include	"scsi.h"

typedef struct Part	Part;
typedef struct Disk	Disk;

enum {
	Qdir, Qdata, Qstruct,
};
	Npart=		2,	/* maximum partitions per disk */
	Ndisk=		64,	/* maximum disks */

	Qdir=		0,
	Qdata=		16,
	Qstruct=	32,

static Dirtab wrendir[]={
	"data",		{Qdata},	0,	0600,
	"struct",	{Qstruct},	8,	0400,
	Mask=		0x7,
};

#define	NWREN	(sizeof wrendir/sizeof(Dirtab))
static Dirtab *wrendir;
#define	NWREN	(2*(Npart+1))

struct Part
{
	ulong 	firstblock;
	ulong 	maxblock;
};
struct Disk
{
	ulong	blocksize;
	Part	p[Npart];
};

static long	maxblock[64];
static long	blocksize[64];
static Disk	wren[Ndisk];

static Scsi	staticcmd;		/* BUG */
static uchar	datablk[4*512];		/* BUG */
static Scsi	staticcmd;			/* BUG */
static uchar	datablk[2*4*512];		/* BUG */

/*
 *  accepts [0-7].[0-7], or abbreviation


@@ 50,6 66,8 @@ wrendev(char *p)
	if (p[3]!=0)
		goto cant;
out:
	if(dev >= Ndisk)
		error(Ebadarg);
	return dev;
cant:
	error(Ebadarg);


@@ 59,20 77,51 @@ static int
wrengen(Chan *c, Dirtab *tab, long ntab, long s, Dir *dp)
{
	long l;
	if(tab==0 || s>=ntab)
	Part *p;
	Disk *d;

	if(s >= ntab)
		return -1;
	tab+=s;
	if (tab->qid.path==Qdata && 0<=c->dev && c->dev<64)
		l = maxblock[c->dev]*blocksize[c->dev];
	if(c->dev >= Ndisk)
		return -1;

	tab += s;
	d = &wren[c->dev];
	p = &d->p[tab->qid.path&Mask];
	if((tab->qid.path&~Mask) == Qdata)
		l = d->blocksize * (p->maxblock - p->firstblock);
	else
		l = tab->length;
		l = 8;
	devdir(c, tab->qid, tab->name, l, tab->perm, dp);
	return 1;
}

void
wrenreset(void)
{}
{
	Dirtab *p;
	int i;

	p = wrendir = ialloc((Npart+1) * 2 * sizeof(Dirtab), 0);
	for(i = 0; i < Npart; i++){
		sprint(p->name, "data%d", i);
		p->qid.path = Qdata + i;
		p->perm = 0600;
		p++->length = 0;
		strcpy(p->name, "struct%d");
		p->qid.path = Qstruct + i;
		p->perm = 0600;
		p++->length = 0;
	}
	strcpy(p->name, "data");
	p->qid.path = Qdata + Npart;
	p->perm = 0600;
	p++->length = 0;
	strcpy(p->name, "struct");
	p->qid.path = Qstruct + Npart;
	p->perm = 0600;
	p->length = 0;
}

void
wreninit(void)


@@ 91,14 140,26 @@ wrenattach(char *param)
	uchar buf[32];
	int dev;
	Chan *c;
	Disk *d;
	ulong plen;
	int i;

	dev = wrendev(param);
	scsiready(dev);
	scsisense(dev, buf);
	scsicap(dev, buf);
	c = devattach('r', param);
	c->dev = dev;
	maxblock[dev] = BGLONG(&buf[0]);
	blocksize[dev] = BGLONG(&buf[4]);
	d = &wren[dev];
	d->blocksize = BGLONG(&buf[4]);
	plen = BGLONG(&buf[0]);
	d->p[Npart].firstblock = 0;
	d->p[Npart].maxblock = plen;
	plen = plen/Npart;
	for(i = 0; i < Npart; i++){
		d->p[i].firstblock = i*plen;
		d->p[i].maxblock = (i+1)*plen;
	}
	return c;
}



@@ 145,16 206,23 @@ wrenread(Chan *c, char *a, long n)
{
	Scsi *cmd = &staticcmd;
	unsigned long lbn;
	Part *p;
	Disk *d;

	if (n == 0)
		return 0;
	switch ((int)(c->qid.path & ~CHDIR)) {
	case Qdir:

	if(c->qid.path == CHDIR)
		return devdirread(c, a, n, wrendir, NWREN, wrengen);

	d = &wren[c->dev];
	p = &(d->p[Mask&c->qid.path]);
	switch ((int)(c->qid.path & ~Mask)) {
	case Qdata:
		if (n % blocksize[c->dev] || c->offset % blocksize[c->dev])
		if (n % d->blocksize || c->offset % d->blocksize)
			error(Ebadarg);
		lbn = c->offset/blocksize[c->dev];
		if (lbn >= maxblock[c->dev])
		lbn = (c->offset/d->blocksize) + p->firstblock;
		if (lbn >= p->maxblock)
			error(Ebadarg);
		if (n > sizeof datablk)
			n = sizeof datablk;


@@ 170,7 238,7 @@ wrenread(Chan *c, char *a, long n)
		cmd->cmdblk[1] = lbn>>16;
		cmd->cmdblk[2] = lbn>>8;
		cmd->cmdblk[3] = lbn;
		cmd->cmdblk[4] = n/blocksize[c->dev];
		cmd->cmdblk[4] = n/d->blocksize;
		cmd->cmdblk[5] = 0x00;
		cmd->cmd.lim = &cmd->cmdblk[6];
		cmd->data.lim = cmd->data.base + n;


@@ 187,8 255,8 @@ wrenread(Chan *c, char *a, long n)
		if (c->offset >= 8)
			return 0;
		n = 8;
		PLONG((uchar *)&a[0], maxblock[c->dev]);
		PLONG((uchar *)&a[4], blocksize[c->dev]);
		PLONG((uchar *)&a[0], p->maxblock - p->firstblock);
		PLONG((uchar *)&a[4], d->blocksize);
		break;
	default:
		panic("wrenread");


@@ 201,14 269,20 @@ wrenwrite(Chan *c, char *a, long n)
{
	Scsi *cmd = &staticcmd;
	unsigned long lbn;
	Part *p;
	Disk *d;

	if (n == 0)
		return 0;
	switch ((int)(c->qid.path & ~CHDIR)) {

	d = &wren[c->dev];
	p = &(d->p[Mask&c->qid.path]);
	switch ((int)(c->qid.path & ~Mask)) {
	case Qdata:
		if (n % blocksize[c->dev] || c->offset % blocksize[c->dev])
		if (n % d->blocksize || c->offset % d->blocksize)
			error(Ebadarg);
		lbn = c->offset/blocksize[c->dev];
		if (lbn >= maxblock[c->dev])
		lbn = c->offset/d->blocksize + p->firstblock;
		if (lbn >= p->maxblock)
			error(Ebadarg);
		if (n > sizeof datablk)
			n = sizeof datablk;


@@ 224,7 298,7 @@ wrenwrite(Chan *c, char *a, long n)
		cmd->cmdblk[1] = lbn>>16;
		cmd->cmdblk[2] = lbn>>8;
		cmd->cmdblk[3] = lbn;
		cmd->cmdblk[4] = n/blocksize[c->dev];
		cmd->cmdblk[4] = n/d->blocksize;
		cmd->cmdblk[5] = 0x00;
		cmd->cmd.lim = &cmd->cmdblk[6];
		cmd->data.lim = cmd->data.base + n;

M port/stnoether.c => port/stnoether.c +1 -1
@@ 186,7 186,7 @@ noetheriput(Queue *q, Block *bp)
		freeb(bp);
		return;
	}
	clp = &ifc->call[ifc->rptr];
	clp = &ifc->call[ifc->wptr];
	sprint(clp->raddr, "%.2ux%.2ux%.2ux%.2ux%.2ux%.2ux",
		h->s[0], h->s[1], h->s[2], h->s[3], h->s[4], h->s[5]);
	clp->circuit = circuit^1;

M ss/boot.c => ss/boot.c +0 -1
@@ 78,7 78,6 @@ main(int argc, char *argv[])
	argv++;
	argc--;

	manual = 1;
	while(argc > 0){
		if(argv[0][0] == '-'){
			if(argv[0][1] == 'm')

M ss/boot.h => ss/boot.h +83 -83
@@ 1,6 1,6 @@
ulong bootcode[]={
	0x0000002ab,
	0x000005b58,
	0x000005b50,
	0x000000680,
	0x000001100,
	0x000000000,


@@ 18,34 18,35 @@ ulong bootcode[]={
	0x040000007,
	0x001000000,
	0x0ce206004,
	0x0400005aa,
	0x0400005a8,
	0x001000000,
	0x010bffffd,
	0x001000000,
	0x0822060a0,
	0x0de206000,
	0x0c0206098,
	0x09000b1ed,
	0x0d0206004,
	0x0c0206008,
	0x040000721,
	0x04000071e,
	0x001000000,
	0x09200b1f5,
	0x0d2206004,
	0x090002001,
	0x0d0206008,
	0x04000071b,
	0x040000718,
	0x001000000,
	0x09200b1fd,
	0x0d2206004,
	0x090002001,
	0x0d0206008,
	0x040000715,
	0x040000712,
	0x001000000,
	0x092006018,
	0x0d2206004,
	0x09000b205,
	0x0d0206008,
	0x040000686,
	0x040000683,
	0x001000000,
	0x09200b20a,
	0x0d2206004,


@@ 53,13 54,13 @@ ulong bootcode[]={
	0x0d0206008,
	0x092002080,
	0x0d220600c,
	0x04000051a,
	0x040000517,
	0x001000000,
	0x09200b20f,
	0x0d2206004,
	0x094002002,
	0x0d4206008,
	0x040000701,
	0x0400006fe,
	0x001000000,
	0x090100007,
	0x096100007,


@@ 70,7 71,7 @@ ulong bootcode[]={
	0x001000000,
	0x092006018,
	0x0d2206004,
	0x040000691,
	0x04000068e,
	0x001000000,
	0x0ce206014,
	0x0d200609c,


@@ 79,11 80,11 @@ ulong bootcode[]={
	0x0d0206008,
	0x0d2006014,
	0x0d220600c,
	0x0400006ff,
	0x0400006fc,
	0x001000000,
	0x0d000609c,
	0x0d0206004,
	0x0400006cb,
	0x0400006c8,
	0x001000000,
	0x09000b217,
	0x0d0206004,


@@ 91,7 92,7 @@ ulong bootcode[]={
	0x0d4206008,
	0x0900021b6,
	0x0d020600c,
	0x0400006c9,
	0x0400006c6,
	0x001000000,
	0x092100007,
	0x096100007,


@@ 102,18 103,18 @@ ulong bootcode[]={
	0x001000000,
	0x09200b222,
	0x0d2206004,
	0x0400004d2,
	0x0400004cf,
	0x001000000,
	0x0d00060a8,
	0x0d0022000,
	0x0d0206004,
	0x04000066c,
	0x040000669,
	0x001000000,
	0x0ce206014,
	0x0d40060a8,
	0x0d402a000,
	0x0d4206004,
	0x040000666,
	0x040000663,
	0x001000000,
	0x0ce206010,
	0x0d400609c,


@@ 123,7 124,7 @@ ulong bootcode[]={
	0x0d2206008,
	0x0d4006010,
	0x0d420600c,
	0x0400006d3,
	0x0400006d0,
	0x001000000,
	0x090100007,
	0x0d2006014,


@@ 132,11 133,11 @@ ulong bootcode[]={
	0x001000000,
	0x09000b22a,
	0x0d0206004,
	0x0400004b4,
	0x0400004b1,
	0x001000000,
	0x0d200609c,
	0x0d2206004,
	0x040000696,
	0x040000693,
	0x001000000,
	0x096100000,
	0x0d00060a4,


@@ 152,7 153,7 @@ ulong bootcode[]={
	0x092024008,
	0x0d2026000,
	0x0d220600c,
	0x040000565,
	0x040000562,
	0x001000000,
	0x0d000609c,
	0x096022001,


@@ 163,86 164,84 @@ ulong bootcode[]={
	0x0d62060a8,
	0x0d20060a4,
	0x098027fff,
	0x090002001,
	0x0d0206098,
	0x0d82060a4,
	0x080a30000,
	0x004800013,
	0x001000000,
	0x0d002e000,
	0x0d04a2000,
	0x080a2202d,
	0x0d202e000,
	0x0d24a6000,
	0x080a2602d,
	0x01280000e,
	0x001000000,
	0x0d202e000,
	0x0d24a6001,
	0x080a2606d,
	0x0d002e000,
	0x0d04a2001,
	0x080a2206d,
	0x012800004,
	0x001000000,
	0x090002001,
	0x0d0206098,
	0x092002001,
	0x0d2206098,
	0x098033fff,
	0x09602e004,
	0x0d62060a8,
	0x010bfffed,
	0x001000000,
	0x09200b002,
	0x0d2206004,
	0x09000b241,
	0x0d0206008,
	0x0400005f5,
	0x09000b002,
	0x0d0206004,
	0x09200b241,
	0x0d2206008,
	0x0400005f4,
	0x001000000,
	0x0d20060a4,
	0x080a26002,
	0x0d00060a4,
	0x080a22002,
	0x002800021,
	0x001000000,
	0x0d2006098,
	0x0d2206004,
	0x0400001cf,
	0x0d0006098,
	0x0d0206004,
	0x0400001ce,
	0x001000000,
	0x0d600b0aa,
	0x09010000b,
	0x09210000b,
	0x080a2c000,
	0x004800006,
	0x001000000,
	0x09210000b,
	0x09010000b,
	0x0d6206004,
	0x04000064f,
	0x04000064e,
	0x001000000,
	0x0d000b07e,
	0x080a20000,
	0x0d200b07e,
	0x080a24000,
	0x004800006,
	0x001000000,
	0x0d200b07e,
	0x0d2206004,
	0x040000647,
	0x0d000b07e,
	0x0d0206004,
	0x040000646,
	0x001000000,
	0x090100000,
	0x092100000,
	0x0c020b07e,
	0x0c020b0aa,
	0x092002001,
	0x0d2206004,
	0x0400001b7,
	0x090002001,
	0x0d0206004,
	0x0400001b6,
	0x001000000,
	0x0d600b0aa,
	0x010bfffe8,
	0x001000000,
	0x09200b002,
	0x0d2206004,
	0x0d00060a8,
	0x0d0022004,
	0x0d0206008,
	0x0400005cb,
	0x09000b002,
	0x0d0206004,
	0x0d20060a8,
	0x0d2026004,
	0x0d2206008,
	0x0400005ca,
	0x001000000,
	0x010bfffda,
	0x001000000,
	0x08220600c,
	0x0de206000,
	0x09000b248,
	0x0d0206004,
	0x092002002,
	0x0d2206008,
	0x04000064a,
	0x09200b248,
	0x0d2206004,
	0x090002002,
	0x0d0206008,
	0x040000649,
	0x001000000,
	0x0d0006000,
	0x08200600c,


@@ 251,19 250,18 @@ ulong bootcode[]={
	0x082206024,
	0x0de206000,
	0x09600b0ae,
	0x0d002e000,
	0x080a20000,
	0x00280000e,
	0x0d202e000,
	0x080a24000,
	0x00280000d,
	0x001000000,
	0x0d6206014,
	0x0d002e000,
	0x0d0206004,
	0x0d202e000,
	0x0d2206004,
	0x0d4006028,
	0x0d4206008,
	0x040000583,
	0x040000582,
	0x001000000,
	0x0d6006014,
	0x092100007,
	0x080a1c000,
	0x0128000d3,
	0x001000000,


@@ 476,9 474,9 @@ ulong bootcode[]={
	0x082006024,
	0x081c22008,
	0x001000000,
	0x09202e008,
	0x096100009,
	0x010bfff1d,
	0x09002e008,
	0x096100008,
	0x010bfff1e,
	0x001000000,
	0x082206058,
	0x0de206000,


@@ 701,7 699,7 @@ ulong bootcode[]={
	0x09002e004,
	0x0d020609c,
	0x0d0206004,
	0x07ffffe2f,
	0x07ffffe30,
	0x001000000,
	0x098100007,
	0x09210000c,


@@ 1303,7 1301,7 @@ ulong bootcode[]={
	0x09002e006,
	0x0d020609c,
	0x0d0206004,
	0x07ffffbe1,
	0x07ffffbe2,
	0x001000000,
	0x098100007,
	0x010bffda6,


@@ 1311,7 1309,7 @@ ulong bootcode[]={
	0x09210000b,
	0x0d620609c,
	0x0d6206004,
	0x07ffffbd9,
	0x07ffffbda,
	0x001000000,
	0x098100007,
	0x010bffd9e,


@@ 5912,13 5910,13 @@ ulong bootcode[]={
	0x000000000,
	0x0001fffff,
	0x07fffffff,
	0x0000055d8,
	0x0000056fc,
	0x000004f0c,
	0x00000580c,
	0x000005628,
	0x000005674,
	0x0000056bc,
	0x0000055d0,
	0x0000056f4,
	0x000004f04,
	0x000005804,
	0x000005620,
	0x00000566c,
	0x0000056b4,
	0x000000000,
	0x000000000,
	0x000000000,


@@ 6269,6 6267,8 @@ ulong bootcode[]={
	0x002000000,
	0x000000000,
	0x000000000,
	0x000061f8,
	0x000061f0,
	0x0,
	0x000061f0,
	0x0,
};

M ss/dat.h => ss/dat.h +1 -0
@@ 359,6 359,7 @@ struct Proc
	ulong	pc;			/* DEBUG only */
	int	kp;			/* true if a kernel process */
	int	pidonmach[MAXMACH];	/* TLB pid on each mmu */
	int	nmmuseg;		/* number of segments active in mmu */
};

struct MMU

M ss/devcons.c => ss/devcons.c +8 -5
@@ 300,17 300,20 @@ echo(int c)
		switch(c){
		case 0x14:
			break;	/* pass it on */
		case 'l':
			lancetoggle();
			return;
		case 'm':
			mntdump();
			return;
		case 'p':
			DEBUG();
			return;
		case 'q':
			dumpqueues();
			return;
		case 'l':
			lancetoggle();
			return;
		case 'm':
			mntdump();
		case 'r':
			reset();
			return;
		}
	}else if(c == 0x14){

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

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

TEXT	start(SB), $-4



@@ 28,15 28,10 @@ TEXT	startvirt(SB), $-4
	UNIMP
	RETURN

TEXT	getpsr(SB), $0

	MOVW	PSR, R7
	RETURN

TEXT	swap1(SB), $0

	MOVW	keyaddr+0(FP), R8
	TAS	(R8), R7
	TAS	(R8), R7		/* LDSTUB, thank you ken */
	RETURN

TEXT	swap1_should_work(SB), $0


@@ 110,6 105,12 @@ TEXT	touser(SB), $-4
	MOVW	$(UTZERO+32+4), R8	/* nPC */
	RETT	R7, R8

TEXT	rfnote(SB), $0

	MOVW	0(FP), R1		/* 1st arg is &uregpointer */
	ADD	$4, R1			/* point at ureg */
	JMP	restore

TEXT	traplink(SB), $-4

	/* R8 to R23 are free to play with */


@@ 122,13 123,15 @@ kerneltrap:
	/*
	 * Interrupt or fault from kernel
	 */
	MOVW	R1, (0-(4*(32+5))+(4*1))(R1)	/* save R1=SP */
	ANDN	$7, R1, R20			/* dbl aligned */
	MOVW	R1, (0-(4*(32+6))+(4*1))(R20)	/* save R1=SP */
	/* really clumsy: store these in Ureg so can be restored below */
	MOVW	R2, (0-(4*(32+5))+(4*2))(R1)	/* SB */
	MOVW	R5, (0-(4*(32+5))+(4*5))(R1)	/* USER */
	MOVW	R6, (0-(4*(32+5))+(4*6))(R1)	/* MACH */
	MOVW	R2, (0-(4*(32+6))+(4*2))(R20)	/* SB */
	MOVW	R5, (0-(4*(32+6))+(4*5))(R20)	/* USER */
	MOVW	R6, (0-(4*(32+6))+(4*6))(R20)	/* MACH */
	SUB	$(4*(32+6)), R20, R1

trap1:
	SUB	$(4*(32+5)), R1
	MOVW	Y, R20
	MOVW	R20, (4*(32+0))(R1)		/* Y */
	MOVW	TBR, R20


@@ 143,30 146,19 @@ trap1:
	MOVW	R7, (4*7)(R1)
	RESTORE	R0, R0
	/* now our registers R8-R31 are same as before trap */
	MOVW	R8, (4*8)(R1)
	MOVW	R9, (4*9)(R1)
	MOVW	R10, (4*10)(R1)
	MOVW	R11, (4*11)(R1)
	MOVW	R12, (4*12)(R1)
	MOVW	R13, (4*13)(R1)
	MOVW	R14, (4*14)(R1)
	MOVW	R15, (4*15)(R1)
	MOVW	R16, (4*16)(R1)
	MOVW	R17, (4*17)(R1)
	MOVW	R18, (4*18)(R1)
	MOVW	R19, (4*19)(R1)
	MOVW	R20, (4*20)(R1)
	MOVW	R21, (4*21)(R1)
	MOVW	R22, (4*22)(R1)
	MOVW	R23, (4*23)(R1)
	MOVW	R24, (4*24)(R1)
	MOVW	R25, (4*25)(R1)
	MOVW	R26, (4*26)(R1)
	MOVW	R27, (4*27)(R1)
	MOVW	R28, (4*28)(R1)
	MOVW	R29, (4*29)(R1)
	MOVW	R30, (4*30)(R1)
	MOVW	R31, (4*31)(R1)
	/* save registers two at a time */
	MOVD	R8, (4*8)(R1)
	MOVD	R10, (4*10)(R1)
	MOVD	R12, (4*12)(R1)
	MOVD	R14, (4*14)(R1)
	MOVD	R16, (4*16)(R1)
	MOVD	R18, (4*18)(R1)
	MOVD	R20, (4*20)(R1)
	MOVD	R22, (4*22)(R1)
	MOVD	R24, (4*24)(R1)
	MOVD	R26, (4*26)(R1)
	MOVD	R28, (4*28)(R1)
	MOVD	R30, (4*30)(R1)
	/* SP and SB and u and m are already set; away we go */
	MOVW	R1, -4(R1)		/* pointer to Ureg */
	SUB	$8, R1


@@ 178,43 170,29 @@ trap1:
	JMPL	faultsparc(SB)

	ADD	$8, R1
	MOVW	(4*(32+2))(R1), R7		/* PSR */
	MOVW	R7, PSR
restore:
	MOVW	(4*(32+2))(R1), R8		/* PSR */
	MOVW	R8, PSR
	OR	R0, R0
	OR	R0, R0
	OR	R0, R0

	MOVW	(4*31)(R1), R31
	MOVW	(4*30)(R1), R30
	MOVW	(4*29)(R1), R29
	MOVW	(4*28)(R1), R28
	MOVW	(4*27)(R1), R27
	MOVW	(4*26)(R1), R26
	MOVW	(4*25)(R1), R25
	MOVW	(4*24)(R1), R24
	MOVW	(4*23)(R1), R23
	MOVW	(4*22)(R1), R22
	MOVW	(4*21)(R1), R21
	MOVW	(4*20)(R1), R20
	MOVW	(4*19)(R1), R19
	MOVW	(4*18)(R1), R18
	MOVW	(4*17)(R1), R17
	MOVW	(4*16)(R1), R16
	MOVW	(4*15)(R1), R15
	MOVW	(4*14)(R1), R14
	MOVW	(4*13)(R1), R13
	MOVW	(4*12)(R1), R12
	MOVW	(4*11)(R1), R11
	MOVW	(4*10)(R1), R10
	MOVW	(4*9)(R1), R9
	MOVW	(4*8)(R1), R8
	MOVD	(4*30)(R1), R30
	MOVD	(4*28)(R1), R28
	MOVD	(4*26)(R1), R26
	MOVD	(4*24)(R1), R24
	MOVD	(4*22)(R1), R22
	MOVD	(4*20)(R1), R20
	MOVD	(4*18)(R1), R18
	MOVD	(4*16)(R1), R16
	MOVD	(4*14)(R1), R14
	MOVD	(4*12)(R1), R12
	MOVD	(4*10)(R1), R10
	MOVD	(4*8)(R1), R8
	SAVE	R0, R0
	MOVW	(4*7)(R1), R7
	MOVW	(4*6)(R1), R6
	MOVW	(4*5)(R1), R5
	MOVW	(4*4)(R1), R4
	MOVW	(4*3)(R1), R3
	MOVW	(4*2)(R1), R2
	MOVD	(4*6)(R1), R6
	MOVD	(4*4)(R1), R4
	MOVD	(4*2)(R1), R2
	MOVW	(4*(32+0))(R1), R20		/* Y */
	MOVW	R20, Y
	MOVW	(4*(32+4))(R1), R17		/* PC */


@@ 230,12 208,13 @@ usertrap:
	MOVW	R2, R9
	MOVW	$setSB(SB), R2
	MOVW	$(USERADDR+BY2PG), R1
	MOVW	R8, (0-(4*(32+5))+(4*1))(R1)	/* save R1=SP */
	MOVW	R9, (0-(4*(32+5))+(4*2))(R1)	/* save R2=SB */
	MOVW	R5, (0-(4*(32+5))+(4*5))(R1)	/* save R5=USER */
	MOVW	R6, (0-(4*(32+5))+(4*6))(R1)	/* save R6=MACH */
	MOVW	R8, (0-(4*(32+6))+(4*1))(R1)	/* save R1=SP */
	MOVW	R9, (0-(4*(32+6))+(4*2))(R1)	/* save R2=SB */
	MOVW	R5, (0-(4*(32+6))+(4*5))(R1)	/* save R5=USER */
	MOVW	R6, (0-(4*(32+6))+(4*6))(R1)	/* save R6=MACH */
	MOVW	$USERADDR, R(USER)
	MOVW	$mach0(SB), R(MACH)
	SUB	$(4*(32+6)), R1
	JMP	trap1

TEXT	syslink(SB), $-4


@@ 248,14 227,12 @@ TEXT	syslink(SB), $-4
	MOVW	R2, R9
	MOVW	$setSB(SB), R2
	MOVW	$(USERADDR+BY2PG), R1
	MOVW	R8, (0-(4*(32+5))+4)(R1)	/* save R1=SP */
	SUB	$(4*(32+5)), R1
	MOVW	R8, (0-(4*(32+6))+4)(R1)	/* save R1=SP */
	SUB	$(4*(32+6)), R1
	MOVW	R9, (4*2)(R1)			/* save R2=SB */
	MOVW	R3, (4*3)(R1)			/* global register */
	MOVW	R4, (4*4)(R1)			/* global register */
	MOVW	R5, (4*5)(R1)			/* save R5=USER */
	MOVW	R6, (4*6)(R1)			/* save R6=MACH */
	MOVW	R7, (4*7)(R1)			/* system call number */
	MOVD	R4, (4*4)(R1)			/* global register, R5=USER */
	MOVD	R6, (4*6)(R1)			/* save R6=MACH, R7=syscall# */
	MOVW	$USERADDR, R(USER)
	MOVW	$mach0(SB), R(MACH)
	MOVW	TBR, R20


@@ 285,10 262,8 @@ TEXT	syslink(SB), $-4
	MOVW	(4*15)(R1), R15
	SAVE	R0, R0
	MOVW	(4*6)(R1), R6
	MOVW	(4*5)(R1), R5
	MOVW	(4*4)(R1), R4
	MOVW	(4*3)(R1), R3
	MOVW	(4*2)(R1), R2
	MOVD	(4*4)(R1), R4
	MOVD	(4*2)(R1), R2
	MOVW	(4*(32+4))(R1), R17		/* PC */
	MOVW	(4*(32+3))(R1), R18		/* nPC */
	MOVW	(4*1)(R1), R1	/* restore R1=SP */

M ss/main.c => ss/main.c +2 -63
@@ 11,48 11,9 @@
#include	<gnot.h>

char user[NAMELEN];
char bootline[64];
char bootserver[64];
char bootdevice[64];

uchar *intrreg;

void unloadboot(void);

#ifdef asdf
static int ok;
int
Xprint(char *fmt, ...)
{
	char buf[PRINTSIZE];
	int n;

	if(!ok){
		sccsetup();
		ok = 1;
	}
	n = doprint(buf, buf+sizeof(buf), fmt, (&fmt+1)) - buf;
	sccputs(buf);
	return n;
}

void
putx(ulong x)
{
	int i;

	if(!ok){
		sccsetup();
		ok = 1;
	}
	for(i=0; i<8; i++){
		sccputc("0123456789ABCDEF"[x>>28]);
		x <<= 4;
	}
	sccputc('\n');
}
#endif

void
main(void)
{


@@ 61,15 22,13 @@ main(void)
	u = 0;
	memset(&edata, 0, (char*)&end-(char*)&edata);

	unloadboot();
	machinit();
	confinit();
	mmuinit();
	printinit();
	print("sparc plan 9 %lux\n", getb2(ENAB));
	print("sparc plan 9\n");
	trapinit();
	kmapinit();
	print("sparc plan 9 %lux\n", getb2(ENAB));
	cacheinit();
	intrinit();
	procinit0();


@@ 102,14 61,6 @@ reset(void)
	putb2(ENAB, ENABRESET);
}

void
unloadboot(void)
{
	strncpy(user, "bootes", sizeof user);
	memcpy(bootline, "9s", sizeof bootline);
	memcpy(bootserver, "bootes", sizeof bootserver);
	memcpy(bootdevice, "parnfucky", sizeof bootdevice);
}

void
machinit(void)


@@ 141,18 92,6 @@ init0(void)
	
	u->slash = (*devtab[0].attach)(0);
	u->dot = clone(u->slash, 0);
	if(!waserror()){
		c = namec("#e/bootline", Acreate, OWRITE, 0600);
		(*devtab[c->type].write)(c, bootline, 64);
		close(c);
		c = namec("#e/bootserver", Acreate, OWRITE, 0600);
		(*devtab[c->type].write)(c, bootserver, 64);
		close(c);
		c = namec("#e/bootdevice", Acreate, OWRITE, 0600);
		(*devtab[c->type].write)(c, bootdevice, 2);
		close(c);
	}
	poperror();

	touser(USTKTOP-5*BY2WD);
}


@@ 304,7 243,7 @@ confinit(void)
	conf.npage0 = (4*1024*1024)/BY2PG;	/* BUG */
	conf.npage1 = 0*(4*1024*1024)/BY2PG;	/* BUG */
	conf.base0 = 0;
	conf.base1 = 16*1024*1024;
	conf.base1 = 32*1024*1024;
	conf.npage = conf.npage0+conf.npage1;
	conf.maxialloc = 4*1024*1024;		/* BUG */
	mul = 1;

M ss/mem.h => ss/mem.h +1 -1
@@ 46,7 46,7 @@
 */

#define	USERADDR	0xE0000000
#define	UREGADDR	(USERADDR+BY2PG-((32+5)*BY2WD))
#define	UREGADDR	(USERADDR+BY2PG-((32+6)*BY2WD))
#define	BOOTSTACK	(KTZERO-0*BY2PG)
#define	TRAPS		(KTZERO-2*BY2PG)


M ss/mmu.c => ss/mmu.c +33 -10
@@ 79,17 79,18 @@ newpid(Proc *p)
	putcontext(i-1);

	/*
	 * kludge: each context is allowed NKLUDGE pmegs, NKLUDGE-1 for text & data and 1 for stack
	 * kludge: each context is allowed NKLUDGE pmegs.
	 * NKLUDGE-1 for text & data and 1 for stack.
	 * initialize by giving just a stack segment.
	 */
	i--;	/* now i==context */
	p->nmmuseg = 0;
	for(j=0; j<NKLUDGE-1; j++)
		putsegm(UZERO+j*BY2SEGM, kmapalloc.lowpmeg+(NKLUDGE*(i-1))+j);
	putsegm(TSTKTOP-BY2SEGM, kmapalloc.lowpmeg+(NKLUDGE*(i-1))+(NKLUDGE-1));
	for(j=0; j<PG2SEGM; j++){
		for(k=0; k<NKLUDGE-1; k++)
			putpmeg(UZERO+k*BY2SEGM+j*BY2PG, INVALIDPTE);
		putsegm(UZERO+j*BY2SEGM, INVALIDPMEG);
	putsegm(TSTKTOP-BY2SEGM, kmapalloc.lowpmeg+NKLUDGE*i+(NKLUDGE-1));
	for(j=0; j<PG2SEGM; j++)
		putpmeg((TSTKTOP-BY2SEGM)+j*BY2PG, INVALIDPTE);
	}
	return i;
	return i+1;
}

void


@@ 205,6 206,8 @@ putmmu(ulong tlbvirt, ulong tlbphys)
{
	short tp;
	Proc *p;
	ulong seg, l;
	int j, k;

	splhi();
	p = u->p;


@@ 216,10 219,30 @@ putmmu(ulong tlbvirt, ulong tlbphys)
	/*
	 * kludge part 2: make sure we've got a valid segment
	 */
	if(tlbvirt>=TSTKTOP || (UZERO+(NKLUDGE-1)*BY2SEGM<=tlbvirt && tlbvirt<(TSTKTOP-BY2SEGM))){
		pprint("putmmu %lux", tlbvirt);
	if(TSTKTOP-BY2SEGM<=tlbvirt && tlbvirt<TSTKTOP)	/* stack; easy */
		goto put;
	/* UZERO is known to be zero here */
	if(tlbvirt < UZERO+p->nmmuseg*BY2SEGM)		/* in range; easy */
		goto put;
	seg = tlbvirt/BY2SEGM;
	if(seg >= (UZERO/BY2SEGM)+(NKLUDGE-1)){
		pprint("putmmu %lux\n", tlbvirt);
print("putmmu %lux %d %s\n", tlbvirt, seg, p->text);
		pexit("Suicide", 1);
	}
	/*
	 * Prepare mmu up to this address
	 */
	tp--;	/* now tp==context */
	tp = tp*NKLUDGE;
	l = UZERO+p->nmmuseg*BY2SEGM;
	for(j=p->nmmuseg; j<=seg; j++){
		putsegm(l, kmapalloc.lowpmeg+tp+j);
		for(k=0; k<PG2SEGM; k++,l+=BY2PG)
			putpmeg(l, INVALIDPTE);
	}
	p->nmmuseg = seg+1;
    put:
	putpmeg(tlbvirt, tlbphys);
	spllo();
}

M ss/screen.c => ss/screen.c +215 -52
@@ 30,9 30,9 @@ GBitmap	gscreen =
{
	(ulong*)SCREENSEGM,
	0,
	1160/32,
	1152/32,
	0,
	{0, 0, 1160, 900},
	{0, 0, 1152, 900},
	0
};



@@ 295,13 295,18 @@ duartintr(void)
}

/*
 * Map is indexed by keyboard char, output is ASCII
 * Map is indexed by keyboard char, output is ASCII.
 * Gnotisms: Return sends newline and Line Feed sends carriage return.
 * Delete and Backspace both send backspace.
 * Num Lock sends delete (rubout).
 * Alt Graph is VIEW (scroll).
 * Compose builds Latin-1 characters.
 */
uchar keymap[128] = {
/*	00    L1    02    L2    04    F1    F2    07	*/
	0xFF, 0x80, 0xFF, 0x81, 0xFF, 0x82, 0x83, 0xFF,
/*	F3    09    F4    0b    F5    0d    F6    0f  	*/
	0x84, 0xFF, 0x85, 0xFF, 0x86, 0xFF, 0x87, 0xFF,
/*	F3    09    F4    0b    F5    altgr F6    0f  	*/
	0x84, 0xFF, 0x85, 0xFF, 0x86, 0x80, 0x87, 0xFF,
/*	F7    F8    F9    Alt   14    R1    R2    R3	*/
	0x88, 0x89, 0x8a, 0x8b, 0xFF, 0x8c, 0x8d, 0x8e,
/*	18    L3    L4    1b    1c    Esc   1     2	*/


@@ 310,33 315,33 @@ uchar keymap[128] = {
	'3',  '4',  '5',  '6',  '7',  '8',  '9',  '0',
/*	-     =     `     bs    2c    R4    R5    R6	*/
	'-',  '=',  '`',  '\b', 0xFF, 0x91, 0x92, 0x93,
/*	30    L5    L6    33    34    tab   q     w  	*/
	0xFF, 0x94, 0x95, 0xFF, 0xFF, '\t', 'q',  'w',
/*	30    L5    del   L6   34    tab   q     w  	*/
	0xFF, 0x94, 0xFF, 0x95, 0xFF, '\t', 'q',  'w',
/*	e     r     t     y     u     i     o     p    	*/
	'e',  'r',  't',  'y',  'u',  'i',  'o',  'p',
/*	[     ]     del   43    R7    R8    R9    47   	*/
	'[',  ']',  0x7F, 0xFF, 0x96, 0x97, 0x98, 0xFF,
/*	[     ]     dele  comp  R7    R8    R9    r -	*/
	'[',  ']',  '\b', 0xB6, 0x96, 0x97, 0x98, 0xFF,
/*	L7    L8    4a    4b    ctrl  a     s     d	*/
	0x99, 0x9a, 0xFF, 0xFF, 0xF0, 'a',  's',  'd',
/*	f     g     h     j     k     l     ;     '   	*/
	'f',  'g',  'h',  'j',  'k',  'l',  ';',  '\'',
/*	\     ret   5a    R10   R11   R12   5e    L9	*/
/*	\     ret   enter R10   R11   R12   ins   L9	*/
	'\\', '\n', 0xFF, 0x9b, 0x9c, 0x9d, 0xFF, 0x9e, 
/*	60    L10   62    shift z     x     c     v	*/
	0xFF, 0x9f, 0xFF, 0xF1, 'z',  'x',  'c', 'v',
/*	60    L10   numlk shift z     x     c     v	*/
	0xFF, 0x9f, 0x7F, 0xF1, 'z',  'x',  'c', 'v',
/*	b     n     m     ,     .     /     shift lf	*/
	'b',  'n',  'm',  ',',  '.',  '/',  0xF1, '\r',
/*	R13   R14   R15   73    74    75    76    caps	*/
/*	R13   R14   R15   73    74    75    help  caps	*/
	0xA0, 0xA1, 0xA2, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2,
/*	left  79    right 7b    7c    7d    7e    7f	*/
/*	lloz  79    rloz  7b    7c    r +   7e    7f	*/
	0xA3, ' ',  0xA4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
};

uchar keymapshift[128] = {
/*	00    L1    02    L2    04    F1    F2    07	*/
	0xFF, 0x80, 0xFF, 0x81, 0xFF, 0x82, 0x83, 0xFF,
/*	F3    09    F4    0b    F5    0d    F6    0f  	*/
	0x84, 0xFF, 0x85, 0xFF, 0x86, 0xFF, 0x87, 0xFF,
/*	F3    09    F4    0b    F5    altgr F6    0f  	*/
	0x84, 0xFF, 0x85, 0xFF, 0x86, 0x80, 0x87, 0xFF,
/*	F7    F8    F9    Alt   14    R1    R2    R3	*/
	0x88, 0x89, 0x8a, 0x8b, 0xFF, 0x8c, 0x8d, 0x8e,
/*	18    L3    L4    1b    1c    Esc   1     2	*/


@@ 345,33 350,33 @@ uchar keymapshift[128] = {
	'#',  '$',  '%',  '^',  '&',  '*',  '(',  ')',
/*	-     =     `     bs    2c    R4    R5    R6	*/
	'_',  '+',  '~',  '\b', 0xFF, 0x91, 0x92, 0x93,
/*	30    L5    L6    33    34    tab   q     w  	*/
	0xFF, 0x94, 0x95, 0xFF, 0xFF, '\t', 'Q',  'W',
/*	30    L5    del   L6    34    tab   q     w  	*/
	0xFF, 0x94, 0xFF, 0x95, 0xFF, '\t', 'Q',  'W',
/*	e     r     t     y     u     i     o     p    	*/
	'E',  'R',  'T',  'Y',  'U',  'I',  'O',  'P',
/*	[     ]     del   43    R7    R8    R9    47   	*/
	'{',  '}',  0x7F, 0xFF, 0x96, 0x97, 0x98, 0xFF,
/*	[     ]     dele  comp  R7    R8    R9    r -	*/
	'{',  '}',  '\b', 0xB6, 0x96, 0x97, 0x98, 0xFF,
/*	L7    L8    4a    4b    ctrl  a     s     d	*/
	0x99, 0x9a, 0xFF, 0xFF, 0xF0, 'A',  'S',  'D',
/*	f     g     h     j     k     l     ;     '   	*/
	'F',  'G',  'H',  'J',  'K',  'L',  ':',  '"',
/*	\     ret   5a    R10   R11   R12   5e    L9	*/
/*	\     ret   enter R10   R11   R12   ins   L9	*/
	'|', '\n',  0xFF, 0x9b, 0x9c, 0x9d, 0xFF, 0x9e, 
/*	60    L10   62    shift z     x     c     v	*/
	0xFF, 0x9f, 0xFF, 0xF1, 'Z',  'X',  'C', 'V',
/*	60    L10   numlk shift z     x     c     v	*/
	0xFF, 0x9f, 0x7F, 0xF1, 'Z',  'X',  'C', 'V',
/*	b     n     m     ,     .     /     shift lf	*/
	'B',  'N',  'M',  '<',  '>',  '?',  0xF1, '\r',
/*	R13   R14   R15   73    74    75    76    caps	*/
/*	R13   R14   R15   73    74    75    help  caps	*/
	0xA0, 0xA1, 0xA2, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2,
/*	left  79    right 7b    7c    7d    7e    7f	*/
/*	lloz  79    rloz  7b    7c    r +  7e    7f	*/
	0xA3, ' ',  0xA4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
};

uchar keymapctrl[128] = {
/*	00    L1    02    L2    04    F1    F2    07	*/
	0xFF, 0x80, 0xFF, 0x81, 0xFF, 0x82, 0x83, 0xFF,
/*	F3    09    F4    0b    F5    0d    F6    0f  	*/
	0x84, 0xFF, 0x85, 0xFF, 0x86, 0xFF, 0x87, 0xFF,
/*	F3    09    F4    0b    F5    altgr F6    0f  	*/
	0x84, 0xFF, 0x85, 0xFF, 0x86, 0x80, 0x87, 0xFF,
/*	F7    F8    F9    Alt   14    R1    R2    R3	*/
	0x88, 0x89, 0x8a, 0x8b, 0xFF, 0x8c, 0x8d, 0x8e,
/*	18    L3    L4    1b    1c    Esc   1     2	*/


@@ 380,33 385,33 @@ uchar keymapctrl[128] = {
	'#',  '$',  '%',  '^',  '&',  '*',  '(',  ')',
/*	-     =     `     bs    2c    R4    R5    R6	*/
	'_',  '+',  '~', '\b', 0xFF, 0x91, 0x92, 0x93,
/*	30    L5    L6    33    34    tab   q     w  	*/
	0xFF, 0x94, 0x95, 0xFF, 0xFF, '\t', 0x11, 0x17,
/*	30    L5    del   L6    34    tab   q     w  	*/
	0xFF, 0x94, 0xFF, 0x95, 0xFF, '\t', 0x11, 0x17,
/*	e     r     t     y     u     i     o     p    	*/
	0x05, 0x12, 0x14, 0x19, 0x15, 0x09, 0x0F, 0x10,
/*	[     ]     del   43    R7    R8    R9    47   	*/
	0x1B, 0x1D, 0x7F, 0xFF, 0x96, 0x97, 0x98, 0xFF,
/*	[     ]     dele  comp  R7    R8    R9    r -	*/
	0x1B, 0x1D, '\b', 0xB6, 0x96, 0x97, 0x98, 0xFF,
/*	L7    L8    4a    4b    ctrl  a     s     d	*/
	0x99, 0x9a, 0xFF, 0xFF, 0xF0, 0x01, 0x13, 0x04,
/*	f     g     h     j     k     l     ;     '   	*/
	0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C,':',  '"',
/*	\     ret   5a    R10   R11   R12   5e    L9	*/
/*	\     ret   enter R10   R11   R12   ins   L9	*/
	0x1C, '\n',  0xFF, 0x9b, 0x9c, 0x9d, 0xFF, 0x9e, 
/*	60    L10   62    shift z     x     c     v	*/
	0xFF, 0x9f, 0xFF, 0xF1, 0x1A, 0x18, 0x03, 0x16,
/*	60    L10   numlk shift z     x     c     v	*/
	0xFF, 0x9f, 0x7F, 0xF1, 0x1A, 0x18, 0x03, 0x16,
/*	b     n     m     ,     .     /     shift lf	*/
	0x02, 0x0E, 0x0D, '<',  '>',  '?',  0xF1, '\r',
/*	R13   R14   R15   73    74    75    76    caps	*/
/*	R13   R14   R15   73    74    75    help  caps	*/
	0xA0, 0xA1, 0xA2, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2,
/*	left  79    right 7b    7c    7d    7e    7f	*/
/*	lloz  79    rloz  7b    7c    r +  7e    7f	*/
	0xA3, ' ',  0xA4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
};

uchar keymapshiftctrl[128] = {
/*	00    L1    02    L2    04    F1    F2    07	*/
	0xFF, 0x80, 0xFF, 0x81, 0xFF, 0x82, 0x83, 0xFF,
/*	F3    09    F4    0b    F5    0d    F6    0f  	*/
	0x84, 0xFF, 0x85, 0xFF, 0x86, 0xFF, 0x87, 0xFF,
/*	F3    09    F4    0b    F5    altgr F6    0f  	*/
	0x84, 0xFF, 0x85, 0xFF, 0x86, 0x80, 0x87, 0xFF,
/*	F7    F8    F9    Alt   14    R1    R2    R3	*/
	0x88, 0x89, 0x8a, 0x8b, 0xFF, 0x8c, 0x8d, 0x8e,
/*	18    L3    L4    1b    1c    Esc   1     2	*/


@@ 415,25 420,25 @@ uchar keymapshiftctrl[128] = {
	'#',  '$',  '%',  0x1E, '&',  '*',  '(',  ')',
/*	-     =     `     bs    2c    R4    R5    R6	*/
	0x1F, '+',  '~', '\b', 0xFF, 0x91, 0x92, 0x93,
/*	30    L5    L6    33    34    tab   q     w  	*/
	0xFF, 0x94, 0x95, 0xFF, 0xFF, '\t', 0x11, 0x17,
/*	30    L5    del   L6     34    tab   q     w  	*/
	0xFF, 0x94, 0xFF, 0x95, 0xFF, '\t', 0x11, 0x17,
/*	e     r     t     y     u     i     o     p    	*/
	0x05, 0x12, 0x14, 0x19, 0x15, 0x09, 0x0F, 0x10,
/*	[     ]     del   43    R7    R8    R9    47   	*/
	0x1B, 0x1D, 0x7F, 0xFF, 0x96, 0x97, 0x98, 0xFF,
/*	[     ]     dele  comp  R7    R8    R9    r -	*/
	0x1B, 0x1D, '\b', 0xB6, 0x96, 0x97, 0x98, 0xFF,
/*	L7    L8    4a    4b    ctrl  a     s     d	*/
	0x99, 0x9a, 0xFF, 0xFF, 0xF0, 0x01, 0x13, 0x04,
/*	f     g     h     j     k     l     ;     '   	*/
	0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C,':',  '"',
/*	\     ret   5a    R10   R11   R12   5e    L9	*/
	0x1C, '\n',  0xFF, 0x9b, 0x9c, 0x9d, 0xFF, 0x9e, 
/*	60    L10   62    shift z     x     c     v	*/
	0xFF, 0x9f, 0xFF, 0xF1, 0x1A, 0x18, 0x03, 0x16,
/*	\     ret   enter R10   R11   R12   ins   L9	*/
	0x1C, '\n', 0xFF, 0x9b, 0x9c, 0x9d, 0xFF, 0x9e, 
/*	60    L10   numlk shift z     x     c     v	*/
	0xFF, 0x9f, 0x7F, 0xF1, 0x1A, 0x18, 0x03, 0x16,
/*	b     n     m     ,     .     /     shift lf	*/
	0x02, 0x0E, 0x0D, '<',  '>',  '?',  0xF1, '\r',
/*	R13   R14   R15   73    74    75    76    caps	*/
/*	R13   R14   R15   73    74    75    help  caps	*/
	0xA0, 0xA1, 0xA2, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2,
/*	left  79    right 7b    7c    7d    7e    7f	*/
/*	lloz  79    rloz  7b    7c    r +  7e    7f	*/
	0xA3, ' ',  0xA4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
};



@@ 444,6 449,146 @@ static uchar *kbdmap[4] = {
	keymapshiftctrl
};

struct latin
{
	uchar	l;
	char	c[2];
}latintab[] = {
	'€',	"!!",	/* spanish initial ! */
	'€',	"c|",	/* cent */
	'€',	"c$",	/* cent */
	'€',	"l$",	/* pound sterling */
	'€',	"g$",	/* general currency */
	'€',	"y$",	/* yen */
	'€',	"j$",	/* yen */
	'€',	"||",	/* broken vertical bar */
	'€',	"SS",	/* section symbol */
	'€',	"\"\"",	/* dieresis */
	'€',	"cr",	/* copyright */
	'€',	"cO",	/* copyright */
	'€',	"sa",	/* super a, feminine ordinal */
	'€',	"<<",	/* left angle quotation */
	'€',	"no",	/* not sign, hooked overbar */
	'€',	"--",	/* soft hyphen */
	'€',	"rg",	/* registered trademark */
	'€',	"__",	/* macron */
	'€',	"s0",	/* degree (sup o) */
	'€',	"+-",	/* plus-minus */
	'€',	"s2",	/* sup 2 */
	'€',	"s3",	/* sup 3 */
	'€',	"''",	/* grave accent */
	'€',	"mu",	/* mu */
	'€',	"pg",	/* paragraph (pilcrow) */
	'€',	"..",	/* centered . */
	'€',	",,",	/* cedilla */
	'€',	"s1",	/* sup 1 */
	'€',	"so",	/* sup o */
	'€',	">>",	/* right angle quotation */
	'€',	"14",	/* 1/4 */
	'€',	"12",	/* 1/2 */
	'€',	"34",	/* 3/4 */
	'€',	"??",	/* spanish initial ? */
	'€',	"A`",	/* A grave */
	'€',	"A'",	/* A acute */
	'€',	"A^",	/* A circumflex */
	'€',	"A~",	/* A tilde */
	'€',	"A\"",	/* A dieresis */
	'€',	"A:",	/* A dieresis */
	'€',	"Ao",	/* A circle */
	'€',	"AO",	/* A circle */
	'€',	"Ae",	/* AE ligature */
	'€',	"AE",	/* AE ligature */
	'€',	"C,",	/* C cedilla */
	'€',	"E`",	/* E grave */
	'€',	"E'",	/* E acute */
	'€',	"E^",	/* E circumflex */
	'€',	"E\"",	/* E dieresis */
	'€',	"E:",	/* E dieresis */
	'€',	"I`",	/* I grave */
	'€',	"I'",	/* I acute */
	'€',	"I^",	/* I circumflex */
	'€',	"I\"",	/* I dieresis */
	'€',	"I:",	/* I dieresis */
	'€',	"D-",	/* Eth */
	'€',	"N~",	/* N tilde */
	'€',	"O`",	/* O grave */
	'€',	"O'",	/* O acute */
	'€',	"O^",	/* O circumflex */
	'€',	"O~",	/* O tilde */
	'€',	"O\"",	/* O dieresis */
	'€',	"O:",	/* O dieresis */
	'€',	"OE",	/* O dieresis */
	'€',	"Oe",	/* O dieresis */
	'€',	"xx",	/* times sign */
	'€',	"O/",	/* O slash */
	'€',	"U`",	/* U grave */
	'€',	"U'",	/* U acute */
	'€',	"U^",	/* U circumflex */
	'€',	"U\"",	/* U dieresis */
	'€',	"U:",	/* U dieresis */
	'€',	"UE",	/* U dieresis */
	'€',	"Ue",	/* U dieresis */
	'€',	"Y'",	/* Y acute */
	'€',	"P|",	/* Thorn */
	'€',	"Th",	/* Thorn */
	'€',	"TH",	/* Thorn */
	'€',	"ss",	/* sharp s */
	'€',	"a`",	/* a grave */
	'€',	"a'",	/* a acute */
	'€',	"a^",	/* a circumflex */
	'€',	"a~",	/* a tilde */
	'€',	"a\"",	/* a dieresis */
	'€',	"a:",	/* a dieresis */
	'€',	"ao",	/* a circle */
	'€',	"ae",	/* ae ligature */
	'€',	"c,",	/* c cedilla */
	'€',	"e`",	/* e grave */
	'€',	"e'",	/* e acute */
	'€',	"e^",	/* e circumflex */
	'€',	"e\"",	/* e dieresis */
	'€',	"e:",	/* e dieresis */
	'€',	"i`",	/* i grave */
	'€',	"i'",	/* i acute */
	'€',	"i^",	/* i circumflex */
	'€',	"i\"",	/* i dieresis */
	'€',	"i:",	/* i dieresis */
	'€',	"d-",	/* eth */
	'€',	"n~",	/* n tilde */
	'€',	"o`",	/* o grave */
	'€',	"o'",	/* o acute */
	'€',	"o^",	/* o circumflex */
	'€',	"o~",	/* o tilde */
	'€',	"o\"",	/* o dieresis */
	'€',	"o:",	/* o dieresis */
	'€',	"oe",	/* o dieresis */
	'€',	"-:",	/* divide sign */
	'€',	"o/",	/* o slash */
	'€',	"u`",	/* u grave */
	'€',	"u'",	/* u acute */
	'€',	"u^",	/* u circumflex */
	'€',	"u\"",	/* u dieresis */
	'€',	"u:",	/* u dieresis */
	'€',	"ue",	/* u dieresis */
	'€',	"y'",	/* y acute */
	'€',	"th",	/* thorn */
	'€',	"p|",	/* thorn */
	'€',	"y\"",	/* y dieresis */
	'€',	"y:",	/* y dieresis */
	0,	0,
};

int
latin1(int k1, int k2)
{
	int i;
	struct latin *l;

	for(l=latintab; l->l; l++)
		if(k1==l->c[0] && k2==l->c[1])
			return l->l;
	return 0;
}

void
kbdstate(int c)
{


@@ 451,10 596,10 @@ kbdstate(int c)
	static caps = 0;
	static repeatc = -1;
	static long startclick;
	static int kbdstate, k1, k2;
	int tc;

	tc = kbdmap[shift][c&0x7F];

/*
	if(c==0xFFFF && repeatc!=-1 && clicks>startclick+40 && (clicks-startclick)%3==0){
		kbdc = repeatc;


@@ 507,7 652,25 @@ kbdstate(int c)
/*
	startclick = clicks;
*/
	if(tc == 0x10)		/* ctrl-p */
		reset();
	kbdchar(tc);
	if(tc == 0xB6)	/* Compose */
		kbdstate = 1;
	else{
		switch(kbdstate){
		case 1:
			k1 = tc;
			kbdstate = 2;
			break;
		case 2:
			k2 = tc;
			tc = latin1(k1, k2);
			if(c == 0){
				kbdchar(k1);
				tc = k2;
			}
			/* fall through */
		default:
			kbdstate = 0;
			kbdchar(tc);
		}
	}
}

M ss/trap.c => ss/trap.c +4 -7
@@ 80,7 80,6 @@ trap(Ureg *ur)
/*	if(u)
		u->p->pc = ur->pc;		/* BUG */
	if(user){
		print("user trap: %s pc=0x%lux\n", excname(tbr), ur->pc);
		sprint(buf, "sys: trap: pc=0x%lux %s", ur->pc, excname(tbr));
		postnote(u->p, 1, buf, NDebug);
	}else{


@@ 89,11 88,8 @@ trap(Ureg *ur)
for(;;);
		exit();
	}
	if(user && u->nnote){
		print("notify %d\n", u->p->pid);
	if(user && u->nnote)
		notify(ur);
		print("notifyed %d\n", u->p->pid);
	}
}

void


@@ 162,7 158,7 @@ notify(Ureg *ur)
	ulong sp;

	lock(&u->p->debug);
	if(u->nnote == 0){
	if(u->nnote==0){
		unlock(&u->p->debug);
		return;
	}


@@ 188,6 184,7 @@ notify(Ureg *ur)
		*(ulong*)(sp+0*BY2WD) = 0;		/* arg 0 is pc */
		ur->usp = sp;
		ur->pc = (ulong)u->notify;
		ur->npc = (ulong)u->notify+4;
		u->notified = 1;
		u->nnote--;
		memcpy(&u->note[0], &u->note[1], u->nnote*sizeof(Note));


@@ 208,6 205,7 @@ noted(Ureg **urp)
	}
	u->notified = 0;
	memcpy(*urp, u->ureg, sizeof(Ureg));
	(*urp)->r7 = -1;	/* return error from the interrupted call */
	unlock(&u->p->debug);
	splhi();
	rfnote(urp);


@@ 323,7 321,6 @@ void
execpc(ulong entry)
{
	((Ureg*)UREGADDR)->pc = entry - 4;		/* syscall advances it */
	((Ureg*)UREGADDR)->npc = entry;
}

#include "errstr.h"

M ss/ureg.h => ss/ureg.h +1 -0
@@ 41,4 41,5 @@ struct Ureg
	ulong	psr;
	ulong	npc;
	ulong	pc;
	ulong	pad;	/* so structure is double word aligned */
};