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 */
};