From 363318fb58877af5456b9573c46316963cba435e Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Sat, 11 Dec 1993 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1993-12-11 --- carrera/devether.c | 7 +++++-- carrera/l.s | 35 +++++++++++++---------------------- carrera/mem.h | 6 +++--- carrera/mmu.c | 34 +++++++--------------------------- port/page.c | 1 + 5 files changed, 29 insertions(+), 54 deletions(-) diff --git a/carrera/devether.c b/carrera/devether.c index f0cf7584b48b8ae04f756f3021b6f2090c5662b2..a3e03b49b94436489ea44872e648c2555d907872 100644 --- a/carrera/devether.c +++ b/carrera/devether.c @@ -739,10 +739,13 @@ etherwrite(Chan *c, void *buf, long n, ulong offset) nexterror(); } - tsleep(&ctlr->tr, isoutbuf, ctlr, 10000); + tsleep(&ctlr->tr, isoutbuf, ctlr, 1000); - if(!isoutbuf(ctlr)) + if(!isoutbuf(ctlr)) { print("ether transmitter jammed\n"); + reset(ctlr); + WR(cr, Rxen); + } else { p =(Pbuf*)ctlr->tb[ctlr->th]; memmove(p->d, buf, n); diff --git a/carrera/l.s b/carrera/l.s index 788831e28fe1a7f0d226de0b814ae365349b2f2c..9718fd5477b44fe19bf123de7e7d9b5b425a07a0 100644 --- a/carrera/l.s +++ b/carrera/l.s @@ -12,6 +12,8 @@ #define CONST(x,r) MOVW $((x)&0xffff0000), r; OR $((x)&0xffff), r +#define RDBGSV CONST(0x80020000, R26); MOVW R29, 0(R26); MOVW M(EPC), R27; MOVW R27, 4(R26); MOVW R31, 8(R26) + /* * R4000 instructions */ @@ -305,22 +307,15 @@ TEXT vector0(SB), $-4 NOOP4 NOOP4 + RDBGSV MOVW $utlbmiss(SB), R26 JMP (R26) TEXT utlbmiss(SB), $-4 - - CONST ((0xA0090000), R27) - MOVW M(EPC), R26 - MOVW R26, 0(R27) - MOVW M(BADVADDR), R26 - MOVW R26, 4(R27) - MOVW M(CAUSE), R26 - MOVW R26, 8(R27) - MOVW M(TLBVIRT), R26 - MOVW R26, 12(R27) - MOVW M(17), R26 - MOVW R26, 16(R27) + CONST (MACHADDR, R26) /* R26 = m-> */ + MOVW 16(R26), R27 + ADDU $1, R27 + MOVW R27, 16(R26) /* m->tlbfault++ */ MOVW M(TLBVIRT), R27 WAIT @@ -392,6 +387,7 @@ TEXT vector100(SB), $-4 NOOP4 NOOP4 + RDBGSV MOVW $exception(SB), R26 JMP (R26) @@ -399,6 +395,7 @@ TEXT vector180(SB), $-4 NOOP4 NOOP4 + RDBGSV MOVW $exception(SB), R26 JMP (R26) NOP @@ -750,9 +747,6 @@ tas1: * we avoid using R4, R5, R6, and R7 so gotopc can call us without saving them */ TEXT icflush(SB), $-4 /* icflush(virtaddr, count) */ -MOVW $0xA0090008, R10 -MOVW $2001, R9 -MOVW R9, (R10) MOVW M(STATUS), R10 WAIT MOVW 4(FP), R9 @@ -782,9 +776,6 @@ icflush1: /* primary cache line size is 16 bytes */ WAIT WAIT WAIT -MOVW $0xA0090008, R10 -MOVW $2002, R9 -MOVW R9, (R10) RET TEXT dcflush(SB), $-4 /* dcflush(virtaddr, count) */ @@ -805,10 +796,10 @@ dcflush1: /* primary cache line size is 16 bytes */ CACHE PI+HI, 0x10(R8) CACHE PI+HI, 0x20(R8) CACHE PI+HI, 0x30(R8) - CACHE PD+HWB, 0x00(R8) - CACHE PD+HWB, 0x10(R8) - CACHE PD+HWB, 0x20(R8) - CACHE PD+HWB, 0x30(R8) + CACHE PD+HWBI, 0x00(R8) + CACHE PD+HWBI, 0x10(R8) + CACHE PD+HWBI, 0x20(R8) + CACHE PD+HWBI, 0x30(R8) SUB $0x40, R9 ADD $0x40, R8 BGTZ R9, dcflush1 diff --git a/carrera/mem.h b/carrera/mem.h index 741023b528a81437020bcbb44dca01045e627259..b0d03b6958bea70ae67a7e0d2c2f059d74e6a9c6 100644 --- a/carrera/mem.h +++ b/carrera/mem.h @@ -14,7 +14,7 @@ #define PGSHIFT 12 /* log(BY2PG) */ #define PGROUND(s) (((s)+(BY2PG-1))&~(BY2PG-1)) -#define MAXMACH 4 /* max # cpus system can run */ +#define MAXMACH 1 /* max # cpus system can run */ #define KSTACK 4096 /* Size of kernel stack */ /* @@ -95,7 +95,7 @@ /* * Fundamental addresses */ -#define MACHADDR 0x8008e000 /* Mach structures */ +#define MACHADDR (KTZERO-MAXMACH*BY2PG) /* warning: rdbg is near here */ #define UREGSIZE 0xA0 /* Sizeof(Ureg)+retpc & ur */ #define MACHP(n) ((Mach *)(MACHADDR+(n)*BY2PG)) @@ -140,7 +140,7 @@ #define PTEPERTAB (PTEMAPMEM/BY2PG) #define STLBLOG 13 #define STLBSIZE (1<kactive == 0) return; curpid = PTEPID(TLBPID(tlbvirt())); - ktlbx = m->ktlbx; - for(i = TLBROFF; i < NTLB; i++, ktlbx++){ + ktlbx = m->ktlbx+TLBROFF; + for(i = TLBROFF; i < NTLB; i++, ktlbx++) { if(*ktlbx == 0) continue; TLBINVAL(i, curpid); @@ -206,7 +202,6 @@ kmapinval() kunmap(k); } m->kactive = 0; - m->ktlbnext = TLBROFF; } void @@ -292,30 +287,15 @@ putmmu(ulong tlbvirt, ulong tlbphys, Page *pg) puttlb(entry->virt, entry->phys0, entry->phys1); ctl = &pg->cachectl[m->machno]; -((ulong*)0xA0090000)[8] = 0x1000; -((ulong*)0xA0090000)[5] = tlbvirt; + if(*ctl == PG_DATFLUSH) { + dcflush((void*)pg->va, BY2PG); + *ctl = PG_NOFLUSH; + }else if(*ctl == PG_TXTFLUSH) { -ulong tlb[4]; -extern int gettlbp(ulong, ulong*); -extern ulong tlbvirt(void); -((ulong*)0xA0090000)[6] = tlbphys; -((ulong*)0xA0090000)[7] = pg->va; -((ulong*)0xA0090000)[8] = 0x2000; - if(gettlbp((pg->va & ~BY2PG)|TLBPID(tlbvirt()), tlb) < 0){ - print("entry->virt %lux pg->va %lux\n", entry->virt, pg->va); - panic("icflush not in TLB"); - } -if(0 && pg->va == 0x19000) { -print("xx>> virt %lux phys0 %lux phys1 %lux\n", tlb[0],tlb[1],tlb[2]); -} icflush((void*)pg->va, BY2PG); -((ulong*)0xA0090000)[8] = 0x3000; *ctl = PG_NOFLUSH; -((ulong*)0xA0090000)[8] = 0x4000; } -((ulong*)0xA0090000)[8] = 0x5000; splx(s); -((ulong*)0xA0090000)[8] = 0x6000; } void diff --git a/port/page.c b/port/page.c index 94fa446cae143b8445f86a632a9ed0ca96c634a4..fc9933458825489c6409432d84e2bb8601d60ed4 100644 --- a/port/page.c +++ b/port/page.c @@ -118,6 +118,7 @@ retry: break; if(p == 0) { +print("! "); p = palloc.head; memset(p->cachectl, PG_DATFLUSH, sizeof(p->cachectl)); p->color = color;