A port/devXXX.c => port/devXXX.c +118 -0
@@ 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;
+}
M port/devroot.c => port/devroot.c +0 -2
@@ 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:
M ss/faultsparc.c => ss/faultsparc.c +1 -14
@@ 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
M ss/io.h => ss/io.h +0 -4
@@ 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
M ss/l.s => ss/l.s +1 -1
@@ 1,6 1,6 @@
#include "mem.h"
-#define SYSPSR (SPL(0xF)|PSRSUPER)
+#define SYSPSR (SPL(0x0)|PSRSUPER)
TEXT start(SB), $-4
M ss/main.c => ss/main.c +10 -7
@@ 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;
M ss/mem.h => ss/mem.h +4 -0
@@ 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
M ss/mmu.c => ss/mmu.c +11 -23
@@ 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<IOSEGM0; l+=BY2SEGM)
+ putsegm(l, INVALIDPMEG);
+#endif
+
/*
* One segment for screen
*/
@@ 210,7 218,7 @@ putmmu(ulong tlbvirt, ulong tlbphys)
*/
if(tlbvirt>=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; d<NCONTEXT; d++){
- putcontext(d);
- for(i=0; i<0x100; i+=16)
- putwD16(k->va+(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;
}