]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/DisplayEngineDxe/InputHandler.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / MdeModulePkg / Universal / DisplayEngineDxe / InputHandler.c
index 732dd2f3de7a070413a8e7a0d98201f0f361e48d..f70feeb55f0e80aab6c40669c7b1aaeb08b465ca 100644 (file)
@@ -1,14 +1,8 @@
 /** @file\r
 Implementation for handling user input from the User Interfaces.\r
 \r
-Copyright (c) 2004 - 2015, 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
@@ -24,24 +18,25 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 **/\r
 VOID\r
 GetFieldFromOp (\r
-  IN   EFI_IFR_OP_HEADER       *OpCode,\r
-  OUT  UINTN                   *Minimum,\r
-  OUT  UINTN                   *Maximum\r
+  IN   EFI_IFR_OP_HEADER  *OpCode,\r
+  OUT  UINTN              *Minimum,\r
+  OUT  UINTN              *Maximum\r
   )\r
 {\r
   EFI_IFR_STRING    *StringOp;\r
   EFI_IFR_PASSWORD  *PasswordOp;\r
+\r
   if (OpCode->OpCode == EFI_IFR_STRING_OP) {\r
-    StringOp = (EFI_IFR_STRING *) OpCode;\r
+    StringOp = (EFI_IFR_STRING *)OpCode;\r
     *Minimum = StringOp->MinSize;\r
-    *Maximum = StringOp->MaxSize;    \r
+    *Maximum = StringOp->MaxSize;\r
   } else if (OpCode->OpCode == EFI_IFR_PASSWORD_OP) {\r
-    PasswordOp = (EFI_IFR_PASSWORD *) OpCode;\r
-    *Minimum = PasswordOp->MinSize;\r
-    *Maximum = PasswordOp->MaxSize;       \r
+    PasswordOp = (EFI_IFR_PASSWORD *)OpCode;\r
+    *Minimum   = PasswordOp->MinSize;\r
+    *Maximum   = PasswordOp->MaxSize;\r
   } else {\r
     *Minimum = 0;\r
-    *Maximum = 0;       \r
+    *Maximum = 0;\r
   }\r
 }\r
 \r
@@ -58,44 +53,44 @@ GetFieldFromOp (
 **/\r
 EFI_STATUS\r
 ReadString (\r
-  IN     UI_MENU_OPTION              *MenuOption,\r
-  IN     CHAR16                      *Prompt,\r
-  IN OUT CHAR16                      *StringPtr\r
+  IN     UI_MENU_OPTION  *MenuOption,\r
+  IN     CHAR16          *Prompt,\r
+  IN OUT CHAR16          *StringPtr\r
   )\r
 {\r
-  EFI_STATUS              Status;\r
-  EFI_INPUT_KEY           Key;\r
-  CHAR16                  NullCharacter;\r
-  UINTN                   ScreenSize;\r
-  CHAR16                  Space[2];\r
-  CHAR16                  KeyPad[2];\r
-  CHAR16                  *TempString;\r
-  CHAR16                  *BufferedString;\r
-  UINTN                   Index;\r
-  UINTN                   Index2;\r
-  UINTN                   Count;\r
-  UINTN                   Start;\r
-  UINTN                   Top;\r
-  UINTN                   DimensionsWidth;\r
-  UINTN                   DimensionsHeight;\r
-  UINTN                   CurrentCursor;\r
-  BOOLEAN                 CursorVisible;\r
-  UINTN                   Minimum;\r
-  UINTN                   Maximum;\r
+  EFI_STATUS                     Status;\r
+  EFI_INPUT_KEY                  Key;\r
+  CHAR16                         NullCharacter;\r
+  UINTN                          ScreenSize;\r
+  CHAR16                         Space[2];\r
+  CHAR16                         KeyPad[2];\r
+  CHAR16                         *TempString;\r
+  CHAR16                         *BufferedString;\r
+  UINTN                          Index;\r
+  UINTN                          Index2;\r
+  UINTN                          Count;\r
+  UINTN                          Start;\r
+  UINTN                          Top;\r
+  UINTN                          DimensionsWidth;\r
+  UINTN                          DimensionsHeight;\r
+  UINTN                          CurrentCursor;\r
+  BOOLEAN                        CursorVisible;\r
+  UINTN                          Minimum;\r
+  UINTN                          Maximum;\r
   FORM_DISPLAY_ENGINE_STATEMENT  *Question;\r
-  BOOLEAN                 IsPassword;\r
-  UINTN                   MaxLen;\r
+  BOOLEAN                        IsPassword;\r
+  UINTN                          MaxLen;\r
 \r
   DimensionsWidth  = gStatementDimensions.RightColumn - gStatementDimensions.LeftColumn;\r
   DimensionsHeight = gStatementDimensions.BottomRow - gStatementDimensions.TopRow;\r
 \r
-  NullCharacter    = CHAR_NULL;\r
-  ScreenSize       = GetStringWidth (Prompt) / sizeof (CHAR16);\r
-  Space[0]         = L' ';\r
-  Space[1]         = CHAR_NULL;\r
+  NullCharacter = CHAR_NULL;\r
+  ScreenSize    = GetStringWidth (Prompt) / sizeof (CHAR16);\r
+  Space[0]      = L' ';\r
+  Space[1]      = CHAR_NULL;\r
 \r
-  Question         = MenuOption->ThisTag;\r
-  GetFieldFromOp(Question->OpCode, &Minimum, &Maximum);\r
+  Question = MenuOption->ThisTag;\r
+  GetFieldFromOp (Question->OpCode, &Minimum, &Maximum);\r
 \r
   if (Question->OpCode->OpCode == EFI_IFR_PASSWORD_OP) {\r
     IsPassword = TRUE;\r
@@ -103,7 +98,7 @@ ReadString (
     IsPassword = FALSE;\r
   }\r
 \r
-  MaxLen = Maximum + 1;\r
+  MaxLen     = Maximum + 1;\r
   TempString = AllocateZeroPool (MaxLen * sizeof (CHAR16));\r
   ASSERT (TempString);\r
 \r
@@ -160,155 +155,161 @@ ReadString (
     if (!IsPassword) {\r
       PrintStringAt (Start + 1, Top + 3, BufferedString);\r
     }\r
-    \r
+\r
     gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
     gST->ConOut->SetCursorPosition (gST->ConOut, Start + GetStringWidth (StringPtr) / 2, Top + 3);\r
   }\r
-  \r
+\r
   do {\r
     Status = WaitForKeyStroke (&Key);\r
     ASSERT_EFI_ERROR (Status);\r
 \r
     gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_BLACK, EFI_LIGHTGRAY));\r
     switch (Key.UnicodeChar) {\r
-    case CHAR_NULL:\r
-      switch (Key.ScanCode) {\r
-      case SCAN_LEFT:\r
-        if (CurrentCursor > 0) {\r
-          CurrentCursor--;\r
-        }\r
-        break;\r
+      case CHAR_NULL:\r
+        switch (Key.ScanCode) {\r
+          case SCAN_LEFT:\r
+            if (CurrentCursor > 0) {\r
+              CurrentCursor--;\r
+            }\r
 \r
-      case SCAN_RIGHT:\r
-        if (CurrentCursor < (GetStringWidth (StringPtr) / 2 - 1)) {\r
-          CurrentCursor++;\r
+            break;\r
+\r
+          case SCAN_RIGHT:\r
+            if (CurrentCursor < (GetStringWidth (StringPtr) / 2 - 1)) {\r
+              CurrentCursor++;\r
+            }\r
+\r
+            break;\r
+\r
+          case SCAN_ESC:\r
+            FreePool (TempString);\r
+            FreePool (BufferedString);\r
+            gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
+            gST->ConOut->EnableCursor (gST->ConOut, CursorVisible);\r
+            return EFI_DEVICE_ERROR;\r
+\r
+          case SCAN_DELETE:\r
+            for (Index = CurrentCursor; StringPtr[Index] != CHAR_NULL; Index++) {\r
+              StringPtr[Index] = StringPtr[Index + 1];\r
+              PrintCharAt (Start + Index + 1, Top + 3, IsPassword && StringPtr[Index] != CHAR_NULL ? L'*' : StringPtr[Index]);\r
+            }\r
+\r
+            break;\r
+\r
+          default:\r
+            break;\r
         }\r
+\r
         break;\r
 \r
-      case SCAN_ESC:\r
-        FreePool (TempString);\r
-        FreePool (BufferedString);\r
-        gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
-        gST->ConOut->EnableCursor (gST->ConOut, CursorVisible);\r
-        return EFI_DEVICE_ERROR;\r
-\r
-       case SCAN_DELETE:\r
-        for (Index = CurrentCursor; StringPtr[Index] != CHAR_NULL; Index++) {\r
-          StringPtr[Index] = StringPtr[Index + 1];\r
-          PrintCharAt (Start + Index + 1, Top + 3, IsPassword && StringPtr[Index] != CHAR_NULL? L'*' : StringPtr[Index]);\r
+      case CHAR_CARRIAGE_RETURN:\r
+        if (GetStringWidth (StringPtr) >= ((Minimum + 1) * sizeof (CHAR16))) {\r
+          FreePool (TempString);\r
+          FreePool (BufferedString);\r
+          gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
+          gST->ConOut->EnableCursor (gST->ConOut, CursorVisible);\r
+          return EFI_SUCCESS;\r
+        } else {\r
+          //\r
+          // Simply create a popup to tell the user that they had typed in too few characters.\r
+          // To save code space, we can then treat this as an error and return back to the menu.\r
+          //\r
+          do {\r
+            CreateDialog (&Key, &NullCharacter, gMiniString, gPressEnter, &NullCharacter, NULL);\r
+          } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
+\r
+          FreePool (TempString);\r
+          FreePool (BufferedString);\r
+          gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
+          gST->ConOut->EnableCursor (gST->ConOut, CursorVisible);\r
+          return EFI_DEVICE_ERROR;\r
         }\r
-        break;\r
 \r
-      default:\r
-        break;\r
-      }\r
+      case CHAR_BACKSPACE:\r
+        if ((StringPtr[0] != CHAR_NULL) && (CurrentCursor != 0)) {\r
+          for (Index = 0; Index < CurrentCursor - 1; Index++) {\r
+            TempString[Index] = StringPtr[Index];\r
+          }\r
 \r
-      break;\r
+          Count = GetStringWidth (StringPtr) / 2 - 1;\r
+          if (Count >= CurrentCursor) {\r
+            for (Index = CurrentCursor - 1, Index2 = CurrentCursor; Index2 < Count; Index++, Index2++) {\r
+              TempString[Index] = StringPtr[Index2];\r
+            }\r
 \r
-    case CHAR_CARRIAGE_RETURN:\r
-      if (GetStringWidth (StringPtr) >= ((Minimum + 1) * sizeof (CHAR16))) {\r
+            TempString[Index] = CHAR_NULL;\r
+          }\r
 \r
-        FreePool (TempString);\r
-        FreePool (BufferedString);\r
-        gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
-        gST->ConOut->EnableCursor (gST->ConOut, CursorVisible);\r
-        return EFI_SUCCESS;\r
-      } else {\r
+          //\r
+          // Effectively truncate string by 1 character\r
+          //\r
+          StrCpyS (StringPtr, MaxLen, TempString);\r
+          CurrentCursor--;\r
+        }\r
+\r
+      default:\r
         //\r
-        // Simply create a popup to tell the user that they had typed in too few characters.\r
-        // To save code space, we can then treat this as an error and return back to the menu.\r
+        // If it is the beginning of the string, don't worry about checking maximum limits\r
         //\r
-        do {\r
-          CreateDialog (&Key, &NullCharacter, gMiniString, gPressEnter, &NullCharacter, NULL);\r
-        } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
-\r
-        FreePool (TempString);\r
-        FreePool (BufferedString);\r
-        gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
-        gST->ConOut->EnableCursor (gST->ConOut, CursorVisible);\r
-        return EFI_DEVICE_ERROR;\r
-      }\r
-\r
+        if ((StringPtr[0] == CHAR_NULL) && (Key.UnicodeChar != CHAR_BACKSPACE)) {\r
+          StrnCpyS (StringPtr, MaxLen, &Key.UnicodeChar, 1);\r
+          CurrentCursor++;\r
+        } else if ((GetStringWidth (StringPtr) < ((Maximum + 1) * sizeof (CHAR16))) && (Key.UnicodeChar != CHAR_BACKSPACE)) {\r
+          KeyPad[0] = Key.UnicodeChar;\r
+          KeyPad[1] = CHAR_NULL;\r
+          Count     = GetStringWidth (StringPtr) / 2 - 1;\r
+          if (CurrentCursor < Count) {\r
+            for (Index = 0; Index < CurrentCursor; Index++) {\r
+              TempString[Index] = StringPtr[Index];\r
+            }\r
 \r
-    case CHAR_BACKSPACE:\r
-      if (StringPtr[0] != CHAR_NULL && CurrentCursor != 0) {\r
-        for (Index = 0; Index < CurrentCursor - 1; Index++) {\r
-          TempString[Index] = StringPtr[Index];\r
-        }\r
-        Count = GetStringWidth (StringPtr) / 2 - 1;\r
-        if (Count >= CurrentCursor) {\r
-          for (Index = CurrentCursor - 1, Index2 = CurrentCursor; Index2 < Count; Index++, Index2++) {\r
-            TempString[Index] = StringPtr[Index2];\r
+            TempString[Index] = CHAR_NULL;\r
+            StrCatS (TempString, MaxLen, KeyPad);\r
+            StrCatS (TempString, MaxLen, StringPtr + CurrentCursor);\r
+            StrCpyS (StringPtr, MaxLen, TempString);\r
+          } else {\r
+            StrCatS (StringPtr, MaxLen, KeyPad);\r
           }\r
-          TempString[Index] = CHAR_NULL;\r
+\r
+          CurrentCursor++;\r
         }\r
+\r
         //\r
-        // Effectively truncate string by 1 character\r
+        // If the width of the input string is now larger than the screen, we nee to\r
+        // adjust the index to start printing portions of the string\r
         //\r
-        StrCpyS (StringPtr, MaxLen, TempString);\r
-        CurrentCursor --;\r
-      }\r
+        SetUnicodeMem (BufferedString, ScreenSize - 1, L' ');\r
+        PrintStringAt (Start + 1, Top + 3, BufferedString);\r
 \r
-    default:\r
-      //\r
-      // If it is the beginning of the string, don't worry about checking maximum limits\r
-      //\r
-      if ((StringPtr[0] == CHAR_NULL) && (Key.UnicodeChar != CHAR_BACKSPACE)) {\r
-        StrnCpyS (StringPtr, MaxLen, &Key.UnicodeChar, 1);\r
-        CurrentCursor++;\r
-      } else if ((GetStringWidth (StringPtr) < ((Maximum + 1) * sizeof (CHAR16))) && (Key.UnicodeChar != CHAR_BACKSPACE)) {\r
-        KeyPad[0] = Key.UnicodeChar;\r
-        KeyPad[1] = CHAR_NULL;\r
-        Count = GetStringWidth (StringPtr) / 2 - 1;\r
-        if (CurrentCursor < Count) {\r
-          for (Index = 0; Index < CurrentCursor; Index++) {\r
-            TempString[Index] = StringPtr[Index];\r
-          }\r
-                 TempString[Index] = CHAR_NULL;\r
-          StrCatS (TempString, MaxLen, KeyPad);\r
-          StrCatS (TempString, MaxLen, StringPtr + CurrentCursor);\r
-          StrCpyS (StringPtr, MaxLen, TempString);\r
+        if ((GetStringWidth (StringPtr) / 2) > (DimensionsWidth - 2)) {\r
+          Index = (GetStringWidth (StringPtr) / 2) - DimensionsWidth + 2;\r
         } else {\r
-          StrCatS (StringPtr, MaxLen, KeyPad);\r
+          Index = 0;\r
         }\r
-        CurrentCursor++;\r
-      }\r
-\r
-      //\r
-      // If the width of the input string is now larger than the screen, we nee to\r
-      // adjust the index to start printing portions of the string\r
-      //\r
-      SetUnicodeMem (BufferedString, ScreenSize - 1, L' ');\r
-      PrintStringAt (Start + 1, Top + 3, BufferedString);\r
 \r
-      if ((GetStringWidth (StringPtr) / 2) > (DimensionsWidth - 2)) {\r
-        Index = (GetStringWidth (StringPtr) / 2) - DimensionsWidth + 2;\r
-      } else {\r
-        Index = 0;\r
-      }\r
+        if (IsPassword) {\r
+          gST->ConOut->SetCursorPosition (gST->ConOut, Start + 1, Top + 3);\r
+        }\r
 \r
-      if (IsPassword) {\r
-        gST->ConOut->SetCursorPosition (gST->ConOut, Start + 1, Top + 3);\r
-      }\r
+        for (Count = 0; Index + 1 < GetStringWidth (StringPtr) / 2; Index++, Count++) {\r
+          BufferedString[Count] = StringPtr[Index];\r
 \r
-      for (Count = 0; Index + 1 < GetStringWidth (StringPtr) / 2; Index++, Count++) {\r
-        BufferedString[Count] = StringPtr[Index];\r
+          if (IsPassword) {\r
+            PrintCharAt ((UINTN)-1, (UINTN)-1, L'*');\r
+          }\r
+        }\r
 \r
-        if (IsPassword) {\r
-          PrintCharAt ((UINTN)-1, (UINTN)-1, L'*');\r
+        if (!IsPassword) {\r
+          PrintStringAt (Start + 1, Top + 3, BufferedString);\r
         }\r
-      }\r
 \r
-      if (!IsPassword) {\r
-        PrintStringAt (Start + 1, Top + 3, BufferedString);\r
-      }\r
-      break;\r
+        break;\r
     }\r
 \r
     gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
     gST->ConOut->SetCursorPosition (gST->ConOut, Start + CurrentCursor + 1, Top + 3);\r
   } while (TRUE);\r
-\r
 }\r
 \r
 /**\r
@@ -321,36 +322,37 @@ ReadString (
 **/\r
 VOID\r
 AdjustQuestionValue (\r
-  IN  EFI_HII_VALUE           *QuestionValue,\r
-  IN  UINT8                   Sequence\r
+  IN  EFI_HII_VALUE  *QuestionValue,\r
+  IN  UINT8          Sequence\r
   )\r
 {\r
-  UINT8     Month;\r
-  UINT16    Year;\r
-  UINT8     Maximum;\r
-  UINT8     Minimum;\r
+  UINT8   Month;\r
+  UINT16  Year;\r
+  UINT8   Maximum;\r
+  UINT8   Minimum;\r
 \r
   Month   = QuestionValue->Value.date.Month;\r
   Year    = QuestionValue->Value.date.Year;\r
   Minimum = 1;\r
 \r
   switch (Month) {\r
-  case 2:\r
-    if ((Year % 4) == 0 && ((Year % 100) != 0 || (Year % 400) == 0)) {\r
-      Maximum = 29;\r
-    } else {\r
-      Maximum = 28;\r
-    }\r
-    break;\r
-  case 4:\r
-  case 6:\r
-  case 9:\r
-  case 11:\r
-    Maximum = 30;\r
-    break;\r
-  default:\r
-    Maximum = 31;\r
-    break;\r
+    case 2:\r
+      if (((Year % 4) == 0) && (((Year % 100) != 0) || ((Year % 400) == 0))) {\r
+        Maximum = 29;\r
+      } else {\r
+        Maximum = 28;\r
+      }\r
+\r
+      break;\r
+    case 4:\r
+    case 6:\r
+    case 9:\r
+    case 11:\r
+      Maximum = 30;\r
+      break;\r
+    default:\r
+      Maximum = 31;\r
+      break;\r
   }\r
 \r
   //\r
@@ -361,7 +363,7 @@ AdjustQuestionValue (
       QuestionValue->Value.date.Day = Maximum;\r
     }\r
   }\r
-  \r
+\r
   //\r
   // Change the Year area.\r
   //\r
@@ -387,83 +389,87 @@ AdjustQuestionValue (
 **/\r
 VOID\r
 GetValueFromNum (\r
-  IN  EFI_IFR_OP_HEADER     *OpCode,\r
-  IN  BOOLEAN               IntInput,\r
-  IN  EFI_HII_VALUE         *QuestionValue,\r
-  OUT UINT64                *Value,\r
-  OUT UINT64                *Minimum,\r
-  OUT UINT64                *Maximum,\r
-  OUT UINT64                *Step,\r
-  OUT UINT16                *StorageWidth\r
-)\r
+  IN  EFI_IFR_OP_HEADER  *OpCode,\r
+  IN  BOOLEAN            IntInput,\r
+  IN  EFI_HII_VALUE      *QuestionValue,\r
+  OUT UINT64             *Value,\r
+  OUT UINT64             *Minimum,\r
+  OUT UINT64             *Maximum,\r
+  OUT UINT64             *Step,\r
+  OUT UINT16             *StorageWidth\r
+  )\r
 {\r
-  EFI_IFR_NUMERIC       *NumericOp;\r
+  EFI_IFR_NUMERIC  *NumericOp;\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
-    if (IntInput) {\r
-      *Minimum = (INT64) (INT8) NumericOp->data.u8.MinValue;\r
-      *Maximum = (INT64) (INT8) NumericOp->data.u8.MaxValue;\r
-      *Value   = (INT64) (INT8) QuestionValue->Value.u8;\r
-    } else {\r
-      *Minimum = NumericOp->data.u8.MinValue;\r
-      *Maximum = NumericOp->data.u8.MaxValue;\r
-      *Value   = QuestionValue->Value.u8;\r
-    }\r
-    *Step    = NumericOp->data.u8.Step;\r
-    *StorageWidth = (UINT16) sizeof (UINT8);\r
-    break;\r
-  \r
-  case EFI_IFR_NUMERIC_SIZE_2:\r
-    if (IntInput) {\r
-      *Minimum = (INT64) (INT16) NumericOp->data.u16.MinValue;\r
-      *Maximum = (INT64) (INT16) NumericOp->data.u16.MaxValue;\r
-      *Value   = (INT64) (INT16) QuestionValue->Value.u16;\r
-    } else {\r
-      *Minimum = NumericOp->data.u16.MinValue;\r
-      *Maximum = NumericOp->data.u16.MaxValue;\r
-      *Value   = QuestionValue->Value.u16;\r
-    }\r
-    *Step    = NumericOp->data.u16.Step;\r
-    *StorageWidth = (UINT16) sizeof (UINT16);\r
-    break;\r
-  \r
-  case EFI_IFR_NUMERIC_SIZE_4:\r
-    if (IntInput) {\r
-      *Minimum = (INT64) (INT32) NumericOp->data.u32.MinValue;\r
-      *Maximum = (INT64) (INT32) NumericOp->data.u32.MaxValue;\r
-      *Value   = (INT64) (INT32) QuestionValue->Value.u32;\r
-    } else {\r
-      *Minimum = NumericOp->data.u32.MinValue;\r
-      *Maximum = NumericOp->data.u32.MaxValue;\r
-      *Value   = QuestionValue->Value.u32;\r
-    }\r
-    *Step    = NumericOp->data.u32.Step;\r
-    *StorageWidth = (UINT16) sizeof (UINT32);\r
-    break;\r
-  \r
-  case EFI_IFR_NUMERIC_SIZE_8:\r
-    if (IntInput) {\r
-      *Minimum = (INT64) NumericOp->data.u64.MinValue;\r
-      *Maximum = (INT64) NumericOp->data.u64.MaxValue;\r
-      *Value   = (INT64) QuestionValue->Value.u64;\r
-    } else {\r
-      *Minimum = NumericOp->data.u64.MinValue;\r
-      *Maximum = NumericOp->data.u64.MaxValue;\r
-      *Value   = QuestionValue->Value.u64;\r
-    }\r
-    *Step    = NumericOp->data.u64.Step;\r
-    *StorageWidth = (UINT16) sizeof (UINT64);\r
-    break;\r
-  \r
-  default:\r
-    break;\r
+    case EFI_IFR_NUMERIC_SIZE_1:\r
+      if (IntInput) {\r
+        *Minimum = (INT64)(INT8)NumericOp->data.u8.MinValue;\r
+        *Maximum = (INT64)(INT8)NumericOp->data.u8.MaxValue;\r
+        *Value   = (INT64)(INT8)QuestionValue->Value.u8;\r
+      } else {\r
+        *Minimum = NumericOp->data.u8.MinValue;\r
+        *Maximum = NumericOp->data.u8.MaxValue;\r
+        *Value   = QuestionValue->Value.u8;\r
+      }\r
+\r
+      *Step         = NumericOp->data.u8.Step;\r
+      *StorageWidth = (UINT16)sizeof (UINT8);\r
+      break;\r
+\r
+    case EFI_IFR_NUMERIC_SIZE_2:\r
+      if (IntInput) {\r
+        *Minimum = (INT64)(INT16)NumericOp->data.u16.MinValue;\r
+        *Maximum = (INT64)(INT16)NumericOp->data.u16.MaxValue;\r
+        *Value   = (INT64)(INT16)QuestionValue->Value.u16;\r
+      } else {\r
+        *Minimum = NumericOp->data.u16.MinValue;\r
+        *Maximum = NumericOp->data.u16.MaxValue;\r
+        *Value   = QuestionValue->Value.u16;\r
+      }\r
+\r
+      *Step         = NumericOp->data.u16.Step;\r
+      *StorageWidth = (UINT16)sizeof (UINT16);\r
+      break;\r
+\r
+    case EFI_IFR_NUMERIC_SIZE_4:\r
+      if (IntInput) {\r
+        *Minimum = (INT64)(INT32)NumericOp->data.u32.MinValue;\r
+        *Maximum = (INT64)(INT32)NumericOp->data.u32.MaxValue;\r
+        *Value   = (INT64)(INT32)QuestionValue->Value.u32;\r
+      } else {\r
+        *Minimum = NumericOp->data.u32.MinValue;\r
+        *Maximum = NumericOp->data.u32.MaxValue;\r
+        *Value   = QuestionValue->Value.u32;\r
+      }\r
+\r
+      *Step         = NumericOp->data.u32.Step;\r
+      *StorageWidth = (UINT16)sizeof (UINT32);\r
+      break;\r
+\r
+    case EFI_IFR_NUMERIC_SIZE_8:\r
+      if (IntInput) {\r
+        *Minimum = (INT64)NumericOp->data.u64.MinValue;\r
+        *Maximum = (INT64)NumericOp->data.u64.MaxValue;\r
+        *Value   = (INT64)QuestionValue->Value.u64;\r
+      } else {\r
+        *Minimum = NumericOp->data.u64.MinValue;\r
+        *Maximum = NumericOp->data.u64.MaxValue;\r
+        *Value   = QuestionValue->Value.u64;\r
+      }\r
+\r
+      *Step         = NumericOp->data.u64.Step;\r
+      *StorageWidth = (UINT16)sizeof (UINT64);\r
+      break;\r
+\r
+    default:\r
+      break;\r
   }\r
 \r
   if (*Maximum == 0) {\r
-    *Maximum = (UINT64) -1;\r
+    *Maximum = (UINT64)-1;\r
   }\r
 }\r
 \r
@@ -478,31 +484,31 @@ GetValueFromNum (
 **/\r
 EFI_STATUS\r
 GetNumericInput (\r
-  IN  UI_MENU_OPTION              *MenuOption\r
+  IN  UI_MENU_OPTION  *MenuOption\r
   )\r
 {\r
-  UINTN                   Column;\r
-  UINTN                   Row;\r
-  CHAR16                  InputText[MAX_NUMERIC_INPUT_WIDTH];\r
-  CHAR16                  FormattedNumber[MAX_NUMERIC_INPUT_WIDTH - 1];\r
-  UINT64                  PreviousNumber[MAX_NUMERIC_INPUT_WIDTH - 3];\r
-  UINTN                   Count;\r
-  UINTN                   Loop;\r
-  BOOLEAN                 ManualInput;\r
-  BOOLEAN                 HexInput;\r
-  BOOLEAN                 IntInput;\r
-  BOOLEAN                 Negative;\r
-  BOOLEAN                 ValidateFail;\r
-  BOOLEAN                 DateOrTime;\r
-  UINTN                   InputWidth;\r
-  UINT64                  EditValue;\r
-  UINT64                  Step;\r
-  UINT64                  Minimum;\r
-  UINT64                  Maximum;\r
-  UINTN                   EraseLen;\r
-  UINT8                   Digital;\r
-  EFI_INPUT_KEY           Key;\r
-  EFI_HII_VALUE           *QuestionValue;\r
+  UINTN                          Column;\r
+  UINTN                          Row;\r
+  CHAR16                         InputText[MAX_NUMERIC_INPUT_WIDTH];\r
+  CHAR16                         FormattedNumber[MAX_NUMERIC_INPUT_WIDTH - 1];\r
+  UINT64                         PreviousNumber[MAX_NUMERIC_INPUT_WIDTH - 3];\r
+  UINTN                          Count;\r
+  UINTN                          Loop;\r
+  BOOLEAN                        ManualInput;\r
+  BOOLEAN                        HexInput;\r
+  BOOLEAN                        IntInput;\r
+  BOOLEAN                        Negative;\r
+  BOOLEAN                        ValidateFail;\r
+  BOOLEAN                        DateOrTime;\r
+  UINTN                          InputWidth;\r
+  UINT64                         EditValue;\r
+  UINT64                         Step;\r
+  UINT64                         Minimum;\r
+  UINT64                         Maximum;\r
+  UINTN                          EraseLen;\r
+  UINT8                          Digital;\r
+  EFI_INPUT_KEY                  Key;\r
+  EFI_HII_VALUE                  *QuestionValue;\r
   FORM_DISPLAY_ENGINE_STATEMENT  *Question;\r
   EFI_IFR_NUMERIC                *NumericOp;\r
   UINT16                         StorageWidth;\r
@@ -524,12 +530,13 @@ GetNumericInput (
 \r
   Question      = MenuOption->ThisTag;\r
   QuestionValue = &Question->CurrentValue;\r
+  ZeroMem (InputText, MAX_NUMERIC_INPUT_WIDTH * sizeof (CHAR16));\r
 \r
   //\r
   // Only two case, user can enter to this function: Enter and +/- case.\r
   // In Enter case, gDirection = 0; in +/- case, gDirection = SCAN_LEFT/SCAN_WRIGHT\r
   //\r
-  ManualInput        = (BOOLEAN)(gDirection == 0 ? TRUE : FALSE);\r
+  ManualInput = (BOOLEAN)(gDirection == 0 ? TRUE : FALSE);\r
 \r
   if ((Question->OpCode->OpCode == EFI_IFR_DATE_OP) || (Question->OpCode->OpCode == EFI_IFR_TIME_OP)) {\r
     DateOrTime = TRUE;\r
@@ -540,91 +547,93 @@ GetNumericInput (
   //\r
   // Prepare Value to be edit\r
   //\r
-  EraseLen = 0;\r
+  EraseLen  = 0;\r
   EditValue = 0;\r
   if (Question->OpCode->OpCode == EFI_IFR_DATE_OP) {\r
-    Step = 1;\r
+    Step    = 1;\r
     Minimum = 1;\r
 \r
     switch (MenuOption->Sequence) {\r
-    case 0:\r
-      Maximum = 12;\r
-      EraseLen = 4;\r
-      EditValue = QuestionValue->Value.date.Month;\r
-      break;\r
+      case 0:\r
+        Maximum   = 12;\r
+        EraseLen  = 4;\r
+        EditValue = QuestionValue->Value.date.Month;\r
+        break;\r
 \r
-    case 1:\r
-      switch (QuestionValue->Value.date.Month) {\r
-      case 2:\r
-        if ((QuestionValue->Value.date.Year % 4) == 0  && \r
-            ((QuestionValue->Value.date.Year % 100) != 0 || \r
-            (QuestionValue->Value.date.Year % 400) == 0)) {\r
-          Maximum = 29;\r
-        } else {\r
-          Maximum = 28;\r
+      case 1:\r
+        switch (QuestionValue->Value.date.Month) {\r
+          case 2:\r
+            if (((QuestionValue->Value.date.Year % 4) == 0) &&\r
+                (((QuestionValue->Value.date.Year % 100) != 0) ||\r
+                 ((QuestionValue->Value.date.Year % 400) == 0)))\r
+            {\r
+              Maximum = 29;\r
+            } else {\r
+              Maximum = 28;\r
+            }\r
+\r
+            break;\r
+          case 4:\r
+          case 6:\r
+          case 9:\r
+          case 11:\r
+            Maximum = 30;\r
+            break;\r
+          default:\r
+            Maximum = 31;\r
+            break;\r
         }\r
+\r
+        EraseLen  = 3;\r
+        EditValue = QuestionValue->Value.date.Day;\r
         break;\r
-      case 4:\r
-      case 6:\r
-      case 9:\r
-      case 11:\r
-        Maximum = 30;\r
+\r
+      case 2:\r
+        Maximum   = 0xffff;\r
+        EraseLen  = 5;\r
+        EditValue = QuestionValue->Value.date.Year;\r
         break;\r
+\r
       default:\r
-        Maximum = 31;\r
         break;\r
-      } \r
-\r
-      EraseLen = 3;\r
-      EditValue = QuestionValue->Value.date.Day;\r
-      break;\r
-\r
-    case 2:\r
-      Maximum = 0xffff;\r
-      EraseLen = 5;\r
-      EditValue = QuestionValue->Value.date.Year;\r
-      break;\r
-\r
-    default:\r
-      break;\r
     }\r
   } else if (Question->OpCode->OpCode == EFI_IFR_TIME_OP) {\r
-    Step = 1;\r
+    Step    = 1;\r
     Minimum = 0;\r
 \r
     switch (MenuOption->Sequence) {\r
-    case 0:\r
-      Maximum = 23;\r
-      EraseLen = 4;\r
-      EditValue = QuestionValue->Value.time.Hour;\r
-      break;\r
+      case 0:\r
+        Maximum   = 23;\r
+        EraseLen  = 4;\r
+        EditValue = QuestionValue->Value.time.Hour;\r
+        break;\r
 \r
-    case 1:\r
-      Maximum = 59;\r
-      EraseLen = 3;\r
-      EditValue = QuestionValue->Value.time.Minute;\r
-      break;\r
+      case 1:\r
+        Maximum   = 59;\r
+        EraseLen  = 3;\r
+        EditValue = QuestionValue->Value.time.Minute;\r
+        break;\r
 \r
-    case 2:\r
-      Maximum = 59;\r
-      EraseLen = 3;\r
-      EditValue = QuestionValue->Value.time.Second;\r
-      break;\r
+      case 2:\r
+        Maximum   = 59;\r
+        EraseLen  = 3;\r
+        EditValue = QuestionValue->Value.time.Second;\r
+        break;\r
 \r
-    default:\r
-      break;\r
+      default:\r
+        break;\r
     }\r
   } else {\r
     ASSERT (Question->OpCode->OpCode == EFI_IFR_NUMERIC_OP);\r
-    NumericOp = (EFI_IFR_NUMERIC *) Question->OpCode;\r
-    GetValueFromNum(Question->OpCode, (NumericOp->Flags & EFI_IFR_DISPLAY) == 0, QuestionValue, &EditValue, &Minimum, &Maximum, &Step, &StorageWidth);\r
-    EraseLen  = gOptionBlockWidth;\r
+    NumericOp = (EFI_IFR_NUMERIC *)Question->OpCode;\r
+    GetValueFromNum (Question->OpCode, (NumericOp->Flags & EFI_IFR_DISPLAY) == 0, QuestionValue, &EditValue, &Minimum, &Maximum, &Step, &StorageWidth);\r
+    EraseLen = gOptionBlockWidth;\r
   }\r
 \r
   if ((Question->OpCode->OpCode == EFI_IFR_NUMERIC_OP) && (NumericOp != NULL)) {\r
-    if ((NumericOp->Flags & EFI_IFR_DISPLAY) == EFI_IFR_DISPLAY_UINT_HEX){\r
+    if ((NumericOp->Flags & EFI_IFR_DISPLAY) == EFI_IFR_DISPLAY_UINT_HEX) {\r
       HexInput = TRUE;\r
-    } else if ((NumericOp->Flags & EFI_IFR_DISPLAY) == 0){\r
+    } else if ((NumericOp->Flags & EFI_IFR_DISPLAY) == 0) {\r
       //\r
       // Display with EFI_IFR_DISPLAY_INT_DEC type. Support negative number.\r
       //\r
@@ -641,25 +650,25 @@ GetNumericInput (
         InputWidth = StorageWidth * 2;\r
       } else {\r
         switch (StorageWidth) {\r
-        case 1:\r
-          InputWidth = 3;\r
-          break;\r
+          case 1:\r
+            InputWidth = 3;\r
+            break;\r
 \r
-        case 2:\r
-          InputWidth = 5;\r
-          break;\r
+          case 2:\r
+            InputWidth = 5;\r
+            break;\r
 \r
-        case 4:\r
-          InputWidth = 10;\r
-          break;\r
+          case 4:\r
+            InputWidth = 10;\r
+            break;\r
 \r
-        case 8:\r
-          InputWidth = 20;\r
-          break;\r
+          case 8:\r
+            InputWidth = 20;\r
+            break;\r
 \r
-        default:\r
-          InputWidth = 0;\r
-          break;\r
+          default:\r
+            InputWidth = 0;\r
+            break;\r
         }\r
 \r
         if (IntInput) {\r
@@ -690,16 +699,17 @@ GetNumericInput (
       if (MenuOption->Sequence == 0) {\r
         InputText[0] = LEFT_NUMERIC_DELIMITER;\r
         SetUnicodeMem (InputText + 1, InputWidth, L' ');\r
-      } else {\r
+        InputText[InputWidth + 1] = DATE_SEPARATOR;\r
+        InputText[InputWidth + 2] = L'\0';\r
+      } else if (MenuOption->Sequence == 1) {\r
         SetUnicodeMem (InputText, InputWidth, L' ');\r
-      }\r
-\r
-      if (MenuOption->Sequence == 2) {\r
-        InputText[InputWidth + 1] = RIGHT_NUMERIC_DELIMITER;\r
+        InputText[InputWidth]     = DATE_SEPARATOR;\r
+        InputText[InputWidth + 1] = L'\0';\r
       } else {\r
-        InputText[InputWidth + 1] = DATE_SEPARATOR;\r
+        SetUnicodeMem (InputText, InputWidth, L' ');\r
+        InputText[InputWidth]     = RIGHT_NUMERIC_DELIMITER;\r
+        InputText[InputWidth + 1] = L'\0';\r
       }\r
-      InputText[InputWidth + 2] = L'\0';\r
 \r
       PrintStringAt (Column, Row, InputText);\r
       if (MenuOption->Sequence == 0) {\r
@@ -713,16 +723,17 @@ GetNumericInput (
       if (MenuOption->Sequence == 0) {\r
         InputText[0] = LEFT_NUMERIC_DELIMITER;\r
         SetUnicodeMem (InputText + 1, InputWidth, L' ');\r
-      } else {\r
+        InputText[InputWidth + 1] = TIME_SEPARATOR;\r
+        InputText[InputWidth + 2] = L'\0';\r
+      } else if (MenuOption->Sequence == 1) {\r
         SetUnicodeMem (InputText, InputWidth, L' ');\r
-      }\r
-\r
-      if (MenuOption->Sequence == 2) {\r
-        InputText[InputWidth + 1] = RIGHT_NUMERIC_DELIMITER;\r
+        InputText[InputWidth]     = TIME_SEPARATOR;\r
+        InputText[InputWidth + 1] = L'\0';\r
       } else {\r
-        InputText[InputWidth + 1] = TIME_SEPARATOR;\r
+        SetUnicodeMem (InputText, InputWidth, L' ');\r
+        InputText[InputWidth]     = RIGHT_NUMERIC_DELIMITER;\r
+        InputText[InputWidth + 1] = L'\0';\r
       }\r
-      InputText[InputWidth + 2] = L'\0';\r
 \r
       PrintStringAt (Column, Row, InputText);\r
       if (MenuOption->Sequence == 0) {\r
@@ -738,8 +749,8 @@ GetNumericInput (
   do {\r
     Key.UnicodeChar = CHAR_NULL;\r
     if (gDirection != 0) {\r
-      Key.ScanCode  = gDirection;\r
-      gDirection    = 0;\r
+      Key.ScanCode = gDirection;\r
+      gDirection   = 0;\r
       goto TheKey2;\r
     }\r
 \r
@@ -747,353 +758,362 @@ GetNumericInput (
 \r
 TheKey2:\r
     switch (Key.UnicodeChar) {\r
+      case '+':\r
+      case '-':\r
+        if (ManualInput && IntInput) {\r
+          //\r
+          // In Manual input mode, check whether input the negative flag.\r
+          //\r
+          if (Key.UnicodeChar == '-') {\r
+            if (Negative) {\r
+              break;\r
+            }\r
 \r
-    case '+':\r
-    case '-':\r
-      if (ManualInput && IntInput) {\r
-        //\r
-        // In Manual input mode, check whether input the negative flag.\r
-        //\r
-        if (Key.UnicodeChar == '-') {\r
-          if (Negative) {\r
-            break;\r
+            Negative = TRUE;\r
+            PrintCharAt (Column++, Row, Key.UnicodeChar);\r
           }\r
-          Negative = TRUE;\r
-          PrintCharAt (Column++, Row, Key.UnicodeChar);\r
-        }\r
-      } else {\r
-        if (Key.UnicodeChar == '+') {\r
-          Key.ScanCode = SCAN_RIGHT;\r
         } else {\r
-          Key.ScanCode = SCAN_LEFT;\r
-        }\r
-        Key.UnicodeChar = CHAR_NULL;\r
-        goto TheKey2;\r
-      }\r
-      break;\r
+          if (Key.UnicodeChar == '+') {\r
+            Key.ScanCode = SCAN_RIGHT;\r
+          } else {\r
+            Key.ScanCode = SCAN_LEFT;\r
+          }\r
 \r
-    case CHAR_NULL:\r
-      switch (Key.ScanCode) {\r
-      case SCAN_LEFT:\r
-      case SCAN_RIGHT:\r
-        if (DateOrTime && !ManualInput) {\r
-          //\r
-          // By setting this value, we will return back to the caller.\r
-          // We need to do this since an auto-refresh will destroy the adjustment\r
-          // based on what the real-time-clock is showing.  So we always commit\r
-          // upon changing the value.\r
-          //\r
-          gDirection = SCAN_DOWN;\r
+          Key.UnicodeChar = CHAR_NULL;\r
+          goto TheKey2;\r
         }\r
 \r
-        if ((Step != 0) && !ManualInput) {\r
-          if (Key.ScanCode == SCAN_LEFT) {\r
-            if (IntInput) {\r
-              if ((INT64) EditValue >= (INT64) Minimum + (INT64) Step) {\r
-                EditValue = EditValue - Step;\r
-              } else if ((INT64) EditValue > (INT64) Minimum){\r
-                EditValue = Minimum;\r
-              } else {\r
-                EditValue = Maximum;\r
-              }\r
-            } else {\r
-              if (EditValue >= Minimum + Step) {\r
-                EditValue = EditValue - Step;\r
-              } else if (EditValue > Minimum){\r
-                EditValue = Minimum;\r
-              } else {\r
-                EditValue = Maximum;\r
-              }\r
+        break;\r
+\r
+      case CHAR_NULL:\r
+        switch (Key.ScanCode) {\r
+          case SCAN_LEFT:\r
+          case SCAN_RIGHT:\r
+            if (DateOrTime && !ManualInput) {\r
+              //\r
+              // By setting this value, we will return back to the caller.\r
+              // We need to do this since an auto-refresh will destroy the adjustment\r
+              // based on what the real-time-clock is showing.  So we always commit\r
+              // upon changing the value.\r
+              //\r
+              gDirection = SCAN_DOWN;\r
             }\r
-          } else if (Key.ScanCode == SCAN_RIGHT) {\r
-            if (IntInput) {\r
-              if ((INT64) EditValue + (INT64) Step <= (INT64) Maximum) {\r
-                EditValue = EditValue + Step;\r
-              } else if ((INT64) EditValue < (INT64) Maximum) {\r
-                EditValue = Maximum;\r
-              } else {\r
-                EditValue = Minimum;\r
+\r
+            if ((Step != 0) && !ManualInput) {\r
+              if (Key.ScanCode == SCAN_LEFT) {\r
+                if (IntInput) {\r
+                  if ((INT64)EditValue >= (INT64)Minimum + (INT64)Step) {\r
+                    EditValue = EditValue - Step;\r
+                  } else if ((INT64)EditValue > (INT64)Minimum) {\r
+                    EditValue = Minimum;\r
+                  } else {\r
+                    EditValue = Maximum;\r
+                  }\r
+                } else {\r
+                  if (EditValue >= Minimum + Step) {\r
+                    EditValue = EditValue - Step;\r
+                  } else if (EditValue > Minimum) {\r
+                    EditValue = Minimum;\r
+                  } else {\r
+                    EditValue = Maximum;\r
+                  }\r
+                }\r
+              } else if (Key.ScanCode == SCAN_RIGHT) {\r
+                if (IntInput) {\r
+                  if ((INT64)EditValue + (INT64)Step <= (INT64)Maximum) {\r
+                    EditValue = EditValue + Step;\r
+                  } else if ((INT64)EditValue < (INT64)Maximum) {\r
+                    EditValue = Maximum;\r
+                  } else {\r
+                    EditValue = Minimum;\r
+                  }\r
+                } else {\r
+                  if (EditValue + Step <= Maximum) {\r
+                    EditValue = EditValue + Step;\r
+                  } else if (EditValue < Maximum) {\r
+                    EditValue = Maximum;\r
+                  } else {\r
+                    EditValue = Minimum;\r
+                  }\r
+                }\r
               }\r
-            } else {\r
-              if (EditValue + Step <= Maximum) {\r
-                EditValue = EditValue + Step;\r
-              } else if (EditValue < Maximum) {\r
-                EditValue = Maximum;\r
+\r
+              ZeroMem (FormattedNumber, 21 * sizeof (CHAR16));\r
+              if (Question->OpCode->OpCode == EFI_IFR_DATE_OP) {\r
+                if (MenuOption->Sequence == 2) {\r
+                  //\r
+                  // Year\r
+                  //\r
+                  UnicodeSPrint (FormattedNumber, 21 * sizeof (CHAR16), L"%04d", (UINT16)EditValue);\r
+                } else {\r
+                  //\r
+                  // Month/Day\r
+                  //\r
+                  UnicodeSPrint (FormattedNumber, 21 * sizeof (CHAR16), L"%02d", (UINT8)EditValue);\r
+                }\r
+\r
+                if (MenuOption->Sequence == 0) {\r
+                  ASSERT (EraseLen >= 2);\r
+                  FormattedNumber[EraseLen - 2] = DATE_SEPARATOR;\r
+                } else if (MenuOption->Sequence == 1) {\r
+                  ASSERT (EraseLen >= 1);\r
+                  FormattedNumber[EraseLen - 1] = DATE_SEPARATOR;\r
+                }\r
+              } else if (Question->OpCode->OpCode == EFI_IFR_TIME_OP) {\r
+                UnicodeSPrint (FormattedNumber, 21 * sizeof (CHAR16), L"%02d", (UINT8)EditValue);\r
+\r
+                if (MenuOption->Sequence == 0) {\r
+                  ASSERT (EraseLen >= 2);\r
+                  FormattedNumber[EraseLen - 2] = TIME_SEPARATOR;\r
+                } else if (MenuOption->Sequence == 1) {\r
+                  ASSERT (EraseLen >= 1);\r
+                  FormattedNumber[EraseLen - 1] = TIME_SEPARATOR;\r
+                }\r
               } else {\r
-                EditValue = Minimum;\r
+                QuestionValue->Value.u64 = EditValue;\r
+                PrintFormattedNumber (Question, FormattedNumber, 21 * sizeof (CHAR16));\r
               }\r
-            }\r
-          }\r
 \r
-          ZeroMem (FormattedNumber, 21 * sizeof (CHAR16));\r
-          if (Question->OpCode->OpCode == EFI_IFR_DATE_OP) {\r
-            if (MenuOption->Sequence == 2) {\r
-              //\r
-              // Year\r
-              //\r
-              UnicodeSPrint (FormattedNumber, 21 * sizeof (CHAR16), L"%04d", (UINT16) EditValue);\r
-            } else {\r
-              //\r
-              // Month/Day\r
-              //\r
-              UnicodeSPrint (FormattedNumber, 21 * sizeof (CHAR16), L"%02d", (UINT8) EditValue);\r
-            }\r
+              gST->ConOut->SetAttribute (gST->ConOut, GetFieldTextColor ());\r
+              for (Loop = 0; Loop < EraseLen; Loop++) {\r
+                PrintStringAt (MenuOption->OptCol + Loop, MenuOption->Row, L" ");\r
+              }\r
 \r
-            if (MenuOption->Sequence == 0) {\r
-              ASSERT (EraseLen >= 2);\r
-              FormattedNumber[EraseLen - 2] = DATE_SEPARATOR;\r
-            } else if (MenuOption->Sequence == 1) {\r
-              ASSERT (EraseLen >= 1);\r
-              FormattedNumber[EraseLen - 1] = DATE_SEPARATOR;\r
-            }\r
-          } else if (Question->OpCode->OpCode == EFI_IFR_TIME_OP) {\r
-            UnicodeSPrint (FormattedNumber, 21 * sizeof (CHAR16), L"%02d", (UINT8) EditValue);\r
-\r
-            if (MenuOption->Sequence == 0) {\r
-              ASSERT (EraseLen >= 2);\r
-              FormattedNumber[EraseLen - 2] = TIME_SEPARATOR;\r
-            } else if (MenuOption->Sequence == 1) {\r
-              ASSERT (EraseLen >= 1);\r
-              FormattedNumber[EraseLen - 1] = TIME_SEPARATOR;\r
-            }\r
-          } else {\r
-            QuestionValue->Value.u64 = EditValue;\r
-            PrintFormattedNumber (Question, FormattedNumber, 21 * sizeof (CHAR16));\r
-          }\r
+              gST->ConOut->SetAttribute (gST->ConOut, GetHighlightTextColor ());\r
 \r
-          gST->ConOut->SetAttribute (gST->ConOut, GetFieldTextColor ());\r
-          for (Loop = 0; Loop < EraseLen; Loop++) {\r
-            PrintStringAt (MenuOption->OptCol + Loop, MenuOption->Row, L" ");\r
-          }\r
-          gST->ConOut->SetAttribute (gST->ConOut, GetHighlightTextColor ());\r
+              if (MenuOption->Sequence == 0) {\r
+                PrintCharAt (MenuOption->OptCol, Row, LEFT_NUMERIC_DELIMITER);\r
+                Column = MenuOption->OptCol + 1;\r
+              }\r
 \r
-          if (MenuOption->Sequence == 0) {\r
-            PrintCharAt (MenuOption->OptCol, Row, LEFT_NUMERIC_DELIMITER);\r
-            Column = MenuOption->OptCol + 1;\r
-          }\r
+              PrintStringAt (Column, Row, FormattedNumber);\r
 \r
-          PrintStringAt (Column, Row, FormattedNumber);\r
+              if (!DateOrTime || (MenuOption->Sequence == 2)) {\r
+                PrintCharAt ((UINTN)-1, (UINTN)-1, RIGHT_NUMERIC_DELIMITER);\r
+              }\r
+            }\r
 \r
-          if (!DateOrTime || MenuOption->Sequence == 2) {\r
-            PrintCharAt ((UINTN)-1, (UINTN)-1, RIGHT_NUMERIC_DELIMITER);\r
-          }\r
-        }\r
+            goto EnterCarriageReturn;\r
 \r
-        goto EnterCarriageReturn;\r
+          case SCAN_UP:\r
+          case SCAN_DOWN:\r
+            goto EnterCarriageReturn;\r
 \r
-      case SCAN_UP:\r
-      case SCAN_DOWN:\r
-        goto EnterCarriageReturn;\r
+          case SCAN_ESC:\r
+            return EFI_DEVICE_ERROR;\r
 \r
-      case SCAN_ESC:\r
-        return EFI_DEVICE_ERROR;\r
+          default:\r
+            break;\r
+        }\r
 \r
-      default:\r
         break;\r
-      }\r
-\r
-      break;\r
 \r
 EnterCarriageReturn:\r
 \r
-    case CHAR_CARRIAGE_RETURN:\r
-      //\r
-      // Validate input value with Minimum value.\r
-      //\r
-      ValidateFail = FALSE;\r
-      if (IntInput) {\r
+      case CHAR_CARRIAGE_RETURN:\r
         //\r
-        // After user input Enter, need to check whether the input value.\r
-        // If input a negative value, should compare with maximum value. \r
-        // else compare with the minimum value.\r
+        // Validate input value with Minimum value.\r
         //\r
-        if (Negative) {\r
-          ValidateFail = (INT64) EditValue > (INT64) Maximum ? TRUE : FALSE;\r
-        } else {\r
-          ValidateFail = (INT64) EditValue < (INT64) Minimum ? TRUE : FALSE;\r
-        }\r
+        ValidateFail = FALSE;\r
+        if (IntInput) {\r
+          //\r
+          // After user input Enter, need to check whether the input value.\r
+          // If input a negative value, should compare with maximum value.\r
+          // else compare with the minimum value.\r
+          //\r
+          if (Negative) {\r
+            ValidateFail = (INT64)EditValue > (INT64)Maximum ? TRUE : FALSE;\r
+          } else {\r
+            ValidateFail = (INT64)EditValue < (INT64)Minimum ? TRUE : FALSE;\r
+          }\r
 \r
-        if (ValidateFail) {\r
+          if (ValidateFail) {\r
+            UpdateStatusBar (INPUT_ERROR, TRUE);\r
+            break;\r
+          }\r
+        } else if (EditValue < Minimum) {\r
           UpdateStatusBar (INPUT_ERROR, TRUE);\r
           break;\r
         }\r
-      } else if (EditValue < Minimum) {\r
-        UpdateStatusBar (INPUT_ERROR, TRUE);\r
-        break;\r
-      }\r
 \r
-      UpdateStatusBar (INPUT_ERROR, FALSE);\r
-      CopyMem (&gUserInput->InputValue, &Question->CurrentValue, sizeof (EFI_HII_VALUE));\r
-      QuestionValue = &gUserInput->InputValue;\r
-      //\r
-      // Store Edit value back to Question\r
-      //\r
-      if (Question->OpCode->OpCode == EFI_IFR_DATE_OP) {\r
-        switch (MenuOption->Sequence) {\r
-        case 0:\r
-          QuestionValue->Value.date.Month = (UINT8) EditValue;\r
-          break;\r
+        UpdateStatusBar (INPUT_ERROR, FALSE);\r
+        CopyMem (&gUserInput->InputValue, &Question->CurrentValue, sizeof (EFI_HII_VALUE));\r
+        QuestionValue = &gUserInput->InputValue;\r
+        //\r
+        // Store Edit value back to Question\r
+        //\r
+        if (Question->OpCode->OpCode == EFI_IFR_DATE_OP) {\r
+          switch (MenuOption->Sequence) {\r
+            case 0:\r
+              QuestionValue->Value.date.Month = (UINT8)EditValue;\r
+              break;\r
 \r
-        case 1:\r
-          QuestionValue->Value.date.Day = (UINT8) EditValue;\r
-          break;\r
+            case 1:\r
+              QuestionValue->Value.date.Day = (UINT8)EditValue;\r
+              break;\r
 \r
-        case 2:\r
-          QuestionValue->Value.date.Year = (UINT16) EditValue;\r
-          break;\r
+            case 2:\r
+              QuestionValue->Value.date.Year = (UINT16)EditValue;\r
+              break;\r
 \r
-        default:\r
-          break;\r
-        }\r
-      } else if (Question->OpCode->OpCode  == EFI_IFR_TIME_OP) {\r
-        switch (MenuOption->Sequence) {\r
-        case 0:\r
-          QuestionValue->Value.time.Hour = (UINT8) EditValue;\r
-          break;\r
+            default:\r
+              break;\r
+          }\r
+        } else if (Question->OpCode->OpCode  == EFI_IFR_TIME_OP) {\r
+          switch (MenuOption->Sequence) {\r
+            case 0:\r
+              QuestionValue->Value.time.Hour = (UINT8)EditValue;\r
+              break;\r
 \r
-        case 1:\r
-          QuestionValue->Value.time.Minute = (UINT8) EditValue;\r
-          break;\r
+            case 1:\r
+              QuestionValue->Value.time.Minute = (UINT8)EditValue;\r
+              break;\r
 \r
-        case 2:\r
-          QuestionValue->Value.time.Second = (UINT8) EditValue;\r
-          break;\r
+            case 2:\r
+              QuestionValue->Value.time.Second = (UINT8)EditValue;\r
+              break;\r
 \r
-        default:\r
-          break;\r
+            default:\r
+              break;\r
+          }\r
+        } else {\r
+          //\r
+          // Numeric\r
+          //\r
+          QuestionValue->Value.u64 = EditValue;\r
         }\r
-      } else {\r
+\r
         //\r
-        // Numeric\r
+        // Adjust the value to the correct one.\r
+        // Sample like: 2012.02.29 -> 2013.02.29 -> 2013.02.01\r
+        //              2013.03.29 -> 2013.02.29 -> 2013.02.28\r
         //\r
-        QuestionValue->Value.u64 = EditValue;\r
-      }\r
+        if ((Question->OpCode->OpCode  == EFI_IFR_DATE_OP) &&\r
+            ((MenuOption->Sequence == 0) || (MenuOption->Sequence == 2)))\r
+        {\r
+          AdjustQuestionValue (QuestionValue, (UINT8)MenuOption->Sequence);\r
+        }\r
 \r
-      //\r
-      // Adjust the value to the correct one.\r
-      // Sample like: 2012.02.29 -> 2013.02.29 -> 2013.02.01\r
-      //              2013.03.29 -> 2013.02.29 -> 2013.02.28\r
-      //\r
-      if (Question->OpCode->OpCode  == EFI_IFR_DATE_OP && \r
-        (MenuOption->Sequence == 0 || MenuOption->Sequence == 2)) {\r
-        AdjustQuestionValue (QuestionValue, (UINT8)MenuOption->Sequence);\r
-      }\r
+        return EFI_SUCCESS;\r
 \r
-      return EFI_SUCCESS;\r
+      case CHAR_BACKSPACE:\r
+        if (ManualInput) {\r
+          if (Count == 0) {\r
+            if (Negative) {\r
+              Negative = FALSE;\r
+              Column--;\r
+              PrintStringAt (Column, Row, L" ");\r
+            }\r
 \r
-    case CHAR_BACKSPACE:\r
-      if (ManualInput) {\r
-        if (Count == 0) {\r
-          if (Negative) {\r
-            Negative = FALSE;\r
-            Column--;\r
-            PrintStringAt (Column, Row, L" ");\r
+            break;\r
           }\r
-          break;\r
+\r
+          //\r
+          // Remove a character\r
+          //\r
+          EditValue = PreviousNumber[Count - 1];\r
+          UpdateStatusBar (INPUT_ERROR, FALSE);\r
+          Count--;\r
+          Column--;\r
+          PrintStringAt (Column, Row, L" ");\r
         }\r
-        //\r
-        // Remove a character\r
-        //\r
-        EditValue = PreviousNumber[Count - 1];\r
-        UpdateStatusBar (INPUT_ERROR,  FALSE);\r
-        Count--;\r
-        Column--;\r
-        PrintStringAt (Column, Row, L" ");\r
-      }\r
-      break;\r
 \r
-    default:\r
-      if (ManualInput) {\r
-        if (HexInput) {\r
-          if ((Key.UnicodeChar >= L'0') && (Key.UnicodeChar <= L'9')) {\r
-            Digital = (UINT8) (Key.UnicodeChar - L'0');\r
-          } else if ((Key.UnicodeChar >= L'A') && (Key.UnicodeChar <= L'F')) {\r
-            Digital = (UINT8) (Key.UnicodeChar - L'A' + 0x0A);\r
-          } else if ((Key.UnicodeChar >= L'a') && (Key.UnicodeChar <= L'f')) {\r
-            Digital = (UINT8) (Key.UnicodeChar - L'a' + 0x0A);\r
+        break;\r
+\r
+      default:\r
+        if (ManualInput) {\r
+          if (HexInput) {\r
+            if ((Key.UnicodeChar >= L'0') && (Key.UnicodeChar <= L'9')) {\r
+              Digital = (UINT8)(Key.UnicodeChar - L'0');\r
+            } else if ((Key.UnicodeChar >= L'A') && (Key.UnicodeChar <= L'F')) {\r
+              Digital = (UINT8)(Key.UnicodeChar - L'A' + 0x0A);\r
+            } else if ((Key.UnicodeChar >= L'a') && (Key.UnicodeChar <= L'f')) {\r
+              Digital = (UINT8)(Key.UnicodeChar - L'a' + 0x0A);\r
+            } else {\r
+              UpdateStatusBar (INPUT_ERROR, TRUE);\r
+              break;\r
+            }\r
           } else {\r
-            UpdateStatusBar (INPUT_ERROR, TRUE);\r
-            break;\r
+            if ((Key.UnicodeChar > L'9') || (Key.UnicodeChar < L'0')) {\r
+              UpdateStatusBar (INPUT_ERROR, TRUE);\r
+              break;\r
+            }\r
           }\r
-        } else {\r
-          if (Key.UnicodeChar > L'9' || Key.UnicodeChar < L'0') {\r
-            UpdateStatusBar (INPUT_ERROR, TRUE);\r
+\r
+          //\r
+          // If Count exceed input width, there is no way more is valid\r
+          //\r
+          if (Count >= InputWidth) {\r
             break;\r
           }\r
-        }\r
 \r
-        //\r
-        // If Count exceed input width, there is no way more is valid\r
-        //\r
-        if (Count >= InputWidth) {\r
-          break;\r
-        }\r
-        //\r
-        // Someone typed something valid!\r
-        //\r
-        if (Count != 0) {\r
-          if (HexInput) {\r
-            EditValue = LShiftU64 (EditValue, 4) + Digital;\r
-          } else if (IntInput && Negative) {\r
-            //\r
-            // Save the negative number.\r
-            //\r
-            EditValue = ~(MultU64x32 (~(EditValue - 1), 10) + (Key.UnicodeChar - L'0')) + 1;\r
+          //\r
+          // Someone typed something valid!\r
+          //\r
+          if (Count != 0) {\r
+            if (HexInput) {\r
+              EditValue = LShiftU64 (EditValue, 4) + Digital;\r
+            } else if (IntInput && Negative) {\r
+              //\r
+              // Save the negative number.\r
+              //\r
+              EditValue = ~(MultU64x32 (~(EditValue - 1), 10) + (Key.UnicodeChar - L'0')) + 1;\r
+            } else {\r
+              EditValue = MultU64x32 (EditValue, 10) + (Key.UnicodeChar - L'0');\r
+            }\r
           } else {\r
-            EditValue = MultU64x32 (EditValue, 10) + (Key.UnicodeChar - L'0');\r
+            if (HexInput) {\r
+              EditValue = Digital;\r
+            } else if (IntInput && Negative) {\r
+              //\r
+              // Save the negative number.\r
+              //\r
+              EditValue = ~(Key.UnicodeChar - L'0') + 1;\r
+            } else {\r
+              EditValue = Key.UnicodeChar - L'0';\r
+            }\r
           }\r
-        } else {\r
-          if (HexInput) {\r
-            EditValue = Digital;\r
-          } else if (IntInput && Negative) {\r
+\r
+          if (IntInput) {\r
+            ValidateFail = FALSE;\r
             //\r
-            // Save the negative number.\r
+            // When user input a new value, should check the current value.\r
+            // If user input a negative value, should compare it with minimum\r
+            // value, else compare it with maximum value.\r
             //\r
-            EditValue = ~(Key.UnicodeChar - L'0') + 1;\r
-          } else {\r
-            EditValue = Key.UnicodeChar - L'0';\r
-          }\r
-        }\r
+            if (Negative) {\r
+              ValidateFail = (INT64)EditValue < (INT64)Minimum ? TRUE : FALSE;\r
+            } else {\r
+              ValidateFail = (INT64)EditValue > (INT64)Maximum ? TRUE : FALSE;\r
+            }\r
 \r
-        if (IntInput) {\r
-          ValidateFail = FALSE;\r
-          //\r
-          // When user input a new value, should check the current value.\r
-          // If user input a negative value, should compare it with minimum\r
-          // value, else compare it with maximum value.\r
-          //\r
-          if (Negative) {\r
-            ValidateFail = (INT64) EditValue < (INT64) Minimum ? TRUE : FALSE;\r
+            if (ValidateFail) {\r
+              UpdateStatusBar (INPUT_ERROR, TRUE);\r
+              ASSERT (Count < ARRAY_SIZE (PreviousNumber));\r
+              EditValue = PreviousNumber[Count];\r
+              break;\r
+            }\r
           } else {\r
-            ValidateFail = (INT64) EditValue > (INT64) Maximum ? TRUE : FALSE;\r
+            if (EditValue > Maximum) {\r
+              UpdateStatusBar (INPUT_ERROR, TRUE);\r
+              ASSERT (Count < ARRAY_SIZE (PreviousNumber));\r
+              EditValue = PreviousNumber[Count];\r
+              break;\r
+            }\r
           }\r
 \r
-          if (ValidateFail) {\r
-            UpdateStatusBar (INPUT_ERROR, TRUE);\r
-            ASSERT (Count < sizeof (PreviousNumber) / sizeof (PreviousNumber[0]));\r
-            EditValue = PreviousNumber[Count];\r
-            break;\r
-          }\r
-        } else {\r
-          if (EditValue > Maximum) {\r
-            UpdateStatusBar (INPUT_ERROR, TRUE);\r
-            ASSERT (Count < sizeof (PreviousNumber) / sizeof (PreviousNumber[0]));\r
-            EditValue = PreviousNumber[Count];\r
-            break;\r
-          }\r
-        }\r
+          UpdateStatusBar (INPUT_ERROR, FALSE);\r
 \r
-        UpdateStatusBar (INPUT_ERROR, FALSE);\r
+          Count++;\r
+          ASSERT (Count < (ARRAY_SIZE (PreviousNumber)));\r
+          PreviousNumber[Count] = EditValue;\r
 \r
-        Count++;\r
-        ASSERT (Count < (sizeof (PreviousNumber) / sizeof (PreviousNumber[0])));\r
-        PreviousNumber[Count] = EditValue;\r
+          gST->ConOut->SetAttribute (gST->ConOut, GetHighlightTextColor ());\r
+          PrintCharAt (Column, Row, Key.UnicodeChar);\r
+          Column++;\r
+        }\r
 \r
-        gST->ConOut->SetAttribute (gST->ConOut, GetHighlightTextColor ());\r
-        PrintCharAt (Column, Row, Key.UnicodeChar);\r
-        Column++;\r
-      }\r
-      break;\r
+        break;\r
     }\r
   } while (TRUE);\r
 }\r
@@ -1114,53 +1134,53 @@ AdjustOptionOrder (
   OUT UINTN                          *PopUpMenuLines\r
   )\r
 {\r
-  UINTN                   Index;\r
-  EFI_IFR_ORDERED_LIST    *OrderList;\r
-  UINT8                   *ValueArray;\r
-  UINT8                   ValueType;\r
-  LIST_ENTRY              *Link;\r
-  DISPLAY_QUESTION_OPTION *OneOfOption;\r
-  EFI_HII_VALUE           *HiiValueArray;\r
+  UINTN                    Index;\r
+  EFI_IFR_ORDERED_LIST     *OrderList;\r
+  UINT8                    *ValueArray;\r
+  UINT8                    ValueType;\r
+  LIST_ENTRY               *Link;\r
+  DISPLAY_QUESTION_OPTION  *OneOfOption;\r
+  EFI_HII_VALUE            *HiiValueArray;\r
 \r
   Link        = GetFirstNode (&Question->OptionListHead);\r
   OneOfOption = DISPLAY_QUESTION_OPTION_FROM_LINK (Link);\r
   ValueArray  = Question->CurrentValue.Buffer;\r
   ValueType   =  OneOfOption->OptionOpCode->Type;\r
-  OrderList   = (EFI_IFR_ORDERED_LIST *) Question->OpCode;\r
+  OrderList   = (EFI_IFR_ORDERED_LIST *)Question->OpCode;\r
 \r
   for (Index = 0; Index < OrderList->MaxContainers; Index++) {\r
     if (GetArrayData (ValueArray, ValueType, Index) == 0) {\r
       break;\r
     }\r
   }\r
-  \r
+\r
   *PopUpMenuLines = Index;\r
-  \r
+\r
   //\r
   // Prepare HiiValue array\r
-  //  \r
+  //\r
   HiiValueArray = AllocateZeroPool (*PopUpMenuLines * sizeof (EFI_HII_VALUE));\r
   ASSERT (HiiValueArray != NULL);\r
 \r
   for (Index = 0; Index < *PopUpMenuLines; Index++) {\r
-    HiiValueArray[Index].Type = ValueType;\r
+    HiiValueArray[Index].Type      = ValueType;\r
     HiiValueArray[Index].Value.u64 = GetArrayData (ValueArray, ValueType, Index);\r
   }\r
-  \r
+\r
   for (Index = 0; Index < *PopUpMenuLines; Index++) {\r
     OneOfOption = ValueToOption (Question, &HiiValueArray[*PopUpMenuLines - Index - 1]);\r
     if (OneOfOption == NULL) {\r
       return EFI_NOT_FOUND;\r
     }\r
-  \r
+\r
     RemoveEntryList (&OneOfOption->Link);\r
-  \r
+\r
     //\r
     // Insert to head.\r
     //\r
     InsertHeadList (&Question->OptionListHead, &OneOfOption->Link);\r
   }\r
-  \r
+\r
   FreePool (HiiValueArray);\r
 \r
   return EFI_SUCCESS;\r
@@ -1179,28 +1199,28 @@ AdjustOptionOrder (
 **/\r
 BOOLEAN\r
 IsValuesEqual (\r
-  IN EFI_IFR_TYPE_VALUE *Value1,\r
-  IN EFI_IFR_TYPE_VALUE *Value2,\r
-  IN UINT8              Type\r
+  IN EFI_IFR_TYPE_VALUE  *Value1,\r
+  IN EFI_IFR_TYPE_VALUE  *Value2,\r
+  IN UINT8               Type\r
   )\r
 {\r
   switch (Type) {\r
-  case EFI_IFR_TYPE_BOOLEAN:\r
-  case EFI_IFR_TYPE_NUM_SIZE_8:\r
-    return (BOOLEAN) (Value1->u8 == Value2->u8);\r
-  \r
-  case EFI_IFR_TYPE_NUM_SIZE_16:\r
-    return (BOOLEAN) (Value1->u16 == Value2->u16);\r
-  \r
-  case EFI_IFR_TYPE_NUM_SIZE_32:\r
-    return (BOOLEAN) (Value1->u32 == Value2->u32);\r
-  \r
-  case EFI_IFR_TYPE_NUM_SIZE_64:\r
-    return (BOOLEAN) (Value1->u64 == Value2->u64);\r
-\r
-  default:\r
-    ASSERT (FALSE);\r
-    return FALSE;\r
+    case EFI_IFR_TYPE_BOOLEAN:\r
+    case EFI_IFR_TYPE_NUM_SIZE_8:\r
+      return (BOOLEAN)(Value1->u8 == Value2->u8);\r
+\r
+    case EFI_IFR_TYPE_NUM_SIZE_16:\r
+      return (BOOLEAN)(Value1->u16 == Value2->u16);\r
+\r
+    case EFI_IFR_TYPE_NUM_SIZE_32:\r
+      return (BOOLEAN)(Value1->u32 == Value2->u32);\r
+\r
+    case EFI_IFR_TYPE_NUM_SIZE_64:\r
+      return (BOOLEAN)(Value1->u64 == Value2->u64);\r
+\r
+    default:\r
+      ASSERT (FALSE);\r
+      return FALSE;\r
   }\r
 }\r
 \r
@@ -1214,35 +1234,35 @@ IsValuesEqual (
 **/\r
 VOID\r
 SetValuesByType (\r
-  OUT EFI_IFR_TYPE_VALUE *Dest,\r
-  IN  EFI_IFR_TYPE_VALUE *Source,\r
-  IN  UINT8              Type\r
+  OUT EFI_IFR_TYPE_VALUE  *Dest,\r
+  IN  EFI_IFR_TYPE_VALUE  *Source,\r
+  IN  UINT8               Type\r
   )\r
 {\r
   switch (Type) {\r
-  case EFI_IFR_TYPE_BOOLEAN:\r
-    Dest->b = Source->b;\r
-    break;\r
+    case EFI_IFR_TYPE_BOOLEAN:\r
+      Dest->b = Source->b;\r
+      break;\r
 \r
-  case EFI_IFR_TYPE_NUM_SIZE_8:\r
-    Dest->u8 = Source->u8;\r
-    break;\r
+    case EFI_IFR_TYPE_NUM_SIZE_8:\r
+      Dest->u8 = Source->u8;\r
+      break;\r
 \r
-  case EFI_IFR_TYPE_NUM_SIZE_16:\r
-    Dest->u16 = Source->u16;\r
-    break;\r
+    case EFI_IFR_TYPE_NUM_SIZE_16:\r
+      Dest->u16 = Source->u16;\r
+      break;\r
 \r
-  case EFI_IFR_TYPE_NUM_SIZE_32:\r
-    Dest->u32 = Source->u32;\r
-    break;\r
+    case EFI_IFR_TYPE_NUM_SIZE_32:\r
+      Dest->u32 = Source->u32;\r
+      break;\r
 \r
-  case EFI_IFR_TYPE_NUM_SIZE_64:\r
-    Dest->u64 = Source->u64;\r
-    break;\r
+    case EFI_IFR_TYPE_NUM_SIZE_64:\r
+      Dest->u64 = Source->u64;\r
+      break;\r
 \r
-  default:\r
-    ASSERT (FALSE);\r
-    break;\r
+    default:\r
+      ASSERT (FALSE);\r
+      break;\r
   }\r
 }\r
 \r
@@ -1257,64 +1277,61 @@ SetValuesByType (
 **/\r
 EFI_STATUS\r
 GetSelectionInputPopUp (\r
-  IN  UI_MENU_OPTION              *MenuOption\r
+  IN  UI_MENU_OPTION  *MenuOption\r
   )\r
 {\r
-  EFI_INPUT_KEY           Key;\r
-  UINTN                   Index;\r
-  CHAR16                  *StringPtr;\r
-  CHAR16                  *TempStringPtr;\r
-  UINTN                   Index2;\r
-  UINTN                   TopOptionIndex;\r
-  UINTN                   HighlightOptionIndex;\r
-  UINTN                   Start;\r
-  UINTN                   End;\r
-  UINTN                   Top;\r
-  UINTN                   Bottom;\r
-  UINTN                   PopUpMenuLines;\r
-  UINTN                   MenuLinesInView;\r
-  UINTN                   PopUpWidth;\r
-  CHAR16                  Character;\r
-  INT32                   SavedAttribute;\r
-  BOOLEAN                 ShowDownArrow;\r
-  BOOLEAN                 ShowUpArrow;\r
-  UINTN                   DimensionsWidth;\r
-  LIST_ENTRY              *Link;\r
-  BOOLEAN                 OrderedList;\r
-  UINT8                   *ValueArray;\r
-  UINT8                   *ReturnValue;\r
-  UINT8                   ValueType;\r
-  EFI_HII_VALUE           HiiValue;\r
-  DISPLAY_QUESTION_OPTION         *OneOfOption;\r
-  DISPLAY_QUESTION_OPTION         *CurrentOption;\r
+  EFI_INPUT_KEY                  Key;\r
+  UINTN                          Index;\r
+  CHAR16                         *StringPtr;\r
+  CHAR16                         *TempStringPtr;\r
+  UINTN                          Index2;\r
+  UINTN                          TopOptionIndex;\r
+  UINTN                          HighlightOptionIndex;\r
+  UINTN                          Start;\r
+  UINTN                          End;\r
+  UINTN                          Top;\r
+  UINTN                          Bottom;\r
+  UINTN                          PopUpMenuLines;\r
+  UINTN                          MenuLinesInView;\r
+  UINTN                          PopUpWidth;\r
+  CHAR16                         Character;\r
+  INT32                          SavedAttribute;\r
+  BOOLEAN                        ShowDownArrow;\r
+  BOOLEAN                        ShowUpArrow;\r
+  UINTN                          DimensionsWidth;\r
+  LIST_ENTRY                     *Link;\r
+  BOOLEAN                        OrderedList;\r
+  UINT8                          *ValueArray;\r
+  UINT8                          *ReturnValue;\r
+  UINT8                          ValueType;\r
+  EFI_HII_VALUE                  HiiValue;\r
+  DISPLAY_QUESTION_OPTION        *OneOfOption;\r
+  DISPLAY_QUESTION_OPTION        *CurrentOption;\r
   FORM_DISPLAY_ENGINE_STATEMENT  *Question;\r
-  INTN                    Result;\r
-  EFI_IFR_ORDERED_LIST    *OrderList;\r
+  INTN                           Result;\r
+  EFI_IFR_ORDERED_LIST           *OrderList;\r
 \r
-  DimensionsWidth   = gStatementDimensions.RightColumn - gStatementDimensions.LeftColumn;\r
+  DimensionsWidth = gStatementDimensions.RightColumn - gStatementDimensions.LeftColumn;\r
 \r
-  ValueArray        = NULL;\r
-  ValueType         = 0;\r
-  CurrentOption     = NULL;\r
-  ShowDownArrow     = FALSE;\r
-  ShowUpArrow       = FALSE;\r
-\r
-  StringPtr = AllocateZeroPool ((gOptionBlockWidth + 1) * 2);\r
-  ASSERT (StringPtr);\r
+  ValueArray    = NULL;\r
+  ValueType     = 0;\r
+  CurrentOption = NULL;\r
+  ShowDownArrow = FALSE;\r
+  ShowUpArrow   = FALSE;\r
 \r
   ZeroMem (&HiiValue, sizeof (EFI_HII_VALUE));\r
 \r
   Question = MenuOption->ThisTag;\r
   if (Question->OpCode->OpCode == EFI_IFR_ORDERED_LIST_OP) {\r
-    Link = GetFirstNode (&Question->OptionListHead);\r
+    Link        = GetFirstNode (&Question->OptionListHead);\r
     OneOfOption = DISPLAY_QUESTION_OPTION_FROM_LINK (Link);\r
-    ValueArray = Question->CurrentValue.Buffer;\r
-    ValueType =  OneOfOption->OptionOpCode->Type;\r
+    ValueArray  = Question->CurrentValue.Buffer;\r
+    ValueType   =  OneOfOption->OptionOpCode->Type;\r
     OrderedList = TRUE;\r
-    OrderList = (EFI_IFR_ORDERED_LIST *) Question->OpCode;\r
+    OrderList   = (EFI_IFR_ORDERED_LIST *)Question->OpCode;\r
   } else {\r
     OrderedList = FALSE;\r
-    OrderList = NULL;\r
+    OrderList   = NULL;\r
   }\r
 \r
   //\r
@@ -1322,7 +1339,7 @@ GetSelectionInputPopUp (
   //\r
   PopUpMenuLines = 0;\r
   if (OrderedList) {\r
-    AdjustOptionOrder(Question, &PopUpMenuLines);\r
+    AdjustOptionOrder (Question, &PopUpMenuLines);\r
   } else {\r
     Link = GetFirstNode (&Question->OptionListHead);\r
     while (!IsNull (&Question->OptionListHead, Link)) {\r
@@ -1335,9 +1352,9 @@ GetSelectionInputPopUp (
   //\r
   // Get the number of one of options present and its size\r
   //\r
-  PopUpWidth = 0;\r
+  PopUpWidth           = 0;\r
   HighlightOptionIndex = 0;\r
-  Link = GetFirstNode (&Question->OptionListHead);\r
+  Link                 = GetFirstNode (&Question->OptionListHead);\r
   for (Index = 0; Index < PopUpMenuLines; Index++) {\r
     OneOfOption = DISPLAY_QUESTION_OPTION_FROM_LINK (Link);\r
 \r
@@ -1345,6 +1362,7 @@ GetSelectionInputPopUp (
     if (StrLen (StringPtr) > PopUpWidth) {\r
       PopUpWidth = StrLen (StringPtr);\r
     }\r
+\r
     FreePool (StringPtr);\r
     HiiValue.Type = OneOfOption->OptionOpCode->Type;\r
     SetValuesByType (&HiiValue.Value, &OneOfOption->OptionOpCode->Value, HiiValue.Type);\r
@@ -1377,8 +1395,8 @@ GetSelectionInputPopUp (
 \r
   MenuLinesInView = Bottom - Top - 1;\r
   if (MenuLinesInView >= PopUpMenuLines) {\r
-    Top     = Top + (MenuLinesInView - PopUpMenuLines) / 2;\r
-    Bottom  = Top + PopUpMenuLines + 1;\r
+    Top    = Top + (MenuLinesInView - PopUpMenuLines) / 2;\r
+    Bottom = Top + PopUpMenuLines + 1;\r
   } else {\r
     ShowDownArrow = TRUE;\r
   }\r
@@ -1432,7 +1450,7 @@ GetSelectionInputPopUp (
     Index2 = Top + 1;\r
     for (Index = TopOptionIndex; (Index < PopUpMenuLines) && (Index2 < Bottom); Index++) {\r
       OneOfOption = DISPLAY_QUESTION_OPTION_FROM_LINK (Link);\r
-      Link = GetNextNode (&Question->OptionListHead, Link);\r
+      Link        = GetNextNode (&Question->OptionListHead, Link);\r
 \r
       StringPtr = GetToken (OneOfOption->OptionOpCode->Option, gFormData->HiiHandle);\r
       ASSERT (StringPtr != NULL);\r
@@ -1442,7 +1460,7 @@ GetSelectionInputPopUp (
       //\r
       if (StrLen (StringPtr) > (PopUpWidth - 1)) {\r
         TempStringPtr = AllocateZeroPool (sizeof (CHAR16) * (PopUpWidth - 1));\r
-        ASSERT ( TempStringPtr != NULL );\r
+        ASSERT (TempStringPtr != NULL);\r
         CopyMem (TempStringPtr, StringPtr, (sizeof (CHAR16) * (PopUpWidth - 5)));\r
         FreePool (StringPtr);\r
         StringPtr = TempStringPtr;\r
@@ -1450,18 +1468,18 @@ GetSelectionInputPopUp (
       }\r
 \r
       if (Index == HighlightOptionIndex) {\r
-          //\r
-          // Highlight the selected one\r
-          //\r
-          CurrentOption = OneOfOption;\r
+        //\r
+        // Highlight the selected one\r
+        //\r
+        CurrentOption = OneOfOption;\r
 \r
-          gST->ConOut->SetAttribute (gST->ConOut, GetPickListColor ());\r
-          PrintStringAt (Start + 2, Index2, StringPtr);\r
-          gST->ConOut->SetAttribute (gST->ConOut, GetPopupColor ());\r
-        } else {\r
-          gST->ConOut->SetAttribute (gST->ConOut, GetPopupColor ());\r
-          PrintStringAt (Start + 2, Index2, StringPtr);\r
-        }\r
+        gST->ConOut->SetAttribute (gST->ConOut, GetPickListColor ());\r
+        PrintStringAt (Start + 2, Index2, StringPtr);\r
+        gST->ConOut->SetAttribute (gST->ConOut, GetPopupColor ());\r
+      } else {\r
+        gST->ConOut->SetAttribute (gST->ConOut, GetPopupColor ());\r
+        PrintStringAt (Start + 2, Index2, StringPtr);\r
+      }\r
 \r
       Index2++;\r
       FreePool (StringPtr);\r
@@ -1487,8 +1505,8 @@ GetSelectionInputPopUp (
     //\r
     Key.UnicodeChar = CHAR_NULL;\r
     if ((gDirection == SCAN_UP) || (gDirection == SCAN_DOWN)) {\r
-      Key.ScanCode  = gDirection;\r
-      gDirection    = 0;\r
+      Key.ScanCode = gDirection;\r
+      gDirection   = 0;\r
       goto TheKey;\r
     }\r
 \r
@@ -1496,62 +1514,8 @@ GetSelectionInputPopUp (
 \r
 TheKey:\r
     switch (Key.UnicodeChar) {\r
-    case '+':\r
-      if (OrderedList) {\r
-        if ((TopOptionIndex > 0) && (TopOptionIndex == HighlightOptionIndex)) {\r
-          //\r
-          // Highlight reaches the top of the popup window, scroll one menu item.\r
-          //\r
-          TopOptionIndex--;\r
-          ShowDownArrow = TRUE;\r
-        }\r
-\r
-        if (TopOptionIndex == 0) {\r
-          ShowUpArrow = FALSE;\r
-        }\r
-\r
-        if (HighlightOptionIndex > 0) {\r
-          HighlightOptionIndex--;\r
-\r
-          ASSERT (CurrentOption != NULL);\r
-          SwapListEntries (CurrentOption->Link.BackLink, &CurrentOption->Link);\r
-        }\r
-      }\r
-      break;\r
-\r
-    case '-':\r
-      //\r
-      // If an ordered list op-code, we will allow for a popup of +/- keys\r
-      // to create an ordered list of items\r
-      //\r
-      if (OrderedList) {\r
-        if (((TopOptionIndex + MenuLinesInView) < PopUpMenuLines) &&\r
-            (HighlightOptionIndex == (TopOptionIndex + MenuLinesInView - 1))) {\r
-          //\r
-          // Highlight reaches the bottom of the popup window, scroll one menu item.\r
-          //\r
-          TopOptionIndex++;\r
-          ShowUpArrow = TRUE;\r
-        }\r
-\r
-        if ((TopOptionIndex + MenuLinesInView) == PopUpMenuLines) {\r
-          ShowDownArrow = FALSE;\r
-        }\r
-\r
-        if (HighlightOptionIndex < (PopUpMenuLines - 1)) {\r
-          HighlightOptionIndex++;\r
-\r
-          ASSERT (CurrentOption != NULL);\r
-          SwapListEntries (&CurrentOption->Link, CurrentOption->Link.ForwardLink);\r
-        }\r
-      }\r
-      break;\r
-\r
-    case CHAR_NULL:\r
-      switch (Key.ScanCode) {\r
-      case SCAN_UP:\r
-      case SCAN_DOWN:\r
-        if (Key.ScanCode == SCAN_UP) {\r
+      case '+':\r
+        if (OrderedList) {\r
           if ((TopOptionIndex > 0) && (TopOptionIndex == HighlightOptionIndex)) {\r
             //\r
             // Highlight reaches the top of the popup window, scroll one menu item.\r
@@ -1566,10 +1530,23 @@ TheKey:
 \r
           if (HighlightOptionIndex > 0) {\r
             HighlightOptionIndex--;\r
+\r
+            ASSERT (CurrentOption != NULL);\r
+            SwapListEntries (CurrentOption->Link.BackLink, &CurrentOption->Link);\r
           }\r
-        } else {\r
+        }\r
+\r
+        break;\r
+\r
+      case '-':\r
+        //\r
+        // If an ordered list op-code, we will allow for a popup of +/- keys\r
+        // to create an ordered list of items\r
+        //\r
+        if (OrderedList) {\r
           if (((TopOptionIndex + MenuLinesInView) < PopUpMenuLines) &&\r
-              (HighlightOptionIndex == (TopOptionIndex + MenuLinesInView - 1))) {\r
+              (HighlightOptionIndex == (TopOptionIndex + MenuLinesInView - 1)))\r
+          {\r
             //\r
             // Highlight reaches the bottom of the popup window, scroll one menu item.\r
             //\r
@@ -1583,88 +1560,133 @@ TheKey:
 \r
           if (HighlightOptionIndex < (PopUpMenuLines - 1)) {\r
             HighlightOptionIndex++;\r
+\r
+            ASSERT (CurrentOption != NULL);\r
+            SwapListEntries (&CurrentOption->Link, CurrentOption->Link.ForwardLink);\r
           }\r
         }\r
+\r
         break;\r
 \r
-      case SCAN_ESC:\r
-        gST->ConOut->SetAttribute (gST->ConOut, SavedAttribute);\r
+      case CHAR_NULL:\r
+        switch (Key.ScanCode) {\r
+          case SCAN_UP:\r
+          case SCAN_DOWN:\r
+            if (Key.ScanCode == SCAN_UP) {\r
+              if ((TopOptionIndex > 0) && (TopOptionIndex == HighlightOptionIndex)) {\r
+                //\r
+                // Highlight reaches the top of the popup window, scroll one menu item.\r
+                //\r
+                TopOptionIndex--;\r
+                ShowDownArrow = TRUE;\r
+              }\r
 \r
-        //\r
-        // Restore link list order for orderedlist\r
-        //\r
-        if (OrderedList) {\r
-          HiiValue.Type = ValueType;\r
-          HiiValue.Value.u64 = 0;\r
-          for (Index = 0; Index < OrderList->MaxContainers; Index++) {\r
-            HiiValue.Value.u64 = GetArrayData (ValueArray, ValueType, Index);\r
-            if (HiiValue.Value.u64 == 0) {\r
-              break;\r
+              if (TopOptionIndex == 0) {\r
+                ShowUpArrow = FALSE;\r
+              }\r
+\r
+              if (HighlightOptionIndex > 0) {\r
+                HighlightOptionIndex--;\r
+              }\r
+            } else {\r
+              if (((TopOptionIndex + MenuLinesInView) < PopUpMenuLines) &&\r
+                  (HighlightOptionIndex == (TopOptionIndex + MenuLinesInView - 1)))\r
+              {\r
+                //\r
+                // Highlight reaches the bottom of the popup window, scroll one menu item.\r
+                //\r
+                TopOptionIndex++;\r
+                ShowUpArrow = TRUE;\r
+              }\r
+\r
+              if ((TopOptionIndex + MenuLinesInView) == PopUpMenuLines) {\r
+                ShowDownArrow = FALSE;\r
+              }\r
+\r
+              if (HighlightOptionIndex < (PopUpMenuLines - 1)) {\r
+                HighlightOptionIndex++;\r
+              }\r
             }\r
 \r
-            OneOfOption = ValueToOption (Question, &HiiValue);\r
-            if (OneOfOption == NULL) {\r
-              return EFI_NOT_FOUND;\r
+            break;\r
+\r
+          case SCAN_ESC:\r
+            gST->ConOut->SetAttribute (gST->ConOut, SavedAttribute);\r
+\r
+            //\r
+            // Restore link list order for orderedlist\r
+            //\r
+            if (OrderedList) {\r
+              HiiValue.Type      = ValueType;\r
+              HiiValue.Value.u64 = 0;\r
+              for (Index = 0; Index < OrderList->MaxContainers; Index++) {\r
+                HiiValue.Value.u64 = GetArrayData (ValueArray, ValueType, Index);\r
+                if (HiiValue.Value.u64 == 0) {\r
+                  break;\r
+                }\r
+\r
+                OneOfOption = ValueToOption (Question, &HiiValue);\r
+                if (OneOfOption == NULL) {\r
+                  return EFI_NOT_FOUND;\r
+                }\r
+\r
+                RemoveEntryList (&OneOfOption->Link);\r
+                InsertTailList (&Question->OptionListHead, &OneOfOption->Link);\r
+              }\r
             }\r
 \r
-            RemoveEntryList (&OneOfOption->Link);\r
-            InsertTailList (&Question->OptionListHead, &OneOfOption->Link);\r
-          }\r
-        }\r
+            return EFI_DEVICE_ERROR;\r
 \r
-        return EFI_DEVICE_ERROR;\r
+          default:\r
+            break;\r
+        }\r
 \r
-      default:\r
         break;\r
-      }\r
 \r
-      break;\r
+      case CHAR_CARRIAGE_RETURN:\r
+        //\r
+        // return the current selection\r
+        //\r
+        if (OrderedList) {\r
+          ReturnValue = AllocateZeroPool (Question->CurrentValue.BufferLen);\r
+          ASSERT (ReturnValue != NULL);\r
+          Index = 0;\r
+          Link  = GetFirstNode (&Question->OptionListHead);\r
+          while (!IsNull (&Question->OptionListHead, Link)) {\r
+            OneOfOption = DISPLAY_QUESTION_OPTION_FROM_LINK (Link);\r
+            Link        = GetNextNode (&Question->OptionListHead, Link);\r
+\r
+            SetArrayData (ReturnValue, ValueType, Index, OneOfOption->OptionOpCode->Value.u64);\r
+\r
+            Index++;\r
+            if (Index > OrderList->MaxContainers) {\r
+              break;\r
+            }\r
+          }\r
 \r
-    case CHAR_CARRIAGE_RETURN:\r
-      //\r
-      // return the current selection\r
-      //\r
-      if (OrderedList) {\r
-        ReturnValue = AllocateZeroPool (Question->CurrentValue.BufferLen);\r
-        ASSERT (ReturnValue != NULL);\r
-        Index = 0;\r
-        Link = GetFirstNode (&Question->OptionListHead);\r
-        while (!IsNull (&Question->OptionListHead, Link)) {\r
-          OneOfOption = DISPLAY_QUESTION_OPTION_FROM_LINK (Link);\r
-          Link = GetNextNode (&Question->OptionListHead, Link);\r
-\r
-          SetArrayData (ReturnValue, ValueType, Index, OneOfOption->OptionOpCode->Value.u64);\r
-\r
-          Index++;\r
-          if (Index > OrderList->MaxContainers) {\r
-            break;\r
+          if (CompareMem (ReturnValue, ValueArray, Question->CurrentValue.BufferLen) == 0) {\r
+            FreePool (ReturnValue);\r
+            return EFI_DEVICE_ERROR;\r
+          } else {\r
+            gUserInput->InputValue.Buffer    = ReturnValue;\r
+            gUserInput->InputValue.BufferLen = Question->CurrentValue.BufferLen;\r
           }\r
-        }\r
-        if (CompareMem (ReturnValue, ValueArray, Question->CurrentValue.BufferLen) == 0) {\r
-          FreePool (ReturnValue);\r
-          return EFI_DEVICE_ERROR;\r
         } else {\r
-          gUserInput->InputValue.Buffer = ReturnValue;\r
-          gUserInput->InputValue.BufferLen = Question->CurrentValue.BufferLen;\r
-        }\r
-      } else {\r
-        ASSERT (CurrentOption != NULL);\r
-        gUserInput->InputValue.Type = CurrentOption->OptionOpCode->Type;\r
-        if (IsValuesEqual (&Question->CurrentValue.Value, &CurrentOption->OptionOpCode->Value, gUserInput->InputValue.Type)) {\r
-          return EFI_DEVICE_ERROR;\r
-        } else {\r
-          SetValuesByType (&gUserInput->InputValue.Value, &CurrentOption->OptionOpCode->Value, gUserInput->InputValue.Type);\r
+          ASSERT (CurrentOption != NULL);\r
+          gUserInput->InputValue.Type = CurrentOption->OptionOpCode->Type;\r
+          if (IsValuesEqual (&Question->CurrentValue.Value, &CurrentOption->OptionOpCode->Value, gUserInput->InputValue.Type)) {\r
+            return EFI_DEVICE_ERROR;\r
+          } else {\r
+            SetValuesByType (&gUserInput->InputValue.Value, &CurrentOption->OptionOpCode->Value, gUserInput->InputValue.Type);\r
+          }\r
         }\r
-      }\r
 \r
-      gST->ConOut->SetAttribute (gST->ConOut, SavedAttribute);\r
+        gST->ConOut->SetAttribute (gST->ConOut, SavedAttribute);\r
 \r
-      return EFI_SUCCESS;\r
-      \r
-    default:\r
-      break;\r
+        return EFI_SUCCESS;\r
+\r
+      default:\r
+        break;\r
     }\r
   } while (TRUE);\r
-\r
 }\r
-\r