/** @file\r
- Entry point to a EFI/DXE driver.\r
+ This file implement EfiMain() for library class DxeSmmDriverEntryPoint.\r
+ EfiMain() is common driver entry point for all SMM driver who uses DxeSmmDriverEntryPoint\r
+ library class.\r
\r
Copyright (c) 2006, Intel Corporation<BR>\r
All rights reserved. This program and the accompanying materials\r
#include <Library/DebugLib.h>\r
\r
\r
-EFI_BOOT_SERVICES *mBS;\r
-\r
/**\r
This function returns the size, in bytes,\r
of the device path data structure specified by DevicePath.\r
@return The size of a device path in bytes.\r
\r
**/\r
-STATIC\r
UINTN\r
EFIAPI\r
SmmGetDevicePathSize (\r
Size2 = SmmGetDevicePathSize (SecondDevicePath);\r
Size = Size1 + Size2 - sizeof (EFI_DEVICE_PATH_PROTOCOL);\r
\r
- Status = mBS->AllocatePool (EfiBootServicesData, Size, (VOID **) &NewDevicePath);\r
+ Status = gBS->AllocatePool (EfiBootServicesData, Size, (VOID **) &NewDevicePath);\r
\r
if (EFI_SUCCESS == Status) {\r
- mBS->CopyMem ((VOID *) NewDevicePath, (VOID *) FirstDevicePath, Size1);\r
+ //\r
+ // CopyMem in gBS is used as this service should always be ready. We didn't choose\r
+ // to use a BaseMemoryLib function as such library instance may have constructor.\r
+ //\r
+ gBS->CopyMem ((VOID *) NewDevicePath, (VOID *) FirstDevicePath, Size1);\r
//\r
// Over write Src1 EndNode and do the copy\r
//\r
DevicePath2 = (EFI_DEVICE_PATH_PROTOCOL *) ((CHAR8 *) NewDevicePath + (Size1 - sizeof (EFI_DEVICE_PATH_PROTOCOL)));\r
- mBS->CopyMem ((VOID *) DevicePath2, (VOID *) SecondDevicePath, Size2);\r
+ gBS->CopyMem ((VOID *) DevicePath2, (VOID *) SecondDevicePath, Size2);\r
}\r
\r
return NewDevicePath;\r
EFI_HANDLE ImageHandle\r
)\r
{\r
- EFI_STATUS Status;\r
-\r
- //\r
- // Call the unload handlers for all the modules\r
- //\r
- Status = ProcessModuleUnloadList (ImageHandle);\r
-\r
- //\r
- // If the driver specific unload handler does not return an error, then call all of the\r
- // library destructors. If the unload handler returned an error, then the driver can not be\r
- // unloaded, and the library destructors should not be called\r
- //\r
- if (!EFI_ERROR (Status)) {\r
- ProcessLibraryDestructorList (ImageHandle, gST);\r
- }\r
-\r
//\r
- // Return the status from the driver specific unload handler\r
+ // Call the unload handlers for all the modules.\r
+ // \r
+ // Note: All libraries were constructed in SMM space, \r
+ // therefore we can not destruct them in Unload \r
+ // handler.\r
//\r
- return Status;\r
+ return ProcessModuleUnloadList (ImageHandle);\r
}\r
\r
/**\r
//\r
// Cache a pointer to the Boot Services Table\r
//\r
- mBS = SystemTable->BootServices;\r
+ gBS = SystemTable->BootServices;\r
\r
//\r
// Retrieve the Loaded Image Protocol\r
//\r
- Status = mBS->HandleProtocol (\r
+ Status = gBS->HandleProtocol (\r
ImageHandle,\r
&gEfiLoadedImageProtocolGuid,\r
(VOID*)&LoadedImage\r
//\r
// Retrieve SMM Base Protocol\r
//\r
- Status = mBS->LocateProtocol (\r
+ Status = gBS->LocateProtocol (\r
&gEfiSmmBaseProtocolGuid,\r
NULL,\r
(VOID **) &SmmBase\r
//\r
// Retrieve the Device Path Protocol from the DeviceHandle tha this driver was loaded from\r
//\r
- Status = mBS->HandleProtocol (\r
+ Status = gBS->HandleProtocol (\r
LoadedImage->DeviceHandle,\r
&gEfiDevicePathProtocolGuid,\r
(VOID*)&ImageDevicePath\r
// Optionally install the unload handler\r
//\r
if (_gDriverUnloadImageCount > 0) {\r
- Status = mBS->HandleProtocol (\r
+ Status = gBS->HandleProtocol (\r
ImageHandle,\r
&gEfiLoadedImageProtocolGuid,\r
(VOID **)&LoadedImage\r