From 59decfa97947c5cfec39b1c5a19202f653206083 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Fri, 11 Jan 1991 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1991-01-11 --- port/devXXX.c | 118 ++++++++++++++++++++++++++++++++++++++++++++++++ port/devroot.c | 2 - ss/faultsparc.c | 15 +----- ss/io.h | 4 -- ss/l.s | 2 +- ss/main.c | 17 ++++--- ss/mem.h | 4 ++ ss/mmu.c | 34 +++++--------- 8 files changed, 145 insertions(+), 51 deletions(-) create mode 100644 port/devXXX.c diff --git a/port/devXXX.c b/port/devXXX.c new file mode 100644 index 0000000000000000000000000000000000000000..6b58e6bdcc129cf5c0238661db27f9a01732b0a4 --- /dev/null +++ b/port/devXXX.c @@ -0,0 +1,118 @@ +/* + * template for making a new device + */ + +#include "u.h" +#include "lib.h" +#include "mem.h" +#include "dat.h" +#include "fns.h" +#include "errno.h" + +#include "devtab.h" + +enum{ + XXXdirqid, + XXXdataqid, +}; +Dirtab XXXtab[]={ + "data", XXXdataqid, 0, 0600, +}; +#define NXXXtab (sizeof(XXXTab)/sizeof(Dirtab)) + +void +XXXreset(void) +{ +} + +void +XXXinit(void) +{ +} + +Chan * +XXXattach(char *spec) +{ + return devattach('X', spec); +} + +Chan * +XXXclone(Chan *c, Chan *nc) +{ + return devclone(c, nc); +} + +int +XXXwalk(Chan *c, char *name) +{ + return devwalk(c, name, XXXtab, (long)NXXXtab, devgen); +} + +void +XXXstat(Chan *c, char *db) +{ + devstat(c, db, XXXtab, (long)NXXXtab, devgen); +} + +Chan * +XXXopen(Chan *c, int omode) +{ + if(c->qid == CHDIR){ + if(omode != OREAD) + error(0, Eperm); + } + c->mode = openmode(omode); + c->flag |= COPEN; + c->offset = 0; + return c; +} + +void +XXXcreate(Chan *c, char *name, int omode, ulong perm) +{ + error(0, Eperm); +} + +void +XXXremove(Chan *c) +{ + error(0, Eperm); +} + +void +XXXwstat(Chan *c, char *dp) +{ + error(0, Eperm); +} + +void +XXXclose(Chan *c) +{ +} + +long +XXXread(Chan *c, void *a, long n) +{ + switch((int)(c->qid&~CHDIR)){ + case XXXdirqid: + return devdirread(c, a, n, XXXtab, NXXXtab, devgen); + case XXXdataqid: + break; + default: + n=0; + break; + } + return n; +} + +long +XXXwrite(Chan *c, char *a, long n) +{ + switch((int)(c->qid&~CHDIR)){ + case XXXdataqid: + break; + default: + error(0, Ebadusefd); + } + return n; +} diff --git a/port/devroot.c b/port/devroot.c index a7193cc9601a8f5b261c124c4dd9607cf4ee4f13..7d3ff28c191fef934b926d05e75c548a2b31f356 100644 --- a/port/devroot.c +++ b/port/devroot.c @@ -94,9 +94,7 @@ rootread(Chan *c, void *buf, long n) return 0; if(c->offset+n > sizeof bootcode) n = sizeof bootcode - c->offset; -ck("1"); memcpy(buf, ((char*)bootcode)+c->offset, n); -ck("2"); return n; case Qdev: diff --git a/ss/faultsparc.c b/ss/faultsparc.c index 36ee842f0abdff5399e43fa93d89948fe19661c0..06fd58aa037539c461b0c4b55eba2b8765f98937 100644 --- a/ss/faultsparc.c +++ b/ss/faultsparc.c @@ -6,12 +6,6 @@ #include "ureg.h" #include "errno.h" -ck(char *s) -{ - if(u->p->seg[SSEG].o->flag == 0) - panic(s); -} - void faultsparc(Ureg *ur) { @@ -34,8 +28,7 @@ faultsparc(Ureg *ur) return; } spllo(); -print("fault: %s pc=0x%lux addr %lux %d\n", excname(tbr), ur->pc, addr, read); /**/ -ck("faultsparc"); +/* print("fault: %s pc=0x%lux addr %lux %d\n", excname(tbr), ur->pc, addr, read); /**/ if(u == 0){ dumpregs(ur); panic("fault u==0 pc=%lux", ur->pc); @@ -48,11 +41,6 @@ ck("faultsparc"); user = !(ur->psr&PSRPSUPER); if(fault(addr, read) < 0){ -print("death read %lux %d sizes %lux-%lux %lux-%lux, %lux-%lux %lux-%lux\n", addr, read, -u->p->seg[SSEG].minva, u->p->seg[SSEG].maxva, -u->p->seg[TSEG].minva, u->p->seg[TSEG].maxva, -u->p->seg[DSEG].minva, u->p->seg[DSEG].maxva, -u->p->seg[BSEG].minva, u->p->seg[BSEG].maxva); if(user){ pprint("user %s error addr=0x%lux\n", read? "read" : "write", badvaddr); pprint("psr=0x%lux pc=0x%lux sp=0x%lux\n", ur->psr, ur->pc, ur->sp); @@ -64,7 +52,6 @@ u->p->seg[BSEG].minva, u->p->seg[BSEG].maxva); exit(); } u->p->insyscall = insyscall; -ck("faultsparc return"); } void diff --git a/ss/io.h b/ss/io.h index f22094f80adb4f1e47a79e5ef14ef0b99f7b5897..584469b486afe08b3967cc94d645c60eaffb1d2a 100644 --- a/ss/io.h +++ b/ss/io.h @@ -8,7 +8,3 @@ typedef struct Duart Duart; #define ETHER 0xF8C00000 /* RDP, RAP */ #define EEPROM 0xF2000000 #define INTRREG 0xF5000000 /* interrupt register, IO space */ - -#define ENAB 0x40000000 /* ASI 2, System Enable Register */ -#define ENABCACHE 0x10 -#define ENABRESET 0x04 diff --git a/ss/l.s b/ss/l.s index aa5221243bed082b81a349332bf7cc4eed4b5371..7890c05c10e5d13918f1219283b6291b3eefa7e7 100644 --- a/ss/l.s +++ b/ss/l.s @@ -1,6 +1,6 @@ #include "mem.h" -#define SYSPSR (SPL(0xF)|PSRSUPER) +#define SYSPSR (SPL(0x0)|PSRSUPER) TEXT start(SB), $-4 diff --git a/ss/main.c b/ss/main.c index f5b6ce34963542ef0d8e2ed6df87a0a612dad3d2..f24fac2955a81905f66b16f7e6cc3bedee9b55af 100644 --- a/ss/main.c +++ b/ss/main.c @@ -66,9 +66,10 @@ main(void) confinit(); mmuinit(); printinit(); - print("sparc plan 9\n"); + print("sparc plan 9 %lux\n", getb2(ENAB)); trapinit(); kmapinit(); + print("sparc plan 9 %lux\n", getb2(ENAB)); cacheinit(); intrinit(); procinit0(); @@ -220,8 +221,7 @@ exit(void) u = 0; splhi(); print("exiting\n"); -for(;;) - delay(60*1000); + delay(30*1000); reset(); } @@ -301,12 +301,15 @@ confinit(void) conf.nmach = 1; if(conf.nmach > MAXMACH) panic("confinit"); - conf.npage0 = (6*1024*1024)/BY2PG; /* BUG */ - conf.npage = conf.npage0; + conf.npage0 = (4*1024*1024)/BY2PG; /* BUG */ + conf.npage1 = 0*(4*1024*1024)/BY2PG; /* BUG */ conf.base0 = 0; + conf.base1 = 16*1024*1024; conf.npage = conf.npage0+conf.npage1; conf.maxialloc = 4*1024*1024; /* BUG */ - mul = 2; + mul = 1; + if(conf.npage1 > 0) + mul = 2; conf.nproc = 50*mul; conf.npgrp = 12*mul; conf.npte = 1400*mul; @@ -320,7 +323,7 @@ confinit(void) conf.nmtab = 50*mul; conf.nmount = 80*mul; conf.nmntdev = 10*mul; - conf.nmntbuf = conf.nmntdev+3; + conf.nmntbuf = conf.nmntdev+6; conf.nmnthdr = 2*conf.nmntdev; conf.nstream = 40 + 32*mul; conf.nqueue = 5 * conf.nstream; diff --git a/ss/mem.h b/ss/mem.h index 00751900b30481e8f9f48fd8c6aef17f7551ef3b..c074081bdc15f21c8cf78d6bbda59fc6c9227a30 100644 --- a/ss/mem.h +++ b/ss/mem.h @@ -99,10 +99,14 @@ * Weird addresses in various ASI's */ #define CACHETAGS 0x80000000 /* ASI 2 */ +#define CACHEDATA 0x90000000 /* ASI 2 */ #define SER 0x60000000 /* ASI 2 */ #define SEVAR 0x60000004 /* ASI 2 */ #define ASER 0x60000008 /* ASI 2 */ #define ASEVAR 0x6000000C /* ASI 2 */ +#define ENAB 0x40000000 /* ASI 2 */ +#define ENABCACHE 0x10 +#define ENABRESET 0x04 /* * Virtual addresses diff --git a/ss/mmu.c b/ss/mmu.c index fb743d7994ae631a14472826badd8e51e31bb340..08098560263dbcce5819ff6876b0ffa0f9a5fb47 100644 --- a/ss/mmu.c +++ b/ss/mmu.c @@ -14,7 +14,7 @@ struct KMap arena[(IOEND-IOSEGM)/BY2PG]; }kmapalloc; -#define NKLUDGE 8 +#define NKLUDGE 12 /* * On SPARC, tlbpid i == context i-1 so that 0 means unallocated @@ -77,6 +77,7 @@ newpid(Proc *p) m->pidproc[i] = p; m->lastpid = i; putcontext(i-1); + /* * kludge: each context is allowed NKLUDGE pmegs, NKLUDGE-1 for text & data and 1 for stack */ @@ -153,10 +154,17 @@ mmuinit(void) /* * Invalidate user addresses */ - for(l=UZERO; l<(KZERO&VAMASK); l+=BY2SEGM) putsegm(l, INVALIDPMEG); +#ifdef doesntwork + /* + * Invalidate high kernel addresses + */ + for(l=conf.maxialloc; l=TSTKTOP || (UZERO+(NKLUDGE-1)*BY2SEGM<=tlbvirt && tlbvirt<(TSTKTOP-BY2SEGM))){ pprint("putmmu %lux", tlbvirt); - pexit("Suicide", 0); + pexit("Suicide", 1); } putpmeg(tlbvirt, tlbphys); spllo(); @@ -309,27 +317,7 @@ kmappa(ulong pa, ulong flag) * must use NOCACHE or else extreme cleverness elsewhere. */ s = splhi(); -#ifdef stupid -{ - int i, c, d; - - c = u->p->pidonmach[m->machno]; - /* - * Flush old entries from cache - */ - for(d=0; dva+(i<<4), 0); - } - putcontext(c-1); - if(u && u->p) - m->pidhere[c] = 1; /* UGH! */ - putw4(k->va, PPN(pa)|PTEVALID|PTEKERNEL|PTEWRITE|PTENOCACHE|flag); -} -#else putpmeg(k->va, PPN(pa)|PTEVALID|PTEKERNEL|PTEWRITE|PTENOCACHE|flag); -#endif splx(s); return k; }