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