All of lore.kernel.org
 help / color / mirror / Atom feed
* [meta-oe][PATCH] vboxguestdrivers: Fix build with kernel 5.10
@ 2021-01-05  4:04 Khem Raj
  2021-01-05 10:50 ` [oe] " Jose Quaresma
  0 siblings, 1 reply; 7+ messages in thread
From: Khem Raj @ 2021-01-05  4:04 UTC (permalink / raw)
  To: openembedded-devel; +Cc: Khem Raj

Signed-off-by: Khem Raj <raj.khem@gmail.com>
---
 .../0001-support-python-5.9.patch             | 129 ++++++
 .../0002-Backport-5.10-fixes.patch            | 432 ++++++++++++++++++
 .../vboxguestdrivers_6.1.16.bb                |   2 +
 3 files changed, 563 insertions(+)
 create mode 100644 meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0001-support-python-5.9.patch
 create mode 100644 meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0002-Backport-5.10-fixes.patch

diff --git a/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0001-support-python-5.9.patch b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0001-support-python-5.9.patch
new file mode 100644
index 0000000000..f1c4194633
--- /dev/null
+++ b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0001-support-python-5.9.patch
@@ -0,0 +1,129 @@
+From d4df52c9442d44adfc492e8e1b682ab638f10c0c Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Mon, 4 Jan 2021 19:52:10 -0800
+Subject: [PATCH 1/2] support python 5.9
+
+Imported from
+
+https://github.com/archlinux/svntogit-community/commit/9276e06052e89615fe8bf3a30d04f5803ad2e539
+
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ configure                                     |  2 +-
+ src/libs/xpcom18a4/python/Makefile.kmk        | 48 ++++++++++++++++++-
+ src/libs/xpcom18a4/python/gen_python_deps.py  |  2 +-
+ .../xpcom18a4/python/src/module/_xpcom.cpp    |  6 ++-
+ 4 files changed, 54 insertions(+), 4 deletions(-)
+
+diff --git a/configure b/configure
+index 55390478..50f53434 100755
+--- a/configure
++++ b/configure
+@@ -2028,7 +2028,7 @@ extern "C" int main(void)
+ }
+ EOF
+   found=
+-  SUPPYTHONLIBS="python2.7 python2.6 python3.1 python3.2 python3.3 python3.4 python3.4m python3.5 python3.5m python3.6 python3.6m python3.7 python3.7m python3.8 python3.8m"
++  SUPPYTHONLIBS="python2.7 python2.6 python3.1 python3.2 python3.3 python3.4 python3.4m python3.5 python3.5m python3.6 python3.6m python3.7 python3.7m python3.8 python3.8m python3.9 python3.9m"
+   for p in $PYTHONDIR; do
+     for d in $SUPPYTHONLIBS; do
+       for b in lib/x86_64-linux-gnu lib/i386-linux-gnu lib64 lib/64 lib; do
+diff --git a/src/libs/xpcom18a4/python/Makefile.kmk b/src/libs/xpcom18a4/python/Makefile.kmk
+index f854ea84..afc3d6b3 100644
+--- a/src/libs/xpcom18a4/python/Makefile.kmk
++++ b/src/libs/xpcom18a4/python/Makefile.kmk
+@@ -26,7 +26,7 @@ endif
+ 
+ #
+ # List of supported Python versions, defining a number of
+-# VBOX_PYTHON[26|27|31|32|32M|33|33M|34|34M|35|35M|36|36M|37|37M|38|38M|DEF]_[INC|LIB] variables
++# VBOX_PYTHON[26|27|31|32|32M|33|33M|34|34M|35|35M|36|36M|37|37M|38|38M|39|39M|DEF]_[INC|LIB] variables
+ # which get picked up below.
+ #
+ ifeq ($(KBUILD_TARGET),darwin) # Relatively predictable, don't script.
+@@ -533,6 +533,52 @@ VBoxPython3_8m_x86_LIBS       = $(VBOX_PYTHON38M_LIB_X86)
+  endif
+ endif
+ 
++ifdef VBOX_PYTHON39_INC
++#
++# Python 3.9 version
++#
++DLLS += VBoxPython3_9
++VBoxPython3_9_EXTENDS    = VBoxPythonBase
++VBoxPython3_9_EXTENDS_BY = appending
++VBoxPython3_9_TEMPLATE   = XPCOM
++VBoxPython3_9_INCS       = $(VBOX_PYTHON39_INC)
++VBoxPython3_9_LIBS       = $(VBOX_PYTHON39_LIB)
++
++ ifdef VBOX_WITH_32_ON_64_MAIN_API
++  ifdef VBOX_PYTHON39_LIB_X86
++DLLS += VBoxPython3_9_x86
++VBoxPython3_9_x86_EXTENDS    = VBoxPythonBase_x86
++VBoxPython3_9_x86_EXTENDS_BY = appending
++VBoxPython3_9_x86_TEMPLATE   = XPCOM
++VBoxPython3_9_x86_INCS       = $(VBOX_PYTHON39_INC)
++VBoxPython3_9_x86_LIBS       = $(VBOX_PYTHON39_LIB_X86)
++  endif
++ endif
++endif
++
++ifdef VBOX_PYTHON39M_INC
++#
++# Python 3.9 version with pymalloc
++#
++DLLS += VBoxPython3_9m
++VBoxPython3_9m_EXTENDS    = VBoxPythonBase_m
++VBoxPython3_9m_EXTENDS_BY = appending
++VBoxPython3_9m_TEMPLATE   = XPCOM
++VBoxPython3_9m_INCS       = $(VBOX_PYTHON39M_INC)
++VBoxPython3_9m_LIBS       = $(VBOX_PYTHON39M_LIB)
++
++ ifdef VBOX_WITH_32_ON_64_MAIN_API
++  ifdef VBOX_PYTHON39M_LIB_X86
++DLLS += VBoxPython3_9m_x86
++VBoxPython3_9m_x86_EXTENDS    = VBoxPythonBase_x86_m
++VBoxPython3_9m_x86_EXTENDS_BY = appending
++VBoxPython3_9m_x86_TEMPLATE_   = XPCOM
++VBoxPython3_9m_x86_INCS       = $(VBOX_PYTHON39M_INC)
++VBoxPython3_9m_x86_LIBS       = $(VBOX_PYTHON39M_LIB_X86)
++  endif
++ endif
++endif
++
+ ifdef VBOX_PYTHONDEF_INC
+ #
+ # Python without versioning
+diff --git a/src/libs/xpcom18a4/python/gen_python_deps.py b/src/libs/xpcom18a4/python/gen_python_deps.py
+index 848dddf3..b116313a 100755
+--- a/src/libs/xpcom18a4/python/gen_python_deps.py
++++ b/src/libs/xpcom18a4/python/gen_python_deps.py
+@@ -16,7 +16,7 @@ from __future__ import print_function
+ import os,sys
+ from distutils.version import StrictVersion
+ 
+-versions = ["2.6", "2.7", "3.1", "3.2", "3.2m", "3.3", "3.3m", "3.4", "3.4m", "3.5", "3.5m", "3.6", "3.6m", "3.7", "3.7m", "3.8", "3.8m" ]
++versions = ["2.6", "2.7", "3.1", "3.2", "3.2m", "3.3", "3.3m", "3.4", "3.4m", "3.5", "3.5m", "3.6", "3.6m", "3.7", "3.7m", "3.8", "3.8m", "3.9", "3.9m" ]
+ prefixes = ["/usr", "/usr/local", "/opt", "/opt/local"]
+ known = {}
+ 
+diff --git a/src/libs/xpcom18a4/python/src/module/_xpcom.cpp b/src/libs/xpcom18a4/python/src/module/_xpcom.cpp
+index d35eb607..93ce03fd 100644
+--- a/src/libs/xpcom18a4/python/src/module/_xpcom.cpp
++++ b/src/libs/xpcom18a4/python/src/module/_xpcom.cpp
+@@ -84,7 +84,11 @@ extern PYXPCOM_EXPORT void PyXPCOM_InterpreterState_Ensure();
+ #  define MANGLE_MODULE_INIT(a_Name)    RT_CONCAT(a_Name, MODULE_NAME_SUFFIX)
+ # endif
+ # ifdef VBOX_PYXPCOM_VERSIONED
+-#  if   PY_VERSION_HEX >= 0x03080000 && PY_VERSION_HEX < 0x03090000
++#  if   PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x03100000
++#   define MODULE_NAME    MANGLE_MODULE_NAME("VBoxPython3_9")
++#   define initVBoxPython MANGLE_MODULE_INIT(PyInit_VBoxPython3_9)
++
++#  elif   PY_VERSION_HEX >= 0x03080000 && PY_VERSION_HEX < 0x03090000
+ #   define MODULE_NAME    MANGLE_MODULE_NAME("VBoxPython3_8")
+ #   define initVBoxPython MANGLE_MODULE_INIT(PyInit_VBoxPython3_8)
+ 
+-- 
+2.30.0
+
diff --git a/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0002-Backport-5.10-fixes.patch b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0002-Backport-5.10-fixes.patch
new file mode 100644
index 0000000000..f277ced902
--- /dev/null
+++ b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0002-Backport-5.10-fixes.patch
@@ -0,0 +1,432 @@
+From ac018c7fe2215aab028615b2823cc8fba97cf8c2 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Mon, 4 Jan 2021 19:54:52 -0800
+Subject: [PATCH 2/2] Backport 5.10 fixes
+
+Imported from
+https://raw.githubusercontent.com/archlinux/svntogit-community/packages/virtualbox/trunk/020-linux-5-10.patch
+
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ src/VBox/Additions/linux/drm/vbox_drv.h       | 10 +-
+ src/VBox/Additions/linux/drm/vbox_fb.c        |  2 +-
+ src/VBox/Additions/linux/drm/vbox_mode.c      |  2 +-
+ src/VBox/Additions/linux/drm/vbox_ttm.c       | 99 +++++++++++++++++--
+ .../Additions/linux/sharedfolders/regops.c    |  5 +-
+ .../Runtime/r0drv/linux/memobj-r0drv-linux.c  | 61 +++++++++++-
+ 6 files changed, 163 insertions(+), 16 deletions(-)
+
+diff --git a/src/VBox/Additions/linux/drm/vbox_drv.h b/src/VBox/Additions/linux/drm/vbox_drv.h
+index c680f3b4..d21d023c 100644
+--- a/src/VBox/Additions/linux/drm/vbox_drv.h
++++ b/src/VBox/Additions/linux/drm/vbox_drv.h
+@@ -175,6 +175,9 @@
+ #include <drm/ttm/ttm_placement.h>
+ #include <drm/ttm/ttm_memory.h>
+ #include <drm/ttm/ttm_module.h>
++#if RTLNX_VER_MIN(5,10,0)
++# include <drm/ttm/ttm_resource.h>
++#endif
+ 
+ #include "vboxvideo_guest.h"
+ #include "vboxvideo_vbe.h"
+@@ -444,7 +447,10 @@ int vbox_bo_create(struct drm_device *dev, int size, int align,
+ int vbox_gem_create(struct drm_device *dev,
+ 		    u32 size, bool iskernel, struct drm_gem_object **obj);
+ 
+-int vbox_bo_pin(struct vbox_bo *bo, u32 pl_flag, u64 *gpu_addr);
++#define VBOX_MEM_TYPE_VRAM   0x1
++#define VBOX_MEM_TYPE_SYSTEM 0x2
++
++int vbox_bo_pin(struct vbox_bo *bo, u32 mem_type, u64 *gpu_addr);
+ int vbox_bo_unpin(struct vbox_bo *bo);
+ 
+ static inline int vbox_bo_reserve(struct vbox_bo *bo, bool no_wait)
+@@ -469,7 +475,7 @@ static inline void vbox_bo_unreserve(struct vbox_bo *bo)
+ 	ttm_bo_unreserve(&bo->bo);
+ }
+ 
+-void vbox_ttm_placement(struct vbox_bo *bo, int domain);
++void vbox_ttm_placement(struct vbox_bo *bo, u32 mem_type);
+ int vbox_bo_push_sysram(struct vbox_bo *bo);
+ int vbox_mmap(struct file *filp, struct vm_area_struct *vma);
+ 
+diff --git a/src/VBox/Additions/linux/drm/vbox_fb.c b/src/VBox/Additions/linux/drm/vbox_fb.c
+index 811d0040..44b1ef52 100644
+--- a/src/VBox/Additions/linux/drm/vbox_fb.c
++++ b/src/VBox/Additions/linux/drm/vbox_fb.c
+@@ -295,7 +295,7 @@ static int vboxfb_create(struct drm_fb_helper *helper,
+ 	if (ret)
+ 		return ret;
+ 
+-	ret = vbox_bo_pin(bo, TTM_PL_FLAG_VRAM, NULL);
++	ret = vbox_bo_pin(bo, VBOX_MEM_TYPE_VRAM, NULL);
+ 	if (ret) {
+ 		vbox_bo_unreserve(bo);
+ 		return ret;
+diff --git a/src/VBox/Additions/linux/drm/vbox_mode.c b/src/VBox/Additions/linux/drm/vbox_mode.c
+index 1e2691fd..52fd10fd 100644
+--- a/src/VBox/Additions/linux/drm/vbox_mode.c
++++ b/src/VBox/Additions/linux/drm/vbox_mode.c
+@@ -227,7 +227,7 @@ static int vbox_crtc_set_base(struct drm_crtc *crtc,
+ 	if (ret)
+ 		return ret;
+ 
+-	ret = vbox_bo_pin(bo, TTM_PL_FLAG_VRAM, &gpu_addr);
++	ret = vbox_bo_pin(bo, VBOX_MEM_TYPE_VRAM, &gpu_addr);
+ 	vbox_bo_unreserve(bo);
+ 	if (ret)
+ 		return ret;
+diff --git a/src/VBox/Additions/linux/drm/vbox_ttm.c b/src/VBox/Additions/linux/drm/vbox_ttm.c
+index 4e990843..ee2da4aa 100644
+--- a/src/VBox/Additions/linux/drm/vbox_ttm.c
++++ b/src/VBox/Additions/linux/drm/vbox_ttm.c
+@@ -41,6 +41,7 @@
+ #define PLACEMENT_FLAGS(placement) ((placement).flags)
+ #endif
+ 
++
+ static inline struct vbox_private *vbox_bdev(struct ttm_bo_device *bd)
+ {
+ 	return container_of(bd, struct vbox_private, ttm.bdev);
+@@ -125,6 +126,7 @@ static bool vbox_ttm_bo_is_vbox_bo(struct ttm_buffer_object *bo)
+ 	return false;
+ }
+ 
++#if RTLNX_VER_MAX(5,10,0)
+ static int
+ vbox_bo_init_mem_type(struct ttm_bo_device *bdev, u32 type,
+ 		      struct ttm_mem_type_manager *man)
+@@ -148,6 +150,7 @@ vbox_bo_init_mem_type(struct ttm_bo_device *bdev, u32 type,
+ 
+ 	return 0;
+ }
++#endif
+ 
+ static void
+ vbox_bo_evict_flags(struct ttm_buffer_object *bo, struct ttm_placement *pl)
+@@ -157,7 +160,7 @@ vbox_bo_evict_flags(struct ttm_buffer_object *bo, struct ttm_placement *pl)
+ 	if (!vbox_ttm_bo_is_vbox_bo(bo))
+ 		return;
+ 
+-	vbox_ttm_placement(vboxbo, TTM_PL_FLAG_SYSTEM);
++	vbox_ttm_placement(vboxbo, VBOX_MEM_TYPE_SYSTEM);
+ 	*pl = vboxbo->placement;
+ }
+ 
+@@ -167,11 +170,12 @@ static int vbox_bo_verify_access(struct ttm_buffer_object *bo,
+ 	return 0;
+ }
+ 
++#if RTLNX_VER_MAX(5,10,0)
+ static int vbox_ttm_io_mem_reserve(struct ttm_bo_device *bdev,
+ 				   struct ttm_mem_reg *mem)
+ {
+-	struct ttm_mem_type_manager *man = &bdev->man[mem->mem_type];
+ 	struct vbox_private *vbox = vbox_bdev(bdev);
++	struct ttm_mem_type_manager *man = &bdev->man[mem->mem_type];
+ 
+ 	mem->bus.addr = NULL;
+ 	mem->bus.offset = 0;
+@@ -194,12 +198,53 @@ static int vbox_ttm_io_mem_reserve(struct ttm_bo_device *bdev,
+ 	}
+ 	return 0;
+ }
++#else
++static int vbox_ttm_io_mem_reserve(struct ttm_bo_device *bdev,
++				   struct ttm_resource *mem)
++{
++	struct vbox_private *vbox = vbox_bdev(bdev);
++	mem->bus.addr = NULL;
++	mem->bus.offset = 0;
++	mem->size = mem->num_pages << PAGE_SHIFT;
++	mem->start = 0;
++	mem->bus.is_iomem = false;
++	switch (mem->mem_type) {
++	case TTM_PL_SYSTEM:
++		/* system memory */
++		return 0;
++	case TTM_PL_VRAM:
++		mem->bus.offset = mem->start << PAGE_SHIFT;
++		mem->start = pci_resource_start(vbox->dev->pdev, 0);
++		mem->bus.is_iomem = true;
++		break;
++	default:
++		return -EINVAL;
++	}
++	return 0;
++}
++#endif
+ 
++
++
++#if RTLNX_VER_MIN(5,10,0)
++static void vbox_ttm_io_mem_free(struct ttm_bo_device *bdev,
++				 struct ttm_resource *mem)
++{
++}
++#else
+ static void vbox_ttm_io_mem_free(struct ttm_bo_device *bdev,
+ 				 struct ttm_mem_reg *mem)
+ {
+ }
++#endif
+ 
++#if RTLNX_VER_MIN(5,10,0)
++static void vbox_ttm_tt_destroy(struct ttm_bo_device *bdev, struct ttm_tt *tt)
++{
++	ttm_tt_fini(tt);
++	kfree(tt);
++}
++#else
+ static void vbox_ttm_backend_destroy(struct ttm_tt *tt)
+ {
+ 	ttm_tt_fini(tt);
+@@ -209,6 +254,7 @@ static void vbox_ttm_backend_destroy(struct ttm_tt *tt)
+ static struct ttm_backend_func vbox_tt_backend_func = {
+ 	.destroy = &vbox_ttm_backend_destroy,
+ };
++#endif
+ 
+ #if RTLNX_VER_MAX(4,17,0) && !RTLNX_RHEL_MAJ_PREREQ(7,6) && !RTLNX_SUSE_MAJ_PREREQ(15,1) && !RTLNX_SUSE_MAJ_PREREQ(12,5)
+ static struct ttm_tt *vbox_ttm_tt_create(struct ttm_bo_device *bdev,
+@@ -226,7 +272,9 @@ static struct ttm_tt *vbox_ttm_tt_create(struct ttm_buffer_object *bo,
+ 	if (!tt)
+ 		return NULL;
+ 
++#if RTLNX_VER_MAX(5,10,0)
+ 	tt->func = &vbox_tt_backend_func;
++#endif
+ #if RTLNX_VER_MAX(4,17,0) && !RTLNX_RHEL_MAJ_PREREQ(7,6) && !RTLNX_SUSE_MAJ_PREREQ(15,1) && !RTLNX_SUSE_MAJ_PREREQ(12,5)
+ 	if (ttm_tt_init(tt, bdev, size, page_flags, dummy_read_page)) {
+ #else
+@@ -261,11 +309,16 @@ static void vbox_ttm_tt_unpopulate(struct ttm_tt *ttm)
+ 
+ static struct ttm_bo_driver vbox_bo_driver = {
+ 	.ttm_tt_create = vbox_ttm_tt_create,
++#if RTLNX_VER_MIN(5,10,0)
++	.ttm_tt_destroy = vbox_ttm_tt_destroy,
++#endif
+ #if RTLNX_VER_MAX(4,17,0)
+ 	.ttm_tt_populate = vbox_ttm_tt_populate,
+ 	.ttm_tt_unpopulate = vbox_ttm_tt_unpopulate,
+ #endif
++#if RTLNX_VER_MAX(5,10,0)
+ 	.init_mem_type = vbox_bo_init_mem_type,
++#endif
+ #if RTLNX_VER_MIN(4,10,0) || RTLNX_RHEL_MAJ_PREREQ(7,4)
+ 	.eviction_valuable = ttm_bo_eviction_valuable,
+ #endif
+@@ -318,8 +371,13 @@ int vbox_mm_init(struct vbox_private *vbox)
+ #endif
+ 	}
+ 
++#if RTLNX_VER_MIN(5,10,0)
++	ret = ttm_range_man_init(bdev, TTM_PL_VRAM, false,
++			     vbox->available_vram_size >> PAGE_SHIFT);
++#else
+ 	ret = ttm_bo_init_mm(bdev, TTM_PL_VRAM,
+ 			     vbox->available_vram_size >> PAGE_SHIFT);
++#endif
+ 	if (ret) {
+ 		DRM_ERROR("Failed ttm VRAM init: %d\n", ret);
+ 		goto err_device_release;
+@@ -359,7 +417,7 @@ void vbox_mm_fini(struct vbox_private *vbox)
+ #endif
+ }
+ 
+-void vbox_ttm_placement(struct vbox_bo *bo, int domain)
++void vbox_ttm_placement(struct vbox_bo *bo, u32 mem_type)
+ {
+ 	u32 c = 0;
+ #if RTLNX_VER_MAX(3,18,0) && !RTLNX_RHEL_MAJ_PREREQ(7,2)
+@@ -372,15 +430,36 @@ void vbox_ttm_placement(struct vbox_bo *bo, int domain)
+ 	bo->placement.placement = bo->placements;
+ 	bo->placement.busy_placement = bo->placements;
+ 
+-	if (domain & TTM_PL_FLAG_VRAM)
++	if (mem_type & VBOX_MEM_TYPE_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;
+-	if (domain & TTM_PL_FLAG_SYSTEM)
++#endif
++	}
++	if (mem_type & VBOX_MEM_TYPE_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;
+-	if (!c)
++#endif
++	}
++	if (!c) {
++#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
++	}
+ 
+ 	bo->placement.num_placement = c;
+ 	bo->placement.num_busy_placement = c;
+@@ -414,7 +493,7 @@ int vbox_bo_create(struct drm_device *dev, int size, int align,
+ 	vboxbo->bo.bdev->dev_mapping = dev->dev_mapping;
+ #endif
+ 
+-	vbox_ttm_placement(vboxbo, TTM_PL_FLAG_VRAM | TTM_PL_FLAG_SYSTEM);
++	vbox_ttm_placement(vboxbo, VBOX_MEM_TYPE_VRAM | VBOX_MEM_TYPE_SYSTEM);
+ 
+ 	acc_size = ttm_bo_dma_acc_size(&vbox->ttm.bdev, size,
+ 				       sizeof(struct vbox_bo));
+@@ -452,7 +531,7 @@ static inline u64 vbox_bo_gpu_offset(struct vbox_bo *bo)
+ #endif
+ }
+ 
+-int vbox_bo_pin(struct vbox_bo *bo, u32 pl_flag, u64 *gpu_addr)
++int vbox_bo_pin(struct vbox_bo *bo, u32 mem_type, u64 *gpu_addr)
+ {
+ #if RTLNX_VER_MIN(4,16,0) || RTLNX_RHEL_MAJ_PREREQ(7,6) || RTLNX_SUSE_MAJ_PREREQ(15,1) || RTLNX_SUSE_MAJ_PREREQ(12,5)
+ 	struct ttm_operation_ctx ctx = { false, false };
+@@ -467,7 +546,7 @@ int vbox_bo_pin(struct vbox_bo *bo, u32 pl_flag, u64 *gpu_addr)
+ 		return 0;
+ 	}
+ 
+-	vbox_ttm_placement(bo, pl_flag);
++	vbox_ttm_placement(bo, mem_type);
+ 
+ 	for (i = 0; i < bo->placement.num_placement; i++)
+ 		PLACEMENT_FLAGS(bo->placements[i]) |= TTM_PL_FLAG_NO_EVICT;
+@@ -540,7 +619,7 @@ int vbox_bo_push_sysram(struct vbox_bo *bo)
+ 	if (bo->kmap.virtual)
+ 		ttm_bo_kunmap(&bo->kmap);
+ 
+-	vbox_ttm_placement(bo, TTM_PL_FLAG_SYSTEM);
++	vbox_ttm_placement(bo, VBOX_MEM_TYPE_SYSTEM);
+ 
+ 	for (i = 0; i < bo->placement.num_placement; i++)
+ 		PLACEMENT_FLAGS(bo->placements[i]) |= TTM_PL_FLAG_NO_EVICT;
+diff --git a/src/VBox/Additions/linux/sharedfolders/regops.c b/src/VBox/Additions/linux/sharedfolders/regops.c
+index 3ad9c566..ec298a1b 100644
+--- a/src/VBox/Additions/linux/sharedfolders/regops.c
++++ b/src/VBox/Additions/linux/sharedfolders/regops.c
+@@ -1401,7 +1401,10 @@ static int vbsf_lock_user_pages_failed_check_kernel(uintptr_t uPtrFrom, size_t 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
+diff --git a/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c b/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c
+index c771c1ba..a34eb149 100644
+--- a/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c
++++ b/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c
+@@ -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,6 +505,42 @@ static void rtR0MemObjLinuxFreePages(PRTR0MEMOBJLNX pMemLnx)
+ }
+ 
+ 
++#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.
+  *
+@@ -584,6 +623,11 @@ static int rtR0MemObjLinuxVMap(PRTR0MEMOBJLNX pMemLnx, bool fExecutable)
+         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 @@ DECLHIDDEN(int) rtR0MemObjNativeProtect(PRTR0MEMOBJINTERNAL pMem, size_t offSub,
+         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);
+-- 
+2.30.0
+
diff --git a/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers_6.1.16.bb b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers_6.1.16.bb
index 9282f663b4..fef7ffa954 100644
--- a/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers_6.1.16.bb
+++ b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers_6.1.16.bb
@@ -13,6 +13,8 @@ VBOX_NAME = "VirtualBox-${PV}"
 
 SRC_URI = "http://download.virtualbox.org/virtualbox/${PV}/${VBOX_NAME}.tar.bz2 \
     file://Makefile.utils \
+    file://0001-support-python-5.9.patch \
+    file://0002-Backport-5.10-fixes.patch \
 "
 SRC_URI[md5sum] = "a12a647f6c114f2cb1571089b36841fe"
 SRC_URI[sha256sum] = "49c1990da16d8a3d5bda8cdb961ec8195a901e67e4c79aea44c1521a5fc2f9f1"
-- 
2.30.0


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [oe] [meta-oe][PATCH] vboxguestdrivers: Fix build with kernel 5.10
  2021-01-05  4:04 [meta-oe][PATCH] vboxguestdrivers: Fix build with kernel 5.10 Khem Raj
@ 2021-01-05 10:50 ` Jose Quaresma
  2021-01-05 17:05   ` Khem Raj
  0 siblings, 1 reply; 7+ messages in thread
From: Jose Quaresma @ 2021-01-05 10:50 UTC (permalink / raw)
  To: Khem Raj; +Cc: openembeded-devel

[-- Attachment #1: Type: text/plain, Size: 25627 bytes --]

Hi,

I think there are a typo in python version the patch mention 5.9 instead of
3.9

Khem Raj <raj.khem@gmail.com> escreveu no dia terça, 5/01/2021 à(s) 04:04:

> Signed-off-by: Khem Raj <raj.khem@gmail.com>
> ---
>  .../0001-support-python-5.9.patch             | 129 ++++++
>

.../0001-support-python-3.9.patch


>  .../0002-Backport-5.10-fixes.patch            | 432 ++++++++++++++++++
>  .../vboxguestdrivers_6.1.16.bb                |   2 +
>  3 files changed, 563 insertions(+)
>  create mode 100644
> meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0001-support-python-5.9.patch
>  create mode 100644
> meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0002-Backport-5.10-fixes.patch
>
> diff --git
> a/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0001-support-python-5.9.patch
> b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0001-support-python-5.9.patch
> new file mode 100644
> index 0000000000..f1c4194633
> --- /dev/null
> +++
> b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0001-support-python-5.9.patch
> @@ -0,0 +1,129 @@
> +From d4df52c9442d44adfc492e8e1b682ab638f10c0c Mon Sep 17 00:00:00 2001
> +From: Khem Raj <raj.khem@gmail.com>
> +Date: Mon, 4 Jan 2021 19:52:10 -0800
> +Subject: [PATCH 1/2] support python 5.9
>

Subject: [PATCH 1/2] support python 3.9


> +
> +Imported from
> +
> +
> https://github.com/archlinux/svntogit-community/commit/9276e06052e89615fe8bf3a30d04f5803ad2e539
> +
> +Signed-off-by: Khem Raj <raj.khem@gmail.com>
> +---
> + configure                                     |  2 +-
> + src/libs/xpcom18a4/python/Makefile.kmk        | 48 ++++++++++++++++++-
> + src/libs/xpcom18a4/python/gen_python_deps.py  |  2 +-
> + .../xpcom18a4/python/src/module/_xpcom.cpp    |  6 ++-
> + 4 files changed, 54 insertions(+), 4 deletions(-)
> +
> +diff --git a/configure b/configure
> +index 55390478..50f53434 100755
> +--- a/configure
> ++++ b/configure
> +@@ -2028,7 +2028,7 @@ extern "C" int main(void)
> + }
> + EOF
> +   found=
> +-  SUPPYTHONLIBS="python2.7 python2.6 python3.1 python3.2 python3.3
> python3.4 python3.4m python3.5 python3.5m python3.6 python3.6m python3.7
> python3.7m python3.8 python3.8m"
> ++  SUPPYTHONLIBS="python2.7 python2.6 python3.1 python3.2 python3.3
> python3.4 python3.4m python3.5 python3.5m python3.6 python3.6m python3.7
> python3.7m python3.8 python3.8m python3.9 python3.9m"
> +   for p in $PYTHONDIR; do
> +     for d in $SUPPYTHONLIBS; do
> +       for b in lib/x86_64-linux-gnu lib/i386-linux-gnu lib64 lib/64 lib;
> do
> +diff --git a/src/libs/xpcom18a4/python/Makefile.kmk
> b/src/libs/xpcom18a4/python/Makefile.kmk
> +index f854ea84..afc3d6b3 100644
> +--- a/src/libs/xpcom18a4/python/Makefile.kmk
> ++++ b/src/libs/xpcom18a4/python/Makefile.kmk
> +@@ -26,7 +26,7 @@ endif
> +
> + #
> + # List of supported Python versions, defining a number of
> +-#
> VBOX_PYTHON[26|27|31|32|32M|33|33M|34|34M|35|35M|36|36M|37|37M|38|38M|DEF]_[INC|LIB]
> variables
> ++#
> VBOX_PYTHON[26|27|31|32|32M|33|33M|34|34M|35|35M|36|36M|37|37M|38|38M|39|39M|DEF]_[INC|LIB]
> variables
> + # which get picked up below.
> + #
> + ifeq ($(KBUILD_TARGET),darwin) # Relatively predictable, don't script.
> +@@ -533,6 +533,52 @@ VBoxPython3_8m_x86_LIBS       =
> $(VBOX_PYTHON38M_LIB_X86)
> +  endif
> + endif
> +
> ++ifdef VBOX_PYTHON39_INC
> ++#
> ++# Python 3.9 version
> ++#
> ++DLLS += VBoxPython3_9
> ++VBoxPython3_9_EXTENDS    = VBoxPythonBase
> ++VBoxPython3_9_EXTENDS_BY = appending
> ++VBoxPython3_9_TEMPLATE   = XPCOM
> ++VBoxPython3_9_INCS       = $(VBOX_PYTHON39_INC)
> ++VBoxPython3_9_LIBS       = $(VBOX_PYTHON39_LIB)
> ++
> ++ ifdef VBOX_WITH_32_ON_64_MAIN_API
> ++  ifdef VBOX_PYTHON39_LIB_X86
> ++DLLS += VBoxPython3_9_x86
> ++VBoxPython3_9_x86_EXTENDS    = VBoxPythonBase_x86
> ++VBoxPython3_9_x86_EXTENDS_BY = appending
> ++VBoxPython3_9_x86_TEMPLATE   = XPCOM
> ++VBoxPython3_9_x86_INCS       = $(VBOX_PYTHON39_INC)
> ++VBoxPython3_9_x86_LIBS       = $(VBOX_PYTHON39_LIB_X86)
> ++  endif
> ++ endif
> ++endif
> ++
> ++ifdef VBOX_PYTHON39M_INC
> ++#
> ++# Python 3.9 version with pymalloc
> ++#
> ++DLLS += VBoxPython3_9m
> ++VBoxPython3_9m_EXTENDS    = VBoxPythonBase_m
> ++VBoxPython3_9m_EXTENDS_BY = appending
> ++VBoxPython3_9m_TEMPLATE   = XPCOM
> ++VBoxPython3_9m_INCS       = $(VBOX_PYTHON39M_INC)
> ++VBoxPython3_9m_LIBS       = $(VBOX_PYTHON39M_LIB)
> ++
> ++ ifdef VBOX_WITH_32_ON_64_MAIN_API
> ++  ifdef VBOX_PYTHON39M_LIB_X86
> ++DLLS += VBoxPython3_9m_x86
> ++VBoxPython3_9m_x86_EXTENDS    = VBoxPythonBase_x86_m
> ++VBoxPython3_9m_x86_EXTENDS_BY = appending
> ++VBoxPython3_9m_x86_TEMPLATE_   = XPCOM
> ++VBoxPython3_9m_x86_INCS       = $(VBOX_PYTHON39M_INC)
> ++VBoxPython3_9m_x86_LIBS       = $(VBOX_PYTHON39M_LIB_X86)
> ++  endif
> ++ endif
> ++endif
> ++
> + ifdef VBOX_PYTHONDEF_INC
> + #
> + # Python without versioning
> +diff --git a/src/libs/xpcom18a4/python/gen_python_deps.py
> b/src/libs/xpcom18a4/python/gen_python_deps.py
> +index 848dddf3..b116313a 100755
> +--- a/src/libs/xpcom18a4/python/gen_python_deps.py
> ++++ b/src/libs/xpcom18a4/python/gen_python_deps.py
> +@@ -16,7 +16,7 @@ from __future__ import print_function
> + import os,sys
> + from distutils.version import StrictVersion
> +
> +-versions = ["2.6", "2.7", "3.1", "3.2", "3.2m", "3.3", "3.3m", "3.4",
> "3.4m", "3.5", "3.5m", "3.6", "3.6m", "3.7", "3.7m", "3.8", "3.8m" ]
> ++versions = ["2.6", "2.7", "3.1", "3.2", "3.2m", "3.3", "3.3m", "3.4",
> "3.4m", "3.5", "3.5m", "3.6", "3.6m", "3.7", "3.7m", "3.8", "3.8m", "3.9",
> "3.9m" ]
> + prefixes = ["/usr", "/usr/local", "/opt", "/opt/local"]
> + known = {}
> +
> +diff --git a/src/libs/xpcom18a4/python/src/module/_xpcom.cpp
> b/src/libs/xpcom18a4/python/src/module/_xpcom.cpp
> +index d35eb607..93ce03fd 100644
> +--- a/src/libs/xpcom18a4/python/src/module/_xpcom.cpp
> ++++ b/src/libs/xpcom18a4/python/src/module/_xpcom.cpp
> +@@ -84,7 +84,11 @@ extern PYXPCOM_EXPORT void
> PyXPCOM_InterpreterState_Ensure();
> + #  define MANGLE_MODULE_INIT(a_Name)    RT_CONCAT(a_Name,
> MODULE_NAME_SUFFIX)
> + # endif
> + # ifdef VBOX_PYXPCOM_VERSIONED
> +-#  if   PY_VERSION_HEX >= 0x03080000 && PY_VERSION_HEX < 0x03090000
> ++#  if   PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x03100000
> ++#   define MODULE_NAME    MANGLE_MODULE_NAME("VBoxPython3_9")
> ++#   define initVBoxPython MANGLE_MODULE_INIT(PyInit_VBoxPython3_9)
> ++
> ++#  elif   PY_VERSION_HEX >= 0x03080000 && PY_VERSION_HEX < 0x03090000
> + #   define MODULE_NAME    MANGLE_MODULE_NAME("VBoxPython3_8")
> + #   define initVBoxPython MANGLE_MODULE_INIT(PyInit_VBoxPython3_8)
> +
> +--
> +2.30.0
> +
> diff --git
> a/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0002-Backport-5.10-fixes.patch
> b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0002-Backport-5.10-fixes.patch
> new file mode 100644
> index 0000000000..f277ced902
> --- /dev/null
> +++
> b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0002-Backport-5.10-fixes.patch
> @@ -0,0 +1,432 @@
> +From ac018c7fe2215aab028615b2823cc8fba97cf8c2 Mon Sep 17 00:00:00 2001
> +From: Khem Raj <raj.khem@gmail.com>
> +Date: Mon, 4 Jan 2021 19:54:52 -0800
> +Subject: [PATCH 2/2] Backport 5.10 fixes
> +
> +Imported from
> +
> https://raw.githubusercontent.com/archlinux/svntogit-community/packages/virtualbox/trunk/020-linux-5-10.patch
> +
> +Signed-off-by: Khem Raj <raj.khem@gmail.com>
> +---
> + src/VBox/Additions/linux/drm/vbox_drv.h       | 10 +-
> + src/VBox/Additions/linux/drm/vbox_fb.c        |  2 +-
> + src/VBox/Additions/linux/drm/vbox_mode.c      |  2 +-
> + src/VBox/Additions/linux/drm/vbox_ttm.c       | 99 +++++++++++++++++--
> + .../Additions/linux/sharedfolders/regops.c    |  5 +-
> + .../Runtime/r0drv/linux/memobj-r0drv-linux.c  | 61 +++++++++++-
> + 6 files changed, 163 insertions(+), 16 deletions(-)
> +
> +diff --git a/src/VBox/Additions/linux/drm/vbox_drv.h
> b/src/VBox/Additions/linux/drm/vbox_drv.h
> +index c680f3b4..d21d023c 100644
> +--- a/src/VBox/Additions/linux/drm/vbox_drv.h
> ++++ b/src/VBox/Additions/linux/drm/vbox_drv.h
> +@@ -175,6 +175,9 @@
> + #include <drm/ttm/ttm_placement.h>
> + #include <drm/ttm/ttm_memory.h>
> + #include <drm/ttm/ttm_module.h>
> ++#if RTLNX_VER_MIN(5,10,0)
> ++# include <drm/ttm/ttm_resource.h>
> ++#endif
> +
> + #include "vboxvideo_guest.h"
> + #include "vboxvideo_vbe.h"
> +@@ -444,7 +447,10 @@ int vbox_bo_create(struct drm_device *dev, int size,
> int align,
> + int vbox_gem_create(struct drm_device *dev,
> +                   u32 size, bool iskernel, struct drm_gem_object **obj);
> +
> +-int vbox_bo_pin(struct vbox_bo *bo, u32 pl_flag, u64 *gpu_addr);
> ++#define VBOX_MEM_TYPE_VRAM   0x1
> ++#define VBOX_MEM_TYPE_SYSTEM 0x2
> ++
> ++int vbox_bo_pin(struct vbox_bo *bo, u32 mem_type, u64 *gpu_addr);
> + int vbox_bo_unpin(struct vbox_bo *bo);
> +
> + static inline int vbox_bo_reserve(struct vbox_bo *bo, bool no_wait)
> +@@ -469,7 +475,7 @@ static inline void vbox_bo_unreserve(struct vbox_bo
> *bo)
> +       ttm_bo_unreserve(&bo->bo);
> + }
> +
> +-void vbox_ttm_placement(struct vbox_bo *bo, int domain);
> ++void vbox_ttm_placement(struct vbox_bo *bo, u32 mem_type);
> + int vbox_bo_push_sysram(struct vbox_bo *bo);
> + int vbox_mmap(struct file *filp, struct vm_area_struct *vma);
> +
> +diff --git a/src/VBox/Additions/linux/drm/vbox_fb.c
> b/src/VBox/Additions/linux/drm/vbox_fb.c
> +index 811d0040..44b1ef52 100644
> +--- a/src/VBox/Additions/linux/drm/vbox_fb.c
> ++++ b/src/VBox/Additions/linux/drm/vbox_fb.c
> +@@ -295,7 +295,7 @@ static int vboxfb_create(struct drm_fb_helper *helper,
> +       if (ret)
> +               return ret;
> +
> +-      ret = vbox_bo_pin(bo, TTM_PL_FLAG_VRAM, NULL);
> ++      ret = vbox_bo_pin(bo, VBOX_MEM_TYPE_VRAM, NULL);
> +       if (ret) {
> +               vbox_bo_unreserve(bo);
> +               return ret;
> +diff --git a/src/VBox/Additions/linux/drm/vbox_mode.c
> b/src/VBox/Additions/linux/drm/vbox_mode.c
> +index 1e2691fd..52fd10fd 100644
> +--- a/src/VBox/Additions/linux/drm/vbox_mode.c
> ++++ b/src/VBox/Additions/linux/drm/vbox_mode.c
> +@@ -227,7 +227,7 @@ static int vbox_crtc_set_base(struct drm_crtc *crtc,
> +       if (ret)
> +               return ret;
> +
> +-      ret = vbox_bo_pin(bo, TTM_PL_FLAG_VRAM, &gpu_addr);
> ++      ret = vbox_bo_pin(bo, VBOX_MEM_TYPE_VRAM, &gpu_addr);
> +       vbox_bo_unreserve(bo);
> +       if (ret)
> +               return ret;
> +diff --git a/src/VBox/Additions/linux/drm/vbox_ttm.c
> b/src/VBox/Additions/linux/drm/vbox_ttm.c
> +index 4e990843..ee2da4aa 100644
> +--- a/src/VBox/Additions/linux/drm/vbox_ttm.c
> ++++ b/src/VBox/Additions/linux/drm/vbox_ttm.c
> +@@ -41,6 +41,7 @@
> + #define PLACEMENT_FLAGS(placement) ((placement).flags)
> + #endif
> +
> ++
> + static inline struct vbox_private *vbox_bdev(struct ttm_bo_device *bd)
> + {
> +       return container_of(bd, struct vbox_private, ttm.bdev);
> +@@ -125,6 +126,7 @@ static bool vbox_ttm_bo_is_vbox_bo(struct
> ttm_buffer_object *bo)
> +       return false;
> + }
> +
> ++#if RTLNX_VER_MAX(5,10,0)
> + static int
> + vbox_bo_init_mem_type(struct ttm_bo_device *bdev, u32 type,
> +                     struct ttm_mem_type_manager *man)
> +@@ -148,6 +150,7 @@ vbox_bo_init_mem_type(struct ttm_bo_device *bdev, u32
> type,
> +
> +       return 0;
> + }
> ++#endif
> +
> + static void
> + vbox_bo_evict_flags(struct ttm_buffer_object *bo, struct ttm_placement
> *pl)
> +@@ -157,7 +160,7 @@ vbox_bo_evict_flags(struct ttm_buffer_object *bo,
> struct ttm_placement *pl)
> +       if (!vbox_ttm_bo_is_vbox_bo(bo))
> +               return;
> +
> +-      vbox_ttm_placement(vboxbo, TTM_PL_FLAG_SYSTEM);
> ++      vbox_ttm_placement(vboxbo, VBOX_MEM_TYPE_SYSTEM);
> +       *pl = vboxbo->placement;
> + }
> +
> +@@ -167,11 +170,12 @@ static int vbox_bo_verify_access(struct
> ttm_buffer_object *bo,
> +       return 0;
> + }
> +
> ++#if RTLNX_VER_MAX(5,10,0)
> + static int vbox_ttm_io_mem_reserve(struct ttm_bo_device *bdev,
> +                                  struct ttm_mem_reg *mem)
> + {
> +-      struct ttm_mem_type_manager *man = &bdev->man[mem->mem_type];
> +       struct vbox_private *vbox = vbox_bdev(bdev);
> ++      struct ttm_mem_type_manager *man = &bdev->man[mem->mem_type];
> +
> +       mem->bus.addr = NULL;
> +       mem->bus.offset = 0;
> +@@ -194,12 +198,53 @@ static int vbox_ttm_io_mem_reserve(struct
> ttm_bo_device *bdev,
> +       }
> +       return 0;
> + }
> ++#else
> ++static int vbox_ttm_io_mem_reserve(struct ttm_bo_device *bdev,
> ++                                 struct ttm_resource *mem)
> ++{
> ++      struct vbox_private *vbox = vbox_bdev(bdev);
> ++      mem->bus.addr = NULL;
> ++      mem->bus.offset = 0;
> ++      mem->size = mem->num_pages << PAGE_SHIFT;
> ++      mem->start = 0;
> ++      mem->bus.is_iomem = false;
> ++      switch (mem->mem_type) {
> ++      case TTM_PL_SYSTEM:
> ++              /* system memory */
> ++              return 0;
> ++      case TTM_PL_VRAM:
> ++              mem->bus.offset = mem->start << PAGE_SHIFT;
> ++              mem->start = pci_resource_start(vbox->dev->pdev, 0);
> ++              mem->bus.is_iomem = true;
> ++              break;
> ++      default:
> ++              return -EINVAL;
> ++      }
> ++      return 0;
> ++}
> ++#endif
> +
> ++
> ++
> ++#if RTLNX_VER_MIN(5,10,0)
> ++static void vbox_ttm_io_mem_free(struct ttm_bo_device *bdev,
> ++                               struct ttm_resource *mem)
> ++{
> ++}
> ++#else
> + static void vbox_ttm_io_mem_free(struct ttm_bo_device *bdev,
> +                                struct ttm_mem_reg *mem)
> + {
> + }
> ++#endif
> +
> ++#if RTLNX_VER_MIN(5,10,0)
> ++static void vbox_ttm_tt_destroy(struct ttm_bo_device *bdev, struct
> ttm_tt *tt)
> ++{
> ++      ttm_tt_fini(tt);
> ++      kfree(tt);
> ++}
> ++#else
> + static void vbox_ttm_backend_destroy(struct ttm_tt *tt)
> + {
> +       ttm_tt_fini(tt);
> +@@ -209,6 +254,7 @@ static void vbox_ttm_backend_destroy(struct ttm_tt
> *tt)
> + static struct ttm_backend_func vbox_tt_backend_func = {
> +       .destroy = &vbox_ttm_backend_destroy,
> + };
> ++#endif
> +
> + #if RTLNX_VER_MAX(4,17,0) && !RTLNX_RHEL_MAJ_PREREQ(7,6) &&
> !RTLNX_SUSE_MAJ_PREREQ(15,1) && !RTLNX_SUSE_MAJ_PREREQ(12,5)
> + static struct ttm_tt *vbox_ttm_tt_create(struct ttm_bo_device *bdev,
> +@@ -226,7 +272,9 @@ static struct ttm_tt *vbox_ttm_tt_create(struct
> ttm_buffer_object *bo,
> +       if (!tt)
> +               return NULL;
> +
> ++#if RTLNX_VER_MAX(5,10,0)
> +       tt->func = &vbox_tt_backend_func;
> ++#endif
> + #if RTLNX_VER_MAX(4,17,0) && !RTLNX_RHEL_MAJ_PREREQ(7,6) &&
> !RTLNX_SUSE_MAJ_PREREQ(15,1) && !RTLNX_SUSE_MAJ_PREREQ(12,5)
> +       if (ttm_tt_init(tt, bdev, size, page_flags, dummy_read_page)) {
> + #else
> +@@ -261,11 +309,16 @@ static void vbox_ttm_tt_unpopulate(struct ttm_tt
> *ttm)
> +
> + static struct ttm_bo_driver vbox_bo_driver = {
> +       .ttm_tt_create = vbox_ttm_tt_create,
> ++#if RTLNX_VER_MIN(5,10,0)
> ++      .ttm_tt_destroy = vbox_ttm_tt_destroy,
> ++#endif
> + #if RTLNX_VER_MAX(4,17,0)
> +       .ttm_tt_populate = vbox_ttm_tt_populate,
> +       .ttm_tt_unpopulate = vbox_ttm_tt_unpopulate,
> + #endif
> ++#if RTLNX_VER_MAX(5,10,0)
> +       .init_mem_type = vbox_bo_init_mem_type,
> ++#endif
> + #if RTLNX_VER_MIN(4,10,0) || RTLNX_RHEL_MAJ_PREREQ(7,4)
> +       .eviction_valuable = ttm_bo_eviction_valuable,
> + #endif
> +@@ -318,8 +371,13 @@ int vbox_mm_init(struct vbox_private *vbox)
> + #endif
> +       }
> +
> ++#if RTLNX_VER_MIN(5,10,0)
> ++      ret = ttm_range_man_init(bdev, TTM_PL_VRAM, false,
> ++                           vbox->available_vram_size >> PAGE_SHIFT);
> ++#else
> +       ret = ttm_bo_init_mm(bdev, TTM_PL_VRAM,
> +                            vbox->available_vram_size >> PAGE_SHIFT);
> ++#endif
> +       if (ret) {
> +               DRM_ERROR("Failed ttm VRAM init: %d\n", ret);
> +               goto err_device_release;
> +@@ -359,7 +417,7 @@ void vbox_mm_fini(struct vbox_private *vbox)
> + #endif
> + }
> +
> +-void vbox_ttm_placement(struct vbox_bo *bo, int domain)
> ++void vbox_ttm_placement(struct vbox_bo *bo, u32 mem_type)
> + {
> +       u32 c = 0;
> + #if RTLNX_VER_MAX(3,18,0) && !RTLNX_RHEL_MAJ_PREREQ(7,2)
> +@@ -372,15 +430,36 @@ void vbox_ttm_placement(struct vbox_bo *bo, int
> domain)
> +       bo->placement.placement = bo->placements;
> +       bo->placement.busy_placement = bo->placements;
> +
> +-      if (domain & TTM_PL_FLAG_VRAM)
> ++      if (mem_type & VBOX_MEM_TYPE_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;
> +-      if (domain & TTM_PL_FLAG_SYSTEM)
> ++#endif
> ++      }
> ++      if (mem_type & VBOX_MEM_TYPE_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;
> +-      if (!c)
> ++#endif
> ++      }
> ++      if (!c) {
> ++#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
> ++      }
> +
> +       bo->placement.num_placement = c;
> +       bo->placement.num_busy_placement = c;
> +@@ -414,7 +493,7 @@ int vbox_bo_create(struct drm_device *dev, int size,
> int align,
> +       vboxbo->bo.bdev->dev_mapping = dev->dev_mapping;
> + #endif
> +
> +-      vbox_ttm_placement(vboxbo, TTM_PL_FLAG_VRAM | TTM_PL_FLAG_SYSTEM);
> ++      vbox_ttm_placement(vboxbo, VBOX_MEM_TYPE_VRAM |
> VBOX_MEM_TYPE_SYSTEM);
> +
> +       acc_size = ttm_bo_dma_acc_size(&vbox->ttm.bdev, size,
> +                                      sizeof(struct vbox_bo));
> +@@ -452,7 +531,7 @@ static inline u64 vbox_bo_gpu_offset(struct vbox_bo
> *bo)
> + #endif
> + }
> +
> +-int vbox_bo_pin(struct vbox_bo *bo, u32 pl_flag, u64 *gpu_addr)
> ++int vbox_bo_pin(struct vbox_bo *bo, u32 mem_type, u64 *gpu_addr)
> + {
> + #if RTLNX_VER_MIN(4,16,0) || RTLNX_RHEL_MAJ_PREREQ(7,6) ||
> RTLNX_SUSE_MAJ_PREREQ(15,1) || RTLNX_SUSE_MAJ_PREREQ(12,5)
> +       struct ttm_operation_ctx ctx = { false, false };
> +@@ -467,7 +546,7 @@ int vbox_bo_pin(struct vbox_bo *bo, u32 pl_flag, u64
> *gpu_addr)
> +               return 0;
> +       }
> +
> +-      vbox_ttm_placement(bo, pl_flag);
> ++      vbox_ttm_placement(bo, mem_type);
> +
> +       for (i = 0; i < bo->placement.num_placement; i++)
> +               PLACEMENT_FLAGS(bo->placements[i]) |= TTM_PL_FLAG_NO_EVICT;
> +@@ -540,7 +619,7 @@ int vbox_bo_push_sysram(struct vbox_bo *bo)
> +       if (bo->kmap.virtual)
> +               ttm_bo_kunmap(&bo->kmap);
> +
> +-      vbox_ttm_placement(bo, TTM_PL_FLAG_SYSTEM);
> ++      vbox_ttm_placement(bo, VBOX_MEM_TYPE_SYSTEM);
> +
> +       for (i = 0; i < bo->placement.num_placement; i++)
> +               PLACEMENT_FLAGS(bo->placements[i]) |= TTM_PL_FLAG_NO_EVICT;
> +diff --git a/src/VBox/Additions/linux/sharedfolders/regops.c
> b/src/VBox/Additions/linux/sharedfolders/regops.c
> +index 3ad9c566..ec298a1b 100644
> +--- a/src/VBox/Additions/linux/sharedfolders/regops.c
> ++++ b/src/VBox/Additions/linux/sharedfolders/regops.c
> +@@ -1401,7 +1401,10 @@ static int
> vbsf_lock_user_pages_failed_check_kernel(uintptr_t uPtrFrom, size_t 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
> +diff --git a/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c
> b/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c
> +index c771c1ba..a34eb149 100644
> +--- a/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c
> ++++ b/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c
> +@@ -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,6 +505,42 @@ static void rtR0MemObjLinuxFreePages(PRTR0MEMOBJLNX
> pMemLnx)
> + }
> +
> +
> ++#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.
> +  *
> +@@ -584,6 +623,11 @@ static int rtR0MemObjLinuxVMap(PRTR0MEMOBJLNX
> pMemLnx, bool fExecutable)
> +         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 @@ DECLHIDDEN(int)
> rtR0MemObjNativeProtect(PRTR0MEMOBJINTERNAL pMem, size_t offSub,
> +         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);
> +--
> +2.30.0
> +
> diff --git a/meta-oe/recipes-support/vboxguestdrivers/
> vboxguestdrivers_6.1.16.bb b/meta-oe/recipes-support/vboxguestdrivers/
> vboxguestdrivers_6.1.16.bb
> index 9282f663b4..fef7ffa954 100644
> --- a/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers_6.1.16.bb
> +++ b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers_6.1.16.bb
> @@ -13,6 +13,8 @@ VBOX_NAME = "VirtualBox-${PV}"
>
>  SRC_URI = "
> http://download.virtualbox.org/virtualbox/${PV}/${VBOX_NAME}.tar.bz2 \
>      file://Makefile.utils \
> +    file://0001-support-python-5.9.patch \
>

file://0001-support-python-3.9.patch


> +    file://0002-Backport-5.10-fixes.patch \
>  "
>  SRC_URI[md5sum] = "a12a647f6c114f2cb1571089b36841fe"
>  SRC_URI[sha256sum] =
> "49c1990da16d8a3d5bda8cdb961ec8195a901e67e4c79aea44c1521a5fc2f9f1"
> --
> 2.30.0
>
>
> 
>
>

-- 
best regards,
José Quaresma

[-- Attachment #2: Type: text/html, Size: 30725 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [oe] [meta-oe][PATCH] vboxguestdrivers: Fix build with kernel 5.10
  2021-01-05 10:50 ` [oe] " Jose Quaresma
@ 2021-01-05 17:05   ` Khem Raj
  2021-01-05 17:12     ` Bruce Ashfield
  0 siblings, 1 reply; 7+ messages in thread
From: Khem Raj @ 2021-01-05 17:05 UTC (permalink / raw)
  To: Jose Quaresma; +Cc: openembeded-devel



On 1/5/21 2:50 AM, Jose Quaresma wrote:
> Hi,
> 
> I think there are a typo in python version the patch mention 5.9 instead 
> of 3.9

thanks I will fix it

> 
> Khem Raj <raj.khem@gmail.com <mailto:raj.khem@gmail.com>> escreveu no 
> dia terça, 5/01/2021 à(s) 04:04:
> 
>     Signed-off-by: Khem Raj <raj.khem@gmail.com <mailto:raj.khem@gmail.com>>
>     ---
>       .../0001-support-python-5.9.patch             | 129 ++++++
> 
> 
> .../0001-support-python-3.9.patch
> 
>       .../0002-Backport-5.10-fixes.patch            | 432 ++++++++++++++++++
>       .../vboxguestdrivers_6.1.16.bb
>     <http://vboxguestdrivers_6.1.16.bb>                |   2 +
>       3 files changed, 563 insertions(+)
>       create mode 100644
>     meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0001-support-python-5.9.patch
>       create mode 100644
>     meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0002-Backport-5.10-fixes.patch
> 
>     diff --git
>     a/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0001-support-python-5.9.patch
>     b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0001-support-python-5.9.patch
>     new file mode 100644
>     index 0000000000..f1c4194633
>     --- /dev/null
>     +++
>     b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0001-support-python-5.9.patch
>     @@ -0,0 +1,129 @@
>     +From d4df52c9442d44adfc492e8e1b682ab638f10c0c Mon Sep 17 00:00:00 2001
>     +From: Khem Raj <raj.khem@gmail.com <mailto:raj.khem@gmail.com>>
>     +Date: Mon, 4 Jan 2021 19:52:10 -0800
>     +Subject: [PATCH 1/2] support python 5.9
> 
> 
> Subject: [PATCH 1/2] support python 3.9
> 
>     +
>     +Imported from
>     +
>     +https://github.com/archlinux/svntogit-community/commit/9276e06052e89615fe8bf3a30d04f5803ad2e539
>     <https://github.com/archlinux/svntogit-community/commit/9276e06052e89615fe8bf3a30d04f5803ad2e539>
>     +
>     +Signed-off-by: Khem Raj <raj.khem@gmail.com
>     <mailto:raj.khem@gmail.com>>
>     +---
>     + configure                                     |  2 +-
>     + src/libs/xpcom18a4/python/Makefile.kmk        | 48 ++++++++++++++++++-
>     + src/libs/xpcom18a4/python/gen_python_deps.py  |  2 +-
>     + .../xpcom18a4/python/src/module/_xpcom.cpp    |  6 ++-
>     + 4 files changed, 54 insertions(+), 4 deletions(-)
>     +
>     +diff --git a/configure b/configure
>     +index 55390478..50f53434 100755
>     +--- a/configure
>     ++++ b/configure
>     +@@ -2028,7 +2028,7 @@ extern "C" int main(void)
>     + }
>     + EOF
>     +   found=
>     +-  SUPPYTHONLIBS="python2.7 python2.6 python3.1 python3.2 python3.3
>     python3.4 python3.4m python3.5 python3.5m python3.6 python3.6m
>     python3.7 python3.7m python3.8 python3.8m"
>     ++  SUPPYTHONLIBS="python2.7 python2.6 python3.1 python3.2 python3.3
>     python3.4 python3.4m python3.5 python3.5m python3.6 python3.6m
>     python3.7 python3.7m python3.8 python3.8m python3.9 python3.9m"
>     +   for p in $PYTHONDIR; do
>     +     for d in $SUPPYTHONLIBS; do
>     +       for b in lib/x86_64-linux-gnu lib/i386-linux-gnu lib64
>     lib/64 lib; do
>     +diff --git a/src/libs/xpcom18a4/python/Makefile.kmk
>     b/src/libs/xpcom18a4/python/Makefile.kmk
>     +index f854ea84..afc3d6b3 100644
>     +--- a/src/libs/xpcom18a4/python/Makefile.kmk
>     ++++ b/src/libs/xpcom18a4/python/Makefile.kmk
>     +@@ -26,7 +26,7 @@ endif
>     +
>     + #
>     + # List of supported Python versions, defining a number of
>     +-#
>     VBOX_PYTHON[26|27|31|32|32M|33|33M|34|34M|35|35M|36|36M|37|37M|38|38M|DEF]_[INC|LIB]
>     variables
>     ++#
>     VBOX_PYTHON[26|27|31|32|32M|33|33M|34|34M|35|35M|36|36M|37|37M|38|38M|39|39M|DEF]_[INC|LIB]
>     variables
>     + # which get picked up below.
>     + #
>     + ifeq ($(KBUILD_TARGET),darwin) # Relatively predictable, don't script.
>     +@@ -533,6 +533,52 @@ VBoxPython3_8m_x86_LIBS       =
>     $(VBOX_PYTHON38M_LIB_X86)
>     +  endif
>     + endif
>     +
>     ++ifdef VBOX_PYTHON39_INC
>     ++#
>     ++# Python 3.9 version
>     ++#
>     ++DLLS += VBoxPython3_9
>     ++VBoxPython3_9_EXTENDS    = VBoxPythonBase
>     ++VBoxPython3_9_EXTENDS_BY = appending
>     ++VBoxPython3_9_TEMPLATE   = XPCOM
>     ++VBoxPython3_9_INCS       = $(VBOX_PYTHON39_INC)
>     ++VBoxPython3_9_LIBS       = $(VBOX_PYTHON39_LIB)
>     ++
>     ++ ifdef VBOX_WITH_32_ON_64_MAIN_API
>     ++  ifdef VBOX_PYTHON39_LIB_X86
>     ++DLLS += VBoxPython3_9_x86
>     ++VBoxPython3_9_x86_EXTENDS    = VBoxPythonBase_x86
>     ++VBoxPython3_9_x86_EXTENDS_BY = appending
>     ++VBoxPython3_9_x86_TEMPLATE   = XPCOM
>     ++VBoxPython3_9_x86_INCS       = $(VBOX_PYTHON39_INC)
>     ++VBoxPython3_9_x86_LIBS       = $(VBOX_PYTHON39_LIB_X86)
>     ++  endif
>     ++ endif
>     ++endif
>     ++
>     ++ifdef VBOX_PYTHON39M_INC
>     ++#
>     ++# Python 3.9 version with pymalloc
>     ++#
>     ++DLLS += VBoxPython3_9m
>     ++VBoxPython3_9m_EXTENDS    = VBoxPythonBase_m
>     ++VBoxPython3_9m_EXTENDS_BY = appending
>     ++VBoxPython3_9m_TEMPLATE   = XPCOM
>     ++VBoxPython3_9m_INCS       = $(VBOX_PYTHON39M_INC)
>     ++VBoxPython3_9m_LIBS       = $(VBOX_PYTHON39M_LIB)
>     ++
>     ++ ifdef VBOX_WITH_32_ON_64_MAIN_API
>     ++  ifdef VBOX_PYTHON39M_LIB_X86
>     ++DLLS += VBoxPython3_9m_x86
>     ++VBoxPython3_9m_x86_EXTENDS    = VBoxPythonBase_x86_m
>     ++VBoxPython3_9m_x86_EXTENDS_BY = appending
>     ++VBoxPython3_9m_x86_TEMPLATE_   = XPCOM
>     ++VBoxPython3_9m_x86_INCS       = $(VBOX_PYTHON39M_INC)
>     ++VBoxPython3_9m_x86_LIBS       = $(VBOX_PYTHON39M_LIB_X86)
>     ++  endif
>     ++ endif
>     ++endif
>     ++
>     + ifdef VBOX_PYTHONDEF_INC
>     + #
>     + # Python without versioning
>     +diff --git a/src/libs/xpcom18a4/python/gen_python_deps.py
>     b/src/libs/xpcom18a4/python/gen_python_deps.py
>     +index 848dddf3..b116313a 100755
>     +--- a/src/libs/xpcom18a4/python/gen_python_deps.py
>     ++++ b/src/libs/xpcom18a4/python/gen_python_deps.py
>     +@@ -16,7 +16,7 @@ from __future__ import print_function
>     + import os,sys
>     + from distutils.version import StrictVersion
>     +
>     +-versions = ["2.6", "2.7", "3.1", "3.2", "3.2m", "3.3", "3.3m",
>     "3.4", "3.4m", "3.5", "3.5m", "3.6", "3.6m", "3.7", "3.7m", "3.8",
>     "3.8m" ]
>     ++versions = ["2.6", "2.7", "3.1", "3.2", "3.2m", "3.3", "3.3m",
>     "3.4", "3.4m", "3.5", "3.5m", "3.6", "3.6m", "3.7", "3.7m", "3.8",
>     "3.8m", "3.9", "3.9m" ]
>     + prefixes = ["/usr", "/usr/local", "/opt", "/opt/local"]
>     + known = {}
>     +
>     +diff --git a/src/libs/xpcom18a4/python/src/module/_xpcom.cpp
>     b/src/libs/xpcom18a4/python/src/module/_xpcom.cpp
>     +index d35eb607..93ce03fd 100644
>     +--- a/src/libs/xpcom18a4/python/src/module/_xpcom.cpp
>     ++++ b/src/libs/xpcom18a4/python/src/module/_xpcom.cpp
>     +@@ -84,7 +84,11 @@ extern PYXPCOM_EXPORT void
>     PyXPCOM_InterpreterState_Ensure();
>     + #  define MANGLE_MODULE_INIT(a_Name)    RT_CONCAT(a_Name,
>     MODULE_NAME_SUFFIX)
>     + # endif
>     + # ifdef VBOX_PYXPCOM_VERSIONED
>     +-#  if   PY_VERSION_HEX >= 0x03080000 && PY_VERSION_HEX < 0x03090000
>     ++#  if   PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x03100000
>     ++#   define MODULE_NAME    MANGLE_MODULE_NAME("VBoxPython3_9")
>     ++#   define initVBoxPython MANGLE_MODULE_INIT(PyInit_VBoxPython3_9)
>     ++
>     ++#  elif   PY_VERSION_HEX >= 0x03080000 && PY_VERSION_HEX < 0x03090000
>     + #   define MODULE_NAME    MANGLE_MODULE_NAME("VBoxPython3_8")
>     + #   define initVBoxPython MANGLE_MODULE_INIT(PyInit_VBoxPython3_8)
>     +
>     +--
>     +2.30.0
>     +
>     diff --git
>     a/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0002-Backport-5.10-fixes.patch
>     b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0002-Backport-5.10-fixes.patch
>     new file mode 100644
>     index 0000000000..f277ced902
>     --- /dev/null
>     +++
>     b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0002-Backport-5.10-fixes.patch
>     @@ -0,0 +1,432 @@
>     +From ac018c7fe2215aab028615b2823cc8fba97cf8c2 Mon Sep 17 00:00:00 2001
>     +From: Khem Raj <raj.khem@gmail.com <mailto:raj.khem@gmail.com>>
>     +Date: Mon, 4 Jan 2021 19:54:52 -0800
>     +Subject: [PATCH 2/2] Backport 5.10 fixes
>     +
>     +Imported from
>     +https://raw.githubusercontent.com/archlinux/svntogit-community/packages/virtualbox/trunk/020-linux-5-10.patch
>     <https://raw.githubusercontent.com/archlinux/svntogit-community/packages/virtualbox/trunk/020-linux-5-10.patch>
>     +
>     +Signed-off-by: Khem Raj <raj.khem@gmail.com
>     <mailto:raj.khem@gmail.com>>
>     +---
>     + src/VBox/Additions/linux/drm/vbox_drv.h       | 10 +-
>     + src/VBox/Additions/linux/drm/vbox_fb.c        |  2 +-
>     + src/VBox/Additions/linux/drm/vbox_mode.c      |  2 +-
>     + src/VBox/Additions/linux/drm/vbox_ttm.c       | 99 +++++++++++++++++--
>     + .../Additions/linux/sharedfolders/regops.c    |  5 +-
>     + .../Runtime/r0drv/linux/memobj-r0drv-linux.c  | 61 +++++++++++-
>     + 6 files changed, 163 insertions(+), 16 deletions(-)
>     +
>     +diff --git a/src/VBox/Additions/linux/drm/vbox_drv.h
>     b/src/VBox/Additions/linux/drm/vbox_drv.h
>     +index c680f3b4..d21d023c 100644
>     +--- a/src/VBox/Additions/linux/drm/vbox_drv.h
>     ++++ b/src/VBox/Additions/linux/drm/vbox_drv.h
>     +@@ -175,6 +175,9 @@
>     + #include <drm/ttm/ttm_placement.h>
>     + #include <drm/ttm/ttm_memory.h>
>     + #include <drm/ttm/ttm_module.h>
>     ++#if RTLNX_VER_MIN(5,10,0)
>     ++# include <drm/ttm/ttm_resource.h>
>     ++#endif
>     +
>     + #include "vboxvideo_guest.h"
>     + #include "vboxvideo_vbe.h"
>     +@@ -444,7 +447,10 @@ int vbox_bo_create(struct drm_device *dev, int
>     size, int align,
>     + int vbox_gem_create(struct drm_device *dev,
>     +                   u32 size, bool iskernel, struct drm_gem_object
>     **obj);
>     +
>     +-int vbox_bo_pin(struct vbox_bo *bo, u32 pl_flag, u64 *gpu_addr);
>     ++#define VBOX_MEM_TYPE_VRAM   0x1
>     ++#define VBOX_MEM_TYPE_SYSTEM 0x2
>     ++
>     ++int vbox_bo_pin(struct vbox_bo *bo, u32 mem_type, u64 *gpu_addr);
>     + int vbox_bo_unpin(struct vbox_bo *bo);
>     +
>     + static inline int vbox_bo_reserve(struct vbox_bo *bo, bool no_wait)
>     +@@ -469,7 +475,7 @@ static inline void vbox_bo_unreserve(struct
>     vbox_bo *bo)
>     +       ttm_bo_unreserve(&bo->bo);
>     + }
>     +
>     +-void vbox_ttm_placement(struct vbox_bo *bo, int domain);
>     ++void vbox_ttm_placement(struct vbox_bo *bo, u32 mem_type);
>     + int vbox_bo_push_sysram(struct vbox_bo *bo);
>     + int vbox_mmap(struct file *filp, struct vm_area_struct *vma);
>     +
>     +diff --git a/src/VBox/Additions/linux/drm/vbox_fb.c
>     b/src/VBox/Additions/linux/drm/vbox_fb.c
>     +index 811d0040..44b1ef52 100644
>     +--- a/src/VBox/Additions/linux/drm/vbox_fb.c
>     ++++ b/src/VBox/Additions/linux/drm/vbox_fb.c
>     +@@ -295,7 +295,7 @@ static int vboxfb_create(struct drm_fb_helper
>     *helper,
>     +       if (ret)
>     +               return ret;
>     +
>     +-      ret = vbox_bo_pin(bo, TTM_PL_FLAG_VRAM, NULL);
>     ++      ret = vbox_bo_pin(bo, VBOX_MEM_TYPE_VRAM, NULL);
>     +       if (ret) {
>     +               vbox_bo_unreserve(bo);
>     +               return ret;
>     +diff --git a/src/VBox/Additions/linux/drm/vbox_mode.c
>     b/src/VBox/Additions/linux/drm/vbox_mode.c
>     +index 1e2691fd..52fd10fd 100644
>     +--- a/src/VBox/Additions/linux/drm/vbox_mode.c
>     ++++ b/src/VBox/Additions/linux/drm/vbox_mode.c
>     +@@ -227,7 +227,7 @@ static int vbox_crtc_set_base(struct drm_crtc
>     *crtc,
>     +       if (ret)
>     +               return ret;
>     +
>     +-      ret = vbox_bo_pin(bo, TTM_PL_FLAG_VRAM, &gpu_addr);
>     ++      ret = vbox_bo_pin(bo, VBOX_MEM_TYPE_VRAM, &gpu_addr);
>     +       vbox_bo_unreserve(bo);
>     +       if (ret)
>     +               return ret;
>     +diff --git a/src/VBox/Additions/linux/drm/vbox_ttm.c
>     b/src/VBox/Additions/linux/drm/vbox_ttm.c
>     +index 4e990843..ee2da4aa 100644
>     +--- a/src/VBox/Additions/linux/drm/vbox_ttm.c
>     ++++ b/src/VBox/Additions/linux/drm/vbox_ttm.c
>     +@@ -41,6 +41,7 @@
>     + #define PLACEMENT_FLAGS(placement) ((placement).flags)
>     + #endif
>     +
>     ++
>     + static inline struct vbox_private *vbox_bdev(struct ttm_bo_device *bd)
>     + {
>     +       return container_of(bd, struct vbox_private, ttm.bdev);
>     +@@ -125,6 +126,7 @@ static bool vbox_ttm_bo_is_vbox_bo(struct
>     ttm_buffer_object *bo)
>     +       return false;
>     + }
>     +
>     ++#if RTLNX_VER_MAX(5,10,0)
>     + static int
>     + vbox_bo_init_mem_type(struct ttm_bo_device *bdev, u32 type,
>     +                     struct ttm_mem_type_manager *man)
>     +@@ -148,6 +150,7 @@ vbox_bo_init_mem_type(struct ttm_bo_device
>     *bdev, u32 type,
>     +
>     +       return 0;
>     + }
>     ++#endif
>     +
>     + static void
>     + vbox_bo_evict_flags(struct ttm_buffer_object *bo, struct
>     ttm_placement *pl)
>     +@@ -157,7 +160,7 @@ vbox_bo_evict_flags(struct ttm_buffer_object
>     *bo, struct ttm_placement *pl)
>     +       if (!vbox_ttm_bo_is_vbox_bo(bo))
>     +               return;
>     +
>     +-      vbox_ttm_placement(vboxbo, TTM_PL_FLAG_SYSTEM);
>     ++      vbox_ttm_placement(vboxbo, VBOX_MEM_TYPE_SYSTEM);
>     +       *pl = vboxbo->placement;
>     + }
>     +
>     +@@ -167,11 +170,12 @@ static int vbox_bo_verify_access(struct
>     ttm_buffer_object *bo,
>     +       return 0;
>     + }
>     +
>     ++#if RTLNX_VER_MAX(5,10,0)
>     + static int vbox_ttm_io_mem_reserve(struct ttm_bo_device *bdev,
>     +                                  struct ttm_mem_reg *mem)
>     + {
>     +-      struct ttm_mem_type_manager *man = &bdev->man[mem->mem_type];
>     +       struct vbox_private *vbox = vbox_bdev(bdev);
>     ++      struct ttm_mem_type_manager *man = &bdev->man[mem->mem_type];
>     +
>     +       mem->bus.addr = NULL;
>     +       mem->bus.offset = 0;
>     +@@ -194,12 +198,53 @@ static int vbox_ttm_io_mem_reserve(struct
>     ttm_bo_device *bdev,
>     +       }
>     +       return 0;
>     + }
>     ++#else
>     ++static int vbox_ttm_io_mem_reserve(struct ttm_bo_device *bdev,
>     ++                                 struct ttm_resource *mem)
>     ++{
>     ++      struct vbox_private *vbox = vbox_bdev(bdev);
>     ++      mem->bus.addr = NULL;
>     ++      mem->bus.offset = 0;
>     ++      mem->size = mem->num_pages << PAGE_SHIFT;
>     ++      mem->start = 0;
>     ++      mem->bus.is_iomem = false;
>     ++      switch (mem->mem_type) {
>     ++      case TTM_PL_SYSTEM:
>     ++              /* system memory */
>     ++              return 0;
>     ++      case TTM_PL_VRAM:
>     ++              mem->bus.offset = mem->start << PAGE_SHIFT;
>     ++              mem->start = pci_resource_start(vbox->dev->pdev, 0);
>     ++              mem->bus.is_iomem = true;
>     ++              break;
>     ++      default:
>     ++              return -EINVAL;
>     ++      }
>     ++      return 0;
>     ++}
>     ++#endif
>     +
>     ++
>     ++
>     ++#if RTLNX_VER_MIN(5,10,0)
>     ++static void vbox_ttm_io_mem_free(struct ttm_bo_device *bdev,
>     ++                               struct ttm_resource *mem)
>     ++{
>     ++}
>     ++#else
>     + static void vbox_ttm_io_mem_free(struct ttm_bo_device *bdev,
>     +                                struct ttm_mem_reg *mem)
>     + {
>     + }
>     ++#endif
>     +
>     ++#if RTLNX_VER_MIN(5,10,0)
>     ++static void vbox_ttm_tt_destroy(struct ttm_bo_device *bdev, struct
>     ttm_tt *tt)
>     ++{
>     ++      ttm_tt_fini(tt);
>     ++      kfree(tt);
>     ++}
>     ++#else
>     + static void vbox_ttm_backend_destroy(struct ttm_tt *tt)
>     + {
>     +       ttm_tt_fini(tt);
>     +@@ -209,6 +254,7 @@ static void vbox_ttm_backend_destroy(struct
>     ttm_tt *tt)
>     + static struct ttm_backend_func vbox_tt_backend_func = {
>     +       .destroy = &vbox_ttm_backend_destroy,
>     + };
>     ++#endif
>     +
>     + #if RTLNX_VER_MAX(4,17,0) && !RTLNX_RHEL_MAJ_PREREQ(7,6) &&
>     !RTLNX_SUSE_MAJ_PREREQ(15,1) && !RTLNX_SUSE_MAJ_PREREQ(12,5)
>     + static struct ttm_tt *vbox_ttm_tt_create(struct ttm_bo_device *bdev,
>     +@@ -226,7 +272,9 @@ static struct ttm_tt *vbox_ttm_tt_create(struct
>     ttm_buffer_object *bo,
>     +       if (!tt)
>     +               return NULL;
>     +
>     ++#if RTLNX_VER_MAX(5,10,0)
>     +       tt->func = &vbox_tt_backend_func;
>     ++#endif
>     + #if RTLNX_VER_MAX(4,17,0) && !RTLNX_RHEL_MAJ_PREREQ(7,6) &&
>     !RTLNX_SUSE_MAJ_PREREQ(15,1) && !RTLNX_SUSE_MAJ_PREREQ(12,5)
>     +       if (ttm_tt_init(tt, bdev, size, page_flags, dummy_read_page)) {
>     + #else
>     +@@ -261,11 +309,16 @@ static void vbox_ttm_tt_unpopulate(struct
>     ttm_tt *ttm)
>     +
>     + static struct ttm_bo_driver vbox_bo_driver = {
>     +       .ttm_tt_create = vbox_ttm_tt_create,
>     ++#if RTLNX_VER_MIN(5,10,0)
>     ++      .ttm_tt_destroy = vbox_ttm_tt_destroy,
>     ++#endif
>     + #if RTLNX_VER_MAX(4,17,0)
>     +       .ttm_tt_populate = vbox_ttm_tt_populate,
>     +       .ttm_tt_unpopulate = vbox_ttm_tt_unpopulate,
>     + #endif
>     ++#if RTLNX_VER_MAX(5,10,0)
>     +       .init_mem_type = vbox_bo_init_mem_type,
>     ++#endif
>     + #if RTLNX_VER_MIN(4,10,0) || RTLNX_RHEL_MAJ_PREREQ(7,4)
>     +       .eviction_valuable = ttm_bo_eviction_valuable,
>     + #endif
>     +@@ -318,8 +371,13 @@ int vbox_mm_init(struct vbox_private *vbox)
>     + #endif
>     +       }
>     +
>     ++#if RTLNX_VER_MIN(5,10,0)
>     ++      ret = ttm_range_man_init(bdev, TTM_PL_VRAM, false,
>     ++                           vbox->available_vram_size >> PAGE_SHIFT);
>     ++#else
>     +       ret = ttm_bo_init_mm(bdev, TTM_PL_VRAM,
>     +                            vbox->available_vram_size >> PAGE_SHIFT);
>     ++#endif
>     +       if (ret) {
>     +               DRM_ERROR("Failed ttm VRAM init: %d\n", ret);
>     +               goto err_device_release;
>     +@@ -359,7 +417,7 @@ void vbox_mm_fini(struct vbox_private *vbox)
>     + #endif
>     + }
>     +
>     +-void vbox_ttm_placement(struct vbox_bo *bo, int domain)
>     ++void vbox_ttm_placement(struct vbox_bo *bo, u32 mem_type)
>     + {
>     +       u32 c = 0;
>     + #if RTLNX_VER_MAX(3,18,0) && !RTLNX_RHEL_MAJ_PREREQ(7,2)
>     +@@ -372,15 +430,36 @@ void vbox_ttm_placement(struct vbox_bo *bo,
>     int domain)
>     +       bo->placement.placement = bo->placements;
>     +       bo->placement.busy_placement = bo->placements;
>     +
>     +-      if (domain & TTM_PL_FLAG_VRAM)
>     ++      if (mem_type & VBOX_MEM_TYPE_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;
>     +-      if (domain & TTM_PL_FLAG_SYSTEM)
>     ++#endif
>     ++      }
>     ++      if (mem_type & VBOX_MEM_TYPE_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;
>     +-      if (!c)
>     ++#endif
>     ++      }
>     ++      if (!c) {
>     ++#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
>     ++      }
>     +
>     +       bo->placement.num_placement = c;
>     +       bo->placement.num_busy_placement = c;
>     +@@ -414,7 +493,7 @@ int vbox_bo_create(struct drm_device *dev, int
>     size, int align,
>     +       vboxbo->bo.bdev->dev_mapping = dev->dev_mapping;
>     + #endif
>     +
>     +-      vbox_ttm_placement(vboxbo, TTM_PL_FLAG_VRAM |
>     TTM_PL_FLAG_SYSTEM);
>     ++      vbox_ttm_placement(vboxbo, VBOX_MEM_TYPE_VRAM |
>     VBOX_MEM_TYPE_SYSTEM);
>     +
>     +       acc_size = ttm_bo_dma_acc_size(&vbox->ttm.bdev, size,
>     +                                      sizeof(struct vbox_bo));
>     +@@ -452,7 +531,7 @@ static inline u64 vbox_bo_gpu_offset(struct
>     vbox_bo *bo)
>     + #endif
>     + }
>     +
>     +-int vbox_bo_pin(struct vbox_bo *bo, u32 pl_flag, u64 *gpu_addr)
>     ++int vbox_bo_pin(struct vbox_bo *bo, u32 mem_type, u64 *gpu_addr)
>     + {
>     + #if RTLNX_VER_MIN(4,16,0) || RTLNX_RHEL_MAJ_PREREQ(7,6) ||
>     RTLNX_SUSE_MAJ_PREREQ(15,1) || RTLNX_SUSE_MAJ_PREREQ(12,5)
>     +       struct ttm_operation_ctx ctx = { false, false };
>     +@@ -467,7 +546,7 @@ int vbox_bo_pin(struct vbox_bo *bo, u32
>     pl_flag, u64 *gpu_addr)
>     +               return 0;
>     +       }
>     +
>     +-      vbox_ttm_placement(bo, pl_flag);
>     ++      vbox_ttm_placement(bo, mem_type);
>     +
>     +       for (i = 0; i < bo->placement.num_placement; i++)
>     +               PLACEMENT_FLAGS(bo->placements[i]) |=
>     TTM_PL_FLAG_NO_EVICT;
>     +@@ -540,7 +619,7 @@ int vbox_bo_push_sysram(struct vbox_bo *bo)
>     +       if (bo->kmap.virtual)
>     +               ttm_bo_kunmap(&bo->kmap);
>     +
>     +-      vbox_ttm_placement(bo, TTM_PL_FLAG_SYSTEM);
>     ++      vbox_ttm_placement(bo, VBOX_MEM_TYPE_SYSTEM);
>     +
>     +       for (i = 0; i < bo->placement.num_placement; i++)
>     +               PLACEMENT_FLAGS(bo->placements[i]) |=
>     TTM_PL_FLAG_NO_EVICT;
>     +diff --git a/src/VBox/Additions/linux/sharedfolders/regops.c
>     b/src/VBox/Additions/linux/sharedfolders/regops.c
>     +index 3ad9c566..ec298a1b 100644
>     +--- a/src/VBox/Additions/linux/sharedfolders/regops.c
>     ++++ b/src/VBox/Additions/linux/sharedfolders/regops.c
>     +@@ -1401,7 +1401,10 @@ static int
>     vbsf_lock_user_pages_failed_check_kernel(uintptr_t uPtrFrom, size_t 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
>     +diff --git a/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c
>     b/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c
>     +index c771c1ba..a34eb149 100644
>     +--- a/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c
>     ++++ b/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c
>     +@@ -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,6 +505,42 @@ static void
>     rtR0MemObjLinuxFreePages(PRTR0MEMOBJLNX pMemLnx)
>     + }
>     +
>     +
>     ++#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.
>     +  *
>     +@@ -584,6 +623,11 @@ static int rtR0MemObjLinuxVMap(PRTR0MEMOBJLNX
>     pMemLnx, bool fExecutable)
>     +         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 @@ DECLHIDDEN(int)
>     rtR0MemObjNativeProtect(PRTR0MEMOBJINTERNAL pMem, size_t offSub,
>     +         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);
>     +--
>     +2.30.0
>     +
>     diff --git
>     a/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers_6.1.16.bb <http://vboxguestdrivers_6.1.16.bb>
>     b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers_6.1.16.bb <http://vboxguestdrivers_6.1.16.bb>
>     index 9282f663b4..fef7ffa954 100644
>     ---
>     a/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers_6.1.16.bb <http://vboxguestdrivers_6.1.16.bb>
>     +++
>     b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers_6.1.16.bb <http://vboxguestdrivers_6.1.16.bb>
>     @@ -13,6 +13,8 @@ VBOX_NAME = "VirtualBox-${PV}"
> 
>       SRC_URI =
>     "http://download.virtualbox.org/virtualbox/${PV}/${VBOX_NAME}.tar.bz2 <http://download.virtualbox.org/virtualbox/$%7BPV%7D/$%7BVBOX_NAME%7D.tar.bz2>
>     \
>           file://Makefile.utils \
>     +    file://0001-support-python-5.9.patch \
> 
> 
> file://0001-support-python-3.9.patch
> 
>     +    file://0002-Backport-5.10-fixes.patch \
>       "
>       SRC_URI[md5sum] = "a12a647f6c114f2cb1571089b36841fe"
>       SRC_URI[sha256sum] =
>     "49c1990da16d8a3d5bda8cdb961ec8195a901e67e4c79aea44c1521a5fc2f9f1"
>     -- 
>     2.30.0
> 
> 
>     
> 
> 
> 
> -- 
> best regards,
> José Quaresma

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [oe] [meta-oe][PATCH] vboxguestdrivers: Fix build with kernel 5.10
  2021-01-05 17:05   ` Khem Raj
@ 2021-01-05 17:12     ` Bruce Ashfield
  2021-01-05 17:22       ` Khem Raj
  0 siblings, 1 reply; 7+ messages in thread
From: Bruce Ashfield @ 2021-01-05 17:12 UTC (permalink / raw)
  To: Khem Raj; +Cc: Jose Quaresma, openembeded-devel

On Tue, Jan 5, 2021 at 12:05 PM Khem Raj <raj.khem@gmail.com> wrote:
>
>
>
> On 1/5/21 2:50 AM, Jose Quaresma wrote:
> > Hi,
> >
> > I think there are a typo in python version the patch mention 5.9 instead
> > of 3.9
>
> thanks I will fix it

Ha!

Sorry about the double send of the fix, I checked the list this
morning and somehow managed to miss this!

Bruce

>
> >
> > Khem Raj <raj.khem@gmail.com <mailto:raj.khem@gmail.com>> escreveu no
> > dia terça, 5/01/2021 à(s) 04:04:
> >
> >     Signed-off-by: Khem Raj <raj.khem@gmail.com <mailto:raj.khem@gmail.com>>
> >     ---
> >       .../0001-support-python-5.9.patch             | 129 ++++++
> >
> >
> > .../0001-support-python-3.9.patch
> >
> >       .../0002-Backport-5.10-fixes.patch            | 432 ++++++++++++++++++
> >       .../vboxguestdrivers_6.1.16.bb
> >     <http://vboxguestdrivers_6.1.16.bb>                |   2 +
> >       3 files changed, 563 insertions(+)
> >       create mode 100644
> >     meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0001-support-python-5.9.patch
> >       create mode 100644
> >     meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0002-Backport-5.10-fixes.patch
> >
> >     diff --git
> >     a/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0001-support-python-5.9.patch
> >     b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0001-support-python-5.9.patch
> >     new file mode 100644
> >     index 0000000000..f1c4194633
> >     --- /dev/null
> >     +++
> >     b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0001-support-python-5.9.patch
> >     @@ -0,0 +1,129 @@
> >     +From d4df52c9442d44adfc492e8e1b682ab638f10c0c Mon Sep 17 00:00:00 2001
> >     +From: Khem Raj <raj.khem@gmail.com <mailto:raj.khem@gmail.com>>
> >     +Date: Mon, 4 Jan 2021 19:52:10 -0800
> >     +Subject: [PATCH 1/2] support python 5.9
> >
> >
> > Subject: [PATCH 1/2] support python 3.9
> >
> >     +
> >     +Imported from
> >     +
> >     +https://github.com/archlinux/svntogit-community/commit/9276e06052e89615fe8bf3a30d04f5803ad2e539
> >     <https://github.com/archlinux/svntogit-community/commit/9276e06052e89615fe8bf3a30d04f5803ad2e539>
> >     +
> >     +Signed-off-by: Khem Raj <raj.khem@gmail.com
> >     <mailto:raj.khem@gmail.com>>
> >     +---
> >     + configure                                     |  2 +-
> >     + src/libs/xpcom18a4/python/Makefile.kmk        | 48 ++++++++++++++++++-
> >     + src/libs/xpcom18a4/python/gen_python_deps.py  |  2 +-
> >     + .../xpcom18a4/python/src/module/_xpcom.cpp    |  6 ++-
> >     + 4 files changed, 54 insertions(+), 4 deletions(-)
> >     +
> >     +diff --git a/configure b/configure
> >     +index 55390478..50f53434 100755
> >     +--- a/configure
> >     ++++ b/configure
> >     +@@ -2028,7 +2028,7 @@ extern "C" int main(void)
> >     + }
> >     + EOF
> >     +   found=
> >     +-  SUPPYTHONLIBS="python2.7 python2.6 python3.1 python3.2 python3.3
> >     python3.4 python3.4m python3.5 python3.5m python3.6 python3.6m
> >     python3.7 python3.7m python3.8 python3.8m"
> >     ++  SUPPYTHONLIBS="python2.7 python2.6 python3.1 python3.2 python3.3
> >     python3.4 python3.4m python3.5 python3.5m python3.6 python3.6m
> >     python3.7 python3.7m python3.8 python3.8m python3.9 python3.9m"
> >     +   for p in $PYTHONDIR; do
> >     +     for d in $SUPPYTHONLIBS; do
> >     +       for b in lib/x86_64-linux-gnu lib/i386-linux-gnu lib64
> >     lib/64 lib; do
> >     +diff --git a/src/libs/xpcom18a4/python/Makefile.kmk
> >     b/src/libs/xpcom18a4/python/Makefile.kmk
> >     +index f854ea84..afc3d6b3 100644
> >     +--- a/src/libs/xpcom18a4/python/Makefile.kmk
> >     ++++ b/src/libs/xpcom18a4/python/Makefile.kmk
> >     +@@ -26,7 +26,7 @@ endif
> >     +
> >     + #
> >     + # List of supported Python versions, defining a number of
> >     +-#
> >     VBOX_PYTHON[26|27|31|32|32M|33|33M|34|34M|35|35M|36|36M|37|37M|38|38M|DEF]_[INC|LIB]
> >     variables
> >     ++#
> >     VBOX_PYTHON[26|27|31|32|32M|33|33M|34|34M|35|35M|36|36M|37|37M|38|38M|39|39M|DEF]_[INC|LIB]
> >     variables
> >     + # which get picked up below.
> >     + #
> >     + ifeq ($(KBUILD_TARGET),darwin) # Relatively predictable, don't script.
> >     +@@ -533,6 +533,52 @@ VBoxPython3_8m_x86_LIBS       =
> >     $(VBOX_PYTHON38M_LIB_X86)
> >     +  endif
> >     + endif
> >     +
> >     ++ifdef VBOX_PYTHON39_INC
> >     ++#
> >     ++# Python 3.9 version
> >     ++#
> >     ++DLLS += VBoxPython3_9
> >     ++VBoxPython3_9_EXTENDS    = VBoxPythonBase
> >     ++VBoxPython3_9_EXTENDS_BY = appending
> >     ++VBoxPython3_9_TEMPLATE   = XPCOM
> >     ++VBoxPython3_9_INCS       = $(VBOX_PYTHON39_INC)
> >     ++VBoxPython3_9_LIBS       = $(VBOX_PYTHON39_LIB)
> >     ++
> >     ++ ifdef VBOX_WITH_32_ON_64_MAIN_API
> >     ++  ifdef VBOX_PYTHON39_LIB_X86
> >     ++DLLS += VBoxPython3_9_x86
> >     ++VBoxPython3_9_x86_EXTENDS    = VBoxPythonBase_x86
> >     ++VBoxPython3_9_x86_EXTENDS_BY = appending
> >     ++VBoxPython3_9_x86_TEMPLATE   = XPCOM
> >     ++VBoxPython3_9_x86_INCS       = $(VBOX_PYTHON39_INC)
> >     ++VBoxPython3_9_x86_LIBS       = $(VBOX_PYTHON39_LIB_X86)
> >     ++  endif
> >     ++ endif
> >     ++endif
> >     ++
> >     ++ifdef VBOX_PYTHON39M_INC
> >     ++#
> >     ++# Python 3.9 version with pymalloc
> >     ++#
> >     ++DLLS += VBoxPython3_9m
> >     ++VBoxPython3_9m_EXTENDS    = VBoxPythonBase_m
> >     ++VBoxPython3_9m_EXTENDS_BY = appending
> >     ++VBoxPython3_9m_TEMPLATE   = XPCOM
> >     ++VBoxPython3_9m_INCS       = $(VBOX_PYTHON39M_INC)
> >     ++VBoxPython3_9m_LIBS       = $(VBOX_PYTHON39M_LIB)
> >     ++
> >     ++ ifdef VBOX_WITH_32_ON_64_MAIN_API
> >     ++  ifdef VBOX_PYTHON39M_LIB_X86
> >     ++DLLS += VBoxPython3_9m_x86
> >     ++VBoxPython3_9m_x86_EXTENDS    = VBoxPythonBase_x86_m
> >     ++VBoxPython3_9m_x86_EXTENDS_BY = appending
> >     ++VBoxPython3_9m_x86_TEMPLATE_   = XPCOM
> >     ++VBoxPython3_9m_x86_INCS       = $(VBOX_PYTHON39M_INC)
> >     ++VBoxPython3_9m_x86_LIBS       = $(VBOX_PYTHON39M_LIB_X86)
> >     ++  endif
> >     ++ endif
> >     ++endif
> >     ++
> >     + ifdef VBOX_PYTHONDEF_INC
> >     + #
> >     + # Python without versioning
> >     +diff --git a/src/libs/xpcom18a4/python/gen_python_deps.py
> >     b/src/libs/xpcom18a4/python/gen_python_deps.py
> >     +index 848dddf3..b116313a 100755
> >     +--- a/src/libs/xpcom18a4/python/gen_python_deps.py
> >     ++++ b/src/libs/xpcom18a4/python/gen_python_deps.py
> >     +@@ -16,7 +16,7 @@ from __future__ import print_function
> >     + import os,sys
> >     + from distutils.version import StrictVersion
> >     +
> >     +-versions = ["2.6", "2.7", "3.1", "3.2", "3.2m", "3.3", "3.3m",
> >     "3.4", "3.4m", "3.5", "3.5m", "3.6", "3.6m", "3.7", "3.7m", "3.8",
> >     "3.8m" ]
> >     ++versions = ["2.6", "2.7", "3.1", "3.2", "3.2m", "3.3", "3.3m",
> >     "3.4", "3.4m", "3.5", "3.5m", "3.6", "3.6m", "3.7", "3.7m", "3.8",
> >     "3.8m", "3.9", "3.9m" ]
> >     + prefixes = ["/usr", "/usr/local", "/opt", "/opt/local"]
> >     + known = {}
> >     +
> >     +diff --git a/src/libs/xpcom18a4/python/src/module/_xpcom.cpp
> >     b/src/libs/xpcom18a4/python/src/module/_xpcom.cpp
> >     +index d35eb607..93ce03fd 100644
> >     +--- a/src/libs/xpcom18a4/python/src/module/_xpcom.cpp
> >     ++++ b/src/libs/xpcom18a4/python/src/module/_xpcom.cpp
> >     +@@ -84,7 +84,11 @@ extern PYXPCOM_EXPORT void
> >     PyXPCOM_InterpreterState_Ensure();
> >     + #  define MANGLE_MODULE_INIT(a_Name)    RT_CONCAT(a_Name,
> >     MODULE_NAME_SUFFIX)
> >     + # endif
> >     + # ifdef VBOX_PYXPCOM_VERSIONED
> >     +-#  if   PY_VERSION_HEX >= 0x03080000 && PY_VERSION_HEX < 0x03090000
> >     ++#  if   PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x03100000
> >     ++#   define MODULE_NAME    MANGLE_MODULE_NAME("VBoxPython3_9")
> >     ++#   define initVBoxPython MANGLE_MODULE_INIT(PyInit_VBoxPython3_9)
> >     ++
> >     ++#  elif   PY_VERSION_HEX >= 0x03080000 && PY_VERSION_HEX < 0x03090000
> >     + #   define MODULE_NAME    MANGLE_MODULE_NAME("VBoxPython3_8")
> >     + #   define initVBoxPython MANGLE_MODULE_INIT(PyInit_VBoxPython3_8)
> >     +
> >     +--
> >     +2.30.0
> >     +
> >     diff --git
> >     a/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0002-Backport-5.10-fixes.patch
> >     b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0002-Backport-5.10-fixes.patch
> >     new file mode 100644
> >     index 0000000000..f277ced902
> >     --- /dev/null
> >     +++
> >     b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0002-Backport-5.10-fixes.patch
> >     @@ -0,0 +1,432 @@
> >     +From ac018c7fe2215aab028615b2823cc8fba97cf8c2 Mon Sep 17 00:00:00 2001
> >     +From: Khem Raj <raj.khem@gmail.com <mailto:raj.khem@gmail.com>>
> >     +Date: Mon, 4 Jan 2021 19:54:52 -0800
> >     +Subject: [PATCH 2/2] Backport 5.10 fixes
> >     +
> >     +Imported from
> >     +https://raw.githubusercontent.com/archlinux/svntogit-community/packages/virtualbox/trunk/020-linux-5-10.patch
> >     <https://raw.githubusercontent.com/archlinux/svntogit-community/packages/virtualbox/trunk/020-linux-5-10.patch>
> >     +
> >     +Signed-off-by: Khem Raj <raj.khem@gmail.com
> >     <mailto:raj.khem@gmail.com>>
> >     +---
> >     + src/VBox/Additions/linux/drm/vbox_drv.h       | 10 +-
> >     + src/VBox/Additions/linux/drm/vbox_fb.c        |  2 +-
> >     + src/VBox/Additions/linux/drm/vbox_mode.c      |  2 +-
> >     + src/VBox/Additions/linux/drm/vbox_ttm.c       | 99 +++++++++++++++++--
> >     + .../Additions/linux/sharedfolders/regops.c    |  5 +-
> >     + .../Runtime/r0drv/linux/memobj-r0drv-linux.c  | 61 +++++++++++-
> >     + 6 files changed, 163 insertions(+), 16 deletions(-)
> >     +
> >     +diff --git a/src/VBox/Additions/linux/drm/vbox_drv.h
> >     b/src/VBox/Additions/linux/drm/vbox_drv.h
> >     +index c680f3b4..d21d023c 100644
> >     +--- a/src/VBox/Additions/linux/drm/vbox_drv.h
> >     ++++ b/src/VBox/Additions/linux/drm/vbox_drv.h
> >     +@@ -175,6 +175,9 @@
> >     + #include <drm/ttm/ttm_placement.h>
> >     + #include <drm/ttm/ttm_memory.h>
> >     + #include <drm/ttm/ttm_module.h>
> >     ++#if RTLNX_VER_MIN(5,10,0)
> >     ++# include <drm/ttm/ttm_resource.h>
> >     ++#endif
> >     +
> >     + #include "vboxvideo_guest.h"
> >     + #include "vboxvideo_vbe.h"
> >     +@@ -444,7 +447,10 @@ int vbox_bo_create(struct drm_device *dev, int
> >     size, int align,
> >     + int vbox_gem_create(struct drm_device *dev,
> >     +                   u32 size, bool iskernel, struct drm_gem_object
> >     **obj);
> >     +
> >     +-int vbox_bo_pin(struct vbox_bo *bo, u32 pl_flag, u64 *gpu_addr);
> >     ++#define VBOX_MEM_TYPE_VRAM   0x1
> >     ++#define VBOX_MEM_TYPE_SYSTEM 0x2
> >     ++
> >     ++int vbox_bo_pin(struct vbox_bo *bo, u32 mem_type, u64 *gpu_addr);
> >     + int vbox_bo_unpin(struct vbox_bo *bo);
> >     +
> >     + static inline int vbox_bo_reserve(struct vbox_bo *bo, bool no_wait)
> >     +@@ -469,7 +475,7 @@ static inline void vbox_bo_unreserve(struct
> >     vbox_bo *bo)
> >     +       ttm_bo_unreserve(&bo->bo);
> >     + }
> >     +
> >     +-void vbox_ttm_placement(struct vbox_bo *bo, int domain);
> >     ++void vbox_ttm_placement(struct vbox_bo *bo, u32 mem_type);
> >     + int vbox_bo_push_sysram(struct vbox_bo *bo);
> >     + int vbox_mmap(struct file *filp, struct vm_area_struct *vma);
> >     +
> >     +diff --git a/src/VBox/Additions/linux/drm/vbox_fb.c
> >     b/src/VBox/Additions/linux/drm/vbox_fb.c
> >     +index 811d0040..44b1ef52 100644
> >     +--- a/src/VBox/Additions/linux/drm/vbox_fb.c
> >     ++++ b/src/VBox/Additions/linux/drm/vbox_fb.c
> >     +@@ -295,7 +295,7 @@ static int vboxfb_create(struct drm_fb_helper
> >     *helper,
> >     +       if (ret)
> >     +               return ret;
> >     +
> >     +-      ret = vbox_bo_pin(bo, TTM_PL_FLAG_VRAM, NULL);
> >     ++      ret = vbox_bo_pin(bo, VBOX_MEM_TYPE_VRAM, NULL);
> >     +       if (ret) {
> >     +               vbox_bo_unreserve(bo);
> >     +               return ret;
> >     +diff --git a/src/VBox/Additions/linux/drm/vbox_mode.c
> >     b/src/VBox/Additions/linux/drm/vbox_mode.c
> >     +index 1e2691fd..52fd10fd 100644
> >     +--- a/src/VBox/Additions/linux/drm/vbox_mode.c
> >     ++++ b/src/VBox/Additions/linux/drm/vbox_mode.c
> >     +@@ -227,7 +227,7 @@ static int vbox_crtc_set_base(struct drm_crtc
> >     *crtc,
> >     +       if (ret)
> >     +               return ret;
> >     +
> >     +-      ret = vbox_bo_pin(bo, TTM_PL_FLAG_VRAM, &gpu_addr);
> >     ++      ret = vbox_bo_pin(bo, VBOX_MEM_TYPE_VRAM, &gpu_addr);
> >     +       vbox_bo_unreserve(bo);
> >     +       if (ret)
> >     +               return ret;
> >     +diff --git a/src/VBox/Additions/linux/drm/vbox_ttm.c
> >     b/src/VBox/Additions/linux/drm/vbox_ttm.c
> >     +index 4e990843..ee2da4aa 100644
> >     +--- a/src/VBox/Additions/linux/drm/vbox_ttm.c
> >     ++++ b/src/VBox/Additions/linux/drm/vbox_ttm.c
> >     +@@ -41,6 +41,7 @@
> >     + #define PLACEMENT_FLAGS(placement) ((placement).flags)
> >     + #endif
> >     +
> >     ++
> >     + static inline struct vbox_private *vbox_bdev(struct ttm_bo_device *bd)
> >     + {
> >     +       return container_of(bd, struct vbox_private, ttm.bdev);
> >     +@@ -125,6 +126,7 @@ static bool vbox_ttm_bo_is_vbox_bo(struct
> >     ttm_buffer_object *bo)
> >     +       return false;
> >     + }
> >     +
> >     ++#if RTLNX_VER_MAX(5,10,0)
> >     + static int
> >     + vbox_bo_init_mem_type(struct ttm_bo_device *bdev, u32 type,
> >     +                     struct ttm_mem_type_manager *man)
> >     +@@ -148,6 +150,7 @@ vbox_bo_init_mem_type(struct ttm_bo_device
> >     *bdev, u32 type,
> >     +
> >     +       return 0;
> >     + }
> >     ++#endif
> >     +
> >     + static void
> >     + vbox_bo_evict_flags(struct ttm_buffer_object *bo, struct
> >     ttm_placement *pl)
> >     +@@ -157,7 +160,7 @@ vbox_bo_evict_flags(struct ttm_buffer_object
> >     *bo, struct ttm_placement *pl)
> >     +       if (!vbox_ttm_bo_is_vbox_bo(bo))
> >     +               return;
> >     +
> >     +-      vbox_ttm_placement(vboxbo, TTM_PL_FLAG_SYSTEM);
> >     ++      vbox_ttm_placement(vboxbo, VBOX_MEM_TYPE_SYSTEM);
> >     +       *pl = vboxbo->placement;
> >     + }
> >     +
> >     +@@ -167,11 +170,12 @@ static int vbox_bo_verify_access(struct
> >     ttm_buffer_object *bo,
> >     +       return 0;
> >     + }
> >     +
> >     ++#if RTLNX_VER_MAX(5,10,0)
> >     + static int vbox_ttm_io_mem_reserve(struct ttm_bo_device *bdev,
> >     +                                  struct ttm_mem_reg *mem)
> >     + {
> >     +-      struct ttm_mem_type_manager *man = &bdev->man[mem->mem_type];
> >     +       struct vbox_private *vbox = vbox_bdev(bdev);
> >     ++      struct ttm_mem_type_manager *man = &bdev->man[mem->mem_type];
> >     +
> >     +       mem->bus.addr = NULL;
> >     +       mem->bus.offset = 0;
> >     +@@ -194,12 +198,53 @@ static int vbox_ttm_io_mem_reserve(struct
> >     ttm_bo_device *bdev,
> >     +       }
> >     +       return 0;
> >     + }
> >     ++#else
> >     ++static int vbox_ttm_io_mem_reserve(struct ttm_bo_device *bdev,
> >     ++                                 struct ttm_resource *mem)
> >     ++{
> >     ++      struct vbox_private *vbox = vbox_bdev(bdev);
> >     ++      mem->bus.addr = NULL;
> >     ++      mem->bus.offset = 0;
> >     ++      mem->size = mem->num_pages << PAGE_SHIFT;
> >     ++      mem->start = 0;
> >     ++      mem->bus.is_iomem = false;
> >     ++      switch (mem->mem_type) {
> >     ++      case TTM_PL_SYSTEM:
> >     ++              /* system memory */
> >     ++              return 0;
> >     ++      case TTM_PL_VRAM:
> >     ++              mem->bus.offset = mem->start << PAGE_SHIFT;
> >     ++              mem->start = pci_resource_start(vbox->dev->pdev, 0);
> >     ++              mem->bus.is_iomem = true;
> >     ++              break;
> >     ++      default:
> >     ++              return -EINVAL;
> >     ++      }
> >     ++      return 0;
> >     ++}
> >     ++#endif
> >     +
> >     ++
> >     ++
> >     ++#if RTLNX_VER_MIN(5,10,0)
> >     ++static void vbox_ttm_io_mem_free(struct ttm_bo_device *bdev,
> >     ++                               struct ttm_resource *mem)
> >     ++{
> >     ++}
> >     ++#else
> >     + static void vbox_ttm_io_mem_free(struct ttm_bo_device *bdev,
> >     +                                struct ttm_mem_reg *mem)
> >     + {
> >     + }
> >     ++#endif
> >     +
> >     ++#if RTLNX_VER_MIN(5,10,0)
> >     ++static void vbox_ttm_tt_destroy(struct ttm_bo_device *bdev, struct
> >     ttm_tt *tt)
> >     ++{
> >     ++      ttm_tt_fini(tt);
> >     ++      kfree(tt);
> >     ++}
> >     ++#else
> >     + static void vbox_ttm_backend_destroy(struct ttm_tt *tt)
> >     + {
> >     +       ttm_tt_fini(tt);
> >     +@@ -209,6 +254,7 @@ static void vbox_ttm_backend_destroy(struct
> >     ttm_tt *tt)
> >     + static struct ttm_backend_func vbox_tt_backend_func = {
> >     +       .destroy = &vbox_ttm_backend_destroy,
> >     + };
> >     ++#endif
> >     +
> >     + #if RTLNX_VER_MAX(4,17,0) && !RTLNX_RHEL_MAJ_PREREQ(7,6) &&
> >     !RTLNX_SUSE_MAJ_PREREQ(15,1) && !RTLNX_SUSE_MAJ_PREREQ(12,5)
> >     + static struct ttm_tt *vbox_ttm_tt_create(struct ttm_bo_device *bdev,
> >     +@@ -226,7 +272,9 @@ static struct ttm_tt *vbox_ttm_tt_create(struct
> >     ttm_buffer_object *bo,
> >     +       if (!tt)
> >     +               return NULL;
> >     +
> >     ++#if RTLNX_VER_MAX(5,10,0)
> >     +       tt->func = &vbox_tt_backend_func;
> >     ++#endif
> >     + #if RTLNX_VER_MAX(4,17,0) && !RTLNX_RHEL_MAJ_PREREQ(7,6) &&
> >     !RTLNX_SUSE_MAJ_PREREQ(15,1) && !RTLNX_SUSE_MAJ_PREREQ(12,5)
> >     +       if (ttm_tt_init(tt, bdev, size, page_flags, dummy_read_page)) {
> >     + #else
> >     +@@ -261,11 +309,16 @@ static void vbox_ttm_tt_unpopulate(struct
> >     ttm_tt *ttm)
> >     +
> >     + static struct ttm_bo_driver vbox_bo_driver = {
> >     +       .ttm_tt_create = vbox_ttm_tt_create,
> >     ++#if RTLNX_VER_MIN(5,10,0)
> >     ++      .ttm_tt_destroy = vbox_ttm_tt_destroy,
> >     ++#endif
> >     + #if RTLNX_VER_MAX(4,17,0)
> >     +       .ttm_tt_populate = vbox_ttm_tt_populate,
> >     +       .ttm_tt_unpopulate = vbox_ttm_tt_unpopulate,
> >     + #endif
> >     ++#if RTLNX_VER_MAX(5,10,0)
> >     +       .init_mem_type = vbox_bo_init_mem_type,
> >     ++#endif
> >     + #if RTLNX_VER_MIN(4,10,0) || RTLNX_RHEL_MAJ_PREREQ(7,4)
> >     +       .eviction_valuable = ttm_bo_eviction_valuable,
> >     + #endif
> >     +@@ -318,8 +371,13 @@ int vbox_mm_init(struct vbox_private *vbox)
> >     + #endif
> >     +       }
> >     +
> >     ++#if RTLNX_VER_MIN(5,10,0)
> >     ++      ret = ttm_range_man_init(bdev, TTM_PL_VRAM, false,
> >     ++                           vbox->available_vram_size >> PAGE_SHIFT);
> >     ++#else
> >     +       ret = ttm_bo_init_mm(bdev, TTM_PL_VRAM,
> >     +                            vbox->available_vram_size >> PAGE_SHIFT);
> >     ++#endif
> >     +       if (ret) {
> >     +               DRM_ERROR("Failed ttm VRAM init: %d\n", ret);
> >     +               goto err_device_release;
> >     +@@ -359,7 +417,7 @@ void vbox_mm_fini(struct vbox_private *vbox)
> >     + #endif
> >     + }
> >     +
> >     +-void vbox_ttm_placement(struct vbox_bo *bo, int domain)
> >     ++void vbox_ttm_placement(struct vbox_bo *bo, u32 mem_type)
> >     + {
> >     +       u32 c = 0;
> >     + #if RTLNX_VER_MAX(3,18,0) && !RTLNX_RHEL_MAJ_PREREQ(7,2)
> >     +@@ -372,15 +430,36 @@ void vbox_ttm_placement(struct vbox_bo *bo,
> >     int domain)
> >     +       bo->placement.placement = bo->placements;
> >     +       bo->placement.busy_placement = bo->placements;
> >     +
> >     +-      if (domain & TTM_PL_FLAG_VRAM)
> >     ++      if (mem_type & VBOX_MEM_TYPE_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;
> >     +-      if (domain & TTM_PL_FLAG_SYSTEM)
> >     ++#endif
> >     ++      }
> >     ++      if (mem_type & VBOX_MEM_TYPE_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;
> >     +-      if (!c)
> >     ++#endif
> >     ++      }
> >     ++      if (!c) {
> >     ++#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
> >     ++      }
> >     +
> >     +       bo->placement.num_placement = c;
> >     +       bo->placement.num_busy_placement = c;
> >     +@@ -414,7 +493,7 @@ int vbox_bo_create(struct drm_device *dev, int
> >     size, int align,
> >     +       vboxbo->bo.bdev->dev_mapping = dev->dev_mapping;
> >     + #endif
> >     +
> >     +-      vbox_ttm_placement(vboxbo, TTM_PL_FLAG_VRAM |
> >     TTM_PL_FLAG_SYSTEM);
> >     ++      vbox_ttm_placement(vboxbo, VBOX_MEM_TYPE_VRAM |
> >     VBOX_MEM_TYPE_SYSTEM);
> >     +
> >     +       acc_size = ttm_bo_dma_acc_size(&vbox->ttm.bdev, size,
> >     +                                      sizeof(struct vbox_bo));
> >     +@@ -452,7 +531,7 @@ static inline u64 vbox_bo_gpu_offset(struct
> >     vbox_bo *bo)
> >     + #endif
> >     + }
> >     +
> >     +-int vbox_bo_pin(struct vbox_bo *bo, u32 pl_flag, u64 *gpu_addr)
> >     ++int vbox_bo_pin(struct vbox_bo *bo, u32 mem_type, u64 *gpu_addr)
> >     + {
> >     + #if RTLNX_VER_MIN(4,16,0) || RTLNX_RHEL_MAJ_PREREQ(7,6) ||
> >     RTLNX_SUSE_MAJ_PREREQ(15,1) || RTLNX_SUSE_MAJ_PREREQ(12,5)
> >     +       struct ttm_operation_ctx ctx = { false, false };
> >     +@@ -467,7 +546,7 @@ int vbox_bo_pin(struct vbox_bo *bo, u32
> >     pl_flag, u64 *gpu_addr)
> >     +               return 0;
> >     +       }
> >     +
> >     +-      vbox_ttm_placement(bo, pl_flag);
> >     ++      vbox_ttm_placement(bo, mem_type);
> >     +
> >     +       for (i = 0; i < bo->placement.num_placement; i++)
> >     +               PLACEMENT_FLAGS(bo->placements[i]) |=
> >     TTM_PL_FLAG_NO_EVICT;
> >     +@@ -540,7 +619,7 @@ int vbox_bo_push_sysram(struct vbox_bo *bo)
> >     +       if (bo->kmap.virtual)
> >     +               ttm_bo_kunmap(&bo->kmap);
> >     +
> >     +-      vbox_ttm_placement(bo, TTM_PL_FLAG_SYSTEM);
> >     ++      vbox_ttm_placement(bo, VBOX_MEM_TYPE_SYSTEM);
> >     +
> >     +       for (i = 0; i < bo->placement.num_placement; i++)
> >     +               PLACEMENT_FLAGS(bo->placements[i]) |=
> >     TTM_PL_FLAG_NO_EVICT;
> >     +diff --git a/src/VBox/Additions/linux/sharedfolders/regops.c
> >     b/src/VBox/Additions/linux/sharedfolders/regops.c
> >     +index 3ad9c566..ec298a1b 100644
> >     +--- a/src/VBox/Additions/linux/sharedfolders/regops.c
> >     ++++ b/src/VBox/Additions/linux/sharedfolders/regops.c
> >     +@@ -1401,7 +1401,10 @@ static int
> >     vbsf_lock_user_pages_failed_check_kernel(uintptr_t uPtrFrom, size_t 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
> >     +diff --git a/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c
> >     b/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c
> >     +index c771c1ba..a34eb149 100644
> >     +--- a/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c
> >     ++++ b/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c
> >     +@@ -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,6 +505,42 @@ static void
> >     rtR0MemObjLinuxFreePages(PRTR0MEMOBJLNX pMemLnx)
> >     + }
> >     +
> >     +
> >     ++#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.
> >     +  *
> >     +@@ -584,6 +623,11 @@ static int rtR0MemObjLinuxVMap(PRTR0MEMOBJLNX
> >     pMemLnx, bool fExecutable)
> >     +         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 @@ DECLHIDDEN(int)
> >     rtR0MemObjNativeProtect(PRTR0MEMOBJINTERNAL pMem, size_t offSub,
> >     +         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);
> >     +--
> >     +2.30.0
> >     +
> >     diff --git
> >     a/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers_6.1.16.bb <http://vboxguestdrivers_6.1.16.bb>
> >     b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers_6.1.16.bb <http://vboxguestdrivers_6.1.16.bb>
> >     index 9282f663b4..fef7ffa954 100644
> >     ---
> >     a/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers_6.1.16.bb <http://vboxguestdrivers_6.1.16.bb>
> >     +++
> >     b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers_6.1.16.bb <http://vboxguestdrivers_6.1.16.bb>
> >     @@ -13,6 +13,8 @@ VBOX_NAME = "VirtualBox-${PV}"
> >
> >       SRC_URI =
> >     "http://download.virtualbox.org/virtualbox/${PV}/${VBOX_NAME}.tar.bz2 <http://download.virtualbox.org/virtualbox/$%7BPV%7D/$%7BVBOX_NAME%7D.tar.bz2>
> >     \
> >           file://Makefile.utils \
> >     +    file://0001-support-python-5.9.patch \
> >
> >
> > file://0001-support-python-3.9.patch
> >
> >     +    file://0002-Backport-5.10-fixes.patch \
> >       "
> >       SRC_URI[md5sum] = "a12a647f6c114f2cb1571089b36841fe"
> >       SRC_URI[sha256sum] =
> >     "49c1990da16d8a3d5bda8cdb961ec8195a901e67e4c79aea44c1521a5fc2f9f1"
> >     --
> >     2.30.0
> >
> >
> >
> >
> >
> >
> > --
> > best regards,
> > José Quaresma
>
> 
>


-- 
- Thou shalt not follow the NULL pointer, for chaos and madness await
thee at its end
- "Use the force Harry" - Gandalf, Star Trek II

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [oe] [meta-oe][PATCH] vboxguestdrivers: Fix build with kernel 5.10
  2021-01-05 17:12     ` Bruce Ashfield
@ 2021-01-05 17:22       ` Khem Raj
  2021-01-06  5:30         ` Khem Raj
  0 siblings, 1 reply; 7+ messages in thread
From: Khem Raj @ 2021-01-05 17:22 UTC (permalink / raw)
  To: Bruce Ashfield; +Cc: Jose Quaresma, openembeded-devel



On 1/5/21 9:12 AM, Bruce Ashfield wrote:
> On Tue, Jan 5, 2021 at 12:05 PM Khem Raj <raj.khem@gmail.com> wrote:
>>
>>
>>
>> On 1/5/21 2:50 AM, Jose Quaresma wrote:
>>> Hi,
>>>
>>> I think there are a typo in python version the patch mention 5.9 instead
>>> of 3.9
>>
>> thanks I will fix it
> 
> Ha!
> 
> Sorry about the double send of the fix, I checked the list this
> morning and somehow managed to miss this!

I think your patch looks better organized so I will pick this one.

> 
> Bruce
> 
>>
>>>
>>> Khem Raj <raj.khem@gmail.com <mailto:raj.khem@gmail.com>> escreveu no
>>> dia terça, 5/01/2021 à(s) 04:04:
>>>
>>>      Signed-off-by: Khem Raj <raj.khem@gmail.com <mailto:raj.khem@gmail.com>>
>>>      ---
>>>        .../0001-support-python-5.9.patch             | 129 ++++++
>>>
>>>
>>> .../0001-support-python-3.9.patch
>>>
>>>        .../0002-Backport-5.10-fixes.patch            | 432 ++++++++++++++++++
>>>        .../vboxguestdrivers_6.1.16.bb
>>>      <http://vboxguestdrivers_6.1.16.bb>                |   2 +
>>>        3 files changed, 563 insertions(+)
>>>        create mode 100644
>>>      meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0001-support-python-5.9.patch
>>>        create mode 100644
>>>      meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0002-Backport-5.10-fixes.patch
>>>
>>>      diff --git
>>>      a/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0001-support-python-5.9.patch
>>>      b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0001-support-python-5.9.patch
>>>      new file mode 100644
>>>      index 0000000000..f1c4194633
>>>      --- /dev/null
>>>      +++
>>>      b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0001-support-python-5.9.patch
>>>      @@ -0,0 +1,129 @@
>>>      +From d4df52c9442d44adfc492e8e1b682ab638f10c0c Mon Sep 17 00:00:00 2001
>>>      +From: Khem Raj <raj.khem@gmail.com <mailto:raj.khem@gmail.com>>
>>>      +Date: Mon, 4 Jan 2021 19:52:10 -0800
>>>      +Subject: [PATCH 1/2] support python 5.9
>>>
>>>
>>> Subject: [PATCH 1/2] support python 3.9
>>>
>>>      +
>>>      +Imported from
>>>      +
>>>      +https://github.com/archlinux/svntogit-community/commit/9276e06052e89615fe8bf3a30d04f5803ad2e539
>>>      <https://github.com/archlinux/svntogit-community/commit/9276e06052e89615fe8bf3a30d04f5803ad2e539>
>>>      +
>>>      +Signed-off-by: Khem Raj <raj.khem@gmail.com
>>>      <mailto:raj.khem@gmail.com>>
>>>      +---
>>>      + configure                                     |  2 +-
>>>      + src/libs/xpcom18a4/python/Makefile.kmk        | 48 ++++++++++++++++++-
>>>      + src/libs/xpcom18a4/python/gen_python_deps.py  |  2 +-
>>>      + .../xpcom18a4/python/src/module/_xpcom.cpp    |  6 ++-
>>>      + 4 files changed, 54 insertions(+), 4 deletions(-)
>>>      +
>>>      +diff --git a/configure b/configure
>>>      +index 55390478..50f53434 100755
>>>      +--- a/configure
>>>      ++++ b/configure
>>>      +@@ -2028,7 +2028,7 @@ extern "C" int main(void)
>>>      + }
>>>      + EOF
>>>      +   found=
>>>      +-  SUPPYTHONLIBS="python2.7 python2.6 python3.1 python3.2 python3.3
>>>      python3.4 python3.4m python3.5 python3.5m python3.6 python3.6m
>>>      python3.7 python3.7m python3.8 python3.8m"
>>>      ++  SUPPYTHONLIBS="python2.7 python2.6 python3.1 python3.2 python3.3
>>>      python3.4 python3.4m python3.5 python3.5m python3.6 python3.6m
>>>      python3.7 python3.7m python3.8 python3.8m python3.9 python3.9m"
>>>      +   for p in $PYTHONDIR; do
>>>      +     for d in $SUPPYTHONLIBS; do
>>>      +       for b in lib/x86_64-linux-gnu lib/i386-linux-gnu lib64
>>>      lib/64 lib; do
>>>      +diff --git a/src/libs/xpcom18a4/python/Makefile.kmk
>>>      b/src/libs/xpcom18a4/python/Makefile.kmk
>>>      +index f854ea84..afc3d6b3 100644
>>>      +--- a/src/libs/xpcom18a4/python/Makefile.kmk
>>>      ++++ b/src/libs/xpcom18a4/python/Makefile.kmk
>>>      +@@ -26,7 +26,7 @@ endif
>>>      +
>>>      + #
>>>      + # List of supported Python versions, defining a number of
>>>      +-#
>>>      VBOX_PYTHON[26|27|31|32|32M|33|33M|34|34M|35|35M|36|36M|37|37M|38|38M|DEF]_[INC|LIB]
>>>      variables
>>>      ++#
>>>      VBOX_PYTHON[26|27|31|32|32M|33|33M|34|34M|35|35M|36|36M|37|37M|38|38M|39|39M|DEF]_[INC|LIB]
>>>      variables
>>>      + # which get picked up below.
>>>      + #
>>>      + ifeq ($(KBUILD_TARGET),darwin) # Relatively predictable, don't script.
>>>      +@@ -533,6 +533,52 @@ VBoxPython3_8m_x86_LIBS       =
>>>      $(VBOX_PYTHON38M_LIB_X86)
>>>      +  endif
>>>      + endif
>>>      +
>>>      ++ifdef VBOX_PYTHON39_INC
>>>      ++#
>>>      ++# Python 3.9 version
>>>      ++#
>>>      ++DLLS += VBoxPython3_9
>>>      ++VBoxPython3_9_EXTENDS    = VBoxPythonBase
>>>      ++VBoxPython3_9_EXTENDS_BY = appending
>>>      ++VBoxPython3_9_TEMPLATE   = XPCOM
>>>      ++VBoxPython3_9_INCS       = $(VBOX_PYTHON39_INC)
>>>      ++VBoxPython3_9_LIBS       = $(VBOX_PYTHON39_LIB)
>>>      ++
>>>      ++ ifdef VBOX_WITH_32_ON_64_MAIN_API
>>>      ++  ifdef VBOX_PYTHON39_LIB_X86
>>>      ++DLLS += VBoxPython3_9_x86
>>>      ++VBoxPython3_9_x86_EXTENDS    = VBoxPythonBase_x86
>>>      ++VBoxPython3_9_x86_EXTENDS_BY = appending
>>>      ++VBoxPython3_9_x86_TEMPLATE   = XPCOM
>>>      ++VBoxPython3_9_x86_INCS       = $(VBOX_PYTHON39_INC)
>>>      ++VBoxPython3_9_x86_LIBS       = $(VBOX_PYTHON39_LIB_X86)
>>>      ++  endif
>>>      ++ endif
>>>      ++endif
>>>      ++
>>>      ++ifdef VBOX_PYTHON39M_INC
>>>      ++#
>>>      ++# Python 3.9 version with pymalloc
>>>      ++#
>>>      ++DLLS += VBoxPython3_9m
>>>      ++VBoxPython3_9m_EXTENDS    = VBoxPythonBase_m
>>>      ++VBoxPython3_9m_EXTENDS_BY = appending
>>>      ++VBoxPython3_9m_TEMPLATE   = XPCOM
>>>      ++VBoxPython3_9m_INCS       = $(VBOX_PYTHON39M_INC)
>>>      ++VBoxPython3_9m_LIBS       = $(VBOX_PYTHON39M_LIB)
>>>      ++
>>>      ++ ifdef VBOX_WITH_32_ON_64_MAIN_API
>>>      ++  ifdef VBOX_PYTHON39M_LIB_X86
>>>      ++DLLS += VBoxPython3_9m_x86
>>>      ++VBoxPython3_9m_x86_EXTENDS    = VBoxPythonBase_x86_m
>>>      ++VBoxPython3_9m_x86_EXTENDS_BY = appending
>>>      ++VBoxPython3_9m_x86_TEMPLATE_   = XPCOM
>>>      ++VBoxPython3_9m_x86_INCS       = $(VBOX_PYTHON39M_INC)
>>>      ++VBoxPython3_9m_x86_LIBS       = $(VBOX_PYTHON39M_LIB_X86)
>>>      ++  endif
>>>      ++ endif
>>>      ++endif
>>>      ++
>>>      + ifdef VBOX_PYTHONDEF_INC
>>>      + #
>>>      + # Python without versioning
>>>      +diff --git a/src/libs/xpcom18a4/python/gen_python_deps.py
>>>      b/src/libs/xpcom18a4/python/gen_python_deps.py
>>>      +index 848dddf3..b116313a 100755
>>>      +--- a/src/libs/xpcom18a4/python/gen_python_deps.py
>>>      ++++ b/src/libs/xpcom18a4/python/gen_python_deps.py
>>>      +@@ -16,7 +16,7 @@ from __future__ import print_function
>>>      + import os,sys
>>>      + from distutils.version import StrictVersion
>>>      +
>>>      +-versions = ["2.6", "2.7", "3.1", "3.2", "3.2m", "3.3", "3.3m",
>>>      "3.4", "3.4m", "3.5", "3.5m", "3.6", "3.6m", "3.7", "3.7m", "3.8",
>>>      "3.8m" ]
>>>      ++versions = ["2.6", "2.7", "3.1", "3.2", "3.2m", "3.3", "3.3m",
>>>      "3.4", "3.4m", "3.5", "3.5m", "3.6", "3.6m", "3.7", "3.7m", "3.8",
>>>      "3.8m", "3.9", "3.9m" ]
>>>      + prefixes = ["/usr", "/usr/local", "/opt", "/opt/local"]
>>>      + known = {}
>>>      +
>>>      +diff --git a/src/libs/xpcom18a4/python/src/module/_xpcom.cpp
>>>      b/src/libs/xpcom18a4/python/src/module/_xpcom.cpp
>>>      +index d35eb607..93ce03fd 100644
>>>      +--- a/src/libs/xpcom18a4/python/src/module/_xpcom.cpp
>>>      ++++ b/src/libs/xpcom18a4/python/src/module/_xpcom.cpp
>>>      +@@ -84,7 +84,11 @@ extern PYXPCOM_EXPORT void
>>>      PyXPCOM_InterpreterState_Ensure();
>>>      + #  define MANGLE_MODULE_INIT(a_Name)    RT_CONCAT(a_Name,
>>>      MODULE_NAME_SUFFIX)
>>>      + # endif
>>>      + # ifdef VBOX_PYXPCOM_VERSIONED
>>>      +-#  if   PY_VERSION_HEX >= 0x03080000 && PY_VERSION_HEX < 0x03090000
>>>      ++#  if   PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x03100000
>>>      ++#   define MODULE_NAME    MANGLE_MODULE_NAME("VBoxPython3_9")
>>>      ++#   define initVBoxPython MANGLE_MODULE_INIT(PyInit_VBoxPython3_9)
>>>      ++
>>>      ++#  elif   PY_VERSION_HEX >= 0x03080000 && PY_VERSION_HEX < 0x03090000
>>>      + #   define MODULE_NAME    MANGLE_MODULE_NAME("VBoxPython3_8")
>>>      + #   define initVBoxPython MANGLE_MODULE_INIT(PyInit_VBoxPython3_8)
>>>      +
>>>      +--
>>>      +2.30.0
>>>      +
>>>      diff --git
>>>      a/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0002-Backport-5.10-fixes.patch
>>>      b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0002-Backport-5.10-fixes.patch
>>>      new file mode 100644
>>>      index 0000000000..f277ced902
>>>      --- /dev/null
>>>      +++
>>>      b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0002-Backport-5.10-fixes.patch
>>>      @@ -0,0 +1,432 @@
>>>      +From ac018c7fe2215aab028615b2823cc8fba97cf8c2 Mon Sep 17 00:00:00 2001
>>>      +From: Khem Raj <raj.khem@gmail.com <mailto:raj.khem@gmail.com>>
>>>      +Date: Mon, 4 Jan 2021 19:54:52 -0800
>>>      +Subject: [PATCH 2/2] Backport 5.10 fixes
>>>      +
>>>      +Imported from
>>>      +https://raw.githubusercontent.com/archlinux/svntogit-community/packages/virtualbox/trunk/020-linux-5-10.patch
>>>      <https://raw.githubusercontent.com/archlinux/svntogit-community/packages/virtualbox/trunk/020-linux-5-10.patch>
>>>      +
>>>      +Signed-off-by: Khem Raj <raj.khem@gmail.com
>>>      <mailto:raj.khem@gmail.com>>
>>>      +---
>>>      + src/VBox/Additions/linux/drm/vbox_drv.h       | 10 +-
>>>      + src/VBox/Additions/linux/drm/vbox_fb.c        |  2 +-
>>>      + src/VBox/Additions/linux/drm/vbox_mode.c      |  2 +-
>>>      + src/VBox/Additions/linux/drm/vbox_ttm.c       | 99 +++++++++++++++++--
>>>      + .../Additions/linux/sharedfolders/regops.c    |  5 +-
>>>      + .../Runtime/r0drv/linux/memobj-r0drv-linux.c  | 61 +++++++++++-
>>>      + 6 files changed, 163 insertions(+), 16 deletions(-)
>>>      +
>>>      +diff --git a/src/VBox/Additions/linux/drm/vbox_drv.h
>>>      b/src/VBox/Additions/linux/drm/vbox_drv.h
>>>      +index c680f3b4..d21d023c 100644
>>>      +--- a/src/VBox/Additions/linux/drm/vbox_drv.h
>>>      ++++ b/src/VBox/Additions/linux/drm/vbox_drv.h
>>>      +@@ -175,6 +175,9 @@
>>>      + #include <drm/ttm/ttm_placement.h>
>>>      + #include <drm/ttm/ttm_memory.h>
>>>      + #include <drm/ttm/ttm_module.h>
>>>      ++#if RTLNX_VER_MIN(5,10,0)
>>>      ++# include <drm/ttm/ttm_resource.h>
>>>      ++#endif
>>>      +
>>>      + #include "vboxvideo_guest.h"
>>>      + #include "vboxvideo_vbe.h"
>>>      +@@ -444,7 +447,10 @@ int vbox_bo_create(struct drm_device *dev, int
>>>      size, int align,
>>>      + int vbox_gem_create(struct drm_device *dev,
>>>      +                   u32 size, bool iskernel, struct drm_gem_object
>>>      **obj);
>>>      +
>>>      +-int vbox_bo_pin(struct vbox_bo *bo, u32 pl_flag, u64 *gpu_addr);
>>>      ++#define VBOX_MEM_TYPE_VRAM   0x1
>>>      ++#define VBOX_MEM_TYPE_SYSTEM 0x2
>>>      ++
>>>      ++int vbox_bo_pin(struct vbox_bo *bo, u32 mem_type, u64 *gpu_addr);
>>>      + int vbox_bo_unpin(struct vbox_bo *bo);
>>>      +
>>>      + static inline int vbox_bo_reserve(struct vbox_bo *bo, bool no_wait)
>>>      +@@ -469,7 +475,7 @@ static inline void vbox_bo_unreserve(struct
>>>      vbox_bo *bo)
>>>      +       ttm_bo_unreserve(&bo->bo);
>>>      + }
>>>      +
>>>      +-void vbox_ttm_placement(struct vbox_bo *bo, int domain);
>>>      ++void vbox_ttm_placement(struct vbox_bo *bo, u32 mem_type);
>>>      + int vbox_bo_push_sysram(struct vbox_bo *bo);
>>>      + int vbox_mmap(struct file *filp, struct vm_area_struct *vma);
>>>      +
>>>      +diff --git a/src/VBox/Additions/linux/drm/vbox_fb.c
>>>      b/src/VBox/Additions/linux/drm/vbox_fb.c
>>>      +index 811d0040..44b1ef52 100644
>>>      +--- a/src/VBox/Additions/linux/drm/vbox_fb.c
>>>      ++++ b/src/VBox/Additions/linux/drm/vbox_fb.c
>>>      +@@ -295,7 +295,7 @@ static int vboxfb_create(struct drm_fb_helper
>>>      *helper,
>>>      +       if (ret)
>>>      +               return ret;
>>>      +
>>>      +-      ret = vbox_bo_pin(bo, TTM_PL_FLAG_VRAM, NULL);
>>>      ++      ret = vbox_bo_pin(bo, VBOX_MEM_TYPE_VRAM, NULL);
>>>      +       if (ret) {
>>>      +               vbox_bo_unreserve(bo);
>>>      +               return ret;
>>>      +diff --git a/src/VBox/Additions/linux/drm/vbox_mode.c
>>>      b/src/VBox/Additions/linux/drm/vbox_mode.c
>>>      +index 1e2691fd..52fd10fd 100644
>>>      +--- a/src/VBox/Additions/linux/drm/vbox_mode.c
>>>      ++++ b/src/VBox/Additions/linux/drm/vbox_mode.c
>>>      +@@ -227,7 +227,7 @@ static int vbox_crtc_set_base(struct drm_crtc
>>>      *crtc,
>>>      +       if (ret)
>>>      +               return ret;
>>>      +
>>>      +-      ret = vbox_bo_pin(bo, TTM_PL_FLAG_VRAM, &gpu_addr);
>>>      ++      ret = vbox_bo_pin(bo, VBOX_MEM_TYPE_VRAM, &gpu_addr);
>>>      +       vbox_bo_unreserve(bo);
>>>      +       if (ret)
>>>      +               return ret;
>>>      +diff --git a/src/VBox/Additions/linux/drm/vbox_ttm.c
>>>      b/src/VBox/Additions/linux/drm/vbox_ttm.c
>>>      +index 4e990843..ee2da4aa 100644
>>>      +--- a/src/VBox/Additions/linux/drm/vbox_ttm.c
>>>      ++++ b/src/VBox/Additions/linux/drm/vbox_ttm.c
>>>      +@@ -41,6 +41,7 @@
>>>      + #define PLACEMENT_FLAGS(placement) ((placement).flags)
>>>      + #endif
>>>      +
>>>      ++
>>>      + static inline struct vbox_private *vbox_bdev(struct ttm_bo_device *bd)
>>>      + {
>>>      +       return container_of(bd, struct vbox_private, ttm.bdev);
>>>      +@@ -125,6 +126,7 @@ static bool vbox_ttm_bo_is_vbox_bo(struct
>>>      ttm_buffer_object *bo)
>>>      +       return false;
>>>      + }
>>>      +
>>>      ++#if RTLNX_VER_MAX(5,10,0)
>>>      + static int
>>>      + vbox_bo_init_mem_type(struct ttm_bo_device *bdev, u32 type,
>>>      +                     struct ttm_mem_type_manager *man)
>>>      +@@ -148,6 +150,7 @@ vbox_bo_init_mem_type(struct ttm_bo_device
>>>      *bdev, u32 type,
>>>      +
>>>      +       return 0;
>>>      + }
>>>      ++#endif
>>>      +
>>>      + static void
>>>      + vbox_bo_evict_flags(struct ttm_buffer_object *bo, struct
>>>      ttm_placement *pl)
>>>      +@@ -157,7 +160,7 @@ vbox_bo_evict_flags(struct ttm_buffer_object
>>>      *bo, struct ttm_placement *pl)
>>>      +       if (!vbox_ttm_bo_is_vbox_bo(bo))
>>>      +               return;
>>>      +
>>>      +-      vbox_ttm_placement(vboxbo, TTM_PL_FLAG_SYSTEM);
>>>      ++      vbox_ttm_placement(vboxbo, VBOX_MEM_TYPE_SYSTEM);
>>>      +       *pl = vboxbo->placement;
>>>      + }
>>>      +
>>>      +@@ -167,11 +170,12 @@ static int vbox_bo_verify_access(struct
>>>      ttm_buffer_object *bo,
>>>      +       return 0;
>>>      + }
>>>      +
>>>      ++#if RTLNX_VER_MAX(5,10,0)
>>>      + static int vbox_ttm_io_mem_reserve(struct ttm_bo_device *bdev,
>>>      +                                  struct ttm_mem_reg *mem)
>>>      + {
>>>      +-      struct ttm_mem_type_manager *man = &bdev->man[mem->mem_type];
>>>      +       struct vbox_private *vbox = vbox_bdev(bdev);
>>>      ++      struct ttm_mem_type_manager *man = &bdev->man[mem->mem_type];
>>>      +
>>>      +       mem->bus.addr = NULL;
>>>      +       mem->bus.offset = 0;
>>>      +@@ -194,12 +198,53 @@ static int vbox_ttm_io_mem_reserve(struct
>>>      ttm_bo_device *bdev,
>>>      +       }
>>>      +       return 0;
>>>      + }
>>>      ++#else
>>>      ++static int vbox_ttm_io_mem_reserve(struct ttm_bo_device *bdev,
>>>      ++                                 struct ttm_resource *mem)
>>>      ++{
>>>      ++      struct vbox_private *vbox = vbox_bdev(bdev);
>>>      ++      mem->bus.addr = NULL;
>>>      ++      mem->bus.offset = 0;
>>>      ++      mem->size = mem->num_pages << PAGE_SHIFT;
>>>      ++      mem->start = 0;
>>>      ++      mem->bus.is_iomem = false;
>>>      ++      switch (mem->mem_type) {
>>>      ++      case TTM_PL_SYSTEM:
>>>      ++              /* system memory */
>>>      ++              return 0;
>>>      ++      case TTM_PL_VRAM:
>>>      ++              mem->bus.offset = mem->start << PAGE_SHIFT;
>>>      ++              mem->start = pci_resource_start(vbox->dev->pdev, 0);
>>>      ++              mem->bus.is_iomem = true;
>>>      ++              break;
>>>      ++      default:
>>>      ++              return -EINVAL;
>>>      ++      }
>>>      ++      return 0;
>>>      ++}
>>>      ++#endif
>>>      +
>>>      ++
>>>      ++
>>>      ++#if RTLNX_VER_MIN(5,10,0)
>>>      ++static void vbox_ttm_io_mem_free(struct ttm_bo_device *bdev,
>>>      ++                               struct ttm_resource *mem)
>>>      ++{
>>>      ++}
>>>      ++#else
>>>      + static void vbox_ttm_io_mem_free(struct ttm_bo_device *bdev,
>>>      +                                struct ttm_mem_reg *mem)
>>>      + {
>>>      + }
>>>      ++#endif
>>>      +
>>>      ++#if RTLNX_VER_MIN(5,10,0)
>>>      ++static void vbox_ttm_tt_destroy(struct ttm_bo_device *bdev, struct
>>>      ttm_tt *tt)
>>>      ++{
>>>      ++      ttm_tt_fini(tt);
>>>      ++      kfree(tt);
>>>      ++}
>>>      ++#else
>>>      + static void vbox_ttm_backend_destroy(struct ttm_tt *tt)
>>>      + {
>>>      +       ttm_tt_fini(tt);
>>>      +@@ -209,6 +254,7 @@ static void vbox_ttm_backend_destroy(struct
>>>      ttm_tt *tt)
>>>      + static struct ttm_backend_func vbox_tt_backend_func = {
>>>      +       .destroy = &vbox_ttm_backend_destroy,
>>>      + };
>>>      ++#endif
>>>      +
>>>      + #if RTLNX_VER_MAX(4,17,0) && !RTLNX_RHEL_MAJ_PREREQ(7,6) &&
>>>      !RTLNX_SUSE_MAJ_PREREQ(15,1) && !RTLNX_SUSE_MAJ_PREREQ(12,5)
>>>      + static struct ttm_tt *vbox_ttm_tt_create(struct ttm_bo_device *bdev,
>>>      +@@ -226,7 +272,9 @@ static struct ttm_tt *vbox_ttm_tt_create(struct
>>>      ttm_buffer_object *bo,
>>>      +       if (!tt)
>>>      +               return NULL;
>>>      +
>>>      ++#if RTLNX_VER_MAX(5,10,0)
>>>      +       tt->func = &vbox_tt_backend_func;
>>>      ++#endif
>>>      + #if RTLNX_VER_MAX(4,17,0) && !RTLNX_RHEL_MAJ_PREREQ(7,6) &&
>>>      !RTLNX_SUSE_MAJ_PREREQ(15,1) && !RTLNX_SUSE_MAJ_PREREQ(12,5)
>>>      +       if (ttm_tt_init(tt, bdev, size, page_flags, dummy_read_page)) {
>>>      + #else
>>>      +@@ -261,11 +309,16 @@ static void vbox_ttm_tt_unpopulate(struct
>>>      ttm_tt *ttm)
>>>      +
>>>      + static struct ttm_bo_driver vbox_bo_driver = {
>>>      +       .ttm_tt_create = vbox_ttm_tt_create,
>>>      ++#if RTLNX_VER_MIN(5,10,0)
>>>      ++      .ttm_tt_destroy = vbox_ttm_tt_destroy,
>>>      ++#endif
>>>      + #if RTLNX_VER_MAX(4,17,0)
>>>      +       .ttm_tt_populate = vbox_ttm_tt_populate,
>>>      +       .ttm_tt_unpopulate = vbox_ttm_tt_unpopulate,
>>>      + #endif
>>>      ++#if RTLNX_VER_MAX(5,10,0)
>>>      +       .init_mem_type = vbox_bo_init_mem_type,
>>>      ++#endif
>>>      + #if RTLNX_VER_MIN(4,10,0) || RTLNX_RHEL_MAJ_PREREQ(7,4)
>>>      +       .eviction_valuable = ttm_bo_eviction_valuable,
>>>      + #endif
>>>      +@@ -318,8 +371,13 @@ int vbox_mm_init(struct vbox_private *vbox)
>>>      + #endif
>>>      +       }
>>>      +
>>>      ++#if RTLNX_VER_MIN(5,10,0)
>>>      ++      ret = ttm_range_man_init(bdev, TTM_PL_VRAM, false,
>>>      ++                           vbox->available_vram_size >> PAGE_SHIFT);
>>>      ++#else
>>>      +       ret = ttm_bo_init_mm(bdev, TTM_PL_VRAM,
>>>      +                            vbox->available_vram_size >> PAGE_SHIFT);
>>>      ++#endif
>>>      +       if (ret) {
>>>      +               DRM_ERROR("Failed ttm VRAM init: %d\n", ret);
>>>      +               goto err_device_release;
>>>      +@@ -359,7 +417,7 @@ void vbox_mm_fini(struct vbox_private *vbox)
>>>      + #endif
>>>      + }
>>>      +
>>>      +-void vbox_ttm_placement(struct vbox_bo *bo, int domain)
>>>      ++void vbox_ttm_placement(struct vbox_bo *bo, u32 mem_type)
>>>      + {
>>>      +       u32 c = 0;
>>>      + #if RTLNX_VER_MAX(3,18,0) && !RTLNX_RHEL_MAJ_PREREQ(7,2)
>>>      +@@ -372,15 +430,36 @@ void vbox_ttm_placement(struct vbox_bo *bo,
>>>      int domain)
>>>      +       bo->placement.placement = bo->placements;
>>>      +       bo->placement.busy_placement = bo->placements;
>>>      +
>>>      +-      if (domain & TTM_PL_FLAG_VRAM)
>>>      ++      if (mem_type & VBOX_MEM_TYPE_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;
>>>      +-      if (domain & TTM_PL_FLAG_SYSTEM)
>>>      ++#endif
>>>      ++      }
>>>      ++      if (mem_type & VBOX_MEM_TYPE_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;
>>>      +-      if (!c)
>>>      ++#endif
>>>      ++      }
>>>      ++      if (!c) {
>>>      ++#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
>>>      ++      }
>>>      +
>>>      +       bo->placement.num_placement = c;
>>>      +       bo->placement.num_busy_placement = c;
>>>      +@@ -414,7 +493,7 @@ int vbox_bo_create(struct drm_device *dev, int
>>>      size, int align,
>>>      +       vboxbo->bo.bdev->dev_mapping = dev->dev_mapping;
>>>      + #endif
>>>      +
>>>      +-      vbox_ttm_placement(vboxbo, TTM_PL_FLAG_VRAM |
>>>      TTM_PL_FLAG_SYSTEM);
>>>      ++      vbox_ttm_placement(vboxbo, VBOX_MEM_TYPE_VRAM |
>>>      VBOX_MEM_TYPE_SYSTEM);
>>>      +
>>>      +       acc_size = ttm_bo_dma_acc_size(&vbox->ttm.bdev, size,
>>>      +                                      sizeof(struct vbox_bo));
>>>      +@@ -452,7 +531,7 @@ static inline u64 vbox_bo_gpu_offset(struct
>>>      vbox_bo *bo)
>>>      + #endif
>>>      + }
>>>      +
>>>      +-int vbox_bo_pin(struct vbox_bo *bo, u32 pl_flag, u64 *gpu_addr)
>>>      ++int vbox_bo_pin(struct vbox_bo *bo, u32 mem_type, u64 *gpu_addr)
>>>      + {
>>>      + #if RTLNX_VER_MIN(4,16,0) || RTLNX_RHEL_MAJ_PREREQ(7,6) ||
>>>      RTLNX_SUSE_MAJ_PREREQ(15,1) || RTLNX_SUSE_MAJ_PREREQ(12,5)
>>>      +       struct ttm_operation_ctx ctx = { false, false };
>>>      +@@ -467,7 +546,7 @@ int vbox_bo_pin(struct vbox_bo *bo, u32
>>>      pl_flag, u64 *gpu_addr)
>>>      +               return 0;
>>>      +       }
>>>      +
>>>      +-      vbox_ttm_placement(bo, pl_flag);
>>>      ++      vbox_ttm_placement(bo, mem_type);
>>>      +
>>>      +       for (i = 0; i < bo->placement.num_placement; i++)
>>>      +               PLACEMENT_FLAGS(bo->placements[i]) |=
>>>      TTM_PL_FLAG_NO_EVICT;
>>>      +@@ -540,7 +619,7 @@ int vbox_bo_push_sysram(struct vbox_bo *bo)
>>>      +       if (bo->kmap.virtual)
>>>      +               ttm_bo_kunmap(&bo->kmap);
>>>      +
>>>      +-      vbox_ttm_placement(bo, TTM_PL_FLAG_SYSTEM);
>>>      ++      vbox_ttm_placement(bo, VBOX_MEM_TYPE_SYSTEM);
>>>      +
>>>      +       for (i = 0; i < bo->placement.num_placement; i++)
>>>      +               PLACEMENT_FLAGS(bo->placements[i]) |=
>>>      TTM_PL_FLAG_NO_EVICT;
>>>      +diff --git a/src/VBox/Additions/linux/sharedfolders/regops.c
>>>      b/src/VBox/Additions/linux/sharedfolders/regops.c
>>>      +index 3ad9c566..ec298a1b 100644
>>>      +--- a/src/VBox/Additions/linux/sharedfolders/regops.c
>>>      ++++ b/src/VBox/Additions/linux/sharedfolders/regops.c
>>>      +@@ -1401,7 +1401,10 @@ static int
>>>      vbsf_lock_user_pages_failed_check_kernel(uintptr_t uPtrFrom, size_t 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
>>>      +diff --git a/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c
>>>      b/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c
>>>      +index c771c1ba..a34eb149 100644
>>>      +--- a/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c
>>>      ++++ b/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c
>>>      +@@ -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,6 +505,42 @@ static void
>>>      rtR0MemObjLinuxFreePages(PRTR0MEMOBJLNX pMemLnx)
>>>      + }
>>>      +
>>>      +
>>>      ++#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.
>>>      +  *
>>>      +@@ -584,6 +623,11 @@ static int rtR0MemObjLinuxVMap(PRTR0MEMOBJLNX
>>>      pMemLnx, bool fExecutable)
>>>      +         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 @@ DECLHIDDEN(int)
>>>      rtR0MemObjNativeProtect(PRTR0MEMOBJINTERNAL pMem, size_t offSub,
>>>      +         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);
>>>      +--
>>>      +2.30.0
>>>      +
>>>      diff --git
>>>      a/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers_6.1.16.bb <http://vboxguestdrivers_6.1.16.bb>
>>>      b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers_6.1.16.bb <http://vboxguestdrivers_6.1.16.bb>
>>>      index 9282f663b4..fef7ffa954 100644
>>>      ---
>>>      a/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers_6.1.16.bb <http://vboxguestdrivers_6.1.16.bb>
>>>      +++
>>>      b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers_6.1.16.bb <http://vboxguestdrivers_6.1.16.bb>
>>>      @@ -13,6 +13,8 @@ VBOX_NAME = "VirtualBox-${PV}"
>>>
>>>        SRC_URI =
>>>      "http://download.virtualbox.org/virtualbox/${PV}/${VBOX_NAME}.tar.bz2 <http://download.virtualbox.org/virtualbox/$%7BPV%7D/$%7BVBOX_NAME%7D.tar.bz2>
>>>      \
>>>            file://Makefile.utils \
>>>      +    file://0001-support-python-5.9.patch \
>>>
>>>
>>> file://0001-support-python-3.9.patch
>>>
>>>      +    file://0002-Backport-5.10-fixes.patch \
>>>        "
>>>        SRC_URI[md5sum] = "a12a647f6c114f2cb1571089b36841fe"
>>>        SRC_URI[sha256sum] =
>>>      "49c1990da16d8a3d5bda8cdb961ec8195a901e67e4c79aea44c1521a5fc2f9f1"
>>>      --
>>>      2.30.0
>>>
>>>
>>>
>>>
>>>
>>>
>>> --
>>> best regards,
>>> José Quaresma
>>
>> 
>>
> 
> 

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [oe] [meta-oe][PATCH] vboxguestdrivers: Fix build with kernel 5.10
  2021-01-05 17:22       ` Khem Raj
@ 2021-01-06  5:30         ` Khem Raj
  2021-01-06 13:41           ` Bruce Ashfield
  0 siblings, 1 reply; 7+ messages in thread
From: Khem Raj @ 2021-01-06  5:30 UTC (permalink / raw)
  To: Bruce Ashfield; +Cc: Jose Quaresma, openembeded-devel

I have altered your patch a little which makes 32bit builds happy too

http://sprunge.us/jqxsFO

I think this should be ok for us to live with.

On Tue, Jan 5, 2021 at 9:22 AM Khem Raj <raj.khem@gmail.com> wrote:
>
>
>
> On 1/5/21 9:12 AM, Bruce Ashfield wrote:
> > On Tue, Jan 5, 2021 at 12:05 PM Khem Raj <raj.khem@gmail.com> wrote:
> >>
> >>
> >>
> >> On 1/5/21 2:50 AM, Jose Quaresma wrote:
> >>> Hi,
> >>>
> >>> I think there are a typo in python version the patch mention 5.9 instead
> >>> of 3.9
> >>
> >> thanks I will fix it
> >
> > Ha!
> >
> > Sorry about the double send of the fix, I checked the list this
> > morning and somehow managed to miss this!
>
> I think your patch looks better organized so I will pick this one.
>
> >
> > Bruce
> >
> >>
> >>>
> >>> Khem Raj <raj.khem@gmail.com <mailto:raj.khem@gmail.com>> escreveu no
> >>> dia terça, 5/01/2021 à(s) 04:04:
> >>>
> >>>      Signed-off-by: Khem Raj <raj.khem@gmail.com <mailto:raj.khem@gmail.com>>
> >>>      ---
> >>>        .../0001-support-python-5.9.patch             | 129 ++++++
> >>>
> >>>
> >>> .../0001-support-python-3.9.patch
> >>>
> >>>        .../0002-Backport-5.10-fixes.patch            | 432 ++++++++++++++++++
> >>>        .../vboxguestdrivers_6.1.16.bb
> >>>      <http://vboxguestdrivers_6.1.16.bb>                |   2 +
> >>>        3 files changed, 563 insertions(+)
> >>>        create mode 100644
> >>>      meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0001-support-python-5.9.patch
> >>>        create mode 100644
> >>>      meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0002-Backport-5.10-fixes.patch
> >>>
> >>>      diff --git
> >>>      a/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0001-support-python-5.9.patch
> >>>      b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0001-support-python-5.9.patch
> >>>      new file mode 100644
> >>>      index 0000000000..f1c4194633
> >>>      --- /dev/null
> >>>      +++
> >>>      b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0001-support-python-5.9.patch
> >>>      @@ -0,0 +1,129 @@
> >>>      +From d4df52c9442d44adfc492e8e1b682ab638f10c0c Mon Sep 17 00:00:00 2001
> >>>      +From: Khem Raj <raj.khem@gmail.com <mailto:raj.khem@gmail.com>>
> >>>      +Date: Mon, 4 Jan 2021 19:52:10 -0800
> >>>      +Subject: [PATCH 1/2] support python 5.9
> >>>
> >>>
> >>> Subject: [PATCH 1/2] support python 3.9
> >>>
> >>>      +
> >>>      +Imported from
> >>>      +
> >>>      +https://github.com/archlinux/svntogit-community/commit/9276e06052e89615fe8bf3a30d04f5803ad2e539
> >>>      <https://github.com/archlinux/svntogit-community/commit/9276e06052e89615fe8bf3a30d04f5803ad2e539>
> >>>      +
> >>>      +Signed-off-by: Khem Raj <raj.khem@gmail.com
> >>>      <mailto:raj.khem@gmail.com>>
> >>>      +---
> >>>      + configure                                     |  2 +-
> >>>      + src/libs/xpcom18a4/python/Makefile.kmk        | 48 ++++++++++++++++++-
> >>>      + src/libs/xpcom18a4/python/gen_python_deps.py  |  2 +-
> >>>      + .../xpcom18a4/python/src/module/_xpcom.cpp    |  6 ++-
> >>>      + 4 files changed, 54 insertions(+), 4 deletions(-)
> >>>      +
> >>>      +diff --git a/configure b/configure
> >>>      +index 55390478..50f53434 100755
> >>>      +--- a/configure
> >>>      ++++ b/configure
> >>>      +@@ -2028,7 +2028,7 @@ extern "C" int main(void)
> >>>      + }
> >>>      + EOF
> >>>      +   found=
> >>>      +-  SUPPYTHONLIBS="python2.7 python2.6 python3.1 python3.2 python3.3
> >>>      python3.4 python3.4m python3.5 python3.5m python3.6 python3.6m
> >>>      python3.7 python3.7m python3.8 python3.8m"
> >>>      ++  SUPPYTHONLIBS="python2.7 python2.6 python3.1 python3.2 python3.3
> >>>      python3.4 python3.4m python3.5 python3.5m python3.6 python3.6m
> >>>      python3.7 python3.7m python3.8 python3.8m python3.9 python3.9m"
> >>>      +   for p in $PYTHONDIR; do
> >>>      +     for d in $SUPPYTHONLIBS; do
> >>>      +       for b in lib/x86_64-linux-gnu lib/i386-linux-gnu lib64
> >>>      lib/64 lib; do
> >>>      +diff --git a/src/libs/xpcom18a4/python/Makefile.kmk
> >>>      b/src/libs/xpcom18a4/python/Makefile.kmk
> >>>      +index f854ea84..afc3d6b3 100644
> >>>      +--- a/src/libs/xpcom18a4/python/Makefile.kmk
> >>>      ++++ b/src/libs/xpcom18a4/python/Makefile.kmk
> >>>      +@@ -26,7 +26,7 @@ endif
> >>>      +
> >>>      + #
> >>>      + # List of supported Python versions, defining a number of
> >>>      +-#
> >>>      VBOX_PYTHON[26|27|31|32|32M|33|33M|34|34M|35|35M|36|36M|37|37M|38|38M|DEF]_[INC|LIB]
> >>>      variables
> >>>      ++#
> >>>      VBOX_PYTHON[26|27|31|32|32M|33|33M|34|34M|35|35M|36|36M|37|37M|38|38M|39|39M|DEF]_[INC|LIB]
> >>>      variables
> >>>      + # which get picked up below.
> >>>      + #
> >>>      + ifeq ($(KBUILD_TARGET),darwin) # Relatively predictable, don't script.
> >>>      +@@ -533,6 +533,52 @@ VBoxPython3_8m_x86_LIBS       =
> >>>      $(VBOX_PYTHON38M_LIB_X86)
> >>>      +  endif
> >>>      + endif
> >>>      +
> >>>      ++ifdef VBOX_PYTHON39_INC
> >>>      ++#
> >>>      ++# Python 3.9 version
> >>>      ++#
> >>>      ++DLLS += VBoxPython3_9
> >>>      ++VBoxPython3_9_EXTENDS    = VBoxPythonBase
> >>>      ++VBoxPython3_9_EXTENDS_BY = appending
> >>>      ++VBoxPython3_9_TEMPLATE   = XPCOM
> >>>      ++VBoxPython3_9_INCS       = $(VBOX_PYTHON39_INC)
> >>>      ++VBoxPython3_9_LIBS       = $(VBOX_PYTHON39_LIB)
> >>>      ++
> >>>      ++ ifdef VBOX_WITH_32_ON_64_MAIN_API
> >>>      ++  ifdef VBOX_PYTHON39_LIB_X86
> >>>      ++DLLS += VBoxPython3_9_x86
> >>>      ++VBoxPython3_9_x86_EXTENDS    = VBoxPythonBase_x86
> >>>      ++VBoxPython3_9_x86_EXTENDS_BY = appending
> >>>      ++VBoxPython3_9_x86_TEMPLATE   = XPCOM
> >>>      ++VBoxPython3_9_x86_INCS       = $(VBOX_PYTHON39_INC)
> >>>      ++VBoxPython3_9_x86_LIBS       = $(VBOX_PYTHON39_LIB_X86)
> >>>      ++  endif
> >>>      ++ endif
> >>>      ++endif
> >>>      ++
> >>>      ++ifdef VBOX_PYTHON39M_INC
> >>>      ++#
> >>>      ++# Python 3.9 version with pymalloc
> >>>      ++#
> >>>      ++DLLS += VBoxPython3_9m
> >>>      ++VBoxPython3_9m_EXTENDS    = VBoxPythonBase_m
> >>>      ++VBoxPython3_9m_EXTENDS_BY = appending
> >>>      ++VBoxPython3_9m_TEMPLATE   = XPCOM
> >>>      ++VBoxPython3_9m_INCS       = $(VBOX_PYTHON39M_INC)
> >>>      ++VBoxPython3_9m_LIBS       = $(VBOX_PYTHON39M_LIB)
> >>>      ++
> >>>      ++ ifdef VBOX_WITH_32_ON_64_MAIN_API
> >>>      ++  ifdef VBOX_PYTHON39M_LIB_X86
> >>>      ++DLLS += VBoxPython3_9m_x86
> >>>      ++VBoxPython3_9m_x86_EXTENDS    = VBoxPythonBase_x86_m
> >>>      ++VBoxPython3_9m_x86_EXTENDS_BY = appending
> >>>      ++VBoxPython3_9m_x86_TEMPLATE_   = XPCOM
> >>>      ++VBoxPython3_9m_x86_INCS       = $(VBOX_PYTHON39M_INC)
> >>>      ++VBoxPython3_9m_x86_LIBS       = $(VBOX_PYTHON39M_LIB_X86)
> >>>      ++  endif
> >>>      ++ endif
> >>>      ++endif
> >>>      ++
> >>>      + ifdef VBOX_PYTHONDEF_INC
> >>>      + #
> >>>      + # Python without versioning
> >>>      +diff --git a/src/libs/xpcom18a4/python/gen_python_deps.py
> >>>      b/src/libs/xpcom18a4/python/gen_python_deps.py
> >>>      +index 848dddf3..b116313a 100755
> >>>      +--- a/src/libs/xpcom18a4/python/gen_python_deps.py
> >>>      ++++ b/src/libs/xpcom18a4/python/gen_python_deps.py
> >>>      +@@ -16,7 +16,7 @@ from __future__ import print_function
> >>>      + import os,sys
> >>>      + from distutils.version import StrictVersion
> >>>      +
> >>>      +-versions = ["2.6", "2.7", "3.1", "3.2", "3.2m", "3.3", "3.3m",
> >>>      "3.4", "3.4m", "3.5", "3.5m", "3.6", "3.6m", "3.7", "3.7m", "3.8",
> >>>      "3.8m" ]
> >>>      ++versions = ["2.6", "2.7", "3.1", "3.2", "3.2m", "3.3", "3.3m",
> >>>      "3.4", "3.4m", "3.5", "3.5m", "3.6", "3.6m", "3.7", "3.7m", "3.8",
> >>>      "3.8m", "3.9", "3.9m" ]
> >>>      + prefixes = ["/usr", "/usr/local", "/opt", "/opt/local"]
> >>>      + known = {}
> >>>      +
> >>>      +diff --git a/src/libs/xpcom18a4/python/src/module/_xpcom.cpp
> >>>      b/src/libs/xpcom18a4/python/src/module/_xpcom.cpp
> >>>      +index d35eb607..93ce03fd 100644
> >>>      +--- a/src/libs/xpcom18a4/python/src/module/_xpcom.cpp
> >>>      ++++ b/src/libs/xpcom18a4/python/src/module/_xpcom.cpp
> >>>      +@@ -84,7 +84,11 @@ extern PYXPCOM_EXPORT void
> >>>      PyXPCOM_InterpreterState_Ensure();
> >>>      + #  define MANGLE_MODULE_INIT(a_Name)    RT_CONCAT(a_Name,
> >>>      MODULE_NAME_SUFFIX)
> >>>      + # endif
> >>>      + # ifdef VBOX_PYXPCOM_VERSIONED
> >>>      +-#  if   PY_VERSION_HEX >= 0x03080000 && PY_VERSION_HEX < 0x03090000
> >>>      ++#  if   PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x03100000
> >>>      ++#   define MODULE_NAME    MANGLE_MODULE_NAME("VBoxPython3_9")
> >>>      ++#   define initVBoxPython MANGLE_MODULE_INIT(PyInit_VBoxPython3_9)
> >>>      ++
> >>>      ++#  elif   PY_VERSION_HEX >= 0x03080000 && PY_VERSION_HEX < 0x03090000
> >>>      + #   define MODULE_NAME    MANGLE_MODULE_NAME("VBoxPython3_8")
> >>>      + #   define initVBoxPython MANGLE_MODULE_INIT(PyInit_VBoxPython3_8)
> >>>      +
> >>>      +--
> >>>      +2.30.0
> >>>      +
> >>>      diff --git
> >>>      a/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0002-Backport-5.10-fixes.patch
> >>>      b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0002-Backport-5.10-fixes.patch
> >>>      new file mode 100644
> >>>      index 0000000000..f277ced902
> >>>      --- /dev/null
> >>>      +++
> >>>      b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0002-Backport-5.10-fixes.patch
> >>>      @@ -0,0 +1,432 @@
> >>>      +From ac018c7fe2215aab028615b2823cc8fba97cf8c2 Mon Sep 17 00:00:00 2001
> >>>      +From: Khem Raj <raj.khem@gmail.com <mailto:raj.khem@gmail.com>>
> >>>      +Date: Mon, 4 Jan 2021 19:54:52 -0800
> >>>      +Subject: [PATCH 2/2] Backport 5.10 fixes
> >>>      +
> >>>      +Imported from
> >>>      +https://raw.githubusercontent.com/archlinux/svntogit-community/packages/virtualbox/trunk/020-linux-5-10.patch
> >>>      <https://raw.githubusercontent.com/archlinux/svntogit-community/packages/virtualbox/trunk/020-linux-5-10.patch>
> >>>      +
> >>>      +Signed-off-by: Khem Raj <raj.khem@gmail.com
> >>>      <mailto:raj.khem@gmail.com>>
> >>>      +---
> >>>      + src/VBox/Additions/linux/drm/vbox_drv.h       | 10 +-
> >>>      + src/VBox/Additions/linux/drm/vbox_fb.c        |  2 +-
> >>>      + src/VBox/Additions/linux/drm/vbox_mode.c      |  2 +-
> >>>      + src/VBox/Additions/linux/drm/vbox_ttm.c       | 99 +++++++++++++++++--
> >>>      + .../Additions/linux/sharedfolders/regops.c    |  5 +-
> >>>      + .../Runtime/r0drv/linux/memobj-r0drv-linux.c  | 61 +++++++++++-
> >>>      + 6 files changed, 163 insertions(+), 16 deletions(-)
> >>>      +
> >>>      +diff --git a/src/VBox/Additions/linux/drm/vbox_drv.h
> >>>      b/src/VBox/Additions/linux/drm/vbox_drv.h
> >>>      +index c680f3b4..d21d023c 100644
> >>>      +--- a/src/VBox/Additions/linux/drm/vbox_drv.h
> >>>      ++++ b/src/VBox/Additions/linux/drm/vbox_drv.h
> >>>      +@@ -175,6 +175,9 @@
> >>>      + #include <drm/ttm/ttm_placement.h>
> >>>      + #include <drm/ttm/ttm_memory.h>
> >>>      + #include <drm/ttm/ttm_module.h>
> >>>      ++#if RTLNX_VER_MIN(5,10,0)
> >>>      ++# include <drm/ttm/ttm_resource.h>
> >>>      ++#endif
> >>>      +
> >>>      + #include "vboxvideo_guest.h"
> >>>      + #include "vboxvideo_vbe.h"
> >>>      +@@ -444,7 +447,10 @@ int vbox_bo_create(struct drm_device *dev, int
> >>>      size, int align,
> >>>      + int vbox_gem_create(struct drm_device *dev,
> >>>      +                   u32 size, bool iskernel, struct drm_gem_object
> >>>      **obj);
> >>>      +
> >>>      +-int vbox_bo_pin(struct vbox_bo *bo, u32 pl_flag, u64 *gpu_addr);
> >>>      ++#define VBOX_MEM_TYPE_VRAM   0x1
> >>>      ++#define VBOX_MEM_TYPE_SYSTEM 0x2
> >>>      ++
> >>>      ++int vbox_bo_pin(struct vbox_bo *bo, u32 mem_type, u64 *gpu_addr);
> >>>      + int vbox_bo_unpin(struct vbox_bo *bo);
> >>>      +
> >>>      + static inline int vbox_bo_reserve(struct vbox_bo *bo, bool no_wait)
> >>>      +@@ -469,7 +475,7 @@ static inline void vbox_bo_unreserve(struct
> >>>      vbox_bo *bo)
> >>>      +       ttm_bo_unreserve(&bo->bo);
> >>>      + }
> >>>      +
> >>>      +-void vbox_ttm_placement(struct vbox_bo *bo, int domain);
> >>>      ++void vbox_ttm_placement(struct vbox_bo *bo, u32 mem_type);
> >>>      + int vbox_bo_push_sysram(struct vbox_bo *bo);
> >>>      + int vbox_mmap(struct file *filp, struct vm_area_struct *vma);
> >>>      +
> >>>      +diff --git a/src/VBox/Additions/linux/drm/vbox_fb.c
> >>>      b/src/VBox/Additions/linux/drm/vbox_fb.c
> >>>      +index 811d0040..44b1ef52 100644
> >>>      +--- a/src/VBox/Additions/linux/drm/vbox_fb.c
> >>>      ++++ b/src/VBox/Additions/linux/drm/vbox_fb.c
> >>>      +@@ -295,7 +295,7 @@ static int vboxfb_create(struct drm_fb_helper
> >>>      *helper,
> >>>      +       if (ret)
> >>>      +               return ret;
> >>>      +
> >>>      +-      ret = vbox_bo_pin(bo, TTM_PL_FLAG_VRAM, NULL);
> >>>      ++      ret = vbox_bo_pin(bo, VBOX_MEM_TYPE_VRAM, NULL);
> >>>      +       if (ret) {
> >>>      +               vbox_bo_unreserve(bo);
> >>>      +               return ret;
> >>>      +diff --git a/src/VBox/Additions/linux/drm/vbox_mode.c
> >>>      b/src/VBox/Additions/linux/drm/vbox_mode.c
> >>>      +index 1e2691fd..52fd10fd 100644
> >>>      +--- a/src/VBox/Additions/linux/drm/vbox_mode.c
> >>>      ++++ b/src/VBox/Additions/linux/drm/vbox_mode.c
> >>>      +@@ -227,7 +227,7 @@ static int vbox_crtc_set_base(struct drm_crtc
> >>>      *crtc,
> >>>      +       if (ret)
> >>>      +               return ret;
> >>>      +
> >>>      +-      ret = vbox_bo_pin(bo, TTM_PL_FLAG_VRAM, &gpu_addr);
> >>>      ++      ret = vbox_bo_pin(bo, VBOX_MEM_TYPE_VRAM, &gpu_addr);
> >>>      +       vbox_bo_unreserve(bo);
> >>>      +       if (ret)
> >>>      +               return ret;
> >>>      +diff --git a/src/VBox/Additions/linux/drm/vbox_ttm.c
> >>>      b/src/VBox/Additions/linux/drm/vbox_ttm.c
> >>>      +index 4e990843..ee2da4aa 100644
> >>>      +--- a/src/VBox/Additions/linux/drm/vbox_ttm.c
> >>>      ++++ b/src/VBox/Additions/linux/drm/vbox_ttm.c
> >>>      +@@ -41,6 +41,7 @@
> >>>      + #define PLACEMENT_FLAGS(placement) ((placement).flags)
> >>>      + #endif
> >>>      +
> >>>      ++
> >>>      + static inline struct vbox_private *vbox_bdev(struct ttm_bo_device *bd)
> >>>      + {
> >>>      +       return container_of(bd, struct vbox_private, ttm.bdev);
> >>>      +@@ -125,6 +126,7 @@ static bool vbox_ttm_bo_is_vbox_bo(struct
> >>>      ttm_buffer_object *bo)
> >>>      +       return false;
> >>>      + }
> >>>      +
> >>>      ++#if RTLNX_VER_MAX(5,10,0)
> >>>      + static int
> >>>      + vbox_bo_init_mem_type(struct ttm_bo_device *bdev, u32 type,
> >>>      +                     struct ttm_mem_type_manager *man)
> >>>      +@@ -148,6 +150,7 @@ vbox_bo_init_mem_type(struct ttm_bo_device
> >>>      *bdev, u32 type,
> >>>      +
> >>>      +       return 0;
> >>>      + }
> >>>      ++#endif
> >>>      +
> >>>      + static void
> >>>      + vbox_bo_evict_flags(struct ttm_buffer_object *bo, struct
> >>>      ttm_placement *pl)
> >>>      +@@ -157,7 +160,7 @@ vbox_bo_evict_flags(struct ttm_buffer_object
> >>>      *bo, struct ttm_placement *pl)
> >>>      +       if (!vbox_ttm_bo_is_vbox_bo(bo))
> >>>      +               return;
> >>>      +
> >>>      +-      vbox_ttm_placement(vboxbo, TTM_PL_FLAG_SYSTEM);
> >>>      ++      vbox_ttm_placement(vboxbo, VBOX_MEM_TYPE_SYSTEM);
> >>>      +       *pl = vboxbo->placement;
> >>>      + }
> >>>      +
> >>>      +@@ -167,11 +170,12 @@ static int vbox_bo_verify_access(struct
> >>>      ttm_buffer_object *bo,
> >>>      +       return 0;
> >>>      + }
> >>>      +
> >>>      ++#if RTLNX_VER_MAX(5,10,0)
> >>>      + static int vbox_ttm_io_mem_reserve(struct ttm_bo_device *bdev,
> >>>      +                                  struct ttm_mem_reg *mem)
> >>>      + {
> >>>      +-      struct ttm_mem_type_manager *man = &bdev->man[mem->mem_type];
> >>>      +       struct vbox_private *vbox = vbox_bdev(bdev);
> >>>      ++      struct ttm_mem_type_manager *man = &bdev->man[mem->mem_type];
> >>>      +
> >>>      +       mem->bus.addr = NULL;
> >>>      +       mem->bus.offset = 0;
> >>>      +@@ -194,12 +198,53 @@ static int vbox_ttm_io_mem_reserve(struct
> >>>      ttm_bo_device *bdev,
> >>>      +       }
> >>>      +       return 0;
> >>>      + }
> >>>      ++#else
> >>>      ++static int vbox_ttm_io_mem_reserve(struct ttm_bo_device *bdev,
> >>>      ++                                 struct ttm_resource *mem)
> >>>      ++{
> >>>      ++      struct vbox_private *vbox = vbox_bdev(bdev);
> >>>      ++      mem->bus.addr = NULL;
> >>>      ++      mem->bus.offset = 0;
> >>>      ++      mem->size = mem->num_pages << PAGE_SHIFT;
> >>>      ++      mem->start = 0;
> >>>      ++      mem->bus.is_iomem = false;
> >>>      ++      switch (mem->mem_type) {
> >>>      ++      case TTM_PL_SYSTEM:
> >>>      ++              /* system memory */
> >>>      ++              return 0;
> >>>      ++      case TTM_PL_VRAM:
> >>>      ++              mem->bus.offset = mem->start << PAGE_SHIFT;
> >>>      ++              mem->start = pci_resource_start(vbox->dev->pdev, 0);
> >>>      ++              mem->bus.is_iomem = true;
> >>>      ++              break;
> >>>      ++      default:
> >>>      ++              return -EINVAL;
> >>>      ++      }
> >>>      ++      return 0;
> >>>      ++}
> >>>      ++#endif
> >>>      +
> >>>      ++
> >>>      ++
> >>>      ++#if RTLNX_VER_MIN(5,10,0)
> >>>      ++static void vbox_ttm_io_mem_free(struct ttm_bo_device *bdev,
> >>>      ++                               struct ttm_resource *mem)
> >>>      ++{
> >>>      ++}
> >>>      ++#else
> >>>      + static void vbox_ttm_io_mem_free(struct ttm_bo_device *bdev,
> >>>      +                                struct ttm_mem_reg *mem)
> >>>      + {
> >>>      + }
> >>>      ++#endif
> >>>      +
> >>>      ++#if RTLNX_VER_MIN(5,10,0)
> >>>      ++static void vbox_ttm_tt_destroy(struct ttm_bo_device *bdev, struct
> >>>      ttm_tt *tt)
> >>>      ++{
> >>>      ++      ttm_tt_fini(tt);
> >>>      ++      kfree(tt);
> >>>      ++}
> >>>      ++#else
> >>>      + static void vbox_ttm_backend_destroy(struct ttm_tt *tt)
> >>>      + {
> >>>      +       ttm_tt_fini(tt);
> >>>      +@@ -209,6 +254,7 @@ static void vbox_ttm_backend_destroy(struct
> >>>      ttm_tt *tt)
> >>>      + static struct ttm_backend_func vbox_tt_backend_func = {
> >>>      +       .destroy = &vbox_ttm_backend_destroy,
> >>>      + };
> >>>      ++#endif
> >>>      +
> >>>      + #if RTLNX_VER_MAX(4,17,0) && !RTLNX_RHEL_MAJ_PREREQ(7,6) &&
> >>>      !RTLNX_SUSE_MAJ_PREREQ(15,1) && !RTLNX_SUSE_MAJ_PREREQ(12,5)
> >>>      + static struct ttm_tt *vbox_ttm_tt_create(struct ttm_bo_device *bdev,
> >>>      +@@ -226,7 +272,9 @@ static struct ttm_tt *vbox_ttm_tt_create(struct
> >>>      ttm_buffer_object *bo,
> >>>      +       if (!tt)
> >>>      +               return NULL;
> >>>      +
> >>>      ++#if RTLNX_VER_MAX(5,10,0)
> >>>      +       tt->func = &vbox_tt_backend_func;
> >>>      ++#endif
> >>>      + #if RTLNX_VER_MAX(4,17,0) && !RTLNX_RHEL_MAJ_PREREQ(7,6) &&
> >>>      !RTLNX_SUSE_MAJ_PREREQ(15,1) && !RTLNX_SUSE_MAJ_PREREQ(12,5)
> >>>      +       if (ttm_tt_init(tt, bdev, size, page_flags, dummy_read_page)) {
> >>>      + #else
> >>>      +@@ -261,11 +309,16 @@ static void vbox_ttm_tt_unpopulate(struct
> >>>      ttm_tt *ttm)
> >>>      +
> >>>      + static struct ttm_bo_driver vbox_bo_driver = {
> >>>      +       .ttm_tt_create = vbox_ttm_tt_create,
> >>>      ++#if RTLNX_VER_MIN(5,10,0)
> >>>      ++      .ttm_tt_destroy = vbox_ttm_tt_destroy,
> >>>      ++#endif
> >>>      + #if RTLNX_VER_MAX(4,17,0)
> >>>      +       .ttm_tt_populate = vbox_ttm_tt_populate,
> >>>      +       .ttm_tt_unpopulate = vbox_ttm_tt_unpopulate,
> >>>      + #endif
> >>>      ++#if RTLNX_VER_MAX(5,10,0)
> >>>      +       .init_mem_type = vbox_bo_init_mem_type,
> >>>      ++#endif
> >>>      + #if RTLNX_VER_MIN(4,10,0) || RTLNX_RHEL_MAJ_PREREQ(7,4)
> >>>      +       .eviction_valuable = ttm_bo_eviction_valuable,
> >>>      + #endif
> >>>      +@@ -318,8 +371,13 @@ int vbox_mm_init(struct vbox_private *vbox)
> >>>      + #endif
> >>>      +       }
> >>>      +
> >>>      ++#if RTLNX_VER_MIN(5,10,0)
> >>>      ++      ret = ttm_range_man_init(bdev, TTM_PL_VRAM, false,
> >>>      ++                           vbox->available_vram_size >> PAGE_SHIFT);
> >>>      ++#else
> >>>      +       ret = ttm_bo_init_mm(bdev, TTM_PL_VRAM,
> >>>      +                            vbox->available_vram_size >> PAGE_SHIFT);
> >>>      ++#endif
> >>>      +       if (ret) {
> >>>      +               DRM_ERROR("Failed ttm VRAM init: %d\n", ret);
> >>>      +               goto err_device_release;
> >>>      +@@ -359,7 +417,7 @@ void vbox_mm_fini(struct vbox_private *vbox)
> >>>      + #endif
> >>>      + }
> >>>      +
> >>>      +-void vbox_ttm_placement(struct vbox_bo *bo, int domain)
> >>>      ++void vbox_ttm_placement(struct vbox_bo *bo, u32 mem_type)
> >>>      + {
> >>>      +       u32 c = 0;
> >>>      + #if RTLNX_VER_MAX(3,18,0) && !RTLNX_RHEL_MAJ_PREREQ(7,2)
> >>>      +@@ -372,15 +430,36 @@ void vbox_ttm_placement(struct vbox_bo *bo,
> >>>      int domain)
> >>>      +       bo->placement.placement = bo->placements;
> >>>      +       bo->placement.busy_placement = bo->placements;
> >>>      +
> >>>      +-      if (domain & TTM_PL_FLAG_VRAM)
> >>>      ++      if (mem_type & VBOX_MEM_TYPE_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;
> >>>      +-      if (domain & TTM_PL_FLAG_SYSTEM)
> >>>      ++#endif
> >>>      ++      }
> >>>      ++      if (mem_type & VBOX_MEM_TYPE_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;
> >>>      +-      if (!c)
> >>>      ++#endif
> >>>      ++      }
> >>>      ++      if (!c) {
> >>>      ++#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
> >>>      ++      }
> >>>      +
> >>>      +       bo->placement.num_placement = c;
> >>>      +       bo->placement.num_busy_placement = c;
> >>>      +@@ -414,7 +493,7 @@ int vbox_bo_create(struct drm_device *dev, int
> >>>      size, int align,
> >>>      +       vboxbo->bo.bdev->dev_mapping = dev->dev_mapping;
> >>>      + #endif
> >>>      +
> >>>      +-      vbox_ttm_placement(vboxbo, TTM_PL_FLAG_VRAM |
> >>>      TTM_PL_FLAG_SYSTEM);
> >>>      ++      vbox_ttm_placement(vboxbo, VBOX_MEM_TYPE_VRAM |
> >>>      VBOX_MEM_TYPE_SYSTEM);
> >>>      +
> >>>      +       acc_size = ttm_bo_dma_acc_size(&vbox->ttm.bdev, size,
> >>>      +                                      sizeof(struct vbox_bo));
> >>>      +@@ -452,7 +531,7 @@ static inline u64 vbox_bo_gpu_offset(struct
> >>>      vbox_bo *bo)
> >>>      + #endif
> >>>      + }
> >>>      +
> >>>      +-int vbox_bo_pin(struct vbox_bo *bo, u32 pl_flag, u64 *gpu_addr)
> >>>      ++int vbox_bo_pin(struct vbox_bo *bo, u32 mem_type, u64 *gpu_addr)
> >>>      + {
> >>>      + #if RTLNX_VER_MIN(4,16,0) || RTLNX_RHEL_MAJ_PREREQ(7,6) ||
> >>>      RTLNX_SUSE_MAJ_PREREQ(15,1) || RTLNX_SUSE_MAJ_PREREQ(12,5)
> >>>      +       struct ttm_operation_ctx ctx = { false, false };
> >>>      +@@ -467,7 +546,7 @@ int vbox_bo_pin(struct vbox_bo *bo, u32
> >>>      pl_flag, u64 *gpu_addr)
> >>>      +               return 0;
> >>>      +       }
> >>>      +
> >>>      +-      vbox_ttm_placement(bo, pl_flag);
> >>>      ++      vbox_ttm_placement(bo, mem_type);
> >>>      +
> >>>      +       for (i = 0; i < bo->placement.num_placement; i++)
> >>>      +               PLACEMENT_FLAGS(bo->placements[i]) |=
> >>>      TTM_PL_FLAG_NO_EVICT;
> >>>      +@@ -540,7 +619,7 @@ int vbox_bo_push_sysram(struct vbox_bo *bo)
> >>>      +       if (bo->kmap.virtual)
> >>>      +               ttm_bo_kunmap(&bo->kmap);
> >>>      +
> >>>      +-      vbox_ttm_placement(bo, TTM_PL_FLAG_SYSTEM);
> >>>      ++      vbox_ttm_placement(bo, VBOX_MEM_TYPE_SYSTEM);
> >>>      +
> >>>      +       for (i = 0; i < bo->placement.num_placement; i++)
> >>>      +               PLACEMENT_FLAGS(bo->placements[i]) |=
> >>>      TTM_PL_FLAG_NO_EVICT;
> >>>      +diff --git a/src/VBox/Additions/linux/sharedfolders/regops.c
> >>>      b/src/VBox/Additions/linux/sharedfolders/regops.c
> >>>      +index 3ad9c566..ec298a1b 100644
> >>>      +--- a/src/VBox/Additions/linux/sharedfolders/regops.c
> >>>      ++++ b/src/VBox/Additions/linux/sharedfolders/regops.c
> >>>      +@@ -1401,7 +1401,10 @@ static int
> >>>      vbsf_lock_user_pages_failed_check_kernel(uintptr_t uPtrFrom, size_t 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
> >>>      +diff --git a/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c
> >>>      b/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c
> >>>      +index c771c1ba..a34eb149 100644
> >>>      +--- a/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c
> >>>      ++++ b/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c
> >>>      +@@ -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,6 +505,42 @@ static void
> >>>      rtR0MemObjLinuxFreePages(PRTR0MEMOBJLNX pMemLnx)
> >>>      + }
> >>>      +
> >>>      +
> >>>      ++#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.
> >>>      +  *
> >>>      +@@ -584,6 +623,11 @@ static int rtR0MemObjLinuxVMap(PRTR0MEMOBJLNX
> >>>      pMemLnx, bool fExecutable)
> >>>      +         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 @@ DECLHIDDEN(int)
> >>>      rtR0MemObjNativeProtect(PRTR0MEMOBJINTERNAL pMem, size_t offSub,
> >>>      +         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);
> >>>      +--
> >>>      +2.30.0
> >>>      +
> >>>      diff --git
> >>>      a/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers_6.1.16.bb <http://vboxguestdrivers_6.1.16.bb>
> >>>      b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers_6.1.16.bb <http://vboxguestdrivers_6.1.16.bb>
> >>>      index 9282f663b4..fef7ffa954 100644
> >>>      ---
> >>>      a/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers_6.1.16.bb <http://vboxguestdrivers_6.1.16.bb>
> >>>      +++
> >>>      b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers_6.1.16.bb <http://vboxguestdrivers_6.1.16.bb>
> >>>      @@ -13,6 +13,8 @@ VBOX_NAME = "VirtualBox-${PV}"
> >>>
> >>>        SRC_URI =
> >>>      "http://download.virtualbox.org/virtualbox/${PV}/${VBOX_NAME}.tar.bz2 <http://download.virtualbox.org/virtualbox/$%7BPV%7D/$%7BVBOX_NAME%7D.tar.bz2>
> >>>      \
> >>>            file://Makefile.utils \
> >>>      +    file://0001-support-python-5.9.patch \
> >>>
> >>>
> >>> file://0001-support-python-3.9.patch
> >>>
> >>>      +    file://0002-Backport-5.10-fixes.patch \
> >>>        "
> >>>        SRC_URI[md5sum] = "a12a647f6c114f2cb1571089b36841fe"
> >>>        SRC_URI[sha256sum] =
> >>>      "49c1990da16d8a3d5bda8cdb961ec8195a901e67e4c79aea44c1521a5fc2f9f1"
> >>>      --
> >>>      2.30.0
> >>>
> >>>
> >>>
> >>>
> >>>
> >>>
> >>> --
> >>> best regards,
> >>> José Quaresma
> >>
> >> 
> >>
> >
> >

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [oe] [meta-oe][PATCH] vboxguestdrivers: Fix build with kernel 5.10
  2021-01-06  5:30         ` Khem Raj
@ 2021-01-06 13:41           ` Bruce Ashfield
  0 siblings, 0 replies; 7+ messages in thread
From: Bruce Ashfield @ 2021-01-06 13:41 UTC (permalink / raw)
  To: Khem Raj; +Cc: Jose Quaresma, openembeded-devel

On Wed, Jan 6, 2021 at 12:30 AM Khem Raj <raj.khem@gmail.com> wrote:
>
> I have altered your patch a little which makes 32bit builds happy too
>
> http://sprunge.us/jqxsFO
>
> I think this should be ok for us to live with.

Yup. No concerns here.

Bruce

>
> On Tue, Jan 5, 2021 at 9:22 AM Khem Raj <raj.khem@gmail.com> wrote:
> >
> >
> >
> > On 1/5/21 9:12 AM, Bruce Ashfield wrote:
> > > On Tue, Jan 5, 2021 at 12:05 PM Khem Raj <raj.khem@gmail.com> wrote:
> > >>
> > >>
> > >>
> > >> On 1/5/21 2:50 AM, Jose Quaresma wrote:
> > >>> Hi,
> > >>>
> > >>> I think there are a typo in python version the patch mention 5.9 instead
> > >>> of 3.9
> > >>
> > >> thanks I will fix it
> > >
> > > Ha!
> > >
> > > Sorry about the double send of the fix, I checked the list this
> > > morning and somehow managed to miss this!
> >
> > I think your patch looks better organized so I will pick this one.
> >
> > >
> > > Bruce
> > >
> > >>
> > >>>
> > >>> Khem Raj <raj.khem@gmail.com <mailto:raj.khem@gmail.com>> escreveu no
> > >>> dia terça, 5/01/2021 à(s) 04:04:
> > >>>
> > >>>      Signed-off-by: Khem Raj <raj.khem@gmail.com <mailto:raj.khem@gmail.com>>
> > >>>      ---
> > >>>        .../0001-support-python-5.9.patch             | 129 ++++++
> > >>>
> > >>>
> > >>> .../0001-support-python-3.9.patch
> > >>>
> > >>>        .../0002-Backport-5.10-fixes.patch            | 432 ++++++++++++++++++
> > >>>        .../vboxguestdrivers_6.1.16.bb
> > >>>      <http://vboxguestdrivers_6.1.16.bb>                |   2 +
> > >>>        3 files changed, 563 insertions(+)
> > >>>        create mode 100644
> > >>>      meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0001-support-python-5.9.patch
> > >>>        create mode 100644
> > >>>      meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0002-Backport-5.10-fixes.patch
> > >>>
> > >>>      diff --git
> > >>>      a/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0001-support-python-5.9.patch
> > >>>      b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0001-support-python-5.9.patch
> > >>>      new file mode 100644
> > >>>      index 0000000000..f1c4194633
> > >>>      --- /dev/null
> > >>>      +++
> > >>>      b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0001-support-python-5.9.patch
> > >>>      @@ -0,0 +1,129 @@
> > >>>      +From d4df52c9442d44adfc492e8e1b682ab638f10c0c Mon Sep 17 00:00:00 2001
> > >>>      +From: Khem Raj <raj.khem@gmail.com <mailto:raj.khem@gmail.com>>
> > >>>      +Date: Mon, 4 Jan 2021 19:52:10 -0800
> > >>>      +Subject: [PATCH 1/2] support python 5.9
> > >>>
> > >>>
> > >>> Subject: [PATCH 1/2] support python 3.9
> > >>>
> > >>>      +
> > >>>      +Imported from
> > >>>      +
> > >>>      +https://github.com/archlinux/svntogit-community/commit/9276e06052e89615fe8bf3a30d04f5803ad2e539
> > >>>      <https://github.com/archlinux/svntogit-community/commit/9276e06052e89615fe8bf3a30d04f5803ad2e539>
> > >>>      +
> > >>>      +Signed-off-by: Khem Raj <raj.khem@gmail.com
> > >>>      <mailto:raj.khem@gmail.com>>
> > >>>      +---
> > >>>      + configure                                     |  2 +-
> > >>>      + src/libs/xpcom18a4/python/Makefile.kmk        | 48 ++++++++++++++++++-
> > >>>      + src/libs/xpcom18a4/python/gen_python_deps.py  |  2 +-
> > >>>      + .../xpcom18a4/python/src/module/_xpcom.cpp    |  6 ++-
> > >>>      + 4 files changed, 54 insertions(+), 4 deletions(-)
> > >>>      +
> > >>>      +diff --git a/configure b/configure
> > >>>      +index 55390478..50f53434 100755
> > >>>      +--- a/configure
> > >>>      ++++ b/configure
> > >>>      +@@ -2028,7 +2028,7 @@ extern "C" int main(void)
> > >>>      + }
> > >>>      + EOF
> > >>>      +   found=
> > >>>      +-  SUPPYTHONLIBS="python2.7 python2.6 python3.1 python3.2 python3.3
> > >>>      python3.4 python3.4m python3.5 python3.5m python3.6 python3.6m
> > >>>      python3.7 python3.7m python3.8 python3.8m"
> > >>>      ++  SUPPYTHONLIBS="python2.7 python2.6 python3.1 python3.2 python3.3
> > >>>      python3.4 python3.4m python3.5 python3.5m python3.6 python3.6m
> > >>>      python3.7 python3.7m python3.8 python3.8m python3.9 python3.9m"
> > >>>      +   for p in $PYTHONDIR; do
> > >>>      +     for d in $SUPPYTHONLIBS; do
> > >>>      +       for b in lib/x86_64-linux-gnu lib/i386-linux-gnu lib64
> > >>>      lib/64 lib; do
> > >>>      +diff --git a/src/libs/xpcom18a4/python/Makefile.kmk
> > >>>      b/src/libs/xpcom18a4/python/Makefile.kmk
> > >>>      +index f854ea84..afc3d6b3 100644
> > >>>      +--- a/src/libs/xpcom18a4/python/Makefile.kmk
> > >>>      ++++ b/src/libs/xpcom18a4/python/Makefile.kmk
> > >>>      +@@ -26,7 +26,7 @@ endif
> > >>>      +
> > >>>      + #
> > >>>      + # List of supported Python versions, defining a number of
> > >>>      +-#
> > >>>      VBOX_PYTHON[26|27|31|32|32M|33|33M|34|34M|35|35M|36|36M|37|37M|38|38M|DEF]_[INC|LIB]
> > >>>      variables
> > >>>      ++#
> > >>>      VBOX_PYTHON[26|27|31|32|32M|33|33M|34|34M|35|35M|36|36M|37|37M|38|38M|39|39M|DEF]_[INC|LIB]
> > >>>      variables
> > >>>      + # which get picked up below.
> > >>>      + #
> > >>>      + ifeq ($(KBUILD_TARGET),darwin) # Relatively predictable, don't script.
> > >>>      +@@ -533,6 +533,52 @@ VBoxPython3_8m_x86_LIBS       =
> > >>>      $(VBOX_PYTHON38M_LIB_X86)
> > >>>      +  endif
> > >>>      + endif
> > >>>      +
> > >>>      ++ifdef VBOX_PYTHON39_INC
> > >>>      ++#
> > >>>      ++# Python 3.9 version
> > >>>      ++#
> > >>>      ++DLLS += VBoxPython3_9
> > >>>      ++VBoxPython3_9_EXTENDS    = VBoxPythonBase
> > >>>      ++VBoxPython3_9_EXTENDS_BY = appending
> > >>>      ++VBoxPython3_9_TEMPLATE   = XPCOM
> > >>>      ++VBoxPython3_9_INCS       = $(VBOX_PYTHON39_INC)
> > >>>      ++VBoxPython3_9_LIBS       = $(VBOX_PYTHON39_LIB)
> > >>>      ++
> > >>>      ++ ifdef VBOX_WITH_32_ON_64_MAIN_API
> > >>>      ++  ifdef VBOX_PYTHON39_LIB_X86
> > >>>      ++DLLS += VBoxPython3_9_x86
> > >>>      ++VBoxPython3_9_x86_EXTENDS    = VBoxPythonBase_x86
> > >>>      ++VBoxPython3_9_x86_EXTENDS_BY = appending
> > >>>      ++VBoxPython3_9_x86_TEMPLATE   = XPCOM
> > >>>      ++VBoxPython3_9_x86_INCS       = $(VBOX_PYTHON39_INC)
> > >>>      ++VBoxPython3_9_x86_LIBS       = $(VBOX_PYTHON39_LIB_X86)
> > >>>      ++  endif
> > >>>      ++ endif
> > >>>      ++endif
> > >>>      ++
> > >>>      ++ifdef VBOX_PYTHON39M_INC
> > >>>      ++#
> > >>>      ++# Python 3.9 version with pymalloc
> > >>>      ++#
> > >>>      ++DLLS += VBoxPython3_9m
> > >>>      ++VBoxPython3_9m_EXTENDS    = VBoxPythonBase_m
> > >>>      ++VBoxPython3_9m_EXTENDS_BY = appending
> > >>>      ++VBoxPython3_9m_TEMPLATE   = XPCOM
> > >>>      ++VBoxPython3_9m_INCS       = $(VBOX_PYTHON39M_INC)
> > >>>      ++VBoxPython3_9m_LIBS       = $(VBOX_PYTHON39M_LIB)
> > >>>      ++
> > >>>      ++ ifdef VBOX_WITH_32_ON_64_MAIN_API
> > >>>      ++  ifdef VBOX_PYTHON39M_LIB_X86
> > >>>      ++DLLS += VBoxPython3_9m_x86
> > >>>      ++VBoxPython3_9m_x86_EXTENDS    = VBoxPythonBase_x86_m
> > >>>      ++VBoxPython3_9m_x86_EXTENDS_BY = appending
> > >>>      ++VBoxPython3_9m_x86_TEMPLATE_   = XPCOM
> > >>>      ++VBoxPython3_9m_x86_INCS       = $(VBOX_PYTHON39M_INC)
> > >>>      ++VBoxPython3_9m_x86_LIBS       = $(VBOX_PYTHON39M_LIB_X86)
> > >>>      ++  endif
> > >>>      ++ endif
> > >>>      ++endif
> > >>>      ++
> > >>>      + ifdef VBOX_PYTHONDEF_INC
> > >>>      + #
> > >>>      + # Python without versioning
> > >>>      +diff --git a/src/libs/xpcom18a4/python/gen_python_deps.py
> > >>>      b/src/libs/xpcom18a4/python/gen_python_deps.py
> > >>>      +index 848dddf3..b116313a 100755
> > >>>      +--- a/src/libs/xpcom18a4/python/gen_python_deps.py
> > >>>      ++++ b/src/libs/xpcom18a4/python/gen_python_deps.py
> > >>>      +@@ -16,7 +16,7 @@ from __future__ import print_function
> > >>>      + import os,sys
> > >>>      + from distutils.version import StrictVersion
> > >>>      +
> > >>>      +-versions = ["2.6", "2.7", "3.1", "3.2", "3.2m", "3.3", "3.3m",
> > >>>      "3.4", "3.4m", "3.5", "3.5m", "3.6", "3.6m", "3.7", "3.7m", "3.8",
> > >>>      "3.8m" ]
> > >>>      ++versions = ["2.6", "2.7", "3.1", "3.2", "3.2m", "3.3", "3.3m",
> > >>>      "3.4", "3.4m", "3.5", "3.5m", "3.6", "3.6m", "3.7", "3.7m", "3.8",
> > >>>      "3.8m", "3.9", "3.9m" ]
> > >>>      + prefixes = ["/usr", "/usr/local", "/opt", "/opt/local"]
> > >>>      + known = {}
> > >>>      +
> > >>>      +diff --git a/src/libs/xpcom18a4/python/src/module/_xpcom.cpp
> > >>>      b/src/libs/xpcom18a4/python/src/module/_xpcom.cpp
> > >>>      +index d35eb607..93ce03fd 100644
> > >>>      +--- a/src/libs/xpcom18a4/python/src/module/_xpcom.cpp
> > >>>      ++++ b/src/libs/xpcom18a4/python/src/module/_xpcom.cpp
> > >>>      +@@ -84,7 +84,11 @@ extern PYXPCOM_EXPORT void
> > >>>      PyXPCOM_InterpreterState_Ensure();
> > >>>      + #  define MANGLE_MODULE_INIT(a_Name)    RT_CONCAT(a_Name,
> > >>>      MODULE_NAME_SUFFIX)
> > >>>      + # endif
> > >>>      + # ifdef VBOX_PYXPCOM_VERSIONED
> > >>>      +-#  if   PY_VERSION_HEX >= 0x03080000 && PY_VERSION_HEX < 0x03090000
> > >>>      ++#  if   PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x03100000
> > >>>      ++#   define MODULE_NAME    MANGLE_MODULE_NAME("VBoxPython3_9")
> > >>>      ++#   define initVBoxPython MANGLE_MODULE_INIT(PyInit_VBoxPython3_9)
> > >>>      ++
> > >>>      ++#  elif   PY_VERSION_HEX >= 0x03080000 && PY_VERSION_HEX < 0x03090000
> > >>>      + #   define MODULE_NAME    MANGLE_MODULE_NAME("VBoxPython3_8")
> > >>>      + #   define initVBoxPython MANGLE_MODULE_INIT(PyInit_VBoxPython3_8)
> > >>>      +
> > >>>      +--
> > >>>      +2.30.0
> > >>>      +
> > >>>      diff --git
> > >>>      a/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0002-Backport-5.10-fixes.patch
> > >>>      b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0002-Backport-5.10-fixes.patch
> > >>>      new file mode 100644
> > >>>      index 0000000000..f277ced902
> > >>>      --- /dev/null
> > >>>      +++
> > >>>      b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/0002-Backport-5.10-fixes.patch
> > >>>      @@ -0,0 +1,432 @@
> > >>>      +From ac018c7fe2215aab028615b2823cc8fba97cf8c2 Mon Sep 17 00:00:00 2001
> > >>>      +From: Khem Raj <raj.khem@gmail.com <mailto:raj.khem@gmail.com>>
> > >>>      +Date: Mon, 4 Jan 2021 19:54:52 -0800
> > >>>      +Subject: [PATCH 2/2] Backport 5.10 fixes
> > >>>      +
> > >>>      +Imported from
> > >>>      +https://raw.githubusercontent.com/archlinux/svntogit-community/packages/virtualbox/trunk/020-linux-5-10.patch
> > >>>      <https://raw.githubusercontent.com/archlinux/svntogit-community/packages/virtualbox/trunk/020-linux-5-10.patch>
> > >>>      +
> > >>>      +Signed-off-by: Khem Raj <raj.khem@gmail.com
> > >>>      <mailto:raj.khem@gmail.com>>
> > >>>      +---
> > >>>      + src/VBox/Additions/linux/drm/vbox_drv.h       | 10 +-
> > >>>      + src/VBox/Additions/linux/drm/vbox_fb.c        |  2 +-
> > >>>      + src/VBox/Additions/linux/drm/vbox_mode.c      |  2 +-
> > >>>      + src/VBox/Additions/linux/drm/vbox_ttm.c       | 99 +++++++++++++++++--
> > >>>      + .../Additions/linux/sharedfolders/regops.c    |  5 +-
> > >>>      + .../Runtime/r0drv/linux/memobj-r0drv-linux.c  | 61 +++++++++++-
> > >>>      + 6 files changed, 163 insertions(+), 16 deletions(-)
> > >>>      +
> > >>>      +diff --git a/src/VBox/Additions/linux/drm/vbox_drv.h
> > >>>      b/src/VBox/Additions/linux/drm/vbox_drv.h
> > >>>      +index c680f3b4..d21d023c 100644
> > >>>      +--- a/src/VBox/Additions/linux/drm/vbox_drv.h
> > >>>      ++++ b/src/VBox/Additions/linux/drm/vbox_drv.h
> > >>>      +@@ -175,6 +175,9 @@
> > >>>      + #include <drm/ttm/ttm_placement.h>
> > >>>      + #include <drm/ttm/ttm_memory.h>
> > >>>      + #include <drm/ttm/ttm_module.h>
> > >>>      ++#if RTLNX_VER_MIN(5,10,0)
> > >>>      ++# include <drm/ttm/ttm_resource.h>
> > >>>      ++#endif
> > >>>      +
> > >>>      + #include "vboxvideo_guest.h"
> > >>>      + #include "vboxvideo_vbe.h"
> > >>>      +@@ -444,7 +447,10 @@ int vbox_bo_create(struct drm_device *dev, int
> > >>>      size, int align,
> > >>>      + int vbox_gem_create(struct drm_device *dev,
> > >>>      +                   u32 size, bool iskernel, struct drm_gem_object
> > >>>      **obj);
> > >>>      +
> > >>>      +-int vbox_bo_pin(struct vbox_bo *bo, u32 pl_flag, u64 *gpu_addr);
> > >>>      ++#define VBOX_MEM_TYPE_VRAM   0x1
> > >>>      ++#define VBOX_MEM_TYPE_SYSTEM 0x2
> > >>>      ++
> > >>>      ++int vbox_bo_pin(struct vbox_bo *bo, u32 mem_type, u64 *gpu_addr);
> > >>>      + int vbox_bo_unpin(struct vbox_bo *bo);
> > >>>      +
> > >>>      + static inline int vbox_bo_reserve(struct vbox_bo *bo, bool no_wait)
> > >>>      +@@ -469,7 +475,7 @@ static inline void vbox_bo_unreserve(struct
> > >>>      vbox_bo *bo)
> > >>>      +       ttm_bo_unreserve(&bo->bo);
> > >>>      + }
> > >>>      +
> > >>>      +-void vbox_ttm_placement(struct vbox_bo *bo, int domain);
> > >>>      ++void vbox_ttm_placement(struct vbox_bo *bo, u32 mem_type);
> > >>>      + int vbox_bo_push_sysram(struct vbox_bo *bo);
> > >>>      + int vbox_mmap(struct file *filp, struct vm_area_struct *vma);
> > >>>      +
> > >>>      +diff --git a/src/VBox/Additions/linux/drm/vbox_fb.c
> > >>>      b/src/VBox/Additions/linux/drm/vbox_fb.c
> > >>>      +index 811d0040..44b1ef52 100644
> > >>>      +--- a/src/VBox/Additions/linux/drm/vbox_fb.c
> > >>>      ++++ b/src/VBox/Additions/linux/drm/vbox_fb.c
> > >>>      +@@ -295,7 +295,7 @@ static int vboxfb_create(struct drm_fb_helper
> > >>>      *helper,
> > >>>      +       if (ret)
> > >>>      +               return ret;
> > >>>      +
> > >>>      +-      ret = vbox_bo_pin(bo, TTM_PL_FLAG_VRAM, NULL);
> > >>>      ++      ret = vbox_bo_pin(bo, VBOX_MEM_TYPE_VRAM, NULL);
> > >>>      +       if (ret) {
> > >>>      +               vbox_bo_unreserve(bo);
> > >>>      +               return ret;
> > >>>      +diff --git a/src/VBox/Additions/linux/drm/vbox_mode.c
> > >>>      b/src/VBox/Additions/linux/drm/vbox_mode.c
> > >>>      +index 1e2691fd..52fd10fd 100644
> > >>>      +--- a/src/VBox/Additions/linux/drm/vbox_mode.c
> > >>>      ++++ b/src/VBox/Additions/linux/drm/vbox_mode.c
> > >>>      +@@ -227,7 +227,7 @@ static int vbox_crtc_set_base(struct drm_crtc
> > >>>      *crtc,
> > >>>      +       if (ret)
> > >>>      +               return ret;
> > >>>      +
> > >>>      +-      ret = vbox_bo_pin(bo, TTM_PL_FLAG_VRAM, &gpu_addr);
> > >>>      ++      ret = vbox_bo_pin(bo, VBOX_MEM_TYPE_VRAM, &gpu_addr);
> > >>>      +       vbox_bo_unreserve(bo);
> > >>>      +       if (ret)
> > >>>      +               return ret;
> > >>>      +diff --git a/src/VBox/Additions/linux/drm/vbox_ttm.c
> > >>>      b/src/VBox/Additions/linux/drm/vbox_ttm.c
> > >>>      +index 4e990843..ee2da4aa 100644
> > >>>      +--- a/src/VBox/Additions/linux/drm/vbox_ttm.c
> > >>>      ++++ b/src/VBox/Additions/linux/drm/vbox_ttm.c
> > >>>      +@@ -41,6 +41,7 @@
> > >>>      + #define PLACEMENT_FLAGS(placement) ((placement).flags)
> > >>>      + #endif
> > >>>      +
> > >>>      ++
> > >>>      + static inline struct vbox_private *vbox_bdev(struct ttm_bo_device *bd)
> > >>>      + {
> > >>>      +       return container_of(bd, struct vbox_private, ttm.bdev);
> > >>>      +@@ -125,6 +126,7 @@ static bool vbox_ttm_bo_is_vbox_bo(struct
> > >>>      ttm_buffer_object *bo)
> > >>>      +       return false;
> > >>>      + }
> > >>>      +
> > >>>      ++#if RTLNX_VER_MAX(5,10,0)
> > >>>      + static int
> > >>>      + vbox_bo_init_mem_type(struct ttm_bo_device *bdev, u32 type,
> > >>>      +                     struct ttm_mem_type_manager *man)
> > >>>      +@@ -148,6 +150,7 @@ vbox_bo_init_mem_type(struct ttm_bo_device
> > >>>      *bdev, u32 type,
> > >>>      +
> > >>>      +       return 0;
> > >>>      + }
> > >>>      ++#endif
> > >>>      +
> > >>>      + static void
> > >>>      + vbox_bo_evict_flags(struct ttm_buffer_object *bo, struct
> > >>>      ttm_placement *pl)
> > >>>      +@@ -157,7 +160,7 @@ vbox_bo_evict_flags(struct ttm_buffer_object
> > >>>      *bo, struct ttm_placement *pl)
> > >>>      +       if (!vbox_ttm_bo_is_vbox_bo(bo))
> > >>>      +               return;
> > >>>      +
> > >>>      +-      vbox_ttm_placement(vboxbo, TTM_PL_FLAG_SYSTEM);
> > >>>      ++      vbox_ttm_placement(vboxbo, VBOX_MEM_TYPE_SYSTEM);
> > >>>      +       *pl = vboxbo->placement;
> > >>>      + }
> > >>>      +
> > >>>      +@@ -167,11 +170,12 @@ static int vbox_bo_verify_access(struct
> > >>>      ttm_buffer_object *bo,
> > >>>      +       return 0;
> > >>>      + }
> > >>>      +
> > >>>      ++#if RTLNX_VER_MAX(5,10,0)
> > >>>      + static int vbox_ttm_io_mem_reserve(struct ttm_bo_device *bdev,
> > >>>      +                                  struct ttm_mem_reg *mem)
> > >>>      + {
> > >>>      +-      struct ttm_mem_type_manager *man = &bdev->man[mem->mem_type];
> > >>>      +       struct vbox_private *vbox = vbox_bdev(bdev);
> > >>>      ++      struct ttm_mem_type_manager *man = &bdev->man[mem->mem_type];
> > >>>      +
> > >>>      +       mem->bus.addr = NULL;
> > >>>      +       mem->bus.offset = 0;
> > >>>      +@@ -194,12 +198,53 @@ static int vbox_ttm_io_mem_reserve(struct
> > >>>      ttm_bo_device *bdev,
> > >>>      +       }
> > >>>      +       return 0;
> > >>>      + }
> > >>>      ++#else
> > >>>      ++static int vbox_ttm_io_mem_reserve(struct ttm_bo_device *bdev,
> > >>>      ++                                 struct ttm_resource *mem)
> > >>>      ++{
> > >>>      ++      struct vbox_private *vbox = vbox_bdev(bdev);
> > >>>      ++      mem->bus.addr = NULL;
> > >>>      ++      mem->bus.offset = 0;
> > >>>      ++      mem->size = mem->num_pages << PAGE_SHIFT;
> > >>>      ++      mem->start = 0;
> > >>>      ++      mem->bus.is_iomem = false;
> > >>>      ++      switch (mem->mem_type) {
> > >>>      ++      case TTM_PL_SYSTEM:
> > >>>      ++              /* system memory */
> > >>>      ++              return 0;
> > >>>      ++      case TTM_PL_VRAM:
> > >>>      ++              mem->bus.offset = mem->start << PAGE_SHIFT;
> > >>>      ++              mem->start = pci_resource_start(vbox->dev->pdev, 0);
> > >>>      ++              mem->bus.is_iomem = true;
> > >>>      ++              break;
> > >>>      ++      default:
> > >>>      ++              return -EINVAL;
> > >>>      ++      }
> > >>>      ++      return 0;
> > >>>      ++}
> > >>>      ++#endif
> > >>>      +
> > >>>      ++
> > >>>      ++
> > >>>      ++#if RTLNX_VER_MIN(5,10,0)
> > >>>      ++static void vbox_ttm_io_mem_free(struct ttm_bo_device *bdev,
> > >>>      ++                               struct ttm_resource *mem)
> > >>>      ++{
> > >>>      ++}
> > >>>      ++#else
> > >>>      + static void vbox_ttm_io_mem_free(struct ttm_bo_device *bdev,
> > >>>      +                                struct ttm_mem_reg *mem)
> > >>>      + {
> > >>>      + }
> > >>>      ++#endif
> > >>>      +
> > >>>      ++#if RTLNX_VER_MIN(5,10,0)
> > >>>      ++static void vbox_ttm_tt_destroy(struct ttm_bo_device *bdev, struct
> > >>>      ttm_tt *tt)
> > >>>      ++{
> > >>>      ++      ttm_tt_fini(tt);
> > >>>      ++      kfree(tt);
> > >>>      ++}
> > >>>      ++#else
> > >>>      + static void vbox_ttm_backend_destroy(struct ttm_tt *tt)
> > >>>      + {
> > >>>      +       ttm_tt_fini(tt);
> > >>>      +@@ -209,6 +254,7 @@ static void vbox_ttm_backend_destroy(struct
> > >>>      ttm_tt *tt)
> > >>>      + static struct ttm_backend_func vbox_tt_backend_func = {
> > >>>      +       .destroy = &vbox_ttm_backend_destroy,
> > >>>      + };
> > >>>      ++#endif
> > >>>      +
> > >>>      + #if RTLNX_VER_MAX(4,17,0) && !RTLNX_RHEL_MAJ_PREREQ(7,6) &&
> > >>>      !RTLNX_SUSE_MAJ_PREREQ(15,1) && !RTLNX_SUSE_MAJ_PREREQ(12,5)
> > >>>      + static struct ttm_tt *vbox_ttm_tt_create(struct ttm_bo_device *bdev,
> > >>>      +@@ -226,7 +272,9 @@ static struct ttm_tt *vbox_ttm_tt_create(struct
> > >>>      ttm_buffer_object *bo,
> > >>>      +       if (!tt)
> > >>>      +               return NULL;
> > >>>      +
> > >>>      ++#if RTLNX_VER_MAX(5,10,0)
> > >>>      +       tt->func = &vbox_tt_backend_func;
> > >>>      ++#endif
> > >>>      + #if RTLNX_VER_MAX(4,17,0) && !RTLNX_RHEL_MAJ_PREREQ(7,6) &&
> > >>>      !RTLNX_SUSE_MAJ_PREREQ(15,1) && !RTLNX_SUSE_MAJ_PREREQ(12,5)
> > >>>      +       if (ttm_tt_init(tt, bdev, size, page_flags, dummy_read_page)) {
> > >>>      + #else
> > >>>      +@@ -261,11 +309,16 @@ static void vbox_ttm_tt_unpopulate(struct
> > >>>      ttm_tt *ttm)
> > >>>      +
> > >>>      + static struct ttm_bo_driver vbox_bo_driver = {
> > >>>      +       .ttm_tt_create = vbox_ttm_tt_create,
> > >>>      ++#if RTLNX_VER_MIN(5,10,0)
> > >>>      ++      .ttm_tt_destroy = vbox_ttm_tt_destroy,
> > >>>      ++#endif
> > >>>      + #if RTLNX_VER_MAX(4,17,0)
> > >>>      +       .ttm_tt_populate = vbox_ttm_tt_populate,
> > >>>      +       .ttm_tt_unpopulate = vbox_ttm_tt_unpopulate,
> > >>>      + #endif
> > >>>      ++#if RTLNX_VER_MAX(5,10,0)
> > >>>      +       .init_mem_type = vbox_bo_init_mem_type,
> > >>>      ++#endif
> > >>>      + #if RTLNX_VER_MIN(4,10,0) || RTLNX_RHEL_MAJ_PREREQ(7,4)
> > >>>      +       .eviction_valuable = ttm_bo_eviction_valuable,
> > >>>      + #endif
> > >>>      +@@ -318,8 +371,13 @@ int vbox_mm_init(struct vbox_private *vbox)
> > >>>      + #endif
> > >>>      +       }
> > >>>      +
> > >>>      ++#if RTLNX_VER_MIN(5,10,0)
> > >>>      ++      ret = ttm_range_man_init(bdev, TTM_PL_VRAM, false,
> > >>>      ++                           vbox->available_vram_size >> PAGE_SHIFT);
> > >>>      ++#else
> > >>>      +       ret = ttm_bo_init_mm(bdev, TTM_PL_VRAM,
> > >>>      +                            vbox->available_vram_size >> PAGE_SHIFT);
> > >>>      ++#endif
> > >>>      +       if (ret) {
> > >>>      +               DRM_ERROR("Failed ttm VRAM init: %d\n", ret);
> > >>>      +               goto err_device_release;
> > >>>      +@@ -359,7 +417,7 @@ void vbox_mm_fini(struct vbox_private *vbox)
> > >>>      + #endif
> > >>>      + }
> > >>>      +
> > >>>      +-void vbox_ttm_placement(struct vbox_bo *bo, int domain)
> > >>>      ++void vbox_ttm_placement(struct vbox_bo *bo, u32 mem_type)
> > >>>      + {
> > >>>      +       u32 c = 0;
> > >>>      + #if RTLNX_VER_MAX(3,18,0) && !RTLNX_RHEL_MAJ_PREREQ(7,2)
> > >>>      +@@ -372,15 +430,36 @@ void vbox_ttm_placement(struct vbox_bo *bo,
> > >>>      int domain)
> > >>>      +       bo->placement.placement = bo->placements;
> > >>>      +       bo->placement.busy_placement = bo->placements;
> > >>>      +
> > >>>      +-      if (domain & TTM_PL_FLAG_VRAM)
> > >>>      ++      if (mem_type & VBOX_MEM_TYPE_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;
> > >>>      +-      if (domain & TTM_PL_FLAG_SYSTEM)
> > >>>      ++#endif
> > >>>      ++      }
> > >>>      ++      if (mem_type & VBOX_MEM_TYPE_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;
> > >>>      +-      if (!c)
> > >>>      ++#endif
> > >>>      ++      }
> > >>>      ++      if (!c) {
> > >>>      ++#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
> > >>>      ++      }
> > >>>      +
> > >>>      +       bo->placement.num_placement = c;
> > >>>      +       bo->placement.num_busy_placement = c;
> > >>>      +@@ -414,7 +493,7 @@ int vbox_bo_create(struct drm_device *dev, int
> > >>>      size, int align,
> > >>>      +       vboxbo->bo.bdev->dev_mapping = dev->dev_mapping;
> > >>>      + #endif
> > >>>      +
> > >>>      +-      vbox_ttm_placement(vboxbo, TTM_PL_FLAG_VRAM |
> > >>>      TTM_PL_FLAG_SYSTEM);
> > >>>      ++      vbox_ttm_placement(vboxbo, VBOX_MEM_TYPE_VRAM |
> > >>>      VBOX_MEM_TYPE_SYSTEM);
> > >>>      +
> > >>>      +       acc_size = ttm_bo_dma_acc_size(&vbox->ttm.bdev, size,
> > >>>      +                                      sizeof(struct vbox_bo));
> > >>>      +@@ -452,7 +531,7 @@ static inline u64 vbox_bo_gpu_offset(struct
> > >>>      vbox_bo *bo)
> > >>>      + #endif
> > >>>      + }
> > >>>      +
> > >>>      +-int vbox_bo_pin(struct vbox_bo *bo, u32 pl_flag, u64 *gpu_addr)
> > >>>      ++int vbox_bo_pin(struct vbox_bo *bo, u32 mem_type, u64 *gpu_addr)
> > >>>      + {
> > >>>      + #if RTLNX_VER_MIN(4,16,0) || RTLNX_RHEL_MAJ_PREREQ(7,6) ||
> > >>>      RTLNX_SUSE_MAJ_PREREQ(15,1) || RTLNX_SUSE_MAJ_PREREQ(12,5)
> > >>>      +       struct ttm_operation_ctx ctx = { false, false };
> > >>>      +@@ -467,7 +546,7 @@ int vbox_bo_pin(struct vbox_bo *bo, u32
> > >>>      pl_flag, u64 *gpu_addr)
> > >>>      +               return 0;
> > >>>      +       }
> > >>>      +
> > >>>      +-      vbox_ttm_placement(bo, pl_flag);
> > >>>      ++      vbox_ttm_placement(bo, mem_type);
> > >>>      +
> > >>>      +       for (i = 0; i < bo->placement.num_placement; i++)
> > >>>      +               PLACEMENT_FLAGS(bo->placements[i]) |=
> > >>>      TTM_PL_FLAG_NO_EVICT;
> > >>>      +@@ -540,7 +619,7 @@ int vbox_bo_push_sysram(struct vbox_bo *bo)
> > >>>      +       if (bo->kmap.virtual)
> > >>>      +               ttm_bo_kunmap(&bo->kmap);
> > >>>      +
> > >>>      +-      vbox_ttm_placement(bo, TTM_PL_FLAG_SYSTEM);
> > >>>      ++      vbox_ttm_placement(bo, VBOX_MEM_TYPE_SYSTEM);
> > >>>      +
> > >>>      +       for (i = 0; i < bo->placement.num_placement; i++)
> > >>>      +               PLACEMENT_FLAGS(bo->placements[i]) |=
> > >>>      TTM_PL_FLAG_NO_EVICT;
> > >>>      +diff --git a/src/VBox/Additions/linux/sharedfolders/regops.c
> > >>>      b/src/VBox/Additions/linux/sharedfolders/regops.c
> > >>>      +index 3ad9c566..ec298a1b 100644
> > >>>      +--- a/src/VBox/Additions/linux/sharedfolders/regops.c
> > >>>      ++++ b/src/VBox/Additions/linux/sharedfolders/regops.c
> > >>>      +@@ -1401,7 +1401,10 @@ static int
> > >>>      vbsf_lock_user_pages_failed_check_kernel(uintptr_t uPtrFrom, size_t 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
> > >>>      +diff --git a/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c
> > >>>      b/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c
> > >>>      +index c771c1ba..a34eb149 100644
> > >>>      +--- a/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c
> > >>>      ++++ b/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c
> > >>>      +@@ -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,6 +505,42 @@ static void
> > >>>      rtR0MemObjLinuxFreePages(PRTR0MEMOBJLNX pMemLnx)
> > >>>      + }
> > >>>      +
> > >>>      +
> > >>>      ++#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.
> > >>>      +  *
> > >>>      +@@ -584,6 +623,11 @@ static int rtR0MemObjLinuxVMap(PRTR0MEMOBJLNX
> > >>>      pMemLnx, bool fExecutable)
> > >>>      +         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 @@ DECLHIDDEN(int)
> > >>>      rtR0MemObjNativeProtect(PRTR0MEMOBJINTERNAL pMem, size_t offSub,
> > >>>      +         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);
> > >>>      +--
> > >>>      +2.30.0
> > >>>      +
> > >>>      diff --git
> > >>>      a/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers_6.1.16.bb <http://vboxguestdrivers_6.1.16.bb>
> > >>>      b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers_6.1.16.bb <http://vboxguestdrivers_6.1.16.bb>
> > >>>      index 9282f663b4..fef7ffa954 100644
> > >>>      ---
> > >>>      a/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers_6.1.16.bb <http://vboxguestdrivers_6.1.16.bb>
> > >>>      +++
> > >>>      b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers_6.1.16.bb <http://vboxguestdrivers_6.1.16.bb>
> > >>>      @@ -13,6 +13,8 @@ VBOX_NAME = "VirtualBox-${PV}"
> > >>>
> > >>>        SRC_URI =
> > >>>      "http://download.virtualbox.org/virtualbox/${PV}/${VBOX_NAME}.tar.bz2 <http://download.virtualbox.org/virtualbox/$%7BPV%7D/$%7BVBOX_NAME%7D.tar.bz2>
> > >>>      \
> > >>>            file://Makefile.utils \
> > >>>      +    file://0001-support-python-5.9.patch \
> > >>>
> > >>>
> > >>> file://0001-support-python-3.9.patch
> > >>>
> > >>>      +    file://0002-Backport-5.10-fixes.patch \
> > >>>        "
> > >>>        SRC_URI[md5sum] = "a12a647f6c114f2cb1571089b36841fe"
> > >>>        SRC_URI[sha256sum] =
> > >>>      "49c1990da16d8a3d5bda8cdb961ec8195a901e67e4c79aea44c1521a5fc2f9f1"
> > >>>      --
> > >>>      2.30.0
> > >>>
> > >>>
> > >>>
> > >>>
> > >>>
> > >>>
> > >>> --
> > >>> best regards,
> > >>> José Quaresma
> > >>
> > >> 
> > >>
> > >
> > >



-- 
- Thou shalt not follow the NULL pointer, for chaos and madness await
thee at its end
- "Use the force Harry" - Gandalf, Star Trek II

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2021-01-06 13:42 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-01-05  4:04 [meta-oe][PATCH] vboxguestdrivers: Fix build with kernel 5.10 Khem Raj
2021-01-05 10:50 ` [oe] " Jose Quaresma
2021-01-05 17:05   ` Khem Raj
2021-01-05 17:12     ` Bruce Ashfield
2021-01-05 17:22       ` Khem Raj
2021-01-06  5:30         ` Khem Raj
2021-01-06 13:41           ` Bruce Ashfield

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.