]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootOption.c
MdeModulePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdeModulePkg / Library / BootMaintenanceManagerUiLib / BootOption.c
index 5665d040889ba406d293577fd96573b55087c7d5..53f0ef3d191e1ca68bba958e3b1b8512fe6a825f 100644 (file)
@@ -5,14 +5,8 @@
 \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
@@ -23,6 +17,51 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 ///\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
@@ -248,7 +287,6 @@ BOpt_GetBootOptions (
   UINTN                         Index;\r
   UINT16                        BootString[10];\r
   UINT8                         *LoadOptionFromVar;\r
-  UINT8                         *LoadOption;\r
   UINTN                         BootOptionSize;\r
   BOOLEAN                       BootNextFlag;\r
   UINT16                        *BootOrderList;\r
@@ -265,8 +303,8 @@ BOpt_GetBootOptions (
   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
@@ -283,7 +321,7 @@ BOpt_GetBootOptions (
   if (BootOrderList == NULL) {\r
     return EFI_NOT_FOUND;\r
   }\r
-  \r
+\r
   //\r
   // Get the BootNext from the Var\r
   //\r
@@ -302,7 +340,7 @@ BOpt_GetBootOptions (
     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
@@ -312,14 +350,6 @@ BOpt_GetBootOptions (
       continue;\r
     }\r
 \r
-    LoadOption = AllocateZeroPool (BootOptionSize);\r
-    if (LoadOption == NULL) {\r
-      continue;\r
-    }\r
-\r
-    CopyMem (LoadOption, LoadOptionFromVar, BootOptionSize);\r
-    FreePool (LoadOptionFromVar);\r
-\r
     if (BootNext != NULL) {\r
       BootNextFlag = (BOOLEAN) (*BootNext == BootOrderList[Index]);\r
     } else {\r
@@ -331,8 +361,8 @@ BOpt_GetBootOptions (
 \r
     NewLoadContext                      = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
 \r
-    LoadOptionPtr                       = LoadOption;\r
-    LoadOptionEnd                       = LoadOption + BootOptionSize;\r
+    LoadOptionPtr                       = LoadOptionFromVar;\r
+    LoadOptionEnd                       = LoadOptionFromVar + BootOptionSize;\r
 \r
     NewMenuEntry->OptionNumber          = BootOrderList[Index];\r
     NewLoadContext->Deleted             = FALSE;\r
@@ -341,7 +371,7 @@ BOpt_GetBootOptions (
     //\r
     // Is a Legacy Device?\r
     //\r
-    Ptr = (UINT8 *) LoadOption;\r
+    Ptr = (UINT8 *) LoadOptionFromVar;\r
 \r
     //\r
     // Attribute = *(UINT32 *)Ptr;\r
@@ -379,13 +409,13 @@ BOpt_GetBootOptions (
 \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
@@ -401,7 +431,7 @@ BOpt_GetBootOptions (
       );\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
@@ -423,6 +453,7 @@ BOpt_GetBootOptions (
 \r
     InsertTailList (&BootOptionMenu.Head, &NewMenuEntry->Link);\r
     MenuCount++;\r
+    FreePool (LoadOptionFromVar);\r
   }\r
   EfiBootManagerFreeLoadOptions (BootOption, BootOptionCount);\r
 \r
@@ -433,7 +464,6 @@ BOpt_GetBootOptions (
     FreePool (BootOrderList);\r
   }\r
 \r
-  FreePool(LoadOption);\r
   BootOptionMenu.MenuNumber = MenuCount;\r
   return EFI_SUCCESS;\r
 }\r
@@ -643,7 +673,6 @@ BOpt_GetDriverOptions (
   UINTN           Index;\r
   UINT16          DriverString[12];\r
   UINT8           *LoadOptionFromVar;\r
-  UINT8           *LoadOption;\r
   UINTN           DriverOptionSize;\r
 \r
   UINT16          *DriverOrderList;\r
@@ -668,7 +697,7 @@ BOpt_GetDriverOptions (
   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
@@ -684,13 +713,6 @@ BOpt_GetDriverOptions (
       continue;\r
     }\r
 \r
-    LoadOption = AllocateZeroPool (DriverOptionSize);\r
-    if (LoadOption == NULL) {\r
-      continue;\r
-    }\r
-\r
-    CopyMem (LoadOption, LoadOptionFromVar, DriverOptionSize);\r
-    FreePool (LoadOptionFromVar);\r
 \r
     NewMenuEntry = BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT);\r
     if (NULL == NewMenuEntry) {\r
@@ -698,8 +720,8 @@ BOpt_GetDriverOptions (
     }\r
 \r
     NewLoadContext                      = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
-    LoadOptionPtr                       = LoadOption;\r
-    LoadOptionEnd                       = LoadOption + DriverOptionSize;\r
+    LoadOptionPtr                       = LoadOptionFromVar;\r
+    LoadOptionEnd                       = LoadOptionFromVar + DriverOptionSize;\r
     NewMenuEntry->OptionNumber          = DriverOrderList[Index];\r
     NewLoadContext->Deleted             = FALSE;\r
     NewLoadContext->IsLegacy            = FALSE;\r
@@ -739,7 +761,7 @@ BOpt_GetDriverOptions (
       );\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
@@ -761,42 +783,43 @@ BOpt_GetDriverOptions (
     }\r
 \r
     InsertTailList (&DriverOptionMenu.Head, &NewMenuEntry->Link);\r
+    FreePool (LoadOptionFromVar);\r
 \r
   }\r
 \r
   if (DriverOrderList != NULL) {\r
     FreePool (DriverOrderList);\r
   }\r
-  FreePool(LoadOption);\r
+\r
   DriverOptionMenu.MenuNumber = Index;\r
   return EFI_SUCCESS;\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
@@ -815,34 +838,34 @@ GetBootOrder (
       }\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
@@ -861,8 +884,8 @@ GetDriverOrder (
       }\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
@@ -872,7 +895,8 @@ GetDriverOrder (
   @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
@@ -880,29 +904,37 @@ BootFromFile (
   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
@@ -944,7 +976,8 @@ ReSendForm(
   @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
@@ -961,7 +994,8 @@ CreateBootOptionFromFile (
   @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