- 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.
This commit is contained in:
Bernhard Froehlich 2013-12-13 11:17:19 +00:00
parent 91e3a74739
commit a60eaff53f
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=336332
45 changed files with 826 additions and 1590 deletions

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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.

View file

@ -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)

View file

@ -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

View file

@ -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();
}

View file

@ -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

View file

@ -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,

View file

@ -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:
From Alan L. Cox on FreeBSD-current:
I just glanced at the virtualbox code for a couple minutes. For
FreeBSD 9 and 10, these lock acquires are completely unnecessary, and
have been since FreeBSD 9.0. Just delete them. They may be equally
unnecessary under FreeBSD 8, but I didn't look carefully enough to
answer that question.
[1] http://lists.freebsd.org/pipermail/freebsd-current/2012-November/037963.html
---
src/VBox/Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/src/VBox/Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c b/src/VBox/Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c
index 5c90cf3..1176b51 100644
--- src/VBox/Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c
+++ src/VBox/Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c
@@ -164,14 +164,19 @@ DECLHIDDEN(int) rtR0MemObjNativeFree(RTR0MEMOBJ pMem)
{
rc = vm_map_remove(kernel_map,
(vm_offset_t)pMemFreeBSD->Core.pv,
(vm_offset_t)pMemFreeBSD->Core.pv + pMemFreeBSD->Core.cb);
AssertMsg(rc == KERN_SUCCESS, ("%#x", rc));
-
- vm_page_lock_queues();
- for (uint32_t iPage = 0; iPage < pMemFreeBSD->u.Phys.cPages; iPage++)
- {
- vm_page_t pPage = pMemFreeBSD->u.Phys.apPages[iPage];
- vm_page_unwire(pPage, 0);
- vm_page_free(pPage);
- }
- vm_page_unlock_queues();
break;
}
@@ -165,8 +140,8 @@
case RTR0MEMOBJTYPE_RES_VIRT:
{
vm_map_t pMap = kernel_map;
- if (pMemFreeBSD->Core.u.Lock.R0Process != NIL_RTR0PROCESS)
- pMap = &((struct proc *)pMemFreeBSD->Core.u.Lock.R0Process)->p_vmspace->vm_map;
+ if (pMemFreeBSD->Core.u.ResVirt.R0Process != NIL_RTR0PROCESS)
+ pMap = &((struct proc *)pMemFreeBSD->Core.u.ResVirt.R0Process)->p_vmspace->vm_map;
rc = vm_map_remove(pMap,
(vm_offset_t)pMemFreeBSD->Core.pv,
(vm_offset_t)pMemFreeBSD->Core.pv + pMemFreeBSD->Core.cb);
@@ -180,7 +155,6 @@
if (pMemFreeBSD->Core.u.Mapping.R0Process != NIL_RTR0PROCESS)
pMap = &((struct proc *)pMemFreeBSD->Core.u.Mapping.R0Process)->p_vmspace->vm_map;
-
rc = vm_map_remove(pMap,
(vm_offset_t)pMemFreeBSD->Core.pv,
(vm_offset_t)pMemFreeBSD->Core.pv + pMemFreeBSD->Core.cb);
@@ -191,26 +165,24 @@
case RTR0MEMOBJTYPE_PHYS:
case RTR0MEMOBJTYPE_PHYS_NC:
{
+ VM_OBJECT_LOCK(pMemFreeBSD->pObject);
+ vm_page_t pPage = vm_page_find_least(pMemFreeBSD->pObject, 0);
VM_OBJECT_LOCK(pMemFreeBSD->pObject);
vm_page_t pPage = vm_page_find_least(pMemFreeBSD->pObject, 0);
+#if __FreeBSD_version < 900000
+ /* See http://lists.freebsd.org/pipermail/freebsd-current/2012-November/037963.html */
vm_page_lock_queues();
- for (uint32_t iPage = 0; iPage < pMemFreeBSD->u.Phys.cPages; iPage++)
+#endif
+ for (vm_page_t pPage = vm_page_find_least(pMemFreeBSD->pObject, 0);
+ pPage != NULL;
+ pPage = vm_page_next(pPage))
for (vm_page_t pPage = vm_page_find_least(pMemFreeBSD->pObject, 0);
pPage != NULL;
pPage = vm_page_next(pPage))
{
- vm_page_t pPage = pMemFreeBSD->u.Phys.apPages[iPage];
vm_page_unwire(pPage, 0);
- vm_page_free(pPage);
}
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)
{
- /*
- * Out of pages
- * Remove already allocated pages
- */
- while (iPage-- > 0)
- {
- pPage = pMemFreeBSD->u.Phys.apPages[iPage];
- vm_page_lock_queues();
+ pPage = vm_page_lookup(pObject, iPage);
+#if __FreeBSD_version < 900000
+ vm_page_lock_queues();
vm_page_unlock_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 +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)
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)
{
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);
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
}
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

View file

@ -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 */

View file

@ -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;

View file

@ -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;

View file

@ -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

View file

@ -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>

View file

@ -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()

View file

@ -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/

View file

@ -2,8 +2,7 @@
# $FreeBSD$
PORTNAME= virtualbox-ose
DISTVERSION= 4.1.24
PORTREVISION= 1
DISTVERSION= 4.2.20
CATEGORIES= emulators
MASTER_SITES= http://download.virtualbox.org/virtualbox/${DISTVERSION}/ \
http://tmp.chruetertee.ch/ \
@ -13,7 +12,6 @@ PKGNAMESUFFIX= -legacy
DISTFILES= VirtualBox-${DISTVERSION}${EXTRACT_SUFX} ${GADISTFILES}
EXTRACT_ONLY= VirtualBox-${DISTVERSION}${EXTRACT_SUFX}
#for discussion please use emulation@FreeBSD.org
MAINTAINER= vbox@FreeBSD.org
COMMENT= A general-purpose full virtualizer for x86 hardware
@ -26,10 +24,10 @@ BUILD_DEPENDS= yasm:${PORTSDIR}/devel/yasm \
kmk:${PORTSDIR}/devel/kBuild \
gtar:${PORTSDIR}/archivers/gtar \
cdrecord:${PORTSDIR}/sysutils/cdrtools
LIB_DEPENDS= png15:${PORTSDIR}/graphics/png \
xslt.2:${PORTSDIR}/textproc/libxslt \
curl:${PORTSDIR}/ftp/curl
RUN_DEPENDS= /boot/modules/vboxdrv.ko:${PORTSDIR}/emulators/virtualbox-ose-kmod-legacy \
LIB_DEPENDS= libpng.so:${PORTSDIR}/graphics/png \
libxslt.so:${PORTSDIR}/textproc/libxslt \
libcurl.so:${PORTSDIR}/ftp/curl
RUN_DEPENDS= ${KMODDIR}/vboxdrv.ko:${PORTSDIR}/emulators/virtualbox-ose-kmod-legacy \
cdrecord:${PORTSDIR}/sysutils/cdrtools
WRKSRC= ${WRKDIR}/VirtualBox-${PORTVERSION}
@ -50,18 +48,20 @@ CONFIGURE_ARGS+=--with-gcc="${CC}" --with-g++="${CXX}" --passive-mesa
USE_LDCONFIG= ${PREFIX}/lib/virtualbox
CONFLICTS= bcc-[0-9]*
CONFLICTS_INSTALL= virtualbox-ose-[3,4]* virtualbox-ose-devel-[3,4]* virtualbox-ose-additions-[3,4]* virtualbox-ose-additions-devel-[3,4]*
CONFLICTS_INSTALL= virtualbox-ose-4* virtualbox-ose-devel-4* virtualbox-ose-additions-4* virtualbox-ose-additions-devel-4*
VBOXUSER?= vboxusers
VBOXWSUSER?= vboxusers
VBOXGROUP?= vboxusers
USERS= ${VBOXUSER}
GROUPS= ${VBOXGROUP}
VBOX_FRONTENDS= VBoxHeadless
VBOX_FRONTENDS= VBoxAutostart VBoxHeadless
VBOX_GUEST_VER= ${PORTVERSION}
OPTIONS_DEFINE= QT4 DEBUG GUESTADDITIONS DBUS PULSEAUDIO UDPTUNNEL VDE VNC WEBSERVICE NLS X11
OPTIONS_DEFAULT= QT4 DBUS X11 UDPTUNNEL
OPTIONS_DEFAULT= QT4 DBUS X11 UDPTUNNEL VNC
OPTIONS_SUB= X11 QT4 GUESTADDITIONS VNC NLS WEBSERVICE
DEBUG_DESC= Debug symbols, additional logs and assertions
QT4_DESC= Build with QT4 Frontend
GUESTADDITIONS_DESC= Build with Guest Additions
UDPTUNNEL_DESC= Build with UDP tunnel support
@ -69,19 +69,42 @@ VDE_DESC= Build with VDE support
VNC_DESC= Build with VNC support
WEBSERVICE_DESC= Build Webservice
PULSEAUDIO_LIB_DEPENDS= libpulse.so:${PORTSDIR}/audio/pulseaudio
PULSEAUDIO_CONFIGURE_OFF= --disable-pulse
DBUS_LIB_DEPENDS= libdbus-1.so:${PORTSDIR}/devel/dbus
DBUS_CONFIGURE_OFF= --disable-dbus
VNC_LIB_DEPENDS= libvncserver.so:${PORTSDIR}/net/libvncserver
VNC_CONFIGURE_ON= --enable-vnc
VDE_RUN_DEPENDS= vde_switch:${PORTSDIR}/net/vde2
VDE_CONFIGURE_ON= --enable-vde
# bmake doesn't know about unsetenv=true
.if defined(.PARSEDIR)
ENV=
.export ENV
.else
.SHELL: path="/bin/sh" unsetenv=true
.endif
NO_STAGE= yes
.include <bsd.port.options.mk>
KMODDIR= /boot/modules
PLIST_SUB+= PYTHON_VER=${PYTHON_VER} \
PYTHON_VERU=${PYTHON_VER:S/./_/} \
GUEST_VER=${VBOX_GUEST_VER}
SUB_LIST+= VBOXUSER=${VBOXUSER}
USE_RC_SUBR+= vboxheadless
SUB_LIST+= VBOXUSER=${VBOXUSER} \
VBOXWSUSER=${VBOXWSUSER}
USE_RC_SUBR+= vboxheadless vboxwatchdog
KMK_BUILDTYPE= release
KMK_CONFIG= VBOX_LIBPATH_X11=${LOCALBASE} VBOX_FREEBSD_SRC=${SRC_BASE}/sys
KMK_FLAGS=
KMK_FLAGS= -j 1
.if empty(PORT_OPTIONS:MQT4) && !empty(PORT_OPTIONS:MNLS)
BROKEN= NLS support requires QT4 frontend. Run 'make config' again!
@ -95,10 +118,8 @@ BROKEN= QT4 frontend requires X11 support. Run 'make config' again!
USE_SDL= sdl
USE_XORG= xcursor xmu inputproto xinerama
VBOX_FRONTENDS+=VBoxBFE VBoxSDL
PLIST_SUB+= X11=""
.else
CONFIGURE_ARGS+=--build-headless
PLIST_SUB+= X11="@comment "
.endif
.if ${PORT_OPTIONS:MQT4}
@ -106,10 +127,8 @@ QT_NONSTANDARD= yes
USE_QT4= gui network moc_build uic_build rcc_build linguist
INSTALLS_ICONS= yes
VBOX_FRONTENDS+=VirtualBox VBoxTestOGL
PLIST_SUB+= QT4=""
.else
CONFIGURE_ARGS+=--disable-qt4
PLIST_SUB+= QT4="@comment "
.endif
.if ${PORT_OPTIONS:MGUESTADDITIONS}
@ -117,51 +136,17 @@ GUESTADDITIONS= VBoxGuestAdditions_${VBOX_GUEST_VER}.iso
GADISTFILES= ${GUESTADDITIONS}:guestadditions
RESTRICTED= for personal use only
RESTRICTED_FILES= ${GUESTADDITIONS}
PLIST_SUB+= GUESTADDITIONS=""
.else
PLIST_SUB+= GUESTADDITIONS="@comment "
.endif
.if ${PORT_OPTIONS:MDEBUG}
KMK_FLAGS+= BUILD_TYPE=debug
KMK_BUILDTYPE= debug
.endif
.if ${PORT_OPTIONS:MDBUS}
LIB_DEPENDS+= dbus-1.3:${PORTSDIR}/devel/dbus
.else
CONFIGURE_ARGS+=--disable-dbus
.endif
.if ${PORT_OPTIONS:MPULSEAUDIO}
LIB_DEPENDS+= pulse.0:${PORTSDIR}/audio/pulseaudio
.else
CONFIGURE_ARGS+=--disable-pulse
.endif
.if ${PORT_OPTIONS:MVNC}
LIB_DEPENDS+= vncserver.0:${PORTSDIR}/net/libvncserver
.endif
.if ${PORT_OPTIONS:MNLS}
PLIST_SUB+= NLS=""
.else
PLIST_SUB+= NLS="@comment "
.endif
.if ${PORT_OPTIONS:MVDE}
RUN_DEPENDS+= vde_switch:${PORTSDIR}/net/vde2
CONFIGURE_ARGS+=--enable-vde
KMK_FLAGS+= BUILD_TYPE=debug
.endif
.if ${PORT_OPTIONS:MWEBSERVICE}
BUILD_DEPENDS+= soapcpp2:${PORTSDIR}/devel/gsoap
VBOX_WEB= vboxwebsrv webtest
USE_RC_SUBR+= vboxwebsrv
SUB_LIST+= VBOXWSUSER=${VBOXWSUSER}
PLIST_SUB+= WEB=""
.else
PLIST_SUB+= WEB="@comment "
.endif
.if ${ARCH} == i386
@ -172,16 +157,10 @@ KMK_ARCH= freebsd.${ARCH}
PLIST_SUB+= I386="@comment "
.endif
PLIST_SUB+= ARCH="${KMK_ARCH}"
.include <bsd.port.pre.mk>
.if ${OSVERSION} < 802000
BROKEN= Does not compile on FreeBSD < 8.2
.endif
.if ${OSVERSION} > 900012
EXTRA_PATCHES+= ${FILESDIR}/extrapatch-include-iprt-string.h
.endif
.if ${OSVERSION} < 900000 && ${OSVERSION} > 801500
EXTRA_PATCHES+= ${FILESDIR}/extrapatch-src-VBox-Devices-PC-vbox.dsl
.endif
@ -198,7 +177,7 @@ pre-everything::
post-patch:
@${ECHO} 'VBOX_PATH_APP_PRIVATE_ARCH = ${PREFIX}/lib/virtualbox' > ${WRKSRC}/LocalConfig.kmk
@${ECHO} 'VBOX_PATH_SHARED_LIBS = ${PREFIX}/lib/virtualbox' >> ${WRKSRC}/LocalConfig.kmk
@${ECHO} 'VBOX_WITH_RUNPATH = ${PREFIX}/lib/virtualbox' >> ${WRKSRC}/LocalConfig.kmk
@var=${_GCC_RUNTIME}; ${ECHO} "VBOX_WITH_RUNPATH = $${var:+$${var}:}${PREFIX}/lib/virtualbox" >> ${WRKSRC}/LocalConfig.kmk
@${ECHO} 'VBOX_PATH_APP_PRIVATE = ${DATADIR}' >> ${WRKSRC}/LocalConfig.kmk
@${ECHO} 'VBOX_PATH_APP_DOCS = ${DOCSDIR}' >> ${WRKSRC}/LocalConfig.kmk
@${ECHO} 'VBOX_WITH_INSTALLER = 1' >> ${WRKSRC}/LocalConfig.kmk
@ -212,10 +191,7 @@ post-patch:
@${ECHO} 'VBOX_WITH_ADDITIONS=' >> ${WRKSRC}/LocalConfig.kmk
@${ECHO} 'VBOX_WITH_X11_ADDITIONS=' >> ${WRKSRC}/LocalConfig.kmk
.if ${PORT_OPTIONS:MVNC}
@${ECHO} 'VBOX_WITH_VNC = 1' >> ${WRKSRC}/LocalConfig.kmk
.endif
.if ${OSVERSION} < 800069
@${ECHO} 'VBOX_WITH_USB=' >> ${WRKSRC}/LocalConfig.kmk
@${ECHO} 'VBOX_WITH_EXTPACK_VNC = 1' >> ${WRKSRC}/LocalConfig.kmk
.endif
.if ${PORT_OPTIONS:MUDPTUNNEL}
@${ECHO} 'VBOX_WITH_UDPTUNNEL = 1' >> ${WRKSRC}/LocalConfig.kmk
@ -274,8 +250,13 @@ do-install:
${CHMOD} 0711 ${PREFIX}/lib/virtualbox/${f}
.endfor
.if ${PORT_OPTIONS:MVNC}
${MKDIR} ${PREFIX}/lib/virtualbox/ExtensionPacks
${CP} -a ${WRKSRC}/out/${KMK_ARCH}/${KMK_BUILDTYPE}/bin/ExtensionPacks/VNC ${PREFIX}/lib/virtualbox/ExtensionPacks
.endif
.if ${PORT_OPTIONS:MWEBSERVICE}
${MKDIR} -p ${DATADIR}/sdk/bindings/webservice
${MKDIR} ${DATADIR}/sdk/bindings/webservice
.for f in vboxweb.wsdl vboxwebService.wsdl
${INSTALL_DATA} ${WRKSRC}/out/${KMK_ARCH}/${KMK_BUILDTYPE}/bin/sdk/bindings/webservice/${f} ${DATADIR}/sdk/bindings/webservice/
.endfor
@ -304,7 +285,9 @@ post-install:
@${FIND} ${PREFIX}/lib/virtualbox -type d -print0 | ${XARGS} -0 ${CHMOD} 755
.if ${PORT_OPTIONS:MQT4}
${MKDIR} ${PREFIX}/share/pixmaps/
${INSTALL_DATA} ${WRKSRC}/src/VBox/Frontends/VirtualBox/images/OSE/VirtualBox_48px.png ${PREFIX}/share/pixmaps/VBox.png
${MKDIR} ${PREFIX}/share/applications/
${INSTALL_DATA} ${WRKSRC}/src/VBox/Installer/freebsd/virtualbox.desktop ${PREFIX}/share/applications/virtualbox.desktop
.endif
@${CAT} ${PKGMESSAGE}

View file

@ -1,4 +1,4 @@
SHA256 (VirtualBox-4.1.24.tar.bz2) = 74008b8e8942045668c1b7d06b0a4bb5fe8464066e343e3a2e1ba30b94ce8a7f
SIZE (VirtualBox-4.1.24.tar.bz2) = 74612732
SHA256 (VBoxGuestAdditions_4.1.24.iso) = 6db32584eb4e2ace0fd5fbbd9d63bdb8f50f0c28821d03dafd0ed1018d133cc7
SIZE (VBoxGuestAdditions_4.1.24.iso) = 53532672
SHA256 (VirtualBox-4.2.20.tar.bz2) = 193aa3ce7c0e700fe6a12b64bf462ce633a856f1e831ee4a337cc3439b21df61
SIZE (VirtualBox-4.2.20.tar.bz2) = 77050211
SHA256 (VBoxGuestAdditions_4.2.20.iso) = 2fb3aa0f370d503b0e77725dbec76b989a251f613abee378f53c1fed9d6edf01
SIZE (VBoxGuestAdditions_4.2.20.iso) = 59664384

View file

@ -1,10 +0,0 @@
--- include/iprt/string.h.orig 2010-04-28 01:02:16.000000000 +0200
+++ include/iprt/string.h 2010-06-17 16:20:14.000000000 +0200
@@ -60,7 +60,6 @@
#if (defined(RT_OS_DARWIN) && defined(KERNEL)) \
|| (defined(RT_OS_FREEBSD) && defined(_KERNEL))
RT_C_DECLS_BEGIN
-void *memchr(const void *pv, int ch, size_t cb);
char *strpbrk(const char *pszStr, const char *pszChars);
RT_C_DECLS_END
#endif

View file

@ -0,0 +1,58 @@
--- Config.kmk.orig 2013-10-15 13:01:31.000000000 +0200
+++ Config.kmk 2013-10-20 14:43:19.015746151 +0200
@@ -3387,16 +3387,16 @@
$(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
+TEMPLATE_VBOXR0DRV_CFLAGS.x86 = -m32 -mpreferred-stack-boundary=2 -mno-mmx -mno-3dnow -mno-sse -mno-sse2
TEMPLATE_VBOXR0DRV_CFLAGS.amd64 = -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
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)
@@ -3630,8 +3630,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
@@ -4206,8 +4204,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
@@ -4673,8 +4669,6 @@
/usr/X11R6/include \
/usr/local/include
TEMPLATE_VBOXQT4GUIEXE_LIBPATH += \
- /usr/lib \
- /usr/X11R6/lib \
/usr/local/lib
endif
ifeq ($(KBUILD_TARGET),solaris)
@@ -4869,8 +4863,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

View file

@ -1,10 +1,21 @@
--- configure.orig 2011-05-30 17:11:26.000000000 +0200
+++ configure 2011-06-06 10:01:12.000000000 +0200
@@ -1920,7 +1920,7 @@
--- configure.orig 2012-03-16 10:34:01.000000000 +0100
+++ configure 2012-03-24 18:52:57.271018829 +0100
@@ -135,6 +135,8 @@
LIBPULSE="-L/usr/local/lib"
INCPNG="-I/usr/local/include"
LIBPNG="-L/usr/local/lib -lpng"
+ INCVNCSERVER="-I/usr/local/include"
+ LIBVNCSERVER="-L/usr/local/lib"
else
INCCURL=""
LIBCURL="-lcurl"
@@ -1837,8 +1839,8 @@
echo "compiling the following source file:" >> $LOG
cat $ODIR.tmp_src.cc >> $LOG
echo "using the following command line:" >> $LOG
echo "$CXX -O -Wall -o $ODIR.tmp_out $ODIR.tmp_src.cc -I$p/include/$d $p/$b/lib$d.so" >> $LOG
- echo "$CXX -O -Wall -o $ODIR.tmp_out $ODIR.tmp_src.cc -I$p/include/$d $p/$b/lib$d.so" >> $LOG
- $CXX -O -Wall -o $ODIR.tmp_out $ODIR.tmp_src.cc -I$p/include/$d $p/$b/lib$d.so >> $LOG 2>&1
+ echo "$CXX -O -Wall -o $ODIR.tmp_out $ODIR.tmp_src.cc -I$p/include/$d $p/$b/lib$d.so -pthread" >> $LOG
+ $CXX -O -Wall -o $ODIR.tmp_out $ODIR.tmp_src.cc -I$p/include/$d $p/$b/lib$d.so -pthread >> $LOG 2>&1
if [ $? -eq 0 ]; then
found=1

View file

@ -1,11 +0,0 @@
--- include/iprt/types.h.orig 2012-03-05 10:48:48.000000000 +0100
+++ include/iprt/types.h 2012-03-05 11:21:25.000000000 +0100
@@ -82,6 +82,8 @@
# include <stddef.h>
# define _UINT64_T_DECLARED
# define _INT64_T_DECLARED
+# define _UINTPTR_T_DECLARED
+# define _INTPTR_T_DECLARED
# include <sys/types.h>
# elif defined(RT_OS_LINUX) && defined(__KERNEL__)

View file

@ -0,0 +1,19 @@
Fix recording with OSS Audio backend to record at a proper volume
Obtained from: https://www.virtualbox.org/ticket/10695
--- src/VBox/Devices/Audio/ossaudio.c.orig 2012-12-19 19:26:32.000000000 +0100
+++ src/VBox/Devices/Audio/ossaudio.c 2012-12-20 12:23:18.476851732 +0100
@@ -795,13 +795,8 @@
hw->info.align + 1);
}
read_samples += nread >> hwshift;
-#ifndef VBOX
hw->conv (hw->conv_buf + bufs[i].add, p, nread >> hwshift,
&nominal_volume);
-#else
- hw->conv (hw->conv_buf + bufs[i].add, p, nread >> hwshift,
- &pcm_in_volume);
-#endif
}
if (bufs[i].len - nread) {

View file

@ -0,0 +1,22 @@
Fix ich9 bios to correctly configure pci bridge1 and pci bridge2
avg: I think that it is a valid report, the patch is not perfect, but
avg: it fixes the problem for most configurations and demonstrates the problem well
avg: the explanation for them is that FreeBSD (unlike Linux and maybe other OSes)
avg: entirely relies on platform doing correct bus numbering
avg: currently we can not do any re-numbering/corrections
See: http://article.gmane.org/gmane.os.freebsd.devel.emulation/10438
Submitted by: Gustau Perez i Querol <gperez@entel.upc.edu>
--- src/VBox/Devices/Bus/DevPciIch9.cpp.orig 2012-06-15 21:22:15.000000000 +0200
+++ src/VBox/Devices/Bus/DevPciIch9.cpp 2012-09-02 14:17:49.804118887 +0200
@@ -1812,7 +1812,8 @@
PICH9PCIBUS pChildBus = PDMINS_2_DATA(pBridge->pDevIns, PICH9PCIBUS);
ich9pciInitBridgeTopology(pGlobals, pChildBus);
}
- PCIDevSetByte(pBridgeDev, VBOX_PCI_SUBORDINATE_BUS, pGlobals->uBus);
+ PCIDevSetByte(pBridgeDev, VBOX_PCI_PRIMARY_BUS, 0);
+ PCIDevSetByte(pBridgeDev, VBOX_PCI_SUBORDINATE_BUS, (pGlobals->uBus)-1);
Log2(("ich9pciInitBridgeTopology: for bus %p: primary=%d secondary=%d subordinate=%d\n",
pBus,
PCIDevGetByte(pBridgeDev, VBOX_PCI_PRIMARY_BUS),

View file

@ -1,25 +0,0 @@
- Add support for files to VBoxManage createrawvmdk. Currently
it only supports character devices so it failes like this:
VBoxManage internalcommands createrawvmdk -filename test.vmdk -rawdisk /vbox/HardDisks/test.img
VBoxManage: error: File '/vbox/HardDisks/test.img' is no character device
VBoxManage: error: The raw disk vmdk file was not created
Submitted by: Pawel Jakub Dawidek <pjd@FreeBSD.org>
--- src/VBox/Frontends/VBoxManage/VBoxInternalManage.cpp.orig 2011-12-13 11:18:43.424439415 +0100
+++ src/VBox/Frontends/VBoxManage/VBoxInternalManage.cpp 2011-12-13 11:22:01.554438862 +0100
@@ -1140,9 +1140,13 @@
goto out;
}
}
+ else if (S_ISREG(DevStat.st_mode))
+ {
+ cbSize = DevStat.st_size;
+ }
else
{
- RTMsgError("File '%s' is no character device", rawdisk.c_str());
+ RTMsgError("File '%s' is neither character device nor regular file", rawdisk.c_str());
vrc = VERR_INVALID_PARAMETER;
goto out;
}

View file

@ -0,0 +1,13 @@
--- src/VBox/Frontends/VirtualBox/Makefile.kmk.orig 2013-10-16 21:47:09.588793988 +0400
+++ src/VBox/Frontends/VirtualBox/Makefile.kmk 2013-10-16 21:47:37.458794265 +0400
@@ -175,10 +175,6 @@
# Necessary for the hdd backend enumeration
VirtualBox_LIBS = $(LIB_DDU)
-if1of ($(KBUILD_TARGET), linux freebsd netbsd openbsd)
- VirtualBox_LIBS += dl
-endif
-
# This library is required for multi-monitor support
VirtualBox_LIBS.linux += Xinerama
VirtualBox_LIBS.solaris += Xinerama

View file

@ -1,27 +0,0 @@
--- src/VBox/HostDrivers/Makefile.kmk.orig 2010-03-04 12:59:54.000000000 +0100
+++ src/VBox/HostDrivers/Makefile.kmk 2010-03-09 12:54:09.000000000 +0100
@@ -40,7 +40,7 @@
endif
endif
- if1of ($(KBUILD_TARGET),linux freebsd)
+ if1of ($(KBUILD_TARGET),linux)
#
# Install the Makefile for module compliation on Linux and FreeBSD hosts
#
@@ -51,6 +51,7 @@
HostDrivers-src_SOURCES.freebsd = freebsd/Makefile
endif
+if 0
if1of ($(KBUILD_TARGET),freebsd)
#
# Install the export_modules script for tar'ing the module sources on FreeBSD hosts
@@ -60,6 +61,7 @@
HostDrivers-sh_MODE = a+rx,u+w
HostDrivers-sh_SOURCES.freebsd = freebsd/export_modules
endif
+endif
endif # !defined(VBOX_ONLY_DOCS) && !defined(VBOX_ONLY_TESTSUITE)
# Let kBuild generate the rules.

View file

@ -1,15 +0,0 @@
- Fix path for libpam.so on FreeBSD
Submitted by: Landon Fuller <landonf at plausible.coop>
Sponsored by: Plausible Labs Cooperative, Inc.
--- src/VBox/HostServices/auth/pam/VBoxAuthPAM.c.orig 2012-04-03 14:11:56.000000000 +0200
+++ src/VBox/HostServices/auth/pam/VBoxAuthPAM.c 2012-04-05 12:44:48.000000000 +0200
@@ -62,6 +62,8 @@
/* The name of the PAM library */
# ifdef RT_OS_SOLARIS
# define PAM_LIB_NAME "libpam.so.1"
+# elif defined(RT_OS_FREEBSD)
+# define PAM_LIB_NAME "libpam.so"
# else
# define PAM_LIB_NAME "libpam.so.0"
# endif

View file

@ -0,0 +1,13 @@
--- src/VBox/Main/src-server/freebsd/PerformanceFreeBSD.cpp.orig 2012-10-19 19:51:26.256773940 +0400
+++ src/VBox/Main/src-server/freebsd/PerformanceFreeBSD.cpp 2012-10-19 19:51:49.835771918 +0400
@@ -109,5 +109,10 @@
return E_NOTIMPL;
}
+int getDiskListByFs(const char *name, DiskList& list)
+{
+ return VERR_NOT_IMPLEMENTED;
+}
+
} /* namespace pm */

View file

@ -1,13 +0,0 @@
- Remove debugging fprintf in MachineImpl.cpp to fix build with GCC 4.6
Submitted by: Andriy Gapon <avg at FreeBSD.org>
--- src/VBox/Main/src-server/MachineImpl.cpp.orig 2012-04-03 14:12:01.000000000 +0200
+++ src/VBox/Main/src-server/MachineImpl.cpp 2012-04-13 10:49:25.000000000 +0200
@@ -6643,7 +6643,6 @@
Utf8Str idStr = mData->mUuid.toString();
const char * args[] = {szPath, "--comment", mUserData->s.strName.c_str(), "--startvm", idStr.c_str(), 0 };
- fprintf(stderr, "SDL=%s\n", szPath);
vrc = RTProcCreate(szPath, args, env, 0, &pid);
}
#else /* !VBOX_WITH_VBOXSDL */

View file

@ -0,0 +1,10 @@
--- src/VBox/Main/src-server/freebsd/HostHardwareFreeBSD.cpp.orig 2012-12-19 19:27:17.000000000 +0100
+++ src/VBox/Main/src-server/freebsd/HostHardwareFreeBSD.cpp 2012-12-20 14:55:59.501850255 +0100
@@ -40,6 +40,7 @@
# include <sys/stat.h>
# include <unistd.h>
# include <sys/ioctl.h>
+# include <stdio.h>
# include <fcntl.h>
# include <cam/cam.h>
# include <cam/cam_ccb.h>

View file

@ -1,26 +1,10 @@
This patch adds support for IFT_L2VLAN interfaces in the
FreeBSD implementation of NetIfList(), treating them
identically as IFT_ETHER interfaces.
Submitted by: Landon J Fuller <landonf at plausible dot coop>
Sponsored by: Plausible Labs Cooperative, Inc
--- src/VBox/Main/src-server/freebsd/NetIf-freebsd.cpp.orig 2012-04-10 11:28:41.552067907 -0400
+++ src/VBox/Main/src-server/freebsd/NetIf-freebsd.cpp 2012-04-10 11:28:45.872069027 -0400
@@ -268,7 +268,7 @@
pNext += pIfAddrMsg->ifam_msglen;
}
--- src/VBox/Main/src-server/freebsd/NetIf-freebsd.cpp.orig 2012-12-19 19:27:17.000000000 +0100
+++ src/VBox/Main/src-server/freebsd/NetIf-freebsd.cpp 2012-12-20 14:55:59.492850918 +0100
@@ -44,6 +44,7 @@
#include <netinet/in.h>
- if (pSdl->sdl_type == IFT_ETHER)
+ if (pSdl->sdl_type == IFT_ETHER || pSdl->sdl_type == IFT_L2VLAN)
{
struct ifreq IfReq;
strcpy(IfReq.ifr_name, pNew->szShortName);
@@ -373,7 +373,7 @@
pNext += pIfAddrMsg->ifam_msglen;
}
#include <stdio.h>
+#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
- if (!fSkip && pSdl->sdl_type == IFT_ETHER)
+ if (!fSkip && (pSdl->sdl_type == IFT_ETHER || pSdl->sdl_type == IFT_L2VLAN))
{
size_t cbNameLen = pSdl->sdl_nlen + 1;
memcpy(pInfo->MACAddress.au8, LLADDR(pSdl), sizeof(pInfo->MACAddress.au8));

View file

@ -1,254 +0,0 @@
Fix building with libxslt newer than 1.1.26.
Obtained from: https://www.virtualbox.org/ticket/10940
--- src/VBox/Main/webservice/websrv-wsdl.xsl 2012-10-26 18:24:53.000000000 +0200
+++ src/VBox/Main/webservice/websrv-wsdl.xsl 2012-12-17 10:44:59.000001310 +0100
@@ -93,6 +93,7 @@
targetNamespace="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:vbox="http://www.virtualbox.org/"
xmlns:exsl="http://exslt.org/common"
@@ -460,7 +461,7 @@
<xsl:param name="_params" />
<xsl:param name="_valuetype" /> <!-- optional, for attribute setter messages -->
- <message>
+ <wsdl:message>
<xsl:attribute name="name"><xsl:value-of select="concat($_ifname, $G_classSeparator, $_methodname, $G_methodRequest)" /></xsl:attribute>
<xsl:call-template name="convertTypeAndEmitPartOrElement">
@@ -469,10 +470,10 @@
<xsl:with-param name="name" select="'parameters'" />
<xsl:with-param name="type" select="$G_typeIsGlobalRequestElementMarker" />
<xsl:with-param name="safearray" select="'no'" />
- <xsl:with-param name="elname" select="'part'" /> <!-- "part" or "element" -->
+ <xsl:with-param name="elname" select="'wsdl:part'" /> <!-- "part" or "element" -->
<xsl:with-param name="attrname" select="'element'" /> <!-- attrib of part of element: <part type=...> or <part element=...> or <element type=...> -->
</xsl:call-template>
- </message>
+ </wsdl:message>
</xsl:template>
<!--
@@ -485,7 +486,7 @@
<xsl:param name="_params" /> <!-- set of parameter elements -->
<xsl:param name="_resulttype" /> <!-- for attribute getter methods only -->
- <message>
+ <wsdl:message>
<xsl:attribute name="name"><xsl:copy-of select="$_ifname" /><xsl:value-of select="$G_classSeparator" /><xsl:value-of select="$_methodname" /><xsl:copy-of select="$G_methodResponse" /></xsl:attribute>
<!-- <xsl:variable name="cOutParams" select="count($_params[@dir='out']) + count($_params[@dir='return'])" /> -->
@@ -495,10 +496,10 @@
<xsl:with-param name="name" select="'parameters'" />
<xsl:with-param name="type" select="$G_typeIsGlobalResponseElementMarker" />
<xsl:with-param name="safearray" select="'no'" />
- <xsl:with-param name="elname" select="'part'" /> <!-- "part" or "element" -->
+ <xsl:with-param name="elname" select="'wsdl:part'" /> <!-- "part" or "element" -->
<xsl:with-param name="attrname" select="'element'" /> <!-- attrib of part of element: <part type=...> or <part element=...> or <element type=...> -->
</xsl:call-template>
- </message>
+ </wsdl:message>
</xsl:template>
<!--
@@ -543,13 +544,13 @@
<xsl:with-param name="_methodname" select="$attrSetter" />
<xsl:with-param name="_params" select="/.." /> <!-- empty set -->
<xsl:with-param name="_valuetype" select="$attrtype" />
- <xsl:with-param name="elname" select="'part'" /> <!-- "part" or "element" -->
+ <xsl:with-param name="elname" select="'wsdl:part'" /> <!-- "part" or "element" -->
</xsl:call-template>
<xsl:call-template name="emitResultMessage">
<xsl:with-param name="_ifname" select="$ifname" />
<xsl:with-param name="_methodname" select="$attrSetter" />
<xsl:with-param name="_params" select="/.." /> <!-- empty set -->
- <xsl:with-param name="elname" select="'part'" /> <!-- "part" or "element" -->
+ <xsl:with-param name="elname" select="'wsdl:part'" /> <!-- "part" or "element" -->
</xsl:call-template>
</xsl:template>
@@ -566,7 +567,7 @@
<xsl:call-template name="debugMsg"><xsl:with-param name="msg" select="concat('....emitInOutOperation ', $_ifname, '::', $_methodname)" /></xsl:call-template>
- <operation>
+ <wsdl:operation>
<xsl:attribute name="name">
<xsl:value-of select="concat($_ifname, '_', $_methodname)" />
</xsl:attribute>
@@ -577,7 +578,7 @@
<xsl:attribute name="style"><xsl:value-of select="$G_basefmt" /></xsl:attribute>
</soap:operation>
</xsl:if>
- <input>
+ <wsdl:input>
<xsl:choose>
<xsl:when test="$_fSoap">
<soap:body>
@@ -589,10 +590,10 @@
<xsl:attribute name="message">vbox:<xsl:copy-of select="$_ifname" /><xsl:value-of select="$G_classSeparator" /><xsl:value-of select="$_methodname" /><xsl:copy-of select="$G_methodRequest" /></xsl:attribute>
</xsl:otherwise>
</xsl:choose>
- </input>
+ </wsdl:input>
<xsl:choose>
<xsl:when test="$_resulttype">
- <output>
+ <wsdl:output>
<xsl:choose>
<xsl:when test="$_fSoap">
<soap:body>
@@ -604,11 +605,11 @@
<xsl:attribute name="message">vbox:<xsl:copy-of select="$_ifname" /><xsl:value-of select="$G_classSeparator" /><xsl:value-of select="$_methodname" /><xsl:copy-of select="$G_methodResponse" /></xsl:attribute>
</xsl:otherwise>
</xsl:choose>
- </output>
+ </wsdl:output>
</xsl:when>
<xsl:otherwise>
<!-- <xsl:if test="count($_params[@dir='out'] | $_params[@dir='return']) > 0"> -->
- <output>
+ <wsdl:output>
<xsl:choose>
<xsl:when test="$_fSoap">
<soap:body>
@@ -620,29 +621,29 @@
<xsl:attribute name="message">vbox:<xsl:copy-of select="$_ifname" /><xsl:value-of select="$G_classSeparator" /><xsl:value-of select="$_methodname" /><xsl:copy-of select="$G_methodResponse" /></xsl:attribute>
</xsl:otherwise>
</xsl:choose>
- </output>
+ </wsdl:output>
<!-- </xsl:if> -->
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="not($_fSoap)">
- <fault name="InvalidObjectFault" message="vbox:InvalidObjectFaultMsg" />
- <fault name="RuntimeFault" message="vbox:RuntimeFaultMsg" />
+ <wsdl:fault name="InvalidObjectFault" message="vbox:InvalidObjectFaultMsg" />
+ <wsdl:fault name="RuntimeFault" message="vbox:RuntimeFaultMsg" />
</xsl:when>
<xsl:otherwise>
- <fault name="InvalidObjectFault">
+ <wsdl:fault name="InvalidObjectFault">
<soap:fault name="InvalidObjectFault">
<xsl:attribute name="use"><xsl:value-of select="$G_parmfmt" /></xsl:attribute>
</soap:fault>
- </fault>
- <fault name="RuntimeFault">
+ </wsdl:fault>
+ <wsdl:fault name="RuntimeFault">
<soap:fault name="RuntimeFault">
<xsl:attribute name="use"><xsl:value-of select="$G_parmfmt" /></xsl:attribute>
</soap:fault>
- </fault>
+ </wsdl:fault>
</xsl:otherwise>
</xsl:choose>
- </operation>
+ </wsdl:operation>
</xsl:template>
<!--
@@ -742,7 +743,7 @@
<xsl:with-param name="_wsmap" select="$wsmap" />
<xsl:with-param name="_methodname" select="$methodname" />
<xsl:with-param name="_params" select="param" />
- <xsl:with-param name="elname" select="'part'" /> <!-- "part" or "element" -->
+ <xsl:with-param name="elname" select="'wsdl:part'" /> <!-- "part" or "element" -->
</xsl:call-template>
<!-- emit a second "result" message only if the method has "out" arguments or a return value -->
<!-- <xsl:if test="(count(param[@dir='out'] | param[@dir='return']) > 0)"> -->
@@ -751,7 +752,7 @@
<xsl:with-param name="_wsmap" select="$wsmap" />
<xsl:with-param name="_methodname" select="@name" />
<xsl:with-param name="_params" select="param" />
- <xsl:with-param name="elname" select="'part'" /> <!-- "part" or "element" -->
+ <xsl:with-param name="elname" select="'wsdl:part'" /> <!-- "part" or "element" -->
</xsl:call-template>
<!-- </xsl:if> -->
</xsl:otherwise>
@@ -956,10 +957,9 @@
and emit complexTypes for all method arguments and return values.
-->
<xsl:template match="library">
- <definitions
+ <wsdl:definitions
name="VirtualBox"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
- <xsl:attribute name="xmlns">http://schemas.xmlsoap.org/wsdl/</xsl:attribute>
<xsl:attribute name="targetNamespace"><xsl:value-of select="$G_targetNamespace" /></xsl:attribute>
<!-- at top of WSDL file, dump a <types> section with user-defined types -->
<xsl:comment>
@@ -969,7 +969,7 @@
*
******************************************************
</xsl:comment>
- <types>
+ <wsdl:types>
<xsd:schema>
<xsl:attribute name="targetNamespace"><xsl:value-of select='$G_targetNamespace' /></xsl:attribute>
@@ -1193,14 +1193,14 @@
</xsd:schema>
- </types>
+ </wsdl:types>
- <message name="InvalidObjectFaultMsg">
- <part name="fault" element="vbox:InvalidObjectFault" />
- </message>
- <message name="RuntimeFaultMsg">
- <part name="fault" element="vbox:RuntimeFault" />
- </message>
+ <wsdl:message name="InvalidObjectFaultMsg">
+ <wsdl:part name="fault" element="vbox:InvalidObjectFault" />
+ </wsdl:message>
+ <wsdl:message name="RuntimeFaultMsg">
+ <wsdl:part name="fault" element="vbox:RuntimeFault" />
+ </wsdl:message>
<xsl:comment>
******************************************************
@@ -1241,7 +1241,7 @@
******************************************************
</xsl:comment>
- <portType>
+ <wsdl:portType>
<xsl:attribute name="name"><xsl:copy-of select="'vbox'" /><xsl:value-of select="$G_portTypeSuffix" /></xsl:attribute>
<xsl:for-each select="//interface">
@@ -1261,7 +1261,7 @@
</xsl:call-template>
</xsl:if>
</xsl:for-each>
- </portType>
+ </wsdl:portType>
<xsl:comment>
******************************************************
@@ -1271,7 +1271,7 @@
******************************************************
</xsl:comment>
- <binding>
+ <wsdl:binding>
<xsl:attribute name="name"><xsl:value-of select="concat('vbox', $G_bindingSuffix)" /></xsl:attribute>
<xsl:attribute name="type"><xsl:value-of select="concat('vbox:vbox', $G_portTypeSuffix)" /></xsl:attribute>
@@ -1297,9 +1297,9 @@
</xsl:call-template>
</xsl:if>
</xsl:for-each>
- </binding>
+ </wsdl:binding>
- </definitions>
+ </wsdl:definitions>
</xsl:template>

View file

@ -0,0 +1,11 @@
--- src/VBox/Runtime/Makefile.kmk.orig 2013-06-21 16:27:18.000000000 +0400
+++ src/VBox/Runtime/Makefile.kmk 2013-06-30 14:57:33.248215681 +0400
@@ -844,7 +844,7 @@
r3/posix/RTMemProtect-posix.cpp \
r3/posix/RTPathUserHome-posix.cpp \
r3/posix/RTSystemQueryOSInfo-posix.cpp \
- r3/posix/RTSystemQueryTotalRam-posix.cpp \
+ r3/freebsd/RTSystemQueryTotalRam-freebsd.cpp \
r3/posix/RTTimeNow-posix.cpp \
r3/posix/RTTimeSet-posix.cpp \
r3/posix/dir-posix.cpp \

View file

@ -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,

View file

@ -1,53 +1,56 @@
From Alan L. Cox on FreeBSD-current:
I just glanced at the virtualbox code for a couple minutes. For
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
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(+)
--- src/VBox/Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c.orig 2012-12-19 20:51:59.000000000 +0100
+++ src/VBox/Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c 2012-12-20 15:14:56.283850834 +0100
@@ -136,7 +136,10 @@
(vm_offset_t)pMemFreeBSD->Core.pv + pMemFreeBSD->Core.cb);
AssertMsg(rc == KERN_SUCCESS, ("%#x", rc));
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 (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))
{
vm_page_t pPage = pMemFreeBSD->u.Phys.apPages[iPage];
@@ -191,7 +194,9 @@
case RTR0MEMOBJTYPE_PHYS:
case RTR0MEMOBJTYPE_PHYS_NC:
{
vm_page_unwire(pPage, 0);
}
+#if __FreeBSD_version < 900000
vm_page_lock_queues();
vm_page_unlock_queues();
+#endif
for (uint32_t iPage = 0; iPage < pMemFreeBSD->u.Phys.cPages; iPage++)
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)
{
vm_page_t pPage = pMemFreeBSD->u.Phys.apPages[iPage];
@@ -266,7 +271,9 @@
while (iPage-- > 0)
{
pPage = pMemFreeBSD->u.Phys.apPages[iPage];
pPage = vm_page_lookup(pObject, iPage);
+#if __FreeBSD_version < 900000
vm_page_lock_queues();
vm_page_lock_queues();
+#endif
if (fWire)
vm_page_unwire(pPage, 0);
vm_page_free(pPage);
vm_page_unlock_queues();
@@ -448,7 +455,9 @@
while (iPage-- > 0)
{
pPage = pMemFreeBSD->u.Phys.apPages[iPage];
vm_page_free(pPage);
+#if __FreeBSD_version < 900000
vm_page_lock_queues();
vm_page_unlock_queues();
+#endif
vm_page_unwire(pPage, 0);
vm_page_free(pPage);
vm_page_unlock_queues();
}
VM_OBJECT_UNLOCK(pObject);
return rcNoMem;
--
1.7.11.5

View file

@ -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 */

View file

@ -0,0 +1,83 @@
--- ./src/VBox/Runtime/r3/freebsd/RTSystemQueryTotalRam-freebsd.cpp.ORIG 2013-06-30 09:27:59.000000000 +0200
+++ ./src/VBox/Runtime/r3/freebsd/RTSystemQueryTotalRam-freebsd.cpp 2013-06-30 09:51:29.000000000 +0200
@@ -0,0 +1,80 @@
+/* $Id: RTSystemQueryTotalRam-freebsd.cpp $ */
+/** @file
+ * IPRT - RTSystemQueryTotalRam, FreeBSD style
+ */
+
+/*
+ * Copyright (C) 2013 Martin Birgmeier, Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include <iprt/system.h>
+#include "internal/iprt.h"
+
+#include <iprt/err.h>
+#include <iprt/assert.h>
+#include <iprt/string.h>
+
+/* FreeBSD */
+#include <sys/types.h>
+#include <sys/sysctl.h>
+#include <sys/errno.h>
+
+RTDECL(int) RTSystemQueryTotalRam(uint64_t *pcb)
+{
+ int mib[2];
+ size_t pcblen = sizeof(*pcb);
+
+ AssertPtrReturn(pcb, VERR_INVALID_POINTER);
+
+ mib[0] = CTL_HW;
+ mib[1] = HW_PHYSMEM; /* HW_REALMEM is also possible, but
+ includes non-main memory as well */
+ *pcb = 0;
+ if (sysctl(mib, 2, pcb, &pcblen, NULL, 0) == 0) {
+ if (pcblen == sizeof(*pcb) || pcblen == sizeof(uint32_t))
+ return VINF_SUCCESS;
+ else
+ return VERR_NO_MEMORY; /* XXX */
+ }
+ return RTErrConvertFromErrno(errno);
+}
+
+RTDECL(int) RTSystemQueryAvailableRam(uint64_t *pcb)
+{
+ int mib[2];
+ size_t pcblen = sizeof(*pcb);
+
+ AssertPtrReturn(pcb, VERR_INVALID_POINTER);
+
+ mib[0] = CTL_HW;
+ mib[1] = HW_USERMEM;
+ *pcb = 0;
+ if (sysctl(mib, 2, pcb, &pcblen, NULL, 0) == 0) {
+ if (pcblen == sizeof(*pcb) || pcblen == sizeof(uint32_t))
+ return VINF_SUCCESS;
+ else
+ return VERR_NO_MEMORY; /* XXX */
+ }
+ return RTErrConvertFromErrno(errno);
+}

View file

@ -0,0 +1,53 @@
#!/bin/sh
# $FreeBSD$
#
# PROVIDE: vboxwatchdog
# REQUIRE: LOGIN
# KEYWORD: shutdown
#
# Add the following line to /etc/rc.conf[.local] to enable vboxwatchdog
#
# vboxwatchdog_enable (bool): Set to "NO" by default.
# Set it to "YES" to enable vboxwatchdog.
# vboxwatchdog_user (str): User account to run with.
# vboxwatchdog_flags (str): Custom flags for VBoxWatchdog.
. /etc/rc.subr
name=vboxwatchdog
rcvar=vboxwatchdog_enable
command="%%PREFIX%%/bin/VBoxBalloonCtrl"
pidfile="/var/run/${name}.pid"
start_cmd="${name}_start"
vboxwatchdog_start()
{
local pid
HOME=$(/usr/sbin/pw usershow -7 -n "${vboxwatchdog_user}" | /usr/bin/cut -d: -f6)
pid=$(check_pidfile $pidfile $command)
if [ -n "${pid}" ]; then
echo "${name} already running? (pid=${pid})."
return 1
fi
# prevent inheriting this setting to VBoxSVC
unset VBOX_RELEASE_LOG_DEST
echo -n "Starting ${name}"
/usr/bin/install -o ${vboxwatchdog_user} -g wheel -m 644 /dev/null ${pidfile}
/usr/sbin/daemon -f -p ${pidfile} -u ${vboxwatchdog_user} ${command} ${vboxwatchdog_flags}
echo '.'
}
load_rc_config $name
: ${vboxwatchdog_enable="NO"}
: ${vboxwatchdog_user="%%VBOXUSER%%"}
: ${vboxwatchdog_flags="-b"}
run_rc_command "$1"

View file

@ -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/

View file

@ -1,3 +1,4 @@
bin/VBoxAutostart
bin/VBoxBalloonCtrl
%%X11%%bin/VBoxBFE
bin/VBoxHeadless
@ -9,12 +10,13 @@ bin/VBoxSVC
%%QT4%%bin/VBoxTestOGL
bin/VBoxXPCOMIPCD
%%QT4%%bin/VirtualBox
%%WEB%%bin/vboxwebsrv
%%WEB%%bin/webtest
%%WEBSERVICE%%bin/vboxwebsrv
%%WEBSERVICE%%bin/webtest
%%X11%%lib/virtualbox/VBoxBFE
%%X11%%lib/virtualbox/VBoxBFE.so
lib/virtualbox/DBGCPlugInDiggers.so
lib/virtualbox/VBoxAuth.so
lib/virtualbox/VBoxAutostart
lib/virtualbox/VBoxAuthSimple.so
lib/virtualbox/VBoxBalloonCtrl
%%QT4%%lib/virtualbox/VBoxDbg.so
@ -28,6 +30,7 @@ lib/virtualbox/VBoxGuestControlSvc.so
lib/virtualbox/VBoxGuestPropSvc.so
lib/virtualbox/VBoxHeadless
lib/virtualbox/VBoxHeadless.so
lib/virtualbox/VBoxHostChannel.so
%%X11%%lib/virtualbox/VBoxKeyboard.so
lib/virtualbox/VBoxManage
lib/virtualbox/VBoxNetAdpCtl
@ -49,6 +52,7 @@ lib/virtualbox/VBoxSharedClipboard.so
%%X11%%lib/virtualbox/VBoxSharedCrOpenGL.so
lib/virtualbox/VBoxSharedFolders.so
lib/virtualbox/VBoxVMM.so
lib/virtualbox/VBoxVMMPreload.so
lib/virtualbox/VBoxXPCOM.so
lib/virtualbox/VBoxXPCOMC.so
lib/virtualbox/VBoxXPCOMIPCD
@ -63,24 +67,29 @@ lib/virtualbox/VBoxDDR0.r0
%%GUESTADDITIONS%%lib/virtualbox/additions/VBoxGuestAdditions_%%GUEST_VER%%.iso
lib/virtualbox/VBoxPython%%PYTHON_VERU%%.so
lib/virtualbox/VMMR0.r0
%%WEB%%lib/virtualbox/vboxwebsrv
%%WEB%%lib/virtualbox/webtest
%%WEBSERVICE%%lib/virtualbox/vboxwebsrv
%%WEBSERVICE%%lib/virtualbox/webtest
lib/virtualbox/components/VirtualBox_XPCOM.xpt
lib/virtualbox/components/VBoxXPCOMIPCC.so
lib/virtualbox/components/VBoxSVCM.so
lib/virtualbox/components/VBoxC.so
lib/virtualbox/components/VBoxXPCOMBase.xpt
%%NLS%%%%DATADIR%%/nls/VirtualBox_ar.qm
%%VNC%%lib/virtualbox/ExtensionPacks/VNC/%%ARCH%%/VBoxVNC.so
%%VNC%%lib/virtualbox/ExtensionPacks/VNC/%%ARCH%%/VBoxVNCMain.so
%%VNC%%lib/virtualbox/ExtensionPacks/VNC/ExtPack-license.html
%%VNC%%lib/virtualbox/ExtensionPacks/VNC/ExtPack-license.rtf
%%VNC%%lib/virtualbox/ExtensionPacks/VNC/ExtPack-license.txt
%%VNC%%lib/virtualbox/ExtensionPacks/VNC/ExtPack.xml
%%NLS%%%%DATADIR%%/nls/VirtualBox_bg.qm
%%NLS%%%%DATADIR%%/nls/VirtualBox_ca.qm
%%NLS%%%%DATADIR%%/nls/VirtualBox_ca_VA.qm
%%NLS%%%%DATADIR%%/nls/VirtualBox_cs.qm
%%NLS%%%%DATADIR%%/nls/VirtualBox_da.qm
%%NLS%%%%DATADIR%%/nls/VirtualBox_de.qm
%%NLS%%%%DATADIR%%/nls/VirtualBox_el.qm
%%NLS%%%%DATADIR%%/nls/VirtualBox_en.qm
%%NLS%%%%DATADIR%%/nls/VirtualBox_es.qm
%%NLS%%%%DATADIR%%/nls/VirtualBox_eu.qm
%%NLS%%%%DATADIR%%/nls/VirtualBox_fa_IR.qm
%%NLS%%%%DATADIR%%/nls/VirtualBox_fi.qm
%%NLS%%%%DATADIR%%/nls/VirtualBox_fr.qm
%%NLS%%%%DATADIR%%/nls/VirtualBox_gl_ES.qm
@ -104,17 +113,16 @@ lib/virtualbox/components/VBoxXPCOMBase.xpt
%%NLS%%%%DATADIR%%/nls/VirtualBox_uk.qm
%%NLS%%%%DATADIR%%/nls/VirtualBox_zh_CN.qm
%%NLS%%%%DATADIR%%/nls/VirtualBox_zh_TW.qm
%%NLS%%%%DATADIR%%/nls/qt_ar.qm
%%NLS%%%%DATADIR%%/nls/qt_bg.qm
%%NLS%%%%DATADIR%%/nls/qt_ca.qm
%%NLS%%%%DATADIR%%/nls/qt_ca_VA.qm
%%NLS%%%%DATADIR%%/nls/qt_cs.qm
%%NLS%%%%DATADIR%%/nls/qt_da.qm
%%NLS%%%%DATADIR%%/nls/qt_de.qm
%%NLS%%%%DATADIR%%/nls/qt_el.qm
%%NLS%%%%DATADIR%%/nls/qt_en.qm
%%NLS%%%%DATADIR%%/nls/qt_es.qm
%%NLS%%%%DATADIR%%/nls/qt_eu.qm
%%NLS%%%%DATADIR%%/nls/qt_fa_IR.qm
%%NLS%%%%DATADIR%%/nls/qt_fi.qm
%%NLS%%%%DATADIR%%/nls/qt_fr.qm
%%NLS%%%%DATADIR%%/nls/qt_gl_ES.qm
@ -234,14 +242,15 @@ lib/virtualbox/components/VBoxXPCOMBase.xpt
%%DATADIR%%/idl/VirtualBox_XPCOM.idl
%%DATADIR%%/samples/tstVBoxAPILinux.cpp
%%DATADIR%%/samples/Makefile
%%WEB%%%%DATADIR%%/sdk/bindings/webservice/vboxweb.wsdl
%%WEB%%%%DATADIR%%/sdk/bindings/webservice/vboxwebService.wsdl
%%WEBSERVICE%%%%DATADIR%%/sdk/bindings/webservice/vboxweb.wsdl
%%WEBSERVICE%%%%DATADIR%%/sdk/bindings/webservice/vboxwebService.wsdl
include/virtualbox/VBoxCAPI_v2_2.h
include/virtualbox/VBoxCAPI_v3_0.h
include/virtualbox/VBoxCAPI_v3_1.h
include/virtualbox/VBoxCAPI_v3_2.h
include/virtualbox/VBoxCAPI_v4_0.h
include/virtualbox/VBoxCAPI_v4_1.h
include/virtualbox/VBoxCAPI_v4_2.h
include/virtualbox/VirtualBox_XPCOM.h
include/virtualbox/ipcIClientObserver.h
include/virtualbox/ipcIDConnectService.h
@ -610,13 +619,17 @@ include/virtualbox/xpcom/xpcom-config.h
@dirrm include/virtualbox/nsprpub
@dirrm include/virtualbox/ipcd
@dirrm include/virtualbox
%%VNC%%@dirrm lib/virtualbox/ExtensionPacks/VNC/%%ARCH%%
%%VNC%%@dirrm lib/virtualbox/ExtensionPacks/VNC
%%VNC%%@dirrmtry lib/virtualbox/ExtensionPacks
%%NLS%%@dirrm %%DATADIR%%/nls
%%WEB%%@dirrm %%DATADIR%%/sdk/bindings/webservice
%%WEB%%@dirrm %%DATADIR%%/sdk/bindings
%%WEB%%@dirrm %%DATADIR%%/sdk
%%WEBSERVICE%%@dirrm %%DATADIR%%/sdk/bindings/webservice
%%WEBSERVICE%%@dirrm %%DATADIR%%/sdk/bindings
%%WEBSERVICE%%@dirrm %%DATADIR%%/sdk
@dirrm %%DATADIR%%/samples
@dirrm %%DATADIR%%/idl
@dirrm %%DATADIR%%
@dirrmtry %%DATADIR%%
%%QT4%%@dirrmtry share/applications
@dirrm lib/virtualbox/components
%%GUESTADDITIONS%%@dirrm lib/virtualbox/additions
@dirrm lib/virtualbox
@dirrmtry lib/virtualbox