Browse Source

Plan 9 from Bell Labs 2010-07-31

David du Colombier 13 years ago
parent
commit
de1556472c

+ 11 - 6
sys/src/9/kw/flashkw.c

@@ -278,6 +278,11 @@ idchip(Flash *f)
 	r->n = f->size / r->erasesize;
 	r->start = 0;
 	r->end = f->size;
+	assert(ispow2(r->pagesize));
+	r->pageshift = log2(r->pagesize);
+	assert(ispow2(r->erasesize));
+	r->eraseshift = log2(r->erasesize);
+	assert(r->eraseshift >= r->pageshift);
 	if (cache.page == nil) {
 		cache.pgsize = r->pagesize;
 		cache.page = smalloc(r->pagesize);
@@ -331,8 +336,8 @@ erasezone(Flash *f, Flashregion *r, ulong offset)
 		print("flashkw: erase offset %lud not block aligned\n", offset);
 		return -1;
 	}
-	page = offset >> 11;
-	block = page >> 6;
+	page = offset >> r->pageshift;
+	block = page >> (r->eraseshift - r->pageshift);
 	if (Debug)
 		print("flashkw: erase: block %#lux\n", block);
 
@@ -397,7 +402,7 @@ write1page(Flash *f, ulong offset, void *buf)
 	if (oob == nil)
 		oob = smalloc(r->spares);
 
-	page = offset >> 11;
+	page = offset >> r->pageshift;
 	if (Debug)
 		print("flashkw: write nand offset %#lux page %#lux\n",
 			offset, page);
@@ -472,7 +477,7 @@ read1page(Flash *f, ulong offset, void *buf)
 
 	assert(r->pagesize != 0);
 	addr = offset & (r->pagesize - 1);
-	page = offset >> 11;
+	page = offset >> r->pageshift;
 	if(addr != 0) {
 		print("flashkw: read1page: read addr %#lux:"
 			" must read aligned page\n", addr);
@@ -506,8 +511,6 @@ read1page(Flash *f, ulong offset, void *buf)
 
 	nandunclaim(f);
 
-	flcachepage(f, page, buf);
-
 	/* verify/correct data. last 8*3 bytes is ecc, per 256 bytes. */
 	p = buf;
 	assert(r->spares >= 24);
@@ -528,6 +531,8 @@ read1page(Flash *f, ulong offset, void *buf)
 		}
 		p += 256;
 	}
+
+	flcachepage(f, page, buf);
 	return 0;
 }
 

+ 1 - 0
sys/src/9/kw/fns.h

@@ -47,6 +47,7 @@ extern u32int dacget(void);
 extern void dacput(u32int);
 extern u32int farget(void);
 extern u32int fsrget(void);
+extern int ispow2(uvlong);
 extern void l1cachesoff(void);
 extern void l1cacheson(void);
 extern void l2cachecfgoff(void);

+ 9 - 0
sys/src/9/kw/main.c

@@ -49,6 +49,10 @@ static char confname[MAXCONF][KNAMELEN];
 static char confval[MAXCONF][MAXCONFLINE];
 static int nconf;
 
+#ifdef CRYPTOSANDBOX
+uchar sandbox[64*1024+BY2PG];
+#endif
+
 static int
 findconf(char *name)
 {
@@ -296,6 +300,11 @@ wave(' ');
 	/* only now can we print */
 	print("from Bell Labs\n\n");
 
+#ifdef CRYPTOSANDBOX
+	print("sandbox: 64K at physical %#lux, mapped to 0xf10b0000\n",
+		PADDR((uintptr)sandbox & ~(BY2PG-1)));
+#endif
+
 	archconfinit();
 	cpuidprint();
 	timersinit();

+ 22 - 0
sys/src/9/kw/mmu.c

@@ -55,6 +55,10 @@ mmudump(PTE *l1)
 			startva, endva-1, startpa, rngtype);
 }
 
+#ifdef CRYPTOSANDBOX
+extern uchar sandbox[64*1024+BY2PG];
+#endif
+
 /* identity map `mbs' megabytes from phys */
 void
 mmuidmap(uintptr phys, int mbs)
@@ -109,6 +113,24 @@ mmuinit(void)
 	/* identity map by default */
 	for (i = 0; i < 1024/4; i++)
 		l2[L2X(VIRTIO + i*BY2PG)] = (PHYSIO + i*BY2PG)|L2AP(Krw)|Small;
+#ifdef CRYPTOSANDBOX
+	/*
+	 * rest is to let rae experiment with the crypto hardware
+	 */
+	/* access to cycle counter */
+	l2[L2X(AddrTimer)] = AddrTimer | L2AP(Urw)|Small;
+	/* cesa registers; also visible in user space */
+	for (i = 0; i < 16; i++)
+		l2[L2X(AddrCesa + i*BY2PG)] = (AddrCesa + i*BY2PG) |
+			L2AP(Urw)|Small;
+	/* crypto sram; remapped to unused space and visible in user space */
+	l2[L2X(PHYSIO + 0xa0000)] = PHYSCESASRAM | L2AP(Urw)|Small;
+	/* 64k of scratch dram */
+	for (i = 0; i < 16; i++)
+		l2[L2X(PHYSIO + 0xb0000 + i*BY2PG)] =
+			(PADDR((uintptr)sandbox & ~(BY2PG-1)) + i*BY2PG) |
+			 L2AP(Urw) | Small;
+#endif
 	l1[L1X(VIRTIO)] = pa|Dom0|Coarse;
 	coherence();
 

+ 1 - 2
sys/src/9/omap/beagle

@@ -1,4 +1,4 @@
-# beagle board
+# beagle & igepv2 boards
 dev
 	root
 	cons
@@ -18,7 +18,6 @@ dev
 	aoe
 	sd
 #	flash
-#	pnp		pci
 
 	ether		netif
 	ip		arp chandial ip ipv6 ipaux iproute netlog nullmedium pktmedium ptclbsum inferno

+ 1 - 1
sys/src/9/omap/clock.c

@@ -37,7 +37,7 @@ enum {
 	MinPeriod	= (Tcycles / 100 < 2? 2: Tcycles / 100),
 	MaxPeriod	= Tcycles,
 
-	Dogtimeout	= 4 * Clockfreqbase,	/* 4 seconds */
+	Dogtimeout	= 20 * Clockfreqbase,	/* was 4 s.; must be ≤ 21 s. */
 };
 
 enum {

+ 2 - 2
sys/src/9/omap/devcons.c

@@ -304,8 +304,8 @@ panic(char *fmt, ...)
 	splx(s);
 	prflush();
 	buf[n] = '\n';
-	putstrn(buf, n+1);
-	dumpstack();
+//	putstrn(buf, n+1);
+//	dumpstack();
 
 	exit(1);
 }

+ 2 - 0
sys/src/9/port/flashif.h

@@ -28,7 +28,9 @@ struct Flashregion {
 	ulong	start;		/* physical base address (allowing for banks) */
 	ulong	end;
 	ulong	erasesize;
+	ulong	eraseshift;	/* log2(erasesize) */
 	ulong	pagesize;	/* if non-0, size of pages within erase block */
+	ulong	pageshift;	/* log2(pagesize) */
 	ulong	spares;		/* spare bytes per page, for ecc, etc. */
 };
 

+ 2 - 2
sys/src/cmd/sam/file.c

@@ -139,7 +139,7 @@ loginsert(File *f, uint p0, Rune *s, uint ns)
 
 	if(merge.f != f
 	|| p0-(merge.p0+merge.n)>Maxmerge			/* too far */
-	|| merge.nbuf+((p0+ns)-(merge.p0+merge.n))>RBUFSIZE)	/* too long */
+	|| merge.nbuf+((p0+ns)-(merge.p0+merge.n))>=RBUFSIZE)	/* too long */
 		flushmerge();
 
 	if(ns>=RBUFSIZE){
@@ -178,7 +178,7 @@ logdelete(File *f, uint p0, uint p1)
 
 	if(merge.f != f
 	|| p0-(merge.p0+merge.n)>Maxmerge			/* too far */
-	|| merge.nbuf+(p0-(merge.p0+merge.n))>RBUFSIZE){	/* too long */
+	|| merge.nbuf+(p0-(merge.p0+merge.n))>=RBUFSIZE){	/* too long */
 		flushmerge();
 		merge.f = f;
 		merge.p0 = p0;

+ 1 - 1
sys/src/cmd/screenlock.c

@@ -250,7 +250,7 @@ lockscreen(void)
 
 		/* identify the user on screen, centered */
 		tm = localtime(time(0));
-		s = smprint("user %s at %d:%2d", getuser(), tm->hour, tm->min);
+		s = smprint("user %s at %d:%02.2d", getuser(), tm->hour, tm->min);
 		p = subpt(p, Pt(stringwidth(font, "m") * strlen(s) / 2, 0));
 		screenstring(p, s);
 	}