VirtualBox

source: vbox/trunk/src/VBox/Frontends/VBoxBFE/StatusImpl.cpp@ 28541

Last change on this file since 28541 was 26173, checked in by vboxsync, 15 years ago

PDM: s/pCfgHandle/pCfg/g - part 2.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.0 KB
Line 
1/* $Id: StatusImpl.cpp 26173 2010-02-02 21:11:09Z vboxsync $ */
2/** @file
3 * VBox frontends: Basic Frontend (BFE):
4 * Implementation of VMStatus class
5 */
6
7/*
8 * Copyright (C) 2006-2010 Sun Microsystems, Inc.
9 *
10 * This file is part of VirtualBox Open Source Edition (OSE), as
11 * available from http://www.virtualbox.org. This file is free software;
12 * you can redistribute it and/or modify it under the terms of the GNU
13 * General Public License (GPL) as published by the Free Software
14 * Foundation, in version 2 as it comes in the "COPYING" file of the
15 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
16 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
17 *
18 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
19 * Clara, CA 95054 USA or visit http://www.sun.com if you need
20 * additional information or have any questions.
21 */
22
23#ifdef VBOXBFE_WITHOUT_COM
24# include "COMDefs.h"
25#else
26# include <VBox/com/defs.h>
27#endif
28#include <VBox/pdm.h>
29#include <VBox/cfgm.h>
30#include <VBox/err.h>
31#include <iprt/assert.h>
32#include <VBox/log.h>
33#include <iprt/asm.h>
34#include <iprt/uuid.h>
35#include "StatusImpl.h"
36
37// defines
38////////////////////////////////////////////////////////////////////////////////
39
40// globals
41////////////////////////////////////////////////////////////////////////////////
42
43/**
44 * The Main status driver instance data.
45 */
46typedef struct DRVMAINSTATUS
47{
48 /** The LED connectors. */
49 PDMILEDCONNECTORS ILedConnectors;
50 /** Pointer to the LED ports interface above us. */
51 PPDMILEDPORTS pLedPorts;
52 /** Pointer to the array of LED pointers. */
53 PPDMLED *papLeds;
54 /** The unit number corresponding to the first entry in the LED array. */
55 RTUINT iFirstLUN;
56 /** The unit number corresponding to the last entry in the LED array.
57 * (The size of the LED array is iLastLUN - iFirstLUN + 1.) */
58 RTUINT iLastLUN;
59} DRVMAINSTATUS, *PDRVMAINSTATUS;
60
61
62/**
63 * Notification about a unit which have been changed.
64 *
65 * The driver must discard any pointers to data owned by
66 * the unit and requery it.
67 *
68 * @param pInterface Pointer to the interface structure containing the called function pointer.
69 * @param iLUN The unit number.
70 */
71DECLCALLBACK(void) VMStatus::drvUnitChanged(PPDMILEDCONNECTORS pInterface, unsigned iLUN)
72{
73 PDRVMAINSTATUS pData = (PDRVMAINSTATUS)(void *)pInterface;
74 if (iLUN >= pData->iFirstLUN && iLUN <= pData->iLastLUN)
75 {
76 PPDMLED pLed;
77 int rc = pData->pLedPorts->pfnQueryStatusLed(pData->pLedPorts, iLUN, &pLed);
78 if (RT_FAILURE(rc))
79 pLed = NULL;
80 ASMAtomicXchgPtr((void * volatile *)&pData->papLeds[iLUN - pData->iFirstLUN], pLed);
81 Log(("drvUnitChanged: iLUN=%d pLed=%p\n", iLUN, pLed));
82 }
83}
84
85
86/**
87 * @interface_method_impl{PDMIBASE,pfnQueryInterface}
88 */
89DECLCALLBACK(void *) VMStatus::drvQueryInterface(PPDMIBASE pInterface, const char *pszIID)
90{
91 PPDMDRVINS pDrvIns = PDMIBASE_2_PDMDRV(pInterface);
92 PDRVMAINSTATUS pDrv = PDMINS_2_DATA(pDrvIns, PDRVMAINSTATUS);
93 if (RTUuidCompare2Strs(pszIID, PDMIBASE_IID) == 0)
94 return &pDrvIns->IBase;
95 PDMIBASE_RETURN_INTERFACE(pszIID, PDMILEDCONNECTORS, &pDrv->ILedConnectors);
96 return NULL;
97}
98
99
100/**
101 * Destruct a status driver instance.
102 *
103 * @returns VBox status.
104 * @param pDrvIns The driver instance data.
105 */
106DECLCALLBACK(void) VMStatus::drvDestruct(PPDMDRVINS pDrvIns)
107{
108 PDRVMAINSTATUS pData = PDMINS_2_DATA(pDrvIns, PDRVMAINSTATUS);
109 LogFlow(("VMStatus::drvDestruct: iInstance=%d\n", pDrvIns->iInstance));
110 if (pData->papLeds)
111 {
112 unsigned iLed = pData->iLastLUN - pData->iFirstLUN + 1;
113 while (iLed-- > 0)
114 ASMAtomicXchgPtr((void * volatile *)&pData->papLeds[iLed], NULL);
115 }
116}
117
118
119/**
120 * Construct a status driver instance.
121 *
122 * @copydoc FNPDMDRVCONSTRUCT
123 */
124DECLCALLBACK(int) VMStatus::drvConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfg, uint32_t fFlags)
125{
126 PDRVMAINSTATUS pData = PDMINS_2_DATA(pDrvIns, PDRVMAINSTATUS);
127 LogFlow(("VMStatus::drvConstruct: iInstance=%d\n", pDrvIns->iInstance));
128
129 /*
130 * Validate configuration.
131 */
132 if (!CFGMR3AreValuesValid(pCfg, "papLeds\0First\0Last\0"))
133 return VERR_PDM_DRVINS_UNKNOWN_CFG_VALUES;
134 AssertMsgReturn(PDMDrvHlpNoAttach(pDrvIns) == VERR_PDM_NO_ATTACHED_DRIVER,
135 ("Configuration error: Not possible to attach anything to this driver!\n"),
136 VERR_PDM_DRVINS_NO_ATTACH);
137
138 /*
139 * Data.
140 */
141 pDrvIns->IBase.pfnQueryInterface = VMStatus::drvQueryInterface;
142 pData->ILedConnectors.pfnUnitChanged = VMStatus::drvUnitChanged;
143
144 /*
145 * Read config.
146 */
147 int rc = CFGMR3QueryPtr(pCfg, "papLeds", (void **)&pData->papLeds);
148 if (RT_FAILURE(rc))
149 {
150 AssertMsgFailed(("Configuration error: Failed to query the \"papLeds\" value! rc=%Rrc\n", rc));
151 return rc;
152 }
153
154 rc = CFGMR3QueryU32(pCfg, "First", &pData->iFirstLUN);
155 if (rc == VERR_CFGM_VALUE_NOT_FOUND)
156 pData->iFirstLUN = 0;
157 else if (RT_FAILURE(rc))
158 {
159 AssertMsgFailed(("Configuration error: Failed to query the \"First\" value! rc=%Rrc\n", rc));
160 return rc;
161 }
162
163 rc = CFGMR3QueryU32(pCfg, "Last", &pData->iLastLUN);
164 if (rc == VERR_CFGM_VALUE_NOT_FOUND)
165 pData->iLastLUN = 0;
166 else if (RT_FAILURE(rc))
167 {
168 AssertMsgFailed(("Configuration error: Failed to query the \"Last\" value! rc=%Rrc\n", rc));
169 return rc;
170 }
171 if (pData->iFirstLUN > pData->iLastLUN)
172 {
173 AssertMsgFailed(("Configuration error: Invalid unit range %u-%u\n", pData->iFirstLUN, pData->iLastLUN));
174 return VERR_GENERAL_FAILURE;
175 }
176
177 /*
178 * Get the ILedPorts interface of the above driver/device and
179 * query the LEDs we want.
180 */
181 pData->pLedPorts = PDMIBASE_QUERY_INTERFACE(pDrvIns->pUpBase, PDMILEDPORTS);
182 AssertMsgReturn(pData->pLedPorts, ("Configuration error: No led ports interface above!\n"),
183 VERR_PDM_MISSING_INTERFACE_ABOVE);
184
185 for (unsigned i = pData->iFirstLUN; i <= pData->iLastLUN; i++)
186 VMStatus::drvUnitChanged(&pData->ILedConnectors, i);
187
188 return VINF_SUCCESS;
189}
190
191
192/**
193 * VMStatus driver registration record.
194 */
195const PDMDRVREG VMStatus::DrvReg =
196{
197 /* u32Version */
198 PDM_DRVREG_VERSION,
199 /* szName */
200 "MainStatus",
201 /* szRCMod */
202 "",
203 /* szR0Mod */
204 "",
205 /* pszDescription */
206 "Main status driver (Main as in the API).",
207 /* fFlags */
208 PDM_DRVREG_FLAGS_HOST_BITS_DEFAULT,
209 /* fClass. */
210 PDM_DRVREG_CLASS_STATUS,
211 /* cMaxInstances */
212 ~0,
213 /* cbInstance */
214 sizeof(DRVMAINSTATUS),
215 /* pfnConstruct */
216 VMStatus::drvConstruct,
217 /* pfnDestruct */
218 VMStatus::drvDestruct,
219 /* pfnRelocate */
220 NULL,
221 /* pfnIOCtl */
222 NULL,
223 /* pfnPowerOn */
224 NULL,
225 /* pfnReset */
226 NULL,
227 /* pfnSuspend */
228 NULL,
229 /* pfnResume */
230 NULL,
231 /* pfnAttach */
232 NULL,
233 /* pfnDetach */
234 NULL,
235 /* pfnPowerOff */
236 NULL,
237 /* pfnSoftReset */
238 NULL,
239 /* u32EndVersion */
240 PDM_DRVREG_VERSION
241};
242
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