patch for /usr/ports/emulators/vmware3

fchang at cs.ubc.ca fchang at cs.ubc.ca
Mon Mar 3 17:45:22 UTC 2008


Hi all:

I finally got /usr/ports/emulator/vmware3 working on FreeBSD 7.0 i386.
There were 3 changes needed:

1) The avail_end kernel variable no longer exists; I googled and was
able to use Kip Macy's suggested replacement code
http://lists.freebsd.org/pipermail/freebsd-current/2007-January/068377.html

2) One of the assembly routine cannot compile, but fortunately that
routine is unused, so I just commented it out using an "#if 0" block

3) One file uses the old FILEDESC_LOCK and FILEDESC_UNLOCK.
Based on suggestion I found on mailing lists, I believe it is
equivalent to the new FILEDESC_SLOCK and FILEDESC_SUNLOCK.

With the 3 changes, I was able to run vmware3 and boot up Windows XP in it.
It appears stable on my machine.

Here is the patch:


--- work/vmware-distrib/vmmon-only/freebsd/driver.c.old 2008-03-03 17:03:25.000000000 +0000
+++ work/vmware-distrib/vmmon-only/freebsd/driver.c     2008-03-03 17:04:13.000000000 +0000
@@ -397,12 +397,12 @@
         if ((error = falloc(td, &fp, &fd)) != 0)
                 return error;

-       FILEDESC_LOCK(p->p_fd);
+       FILEDESC_SLOCK(p->p_fd);
         fp->f_data = data;
         fp->f_flag = flags & FMASK;
         fp->f_ops = &vmmon_fileops;
         fp->f_type = DTYPE_SOCKET;
-       FILEDESC_UNLOCK(p->p_fd);
+       FILEDESC_SUNLOCK(p->p_fd);

  #if __FreeBSD_version >= 501111
         /* falloc now returns TWO references to the file, not one. */
@@ -1309,6 +1309,19 @@
         return FALSE;
  }

+static vm_paddr_t
+get_avail_end(void)
+{
+        vm_paddr_t avail_end;
+        int i;
+        avail_end = phys_avail[1];
+        for (i = 0; phys_avail[i + 1]; i += 2) {
+                if (phys_avail[i + 1] > avail_end)
+                        avail_end = phys_avail[i + 1];
+        }
+        return avail_end;
+}
+
  /*
   * Allocate and lock numPages of memory physically continguous addresses
   * below 4GB.
@@ -1341,6 +1354,7 @@
                 VMDEBUG("vmmon_alloc_low_pages: malloc MemRange failed\n");
                 return ENOMEM;
         }
+       vm_paddr_t avail_end = get_avail_end();
         if (avail_end > ISA_DMA_BOUNCE_THRESHOLD)
                 high = trunc_page(ISA_DMA_BOUNCE_THRESHOLD);
         else

--- work/vmware-distrib/vmmon-only/include/vm_asm.h.old 2008-03-03 17:03:22.000000000 +0000
+++ work/vmware-distrib/vmmon-only/include/vm_asm.h     2008-03-03 17:07:21.000000000 +0000
@@ -1020,6 +1020,7 @@
   *-----------------------------------------------------------------------------
   */

+#if 0
  static INLINE void
  Div643264(uint64 dividend,
            uint32 divisor,
@@ -1047,6 +1048,7 @@
     *quotient = (uint64)hQuotient << 32 | lQuotient;
  }
  #endif
+#endif


  #endif /* VM_ASM_H */



More information about the freebsd-emulation mailing list