\r
Boot option manipulation\r
\r
-Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
///\r
#define MAX_CHAR 480\r
\r
+/**\r
+\r
+ Check whether a reset is needed, if reset is needed, Popup a menu to notice user.\r
+\r
+**/\r
+VOID\r
+BmmSetupResetReminder (\r
+ VOID\r
+ )\r
+{\r
+ EFI_INPUT_KEY Key;\r
+ CHAR16 *StringBuffer1;\r
+ CHAR16 *StringBuffer2;\r
+ EFI_STATUS Status;\r
+ EDKII_FORM_BROWSER_EXTENSION2_PROTOCOL *FormBrowserEx2;\r
+\r
+ //\r
+ // Use BrowserEx2 protocol to check whether reset is required.\r
+ //\r
+ Status = gBS->LocateProtocol (&gEdkiiFormBrowserEx2ProtocolGuid, NULL, (VOID **) &FormBrowserEx2);\r
+\r
+ //\r
+ //check any reset required change is applied? if yes, reset system\r
+ //\r
+ if (!EFI_ERROR(Status) && FormBrowserEx2->IsResetRequired()) {\r
+ StringBuffer1 = AllocateZeroPool (MAX_CHAR * sizeof (CHAR16));\r
+ ASSERT (StringBuffer1 != NULL);\r
+ StringBuffer2 = AllocateZeroPool (MAX_CHAR * sizeof (CHAR16));\r
+ ASSERT (StringBuffer2 != NULL);\r
+ StrCpyS (StringBuffer1, MAX_CHAR, L"Configuration changed. Reset to apply it Now.");\r
+ StrCpyS (StringBuffer2, MAX_CHAR, L"Press ENTER to reset");\r
+ //\r
+ // Popup a menu to notice user\r
+ //\r
+ do {\r
+ CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, StringBuffer1, StringBuffer2, NULL);\r
+ } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
+\r
+ FreePool (StringBuffer1);\r
+ FreePool (StringBuffer2);\r
+\r
+ gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);\r
+ }\r
+}\r
+\r
/**\r
Create a menu entry by given menu type.\r
\r
UINTN MenuCount;\r
UINT8 *Ptr;\r
EFI_BOOT_MANAGER_LOAD_OPTION *BootOption;\r
- UINTN BootOptionCount; \r
- \r
+ UINTN BootOptionCount;\r
+\r
MenuCount = 0;\r
BootOrderListSize = 0;\r
BootNextSize = 0;\r
if (BootOrderList == NULL) {\r
return EFI_NOT_FOUND;\r
}\r
- \r
+\r
//\r
// Get the BootNext from the Var\r
//\r
if (((BootOption[Index].Attributes & LOAD_OPTION_HIDDEN) != 0) || ((BootOption[Index].Attributes & LOAD_OPTION_ACTIVE) == 0)) {\r
continue;\r
}\r
- \r
+\r
UnicodeSPrint (BootString, sizeof (BootString), L"Boot%04x", BootOrderList[Index]);\r
//\r
// Get all loadoptions from the VAR\r
\r
NewLoadContext->FilePathListLength = *(UINT16 *) LoadOptionPtr;\r
LoadOptionPtr += sizeof (UINT16);\r
- \r
+\r
StringSize = StrSize((UINT16*)LoadOptionPtr);\r
\r
NewLoadContext->Description = AllocateZeroPool (StrSize((UINT16*)LoadOptionPtr));\r
ASSERT (NewLoadContext->Description != NULL);\r
StrCpyS (NewLoadContext->Description, StrSize((UINT16*)LoadOptionPtr) / sizeof (UINT16), (UINT16*)LoadOptionPtr);\r
- \r
+\r
ASSERT (NewLoadContext->Description != NULL);\r
NewMenuEntry->DisplayString = NewLoadContext->Description;\r
NewMenuEntry->DisplayStringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, NewMenuEntry->DisplayString, NULL);\r
);\r
\r
NewMenuEntry->HelpString = UiDevicePathToStr (NewLoadContext->FilePathList);\r
- NewMenuEntry->HelpStringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, NewMenuEntry->HelpString, NULL); \r
+ NewMenuEntry->HelpStringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, NewMenuEntry->HelpString, NULL);\r
\r
LoadOptionPtr += NewLoadContext->FilePathListLength;\r
\r
if (DriverOrderList == NULL) {\r
return EFI_NOT_FOUND;\r
}\r
- \r
+\r
for (Index = 0; Index < DriverOrderListSize / sizeof (UINT16); Index++) {\r
UnicodeSPrint (\r
DriverString,\r
);\r
\r
NewMenuEntry->HelpString = UiDevicePathToStr (NewLoadContext->FilePathList);\r
- NewMenuEntry->HelpStringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, NewMenuEntry->HelpString, NULL); \r
+ NewMenuEntry->HelpStringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, NewMenuEntry->HelpString, NULL);\r
\r
LoadOptionPtr += NewLoadContext->FilePathListLength;\r
\r
}\r
\r
/**\r
- Get option number according to Boot#### and BootOrder variable. \r
+ Get option number according to Boot#### and BootOrder variable.\r
The value is saved as #### + 1.\r
\r
@param CallbackData The BMM context data.\r
**/\r
-VOID \r
+VOID\r
GetBootOrder (\r
IN BMM_CALLBACK_DATA *CallbackData\r
)\r
{\r
BMM_FAKE_NV_DATA *BmmConfig;\r
UINT16 Index;\r
- UINT16 OptionOrderIndex; \r
+ UINT16 OptionOrderIndex;\r
UINTN DeviceType;\r
BM_MENU_ENTRY *NewMenuEntry;\r
- BM_LOAD_CONTEXT *NewLoadContext; \r
+ BM_LOAD_CONTEXT *NewLoadContext;\r
\r
ASSERT (CallbackData != NULL);\r
- \r
- DeviceType = (UINTN) -1; \r
- BmmConfig = &CallbackData->BmmFakeNvData; \r
+\r
+ DeviceType = (UINTN) -1;\r
+ BmmConfig = &CallbackData->BmmFakeNvData;\r
ZeroMem (BmmConfig->BootOptionOrder, sizeof (BmmConfig->BootOptionOrder));\r
- \r
+\r
for (Index = 0, OptionOrderIndex = 0; ((Index < BootOptionMenu.MenuNumber) &&\r
(OptionOrderIndex < (sizeof (BmmConfig->BootOptionOrder) / sizeof (BmmConfig->BootOptionOrder[0]))));\r
Index++) {\r
}\r
}\r
BmmConfig->BootOptionOrder[OptionOrderIndex++] = (UINT32) (NewMenuEntry->OptionNumber + 1);\r
- } \r
+ }\r
}\r
\r
/**\r
Get driver option order from globalc DriverOptionMenu.\r
\r
@param CallbackData The BMM context data.\r
- \r
+\r
**/\r
-VOID \r
+VOID\r
GetDriverOrder (\r
IN BMM_CALLBACK_DATA *CallbackData\r
)\r
{\r
BMM_FAKE_NV_DATA *BmmConfig;\r
UINT16 Index;\r
- UINT16 OptionOrderIndex; \r
+ UINT16 OptionOrderIndex;\r
UINTN DeviceType;\r
BM_MENU_ENTRY *NewMenuEntry;\r
- BM_LOAD_CONTEXT *NewLoadContext; \r
+ BM_LOAD_CONTEXT *NewLoadContext;\r
\r
\r
ASSERT (CallbackData != NULL);\r
- \r
- DeviceType = (UINTN) -1; \r
- BmmConfig = &CallbackData->BmmFakeNvData; \r
+\r
+ DeviceType = (UINTN) -1;\r
+ BmmConfig = &CallbackData->BmmFakeNvData;\r
ZeroMem (BmmConfig->DriverOptionOrder, sizeof (BmmConfig->DriverOptionOrder));\r
- \r
+\r
for (Index = 0, OptionOrderIndex = 0; ((Index < DriverOptionMenu.MenuNumber) &&\r
(OptionOrderIndex < (sizeof (BmmConfig->DriverOptionOrder) / sizeof (BmmConfig->DriverOptionOrder[0]))));\r
Index++) {\r
}\r
}\r
BmmConfig->DriverOptionOrder[OptionOrderIndex++] = (UINT32) (NewMenuEntry->OptionNumber + 1);\r
- } \r
-} \r
+ }\r
+}\r
\r
/**\r
Boot the file specified by the input file path info.\r
@retval TRUE Exit caller function.\r
@retval FALSE Not exit caller function.\r
**/\r
-BOOLEAN \r
+BOOLEAN\r
+EFIAPI\r
BootFromFile (\r
IN EFI_DEVICE_PATH_PROTOCOL *FilePath\r
)\r
EFI_BOOT_MANAGER_LOAD_OPTION BootOption;\r
CHAR16 *FileName;\r
\r
+ FileName = NULL;\r
+\r
FileName = ExtractFileNameFromDevicePath(FilePath);\r
- EfiBootManagerInitializeLoadOption (\r
- &BootOption,\r
- 0,\r
- LoadOptionTypeBoot,\r
- LOAD_OPTION_ACTIVE,\r
- FileName,\r
- FilePath,\r
- NULL,\r
- 0\r
- );\r
- //\r
- // Since current no boot from removable media directly is allowed */\r
- //\r
- gST->ConOut->ClearScreen (gST->ConOut);\r
+ if (FileName != NULL) {\r
+ EfiBootManagerInitializeLoadOption (\r
+ &BootOption,\r
+ 0,\r
+ LoadOptionTypeBoot,\r
+ LOAD_OPTION_ACTIVE,\r
+ FileName,\r
+ FilePath,\r
+ NULL,\r
+ 0\r
+ );\r
+ //\r
+ // Since current no boot from removable media directly is allowed */\r
+ //\r
+ gST->ConOut->ClearScreen (gST->ConOut);\r
+ //\r
+ // Check whether need to reset system.\r
+ //\r
+ BmmSetupResetReminder ();\r
\r
- BmmBdsSetConsoleMode (FALSE);\r
- EfiBootManagerBoot (&BootOption);\r
- BmmBdsSetConsoleMode (TRUE);\r
+ BmmSetConsoleMode (FALSE);\r
+ EfiBootManagerBoot (&BootOption);\r
+ BmmSetConsoleMode (TRUE);\r
\r
- FreePool(FileName);\r
+ FreePool(FileName);\r
\r
- EfiBootManagerFreeLoadOption (&BootOption);\r
+ EfiBootManagerFreeLoadOption (&BootOption);\r
+ }\r
\r
return FALSE;\r
}\r
@retval TRUE Exit caller function.\r
@retval FALSE Not exit caller function.\r
**/\r
-BOOLEAN \r
+BOOLEAN\r
+EFIAPI\r
CreateBootOptionFromFile (\r
IN EFI_DEVICE_PATH_PROTOCOL *FilePath\r
)\r
@retval FALSE Not exit caller function.\r
\r
**/\r
-BOOLEAN \r
+BOOLEAN\r
+EFIAPI\r
CreateDriverOptionFromFile (\r
IN EFI_DEVICE_PATH_PROTOCOL *FilePath\r
)\r