diff --git a/fixes_for_kernel_5.18.patch b/fixes_for_kernel_5.18.patch index 6082cea..97e913d 100644 --- a/fixes_for_kernel_5.18.patch +++ b/fixes_for_kernel_5.18.patch @@ -20,19 +20,41 @@ Index: VirtualBox-6.1.34/src/VBox/HostDrivers/Support/SUPDrv.cpp =================================================================== --- VirtualBox-6.1.34.orig/src/VBox/HostDrivers/Support/SUPDrv.cpp +++ VirtualBox-6.1.34/src/VBox/HostDrivers/Support/SUPDrv.cpp -@@ -1742,7 +1742,15 @@ static int supdrvIOCtlInnerUnrestricted( +@@ -98,7 +98,18 @@ + # endif + #endif + +- ++#if defined(RT_OS_LINUX) && !defined(__NO_FORTIFY) && defined(__OPTIMIZE__) && defined(CONFIG_FORTIFY_SOURCE) ++/* In Linux 5.18-rc1, memcpy became a wrapper which does fortify checks ++ * before triggering __underlying_memcpy() call. We do not pass these checks here, ++ * so bypass them for now. */ ++# if RTLNX_VER_MIN(5,18,0) ++# define SUPDRV_MEMCPY __underlying_memcpy ++# else ++# define SUPDRV_MEMCPY memcpy ++# endif ++#else ++# define SUPDRV_MEMCPY memcpy ++#endif + /* + * Logging assignments: + * Log - useful stuff, like failures. +@@ -267,6 +278,8 @@ static SUPFUNC g_aFunctions[] = + SUPEXP_STK_BACK( 2, SUPR0ChangeCR4), + SUPEXP_STK_BACK( 1, SUPR0EnableVTx), + SUPEXP_STK_BACK( 0, SUPR0SuspendVTxOnCpu), ++ SUPEXP_STK_OKAY( 1, SUPR0FpuBegin), ++ SUPEXP_STK_OKAY( 1, SUPR0FpuEnd), + SUPEXP_STK_BACK( 1, SUPR0ResumeVTxOnCpu), + SUPEXP_STK_OKAY( 1, SUPR0GetCurrentGdtRw), + SUPEXP_STK_OKAY( 0, SUPR0GetKernelFeatures), +@@ -1742,7 +1755,7 @@ static int supdrvIOCtlInnerUnrestricted( /* execute */ pReq->u.Out.cFunctions = RT_ELEMENTS(g_aFunctions); -+ -+ /* In 5.18.0, memcpy became a wrapper which does fortify checks -+ * before triggering __underlying_memcpy() call. We do not pass these checks here, -+ * so bypass them for now. */ -+#if RTLNX_VER_MIN(5,18,0) -+ __underlying_memcpy(&pReq->u.Out.aFunctions[0], g_aFunctions, sizeof(g_aFunctions)); -+#else - memcpy(&pReq->u.Out.aFunctions[0], g_aFunctions, sizeof(g_aFunctions)); -+#endif +- memcpy(&pReq->u.Out.aFunctions[0], g_aFunctions, sizeof(g_aFunctions)); ++ SUPDRV_MEMCPY(&pReq->u.Out.aFunctions[0], g_aFunctions, sizeof(g_aFunctions)); pReq->Hdr.rc = VINF_SUCCESS; return 0; } @@ -84,4 +106,195 @@ Index: VirtualBox-6.1.34/Config.kmk TEMPLATE_VBoxR0_CFLAGS.amd64 = -m64 -mno-red-zone -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -fasynchronous-unwind-tables -ffreestanding TEMPLATE_VBoxR0_CXXFLAGS.amd64 = -m64 -mno-red-zone -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -fasynchronous-unwind-tables TEMPLATE_VBoxR0_CXXFLAGS.freebsd = -ffreestanding - +Index: VirtualBox-6.1.34/include/VBox/sup.h +=================================================================== +--- VirtualBox-6.1.34.orig/include/VBox/sup.h ++++ VirtualBox-6.1.34/include/VBox/sup.h +@@ -2142,7 +2142,25 @@ RT_IPRT_FORMAT_ATTR(1, 2) SUPR0Printf(co + */ + SUPR0DECL(uint32_t) SUPR0GetKernelFeatures(void); + +-/** @copydoc RTLogGetDefaultInstanceEx ++/** ++ * Notification from R0 VMM prior to loading the guest-FPU register state. ++ * ++ * @returns Whether the host-FPU register state has been saved by the host kernel. ++ * @param fCtxHook Whether thread-context hooks are enabled. ++ * ++ * @remarks Called with preemption disabled. ++ */ ++SUPR0DECL(bool) SUPR0FpuBegin(bool fCtxHook); ++ ++/** ++ * Notification from R0 VMM prior to saving the guest-FPU register state (and ++ * potentially restoring the host-FPU register state) in ring-0. ++ * ++ * @param fCtxHook Whether thread-context hooks are enabled. ++ * ++ * @remarks Called with preemption disabled. ++ */ ++SUPR0DECL(void) SUPR0FpuEnd(bool fCtxHook); /** @copydoc RTLogGetDefaultInstanceEx + * @remarks To allow overriding RTLogGetDefaultInstanceEx locally. */ + SUPR0DECL(struct RTLOGGER *) SUPR0GetDefaultLogInstanceEx(uint32_t fFlagsAndGroup); + /** @copydoc RTLogRelGetDefaultInstanceEx +Index: VirtualBox-6.1.34/src/VBox/VMM/VMMR0/CPUMR0.cpp +=================================================================== +--- VirtualBox-6.1.34.orig/src/VBox/VMM/VMMR0/CPUMR0.cpp ++++ VirtualBox-6.1.34/src/VBox/VMM/VMMR0/CPUMR0.cpp +@@ -440,6 +440,8 @@ VMMR0_INT_DECL(int) CPUMR0LoadGuestFPU(P + Assert(!(pVCpu->cpum.s.fUseFlags & CPUM_USED_FPU_GUEST)); + Assert(!(pVCpu->cpum.s.fUseFlags & CPUM_SYNC_FPU_STATE)); + ++ /* Notify the support driver prior to loading the guest-FPU register state. */ ++ SUPR0FpuBegin(false /* unused */); + if (!pVM->cpum.s.HostFeatures.fLeakyFxSR) + { + Assert(!(pVCpu->cpum.s.fUseFlags & CPUM_USED_MANUAL_XMM_RESTORE)); +@@ -485,6 +487,8 @@ VMMR0_INT_DECL(bool) CPUMR0FpuStateMaybe + if (pVCpu->cpum.s.fUseFlags & (CPUM_USED_FPU_GUEST | CPUM_USED_FPU_HOST)) + { + fSavedGuest = RT_BOOL(pVCpu->cpum.s.fUseFlags & CPUM_USED_FPU_GUEST); ++ /* Notify the support driver prior to loading the host-FPU register state. */ ++ SUPR0FpuEnd(false /* unused */); + if (!(pVCpu->cpum.s.fUseFlags & CPUM_USED_MANUAL_XMM_RESTORE)) + cpumR0SaveGuestRestoreHostFPUState(&pVCpu->cpum.s); + else +Index: VirtualBox-6.1.34/src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp +=================================================================== +--- VirtualBox-6.1.34.orig/src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp ++++ VirtualBox-6.1.34/src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp +@@ -2002,6 +2002,17 @@ SUPR0DECL(uint32_t) SUPR0GetKernelFeatur + } + + ++SUPR0DECL(bool) SUPR0FpuBegin(bool fCtxHook) ++{ ++ RT_NOREF(fCtxHook); ++ return false; ++} ++ ++ ++SUPR0DECL(void) SUPR0FpuEnd(bool fCtxHook) ++{ ++ RT_NOREF(fCtxHook); ++} + /* + * + * org_virtualbox_SupDrv +Index: VirtualBox-6.1.34/src/VBox/HostDrivers/Support/freebsd/SUPDrv-freebsd.c +=================================================================== +--- VirtualBox-6.1.34.orig/src/VBox/HostDrivers/Support/freebsd/SUPDrv-freebsd.c ++++ VirtualBox-6.1.34/src/VBox/HostDrivers/Support/freebsd/SUPDrv-freebsd.c +@@ -640,3 +640,15 @@ SUPR0DECL(uint32_t) SUPR0GetKernelFeatur + return 0; + } + ++SUPR0DECL(bool) SUPR0FpuBegin(bool fCtxHook) ++{ ++ RT_NOREF(fCtxHook); ++ return false; ++} ++ ++ ++SUPR0DECL(void) SUPR0FpuEnd(bool fCtxHook) ++{ ++ RT_NOREF(fCtxHook); ++} ++ +Index: VirtualBox-6.1.34/src/VBox/HostDrivers/Support/os2/SUPDrv-os2.cpp +=================================================================== +--- VirtualBox-6.1.34.orig/src/VBox/HostDrivers/Support/os2/SUPDrv-os2.cpp ++++ VirtualBox-6.1.34/src/VBox/HostDrivers/Support/os2/SUPDrv-os2.cpp +@@ -541,3 +541,15 @@ SUPR0DECL(uint32_t) SUPR0GetKernelFeatur + return 0; + } + ++SUPR0DECL(bool) SUPR0FpuBegin(bool fCtxHook) ++{ ++ RT_NOREF(fCtxHook); ++ return false; ++} ++ ++ ++SUPR0DECL(void) SUPR0FpuEnd(bool fCtxHook) ++{ ++ RT_NOREF(fCtxHook); ++} ++ +Index: VirtualBox-6.1.34/src/VBox/HostDrivers/Support/win/SUPDrv-win.cpp +=================================================================== +--- VirtualBox-6.1.34.orig/src/VBox/HostDrivers/Support/win/SUPDrv-win.cpp ++++ VirtualBox-6.1.34/src/VBox/HostDrivers/Support/win/SUPDrv-win.cpp +@@ -2703,6 +2703,16 @@ SUPR0DECL(uint32_t) SUPR0GetKernelFeatur + return 0; + } + ++SUPR0DECL(bool) SUPR0FpuBegin(bool fCtxHook) ++{ ++ RT_NOREF(fCtxHook); ++ return false; ++} ++ ++SUPR0DECL(void) SUPR0FpuEnd(bool fCtxHook) ++{ ++ RT_NOREF(fCtxHook); ++} + + SUPR0DECL(int) SUPR0IoCtlSetupForHandle(PSUPDRVSESSION pSession, intptr_t hHandle, uint32_t fFlags, PSUPR0IOCTLCTX *ppCtx) + { +Index: VirtualBox-6.1.34/src/VBox/HostDrivers/Support/solaris/SUPDrv-solaris.c +=================================================================== +--- VirtualBox-6.1.34.orig/src/VBox/HostDrivers/Support/solaris/SUPDrv-solaris.c ++++ VirtualBox-6.1.34/src/VBox/HostDrivers/Support/solaris/SUPDrv-solaris.c +@@ -1309,3 +1309,15 @@ SUPR0DECL(uint32_t) SUPR0GetKernelFeatur + return 0; + } + ++SUPR0DECL(bool) SUPR0FpuBegin(bool fCtxHook) ++{ ++ RT_NOREF(fCtxHook); ++ return false; ++} ++ ++ ++SUPR0DECL(void) SUPR0FpuEnd(bool fCtxHook) ++{ ++ RT_NOREF(fCtxHook); ++} ++ +Index: VirtualBox-6.1.34/src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c +=================================================================== +--- VirtualBox-6.1.34.orig/src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c ++++ VirtualBox-6.1.34/src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c +@@ -1454,6 +1454,31 @@ SUPR0DECL(uint32_t) SUPR0GetKernelFeatur + } + + ++SUPR0DECL(bool) SUPR0FpuBegin(bool fCtxHook) ++{ ++ RT_NOREF(fCtxHook); ++#if RTLNX_VER_MIN(5,18,0) ++ kernel_fpu_begin(); ++ /* if (fCtxHook) */ ++ preempt_enable(); /* HACK ALERT! undo the implicit preempt_disable() in kernel_fpu_begin(). */ ++ return true; ++#else ++ return false; ++#endif ++} ++ ++ ++SUPR0DECL(void) SUPR0FpuEnd(bool fCtxHook) ++{ ++ RT_NOREF(fCtxHook); ++#if RTLNX_VER_MIN(5,18,0) ++ /* if (fCtxHook) */ ++ preempt_disable(); /* HACK ALERT! undo the implicit preempt_enable() in SUPR0FpuBegin(). */ ++ kernel_fpu_end(); ++#endif ++} ++ ++ + int VBOXCALL supdrvOSGetCurrentGdtRw(RTHCUINTPTR *pGdtRw) + { + #if RTLNX_VER_MIN(4,12,0) diff --git a/virtualbox.changes b/virtualbox.changes index 0997803..691053f 100644 --- a/virtualbox.changes +++ b/virtualbox.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Fri May 27 22:27:02 UTC 2022 - Larry Finger + +- Update fixes_for_kernel_5.18.patch to save and restore FPU status during interrupt. + The change fixes boo#1199803. + ------------------------------------------------------------------- Sat May 21 20:17:00 UTC 2022 - Ben Greiner diff --git a/virtualbox.spec b/virtualbox.spec index 7f4be5b..838d732 100644 --- a/virtualbox.spec +++ b/virtualbox.spec @@ -170,7 +170,6 @@ Patch142: fixes_for_leap15.3.patch Patch143: vb-6.1.16-modal-dialog-parent.patch Patch144: fixes_for_leap15.4.patch Patch145: fixes_for_kernel_5.18.patch -#Patch998: fix_warnings.patch Patch999: virtualbox-fix-ui-background-color.patch # # Common BuildRequires for both virtualbox and virtualbox-kmp @@ -296,6 +295,7 @@ the terms of the GNU Public License (GPL). ########################################## + %package qt Summary: Qt GUI part for %{name} Group: System/Emulators/PC @@ -314,6 +314,7 @@ This package contains the code for the GUI used to control VMs. ######################################### + %package websrv Summary: WebService GUI part for %{name} Group: System/Emulators/PC @@ -327,6 +328,7 @@ The VirtualBox web server is used to control headless VMs using a browser. ######################################### + %package guest-x11 Summary: VirtualBox X11 drivers for mouse and video Group: System/X11/Servers/XF86_4 @@ -342,6 +344,7 @@ This package contains X11 guest utilities and X11 guest mouse and video drivers ########################################### + %package guest-tools Summary: VirtualBox guest tools Group: System/Emulators/PC @@ -361,6 +364,7 @@ VirtualBox guest addition tools. ########################################### + %package -n python3-%{name} Summary: Python bindings for %{name} Group: Development/Libraries/Python @@ -380,6 +384,7 @@ Python XPCOM bindings to %{name}. Used e.g. by vboxgtk package. ########################################### + %package devel Summary: Devel files for %{name} Group: Development/Libraries/Other @@ -394,6 +399,7 @@ Development file for %{name} ########################################### + %package host-source Summary: Source files for %{name} host kernel modules Group: Development/Sources @@ -425,6 +431,7 @@ sudo %{_sbindir}/vboxguestconfig ########################################### + %package guest-desktop-icons Summary: Icons for guest desktop files Group: System/Emulators/PC @@ -437,6 +444,7 @@ This package contains icons for guest desktop files that were created on the des ########################################### + %package vnc Summary: VNC desktop sharing Group: System/Emulators/PC @@ -513,7 +521,6 @@ This package contains the kernel-modules that VirtualBox uses to create or run v %endif %patch143 -p1 %patch145 -p1 -#%patch998 -p1 # make VB UI background colors look sane again %patch999 -p1