diff options
-rw-r--r-- | .SRCINFO | 14 | ||||
-rw-r--r-- | PKGBUILD | 13 | ||||
-rw-r--r-- | vmci-14.0.0-4.13.3.patch | 266 | ||||
-rw-r--r-- | vmmon-14.0.0-4.13.3.patch | 62 | ||||
-rw-r--r-- | vmnet-14.0.0-4.13.3.patch | 11 | ||||
-rw-r--r-- | vmware-patch.sh | 2 |
6 files changed, 360 insertions, 8 deletions
@@ -1,9 +1,9 @@ # Generated by mksrcinfo v8 -# 三 10月 4 09:53:58 UTC 2017 +# 三 10月 4 15:38:14 UTC 2017 pkgbase = vmware-patch pkgdesc = A post-install configuration solution for VMware Workstation (Pro) and Player (Plus and Pro) - pkgver = 12.5.7 - pkgrel = 3 + pkgver = 14.0.0 + pkgrel = 1 url = https://wiki.archlinux.org/index.php/VMware#Configuration install = vmware-patch.install arch = i686 @@ -20,6 +20,9 @@ pkgbase = vmware-patch source = vmware.service source = vmware-usbarbitrator.service source = vmware-workstation.service + 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 source = vmmon-12.5.7-4.13.3.patch source = vmnet-12.5.7-4.13.3.patch source = vmnet-12.5.7-4.13.patch @@ -43,7 +46,7 @@ pkgbase = vmware-patch source = vmnet-10.0.4-3.14.patch source = vsock-10.0.4-3.14.patch source = vmnet-10.0.1-3.13.patch - md5sums = 9ddd739d1327a56f7adbf121fa0076d1 + md5sums = bdfa2b348fb501dc46f3c6d65c9cff1d md5sums = ba054b375308442d43a408dbae5e9401 md5sums = ca1382966804d694894539c7bcac6bbb md5sums = c12e765985b324585a548718a6ac9b43 @@ -51,6 +54,9 @@ pkgbase = vmware-patch md5sums = 56f7f642683e54250372bb57faaf4e95 md5sums = 3c165edb6847fc9bfa04657f346ac4cc md5sums = eca2542e4c484ea2ca06b7e9c065b8af + md5sums = ced58cf32a21adfe21d612366c52116a + md5sums = 3c165edb6847fc9bfa04657f346ac4cc + md5sums = eca2542e4c484ea2ca06b7e9c065b8af md5sums = a2c3e2bbbe6dcbf66737a5e33df5b892 md5sums = 7acdc91c88c64d55bd775d2fcdc1b242 md5sums = 5eb0567825f0dea3d7c9f21038463de9 @@ -2,8 +2,8 @@ # Contributors: Igor Duarte Cardoso, haagch, Olivier Médoc pkgname=vmware-patch -pkgver=12.5.7 -pkgrel=3 +pkgver=14.0.0 +pkgrel=1 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" @@ -12,6 +12,10 @@ depends=('fuse' 'gtkmm' 'linux-headers' 'ncurses5-compat-libs') options=('!emptydirs') install=$pkgname.install source=('vmware-patch.sh' 'vmware-unpatch.sh' 'common-functions.sh' 'vmware.service' 'vmware-usbarbitrator.service' 'vmware-workstation.service' + # Workstation Pro/Player 14.0.0 + 'vmmon-14.0.0-4.13.3.patch' + 'vmnet-14.0.0-4.13.3.patch' + 'vmci-14.0.0-4.13.3.patch' # Workstation Pro/Player 12.5.7 'vmmon-12.5.7-4.13.3.patch' 'vmnet-12.5.7-4.13.3.patch' @@ -64,7 +68,7 @@ package() { } # Generated using 'updpkgsums' -md5sums=('9ddd739d1327a56f7adbf121fa0076d1' +md5sums=('bdfa2b348fb501dc46f3c6d65c9cff1d' 'ba054b375308442d43a408dbae5e9401' 'ca1382966804d694894539c7bcac6bbb' 'c12e765985b324585a548718a6ac9b43' @@ -72,6 +76,9 @@ md5sums=('9ddd739d1327a56f7adbf121fa0076d1' '56f7f642683e54250372bb57faaf4e95' '3c165edb6847fc9bfa04657f346ac4cc' 'eca2542e4c484ea2ca06b7e9c065b8af' + 'ced58cf32a21adfe21d612366c52116a' + '3c165edb6847fc9bfa04657f346ac4cc' + 'eca2542e4c484ea2ca06b7e9c065b8af' 'a2c3e2bbbe6dcbf66737a5e33df5b892' '7acdc91c88c64d55bd775d2fcdc1b242' '5eb0567825f0dea3d7c9f21038463de9' diff --git a/vmci-14.0.0-4.13.3.patch b/vmci-14.0.0-4.13.3.patch new file mode 100644 index 000000000000..cd627fbb7c35 --- /dev/null +++ b/vmci-14.0.0-4.13.3.patch @@ -0,0 +1,266 @@ +diff --git a/vmci-only/linux/driver.c b/vmci-only/linux/driver.c +index 8ab2064..1144bf5 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> +@@ -1467,11 +1473,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 +1700,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 +1735,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 +2507,7 @@ vmci_exit(void) + + if (guestDeviceInit) { + pci_unregister_driver(&vmci_driver); +- vfree(data_buffer); ++ kvfree(data_buffer); + data_buffer = NULL; + guestDeviceInit = FALSE; + } +@@ -2490,7 +2517,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/vmci-only/linux/vmciKernelIf.c b/vmci-only/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/vmci-only/shared/compat_module.h b/vmci-only/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/vmci-only/shared/vm_device_version.h b/vmci-only/shared/vm_device_version.h +index ab396bc..ff2f563 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 +diff --git a/vmci-only/shared/vmci_kernel_if.h b/vmci-only/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.0.0-4.13.3.patch b/vmmon-14.0.0-4.13.3.patch new file mode 100644 index 000000000000..756fa66fa3cc --- /dev/null +++ b/vmmon-14.0.0-4.13.3.patch @@ -0,0 +1,62 @@ +diff --git a/vmmon-only/linux/hostif.c b/vmmon-only/linux/hostif.c +--- vmmon-only/linux/hostif.c ++++ vmmon-only/linux/hostif.c +@@ -99,6 +99,37 @@ + #include "vmmonInt.h" + #include "versioned_atomic.h" + ++#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 14, 0) ++#define global_zone_page_state global_page_state ++#endif ++ ++static unsigned long get_nr_slab_unreclaimable(void) ++{ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 13, 0) ++ return global_node_page_state(NR_SLAB_UNRECLAIMABLE); ++#else ++ return global_page_state(NR_SLAB_UNRECLAIMABLE); ++#endif ++} ++ ++static unsigned long get_nr_unevictable(void) ++{ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0) ++ return global_node_page_state(NR_UNEVICTABLE); ++#else ++ return global_page_state(NR_UNEVICTABLE); ++#endif ++} ++ ++static unsigned long get_nr_anon_mapped(void) ++{ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0) ++ return global_node_page_state(NR_ANON_MAPPED); ++#else ++ return global_page_state(NR_ANON_PAGES); ++#endif ++} ++ + /* + * Determine if we can use high resolution timers. + */ +@@ -1594,16 +1625,11 @@ HostIF_EstimateLockedPageLimit(const VMDriver* vm, // IN + unsigned int reservedPages = MEMDEFAULTS_MIN_HOST_PAGES; + unsigned int hugePages = (vm == NULL) ? 0 : + BYTES_2_PAGES(vm->memInfo.hugePageBytes); +- unsigned int lockedPages = global_page_state(NR_PAGETABLE) + +- global_page_state(NR_SLAB_UNRECLAIMABLE) + +- global_page_state(NR_UNEVICTABLE) + ++ unsigned int lockedPages = global_zone_page_state(NR_PAGETABLE) + ++ get_nr_slab_unreclaimable() + ++ get_nr_unevictable() + + hugePages + reservedPages; +- unsigned int anonPages = +-#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0) +- global_page_state(NR_ANON_MAPPED); +-#else +- global_page_state(NR_ANON_PAGES); +-#endif ++ unsigned int anonPages = get_nr_anon_mapped(); + unsigned int swapPages = BYTES_2_PAGES(linuxState.swapSize); + + if (anonPages > swapPages) { diff --git a/vmnet-14.0.0-4.13.3.patch b/vmnet-14.0.0-4.13.3.patch new file mode 100644 index 000000000000..35035b7ae004 --- /dev/null +++ b/vmnet-14.0.0-4.13.3.patch @@ -0,0 +1,11 @@ +diff --git a/vmnet-only/userif.c b/vmnet-only/userif.c +--- 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> diff --git a/vmware-patch.sh b/vmware-patch.sh index 3ebf9cf94944..53f69c57b49e 100644 --- a/vmware-patch.sh +++ b/vmware-patch.sh @@ -62,7 +62,7 @@ vmware_check set_product_name # Use VMware's bundled libcurl.so.4 to prevent crashes at startup/checking for updates -if [[ $ver != 13.* ]]; then +if [[ $ver != 14.* ]]; then for script in vmware vmplayer vmware-netcfg vmware-tray; do if [[ -f /usr/bin/$script ]]; then if ! grep -q "VMWARE_USE_SHIPPED_LIBS" /usr/bin/$script; then |