diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2021-11-26 20:51:45 +0000 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2021-11-26 20:51:45 +0000 |
commit | 20ea113790c22e5fc8dd0051baa359e4fa083425 (patch) | |
tree | a64dbfef9f4e41db253a1d8f240bf6b060639b27 /sys/src/9/pc64 | |
parent | add3a0a4da2f46f69a87782699e77c794a8b2cb9 (diff) |
kernel: support large 64-bit pci membars, increase pc64 VMAPSIZE to 1TB
This makes vmap()/vunmap() take a vlong size argument,
and change the type of Pci.mem[].size to vlong as well.
Even if vmap() wont support large mappings, it is nice to
get the original unruncated value for error checking.
pc64 needs a bigger VMAP window, as system76 pangolin
puts the framebuffer at a physical address > 512GB.
Diffstat (limited to 'sys/src/9/pc64')
-rw-r--r-- | sys/src/9/pc64/fns.h | 10 | ||||
-rw-r--r-- | sys/src/9/pc64/mem.h | 6 | ||||
-rw-r--r-- | sys/src/9/pc64/mmu.c | 6 | ||||
-rw-r--r-- | sys/src/9/pc64/squidboy.c | 9 |
4 files changed, 17 insertions, 14 deletions
diff --git a/sys/src/9/pc64/fns.h b/sys/src/9/pc64/fns.h index b58c7e3a4..687ec50af 100644 --- a/sys/src/9/pc64/fns.h +++ b/sys/src/9/pc64/fns.h @@ -162,14 +162,14 @@ int tas(void*); uvlong tscticks(uvlong*); ulong umballoc(ulong, ulong, ulong); void umbfree(ulong, ulong); -uvlong upaalloc(uvlong, ulong, ulong); -uvlong upaallocwin(uvlong, ulong, ulong, ulong); -void upafree(uvlong, ulong); +uvlong upaalloc(uvlong, uvlong, uvlong); +uvlong upaallocwin(uvlong, uvlong, uvlong, uvlong); +void upafree(uvlong, uvlong); void vectortable(void); void vmxprocrestore(Proc *); void vmxshutdown(void); -void* vmap(uvlong, int); -void vunmap(void*, int); +void* vmap(uvlong, vlong); +void vunmap(void*, vlong); void wbinvd(void); void writeconf(void); int wrmsr(int, vlong); diff --git a/sys/src/9/pc64/mem.h b/sys/src/9/pc64/mem.h index 4541a62a0..dc28517a2 100644 --- a/sys/src/9/pc64/mem.h +++ b/sys/src/9/pc64/mem.h @@ -53,10 +53,10 @@ #define KZERO (0xffffffff80000000ull) #define KTZERO (KZERO+1*MiB+64*KiB) -#define VMAP (0xffffff0000000000ull) -#define VMAPSIZE (512ull*GiB) +#define VMAP (0xfffffe8000000000ull) +#define VMAPSIZE (1024ull*GiB) -#define KMAP (0xfffffe8000000000ull) +#define KMAP (0xfffffe0000000000ull) #define KMAPSIZE (2*MiB) /* diff --git a/sys/src/9/pc64/mmu.c b/sys/src/9/pc64/mmu.c index 1f6560bfe..7f33ccc5a 100644 --- a/sys/src/9/pc64/mmu.c +++ b/sys/src/9/pc64/mmu.c @@ -584,13 +584,13 @@ kunmap(KMap *k) * synchronization is being done. */ void* -vmap(uvlong pa, int size) +vmap(uvlong pa, vlong size) { uintptr va; int o; if(pa < BY2PG || size <= 0 || -pa < size || pa+size > VMAPSIZE){ - print("vmap pa=%llux size=%d pc=%#p\n", pa, size, getcallerpc(&pa)); + print("vmap pa=%llux size=%lld pc=%#p\n", pa, size, getcallerpc(&pa)); return nil; } va = pa+VMAP; @@ -607,7 +607,7 @@ vmap(uvlong pa, int size) } void -vunmap(void *v, int) +vunmap(void *v, vlong) { paddr(v); /* will panic on error */ } diff --git a/sys/src/9/pc64/squidboy.c b/sys/src/9/pc64/squidboy.c index f7882820b..ea0f9a10a 100644 --- a/sys/src/9/pc64/squidboy.c +++ b/sys/src/9/pc64/squidboy.c @@ -32,7 +32,7 @@ squidboy(Apic* apic) void mpstartap(Apic* apic) { - uintptr *apbootp, *pml4, *pdp0; + uintptr *apbootp, *pml4, *pdp0, v; Segdesc *gdt; Mach *mach; uchar *p; @@ -65,8 +65,11 @@ mpstartap(Apic* apic) * map KZERO (note that we share the KZERO (and VMAP) * PDP between processors. */ - pml4[PTLX(KZERO, 3)] = MACHP(0)->pml4[PTLX(KZERO, 3)]; - pml4[PTLX(VMAP, 3)] = MACHP(0)->pml4[PTLX(VMAP, 3)]; + *mmuwalk(pml4, KZERO, 3, 0) = *mmuwalk(m->pml4, KZERO, 3, 0); + for(v = VMAP; v < VMAP+VMAPSIZE; v += PGLSZ(3)){ + mmuwalk(m->pml4, v, 2, 1); /* force create */ + *mmuwalk(pml4, v, 3, 0) = *mmuwalk(m->pml4, v, 3, 0); + } /* double map */ pml4[0] = PADDR(pdp0) | PTEWRITE|PTEVALID; |