diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-10-18 02:01:58 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-10-18 02:01:58 +0200 |
commit | 0a6439a1f564de17bfad7a327178e47483a86e1a (patch) | |
tree | 7866ca8d37f138ecbbdc4fc8f9afa1376bc7ae44 /sys | |
parent | 81e0d6e988289c983445f855583496048fb4c61b (diff) |
pc, pc64: allow passing RSDT pointer in *acpi= boot parameter, early bootscreeninit(), fix rampage() usage
rampage() cannot be used after meminit(), so test for
conf.mem[0].npage != 0 and use xalloc()/mallocalign()
instead. this allows us to use vmap() early before
mmuinit() which is needed for bootscreeninit() and
acpi.
to get memory for page tables, pc64 needs a lowraminit().
with EFI, the RSDT pointer is passed in *acpi= parameter
from the efi loader. as the RSDT is ususally at the end of
the physical address space (and not to be found in
bios areas), we cannot KMAP() it so we need to vmap().
Diffstat (limited to 'sys')
-rw-r--r-- | sys/src/9/pc/archacpi.c | 8 | ||||
-rw-r--r-- | sys/src/9/pc/main.c | 4 | ||||
-rw-r--r-- | sys/src/9/pc/mmu.c | 5 | ||||
-rw-r--r-- | sys/src/9/pc64/main.c | 4 | ||||
-rw-r--r-- | sys/src/9/pc64/memory.c | 29 | ||||
-rw-r--r-- | sys/src/9/pc64/mmu.c | 6 |
6 files changed, 43 insertions, 13 deletions
diff --git a/sys/src/9/pc/archacpi.c b/sys/src/9/pc/archacpi.c index 0b6e7ea48..f996d90df 100644 --- a/sys/src/9/pc/archacpi.c +++ b/sys/src/9/pc/archacpi.c @@ -645,11 +645,17 @@ readtbls(Chan*, void *v, long n, vlong o) static int identify(void) { + uintptr pa; char *cp; if((cp = getconf("*acpi")) == nil) return 1; - if((rsd = sigsearch("RSD PTR ")) == nil) + pa = (uintptr)strtoull(cp, nil, 16); + if(pa <= 1) + rsd = sigsearch("RSD PTR "); + else + rsd = vmap(pa, sizeof(Rsd)); + if(rsd == nil) return 1; if(checksum(rsd, 20) && checksum(rsd, 36)) return 1; diff --git a/sys/src/9/pc/main.c b/sys/src/9/pc/main.c index 637895575..2f2e9d04c 100644 --- a/sys/src/9/pc/main.c +++ b/sys/src/9/pc/main.c @@ -146,15 +146,15 @@ main(void) cpuidentify(); meminit(); confinit(); - archinit(); xinit(); + archinit(); + bootscreeninit(); if(i8237alloc != nil) i8237alloc(); trapinit(); printinit(); cpuidprint(); mmuinit(); - bootscreeninit(); if(arch->intrinit) /* launches other processors on an mp */ arch->intrinit(); timersinit(); diff --git a/sys/src/9/pc/mmu.c b/sys/src/9/pc/mmu.c index 3ed8229e4..6fbc323af 100644 --- a/sys/src/9/pc/mmu.c +++ b/sys/src/9/pc/mmu.c @@ -59,7 +59,6 @@ Segdesc gdt[NGDT] = [KESEG16] EXEC16SEGM(0), /* kernel code 16-bit */ }; -static int didmmuinit; static void taskswitch(ulong, ulong); static void memglobal(void); @@ -79,8 +78,6 @@ mmuinit(void) ulong x, *p; ushort ptr[3]; - didmmuinit = 1; - if(0) print("vpt=%#.8ux vpd=%#p kmap=%#.8ux\n", VPT, vpd, KMAP); @@ -523,7 +520,7 @@ mmuwalk(ulong* pdb, ulong va, int level, int create) * memory.c if we haven't set up the xalloc * tables yet. */ - if(didmmuinit) + if(conf.mem[0].npage != 0) map = xspanalloc(BY2PG, BY2PG, 0); else map = rampage(); diff --git a/sys/src/9/pc64/main.c b/sys/src/9/pc64/main.c index 63dce3934..14a786605 100644 --- a/sys/src/9/pc64/main.c +++ b/sys/src/9/pc64/main.c @@ -32,6 +32,7 @@ int idle_spin; uchar *sp; /* user stack of init proc */ extern void (*i8237alloc)(void); +extern void bootscreeninit(void); static void multibootargs(void) @@ -506,8 +507,9 @@ main() cpuidentify(); meminit(); confinit(); - archinit(); xinit(); + archinit(); + bootscreeninit(); if(i8237alloc != nil) i8237alloc(); trapinit(); diff --git a/sys/src/9/pc64/memory.c b/sys/src/9/pc64/memory.c index 1c7759dad..27e01de64 100644 --- a/sys/src/9/pc64/memory.c +++ b/sys/src/9/pc64/memory.c @@ -371,6 +371,34 @@ sigsearch(char* signature) return sigscan(KADDR(0xe0000), 0x20000, signature); } +static void +lowraminit(void) +{ + uintptr pa, x; + uchar *bda; + + /* + * Initialise the memory bank information for conventional memory + * (i.e. less than 640KB). The base is the first location after the + * bootstrap processor MMU information and the limit is obtained from + * the BIOS data area. + */ + x = PADDR(CPU0END); + bda = (uchar*)KADDR(0x400); + pa = ((bda[0x14]<<8)|bda[0x13])*KB; + if(x < pa){ + mapfree(&rmapram, x, pa-x); + memset(KADDR(x), 0, pa-x); /* keep us honest */ + } + + x = PADDR(PGROUND((uintptr)end)); + pa = MemMin; + if(x > pa) + panic("kernel too big"); + mapfree(&rmapram, x, pa-x); + memset(KADDR(x), 0, pa-x); /* keep us honest */ +} + typedef struct Emap Emap; struct Emap { @@ -561,6 +589,7 @@ meminit(void) uintptr lost; umbscan(); + lowraminit(); e820scan(); /* diff --git a/sys/src/9/pc64/mmu.c b/sys/src/9/pc64/mmu.c index f25d485e1..4d896ce4f 100644 --- a/sys/src/9/pc64/mmu.c +++ b/sys/src/9/pc64/mmu.c @@ -23,8 +23,6 @@ Segdesc gdt[NGDT] = [UESEG] EXECSEGM(3), /* user code */ }; -static int didmmuinit = 0; - static struct { Lock; MMU *free; @@ -79,8 +77,6 @@ mmuinit(void) vlong v; int i; - didmmuinit = 1; - /* zap double map done by l.s */ m->pml4[512] = 0; m->pml4[0] = 0; @@ -242,7 +238,7 @@ mmucreate(uintptr *table, uintptr va, int level, int index) up->kmapcount++; } page = p->page; - } else if(didmmuinit) { + } else if(conf.mem[0].npage != 0) { page = mallocalign(PTSZ, BY2PG, 0, 0); } else { page = rampage(); |