2 FrontPage routines to handle the callbacks and browser calls
4 Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
16 #include "FrontPage.h"
19 EFI_GUID mFrontPageGuid
= FRONT_PAGE_FORMSET_GUID
;
21 BOOLEAN gConnectAllHappened
= FALSE
;
24 EFI_FORM_BROWSER2_PROTOCOL
*gFormBrowser2
;
26 FRONT_PAGE_CALLBACK_DATA gFrontPagePrivate
= {
27 FRONT_PAGE_CALLBACK_DATA_SIGNATURE
,
38 HII_VENDOR_DEVICE_PATH mFrontPageHiiVendorDevicePath
= {
44 (UINT8
) (sizeof (VENDOR_DEVICE_PATH
)),
45 (UINT8
) ((sizeof (VENDOR_DEVICE_PATH
)) >> 8)
49 // {8E6D99EE-7531-48f8-8745-7F6144468FF2}
51 { 0x8e6d99ee, 0x7531, 0x48f8, { 0x87, 0x45, 0x7f, 0x61, 0x44, 0x46, 0x8f, 0xf2 } }
55 END_ENTIRE_DEVICE_PATH_SUBTYPE
,
57 (UINT8
) (END_DEVICE_PATH_LENGTH
),
58 (UINT8
) ((END_DEVICE_PATH_LENGTH
) >> 8)
64 This function allows a caller to extract the current configuration for one
65 or more named elements from the target driver.
68 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
69 @param Request A null-terminated Unicode string in <ConfigRequest> format.
70 @param Progress On return, points to a character in the Request string.
71 Points to the string's null terminator if request was successful.
72 Points to the most recent '&' before the first failing name/value
73 pair (or the beginning of the string if the failure is in the
74 first name/value pair) if the request was not successful.
75 @param Results A null-terminated Unicode string in <ConfigAltResp> format which
76 has all values filled in for the names in the Request string.
77 String to be allocated by the called function.
79 @retval EFI_SUCCESS The Results is filled with the requested values.
80 @retval EFI_OUT_OF_RESOURCES Not enough memory to store the results.
81 @retval EFI_INVALID_PARAMETER Request is illegal syntax, or unknown name.
82 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this driver.
88 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL
*This
,
89 IN CONST EFI_STRING Request
,
90 OUT EFI_STRING
*Progress
,
91 OUT EFI_STRING
*Results
94 if (Progress
== NULL
|| Results
== NULL
) {
95 return EFI_INVALID_PARAMETER
;
102 This function processes the results of changes in configuration.
105 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
106 @param Configuration A null-terminated Unicode string in <ConfigResp> format.
107 @param Progress A pointer to a string filled in with the offset of the most
108 recent '&' before the first failing name/value pair (or the
109 beginning of the string if the failure is in the first
110 name/value pair) or the terminating NULL if all was successful.
112 @retval EFI_SUCCESS The Results is processed successfully.
113 @retval EFI_INVALID_PARAMETER Configuration is NULL.
114 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this driver.
120 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL
*This
,
121 IN CONST EFI_STRING Configuration
,
122 OUT EFI_STRING
*Progress
125 if (Configuration
== NULL
|| Progress
== NULL
) {
126 return EFI_INVALID_PARAMETER
;
129 *Progress
= Configuration
;
130 if (!HiiIsConfigHdrMatch (Configuration
, &mBootMaintGuid
, mBootMaintStorageName
)
131 && !HiiIsConfigHdrMatch (Configuration
, &mFileExplorerGuid
, mFileExplorerStorageName
)) {
132 return EFI_NOT_FOUND
;
135 *Progress
= Configuration
+ StrLen (Configuration
);
140 This function processes the results of changes in configuration.
143 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
144 @param Action Specifies the type of action taken by the browser.
145 @param QuestionId A unique value which is sent to the original exporting driver
146 so that it can identify the type of data to expect.
147 @param Type The type of value for the question.
148 @param Value A pointer to the data being sent to the original exporting driver.
149 @param ActionRequest On return, points to the action requested by the callback function.
151 @retval EFI_SUCCESS The callback successfully handled the action.
152 @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the variable and its data.
153 @retval EFI_DEVICE_ERROR The variable could not be saved.
154 @retval EFI_UNSUPPORTED The specified Action is not supported by the callback.
160 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL
*This
,
161 IN EFI_BROWSER_ACTION Action
,
162 IN EFI_QUESTION_ID QuestionId
,
164 IN EFI_IFR_TYPE_VALUE
*Value
,
165 OUT EFI_BROWSER_ACTION_REQUEST
*ActionRequest
168 CHAR8
*LanguageString
;
173 CHAR8
*PlatformSupportedLanguages
;
176 if ((Action
== EFI_BROWSER_ACTION_FORM_OPEN
) || (Action
== EFI_BROWSER_ACTION_FORM_CLOSE
)) {
178 // Do nothing for UEFI OPEN/CLOSE Action
183 if ((Value
== NULL
) || (ActionRequest
== NULL
)) {
184 return EFI_INVALID_PARAMETER
;
187 gCallbackKey
= QuestionId
;
190 // The first 4 entries in the Front Page are to be GUARANTEED to remain constant so IHV's can
191 // describe to their customers in documentation how to find their setup information (namely
192 // under the device manager and specific buckets)
194 switch (QuestionId
) {
195 case FRONT_PAGE_KEY_CONTINUE
:
197 // This is the continue - clear the screen and return an error to get out of FrontPage loop
201 case FRONT_PAGE_KEY_LANGUAGE
:
203 // Collect the languages from what our current Language support is based on our VFR
205 LanguageString
= HiiGetSupportedLanguages (gFrontPagePrivate
.HiiHandle
);
206 ASSERT (LanguageString
!= NULL
);
208 // Allocate working buffer for RFC 4646 language in supported LanguageString.
210 Lang
= AllocatePool (AsciiStrSize (LanguageString
));
211 ASSERT (Lang
!= NULL
);
214 LangCode
= LanguageString
;
215 while (*LangCode
!= 0) {
216 GetNextLanguage (&LangCode
, Lang
);
218 if (Index
== Value
->u8
) {
225 PlatformSupportedLanguages
= GetEfiGlobalVariable (L
"PlatformLangCodes");
226 if (PlatformSupportedLanguages
== NULL
) {
227 PlatformSupportedLanguages
= AllocateCopyPool (
228 AsciiStrSize ((CHAR8
*) PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes
)),
229 (CHAR8
*) PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes
)
231 ASSERT (PlatformSupportedLanguages
!= NULL
);
235 // Select the best language in platform supported Language.
237 BestLanguage
= GetBestLanguage (
238 PlatformSupportedLanguages
,
243 if (BestLanguage
!= NULL
) {
244 Status
= gRT
->SetVariable (
246 &gEfiGlobalVariableGuid
,
247 EFI_VARIABLE_NON_VOLATILE
| EFI_VARIABLE_BOOTSERVICE_ACCESS
| EFI_VARIABLE_RUNTIME_ACCESS
,
248 AsciiStrSize (BestLanguage
),
251 ASSERT_EFI_ERROR(Status
);
252 FreePool (BestLanguage
);
257 FreePool (PlatformSupportedLanguages
);
259 FreePool (LanguageString
);
262 case FRONT_PAGE_KEY_BOOT_MANAGER
:
268 case FRONT_PAGE_KEY_DEVICE_MANAGER
:
274 case FRONT_PAGE_KEY_BOOT_MAINTAIN
:
276 // Boot Maintenance Manager
285 *ActionRequest
= EFI_BROWSER_ACTION_REQUEST_EXIT
;
291 Initialize HII information for the FrontPage
294 @param InitializeHiiData TRUE if HII elements need to be initialized.
296 @retval EFI_SUCCESS The operation is successful.
297 @retval EFI_DEVICE_ERROR If the dynamic opcode creation failed.
301 InitializeFrontPage (
302 IN BOOLEAN InitializeHiiData
306 CHAR8
*LanguageString
;
312 CHAR16
*StringBuffer
;
313 EFI_HII_HANDLE HiiHandle
;
314 VOID
*OptionsOpCodeHandle
;
315 VOID
*StartOpCodeHandle
;
316 VOID
*EndOpCodeHandle
;
317 EFI_IFR_GUID_LABEL
*StartLabel
;
318 EFI_IFR_GUID_LABEL
*EndLabel
;
321 if (InitializeHiiData
) {
323 // Initialize the Device Manager
325 InitializeDeviceManager ();
328 // Initialize the Device Manager
330 InitializeBootManager ();
335 // Locate Hii relative protocols
337 Status
= gBS
->LocateProtocol (&gEfiFormBrowser2ProtocolGuid
, NULL
, (VOID
**) &gFormBrowser2
);
338 if (EFI_ERROR (Status
)) {
343 // Install Device Path Protocol and Config Access protocol to driver handle
345 Status
= gBS
->InstallMultipleProtocolInterfaces (
346 &gFrontPagePrivate
.DriverHandle
,
347 &gEfiDevicePathProtocolGuid
,
348 &mFrontPageHiiVendorDevicePath
,
349 &gEfiHiiConfigAccessProtocolGuid
,
350 &gFrontPagePrivate
.ConfigAccess
,
353 ASSERT_EFI_ERROR (Status
);
356 // Publish our HII data
358 gFrontPagePrivate
.HiiHandle
= HiiAddPackages (
360 gFrontPagePrivate
.DriverHandle
,
365 if (gFrontPagePrivate
.HiiHandle
== NULL
) {
366 return EFI_OUT_OF_RESOURCES
;
372 // Init OpCode Handle and Allocate space for creation of UpdateData Buffer
374 StartOpCodeHandle
= HiiAllocateOpCodeHandle ();
375 ASSERT (StartOpCodeHandle
!= NULL
);
377 EndOpCodeHandle
= HiiAllocateOpCodeHandle ();
378 ASSERT (EndOpCodeHandle
!= NULL
);
380 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
381 ASSERT (OptionsOpCodeHandle
!= NULL
);
383 // Create Hii Extend Label OpCode as the start opcode
385 StartLabel
= (EFI_IFR_GUID_LABEL
*) HiiCreateGuidOpCode (StartOpCodeHandle
, &gEfiIfrTianoGuid
, NULL
, sizeof (EFI_IFR_GUID_LABEL
));
386 StartLabel
->ExtendOpCode
= EFI_IFR_EXTEND_OP_LABEL
;
387 StartLabel
->Number
= LABEL_SELECT_LANGUAGE
;
390 // Create Hii Extend Label OpCode as the end opcode
392 EndLabel
= (EFI_IFR_GUID_LABEL
*) HiiCreateGuidOpCode (EndOpCodeHandle
, &gEfiIfrTianoGuid
, NULL
, sizeof (EFI_IFR_GUID_LABEL
));
393 EndLabel
->ExtendOpCode
= EFI_IFR_EXTEND_OP_LABEL
;
394 EndLabel
->Number
= LABEL_END
;
397 // Collect the languages from what our current Language support is based on our VFR
399 HiiHandle
= gFrontPagePrivate
.HiiHandle
;
400 LanguageString
= HiiGetSupportedLanguages (HiiHandle
);
401 ASSERT (LanguageString
!= NULL
);
403 // Allocate working buffer for RFC 4646 language in supported LanguageString.
405 Lang
= AllocatePool (AsciiStrSize (LanguageString
));
406 ASSERT (Lang
!= NULL
);
408 CurrentLang
= GetEfiGlobalVariable (L
"PlatformLang");
410 // Select the best language in LanguageString as the default one.
412 BestLanguage
= GetBestLanguage (
415 (CurrentLang
!= NULL
) ? CurrentLang
: "",
416 (CHAR8
*) PcdGetPtr (PcdUefiVariableDefaultPlatformLang
),
421 // BestLanguage must be selected as it is the first language in LanguageString by default
423 ASSERT (BestLanguage
!= NULL
);
426 LangCode
= LanguageString
;
429 if (gFrontPagePrivate
.LanguageToken
== NULL
) {
430 while (*LangCode
!= 0) {
431 GetNextLanguage (&LangCode
, Lang
);
434 gFrontPagePrivate
.LanguageToken
= AllocatePool (OptionCount
* sizeof (EFI_STRING_ID
));
435 ASSERT (gFrontPagePrivate
.LanguageToken
!= NULL
);
440 LangCode
= LanguageString
;
441 while (*LangCode
!= 0) {
442 GetNextLanguage (&LangCode
, Lang
);
445 StringBuffer
= HiiGetString (HiiHandle
, PRINTABLE_LANGUAGE_NAME_STRING_ID
, Lang
);
446 ASSERT (StringBuffer
!= NULL
);
449 // Save the string Id for each language
451 gFrontPagePrivate
.LanguageToken
[OptionCount
] = HiiSetString (HiiHandle
, 0, StringBuffer
, NULL
);
452 FreePool (StringBuffer
);
455 if (AsciiStrCmp (Lang
, BestLanguage
) == 0) {
456 HiiCreateOneOfOptionOpCode (
458 gFrontPagePrivate
.LanguageToken
[OptionCount
],
459 EFI_IFR_OPTION_DEFAULT
,
460 EFI_IFR_NUMERIC_SIZE_1
,
464 HiiCreateOneOfOptionOpCode (
466 gFrontPagePrivate
.LanguageToken
[OptionCount
],
468 EFI_IFR_NUMERIC_SIZE_1
,
476 if (CurrentLang
!= NULL
) {
477 FreePool (CurrentLang
);
479 FreePool (BestLanguage
);
481 FreePool (LanguageString
);
483 HiiCreateOneOfOpCode (
485 FRONT_PAGE_KEY_LANGUAGE
,
488 STRING_TOKEN (STR_LANGUAGE_SELECT
),
489 STRING_TOKEN (STR_LANGUAGE_SELECT_HELP
),
490 EFI_IFR_FLAG_CALLBACK
,
491 EFI_IFR_NUMERIC_SIZE_1
,
496 Status
= HiiUpdateForm (
500 StartOpCodeHandle
, // LABEL_SELECT_LANGUAGE
501 EndOpCodeHandle
// LABEL_END
504 HiiFreeOpCodeHandle (StartOpCodeHandle
);
505 HiiFreeOpCodeHandle (EndOpCodeHandle
);
506 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
511 Call the browser and display the front page
513 @return Status code that will be returned by
514 EFI_FORM_BROWSER2_PROTOCOL.SendForm ().
523 EFI_BROWSER_ACTION_REQUEST ActionRequest
;
526 // Begin waiting for USER INPUT
530 (EFI_SOFTWARE_DXE_BS_DRIVER
| EFI_SW_PC_INPUT_WAIT
)
533 ActionRequest
= EFI_BROWSER_ACTION_REQUEST_NONE
;
534 Status
= gFormBrowser2
->SendForm (
536 &gFrontPagePrivate
.HiiHandle
,
544 // Check whether user change any option setting which needs a reset to be effective
546 if (ActionRequest
== EFI_BROWSER_ACTION_REQUEST_RESET
) {
547 EnableResetRequired ();
554 Acquire the string associated with the ProducerGuid and return it.
557 @param ProducerGuid The Guid to search the HII database for
558 @param Token The token value of the string to extract
559 @param String The string that is extracted
561 @retval EFI_SUCCESS The function returns EFI_SUCCESS always.
566 IN EFI_GUID
*ProducerGuid
,
567 IN EFI_STRING_ID Token
,
571 EFI_STRING TmpString
;
573 TmpString
= HiiGetPackageString (ProducerGuid
, Token
, NULL
);
574 if (TmpString
== NULL
) {
575 *String
= GetStringById (STRING_TOKEN (STR_MISSING_STRING
));
584 Convert Processor Frequency Data to a string.
586 @param ProcessorFrequency The frequency data to process
587 @param Base10Exponent The exponent based on 10
588 @param String The string that is created
592 ConvertProcessorToString (
593 IN UINT16 ProcessorFrequency
,
594 IN UINT16 Base10Exponent
,
598 CHAR16
*StringBuffer
;
602 if (Base10Exponent
>= 6) {
603 FreqMhz
= ProcessorFrequency
;
604 for (Index
= 0; Index
< (UINTN
) (Base10Exponent
- 6); Index
++) {
611 StringBuffer
= AllocateZeroPool (0x20);
612 ASSERT (StringBuffer
!= NULL
);
613 Index
= UnicodeValueToString (StringBuffer
, LEFT_JUSTIFY
, FreqMhz
/ 1000, 3);
614 StrCat (StringBuffer
, L
".");
615 UnicodeValueToString (StringBuffer
+ Index
+ 1, PREFIX_ZERO
, (FreqMhz
% 1000) / 10, 2);
616 StrCat (StringBuffer
, L
" GHz");
617 *String
= (CHAR16
*) StringBuffer
;
623 Convert Memory Size to a string.
625 @param MemorySize The size of the memory to process
626 @param String The string that is created
630 ConvertMemorySizeToString (
631 IN UINT32 MemorySize
,
635 CHAR16
*StringBuffer
;
637 StringBuffer
= AllocateZeroPool (0x20);
638 ASSERT (StringBuffer
!= NULL
);
639 UnicodeValueToString (StringBuffer
, LEFT_JUSTIFY
, MemorySize
, 6);
640 StrCat (StringBuffer
, L
" MB RAM");
642 *String
= (CHAR16
*) StringBuffer
;
649 Acquire the string associated with the Index from smbios structure and return it.
650 The caller is responsible for free the string buffer.
652 @param OptionalStrStart The start position to search the string
653 @param Index The index of the string to extract
654 @param String The string that is extracted
656 @retval EFI_SUCCESS The function returns EFI_SUCCESS always.
660 GetOptionalStringByIndex (
661 IN CHAR8
*OptionalStrStart
,
672 Status
= EFI_NOT_FOUND
;
673 CharInStr
= OptionalStrStart
;
678 // look for the two consecutive zeros, check the string limit by the way.
680 while (*CharInStr
!= 0 || *(CharInStr
+1) != 0) {
681 if (*CharInStr
== 0) {
686 if (StrNum
== Index
) {
687 Status
= EFI_SUCCESS
;
691 CurrentStrLen
= AsciiStrLen(CharInStr
);
694 // forward the pointer
696 OptionalStrStart
= CharInStr
;
697 CharInStr
+= CurrentStrLen
;
700 if (EFI_ERROR (Status
)) {
701 *String
= GetStringById (STRING_TOKEN (STR_MISSING_STRING
));
705 CurrentStrLen
= AsciiStrLen(CharInStr
);
708 *String
= AllocatePool((CurrentStrLen
+ 1)*sizeof(CHAR16
));
709 AsciiStrToUnicodeStr(OptionalStrStart
, *String
);
716 Update the banner information for the Front Page based on DataHub information.
720 UpdateFrontPageStrings (
728 EFI_STRING_ID TokenToUpdate
;
729 EFI_SMBIOS_HANDLE SmbiosHandle
;
730 EFI_SMBIOS_PROTOCOL
*Smbios
;
731 SMBIOS_TABLE_TYPE0
*Type0Record
;
732 SMBIOS_TABLE_TYPE1
*Type1Record
;
733 SMBIOS_TABLE_TYPE4
*Type4Record
;
734 SMBIOS_TABLE_TYPE19
*Type19Record
;
735 EFI_SMBIOS_TABLE_HEADER
*Record
;
737 ZeroMem (Find
, sizeof (Find
));
740 // Update Front Page strings
742 Status
= gBS
->LocateProtocol (
743 &gEfiSmbiosProtocolGuid
,
747 ASSERT_EFI_ERROR (Status
);
751 Status
= Smbios
->GetNext (Smbios
, &SmbiosHandle
, NULL
, &Record
, NULL
);
752 if (EFI_ERROR(Status
)) {
756 if (Record
->Type
== EFI_SMBIOS_TYPE_BIOS_INFORMATION
) {
757 Type0Record
= (SMBIOS_TABLE_TYPE0
*) Record
;
758 StrIndex
= Type0Record
->BiosVersion
;
759 GetOptionalStringByIndex ((CHAR8
*)((UINT8
*)Type0Record
+ Type0Record
->Hdr
.Length
), StrIndex
, &NewString
);
760 TokenToUpdate
= STRING_TOKEN (STR_FRONT_PAGE_BIOS_VERSION
);
761 HiiSetString (gFrontPagePrivate
.HiiHandle
, TokenToUpdate
, NewString
, NULL
);
762 FreePool (NewString
);
766 if (Record
->Type
== EFI_SMBIOS_TYPE_SYSTEM_INFORMATION
) {
767 Type1Record
= (SMBIOS_TABLE_TYPE1
*) Record
;
768 StrIndex
= Type1Record
->ProductName
;
769 GetOptionalStringByIndex ((CHAR8
*)((UINT8
*)Type1Record
+ Type1Record
->Hdr
.Length
), StrIndex
, &NewString
);
770 TokenToUpdate
= STRING_TOKEN (STR_FRONT_PAGE_COMPUTER_MODEL
);
771 HiiSetString (gFrontPagePrivate
.HiiHandle
, TokenToUpdate
, NewString
, NULL
);
772 FreePool (NewString
);
776 if (Record
->Type
== EFI_SMBIOS_TYPE_PROCESSOR_INFORMATION
) {
777 Type4Record
= (SMBIOS_TABLE_TYPE4
*) Record
;
778 StrIndex
= Type4Record
->ProcessorVersion
;
779 GetOptionalStringByIndex ((CHAR8
*)((UINT8
*)Type4Record
+ Type4Record
->Hdr
.Length
), StrIndex
, &NewString
);
780 TokenToUpdate
= STRING_TOKEN (STR_FRONT_PAGE_CPU_MODEL
);
781 HiiSetString (gFrontPagePrivate
.HiiHandle
, TokenToUpdate
, NewString
, NULL
);
782 FreePool (NewString
);
786 if (Record
->Type
== EFI_SMBIOS_TYPE_PROCESSOR_INFORMATION
) {
787 Type4Record
= (SMBIOS_TABLE_TYPE4
*) Record
;
788 ConvertProcessorToString(Type4Record
->CurrentSpeed
, 6, &NewString
);
789 TokenToUpdate
= STRING_TOKEN (STR_FRONT_PAGE_CPU_SPEED
);
790 HiiSetString (gFrontPagePrivate
.HiiHandle
, TokenToUpdate
, NewString
, NULL
);
791 FreePool (NewString
);
795 if ( Record
->Type
== EFI_SMBIOS_TYPE_MEMORY_ARRAY_MAPPED_ADDRESS
) {
796 Type19Record
= (SMBIOS_TABLE_TYPE19
*) Record
;
797 ConvertMemorySizeToString (
798 (UINT32
)(RShiftU64((Type19Record
->EndingAddress
- Type19Record
->StartingAddress
+ 1), 10)),
801 TokenToUpdate
= STRING_TOKEN (STR_FRONT_PAGE_MEMORY_SIZE
);
802 HiiSetString (gFrontPagePrivate
.HiiHandle
, TokenToUpdate
, NewString
, NULL
);
803 FreePool (NewString
);
806 } while ( !(Find
[0] && Find
[1] && Find
[2] && Find
[3] && Find
[4]));
812 Function waits for a given event to fire, or for an optional timeout to expire.
814 @param Event The event to wait for
815 @param Timeout An optional timeout value in 100 ns units.
817 @retval EFI_SUCCESS Event fired before Timeout expired.
818 @retval EFI_TIME_OUT Timout expired before Event fired..
824 IN UINT64 Timeout OPTIONAL
829 EFI_EVENT TimerEvent
;
830 EFI_EVENT WaitList
[2];
834 // Create a timer event
836 Status
= gBS
->CreateEvent (EVT_TIMER
, 0, NULL
, NULL
, &TimerEvent
);
837 if (!EFI_ERROR (Status
)) {
839 // Set the timer event
848 // Wait for the original event or the timer
851 WaitList
[1] = TimerEvent
;
852 Status
= gBS
->WaitForEvent (2, WaitList
, &Index
);
853 gBS
->CloseEvent (TimerEvent
);
856 // If the timer expired, change the return to timed out
858 if (!EFI_ERROR (Status
) && Index
== 1) {
859 Status
= EFI_TIMEOUT
;
864 // No timeout... just wait on the event
866 Status
= gBS
->WaitForEvent (1, &Event
, &Index
);
867 ASSERT (!EFI_ERROR (Status
));
875 Function show progress bar to wait for user input.
878 @param TimeoutDefault The fault time out value before the system continue to boot.
880 @retval EFI_SUCCESS User pressed some key except "Enter"
881 @retval EFI_TIME_OUT Timeout expired or user press "Enter"
886 IN UINT16 TimeoutDefault
890 UINT16 TimeoutRemain
;
893 EFI_GRAPHICS_OUTPUT_BLT_PIXEL Foreground
;
894 EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background
;
895 EFI_GRAPHICS_OUTPUT_BLT_PIXEL Color
;
897 if (TimeoutDefault
== 0) {
901 DEBUG ((EFI_D_INFO
, "\n\nStart showing progress bar... Press any key to stop it! ...Zzz....\n"));
903 SetMem (&Foreground
, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL
), 0xff);
904 SetMem (&Background
, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL
), 0x0);
905 SetMem (&Color
, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL
), 0xff);
908 // Clear the progress status bar first
910 TmpStr
= GetStringById (STRING_TOKEN (STR_START_BOOT_OPTION
));
911 if (TmpStr
!= NULL
) {
912 PlatformBdsShowProgress (Foreground
, Background
, TmpStr
, Color
, 0, 0);
915 TimeoutRemain
= TimeoutDefault
;
916 while (TimeoutRemain
!= 0) {
917 DEBUG ((EFI_D_INFO
, "Showing progress bar...Remaining %d second!\n", TimeoutRemain
));
919 Status
= WaitForSingleEvent (gST
->ConIn
->WaitForKey
, ONE_SECOND
);
920 if (Status
!= EFI_TIMEOUT
) {
928 if (TmpStr
!= NULL
) {
929 PlatformBdsShowProgress (
934 ((TimeoutDefault
- TimeoutRemain
) * 100 / TimeoutDefault
),
939 gBS
->FreePool (TmpStr
);
944 if (TimeoutRemain
== 0) {
949 // User pressed some key
951 Status
= gST
->ConIn
->ReadKeyStroke (gST
->ConIn
, &Key
);
952 if (EFI_ERROR (Status
)) {
956 if (Key
.UnicodeChar
== CHAR_CARRIAGE_RETURN
) {
958 // User pressed enter, equivalent to select "continue"
967 This function is the main entry of the platform setup entry.
968 The function will present the main menu of the system setup,
969 this is the platform reference part and can be customize.
972 @param TimeoutDefault The fault time out value before the system
974 @param ConnectAllHappened The indicater to check if the connect all have
979 PlatformBdsEnterFrontPage (
980 IN UINT16 TimeoutDefault
,
981 IN BOOLEAN ConnectAllHappened
986 PERF_START (NULL
, "BdsTimeOut", "BDS", 0);
988 // Indicate if we need connect all in the platform setup
990 if (ConnectAllHappened
) {
991 gConnectAllHappened
= TRUE
;
994 if (TimeoutDefault
!= 0xffff) {
995 Status
= ShowProgress (TimeoutDefault
);
998 // Ensure screen is clear when switch Console from Graphics mode to Text mode
1000 gST
->ConOut
->EnableCursor (gST
->ConOut
, TRUE
);
1001 gST
->ConOut
->ClearScreen (gST
->ConOut
);
1003 if (EFI_ERROR (Status
)) {
1005 // Timeout or user press enter to continue
1013 InitializeFrontPage (FALSE
);
1016 // Update Front Page strings
1018 UpdateFrontPageStrings ();
1021 Status
= CallFrontPage ();
1024 // If gCallbackKey is greater than 1 and less or equal to 5,
1025 // it will launch configuration utilities.
1028 // 4 = device manager
1029 // 5 = boot maintenance manager
1031 if (gCallbackKey
!= 0) {
1032 REPORT_STATUS_CODE (
1034 (EFI_SOFTWARE_DXE_BS_DRIVER
| EFI_SW_PC_USER_SETUP
)
1038 // Based on the key that was set, we can determine what to do
1040 switch (gCallbackKey
) {
1042 // The first 4 entries in the Front Page are to be GUARANTEED to remain constant so IHV's can
1043 // describe to their customers in documentation how to find their setup information (namely
1044 // under the device manager and specific buckets)
1046 // These entries consist of the Continue, Select language, Boot Manager, and Device Manager
1048 case FRONT_PAGE_KEY_CONTINUE
:
1050 // User hit continue
1054 case FRONT_PAGE_KEY_LANGUAGE
:
1056 // User made a language setting change - display front page again
1060 case FRONT_PAGE_KEY_BOOT_MANAGER
:
1062 // User chose to run the Boot Manager
1067 case FRONT_PAGE_KEY_DEVICE_MANAGER
:
1069 // Display the Device Manager
1072 CallDeviceManager ();
1073 } while (gCallbackKey
== FRONT_PAGE_KEY_DEVICE_MANAGER
);
1076 case FRONT_PAGE_KEY_BOOT_MAINTAIN
:
1078 // Display the Boot Maintenance Manager
1080 BdsStartBootMaint ();
1084 } while ((Status
== EFI_SUCCESS
) && (gCallbackKey
!= FRONT_PAGE_KEY_CONTINUE
));
1087 //Will leave browser, check any reset required change is applied? if yes, reset system
1089 SetupResetReminder ();
1093 // Automatically load current entry
1094 // Note: The following lines of code only execute when Auto boot
1097 PERF_END (NULL
, "BdsTimeOut", "BDS", 0);