aboutsummaryrefslogtreecommitdiff
path: root/pk/mmap.h
diff options
context:
space:
mode:
authorAndrew Waterman <andrew@sifive.com>2021-03-17 00:30:12 -0700
committerAndrew Waterman <andrew@sifive.com>2021-03-25 22:21:06 -0700
commitb9eba474fb52dbf205c7b466af458397a7487216 (patch)
treee203753f33c579d163b9c94bffa1d50c92c21b65 /pk/mmap.h
parent0b5ef9cf755811e6a8a2901585f3ecb5604e55f1 (diff)
downloadpk-b9eba474fb52dbf205c7b466af458397a7487216.zip
pk-b9eba474fb52dbf205c7b466af458397a7487216.tar.gz
pk-b9eba474fb52dbf205c7b466af458397a7487216.tar.bz2
pk: support >2 GiB of user memory for RV64
Previously, the pk would always run from virtual address MEM_START. Instead, remap it into the negative virtual addresses, allowing user processes to expand beyond MEM_START.
Diffstat (limited to 'pk/mmap.h')
-rw-r--r--pk/mmap.h9
1 files changed, 7 insertions, 2 deletions
diff --git a/pk/mmap.h b/pk/mmap.h
index 9e3fad6..7e68777 100644
--- a/pk/mmap.h
+++ b/pk/mmap.h
@@ -34,7 +34,12 @@ uintptr_t do_mremap(uintptr_t addr, size_t old_size, size_t new_size, int flags)
uintptr_t do_mprotect(uintptr_t addr, size_t length, int prot);
uintptr_t do_brk(uintptr_t addr);
-#define kva2pa(va) ((uintptr_t)(va))
-#define is_uva(va) ((uintptr_t)(va) < MEM_START)
+#define KVA_START ((uintptr_t)-1 << (VA_BITS-1))
+
+extern uintptr_t kva2pa_offset;
+#define kva2pa(va) ((uintptr_t)(va) - kva2pa_offset)
+#define pa2kva(pa) ((uintptr_t)(pa) + kva2pa_offset)
+#define kva2pa_maybe(va) ((uintptr_t)(va) >= KVA_START ? kva2pa(va) : (uintptr_t)(va))
+#define is_uva(va) ((uintptr_t)(va) < KVA_START)
#endif