]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFrameworkModulePkg/Universal/BdsDxe/FrontPage.c
Try to read key strike even when the TimeOuts value is zero, this will avoid BDS...
[mirror_edk2.git] / IntelFrameworkModulePkg / Universal / BdsDxe / FrontPage.c
index 3bbe71a8fe7c0082d80648022f30f4615f3a6c18..a0c638100a6f8726ae30949260c28e22165bf7d0 100644 (file)
@@ -741,66 +741,66 @@ UpdateFrontPageStrings (
                   NULL,\r
                   (VOID **) &Smbios\r
                   );\r
-  ASSERT_EFI_ERROR (Status);\r
+  if (!EFI_ERROR (Status)) {\r
+    SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;\r
+    do {\r
+      Status = Smbios->GetNext (Smbios, &SmbiosHandle, NULL, &Record, NULL);\r
+      if (EFI_ERROR(Status)) {\r
+        break;\r
+      }\r
 \r
-  SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;\r
-  do {\r
-    Status = Smbios->GetNext (Smbios, &SmbiosHandle, NULL, &Record, NULL);\r
-    if (EFI_ERROR(Status)) {\r
-      break;\r
-    }\r
+      if (Record->Type == EFI_SMBIOS_TYPE_BIOS_INFORMATION) {\r
+        Type0Record = (SMBIOS_TABLE_TYPE0 *) Record;\r
+        StrIndex = Type0Record->BiosVersion;\r
+        GetOptionalStringByIndex ((CHAR8*)((UINT8*)Type0Record + Type0Record->Hdr.Length), StrIndex, &NewString);\r
+        TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_BIOS_VERSION);\r
+        HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
+        FreePool (NewString);\r
+        Find[0] = TRUE;\r
+      }\r
 \r
-    if (Record->Type == EFI_SMBIOS_TYPE_BIOS_INFORMATION) {\r
-      Type0Record = (SMBIOS_TABLE_TYPE0 *) Record;\r
-      StrIndex = Type0Record->BiosVersion;\r
-      GetOptionalStringByIndex ((CHAR8*)((UINT8*)Type0Record + Type0Record->Hdr.Length), StrIndex, &NewString);\r
-      TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_BIOS_VERSION);\r
-      HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
-      FreePool (NewString);\r
-      Find[0] = TRUE;\r
-    }  \r
+      if (Record->Type == EFI_SMBIOS_TYPE_SYSTEM_INFORMATION) {\r
+        Type1Record = (SMBIOS_TABLE_TYPE1 *) Record;\r
+        StrIndex = Type1Record->ProductName;\r
+        GetOptionalStringByIndex ((CHAR8*)((UINT8*)Type1Record + Type1Record->Hdr.Length), StrIndex, &NewString);\r
+        TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_COMPUTER_MODEL);\r
+        HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
+        FreePool (NewString);\r
+        Find[1] = TRUE;\r
+      }\r
 \r
-    if (Record->Type == EFI_SMBIOS_TYPE_SYSTEM_INFORMATION) {\r
-      Type1Record = (SMBIOS_TABLE_TYPE1 *) Record;\r
-      StrIndex = Type1Record->ProductName;\r
-      GetOptionalStringByIndex ((CHAR8*)((UINT8*)Type1Record + Type1Record->Hdr.Length), StrIndex, &NewString);\r
-      TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_COMPUTER_MODEL);\r
-      HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
-      FreePool (NewString);\r
-      Find[1] = TRUE;\r
-    }\r
-      \r
-    if (Record->Type == EFI_SMBIOS_TYPE_PROCESSOR_INFORMATION) {\r
-      Type4Record = (SMBIOS_TABLE_TYPE4 *) Record;\r
-      StrIndex = Type4Record->ProcessorVersion;\r
-      GetOptionalStringByIndex ((CHAR8*)((UINT8*)Type4Record + Type4Record->Hdr.Length), StrIndex, &NewString);\r
-      TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_CPU_MODEL);\r
-      HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
-      FreePool (NewString);\r
-      Find[2] = TRUE;\r
-    }    \r
-\r
-    if (Record->Type == EFI_SMBIOS_TYPE_PROCESSOR_INFORMATION) {\r
-      Type4Record = (SMBIOS_TABLE_TYPE4 *) Record;\r
-      ConvertProcessorToString(Type4Record->CurrentSpeed, 6, &NewString);\r
-      TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_CPU_SPEED);\r
-      HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
-      FreePool (NewString);\r
-      Find[3] = TRUE;\r
-    } \r
-\r
-    if ( Record->Type == EFI_SMBIOS_TYPE_MEMORY_ARRAY_MAPPED_ADDRESS ) {\r
-      Type19Record = (SMBIOS_TABLE_TYPE19 *) Record;\r
-      ConvertMemorySizeToString (\r
-        (UINT32)(RShiftU64((Type19Record->EndingAddress - Type19Record->StartingAddress + 1), 10)),\r
-        &NewString\r
-        );\r
-      TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_MEMORY_SIZE);\r
-      HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
-      FreePool (NewString);\r
-      Find[4] = TRUE;  \r
-    }\r
-  } while ( !(Find[0] && Find[1] && Find[2] && Find[3] && Find[4]));\r
+      if (Record->Type == EFI_SMBIOS_TYPE_PROCESSOR_INFORMATION) {\r
+        Type4Record = (SMBIOS_TABLE_TYPE4 *) Record;\r
+        StrIndex = Type4Record->ProcessorVersion;\r
+        GetOptionalStringByIndex ((CHAR8*)((UINT8*)Type4Record + Type4Record->Hdr.Length), StrIndex, &NewString);\r
+        TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_CPU_MODEL);\r
+        HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
+        FreePool (NewString);\r
+        Find[2] = TRUE;\r
+      }\r
+\r
+      if (Record->Type == EFI_SMBIOS_TYPE_PROCESSOR_INFORMATION) {\r
+        Type4Record = (SMBIOS_TABLE_TYPE4 *) Record;\r
+        ConvertProcessorToString(Type4Record->CurrentSpeed, 6, &NewString);\r
+        TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_CPU_SPEED);\r
+        HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
+        FreePool (NewString);\r
+        Find[3] = TRUE;\r
+      }\r
+\r
+      if ( Record->Type == EFI_SMBIOS_TYPE_MEMORY_ARRAY_MAPPED_ADDRESS ) {\r
+        Type19Record = (SMBIOS_TABLE_TYPE19 *) Record;\r
+        ConvertMemorySizeToString (\r
+          (UINT32)(RShiftU64((Type19Record->EndingAddress - Type19Record->StartingAddress + 1), 10)),\r
+          &NewString\r
+          );\r
+        TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_MEMORY_SIZE);\r
+        HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
+        FreePool (NewString);\r
+        Find[4] = TRUE;\r
+      }\r
+    } while ( !(Find[0] && Find[1] && Find[2] && Find[3] && Find[4]));\r
+  }\r
   return ;\r
 }\r
 \r
@@ -891,64 +891,62 @@ ShowProgress (
   EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background;\r
   EFI_GRAPHICS_OUTPUT_BLT_PIXEL Color;\r
 \r
-  if (TimeoutDefault == 0) {\r
-    return EFI_TIMEOUT;\r
-  }\r
-\r
-  DEBUG ((EFI_D_INFO, "\n\nStart showing progress bar... Press any key to stop it! ...Zzz....\n"));\r
-\r
-  SetMem (&Foreground, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0xff);\r
-  SetMem (&Background, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0x0);\r
-  SetMem (&Color, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0xff);\r
-  \r
-  TmpStr = GetStringById (STRING_TOKEN (STR_START_BOOT_OPTION));\r
+  if (TimeoutDefault != 0) {\r
+    DEBUG ((EFI_D_INFO, "\n\nStart showing progress bar... Press any key to stop it! ...Zzz....\n"));\r
 \r
-  if (!FeaturePcdGet(PcdBootlogoOnlyEnable)) {\r
-    //\r
-    // Clear the progress status bar first\r
-    //\r
-    if (TmpStr != NULL) {\r
-      PlatformBdsShowProgress (Foreground, Background, TmpStr, Color, 0, 0);\r
-    }\r
-  }\r
-  \r
-\r
-  TimeoutRemain = TimeoutDefault;\r
-  while (TimeoutRemain != 0) {\r
-    DEBUG ((EFI_D_INFO, "Showing progress bar...Remaining %d second!\n", TimeoutRemain));\r
-\r
-    Status = WaitForSingleEvent (gST->ConIn->WaitForKey, ONE_SECOND);\r
-    if (Status != EFI_TIMEOUT) {\r
-      break;\r
-    }\r
-    TimeoutRemain--;\r
+    SetMem (&Foreground, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0xff);\r
+    SetMem (&Background, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0x0);\r
+    SetMem (&Color, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0xff);\r
     \r
+    TmpStr = GetStringById (STRING_TOKEN (STR_START_BOOT_OPTION));\r
+\r
     if (!FeaturePcdGet(PcdBootlogoOnlyEnable)) {\r
       //\r
-      // Show progress\r
+      // Clear the progress status bar first\r
       //\r
       if (TmpStr != NULL) {\r
-        PlatformBdsShowProgress (\r
-          Foreground,\r
-          Background,\r
-          TmpStr,\r
-          Color,\r
-          ((TimeoutDefault - TimeoutRemain) * 100 / TimeoutDefault),\r
-          0\r
-          );\r
+        PlatformBdsShowProgress (Foreground, Background, TmpStr, Color, 0, 0);\r
       }\r
     }\r
-  }\r
-  \r
-  if (TmpStr != NULL) {\r
-    gBS->FreePool (TmpStr);\r
-  }\r
+    \r
 \r
-  //\r
-  // Timeout expired\r
-  //\r
-  if (TimeoutRemain == 0) {\r
-    return EFI_TIMEOUT;\r
+    TimeoutRemain = TimeoutDefault;\r
+    while (TimeoutRemain != 0) {\r
+      DEBUG ((EFI_D_INFO, "Showing progress bar...Remaining %d second!\n", TimeoutRemain));\r
+\r
+      Status = WaitForSingleEvent (gST->ConIn->WaitForKey, ONE_SECOND);\r
+      if (Status != EFI_TIMEOUT) {\r
+        break;\r
+      }\r
+      TimeoutRemain--;\r
+      \r
+      if (!FeaturePcdGet(PcdBootlogoOnlyEnable)) {\r
+        //\r
+        // Show progress\r
+        //\r
+        if (TmpStr != NULL) {\r
+          PlatformBdsShowProgress (\r
+            Foreground,\r
+            Background,\r
+            TmpStr,\r
+            Color,\r
+            ((TimeoutDefault - TimeoutRemain) * 100 / TimeoutDefault),\r
+            0\r
+            );\r
+        }\r
+      }\r
+    }\r
+    \r
+    if (TmpStr != NULL) {\r
+      gBS->FreePool (TmpStr);\r
+    }\r
+\r
+    //\r
+    // Timeout expired\r
+    //\r
+    if (TimeoutRemain == 0) {\r
+      return EFI_TIMEOUT;\r
+    }\r
   }\r
 \r
   //\r
@@ -1085,7 +1083,7 @@ PlatformBdsEnterFrontPage (
     //\r
     // Clear EFI_OS_INDICATIONS_BOOT_TO_FW_UI to acknowledge OS\r
     // \r
-    OsIndication &= ~EFI_OS_INDICATIONS_BOOT_TO_FW_UI;\r
+    OsIndication &= ~((UINT64)EFI_OS_INDICATIONS_BOOT_TO_FW_UI);\r
     Status = gRT->SetVariable (\r
                     L"OsIndications",\r
                     &gEfiGlobalVariableGuid,\r
@@ -1144,6 +1142,12 @@ PlatformBdsEnterFrontPage (
     BootLogo->SetBootLogo (BootLogo, NULL, 0, 0, 0, 0);\r
   }\r
 \r
+  //\r
+  // Install BM HiiPackages. \r
+  // Keep BootMaint HiiPackage, so that it can be covered by global setting. \r
+  //\r
+  InitBMPackage ();\r
+\r
   Status = EFI_SUCCESS;\r
   do {\r
     //\r
@@ -1199,10 +1203,20 @@ PlatformBdsEnterFrontPage (
       break;\r
 \r
     case FRONT_PAGE_KEY_BOOT_MANAGER:\r
+      //\r
+      // Remove the installed BootMaint HiiPackages when exit.\r
+      //\r
+      FreeBMPackage ();\r
+\r
       //\r
       // User chose to run the Boot Manager\r
       //\r
       CallBootManager ();\r
+\r
+      //\r
+      // Reinstall BootMaint HiiPackages after exiting from Boot Manager.\r
+      //\r
+      InitBMPackage ();\r
       break;\r
 \r
     case FRONT_PAGE_KEY_DEVICE_MANAGER:\r
@@ -1233,6 +1247,11 @@ PlatformBdsEnterFrontPage (
   //\r
   SetupResetReminder ();\r
 \r
+  //\r
+  // Remove the installed BootMaint HiiPackages when exit.\r
+  //\r
+  FreeBMPackage ();\r
+\r
 Exit:\r
   //\r
   // Automatically load current entry\r