3 Copyright (c) 2004 - 2011, 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.
15 EdkIIGlueDxeDriverEntryPoint.c
19 DXE Driver entry point template file
23 #include "EdkIIGlueDxe.h"
24 #include "Common/EdkIIGlueDependencies.h"
27 // Check definitions in .inf file to determine __EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__
29 // __EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__
30 // 1: only install ComponentName, DriverConfiguration and DriverDiagnostics
31 // 2: only install ComponentName2, DriverConfiguration2 and DriverDiagnostics2
32 // 3: install all including ComponentName, DriverConfiguration, DriverDiagnostics AND
33 // ComponentName2, DriverConfiguration2 and DriverDiagnostics2
34 // 4: install automatically according to EFI_SPECIFICATION_VERSION:
35 // if EFI_SPECIFICATION_VERSION < 0x00020000: only install ComponentName, DriverConfiguration and DriverDiagnostics
36 // if EFI_SPECIFICATION_VERSION >= 0x00020000: only install ComponentName2, DriverConfiguration2 and DriverDiagnostics2
38 #ifdef __EDKII_GLUE_DRIVER_MODEL_VERSION_1_DEFINED__
39 #undef __EDKII_GLUE_DRIVER_MODEL_VERSION_1_DEFINED__
42 #ifdef __EDKII_GLUE_DRIVER_MODEL_VERSION_2_DEFINED__
43 #undef __EDKII_GLUE_DRIVER_MODEL_VERSION_2_DEFINED__
46 #ifdef __EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__
47 #undef __EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__
50 #if defined(__EDKII_GLUE_COMPONENT_NAME_PROTOCOL_INSTANCE__) || defined(__EDKII_GLUE_DRIVER_CONFIGURATION_PROTOCOL_INSTANCE__) || defined(__EDKII_GLUE_DRIVER_DIAGNOSTICS_PROTOCOL_INSTANCE__)
51 #define __EDKII_GLUE_DRIVER_MODEL_VERSION_1_DEFINED__
54 #if defined(__EDKII_GLUE_COMPONENT_NAME2_PROTOCOL_INSTANCE__) || defined(__EDKII_GLUE_DRIVER_CONFIGURATION2_PROTOCOL_INSTANCE__) || defined(__EDKII_GLUE_DRIVER_DIAGNOSTICS2_PROTOCOL_INSTANCE__)
55 #define __EDKII_GLUE_DRIVER_MODEL_VERSION_2_DEFINED__
58 #if defined(__EDKII_GLUE_DRIVER_MODEL_VERSION_1_DEFINED__) && !defined(__EDKII_GLUE_DRIVER_MODEL_VERSION_2_DEFINED__) && !defined(__EDKII_GLUE_DRIVER_MODEL_AUTO_SELECT_PROTOCOLS_BY_EFI_VERSION__)
59 #define __EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__ 1
62 #if !defined(__EDKII_GLUE_DRIVER_MODEL_VERSION_1_DEFINED__) && defined(__EDKII_GLUE_DRIVER_MODEL_VERSION_2_DEFINED__) && !defined(__EDKII_GLUE_DRIVER_MODEL_AUTO_SELECT_PROTOCOLS_BY_EFI_VERSION__)
63 #define __EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__ 2
66 #if defined(__EDKII_GLUE_DRIVER_MODEL_VERSION_1_DEFINED__) && defined(__EDKII_GLUE_DRIVER_MODEL_VERSION_2_DEFINED__) && !defined(__EDKII_GLUE_DRIVER_MODEL_AUTO_SELECT_PROTOCOLS_BY_EFI_VERSION__)
67 #define __EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__ 3
71 // To use Auto-Select, it must be:
72 // 1. both Protocol and Protocol2 are defined
73 // 2. The Protocol and Protocol2 must use same names, for example, gDriverControllerName as __EDKII_GLUE_COMPONENT_NAME_PROTOCOL_INSTANCE__ and __EDKII_GLUE_COMPONENT_NAME2_PROTOCOL_INSTANCE__
75 #if defined(__EDKII_GLUE_DRIVER_MODEL_AUTO_SELECT_PROTOCOLS_BY_EFI_VERSION__)
76 #if !(defined(__EDKII_GLUE_DRIVER_MODEL_VERSION_1_DEFINED__) && defined(__EDKII_GLUE_DRIVER_MODEL_VERSION_2_DEFINED__))
77 #error "To use Auto-Select please define both Protocol and Protocol2 instances"
79 #define __EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__ 4
82 #if (__EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__ == 4)
83 #undef __EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__
84 #if (EFI_SPECIFICATION_VERSION >= 0x00020000)
85 #define __EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__ 2
87 #define __EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__ 1
91 #if (__EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__ == 1)
92 UINT8 _gEdkIIGlueDriverModelProtocolSelection
= 1;
93 #elif (__EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__ == 2)
94 UINT8 _gEdkIIGlueDriverModelProtocolSelection
= 2;
95 #elif (__EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__ == 3)
96 UINT8 _gEdkIIGlueDriverModelProtocolSelection
= 3;
98 UINT8 _gEdkIIGlueDriverModelProtocolSelection
= 0;
101 STATIC EFI_EVENT _mDriverExitBootServicesNotifyEvent
;
104 // Driver Model related definitions.
105 // LIMITATION: only support one instance of Driver Model protocols per driver.
106 // In case where multiple Driver Model protocols need to be installed in a single driver,
107 // manually edit this file and compile/link the modified file with the driver.
109 #if defined(__EDKII_GLUE_DRIVER_BINDING_PROTOCOL_INSTANCE__)
110 extern EFI_DRIVER_BINDING_PROTOCOL __EDKII_GLUE_DRIVER_BINDING_PROTOCOL_INSTANCE__
;
113 #if (__EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__ == 1) || (__EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__ == 3)
114 #if defined(__EDKII_GLUE_COMPONENT_NAME_PROTOCOL_INSTANCE__)
115 extern EFI_COMPONENT_NAME_PROTOCOL __EDKII_GLUE_COMPONENT_NAME_PROTOCOL_INSTANCE__
;
118 #if defined(__EDKII_GLUE_DRIVER_CONFIGURATION_PROTOCOL_INSTANCE__)
119 extern EFI_DRIVER_CONFIGURATION_PROTOCOL __EDKII_GLUE_DRIVER_CONFIGURATION_PROTOCOL_INSTANCE__
;
123 #if defined(__EDKII_GLUE_DRIVER_DIAGNOSTICS_PROTOCOL_INSTANCE__)
124 extern EFI_DRIVER_DIAGNOSTICS_PROTOCOL __EDKII_GLUE_DRIVER_DIAGNOSTICS_PROTOCOL_INSTANCE__
;
127 #if (__EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__ == 2) || (__EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__ == 3)
128 #if defined(__EDKII_GLUE_COMPONENT_NAME2_PROTOCOL_INSTANCE__)
129 extern EFI_COMPONENT_NAME2_PROTOCOL __EDKII_GLUE_COMPONENT_NAME2_PROTOCOL_INSTANCE__
;
132 #if defined(__EDKII_GLUE_DRIVER_CONFIGURATION2_PROTOCOL_INSTANCE__)
133 extern EFI_DRIVER_CONFIGURATION2_PROTOCOL __EDKII_GLUE_DRIVER_CONFIGURATION2_PROTOCOL_INSTANCE__
;
136 #if defined(__EDKII_GLUE_DRIVER_DIAGNOSTICS2_PROTOCOL_INSTANCE__)
137 extern EFI_DRIVER_DIAGNOSTICS2_PROTOCOL __EDKII_GLUE_DRIVER_DIAGNOSTICS2_PROTOCOL_INSTANCE__
;
141 GLOBAL_REMOVE_IF_UNREFERENCED
const EFI_DRIVER_MODEL_PROTOCOL_LIST _gDriverModelProtocolList
[] = {
143 #ifdef __EDKII_GLUE_DRIVER_BINDING_PROTOCOL_INSTANCE__
144 &__EDKII_GLUE_DRIVER_BINDING_PROTOCOL_INSTANCE__
,
149 #if defined(__EDKII_GLUE_COMPONENT_NAME_PROTOCOL_INSTANCE__) && !(__EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__ == 2)
150 &__EDKII_GLUE_COMPONENT_NAME_PROTOCOL_INSTANCE__
,
155 #if defined(__EDKII_GLUE_DRIVER_CONFIGURATION_PROTOCOL_INSTANCE__) && !(__EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__ == 2)
156 &__EDKII_GLUE_DRIVER_CONFIGURATION_PROTOCOL_INSTANCE__
,
161 #if defined(__EDKII_GLUE_DRIVER_DIAGNOSTICS_PROTOCOL_INSTANCE__) && !(__EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__ == 2)
162 &__EDKII_GLUE_DRIVER_DIAGNOSTICS_PROTOCOL_INSTANCE__
,
167 #if defined(__EDKII_GLUE_COMPONENT_NAME2_PROTOCOL_INSTANCE__) && !(__EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__ == 1)
168 &__EDKII_GLUE_COMPONENT_NAME2_PROTOCOL_INSTANCE__
,
173 #if defined(__EDKII_GLUE_DRIVER_CONFIGURATION2_PROTOCOL_INSTANCE__) && !(__EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__ == 1)
174 &__EDKII_GLUE_DRIVER_CONFIGURATION2_PROTOCOL_INSTANCE__
,
179 #if defined(__EDKII_GLUE_DRIVER_DIAGNOSTICS2_PROTOCOL_INSTANCE__) && !(__EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__ == 1)
180 &__EDKII_GLUE_DRIVER_DIAGNOSTICS2_PROTOCOL_INSTANCE__
,
189 // Only one handler for SetVirtualAddressMap Event and ExitBootServices Event each
193 * This is the WRONG macro and it's kept only for backward compatibility.
195 #ifdef __EDKII_GLUE_SET_VIRTUAL_ADDRESS_MAP_EVENT__HANDLER__
198 __EDKII_GLUE_SET_VIRTUAL_ADDRESS_MAP_EVENT__HANDLER__ (
205 * This is the CORRECT macro users should use.
207 #ifdef __EDKII_GLUE_SET_VIRTUAL_ADDRESS_MAP_EVENT_HANDLER__
210 __EDKII_GLUE_SET_VIRTUAL_ADDRESS_MAP_EVENT_HANDLER__ (
217 * Both __EDKII_GLUE_SET_VIRTUAL_ADDRESS_MAP_EVENT__HANDLER__ and
218 * __EDKII_GLUE_SET_VIRTUAL_ADDRESS_MAP_EVENT_HANDLER__ are kept here although
219 * the former is a WRONG macro. It's kept only for backward compatibility.
220 * For a single module, it's not likely that both macros are defined.
222 GLOBAL_REMOVE_IF_UNREFERENCED
const EFI_EVENT_NOTIFY _gDriverSetVirtualAddressMapEvent
[] = {
223 #ifdef __EDKII_GLUE_SET_VIRTUAL_ADDRESS_MAP_EVENT__HANDLER__
224 __EDKII_GLUE_SET_VIRTUAL_ADDRESS_MAP_EVENT__HANDLER__
,
227 #ifdef __EDKII_GLUE_SET_VIRTUAL_ADDRESS_MAP_EVENT_HANDLER__
228 __EDKII_GLUE_SET_VIRTUAL_ADDRESS_MAP_EVENT_HANDLER__
,
235 * This is the WRONG macro and it's kept only for backward compatibility.
237 #ifdef __EDKII_GLUE_EXTI_BOOT_SERVICES_EVENT__HANDLER__
239 __EDKII_GLUE_EXTI_BOOT_SERVICES_EVENT__HANDLER__ (
246 * This is the CORRECT macro users should use.
248 #ifdef __EDKII_GLUE_EXIT_BOOT_SERVICES_EVENT_HANDLER__
250 __EDKII_GLUE_EXIT_BOOT_SERVICES_EVENT_HANDLER__ (
257 Set AtRuntime flag as TRUE after ExitBootServices
259 @param[in] Event The Event that is being processed
260 @param[in] Context Event Context
264 RuntimeDriverExitBootServices (
271 * Both __EDKII_GLUE_EXTI_BOOT_SERVICES_EVENT__HANDLER__ and
272 * __EDKII_GLUE_EXIT_BOOT_SERVICES_EVENT_HANDLER__ are kept here although
273 * the former is a WRONG macro. It's kept only for backward compatibility.
274 * For a single module, it's not likely that both macros are defined.
276 GLOBAL_REMOVE_IF_UNREFERENCED
const EFI_EVENT_NOTIFY _gDriverExitBootServicesEvent
[] = {
277 #ifdef __EDKII_GLUE_EDK_DXE_RUNTIME_DRIVER_LIB__
279 // only Runtime drivers need to link EdkDxeRuntimeDriverLib
281 RuntimeDriverExitBootServices
,
284 #ifdef __EDKII_GLUE_EXTI_BOOT_SERVICES_EVENT__HANDLER__
285 __EDKII_GLUE_EXTI_BOOT_SERVICES_EVENT__HANDLER__
,
288 #ifdef __EDKII_GLUE_EXIT_BOOT_SERVICES_EVENT_HANDLER__
289 __EDKII_GLUE_EXIT_BOOT_SERVICES_EVENT_HANDLER__
,
297 // Module Unload Handler
300 #ifdef __EDKII_GLUE_MODULE_UNLOAD_HANDLER__
303 __EDKII_GLUE_MODULE_UNLOAD_HANDLER__ (
304 EFI_HANDLE ImageHandle
310 ProcessModuleUnloadList (
311 EFI_HANDLE ImageHandle
314 #ifdef __EDKII_GLUE_MODULE_UNLOAD_HANDLER__
315 return (__EDKII_GLUE_MODULE_UNLOAD_HANDLER__ (ImageHandle
));
321 #ifdef __EDKII_GLUE_EFI_CALLER_ID_GUID__
322 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiCallerIdGuid
= __EDKII_GLUE_EFI_CALLER_ID_GUID__
;
326 // Library constructors
330 ProcessLibraryConstructorList (
331 IN EFI_HANDLE ImageHandle
,
332 IN EFI_SYSTEM_TABLE
*SystemTable
336 // Declare "Status" if any of the following libraries are used
338 #if defined(__EDKII_GLUE_DXE_HOB_LIB__) \
339 || defined(__EDKII_GLUE_UEFI_BOOT_SERVICES_TABLE_LIB__) \
340 || defined(__EDKII_GLUE_UEFI_DRIVER_MODEL_LIB__) \
341 || defined(__EDKII_GLUE_EDK_DXE_RUNTIME_DRIVER_LIB__) \
342 || defined(__EDKII_GLUE_DXE_SERVICES_TABLE_LIB__) \
343 || defined(__EDKII_GLUE_DXE_SMBUS_LIB__) \
344 || defined(__EDKII_GLUE_UEFI_RUNTIME_SERVICES_TABLE_LIB__) \
345 || defined(__EDKII_GLUE_EDK_DXE_SAL_LIB__) \
346 || defined(__EDKII_GLUE_DXE_IO_LIB_CPU_IO__) \
347 || defined(__EDKII_GLUE_SMM_RUNTIME_DXE_REPORT_STATUS_CODE_LIB__)
352 // EdkII Glue Library Constructors:
353 // NOTE: the constructors must be called according to dependency order
355 // UefiBootServicesTableLib UefiBootServicesTableLibConstructor()
356 // UefiRuntimeServicesTableLib UefiRuntimeServicesTableLibConstructor()
357 // DxeServicesTableLib DxeServicesTableLibConstructor()
358 // DxeIoLibCpuIo IoLibConstructor()
359 // DxeSalLib DxeSalLibConstructor(), IPF only
360 // EdkDxeRuntimeDriverLib RuntimeDriverLibConstruct()
361 // SmmRuntimeDxeReportStatusCodeLib ReportStatusCodeLibConstruct()
362 // UefiDriverModelLib UefiDriverModelLibConstructor()
363 // DxeHobLib HobLibConstructor()
364 // DxeSmbusLib SmbusLibConstructor()
367 #ifdef __EDKII_GLUE_UEFI_BOOT_SERVICES_TABLE_LIB__
368 Status
= UefiBootServicesTableLibConstructor (ImageHandle
, SystemTable
);
369 ASSERT_EFI_ERROR (Status
);
372 #ifdef __EDKII_GLUE_UEFI_RUNTIME_SERVICES_TABLE_LIB__
373 Status
= UefiRuntimeServicesTableLibConstructor (ImageHandle
, SystemTable
);
374 ASSERT_EFI_ERROR (Status
);
377 #ifdef __EDKII_GLUE_DXE_SERVICES_TABLE_LIB__
378 Status
= DxeServicesTableLibConstructor (ImageHandle
, SystemTable
);
379 ASSERT_EFI_ERROR (Status
);
382 #ifdef __EDKII_GLUE_DXE_IO_LIB_CPU_IO__
383 Status
= IoLibConstructor (ImageHandle
, SystemTable
);
384 ASSERT_EFI_ERROR (Status
);
387 #ifdef __EDKII_GLUE_EDK_DXE_SAL_LIB__
388 Status
= DxeSalLibConstructor(ImageHandle
, SystemTable
);
389 ASSERT_EFI_ERROR (Status
);
392 #ifdef __EDKII_GLUE_EDK_DXE_RUNTIME_DRIVER_LIB__
393 Status
= RuntimeDriverLibConstruct (ImageHandle
, SystemTable
);
394 ASSERT_EFI_ERROR (Status
);
397 #ifdef __EDKII_GLUE_SMM_RUNTIME_DXE_REPORT_STATUS_CODE_LIB__
398 Status
= ReportStatusCodeLibConstruct (ImageHandle
, SystemTable
);
399 ASSERT_EFI_ERROR (Status
);
402 #ifdef __EDKII_GLUE_UEFI_DRIVER_MODEL_LIB__
403 Status
= UefiDriverModelLibConstructor (ImageHandle
, SystemTable
);
404 ASSERT_EFI_ERROR (Status
);
407 #ifdef __EDKII_GLUE_DXE_HOB_LIB__
408 Status
= HobLibConstructor (ImageHandle
, SystemTable
);
409 ASSERT_EFI_ERROR (Status
);
412 #ifdef __EDKII_GLUE_DXE_SMBUS_LIB__
413 Status
= SmbusLibConstructor (ImageHandle
, SystemTable
);
414 ASSERT_EFI_ERROR (Status
);
420 // Library Destructors
424 ProcessLibraryDestructorList (
425 IN EFI_HANDLE ImageHandle
,
426 IN EFI_SYSTEM_TABLE
*SystemTable
429 #if defined (__EDKII_GLUE_UEFI_DRIVER_MODEL_LIB__) \
430 || defined (__EDKII_GLUE_EDK_DXE_RUNTIME_DRIVER_LIB__) \
431 || defined (__EDKII_GLUE_SMM_RUNTIME_DXE_REPORT_STATUS_CODE_LIB__)
436 // NOTE: the destructors must be called according to dependency order
438 #ifdef __EDKII_GLUE_UEFI_DRIVER_MODEL_LIB__
439 Status
= UefiDriverModelLibDestructor (ImageHandle
, SystemTable
);
440 ASSERT_EFI_ERROR (Status
);
443 #ifdef __EDKII_GLUE_SMM_RUNTIME_DXE_REPORT_STATUS_CODE_LIB__
444 Status
= ReportStatusCodeLibDestruct (ImageHandle
, SystemTable
);
445 ASSERT_EFI_ERROR (Status
);
448 #ifdef __EDKII_GLUE_EDK_DXE_RUNTIME_DRIVER_LIB__
449 Status
= RuntimeDriverLibDeconstruct (ImageHandle
, SystemTable
);
450 ASSERT_EFI_ERROR (Status
);
456 Unload function that is registered in the LoadImage protocol. It un-installs
457 protocols produced and deallocates pool used by the driver. Called by the core
458 when unloading the driver.
467 _DriverUnloadHandler (
468 EFI_HANDLE ImageHandle
474 // If an UnloadImage() handler is specified, then call it
476 Status
= ProcessModuleUnloadList (ImageHandle
);
479 // If the driver specific unload handler does not return an error, then call all of the
480 // library destructors. If the unload handler returned an error, then the driver can not be
481 // unloaded, and the library destructors should not be called
483 if (!EFI_ERROR (Status
)) {
485 // Close our ExitBootServices () notify function
488 #if __EDKII_GLUE_HAVE_DRIVER_EXIT_BOOT_SERVICES_EVENT__
489 if (_gDriverExitBootServicesEvent
[0] != NULL
) {
490 ASSERT (gBS
!= NULL
);
491 Status
= gBS
->CloseEvent (_mDriverExitBootServicesNotifyEvent
);
492 ASSERT_EFI_ERROR (Status
);
496 ProcessLibraryDestructorList (ImageHandle
, gST
);
500 // Return the status from the driver specific unload handler
507 _DriverExitBootServices (
515 Set AtRuntime flag as TRUE after ExitBootServices
519 Event - The Event that is being processed
521 Context - Event Context
529 #if __EDKII_GLUE_HAVE_DRIVER_EXIT_BOOT_SERVICES_EVENT__
530 EFI_EVENT_NOTIFY ChildNotifyEventHandler
;
533 for (Index
= 0; _gDriverExitBootServicesEvent
[Index
] != NULL
; Index
++) {
534 ChildNotifyEventHandler
= _gDriverExitBootServicesEvent
[Index
];
535 ChildNotifyEventHandler (Event
, NULL
);
540 EFI_DRIVER_ENTRY_POINT (_ModuleEntryPoint
);
543 // Module Entry Point
545 #ifdef __EDKII_GLUE_MODULE_ENTRY_POINT__
548 __EDKII_GLUE_MODULE_ENTRY_POINT__ (
549 EFI_HANDLE ImageHandle
,
550 EFI_SYSTEM_TABLE
*SystemTable
555 Enrty point to DXE Driver.
557 @param ImageHandle ImageHandle of the loaded driver.
558 @param SystemTable Pointer to the EFI System Table.
560 @retval EFI_SUCCESS One or more of the drivers returned a success code.
561 @retval !EFI_SUCESS The return status from the last driver entry point in the list.
567 IN EFI_HANDLE ImageHandle
,
568 IN EFI_SYSTEM_TABLE
*SystemTable
573 // if (_gUefiDriverRevision != 0) {
575 // // Make sure that the EFI/UEFI spec revision of the platform is >= EFI/UEFI spec revision of the driver
577 // if (SystemTable->Hdr.Revision < _gUefiDriverRevision) {
578 // return EFI_INCOMPATIBLE_VERSION;
582 // DEBUG ((EFI_D_ERROR, "EdkII Glue Driver Entry - 0\n"));
585 // Call constructor for all libraries
587 ProcessLibraryConstructorList (ImageHandle
, SystemTable
);
590 // Register our ExitBootServices () notify function
592 #if __EDKII_GLUE_HAVE_DRIVER_EXIT_BOOT_SERVICES_EVENT__
593 if (_gDriverExitBootServicesEvent
[0] != NULL
) {
594 Status
= SystemTable
->BootServices
->CreateEvent (
595 EFI_EVENT_SIGNAL_EXIT_BOOT_SERVICES
,
597 _DriverExitBootServices
,
599 &_mDriverExitBootServicesNotifyEvent
602 ASSERT_EFI_ERROR (Status
);
607 // Install unload handler...
610 // Add conditional macro to save size. The 4 macros check against
611 // potential functions which may be invoked, if there is no function
612 // to be called, we don't register Unload callback.
614 #if ( defined(__EDKII_GLUE_MODULE_UNLOAD_HANDLER__) \
615 || defined(__EDKII_GLUE_UEFI_DRIVER_MODEL_LIB__) \
616 || defined(__EDKII_GLUE_EDK_DXE_RUNTIME_DRIVER_LIB__) ) \
617 || __EDKII_GLUE_HAVE_DRIVER_EXIT_BOOT_SERVICES_EVENT__
620 EFI_LOADED_IMAGE_PROTOCOL
*LoadedImage
;
622 Status
= SystemTable
->BootServices
->HandleProtocol (
624 &gEfiLoadedImageProtocolGuid
,
625 (VOID
**)&LoadedImage
627 ASSERT_EFI_ERROR (Status
);
628 LoadedImage
->Unload
= _DriverUnloadHandler
;
634 // Call the driver entry point
636 #ifdef __EDKII_GLUE_MODULE_ENTRY_POINT__
637 Status
= (__EDKII_GLUE_MODULE_ENTRY_POINT__ (ImageHandle
, SystemTable
));
639 Status
= EFI_SUCCESS
;
643 // If all of the drivers returned errors, then invoke all of the library destructors
645 if (EFI_ERROR (Status
)) {
647 // Close our ExitBootServices () notify function
649 #if __EDKII_GLUE_HAVE_DRIVER_EXIT_BOOT_SERVICES_EVENT__
650 if (_gDriverExitBootServicesEvent
[0] != NULL
) {
651 EFI_STATUS CloseEventStatus
;
652 CloseEventStatus
= SystemTable
->BootServices
->CloseEvent (_mDriverExitBootServicesNotifyEvent
);
653 ASSERT_EFI_ERROR (CloseEventStatus
);
657 ProcessLibraryDestructorList (ImageHandle
, SystemTable
);
661 // Return the cummalative return status code from all of the driver entry points
668 Enrty point wrapper of DXE Driver.
670 @param ImageHandle ImageHandle of the loaded driver.
671 @param SystemTable Pointer to the EFI System Table.
673 @retval EFI_SUCCESS One or more of the drivers returned a success code.
674 @retval !EFI_SUCESS The return status from the last driver entry point in the list.
676 EBC build envrionment has /D $(IMAGE_ENTRY_POINT)=EfiMain which overrides what GlueLib
677 defines: /D IMAGE_ENTRY_POINT=_ModuleEntryPoint, so _ModuleEntryPoint will be replaced with
678 EfiMain thus the function below isn't needed in EBC envrionment.
685 IN EFI_HANDLE ImageHandle
,
686 IN EFI_SYSTEM_TABLE
*SystemTable
689 return _ModuleEntryPoint (ImageHandle
, SystemTable
);
694 // Guids not present in EDK code base
698 // Protocol/Arch Protocol GUID globals
700 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gUefiDriverConfigurationProtocolGuid
= { 0xbfd7dc1d, 0x24f1, 0x40d9, { 0x82, 0xe7, 0x2e, 0x09, 0xbb, 0x6b, 0x4e, 0xbe } };
701 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gUefiDriverDiagnosticsProtocolGuid
= { 0x4d330321, 0x025f, 0x4aac, { 0x90, 0xd8, 0x5e, 0xd9, 0x00, 0x17, 0x3b, 0x63 } };
702 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiArpProtocolGuid
= { 0xf4b427bb, 0xba21, 0x4f16, { 0xbc, 0x4e, 0x43, 0xe4, 0x16, 0xab, 0x61, 0x9c } };
703 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiArpServiceBindingProtocolGuid
= { 0xf44c00ee, 0x1f2c, 0x4a00, { 0xaa, 0x09, 0x1c, 0x9f, 0x3e, 0x08, 0x00, 0xa3 } };
704 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiDhcp4ProtocolGuid
= { 0x8a219718, 0x4ef5, 0x4761, { 0x91, 0xc8, 0xc0, 0xf0, 0x4b, 0xda, 0x9e, 0x56 } };
705 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiDhcp4ServiceBindingProtocolGuid
= { 0x9d9a39d8, 0xbd42, 0x4a73, { 0xa4, 0xd5, 0x8e, 0xe9, 0x4b, 0xe1, 0x13, 0x80 } };
706 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiIp4ProtocolGuid
= { 0x41d94cd2, 0x35b6, 0x455a, { 0x82, 0x58, 0xd4, 0xe5, 0x13, 0x34, 0xaa, 0xdd } };
707 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiIp4ServiceBindingProtocolGuid
= { 0xc51711e7, 0xb4bf, 0x404a, { 0xbf, 0xb8, 0x0a, 0x04, 0x8e, 0xf1, 0xff, 0xe4 } };
708 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiIp4ConfigProtocolGuid
= { 0x3b95aa31, 0x3793, 0x434b, { 0x86, 0x67, 0xc8, 0x07, 0x08, 0x92, 0xe0, 0x5e } };
709 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiManagedNetworkProtocolGuid
= { 0x3b95aa31, 0x3793, 0x434b, { 0x86, 0x67, 0xc8, 0x07, 0x08, 0x92, 0xe0, 0x5e } };
710 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiManagedNetworkServiceBindingProtocolGuid
= { 0xf36ff770, 0xa7e1, 0x42cf, { 0x9e, 0xd2, 0x56, 0xf0, 0xf2, 0x71, 0xf4, 0x4c } };
711 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiMtftp4ProtocolGuid
= { 0x3ad9df29, 0x4501, 0x478d, { 0xb1, 0xf8, 0x7f, 0x7f, 0xe7, 0x0e, 0x50, 0xf3 } };
712 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiMtftp4ServiceBindingProtocolGuid
= { 0x2FE800BE, 0x8F01, 0x4aa6, { 0x94, 0x6B, 0xD7, 0x13, 0x88, 0xE1, 0x83, 0x3F } };
713 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiTcp4ProtocolGuid
= { 0x65530BC7, 0xA359, 0x410f, { 0xB0, 0x10, 0x5A, 0xAD, 0xC7, 0xEC, 0x2B, 0x62 } };
714 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiTcp4ServiceBindingProtocolGuid
= { 0x00720665, 0x67EB, 0x4a99, { 0xBA, 0xF7, 0xD3, 0xC3, 0x3A, 0x1C, 0x7C, 0xC9 } };
715 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiUdp4ProtocolGuid
= { 0x3ad9df29, 0x4501, 0x478d, { 0xb1, 0xf8, 0x7f, 0x7f, 0xe7, 0x0e, 0x50, 0xf3 } };
716 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiUdp4ServiceBindingProtocolGuid
= { 0x83f01464, 0x99bd, 0x45e5, { 0xb3, 0x83, 0xaf, 0x63, 0x05, 0xd8, 0xe9, 0xe6 } };
717 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiAuthenticationInfoProtocolGuid
= { 0x7671d9d0, 0x53db, 0x4173, { 0xaa, 0x69, 0x23, 0x27, 0xf2, 0x1f, 0x0b, 0xc7 } };
718 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiDevicePathFromTextProtocolGuid
= { 0x5c99a21, 0xc70f, 0x4ad2, { 0x8a, 0x5f, 0x35, 0xdf, 0x33, 0x43, 0xf5, 0x1e } };
719 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiDevicePathToTextProtocolGuid
= { 0x8b843e20, 0x8132, 0x4852, { 0x90, 0xcc, 0x55, 0x1a, 0x4e, 0x4a, 0x7f, 0x1c } };
720 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiDevicePathUtilitiesProtocolGuid
= { 0x379be4e, 0xd706, 0x437d, { 0xb0, 0x37, 0xed, 0xb8, 0x2f, 0xb7, 0x72, 0xa4 } };
721 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiHashProtocolGuid
= { 0xc5184932, 0xdba5, 0x46db, { 0xa5, 0xba, 0xcc, 0x0b, 0xda, 0x9c, 0x14, 0x35 } };
722 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiHashServiceBindingProtocolGuid
= { 0x42881c98, 0xa4f3, 0x44b0, { 0xa3, 0x9d, 0xdf, 0xa1, 0x86, 0x67, 0xd8, 0xcd } };
723 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiIScsiInitiatorNameProtocolGuid
= { 0xa6a72875, 0x2962, 0x4c18, { 0x9f, 0x46, 0x8d, 0xa6, 0x44, 0xcc, 0xfe, 0x00 } };
724 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiExtScsiPassThruProtocolGuid
= { 0x1d3de7f0, 0x0807, 0x424f, { 0xaa, 0x69, 0x11, 0xa5, 0x4e, 0x19, 0xa4, 0x6f } };
725 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiTapeIoProtocolGuid
= { 0x1e93e633, 0xd65a, 0x459e, { 0xab, 0x84, 0x93, 0xd9, 0xec, 0x26, 0x6d, 0x18 } };
726 #if (EFI_SPECIFICATION_VERSION < 0x00020000)
727 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiUsb2HcProtocolGuid
= { 0x3e745226, 0x9818, 0x45b6, { 0xa2, 0xac, 0xd7, 0xcd, 0x0e, 0x8b, 0xa2, 0xbc } };
737 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiHobMemoryAllocBspStoreGuid
= { 0x564b33cd, 0xc92a, 0x4593, { 0x90, 0xbf, 0x24, 0x73, 0xe4, 0x3c, 0x63, 0x22 } };
738 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiHobMemoryAllocStackGuid
= { 0x4ed4bf27, 0x4092, 0x42e9, { 0x80, 0x7d, 0x52, 0x7b, 0x1d, 0x00, 0xc9, 0xbd } };
739 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiHobMemoryAllocModuleGuid
= { 0xf8e21975, 0x0899, 0x4f58, { 0xa4, 0xbe, 0x55, 0x25, 0xa9, 0xc6, 0xd7, 0x7a } };
740 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiAuthenticationChapRadiusGuid
= { 0xd6062b50, 0x15ca, 0x11da, { 0x92, 0x19, 0x00, 0x10, 0x83, 0xff, 0xca, 0x4d } };
741 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiAuthenticationChapLocalGuid
= { 0xc280c73e, 0x15ca, 0x11da, { 0xb0, 0xca, 0x00, 0x10, 0x83, 0xff, 0xca, 0x4d } };
742 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiHashAlgorithmSha1Guid
= { 0x2ae9d80f, 0x3fb2, 0x4095, { 0xb7, 0xb1, 0xe9, 0x31, 0x57, 0xb9, 0x46, 0xb6 } };
743 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiHashAlgorithmSha224Guid
= { 0x8df01a06, 0x9bd5, 0x4bf7, { 0xb0, 0x21, 0xdb, 0x4f, 0xd9, 0xcc, 0xf4, 0x5b } };
744 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiHashAlgorithmSha256Guid
= { 0x51aa59de, 0xfdf2, 0x4ea3, { 0xbc, 0x63, 0x87, 0x5f, 0xb7, 0x84, 0x2e, 0xe9 } };
745 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiHashAlgorithmSha384Guid
= { 0xefa96432, 0xde33, 0x4dd2, { 0xae, 0xe6, 0x32, 0x8c, 0x33, 0xdf, 0x77, 0x7a } };
746 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiHashAlgorithmSha512Guid
= { 0xcaa4381e, 0x750c, 0x4770, { 0xb8, 0x70, 0x7a, 0x23, 0xb4, 0xe4, 0x21, 0x30 } };
747 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiHashAlgorithmMD5Guid
= { 0xaf7c79c, 0x65b5, 0x4319, { 0xb0, 0xae, 0x44, 0xec, 0x48, 0x4e, 0x4a, 0xd7 } };
748 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gBootObjectAuthorizationParmsetGuid
= { 0xedd35e31, 0x7b9, 0x11d2, { 0x83, 0xa3, 0x00, 0xa0, 0xc9, 0x1f, 0xad, 0xcf } };
749 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gSmmCommunicateHeaderGuid
= { 0xf328e36c, 0x23b6, 0x4a95, { 0x85, 0x4b, 0x32, 0xe1, 0x95, 0x34, 0xcd, 0x75 } };
750 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiCapsuleGuid
= { 0x3B6686BD, 0x0D76, 0x4030, { 0xB7, 0x0E, 0xB5, 0x51, 0x9E, 0x2F, 0xC5, 0xA0 } };
751 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiConfigFileNameGuid
= { 0x98B8D59B, 0xE8BA, 0x48EE, { 0x98, 0xDD, 0xC2, 0x95, 0x39, 0x2F, 0x1E, 0xDB } };