@glimfindel
Zwei Bemerkungen zu Deinem ansonsten guten Vorschlag:
Der von Dir erwähnte kernel-6.19.patch patch bricht ab, da er
in /var/lib/dkms/virtualbox/7.2.6/source das vboxguest Unterverzeichnis
nicht findet, bevor er zu vboxnetadp und vboxnetflt kommt. Das lässt sich
aber durch Entfernen leicht korrigieren.
Außerdem ist die von Nepenthe0 zu recht beanstandete Logik nicht korrigiert,
was im Falle von undefiniertem CONFIG_KPROBES zum Abbruch führt (trifft
für den Siduction Kernel aber nicht zu).
Ich habe den vollständigen Patch gegen alle 6.18/6.19 Kernel und Kprobe Varianten
getestet, und konnte in keinem Fall einen Fehler feststellen. Wenn Bedarf besteht, kann
ich auch den vollständigen Patch gegen die 7.2.6 Sourcen zur Verfügung stellen, aber
ich hoffe immer noch, dass Oracle endlich die Korrektur vornimmt.
Nachtrag zur Installation des Patches:
Sicherstellen, dass Paket virtualbox-dkms in Version 7.2.6-dfsg-3+b2 installiert ist:
$ dpkg -l|grep virtualbox-dkms
ii virtualbox-dkms 7.2.6-dfsg-3+b2 amd64 x86 virtualization solution - kernel module sources for dkms
Ins Verzeichnis /usr/src wechseln:
$ cd /usr/src
Folgenden patch ins /tmp Verzeichnis kopieren:
diff -Nurp --no-dereference aaa/virtualbox-7.2.6/r0drv/linux/initterm-r0drv-linux.c bbb/virtualbox-7.2.6/r0drv/linux/initterm-r0drv-linux.c
--- aaa/virtualbox-7.2.6/r0drv/linux/initterm-r0drv-linux.c 2026-01-27 13:58:09.000000000 +0100
+++ bbb/virtualbox-7.2.6/r0drv/linux/initterm-r0drv-linux.c 2026-02-20 16:40:35.000000000 +0100
@@ -60,6 +60,11 @@ static DECLARE_TASK_QUEUE(g_rtR0LnxWorkQ
* This is a special mm structure used to manage the kernel address space. */
struct mm_struct *g_pLnxInitMm = NULL;
+#if RTLNX_VER_MIN(6,19,0)
+/** Pointer to __flush_tlb_all kernel symbol. */
+void (*g_pfnLinuxFlushTlbAll)(void);
+#endif
+
/**
* Pushes an item onto the IPRT work queue.
@@ -136,6 +141,11 @@ DECLHIDDEN(int) rtR0InitNative(void)
printk("rtR0InitNative: g_pLnxInitMm=%p\n", g_pLnxInitMm);
RTR0DbgKrnlInfoRelease(hKrnlInfo);
+# if RTLNX_VER_MIN(6,19,0)
+ g_pfnLinuxFlushTlbAll = __symbol_get("__flush_tlb_all");
+ if (!RT_VALID_PTR(g_pfnLinuxFlushTlbAll))
+ printk("rtR0InitNative: can't load __flush_tlb_all\n");
+# endif
}
else
printk("rtR0InitNative: RTR0DbgKrnlInfoOpen failed: %d\n", rc);
@@ -151,6 +161,12 @@ DECLHIDDEN(void) rtR0TermNative(void)
{
IPRT_LINUX_SAVE_EFL_AC();
+# if RTLNX_VER_MIN(6,19,0)
+ if (RT_VALID_PTR(g_pfnLinuxFlushTlbAll))
+ symbol_put_addr(g_pfnLinuxFlushTlbAll);
+ g_pfnLinuxFlushTlbAll = NULL;
+#endif
+
rtR0LnxWorkqueueFlush();
#if RTLNX_VER_MIN(2,5,41)
destroy_workqueue(g_prtR0LnxWorkQueue);
diff -Nurp --no-dereference aaa/virtualbox-7.2.6/r0drv/linux/memobj-r0drv-linux.c bbb/virtualbox-7.2.6/r0drv/linux/memobj-r0drv-linux.c
--- aaa/virtualbox-7.2.6/r0drv/linux/memobj-r0drv-linux.c 2026-01-27 13:58:09.000000000 +0100
+++ bbb/virtualbox-7.2.6/r0drv/linux/memobj-r0drv-linux.c 2026-02-20 16:41:06.000000000 +0100
@@ -2108,6 +2108,17 @@ DECLHIDDEN(int) rtR0MemObjNativeMapUser(
return rc;
}
+#if defined(IPRT_USE_ALLOC_VM_AREA_FOR_EXEC) || defined(IPRT_USE_APPLY_TO_PAGE_RANGE_FOR_EXEC)
+static void rtR0MemObjLinuxFlushTlbAll(void)
+{
+# if RTLNX_VER_MIN(6,19,0)
+ if (RT_LIKELY(RT_VALID_PTR(g_pfnLinuxFlushTlbAll)))
+ g_pfnLinuxFlushTlbAll();
+# else
+ __flush_tlb_all();
+# endif
+}
+#endif
DECLHIDDEN(int) rtR0MemObjNativeProtect(PRTR0MEMOBJINTERNAL pMem, size_t offSub, size_t cbSub, uint32_t fProt)
{
@@ -2128,7 +2139,7 @@ DECLHIDDEN(int) rtR0MemObjNativeProtect(
set_pte(papPtes[i], mk_pte(pMemLnx->apPages[i], fPg));
}
preempt_disable();
- __flush_tlb_all();
+ rtR0MemObjLinuxFlushTlbAll();
preempt_enable();
return VINF_SUCCESS;
}
@@ -2174,7 +2185,7 @@ DECLHIDDEN(int) rtR0MemObjNativeProtect(
flush_icache_range((uintptr_t)pMemLnx->Core.pv + offSub, cbSub);
# if defined(RT_ARCH_AMD64) || defined(RT_ARCH_X86) /* flush_tlb_kernel_range is not exported, but __flush_tlb_all is. */
preempt_disable();
- __flush_tlb_all();
+ rtR0MemObjLinuxFlushTlbAll();
preempt_enable();
# else
flush_tlb_kernel_range((uintptr_t)pMemLnx->Core.pv + offSub, cbSub);
diff -Nurp --no-dereference aaa/virtualbox-7.2.6/vboxdrv/linux/SUPDrv-linux.c bbb/virtualbox-7.2.6/vboxdrv/linux/SUPDrv-linux.c
--- aaa/virtualbox-7.2.6/vboxdrv/linux/SUPDrv-linux.c 2026-01-27 13:57:17.000000000 +0100
+++ bbb/virtualbox-7.2.6/vboxdrv/linux/SUPDrv-linux.c 2026-02-21 18:42:48.000000000 +0100
@@ -193,6 +193,12 @@ static void (*g_pfnKvmDi
/** Pointer to the KVM hardware specific module. */
struct module *g_pKvmHwvirtModule;
#endif
+# if RTLNX_VER_MIN(6,19,0)
+/** Function pointer to cr4_update_irqsoff(). */
+static void (*g_pfnCr4UpdateIrqsoff)(unsigned long set, unsigned long clear);
+/** Function pointer to cr4_read_shadow(). */
+static unsigned long (*g_pfnCr4ReadShadow)(void);
+# endif
/** Module parameter.
* Not prefixed because the name is used by macros and the end of this file. */
@@ -395,6 +401,28 @@ static int supdrvLinuxInitKvmSymbols(voi
void *pfnDisable = __symbol_get("kvm_disable_virtualization");
if (pfnDisable)
{
+# if RTLNX_VER_MIN(6,19,0)
+ void *pfnCr4UpdateIrqsoff = __symbol_get("cr4_update_irqsoff");
+ void *pfnRr4ReadShadow = __symbol_get("cr4_read_shadow");
+
+ if ( pfnCr4UpdateIrqsoff
+ && pfnRr4ReadShadow)
+ {
+ g_pfnCr4UpdateIrqsoff = pfnCr4UpdateIrqsoff;
+ g_pfnCr4ReadShadow = pfnRr4ReadShadow;
+
+ printk(KERN_INFO "vboxdrv: Found extra KVM hardware-virtualization symbols\n");
+ }
+ else
+ {
+ printk(KERN_WARNING "vboxdrv: Failed to find extra KVM hardware-virtualization symbols\n");
+
+ if (pfnCr4UpdateIrqsoff)
+ symbol_put_addr(pfnCr4UpdateIrqsoff);
+ if (pfnRr4ReadShadow)
+ symbol_put_addr(pfnRr4ReadShadow);
+ }
+#endif
/*
* Try to obtain a reference to kvm_intel/kvm_amd module in addition to the
* reference to the kvm module. If we fail, we will not try to use KVM for
@@ -466,6 +494,18 @@ static void supdrvLinuxTermKvmSymbols(vo
symbol_put_addr(g_pfnKvmDisableVirtualization);
g_pfnKvmDisableVirtualization = NULL;
}
+# if RTLNX_VER_MIN(6,19,0)
+ if (g_pfnCr4UpdateIrqsoff)
+ {
+ symbol_put_addr(g_pfnCr4UpdateIrqsoff);
+ g_pfnCr4UpdateIrqsoff = NULL;
+ }
+ if (g_pfnCr4ReadShadow)
+ {
+ symbol_put_addr(g_pfnCr4ReadShadow);
+ g_pfnCr4ReadShadow = NULL;
+ }
+#endif
if (g_pKvmHwvirtModule)
{
module_put(g_pKvmHwvirtModule);
@@ -1146,6 +1186,37 @@ SUPR0DECL(int) SUPDrvLinuxLdrDeregisterW
}
EXPORT_SYMBOL(SUPDrvLinuxLdrDeregisterWrappedModule);
+#if RTLNX_VER_MIN(5,8,0)
+/**
+ * Wrapper function for cr4_update_irqsoff() which was
+ * exported only for KVM starting from kernel 6.19.
+ */
+static void supdrvLinux_cr4_update_irqsoff(unsigned long set, unsigned long clear)
+{
+# if RTLNX_VER_MIN(6,19,0)
+ if (g_pfnCr4UpdateIrqsoff)
+ g_pfnCr4UpdateIrqsoff(set, clear);
+# else
+ cr4_update_irqsoff(set, clear);
+# endif
+}
+
+/**
+ * Wrapper function for supdrvLinux_cr4_read_shadow() which was
+ * exported only for KVM starting from kernel 6.19.
+ */
+static unsigned long supdrvLinux_cr4_read_shadow(void)
+{
+ unsigned long cr4 = 0;
+# if RTLNX_VER_MIN(6,19,0)
+ if (g_pfnCr4ReadShadow)
+ cr4 = g_pfnCr4ReadShadow();
+# else
+ cr4 = cr4_read_shadow();
+# endif
+ return cr4;
+}
+#endif /* 5.8.0 */
#if defined(RT_ARCH_AMD64) || defined(RT_ARCH_X86)
RTCCUINTREG VBOXCALL supdrvOSChangeCR4(RTCCUINTREG fOrMask, RTCCUINTREG fAndMask)
@@ -1153,10 +1224,10 @@ RTCCUINTREG VBOXCALL supdrvOSChangeCR4(R
# if RTLNX_VER_MIN(5,8,0)
unsigned long fSavedFlags;
local_irq_save(fSavedFlags);
- RTCCUINTREG const uOld = cr4_read_shadow();
- cr4_update_irqsoff(fOrMask, ~fAndMask); /* Same as this function, only it is not returning the old value. */
- AssertMsg(cr4_read_shadow() == ((uOld & fAndMask) | fOrMask),
- ("fOrMask=%#RTreg fAndMask=%#RTreg uOld=%#RTreg; new cr4=%#llx\n", fOrMask, fAndMask, uOld, cr4_read_shadow()));
+ RTCCUINTREG const uOld = supdrvLinux_cr4_read_shadow();
+ supdrvLinux_cr4_update_irqsoff(fOrMask, ~fAndMask); /* Same as this function, only it is not returning the old value. */
+ AssertMsg(supdrvLinux_cr4_read_shadow() == ((uOld & fAndMask) | fOrMask),
+ ("fOrMask=%#RTreg fAndMask=%#RTreg uOld=%#RTreg; new cr4=%#llx\n", fOrMask, fAndMask, uOld, supdrvLinux_cr4_read_shadow()));
local_irq_restore(fSavedFlags);
# else
# if RTLNX_VER_MIN(3,20,0)
Patch anwenden:
$ sudo patch -p1 < /tmp/patch
Neu übersetzen:
$ sudo dpkg-reconfigure virtualbox-dkms
$ sudo depmod -a
HTH