]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenance.c
MdeModulePkg/BootMaintUi: Add error handling codes when AllocatePool fail
[mirror_edk2.git] / MdeModulePkg / Library / BootMaintenanceManagerUiLib / BootMaintenance.c
index 2d52f9bac3929ba2b6c4ec4a9a31b8ab5a081d4c..393091f39a84b40410c2dde06875f87eb3959ae7 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
 The functions for Boot Maintainence Main menu.\r
 \r
-Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>\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
@@ -30,6 +30,8 @@ UINT32    mBmmSetupTextModeRow            = 0;
 UINT32    mBmmSetupHorizontalResolution   = 0;\r
 UINT32    mBmmSetupVerticalResolution     = 0;\r
 \r
+BOOLEAN   mBmmModeInitialized             = FALSE;\r
+\r
 EFI_DEVICE_PATH_PROTOCOL  EndDevicePath[] = {\r
   {\r
     END_DEVICE_PATH_TYPE,\r
@@ -114,8 +116,7 @@ FreeAllMenu (
 \r
 **/\r
 EFI_STATUS\r
-EFIAPI\r
-BmmBdsSetConsoleMode (\r
+BmmSetConsoleMode (\r
   BOOLEAN  IsSetupMode\r
   )\r
 {\r
@@ -378,6 +379,7 @@ ExtractFileNameFromDevicePath (
   String = UiDevicePathToStr(DevicePath);\r
   MatchString = String;\r
   LastMatch   = String;\r
+  FileName    = NULL;\r
 \r
   while(MatchString != NULL){\r
     LastMatch   = MatchString + 1;\r
@@ -386,7 +388,9 @@ ExtractFileNameFromDevicePath (
 \r
   Length = StrLen(LastMatch);\r
   FileName = AllocateCopyPool ((Length + 1) * sizeof(CHAR16), LastMatch);\r
-  *(FileName + Length) = 0;\r
+  if (FileName != NULL) {\r
+    *(FileName + Length) = 0;\r
+  }\r
 \r
   FreePool(String);\r
 \r
@@ -667,8 +671,17 @@ BootMaintRouteConfig (
                     sizeof(UINT16),\r
                     &(NewBmmData->BootTimeOut)\r
                     );\r
-    ASSERT_EFI_ERROR(Status);\r
-\r
+    if (EFI_ERROR (Status)) {\r
+      //\r
+      // If set variable fail, and don't have the appropriate error status for RouteConfig fuction to return,\r
+      // just return the EFI_NOT_FOUND.\r
+      //\r
+      if (Status == EFI_OUT_OF_RESOURCES) {\r
+        return Status;\r
+      } else {\r
+        return EFI_NOT_FOUND;\r
+      }\r
+    }\r
     Private->BmmOldFakeNVData.BootTimeOut = NewBmmData->BootTimeOut;\r
   }\r
 \r
@@ -858,9 +871,6 @@ BootMaintCallback (
   BMM_CALLBACK_DATA *Private;\r
   BM_MENU_ENTRY     *NewMenuEntry;\r
   BMM_FAKE_NV_DATA  *CurrentFakeNVMap;\r
-  UINTN             OldValue;\r
-  UINTN             NewValue;\r
-  UINTN             Number;\r
   UINTN             Index;\r
   EFI_DEVICE_PATH_PROTOCOL * File;\r
 \r
@@ -870,9 +880,6 @@ BootMaintCallback (
     //\r
     return EFI_UNSUPPORTED;\r
   }\r
-  OldValue       = 0;\r
-  NewValue       = 0;\r
-  Number         = 0;\r
 \r
   Private        = BMM_CALLBACK_DATA_FROM_THIS (This);\r
   //\r
@@ -893,12 +900,12 @@ BootMaintCallback (
         switch (QuestionId) {\r
         case FORM_BOOT_ADD_ID:\r
           // Leave BMM and enter FileExplorer. \r
-          ChooseFile( NULL, L".efi", (CHOOSE_HANDLER) CreateBootOptionFromFile, &File);\r
+          ChooseFile (NULL, L".efi", CreateBootOptionFromFile, &File);\r
           break;\r
 \r
         case FORM_DRV_ADD_FILE_ID:\r
           // Leave BMM and enter FileExplorer.\r
-          ChooseFile( NULL, L".efi", (CHOOSE_HANDLER) CreateDriverOptionFromFile, &File);\r
+          ChooseFile (NULL, L".efi", CreateDriverOptionFromFile, &File);\r
           break;\r
 \r
         case FORM_DRV_ADD_HANDLE_ID:\r
@@ -921,16 +928,6 @@ BootMaintCallback (
           UpdateDrvDelPage (Private);\r
           break;\r
 \r
-        case FORM_BOOT_NEXT_ID:\r
-          CleanUpPage (FORM_BOOT_NEXT_ID, Private);\r
-          UpdateBootNextPage (Private);\r
-          break;\r
-\r
-        case FORM_TIME_OUT_ID:\r
-          CleanUpPage (FORM_TIME_OUT_ID, Private);\r
-          UpdateTimeOutPage (Private);\r
-          break;\r
-\r
         case FORM_CON_IN_ID:\r
         case FORM_CON_OUT_ID:\r
         case FORM_CON_ERR_ID:\r
@@ -974,7 +971,7 @@ BootMaintCallback (
     }\r
     if (QuestionId == KEY_VALUE_BOOT_FROM_FILE){\r
       // Leave BMM and enter FileExplorer.\r
-      ChooseFile( NULL, L".efi", (CHOOSE_HANDLER) BootFromFile, &File);\r
+      ChooseFile (NULL, L".efi", BootFromFile, &File);\r
     }\r
   } else if (Action == EFI_BROWSER_ACTION_CHANGED) {\r
     if ((Value == NULL) || (ActionRequest == NULL)) {\r
@@ -1119,42 +1116,20 @@ DiscardChangeHandler (
 }\r
 \r
 /**\r
-  Create dynamic code for BMM.\r
 \r
-  @param  BmmCallbackInfo        The BMM context data.\r
+  Update the menus in the BMM page.\r
 \r
 **/\r
 VOID\r
-InitializeDrivers(\r
-  IN BMM_CALLBACK_DATA        *BmmCallbackInfo\r
+CustomizeMenus (\r
+  VOID\r
   )\r
 {\r
-  EFI_HII_HANDLE              HiiHandle;\r
   VOID                        *StartOpCodeHandle;\r
   VOID                        *EndOpCodeHandle;\r
-  EFI_IFR_GUID_LABEL          *StartLabel;\r
-  EFI_IFR_GUID_LABEL          *EndLabel;\r
-  UINTN                       Index;    \r
-  EFI_STRING                  String;\r
-  EFI_STRING_ID               Token;\r
-  EFI_STRING_ID               TokenHelp;  \r
-  EFI_HII_HANDLE              *HiiHandles;\r
-  EFI_GUID                    FormSetGuid;\r
-  CHAR16                      *DevicePathStr;\r
-  EFI_STRING_ID               DevicePathId;\r
-  EFI_IFR_FORM_SET            *Buffer;      \r
-  UINTN                       BufferSize;   \r
-  UINT8                       ClassGuidNum; \r
-  EFI_GUID                    *ClassGuid;   \r
-  UINTN                       TempSize;\r
-  UINT8                       *Ptr;\r
-  EFI_STATUS                  Status;\r
-\r
-  TempSize =0;\r
-  BufferSize = 0;\r
-  Buffer = NULL;\r
-\r
-  HiiHandle = BmmCallbackInfo->BmmHiiHandle;\r
+  EFI_IFR_GUID_LABEL          *StartGuidLabel;\r
+  EFI_IFR_GUID_LABEL          *EndGuidLabel;\r
+\r
   //\r
   // Allocate space for creation of UpdateData Buffer\r
   //\r
@@ -1163,104 +1138,29 @@ InitializeDrivers(
 \r
   EndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
   ASSERT (EndOpCodeHandle != NULL);\r
-\r
   //\r
   // Create Hii Extend Label OpCode as the start opcode\r
   //\r
-  StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
-  StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
-  StartLabel->Number       = LABEL_BMM_PLATFORM_INFORMATION;\r
-\r
+  StartGuidLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
+  StartGuidLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
+  StartGuidLabel->Number       = LABEL_FORM_MAIN_START;\r
   //\r
   // Create Hii Extend Label OpCode as the end opcode\r
   //\r
-  EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
-  EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
-  EndLabel->Number       = LABEL_END;\r
+  EndGuidLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
+  EndGuidLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
+  EndGuidLabel->Number       = LABEL_FORM_MAIN_END;\r
 \r
   //\r
-  // Get all the Hii handles\r
+  //Updata Front Page form\r
   //\r
-  HiiHandles = HiiGetHiiHandles (NULL);\r
-  ASSERT (HiiHandles != NULL);\r
-\r
-  //\r
-  // Search for formset of each class type\r
-  //\r
-  for (Index = 0; HiiHandles[Index] != NULL; Index++) {\r
-    Status = HiiGetFormSetFromHiiHandle(HiiHandles[Index], &Buffer,&BufferSize);\r
-    if (EFI_ERROR (Status)) {\r
-      continue;\r
-    }\r
-\r
-    Ptr = (UINT8 *)Buffer;\r
-    while(TempSize < BufferSize)  {\r
-      TempSize += ((EFI_IFR_OP_HEADER *) Ptr)->Length;\r
-\r
-      if (((EFI_IFR_OP_HEADER *) Ptr)->Length <= OFFSET_OF (EFI_IFR_FORM_SET, Flags)){\r
-        Ptr += ((EFI_IFR_OP_HEADER *) Ptr)->Length;\r
-        continue;\r
-      }\r
-\r
-      //\r
-      // Find FormSet OpCode\r
-      //\r
-      ClassGuidNum = (UINT8) (((EFI_IFR_FORM_SET *)Ptr)->Flags & 0x3);\r
-      ClassGuid = (EFI_GUID *) (VOID *)(Ptr + sizeof (EFI_IFR_FORM_SET));\r
-      while (ClassGuidNum-- > 0) {\r
-        if (CompareGuid (&gEfiIfrBootMaintenanceGuid, ClassGuid) == 0){\r
-          ClassGuid ++;\r
-          continue;\r
-        }\r
-\r
-        String = HiiGetString (HiiHandles[Index], ((EFI_IFR_FORM_SET *)Ptr)->FormSetTitle, NULL);\r
-        if (String == NULL) {\r
-          String = HiiGetString (HiiHandle, STRING_TOKEN (STR_MISSING_STRING), NULL);\r
-          ASSERT (String != NULL);\r
-        }\r
-        Token = HiiSetString (HiiHandle, 0, String, NULL);\r
-        FreePool (String);\r
-\r
-        String = HiiGetString (HiiHandles[Index], ((EFI_IFR_FORM_SET *)Ptr)->Help, NULL);\r
-        if (String == NULL) {\r
-          String = HiiGetString (HiiHandle, STRING_TOKEN (STR_MISSING_STRING), NULL);\r
-          ASSERT (String != NULL);\r
-        }\r
-        TokenHelp = HiiSetString (HiiHandle, 0, String, NULL);\r
-        FreePool (String);\r
-\r
-        FormSetGuid = ((EFI_IFR_FORM_SET *)Ptr)->Guid;\r
-\r
-        DevicePathStr = BmmExtractDevicePathFromHiiHandle(HiiHandles[Index]);\r
-        DevicePathId  = 0;\r
-        if (DevicePathStr != NULL){\r
-          DevicePathId = HiiSetString (HiiHandle, 0, DevicePathStr, NULL);\r
-          FreePool (DevicePathStr);\r
-        }\r
-         HiiCreateGotoExOpCode (\r
-           StartOpCodeHandle,\r
-           0,\r
-           Token,\r
-           TokenHelp,\r
-           0,\r
-           (EFI_QUESTION_ID) (Index + FRONT_PAGE_KEY_OFFSET),\r
-           0,\r
-           &FormSetGuid,\r
-           DevicePathId\r
-         );\r
-        break;\r
-      }\r
-      Ptr += ((EFI_IFR_OP_HEADER *) Ptr)->Length;\r
-    }\r
+  UiCustomizeBMMPage (\r
+    mBmmCallbackInfo->BmmHiiHandle,\r
+    StartOpCodeHandle\r
+    );\r
 \r
-    FreePool(Buffer);\r
-    Buffer = NULL;\r
-    TempSize = 0;\r
-    BufferSize = 0;\r
-  } \r
-  \r
   HiiUpdateForm (\r
-    HiiHandle,\r
+    mBmmCallbackInfo->BmmHiiHandle,\r
     &mBootMaintGuid,\r
     FORM_MAIN_ID,\r
     StartOpCodeHandle,\r
@@ -1268,8 +1168,7 @@ InitializeDrivers(
     );\r
 \r
   HiiFreeOpCodeHandle (StartOpCodeHandle);\r
-  HiiFreeOpCodeHandle (EndOpCodeHandle);  \r
-  FreePool (HiiHandles);\r
+  HiiFreeOpCodeHandle (EndOpCodeHandle);\r
 }\r
 \r
 /**\r
@@ -1290,8 +1189,6 @@ InitializeBmmConfig (
 \r
   ASSERT (CallbackData != NULL);\r
 \r
-  InitializeDrivers (CallbackData);\r
-\r
   //\r
   // Initialize data which located in BMM main page\r
   //\r
@@ -1329,6 +1226,11 @@ InitializeBmmConfig (
 \r
   CallbackData->BmmFakeNvData.ForceReconnect = TRUE;\r
 \r
+  //\r
+  // Update the menus.\r
+  //\r
+  CustomizeMenus ();\r
+\r
   //\r
   // Backup Initialize BMM configuartion data to BmmOldFakeNVData\r
   //\r
@@ -1379,6 +1281,77 @@ FreeAllMenu (
   mAllMenuInit = FALSE;\r
 }\r
 \r
+/**\r
+  Initial the boot mode related parameters.\r
+\r
+**/\r
+VOID\r
+BmmInitialBootModeInfo (\r
+  VOID\r
+  )\r
+{\r
+  EFI_STATUS                         Status;\r
+  EFI_GRAPHICS_OUTPUT_PROTOCOL       *GraphicsOutput;\r
+  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL    *SimpleTextOut;\r
+  UINTN                              BootTextColumn;\r
+  UINTN                              BootTextRow;\r
+\r
+  if (mBmmModeInitialized) {\r
+    return;\r
+  }\r
+\r
+  //\r
+  // After the console is ready, get current video resolution\r
+  // and text mode before launching setup at first time.\r
+  //\r
+  Status = gBS->HandleProtocol (\r
+                  gST->ConsoleOutHandle,\r
+                  &gEfiGraphicsOutputProtocolGuid,\r
+                  (VOID**)&GraphicsOutput\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    GraphicsOutput = NULL;\r
+  }\r
+\r
+  Status = gBS->HandleProtocol (\r
+                  gST->ConsoleOutHandle,\r
+                  &gEfiSimpleTextOutProtocolGuid,\r
+                  (VOID**)&SimpleTextOut\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    SimpleTextOut = NULL;\r
+  }\r
+\r
+  if (GraphicsOutput != NULL) {\r
+    //\r
+    // Get current video resolution and text mode.\r
+    //\r
+    mBmmBootHorizontalResolution = GraphicsOutput->Mode->Info->HorizontalResolution;\r
+    mBmmBootVerticalResolution   = GraphicsOutput->Mode->Info->VerticalResolution;\r
+  }\r
+\r
+  if (SimpleTextOut != NULL) {\r
+    Status = SimpleTextOut->QueryMode (\r
+                              SimpleTextOut,\r
+                              SimpleTextOut->Mode->Mode,\r
+                              &BootTextColumn,\r
+                              &BootTextRow\r
+                              );\r
+    mBmmBootTextModeColumn = (UINT32)BootTextColumn;\r
+    mBmmBootTextModeRow    = (UINT32)BootTextRow;\r
+  }\r
+\r
+  //\r
+  // Get user defined text mode for setup.\r
+  //\r
+  mBmmSetupHorizontalResolution = PcdGet32 (PcdSetupVideoHorizontalResolution);\r
+  mBmmSetupVerticalResolution   = PcdGet32 (PcdSetupVideoVerticalResolution);\r
+  mBmmSetupTextModeColumn       = PcdGet32 (PcdSetupConOutColumn);\r
+  mBmmSetupTextModeRow          = PcdGet32 (PcdSetupConOutRow);\r
+\r
+  mBmmModeInitialized           = TRUE;\r
+}\r
+\r
 /**\r
 \r
   Install Boot Maintenance Manager Menu driver.\r
@@ -1392,7 +1365,7 @@ FreeAllMenu (
 **/\r
 EFI_STATUS\r
 EFIAPI\r
-BootMaintenanceManagerLibConstructor (\r
+BootMaintenanceManagerUiLibConstructor (\r
   IN EFI_HANDLE                            ImageHandle,\r
   IN EFI_SYSTEM_TABLE                      *SystemTable\r
   )\r
@@ -1423,7 +1396,7 @@ BootMaintenanceManagerLibConstructor (
                                     &mBootMaintGuid,\r
                                     mBmmCallbackInfo->BmmDriverHandle,\r
                                     BootMaintenanceManagerBin,\r
-                                    BootMaintenanceManagerLibStrings,\r
+                                    BootMaintenanceManagerUiLibStrings,\r
                                     NULL\r
                                     );\r
   ASSERT (mBmmCallbackInfo->BmmHiiHandle != NULL);\r
@@ -1467,6 +1440,8 @@ BootMaintenanceManagerLibConstructor (
   //\r
   InitializeBmmConfig(mBmmCallbackInfo);\r
 \r
+  BmmInitialBootModeInfo();\r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -1481,7 +1456,7 @@ BootMaintenanceManagerLibConstructor (
 **/\r
 EFI_STATUS\r
 EFIAPI\r
-BootMaintenanceManagerLibDestructor (\r
+BootMaintenanceManagerUiLibDestructor (\r
   IN EFI_HANDLE                            ImageHandle,\r
   IN EFI_SYSTEM_TABLE                      *SystemTable\r
   )\r