From ad3bbb3be02c09e9996085109f130e4566eb93b1 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Mon, 10 Aug 1992 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1992-08-10 --- ss/dat.h | 2 +- ss/fns.h | 2 ++ ss/io.h | 3 ++- ss/l.s | 6 ++++++ ss/main.c | 47 +++++++++++++++++++++++++++++------------------ ss/screen.c | 39 ++++++++++++++++++++++++++++++--------- ss/trap.c | 9 ++++++++- 7 files changed, 78 insertions(+), 30 deletions(-) diff --git a/ss/dat.h b/ss/dat.h index 4273f117c46c1e81ef70daed8ed2271c0fa83546..11f0a1e3cf1b82d21684c6b15eb3e43bf24a9cdf 100644 --- a/ss/dat.h +++ b/ss/dat.h @@ -65,9 +65,9 @@ struct Conf { int nmach; /* processors */ int nproc; /* processes */ + ulong monitor; /* graphics monitor id; 0 for none */ char ss2; /* is a sparcstation 2 */ char ss2cachebug; /* has sparcstation2 cache bug */ - char monitor; /* has graphics monitor */ int ncontext; /* in mmu */ int npmeg; int vacsize; /* size of virtual address cache, in bytes */ diff --git a/ss/fns.h b/ss/fns.h index f70973854c7158b4ad8dbc5b4752163b743b52ca..9042e413ce89d27b6bc56140e2cb41ff1f7f09d6 100644 --- a/ss/fns.h +++ b/ss/fns.h @@ -22,6 +22,7 @@ void fpsave(FPsave*); int fptrap(void); int getfpq(ulong*); ulong getfsr(void); +ulong getpsr(void); void intrinit(void); void ioinit(void); int kbdstate(IOQ*, int); @@ -58,6 +59,7 @@ void screeninit(void); void screenputc(int); void screenputs(char*, int); void scsiintr(void); +void setpsr(ulong); void spldone(void); ulong tas(ulong*); void touser(ulong); diff --git a/ss/io.h b/ss/io.h index 1a9575185ef6821e71e36aa66fe7fd8cb73eb320..a2a4429e36edfc25feb99fe2b5e1c140e0908b04 100644 --- a/ss/io.h +++ b/ss/io.h @@ -1,4 +1,5 @@ -#define DISPLAYRAM 0x1E800000 +#define FRAMEBUFID 0xFE000000 +#define DISPLAYRAM 0xFE800000 #define EPROM 0xF6000000 #define CLOCK 0xF3000000 #define CLOCKFREQ 1000000 /* one microsecond increments */ diff --git a/ss/l.s b/ss/l.s index 049aaaa8169f3cd576c80797c1619c764dfd3957..72a134d846bb28d9385cdd18611653767cc13f34 100644 --- a/ss/l.s +++ b/ss/l.s @@ -342,6 +342,12 @@ TEXT getpsr(SB), $0 MOVW PSR, R7 RETURN +TEXT setpsr(SB), $0 + + MOVW R7, PSR + NOOP + RETURN + TEXT putsegm(SB), $0 MOVW 4(FP), R8 diff --git a/ss/main.c b/ss/main.c index ffd65b66318779d698decbc083dde5694479b92d..e09c9dec9408fda96a959d31e4f22701ad0ab414 100644 --- a/ss/main.c +++ b/ss/main.c @@ -5,18 +5,18 @@ #include "fns.h" #include "io.h" #include "init.h" -#include "rom.h" #include #include uchar *intrreg; uchar idprom[32]; -ROM *rom; /* open boot rom vector */ +ulong rom; /* open boot rom vector */ int cpuserver; -void (*romputcxsegm)(int, ulong, int); +ulong romputcxsegm; ulong bank[2]; char mempres[256]; +Label catch; typedef struct Sysparam Sysparam; struct Sysparam @@ -29,18 +29,17 @@ struct Sysparam int ncontext; /* Number of MMU contexts */ int npmeg; /* Number of process maps */ char cachebug; /* Machine needs cache bug work around */ - char monitor; /* Needs to be computed */ int memscan; /* Number of Meg to scan looking for memory */ } sysparam[] = { - { 0x51, "1 4/60", 0, 65536, 16, 8, 128, 0, 1, 64 }, - { 0x52, "IPC 4/40", 0, 65536, 16, 8, 128, 0, 1, 64 }, - { 0x53, "1+ 4/65", 0, 65536, 16, 8, 128, 0, 1, 64 }, - { 0x54, "SLC 4/20", 0, 65536, 16, 8, 128, 0, 1, 64 }, - { 0x55, "2 4/75", 1, 65536, 32, 16, 256, 1, 0, 64 }, - { 0x56, "ELC 4/25", 1, 65536, 32, 16, 256, 1, 0, 64 }, - { 0x57, "IPX 4/50", 1, 65536, 32, 16, 256, 1, 0, 64 }, + { 0x51, "1 4/60", 0, 65536, 16, 8, 128, 0, 64 }, + { 0x52, "IPC 4/40", 0, 65536, 16, 8, 128, 0, 64 }, + { 0x53, "1+ 4/65", 0, 65536, 16, 8, 128, 0, 64 }, + { 0x54, "SLC 4/20", 0, 65536, 16, 8, 128, 0, 64 }, + { 0x55, "2 4/75", 1, 65536, 32, 16, 256, 1, 64 }, + { 0x56, "ELC 4/25", 1, 65536, 32, 16, 256, 1, 64 }, + { 0x57, "IPX 4/50", 1, 65536, 32, 16, 256, 1, 64 }, { 0 } }; Sysparam *sparam; @@ -54,16 +53,15 @@ main(void) machinit(); active.exiting = 0; active.machs = 1; + trapinit(); confinit(); xinit(); mmuinit(); - if(conf.monitor) - screeninit(); + screeninit(); printinit(); - trapinit(); kmapinit(); ioinit(); - if(!conf.monitor) + if(conf.monitor == 0) sccspecial(2, &printq, &kbdq, 9600); pageinit(); cacheinit(); @@ -90,7 +88,7 @@ intrinit(void) void systemreset(void) { - delay(100); + delay(200); putenab(ENABRESET); } @@ -137,6 +135,7 @@ init0(void) print("Sun Sparcstation %s\n", sparam->name); print("bank 0: %dM 1: %dM\n", bank[0], bank[1]); + print("frame buffer id %lux\n", conf.monitor); u->slash = (*devtab[0].attach)(0); u->dot = clone(u->slash, 0); @@ -286,6 +285,19 @@ confinit(void) *(ulong*)va = 0; putw4(va, INVALIDPTE); + /* map frame buffer id */ + putw4(va, ((FRAMEBUFID>>PGSHIFT)&0xFFFF)|PTEVALID|PTEKERNEL|PTENOCACHE|PTEIO); + i = getpsr(); + conf.monitor = 0; + /* if frame buffer not present, we will trap, so prepare to catch it */ + if(setlabel(&catch) == 0){ + setpsr(i|PSRET|(0xF<<8)); /* enable traps, not interrupts */ + conf.monitor = *(ulong*)va; + } + setpsr(i); + catch.pc = 0; + putw4(va, INVALIDPTE); + for(sparam = sysparam; sparam->id; sparam++) if(sparam->id == idprom[1]) break; @@ -300,7 +312,6 @@ confinit(void) conf.ncontext = sparam->ncontext; conf.npmeg = sparam->npmeg; conf.ss2cachebug = sparam->cachebug; - conf.monitor = sparam->monitor; /* BUG */ /* Chart memory */ scanmem(mempres, sparam->memscan); @@ -333,7 +344,7 @@ confinit(void) conf.upages += i - ((6*MB)/BY2PG); } - romputcxsegm = rom->putcxsegm; + romputcxsegm = *(ulong*)(rom+260); ktop = PGROUND((ulong)end); ktop = PADDR(ktop); diff --git a/ss/screen.c b/ss/screen.c index 7c0c89cf8d8e4d7c610a160a97dd69fa2d0319ea..7132cf674150a0e20d1f047ee60ea73d4f29d1fa 100644 --- a/ss/screen.c +++ b/ss/screen.c @@ -22,14 +22,16 @@ struct{ void (*kprofp)(ulong); -GBitmap gscreen = +GBitmap gscreen; + +struct screens { - (ulong*)SCREENSEGM, - 0, - 1152/32, - 0, - {0, 0, 1152, 900}, - {0, 0, 1152, 900}, + ulong type; + int x; + int y; + int ld; +}screens[] = { + { 0xFE010104, 1152, 900, 0 }, 0 }; @@ -38,8 +40,27 @@ Lock screenlock; void screeninit(void) { - if(!conf.monitor) - return; + struct screens *s; + + for(s=screens; s->type; s++) + if(s->type == conf.monitor) + goto found; + /* default is 0th element of table */ + if(conf.monitor){ + s = screens; + goto found; + ] + conf.monitor = 0; + return; + + found: + gscreen.base = (ulong*)SCREENSEGM; + gscreen.zero = 0; + gscreen.width = (s->x<ld)/32; + gscreen.ldepth = s->ld; + gscreen.r = Rect(0, 0, s->x, s->y); + gscreen.clipr = gscreen.r; + gscreen.cache = 0; defont = &defont0; gbitblt(&gscreen, Pt(0, 0), &gscreen, gscreen.r, 0); out.pos.x = MINX; diff --git a/ss/trap.c b/ss/trap.c index dc9eb02846b1a4f2c265fb65f402d445737c194f..a9c7f9b7d33ff7c9bb4437f77f7f81622743ca08 100644 --- a/ss/trap.c +++ b/ss/trap.c @@ -11,6 +11,7 @@ void noted(Ureg**, ulong); void rfnote(Ureg**); int domuldiv(ulong, Ureg*); +extern Label catch; extern void traplink(void); extern void syslink(void); @@ -102,12 +103,18 @@ trap(Ureg *ur) char buf[64]; ulong tbr, iw; + tbr = (ur->tbr&0xFFF)>>4; + /* + * Hack to catch bootstrap fault during probe + */ + if(catch.pc) + longjmp(&catch, 1); + if(u) u->dbgreg = ur; fpunsafe = 0; user = !(ur->psr&PSRPSUPER); - tbr = (ur->tbr&0xFFF)>>4; /* SS2 bug: flush cache line holding trap entry in table */ if(conf.ss2cachebug) putsysspace(CACHETAGS+((TRAPS+16*tbr)&(conf.vacsize-1)), 0);