blob: a3cfc3b3706299f1e2b7a99c7d06d7a9086a7acf [file] [log] [blame]
From bb580f7b601e5395a2f8fcb2485387035273320f Mon Sep 17 00:00:00 2001
From: Hongxu Jia <hongxu.jia@windriver.com>
Date: Tue, 18 Aug 2020 17:49:34 +0800
Subject: [PATCH 2/3] fixes_for_module_memory
Upstream-Status: Backport [https://www.virtualbox.org/ticket/19644]
Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
---
.../Runtime/r0drv/linux/alloc-r0drv-linux.c | 18 ++++++++++++++++--
1 file changed, 16 insertions(+), 2 deletions(-)
diff --git a/src/VBox/Runtime/r0drv/linux/alloc-r0drv-linux.c b/src/VBox/Runtime/r0drv/linux/alloc-r0drv-linux.c
index bbb8acc6..45cd34c7 100644
--- a/src/VBox/Runtime/r0drv/linux/alloc-r0drv-linux.c
+++ b/src/VBox/Runtime/r0drv/linux/alloc-r0drv-linux.c
@@ -153,6 +153,8 @@ RT_EXPORT_SYMBOL(RTR0MemExecDonate);
#ifdef RTMEMALLOC_EXEC_VM_AREA
+
+
/**
* Allocate executable kernel memory in the module range.
*
@@ -168,7 +170,12 @@ static PRTMEMHDR rtR0MemAllocExecVmArea(size_t cb)
struct vm_struct *pVmArea;
size_t iPage;
+# if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0)
+ pVmArea = __get_vm_area_caller(cbAlloc, VM_ALLOC, MODULES_VADDR, MODULES_END,
+ __builtin_return_address(0));
+#else
pVmArea = __get_vm_area(cbAlloc, VM_ALLOC, MODULES_VADDR, MODULES_END);
+#endif
if (!pVmArea)
return NULL;
pVmArea->nr_pages = 0; /* paranoia? */
@@ -201,14 +208,21 @@ static PRTMEMHDR rtR0MemAllocExecVmArea(size_t cb)
# endif
pVmArea->nr_pages = cPages;
pVmArea->pages = papPages;
- if (!map_vm_area(pVmArea, PAGE_KERNEL_EXEC,
+# if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0)
+ unsigned long start = (unsigned long)pVmArea->addr;
+ unsigned long size = get_vm_area_size(pVmArea);
+
+ if (!map_kernel_range(start, size, PAGE_KERNEL_EXEC, papPages))
+#else
+ if (!map_vm_area(pVmArea, PAGE_KERNEL_EXEC,
# if LINUX_VERSION_CODE < KERNEL_VERSION(3, 17, 0)
&papPagesIterator
# else
papPages
# endif
))
- {
+#endif
+ {
PRTMEMLNXHDREX pHdrEx = (PRTMEMLNXHDREX)pVmArea->addr;
pHdrEx->pVmArea = pVmArea;
pHdrEx->pvDummy = NULL;
--
2.18.2