X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;ds=sidebyside;f=MdeModulePkg%2FCore%2FDxe%2FDispatcher%2FDispatcher.c;h=fb9ae3ce78dacacead90ed30f2fcc3c527f26670;hb=HEAD;hp=848eb4baaf709a65533d76833afe78b301fcc1dd;hpb=bc2dfdbcfc11dc785f0cc0ad2f519a63b98f88bc;p=mirror_edk2.git diff --git a/MdeModulePkg/Core/Dxe/Dispatcher/Dispatcher.c b/MdeModulePkg/Core/Dxe/Dispatcher/Dispatcher.c index 848eb4baaf..fb9ae3ce78 100644 --- a/MdeModulePkg/Core/Dxe/Dispatcher/Dispatcher.c +++ b/MdeModulePkg/Core/Dxe/Dispatcher/Dispatcher.c @@ -26,14 +26,8 @@ Depex - Dependency Expresion. SOR - Schedule On Request - Don't schedule if this bit is set. -Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.
-This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
+SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -61,7 +55,6 @@ LIST_ENTRY mFvHandleList = INITIALIZE_LIST_HEAD_VARIABLE (mFvHandleList); // EFI_LOCK mDispatcherLock = EFI_INITIALIZE_LOCK_VARIABLE (TPL_HIGH_LEVEL); - // // Flag for the DXE Dispacher. TRUE if dispatcher is execuing. // @@ -70,13 +63,13 @@ BOOLEAN gDispatcherRunning = FALSE; // // Module globals to manage the FwVol registration notification event // -EFI_EVENT mFwVolEvent; -VOID *mFwVolEventRegistration; +EFI_EVENT mFwVolEvent; +VOID *mFwVolEventRegistration; // // List of file types supported by dispatcher // -EFI_FV_FILETYPE mDxeFileTypes[] = { +EFI_FV_FILETYPE mDxeFileTypes[] = { EFI_FV_FILETYPE_DRIVER, EFI_FV_FILETYPE_COMBINED_SMM_DXE, EFI_FV_FILETYPE_COMBINED_PEIM_DRIVER, @@ -85,25 +78,16 @@ EFI_FV_FILETYPE mDxeFileTypes[] = { }; typedef struct { - MEDIA_FW_VOL_FILEPATH_DEVICE_PATH File; - EFI_DEVICE_PATH_PROTOCOL End; + MEDIA_FW_VOL_FILEPATH_DEVICE_PATH File; + EFI_DEVICE_PATH_PROTOCOL End; } FV_FILEPATH_DEVICE_PATH; -FV_FILEPATH_DEVICE_PATH mFvDevicePath = { - { - 0 - }, - { - END_DEVICE_PATH_TYPE, - END_ENTIRE_DEVICE_PATH_SUBTYPE, - { - END_DEVICE_PATH_LENGTH - } - } -}; +FV_FILEPATH_DEVICE_PATH mFvDevicePath; + // // Function Prototypes // + /** Insert InsertedDriverEntry onto the mScheduledQueue. To do this you must add any driver with a before dependency on InsertedDriverEntry first. @@ -117,7 +101,7 @@ FV_FILEPATH_DEVICE_PATH mFvDevicePath = { **/ VOID CoreInsertOnScheduledQueueWhileProcessingBeforeAndAfter ( - IN EFI_CORE_DRIVER_ENTRY *InsertedDriverEntry + IN EFI_CORE_DRIVER_ENTRY *InsertedDriverEntry ); /** @@ -140,8 +124,8 @@ CoreInsertOnScheduledQueueWhileProcessingBeforeAndAfter ( VOID EFIAPI CoreFwVolEventProtocolNotify ( - IN EFI_EVENT Event, - IN VOID *Context + IN EFI_EVENT Event, + IN VOID *Context ); /** @@ -159,9 +143,9 @@ CoreFwVolEventProtocolNotify ( **/ EFI_DEVICE_PATH_PROTOCOL * CoreFvToDevicePath ( - IN EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv, - IN EFI_HANDLE FvHandle, - IN EFI_GUID *DriverName + IN EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv, + IN EFI_HANDLE FvHandle, + IN EFI_GUID *DriverName ); /** @@ -187,32 +171,30 @@ CoreFvToDevicePath ( **/ EFI_STATUS CoreAddToDriverList ( - IN EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv, - IN EFI_HANDLE FvHandle, - IN EFI_GUID *DriverName, - IN EFI_FV_FILETYPE Type + IN EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv, + IN EFI_HANDLE FvHandle, + IN EFI_GUID *DriverName, + IN EFI_FV_FILETYPE Type ); /** - Get the driver from the FV through driver name, and produce a FVB protocol on FvHandle. + Get Fv image(s) from the FV through file name, and produce FVB protocol for every Fv image(s). @param Fv The FIRMWARE_VOLUME protocol installed on the FV. @param FvHandle The handle which FVB protocol installed on. - @param DriverName The driver guid specified. + @param FileName The file name guid specified. @retval EFI_OUT_OF_RESOURCES No enough memory or other resource. - @retval EFI_VOLUME_CORRUPTED Corrupted volume. @retval EFI_SUCCESS Function successfully returned. **/ EFI_STATUS CoreProcessFvImageFile ( - IN EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv, - IN EFI_HANDLE FvHandle, - IN EFI_GUID *DriverName + IN EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv, + IN EFI_HANDLE FvHandle, + IN EFI_GUID *FileName ); - /** Enter critical section by gaining lock on mDispatcherLock. @@ -225,7 +207,6 @@ CoreAcquireDispatcherLock ( CoreAcquireLock (&mDispatcherLock); } - /** Exit critical section by releasing lock on mDispatcherLock. @@ -238,7 +219,6 @@ CoreReleaseDispatcherLock ( CoreReleaseLock (&mDispatcherLock); } - /** Read Depex and pre-process the Depex for Before and After. If Section Extraction protocol returns an error via ReadSection defer the reading of the Depex. @@ -253,30 +233,29 @@ CoreReleaseDispatcherLock ( **/ EFI_STATUS CoreGetDepexSectionAndPreProccess ( - IN EFI_CORE_DRIVER_ENTRY *DriverEntry + IN EFI_CORE_DRIVER_ENTRY *DriverEntry ) { - EFI_STATUS Status; - EFI_SECTION_TYPE SectionType; - UINT32 AuthenticationStatus; - EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv; - + EFI_STATUS Status; + EFI_SECTION_TYPE SectionType; + UINT32 AuthenticationStatus; + EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv; Fv = DriverEntry->Fv; // // Grab Depex info, it will never be free'ed. // - SectionType = EFI_SECTION_DXE_DEPEX; - Status = Fv->ReadSection ( - DriverEntry->Fv, - &DriverEntry->FileName, - SectionType, - 0, - &DriverEntry->Depex, - (UINTN *)&DriverEntry->DepexSize, - &AuthenticationStatus - ); + SectionType = EFI_SECTION_DXE_DEPEX; + Status = Fv->ReadSection ( + DriverEntry->Fv, + &DriverEntry->FileName, + SectionType, + 0, + &DriverEntry->Depex, + (UINTN *)&DriverEntry->DepexSize, + &AuthenticationStatus + ); if (EFI_ERROR (Status)) { if (Status == EFI_PROTOCOL_ERROR) { // @@ -287,8 +266,8 @@ CoreGetDepexSectionAndPreProccess ( // // If no Depex assume UEFI 2.0 driver model // - DriverEntry->Depex = NULL; - DriverEntry->Dependent = TRUE; + DriverEntry->Depex = NULL; + DriverEntry->Dependent = TRUE; DriverEntry->DepexProtocolError = FALSE; } } else { @@ -303,7 +282,6 @@ CoreGetDepexSectionAndPreProccess ( return Status; } - /** Check every driver and locate a matching one. If the driver is found, the Unrequested state flag is cleared. @@ -325,38 +303,37 @@ CoreSchedule ( IN EFI_GUID *DriverName ) { - LIST_ENTRY *Link; - EFI_CORE_DRIVER_ENTRY *DriverEntry; + LIST_ENTRY *Link; + EFI_CORE_DRIVER_ENTRY *DriverEntry; // // Check every driver // for (Link = mDiscoveredList.ForwardLink; Link != &mDiscoveredList; Link = Link->ForwardLink) { - DriverEntry = CR(Link, EFI_CORE_DRIVER_ENTRY, Link, EFI_CORE_DRIVER_ENTRY_SIGNATURE); - if (DriverEntry->FvHandle == FirmwareVolumeHandle && + DriverEntry = CR (Link, EFI_CORE_DRIVER_ENTRY, Link, EFI_CORE_DRIVER_ENTRY_SIGNATURE); + if ((DriverEntry->FvHandle == FirmwareVolumeHandle) && DriverEntry->Unrequested && - CompareGuid (DriverName, &DriverEntry->FileName)) { + CompareGuid (DriverName, &DriverEntry->FileName)) + { // // Move the driver from the Unrequested to the Dependent state // CoreAcquireDispatcherLock (); - DriverEntry->Unrequested = FALSE; - DriverEntry->Dependent = TRUE; + DriverEntry->Unrequested = FALSE; + DriverEntry->Dependent = TRUE; CoreReleaseDispatcherLock (); DEBUG ((DEBUG_DISPATCH, "Schedule FFS(%g) - EFI_SUCCESS\n", DriverName)); - + return EFI_SUCCESS; } } - + DEBUG ((DEBUG_DISPATCH, "Schedule FFS(%g) - EFI_NOT_FOUND\n", DriverName)); - + return EFI_NOT_FOUND; } - - /** Convert a driver from the Untrused back to the Scheduled state. @@ -376,17 +353,18 @@ CoreTrust ( IN EFI_GUID *DriverName ) { - LIST_ENTRY *Link; - EFI_CORE_DRIVER_ENTRY *DriverEntry; + LIST_ENTRY *Link; + EFI_CORE_DRIVER_ENTRY *DriverEntry; // // Check every driver // for (Link = mDiscoveredList.ForwardLink; Link != &mDiscoveredList; Link = Link->ForwardLink) { - DriverEntry = CR(Link, EFI_CORE_DRIVER_ENTRY, Link, EFI_CORE_DRIVER_ENTRY_SIGNATURE); - if (DriverEntry->FvHandle == FirmwareVolumeHandle && + DriverEntry = CR (Link, EFI_CORE_DRIVER_ENTRY, Link, EFI_CORE_DRIVER_ENTRY_SIGNATURE); + if ((DriverEntry->FvHandle == FirmwareVolumeHandle) && DriverEntry->Untrusted && - CompareGuid (DriverName, &DriverEntry->FileName)) { + CompareGuid (DriverName, &DriverEntry->FileName)) + { // // Transition driver from Untrusted to Scheduled state. // @@ -399,26 +377,8 @@ CoreTrust ( return EFI_SUCCESS; } } - return EFI_NOT_FOUND; -} - - -/** - An empty function to pass error checking of CreateEventEx (). - - @param Event Event whose notification function is being invoked. - @param Context Pointer to the notification function's context, - which is implementation-dependent. -**/ -VOID -EFIAPI -CoreEmptyCallbackFunction ( - IN EFI_EVENT Event, - IN VOID *Context - ) -{ - return; + return EFI_NOT_FOUND; } /** @@ -441,13 +401,14 @@ CoreDispatcher ( VOID ) { - EFI_STATUS Status; - EFI_STATUS ReturnStatus; - LIST_ENTRY *Link; - EFI_CORE_DRIVER_ENTRY *DriverEntry; - BOOLEAN ReadyToRun; - EFI_EVENT DxeDispatchEvent; - + EFI_STATUS Status; + EFI_STATUS ReturnStatus; + LIST_ENTRY *Link; + EFI_CORE_DRIVER_ENTRY *DriverEntry; + BOOLEAN ReadyToRun; + EFI_EVENT DxeDispatchEvent; + + PERF_FUNCTION_BEGIN (); if (gDispatcherRunning) { // @@ -461,7 +422,7 @@ CoreDispatcher ( Status = CoreCreateEventEx ( EVT_NOTIFY_SIGNAL, TPL_NOTIFY, - CoreEmptyCallbackFunction, + EfiEventEmptyFunction, NULL, &gEfiEventDxeDispatchGuid, &DxeDispatchEvent @@ -488,16 +449,16 @@ CoreDispatcher ( // Untrused to Scheduled it would have already been loaded so we may need to // skip the LoadImage // - if (DriverEntry->ImageHandle == NULL && !DriverEntry->IsFvImage) { + if ((DriverEntry->ImageHandle == NULL) && !DriverEntry->IsFvImage) { DEBUG ((DEBUG_INFO, "Loading driver %g\n", &DriverEntry->FileName)); Status = CoreLoadImage ( - FALSE, - gDxeCoreImageHandle, - DriverEntry->FvFileDevicePath, - NULL, - 0, - &DriverEntry->ImageHandle - ); + FALSE, + gDxeCoreImageHandle, + DriverEntry->FvFileDevicePath, + NULL, + 0, + &DriverEntry->ImageHandle + ); // // Update the driver state to reflect that it's been loaded @@ -517,7 +478,7 @@ CoreDispatcher ( // // This case include the Never Trusted state if EFI_ACCESS_DENIED is returned // - DriverEntry->Initialized = TRUE; + DriverEntry->Initialized = TRUE; } DriverEntry->Scheduled = FALSE; @@ -534,16 +495,15 @@ CoreDispatcher ( CoreAcquireDispatcherLock (); - DriverEntry->Scheduled = FALSE; - DriverEntry->Initialized = TRUE; + DriverEntry->Scheduled = FALSE; + DriverEntry->Initialized = TRUE; RemoveEntryList (&DriverEntry->ScheduledLink); CoreReleaseDispatcherLock (); - if (DriverEntry->IsFvImage) { // - // Produce a firmware volume block protocol for FvImage so it gets dispatched from. + // Produce a firmware volume block protocol for FvImage so it gets dispatched from. // Status = CoreProcessFvImageFile (DriverEntry->Fv, DriverEntry->FvHandle, &DriverEntry->FileName); } else { @@ -554,9 +514,9 @@ CoreDispatcher ( sizeof (DriverEntry->ImageHandle) ); ASSERT (DriverEntry->ImageHandle != NULL); - + Status = CoreStartImage (DriverEntry->ImageHandle, NULL, NULL); - + REPORT_STATUS_CODE_WITH_EXTENDED_DATA ( EFI_PROGRESS_CODE, (EFI_SOFTWARE_DXE_CORE | EFI_SW_PC_INIT_END), @@ -584,7 +544,7 @@ CoreDispatcher ( for (Link = mDiscoveredList.ForwardLink; Link != &mDiscoveredList; Link = Link->ForwardLink) { DriverEntry = CR (Link, EFI_CORE_DRIVER_ENTRY, Link, EFI_CORE_DRIVER_ENTRY_SIGNATURE); - if (DriverEntry->DepexProtocolError){ + if (DriverEntry->DepexProtocolError) { // // If Section Extraction Protocol did not let the Depex be read before retry the read // @@ -613,10 +573,11 @@ CoreDispatcher ( gDispatcherRunning = FALSE; + PERF_FUNCTION_END (); + return ReturnStatus; } - /** Insert InsertedDriverEntry onto the mScheduledQueue. To do this you must add any driver with a before dependency on InsertedDriverEntry first. @@ -630,18 +591,18 @@ CoreDispatcher ( **/ VOID CoreInsertOnScheduledQueueWhileProcessingBeforeAndAfter ( - IN EFI_CORE_DRIVER_ENTRY *InsertedDriverEntry + IN EFI_CORE_DRIVER_ENTRY *InsertedDriverEntry ) { - LIST_ENTRY *Link; - EFI_CORE_DRIVER_ENTRY *DriverEntry; + LIST_ENTRY *Link; + EFI_CORE_DRIVER_ENTRY *DriverEntry; // // Process Before Dependency // for (Link = mDiscoveredList.ForwardLink; Link != &mDiscoveredList; Link = Link->ForwardLink) { - DriverEntry = CR(Link, EFI_CORE_DRIVER_ENTRY, Link, EFI_CORE_DRIVER_ENTRY_SIGNATURE); - if (DriverEntry->Before && DriverEntry->Dependent && DriverEntry != InsertedDriverEntry) { + DriverEntry = CR (Link, EFI_CORE_DRIVER_ENTRY, Link, EFI_CORE_DRIVER_ENTRY_SIGNATURE); + if (DriverEntry->Before && DriverEntry->Dependent && (DriverEntry != InsertedDriverEntry)) { DEBUG ((DEBUG_DISPATCH, "Evaluate DXE DEPEX for FFS(%g)\n", &DriverEntry->FileName)); DEBUG ((DEBUG_DISPATCH, " BEFORE FFS(%g) = ", &DriverEntry->BeforeAfterGuid)); if (CompareGuid (&InsertedDriverEntry->FileName, &DriverEntry->BeforeAfterGuid)) { @@ -671,8 +632,8 @@ CoreInsertOnScheduledQueueWhileProcessingBeforeAndAfter ( // Process After Dependency // for (Link = mDiscoveredList.ForwardLink; Link != &mDiscoveredList; Link = Link->ForwardLink) { - DriverEntry = CR(Link, EFI_CORE_DRIVER_ENTRY, Link, EFI_CORE_DRIVER_ENTRY_SIGNATURE); - if (DriverEntry->After && DriverEntry->Dependent && DriverEntry != InsertedDriverEntry) { + DriverEntry = CR (Link, EFI_CORE_DRIVER_ENTRY, Link, EFI_CORE_DRIVER_ENTRY_SIGNATURE); + if (DriverEntry->After && DriverEntry->Dependent && (DriverEntry != InsertedDriverEntry)) { DEBUG ((DEBUG_DISPATCH, "Evaluate DXE DEPEX for FFS(%g)\n", &DriverEntry->FileName)); DEBUG ((DEBUG_DISPATCH, " AFTER FFS(%g) = ", &DriverEntry->BeforeAfterGuid)); if (CompareGuid (&InsertedDriverEntry->FileName, &DriverEntry->BeforeAfterGuid)) { @@ -688,7 +649,6 @@ CoreInsertOnScheduledQueueWhileProcessingBeforeAndAfter ( } } - /** Return TRUE if the Fv has been processed, FALSE if not. @@ -700,57 +660,59 @@ CoreInsertOnScheduledQueueWhileProcessingBeforeAndAfter ( **/ BOOLEAN FvHasBeenProcessed ( - IN EFI_HANDLE FvHandle + IN EFI_HANDLE FvHandle ) { - LIST_ENTRY *Link; - KNOWN_HANDLE *KnownHandle; + LIST_ENTRY *Link; + KNOWN_HANDLE *KnownHandle; for (Link = mFvHandleList.ForwardLink; Link != &mFvHandleList; Link = Link->ForwardLink) { - KnownHandle = CR(Link, KNOWN_HANDLE, Link, KNOWN_HANDLE_SIGNATURE); + KnownHandle = CR (Link, KNOWN_HANDLE, Link, KNOWN_HANDLE_SIGNATURE); if (KnownHandle->Handle == FvHandle) { return TRUE; } } + return FALSE; } - /** Remember that Fv protocol on FvHandle has had it's drivers placed on the - mDiscoveredList. This fucntion adds entries on the mFvHandleList if new + mDiscoveredList. This fucntion adds entries on the mFvHandleList if new entry is different from one in mFvHandleList by checking FvImage Guid. Items are never removed/freed from the mFvHandleList. @param FvHandle The handle of a FV that has been processed @return A point to new added FvHandle entry. If FvHandle with the same FvImage guid - has been added, NULL will return. + has been added, NULL will return. **/ -KNOWN_HANDLE * -FvIsBeingProcesssed ( - IN EFI_HANDLE FvHandle +KNOWN_HANDLE * +FvIsBeingProcessed ( + IN EFI_HANDLE FvHandle ) { - EFI_STATUS Status; - EFI_GUID FvNameGuid; - BOOLEAN FvNameGuidIsFound; - UINT32 ExtHeaderOffset; - EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *Fvb; - EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader; - EFI_FV_BLOCK_MAP_ENTRY *BlockMap; - UINTN LbaOffset; - UINTN Index; - EFI_LBA LbaIndex; - LIST_ENTRY *Link; - KNOWN_HANDLE *KnownHandle; + EFI_STATUS Status; + EFI_GUID FvNameGuid; + BOOLEAN FvNameGuidIsFound; + UINT32 ExtHeaderOffset; + EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *Fvb; + EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader; + EFI_FV_BLOCK_MAP_ENTRY *BlockMap; + UINTN LbaOffset; + UINTN Index; + EFI_LBA LbaIndex; + LIST_ENTRY *Link; + KNOWN_HANDLE *KnownHandle; + + FwVolHeader = NULL; // // Get the FirmwareVolumeBlock protocol on that handle // FvNameGuidIsFound = FALSE; - Status = CoreHandleProtocol (FvHandle, &gEfiFirmwareVolumeBlockProtocolGuid, (VOID **)&Fvb); + Status = CoreHandleProtocol (FvHandle, &gEfiFirmwareVolumeBlockProtocolGuid, (VOID **)&Fvb); if (!EFI_ERROR (Status)) { // // Get the full FV header based on FVB protocol. @@ -759,19 +721,20 @@ FvIsBeingProcesssed ( Status = GetFwVolHeader (Fvb, &FwVolHeader); if (!EFI_ERROR (Status)) { ASSERT (FwVolHeader != NULL); - if (VerifyFvHeaderChecksum (FwVolHeader) && FwVolHeader->ExtHeaderOffset != 0) { - ExtHeaderOffset = (UINT32) FwVolHeader->ExtHeaderOffset; - BlockMap = FwVolHeader->BlockMap; - LbaIndex = 0; - LbaOffset = 0; + if (VerifyFvHeaderChecksum (FwVolHeader) && (FwVolHeader->ExtHeaderOffset != 0)) { + ExtHeaderOffset = (UINT32)FwVolHeader->ExtHeaderOffset; + BlockMap = FwVolHeader->BlockMap; + LbaIndex = 0; + LbaOffset = 0; // // Find LbaIndex and LbaOffset for FV extension header based on BlockMap. // while ((BlockMap->NumBlocks != 0) || (BlockMap->Length != 0)) { - for (Index = 0; Index < BlockMap->NumBlocks && ExtHeaderOffset >= BlockMap->Length; Index ++) { + for (Index = 0; Index < BlockMap->NumBlocks && ExtHeaderOffset >= BlockMap->Length; Index++) { ExtHeaderOffset -= BlockMap->Length; - LbaIndex ++; + LbaIndex++; } + // // Check whether FvExtHeader is crossing the multi block range. // @@ -779,16 +742,19 @@ FvIsBeingProcesssed ( LbaOffset = ExtHeaderOffset; break; } + BlockMap++; } + // // Read FvNameGuid from FV extension header. // - Status = ReadFvbData (Fvb, &LbaIndex, &LbaOffset, sizeof (FvNameGuid), (UINT8 *) &FvNameGuid); + Status = ReadFvbData (Fvb, &LbaIndex, &LbaOffset, sizeof (FvNameGuid), (UINT8 *)&FvNameGuid); if (!EFI_ERROR (Status)) { FvNameGuidIsFound = TRUE; } } + CoreFreePool (FwVolHeader); } } @@ -798,9 +764,9 @@ FvIsBeingProcesssed ( // Check whether the FV image with the found FvNameGuid has been processed. // for (Link = mFvHandleList.ForwardLink; Link != &mFvHandleList; Link = Link->ForwardLink) { - KnownHandle = CR(Link, KNOWN_HANDLE, Link, KNOWN_HANDLE_SIGNATURE); + KnownHandle = CR (Link, KNOWN_HANDLE, Link, KNOWN_HANDLE_SIGNATURE); if (CompareGuid (&FvNameGuid, &KnownHandle->FvNameGuid)) { - DEBUG ((EFI_D_ERROR, "FvImage on FvHandle %p and %p has the same FvNameGuid %g.\n", FvHandle, KnownHandle->Handle, FvNameGuid)); + DEBUG ((DEBUG_ERROR, "FvImage on FvHandle %p and %p has the same FvNameGuid %g.\n", FvHandle, KnownHandle->Handle, &FvNameGuid)); return NULL; } } @@ -810,17 +776,15 @@ FvIsBeingProcesssed ( ASSERT (KnownHandle != NULL); KnownHandle->Signature = KNOWN_HANDLE_SIGNATURE; - KnownHandle->Handle = FvHandle; + KnownHandle->Handle = FvHandle; if (FvNameGuidIsFound) { CopyGuid (&KnownHandle->FvNameGuid, &FvNameGuid); } + InsertTailList (&mFvHandleList, &KnownHandle->Link); return KnownHandle; } - - - /** Convert FvHandle and DriverName into an EFI device path @@ -836,14 +800,14 @@ FvIsBeingProcesssed ( **/ EFI_DEVICE_PATH_PROTOCOL * CoreFvToDevicePath ( - IN EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv, - IN EFI_HANDLE FvHandle, - IN EFI_GUID *DriverName + IN EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv, + IN EFI_HANDLE FvHandle, + IN EFI_GUID *DriverName ) { - EFI_STATUS Status; - EFI_DEVICE_PATH_PROTOCOL *FvDevicePath; - EFI_DEVICE_PATH_PROTOCOL *FileNameDevicePath; + EFI_STATUS Status; + EFI_DEVICE_PATH_PROTOCOL *FvDevicePath; + EFI_DEVICE_PATH_PROTOCOL *FileNameDevicePath; // // Remember the device path of the FV @@ -859,16 +823,14 @@ CoreFvToDevicePath ( SetDevicePathEndNode (&mFvDevicePath.End); FileNameDevicePath = AppendDevicePath ( - FvDevicePath, - (EFI_DEVICE_PATH_PROTOCOL *)&mFvDevicePath - ); + FvDevicePath, + (EFI_DEVICE_PATH_PROTOCOL *)&mFvDevicePath + ); } return FileNameDevicePath; } - - /** Add an entry to the mDiscoveredList. Allocate memory to store the DriverEntry, and initilize any state variables. Read the Depex from the FV and store it @@ -892,14 +854,13 @@ CoreFvToDevicePath ( **/ EFI_STATUS CoreAddToDriverList ( - IN EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv, - IN EFI_HANDLE FvHandle, - IN EFI_GUID *DriverName, - IN EFI_FV_FILETYPE Type + IN EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv, + IN EFI_HANDLE FvHandle, + IN EFI_GUID *DriverName, + IN EFI_FV_FILETYPE Type ) { - EFI_CORE_DRIVER_ENTRY *DriverEntry; - + EFI_CORE_DRIVER_ENTRY *DriverEntry; // // Create the Driver Entry for the list. ZeroPool initializes lots of variables to @@ -911,7 +872,7 @@ CoreAddToDriverList ( DriverEntry->IsFvImage = TRUE; } - DriverEntry->Signature = EFI_CORE_DRIVER_ENTRY_SIGNATURE; + DriverEntry->Signature = EFI_CORE_DRIVER_ENTRY_SIGNATURE; CopyGuid (&DriverEntry->FileName, DriverName); DriverEntry->FvHandle = FvHandle; DriverEntry->Fv = Fv; @@ -928,7 +889,6 @@ CoreAddToDriverList ( return EFI_SUCCESS; } - /** Check if a FV Image type file (EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE) is described by a EFI_HOB_FIRMWARE_VOLUME2 Hob. @@ -943,11 +903,11 @@ CoreAddToDriverList ( **/ BOOLEAN FvFoundInHobFv2 ( - IN CONST EFI_GUID *FvNameGuid, - IN CONST EFI_GUID *DriverName + IN CONST EFI_GUID *FvNameGuid, + IN CONST EFI_GUID *DriverName ) { - EFI_PEI_HOB_POINTERS HobFv2; + EFI_PEI_HOB_POINTERS HobFv2; HobFv2.Raw = GetHobList (); @@ -956,121 +916,267 @@ FvFoundInHobFv2 ( // Compare parent FvNameGuid and FileGuid both. // if (CompareGuid (DriverName, &HobFv2.FirmwareVolume2->FileName) && - CompareGuid (FvNameGuid, &HobFv2.FirmwareVolume2->FvName)) { + CompareGuid (FvNameGuid, &HobFv2.FirmwareVolume2->FvName)) + { return TRUE; } + HobFv2.Raw = GET_NEXT_HOB (HobFv2); } return FALSE; } +/** + Find USED_SIZE FV_EXT_TYPE entry in FV extension header and get the FV used size. + + @param[in] FvHeader Pointer to FV header. + @param[out] FvUsedSize Pointer to FV used size returned, + only valid if USED_SIZE FV_EXT_TYPE entry is found. + @param[out] EraseByte Pointer to erase byte returned, + only valid if USED_SIZE FV_EXT_TYPE entry is found. + + @retval TRUE USED_SIZE FV_EXT_TYPE entry is found, + FV used size and erase byte are returned. + @retval FALSE No USED_SIZE FV_EXT_TYPE entry found. +**/ +BOOLEAN +GetFvUsedSize ( + IN EFI_FIRMWARE_VOLUME_HEADER *FvHeader, + OUT UINT32 *FvUsedSize, + OUT UINT8 *EraseByte + ) +{ + UINT16 ExtHeaderOffset; + EFI_FIRMWARE_VOLUME_EXT_HEADER *ExtHeader; + EFI_FIRMWARE_VOLUME_EXT_ENTRY *ExtEntryList; + EFI_FIRMWARE_VOLUME_EXT_ENTRY_USED_SIZE_TYPE *ExtEntryUsedSize; + + ExtHeaderOffset = ReadUnaligned16 (&FvHeader->ExtHeaderOffset); + if (ExtHeaderOffset != 0) { + ExtHeader = (EFI_FIRMWARE_VOLUME_EXT_HEADER *)((UINT8 *)FvHeader + ExtHeaderOffset); + ExtEntryList = (EFI_FIRMWARE_VOLUME_EXT_ENTRY *)(ExtHeader + 1); + while ((UINTN)ExtEntryList < ((UINTN)ExtHeader + ReadUnaligned32 (&ExtHeader->ExtHeaderSize))) { + if (ReadUnaligned16 (&ExtEntryList->ExtEntryType) == EFI_FV_EXT_TYPE_USED_SIZE_TYPE) { + // + // USED_SIZE FV_EXT_TYPE entry is found. + // + ExtEntryUsedSize = (EFI_FIRMWARE_VOLUME_EXT_ENTRY_USED_SIZE_TYPE *)ExtEntryList; + *FvUsedSize = ReadUnaligned32 (&ExtEntryUsedSize->UsedSize); + if ((ReadUnaligned32 (&FvHeader->Attributes) & EFI_FVB2_ERASE_POLARITY) != 0) { + *EraseByte = 0xFF; + } else { + *EraseByte = 0; + } + + DEBUG (( + DEBUG_INFO, + "FV at 0x%x has 0x%x used size, and erase byte is 0x%02x\n", + FvHeader, + *FvUsedSize, + *EraseByte + )); + return TRUE; + } + + ExtEntryList = (EFI_FIRMWARE_VOLUME_EXT_ENTRY *) + ((UINT8 *)ExtEntryList + ReadUnaligned16 (&ExtEntryList->ExtEntrySize)); + } + } + + // + // No USED_SIZE FV_EXT_TYPE entry found. + // + return FALSE; +} /** - Get the driver from the FV through driver name, and produce a FVB protocol on FvHandle. + Get Fv image(s) from the FV through file name, and produce FVB protocol for every Fv image(s). @param Fv The FIRMWARE_VOLUME protocol installed on the FV. @param FvHandle The handle which FVB protocol installed on. - @param DriverName The driver guid specified. + @param FileName The file name guid specified. @retval EFI_OUT_OF_RESOURCES No enough memory or other resource. - @retval EFI_VOLUME_CORRUPTED Corrupted volume. @retval EFI_SUCCESS Function successfully returned. **/ EFI_STATUS CoreProcessFvImageFile ( - IN EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv, - IN EFI_HANDLE FvHandle, - IN EFI_GUID *DriverName + IN EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv, + IN EFI_HANDLE FvHandle, + IN EFI_GUID *FileName ) { - EFI_STATUS Status; - EFI_SECTION_TYPE SectionType; - UINT32 AuthenticationStatus; - VOID *Buffer; - VOID *AlignedBuffer; - UINTN BufferSize; - EFI_FIRMWARE_VOLUME_HEADER *FvHeader; - UINT32 FvAlignment; + EFI_STATUS Status; + EFI_SECTION_TYPE SectionType; + UINT32 AuthenticationStatus; + VOID *Buffer; + VOID *AlignedBuffer; + UINTN BufferSize; + EFI_FIRMWARE_VOLUME_HEADER *FvHeader; + UINT32 FvAlignment; + EFI_DEVICE_PATH_PROTOCOL *FvFileDevicePath; + UINT32 FvUsedSize; + UINT8 EraseByte; + UINTN Index; // - // Read the first (and only the first) firmware volume section + // Read firmware volume section(s) // - SectionType = EFI_SECTION_FIRMWARE_VOLUME_IMAGE; - FvHeader = NULL; - FvAlignment = 0; - Buffer = NULL; - BufferSize = 0; - AlignedBuffer = NULL; - Status = Fv->ReadSection ( - Fv, - DriverName, - SectionType, - 0, - &Buffer, - &BufferSize, - &AuthenticationStatus - ); - if (!EFI_ERROR (Status)) { - // - // FvImage should be at its required alignment. - // - FvHeader = (EFI_FIRMWARE_VOLUME_HEADER *) Buffer; - // - // Get FvHeader alignment - // - FvAlignment = 1 << ((FvHeader->Attributes & EFI_FVB2_ALIGNMENT) >> 16); - // - // FvAlignment must be greater than or equal to 8 bytes of the minimum FFS alignment value. - // - if (FvAlignment < 8) { - FvAlignment = 8; - } - // - // Allocate the aligned buffer for the FvImage. - // - AlignedBuffer = AllocateAlignedPages (EFI_SIZE_TO_PAGES (BufferSize), (UINTN) FvAlignment); - if (AlignedBuffer == NULL) { - Status = EFI_OUT_OF_RESOURCES; - } else { + SectionType = EFI_SECTION_FIRMWARE_VOLUME_IMAGE; + + Index = 0; + do { + FvHeader = NULL; + FvAlignment = 0; + Buffer = NULL; + BufferSize = 0; + AlignedBuffer = NULL; + Status = Fv->ReadSection ( + Fv, + FileName, + SectionType, + Index, + &Buffer, + &BufferSize, + &AuthenticationStatus + ); + if (!EFI_ERROR (Status)) { + // + // Evaluate the authentication status of the Firmware Volume through + // Security Architectural Protocol + // + if (gSecurity != NULL) { + FvFileDevicePath = CoreFvToDevicePath (Fv, FvHandle, FileName); + Status = gSecurity->FileAuthenticationState ( + gSecurity, + AuthenticationStatus, + FvFileDevicePath + ); + if (FvFileDevicePath != NULL) { + FreePool (FvFileDevicePath); + } + + if (Status != EFI_SUCCESS) { + // + // Security check failed. The firmware volume should not be used for any purpose. + // + if (Buffer != NULL) { + FreePool (Buffer); + } + + break; + } + } + + // + // FvImage should be at its required alignment. + // + FvHeader = (EFI_FIRMWARE_VOLUME_HEADER *)Buffer; // - // Move FvImage into the aligned buffer and release the original buffer. + // If EFI_FVB2_WEAK_ALIGNMENT is set in the volume header then the first byte of the volume + // can be aligned on any power-of-two boundary. A weakly aligned volume can not be moved from + // its initial linked location and maintain its alignment. // - CopyMem (AlignedBuffer, Buffer, BufferSize); - CoreFreePool (Buffer); - Buffer = NULL; + if ((ReadUnaligned32 (&FvHeader->Attributes) & EFI_FVB2_WEAK_ALIGNMENT) != EFI_FVB2_WEAK_ALIGNMENT) { + // + // Get FvHeader alignment + // + FvAlignment = 1 << ((ReadUnaligned32 (&FvHeader->Attributes) & EFI_FVB2_ALIGNMENT) >> 16); + // + // FvAlignment must be greater than or equal to 8 bytes of the minimum FFS alignment value. + // + if (FvAlignment < 8) { + FvAlignment = 8; + } + + DEBUG (( + DEBUG_INFO, + "%a() FV at 0x%x, FvAlignment required is 0x%x\n", + __FUNCTION__, + FvHeader, + FvAlignment + )); + + // + // Check FvImage alignment. + // + if ((UINTN)FvHeader % FvAlignment != 0) { + // + // Allocate the aligned buffer for the FvImage. + // + AlignedBuffer = AllocateAlignedPages (EFI_SIZE_TO_PAGES (BufferSize), (UINTN)FvAlignment); + if (AlignedBuffer == NULL) { + FreePool (Buffer); + Status = EFI_OUT_OF_RESOURCES; + break; + } else { + // + // Move FvImage into the aligned buffer and release the original buffer. + // + if (GetFvUsedSize (FvHeader, &FvUsedSize, &EraseByte)) { + // + // Copy the used bytes and fill the rest with the erase value. + // + CopyMem (AlignedBuffer, FvHeader, (UINTN)FvUsedSize); + SetMem ( + (UINT8 *)AlignedBuffer + FvUsedSize, + (UINTN)(BufferSize - FvUsedSize), + EraseByte + ); + } else { + CopyMem (AlignedBuffer, Buffer, BufferSize); + } + + FvHeader = (EFI_FIRMWARE_VOLUME_HEADER *)AlignedBuffer; + FreePool (Buffer); + Buffer = NULL; + } + } + } + // // Produce a FVB protocol for the file // Status = ProduceFVBProtocolOnBuffer ( - (EFI_PHYSICAL_ADDRESS) (UINTN) AlignedBuffer, - (UINT64)BufferSize, - FvHandle, - AuthenticationStatus, - NULL - ); + (EFI_PHYSICAL_ADDRESS)(UINTN)FvHeader, + (UINT64)BufferSize, + FvHandle, + AuthenticationStatus, + NULL + ); } - } - if (EFI_ERROR (Status)) { - // - // ReadSection or Produce FVB failed, Free data buffer - // - if (Buffer != NULL) { - FreePool (Buffer); - } + if (EFI_ERROR (Status)) { + // + // ReadSection or Produce FVB failed, Free data buffer + // + if (Buffer != NULL) { + FreePool (Buffer); + } - if (AlignedBuffer != NULL) { - FreeAlignedPages (AlignedBuffer, EFI_SIZE_TO_PAGES (BufferSize)); + if (AlignedBuffer != NULL) { + FreeAlignedPages (AlignedBuffer, EFI_SIZE_TO_PAGES (BufferSize)); + } + + break; + } else { + Index++; } - } + } while (TRUE); - return Status; + if (Index > 0) { + // + // At least one FvImage has been processed successfully. + // + return EFI_SUCCESS; + } else { + return Status; + } } - /** Event notification that is fired every time a FV dispatch protocol is added. More than one protocol may have been added when this event is fired, so you @@ -1091,41 +1197,42 @@ CoreProcessFvImageFile ( VOID EFIAPI CoreFwVolEventProtocolNotify ( - IN EFI_EVENT Event, - IN VOID *Context + IN EFI_EVENT Event, + IN VOID *Context ) { - EFI_STATUS Status; - EFI_STATUS GetNextFileStatus; - EFI_STATUS SecurityStatus; - EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv; - EFI_DEVICE_PATH_PROTOCOL *FvDevicePath; - EFI_HANDLE FvHandle; - UINTN BufferSize; - EFI_GUID NameGuid; - UINTN Key; - EFI_FV_FILETYPE Type; - EFI_FV_FILE_ATTRIBUTES Attributes; - UINTN Size; - EFI_CORE_DRIVER_ENTRY *DriverEntry; - EFI_GUID *AprioriFile; - UINTN AprioriEntryCount; - UINTN Index; - LIST_ENTRY *Link; - UINT32 AuthenticationStatus; - UINTN SizeOfBuffer; - VOID *DepexBuffer; - KNOWN_HANDLE *KnownHandle; + EFI_STATUS Status; + EFI_STATUS GetNextFileStatus; + EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv; + EFI_DEVICE_PATH_PROTOCOL *FvDevicePath; + EFI_HANDLE FvHandle; + UINTN BufferSize; + EFI_GUID NameGuid; + UINTN Key; + EFI_FV_FILETYPE Type; + EFI_FV_FILE_ATTRIBUTES Attributes; + UINTN Size; + EFI_CORE_DRIVER_ENTRY *DriverEntry; + EFI_GUID *AprioriFile; + UINTN AprioriEntryCount; + UINTN Index; + LIST_ENTRY *Link; + UINT32 AuthenticationStatus; + UINTN SizeOfBuffer; + VOID *DepexBuffer; + KNOWN_HANDLE *KnownHandle; + + FvHandle = NULL; while (TRUE) { BufferSize = sizeof (EFI_HANDLE); - Status = CoreLocateHandle ( - ByRegisterNotify, - NULL, - mFwVolEventRegistration, - &BufferSize, - &FvHandle - ); + Status = CoreLocateHandle ( + ByRegisterNotify, + NULL, + mFwVolEventRegistration, + &BufferSize, + &FvHandle + ); if (EFI_ERROR (Status)) { // // If no more notification events exit @@ -1143,17 +1250,17 @@ CoreFwVolEventProtocolNotify ( // // Since we are about to process this Fv mark it as processed. // - KnownHandle = FvIsBeingProcesssed (FvHandle); + KnownHandle = FvIsBeingProcessed (FvHandle); if (KnownHandle == NULL) { // - // The FV with the same FV name guid has already been processed. + // The FV with the same FV name guid has already been processed. // So lets skip it! // continue; } Status = CoreHandleProtocol (FvHandle, &gEfiFirmwareVolume2ProtocolGuid, (VOID **)&Fv); - if (EFI_ERROR (Status) || Fv == NULL) { + if (EFI_ERROR (Status) || (Fv == NULL)) { // // FvHandle must have Firmware Volume2 protocol thus we should never get here. // @@ -1169,24 +1276,6 @@ CoreFwVolEventProtocolNotify ( continue; } - // - // Evaluate the authentication status of the Firmware Volume through - // Security Architectural Protocol - // - if (gSecurity != NULL) { - SecurityStatus = gSecurity->FileAuthenticationState ( - gSecurity, - 0, - FvDevicePath - ); - if (SecurityStatus != EFI_SUCCESS) { - // - // Security check failed. The firmware volume should not be used for any purpose. - // - continue; - } - } - // // Discover Drivers in FV and add them to the Discovered Driver List. // Process EFI_FV_FILETYPE_DRIVER type and then EFI_FV_FILETYPE_COMBINED_PEIM_DRIVER @@ -1199,7 +1288,7 @@ CoreFwVolEventProtocolNotify ( // Key = 0; do { - Type = mDxeFileTypes[Index]; + Type = mDxeFileTypes[Index]; GetNextFileStatus = Fv->GetNextFile ( Fv, &Key, @@ -1237,50 +1326,27 @@ CoreFwVolEventProtocolNotify ( continue; } - // - // Check if this EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE file has PEI depex section. - // - DepexBuffer = NULL; - SizeOfBuffer = 0; - Status = Fv->ReadSection ( - Fv, - &NameGuid, - EFI_SECTION_PEI_DEPEX, - 0, - &DepexBuffer, - &SizeOfBuffer, - &AuthenticationStatus - ); - if (!EFI_ERROR (Status)) { - // - // If PEI depex section is found, this FV image will be ignored in DXE phase. - // Now, DxeCore doesn't support FV image with more one type DEPEX section. - // - FreePool (DepexBuffer); - continue; - } - // // Check if this EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE file has SMM depex section. // DepexBuffer = NULL; SizeOfBuffer = 0; - Status = Fv->ReadSection ( - Fv, - &NameGuid, - EFI_SECTION_SMM_DEPEX, - 0, - &DepexBuffer, - &SizeOfBuffer, - &AuthenticationStatus - ); + Status = Fv->ReadSection ( + Fv, + &NameGuid, + EFI_SECTION_SMM_DEPEX, + 0, + &DepexBuffer, + &SizeOfBuffer, + &AuthenticationStatus + ); if (!EFI_ERROR (Status)) { // - // If SMM depex section is found, this FV image will be ignored in DXE phase. - // Now, DxeCore doesn't support FV image with more one type DEPEX section. + // If SMM depex section is found, this FV image is invalid to be supported. + // ASSERT FALSE to report this FV image. // FreePool (DepexBuffer); - continue; + ASSERT (FALSE); } // @@ -1288,18 +1354,18 @@ CoreFwVolEventProtocolNotify ( // DepexBuffer = NULL; SizeOfBuffer = 0; - Status = Fv->ReadSection ( - Fv, - &NameGuid, - EFI_SECTION_DXE_DEPEX, - 0, - &DepexBuffer, - &SizeOfBuffer, - &AuthenticationStatus - ); + Status = Fv->ReadSection ( + Fv, + &NameGuid, + EFI_SECTION_DXE_DEPEX, + 0, + &DepexBuffer, + &SizeOfBuffer, + &AuthenticationStatus + ); if (EFI_ERROR (Status)) { // - // If no depex section, produce a firmware volume block protocol for it so it gets dispatched from. + // If no depex section, produce a firmware volume block protocol for it so it gets dispatched from. // CoreProcessFvImageFile (Fv, FvHandle, &NameGuid); } else { @@ -1323,15 +1389,15 @@ CoreFwVolEventProtocolNotify ( // Read the array of GUIDs from the Apriori file if it is present in the firmware volume // AprioriFile = NULL; - Status = Fv->ReadSection ( - Fv, - &gAprioriGuid, - EFI_SECTION_RAW, - 0, - (VOID **)&AprioriFile, - &SizeOfBuffer, - &AuthenticationStatus - ); + Status = Fv->ReadSection ( + Fv, + &gAprioriGuid, + EFI_SECTION_RAW, + 0, + (VOID **)&AprioriFile, + &SizeOfBuffer, + &AuthenticationStatus + ); if (!EFI_ERROR (Status)) { AprioriEntryCount = SizeOfBuffer / sizeof (EFI_GUID); } else { @@ -1346,9 +1412,10 @@ CoreFwVolEventProtocolNotify ( for (Index = 0; Index < AprioriEntryCount; Index++) { for (Link = mDiscoveredList.ForwardLink; Link != &mDiscoveredList; Link = Link->ForwardLink) { - DriverEntry = CR(Link, EFI_CORE_DRIVER_ENTRY, Link, EFI_CORE_DRIVER_ENTRY_SIGNATURE); + DriverEntry = CR (Link, EFI_CORE_DRIVER_ENTRY, Link, EFI_CORE_DRIVER_ENTRY_SIGNATURE); if (CompareGuid (&DriverEntry->FileName, &AprioriFile[Index]) && - (FvHandle == DriverEntry->FvHandle)) { + (FvHandle == DriverEntry->FvHandle)) + { CoreAcquireDispatcherLock (); DriverEntry->Dependent = FALSE; DriverEntry->Scheduled = TRUE; @@ -1368,8 +1435,6 @@ CoreFwVolEventProtocolNotify ( } } - - /** Initialize the dispatcher. Initialize the notification function that runs when an FV2 protocol is added to the system. @@ -1380,6 +1445,8 @@ CoreInitializeDispatcher ( VOID ) { + PERF_FUNCTION_BEGIN (); + mFwVolEvent = EfiCreateProtocolNotifyEvent ( &gEfiFirmwareVolume2ProtocolGuid, TPL_CALLBACK, @@ -1387,6 +1454,8 @@ CoreInitializeDispatcher ( NULL, &mFwVolEventRegistration ); + + PERF_FUNCTION_END (); } // @@ -1403,11 +1472,11 @@ CoreDisplayDiscoveredNotDispatched ( VOID ) { - LIST_ENTRY *Link; - EFI_CORE_DRIVER_ENTRY *DriverEntry; + LIST_ENTRY *Link; + EFI_CORE_DRIVER_ENTRY *DriverEntry; - for (Link = mDiscoveredList.ForwardLink;Link !=&mDiscoveredList; Link = Link->ForwardLink) { - DriverEntry = CR(Link, EFI_CORE_DRIVER_ENTRY, Link, EFI_CORE_DRIVER_ENTRY_SIGNATURE); + for (Link = mDiscoveredList.ForwardLink; Link != &mDiscoveredList; Link = Link->ForwardLink) { + DriverEntry = CR (Link, EFI_CORE_DRIVER_ENTRY, Link, EFI_CORE_DRIVER_ENTRY_SIGNATURE); if (DriverEntry->Dependent) { DEBUG ((DEBUG_LOAD, "Driver %g was discovered but not loaded!!\n", &DriverEntry->FileName)); }