VirtualBox

source: vbox/trunk/src/VBox/Devices/GIMDev/GIMDev.cpp@ 57426

Last change on this file since 57426 was 57358, checked in by vboxsync, 9 years ago

*: scm cleanup run.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.2 KB
Line 
1/* $Id: GIMDev.cpp 57358 2015-08-14 15:16:38Z vboxsync $ */
2/** @file
3 * Guest Interface Manager Device.
4 */
5
6/*
7 * Copyright (C) 2014-2015 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_DEV_GIM
23#include <VBox/vmm/pdmdev.h>
24#include <VBox/vmm/gim.h>
25#include <VBox/vmm/vm.h>
26
27#include "VBoxDD.h"
28
29/**
30 * GIM device.
31 */
32typedef struct GIMDEV
33{
34 /** Pointer to the device instance - R3 Ptr. */
35 PPDMDEVINSR3 pDevInsR3;
36 /** Pointer to the device instance - R0 Ptr. */
37 PPDMDEVINSR0 pDevInsR0;
38 /** Pointer to the device instance - RC Ptr. */
39 PPDMDEVINSRC pDevInsRC;
40 /** Alignment. */
41 RTRCPTR Alignment0;
42} GIMDEV;
43/** Pointer to the GIM device state. */
44typedef GIMDEV *PGIMDEV;
45
46
47#ifndef VBOX_DEVICE_STRUCT_TESTCASE
48
49#ifdef IN_RING3
50/**
51 * @interface_method_impl{PDMDEVREG,pfnConstruct}
52 */
53static DECLCALLBACK(int) gimdevR3Construct(PPDMDEVINS pDevIns, int iInstance, PCFGMNODE pCfg)
54{
55 Assert(iInstance == 0);
56 PGIMDEV pThis = PDMINS_2_DATA(pDevIns, PGIMDEV);
57 PDMDEV_CHECK_VERSIONS_RETURN(pDevIns);
58
59 /*
60 * Initialize relevant state bits.
61 */
62 pThis->pDevInsR3 = pDevIns;
63 pThis->pDevInsR0 = PDMDEVINS_2_R0PTR(pDevIns);
64 pThis->pDevInsRC = PDMDEVINS_2_RCPTR(pDevIns);
65
66 /*
67 * Register ourselves with the GIM VMM component.
68 */
69 PVM pVM = PDMDevHlpGetVM(pDevIns);
70 GIMR3GimDeviceRegister(pVM, pDevIns);
71
72 /*
73 * Get the MMIO2 regions from the GIM provider.
74 */
75 uint32_t cRegions = 0;
76 PGIMMMIO2REGION pRegionsR3 = GIMR3GetMmio2Regions(pVM, &cRegions);
77 if ( cRegions
78 && pRegionsR3)
79 {
80 /*
81 * Register the MMIO2 regions.
82 */
83 PGIMMMIO2REGION pCur = pRegionsR3;
84 for (uint32_t i = 0; i < cRegions; i++, pCur++)
85 {
86 Assert(!pCur->fRegistered);
87 int rc = PDMDevHlpMMIO2Register(pDevIns, pCur->iRegion, pCur->cbRegion, 0 /* fFlags */, &pCur->pvPageR3,
88 pCur->szDescription);
89 if (RT_FAILURE(rc))
90 return rc;
91
92 pCur->fRegistered = true;
93
94#if defined(VBOX_WITH_2X_4GB_ADDR_SPACE)
95 RTR0PTR pR0Mapping = 0;
96 rc = PDMDevHlpMMIO2MapKernel(pDevIns, pCur->iRegion, 0 /* off */, pCur->cbRegion, pCur->szDescription,
97 &pR0Mapping);
98 AssertLogRelMsgRCReturn(rc, ("PDMDevHlpMapMMIO2IntoR0(%#x,) -> %Rrc\n", pCur->cbRegion, rc), rc);
99 pCur->pvPageR0 = pR0Mapping;
100#else
101 pCur->pvPageR0 = (RTR0PTR)pCur->pvPageR3;
102#endif
103
104 /*
105 * Map into RC if required.
106 */
107 if (pCur->fRCMapping)
108 {
109 RTRCPTR pRCMapping = 0;
110 rc = PDMDevHlpMMHyperMapMMIO2(pDevIns, pCur->iRegion, 0 /* off */, pCur->cbRegion, pCur->szDescription,
111 &pRCMapping);
112 AssertLogRelMsgRCReturn(rc, ("PDMDevHlpMMHyperMapMMIO2(%#x,) -> %Rrc\n", pCur->cbRegion, rc), rc);
113 pCur->pvPageRC = pRCMapping;
114 }
115 else
116 pCur->pvPageRC = NIL_RTRCPTR;
117
118 LogRel(("GIMDev: Registered %s\n", pCur->szDescription));
119 }
120 }
121
122 /** @todo Register SSM: PDMDevHlpSSMRegister(). */
123 /** @todo Register statistics: STAM_REG(). */
124 /** @todo Register DBGFInfo: PDMDevHlpDBGFInfoRegister(). */
125
126 return VINF_SUCCESS;
127}
128
129/**
130 * @interface_method_impl{PDMDEVREG,pfnDestruct}
131 */
132static DECLCALLBACK(int) gimdevR3Destruct(PPDMDEVINS pDevIns)
133{
134 PGIMDEV pThis = PDMINS_2_DATA(pDevIns, PGIMDEV);
135 PVM pVM = PDMDevHlpGetVM(pDevIns);
136 uint32_t cRegions = 0;
137
138 PGIMMMIO2REGION pCur = GIMR3GetMmio2Regions(pVM, &cRegions);
139 for (uint32_t i = 0; i < cRegions; i++, pCur++)
140 {
141 int rc = PDMDevHlpMMIO2Deregister(pDevIns, pCur->iRegion);
142 if (RT_FAILURE(rc))
143 return rc;
144 }
145
146 return VINF_SUCCESS;
147}
148
149
150/**
151 * @interface_method_impl{PDMDEVREG,pfnRelocate}
152 */
153static DECLCALLBACK(void) gimdevR3Relocate(PPDMDEVINS pDevIns, RTGCINTPTR offDelta)
154{
155 NOREF(pDevIns);
156 NOREF(offDelta);
157}
158
159
160/**
161 * @interface_method_impl{PDMDEVREG,pfnReset}
162 */
163static DECLCALLBACK(void) gimdevR3Reset(PPDMDEVINS pDevIns)
164{
165 NOREF(pDevIns);
166 /* We do not deregister any MMIO2 regions as the regions are expected to be static. */
167}
168
169
170/**
171 * The device registration structure.
172 */
173const PDMDEVREG g_DeviceGIMDev =
174{
175 /* u32Version */
176 PDM_DEVREG_VERSION,
177 /* szName */
178 "GIMDev",
179 /* szRCMod */
180 "VBoxDDRC.rc",
181 /* szR0Mod */
182 "VBoxDDR0.r0",
183 /* pszDescription */
184 "VirtualBox GIM Device",
185 /* fFlags */
186 PDM_DEVREG_FLAGS_DEFAULT_BITS | PDM_DEVREG_FLAGS_R0 | PDM_DEVREG_FLAGS_RC,
187 /* fClass */
188 PDM_DEVREG_CLASS_MISC,
189 /* cMaxInstances */
190 1,
191 /* cbInstance */
192 sizeof(GIMDEV),
193 /* pfnConstruct */
194 gimdevR3Construct,
195 /* pfnDestruct */
196 gimdevR3Destruct,
197 /* pfnRelocate */
198 gimdevR3Relocate,
199 /* pfnMemSetup */
200 NULL,
201 /* pfnPowerOn */
202 NULL,
203 /* pfnReset */
204 gimdevR3Reset,
205 /* pfnSuspend */
206 NULL,
207 /* pfnResume */
208 NULL,
209 /* pfnAttach */
210 NULL,
211 /* pfnDetach */
212 NULL,
213 /* pfnQueryInterface. */
214 NULL,
215 /* pfnInitComplete */
216 NULL,
217 /* pfnPowerOff */
218 NULL,
219 /* pfnSoftReset */
220 NULL,
221 /* u32VersionEnd */
222 PDM_DEVREG_VERSION
223};
224#endif /* IN_RING3 */
225
226#endif /* VBOX_DEVICE_STRUCT_TESTCASE */
227
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