Differential D28871 Diff 84858 emulators/virtualbox-ose/files/patch-src-VBox-Additions-common-VBoxGuest-VBoxGuest-freebsd.c
Changeset View
Changeset View
Standalone View
Standalone View
emulators/virtualbox-ose/files/patch-src-VBox-Additions-common-VBoxGuest-VBoxGuest-freebsd.c
--- src/VBox/Additions/common/VBoxGuest/VBoxGuest-freebsd.c.orig 2020-05-13 19:37:01 UTC | --- src/VBox/Additions/common/VBoxGuest/VBoxGuest-freebsd.c.orig 2019-01-25 18:12:28 UTC | ||||
+++ src/VBox/Additions/common/VBoxGuest/VBoxGuest-freebsd.c | +++ src/VBox/Additions/common/VBoxGuest/VBoxGuest-freebsd.c | ||||
@@ -102,8 +102,6 @@ struct VBoxGuestDeviceState | @@ -45,6 +45,7 @@ | ||||
#include <sys/uio.h> | |||||
#include <sys/bus.h> | |||||
#include <sys/poll.h> | |||||
+#include <sys/proc.h> | |||||
#include <sys/selinfo.h> | |||||
#include <sys/queue.h> | |||||
#include <sys/lock.h> | |||||
@@ -61,6 +62,7 @@ | |||||
#include <VBox/version.h> | |||||
#include <VBox/log.h> | |||||
#include <iprt/assert.h> | |||||
+#include <iprt/err.h> | |||||
#include <iprt/initterm.h> | |||||
#include <iprt/process.h> | |||||
#include <iprt/string.h> | |||||
@@ -102,8 +104,6 @@ struct VBoxGuestDeviceState | |||||
struct resource *pIrqRes; | struct resource *pIrqRes; | ||||
/** Pointer to the IRQ handler. */ | /** Pointer to the IRQ handler. */ | ||||
void *pfnIrqHandler; | void *pfnIrqHandler; | ||||
- /** VMMDev version */ | - /** VMMDev version */ | ||||
- uint32_t u32Version; | - uint32_t u32Version; | ||||
}; | }; | ||||
@@ -113,8 +111,7 @@ struct VBoxGuestDeviceState | @@ -113,8 +113,7 @@ struct VBoxGuestDeviceState | ||||
/* | /* | ||||
* Character device file handlers. | * Character device file handlers. | ||||
*/ | */ | ||||
-static d_fdopen_t vgdrvFreeBSDOpen; | -static d_fdopen_t vgdrvFreeBSDOpen; | ||||
-static d_close_t vgdrvFreeBSDClose; | -static d_close_t vgdrvFreeBSDClose; | ||||
+static d_open_t vgdrvFreeBSDOpen; | +static d_open_t vgdrvFreeBSDOpen; | ||||
static d_ioctl_t vgdrvFreeBSDIOCtl; | static d_ioctl_t vgdrvFreeBSDIOCtl; | ||||
static int vgdrvFreeBSDIOCtlSlow(PVBOXGUESTSESSION pSession, u_long ulCmd, caddr_t pvData, struct thread *pTd); | static int vgdrvFreeBSDIOCtlSlow(PVBOXGUESTSESSION pSession, u_long ulCmd, caddr_t pvData, struct thread *pTd); | ||||
static d_write_t vgdrvFreeBSDWrite; | static d_write_t vgdrvFreeBSDWrite; | ||||
@@ -145,8 +142,7 @@ static struct cdevsw g_vgdrvFreeBSDChrDevSW = | @@ -145,8 +144,7 @@ static struct cdevsw g_vgdrvFreeBSDChrDevSW = | ||||
{ | { | ||||
.d_version = D_VERSION, | .d_version = D_VERSION, | ||||
.d_flags = D_TRACKCLOSE | D_NEEDMINOR, | .d_flags = D_TRACKCLOSE | D_NEEDMINOR, | ||||
- .d_fdopen = vgdrvFreeBSDOpen, | - .d_fdopen = vgdrvFreeBSDOpen, | ||||
- .d_close = vgdrvFreeBSDClose, | - .d_close = vgdrvFreeBSDClose, | ||||
+ .d_open = vgdrvFreeBSDOpen, | + .d_open = vgdrvFreeBSDOpen, | ||||
.d_ioctl = vgdrvFreeBSDIOCtl, | .d_ioctl = vgdrvFreeBSDIOCtl, | ||||
.d_read = vgdrvFreeBSDRead, | .d_read = vgdrvFreeBSDRead, | ||||
.d_write = vgdrvFreeBSDWrite, | .d_write = vgdrvFreeBSDWrite, | ||||
@@ -154,81 +150,28 @@ static struct cdevsw g_vgdrvFreeBSDChrDevSW = | @@ -154,81 +152,28 @@ static struct cdevsw g_vgdrvFreeBSDChrDevSW = | ||||
.d_name = "vboxguest" | .d_name = "vboxguest" | ||||
}; | }; | ||||
+/** Device structure. */ | +/** Device structure. */ | ||||
+static struct cdev *g_pDev; | +static struct cdev *g_pDev; | ||||
+ | + | ||||
/** Device extention & session data association structure. */ | /** Device extention & session data association structure. */ | ||||
static VBOXGUESTDEVEXT g_DevExt; | static VBOXGUESTDEVEXT g_DevExt; | ||||
▲ Show 20 Lines • Show All 72 Lines • ▼ Show 20 Lines | |||||
-static int vgdrvFreeBSDOpen(struct cdev *pDev, int fOpen, struct thread *pTd, struct file *pFd) | -static int vgdrvFreeBSDOpen(struct cdev *pDev, int fOpen, struct thread *pTd, struct file *pFd) | ||||
-#else | -#else | ||||
-static int vgdrvFreeBSDOpen(struct cdev *pDev, int fOpen, struct thread *pTd) | -static int vgdrvFreeBSDOpen(struct cdev *pDev, int fOpen, struct thread *pTd) | ||||
-#endif | -#endif | ||||
+static int vgdrvFreeBSDOpen(struct cdev *pDev, int fOpen, int DevType, struct thread *pTd) | +static int vgdrvFreeBSDOpen(struct cdev *pDev, int fOpen, int DevType, struct thread *pTd) | ||||
{ | { | ||||
int rc; | int rc; | ||||
PVBOXGUESTSESSION pSession; | PVBOXGUESTSESSION pSession; | ||||
@@ -236,25 +179,18 @@ static int vgdrvFreeBSDOpen(struct cdev *pDev, int fOp | @@ -240,12 +185,6 @@ static int vgdrvFreeBSDOpen(struct cdev *pDev, int fOp | ||||
LogFlow(("vgdrvFreeBSDOpen:\n")); | LogFlow(("vgdrvFreeBSDOpen:\n")); | ||||
/* | /* | ||||
- * Try grab it (we don't grab the giant, remember). | - * Try grab it (we don't grab the giant, remember). | ||||
- */ | - */ | ||||
- if (!ASMAtomicCmpXchgPtr(&pDev->si_drv1, (void *)0x42, NULL)) | - if (!ASMAtomicCmpXchgPtr(&pDev->si_drv1, (void *)0x42, NULL)) | ||||
- return EBUSY; | - return EBUSY; | ||||
- | - | ||||
- /* | - /* | ||||
* Create a new session. | * Create a new session. | ||||
*/ | */ | ||||
rc = VGDrvCommonCreateUserSession(&g_DevExt, &pSession); | fRequestor = VMMDEV_REQUESTOR_USERMODE | VMMDEV_REQUESTOR_TRUST_NOT_GIVEN; | ||||
@@ -262,14 +201,13 @@ static int vgdrvFreeBSDOpen(struct cdev *pDev, int fOp | |||||
rc = VGDrvCommonCreateUserSession(&g_DevExt, fRequestor, &pSession); | |||||
if (RT_SUCCESS(rc)) | if (RT_SUCCESS(rc)) | ||||
{ | { | ||||
- if (ASMAtomicCmpXchgPtr(&pDev->si_drv1, pSession, (void *)0x42)) | - if (ASMAtomicCmpXchgPtr(&pDev->si_drv1, pSession, (void *)0x42)) | ||||
- { | - { | ||||
- Log(("vgdrvFreeBSDOpen: success - g_DevExt=%p pSession=%p rc=%d pid=%d\n", &g_DevExt, pSession, rc, (int)RTProcSelf())); | - Log(("vgdrvFreeBSDOpen: success - g_DevExt=%p pSession=%p rc=%d pid=%d\n", &g_DevExt, pSession, rc, (int)RTProcSelf())); | ||||
+ Log(("vgdrvFreeBSDOpen: success - g_DevExt=%p pSession=%p rc=%d pid=%d\n", &g_DevExt, pSession, rc, (int)RTProcSelf())); | + Log(("vgdrvFreeBSDOpen: success - g_DevExt=%p pSession=%p rc=%d pid=%d\n", &g_DevExt, pSession, rc, (int)RTProcSelf())); | ||||
+ rc = devfs_set_cdevpriv(pSession, vgdrvFreeBSDDtr); | + rc = devfs_set_cdevpriv(pSession, vgdrvFreeBSDDtr); | ||||
+ if (rc) | + if (rc) | ||||
+ VGDrvCommonCloseSession(&g_DevExt, pSession); | + VGDrvCommonCloseSession(&g_DevExt, pSession); | ||||
+ else | + else | ||||
ASMAtomicIncU32(&cUsers); | ASMAtomicIncU32(&cUsers); | ||||
- return 0; | - return 0; | ||||
- } | - } | ||||
- | - | ||||
- VGDrvCommonCloseSession(&g_DevExt, pSession); | - VGDrvCommonCloseSession(&g_DevExt, pSession); | ||||
+ return rc; | + return rc; | ||||
} | } | ||||
LogRel(("vgdrvFreeBSDOpen: failed. rc=%d\n", rc)); | LogRel(("vgdrvFreeBSDOpen: failed. rc=%d\n", rc)); | ||||
@@ -262,33 +198,6 @@ static int vgdrvFreeBSDOpen(struct cdev *pDev, int fOp | @@ -277,33 +215,6 @@ static int vgdrvFreeBSDOpen(struct cdev *pDev, int fOp | ||||
} | } | ||||
/** | /** | ||||
- * File close handler | - * File close handler | ||||
- * | - * | ||||
- */ | - */ | ||||
-static int vgdrvFreeBSDClose(struct cdev *pDev, int fFile, int DevType, struct thread *pTd) | -static int vgdrvFreeBSDClose(struct cdev *pDev, int fFile, int DevType, struct thread *pTd) | ||||
-{ | -{ | ||||
Show All 17 Lines | |||||
- return 0; | - return 0; | ||||
-} | -} | ||||
- | - | ||||
- | - | ||||
-/** | -/** | ||||
* I/O control request. | * I/O control request. | ||||
* | * | ||||
* @returns depends... | * @returns depends... | ||||
@@ -301,8 +210,12 @@ static int vgdrvFreeBSDClose(struct cdev *pDev, int fF | @@ -316,8 +227,12 @@ static int vgdrvFreeBSDClose(struct cdev *pDev, int fF | ||||
static int vgdrvFreeBSDIOCtl(struct cdev *pDev, u_long ulCmd, caddr_t pvData, int fFile, struct thread *pTd) | static int vgdrvFreeBSDIOCtl(struct cdev *pDev, u_long ulCmd, caddr_t pvData, int fFile, struct thread *pTd) | ||||
{ | { | ||||
PVBOXGUESTSESSION pSession; | PVBOXGUESTSESSION pSession; | ||||
- devfs_get_cdevpriv((void **)&pSession); | - devfs_get_cdevpriv((void **)&pSession); | ||||
+ int rc; | + int rc; | ||||
+ rc = devfs_get_cdevpriv((void **)&pSession); | + rc = devfs_get_cdevpriv((void **)&pSession); | ||||
+ if (rc) | + if (rc) | ||||
+ return rc; | + return rc; | ||||
+ | + | ||||
/* | /* | ||||
* Deal with the fast ioctl path first. | * Deal with the fast ioctl path first. | ||||
*/ | */ | ||||
@@ -497,12 +410,14 @@ int VBOXCALL VBoxGuestIDC(void *pvSession, uintptr_t u | @@ -512,12 +427,14 @@ int VBOXCALL VBoxGuestIDC(void *pvSession, uintptr_t u | ||||
static int vgdrvFreeBSDPoll(struct cdev *pDev, int fEvents, struct thread *td) | static int vgdrvFreeBSDPoll(struct cdev *pDev, int fEvents, struct thread *td) | ||||
{ | { | ||||
- int fEventsProcessed; | - int fEventsProcessed; | ||||
+ PVBOXGUESTSESSION pSession; | + PVBOXGUESTSESSION pSession; | ||||
+ int fEventsProcessed, rc; | + int fEventsProcessed, rc; | ||||
LogFlow(("vgdrvFreeBSDPoll: fEvents=%d\n", fEvents)); | LogFlow(("vgdrvFreeBSDPoll: fEvents=%d\n", fEvents)); | ||||
- PVBOXGUESTSESSION pSession = (PVBOXGUESTSESSION)pDev->si_drv1; | - PVBOXGUESTSESSION pSession = (PVBOXGUESTSESSION)pDev->si_drv1; | ||||
- if (RT_UNLIKELY(!VALID_PTR(pSession))) { | - if (RT_UNLIKELY(!VALID_PTR(pSession))) { | ||||
+ rc = devfs_get_cdevpriv((void **)&pSession); | + rc = devfs_get_cdevpriv((void **)&pSession); | ||||
+ if (rc) | + if (rc) | ||||
+ { | + { | ||||
Log(("vgdrvFreeBSDPoll: no state data for %s\n", devtoname(pDev))); | Log(("vgdrvFreeBSDPoll: no state data for %s\n", devtoname(pDev))); | ||||
return (fEvents & (POLLHUP|POLLIN|POLLRDNORM|POLLOUT|POLLWRNORM)); | return (fEvents & (POLLHUP|POLLIN|POLLRDNORM|POLLOUT|POLLWRNORM)); | ||||
} | } | ||||
@@ -543,11 +458,8 @@ static int vgdrvFreeBSDDetach(device_t pDevice) | @@ -558,11 +475,8 @@ static int vgdrvFreeBSDDetach(device_t pDevice) | ||||
/* | /* | ||||
* Reverse what we did in vgdrvFreeBSDAttach. | * Reverse what we did in vgdrvFreeBSDAttach. | ||||
*/ | */ | ||||
- if (g_vgdrvFreeBSDEHTag != NULL) | - if (g_vgdrvFreeBSDEHTag != NULL) | ||||
- EVENTHANDLER_DEREGISTER(dev_clone, g_vgdrvFreeBSDEHTag); | - EVENTHANDLER_DEREGISTER(dev_clone, g_vgdrvFreeBSDEHTag); | ||||
+ destroy_dev(g_pDev); | + destroy_dev(g_pDev); | ||||
- clone_cleanup(&g_pvgdrvFreeBSDClones); | - clone_cleanup(&g_pvgdrvFreeBSDClones); | ||||
- | - | ||||
vgdrvFreeBSDRemoveIRQ(pDevice, pState); | vgdrvFreeBSDRemoveIRQ(pDevice, pState); | ||||
if (pState->pVMMDevMemRes) | if (pState->pVMMDevMemRes) | ||||
@@ -698,18 +610,21 @@ static int vgdrvFreeBSDAttach(device_t pDevice) | @@ -727,18 +641,21 @@ static int vgdrvFreeBSDAttach(device_t pDevice) | ||||
if (RT_SUCCESS(rc)) | VGDrvCommonProcessOptionsFromHost(&g_DevExt); | ||||
{ | |||||
/* | /* | ||||
- * Configure device cloning. | - * Configure device cloning. | ||||
+ * Configure device. | + * Configure device. | ||||
*/ | */ | ||||
- clone_setup(&g_pvgdrvFreeBSDClones); | - clone_setup(&g_pvgdrvFreeBSDClones); | ||||
- g_vgdrvFreeBSDEHTag = EVENTHANDLER_REGISTER(dev_clone, vgdrvFreeBSDClone, 0, 1000); | - g_vgdrvFreeBSDEHTag = EVENTHANDLER_REGISTER(dev_clone, vgdrvFreeBSDClone, 0, 1000); | ||||
- if (g_vgdrvFreeBSDEHTag) | - if (g_vgdrvFreeBSDEHTag) | ||||
+ g_pDev = make_dev(&g_vgdrvFreeBSDChrDevSW, | + g_pDev = make_dev(&g_vgdrvFreeBSDChrDevSW, | ||||
Show All 17 Lines |