Hi,

attached patch attempts to nudge VirtualBox just a bit closer to having
functional guest additions on FreeBSD platform. It contains some fixups
to get VBoxGuest driver and VBoxSvc binary to compile and link. I also
created a simple DRM driver for FreeBSD patterned after existing
drivers for Linux and Solaris and tdfx driver in FreeBSD kernel.

The next step would be to make sure that above drivers actually work.
This will be the subject of follow-up patches.

I had to disable vboxvfs driver for now as it needs more work and is
further away from completion.

While here, I also would like to know what FreeBSD guests VirtualBox
would like to support. I am concentrating on FreeBSD 9-current, 8 and 7
and do not plan to do anything special for FreeBSD 6.x. I hope that is
OK.

If you find the patch useful, feel free to integrate the changes under
any license you like.

http://people.freebsd.org/~kan/vbox_1.diff
-- 
Alexander Kabaev
Index: Config.kmk
===================================================================
--- Config.kmk	(revision 22424)
+++ Config.kmk	(working copy)
@@ -205,8 +205,7 @@
 
 # This indicates that additions (of some kind or another) is being _built_.
 # VBOX_WITHOUT_ADDITIONS overrides it.
-#if1of ($(KBUILD_TARGET), freebsd linux os2 solaris win)
-if1of ($(KBUILD_TARGET), linux solaris win)
+if1of ($(KBUILD_TARGET), freebsd linux os2 solaris win)
  VBOX_WITH_ADDITIONS = 1
 endif
 # Build the optional ring-0 part of the additions for syntax checking.
@@ -3533,6 +3532,9 @@
 	$(VBOX_LIB_VBGL_R3_SHARED) \
 	$(VBOX_LIB_IPRT_GUEST_R3_MINI) \
 	$(VBOX_LIB_VBGL_R3_SHARED)
+if1of ($(KBUILD_TARGET), freebsd)
+ TEMPLATE_VBOXGUESTR3XORGMOD_LIBS += iconv
+endif
 
 
 #
Index: src/VBox/Additions/common/VBoxService/VBoxServiceVMInfo.cpp
===================================================================
--- src/VBox/Additions/common/VBoxService/VBoxServiceVMInfo.cpp	(revision 22424)
+++ src/VBox/Additions/common/VBoxService/VBoxServiceVMInfo.cpp	(working copy)
@@ -33,10 +33,10 @@
 # define __STDC_LIMIT_MACROS
 # include <arpa/inet.h>
 # include <errno.h>
-# include <net/if.h>
 # include <netinet/in.h>
 # include <sys/ioctl.h>
 # include <sys/socket.h>
+# include <net/if.h>
 # include <unistd.h>
 # include <utmp.h>
 # ifdef RT_OS_SOLARIS
@@ -235,6 +235,8 @@
 
         ::LsaFreeReturnBuffer(pSessions);
  #endif /* TARGET_NT4 */
+#elif defined(RT_OS_FREEBSD)
+	/* TODO: Port me */
 #else
         utmp* ut_user;
         rc = utmpname(UTMP_FILE);
@@ -377,7 +379,7 @@
                 VBoxServiceError("Failed to ioctl(SIOCGIFBRDADDR) on socket: Error %d\n", errno);
                 return -1;
             }
- #ifdef RT_OS_SOLARIS
+ #if defined(RT_OS_SOLARIS) || defined(RT_OS_FREEBSD)
             pAddress = (sockaddr_in *)&ifrequest[i].ifr_addr;
  #else
             pAddress = (sockaddr_in *)&ifrequest[i].ifr_netmask;
Index: src/VBox/Additions/common/VBoxGuest/VBoxGuest-freebsd.c
===================================================================
--- src/VBox/Additions/common/VBoxGuest/VBoxGuest-freebsd.c	(revision 22424)
+++ src/VBox/Additions/common/VBoxGuest/VBoxGuest-freebsd.c	(working copy)
@@ -30,7 +30,6 @@
 #include <sys/module.h>
 #include <sys/bus.h>
 #include <sys/queue.h>
-#include <sys/lockmgr.h>
 #include <sys/types.h>
 #include <sys/conf.h>
 #include <sys/malloc.h>
@@ -41,7 +40,9 @@
 #include <machine/resource.h>
 #include <dev/pci/pcivar.h>
 #include <dev/pci/pcireg.h>
-
+#ifdef PVM
+#  undef PVM
+#endif
 #include "VBoxGuestInternal.h"
 #include <VBox/log.h>
 #include <iprt/assert.h>
@@ -162,7 +163,7 @@
     if (rc)
     {
         *ppDev = make_dev(&g_VBoxGuestFreeBSDChrDevSW,
-                          unit2minor(iUnit),
+                          iUnit,
                           UID_ROOT,
                           GID_WHEEL,
                           0644,
@@ -343,12 +344,12 @@
     return rc;
 }
 
-static ssize_t VBoxGuestFreeBSDWrite (struct cdev *pDev, struct uio *pUio, int fIo)
+static int VBoxGuestFreeBSDWrite (struct cdev *pDev, struct uio *pUio, int fIo)
 {
     return 0;
 }
 
-static ssize_t VBoxGuestFreeBSDRead (struct cdev *pDev, struct uio *pUio, int fIo)
+static int VBoxGuestFreeBSDRead (struct cdev *pDev, struct uio *pUio, int fIo)
 {
     return 0;
 }
Index: src/VBox/Additions/common/VBoxGuest/Makefile.kmk
===================================================================
--- src/VBox/Additions/common/VBoxGuest/Makefile.kmk	(revision 22424)
+++ src/VBox/Additions/common/VBoxGuest/Makefile.kmk	(working copy)
@@ -42,7 +42,7 @@
  VBoxGuest_DEPS.solaris += $(VBOX_SVN_REV_KMK)
  VBoxGuest_DEFS          = VBGL_VBOXGUEST VBOX_WITH_HGCM
  VBoxGuest_INCS          = .
- VBoxGuest_INCS.freebsd  = $(PATH_VBoxGuest)
+ VBoxGuest_INCS.freebsd  = $(PATH_VBoxGuest) /XXXKAN
  VBoxGuest_INCS.linux    = ../../../Runtime/r0drv/linux
  ifneq ($(KBUILD_TARGET),os2)
   ifn1of ($(KBUILD_TARGET), linux freebsd solaris)
@@ -54,11 +54,11 @@
   VBoxGuest_LIBS          = \
   	$(VBOX_LIB_VBGL_R0BASE) \
   	$(VBOX_LIB_IPRT_GUEST_R0)
-  VBoxGuest_INTERMEDIATES.freebsd = \
+  VBoxGuest_DEPS.freebsd = \
   	$(PATH_VBoxGuest)/pci_if.h \
   	$(PATH_VBoxGuest)/bus_if.h \
   	$(PATH_VBoxGuest)/device_if.h
-  VBoxGuest_CLEAN.freebsd = $(VBoxGuest_INTERMEDIATES.freebsd)
+  VBoxGuest_CLEAN.freebsd = $(VBoxGuest_DEPS.freebsd)
 
  else # OS/2:
   # The library order is crucial, so a bit of trickery is necessary.
@@ -100,18 +100,21 @@
   VBOX_AWK := /usr/bin/awk
   $$(PATH_VBoxGuest)/bus_if.h: $(VBOX_FREEBSD_SRC)/kern/bus_if.m
 	$(call MSG_TOOL,awk,VBoxGuest,$<,$@)
+	$(QUIET)$(MKDIR) -p $(PATH_VBoxGuest)
 	$(QUIET)$(CP) -f $(VBOX_FREEBSD_SRC)/kern/bus_if.m $(PATH_VBoxGuest)/bus_if.m
 	$(QUIET)$(VBOX_AWK) -f $(VBOX_FREEBSD_SRC)/tools/makeobjops.awk $(PATH_VBoxGuest)/bus_if.m -h -p
 	$(QUIET)$(RM) $(PATH_VBoxGuest)/bus_if.m
 
   $$(PATH_VBoxGuest)/device_if.h: $(VBOX_FREEBSD_SRC)/kern/device_if.m
 	$(call MSG_TOOL,awk,VBoxGuest,$<,$@)
+	$(QUIET)$(MKDIR) -p $(PATH_VBoxGuest)
 	$(QUIET)$(CP) -f $(VBOX_FREEBSD_SRC)/kern/device_if.m $(PATH_VBoxGuest)/device_if.m
 	$(QUIET)$(VBOX_AWK) -f $(VBOX_FREEBSD_SRC)/tools/makeobjops.awk $(PATH_VBoxGuest)/device_if.m -h -p
 	$(QUIET)$(RM) $(PATH_VBoxGuest)/device_if.m
 
   $$(PATH_VBoxGuest)/pci_if.h: $(VBOX_FREEBSD_SRC)/dev/pci/pci_if.m
 	$(call MSG_TOOL,awk,VBoxGuest,$<,$@)
+	$(QUIET)$(MKDIR) -p $(PATH_VBoxGuest)
 	$(QUIET)$(CP) -f $(VBOX_FREEBSD_SRC)/dev/pci/pci_if.m $(PATH_VBoxGuest)/pci_if.m
 	$(QUIET)$(VBOX_AWK) -f $(VBOX_FREEBSD_SRC)/tools/makeobjops.awk $(PATH_VBoxGuest)/pci_if.m -h -p
 	$(QUIET)$(RM) $(PATH_VBoxGuest)/pci_if.m
Index: src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3Lib.cpp
===================================================================
--- src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3Lib.cpp	(revision 22424)
+++ src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3Lib.cpp	(working copy)
@@ -199,7 +199,7 @@
     char szDevice[RT_MAX(sizeof(VBOXGUEST_DEVICE_NAME), sizeof(VBOXGUEST_USER_DEVICE_NAME)) + 16];
     for (unsigned iUnit = 0; iUnit < 1024; iUnit++)
     {
-        RTStrPrintf(szDevice, sizeof(szDevice), pszDeviceName "%d", iUnit);
+        RTStrPrintf(szDevice, sizeof(szDevice), "%s%d", pszDeviceName, iUnit);
 # if defined(VBOX_VBGLR3_XFREE86)
         File = xf86open(szDevice, XF86_O_RDWR);
         if (File >= 0)
Index: src/VBox/Additions/freebsd/drm/vboxvideo_drm.c
===================================================================
--- src/VBox/Additions/freebsd/drm/vboxvideo_drm.c	(revision 0)
+++ src/VBox/Additions/freebsd/drm/vboxvideo_drm.c	(revision 0)
@@ -0,0 +1,120 @@
+/*-
+ * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
+ * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Authors:
+ *    Rickard E. (Rik) Faith <fa...@valinux.com>
+ *    Daryll Strauss <dar...@valinux.com>
+ *    Gareth Hughes <gar...@valinux.com>
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "dev/drm/drmP.h"
+#include "dev/drm/drm_pciids.h"
+
+#define DRIVER_AUTHOR                   "Sun Microsystems Inc."
+#define DRIVER_NAME                     "vboxvideo"
+#define DRIVER_DESC                     "VirtualBox DRM"
+#define DRIVER_DATE                     "20090317"
+#define DRIVER_MAJOR                    1
+#define DRIVER_MINOR                    0
+#define DRIVER_PATCHLEVEL               0
+
+#define vboxvideo_PCI_IDS           { 0x80ee, 0xbeef, 0, "VirtualBox Video" }, \
+                                    { 0, 0, 0, NULL }
+
+static drm_pci_id_list_t vboxvideo_pciidlist[] = {
+	vboxvideo_PCI_IDS
+};
+
+static void vboxvideo_configure(struct drm_device *dev)
+{
+	dev->driver->buf_priv_size	= 1; /* No dev_priv */
+
+	dev->driver->max_ioctl		= 0;
+
+	dev->driver->name		= DRIVER_NAME;
+	dev->driver->desc		= DRIVER_DESC;
+	dev->driver->date		= DRIVER_DATE;
+	dev->driver->major		= DRIVER_MAJOR;
+	dev->driver->minor		= DRIVER_MINOR;
+	dev->driver->patchlevel		= DRIVER_PATCHLEVEL;
+}
+
+static int
+vboxvideo_probe(device_t kdev)
+{
+	return drm_probe(kdev, vboxvideo_pciidlist);
+}
+
+static int
+vboxvideo_attach(device_t kdev)
+{
+	struct drm_device *dev = device_get_softc(kdev);
+
+	dev->driver = malloc(sizeof(struct drm_driver_info), DRM_MEM_DRIVER,
+	    M_WAITOK | M_ZERO);
+
+	vboxvideo_configure(dev);
+
+	return drm_attach(kdev, vboxvideo_pciidlist);
+}
+
+static int
+vboxvideo_detach(device_t kdev)
+{
+	struct drm_device *dev = device_get_softc(kdev);
+	int ret;
+
+	ret = drm_detach(kdev);
+
+	free(dev->driver, DRM_MEM_DRIVER);
+
+	return ret;
+}
+
+static device_method_t vboxvideo_methods[] = {
+	/* Device interface */
+	DEVMETHOD(device_probe,		vboxvideo_probe),
+	DEVMETHOD(device_attach,	vboxvideo_attach),
+	DEVMETHOD(device_detach,	vboxvideo_detach),
+
+	{ 0, 0 }
+};
+
+static driver_t vboxvideo_driver = {
+	"drm",
+	vboxvideo_methods,
+	sizeof(struct drm_device)
+};
+
+extern devclass_t drm_devclass;
+#if __FreeBSD_version >= 700010
+DRIVER_MODULE(vboxvideo, vgapci, vboxvideo_driver, drm_devclass, 0, 0);
+#else
+DRIVER_MODULE(vboxvideo, pci, vboxvideo_driver, drm_devclass, 0, 0);
+#endif
+MODULE_DEPEND(vboxvideo, drm, 1, 1, 1);

Index: src/VBox/Additions/freebsd/drm/Makefile.kmk
===================================================================
--- src/VBox/Additions/freebsd/drm/Makefile.kmk	(revision 0)
+++ src/VBox/Additions/freebsd/drm/Makefile.kmk	(revision 0)
@@ -0,0 +1,83 @@
+# $Id: Makefile.kmk 18057 2009-03-18 12:31:39Z vboxsync $
+## @file
+# Sub-Makefile for the vboxvideo DRM module (FreeBSD kernel OpenGL module).
+#
+
+#
+# Copyright (C) 2009 Sun Microsystems, Inc.
+#
+# 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.
+#
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
+# Clara, CA 95054 USA or visit http://www.sun.com if you need
+# additional information or have any questions.
+#
+
+
+SUB_DEPTH = ../../../../..
+include	$(KBUILD_PATH)/subheader.kmk
+
+ifneq ($(KBUILD_HOST),freebsd)
+$(error "The FreeBSD guest additions can only be built on FreeBSD!")
+endif
+
+#
+# vboxvideo - The Video DRM (Direct Rendering Module) kernel module
+#
+SYSMODS.freebsd        += vboxvideo
+vboxvideo_TEMPLATE      = VBOXGUESTR0
+vboxvideo_DEFS          = VBOX_WITH_HGCM VBOX_SVN_REV=$(VBOX_SVN_REV)
+vboxvideo_DEPS         += $(VBOX_SVN_REV_KMK)
+vboxvideo_INCS.freebsd  = $(PATH_vboxvideo)
+vboxvideo_SOURCES       = \
+	vboxvideo_drm.c
+vboxvideo_LIBS          = \
+	$(VBOX_LIB_VBGL_R0) \
+	$(VBOX_LIB_IPRT_GUEST_R0)
+vboxvideo_DEPS         += \
+	$(PATH_vboxvideo)/pci_if.h \
+	$(PATH_vboxvideo)/bus_if.h \
+	$(PATH_vboxvideo)/device_if.h \
+	$(PATH_vboxvideo)/opt_drm.h
+vboxvideo_CLEAN.freebsd = $(vboxvideo_DEPS)
+
+#
+# FreeBSD: Genereate bus, device and pci interface headers. (explain why)
+#
+# We cannot give a output path to the awk program, it will always generate
+# the header next to the source. So, we'll have to temporarily copy the
+# source file to the destination direction for it to work out correctly.
+#
+VBOX_AWK := /usr/bin/awk
+$$(PATH_vboxvideo)/bus_if.h: $(VBOX_FREEBSD_SRC)/kern/bus_if.m
+	$(call MSG_TOOL,awk,vboxvideo,$<,$@)
+	$(QUIET)$(MKDIR) -p $(PATH_vboxvideo)
+	$(QUIET)$(CP) -f $(VBOX_FREEBSD_SRC)/kern/bus_if.m $(PATH_vboxvideo)/bus_if.m
+	$(QUIET)$(VBOX_AWK) -f $(VBOX_FREEBSD_SRC)/tools/makeobjops.awk $(PATH_vboxvideo)/bus_if.m -h -p
+	$(QUIET)$(RM) $(PATH_vboxvideo)/bus_if.m
+
+$$(PATH_vboxvideo)/device_if.h: $(VBOX_FREEBSD_SRC)/kern/device_if.m
+	$(call MSG_TOOL,awk,vboxvideo,$<,$@)
+	$(QUIET)$(MKDIR) -p $(PATH_vboxvideo)
+	$(QUIET)$(CP) -f $(VBOX_FREEBSD_SRC)/kern/device_if.m $(PATH_vboxvideo)/device_if.m
+	$(QUIET)$(VBOX_AWK) -f $(VBOX_FREEBSD_SRC)/tools/makeobjops.awk $(PATH_vboxvideo)/device_if.m -h -p
+	$(QUIET)$(RM) $(PATH_vboxvideo)/device_if.m
+
+$$(PATH_vboxvideo)/pci_if.h: $(VBOX_FREEBSD_SRC)/dev/pci/pci_if.m
+	$(call MSG_TOOL,awk,vboxvideo,$<,$@)
+	$(QUIET)$(MKDIR) -p $(PATH_vboxvideo)
+	$(QUIET)$(CP) -f $(VBOX_FREEBSD_SRC)/dev/pci/pci_if.m $(PATH_vboxvideo)/pci_if.m
+	$(QUIET)$(VBOX_AWK) -f $(VBOX_FREEBSD_SRC)/tools/makeobjops.awk $(PATH_vboxvideo)/pci_if.m -h -p
+	$(QUIET)$(RM) $(PATH_vboxvideo)/pci_if.m
+
+$$(PATH_vboxvideo)/opt_drm.h:
+	$(QUIET)$(MKDIR) -p $(PATH_vboxvideo)
+	$(QUIET)touch $(PATH_vboxvideo)/opt_drm.h
+
+include	$(KBUILD_PATH)/subfooter.kmk

Index: src/VBox/Additions/freebsd/Makefile.kmk
===================================================================
--- src/VBox/Additions/freebsd/Makefile.kmk	(revision 22424)
+++ src/VBox/Additions/freebsd/Makefile.kmk	(working copy)
@@ -27,7 +27,8 @@
 endif
 
 # Include sub-makefiles.
-include $(PATH_SUB_CURRENT)/vboxvfs/Makefile.kmk
+#include $(PATH_SUB_CURRENT)/vboxvfs/Makefile.kmk
+include $(PATH_SUB_CURRENT)/drm/Makefile.kmk
 
 # Globals
 VBOX_FBSD_ADD_INS_OUT_DIR := $(PATH_TARGET)/Additions/FreeBSD/Installer
@@ -59,6 +60,8 @@
 		$(VBOX_PATH_X11_ADDITION_INSTALLER)/98vboxadd-xclient \
 		$(VBOX_PATH_X11_ADDITION_INSTALLER)/x11config.pl \
 		$(PATH_BIN)/additions/vboxguest.ko \
+		$(PATH_BIN)/additions/vboxvideo.ko \
 		$(PATH_BIN)/additions/VBoxClient \
 		$(PATH_BIN)/additions/VBoxService \
 		$(PATH_BIN)/additions/VBoxControl \

Attachment: signature.asc
Description: PGP signature

_______________________________________________
vbox-dev mailing list
vbox-dev@virtualbox.org
http://vbox.innotek.de/mailman/listinfo/vbox-dev

Reply via email to