Advertisement
Guest User

EqUaTe

a guest
Feb 18th, 2009
244
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.35 KB | None | 0 0
  1. diff -urN vmware-server-kernel.orig/vmmon-only/autoconf/fault.c vmware-server-kernel/vmmon-only/autoconf/fault.c
  2. --- vmware-server-kernel.orig/vmmon-only/autoconf/fault.c 1970-01-01 01:00:00.000000000 +0100
  3. +++ vmware-server-kernel/vmmon-only/autoconf/fault.c 2008-09-21 16:56:04.000000000 +0200
  4. @@@@ -0,0 +1,18 @@
  5. +/*
  6. + * we'll try to use fault instead of nopage since 2.6.26
  7. + */
  8. +#include <linux/autoconf.h>
  9. +#include <linux/version.h>
  10. +
  11. +#include <linux/mm.h>
  12. +
  13. +int LinuxDriverFault(struct vm_area_struct *vma,
  14. + struct vm_fault *vmf) {
  15. + (void)vma;
  16. + (void)vmf;
  17. + return VM_FAULT_MAJOR;
  18. +}
  19. +
  20. +struct vm_operations_struct vmuser_mops = {
  21. + .fault = LinuxDriverFault
  22. +};
  23. diff -ur vmware-server-kernel.orig/vmmon-only/linux/driver.c vmware-server-kernel/vmmon-only/linux/driver.c
  24. --- vmware-server-kernel.orig/vmmon-only/linux/driver.c 2008-09-21 16:46:30.000000000 +0200
  25. +++ vmware-server-kernel/vmmon-only/linux/driver.c 2008-09-21 17:17:54.000000000 +0200
  26. @@@@ -122,7 +122,12 @@
  27.  
  28. static int LinuxDriver_Close(struct inode *inode, struct file *filp);
  29. static unsigned int LinuxDriverPoll(struct file *file, poll_table *wait);
  30. -#if defined(VMW_NOPAGE_261)
  31. +#if defined(VMW_FAULT)
  32. +int LinuxDriverFault(struct vm_area_struct *vma,
  33. + struct vm_fault *vmf);
  34. +int LinuxDriverLockedFault(struct vm_area_struct *vma,
  35. + struct vm_fault *vmf);
  36. +#elif defined(VMW_NOPAGE_261)
  37. static struct page *LinuxDriverNoPage(struct vm_area_struct *vma,
  38. unsigned long address, int *type);
  39. static struct page *LinuxDriverLockedNoPage(struct vm_area_struct *vma,
  40. @@@@ -143,11 +148,19 @@
  41. static void LinuxDriverPollTimeout(unsigned long clientData);
  42.  
  43. static struct vm_operations_struct vmuser_mops = {
  44. +#if defined(VMW_FAULT)
  45. + .fault = LinuxDriverFault
  46. +#else
  47. .nopage = LinuxDriverNoPage
  48. +#endif
  49. };
  50.  
  51. struct vm_operations_struct vmuser_locked_mops = {
  52. +#if defined(VMW_FAULT)
  53. + .fault = LinuxDriverLockedFault
  54. +#else
  55. .nopage = LinuxDriverLockedNoPage
  56. +#endif
  57. };
  58.  
  59. static struct file_operations vmuser_fops;
  60. @@@@ -987,7 +1000,10 @@
  61. *-----------------------------------------------------------------------------
  62. */
  63.  
  64. -#ifdef VMW_NOPAGE_261
  65. +#if defined(VMW_FAULT)
  66. +int LinuxDriverFault(struct vm_area_struct *vma, //IN
  67. + struct vm_fault *vmf) //INOUT
  68. +#elif defined(VMW_NOPAGE_261)
  69. static struct page *LinuxDriverNoPage(struct vm_area_struct *vma, //IN
  70. unsigned long address, //IN
  71. int *type) //OUT: Fault type
  72. @@@@ -1004,12 +1020,19 @@
  73. VMLinux *vmLinux = (VMLinux *) vma->vm_file->private_data;
  74. unsigned long pg;
  75.  
  76. - pg = (address - vma->vm_start) >> PAGE_SHIFT;
  77. + pg = ((unsigned long)vmf->virtual_address - vma->vm_start) >> PAGE_SHIFT; // use vmf->pgoff?
  78. if (pg >= vmLinux->size4Gb) {
  79. +#ifdef VMW_FAULT
  80. + return VM_FAULT_SIGBUS;
  81. +#else
  82. return 0;
  83. +#endif
  84. }
  85. get_page(virt_to_page(vmLinux->pages4Gb[pg]));
  86. -#ifdef KERNEL_2_4_0
  87. +#if defined(VMW_FAULT)
  88. + vmf->page = virt_to_page(vmLinux->pages4Gb[pg]);
  89. + return VM_FAULT_MAJOR;
  90. +#elif defined(KERNEL_2_4_0)
  91. #ifdef VMW_NOPAGE_261
  92. *type = VM_FAULT_MINOR;
  93. #endif
  94. @@@@ -1037,7 +1060,10 @@
  95. *-----------------------------------------------------------------------------
  96. */
  97.  
  98. -#ifdef VMW_NOPAGE_261
  99. +#if defined(VMW_FAULT)
  100. +int LinuxDriverLockedFault(struct vm_area_struct *vma, //IN
  101. + struct vm_fault *vmf) //INOUT
  102. +#elif defined(VMW_NOPAGE_261)
  103. static struct page *LinuxDriverLockedNoPage(struct vm_area_struct *vma, //IN
  104. unsigned long address, //IN
  105. int *type) //OUT: Fault type
  106. @@@@ -1057,33 +1083,56 @@
  107. struct VMHostEntry* vmhe;
  108. struct page* result;
  109.  
  110. - pg = ((address - vma->vm_start) >> PAGE_SHIFT) + compat_vm_pgoff(vma);
  111. + pg = (((unsigned long)vmf->virtual_address - vma->vm_start) >> PAGE_SHIFT) + compat_vm_pgoff(vma); // use vmf->pgoff?
  112. if (pg >= vmLinux->sizeLocked) {
  113. printk(KERN_DEBUG "vmmon: Something went wrong: entry %08lX out of range (>=%08X) for mapping on filp %p\n", pg, vmLinux->sizeLocked, vmLinux);
  114. +#ifdef VMW_FAULT
  115. + return VM_FAULT_SIGBUS;
  116. +#else
  117. return NOPAGE_SIGBUS;
  118. +#endif
  119. }
  120. if (!vmLinux->vm || !vmLinux->vm->vmhost) {
  121. printk(KERN_DEBUG "vmmon: Something went wrong: no vm or vmhost for mapping on filp %p\n", vmLinux);
  122. +#ifdef VMW_FAULT
  123. + return VM_FAULT_SIGBUS;
  124. +#else
  125. return NOPAGE_SIGBUS;
  126. +#endif
  127. }
  128. pgt = vmLinux->pagesLocked->ent[pg / VMHOST_MAPPING_PT];
  129. if (!pgt) {
  130. printk(KERN_DEBUG "vmmon: Something went wrong: missing entry %08lX from mapping on filp %p\n", pg, vmLinux);
  131. +#ifdef VMW_FAULT
  132. + return VM_FAULT_SIGBUS;
  133. +#else
  134. return NOPAGE_SIGBUS;
  135. +#endif
  136. }
  137. vmhe = kmap(pgt);
  138. result = vmhe->ent[pg % VMHOST_MAPPING_PT];
  139. kunmap(pgt);
  140. if (!result) {
  141. printk(KERN_DEBUG "vmmon: Something went wrong: attempt to access non-existing entry %08lX in mapping on filp %p\n", pg, vmLinux);
  142. +#ifdef VMW_FAULT
  143. + return VM_FAULT_SIGBUS;
  144. +#else
  145. return NOPAGE_SIGBUS;
  146. +#endif
  147. }
  148. if (!PhysTrack_Test(vmLinux->vm->vmhost->AWEPages, page_to_pfn(result))) {
  149. printk(KERN_DEBUG "vmmon: MPN %08lX not tracked! Someone released it before removing it from VA first!\n", pg);
  150. +#ifdef VMW_FAULT
  151. + return VM_FAULT_SIGBUS;
  152. +#else
  153. return NOPAGE_SIGBUS;
  154. +#endif
  155. }
  156. get_page(result);
  157. -#ifdef KERNEL_2_4_0
  158. +#if defined(VMW_FAULT)
  159. + vmf->page = result;
  160. + return VM_FAULT_MAJOR;
  161. +#elif defined(KERNEL_2_4_0)
  162. #ifdef VMW_NOPAGE_261
  163. *type = VM_FAULT_MINOR;
  164. #endif
  165. diff -ur vmware-server-kernel.orig/vmmon-only/Makefile.kernel vmware-server-kernel/vmmon-only/Makefile.kernel
  166. --- vmware-server-kernel.orig/vmmon-only/Makefile.kernel 2008-09-21 16:46:30.000000000 +0200
  167. +++ vmware-server-kernel/vmmon-only/Makefile.kernel 2008-09-21 16:55:08.000000000 +0200
  168. @@@@ -13,6 +13,7 @@
  169.  
  170. EXTRA_CFLAGS := $(CC_OPTS) $(INCLUDE)
  171.  
  172. +EXTRA_CFLAGS += $(call vm_check_build, $(SRCROOT)/autoconf/fault.c, -DVMW_FAULT, )
  173. EXTRA_CFLAGS += $(call vm_check_build, $(SRCROOT)/autoconf/nopage1.c, -DVMW_NOPAGE_261, )
  174. EXTRA_CFLAGS += $(call vm_check_build, $(SRCROOT)/autoconf/skas1.c, -DVMW_SKAS_MMAP, )
  175. EXTRA_CFLAGS += $(call vm_check_build, $(SRCROOT)/autoconf/epoll.c, -DVMW_HAVE_EPOLL, )
  176. diff -ur vmware-server-kernel.orig/vmmon-only/Makefile.normal vmware-server-kernel/vmmon-only/Makefile.normal
  177. --- vmware-server-kernel.orig/vmmon-only/Makefile.normal 2008-09-21 16:46:30.000000000 +0200
  178. +++ vmware-server-kernel/vmmon-only/Makefile.normal 2008-09-21 16:55:07.000000000 +0200
  179. @@@@ -60,6 +60,7 @@
  180. INCLUDE += $(shell $(CC) $(INCLUDE) -E $(SRCROOT)/autoconf/geninclude.c \
  181. | sed -n -e 's!^APATH!-I$(HEADER_DIR)/asm!p')
  182.  
  183. +CC_OPTS += $(call vm_check_build, $(SRCROOT)/autoconf/fault.c, -DVMW_FAULT, )
  184. CC_OPTS += $(call vm_check_build, $(SRCROOT)/autoconf/nopage1.c, -DVMW_NOPAGE_261, )
  185. CC_OPTS += $(call vm_check_build, $(SRCROOT)/autoconf/skas1.c, -DVMW_SKAS_MMAP, )
  186. CC_OPTS += $(call vm_check_build, $(SRCROOT)/autoconf/epoll.c, -DVMW_HAVE_EPOLL, )
  187. diff -ur vmware-server-kernel.orig/vmnet-only/bridge.c vmware-server-kernel/vmnet-only/bridge.c
  188. --- vmware-server-kernel.orig/vmnet-only/bridge.c 2008-09-21 16:46:29.000000000 +0200
  189. +++ vmware-server-kernel/vmnet-only/bridge.c 2008-09-21 17:31:47.000000000 +0200
  190. @@@@ -274,7 +274,7 @@
  191. struct net_device *net) // IN: Network device
  192. {
  193. #ifdef VMW_NETDEV_HAS_NET
  194. - if (net->nd_net != bridge->internalDev->nd_net) {
  195. + if (dev_net(net) != dev_net(bridge->internalDev)) {
  196. return 0;
  197. }
  198. #endif
  199. diff -ur vmware-server-kernel.orig/vmnet-only/procfs.c vmware-server-kernel/vmnet-only/procfs.c
  200. --- vmware-server-kernel.orig/vmnet-only/procfs.c 2008-09-21 16:46:29.000000000 +0200
  201. +++ vmware-server-kernel/vmnet-only/procfs.c 2008-09-21 17:35:53.000000000 +0200
  202. @@@@ -63,7 +63,7 @@
  203. {
  204. int retval;
  205.  
  206. - retval = VNetProc_MakeEntry(&proc_root, "vmnet", S_IFDIR, &base);
  207. + retval = VNetProc_MakeEntry(NULL, "vmnet", S_IFDIR, &base);
  208. if (retval) {
  209. return retval;
  210. }
  211. @@@@ -95,7 +95,7 @@
  212. void
  213. VNetProc_Cleanup(void)
  214. {
  215. - VNetProc_RemoveEntry(base, &proc_root);
  216. + VNetProc_RemoveEntry(base, NULL);
  217. base = NULL;
  218. }
  219.  
  220. diff -ur vmware-server-kernel.orig/vmnet-only/vmnetInt.h vmware-server-kernel/vmnet-only/vmnetInt.h
  221. --- vmware-server-kernel.orig/vmnet-only/vmnetInt.h 2008-09-21 16:46:29.000000000 +0200
  222. +++ vmware-server-kernel/vmnet-only/vmnetInt.h 2008-09-21 17:30:33.000000000 +0200
  223. @@@@ -63,7 +63,7 @@
  224. # define dev_lock_list() read_lock(&dev_base_lock)
  225. # define dev_unlock_list() read_unlock(&dev_base_lock)
  226. # ifdef VMW_NETDEV_HAS_NET
  227. -# define DEV_GET(x) __dev_get_by_name((x)->internalDev->nd_net, (x)->name)
  228. +# define DEV_GET(x) __dev_get_by_name(dev_net((x)->internalDev), (x)->name)
  229. # else
  230. # define DEV_GET(x) __dev_get_by_name((x)->name)
  231. # endif
  232. @@@@ -89,7 +89,7 @@
  233.  
  234. #ifdef VMW_NETDEV_HAS_NET
  235. extern struct proto vmnet_proto;
  236. -# define compat_sk_alloc(_bri, _pri) sk_alloc((_bri)->internalDev->nd_net, \
  237. +# define compat_sk_alloc(_bri, _pri) sk_alloc(dev_net((_bri)->internalDev), \
  238. PF_NETLINK, _pri, &vmnet_proto)
  239. #elif defined(VMW_HAVE_SK_ALLOC_WITH_PROTO)
  240. extern struct proto vmnet_proto;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement