Code change:
<del> Index: include/VBox/sup.h =================================================================== --- trunk/include/VBox/sup.h	(revision 151556) +++ trunk/include/VBox/sup.h	(working copy) @@ -2142,6 +2142,26 @@ */ SUPR0DECL(uint32_t) SUPR0GetKernelFeatures(void); +/** + * 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); Index: src/VBox/Additions/linux/sharedfolders/regops.c =================================================================== --- trunk/src/VBox/Additions/linux/sharedfolders/regops.c	(revision 151556) +++ trunk/src/VBox/Additions/linux/sharedfolders/regops.c	(working copy) @@ -3823,7 +3823,9 @@ .readpage       = vbsf_readpage, .writepage      = vbsf_writepage, /** @todo Need .writepages if we want msync performance...  */ -#if RTLNX_VER_MIN(2,5,12) +#if RTLNX_VER_MIN(5,18,0) +    .dirty_folio = filemap_dirty_folio, +#elif RTLNX_VER_MIN(2,5,12) .set_page_dirty = __set_page_dirty_buffers, #endif #if RTLNX_VER_MIN(5,14,0) Index: src/VBox/Additions =================================================================== --- trunk/src/VBox/Additions	(revision 151556) +++ trunk/src/VBox/Additions	(working copy) Property changes on: src/VBox/Additions ___________________________________________________________________ Modified: svn:mergeinfo ## -0,0 +0,1 ## Merged /trunk/src/VBox/Additions:r150844 Index: src/VBox/HostDrivers/Support/SUPDrv.cpp =================================================================== --- trunk/src/VBox/HostDrivers/Support/SUPDrv.cpp	(revision 151556) +++ trunk/src/VBox/HostDrivers/Support/SUPDrv.cpp	(working copy) @@ -98,6 +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: @@ -266,6 +278,8 @@ SUPEXP_STK_BACK(    2,  SUPR0ContFree), SUPEXP_STK_BACK(    2,  SUPR0ChangeCR4), SUPEXP_STK_BACK(    1,  SUPR0EnableVTx), +    SUPEXP_STK_OKAY(    1,  SUPR0FpuBegin), +    SUPEXP_STK_OKAY(    1,  SUPR0FpuEnd), SUPEXP_STK_BACK(    0,  SUPR0SuspendVTxOnCpu), SUPEXP_STK_BACK(    1,  SUPR0ResumeVTxOnCpu), SUPEXP_STK_OKAY(    1,  SUPR0GetCurrentGdtRw), @@ -1742,7 +1756,7 @@ /* execute */ pReq->u.Out.cFunctions = RT_ELEMENTS(g_aFunctions); -            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; } Index: src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp =================================================================== --- trunk/src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp	(revision 151556) +++ trunk/src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp	(working copy) @@ -2002,6 +2002,18 @@ } +SUPR0DECL(bool) SUPR0FpuBegin(bool fCtxHook) +{ +    RT_NOREF(fCtxHook); +    return false; +} + + +SUPR0DECL(void) SUPR0FpuEnd(bool fCtxHook) +{ +    RT_NOREF(fCtxHook); +} + /* * * org_virtualbox_SupDrv Index: src/VBox/HostDrivers/Support/freebsd/SUPDrv-freebsd.c =================================================================== --- trunk/src/VBox/HostDrivers/Support/freebsd/SUPDrv-freebsd.c	(revision 151556) +++ trunk/src/VBox/HostDrivers/Support/freebsd/SUPDrv-freebsd.c	(working copy) @@ -640,3 +640,16 @@ return 0; } + +SUPR0DECL(bool) SUPR0FpuBegin(bool fCtxHook) +{ +    RT_NOREF(fCtxHook); +    return false; +} + + +SUPR0DECL(void) SUPR0FpuEnd(bool fCtxHook) +{ +    RT_NOREF(fCtxHook); +} + Index: src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c =================================================================== --- trunk/src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c	(revision 151556) +++ trunk/src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c	(working copy) @@ -1454,6 +1454,31 @@ } +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) Index: src/VBox/HostDrivers/Support/os2/SUPDrv-os2.cpp =================================================================== --- trunk/src/VBox/HostDrivers/Support/os2/SUPDrv-os2.cpp	(revision 151556) +++ trunk/src/VBox/HostDrivers/Support/os2/SUPDrv-os2.cpp	(working copy) @@ -541,3 +541,16 @@ return 0; } + +SUPR0DECL(bool) SUPR0FpuBegin(bool fCtxHook) +{ +    RT_NOREF(fCtxHook); +    return false; +} + + +SUPR0DECL(void) SUPR0FpuEnd(bool fCtxHook) +{ +    RT_NOREF(fCtxHook); +} + Index: src/VBox/HostDrivers/Support/solaris/SUPDrv-solaris.c =================================================================== --- trunk/src/VBox/HostDrivers/Support/solaris/SUPDrv-solaris.c	(revision 151556) +++ trunk/src/VBox/HostDrivers/Support/solaris/SUPDrv-solaris.c	(working copy) @@ -1309,3 +1309,16 @@ return 0; } + +SUPR0DECL(bool) SUPR0FpuBegin(bool fCtxHook) +{ +    RT_NOREF(fCtxHook); +    return false; +} + + +SUPR0DECL(void) SUPR0FpuEnd(bool fCtxHook) +{ +    RT_NOREF(fCtxHook); +} + Index: src/VBox/HostDrivers/Support/win/SUPDrv-win.cpp =================================================================== --- trunk/src/VBox/HostDrivers/Support/win/SUPDrv-win.cpp	(revision 151556) +++ trunk/src/VBox/HostDrivers/Support/win/SUPDrv-win.cpp	(working copy) @@ -2704,6 +2704,19 @@ } +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: src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c =================================================================== --- trunk/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c	(revision 151556) +++ trunk/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c	(working copy) @@ -2311,7 +2311,13 @@ vboxNetFltDumpPacket(pSG, true, "host", (fDst & INTNETTRUNKDIR_WIRE) ? 0 : 1); Log6(("vboxNetFltPortOsXmit: pBuf->cb dump:n%.*Rhxdn", sizeof(pBuf->cb), pBuf->cb)); Log6(("vboxNetFltPortOsXmit: netif_rx_ni(%p)n", pBuf)); +#if RTLNX_VER_MIN(5,18,0) +                local_bh_disable(); +                err = netif_rx(pBuf); +                local_bh_enable(); +#else err = netif_rx_ni(pBuf); +#endif if (err) rc = RTErrConvertFromErrno(err); } Index: src/VBox/VMM/VMMR0/CPUMR0.cpp =================================================================== --- trunk/src/VBox/VMM/VMMR0/CPUMR0.cpp	(revision 151556) +++ trunk/src/VBox/VMM/VMMR0/CPUMR0.cpp	(working copy) @@ -440,6 +440,9 @@ 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)); @@ -484,6 +487,9 @@ Assert(ASMGetCR4() & X86_CR4_OSFXSR); if (pVCpu->cpum.s.fUseFlags & (CPUM_USED_FPU_GUEST | CPUM_USED_FPU_HOST)) { +        /* Notify the support driver prior to loading the host-FPU register state. */ +        SUPR0FpuEnd(false /* unused */); + fSavedGuest = RT_BOOL(pVCpu->cpum.s.fUseFlags & CPUM_USED_FPU_GUEST); if (!(pVCpu->cpum.s.fUseFlags & CPUM_USED_MANUAL_XMM_RESTORE)) cpumR0SaveGuestRestoreHostFPUState(&pVCpu->cpum.s); </del>

Related discussion:
text: I observed the bug on three different machines (two desktop machines with NixOS 22.05 and NixOS 21.11, and one laptop with NixOS 21.11). I was also able to reproduce the bug with a linux live cd inside the guest. So the bug can probably be triggered by any linux in the guest. I haven't, however, tried with anything else (e.g. Windows). I was also able to reproduce the bug with a live iso based on (currently ), i.e., with virtualbox 6.1.30 (as opposed to virtualbox 6.1.34 from , currently ). By default, the virtual disk controller has it's checkmark "Use Host I/O cache" turned off in the vm config dialog. Turning it on doesn't help (). I cannot reproduce the bug with these linux kernel versions (all checked with current ) (4.19.247) (5.4.198) (5.18.4) So users of these kernel branches are safe ... until the breaking kernel patch also reaches these branches. <details<summaryFor the record: This is the build recipe I'm using for the live iso</summary<p</p</detailsMaybe I can try to bisect inside the kernel sources, but the compile-reboot-test cycle is quite slow on my machine. Strangely, I cannot find any reports about similar behaviour. The closest report might be . It would be interesting for me if this bug can be reproduced/verified by someone else. I'm not sure if this should be considered a kernel bug (the kernel should probably not change the way disk writes are handled), or a virtualbox bug (at the moment I don't know of any other software affected). kernel maintainer team: virtualbox maintainer: (by the way: I'm surprised there's only one maintainer for virtualbox. Thanks for your good work, ; I'm a heavy user!) This is my production system, which also shows that bug. But I did most of the tests to reproduce the bug and narrow down the cause with live iso images based on current ().
I bisected the linux kernel tree to find as the cause for the guest data corruption. Googling the commit's hash leads to this issue in the VirtualBox bug tracker.