]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdeModulePkg:System hangs in setup menu
authorDandan Bi <dandan.bi@intel.com>
Wed, 17 Jun 2015 09:36:35 +0000 (09:36 +0000)
committerdandanbi <dandanbi@Edk2>
Wed, 17 Jun 2015 09:36:35 +0000 (09:36 +0000)
System hangs when RTC time rollover 1999 to 2000
Error processing of GetTime function:
If get time fail,the date/time will display ??,
and update help info to let user know get time fail.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Dandan Bi <dandan.bi@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17651 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c
MdeModulePkg/Universal/DisplayEngineDxe/FormDisplayStr.uni
MdeModulePkg/Universal/DisplayEngineDxe/ProcessOptions.c
MdeModulePkg/Universal/SetupBrowserDxe/Setup.c

index e198a5e9570f34c5f9974f1b454fcfdfac3f4a3b..9f50f832aae2a3c0be61f586a392fc20cb5cbcc4 100644 (file)
@@ -2545,6 +2545,8 @@ UiDisplayMenu (
   UINTN                           BottomRow;\r
   UINTN                           Index;\r
   CHAR16                          *StringPtr;\r
+  CHAR16                          *StringRightPtr;\r
+  CHAR16                          *StringErrorPtr;\r
   CHAR16                          *OptionString;\r
   CHAR16                          *HelpString;\r
   CHAR16                          *HelpHeaderString;\r
@@ -2579,6 +2581,7 @@ UiDisplayMenu (
   EFI_STRING_ID                   HelpInfo;\r
   UI_EVENT_TYPE                   EventType;\r
   BOOLEAN                         SkipHighLight;\r
+  EFI_HII_VALUE                   *StatementValue;\r
 \r
   EventType           = UIEventNone;\r
   Status              = EFI_SUCCESS;\r
@@ -2885,10 +2888,26 @@ UiDisplayMenu (
           //\r
           ASSERT(MenuOption != NULL);\r
           HelpInfo = ((EFI_IFR_STATEMENT_HEADER *) ((CHAR8 *)MenuOption->ThisTag->OpCode + sizeof (EFI_IFR_OP_HEADER)))->Help;\r
+          Statement = MenuOption->ThisTag;\r
+          StatementValue = &Statement->CurrentValue;\r
           if (HelpInfo == 0 || !IsSelectable (MenuOption)) {\r
-            StringPtr = GetToken (STRING_TOKEN (EMPTY_STRING), gHiiHandle);\r
+            if ((Statement->OpCode->OpCode == EFI_IFR_DATE_OP && StatementValue->Value.date.Month== 0xff)||(Statement->OpCode->OpCode == EFI_IFR_TIME_OP && StatementValue->Value.time.Hour == 0xff)){\r
+              StringPtr = GetToken (STRING_TOKEN (GET_TIME_FAIL), gHiiHandle);\r
+            } else {\r
+              StringPtr = GetToken (STRING_TOKEN (EMPTY_STRING), gHiiHandle);\r
+            }\r
           } else {\r
-            StringPtr = GetToken (HelpInfo, gFormData->HiiHandle);\r
+            if ((Statement->OpCode->OpCode == EFI_IFR_DATE_OP && StatementValue->Value.date.Month== 0xff)||(Statement->OpCode->OpCode == EFI_IFR_TIME_OP && StatementValue->Value.time.Hour == 0xff)){\r
+              StringRightPtr = GetToken (HelpInfo, gFormData->HiiHandle);\r
+              StringErrorPtr = GetToken (STRING_TOKEN (GET_TIME_FAIL), gHiiHandle);\r
+              StringPtr = AllocateZeroPool ((StrLen (StringRightPtr) + StrLen (StringErrorPtr)+ 1 ) * sizeof (CHAR16));\r
+              StrCpyS (StringPtr, StrLen (StringRightPtr) + StrLen (StringErrorPtr) + 1, StringRightPtr);\r
+              StrCatS (StringPtr, StrLen (StringRightPtr) + StrLen (StringErrorPtr) + 1, StringErrorPtr);\r
+              FreePool (StringRightPtr);\r
+              FreePool (StringErrorPtr);\r
+            } else {\r
+              StringPtr = GetToken (HelpInfo, gFormData->HiiHandle);\r
+            }\r
           }\r
         }\r
 \r
index 2a06c3d495b308b7b41767f408b72b62594a4c67..5c6ad48433b2c6f50016dc27a5801da90930e76f 100644 (file)
Binary files a/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplayStr.uni and b/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplayStr.uni differ
index 84ae03eea70fb3d01b6f361ddd3efd02b5904cb1..52dc5f29d93c7fd13e0df8c738210924790c2e01 100644 (file)
@@ -2,7 +2,7 @@
 Implementation for handling the User Interface option processing.\r
 \r
 \r
-Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>\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
@@ -1278,19 +1278,31 @@ ProcessOptions (
       switch (MenuOption->Sequence) {\r
       case 0:\r
         *OptionString[0] = LEFT_NUMERIC_DELIMITER;\r
-        UnicodeSPrint (OptionString[0] + 1, 21 * sizeof (CHAR16), L"%02d", QuestionValue->Value.date.Month);\r
+        if (QuestionValue->Value.date.Month == 0xff){\r
+          UnicodeSPrint (OptionString[0] + 1, 21 * sizeof (CHAR16), L"??");\r
+        } else {\r
+          UnicodeSPrint (OptionString[0] + 1, 21 * sizeof (CHAR16), L"%02d", QuestionValue->Value.date.Month);\r
+        }\r
         *(OptionString[0] + 3) = DATE_SEPARATOR;\r
         break;\r
 \r
       case 1:\r
         SetUnicodeMem (OptionString[0], 4, L' ');\r
-        UnicodeSPrint (OptionString[0] + 4, 21 * sizeof (CHAR16), L"%02d", QuestionValue->Value.date.Day);\r
+        if (QuestionValue->Value.date.Day == 0xff){\r
+          UnicodeSPrint (OptionString[0] + 4, 21 * sizeof (CHAR16), L"??");\r
+        } else {\r
+          UnicodeSPrint (OptionString[0] + 4, 21 * sizeof (CHAR16), L"%02d", QuestionValue->Value.date.Day);\r
+        }\r
         *(OptionString[0] + 6) = DATE_SEPARATOR;\r
         break;\r
 \r
       case 2:\r
         SetUnicodeMem (OptionString[0], 7, L' ');\r
-        UnicodeSPrint (OptionString[0] + 7, 21 * sizeof (CHAR16), L"%04d", QuestionValue->Value.date.Year);\r
+        if (QuestionValue->Value.date.Year == 0xff){\r
+          UnicodeSPrint (OptionString[0] + 7, 21 * sizeof (CHAR16), L"????");\r
+        } else {\r
+          UnicodeSPrint (OptionString[0] + 7, 21 * sizeof (CHAR16), L"%04d", QuestionValue->Value.date.Year);\r
+        }\r
         *(OptionString[0] + 11) = RIGHT_NUMERIC_DELIMITER;\r
         break;\r
       }\r
@@ -1310,19 +1322,31 @@ ProcessOptions (
       switch (MenuOption->Sequence) {\r
       case 0:\r
         *OptionString[0] = LEFT_NUMERIC_DELIMITER;\r
-        UnicodeSPrint (OptionString[0] + 1, 21 * sizeof (CHAR16), L"%02d", QuestionValue->Value.time.Hour);\r
+        if (QuestionValue->Value.time.Hour == 0xff){\r
+          UnicodeSPrint (OptionString[0] + 1, 21 * sizeof (CHAR16), L"??");\r
+        } else {\r
+          UnicodeSPrint (OptionString[0] + 1, 21 * sizeof (CHAR16), L"%02d", QuestionValue->Value.time.Hour);\r
+        }\r
         *(OptionString[0] + 3) = TIME_SEPARATOR;\r
         break;\r
 \r
       case 1:\r
         SetUnicodeMem (OptionString[0], 4, L' ');\r
-        UnicodeSPrint (OptionString[0] + 4, 21 * sizeof (CHAR16), L"%02d", QuestionValue->Value.time.Minute);\r
+        if (QuestionValue->Value.time.Minute == 0xff){\r
+          UnicodeSPrint (OptionString[0] + 4, 21 * sizeof (CHAR16), L"??");\r
+        } else {\r
+          UnicodeSPrint (OptionString[0] + 4, 21 * sizeof (CHAR16), L"%02d", QuestionValue->Value.time.Minute);\r
+        }\r
         *(OptionString[0] + 6) = TIME_SEPARATOR;\r
         break;\r
 \r
       case 2:\r
         SetUnicodeMem (OptionString[0], 7, L' ');\r
-        UnicodeSPrint (OptionString[0] + 7, 21 * sizeof (CHAR16), L"%02d", QuestionValue->Value.time.Second);\r
+        if (QuestionValue->Value.time.Second == 0xff){\r
+          UnicodeSPrint (OptionString[0] + 7, 21 * sizeof (CHAR16), L"??");\r
+        } else {\r
+          UnicodeSPrint (OptionString[0] + 7, 21 * sizeof (CHAR16), L"%02d", QuestionValue->Value.time.Second);\r
+        }\r
         *(OptionString[0] + 9) = RIGHT_NUMERIC_DELIMITER;\r
         break;\r
       }\r
index 4d286179e7874161a423ba7e4f9eab2af91e42e5..b153dd4bfe37f87a3550cb80e908b21cac0207fe 100644 (file)
@@ -1595,7 +1595,16 @@ GetQuestionValue (
       }\r
 \r
       if (EFI_ERROR (Status)) {\r
-        return Status;\r
+        if (Question->Operand == EFI_IFR_DATE_OP){\r
+          QuestionValue->date.Year  = 0xff;\r
+          QuestionValue->date.Month = 0xff;\r
+          QuestionValue->date.Day   = 0xff;\r
+        } else {\r
+          QuestionValue->time.Hour   = 0xff;\r
+          QuestionValue->time.Minute = 0xff;\r
+          QuestionValue->time.Second = 0xff;\r
+        }\r
+        return EFI_SUCCESS;\r
       }\r
 \r
       if (Question->Operand == EFI_IFR_DATE_OP) {\r