summaryrefslogtreecommitdiff
path: root/sys/src/9/pc64
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2021-11-26 20:51:45 +0000
committercinap_lenrek <cinap_lenrek@felloff.net>2021-11-26 20:51:45 +0000
commit20ea113790c22e5fc8dd0051baa359e4fa083425 (patch)
treea64dbfef9f4e41db253a1d8f240bf6b060639b27 /sys/src/9/pc64
parentadd3a0a4da2f46f69a87782699e77c794a8b2cb9 (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.h10
-rw-r--r--sys/src/9/pc64/mem.h6
-rw-r--r--sys/src/9/pc64/mmu.c6
-rw-r--r--sys/src/9/pc64/squidboy.c9
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;