From 3817327b56df918b67bc300de71737c34cda4f8d Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Wed, 8 Sep 1993 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1993-09-08 --- carrera/io.h | 10 +++-- carrera/kbd.c | 21 +++++---- carrera/main.c | 15 ++++--- carrera/mem.h | 1 + carrera/screen.c | 115 ++++++++++++++++++++++++++++++++++++++++++++--- carrera/trap.c | 9 +++- port/devproc.c | 7 +-- port/qio.c | 7 +++ 8 files changed, 159 insertions(+), 26 deletions(-) diff --git a/carrera/io.h b/carrera/io.h index 0c39d1ce0c9549dbc724798e7a8ffbf02bf75746..381120d8c16fffbbc960b2a2138d8efca22a0f92 100644 --- a/carrera/io.h +++ b/carrera/io.h @@ -7,6 +7,10 @@ enum Eisaphys = 0x90000000, /* IO port physical */ Devicevirt = 0xE0000000, Dmabase = 0xE0000000, + R4030Isr = 0xE0000204, /* Interrupt status register */ + R4030Et = 0xE000020C, /* Eisa error type */ + R4030Rfa = 0xE000003C, /* Remote failed address */ + R4030Mfa = 0xE0000044, /* Memory failed address */ Sonicbase = 0xE0001000, Scsibase = 0xE0002000, Floppybase = 0xE0003000, @@ -24,7 +28,7 @@ enum Keydat = 7, MouseIO = 0xE0005000, SoundIO = 0xE000C000, - EisaLatch = 0xE000E000, + EisaLatch = 0xE000E007, Diag = 0xE000F000, VideoCTL = 0x60000000, VideoMEM = 0x40000000, @@ -66,5 +70,5 @@ struct Tte #define UNCACHED(type, v) (type*)((ulong)(v)|0xA0000000) #define EISA(v) (Eisamvirt+(v)) -#define EISAOUTB(port, v) *(uchar*)((EisaControl+(port))^7) = v -#define EISAINB(port) (*(uchar*)((EisaControl+(port))^7)) +#define EISAOUTB(port, v) *(uchar*)((EisaControl+(port))^2) = v +#define EISAINB(port) (*(uchar*)((EisaControl+(port))^2)) diff --git a/carrera/kbd.c b/carrera/kbd.c index e5f54ea3387849a0a0fd3b7836af93fc801c1609..c471ea6bfe88c1ee30131c9dca114e825ab29da9 100644 --- a/carrera/kbd.c +++ b/carrera/kbd.c @@ -152,7 +152,7 @@ kdbdly(int l) { int i; - l *= 21; + l *= 21; /* experimentally determined */ for(i=0; i 0x87) + return 1; + + if(upcode){ + ch = keymap[code]; if(ch == Ctrl) ctrled = 0; else if(ch == Shift) shifted = 0; + upcode = 0; return 0; } - - if(code > 0x87) - return 1; + upcode = 0; /* * convert @@ -220,7 +226,6 @@ kbdintr(void) ch = skeymap[code]; else ch = keymap[code]; -iprint("code %d %d\n", code, ch); /* * normal character */ diff --git a/carrera/main.c b/carrera/main.c index 2c259c5565e90e60083f066e252d153a4206b666..fc21bbddc34d7ed2513681e96085b8f141091e57 100644 --- a/carrera/main.c +++ b/carrera/main.c @@ -47,7 +47,7 @@ main(void) serialinit(); vecinit(); iprint("\n\nBrazil\n"); -/*screeninit();*/ + screeninit(); /**/ pageinit(); procinit0(); initseg(); @@ -170,21 +170,26 @@ ioinit(void) /* * Map devices and the Eisa control space */ - devphys = PPN(Devicephys)|PTEGLOBL|PTEVALID|PTEWRITE|PTEUNCACHED; - isaphys = PPN(Eisaphys)|PTEGLOBL|PTEVALID|PTEWRITE|PTEUNCACHED; + devphys = IOPTE|PPN(Devicephys); + isaphys = IOPTE|PPN(Eisaphys); puttlbx(1, Devicevirt, devphys, isaphys, PGSZ64K); /* * Map Interrupt control & Eisa memory */ - intphys = PPN(Intctlphys)|PTEGLOBL|PTEVALID|PTEWRITE|PTEUNCACHED; - isamphys = PPN(Eisamphys)|PTEGLOBL|PTEVALID|PTEWRITE|PTEUNCACHED; + intphys = IOPTE|PPN(Intctlphys); + isamphys = IOPTE|PPN(Eisamphys); puttlbx(2, Intctlvirt, intphys, isamphys, PGSZ1M); /* Enable all devce interrupt */ IO(ushort, Intenareg) = 0xffff; + + /* Look at the first 16M of Eisa memory */ +iprint("write latch\n"); +/* IO(uchar, EisaLatch) = 0; /**/ +iprint("done\n"); } /* diff --git a/carrera/mem.h b/carrera/mem.h index 16bcb90897e548681cb6fdfa212be0152d9bcad2..cf9dfea53382b725d95515835456611e5c56ab07 100644 --- a/carrera/mem.h +++ b/carrera/mem.h @@ -131,6 +131,7 @@ #define PTECOHERXCL (4<<3) #define PTECOHERXCLW (5<<3) #define PTECOHERUPDW (6<<3) +#define IOPTE (PTEGLOBL|PTEVALID|PTEWRITE|PTEUNCACHED) #define PTEPID(n) (n) #define TLBPID(n) ((n)&0xFF) diff --git a/carrera/screen.c b/carrera/screen.c index d952eda372b5170873e25a62c50f299f8146ff8e..20c2fae4e9bf993015941c950880f2725d21243b 100644 --- a/carrera/screen.c +++ b/carrera/screen.c @@ -180,6 +180,10 @@ screenwin(void) hwcurs = 0; } +void getvmode(VGAmode *v); +void writeregisters(VGAmode *v); +VGAmode x; + void screeninit(void) { @@ -187,10 +191,12 @@ screeninit(void) uchar *scr; setmode(&dfltmode); - + getvmode(&x); + writeregisters(&x); +return; memmove(&arrow, &fatarrow, sizeof(fatarrow)); - scr = (uchar*)EISA(0xA0000); + scr = (uchar*)EISA(0xC0000); iprint("%lux\n", scr); *scr = 0xaa; i = *scr; @@ -383,7 +389,8 @@ srout(int reg, int val) } uchar -srin(ushort i) { +srin(ushort i) +{ EISAOUTB(SRX, i); return EISAINB(SR); } @@ -438,6 +445,9 @@ setmode(VGAmode *v) { int i; + for(i = 0; i < sizeof(v->general); i++) + genout(i, v->general[i]); + /* turn screen off (to avoid damage) */ srout(1, 0x21); @@ -447,9 +457,6 @@ setmode(VGAmode *v) srout(0x00, srin(0x00) & 0xFD); /* synchronous reset*/ - for(i = 0; i < sizeof(v->general); i++) - genout(i, v->general[i]); - for(i = 0; i < sizeof(v->sequencer); i++) if(i == 1) srout(i, v->sequencer[i]|0x20); @@ -490,3 +497,99 @@ setmode(VGAmode *v) /* turn screen on */ srout(1, v->sequencer[1]); } + +uchar +grin(ushort i) +{ + EISAOUTB(GRX, i); + return EISAINB(GR); +} + +uchar +arin(ushort i) +{ + uchar junk; + junk = EISAINB(0x3DA); + USED(junk); + EISAOUTB(ARW, i | 0x20); + return EISAINB(ARR); +} + +uchar +crin(ushort i) { + EISAOUTB(CRX, i); + return EISAINB(CR); +} + +void +getvmode(VGAmode *v) +{ + int i; + + v->general[0] = EISAINB(EMISCR); /* misc output */ + v->general[1] = EISAINB(EFCR); /* feature control */ + for(i = 0; i < sizeof(v->sequencer); i++) + v->sequencer[i] = srin(i); + for(i = 0; i < sizeof(v->crt); i++) + v->crt[i] = crin(i); + for(i = 0; i < sizeof(v->graphics); i++) + v->graphics[i] = grin(i); + for(i = 0; i < sizeof(v->attribute); i++) + v->attribute[i] = arin(i); + + v->tseng.viden = EISAINB(0x3c3); + v->tseng.sr6 = srin(6); + v->tseng.sr7 = srin(7); + v->tseng.ar16 = arin(0x16); + v->tseng.ar17 = arin(0x17); + v->tseng.crt31= crin(0x31); + v->tseng.crt32= crin(0x32); + v->tseng.crt33= crin(0x33); + v->tseng.crt34= crin(0x34); + v->tseng.crt35= crin(0x35); + v->tseng.crt36= crin(0x36); + v->tseng.crt37= crin(0x37); +} + +void +writeregisters(VGAmode *v) +{ + int i; + + print("\t/* general */\n\t"); + for (i=0; igeneral); i++) + print("0x%.2x, ", v->general[i]); + print("\n\t/* sequence */\n\t"); + for (i=0; isequencer); i++) { + if (i>0 && i%8 == 0) + print("\n\t"); + print("0x%.2x, ", v->sequencer[i]); + } + print("\n\t/* crt */\n\t"); + for (i=0; icrt); i++) { + if (i>0 && i%8 == 0) + print("\n\t"); + print("0x%.2x, ", v->crt[i]); + } + print("\n\t/* graphics */\n\t"); + for (i=0; igraphics); i++) { + if (i>0 && i%8 == 0) + print("\n\t"); + print("0x%.2x, ", v->graphics[i]); + } + print("\n\t/* attribute */\n\t"); + for (i=0; iattribute); i++) { + if (i>0 && i%8 == 0) + print("\n\t"); + print("0x%.2x, ", v->attribute[i]); + } + print("\n"); + print("\t/* special */\n"); + + for (i=0; i<12; i++) { + if (i%8 == 0) + print("\n\t"); + print("0x%.2x, ", ((uchar*)(&v->tseng))[i]); + } + print("\n"); +} diff --git a/carrera/trap.c b/carrera/trap.c index bc12854e0f0dab91b1dca4c3619911c06d356131..c59224e52810018a1396ca9b8224019bb892cc5f 100644 --- a/carrera/trap.c +++ b/carrera/trap.c @@ -309,7 +309,14 @@ intr(Ureg *ur) } cause &= ~INTR3; } - + if(cause & INTR2) { + iprint("R4030 Interrupt\n"); + iprint(" ISR #%lux\n", IO(ulong, R4030Isr)); + iprint(" ET #%lux\n", IO(ulong, R4030Et)); + iprint(" RFA #%lux\n", IO(ulong, R4030Rfa)); + iprint(" MFA #%lux\n", IO(ulong, R4030Mfa)); + cause &= ~INTR2; + } if(cause & INTR4) { devint = IO(uchar, I386ack); iprint("i386ack=#%lux\n", devint); diff --git a/port/devproc.c b/port/devproc.c index 42e0f4b424c1165eb8d30fe6a2269d5e114a1ebd..78f347cb470fd50fcd3504a3fdd47fead5156b6a 100644 --- a/port/devproc.c +++ b/port/devproc.c @@ -296,19 +296,19 @@ procread(Chan *c, void *va, long n, ulong offset) if(offset+n > (ulong)end) n = (ulong)end - offset; memmove(a, (char*)offset, n); - break; + return n; } if(offset >= conf.base0 && offset < conf.npage0){ if(offset+n > conf.npage0) n = conf.npage0 - offset; memmove(a, (char*)offset, n); - break; + return n; } if(offset >= conf.base1 && offset < conf.npage1){ if(offset+n > conf.npage1) n = conf.npage1 - offset; memmove(a, (char*)offset, n); - break; + return n; } error(Ebadarg); @@ -349,6 +349,7 @@ procread(Chan *c, void *va, long n, ulong offset) memset(&kur, 0, sizeof(Ureg)); kur.pc = p->sched.pc; kur.sp = p->sched.sp; + kur.r31 = (ulong)sched; rptr = (uchar*)&kur; rsize = sizeof(Ureg); goto regread; diff --git a/port/qio.c b/port/qio.c index 8a2618b342b6e10deef77e1e70dfe82cc9fd22e7..862758e5b8436c9bde660bcd006bb14e15c2e27c 100644 --- a/port/qio.c +++ b/port/qio.c @@ -70,6 +70,7 @@ struct Queue int len; /* bytes in queue */ int limit; /* max bytes in queue */ int state; + int eof; /* number of eofs read by user */ void (*kick)(void*); /* restart output */ void *arg; /* argument to kick */ @@ -409,6 +410,7 @@ qopen(int limit, int msg, void (*kick)(void*), void *arg) q->arg = arg; q->state = msg ? Qmsg : 0; q->state |= Qstarve; + q->eof = 0; return q; } @@ -451,6 +453,10 @@ qread(Queue *q, void *vp, int len) if(q->state & Qclosed){ unlock(q); splx(x); + poperror(); + qunlock(&q->rlock); + if(++q->eof > 3) + error(Ehungup); return 0; } @@ -632,6 +638,7 @@ qreopen(Queue *q) { q->state &= ~Qclosed; q->state |= Qstarve; + q->eof = 0; } /*