VirtualBox

source: vbox/trunk/src/VBox/VMM/VMMR0/PDMR0Driver.cpp@ 90724

Last change on this file since 90724 was 90382, checked in by vboxsync, 4 years ago

VMM: Doxygen fixes for critsect devhlps. bugref:9218 bugref:10074

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 9.8 KB
Line 
1/* $Id: PDMR0Driver.cpp 90382 2021-07-28 22:13:15Z vboxsync $ */
2/** @file
3 * PDM - Pluggable Device and Driver Manager, R0 Driver parts.
4 */
5
6/*
7 * Copyright (C) 2010-2020 Oracle Corporation
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
18
19/*********************************************************************************************************************************
20* Header Files *
21*********************************************************************************************************************************/
22#define LOG_GROUP LOG_GROUP_PDM_DRIVER
23#include "PDMInternal.h"
24#include <VBox/vmm/pdm.h>
25#include <VBox/vmm/vmcc.h>
26#include <VBox/vmm/gvmm.h>
27
28#include <VBox/log.h>
29#include <iprt/errcore.h>
30#include <iprt/assert.h>
31
32
33/*********************************************************************************************************************************
34* Global Variables *
35*********************************************************************************************************************************/
36RT_C_DECLS_BEGIN
37extern DECLEXPORT(const PDMDRVHLPR0) g_pdmR0DrvHlp;
38RT_C_DECLS_END
39
40
41/** @name Ring-0 Context Driver Helpers
42 * @{
43 */
44
45/** @interface_method_impl{PDMDRVHLPR0,pfnVMSetError} */
46static DECLCALLBACK(int) pdmR0DrvHlp_VMSetError(PPDMDRVINS pDrvIns, int rc, RT_SRC_POS_DECL, const char *pszFormat, ...)
47{
48 PDMDRV_ASSERT_DRVINS(pDrvIns);
49 va_list args;
50 va_start(args, pszFormat);
51 int rc2 = VMSetErrorV(pDrvIns->Internal.s.pVMR0, rc, RT_SRC_POS_ARGS, pszFormat, args); Assert(rc2 == rc); NOREF(rc2);
52 va_end(args);
53 return rc;
54}
55
56
57/** @interface_method_impl{PDMDRVHLPR0,pfnVMSetErrorV} */
58static DECLCALLBACK(int) pdmR0DrvHlp_VMSetErrorV(PPDMDRVINS pDrvIns, int rc, RT_SRC_POS_DECL, const char *pszFormat, va_list va)
59{
60 PDMDRV_ASSERT_DRVINS(pDrvIns);
61 int rc2 = VMSetErrorV(pDrvIns->Internal.s.pVMR0, rc, RT_SRC_POS_ARGS, pszFormat, va); Assert(rc2 == rc); NOREF(rc2);
62 return rc;
63}
64
65
66/** @interface_method_impl{PDMDRVHLPR0,pfnVMSetRuntimeError} */
67static DECLCALLBACK(int) pdmR0DrvHlp_VMSetRuntimeError(PPDMDRVINS pDrvIns, uint32_t fFlags, const char *pszErrorId,
68 const char *pszFormat, ...)
69{
70 PDMDRV_ASSERT_DRVINS(pDrvIns);
71 va_list va;
72 va_start(va, pszFormat);
73 int rc = VMSetRuntimeErrorV(pDrvIns->Internal.s.pVMR0, fFlags, pszErrorId, pszFormat, va);
74 va_end(va);
75 return rc;
76}
77
78
79/** @interface_method_impl{PDMDRVHLPR0,pfnVMSetRuntimeErrorV} */
80static DECLCALLBACK(int) pdmR0DrvHlp_VMSetRuntimeErrorV(PPDMDRVINS pDrvIns, uint32_t fFlags, const char *pszErrorId,
81 const char *pszFormat, va_list va)
82{
83 PDMDRV_ASSERT_DRVINS(pDrvIns);
84 int rc = VMSetRuntimeErrorV(pDrvIns->Internal.s.pVMR0, fFlags, pszErrorId, pszFormat, va);
85 return rc;
86}
87
88
89/** @interface_method_impl{PDMDRVHLPR0,pfnAssertEMT} */
90static DECLCALLBACK(bool) pdmR0DrvHlp_AssertEMT(PPDMDRVINS pDrvIns, const char *pszFile, unsigned iLine, const char *pszFunction)
91{
92 PDMDRV_ASSERT_DRVINS(pDrvIns);
93 if (VM_IS_EMT(pDrvIns->Internal.s.pVMR0))
94 return true;
95
96 RTAssertMsg1Weak("AssertEMT", iLine, pszFile, pszFunction);
97 RTAssertPanic();
98 return false;
99}
100
101
102/** @interface_method_impl{PDMDRVHLPR0,pfnAssertOther} */
103static DECLCALLBACK(bool) pdmR0DrvHlp_AssertOther(PPDMDRVINS pDrvIns, const char *pszFile, unsigned iLine, const char *pszFunction)
104{
105 PDMDRV_ASSERT_DRVINS(pDrvIns);
106 if (!VM_IS_EMT(pDrvIns->Internal.s.pVMR0))
107 return true;
108
109 RTAssertMsg1Weak("AssertOther", iLine, pszFile, pszFunction);
110 RTAssertPanic();
111 return false;
112}
113
114
115/** @interface_method_impl{PDMDRVHLPR0,pfnCritSectEnter} */
116static DECLCALLBACK(int) pdmR0DrvHlp_CritSectEnter(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect, int rcBusy)
117{
118 PDMDRV_ASSERT_DRVINS(pDrvIns);
119 return PDMCritSectEnter(pDrvIns->Internal.s.pVMR0, pCritSect, rcBusy);
120}
121
122
123/** @interface_method_impl{PDMDRVHLPR0,pfnCritSectEnterDebug} */
124static DECLCALLBACK(int) pdmR0DrvHlp_CritSectEnterDebug(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect, int rcBusy,
125 RTHCUINTPTR uId, RT_SRC_POS_DECL)
126{
127 PDMDRV_ASSERT_DRVINS(pDrvIns);
128 return PDMCritSectEnterDebug(pDrvIns->Internal.s.pVMR0, pCritSect, rcBusy, uId, RT_SRC_POS_ARGS);
129}
130
131
132/** @interface_method_impl{PDMDRVHLPR0,pfnCritSectTryEnter} */
133static DECLCALLBACK(int) pdmR0DrvHlp_CritSectTryEnter(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect)
134{
135 PDMDRV_ASSERT_DRVINS(pDrvIns);
136 return PDMCritSectTryEnter(pDrvIns->Internal.s.pVMR0, pCritSect);
137}
138
139
140/** @interface_method_impl{PDMDRVHLPR0,pfnCritSectTryEnterDebug} */
141static DECLCALLBACK(int) pdmR0DrvHlp_CritSectTryEnterDebug(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect,
142 RTHCUINTPTR uId, RT_SRC_POS_DECL)
143{
144 PDMDRV_ASSERT_DRVINS(pDrvIns);
145 return PDMCritSectTryEnterDebug(pDrvIns->Internal.s.pVMR0, pCritSect, uId, RT_SRC_POS_ARGS);
146}
147
148
149/** @interface_method_impl{PDMDRVHLPR0,pfnCritSectLeave} */
150static DECLCALLBACK(int) pdmR0DrvHlp_CritSectLeave(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect)
151{
152 PDMDRV_ASSERT_DRVINS(pDrvIns);
153 return PDMCritSectLeave(pDrvIns->Internal.s.pVMR0, pCritSect);
154}
155
156
157/** @interface_method_impl{PDMDRVHLPR0,pfnCritSectIsOwner} */
158static DECLCALLBACK(bool) pdmR0DrvHlp_CritSectIsOwner(PPDMDRVINS pDrvIns, PCPDMCRITSECT pCritSect)
159{
160 PDMDRV_ASSERT_DRVINS(pDrvIns);
161 return PDMCritSectIsOwner(pDrvIns->Internal.s.pVMR0, pCritSect);
162}
163
164
165/** @interface_method_impl{PDMDRVHLPR0,pfnCritSectIsInitialized} */
166static DECLCALLBACK(bool) pdmR0DrvHlp_CritSectIsInitialized(PPDMDRVINS pDrvIns, PCPDMCRITSECT pCritSect)
167{
168 PDMDRV_ASSERT_DRVINS(pDrvIns);
169 NOREF(pDrvIns);
170 return PDMCritSectIsInitialized(pCritSect);
171}
172
173
174/** @interface_method_impl{PDMDRVHLPR0,pfnCritSectHasWaiters} */
175static DECLCALLBACK(bool) pdmR0DrvHlp_CritSectHasWaiters(PPDMDRVINS pDrvIns, PCPDMCRITSECT pCritSect)
176{
177 PDMDRV_ASSERT_DRVINS(pDrvIns);
178 return PDMCritSectHasWaiters(pDrvIns->Internal.s.pVMR0, pCritSect);
179}
180
181
182/** @interface_method_impl{PDMDRVHLPR0,pfnCritSectGetRecursion} */
183static DECLCALLBACK(uint32_t) pdmR0DrvHlp_CritSectGetRecursion(PPDMDRVINS pDrvIns, PCPDMCRITSECT pCritSect)
184{
185 PDMDRV_ASSERT_DRVINS(pDrvIns);
186 NOREF(pDrvIns);
187 return PDMCritSectGetRecursion(pCritSect);
188}
189
190
191/** @interface_method_impl{PDMDRVHLPR0,pfnCritSectScheduleExitEvent} */
192static DECLCALLBACK(int) pdmR0DrvHlp_CritSectScheduleExitEvent(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect,
193 SUPSEMEVENT hEventToSignal)
194{
195 PDMDRV_ASSERT_DRVINS(pDrvIns);
196 NOREF(pDrvIns);
197 return PDMHCCritSectScheduleExitEvent(pCritSect, hEventToSignal);
198}
199
200
201/** @interface_method_impl{PDMDRVHLPR0,pfnNetShaperAllocateBandwidth} */
202static DECLCALLBACK(bool) pdmR0DrvHlp_NetShaperAllocateBandwidth(PPDMDRVINS pDrvIns, PPDMNSFILTER pFilter, size_t cbTransfer)
203{
204#ifdef VBOX_WITH_NETSHAPER
205 PDMDRV_ASSERT_DRVINS(pDrvIns);
206 LogFlow(("pdmR0DrvHlp_NetShaperDetach: caller='%s'/%d: pFilter=%p cbTransfer=%#zx\n",
207 pDrvIns->pReg->szName, pDrvIns->iInstance, pFilter, cbTransfer));
208
209 bool const fRc = PDMNetShaperAllocateBandwidth(pDrvIns->Internal.s.pVMR0, pFilter, cbTransfer);
210
211 LogFlow(("pdmR0DrvHlp_NetShaperDetach: caller='%s'/%d: returns %RTbool\n", pDrvIns->pReg->szName, pDrvIns->iInstance, fRc));
212 return fRc;
213#else
214 RT_NOREF(pDrvIns, pFilter, cbTransfer);
215 return true;
216#endif
217}
218
219
220/**
221 * The Ring-0 Context Driver Helper Callbacks.
222 */
223extern DECLEXPORT(const PDMDRVHLPR0) g_pdmR0DrvHlp =
224{
225 PDM_DRVHLPRC_VERSION,
226 pdmR0DrvHlp_VMSetError,
227 pdmR0DrvHlp_VMSetErrorV,
228 pdmR0DrvHlp_VMSetRuntimeError,
229 pdmR0DrvHlp_VMSetRuntimeErrorV,
230 pdmR0DrvHlp_AssertEMT,
231 pdmR0DrvHlp_AssertOther,
232 pdmR0DrvHlp_CritSectEnter,
233 pdmR0DrvHlp_CritSectEnterDebug,
234 pdmR0DrvHlp_CritSectTryEnter,
235 pdmR0DrvHlp_CritSectTryEnterDebug,
236 pdmR0DrvHlp_CritSectLeave,
237 pdmR0DrvHlp_CritSectIsOwner,
238 pdmR0DrvHlp_CritSectIsInitialized,
239 pdmR0DrvHlp_CritSectHasWaiters,
240 pdmR0DrvHlp_CritSectGetRecursion,
241 pdmR0DrvHlp_CritSectScheduleExitEvent,
242 pdmR0DrvHlp_NetShaperAllocateBandwidth,
243 PDM_DRVHLPRC_VERSION
244};
245
246/** @} */
247
248
249
250/**
251 * PDMDrvHlpCallR0 helper.
252 *
253 * @returns See PFNPDMDRVREQHANDLERR0.
254 * @param pGVM The global (ring-0) VM structure. (For validation.)
255 * @param pReq Pointer to the request buffer.
256 */
257VMMR0_INT_DECL(int) PDMR0DriverCallReqHandler(PGVM pGVM, PPDMDRIVERCALLREQHANDLERREQ pReq)
258{
259 /*
260 * Validate input and make the call.
261 */
262 int rc = GVMMR0ValidateGVM(pGVM);
263 if (RT_SUCCESS(rc))
264 {
265 AssertPtrReturn(pReq, VERR_INVALID_POINTER);
266 AssertMsgReturn(pReq->Hdr.cbReq == sizeof(*pReq), ("%#x != %#x\n", pReq->Hdr.cbReq, sizeof(*pReq)), VERR_INVALID_PARAMETER);
267
268 PPDMDRVINS pDrvIns = pReq->pDrvInsR0;
269 AssertPtrReturn(pDrvIns, VERR_INVALID_POINTER);
270 AssertReturn(pDrvIns->Internal.s.pVMR0 == pGVM, VERR_INVALID_PARAMETER);
271
272 PFNPDMDRVREQHANDLERR0 pfnReqHandlerR0 = pDrvIns->Internal.s.pfnReqHandlerR0;
273 AssertPtrReturn(pfnReqHandlerR0, VERR_INVALID_POINTER);
274
275 rc = pfnReqHandlerR0(pDrvIns, pReq->uOperation, pReq->u64Arg);
276 }
277 return rc;
278}
279
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette