From 5a6c7c5b8ba7e0d701523093c10f11f33a94d556 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jan=20R=C4=99korajski?= Date: Wed, 18 Sep 2019 20:07:02 +0200 Subject: [PATCH] - fix build with kernel 5.3 - rel 2 --- VirtualBox.spec | 4 +- kernel-5.3.patch | 103 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 kernel-5.3.patch diff --git a/VirtualBox.spec b/VirtualBox.spec index 18de72f..66ffaa8 100644 --- a/VirtualBox.spec +++ b/VirtualBox.spec @@ -42,7 +42,7 @@ exit 1 %define qtver 5.6.0 -%define rel 1 +%define rel 2 %define pname VirtualBox Summary: VirtualBox - x86 hardware virtualizer Summary(pl.UTF-8): VirtualBox - wirtualizator sprzętu x86 @@ -84,6 +84,7 @@ Patch14: %{pname}-multipython.patch Patch15: %{pname}-lightdm-1.19.2.patch Patch16: %{pname}-no-vboxvideo.patch Patch17: qt5-gl.patch +Patch18: kernel-5.3.patch URL: http://www.virtualbox.org/ %if %{with userspace} %ifarch %{x8664} @@ -563,6 +564,7 @@ echo override vboxguest %{_kernel_ver} misc > PLD-MODULE-BUILD/installed/etc/dep %patch15 -p0 %patch16 -p0 %patch17 -p1 +%patch18 -p1 %{__sed} -i -e 's,@VBOX_DOC_PATH@,%{_docdir}/%{name}-%{version},' \ -e 's/Categories=.*/Categories=Utility;Emulator;/' src/VBox/Installer/common/virtualbox.desktop.in diff --git a/kernel-5.3.patch b/kernel-5.3.patch new file mode 100644 index 0000000..993dab7 --- /dev/null +++ b/kernel-5.3.patch @@ -0,0 +1,103 @@ +On 7/23/19 5:33 PM, S?rgio Basto wrote: +> Hello, +> +> https://forums.virtualbox.org/viewtopic.php?f=3&t=93944 +> +> have someone the solution ? + +Yes, I do. The MIT-licensed patch is posted below. After I finish here, I will +also post this material on the VBox forum. + +The API changes are as follows: + +1. The for_ifa() and endfor_ifa() macros are removed. They are so simple that it +is better to turn then into in-line code. + +2. Routine smp_call_function() is changed from type int to void. + + + +Index: VirtualBox-6.0.10/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c +=================================================================== +--- VirtualBox-6.0.10.orig/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c ++++ VirtualBox-6.0.10/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c +@@ -2123,7 +2123,10 @@ static int vboxNetFltLinuxEnumeratorCall + #endif + if (in_dev != NULL) + { +- for_ifa(in_dev) { ++ /* macros for_ifa() and endfor_ifa() disappear for kernel 5.3 ++ * Code them directly */ ++ struct in_ifaddr *ifa; ++ for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next) { + if (VBOX_IPV4_IS_LOOPBACK(ifa->ifa_address)) + return NOTIFY_OK; + +@@ -2137,7 +2140,7 @@ static int vboxNetFltLinuxEnumeratorCall + + pThis->pSwitchPort->pfnNotifyHostAddress(pThis->pSwitchPort, + /* :fAdded */ true, kIntNetAddrType_IPv4, &ifa->ifa_address); +- } endfor_ifa(in_dev); ++ } + } + + /* +Index: VirtualBox-6.0.10/src/VBox/Runtime/r0drv/linux/mp-r0drv-linux.c +=================================================================== +--- VirtualBox-6.0.10.orig/src/VBox/Runtime/r0drv/linux/mp-r0drv-linux.c ++++ VirtualBox-6.0.10/src/VBox/Runtime/r0drv/linux/mp-r0drv-linux.c +@@ -283,12 +283,16 @@ RTDECL(int) RTMpOnAll(PFNRTMPWORKER pfnW + if (RTCpuSetCount(&OnlineSet) > 1) + { + /* Fire the function on all other CPUs without waiting for completion. */ +-# if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27) ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 3, 0) ++ smp_call_function(rtmpLinuxAllWrapper, &Args, 0 /* wait */); ++#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27) + int rc = smp_call_function(rtmpLinuxAllWrapper, &Args, 0 /* wait */); +-# else ++#else + int rc = smp_call_function(rtmpLinuxAllWrapper, &Args, 0 /* retry */, 0 /* wait */); +-# endif ++#endif ++# if LINUX_VERSION_CODE < KERNEL_VERSION(5, 3, 0) + Assert(!rc); NOREF(rc); ++#endif + } + #endif + +@@ -326,7 +330,9 @@ RTDECL(int) RTMpOnOthers(PFNRTMPWORKER p + { + #ifdef CONFIG_SMP + IPRT_LINUX_SAVE_EFL_AC(); ++#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 3, 0) + int rc; ++#endif + RTMPARGS Args; + + RTTHREADPREEMPTSTATE PreemptState = RTTHREADPREEMPTSTATE_INITIALIZER; +@@ -337,14 +343,18 @@ RTDECL(int) RTMpOnOthers(PFNRTMPWORKER p + Args.cHits = 0; + + RTThreadPreemptDisable(&PreemptState); +-# if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27) ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 3, 0) ++ smp_call_function(rtmpLinuxWrapper, &Args, 1 /* wait */); ++#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27) + rc = smp_call_function(rtmpLinuxWrapper, &Args, 1 /* wait */); +-# else /* older kernels */ ++#else /* older kernels */ + rc = smp_call_function(rtmpLinuxWrapper, &Args, 0 /* retry */, 1 /* wait */); +-# endif /* older kernels */ ++#endif /* older kernels */ + RTThreadPreemptRestore(&PreemptState); + ++#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 3, 0) + Assert(rc == 0); NOREF(rc); ++#endif + IPRT_LINUX_RESTORE_EFL_AC(); + #else + RT_NOREF(pfnWorker, pvUser1, pvUser2); + +Larry + -- 2.43.0