]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLibInternal.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / MdeModulePkg / Library / CustomizedDisplayLib / CustomizedDisplayLibInternal.c
index b6b4055b6d260ca2e584cf81454e4f10a627c890..58130d93838c379abf1888616dbdaf15681421f2 100644 (file)
@@ -2,63 +2,57 @@
 \r
   This library class defines a set of interfaces to customize Display module\r
 \r
-Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials are licensed and made available under \r
-the terms and conditions of the BSD License that accompanies this distribution.  \r
-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) 2013-2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 #include "CustomizedDisplayLibInternal.h"\r
 \r
-EFI_SCREEN_DESCRIPTOR         gScreenDimensions;\r
-CHAR16                        *mLibUnknownString;\r
-extern EFI_HII_HANDLE         mCDLStringPackHandle;\r
-CHAR16                        *mSpaceBuffer;\r
-#define SPACE_BUFFER_SIZE      1000\r
+EFI_SCREEN_DESCRIPTOR  gScreenDimensions;\r
+CHAR16                 *mLibUnknownString;\r
+extern EFI_HII_HANDLE  mCDLStringPackHandle;\r
+CHAR16                 *mSpaceBuffer;\r
+#define SPACE_BUFFER_SIZE  1000\r
 \r
 //\r
 // Browser Global Strings\r
 //\r
-CHAR16            *gEnterString;\r
-CHAR16            *gEnterCommitString;\r
-CHAR16            *gEnterEscapeString;\r
-CHAR16            *gEscapeString;\r
-CHAR16            *gMoveHighlight;\r
-CHAR16            *gDecNumericInput;\r
-CHAR16            *gHexNumericInput;\r
-CHAR16            *gToggleCheckBox;\r
-CHAR16            *gLibEmptyString;\r
-CHAR16            *gAreYouSure;\r
-CHAR16            *gYesResponse;\r
-CHAR16            *gNoResponse;\r
-CHAR16            *gPlusString;\r
-CHAR16            *gMinusString;\r
-CHAR16            *gAdjustNumber;\r
-CHAR16            *gSaveChanges;\r
-CHAR16            *gNvUpdateMessage;\r
-CHAR16            *gInputErrorMessage;\r
+CHAR16  *gEnterString;\r
+CHAR16  *gEnterCommitString;\r
+CHAR16  *gEnterEscapeString;\r
+CHAR16  *gEscapeString;\r
+CHAR16  *gMoveHighlight;\r
+CHAR16  *gDecNumericInput;\r
+CHAR16  *gHexNumericInput;\r
+CHAR16  *gToggleCheckBox;\r
+CHAR16  *gLibEmptyString;\r
+CHAR16  *gAreYouSure;\r
+CHAR16  *gYesResponse;\r
+CHAR16  *gNoResponse;\r
+CHAR16  *gPlusString;\r
+CHAR16  *gMinusString;\r
+CHAR16  *gAdjustNumber;\r
+CHAR16  *gSaveChanges;\r
+CHAR16  *gNvUpdateMessage;\r
+CHAR16  *gInputErrorMessage;\r
 \r
 /**\r
 \r
   Print banner info for front page.\r
 \r
   @param[in]  FormData             Form Data to be shown in Page\r
-  \r
+\r
 **/\r
 VOID\r
-PrintBannerInfo ( \r
-  IN FORM_DISPLAY_ENGINE_FORM       *FormData\r
+PrintBannerInfo (\r
+  IN FORM_DISPLAY_ENGINE_FORM  *FormData\r
   )\r
 {\r
-  UINT8                  Line;\r
-  UINT8                  Alignment;\r
-  CHAR16                 *StrFrontPageBanner;\r
-  UINT8                  RowIdx;\r
-  UINT8                  ColumnIdx;\r
+  UINT8   Line;\r
+  UINT8   Alignment;\r
+  CHAR16  *StrFrontPageBanner;\r
+  UINT8   RowIdx;\r
+  UINT8   ColumnIdx;\r
 \r
   //\r
   //    ClearLines(0, LocalScreen.RightColumn, 0, BANNER_HEIGHT-1, BANNER_TEXT | BANNER_BACKGROUND);\r
@@ -74,56 +68,57 @@ PrintBannerInfo (
   //\r
   //    for (Line = 0; Line < BANNER_HEIGHT; Line++) {\r
   //\r
-  for (Line = (UINT8) gScreenDimensions.TopRow; Line < BANNER_HEIGHT + (UINT8) gScreenDimensions.TopRow; Line++) {\r
+  for (Line = (UINT8)gScreenDimensions.TopRow; Line < BANNER_HEIGHT + (UINT8)gScreenDimensions.TopRow; Line++) {\r
     //\r
     //      for (Alignment = 0; Alignment < BANNER_COLUMNS; Alignment++) {\r
     //\r
-    for (Alignment = (UINT8) gScreenDimensions.LeftColumn;\r
-         Alignment < BANNER_COLUMNS + (UINT8) gScreenDimensions.LeftColumn;\r
+    for (Alignment = (UINT8)gScreenDimensions.LeftColumn;\r
+         Alignment < BANNER_COLUMNS + (UINT8)gScreenDimensions.LeftColumn;\r
          Alignment++\r
-        ) {\r
-      RowIdx    = (UINT8) (Line - (UINT8) gScreenDimensions.TopRow);\r
-      ColumnIdx = (UINT8) (Alignment - (UINT8) gScreenDimensions.LeftColumn);\r
-  \r
+         )\r
+    {\r
+      RowIdx    = (UINT8)(Line - (UINT8)gScreenDimensions.TopRow);\r
+      ColumnIdx = (UINT8)(Alignment - (UINT8)gScreenDimensions.LeftColumn);\r
+\r
       ASSERT (RowIdx < BANNER_HEIGHT && ColumnIdx < BANNER_COLUMNS);\r
-  \r
-      if (gBannerData!= NULL && gBannerData->Banner[RowIdx][ColumnIdx] != 0x0000) {\r
+\r
+      if ((gBannerData != NULL) && (gBannerData->Banner[RowIdx][ColumnIdx] != 0x0000)) {\r
         StrFrontPageBanner = LibGetToken (gBannerData->Banner[RowIdx][ColumnIdx], FormData->HiiHandle);\r
       } else {\r
         continue;\r
       }\r
-  \r
+\r
       switch (Alignment - gScreenDimensions.LeftColumn) {\r
-      case 0:\r
-        //\r
-        // Handle left column\r
-        //\r
-        PrintStringAt (gScreenDimensions.LeftColumn + BANNER_LEFT_COLUMN_INDENT, Line, StrFrontPageBanner);\r
-        break;\r
-  \r
-      case 1:\r
-        //\r
-        // Handle center column\r
-        //\r
-        PrintStringAt (\r
-          gScreenDimensions.LeftColumn + (gScreenDimensions.RightColumn - gScreenDimensions.LeftColumn) / 3,\r
-          Line,\r
-          StrFrontPageBanner\r
-          );\r
-        break;\r
-  \r
-      case 2:\r
-        //\r
-        // Handle right column\r
-        //\r
-        PrintStringAt (\r
-          gScreenDimensions.LeftColumn + (gScreenDimensions.RightColumn - gScreenDimensions.LeftColumn) * 2 / 3,\r
-          Line,\r
-          StrFrontPageBanner\r
-          );\r
-        break;\r
+        case 0:\r
+          //\r
+          // Handle left column\r
+          //\r
+          PrintStringAt (gScreenDimensions.LeftColumn + BANNER_LEFT_COLUMN_INDENT, Line, StrFrontPageBanner);\r
+          break;\r
+\r
+        case 1:\r
+          //\r
+          // Handle center column\r
+          //\r
+          PrintStringAt (\r
+            gScreenDimensions.LeftColumn + (gScreenDimensions.RightColumn - gScreenDimensions.LeftColumn) / 3,\r
+            Line,\r
+            StrFrontPageBanner\r
+            );\r
+          break;\r
+\r
+        case 2:\r
+          //\r
+          // Handle right column\r
+          //\r
+          PrintStringAt (\r
+            gScreenDimensions.LeftColumn + (gScreenDimensions.RightColumn - gScreenDimensions.LeftColumn) * 2 / 3,\r
+            Line,\r
+            StrFrontPageBanner\r
+            );\r
+          break;\r
       }\r
-  \r
+\r
       FreePool (StrFrontPageBanner);\r
     }\r
   }\r
@@ -136,14 +131,15 @@ PrintBannerInfo (
 **/\r
 VOID\r
 PrintFramework (\r
-  IN FORM_DISPLAY_ENGINE_FORM       *FormData\r
+  IN FORM_DISPLAY_ENGINE_FORM  *FormData\r
   )\r
 {\r
-  UINTN                  Index;\r
-  CHAR16                 Character;\r
-  CHAR16                 *Buffer;\r
-  UINTN                  Row;\r
-  CHAR16                 *TitleStr;\r
+  UINTN   Index;\r
+  CHAR16  Character;\r
+  CHAR16  *Buffer;\r
+  UINTN   Row;\r
+  CHAR16  *TitleStr;\r
+  UINTN   TitleColumn;\r
 \r
   if (gClassOfVfr != FORMSET_CLASS_PLATFORM_SETUP) {\r
     //\r
@@ -158,7 +154,7 @@ PrintFramework (
       );\r
     return;\r
   }\r
-    \r
+\r
   Buffer = AllocateZeroPool (0x10000);\r
   ASSERT (Buffer != NULL);\r
   Character = BOXDRAW_HORIZONTAL;\r
@@ -176,43 +172,38 @@ PrintFramework (
   Character = BOXDRAW_DOWN_RIGHT;\r
 \r
   PrintCharAt (gScreenDimensions.LeftColumn, gScreenDimensions.TopRow, Character);\r
-  PrintStringAt ((UINTN) -1, (UINTN) -1, Buffer);\r
+  PrintStringAt ((UINTN)-1, (UINTN)-1, Buffer);\r
 \r
   Character = BOXDRAW_DOWN_LEFT;\r
-  PrintCharAt ((UINTN) -1, (UINTN) -1, Character);\r
+  PrintCharAt ((UINTN)-1, (UINTN)-1, Character);\r
 \r
   Character = BOXDRAW_VERTICAL;\r
   for (Row = gScreenDimensions.TopRow + 1; Row <= gScreenDimensions.TopRow + NONE_FRONT_PAGE_HEADER_HEIGHT - 2; Row++) {\r
     PrintCharAt (gScreenDimensions.LeftColumn, Row, Character);\r
     PrintCharAt (gScreenDimensions.RightColumn - 1, Row, Character);\r
   }\r
-  \r
+\r
   //\r
   // Print Form Title\r
   //\r
-  ClearLines (\r
-    gScreenDimensions.LeftColumn + 1,\r
-    gScreenDimensions.RightColumn - 1,\r
-    gScreenDimensions.TopRow + 1,\r
-    gScreenDimensions.TopRow + 1,\r
-    TITLE_TEXT | TITLE_BACKGROUND\r
-    );\r
-\r
   TitleStr = LibGetToken (FormData->FormTitle, FormData->HiiHandle);\r
   ASSERT (TitleStr != NULL);\r
-  PrintStringAt (\r
-    (gScreenDimensions.RightColumn + gScreenDimensions.LeftColumn - LibGetStringWidth (TitleStr) / 2) / 2,\r
+  TitleColumn = (gScreenDimensions.RightColumn + gScreenDimensions.LeftColumn - LibGetStringWidth (TitleStr) / 2) / 2;\r
+  PrintStringAtWithWidth (gScreenDimensions.LeftColumn + 1, gScreenDimensions.TopRow + 1, gLibEmptyString, TitleColumn - gScreenDimensions.LeftColumn - 1);\r
+  PrintStringAtWithWidth (\r
+    TitleColumn,\r
     gScreenDimensions.TopRow + 1,\r
-    TitleStr\r
+    TitleStr,\r
+    gScreenDimensions.RightColumn - 1 - TitleColumn\r
     );\r
   FreePool (TitleStr);\r
 \r
   Character = BOXDRAW_UP_RIGHT;\r
   PrintCharAt (gScreenDimensions.LeftColumn, gScreenDimensions.TopRow + NONE_FRONT_PAGE_HEADER_HEIGHT - 1, Character);\r
-  PrintStringAt ((UINTN) -1, (UINTN) -1, Buffer);\r
+  PrintStringAt ((UINTN)-1, (UINTN)-1, Buffer);\r
 \r
   Character = BOXDRAW_UP_LEFT;\r
-  PrintCharAt ((UINTN) -1, (UINTN) -1, Character);\r
+  PrintCharAt ((UINTN)-1, (UINTN)-1, Character);\r
 \r
   //\r
   // Print Bottom border line\r
@@ -223,15 +214,16 @@ PrintFramework (
   Character = BOXDRAW_DOWN_RIGHT;\r
   PrintCharAt (gScreenDimensions.LeftColumn, gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - gFooterHeight, Character);\r
 \r
-  PrintStringAt ((UINTN) -1, (UINTN) -1, Buffer);\r
+  PrintStringAt ((UINTN)-1, (UINTN)-1, Buffer);\r
 \r
   Character = BOXDRAW_DOWN_LEFT;\r
-  PrintCharAt ((UINTN) -1, (UINTN) -1, Character);\r
+  PrintCharAt ((UINTN)-1, (UINTN)-1, Character);\r
   Character = BOXDRAW_VERTICAL;\r
   for (Row = gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - gFooterHeight + 1;\r
        Row <= gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - 2;\r
        Row++\r
-      ) {\r
+       )\r
+  {\r
     PrintCharAt (gScreenDimensions.LeftColumn, Row, Character);\r
     PrintCharAt (gScreenDimensions.RightColumn - 1, Row, Character);\r
   }\r
@@ -239,11 +231,11 @@ PrintFramework (
   Character = BOXDRAW_UP_RIGHT;\r
   PrintCharAt (gScreenDimensions.LeftColumn, gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - 1, Character);\r
 \r
-  PrintStringAt ((UINTN) -1, (UINTN) -1, Buffer);\r
+  PrintStringAt ((UINTN)-1, (UINTN)-1, Buffer);\r
 \r
   Character = BOXDRAW_UP_LEFT;\r
-  PrintCharAt ((UINTN) -1, (UINTN) -1, Character);\r
-  \r
+  PrintCharAt ((UINTN)-1, (UINTN)-1, Character);\r
+\r
   FreePool (Buffer);\r
 }\r
 \r
@@ -256,55 +248,85 @@ PrintFramework (
 \r
 **/\r
 VOID\r
-ProcessUserOpcode(\r
-  IN  EFI_IFR_OP_HEADER         *OpCodeData\r
+ProcessUserOpcode (\r
+  IN  EFI_IFR_OP_HEADER  *OpCodeData\r
   )\r
 {\r
+  EFI_GUID  *ClassGuid;\r
+  UINT8     ClassGuidNum;\r
+\r
+  ClassGuid    = NULL;\r
+  ClassGuidNum = 0;\r
+\r
   switch (OpCodeData->OpCode) {\r
-    case EFI_IFR_GUID_OP:     \r
-      if (CompareGuid (&gEfiIfrTianoGuid, (EFI_GUID *)((CHAR8*) OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {\r
+    case EFI_IFR_FORM_SET_OP:\r
+      //\r
+      // process the statement outside of form,if it is formset op, get its formsetguid or classguid and compared with gFrontPageFormSetGuid\r
+      //\r
+      if (CompareMem (PcdGetPtr (PcdFrontPageFormSetGuid), &((EFI_IFR_FORM_SET *)OpCodeData)->Guid, sizeof (EFI_GUID)) == 0) {\r
+        gClassOfVfr = FORMSET_CLASS_FRONT_PAGE;\r
+      } else {\r
+        ClassGuidNum = (UINT8)(((EFI_IFR_FORM_SET *)OpCodeData)->Flags & 0x3);\r
+        ClassGuid    = (EFI_GUID *)(VOID *)((UINT8 *)OpCodeData + sizeof (EFI_IFR_FORM_SET));\r
+        while (ClassGuidNum-- > 0) {\r
+          if (CompareGuid ((EFI_GUID *)PcdGetPtr (PcdFrontPageFormSetGuid), ClassGuid)) {\r
+            gClassOfVfr = FORMSET_CLASS_FRONT_PAGE;\r
+            break;\r
+          }\r
+\r
+          ClassGuid++;\r
+        }\r
+      }\r
+\r
+      break;\r
+\r
+    case EFI_IFR_GUID_OP:\r
+      if (CompareGuid (&gEfiIfrTianoGuid, (EFI_GUID *)((CHAR8 *)OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {\r
         //\r
         // Tiano specific GUIDed opcodes\r
         //\r
-        switch (((EFI_IFR_GUID_LABEL *) OpCodeData)->ExtendOpCode) {\r
-        case EFI_IFR_EXTEND_OP_LABEL:\r
-          //\r
-          // just ignore label\r
-          //\r
-          break;\r
+        switch (((EFI_IFR_GUID_LABEL *)OpCodeData)->ExtendOpCode) {\r
+          case EFI_IFR_EXTEND_OP_LABEL:\r
+            //\r
+            // just ignore label\r
+            //\r
+            break;\r
 \r
-        case EFI_IFR_EXTEND_OP_BANNER:\r
-          //\r
-          // Only in front page form set, we care about the banner data.\r
-          //\r
-          if (gClassOfVfr == FORMSET_CLASS_FRONT_PAGE) {\r
+          case EFI_IFR_EXTEND_OP_BANNER:\r
             //\r
-            // Initialize Driver private data\r
+            // Only in front page form set, we care about the banner data.\r
             //\r
-            if (gBannerData == NULL) {\r
-              gBannerData = AllocateZeroPool (sizeof (BANNER_DATA));\r
-              ASSERT (gBannerData != NULL);\r
+            if (gClassOfVfr == FORMSET_CLASS_FRONT_PAGE) {\r
+              //\r
+              // Initialize Driver private data\r
+              //\r
+              if (gBannerData == NULL) {\r
+                gBannerData = AllocateZeroPool (sizeof (BANNER_DATA));\r
+                ASSERT (gBannerData != NULL);\r
+              }\r
+\r
+              CopyMem (\r
+                &gBannerData->Banner[((EFI_IFR_GUID_BANNER *)OpCodeData)->LineNumber][\r
+                                                                                      ((EFI_IFR_GUID_BANNER *)OpCodeData)->Alignment],\r
+                &((EFI_IFR_GUID_BANNER *)OpCodeData)->Title,\r
+                sizeof (EFI_STRING_ID)\r
+                );\r
             }\r
-            \r
-            CopyMem (\r
-              &gBannerData->Banner[((EFI_IFR_GUID_BANNER *) OpCodeData)->LineNumber][\r
-              ((EFI_IFR_GUID_BANNER *) OpCodeData)->Alignment],\r
-              &((EFI_IFR_GUID_BANNER *) OpCodeData)->Title,\r
-              sizeof (EFI_STRING_ID)\r
-              );\r
-          }\r
-          break;\r
 \r
-        case EFI_IFR_EXTEND_OP_SUBCLASS:\r
-          if (((EFI_IFR_GUID_SUBCLASS *) OpCodeData)->SubClass == EFI_FRONT_PAGE_SUBCLASS) {\r
-            gClassOfVfr = FORMSET_CLASS_FRONT_PAGE;\r
-          }\r
-          break;\r
+            break;\r
 \r
-        default:\r
-          break;\r
+          case EFI_IFR_EXTEND_OP_SUBCLASS:\r
+            if (((EFI_IFR_GUID_SUBCLASS *)OpCodeData)->SubClass == EFI_FRONT_PAGE_SUBCLASS) {\r
+              gClassOfVfr = FORMSET_CLASS_FRONT_PAGE;\r
+            }\r
+\r
+            break;\r
+\r
+          default:\r
+            break;\r
         }\r
       }\r
+\r
       break;\r
 \r
     default:\r
@@ -314,7 +336,7 @@ ProcessUserOpcode(
 \r
 /**\r
   Process some op codes which is out side of current form.\r
-  \r
+\r
   @param FormData                Pointer to the form data.\r
 \r
   @return EFI_SUCCESS            Pass the statement success.\r
@@ -322,26 +344,36 @@ ProcessUserOpcode(
 **/\r
 VOID\r
 ProcessExternedOpcode (\r
-  IN FORM_DISPLAY_ENGINE_FORM       *FormData\r
+  IN FORM_DISPLAY_ENGINE_FORM  *FormData\r
   )\r
 {\r
-  LIST_ENTRY                    *Link;\r
-  FORM_DISPLAY_ENGINE_STATEMENT *Statement;\r
+  LIST_ENTRY                     *Link;\r
+  LIST_ENTRY                     *NestLink;\r
+  FORM_DISPLAY_ENGINE_STATEMENT  *Statement;\r
+  FORM_DISPLAY_ENGINE_STATEMENT  *NestStatement;\r
 \r
   Link = GetFirstNode (&FormData->StatementListOSF);\r
   while (!IsNull (&FormData->StatementListOSF, Link)) {\r
     Statement = FORM_DISPLAY_ENGINE_STATEMENT_FROM_LINK (Link);\r
-    Link = GetNextNode (&FormData->StatementListOSF, Link);\r
+    Link      = GetNextNode (&FormData->StatementListOSF, Link);\r
 \r
-    ProcessUserOpcode(Statement->OpCode);\r
+    ProcessUserOpcode (Statement->OpCode);\r
   }\r
 \r
   Link = GetFirstNode (&FormData->StatementListHead);\r
   while (!IsNull (&FormData->StatementListHead, Link)) {\r
     Statement = FORM_DISPLAY_ENGINE_STATEMENT_FROM_LINK (Link);\r
-    Link = GetNextNode (&FormData->StatementListHead, Link);\r
+    Link      = GetNextNode (&FormData->StatementListHead, Link);\r
+\r
+    ProcessUserOpcode (Statement->OpCode);\r
 \r
-    ProcessUserOpcode(Statement->OpCode);\r
+    NestLink = GetFirstNode (&Statement->NestStatementList);\r
+    while (!IsNull (&Statement->NestStatementList, NestLink)) {\r
+      NestStatement = FORM_DISPLAY_ENGINE_STATEMENT_FROM_LINK (NestLink);\r
+      NestLink      = GetNextNode (&Statement->NestStatementList, NestLink);\r
+\r
+      ProcessUserOpcode (NestStatement->OpCode);\r
+    }\r
   }\r
 }\r
 \r
@@ -354,23 +386,23 @@ ProcessExternedOpcode (
   @return EFI_INVALID_PARAMETER  The input screen info is not acceptable.\r
 \r
 **/\r
-EFI_STATUS \r
+EFI_STATUS\r
 ScreenDiemensionInfoValidate (\r
-  IN FORM_DISPLAY_ENGINE_FORM       *FormData\r
+  IN FORM_DISPLAY_ENGINE_FORM  *FormData\r
   )\r
 {\r
-  LIST_ENTRY           *Link;\r
-  UINTN                Index;\r
+  LIST_ENTRY  *Link;\r
+  UINTN       Index;\r
 \r
   //\r
-  // Calculate total number of Register HotKeys. \r
+  // Calculate total number of Register HotKeys.\r
   //\r
   Index = 0;\r
-  if (!IsListEmpty (&FormData->HotKeyListHead)){\r
-    Link  = GetFirstNode (&FormData->HotKeyListHead);\r
+  if (!IsListEmpty (&FormData->HotKeyListHead)) {\r
+    Link = GetFirstNode (&FormData->HotKeyListHead);\r
     while (!IsNull (&FormData->HotKeyListHead, Link)) {\r
       Link = GetNextNode (&FormData->HotKeyListHead, Link);\r
-      Index ++;\r
+      Index++;\r
     }\r
   }\r
 \r
@@ -379,7 +411,6 @@ ScreenDiemensionInfoValidate (
   //\r
   gFooterHeight = FOOTER_HEIGHT + (Index / 3);\r
 \r
-\r
   ZeroMem (&gScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));\r
   gST->ConOut->QueryMode (\r
                  gST->ConOut,\r
@@ -394,7 +425,8 @@ ScreenDiemensionInfoValidate (
   if (FormData->ScreenDimensions != NULL) {\r
     if ((gScreenDimensions.RightColumn < FormData->ScreenDimensions->RightColumn) ||\r
         (gScreenDimensions.BottomRow < FormData->ScreenDimensions->BottomRow)\r
-        ) {\r
+        )\r
+    {\r
       return EFI_INVALID_PARAMETER;\r
     } else {\r
       //\r
@@ -404,8 +436,9 @@ ScreenDiemensionInfoValidate (
           (FormData->ScreenDimensions->BottomRow > FormData->ScreenDimensions->TopRow) &&\r
           ((FormData->ScreenDimensions->RightColumn - FormData->ScreenDimensions->LeftColumn) > 2) &&\r
           ((FormData->ScreenDimensions->BottomRow - FormData->ScreenDimensions->TopRow) > STATUS_BAR_HEIGHT +\r
-            FRONT_PAGE_HEADER_HEIGHT + gFooterHeight + 3)) {\r
-        CopyMem (&gScreenDimensions, (VOID *) FormData->ScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));\r
+           FRONT_PAGE_HEADER_HEIGHT + gFooterHeight + 3))\r
+      {\r
+        CopyMem (&gScreenDimensions, (VOID *)FormData->ScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));\r
       } else {\r
         return EFI_INVALID_PARAMETER;\r
       }\r
@@ -427,8 +460,8 @@ ScreenDiemensionInfoValidate (
 **/\r
 CHAR16 *\r
 LibGetToken (\r
-  IN  EFI_STRING_ID                Token,\r
-  IN  EFI_HII_HANDLE               HiiHandle\r
+  IN  EFI_STRING_ID   Token,\r
+  IN  EFI_HII_HANDLE  HiiHandle\r
   )\r
 {\r
   EFI_STRING  String;\r
@@ -439,10 +472,9 @@ LibGetToken (
     ASSERT (String != NULL);\r
   }\r
 \r
-  return (CHAR16 *) String;\r
+  return (CHAR16 *)String;\r
 }\r
 \r
-\r
 /**\r
   Count the storage space of a Unicode string.\r
 \r
@@ -461,31 +493,32 @@ LibGetToken (
 **/\r
 UINTN\r
 LibGetStringWidth (\r
-  IN CHAR16               *String\r
+  IN CHAR16  *String\r
   )\r
 {\r
-  UINTN Index;\r
-  UINTN Count;\r
-  UINTN IncrementValue;\r
+  UINTN  Index;\r
+  UINTN  Count;\r
+  UINTN  IncrementValue;\r
 \r
   ASSERT (String != NULL);\r
   if (String == NULL) {\r
     return 0;\r
   }\r
 \r
-  Index           = 0;\r
-  Count           = 0;\r
-  IncrementValue  = 1;\r
+  Index          = 0;\r
+  Count          = 0;\r
+  IncrementValue = 1;\r
 \r
   do {\r
     //\r
     // Advance to the null-terminator or to the first width directive\r
     //\r
-    for (;\r
-         (String[Index] != NARROW_CHAR) && (String[Index] != WIDE_CHAR) && (String[Index] != 0);\r
-         Index++, Count = Count + IncrementValue\r
-        )\r
-      ;\r
+    for ( ;\r
+          (String[Index] != NARROW_CHAR) && (String[Index] != WIDE_CHAR) && (String[Index] != 0);\r
+          Index++, Count = Count + IncrementValue\r
+          )\r
+    {\r
+    }\r
 \r
     //\r
     // We hit the null-terminator, we now have a count\r
@@ -493,6 +526,7 @@ LibGetStringWidth (
     if (String[Index] == 0) {\r
       break;\r
     }\r
+\r
     //\r
     // We encountered a narrow directive - strip it from the size calculation since it doesn't get printed\r
     // and also set the flag that determines what we increment by.(if narrow, increment by 1, if wide increment by 2)\r
@@ -524,104 +558,146 @@ LibGetStringWidth (
   Show all registered HotKey help strings on bottom Rows.\r
 \r
   @param FormData          The curent input form data info.\r
+  @param SetState          Set HotKey or Clear HotKey\r
 \r
 **/\r
 VOID\r
 PrintHotKeyHelpString (\r
-  IN FORM_DISPLAY_ENGINE_FORM      *FormData\r
+  IN FORM_DISPLAY_ENGINE_FORM  *FormData,\r
+  IN BOOLEAN                   SetState\r
   )\r
 {\r
   UINTN                  CurrentCol;\r
   UINTN                  CurrentRow;\r
   UINTN                  BottomRowOfHotKeyHelp;\r
+  UINTN                  ColumnIndexWidth;\r
   UINTN                  ColumnWidth;\r
+  UINTN                  ColumnIndex;\r
   UINTN                  Index;\r
   EFI_SCREEN_DESCRIPTOR  LocalScreen;\r
   LIST_ENTRY             *Link;\r
   BROWSER_HOT_KEY        *HotKey;\r
-\r
-  if (IsListEmpty (&FormData->HotKeyListHead)) {\r
-    return;\r
-  }\r
+  CHAR16                 BakChar;\r
+  CHAR16                 *ColumnStr;\r
 \r
   CopyMem (&LocalScreen, &gScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));\r
-  ColumnWidth            = (LocalScreen.RightColumn - LocalScreen.LeftColumn) / 3;\r
-  BottomRowOfHotKeyHelp  = LocalScreen.BottomRow - STATUS_BAR_HEIGHT - 3;\r
+  ColumnWidth           = (LocalScreen.RightColumn - LocalScreen.LeftColumn) / 3;\r
+  BottomRowOfHotKeyHelp = LocalScreen.BottomRow - STATUS_BAR_HEIGHT - 3;\r
+  ColumnStr             = gLibEmptyString;\r
 \r
   //\r
-  // Calculate total number of Register HotKeys. \r
+  // Calculate total number of Register HotKeys.\r
   //\r
   Index = 0;\r
   Link  = GetFirstNode (&FormData->HotKeyListHead);\r
   while (!IsNull (&FormData->HotKeyListHead, Link)) {\r
     HotKey = BROWSER_HOT_KEY_FROM_LINK (Link);\r
     //\r
-    // Help string can't exceed ColumnWidth. One Row will show three Help information. \r
-    //\r
-    if (StrLen (HotKey->HelpString) > ColumnWidth) {\r
-      HotKey->HelpString[ColumnWidth] = L'\0';\r
-    }\r
-    //\r
     // Calculate help information Column and Row.\r
     //\r
-    if ((Index % 3) != 2) {\r
-      CurrentCol = LocalScreen.LeftColumn + (2 - Index % 3) * ColumnWidth;\r
+    ColumnIndex = Index % 3;\r
+    if (ColumnIndex == 0) {\r
+      CurrentCol       = LocalScreen.LeftColumn + 2 * ColumnWidth;\r
+      ColumnIndexWidth = ColumnWidth - 1;\r
+    } else if (ColumnIndex == 1) {\r
+      CurrentCol       = LocalScreen.LeftColumn + ColumnWidth;\r
+      ColumnIndexWidth = ColumnWidth;\r
     } else {\r
-      CurrentCol = LocalScreen.LeftColumn + 2;\r
+      CurrentCol       = LocalScreen.LeftColumn + 2;\r
+      ColumnIndexWidth = ColumnWidth - 2;\r
     }\r
+\r
     CurrentRow = BottomRowOfHotKeyHelp - Index / 3;\r
+\r
+    //\r
+    // Help string can't exceed ColumnWidth. One Row will show three Help information.\r
+    //\r
+    BakChar = L'\0';\r
+    if (StrLen (HotKey->HelpString) > ColumnIndexWidth) {\r
+      BakChar                              = HotKey->HelpString[ColumnIndexWidth];\r
+      HotKey->HelpString[ColumnIndexWidth] = L'\0';\r
+    }\r
+\r
     //\r
     // Print HotKey help string on bottom Row.\r
     //\r
-    PrintStringAt (CurrentCol, CurrentRow, HotKey->HelpString);\r
+    if (SetState) {\r
+      ColumnStr = HotKey->HelpString;\r
+    }\r
+\r
+    PrintStringAtWithWidth (CurrentCol, CurrentRow, ColumnStr, ColumnIndexWidth);\r
+\r
+    if (BakChar != L'\0') {\r
+      HotKey->HelpString[ColumnIndexWidth] = BakChar;\r
+    }\r
 \r
     //\r
     // Get Next Hot Key.\r
     //\r
     Link = GetNextNode (&FormData->HotKeyListHead, Link);\r
-    Index ++;\r
+    Index++;\r
+  }\r
+\r
+  if (SetState) {\r
+    //\r
+    // Clear KeyHelp\r
+    //\r
+    CurrentRow  = BottomRowOfHotKeyHelp - Index / 3;\r
+    ColumnIndex = Index % 3;\r
+    if (ColumnIndex == 0) {\r
+      CurrentCol       = LocalScreen.LeftColumn + 2 * ColumnWidth;\r
+      ColumnIndexWidth = ColumnWidth - 1;\r
+      ColumnIndex++;\r
+      PrintStringAtWithWidth (CurrentCol, CurrentRow, gLibEmptyString, ColumnIndexWidth);\r
+    }\r
+\r
+    if (ColumnIndex == 1) {\r
+      CurrentCol       = LocalScreen.LeftColumn + ColumnWidth;\r
+      ColumnIndexWidth = ColumnWidth;\r
+      PrintStringAtWithWidth (CurrentCol, CurrentRow, gLibEmptyString, ColumnIndexWidth);\r
+    }\r
   }\r
-  \r
+\r
   return;\r
 }\r
 \r
 /**\r
   Get step info from numeric opcode.\r
-  \r
+\r
   @param[in] OpCode     The input numeric op code.\r
 \r
   @return step info for this opcode.\r
 **/\r
 UINT64\r
 LibGetFieldFromNum (\r
-  IN  EFI_IFR_OP_HEADER     *OpCode\r
+  IN  EFI_IFR_OP_HEADER  *OpCode\r
   )\r
 {\r
-  EFI_IFR_NUMERIC       *NumericOp;\r
-  UINT64                Step;\r
+  EFI_IFR_NUMERIC  *NumericOp;\r
+  UINT64           Step;\r
+\r
+  NumericOp = (EFI_IFR_NUMERIC *)OpCode;\r
 \r
-  NumericOp = (EFI_IFR_NUMERIC *) OpCode;\r
-  \r
   switch (NumericOp->Flags & EFI_IFR_NUMERIC_SIZE) {\r
-  case EFI_IFR_NUMERIC_SIZE_1:\r
-    Step    = NumericOp->data.u8.Step;\r
-    break;\r
-  \r
-  case EFI_IFR_NUMERIC_SIZE_2:\r
-    Step    = NumericOp->data.u16.Step;\r
-    break;\r
-  \r
-  case EFI_IFR_NUMERIC_SIZE_4:\r
-    Step    = NumericOp->data.u32.Step;\r
-    break;\r
-  \r
-  case EFI_IFR_NUMERIC_SIZE_8:\r
-    Step    = NumericOp->data.u64.Step;\r
-    break;\r
-  \r
-  default:\r
-    Step = 0;\r
-    break;\r
+    case EFI_IFR_NUMERIC_SIZE_1:\r
+      Step = NumericOp->data.u8.Step;\r
+      break;\r
+\r
+    case EFI_IFR_NUMERIC_SIZE_2:\r
+      Step = NumericOp->data.u16.Step;\r
+      break;\r
+\r
+    case EFI_IFR_NUMERIC_SIZE_4:\r
+      Step = NumericOp->data.u32.Step;\r
+      break;\r
+\r
+    case EFI_IFR_NUMERIC_SIZE_8:\r
+      Step = NumericOp->data.u64.Step;\r
+      break;\r
+\r
+    default:\r
+      Step = 0;\r
+      break;\r
   }\r
 \r
   return Step;\r
@@ -636,30 +712,30 @@ InitializeLibStrings (
   VOID\r
   )\r
 {\r
-  mLibUnknownString        = L"!";\r
-\r
-  gEnterString          = LibGetToken (STRING_TOKEN (ENTER_STRING), mCDLStringPackHandle);\r
-  gEnterCommitString    = LibGetToken (STRING_TOKEN (ENTER_COMMIT_STRING), mCDLStringPackHandle);\r
-  gEnterEscapeString    = LibGetToken (STRING_TOKEN (ENTER_ESCAPE_STRING), mCDLStringPackHandle);\r
-  gEscapeString         = LibGetToken (STRING_TOKEN (ESCAPE_STRING), mCDLStringPackHandle);\r
-  gMoveHighlight        = LibGetToken (STRING_TOKEN (MOVE_HIGHLIGHT), mCDLStringPackHandle);\r
-  gDecNumericInput      = LibGetToken (STRING_TOKEN (DEC_NUMERIC_INPUT), mCDLStringPackHandle);\r
-  gHexNumericInput      = LibGetToken (STRING_TOKEN (HEX_NUMERIC_INPUT), mCDLStringPackHandle);\r
-  gToggleCheckBox       = LibGetToken (STRING_TOKEN (TOGGLE_CHECK_BOX), mCDLStringPackHandle);\r
-\r
-  gAreYouSure           = LibGetToken (STRING_TOKEN (ARE_YOU_SURE), mCDLStringPackHandle);\r
-  gYesResponse          = LibGetToken (STRING_TOKEN (ARE_YOU_SURE_YES), mCDLStringPackHandle);\r
-  gNoResponse           = LibGetToken (STRING_TOKEN (ARE_YOU_SURE_NO), mCDLStringPackHandle);\r
-  gPlusString           = LibGetToken (STRING_TOKEN (PLUS_STRING), mCDLStringPackHandle);\r
-  gMinusString          = LibGetToken (STRING_TOKEN (MINUS_STRING), mCDLStringPackHandle);\r
-  gAdjustNumber         = LibGetToken (STRING_TOKEN (ADJUST_NUMBER), mCDLStringPackHandle);\r
-  gSaveChanges          = LibGetToken (STRING_TOKEN (SAVE_CHANGES), mCDLStringPackHandle);\r
-\r
-  gLibEmptyString       = LibGetToken (STRING_TOKEN (EMPTY_STRING), mCDLStringPackHandle);\r
-\r
-  gNvUpdateMessage      = LibGetToken (STRING_TOKEN (NV_UPDATE_MESSAGE), mCDLStringPackHandle);\r
-  gInputErrorMessage    = LibGetToken (STRING_TOKEN (INPUT_ERROR_MESSAGE), mCDLStringPackHandle);\r
-  \r
+  mLibUnknownString = L"!";\r
+\r
+  gEnterString       = LibGetToken (STRING_TOKEN (ENTER_STRING), mCDLStringPackHandle);\r
+  gEnterCommitString = LibGetToken (STRING_TOKEN (ENTER_COMMIT_STRING), mCDLStringPackHandle);\r
+  gEnterEscapeString = LibGetToken (STRING_TOKEN (ENTER_ESCAPE_STRING), mCDLStringPackHandle);\r
+  gEscapeString      = LibGetToken (STRING_TOKEN (ESCAPE_STRING), mCDLStringPackHandle);\r
+  gMoveHighlight     = LibGetToken (STRING_TOKEN (MOVE_HIGHLIGHT), mCDLStringPackHandle);\r
+  gDecNumericInput   = LibGetToken (STRING_TOKEN (DEC_NUMERIC_INPUT), mCDLStringPackHandle);\r
+  gHexNumericInput   = LibGetToken (STRING_TOKEN (HEX_NUMERIC_INPUT), mCDLStringPackHandle);\r
+  gToggleCheckBox    = LibGetToken (STRING_TOKEN (TOGGLE_CHECK_BOX), mCDLStringPackHandle);\r
+\r
+  gAreYouSure   = LibGetToken (STRING_TOKEN (ARE_YOU_SURE), mCDLStringPackHandle);\r
+  gYesResponse  = LibGetToken (STRING_TOKEN (ARE_YOU_SURE_YES), mCDLStringPackHandle);\r
+  gNoResponse   = LibGetToken (STRING_TOKEN (ARE_YOU_SURE_NO), mCDLStringPackHandle);\r
+  gPlusString   = LibGetToken (STRING_TOKEN (PLUS_STRING), mCDLStringPackHandle);\r
+  gMinusString  = LibGetToken (STRING_TOKEN (MINUS_STRING), mCDLStringPackHandle);\r
+  gAdjustNumber = LibGetToken (STRING_TOKEN (ADJUST_NUMBER), mCDLStringPackHandle);\r
+  gSaveChanges  = LibGetToken (STRING_TOKEN (SAVE_CHANGES), mCDLStringPackHandle);\r
+\r
+  gLibEmptyString = LibGetToken (STRING_TOKEN (EMPTY_STRING), mCDLStringPackHandle);\r
+\r
+  gNvUpdateMessage   = LibGetToken (STRING_TOKEN (NV_UPDATE_MESSAGE), mCDLStringPackHandle);\r
+  gInputErrorMessage = LibGetToken (STRING_TOKEN (INPUT_ERROR_MESSAGE), mCDLStringPackHandle);\r
+\r
   //\r
   // SpaceBuffer;\r
   //\r
@@ -669,7 +745,6 @@ InitializeLibStrings (
   mSpaceBuffer[SPACE_BUFFER_SIZE] = L'\0';\r
 }\r
 \r
-\r
 /**\r
   Free the HII String.\r
 \r
@@ -700,7 +775,7 @@ FreeLibStrings (
 \r
   FreePool (gNvUpdateMessage);\r
   FreePool (gInputErrorMessage);\r
-  \r
+\r
   FreePool (mSpaceBuffer);\r
 }\r
 \r
@@ -714,7 +789,7 @@ FreeLibStrings (
 **/\r
 EFI_STATUS\r
 WaitForKeyStroke (\r
-  OUT  EFI_INPUT_KEY           *Key\r
+  OUT  EFI_INPUT_KEY  *Key\r
   )\r
 {\r
   EFI_STATUS  Status;\r
@@ -729,13 +804,13 @@ WaitForKeyStroke (
     if (Status != EFI_NOT_READY) {\r
       continue;\r
     }\r
-    \r
+\r
     gBS->WaitForEvent (1, &gST->ConIn->WaitForKey, &Index);\r
   }\r
+\r
   return Status;\r
 }\r
 \r
-\r
 /**\r
   Set Buffer to Value for Size bytes.\r
 \r
@@ -746,9 +821,9 @@ WaitForKeyStroke (
 **/\r
 VOID\r
 LibSetUnicodeMem (\r
-  IN VOID   *Buffer,\r
-  IN UINTN  Size,\r
-  IN CHAR16 Value\r
+  IN VOID    *Buffer,\r
+  IN UINTN   Size,\r
+  IN CHAR16  Value\r
   )\r
 {\r
   CHAR16  *Ptr;\r
@@ -775,7 +850,7 @@ LibSetUnicodeMem (
 **/\r
 UINTN\r
 PrintInternal (\r
-  IN UINTN                            Width, \r
+  IN UINTN                            Width,\r
   IN UINTN                            Column,\r
   IN UINTN                            Row,\r
   IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *Out,\r
@@ -788,18 +863,19 @@ PrintInternal (
   UINTN   Index;\r
   UINTN   PreviousIndex;\r
   UINTN   Count;\r
+  UINTN   TotalCount;\r
   UINTN   PrintWidth;\r
   UINTN   CharWidth;\r
 \r
   //\r
   // For now, allocate an arbitrarily long buffer\r
   //\r
-  Buffer        = AllocateZeroPool (0x10000);\r
-  BackupBuffer  = AllocateZeroPool (0x10000);\r
+  Buffer       = AllocateZeroPool (0x10000);\r
+  BackupBuffer = AllocateZeroPool (0x10000);\r
   ASSERT (Buffer);\r
   ASSERT (BackupBuffer);\r
 \r
-  if (Column != (UINTN) -1) {\r
+  if (Column != (UINTN)-1) {\r
     Out->SetCursorPosition (Out, Column, Row);\r
   }\r
 \r
@@ -812,28 +888,26 @@ PrintInternal (
   Index         = 0;\r
   PreviousIndex = 0;\r
   Count         = 0;\r
+  TotalCount    = 0;\r
   PrintWidth    = 0;\r
   CharWidth     = 1;\r
 \r
   do {\r
-    for (; (Buffer[Index] != NARROW_CHAR) && (Buffer[Index] != WIDE_CHAR) && (Buffer[Index] != 0); Index++) {\r
+    for ( ; (Buffer[Index] != NARROW_CHAR) && (Buffer[Index] != WIDE_CHAR) && (Buffer[Index] != 0); Index++) {\r
       BackupBuffer[Index] = Buffer[Index];\r
     }\r
 \r
     if (Buffer[Index] == 0) {\r
       break;\r
     }\r
-    //\r
-    // Null-terminate the temporary string\r
-    //\r
-    BackupBuffer[Index] = 0;\r
 \r
     //\r
     // Print this out, we are about to switch widths\r
     //\r
     Out->OutputString (Out, &BackupBuffer[PreviousIndex]);\r
-    Count += StrLen (&BackupBuffer[PreviousIndex]);\r
+    Count       = StrLen (&BackupBuffer[PreviousIndex]);\r
     PrintWidth += Count * CharWidth;\r
+    TotalCount += Count;\r
 \r
     //\r
     // Preserve the current index + 1, since this is where we will start printing from next\r
@@ -860,15 +934,15 @@ PrintInternal (
     }\r
 \r
     Index++;\r
-\r
   } while (Buffer[Index] != 0);\r
 \r
   //\r
   // We hit the end of the string - print it\r
   //\r
   Out->OutputString (Out, &BackupBuffer[PreviousIndex]);\r
-  Count += StrLen (&BackupBuffer[PreviousIndex]);\r
+  Count       = StrLen (&BackupBuffer[PreviousIndex]);\r
   PrintWidth += Count * CharWidth;\r
+  TotalCount += Count;\r
   if (PrintWidth < Width) {\r
     Out->Mode->Attribute = Out->Mode->Attribute & 0x7f;\r
     Out->SetAttribute (Out, Out->Mode->Attribute);\r
@@ -877,7 +951,7 @@ PrintInternal (
 \r
   FreePool (Buffer);\r
   FreePool (BackupBuffer);\r
-  return Count;\r
+  return TotalCount;\r
 }\r
 \r
 /**\r
@@ -896,19 +970,18 @@ PrintInternal (
 UINTN\r
 EFIAPI\r
 PrintAt (\r
-  IN UINTN     Width,\r
-  IN UINTN     Column,\r
-  IN UINTN     Row,\r
-  IN CHAR16    *Fmt,\r
+  IN UINTN   Width,\r
+  IN UINTN   Column,\r
+  IN UINTN   Row,\r
+  IN CHAR16  *Fmt,\r
   ...\r
   )\r
 {\r
-  VA_LIST Args;\r
-  UINTN   LengthOfPrinted;\r
+  VA_LIST  Args;\r
+  UINTN    LengthOfPrinted;\r
 \r
   VA_START (Args, Fmt);\r
   LengthOfPrinted = PrintInternal (Width, Column, Row, gST->ConOut, Fmt, Args);\r
   VA_END (Args);\r
   return LengthOfPrinted;\r
 }\r
-\r