3 Copyright (c) 2004 - 2006, Intel Corporation. All rights reserved.<BR>
4 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"
25 #if (EFI_SPECIFICATION_VERSION >= 0x00020000)
26 #define EDKII_GLUE_SELECTED_COMPONENT_NAME_PROTOCOL_GUID gEfiComponentName2ProtocolGuid
27 #define EDKII_GLUE_SELECTED_COMPONENT_NAME_PROTOCOL EFI_COMPONENT_NAME2_PROTOCOL
29 #define EDKII_GLUE_SELECTED_COMPONENT_NAME_PROTOCOL_GUID gEfiComponentNameProtocolGuid
30 #define EDKII_GLUE_SELECTED_COMPONENT_NAME_PROTOCOL EFI_COMPONENT_NAME_PROTOCOL
34 The constructor function installs the standard EFI Driver Model Protocols.
36 @param[in] ImageHandle The firmware allocated handle for the EFI image.
37 @param[in] SystemTable A pointer to the EFI System Table.
39 @retval EFI_SUCCESS The constructor always return EFI_SUCCESS.
44 UefiDriverModelLibConstructor (
45 IN EFI_HANDLE ImageHandle
,
46 IN EFI_SYSTEM_TABLE
*SystemTable
50 EFI_HANDLE DriverBindingHandle
;
51 EFI_DRIVER_BINDING_PROTOCOL
*DriverBinding
;
54 // Install the first Driver Bindng Protocol onto ImageHandle
56 DriverBindingHandle
= ImageHandle
;
59 // See if onle one Driver Binding Protocol is advertised by the driver
60 // EdkIIGlueLib: _gDriverModelProtocolListEntries is always 1
64 // The Driver Binding Protocol must never be NULL
66 ASSERT(_gDriverModelProtocolList
[0].DriverBinding
!= NULL
);
69 // Check for all 8 possible combinations of the ComponentName, DriverConfiguration, and DriverDiagnostics Protocol
70 // These are all checks against const pointers, so the optimizing compiler will only select one of the
71 // calls to InstallMultipleProtocolInterfaces()
73 if (_gDriverModelProtocolList
[0].DriverDiagnostics
== NULL
) {
74 if (_gDriverModelProtocolList
[0].DriverConfiguration
== NULL
) {
75 if (_gDriverModelProtocolList
[0].ComponentName
== NULL
) {
76 Status
= gBS
->InstallMultipleProtocolInterfaces (
78 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
82 Status
= gBS
->InstallMultipleProtocolInterfaces (
84 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
85 &EDKII_GLUE_SELECTED_COMPONENT_NAME_PROTOCOL_GUID
, (EDKII_GLUE_SELECTED_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
90 if (_gDriverModelProtocolList
[0].ComponentName
== NULL
) {
91 Status
= gBS
->InstallMultipleProtocolInterfaces (
93 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
94 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
98 Status
= gBS
->InstallMultipleProtocolInterfaces (
100 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
101 &EDKII_GLUE_SELECTED_COMPONENT_NAME_PROTOCOL_GUID
, (EDKII_GLUE_SELECTED_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
102 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
108 if (_gDriverModelProtocolList
[0].DriverConfiguration
== NULL
) {
109 if (_gDriverModelProtocolList
[0].ComponentName
== NULL
) {
110 Status
= gBS
->InstallMultipleProtocolInterfaces (
111 &DriverBindingHandle
,
112 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
113 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
117 Status
= gBS
->InstallMultipleProtocolInterfaces (
118 &DriverBindingHandle
,
119 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
120 &EDKII_GLUE_SELECTED_COMPONENT_NAME_PROTOCOL_GUID
, (EDKII_GLUE_SELECTED_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
121 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
126 if (_gDriverModelProtocolList
[0].ComponentName
== NULL
) {
127 Status
= gBS
->InstallMultipleProtocolInterfaces (
128 &DriverBindingHandle
,
129 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
130 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
131 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
135 Status
= gBS
->InstallMultipleProtocolInterfaces (
136 &DriverBindingHandle
,
137 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
138 &EDKII_GLUE_SELECTED_COMPONENT_NAME_PROTOCOL_GUID
, (EDKII_GLUE_SELECTED_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
139 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
140 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
148 // ASSERT if the call to InstallMultipleProtocolInterfaces() failed
150 ASSERT_EFI_ERROR (Status
);
153 // Update the ImageHandle and DriverBindingHandle fields of the Driver Binding Protocol
155 DriverBinding
= (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
;
156 DriverBinding
->ImageHandle
= ImageHandle
;
157 DriverBinding
->DriverBindingHandle
= DriverBindingHandle
;
164 The destructor function uninstalls the standard EFI Driver Model Protocols.
166 @param[in] ImageHandle The firmware allocated handle for the EFI image.
167 @param[in] SystemTable A pointer to the EFI System Table.
169 @retval EFI_SUCCESS The destructor always return EFI_SUCCESS.
174 UefiDriverModelLibDestructor (
175 IN EFI_HANDLE ImageHandle
,
176 IN EFI_SYSTEM_TABLE
*SystemTable
180 EFI_HANDLE DriverBindingHandle
;
183 // See if onle one Driver Binding Protocol is advertised by the driver
184 // EdkIIGlueLib: _gDriverModelProtocolListEntries is always 1
188 // The Driver Binding Protocol must never be NULL
190 ASSERT(_gDriverModelProtocolList
[0].DriverBinding
!= NULL
);
193 // Retrieve the DriverBindingHandle from the Driver Binding Protocol
195 DriverBindingHandle
= _gDriverModelProtocolList
[0].DriverBinding
->DriverBindingHandle
;
198 // Check for all 8 possible combinations of the ComponentName, DriverConfiguration, and DriverDiagnostics Protocol
199 // These are all checks against const pointers, so the optimizing compiler will only select one of the
200 // calls to InstallMultipleProtocolInterfaces()
202 if (_gDriverModelProtocolList
[0].DriverDiagnostics
== NULL
) {
203 if (_gDriverModelProtocolList
[0].DriverConfiguration
== NULL
) {
204 if (_gDriverModelProtocolList
[0].ComponentName
== NULL
) {
205 Status
= gBS
->UninstallMultipleProtocolInterfaces (
207 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
211 Status
= gBS
->UninstallMultipleProtocolInterfaces (
212 &DriverBindingHandle
,
213 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
214 &EDKII_GLUE_SELECTED_COMPONENT_NAME_PROTOCOL_GUID
, (EDKII_GLUE_SELECTED_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
219 if (_gDriverModelProtocolList
[0].ComponentName
== NULL
) {
220 Status
= gBS
->UninstallMultipleProtocolInterfaces (
221 &DriverBindingHandle
,
222 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
223 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
227 Status
= gBS
->UninstallMultipleProtocolInterfaces (
228 &DriverBindingHandle
,
229 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
230 &EDKII_GLUE_SELECTED_COMPONENT_NAME_PROTOCOL_GUID
, (EDKII_GLUE_SELECTED_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
231 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
237 if (_gDriverModelProtocolList
[0].DriverConfiguration
== NULL
) {
238 if (_gDriverModelProtocolList
[0].ComponentName
== NULL
) {
239 Status
= gBS
->UninstallMultipleProtocolInterfaces (
240 &DriverBindingHandle
,
241 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
242 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
246 Status
= gBS
->UninstallMultipleProtocolInterfaces (
247 &DriverBindingHandle
,
248 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
249 &EDKII_GLUE_SELECTED_COMPONENT_NAME_PROTOCOL_GUID
, (EDKII_GLUE_SELECTED_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
250 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
255 if (_gDriverModelProtocolList
[0].ComponentName
== NULL
) {
256 Status
= gBS
->UninstallMultipleProtocolInterfaces (
257 &DriverBindingHandle
,
258 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
259 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
260 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
264 Status
= gBS
->UninstallMultipleProtocolInterfaces (
265 &DriverBindingHandle
,
266 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
267 &EDKII_GLUE_SELECTED_COMPONENT_NAME_PROTOCOL_GUID
, (EDKII_GLUE_SELECTED_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
268 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
269 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
277 // ASSERT if the call to UninstallMultipleProtocolInterfaces() failed
279 ASSERT_EFI_ERROR (Status
);