~ubuntu-branches/ubuntu/trusty/virtualbox-ose/trusty

« back to all changes in this revision

Viewing changes to src/VBox/Additions/linux/module/cmc.c

  • Committer: Bazaar Package Importer
  • Author(s): Felix Geyer
  • Date: 2009-12-18 16:44:29 UTC
  • mfrom: (0.3.3 upstream) (0.4.6 squeeze)
  • Revision ID: james.westby@ubuntu.com-20091218164429-jd34ccexpv5na11a
Tags: 3.1.2-dfsg-1ubuntu1
* Merge from Debian unstable (LP: #498219), remaining changes:
  - Disable update action
    - debian/patches/u01-disable-update-action.dpatch
  - VirtualBox should go in Accessories, not in System tools (LP: #288590)
    - debian/virtualbox-ose-qt.files/virtualbox-ose.desktop
  - Add Apport hook
    - debian/virtualbox-ose.files/source_virtualbox-ose.py
    - debian/virtualbox-ose.install
  - Add Launchpad integration
    - debian/control
    - debian/lpi-bug.xpm
    - debian/patches/u02-lp-integration.dpatch
* Fixes the following bugs:
  - Kernel module fails to build with Linux >= 2.6.32 (LP: #474625)
  - X.Org drivers need to be rebuilt against X-Server 1.7 (LP: #495935)
  - The *-source packages try to build the kernel modules even though the
    kernel headers aren't available (LP: #473334)
* Replace *-source packages with transitional packages for *-dkms.
* Adapt u01-disable-update-action.dpatch and u02-lp-integration.dpatch for
  new upstream version.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/** @file
2
 
 *
3
 
 */
4
 
 
5
 
/*
6
 
 * Copyright (C) 2006-2007 Sun Microsystems, Inc.
7
 
 *
8
 
 * This file is part of VirtualBox Open Source Edition (OSE), as
9
 
 * available from http://www.virtualbox.org. This file is free software;
10
 
 * you can redistribute it and/or modify it under the terms of the GNU
11
 
 * General Public License (GPL) as published by the Free Software
12
 
 * Foundation, in version 2 as it comes in the "COPYING" file of the
13
 
 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14
 
 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15
 
 *
16
 
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
17
 
 * Clara, CA 95054 USA or visit http://www.sun.com if you need
18
 
 * additional information or have any questions.
19
 
 */
20
 
 
21
 
#include "the-linux-kernel.h"
22
 
#include "vboxmod.h"
23
 
#include "waitcompat.h"
24
 
 
25
 
/**
26
 
 * HGCM
27
 
 *
28
 
 */
29
 
static DECLVBGL(void)
30
 
vboxadd_hgcm_callback (VMMDevHGCMRequestHeader *pHeader, void *pvData, uint32_t u32Data)
31
 
{
32
 
    VBoxDevice *dev = pvData;
33
 
    if (u32Data == RT_INDEFINITE_WAIT)
34
 
        wait_event (dev->eventq, pHeader->fu32Flags & VBOX_HGCM_REQ_DONE);
35
 
    else
36
 
        wait_event_timeout (dev->eventq, pHeader->fu32Flags & VBOX_HGCM_REQ_DONE,
37
 
                            msecs_to_jiffies (u32Data));
38
 
}
39
 
 
40
 
static DECLVBGL(void)
41
 
vboxadd_hgcm_callback_interruptible (VMMDevHGCMRequestHeader *pHeader, void *pvData, uint32_t u32Data)
42
 
{
43
 
    VBoxDevice *dev = pvData;
44
 
    if (u32Data == RT_INDEFINITE_WAIT)
45
 
        wait_event_interruptible (dev->eventq, pHeader->fu32Flags & VBOX_HGCM_REQ_DONE);
46
 
    else
47
 
        wait_event_interruptible_timeout (dev->eventq, pHeader->fu32Flags & VBOX_HGCM_REQ_DONE,
48
 
                                          msecs_to_jiffies (u32Data));
49
 
}
50
 
 
51
 
DECLVBGL (int) vboxadd_cmc_call (void *opaque, uint32_t func, void *data)
52
 
{
53
 
    int rc = VINF_SUCCESS;
54
 
 
55
 
    /* this function can handle cancelled requests */
56
 
    if (   VBOXGUEST_IOCTL_STRIP_SIZE(func)
57
 
        == VBOXGUEST_IOCTL_STRIP_SIZE(VBOXGUEST_IOCTL_HGCM_CALL(0)))
58
 
        rc = VbglHGCMCall (data, vboxadd_hgcm_callback_interruptible, opaque, RT_INDEFINITE_WAIT);
59
 
    /* this function can handle cancelled requests */
60
 
    else if (   VBOXGUEST_IOCTL_STRIP_SIZE(func)
61
 
             == VBOXGUEST_IOCTL_STRIP_SIZE(VBOXGUEST_IOCTL_HGCM_CALL_TIMED(0)))
62
 
    {
63
 
        VBoxGuestHGCMCallInfoTimed *pCallInfo;
64
 
        pCallInfo = (VBoxGuestHGCMCallInfoTimed *) data;
65
 
        if (pCallInfo->fInterruptible)
66
 
            rc = VbglHGCMCall (&pCallInfo->info, vboxadd_hgcm_callback_interruptible,
67
 
                               opaque, pCallInfo->u32Timeout);
68
 
        else
69
 
            rc = VbglHGCMCall (&pCallInfo->info, vboxadd_hgcm_callback,
70
 
                               opaque, pCallInfo->u32Timeout);
71
 
    }
72
 
    else switch (func)
73
 
    {
74
 
        /* this function can NOT handle cancelled requests */
75
 
        case VBOXGUEST_IOCTL_HGCM_CONNECT:
76
 
            rc = VbglHGCMConnect (data, vboxadd_hgcm_callback, opaque, RT_INDEFINITE_WAIT);
77
 
            break;
78
 
 
79
 
        /* this function can NOT handle cancelled requests */
80
 
        case VBOXGUEST_IOCTL_HGCM_DISCONNECT:
81
 
            rc = VbglHGCMDisconnect (data, vboxadd_hgcm_callback, opaque, RT_INDEFINITE_WAIT);
82
 
            break;
83
 
 
84
 
        case VBOXGUEST_IOCTL_GETVMMDEVPORT:
85
 
        {
86
 
            VBoxDevice *pDev = (VBoxDevice *)opaque;
87
 
            VBoxGuestPortInfo *pInfo = (VBoxGuestPortInfo *)data;
88
 
            pInfo->portAddress = pDev->io_port;
89
 
            pInfo->pVMMDevMemory = pDev->pVMMDevMemory;
90
 
            break;
91
 
        }
92
 
        default:
93
 
            rc = VERR_VBGL_IOCTL_FAILED;
94
 
    }
95
 
    return rc;
96
 
}
97
 
 
98
 
int vboxadd_cmc_init (void)
99
 
{
100
 
    return VINF_SUCCESS;
101
 
}
102
 
 
103
 
void vboxadd_cmc_fini (void)
104
 
{
105
 
}
106
 
 
107
 
DECLVBGL (int)
108
 
vboxadd_cmc_ctl_guest_filter_mask (uint32_t or_mask, uint32_t not_mask)
109
 
{
110
 
    int rc;
111
 
    VMMDevCtlGuestFilterMask *req;
112
 
 
113
 
    rc = VbglGRAlloc ((VMMDevRequestHeader**) &req, sizeof (*req),
114
 
                      VMMDevReq_CtlGuestFilterMask);
115
 
 
116
 
    if (RT_FAILURE (rc))
117
 
    {
118
 
        elog ("VbglGRAlloc (CtlGuestFilterMask) failed rc=%d\n", rc);
119
 
        return -1;
120
 
    }
121
 
 
122
 
    req->u32OrMask = or_mask;
123
 
    req->u32NotMask = not_mask;
124
 
 
125
 
    rc = VbglGRPerform (&req->header);
126
 
    VbglGRFree (&req->header);
127
 
    if (RT_FAILURE (rc))
128
 
    {
129
 
        elog ("VbglGRPerform (CtlGuestFilterMask) failed rc=%d\n", rc);
130
 
        return -1;
131
 
    }
132
 
    return 0;
133
 
}
134
 
 
135
 
EXPORT_SYMBOL (vboxadd_cmc_call);
136
 
EXPORT_SYMBOL (vboxadd_cmc_ctl_guest_filter_mask);