diff options
author | Bernhard Froehlich <decke@FreeBSD.org> | 2013-12-13 11:17:19 +0000 |
---|---|---|
committer | Bernhard Froehlich <decke@FreeBSD.org> | 2013-12-13 11:17:19 +0000 |
commit | a60eaff53fd7ab4174e758d36a6af42dd4300f9c (patch) | |
tree | 0ce1cf3abd9d6f7f619c3cda4ecadd684b6c900a /emulators/virtualbox-ose-kmod-legacy | |
parent | 91e3a74739c2303663d214a9fce06a90e150514f (diff) | |
download | freebsd-ports-a60eaff53fd7ab4174e758d36a6af42dd4300f9c.zip |
- 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.
Diffstat (limited to 'emulators/virtualbox-ose-kmod-legacy')
20 files changed, 338 insertions, 1087 deletions
diff --git a/emulators/virtualbox-ose-kmod-legacy/Makefile b/emulators/virtualbox-ose-kmod-legacy/Makefile index 8d0834ee700d..b839a63c91c3 100644 --- a/emulators/virtualbox-ose-kmod-legacy/Makefile +++ b/emulators/virtualbox-ose-kmod-legacy/Makefile @@ -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}" --with-g++="${CXX}" --nofatal \ --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}/${KMK_BUILDTYPE}/bin/src 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 diff --git a/emulators/virtualbox-ose-kmod-legacy/distinfo b/emulators/virtualbox-ose-kmod-legacy/distinfo index f19872868d76..f3287ff8e8b3 100644 --- a/emulators/virtualbox-ose-kmod-legacy/distinfo +++ b/emulators/virtualbox-ose-kmod-legacy/distinfo @@ -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 diff --git a/emulators/virtualbox-ose-kmod-legacy/files/extrapatch-Config.kmk b/emulators/virtualbox-ose-kmod-legacy/files/extrapatch-Config.kmk new file mode 100644 index 000000000000..7df1b0883f27 --- /dev/null +++ b/emulators/virtualbox-ose-kmod-legacy/files/extrapatch-Config.kmk @@ -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 diff --git a/emulators/virtualbox-ose-kmod-legacy/files/extrapatch-src-VBox-HostDrivers-Support-freebsd-Makefile b/emulators/virtualbox-ose-kmod-legacy/files/extrapatch-src-VBox-HostDrivers-Support-freebsd-Makefile new file mode 100644 index 000000000000..90efbaeb2965 --- /dev/null +++ b/emulators/virtualbox-ose-kmod-legacy/files/extrapatch-src-VBox-HostDrivers-Support-freebsd-Makefile @@ -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 diff --git a/emulators/virtualbox-ose-kmod-legacy/files/patch-Config.kmk b/emulators/virtualbox-ose-kmod-legacy/files/patch-Config.kmk new file mode 100644 index 000000000000..d7edc886bb4a --- /dev/null +++ b/emulators/virtualbox-ose-kmod-legacy/files/patch-Config.kmk @@ -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 diff --git a/emulators/virtualbox-ose-kmod-legacy/files/patch-include-iprt-types.h b/emulators/virtualbox-ose-kmod-legacy/files/patch-include-iprt-types.h deleted file mode 100644 index afa28bbb1461..000000000000 --- a/emulators/virtualbox-ose-kmod-legacy/files/patch-include-iprt-types.h +++ /dev/null @@ -1,19 +0,0 @@ -- Fix build failure on FreeBSD 10-CURRENT after r228444 - -include/iprt/types.h:174: error: redefinition of typedef 'bool' -@/sys/types.h:271: error: previous declaration of 'bool' was here - -Submitted by: Daichi GOTO <daichi@freebsd.org> ---- include/iprt/types.h.orig 2011-10-28 16:29:51.000000000 +0200 -+++ include/iprt/types.h 2011-12-22 10:17:16.000000000 +0100 -@@ -167,6 +167,10 @@ - # if defined(__GNUC__) - # if defined(RT_OS_LINUX) && __GNUC__ < 3 - typedef uint8_t bool; -+# elif defined(RT_OS_FREEBSD) -+# ifndef __bool_true_false_are_defined -+typedef _Bool bool; -+# endif - # else - # if defined(RT_OS_DARWIN) && defined(_STDBOOL_H) - # undef bool diff --git a/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-HostDrivers-Support-freebsd-SUPDrv-freebsd.c b/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-HostDrivers-Support-freebsd-SUPDrv-freebsd.c deleted file mode 100644 index 8bc13932892d..000000000000 --- a/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-HostDrivers-Support-freebsd-SUPDrv-freebsd.c +++ /dev/null @@ -1,31 +0,0 @@ -- Fix compile error: 'D_PSEUDO' undeclared here on 10-CURRENT - -Submitted by: Jung-uk Kim <jkim@FreeBSD.org> - -- Fix check that kernel module can not be unloaded when there -are running VMs - -Submitted by: aeichner -Reported by: avg ---- src/VBox/HostDrivers/Support/freebsd/SUPDrv-freebsd.c.orig 2011-11-04 12:19:39.000000000 +0100 -+++ src/VBox/HostDrivers/Support/freebsd/SUPDrv-freebsd.c 2011-12-13 12:22:44.325251163 +0100 -@@ -100,7 +100,9 @@ - static struct cdevsw g_VBoxDrvFreeBSDChrDevSW = - { - .d_version = D_VERSION, --#if __FreeBSD_version > 800061 -+#if __FreeBSD_version >= 1000000 -+ .d_flags = D_TRACKCLOSE | D_NEEDMINOR, -+#elif __FreeBSD_version > 800061 - .d_flags = D_PSEUDO | D_TRACKCLOSE | D_NEEDMINOR, - #else - .d_flags = D_PSEUDO | D_TRACKCLOSE, -@@ -205,7 +207,7 @@ - Log(("VBoxDrvFreeBSDUnload:\n")); - - if (g_cUsers > 0) -- return EBUSY; -+ return VERR_RESOURCE_BUSY; - - /* - * Reserve what we did in VBoxDrvFreeBSDInit. diff --git a/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-HostDrivers-VBoxNetAdp-Makefile.kmk b/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-HostDrivers-VBoxNetAdp-Makefile.kmk new file mode 100644 index 000000000000..01d25b3ac02a --- /dev/null +++ b/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-HostDrivers-VBoxNetAdp-Makefile.kmk @@ -0,0 +1,25 @@ +Fix kmod panic when VIMAGE is disabled in the kernel and port + +Submitted by: Gleb Kurtsou <gleb@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) 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 deleted file mode 100644 index 821c767192e1..000000000000 --- a/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-HostDrivers-VBoxNetAdp-freebsd-Makefile +++ /dev/null @@ -1,16 +0,0 @@ -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 deleted file mode 100644 index aa64625d47af..000000000000 --- a/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-HostDrivers-VBoxNetAdp-freebsd-VBoxNetAdp-freebsd.c +++ /dev/null @@ -1,54 +0,0 @@ -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 index 185931e4f504..6cb5a1ebd30c 100644 --- 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 @@ -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 diff --git a/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-alloc-r0drv-freebsd.c b/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-alloc-r0drv-freebsd.c new file mode 100644 index 000000000000..f8b9743c21c8 --- /dev/null +++ b/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-alloc-r0drv-freebsd.c @@ -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, 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 92017090571b..b666b7ed0362 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,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@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); +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) + { + 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) -+ 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); + vm_page_free(pPage); ++#if __FreeBSD_version < 900000 + vm_page_unlock_queues(); ++#endif } - 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; + VM_OBJECT_UNLOCK(pObject); + return rcNoMem; +-- +1.7.11.5 + diff --git a/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-memobj-r0drv-freebsd_VM_MAP_FIND.c b/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-memobj-r0drv-freebsd_VM_MAP_FIND.c new file mode 100644 index 000000000000..6dfe0b99208e --- /dev/null +++ b/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-memobj-r0drv-freebsd_VM_MAP_FIND.c @@ -0,0 +1,48 @@ +--- src/VBox/Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c.orig 2013-09-06 12:30:30.000000000 +0000 ++++ src/VBox/Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c 2013-09-21 18:12:53.000000000 +0000 +@@ -286,9 +286,15 @@ + pMemFreeBSD->pObject = vm_object_allocate(OBJT_PHYS, cPages); + + /* No additional object reference for auto-deallocation upon unmapping. */ ++#if __FreeBSD_version >= 1000055 ++ rc = vm_map_find(kernel_map, pMemFreeBSD->pObject, 0, ++ &MapAddress, pMemFreeBSD->Core.cb, 0, VMFS_ANY_SPACE, ++ fExecutable ? VM_PROT_ALL : VM_PROT_RW, VM_PROT_ALL, 0); ++#else + 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); ++#endif + + if (rc == KERN_SUCCESS) + { +@@ -551,6 +557,9 @@ + 0, /* offset */ + &MapAddress, /* addr (IN/OUT) */ + cb, /* length */ ++#if __FreeBSD_version >= 1000055 ++ 0, /* max addr */ ++#endif + pvFixed == (void *)-1 ? VMFS_ANY_SPACE : VMFS_NO_SPACE, + /* find_space */ + VM_PROT_NONE, /* protection */ +@@ -628,6 +637,9 @@ + offSub, /* Start offset in the object */ + &Addr, /* Start address IN/OUT */ + cbSub, /* Size of the mapping */ ++#if __FreeBSD_version >= 1000055 ++ 0, /* Upper bound of mapping */ ++#endif + VMFS_ANY_SPACE, /* Whether a suitable address should be searched for first */ + ProtectionFlags, /* protection flags */ + VM_PROT_ALL, /* Maximum protection flags */ +@@ -704,6 +716,9 @@ + 0, /* Start offset in the object */ + &AddrR3, /* Start address IN/OUT */ + pMemToMap->cb, /* Size of the mapping */ ++#if __FreeBSD_version >= 1000055 ++ 0, /* Upper bound of the mapping */ ++#endif + R3PtrFixed == (RTR3PTR)-1 ? VMFS_ANY_SPACE : VMFS_NO_SPACE, + /* Whether a suitable address should be searched for first */ + ProtectionFlags, /* protection flags */ diff --git a/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-memobj-r0drv-freebsd_VM_OBJECT_RENAME.c b/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-memobj-r0drv-freebsd_VM_OBJECT_RENAME.c index e4118df03498..82d7d1c297d6 100644 --- a/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-memobj-r0drv-freebsd_VM_OBJECT_RENAME.c +++ b/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-memobj-r0drv-freebsd_VM_OBJECT_RENAME.c @@ -1,6 +1,8 @@ ---- src/VBox/Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c.orig 2013-05-10 15:16:34.000000000 +0200 -+++ src/VBox/Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c 2013-05-10 12:43:20.000000000 +0200 -@@ -165,7 +165,11 @@ +$FreeBSD$ + +--- src/VBox/Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c 2013-03-20 19:19:36.795745576 -0700 ++++ src/VBox/Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c 2013-03-20 19:15:35.164791970 -0700 +@@ -162,7 +162,11 @@ case RTR0MEMOBJTYPE_PHYS: case RTR0MEMOBJTYPE_PHYS_NC: { @@ -12,41 +14,40 @@ 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 */ -@@ -177,8 +181,14 @@ - { - vm_page_unwire(pPage, 0); - } -+#if __FreeBSD_version < 900000 +@@ -177,7 +181,12 @@ + #if __FreeBSD_version < 900000 vm_page_unlock_queues(); -+#endif + #endif +#if __FreeBSD_version >= 1000030 + VM_OBJECT_WUNLOCK(pMemFreeBSD->pObject); +#else VM_OBJECT_UNLOCK(pMemFreeBSD->pObject); +#endif ++ vm_object_deallocate(pMemFreeBSD->pObject); break; } -@@ -205,9 +215,17 @@ - flags |= VM_ALLOC_WIRED; - while (1) +@@ -205,10 +214,18 @@ + + while (cTries <= 1) { +#if __FreeBSD_version >= 1000030 + VM_OBJECT_WLOCK(pObject); +#else VM_OBJECT_LOCK(pObject); +#endif - pPages = vm_page_alloc_contig(pObject, iPIndex, flags, cPages, 0, VmPhysAddrHigh, uAlignment, 0, VM_MEMATTR_DEFAULT); + pPages = vm_page_alloc_contig(pObject, iPIndex, fFlags, cPages, 0, + VmPhysAddrHigh, uAlignment, 0, VM_MEMATTR_DEFAULT); +#if __FreeBSD_version >= 1000030 + VM_OBJECT_WUNLOCK(pObject); +#else VM_OBJECT_UNLOCK(pObject); +#endif - if (pPages || tries >= 1) + if (pPages) break; - vm_pageout_grow_cache(tries, 0, VmPhysAddrHigh); -@@ -226,7 +244,11 @@ - } + vm_pageout_grow_cache(cTries, 0, VmPhysAddrHigh); +@@ -228,7 +245,11 @@ + if (!pPages) return pPages; +#if __FreeBSD_version >= 1000030 @@ -57,7 +58,7 @@ for (vm_pindex_t iPage = 0; iPage < cPages; iPage++) { vm_page_t pPage = pPages + iPage; -@@ -238,7 +260,11 @@ +@@ -240,7 +261,11 @@ atomic_add_int(&cnt.v_wire_count, 1); } } @@ -69,7 +70,7 @@ return pPages; #endif } -@@ -261,7 +287,11 @@ +@@ -264,7 +289,11 @@ if (!pPage) { /* Free all allocated pages */ @@ -81,23 +82,19 @@ while (iPage-- > 0) { pPage = vm_page_lookup(pObject, iPage); -@@ -271,9 +301,15 @@ - if (fWire) - vm_page_unwire(pPage, 0); - vm_page_free(pPage); -+#if __FreeBSD_version < 900000 +@@ -278,7 +307,11 @@ vm_page_unlock_queues(); -+#endif + #endif } +#if __FreeBSD_version >= 1000030 + VM_OBJECT_WUNLOCK(pObject); +#else VM_OBJECT_UNLOCK(pObject); +#endif - return VERR_NO_MEMORY; + return rcNoMem; } } -@@ -406,9 +442,17 @@ +@@ -411,9 +444,17 @@ if (fContiguous) { Assert(enmType == RTR0MEMOBJTYPE_PHYS); @@ -115,7 +112,7 @@ pMemFreeBSD->Core.u.Phys.fAllocated = true; } -@@ -813,9 +857,17 @@ +@@ -823,9 +864,17 @@ case RTR0MEMOBJTYPE_PHYS_NC: { RTHCPHYS addr; 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 deleted file mode 100644 index 2f04d3adfafd..000000000000 --- a/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-semfastmutex-r0drv-freebsd.c +++ /dev/null @@ -1,15 +0,0 @@ -- 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/files/patch-src-VBox-Runtime-r0drv-freebsd-sleepqueue-r0drv-freebsd.h b/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-sleepqueue-r0drv-freebsd.h new file mode 100644 index 000000000000..e1ae4d7ea855 --- /dev/null +++ b/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-sleepqueue-r0drv-freebsd.h @@ -0,0 +1,20 @@ +Without this patch any waits for periods shorter than a single tick return +immediately leading to a lot of unnecessary spinning. For example, I observe that +my guest's idle loop does a lot of sleeps with periods slightly shorter than 1 ms +(1/hz), e.g. 900us. All that waiting turns into pure spinning and VirtualBox eats +100% of a core. +The patch improves the situation significantly. Also, it (approximately) follows +what tvtohz does. + +Submitted by: Andriy Gapon <avg@FreeBSD.org> +--- src/VBox/Runtime/r0drv/freebsd/sleepqueue-r0drv-freebsd.h.orig 2012-12-19 19:27:29.000000000 +0100 ++++ src/VBox/Runtime/r0drv/freebsd/sleepqueue-r0drv-freebsd.h 2012-12-20 12:07:48.941861966 +0100 +@@ -82,6 +82,8 @@ + uint64_t cTicks = ASMMultU64ByU32DivByU32(uTimeout, hz, UINT32_C(1000000000)); + if (cTicks >= INT_MAX) + return RTSEMWAIT_FLAGS_INDEFINITE; ++ else if (cTicks == 0 && uTimeout > 0) ++ pWait->iTimeout = 1; + else + pWait->iTimeout = (int)cTicks; + #endif diff --git a/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-the-freebsd-kernel.h b/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-the-freebsd-kernel.h index a60b817cb21f..24acae278364 100644 --- a/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-the-freebsd-kernel.h +++ b/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-the-freebsd-kernel.h @@ -1,5 +1,7 @@ ---- src/VBox/Runtime/r0drv/freebsd/the-freebsd-kernel.h.orig 2012-12-19 20:51:59.000000000 +0100 -+++ src/VBox/Runtime/r0drv/freebsd/the-freebsd-kernel.h 2013-05-10 12:40:19.000000000 +0200 +$FreeBSD$ + +--- src/VBox/Runtime/r0drv/freebsd/the-freebsd-kernel.h 2012-12-19 10:27:29.000000000 -0800 ++++ src/VBox/Runtime/r0drv/freebsd/the-freebsd-kernel.h 2013-03-20 19:10:15.854804053 -0700 @@ -50,6 +50,9 @@ #include <sys/unistd.h> #include <sys/kthread.h> diff --git a/emulators/virtualbox-ose-kmod-legacy/files/vboxnet.in b/emulators/virtualbox-ose-kmod-legacy/files/vboxnet.in index cf4225486a30..073ee3764176 100644 --- a/emulators/virtualbox-ose-kmod-legacy/files/vboxnet.in +++ b/emulators/virtualbox-ose-kmod-legacy/files/vboxnet.in @@ -4,8 +4,7 @@ # # PROVIDE: vboxnet -# REQUIRE: FILESYSTEMS -# BEFORE: netif +# REQUIRE: FILESYSTEMS NETWORKING ldconfig # KEYWORD: nojail # @@ -41,6 +40,9 @@ vboxnet_start() return 1 fi fi + + # initialize configured host-only interfaces + %%PREFIX%%/bin/VBoxManage list hostonlyifs >/dev/null } vboxnet_stop() diff --git a/emulators/virtualbox-ose-kmod-legacy/pkg-descr b/emulators/virtualbox-ose-kmod-legacy/pkg-descr index 0b1e16c034af..d10019c03792 100644 --- a/emulators/virtualbox-ose-kmod-legacy/pkg-descr +++ b/emulators/virtualbox-ose-kmod-legacy/pkg-descr @@ -4,4 +4,4 @@ feature rich, high performance product for enterprise customers, it is also the only professional solution that is freely available as Open Source Software under the terms of the GNU General Public License. -WWW: http://www.virtualbox.org/ +WWW: http://www.virtualbox.org/ |