Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
--- src/VBox/Additions/freebsd/mount_vboxvfs/mount_vboxvfs.c.orig 1970-01-01 01:00:00.000000000 +0100
+++ src/VBox/Additions/freebsd/mount_vboxvfs/mount_vboxvfs.c 2017-07-12 19:24:26.106029000 +0200
@@ -0,0 +1,168 @@
+/*
+* Copyright (c) 1992, 1993, 1994
+* The Regents of the University of California. All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+* 1. Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+* 2. Redistributions in binary form must reproduce the above copyright
+* notice, this list of conditions and the following disclaimer in the
+* documentation and/or other materials provided with the distribution.
+* 4. Neither the name of the University nor the names of its contributors
+* may be used to endorse or promote products derived from this software
+* without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+* SUCH DAMAGE.
+*/
+
+#include <sys/cdio.h>
+#include <sys/stat.h>
+#include <sys/file.h>
+#include <sys/iconv.h>
+#include <sys/param.h>
+#include <sys/linker.h>
+#include <sys/module.h>
+#include <sys/mount.h>
+#include <sys/uio.h>
+
+#include <err.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <sysexits.h>
+#include <unistd.h>
+
+#include "mntopts.h"
+
+#define MAX_HOST_NAME 256
+static char mount_point[MAXPATHLEN + 1];
+static char vboxfs_vfsname[] = "vboxvfs";
+static struct mntopt mopts[] = {
+ MOPT_STDOPTS,
+ MOPT_END
+};
+
+static void usage(void) __dead2;
+
+static void
+usage(void)
+{
+ fprintf(stderr,
+ "Usage: [OPTIONS] NAME MOUNTPOINT\n"
+ "Mount the VirtualBox shared folder NAME to MOUNTPOINT.\n"
+ "\nOptions:\n"
+ " -w mount the shared folder writable \n"
+ " -r mount the shared folder read-only (the default)\n");
+ exit(1);
+}
+
+int
+main(int argc, char *argv[])
+{
+ struct iovec *iov;
+ struct stat st;
+ char *host_name;
+ char errmsg[255];
+ uid_t uid;
+ gid_t gid;
+ mode_t dir_mode, file_mode;
+ int iovlen;
+ int ronly = 0;
+ int error, ch;
+ int mntflags = 0;
+
+ iov = NULL;
+ iovlen = 0;
+ errmsg[0] = '\0';
+ uid = (uid_t)-1;
+ gid = (gid_t)-1;
+ file_mode = 0;
+ dir_mode = 0;
+
+ while ((ch = getopt(argc, argv, "rwo:h")) != -1)
+ switch(ch) {
+ default:
+ fprintf(stderr, "unknown option `%c:%#x'\n", ch, ch);
+ return (1);
+
+ case '?':
+ case 'h':
+ usage();
+ case 'r':
+ ronly = 1;
+ break;
+ case 'w':
+ ronly = 0;
+ break;
+ case 'o':
+ getmntopts(optarg, mopts, &mntflags, 0);
+ break;
+ }
+
+ if (argc - optind < 2)
+ usage();
+
+ host_name = argv[optind];
+ realpath(argv[optind+1], mount_point);
+
+ if (stat(mount_point, &st) == -1)
+ err(EX_OSERR, "could not find mount point %s", mount_point);
+
+ if (!S_ISDIR(st.st_mode)) {
+ errno = ENOTDIR;
+ err(EX_OSERR, "can't mount on %s", mount_point);
+ }
+
+ if (strlen(host_name) > MAX_HOST_NAME - 1)
+ err(EX_OSERR, "host name is too big %s", host_name);
+
+ if (ronly == 0)
+ mntflags |= MNT_ASYNC;
+ if (uid == (uid_t)-1)
+ uid = st.st_uid;
+ if (gid == (gid_t)-1)
+ gid = st.st_gid;
+ if (file_mode == 0)
+ file_mode = st.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO);
+ if (dir_mode == 0) {
+ dir_mode = file_mode;
+ if (dir_mode & S_IRUSR)
+ dir_mode |= S_IXUSR;
+ if (dir_mode & S_IRGRP)
+ dir_mode |= S_IXGRP;
+ if (dir_mode & S_IROTH)
+ dir_mode |= S_IXOTH;
+ }
+
+ build_iovec(&iov, &iovlen, "fstype", vboxfs_vfsname, (size_t)-1);
+ build_iovec(&iov, &iovlen, "fspath", mount_point, (size_t)-1);
+ build_iovec(&iov, &iovlen, "from", host_name, (size_t)-1);
+ build_iovec_argf(&iov, &iovlen, "uid", "%d", uid);
+ build_iovec_argf(&iov, &iovlen, "gid", "%d", gid);
+ build_iovec_argf(&iov, &iovlen, "file_mode", "%o", file_mode);
+ build_iovec_argf(&iov, &iovlen, "dir_mode", "%o", dir_mode);
+ build_iovec(&iov, &iovlen, "errmsg", errmsg, sizeof(errmsg));
+
+ error = nmount(iov, iovlen, mntflags);
+ if (error == -1) {
+ if (errmsg[0] != '\0')
+ err(1, "%s: error: %s", mount_point, errmsg);
+ else
+ err(1, "%s: error %d", mount_point, error);
+ }
+
+ return (0);
+}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
--- src/VBox/Additions/freebsd/vboxvfs/Makefile.kmk.orig 2017-04-28 16:59:22.000000000 +0200
+++ src/VBox/Additions/freebsd/vboxvfs/Makefile.kmk 2017-07-13 00:52:49.020669620 +0200
@@ -33,32 +33,36 @@
$(vboxvfs_0_OUTDIR)
vboxvfs_SOURCES = \
vboxvfs_vfsops.c \
- vboxvfs_vnops.c
+ vboxvfs_vnops.c \
+ vboxvfs_prov.c
vboxvfs_LIBS = \
$(VBOX_LIB_VBGL_R0) \
$(VBOX_LIB_IPRT_GUEST_R0)
vboxvfs_DEPS = \
- $$(vboxvfs_0_OUTDIR)/vnode_if.h \
- $$(vboxvfs_0_OUTDIR)/vnode_if_newproto.h \
- $$(vboxvfs_0_OUTDIR)/vnode_if_typedef.h
+ $(vboxvfs_0_OUTDIR)/vnode_if.h \
+ $(vboxvfs_0_OUTDIR)/vnode_if_newproto.h \
+ $(vboxvfs_0_OUTDIR)/vnode_if_typedef.h
vboxvfs_CLEAN += $(vboxvfs_DEPS)

VBOX_AWK := /usr/bin/awk

-$$(vboxvfs_0_OUTDIR)/vnode_if.h: $(VBOX_FREEBSD_SRC)/kern/vnode_if.src
+$$(vboxvfs_0_OUTDIR):
+ $(QUIET)$(MKDIR) -p $(vboxvfs_0_OUTDIR)
+
+$$(vboxvfs_0_OUTDIR)/vnode_if.h: $$(vboxvfs_0_OUTDIR) $(VBOX_FREEBSD_SRC)/kern/vnode_if.src
$(call MSG_TOOL,awk,VBoxGuest,$<,$@)
$(QUIET)$(VBOX_AWK) -f $(VBOX_FREEBSD_SRC)/tools/vnode_if.awk $(VBOX_FREEBSD_SRC)/kern/vnode_if.src -h
- $(QUIET)$(MV) $(vboxvfs_0_OUTDIR)/vnode_if.h $(vboxvfs_0_OUTDIR)/vnode_if.h
+ $(QUIET)$(MV) vnode_if.h $(vboxvfs_0_OUTDIR)/vnode_if.h

-$$(vboxvfs_0_OUTDIR)/vnode_if_newproto.h: $(VBOX_FREEBSD_SRC)/kern/vnode_if.src
+$$(vboxvfs_0_OUTDIR)/vnode_if_newproto.h: $$(vboxvfs_0_OUTDIR) $(VBOX_FREEBSD_SRC)/kern/vnode_if.src
$(call MSG_TOOL,awk,VBoxGuest,$<,$@)
$(QUIET)$(VBOX_AWK) -f $(VBOX_FREEBSD_SRC)/tools/vnode_if.awk $(VBOX_FREEBSD_SRC)/kern/vnode_if.src -p
- $(QUIET)$(MV) $(vboxvfs_0_OUTDIR)/vnode_if_newproto.h $(vboxvfs_0_OUTDIR)/vnode_if_newproto.h
+ $(QUIET)$(MV) vnode_if_newproto.h $(vboxvfs_0_OUTDIR)/vnode_if_newproto.h

-$$(vboxvfs_0_OUTDIR)/vnode_if_typedef.h: $(VBOX_FREEBSD_SRC)/kern/vnode_if.src
+$$(vboxvfs_0_OUTDIR)/vnode_if_typedef.h: $$(vboxvfs_0_OUTDIR) $(VBOX_FREEBSD_SRC)/kern/vnode_if.src
$(call MSG_TOOL,awk,VBoxGuest,$<,$@)
$(QUIET)$(VBOX_AWK) -f $(VBOX_FREEBSD_SRC)/tools/vnode_if.awk $(VBOX_FREEBSD_SRC)/kern/vnode_if.src -q
- $(QUIET)$(MV) $(vboxvfs_0_OUTDIR)/vnode_if_typedef.h $(vboxvfs_0_OUTDIR)/vnode_if_typedef.h
+ $(QUIET)$(MV) vnode_if_typedef.h $(vboxvfs_0_OUTDIR)/vnode_if_typedef.h

include $(FILE_KBUILD_SUB_FOOTER)

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
--- src/VBox/Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c.orig 2017-04-28 15:04:48 UTC
+++ src/VBox/Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c
@@ -121,16 +121,15 @@ DECLHIDDEN(int) rtR0MemObjNativeFree(RTR

case RTR0MEMOBJTYPE_LOCK:
{
- 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.Lock.R0Process != NIL_RTR0PROCESS) {
+ vm_map_t pMap = &((struct proc *)pMemFreeBSD->Core.u.Lock.R0Process)->p_vmspace->vm_map;

- rc = vm_map_unwire(pMap,
+ rc = vm_map_unwire(pMap,
(vm_offset_t)pMemFreeBSD->Core.pv,
(vm_offset_t)pMemFreeBSD->Core.pv + pMemFreeBSD->Core.cb,
VM_MAP_WIRE_SYSTEM | VM_MAP_WIRE_NOHOLES);
- AssertMsg(rc == KERN_SUCCESS, ("%#x", rc));
+ AssertMsg(rc == KERN_SUCCESS, ("%#x", rc));
+ }
break;
}

@@ -224,18 +223,23 @@ static vm_page_t rtR0MemObjFreeBSDContig
#else
VM_OBJECT_UNLOCK(pObject);
#endif
- if (pPages)
+ if (pPages || cTries >= 1)
break;
+#if __FreeBSD_version >= 1100092
+ if (!vm_page_reclaim_contig(fFlags, cPages, 0, VmPhysAddrHigh, uAlignment, 0))
+ break;
+#elif __FreeBSD_version >= 1000015
vm_pageout_grow_cache(cTries, 0, VmPhysAddrHigh);
+#else
+ vm_contig_grow_cache(cTries, 0, VmPhysAddrHigh);
+#endif
cTries++;
}
-
- return pPages;
#else
- while (cTries <= 1)
+ while (1)
{
pPages = vm_phys_alloc_contig(cPages, 0, VmPhysAddrHigh, uAlignment, 0);
- if (pPages)
+ if (pPages || cTries >= 1)
break;
vm_contig_grow_cache(cTries, 0, VmPhysAddrHigh);
cTries++;
@@ -243,11 +247,8 @@ static vm_page_t rtR0MemObjFreeBSDContig

if (!pPages)
return pPages;
-#if __FreeBSD_version >= 1000030
- VM_OBJECT_WLOCK(pObject);
-#else
+
VM_OBJECT_LOCK(pObject);
-#endif
for (vm_pindex_t iPage = 0; iPage < cPages; iPage++)
{
vm_page_t pPage = pPages + iPage;
@@ -259,13 +260,9 @@ static vm_page_t rtR0MemObjFreeBSDContig
atomic_add_int(&cnt.v_wire_count, 1);
}
}
-#if __FreeBSD_version >= 1000030
- VM_OBJECT_WUNLOCK(pObject);
-#else
VM_OBJECT_UNLOCK(pObject);
#endif
return pPages;
-#endif
}

static int rtR0MemObjFreeBSDPhysAllocHelper(vm_object_t pObject, u_long cPages,
@@ -292,16 +289,17 @@ static int rtR0MemObjFreeBSDPhysAllocHel
#else
VM_OBJECT_LOCK(pObject);
#endif
+
while (iPage-- > 0)
{
pPage = vm_page_lookup(pObject, iPage);
-#if __FreeBSD_version < 1000000
+#if __FreeBSD_version < 900000
vm_page_lock_queues();
#endif
if (fWire)
vm_page_unwire(pPage, 0);
vm_page_free(pPage);
-#if __FreeBSD_version < 1000000
+#if __FreeBSD_version < 900000
vm_page_unlock_queues();
#endif
}
@@ -519,14 +517,19 @@ static int rtR0MemObjNativeLockInMap(PPR
if (!pMemFreeBSD)
return VERR_NO_MEMORY;

- /*
- * We could've used vslock here, but we don't wish to be subject to
- * resource usage restrictions, so we'll call vm_map_wire directly.
- */
- rc = vm_map_wire(pVmMap, /* the map */
- AddrStart, /* start */
- AddrStart + cb, /* end */
- fFlags); /* flags */
+ if (pVmMap != kernel_map) {
+ /*
+ * We could've used vslock here, but we don't wish to be subject to
+ * resource usage restrictions, so we'll call vm_map_wire directly.
+ */
+ rc = vm_map_wire(pVmMap, /* the map */
+ AddrStart, /* start */
+ AddrStart + cb, /* end */
+ fFlags); /* flags */
+ }
+ else
+ rc = KERN_SUCCESS;
+
if (rc == KERN_SUCCESS)
{
pMemFreeBSD->Core.u.Lock.R0Process = R0Process;
@@ -751,7 +754,12 @@ DECLHIDDEN(int) rtR0MemObjNativeMapUser(
{
/** @todo is this needed?. */
PROC_LOCK(pProc);
- AddrR3 = round_page((vm_offset_t)pProc->p_vmspace->vm_daddr + lim_max(pProc, RLIMIT_DATA));
+ AddrR3 = round_page((vm_offset_t)pProc->p_vmspace->vm_daddr +
+#if __FreeBSD_version >= 1100077
+ lim_max_proc(pProc, RLIMIT_DATA));
+#else
+ lim_max(pProc, RLIMIT_DATA));
+#endif
PROC_UNLOCK(pProc);
}
else
@@ -850,11 +858,15 @@ DECLHIDDEN(RTHCPHYS) rtR0MemObjNativeGet

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 = vm_map_pmap(pProcMap);
+ if (pMemFreeBSD->Core.u.Mapping.R0Process != NIL_RTR0PROCESS)
+ {
+ struct proc *pProc = (struct proc *)pMemFreeBSD->Core.u.Lock.R0Process;
+ struct vm_map *pProcMap = &pProc->p_vmspace->vm_map;
+ pmap_t pPhysicalMap = vm_map_pmap(pProcMap);

- return pmap_extract(pPhysicalMap, pb);
+ return pmap_extract(pPhysicalMap, pb);
+ }
+ return vtophys(pb);
}

case RTR0MEMOBJTYPE_MAPPING: