Add app-emulation/vmware-modules-14

from stefantalpalaru overlay
This commit is contained in:
Sergey Morozov
2018-04-08 12:08:26 +03:00
parent c5bb5c2365
commit 655df0cc15
16 changed files with 2353 additions and 0 deletions

View File

@@ -0,0 +1,10 @@
AUX 329-00-vmmon-quick-workaround-for-objtool-warnings.patch 1555 BLAKE2B dd4a58e78634aed9d5fb64bcb02b999d55be6b87e496c8daf640f7027aba3942f4e415125ba8fb847fa832336560d4bdbb0f539fefea3b4d2c175f2cbb33a9d7 SHA512 892bde81c721c18264e154cdfadd6b560af37260c9a457ec321fdf6bdf78b1704df57532b0919ed7dbc5c1036230b95f0cbacb7acbfd15da2145e3445da795f7
AUX 329-4.09-00-vmnet-use-standard-definition-of-PCI_VENDOR_ID_VMWAR.patch 1169 BLAKE2B 4e5a74961ff512748375bd1d90a6670fc519c2c4c0be94f89d14fdf39e4922b057ae2baa38d07d34aca9ec897b012c4b9326dfd51a44235418919708b789895e SHA512 727fb97a63399d7c19238ae864a38cf2297adccb466fc2deba2a72f0592eb655f653d3c8e45dac06bbd0e09fc71a59a8bfea491b7580b37d41d0729f6adc023d
AUX 329-4.10-00-vmnet-use-standard-definition-of-PCI_VENDOR_ID_VMWAR.patch 1131 BLAKE2B 1e07b4a15ff1180349348d84efb606c223f5cfa4accdcc0e1a41c8a0de52fb186bddd3c6cd3f5f48041c52ad2c29110726197f1d9352bd87caf4e646c4c4c001 SHA512 192d6a9a14757706f1c9345ff45592a559729619627a32c9f0a1d7203e60881312a4d0fc92ff750c8ff5b5350cf1a2b55238c16973e9c7eb4c2cfe2966abe7d1
AUX 329-4.12-00-vmmon-use-standard-definition-of-MSR_MISC_FEATURES_E.patch 1603 BLAKE2B 4eea61a743cb443e4a4c22a02a03410adbae66339ac7ed1c1aafe54e447135c1ed976ce3c97f22db9984926de9b9a09b1820e253978f457c0c2b9d22f8e4c59b SHA512 4413cd5e791dd19c4b47ba2178e386160912882b0e1a549151eafcceae484b5e48f527ee45b14584c98e06c11e28ee5bfef34b318e46b45704fbcf93a7b52b56
AUX 329-4.13-00-vmmon-use-standard-definition-of-CR3_PCID_MASK-if-av.patch 1167 BLAKE2B b5c1c4d98d2aed5bb473270ea9b5737da05bab45748aa84b0a83c26abf8d826960ff3251132ae2770bf87168bfb9c01ab7c81ec99036af576ca3fa0eb08b36e2 SHA512 1cf13f9c745bcfcf24ac1e8f762d057f1afde46ec1de4e651a07e63e08d9073eca9bdbaa53c5a1ced556ec83da3bfd80d3c65c979fb91566cf3c7ddae38eaeac
AUX 329-4.14-00-vsock-gcc-plugins-randstruct.patch 3477 BLAKE2B 9d454174bd3cf888d92a5644a2f8078f9368e5db0ee1c1f0ca7f43a897efa69d9d28c3cd89af3e38a790a23c442898364bc9d189f7920cf0dea54ca20af6ece4 SHA512 a3b68de2664807715dff9648744bd345cdf007a7c1d173fc5c1f410baa65e3a8ef3063543fd369e969a60d2f2ec9cda6127b22b09c5e17aefe288de104d58871
AUX 329-vmblock.patch 15016 BLAKE2B 887159b5c526eea4fcc7d49664a4c7233ab9c73440bef9e8f4ceb2b9694a72cd9c4dcff131f9a74dabe5a0ec3a4e0437db405f6c74f9cfd49ef590b19a658ab8 SHA512 6cb922537009fe39e2e58e19ba9c8fda6a5ea484f3d28a94793de0fbd63d8d564822f2c83447d135f1c5e7f5da6734af218f86e31c20d322cbf00b675297c712
AUX 329-vmci.patch 9474 BLAKE2B 9e833fcafc39c4279a9d86c96c0d4b012d6f653d42a76ba7d7d65355876da469c0dcb746a6eab4be795c5c29f1d11ace5cbf705e066d12fff20df758b8ade901 SHA512 b8b46a3df7ee2f906dd474add6c0ec3d76566f1c643278e3a7faeb68c829c78926351359bd78e12ad744bb946a31324ee347bb67413c4d670e7a091379160e2e
AUX 329-vsock.patch 10068 BLAKE2B d84f22a1623e2303c6aa2ea3624857fb2cf2dbb31b4747582285fc506ae208c1fb4b2a5925b02e6473b43ba178d871276584800d06cd2cdfb06273743814cc24 SHA512 73df6466b1df7be6ae40751596834d967b46d48218267afe5244abcdcacf5e263a78ed3bd3c4e6f2a5d81dd9c0c9e9042fc52fa9f1d4d000098ad20f19509001
EBUILD vmware-modules-329.1.1-r1.ebuild 4307 BLAKE2B 9a36a42397b75bdcb24aae04ef98e3a37769382ccf064bcfbaef0d4ede848898428f36f6b01c46c72bc0ffb67133d0e6366d1e3986a6cf8cb5a7cf562fd63dda SHA512 82ea9316ef9315bcc80a1ed1b86b279f4af9e30b62cdfbeb79c152eb16f49c9c10c737871ff3b970fb2d5063d6ccc64a6e2a725cc0ca23279112430e19e8e82c

View File

@@ -0,0 +1,45 @@
From 182ac915372c798e400c9718499cae2cb1822ef1 Mon Sep 17 00:00:00 2001
From: Michal Kubecek <mkubecek@suse.cz>
Date: Sat, 30 Sep 2017 21:41:51 +0200
Subject: [PATCH 6/6] vmmon: quick workaround for objtool warnings
As discussed in
https://bugzilla.suse.com/show_bug.cgi?id=1059674
the reason for multiple objtool warnings is the fact that vmmon module
defines its own Panic() function which never returns. While it is marked as
such which is used by the compiler for optimization, there is no way to
find this from object file.
While this seems innocuous, it might result in problems with unwinder
later. The quickest way around is to replace vmmon's own Panic() with
standard kernel panic() until a cleaner solution is found.
---
vmmon-only/include/vm_assert.h | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/vmmon-only/include/vm_assert.h b/vmmon-only/include/vm_assert.h
index 8cdbc93..b869def 100644
--- a/vmmon-only/include/vm_assert.h
+++ b/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);
--
2.14.3

View File

@@ -0,0 +1,40 @@
From 4d80590924550d0ee3fe470e027deea0ee43e6b6 Mon Sep 17 00:00:00 2001
From: Michal Kubecek <mkubecek@suse.cz>
Date: Tue, 18 Apr 2017 12:52:08 +0200
Subject: [PATCH 1/6] vmnet: use standard definition of PCI_VENDOR_ID_VMWARE if
available
The PCI_VENDOR_ID_VMWARE macro is defined in mainline pci_ids.h since
commit 94e57fea6202 ("PCI: Move PCI_VENDOR_ID_VMWARE to pci_ids.h")
in v3.18-rc1.
---
vmnet-only/vm_device_version.h | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/vmnet-only/vm_device_version.h b/vmnet-only/vm_device_version.h
index ab396bc..cafddd0 100644
--- a/vmnet-only/vm_device_version.h
+++ b/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
--
2.14.3

View File

@@ -0,0 +1,32 @@
From 7cb0c3beb4abde406d5334376106d68997f6fb51 Mon Sep 17 00:00:00 2001
From: Michal Kubecek <mkubecek@suse.cz>
Date: Tue, 18 Apr 2017 13:01:56 +0200
Subject: [PATCH 2/6] vmnet: use standard definition of
PCI_VENDOR_ID_VMWARE_VMXNET3 if available
The PCI_DEVICE_ID_VMWARE_VMXNET3 macro is defined in mainline pci_ids.h
since commit b1226c7db1d9 ("vmxnet3: Move PCI Id to pci_ids.h") in
v4.10-rc1.
---
vmnet-only/vm_device_version.h | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/vmnet-only/vm_device_version.h b/vmnet-only/vm_device_version.h
index cafddd0..9305ddb 100644
--- a/vmnet-only/vm_device_version.h
+++ b/vmnet-only/vm_device_version.h
@@ -75,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
--
2.14.3

View File

@@ -0,0 +1,54 @@
From 53d6ccbeed4c519dc105f98552067ced2ecbd432 Mon Sep 17 00:00:00 2001
From: Michal Kubecek <mkubecek@suse.cz>
Date: Fri, 23 Jun 2017 09:29:24 +0200
Subject: [PATCH 3/6] vmmon: use standard definition of
MSR_MISC_FEATURES_ENABLES if available
The MSR_MISC_FEATURES_ENABLES macro is defined in mainline since commit
ab6d9468631a ("x86/msr: Rename MISC_FEATURE_ENABLES to
MISC_FEATURES_ENABLES") in v4.12-rc1.
The MSR_MISC_FEATURES_ENABLES_CPUID_FAULT macro is defined in mainline
since commit e9ea1e7f53b8 ("x86/arch_prctl: Add ARCH_[GET|SET]_CPUID") in
v4.12-rc1.
---
vmmon-only/include/x86msr.h | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/vmmon-only/include/x86msr.h b/vmmon-only/include/x86msr.h
index 3a6bfe8..904d9e9 100644
--- a/vmmon-only/include/x86msr.h
+++ b/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
@@ -112,7 +113,9 @@ MSRQuery;
#define MSR_TSC_AUX 0xc0000103
#define MSR_BD_TSC_RATIO 0xc0000104
+#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
@@ -612,7 +615,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
--
2.14.3

View File

@@ -0,0 +1,39 @@
From 704be6e3f2143df35e99025caa3393b9c309fbc1 Mon Sep 17 00:00:00 2001
From: Michal Kubecek <mkubecek@suse.cz>
Date: Mon, 24 Jul 2017 10:08:55 +0200
Subject: [PATCH 4/6] vmmon: use standard definition of CR3_PCID_MASK if
available
The CR3_PCID_MASK is defined in mainline asm/processor-flags.h since
commit 6c690ee1039b ("x86/mm: Split read_cr3() into read_cr3_pa() and
__read_cr3()") in v4.13-rc1.
---
vmmon-only/include/x86_basic_defs.h | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/vmmon-only/include/x86_basic_defs.h b/vmmon-only/include/x86_basic_defs.h
index abfb0b8..8c7566f 100644
--- a/vmmon-only/include/x86_basic_defs.h
+++ b/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
--
2.14.3

View File

@@ -0,0 +1,84 @@
--- a/vsock-only/linux/notify.c 2017-10-03 06:52:10.953893050 +0300
+++ b/vsock-only/linux/notify.c 2017-10-03 05:42:48.642701836 +0300
@@ -1193,20 +1193,20 @@ VSockVmciNotifyPktProcessNegotiate(struc
/* Socket control packet based operations. */
-VSockVmciNotifyOps vSockVmciNotifyPktOps = {
- VSockVmciNotifyPktSocketInit,
- VSockVmciNotifyPktSocketDestruct,
- VSockVmciNotifyPktPollIn,
- VSockVmciNotifyPktPollOut,
- VSockVmciNotifyPktHandlePkt,
- VSockVmciNotifyPktRecvInit,
- VSockVmciNotifyPktRecvPreBlock,
- VSockVmciNotifyPktRecvPreDequeue,
- VSockVmciNotifyPktRecvPostDequeue,
- VSockVmciNotifyPktSendInit,
- VSockVmciNotifyPktSendPreBlock,
- VSockVmciNotifyPktSendPreEnqueue,
- VSockVmciNotifyPktSendPostEnqueue,
- VSockVmciNotifyPktProcessRequest,
- VSockVmciNotifyPktProcessNegotiate,
+VSockVmciNotifyOps vSockVmciNotifyPktOps __refdata = {
+ .socketInit = VSockVmciNotifyPktSocketInit,
+ .socketDestruct = VSockVmciNotifyPktSocketDestruct,
+ .pollIn = VSockVmciNotifyPktPollIn,
+ .pollOut = VSockVmciNotifyPktPollOut,
+ .handleNotifyPkt = VSockVmciNotifyPktHandlePkt,
+ .recvInit = VSockVmciNotifyPktRecvInit,
+ .recvPreBlock = VSockVmciNotifyPktRecvPreBlock,
+ .recvPreDequeue = VSockVmciNotifyPktRecvPreDequeue,
+ .recvPostDequeue = VSockVmciNotifyPktRecvPostDequeue,
+ .sendInit = VSockVmciNotifyPktSendInit,
+ .sendPreBlock = VSockVmciNotifyPktSendPreBlock,
+ .sendPreEnqueue = VSockVmciNotifyPktSendPreEnqueue,
+ .sendPostEnqueue = VSockVmciNotifyPktSendPostEnqueue,
+ .processRequest = VSockVmciNotifyPktProcessRequest,
+ .processNegotiate = VSockVmciNotifyPktProcessNegotiate,
};
diff -urp a/vsock-only/linux/notifyQState.c b/vsock-only/linux/notifyQState.c
--- a/vsock-only/linux/notifyQState.c 2017-10-03 06:52:10.952893329 +0300
+++ b/vsock-only/linux/notifyQState.c 2017-10-03 05:43:02.950697125 +0300
@@ -771,21 +770,24 @@ VSockVmciNotifyPktProcessNegotiate(struc
}
-/* Socket always on control packet based operations. */
-VSockVmciNotifyOps vSockVmciNotifyPktQStateOps = {
- VSockVmciNotifyPktSocketInit,
- VSockVmciNotifyPktSocketDestruct,
- VSockVmciNotifyPktPollIn,
- VSockVmciNotifyPktPollOut,
- VSockVmciNotifyPktHandlePkt,
- VSockVmciNotifyPktRecvInit,
- VSockVmciNotifyPktRecvPreBlock,
- NULL, /* recvPreDequeue */
- VSockVmciNotifyPktRecvPostDequeue,
- VSockVmciNotifyPktSendInit,
- NULL, /* sendPreBlock */
- NULL, /* sendPreEnqueue */
- VSockVmciNotifyPktSendPostEnqueue,
- VSockVmciNotifyPktProcessRequest,
- VSockVmciNotifyPktProcessNegotiate,
+
+
+// Socket always on control packet based operations.
+VSockVmciNotifyOps vSockVmciNotifyPktQStateOps __refdata = {
+ .socketInit = VSockVmciNotifyPktSocketInit,
+ .socketDestruct = VSockVmciNotifyPktSocketDestruct,
+ .pollIn = VSockVmciNotifyPktPollIn,
+ .pollOut = VSockVmciNotifyPktPollOut,
+ .handleNotifyPkt = VSockVmciNotifyPktHandlePkt,
+ .recvInit = VSockVmciNotifyPktRecvInit,
+ .recvPreBlock = VSockVmciNotifyPktRecvPreBlock,
+ .recvPreDequeue = NULL,
+ .recvPostDequeue = VSockVmciNotifyPktRecvPostDequeue,
+ .sendInit = VSockVmciNotifyPktSendInit,
+ .sendPreBlock = NULL,
+ .sendPreEnqueue = NULL,
+ .sendPostEnqueue = VSockVmciNotifyPktSendPostEnqueue,
+ .processRequest = VSockVmciNotifyPktProcessRequest,
+ .processNegotiate = VSockVmciNotifyPktProcessNegotiate,
+
};

View File

@@ -0,0 +1,461 @@
diff --git a/vmblock-only/Makefile b/vmblock-only/Makefile
index bbfe225..8ec1a86 100644
--- a/vmblock-only/Makefile
+++ b/vmblock-only/Makefile
@@ -43,7 +43,11 @@ INCLUDE += -I$(SRCROOT)/shared
endif
+ifdef KVERSION
+VM_UNAME = $(KVERSION)
+else
VM_UNAME = $(shell uname -r)
+endif
# Header directory for the running kernel
ifdef LINUXINCLUDE
diff --git a/vmblock-only/Makefile.kernel b/vmblock-only/Makefile.kernel
index ab7a727..e3ec9d2 100644
--- a/vmblock-only/Makefile.kernel
+++ b/vmblock-only/Makefile.kernel
@@ -19,7 +19,7 @@
INCLUDE += -I$(SRCROOT)/include
-EXTRA_CFLAGS := $(CC_OPTS) $(INCLUDE)
+EXTRA_CFLAGS := $(CC_OPTS) $(INCLUDE) $(LINUXINCLUDE)
EXTRA_CFLAGS += $(call vm_check_build, $(AUTOCONF_DIR)/cachecreate.c, -DVMW_KMEMCR_HAS_DTOR, )
EXTRA_CFLAGS += $(call vm_check_build, $(AUTOCONF_DIR)/cachector.c, -DVMW_KMEMCR_CTOR_HAS_3_ARGS, )
diff --git a/vmblock-only/linux/control.c b/vmblock-only/linux/control.c
index 79716bd..5b6acb2 100644
--- a/vmblock-only/linux/control.c
+++ b/vmblock-only/linux/control.c
@@ -29,7 +29,7 @@
#include <linux/stat.h>
#include <linux/fs.h>
-#include <asm/uaccess.h>
+#include <linux/uaccess.h>
#include "vmblockInt.h"
#include "block.h"
@@ -208,9 +208,17 @@ SetupProcDevice(void)
VMBlockSetProcEntryOwner(controlProcMountpoint);
/* Create /proc/fs/vmblock/dev */
+ // create_proc_entry deprecated in 3.10
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
+ controlProcEntry = proc_create(VMBLOCK_CONTROL_DEVNAME,
+ VMBLOCK_CONTROL_MODE,
+ controlProcDirEntry,
+ &ControlFileOps);
+#else
controlProcEntry = create_proc_entry(VMBLOCK_CONTROL_DEVNAME,
VMBLOCK_CONTROL_MODE,
controlProcDirEntry);
+#endif
if (!controlProcEntry) {
Warning("SetupProcDevice: could not create " VMBLOCK_DEVICE "\n");
remove_proc_entry(VMBLOCK_CONTROL_MOUNTPOINT, controlProcDirEntry);
@@ -218,7 +226,9 @@ SetupProcDevice(void)
return -EINVAL;
}
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0) //Maybe 3.14? 3.13?
controlProcEntry->proc_fops = &ControlFileOps;
+#endif
return 0;
}
@@ -272,17 +282,50 @@ CleanupProcDevice(void)
*----------------------------------------------------------------------------
*/
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0)
+/* copy-paste from Lustre FS by pavlinux */
+static inline char *ll_getname(const char __user *filename)
+{
+ int ret = 0, len;
+ char *tmp = __getname();
+
+ if (!tmp)
+ return ERR_PTR(-ENOMEM);
+
+ len = strncpy_from_user(tmp, filename, PATH_MAX);
+ if (len == 0)
+ ret = -ENOENT;
+ else if (len > PATH_MAX)
+ ret = -ENAMETOOLONG;
+
+ if (ret) {
+ __putname(tmp);
+ tmp = ERR_PTR(ret);
+ }
+ return tmp;
+};
+#endif
+
static int
ExecuteBlockOp(const char __user *buf, // IN: buffer with name
const os_blocker_id_t blocker, // IN: blocker ID (file)
int (*blockOp)(const char *filename, // IN: block operation
const os_blocker_id_t blocker))
{
- char *name;
+ struct filename *fn = NULL;
+ char *name = (char *)fn->name;
int i;
int retval;
- name = getname(buf);
+ // Not sure what changed in 3.13 to neccessitate this.
+ // Gentoo uses __getname(), though.
+ // https://github.com/gentoo/vmware/blob/master/app-emulation/vmware-modules/files/308-3.10-02-control.patch#L36
+ // ~MK
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 13, 0)
+ name = (char *)getname(buf);
+#else
+ name = (char *)ll_getname(buf);
+#endif
if (IS_ERR(name)) {
return PTR_ERR(name);
}
@@ -293,7 +336,13 @@ ExecuteBlockOp(const char __user *buf, // IN: buffer with name
retval = i < 0 ? -EINVAL : blockOp(name, blocker);
- putname(name);
+ // I'm not sure what this does, but you seem to know what you're doing ~MK
+ if (fn->name != fn->iname) { /* add by pavlinux */
+ __putname(fn->name);
+ kvfree(fn);
+ } else {
+ __putname(fn);
+ }
return retval;
}
diff --git a/vmblock-only/linux/dentry.c b/vmblock-only/linux/dentry.c
index 05ea95a..1245358 100644
--- a/vmblock-only/linux/dentry.c
+++ b/vmblock-only/linux/dentry.c
@@ -32,7 +32,13 @@
#include "block.h"
-static int DentryOpRevalidate(struct dentry *dentry, struct nameidata *nd);
+// From what I can tell, this should've always been an unsigned int?
+static int DentryOpRevalidate(struct dentry *dentry,
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0) // Maybe 3.14 or 3.13?
+ struct nameidata *nd);
+#else
+ unsigned int flags);
+#endif
struct dentry_operations LinkDentryOps = {
.d_revalidate = DentryOpRevalidate,
@@ -60,7 +66,11 @@ struct dentry_operations LinkDentryOps = {
static int
DentryOpRevalidate(struct dentry *dentry, // IN: dentry revalidating
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0)
struct nameidata *nd) // IN: lookup flags & intent
+#else
+ unsigned int flags) // IN: lookup flags & intent
+#endif
{
VMBlockInodeInfo *iinfo;
struct nameidata actualNd;
@@ -101,7 +111,11 @@ DentryOpRevalidate(struct dentry *dentry, // IN: dentry revalidating
if (actualDentry &&
actualDentry->d_op &&
actualDentry->d_op->d_revalidate) {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)
+ return actualDentry->d_op->d_revalidate(actualDentry, flags);
+#else
return actualDentry->d_op->d_revalidate(actualDentry, nd);
+#endif
}
if (compat_path_lookup(iinfo->name, 0, &actualNd)) {
diff --git a/vmblock-only/linux/file.c b/vmblock-only/linux/file.c
index d7ac1f6..c5e6604 100644
--- a/vmblock-only/linux/file.c
+++ b/vmblock-only/linux/file.c
@@ -39,6 +39,7 @@ typedef ino_t inode_num_t;
#endif
/* Specifically for our filldir_t callback */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,11,0)
typedef struct FilldirInfo {
filldir_t filldir;
void *dirent;
@@ -76,6 +77,7 @@ Filldir(void *buf, // IN: Dirent buffer passed from FileOpReaddir
/* Specify DT_LNK regardless */
return info->filldir(info->dirent, name, namelen, offset, ino, DT_LNK);
}
+#endif
/* File operations */
@@ -132,7 +134,12 @@ FileOpOpen(struct inode *inode, // IN
* and that would try to acquire the inode's semaphore; if the two inodes
* are the same we'll deadlock.
*/
+ // f_dentry is defined as f_path.dentry until 3.19
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,19,0)
if (actualFile->f_dentry && inode == actualFile->f_dentry->d_inode) {
+#else
+ if (actualFile->f_path.dentry && inode == actualFile->f_path.dentry->d_inode) {
+#endif
Warning("FileOpOpen: identical inode encountered, open cannot succeed.\n");
if (filp_close(actualFile, current->files) < 0) {
Warning("FileOpOpen: unable to close opened file.\n");
@@ -164,13 +171,20 @@ FileOpOpen(struct inode *inode, // IN
*----------------------------------------------------------------------------
*/
+// pavlinux's patch completely removes this bit for kernels older than 3.13
static int
FileOpReaddir(struct file *file, // IN
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,11,0)
void *dirent, // IN
filldir_t filldir) // IN
+#else
+ struct dir_context* ctx) //IN
+#endif
{
int ret;
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,11,0)
FilldirInfo info;
+#endif
struct file *actualFile;
if (!file) {
@@ -184,12 +198,20 @@ FileOpReaddir(struct file *file, // IN
return -EINVAL;
}
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,11,0)
info.filldir = filldir;
info.dirent = dirent;
actualFile->f_pos = file->f_pos;
ret = vfs_readdir(actualFile, Filldir, &info);
file->f_pos = actualFile->f_pos;
+#else
+ /* Ricky Wong Yung Fei:
+ * Manipulation of pos is now handled internally by iterate_dir().
+ */
+ ret = iterate_dir(actualFile, ctx);
+ file->f_pos = actualFile->f_pos;
+#endif
return ret;
}
@@ -236,8 +258,15 @@ FileOpRelease(struct inode *inode, // IN
}
+// pavlinux's patch drops FileOpReaddr for < 3.13
+// pavlinux's patch sets .owner = THIS_MODULE and .llseek = no_llseek
struct file_operations RootFileOps = {
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,11,0)
.readdir = FileOpReaddir,
+#else
+ .iterate = FileOpReaddir,
+#endif
+ .owner = THIS_MODULE,
.open = FileOpOpen,
.release = FileOpRelease,
};
diff --git a/vmblock-only/linux/inode.c b/vmblock-only/linux/inode.c
index 098c94c..7aed6e7 100644
--- a/vmblock-only/linux/inode.c
+++ b/vmblock-only/linux/inode.c
@@ -28,20 +28,32 @@
#include <linux/fs.h>
#include <linux/time.h>
#include <linux/namei.h>
+#include <linux/cred.h>
#include "vmblockInt.h"
#include "filesystem.h"
#include "block.h"
/* Inode operations */
+// Again, it looks like last arg should've always been unsigned int ~MK
static struct dentry *InodeOpLookup(struct inode *dir,
- struct dentry *dentry, struct nameidata *nd);
-static int InodeOpReadlink(struct dentry *dentry, char __user *buffer, int buflen);
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 13)
-static void *InodeOpFollowlink(struct dentry *dentry, struct nameidata *nd);
+ struct dentry *dentry,
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0) // Maybe 3.12 or 3.13?
+ struct nameidata *nd);
#else
+ unsigned int flags);
+#endif
+static int InodeOpReadlink(struct dentry *dentry, char __user *buffer, int buflen);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 13)
static int InodeOpFollowlink(struct dentry *dentry, struct nameidata *nd);
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 99)
+static const char *InodeOpGetLink(struct dentry *dentry, struct inode *inode,
+ struct delayed_call *done);
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 99)
+static const char *InodeOpFollowlink(struct dentry *dentry, void **cookie);
+#else
+static void *InodeOpFollowlink(struct dentry *dentry, struct nameidata *nd);
#endif
@@ -49,9 +60,13 @@ struct inode_operations RootInodeOps = {
.lookup = InodeOpLookup,
};
-static struct inode_operations LinkInodeOps = {
+struct inode_operations LinkInodeOps = {
.readlink = InodeOpReadlink,
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 99)
+ .get_link = InodeOpGetLink,
+#else
.follow_link = InodeOpFollowlink,
+#endif
};
@@ -75,7 +90,11 @@ static struct inode_operations LinkInodeOps = {
static struct dentry *
InodeOpLookup(struct inode *dir, // IN: parent directory's inode
struct dentry *dentry, // IN: dentry to lookup
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
struct nameidata *nd) // IN: lookup intent and information
+#else
+ unsigned int flags) // IN: lookup intent and information
+#endif
{
char *filename;
struct inode *inode;
@@ -135,7 +154,16 @@ InodeOpLookup(struct inode *dir, // IN: parent directory's inode
inode->i_size = INODE_TO_IINFO(inode)->nameLen;
inode->i_version = 1;
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 12, 0)
inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
+#else
+ inode->i_atime = inode->i_mtime = inode->i_ctime = current_kernel_time();
+#endif
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0)
inode->i_uid = inode->i_gid = 0;
+#else
+ inode->i_gid = make_kgid(current_user_ns(), 0);
+ inode->i_uid = make_kuid(current_user_ns(), 0);
+#endif
inode->i_op = &LinkInodeOps;
d_add(dentry, inode);
@@ -176,8 +200,15 @@ InodeOpReadlink(struct dentry *dentry, // IN : dentry of symlink
if (!iinfo) {
return -EINVAL;
}
-
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(3, 14, 99)
return vfs_readlink(dentry, buffer, buflen, iinfo->name);
+#elif LINUX_VERSION_CODE <= KERNEL_VERSION(4, 6, 99)
+ return readlink_copy(buffer, buflen, iinfo->name);
+#elif LINUX_VERSION_CODE <= KERNEL_VERSION(4, 9, 99)
+ return generic_readlink(dentry, buffer, buflen);
+#else
+ return vfs_readlink(dentry, buffer, buflen);
+#endif
}
@@ -198,30 +229,58 @@ InodeOpReadlink(struct dentry *dentry, // IN : dentry of symlink
*----------------------------------------------------------------------------
*/
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 13)
-static void *
+static
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 13)
+int
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 99)
+const char *
#else
-static int
+void *
#endif
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 99)
+InodeOpGetLink(struct dentry *dentry, struct inode *inode,
+ struct delayed_call *done)
+#else
InodeOpFollowlink(struct dentry *dentry, // IN : dentry of symlink
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 99)
+ void **cookie)
+#else
struct nameidata *nd) // OUT: stores result
+#endif
+#endif
{
int ret;
VMBlockInodeInfo *iinfo;
if (!dentry) {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 99)
+ ret = -ECHILD;
+#else
Warning("InodeOpReadlink: invalid args from kernel\n");
ret = -EINVAL;
+#endif
goto out;
}
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 99)
+ iinfo = INODE_TO_IINFO(inode);
+#else
iinfo = INODE_TO_IINFO(dentry->d_inode);
+#endif
if (!iinfo) {
ret = -EINVAL;
goto out;
}
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 12, 0)
ret = vfs_follow_link(nd, iinfo->name);
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 99)
+ return (char *)(iinfo->name);
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 99)
+ return *cookie = (char *)(iinfo->name);
+#else
+ nd_set_link(nd, iinfo->name);
+#endif
out:
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 13)
diff --git a/vmblock-only/shared/compat_namei.h b/vmblock-only/shared/compat_namei.h
index f82dd49..426d40b 100644
--- a/vmblock-only/shared/compat_namei.h
+++ b/vmblock-only/shared/compat_namei.h
@@ -45,4 +45,20 @@
#define compat_path_lookup(name, flags, nd) path_lookup(name, flags, nd)
#endif
+/* nameidata struct for 4.2+ */
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,2,0)
+struct nameidata {
+ struct path path;
+ struct qstr last;
+ struct path root;
+ struct inode *inode; /* path.dentry.d_inode */
+ unsigned int flags;
+ unsigned seq, m_seq;
+ int last_type;
+ unsigned depth;
+ struct file *base;
+ char *saved_names[MAX_NESTED_LINKS + 1];
+};
+#endif
+
#endif /* __COMPAT_NAMEI_H__ */

View File

@@ -0,0 +1,294 @@
diff --git a/vmci-only/Makefile b/vmci-only/Makefile
index c630705..18357e5 100644
--- a/vmci-only/Makefile
+++ b/vmci-only/Makefile
@@ -43,7 +43,11 @@ INCLUDE += -I$(SRCROOT)/shared
endif
+ifdef KVERSION
+VM_UNAME = $(KVERSION)
+else
VM_UNAME = $(shell uname -r)
+endif
# Header directory for the running kernel
ifdef LINUXINCLUDE
diff --git a/vmci-only/Makefile.kernel b/vmci-only/Makefile.kernel
index 8e6e7d0..28eb503 100644
--- a/vmci-only/Makefile.kernel
+++ b/vmci-only/Makefile.kernel
@@ -21,7 +21,7 @@ CC_OPTS += -DVMCI
INCLUDE += -I$(SRCROOT)/shared -I$(SRCROOT)/common -I$(SRCROOT)/linux
-EXTRA_CFLAGS := $(CC_OPTS) $(INCLUDE)
+EXTRA_CFLAGS := $(CC_OPTS) $(INCLUDE) $(LINUXINCLUDE)
obj-m += $(DRIVER).o
diff --git a/vmci-only/linux/driver.c b/vmci-only/linux/driver.c
index f676166..9e42f3f 100644
--- a/vmci-only/linux/driver.c
+++ b/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>
@@ -1466,12 +1467,19 @@ VMCIUserVALockPage(VA addr) // IN:
int retval;
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);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 5, 99)
+ 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 +1694,11 @@ vmci_guest_init(void)
/* This should be last to make sure we are done initializing. */
retval = pci_register_driver(&vmci_driver);
if (retval < 0) {
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 15, 0)
vfree(data_buffer);
+#else
+ kvfree(data_buffer);
+#endif
data_buffer = NULL;
return retval;
}
@@ -1722,12 +1734,25 @@
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 +2505,11 @@ vmci_exit(void)
if (guestDeviceInit) {
pci_unregister_driver(&vmci_driver);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 15, 0)
vfree(data_buffer);
+#else
+ kvfree(data_buffer);
+#endif
data_buffer = NULL;
guestDeviceInit = FALSE;
}
@@ -2490,7 +2519,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 3fba8b6..1836442 100644
--- a/vmci-only/linux/vmciKernelIf.c
+++ b/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, 10, 99)
+#include <linux/sched/signal.h>
+#endif
#include "compat_highmem.h"
#include "compat_interrupt.h"
@@ -1198,16 +1199,29 @@ __VMCIMemcpyToQueue(VMCIQueue *queue, // OUT:
}
if (isIovec) {
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0)
struct iovec *iov = (struct iovec *)src;
+#else
+ struct msghdr *msg = (struct msghdr *)src;
+#endif
int err;
/* The iovec will track bytesCopied internally. */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0)
err = memcpy_fromiovec((uint8 *)va + pageOffset, iov, toCopy);
+#else
+ err = memcpy_from_msg((uint8 *)va + pageOffset, msg, toCopy);
+#endif
if (err != 0) {
if (kernelIf->host) {
kunmap(kernelIf->u.h.page[pageIndex]);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0)
}
return VMCI_ERROR_INVALID_ARGS;
+#else
+ return VMCI_ERROR_INVALID_ARGS;
+ }
+#endif
}
} else {
memcpy((uint8 *)va + pageOffset, (uint8 *)src + bytesCopied, toCopy);
@@ -1273,11 +1287,19 @@ __VMCIMemcpyFromQueue(void *dest, // OUT:
}
if (isIovec) {
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0)
struct iovec *iov = (struct iovec *)dest;
+#else
+ struct msghdr *msg = (struct msghdr *)dest;
+#endif
int err;
/* The iovec will track bytesCopied internally. */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0)
err = memcpy_toiovec(iov, (uint8 *)va + pageOffset, toCopy);
+#else
+ err = memcpy_to_msg(msg, (uint8 *)va + pageOffset, toCopy);
+#endif
if (err != 0) {
if (kernelIf->host) {
kunmap(kernelIf->u.h.page[pageIndex]);
@@ -1834,7 +1856,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;
}
}
@@ -2048,21 +2074,22 @@ VMCIHost_GetUserMemory(VA64 produceUVA, // IN
int err = VMCI_SUCCESS;
down_write(&current->mm->mmap_sem);
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 6, 0)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 5, 99)
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,11 +2097,19 @@ VMCIHost_GetUserMemory(VA64 produceUVA, // IN
goto out;
}
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 5, 99)
+ 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) {
diff --git a/vmci-only/shared/compat_module.h b/vmci-only/shared/compat_module.h
index 2af7372..729aedc 100644
--- a/vmci-only/shared/compat_module.h
+++ b/vmci-only/shared/compat_module.h
@@ -80,4 +80,13 @@ static const char __module_cat(tag, __LINE__)[] \
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, 2, 99)
+#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 e2cb477..3dd7097 100644
--- a/vmci-only/shared/vm_device_version.h
+++ b/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 9def671..082fe59 100644
--- a/vmci-only/shared/vmci_kernel_if.h
+++ b/vmci-only/shared/vmci_kernel_if.h
@@ -100,7 +100,7 @@
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;

View File

@@ -0,0 +1,266 @@
diff --git a/vsock-only/Makefile b/vsock-only/Makefile
index 5d92e9b..7d315e8 100644
--- a/vsock-only/Makefile
+++ b/vsock-only/Makefile
@@ -42,8 +42,11 @@ AUTOCONF_DIR := $(SRCROOT)/shared/autoconf
INCLUDE += -I$(SRCROOT)/shared
endif
-
+ifdef KVERSION
+VM_UNAME = $(KVERSION)
+else
VM_UNAME = $(shell uname -r)
+endif
# Header directory for the running kernel
ifdef LINUXINCLUDE
diff --git a/vsock-only/Makefile.kernel b/vsock-only/Makefile.kernel
index 5218df2..374cc1f 100644
--- a/vsock-only/Makefile.kernel
+++ b/vsock-only/Makefile.kernel
@@ -25,7 +25,7 @@ INCLUDE += -I$(SRCROOT)/include
INCLUDE += -I$(SRCROOT)/linux
INCLUDE += -I$(SRCROOT)/common
-EXTRA_CFLAGS := $(CC_OPTS) $(INCLUDE)
+EXTRA_CFLAGS := $(CC_OPTS) $(INCLUDE) $(LINUXINCLUDE)
EXTRA_CFLAGS += $(call vm_check_build, $(AUTOCONF_DIR)/netcreate_num_params.c, -DVMW_NETCREATE_KERNARG, )
diff --git a/vsock-only/linux/af_vsock.c b/vsock-only/linux/af_vsock.c
index bde1497..9f8f843 100644
--- a/vsock-only/linux/af_vsock.c
+++ b/vsock-only/linux/af_vsock.c
@@ -113,6 +113,9 @@
asmlinkage __attribute__((weak)) long
sys_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg);
#endif
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 99)
+#include <linux/sched/signal.h>
+#endif
#include "compat_cred.h"
#include "compat_module.h"
@@ -213,7 +216,11 @@
struct sockaddr *addr, int addrLen, int flags);
static int VSockVmciStreamConnect(struct socket *sock,
struct sockaddr *addr, int addrLen, int flags);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0)
static int VSockVmciAccept(struct socket *sock, struct socket *newsock, int flags);
+#else
+static int VSockVmciAccept(struct socket *sock, struct socket *newsock, int flags, bool kern);
+#endif
static int VSockVmciGetname(struct socket *sock,
struct sockaddr *addr, int *addrLen, int peer);
static unsigned int VSockVmciPoll(struct file *file,
@@ -233,13 +240,29 @@ static int VSockVmciStreamSetsockopt(struct socket *sock, int level, int optname
static int VSockVmciStreamGetsockopt(struct socket *sock, int level, int optname,
char __user *optval, int __user * optlen);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 99)
static int VSockVmciDgramSendmsg(struct kiocb *kiocb,
+#else
+static int VSockVmciDgramSendmsg(
+#endif
struct socket *sock, struct msghdr *msg, size_t len);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 99)
static int VSockVmciDgramRecvmsg(struct kiocb *kiocb, struct socket *sock,
+#else
+static int VSockVmciDgramRecvmsg(struct socket *sock,
+#endif
struct msghdr *msg, size_t len, int flags);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 99)
static int VSockVmciStreamSendmsg(struct kiocb *kiocb,
+#else
+static int VSockVmciStreamSendmsg(
+#endif
struct socket *sock, struct msghdr *msg, size_t len);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 99)
static int VSockVmciStreamRecvmsg(struct kiocb *kiocb, struct socket *sock,
+#else
+static int VSockVmciStreamRecvmsg(struct socket *sock,
+#endif
struct msghdr *msg, size_t len, int flags);
static int VSockVmciCreate(
@@ -2872,11 +2895,18 @@ __VSockVmciCreate(struct net *net, // IN: Network namespace
* From 2.6.9 to until 2.6.12 sk_alloc() used a cache in
* the protocol structure, but you still had to specify the size and cache
* yourself.
- * Most recently (in 2.6.24), sk_alloc() was changed to expect the
+ * In 2.6.24, sk_alloc() was changed to expect the
* network namespace, and the option to zero the sock was dropped.
*
+ * In 4.2, another parameter was added to sk_alloc() allowing you to specify
+ * whether or not the socket is to be a kernel socket. Previously, we passed
+ * 1 to this new parameter, but following Gentoo's lead
+ * ( https://github.com/gentoo/vmware/blob/master/app-emulation/vmware-modules/files/308-4.02-01-sk_alloc.patch#L19 )
+ * we have switched to passing 0.
*/
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 12)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 99)
+ sk = sk_alloc(net, vsockVmciFamilyOps.family, priority, &vsockVmciProto, 0);
+#elif LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 12)
sk = sk_alloc(vsockVmciFamilyOps.family, priority,
vsockVmciProto.slab_obj_size, vsockVmciProto.slab);
#elif LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24)
@@ -3825,7 +3855,12 @@
static int
VSockVmciAccept(struct socket *sock, // IN
struct socket *newsock, // IN/OUT
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0)
int flags) // IN
+#else
+ int flags, // IN
+ bool kern)
+#endif
{
struct sock *listener;
int err;
@@ -4260,7 +4295,11 @@ VSockVmciShutdown(struct socket *sock, // IN
*/
static int
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 99)
VSockVmciDgramSendmsg(struct kiocb *kiocb, // UNUSED
+#else
+VSockVmciDgramSendmsg(
+#endif
struct socket *sock, // IN: socket to send on
struct msghdr *msg, // IN: message to send
size_t len) // IN: length of message
@@ -4352,7 +4391,11 @@ VSockVmciDgramSendmsg(struct kiocb *kiocb, // UNUSED
goto out;
}
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0)
memcpy_fromiovec(VMCI_DG_PAYLOAD(dg), msg->msg_iov, len);
+#else
+ memcpy_from_msg(VMCI_DG_PAYLOAD(dg), msg, len);
+#endif
dg->dst = VMCI_MAKE_HANDLE(remoteAddr->svm_cid, remoteAddr->svm_port);
dg->src = VMCI_MAKE_HANDLE(vsk->localAddr.svm_cid, vsk->localAddr.svm_port);
@@ -4590,7 +4633,11 @@ VSockVmciStreamGetsockopt(struct socket *sock, // IN
*/
static int
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 99)
VSockVmciStreamSendmsg(struct kiocb *kiocb, // UNUSED
+#else
+VSockVmciStreamSendmsg(
+#endif
struct socket *sock, // IN: socket to send on
struct msghdr *msg, // IN: message to send
size_t len) // IN: length of message
@@ -4712,7 +4759,11 @@ VSockVmciStreamSendmsg(struct kiocb *kiocb, // UNUSED
* able to send.
*/
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0)
written = vmci_qpair_enquev(vsk->qpair, msg->msg_iov,
+#else
+ written = vmci_qpair_enquev(vsk->qpair, &msg->msg_iter.iov,
+#endif
len - totalWritten, 0);
if (written < 0) {
err = -ENOMEM;
@@ -4759,7 +4810,11 @@ out:
*/
static int
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 99)
VSockVmciDgramRecvmsg(struct kiocb *kiocb, // UNUSED
+#else
+VSockVmciDgramRecvmsg(
+#endif
struct socket *sock, // IN: socket to receive from
struct msghdr *msg, // IN/OUT: message to receive into
size_t len, // IN: length of receive buffer
@@ -4809,7 +4864,11 @@ VSockVmciDgramRecvmsg(struct kiocb *kiocb, // UNUSED
}
/* Place the datagram payload in the user's iovec. */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0)
err = skb_copy_datagram_iovec(skb, sizeof *dg, msg->msg_iov, payloadLen);
+#else
+ err = skb_copy_datagram_iter(skb, sizeof *dg, &msg->msg_iter, payloadLen);
+#endif
if (err) {
goto out;
}
@@ -4850,7 +4909,11 @@ out:
*/
static int
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 99)
VSockVmciStreamRecvmsg(struct kiocb *kiocb, // UNUSED
+#else
+VSockVmciStreamRecvmsg(
+#endif
struct socket *sock, // IN: socket to receive from
struct msghdr *msg, // IN/OUT: message to receive into
size_t len, // IN: length of receive buffer
@@ -4955,9 +5018,17 @@ VSockVmciStreamRecvmsg(struct kiocb *kiocb, // UNUSED
}
if (flags & MSG_PEEK) {
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0)
read = vmci_qpair_peekv(vsk->qpair, msg->msg_iov, len - copied, 0);
+#else
+ read = vmci_qpair_peekv(vsk->qpair, &msg->msg_iter.iov, len - copied, 0);
+#endif
} else {
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0)
read = vmci_qpair_dequev(vsk->qpair, msg->msg_iov, len - copied, 0);
+#else
+ read = vmci_qpair_dequev(vsk->qpair, &msg->msg_iter.iov, len - copied, 0);
+#endif
}
if (read < 0) {
diff --git a/vsock-only/linux/notify.c b/vsock-only/linux/notify.c
index 5b1e134..82d8738 100644
--- a/vsock-only/linux/notify.c
+++ b/vsock-only/linux/notify.c
@@ -516,7 +516,11 @@ VSockVmciHandleWrote(struct sock *sk, // IN
PKT_FIELD(vsk, sentWaitingRead) = FALSE;
#endif
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 15, 0)
sk->sk_data_ready(sk, 0);
+#else
+ sk->sk_data_ready(sk);
+#endif
}
diff --git a/vsock-only/linux/notifyQState.c b/vsock-only/linux/notifyQState.c
index 464454b..7933be7 100644
--- a/vsock-only/linux/notifyQState.c
+++ b/vsock-only/linux/notifyQState.c
@@ -164,7 +164,11 @@ VSockVmciHandleWrote(struct sock *sk, // IN
struct sockaddr_vm *dst, // IN: unused
struct sockaddr_vm *src) // IN: unused
{
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 15, 0)
sk->sk_data_ready(sk, 0);
+#else
+ sk->sk_data_ready(sk);
+#endif
}
@@ -566,7 +570,11 @@ VSockVmciNotifyPktRecvPostDequeue(struct sock *sk, // IN
}
/* See the comment in VSockVmciNotifyPktSendPostEnqueue */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 15, 0)
sk->sk_data_ready(sk, 0);
+#else
+ sk->sk_data_ready(sk);
+#endif
}
return err;

View File

@@ -0,0 +1,145 @@
# Copyright 1999-2018 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
EAPI=6
inherit eutils flag-o-matic linux-info linux-mod user versionator udev
PV_MAJOR=$(get_major_version)
PV_MINOR=$(get_version_component_range 2-3)
DESCRIPTION="VMware kernel modules"
HOMEPAGE="http://www.vmware.com/"
SRC_URI=""
LICENSE="GPL-2"
SLOT="0"
KEYWORDS="~amd64"
IUSE="vmblock vmci vsock"
REQUIRED_USE="!vsock? ( !vmci )"
RDEPEND=""
DEPEND="
=app-emulation/vmware-workstation-14.${PV_MINOR}*
"
S=${WORKDIR}
pkg_setup() {
CONFIG_CHECK="~HIGH_RES_TIMERS"
if kernel_is ge 2 6 37 && kernel_is lt 2 6 39; then
CONFIG_CHECK="${CONFIG_CHECK} BKL"
fi
if use vmci ; then
CONFIG_CHECK="${CONFIG_CHECK} !VMWARE_VMCI"
else
CONFIG_CHECK="${CONFIG_CHECK} VMWARE_VMCI"
fi
if use vsock ; then
CONFIG_CHECK="${CONFIG_CHECK} !VMWARE_VMCI_VSOCKETS"
else
CONFIG_CHECK="${CONFIG_CHECK} VMWARE_VMCI_VSOCKETS"
fi
linux-info_pkg_setup
linux-mod_pkg_setup
VMWARE_GROUP=${VMWARE_GROUP:-vmware}
VMWARE_MODULE_LIST_ALL="vmblock vmmon vmnet vmci vsock"
VMWARE_MODULE_LIST="vmmon vmnet"
use vmci && VMWARE_MODULE_LIST="${VMWARE_MODULE_LIST} vmci"
use vsock && VMWARE_MODULE_LIST="${VMWARE_MODULE_LIST} vsock"
use vmblock && VMWARE_MODULE_LIST="${VMWARE_MODULE_LIST} vmblock"
VMWARE_MOD_DIR="${PN}-${PVR}"
BUILD_TARGETS="auto-build KERNEL_DIR=${KERNEL_DIR} KBUILD_OUTPUT=${KV_OUT_DIR}"
enewgroup "${VMWARE_GROUP}"
filter-flags -mfpmath=sse -mavx -mpclmul -maes
append-cflags -mno-sse # Found a problem similar to bug #492964
for mod in ${VMWARE_MODULE_LIST}; do
MODULE_NAMES="${MODULE_NAMES} ${mod}(misc:${S}/${mod}-only)"
done
}
src_unpack() {
cd "${S}"
for mod in ${VMWARE_MODULE_LIST_ALL}; do
tar -xf /opt/vmware/lib/vmware/modules/source/${mod}.tar
done
}
src_prepare() {
# from Arch Linux: https://aur.archlinux.org/packages/vmware-workstation/
if use vmblock; then
epatch "${FILESDIR}/${PV_MAJOR}-vmblock.patch"
fi
if use vmci; then
epatch "${FILESDIR}/${PV_MAJOR}-vmci.patch"
fi
if use vsock; then
epatch "${FILESDIR}/${PV_MAJOR}-vsock.patch"
epatch "${FILESDIR}/${PV_MAJOR}-4.14-00-vsock-gcc-plugins-randstruct.patch"
fi
# from https://github.com/mkubecek/vmware-host-modules/tree/workstation-14.0.0
epatch "${FILESDIR}/${PV_MAJOR}-00-vmmon-quick-workaround-for-objtool-warnings.patch"
kernel_is ge 4 9 0 && epatch "${FILESDIR}/${PV_MAJOR}-4.09-00-vmnet-use-standard-definition-of-PCI_VENDOR_ID_VMWAR.patch"
kernel_is ge 4 10 0 && epatch "${FILESDIR}/${PV_MAJOR}-4.10-00-vmnet-use-standard-definition-of-PCI_VENDOR_ID_VMWAR.patch"
kernel_is ge 4 12 0 && epatch "${FILESDIR}/${PV_MAJOR}-4.12-00-vmmon-use-standard-definition-of-MSR_MISC_FEATURES_E.patch"
kernel_is ge 4 13 0 && epatch "${FILESDIR}/${PV_MAJOR}-4.13-00-vmmon-use-standard-definition-of-CR3_PCID_MASK-if-av.patch"
# decouple the kernel include dir from the running kernel version: https://github.com/stefantalpalaru/gentoo-overlay/issues/17
sed -i -e "s%HEADER_DIR = /lib/modules/\$(VM_UNAME)/build/include%HEADER_DIR = ${KERNEL_DIR}/include%" */Makefile || die "sed failed"
# Allow user patches so they can support RC kernels and whatever else
default
}
src_install() {
linux-mod_src_install
local udevrules="${T}/60-vmware.rules"
cat > "${udevrules}" <<-EOF
KERNEL=="vmci", GROUP="vmware", MODE="660"
KERNEL=="vmw_vmci", GROUP="vmware", MODE="660"
KERNEL=="vmmon", GROUP="vmware", MODE="660"
KERNEL=="vsock", GROUP="vmware", MODE="660"
EOF
udev_dorules "${udevrules}"
if ! use vmci ; then
dodir /etc/modprobe.d/
cat > "${D}"/etc/modprobe.d/vmware.conf <<-EOF
# Support for vmware vmci in kernel module
alias vmci vmw_vmci
EOF
export installed_modprobe_conf=1
fi
if ! use vsock ; then
dodir /etc/modprobe.d/
cat >> "${D}"/etc/modprobe.d/vmware.conf <<-EOF
# Support for vmware vsock in kernel module
alias vsock vmw_vsock_vmci_transport
EOF
export installed_modprobe_conf=1
fi
}
pkg_postinst() {
linux-mod_pkg_postinst
if [ "${installed_modprobe_conf}"x == "x" ] ; then
if [ -f "${ROOT}/etc/modprobe.d/vmware.conf" ] ; then
ewarn "Please check the /etc/modprobe.d/vmware.conf file and"
ewarn "possible conflicts when using vmci and/or vsock modules built"
ewarn "out of kernel"
fi
fi
}