mirror of
				https://github.com/acidanthera/audk.git
				synced 2025-10-28 09:43:50 +01:00 
			
		
		
		
	Use EfiEventGroupSignal from UefiLib and remove InternalBdsEmptyCallbackFuntion. REF: https://bugzilla.tianocore.org/show_bug.cgi?id=298 Cc: Maurice Ma <maurice.ma@intel.com> Cc: Prince Agyeman <prince.agyeman@intel.com> Cc: Liming Gao <liming.gao@intel.com> Cc: Michael Kinney <michael.d.kinney@intel.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Star Zeng <star.zeng@intel.com> Reviewed-by: Maurice Ma <maurice.ma@intel.com>
		
			
				
	
	
		
			255 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			255 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   This file include all platform action which can be customized
 | |
|   by IBV/OEM.
 | |
| 
 | |
| Copyright (c) 2015 - 2017, Intel Corporation. All rights reserved.<BR>
 | |
| 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.
 | |
| 
 | |
| **/
 | |
| 
 | |
| #include "PlatformBootManager.h"
 | |
| #include "PlatformConsole.h"
 | |
| 
 | |
| VOID
 | |
| InstallReadyToLock (
 | |
|   VOID
 | |
|   )
 | |
| {
 | |
|   EFI_STATUS                            Status;
 | |
|   EFI_HANDLE                            Handle;
 | |
|   EFI_SMM_ACCESS2_PROTOCOL              *SmmAccess;
 | |
| 
 | |
|   DEBUG((DEBUG_INFO,"InstallReadyToLock  entering......\n"));
 | |
|   //
 | |
|   // Inform the SMM infrastructure that we're entering BDS and may run 3rd party code hereafter
 | |
|   // Since PI1.2.1, we need signal EndOfDxe as ExitPmAuth
 | |
|   //
 | |
|   EfiEventGroupSignal (&gEfiEndOfDxeEventGroupGuid);
 | |
|   DEBUG((DEBUG_INFO,"All EndOfDxe callbacks have returned successfully\n"));
 | |
| 
 | |
|   //
 | |
|   // Install DxeSmmReadyToLock protocol in order to lock SMM
 | |
|   //
 | |
|   Status = gBS->LocateProtocol (&gEfiSmmAccess2ProtocolGuid, NULL, (VOID **) &SmmAccess);
 | |
|   if (!EFI_ERROR (Status)) {
 | |
|     Handle = NULL;
 | |
|     Status = gBS->InstallProtocolInterface (
 | |
|                     &Handle,
 | |
|                     &gEfiDxeSmmReadyToLockProtocolGuid,
 | |
|                     EFI_NATIVE_INTERFACE,
 | |
|                     NULL
 | |
|                     );
 | |
|     ASSERT_EFI_ERROR (Status);
 | |
|   }
 | |
| 
 | |
|   DEBUG((DEBUG_INFO,"InstallReadyToLock  end\n"));
 | |
|   return;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Return the index of the load option in the load option array.
 | |
| 
 | |
|   The function consider two load options are equal when the
 | |
|   OptionType, Attributes, Description, FilePath and OptionalData are equal.
 | |
| 
 | |
|   @param Key    Pointer to the load option to be found.
 | |
|   @param Array  Pointer to the array of load options to be found.
 | |
|   @param Count  Number of entries in the Array.
 | |
| 
 | |
|   @retval -1          Key wasn't found in the Array.
 | |
|   @retval 0 ~ Count-1 The index of the Key in the Array.
 | |
| **/
 | |
| INTN
 | |
| PlatformFindLoadOption (
 | |
|   IN CONST EFI_BOOT_MANAGER_LOAD_OPTION *Key,
 | |
|   IN CONST EFI_BOOT_MANAGER_LOAD_OPTION *Array,
 | |
|   IN UINTN                              Count
 | |
| )
 | |
| {
 | |
|   UINTN                             Index;
 | |
| 
 | |
|   for (Index = 0; Index < Count; Index++) {
 | |
|     if ((Key->OptionType == Array[Index].OptionType) &&
 | |
|         (Key->Attributes == Array[Index].Attributes) &&
 | |
|         (StrCmp (Key->Description, Array[Index].Description) == 0) &&
 | |
|         (CompareMem (Key->FilePath, Array[Index].FilePath, GetDevicePathSize (Key->FilePath)) == 0) &&
 | |
|         (Key->OptionalDataSize == Array[Index].OptionalDataSize) &&
 | |
|         (CompareMem (Key->OptionalData, Array[Index].OptionalData, Key->OptionalDataSize) == 0)) {
 | |
|       return (INTN) Index;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return -1;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Register a boot option using a file GUID in the FV.
 | |
| 
 | |
|   @param FileGuid     The file GUID name in FV.
 | |
|   @param Description  The boot option description.
 | |
|   @param Attributes   The attributes used for the boot option loading.
 | |
| **/
 | |
| VOID
 | |
| PlatformRegisterFvBootOption (
 | |
|   EFI_GUID                         *FileGuid,
 | |
|   CHAR16                           *Description,
 | |
|   UINT32                           Attributes
 | |
| )
 | |
| {
 | |
|   EFI_STATUS                        Status;
 | |
|   UINTN                             OptionIndex;
 | |
|   EFI_BOOT_MANAGER_LOAD_OPTION      NewOption;
 | |
|   EFI_BOOT_MANAGER_LOAD_OPTION      *BootOptions;
 | |
|   UINTN                             BootOptionCount;
 | |
|   MEDIA_FW_VOL_FILEPATH_DEVICE_PATH FileNode;
 | |
|   EFI_LOADED_IMAGE_PROTOCOL         *LoadedImage;
 | |
|   EFI_DEVICE_PATH_PROTOCOL          *DevicePath;
 | |
| 
 | |
|   Status = gBS->HandleProtocol (gImageHandle, &gEfiLoadedImageProtocolGuid, (VOID **) &LoadedImage);
 | |
|   ASSERT_EFI_ERROR (Status);
 | |
| 
 | |
|   EfiInitializeFwVolDevicepathNode (&FileNode, FileGuid);
 | |
|   DevicePath = AppendDevicePathNode (
 | |
|                  DevicePathFromHandle (LoadedImage->DeviceHandle),
 | |
|                  (EFI_DEVICE_PATH_PROTOCOL *) &FileNode
 | |
|                );
 | |
| 
 | |
|   Status = EfiBootManagerInitializeLoadOption (
 | |
|              &NewOption,
 | |
|              LoadOptionNumberUnassigned,
 | |
|              LoadOptionTypeBoot,
 | |
|              Attributes,
 | |
|              Description,
 | |
|              DevicePath,
 | |
|              NULL,
 | |
|              0
 | |
|            );
 | |
|   if (!EFI_ERROR (Status)) {
 | |
|     BootOptions = EfiBootManagerGetLoadOptions (&BootOptionCount, LoadOptionTypeBoot);
 | |
| 
 | |
|     OptionIndex = PlatformFindLoadOption (&NewOption, BootOptions, BootOptionCount);
 | |
| 
 | |
|     if (OptionIndex == -1) {
 | |
|       Status = EfiBootManagerAddLoadOptionVariable (&NewOption, (UINTN) -1);
 | |
|       ASSERT_EFI_ERROR (Status);
 | |
|     }
 | |
|     EfiBootManagerFreeLoadOption (&NewOption);
 | |
|     EfiBootManagerFreeLoadOptions (BootOptions, BootOptionCount);
 | |
|   }
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Do the platform specific action before the console is connected.
 | |
| 
 | |
|   Such as:
 | |
|     Update console variable;
 | |
|     Register new Driver#### or Boot####;
 | |
|     Signal ReadyToLock event.
 | |
| **/
 | |
| VOID
 | |
| EFIAPI
 | |
| PlatformBootManagerBeforeConsole (
 | |
|   VOID
 | |
| )
 | |
| {
 | |
|   EFI_INPUT_KEY                Enter;
 | |
|   EFI_INPUT_KEY                F2;
 | |
|   EFI_INPUT_KEY                Down;
 | |
|   EFI_BOOT_MANAGER_LOAD_OPTION BootOption;
 | |
| 
 | |
|   PlatformConsoleInit ();
 | |
| 
 | |
|   //
 | |
|   // Register ENTER as CONTINUE key
 | |
|   //
 | |
|   Enter.ScanCode    = SCAN_NULL;
 | |
|   Enter.UnicodeChar = CHAR_CARRIAGE_RETURN;
 | |
|   EfiBootManagerRegisterContinueKeyOption (0, &Enter, NULL);
 | |
| 
 | |
|   //
 | |
|   // Map F2 to Boot Manager Menu
 | |
|   //
 | |
|   F2.ScanCode    = SCAN_F2;
 | |
|   F2.UnicodeChar = CHAR_NULL;
 | |
|   EfiBootManagerGetBootManagerMenu (&BootOption);
 | |
|   EfiBootManagerAddKeyOptionVariable (NULL, (UINT16) BootOption.OptionNumber, 0, &F2, NULL);
 | |
| 
 | |
|   //
 | |
|   // Also add Down key to Boot Manager Menu since some serial terminals don't support F2 key.
 | |
|   //
 | |
|   Down.ScanCode    = SCAN_DOWN;
 | |
|   Down.UnicodeChar = CHAR_NULL;
 | |
|   EfiBootManagerGetBootManagerMenu (&BootOption);
 | |
|   EfiBootManagerAddKeyOptionVariable (NULL, (UINT16) BootOption.OptionNumber, 0, &Down, NULL);
 | |
| 
 | |
|   //
 | |
|   // Install ready to lock.
 | |
|   // This needs to be done before option rom dispatched.
 | |
|   //
 | |
|   InstallReadyToLock ();
 | |
| 
 | |
|   //
 | |
|   // Dispatch deferred images after EndOfDxe event and ReadyToLock installation.
 | |
|   //
 | |
|   EfiBootManagerDispatchDeferredImages ();
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Do the platform specific action after the console is connected.
 | |
| 
 | |
|   Such as:
 | |
|     Dynamically switch output mode;
 | |
|     Signal console ready platform customized event;
 | |
|     Run diagnostics like memory testing;
 | |
|     Connect certain devices;
 | |
|     Dispatch aditional option roms.
 | |
| **/
 | |
| VOID
 | |
| EFIAPI
 | |
| PlatformBootManagerAfterConsole (
 | |
|   VOID
 | |
| )
 | |
| {
 | |
|   EFI_GRAPHICS_OUTPUT_BLT_PIXEL  Black;
 | |
|   EFI_GRAPHICS_OUTPUT_BLT_PIXEL  White;
 | |
| 
 | |
|   Black.Blue = Black.Green = Black.Red = Black.Reserved = 0;
 | |
|   White.Blue = White.Green = White.Red = White.Reserved = 0xFF;
 | |
| 
 | |
|   EfiBootManagerConnectAll ();
 | |
|   EfiBootManagerRefreshAllBootOption ();
 | |
| 
 | |
|   //
 | |
|   // Register UEFI Shell
 | |
|   //
 | |
|   PlatformRegisterFvBootOption (PcdGetPtr (PcdShellFile), L"UEFI Shell", LOAD_OPTION_ACTIVE);
 | |
|   
 | |
|   Print (
 | |
|     L"\n"
 | |
|     L"F2 or Down      to enter Boot Manager Menu.\n"
 | |
|     L"ENTER           to boot directly.\n"
 | |
|     L"\n"
 | |
|   );
 | |
| 
 | |
| }
 | |
| 
 | |
| /**
 | |
|   This function is called each second during the boot manager waits the timeout.
 | |
| 
 | |
|   @param TimeoutRemain  The remaining timeout.
 | |
| **/
 | |
| VOID
 | |
| EFIAPI
 | |
| PlatformBootManagerWaitCallback (
 | |
|   UINT16          TimeoutRemain
 | |
| )
 | |
| {
 | |
|   return;
 | |
| }
 |