diff options
Diffstat (limited to 'EDK/MiniSetup/uefi2.1/Uefi21Wapper.c')
-rw-r--r-- | EDK/MiniSetup/uefi2.1/Uefi21Wapper.c | 8266 |
1 files changed, 8266 insertions, 0 deletions
diff --git a/EDK/MiniSetup/uefi2.1/Uefi21Wapper.c b/EDK/MiniSetup/uefi2.1/Uefi21Wapper.c new file mode 100644 index 0000000..eab9ad5 --- /dev/null +++ b/EDK/MiniSetup/uefi2.1/Uefi21Wapper.c @@ -0,0 +1,8266 @@ +//*****************************************************************// +//*****************************************************************// +//*****************************************************************// +//** **// +//** (C)Copyright 2013, American Megatrends, Inc. **// +//** **// +//** All Rights Reserved. **// +//** **// +//** 5555 Oakbrook Pkwy, Building 200,Norcross, Georgia 30093 **// +//** **// +//** Phone (770)-246-8600 **// +//** **// +//*****************************************************************// +//*****************************************************************// +//*****************************************************************// +// $Archive: /Alaska/SOURCE/Modules/AMITSE2_0/AMITSE/Uefi2.1/Uefi21Wapper.c $ +// +// $Author: Premkumara $ +// +// $Revision: 85 $ +// +// $Date: 8/28/14 11:54a $ +// +//*****************************************************************// +//*****************************************************************// +// Revision History +// ---------------- +// $Log: /Alaska/SOURCE/Modules/AMITSE2_0/AMITSE/Uefi2.1/Uefi21Wapper.c $ +// +// 85 8/28/14 11:54a Premkumara +// [TAG] EIP174031 +// [Category] Improvement +// [Description] Removed TODO comments and added proper comments in those +// places +// [Files] commonoem.c, commonhelper.c, special.c, submenu.c, +// minisetupext.c, uefi21wapper.c and legacy.c +// +// 84 8/28/14 9:56a Premkumara +// [TAG] EIP173038 +// [Category] Bug Fix +// [Symptom:] System hangs on using UefiVarsetnvramforCurrentform +// [Root Cause] UINT32 gProcessedForms[MAX_FORMS_TO_PROCESS]; +// Entries overbound the arrary MAX_FORMS_TO_PROCESS +// [Solution] gProcessedForms formed dynamically +// [Files] Uefi21wapper.c +// +// 83 7/12/14 12:25p Arunsb +// [TAG] EIP174938 +// [Category] Bug Fix +// [Severity:] Normal +// [Symptom:] Arrow mark shown when driver health page published +// [Root Cause] Driver health formset considered as dynamic page so arrow +// shown +// [Solution] For driverhealth formset DynamicPageCount variable not +// incremented. Returned EFI_ABORTED in parseform for driverhealth formset +// so DynamicPageCount not incremented so arrow will not be shown. +// [Files] Parse.c and uefi21wapper.c +// +// 82 5/21/14 6:33p Arunsb +// [TAG] EIPEIP169096,168632 +// [Description] Changed global variable guid usage for tse debug +// messages. Removed unwanted RT flag in TSE. +// [Files] commonoem.c, setupdbg.h, print.c and uefi21wapper.c +// +// 81 5/02/14 5:02a Arunsb +// [TAG] EIP156958 +// [Category] Bug Fix +// [Severity:] Normal +// [Symptom:] UefiVarsetnvramforCurrentform function not saving the values +// properly for passed page ID +// [Root Cause] This function calling VarSetNvram to update the NVRAM, +// this function updates the offset value to NVRAM and then got the whole +// buffer from NVRAM again and updates the cache so second controls and +// further modified controls cache values are overwritten by NVRAM value. +// [Solution] Instead of calling VarSetNvram set the values in +// UefiVarsetnvramforCurrentform fnc itself. +// [Files] uefi21wapper.c +// +// 80 2/11/14 8:57p Arunsb +// [TAG] EIP133728 +// [Category] New Feature +// [Description] Provide special control support in ESA for driver health +// [Files] uefi21wapper.c +// +// 79 10/18/13 4:20p Arunsb +// [TAG] EIP140268 +// [Category] Bug Fix +// [Severity:] Normal +// [Symptom:] Clicking driver health control crashes +// [Root Cause] Incremented pointer freed instead of allocated pointer +// [Solution] Pointer freed properly +// [Files] uefi21wapper.c +// +// 78 8/26/13 3:10p Blaines +// [TAG] - EIP 134138 +// [Category] - Defect +// [Symptom] - Incorrect Driver Health name shown in BIOS (UEFI Mode) +// Setup for SAS Card. +// +// [Root cause] +// In the function FindDriverHealthDriverName,when querying the +// GetDriverName() routine of Component Name Protocol, the function is +// passing more than one language. +// +// [Solution]- +// In the function FindDriverHealthDriverName,when querying the +// GetDriverName() routine of Component Name Protocol, pass only one +// language to the routine. +// +// [Files] +// Uefi21Wapper.c +// +// 77 7/01/13 10:47a Premkumara +// [TAG] EIP126997 +// [Category] Bug Fix +// [Severity] Important +// [Symptom] Selecting Save current form Now or Discard Current form and +// Exit now controls causing setup crash +// [RootCause] NULL is not handled properly for controls->controlPtr +// [Solution] Handled NULL check properly in necessary places +// [Files] Uefi21Wapper.c +// +// 76 5/22/13 11:18a Arunsb +// Name value string not saving properly. Fixed it. +// +// 75 4/18/13 9:39a Arunsb +// Functions moved to avoid build error in 2.0 build +// +// 74 4/16/13 9:20a Arunsb +// Build error corrected +// +// 73 4/16/13 8:01a Arunsb +// [TAG] EIP106950 +// [Category] New Feature +// [Description] PasswordEncode hook function +// +// 72 3/29/13 12:30p Premkumara +// [TAG] EIP97611 +// [Category] New Feature +// [Description] PrintScreen Support in TSE +// [Files] AMITSE.sdl, CommonHelper.c, HotKeyBin.h, AddBootOption.c, +// Page.c, TseUefiHii.h, Uefi21Wapper.c +// +// 71 3/25/13 8:31a Premkumara +// [TAG] EIP116315 +// [Category] Improvement +// [Description] Display control prompt string for password control. +// (for String on CHAP secret popup) +// [Files] - AMITSE.sdl +// - CommonHelper.c +// - FakeToken.c +// - AmiTSEStr.uni +// - TseLite\PopupPassword.c +// - uefi2.1\UefiWapper21.c +// - uefi2.0\HiiCallback.c +// - uefi2.0\hii.h +// - uefi2.0\hii.c +// +// 70 2/25/13 10:57a Blaines +// [TAG] - EIP 104273 +// [Category] - Action Item +// [Description] - Provide ability to dump the Hii Pack from the Setup as +// part TSE debug Infrastructure. It should dump the Pack updates on Hii +// notification also. +// So it can be used to debug the issue. +// [Files] - ForBrowser2.c, Hii.c, HiiNotificationHandler.c, +// UefiWapper.c, TseUefiHii.h +// +// 69 12/05/12 4:51a Premkumara +// [TAG] EIP105552 +// [Category] Improvement +// [Description] Adding RefreshID support for OrderList, Password +// controls +// [Files] Uefi21Wapper.c +// +// 68 10/18/12 8:56a Rajashakerg +// [TAG] EIP103568 +// [Category] Improvement +// [Description] Help string support for ordered list +// [Files] Uefi21Wapper.c, ordlistbox.c +// +// 67 10/18/12 6:04a Arunsb +// Updated for 2.16.1235 QA submission +// +// 24 10/10/12 12:41p Arunsb +// Synched the source for v2.16.1232, backup with Aptio +// +// 65 9/18/12 2:15a Rajashakerg +// [TAG] EIP88658 +// [Category] Bug Fix +// [Severity] Normal +// [Symptom] Minisetup crashes after controller reconnection during Hii +// callback +// [RootCause] Minisetup crashes after controller reconnection during +// callback. since we have new packs and new handles. +// [Solution] Additional checks for invalid ptrs were added +// [Files] Hii.c, Parse.c, Uefi21Wapper.c +// +// 64 9/17/12 6:22a Rajashakerg +// Updated EIP changes for 2.16 release. +// +// 62 9/10/12 11:46a Arunsb +// [TAG] EIP90372 +// [Category] Bug Fix +// [Severity] Normal +// [Symptom] Setup browser handling of +// EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD +// [RootCause] For discard action current value is saved +// [Solution] Introduced a global variable which will set for discard +// action for that current value will not be saved +// [Files] HiiCallback.c and Uefi21Wapper.c +// +// 61 5/29/12 4:46a Arunsb +// [TAG] EIP91109 +// [Category] Improvement +// [Description] Sync the Aptio IV source for AptioV +// +// 60 5/28/12 12:38p Arunsb +// [TAG] EIP86885 +// [Category] Improvement +// [Description] Support added for following callback action requests +// EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT +// EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD_EXIT +// EFI_BROWSER_ACTION_REQUEST_FORM_APPLY +// EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD +// [Files] Uefi21Wapper.c +// +// 59 4/27/12 1:39a Rajashakerg +// [TAG] EIP74964 +// [Category] Improvement +// [Description] UefiGetDateTimeDetails does not initialize the min and +// max values +// [Files] Uefi21Wapper.c +// +// 58 4/05/12 12:49p Arunsb +// [TAG] EIP83252 +// [Category] Bug Fix +// [Severity] Important +// [Symptom] System hangs with onboard SAS Option ROM +// [RootCause] ProcessPackNotification not invoked properly +// [Solution] gEnableDrvNotification flag handled properly to invoke +// ProcessPackNotification +// [Files] uefi2.1\hiicallback.c and uefi2.1\uefi21wapper.c +// +// 57 2/02/12 5:41p Arunsb +// [TAG] EIP81814 +// [Category] Improvement +// [Description] Merging common utility function for page, control and +// variable data. +// [Files] Uefi21Wapper.c +// +// 56 2/02/12 1:19p Premkumara +// [TAG] EIP75351,75352,75384 +// [Category] Improvement +// [Description] Suppress the warnings from static code analyzer +// [Files] String.c, boot.c, TseAdvanced.c,Time.c, PopupEdit.c, +// MessageBox.c, Label.c, Edit.c, Date.c +// +// 55 2/02/12 3:06a Premkumara +// [TAG] EIP75066 +// [Category] Improvement +// [Description] Support loading defaults for Ordelist controls +// [Files] Ordlistbox.c, Uefi21Wapper.c, CtrlCond.c, HiiCallback.c, +// Parse.c, Uefi20Wapper.c, TseUefihiil.h +// +// 54 1/20/12 5:10a Rajashakerg +// [TAG] EIP77875 +// [Category] Improvement +// [Description] Minisetup: Memory leaks in text browser +// [Files] Uefi21Wapper.c, hiistring21.c, variable.c +// +// 53 1/20/12 12:31a Rajashakerg +// [TAG] EIP80426 +// [Category] Improvement +// [Description] When restoring settings, avoid accessing the varstore +// for text controls +// [Files] uefi21wapper.c, Setupdata.h. +// +// 52 1/13/12 1:41a Arunsb +// [TAG] EIP80360 +// [Category] Bug Fix +// [Severity] Important +// [Symptom] HDDSecurity module - Issue in login with TSE, Master +// password disabled +// [RootCause] Cache not updated +// [Solution] Cache updated properly +// [Files] Tseadvanced.c, special.c and uefi21wapper.c +// +// 51 1/09/12 1:59a Arunsb +// [TAG] EIP79952 +// [Category] Bug Fix +// [Severity] Normal +// [Symptom] Add driver option displays select boot option as title +// [RootCause] Title problem +// [Solution] Title changed +// [Files] Faketokens.c, amitsestr.uni, addbootoption.c, +// uefi2.0\hiicallback.c and uefi21wapper.c +// +// 50 12/08/11 5:21p Arunsb +// progress freeing removed +// +// 49 12/08/11 1:09p Rajashakerg +// [TAG] EIP75379 +// [Category] Improvement +// [Description] Suppress the warnings from static code analyzer +// [Files] Postmgmtext.c, Uefi21Wapper.c +// +// 48 12/08/11 12:18p Rajashakerg +// [TAG] EIP75558 +// [Category] Improvement +// [Description] Incorrect static strings retrieved in Text Broswer +// [Files] Uefi21Wapper.c +// +// 47 12/07/11 2:48p Arunsb +// [TAG] EIP75588 +// [Category] New Feature +// [Description] Support for queuing UpdatePack notifications +// [Files] frame.c, page.c, formbrowser2.c, hii.c, hiicallback.c, +// hiinotificationhandler.c, tseuefihii.h and uefi21wapper.c +// +// 46 12/07/11 2:08p Arunsb +// [TAG] EIP77475 +// [Category] New Feature +// [Description] Changed varsetvalue to _vargetsetvalue in +// UefiRefershQuestionValueNvRAM fnc since _vargetsetvalue wont calls the +// SetupConfigModifiedHook +// [Files] uefi21wapper.c +// +// 45 12/07/11 8:56a Rajashakerg +// [TAG] EIP73231 +// [Category] Improvement +// [Description] Updated the check for date and time flags for NON RTC. +// [Files] Uefi21Wapper.c +// +// 44 12/07/11 8:16a Rajashakerg +// [TAG] EIP75118 +// [Category] Improvement +// [Description] xtractConfig() fail since BrowserCallback() cannot find +// the variable to process +// [Files] FormBrowser2.c, FormBrowser2.h, HiiCallback.c, +// Uefi21Wapper.c, PopupSel.c +// +// 43 12/07/11 7:18a Rajashakerg +// [TAG] EIP75558 +// [Category] Improvement +// [Description] Incorrect static strings retrieved in Text Broswer +// [Files] Uefi20Wapper.c +// +// 42 12/01/11 7:46a Rajashakerg +// [TAG] EIP75464 +// [Category] Improvement +// [Description] Improper handling of action controls +// [Files] SubMenu.c, UefiAction.c, HiiCallback.c, Uefi21Wapper.c +// +// 41 11/28/11 5:16a Rajashakerg +// [TAG] EIP73231 +// [Category] Improvement +// [Description] Callback handling :For interactive controls updating +// the currnet vaule in cache even when hii callback returns error status. +// [Files] Date.c, SubMenu.c, ordlistbox.c, time.c, UefiAction.c, +// hii.h, uefi20Wapper.c, HiiCallback.c, TseUefiHii.h, Uefi21Wapper.c +// +// 40 11/28/11 2:15a Premkumara +// [TAG] EIP75384 +// [Category] Improvement +// [Description] Suppress the warnings from static code analyzer +// [Files] UefiWapper.c, Hii.c, Expression.c, CtrlCond.c, PopupSel.c, +// Minisetupext.c, Menu.c, Date.c, Ezport\Stylecommon.c, +// EzportPlus\StyleCommon.c, +// +// 39 11/23/11 5:20a Rajashakerg +// [TAG] EIP75473 +// [Category] Improvement +// [Description] System Time is not updated every second +// [Files] variable.h, variable.c, FormBrowser2.c, TseUefiHii.h, +// Uefi21Wapper.c, hii.h, uefi20Wapper.c +// +// 38 11/20/11 7:39a Premkumara +// [TAG] EIP73226 +// [Category] New Feature +// [Description] Extended support for password prompt +// [Files] FakeToken.c, Uefi21Wapper.c, AmiTSEStr.uni, PopupPassword.c, +// +// 37 11/14/11 2:43p Blaines +// [TAG] - EIP 75481 +// [Category]- Function Request +// [Synopsis]- TSE debug print infrastructure. +// [Description]- Add TSE debug print info for basic functions such as +// Hiiparsing, HiiNotifications, HiiCallbacks. Variables, and Ifrforms +// data. +// [Files] +// AMITSE.sdl, AmiTSEStr.uni, CommonHelper.c, commonoem.c, FakeTokens.c +// Globals.c, Minisetup.cif, Minisetup.h, print.c, FormBrowser2.c, Hii.c, +// HiiCallback.c, HiiNotificationHandler.c, Parse.c, TseUefiHii.h, +// Uefi21Wrapper.c, setupdbg.h +// +// 36 11/14/11 12:07a Arunsb +// While checking in EIP70421 & 70422 Support for driver order, +// UefiRefershQuestionValueNvRAM +// function had a wrong fix. So reverting. +// +// 35 11/13/11 1:13p Arunsb +// [TAG] EIP70421 +// [Category] New Feature +// [Description] Support for driver order in TSE +// [Files] AMITSE.SDL, CommonHelper.c, setup.ini, uefisetup.ini, +// boot.c, +// minisetup.h, bbs.c, special.c, special.h, tseadvanced.c, +// addbootoption.c, +// callback.c, minisetupext.c, minisetupext.h, popupsel.c, popupsel.h, +// TseLitehelper.c, variable.c, Uefi21Wapper.c, AMIVfr.h, boot.h, +// TseElink.h, variable.h, +// setup.h, Boot.vfr and Setup.uni +// +// 34 11/03/11 4:43a Premkumara +// [TAG] EIP70966 +// [Category] Improvement +// [Description] Hii orderlist item can't update priority from value in +// Setup menu for both enable and disable TSE_MULTILINE_CONTROLS token +// [Files] Ordlistbox.c, ordlistbox.h, TseUefiHii.h, Uefi21Wrapper.c +// +// 33 10/20/11 12:25p Blaines +// Correct the comments. +// +// 32 10/20/11 11:48a Blaines +// [TAG] EIP 72333 +// [Category] Sighting +// [Symptom] Some SAS controller card HII Screen Titles are displaying +// the wrong information +// [RootCause] Menu tab always displays the root page title when +// navigating submenu pages. TSE did not support the display of Formset +// Help. +// +// [Solution] Display Formset Help for Dynamic page, Display page title of +// submenu pages in the menu tab. +// +// [Files Changed] +// - AMITSE.sdl, CommonHelper.c, special.c, Menu.c, minisetupext.h, +// TseUefiHii.h, Uefi21Wapper.c +// +// 31 9/29/11 7:02p Blaines +// [TAG] - EIP 66860 +// [Category]- Function Request +// [Synopsis]- AmiPostManager interface for text entry. +// [Files] - LogoLib.h, AMIPostMgr.h, protocol.c, protocol.h, +// TseAdvanced.c, TseLitehelper.c, TseUefiHii.h, Uefi21Wapper.c +// +// 30 8/26/11 6:22p Blaines +// [TAG] EIP68354 +// [Category] Bug Fix +// [Severity] Normal +// [RootCause] Callback was invoked during periodic update for time and +// date controls without EFI_IFR_REFRESH_OP. +// [Solution] Callback is only invoked for interactive controls. +// [Files] TseLite: Time.c, Date.c +// Uefi21: Parese.c, Uefi21Wrapper.c +// +// 29 7/19/11 3:04p Arunsb +// [TAG] EIP57661 +// [Category] New Feature +// [Description] Driver health variables are updated in cache too. +// [Files] notify.c, Uefi21Wapper.c and variable.h +// +// 28 6/30/11 4:20a Arunsb +// [TAG] EIP57661 +// [Category] New Feature +// [Description] Boot manager algorithm for interaction with Driver +// Health protocol. +// [Files] amitse.cif, amitse.sdl, faketokens.c, amitsestr.uni, +// commonhelper.c, uefisetup.ini, tsedrvhealth.h, +// amivfr.h, minisetupbin.mak, +// hiistring21.c, hiistring20.c, tseadvanced.c, special.c, +// special.h, boot.h, minisetup.h, +// uefi20wapper.c, formbrowser2.c, hii.c, parse.c and +// uefi21wapper.c. +// +// 27 6/23/11 4:01p Rajashakerg +// [TAG] EIP55762, 58925, 59971 +// [Category] New Feature +// [Description] Support REF2,REF3 and REF4 in AMITSE +// Support direct form navigation path +// Improper layout of controls in the root page when Dynamic pages are +// added using the Legacy Setup Style +// +// [Files] setupdata.h, CommonHelper.c, AMITSE.sdl, Legacy\Legacy.c, +// Legacy\style.h, Legacy\style.h, frame.c, minisetupext.c, +// minisetupext.h, numeric.c, page.c Popupstring.c, Hii.c, +// Uefi21Wrapper.c, Parse.c Hii.c +// +// 26 6/22/11 6:05p Arunsb +// [TAG] EIP56405 +// [Category] New Feature +// [Description] Support for EFI_IFR_VARSTORE_NAME_VALUE opcode +// [Files] Hii.c, parse.c and uefi21wapper.c +// +// 25 6/20/11 12:28p Rajashakerg +// [TAG] EIP60563 +// [Category] New Feature +// [Description] Support for signed decimal value for +// EFI_IFR_NUMERIC_OP. +// [Files] numeric.c, numeric.h, string.c, string.h, Uefi21Wapper.c +// +// 24 4/29/11 4:46p Arunsb +// For 2.13 public patch release IFR RefX feature is omitted +// +// 22 3/28/11 11:45p Madhans +// UefiGetKeyField() updated. +// +// 21 3/28/11 5:06p Rajashakerg +// [TAG] EIP56413 +// [Category] Improvement +// [Description] TSE: Support for EFI_IFR_RESET_BUTTON opcode +// [Files] ezport.c, minisetupext.h, ResetButton.c, ResetButton.h, +// Hii.c, TseUefiHii.h, Uefi21Wapper.c, hii.h, Uefi20Wapper.c +// +// 20 3/21/11 1:02a Rajashakerg +// [TAG] EIP53480 +// [Category] Improvement +// [Description] FormBrowser extended actions support +// [Files] callback.c, minisetupext.c, minisetupext.h, numeric.c, +// PopupSel.c, PopupString.c, SubMenu.c, TseLiteCommon.c, UefiAction.c, +// Hiicallback.c, TseUefiHii.h, Uefi21Wapper.c, HiiCallback.c +// +// 19 3/09/11 7:26p Madhans +// [TAG] EIPEIP48615 +// [Category] Improvement +// [Description] To support UEFI 2.1 RefreshOp. Based in Refersh Rate +// Controls are refershed periodically. +// [Files] minisetupext.h +// SubMenu.h +// SubMenu.c +// Memo.c +// Memo.h +// numeric.c +// numeric.h +// time.c +// Date.c +// PopupSel.c +// PopupSel.h +// PopupString.c +// PopupString.h +// ordlistbox.c +// minisetupext.c +// UefiAction.c +// hii.h +// Uefi20wapper.c +// hiicallback.c +// Parse.c +// tseuefihii.h +// Uefi21wapper.c +// +// 18 2/01/11 7:38p Madhans +// [TAG] - EIP 50737 +// [Category]- Defect +// [Severity]- Mordarate +// [Symptom] - Suppressing the Interactive control does not work +// correctly. +// [RootCause] - The control conditional pointer if not set correctly. +// [Solution]- To fix the Control condition pointer. And identify the +// suppress if related to UEFI action control +// [Files] - UefiAction.c TseLiteHelper.c hii.h uefi20wapper.c +// uefi21wapper.c +// +// 17 12/28/10 12:31p Madhans +// To update the Tag of EIp 46998. UEFI option ROM menus disappear in +// Setup when certain options are selected. +// No file changed but Comment updated right +// +// 16 12/02/10 5:51p Madhans +// [TAG] - EIP 48169 +// [Category]- Improvment. +// [Severity]- Mordarate +// [Symptom]- To do the Workaround for ConfigtoBlock issues and Fix issues +// with Retirive config. +// [Solution]- Fix done formBrowser2.c and uefi21wrapper.c +// [Files] - formBrowser2.c and uefi21wrapper.c +// +// 15 12/02/10 5:34p Madhans +// [TAG] - EIP 49559 +// [Category]- defect +// [Severity]- Mordarate +// [Symptom]- OneOption contols works ok if it stores the values in BYTE +// and Does not contain any suppressif for options. +// But it has issues in supporting UINT16, UINT32 and UINT64 storage. +// [Rootcause] - The Type is not checked for Storeage and issues with +// condition check for options. +// [Solution]- Fix done ctrlcond.c and uefi21wrapper.c +// [Files] - CtrlCond.h, ctrlcond.c and uefi21wrapper.c +// +// 14 12/02/10 5:21p Madhans +// [TAG] - EIP 49557 +// [Category]- defect +// [Severity]- Mordarate +// [Symptom]- UEFIAction controls does not work correctly. +// [Rootcause] - Action controls does not Process the QuestionResp +// correctly. +// [Solution]- Fix done UEFIAction to check for QuestionResp and call the +// callback +// [Files] - uefiaction.c and uefi21wapper.c +// +// 13 11/10/10 7:02p Blaines +// EIP 47037: Add range checks to properly edit and update date/time. +// +// 12 10/27/10 4:25p Madhans +// [TAG] EIP46998 +// [Category] Defect +// [Symptom] Some user action on PCIx with UEFI Hii Pages causes Setup +// screen pages and menu disappers. +// [RootCause] UEFI 2.1 parsing code is not handling the Removepack and +// New pack sequance properly. Normally UpdatePack +// does the removepack and AddPack. +// [Solution] UEFI 2.1 parsing code fixed to handle above case correctly. +// [Files] hii.c HiiNotificationHandler.c Parse.c TseUefiHii.h +// uefi21wapper.c +// +// 11 9/16/10 8:38p Madhans +// Update for TSE 2.10. Refer Changelog.log for more details. +// +// 17 7/07/10 7:45p Madhans +// Changes to Support Adding Conditions to Suppress or Grayout the Special +// controls. +// +// 16 6/22/10 6:44a Mallikarjunanv +// EIP 39764 - Password Encoding Enabled by default. +// +// 15 6/21/10 4:19p Blaines +// Added code to support more question types for the function +// UefiGetKeyField. +// +// 14 6/17/10 2:48p Madhans +// Varsotre NameValue fix. +// +// 13 6/15/10 12:33p Blaines +// Update function header and properly initialize status variable in +// UefiSetTime and UefiGetTime. +// +// 12 6/14/10 7:15p Madhans +// Dynamic parsing support +// +// 11 6/08/10 5:17p Blaines +// Add support for UEFI 2.0/2.1 Date and Time controls +// +// 10 4/08/10 12:09p Madhans +// To call the Special Callback with proper Key value. +// +// 9 4/07/10 6:25p Madhans +// For UEFI 2.1 Error Manger variable is EFI variable not an HII Varstore. +// +// 8 3/11/10 5:44p Madhans +// Coding Standards Update +// +// 7 2/26/10 7:02p Madhans +// To build with EDK support. +// +// 4 12/14/09 4:52p Presannar +// Bug Fix Eip-32732 +// +// 3 11/30/09 1:10p Presannar +// Modified ConfigAccessCallback EFI_BROWSER_ACTION from pass by reference +// to pass by value +// +// 2 11/19/09 5:33p Presannar +// Updated TSE include file name to not clash with CORE file +// Updated fn GetControlConditionVarId to search for Control within the +// formset if not found in current form +// Added Fn IsPasswordEncodeEnabled +// +// 1 7/24/09 6:54p Presannar +// +// 6 5/28/09 11:50a Presannar +// Bug Fixes +// +// 5 4/24/09 7:54p Presannar +// TSE 2.0 UEFI 2.1 Code Complete +// +// 4 4/14/09 12:43p Presannar +// Added Fn ProcessActionQuestionConfiguration, +// ProcessBrowserActionRequest and _VerifyResponseString +// Added AMI_IFR_MSGBOX declarations +// Updated Uefi Action control handling +// +// 3 3/31/09 4:15p Madhans +// UEFI Wrapper improvments. +// +// 2 1/29/09 6:10p Presannar +// Added case for EFI_IFR_SUBTITLE_OP +// Added new fn GetControlConditionVariable and HiiRemoveString +// +// 1 1/09/09 2:38p Presannar +// UEFI 2.1 Hii Related Code - Initial Drop +// +//*****************************************************************// +//<AMI_FHDR_START> +// +// Name: Uefi21Wapper.c +// +// Description: +// +//<AMI_FHDR_END> +//****************************************************************// + +//---------------------------------------------------------------------------- + +#include "minisetup.h" +#include "TseUefiHii.h" +#include "TseElinks.h" //EIP106950 +#include EFI_PROTOCOL_DEFINITION(UnicodeCollation) +#if TSE_DEBUG_MESSAGES +#include <Protocol\SimpleFileSystem.h> +#endif +#include "TseDrvHealth.h" //Has TSE related driver health structures +//EIP 57661 Driver health support +UINT16 *_DevicePathToStr (EFI_DEVICE_PATH_PROTOCOL *Path); +CHAR16 DriverHealthStatus [6][23] = { + L"Healthy", + L"Repair Required", + L"Configuration Required", + L"Failed", + L"Reconnect Required", + L"Reboot Required" + }; +EFI_HANDLE gDrvHandle = NULL; +EFI_DRIVER_HEALTH_PROTOCOL *gDrvHealthInstance = NULL; +DRV_HEALTH_HNDLS *gDrvHealthHandlesHead = NULL; +extern BOOLEAN gEnableDrvNotification; //TRUE if allow notification function to process action, FALSE to ignore the notification +extern AMI_POST_MANAGER_PROTOCOL *mPostMgr; +extern VOID _GetNextLanguage(CHAR8 **LangCode, CHAR8 *Lang); +//---------------------------------------------------------------------------- +#if TSE_DEBUG_MESSAGES +BOOLEAN SetupDebugKeyHandler(UINT16 ItemIndex, UINT16 Unicode, CHAR16 *Value) ; +EFI_STATUS DisplayParseFormSetData(VOID) ; +EFI_STATUS DebugShowAllHiiVariable(UINT32 formID) ; +UINT16 _GetQuestionToken(UINT8 *ifrData); +VOID ProcessPackToFile(EFI_HII_DATABASE_NOTIFY_TYPE NotifyType, EFI_HANDLE Handle); +UINTN HpkFileCount=0; +#endif //End of TSE_DEBUG_MESSAGES + +EFI_FILE_PROTOCOL * CreateFile(CHAR16 *filename, UINT32 index); +EFI_GUID guidSimpleFileSystemProtocol = EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID; + +static EFI_IFR_SUBTITLE _Title = { { EFI_IFR_SUBTITLE_OP, sizeof(EFI_IFR_SUBTITLE) }, 0 }; +static EFI_IFR_SUBTITLE _Help = { { EFI_IFR_SUBTITLE_OP, sizeof(EFI_IFR_SUBTITLE) }, 0 }; +static EFI_IFR_SUBTITLE _SubTitle = { { EFI_IFR_SUBTITLE_OP, sizeof(EFI_IFR_SUBTITLE) }, 0 }; +static EFI_IFR_SUBTITLE _HelpTitle = { { EFI_IFR_SUBTITLE_OP, sizeof(EFI_IFR_SUBTITLE) }, STRING_TOKEN(STR_HELP_TITLE) }; +static EFI_IFR_SUBTITLE _NavStrings = { { EFI_IFR_SUBTITLE_OP, sizeof(EFI_IFR_SUBTITLE) }, 0 }; + +static STRING_REF CallbackErrToken=0; + +AMI_IFR_MSGBOX _PreviousMsgBox = { 0, 0, STRING_TOKEN(STR_LOAD_PREVIOUS), (VOID*)INVALID_HANDLE, STRING_TOKEN(STR_LOAD_PREVIOUS_MSG) }; +AMI_IFR_MSGBOX _FailsafeMsgBox = { 0, 0, STRING_TOKEN(STR_LOAD_FAILSAFE), (VOID*)INVALID_HANDLE, STRING_TOKEN(STR_LOAD_FAILSAFE_MSG) }; +AMI_IFR_MSGBOX _OptimalMsgBox = { 0, 0, STRING_TOKEN(STR_LOAD_OPTIMAL), (VOID*)INVALID_HANDLE, STRING_TOKEN(STR_LOAD_OPTIMAL_MSG) }; +AMI_IFR_MSGBOX _SaveMsgBox = { 0, 0, STRING_TOKEN(STR_SAVE_VALUES), (VOID*)INVALID_HANDLE, STRING_TOKEN(STR_SAVE_VALUES_MSG) }; +AMI_IFR_MSGBOX _SaveExitMsgBox = { 0, 0, STRING_TOKEN(STR_SAVE_EXIT), (VOID*)INVALID_HANDLE, STRING_TOKEN(STR_SAVE_EXIT_MSG) }; +AMI_IFR_MSGBOX _ExitMsgBox = { 0, 0, STRING_TOKEN(STR_EXIT), (VOID*)INVALID_HANDLE, STRING_TOKEN(STR_EXIT_MSG) }; +AMI_IFR_MSGBOX _SaveResetMsgBox = { 0, 0, STRING_TOKEN(STR_SAVE_RESET), (VOID*)INVALID_HANDLE, STRING_TOKEN(STR_SAVE_RESET_MSG) }; +AMI_IFR_MSGBOX _ResetMsgBox = { 0, 0, STRING_TOKEN(STR_RESET), (VOID*)INVALID_HANDLE, STRING_TOKEN(STR_RESET_MSG) }; +AMI_IFR_MSGBOX _HelpMsgBox = { 0, 0, STRING_TOKEN(STR_GENERAL_HELP), (VOID*)INVALID_HANDLE, STRING_TOKEN(STR_GENERAL_HELP_MSG) }; +AMI_IFR_MSGBOX _SaveUserMsgBox = { 0, 0, STRING_TOKEN(STR_SAVE_USER_DEFAULTS), (VOID*)INVALID_HANDLE, STRING_TOKEN(STR_SAVE_VALUES_MSG) }; +AMI_IFR_MSGBOX _LoadUserMsgBox = { 0, 0, STRING_TOKEN(STR_LOAD_USER_DEFAULTS), (VOID*)INVALID_HANDLE, STRING_TOKEN(STR_LOAD_USER_MSG) }; + +AMI_IFR_MSGBOX _InvalidPasswordFailMsgBox = { 0, 0, STRING_TOKEN(STR_ERROR),(VOID*) INVALID_HANDLE, STRING_TOKEN(STR_ERROR_PSWD) }; +AMI_IFR_MSGBOX _ClearPasswordMsgBox = { 0, 0, STRING_TOKEN(STR_WARNING),(VOID*) INVALID_HANDLE, STRING_TOKEN(STR_PSWD_CLR) };//EIP:73226 To Clear Old Password message +AMI_IFR_MSGBOX _ClearPasswordLabelMsgBox = { 0, 0, STRING_TOKEN(STR_WARNING),(VOID*) INVALID_HANDLE, STRING_TOKEN(STR_PSWD_CLR_LABEL) };//EIP:73226 To Clear Old Password message +AMI_IFR_MSGBOX _BootLaunchFailedMsgBox = { 0, 0, STRING_TOKEN(STR_WARNING), INVALID_HANDLE, STRING_TOKEN(STR_WARNING_NOT_FOUND) }; +AMI_IFR_MSGBOX _gInvalidRangeFailMsgBox = { 0, 0, STRING_TOKEN(STR_ERROR), INVALID_HANDLE, STRING_TOKEN(STR_ERROR_INPUT) }; + +AMI_IFR_MSGBOX _gDelBootOptionReserved = { 0, 0, STRING_TOKEN(STR_WARNING), INVALID_HANDLE, STRING_TOKEN(STR_DEL_BOOT_OPTION_RESERVED) }; +AMI_IFR_MSGBOX _gAddBootOptionReserved = { 0, 0, STRING_TOKEN(STR_WARNING), INVALID_HANDLE, STRING_TOKEN(STR_ADD_BOOT_OPTION_RESERVED) }; +AMI_IFR_MSGBOX _gAddBootOptionEmpty = { 0, 0, STRING_TOKEN(STR_WARNING), INVALID_HANDLE, STRING_TOKEN(STR_ADD_BOOT_OPTION_EMPTY) }; +AMI_IFR_MSGBOX _gAddDriverOptionEmpty = { 0, 0, STRING_TOKEN(STR_WARNING), INVALID_HANDLE, STRING_TOKEN(STR_ADD_DRIVER_OPTION_EMPTY) }; + + +UINTN gPreviousMsgBox = (UINTN)&_PreviousMsgBox; +UINTN gFailsafeMsgBox = (UINTN)&_FailsafeMsgBox; +UINTN gOptimalMsgBox = (UINTN)&_OptimalMsgBox; +UINTN gSaveMsgBox = (UINTN)&_SaveMsgBox; +UINTN gSaveExitMsgBox = (UINTN)&_SaveExitMsgBox; +UINTN gExitMsgBox = (UINTN)&_ExitMsgBox; +UINTN gSaveResetMsgBox = (UINTN)&_SaveResetMsgBox; +UINTN gResetMsgBox = (UINTN)&_ResetMsgBox; +UINTN gHelpMsgBox = (UINTN)&_HelpMsgBox; +UINTN gSaveUserMsgBox = (UINTN)&_SaveUserMsgBox; +UINTN gLoadUserMsgBox = (UINTN)&_LoadUserMsgBox; + +UINTN gBootLaunchFailedMsgBox = (UINTN)&_BootLaunchFailedMsgBox; +UINTN gInvalidPasswordFailMsgBox = (UINTN)&_InvalidPasswordFailMsgBox; +UINTN gClearPasswordMsgBox = (UINTN)&_ClearPasswordMsgBox;//EIP:73226 To display Clear Old Password message +UINTN gClearLabelPasswordMsgBox = (UINTN)&_ClearPasswordLabelMsgBox; +UINTN gInvalidRangeFailMsgBox = (UINTN)&_gInvalidRangeFailMsgBox; +UINTN gDelBootOptionReserved = (UINTN)&_gDelBootOptionReserved; +UINTN gAddBootOptionReserved = (UINTN)&_gAddBootOptionReserved; +UINTN gAddBootOptionEmpty = (UINTN)&_gAddBootOptionEmpty; +UINTN gAddDriverOptionEmpty = (UINTN)&_gAddDriverOptionEmpty; + +static AMI_IFR_MSGBOX gCallbackErrorMsgBox = { 0, 0, STRING_TOKEN(STR_ERROR), (VOID*)INVALID_HANDLE, 0 }; + +static BOOLEAN gHiiInitialized = FALSE; + +EFI_GUID gEfiHiiConfigRoutingProtocolGuid = EFI_HII_CONFIG_ROUTING_PROTOCOL_GUID; + +EFI_HII_CONFIG_ROUTING_PROTOCOL *gHiiConfigRouting; + +UINTN gTitle = (UINTN)&_Title; +UINTN gHelp = (UINTN)&_Help; +UINTN gSubTitle = (UINTN)&_SubTitle; +UINTN gHelpTitle = (UINTN)&_HelpTitle; +UINTN gNavStrings = (UINTN)&_NavStrings; + +VOID _UefiGetValidOptions(CONTROL_INFO *IfrPtr, UINT16 **OptionPtrTokens, + UINT64 **ValuePtrTokens, UINT16 *ItemCount, + UINT8 MaxItems); + +EFI_STATUS _VerifyResponseString(EFI_STRING Configuration, BOOLEAN NameValue); +UINT32 FindVarFromITKQuestionId(UINT16 QuestionId); + +//EIP81814 Starts +//--------------------------------------------------------------------------- +// Defines for Utility Functions +//--------------------------------------------------------------------------- +#define MAX_FORMS_TO_PROCESS 50 +#define EFI_INCONSISTENT_VALUE (0x80000000 | 28) +#define EFI_NOSUBMIT_VALUE (0x80000000 | 29) +#define CHECKBOX_OPTION_COUNT 2 +#define OPTION_DEFAULT 0x10 +#define OPTION_DEFAULT_MFG 0x20 +#define TSE_GET_ONE_OF_WIDTH(a) (((EFI_IFR_ONE_OF*)(a))->Width) +#define TSE_GET_ONE_OF_OPTION_WIDTH(a) ( \ + ((EFI_IFR_ONE_OF_OPTION*)a)->Type == EFI_IFR_TYPE_NUM_SIZE_8 ? sizeof(UINT8) : (\ + ((EFI_IFR_ONE_OF_OPTION*)a)->Type == EFI_IFR_TYPE_NUM_SIZE_16 ? sizeof(UINT16) : (\ + ((EFI_IFR_ONE_OF_OPTION*)a)->Type == EFI_IFR_TYPE_NUM_SIZE_32 ? sizeof(UINT32) : (\ + ((EFI_IFR_ONE_OF_OPTION*)a)->Type == EFI_IFR_TYPE_NUM_SIZE_64 ? sizeof(UINT64) : (\ + ((EFI_IFR_ONE_OF_OPTION*)a)->Type == EFI_IFR_TYPE_BOOLEAN ? sizeof(BOOLEAN) : (\ + ((EFI_IFR_ONE_OF_OPTION*)a)->Type == EFI_IFR_TYPE_TIME ? sizeof(EFI_HII_TIME) : (\ + ((EFI_IFR_ONE_OF_OPTION*)a)->Type == EFI_IFR_TYPE_DATE ? sizeof(EFI_HII_DATE) : (\ + ((EFI_IFR_ONE_OF_OPTION*)a)->Type == EFI_IFR_TYPE_STRING ? sizeof(EFI_STRING_ID) : (\ + 0))))))))) + + + +typedef struct _OPTION_LIST OPTION_LIST; + +typedef struct _OPTION_LIST +{ + UINT16 Option; + UINT64 Value; + UINT8 Flag; + OPTION_LIST *Next; +}; + +static BOOLEAN LibInitialized = FALSE; +UINT32 *gProcessedForms; //[MAX_FORMS_TO_PROCESS]; //EIP 162180 +UINT32 gVarOffset = 0; +UINT32 gProFormOffset = 0; +UINT32 gProFormOffsetAllocCount = 0; +//--------------------------------------------------------------------------- +// Prototypes for Utility Functions +//--------------------------------------------------------------------------- +BOOLEAN _InconsistenceCheck(PAGE_INFO *PgInfo, UINT16 *ErrStrToken); +BOOLEAN _DestinationFormProcessed(UINT32 FormID); +EFI_STATUS _GetVariableIDList(UINT32 FormID, UINT32 **varIDList); +EFI_STATUS _GetCheckBoxOptions(CONTROL_INFO *CtrlInfo, UINT32 *OptionCount, OPTION_LIST **OptionArray); +EFI_STATUS LoadDefaults(UINT32 FormID, BOOLEAN *ResetVal, BOOLEAN * ValChanged); +BOOLEAN _InconsistenceCheck(PAGE_INFO *PgInfo, UINT16 *ErrStrToken); +BOOLEAN _NoSubmitCheck(CONTROL_INFO *ctrlInfo, UINT16 *ErrStrToken); +EFI_STATUS _GetVariableIDList(UINT32 FormID, UINT32 **VarIDList); +BOOLEAN _DestinationFormProcessed(UINT32 FormID); +BOOLEAN IsNoSubmitOfForms(UINT32 FormID, UINT16* ErrToken); +EFI_STATUS CheckforNosubmitIf(UINT32 FormID, BOOLEAN Recursive, UINT16 *ErrToken); +EFI_STATUS _GetControlFlag(UINT32 PgIndex, UINT32 CtrlIndex, CONTROL_FLAGS **CtrlFlag); +EFI_STATUS GetNumOfPages(UINT32 *NumOfPages); +EFI_STATUS GetPageTitle(UINT32 PgIndex, UINT16 *TitleToken); +EFI_STATUS GetPageSubTitle(UINT32 PgIndex, UINT16 *SubtitleToken); +EFI_STATUS GetPageHandle(UINT32 PgIndex, EFI_HII_HANDLE *Handle); +EFI_STATUS GetPageIdIndex(UINT32 PgIndex, UINT16 *PgIdIndex); +BOOLEAN IsParentPage(UINT32 PgIndex); +EFI_STATUS GetPageHiiId(UINT32 PgIndex, UINT16 *PageId); +EFI_STATUS GetPageParentId(UINT32 PgIndex, UINT16 *PageParentId); +EFI_STATUS GetCtrlsDestCtrlId(UINT32 PgIndex, UINT32 CtrlIndex, UINT16 *DestCtrlId); +EFI_STATUS GetControlType(UINT32 PgIndex, UINT32 CtrlIndex, UINT16 *CtrlType); +EFI_STATUS GetControlQuestionPrompt(UINT32 PgIndex, UINT32 CtrlIndex, UINT16 *CtrlPrompt); +EFI_STATUS GetControlHelpStr(UINT32 PgIndex, UINT32 CtrlIndex, UINT16 *CtrlHelp); +BOOLEAN IsControlCheckBox(UINT32 PgIndex, UINT32 CtrlIndex); +EFI_STATUS GetControlDataWidth(UINT32 PgIndex, UINT32 CtrlIndex, UINT16 *CtrlWidth); +EFI_STATUS GetControlDestinationPage(UINT32 PgIndex, UINT32 CtrlIndex, UINT16 *CtrlDestPg); +UINT8 GetControlAccess(UINT32 PgIndex, UINT32 CtrlIndex); +UINT8 GetControlRefresh(UINT32 PgIndex, UINT32 CtrlIndex); +BOOLEAN IsControlVisible(UINT32 PgIndex, UINT32 CtrlIndex); +BOOLEAN IsControlResetRequired(UINT32 PgIndex, UINT32 CtrlIndex); +BOOLEAN IsControlReadOnly(UINT32 PgIndex, UINT32 CtrlIndex); +BOOLEAN IsControlInteractive(UINT32 PgIndex, UINT32 CtrlIndex); +EFI_STATUS EvaluateControlCondition(UINT32 PgIndex, UINT32 CtrlIndex, UINTN *ExpResult); +EFI_STATUS GetQuestionValue(UINT32 PgIndex, UINT32 CtrlIndex, UINT8 **Value, UINTN *ValueSize); +EFI_STATUS SetQuestionValue(UINT32 PgIndex, UINT32 CtrlIndex, UINT8 *Value, UINTN ValueSize, UINT16 *ErrStrToken); +EFI_STATUS SaveQuestionValues(UINT32 FormID); +VOID FreeOptionList(OPTION_LIST *OptionArray); +EFI_STATUS GetControlDisplayFormat(UINT32 PgIndex, UINT32 CtrlIndex, UINT16 *Format); +EFI_STATUS GetControlMinMax(UINT32 PgIndex, UINT32 CtrlIndex, UINT64 *Min, UINT64 *Max); +EFI_STATUS GetControlDefault(UINT32 PgIndex, UINT32 CtrlIndex,UINT8 *Def, BOOLEAN Optimal); +EFI_STATUS GetOrderedListMaxEntries(UINT32 PgIndex, UINT32 CtrlIndex, UINT8 *MaxEntry); +EFI_STATUS GetOrderedListOptionDataWidth(CONTROL_INFO *ControlInfo, UINT32 *DataWidth); +EFI_STATUS GetOrderedListDataTypeWidth(UINT32 PgIndex, UINT32 CtrlIndex, UINT32 *DataWidth); +BOOLEAN IsPageRefreshable(UINT32 PgIndex); +BOOLEAN IsPageModal(UINT32 PgIndex); +BOOLEAN IfNoCommitVariable(UINT32 PgIndex, UINT32 CtrlIndex); +BOOLEAN IdentifyFormHasDefault(UINT32 FormID); +BOOLEAN IsFormsetHasDefault(UINT32 FormID); +EFI_STATUS GetPageGuidFromPgIndex(UINT32 PgIndex, EFI_GUID *FormGuid); +void AddEntryIngProcessedForms (UINT32 FormID); +void CleargProcessedForms (void); +//---------------------------------------------------------------------------- +//EIP81814 Ends + +#define _GET_MINMAXSTEP_DATA(b,c,d) ( \ + ((c)==EFI_IFR_NUMERIC_SIZE_1)?((b).u8.d):( \ + ((c)==EFI_IFR_NUMERIC_SIZE_2)?((b).u16.d):( \ + ((c)==EFI_IFR_NUMERIC_SIZE_4)?((b).u32.d): \ + ((b).u64.d) ))) + +#define TSE_GET_NUMERIC_MINVALUE(a) _GET_MINMAXSTEP_DATA((((EFI_IFR_NUMERIC*)(a))->data),(((EFI_IFR_NUMERIC*)(a))->Flags&EFI_IFR_NUMERIC_SIZE),MinValue) +#define TSE_GET_NUMERIC_MAXVALUE(a) _GET_MINMAXSTEP_DATA((((EFI_IFR_NUMERIC*)(a))->data),(((EFI_IFR_NUMERIC*)(a))->Flags&EFI_IFR_NUMERIC_SIZE),MaxValue) +#define TSE_GET_NUMERIC_STEP(a) _GET_MINMAXSTEP_DATA((((EFI_IFR_NUMERIC*)(a))->data),(((EFI_IFR_NUMERIC*)(a))->Flags&EFI_IFR_NUMERIC_SIZE),Step) +#define TSE_GET_NUMERIC_BASE(a) (((((EFI_IFR_NUMERIC*)a)->Flags&EFI_IFR_DISPLAY)==EFI_IFR_DISPLAY_UINT_HEX)?AMI_BASE_HEX:((((EFI_IFR_NUMERIC*)a)->Flags&EFI_IFR_DISPLAY)==EFI_IFR_DISPLAY_INT_DEC) ? AMI_BASE_INT_DEC :AMI_BASE_DEC) + +//---------------------------------------------------------------------------- + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiGetHelpField +// +// Description: +// +// Parameter: VOID *IfrPtr +// +// Return value: UINT16 +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +UINT16 UefiGetHelpField(VOID *IfrPtr) +{ + EFI_IFR_OP_HEADER *OpHeader=(EFI_IFR_OP_HEADER *)IfrPtr; + UINT16 Token = 0; + + if(IfrPtr == NULL){ + return Token; + } + switch(OpHeader->OpCode) + { + case EFI_IFR_REF_OP: + Token = ((EFI_IFR_REF *)OpHeader)->Question.Header.Help; + break; + case EFI_IFR_TEXT_OP: + Token = ((EFI_IFR_TEXT *)OpHeader)->Statement.Help; + break; + case EFI_IFR_ONE_OF_OP: + Token = ((EFI_IFR_ONE_OF *)OpHeader)->Question.Header.Help; + break; + case EFI_IFR_TIME_OP: + Token = ((EFI_IFR_TIME *)OpHeader)->Question.Header.Help; + break; + case EFI_IFR_DATE_OP: + Token = ((EFI_IFR_DATE *)OpHeader)->Question.Header.Help; + break; + case EFI_IFR_NUMERIC_OP: + Token = ((EFI_IFR_NUMERIC *)OpHeader)->Question.Header.Help; + break; + case EFI_IFR_PASSWORD_OP: + Token = ((EFI_IFR_PASSWORD *)OpHeader)->Question.Header.Help; + break; + case EFI_IFR_ACTION_OP: + Token = ((EFI_IFR_ACTION *)OpHeader)->Question.Header.Help; + break; + case EFI_IFR_STRING_OP: + Token = ((EFI_IFR_STRING *)OpHeader)->Question.Header.Help; + break; + case EFI_IFR_RESET_BUTTON_OP: + Token = ((EFI_IFR_RESET_BUTTON *)OpHeader)->Statement.Help;//EIP:56413 Updated the Help field for Reset Button + break; + case EFI_IFR_ORDERED_LIST_OP: + Token = ((EFI_IFR_ORDERED_LIST *)OpHeader)->Question.Header.Help;//EIP:103568 Updated the Help field for order list control. + break; + default: + break; + } + + return Token; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiGetPromptField +// +// Description: +// +// Parameter: VOID *IfrPtr +// +// Return value: UINT16 +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +UINT16 UefiGetPromptField(VOID *IfrPtr) +{ + EFI_IFR_OP_HEADER *OpHeader=(EFI_IFR_OP_HEADER *)IfrPtr; + UINT16 Token = 0; + + if(IfrPtr == NULL){ + return Token; + } + switch(OpHeader->OpCode) + { + case EFI_IFR_REF_OP: + Token = ((EFI_IFR_REF *)OpHeader)->Question.Header.Prompt; + break; + case EFI_IFR_NUMERIC_OP: + Token = ((EFI_IFR_NUMERIC *)OpHeader)->Question.Header.Prompt; + break; + case EFI_IFR_TIME_OP: + Token = ((EFI_IFR_TIME *)OpHeader)->Question.Header.Prompt; + break; + case EFI_IFR_DATE_OP: + Token = ((EFI_IFR_DATE *)OpHeader)->Question.Header.Prompt; + break; + case EFI_IFR_ONE_OF_OP: + Token = ((EFI_IFR_ONE_OF *)OpHeader)->Question.Header.Prompt; + break; + case EFI_IFR_ORDERED_LIST_OP: + Token = ((EFI_IFR_ORDERED_LIST *)OpHeader)->Question.Header.Prompt; + break; + case EFI_IFR_CHECKBOX_OP: + Token = ((EFI_IFR_CHECKBOX *)OpHeader)->Question.Header.Prompt; + break; + case EFI_IFR_PASSWORD_OP: + Token = ((EFI_IFR_PASSWORD *)OpHeader)->Question.Header.Prompt; + break; + case EFI_IFR_ACTION_OP: + Token = ((EFI_IFR_ACTION *)OpHeader)->Question.Header.Prompt; + break; + case EFI_IFR_STRING_OP: + Token = ((EFI_IFR_STRING *)OpHeader)->Question.Header.Prompt; + break; + case EFI_IFR_RESET_BUTTON_OP: + Token = ((EFI_IFR_RESET_BUTTON *)OpHeader)->Statement.Prompt;//EIP:56413 Updated the Prompt field for Reset Button + break; + default: + break; + } + + return Token; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiGetKeyField +// +// Description: +// +// Parameter: VOID *IfrPtr +// +// Return value: UINT16 +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +UINT16 UefiGetKeyField(VOID *IfrPtr) +{ + EFI_IFR_OP_HEADER *OpHeader=(EFI_IFR_OP_HEADER *)IfrPtr; + UINT16 Token = 0; + + switch(OpHeader->OpCode) + { + case EFI_IFR_REF_OP: + Token = ((EFI_IFR_REF *)IfrPtr)->Question.QuestionId; + break; + case EFI_IFR_NUMERIC_OP: + Token = ((EFI_IFR_NUMERIC *)IfrPtr)->Question.QuestionId; + break; + case EFI_IFR_STRING_OP: + Token = ((EFI_IFR_STRING *)IfrPtr)->Question.QuestionId; + break; + + case EFI_IFR_PASSWORD_OP: + Token = ((EFI_IFR_PASSWORD *)IfrPtr)->Question.QuestionId; + break; + case EFI_IFR_CHECKBOX_OP: + Token = ((EFI_IFR_CHECKBOX *)IfrPtr)->Question.QuestionId; + break; + case EFI_IFR_ACTION_OP: + Token = ((EFI_IFR_ACTION *)IfrPtr)->Question.QuestionId; + break; + case EFI_IFR_DATE_OP: + Token = ((EFI_IFR_DATE *)IfrPtr)->Question.QuestionId; + break; + case EFI_IFR_ONE_OF_OP: + Token = ((EFI_IFR_ONE_OF *)IfrPtr)->Question.QuestionId; + break; + case EFI_IFR_ORDERED_LIST_OP: + Token = ((EFI_IFR_ORDERED_LIST *)IfrPtr)->Question.QuestionId; + break; + case EFI_IFR_TIME_OP: + Token = ((EFI_IFR_TIME *)IfrPtr)->Question.QuestionId; + break; + default: + break; + } + + return Token; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiGetTitleField +// +// Description: +// +// Parameter: VOID *IfrPtr +// +// Return value: UINT16 +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +UINT16 UefiGetTitleField(VOID *IfrPtr) +{ + EFI_IFR_OP_HEADER *OpHeader=(EFI_IFR_OP_HEADER *)IfrPtr; + UINT16 Token = 0; + +// EIP 88658 : Minisetup crashes after controller reconnection during Hii callback + if(IfrPtr == NULL){ + goto DONE; + } + switch(OpHeader->OpCode) + { + case EFI_IFR_SUBTITLE_OP: + Token = ((EFI_IFR_SUBTITLE *)IfrPtr)->Statement.Prompt; + break; + case EFI_IFR_FORM_SET_OP: + Token = ((EFI_IFR_FORM_SET *)IfrPtr)->FormSetTitle; + break; + case EFI_IFR_FORM_OP: + Token = ((EFI_IFR_FORM *)IfrPtr)->FormTitle; + break; + default: + break; + } + +DONE: + return Token; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiGetFlagsField +// +// Description: +// +// Parameter: VOID *IfrPtr +// +// Return value: UINT8 +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +UINT8 UefiGetFlagsField(VOID *IfrPtr) +{ + EFI_IFR_OP_HEADER *OpHeader=(EFI_IFR_OP_HEADER *)IfrPtr; + UINT8 Flag = 0; + + switch(OpHeader->OpCode) + { + case EFI_IFR_REF_OP: + Flag = ((EFI_IFR_REF *)IfrPtr)->Question.Flags; + break; + case EFI_IFR_TIME_OP: + Flag = ((EFI_IFR_TIME *)IfrPtr)->Flags; + break; + case EFI_IFR_DATE_OP: + Flag = ((EFI_IFR_DATE *)IfrPtr)->Flags; + break; + default: + break; + } + + return Flag; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiIsInteractive +// +// Description: +// +// Parameter: CONTROL_INFO *ControlData +// +// Return value: BOOLEAN +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +BOOLEAN UefiIsInteractive(CONTROL_INFO *ControlData) +{ + return (BOOLEAN)(ControlData->ControlFlags.ControlInteractive); +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiGetControlKey +// +// Description: +// +// Parameter: CONTROL_INFO *ControlData +// +// Return value: UINT16 +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +UINT16 UefiGetControlKey(CONTROL_INFO *ControlData) +{ + return ControlData->ControlKey; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiGetTextField +// +// Description: +// +// Parameter: VOID *IfrPtr +// +// Return value: UINT16 +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +UINT16 UefiGetTextField(VOID *IfrPtr) +{ + EFI_IFR_OP_HEADER *OpHeader=(EFI_IFR_OP_HEADER *)IfrPtr; + UINT16 Token = 0; + + switch(OpHeader->OpCode) + { + case EFI_IFR_TEXT_OP: + Token = ((EFI_IFR_TEXT*)OpHeader)->Statement.Prompt; + break; + default: + break; + } + + return Token; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiGetTextTwoField +// +// Description: +// +// Parameter: VOID *IfrPtr +// +// Return value: UINT16 +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +UINT16 UefiGetTextTwoField(VOID *IfrPtr) +{ + EFI_IFR_OP_HEADER *OpHeader=(EFI_IFR_OP_HEADER *)IfrPtr; + UINT16 Token = 0; + + switch(OpHeader->OpCode) + { + case EFI_IFR_TEXT_OP: + Token = ((EFI_IFR_TEXT*)OpHeader)->TextTwo; + break; + default: + break; + } + + return Token; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiSetSubTitleField +// +// Description: +// +// Parameter: VOID *IfrPtr,UINT16 Token +// +// Return value: VOID +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID UefiSetSubTitleField(VOID *IfrPtr,UINT16 Token) +{ + EFI_IFR_OP_HEADER *OpHeader=(EFI_IFR_OP_HEADER *)IfrPtr; + + switch(OpHeader->OpCode) + { + case EFI_IFR_SUBTITLE_OP: + ((EFI_IFR_SUBTITLE*)OpHeader)->Statement.Prompt = Token; + break; + default: + break; + } +} +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiSetHelpField +// +// Description: +// +// Parameter: VOID *IfrPtr,UINT16 Token +// +// Return value: VOID +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID UefiSetHelpField(VOID *IfrPtr, UINT16 Token) +{ + EFI_IFR_OP_HEADER *OpHeader=(EFI_IFR_OP_HEADER *)IfrPtr; + + switch(OpHeader->OpCode) + { + case EFI_IFR_REF_OP: + ((EFI_IFR_REF *)OpHeader)->Question.Header.Help = Token ; + break; + case EFI_IFR_TEXT_OP: + ((EFI_IFR_TEXT *)OpHeader)->Statement.Help = Token ; + break; + case EFI_IFR_ONE_OF_OP: + ((EFI_IFR_ONE_OF *)OpHeader)->Question.Header.Help = Token ; + break; + case EFI_IFR_TIME_OP: + ((EFI_IFR_TIME *)OpHeader)->Question.Header.Help = Token ; + break; + case EFI_IFR_DATE_OP: + ((EFI_IFR_DATE *)OpHeader)->Question.Header.Help = Token ; + break; + case EFI_IFR_NUMERIC_OP: + ((EFI_IFR_NUMERIC *)OpHeader)->Question.Header.Help = Token ; + break; + case EFI_IFR_PASSWORD_OP: + ((EFI_IFR_PASSWORD *)OpHeader)->Question.Header.Help = Token ; + break; + case EFI_IFR_ACTION_OP: + ((EFI_IFR_ACTION *)OpHeader)->Question.Header.Help = Token ; + break; + case EFI_IFR_STRING_OP: + ((EFI_IFR_STRING *)OpHeader)->Question.Header.Help = Token ; + break; + case EFI_IFR_RESET_BUTTON_OP: + ((EFI_IFR_RESET_BUTTON *)OpHeader)->Statement.Help = Token ; + break; + default: + break; + } + +} +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiSetPromptField +// +// Description: +// +// Parameter: VOID *IfrPtr,UINT16 Token +// +// Return value: VOID +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID UefiSetPromptField(VOID *IfrPtr,UINT16 Token) +{ + EFI_IFR_OP_HEADER *OpHeader=(EFI_IFR_OP_HEADER *)IfrPtr; + + switch(OpHeader->OpCode) + { + case EFI_IFR_REF_OP: + ((EFI_IFR_REF*)OpHeader)->Question.Header.Prompt = Token; + break; + case EFI_IFR_ONE_OF_OP: + case EFI_IFR_NUMERIC_OP: + case EFI_IFR_TIME_OP: + case EFI_IFR_DATE_OP: + case EFI_IFR_ORDERED_LIST_OP: + case EFI_IFR_CHECKBOX_OP: + case EFI_IFR_PASSWORD_OP: + case EFI_IFR_STRING_OP: + { + EFI_IFR_QUESTION_HEADER *Question = (EFI_IFR_QUESTION_HEADER *)((UINT8 *)OpHeader + sizeof(EFI_IFR_OP_HEADER)); + + Question->Header.Prompt = Token; + } + break; + default: + break; + } +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiCreateSubTitleTemplate +// +// Description: +// +// Parameter: UINT16 Token +// +// Return value: VOID * +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID * UefiCreateSubTitleTemplate(UINT16 Token) +{ + EFI_IFR_OP_HEADER *OpHeader = EfiLibAllocateZeroPool(sizeof(EFI_IFR_SUBTITLE)); + + OpHeader->OpCode = EFI_IFR_SUBTITLE_OP ; + OpHeader->Length = sizeof(EFI_IFR_SUBTITLE) ; + UefiSetSubTitleField((VOID *)OpHeader,Token); + return (VOID*)OpHeader; +} +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiCreateStringTemplate +// +// Description: Function to create uefi string template +// +// Parameter: UINT16 Token +// +// Return value: VOID * +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID * UefiCreateStringTemplate(UINT16 Token) +{ + EFI_IFR_OP_HEADER *OpHeader = EfiLibAllocateZeroPool(sizeof(EFI_IFR_STRING)); + + OpHeader->OpCode = EFI_IFR_STRING_OP ; + OpHeader->Length = sizeof(EFI_IFR_STRING) ; + UefiSetPromptField((VOID *)OpHeader,Token); + return (VOID*)OpHeader; +} +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiGetIfrLength +// +// Description: +// +// Parameter: VOID *IfrPtr +// +// Return value: UINT8 +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +UINT8 UefiGetIfrLength(VOID *IfrPtr) +{ + EFI_IFR_OP_HEADER *OpHeader=(EFI_IFR_OP_HEADER *)IfrPtr; + + return OpHeader->Length; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiGetMinValue +// +// Description: +// +// Parameter: VOID *IfrPtr +// +// Return value: UINT64 +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +UINT64 UefiGetMinValue(VOID *IfrPtr) +{ + EFI_IFR_OP_HEADER *OpHeader=(EFI_IFR_OP_HEADER *)IfrPtr; + UINT64 Min = 0; + + switch(OpHeader->OpCode) + { + case EFI_IFR_NUMERIC_OP: + // Should The type be Taken Into Account? // + //Min = (UINT64)((EFI_IFR_NUMERIC*)OpHeader)->data.u64.MinValue; + Min = TSE_GET_NUMERIC_MINVALUE(IfrPtr); + break; + case EFI_IFR_PASSWORD_OP: + Min = (UINT64)((EFI_IFR_PASSWORD*)OpHeader)->MinSize; + break; + case EFI_IFR_STRING_OP: + Min = (UINT64)((EFI_IFR_STRING*)OpHeader)->MinSize; + break; + default: + break; + } + return Min; + +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiGetMaxValue +// +// Description: +// +// Parameter: VOID *IfrPtr +// +// Return value: UINT64 +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +UINT64 UefiGetMaxValue(VOID *IfrPtr) +{ + EFI_IFR_OP_HEADER *OpHeader=(EFI_IFR_OP_HEADER *)IfrPtr; + UINT64 Max = 0; + + switch(OpHeader->OpCode) + { + case EFI_IFR_NUMERIC_OP: + // Should The type be Taken Into Account? // + //Max = (UINT64)((EFI_IFR_NUMERIC*)OpHeader)->data.u64.MaxValue; + Max = TSE_GET_NUMERIC_MAXVALUE(IfrPtr); + break; + case EFI_IFR_PASSWORD_OP: + Max = (UINT64)((EFI_IFR_PASSWORD*)OpHeader)->MaxSize; + break; + case EFI_IFR_STRING_OP: + Max = (UINT64)((EFI_IFR_STRING*)OpHeader)->MaxSize; + break; + default: + break; + } + return Max; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiGetStepValue +// +// Description: +// +// Parameter: VOID *IfrPtr +// +// Return value: UINT64 +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +UINT64 UefiGetStepValue(VOID *IfrPtr) +{ + EFI_IFR_OP_HEADER *OpHeader=(EFI_IFR_OP_HEADER *)IfrPtr; + UINT64 Step = 0; + switch(OpHeader->OpCode) + { + case EFI_IFR_NUMERIC_OP: + // Should The type be Taken Into Account? // + //Step = (UINT64)((EFI_IFR_NUMERIC*)OpHeader)->data.u64.Step; + Step = TSE_GET_NUMERIC_STEP(IfrPtr); + break; + default: + break; + } + return Step; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiGetBaseValue +// +// Description: +// +// Parameter: VOID *IfrPtr +// +// Return value: UINT8 +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +UINT8 UefiGetBaseValue(VOID *IfrPtr) +{ + EFI_IFR_OP_HEADER *OpHeader=(EFI_IFR_OP_HEADER *)IfrPtr; + UINT8 Base = EFI_IFR_DISPLAY_UINT_DEC; + + switch(OpHeader->OpCode) + { + case EFI_IFR_NUMERIC_OP: + //Base = (((EFI_IFR_NUMERIC *)OpHeader)->Flags & EFI_IFR_DISPLAY); + Base = TSE_GET_NUMERIC_BASE(IfrPtr); + break; + default: + break; + } + return Base; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiGetWidth +// +// Description: +// +// Parameter: VOID *IfrPtr +// +// Return value: UINT16 +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +UINT16 UefiGetWidth(VOID *IfrPtr) +{ + EFI_IFR_OP_HEADER *OpHeader=(EFI_IFR_OP_HEADER *)IfrPtr; + UINT16 Width = 0; + + if (NULL == OpHeader) //EIP-126997 Avoid setup crash + return Width; + + switch(OpHeader->OpCode) + { + case EFI_IFR_NUMERIC_OP: + case EFI_IFR_ONE_OF_OP: + Width = (UINT16)(1 << (((EFI_IFR_NUMERIC*)OpHeader)->Flags & EFI_IFR_NUMERIC_SIZE)); + break; + case EFI_IFR_PASSWORD_OP: + Width = (UINT16)((EFI_IFR_PASSWORD*)OpHeader)->MaxSize * sizeof(CHAR16); + break; + case EFI_IFR_STRING_OP: + Width = (UINT16)((EFI_IFR_STRING*)OpHeader)->MaxSize * sizeof(CHAR16); + break; + case EFI_IFR_CHECKBOX_OP: + Width = sizeof(UINT8); + break; + case EFI_IFR_DATE_OP: + Width = sizeof(EFI_HII_DATE); + break; + case EFI_IFR_TIME_OP: + Width = sizeof(EFI_HII_TIME); + break; + case EFI_IFR_EQ_ID_VAL_OP: + case EFI_IFR_EQ_ID_LIST_OP: + case EFI_IFR_EQ_ID_ID_OP: + ASSERT(1); + break; + default: + break; + } + return Width; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiGetQuestionOffset +// +// Description: +// +// Parameter: VOID *IfrPtr +// +// Return value: UINT16 +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +extern UINT32 gtempCurrentPage; +UINT16 UefiGetQuestionOffset(VOID *IfrPtr) +{ + EFI_IFR_OP_HEADER *OpHeader=(EFI_IFR_OP_HEADER *)IfrPtr; + EFI_IFR_QUESTION_HEADER *QHeader = NULL; + UINT16 VarOffset = 0; + UINT32 iIndex = 0; + VARIABLE_INFO *Variable = NULL; + + if (NULL == OpHeader) //EIP-126997 Avoid setup crash + return VarOffset; + + switch(OpHeader->OpCode) + { + case EFI_IFR_CHECKBOX_OP: + case EFI_IFR_REF_OP: + case EFI_IFR_RESET_BUTTON_OP: + case EFI_IFR_ACTION_OP: + case EFI_IFR_DATE_OP: + case EFI_IFR_NUMERIC_OP: + case EFI_IFR_ONE_OF_OP: + case EFI_IFR_STRING_OP: + case EFI_IFR_PASSWORD_OP: + case EFI_IFR_ORDERED_LIST_OP: + case EFI_IFR_TIME_OP: + QHeader = (EFI_IFR_QUESTION_HEADER *)((UINT8*)OpHeader + sizeof(EFI_IFR_OP_HEADER)); + for (iIndex = 0; iIndex < gVariables->VariableCount; iIndex++) + { + Variable = (VARIABLE_INFO*)((UINT8 *)gVariables + gVariables->VariableList [iIndex]); + if ((VARIABLE_ATTRIBUTE_NAMEVALUE == (Variable->ExtendedAttibutes & VARIABLE_ATTRIBUTE_NAMEVALUE))) + { + UINT32 page = (NULL == gApp ? gtempCurrentPage : gApp->CurrentPage); + PAGE_INFO *pageInfo = (PAGE_INFO *)((UINTN)gApplicationData + gPages->PageList [page]); + + //Always dont depend on VariableID alone it will be same for different handles, compare handle also + if (pageInfo && (pageInfo->PageHandle == Variable->VariableHandle) && (Variable->VariableID == QHeader->VarStoreId)) + { + return 0; + } + } + } + VarOffset = QHeader->VarStoreInfo.VarOffset; + break; + default: + break; + } + return VarOffset; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiGetDateTimeDetails +// +// Description: +// +// Parameter: VOID *IfrPtr,UINT8 Type,UINT16 * Help,UINT16 * Min,UINT16 * Max +// +// Return value: VOID +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID UefiGetDateTimeDetails(VOID *IfrPtr,UINT8 Type,UINT16 * Help,UINT16 * Min,UINT16 * Max) +{ +/* + EFI_IFR_OP_HEADER *OpHeader=(EFI_IFR_OP_HEADER *)IfrPtr; + EFI_IFR_NUMERIC *NumIfr=NULL; + switch(OpHeader->OpCode) + { + case EFI_IFR_TIME_OP: + if(Type == AMI_TIME_HOUR) + NumIfr = &(((EFI_IFR_TIME*)OpHeader)->Hour); + else if (Type == AMI_TIME_MIN) + NumIfr = &(((EFI_IFR_TIME*)OpHeader)->Minute); + else if (Type == AMI_TIME_SEC) + NumIfr = &(((EFI_IFR_TIME*)OpHeader)->Second); + break; + case EFI_IFR_DATE_OP: + if(Type == AMI_DATE_YEAR) + NumIfr = &(((EFI_IFR_DATE*)OpHeader)->Year); + else if (Type == AMI_DATE_MONTH) + NumIfr = &(((EFI_IFR_DATE*)OpHeader)->Month); + else if (Type == AMI_DATE_DAY) + NumIfr = &(((EFI_IFR_DATE*)OpHeader)->Day); + break; + default: + break; + } + if(NumIfr) + { + *Help = NumIfr->Help; + *Min = NumIfr->Minimum; + *Max = NumIfr->Maximum; + }*/ + + *Min = 0; + *Max = 0xFFFF;//EIP 74964 Initializing the MIN/MAX values for date and time. + +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiGetOneOfOptions +// +// Description: +// +// Parameter: VOID *IfrPtr,VOID **Handle,UINT16 **OptionPtrTokens, +// UINT64 **ValuePtrTokens, UINT16 *ItemCount, +// UINT16 *Interactive,UINT16 *CallBackKey +// +// Return value: EFI_STATUS +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS UefiGetOneOfOptions(CONTROL_INFO *CtrlInfo, VOID **Handle, UINT16 **OptionPtrTokens, + UINT64 **ValuePtrTokens, UINT16 *ItemCount, + UINT16 *Interactive,UINT16 *CallBackKey ) +{ + EFI_IFR_OP_HEADER *OpHeader=(EFI_IFR_OP_HEADER *)(CtrlInfo->ControlPtr); + EFI_IFR_QUESTION_HEADER *QHeader; + EFI_STATUS Status = EFI_SUCCESS; + UINT16 Index= 0; + UINT8 Opcode = OpHeader->OpCode; + UINT8 MaxItems = 10; + + if(OpHeader->OpCode == EFI_IFR_CHECKBOX_OP) + { + MaxItems = 2; + *Handle = gHiiHandle; + } + + // Evaluate Interactive and Callback + QHeader = (EFI_IFR_QUESTION_HEADER *)((UINT8 *)OpHeader + sizeof(EFI_IFR_OP_HEADER)); + if(QHeader->Flags & EFI_IFR_FLAG_CALLBACK) + { + if(Interactive) + *Interactive = TRUE; + if(CallBackKey) + *CallBackKey = QHeader->QuestionId; + } + + // Free Buffers if Allocated and Allocate afresh + if( OptionPtrTokens != NULL ) + { + if( *OptionPtrTokens != NULL ) + MemFreePointer((VOID **)OptionPtrTokens); + } + + if( ValuePtrTokens != NULL ) + { + if( *ValuePtrTokens != NULL ) + MemFreePointer((VOID **)ValuePtrTokens); + } + + if( NULL != OptionPtrTokens )//EIP-75379 Static code analysis check for NULL + { + *OptionPtrTokens = (UINT16 *)EfiLibAllocateZeroPool(MaxItems * sizeof(UINT16)); + } + + if(ValuePtrTokens) + *ValuePtrTokens = (UINT64 *)EfiLibAllocateZeroPool(MaxItems * sizeof(UINT64)); + + if ( NULL == OptionPtrTokens || NULL == *OptionPtrTokens )//EIP-75379 Static code analysis check for NULL + { + Status = EFI_OUT_OF_RESOURCES; + goto DONE; + } + + //Populate Options + if(Opcode == EFI_IFR_CHECKBOX_OP) + { + *ItemCount = MaxItems; + for(Index = 0; Index < MaxItems; Index++) + { + (*OptionPtrTokens)[Index] = gCheckboxTokens[Index]; + if(ValuePtrTokens) + (*ValuePtrTokens)[Index] = Index; + } + } + else + { + *ItemCount = 0; + _UefiGetValidOptions(CtrlInfo, OptionPtrTokens, ValuePtrTokens, ItemCount, MaxItems); + } + +DONE: + return Status; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: _UefiGetValidOptions +// +// Description: +// +// Parameter: CONTROL_INFO *CtrlInfo, UINT16 **OptionPtrTokens, +// UINT64 **ValuePtrTokens, UINT16 *ItemCount,UINT8 MaxItems +// +// Return value: VOID +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID _UefiGetValidOptions(CONTROL_INFO *CtrlInfo, UINT16 **OptionPtrTokens, + UINT64 **ValuePtrTokens, UINT16 *ItemCount,UINT8 MaxItems) +{ + EFI_IFR_OP_HEADER *OpHeader = (EFI_IFR_OP_HEADER *)CtrlInfo->ControlPtr; + UINT32 Offset = 0; + INT32 InScope = 0; + UINT16 Max = (UINT16)MaxItems; + UINT16 Itr = 0; + UINT8 suppress = FALSE; + UINT8 condition = COND_NONE; + INT32 suppressScopeCount = 0; + UINT8 *conditionPtr = NULL; + + do + { + if(OpHeader->Scope) + { + InScope++; + suppressScopeCount = suppressScopeCount? ++suppressScopeCount : 0; + } + switch(OpHeader->OpCode) + { + case EFI_IFR_SUPPRESS_IF_OP: + if(suppress == FALSE) + { + conditionPtr = (UINT8 *)OpHeader; + suppress = TRUE; + suppressScopeCount++; + } + break; + case EFI_IFR_ONE_OF_OPTION_OP: + // Evaluate Condition to determine if option is required to be added to list + condition = suppress && conditionPtr? CheckOneOfOptionSuppressIf(CtrlInfo, conditionPtr, (UINT8*)OpHeader) : COND_NONE; + if(condition != COND_SUPPRESS) + { + // Add Option to Buffer. + if(Itr == Max) + { + *OptionPtrTokens = MemReallocateZeroPool(*OptionPtrTokens, Max * sizeof(UINT16), (Max + 10) * sizeof(UINT16)); + if(ValuePtrTokens) + { + *ValuePtrTokens = MemReallocateZeroPool(*ValuePtrTokens, Max * sizeof(UINT64), (Max + 10) * sizeof(UINT64)); + } + Max += 10; + } + (*OptionPtrTokens)[Itr] = ((EFI_IFR_ONE_OF_OPTION *)OpHeader)->Option; + if(ValuePtrTokens) + { + switch(((EFI_IFR_ONE_OF_OPTION *)OpHeader)->Type) + { + case EFI_IFR_TYPE_NUM_SIZE_16: + (*ValuePtrTokens)[Itr] = ((EFI_IFR_ONE_OF_OPTION *)OpHeader)->Value.u16; + break; + case EFI_IFR_TYPE_NUM_SIZE_32: + (*ValuePtrTokens)[Itr] = ((EFI_IFR_ONE_OF_OPTION *)OpHeader)->Value.u32; + break; + case EFI_IFR_TYPE_NUM_SIZE_64: + (*ValuePtrTokens)[Itr] = ((EFI_IFR_ONE_OF_OPTION *)OpHeader)->Value.u64; + break; + case EFI_IFR_TYPE_NUM_SIZE_8: + default: + (*ValuePtrTokens)[Itr] = ((EFI_IFR_ONE_OF_OPTION *)OpHeader)->Value.u8; + break; + } + } + Itr++; + } + break; + case EFI_IFR_END_OP: + InScope = InScope > 0? --InScope : 0; + suppressScopeCount = suppressScopeCount > 0? --suppressScopeCount : 0; + suppress = suppressScopeCount == 0? FALSE : suppress; + conditionPtr = suppress == TRUE? conditionPtr : NULL; + default: + break; + } + + // Move to Next Opcode + Offset += OpHeader->Length; + OpHeader = (EFI_IFR_OP_HEADER *)((UINT8*)CtrlInfo->ControlPtr + Offset); + }while(InScope); + *ItemCount = Itr; +} + +//<AMI_PHDR_START> +//--------------------------------------------------------------------------- +// Procedure: UefiGetValidOptionType +// +// Description: Assuming all the options in this control has option with +// same type and length +// +// Input: CONTROL_INFO *CtrlInfo - Pointer to the control info data +// UINTN *Type - Returns EFI_IFR_TYPE_NUM_SIZE +// +// Output: VOID +//--------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID UefiGetValidOptionType(CONTROL_INFO *CtrlInfo, UINTN *Type, UINT32 *SizeOfData) +{ + EFI_IFR_OP_HEADER *OpHeader = (EFI_IFR_OP_HEADER *)CtrlInfo->ControlPtr; + UINT32 Offset = 0; + INT32 InScope = 0; + UINT8 suppress = FALSE; + UINT8 condition = COND_NONE; + INT32 suppressScopeCount = 0; + UINT8 *conditionPtr = NULL; + + do + { + if(OpHeader->Scope) + { + InScope++; + suppressScopeCount = suppressScopeCount? ++suppressScopeCount : 0; + } + switch(OpHeader->OpCode) + { + case EFI_IFR_SUPPRESS_IF_OP: + if(suppress == FALSE) + { + conditionPtr = (UINT8 *)OpHeader; + suppress = TRUE; + suppressScopeCount++; + } + break; + case EFI_IFR_ONE_OF_OPTION_OP: + // Evaluate Condition to determine if option is required to be added to list + condition = suppress && conditionPtr? CheckOneOfOptionSuppressIf(CtrlInfo, conditionPtr, (UINT8*)OpHeader) : COND_NONE; + if(condition != COND_SUPPRESS) + { + switch(((EFI_IFR_ONE_OF_OPTION *)OpHeader)->Type) + { + case EFI_IFR_TYPE_NUM_SIZE_16: + *Type = EFI_IFR_TYPE_NUM_SIZE_16; + *SizeOfData = sizeof(UINT16); + goto DONE; + case EFI_IFR_TYPE_NUM_SIZE_32: + *Type = EFI_IFR_TYPE_NUM_SIZE_32; + *SizeOfData = sizeof(UINT32); + goto DONE; + case EFI_IFR_TYPE_NUM_SIZE_64: + *Type = EFI_IFR_TYPE_NUM_SIZE_64; + *SizeOfData = sizeof(UINT64); + goto DONE; + case EFI_IFR_TYPE_NUM_SIZE_8: + default: + *Type = EFI_IFR_TYPE_NUM_SIZE_8; + *SizeOfData = sizeof(UINT8); + goto DONE; + } + } + break; + case EFI_IFR_END_OP: + InScope = InScope > 0? --InScope : 0; + suppressScopeCount = suppressScopeCount > 0? --suppressScopeCount : 0; + suppress = suppressScopeCount == 0? FALSE : suppress; + conditionPtr = suppress == TRUE? conditionPtr : NULL; + break; + default: + break; + } + // Move to Next Opcode + Offset += OpHeader->Length; + OpHeader = (EFI_IFR_OP_HEADER *)((UINT8*)CtrlInfo->ControlPtr + Offset); + }while(InScope); + +DONE: + return; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiGetMaxEntries +// +// Description: +// +// Parameter: VOID *IfrPtr +// +// Return value: UINT8 +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +UINT8 UefiGetMaxEntries(VOID *IfrPtr) +{ + EFI_IFR_OP_HEADER *OpHeader=(EFI_IFR_OP_HEADER *)IfrPtr; + UINT8 Value = 0; + + switch(OpHeader->OpCode) + { + case EFI_IFR_ORDERED_LIST_OP: + Value = ((EFI_IFR_ORDERED_LIST*)OpHeader)->MaxContainers; + break; + default: + break; + } + return Value; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiTseLiteGetBootOverRideIndex +// +// Description: +// +// Parameter: VOID *IfrPtr +// +// Return value: UINT16 +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +UINT16 UefiTseLiteGetBootOverRideIndex(VOID *IfrPtr) +{ + EFI_IFR_OP_HEADER * OpHeader = (EFI_IFR_OP_HEADER *)IfrPtr; + EFI_IFR_EQ_ID_LIST *EqIdList; + UINT16 Index=0xFFFF; + UINT8 InScope = 0; + + if ((OpHeader != NULL) && (OpHeader->OpCode == EFI_IFR_SUPPRESS_IF_OP)) + { + do + { + if(OpHeader->Scope) + { + InScope++; + } + + if(OpHeader->OpCode == EFI_IFR_END_OP) + { + InScope--; + if(InScope == 0) + { + // EFI_IFR_EQ_ID_LIST_OP opcode not found + goto DONE; + } + } + + OpHeader = (EFI_IFR_OP_HEADER*)((UINT8*)OpHeader + OpHeader->Length); + }while(OpHeader->OpCode != EFI_IFR_EQ_ID_LIST_OP); + + // FIX ME : Do it better. Check the list length and + if(OpHeader->OpCode == EFI_IFR_EQ_ID_LIST_OP) + { + EqIdList = (EFI_IFR_EQ_ID_LIST*)OpHeader; + Index = EqIdList->ListLength - 1; + } + } + +DONE: + return Index; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiTseLiteGetAmiCallbackIndex +// +// Description: +// +// Parameter: VOID * Ptr +// +// Return value: UINT16 +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +UINT16 UefiTseLiteGetAmiCallbackIndex(VOID * Ptr, VOID * CtrlPtr) +{ + EFI_IFR_OP_HEADER * OpHeader = (EFI_IFR_OP_HEADER *)Ptr; + UINT16 Index=0xFFFF; + UINT8 InScope = 0; + VOID *SupressIfPtr = NULL; + + if ((OpHeader != NULL) && (OpHeader->OpCode == EFI_IFR_SUPPRESS_IF_OP)) + { + // Locate the Last supress If till the control Ptr + do + { + if(OpHeader->Scope) + { + InScope++; + } + if(OpHeader->OpCode == EFI_IFR_END_OP) + { + InScope--; + if(InScope == 0) + { + // EFI_IFR_EQ_ID_VAL_OP opcode not found + goto DONE; + } + } + if(OpHeader->OpCode == EFI_IFR_SUPPRESS_IF_OP) + SupressIfPtr = (VOID*)OpHeader; + OpHeader = (EFI_IFR_OP_HEADER*)((UINT8*)OpHeader + OpHeader->Length); + }while((UINTN)OpHeader < (UINTN)CtrlPtr); + + OpHeader = (EFI_IFR_OP_HEADER*)SupressIfPtr ; + do + { + if(OpHeader->Scope) + { + InScope++; + } + if(OpHeader->OpCode == EFI_IFR_END_OP) + { + InScope--; + if(InScope == 0) + { + // EFI_IFR_EQ_ID_VAL_OP opcode not found + goto DONE; + } + } + OpHeader = (EFI_IFR_OP_HEADER*)((UINT8*)OpHeader + OpHeader->Length); + }while(OpHeader->OpCode != EFI_IFR_EQ_ID_VAL_OP); + + // FIX ME : Do it better. Check the list length and + if(OpHeader->OpCode == EFI_IFR_EQ_ID_VAL_OP) + { + Index = ((EFI_IFR_EQ_ID_VAL*)OpHeader)->Value; + } + } + +DONE: + return Index; +} + + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiFormCallbackNVRead +// +// Description: +// +// Parameter: CHAR16 *name, EFI_GUID *guid, UINT32 *attributes, +// UINTN *size, VOID **buffer +// +// Return value: EFI_STATUS +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS UefiFormCallbackNVRead(CHAR16 *name, EFI_GUID *guid, UINT32 *attributes, UINTN *size, VOID **buffer) +{ + EFI_STATUS Status = EFI_UNSUPPORTED; + + return Status; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiFormCallbackNVWrite +// +// Description: +// +// Parameter: CHAR16 *name, EFI_GUID *guid, UINT32 attributes, +// VOID *buffer, UINTN size +// +// Return value: EFI_STATUS +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS UefiFormCallbackNVWrite(CHAR16 *name, EFI_GUID *guid, UINT32 attributes, VOID *buffer, UINTN size) +{ + EFI_STATUS Status = EFI_UNSUPPORTED; + + return Status; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiVarGetNvram +// +// Description: +// +// Parameter: VARIABLE_INFO *VariableInfo, VOID **Buffer, UINTN Offset, +// UINTN Size +// +// Return value: EFI_STATUS +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS NameValueGetHexStringAsBuffer (UINT8 **Buffer, CHAR16 *HexStringBuffer, UINTN Size); +EFI_STATUS UefiVarGetNvram(VARIABLE_INFO *VariableInfo, VOID **Buffer, UINTN Offset, UINTN Size) +{ + EFI_STATUS status = EFI_SUCCESS; + EFI_STRING configuration = (EFI_STRING)NULL; + EFI_STRING result = (EFI_STRING)NULL; + EFI_STRING stringPtr = (EFI_STRING)NULL; + UINTN length = 1; + UINT8 *buffer = NULL; + EFI_GUID EfiHiiConfigAccessProtocolGuid = EFI_HII_CONFIG_ACCESS_PROTOCOL_GUID; + EFI_HANDLE DriverHandle; + EFI_HII_CONFIG_ACCESS_PROTOCOL *ConfigAccess; + CHAR16 tmpString = (CHAR16)NULL; + EFI_STRING progress = &tmpString; + BOOLEAN PreservegEnableDrvNotification = FALSE; + + configuration = EfiLibAllocateZeroPool(length); + if(configuration == NULL) + { + status = EFI_OUT_OF_RESOURCES; + goto DONE; + } + + // + // Construct the Configuration Header String + // + status = GetConfigHeader(VariableInfo, &configuration, &length); + if(EFI_ERROR(status) || (configuration == NULL))//EIP-75384 Static Analysis + { + goto DONE; + } + + if(VariableInfo->ExtendedAttibutes & VARIABLE_ATTRIBUTE_NAMEVALUE) + { + //Allocate Memory for "&<Name>" + UINTN len = length + EfiStrLen(L"&") + EfiStrLen(VariableInfo->VariableName) + sizeof(CHAR16); + + configuration = MemReallocateZeroPool(configuration, length * sizeof(CHAR16), len * sizeof(CHAR16)); + if(configuration == NULL) + { + status = EFI_OUT_OF_RESOURCES; + goto DONE; + } + + EfiStrCat(configuration, L"&"); + EfiStrCat(configuration, VariableInfo->VariableName); + length = len; + }else + { + status = GetBlockName(&configuration, &length, Offset, Size); + if(EFI_ERROR(status)) + { + goto DONE; + } + } + + SetCallBackControlInfo(VariableInfo->VariableHandle, 0); //Set this varaible handle to allow BrowserCallback + + PreservegEnableDrvNotification = gEnableDrvNotification; + gEnableDrvNotification = TRUE; //EIP75588 Set to enable notification processing + + if (!(VariableInfo->ExtendedAttibutes & VARIABLE_ATTRIBUTE_NAMEVALUE)) // Invoke Config Routing Route Config + { + status = gHiiConfigRouting->ExtractConfig (gHiiConfigRouting, configuration, &progress, &result); + } + else + { + status = gHiiDatabase->GetPackageListHandle (gHiiDatabase, VariableInfo->VariableHandle, &DriverHandle); //Calling the driver which publishes the name value + if(!EFI_ERROR(status)) + { + status = gBS->HandleProtocol (DriverHandle, &EfiHiiConfigAccessProtocolGuid , &ConfigAccess); + if(!EFI_ERROR(status)) + { + status = ConfigAccess->ExtractConfig (ConfigAccess, configuration, &progress, &result); + } + } + } + if (!PreservegEnableDrvNotification) // If gEnableDrvNotification is already True Don't touch it + gEnableDrvNotification = FALSE; //EIP75588 Reset to disable notification processing + SetCallBackControlInfo(NULL, 0); //Disable update + if(EFI_ERROR(status) || (progress == (EFI_STRING)NULL)) + { + goto DONE; + } + + if(EFI_ERROR(status = _VerifyResponseString(result, (VariableInfo->ExtendedAttibutes & VARIABLE_ATTRIBUTE_NAMEVALUE)? TRUE : FALSE))) + { + goto DONE; + } + + stringPtr = result; + if(VariableInfo->ExtendedAttibutes & VARIABLE_ATTRIBUTE_NAMEVALUE) + { + for(stringPtr = result; *stringPtr != 0 && EfiStrnCmp(stringPtr, VariableInfo->VariableName, EfiStrLen(VariableInfo->VariableName)) != 0; stringPtr++) + ; + stringPtr += EfiStrLen(VariableInfo->VariableName); + stringPtr += EfiStrLen(L"="); + status = NameValueGetHexStringAsBuffer (&buffer, stringPtr, Size); + }else + { + for(stringPtr = result; *stringPtr != 0 && EfiStrnCmp(stringPtr, L"&VALUE=", EfiStrLen(L"&VALUE=")) != 0; stringPtr++) + ; + stringPtr += EfiStrLen(L"&VALUE="); + status = GetHexStringAsBuffer (&buffer, stringPtr); + } + + + if(EFI_ERROR(status)) + { + goto DONE; + } + + *Buffer = buffer; + +DONE: + if(configuration) + { + MemFreePointer(&configuration); + } + if(result) + { + MemFreePointer(&result); + } + return status; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiVarSetNvram +// +// Description: +// +// Parameter: VARIABLE_INFO *VariableInfo, VOID *Buffer, UINTN Offset, +// UINTN Size +// +// Return value: EFI_STATUS +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS NameValueBufToHexString (IN OUT CHAR16 **, IN OUT UINTN *, IN UINT8 *, IN UINTN ); +EFI_STATUS UefiVarSetNvram(VARIABLE_INFO *VariableInfo, VOID *Buffer, UINTN Offset, UINTN Size) +{ + EFI_STATUS status = EFI_SUCCESS; + EFI_STRING configuration = NULL; + EFI_STRING progress = NULL; + CHAR16 *tempBuffer = NULL; + UINTN length = 0; + UINTN finalLen = 0; + UINTN bufLen = 1; + BOOLEAN PreservegEnableDrvNotification = FALSE; + + // + //Construct the Configuration Header String + // + status = GetConfigHeader(VariableInfo, &configuration, &length); + if(EFI_ERROR(status) || (configuration == NULL))//EIP-75384 Static Analysis + { + goto DONE; + } + + if(VariableInfo->ExtendedAttibutes & VARIABLE_ATTRIBUTE_NAMEVALUE) + { + UINTN len = length + EfiStrLen(L"&") + EfiStrLen(VariableInfo->VariableName) + EfiStrLen(L"=") + sizeof(CHAR16); + configuration = MemReallocateZeroPool (configuration, length * sizeof(CHAR16), len * sizeof(CHAR16)); + if (configuration == NULL) + { + status = EFI_OUT_OF_RESOURCES; + goto DONE; + } + EfiStrCat(configuration, L"&"); + EfiStrCat(configuration, VariableInfo->VariableName); + EfiStrCat(configuration, L"="); + length = EfiStrLen (configuration) * sizeof (CHAR16); + }else + { + status = GetBlockName(&configuration, &length, Offset, Size); + if(EFI_ERROR(status)) + { + goto DONE; + } + } + + // + // Get the Buffer as Hex String + // + if (!(VariableInfo->ExtendedAttibutes & VARIABLE_ATTRIBUTE_NAMEVALUE)) + { + tempBuffer = (UINT16*)EfiLibAllocateZeroPool(bufLen * sizeof(UINT16)); + if(tempBuffer == NULL) + { + status = EFI_OUT_OF_RESOURCES; + goto DONE; + } + status = BufToHexString(tempBuffer, &bufLen, Buffer, Size); + if(EFI_ERROR(status)) + { + if(status != EFI_BUFFER_TOO_SMALL) + { + goto DONE; + } + if(tempBuffer) + { + MemFreePointer(&tempBuffer); + } + tempBuffer = (UINT16*)EfiLibAllocateZeroPool(bufLen * 2); + if(tempBuffer == NULL) + { + status = EFI_OUT_OF_RESOURCES; + goto DONE; + } + } + status = BufToHexString(tempBuffer, &bufLen, Buffer, Size); + } + else + { + bufLen = 0; + status = NameValueBufToHexString (&tempBuffer, &bufLen, Buffer, Size); + } + if(EFI_ERROR(status)) + { + goto DONE; + } + +// + // Calculate the total Configuration string length + // <Config Hdr>&OFFSET=<HexChar>0&WIDTH=<HexChar>&VALUE=<HexChar><NULL> + // | length | 7 | bufLen | 1 | + // + if (!(VariableInfo->ExtendedAttibutes & VARIABLE_ATTRIBUTE_NAMEVALUE)) + { + finalLen = length + (bufLen * 2) + (EfiStrLen(L"&VALUE=") * sizeof(CHAR16)); + } + else + { //<exislen> + <Var val> + <NULL> + finalLen = length + bufLen + (2 * sizeof (CHAR16)); //Last 2 bytes for appending & and NULL + } + configuration = MemReallocateZeroPool(configuration, length, finalLen); + if(configuration == NULL) + { + status = EFI_OUT_OF_RESOURCES; + goto DONE; + } + if (!(VariableInfo->ExtendedAttibutes & VARIABLE_ATTRIBUTE_NAMEVALUE)) + { + EfiStrCat(configuration, L"&VALUE="); + } + EfiStrCat(configuration, tempBuffer); + if (VariableInfo->ExtendedAttibutes & VARIABLE_ATTRIBUTE_NAMEVALUE) + { + EfiStrCat (configuration, L"&"); + } + MemFreePointer(&tempBuffer); + PreservegEnableDrvNotification = gEnableDrvNotification; + gEnableDrvNotification = TRUE; //EIP75588 Set to enable notification processing + status = gHiiConfigRouting->RouteConfig (gHiiConfigRouting, configuration, &progress); + if(!PreservegEnableDrvNotification) // If gEnableDrvNotification is already True Don't touch it + gEnableDrvNotification = FALSE; //Reset to disable notification processing + MemFreePointer (&configuration); +DONE: + return status; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: _ConstructConfigHdr +// +// Description: Construct <ConfigHdr> using routing information GUID/NAME/PATH. +// +// Parameter: IN OUT CHAR16 *ConfigHdr, +// IN OUT UINTN *StrBufferLen, +// IN EFI_GUID *Guid, +// IN CHAR16 *Name, OPTIONAL +// IN EFI_HANDLE *DriverHandle +// +// Return value: EFI_STATUS +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS _ConstructConfigHdr ( + IN OUT CHAR16 *ConfigHdr, + IN OUT UINTN *StrBufferLen, + IN EFI_GUID *Guid, + IN CHAR16 *Name, OPTIONAL + IN EFI_HANDLE *DriverHandle + ) +{ + EFI_STATUS Status; + UINTN NameStrLen; + UINTN DevicePathSize; + UINTN BufferSize; + CHAR16 *StrPtr; + EFI_DEVICE_PATH_PROTOCOL *DevicePath; + + if (Name == NULL) + { + // + // There will be no "NAME" in <ConfigHdr> for Name/Value storage + // + NameStrLen = 0; + } else + { + // + // For buffer storage + // + NameStrLen = EfiStrLen (Name); + } + + // + // Retrieve DevicePath Protocol associated with this HiiPackageList + // + Status = gBS->HandleProtocol ( + DriverHandle, + &gEfiDevicePathProtocolGuid, + &DevicePath + ); + if (EFI_ERROR (Status)) + { + return Status; + } + + DevicePathSize = EfiDevicePathSize (DevicePath); + + // + // GUID=<HexCh>32&NAME=<Char>NameStrLen&PATH=<HexChar>DevicePathStrLen <NULL> + // | 5 | 32 | 6 | NameStrLen*4 | 6 | DevicePathStrLen | 1 | + // + BufferSize = (5 + 32 + 6 + NameStrLen * 4 + 6 + DevicePathSize * 2 + 1) * sizeof (CHAR16); + if (*StrBufferLen < BufferSize) + { + *StrBufferLen = BufferSize; + return EFI_BUFFER_TOO_SMALL; + } + + *StrBufferLen = BufferSize; + + StrPtr = ConfigHdr; + + EfiStrCpy (StrPtr, L"GUID="); + StrPtr += 5; + BufferToHexString (StrPtr, (UINT8 *) Guid, sizeof (EFI_GUID)); + StrPtr += 32; + + // + // Convert name string, e.g. name "ABCD" => "&NAME=0041004200430044" + // + EfiStrCpy (StrPtr, L"&NAME="); + StrPtr += 6; + if (Name != NULL) + { + BufferSize = (NameStrLen * 4 + 1) * sizeof (CHAR16); + UnicodeToConfigString (StrPtr, &BufferSize, Name); + StrPtr += (NameStrLen * 4); + } + + EfiStrCpy (StrPtr, L"&PATH="); + StrPtr += 6; + BufferToHexString (StrPtr, (UINT8 *) DevicePath, DevicePathSize); + + return EFI_SUCCESS; +} + + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: GetConfigHeader +// +// Description: +// +// Parameter: VARIABLE_INFO *VariableInfo, EFI_STRING *Configuration, UINTN *Length +// +// Return value: EFI_STATUS +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS GetConfigHeader(VARIABLE_INFO *VariableInfo, EFI_STRING *Configuration, UINTN *Length) +{ + EFI_STATUS status = EFI_SUCCESS; + EFI_STRING configuration = NULL; + EFI_HANDLE driverHandle; + UINTN length = 50; + + // + // Initialize Protocols + // + status = HiiInitializeProtocol(); + if(EFI_ERROR(status)) + { + goto DONE; + } + + // + // Retrieve the Device Path from Handle + // + status = gHiiDatabase->GetPackageListHandle(gHiiDatabase, VariableInfo->VariableHandle, &driverHandle); + if(EFI_ERROR(status)) + { + goto DONE; + } + + // Allocate static memory of 50 Bytes, which will be freed if not used + configuration = (UINT16*)EfiLibAllocateZeroPool(50); + + // Construct the Configuration Header String + // + status = _ConstructConfigHdr(configuration, &length, &VariableInfo->VariableGuid, VariableInfo->VariableName, driverHandle); + if(EFI_ERROR(status)) + { + if(status == EFI_BUFFER_TOO_SMALL) + { + MemFreePointer(&configuration); + configuration = (UINT16*)EfiLibAllocateZeroPool(length); + if(configuration == NULL) + { + status = EFI_OUT_OF_RESOURCES; + goto DONE; + } + + status = _ConstructConfigHdr(configuration, &length, &VariableInfo->VariableGuid, VariableInfo->VariableName, driverHandle); + } + } + + if(EFI_ERROR(status)) + { + goto DONE; + } + + if(*Configuration) + { + MemFreePointer(Configuration); + } + *Configuration = configuration; + *Length = length; + +DONE: + return status; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: GetBlockName +// +// Description: +// +// Parameter: EFI_STRING *Configuration, UINTN *Length, UINTN Size +// +// Return value: EFI_STATUS +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS GetBlockName(EFI_STRING *Configuration, UINTN *Length, UINTN Offset, UINTN Size) +{ + EFI_STATUS status = EFI_SUCCESS; + UINTN length = 0; + UINTN finalLen = 0; + CHAR16 *tempBuffer = NULL; + + length = (EfiStrLen(L"&OFFSET=") + sizeof(Offset) + EfiStrLen(L"&WIDTH=") + sizeof(Size) + 1) * sizeof(CHAR16); + tempBuffer = (CHAR16*)EfiLibAllocateZeroPool(length); + if(tempBuffer == NULL) + { + status = EFI_OUT_OF_RESOURCES; + goto DONE; + } + + SPrint(tempBuffer, length, L"&OFFSET=%x&WIDTH=%x", Offset, Size); + + length = EfiStrLen(*Configuration) * sizeof(CHAR16); + finalLen = (EfiStrLen(*Configuration) + EfiStrLen(tempBuffer) + 1) * sizeof(CHAR16); + *Configuration = MemReallocateZeroPool(*Configuration, length, finalLen); + if(*Configuration == NULL) + { + status = EFI_OUT_OF_RESOURCES; + goto DONE; + } + + EfiStrCat(*Configuration, tempBuffer); + + MemFreePointer(&tempBuffer); + *Length = finalLen; + +DONE: + return status; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: _VerifyResponseString +// +// Description: Verifies Correctness of Response String. This is to prevent +// crashing if the result pointer is pointing to an invalid location. +// +// Parameter: EFI_STRING *Configuration +// +// Return value: EFI_STATUS +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS _VerifyResponseString(EFI_STRING Configuration, BOOLEAN NameValue) +{ + EFI_STATUS status = EFI_SUCCESS; + EFI_STRING config = Configuration; + CHAR16 *keyWord[] = {L"GUID=", L"&NAME=", L"&PATH=", L"&OFFSET=",L"&WIDTH=", L"&VALUE="}; + UINT32 i = 0; + UINT32 count = NameValue? 3 : 6; // If Name Value Check only upto &Path else check until &Value. + + if(EfiStrnCmp(config, keyWord[i], EfiStrLen(keyWord[i])) != 0) + { + status = EFI_NOT_FOUND; + goto DONE; + } + + for(i = 1; i < count; i++) + { + for(;EfiStrnCmp(config, keyWord[i], EfiStrLen(keyWord[i])) != 0 && (config != (Configuration + EfiStrLen(Configuration))); config++) + ; + if(EfiStrnCmp(config, keyWord[i], EfiStrLen(keyWord[i])) != 0) + { + status = EFI_NOT_FOUND; + goto DONE; + } + } + +DONE: + return status; +} + +#if !TSE_USE_EDK_LIBRARY +VOID +EfiLibSafeFreePool ( + IN VOID *Buffer + ) +{ +MemFreePointer(&Buffer); +} +#endif + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: GetHexStringAsBuffer +// +// Description: +// +// Parameter: CHAR8 *Buffer +// UINT16 *HexStringBuffer +// UINTN Size +// +// Return value: EFI_STATUS +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS GetHexStringAsBuffer(UINT8 **Buffer, CHAR16 *HexStringBuffer) +{ + EFI_STATUS status = EFI_SUCCESS; + UINTN bufLength = 0; + UINTN convertedStrLen = 0; + + status = HexStringToBuf(*Buffer, &bufLength, HexStringBuffer, &convertedStrLen); + if(EFI_ERROR(status)) + { + if(status == EFI_BUFFER_TOO_SMALL) + { + if(*Buffer) + { + MemFreePointer(Buffer); + } + *Buffer = EfiLibAllocateZeroPool(bufLength); + if(*Buffer == NULL) + { + status = EFI_OUT_OF_RESOURCES; + goto DONE; + } + }else + { + goto DONE; + } + status = HexStringToBuf(*Buffer, &bufLength, HexStringBuffer, &convertedStrLen); + } + +DONE: + return status; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: NameValueGetHexStringAsBuffer +// +// Description: +// +// Parameter: CHAR8 *Buffer +// UINT16 *HexStringBuffer +// UINTN Size +// +// Return value: EFI_STATUS +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS NameValueHexStringToBuf (IN OUT UINT8 *, IN OUT UINTN *Len,IN CHAR16 *, OUT UINTN *); +EFI_STATUS NameValueGetHexStringAsBuffer (UINT8 **Buffer, CHAR16 *HexStringBuffer, UINTN Size) +{ + EFI_STATUS status = EFI_SUCCESS; + UINTN bufLength = 0; + UINTN convertedStrLen = 0; + + if (Size <= sizeof (UINT64)) + { + GetHexStringAsBuffer (Buffer, HexStringBuffer); + } + else + { + status = NameValueHexStringToBuf (*Buffer, &bufLength, HexStringBuffer, &convertedStrLen); + if(EFI_ERROR(status)) + { + if(status == EFI_BUFFER_TOO_SMALL) + { + if(*Buffer) + { + MemFreePointer(Buffer); + } + bufLength = (Size > bufLength) ? Size : bufLength; + *Buffer = EfiLibAllocateZeroPool(bufLength); + if(*Buffer == NULL) + { + status = EFI_OUT_OF_RESOURCES; + goto DONE; + } + }else + { + goto DONE; + } + status = NameValueHexStringToBuf (*Buffer, &bufLength, HexStringBuffer, &convertedStrLen); + } + } +DONE: + return status; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: HiiExtendedInitializeProtocol +// +// Description: +// +// Parameter: +// +// Return value: EFI_STATUS +// EFI_SUCCESS +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS HiiExtendedInitializeProtocol() +{ + EFI_STATUS status = EFI_SUCCESS; + + if (gHiiInitialized) + { + goto DONE; + } + + status = gBS->LocateProtocol(&gEfiHiiConfigRoutingProtocolGuid, NULL, &gHiiConfigRouting); + if(EFI_ERROR(status)) + { + goto DONE; + } + + gHiiInitialized = TRUE; + +DONE: + return status; +} + + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: GetControlConditionVariable +// +// Description: +// +// Parameter: CONTROL_INFO *ControlInfo +// +// Return value: UINT32 +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +UINT32 GetControlConditionVariable(CONTROL_INFO *ControlInfo) +{ + EFI_IFR_OP_HEADER *ifrPtr; + PAGE_INFO *pageInfo = (PAGE_INFO *)((UINTN)gApplicationData + gPages->PageList[ControlInfo->ControlPageID]); + UINTN control = 0; + CONTROL_INFO *CtrlInfo; + BOOLEAN found = FALSE; + EFI_QUESTION_ID QuestionId; + UINT32 varId = 0; + + if ( ControlInfo == NULL ) + return 0; + + ifrPtr = (EFI_IFR_OP_HEADER *)ControlInfo->ControlConditionalPtr; + + if ( ifrPtr == NULL ) + return 0; + + if ( ( ifrPtr->OpCode != EFI_IFR_SUPPRESS_IF_OP ) && ( ifrPtr->OpCode != EFI_IFR_GRAY_OUT_IF_OP ) ) + return 0; + + ifrPtr = (EFI_IFR_OP_HEADER *)((UINTN)ifrPtr + ifrPtr->Length); + // skip NOT if it is present + if ( ifrPtr->OpCode == EFI_IFR_NOT_OP ) + ifrPtr = (EFI_IFR_OP_HEADER *)((UINTN)ifrPtr + ifrPtr->Length); + + if ( ifrPtr->OpCode == EFI_IFR_EQ_ID_LIST_OP ) + QuestionId = ((EFI_IFR_EQ_ID_LIST *)ifrPtr)->QuestionId; + else if ( ifrPtr->OpCode == EFI_IFR_EQ_ID_VAL_OP ) + QuestionId = ((EFI_IFR_EQ_ID_VAL *)ifrPtr)->QuestionId; + else + return 0; + + if(pageInfo->PageHandle ==0) + return 0; + + for ( control= 0; (control < pageInfo->PageControls.ControlCount) && (found == FALSE); control++ ) + { + CtrlInfo = (CONTROL_INFO *)((UINTN)gControlInfo + pageInfo->PageControls.ControlList[control]); + + if(QuestionId == CtrlInfo->ControlKey) + { + varId = CtrlInfo->ControlVariable; + found = TRUE; + } + } + if(!found) + return 0; + + return varId; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: HiiRemoveString +// +// Description: +// +// Parameter: EFI_HII_HANDLE Handle, UINT16 Token +// +// Return value: VOID +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID HiiRemoveString(EFI_HII_HANDLE Handle, UINT16 Token) +{ + UINT32 i = 0; + CHAR16 *nullString = NULL; + + for ( i = 0; i < gLangCount; i++ ) + { + HiiChangeStringLanguage( Handle, Token, gLanguages[i].Unicode, nullString ); + } +} + + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiIsEfiVariable +// +// Description: +// +// Parameter: UINT32 variable, VARIABLE_INFO *varInfo +// +// Return value: BOOLEAN +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +BOOLEAN UefiIsEfiVariable(UINT32 variable, VARIABLE_INFO *varInfo) +{ + if (varInfo->ExtendedAttibutes & VARIABLE_ATTRIBUTE_EFI_VARSTORE || + variable == VARIABLE_ID_LANGUAGE || + variable == VARIABLE_ID_DEL_BOOT_OPTION || + variable == VARIABLE_ID_ADD_BOOT_OPTION || + variable == VARIABLE_ID_BOOT_MANAGER || + variable == VARIABLE_ID_BOOT_NOW || + variable == VARIABLE_ID_LEGACY_DEV_INFO || + variable == VARIABLE_ID_LEGACY_GROUP_INFO || + variable == VARIABLE_ID_BOOT_TIMEOUT || + variable == VARIABLE_ID_BOOT_ORDER || + variable == VARIABLE_ID_AMI_CALLBACK || + variable == VARIABLE_ID_AMITSESETUP || + variable == VARIABLE_ID_ERROR_MANAGER || + variable == VARIABLE_ID_USER_DEFAULTS || + variable == VARIABLE_ID_BBS_ORDER || + variable == VARIABLE_ID_DRIVER_MANAGER || + variable == VARIABLE_ID_DRIVER_ORDER || + variable == VARIABLE_ID_ADD_DRIVER_OPTION || //EIP70421 Support for driver order + variable == VARIABLE_ID_DEL_DRIVER_OPTION || + variable == VARIABLE_ID_IDE_SECURITY) + { + return TRUE; + } + else + { + return FALSE; + } +} + +EFI_HII_PACKAGE_LIST_HEADER * +PreparePackageList ( + IN UINTN NumberOfPackages, + IN EFI_GUID *GuidId, + ... + ); + +#if APTIO_4_00 != 1 && SETUP_USE_GUIDED_SECTION !=1 +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: InitMiniSetupStrings +// +// Description: +// +// Parameter: VOID +// +// Return value: EFI_STATUS +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS InitMiniSetupStrings( VOID ) +{ + EFI_STATUS Status=EFI_SUCCESS; + UINT16 Index = 0; + EFI_HII_PACKAGE_LIST_HEADER *PackageList=NULL; +#ifdef STANDALONE_APPLICATION + EFI_GUID MiniSetupGuid = ENVIRONMENT_VARIABLE_ID ; +#else + EFI_GUID MiniSetupGuid = MINI_SETUP_GUID ; +#endif + Status = HiiInitializeProtocol(); + if ( EFI_ERROR ( Status ) ) + return Status; + + gHiiHandle = HiiFindHandle( &MiniSetupGuid, &Index ); + + if(gHiiHandle != INVALID_HANDLE){ //Remove the previous pack installed with this GUID + Status = gHiiDatabase->RemovePackageList(gHiiDatabase, gHiiHandle); + gHiiHandle = INVALID_HANDLE; + } + + if ( gHiiHandle == INVALID_HANDLE ) + { + PackageList = PreparePackageList ( + 1, + &MiniSetupGuid, + STRING_ARRAY_NAME + ); + if (PackageList == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + Status = gHiiDatabase->NewPackageList ( + gHiiDatabase, + PackageList, + gImageHandle, + &gHiiHandle + ); + } + + return Status; +} +#endif + + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: HiiGetManufactuingMask +// +// Description: +// +// Parameter: VOID +// +// Return value: UINTN +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +UINTN HiiGetManufactuingMask(VOID) +{ + return AMI_FLAG_MANUFACTURING; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: HiiGetDefaultMask +// +// Description: +// +// Parameter: VOID +// +// Return value: UINTN +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +UINTN HiiGetDefaultMask(VOID) +{ + return AMI_FLAG_DEFAULT; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: GetControlConditionVarId +// +// Description: +// +// Parameter: CONTROL_INFO *controlInfo +// +// Return value: UINT32 +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +UINT32 GetControlConditionVarId(CONTROL_INFO *controlInfo) +{ + EFI_IFR_OP_HEADER *ifrPtr; + PAGE_INFO *pageInfo = (PAGE_INFO *)((UINTN)gApplicationData + gPages->PageList[controlInfo->ControlPageID]); + UINTN control = 0; + CONTROL_INFO *CtrlInfo; + BOOLEAN found = FALSE; + EFI_QUESTION_ID QuestionId; + UINT32 varId = 0; + + if ( controlInfo == NULL ) + return 0; + + ifrPtr = (EFI_IFR_OP_HEADER *)controlInfo->ControlConditionalPtr; + + if ( ifrPtr == NULL ) + return 0; + + if ( ( ifrPtr->OpCode != EFI_IFR_SUPPRESS_IF_OP ) && ( ifrPtr->OpCode != EFI_IFR_GRAY_OUT_IF_OP ) ) + return 0; + + ifrPtr = (EFI_IFR_OP_HEADER *)((UINTN)ifrPtr + ifrPtr->Length); + // skip NOT if it is present + if ( ifrPtr->OpCode == EFI_IFR_NOT_OP ) + ifrPtr = (EFI_IFR_OP_HEADER *)((UINTN)ifrPtr + ifrPtr->Length); + + if ( ifrPtr->OpCode == EFI_IFR_EQ_ID_LIST_OP ) + QuestionId = ((EFI_IFR_EQ_ID_LIST *)ifrPtr)->QuestionId; + else if ( ifrPtr->OpCode == EFI_IFR_EQ_ID_VAL_OP ) + QuestionId = ((EFI_IFR_EQ_ID_VAL *)ifrPtr)->QuestionId; + else + return 0; + + if(pageInfo->PageHandle ==0) + return 0; + + for ( control= 0; (control < pageInfo->PageControls.ControlCount) && (found == FALSE); control++ ) + { + CtrlInfo = (CONTROL_INFO *)((UINTN)gControlInfo + pageInfo->PageControls.ControlList[control]); + + if(QuestionId == CtrlInfo->ControlKey) + { + varId = CtrlInfo->ControlVariable; + found = TRUE; + } + } + if(!found) + { + // Control Definition not in this Page. Look within the formset + EFI_HII_HANDLE pgHandle = controlInfo->ControlHandle; + UINT32 page = 0; + + for(;page < gPages->PageCount && (found == FALSE); page++) + { + if(page == controlInfo->ControlPageID) + { + continue; + } + pageInfo = (PAGE_INFO *)((UINTN)gApplicationData + gPages->PageList[page]); + if(pageInfo->PageHandle != pgHandle) + { + continue; + } + + for(control = 0; control < pageInfo->PageControls.ControlCount && (found == FALSE); control++) + { + controlInfo = (CONTROL_INFO *)((UINTN)gControlInfo + pageInfo->PageControls.ControlList[control]); + + if(QuestionId == controlInfo->ControlKey) + { + varId = controlInfo->ControlVariable; + found = TRUE; + } + } + } + } + + if(!found) + return 0; + + return varId; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure : ProcessActionQuestionConfiguration +// +// Description : Function to process Action Control Configuration String. +// +// Input : CONTROL_INFO *control +// +// Output : EFI_STATUS +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS ProcessActionQuestionConfiguration(CONTROL_INFO *control) +{ + EFI_STATUS Status = EFI_SUCCESS; + EFI_STRING configuration = NULL; + EFI_STRING progress = NULL; + EFI_IFR_ACTION *UefiAction = NULL; + BOOLEAN PreservegEnableDrvNotification = FALSE; + + if((control == NULL) || (control->ControlPtr == NULL)){ + Status = EFI_UNSUPPORTED; + goto DONE; + } + UefiAction = (EFI_IFR_ACTION*)control->ControlPtr; + + if(UefiAction->Header.Length == sizeof(EFI_IFR_ACTION)) + { + if(UefiAction->QuestionConfig) + { + //Process UefiAction QuestionConfig + configuration = HiiGetString(control->ControlHandle, UefiAction->QuestionConfig); + if((configuration != NULL) && EfiStrLen(configuration)) + { + PreservegEnableDrvNotification = gEnableDrvNotification; + gEnableDrvNotification = TRUE; //EIP75588 Set to enable notification processing + Status = gHiiConfigRouting->RouteConfig(gHiiConfigRouting, configuration, &progress); + if (!PreservegEnableDrvNotification) // If gEnableDrvNotification is already True Don't touch it + gEnableDrvNotification = FALSE; //Reset to disable notification processing + MemFreePointer(&configuration); + } + } + } +DONE: + return Status; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: ProcessBrowserActionRequest +// +// Description: +// +// Parameter: EFI_BROWSER_ACTION_REQUEST actionReq +// +// Return Value: EFI_STATUS +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS UefiVarsetnvramforCurrentform(UINT32 FormID); +EFI_STATUS UefiLoadPreviousValuesforCurrentform(UINT32 FormID); +VOID HotclickESCaction(VOID); +extern BOOLEAN BrowserActionDiscard; +EFI_STATUS ProcessBrowserActionRequest(EFI_BROWSER_ACTION_REQUEST ActionReq) +{ + + switch(ActionReq) + { + case EFI_BROWSER_ACTION_REQUEST_RESET: + // Do nothing. Reset the system. + gApp->Quit = ResetSys(); + break; + case EFI_BROWSER_ACTION_REQUEST_SUBMIT: + //Save values here before exiting. + gApp->Quit = SaveAndExit(); + break; + case EFI_BROWSER_ACTION_REQUEST_EXIT: + //Donot save values. Exit as is. + gApp->Quit = ExitApplication(); + break; + //EIP 86885 : START + //Changes to support new action request form browser + case EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT: + UefiVarsetnvramforCurrentform (gApp->CurrentPage) ; + HotclickESCaction(); + break; + case EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD_EXIT: + BrowserActionDiscard = TRUE; + UefiLoadPreviousValuesforCurrentform (gApp->CurrentPage); + HotclickESCaction(); + break; + case EFI_BROWSER_ACTION_REQUEST_FORM_APPLY: + UefiVarsetnvramforCurrentform (gApp->CurrentPage) ; + break; + case EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD: + BrowserActionDiscard = TRUE; + UefiLoadPreviousValuesforCurrentform (gApp->CurrentPage); + break; + //EIP 86885 : END + default: + break; + } +// gProFormOffset = 0; //EIP 86885 + CleargProcessedForms (); +// MemSet (gProcessedForms, MAX_FORMS_TO_PROCESS, 0); + + return EFI_SUCCESS; +} + +VOID* UefiGetSpecialEqIDIfrPtr(CONTROL_INFO *ControlInfo, UINT32 *Variable, GUID_INFO **GuidInfo) +{ + VOID *Conditional = ControlInfo->ControlConditionalPtr; + VOID *ControlPtr = ControlInfo->ControlPtr; + EFI_IFR_OP_HEADER * OpHeader = (EFI_IFR_OP_HEADER *)Conditional; + GUID_INFO *specialGuid = NULL; + VARIABLE_INFO *varInfo = NULL; + UINT32 i = 0; + UINT8 InScope = 0; + + if((OpHeader==NULL) || (ControlPtr <= Conditional)) + return NULL; + + if ((OpHeader != NULL) && + ((OpHeader->OpCode == EFI_IFR_SUPPRESS_IF_OP) || + (OpHeader->OpCode == EFI_IFR_GRAY_OUT_IF_OP))) + { + do + { + if(OpHeader->Scope) + { + InScope++; + } + if(OpHeader->OpCode == EFI_IFR_END_OP) + { + InScope--; + if(InScope == 0) + { + // EFI_IFR_EQ_ID_VAL_OP opcode not found + OpHeader = NULL; + goto DONE; + } + } + OpHeader = (EFI_IFR_OP_HEADER*)((UINT8*)OpHeader + OpHeader->Length); + }while((OpHeader->OpCode != EFI_IFR_EQ_ID_VAL_OP) && + (OpHeader->OpCode != EFI_IFR_EQ_ID_LIST_OP)); + } + + if(NoVarStoreSupport()) + { + if(*Variable == VARIABLE_ID_SETUP) + { + *Variable = FindVarFromITKQuestionId(UefiGetEqIDQuestionID(OpHeader)); + } + } + + // Retrieve Special Control Information??? Update with proper comment + varInfo = VarGetVariableInfoIndex( *Variable ); + if( varInfo == NULL ) + { + OpHeader = NULL; + goto DONE; + } + + for ( i = 0; i < gGuidList->GuidCount; i++ ) + { + GUID_INFO *guidInfo = (GUID_INFO *)((UINTN)gGuidList + gGuidList->GuidList[i]); + if ( EfiCompareGuid( &varInfo->VariableGuid, &guidInfo->GuidValue ) ) + { + specialGuid = guidInfo; + break; + } + } + + if ( specialGuid != NULL ) + { + if ( GuidInfo != NULL ) + *GuidInfo = specialGuid; + } + else + { + OpHeader = NULL; + } + + // See if Other condition is Special condition + if(OpHeader == NULL) + { + if(ControlPtr > Conditional) + { + UINTN Offset = _SkipExpression(Conditional); + if(Offset) + { + Conditional = (VOID*)((UINTN)Conditional + Offset); + if(ControlPtr > Conditional) + { + CONTROL_INFO TempCtlInfo; + MemCopy(&TempCtlInfo, ControlInfo, sizeof (CONTROL_INFO)); + TempCtlInfo.ControlConditionalPtr = Conditional; + *Variable = (UINT16)GetControlConditionVarId(&TempCtlInfo); + OpHeader = UefiGetSpecialEqIDIfrPtr(&TempCtlInfo, Variable, GuidInfo) ; + } + } + } + } + +DONE: + return OpHeader; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiGetSpecialEqIDValue +// +// Description: +// +// Parameter: CONTROL_INFO *ControlInfo, GUID_INFO **GuidInfo +// +// Return value: UINT16 +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +UINT16 UefiGetSpecialEqIDValue(CONTROL_INFO *ControlInfo, GUID_INFO **GuidInfo) +{ + UINT16 value = (UINT16)-2; + UINT32 condVarID = 0; + EFI_IFR_OP_HEADER *ifrPtr = NULL; + + condVarID = (UINT32)GetControlConditionVarId(ControlInfo); + ifrPtr = (EFI_IFR_OP_HEADER *)UefiGetSpecialEqIDIfrPtr(ControlInfo, &condVarID, GuidInfo); + + if(ifrPtr != NULL) + { + switch(ifrPtr->OpCode) + { + case EFI_IFR_EQ_ID_LIST_OP: + value = ((EFI_IFR_EQ_ID_LIST *)ifrPtr)->ValueList[0]; + break; + case EFI_IFR_EQ_ID_VAL_OP: + value = ((EFI_IFR_EQ_ID_VAL *)ifrPtr)->Value; + break; + default: + break; + } + } + + return value; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiSetEqIDValue +// +// Description: +// +// Parameter: VOID *IfrPtr, UINT16 Value +// +// Return value: VOID +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID UefiSetEqIDValue(VOID *IfrPtr, UINT16 Value) +{ + EFI_IFR_OP_HEADER *opHeader = (EFI_IFR_OP_HEADER *)IfrPtr; + + switch(opHeader->OpCode) + { + case EFI_IFR_EQ_ID_LIST_OP: + ((EFI_IFR_EQ_ID_LIST *)IfrPtr)->ValueList[0] = Value; + break; + case EFI_IFR_EQ_ID_VAL_OP: + ((EFI_IFR_EQ_ID_VAL *)IfrPtr)->Value = Value; + break; + default: + break; + } +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiIsOneOfControl +// +// Description: +// +// Parameter: VOID *IfrPtr +// +// Return value: BOOLEAN +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +BOOLEAN UefiIsOneOfControl(VOID *IfrPtr) +{ + return (((EFI_IFR_OP_HEADER *)IfrPtr)->OpCode == EFI_IFR_ONE_OF_OP)? TRUE : FALSE; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiUpdateControlVarOffset +// +// Description: +// +// Parameter: VOID *IfrPtr, UINT16 Value +// +// Return value: VOID +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID UefiUpdateControlVarOffset(VOID *IfrPtr, UINT16 Value) +{ + EFI_IFR_OP_HEADER *opHeader = (EFI_IFR_OP_HEADER *)IfrPtr; + + switch(opHeader->OpCode) + { + case EFI_IFR_ONE_OF_OP: + ((EFI_IFR_ONE_OF *)opHeader)->Question.VarStoreInfo.VarOffset = Value; + break; + default: + break; + } +} + + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiCreateOneOfWithOptionsTemplate +// +// Description: +// +// Parameter: UINTN OptionCount, CONTROL_INFO *CtrlInfo +// +// Return value: VOID* +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID* UefiCreateOneOfWithOptionsTemplate(UINTN OptionCount, CONTROL_INFO *CtrlInfo) +{ + VOID *buffer = NULL; + UINTN size = 0; + UINTN length = 0; + UINTN offset; + + offset = (UINTN)CtrlInfo->ControlPtr - (UINTN)CtrlInfo->ControlConditionalPtr; + + size = offset + sizeof(EFI_IFR_ONE_OF) + sizeof(EFI_IFR_OP_HEADER) + + OptionCount * sizeof(EFI_IFR_ONE_OF_OPTION); + buffer = EfiLibAllocateZeroPool(size); + if(buffer == NULL) + { + goto DONE; + } + MemCopy(buffer, CtrlInfo->ControlConditionalPtr, offset); + + length = UefiGetIfrLength(CtrlInfo->ControlPtr); + CtrlInfo->ControlConditionalPtr = buffer; + MemCopy( (UINT8 *)buffer + offset, CtrlInfo->ControlPtr, length ); + CtrlInfo->ControlPtr = (UINT8 *)buffer + offset; + +DONE: + return (UINT8 *)buffer + offset; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiSetOneOfOption +// +// Description: +// +// Parameter: VOID *IfrPtr, UINT64 Value, UINT32 Size, UINT8 Flag, UINT16 Option +// +// Return value: VOID +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID UefiSetOneOfOption(VOID *IfrPtr, UINT64 Value, UINT32 Size, UINT8 Flag, UINT16 Option) +{ + EFI_IFR_ONE_OF_OPTION *option = (EFI_IFR_ONE_OF_OPTION *)IfrPtr; + UINT8 flag = 0; + + flag |= ((Flag & AMI_FLAG_DEFAULT) == AMI_FLAG_DEFAULT)? EFI_IFR_OPTION_DEFAULT : 0; + flag |= ((Flag & AMI_FLAG_MANUFACTURING) == AMI_FLAG_MANUFACTURING)? EFI_IFR_OPTION_DEFAULT_MFG : 0; + + switch(Size) + { + case sizeof(UINT8): + flag |= EFI_IFR_TYPE_NUM_SIZE_8; + option->Value.u8 = (UINT8)Value; + break; + case sizeof(UINT16): + flag |= EFI_IFR_TYPE_NUM_SIZE_16; + option->Value.u16 = (UINT16)Value; + break; + case sizeof(UINT32): + flag |= EFI_IFR_TYPE_NUM_SIZE_32; + option->Value.u32 = (UINT32)Value; + break; + case sizeof(UINT64): + flag |= EFI_IFR_TYPE_NUM_SIZE_64; + option->Value.u64 = (UINT64)Value; + break; + default: + break; + } + + option->Flags = flag; + option->Option = Option; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiAddEndOp +// +// Description: +// +// Parameter: VOID *IfrPtr +// +// Return value: VOID +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID UefiAddEndOp(VOID *IfrPtr) +{ + EFI_IFR_OP_HEADER *opHeader = (EFI_IFR_OP_HEADER *)IfrPtr; + + opHeader->OpCode = EFI_IFR_END_OP; + opHeader->Length = sizeof(EFI_IFR_OP_HEADER); +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiGetQuestionID +// +// Description: +// +// Parameter: CONTROL_INFO *Control +// +// Return value: UINT16 +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +UINT16 UefiGetQuestionID(CONTROL_INFO *Control) +{ + return 0; //(UINT16)GetControlConditionVarId(Control); +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiCreateDynamicControlCondition +// +// Description: +// +// Parameter: CONTROL_INFO *control,UINT16 VarId, UINT16 PrevControlQuestionID,UINT16 Value +// +// Return value: VOID +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID UefiCreateDynamicControlCondition(CONTROL_INFO *control,UINT16 VarId, UINT16 PrevControlQuestionID,UINT16 Value) +{ + //Add condition here for boot and bbs special controls +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiGetEqIDQuestionID +// +// Description: +// +// Parameter: VOID *IfrPtr +// +// Return value: UINT16 +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +UINT16 UefiGetEqIDQuestionID(VOID *IfrPtr) +{ + UINT16 questionID = 0; + + return questionID; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiSetEqIDQuestionID +// +// Description: +// +// Parameter: VOID *IfrPtr, UINT16 Value +// +// Return value: VOID +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID UefiSetEqIDQuestionID(VOID *IfrPtr, UINT16 Value) +{ +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiUpdateControlQuestionID +// +// Description: +// +// Parameter: VOID *IfrPtr, UINT16 Value +// +// Return value: VOID +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID UefiUpdateControlQuestionID(VOID *IfrPtr, UINT16 Value) +{ + EFI_IFR_OP_HEADER *opHeader = (EFI_IFR_OP_HEADER *)IfrPtr; + + switch(opHeader->OpCode) + { + case EFI_IFR_ONE_OF_OP: + ((EFI_IFR_ONE_OF *)opHeader)->Question.QuestionId = Value; + break; + default: + break; + } +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiSpecialGuidCallback +// +// Description: +// +// Parameter: VOID * HiiHandle, UINT16 Key, EFI_GUID *pGUID +// +// Return value: VOID +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID UefiSpecialGuidCallback(VOID * HiiHandle, UINT16 Key, EFI_GUID *pGUID) +{ + EFI_HANDLE DriverHandle; + EFI_GUID EfiHiiConfigAccessProtocolGuid = EFI_HII_CONFIG_ACCESS_PROTOCOL_GUID; + EFI_HII_CONFIG_ACCESS_PROTOCOL *ConfigAccess; + EFI_IFR_TYPE_VALUE Value; + EFI_BROWSER_ACTION_REQUEST ActionReq; + EFI_STATUS Status; + BOOLEAN PreservegEnableDrvNotification = FALSE; + + Status = gHiiDatabase->GetPackageListHandle(gHiiDatabase,HiiHandle,&DriverHandle); + if(!EFI_ERROR(Status)) + { + Status = gBS->HandleProtocol( DriverHandle, &EfiHiiConfigAccessProtocolGuid , &ConfigAccess ); + if(!EFI_ERROR(Status)) + { + EFI_BROWSER_ACTION action = EFI_BROWSER_ACTION_CHANGED; + + MemSet( &Value, sizeof(Value), 0 ); + Value.u64 = (UINTN)pGUID; + PreservegEnableDrvNotification = gEnableDrvNotification; + gEnableDrvNotification = TRUE; //EIP75588 Set to enable notification processing + Status = ConfigAccess->Callback(ConfigAccess, action,Key,((sizeof(VOID*)==sizeof(UINT32))?EFI_IFR_TYPE_NUM_SIZE_32:EFI_IFR_TYPE_NUM_SIZE_64),&Value,&ActionReq); + if (!PreservegEnableDrvNotification) // If gEnableDrvNotification is already True Don't touch it + gEnableDrvNotification = FALSE; //Reset to disable notification processing + // Clean up PAGE_INFO struct with Handle set to 0xFFFF + Status = FixSetupData(); + if(EFI_ERROR(Status)) + { + } + } + } + +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiSetWidth +// +// Description: +// +// Parameter: VOID *IfrPtr,UINT8 Width +// +// Return value: VOID +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID UefiSetWidth(VOID *IfrPtr,UINT8 Width) +{ + EFI_IFR_OP_HEADER *OpHeader = (EFI_IFR_OP_HEADER*)IfrPtr; + + switch(OpHeader->OpCode) + { + case EFI_IFR_NUMERIC_OP: + break; + case EFI_IFR_PASSWORD_OP: + break; + case EFI_IFR_STRING_OP: + break; + case EFI_IFR_ONE_OF_OP: + break; + case EFI_IFR_CHECKBOX_OP: + break; + default: + break; + } +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: BBSUpdateControlOffset +// +// Description: +// +// Parameter: CONTROL_INFO *control +// +// Return value: VOID +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID BBSUpdateControlOffset(CONTROL_INFO *control) +{ + UINT16 offset= ((EFI_IFR_ONE_OF*)control->ControlPtr)->Question.VarStoreInfo.VarOffset; + + offset = offset +sizeof(UINT32)+sizeof(UINT16); + offset = (UINT16)(offset + gCurrLegacyBootData->LegacyEntryOffset); + + UefiUpdateControlVarOffset(control->ControlPtr, offset); +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: GetControlDataLength +// +// Description: This function will return width of questions +// +// Parameter: CONTROL_INFO * +// +// Return value: UINTN +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +UINTN GetControlDataLength(CONTROL_INFO *controlInfo) +{ + UINTN width = 0; + + switch(controlInfo->ControlType) + { + case CONTROL_TYPE_CHECKBOX: + case CONTROL_TYPE_POPUPSEL: + case CONTROL_TYPE_NUMERIC: + case CONTROL_TYPE_PASSWORD: + case CONTROL_TYPE_POPUP_STRING: + width = UefiGetWidth(controlInfo->ControlPtr); + break; + case CONTROL_TYPE_ORDERED_LIST: + width = (((EFI_IFR_ORDERED_LIST*)(controlInfo->ControlPtr))->MaxContainers); + break; + case CONTROL_TYPE_TEXT: + width = sizeof(UINT16); + break; + case CONTROL_TYPE_DATE: + width = sizeof(EFI_HII_DATE); + break; + case CONTROL_TYPE_TIME: + width = sizeof(EFI_HII_TIME); + break; + default: + break; + } + return width; +} + + +//EIP 23354 : Start +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: IsPasswordEncodeEnabled +// +// Description: Function to return Password Encoding Status. +// +// Input: CONTROL_INFO +// +// Output: TRUE/FALSE +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +BOOLEAN IsPasswordEncodeEnabled (CONTROL_INFO *controlInfo) +{ +//EIP106950 : Starts + extern PASSWORD_ENOCDE_LIST_TEMPLATE gPasswordEncodeList []; + extern UINT32 gEncodeListCount; + UINT32 iIndex = 0; + EFI_GUID tFormsetGuid; + + //Get page info +// PAGE_INFO *pageInfo = (PAGE_INFO *)((UINTN)gApplicationData + gPages->PageList[controlInfo->ControlPageID]); + + //Get FormsetGuid + GetPageGuidFromPgIndex (controlInfo->ControlPageID, &tFormsetGuid); + + for (iIndex = 0; iIndex < gEncodeListCount; iIndex ++) + { + //If given QuestionId and FormsetGuid is same then return Encoding Flag + if ( (gPasswordEncodeList [iIndex].QuestionID == ((EFI_IFR_PASSWORD *)controlInfo->ControlPtr)->Question.QuestionId) && + (EfiCompareGuid(&gPasswordEncodeList [iIndex].FormsetGuid, &tFormsetGuid) ) + ) + { + return gPasswordEncodeList [iIndex].EncodingFlag; + } + } +//EIP106950 : Ends + + // IDE Password Encode the password + if ( + (VARIABLE_ID_IDE_SECURITY == controlInfo->ControlVariable) || + (VARIABLE_ID_AMITSESETUP == controlInfo->ControlVariable) + ) + { + return TRUE; + } + return FALSE; +} + +//EIP 23354 : End +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiGetTime +// +// Description: Function to get time +// +// Parameter: CONTROL_INFO *control, EFI_TIME *Tm +// +// Return value: STATUS +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS UefiGetTime(CONTROL_INFO *control, EFI_TIME *Tm) +{ + VOID *IfrPtr = NULL ; + UINT8 Flags ; + EFI_STATUS Status = EFI_UNSUPPORTED; + + + if((control != NULL) && (control->ControlPtr != NULL)) + { + IfrPtr = control->ControlPtr; + Flags = UefiGetFlagsField(IfrPtr) ; + + + if( ((Flags & QF_TIME_STORAGE) == QF_TIME_STORAGE_TIME)|| + ((Flags & EFI_QF_DATE_STORAGE) == QF_DATE_STORAGE_TIME) )// EIP 77875 : Incorrect logic used to check Time and Date control types + { + Status = gRT->GetTime( Tm, NULL ); + } + else if( ((Flags & QF_TIME_STORAGE) == QF_TIME_STORAGE_NORMAL) || + ((Flags & EFI_QF_DATE_STORAGE) == QF_DATE_STORAGE_NORMAL) )// EIP 77875 : Incorrect logic used to check Time and Date control types + { + + if(control->ControlType == CONTROL_TYPE_DATE) + { + EFI_HII_DATE *date = NULL ; + + date = EfiLibAllocateZeroPool( sizeof(EFI_HII_DATE) ); + + if ( date != NULL ) + { + Status = VarGetValue( control->ControlVariable, UefiGetQuestionOffset(IfrPtr), UefiGetWidth(IfrPtr), date ); + if ( ! EFI_ERROR( Status ) ) + { + Tm->Month = date->Month ; + Tm->Day = date->Day ; + Tm->Year = date->Year ; + } + + MemFreePointer( (VOID **)&date ); + } + }else{ + EFI_HII_TIME *time = NULL ; + + time = EfiLibAllocateZeroPool( sizeof(EFI_HII_TIME) ); + + if ( time != NULL ) + { + Status = VarGetValue( control->ControlVariable, UefiGetQuestionOffset(IfrPtr), UefiGetWidth(IfrPtr), time ); + Tm->Hour = time->Hour ; + Tm->Minute = time->Minute ; + Tm->Second = time->Second ; + + MemFreePointer( (VOID **)&time ); + } + } + } + else if( ((Flags & QF_TIME_STORAGE) == QF_TIME_STORAGE_WAKEUP) || + ((Flags & EFI_QF_DATE_STORAGE) == QF_DATE_STORAGE_WAKEUP) )// EIP 77875 : Incorrect logic used to check Time and Date control types + { + + BOOLEAN Enabled; + BOOLEAN Pending; + Status = gRT->GetWakeupTime( &Enabled, &Pending, Tm ); + } + } + else + Status = gRT->GetTime( Tm, NULL ); + + return Status ; + +} +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiSetTime +// +// Description: Function to set time +// +// Parameter: CONTROL_INFO *control, EFI_TIME *Tm +// +// Return value: STATUS +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS UefiSetTime(CONTROL_INFO *control, EFI_TIME *Tm) +{ + VOID *IfrPtr = NULL ; + UINT8 Flags = 0; + EFI_STATUS Status = EFI_UNSUPPORTED; + + + if((control != NULL) && (control->ControlPtr != NULL)) + { + IfrPtr = control->ControlPtr; + Flags = UefiGetFlagsField(IfrPtr) ; + + if( ((Flags & QF_TIME_STORAGE) == QF_TIME_STORAGE_TIME)|| + ((Flags & EFI_QF_DATE_STORAGE) == QF_DATE_STORAGE_TIME) )// EIP 77875 : Incorrect logic used to check Time and Date control types + { + Status = gRT->SetTime( Tm ); + } + else if( ((Flags & QF_TIME_STORAGE) == QF_TIME_STORAGE_NORMAL) || + ((Flags & EFI_QF_DATE_STORAGE) == QF_DATE_STORAGE_NORMAL) )// EIP 77875 : Incorrect logic used to check Time and Date control types + { + if(control->ControlType == CONTROL_TYPE_DATE) + { + EFI_HII_DATE *date = NULL ; + EFI_TIME Tc ; + + date = EfiLibAllocateZeroPool( sizeof(EFI_HII_DATE) ); + + if ( date != NULL ) + { +//EIP 47037 : Start + UefiGetTime(control, &Tc); + date->Month = (Tm->Month <= 12)?Tm->Month : ((Tc.Month>12)? 1:Tc.Month) ; + date->Day = (Tm->Day <= 31)?Tm->Day : ((Tc.Day>31)? 1:Tc.Day) ; + date->Year = Tm->Year ; +//EIP 47037 : End + Status = VarSetValue( control->ControlVariable, UefiGetQuestionOffset(IfrPtr), UefiGetWidth(IfrPtr), date ); + + MemFreePointer( (VOID **)&date ); + } + + }else{ + EFI_HII_TIME *time = NULL ; + EFI_TIME Tc ; + + time = EfiLibAllocateZeroPool( sizeof(EFI_HII_TIME) ); + + if ( time != NULL ) + { +//EIP 47037 : Start + UefiGetTime(control, &Tc); + time->Hour = (Tm->Hour <= 23)?Tm->Hour : ((Tc.Hour>23)? 0:Tc.Hour) ; + time->Minute = (Tm->Minute <= 59)? Tm->Minute : ((Tc.Minute>59)? 0:Tc.Minute) ; + time->Second = (Tm->Second <= 59)?Tm->Second : ((Tc.Second>59)? 0:Tc.Second); +//EIP 47037 : End + Status = VarSetValue( control->ControlVariable, UefiGetQuestionOffset(IfrPtr), UefiGetWidth(IfrPtr), time ); + MemFreePointer( (VOID **)&time ); + } + } + } + else if( ((Flags & QF_TIME_STORAGE) == QF_TIME_STORAGE_WAKEUP) || + ((Flags & EFI_QF_DATE_STORAGE) == QF_DATE_STORAGE_WAKEUP) )// EIP 77875 : Incorrect logic used to check Time and Date control types + { + BOOLEAN Enabled = TRUE ; + Status = gRT->SetWakeupTime( Enabled, Tm ); + } + } + else + Status = gRT->SetTime( Tm ); + + + return Status ; + +} +//EIP: 55762 Start +//<AMI_PHDR_START> +//--------------------------------------------------------------------------- +// Procedure: UpdateDestiantionQuestion +// +// Description: Finds the destination question ID for the current destination +// +// Input: UINT32 CurrPageID - Current page ID +// UINT32 DestQuestionId - Destination question ID to set focus +// UINT32 *FocusControlIndex - +// +// Output: EFI_STATUS status - EFI_SUCCESS is successful, else EFI_ERROR +//--------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS UpdateDestiantionQuestion(UINT32 CurrPageID, UINT32 DestQuestionId, UINT32 *FocusControlIndex) +{ + EFI_STATUS status = EFI_NOT_FOUND; + UINT32 j = 0; + + PAGE_INFO *PageInfo = (PAGE_INFO*)((UINTN)gApplicationData + gPages->PageList[CurrPageID]); + + for ( j = 0; j < PageInfo->PageControls.ControlCount; j++ ) + { + CONTROL_INFO *ctrlInfo = (CONTROL_INFO*)(((UINTN)gControlInfo) + PageInfo->PageControls.ControlList [j /*PageInfo->PageIdIndex */]); + if(!ctrlInfo){ + continue; + } + + + if(UefiGetKeyField(ctrlInfo->ControlPtr) == DestQuestionId){ + *FocusControlIndex = j; + status = EFI_SUCCESS; + goto DONE; + } + } + +DONE: + return status; +} +//EIP: 55762 End + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiRefershQuestionValueNvRAM +// +// Description: Function to Refresh the questions +// +// Parameter: CONTROL_INFO *ControlData +// +// Return value: EFI_STATUS +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS UefiRefershQuestionValueNvRAM(CONTROL_INFO *ControlData) +{ + + + UINT8 * CurBuf=NULL; + UINT8 * NvBuf = NULL; + UINTN VarSize=0; + EFI_STATUS Status=EFI_UNSUPPORTED; + UINT8 Flags = 0; + UINTN offset = UefiGetQuestionOffset(ControlData->ControlPtr); +//EIP-105552 Starts + UINT16 Size = 0;// = UefiGetWidth(ControlData->ControlPtr); + //If the control is Ordered list then we are calculating the actual size + if( CONTROL_TYPE_ORDERED_LIST != ControlData->ControlType) + { + Size = UefiGetWidth(ControlData->ControlPtr); + VarSize = GetControlDataLength(ControlData); + } + else + { + UINTN Type=0; + UINT16 OptionCount = 0; + UINT16 *OptionList=NULL; + UINT64 *ValueList=NULL; + + UefiGetOneOfOptions(ControlData,&ControlData->ControlHandle,&OptionList, &ValueList, &OptionCount,NULL,NULL); + if (OptionList) + MemFreePointer( (VOID **)&(OptionList)); + if (ValueList) + MemFreePointer( (VOID **)&(ValueList)); + + UefiGetValidOptionType( ControlData, &Type, (UINT32 *)&Size); + Size = OptionCount * Size; + VarSize = Size; + + } +//EIP-105552 Ends + NvBuf = VarGetNvramQuestionValue(ControlData->ControlVariable, offset, VarSize); //Read value for specific question + if(NvBuf == NULL){ // No Variable Assosiated then Just refrsh the page + return EFI_SUCCESS; + } + + if((UINTN)(Size) > VarSize){ + goto DONE; + } + + CurBuf = EfiLibAllocateZeroPool(Size); + + switch(ControlData->ControlType) + { + + case CONTROL_TYPE_NUMERIC: + case CONTROL_TYPE_ORDERED_LIST: + case CONTROL_TYPE_POPUPSEL: + case CONTROL_TYPE_POPUP_STRING: + case CONTROL_TYPE_CHECKBOX: + case CONTROL_TYPE_PASSWORD: + VarGetValue( ControlData->ControlVariable, + UefiGetQuestionOffset(ControlData->ControlPtr), Size, CurBuf ); + break; + case CONTROL_TYPE_DATE: + case CONTROL_TYPE_TIME: + Flags = UefiGetFlagsField(ControlData->ControlPtr) ; + if( ((Flags & QF_TIME_STORAGE) == QF_TIME_STORAGE_NORMAL) || + ((Flags & EFI_QF_DATE_STORAGE) == QF_DATE_STORAGE_NORMAL) ) + { + VarGetValue( ControlData->ControlVariable, + UefiGetQuestionOffset(ControlData->ControlPtr), Size, CurBuf ); + } + else + { + // RTC/Wakeup Date/Timecontrol + Status = EFI_SUCCESS; + goto DONE; + } + break; + default: + goto DONE; + } + if(MemCmp((UINT8 *)NvBuf, (UINT8 *)CurBuf, Size)) + { + _VarGetSetValue (VAR_COMMAND_SET_VALUE, gVariableList, ControlData->ControlVariable, UefiGetQuestionOffset (ControlData->ControlPtr), Size, NvBuf); + } + else + { + if(UefiIsInteractive(ControlData)) + Status = CallFormCallBack(ControlData,UefiGetControlKey(ControlData),0,EFI_BROWSER_ACTION_RETRIEVE); + } + + Status = EFI_SUCCESS; +DONE: + + MemFreePointer((VOID**)&CurBuf); + MemFreePointer((VOID**)&NvBuf); + return Status; +} +//EIP:56413: START +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiGetResetButtonDefaultid +// +// Description: Funtion get the ResetButton Default Id from the Opcode information +// +// Parameter: VOID *IfrPtr +// +// Return value: UINT16 +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +UINT16 UefiGetResetButtonDefaultid(VOID *IfrPtr) +{ + EFI_IFR_OP_HEADER *OpHeader=(EFI_IFR_OP_HEADER *)IfrPtr; + UINT16 DefaultId = 0xFFFF;//Initializing the default to handle error case + + if(OpHeader->OpCode == EFI_IFR_RESET_BUTTON_OP ) + { + DefaultId = ((EFI_IFR_RESET_BUTTON *)OpHeader)->DefaultId; + return DefaultId; + } +return DefaultId; +} +//EIP:56413: END + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: FindDriverHealthDriverName +// +// Description: Finds the driver name which supports driver health protocol +// +// Input: UINT16 = Entry for which driver name has to be return +// +// Output: CHAR16 * = Driver Name +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +CHAR16 *FindDriverHealthDriverName (UINT16 DriverEntry) +{ + EFI_STATUS Status, StatusforGetHealth = EFI_UNSUPPORTED; +// EFI_GUID DriverHealthProtocolGuid = EFI_DRIVER_HEALTH_PROTOCOL_GUID; + EFI_HANDLE *DriverHealthHandles; + UINTN NumHandles = 0, iIndex = 0; + UINTN Count = 0; + CHAR16 *DriverName = NULL, *DrvNameWithStatus; + EFI_GUID EfiComponentName2ProtocolGuid = EFI_COMPONENT_NAME2_PROTOCOL_GUID; + EFI_COMPONENT_NAME2_PROTOCOL *ComponentName2 = NULL; + EFI_DRIVER_HEALTH_PROTOCOL *DrvHealthInstance = NULL; + EFI_DEVICE_PATH_PROTOCOL *DevicePath; + EFI_DRIVER_HEALTH_STATUS HealthStatus = EfiDriverHealthStatusHealthy; + EFI_GUID EfiDriverHealthProtocolGuid = EFI_DRIVER_HEALTH_PROTOCOL_GUID; + + CHAR8 *LangStrings = (CHAR8 *)NULL; + CHAR8 *tempLangStrings = (CHAR8 *)NULL; + CHAR8 Lang[200]; + + + Status = gBS->LocateHandleBuffer ( + ByProtocol, + &EfiDriverHealthProtocolGuid, + NULL, + &NumHandles, + &DriverHealthHandles + ); + if ((Status != EFI_SUCCESS) || (NumHandles == 0)) + { + return NULL; + } + for (iIndex = 0; iIndex < NumHandles; iIndex ++) + { + Status = gBS->HandleProtocol (DriverHealthHandles [iIndex], &EfiDriverHealthProtocolGuid, &DrvHealthInstance); + if (EFI_ERROR (Status)) + { + continue; + } + if (Count != DriverEntry) + { + Count ++; + continue; + } + StatusforGetHealth = DrvHealthInstance->GetHealthStatus (DrvHealthInstance, NULL, NULL, &HealthStatus, NULL, NULL); + Status = gBS->HandleProtocol (DriverHealthHandles [iIndex], &EfiComponentName2ProtocolGuid, &ComponentName2); + if (EFI_ERROR (Status)) + { + break; + } + //EIP 134138 + LangStrings = StrDup8( ComponentName2->SupportedLanguages ); + tempLangStrings = LangStrings; //Ptr will be incremented in _GetNextLanguage so taking backup for freeing + _GetNextLanguage (&LangStrings, Lang); + + Status = ComponentName2->GetDriverName ( + ComponentName2, + Lang, + //ComponentName2->SupportedLanguages, + &DriverName + ); + + MemFreePointer( (VOID **)&tempLangStrings ); + + if ((EFI_ERROR (Status)) || (NULL == DriverName)) + { + break; + } + if (!EFI_ERROR (StatusforGetHealth)) + { + DrvNameWithStatus = EfiLibAllocateZeroPool ((EfiStrLen (DriverName) + EfiStrLen (DriverHealthStatus [HealthStatus]) + 7) * sizeof (CHAR16)); //7 for spaces and NULL character + if (NULL != DrvNameWithStatus) + { + SPrint ( + DrvNameWithStatus, + ((EfiStrLen (DriverName) + EfiStrLen (DriverHealthStatus [HealthStatus]) + 7) * sizeof (CHAR16)), + L"%s %s", + DriverName, + DriverHealthStatus [HealthStatus] + ); + MemFreePointer ((VOID **)&DriverHealthHandles); + return DrvNameWithStatus; + } + } + goto DONE; + } + if (iIndex == NumHandles) + { + goto DONE; + } + if (!DriverName) + { + Status = gBS->HandleProtocol (DriverHealthHandles [iIndex], &gEfiDevicePathProtocolGuid, (VOID **) &DevicePath); + if (!EFI_ERROR (Status)) + { + DriverName = _DevicePathToStr (DevicePath); + if (!EFI_ERROR (StatusforGetHealth)) + { + DrvNameWithStatus = EfiLibAllocateZeroPool ((EfiStrLen (DriverName) + EfiStrLen (DriverHealthStatus [HealthStatus]) + 7) * sizeof (CHAR16)); //7 for spaces and NULL character + if (NULL != DrvNameWithStatus) + { + SPrint ( + DrvNameWithStatus, + ((EfiStrLen (DriverName) + EfiStrLen (DriverHealthStatus [HealthStatus]) + 7) * sizeof (CHAR16)), + L"%s %s", + DriverName, + DriverHealthStatus [HealthStatus] + ); + MemFreePointer ((VOID **)&DriverHealthHandles); + return DrvNameWithStatus; + } + } + } + else + { + DriverName = EfiLibAllocateZeroPool (30 * sizeof (CHAR16)); //This case will be helpfull when driver name or device path not present + SPrint ( + DriverName, + (30 * sizeof (CHAR16)), + L"Driver At Handle %x", + DriverHealthHandles [iIndex] + ); + } + } +DONE: + MemFreePointer ((VOID **)&DriverHealthHandles); + return DriverName; +} + +//<AMI_PHDR_START> +//----------------------------------------------------------------------------------------------------- +// Procedure: CtrlsSupportsHealthProtocol +// +// Description: Finds the number of controllers supports driver health protocol for the driver entry +// +// Input: UINT16 = Entry for driver to which total controllers has to be find +// +// Output: UINT16 = Total number of controllers supports driver health +// +//----------------------------------------------------------------------------------------------------- +//<AMI_PHDR_END> +UINT16 CtrlsSupportsHealthProtocol (UINT16 EntryItem) +{ + EFI_STATUS Status; + EFI_HANDLE *Handles; + UINTN NumHandles = 0; + UINT16 ControllerCnt = 0, Count = 0; + EFI_HANDLE *DriverHealthHandles; + UINTN DriverHealthIndex; + UINTN ControllerIndex = 0; + UINTN HandleCount = 0; + UINTN ChildIndex = 0; + EFI_DRIVER_HEALTH_PROTOCOL *DriverHealth; + EFI_DRIVER_HEALTH_STATUS HealthStatus; + EFI_GUID EfiDriverHealthProtocolGuid = EFI_DRIVER_HEALTH_PROTOCOL_GUID; + + Status = gBS->LocateHandleBuffer ( + ByProtocol, + &EfiDriverHealthProtocolGuid, + NULL, + &NumHandles, + &DriverHealthHandles + ); + if ((EFI_ERROR (Status)) || (NumHandles == 0)) + { + return ControllerCnt; + } + for (DriverHealthIndex = 0; DriverHealthIndex < NumHandles; DriverHealthIndex++) + { + if (DriverHealthHandles [DriverHealthIndex] == NULL) + { + continue; + } + Status = gBS->HandleProtocol ( + DriverHealthHandles [DriverHealthIndex], + &EfiDriverHealthProtocolGuid, + (VOID **)&DriverHealth + ); + if (EFI_ERROR (Status)) + { + continue; + } + if (EntryItem > Count) + { + Count ++; + continue; + } + gDrvHandle = DriverHealthHandles [DriverHealthIndex]; + gDrvHealthInstance = DriverHealth; + Status = gBS->LocateHandleBuffer ( + AllHandles, + NULL, + NULL, + &HandleCount, + &Handles + ); + if (EFI_ERROR (Status)) + { + MemFreePointer ((VOID **)&DriverHealthHandles); + return ControllerCnt; + } + for (ControllerIndex = 0; ControllerIndex < HandleCount; ControllerIndex ++) + { + if (NULL == Handles [ControllerIndex]) + { + continue; + } + Status = DriverHealth->GetHealthStatus (DriverHealth, Handles [ControllerIndex], NULL, &HealthStatus, NULL, NULL); + if (EFI_ERROR (Status)) + { + continue; + } + AddHandleIntoList (Handles [ControllerIndex], NULL, HealthStatus); + ControllerCnt ++; + for (ChildIndex = 0; ChildIndex < HandleCount; ChildIndex++) + { + if (Handles [ChildIndex] == NULL) + { + continue; + } + Status = DriverHealth->GetHealthStatus (DriverHealth, Handles [ControllerIndex], Handles [ChildIndex], &HealthStatus, NULL, NULL); + if (EFI_ERROR (Status)) + { + continue; + } + AddHandleIntoList (Handles [ControllerIndex], Handles [ChildIndex], HealthStatus); + ControllerCnt ++; + } + } + break; + } + MemFreePointer ((VOID **)&DriverHealthHandles); + return ControllerCnt; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------------- +// Procedure: GetCtrlNameAndHealth +// +// Description: Finds the controller name with its health +// +// Input: UINT16 = Entry for controller to which name has to be find +// +// Output: CHAR16 * = Controller name with its health status +// +//----------------------------------------------------------------------------------- +//<AMI_PHDR_END> +CHAR16 *GetCtrlNameAndHealth (UINT16 ControllerEntry) +{ + UINT16 Count = 0; + CHAR16 *ContrNameAndHlth = NULL; + DRV_HEALTH_HNDLS *DrvHlthHandles = NULL; + + + DrvHlthHandles = gDrvHealthHandlesHead; + while (Count != ControllerEntry) + { + DrvHlthHandles = DrvHlthHandles->Next; + Count ++; + } + ContrNameAndHlth = GetDrvHlthCtrlName (DrvHlthHandles); + return ContrNameAndHlth; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------------- +// Procedure: GetDrvHlthCtrlName +// +// Description: Finds the controller name +// +// Input: DRV_HEALTH_HNDLS * = Details for finding the controller name +// +// Output: CHAR16 * = Controller name for the controller and child handle +// +//----------------------------------------------------------------------------------- +//<AMI_PHDR_END> +CHAR16 *GetDrvHlthCtrlName (DRV_HEALTH_HNDLS *DrvHlthHandles)// EFI_HANDLE DriverHealth, EFI_HANDLE ControllerHandle, EFI_HANDLE ChildHandle) +{ + EFI_STATUS Status = EFI_SUCCESS; + CHAR16 *CtrlName = NULL; + CHAR16 *ContrNameAndHlth = NULL; + EFI_GUID EfiComponentName2ProtocolGuid = EFI_COMPONENT_NAME2_PROTOCOL_GUID; + EFI_COMPONENT_NAME2_PROTOCOL *ComponentName2 = NULL; + EFI_DRIVER_HEALTH_STATUS HealthStatus = EfiDriverHealthStatusHealthy; //EIP 134138 + + Status = gDrvHealthInstance->GetHealthStatus ( //If controllers reconnected status might change so getting the status again + gDrvHealthInstance, + DrvHlthHandles->ControllerHandle, + DrvHlthHandles->ChildHandle, + &HealthStatus, + NULL, + NULL + ); + if (EFI_ERROR (Status)) + { + return NULL; + } + DrvHlthHandles->HealthStatus = HealthStatus; + Status = gBS->HandleProtocol ( + gDrvHandle, + &EfiComponentName2ProtocolGuid, + (VOID **)&ComponentName2 + ); + if (!EFI_ERROR (Status)) + { + Status = ComponentName2->GetControllerName (ComponentName2, DrvHlthHandles->ControllerHandle, DrvHlthHandles->ChildHandle, ComponentName2->SupportedLanguages, &CtrlName); + if (EFI_ERROR (Status)) + { + CtrlName = NULL; + } + } + if (NULL == CtrlName) + { + CtrlName = EfiLibAllocateZeroPool (50 * sizeof (CHAR16)); //16+16+"DriverName" + if (NULL == CtrlName) + { + return NULL; + } + SPrint (CtrlName, 50 * sizeof (CHAR16), L"Controller %x Child %x", DrvHlthHandles->ControllerHandle, DrvHlthHandles->ChildHandle); + } + ContrNameAndHlth = EfiLibAllocateZeroPool ((EfiStrLen (CtrlName) + EfiStrLen (DriverHealthStatus [HealthStatus]) + 7) * sizeof (CHAR16)); //7 for spaces and NULL char. + if (NULL == ContrNameAndHlth) + { + return NULL; + } + SPrint ( + ContrNameAndHlth, + ((EfiStrLen (CtrlName) + EfiStrLen (DriverHealthStatus [HealthStatus]) + 7) * sizeof (CHAR16)), + L"%s %s", + CtrlName, + DriverHealthStatus [HealthStatus] + ); + return ContrNameAndHlth; +} + +//<AMI_PHDR_START> +//----------------------------------------------------------------------------------------------------- +// Procedure: AddHandleIntoList +// +// Description: Adds the driver health details to the linked list +// +// Input: EFI_HANDLE = Controller handle +// EFI_HANDLE = Child handle +// EFI_DRIVER_HEALTH_STATUS = Health status corresponding to controller and child handle +// +// Output: VOID +// +//------------------------------------------------------------------------------------------------------ +//<AMI_PHDR_END> +VOID AddHandleIntoList (EFI_HANDLE ControllerHandle, EFI_HANDLE ChildHandle, EFI_DRIVER_HEALTH_STATUS HealthStatus) +{ + DRV_HEALTH_HNDLS *DrvHealthHandles; + DRV_HEALTH_HNDLS *tempHealthHandle; + + DrvHealthHandles = EfiLibAllocateZeroPool (sizeof (DRV_HEALTH_HNDLS)); + if (NULL == DrvHealthHandles) + { + return; + } + DrvHealthHandles->ControllerHandle = ControllerHandle; + DrvHealthHandles->ChildHandle = ChildHandle; + DrvHealthHandles->HealthStatus = HealthStatus; + DrvHealthHandles->Next = NULL; + if (NULL == gDrvHealthHandlesHead) + { + gDrvHealthHandlesHead = DrvHealthHandles; + return; + } + tempHealthHandle = gDrvHealthHandlesHead; + while (tempHealthHandle->Next) + { + tempHealthHandle = tempHealthHandle->Next; + } + tempHealthHandle->Next = DrvHealthHandles; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------------- +// Procedure: FreeControllersList +// +// Description: Frees the driver health details linked list +// +// Input: VOID +// +// Output: VOID +// +//----------------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID FreeControllersList (VOID) +{ + DRV_HEALTH_HNDLS *DrvHealthHandles, *tempDrvHealthHandles; + + if (!gDrvHealthHandlesHead) + { + return; + } + DrvHealthHandles = gDrvHealthHandlesHead; + while (DrvHealthHandles) + { + tempDrvHealthHandles = DrvHealthHandles; + DrvHealthHandles = DrvHealthHandles->Next; + MemFreePointer ((VOID **)&tempDrvHealthHandles); + } +} + +//<AMI_PHDR_START> +//------------------------------------------------------------------------------------------- +// Procedure: SetDrvHealthHandleAndCtrlCount +// +// Description: Finds and sets the number of controllers supports the driver health handle +// +// Input: UINT16 = Driver health handle entry +// +// Output: VOID +// +//-------------------------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID SetDrvHealthHandleAndCtrlCount (UINT16 ItemEntry) +{ + UINTN TotControllers = 0; + EFI_GUID DrvHealthCtrlGuid = AMITSE_DRIVER_HEALTH_CTRL_GUID; + + FreeControllersList (); + gDrvHealthHandlesHead = NULL; + + TotControllers = CtrlsSupportsHealthProtocol (ItemEntry); + VarSetNvramName (L"DrvHealthCtrlCnt", &DrvHealthCtrlGuid, EFI_VARIABLE_BOOTSERVICE_ACCESS, &TotControllers, sizeof (UINTN)); +} + +//EIP57661 Starts +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: SetDriverHealthCount +// +// Description: Sets the DriverHealthCount and DriverHlthEnable variables +// +// Input: VOID +// +// Output: VOID +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID SetDriverHealthCount (VOID) +{ + EFI_STATUS Status; + EFI_GUID DriverHealthProtocolGuid = EFI_DRIVER_HEALTH_PROTOCOL_GUID; + EFI_HANDLE *DriverHealthHandles = NULL; + UINTN NumHandles = 0, iIndex = 0, HealthCount = 0; + EFI_GUID DrvHealthGuid = AMITSE_DRIVER_HEALTH_GUID; + EFI_GUID DrvHlthEnableGuid = AMITSE_DRIVER_HEALTH_ENB_GUID; + EFI_DRIVER_HEALTH_PROTOCOL *DrvHealthInstance = NULL; + + SETUP_DEBUG_UEFI ( "\n[TSE] Entering SetDriverHealthCount()\n" ); + + Status = gBS->LocateHandleBuffer ( + ByProtocol, + &DriverHealthProtocolGuid, + NULL, + &NumHandles, + &DriverHealthHandles + ); + if (EFI_SUCCESS != Status) + { + NumHandles = 0; + } + for (iIndex = 0; iIndex < NumHandles; iIndex ++) + { + Status = gBS->HandleProtocol (DriverHealthHandles [iIndex], &DriverHealthProtocolGuid, &DrvHealthInstance); + if (EFI_ERROR (Status)) + { + continue; + } + HealthCount ++; + } + if (NumHandles) + { + MemFreePointer ((VOID **)&DriverHealthHandles); + } + VarSetNvramName (L"DriverHealthCount", &DrvHealthGuid, EFI_VARIABLE_BOOTSERVICE_ACCESS, &HealthCount, sizeof (UINTN)); + VarUpdateVariable (VARIABLE_ID_DRV_HLTH_COUNT); //Update NVRAM cache for DriverHealthCount + HealthCount = HealthCount ? 1 : 0; //To enable driver health root menu + VarSetNvramName (L"DriverHlthEnable", &DrvHlthEnableGuid, EFI_VARIABLE_BOOTSERVICE_ACCESS, &HealthCount, sizeof (UINTN)); + VarUpdateVariable (VARIABLE_ID_DRV_HLTH_ENB); //Update NVRAM cache for DriverHlthEnable + SETUP_DEBUG_UEFI ( "\n[TSE] Exiting SetDriverHealthCount()\n" ); +} + +//<AMI_PHDR_START> +//------------------------------------------------------------------------------------------- +// Procedure: DisplayMsgListMessageBox +// +// Description: Displays the messages from EFI_DRIVER_HEALTH_HII_MESSAGE +// +// Input: EFI_DRIVER_HEALTH_HII_MESSAGE * = Message to show +// +// Output: VOID +// +//-------------------------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID DisplayMsgListMessageBox (EFI_DRIVER_HEALTH_HII_MESSAGE *MessageList) +{ + CHAR16 *DisplayString = NULL; + CHAR16 *String = NULL; + UINT8 Count = 0; + UINT8 MsgBoxSel = 0; + EFI_STATUS Status = EFI_SUCCESS; + + while (MessageList [Count].HiiHandle) + { + String = HiiGetString (MessageList [Count].HiiHandle, MessageList [Count].StringId); + Count ++; + if (Count > 15) //Checking for safe termination, otherwise msgbox fill the full screen + { + break; + } + if (String) + { + if (!DisplayString) + { + DisplayString = EfiLibAllocateZeroPool ((EfiStrLen (String) + 2) * sizeof (CHAR16)); //2 for /n and NULL character + } + else + { + DisplayString = MemReallocateZeroPool ( + DisplayString, + ( (EfiStrLen (DisplayString) + 1) * sizeof (CHAR16) ), + ( ((EfiStrLen (String) + 2) * sizeof (CHAR16)) + ((EfiStrLen (DisplayString) + 1) * sizeof (CHAR16)) ) //2 for /n and NULL character + ); + } + if (NULL == DisplayString) + { + MemFreePointer ((VOID **)&String); + continue; + } + if (DisplayString [0]) + { + EfiStrCat (DisplayString, String); + EfiStrCat (DisplayString, L"\n"); + } + else + { + EfiStrCpy (DisplayString, String); + EfiStrCat (DisplayString, L"\n"); + } + } + } + if (DisplayString) + { + CHAR16 *text = NULL; + text = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DRV_HLTH_TITLE)); + Status = mPostMgr->DisplayMsgBox ( + text, + DisplayString, + MSGBOX_TYPE_OK, + &MsgBoxSel + ); + if(EFI_ERROR (Status)) + return; + + MemFreePointer ((VOID **)&DisplayString); + if (text) + { + MemFreePointer ((VOID **)&text); + } + } +} + +//<AMI_PHDR_START> +//------------------------------------------------------------------------------------------- +// Procedure: DoDriverHealthOperation +// +// Description: Performs the driver health operations for the corresponding controller entry +// +// Input: VOID * = Control Info for the correponding controller entry +// UINT16 = Controller entry in the page +// +// Output: VOID +// +//-------------------------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID DoDriverHealthOperation (VOID *Tempcontrol, UINT16 ControllerEntry) +{ + UINT16 Count = 0; + EFI_STATUS Status = EFI_SUCCESS; + DRV_HEALTH_HNDLS *DrvHlthHandles = NULL; + EFI_DRIVER_HEALTH_STATUS LocalHealthStatus = EfiDriverHealthStatusHealthy; + EFI_DRIVER_HEALTH_HII_MESSAGE *MessageList = NULL; + EFI_HII_HANDLE FormHiiHandle; + UINT8 MsgBoxSel = 0; + CONTROL_INFO *control = (CONTROL_INFO *)Tempcontrol; + + if(!mPostMgr) + { + //Loacate Post Manager Protocol + Status = gBS->LocateProtocol(&gAmiPostManagerProtocolGuid, NULL,(void**) &mPostMgr); + if(Status != EFI_SUCCESS) + return; + } + + DrvHlthHandles = gDrvHealthHandlesHead; + while (Count != ControllerEntry) + { + DrvHlthHandles = DrvHlthHandles->Next; + Count ++; + } + if (EfiDriverHealthStatusHealthy == DrvHlthHandles->HealthStatus) + { + Status = gDrvHealthInstance->GetHealthStatus ( + gDrvHealthInstance, + DrvHlthHandles->ControllerHandle, + DrvHlthHandles->ChildHandle, + &LocalHealthStatus, + &MessageList, + &FormHiiHandle + ); + if (NULL != MessageList) + { + DisplayMsgListMessageBox (MessageList); + } + } + if (EfiDriverHealthStatusRepairRequired == DrvHlthHandles->HealthStatus) + { + Status = gDrvHealthInstance->Repair ( + gDrvHealthInstance, + DrvHlthHandles->ControllerHandle, + DrvHlthHandles->ChildHandle, + NULL + ); + if (!EFI_ERROR (Status)) + { + Status = gDrvHealthInstance->GetHealthStatus ( + gDrvHealthInstance, + DrvHlthHandles->ControllerHandle, + DrvHlthHandles->ChildHandle, + &LocalHealthStatus, + &MessageList, + &FormHiiHandle + ); + if (NULL != MessageList) + { + DisplayMsgListMessageBox (MessageList); + } + } + } + if ((EfiDriverHealthStatusConfigurationRequired == DrvHlthHandles->HealthStatus) || + (EfiDriverHealthStatusConfigurationRequired == LocalHealthStatus)) + { + UINT32 i=0; + PAGE_INFO *pageInfo; + if (EfiDriverHealthStatusConfigurationRequired != LocalHealthStatus) + { + Status = gDrvHealthInstance->GetHealthStatus ( + gDrvHealthInstance, + DrvHlthHandles->ControllerHandle, + DrvHlthHandles->ChildHandle, + &LocalHealthStatus, + &MessageList, + &FormHiiHandle + ); + } + if (!EFI_ERROR (Status) && (FormHiiHandle)) + { + if (NULL != MessageList) + { + DisplayMsgListMessageBox (MessageList); + } + for (i = 0; i < gPages->PageCount; i++) + { + pageInfo = (PAGE_INFO *)((UINTN)gApplicationData + gPages->PageList[i]); + if (pageInfo->PageHandle == FormHiiHandle) + { + PAGE_DATA **page; //To display the configuration page in advanced menu itself + + control->ControlDestPageID = i; + pageInfo->PageFlags.PageVisible = FALSE; + pageInfo->PageParentID = control->ControlPageID; + + //For ESA gApp will be NULL but for TSE gApp will be not-NULL + if(gApp) + { + page = &gApp->PageList [pageInfo->PageID]; + gPage.Destroy (*page, FALSE); + gPage.Initialize (*page, pageInfo); + gApp->CurrentPage = i; + } + break; + } + } + } + } + if (EfiDriverHealthStatusFailed == DrvHlthHandles->HealthStatus) + { + Status = gDrvHealthInstance->GetHealthStatus ( + gDrvHealthInstance, + DrvHlthHandles->ControllerHandle, + DrvHlthHandles->ChildHandle, + &LocalHealthStatus, + &MessageList, + &FormHiiHandle + ); + if ((!EFI_ERROR (Status)) && (NULL != MessageList)) + { + DisplayMsgListMessageBox (MessageList); + } + } + if (EfiDriverHealthStatusReconnectRequired == DrvHlthHandles->HealthStatus) + { + CHAR16 *Title = NULL; + CHAR16 *Message = NULL; + + Title = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DRV_HLTH_TITLE)); + Message = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DRV_HLTH_RECON)); + Status = mPostMgr->DisplayMsgBox ( + Title, + Message, + MSGBOX_TYPE_OKCANCEL, + &MsgBoxSel + ); + if(EFI_ERROR (Status)) + return; + + if (0 == MsgBoxSel) //User pressed OK + { + gBS->DisconnectController (DrvHlthHandles->ControllerHandle, NULL, NULL); + gBS->ConnectController (DrvHlthHandles->ControllerHandle, NULL, NULL, TRUE); + } + } + if (EfiDriverHealthStatusRebootRequired == DrvHlthHandles->HealthStatus) + { + CHAR16 *Title = NULL; + CHAR16 *Message = NULL; + + Title = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DRV_HLTH_TITLE)); + Message = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DRV_HLTH_REBOOT)); + Status = mPostMgr->DisplayMsgBox ( + Title, + Message, + MSGBOX_TYPE_OKCANCEL, + &MsgBoxSel + ); + if(EFI_ERROR (Status)) + return; + + if (0 == MsgBoxSel) //User pressed OK + { + DrvHlthHandles = gDrvHealthHandlesHead; + while (DrvHlthHandles) + { + //Proceed with repair for all the controllers in repair state + if (EfiDriverHealthStatusRepairRequired == DrvHlthHandles->HealthStatus) + { + Status = gDrvHealthInstance->Repair ( + gDrvHealthInstance, + DrvHlthHandles->ControllerHandle, + DrvHlthHandles->ChildHandle, + NULL + ); + } + DrvHlthHandles = DrvHlthHandles->Next; + } + FreeControllersList (); + gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL); + } + } +} + +//<AMI_PHDR_START> +//--------------------------------------------------------------------------- +// Procedure: CheckTimeFlags +// +// Description: Function to check the time flags. +// +// Input: UINT16 ItemCount +// +// Output: VOID +//--------------------------------------------------------------------------- +//<AMI_PHDR_END> +BOOLEAN CheckTimeFlags(UINT8 Flags) +{ + return ((Flags & QF_TIME_STORAGE) == QF_TIME_STORAGE_NORMAL) ; +} + +//<AMI_PHDR_START> +//--------------------------------------------------------------------------- +// Procedure: CheckDateFlags +// +// Description: Function to check the date flags. +// +// Input: UINT16 ItemCount +// +// Output: VOID +//--------------------------------------------------------------------------- +//<AMI_PHDR_END> +BOOLEAN CheckDateFlags(UINT8 Flags) +{ + return ((Flags & EFI_QF_DATE_STORAGE) == QF_DATE_STORAGE_NORMAL); +} + +//EIP75481 Support TSE debug print infrastructure +//<AMI_PHDR_START> +//--------------------------------------------------------------------------- +// Procedure: CreateFile +// +// Description: Creates a file to output hpk data +// +// Input: CHAR16 *filenameFormat, +// EFI_HII_HANDLE *Handle, +// UINTN Index +// +// +// Output: EFI_FILE_PROTOCOL* +//--------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_FILE_PROTOCOL * CreateFile(CHAR16 *filename, UINT32 index) +{ + EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *pSFP; + EFI_STATUS Status = EFI_SUCCESS; + EFI_FILE_PROTOCOL *pRoot,*FileHandle; + EFI_HANDLE *gSmplFileSysHndlBuf = NULL; + UINTN Count = 0; + UINT16 i = 0; + + // Locate all the simple file system devices in the system + Status = pBS->LocateHandleBuffer(ByProtocol, &guidSimpleFileSystemProtocol, NULL, &Count, &gSmplFileSysHndlBuf); + + if(!EFI_ERROR(Status)) + { + Status = gBS->HandleProtocol( gSmplFileSysHndlBuf[index], &guidSimpleFileSystemProtocol, &pSFP ); + + if (!EFI_ERROR(Status)) + { + Status = pSFP->OpenVolume(pSFP,&pRoot); + + if (!EFI_ERROR(Status)) + { + Status = pRoot->Open(pRoot, + &FileHandle, + filename, + EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE, + 0); + + pRoot->Close(pRoot); + + if (!EFI_ERROR(Status)) + { + return FileHandle; + } + } + } + } + + if(gSmplFileSysHndlBuf != NULL) + pBS->FreePool(gSmplFileSysHndlBuf); + + return NULL; +} + +//<AMI_PHDR_START> +//--------------------------------------------------------------------------- +// Procedure: WriteDataToFile +// +// Description: Writes data to file +// +// Input: CHAR16 *filename, VOID *Data, UINTN length +// +// +// Output: VOID +//--------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS WriteDataToFile(CHAR16 *filename, VOID *Data, UINTN length, UINT32 index) +{ + EFI_STATUS Status = EFI_UNSUPPORTED; + EFI_FILE_PROTOCOL *FileHandle=NULL; + + UINTN len = length; + + SETUP_DEBUG_UEFI_NOTIFICATION( "\n\n[TSE] Entering WriteDataToFile \n\n"); + + if (Data == NULL) + { + goto DONE; + } + + FileHandle = CreateFile(filename, index); + + if (FileHandle != NULL) + { + FileHandle->SetPosition(FileHandle,0); + FileHandle->Write(FileHandle,&len, Data); + FileHandle->Close(FileHandle); + Status = EFI_SUCCESS ; + + SETUP_DEBUG_UEFI_NOTIFICATION( "\n\n[TSE] Exporting Filename: %s \n\n", filename); + } +DONE: + + SETUP_DEBUG_UEFI_NOTIFICATION( "\n\n[TSE] Exiting WriteDataToFile, Status: %x \n\n", Status); + + return Status ; +} + +#if TSE_DEBUG_MESSAGES +//<AMI_PHDR_START> +//--------------------------------------------------------------------------- +// Procedure: HiiGetPackList +// +// Description: Get HII form package by handle and form ID +// +// Input: EFI_HII_HANDLE Handle +// UINT16 form +// UINTN *Length +// +// Output: VOID *formPkBuffer - +//--------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID *HiiGetPackList( EFI_HII_HANDLE Handle, UINT16 form, UINTN *Length ) +{ + EFI_STATUS status = EFI_SUCCESS; + VOID *hiiFormPackage=NULL; + UINTN len=10; + + if(Length == NULL) + Length = &len; + + hiiFormPackage = EfiLibAllocateZeroPool(*Length); + + status = gHiiDatabase->ExportPackageLists(gHiiDatabase, Handle, Length, hiiFormPackage); + if(status == EFI_BUFFER_TOO_SMALL) + { + MemFreePointer(&hiiFormPackage); + // + // Allocate space for retrieval of IFR data + // + hiiFormPackage = EfiLibAllocateZeroPool(*Length); + + if (hiiFormPackage == NULL) + { + hiiFormPackage = NULL; + goto DONE; + } + // + // Get all the packages associated with this HiiHandle + // + status = gHiiDatabase->ExportPackageLists (gHiiDatabase, Handle, Length, hiiFormPackage); + if(EFI_ERROR(status)) + { + MemFreePointer(&hiiFormPackage); + hiiFormPackage = NULL; + } + } + else if(EFI_ERROR(status)) + { + hiiFormPackage = NULL; + } + +DONE: + return hiiFormPackage; +} + +//<AMI_PHDR_START> +//--------------------------------------------------------------------------- +// Procedure: ProcessPackToFile +// +// Description: Prints the HPK data to file +// +// Input: EFI_HII_DATABASE_NOTIFY_TYPE NotifyType, EFI_HANDLE Handle +// +// +// Output: VOID +//--------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID ProcessPackToFile(EFI_HII_DATABASE_NOTIFY_TYPE NotifyType, EFI_HANDLE Handle) +{ + EFI_STATUS Status = EFI_UNSUPPORTED; + CHAR16 *filenameFormat = NULL; + CHAR16 filename[50]; + VOID *formSetData = NULL; + UINTN length = 0; + + SETUP_DEBUG_UEFI_NOTIFICATION( "\n\n[TSE] Entering ProcessPackToFile \n\n"); + + + if(NotifyType == EFI_HII_DATABASE_NOTIFY_REMOVE_PACK) + filenameFormat = L"REMOVED_0x%x_%03d.hpk" ; + + else if(NotifyType == EFI_HII_DATABASE_NOTIFY_NEW_PACK) + filenameFormat = L"NEW_0x%x_%03d.hpk" ; + + else if(NotifyType == EFI_HII_DATABASE_NOTIFY_ADD_PACK) + filenameFormat = L"UPDATE_0x%x_%03d.hpk" ; + + else + goto DONE ; + + + formSetData = (UINT8*)HiiGetPackList(Handle, 0, &length); + + if (formSetData == NULL) + { + goto DONE; + } + + SPrint(filename, 50, filenameFormat, Handle, HpkFileCount); + + Status = WriteDataToFile(filename, formSetData, length, 0) ; + + if (!EFI_ERROR (Status)) + { + HpkFileCount++ ; + } + +DONE: + + SETUP_DEBUG_UEFI_NOTIFICATION( "\n\n[TSE] Exiting ProcessPackToFile, Status: %x \n\n", Status); +} +//<AMI_PHDR_START> +//--------------------------------------------------------------------------- +// Procedure: WritePackToFile +// +// Description: Writes Hpk data to file +// +// Input: CHAR16 *filenameFormat, EFI_HANDLE Handle, UINT8 *PackData, UINTN length +// +// +// Output: VOID +//--------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS WritePackToFile(CHAR16 *filenameFormat, EFI_HANDLE Handle, UINT8 *PackData, UINTN length) +{ + EFI_STATUS Status = EFI_UNSUPPORTED; + EFI_FILE_PROTOCOL *FileHandle=NULL; + UINT8 *formSet = PackData; + UINTN len = length; + CHAR16 filename[50]; + + SETUP_DEBUG_UEFI_NOTIFICATION( "\n\n[TSE] Entering WritePackToFile \n\n"); + + if(formSet == NULL) + { + formSet = (UINT8*)HiiGetPackList(Handle, 0, &len); + if (formSet == NULL) + { + goto DONE; + } + } + + SPrint(filename, 50, filenameFormat, Handle, HpkFileCount); + + Status = WriteDataToFile(filename, formSet, length,0) ; + + if (!EFI_ERROR (Status)) + { + HpkFileCount++ ; + } + +DONE: + + SETUP_DEBUG_UEFI_NOTIFICATION( "\n\n[TSE] Exiting WritePackToFile, Status: %x \n\n", Status); + + return Status ; +} +//<AMI_PHDR_START> +//--------------------------------------------------------------------------- +// Procedure: DebugShowBufferContent +// +// Description: Prints the buffer, 16 characters max in a line +// +// Input: UINTN bufSize - Buffer length to print +// VOID *buffer - Buffer to print +// +// Output: VOID +//--------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID DebugShowBufferContent(UINTN bufSize, VOID *buffer) +{ + + //#if TSE_DEBUG_MESSAGES == 2 + + UINTN index = 0, j = 0; + UINTN size = bufSize; + UINT8 *temp = (UINT8 *)buffer; + + for(index = 0; index < size; ){ + SETUP_DEBUG_UEFI_CALLBACK ( "[0x%08x (%04d)] ", index, index); + for(j = 0; (j < 16) && (temp != NULL); index++, j++){ + if(index >= size){ + break; + } + if(j==8) SETUP_DEBUG_UEFI_CALLBACK ( "- "); + SETUP_DEBUG_UEFI_CALLBACK ( "%02x ", (UINT8)temp[index]); + } + SETUP_DEBUG_UEFI_CALLBACK ("\n"); + } + + +// #endif + +} +//<AMI_PHDR_START> +//--------------------------------------------------------------------------- +// Procedure: DebugLibShowHiiControlState +// +// Description: Prints the AMI Setup Lib control states +// +// Input: None +// +// Output: VOID +//--------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID DebugLibShowHiiControlState(UINT32 formID, UINT32 ctrlIndex, VOID *passedCtrlInfo) +{ + EFI_STATUS status = EFI_SUCCESS; + CONTROL_INFO *ctrlInfo = (CONTROL_INFO *)NULL; + UINTN ctrlCond = COND_NONE; + + ctrlInfo = (CONTROL_INFO *)passedCtrlInfo; + if(passedCtrlInfo == NULL){ + //status = _GetControlInfo(formID, ctrlIndex, &ctrlInfo); + //if((ctrlInfo == NULL) || EFI_ERROR(status)){ + SETUP_DEBUG_TSE("Invalid ctrlInfo, formID: 0x%x, ctrlIndex: 0x%x, status: 0x%x", formID, ctrlIndex, status); + return; + //} + } + ctrlCond = CheckControlCondition(ctrlInfo); + + switch(ctrlCond){ + case COND_NONE: + SETUP_DEBUG_TSE("Control Condition: COND_NONE\n"); + break; + case COND_SUPPRESS: + SETUP_DEBUG_TSE("Control Condition: COND_SUPPRESS\n"); + break; + case COND_HIDDEN: + SETUP_DEBUG_TSE("Control Condition: COND_HIDDEN\n"); + break; + case COND_GRAYOUT: + SETUP_DEBUG_TSE("Control Condition: COND_GRAYOUT\n"); + break; + case COND_INCONSISTENT: + SETUP_DEBUG_TSE("Control Condition: COND_INCONSISTENT\n"); + break; + default: + break; + } + return; +} +//<AMI_PHDR_START> +//--------------------------------------------------------------------------- +// Procedure: DebugShowControlInfo +// +// Description: Prints the cache controls information +// +// Input: UINT32 formID +// UINTN count +// VOID *passedCtrlInfo +// BOOLEAN detailed - If TRUE, prints the control buffers +// +// Output: EFI_STATUS status - EFI_SUCCESS if successful, else EFI_ERROR +//--------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS DebugShowControlInfo(UINT32 formID, VOID *passedCtrlInfo) +{ + EFI_STATUS status = EFI_SUCCESS; + UINTN bufferLen = 0; + UINT32 i = 0, j = 0; + UINT8 *temp = (UINT8 *)NULL; + EFI_IFR_QUESTION_HEADER *questionHdr = NULL; + UINT8 *questionValue = (UINT8 *)NULL; + UINTN dataWidth = 0; + CONTROL_INFO *ctrlInfo = (CONTROL_INFO *)NULL; + CHAR16 *String = (CHAR16 *)NULL; + + ctrlInfo = (CONTROL_INFO *)passedCtrlInfo; + + if(passedCtrlInfo == NULL){ + //status = _GetControlInfo(formID, ctrlIndex, &ctrlInfo); + goto DONE ; + } + + if((ctrlInfo == NULL) || EFI_ERROR(status)){ + SETUP_DEBUG_TSE("Invalid ctrlInfo, formID: 0x%x, status: 0x%x", formID, status); + goto DONE ; + } + + SETUP_DEBUG_TSE("\n----- Adding Control -----\n"); + + if(ctrlInfo->ControlHandle != NULL){ + String = HiiGetString(ctrlInfo->ControlHandle, ctrlInfo->QuestionId); + } + + if (String) + { + SETUP_DEBUG_TSE("QuestionId: 0x%x, %s\n", ctrlInfo->QuestionId, String); + } + SETUP_DEBUG_TSE("ControlHandle: 0x%x\n", ctrlInfo->ControlHandle); + SETUP_DEBUG_TSE("ControlType: 0x%x\n", ctrlInfo->ControlType); + SETUP_DEBUG_TSE("ControlPageID: %d\n", ctrlInfo->ControlPageID); + SETUP_DEBUG_TSE("ControlDestPageID: %d\n", ctrlInfo->ControlDestPageID); + SETUP_DEBUG_TSE("ControlIndex: %d\n", ctrlInfo->ControlIndex); + SETUP_DEBUG_TSE("ControlPtr: 0x%x\n", ctrlInfo->ControlPtr); + SETUP_DEBUG_TSE("ControlConditionalPtr: 0x%x\n", ctrlInfo->ControlConditionalPtr); + SETUP_DEBUG_TSE("ControlDataLength: 0x%x\n", ctrlInfo->ControlDataLength); + SETUP_DEBUG_TSE("ControlDataWidth: 0x%x\n", ctrlInfo->ControlDataWidth); + SETUP_DEBUG_TSE("ControlKey: %d\n", ctrlInfo->ControlKey); + SETUP_DEBUG_TSE("DestQuestionID: 0x%x\n", &ctrlInfo->DestQuestionID); + //DebugLibShowHiiControlState(formID, ctrlInfo->ControlIndex, ctrlInfo); + //DebugShowControlFlags(formID, ctrlIndex, ctrlInfo, &ctrlInfo->ControlFlags); + + +DONE: + MemFreePointer( (VOID **)&String ); + + return status; +} + +//<AMI_PHDR_START> +//--------------------------------------------------------------------------- +// Procedure: DebugShowPageInfo +// +// Description: Shows the Page information +// +// Input: UINT32 formID - The form +// PAGE_INFO *passedPageInfo +// +// Output: VOID +//--------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID DebugShowPageInfo(UINT32 formID, VOID *passedPageInfo) +{ + EFI_STATUS status = EFI_SUCCESS; + PAGE_INFO *pageInfo = (PAGE_INFO *)NULL; + + pageInfo = (PAGE_INFO *)passedPageInfo; + + if(pageInfo == NULL) + return ; + + SETUP_DEBUG_TSE("\n+++++ Adding Page +++++\n"); + SETUP_DEBUG_TSE("PageTitle: %s \n", HiiGetString(pageInfo->PageHandle, pageInfo->PageSubTitle )); //Varies Allows a page to override the main title bar + //SETUP_DEBUG_TSE("PageSubTitle: %s \n", HiiGetString(pageInfo->PageHandle, pageInfo->PageSubTitle )); //Varies Token for the subtitle string for this page + SETUP_DEBUG_TSE("PageHandle: 0x%x\n", pageInfo->PageHandle); + SETUP_DEBUG_TSE("PageIdIndex: %d\n", pageInfo->PageIdIndex); //varies Index in to PageIdList triplets + SETUP_DEBUG_TSE("PageFormID: %d\n", pageInfo->PageFormID); //Varies Form ID within the formset for this page + SETUP_DEBUG_TSE("PageID: %d\n", pageInfo->PageID); //Varies unique ID for this page + SETUP_DEBUG_TSE("PageParentID: %d\n", pageInfo->PageParentID); //Varies Identify this page's parent page + SETUP_DEBUG_TSE("PageFlags: 0x%x\n", pageInfo->PageFlags); //3 Various attributes for a specific page + SETUP_DEBUG_TSE("PageVariable: 0x%x\n", pageInfo->PageVariable); //Varies Overrides the variable ID for this page (0 = use default) + SETUP_DEBUG_TSE("PageDynamic: 0x%x\n", pageInfo->PageFlags.PageDynamic); //Identify this page as dynamic page + +} +//<AMI_PHDR_START> +//--------------------------------------------------------------------------- +// Procedure: DebugShowHiiVariable +// +// Description: Prints the variable information for the given parameter +// +// Input: UINT32 formID +// +// Output: EFI_STATUS status - EFI_SUCCESS if successful, else EFI_ERROR +//--------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS DebugShowHiiVariable(UINT32 formID, UINT32 varIndex, UINT32 *passedVarIDList) +{ + EFI_STATUS status = EFI_SUCCESS; + NVRAM_VARIABLE *nvPtr = (NVRAM_VARIABLE *)NULL; + UINT32 *varIDList = (UINT32 *)NULL; + VARIABLE_INFO *varInfo = (VARIABLE_INFO *)NULL ; + UINTN index = 0, j = 0, size = 0 ; + UINT8 *temp = (UINT8 *)NULL ; + + nvPtr = gVariableList; + size = nvPtr[varIndex].Size < 0xFFFF ? nvPtr[varIndex].Size : 0; + temp = nvPtr[varIndex].Buffer; + varInfo = VarGetVariableInfoIndex( varIndex ); + + if(size){ + SETUP_DEBUG_VAR ("\n----------- DebugShowHiiVariable -----------\n"); + SETUP_DEBUG_VAR ("VariableName: %s, Buffer size: %d, Buffer: 0x%x \n", varInfo->VariableName, size, nvPtr[varIndex].Buffer); + + for(index = 0; index < size; ){ + SETUP_DEBUG_VAR ( "[0x%08x (%04d)] ", index, index); + for(j = 0; (j < 16) && (temp != NULL); index++, j++){ + if(index >= size){ + break; + } + if(j==8) SETUP_DEBUG_VAR ( "- "); + SETUP_DEBUG_VAR ( "%02x ", (UINT8)temp[index]); + } + SETUP_DEBUG_VAR ("\n"); + } + + SETUP_DEBUG_VAR ("----------- End of DebugShowHiiVariable, status: 0x%x -----------\n\n", status); + } else{ + SETUP_DEBUG_VAR ("!!!!!! VariableName: %s, size: %d !!!!!\n", varInfo->VariableName, nvPtr[varIndex].Size); + } + + return status; +} +//<AMI_PHDR_START> +//--------------------------------------------------------------------------- +// Procedure: DebugShowAllHiiVariable +// +// Description: Prints the variable information in the list +// +// Input: UINT32 formID +// +// Output: EFI_STATUS status - EFI_SUCCESS if successful, else EFI_ERROR +//--------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS DebugShowAllHiiVariable(UINT32 formID) +{ + EFI_STATUS status = EFI_SUCCESS; + NVRAM_VARIABLE *nvPtr = (NVRAM_VARIABLE *)NULL; + UINT32 i = 0; + UINT32 *varIDList = (UINT32*)EfiLibAllocateZeroPool(gVariables->VariableCount * sizeof(UINT32)); + + SETUP_DEBUG_VAR ("\n----------- DebugShowAllHiiVariable -----------\n"); + + if(varIDList == NULL) + { + status = EFI_OUT_OF_RESOURCES; + SETUP_DEBUG_VAR ("ERROR-%r: varIDList Memory Allocation Failed\n", status); + goto DONE; + } + + nvPtr = gVariableList; + + SETUP_DEBUG_VAR ("++ Total number of variables: %d ++\n\n", gVariables->VariableCount); + for ( i = 0; i < gVariables->VariableCount; i++){ + DebugShowHiiVariable(formID, i, varIDList); + } + SETUP_DEBUG_VAR ("\n"); + +DONE: + + SETUP_DEBUG_VAR ("--------- End of DebugShowAllHiiVariable, status: 0x%x ---------\n\n", status); + return status; +} +//<AMI_PHDR_START> +//--------------------------------------------------------------------------- +// Procedure: DisplayParseFormSetData +// +// Description: Prints the current FormSet data +// +// Input: UINT32 FormID - Library formID of a FormSet +// +// Output: EFI_STATUS status - EFI_SUCCESS if successful, else EFI_ERROR +//--------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS DisplayParseFormSetData(VOID) +{ + + EFI_STATUS status = EFI_SUCCESS; + PAGE_INFO *pageInfo = (PAGE_INFO *)NULL; + EFI_HII_PACKAGE_HEADER *pkgHdr = (EFI_HII_PACKAGE_HEADER *)NULL; + UINT8 *formSet = (UINT8 *)NULL; + UINT8 *ifrData = (UINT8 *)NULL; + EFI_IFR_OP_HEADER *opHeader = (EFI_IFR_OP_HEADER *)NULL; + UINTN length = 0; + UINTN i = 0, count = 0; + CHAR16 *opcodeName = (CHAR16 *)NULL; + EFI_GUID *tempFormSetGuid = (EFI_GUID *)NULL; + BOOLEAN validOpCode = TRUE; + UINTN pScopeCount = 0; + BOOLEAN CurrentForm = FALSE; + PAGE_DATA *Page ; + UINT16 questionId = 0; + FRAME_DATA *frame = NULL ; + //UINT16 PageFormID = 0; + + Page = gApp->PageList[gApp->CurrentPage]; + + formSet = (UINT8*)HiiGetForm(Page->PageData.PageHandle, 0, &length); + if(formSet == NULL){ + status = EFI_UNSUPPORTED; + SETUP_DEBUG_TSE ("ERROR: 0x%x, failed to get FormSet data\n",status); + goto DONE; + } + + pkgHdr = (EFI_HII_PACKAGE_HEADER*)formSet; + + if(pkgHdr->Type != EFI_HII_PACKAGE_FORMS) + { + status = EFI_UNSUPPORTED; + SETUP_DEBUG_TSE("ERROR: 0x%x, pkgHdr->Type is not supported, Since it is not EFI_HII_PACKAGE_FORM\n",status); + goto DONE; + } + + + ifrData = ((UINT8 *)pkgHdr) + sizeof(EFI_HII_PACKAGE_HEADER); + + while(i < pkgHdr->Length) + { + opHeader = (EFI_IFR_OP_HEADER*)(ifrData + i); + tempFormSetGuid = (EFI_GUID *)NULL; + + if(opHeader == NULL){ + break; + } + + count = pScopeCount; + questionId = 0; + + switch(opHeader->OpCode) + { + case EFI_IFR_FORM_OP: //0x01 - Form + opcodeName = L"EFI_IFR_FORM_OP"; + + if(CurrentForm) + { + SETUP_DEBUG_TSE ( "[TSE] Form OpCode End\n" ); + goto DONE; + } + + if(((EFI_IFR_FORM*)(ifrData + i))->FormId == Page->PageData.PageFormID) + { + SETUP_DEBUG_TSE ( "[TSE] Form OpCode Start\n" ); + SETUP_DEBUG_TSE ( "FormTitle: %s\n", HiiGetString(Page->PageData.PageHandle, Page->PageData.PageSubTitle )); + + frame = Page->FrameList[StyleFrameIndexOf(MAIN_FRAME)]; + if(frame != NULL) + SETUP_DEBUG_TSE ( "NumberOfControls: %ld\n", frame->ControlCount ); + + CurrentForm = TRUE; + } + + break; + case EFI_IFR_SUBTITLE_OP: //0x02 - Subtitle statement + opcodeName = L"EFI_IFR_SUBTITLE_OP"; + questionId = _GetQuestionToken((UINT8*)opHeader); + break; + case EFI_IFR_TEXT_OP: //0x03 - Static text/image statement + opcodeName = L"EFI_IFR_TEXT_OP"; + questionId = _GetQuestionToken((UINT8*)opHeader); + break; + case EFI_IFR_IMAGE_OP: //0x04 - Static image. + opcodeName = L"EFI_IFR_IMAGE_OP"; + break; + case EFI_IFR_ONE_OF_OP: //0x05 - One-of question + opcodeName = L"EFI_IFR_ONE_OF_OP"; + questionId = _GetQuestionToken((UINT8*)opHeader); + break; + case EFI_IFR_CHECKBOX_OP: //0x06 - Boolean question + opcodeName = L"EFI_IFR_CHECKBOX_OP"; + questionId = _GetQuestionToken((UINT8*)opHeader); + break; + case EFI_IFR_NUMERIC_OP: //0x07 - Numeric question + opcodeName = L"EFI_IFR_NUMERIC_OP"; + questionId = _GetQuestionToken((UINT8*)opHeader); + break; + case EFI_IFR_PASSWORD_OP: //0x08 - Password string question + opcodeName = L"EFI_IFR_PASSWORD_OP"; + questionId = _GetQuestionToken((UINT8*)opHeader); + break; + case EFI_IFR_ONE_OF_OPTION_OP: //0x09 - Option + opcodeName = L"EFI_IFR_ONE_OF_OPTION_OP"; + /* + switch(((EFI_IFR_ONE_OF_OPTION *)opHeader)->Type) + { + case EFI_IFR_TYPE_NUM_SIZE_16: + questionId = ((EFI_IFR_ONE_OF_OPTION *)opHeader)->Value.u16; + break; + case EFI_IFR_TYPE_NUM_SIZE_32: + questionId = ((EFI_IFR_ONE_OF_OPTION *)opHeader)->Value.u32; + break; + case EFI_IFR_TYPE_NUM_SIZE_64: + questionId = (UINT16)((EFI_IFR_ONE_OF_OPTION *)opHeader)->Value.u64; + break; + case EFI_IFR_TYPE_NUM_SIZE_8: + default: + questionId = ((EFI_IFR_ONE_OF_OPTION *)opHeader)->Value.u8; + break; + } + */ + break; + case EFI_IFR_SUPPRESS_IF_OP: //0x0A - Suppress if conditional + opcodeName = L"EFI_IFR_SUPPRESS_IF_OP"; + break; + case EFI_IFR_LOCKED_OP: //0x0B - Marks statement/question as locked + opcodeName = L"EFI_IFR_LOCKED_OP"; + break; + case EFI_IFR_ACTION_OP: //0x0C - Button question + opcodeName = L"EFI_IFR_ACTION_OP"; + questionId = _GetQuestionToken((UINT8*)opHeader); + break; + case EFI_IFR_RESET_BUTTON_OP: //0x0D - Reset button statement + opcodeName = L"EFI_IFR_RESET_BUTTON_OP"; + break; + case EFI_IFR_FORM_SET_OP: //0x0E - Form set + opcodeName = L"EFI_IFR_FORM_SET_OP"; + break; + case EFI_IFR_REF_OP: //0x0F - Cross-reference statement + opcodeName = L"EFI_IFR_REF_OP"; + questionId = _GetQuestionToken((UINT8*)opHeader); + break; + case EFI_IFR_NO_SUBMIT_IF_OP: //0x10 - Error checking conditional + opcodeName = L"EFI_IFR_NO_SUBMIT_IF_OP"; + break; + case EFI_IFR_INCONSISTENT_IF_OP: //0x11 - Error checking conditional + opcodeName = L"EFI_IFR_INCONSISTENT_IF_OP"; + break; + case EFI_IFR_EQ_ID_VAL_OP: //0x12 - Return true if question value equals UINT16 + opcodeName = L"EFI_IFR_EQ_ID_VAL_OP"; + break; + case EFI_IFR_EQ_ID_ID_OP: //0x13 - Return true if question value equals another question value + opcodeName = L"EFI_IFR_EQ_ID_ID_OP"; + break; + case 0x14: //0x14 - Return true if question value is found in list of UINT16s + opcodeName = L"EFI_IFR_EQ_ID_VAL_LIST_OP"; + break; + case EFI_IFR_AND_OP: //0x15 - Push true if both sub-expressions returns true. + opcodeName = L"EFI_IFR_AND_OP"; + break; + case EFI_IFR_OR_OP: //0x16 - Push true if either sub-expressions returns true. + opcodeName = L"EFI_IFR_OR_OP"; + break; + case EFI_IFR_NOT_OP: //0x17 - Push false if sub-expression returns true, otherwise return true. + opcodeName = L"EFI_IFR_NOT_OP"; + break; + case EFI_IFR_RULE_OP: //0x18 - Create rule in current form. + opcodeName = L"EFI_IFR_RULE_OP"; + break; + case EFI_IFR_GRAY_OUT_IF_OP: //0x19 - Nested statements, questions or options will not be selectable if expression returns true. + opcodeName = L"EFI_IFR_GRAY_OUT_IF_OP"; + break; + case EFI_IFR_DATE_OP: //0x1A - Date question. + opcodeName = L"EFI_IFR_DATE_OP"; + questionId = _GetQuestionToken((UINT8*)opHeader); + break; + case EFI_IFR_TIME_OP: //0x1B - Time question. + opcodeName = L"EFI_IFR_TIME_OP"; + questionId = _GetQuestionToken((UINT8*)opHeader); + break; + case EFI_IFR_STRING_OP: //0x1C - String question + opcodeName = L"EFI_IFR_STRING_OP"; + questionId = _GetQuestionToken((UINT8*)opHeader); + break; + case EFI_IFR_REFRESH_OP: //0x1D - Interval for refreshing a question + opcodeName = L"EFI_IFR_REFRESH_OP"; + break; + case EFI_IFR_DISABLE_IF_OP: //0x1E - Nested statements, questions or options will not be processed if expression returns true. + opcodeName = L"EFI_IFR_DISABLE_IF_OP"; + break; + case 0x1F: //0x1F - Animation associated with question statement, form or form set. + opcodeName = L"EFI_IFR_ANIMATION_OP"; + break; + case EFI_IFR_TO_LOWER_OP: //0x20 - Convert a string on the expression stack to lower case. + opcodeName = L"EFI_IFR_TO_LOWER_OP"; + break; + case EFI_IFR_TO_UPPER_OP: //0x21 - Convert a string on the expression stack toupper case. + opcodeName = L"EFI_IFR_TO_UPPER_OP"; + break; + case 0x22: //0x22 - Convert one value to another by selecting a match from a list. + opcodeName = L"EFI_IFR_MAP_OP"; + break; + case EFI_IFR_ORDERED_LIST_OP: //0x23 - Set question + opcodeName = L"EFI_IFR_ORDERED_LIST_OP"; + questionId = _GetQuestionToken((UINT8*)opHeader); + break; + case EFI_IFR_VARSTORE_OP: //0x24 - Define a buffer-style variable storage. + opcodeName = L"EFI_IFR_VARSTORE_OP"; + break; + case EFI_IFR_VARSTORE_NAME_VALUE_OP: //0x25 - Define a name/value style variable storage. + opcodeName = L"EFI_IFR_VARSTORE_NAME_VALUE_OP"; + break; + case EFI_IFR_VARSTORE_EFI_OP: //0x26 - Define a UEFI variable style variable storage. + opcodeName = L"EFI_IFR_VARSTORE_EFI_OP"; + break; + case EFI_IFR_VARSTORE_DEVICE_OP: //0x27 - Specify the device path to use for variable storage. + opcodeName = L"EFI_IFR_VARSTORE_DEVICE_OP"; + break; + case EFI_IFR_VERSION_OP: //0x28 - Push the revision level of the UEFI Specification to which this FormsProcessor is compliant. + opcodeName = L"EFI_IFR_VERSION_OP"; + break; + case EFI_IFR_END_OP: //0x29 - Marks end of scope. + opcodeName = L"EFI_IFR_END_OP"; + break; + case EFI_IFR_MATCH_OP: //0x2A - Push TRUE if string matches a pattern. + opcodeName = L"EFI_IFR_MATCH_OP"; + break; + case 0x2B: //0x2B - Return a stored value. + opcodeName = L"EFI_IFR_GET_OP"; + break; + case 0x2C: //0x2C - Change a stored value. + opcodeName = L"EFI_IFR_SET_OP"; + break; + case 0x2D: //0x2D - Provides a value for the current question or default. + opcodeName = L"EFI_IFR_READ_OP"; + break; + case 0x2E: //0x2E - Change a value for the current question. + opcodeName = L"EFI_IFR_WRITE_OP"; + break; + case EFI_IFR_EQUAL_OP: //0x2F - Push TRUE if two expressions are equal. + opcodeName = L"EFI_IFR_EQUAL_OP"; + break; + case EFI_IFR_NOT_EQUAL_OP: //0x30 - Push TRUE if two expressions are not equal. + opcodeName = L"EFI_IFR_NOT_EQUAL_OP"; + break; + case EFI_IFR_GREATER_THAN_OP: //0x31 - Push TRUE if one expression is greater than another expression. + opcodeName = L"EFI_IFR_GREATER_THAN_OP"; + break; + case EFI_IFR_GREATER_EQUAL_OP: //0x32 - Push TRUE if one expression is greater than or equal to another expression. + opcodeName = L"EFI_IFR_GREATER_EQUAL_OP"; + break; + case EFI_IFR_LESS_THAN_OP: //0x33 - Push TRUE if one expression is less than another expression. + opcodeName = L"EFI_IFR_LESS_THAN_OP"; + break; + case EFI_IFR_LESS_EQUAL_OP: //0x34 - Push TRUE if one expression is less than or equal to another expression. + opcodeName = L"EFI_IFR_LESS_EQUAL_OP"; + break; + case EFI_IFR_BITWISE_AND_OP: //0x35 - Bitwise-AND two unsigned integers and push the result. + opcodeName = L"EFI_IFR_BITWISE_AND_OP"; + break; + case EFI_IFR_BITWISE_OR_OP: //0x36 - Bitwise-OR two unsigned integers and push the result. + opcodeName = L"EFI_IFR_BITWISE_OR_OP"; + break; + case EFI_IFR_BITWISE_NOT_OP: //0x37 - Bitwise-NOT an unsigned integer and push the result. + opcodeName = L"EFI_IFR_BITWISE_NOT_OP"; + break; + case EFI_IFR_SHIFT_LEFT_OP: //0x38 - Shift an unsigned integer left by a number of bits and push the result. + opcodeName = L"EFI_IFR_SHIFT_LEFT_OP"; + break; + case EFI_IFR_SHIFT_RIGHT_OP: //0x39 - Shift an unsigned integer right by a number of bits and push the result. + opcodeName = L"EFI_IFR_SHIFT_RIGHT_OP"; + break; + case EFI_IFR_ADD_OP: //0x3A - Add two unsigned integers and push the result. + opcodeName = L"EFI_IFR_ADD_OP"; + break; + case EFI_IFR_SUBTRACT_OP: //0x3B - Subtract two unsigned integers and push the result. + opcodeName = L"EFI_IFR_SUBTRACT_OP"; + break; + case EFI_IFR_MULTIPLY_OP: //0x3C - Multiply two unsigned integers and push the result. + opcodeName = L"EFI_IFR_MULTIPLY_OP"; + break; + case EFI_IFR_DIVIDE_OP: //0x3D - Divide one unsigned integer by another and push the result. + opcodeName = L"EFI_IFR_DIVIDE_OP"; + break; + case EFI_IFR_MODULO_OP: //0x3E - Divide one unsigned integer by another and push the remainder. + opcodeName = L"EFI_IFR_MODULO_OP"; + break; + case EFI_IFR_RULE_REF_OP: //0x3F //Evaluate a rule + opcodeName = L"EFI_IFR_RULE_REF_OP"; + questionId = _GetQuestionToken((UINT8*)opHeader); + break; + case EFI_IFR_QUESTION_REF1_OP: //0x40 - Push a question’s value + opcodeName = L"EFI_IFR_QUESTION_REF1_OP"; + questionId = _GetQuestionToken((UINT8*)opHeader); + break; + case EFI_IFR_QUESTION_REF2_OP: //0x41 - Push a question’s value + opcodeName = L"EFI_IFR_QUESTION_REF2_OP"; + questionId = _GetQuestionToken((UINT8*)opHeader); + break; + case EFI_IFR_UINT8_OP: //0x42 - Push an 8-bit unsigned integer + opcodeName = L"EFI_IFR_UINT8_OP"; + break; + case EFI_IFR_UINT16_OP: //0x43 - Push a 16-bit unsigned integer. + opcodeName = L"EFI_IFR_UINT16_OP"; + break; + case EFI_IFR_UINT32_OP: //0x44 - Push a 32-bit unsigned integer + opcodeName = L"EFI_IFR_UINT32_OP"; + break; + case EFI_IFR_UINT64_OP: //0x45 - Push a 64-bit unsigned integer. + opcodeName = L"EFI_IFR_UINT64_OP"; + break; + case EFI_IFR_TRUE_OP: //0x46 - Push a boolean TRUE. + opcodeName = L"EFI_IFR_TRUE_OP"; + break; + case EFI_IFR_FALSE_OP: //0x47 - Push a boolean FALSE + opcodeName = L"EFI_IFR_FALSE_OP"; + break; + case EFI_IFR_TO_UINT_OP: //0x48 - Convert expression to an unsigned integer + opcodeName = L"EFI_IFR_TO_UINT_OP"; + break; + case EFI_IFR_TO_STRING_OP: //0x49 - Convert expression to a string + opcodeName = L"EFI_IFR_TO_STRING_OP"; + break; + case EFI_IFR_TO_BOOLEAN_OP: //0x4A - Convert expression to a boolean. + opcodeName = L"EFI_IFR_TO_BOOLEAN_OP"; + break; + case EFI_IFR_MID_OP: //0x4B - Extract portion of string or buffer + opcodeName = L"EFI_IFR_MID_OP"; + break; + case EFI_IFR_FIND_OP: //0x4C - Find a string in a string. + opcodeName = L"EFI_IFR_FIND_OP"; + break; + case EFI_IFR_TOKEN_OP: //0x4D - Extract a delimited byte or character string from buffer or string. + opcodeName = L"EFI_IFR_TOKEN_OP"; + break; + case EFI_IFR_STRING_REF1_OP: //0x4E - Push a string + opcodeName = L"EFI_IFR_STRING_REF1_OP"; + break; + case EFI_IFR_STRING_REF2_OP: //0x4F - Push a string + opcodeName = L"EFI_IFR_STRING_REF2_OP"; + break; + case EFI_IFR_CONDITIONAL_OP: //0x50 - Duplicate one of two expressions depending on result of the first expression. + opcodeName = L"EFI_IFR_CONDITIONAL_OP"; + break; + case EFI_IFR_QUESTION_REF3_OP: //0x51 - Push a question’s value from a different form. + opcodeName = L"EFI_IFR_QUESTION_REF3_OP"; + break; + case EFI_IFR_ZERO_OP: //0x52 - Push a zero + opcodeName = L"EFI_IFR_ZERO_OP"; + break; + case EFI_IFR_ONE_OP: //0x53 //Push a one + opcodeName = L"EFI_IFR_ONE_OP"; + break; + case EFI_IFR_ONES_OP: //0x54 - Push a 0xFFFFFFFFFFFFFFFF. + opcodeName = L"EFI_IFR_ONES_OP"; + break; + case EFI_IFR_UNDEFINED_OP: //0x55 - Push Undefined + opcodeName = L"EFI_IFR_UNDEFINED_OP"; + break; + case EFI_IFR_LENGTH_OP: //0x56 - Push length of buffer or string. + opcodeName = L"EFI_IFR_LENGTH_OP"; + break; + case EFI_IFR_DUP_OP: //0x57 - Duplicate top of expression stack + opcodeName = L"EFI_IFR_DUP_OP"; + break; + case EFI_IFR_THIS_OP: //0x58 - Push the current question’s value + opcodeName = L"EFI_IFR_THIS_OP"; + break; + case EFI_IFR_SPAN_OP: //0x59 - Return first matching/non-matching character in a string + opcodeName = L"EFI_IFR_SPAN_OP"; + break; + case EFI_IFR_VALUE_OP: //0x5A - Provide a value for a question + opcodeName = L"EFI_IFR_VALUE_OP"; + break; + case EFI_IFR_DEFAULT_OP: //0x5B - Provide a default value for a question. + opcodeName = L"EFI_IFR_DEFAULT_OP"; + break; + case 0x5C: //0x5C - Define a Default Type Declaration + opcodeName = L"EFI_IFR_DEFAULTSTORE_OP"; + break; + case 0x5D: //0x5D - Create a standards-map form. + opcodeName = L"EFI_IFR_FORM_MAP_OP"; + break; + case EFI_IFR_CATENATE_OP: //0x5E - Push concatenated buffers or strings. + opcodeName = L"EFI_IFR_CATENATE_OP"; + break; + case EFI_IFR_GUID_OP: //0x5F - An extensible GUIDed op-code + opcodeName = L"EFI_IFR_GUID_OP"; + break; + case 0x60: //0x60 - Returns whether current user profile contains specified setup access privileges. + opcodeName = L"EFI_IFR_SECURITY_OP"; + break; + case 0x61: //0x61 - Specify current form is modal + opcodeName = L"EFI_IFR_MODAL_TAG_OP"; + break; + case 0x62: //0x62 - Establish an event group for refreshing a forms-based element. + opcodeName = L"EFI_IFR_REFRESH_ID_OP"; + break; + default: + opcodeName = L"Invalid Opcode"; + validOpCode = FALSE; + break; + } + + if(opHeader->OpCode == EFI_IFR_END_OP){ + pScopeCount--; + count = pScopeCount; + } + while(count){ + if(CurrentForm) SETUP_DEBUG_TSE ( " "); + + count--; + } + + if(CurrentForm) SETUP_DEBUG_TSE ( "\n\n%s, len: %d\n", opcodeName, opHeader->Length); + + if(CurrentForm && questionId) SETUP_DEBUG_TSE ( "questionId: 0x%x %s \n", questionId, HiiGetString(Page->PageData.PageHandle , questionId )); + + if(opHeader->Length==0) + { + //validOpCode = FALSE ; + goto DONE; + } + + + if(validOpCode){ + UINTN index = 0, j = 0; + UINTN size = opHeader->Length; + UINT8 *temp = (UINT8 *)opHeader; + UINTN sCount = pScopeCount; + + if(size){ + for(index = 0; index < size; ){ + sCount = pScopeCount; + while(sCount){ + sCount--; + } + + if(CurrentForm) SETUP_DEBUG_TSE ( "[0x%08x (%04d)] ", index, index); + + for(j = 0; (j < 16) && (temp != NULL); index++, j++) + { + if(index >= size){ + break; + } + if(CurrentForm && j==8) SETUP_DEBUG_TSE ( "- "); + if(CurrentForm) SETUP_DEBUG_TSE ( "%02x ", (UINT8)temp[index]); + } + if(CurrentForm)SETUP_DEBUG_TSE ("\n"); + + } + } + } + + if(opHeader->Scope){ + pScopeCount++; + } + + i += opHeader->Length; + validOpCode = TRUE; + } + +DONE: + if(formSet){ + EfiLibSafeFreePool(formSet); + } + + pScopeCount = 0; + + return status; +} + +#endif //End of TSE_DEBUG_MESSAGES +//EIP75481 Support TSE debug print infrastructure +//EIP 80426 : START +#define ASSERT_ERROR_STATUS(assertion) if(EFI_ERROR(assertion)) goto DONE +#define MAX_PAGES_TO_PROCESS 50 +UINT32 gProcessedPages[MAX_PAGES_TO_PROCESS]; +UINT32 gProPageOffset = 0; +UINT32 gCurrLoadVarIndex = 0; //Used to track which variable is getting loaded +UINT8 *gCurrLoadVarBuf = (UINT8 *)NULL; //Used to store current variable buffer + +//<AMI_PHDR_START> +//--------------------------------------------------------------------------- +// Procedure: _GetControlInfo +// +// Description: Returns pointer to the CONTROL_INFO struct of given CtrlIndex +// +// Input: UINT32 PgIndex - Page index containing the control +// UINT32 CtrlIndex - HII Control index +// CONTROL_INFO **CtrlInfo - Pointer to the CONTROL_INFO structure +// +// Output: EFI_STATUS status - EFI_SUCCESS if successful, else EFI_ERROR +//--------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS _GetPageInfo(UINT32 PgIndex, PAGE_INFO **PageInfo); +EFI_STATUS _GetControlInfo(UINT32 PgIndex, UINT32 CtrlIndex, CONTROL_INFO **CtrlInfo) +{ + EFI_STATUS status = EFI_SUCCESS; + PAGE_INFO *pageInfo = NULL; + + status = _GetPageInfo(PgIndex, &pageInfo); + if(pageInfo->PageHandle == NULL) + { + status = EFI_NOT_FOUND; //If the page handle is invalid, then page may contain incorrect control data. Return error. + } + ASSERT_ERROR_STATUS(status); + + if(CtrlIndex > pageInfo->PageControls.ControlCount) + { + status = EFI_INVALID_PARAMETER; + goto DONE; + } + + *CtrlInfo = (CONTROL_INFO*)((UINTN)gControlInfo + pageInfo->PageControls.ControlList[CtrlIndex]); + +DONE: + return status; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: GetNumOfControls +// +// Description: Get the Number of Control for a Page +// +// Input: IN UINT32 PgIndex +// OUT UINT32 *numOfControls +// +// Output: EFI_STATUS +// EFI_SUCCESS +// EFI_NOT_READY +// EFI_INVALID_PARAMETER +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS GetNumOfControls(UINT32 PgIndex, UINT32 *NumOfControls) +{ + EFI_STATUS status = EFI_SUCCESS; + PAGE_INFO *pageInfo = NULL; + + status = _GetPageInfo(PgIndex, &pageInfo); + ASSERT_ERROR_STATUS(status); + + *NumOfControls = pageInfo->PageControls.ControlCount; + +DONE: + return status; +} + +//<AMI_PHDR_START> +//--------------------------------------------------------------------------- +// Procedure: CleanCurrLoadVarBuffer +// +// Description: Cleans the temporary variables +// +// Input: None +// +// Output: VOID +//--------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID CleanCurrLoadVarBuffer() +{ + if(gCurrLoadVarBuf!= NULL) { + MemFreePointer(&gCurrLoadVarBuf); + } + gCurrLoadVarBuf = (UINT8 *)NULL; + gCurrLoadVarIndex = 0; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: _DestinationPageProcessed +// +// Description: Checks whether the page is already processed or not. +// +// Input: UINT32 PageID +// +// Output: BOOLEAN +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +BOOLEAN _DestinationPageProcessed(UINT32 PageID) +{ + BOOLEAN isProcessed = FALSE; + UINT32 index = 0; + + for(index = 0; index < gProPageOffset; index++) + { + if(PageID == gProcessedPages[index]) + { + isProcessed = TRUE; + break; + } + } + return isProcessed; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: _GetDefaultNvramVariableIDList +// +// Description: To get the default variable names. +// +// Input: UINT32 FormID +// BOOLEAN DefaultsFlag +// BOOLEAN *ResetVal +// BOOLEAN *ValChanged +// +// Output: EFI_STATUS +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS _GetDefaultNvramVariableIDList(UINT32 PageID, BOOLEAN DefaultsFlag, BOOLEAN *ResetVal, BOOLEAN *ValChanged) +{ + EFI_STATUS status = EFI_SUCCESS; + UINT16 CtrlDataSize = 0; + UINT32 count = 0; + UINT32 index = 0; + UINTN CurVarSize = 0; + CONTROL_INFO *ctrlInfo; + NVRAM_VARIABLE *nvPtr = gVariableList; + NVRAM_VARIABLE *defaults = gOptimalDefaults; + EFI_IFR_QUESTION_HEADER *questionHdr = (EFI_IFR_QUESTION_HEADER *)NULL; + + gProcessedPages[gProPageOffset++] = PageID; + + status = GetNumOfControls(PageID, &count); + ASSERT_ERROR_STATUS(status); + + for(index = 0; index < count; index++) + { + //Iterating for all controls + status = _GetControlInfo(PageID , index, &ctrlInfo); + ASSERT_ERROR_STATUS(status); + + // CONTROL_TYPE_TEXT is a special case here since its value is not + // in the varstore. If this is a text control, continue. + if(ctrlInfo->ControlType == CONTROL_TYPE_TEXT){ + continue; + } + + if((ctrlInfo->ControlType == CONTROL_TYPE_SUBMENU) || (ctrlInfo->ControlType == CONTROL_TYPE_REF2)) + { + if(_DestinationPageProcessed(ctrlInfo->ControlDestPageID) == FALSE) + { + status = _GetDefaultNvramVariableIDList(ctrlInfo->ControlDestPageID, DefaultsFlag, ResetVal, ValChanged); + ASSERT_ERROR_STATUS(status); + } + } + if(ctrlInfo->ControlType == CONTROL_TYPE_POPUP_STRING && DefaultsFlag) + { + UINT16 defaultToken = 0; + CHAR16 * defaultValue = NULL; + + // First, check if the control has a default value. During parsing, the + // Control Data Width is set to zero if there is no default value. + if (ctrlInfo->ControlDataWidth == 0) { + continue; // move to next control if this one has no default. + } + + // Get the Default String Id + defaultToken = *(UINT16*)((UINT8*)ctrlInfo + sizeof(CONTROL_INFO) + ctrlInfo->ControlDataWidth); + // Get the string corresponding to the StringId + defaultValue = HiiGetString(ctrlInfo->ControlHandle, defaultToken); + // Set the default value to nvPtr + questionHdr = (EFI_IFR_QUESTION_HEADER*)((UINT8*)ctrlInfo->ControlPtr + sizeof(EFI_IFR_OP_HEADER)); + if(defaultValue) + { + if(EfiStrCmp(defaultValue, (CHAR16 *)&nvPtr[ctrlInfo->ControlVariable].Buffer[questionHdr->VarStoreInfo.VarOffset]) != 0) + { + EfiStrCpy((CHAR16 *)&nvPtr[ctrlInfo->ControlVariable].Buffer[questionHdr->VarStoreInfo.VarOffset], defaultValue); + *ValChanged = TRUE; + + if(ctrlInfo->ControlFlags.ControlReset) + { + //ControlReset reset requested. + *ResetVal |= ctrlInfo->ControlFlags.ControlReset; + } + } + } + continue; + } + + if(ctrlInfo->ControlFlags.ControlEvaluateDefault) + { + UINT64 defaults = 0; + UINT16 size = EvaluateControlDefault(ctrlInfo, &defaults); + + if(DefaultsFlag) + { + //Loading Defaults for control + questionHdr = (EFI_IFR_QUESTION_HEADER*)((UINT8*)ctrlInfo->ControlPtr + sizeof(EFI_IFR_OP_HEADER)); + + if(MemCmp((UINT8*)&nvPtr[ctrlInfo->ControlVariable].Buffer[questionHdr->VarStoreInfo.VarOffset], (UINT8*)&defaults, size) != 0) + { + //defaults and Memory value donot match. Copying defaults to memory value + MemCopy( &nvPtr[ctrlInfo->ControlVariable].Buffer[questionHdr->VarStoreInfo.VarOffset], &defaults, size); + *ValChanged = TRUE; + + if(ctrlInfo->ControlFlags.ControlReset) + { + //ControlReset reset requested + *ResetVal |= ctrlInfo->ControlFlags.ControlReset; + } + } + continue; + } + } + + if(DefaultsFlag) { //If loading defaults, use the data size given in CONTROL_INFO. Else get the data size using GetControlDataLength(). + CtrlDataSize = ctrlInfo->ControlDataWidth; + } + else { + CtrlDataSize = (UINT16)GetControlDataLength(ctrlInfo); + } + + if(CtrlDataSize == 0) { + //Control Data Width for control %s is 0\n", HiiGetString(ctrlInfo->ControlHandle, ctrlInfo->QuestionId)); + continue; + } + + if(ctrlInfo->ControlVariable <= gVariables->VariableCount) + { + if(DefaultsFlag == TRUE) + { + //Loading Defaults for control + questionHdr = (EFI_IFR_QUESTION_HEADER*)((UINT8*)ctrlInfo->ControlPtr + sizeof(EFI_IFR_OP_HEADER)); + + if(MemCmp((UINT8*)&nvPtr[ctrlInfo->ControlVariable].Buffer[questionHdr->VarStoreInfo.VarOffset], (UINT8*)&defaults[ctrlInfo->ControlVariable].Buffer[questionHdr->VarStoreInfo.VarOffset], ctrlInfo->ControlDataWidth) != 0) + { + //defaults and Memory value donot match. Copying defaults to memory value + MemCopy( &nvPtr[ctrlInfo->ControlVariable].Buffer[questionHdr->VarStoreInfo.VarOffset], &defaults[ctrlInfo->ControlVariable].Buffer[questionHdr->VarStoreInfo.VarOffset], ctrlInfo->ControlDataWidth); + *ValChanged = TRUE; + + if(ctrlInfo->ControlFlags.ControlReset) + { + //ControlReset reset requested. + *ResetVal |= ctrlInfo->ControlFlags.ControlReset; + } + } + } + else + { + UINT8 *tempLoadVarBuff = (UINT8 *)NULL; + + if(gCurrLoadVarBuf != NULL) + { + if(gCurrLoadVarIndex != ctrlInfo->ControlVariable) + { + tempLoadVarBuff = VarGetNvram( ctrlInfo->ControlVariable, &CurVarSize ); + if(tempLoadVarBuff != NULL){ + CleanCurrLoadVarBuffer(); + gCurrLoadVarBuf = tempLoadVarBuff; + gCurrLoadVarIndex = ctrlInfo->ControlVariable; + } + } + } + else + { + tempLoadVarBuff = VarGetNvram( ctrlInfo->ControlVariable, &CurVarSize ); + if(tempLoadVarBuff != NULL){ + CleanCurrLoadVarBuffer(); + gCurrLoadVarBuf = tempLoadVarBuff; + gCurrLoadVarIndex = ctrlInfo->ControlVariable; + } + } + + if(gCurrLoadVarBuf != NULL) + { + if(tempLoadVarBuff != NULL){ + gCurrLoadVarIndex = ctrlInfo->ControlVariable; + } + questionHdr = (EFI_IFR_QUESTION_HEADER*)((UINT8*)ctrlInfo->ControlPtr + sizeof(EFI_IFR_OP_HEADER)); + MemCopy( &nvPtr[ctrlInfo->ControlVariable].Buffer[questionHdr->VarStoreInfo.VarOffset], &gCurrLoadVarBuf[questionHdr->VarStoreInfo.VarOffset], CtrlDataSize); + } + } + } + } + +DONE: + return status; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: LoadNvram +// +// Description: Intermediate function to get the nvram variables to restore. +// +// Parameter: UINT32 PageID +// +// Return Value: EFI_STATUS +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS LoadNvram(UINT32 PageID) +{ + EFI_STATUS status = EFI_SUCCESS; + + gProPageOffset = 0; + MemSet(gProcessedPages, MAX_PAGES_TO_PROCESS * sizeof(UINT32), 0); + status = _GetDefaultNvramVariableIDList(PageID, FALSE, NULL, NULL); + ASSERT_ERROR_STATUS(status); + +DONE: + CleanCurrLoadVarBuffer(); + return status; +} +//EIP 80426 : END + +//EIP81814 Starts +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: LoadDefaults +// +// Description: function to load the defaults to the nvram cache +// +// Parameter: UINT32 FormID - form identifier +// BOOLEAN *ResetVal - Reboot flag of the control variable +// BOOLEAN * ValChanged - flag to check whether the value changed +// +// Return Value: EFI_STATUS +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS LoadDefaults(UINT32 FormID, BOOLEAN *ResetVal, BOOLEAN * ValChanged) +{ + EFI_STATUS status = EFI_SUCCESS; + UINT32 *varIDList = (UINT32*)EfiLibAllocateZeroPool(gVariables->VariableCount * sizeof(UINT32)); + + + if(varIDList == NULL) + { + status = EFI_OUT_OF_RESOURCES; + + goto DONE; + } + + gVarOffset = 0; +// gProFormOffset = 0; +// MemSet(gProcessedForms, MAX_FORMS_TO_PROCESS, 0); + CleargProcessedForms (); + + //inplace of updating all the variables, update only the variables that are modified + //status = _GetVariableIDList(FormID, &varIDList); + status = _GetDefaultNvramVariableIDList(FormID, TRUE, ResetVal, ValChanged); + ASSERT_ERROR_STATUS(status); + +DONE: + if (varIDList) { + MemFreePointer(&varIDList); + } + CleanCurrLoadVarBuffer(); + + + return status; +} + +//<AMI_PHDR_START> +//--------------------------------------------------------------------------- +// Procedure: _InconsistenceCheck +// +// Description: Checks if the controls in a page is inconsistent +// +// Input: PAGE_INFO *PgInfo - Input page info +// UINT16 *ErrStrToken - Pointer to the output error code +// +// Output: BOOLEAN flag - TRUE if inconsistence, else FALSE +//--------------------------------------------------------------------------- +//<AMI_PHDR_END> +BOOLEAN _InconsistenceCheck(PAGE_INFO *PgInfo, UINT16 *ErrStrToken) +{ + CONTROL_INFO *ctrlInfo = NULL; + EFI_IFR_INCONSISTENT_IF *inconsistentIf = NULL; + BOOLEAN flag = FALSE; + UINT32 i = 0; + + //Find out if there is inconsistent value in any of the controls + for(i=0; i < PgInfo->PageControls.ControlCount; i++) + { + + ctrlInfo = (CONTROL_INFO*)((UINTN)(gControlInfo) + PgInfo->PageControls.ControlList[i]); + //Check if there is a CONTROL_TYPE_MSGBOX in this page + if(ctrlInfo->ControlType == CONTROL_TYPE_MSGBOX) + { + + if(CheckControlCondition(ctrlInfo) == COND_INCONSISTENT) + { + + inconsistentIf = (EFI_IFR_INCONSISTENT_IF*)ctrlInfo->ControlConditionalPtr; + *ErrStrToken = inconsistentIf->Error; + flag = TRUE; + goto DONE; + } + } + } + +DONE: + + return flag; +} + +//<AMI_PHDR_START> +//--------------------------------------------------------------------------- +// Procedure: _NoSubmitCheck +// +// Description: Checks if the controls in a page has no submit +// +// Input: CONTROL_INFO *ctrlInfo - Input control info +// UINT16 *ErrStrToken - Pointer to the output error code +// +// Output: BOOLEAN flag - TRUE if nosubmit, else FALSE +//--------------------------------------------------------------------------- +//<AMI_PHDR_END> +BOOLEAN _NoSubmitCheck(CONTROL_INFO *ctrlInfo, UINT16 *ErrStrToken) +{ + EFI_IFR_NO_SUBMIT_IF *nosubmitIf = NULL; + BOOLEAN flag = FALSE; + + + + if(ctrlInfo->ControlType == CONTROL_TYPE_MSGBOX) + { + + if(CheckControlCondition(ctrlInfo) == COND_NOSUBMIT) + { + + nosubmitIf = (EFI_IFR_NO_SUBMIT_IF*)ctrlInfo->ControlConditionalPtr; + *ErrStrToken = nosubmitIf->Error; + flag = TRUE; + } + } + + + return flag; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: _GetVariableIDList +// +// Description: function to get the list of all variables that are need to update +// +// Parameter: UINT32 FormID, +// UINT32 **VarIDList +// +// Return Value: EFI_STATUS +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS _GetVariableIDList(UINT32 FormID, UINT32 **VarIDList) +{ + EFI_STATUS status = EFI_SUCCESS; + UINT32 count = 0; + UINT32 index = 0; + UINT32 varIndex = 0; + UINT32 *varPtr = NULL; + CONTROL_INFO *ctrlInfo; + + + if(*VarIDList == NULL || VarIDList == NULL) + { + status = EFI_INVALID_PARAMETER; + + goto DONE; + } + AddEntryIngProcessedForms (FormID); +// gProcessedForms[gProFormOffset++] = FormID; + status = GetNumOfControls(FormID, &count); + ASSERT_ERROR_STATUS(status); + varPtr = *VarIDList; + for(index = 0; index < count; index++) + { + + status = _GetControlInfo(FormID , index, &ctrlInfo); + ASSERT_ERROR_STATUS(status); + + if((ctrlInfo->ControlType == CONTROL_TYPE_SUBMENU) || (ctrlInfo->ControlType == CONTROL_TYPE_REF2)) + { + + if(_DestinationFormProcessed(ctrlInfo->ControlDestPageID) == FALSE) + { + + _GetVariableIDList(ctrlInfo->ControlDestPageID, VarIDList); + } + } + + for(varIndex = 0; varIndex < gVariables->VariableCount; varIndex++) + { + + if(varPtr[varIndex] == ctrlInfo->ControlVariable) + { + + break; + } + } + if(varIndex == gVariables->VariableCount) + { + + varPtr[gVarOffset++] = ctrlInfo->ControlVariable; + } + } + +DONE: + + return status; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: _DestinationFormProcessed +// +// Description: Is this form Processed +// +// Parameter: IN UINT32 FormID +// +// +// Return Value: BOOLEAN +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +BOOLEAN _DestinationFormProcessed(UINT32 FormID) +{ + BOOLEAN isProcessed = FALSE; + UINT32 index = 0; + + + for(index = 0; index < gProFormOffset; index++) + { + + if(FormID == gProcessedForms[index]) + { + + isProcessed = TRUE; + break; + } + } + + return isProcessed; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: IsNoSubmitOfForms +// +// Description: Is this formset or form has the no submit if +// +// Parameter: IN UINT32 FormID +// OUT UINT16* ErrToken +// +// Return Value: BOOLEAN +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +BOOLEAN IsNoSubmitOfForms(UINT32 FormID, UINT16* ErrToken) +{ + BOOLEAN flag = FALSE; + EFI_STATUS status = EFI_SUCCESS; + UINT32 count = 0; + UINT32 index = 0; + CONTROL_INFO *ctrlInfo; + + +// gProcessedForms[gProFormOffset++] = FormID; + AddEntryIngProcessedForms (FormID); + + status = GetNumOfControls(FormID, &count); + ASSERT_ERROR_STATUS(status); + + for(index = 0; index < count; index++) + { + + status = _GetControlInfo(FormID, index, &ctrlInfo); + ASSERT_ERROR_STATUS(status); + + if((ctrlInfo->ControlType == CONTROL_TYPE_SUBMENU)//If submenu traverse recursively through the sub forms + || (ctrlInfo->ControlType == CONTROL_TYPE_REF2)) + { + + if(_DestinationFormProcessed(ctrlInfo->ControlDestPageID) == FALSE)//If the form has not be processed already + { + flag = IsNoSubmitOfForms(ctrlInfo->ControlDestPageID, ErrToken); + if(flag) + { + break; + } + } + } + if(_NoSubmitCheck(ctrlInfo, ErrToken) == TRUE)//if the control is no submit if + { + flag = TRUE; + break; + } + }//end of for loop of controls + +DONE: + + return flag; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: CheckforNosubmitIf +// +// Description: Check for no submit if +// +// Parameter: UINT32 FormID, BOOLEAN Recursive, UINT16 *ErrToken +// +// Return Value: BOOLEAN +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS CheckforNosubmitIf(UINT32 FormID, BOOLEAN Recursive, UINT16 *ErrToken) +{ + EFI_STATUS status = EFI_SUCCESS; + BOOLEAN flag = FALSE; + + if(Recursive)//To check all the forms in the formset + { +// gProFormOffset = 0; +// MemSet(gProcessedForms, MAX_FORMS_TO_PROCESS, 0); + CleargProcessedForms (); + flag = IsNoSubmitOfForms(FormID,ErrToken); + } + else//for single form ID + { + PAGE_INFO *PgInfo = NULL; + EFI_STATUS status = EFI_SUCCESS; + UINT32 i = 0; + CONTROL_INFO *ctrlInfo = NULL; + + status = _GetPageInfo(FormID, &PgInfo); + ASSERT_ERROR_STATUS(status); + + for(i=0; i < PgInfo->PageControls.ControlCount; i++) + { + + ctrlInfo = (CONTROL_INFO*)((UINTN)(gControlInfo) + PgInfo->PageControls.ControlList[i]); + if(_NoSubmitCheck(ctrlInfo, ErrToken) == TRUE) + { + flag = TRUE; + break; + } + } + } + + if(flag) + { + status = EFI_NOSUBMIT_VALUE; + } + +DONE: + return status; +} + +//<AMI_PHDR_START> +//--------------------------------------------------------------------------- +// Procedure: _GetControlFlag +// +// Description: Gets attribute flag for a given CtrlIndex in a page +// +// Input: UINT32 PgIndex - Page index containing the control +// UINT32 CtrlIndex - Control index +// CONTROL_FLAGS **CtrlFlag - Pointer to the flag attribute structure +// +// Output: EFI_STATUS status - EFI_SUCCESS if successful, else EFI_ERROR +//--------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS _GetControlFlag(UINT32 PgIndex, UINT32 CtrlIndex, CONTROL_FLAGS **CtrlFlag) +{ + EFI_STATUS status = EFI_SUCCESS; + CONTROL_INFO *ctrlInfo = NULL; + + + status = _GetControlInfo(PgIndex, CtrlIndex, &ctrlInfo); + ASSERT_ERROR_STATUS(status); + + *CtrlFlag = &ctrlInfo->ControlFlags; + +DONE: + + return status; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: GetNumOfPages +// +// Description: Get the Total Number of HII Form Pages to display +// +// Parameter: OUT UINT32 *numOfPages +// +// Return Value: EFI_STATUS +// EFI_SUCCESS +// EFI_NOT_READY +// EFI_OUT_OF_RESOURCES +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS GetNumOfPages(UINT32 *NumOfPages) +{ + EFI_STATUS status = EFI_SUCCESS; + + + if(LibInitialized == FALSE) + { + status = EFI_NOT_READY; + + goto DONE; + } + + *NumOfPages = gPages->PageCount; + +DONE: + + return status; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: GetPageTitle +// +// Description: Get the Page Title String Index +// +// Parameter: IN UINT32 PgIndex +// OUT UINT16 *titleToken +// +// Return Value: EFI_STATUS +// EFI_SUCCESS +// EFI_NOT_READY +// EFI_INVALID_PARAMETER +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS GetPageTitle(UINT32 PgIndex, UINT16 *TitleToken) +{ + EFI_STATUS status = EFI_SUCCESS; + PAGE_INFO *pageInfo = NULL; + + status = _GetPageInfo(PgIndex, &pageInfo); + ASSERT_ERROR_STATUS(status); + + *TitleToken = pageInfo->PageTitle; + +DONE: + return status; + +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: GetPageHandle +// +// Description: Get the Handle for the Page +// +// Parameter: IN UINTN PgIndex +// OUT EFI_HII_HANDLE *handle +// +// Return Value: EFI_STATUS +// EFI_SUCCESS +// EFI_NOT_READY +// EFI_INVALID_PARAMETER +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS GetPageHandle(UINT32 PgIndex, EFI_HII_HANDLE *Handle) +{ + EFI_STATUS status = EFI_SUCCESS; + PAGE_INFO *pageInfo = NULL; + + status = _GetPageInfo(PgIndex, &pageInfo); + ASSERT_ERROR_STATUS(status); + + *Handle = pageInfo->PageHandle; +DONE: + return status; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: GetPageIdIndex +// +// Description: Get the page ID index for the Page +// +// Parameter: IN UINTN PgIndex +// OUT UINT16 *PgIdIndex +// +// Return Value: EFI_STATUS +// EFI_SUCCESS +// EFI_NOT_READY +// EFI_INVALID_PARAMETER +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS GetPageIdIndex(UINT32 PgIndex, UINT16 *PgIdIndex) +{ + EFI_STATUS status = EFI_SUCCESS; + PAGE_INFO *pageInfo = NULL; + + status = _GetPageInfo(PgIndex, &pageInfo); + ASSERT_ERROR_STATUS(status); + + *PgIdIndex = pageInfo->PageIdIndex; + +DONE: + return status; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: IsParentPage +// +// Description: Is this page a parent page +// +// Parameter: IN UINT32 PgIndex +// +// Return Value: BOOLEAN +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +BOOLEAN IsParentPage(UINT32 PgIndex) +{ + EFI_STATUS status = EFI_SUCCESS; + BOOLEAN isTrue = FALSE; + PAGE_INFO *pageInfo = NULL; + + status = _GetPageInfo(PgIndex, &pageInfo); + ASSERT_ERROR_STATUS(status); + isTrue = pageInfo->PageParentID == 0? TRUE : FALSE; + +DONE: + return isTrue; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: GetPageHiiId +// +// Description: Get the Page Title String Index +// +// Parameter: IN UINT32 PgIndex +// OUT UINT16 *PageId +// +// Return Value: EFI_STATUS +// EFI_SUCCESS +// EFI_NOT_READY +// EFI_INVALID_PARAMETER +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS GetPageHiiId(UINT32 PgIndex, UINT16 *PageId) +{ + EFI_STATUS status = EFI_SUCCESS; + PAGE_INFO *pageInfo = NULL; + + status = _GetPageInfo(PgIndex, &pageInfo); + ASSERT_ERROR_STATUS(status); + + *PageId = pageInfo->PageFormID; + +DONE: + return status; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: GetPageParentId +// +// Description: Get the parent page ID from the page index +// +// Parameter: IN UINT32 PgIndex - Current page Index/ID +// OUT UINT16 *PageParentId - Parent page ID +// +// Return Value: EFI_STATUS +// EFI_SUCCESS +// EFI_NOT_READY +// EFI_INVALID_PARAMETER +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS GetPageParentId(UINT32 PgIndex, UINT16 *PageParentId) +{ + EFI_STATUS status = EFI_SUCCESS; + PAGE_INFO *pageInfo = NULL; + + status = _GetPageInfo(PgIndex, &pageInfo); + ASSERT_ERROR_STATUS(status); + + *PageParentId = pageInfo->PageParentID; + +DONE: + return status; +} + +//<AMI_PHDR_START> +//--------------------------------------------------------------------------- +// Procedure: GetCtrlsDestCtrlId +// +// Description: Returns the QuestionID to select in the destination page +// +// Input: UINT32 PgIndex - ASL page ID +// UINT32 CtrlIndex - Control index, Lib control ID +// UINT16 *DestCtrlId - Destination control index +// +// Output: EFI_STATUS status +//--------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS GetCtrlsDestCtrlId(UINT32 PgIndex, UINT32 CtrlIndex, UINT16 *DestCtrlId) +{ + EFI_STATUS status = EFI_NOT_FOUND; + CONTROL_INFO *ctrlInfo = (CONTROL_INFO *)NULL; + + status = _GetControlInfo(PgIndex, CtrlIndex, &ctrlInfo); + ASSERT_ERROR_STATUS(status); + + *DestCtrlId = ctrlInfo->DestQuestionID; + +DONE: + return status; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: GetControlType +// +// Description: Get the AMI Control Type +// +// Parameter: IN UINT32 PgIndex +// IN UINT32 CtrlIndex +// OUT UINT16 *ctrlType +// +// Return Value: EFI_STATUS +// EFI_SUCCESS +// EFI_NOT_READY +// EFI_INVALID_PARAMETER +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS GetControlType(UINT32 PgIndex, UINT32 CtrlIndex, UINT16 *CtrlType) +{ + EFI_STATUS status = EFI_SUCCESS; + CONTROL_INFO *ctrlInfo = NULL; + + status = _GetControlInfo(PgIndex, CtrlIndex, &ctrlInfo); + ASSERT_ERROR_STATUS(status); + + *CtrlType = ctrlInfo->ControlType; + +DONE: + return status; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: GetControlQuestionPrompt +// +// Description: Get the Control Question Prompt's String Id +// +// Parameter: IN UINT32 PgIndex +// IN UINT32 CtrlIndex +// OUT UINT16 *ctrlPrompt +// +// Return Value: EFI_STATUS +// EFI_SUCCESS +// EFI_NOT_READY +// EFI_INVALID_PARAMETER +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS GetControlQuestionPrompt(UINT32 PgIndex, UINT32 CtrlIndex, UINT16 *CtrlPrompt) +{ + EFI_STATUS status = EFI_SUCCESS; + CONTROL_INFO *ctrlInfo = NULL; + + status = _GetControlInfo(PgIndex, CtrlIndex, &ctrlInfo); + ASSERT_ERROR_STATUS(status); + + *CtrlPrompt = ctrlInfo->QuestionId; +DONE: + return status; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: GetControlHelpStr +// +// Description: Get the Control Help String ID +// +// Parameter: IN UINT32 PgIndex +// IN UINT32 CtrlIndex +// OUT UINT16 *ctrlHelp +// +// Return Value: EFI_STATUS +// EFI_SUCCESS +// EFI_NOT_READY +// EFI_INVALID_PARAMETER +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS GetControlHelpStr(UINT32 PgIndex, UINT32 CtrlIndex, UINT16 *CtrlHelp) +{ + EFI_STATUS status = EFI_SUCCESS; + CONTROL_INFO *ctrlInfo = NULL; + + status = _GetControlInfo(PgIndex, CtrlIndex, &ctrlInfo); + ASSERT_ERROR_STATUS(status); + + *CtrlHelp = ctrlInfo->ControlHelp; +DONE: + return status; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: _GetCheckBoxOptions +// +// Description: Get the List of Options for the Checkbox Control +// +// Parameter: IN UINT32 PgIndex +// IN UINT32 CtrlIndex +// OUT UINTN *optionCount +// OUT OPTION_LIST *optionArray +// +// Return Value: EFI_STATUS +// EFI_SUCCESS +// EFI_NOT_READY +// EFI_INVALID_PARAMETER +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS _GetCheckBoxOptions(CONTROL_INFO *CtrlInfo, UINT32 *OptionCount, OPTION_LIST **OptionArray) +{ + EFI_STATUS status = EFI_SUCCESS; + OPTION_LIST *optList = NULL; + OPTION_LIST *temp = NULL; + EFI_IFR_CHECKBOX *checkBoxOp = (EFI_IFR_CHECKBOX*)(CtrlInfo->ControlPtr); + UINT32 index = 0; + + *OptionCount = CHECKBOX_OPTION_COUNT; + for(index = 0; index < *OptionCount; index++) + { + + temp = (OPTION_LIST*)EfiLibAllocateZeroPool(sizeof(OPTION_LIST)); + if(temp == NULL) + { + status = EFI_OUT_OF_RESOURCES; + + goto DONE; + } + + if(*OptionArray == NULL) + { + + *OptionArray = temp; + }else + { + + if(optList){ + optList->Next = temp; + } + } + optList = temp; + + // Option will be set In the Application + temp->Option = 0; + temp->Value = index; + temp->Flag = ((checkBoxOp->Flags & EFI_IFR_CHECKBOX_DEFAULT) == EFI_IFR_CHECKBOX_DEFAULT)? OPTION_DEFAULT : 0; + temp->Flag = ((checkBoxOp->Flags & EFI_IFR_CHECKBOX_DEFAULT_MFG) == EFI_IFR_CHECKBOX_DEFAULT_MFG)? OPTION_DEFAULT_MFG : 0; + temp->Next = NULL; + } + + +DONE: + + return status; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: IsControlCheckBox +// +// Description: Check if the control is a check box +// +// Parameter: IN UINT32 PgIndex +// IN UINT32 CtrlIndex +// +// Return Value: BOOLEAN +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +BOOLEAN IsControlCheckBox(UINT32 PgIndex, UINT32 CtrlIndex) +{ + BOOLEAN isCheckBox = FALSE; + CONTROL_INFO *ctrlInfo = NULL; + EFI_IFR_OP_HEADER *opHeader = NULL; + + _GetControlInfo(PgIndex, CtrlIndex, &ctrlInfo); + + opHeader = (EFI_IFR_OP_HEADER*)ctrlInfo->ControlPtr; + isCheckBox = (opHeader->OpCode == EFI_IFR_CHECKBOX_OP)? TRUE : FALSE; + + return isCheckBox; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: GetControlDataWidth +// +// Description: Get the Data size +// +// Parameter: UINT32 PgIndex, UINT32 CtrlIndex, UINT16 *controlWidth +// +// Return Value: EFI_STATUS +// EFI_SUCCESS +// EFI_NOT_READY +// EFI_INVALID_PARAMETER +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS GetControlDataWidth(UINT32 PgIndex, UINT32 CtrlIndex, UINT16 *CtrlWidth) +{ + EFI_STATUS status = EFI_SUCCESS; + CONTROL_INFO *ctrlInfo = NULL; + + status = _GetControlInfo(PgIndex, CtrlIndex, &ctrlInfo); + ASSERT_ERROR_STATUS(status); + + *CtrlWidth = (UINT16)GetControlDataLength(ctrlInfo)/*ctrlInfo->ControlDataWidth*/; +DONE: + return status; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: GetControlDestinationPage +// +// Description: +// +// Parameter: IN UINT32 PgIndex +// IN UINT32 CtrlIndex +// OUT UINT16 *ctrlDestPg +// +// Return Value: EFI_STATUS +// EFI_SUCCESS +// EFI_NOT_READY +// EFI_INVALID_PARAMETER +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS GetControlDestinationPage(UINT32 PgIndex, UINT32 CtrlIndex, UINT16 *CtrlDestPg) +{ + EFI_STATUS status = EFI_SUCCESS; + CONTROL_INFO *ctrlInfo = NULL; + + status = _GetControlInfo(PgIndex, CtrlIndex, &ctrlInfo); + ASSERT_ERROR_STATUS(status); + + *CtrlDestPg = ctrlInfo->ControlDestPageID; +DONE: + return status; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: GetControlAccess +// +// Description: Get the Control Access Specifier for a Control +// +// Parameter: IN UINT32 PgIndex +// IN UINT32 CtrlIndex +// +// Return Value: UINT8 +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +UINT8 GetControlAccess(UINT32 PgIndex, UINT32 CtrlIndex) +{ + CONTROL_FLAGS *flags = NULL; + + _GetControlFlag(PgIndex, CtrlIndex, &flags); + + return (UINT8)flags->ControlAccess; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: GetControlRefresh +// +// Description: Get the Control Refresh for a Control +// +// Parameter: IN UINT32 PgIndex +// IN UINT32 CtrlIndex +// +// Return Value: UINT8 +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +UINT8 GetControlRefresh(UINT32 PgIndex, UINT32 CtrlIndex) +{ + CONTROL_FLAGS *flags = NULL; + + _GetControlFlag(PgIndex, CtrlIndex, &flags); + + return (UINT8)flags->ControlRefresh; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: IsControlVisible +// +// Description: Get the Control Visiblity for a Control +// +// Parameter: IN UINT32 PgIndex +// IN UINT32 CtrlIndex +// +// Return Value: BOOLEAN +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +BOOLEAN IsControlVisible(UINT32 PgIndex, UINT32 CtrlIndex) +{ + CONTROL_FLAGS *flags = NULL; + + _GetControlFlag(PgIndex, CtrlIndex, &flags); + + return (BOOLEAN)flags->ControlVisible; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: IsControlResetRequired +// +// Description: Get the Control Reset status for a Control +// +// Parameter: IN UINT32 PgIndex +// IN UINT32 CtrlIndex +// +// Return Value: BOOLEAN +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +BOOLEAN IsControlResetRequired(UINT32 PgIndex, UINT32 CtrlIndex) +{ + CONTROL_FLAGS *flags = NULL; + + _GetControlFlag(PgIndex, CtrlIndex, &flags); + + return (BOOLEAN)flags->ControlReset; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: IsControlReadOnly +// +// Description: Get the Control Readonly Specifier for a Control +// +// Parameter: IN UINT32 PgIndex +// IN UINT32 CtrlIndex +// +// Return Value: BOOLEAN +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +BOOLEAN IsControlReadOnly(UINT32 PgIndex, UINT32 CtrlIndex) +{ + CONTROL_FLAGS *flags = NULL; + + _GetControlFlag(PgIndex, CtrlIndex, &flags); + + return (BOOLEAN)flags->ControlReadOnly; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: IsControlInteractive +// +// Description: Get the Control Interactive Specifier for a Control +// +// Parameter: IN UINT32 PgIndex +// IN UINT32 CtrlIndex +// +// Return Value: EFI_STATUS +// BOOLEAN +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +BOOLEAN IsControlInteractive(UINT32 PgIndex, UINT32 CtrlIndex) +{ + CONTROL_FLAGS *flags = (CONTROL_FLAGS *)NULL; + EFI_STATUS status = EFI_SUCCESS; + BOOLEAN isInteractive = FALSE; + + status = _GetControlFlag(PgIndex, CtrlIndex, &flags); + ASSERT_ERROR_STATUS(status); + + if(flags != NULL){ + isInteractive = (BOOLEAN)flags->ControlInteractive; + } + +DONE: + return isInteractive; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: EvaluateControlCondition +// +// Description: Evaluate control HII expression and return display Result +// +// Parameter: IN UINT32 PgIndex +// IN UINT32 CtrlIndex +// OUT UINTN *expResult +// +// Return Value: EFI_STATUS +// EFI_SUCCESS +// EFI_NOT_READY +// EFI_INVALID_PARAMETER +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS EvaluateControlCondition(UINT32 PgIndex, UINT32 CtrlIndex, UINTN *ExpResult) +{ + EFI_STATUS status = EFI_SUCCESS; + CONTROL_INFO *ctrlInfo = NULL; + + status = _GetControlInfo(PgIndex, CtrlIndex, &ctrlInfo); + ASSERT_ERROR_STATUS(status); + + *ExpResult = CheckControlCondition(ctrlInfo); + +DONE: + return status; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: GetQuestionValue +// +// Description: Get the Question Value +// +// Parameter: IN UINT32 PgIndex +// IN UINT32 CtrlIndex +// OUT UINT8 *Value +// OUT UINTN *ValueSize +// +// Return Value: EFI_STATUS +// EFI_SUCCESS +// EFI_NOT_READY +// EFI_INVALID_PARAMETER +// EFI_OUT_OF_RESOURCES +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS GetQuestionValue(UINT32 PgIndex, UINT32 CtrlIndex, UINT8 **Value, UINTN *ValueSize) +{ + EFI_STATUS status = EFI_SUCCESS; + EFI_IFR_QUESTION_HEADER *questionHdr = NULL; + CONTROL_INFO *ctrlInfo = NULL; + + status = _GetControlInfo(PgIndex, CtrlIndex, &ctrlInfo); + ASSERT_ERROR_STATUS(status); + + *ValueSize = GetControlDataLength(ctrlInfo); + *Value = (UINT8*)EfiLibAllocateZeroPool(*ValueSize); + if(*Value == NULL) + { + status = EFI_OUT_OF_RESOURCES; + + goto DONE; + } + + if(ctrlInfo->ControlType == CONTROL_TYPE_TEXT) + { + UINT16 textTwo = ((EFI_IFR_TEXT*)(ctrlInfo->ControlPtr))->TextTwo; + + MemCopy(*Value, &textTwo, *ValueSize); + goto DONE; + } + + questionHdr = (EFI_IFR_QUESTION_HEADER*)((UINT8*)ctrlInfo->ControlPtr + sizeof(EFI_IFR_OP_HEADER)); + status = VarGetValue(ctrlInfo->ControlVariable, questionHdr->VarStoreInfo.VarOffset, *ValueSize, Value); + ASSERT_ERROR_STATUS(status); + +DONE: + + return status; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: SetQuestionValue +// +// Description: Set the Value for a Question +// +// Parameter: IN UINT32 PgIndex +// IN UINT32 CtrlIndex +// IN UINT8 *Value +// IN UINTN ValueSize +// OUT UINT16 *ErrStrToken +// +// Return Value: EFI_STATUS +// EFI_SUCCESS +// EFI_NOT_READY +// EFI_INVALID_PARAMETER +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS SetQuestionValue(UINT32 PgIndex, UINT32 CtrlIndex, UINT8 *Value, UINTN ValueSize, UINT16 *ErrStrToken) +{ + EFI_STATUS status = EFI_SUCCESS; + EFI_IFR_QUESTION_HEADER *questionHdr = NULL; + CONTROL_INFO *ctrlInfo = NULL; + PAGE_INFO *pgInfo = NULL; + + status = _GetControlInfo(PgIndex, CtrlIndex, &ctrlInfo); + ASSERT_ERROR_STATUS(status); + + questionHdr = (EFI_IFR_QUESTION_HEADER*)((UINT8*)ctrlInfo->ControlPtr + sizeof(EFI_IFR_OP_HEADER)); + status = VarSetValue(ctrlInfo->ControlVariable, questionHdr->VarStoreInfo.VarOffset, ValueSize, Value); + ASSERT_ERROR_STATUS(status); + + status = _GetPageInfo(PgIndex, &pgInfo); + ASSERT_ERROR_STATUS(status); + + if(_InconsistenceCheck(pgInfo, ErrStrToken) == TRUE) + { + + status = EFI_INCONSISTENT_VALUE; + } + +DONE: + return status; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: SaveQuestionValues +// +// Description: Save all the values to the system +// +// Parameter: VOID +// +// Return Value: EFI_STATUS +// EFI_SUCCESS +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS SaveQuestionValues(UINT32 FormID) +{ + EFI_STATUS status = EFI_SUCCESS; + EFI_STATUS tempStatus = EFI_SUCCESS; + NVRAM_VARIABLE *nvPtr; + UINT32 i = 0; + UINT32 *varIDList = (UINT32*)EfiLibAllocateZeroPool(gVariables->VariableCount * sizeof(UINT32)); + + if(varIDList == NULL) + { + status = EFI_OUT_OF_RESOURCES; + + goto DONE; + } + + nvPtr = gVariableList; + gVarOffset = 0; +// gProFormOffset = 0; +// MemSet(gProcessedForms, MAX_FORMS_TO_PROCESS, 0); + CleargProcessedForms (); + status = _GetVariableIDList(FormID, &varIDList); + ASSERT_ERROR_STATUS(status); + for ( i = 0; i < gVariables->VariableCount; i++) + { + + if(nvPtr[varIDList[i]].Buffer == NULL) + { + + continue; + } + tempStatus = VarSetNvram(varIDList[i], nvPtr[varIDList[i]].Buffer, nvPtr[varIDList[i]].Size); + if(EFI_ERROR(tempStatus)) + { + status = tempStatus; + } + } + +DONE: + if (varIDList) { + MemFreePointer(&varIDList); + } + + + return status; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: FreeOptionList +// +// Description: +// +// Parameter: OPTION_LIST *OptionArray +// +// Return Value: VOID +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID FreeOptionList(OPTION_LIST *OptionArray) +{ + OPTION_LIST *optList = OptionArray; + + do + { + optList = OptionArray; + OptionArray = OptionArray->Next; + if(optList) + { + MemFreePointer(&optList); + } + }while(OptionArray); + +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: GetControlDisplayFormat +// +// Description: +// +// Parameter: UINT32 PgIndex +// UINT32 CtrlIndex +// UINT16 *Format +// +// Return Value: EFI_STATUS +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS GetControlDisplayFormat(UINT32 PgIndex, UINT32 CtrlIndex, UINT16 *Format) +{ + EFI_STATUS status = EFI_SUCCESS; + CONTROL_INFO *ctrlInfo; + + status = _GetControlInfo(PgIndex, CtrlIndex, &ctrlInfo); + ASSERT_ERROR_STATUS(status); + if(ctrlInfo->ControlType == CONTROL_TYPE_NUMERIC) + { + + *Format = ((EFI_IFR_NUMERIC*)ctrlInfo->ControlPtr)->Flags & EFI_IFR_DISPLAY; + } + +DONE: + return status; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: GetControlMinMax +// +// Description: +// +// Parameter: IN UINT32 PgIndex +// IN UINT32 CtrlIndex +// UINT64 *Min +// UINT64 *Max +// +// Return Value: EFI_STATUS +// EFI_SUCCESS +// EFI_NOT_READY +// EFI_INVALID_PARAMETER +// EFI_OUT_OF_RESOURCES +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS GetControlMinMax(UINT32 PgIndex, UINT32 CtrlIndex, UINT64 *Min, UINT64 *Max) +{ + EFI_STATUS status = EFI_SUCCESS; + CONTROL_INFO *ctrlInfo = NULL; + + status = _GetControlInfo(PgIndex, CtrlIndex, &ctrlInfo); + ASSERT_ERROR_STATUS(status); + + switch(ctrlInfo->ControlType) + { + case CONTROL_TYPE_NUMERIC: + case CONTROL_TYPE_PASSWORD: + case CONTROL_TYPE_POPUP_STRING: + + *Min = UefiGetMinValue(ctrlInfo->ControlPtr); + *Max = UefiGetMaxValue(ctrlInfo->ControlPtr); + break; + default: + + break; + } + +DONE: + return status; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: GetControlDefault +// +// Description: +// +// Parameter: IN UINT32 PgIndex +// IN UINT32 CtrlIndex +// UINT64 *Def +// BOOLEAN Optimal +// +// Return Value: EFI_STATUS +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS GetControlDefault(UINT32 PgIndex, UINT32 CtrlIndex,UINT8 *Def, BOOLEAN Optimal) +{ + EFI_STATUS status = EFI_SUCCESS; + CONTROL_INFO *ctrlInfo = NULL; + + + if(Def == NULL) + { + status = EFI_INVALID_PARAMETER; + + goto DONE; + } + status = _GetControlInfo(PgIndex, CtrlIndex, &ctrlInfo); + ASSERT_ERROR_STATUS(status); + + switch(ctrlInfo->ControlDataWidth) + { + /* + * ctrlInfo[sizeof(ctrlInfo)] + * Used when user selects load Optimal value + * + * ctrlInfo[sizeof(ctrlInfo) + valSize] + * Used when user selects load optimal value + */ + case 1: // BYTE + + *Def = Optimal? *((UINT8 *) ((UINT8 *)ctrlInfo + sizeof(*ctrlInfo))) : + *((UINT8 *) ((UINT8 *)ctrlInfo + sizeof(*ctrlInfo) + ctrlInfo->ControlDataWidth)); + break; + case 2: //WORD + + *((UINT16*)Def) = Optimal? *((UINT16 *) ((UINT8 *)ctrlInfo + sizeof(*ctrlInfo))) : + *((UINT16 *) ((UINT8 *)ctrlInfo + sizeof(*ctrlInfo) + ctrlInfo->ControlDataWidth)); + break; + case 4: //DWORD + + *((UINT32*)Def) = Optimal? *((UINT32 *) ((UINT8 *)ctrlInfo + sizeof(*ctrlInfo))) : + *((UINT32 *) ((UINT8 *)ctrlInfo + sizeof(*ctrlInfo) + ctrlInfo->ControlDataWidth)); + break; + case 8: //QWORD + + *((UINT64*)Def) = Optimal? *((UINT64 *) ((UINT8 *)ctrlInfo + sizeof(*ctrlInfo))) : + *((UINT64 *) ((UINT8 *)ctrlInfo + sizeof(*ctrlInfo) + ctrlInfo->ControlDataWidth)); + break; + default: + break; + } + +DONE: + + return status; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: GetOrderedListMaxEntries +// +// Description: Create a Timer Event +// +// Input: UINT32 PgIndex, UINT32 CtrlIndex, UINT8 *MaxEntry +// +// Output: EFI_STATUS +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS GetOrderedListMaxEntries(UINT32 PgIndex, UINT32 CtrlIndex, UINT8 *MaxEntry) +{ + EFI_STATUS status = EFI_SUCCESS; + CONTROL_INFO *ctrlInfo = NULL; + + status = _GetControlInfo(PgIndex, CtrlIndex, &ctrlInfo); + ASSERT_ERROR_STATUS(status); + + *MaxEntry = 0; + if(ctrlInfo->ControlType == CONTROL_TYPE_ORDERED_LIST) + { + *MaxEntry = UefiGetMaxEntries(ctrlInfo->ControlPtr); + } +DONE: + return status; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: GetOrderedListOptionDataWidth +// +// Description: Gets OrderedList Data Width +// +// Parameter: CONTROL_INFO *ControlInfo, UINT32 *DataWidth +// +// Output: EFI_STATUS +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS GetOrderedListOptionDataWidth(CONTROL_INFO *ControlInfo, UINT32 *DataWidth) +{ + EFI_STATUS Status = EFI_SUCCESS; + EFI_IFR_OP_HEADER *OpHeader = NULL; + EFI_IFR_ONE_OF_OPTION *OneOfOptionOp = NULL; + + OpHeader = (EFI_IFR_OP_HEADER*)ControlInfo->ControlPtr; + + if(OpHeader->OpCode != EFI_IFR_ORDERED_LIST_OP) + { + Status = EFI_UNSUPPORTED; + goto DONE; + } + + do + { + OpHeader = (EFI_IFR_OP_HEADER*)((UINT8*)ControlInfo->ControlPtr + OpHeader->Length); + }while(OpHeader->OpCode != EFI_IFR_ONE_OF_OPTION_OP); + + OneOfOptionOp = (EFI_IFR_ONE_OF_OPTION*)OpHeader; + + switch(OneOfOptionOp->Type) + { + case EFI_IFR_TYPE_NUM_SIZE_16: + *DataWidth = sizeof(UINT16); + break; + case EFI_IFR_TYPE_NUM_SIZE_32: + *DataWidth = sizeof(UINT32); + break; + case EFI_IFR_TYPE_NUM_SIZE_64: + *DataWidth = sizeof(UINT64); + break; + case EFI_IFR_TYPE_NUM_SIZE_8: + default: + *DataWidth = sizeof(UINT8); + break; + } + +DONE: + return Status; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: GetOrderedListDataTypeWidth +// +// Description: Gets OrderedList DataType Width +// +// Parameter: UINT32 PgIndex, UINT32 CtrlIndex, UINT32 *DataWidth +// +// Output: EFI_STATUS +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS GetOrderedListDataTypeWidth(UINT32 PgIndex, UINT32 CtrlIndex, UINT32 *DataWidth) +{ + EFI_STATUS Status = EFI_SUCCESS; + CONTROL_INFO *CtrlInfo = NULL; + + Status = _GetControlInfo(PgIndex, CtrlIndex, &CtrlInfo); + if(EFI_ERROR(Status)) + { + goto DONE; + } + + Status = GetOrderedListOptionDataWidth(CtrlInfo, DataWidth); + +DONE: + return Status; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: IsPageRefreshable +// +// Description: Is this page can be refreshable +// +// Parameter: IN UINT32 PgIndex +// +// Return Value: BOOLEAN +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +BOOLEAN IsPageRefreshable(UINT32 PgIndex) +{ + EFI_STATUS status = EFI_SUCCESS; + BOOLEAN isTrue = FALSE; + PAGE_INFO *pageInfo = NULL; + + status = _GetPageInfo(PgIndex, &pageInfo); + ASSERT_ERROR_STATUS(status); + isTrue = pageInfo->PageFlags.PageRefresh ? TRUE : FALSE; + +DONE: + return isTrue; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: IfNoCommitVariable +// +// Description: Is this a no commit variable +// +// Parameter: IN UINT32 PgIndex +// IN UINT32 CtrlIndex +// +// Return Value: BOOLEAN +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +BOOLEAN IfNoCommitVariable(UINT32 PgIndex, UINT32 CtrlIndex) +{ + EFI_STATUS status = EFI_SUCCESS; + BOOLEAN isTrue = FALSE; + CONTROL_INFO *CtrlInfo = NULL; + VARIABLE_INFO *varInfo = NULL; + + status = _GetControlInfo(PgIndex, CtrlIndex, &CtrlInfo); + ASSERT_ERROR_STATUS(status); + varInfo = VarGetVariableInfoIndex(CtrlInfo->ControlVariable); + if((varInfo != NULL) && (varInfo->ExtendedAttibutes /*& AMI_SPECIAL_NO_COMMIT_VARIABLE*/)){ //If the variable is valid and set to NO_COMMIT + isTrue = TRUE; + } +DONE: + return isTrue; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: IdentifyFormHasDefault +// +// Description: Is this formset has the default set +// +// Parameter: IN UINT32 FormID +// +// Return Value: BOOLEAN +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +BOOLEAN IdentifyFormHasDefault(UINT32 FormID) +{ + EFI_STATUS status = EFI_SUCCESS; + UINT32 count = 0; + UINT32 index = 0; + CONTROL_INFO *ctrlInfo; + BOOLEAN isDefault = FALSE; + +// gProcessedForms[gProFormOffset++] = FormID; + AddEntryIngProcessedForms (FormID); + + status = GetNumOfControls(FormID, &count); + ASSERT_ERROR_STATUS(status); + + for(index = 0; index < count; index++) + { + + status = _GetControlInfo(FormID, index, &ctrlInfo); + ASSERT_ERROR_STATUS(status); + + if((ctrlInfo->ControlType == CONTROL_TYPE_SUBMENU)//If submenu traverse recursively through the sub forms + || (ctrlInfo->ControlType == CONTROL_TYPE_REF2)) + { + + if(_DestinationFormProcessed(ctrlInfo->ControlDestPageID) == FALSE)//If the form has not be processed already + { + isDefault = IdentifyFormHasDefault(ctrlInfo->ControlDestPageID); + if(isDefault) + { + break; + } + } + } + + if(ctrlInfo->ControlType == CONTROL_TYPE_CHECKBOX || //Check for the control is checkbox + ctrlInfo->ControlFlags.ControlEvaluateDefault || //or if the control has the Evaluate default bit set + ctrlInfo->ControlDataWidth) // or if the ControlDataWidth is set to the size of the defaults + { + isDefault = TRUE; + break; + } + }//end of for loop of controls + +DONE: + return isDefault; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: IsFormsetHasDefault +// +// Description: Is this formset has the default set +// +// Parameter: IN UINT32 FormID +// +// Return Value: BOOLEAN +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +BOOLEAN IsFormsetHasDefault(UINT32 FormID) +{ + BOOLEAN isDefault = FALSE; + +// gProFormOffset = 0; +// MemSet(gProcessedForms, MAX_FORMS_TO_PROCESS, 0); + CleargProcessedForms (); + isDefault = IdentifyFormHasDefault(FormID); + + return isDefault; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: GetPageGuidFromFormId +// +// Description: To get the form GUID from the page index +// +// Input: UINT32 PgIndex +// EFI_GUID *FormGuid +// +// Output: EFI_STATUS +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS GetPageGuidFromPgIndex(UINT32 PgIndex, EFI_GUID *FormGuid) +{ + EFI_STATUS status = EFI_INVALID_PARAMETER; + PAGE_INFO *pgInfo = (PAGE_INFO *)NULL; + PAGE_ID_INFO *pageIdInfo = (PAGE_ID_INFO*)NULL; + + status = _GetPageInfo(PgIndex, &pgInfo); + ASSERT_ERROR_STATUS(status); + + if(gPages && gPageIdList && pgInfo) + { + pageIdInfo = (PAGE_ID_INFO *)(((UINT8 *) gPageIdList) + gPageIdList->PageIdList[pgInfo->PageIdIndex]); + if(pageIdInfo) + { + MemCopy(FormGuid, &pageIdInfo->PageGuid, sizeof(EFI_GUID)); + } + } + +DONE: + return status; +} +//EIP81814 Ends + +//EIP 86885 Starts +//<AMI_PHDR_START> +//-------------------------------------------------------------------------------------- +// Procedure: UefiVarsetnvramforCurrentform +// +// Description: Save the values for the passed pageID +// If this function is not called as part of browser action then it is +// caller responsibility to reset the gProFormOffset and gProcessedForms +// gProFormOffset = 0; +// MemSet (gProcessedForms, MAX_FORMS_TO_PROCESS, 0); +// +// Input: UINT32 - page ID to save the values +// +// Output: EFI_STATUS - Status of the operation +//-------------------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS UefiVarsetnvramforCurrentform (UINT32 FormID) +{ + EFI_STATUS status = EFI_SUCCESS; + UINT32 count = 0; + UINT32 index = 0; + CONTROL_INFO *ctrlInfo; + UINT8 *tempLoadVarBuff = (UINT8 *)NULL; + UINT8 *CurrentValue = NULL; + UINTN CurVarSize = 0; + UINT32 size = 0; + UINT32 offset = 0; + VARIABLE_INFO *varInfo = (VARIABLE_INFO *)NULL; + +// gProcessedForms [gProFormOffset++] = FormID; + AddEntryIngProcessedForms (FormID); + + status = GetNumOfControls (FormID, &count); + ASSERT_ERROR_STATUS (status); + + for(index = 0; index < count; index++) + { + status = _GetControlInfo(FormID , index, &ctrlInfo); + ASSERT_ERROR_STATUS(status); + + if (NULL == ctrlInfo->ControlPtr) //EIP-Setup crashes when clicking Discard and Exit goto control in simulator + continue; + + if((ctrlInfo->ControlType == CONTROL_TYPE_SUBMENU) || (ctrlInfo->ControlType == CONTROL_TYPE_REF2)) + { + if(_DestinationFormProcessed(ctrlInfo->ControlDestPageID) == FALSE) + { + UefiVarsetnvramforCurrentform(ctrlInfo->ControlDestPageID); + } + continue; + } + tempLoadVarBuff = VarGetNvram( ctrlInfo->ControlVariable, &CurVarSize ); + if (NULL == tempLoadVarBuff) + { + continue; + } + offset = UefiGetQuestionOffset (ctrlInfo->ControlPtr); + if(CONTROL_TYPE_ORDERED_LIST == ctrlInfo->ControlType) + { + UINTN Type = 0; + UefiGetValidOptionType (ctrlInfo, &Type, &size); + size = (UefiGetMaxEntries (ctrlInfo->ControlPtr)) * size; + } + else + { + size = UefiGetWidth(ctrlInfo->ControlPtr); + } + if (0 == size) + { + continue; + } + CurrentValue = EfiLibAllocateZeroPool(size); + if(CurrentValue == NULL) + { + return EFI_OUT_OF_RESOURCES; + } + status = VarGetValue(ctrlInfo->ControlVariable, offset, size, CurrentValue ); + if (!EFI_ERROR (status)) + { + MemCopy ( tempLoadVarBuff+offset, CurrentValue, size ); + + varInfo = VarGetVariableInfoIndex (ctrlInfo->ControlVariable); + if(varInfo == NULL) + { + continue; + } + + if((varInfo->ExtendedAttibutes & AMI_SPECIAL_VARIABLE_NO_SET) == AMI_SPECIAL_VARIABLE_NO_SET) + { + // Don't save the variable + continue; + } + else + { + if(UefiIsEfiVariable(ctrlInfo->ControlVariable, varInfo)) + { + VarSetNvramName( varInfo->VariableName, &varInfo->VariableGuid, varInfo->VariableAttributes, tempLoadVarBuff, CurVarSize ); + } + else + { + UefiVarSetNvram(varInfo, tempLoadVarBuff, VAR_ZERO_OFFSET, CurVarSize); + } + } + } + MemFreePointer ((VOID **)&tempLoadVarBuff); + MemFreePointer ((VOID **)&CurrentValue); + } +DONE: + return status; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: UefiLoadPreviousValuesforCurrentform +// +// Description: Loads previous value for the current form +// +// Input: FormID - Current page ID +// +// Output: EFI_STATUS +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS UefiLoadPreviousValuesforCurrentform(UINT32 FormID) +{ + EFI_STATUS status = EFI_SUCCESS; + UINT32 count = 0; + UINT32 index = 0; + CONTROL_INFO *ctrlInfo; + UINT8 *tempLoadVarBuff = (UINT8 *)NULL; + UINT8 *CurrentValue = NULL; + UINTN CurVarSize = 0; + UINT32 size = 0; + UINT32 offset = 0; + +// gProcessedForms [gProFormOffset++] = FormID; + AddEntryIngProcessedForms (FormID); + + status = GetNumOfControls (FormID, &count); + ASSERT_ERROR_STATUS (status); + + for(index = 0; index < count; index++) + { + status = _GetControlInfo(FormID , index, &ctrlInfo); + ASSERT_ERROR_STATUS(status); + + if (NULL == ctrlInfo->ControlPtr) //EIP-126997 Avoid setup crash + continue; + + if((ctrlInfo->ControlType == CONTROL_TYPE_SUBMENU) || (ctrlInfo->ControlType == CONTROL_TYPE_REF2)) + { + if(_DestinationFormProcessed(ctrlInfo->ControlDestPageID) == FALSE) + { + UefiVarsetnvramforCurrentform(ctrlInfo->ControlDestPageID); + } + } + tempLoadVarBuff = VarGetNvram (ctrlInfo->ControlVariable, &CurVarSize); + if (NULL == tempLoadVarBuff) + { + continue; + } + offset = UefiGetQuestionOffset (ctrlInfo->ControlPtr); + if (CONTROL_TYPE_ORDERED_LIST == ctrlInfo->ControlType) + { + UINTN Type = 0; + UefiGetValidOptionType (ctrlInfo, &Type, &size); + size = (UefiGetMaxEntries (ctrlInfo->ControlPtr)) * size; + } + else + { + size = UefiGetWidth (ctrlInfo->ControlPtr); + } + CurrentValue = EfiLibAllocateZeroPool(size); + if(CurrentValue == NULL) + { + return EFI_OUT_OF_RESOURCES; + } + status = VarGetValue (ctrlInfo->ControlVariable, offset, size, CurrentValue); + if (!EFI_ERROR (status)) + { + MemCopy (gVariableList [ctrlInfo->ControlVariable].Buffer + offset, tempLoadVarBuff + offset, size); + } + MemFreePointer ((VOID **)&tempLoadVarBuff); + MemFreePointer ((VOID **)&CurrentValue); + } +DONE: + return status; +} +//EIP 86885 Ends + +///////////////EIP 162180 Starts////////////////////////// +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: CleargProcessedForms +// +// Description: Clears gProcessedForms data +// +// Input: void +// +// Output: void +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +void CleargProcessedForms (void) +{ + gProFormOffset = 0; + MemSet(gProcessedForms, (gProFormOffsetAllocCount * sizeof (UINT32)), 0); +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: AddEntryIngProcessedForms +// +// Description: Adds the formid in gProcessedForms +// +// Input: UINT32 FormID +// +// Output: void +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +void AddEntryIngProcessedForms (UINT32 FormID) +{ + if (gProFormOffset >= gProFormOffsetAllocCount) //Check if enough size has been already allocated + { + gProcessedForms = MemReallocateZeroPool (gProcessedForms, gProFormOffsetAllocCount * sizeof (UINT32), (gProFormOffsetAllocCount + MAX_FORMS_TO_PROCESS) * sizeof (UINT32)); + if (NULL == gProcessedForms) + { + return; + } + gProFormOffsetAllocCount += MAX_FORMS_TO_PROCESS; + } + gProcessedForms [gProFormOffset++] = FormID; +} +///////////////EIP 162180 Ends////////////////////////// +//********************************************************************** +//********************************************************************** +//** ** +//** (C)Copyright 1985-2013, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Pkwy, Building 200,Norcross, Georgia 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//********************************************************************** +//**********************************************************************
\ No newline at end of file |