summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorFelix Golatofski2020-01-08 21:31:47 +0100
committerFelix Golatofski2020-01-08 21:31:47 +0100
commit5511a27639e144b70210e9e3ca382414d9b10b78 (patch)
tree98a11df9b606cc40e75aa713bb692928bf18b73c
parenta7eb99cddf7842a7fb92478846b67394e6f572c2 (diff)
downloadaur-vmware-patch.tar.gz
Integrated patch
-rw-r--r--.SRCINFO8
-rw-r--r--PKGBUILD11
-rw-r--r--vmci-14.1.7-5.4.patch298
-rw-r--r--vmmon-14.1.7-5.4.patch349
-rw-r--r--vmnet-14.1.7-5.4.patch152
5 files changed, 815 insertions, 3 deletions
diff --git a/.SRCINFO b/.SRCINFO
index 7072ac5c04ed..26ac5641a7b2 100644
--- a/.SRCINFO
+++ b/.SRCINFO
@@ -1,7 +1,7 @@
pkgbase = vmware-patch
pkgdesc = A post-install configuration solution for VMware Workstation (Pro) and Player (Plus and Pro)
pkgver = 15.5.1
- pkgrel = 1
+ pkgrel = 2
url = https://wiki.archlinux.org/index.php/VMware#Configuration
install = vmware-patch.install
arch = i686
@@ -22,6 +22,9 @@ pkgbase = vmware-patch
source = vmnet-15.5.1-5.3.patch
source = vmmon-15.5.0-5.3.patch
source = vmnet-15.5.0-5.3.patch
+ source = vmci-14.1.7-5.4.patch
+ source = vmmon-14.1.7-5.4.patch
+ source = vmnet-14.1.7-5.4.patch
source = vmmon-14.0.0-4.13.3.patch
source = vmnet-14.0.0-4.13.3.patch
source = vmci-14.0.0-4.13.3.patch
@@ -63,6 +66,9 @@ pkgbase = vmware-patch
md5sums = 7c074a0cb0e23a3d79f804f833d7cc67
md5sums = c78abd731e4095144e66a5ace41a4c5e
md5sums = 7c074a0cb0e23a3d79f804f833d7cc67
+ md5sums = b0c6d50f8a9ffde70661fb3c3123b7c5
+ md5sums = 187566044705c13c996396616cac8730
+ md5sums = 7873b226fa7eda7c94be3cf7eddb3250
md5sums = 3c165edb6847fc9bfa04657f346ac4cc
md5sums = eca2542e4c484ea2ca06b7e9c065b8af
md5sums = ced58cf32a21adfe21d612366c52116a
diff --git a/PKGBUILD b/PKGBUILD
index bb379ab798ae..afefc9f8d408 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -1,9 +1,9 @@
# Maintainer: slurpee <aur@lylat.io>
-# Contributors: Ben White, Igor Duarte Cardoso, haagch, Olivier Médoc, Rains, Det
+# Contributors: Ben White, Igor Duarte Cardoso, haagch, Olivier Médoc, Rains, Det, Maciej Suminski
pkgname=vmware-patch
pkgver=15.5.1
-pkgrel=1
+pkgrel=2
pkgdesc="A post-install configuration solution for VMware Workstation (Pro) and Player (Plus and Pro)"
arch=('i686' 'x86_64')
url="https://wiki.archlinux.org/index.php/VMware#Configuration"
@@ -18,6 +18,10 @@ source=('vmware-patch.sh' 'vmware-unpatch.sh' 'common-functions.sh' 'vmware.serv
# Workstation Pro/Player 15.5.0
'vmmon-15.5.0-5.3.patch'
'vmnet-15.5.0-5.3.patch'
+ # Workstation Pro/Player 14.1.7
+ 'vmci-14.1.7-5.4.patch'
+ 'vmmon-14.1.7-5.4.patch'
+ 'vmnet-14.1.7-5.4.patch'
# Workstation Pro/Player 14.0.0
'vmmon-14.0.0-4.13.3.patch'
'vmnet-14.0.0-4.13.3.patch'
@@ -91,6 +95,9 @@ md5sums=('eea90d7b8053d996d6e02653409a3634'
'7c074a0cb0e23a3d79f804f833d7cc67'
'c78abd731e4095144e66a5ace41a4c5e'
'7c074a0cb0e23a3d79f804f833d7cc67'
+ 'b0c6d50f8a9ffde70661fb3c3123b7c5'
+ '187566044705c13c996396616cac8730'
+ '7873b226fa7eda7c94be3cf7eddb3250'
'3c165edb6847fc9bfa04657f346ac4cc'
'eca2542e4c484ea2ca06b7e9c065b8af'
'ced58cf32a21adfe21d612366c52116a'
diff --git a/vmci-14.1.7-5.4.patch b/vmci-14.1.7-5.4.patch
new file mode 100644
index 000000000000..20dfc0e344d6
--- /dev/null
+++ b/vmci-14.1.7-5.4.patch
@@ -0,0 +1,298 @@
+diff --git a/Makefile b/Makefile
+index 2c1667b..ba80cb0 100644
+--- vmci-only/Makefile
++++ vmci-only/Makefile
+@@ -107,7 +107,7 @@ prebuild:: ;
+ postbuild:: ;
+
+ $(DRIVER_KO): prebuild
+- $(MAKE) -C $(BUILD_DIR) SUBDIRS=$$PWD SRCROOT=$$PWD/$(SRCROOT) \
++ $(MAKE) -C $(BUILD_DIR) M=$$PWD SRCROOT=$$PWD/$(SRCROOT) \
+ MODULEBUILDDIR=$(MODULEBUILDDIR) modules
+ $(MAKE) -C $$PWD SRCROOT=$$PWD/$(SRCROOT) \
+ MODULEBUILDDIR=$(MODULEBUILDDIR) postbuild
+diff --git a/linux/driver.c b/linux/driver.c
+index 8ab2064..c0b8328 100644
+--- vmci-only/linux/driver.c
++++ vmci-only/linux/driver.c
+@@ -26,6 +26,7 @@
+
+ #include <linux/file.h>
+ #include <linux/fs.h>
++#include <linux/vmalloc.h>
+ #include <linux/init.h>
+ #if defined(__x86_64__) && LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 12)
+ # include <linux/ioctl32.h>
+@@ -33,6 +34,7 @@
+ asmlinkage __attribute__((weak)) long
+ sys_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg);
+ #endif
++
+ #include <linux/miscdevice.h>
+ #include <linux/moduleparam.h>
+ #include <linux/poll.h>
+@@ -1437,7 +1439,7 @@ static INLINE Bool
+ VMCIUserVAInvalidPointer(VA uva, // IN:
+ size_t size) // IN:
+ {
+- return !access_ok(VERIFY_WRITE, (void *)uva, size);
++ return !access_ok((void *)uva, size);
+ }
+
+
+@@ -1467,11 +1469,19 @@ VMCIUserVALockPage(VA addr) // IN:
+
+ down_read(&current->mm->mmap_sem);
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 6, 0)
+- retval = get_user_pages(addr, 1, 1, 0, &page, NULL);
++ retval = get_user_pages(addr,
+ #else
+ retval = get_user_pages(current, current->mm, addr,
+ 1, 1, 0, &page, NULL);
+ #endif
++ 1,
++#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 9, 0)
++ 1, 0,
++#else
++ FOLL_WRITE,
++#endif
++ &page, NULL);
++
+ up_read(&current->mm->mmap_sem);
+
+ if (retval != 1) {
+@@ -1686,7 +1696,7 @@ vmci_guest_init(void)
+ /* This should be last to make sure we are done initializing. */
+ retval = pci_register_driver(&vmci_driver);
+ if (retval < 0) {
+- vfree(data_buffer);
++ kvfree(data_buffer);
+ data_buffer = NULL;
+ return retval;
+ }
+@@ -1721,13 +1731,26 @@ vmci_enable_msix(struct pci_dev *pdev) // IN
+ vmci_dev.msix_entries[i].entry = i;
+ vmci_dev.msix_entries[i].vector = i;
+ }
+-
++#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 12, 0)
+ result = pci_enable_msix(pdev, vmci_dev.msix_entries, VMCI_MAX_INTRS);
+ if (!result) {
+ vmci_dev.exclusive_vectors = TRUE;
+ } else if (result > 0) {
+ result = pci_enable_msix(pdev, vmci_dev.msix_entries, 1);
+ }
++#else
++ result = pci_enable_msix_range(pdev, vmci_dev.msix_entries, VMCI_MAX_INTRS,
++ VMCI_MAX_INTRS);
++ if (result > 0) {
++ vmci_dev.exclusive_vectors = TRUE;
++ } else if (result == -ENOSPC) {
++ result = pci_enable_msix_range(pdev, vmci_dev.msix_entries, 1, 1);
++ }
++
++ if (result > 0)
++ result = 0;
++#endif
++
+ return result;
+ }
+
+@@ -2480,7 +2503,7 @@ vmci_exit(void)
+
+ if (guestDeviceInit) {
+ pci_unregister_driver(&vmci_driver);
+- vfree(data_buffer);
++ kvfree(data_buffer);
+ data_buffer = NULL;
+ guestDeviceInit = FALSE;
+ }
+@@ -2490,7 +2513,7 @@ vmci_exit(void)
+
+ VMCI_HostCleanup();
+
+- retval = misc_deregister(&linuxState.misc);
++ retval = compat_misc_deregister(&linuxState.misc);
+ if (retval) {
+ Warning(LGPFX "Module %s: error unregistering\n", VMCI_MODULE_NAME);
+ } else {
+diff --git a/linux/vmciKernelIf.c b/linux/vmciKernelIf.c
+index 2b274a0..5e8a9e9 100644
+--- vmci-only/linux/vmciKernelIf.c
++++ vmci-only/linux/vmciKernelIf.c
+@@ -40,6 +40,10 @@
+ #include <linux/socket.h> /* For memcpy_{to,from}iovec(). */
+ #include <linux/vmalloc.h>
+ #include <linux/wait.h>
++#include <linux/skbuff.h>
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
++#include <linux/sched/signal.h>
++#endif
+
+ #include "compat_highmem.h"
+ #include "compat_interrupt.h"
+@@ -1196,21 +1200,21 @@ __VMCIMemcpyToQueue(VMCIQueue *queue, // OUT:
+ } else {
+ toCopy = size - bytesCopied;
+ }
+-
++ /* Code cloned from kernels drivers/misc/vmw_vmci/vmci_queue_pair.c */
+ if (isIovec) {
+- struct iovec *iov = (struct iovec *)src;
+- int err;
+-
+- /* The iovec will track bytesCopied internally. */
+- err = memcpy_fromiovec((uint8 *)va + pageOffset, iov, toCopy);
+- if (err != 0) {
+- if (kernelIf->host) {
+- kunmap(kernelIf->u.h.page[pageIndex]);
++ struct msghdr *msg = (struct msghdr *)src;
++ int err;
++
++ /* The iovec will track bytes_copied internally. */
++ err = memcpy_from_msg((u8 *)va + pageOffset, msg, toCopy);
++ if (err != 0) {
++ if (kernelIf->host)
++ kunmap(kernelIf->u.h.page[pageIndex]);
++ return VMCI_ERROR_INVALID_ARGS;
+ }
+- return VMCI_ERROR_INVALID_ARGS;
+- }
+- } else {
+- memcpy((uint8 *)va + pageOffset, (uint8 *)src + bytesCopied, toCopy);
++ } else {
++ memcpy((u8 *)va + pageOffset,
++ (u8 *)src + bytesCopied, toCopy);
+ }
+
+ bytesCopied += toCopy;
+@@ -1273,11 +1277,11 @@ __VMCIMemcpyFromQueue(void *dest, // OUT:
+ }
+
+ if (isIovec) {
+- struct iovec *iov = (struct iovec *)dest;
++ struct msghdr *msg = (struct msghdr *)dest;
+ int err;
+
+ /* The iovec will track bytesCopied internally. */
+- err = memcpy_toiovec(iov, (uint8 *)va + pageOffset, toCopy);
++ err = memcpy_to_msg(msg, (uint8 *)va + pageOffset, toCopy);
+ if (err != 0) {
+ if (kernelIf->host) {
+ kunmap(kernelIf->u.h.page[pageIndex]);
+@@ -1834,7 +1838,11 @@ VMCIReleasePages(struct page **pages, // IN
+ if (dirty) {
+ set_page_dirty(pages[i]);
+ }
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 5, 99)
++ put_page(pages[i]);
++#else
+ page_cache_release(pages[i]);
++#endif
+ pages[i] = NULL;
+ }
+ }
+@@ -2050,19 +2058,20 @@ VMCIHost_GetUserMemory(VA64 produceUVA, // IN
+ down_write(&current->mm->mmap_sem);
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 6, 0)
+ retval = get_user_pages((VA)produceUVA,
+- produceQ->kernelIf->numPages,
+- 1, 0,
+- produceQ->kernelIf->u.h.headerPage,
+- NULL);
+ #else
+ retval = get_user_pages(current,
+ current->mm,
+ (VA)produceUVA,
++#endif
+ produceQ->kernelIf->numPages,
++#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 9, 0)
+ 1, 0,
++#else
++ FOLL_WRITE,
++#endif
+ produceQ->kernelIf->u.h.headerPage,
+ NULL);
+-#endif
++
+ if (retval < produceQ->kernelIf->numPages) {
+ Log("get_user_pages(produce) failed (retval=%d)\n", retval);
+ VMCIReleasePages(produceQ->kernelIf->u.h.headerPage, retval, FALSE);
+@@ -2070,13 +2079,22 @@ VMCIHost_GetUserMemory(VA64 produceUVA, // IN
+ goto out;
+ }
+
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 6, 0)
++ retval = get_user_pages((VA)consumeUVA,
++#else
+ retval = get_user_pages(current,
+ current->mm,
+ (VA)consumeUVA,
++#endif
+ consumeQ->kernelIf->numPages,
++#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 9, 0)
+ 1, 0,
++#else
++ FOLL_WRITE,
++#endif
+ consumeQ->kernelIf->u.h.headerPage,
+ NULL);
++
+ if (retval < consumeQ->kernelIf->numPages) {
+ Log("get_user_pages(consume) failed (retval=%d)\n", retval);
+ VMCIReleasePages(consumeQ->kernelIf->u.h.headerPage, retval, FALSE);
+diff --git a/shared/compat_module.h b/shared/compat_module.h
+index 2af7372..de1713d 100644
+--- vmci-only/shared/compat_module.h
++++ vmci-only/shared/compat_module.h
+@@ -79,5 +79,12 @@ static const char __module_cat(tag, __LINE__)[] \
+ #else
+ typedef int compat_mod_param_bool;
+ #endif
+-
++/*
++ * Linux kernel >= 4.2.99 does not return anything from misc_deregister
++ */
++#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 3, 0)
++#define compat_misc_deregister(misc) misc_deregister(misc)
++#else
++#define compat_misc_deregister(misc) ({misc_deregister(misc);0;})
++#endif
+ #endif /* __COMPAT_MODULE_H__ */
+diff --git a/shared/vm_device_version.h b/shared/vm_device_version.h
+index ab396bc..f17a892 100644
+--- vmci-only/shared/vm_device_version.h
++++ vmci-only/shared/vm_device_version.h
+@@ -53,7 +53,9 @@
+ * VMware HD Audio codec
+ * VMware HD Audio controller
+ */
++#ifndef PCI_VENDOR_ID_VMWARE
+ #define PCI_VENDOR_ID_VMWARE 0x15AD
++#endif
+ #define PCI_DEVICE_ID_VMWARE_SVGA2 0x0405
+ #define PCI_DEVICE_ID_VMWARE_SVGA 0x0710
+ #define PCI_DEVICE_ID_VMWARE_VGA 0x0711
+@@ -70,7 +72,9 @@
+ #define PCI_DEVICE_ID_VMWARE_1394 0x0780
+ #define PCI_DEVICE_ID_VMWARE_BRIDGE 0x0790
+ #define PCI_DEVICE_ID_VMWARE_ROOTPORT 0x07A0
++#ifndef PCI_DEVICE_ID_VMWARE_VMXNET3
+ #define PCI_DEVICE_ID_VMWARE_VMXNET3 0x07B0
++#endif
+ #define PCI_DEVICE_ID_VMWARE_PVSCSI 0x07C0
+ #define PCI_DEVICE_ID_VMWARE_82574 0x07D0
+ #define PCI_DEVICE_ID_VMWARE_AHCI 0x07E0
+diff --git a/shared/vmci_kernel_if.h b/shared/vmci_kernel_if.h
+index ef9eb82..dbd3f5e 100644
+--- vmci-only/shared/vmci_kernel_if.h
++++ vmci-only/shared/vmci_kernel_if.h
+@@ -100,7 +100,7 @@ extern "C" {
+ typedef Semaphore VMCIEvent;
+ typedef Semaphore VMCIMutex;
+ typedef World_ID VMCIHostVmID;
+- typedef uint32 VMCIHostUser;
++ typedef uint32_t VMCIHostUser;
+ typedef PPN *VMCIQPGuestMem;
+ #elif defined(__linux__)
+ typedef spinlock_t VMCILock;
diff --git a/vmmon-14.1.7-5.4.patch b/vmmon-14.1.7-5.4.patch
new file mode 100644
index 000000000000..f26e192ca73f
--- /dev/null
+++ b/vmmon-14.1.7-5.4.patch
@@ -0,0 +1,349 @@
+diff --git a/Makefile b/Makefile
+index ccdd295..b4b71fb 100644
+--- vmmon-only/Makefile
++++ vmmon-only/Makefile
+@@ -107,7 +107,7 @@ prebuild:: ;
+ postbuild:: ;
+
+ $(DRIVER_KO): prebuild
+- $(MAKE) -C $(BUILD_DIR) SUBDIRS=$$PWD SRCROOT=$$PWD/$(SRCROOT) \
++ $(MAKE) -C $(BUILD_DIR) M=$$PWD SRCROOT=$$PWD/$(SRCROOT) \
+ MODULEBUILDDIR=$(MODULEBUILDDIR) modules
+ $(MAKE) -C $$PWD SRCROOT=$$PWD/$(SRCROOT) \
+ MODULEBUILDDIR=$(MODULEBUILDDIR) postbuild
+diff --git a/Makefile.kernel b/Makefile.kernel
+index 385068d..a2e5911 100644
+--- vmmon-only/Makefile.kernel
++++ vmmon-only/Makefile.kernel
+@@ -31,7 +31,7 @@ $(DRIVER)-y := $(subst $(SRCROOT)/, , $(patsubst %.c, %.o, \
+ $(SRCROOT)/bootstrap/*.c)))
+
+ clean:
+- rm -rf $(wildcard $(DRIVER).mod.c $(DRIVER).ko .tmp_versions \
++ rm -rf $(wildcard $(DRIVER).mod.c $(DRIVER).ko .tmp_versions .cache.mk \
+ Module.symvers Modules.symvers Module.markers modules.order \
+ $(foreach dir,linux/ common/ vmcore/ bootstrap/ \
+ ./,$(addprefix $(dir),.*.cmd .*.o.flags *.o)))
+diff --git a/common/task.c b/common/task.c
+index 98cc74a..400ebfe 100644
+--- vmmon-only/common/task.c
++++ vmmon-only/common/task.c
+@@ -2203,12 +2203,23 @@ TaskSwitchToMonitor(VMCrossPage *crosspage)
+ {
+ uint64 raxGetsWiped, rcxGetsWiped;
+
++#ifdef CALL_NOSPEC
++ __asm__ __volatile__(CALL_NOSPEC
++ : "=a" (raxGetsWiped),
++ "=c" (rcxGetsWiped)
++ : "0" (codePtr),
++ "1" (crosspage),
++ THUNK_TARGET(codePtr)
++ : "rdx", "r8", "r9", "r10", "r11", "cc", "memory");
++#else
+ __asm__ __volatile__("call *%%rax"
+ : "=a" (raxGetsWiped),
+ "=c" (rcxGetsWiped)
+ : "0" (codePtr),
+ "1" (crosspage)
+ : "rdx", "r8", "r9", "r10", "r11", "cc", "memory");
++#endif
++
+ }
+ #elif defined(_MSC_VER)
+ /*
+diff --git a/include/compat_poll.h b/include/compat_poll.h
+new file mode 100644
+index 0000000..562cdb6
+--- /dev/null
++++ vmmon-only/include/compat_poll.h
+@@ -0,0 +1,30 @@
++#ifndef __COMPAT_POLL_H__
++#define __COMPAT_POLL_H__
++
++#include <linux/poll.h>
++
++#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 18, 0))
++
++#ifndef __poll_t
++typedef unsigned int __poll_t;
++#endif
++
++static inline __poll_t compat_vfs_poll(struct file *file,
++ struct poll_table_struct *pt)
++{
++ if (unlikely(!file->f_op->poll))
++ return DEFAULT_POLLMASK;
++ return file->f_op->poll(file, pt);
++}
++
++#else
++
++static inline __poll_t compat_vfs_poll(struct file *file,
++ struct poll_table_struct *pt)
++{
++ return vfs_poll(file, pt);
++}
++
++#endif
++
++#endif /* __COMPAT_POLL_H__ */
+diff --git a/include/hashFunc.h b/include/hashFunc.h
+index fec7261..eb0d4eb 100644
+--- vmmon-only/include/hashFunc.h
++++ vmmon-only/include/hashFunc.h
+@@ -251,6 +251,7 @@ static INLINE ub8 hash2(register const ub8 *k, /* the key */
+ {
+ /* c is reserved for the length */
+ case 2: b+=k[1];
++ /* fall through */
+ case 1: a+=k[0];
+ /* case 0: nothing left to add */
+ }
+diff --git a/include/vm_assert.h b/include/vm_assert.h
+index 8cdbc93..b869def 100644
+--- vmmon-only/include/vm_assert.h
++++ vmmon-only/include/vm_assert.h
+@@ -67,6 +67,7 @@ extern "C" {
+ #if defined (VMKPANIC)
+ #include "vmk_assert.h"
+ #else /* !VMKPANIC */
++#include <linux/kernel.h>
+ #define _ASSERT_PANIC(name) \
+ Panic(_##name##Fmt "\n", __FILE__, __LINE__)
+ #define _ASSERT_PANIC_BUG(bug, name) \
+@@ -107,7 +108,7 @@ NORETURN void Panic_NoSave(const char *fmt, ...) PRINTF_DECL(1, 2);
+ } while(0)
+
+ #else
+-NORETURN void Panic(const char *fmt, ...) PRINTF_DECL(1, 2);
++#define Panic panic
+ #endif
+
+ void LogThrottled(uint32 *count, const char *fmt, ...) PRINTF_DECL(2, 3);
+diff --git a/include/x86_basic_defs.h b/include/x86_basic_defs.h
+index abfb0b8..8c7566f 100644
+--- vmmon-only/include/x86_basic_defs.h
++++ vmmon-only/include/x86_basic_defs.h
+@@ -35,6 +35,8 @@
+ #define INCLUDE_ALLOW_VMCORE
+ #include "includeCheck.h"
+
++#include <asm/processor-flags.h>
++
+ #define X86_MAX_INSTR_LEN 15 /* Max byte length of an x86 instruction. */
+
+ #define NUM_IDT_VECTORS 256
+@@ -75,7 +77,9 @@
+ #define CR3_PDB_MASK 0xfffff000
+ #define CR3_IGNORE 0xFFF
+ #define PAE_CR3_IGNORE 0x1F
++#ifndef CR3_PCID_MASK
+ #define CR3_PCID_MASK 0xFFF
++#endif
+ #define CR3_NO_FLUSH (1ULL << 63)
+
+ #define CR4_VME 0x00000001
+diff --git a/include/x86msr.h b/include/x86msr.h
+index 6e11bb6..cf9a976 100644
+--- vmmon-only/include/x86msr.h
++++ vmmon-only/include/x86msr.h
+@@ -24,6 +24,7 @@
+
+ #ifndef _X86MSR_H_
+ #define _X86MSR_H_
++#include <asm/msr-index.h>
+ #define INCLUDE_ALLOW_USERLEVEL
+ #define INCLUDE_ALLOW_VMX
+
+@@ -126,7 +127,9 @@ MSRQuery;
+ #define MSR_SPEC_CTRL_STIBP (1UL << 1)
+ #define MSR_PRED_CMD_IBPB (1UL << 0)
+
++#ifndef MSR_MISC_FEATURES_ENABLES
+ #define MSR_MISC_FEATURES_ENABLES 0x140
++#endif
+
+ /* Intel Core Architecture and later: use only architected counters. */
+ #define IA32_MSR_PERF_CAPABILITIES 0x345
+@@ -450,7 +453,9 @@ typedef enum {
+ #define MSR_K7_HWCR_SSEDIS 0x00008000ULL // Disable SSE bit
+ #define MSR_K7_HWCR_MONMWAITUSEREN 0x00000400ULL // Enable MONITOR/MWAIT CPL>0
+ #define MSR_K7_HWCR_TLBFFDIS 0x00000040ULL // Disable TLB Flush Filter
++#ifndef MSR_K7_HWCR_SMMLOCK
+ #define MSR_K7_HWCR_SMMLOCK 0x00000001ULL // Lock SMM environment
++#endif
+
+ #ifndef MSR_K8_SYSCFG
+ #define MSR_K8_SYSCFG 0xc0010010
+@@ -628,7 +633,11 @@ typedef enum {
+ /*
+ * MISC_FEATURES_ENABLES bits
+ */
++#ifdef MSR_MISC_FEATURES_ENABLES_CPUID_FAULT
++#define MSR_MISC_FEATURES_ENABLES_CPUID_FAULTING MSR_MISC_FEATURES_ENABLES_CPUID_FAULT
++#else
+ #define MSR_MISC_FEATURES_ENABLES_CPUID_FAULTING 1
++#endif
+
+
+
+diff --git a/linux/driver.c b/linux/driver.c
+index 1905aa4..f2f8322 100644
+--- vmmon-only/linux/driver.c
++++ vmmon-only/linux/driver.c
+@@ -73,6 +73,9 @@ static Bool LinuxDriverCheckPadding(void);
+
+ struct VMXLinuxState linuxState;
+
++#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 17, 0)
++typedef int vm_fault_t;
++#endif
+
+ /*
+ *----------------------------------------------------------------------
+@@ -97,9 +100,9 @@ long LinuxDriver_Ioctl(struct file *filp, u_int iocmd,
+
+ static int LinuxDriver_Close(struct inode *inode, struct file *filp);
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
+-static int LinuxDriverFault(struct vm_fault *fault);
++static vm_fault_t LinuxDriverFault(struct vm_fault *fault);
+ #else
+-static int LinuxDriverFault(struct vm_area_struct *vma, struct vm_fault *fault);
++static vm_fault_t LinuxDriverFault(struct vm_area_struct *vma, struct vm_fault *fault);
+ #endif
+ static int LinuxDriverMmap(struct file *filp, struct vm_area_struct *vma);
+
+@@ -594,7 +597,7 @@ LinuxDriver_Close(struct inode *inode, // IN
+ *-----------------------------------------------------------------------------
+ */
+
+-static int
++static vm_fault_t
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
+ LinuxDriverFault(struct vm_fault *fault) //IN/OUT
+ #else
+@@ -981,7 +984,7 @@ LinuxDriverReadTSC(void *data, // OUT: TSC values
+ *-----------------------------------------------------------------------------
+ */
+
+-__attribute__((always_inline)) static Bool
++__always_inline static Bool
+ LinuxDriverSyncReadTSCs(uint64 *delta) // OUT: TSC max - TSC min
+ {
+ TSCDelta tscDelta;
+diff --git a/linux/hostif.c b/linux/hostif.c
+index b793539..80a6c2a 100644
+--- vmmon-only/linux/hostif.c
++++ vmmon-only/linux/hostif.c
+@@ -74,6 +74,7 @@
+
+ #include "pgtbl.h"
+ #include "versioned_atomic.h"
++#include "compat_poll.h"
+
+ #if !defined(CONFIG_HIGH_RES_TIMERS)
+ #error CONFIG_HIGH_RES_TIMERS required for acceptable performance
+@@ -180,6 +181,32 @@ static struct {
+ uint8 monitorIPIVector;
+ uint8 hvIPIVector;
+
++static unsigned long compat_totalram_pages(void)
++{
++#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 0, 0)
++ return totalram_pages;
++#else
++ return totalram_pages();
++#endif
++}
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 0, 0)
++static void do_gettimeofday(struct timeval *tv)
++{
++ struct timespec64 now;
++
++ ktime_get_real_ts64(&now);
++ tv->tv_sec = now.tv_sec;
++ tv->tv_usec = now.tv_nsec / 1000;
++}
++#endif
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 0, 0) && defined(VERIFY_WRITE)
++ #define write_access_ok(addr, size) access_ok(VERIFY_WRITE, addr, size)
++#else
++ #define write_access_ok(addr, size) access_ok(addr, size)
++#endif
++
+ /*
+ *-----------------------------------------------------------------------------
+ *
+@@ -1494,14 +1521,7 @@ unsigned int
+ HostIF_EstimateLockedPageLimit(const VMDriver* vm, // IN
+ unsigned int currentlyLockedPages) // IN
+ {
+- /*
+- * This variable is available and exported to modules,
+- * since at least 2.6.0.
+- */
+-
+- extern unsigned long totalram_pages;
+-
+- unsigned int totalPhysicalPages = totalram_pages;
++ unsigned int totalPhysicalPages = compat_totalram_pages();
+
+ /*
+ * Use the memory information linux exports as of late for a more
+@@ -2164,7 +2184,7 @@ isVAReadable(VA r) // IN:
+ int ret;
+
+ old_fs = get_fs();
+- set_fs(get_ds());
++ set_fs(KERNEL_DS);
+ r = APICR_TO_ADDR(r, APICR_VERSION);
+ ret = HostIF_CopyFromUser(&dummy, r, sizeof dummy);
+ set_fs(old_fs);
+@@ -2365,7 +2385,7 @@ HostIF_SemaphoreWait(VMDriver *vm, // IN:
+ }
+
+ old_fs = get_fs();
+- set_fs(get_ds());
++ set_fs(KERNEL_DS);
+
+ {
+ struct poll_wqueues table;
+@@ -2373,7 +2393,7 @@ HostIF_SemaphoreWait(VMDriver *vm, // IN:
+
+ poll_initwait(&table);
+ current->state = TASK_INTERRUPTIBLE;
+- mask = file->f_op->poll(file, &table.pt);
++ mask = compat_vfs_poll(file, &table.pt);
+ if (!(mask & (POLLIN | POLLERR | POLLHUP))) {
+ vm->vmhost->vcpuSemaTask[vcpuid] = current;
+ schedule_timeout(timeoutms * HZ / 1000); // convert to Hz
+@@ -2494,7 +2514,7 @@ HostIF_SemaphoreSignal(uint64 *args) // IN:
+ }
+
+ old_fs = get_fs();
+- set_fs(get_ds());
++ set_fs(KERNEL_DS);
+
+ /*
+ * Always write sizeof(uint64) bytes. This works fine for eventfd and
+@@ -3154,7 +3174,7 @@ HostIF_SetFastClockRate(unsigned int rate) // IN: Frequency in Hz.
+ }
+ } else {
+ if (linuxState.fastClockThread) {
+- force_sig(SIGKILL, linuxState.fastClockThread);
++ send_sig(SIGKILL, linuxState.fastClockThread, 1);
+ kthread_stop(linuxState.fastClockThread);
+
+ linuxState.fastClockThread = NULL;
+@@ -3200,7 +3220,7 @@ HostIF_MapUserMem(VA addr, // IN: User memory virtual address
+
+ ASSERT(handle);
+
+- if (!access_ok(VERIFY_WRITE, p, size)) {
++ if (!write_access_ok(p, size)) {
+ printk(KERN_ERR "%s: Couldn't verify write to uva 0x%p with size %"
+ FMTSZ"u\n", __func__, p, size);
+
diff --git a/vmnet-14.1.7-5.4.patch b/vmnet-14.1.7-5.4.patch
new file mode 100644
index 000000000000..f7dd0f9891de
--- /dev/null
+++ b/vmnet-14.1.7-5.4.patch
@@ -0,0 +1,152 @@
+diff --git a/Makefile b/Makefile
+index caab6b9..c2fc51f 100644
+--- vmnet-only/Makefile
++++ vmnet-only/Makefile
+@@ -107,7 +107,7 @@ prebuild:: ;
+ postbuild:: ;
+
+ $(DRIVER_KO): prebuild
+- $(MAKE) -C $(BUILD_DIR) SUBDIRS=$$PWD SRCROOT=$$PWD/$(SRCROOT) \
++ $(MAKE) -C $(BUILD_DIR) M=$$PWD SRCROOT=$$PWD/$(SRCROOT) \
+ MODULEBUILDDIR=$(MODULEBUILDDIR) modules
+ $(MAKE) -C $$PWD SRCROOT=$$PWD/$(SRCROOT) \
+ MODULEBUILDDIR=$(MODULEBUILDDIR) postbuild
+diff --git a/Makefile.kernel b/Makefile.kernel
+index 44a8a95..de04abe 100644
+--- vmnet-only/Makefile.kernel
++++ vmnet-only/Makefile.kernel
+@@ -32,6 +32,6 @@ $(DRIVER)-y := driver.o hub.o userif.o netif.o bridge.o procfs.o smac_compat.o \
+ ####
+
+ clean:
+- rm -rf $(DRIVER).o $(DRIVER).mod.o $(DRIVER).mod.c $(DRIVER).ko \
++ rm -rf $(DRIVER).o $(DRIVER).mod.o $(DRIVER).mod.c $(DRIVER).ko .cache.mk \
+ .tmp_versions Module.symvers Modules.symvers Module.markers \
+ modules.order $($(DRIVER)-y) .*.cmd .*.o.flags
+diff --git a/userif.c b/userif.c
+index acc6ca6..8dd6d21 100644
+--- vmnet-only/userif.c
++++ vmnet-only/userif.c
+@@ -33,6 +33,7 @@
+ #include <linux/proc_fs.h>
+ #include <linux/sockios.h>
+ #include <linux/sched.h>
++#include <linux/sched/signal.h>
+ #include <linux/slab.h>
+ #include <linux/version.h>
+ #include <linux/wait.h>
+@@ -78,11 +79,37 @@ static int VNetUserIfSetUplinkState(VNetPort *port, uint8 linkUp);
+ extern unsigned int vnet_max_qlen;
+
+ #if COMPAT_LINUX_VERSION_CHECK_LT(3, 2, 0)
+-# define compat_kmap(page) kmap(page)
+-# define compat_kunmap(page) kunmap(page)
++# define compat_kmap_frag(frag) kmap((frag)->page)
++# define compat_kunmap_frag(page) kunmap((frag)->page)
+ #else
+-# define compat_kmap(page) kmap((page).p)
+-# define compat_kunmap(page) kunmap((page).p)
++# define compat_kmap_frag(frag) kmap(skb_frag_page(frag))
++# define compat_kunmap_frag(frag) kunmap(skb_frag_page(frag))
++#endif
++
++static unsigned int compat_skb_frag_size(const skb_frag_t *frag)
++{
++#if COMPAT_LINUX_VERSION_CHECK_LT(3, 2, 0)
++ return frag->size;
++#else
++ return skb_frag_size(frag);
++#endif
++}
++
++static unsigned int compat_skb_frag_off(const skb_frag_t *frag)
++{
++#if COMPAT_LINUX_VERSION_CHECK_LT(5, 4, 0) && \
++ !(defined(CONFIG_SUSE_VERSION) && CONFIG_SUSE_VERSION == 15 && \
++ defined(CONFIG_SUSE_PATCHLEVEL) && CONFIG_SUSE_PATCHLEVEL >= 2)
++ return frag->page_offset;
++#else
++ return skb_frag_off(frag);
++#endif
++}
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 0, 0) && defined(VERIFY_WRITE)
++ #define write_access_ok(addr, size) access_ok(VERIFY_WRITE, addr, size)
++#else
++ #define write_access_ok(addr, size) access_ok(addr, size)
+ #endif
+
+ /*
+@@ -142,7 +169,7 @@ VNetUserIfMapPtr(VA uAddr, // IN: pointer to user memory
+ struct page **p, // OUT: locked page
+ void **ptr) // OUT: kernel mapped pointer
+ {
+- if (!access_ok(VERIFY_WRITE, (void *)uAddr, size) ||
++ if (!write_access_ok((void *)uAddr, size) ||
+ (((uAddr + size - 1) & ~(PAGE_SIZE - 1)) !=
+ (uAddr & ~(PAGE_SIZE - 1)))) {
+ return -EINVAL;
+@@ -559,20 +586,21 @@ VNetCsumCopyDatagram(const struct sk_buff *skb, // IN: skb to copy
+ for (frag = skb_shinfo(skb)->frags;
+ frag != skb_shinfo(skb)->frags + skb_shinfo(skb)->nr_frags;
+ frag++) {
+- if (frag->size > 0) {
++ if (compat_skb_frag_size(frag) > 0) {
+ unsigned int tmpCsum;
+ const void *vaddr;
+
+- vaddr = compat_kmap(frag->page);
+- tmpCsum = csum_and_copy_to_user(vaddr + frag->page_offset,
+- curr, frag->size, 0, &err);
+- compat_kunmap(frag->page);
++ vaddr = compat_kmap_frag(frag);
++ tmpCsum = csum_and_copy_to_user(vaddr + compat_skb_frag_off(frag),
++ curr, compat_skb_frag_size(frag), 0,
++ &err);
++ compat_kunmap_frag(frag);
+
+ if (err) {
+ return err;
+ }
+ csum = csum_block_add(csum, tmpCsum, curr - buf);
+- curr += frag->size;
++ curr += compat_skb_frag_size(frag);
+ }
+ }
+
+diff --git a/vm_device_version.h b/vm_device_version.h
+index ab396bc..9305ddb 100644
+--- vmnet-only/vm_device_version.h
++++ vmnet-only/vm_device_version.h
+@@ -35,6 +35,8 @@
+ #endif
+ #endif
+
++#include <linux/pci_ids.h>
++
+ /* LSILogic 53C1030 Parallel SCSI controller
+ * LSILogic SAS1068 SAS controller
+ */
+@@ -53,7 +55,10 @@
+ * VMware HD Audio codec
+ * VMware HD Audio controller
+ */
++#ifndef PCI_VENDOR_ID_VMWARE
+ #define PCI_VENDOR_ID_VMWARE 0x15AD
++#endif
++
+ #define PCI_DEVICE_ID_VMWARE_SVGA2 0x0405
+ #define PCI_DEVICE_ID_VMWARE_SVGA 0x0710
+ #define PCI_DEVICE_ID_VMWARE_VGA 0x0711
+@@ -70,7 +75,11 @@
+ #define PCI_DEVICE_ID_VMWARE_1394 0x0780
+ #define PCI_DEVICE_ID_VMWARE_BRIDGE 0x0790
+ #define PCI_DEVICE_ID_VMWARE_ROOTPORT 0x07A0
++
++#ifndef PCI_DEVICE_ID_VMWARE_VMXNET3
+ #define PCI_DEVICE_ID_VMWARE_VMXNET3 0x07B0
++#endif
++
+ #define PCI_DEVICE_ID_VMWARE_PVSCSI 0x07C0
+ #define PCI_DEVICE_ID_VMWARE_82574 0x07D0
+ #define PCI_DEVICE_ID_VMWARE_AHCI 0x07E0