aboutsummaryrefslogtreecommitdiff
path: root/emulators
diff options
context:
space:
mode:
authorBernhard Froehlich <decke@FreeBSD.org>2013-01-03 13:37:12 +0000
committerBernhard Froehlich <decke@FreeBSD.org>2013-01-03 13:37:12 +0000
commitc99eac3bb883533949aa4699f3c272c5e7114d13 (patch)
treed3a0541d3b7981ce5b5583f38da42bca7033df6e /emulators
parentd40af8285da4ef6f5fdc46981077f20729c9b12d (diff)
downloadports-c99eac3bb883533949aa4699f3c272c5e7114d13.tar.gz
ports-c99eac3bb883533949aa4699f3c272c5e7114d13.zip
Notes
Diffstat (limited to 'emulators')
-rw-r--r--emulators/virtualbox-ose-kmod-legacy/Makefile29
-rw-r--r--emulators/virtualbox-ose-kmod-legacy/distinfo4
-rw-r--r--emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-HostDrivers-VBoxNetAdp-freebsd-Makefile16
-rw-r--r--emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-HostDrivers-VBoxNetAdp-freebsd-VBoxNetAdp-freebsd.c54
-rw-r--r--emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-HostDrivers-VBoxNetFlt-freebsd-VBoxNetFlt-freebsd.c31
-rw-r--r--emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-memobj-r0drv-freebsd.c925
-rw-r--r--emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-mp-r0drv-freebsd.c79
-rw-r--r--emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-semfastmutex-r0drv-freebsd.c15
-rw-r--r--emulators/virtualbox-ose-kmod-legacy/pkg-plist4
-rw-r--r--emulators/virtualbox-ose-legacy/Makefile38
-rw-r--r--emulators/virtualbox-ose-legacy/distinfo8
-rw-r--r--emulators/virtualbox-ose-legacy/files/patch-configure15
-rw-r--r--emulators/virtualbox-ose-legacy/files/patch-include-iprt-types.h11
-rw-r--r--emulators/virtualbox-ose-legacy/files/patch-src-VBox-Devices-Makefile.kmk13
-rw-r--r--emulators/virtualbox-ose-legacy/files/patch-src-VBox-Devices-PC-vbox.dsl20
-rw-r--r--emulators/virtualbox-ose-legacy/files/patch-src-VBox-Frontends-VBoxHeadless-FramebufferVNC.cpp13
-rw-r--r--emulators/virtualbox-ose-legacy/files/patch-src-VBox-Frontends-VBoxManage-VBoxInternalManage.cpp25
-rw-r--r--emulators/virtualbox-ose-legacy/files/patch-src-VBox-HostServices-auth-pam-VBoxAuthPAM.c15
-rw-r--r--emulators/virtualbox-ose-legacy/files/patch-src-VBox-Installer-freebsd-virtualbox.desktop4
-rw-r--r--emulators/virtualbox-ose-legacy/files/patch-src-VBox-Main-src-server-MachineImpl.cpp13
-rw-r--r--emulators/virtualbox-ose-legacy/files/patch-src-VBox-Main-src-server-freebsd-HostHardwareFreeBSD.cpp33
-rw-r--r--emulators/virtualbox-ose-legacy/files/patch-src-VBox-Main-src-server-freebsd-NetIf-freebsd.cpp26
-rw-r--r--emulators/virtualbox-ose-legacy/files/patch-src-VBox-Main-webservice-websrv-wsdl.xsl254
-rw-r--r--emulators/virtualbox-ose-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-memobj-r0drv-freebsd.c53
-rw-r--r--emulators/virtualbox-ose-legacy/files/patch-src-VBox-Runtime-r3-freebsd-fileaio-freebsd.c16
-rw-r--r--emulators/virtualbox-ose-legacy/files/patch-src-VBox-VMM-Makefile.kmk11
-rw-r--r--emulators/virtualbox-ose-legacy/files/patch-src-VBox-VMM-VMMR3-CPUM.cpp12
-rw-r--r--emulators/virtualbox-ose-legacy/files/patch-src-recompiler-Sun-testmath.c22
-rw-r--r--emulators/virtualbox-ose-legacy/files/patch-src-recompiler-target-i386-cpu.h11
-rw-r--r--emulators/virtualbox-ose-legacy/pkg-plist4
30 files changed, 1490 insertions, 284 deletions
diff --git a/emulators/virtualbox-ose-kmod-legacy/Makefile b/emulators/virtualbox-ose-kmod-legacy/Makefile
index f4d035e86647..e56799e3a8a1 100644
--- a/emulators/virtualbox-ose-kmod-legacy/Makefile
+++ b/emulators/virtualbox-ose-kmod-legacy/Makefile
@@ -1,12 +1,8 @@
-# New ports collection makefile for: virtualbox-ose-kmod-legacy
-# Date created: 2009-09-21
-# Whom: Bernhard Froehlich <decke@bluelife.at>
-#
+# Created by: Bernhard Froehlich <decke@bluelife.at>
# $FreeBSD$
-#
PORTNAME= virtualbox-ose
-DISTVERSION= 4.0.16
+DISTVERSION= 4.1.24
CATEGORIES= emulators kld
MASTER_SITES= http://download.virtualbox.org/virtualbox/${DISTVERSION}/ \
http://tmp.chruetertee.ch/ \
@@ -25,9 +21,10 @@ BUILD_DEPENDS= yasm:${PORTSDIR}/devel/yasm \
kmk:${PORTSDIR}/devel/kBuild
UNIQUENAME= ${PORTNAME}${PKGNAMESUFFIX}
-WRKSRC= ${WRKDIR}/VirtualBox-${PORTVERSION}_OSE
+WRKSRC= ${WRKDIR}/VirtualBox-${PORTVERSION}
USE_RC_SUBR= vboxnet
ONLY_FOR_ARCHS= i386 amd64
+FETCH_ARGS= -pRr
USE_BZIP2= yes
HAS_CONFIGURE= yes
@@ -37,7 +34,6 @@ CONFIGURE_ARGS+=--with-gcc="${CC}" --with-g++="${CXX}" --nofatal \
--build-headless
CONFLICTS= bcc-[0-9]*
-CONFLICTS_BUILD= kBuild-devel-[0-9]*
CONFLICTS_INSTALL= virtualbox-ose-kmod-[3,4]* virtualbox-ose-kmod-devel-[3,4]*
OPTIONS_DEFINE= DEBUG VIMAGE
@@ -56,9 +52,15 @@ KMK_BUILDTYPE= release
KMK_CONFIG= VBOX_LIBPATH_X11=${LOCALBASE} VBOX_FREEBSD_SRC=${SRC_BASE}/sys
KMK_FLAGS= HostDrivers-src vboxdrv-mod VBoxNetFlt-src VBoxNetAdp-src
+MAKE_FLAGS= SYSDIR=${SRC_BASE}/sys
+
.if ${PORT_OPTIONS:MDEBUG}
KMK_FLAGS+= BUILD_TYPE=debug
KMK_BUILDTYPE= debug
+MAKE_FLAGS+= DEBUG_FLAGS="-O1 -g"
+PLIST_SUB+= WITH_DEBUG=""
+.else
+PLIST_SUB+= WITH_DEBUG="@comment "
.endif
.if ${ARCH} == i386
@@ -73,6 +75,10 @@ IGNORE= requires kernel sources
.include <bsd.port.pre.mk>
+.if ${OSVERSION} < 802000
+BROKEN= Does not compile on FreeBSD < 8.2
+.endif
+
.if ${OSVERSION} < 800500 && !empty(PORT_OPTIONS:MVIMAGE)
IGNORE= newer kernel is required to build with VIMAGE
.endif
@@ -96,13 +102,18 @@ pre-build:
do-build:
cd ${WRKSRC} && ${SH} env.sh && cd ${WRKSRC}/src/VBox/HostDrivers && ${KMK_CONFIG} ${LOCALBASE}/bin/kmk ${KMK_FLAGS}
- cd ${VBOX_BIN} && make SYSDIR=${SRC_BASE}/sys
+ cd ${VBOX_BIN} && make ${MAKE_FLAGS}
do-install:
${MKDIR} ${KMODDIR}
${INSTALL_KLD} ${VBOX_BIN}/vboxdrv/vboxdrv.ko ${KMODDIR}
${INSTALL_KLD} ${VBOX_BIN}/vboxnetadp/vboxnetadp.ko ${KMODDIR}
${INSTALL_KLD} ${VBOX_BIN}/vboxnetflt/vboxnetflt.ko ${KMODDIR}
+.if ${PORT_OPTIONS:MDEBUG}
+ ${INSTALL_KLD} ${VBOX_BIN}/vboxdrv/vboxdrv.ko.symbols ${KMODDIR}
+ ${INSTALL_KLD} ${VBOX_BIN}/vboxnetadp/vboxnetadp.ko.symbols ${KMODDIR}
+ ${INSTALL_KLD} ${VBOX_BIN}/vboxnetflt/vboxnetflt.ko.symbols ${KMODDIR}
+.endif
@/usr/sbin/kldxref ${KMODDIR}
.include <bsd.port.post.mk>
diff --git a/emulators/virtualbox-ose-kmod-legacy/distinfo b/emulators/virtualbox-ose-kmod-legacy/distinfo
index c43dcee8c56e..f19872868d76 100644
--- a/emulators/virtualbox-ose-kmod-legacy/distinfo
+++ b/emulators/virtualbox-ose-kmod-legacy/distinfo
@@ -1,2 +1,2 @@
-SHA256 (VirtualBox-4.0.16.tar.bz2) = d6c165cc41063cb8eb8283606b712904cae180000171fb1f833b7eaada633c77
-SIZE (VirtualBox-4.0.16.tar.bz2) = 70042175
+SHA256 (VirtualBox-4.1.24.tar.bz2) = 74008b8e8942045668c1b7d06b0a4bb5fe8464066e343e3a2e1ba30b94ce8a7f
+SIZE (VirtualBox-4.1.24.tar.bz2) = 74612732
diff --git a/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-HostDrivers-VBoxNetAdp-freebsd-Makefile b/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-HostDrivers-VBoxNetAdp-freebsd-Makefile
new file mode 100644
index 000000000000..821c767192e1
--- /dev/null
+++ b/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-HostDrivers-VBoxNetAdp-freebsd-Makefile
@@ -0,0 +1,16 @@
+This patch adds support for VIMAGE to VBoxNetAdp and thus
+also fixes that panic.
+
+Submitted by: Mikolaj Golub <trociny at freebsd.org>
+--- src/VBox/HostDrivers/VBoxNetAdp/freebsd/Makefile 2012-03-13 15:15:44.000000000 +0200
++++ src/VBox/HostDrivers/VBoxNetAdp/freebsd/Makefile 2012-04-01 13:27:16.000000000 +0300
+@@ -18,7 +18,7 @@
+
+ KMOD = vboxnetadp
+
+-CFLAGS += -DRT_OS_FREEBSD -DIN_RING0 -DIN_RT_R0 -DIN_SUP_R0 -DVBOX -DRT_WITH_VBOX -Iinclude -I. -Ir0drv -w -DVBOX_WITH_HARDENING
++CFLAGS += -DRT_OS_FREEBSD -DIN_RING0 -DIN_RT_R0 -DIN_SUP_R0 -DVBOX -DRT_WITH_VBOX -Iinclude -I. -Ir0drv -w -DVBOX_WITH_HARDENING -DVIMAGE
+
+ .if (${MACHINE_ARCH} == "i386")
+ CFLAGS += -DRT_ARCH_X86
+diff -rpu VirtualBox-4.1.10.orig/src/VBox/HostDrivers/VBoxNetAdp/freebsd/VBoxNetAdp-freebsd.c VirtualBox-4.1.10/src/VBox/HostDrivers/VBoxNetAdp/freebsd/VBoxNetAdp-freebsd.c
diff --git a/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-HostDrivers-VBoxNetAdp-freebsd-VBoxNetAdp-freebsd.c b/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-HostDrivers-VBoxNetAdp-freebsd-VBoxNetAdp-freebsd.c
new file mode 100644
index 000000000000..aa64625d47af
--- /dev/null
+++ b/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-HostDrivers-VBoxNetAdp-freebsd-VBoxNetAdp-freebsd.c
@@ -0,0 +1,54 @@
+This patch adds support for VIMAGE to VBoxNetAdp and thus
+also fixes that panic.
+
+Submitted by: Mikolaj Golub <trociny at freebsd.org>
+--- src/VBox/HostDrivers/VBoxNetAdp/freebsd/VBoxNetAdp-freebsd.c.orig 2012-06-20 15:17:03.000000000 +0200
++++ src/VBox/HostDrivers/VBoxNetAdp/freebsd/VBoxNetAdp-freebsd.c 2012-07-25 18:30:13.695891353 +0200
+@@ -68,6 +68,22 @@
+ #define VBOXNETADP_OS_SPECFIC 1
+ #include "../VBoxNetAdpInternal.h"
+
++#if defined(__FreeBSD_version) && __FreeBSD_version >= 800500
++# include <sys/jail.h>
++# include <net/vnet.h>
++
++# define VBOXCURVNET_SET(arg) CURVNET_SET_QUIET(arg)
++# define VBOXCURVNET_SET_FROM_UCRED() VBOXCURVNET_SET(CRED_TO_VNET(curthread->td_ucred))
++# define VBOXCURVNET_RESTORE() CURVNET_RESTORE()
++
++#else /* !defined(__FreeBSD_version) || __FreeBSD_version < 800500 */
++
++# define VBOXCURVNET_SET(arg)
++# define VBOXCURVNET_SET_FROM_UCRED()
++# define VBOXCURVNET_RESTORE()
++
++#endif /* !defined(__FreeBSD_version) || __FreeBSD_version < 800500 */
++
+ static int VBoxNetAdpFreeBSDCtrlioctl(struct cdev *, u_long, caddr_t, int flags,
+ struct thread *);
+ static struct cdevsw vboxnetadp_cdevsw =
+@@ -260,6 +276,7 @@
+ {
+ struct ifnet *ifp;
+
++ VBOXCURVNET_SET_FROM_UCRED();
+ ifp = if_alloc(IFT_ETHER);
+ if (ifp == NULL)
+ return VERR_NO_MEMORY;
+@@ -279,6 +296,7 @@
+
+ strncpy(pThis->szName, ifp->if_xname, VBOXNETADP_MAX_NAME_LEN);
+ pThis->u.s.ifp = ifp;
++ VBOXCURVNET_RESTORE();
+ return 0;
+ }
+
+@@ -287,6 +305,8 @@
+ struct ifnet *ifp;
+
+ ifp = pThis->u.s.ifp;
++ VBOXCURVNET_SET(ifp->if_vnet);
+ ether_ifdetach(ifp);
+ if_free(ifp);
++ VBOXCURVNET_RESTORE();
+ }
diff --git a/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-HostDrivers-VBoxNetFlt-freebsd-VBoxNetFlt-freebsd.c b/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-HostDrivers-VBoxNetFlt-freebsd-VBoxNetFlt-freebsd.c
new file mode 100644
index 000000000000..185931e4f504
--- /dev/null
+++ b/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-HostDrivers-VBoxNetFlt-freebsd-VBoxNetFlt-freebsd.c
@@ -0,0 +1,31 @@
+The attached patch fixes a kernel crash on FreeBSD 10-CURRENT hosts
+with VIMAGE enabled when a VM is powered off.
+
+Submitted by: Mikolaj Golub <trociny at freebsd.org>
+--- src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c 2012-03-13 15:15:44.000000000 +0200
++++ src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c 2012-04-01 13:43:02.000000000 +0300
+@@ -651,13 +651,13 @@ bool vboxNetFltOsMaybeRediscovered(PVBOX
+ ng_rmnode_self(pThis->u.s.node);
+ pThis->u.s.node = NULL;
+ }
++ VBOXCURVNET_RESTORE();
+
+ if (ifp0 != NULL)
+ {
+ vboxNetFltOsDeleteInstance(pThis);
+ vboxNetFltOsInitInstance(pThis, NULL);
+ }
+- VBOXCURVNET_RESTORE();
+
+ return !ASMAtomicUoReadBool(&pThis->fDisconnectedFromHost);
+ }
+@@ -671,8 +671,10 @@ void vboxNetFltOsDeleteInstance(PVBOXNET
+ mtx_destroy(&pThis->u.s.inq.ifq_mtx);
+ mtx_destroy(&pThis->u.s.outq.ifq_mtx);
+
++ VBOXCURVNET_SET_FROM_UCRED();
+ if (pThis->u.s.node != NULL)
+ ng_rmnode_self(pThis->u.s.node);
++ VBOXCURVNET_RESTORE();
+ pThis->u.s.node = NULL;
+ }
diff --git a/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-memobj-r0drv-freebsd.c b/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-memobj-r0drv-freebsd.c
index 91bacd4eef20..92017090571b 100644
--- a/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-memobj-r0drv-freebsd.c
+++ b/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-memobj-r0drv-freebsd.c
@@ -1,64 +1,893 @@
-Remove explicit initialization of m->flags and m->oflags because per
-default vm_phys_alloc_contig() already initializes the page as unmanaged.
-Chase move of PG_UNMANAGED flag from m->flags to m->oflags and renaming
-to VPO_UNMANAGED for an additional assert.
-
-Reviewed by: kib
-See: http://svnweb.freebsd.org/base?view=revision&revision=224746
---- src/VBox/Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c.orig 2011-11-04 07:19:54.000000000 -0400
-+++ src/VBox/Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c 2011-11-29 18:13:32.000000000 -0500
-@@ -391,12 +391,18 @@
-
- static void rtR0MemObjFreeBSDPhysPageInit(vm_page_t pPage, vm_pindex_t iPage)
- {
-+#if __FreeBSD_version <= 1000000
- pPage->wire_count = 1;
- pPage->pindex = iPage;
- pPage->act_count = 0;
-- pPage->oflags = 0;
-- pPage->flags = PG_UNMANAGED;
- atomic_add_int(&cnt.v_wire_count, 1);
+--- src/VBox/Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c.orig 2012-12-19 20:51:59.000000000 +0100
++++ src/VBox/Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c 2012-12-20 11:57:20.999850739 +0100
+@@ -5,6 +5,7 @@
+
+ /*
+ * Copyright (c) 2007 knut st. osmundsen <bird-src-spam@anduin.net>
++ * Copyright (c) 2011 Andriy Gapon <avg@FreeBSD.org>
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+@@ -54,23 +55,8 @@
+ /** The core structure. */
+ RTR0MEMOBJINTERNAL Core;
+ /** Type dependent data */
+- union
+- {
+- /** Non physical memory allocations */
+- struct
+- {
+- /** The VM object associated with the allocation. */
+- vm_object_t pObject;
+- } NonPhys;
+- /** Physical memory allocations */
+- struct
+- {
+- /** Number of pages */
+- uint32_t cPages;
+- /** Array of pages - variable */
+- vm_page_t apPages[1];
+- } Phys;
+- } u;
++ /** The VM object associated with the allocation. */
++ vm_object_t pObject;
+ } RTR0MEMOBJFREEBSD, *PRTR0MEMOBJFREEBSD;
+
+
+@@ -125,25 +111,14 @@
+
+ switch (pMemFreeBSD->Core.enmType)
+ {
+- case RTR0MEMOBJTYPE_CONT:
+- contigfree(pMemFreeBSD->Core.pv, pMemFreeBSD->Core.cb, M_IPRTMOBJ);
+- break;
+-
+ case RTR0MEMOBJTYPE_PAGE:
++ case RTR0MEMOBJTYPE_LOW:
++ case RTR0MEMOBJTYPE_CONT:
+ {
+ rc = vm_map_remove(kernel_map,
+ (vm_offset_t)pMemFreeBSD->Core.pv,
+ (vm_offset_t)pMemFreeBSD->Core.pv + pMemFreeBSD->Core.cb);
+ AssertMsg(rc == KERN_SUCCESS, ("%#x", rc));
+-
+- vm_page_lock_queues();
+- for (uint32_t iPage = 0; iPage < pMemFreeBSD->u.Phys.cPages; iPage++)
+- {
+- vm_page_t pPage = pMemFreeBSD->u.Phys.apPages[iPage];
+- vm_page_unwire(pPage, 0);
+- vm_page_free(pPage);
+- }
+- vm_page_unlock_queues();
+ break;
+ }
+
+@@ -165,8 +140,8 @@
+ case RTR0MEMOBJTYPE_RES_VIRT:
+ {
+ vm_map_t pMap = kernel_map;
+- if (pMemFreeBSD->Core.u.Lock.R0Process != NIL_RTR0PROCESS)
+- pMap = &((struct proc *)pMemFreeBSD->Core.u.Lock.R0Process)->p_vmspace->vm_map;
++ if (pMemFreeBSD->Core.u.ResVirt.R0Process != NIL_RTR0PROCESS)
++ pMap = &((struct proc *)pMemFreeBSD->Core.u.ResVirt.R0Process)->p_vmspace->vm_map;
+ rc = vm_map_remove(pMap,
+ (vm_offset_t)pMemFreeBSD->Core.pv,
+ (vm_offset_t)pMemFreeBSD->Core.pv + pMemFreeBSD->Core.cb);
+@@ -180,7 +155,6 @@
+
+ if (pMemFreeBSD->Core.u.Mapping.R0Process != NIL_RTR0PROCESS)
+ pMap = &((struct proc *)pMemFreeBSD->Core.u.Mapping.R0Process)->p_vmspace->vm_map;
+-
+ rc = vm_map_remove(pMap,
+ (vm_offset_t)pMemFreeBSD->Core.pv,
+ (vm_offset_t)pMemFreeBSD->Core.pv + pMemFreeBSD->Core.cb);
+@@ -191,26 +165,24 @@
+ case RTR0MEMOBJTYPE_PHYS:
+ case RTR0MEMOBJTYPE_PHYS_NC:
+ {
++ VM_OBJECT_LOCK(pMemFreeBSD->pObject);
++ vm_page_t pPage = vm_page_find_least(pMemFreeBSD->pObject, 0);
++#if __FreeBSD_version < 900000
++ /* See http://lists.freebsd.org/pipermail/freebsd-current/2012-November/037963.html */
+ vm_page_lock_queues();
+- for (uint32_t iPage = 0; iPage < pMemFreeBSD->u.Phys.cPages; iPage++)
++#endif
++ for (vm_page_t pPage = vm_page_find_least(pMemFreeBSD->pObject, 0);
++ pPage != NULL;
++ pPage = vm_page_next(pPage))
+ {
+- vm_page_t pPage = pMemFreeBSD->u.Phys.apPages[iPage];
+ vm_page_unwire(pPage, 0);
+- vm_page_free(pPage);
+ }
+ vm_page_unlock_queues();
++ VM_OBJECT_UNLOCK(pMemFreeBSD->pObject);
++ vm_object_deallocate(pMemFreeBSD->pObject);
+ break;
+ }
+
+-#ifdef USE_KMEM_ALLOC_ATTR
+- case RTR0MEMOBJTYPE_LOW:
+- {
+- kmem_free(kernel_map, (vm_offset_t)pMemFreeBSD->Core.pv, pMemFreeBSD->Core.cb);
+- break;
+- }
+-#else
+- case RTR0MEMOBJTYPE_LOW: /* unused */
+-#endif
+ default:
+ AssertMsgFailed(("enmType=%d\n", pMemFreeBSD->Core.enmType));
+ return VERR_INTERNAL_ERROR;
+@@ -220,183 +192,185 @@
+ }
+
+
+-DECLHIDDEN(int) rtR0MemObjNativeAllocPage(PPRTR0MEMOBJINTERNAL ppMem, size_t cb, bool fExecutable)
+-{
+- int rc;
+- size_t cPages = cb >> PAGE_SHIFT;
+-
+- /* create the object. */
+- PRTR0MEMOBJFREEBSD pMemFreeBSD = (PRTR0MEMOBJFREEBSD)rtR0MemObjNew(RT_OFFSETOF(RTR0MEMOBJFREEBSD, u.Phys.apPages[cPages]),
+- RTR0MEMOBJTYPE_PAGE, NULL, cb);
+- if (!pMemFreeBSD)
+- return VERR_NO_MEMORY;
+-
+- pMemFreeBSD->u.Phys.cPages = cPages;
++static vm_page_t FreeBSDContigPhysAllocHelper(vm_object_t pObject, vm_pindex_t iPIndex,
++ u_long cPages, vm_paddr_t VmPhysAddrHigh,
++ u_long uAlignment, bool fWire)
++{
++ vm_page_t pPages;
++ int tries = 0;
++#if __FreeBSD_version > 1000000
++ int flags = VM_ALLOC_INTERRUPT | VM_ALLOC_NOBUSY;
+
-+#if __FreeBSD_version >= 900040
-+ Assert(pPage->oflags & VPO_UNMANAGED != 0);
++ if (fWire)
++ flags |= VM_ALLOC_WIRED;
++ while (1)
++ {
++ VM_OBJECT_LOCK(pObject);
++ pPages = vm_page_alloc_contig(pObject, iPIndex, flags, cPages, 0, VmPhysAddrHigh, uAlignment, 0, VM_MEMATTR_DEFAULT);
++ VM_OBJECT_UNLOCK(pObject);
++ if (pPages || tries >= 1)
++ break;
++ vm_pageout_grow_cache(tries, 0, VmPhysAddrHigh);
++ tries++;
++ }
++ return pPages;
+#else
-+ Assert(pPage->flags & PG_UNMANAGED != 0);
+
+- vm_offset_t MapAddress = vm_map_min(kernel_map);
+- rc = vm_map_find(kernel_map, /* map */
+- NULL, /* object */
+- 0, /* offset */
+- &MapAddress, /* addr (IN/OUT) */
+- cb, /* length */
+- TRUE, /* find_space */
+- fExecutable /* protection */
+- ? VM_PROT_ALL
+- : VM_PROT_RW,
+- VM_PROT_ALL, /* max(_prot) */
+- 0); /* cow (copy-on-write) */
+- if (rc == KERN_SUCCESS)
++ while (1)
+ {
+- rc = VINF_SUCCESS;
+-
+- for (size_t iPage = 0; iPage < cPages; iPage++)
++ pPages = vm_phys_alloc_contig(cPages, 0, VmPhysAddrHigh, uAlignment, 0);
++ if (pPages || tries >= 1)
++ break;
++ vm_contig_grow_cache(tries, 0, VmPhysAddrHigh);
++ tries++;
++ }
++ if (!pPages)
++ return pPages;
++ VM_OBJECT_LOCK(pObject);
++ for (vm_pindex_t iPage = 0; iPage < cPages; iPage++)
++ {
++ vm_page_t pPage = pPages + iPage;
++ vm_page_insert(pPage, pObject, iPIndex + iPage);
++ pPage->valid = VM_PAGE_BITS_ALL;
++ if (fWire)
+ {
+- vm_page_t pPage;
++ pPage->wire_count = 1;
++ atomic_add_int(&cnt.v_wire_count, 1);
++ }
++ }
++ VM_OBJECT_UNLOCK(pObject);
++ return pPages;
+#endif
++}
+
+- pPage = vm_page_alloc(NULL, iPage,
+- VM_ALLOC_SYSTEM |
+- VM_ALLOC_WIRED | VM_ALLOC_NOOBJ);
++static int FreeBSDPhysAllocHelper(vm_object_t pObject, u_long cPages,
++ vm_paddr_t VmPhysAddrHigh, u_long uAlignment,
++ bool fContiguous, bool fWire)
++{
++ if (fContiguous)
++ {
++ if (FreeBSDContigPhysAllocHelper(pObject, 0, cPages, VmPhysAddrHigh, uAlignment, fWire) != NULL)
++ return VINF_SUCCESS;
++ else
++ return VERR_NO_MEMORY;
++ }
+
+- if (!pPage)
++ for (vm_pindex_t iPage = 0; iPage < cPages; iPage++)
++ {
++ vm_page_t pPage = FreeBSDContigPhysAllocHelper(pObject, iPage, 1, VmPhysAddrHigh, uAlignment, fWire);
++ if (!pPage)
++ {
++ /* Free all allocated pages */
++ VM_OBJECT_LOCK(pObject);
++ while (iPage-- > 0)
+ {
+- /*
+- * Out of pages
+- * Remove already allocated pages
+- */
+- while (iPage-- > 0)
+- {
+- pPage = pMemFreeBSD->u.Phys.apPages[iPage];
+- vm_page_lock_queues();
++ pPage = vm_page_lookup(pObject, iPage);
++#if __FreeBSD_version < 900000
++ vm_page_lock_queues();
+#endif
++ if (fWire)
+ vm_page_unwire(pPage, 0);
+- vm_page_free(pPage);
+- vm_page_unlock_queues();
+- }
+- rc = VERR_NO_MEMORY;
+- break;
++ vm_page_free(pPage);
++ vm_page_unlock_queues();
+ }
+-
+- pPage->valid = VM_PAGE_BITS_ALL;
+- pMemFreeBSD->u.Phys.apPages[iPage] = pPage;
++ VM_OBJECT_UNLOCK(pObject);
++ return VERR_NO_MEMORY;
+ }
++ }
++ return VINF_SUCCESS;
++}
+
+- if (rc == VINF_SUCCESS)
+- {
+- vm_offset_t AddressDst = MapAddress;
++static int FreeBSDAllocHelper(PRTR0MEMOBJFREEBSD pMemFreeBSD, bool fExecutable,
++ vm_paddr_t VmPhysAddrHigh, bool fContiguous)
++{
++ int rc;
++ size_t cPages = atop(pMemFreeBSD->Core.cb);
+
+- for (size_t iPage = 0; iPage < cPages; iPage++)
+- {
+- vm_page_t pPage = pMemFreeBSD->u.Phys.apPages[iPage];
++ pMemFreeBSD->pObject = vm_object_allocate(OBJT_PHYS, cPages);
++ vm_offset_t MapAddress = vm_map_min(kernel_map);
+
+- MY_PMAP_ENTER(kernel_map->pmap, AddressDst, pPage,
+- fExecutable
+- ? VM_PROT_ALL
+- : VM_PROT_RW,
+- TRUE);
++ // no additional object reference for auto-deallocation upon unmapping
++ rc = vm_map_find(kernel_map, pMemFreeBSD->pObject, 0,
++ &MapAddress, pMemFreeBSD->Core.cb, VMFS_ANY_SPACE,
++ fExecutable ? VM_PROT_ALL : VM_PROT_RW, VM_PROT_ALL, 0);
+
+- AddressDst += PAGE_SIZE;
+- }
++ if (rc == KERN_SUCCESS)
++ {
++ rc = FreeBSDPhysAllocHelper(pMemFreeBSD->pObject, cPages, VmPhysAddrHigh, PAGE_SIZE, fContiguous, false);
++ if (RT_SUCCESS(rc))
++ {
++ vm_map_wire(kernel_map, MapAddress, MapAddress + pMemFreeBSD->Core.cb, VM_MAP_WIRE_SYSTEM|VM_MAP_WIRE_NOHOLES);
+
+ /* Store start address */
+ pMemFreeBSD->Core.pv = (void *)MapAddress;
+- *ppMem = &pMemFreeBSD->Core;
+ return VINF_SUCCESS;
+ }
+- }
+- rc = VERR_NO_MEMORY; /** @todo fix translation (borrow from darwin) */
+
+- rtR0MemObjDelete(&pMemFreeBSD->Core);
++ vm_map_remove(kernel_map, MapAddress, MapAddress + pMemFreeBSD->Core.cb);
++ }
++ else
++ {
++ rc = VERR_NO_MEMORY; /** @todo fix translation (borrow from darwin) */
++ vm_object_deallocate(pMemFreeBSD->pObject);
++ }
+ return rc;
+ }
+
+-
+-DECLHIDDEN(int) rtR0MemObjNativeAllocLow(PPRTR0MEMOBJINTERNAL ppMem, size_t cb, bool fExecutable)
++DECLHIDDEN(int) rtR0MemObjNativeAllocPage(PPRTR0MEMOBJINTERNAL ppMem, size_t cb, bool fExecutable)
+ {
+-#ifdef USE_KMEM_ALLOC_ATTR
+- /*
+- * Use kmem_alloc_attr, fExectuable is not needed because the
+- * memory will be executable by default
+- */
+- NOREF(fExecutable);
+-
+- /* create the object. */
+- PRTR0MEMOBJFREEBSD pMemFreeBSD = (PRTR0MEMOBJFREEBSD)rtR0MemObjNew(sizeof(*pMemFreeBSD), RTR0MEMOBJTYPE_LOW, NULL, cb);
++ PRTR0MEMOBJFREEBSD pMemFreeBSD = (PRTR0MEMOBJFREEBSD)rtR0MemObjNew(sizeof(*pMemFreeBSD),
++ RTR0MEMOBJTYPE_PAGE, NULL, cb);
+ if (!pMemFreeBSD)
+ return VERR_NO_MEMORY;
+
+- pMemFreeBSD->Core.pv = (void *)kmem_alloc_attr(kernel_map, /* Kernel */
+- cb, /* Amount */
+- M_ZERO, /* Zero memory */
+- 0, /* Low physical address */
+- _4G - PAGE_SIZE, /* Highest physical address */
+- VM_MEMATTR_DEFAULT); /* Default memory attributes */
+- if (!pMemFreeBSD->Core.pv)
+- return VERR_NO_MEMORY;
+-
+- *ppMem = &pMemFreeBSD->Core;
+-
+- return VINF_SUCCESS;
+-#else
+- /*
+- * Try a Alloc first and see if we get luck, if not try contigmalloc.
+- * Might wish to try find our own pages or something later if this
+- * turns into a problemspot on AMD64 boxes.
+- */
+- int rc = rtR0MemObjNativeAllocPage(ppMem, cb, fExecutable);
+- if (RT_SUCCESS(rc))
++ int rc = FreeBSDAllocHelper(pMemFreeBSD, fExecutable, ~(vm_paddr_t)0, false);
++ if (RT_FAILURE(rc))
+ {
+- size_t iPage = cb >> PAGE_SHIFT;
+- while (iPage-- > 0)
+- if (rtR0MemObjNativeGetPagePhysAddr(*ppMem, iPage) > (_4G - PAGE_SIZE))
+- {
+- RTR0MemObjFree(*ppMem, false);
+- *ppMem = NULL;
+- rc = VERR_NO_MEMORY;
+- break;
+- }
++ rtR0MemObjDelete(&pMemFreeBSD->Core);
++ return rc;
+ }
+- if (RT_FAILURE(rc))
+- rc = rtR0MemObjNativeAllocCont(ppMem, cb, fExecutable);
++
++ *ppMem = &pMemFreeBSD->Core;
+ return rc;
+-#endif
}
-@@ -408,6 +414,9 @@
- int rc = VINF_SUCCESS;
- uint32_t cPages = cb >> PAGE_SHIFT;
+-DECLHIDDEN(int) rtR0MemObjNativeAllocCont(PPRTR0MEMOBJINTERNAL ppMem, size_t cb, bool fExecutable)
++DECLHIDDEN(int) rtR0MemObjNativeAllocLow(PPRTR0MEMOBJINTERNAL ppMem, size_t cb, bool fExecutable)
+ {
+- /* create the object. */
+- PRTR0MEMOBJFREEBSD pMemFreeBSD = (PRTR0MEMOBJFREEBSD)rtR0MemObjNew(sizeof(*pMemFreeBSD), RTR0MEMOBJTYPE_CONT, NULL, cb);
++ PRTR0MEMOBJFREEBSD pMemFreeBSD = (PRTR0MEMOBJFREEBSD)rtR0MemObjNew(sizeof(*pMemFreeBSD),
++ RTR0MEMOBJTYPE_LOW, NULL, cb);
+ if (!pMemFreeBSD)
+ return VERR_NO_MEMORY;
+
+- /* do the allocation. */
+- pMemFreeBSD->Core.pv = contigmalloc(cb, /* size */
+- M_IPRTMOBJ, /* type */
+- M_NOWAIT | M_ZERO, /* flags */
+- 0, /* lowest physical address*/
+- _4G-1, /* highest physical address */
+- PAGE_SIZE, /* alignment. */
+- 0); /* boundary */
+- if (pMemFreeBSD->Core.pv)
++ int rc = FreeBSDAllocHelper(pMemFreeBSD, fExecutable, _4G - 1, false);
++ if (RT_FAILURE(rc))
+ {
+- pMemFreeBSD->Core.u.Cont.Phys = vtophys(pMemFreeBSD->Core.pv);
+- *ppMem = &pMemFreeBSD->Core;
+- return VINF_SUCCESS;
++ rtR0MemObjDelete(&pMemFreeBSD->Core);
++ return rc;
+ }
+
+- NOREF(fExecutable);
+- rtR0MemObjDelete(&pMemFreeBSD->Core);
+- return VERR_NO_MEMORY;
++ *ppMem = &pMemFreeBSD->Core;
++ return rc;
+ }
+
+
+-static void rtR0MemObjFreeBSDPhysPageInit(vm_page_t pPage, vm_pindex_t iPage)
++DECLHIDDEN(int) rtR0MemObjNativeAllocCont(PPRTR0MEMOBJINTERNAL ppMem, size_t cb, bool fExecutable)
+ {
+- pPage->wire_count = 1;
+- pPage->pindex = iPage;
+- pPage->act_count = 0;
+- pPage->oflags = 0;
+- pPage->flags = PG_UNMANAGED;
+- atomic_add_int(&cnt.v_wire_count, 1);
++ PRTR0MEMOBJFREEBSD pMemFreeBSD = (PRTR0MEMOBJFREEBSD)rtR0MemObjNew(sizeof(*pMemFreeBSD),
++ RTR0MEMOBJTYPE_CONT, NULL, cb);
++ if (!pMemFreeBSD)
++ return VERR_NO_MEMORY;
++
++ int rc = FreeBSDAllocHelper(pMemFreeBSD, fExecutable, _4G - 1, true);
++ if (RT_FAILURE(rc))
++ {
++ rtR0MemObjDelete(&pMemFreeBSD->Core);
++ return rc;
++ }
++
++ pMemFreeBSD->Core.u.Cont.Phys = vtophys(pMemFreeBSD->Core.pv);
++ *ppMem = &pMemFreeBSD->Core;
++ return rc;
+ }
+
+
+@@ -405,69 +379,36 @@
+ RTHCPHYS PhysHighest, size_t uAlignment,
+ bool fContiguous)
+ {
+- int rc = VINF_SUCCESS;
+- uint32_t cPages = cb >> PAGE_SHIFT;
++ uint32_t cPages = atop(cb);
vm_paddr_t VmPhysAddrHigh;
-+#if __FreeBSD_version >= 1000001
-+ int pFlags = VM_ALLOC_INTERRUPT | VM_ALLOC_NOOBJ | VM_ALLOC_WIRED;
-+#endif
/* create the object. */
- PRTR0MEMOBJFREEBSD pMemFreeBSD = (PRTR0MEMOBJFREEBSD)rtR0MemObjNew(RT_OFFSETOF(RTR0MEMOBJFREEBSD, u.Phys.apPages[cPages]),
-@@ -424,7 +433,11 @@
+- PRTR0MEMOBJFREEBSD pMemFreeBSD = (PRTR0MEMOBJFREEBSD)rtR0MemObjNew(RT_OFFSETOF(RTR0MEMOBJFREEBSD, u.Phys.apPages[cPages]),
++ PRTR0MEMOBJFREEBSD pMemFreeBSD = (PRTR0MEMOBJFREEBSD)rtR0MemObjNew(sizeof(*pMemFreeBSD),
+ enmType, NULL, cb);
+ if (!pMemFreeBSD)
+ return VERR_NO_MEMORY;
+
+- pMemFreeBSD->u.Phys.cPages = cPages;
++ pMemFreeBSD->pObject = vm_object_allocate(OBJT_PHYS, atop(cb));
- if (fContiguous)
+ if (PhysHighest != NIL_RTHCPHYS)
+ VmPhysAddrHigh = PhysHighest;
+ else
+ VmPhysAddrHigh = ~(vm_paddr_t)0;
+
+- if (fContiguous)
+- {
+- vm_page_t pPage = vm_phys_alloc_contig(cPages, 0, VmPhysAddrHigh, uAlignment, 0);
+-
+- if (pPage)
+- for (uint32_t iPage = 0; iPage < cPages; iPage++)
+- {
+- rtR0MemObjFreeBSDPhysPageInit(&pPage[iPage], iPage);
+- pMemFreeBSD->u.Phys.apPages[iPage] = &pPage[iPage];
+- }
+- else
+- rc = VERR_NO_MEMORY;
+- }
+- else
+- {
+- /* Allocate page by page */
+- for (uint32_t iPage = 0; iPage < cPages; iPage++)
+- {
+- vm_page_t pPage = vm_phys_alloc_contig(1, 0, VmPhysAddrHigh, uAlignment, 0);
+-
+- if (!pPage)
+- {
+- /* Free all allocated pages */
+- while (iPage-- > 0)
+- {
+- pPage = pMemFreeBSD->u.Phys.apPages[iPage];
+- vm_page_lock_queues();
+- vm_page_unwire(pPage, 0);
+- vm_page_free(pPage);
+- vm_page_unlock_queues();
+- }
+- rc = VERR_NO_MEMORY;
+- break;
+- }
+- rtR0MemObjFreeBSDPhysPageInit(pPage, iPage);
+- pMemFreeBSD->u.Phys.apPages[iPage] = pPage;
+- }
+- }
++ int rc = FreeBSDPhysAllocHelper(pMemFreeBSD->pObject, cPages, VmPhysAddrHigh, uAlignment, fContiguous, true);
+
+- if (RT_FAILURE(rc))
++ if (RT_FAILURE(rc)) {
++ vm_object_deallocate(pMemFreeBSD->pObject);
+ rtR0MemObjDelete(&pMemFreeBSD->Core);
++ }
+ else
{
-+#if __FreeBSD_version >= 1000001
-+ vm_page_t pPage = vm_page_alloc_contig(NULL, 0, pFlags, cPages, 0, VmPhysAddrHigh, uAlignment, 0, VM_MEMATTR_DEFAULT);
-+#else
- vm_page_t pPage = vm_phys_alloc_contig(cPages, 0, VmPhysAddrHigh, uAlignment, 0);
-+#endif
+- if (enmType == RTR0MEMOBJTYPE_PHYS)
++ if (fContiguous)
+ {
+- pMemFreeBSD->Core.u.Phys.PhysBase = VM_PAGE_TO_PHYS(pMemFreeBSD->u.Phys.apPages[0]);
++ Assert(enmType == RTR0MEMOBJTYPE_PHYS);
++ VM_OBJECT_LOCK(pMemFreeBSD->pObject);
++ pMemFreeBSD->Core.u.Phys.PhysBase = VM_PAGE_TO_PHYS(vm_page_find_least(pMemFreeBSD->pObject, 0));
++ VM_OBJECT_UNLOCK(pMemFreeBSD->pObject);
+ pMemFreeBSD->Core.u.Phys.fAllocated = true;
+ }
+
+@@ -480,42 +421,13 @@
+
+ DECLHIDDEN(int) rtR0MemObjNativeAllocPhys(PPRTR0MEMOBJINTERNAL ppMem, size_t cb, RTHCPHYS PhysHighest, size_t uAlignment)
+ {
+-#if 1
+ return rtR0MemObjFreeBSDAllocPhysPages(ppMem, RTR0MEMOBJTYPE_PHYS, cb, PhysHighest, uAlignment, true);
+-#else
+- /* create the object. */
+- PRTR0MEMOBJFREEBSD pMemFreeBSD = (PRTR0MEMOBJFREEBSD)rtR0MemObjNew(sizeof(*pMemFreeBSD), RTR0MEMOBJTYPE_CONT, NULL, cb);
+- if (!pMemFreeBSD)
+- return VERR_NO_MEMORY;
+-
+- /* do the allocation. */
+- pMemFreeBSD->Core.pv = contigmalloc(cb, /* size */
+- M_IPRTMOBJ, /* type */
+- M_NOWAIT | M_ZERO, /* flags */
+- 0, /* lowest physical address*/
+- _4G-1, /* highest physical address */
+- uAlignment, /* alignment. */
+- 0); /* boundary */
+- if (pMemFreeBSD->Core.pv)
+- {
+- pMemFreeBSD->Core.u.Cont.Phys = vtophys(pMemFreeBSD->Core.pv);
+- *ppMem = &pMemFreeBSD->Core;
+- return VINF_SUCCESS;
+- }
+-
+- rtR0MemObjDelete(&pMemFreeBSD->Core);
+- return VERR_NO_MEMORY;
+-#endif
+ }
+
+
+ DECLHIDDEN(int) rtR0MemObjNativeAllocPhysNC(PPRTR0MEMOBJINTERNAL ppMem, size_t cb, RTHCPHYS PhysHighest)
+ {
+-#if 1
+ return rtR0MemObjFreeBSDAllocPhysPages(ppMem, RTR0MEMOBJTYPE_PHYS_NC, cb, PhysHighest, PAGE_SIZE, false);
+-#else
+- return VERR_NOT_SUPPORTED;
+-#endif
+ }
+
- if (pPage)
- for (uint32_t iPage = 0; iPage < cPages; iPage++)
-@@ -440,7 +453,11 @@
- /* Allocate page by page */
- for (uint32_t iPage = 0; iPage < cPages; iPage++)
+@@ -625,49 +537,41 @@
+ if (!pMemFreeBSD)
+ return VERR_NO_MEMORY;
+
+- /*
+- * Allocate an empty VM object and map it into the requested map.
+- */
+- pMemFreeBSD->u.NonPhys.pObject = vm_object_allocate(OBJT_DEFAULT, cb >> PAGE_SHIFT);
+- if (pMemFreeBSD->u.NonPhys.pObject)
++ vm_offset_t MapAddress = pvFixed != (void *)-1
++ ? (vm_offset_t)pvFixed
++ : vm_map_min(pMap);
++ if (pvFixed != (void *)-1)
++ vm_map_remove(pMap,
++ MapAddress,
++ MapAddress + cb);
++
++ rc = vm_map_find(pMap, /* map */
++ NULL, /* object */
++ 0, /* offset */
++ &MapAddress, /* addr (IN/OUT) */
++ cb, /* length */
++ pvFixed == (void *)-1 ? VMFS_ANY_SPACE : VMFS_NO_SPACE,
++ /* find_space */
++ VM_PROT_NONE, /* protection */
++ VM_PROT_ALL, /* max(_prot) ?? */
++ 0); /* cow (copy-on-write) */
++ if (rc == KERN_SUCCESS)
+ {
+- vm_offset_t MapAddress = pvFixed != (void *)-1
+- ? (vm_offset_t)pvFixed
+- : vm_map_min(pMap);
+- if (pvFixed != (void *)-1)
+- vm_map_remove(pMap,
+- MapAddress,
+- MapAddress + cb);
+-
+- rc = vm_map_find(pMap, /* map */
+- pMemFreeBSD->u.NonPhys.pObject, /* object */
+- 0, /* offset */
+- &MapAddress, /* addr (IN/OUT) */
+- cb, /* length */
+- pvFixed == (void *)-1, /* find_space */
+- VM_PROT_NONE, /* protection */
+- VM_PROT_ALL, /* max(_prot) ?? */
+- 0); /* cow (copy-on-write) */
+- if (rc == KERN_SUCCESS)
++ if (R0Process != NIL_RTR0PROCESS)
{
-+#if __FreeBSD_version >= 1000001
-+ vm_page_t pPage = vm_page_alloc_contig(NULL, iPage, pFlags, 1, 0, VmPhysAddrHigh, uAlignment, 0, VM_MEMATTR_DEFAULT);
-+#else
- vm_page_t pPage = vm_phys_alloc_contig(1, 0, VmPhysAddrHigh, uAlignment, 0);
-+#endif
+- if (R0Process != NIL_RTR0PROCESS)
+- {
+- rc = vm_map_inherit(pMap,
+- MapAddress,
+- MapAddress + cb,
+- VM_INHERIT_SHARE);
+- AssertMsg(rc == KERN_SUCCESS, ("%#x\n", rc));
+- }
+- pMemFreeBSD->Core.pv = (void *)MapAddress;
+- pMemFreeBSD->Core.u.ResVirt.R0Process = R0Process;
+- *ppMem = &pMemFreeBSD->Core;
+- return VINF_SUCCESS;
++ rc = vm_map_inherit(pMap,
++ MapAddress,
++ MapAddress + cb,
++ VM_INHERIT_SHARE);
++ AssertMsg(rc == KERN_SUCCESS, ("%#x\n", rc));
+ }
+- vm_object_deallocate(pMemFreeBSD->u.NonPhys.pObject);
+- rc = VERR_NO_MEMORY; /** @todo fix translation (borrow from darwin) */
++ pMemFreeBSD->Core.pv = (void *)MapAddress;
++ pMemFreeBSD->Core.u.ResVirt.R0Process = R0Process;
++ *ppMem = &pMemFreeBSD->Core;
++ return VINF_SUCCESS;
+ }
+- else
+- rc = VERR_NO_MEMORY;
++
++ rc = VERR_NO_MEMORY; /** @todo fix translation (borrow from darwin) */
+ rtR0MemObjDelete(&pMemFreeBSD->Core);
+ return rc;
+
+@@ -690,7 +594,7 @@
+ DECLHIDDEN(int) rtR0MemObjNativeMapKernel(PPRTR0MEMOBJINTERNAL ppMem, RTR0MEMOBJ pMemToMap, void *pvFixed, size_t uAlignment,
+ unsigned fProt, size_t offSub, size_t cbSub)
+ {
+- AssertMsgReturn(!offSub && !cbSub, ("%#x %#x\n", offSub, cbSub), VERR_NOT_SUPPORTED);
++// AssertMsgReturn(!offSub && !cbSub, ("%#x %#x\n", offSub, cbSub), VERR_NOT_SUPPORTED);
+ AssertMsgReturn(pvFixed == (void *)-1, ("%p\n", pvFixed), VERR_NOT_SUPPORTED);
+
+ /*
+@@ -699,21 +603,68 @@
+ if (uAlignment > PAGE_SIZE)
+ return VERR_NOT_SUPPORTED;
- if (!pPage)
+-/* Phys: see pmap_mapdev in i386/i386/pmap.c (http://fxr.watson.org/fxr/source/i386/i386/pmap.c?v=RELENG62#L2860) */
+-/** @todo finish the implementation. */
++ int rc;
++ PRTR0MEMOBJFREEBSD pMemToMapFreeBSD = (PRTR0MEMOBJFREEBSD)pMemToMap;
+
+- return VERR_NOT_SUPPORTED;
++ /* calc protection */
++ vm_prot_t ProtectionFlags = 0;
++ if ((fProt & RTMEM_PROT_NONE) == RTMEM_PROT_NONE)
++ ProtectionFlags = VM_PROT_NONE;
++ if ((fProt & RTMEM_PROT_READ) == RTMEM_PROT_READ)
++ ProtectionFlags |= VM_PROT_READ;
++ if ((fProt & RTMEM_PROT_WRITE) == RTMEM_PROT_WRITE)
++ ProtectionFlags |= VM_PROT_WRITE;
++ if ((fProt & RTMEM_PROT_EXEC) == RTMEM_PROT_EXEC)
++ ProtectionFlags |= VM_PROT_EXECUTE;
++
++ vm_offset_t Addr = vm_map_min(kernel_map);
++ if (cbSub == 0)
++ cbSub = pMemToMap->cb - offSub;
++
++ vm_object_reference(pMemToMapFreeBSD->pObject);
++ rc = vm_map_find(kernel_map, /* Map to insert the object in */
++ pMemToMapFreeBSD->pObject, /* Object to map */
++ offSub, /* Start offset in the object */
++ &Addr, /* Start address IN/OUT */
++ cbSub, /* Size of the mapping */
++ VMFS_ANY_SPACE, /* Whether a suitable address should be searched for first */
++ ProtectionFlags, /* protection flags */
++ VM_PROT_ALL, /* Maximum protection flags */
++ 0); /* copy-on-write and similar flags */
++
++ if (rc == KERN_SUCCESS)
++ {
++ rc = vm_map_wire(kernel_map, Addr, Addr + cbSub, VM_MAP_WIRE_SYSTEM|VM_MAP_WIRE_NOHOLES);
++ AssertMsg(rc == KERN_SUCCESS, ("%#x\n", rc));
++
++ PRTR0MEMOBJFREEBSD pMemFreeBSD = (PRTR0MEMOBJFREEBSD)rtR0MemObjNew(sizeof(RTR0MEMOBJFREEBSD),
++ RTR0MEMOBJTYPE_MAPPING,
++ (void *)Addr,
++ cbSub);
++ if (pMemFreeBSD)
++ {
++ Assert((vm_offset_t)pMemFreeBSD->Core.pv == Addr);
++ pMemFreeBSD->Core.u.Mapping.R0Process = NIL_RTR0PROCESS;
++ *ppMem = &pMemFreeBSD->Core;
++ return VINF_SUCCESS;
++ }
++ rc = vm_map_remove(kernel_map, Addr, Addr + cbSub);
++ AssertMsg(rc == KERN_SUCCESS, ("Deleting mapping failed\n"));
++ }
++ else
++ vm_object_deallocate(pMemToMapFreeBSD->pObject);
++
++ return VERR_NO_MEMORY;
+ }
+
+
+-/* see http://markmail.org/message/udhq33tefgtyfozs */
+-DECLHIDDEN(int) rtR0MemObjNativeMapUser(PPRTR0MEMOBJINTERNAL ppMem, RTR0MEMOBJ pMemToMap, RTR3PTR R3PtrFixed, size_t uAlignment, unsigned fProt, RTR0PROCESS R0Process)
++DECLHIDDEN(int) rtR0MemObjNativeMapUser(PPRTR0MEMOBJINTERNAL ppMem, RTR0MEMOBJ pMemToMap, RTR3PTR R3PtrFixed, size_t uAlignment,
++ unsigned fProt, RTR0PROCESS R0Process)
+ {
+ /*
+ * Check for unsupported stuff.
+ */
+ AssertMsgReturn(R0Process == RTR0ProcHandleSelf(), ("%p != %p\n", R0Process, RTR0ProcHandleSelf()), VERR_NOT_SUPPORTED);
+- AssertMsgReturn(R3PtrFixed == (RTR3PTR)-1, ("%p\n", R3PtrFixed), VERR_NOT_SUPPORTED);
+ if (uAlignment > PAGE_SIZE)
+ return VERR_NOT_SUPPORTED;
+
+@@ -734,62 +685,38 @@
+ ProtectionFlags |= VM_PROT_EXECUTE;
+
+ /* calc mapping address */
+- PROC_LOCK(pProc);
+- vm_offset_t AddrR3 = round_page((vm_offset_t)pProc->p_vmspace->vm_daddr + lim_max(pProc, RLIMIT_DATA));
+- PROC_UNLOCK(pProc);
++ vm_offset_t AddrR3;
++ if (R3PtrFixed == (RTR3PTR)-1)
++ {
++ // is this needed?
++ PROC_LOCK(pProc);
++ AddrR3 = round_page((vm_offset_t)pProc->p_vmspace->vm_daddr + lim_max(pProc, RLIMIT_DATA));
++ PROC_UNLOCK(pProc);
++ }
++ else
++ AddrR3 = (vm_offset_t)R3PtrFixed;
+
+- /* Insert the object in the map. */
++ /* Insert the pObject in the map. */
++ vm_object_reference(pMemToMapFreeBSD->pObject);
+ rc = vm_map_find(pProcMap, /* Map to insert the object in */
+- NULL, /* Object to map */
++ pMemToMapFreeBSD->pObject, /* Object to map */
+ 0, /* Start offset in the object */
+ &AddrR3, /* Start address IN/OUT */
+ pMemToMap->cb, /* Size of the mapping */
+- TRUE, /* Whether a suitable address should be searched for first */
++ R3PtrFixed == (RTR3PTR)-1 ? VMFS_ANY_SPACE : VMFS_NO_SPACE,
++ /* Whether a suitable address should be searched for first */
+ ProtectionFlags, /* protection flags */
+ VM_PROT_ALL, /* Maximum protection flags */
+- 0); /* Copy on write */
++ 0); /* copy-on-write and similar flags */
+
+- /* Map the memory page by page into the destination map. */
+ if (rc == KERN_SUCCESS)
+ {
+- size_t cPages = pMemToMap->cb >> PAGE_SHIFT;;
+- pmap_t pPhysicalMap = pProcMap->pmap;
+- vm_offset_t AddrR3Dst = AddrR3;
+-
+- if ( pMemToMap->enmType == RTR0MEMOBJTYPE_PHYS
+- || pMemToMap->enmType == RTR0MEMOBJTYPE_PHYS_NC
+- || pMemToMap->enmType == RTR0MEMOBJTYPE_PAGE)
+- {
+- /* Mapping physical allocations */
+- Assert(cPages == pMemToMapFreeBSD->u.Phys.cPages);
++ rc = vm_map_wire(pProcMap, AddrR3, AddrR3 + pMemToMap->cb, VM_MAP_WIRE_USER|VM_MAP_WIRE_NOHOLES);
++ AssertMsg(rc == KERN_SUCCESS, ("%#x\n", rc));
+
+- /* Insert the memory page by page into the mapping. */
+- for (uint32_t iPage = 0; iPage < cPages; iPage++)
+- {
+- vm_page_t pPage = pMemToMapFreeBSD->u.Phys.apPages[iPage];
++ rc = vm_map_inherit(pProcMap, AddrR3, AddrR3 + pMemToMap->cb, VM_INHERIT_SHARE);
++ AssertMsg(rc == KERN_SUCCESS, ("%#x\n", rc));
+
+- MY_PMAP_ENTER(pPhysicalMap, AddrR3Dst, pPage, ProtectionFlags, TRUE);
+- AddrR3Dst += PAGE_SIZE;
+- }
+- }
+- else
+- {
+- /* Mapping cont or low memory types */
+- vm_offset_t AddrToMap = (vm_offset_t)pMemToMap->pv;
+-
+- for (uint32_t iPage = 0; iPage < cPages; iPage++)
+- {
+- vm_page_t pPage = PHYS_TO_VM_PAGE(vtophys(AddrToMap));
+-
+- MY_PMAP_ENTER(pPhysicalMap, AddrR3Dst, pPage, ProtectionFlags, TRUE);
+- AddrR3Dst += PAGE_SIZE;
+- AddrToMap += PAGE_SIZE;
+- }
+- }
+- }
+-
+- if (RT_SUCCESS(rc))
+- {
+ /*
+ * Create a mapping object for it.
+ */
+@@ -805,9 +732,11 @@
+ return VINF_SUCCESS;
+ }
+
+- rc = vm_map_remove(pProcMap, ((vm_offset_t)AddrR3), ((vm_offset_t)AddrR3) + pMemToMap->cb);
++ rc = vm_map_remove(pProcMap, AddrR3, AddrR3 + pMemToMap->cb);
+ AssertMsg(rc == KERN_SUCCESS, ("Deleting mapping failed\n"));
+ }
++ else
++ vm_object_deallocate(pMemToMapFreeBSD->pObject);
+
+ return VERR_NO_MEMORY;
+ }
+@@ -855,49 +784,47 @@
+ return NIL_RTHCPHYS;
+ }
+
+- vm_offset_t pb = (vm_offset_t)pMemFreeBSD->Core.pv + (iPage << PAGE_SHIFT);
++ vm_offset_t pb = (vm_offset_t)pMemFreeBSD->Core.pv + ptoa(iPage);
+
+ struct proc *pProc = (struct proc *)pMemFreeBSD->Core.u.Lock.R0Process;
+ struct vm_map *pProcMap = &pProc->p_vmspace->vm_map;
+- pmap_t pPhysicalMap = pProcMap->pmap;
++ pmap_t pPhysicalMap = vm_map_pmap(pProcMap);
+
+ return pmap_extract(pPhysicalMap, pb);
+ }
+
+ case RTR0MEMOBJTYPE_MAPPING:
+ {
+- vm_offset_t pb = (vm_offset_t)pMemFreeBSD->Core.pv + (iPage << PAGE_SHIFT);
++ vm_offset_t pb = (vm_offset_t)pMemFreeBSD->Core.pv + ptoa(iPage);
+
+ if (pMemFreeBSD->Core.u.Mapping.R0Process != NIL_RTR0PROCESS)
{
+ struct proc *pProc = (struct proc *)pMemFreeBSD->Core.u.Mapping.R0Process;
+ struct vm_map *pProcMap = &pProc->p_vmspace->vm_map;
+- pmap_t pPhysicalMap = pProcMap->pmap;
++ pmap_t pPhysicalMap = vm_map_pmap(pProcMap);
+
+ return pmap_extract(pPhysicalMap, pb);
+ }
+ return vtophys(pb);
+ }
+
+- case RTR0MEMOBJTYPE_CONT:
+- return pMemFreeBSD->Core.u.Cont.Phys + (iPage << PAGE_SHIFT);
+-
+- case RTR0MEMOBJTYPE_PHYS:
+- return pMemFreeBSD->Core.u.Phys.PhysBase + (iPage << PAGE_SHIFT);
+-
+ case RTR0MEMOBJTYPE_PAGE:
+- case RTR0MEMOBJTYPE_PHYS_NC:
+- return VM_PAGE_TO_PHYS(pMemFreeBSD->u.Phys.apPages[iPage]);
+-
+-#ifdef USE_KMEM_ALLOC_ATTR
+ case RTR0MEMOBJTYPE_LOW:
++ case RTR0MEMOBJTYPE_PHYS_NC:
+ {
+- vm_offset_t pb = (vm_offset_t)pMemFreeBSD->Core.pv + (iPage << PAGE_SHIFT);
+- return vtophys(pb);
++ RTHCPHYS addr;
++ VM_OBJECT_LOCK(pMemFreeBSD->pObject);
++ addr = VM_PAGE_TO_PHYS(vm_page_lookup(pMemFreeBSD->pObject, iPage));
++ VM_OBJECT_UNLOCK(pMemFreeBSD->pObject);
++ return addr;
+ }
+-#else
+- case RTR0MEMOBJTYPE_LOW:
+-#endif
++
++ case RTR0MEMOBJTYPE_PHYS:
++ return pMemFreeBSD->Core.u.Cont.Phys + ptoa(iPage);
++
++ case RTR0MEMOBJTYPE_CONT:
++ return pMemFreeBSD->Core.u.Phys.PhysBase + ptoa(iPage);
++
+ case RTR0MEMOBJTYPE_RES_VIRT:
+ default:
+ return NIL_RTHCPHYS;
diff --git a/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-mp-r0drv-freebsd.c b/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-mp-r0drv-freebsd.c
deleted file mode 100644
index c298f52fd501..000000000000
--- a/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-mp-r0drv-freebsd.c
+++ /dev/null
@@ -1,79 +0,0 @@
---- src/VBox/Runtime/r0drv/freebsd/mp-r0drv-freebsd.c.orig 2011-05-16 12:33:52.000000000 -0400
-+++ src/VBox/Runtime/r0drv/freebsd/mp-r0drv-freebsd.c 2011-06-24 13:57:31.000000000 -0400
-@@ -163,17 +163,26 @@ RTDECL(int) RTMpOnOthers(PFNRTMPWORKER p
- /* Will panic if no rendezvousing cpus, so check up front. */
- if (RTMpGetOnlineCount() > 1)
- {
--#if __FreeBSD_version >= 700000
-- cpumask_t Mask = ~(cpumask_t)curcpu;
-+#if __FreeBSD_version >= 900000
-+ cpuset_t Mask;
-+#elif __FreeBSD_version >= 700000
-+ cpumask_t Mask;
- #endif
-+ RTCPUID idCpu = curcpu;
- RTMPARGS Args;
-
- Args.pfnWorker = pfnWorker;
- Args.pvUser1 = pvUser1;
- Args.pvUser2 = pvUser2;
-- Args.idCpu = RTMpCpuId();
-+ Args.idCpu = idCpu;
- Args.cHits = 0;
- #if __FreeBSD_version >= 700000
-+ Mask = all_cpus;
-+#if __FreeBSD_version >= 900000
-+ CPU_CLR(idCpu, &Mask);
-+#else
-+ Mask &= ~((cpumask_t)1 << idCpu);
-+#endif
- smp_rendezvous_cpus(Mask, NULL, rtmpOnOthersFreeBSDWrapper, smp_no_rendevous_barrier, &Args);
- #else
- smp_rendezvous(NULL, rtmpOnOthersFreeBSDWrapper, NULL, &Args);
-@@ -203,8 +212,10 @@ static void rtmpOnSpecificFreeBSDWrapper
-
- RTDECL(int) RTMpOnSpecific(RTCPUID idCpu, PFNRTMPWORKER pfnWorker, void *pvUser1, void *pvUser2)
- {
--#if __FreeBSD_version >= 700000
-- cpumask_t Mask = 1 << idCpu;
-+#if __FreeBSD_version >= 900000
-+ cpuset_t Mask;
-+#elif __FreeBSD_version >= 700000
-+ cpumask_t Mask;
- #endif
- RTMPARGS Args;
-
-@@ -218,7 +229,11 @@ RTDECL(int) RTMpOnSpecific(RTCPUID idCpu
- Args.idCpu = idCpu;
- Args.cHits = 0;
- #if __FreeBSD_version >= 700000
-+#if __FreeBSD_version >= 900000
-+ CPU_SETOF(idCpu, &Mask);
-+#else
- Mask = (cpumask_t)1 << idCpu;
-+#endif
- smp_rendezvous_cpus(Mask, NULL, rtmpOnSpecificFreeBSDWrapper, smp_no_rendevous_barrier, &Args);
- #else
- smp_rendezvous(NULL, rtmpOnSpecificFreeBSDWrapper, NULL, &Args);
-@@ -242,13 +257,21 @@ static void rtmpFreeBSDPokeCallback(void
-
- RTDECL(int) RTMpPokeCpu(RTCPUID idCpu)
- {
-+#if __FreeBSD_version >= 900000
-+ cpuset_t Mask;
-+#else
- cpumask_t Mask;
-+#endif
-
- /* Will panic if no rendezvousing cpus, so make sure the cpu is online. */
- if (!RTMpIsCpuOnline(idCpu))
- return VERR_CPU_NOT_FOUND;
-
-+#if __FreeBSD_version >= 900000
-+ CPU_SETOF(idCpu, &Mask);
-+#else
- Mask = (cpumask_t)1 << idCpu;
-+#endif
- smp_rendezvous_cpus(Mask, NULL, rtmpFreeBSDPokeCallback, smp_no_rendevous_barrier, NULL);
-
- return VINF_SUCCESS;
diff --git a/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-semfastmutex-r0drv-freebsd.c b/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-semfastmutex-r0drv-freebsd.c
new file mode 100644
index 000000000000..2f04d3adfafd
--- /dev/null
+++ b/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-semfastmutex-r0drv-freebsd.c
@@ -0,0 +1,15 @@
+- Fix INVARIANTS warning:
+acquiring duplicate lock of same type: "IPRT Fast Mutex Semaphore"
+
+Submitted by: avg
+--- src/VBox/Runtime/r0drv/freebsd/semfastmutex-r0drv-freebsd.c.orig 2011-11-04 12:19:54.000000000 +0100
++++ src/VBox/Runtime/r0drv/freebsd/semfastmutex-r0drv-freebsd.c 2011-12-06 23:12:49.233297685 +0100
+@@ -66,7 +66,7 @@
+ if (pThis)
+ {
+ pThis->u32Magic = RTSEMFASTMUTEX_MAGIC;
+- sx_init(&pThis->SxLock, "IPRT Fast Mutex Semaphore");
++ sx_init_flags(&pThis->SxLock, "IPRT Fast Mutex Semaphore", SX_DUPOK);
+
+ *phFastMtx = pThis;
+ return VINF_SUCCESS;
diff --git a/emulators/virtualbox-ose-kmod-legacy/pkg-plist b/emulators/virtualbox-ose-kmod-legacy/pkg-plist
index ef2cca5a6af2..83a55bedda50 100644
--- a/emulators/virtualbox-ose-kmod-legacy/pkg-plist
+++ b/emulators/virtualbox-ose-kmod-legacy/pkg-plist
@@ -1,8 +1,10 @@
@comment $FreeBSD$
@cwd /
%%KMODDIR%%/vboxdrv.ko
+%%WITH_DEBUG%%%%KMODDIR%%/vboxdrv.ko.symbols
%%KMODDIR%%/vboxnetadp.ko
+%%WITH_DEBUG%%%%KMODDIR%%/vboxnetadp.ko.symbols
%%KMODDIR%%/vboxnetflt.ko
+%%WITH_DEBUG%%%%KMODDIR%%/vboxnetflt.ko.symbols
@exec /usr/sbin/kldxref /%%KMODDIR%%
@unexec /usr/sbin/kldxref /%%KMODDIR%%
-
diff --git a/emulators/virtualbox-ose-legacy/Makefile b/emulators/virtualbox-ose-legacy/Makefile
index 09c85decda22..4fec6bcd39c6 100644
--- a/emulators/virtualbox-ose-legacy/Makefile
+++ b/emulators/virtualbox-ose-legacy/Makefile
@@ -1,13 +1,8 @@
-# New ports collection makefile for: virtualbox-ose-legacy
-# Date created: 2009-05-02
-# Whom: Bernhard Froehlich <decke@bluelife.at>
-#
+# Created by: Bernhard Froehlich <decke@bluelife.at>
# $FreeBSD$
-#
PORTNAME= virtualbox-ose
-DISTVERSION= 4.0.16
-PORTREVISION= 2
+DISTVERSION= 4.1.24
CATEGORIES= emulators
MASTER_SITES= http://download.virtualbox.org/virtualbox/${DISTVERSION}/ \
http://tmp.chruetertee.ch/ \
@@ -21,20 +16,22 @@ EXTRACT_ONLY= VirtualBox-${DISTVERSION}${EXTRACT_SUFX}
MAINTAINER= vbox@FreeBSD.org
COMMENT= A general-purpose full virtualizer for x86 hardware
+LICENSE= GPLv2
+LICENSE_FILE= ${WRKSRC}/COPYING
+
BUILD_DEPENDS= yasm:${PORTSDIR}/devel/yasm \
as86:${PORTSDIR}/devel/dev86 \
xsltproc:${PORTSDIR}/textproc/libxslt \
- kmk:${PORTSDIR}/devel/kBuild
+ kmk:${PORTSDIR}/devel/kBuild \
+ gtar:${PORTSDIR}/archivers/gtar
LIB_DEPENDS= png15:${PORTSDIR}/graphics/png \
xslt.2:${PORTSDIR}/textproc/libxslt \
curl.6:${PORTSDIR}/ftp/curl
RUN_DEPENDS= /boot/modules/vboxdrv.ko:${PORTSDIR}/emulators/virtualbox-ose-kmod-legacy
-LICENSE= GPLv2
-LICENSE_FILE= ${WRKSRC}/COPYING
-
-WRKSRC= ${WRKDIR}/VirtualBox-${PORTVERSION}_OSE
+WRKSRC= ${WRKDIR}/VirtualBox-${PORTVERSION}
ONLY_FOR_ARCHS= i386 amd64
+FETCH_ARGS= -pRr
USE_CDRTOOLS= yes
USE_GCC= any
USE_GNOME= libidl
@@ -50,7 +47,6 @@ CONFIGURE_ARGS+=--with-gcc="${CC}" --with-g++="${CXX}" --passive-mesa
USE_LDCONFIG= ${PREFIX}/lib/virtualbox
CONFLICTS= bcc-[0-9]*
-CONFLICTS_BUILD= kBuild-devel-[0-9]*
CONFLICTS_INSTALL= virtualbox-ose-[3,4]* virtualbox-ose-devel-[3,4]* virtualbox-ose-additions-[3,4]* virtualbox-ose-additions-devel-[3,4]*
VBOXUSER?= vboxusers
@@ -117,7 +113,6 @@ GUESTADDITIONS= VBoxGuestAdditions_${VBOX_GUEST_VER}.iso
GADISTFILES= ${GUESTADDITIONS}:guestadditions
RESTRICTED= for personal use only
RESTRICTED_FILES= ${GUESTADDITIONS}
-FETCH_ARGS= -pRr
PLIST_SUB+= GUESTADDITIONS=""
.else
PLIST_SUB+= GUESTADDITIONS="@comment "
@@ -175,11 +170,15 @@ PLIST_SUB+= I386="@comment "
.include <bsd.port.pre.mk>
+.if ${OSVERSION} < 802000
+BROKEN= Does not compile on FreeBSD < 8.2
+.endif
+
.if ${OSVERSION} > 900012
EXTRA_PATCHES+= ${FILESDIR}/extrapatch-include-iprt-string.h
.endif
-.if ${OSVERSION} > 900020 || ${OSVERSION} < 900000 && ${OSVERSION} > 801500
+.if ${OSVERSION} < 900000 && ${OSVERSION} > 801500
EXTRA_PATCHES+= ${FILESDIR}/extrapatch-src-VBox-Devices-PC-vbox.dsl
.endif
@@ -214,6 +213,9 @@ post-patch:
.if ${OSVERSION} < 800069
@${ECHO} 'VBOX_WITH_USB=' >> ${WRKSRC}/LocalConfig.kmk
.endif
+.if ${PORT_OPTIONS:MUDPTUNNEL}
+ @${ECHO} 'VBOX_WITH_UDPTUNNEL = 1' >> ${WRKSRC}/LocalConfig.kmk
+.endif
.if ${PORT_OPTIONS:MWEBSERVICE}
@${ECHO} 'VBOX_WITH_WEBSERVICES = 1' >> ${WRKSRC}/LocalConfig.kmk
@${ECHO} 'VBOX_GSOAP_INSTALLED = 1' >> ${WRKSRC}/LocalConfig.kmk
@@ -252,7 +254,7 @@ do-install:
.endif
${MKDIR} ${PREFIX}/bin
-.for f in VBoxManage VBoxNetAdpCtl VBoxNetDHCP VBoxSVC VBoxXPCOMIPCD ${VBOX_FRONTENDS} ${VBOX_WEB}
+.for f in VBoxManage VBoxNetAdpCtl VBoxNetDHCP VBoxSVC VBoxXPCOMIPCD VBoxBalloonCtrl ${VBOX_FRONTENDS} ${VBOX_WEB}
${INSTALL_PROGRAM} ${WRKSRC}/out/${KMK_ARCH}/${KMK_BUILDTYPE}/bin/${f} ${PREFIX}/lib/virtualbox/
${LN} -sf ${PREFIX}/lib/virtualbox/${f} ${PREFIX}/bin/
.endfor
@@ -261,7 +263,7 @@ do-install:
${CHMOD} 4511 ${PREFIX}/lib/virtualbox/${f}
.endfor
-.for f in VBoxManage VBoxSVC VBoxXPCOMIPCD VBoxExtPackHelperApp
+.for f in VBoxManage VBoxSVC VBoxXPCOMIPCD VBoxExtPackHelperApp VBoxBalloonCtrl
${CHMOD} 0711 ${PREFIX}/lib/virtualbox/${f}
.endfor
@@ -286,7 +288,7 @@ do-install:
${PYTHON_CMD} -mcompileall ${PYTHON_SITELIBDIR}/xpcom/
post-install:
-.for f in VBoxManage VBoxNetDHCP VBoxSVC VBoxXPCOMIPCD VBoxExtPackHelperApp ${VBOX_FRONTENDS}
+.for f in VBoxManage VBoxNetDHCP VBoxSVC VBoxXPCOMIPCD VBoxExtPackHelperApp VBoxBalloonCtrl ${VBOX_FRONTENDS}
${CHOWN} root:${VBOXGROUP} ${PREFIX}/lib/virtualbox/${f}
.endfor
diff --git a/emulators/virtualbox-ose-legacy/distinfo b/emulators/virtualbox-ose-legacy/distinfo
index 31b4828107ac..9b658d14b28f 100644
--- a/emulators/virtualbox-ose-legacy/distinfo
+++ b/emulators/virtualbox-ose-legacy/distinfo
@@ -1,4 +1,4 @@
-SHA256 (VirtualBox-4.0.16.tar.bz2) = d6c165cc41063cb8eb8283606b712904cae180000171fb1f833b7eaada633c77
-SIZE (VirtualBox-4.0.16.tar.bz2) = 70042175
-SHA256 (VBoxGuestAdditions_4.0.16.iso) = 778c7c020b853f999317bd017e2f3e2badc6deebfbec33ae89d7710826fb404e
-SIZE (VBoxGuestAdditions_4.0.16.iso) = 41639936
+SHA256 (VirtualBox-4.1.24.tar.bz2) = 74008b8e8942045668c1b7d06b0a4bb5fe8464066e343e3a2e1ba30b94ce8a7f
+SIZE (VirtualBox-4.1.24.tar.bz2) = 74612732
+SHA256 (VBoxGuestAdditions_4.1.24.iso) = 6db32584eb4e2ace0fd5fbbd9d63bdb8f50f0c28821d03dafd0ed1018d133cc7
+SIZE (VBoxGuestAdditions_4.1.24.iso) = 53532672
diff --git a/emulators/virtualbox-ose-legacy/files/patch-configure b/emulators/virtualbox-ose-legacy/files/patch-configure
index 8b889ef38986..d47c69b30074 100644
--- a/emulators/virtualbox-ose-legacy/files/patch-configure
+++ b/emulators/virtualbox-ose-legacy/files/patch-configure
@@ -1,15 +1,6 @@
---- configure.orig 2009-12-17 15:23:05.000000000 +0100
-+++ configure 2009-12-21 14:25:45.000000000 +0100
-@@ -107,7 +107,7 @@
- GENISOIMAGE="genisoimage"
- MKISOFS="mkisofs"
- INCCRYPTO=""
--LIBCRYPTO="-lcrypto"
-+LIBCRYPTO="-lcrypto -lssl"
- LIBPTHREAD="-lpthread"
- LIBCAP="-lcap"
- GSOAP=""
-@@ -1773,7 +1775,7 @@
+--- configure.orig 2011-05-30 17:11:26.000000000 +0200
++++ configure 2011-06-06 10:01:12.000000000 +0200
+@@ -1920,7 +1920,7 @@
cat $ODIR.tmp_src.cc >> $LOG
echo "using the following command line:" >> $LOG
echo "$CXX -O -Wall -o $ODIR.tmp_out $ODIR.tmp_src.cc -I$p/include/$d $p/$b/lib$d.so" >> $LOG
diff --git a/emulators/virtualbox-ose-legacy/files/patch-include-iprt-types.h b/emulators/virtualbox-ose-legacy/files/patch-include-iprt-types.h
new file mode 100644
index 000000000000..4c2070e3bb10
--- /dev/null
+++ b/emulators/virtualbox-ose-legacy/files/patch-include-iprt-types.h
@@ -0,0 +1,11 @@
+--- include/iprt/types.h.orig 2012-03-05 10:48:48.000000000 +0100
++++ include/iprt/types.h 2012-03-05 11:21:25.000000000 +0100
+@@ -82,6 +82,8 @@
+ # include <stddef.h>
+ # define _UINT64_T_DECLARED
+ # define _INT64_T_DECLARED
++# define _UINTPTR_T_DECLARED
++# define _INTPTR_T_DECLARED
+ # include <sys/types.h>
+
+ # elif defined(RT_OS_LINUX) && defined(__KERNEL__)
diff --git a/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Devices-Makefile.kmk b/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Devices-Makefile.kmk
deleted file mode 100644
index 2cdf6521b3db..000000000000
--- a/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Devices-Makefile.kmk
+++ /dev/null
@@ -1,13 +0,0 @@
---- src/VBox/Devices/Makefile.kmk.orig 2010-12-06 22:42:36.000000000 +0100
-+++ src/VBox/Devices/Makefile.kmk 2010-12-06 22:42:59.000000000 +0100
-@@ -22,7 +22,9 @@
- VBOX_PATH_DEVICES_SRC := $(PATH_SUB_CURRENT)
-
- # Include sub-makefiles.
--include $(PATH_SUB_CURRENT)/testcase/Makefile.kmk
-+ifdef VBOX_WITH_TESTCASES
-+ include $(PATH_SUB_CURRENT)/testcase/Makefile.kmk
-+endif
- if defined(VBOX_WITH_INTEL_PXE) || defined(VBOX_ONLY_EXTPACKS)
- include $(PATH_SUB_CURRENT)/PC/PXE/Makefile.kmk
- else ifndef VBOX_WITHOUT_ETHERBOOT
diff --git a/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Devices-PC-vbox.dsl b/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Devices-PC-vbox.dsl
new file mode 100644
index 000000000000..56437ffcc02c
--- /dev/null
+++ b/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Devices-PC-vbox.dsl
@@ -0,0 +1,20 @@
+--- src/VBox/Devices/PC/vbox.dsl.orig 2011-04-28 10:00:53.000000000 +0200
++++ src/VBox/Devices/PC/vbox.dsl 2011-07-25 19:36:06.000000000 +0200
+@@ -1161,7 +1161,7 @@
+ // (all of low memory space)
+ ResourceProducer, // bit 0 of general flags is 0
+ PosDecode, // positive Decode
+- MinNotFixed, // Range is not fixed
++ MinFixed, // Range is not fixed
+ MaxFixed, // Range is fixed
+ Cacheable,
+ ReadWrite,
+@@ -1170,7 +1170,7 @@
+
+ 0xffdfffff, // Max = 4GB - 2MB
+ 0x00000000, // Translation
+- 0x00000000, // Range Length (calculated
++ 0xffe00000, // Range Length (calculated
+ // dynamically)
+ , // Optional field left blank
+ , // Optional field left blank
diff --git a/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Frontends-VBoxHeadless-FramebufferVNC.cpp b/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Frontends-VBoxHeadless-FramebufferVNC.cpp
deleted file mode 100644
index 8af83a23a87a..000000000000
--- a/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Frontends-VBoxHeadless-FramebufferVNC.cpp
+++ /dev/null
@@ -1,13 +0,0 @@
---- src/VBox/Frontends/VBoxHeadless/FramebufferVNC.cpp.orig 2012-05-12 19:50:26.807639833 +0100
-+++ src/VBox/Frontends/VBoxHeadless/FramebufferVNC.cpp 2012-05-12 19:50:38.568636058 +0100
-@@ -89,7 +89,10 @@
- vncServer = rfbGetScreen(0, NULL, mWidth, mHeight, 8, 3, 1);
- vncServer->screenData = (void*)this;
- if (mVncPort)
-+ {
- vncServer->port = mVncPort;
-+ vncServer->ipv6port = mVncPort;
-+ }
- char *pszDesktopName;
- rc = RTStrAPrintf(&pszDesktopName, "%s - VirtualBox", pszName);
- if (rc >= 0)
diff --git a/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Frontends-VBoxManage-VBoxInternalManage.cpp b/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Frontends-VBoxManage-VBoxInternalManage.cpp
new file mode 100644
index 000000000000..00e3d32c29d5
--- /dev/null
+++ b/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Frontends-VBoxManage-VBoxInternalManage.cpp
@@ -0,0 +1,25 @@
+- Add support for files to VBoxManage createrawvmdk. Currently
+it only supports character devices so it failes like this:
+
+VBoxManage internalcommands createrawvmdk -filename test.vmdk -rawdisk /vbox/HardDisks/test.img
+VBoxManage: error: File '/vbox/HardDisks/test.img' is no character device
+VBoxManage: error: The raw disk vmdk file was not created
+
+Submitted by: Pawel Jakub Dawidek <pjd@FreeBSD.org>
+--- src/VBox/Frontends/VBoxManage/VBoxInternalManage.cpp.orig 2011-12-13 11:18:43.424439415 +0100
++++ src/VBox/Frontends/VBoxManage/VBoxInternalManage.cpp 2011-12-13 11:22:01.554438862 +0100
+@@ -1140,9 +1140,13 @@
+ goto out;
+ }
+ }
++ else if (S_ISREG(DevStat.st_mode))
++ {
++ cbSize = DevStat.st_size;
++ }
+ else
+ {
+- RTMsgError("File '%s' is no character device", rawdisk.c_str());
++ RTMsgError("File '%s' is neither character device nor regular file", rawdisk.c_str());
+ vrc = VERR_INVALID_PARAMETER;
+ goto out;
+ }
diff --git a/emulators/virtualbox-ose-legacy/files/patch-src-VBox-HostServices-auth-pam-VBoxAuthPAM.c b/emulators/virtualbox-ose-legacy/files/patch-src-VBox-HostServices-auth-pam-VBoxAuthPAM.c
new file mode 100644
index 000000000000..1344f3f2bd60
--- /dev/null
+++ b/emulators/virtualbox-ose-legacy/files/patch-src-VBox-HostServices-auth-pam-VBoxAuthPAM.c
@@ -0,0 +1,15 @@
+- Fix path for libpam.so on FreeBSD
+
+Submitted by: Landon Fuller <landonf at plausible.coop>
+Sponsored by: Plausible Labs Cooperative, Inc.
+--- src/VBox/HostServices/auth/pam/VBoxAuthPAM.c.orig 2012-04-03 14:11:56.000000000 +0200
++++ src/VBox/HostServices/auth/pam/VBoxAuthPAM.c 2012-04-05 12:44:48.000000000 +0200
+@@ -62,6 +62,8 @@
+ /* The name of the PAM library */
+ # ifdef RT_OS_SOLARIS
+ # define PAM_LIB_NAME "libpam.so.1"
++# elif defined(RT_OS_FREEBSD)
++# define PAM_LIB_NAME "libpam.so"
+ # else
+ # define PAM_LIB_NAME "libpam.so.0"
+ # endif
diff --git a/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Installer-freebsd-virtualbox.desktop b/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Installer-freebsd-virtualbox.desktop
index 5f248a87bf95..8f43a89b8d8d 100644
--- a/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Installer-freebsd-virtualbox.desktop
+++ b/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Installer-freebsd-virtualbox.desktop
@@ -1,5 +1,5 @@
---- src/VBox/Installer/freebsd/virtualbox.desktop.orig 2010-10-11 17:39:54.000000000 +0200
-+++ src/VBox/Installer/freebsd/virtualbox.desktop 2010-10-11 17:40:06.000000000 +0200
+--- src/VBox/Installer/freebsd/virtualbox.desktop.orig 2010-10-07 10:42:04.000000000 +0200
++++ src/VBox/Installer/freebsd/virtualbox.desktop 2010-10-07 10:43:20.000000000 +0200
@@ -7,7 +7,6 @@
Type=Application
Exec=VirtualBox
diff --git a/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Main-src-server-MachineImpl.cpp b/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Main-src-server-MachineImpl.cpp
new file mode 100644
index 000000000000..fce7b85eefa3
--- /dev/null
+++ b/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Main-src-server-MachineImpl.cpp
@@ -0,0 +1,13 @@
+- Remove debugging fprintf in MachineImpl.cpp to fix build with GCC 4.6
+
+Submitted by: Andriy Gapon <avg at FreeBSD.org>
+--- src/VBox/Main/src-server/MachineImpl.cpp.orig 2012-04-03 14:12:01.000000000 +0200
++++ src/VBox/Main/src-server/MachineImpl.cpp 2012-04-13 10:49:25.000000000 +0200
+@@ -6643,7 +6643,6 @@
+
+ Utf8Str idStr = mData->mUuid.toString();
+ const char * args[] = {szPath, "--comment", mUserData->s.strName.c_str(), "--startvm", idStr.c_str(), 0 };
+- fprintf(stderr, "SDL=%s\n", szPath);
+ vrc = RTProcCreate(szPath, args, env, 0, &pid);
+ }
+ #else /* !VBOX_WITH_VBOXSDL */
diff --git a/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Main-src-server-freebsd-HostHardwareFreeBSD.cpp b/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Main-src-server-freebsd-HostHardwareFreeBSD.cpp
deleted file mode 100644
index 69d6260ac6ff..000000000000
--- a/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Main-src-server-freebsd-HostHardwareFreeBSD.cpp
+++ /dev/null
@@ -1,33 +0,0 @@
---- src/VBox/Main/src-server/freebsd/HostHardwareFreeBSD.cpp.orig 2011-05-16 12:33:46.000000000 -0400
-+++ src/VBox/Main/src-server/freebsd/HostHardwareFreeBSD.cpp 2011-06-24 16:03:37.000000000 -0400
-@@ -35,6 +35,7 @@
- #include <iprt/string.h>
-
- #ifdef RT_OS_FREEBSD
-+# include <sys/param.h>
- # include <sys/types.h>
- # include <sys/stat.h>
- # include <unistd.h>
-@@ -186,11 +187,17 @@ static int getDVDInfoFromCAM(DriveInfoLi
- DeviceMatchPattern.pattern.device_pattern.target_id = CAM_TARGET_WILDCARD;
- DeviceMatchPattern.pattern.device_pattern.target_lun = CAM_LUN_WILDCARD;
- DeviceMatchPattern.pattern.device_pattern.flags = DEV_MATCH_INQUIRY;
-- DeviceMatchPattern.pattern.device_pattern.inq_pat.type = T_CDROM;
-- DeviceMatchPattern.pattern.device_pattern.inq_pat.media_type = SIP_MEDIA_REMOVABLE | SIP_MEDIA_FIXED;
-- DeviceMatchPattern.pattern.device_pattern.inq_pat.vendor[0] = '*'; /* Matches anything */
-- DeviceMatchPattern.pattern.device_pattern.inq_pat.product[0] = '*'; /* Matches anything */
-- DeviceMatchPattern.pattern.device_pattern.inq_pat.revision[0] = '*'; /* Matches anything */
-+#if __FreeBSD_version >= 900000
-+#define INQ_PAT data.inq_pat
-+#else
-+#define INQ_PAT inq_pat
-+#endif
-+ DeviceMatchPattern.pattern.device_pattern.INQ_PAT.type = T_CDROM;
-+ DeviceMatchPattern.pattern.device_pattern.INQ_PAT.media_type = SIP_MEDIA_REMOVABLE | SIP_MEDIA_FIXED;
-+ DeviceMatchPattern.pattern.device_pattern.INQ_PAT.vendor[0] = '*'; /* Matches anything */
-+ DeviceMatchPattern.pattern.device_pattern.INQ_PAT.product[0] = '*'; /* Matches anything */
-+ DeviceMatchPattern.pattern.device_pattern.INQ_PAT.revision[0] = '*'; /* Matches anything */
-+#undef INQ_PAT
- DeviceCCB.cdm.num_patterns = 1;
- DeviceCCB.cdm.pattern_buf_len = sizeof(struct dev_match_result);
- DeviceCCB.cdm.patterns = &DeviceMatchPattern;
diff --git a/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Main-src-server-freebsd-NetIf-freebsd.cpp b/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Main-src-server-freebsd-NetIf-freebsd.cpp
new file mode 100644
index 000000000000..bf6264a3b578
--- /dev/null
+++ b/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Main-src-server-freebsd-NetIf-freebsd.cpp
@@ -0,0 +1,26 @@
+This patch adds support for IFT_L2VLAN interfaces in the
+FreeBSD implementation of NetIfList(), treating them
+identically as IFT_ETHER interfaces.
+
+Submitted by: Landon J Fuller <landonf at plausible dot coop>
+Sponsored by: Plausible Labs Cooperative, Inc
+--- src/VBox/Main/src-server/freebsd/NetIf-freebsd.cpp.orig 2012-04-10 11:28:41.552067907 -0400
++++ src/VBox/Main/src-server/freebsd/NetIf-freebsd.cpp 2012-04-10 11:28:45.872069027 -0400
+@@ -268,7 +268,7 @@
+ pNext += pIfAddrMsg->ifam_msglen;
+ }
+
+- if (pSdl->sdl_type == IFT_ETHER)
++ if (pSdl->sdl_type == IFT_ETHER || pSdl->sdl_type == IFT_L2VLAN)
+ {
+ struct ifreq IfReq;
+ strcpy(IfReq.ifr_name, pNew->szShortName);
+@@ -373,7 +373,7 @@
+ pNext += pIfAddrMsg->ifam_msglen;
+ }
+
+- if (!fSkip && pSdl->sdl_type == IFT_ETHER)
++ if (!fSkip && (pSdl->sdl_type == IFT_ETHER || pSdl->sdl_type == IFT_L2VLAN))
+ {
+ size_t cbNameLen = pSdl->sdl_nlen + 1;
+ memcpy(pInfo->MACAddress.au8, LLADDR(pSdl), sizeof(pInfo->MACAddress.au8));
diff --git a/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Main-webservice-websrv-wsdl.xsl b/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Main-webservice-websrv-wsdl.xsl
new file mode 100644
index 000000000000..760b76cc01c3
--- /dev/null
+++ b/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Main-webservice-websrv-wsdl.xsl
@@ -0,0 +1,254 @@
+Fix building with libxslt newer than 1.1.26.
+
+Obtained from: https://www.virtualbox.org/ticket/10940
+--- src/VBox/Main/webservice/websrv-wsdl.xsl 2012-10-26 18:24:53.000000000 +0200
++++ src/VBox/Main/webservice/websrv-wsdl.xsl 2012-12-17 10:44:59.000001310 +0100
+@@ -93,6 +93,7 @@
+ targetNamespace="http://schemas.xmlsoap.org/wsdl/"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
++ xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
+ xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
+ xmlns:vbox="http://www.virtualbox.org/"
+ xmlns:exsl="http://exslt.org/common"
+@@ -460,7 +461,7 @@
+ <xsl:param name="_params" />
+ <xsl:param name="_valuetype" /> <!-- optional, for attribute setter messages -->
+
+- <message>
++ <wsdl:message>
+ <xsl:attribute name="name"><xsl:value-of select="concat($_ifname, $G_classSeparator, $_methodname, $G_methodRequest)" /></xsl:attribute>
+
+ <xsl:call-template name="convertTypeAndEmitPartOrElement">
+@@ -469,10 +470,10 @@
+ <xsl:with-param name="name" select="'parameters'" />
+ <xsl:with-param name="type" select="$G_typeIsGlobalRequestElementMarker" />
+ <xsl:with-param name="safearray" select="'no'" />
+- <xsl:with-param name="elname" select="'part'" /> <!-- "part" or "element" -->
++ <xsl:with-param name="elname" select="'wsdl:part'" /> <!-- "part" or "element" -->
+ <xsl:with-param name="attrname" select="'element'" /> <!-- attrib of part of element: <part type=...> or <part element=...> or <element type=...> -->
+ </xsl:call-template>
+- </message>
++ </wsdl:message>
+ </xsl:template>
+
+ <!--
+@@ -485,7 +486,7 @@
+ <xsl:param name="_params" /> <!-- set of parameter elements -->
+ <xsl:param name="_resulttype" /> <!-- for attribute getter methods only -->
+
+- <message>
++ <wsdl:message>
+ <xsl:attribute name="name"><xsl:copy-of select="$_ifname" /><xsl:value-of select="$G_classSeparator" /><xsl:value-of select="$_methodname" /><xsl:copy-of select="$G_methodResponse" /></xsl:attribute>
+
+ <!-- <xsl:variable name="cOutParams" select="count($_params[@dir='out']) + count($_params[@dir='return'])" /> -->
+@@ -495,10 +496,10 @@
+ <xsl:with-param name="name" select="'parameters'" />
+ <xsl:with-param name="type" select="$G_typeIsGlobalResponseElementMarker" />
+ <xsl:with-param name="safearray" select="'no'" />
+- <xsl:with-param name="elname" select="'part'" /> <!-- "part" or "element" -->
++ <xsl:with-param name="elname" select="'wsdl:part'" /> <!-- "part" or "element" -->
+ <xsl:with-param name="attrname" select="'element'" /> <!-- attrib of part of element: <part type=...> or <part element=...> or <element type=...> -->
+ </xsl:call-template>
+- </message>
++ </wsdl:message>
+ </xsl:template>
+
+ <!--
+@@ -543,13 +544,13 @@
+ <xsl:with-param name="_methodname" select="$attrSetter" />
+ <xsl:with-param name="_params" select="/.." /> <!-- empty set -->
+ <xsl:with-param name="_valuetype" select="$attrtype" />
+- <xsl:with-param name="elname" select="'part'" /> <!-- "part" or "element" -->
++ <xsl:with-param name="elname" select="'wsdl:part'" /> <!-- "part" or "element" -->
+ </xsl:call-template>
+ <xsl:call-template name="emitResultMessage">
+ <xsl:with-param name="_ifname" select="$ifname" />
+ <xsl:with-param name="_methodname" select="$attrSetter" />
+ <xsl:with-param name="_params" select="/.." /> <!-- empty set -->
+- <xsl:with-param name="elname" select="'part'" /> <!-- "part" or "element" -->
++ <xsl:with-param name="elname" select="'wsdl:part'" /> <!-- "part" or "element" -->
+ </xsl:call-template>
+ </xsl:template>
+
+@@ -566,7 +567,7 @@
+
+ <xsl:call-template name="debugMsg"><xsl:with-param name="msg" select="concat('....emitInOutOperation ', $_ifname, '::', $_methodname)" /></xsl:call-template>
+
+- <operation>
++ <wsdl:operation>
+ <xsl:attribute name="name">
+ <xsl:value-of select="concat($_ifname, '_', $_methodname)" />
+ </xsl:attribute>
+@@ -577,7 +578,7 @@
+ <xsl:attribute name="style"><xsl:value-of select="$G_basefmt" /></xsl:attribute>
+ </soap:operation>
+ </xsl:if>
+- <input>
++ <wsdl:input>
+ <xsl:choose>
+ <xsl:when test="$_fSoap">
+ <soap:body>
+@@ -589,10 +590,10 @@
+ <xsl:attribute name="message">vbox:<xsl:copy-of select="$_ifname" /><xsl:value-of select="$G_classSeparator" /><xsl:value-of select="$_methodname" /><xsl:copy-of select="$G_methodRequest" /></xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+- </input>
++ </wsdl:input>
+ <xsl:choose>
+ <xsl:when test="$_resulttype">
+- <output>
++ <wsdl:output>
+ <xsl:choose>
+ <xsl:when test="$_fSoap">
+ <soap:body>
+@@ -604,11 +605,11 @@
+ <xsl:attribute name="message">vbox:<xsl:copy-of select="$_ifname" /><xsl:value-of select="$G_classSeparator" /><xsl:value-of select="$_methodname" /><xsl:copy-of select="$G_methodResponse" /></xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+- </output>
++ </wsdl:output>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- <xsl:if test="count($_params[@dir='out'] | $_params[@dir='return']) > 0"> -->
+- <output>
++ <wsdl:output>
+ <xsl:choose>
+ <xsl:when test="$_fSoap">
+ <soap:body>
+@@ -620,29 +621,29 @@
+ <xsl:attribute name="message">vbox:<xsl:copy-of select="$_ifname" /><xsl:value-of select="$G_classSeparator" /><xsl:value-of select="$_methodname" /><xsl:copy-of select="$G_methodResponse" /></xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+- </output>
++ </wsdl:output>
+ <!-- </xsl:if> -->
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:choose>
+ <xsl:when test="not($_fSoap)">
+- <fault name="InvalidObjectFault" message="vbox:InvalidObjectFaultMsg" />
+- <fault name="RuntimeFault" message="vbox:RuntimeFaultMsg" />
++ <wsdl:fault name="InvalidObjectFault" message="vbox:InvalidObjectFaultMsg" />
++ <wsdl:fault name="RuntimeFault" message="vbox:RuntimeFaultMsg" />
+ </xsl:when>
+ <xsl:otherwise>
+- <fault name="InvalidObjectFault">
++ <wsdl:fault name="InvalidObjectFault">
+ <soap:fault name="InvalidObjectFault">
+ <xsl:attribute name="use"><xsl:value-of select="$G_parmfmt" /></xsl:attribute>
+ </soap:fault>
+- </fault>
+- <fault name="RuntimeFault">
++ </wsdl:fault>
++ <wsdl:fault name="RuntimeFault">
+ <soap:fault name="RuntimeFault">
+ <xsl:attribute name="use"><xsl:value-of select="$G_parmfmt" /></xsl:attribute>
+ </soap:fault>
+- </fault>
++ </wsdl:fault>
+ </xsl:otherwise>
+ </xsl:choose>
+- </operation>
++ </wsdl:operation>
+ </xsl:template>
+
+ <!--
+@@ -742,7 +743,7 @@
+ <xsl:with-param name="_wsmap" select="$wsmap" />
+ <xsl:with-param name="_methodname" select="$methodname" />
+ <xsl:with-param name="_params" select="param" />
+- <xsl:with-param name="elname" select="'part'" /> <!-- "part" or "element" -->
++ <xsl:with-param name="elname" select="'wsdl:part'" /> <!-- "part" or "element" -->
+ </xsl:call-template>
+ <!-- emit a second "result" message only if the method has "out" arguments or a return value -->
+ <!-- <xsl:if test="(count(param[@dir='out'] | param[@dir='return']) > 0)"> -->
+@@ -751,7 +752,7 @@
+ <xsl:with-param name="_wsmap" select="$wsmap" />
+ <xsl:with-param name="_methodname" select="@name" />
+ <xsl:with-param name="_params" select="param" />
+- <xsl:with-param name="elname" select="'part'" /> <!-- "part" or "element" -->
++ <xsl:with-param name="elname" select="'wsdl:part'" /> <!-- "part" or "element" -->
+ </xsl:call-template>
+ <!-- </xsl:if> -->
+ </xsl:otherwise>
+@@ -956,10 +957,9 @@
+ and emit complexTypes for all method arguments and return values.
+ -->
+ <xsl:template match="library">
+- <definitions
++ <wsdl:definitions
+ name="VirtualBox"
+ xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
+- <xsl:attribute name="xmlns">http://schemas.xmlsoap.org/wsdl/</xsl:attribute>
+ <xsl:attribute name="targetNamespace"><xsl:value-of select="$G_targetNamespace" /></xsl:attribute>
+ <!-- at top of WSDL file, dump a <types> section with user-defined types -->
+ <xsl:comment>
+@@ -969,7 +969,7 @@
+ *
+ ******************************************************
+ </xsl:comment>
+- <types>
++ <wsdl:types>
+ <xsd:schema>
+ <xsl:attribute name="targetNamespace"><xsl:value-of select='$G_targetNamespace' /></xsl:attribute>
+
+@@ -1193,14 +1193,14 @@
+ </xsd:schema>
+
+
+- </types>
++ </wsdl:types>
+
+- <message name="InvalidObjectFaultMsg">
+- <part name="fault" element="vbox:InvalidObjectFault" />
+- </message>
+- <message name="RuntimeFaultMsg">
+- <part name="fault" element="vbox:RuntimeFault" />
+- </message>
++ <wsdl:message name="InvalidObjectFaultMsg">
++ <wsdl:part name="fault" element="vbox:InvalidObjectFault" />
++ </wsdl:message>
++ <wsdl:message name="RuntimeFaultMsg">
++ <wsdl:part name="fault" element="vbox:RuntimeFault" />
++ </wsdl:message>
+
+ <xsl:comment>
+ ******************************************************
+@@ -1241,7 +1241,7 @@
+ ******************************************************
+ </xsl:comment>
+
+- <portType>
++ <wsdl:portType>
+ <xsl:attribute name="name"><xsl:copy-of select="'vbox'" /><xsl:value-of select="$G_portTypeSuffix" /></xsl:attribute>
+
+ <xsl:for-each select="//interface">
+@@ -1261,7 +1261,7 @@
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:for-each>
+- </portType>
++ </wsdl:portType>
+
+ <xsl:comment>
+ ******************************************************
+@@ -1271,7 +1271,7 @@
+ ******************************************************
+ </xsl:comment>
+
+- <binding>
++ <wsdl:binding>
+ <xsl:attribute name="name"><xsl:value-of select="concat('vbox', $G_bindingSuffix)" /></xsl:attribute>
+ <xsl:attribute name="type"><xsl:value-of select="concat('vbox:vbox', $G_portTypeSuffix)" /></xsl:attribute>
+
+@@ -1297,9 +1297,9 @@
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:for-each>
+- </binding>
++ </wsdl:binding>
+
+- </definitions>
++ </wsdl:definitions>
+ </xsl:template>
diff --git a/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-memobj-r0drv-freebsd.c b/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-memobj-r0drv-freebsd.c
new file mode 100644
index 000000000000..9c63505651b0
--- /dev/null
+++ b/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-memobj-r0drv-freebsd.c
@@ -0,0 +1,53 @@
+From Alan L. Cox on FreeBSD-current:
+
+ I just glanced at the virtualbox code for a couple minutes. For
+ FreeBSD 9 and 10, these lock acquires are completely unnecessary, and
+ have been since FreeBSD 9.0. Just delete them. They may be equally
+ unnecessary under FreeBSD 8, but I didn't look carefully enough to
+ answer that question.
+
+[1] http://lists.freebsd.org/pipermail/freebsd-current/2012-November/037963.html
+
+--- src/VBox/Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c.orig 2012-12-19 20:51:59.000000000 +0100
++++ src/VBox/Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c 2012-12-20 15:14:56.283850834 +0100
+@@ -136,7 +136,10 @@
+ (vm_offset_t)pMemFreeBSD->Core.pv + pMemFreeBSD->Core.cb);
+ AssertMsg(rc == KERN_SUCCESS, ("%#x", rc));
+
++#if __FreeBSD_version < 900000
++ /* See http://lists.freebsd.org/pipermail/freebsd-current/2012-November/037963.html */
+ vm_page_lock_queues();
++#endif
+ for (uint32_t iPage = 0; iPage < pMemFreeBSD->u.Phys.cPages; iPage++)
+ {
+ vm_page_t pPage = pMemFreeBSD->u.Phys.apPages[iPage];
+@@ -191,7 +194,9 @@
+ case RTR0MEMOBJTYPE_PHYS:
+ case RTR0MEMOBJTYPE_PHYS_NC:
+ {
++#if __FreeBSD_version < 900000
+ vm_page_lock_queues();
++#endif
+ for (uint32_t iPage = 0; iPage < pMemFreeBSD->u.Phys.cPages; iPage++)
+ {
+ vm_page_t pPage = pMemFreeBSD->u.Phys.apPages[iPage];
+@@ -266,7 +271,9 @@
+ while (iPage-- > 0)
+ {
+ pPage = pMemFreeBSD->u.Phys.apPages[iPage];
++#if __FreeBSD_version < 900000
+ vm_page_lock_queues();
++#endif
+ vm_page_unwire(pPage, 0);
+ vm_page_free(pPage);
+ vm_page_unlock_queues();
+@@ -448,7 +455,9 @@
+ while (iPage-- > 0)
+ {
+ pPage = pMemFreeBSD->u.Phys.apPages[iPage];
++#if __FreeBSD_version < 900000
+ vm_page_lock_queues();
++#endif
+ vm_page_unwire(pPage, 0);
+ vm_page_free(pPage);
+ vm_page_unlock_queues();
diff --git a/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Runtime-r3-freebsd-fileaio-freebsd.c b/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Runtime-r3-freebsd-fileaio-freebsd.c
deleted file mode 100644
index 671bb5552189..000000000000
--- a/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Runtime-r3-freebsd-fileaio-freebsd.c
+++ /dev/null
@@ -1,16 +0,0 @@
-Runtime/fileaio-freebsd: Fix error check for aio_error
-
-Obtained-from: https://www.virtualbox.org/changeset/38332
-
---- src/VBox/Runtime/r3/freebsd/fileaio-freebsd.cpp.orig 2011-07-15 17:34:34.000000000 +0200
-+++ src/VBox/Runtime/r3/freebsd/fileaio-freebsd.cpp 2011-11-21 09:33:26.155092865 +0100
-@@ -416,7 +416,8 @@
- {
- pReqInt = pahReqs[i];
- rcBSD = aio_error(&pReqInt->AioCB);
-- if (rcBSD == EINVAL || rcBSD == EAGAIN)
-+ if ( rcBSD == -1
-+ && errno == EINVAL)
- {
- /* Was not submitted. */
- RTFILEAIOREQ_SET_STATE(pReqInt, PREPARED);
diff --git a/emulators/virtualbox-ose-legacy/files/patch-src-VBox-VMM-Makefile.kmk b/emulators/virtualbox-ose-legacy/files/patch-src-VBox-VMM-Makefile.kmk
deleted file mode 100644
index cfe6e5fc1434..000000000000
--- a/emulators/virtualbox-ose-legacy/files/patch-src-VBox-VMM-Makefile.kmk
+++ /dev/null
@@ -1,11 +0,0 @@
---- src/VBox/VMM/Makefile.kmk.orig 2011-12-21 13:47:59.000000000 +0100
-+++ src/VBox/VMM/Makefile.kmk 2012-03-09 20:36:09.390067614 +0100
-@@ -19,7 +19,7 @@
- include $(KBUILD_PATH)/subheader.kmk
-
- # Include sub-makefiles.
--include $(PATH_SUB_CURRENT)/testcase/Makefile.kmk
-+#include $(PATH_SUB_CURRENT)/testcase/Makefile.kmk
-
-
- #
diff --git a/emulators/virtualbox-ose-legacy/files/patch-src-VBox-VMM-VMMR3-CPUM.cpp b/emulators/virtualbox-ose-legacy/files/patch-src-VBox-VMM-VMMR3-CPUM.cpp
deleted file mode 100644
index 5bb1888abe18..000000000000
--- a/emulators/virtualbox-ose-legacy/files/patch-src-VBox-VMM-VMMR3-CPUM.cpp
+++ /dev/null
@@ -1,12 +0,0 @@
---- src/VBox/VMM/VMMR3/CPUM.cpp (Revision 71439)
-+++ src/VBox/VMM/VMMR3/CPUM.cpp (Revision 71440)
-@@ -999,7 +999,8 @@
- */
- if (!fHWVirtExEnabled)
- {
-- Assert(pVM->cpum.s.aGuestCpuIdStd[4].eax == 0);
-+ Assert( pVM->cpum.s.aGuestCpuIdStd[4].eax == 0
-+ || pVM->cpum.s.aGuestCpuIdStd[0].eax < 0x4);
- pVM->cpum.s.aGuestCpuIdStd[4].eax = 0;
- }
- }
diff --git a/emulators/virtualbox-ose-legacy/files/patch-src-recompiler-Sun-testmath.c b/emulators/virtualbox-ose-legacy/files/patch-src-recompiler-Sun-testmath.c
new file mode 100644
index 000000000000..c4678be05189
--- /dev/null
+++ b/emulators/virtualbox-ose-legacy/files/patch-src-recompiler-Sun-testmath.c
@@ -0,0 +1,22 @@
+--- src/recompiler/Sun/testmath.c.orig 2011-01-14 21:15:07.000000000 +0100
++++ src/recompiler/Sun/testmath.c 2011-08-05 13:54:49.000000000 +0200
+@@ -261,8 +261,6 @@
+ #endif
+ set_cw(0x27f);
+
+- CHECK(logl(2.7182818284590452353602874713526625L), 1.0);
+-
+ CHECK(remainderl(1.0L, 1.0L), 0.0);
+ CHECK(remainderl(1.0L, 1.5L), -0.5);
+ CHECK(remainderl(42.0L, 34.25L), 7.75);
+@@ -315,10 +313,6 @@
+ CHECK(tanl(0.0L), 0.0);
+ CHECK(tanl(0.7853981633974483096156608458198757L), 1.0);
+
+- CHECK(powl(0.0, 0.0), 1.0);
+- CHECK(powl(2.0, 2.0), 4.0);
+- CHECK(powl(3.0, 3.0), 27.0);
+-
+ return cErrors;
+ }
+
diff --git a/emulators/virtualbox-ose-legacy/files/patch-src-recompiler-target-i386-cpu.h b/emulators/virtualbox-ose-legacy/files/patch-src-recompiler-target-i386-cpu.h
deleted file mode 100644
index b8c3a9acb71a..000000000000
--- a/emulators/virtualbox-ose-legacy/files/patch-src-recompiler-target-i386-cpu.h
+++ /dev/null
@@ -1,11 +0,0 @@
---- src/recompiler/target-i386/cpu.h.orig 2010-07-15 20:13:56.000000000 +0200
-+++ src/recompiler/target-i386/cpu.h 2010-11-01 12:23:16.000000000 +0100
-@@ -678,7 +678,7 @@
- user */
- struct APICState *apic_state;
- #else
-- uint32_t alignment2[3];
-+ uint32_t alignment2[2];
- /** Profiling tb_flush. */
- STAMPROFILE StatTbFlush;
- #endif
diff --git a/emulators/virtualbox-ose-legacy/pkg-plist b/emulators/virtualbox-ose-legacy/pkg-plist
index 740c84ec3c9c..1e60acad9deb 100644
--- a/emulators/virtualbox-ose-legacy/pkg-plist
+++ b/emulators/virtualbox-ose-legacy/pkg-plist
@@ -1,3 +1,4 @@
+bin/VBoxBalloonCtrl
%%X11%%bin/VBoxBFE
bin/VBoxHeadless
bin/VBoxManage
@@ -15,6 +16,7 @@ bin/VBoxXPCOMIPCD
lib/virtualbox/DBGCPlugInDiggers.so
lib/virtualbox/VBoxAuth.so
lib/virtualbox/VBoxAuthSimple.so
+lib/virtualbox/VBoxBalloonCtrl
%%QT4%%lib/virtualbox/VBoxDbg.so
lib/virtualbox/VBoxDD.so
lib/virtualbox/VBoxDD2.so
@@ -238,6 +240,8 @@ include/virtualbox/VBoxCAPI_v2_2.h
include/virtualbox/VBoxCAPI_v3_0.h
include/virtualbox/VBoxCAPI_v3_1.h
include/virtualbox/VBoxCAPI_v3_2.h
+include/virtualbox/VBoxCAPI_v4_0.h
+include/virtualbox/VBoxCAPI_v4_1.h
include/virtualbox/VirtualBox_XPCOM.h
include/virtualbox/ipcIClientObserver.h
include/virtualbox/ipcIDConnectService.h