From owner-svn-ports-all@FreeBSD.ORG Fri Dec 13 11:17:22 2013 Return-Path: Delivered-To: svn-ports-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 43AD063E; Fri, 13 Dec 2013 11:17:22 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 2C0101E04; Fri, 13 Dec 2013 11:17:22 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id rBDBHMcF092556; Fri, 13 Dec 2013 11:17:22 GMT (envelope-from decke@svn.freebsd.org) Received: (from decke@localhost) by svn.freebsd.org (8.14.7/8.14.7/Submit) id rBDBHK7p092546; Fri, 13 Dec 2013 11:17:20 GMT (envelope-from decke@svn.freebsd.org) Message-Id: <201312131117.rBDBHK7p092546@svn.freebsd.org> From: Bernhard Froehlich Date: Fri, 13 Dec 2013 11:17:20 +0000 (UTC) To: ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org Subject: svn commit: r336332 - in head/emulators: virtualbox-ose-kmod-legacy virtualbox-ose-kmod-legacy/files virtualbox-ose-legacy virtualbox-ose-legacy/files X-SVN-Group: ports-head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-ports-all@freebsd.org X-Mailman-Version: 2.1.17 Precedence: list List-Id: SVN commit messages for the ports tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 13 Dec 2013 11:17:22 -0000 Author: decke Date: Fri Dec 13 11:17:19 2013 New Revision: 336332 URL: http://svnweb.freebsd.org/changeset/ports/336332 Log: - Update to virtualbox-ose 4.2.20_1 - This update pulls in many changes from the port and brings better support for FreeBSD 10 and GCC from ports. I am doing that in preparation of the upcoming VirtualBox 4.3 update that should land soon. Added: head/emulators/virtualbox-ose-kmod-legacy/files/extrapatch-Config.kmk (contents, props changed) head/emulators/virtualbox-ose-kmod-legacy/files/extrapatch-src-VBox-HostDrivers-Support-freebsd-Makefile (contents, props changed) head/emulators/virtualbox-ose-kmod-legacy/files/patch-Config.kmk (contents, props changed) head/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-HostDrivers-VBoxNetAdp-Makefile.kmk (contents, props changed) head/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-alloc-r0drv-freebsd.c (contents, props changed) head/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-memobj-r0drv-freebsd_VM_MAP_FIND.c (contents, props changed) head/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-sleepqueue-r0drv-freebsd.h (contents, props changed) head/emulators/virtualbox-ose-legacy/files/patch-Config.kmk (contents, props changed) head/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Devices-Audio-ossaudio.c (contents, props changed) head/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Devices-Bus-DevPciIch9.cpp (contents, props changed) head/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Frontends-VirtualBox-Makefile.kmk (contents, props changed) head/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Main-scr-server-freebsd-PerformanceFreeBSD.cpp (contents, props changed) head/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Main-src-server-freebsd-HostHardwareFreeBSD.cpp (contents, props changed) head/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Runtime-Makefile.kmk (contents, props changed) head/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-alloc-r0drv-freebsd.c (contents, props changed) head/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-memobj-r0drv-freebsd_VM_MAP_FIND.c (contents, props changed) head/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Runtime-r3-freebsd-RTSystemQueryTotalRam-freebsd.cpp (contents, props changed) head/emulators/virtualbox-ose-legacy/files/vboxwatchdog.in (contents, props changed) Deleted: head/emulators/virtualbox-ose-kmod-legacy/files/patch-include-iprt-types.h head/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-HostDrivers-Support-freebsd-SUPDrv-freebsd.c head/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-HostDrivers-VBoxNetAdp-freebsd-Makefile head/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-HostDrivers-VBoxNetAdp-freebsd-VBoxNetAdp-freebsd.c head/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-semfastmutex-r0drv-freebsd.c head/emulators/virtualbox-ose-legacy/files/extrapatch-include-iprt-string.h head/emulators/virtualbox-ose-legacy/files/patch-include-iprt-types.h head/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Frontends-VBoxManage-VBoxInternalManage.cpp head/emulators/virtualbox-ose-legacy/files/patch-src-VBox-HostDrivers-Makefile.kmk head/emulators/virtualbox-ose-legacy/files/patch-src-VBox-HostServices-auth-pam-VBoxAuthPAM.c head/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Main-src-server-MachineImpl.cpp head/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Main-webservice-websrv-wsdl.xsl Modified: head/emulators/virtualbox-ose-kmod-legacy/Makefile head/emulators/virtualbox-ose-kmod-legacy/distinfo head/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-HostDrivers-VBoxNetFlt-freebsd-VBoxNetFlt-freebsd.c head/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-memobj-r0drv-freebsd.c head/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-memobj-r0drv-freebsd_VM_OBJECT_RENAME.c (contents, props changed) head/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-the-freebsd-kernel.h (contents, props changed) head/emulators/virtualbox-ose-kmod-legacy/files/vboxnet.in (contents, props changed) head/emulators/virtualbox-ose-kmod-legacy/pkg-descr (contents, props changed) head/emulators/virtualbox-ose-legacy/Makefile head/emulators/virtualbox-ose-legacy/distinfo head/emulators/virtualbox-ose-legacy/files/patch-configure head/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Main-src-server-freebsd-NetIf-freebsd.cpp head/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-memobj-r0drv-freebsd.c head/emulators/virtualbox-ose-legacy/pkg-descr (contents, props changed) head/emulators/virtualbox-ose-legacy/pkg-plist Modified: head/emulators/virtualbox-ose-kmod-legacy/Makefile ============================================================================== --- head/emulators/virtualbox-ose-kmod-legacy/Makefile Fri Dec 13 10:44:22 2013 (r336331) +++ head/emulators/virtualbox-ose-kmod-legacy/Makefile Fri Dec 13 11:17:19 2013 (r336332) @@ -2,7 +2,7 @@ # $FreeBSD$ PORTNAME= virtualbox-ose -DISTVERSION= 4.1.24 +DISTVERSION= 4.2.20 CATEGORIES= emulators MASTER_SITES= http://download.virtualbox.org/virtualbox/${DISTVERSION}/ \ http://tmp.chruetertee.ch/ \ @@ -34,9 +34,10 @@ CONFIGURE_ARGS+=--with-gcc="${CC}" --wit --build-headless CONFLICTS= bcc-[0-9]* -CONFLICTS_INSTALL= virtualbox-ose-kmod-[3,4]* virtualbox-ose-kmod-devel-[3,4]* +CONFLICTS_INSTALL= virtualbox-ose-kmod-4* virtualbox-ose-kmod-devel-4* OPTIONS_DEFINE= DEBUG VIMAGE +DEBUG_DESC= Debug symbols, additional logs and assertions VIMAGE_DESC= VIMAGE virtual networking support NO_STAGE= yes @@ -48,13 +49,14 @@ VBOX_BIN= ${WRKSRC}/out/${KMK_ARCH}/${KM 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 +KMK_FLAGS= HostDrivers-scripts vboxdrv-mod VBoxNetFlt-src VBoxNetAdp-src MAKE_FLAGS= SYSDIR=${SRC_BASE}/sys .if ${PORT_OPTIONS:MDEBUG} KMK_FLAGS+= BUILD_TYPE=debug KMK_BUILDTYPE= debug +EXTRA_PATCHES+= ${FILESDIR}/extrapatch-Config.kmk ${FILESDIR}/extrapatch-src-VBox-HostDrivers-Support-freebsd-Makefile MAKE_FLAGS+= DEBUG_FLAGS="-O1 -g" PLIST_SUB+= WITH_DEBUG="" .else @@ -69,14 +71,6 @@ KMK_ARCH= freebsd.${ARCH} .include -.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 - post-patch: @${ECHO} 'VBOX_WITH_VBOXDRV = 1' > ${WRKSRC}/LocalConfig.kmk @${ECHO} 'VBOX_WITH_NETFLT = 1' >> ${WRKSRC}/LocalConfig.kmk Modified: head/emulators/virtualbox-ose-kmod-legacy/distinfo ============================================================================== --- head/emulators/virtualbox-ose-kmod-legacy/distinfo Fri Dec 13 10:44:22 2013 (r336331) +++ head/emulators/virtualbox-ose-kmod-legacy/distinfo Fri Dec 13 11:17:19 2013 (r336332) @@ -1,2 +1,2 @@ -SHA256 (VirtualBox-4.1.24.tar.bz2) = 74008b8e8942045668c1b7d06b0a4bb5fe8464066e343e3a2e1ba30b94ce8a7f -SIZE (VirtualBox-4.1.24.tar.bz2) = 74612732 +SHA256 (VirtualBox-4.2.20.tar.bz2) = 193aa3ce7c0e700fe6a12b64bf462ce633a856f1e831ee4a337cc3439b21df61 +SIZE (VirtualBox-4.2.20.tar.bz2) = 77050211 Added: head/emulators/virtualbox-ose-kmod-legacy/files/extrapatch-Config.kmk ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/emulators/virtualbox-ose-kmod-legacy/files/extrapatch-Config.kmk Fri Dec 13 11:17:19 2013 (r336332) @@ -0,0 +1,11 @@ +--- Config.kmk.orig 2012-05-24 01:15:53.393052000 +0200 ++++ Config.kmk 2012-05-24 01:16:15.883067161 +0200 +@@ -3188,7 +3188,7 @@ + | xargs -J% objcopy % $(out) + + ## Strip debug info (comment out if debugging or something). +- objcopy --strip-debug $(out) ++# objcopy --strip-debug $(out) + endef + else # x86 + TOOL_FREEBSDKMODLD_LINK_SYSMOD_OUTPUT = $(outbase).kld Added: head/emulators/virtualbox-ose-kmod-legacy/files/extrapatch-src-VBox-HostDrivers-Support-freebsd-Makefile ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/emulators/virtualbox-ose-kmod-legacy/files/extrapatch-src-VBox-HostDrivers-Support-freebsd-Makefile Fri Dec 13 11:17:19 2013 (r336332) @@ -0,0 +1,11 @@ +--- src/VBox/HostDrivers/Support/freebsd/Makefile.orig 2012-10-18 16:23:16.000000000 +0200 ++++ src/VBox/HostDrivers/Support/freebsd/Makefile 2012-10-20 08:13:07.301179212 +0200 +@@ -27,7 +27,7 @@ + + KMOD = vboxdrv + +-CFLAGS += -DRT_OS_FREEBSD -DIN_RING0 -DIN_RT_R0 -DIN_SUP_R0 -DSUPDRV_WITH_RELEASE_LOGGER -DVBOX -DRT_WITH_VBOX -Iinclude -I. -Ir0drv -w -DVBOX_WITH_HARDENING -DVBOX_WITH_64_BITS_GUESTS ++CFLAGS += -DRT_OS_FREEBSD -DIN_RING0 -DIN_RT_R0 -DIN_SUP_R0 -DSUPDRV_WITH_RELEASE_LOGGER -DVBOX -DRT_WITH_VBOX -Iinclude -I. -Ir0drv -w -DVBOX_WITH_HARDENING -DVBOX_WITH_64_BITS_GUESTS -DEBUG + + .if (${MACHINE_ARCH} == "i386") + CFLAGS += -DRT_ARCH_X86 Added: head/emulators/virtualbox-ose-kmod-legacy/files/patch-Config.kmk ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/emulators/virtualbox-ose-kmod-legacy/files/patch-Config.kmk Fri Dec 13 11:17:19 2013 (r336332) @@ -0,0 +1,56 @@ +--- Config.kmk.orig 2012-12-20 14:44:38.260858319 +0100 ++++ Config.kmk 2012-12-20 14:55:59.491850177 +0100 +@@ -3239,7 +3239,7 @@ + $(VBOX_GCC_WARN) -Wpointer-arith -Winline $(VBOX_GCC_Wno-pointer-sign) $(VBOX_GCC_fdiagnostics-show-option) \ + -Wstrict-prototypes -Wmissing-prototypes -Wstrict-prototypes \ + -Wimplicit-function-declaration -Werror-implicit-function-declaration \ +- -O2 -fformat-extensions -ffreestanding -fno-strict-aliasing -fno-common -finline-limit=8000 \ ++ -O2 -ffreestanding -fno-strict-aliasing -fno-common -finline-limit=8000 \ + $(VBOX_GCC_fno-stack-protector) $(VBOX_GCC_R0_OPT) $(VBOX_GCC_R0_FP) \ + -nostdinc -std=c99 + TEMPLATE_VBOXR0DRV_CFLAGS.x86 = -m32 -mno-align-long-strings -mpreferred-stack-boundary=2 -mno-mmx -mno-3dnow -mno-sse -mno-sse2 +@@ -3248,7 +3248,7 @@ + -mno-3dnow -msoft-float -fno-asynchronous-unwind-tables -Wundef + TEMPLATE_VBOXR0DRV_CXXFLAGS = -fno-exceptions -fno-rtti \ + $(VBOX_GCC_WARN) -Wpointer-arith -Winline \ +- -O2 -fno-format-extensions -fno-strict-aliasing -fno-common -finline-limit=8000 \ ++ -O2 -fno-strict-aliasing -fno-common -finline-limit=8000 \ + $(VBOX_GCC_fno-stack-protector) $(VBOX_GCC_R0_OPT) $(VBOX_GCC_R0_FP) \ + -nostdinc + TEMPLATE_VBOXR0DRV_CXXFLAGS.x86 = $(TEMPLATE_VBOXR0DRV_CFLAGS.x86) +@@ -3465,8 +3465,6 @@ + /usr/X11R6/include \ + /usr/local/include + TEMPLATE_VBOXR3EXE_LIBPATH += \ +- /usr/lib \ +- /usr/X11R6/lib \ + /usr/local/lib + else ifeq ($(KBUILD_TARGET),solaris) + TEMPLATE_VBOXR3EXE_TOOL = GXX3PLAIN +@@ -3955,8 +3953,6 @@ + /usr/X11R6/include \ + /usr/local/include + TEMPLATE_VBOXMAINEXE_LIBPATH += \ +- /usr/lib \ +- /usr/X11R6/lib \ + /usr/local/lib + else ifeq ($(KBUILD_TARGET),solaris) + TEMPLATE_VBOXMAINEXE_TOOL = GXX3PLAIN +@@ -4371,8 +4367,6 @@ + /usr/X11R6/include \ + /usr/local/include + TEMPLATE_VBOXQT4GUIEXE_LIBPATH += \ +- /usr/lib \ +- /usr/X11R6/lib \ + /usr/local/lib + endif + ifeq ($(KBUILD_TARGET),solaris) +@@ -4555,8 +4549,6 @@ + /usr/X11R6/include \ + /usr/local/include + TEMPLATE_VBOXBLDPROG_LIBPATH += \ +- /usr/lib \ +- /usr/X11R6/lib \ + /usr/local/lib + else ifeq ($(KBUILD_HOST),solaris) + TEMPLATE_VBOXBLDPROG_TOOL = GXX3PLAIN Added: head/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-HostDrivers-VBoxNetAdp-Makefile.kmk ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-HostDrivers-VBoxNetAdp-Makefile.kmk Fri Dec 13 11:17:19 2013 (r336332) @@ -0,0 +1,25 @@ +Fix kmod panic when VIMAGE is disabled in the kernel and port + +Submitted by: Gleb Kurtsou +--- src/VBox/HostDrivers/VBoxNetAdp/Makefile.kmk.orig 2013-04-12 03:38:10.000000000 -0700 ++++ src/VBox/HostDrivers/VBoxNetAdp/Makefile.kmk 2013-06-11 21:24:05.000000000 -0700 +@@ -143,12 +143,15 @@ + $$(if $$(eq $$(VBoxNetAdp/freebsd/Makefile_VBOX_HARDENED),$$(VBOX_WITH_HARDENING)),,FORCE) \ + | $$(dir $$@) + $(QUIET)$(RM) -f -- $@ +- ifndef VBOX_WITH_HARDENING +- $(QUIET)$(SED) -e "s;-DVBOX_WITH_HARDENING;;g" --output $@ $< +- else + $(QUIET)$(CP) -f $< $@ ++ ifndef VBOX_WITH_HARDENING ++ $(QUIET)$(SED) -e "s;-DVBOX_WITH_HARDENING;;g" --output $@.tmp $@ ++ ${QUIET}$(MV) -f $@.tmp $@ ++ endif ++ ifndef VBOX_WITH_NETFLT_VIMAGE ++ $(QUIET)$(SED) -e "s;-DVIMAGE;;g" --output $@.tmp $@ ++ ${QUIET}$(MV) -f $@.tmp $@ + endif +- + endif # freebsd + + include $(FILE_KBUILD_SUB_FOOTER) Modified: head/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-HostDrivers-VBoxNetFlt-freebsd-VBoxNetFlt-freebsd.c ============================================================================== --- head/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-HostDrivers-VBoxNetFlt-freebsd-VBoxNetFlt-freebsd.c Fri Dec 13 10:44:22 2013 (r336331) +++ head/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-HostDrivers-VBoxNetFlt-freebsd-VBoxNetFlt-freebsd.c Fri Dec 13 11:17:19 2013 (r336332) @@ -1,31 +1,72 @@ -The attached patch fixes a kernel crash on FreeBSD 10-CURRENT hosts -with VIMAGE enabled when a VM is powered off. +Add VLAN trunking support to vboxnetflt -Submitted by: Mikolaj Golub ---- 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(); +See: http://lists.freebsd.org/pipermail/freebsd-emulation/2012-April/009698.html +See: http://lists.freebsd.org/pipermail/freebsd-emulation/2013-May/010605.html +Submitted by: Landon J Fuller +--- ./src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c.orig 2013-04-12 06:38:11.000000000 -0400 ++++ ./src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c 2013-05-25 20:14:52.152180452 -0400 +@@ -51,6 +51,7 @@ + #include + #include + #include ++#include - if (ifp0 != NULL) - { - vboxNetFltOsDeleteInstance(pThis); - vboxNetFltOsInitInstance(pThis, NULL); - } -- VBOXCURVNET_RESTORE(); + #include + #include +@@ -427,6 +428,8 @@ + struct ifnet *ifp = pThis->u.s.ifp; + unsigned int cSegs = 0; + bool fDropIt = false, fActive; ++ bool is_vl_tagged = false; ++ uint16_t vl_tag; + PINTNETSG pSG; - 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(ifp->if_vnet); +@@ -439,6 +442,19 @@ + if (m == NULL) + break; -+ VBOXCURVNET_SET_FROM_UCRED(); - if (pThis->u.s.node != NULL) - ng_rmnode_self(pThis->u.s.node); -+ VBOXCURVNET_RESTORE(); - pThis->u.s.node = NULL; - } ++ /* Prepend a VLAN header for consumption by the virtual switch */ ++ if (m->m_flags & M_VLANTAG) { ++ vl_tag = m->m_pkthdr.ether_vtag; ++ is_vl_tagged = true; ++ ++ m = ether_vlanencap(m, m->m_pkthdr.ether_vtag); ++ if (m == NULL) { ++ printf("vboxflt: unable to prepend VLAN header\n"); ++ break; ++ } ++ m->m_flags &= ~M_VLANTAG; ++ } ++ + for (m0 = m; m0 != NULL; m0 = m0->m_next) + if (m0->m_len > 0) + cSegs++; +@@ -453,6 +469,27 @@ + vboxNetFltFreeBSDMBufToSG(pThis, m, pSG, cSegs, 0); + fDropIt = pThis->pSwitchPort->pfnRecv(pThis->pSwitchPort, NULL /* pvIf */, pSG, INTNETTRUNKDIR_WIRE); + RTMemTmpFree(pSG); ++ ++ /* Restore the VLAN flags before re-injecting the packet */ ++ if (is_vl_tagged && !fDropIt) { ++ struct ether_vlan_header *vl_hdr; ++ ++ /* This shouldn't fail, as the header was just prepended */ ++ if (m->m_len < sizeof(*vl_hdr) && (m = m_pullup(m, sizeof(*vl_hdr))) == NULL) { ++ printf("vboxflt: unable to pullup VLAN header\n"); ++ m_freem(m); ++ break; ++ } ++ ++ /* Copy the MAC dhost/shost over the 802.1q field */ ++ vl_hdr = mtod(m, struct ether_vlan_header *); ++ bcopy((char *)vl_hdr, (char *)vl_hdr + ETHER_VLAN_ENCAP_LEN, ETHER_HDR_LEN - ETHER_TYPE_LEN); ++ m_adj(m, ETHER_VLAN_ENCAP_LEN); ++ ++ m->m_pkthdr.ether_vtag = vl_tag; ++ m->m_flags |= M_VLANTAG; ++ } ++ + if (fDropIt) + m_freem(m); + else Added: head/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-alloc-r0drv-freebsd.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-alloc-r0drv-freebsd.c Fri Dec 13 11:17:19 2013 (r336332) @@ -0,0 +1,16 @@ +--- src/VBox/Runtime/r0drv/freebsd/alloc-r0drv-freebsd.c 2013-09-06 06:30:30.000000000 -0600 ++++ src/VBox/Runtime/r0drv/freebsd/alloc-r0drv-freebsd.c 2013-09-18 12:01:45.000000000 -0600 +@@ -79,8 +79,13 @@ + return VERR_NO_EXEC_MEMORY; + + /* Addr contains a start address vm_map_find will start searching for suitable space at. */ ++#if __FreeBSD_version >= 1000055 ++ int rc = vm_map_find(kernel_map, pVmObject, 0, &Addr, ++ cbAllocated, 0, VMFS_ANY_SPACE, VM_PROT_ALL, VM_PROT_ALL, 0); ++#else + int rc = vm_map_find(kernel_map, pVmObject, 0, &Addr, + cbAllocated, TRUE, VM_PROT_ALL, VM_PROT_ALL, 0); ++#endif + if (rc == KERN_SUCCESS) + { + rc = vm_map_wire(kernel_map, Addr, Addr + cbAllocated, Modified: head/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-memobj-r0drv-freebsd.c ============================================================================== --- head/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-memobj-r0drv-freebsd.c Fri Dec 13 10:44:22 2013 (r336331) +++ head/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-memobj-r0drv-freebsd.c Fri Dec 13 11:17:19 2013 (r336332) @@ -1,893 +1,56 @@ ---- 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 -+ * Copyright (c) 2011 Andriy Gapon - * - * 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: +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 | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/src/VBox/Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c b/src/VBox/Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c +index 5c90cf3..1176b51 100644 +--- src/VBox/Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c ++++ src/VBox/Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c +@@ -164,14 +164,19 @@ DECLHIDDEN(int) rtR0MemObjNativeFree(RTR0MEMOBJ pMem) { - 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); + 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)) + 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); } ++#if __FreeBSD_version < 900000 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 (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 - -- 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) + VM_OBJECT_UNLOCK(pMemFreeBSD->pObject); + vm_object_deallocate(pMemFreeBSD->pObject); + break; +@@ -263,11 +268,15 @@ static int rtR0MemObjFreeBSDPhysAllocHelper(vm_object_t pObject, u_long cPages, + 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); + pPage = vm_page_lookup(pObject, iPage); +#if __FreeBSD_version < 900000 -+ vm_page_lock_queues(); + vm_page_lock_queues(); +#endif -+ if (fWire) + 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 - } - - --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; - - /* create the object. */ -- 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 (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 (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 - } - - -@@ -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 (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; - --/* 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) *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***