VirtualBox

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

最後變更 在這個檔案從90329是 90329,由 vboxsync 提交於 4 年 前

PDMDrvHlp: Put the PDMCritSect API into driver helpers just like we've got for devices. bugref:10074

  • 屬性 svn:eol-style 設為 native
  • 屬性 svn:keywords 設為 Author Date Id Revision
檔案大小: 9.0 KB
 
1/* $Id: PDMR0Driver.cpp 90329 2021-07-26 12:47:26Z 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.alldomusa.eu.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 NOREF(pDrvIns);
120 return PDMCritSectEnter(pCritSect, rcBusy);
121}
122
123
124/** @interface_method_impl{PDMDRVHLPR0,pfnCritSectEnterDebug} */
125static DECLCALLBACK(int) pdmR0DrvHlp_CritSectEnterDebug(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect, int rcBusy,
126 RTHCUINTPTR uId, RT_SRC_POS_DECL)
127{
128 PDMDRV_ASSERT_DRVINS(pDrvIns);
129 NOREF(pDrvIns);
130 return PDMCritSectEnterDebug(pCritSect, rcBusy, uId, RT_SRC_POS_ARGS);
131}
132
133
134/** @interface_method_impl{PDMDRVHLPR0,pfnCritSectTryEnter} */
135static DECLCALLBACK(int) pdmR0DrvHlp_CritSectTryEnter(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect)
136{
137 PDMDRV_ASSERT_DRVINS(pDrvIns);
138 NOREF(pDrvIns);
139 return PDMCritSectTryEnter(pCritSect);
140}
141
142
143/** @interface_method_impl{PDMDRVHLPR0,pfnCritSectTryEnterDebug} */
144static DECLCALLBACK(int) pdmR0DrvHlp_CritSectTryEnterDebug(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect,
145 RTHCUINTPTR uId, RT_SRC_POS_DECL)
146{
147 PDMDRV_ASSERT_DRVINS(pDrvIns);
148 NOREF(pDrvIns);
149 return PDMCritSectTryEnterDebug(pCritSect, uId, RT_SRC_POS_ARGS);
150}
151
152
153/** @interface_method_impl{PDMDRVHLPR0,pfnCritSectLeave} */
154static DECLCALLBACK(int) pdmR0DrvHlp_CritSectLeave(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect)
155{
156 PDMDRV_ASSERT_DRVINS(pDrvIns);
157 NOREF(pDrvIns);
158 return PDMCritSectLeave(pCritSect);
159}
160
161
162/** @interface_method_impl{PDMDRVHLPR0,pfnCritSectIsOwner} */
163static DECLCALLBACK(bool) pdmR0DrvHlp_CritSectIsOwner(PPDMDRVINS pDrvIns, PCPDMCRITSECT pCritSect)
164{
165 PDMDRV_ASSERT_DRVINS(pDrvIns);
166 NOREF(pDrvIns);
167 return PDMCritSectIsOwner(pCritSect);
168}
169
170
171/** @interface_method_impl{PDMDRVHLPR0,pfnCritSectIsInitialized} */
172static DECLCALLBACK(bool) pdmR0DrvHlp_CritSectIsInitialized(PPDMDRVINS pDrvIns, PCPDMCRITSECT pCritSect)
173{
174 PDMDRV_ASSERT_DRVINS(pDrvIns);
175 NOREF(pDrvIns);
176 return PDMCritSectIsInitialized(pCritSect);
177}
178
179
180/** @interface_method_impl{PDMDRVHLPR0,pfnCritSectHasWaiters} */
181static DECLCALLBACK(bool) pdmR0DrvHlp_CritSectHasWaiters(PPDMDRVINS pDrvIns, PCPDMCRITSECT pCritSect)
182{
183 PDMDRV_ASSERT_DRVINS(pDrvIns);
184 NOREF(pDrvIns);
185 return PDMCritSectHasWaiters(pCritSect);
186}
187
188
189/** @interface_method_impl{PDMDRVHLPR0,pfnCritSectGetRecursion} */
190static DECLCALLBACK(uint32_t) pdmR0DrvHlp_CritSectGetRecursion(PPDMDRVINS pDrvIns, PCPDMCRITSECT pCritSect)
191{
192 PDMDRV_ASSERT_DRVINS(pDrvIns);
193 NOREF(pDrvIns);
194 return PDMCritSectGetRecursion(pCritSect);
195}
196
197
198/** @interface_method_impl{PDMDRVHLPR0,pfn} */
199static DECLCALLBACK(int) pdmR0DrvHlp_CritSectScheduleExitEvent(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect,
200 SUPSEMEVENT hEventToSignal)
201{
202 PDMDRV_ASSERT_DRVINS(pDrvIns);
203 NOREF(pDrvIns);
204 return PDMHCCritSectScheduleExitEvent(pCritSect, hEventToSignal);
205}
206
207
208/** @interface_method_impl{PDMDRVHLPR0,pfn} */
209
210
211/**
212 * The Ring-0 Context Driver Helper Callbacks.
213 */
214extern DECLEXPORT(const PDMDRVHLPR0) g_pdmR0DrvHlp =
215{
216 PDM_DRVHLPRC_VERSION,
217 pdmR0DrvHlp_VMSetError,
218 pdmR0DrvHlp_VMSetErrorV,
219 pdmR0DrvHlp_VMSetRuntimeError,
220 pdmR0DrvHlp_VMSetRuntimeErrorV,
221 pdmR0DrvHlp_AssertEMT,
222 pdmR0DrvHlp_AssertOther,
223 pdmR0DrvHlp_CritSectEnter,
224 pdmR0DrvHlp_CritSectEnterDebug,
225 pdmR0DrvHlp_CritSectTryEnter,
226 pdmR0DrvHlp_CritSectTryEnterDebug,
227 pdmR0DrvHlp_CritSectLeave,
228 pdmR0DrvHlp_CritSectIsOwner,
229 pdmR0DrvHlp_CritSectIsInitialized,
230 pdmR0DrvHlp_CritSectHasWaiters,
231 pdmR0DrvHlp_CritSectGetRecursion,
232 pdmR0DrvHlp_CritSectScheduleExitEvent,
233 PDM_DRVHLPRC_VERSION
234};
235
236/** @} */
237
238
239
240/**
241 * PDMDrvHlpCallR0 helper.
242 *
243 * @returns See PFNPDMDRVREQHANDLERR0.
244 * @param pGVM The global (ring-0) VM structure. (For validation.)
245 * @param pReq Pointer to the request buffer.
246 */
247VMMR0_INT_DECL(int) PDMR0DriverCallReqHandler(PGVM pGVM, PPDMDRIVERCALLREQHANDLERREQ pReq)
248{
249 /*
250 * Validate input and make the call.
251 */
252 int rc = GVMMR0ValidateGVM(pGVM);
253 if (RT_SUCCESS(rc))
254 {
255 AssertPtrReturn(pReq, VERR_INVALID_POINTER);
256 AssertMsgReturn(pReq->Hdr.cbReq == sizeof(*pReq), ("%#x != %#x\n", pReq->Hdr.cbReq, sizeof(*pReq)), VERR_INVALID_PARAMETER);
257
258 PPDMDRVINS pDrvIns = pReq->pDrvInsR0;
259 AssertPtrReturn(pDrvIns, VERR_INVALID_POINTER);
260 AssertReturn(pDrvIns->Internal.s.pVMR0 == pGVM, VERR_INVALID_PARAMETER);
261
262 PFNPDMDRVREQHANDLERR0 pfnReqHandlerR0 = pDrvIns->Internal.s.pfnReqHandlerR0;
263 AssertPtrReturn(pfnReqHandlerR0, VERR_INVALID_POINTER);
264
265 rc = pfnReqHandlerR0(pDrvIns, pReq->uOperation, pReq->u64Arg);
266 }
267 return rc;
268}
269
注意: 瀏覽 TracBrowser 來幫助您使用儲存庫瀏覽器

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