diff options
author | Felix Golatofski | 2020-01-08 21:31:47 +0100 |
---|---|---|
committer | Felix Golatofski | 2020-01-08 21:31:47 +0100 |
commit | 5511a27639e144b70210e9e3ca382414d9b10b78 (patch) | |
tree | 98a11df9b606cc40e75aa713bb692928bf18b73c | |
parent | a7eb99cddf7842a7fb92478846b67394e6f572c2 (diff) | |
download | aur-5511a27639e144b70210e9e3ca382414d9b10b78.tar.gz |
Integrated patch
-rw-r--r-- | .SRCINFO | 8 | ||||
-rw-r--r-- | PKGBUILD | 11 | ||||
-rw-r--r-- | vmci-14.1.7-5.4.patch | 298 | ||||
-rw-r--r-- | vmmon-14.1.7-5.4.patch | 349 | ||||
-rw-r--r-- | vmnet-14.1.7-5.4.patch | 152 |
5 files changed, 815 insertions, 3 deletions
@@ -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 @@ -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(¤t->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(¤t->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(¤t->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 |