From 3eff877ca4b1c18ed5e6f801a8343d7d8c2882f9 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Sat, 12 Jan 1991 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1991-01-12 --- gnot/devcons.c | 3 + gnot/l.s | 18 ++++ gnot/screen.c | 4 +- gnot/vec.s | 3 +- port/devnonet.c | 2 +- port/devscsi.c | 4 +- port/devwren.c | 136 ++++++++++++++++++------ port/stnoether.c | 2 +- ss/boot.c | 1 - ss/boot.h | 166 ++++++++++++++--------------- ss/dat.h | 1 + ss/devcons.c | 13 ++- ss/l.s | 139 ++++++++++-------------- ss/main.c | 65 +----------- ss/mem.h | 2 +- ss/mmu.c | 43 ++++++-- ss/screen.c | 267 ++++++++++++++++++++++++++++++++++++++--------- ss/trap.c | 11 +- ss/ureg.h | 1 + 19 files changed, 539 insertions(+), 342 deletions(-) diff --git a/gnot/devcons.c b/gnot/devcons.c index f1c25ca95bc8a7d6672e81124147932dcb46ed29..db3b99f11770fedc2714352754727df63247ebd8 100644 --- a/gnot/devcons.c +++ b/gnot/devcons.c @@ -308,6 +308,9 @@ echo(int c) case 'q': dumpqueues(); return; + case 'r': + panic("you asked for it"); + break; case 'm': mntdump(); return; diff --git a/gnot/l.s b/gnot/l.s index 00a004b838b31444a19b39eed16ecbfcdc30905f..63759ea918815f9925e62fde3114d51d703e6fac 100644 --- a/gnot/l.s +++ b/gnot/l.s @@ -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 diff --git a/gnot/screen.c b/gnot/screen.c index f946c67e0549dedef9befab8450f39c6322e23d5..f9a045fc6ee22989c3cb5dbaea6f2d5a03e66fc4 100644 --- a/gnot/screen.c +++ b/gnot/screen.c @@ -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 diff --git a/gnot/vec.s b/gnot/vec.s index 5ea0e2b41222f73f2c2c1fcb66b635a1db64fef9..5d0c94bfef81bc453b2dcdad434f9cd12524b019 100644 --- a/gnot/vec.s +++ b/gnot/vec.s @@ -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 */ diff --git a/port/devnonet.c b/port/devnonet.c index cc7b77f632712cd46962beb8da6a73733f86bd77..6d4cfd2988f05fc5682c04293304857debe29cee 100644 --- a/port/devnonet.c +++ b/port/devnonet.c @@ -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; } diff --git a/port/devscsi.c b/port/devscsi.c index ec9a033ef8f0e26cdc9b1b2c303627a0850272e8..a463f6804d7e69a0c06fbb05dea453976806d28f 100644 --- a/port/devscsi.c +++ b/port/devscsi.c @@ -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; diff --git a/port/devwren.c b/port/devwren.c index fcdd38c5754700ef0ec9cf05c1065e35b75d6f62..e71f8542507095b606a5823ea8c0ad782aac0924 100644 --- a/port/devwren.c +++ b/port/devwren.c @@ -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; diff --git a/port/stnoether.c b/port/stnoether.c index 212f0dc879f4a305d9aa441a0852a340f34af767..78256885f5a728113c1b98a33d0e8932547a42d6 100644 --- a/port/stnoether.c +++ b/port/stnoether.c @@ -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; diff --git a/ss/boot.c b/ss/boot.c index 89c4efff976cd40abfd07959dc8479b49a41053c..22356dda91bb01a618691653ea5c9188789f3131 100644 --- a/ss/boot.c +++ b/ss/boot.c @@ -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') diff --git a/ss/boot.h b/ss/boot.h index c7cf54020297cc0386e51082580aff5dd1431def..f9d0b0ebbc89de56ad46b2b5368cacf1bd2b56b3 100644 --- a/ss/boot.h +++ b/ss/boot.h @@ -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, }; diff --git a/ss/dat.h b/ss/dat.h index 1580b742e5b0427c23c1484008c321c681a01cf4..28bf8bcdd2482da8945ab1c55af370ea13e291bc 100644 --- a/ss/dat.h +++ b/ss/dat.h @@ -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 diff --git a/ss/devcons.c b/ss/devcons.c index 478a92c1baced75dc1aa3ea3219f4bbb200dd7d6..43ed3a78676bf9ee0894774eb24f2b4bec4157f1 100644 --- a/ss/devcons.c +++ b/ss/devcons.c @@ -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){ diff --git a/ss/l.s b/ss/l.s index 7890c05c10e5d13918f1219283b6291b3eefa7e7..f4f4511509d4cef17cc65b288819da0b7502fe15 100644 --- a/ss/l.s +++ b/ss/l.s @@ -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 */ diff --git a/ss/main.c b/ss/main.c index f24fac2955a81905f66b16f7e6cc3bedee9b55af..4001db5d06d0a0859bcb5cbd2ce3efc22ef8869a 100644 --- a/ss/main.c +++ b/ss/main.c @@ -11,48 +11,9 @@ #include 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; diff --git a/ss/mem.h b/ss/mem.h index c074081bdc15f21c8cf78d6bbda59fc6c9227a30..354bd05e8e06255f40b169f77197a32068d50e4c 100644 --- a/ss/mem.h +++ b/ss/mem.h @@ -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) diff --git a/ss/mmu.c b/ss/mmu.c index 08098560263dbcce5819ff6876b0ffa0f9a5fb47..e2ad5f92f7a4429446e6237068cf7956dcfcbdc3 100644 --- a/ss/mmu.c +++ b/ss/mmu.c @@ -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; jp; @@ -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 && tlbvirtnmmuseg*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; knmmuseg = seg+1; + put: putpmeg(tlbvirt, tlbphys); spllo(); } diff --git a/ss/screen.c b/ss/screen.c index 80e64436887e085cacffbdeb4ed10c766ddf6b79..163329f2b4cc064b95cfbd3a401a8f6579510a21 100644 --- a/ss/screen.c +++ b/ss/screen.c @@ -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); + } + } } diff --git a/ss/trap.c b/ss/trap.c index 9f84628913315ec53607203c8cf4746bd837b471..c474df0052d091b458e381909e6facc64e7b2aad 100644 --- a/ss/trap.c +++ b/ss/trap.c @@ -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" diff --git a/ss/ureg.h b/ss/ureg.h index f6922bc188831166417c3e66118b52f4221b8443..8433eec95d4b915d80609cf8c6ad2ab46fda7e21 100644 --- a/ss/ureg.h +++ b/ss/ureg.h @@ -41,4 +41,5 @@ struct Ureg ulong psr; ulong npc; ulong pc; + ulong pad; /* so structure is double word aligned */ };