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.
19 #include <Protocol/LoadedImage.h>
21 #include <Library/UefiDriverEntryPoint.h>
22 #include <Library/DebugLib.h>
23 #include <Library/UefiBootServicesTableLib.h>
27 Unload function that is registered in the LoadImage protocol. It un-installs
28 protocols produced and deallocates pool used by the driver. Called by the core
29 when unloading the driver.
31 @param ImageHandle ImageHandle of the loaded driver.
33 @return Status returned by all unload().
38 _DriverUnloadHandler (
39 EFI_HANDLE ImageHandle
45 // If an UnloadImage() handler is specified, then call it
47 Status
= ProcessModuleUnloadList (ImageHandle
);
50 // If the driver specific unload handler does not return an error, then call all of the
51 // library destructors. If the unload handler returned an error, then the driver can not be
52 // unloaded, and the library destructors should not be called
54 if (!EFI_ERROR (Status
)) {
55 ProcessLibraryDestructorList (ImageHandle
, gST
);
59 // Return the status from the driver specific unload handler
66 Enrty point to DXE Driver.
68 @param ImageHandle ImageHandle of the loaded driver.
69 @param SystemTable Pointer to the EFI System Table.
71 @retval EFI_SUCCESS One or more of the drivers returned a success code.
72 @retval !EFI_SUCESS The return status from the last driver entry point in the list.
78 IN EFI_HANDLE ImageHandle
,
79 IN EFI_SYSTEM_TABLE
*SystemTable
83 EFI_LOADED_IMAGE_PROTOCOL
*LoadedImage
;
85 if (_gUefiDriverRevision
!= 0) {
87 // Make sure that the EFI/UEFI spec revision of the platform is >= EFI/UEFI spec revision of the driver
89 if (SystemTable
->Hdr
.Revision
< _gUefiDriverRevision
) {
90 return EFI_INCOMPATIBLE_VERSION
;
95 // Call constructor for all libraries
97 ProcessLibraryConstructorList (ImageHandle
, SystemTable
);
100 // Install unload handler...
102 if (_gDriverUnloadImageCount
!= 0) {
103 Status
= gBS
->HandleProtocol (
105 &gEfiLoadedImageProtocolGuid
,
106 (VOID
**)&LoadedImage
108 ASSERT_EFI_ERROR (Status
);
109 LoadedImage
->Unload
= _DriverUnloadHandler
;
113 // Call the driver entry point
115 Status
= ProcessModuleEntryPointList (ImageHandle
, SystemTable
);
118 // If all of the drivers returned errors, then invoke all of the library destructors
120 if (EFI_ERROR (Status
)) {
121 ProcessLibraryDestructorList (ImageHandle
, SystemTable
);
125 // Return the cummalative return status code from all of the driver entry points
132 Enrty point wrapper of DXE Driver.
134 @param ImageHandle ImageHandle of the loaded driver.
135 @param SystemTable Pointer to the EFI System Table.
137 @retval EFI_SUCCESS One or more of the drivers returned a success code.
138 @retval !EFI_SUCESS The return status from the last driver entry point in the list.
144 IN EFI_HANDLE ImageHandle
,
145 IN EFI_SYSTEM_TABLE
*SystemTable
148 return _ModuleEntryPoint (ImageHandle
, SystemTable
);