diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2020-06-06 14:43:24 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2020-06-06 14:43:24 +0200 |
commit | 21e4d88a51303bc41cc28aba77d8f65d7776e39e (patch) | |
tree | b271ba195089c9b24911f0d7fae9e9cbee748d07 /sys/src/9/pc | |
parent | 5f3e72eb844582693e1b0bd4f73be59ab822531e (diff) |
pc, pc64: use 64-bit physical addresses for vmap() and upaalloc()
Diffstat (limited to 'sys/src/9/pc')
-rw-r--r-- | sys/src/9/pc/fns.h | 6 | ||||
-rw-r--r-- | sys/src/9/pc/memory.c | 8 | ||||
-rw-r--r-- | sys/src/9/pc/mmu.c | 15 |
3 files changed, 14 insertions, 15 deletions
diff --git a/sys/src/9/pc/fns.h b/sys/src/9/pc/fns.h index fc82116fb..0a5be71ac 100644 --- a/sys/src/9/pc/fns.h +++ b/sys/src/9/pc/fns.h @@ -192,10 +192,10 @@ int tas(void*); uvlong tscticks(uvlong*); ulong umballoc(ulong, ulong, ulong); void umbfree(ulong, ulong); -ulong upaalloc(ulong, ulong, ulong); -void upafree(ulong, ulong); +uvlong upaalloc(uvlong, ulong, ulong); +void upafree(uvlong, ulong); void vectortable(void); -void* vmap(ulong, int); +void* vmap(uvlong, int); int vmapsync(ulong); void vmxprocrestore(Proc *); void vmxshutdown(void); diff --git a/sys/src/9/pc/memory.c b/sys/src/9/pc/memory.c index 9b3968f59..04cf3b9fe 100644 --- a/sys/src/9/pc/memory.c +++ b/sys/src/9/pc/memory.c @@ -244,14 +244,14 @@ rsdsearch(void) * does not map the physical address into virtual memory. * Call vmap to do that. */ -ulong -upaalloc(ulong pa, ulong size, ulong align) +uvlong +upaalloc(uvlong pa, ulong size, ulong align) { - return (ulong)memmapalloc(pa == -1UL ? -1ULL : (uvlong)pa, size, align, MemUPA); + return memmapalloc(pa, size, align, MemUPA); } void -upafree(ulong pa, ulong size) +upafree(uvlong pa, ulong size) { memmapfree(pa, size, MemUPA); } diff --git a/sys/src/9/pc/mmu.c b/sys/src/9/pc/mmu.c index 614339295..df0c23520 100644 --- a/sys/src/9/pc/mmu.c +++ b/sys/src/9/pc/mmu.c @@ -71,7 +71,6 @@ mmuinit(void) { ulong x, *p; ushort ptr[3]; - vlong v; if(0) print("vpt=%#.8ux vpd=%#p kmap=%#.8ux\n", VPT, vpd, KMAP); @@ -537,11 +536,16 @@ static void pdbunmap(ulong*, ulong, int); * Add a device mapping to the vmap range. */ void* -vmap(ulong pa, int size) +vmap(uvlong pa, int size) { int osize; ulong o, va; + if(pa < BY2PG || size <= 0 || ((pa+size) >> 32) != 0 || size > VMAPSIZE){ + print("vmap pa=%llux size=%d pc=%#p\n", pa, size, getcallerpc(&pa)); + return nil; + } + /* * might be asking for less than a page. */ @@ -549,17 +553,12 @@ vmap(ulong pa, int size) o = pa & (BY2PG-1); pa -= o; size += o; - size = ROUND(size, BY2PG); - if(pa == 0){ - print("vmap pa=0 pc=%#p\n", getcallerpc(&pa)); - return nil; - } ilock(&vmaplock); if((va = vmapalloc(size)) == 0 || pdbmap(MACHP(0)->pdb, pa|PTEUNCACHED|PTEWRITE, va, size) < 0){ iunlock(&vmaplock); - return 0; + return nil; } iunlock(&vmaplock); /* avoid trap on local processor |