From ed88a2c59ef43da0f5b287a1162a60ba03a6f42b Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Thu, 16 Aug 2001 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2001-08-16 --- bitsy/l.s | 6 +---- bitsy/power.c | 60 ++++++++++++++++++++++++-------------------------- bitsy/screen.c | 3 ++- 3 files changed, 32 insertions(+), 37 deletions(-) diff --git a/bitsy/l.s b/bitsy/l.s index 1475bebe9843a9ee4c90fa995e2a91f4f2c08819..6d6563c73425427bc5e537c2703e260dafa6928c 100644 --- a/bitsy/l.s +++ b/bitsy/l.s @@ -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 diff --git a/bitsy/power.c b/bitsy/power.c index 8ef97a0cb5a5f570f80f9eb0df0f92c5cb751122..c052df39e70f229ce1b7b2e7b7945ca4bc28a1d7 100644 --- a/bitsy/power.c +++ b/bitsy/power.c @@ -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<icip = (1<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); diff --git a/bitsy/screen.c b/bitsy/screen.c index f5288c14d6337ead1d1cc2d41fa2670fe94b30bc..6a1fb6aca10a646f1bb6214789eb3355dad258b5 100644 --- a/bitsy/screen.c +++ b/bitsy/screen.c @@ -252,7 +252,8 @@ screeninit(void) blanktime = 3; /* minutes */ screenwin(); - screenputs = bitsyscreenputs; +// screenputs = bitsyscreenputs; + screenputs = nil; } void