3 Copyright (c) 2004 - 2006, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
19 UEFI Driver Model Library.
23 #include "EdkIIGlueUefi.h"
26 The constructor function installs the standard EFI Driver Model Protocols.
28 @param[in] ImageHandle The firmware allocated handle for the EFI image.
29 @param[in] SystemTable A pointer to the EFI System Table.
31 @retval EFI_SUCCESS The constructor always return EFI_SUCCESS.
36 UefiDriverModelLibConstructor (
37 IN EFI_HANDLE ImageHandle
,
38 IN EFI_SYSTEM_TABLE
*SystemTable
42 EFI_HANDLE DriverBindingHandle
;
43 EFI_DRIVER_BINDING_PROTOCOL
*DriverBinding
;
46 // Install the first Driver Bindng Protocol onto ImageHandle
48 DriverBindingHandle
= ImageHandle
;
51 // See if onle one Driver Binding Protocol is advertised by the driver
52 // EdkIIGlueLib: _gDriverModelProtocolListEntries is always 1
56 // The Driver Binding Protocol must never be NULL
58 ASSERT(_gDriverModelProtocolList
[0].DriverBinding
!= NULL
);
61 // Check for all 8 possible combinations of the ComponentName, DriverConfiguration, and DriverDiagnostics Protocol
62 // These are all checks against const pointers, so the optimizing compiler will only select one of the
63 // calls to InstallMultipleProtocolInterfaces()
65 if (_gDriverModelProtocolList
[0].DriverDiagnostics
== NULL
) {
66 if (_gDriverModelProtocolList
[0].DriverConfiguration
== NULL
) {
67 if (_gDriverModelProtocolList
[0].ComponentName
== NULL
) {
68 Status
= gBS
->InstallMultipleProtocolInterfaces (
70 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
74 #if (EFI_SPECIFICATION_VERSION >= 0x00020000)
75 Status
= gBS
->InstallMultipleProtocolInterfaces (
77 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
78 &gEfiComponentName2ProtocolGuid
, (EFI_COMPONENT_NAME2_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
82 Status
= gBS
->InstallMultipleProtocolInterfaces (
84 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
85 &gEfiComponentNameProtocolGuid
, (EFI_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
91 if (_gDriverModelProtocolList
[0].ComponentName
== NULL
) {
92 Status
= gBS
->InstallMultipleProtocolInterfaces (
94 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
95 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
99 #if (EFI_SPECIFICATION_VERSION >= 0x00020000)
100 Status
= gBS
->InstallMultipleProtocolInterfaces (
101 &DriverBindingHandle
,
102 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
103 &gEfiComponentName2ProtocolGuid
, (EFI_COMPONENT_NAME2_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
104 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
108 Status
= gBS
->InstallMultipleProtocolInterfaces (
109 &DriverBindingHandle
,
110 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
111 &gEfiComponentNameProtocolGuid
, (EFI_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
112 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
119 if (_gDriverModelProtocolList
[0].DriverConfiguration
== NULL
) {
120 if (_gDriverModelProtocolList
[0].ComponentName
== NULL
) {
121 Status
= gBS
->InstallMultipleProtocolInterfaces (
122 &DriverBindingHandle
,
123 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
124 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
128 #if (EFI_SPECIFICATION_VERSION >= 0x00020000)
129 Status
= gBS
->InstallMultipleProtocolInterfaces (
130 &DriverBindingHandle
,
131 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
132 &gEfiComponentName2ProtocolGuid
, (EFI_COMPONENT_NAME2_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
133 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
137 Status
= gBS
->InstallMultipleProtocolInterfaces (
138 &DriverBindingHandle
,
139 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
140 &gEfiComponentNameProtocolGuid
, (EFI_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
141 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
147 if (_gDriverModelProtocolList
[0].ComponentName
== NULL
) {
148 Status
= gBS
->InstallMultipleProtocolInterfaces (
149 &DriverBindingHandle
,
150 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
151 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
152 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
156 #if (EFI_SPECIFICATION_VERSION >= 0x00020000)
157 Status
= gBS
->InstallMultipleProtocolInterfaces (
158 &DriverBindingHandle
,
159 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
160 &gEfiComponentName2ProtocolGuid
, (EFI_COMPONENT_NAME2_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
161 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
162 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
166 Status
= gBS
->InstallMultipleProtocolInterfaces (
167 &DriverBindingHandle
,
168 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
169 &gEfiComponentNameProtocolGuid
, (EFI_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
170 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
171 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
180 // ASSERT if the call to InstallMultipleProtocolInterfaces() failed
182 ASSERT_EFI_ERROR (Status
);
185 // Update the ImageHandle and DriverBindingHandle fields of the Driver Binding Protocol
187 DriverBinding
= (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
;
188 DriverBinding
->ImageHandle
= ImageHandle
;
189 DriverBinding
->DriverBindingHandle
= DriverBindingHandle
;
196 The destructor function uninstalls the standard EFI Driver Model Protocols.
198 @param[in] ImageHandle The firmware allocated handle for the EFI image.
199 @param[in] SystemTable A pointer to the EFI System Table.
201 @retval EFI_SUCCESS The destructor always return EFI_SUCCESS.
206 UefiDriverModelLibDestructor (
207 IN EFI_HANDLE ImageHandle
,
208 IN EFI_SYSTEM_TABLE
*SystemTable
212 EFI_HANDLE DriverBindingHandle
;
215 // See if onle one Driver Binding Protocol is advertised by the driver
216 // EdkIIGlueLib: _gDriverModelProtocolListEntries is always 1
220 // The Driver Binding Protocol must never be NULL
222 ASSERT(_gDriverModelProtocolList
[0].DriverBinding
!= NULL
);
225 // Retrieve the DriverBindingHandle from the Driver Binding Protocol
227 DriverBindingHandle
= _gDriverModelProtocolList
[0].DriverBinding
->DriverBindingHandle
;
230 // Check for all 8 possible combinations of the ComponentName, DriverConfiguration, and DriverDiagnostics Protocol
231 // These are all checks against const pointers, so the optimizing compiler will only select one of the
232 // calls to InstallMultipleProtocolInterfaces()
234 if (_gDriverModelProtocolList
[0].DriverDiagnostics
== NULL
) {
235 if (_gDriverModelProtocolList
[0].DriverConfiguration
== NULL
) {
236 if (_gDriverModelProtocolList
[0].ComponentName
== NULL
) {
237 Status
= gBS
->UninstallMultipleProtocolInterfaces (
239 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
243 #if (EFI_SPECIFICATION_VERSION >= 0x00020000)
244 Status
= gBS
->UninstallMultipleProtocolInterfaces (
245 &DriverBindingHandle
,
246 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
247 &gEfiComponentName2ProtocolGuid
, (EFI_COMPONENT_NAME2_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
251 Status
= gBS
->UninstallMultipleProtocolInterfaces (
252 &DriverBindingHandle
,
253 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
254 &gEfiComponentNameProtocolGuid
, (EFI_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
261 if (_gDriverModelProtocolList
[0].ComponentName
== NULL
) {
262 Status
= gBS
->UninstallMultipleProtocolInterfaces (
263 &DriverBindingHandle
,
264 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
265 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
269 #if (EFI_SPECIFICATION_VERSION >= 0x00020000)
270 Status
= gBS
->UninstallMultipleProtocolInterfaces (
271 &DriverBindingHandle
,
272 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
273 &gEfiComponentName2ProtocolGuid
, (EFI_COMPONENT_NAME2_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
274 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
278 Status
= gBS
->UninstallMultipleProtocolInterfaces (
279 &DriverBindingHandle
,
280 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
281 &gEfiComponentNameProtocolGuid
, (EFI_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
282 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
289 if (_gDriverModelProtocolList
[0].DriverConfiguration
== NULL
) {
290 if (_gDriverModelProtocolList
[0].ComponentName
== NULL
) {
291 Status
= gBS
->UninstallMultipleProtocolInterfaces (
292 &DriverBindingHandle
,
293 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
294 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
298 #if (EFI_SPECIFICATION_VERSION >= 0x00020000)
299 Status
= gBS
->UninstallMultipleProtocolInterfaces (
300 &DriverBindingHandle
,
301 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
302 &gEfiComponentName2ProtocolGuid
, (EFI_COMPONENT_NAME2_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
303 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
307 Status
= gBS
->UninstallMultipleProtocolInterfaces (
308 &DriverBindingHandle
,
309 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
310 &gEfiComponentNameProtocolGuid
, (EFI_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
311 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
317 if (_gDriverModelProtocolList
[0].ComponentName
== NULL
) {
318 Status
= gBS
->UninstallMultipleProtocolInterfaces (
319 &DriverBindingHandle
,
320 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
321 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
322 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
326 #if (EFI_SPECIFICATION_VERSION >= 0x00020000)
327 Status
= gBS
->UninstallMultipleProtocolInterfaces (
328 &DriverBindingHandle
,
329 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
330 &gEfiComponentName2ProtocolGuid
, (EFI_COMPONENT_NAME2_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
331 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
332 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
336 Status
= gBS
->UninstallMultipleProtocolInterfaces (
337 &DriverBindingHandle
,
338 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
339 &gEfiComponentNameProtocolGuid
, (EFI_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
340 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
341 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
350 // ASSERT if the call to UninstallMultipleProtocolInterfaces() failed
352 ASSERT_EFI_ERROR (Status
);