VirtualBox

source: vbox/trunk/src/VBox/Main/src-client/PCIRawDevImpl.cpp@ 94521

Last change on this file since 94521 was 93115, checked in by vboxsync, 2 years ago

scm --update-copyright-year

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 5.6 KB
Line 
1/* $Id: PCIRawDevImpl.cpp 93115 2022-01-01 11:31:46Z vboxsync $ */
2/** @file
3 * VirtualBox Driver Interface to raw PCI device.
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#define LOG_GROUP LOG_GROUP_DEV_PCI_RAW
19#include "LoggingNew.h"
20
21#include "PCIRawDevImpl.h"
22#include "PCIDeviceAttachmentImpl.h"
23#include "ConsoleImpl.h"
24
25// generated header for events
26#include "VBoxEvents.h"
27
28#include <VBox/err.h>
29
30
31/**
32 * PCI raw driver instance data.
33 */
34typedef struct DRVMAINPCIRAWDEV
35{
36 /** Pointer to the real PCI raw object. */
37 PCIRawDev *pPCIRawDev;
38 /** Pointer to the driver instance structure. */
39 PPDMDRVINS pDrvIns;
40 /** Our PCI device connector interface. */
41 PDMIPCIRAWCONNECTOR IConnector;
42
43} DRVMAINPCIRAWDEV, *PDRVMAINPCIRAWDEV;
44
45//
46// constructor / destructor
47//
48PCIRawDev::PCIRawDev(Console *console)
49 : mParent(console),
50 mpDrv(NULL)
51{
52}
53
54PCIRawDev::~PCIRawDev()
55{
56}
57
58/**
59 * @interface_method_impl{PDMIBASE,pfnQueryInterface}
60 */
61DECLCALLBACK(void *) PCIRawDev::drvQueryInterface(PPDMIBASE pInterface, const char *pszIID)
62{
63 PPDMDRVINS pDrvIns = PDMIBASE_2_PDMDRV(pInterface);
64 PDRVMAINPCIRAWDEV pThis = PDMINS_2_DATA(pDrvIns, PDRVMAINPCIRAWDEV);
65
66 PDMIBASE_RETURN_INTERFACE(pszIID, PDMIBASE, &pDrvIns->IBase);
67 PDMIBASE_RETURN_INTERFACE(pszIID, PDMIPCIRAWCONNECTOR, &pThis->IConnector);
68
69 return NULL;
70}
71
72
73/**
74 * @interface_method_impl{PDMIPCIRAWCONNECTOR,pfnDeviceConstructComplete}
75 */
76DECLCALLBACK(int) PCIRawDev::drvDeviceConstructComplete(PPDMIPCIRAWCONNECTOR pInterface, const char *pcszName,
77 uint32_t uHostPCIAddress, uint32_t uGuestPCIAddress,
78 int rc)
79{
80 PDRVMAINPCIRAWDEV pThis = RT_FROM_CPP_MEMBER(pInterface, DRVMAINPCIRAWDEV, IConnector);
81 Console *pConsole = pThis->pPCIRawDev->getParent();
82 const ComPtr<IMachine>& machine = pConsole->i_machine();
83 ComPtr<IVirtualBox> vbox;
84
85 HRESULT hrc = machine->COMGETTER(Parent)(vbox.asOutParam());
86 Assert(SUCCEEDED(hrc)); NOREF(hrc);
87
88 ComPtr<IEventSource> es;
89 hrc = vbox->COMGETTER(EventSource)(es.asOutParam());
90 Assert(SUCCEEDED(hrc));
91
92 Bstr bstrId;
93 hrc = machine->COMGETTER(Id)(bstrId.asOutParam());
94 Assert(SUCCEEDED(hrc));
95
96 ComObjPtr<PCIDeviceAttachment> pda;
97 BstrFmt bstrName(pcszName);
98 pda.createObject();
99 pda->init(machine, bstrName, uHostPCIAddress, uGuestPCIAddress, TRUE);
100
101 Bstr msg("");
102 if (RT_FAILURE(rc))
103 msg = BstrFmt("runtime error %Rrc", rc);
104
105 ::FireHostPCIDevicePlugEvent(es, bstrId.raw(), true /* plugged */, RT_SUCCESS_NP(rc) /* success */, pda, msg.raw());
106
107 return VINF_SUCCESS;
108}
109
110
111/**
112 * @interface_method_impl{PDMDRVREG,pfnReset}
113 */
114DECLCALLBACK(void) PCIRawDev::drvDestruct(PPDMDRVINS pDrvIns)
115{
116 PDMDRV_CHECK_VERSIONS_RETURN_VOID(pDrvIns);
117 PDRVMAINPCIRAWDEV pThis = PDMINS_2_DATA(pDrvIns, PDRVMAINPCIRAWDEV);
118
119 if (pThis->pPCIRawDev)
120 pThis->pPCIRawDev->mpDrv = NULL;
121}
122
123
124/**
125 * @interface_method_impl{PDMDRVREG,pfnConstruct}
126 */
127DECLCALLBACK(int) PCIRawDev::drvConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfgHandle, uint32_t fFlags)
128{
129 RT_NOREF(fFlags);
130 PDMDRV_CHECK_VERSIONS_RETURN(pDrvIns);
131 PDRVMAINPCIRAWDEV pThis = PDMINS_2_DATA(pDrvIns, PDRVMAINPCIRAWDEV);
132
133 /*
134 * Validate configuration.
135 */
136 if (!CFGMR3AreValuesValid(pCfgHandle, "Object\0"))
137 return VERR_PDM_DRVINS_UNKNOWN_CFG_VALUES;
138
139 AssertMsgReturn(PDMDrvHlpNoAttach(pDrvIns) == VERR_PDM_NO_ATTACHED_DRIVER,
140 ("Configuration error: Not possible to attach anything to this driver!\n"),
141 VERR_PDM_DRVINS_NO_ATTACH);
142
143 /*
144 * IBase.
145 */
146 pDrvIns->IBase.pfnQueryInterface = PCIRawDev::drvQueryInterface;
147
148 /*
149 * IConnector.
150 */
151 pThis->IConnector.pfnDeviceConstructComplete = PCIRawDev::drvDeviceConstructComplete;
152
153 /*
154 * Get the object pointer and update the mpDrv member.
155 */
156 void *pv;
157 int rc = CFGMR3QueryPtr(pCfgHandle, "Object", &pv);
158 if (RT_FAILURE(rc))
159 {
160 AssertMsgFailed(("Configuration error: No \"Object\" value! rc=%Rrc\n", rc));
161 return rc;
162 }
163
164 pThis->pPCIRawDev = (PCIRawDev *)pv;
165 pThis->pPCIRawDev->mpDrv = pThis;
166
167 return VINF_SUCCESS;
168}
169
170/**
171 * Main raw PCI driver registration record.
172 */
173const PDMDRVREG PCIRawDev::DrvReg =
174{
175 /* u32Version */
176 PDM_DRVREG_VERSION,
177 /* szName */
178 "MainPciRaw",
179 /* szRCMod */
180 "",
181 /* szR0Mod */
182 "",
183 /* pszDescription */
184 "Main PCI raw driver (Main as in the API).",
185 /* fFlags */
186 PDM_DRVREG_FLAGS_HOST_BITS_DEFAULT,
187 /* fClass. */
188 PDM_DRVREG_CLASS_PCIRAW,
189 /* cMaxInstances */
190 ~0U,
191 /* cbInstance */
192 sizeof(DRVMAINPCIRAWDEV),
193 /* pfnConstruct */
194 PCIRawDev::drvConstruct,
195 /* pfnDestruct */
196 PCIRawDev::drvDestruct,
197 /* pfnRelocate */
198 NULL,
199 /* pfnIOCtl */
200 NULL,
201 /* pfnPowerOn */
202 NULL,
203 /* pfnReset */
204 NULL,
205 /* pfnSuspend */
206 NULL,
207 /* pfnResume */
208 NULL,
209 /* pfnAttach */
210 NULL,
211 /* pfnDetach */
212 NULL,
213 /* pfnPowerOff */
214 NULL,
215 /* pfnSoftReset */
216 NULL,
217 /* u32EndVersion */
218 PDM_DRVREG_VERSION
219};
220
Note: See TracBrowser for help on using the repository browser.

© 2023 Oracle
ContactPrivacy policyTerms of Use