VirtualBox

source: vbox/trunk/src/VBox/Devices/Samples/VBoxSampleDevice.cpp

Last change on this file was 98103, checked in by vboxsync, 16 months ago

Copyright year updates by scm.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.7 KB
Line 
1/* $Id: VBoxSampleDevice.cpp 98103 2023-01-17 14:15:46Z vboxsync $ */
2/** @file
3 * VBox Sample Device.
4 */
5
6/*
7 * Copyright (C) 2009-2023 Oracle and/or its affiliates.
8 *
9 * This file is part of VirtualBox base platform packages, as
10 * available from https://www.virtualbox.org.
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation, in version 3 of the
15 * License.
16 *
17 * This program is distributed in the hope that it will be useful, but
18 * WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 * General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, see <https://www.gnu.org/licenses>.
24 *
25 * SPDX-License-Identifier: GPL-3.0-only
26 */
27
28
29/*********************************************************************************************************************************
30* Header Files *
31*********************************************************************************************************************************/
32#define LOG_GROUP LOG_GROUP_MISC
33#include <VBox/vmm/pdmdev.h>
34#include <VBox/version.h>
35#include <iprt/errcore.h>
36#include <VBox/log.h>
37
38#include <iprt/assert.h>
39
40
41/*********************************************************************************************************************************
42* Structures and Typedefs *
43*********************************************************************************************************************************/
44/**
45 * Device Instance Data.
46 */
47typedef struct VBOXSAMPLEDEVICE
48{
49 uint32_t Whatever;
50} VBOXSAMPLEDEVICE;
51typedef VBOXSAMPLEDEVICE *PVBOXSAMPLEDEVICE;
52
53
54
55static DECLCALLBACK(int) devSampleDestruct(PPDMDEVINS pDevIns)
56{
57 /*
58 * Check the versions here as well since the destructor is *always* called.
59 */
60 PDMDEV_CHECK_VERSIONS_RETURN_QUIET(pDevIns);
61
62 return VINF_SUCCESS;
63}
64
65
66static DECLCALLBACK(int) devSampleConstruct(PPDMDEVINS pDevIns, int iInstance, PCFGMNODE pCfg)
67{
68 /*
69 * Check that the device instance and device helper structures are compatible.
70 */
71 PDMDEV_CHECK_VERSIONS_RETURN(pDevIns);
72 NOREF(pCfg);
73
74 /*
75 * Initialize the instance data so that the destructor won't mess up.
76 */
77 PVBOXSAMPLEDEVICE pThis = PDMDEVINS_2_DATA(pDevIns, PVBOXSAMPLEDEVICE);
78 pThis->Whatever = 0;
79
80 /*
81 * Validate and read the configuration.
82 */
83 PDMDEV_VALIDATE_CONFIG_RETURN(pDevIns, "Whatever1|Whatever2", "");
84
85 /*
86 * Use the instance number if necessary (not for this device, which in
87 * g_DeviceSample below declares a maximum instance count of 1).
88 */
89 NOREF(iInstance);
90
91 return VINF_SUCCESS;
92}
93
94
95/**
96 * The device registration structure.
97 */
98static const PDMDEVREG g_DeviceSample =
99{
100 /* .u32Version = */ PDM_DEVREG_VERSION,
101 /* .uReserved0 = */ 0,
102 /* .szName = */ "sample",
103 /* .fFlags = */ PDM_DEVREG_FLAGS_DEFAULT_BITS | PDM_DEVREG_FLAGS_NEW_STYLE,
104 /* .fClass = */ PDM_DEVREG_CLASS_MISC,
105 /* .cMaxInstances = */ 1,
106 /* .uSharedVersion = */ 42,
107 /* .cbInstanceShared = */ sizeof(VBOXSAMPLEDEVICE),
108 /* .cbInstanceCC = */ 0,
109 /* .cbInstanceRC = */ 0,
110 /* .cMaxPciDevices = */ 0,
111 /* .cMaxMsixVectors = */ 0,
112 /* .pszDescription = */ "VBox Sample Device.",
113#if defined(IN_RING3)
114 /* .pszRCMod = */ "",
115 /* .pszR0Mod = */ "",
116 /* .pfnConstruct = */ devSampleConstruct,
117 /* .pfnDestruct = */ devSampleDestruct,
118 /* .pfnRelocate = */ NULL,
119 /* .pfnMemSetup = */ NULL,
120 /* .pfnPowerOn = */ NULL,
121 /* .pfnReset = */ NULL,
122 /* .pfnSuspend = */ NULL,
123 /* .pfnResume = */ NULL,
124 /* .pfnAttach = */ NULL,
125 /* .pfnDetach = */ NULL,
126 /* .pfnQueryInterface = */ NULL,
127 /* .pfnInitComplete = */ NULL,
128 /* .pfnPowerOff = */ NULL,
129 /* .pfnSoftReset = */ NULL,
130 /* .pfnReserved0 = */ NULL,
131 /* .pfnReserved1 = */ NULL,
132 /* .pfnReserved2 = */ NULL,
133 /* .pfnReserved3 = */ NULL,
134 /* .pfnReserved4 = */ NULL,
135 /* .pfnReserved5 = */ NULL,
136 /* .pfnReserved6 = */ NULL,
137 /* .pfnReserved7 = */ NULL,
138#elif defined(IN_RING0)
139 /* .pfnEarlyConstruct = */ NULL,
140 /* .pfnConstruct = */ NULL,
141 /* .pfnDestruct = */ NULL,
142 /* .pfnFinalDestruct = */ NULL,
143 /* .pfnRequest = */ NULL,
144 /* .pfnReserved0 = */ NULL,
145 /* .pfnReserved1 = */ NULL,
146 /* .pfnReserved2 = */ NULL,
147 /* .pfnReserved3 = */ NULL,
148 /* .pfnReserved4 = */ NULL,
149 /* .pfnReserved5 = */ NULL,
150 /* .pfnReserved6 = */ NULL,
151 /* .pfnReserved7 = */ NULL,
152#elif defined(IN_RC)
153 /* .pfnConstruct = */ NULL,
154 /* .pfnReserved0 = */ NULL,
155 /* .pfnReserved1 = */ NULL,
156 /* .pfnReserved2 = */ NULL,
157 /* .pfnReserved3 = */ NULL,
158 /* .pfnReserved4 = */ NULL,
159 /* .pfnReserved5 = */ NULL,
160 /* .pfnReserved6 = */ NULL,
161 /* .pfnReserved7 = */ NULL,
162#else
163# error "Not in IN_RING3, IN_RING0 or IN_RC!"
164#endif
165 /* .u32VersionEnd = */ PDM_DEVREG_VERSION
166};
167
168
169/**
170 * Register devices provided by the plugin.
171 *
172 * @returns VBox status code.
173 * @param pCallbacks Pointer to the callback table.
174 * @param u32Version VBox version number.
175 */
176extern "C" DECLEXPORT(int) VBoxDevicesRegister(PPDMDEVREGCB pCallbacks, uint32_t u32Version)
177{
178 LogFlow(("VBoxSampleDevice::VBoxDevicesRegister: u32Version=%#x pCallbacks->u32Version=%#x\n", u32Version, pCallbacks->u32Version));
179
180 AssertLogRelMsgReturn(u32Version >= VBOX_VERSION,
181 ("VirtualBox version %#x, expected %#x or higher\n", u32Version, VBOX_VERSION),
182 VERR_VERSION_MISMATCH);
183 AssertLogRelMsgReturn(pCallbacks->u32Version == PDM_DEVREG_CB_VERSION,
184 ("callback version %#x, expected %#x\n", pCallbacks->u32Version, PDM_DEVREG_CB_VERSION),
185 VERR_VERSION_MISMATCH);
186
187 return pCallbacks->pfnRegister(pCallbacks, &g_DeviceSample);
188}
189
Note: See TracBrowser for help on using the repository browser.

© 2023 Oracle
ContactPrivacy policyTerms of Use