2 Entry point to a EFI/DXE driver.
4 Copyright (c) 2006 - 2007, Intel Corporation<BR>
5 All rights reserved. This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
17 // The package level header files this module uses
21 // The protocols, PPI and GUID defintions for this module
23 #include <Protocol/LoadedImage.h>
25 // The Library classes this module consumes
27 #include <Library/UefiDriverEntryPoint.h>
28 #include <Library/DebugLib.h>
29 #include <Library/UefiBootServicesTableLib.h>
33 Unload function that is registered in the LoadImage protocol. It un-installs
34 protocols produced and deallocates pool used by the driver. Called by the core
35 when unloading the driver.
45 _DriverUnloadHandler (
46 EFI_HANDLE ImageHandle
52 // If an UnloadImage() handler is specified, then call it
54 Status
= ProcessModuleUnloadList (ImageHandle
);
57 // If the driver specific unload handler does not return an error, then call all of the
58 // library destructors. If the unload handler returned an error, then the driver can not be
59 // unloaded, and the library destructors should not be called
61 if (!EFI_ERROR (Status
)) {
62 ProcessLibraryDestructorList (ImageHandle
, gST
);
66 // Return the status from the driver specific unload handler
73 Enrty point to DXE Driver.
75 @param ImageHandle ImageHandle of the loaded driver.
76 @param SystemTable Pointer to the EFI System Table.
78 @retval EFI_SUCCESS One or more of the drivers returned a success code.
79 @retval !EFI_SUCESS The return status from the last driver entry point in the list.
85 IN EFI_HANDLE ImageHandle
,
86 IN EFI_SYSTEM_TABLE
*SystemTable
90 EFI_LOADED_IMAGE_PROTOCOL
*LoadedImage
;
92 if (_gUefiDriverRevision
!= 0) {
94 // Make sure that the EFI/UEFI spec revision of the platform is >= EFI/UEFI spec revision of the driver
96 if (SystemTable
->Hdr
.Revision
< _gUefiDriverRevision
) {
97 return EFI_INCOMPATIBLE_VERSION
;
102 // Call constructor for all libraries
104 ProcessLibraryConstructorList (ImageHandle
, SystemTable
);
107 // Install unload handler...
109 if (_gDriverUnloadImageCount
!= 0) {
110 Status
= gBS
->HandleProtocol (
112 &gEfiLoadedImageProtocolGuid
,
113 (VOID
**)&LoadedImage
115 ASSERT_EFI_ERROR (Status
);
116 LoadedImage
->Unload
= _DriverUnloadHandler
;
120 // Call the driver entry point
122 Status
= ProcessModuleEntryPointList (ImageHandle
, SystemTable
);
125 // If all of the drivers returned errors, then invoke all of the library destructors
127 if (EFI_ERROR (Status
)) {
128 ProcessLibraryDestructorList (ImageHandle
, SystemTable
);
132 // Return the cummalative return status code from all of the driver entry points
139 Enrty point wrapper of DXE Driver.
141 @param ImageHandle ImageHandle of the loaded driver.
142 @param SystemTable Pointer to the EFI System Table.
144 @retval EFI_SUCCESS One or more of the drivers returned a success code.
145 @retval !EFI_SUCESS The return status from the last driver entry point in the list.
151 IN EFI_HANDLE ImageHandle
,
152 IN EFI_SYSTEM_TABLE
*SystemTable
155 return _ModuleEntryPoint (ImageHandle
, SystemTable
);