]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Vlv2TbltDevicePkg/Library/PlatformBdsLib/BdsPlatform.c
Vlv2TbltDevicePkg:Signal EndOfDxe Event.
[mirror_edk2.git] / Vlv2TbltDevicePkg / Library / PlatformBdsLib / BdsPlatform.c
index b0ada79f0296da04b720474db22e236334e07c3e..82ad974dc2dfff1ebf0b349477952195e238d526 100644 (file)
@@ -1,6 +1,6 @@
 /** @file\r
 \r
 /** @file\r
 \r
-  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2004  - 2016, Intel Corporation. All rights reserved.<BR>\r
                                                                                    \r\r
   This program and the accompanying materials are licensed and made available under\r\r
   the terms and conditions of the BSD License that accompanies this distribution.  \r\r
                                                                                    \r\r
   This program and the accompanying materials are licensed and made available under\r\r
   the terms and conditions of the BSD License that accompanies this distribution.  \r\r
@@ -41,6 +41,9 @@ Abstract:
 #include <Library/SerialPortLib.h>\r
 #include <Library/DebugLib.h>\r
 \r
 #include <Library/SerialPortLib.h>\r
 #include <Library/DebugLib.h>\r
 \r
+#include <Library/GenericBdsLib/InternalBdsLib.h>\r
+#include <Library/GenericBdsLib/String.h>\r
+#include <Library/NetLib.h>\r
 \r
 EFI_GUID *ConnectDriverTable[] = {\r
   &gEfiMmioDeviceProtocolGuid,\r
 \r
 EFI_GUID *ConnectDriverTable[] = {\r
   &gEfiMmioDeviceProtocolGuid,\r
@@ -223,6 +226,11 @@ PlatformBdsInit (
   EFI_STATUS  Status;\r
   EFI_EVENT   ShellImageEvent;\r
   EFI_GUID    ShellEnvProtocol = SHELL_ENVIRONMENT_INTERFACE_PROTOCOL;\r
   EFI_STATUS  Status;\r
   EFI_EVENT   ShellImageEvent;\r
   EFI_GUID    ShellEnvProtocol = SHELL_ENVIRONMENT_INTERFACE_PROTOCOL;\r
+  \r
+  //\r
+  // Signal EndOfDxe PI Event\r
+  //\r
+  EfiEventGroupSignal (&gEfiEndOfDxeEventGroupGuid);\r
 \r
   #ifdef __GNUC__\r
   SerialPortWrite((UINT8 *)">>>>BdsEntry[GCC]\r\n", 19);\r
 \r
   #ifdef __GNUC__\r
   SerialPortWrite((UINT8 *)">>>>BdsEntry[GCC]\r\n", 19);\r
@@ -319,7 +327,18 @@ GetGopDevicePath (
                   &VarSize,\r
                   &mSystemConfiguration\r
                   );\r
                   &VarSize,\r
                   &mSystemConfiguration\r
                   );\r
-  ASSERT_EFI_ERROR (Status);\r
+  if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) {\r
+    //The setup variable is corrupted\r
+    VarSize = sizeof(SYSTEM_CONFIGURATION);\r
+    Status = gRT->GetVariable(\r
+              L"SetupRecovery",\r
+              &gEfiNormalSetupGuid,\r
+              NULL,\r
+              &VarSize,\r
+              &mSystemConfiguration\r
+              );\r
+    ASSERT_EFI_ERROR (Status);\r
+  }    \r
 \r
   if(mSystemConfiguration.BootDisplayDevice != 0x0)\r
   {\r
 \r
   if(mSystemConfiguration.BootDisplayDevice != 0x0)\r
   {\r
@@ -621,7 +640,18 @@ PlatformBdsForceActiveVga (
                   &VarSize,\r
                   &mSystemConfiguration\r
                   );\r
                   &VarSize,\r
                   &mSystemConfiguration\r
                   );\r
-  ASSERT_EFI_ERROR (Status);\r
+  if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) {\r
+    //The setup variable is corrupted\r
+    VarSize = sizeof(SYSTEM_CONFIGURATION);\r
+    Status = gRT->GetVariable(\r
+              L"SetupRecovery",\r
+              &gEfiNormalSetupGuid,\r
+              NULL,\r
+              &VarSize,\r
+              &mSystemConfiguration\r
+              );\r
+    ASSERT_EFI_ERROR (Status);\r
+  }    \r
 \r
 \r
   if ((PlugInPciVgaDevicePath == NULL && OnboardPciVgaDevicePath != NULL) ) {\r
 \r
 \r
   if ((PlugInPciVgaDevicePath == NULL && OnboardPciVgaDevicePath != NULL) ) {\r
@@ -677,7 +707,18 @@ UpdateConsoleResolution(
                   &VarSize,\r
                   &SystemConfiguration\r
                   );\r
                   &VarSize,\r
                   &SystemConfiguration\r
                   );\r
-  ASSERT_EFI_ERROR (Status);\r
+  if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) {\r
+    //The setup variable is corrupted\r
+    VarSize = sizeof(SYSTEM_CONFIGURATION);\r
+    Status = gRT->GetVariable(\r
+              L"SetupRecovery",\r
+              &gEfiNormalSetupGuid,\r
+              NULL,\r
+              &VarSize,\r
+              &SystemConfiguration\r
+              );\r
+    ASSERT_EFI_ERROR (Status);\r
+  }  \r
 \r
   switch (SystemConfiguration.IgdFlatPanel) {\r
 \r
 \r
   switch (SystemConfiguration.IgdFlatPanel) {\r
 \r
@@ -982,6 +1023,549 @@ PlatformBdsDiagnostics (
 }\r
 \r
 \r
 }\r
 \r
 \r
+/**\r
+  For EFI boot option, BDS separate them as six types:\r
+  1. Network - The boot option points to the SimpleNetworkProtocol device.\r
+               Bds will try to automatically create this type boot option when enumerate.\r
+  2. Shell   - The boot option points to internal flash shell.\r
+               Bds will try to automatically create this type boot option when enumerate.\r
+  3. Removable BlockIo      - The boot option only points to the removable media\r
+                              device, like USB flash disk, DVD, Floppy etc.\r
+                              These device should contain a *removable* blockIo\r
+                              protocol in their device handle.\r
+                              Bds will try to automatically create this type boot option\r
+                              when enumerate.\r
+  4. Fixed BlockIo          - The boot option only points to a Fixed blockIo device,\r
+                              like HardDisk.\r
+                              These device should contain a *fixed* blockIo\r
+                              protocol in their device handle.\r
+                              BDS will skip fixed blockIo devices, and NOT\r
+                              automatically create boot option for them. But BDS\r
+                              will help to delete those fixed blockIo boot option,\r
+                              whose description rule conflict with other auto-created\r
+                              boot options.\r
+  5. Non-BlockIo Simplefile - The boot option points to a device whose handle\r
+                              has SimpleFileSystem Protocol, but has no blockio\r
+                              protocol. These devices do not offer blockIo\r
+                              protocol, but BDS still can get the\r
+                              \EFI\BOOT\boot{machinename}.EFI by SimpleFileSystem\r
+                              Protocol.\r
+  6. File    - The boot option points to a file. These boot options are usually\r
+               created by user manually or OS loader. BDS will not delete or modify\r
+               these boot options.\r
+\r
+  This function will enumerate all possible boot device in the system, and\r
+  automatically create boot options for Network, Shell, Removable BlockIo,\r
+  and Non-BlockIo Simplefile devices.\r
+  It will only execute once of every boot.\r
+\r
+  @param  BdsBootOptionList      The header of the link list which indexed all\r
+                                 current boot options\r
+\r
+  @retval EFI_SUCCESS            Finished all the boot device enumerate and create\r
+                                 the boot option base on that boot device\r
+\r
+  @retval EFI_OUT_OF_RESOURCES   Failed to enumerate the boot device and create the boot option list\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+PlatformBdsLibEnumerateAllBootOption (\r
+  IN OUT LIST_ENTRY          *BdsBootOptionList\r
+  )\r
+{\r
+  EFI_STATUS                    Status;\r
+  UINT16                        FloppyNumber;\r
+  UINT16                        HarddriveNumber;\r
+  UINT16                        CdromNumber;\r
+  UINT16                        UsbNumber;\r
+  UINT16                        MiscNumber;\r
+  UINT16                        ScsiNumber;\r
+  UINT16                        NonBlockNumber;\r
+  UINTN                         NumberBlockIoHandles;\r
+  EFI_HANDLE                    *BlockIoHandles;\r
+  EFI_BLOCK_IO_PROTOCOL         *BlkIo;\r
+  BOOLEAN                       Removable[2];\r
+  UINTN                         RemovableIndex;\r
+  UINTN                         Index;\r
+  UINTN                         NumOfLoadFileHandles;\r
+  EFI_HANDLE                    *LoadFileHandles;\r
+  UINTN                         FvHandleCount;\r
+  EFI_HANDLE                    *FvHandleBuffer;\r
+  EFI_FV_FILETYPE               Type;\r
+  UINTN                         Size;\r
+  EFI_FV_FILE_ATTRIBUTES        Attributes;\r
+  UINT32                        AuthenticationStatus;\r
+  EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv;\r
+  EFI_DEVICE_PATH_PROTOCOL      *DevicePath;\r
+  UINTN                         DevicePathType;\r
+  CHAR16                        Buffer[40];\r
+  EFI_HANDLE                    *FileSystemHandles;\r
+  UINTN                         NumberFileSystemHandles;\r
+  BOOLEAN                       NeedDelete;\r
+  EFI_IMAGE_DOS_HEADER          DosHeader;\r
+  CHAR8                         *PlatLang;\r
+  CHAR8                         *LastLang;\r
+  EFI_IMAGE_OPTIONAL_HEADER_UNION       HdrData;\r
+  EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION   Hdr;\r
+  CHAR16                        *MacStr;\r
+  CHAR16                        *IPverStr;\r
+  EFI_HANDLE                    *NetworkHandles;\r
+  UINTN                         BufferSize;\r
+\r
+  FloppyNumber    = 0;\r
+  HarddriveNumber = 0;\r
+  CdromNumber     = 0;\r
+  UsbNumber       = 0;\r
+  MiscNumber      = 0;\r
+  ScsiNumber      = 0;\r
+  PlatLang        = NULL;\r
+  LastLang        = NULL;\r
+  ZeroMem (Buffer, sizeof (Buffer));\r
+\r
+  //\r
+  // If the boot device enumerate happened, just get the boot\r
+  // device from the boot order variable\r
+  //\r
+  if (mEnumBootDevice) {\r
+    GetVariable2 (LAST_ENUM_LANGUAGE_VARIABLE_NAME, &gLastEnumLangGuid, (VOID**)&LastLang, NULL);\r
+    GetEfiGlobalVariable2 (L"PlatformLang", (VOID**)&PlatLang, NULL);\r
+    ASSERT (PlatLang != NULL);\r
+    if ((LastLang != NULL) && (AsciiStrCmp (LastLang, PlatLang) == 0)) {\r
+      Status = BdsLibBuildOptionFromVar (BdsBootOptionList, L"BootOrder");\r
+      FreePool (LastLang);\r
+      FreePool (PlatLang);\r
+      return Status;\r
+    } else {\r
+      Status = gRT->SetVariable (\r
+        LAST_ENUM_LANGUAGE_VARIABLE_NAME,\r
+        &gLastEnumLangGuid,\r
+        EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
+        AsciiStrSize (PlatLang),\r
+        PlatLang\r
+        );\r
+      //\r
+      // Failure to set the variable only impacts the performance next time enumerating the boot options.\r
+      //\r
+\r
+      if (LastLang != NULL) {\r
+        FreePool (LastLang);\r
+      }\r
+      FreePool (PlatLang);\r
+    }\r
+  }\r
+\r
+  //\r
+  // Notes: this dirty code is to get the legacy boot option from the\r
+  // BBS table and create to variable as the EFI boot option, it should\r
+  // be removed after the CSM can provide legacy boot option directly\r
+  //\r
+  REFRESH_LEGACY_BOOT_OPTIONS;\r
+\r
+  //\r
+  // Delete invalid boot option\r
+  //\r
+  BdsDeleteAllInvalidEfiBootOption ();\r
+\r
+  //\r
+  // Parse removable media followed by fixed media.\r
+  // The Removable[] array is used by the for-loop below to create removable media boot options \r
+  // at first, and then to create fixed media boot options.\r
+  //\r
+  Removable[0]  = FALSE;\r
+  Removable[1]  = TRUE;\r
+\r
+  gBS->LocateHandleBuffer (\r
+        ByProtocol,\r
+        &gEfiBlockIoProtocolGuid,\r
+        NULL,\r
+        &NumberBlockIoHandles,\r
+        &BlockIoHandles\r
+        );\r
+\r
+  for (RemovableIndex = 0; RemovableIndex < 2; RemovableIndex++) {\r
+    for (Index = 0; Index < NumberBlockIoHandles; Index++) {\r
+      Status = gBS->HandleProtocol (\r
+                      BlockIoHandles[Index],\r
+                      &gEfiBlockIoProtocolGuid,\r
+                      (VOID **) &BlkIo\r
+                      );\r
+      //\r
+      // skip the logical partition\r
+      //\r
+      if (EFI_ERROR (Status) || BlkIo->Media->LogicalPartition) {\r
+        continue;\r
+      }\r
+\r
+      //\r
+      // firstly fixed block io then the removable block io\r
+      //\r
+      if (BlkIo->Media->RemovableMedia == Removable[RemovableIndex]) {\r
+        continue;\r
+      }\r
+      DevicePath  = DevicePathFromHandle (BlockIoHandles[Index]);\r
+      DevicePathType = BdsGetBootTypeFromDevicePath (DevicePath);\r
+\r
+      switch (DevicePathType) {\r
+      case BDS_EFI_ACPI_FLOPPY_BOOT:\r
+        if (FloppyNumber != 0) {\r
+          UnicodeSPrint (Buffer, sizeof (Buffer), L"%s %d", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_FLOPPY)), FloppyNumber);\r
+        } else {\r
+          UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_FLOPPY)));\r
+        }\r
+        BdsLibBuildOptionFromHandle (BlockIoHandles[Index], BdsBootOptionList, Buffer);\r
+        FloppyNumber++;\r
+        break;\r
+\r
+      //\r
+      // Assume a removable SATA device should be the DVD/CD device, a fixed SATA device should be the Hard Drive device.\r
+      //\r
+      case BDS_EFI_MESSAGE_ATAPI_BOOT:\r
+      case BDS_EFI_MESSAGE_SATA_BOOT:\r
+        if (BlkIo->Media->RemovableMedia) {\r
+          if (CdromNumber != 0) {\r
+            UnicodeSPrint (Buffer, sizeof (Buffer), L"%s %d", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_CD_DVD)), CdromNumber);\r
+          } else {\r
+            UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_CD_DVD)));\r
+          }\r
+          CdromNumber++;\r
+        } else {\r
+          if (HarddriveNumber != 0) {\r
+            UnicodeSPrint (Buffer, sizeof (Buffer), L"%s %d", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_HARDDRIVE)), HarddriveNumber);\r
+          } else {\r
+            UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_HARDDRIVE)));\r
+          }\r
+          HarddriveNumber++;\r
+        }\r
+        DEBUG ((DEBUG_INFO | DEBUG_LOAD, "Buffer: %S\n", Buffer));\r
+        BdsLibBuildOptionFromHandle (BlockIoHandles[Index], BdsBootOptionList, Buffer);\r
+        break;\r
+\r
+      case BDS_EFI_MESSAGE_USB_DEVICE_BOOT:\r
+        if (UsbNumber != 0) {\r
+          UnicodeSPrint (Buffer, sizeof (Buffer), L"%s %d", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_USB)), UsbNumber);\r
+        } else {\r
+          UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_USB)));\r
+        }\r
+        BdsLibBuildOptionFromHandle (BlockIoHandles[Index], BdsBootOptionList, Buffer);\r
+        UsbNumber++;\r
+        break;\r
+\r
+      case BDS_EFI_MESSAGE_SCSI_BOOT:\r
+        if (ScsiNumber != 0) {\r
+          UnicodeSPrint (Buffer, sizeof (Buffer), L"%s %d", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_SCSI)), ScsiNumber);\r
+        } else {\r
+          UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_SCSI)));\r
+        }\r
+        BdsLibBuildOptionFromHandle (BlockIoHandles[Index], BdsBootOptionList, Buffer);\r
+        ScsiNumber++;\r
+        break;\r
+\r
+      case BDS_EFI_MESSAGE_MISC_BOOT:\r
+      default:\r
+        if (MiscNumber != 0) {\r
+          UnicodeSPrint (Buffer, sizeof (Buffer), L"%s %d", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_MISC)), MiscNumber);\r
+        } else {\r
+          UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_MISC)));\r
+        }\r
+        BdsLibBuildOptionFromHandle (BlockIoHandles[Index], BdsBootOptionList, Buffer);\r
+        MiscNumber++;\r
+        break;\r
+      }\r
+    }\r
+  }\r
+\r
+  if (NumberBlockIoHandles != 0) {\r
+    FreePool (BlockIoHandles);\r
+  }\r
+\r
+  //\r
+  // If there is simple file protocol which does not consume block Io protocol, create a boot option for it here.\r
+  //\r
+  NonBlockNumber = 0;\r
+  gBS->LocateHandleBuffer (\r
+        ByProtocol,\r
+        &gEfiSimpleFileSystemProtocolGuid,\r
+        NULL,\r
+        &NumberFileSystemHandles,\r
+        &FileSystemHandles\r
+        );\r
+  for (Index = 0; Index < NumberFileSystemHandles; Index++) {\r
+    Status = gBS->HandleProtocol (\r
+                    FileSystemHandles[Index],\r
+                    &gEfiBlockIoProtocolGuid,\r
+                    (VOID **) &BlkIo\r
+                    );\r
+     if (!EFI_ERROR (Status)) {\r
+      //\r
+      //  Skip if the file system handle supports a BlkIo protocol,\r
+      //\r
+      continue;\r
+    }\r
+\r
+    //\r
+    // Do the removable Media thing. \EFI\BOOT\boot{machinename}.EFI\r
+    //  machinename is ia32, ia64, x64, ...\r
+    //\r
+    Hdr.Union  = &HdrData;\r
+    NeedDelete = TRUE;\r
+    Status     = BdsLibGetImageHeader (\r
+                   FileSystemHandles[Index],\r
+                   EFI_REMOVABLE_MEDIA_FILE_NAME,\r
+                   &DosHeader,\r
+                   Hdr\r
+                   );\r
+    if (!EFI_ERROR (Status) &&\r
+        EFI_IMAGE_MACHINE_TYPE_SUPPORTED (Hdr.Pe32->FileHeader.Machine) &&\r
+        Hdr.Pe32->OptionalHeader.Subsystem == EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION) {\r
+      NeedDelete = FALSE;\r
+    }\r
+\r
+    if (NeedDelete) {\r
+      //\r
+      // No such file or the file is not a EFI application, delete this boot option\r
+      //\r
+      BdsLibDeleteOptionFromHandle (FileSystemHandles[Index]);\r
+    } else {\r
+      if (NonBlockNumber != 0) {\r
+        UnicodeSPrint (Buffer, sizeof (Buffer), L"%s %d", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_NON_BLOCK)), NonBlockNumber);\r
+      } else {\r
+        UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_NON_BLOCK)));\r
+      }\r
+      BdsLibBuildOptionFromHandle (FileSystemHandles[Index], BdsBootOptionList, Buffer);\r
+      NonBlockNumber++;\r
+    }\r
+  }\r
+\r
+  if (NumberFileSystemHandles != 0) {\r
+    FreePool (FileSystemHandles);\r
+  }\r
+\r
+  //\r
+  // Check if we have on flash shell\r
+  //\r
+  gBS->LocateHandleBuffer (\r
+        ByProtocol,\r
+        &gEfiFirmwareVolume2ProtocolGuid,\r
+        NULL,\r
+        &FvHandleCount,\r
+        &FvHandleBuffer\r
+        );\r
+  for (Index = 0; Index < FvHandleCount; Index++) {\r
+    gBS->HandleProtocol (\r
+          FvHandleBuffer[Index],\r
+          &gEfiFirmwareVolume2ProtocolGuid,\r
+          (VOID **) &Fv\r
+          );\r
+\r
+    Status = Fv->ReadFile (\r
+                  Fv,\r
+                  PcdGetPtr(PcdShellFile),\r
+                  NULL,\r
+                  &Size,\r
+                  &Type,\r
+                  &Attributes,\r
+                  &AuthenticationStatus\r
+                  );\r
+    if (EFI_ERROR (Status)) {\r
+      //\r
+      // Skip if no shell file in the FV\r
+      //\r
+      continue;\r
+    }\r
+    //\r
+    // Build the shell boot option\r
+    //\r
+    BdsLibBuildOptionFromShell (FvHandleBuffer[Index], BdsBootOptionList);\r
+  }\r
+\r
+  if (FvHandleCount != 0) {\r
+    FreePool (FvHandleBuffer);\r
+  }\r
+\r
+  //\r
+  // Parse Network Boot Device\r
+  //\r
+  NumOfLoadFileHandles = 0;\r
+  //\r
+  // Search Load File protocol for PXE boot option.\r
+  //\r
+  gBS->LocateHandleBuffer (\r
+        ByProtocol,\r
+        &gEfiLoadFileProtocolGuid,\r
+        NULL,\r
+        &NumOfLoadFileHandles,\r
+        &LoadFileHandles\r
+        );\r
+\r
+  for (Index = 0; Index < NumOfLoadFileHandles; Index++) {\r
+\r
+//\r
+//Locate EFI_DEVICE_PATH_PROTOCOL to dynamically get IPv4/IPv6 protocol information.\r
+//\r
+\r
+ Status = gBS->HandleProtocol (\r
+                  LoadFileHandles[Index],\r
+                  &gEfiDevicePathProtocolGuid,\r
+                  (VOID **) &DevicePath\r
+                  );\r
+  \r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+  while (!IsDevicePathEnd (DevicePath)) {\r
+    if ((DevicePath->Type == MESSAGING_DEVICE_PATH) &&\r
+        (DevicePath->SubType == MSG_IPv4_DP)) {\r
+\r
+  //\r
+  //Get handle infomation\r
+  //\r
+  BufferSize = 0;\r
+  NetworkHandles = NULL;\r
+  Status = gBS->LocateHandle (\r
+                  ByProtocol, \r
+                  &gEfiSimpleNetworkProtocolGuid,\r
+                  NULL,\r
+                  &BufferSize,\r
+                  NetworkHandles\r
+                  );\r
+\r
+  if (Status == EFI_BUFFER_TOO_SMALL) {\r
+    NetworkHandles = AllocateZeroPool(BufferSize);\r
+    if (NetworkHandles == NULL) {\r
+      return (EFI_OUT_OF_RESOURCES);\r
+    }\r
+    Status = gBS->LocateHandle(\r
+                    ByProtocol,\r
+                    &gEfiSimpleNetworkProtocolGuid,\r
+                    NULL,\r
+                    &BufferSize,\r
+                    NetworkHandles\r
+                    );\r
+ }\r
+               \r
+  //\r
+  //Get the MAC string\r
+  //\r
+  Status = NetLibGetMacString (\r
+             *NetworkHandles,\r
+             NULL,\r
+             &MacStr\r
+             );\r
+  if (EFI_ERROR (Status)) {    \r
+    return Status;\r
+  }\r
+  IPverStr = L" IPv4";\r
+  UnicodeSPrint (Buffer, sizeof (Buffer), L"%s%s%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_NETWORK)),MacStr,IPverStr);\r
+  break;\r
+  }\r
+    if((DevicePath->Type == MESSAGING_DEVICE_PATH) &&\r
+        (DevicePath->SubType == MSG_IPv6_DP)) {\r
+\r
+  //\r
+  //Get handle infomation\r
+  //\r
+  BufferSize = 0;\r
+  NetworkHandles = NULL;\r
+  Status = gBS->LocateHandle (\r
+                  ByProtocol, \r
+                  &gEfiSimpleNetworkProtocolGuid,\r
+                  NULL,\r
+                  &BufferSize,\r
+                  NetworkHandles\r
+                  );\r
+\r
+  if (Status == EFI_BUFFER_TOO_SMALL) {\r
+    NetworkHandles = AllocateZeroPool(BufferSize);\r
+    if (NetworkHandles == NULL) {\r
+       return (EFI_OUT_OF_RESOURCES);\r
+    }\r
+    Status = gBS->LocateHandle(\r
+                    ByProtocol,\r
+                    &gEfiSimpleNetworkProtocolGuid,\r
+                    NULL,\r
+                    &BufferSize,\r
+                    NetworkHandles\r
+                    );\r
+ }\r
+                    \r
+  //\r
+  //Get the MAC string\r
+  //\r
+  Status = NetLibGetMacString (\r
+             *NetworkHandles,\r
+             NULL,\r
+             &MacStr\r
+             );\r
+  if (EFI_ERROR (Status)) {    \r
+    return Status;\r
+  }\r
+      IPverStr = L" IPv6";\r
+      UnicodeSPrint (Buffer, sizeof (Buffer), L"%s%s%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_NETWORK)),MacStr,IPverStr);\r
+      break;\r
+    }\r
+    DevicePath = NextDevicePathNode (DevicePath);\r
+  }\r
+  \r
+    BdsLibBuildOptionFromHandle (LoadFileHandles[Index], BdsBootOptionList, Buffer);\r
+  }\r
+\r
+  if (NumOfLoadFileHandles != 0) {\r
+    FreePool (LoadFileHandles);\r
+  }\r
+\r
+  //\r
+  // Check if we have on flash shell\r
+  //\r
+ /* gBS->LocateHandleBuffer (\r
+        ByProtocol,\r
+        &gEfiFirmwareVolume2ProtocolGuid,\r
+        NULL,\r
+        &FvHandleCount,\r
+        &FvHandleBuffer\r
+        );\r
+  for (Index = 0; Index < FvHandleCount; Index++) {\r
+    gBS->HandleProtocol (\r
+          FvHandleBuffer[Index],\r
+          &gEfiFirmwareVolume2ProtocolGuid,\r
+          (VOID **) &Fv\r
+          );\r
+\r
+    Status = Fv->ReadFile (\r
+                  Fv,\r
+                  PcdGetPtr(PcdShellFile),\r
+                  NULL,\r
+                  &Size,\r
+                  &Type,\r
+                  &Attributes,\r
+                  &AuthenticationStatus\r
+                  );\r
+    if (EFI_ERROR (Status)) {\r
+      //\r
+      // Skip if no shell file in the FV\r
+      //\r
+      continue;\r
+    }\r
+    //\r
+    // Build the shell boot option\r
+    //\r
+    BdsLibBuildOptionFromShell (FvHandleBuffer[Index], BdsBootOptionList);\r
+  }\r
+\r
+  if (FvHandleCount != 0) {\r
+    FreePool (FvHandleBuffer);\r
+  } */\r
+  \r
+  //\r
+  // Make sure every boot only have one time\r
+  // boot device enumerate\r
+  //\r
+  Status = BdsLibBuildOptionFromVar (BdsBootOptionList, L"BootOrder");\r
+  mEnumBootDevice = TRUE;\r
+\r
+  return Status;\r
+} \r
+\r
+\r
+\r
 /**\r
 \r
   The function will excute with as the platform policy, current policy\r
 /**\r
 \r
   The function will excute with as the platform policy, current policy\r
@@ -1030,6 +1614,11 @@ PlatformBdsPolicyBehavior (
   UINTN                              BootOrderSize;\r
 \r
   Timeout = PcdGet16 (PcdPlatformBootTimeOut);\r
   UINTN                              BootOrderSize;\r
 \r
   Timeout = PcdGet16 (PcdPlatformBootTimeOut);\r
+  if (Timeout > 10 ) {\r
+    //we think the Timeout variable is corrupted\r
+    Timeout = 10;\r
+  }\r
+       \r
   VarSize = sizeof(SYSTEM_CONFIGURATION);\r
   Status = gRT->GetVariable(\r
                   NORMAL_SETUP_NAME,\r
   VarSize = sizeof(SYSTEM_CONFIGURATION);\r
   Status = gRT->GetVariable(\r
                   NORMAL_SETUP_NAME,\r
@@ -1038,9 +1627,19 @@ PlatformBdsPolicyBehavior (
                   &VarSize,\r
                   &SystemConfiguration\r
                   );\r
                   &VarSize,\r
                   &SystemConfiguration\r
                   );\r
-  if (EFI_ERROR (Status)) {\r
-    return;\r
-  }\r
+\r
+  if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) {\r
+    //The setup variable is corrupted\r
+    VarSize = sizeof(SYSTEM_CONFIGURATION);\r
+    Status = gRT->GetVariable(\r
+              L"SetupRecovery",\r
+              &gEfiNormalSetupGuid,\r
+              NULL,\r
+              &VarSize,\r
+              &SystemConfiguration\r
+              );\r
+    ASSERT_EFI_ERROR (Status);\r
+  }  \r
 \r
   //\r
   // Load the driver option as the driver option list\r
 \r
   //\r
   // Load the driver option as the driver option list\r
@@ -1217,10 +1816,12 @@ PlatformBdsPolicyBehavior (
     }\r
 \r
 \r
     }\r
 \r
 \r
-#ifdef TPM_ENABLED\r
-       TcgPhysicalPresenceLibProcessRequest();\r
-#endif\r
-\r
+    #ifdef TPM_ENABLED\r
+    TcgPhysicalPresenceLibProcessRequest();\r
+    #endif\r
+    #ifdef FTPM_ENABLE\r
+    TrEEPhysicalPresenceLibProcessRequest(NULL);\r
+    #endif\r
     //\r
     // Close boot script and install ready to lock\r
     //\r
     //\r
     // Close boot script and install ready to lock\r
     //\r
@@ -1405,15 +2006,22 @@ FULL_CONFIGURATION:
         PlatformBdsConnectSequence ();\r
       }\r
     }\r
         PlatformBdsConnectSequence ();\r
       }\r
     }\r
-#ifdef TPM_ENABLED\r
+   #ifdef TPM_ENABLED\r
    TcgPhysicalPresenceLibProcessRequest();\r
    TcgPhysicalPresenceLibProcessRequest();\r
-#endif\r
-\r
+   #endif\r
+   #ifdef FTPM_ENABLE\r
+   TrEEPhysicalPresenceLibProcessRequest(NULL);\r
+   #endif\r
     //\r
     // Close boot script and install ready to lock\r
     //\r
     InstallReadyToLock ();\r
 \r
     //\r
     // Close boot script and install ready to lock\r
     //\r
     InstallReadyToLock ();\r
 \r
+    //\r
+    // Here we have enough time to do the enumeration of boot device\r
+    //\r
+    PlatformBdsLibEnumerateAllBootOption (BootOptionList);\r
+\r
     //\r
     // Give one chance to enter the setup if we\r
     // have the time out\r
     //\r
     // Give one chance to enter the setup if we\r
     // have the time out\r
@@ -1439,10 +2047,7 @@ FULL_CONFIGURATION:
       return;\r
     }\r
 \r
       return;\r
     }\r
 \r
-    //\r
-    // Here we have enough time to do the enumeration of boot device\r
-    //\r
-    BdsLibEnumerateAllBootOption (BootOptionList);\r
+    \r
     break;\r
   }\r
 \r
     break;\r
   }\r
 \r
@@ -1813,6 +2418,8 @@ ShowProgressHotKey (
     return EFI_TIMEOUT;\r
   }\r
 \r
     return EFI_TIMEOUT;\r
   }\r
 \r
+  gST->ConOut->SetAttribute(gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
+    \r
   if (DebugAssertEnabled())\r
   {\r
     DEBUG ((EFI_D_INFO, "\n\nStart showing progress bar... Press any key to stop it, or press <F2> or <DEL> to enter setup page! ...Zzz....\n"));\r
   if (DebugAssertEnabled())\r
   {\r
     DEBUG ((EFI_D_INFO, "\n\nStart showing progress bar... Press any key to stop it, or press <F2> or <DEL> to enter setup page! ...Zzz....\n"));\r
@@ -2051,7 +2658,11 @@ PlatformBdsEnterFrontPageWithHotKey (
       goto Exit;\r
     }\r
   }\r
       goto Exit;\r
     }\r
   }\r
-\r
+  //\r
+  // Install BM HiiPackages. \r
+  // Keep BootMaint HiiPackage, so that it can be covered by global setting. \r
+  //\r
+       InitBMPackage ();\r
   do {\r
 \r
     BdsSetConsoleMode (TRUE);\r
   do {\r
 \r
     BdsSetConsoleMode (TRUE);\r
@@ -2113,11 +2724,20 @@ PlatformBdsEnterFrontPageWithHotKey (
       break;\r
 \r
     case FRONT_PAGE_KEY_BOOT_MANAGER:\r
       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
       // 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
       break;\r
 \r
     case FRONT_PAGE_KEY_DEVICE_MANAGER:\r
@@ -2145,6 +2765,10 @@ PlatformBdsEnterFrontPageWithHotKey (
   //Will leave browser, check any reset required change is applied? if yes, reset system\r
   //\r
   SetupResetReminder ();\r
   //Will leave browser, check any reset required change is applied? if yes, reset system\r
   //\r
   SetupResetReminder ();\r
+  //\r
+  // Remove the installed BootMaint HiiPackages when exit.\r
+  //\r
+  FreeBMPackage ();\r
 \r
 Exit:\r
   //\r
 \r
 Exit:\r
   //\r