From 362308540b5cf580593f0a82d073a4de5fe41c2e Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Thu, 6 Aug 1992 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1992-08-06 --- gnot/fns.h | 1 + gnot/l.s | 1 - gnot/trap.c | 11 ++- pc/dat.h | 14 ++- pc/fns.h | 1 + pc/kbd.c | 32 +++---- pc/l.s | 5 ++ pc/main.c | 21 +++-- pc/trap.c | 4 +- power/fptrap.c | 3 +- power/trap.c | 37 +++++--- ss/faultsparc.c | 6 +- ss/fns.h | 15 +--- ss/l.s | 181 +------------------------------------ ss/mmu.c | 233 +++++++++++++++++++++++++++++++++++++++++------- ss/trap.c | 8 +- ss/u.h | 1 + 17 files changed, 300 insertions(+), 274 deletions(-) diff --git a/gnot/fns.h b/gnot/fns.h index 6be65fc8885e87be9aa5c628fe54533740bff18f..71dcae85b52537c51dd3720576ca96e39d1cd8ff 100644 --- a/gnot/fns.h +++ b/gnot/fns.h @@ -14,6 +14,7 @@ void firmware(void); void flushcpucache(void); #define flushpage(x) if(x) int fpcr(int); +ulong fpiar(void); void fpregrestore(char*); void fpregsave(char*); void fprestore(FPsave*); diff --git a/gnot/l.s b/gnot/l.s index 590e0608e07e950095144ff75c27426e20618986..03d2f52a67b55dd649124bcd9f5129681b8df055 100644 --- a/gnot/l.s +++ b/gnot/l.s @@ -170,7 +170,6 @@ TEXT fpcr(SB), $0 MOVL R1, FPCR RTS - TEXT rfnote(SB), $0 MOVL uregp+0(FP), A7 diff --git a/gnot/trap.c b/gnot/trap.c index 9268d0982818a60d50af09e6d517d7499df2e9cc..a9277f8d8c4597b61cd7013a6e4356c7ddb63369 100644 --- a/gnot/trap.c +++ b/gnot/trap.c @@ -79,6 +79,7 @@ char* excname(unsigned vo, ulong pc) { static char buf[32]; /* BUG: not reentrant! */ + ulong fppc; vo &= 0x0FFF; vo >>= 2; @@ -90,7 +91,10 @@ excname(unsigned vo, ulong pc) return buf; } if(49<=vo && vo<=54){ - sprint(buf, "fp: %s", fptrapname[vo-49]); + fppc = 0; + if(u) + fppc = *(ulong*)(u->fpsave.reg+8); + sprint(buf, "fp: %s fppc=0x%lux", fptrapname[vo-49], fppc); return buf; } sprint(buf, "offset 0x%ux", vo<<2); @@ -109,6 +113,9 @@ trap(Ureg *ur) u->dbgreg = ur; if(user){ + splhi(); + procsave(u->p); + spllo(); sprint(buf, "sys: %s", excname(ur->vo, ur->pc)); postnote(u->p, 1, buf, NDebug); }else{ @@ -174,7 +181,7 @@ notify(Ureg *ur) l = strlen(n->msg); if(l > ERRLEN-15) /* " pc=0x12345678\0" */ l = ERRLEN-15; - sprint(n->msg+l, " pc=0x%.8lux", ur->pc); + sprint(n->msg+l, " pc=0x%lux", ur->pc); } if(n->flag!=NUser && (u->notified || u->notify==0)){ if(n->flag == NDebug) diff --git a/pc/dat.h b/pc/dat.h index 1b19a51ef9530af4b4247c5221c3dc38c5c7836a..2c3a00a154cc0cc1a52de8a0da5420d52b12b554 100644 --- a/pc/dat.h +++ b/pc/dat.h @@ -45,7 +45,19 @@ enum struct FPsave { - uchar regs[108]; + ushort control; + ushort r1; + ushort status; + ushort r2; + ushort tag; + ushort r3; + ulong pc; + ushort selector; + ushort r4; + ulong operand; + ushort oselector; + ushort r5; + uchar regs[80]; /* floating point registers */ }; struct Conf diff --git a/pc/fns.h b/pc/fns.h index ac6cbfc7906e310243580d89571924f36a76135a..e8fd25ec085b302bd0a246c83159ebdbce5f0c3d 100644 --- a/pc/fns.h +++ b/pc/fns.h @@ -16,6 +16,7 @@ void fault386(Ureg*); void faultinit(void); void fclock(Ureg*); void fclockinit(void); +void fpenv(FPsave*); void fpinit(void); void fpoff(void); void fprestore(FPsave*); diff --git a/pc/kbd.c b/pc/kbd.c index 17b6c3109ecfcc0a33fdf87c5be9a5e4186958c4..3f0f81fadb0db4d68e2672a41d1344e35d2890f4 100644 --- a/pc/kbd.c +++ b/pc/kbd.c @@ -36,7 +36,7 @@ enum { Caps= Spec|0x64, Num= Spec|0x65, Middle= Spec|0x66, - No= Spec|0x7F, /* no mapping */ + No= 0x00, /* peter */ Home= KF|13, Up= KF|14, @@ -59,11 +59,11 @@ uchar kbtab[] = [0x18] 'o', 'p', '[', ']', '\n', Ctrl, 'a', 's', [0x20] 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', [0x28] '\'', '`', Shift, '\\', 'z', 'x', 'c', 'v', -[0x30] 'b', 'n', 'm', ',', '.', '/', Shift, No, +[0x30] 'b', 'n', 'm', ',', '.', '/', Shift, '*', [0x38] Latin, ' ', Ctrl, KF|1, KF|2, KF|3, KF|4, KF|5, -[0x40] KF|6, KF|7, KF|8, KF|9, KF|10, Num, KF|12, Home, -[0x48] No, No, No, No, No, No, No, No, -[0x50] No, No, No, No, No, No, No, KF|11, +[0x40] KF|6, KF|7, KF|8, KF|9, KF|10, Num, KF|12, '7', +[0x48] '8', '9', '-', '4', '5', '6', '+', '1', +[0x50] '2', '3', '0', '.', No, No, No, KF|11, [0x58] KF|12, No, No, No, No, No, No, No, }; @@ -75,11 +75,11 @@ uchar kbtabshift[] = [0x18] 'O', 'P', '{', '}', '\n', Ctrl, 'A', 'S', [0x20] 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', [0x28] '"', '~', Shift, '|', 'Z', 'X', 'C', 'V', -[0x30] 'B', 'N', 'M', '<', '>', '?', Shift, No, +[0x30] 'B', 'N', 'M', '<', '>', '?', Shift, '*', [0x38] Latin, ' ', Ctrl, KF|1, KF|2, KF|3, KF|4, KF|5, -[0x40] KF|6, KF|7, KF|8, KF|9, KF|10, Num, KF|12, Home, -[0x48] No, No, No, No, No, No, No, No, -[0x50] No, No, No, No, No, No, No, KF|11, +[0x40] KF|6, KF|7, KF|8, KF|9, KF|10, Num, KF|12, '7', +[0x48] '8', '9', '-', '4', '5', '6', '+', '1', +[0x50] '2', '3', '0', '.', No, No, No, KF|11, [0x58] KF|12, No, No, No, No, No, No, No, }; @@ -88,14 +88,14 @@ uchar kbtabesc1[] = [0x00] No, No, No, No, No, No, No, No, [0x08] No, No, No, No, No, No, No, No, [0x10] No, No, No, No, No, No, No, No, -[0x18] No, No, No, No, No, Ctrl, No, No, +[0x18] No, No, No, No, '\n', Ctrl, No, No, [0x20] No, No, No, No, No, No, No, No, -[0x28] No, No, No, No, No, No, No, No, -[0x30] No, No, No, No, No, No, No, Print, +[0x28] No, No, Shift, No, No, No, No, No, +[0x30] No, No, No, No, No, '/', No, Print, [0x38] Latin, No, No, No, No, No, No, No, [0x40] No, No, No, No, No, No, Break, Home, -[0x48] Up, Pgup, No, Down, No, Right, No, End, -[0x50] Left, Pgdown, Ins, Del, No, No, No, No, +[0x48] Up, Pgup, No, Left, No, Right, No, End, +[0x50] Down, Pgdown, Ins, Del, No, No, No, No, [0x58] No, No, No, No, No, No, No, No, }; @@ -338,9 +338,6 @@ kbdintr0(void) if(esc1){ c = kbtabesc1[c]; esc1 = 0; - if(!keyup) - goto dochar; - return 0; } else if(esc2){ esc2--; return 0; @@ -373,7 +370,6 @@ kbdintr0(void) /* * normal character */ -dochar: if(!(c & Spec)){ if(ctl) c &= 0x1f; diff --git a/pc/l.s b/pc/l.s index 930bda05a2c1297e9ab171edc83ad99f39236b41..b436177191232f1cfec092bcef420c57f5c5b809 100644 --- a/pc/l.s +++ b/pc/l.s @@ -330,6 +330,11 @@ TEXT fpstatus(SB),$0 /* get floating point status */ FSTSW AX RET +TEXT fpenv(SB),$0 /* save floating point environment without waiting */ + MOVL p+0(FP),AX + FSTENV 0(AX) + RET + /* * special traps */ diff --git a/pc/main.c b/pc/main.c index 9f3c8c9f629917410bc0578bb1915b0c0aea0209..02e8a16126d7b10917d82ed9b9b18710f013eed3 100644 --- a/pc/main.c +++ b/pc/main.c @@ -287,16 +287,27 @@ matherror(Ureg *ur) */ outb(0xF0, 0xFF); - status = fpstatus() & 0xffff; - msg = "unknown"; + /* + * save floating point state to check out error + */ + fpenv(&u->fpsave); + status = u->fpsave.status; + + msg = 0; for(i = 0; i < 8; i++) if((1<fpsave.pc); + postnote(u->p, 1, note, NDebug); break; } - sprint(note, "sys: fp: %s, status 0x%ux, pc 0x%lux", msg, status, ur->pc); -print("%s cr0 %lux\n", note, getcr0()); - postnote(u->p, 1, note, NDebug); + if(msg == 0){ + sprint(note, "sys: fp: unknown fppc=0x%lux", u->fpsave.pc); + postnote(u->p, 1, note, NDebug); + } + if(ur->pc & KZERO) + panic("fp: status %lux fppc=0x%lux pc=0x%lux", status, + u->fpsave.pc, ur->pc); } /* diff --git a/pc/trap.c b/pc/trap.c index de25fa3be35909c8ef21102741531cd0ded9c5bd..a284c2c730e2f6df12581259ab1c806d30d93910 100644 --- a/pc/trap.c +++ b/pc/trap.c @@ -110,9 +110,9 @@ trapinit(void) sethvec(11, intr11, SEGTG, 0); sethvec(12, intr12, SEGTG, 0); sethvec(13, intr13, SEGTG, 0); - sethvec(14, intr14, SEGIG, 0); + sethvec(14, intr14, SEGIG, 0); /* page fault, interrupts off */ sethvec(15, intr15, SEGTG, 0); - sethvec(16, intr16, SEGTG, 0); + sethvec(16, intr16, SEGIG, 0); /* math coprocessor, interrupts off */ /* * device interrupts diff --git a/power/fptrap.c b/power/fptrap.c index 03618f51e471feba02ada20d87fe7dc9ee2ebfbb..7b8ff2e487e1d0e90e21c8626879ee6b62c4c7a6 100644 --- a/power/fptrap.c +++ b/power/fptrap.c @@ -30,6 +30,7 @@ fptrap(Ureg *ur, ulong fcr31) ulong iw, npc; savefpregs(&u->fpsave); + u->p->fpstate = FPinactive; /* will get turned on again in trap() */ if((fcr31&(1<<17)) == 0) return 0; if(ur->cause & (1<<31)) @@ -45,7 +46,7 @@ fptrap(Ureg *ur, ulong fcr31) return 0; }else ur->pc += 4; - restfpregs(&u->fpsave, fcr31); + u->fpsave.fpstatus = fcr31 & ~(1<<17); } return 1; } diff --git a/power/trap.c b/power/trap.c index 778a188a66e87d469964b3ff615a1d9cfd288f54..1defccea2787518f4952473d3148122c6a6ddc38 100644 --- a/power/trap.c +++ b/power/trap.c @@ -45,7 +45,7 @@ char *excname[] = /* the following is made up */ "trap: floating point exception" /* FPEXC */ }; -char *fpexcname(ulong); +char *fpexcname(Ureg*, ulong, char*); char *regname[]={ "STATUS", "PC", @@ -77,7 +77,7 @@ trap(Ureg *ur) int ecode; int user, x; ulong fcr31; - char buf[ERRLEN]; + char buf[2*ERRLEN], buf1[ERRLEN]; SET(fcr31); ecode = EXCCODE(ur->cause); @@ -151,7 +151,7 @@ trap(Ureg *ur) if(user){ spllo(); if(ecode == FPEXC) - sprint(buf, "sys: fp: %s FCR31 %lux", fpexcname(fcr31), fcr31); + sprint(buf, "sys: fp: %s", fpexcname(ur, fcr31, buf1)); else sprint(buf, "sys: %s", excname[ecode]); @@ -159,7 +159,7 @@ trap(Ureg *ur) }else{ print("%s %s pc=%lux\n", user? "user": "kernel", excname[ecode], ur->pc); if(ecode == FPEXC) - print("fp: %s FCR31 %lux\n", fpexcname(fcr31), fcr31); + print("fp: %s\n", fpexcname(ur, fcr31, buf1)); dumpregs(ur); if(m->machno == 0) spllo(); @@ -319,7 +319,7 @@ intr(Ureg *ur) } char* -fpexcname(ulong fcr31) +fpexcname(Ureg *ur, ulong fcr31, char *buf) { static char *str[]={ "inexact operation", @@ -329,15 +329,26 @@ fpexcname(ulong fcr31) "invalid operation", }; int i; + char *s; + ulong fppc; + fppc = ur->pc; + if(ur->cause & (1<<31)) /* branch delay */ + fppc += 4; + s = 0; if(fcr31 & (1<<17)) - return "unimplemented operation"; - fcr31 >>= 7; /* trap enable bits */ - fcr31 &= (fcr31>>5); /* anded with exceptions */ - for(i=0; i<5; i++) - if(fcr31 & (1<>= 7; /* trap enable bits */ + fcr31 &= (fcr31>>5); /* anded with exceptions */ + for(i=0; i<5; i++) + if(fcr31 & (1<msg); if(l > ERRLEN-15) /* " pc=0x12345678\0" */ l = ERRLEN-15; - sprint(n->msg+l, " pc=0x%.8lux", ur->pc); + sprint(n->msg+l, " pc=0x%lux", ur->pc); } if(n->flag!=NUser && (u->notified || u->notify==0)){ if(n->flag == NDebug) diff --git a/ss/faultsparc.c b/ss/faultsparc.c index f0e443cfc055961671a9784529e17a68ecef910c..d2255ec93c0bca70ce59f784113004664918ad0f 100644 --- a/ss/faultsparc.c +++ b/ss/faultsparc.c @@ -28,8 +28,8 @@ faultsparc(Ureg *ur) /* * According to the book, this isn't good enough. We'll see. */ - addr = getw2(SEVAR); - ser = getw2(SER); + addr = getsysspace(SEVAR); + ser = getsysspace(SER); if(ser&(SE_WRITE|SE_PROT)) read = 0; } @@ -62,7 +62,7 @@ faultasync(Ureg *ur) { int user; - print("interrupt 15 ASER %lux ASEVAR %lux SER %lux\n", getw2(ASER), getw2(ASEVAR), getw2(SER)); + print("interrupt 15 ASER %lux ASEVAR %lux SER %lux\n", getsysspace(ASER), getsysspace(ASEVAR), getsysspace(SER)); dumpregs(ur); /* * Clear interrupt by toggling low bit of interrupt register diff --git a/ss/fns.h b/ss/fns.h index d6296c0b90a3f926fbd5693a988007939f6f6131..3ad4a0812a1ff1be4f0389a6b47529f24a239549 100644 --- a/ss/fns.h +++ b/ss/fns.h @@ -19,10 +19,9 @@ void fpregsave(char*); void fprestore(FPsave*); void fpsave(FPsave*); int fptrap(void); -int getb2(ulong); int getfpq(ulong*); ulong getfsr(void); -int getw2(ulong); +ulong (*getsysspace)(ulong); void intrinit(void); void ioinit(void); int kbdstate(IOQ*, int); @@ -46,22 +45,14 @@ void printinit(void); #define procrestore(p) #define procsave(p) #define procsetup(x) ((p)->fpstate = FPinit) -void putb2(ulong, int); -void putcontext(int); -void putcxreg(int); void putcxsegm(int, ulong, int); +void (*putenab)(ulong); void putpmeg(ulong, ulong); void putsegm(ulong, int); +void (*putsysspace)(ulong, ulong); void putstr(char*); void putstrn(char*, long); void puttbr(ulong); -void putw2(ulong, ulong); -void putw4(ulong, ulong); -void putwC(ulong, ulong); -void putwD16(ulong, ulong); -void putwD(ulong, ulong); -void putwE16(ulong, ulong); -void putwE(ulong, ulong); void systemreset(void); void restfpregs(FPsave*, ulong); void screeninit(void); diff --git a/ss/l.s b/ss/l.s index 9e8ab41f5742a3686c731265e97827b711152634..b082594332f9cb5e875ed0885b3629be501caf15 100644 --- a/ss/l.s +++ b/ss/l.s @@ -11,8 +11,8 @@ TEXT start(SB), $-4 MOVW $KZERO, R7 MOVB R0, (R7, 3) MOVW $(KZERO+BY2SEGM), R7 - MOVW $1, R8 - MOVB R8, (R7, 3) + MOVW $1, R9 + MOVB R9, (R7, 3) /* now mapped correctly. jmpl to where we want to be */ MOVW $setSB(SB), R2 MOVW $startvirt(SB), R7 @@ -333,183 +333,6 @@ TEXT getpsr(SB), $0 MOVW PSR, R7 RETURN -TEXT putcxreg(SB), $0 - - MOVW $CONTEXT, R8 - MOVB R7, (R8, 2) - RETURN - -TEXT putb2(SB), $0 - - MOVW 4(FP), R8 - MOVB R8, (R7, 2) - RETURN - -TEXT getb2(SB), $0 - - MOVB (R7, 2), R7 - RETURN - -TEXT getw2(SB), $0 - - MOVW (R7, 2), R7 - RETURN - -TEXT putw2(SB), $0 - - MOVW 4(FP), R8 - MOVW R8, (R7, 2) - RETURN - -TEXT putw4(SB), $0 - - MOVW 4(FP), R8 - MOVW R8, (R7, 4) - RETURN - -TEXT putw6(SB), $0 - - MOVW 4(FP), R8 - MOVW R8, (R7, 6) - RETURN - -TEXT putw8(SB), $0 - - MOVW 4(FP), R8 - MOVW R8, (R7, 8) - RETURN - -TEXT getw4(SB), $0 - - MOVW (R7, 4), R7 - RETURN - -TEXT putwC(SB), $0 - - MOVW 4(FP), R8 - MOVW R8, (R7, 0xC) - RETURN - -TEXT putwD(SB), $0 - - MOVW 4(FP), R8 - MOVW R8, (R7, 0xD) - RETURN - -TEXT putw716(SB), $0 - - MOVW 4(FP), R8 - MOVW R8, (R7, 0x7) - ADD $BY2PG, R7 - MOVW R8, (R7, 0x7) - ADD $BY2PG, R7 - MOVW R8, (R7, 0x7) - ADD $BY2PG, R7 - MOVW R8, (R7, 0x7) - ADD $BY2PG, R7 - MOVW R8, (R7, 0x7) - ADD $BY2PG, R7 - MOVW R8, (R7, 0x7) - ADD $BY2PG, R7 - MOVW R8, (R7, 0x7) - ADD $BY2PG, R7 - MOVW R8, (R7, 0x7) - ADD $BY2PG, R7 - MOVW R8, (R7, 0x7) - ADD $BY2PG, R7 - MOVW R8, (R7, 0x7) - ADD $BY2PG, R7 - MOVW R8, (R7, 0x7) - ADD $BY2PG, R7 - MOVW R8, (R7, 0x7) - ADD $BY2PG, R7 - MOVW R8, (R7, 0x7) - ADD $BY2PG, R7 - MOVW R8, (R7, 0x7) - ADD $BY2PG, R7 - MOVW R8, (R7, 0x7) - ADD $BY2PG, R7 - MOVW R8, (R7, 0x7) - RETURN - -TEXT putwD16(SB), $0 - - MOVW 4(FP), R8 - MOVW R8, (R7, 0xD) - ADD $VACLINESZ, R7 - MOVW R8, (R7, 0xD) - ADD $VACLINESZ, R7 - MOVW R8, (R7, 0xD) - ADD $VACLINESZ, R7 - MOVW R8, (R7, 0xD) - ADD $VACLINESZ, R7 - MOVW R8, (R7, 0xD) - ADD $VACLINESZ, R7 - MOVW R8, (R7, 0xD) - ADD $VACLINESZ, R7 - MOVW R8, (R7, 0xD) - ADD $VACLINESZ, R7 - MOVW R8, (R7, 0xD) - ADD $VACLINESZ, R7 - MOVW R8, (R7, 0xD) - ADD $VACLINESZ, R7 - MOVW R8, (R7, 0xD) - ADD $VACLINESZ, R7 - MOVW R8, (R7, 0xD) - ADD $VACLINESZ, R7 - MOVW R8, (R7, 0xD) - ADD $VACLINESZ, R7 - MOVW R8, (R7, 0xD) - ADD $VACLINESZ, R7 - MOVW R8, (R7, 0xD) - ADD $VACLINESZ, R7 - MOVW R8, (R7, 0xD) - ADD $VACLINESZ, R7 - MOVW R8, (R7, 0xD) - RETURN - -TEXT putwE(SB), $0 - - MOVW 4(FP), R8 - MOVW R8, (R7, 0xE) - RETURN - -TEXT putwE16(SB), $0 - - MOVW 4(FP), R8 - MOVW R8, (R7, 0xE) - ADD $VACLINESZ, R7 - MOVW R8, (R7, 0xE) - ADD $VACLINESZ, R7 - MOVW R8, (R7, 0xE) - ADD $VACLINESZ, R7 - MOVW R8, (R7, 0xE) - ADD $VACLINESZ, R7 - MOVW R8, (R7, 0xE) - ADD $VACLINESZ, R7 - MOVW R8, (R7, 0xE) - ADD $VACLINESZ, R7 - MOVW R8, (R7, 0xE) - ADD $VACLINESZ, R7 - MOVW R8, (R7, 0xE) - ADD $VACLINESZ, R7 - MOVW R8, (R7, 0xE) - ADD $VACLINESZ, R7 - MOVW R8, (R7, 0xE) - ADD $VACLINESZ, R7 - MOVW R8, (R7, 0xE) - ADD $VACLINESZ, R7 - MOVW R8, (R7, 0xE) - ADD $VACLINESZ, R7 - MOVW R8, (R7, 0xE) - ADD $VACLINESZ, R7 - MOVW R8, (R7, 0xE) - ADD $VACLINESZ, R7 - MOVW R8, (R7, 0xE) - ADD $VACLINESZ, R7 - MOVW R8, (R7, 0xE) - RETURN - TEXT putsegm(SB), $0 MOVW 4(FP), R8 diff --git a/ss/mmu.c b/ss/mmu.c index f15bf0cfb40293a92d2cba00498c3ad2e0ecefd1..8a34d8ae61f474d0d486097bb7c2a60fc70efd83 100644 --- a/ss/mmu.c +++ b/ss/mmu.c @@ -5,16 +5,29 @@ #include "fns.h" #include "io.h" +void compile(void); +#define NCODE 1024 +static ulong code[NCODE]; +static ulong *codep = code; + +void (*putcontext)(ulong); +void (*putenab)(ulong); +ulong (*getenab)(void); +void (*putpmegspace)(ulong, ulong); +void (*putsysspace)(ulong, ulong); +ulong (*getsysspace)(ulong); +ulong (*flushcx)(ulong); +ulong (*flushpg)(ulong); + struct { Lock; - int init; int lowpmeg; KMap *free; KMap arena[(IOEND-IOSEGM)/BY2PG]; }kmapalloc; -#define NKLUDGE 12 +#define NKLUDGE 11 /* <= ((TOPPMEG-kmap.lowpmeg)/NCONTEXT) */ /* * On SPARC, tlbpid i == context i-1 so that 0 means unallocated @@ -111,22 +124,15 @@ newpid(Proc *p) return i+1; } -void -putcontext(int c) -{ - putcxreg(c); -} - void flushcontext(void) { - int i; + ulong a; - /* - * Clear context from cache - */ - for(i=0; itext); void putpmeg(ulong virt, ulong phys) { - int i; + ulong a, evirt; virt &= VAMASK; virt &= ~(BY2PG-1); +#ifdef asdf + if(conf.ss2) + putw6(virt, 0); + else + for(i=0; ip->newtlb = 1; mapstack(u->p); @@ -297,23 +312,20 @@ nflushmmu++; void cacheinit(void) { - int c, i; + int i; + putcontext(0); /* * Initialize cache by clearing the valid bit * (along with the others) in all cache entries */ - for(c=0; c>10);} + +void +compile(void) +{ + putcontext = compileconst(STBA, CONTEXT, 2); + getenab = compileconst(LDUBA, ENAB, 2); + putenab = compileconst(STBA, ENAB, 2); + putpmegspace = compilestaddr(STA, 4); + putsysspace = compilestaddr(STA, 2); + getsysspace = compileldaddr(LDA, 2); + if(conf.ss2){ + flushpg = compile1(BY2PG, 6); + flushcx = compile16(VACLINESZ, 7); + }else{ + flushpg = compile16(VACLINESZ, 0xD); + flushcx = compile16(VACLINESZ, 0xE); + } +} + +void +parameter(int param, int reg) +{ + param += 1; /* 0th parameter is 1st word on stack */ + param *= 4; + /* LD #param(R1), Rreg */ + *codep++ = (3<<30)|(reg<<25)|(LD<<19)|(1<<14)|(1<<13)|param; +} + +void +constant(ulong c, int reg) +{ + *codep++ = (0<<30)|(reg<<25)|(SETHI<<22)|(c>>10); + if(c & 0x3FF) + *codep++ = (2<<30)|(reg<<25)|(OR<<19)|(reg<<14)|(1<<13)|(c&0x3FF); +} + +/* + * void f(int c) { *(word*,asi)addr = c } for stores + * ulong f(void) { return *(word*,asi)addr } for loads + */ +void* +compileconst(int op3, ulong addr, int asi) +{ + void *a; + + a = codep; + constant(addr, 8); /* MOVW $CONSTANT, R8 */ + ret(); /* JMPL 8(R15), R0 */ + /* in delay slot st or ld R7, (R8+R0, asi) */ + *codep++ = (3<<30)|(7<<25)|(op3<<19)|(8<<14)|(asi<<5); + return a; +} + +/* + * ulong f(ulong addr) { return *(word*,asi)addr } + */ +void* +compileldaddr(int op3, int asi) +{ + void *a; + + a = codep; + ret(); /* JMPL 8(R15), R0 */ + /* in delay slot ld (R7+R0, asi), R7 */ + *codep++ = (3<<30)|(7<<25)|(op3<<19)|(7<<14)|(asi<<5); + return a; +} + +/* + * void f(ulong addr, int c) { *(word*,asi)addr = c } + */ +void* +compilestaddr(int op3, int asi) +{ + void *a; + + a = codep; + parameter(1, 8); /* MOVW (4*1)(FP), R8 */ + ret(); /* JMPL 8(R15), R0 */ + /* in delay slot st R8, (R7+R0, asi) */ + *codep++ = (3<<30)|(8<<25)|(op3<<19)|(7<<14)|(asi<<5); + return a; +} + +/* + * ulong f(ulong addr) { *addr=0; addr+=offset; return addr} + * offset can be anything + */ +void* +compile1(ulong offset, int asi) +{ + void *a; + + a = codep; + /* ST R0, (R7+R0, asi) */ + *codep++ = (3<<30)|(0<<25)|(STA<<19)|(7<<14)|(asi<<5); + if(offset < (1<<12)){ + ret(); /* JMPL 8(R15), R0 */ + /* in delay slot ADD $offset, R7 */ + *codep++ = (2<<30)|(7<<25)|(ADD<<19)|(7<<14)|(1<<13)|offset; + }else{ + constant(offset, 8); + ret(); /* JMPL 8(R15), R0 */ + /* in delay slot ADD R8, R7 */ + *codep++ = (2<<30)|(7<<25)|(ADD<<19)|(7<<14)|(0<<13)|8; + } + return a; +} + +/* + * ulong f(ulong addr) { for(i=0;i<16;i++) {*addr=0; addr+=offset}; return addr} + * offset must be less than 1<<12 + */ +void* +compile16(ulong offset, int asi) +{ + void *a; + int i; + + a = codep; + for(i=0; i<16; i++){ + /* ST R0, (R7+R0, asi) */ + *codep++ = (3<<30)|(0<<25)|(STA<<19)|(7<<14)|(asi<<5); + /* ADD $offset, R7 */ + *codep++ = (2<<30)|(7<<25)|(ADD<<19)|(7<<14)|(1<<13)|offset; + } + ret(); /* JMPL 8(R15), R0 */ + nop(); + return a; +} diff --git a/ss/trap.c b/ss/trap.c index 0cd4232ce2f9ff3ebfde76c159632afef8d12d4b..08395dbda239ceaf5bf757a9ac77f6de1d627b99 100644 --- a/ss/trap.c +++ b/ss/trap.c @@ -58,7 +58,7 @@ excname(ulong tbr) if(m->fpunsafe==0 && u->p->fpstate!=FPactive) panic("fptrap not active\n"); fsr = u->fpsave.fsr; - sprint(excbuf, "fp: %s FQpc=0x%lux", + sprint(excbuf, "fp: %s fppc=0x%lux", fptrapname[(fsr>>14)&7], u->fpsave.q[0].a, fsr); } @@ -110,7 +110,7 @@ trap(Ureg *ur) tbr = (ur->tbr&0xFFF)>>4; /* SS2 bug: flush cache line holding trap entry in table */ if(conf.ss2) - putw2(CACHETAGS+((TRAPS+16*tbr)&(VACSIZE-1)), 0); + putsysspace(CACHETAGS+((TRAPS+16*tbr)&(VACSIZE-1)), 0); if(tbr > 16){ /* interrupt */ if(u && u->p->state==Running){ /* if active, FPop at head of Q is probably an excep */ @@ -407,7 +407,7 @@ notify(Ureg *ur) l = strlen(n->msg); if(l > ERRLEN-15) /* " pc=0x12345678\0" */ l = ERRLEN-15; - sprint(n->msg+l, " pc=0x%.8lux", ur->pc); + sprint(n->msg+l, " pc=0x%lux", ur->pc); } if(n->flag!=NUser && (u->notified || u->notify==0)){ if(n->flag == NDebug) @@ -521,7 +521,7 @@ syscall(Ureg *aur) /* SS2 bug: flush cache line holding trap entry in table */ if(conf.ss2) - putw2(CACHETAGS+((TRAPS+16*128)&(VACSIZE-1)), 0); + putsysspace(CACHETAGS+((TRAPS+16*128)&(VACSIZE-1)), 0); if(u->p->fpstate == FPactive) { fpquiet(); diff --git a/ss/u.h b/ss/u.h index e73f66c7aa18b0d670b3e8a7c9cda8e66a208e89..e4fcd0cd2db6f2b46e07210a968b7898e83c2476 100644 --- a/ss/u.h +++ b/ss/u.h @@ -1,3 +1,4 @@ +typedef unsigned int uint; typedef unsigned short ushort; typedef unsigned char uchar; typedef unsigned long ulong;