svn commit: r336332 - in head/emulators: virtualbox-ose-kmod-legacy virtualbox-ose-kmod-legacy/files virtualbox-ose-legacy virtualbox-ose-legacy/files
Bernhard Froehlich
decke at FreeBSD.org
Fri Dec 13 11:17:22 UTC 2013
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 <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
-
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 <gleb at freebsd.org>
+--- 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 <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();
+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 <landonf at plausible.coop>
+--- ./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 <net/if_dl.h>
+ #include <net/if_types.h>
+ #include <net/ethernet.h>
++#include <net/if_vlan_var.h>
- if (ifp0 != NULL)
- {
- vboxNetFltOsDeleteInstance(pThis);
- vboxNetFltOsInitInstance(pThis, NULL);
- }
-- VBOXCURVNET_RESTORE();
+ #include <netgraph/ng_message.h>
+ #include <netgraph/netgraph.h>
+@@ -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 <bird-src-spam at anduin.net>
-+ * Copyright (c) 2011 Andriy Gapon <avg at 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:
+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 ***
More information about the svn-ports-head
mailing list