Currently VBoxNetAdp does not support VIMAGE on FreeBSD hosts. If you
try to enable it you get a panic like this:
#0 doadump (textdump=-2022600704) at pcpu.h:244
#1 0x8051af69 in db_fncall (dummy1=1, dummy2=0, dummy3=-2127583648,
dummy4=0xdcb61838 "")
at /home/golub/freebsd/base/head/sys/ddb/db_command.c:573
#2 0x8051b361 in db_command (last_cmdp=0x811221fc, cmd_table=0x0,
dopager=1)
at /home/golub/freebsd/base/head/sys/ddb/db_command.c:449
#3 0x8051b4ba in db_command_loop () at
/home/golub/freebsd/base/head/sys/ddb/db_command.c:502
#4 0x8051d4ad in db_trap (type=12, code=0)
at /home/golub/freebsd/base/head/sys/ddb/db_main.c:229
#5 0x80a81d96 in kdb_trap (type=12, code=0, tf=0xdcb61ad4)
at /home/golub/freebsd/base/head/sys/kern/subr_kdb.c:629
#6 0x80dd22af in trap_fatal (frame=0xdcb61ad4, eva=24)
at /home/golub/freebsd/base/head/sys/i386/i386/trap.c:1014
#7 0x80dd2387 in trap_pfault (frame=0xdcb61ad4, usermode=0, eva=24)
at /home/golub/freebsd/base/head/sys/i386/i386/trap.c:835
#8 0x80dd3451 in trap (frame=0xdcb61ad4)
at /home/golub/freebsd/base/head/sys/i386/i386/trap.c:547
#9 0x80dbccac in calltrap () at
/home/golub/freebsd/base/head/sys/i386/i386/exception.s:169
#10 0x80b0633e in ifindex_alloc_locked (idxp=0xdcb61b56)
at /home/golub/freebsd/base/head/sys/net/if.c:279
#11 0x80b09172 in if_alloc (type=6 '\006') at
/home/golub/freebsd/base/head/sys/net/if.c:435
#12 0x8b01e8e7 in vboxNetAdpOsCreate () from
/boot/modules/vboxnetadp.ko
#13 0x8b01ef00 in vboxNetAdpCreate () from /boot/modules/vboxnetadp.ko
#14 0x8b01ecd8 in VBoxNetAdpFreeBSDCtrlioctl () from
/boot/modules/vboxnetadp.ko
#15 0x8095c6bb in devfs_ioctl_f (fp=0x8b6f8118, com=3223352833,
data=0x8b022360,
cred=0x87759b00, td=0x89fdf2e0)
at /home/golub/freebsd/base/head/sys/fs/devfs/devfs_vnops.c:757
#16 0x80a9b4ed in kern_ioctl (td=0x89fdf2e0, fd=3, com=3223352833,
data=0x8b022360 "vboxnet0")
at file.h:287
#17 0x80a9b674 in sys_ioctl (td=0x89fdf2e0, uap=0xdcb61cec)
at /home/golub/freebsd/base/head/sys/kern/sys_generic.c:691
#18 0x80dd29ae in syscall (frame=0xdcb61d28) at subr_syscall.c:135
The attached patch adds support for VIMAGE to VBoxNetAdp and thus
also fixes that panic.
The Author agrees that the patch is under MIT License.
Author: Mikolaj Golub <trociny at freebsd.org>
Reference:
http://lists.freebsd.org/pipermail/freebsd-emulation/2012-April/009646.html
--
Bernhard Fröhlich
http://www.bluelife.at/
diff -rpu VirtualBox-4.1.10.orig/src/VBox/HostDrivers/VBoxNetAdp/freebsd/Makefile VirtualBox-4.1.10/src/VBox/HostDrivers/VBoxNetAdp/freebsd/Makefile
--- VirtualBox-4.1.10.orig/src/VBox/HostDrivers/VBoxNetAdp/freebsd/Makefile 2012-03-13 15:15:44.000000000 +0200
+++ VirtualBox-4.1.10/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
--- VirtualBox-4.1.10.orig/src/VBox/HostDrivers/VBoxNetAdp/freebsd/VBoxNetAdp-freebsd.c 2012-03-13 15:15:44.000000000 +0200
+++ VirtualBox-4.1.10/src/VBox/HostDrivers/VBoxNetAdp/freebsd/VBoxNetAdp-freebsd.c 2012-04-01 13:23:58.000000000 +0300
@@ -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 @@ int vboxNetAdpOsCreate(PVBOXNETADP pThis
{
struct ifnet *ifp;
+ VBOXCURVNET_SET_FROM_UCRED();
ifp = if_alloc(IFT_ETHER);
if (ifp == NULL)
return VERR_NO_MEMORY;
@@ -279,6 +296,7 @@ int vboxNetAdpOsCreate(PVBOXNETADP pThis
strncpy(pThis->szName, ifp->if_xname, VBOXNETADP_MAX_NAME_LEN);
pThis->u.s.ifp = ifp;
+ VBOXCURVNET_RESTORE();
return 0;
}
@@ -286,7 +304,9 @@ void vboxNetAdpOsDestroy(PVBOXNETADP pTh
{
struct ifnet *ifp;
+ VBOXCURVNET_SET(ifp->if_vnet);
ifp = pThis->u.s.ifp;
ether_ifdetach(ifp);
if_free(ifp);
+ VBOXCURVNET_RESTORE();
}
_______________________________________________
vbox-dev mailing list
[email protected]
https://www.virtualbox.org/mailman/listinfo/vbox-dev