Date: Mon, 3 Mar 2008 09:16:20 -0800 (PST) From: fchang@cs.ubc.ca To: freebsd-emulation@FreeBSD.org Subject: patch for /usr/ports/emulators/vmware3 Message-ID: <Pine.GSO.4.60.0803030908590.24210@cascade.cs.ubc.ca>
next in thread | raw e-mail | index | archive | help
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 */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.GSO.4.60.0803030908590.24210>