Index: Config.kmk =================================================================== --- Config.kmk (revision 22552) +++ 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. @@ -3539,6 +3538,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/Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c =================================================================== --- src/VBox/Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c (revision 22552) +++ src/VBox/Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c (working copy) @@ -469,7 +469,7 @@ vm_offset_t MapAddress = pvFixed != (void *)-1 ? (vm_offset_t)pvFixed : vm_map_min(pMap); - if (pvFixed) + if (pvFixed != (void *)-1) vm_map_remove(pMap, MapAddress, MapAddress + cb); Index: src/VBox/Additions/common/VBoxService/VBoxServiceVMInfo.cpp =================================================================== --- src/VBox/Additions/common/VBoxService/VBoxServiceVMInfo.cpp (revision 22552) +++ src/VBox/Additions/common/VBoxService/VBoxServiceVMInfo.cpp (working copy) @@ -33,10 +33,10 @@ # define __STDC_LIMIT_MACROS # include # include -# include # include # include # include +# include # include # include # 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 22552) +++ src/VBox/Additions/common/VBoxGuest/VBoxGuest-freebsd.c (working copy) @@ -26,22 +26,24 @@ #include #include +#include #include #include #include +#include +#include #include -#include -#include -#include #include #include #include +#include #include -#include #include #include #include - +#ifdef PVM +# undef PVM +#endif #include "VBoxGuestInternal.h" #include #include @@ -55,8 +57,6 @@ struct VBoxGuestDeviceState { - /** file node minor code */ - unsigned uMinor; /** Resource ID of the I/O port */ int iIOPortResId; /** Pointer to the I/O port resource. */ @@ -93,6 +93,7 @@ static d_ioctl_t VBoxGuestFreeBSDIOCtl; static d_write_t VBoxGuestFreeBSDWrite; static d_read_t VBoxGuestFreeBSDRead; +static d_poll_t VBoxGuestFreeBSDPoll; /* * IRQ related functions. @@ -108,18 +109,23 @@ DECLVBGL(void *) VBoxGuestFreeBSDServiceOpen(uint32_t *pu32Version); DECLVBGL(int) VBoxGuestFreeBSDServiceClose(void *pvSession); +#ifndef D_NEEDMINOR +# define D_NEEDMINOR 0 +#endif + /* * Device node entry points. */ static struct cdevsw g_VBoxGuestFreeBSDChrDevSW = { .d_version = D_VERSION, - .d_flags = D_TRACKCLOSE, + .d_flags = D_TRACKCLOSE | D_NEEDMINOR, .d_fdopen = VBoxGuestFreeBSDOpen, .d_close = VBoxGuestFreeBSDClose, .d_ioctl = VBoxGuestFreeBSDIOCtl, .d_read = VBoxGuestFreeBSDRead, .d_write = VBoxGuestFreeBSDWrite, + .d_poll = VBoxGuestFreeBSDPoll, .d_name = DEVICE_NAME }; @@ -129,8 +135,9 @@ static struct clonedevs *g_pVBoxGuestFreeBSDClones; /** The dev_clone event handler tag. */ static eventhandler_tag g_VBoxGuestFreeBSDEHTag; +/** selinfo structure used for polling. */ +static struct selinfo g_SelInfo; - /** * DEVFS event handler. */ @@ -162,7 +169,7 @@ if (rc) { *ppDev = make_dev(&g_VBoxGuestFreeBSDChrDevSW, - unit2minor(iUnit), + iUnit, UID_ROOT, GID_WHEEL, 0644, @@ -343,23 +350,54 @@ return rc; } -static ssize_t VBoxGuestFreeBSDWrite (struct cdev *pDev, struct uio *pUio, int fIo) +static int VBoxGuestFreeBSDPoll (struct cdev *pDev, int events, struct thread *td) { + int revents; + + LogFlow((DEVICE_NAME "::Poll: fEvents=%d\n", fEvents)); + + PVBOXGUESTSESSION pSession = (PVBOXGUESTSESSION)pDev->si_drv1; + if (RT_UNLIKELY(!VALID_PTR(pSession))) { + Log((DEVICE_NAME "::Poll: no state data for %s\n", devtoname(pDev))); + return (events & (POLLHUP|POLLIN|POLLRDNORM|POLLOUT|POLLWRNORM)); + } + + uint32_t u32CurSeq = ASMAtomicUoReadU32(&g_DevExt.u32MousePosChangedSeq); + if (pSession->u32MousePosChangedSeq != u32CurSeq) + { + revents = events & (POLLIN | POLLRDNORM); + pSession->u32MousePosChangedSeq = u32CurSeq; + } + else + { + revents = 0; + + selrecord(td, &g_SelInfo); + } + + return revents; +} + +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; } static int VBoxGuestFreeBSDDetach(device_t pDevice) { - struct VBoxGuestDeviceState *pState = (struct VBoxGuestDeviceState *)device_get_softc(pDevice); + struct VBoxGuestDeviceState *pState = device_get_softc(pDevice); /* - * Reserve what we did in VBoxGuestFreeBSDAttach. + * Reverse what we did in VBoxGuestFreeBSDAttach. */ + if (g_VBoxGuestFreeBSDEHTag != NULL) + EVENTHANDLER_DEREGISTER(dev_clone, g_VBoxGuestFreeBSDEHTag); + clone_cleanup(&g_pVBoxGuestFreeBSDClones); VBoxGuestFreeBSDRemoveIRQ(pDevice, pState); @@ -371,7 +409,6 @@ VBoxGuestDeleteDevExt(&g_DevExt); - free(pState, M_VBOXDEV); RTR0Term(); return 0; @@ -392,6 +429,16 @@ return fOurIRQ ? 0 : 1; } +void VBoxGuestNativeISRMousePollEvent(PVBOXGUESTDEVEXT pDevExt) +{ + LogFlow((DEVICE_NAME "::NativeISRMousePollEvent:\n")); + + /* + * Wake up poll waiters. + */ + selwakeup(&g_SelInfo); +} + /** * Sets IRQ for VMMDev. * @@ -408,7 +455,9 @@ pState->pIrqRes = bus_alloc_resource_any(pDevice, SYS_RES_IRQ, &iResId, RF_SHAREABLE | RF_ACTIVE); #if __FreeBSD_version >= 700000 - rc = bus_setup_intr(pDevice, pState->pIrqRes, INTR_TYPE_BIO, NULL, (driver_intr_t *)VBoxGuestFreeBSDISR, pState, &pState->pfnIrqHandler); + rc = bus_setup_intr(pDevice, pState->pIrqRes, INTR_TYPE_BIO | INTR_MPSAFE, + NULL, (driver_intr_t *)VBoxGuestFreeBSDISR, pState, + &pState->pfnIrqHandler); #else rc = bus_setup_intr(pDevice, pState->pIrqRes, INTR_TYPE_BIO, (driver_intr_t *)VBoxGuestFreeBSDISR, pState, &pState->pfnIrqHandler); #endif @@ -458,21 +507,13 @@ } pState = device_get_softc(pDevice); - if (!pState) - { - pState = malloc(sizeof(struct VBoxGuestDeviceState), M_VBOXDEV, M_NOWAIT | M_ZERO); - if (!pState) - return ENOMEM; - device_set_softc(pDevice, pState); - } - /* * Allocate I/O port resource. */ iResId = PCIR_BAR(0); pState->pIOPortRes = bus_alloc_resource_any(pDevice, SYS_RES_IOPORT, &iResId, RF_ACTIVE); - pState->uIOPortBase = bus_get_resource_start(pDevice, SYS_RES_IOPORT, iResId); + pState->uIOPortBase = rman_get_start(pState->pIOPortRes); pState->iIOPortResId = iResId; if (pState->uIOPortBase) { @@ -482,17 +523,19 @@ iResId = PCIR_BAR(1); pState->pVMMDevMemRes = bus_alloc_resource_any(pDevice, SYS_RES_MEMORY, &iResId, RF_ACTIVE); pState->VMMDevMemHandle = rman_get_bushandle(pState->pVMMDevMemRes); - pState->VMMDevMemSize = bus_get_resource_count(pDevice, SYS_RES_MEMORY, iResId); + pState->VMMDevMemSize = rman_get_size(pState->pVMMDevMemRes); - pState->pMMIOBase = (void *)pState->VMMDevMemHandle; + pState->pMMIOBase = rman_get_virtual(pState->pVMMDevMemRes); pState->iVMMDevMemResId = iResId; if (pState->pMMIOBase) { /* * Call the common device extension initializer. */ - rc = VBoxGuestInitDevExt(&g_DevExt, pState->uIOPortBase, pState->pMMIOBase, - pState->VMMDevMemSize, VBOXOSTYPE_FreeBSD, 0); + rc = VBoxGuestInitDevExt(&g_DevExt, pState->uIOPortBase, + pState->pMMIOBase, pState->VMMDevMemSize, + VBOXOSTYPE_FreeBSD, + VMMDEV_EVENT_MOUSE_POSITION_CHANGED); if (RT_SUCCESS(rc)) { /* @@ -562,11 +605,6 @@ DRIVER_MODULE(vboxguest, pci, VBoxGuestFreeBSDDriver, VBoxGuestFreeBSDClass, 0, 0); MODULE_VERSION(vboxguest, 1); -#if 0/** @todo This shouldn't be needed. if it is, that means exceptions hasn't been disabled correctly. */ -int __gxx_personality_v0 = 0xdeadbeef; -#endif - - /* Common code that depend on g_DevExt. */ #include "VBoxGuestIDC-unix.c.h" Index: src/VBox/Additions/common/VBoxGuest/Makefile.kmk =================================================================== --- src/VBox/Additions/common/VBoxGuest/Makefile.kmk (revision 22552) +++ src/VBox/Additions/common/VBoxGuest/Makefile.kmk (working copy) @@ -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/crOpenGL/Makefile.kmk =================================================================== --- src/VBox/Additions/common/crOpenGL/Makefile.kmk (revision 22552) +++ src/VBox/Additions/common/crOpenGL/Makefile.kmk (working copy) @@ -35,7 +35,7 @@ VBoxOGLpackspu \ VBoxOGLfeedbackspu -if1of ($(KBUILD_TARGET),linux solaris) +if1of ($(KBUILD_TARGET),linux solaris freebsd) DLLS += \ VBoxOGL \ VBoxOGLarrayspu \ @@ -44,7 +44,7 @@ VBoxOGLfeedbackspu endif -if1of ($(KBUILD_TARGET),linux solaris) +if1of ($(KBUILD_TARGET),linux solaris freebsd) #VBoxOGL_DRI = 1 ifneq ($(KBUILD_TARGET),solaris) # No DRI on Solaris yet VBoxOGL_FAKEDRI = 1 @@ -67,7 +67,7 @@ # VBoxOGL_TEMPLATE = VBOXCROGLR3GUESTDLL VBoxOGL_INCS = . -if1of ($(KBUILD_TARGET),linux solaris) +if1of ($(KBUILD_TARGET),linux solaris freebsd) VBoxOGL_INCS += \ $(VBOX_PATH_X11_ROOT)/libXdamage-1.1 \ $(VBOX_PATH_X11_ROOT)/libXcomposite-0.4.0 \ @@ -112,7 +112,7 @@ $(VBOX_PATH_CROGL_GENFILES)/NULLfuncs.c \ $(VBOX_PATH_CROGL_GENFILES)/tsfuncs.c -if1of ($(KBUILD_TARGET),linux solaris) +if1of ($(KBUILD_TARGET),linux solaris freebsd) VBoxOGL_SOURCES += \ glx.c \ xfont.c @@ -126,11 +126,16 @@ dri_drv.c VBoxOGL_SOURCES.linux += \ $(VBOX_PATH_CROGL_GENFILES)/linux_exports_dri.asm + VBoxOGL_SOURCES.freebsd += \ + $(VBOX_PATH_CROGL_GENFILES)/freebsd_exports_dri.asm VBoxOGL_SOURCES.solaris += \ $(VBOX_PATH_CROGL_GENFILES)/solaris_exports_dri.asm else ifdef VBoxOGL_FAKEDRI VBoxOGL_SOURCES += \ fakedri_drv.c + VBoxOGL_SOURCES.freebsd += \ + $(VBOX_PATH_CROGL_GENFILES)/freebsd_glxapi_exports.asm \ + $(VBOX_PATH_CROGL_GENFILES)/freebsd_exports_dri.asm VBoxOGL_SOURCES.linux += \ $(VBOX_PATH_CROGL_GENFILES)/linux_glxapi_exports.asm \ $(VBOX_PATH_CROGL_GENFILES)/linux_exports_dri.asm @@ -145,6 +150,8 @@ else VBoxOGL_SOURCES.linux += \ $(VBOX_PATH_CROGL_GENFILES)/linux_exports.asm + VBoxOGL_SOURCES.freebsd += \ + $(VBOX_PATH_CROGL_GENFILES)/freebsd_exports.asm VBoxOGL_SOURCES.solaris += \ $(VBOX_PATH_CROGL_GENFILES)/solaris_exports.c endif @@ -164,10 +171,12 @@ $(VBOX_PATH_CROGL_GENFILES)/linux_exports.asm VBoxOGL_CLEAN.solaris += \ $(VBOX_PATH_CROGL_GENFILES)/solaris_exports.c +VBoxOGL_CLEAN.freebsd += \ + $(VBOX_PATH_CROGL_GENFILES)/freebsd_exports.asm VBoxOGL_CLEAN.win = \ $(VBOX_PATH_CROGL_GENFILES)/windows_exports.asm \ $(VBOX_PATH_CROGL_GENFILES)/cropengl.def -if1of ($(KBUILD_TARGET),linux solaris) +if1of ($(KBUILD_TARGET),linux solaris freebsd) ifdef VBoxOGL_DRI VBoxOGL_CLEAN += \ $(VBOX_PATH_CROGL_GENFILES)/cr_gl.h \ @@ -178,6 +187,8 @@ $(VBOX_PATH_CROGL_GENFILES)/cr_gl.h VBoxOGL_CLEAN.linux += \ $(VBOX_PATH_CROGL_GENFILES)/linux_glxapi_exports.asm + VBoxOGL_CLEAN.freebsd += \ + $(VBOX_PATH_CROGL_GENFILES)/freebsd_glxapi_exports.asm VBoxOGL_CLEAN.solaris += \ $(VBOX_PATH_CROGL_GENFILES)/solaris_glxapi_exports.asm endif @@ -187,12 +198,14 @@ $(VBOX_LIB_VBGL_R3_SHARED) \ $(VBOX_LIB_OGL_CRUTIL) \ $(PATH_LIB)/additions/VBoxOGLspuload$(VBOX_SUFF_LIB) -if1of ($(KBUILD_TARGET),linux solaris) +if1of ($(KBUILD_TARGET),linux solaris freebsd) VBoxOGL_LIBS += \ $(PATH_LIB)/libXcomposite.so - ifdef VBoxOGL_FAKEDRI - VBoxOGL_LIBS += \ + ifneq ($(KBUILD_TARGET),freebsd) # No libdl on FreeBSD + ifdef VBoxOGL_FAKEDRI + VBoxOGL_LIBS += \ dl + endif endif endif @@ -222,7 +235,7 @@ | $$(dir $$@) $(call MSG_GENERATE,python,$@,$<) $(QUIET)$(call VBOX_CROGL_PYTHON_ENV,$(VBOX_PATH_CROGL_PYTHON_INCLUDE),$@) $(VBOX_BLD_PYTHON) $< $(VBOX_PATH_CROGL_GLAPI) -else if1of ($(KBUILD_TARGET),linux solaris) +else if1of ($(KBUILD_TARGET),linux solaris freebsd) $(VBOX_PATH_CROGL_GENFILES)/getprocaddress.c: $(PATH_SUB_CURRENT)/getprocaddress.py $(VBOX_CROGL_API_FILES) | $$(dir $$@) $(call MSG_GENERATE,python,$@,$<) $(QUIET)$(call VBOX_CROGL_PYTHON_ENV,$(VBOX_PATH_CROGL_PYTHON_INCLUDE),$@) $(VBOX_BLD_PYTHON) $< $(VBOX_PATH_CROGL_GLAPI) @@ -234,7 +247,8 @@ | $$(dir $$@) $(call MSG_GENERATE,python,$@,$<) $(QUIET)$(call VBOX_CROGL_PYTHON_ENV,$(VBOX_PATH_CROGL_PYTHON_INCLUDE),$@) $(VBOX_BLD_PYTHON) $< $(VBOX_PATH_CROGL_GLAPI) - else + endif + ifeq ($(KBUILD_TARGET),linux) $(VBOX_PATH_CROGL_GENFILES)/linux_exports.asm: \ $(PATH_SUB_CURRENT)/Linux_i386_exports.py \ $(VBOX_CROGL_API_FILES) $(PATH_SUB_CURRENT)/entrypoints.py \ @@ -242,6 +256,14 @@ $(call MSG_GENERATE,python,$@,$<) $(QUIET)$(call VBOX_CROGL_PYTHON_ENV,$(VBOX_PATH_CROGL_PYTHON_INCLUDE),$@) $(VBOX_BLD_PYTHON) $< $(VBOX_PATH_CROGL_GLAPI) endif + ifeq ($(KBUILD_TARGET),freebsd) +$(VBOX_PATH_CROGL_GENFILES)/freebsd_exports.asm: \ + $(PATH_SUB_CURRENT)/Linux_i386_exports.py \ + $(VBOX_CROGL_API_FILES) $(PATH_SUB_CURRENT)/entrypoints.py \ + | $$(dir $$@) + $(call MSG_GENERATE,python,$@,$<) + $(QUIET)$(call VBOX_CROGL_PYTHON_ENV,$(VBOX_PATH_CROGL_PYTHON_INCLUDE),$@) $(VBOX_BLD_PYTHON) $< $(VBOX_PATH_CROGL_GLAPI) + endif else ifdef VBoxOGL_DRI $(VBOX_PATH_CROGL_GENFILES)/cr_gl.h: $(PATH_SUB_CURRENT)/cr_gl.py $(VBOX_CROGL_API_FILES) | $$(dir $$@) $(call MSG_GENERATE,python,$@,$<) @@ -259,7 +281,8 @@ | $$(dir $$@) $(call MSG_GENERATE,python,$@,$<) $(QUIET)$(call VBOX_CROGL_PYTHON_ENV,$(VBOX_PATH_CROGL_PYTHON_INCLUDE),$@) $(VBOX_BLD_PYTHON) $< $(VBOX_PATH_CROGL_GLAPI) - else + endif + ifeq ($(KBUILD_TARGET),linux) $(VBOX_PATH_CROGL_GENFILES)/linux_exports_dri.asm: \ $(PATH_SUB_CURRENT)/Linux_i386_exports_dri.py \ $(VBOX_CROGL_API_FILES) $(PATH_SUB_CURRENT)/entrypoints.py \ @@ -267,6 +290,14 @@ $(call MSG_GENERATE,python,$@,$<) $(QUIET)$(call VBOX_CROGL_PYTHON_ENV,$(VBOX_PATH_CROGL_PYTHON_INCLUDE),$@) $(VBOX_BLD_PYTHON) $< $(VBOX_PATH_CROGL_GLAPI) endif + ifeq ($(KBUILD_TARGET),freebsd) +$(VBOX_PATH_CROGL_GENFILES)/freebsd_exports_dri.asm: \ + $(PATH_SUB_CURRENT)/Linux_i386_exports_dri.py \ + $(VBOX_CROGL_API_FILES) $(PATH_SUB_CURRENT)/entrypoints.py \ + | $$(dir $$@) + $(call MSG_GENERATE,python,$@,$<) + $(QUIET)$(call VBOX_CROGL_PYTHON_ENV,$(VBOX_PATH_CROGL_PYTHON_INCLUDE),$@) $(VBOX_BLD_PYTHON) $< $(VBOX_PATH_CROGL_GLAPI) + endif else ifdef VBoxOGL_FAKEDRI $(VBOX_PATH_CROGL_GENFILES)/cr_gl.h: $(PATH_SUB_CURRENT)/cr_gl.py $(VBOX_CROGL_API_FILES) | $$(dir $$@) $(call MSG_GENERATE,python,$@,$<) @@ -282,7 +313,8 @@ $(VBOX_PATH_CROGL_GENFILES)/solaris_glxapi_exports.asm: $(PATH_SUB_CURRENT)/SunOS_i386_glxapi_exports.py | $$(dir $$@) $(call MSG_GENERATE,python,$@,$<) $(QUIET)$(call VBOX_CROGL_PYTHON_ENV,$(VBOX_PATH_CROGL_PYTHON_INCLUDE),$@) $(VBOX_BLD_PYTHON) $< - else + endif + ifeq ($(KBUILD_TARGET),linux) $(VBOX_PATH_CROGL_GENFILES)/linux_exports_dri.asm: \ $(PATH_SUB_CURRENT)/Linux_i386_exports_dri.py \ $(VBOX_CROGL_API_FILES) $(PATH_SUB_CURRENT)/entrypoints.py \ @@ -293,6 +325,17 @@ $(call MSG_GENERATE,python,$@,$<) $(QUIET)$(call VBOX_CROGL_PYTHON_ENV,$(VBOX_PATH_CROGL_PYTHON_INCLUDE),$@) $(VBOX_BLD_PYTHON) $< endif + ifeq ($(KBUILD_TARGET),freebsd) +$(VBOX_PATH_CROGL_GENFILES)/freebsd_exports_dri.asm: \ + $(PATH_SUB_CURRENT)/Linux_i386_exports_dri.py \ + $(VBOX_CROGL_API_FILES) $(PATH_SUB_CURRENT)/entrypoints.py \ + | $$(dir $$@) + $(call MSG_GENERATE,python,$@,$<) + $(QUIET)$(call VBOX_CROGL_PYTHON_ENV,$(VBOX_PATH_CROGL_PYTHON_INCLUDE),$@) $(VBOX_BLD_PYTHON) $< $(VBOX_PATH_CROGL_GLAPI) +$(VBOX_PATH_CROGL_GENFILES)/freebsd_glxapi_exports.asm: $(PATH_SUB_CURRENT)/Linux_i386_glxapi_exports.py | $$(dir $$@) + $(call MSG_GENERATE,python,$@,$<) + $(QUIET)$(call VBOX_CROGL_PYTHON_ENV,$(VBOX_PATH_CROGL_PYTHON_INCLUDE),$@) $(VBOX_BLD_PYTHON) $< + endif else # @todo linux if required ifeq ($(KBUILD_TARGET),solaris) Index: src/VBox/Additions/common/crOpenGL/fakedri_drv.c =================================================================== --- src/VBox/Additions/common/crOpenGL/fakedri_drv.c (revision 22552) +++ src/VBox/Additions/common/crOpenGL/fakedri_drv.c (working copy) @@ -131,6 +131,14 @@ } #undef GLXAPI_ENTRY +#if RT_OS_FREEBSD +static int dladdr1(void *ptr, Dl_info *dlip, void **symp, int flags) +{ + return 0; +} +#define RTLD_DL_SYMENT 0 +#endif + static void vboxPatchMesaExport(const char* psFuncName, const void *pStart, const void *pEnd) { Index: src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3Lib.cpp =================================================================== --- src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3Lib.cpp (revision 22552) +++ src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3Lib.cpp (working copy) @@ -186,42 +186,7 @@ } g_File = hf; -#elif defined(RT_OS_FREEBSD) - /* - * Try open the BSD device. The device cloning makes this a bit of work. - */ -# if defined(VBOX_VBGLR3_XFREE86) - int File = 0; -# else - RTFILE File = 0; -# endif - int rc; - 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); -# if defined(VBOX_VBGLR3_XFREE86) - File = xf86open(szDevice, XF86_O_RDWR); - if (File >= 0) - break; -# else - rc = RTFileOpen(&File, szDevice, RTFILE_O_READWRITE | RTFILE_O_OPEN | RTFILE_O_DENY_NONE); - if (RT_SUCCESS(rc)) - break; -# endif - } - -# if defined(VBOX_VBGLR3_XFREE86) - if (File == -1) - return VERR_OPEN_FAILED; -# else - if (RT_FAILURE(rc)) - return rc; -# endif - - g_File = File; - -#elif defined(VBOX_VBGLR3_XFREE86) && !defined(RT_OS_FREEBSD) +#elif defined(VBOX_VBGLR3_XFREE86) int File = xf86open(pszDeviceName, XF86_O_RDWR); if (File == -1) return VERR_OPEN_FAILED; 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 + * Daryll Strauss + * Gareth Hughes + * + */ + +#include +__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); Property changes on: src/VBox/Additions/freebsd/drm/vboxvideo_drm.c ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:keywords + FreeBSD=%H Added: svn:eol-style + native 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 Property changes on: src/VBox/Additions/freebsd/drm/Makefile.kmk ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:keywords + FreeBSD=%H Added: svn:eol-style + native Index: src/VBox/Additions/freebsd/vboxvfs/Makefile.kmk =================================================================== --- src/VBox/Additions/freebsd/vboxvfs/Makefile.kmk (revision 22552) +++ src/VBox/Additions/freebsd/vboxvfs/Makefile.kmk (working copy) @@ -34,7 +34,7 @@ vboxvfs_DEFS = VBOX_WITH_HGCM vboxvfs_INCS = \ . \ - $(PATH_vboxfs) + $(PATH_vboxvfs) vboxvfs_SOURCES = \ vboxvfs_vfsops.c \ vboxvfs_vnops.c @@ -42,9 +42,9 @@ $(VBOX_LIB_VBGL_R0) \ $(VBOX_LIB_IPRT_GUEST_R0) vboxvfs_DEPS = \ - $$(PATH_vboxvfs)/vnode_if.h \ - $$(PATH_vboxvfs)/vnode_if_newproto.h \ - $$(PATH_vboxvfs)/vnode_if_typedef.h + $(PATH_vboxvfs)/vnode_if.h \ + $(PATH_vboxvfs)/vnode_if_newproto.h \ + $(PATH_vboxvfs)/vnode_if_typedef.h vboxvfs_CLEAN += $(vboxvfs_DEPS) VBOX_AWK := /usr/bin/awk @@ -52,17 +52,14 @@ $$(PATH_vboxvfs)/vnode_if.h: $(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) $(PATH_vboxvfs)/vnode_if.h $(PATH_vboxvfs)/vnode_if.h $$(PATH_vboxvfs)/vnode_if_newproto.h: $(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) $(PATH_vboxvfs)/vnode_if_newproto.h $(PATH_vboxvfs)/vnode_if_newproto.h $$(PATH_vboxvfs)/vnode_if_typedef.h: $(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) $(PATH_vboxvfs)/vnode_if_typedef.h $(PATH_vboxvfs)/vnode_if_typedef.h include $(KBUILD_PATH)/subfooter.kmk Index: src/VBox/Additions/freebsd/Makefile.kmk =================================================================== --- src/VBox/Additions/freebsd/Makefile.kmk (revision 22552) +++ 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/vboxvfs.ko \ $(PATH_BIN)/additions/VBoxClient \ $(PATH_BIN)/additions/VBoxService \ $(PATH_BIN)/additions/VBoxControl \