~kris/9p

9hist

ed88a2c59ef43da0f5b287a1162a60ba03a6f42b — David du Colombier 25 years ago 533c8fd
Plan 9 from Bell Labs 2001-08-16
3 files changed, 32 insertions(+), 37 deletions(-)

M bitsy/l.s
M bitsy/power.c
M bitsy/screen.c
M bitsy/l.s => bitsy/l.s +1 -5
@@ 600,13 600,9 @@ TEXT sa1100_power_resume(SB), $-4
	MOVW	R0,R0
	/* flush i&d caches */
	MCR		CpMMU, 0, R0, C(CpCacheFlush), C(0x7), 0
	/* drain prefetch */
	MOVW	R0,R0						
	MOVW	R0,R0
	MOVW	R0,R0
	MOVW	R0,R0
	/* flush tlb */
	MCR		CpMMU, 0, R0, C(CpTLBFlush), C(0x7), 0
	/* drain prefetch */
	MOVW	R0,R0						
	MOVW	R0,R0
	MOVW	R0,R0

M bitsy/power.c => bitsy/power.c +29 -31
@@ 42,42 42,39 @@ checkflash(void)
}

static void
checkpagetab(void)
checkktext(void)
{
	extern ulong l1table;
	ulong *p;
	ulong s;

	s = 0;
	for (p = (ulong*)l1table; p < (ulong*)(l1table+16*1024); p++)
	for (p = (ulong*)_start; p < (ulong*)etext; p++){
		if(*p == 0)
			iprint("0x%lux->0\n", p);
		if (((ulong)p & 0x1fff) == 0){
			iprint("page 0x%lux checksum 0x%lux\n",
				(ulong)(p-1)&~0x1fff, s);
			s = 0;
		}
		s += *p;
	iprint("page table checksum is 0x%lux\n", s);
	}
	iprint("page 0x%lux checksum 0x%lux\n", (ulong)(p-1)&~0x1fff, s);
}

static void
checkktext(void)
checkpagetab(void)
{
	/* check the kernel text */
	ulong *p, *q;
	extern ulong l1table;
	ulong *p;
	ulong s;

	s = 0;
	if (savedtext == nil){
		savedtext=malloc((ulong)etext-(ulong)_start);
		if (savedtext == nil)
			iprint("can't malloc savedtext\n");
		memmove(savedtext, _start, (ulong)etext-(ulong)_start);
	}else{
		for (p = (ulong*)_start, q = (ulong*)savedtext; p < (ulong*)(etext); p++,q++) {
			if (*p != *q) {
				iprint("0x%lux: 0x%lux != 0x%lux\n", p, *p, *q);
				s++;
			}
		}
		if (s == 0) iprint("ktext ok\n");
	}
	for (p = (ulong*)l1table; p < (ulong*)(l1table+16*1024); p++)
		s += *p;
	iprint("page table checksum is 0x%lux\n", s);
}


static void
dumpitall(void)
{


@@ 111,7 108,7 @@ dumpitall(void)
		powerregs->pwer, powerregs->pspr, powerregs->pgsr, powerregs->posr);
	checkpagetab();
	checkflash();
//	checkktext();
	checkktext();
	iprint("\n\n");
}



@@ 149,6 146,8 @@ void	(*restart)(void) = nil;
static void
sa1100_power_off(void)
{
	/* Set KAPD and EAPD bits */
	memconfregs->mdrefr |= 0x30000000;

	/* enable wakeup by µcontroller, on/off switch
	 * or real-time clock alarm


@@ 159,7 158,7 @@ sa1100_power_off(void)
	resetregs->rcsr =  RCSR_all;

	/* disable internal oscillator, float CS lines */
	powerregs->pcfr = PCFR_opde | PCFR_fp | PCFR_fs;
	powerregs->pcfr = PCFR_opde;
	powerregs->pgsr = 0;
	/* set resume address. The loader jumps to it */
	powerregs->pspr = (ulong)sa1100_power_resume;


@@ 168,17 167,15 @@ sa1100_power_off(void)
//sa1100_power_resume();

	/* set lowest clock; delay to avoid resume hangs on fast sa1110 */
/*	Doesn't work [sjm]
	delay(90);
	powerregs->ppcr = 0;
	delay(90);
*/

	/* set all GPIOs to input mode  */
	gpioregs->direction = 0;
	delay(100);
	/* enter sleep mode */

/*	Doesn't work [sjm]
	powerregs->ppcr = 0;
*/
	powerregs->pmcr = PCFR_suspend;
	for(;;);
}


@@ 214,7 211,7 @@ deepsleep(void) {
	µcpower(0);
	iprint("entering suspend mode, sp = 0x%lux, pc = 0x%lux, psw = 0x%ux\n", &xsp, xlink, power_pl);
	dumpitall();
	delay(100);
	delay(1000);
	uartpower(0);
	rs232power(0);
	clockpower(0);


@@ 225,6 222,7 @@ deepsleep(void) {
	mecr = memconfregs->mecr;
	if(setpowerlabel()){
		/* return here with mmu back on */
		trapresume();

		/* Turn off memory auto power */
//		memconfregs->mdrefr &= ~0x30000000;


@@ 238,15 236,15 @@ deepsleep(void) {
			gpioregs->edgestatus = (1<<IRQgpio0);
			intrregs->icip = (1<<IRQgpio0);
		}
		trapresume();
		clockpower(1);
		gpclkregs->r0 = 1<<0;
		rs232power(1);
		uartpower(1);
		dumpitall();
		delay(100);
		xlink = getcallerpc(&xlink);
		iprint("\nresuming execution, sp = 0x%lux, pc = 0x%lux, psw = 0x%ux\n", &xsp, xlink, splhi());
		dumpitall();
		delay(1000);
//		irpower(1);
//		audiopower(1);
		µcpower(1);

M bitsy/screen.c => bitsy/screen.c +2 -1
@@ 252,7 252,8 @@ screeninit(void)
	blanktime = 3;	/* minutes */

	screenwin();
	screenputs = bitsyscreenputs;
//	screenputs = bitsyscreenputs;
	screenputs = nil;
}

void