Bug 171730 - emulators/virtualbox-ose:
Summary: emulators/virtualbox-ose:
Status: Closed FIXED
Alias: None
Product: Ports & Packages
Classification: Unclassified
Component: Individual Port(s) (show other bugs)
Version: Latest
Hardware: Any Any
: Normal Affects Only Me
Assignee: Virtualbox Team (Nobody)
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2012-09-18 09:00 UTC by O. Hartmann
Modified: 2013-01-03 13:50 UTC (History)
0 users

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description O. Hartmann 2012-09-18 09:00:20 UTC
Updating port emulators/virtualbox-ose on FreeBSD 10.0-CURRENT/amd64, buildworld and buildkernel with CLANG (r240620M, FreeBSD clang version 3.2 (trunk 162107) 20120817) does fail updating from Version 4.1.20 -> 4.1.22 with the following error while being compiled with option USE_GCC=4.6+ (compiling with gcc 4.6 instead of clang).



kBuild: Generating python - /usr/ports/emulators/virtualbox-ose/work/VirtualBox-4.1.22/out/freebsd.amd64/release/obj/VBoxOGLgen/state_isenabled.c
kBuild: Compiling VBoxOGLhostcrstate - /usr/ports/emulators/virtualbox-ose/work/VirtualBox-4.1.22/src/VBox/GuestHost/OpenGL/state_tracker/state_snapshot.c
kBuild: Compiling HGSMIGuestR0Lib - /usr/ports/emulators/virtualbox-ose/work/VirtualBox-4.1.22/src/VBox/GuestHost/HGSMI/HGSMICommon.cpp
cc1plus: error: unrecognized command line option '-fno-format-extensions'
kmk: *** [/usr/ports/emulators/virtualbox-ose/work/VirtualBox-4.1.22/out/freebsd.amd64/release/obj/HGSMIGuestR0Lib/HGSMICommon.o] Error 1
The failing command:
@g++46 -c -O2 -fno-exceptions -fno-rtti -Wall -Wextra -Wno-missing-field-initializers -Wno-unused -Wno-trigraphs -fdiagnostics-show-option -Wpointer-arith -Winline -O2 -fno-format-extensions -fno-strict-aliasing -fno-common -finline-limit=8000 -fno-stack-protector -O2 -mtune=generic -fno-omit-frame-pointer -nostdinc -include /usr/ports/emulators/virtualbox-ose/work/VirtualBox-4.1.22/include/VBox/VBoxGuestMangling.h -m64 --param inline-unit-growth=100 --param large-function-growth=1000 -fno-omit-frame-pointer -mcmodel=kernel -mno-red-zone -mfpmath=387 -mno-sse -mno-sse2 -mno-mmx -mno-3dnow -msoft-float -fno-asynchronous-unwind-tables -Wundef -I/usr/src/sys -I/usr/src/sys/contrib/altq -I/usr/src/sys/../include -I/usr/include -I/usr/ports/emulators/virtualbox-ose/work/VirtualBox-4.1.22/include -I/usr/ports/emulators/virtualbox-ose/work/VirtualBox-4.1.22/out/freebsd.amd64/release -DVBOX -DVBOX_WITH_DEBUGGER -DVBOX_OSE -DVBOX_WITH_64_BITS_GUESTS -DVBOX_WITH_HARDENING -DRTPATH_APP_PRIVATE=
 \"/usr/local/share/virtualbox-ose\" -DRTPATH_APP_PRIVATE_ARCH=\"/usr/local/lib/virtualbox\" -DRTPATH_SHARED_LIBS=\"/usr/local/lib/virtualbox\" -DRTPATH_APP_DOCS=\"/usr/local/share/doc/virtualbox-ose\" -DRT_OS_FREEBSD -D__FREEBSD__ -DRT_ARCH_AMD64 -D__AMD64__ -D_KERNEL -DKLD_MODULE -DIN_RING0 -DIN_RT_R0 -DIN_GUEST -DIN_GUEST_R0 -Wp,-MD,/usr/ports/emulators/virtualbox-ose/work/VirtualBox-4.1.22/out/freebsd.amd64/release/obj/HGSMIGuestR0Lib/HGSMICommon.o.dep -Wp,-MT,/usr/ports/emulators/virtualbox-ose/work/VirtualBox-4.1.22/out/freebsd.amd64/release/obj/HGSMIGuestR0Lib/HGSMICommon.o -Wp,-MP -o /usr/ports/emulators/virtualbox-ose/work/VirtualBox-4.1.22/out/freebsd.amd64/release/obj/HGSMIGuestR0Lib/HGSMICommon.o /usr/ports/emulators/virtualbox-ose/work/VirtualBox-4.1.22/src/VBox/GuestHost/HGSMI/HGSMICommon.cpp
kmk: *** Waiting for unfinished jobs....
/usr/ports/emulators/virtualbox-ose/work/VirtualBox-4.1.22/src/VBox/GuestHost/OpenGL/state_tracker/state_snapshot.c:1403:1: warning: variably modified 'RTASSERTVAR' at file scope [enabled by default]
kmk: *** Exiting with status 2
*** [do-build] Error code 2

Stop in /usr/ports/emulators/virtualbox-ose.
*** [build] Error code 1

Stop in /usr/ports/emulators/virtualbox-ose.

How-To-Repeat: On most recent FreeBSD 10.0-CUR or 9.1-PRE, both CLANG built and amd64, try to build or install most recent emulators/virtualbox-ose (4.1.22).
Comment 1 Edwin Groothuis freebsd_committer freebsd_triage 2012-09-18 09:00:35 UTC
Maintainer of emulators/virtualbox-ose,

Please note that PR ports/171730 has just been submitted.

If it contains a patch for an upgrade, an enhancement or a bug fix
you agree on, reply to this email stating that you approve the patch
and a committer will take care of it.

The full text of the PR can be found at:
    http://www.freebsd.org/cgi/query-pr.cgi?pr=ports/171730

-- 
Edwin Groothuis via the GNATS Auto Assign Tool
edwin@FreeBSD.org
Comment 2 Edwin Groothuis freebsd_committer freebsd_triage 2012-09-18 09:00:38 UTC
State Changed
From-To: open->feedback

Awaiting maintainers feedback (via the GNATS Auto Assign Tool)
Comment 3 Mark Linimon freebsd_committer freebsd_triage 2012-10-08 07:17:07 UTC
Responsible Changed
From-To: freebsd-ports-bugs->vbox

Over to maintainer(s).
Comment 4 Bernhard Froehlich freebsd_committer freebsd_triage 2012-12-20 13:43:09 UTC
VirtualBox still requires base gcc and does not work with gcc
from ports. The reason is that we are using a few custom
compiler flags that only our base gcc supports.
There is a patch from Andriy Gapon to support ports GCC 4.5
and 4.6 and I will give that a try and see if we can commit that.

http://people.freebsd.org/~avg/vbox4-gcc45.patch

-- 
Bernhard Froehlich
http://www.bluelife.at/
Comment 5 Bernhard Froehlich freebsd_committer freebsd_triage 2012-12-20 14:22:19 UTC
I've committed that patch to the vbox repository now. If you can
please give it a try. It should work at least with GCC 4.6 but
chances are that 4.7 will also work.

https://github.com/decke/freebsd-vbox/commit/0006127279417b35b05964fb11b7c90c23e66397

-- 
Bernhard Froehlich
http://www.bluelife.at/
Comment 6 O. Hartmann 2012-12-30 14:17:13 UTC
I can not compile port emulators/virtualbox-ose-kmod with any other
compiler but "cc" (which defaults to CLANG 3.2 on FreeBSD 10.0).

Setting USE_GCC=4.6+ in the port's Makefile seems to be ignored!
Comment 7 dfilter service freebsd_committer freebsd_triage 2013-01-03 13:40:47 UTC
Author: decke
Date: Thu Jan  3 13:40:28 2013
New Revision: 309876
URL: http://svnweb.freebsd.org/changeset/ports/309876

Log:
  - Update to 4.2.6
  - Remove custom FreeBSD compiler flags that are only supported by our old
    base GCC 4.2 [1]
  - Fix building with ports GCC 4.6 [1]
  - Fix build on 10-CURRENT after removal of vm_page_lock_queues() in r242941 [2]
  - Improve waits for periods shorter than a single tick [1]
  - Fix dependency check when building with custom KMODDIR [3]
  - Fix recording with OSS Audio backend to record at a proper volume [4]
  - Initialize host-only interfaces at boot time so that other scripts and
    daemons can properly use them [2]
  - Fix build if $ENV not ash-compatible [5]
  - Fix ich9 bios to correctly configure pci bridge1 and pci bridge2 [6]
  - Add VLAN trunking support to vboxnetflt [7]
  
  PR:		ports/171730 [1], ports/167521 [5]
  Submitted by:	Andriy Gapon <avg@FreeBSD.org> [1]
  Submitted by:	Ed Maste <emaste@FreeBSD.org> [2]
  Submitted by:	Kurt Jaeger <fbsd-ports@opsec.eu> [5]
  Submitted by:	Gustau Perez i Querol <gperez@entel.upc.edu> [6]
  Submitted by:	Landon J Fuller <landonf at plausible.coop> [7]
  Reported by:	Daniel Braniss <danny@cs.huji.ac.il> [3]
  Obtained from:	https://www.virtualbox.org/ticket/10695 [4]
  See:		http://article.gmane.org/gmane.os.freebsd.devel.emulation/10438 [6]

Added:
  head/emulators/virtualbox-ose-additions/files/patch-src-VBox-Additions-x11-vboxvideo-Makefile.kmk   (contents, props changed)
  head/emulators/virtualbox-ose-additions/files/patch-src-VBox-Runtime-r0drv-freebsd-the-freebsd-kernel.h   (contents, props changed)
  head/emulators/virtualbox-ose-kmod/files/extrapatch-Config.kmk   (contents, props changed)
  head/emulators/virtualbox-ose-kmod/files/extrapatch-src-VBox-HostDrivers-Support-freebsd-Makefile   (contents, props changed)
  head/emulators/virtualbox-ose-kmod/files/patch-Config.kmk   (contents, props changed)
  head/emulators/virtualbox-ose-kmod/files/patch-src-VBox-Runtime-r0drv-freebsd-sleepqueue-r0drv-freebsd.h   (contents, props changed)
  head/emulators/virtualbox-ose/files/patch-Config.kmk   (contents, props changed)
  head/emulators/virtualbox-ose/files/patch-src-VBox-Devices-Audio-ossaudio.c   (contents, props changed)
  head/emulators/virtualbox-ose/files/patch-src-VBox-Devices-Bus-DevPciIch9.cpp   (contents, props changed)
  head/emulators/virtualbox-ose/files/patch-src-VBox-Main-scr-server-freebsd-PerformanceFreeBSD.cpp   (contents, props changed)
  head/emulators/virtualbox-ose/files/patch-src-VBox-Main-src-server-freebsd-HostHardwareFreeBSD.cpp   (contents, props changed)
  head/emulators/virtualbox-ose/files/patch-src-VBox-Runtime-r0drv-freebsd-memobj-r0drv-freebsd.c   (contents, props changed)
Deleted:
  head/emulators/virtualbox-ose-additions/files/extrapatch-include-iprt-string.h
  head/emulators/virtualbox-ose-additions/files/patch-include-iprt-types.h
  head/emulators/virtualbox-ose-additions/files/patch-src-VBox-Additions-x11-x11include-1.3-xorg-xf86_ansic.h
  head/emulators/virtualbox-ose-additions/files/patch-src-VBox-Additions-x11-x11include-1.4-xorg-xf86_ansic.h
  head/emulators/virtualbox-ose-additions/files/patch-src-VBox-Additions-x11-x11include-7.0-xorg-xf86_ansic.h
  head/emulators/virtualbox-ose-additions/files/patch-src-VBox-Additions-x11-x11include-7.1-xorg-xf86_ansic.h
  head/emulators/virtualbox-ose-kmod/files/patch-include-iprt-types.h
  head/emulators/virtualbox-ose-kmod/files/patch-src-VBox-HostDrivers-Support-freebsd-SUPDrv-freebsd.c
  head/emulators/virtualbox-ose-kmod/files/patch-src-VBox-HostDrivers-VBoxNetAdp-freebsd-Makefile
  head/emulators/virtualbox-ose-kmod/files/patch-src-VBox-HostDrivers-VBoxNetAdp-freebsd-VBoxNetAdp-freebsd.c
  head/emulators/virtualbox-ose-kmod/files/patch-src-VBox-Runtime-r0drv-freebsd-semfastmutex-r0drv-freebsd.c
  head/emulators/virtualbox-ose/files/extrapatch-include-iprt-string.h
  head/emulators/virtualbox-ose/files/patch-include-iprt-types.h
  head/emulators/virtualbox-ose/files/patch-src-VBox-Frontends-VBoxManage-VBoxInternalManage.cpp
  head/emulators/virtualbox-ose/files/patch-src-VBox-HostDrivers-Makefile.kmk
  head/emulators/virtualbox-ose/files/patch-src-VBox-HostServices-auth-pam-VBoxAuthPAM.c
  head/emulators/virtualbox-ose/files/patch-src-VBox-Main-src-server-MachineImpl.cpp
Modified:
  head/emulators/virtualbox-ose-additions/Makefile
  head/emulators/virtualbox-ose-additions/distinfo
  head/emulators/virtualbox-ose-additions/files/patch-src-VBox-Runtime-r0drv-freebsd-memobj-r0drv-freebsd.c   (contents, props changed)
  head/emulators/virtualbox-ose-kmod/Makefile
  head/emulators/virtualbox-ose-kmod/distinfo
  head/emulators/virtualbox-ose-kmod/files/patch-src-VBox-HostDrivers-VBoxNetFlt-freebsd-VBoxNetFlt-freebsd.c   (contents, props changed)
  head/emulators/virtualbox-ose-kmod/files/patch-src-VBox-Runtime-r0drv-freebsd-memobj-r0drv-freebsd.c   (contents, props changed)
  head/emulators/virtualbox-ose-kmod/files/vboxnet.in   (contents, props changed)
  head/emulators/virtualbox-ose/Makefile
  head/emulators/virtualbox-ose/distinfo
  head/emulators/virtualbox-ose/files/patch-configure   (contents, props changed)
  head/emulators/virtualbox-ose/files/patch-src-VBox-Main-src-server-freebsd-NetIf-freebsd.cpp   (contents, props changed)
  head/emulators/virtualbox-ose/pkg-message   (contents, props changed)
  head/emulators/virtualbox-ose/pkg-plist   (contents, props changed)

Modified: head/emulators/virtualbox-ose-additions/Makefile
==============================================================================
--- head/emulators/virtualbox-ose-additions/Makefile	Thu Jan  3 13:37:12 2013	(r309875)
+++ head/emulators/virtualbox-ose-additions/Makefile	Thu Jan  3 13:40:28 2013	(r309876)
@@ -1,12 +1,8 @@
-# New ports collection makefile for:	virtualbox-ose-additions
-# Date created:		2009-09-21
-# Whom:			Bernhard Froehlich <decke@bluelife.at>
-#
+# Created by:	Bernhard Froehlich <decke@bluelife.at>
 # $FreeBSD$
-#
 
 PORTNAME=	virtualbox-ose
-DISTVERSION=	4.1.22
+DISTVERSION=	4.2.6
 CATEGORIES=	emulators kld
 MASTER_SITES=	http://download.virtualbox.org/virtualbox/${DISTVERSION}/ \
 		http://tmp.chruetertee.ch/ \
@@ -22,12 +18,13 @@ LICENSE_FILE=	${WRKSRC}/COPYING
 
 BUILD_DEPENDS=	yasm:${PORTSDIR}/devel/yasm \
 		as86:${PORTSDIR}/devel/dev86 \
-		kmk:${PORTSDIR}/devel/kBuild-devel
+		kmk:${PORTSDIR}/devel/kBuild
 
 UNIQUENAME=	${PORTNAME}${PKGNAMESUFFIX}
 WRKSRC=		${WRKDIR}/VirtualBox-${PORTVERSION}
 USE_RC_SUBR=	vboxguest vboxservice
 ONLY_FOR_ARCHS=	i386 amd64
+FETCH_ARGS=	-pRr
 USE_BZIP2=	yes
 MAKE_JOBS_UNSAFE=	yes
 
@@ -38,7 +35,6 @@ CONFIGURE_ARGS+=--with-gcc="${CC}" --wit
 		--build-headless
 
 CONFLICTS=	bcc-[0-9]*
-CONFLICTS_BUILD=	kBuild-[0-9]*
 CONFLICTS_INSTALL=	virtualbox-ose-additions-devel-[3,4]* virtualbox-ose-[3,4]* virtualbox-ose-devel-[3,4]* virtualbox-ose-legacy-[3,4]*
 
 OPTIONS_DEFINE=	DEBUG X11 OPENGL
@@ -93,10 +89,6 @@ IGNORE=		requires kernel sources
 
 .include <bsd.port.pre.mk>
 
-.if ${OSVERSION} > 900012
-EXTRA_PATCHES=	${FILESDIR}/extrapatch-include-iprt-string.h
-.endif
-
 pre-everything::
 .if ${ARCH} == "amd64"
 .if !exists(/usr/lib32/libc.so)

Modified: head/emulators/virtualbox-ose-additions/distinfo
==============================================================================
--- head/emulators/virtualbox-ose-additions/distinfo	Thu Jan  3 13:37:12 2013	(r309875)
+++ head/emulators/virtualbox-ose-additions/distinfo	Thu Jan  3 13:40:28 2013	(r309876)
@@ -1,2 +1,2 @@
-SHA256 (VirtualBox-4.1.22.tar.bz2) = 7abb506203dd0d69b4b408fd999b5b9a479a9adce5f80e9b5569641c053dd153
-SIZE (VirtualBox-4.1.22.tar.bz2) = 73385514
+SHA256 (VirtualBox-4.2.6.tar.bz2) = 54526091bc2aa66b88ca878dd9ecc4466f96d607db2f6678a9d673ecf6646ae3
+SIZE (VirtualBox-4.2.6.tar.bz2) = 76291326

Added: head/emulators/virtualbox-ose-additions/files/patch-src-VBox-Additions-x11-vboxvideo-Makefile.kmk
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/emulators/virtualbox-ose-additions/files/patch-src-VBox-Additions-x11-vboxvideo-Makefile.kmk	Thu Jan  3 13:40:28 2013	(r309876)
@@ -0,0 +1,20 @@
+--- src/VBox/Additions/x11/vboxvideo/Makefile.kmk.orig	2012-10-26 18:23:35.000000000 +0200
++++ src/VBox/Additions/x11/vboxvideo/Makefile.kmk	2012-10-28 16:54:59.074303788 +0100
+@@ -196,7 +196,7 @@
+ vboxvideo_drv_15_TEMPLATE = VBOXGUESTR3XORGMOD
+ vboxvideo_drv_15_CFLAGS := $(vboxvideo_drv_70_CFLAGS)
+ vboxvideo_drv_15_DEFS := $(vboxvideo_15_DEFS) XORG_VERSION_CURRENT=100503000
+-if1of ($(KBUILD_TARGET), linux solaris)
++if1of ($(KBUILD_TARGET), freebsd linux solaris)
+  vboxvideo_drv_15_DEFS += VBOX_DRI
+ endif
+ vboxvideo_drv_15_INCS = \
+@@ -204,7 +204,7 @@
+ 	$(VBOX_PATH_X11_ROOT)/xorg-server-1.5.3
+ vboxvideo_drv_15_INCS += $(PATH_ROOT)/src/VBox/Runtime/include
+ vboxvideo_drv_15_SOURCES  = $(vboxvideo_drv_13_SOURCES)
+-if1of ($(KBUILD_TARGET), linux solaris)
++if1of ($(KBUILD_TARGET), freebsd linux solaris)
+  vboxvideo_drv_15_SOURCES += \
+ 	vboxvideo_dri.c
+ endif

Modified: head/emulators/virtualbox-ose-additions/files/patch-src-VBox-Runtime-r0drv-freebsd-memobj-r0drv-freebsd.c
==============================================================================
--- head/emulators/virtualbox-ose-additions/files/patch-src-VBox-Runtime-r0drv-freebsd-memobj-r0drv-freebsd.c	Thu Jan  3 13:37:12 2013	(r309875)
+++ head/emulators/virtualbox-ose-additions/files/patch-src-VBox-Runtime-r0drv-freebsd-memobj-r0drv-freebsd.c	Thu Jan  3 13:40:28 2013	(r309876)
@@ -1,25 +1,56 @@
-Remove explicit initialization of m->flags and m->oflags because per
-default vm_phys_alloc_contig() already initializes the page as unmanaged.
-Chase move of PG_UNMANAGED flag from m->flags to m->oflags and renaming
-to VPO_UNMANAGED for an additional assert.
+From Alan L. Cox on FreeBSD-current:
 
-Reviewed by:	kib
-See:		http://svnweb.freebsd.org/base?view=revision&revision=224746
---- src/VBox/Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c.orig	2011-04-05 14:34:09.000000000 +0200
-+++ src/VBox/Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c	2011-08-11 15:06:46.000000000 +0200
-@@ -394,9 +394,13 @@
-     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);
-+
-+#if __FreeBSD_version >= 900040
-+    Assert(pPage->oflags & VPO_UNMANAGED != 0);
-+#else
-+    Assert(pPage->flags & PG_UNMANAGED != 0);
+    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();
++#endif
+             for (vm_page_t pPage = vm_page_find_least(pMemFreeBSD->pObject, 0);
+                  pPage != NULL;
+                  pPage = vm_page_next(pPage))
+             {
+                 vm_page_unwire(pPage, 0);
+             }
++#if __FreeBSD_version < 900000
+             vm_page_unlock_queues();
 +#endif
- }
- 
- 
+             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)
+             {
+                 pPage = vm_page_lookup(pObject, iPage);
++#if __FreeBSD_version < 900000
+                 vm_page_lock_queues();
++#endif
+                 if (fWire)
+                     vm_page_unwire(pPage, 0);
+                 vm_page_free(pPage);
++#if __FreeBSD_version < 900000
+                 vm_page_unlock_queues();
++#endif
+             }
+             VM_OBJECT_UNLOCK(pObject);
+             return rcNoMem;
+-- 
+1.7.11.5
+

Added: head/emulators/virtualbox-ose-additions/files/patch-src-VBox-Runtime-r0drv-freebsd-the-freebsd-kernel.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/emulators/virtualbox-ose-additions/files/patch-src-VBox-Runtime-r0drv-freebsd-the-freebsd-kernel.h	Thu Jan  3 13:40:28 2013	(r309876)
@@ -0,0 +1,10 @@
+--- ./src/VBox/Runtime/r0drv/freebsd/the-freebsd-kernel.h.orig	2012-06-12 02:54:01.440878507 +0400
++++ ./src/VBox/Runtime/r0drv/freebsd/the-freebsd-kernel.h	2012-06-12 00:08:55.218232972 +0400
+@@ -64,6 +64,7 @@
+ #include <vm/vm_kern.h>
+ #include <vm/vm_param.h>        /* KERN_SUCCESS ++ */
+ #include <vm/vm_page.h>
++#include <vm/vm_pageout.h>
+ #include <vm/vm_phys.h>         /* vm_phys_alloc_* */
+ #include <vm/vm_extern.h>       /* kmem_alloc_attr */
+ #include <sys/vmmeter.h>        /* cnt */

Modified: head/emulators/virtualbox-ose-kmod/Makefile
==============================================================================
--- head/emulators/virtualbox-ose-kmod/Makefile	Thu Jan  3 13:37:12 2013	(r309875)
+++ head/emulators/virtualbox-ose-kmod/Makefile	Thu Jan  3 13:40:28 2013	(r309876)
@@ -1,12 +1,8 @@
-# New ports collection makefile for:	virtualbox-ose-kmod
-# Date created:		2009-09-21
-# Whom:			Bernhard Froehlich <decke@bluelife.at>
-#
+# Created by:	Bernhard Froehlich <decke@bluelife.at>
 # $FreeBSD$
-#
 
 PORTNAME=	virtualbox-ose
-DISTVERSION=	4.1.22
+DISTVERSION=	4.2.6
 CATEGORIES=	emulators kld
 MASTER_SITES=	http://download.virtualbox.org/virtualbox/${DISTVERSION}/ \
 		http://tmp.chruetertee.ch/ \
@@ -22,12 +18,13 @@ LICENSE_FILE=	${WRKSRC}/COPYING
 
 BUILD_DEPENDS=	yasm:${PORTSDIR}/devel/yasm \
 		as86:${PORTSDIR}/devel/dev86 \
-		kmk:${PORTSDIR}/devel/kBuild-devel
+		kmk:${PORTSDIR}/devel/kBuild
 
 UNIQUENAME=	${PORTNAME}${PKGNAMESUFFIX}
 WRKSRC=		${WRKDIR}/VirtualBox-${PORTVERSION}
 USE_RC_SUBR=	vboxnet
 ONLY_FOR_ARCHS=	i386 amd64
+FETCH_ARGS=	-pRr
 USE_BZIP2=	yes
 
 HAS_CONFIGURE=	yes
@@ -37,30 +34,31 @@ CONFIGURE_ARGS+=--with-gcc="${CC}" --wit
 		--build-headless
 
 CONFLICTS=	bcc-[0-9]*
-CONFLICTS_BUILD=	kBuild-[0-9]*
 CONFLICTS_INSTALL=	virtualbox-ose-kmod-devel-[3,4]* virtualbox-ose-kmod-legacy-[3,4]*
 
 OPTIONS_DEFINE=	DEBUG VIMAGE
+DEBUG_DESC=	Debug symbols, additional logs and assertions
 VIMAGE_DESC=	VIMAGE virtual networking support
 
 .include <bsd.port.options.mk>
 
 PLIST_SUB+=	KMODDIR=${KMODDIR:C,^/,,}
 
-KMODDIR=	/boot/modules
+KMODDIR?=	/boot/modules
 SRC_BASE?=	/usr/src
 
 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

Modified: head/emulators/virtualbox-ose-kmod/distinfo
==============================================================================
--- head/emulators/virtualbox-ose-kmod/distinfo	Thu Jan  3 13:37:12 2013	(r309875)
+++ head/emulators/virtualbox-ose-kmod/distinfo	Thu Jan  3 13:40:28 2013	(r309876)
@@ -1,2 +1,2 @@
-SHA256 (VirtualBox-4.1.22.tar.bz2) = 7abb506203dd0d69b4b408fd999b5b9a479a9adce5f80e9b5569641c053dd153
-SIZE (VirtualBox-4.1.22.tar.bz2) = 73385514
+SHA256 (VirtualBox-4.2.6.tar.bz2) = 54526091bc2aa66b88ca878dd9ecc4466f96d607db2f6678a9d673ecf6646ae3
+SIZE (VirtualBox-4.2.6.tar.bz2) = 76291326

Added: head/emulators/virtualbox-ose-kmod/files/extrapatch-Config.kmk
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/emulators/virtualbox-ose-kmod/files/extrapatch-Config.kmk	Thu Jan  3 13:40:28 2013	(r309876)
@@ -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/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/files/extrapatch-src-VBox-HostDrivers-Support-freebsd-Makefile	Thu Jan  3 13:40:28 2013	(r309876)
@@ -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/files/patch-Config.kmk
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/emulators/virtualbox-ose-kmod/files/patch-Config.kmk	Thu Jan  3 13:40:28 2013	(r309876)
@@ -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

Modified: head/emulators/virtualbox-ose-kmod/files/patch-src-VBox-HostDrivers-VBoxNetFlt-freebsd-VBoxNetFlt-freebsd.c
==============================================================================
--- head/emulators/virtualbox-ose-kmod/files/patch-src-VBox-HostDrivers-VBoxNetFlt-freebsd-VBoxNetFlt-freebsd.c	Thu Jan  3 13:37:12 2013	(r309875)
+++ head/emulators/virtualbox-ose-kmod/files/patch-src-VBox-HostDrivers-VBoxNetFlt-freebsd-VBoxNetFlt-freebsd.c	Thu Jan  3 13:40:28 2013	(r309876)
@@ -1,31 +1,23 @@
-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
+Submitted by:	Landon J Fuller <landonf at plausible.coop>
+--- src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c.orig	2012-04-12 17:27:56.035382846 -0400
++++ src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c	2012-04-12 17:30:13.038601065 -0400
+@@ -439,6 +439,16 @@
+         if (m == NULL)
+             break;
  
-     if (ifp0 != NULL)
-     {
-         vboxNetFltOsDeleteInstance(pThis);
-         vboxNetFltOsInitInstance(pThis, NULL);
-     }
--    VBOXCURVNET_RESTORE();
- 
-     return !ASMAtomicUoReadBool(&pThis->fDisconnectedFromHost);
- }
-@@ -671,8 +671,10 @@ void vboxNetFltOsDeleteInstance(PVBOXNET
-     mtx_destroy(&pThis->u.s.inq.ifq_mtx);
-     mtx_destroy(&pThis->u.s.outq.ifq_mtx);
- 
-+    VBOXCURVNET_SET_FROM_UCRED();
-     if (pThis->u.s.node != NULL)
-         ng_rmnode_self(pThis->u.s.node);
-+    VBOXCURVNET_RESTORE();
-     pThis->u.s.node = NULL;
- }
++        /* Preprend a VLAN header for consumption by the virtual switch */
++        if (m->m_flags & M_VLANTAG) {
++            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++;

Modified: head/emulators/virtualbox-ose-kmod/files/patch-src-VBox-Runtime-r0drv-freebsd-memobj-r0drv-freebsd.c
==============================================================================
--- head/emulators/virtualbox-ose-kmod/files/patch-src-VBox-Runtime-r0drv-freebsd-memobj-r0drv-freebsd.c	Thu Jan  3 13:37:12 2013	(r309875)
+++ head/emulators/virtualbox-ose-kmod/files/patch-src-VBox-Runtime-r0drv-freebsd-memobj-r0drv-freebsd.c	Thu Jan  3 13:40:28 2013	(r309876)
@@ -1,888 +1,56 @@
---- src/VBox/Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c.orig	2012-06-20 15:18:10.000000000 +0200
-+++ src/VBox/Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c	2012-07-25 18:04:01.534886951 +0200
-@@ -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,21 @@
-         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++)
-+            for (vm_page_t pPage = vm_page_find_least(pMemFreeBSD->pObject, 0);
-+                 pPage != NULL;
-+                 pPage = vm_page_next(pPage))
++#endif
+             for (vm_page_t pPage = vm_page_find_least(pMemFreeBSD->pObject, 0);
+                  pPage != NULL;
+                  pPage = vm_page_next(pPage))
              {
--                vm_page_t pPage = pMemFreeBSD->u.Phys.apPages[iPage];
                  vm_page_unwire(pPage, 0);
--                vm_page_free(pPage);
              }
++#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 +189,183 @@
- }
- 
- 
--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);
-+                vm_page_lock_queues();
-+                if (fWire)
+                 pPage = vm_page_lookup(pObject, iPage);
++#if __FreeBSD_version < 900000
+                 vm_page_lock_queues();
++#endif
+                 if (fWire)
                      vm_page_unwire(pPage, 0);
--                    vm_page_free(pPage);
--                    vm_page_unlock_queues();
--                }
--                rc = VERR_NO_MEMORY;
--                break;
-+                vm_page_free(pPage);
-+                vm_page_unlock_queues();
-             }
--
--            pPage->valid = VM_PAGE_BITS_ALL;
--            pMemFreeBSD->u.Phys.apPages[iPage] = pPage;
-+            VM_OBJECT_UNLOCK(pObject);
-+            return VERR_NO_MEMORY;
-         }
-+    }
-+    return VINF_SUCCESS;
-+}
- 
--        if (rc == VINF_SUCCESS)
--        {
--            vm_offset_t AddressDst = MapAddress;
-+static int FreeBSDAllocHelper(PRTR0MEMOBJFREEBSD pMemFreeBSD, bool fExecutable,
-+                              vm_paddr_t VmPhysAddrHigh, bool fContiguous)
-+{
-+    int rc;
-+    size_t cPages = atop(pMemFreeBSD->Core.cb);
- 
--            for (size_t iPage = 0; iPage < cPages; iPage++)
--            {
--                vm_page_t pPage = pMemFreeBSD->u.Phys.apPages[iPage];
-+    pMemFreeBSD->pObject = vm_object_allocate(OBJT_PHYS, cPages);
-+    vm_offset_t MapAddress = vm_map_min(kernel_map);
- 
--                MY_PMAP_ENTER(kernel_map->pmap, AddressDst, pPage,
--                              fExecutable
--                              ? VM_PROT_ALL
--                              : VM_PROT_RW,
--                              TRUE);
-+    // no additional object reference for auto-deallocation upon unmapping
-+    rc = vm_map_find(kernel_map, pMemFreeBSD->pObject, 0,
-+                     &MapAddress, pMemFreeBSD->Core.cb, VMFS_ANY_SPACE,
-+                     fExecutable ? VM_PROT_ALL : VM_PROT_RW, VM_PROT_ALL, 0);
- 
--                AddressDst += PAGE_SIZE;
--            }
-+    if (rc == KERN_SUCCESS)
-+    {
-+        rc = FreeBSDPhysAllocHelper(pMemFreeBSD->pObject, cPages, VmPhysAddrHigh, PAGE_SIZE, fContiguous, false);
-+        if (RT_SUCCESS(rc))
-+        {
-+            vm_map_wire(kernel_map, MapAddress, MapAddress + pMemFreeBSD->Core.cb, VM_MAP_WIRE_SYSTEM|VM_MAP_WIRE_NOHOLES);
- 
-             /* Store start address */
-             pMemFreeBSD->Core.pv = (void *)MapAddress;
--            *ppMem = &pMemFreeBSD->Core;
-             return VINF_SUCCESS;
-         }
--    }
--    rc = VERR_NO_MEMORY; /** @todo fix translation (borrow from darwin) */
- 
--    rtR0MemObjDelete(&pMemFreeBSD->Core);
-+        vm_map_remove(kernel_map, MapAddress, MapAddress + pMemFreeBSD->Core.cb);
-+    }
-+    else
-+    {
-+        rc = VERR_NO_MEMORY; /** @todo fix translation (borrow from darwin) */
-+        vm_object_deallocate(pMemFreeBSD->pObject);
-+    }
-     return rc;
- }
- 
--
--DECLHIDDEN(int) rtR0MemObjNativeAllocLow(PPRTR0MEMOBJINTERNAL ppMem, size_t cb, bool fExecutable)
-+DECLHIDDEN(int) rtR0MemObjNativeAllocPage(PPRTR0MEMOBJINTERNAL ppMem, size_t cb, bool fExecutable)
- {
--#ifdef USE_KMEM_ALLOC_ATTR
--    /*
--     * Use kmem_alloc_attr, fExectuable is not needed because the
--     * memory will be executable by default
--     */
--    NOREF(fExecutable);
--
--    /* create the object. */
--    PRTR0MEMOBJFREEBSD pMemFreeBSD = (PRTR0MEMOBJFREEBSD)rtR0MemObjNew(sizeof(*pMemFreeBSD), RTR0MEMOBJTYPE_LOW, NULL, cb);
-+    PRTR0MEMOBJFREEBSD pMemFreeBSD = (PRTR0MEMOBJFREEBSD)rtR0MemObjNew(sizeof(*pMemFreeBSD),
-+                                                                       RTR0MEMOBJTYPE_PAGE, NULL, cb);
-     if (!pMemFreeBSD)
-         return VERR_NO_MEMORY;
- 
--    pMemFreeBSD->Core.pv = (void *)kmem_alloc_attr(kernel_map,          /* Kernel */
--                                                   cb,                  /* Amount */
--                                                   M_ZERO,              /* Zero memory */
--                                                   0,                   /* Low physical address */
--                                                   _4G - PAGE_SIZE,     /* Highest physical address */
--                                                   VM_MEMATTR_DEFAULT); /* Default memory attributes */
--    if (!pMemFreeBSD->Core.pv)
--        return VERR_NO_MEMORY;
--
--    *ppMem = &pMemFreeBSD->Core;
--
--    return VINF_SUCCESS;
--#else
--    /*
--     * Try a Alloc first and see if we get luck, if not try contigmalloc.
--     * Might wish to try find our own pages or something later if this
--     * turns into a problemspot on AMD64 boxes.
--     */
--    int rc = rtR0MemObjNativeAllocPage(ppMem, cb, fExecutable);
--    if (RT_SUCCESS(rc))
-+    int rc = FreeBSDAllocHelper(pMemFreeBSD, fExecutable, ~(vm_paddr_t)0, false);
-+    if (RT_FAILURE(rc))
-     {
--        size_t iPage = cb >> PAGE_SHIFT;
--        while (iPage-- > 0)
--            if (rtR0MemObjNativeGetPagePhysAddr(*ppMem, iPage) > (_4G - PAGE_SIZE))
--            {
--                RTR0MemObjFree(*ppMem, false);
--                *ppMem = NULL;
--                rc = VERR_NO_MEMORY;
--                break;
--            }
-+        rtR0MemObjDelete(&pMemFreeBSD->Core);
-+        return rc;
-     }
--    if (RT_FAILURE(rc))
--        rc = rtR0MemObjNativeAllocCont(ppMem, cb, fExecutable);
-+
-+    *ppMem = &pMemFreeBSD->Core;
-     return rc;
--#endif
- }
- 
- 
--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 +374,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 +416,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 +532,41 @@
-     if (!pMemFreeBSD)
-         return VERR_NO_MEMORY;
- 
--    /*
--     * Allocate an empty VM object and map it into the requested map.
--     */

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
_______________________________________________
svn-ports-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-ports-all
To unsubscribe, send any mail to "svn-ports-all-unsubscribe@freebsd.org"
Comment 8 Bernhard Froehlich freebsd_committer freebsd_triage 2013-01-03 13:46:34 UTC
State Changed
From-To: feedback->closed

Patch to support GCC 4.6+ has been committed now.