Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

virtualbox-ose: fix DKMS w/ linux-5.10; dbus hint #27256

Merged
merged 1 commit into from
Dec 18, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions srcpkgs/virtualbox-ose/files/vboxservice/run
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
#!/bin/sh
# Note: requires dbus service
exec VBoxService -f
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
:Index: src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c
===================================================================
--- src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c (Revision 141658)
+++ src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c (Arbeitskopie)
@@ -56,9 +56,12 @@
* Whether we use alloc_vm_area (3.2+) for executable memory.
* This is a must for 5.8+, but we enable it all the way back to 3.2.x for
* better W^R compliance (fExecutable flag). */
-#if RTLNX_VER_MIN(3,2,0) || defined(DOXYGEN_RUNNING)
+#if RTLNX_VER_RANGE(3,2,0, 5,10,0) || defined(DOXYGEN_RUNNING)
# define IPRT_USE_ALLOC_VM_AREA_FOR_EXEC
#endif
+#if RTLNX_VER_MIN(5,10,0) || defined(DOXYGEN_RUNNING)
+# define IPRT_USE_APPLY_TO_PAGE_RANGE_FOR_EXEC
+#endif

/*
* 2.6.29+ kernels don't work with remap_pfn_range() anymore because
@@ -502,7 +505,43 @@
}


+#ifdef IPRT_USE_APPLY_TO_PAGE_RANGE_FOR_EXEC
/**
+ * User data passed to the apply_to_page_range() callback.
+ */
+typedef struct LNXAPPLYPGRANGE
+{
+ /** Pointer to the memory object. */
+ PRTR0MEMOBJLNX pMemLnx;
+ /** The page protection flags to apply. */
+ pgprot_t fPg;
+} LNXAPPLYPGRANGE;
+/** Pointer to the user data. */
+typedef LNXAPPLYPGRANGE *PLNXAPPLYPGRANGE;
+/** Pointer to the const user data. */
+typedef const LNXAPPLYPGRANGE *PCLNXAPPLYPGRANGE;
+
+/**
+ * Callback called in apply_to_page_range().
+ *
+ * @returns Linux status code.
+ * @param pPte Pointer to the page table entry for the given address.
+ * @param uAddr The address to apply the new protection to.
+ * @param pvUser The opaque user data.
+ */
+static DECLCALLBACK(int) rtR0MemObjLinuxApplyPageRange(pte_t *pPte, unsigned long uAddr, void *pvUser)
+{
+ PCLNXAPPLYPGRANGE pArgs = (PCLNXAPPLYPGRANGE)pvUser;
+ PRTR0MEMOBJLNX pMemLnx = pArgs->pMemLnx;
+ uint32_t idxPg = (uAddr - (unsigned long)pMemLnx->Core.pv) >> PAGE_SHIFT;
+
+ set_pte(pPte, mk_pte(pMemLnx->apPages[idxPg], pArgs->fPg));
+ return 0;
+}
+#endif
+
+
+/**
* Maps the allocation into ring-0.
*
* This will update the RTR0MEMOBJLNX::Core.pv and RTR0MEMOBJ::fMappedToRing0 members.
@@ -584,6 +623,11 @@
else
# endif
{
+# if defined(IPRT_USE_APPLY_TO_PAGE_RANGE_FOR_EXEC)
+ if (fExecutable)
+ pgprot_val(fPg) |= _PAGE_NX; /* Uses RTR0MemObjProtect to clear NX when memory ready, W^X fashion. */
+# endif
+
# ifdef VM_MAP
pMemLnx->Core.pv = vmap(&pMemLnx->apPages[0], pMemLnx->cPages, VM_MAP, fPg);
# else
@@ -1851,6 +1895,21 @@
preempt_enable();
return VINF_SUCCESS;
}
+# elif defined(IPRT_USE_APPLY_TO_PAGE_RANGE_FOR_EXEC)
+ PRTR0MEMOBJLNX pMemLnx = (PRTR0MEMOBJLNX)pMem;
+ if ( pMemLnx->fExecutable
+ && pMemLnx->fMappedToRing0)
+ {
+ LNXAPPLYPGRANGE Args;
+ Args.pMemLnx = pMemLnx;
+ Args.fPg = rtR0MemObjLinuxConvertProt(fProt, true /*fKernel*/);
+ int rcLnx = apply_to_page_range(current->active_mm, (unsigned long)pMemLnx->Core.pv + offSub, cbSub,
+ rtR0MemObjLinuxApplyPageRange, (void *)&Args);
+ if (rcLnx)
+ return VERR_NOT_SUPPORTED;
+
+ return VINF_SUCCESS;
+ }
# endif

NOREF(pMem);

Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
Index: b/src/VBox/Additions/linux/sharedfolders/regops.c
===================================================================
--- src/VBox/Additions/linux/sharedfolders/regops.c
+++ src/VBox/Additions/linux/sharedfolders/regops.c
@@ -1401,7 +1401,10 @@ static int vbsf_lock_user_pages_failed_c
/*
* Check that this is valid user memory that is actually in the kernel range.
*/
-#if RTLNX_VER_MIN(5,0,0) || RTLNX_RHEL_MIN(8,1)
+#if RTLNX_VER_MIN(5,10,0)
+ if ( access_ok((void *)uPtrFrom, cPages << PAGE_SHIFT)
+ && uPtrFrom >= TASK_SIZE_MAX)
+#elif RTLNX_VER_MIN(5,0,0) || RTLNX_RHEL_MIN(8,1)
if ( access_ok((void *)uPtrFrom, cPages << PAGE_SHIFT)
&& uPtrFrom >= USER_DS.seg)
#else

Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
Index: b/src/VBox/Additions/linux/drm/vbox_drv.h
===================================================================
--- src/VBox/Additions/linux/drm/vbox_drv.h
+++ src/VBox/Additions/linux/drm/vbox_drv.h
@@ -205,6 +205,13 @@ static inline void drm_gem_object_put(st
}
#endif

+#ifndef TTM_PL_FLAG_SYSTEM
+#define TTM_PL_FLAG_SYSTEM (1 << TTM_PL_SYSTEM)
+#endif
+#ifndef TTM_PL_FLAG_VRAM
+#define TTM_PL_FLAG_VRAM (1 << TTM_PL_VRAM)
+#endif
+
#define DRIVER_AUTHOR VBOX_VENDOR

#define DRIVER_NAME "vboxvideo"
Index: b/src/VBox/Additions/linux/drm/vbox_ttm.c
===================================================================
--- src/VBox/Additions/linux/drm/vbox_ttm.c
+++ src/VBox/Additions/linux/drm/vbox_ttm.c
@@ -373,11 +373,23 @@ void vbox_ttm_placement(struct vbox_bo *
bo->placement.busy_placement = bo->placements;

if (domain & TTM_PL_FLAG_VRAM)
+#if RTLNX_VER_MIN(5,10,0)
+ bo->placements[c].mem_type = TTM_PL_VRAM;
+ PLACEMENT_FLAGS(bo->placements[c++]) =
+ TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED;
+#else
PLACEMENT_FLAGS(bo->placements[c++]) =
TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_VRAM;
+#endif
if (domain & TTM_PL_FLAG_SYSTEM)
+#if RTLNX_VER_MIN(5,10,0)
+ bo->placements[c].mem_type = TTM_PL_SYSTEM;
+ PLACEMENT_FLAGS(bo->placements[c++]) =
+ TTM_PL_MASK_CACHING;
+#else
PLACEMENT_FLAGS(bo->placements[c++]) =
TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
+#endif
if (!c)
PLACEMENT_FLAGS(bo->placements[c++]) =
TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;

2 changes: 1 addition & 1 deletion srcpkgs/virtualbox-ose/template
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Template file for 'virtualbox-ose'
pkgname=virtualbox-ose
version=6.1.16
revision=1
revision=2
wrksrc="VirtualBox-${version}"
short_desc="General-purpose full virtualizer for x86 hardware"
maintainer="Orphaned <orphan@voidlinux.org>"
Expand Down