REF:https://bugzilla.tianocore.org/show_bug.cgi?id=1650
The reason why boot order changed is that everytime Emulator restarts, the memory mapped address will change. This patch correct the device path to the right one. Signed-off-by: Zhiguang Liu <zhiguang....@intel.com> Cc: Jordan Justen <jordan.l.jus...@intel.com> Cc: Andrew Fish <af...@apple.com> Cc: Ray Ni <ray...@intel.com> --- EmulatorPkg/Library/PlatformBmLib/PlatformBm.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 60 insertions(+), 2 deletions(-) diff --git a/EmulatorPkg/Library/PlatformBmLib/PlatformBm.c b/EmulatorPkg/Library/PlatformBmLib/PlatformBm.c index 191ce58cfb..28329e4f52 100644 --- a/EmulatorPkg/Library/PlatformBmLib/PlatformBm.c +++ b/EmulatorPkg/Library/PlatformBmLib/PlatformBm.c @@ -332,6 +332,63 @@ PlatformBdsRegisterStaticBootOptions ( PrintXY (10, 50, &White, &Black, L"Enter to boot directly."); } +/** + Change the device path of the boot options to the correct one. + and return whether it is the first time to start up emulator since last build. + @param FirstBoot Return 1 if it is the first time to start up emulator since last build. +**/ +VOID +EFIAPI +PlatformBootManagerChangeDevicePath ( + OUT UINTN *FirstBoot + ) +{ + UINTN BootOptionCount; + EFI_BOOT_MANAGER_LOAD_OPTION *BootOptions; + UINTN Index,LastIndex; + UINTN Flag=0; + *FirstBoot=1; + BootOptions = EfiBootManagerGetLoadOptions (&BootOptionCount, LoadOptionTypeBoot); + for (Index = 0; Index < BootOptionCount; Index++) + { + if ((!StrCmp(L"UEFI Enter Setup", BootOptions[Index].Description)) || + (!StrCmp(L"UEFI BootManagerMenuApp", BootOptions[Index].Description)) || + (!StrCmp(L"UEFI Shell", BootOptions[Index].Description))) + { + EFI_DEVICE_PATH_PROTOCOL *mypath; + EFI_DEVICE_PATH_PROTOCOL *mynextnode; + EFI_LOADED_IMAGE_PROTOCOL *LoadedImage; + gBS->HandleProtocol( + gImageHandle, + &gEfiLoadedImageProtocolGuid, + (VOID **)&LoadedImage); + mynextnode = NextDevicePathNode(BootOptions[Index].FilePath); + mypath = DevicePathFromHandle(LoadedImage->DeviceHandle); + while (!IsDevicePathEndType(mynextnode)) + { + mypath = AppendDevicePathNode( + mypath, + mynextnode); + mynextnode = NextDevicePathNode(mynextnode); + } + BootOptions[Index].FilePath = DuplicateDevicePath(mypath); + FreePool(mypath); + EfiBootManagerLoadOptionToVariable(&BootOptions[Index]); + if(!StrCmp(L"UEFI Enter Setup", BootOptions[Index].Description)){ + if (Flag!=0){ + EfiBootManagerDeleteLoadOptionVariable(BootOptions[LastIndex].OptionNumber, LoadOptionTypeBoot); + } + Flag++; + LastIndex=Index; + } + if(!StrCmp(L"UEFI Shell", BootOptions[Index].Description)){ + *FirstBoot=0; + } + + } + } +} + /** Do the platform specific action after the console is connected. @@ -348,7 +405,7 @@ PlatformBootManagerAfterConsole ( VOID ) { - + UINTN FirstBoot=1; // // Go the different platform policy with different boot mode // Notes: this part code can be change with the table policy @@ -374,9 +431,10 @@ PlatformBootManagerAfterConsole ( case BOOT_WITH_DEFAULT_SETTINGS: default: PlatformBdsDiagnostics (IGNORE, TRUE); - PlatformBdsRegisterStaticBootOptions (); + PlatformBootManagerChangeDevicePath(&FirstBoot); PlatformBdsConnectSequence (); EfiBootManagerRefreshAllBootOption (); + PlatformBdsRegisterStaticBootOptions (); break; } } -- 2.21.0.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#39736): https://edk2.groups.io/g/devel/message/39736 Mute This Topic: https://groups.io/mt/31380243/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-