VirtualBox

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

Last change on this file since 95140 was 93115, checked in by vboxsync, 3 years ago

scm --update-copyright-year

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 8.0 KB
Line 
1/* $Id: PDMR0Driver.cpp 93115 2022-01-01 11:31:46Z vboxsync $ */
2/** @file
3 * PDM - Pluggable Device and Driver Manager, R0 Driver parts.
4 */
5
6/*
7 * Copyright (C) 2010-2022 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,pfnAssertEMT} */
46static DECLCALLBACK(bool) pdmR0DrvHlp_AssertEMT(PPDMDRVINS pDrvIns, const char *pszFile, unsigned iLine, const char *pszFunction)
47{
48 PDMDRV_ASSERT_DRVINS(pDrvIns);
49 if (VM_IS_EMT(pDrvIns->Internal.s.pVMR0))
50 return true;
51
52 RTAssertMsg1Weak("AssertEMT", iLine, pszFile, pszFunction);
53 RTAssertPanic();
54 return false;
55}
56
57
58/** @interface_method_impl{PDMDRVHLPR0,pfnAssertOther} */
59static DECLCALLBACK(bool) pdmR0DrvHlp_AssertOther(PPDMDRVINS pDrvIns, const char *pszFile, unsigned iLine, const char *pszFunction)
60{
61 PDMDRV_ASSERT_DRVINS(pDrvIns);
62 if (!VM_IS_EMT(pDrvIns->Internal.s.pVMR0))
63 return true;
64
65 RTAssertMsg1Weak("AssertOther", iLine, pszFile, pszFunction);
66 RTAssertPanic();
67 return false;
68}
69
70
71/** @interface_method_impl{PDMDRVHLPR0,pfnCritSectEnter} */
72static DECLCALLBACK(int) pdmR0DrvHlp_CritSectEnter(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect, int rcBusy)
73{
74 PDMDRV_ASSERT_DRVINS(pDrvIns);
75 return PDMCritSectEnter(pDrvIns->Internal.s.pVMR0, pCritSect, rcBusy);
76}
77
78
79/** @interface_method_impl{PDMDRVHLPR0,pfnCritSectEnterDebug} */
80static DECLCALLBACK(int) pdmR0DrvHlp_CritSectEnterDebug(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect, int rcBusy,
81 RTHCUINTPTR uId, RT_SRC_POS_DECL)
82{
83 PDMDRV_ASSERT_DRVINS(pDrvIns);
84 return PDMCritSectEnterDebug(pDrvIns->Internal.s.pVMR0, pCritSect, rcBusy, uId, RT_SRC_POS_ARGS);
85}
86
87
88/** @interface_method_impl{PDMDRVHLPR0,pfnCritSectTryEnter} */
89static DECLCALLBACK(int) pdmR0DrvHlp_CritSectTryEnter(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect)
90{
91 PDMDRV_ASSERT_DRVINS(pDrvIns);
92 return PDMCritSectTryEnter(pDrvIns->Internal.s.pVMR0, pCritSect);
93}
94
95
96/** @interface_method_impl{PDMDRVHLPR0,pfnCritSectTryEnterDebug} */
97static DECLCALLBACK(int) pdmR0DrvHlp_CritSectTryEnterDebug(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect,
98 RTHCUINTPTR uId, RT_SRC_POS_DECL)
99{
100 PDMDRV_ASSERT_DRVINS(pDrvIns);
101 return PDMCritSectTryEnterDebug(pDrvIns->Internal.s.pVMR0, pCritSect, uId, RT_SRC_POS_ARGS);
102}
103
104
105/** @interface_method_impl{PDMDRVHLPR0,pfnCritSectLeave} */
106static DECLCALLBACK(int) pdmR0DrvHlp_CritSectLeave(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect)
107{
108 PDMDRV_ASSERT_DRVINS(pDrvIns);
109 return PDMCritSectLeave(pDrvIns->Internal.s.pVMR0, pCritSect);
110}
111
112
113/** @interface_method_impl{PDMDRVHLPR0,pfnCritSectIsOwner} */
114static DECLCALLBACK(bool) pdmR0DrvHlp_CritSectIsOwner(PPDMDRVINS pDrvIns, PCPDMCRITSECT pCritSect)
115{
116 PDMDRV_ASSERT_DRVINS(pDrvIns);
117 return PDMCritSectIsOwner(pDrvIns->Internal.s.pVMR0, pCritSect);
118}
119
120
121/** @interface_method_impl{PDMDRVHLPR0,pfnCritSectIsInitialized} */
122static DECLCALLBACK(bool) pdmR0DrvHlp_CritSectIsInitialized(PPDMDRVINS pDrvIns, PCPDMCRITSECT pCritSect)
123{
124 PDMDRV_ASSERT_DRVINS(pDrvIns);
125 NOREF(pDrvIns);
126 return PDMCritSectIsInitialized(pCritSect);
127}
128
129
130/** @interface_method_impl{PDMDRVHLPR0,pfnCritSectHasWaiters} */
131static DECLCALLBACK(bool) pdmR0DrvHlp_CritSectHasWaiters(PPDMDRVINS pDrvIns, PCPDMCRITSECT pCritSect)
132{
133 PDMDRV_ASSERT_DRVINS(pDrvIns);
134 return PDMCritSectHasWaiters(pDrvIns->Internal.s.pVMR0, pCritSect);
135}
136
137
138/** @interface_method_impl{PDMDRVHLPR0,pfnCritSectGetRecursion} */
139static DECLCALLBACK(uint32_t) pdmR0DrvHlp_CritSectGetRecursion(PPDMDRVINS pDrvIns, PCPDMCRITSECT pCritSect)
140{
141 PDMDRV_ASSERT_DRVINS(pDrvIns);
142 NOREF(pDrvIns);
143 return PDMCritSectGetRecursion(pCritSect);
144}
145
146
147/** @interface_method_impl{PDMDRVHLPR0,pfnCritSectScheduleExitEvent} */
148static DECLCALLBACK(int) pdmR0DrvHlp_CritSectScheduleExitEvent(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect,
149 SUPSEMEVENT hEventToSignal)
150{
151 PDMDRV_ASSERT_DRVINS(pDrvIns);
152 NOREF(pDrvIns);
153 return PDMHCCritSectScheduleExitEvent(pCritSect, hEventToSignal);
154}
155
156
157/** @interface_method_impl{PDMDRVHLPR0,pfnNetShaperAllocateBandwidth} */
158static DECLCALLBACK(bool) pdmR0DrvHlp_NetShaperAllocateBandwidth(PPDMDRVINS pDrvIns, PPDMNSFILTER pFilter, size_t cbTransfer)
159{
160#ifdef VBOX_WITH_NETSHAPER
161 PDMDRV_ASSERT_DRVINS(pDrvIns);
162 LogFlow(("pdmR0DrvHlp_NetShaperDetach: caller='%s'/%d: pFilter=%p cbTransfer=%#zx\n",
163 pDrvIns->pReg->szName, pDrvIns->iInstance, pFilter, cbTransfer));
164
165 bool const fRc = PDMNetShaperAllocateBandwidth(pDrvIns->Internal.s.pVMR0, pFilter, cbTransfer);
166
167 LogFlow(("pdmR0DrvHlp_NetShaperDetach: caller='%s'/%d: returns %RTbool\n", pDrvIns->pReg->szName, pDrvIns->iInstance, fRc));
168 return fRc;
169#else
170 RT_NOREF(pDrvIns, pFilter, cbTransfer);
171 return true;
172#endif
173}
174
175
176/**
177 * The Ring-0 Context Driver Helper Callbacks.
178 */
179extern DECLEXPORT(const PDMDRVHLPR0) g_pdmR0DrvHlp =
180{
181 PDM_DRVHLPRC_VERSION,
182 pdmR0DrvHlp_AssertEMT,
183 pdmR0DrvHlp_AssertOther,
184 pdmR0DrvHlp_CritSectEnter,
185 pdmR0DrvHlp_CritSectEnterDebug,
186 pdmR0DrvHlp_CritSectTryEnter,
187 pdmR0DrvHlp_CritSectTryEnterDebug,
188 pdmR0DrvHlp_CritSectLeave,
189 pdmR0DrvHlp_CritSectIsOwner,
190 pdmR0DrvHlp_CritSectIsInitialized,
191 pdmR0DrvHlp_CritSectHasWaiters,
192 pdmR0DrvHlp_CritSectGetRecursion,
193 pdmR0DrvHlp_CritSectScheduleExitEvent,
194 pdmR0DrvHlp_NetShaperAllocateBandwidth,
195 PDM_DRVHLPRC_VERSION
196};
197
198/** @} */
199
200
201
202/**
203 * PDMDrvHlpCallR0 helper.
204 *
205 * @returns See PFNPDMDRVREQHANDLERR0.
206 * @param pGVM The global (ring-0) VM structure. (For validation.)
207 * @param pReq Pointer to the request buffer.
208 */
209VMMR0_INT_DECL(int) PDMR0DriverCallReqHandler(PGVM pGVM, PPDMDRIVERCALLREQHANDLERREQ pReq)
210{
211 /*
212 * Validate input and make the call.
213 */
214 int rc = GVMMR0ValidateGVM(pGVM);
215 if (RT_SUCCESS(rc))
216 {
217 AssertPtrReturn(pReq, VERR_INVALID_POINTER);
218 AssertMsgReturn(pReq->Hdr.cbReq == sizeof(*pReq), ("%#x != %#x\n", pReq->Hdr.cbReq, sizeof(*pReq)), VERR_INVALID_PARAMETER);
219
220 PPDMDRVINS pDrvIns = pReq->pDrvInsR0;
221 AssertPtrReturn(pDrvIns, VERR_INVALID_POINTER);
222 AssertReturn(pDrvIns->Internal.s.pVMR0 == pGVM, VERR_INVALID_PARAMETER);
223
224 PFNPDMDRVREQHANDLERR0 pfnReqHandlerR0 = pDrvIns->Internal.s.pfnReqHandlerR0;
225 AssertPtrReturn(pfnReqHandlerR0, VERR_INVALID_POINTER);
226
227 rc = pfnReqHandlerR0(pDrvIns, pReq->uOperation, pReq->u64Arg);
228 }
229 return rc;
230}
231
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