VirtualBox

source: vbox/trunk/src/VBox/HostDrivers/Support/SUPR0IdcClient.c@ 10377

Last change on this file since 10377 was 10377, checked in by vboxsync, 16 years ago

Implemented the IDC methods. Moved the setting of the R0Process and Process SUPDRVSESSION members to SUPDrv.c, and made SUPDrv.c provide default initialization of the Uid and Gid members.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.4 KB
Line 
1/* $Id: SUPR0IdcClient.c 10377 2008-07-08 16:26:13Z vboxsync $ */
2/** @file
3 * VirtualBox Support Driver - IDC Client Lib, Core.
4 */
5
6/*
7 * Copyright (C) 2008 Sun Microsystems, Inc.
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * The contents of this file may alternatively be used under the terms
18 * of the Common Development and Distribution License Version 1.0
19 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20 * VirtualBox OSE distribution, in which case the provisions of the
21 * CDDL are applicable instead of those of the GPL.
22 *
23 * You may elect to license modified versions of this file under the
24 * terms and conditions of either the GPL or the CDDL or both.
25 *
26 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
27 * Clara, CA 95054 USA or visit http://www.sun.com if you need
28 * additional information or have any questions.
29 */
30
31/*******************************************************************************
32* Header Files *
33*******************************************************************************/
34#include "SUPR0IdcClientInternal.h"
35#include <VBox/err.h>
36
37
38/*******************************************************************************
39* Global Variables *
40*******************************************************************************/
41static PSUPDRVIDCHANDLE volatile g_pMainHandle = NULL;
42
43
44/**
45 * Opens the IDC interface of the support driver.
46 *
47 * This will perform basic version negotiations and fail if the
48 * minmum requirements aren't met.
49 *
50 * @returns VBox status code.
51 * @param pHandle The handle structure (output).
52 * @param uReqVersion The requested version. Pass 0 for default.
53 * @param uMinVersion The minimum required version. Pass 0 for default.
54 * @param puSessionVersion Where to store the session version. Optional.
55 * @param puDriverVersion Where to store the session version. Optional.
56 * @param puDriverRevision Where to store the SVN revision of the driver. Optional.
57 */
58SUPR0DECL(int) SUPR0IdcOpen(PSUPDRVIDCHANDLE pHandle, uint32_t uReqVersion, uint32_t uMinVersion,
59 uint32_t *puSessionVersion, uint32_t *puDriverVersion, uint32_t *puDriverRevision)
60{
61 unsigned uDefaultMinVersion;
62 SUPDRVIDCREQCONNECT Req;
63 int rc;
64
65 /*
66 * Validate and set failure return values.
67 */
68 AssertPtrReturn(pHandle, VERR_INVALID_POINTER);
69 pHandle->s.pSession = NULL;
70
71 AssertPtrNullReturn(puSessionVersion, VERR_INVALID_POINTER);
72 if (puSessionVersion)
73 *puSessionVersion = 0;
74
75 AssertPtrNullReturn(puDriverVersion, VERR_INVALID_POINTER);
76 if (puDriverVersion)
77 *puDriverVersion = 0;
78
79 AssertPtrNullReturn(puDriverRevision, VERR_INVALID_POINTER);
80 if (puDriverRevision)
81 *puDriverRevision = 0;
82
83 AssertReturn(!uMinVersion || (uMinVersion & UINT32_C(0xffff0000)) == (SUPDRV_IDC_VERSION & UINT32_C(0xffff0000)), VERR_INVALID_PARAMETER);
84 AssertReturn(!uReqVersion || (uReqVersion & UINT32_C(0xffff0000)) == (SUPDRV_IDC_VERSION & UINT32_C(0xffff0000)), VERR_INVALID_PARAMETER);
85
86 /*
87 * Handle default version input and enforce minimum requirements made
88 * by this library.
89 *
90 * The clients will pass defaults (0), and only in the case that some
91 * special API feature was just added will they set an actual version.
92 * So, this is the place where can easily enforce a minimum IDC version
93 * on bugs and similar. It corresponds a bit to what SUPInit is
94 * responsible for.
95 */
96 uDefaultMinVersion = SUPDRV_IDC_VERSION & UINT32_C(0xffff0000);
97 if (!uMinVersion || uMinVersion < uDefaultMinVersion)
98 uMinVersion = uDefaultMinVersion;
99 if (!uReqVersion || uReqVersion < uDefaultMinVersion)
100 uReqVersion = uDefaultMinVersion;
101
102 /*
103 * Setup the connect request packet and call the OS specific function.
104 */
105 Req.Hdr.cb = sizeof(Req);
106 Req.Hdr.rc = VERR_WRONG_ORDER;
107 Req.Hdr.pSession = NULL;
108 Req.u.In.u32MagicCookie = SUPDRVIDCREQ_CONNECT_MAGIC_COOKIE;
109 Req.u.In.uMinVersion = uMinVersion;
110 Req.u.In.uReqVersion = uReqVersion;
111 rc = supR0IdcNativeOpen(pHandle, &Req);
112 if (RT_SUCCESS(rc))
113 {
114 pHandle->s.pSession = Req.u.Out.pSession;
115 if (puSessionVersion)
116 *puSessionVersion = Req.u.Out.uSessionVersion;
117 if (puDriverVersion)
118 *puDriverVersion = Req.u.Out.uDriverVersion;
119 if (puDriverRevision)
120 *puDriverRevision = Req.u.Out.uDriverRevision;
121
122 /*
123 * We don't really trust anyone, make sure the returned
124 * session and version values actually makes sense.
125 */
126 if ( VALID_PTR(Req.u.Out.pSession)
127 && Req.u.Out.uSessionVersion >= uMinVersion
128 && (Req.u.Out.uSessionVersion & UINT32_C(0xffff0000)) == (SUPDRV_IDC_VERSION & UINT32_C(0xffff0000)))
129 {
130 ASMAtomicCmpXchgPtr((void * volatile *)&g_pMainHandle, pHandle, NULL);
131 return rc;
132 }
133
134 AssertMsgFailed(("pSession=%p uSessionVersion=0x%x (r%u)\n", Req.u.Out.pSession, Req.u.Out.uSessionVersion, Req.u.Out.uDriverRevision));
135 rc = VERR_VERSION_MISMATCH;
136 SUPR0IdcClose(pHandle);
137 }
138
139 return rc;
140}
141
142
143/**
144 * Closes a IDC connection established by SUPR0IdcOpen.
145 *
146 * @returns VBox status code.
147 * @param pHandle The IDC handle.
148 */
149SUPR0DECL(int) SUPR0IdcClose(PSUPDRVIDCHANDLE pHandle)
150{
151 SUPDRVIDCREQHDR Req;
152 int rc;
153
154 /*
155 * Catch closed handles and check that the session is valid.
156 */
157 AssertPtrReturn(pHandle, VERR_INVALID_POINTER);
158 if (!pHandle->s.pSession)
159 return VERR_INVALID_HANDLE;
160 AssertPtrReturn(pHandle->s.pSession, VERR_INVALID_HANDLE);
161
162 /*
163 * Create the request and hand it to the OS specific code.
164 */
165 Req.cb = sizeof(Req);
166 Req.rc = VERR_WRONG_ORDER;
167 Req.pSession = pHandle->s.pSession;
168 rc = supR0IdcNativeClose(pHandle, &Req);
169 if (RT_SUCCESS(rc))
170 {
171 pHandle->s.pSession = NULL;
172 ASMAtomicCmpXchgPtr((void * volatile *)&g_pMainHandle, NULL, pHandle);
173 }
174 return rc;
175}
176
177
178/**
179 * Get the SUPDRV session for the IDC connection.
180 *
181 * This is for use with SUPDRV and component APIs that requires a valid
182 * session handle.
183 *
184 * @returns The session handle on success, NULL if the IDC handle is invalid.
185 *
186 * @param pHandle The IDC handle.
187 */
188SUPR0DECL(PSUPDRVSESSION) SUPR0IdcGetSession(PSUPDRVIDCHANDLE pHandle)
189{
190 PSUPDRVSESSION pSession;
191 AssertPtrReturn(pHandle, NULL);
192 pSession = pHandle->s.pSession;
193 AssertPtrReturn(pSession, NULL);
194 return pSession;
195}
196
197
198/**
199 * Looks up a IDC handle by session.
200 *
201 * @returns The IDC handle on success, NULL on failure.
202 * @param pSession The session to lookup.
203 *
204 * @internal
205 */
206PSUPDRVIDCHANDLE supR0IdcGetHandleFromSession(PSUPDRVSESSION pSession)
207{
208 PSUPDRVIDCHANDLE pHandle = (PSUPDRVIDCHANDLE)ASMAtomicUoReadPtr((void * volatile *)&g_pMainHandle);
209 if ( VALID_PTR(pHandle)
210 && pHandle->s.pSession == pSession)
211 return pHandle;
212 return NULL;
213}
214
Note: See TracBrowser for help on using the repository browser.

© 2023 Oracle
ContactPrivacy policyTerms of Use