///\r
#define MAX_CHAR 480\r
\r
+/**\r
+\r
+ Check whether a reset is needed, if reset is needed, Popup a menu to notice user.\r
+\r
+**/\r
+VOID\r
+BmmSetupResetReminder (\r
+ VOID\r
+ )\r
+{\r
+ EFI_INPUT_KEY Key;\r
+ CHAR16 *StringBuffer1;\r
+ CHAR16 *StringBuffer2;\r
+ EFI_STATUS Status;\r
+ EDKII_FORM_BROWSER_EXTENSION2_PROTOCOL *FormBrowserEx2;\r
+\r
+ //\r
+ // Use BrowserEx2 protocol to check whether reset is required.\r
+ //\r
+ Status = gBS->LocateProtocol (&gEdkiiFormBrowserEx2ProtocolGuid, NULL, (VOID **) &FormBrowserEx2);\r
+\r
+ //\r
+ //check any reset required change is applied? if yes, reset system\r
+ //\r
+ if (!EFI_ERROR(Status) && FormBrowserEx2->IsResetRequired()) {\r
+ StringBuffer1 = AllocateZeroPool (MAX_CHAR * sizeof (CHAR16));\r
+ ASSERT (StringBuffer1 != NULL);\r
+ StringBuffer2 = AllocateZeroPool (MAX_CHAR * sizeof (CHAR16));\r
+ ASSERT (StringBuffer2 != NULL);\r
+ StrCpyS (StringBuffer1, MAX_CHAR, L"Configuration changed. Reset to apply it Now.");\r
+ StrCpyS (StringBuffer2, MAX_CHAR, L"Press ENTER to reset");\r
+ //\r
+ // Popup a menu to notice user\r
+ //\r
+ do {\r
+ CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, StringBuffer1, StringBuffer2, NULL);\r
+ } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
+\r
+ FreePool (StringBuffer1);\r
+ FreePool (StringBuffer2);\r
+\r
+ gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);\r
+ }\r
+}\r
+\r
/**\r
Create a menu entry by given menu type.\r
\r
// Since current no boot from removable media directly is allowed */\r
//\r
gST->ConOut->ClearScreen (gST->ConOut);\r
+ //\r
+ // Check whether need to reset system.\r
+ //\r
+ BmmSetupResetReminder ();\r
\r
BmmSetConsoleMode (FALSE);\r
EfiBootManagerBoot (&BootOption);\r