//*****************************************************************// //*****************************************************************// //*****************************************************************// //** **// //** (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.0/uefi20Wapper.c $ // // $Author: Arunsb $ // // $Revision: 34 $ // // $Date: 5/02/14 10:38p $ // //*****************************************************************// //*****************************************************************// // Revision History // ---------------- // $Log: /Alaska/SOURCE/Modules/AMITSE2_0/AMITSE/uefi2.0/uefi20Wapper.c $ // // 34 5/02/14 10:38p Arunsb // gEnableProcessPack variable added to avoid build error // // 33 6/10/13 2:15p Arunsb // EvaluateControlDefault function added to avoid build error in 2.0 // // 32 3/25/13 8:34a 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 // // 31 10/18/12 6:00a Arunsb // Updated for 2.16.1235 QA submission // // 18 10/10/12 12:39p Arunsb // Synched the source for v2.16.1232, backup with Aptio // // 28 9/25/12 1:45p Premkumara // EIP - 99059 - Updated for UEFI2.0 // Files - Hii.c, Uefi20Wapper.c // // 27 2/02/12 2:56a 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 // // 26 12/08/11 9:37a Rajashakerg // [TAG] EIP75588 // [Category] Improvement // [Description] Updated the file to aviod build errors when build for // UEFI 20 by providing the dummy functions. // // 25 12/02/11 1:52a Premkumara // [TAG] EIP73226 // [Category] New Feature // [Description] Extended support for password prompt // [Files] FakeToken.c, Uefi21Wapper.c, AmiTSEStr.uni, PopupPassword.c, // HiiCallBack.c, Uefi20Wapper.c // // 24 12/01/11 7:16p Blaines // Fix build errors in Uefi2.0 // // 23 11/28/11 5:06a 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 // // 22 11/23/11 5:24a 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 // // 21 10/18/11 1:50p 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, // uefi20Wapper.c // // 20 6/30/11 4:15a Arunsb // [TAG] EIP57661 // [Category] New Feature // [Description] Boot manager algorithm for interaction with Driver // Health protocol. // Wrapper functions added. // [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. // // 19 6/28/11 3:44p Arunsb // [TAG] EIP55762 // [Description] Dummy UpdateDestiantionQuestion function added // // 18 4/29/11 4:39p Arunsb // For 2.13 public patch release IFR RefX feature is omitted // // 16 3/28/11 5:03p 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 // // 15 3/09/11 7:25p 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 // // 14 2/01/11 7:41p Madhans // [TAG] - EIP 52032 // [Category]- Defect // [Severity]- Mordarate // [Symptom] - In UEFI2.0 Updating the Interactive One of Control may not // work correctly. // [RootCause] - The UefiGetControlKey for Interactive one of control is // not returned properly. // [Solution]- fix in UefiGetControlKey control. // [Files] - uefi20wapper.c // // 13 2/01/11 7:37p 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 // // 12 12/02/10 6:09p Madhans // [TAG] - EIP49562 // [Category]- Improvment. // [Severity]- Mordarate // [Symptom]- Need to support UEFI 2.2 requirements related to Calling // Formcallback with // EFI_BROWSER_ACTION_CHANGING and EFI_BROWSER_ACTION_CHANGED action. // [Solution]- Implemented the support. // [Files] - submenu.c, numeric.c, popupsel.c, popupString.c, // uefi20\hii.h, uefi20\uefi20wrapper.c // uefi21\hiicalback.c, uefi21\tseuefihii.h // // 11 9/16/10 8:38p Madhans // Update for TSE 2.10. Refer Changelog.log for more details. // // 10 6/15/10 12:16p Blaines // Update functon prototype for UefiSetTime and UefiGetTime // // 9 6/04/10 12:53p Blaines // Add support for UEFI 2.1 date and time controls // // 8 2/19/10 1:04p Madhans // Updated for TSE 2.01. Refer Changelog.log for File change history. // // 11 2/19/10 8:20a Mallikarjunanv // updated year in copyright message // // 10 1/29/10 4:34p Madhans // To avoid compiler warnings. // // 9 1/27/10 12:59p Madhans // // EIP 33804 : Issue iSCSI initiator name is not saved.. // // 8 1/09/10 7:30a Mallikarjunanv // Updated TSE2.01 Release sources with coding standards // // 7 10/19/09 10:52a Blaines // EIP #26029 Fix: UefiCreateOneOfWithOptionsTemplate() does not always // return NULL when EfiLibAllocateZeroPool() returns NULL // // 6 7/09/09 12:30p Mallikarjunanv // updated the password encoding fix // // 4 6/24/09 6:11p Madhans // Made TSE_USE_EDK_LIBRARY=OFF to not to refer EDK module. // // 3 6/23/09 6:51p Blaines // Coding standard update, // Remove spaces from file header to allow proper chm function list // creation. // // 2 6/12/09 7:44p Presannar // Initial implementation of coding standards for AMITSE2.0 // // 1 6/04/09 8:05p Madhans // // 1 4/28/09 11:09p Madhans // Tse 2.0 Code complete Checkin. // // 4 4/28/09 9:40p Madhans // Tse 2.0 Code complete Checkin. // // 3 3/31/09 4:14p Madhans // UEFI Wrapper improvments. // // 2 1/30/09 6:06p Madhans // Function headers added. // // 1 12/18/08 7:59p Madhans // Intial version of TSE Lite sources // // //*****************************************************************// //*****************************************************************// // //---------------------------------------------------------------------------- // // Name: uefi20wraper.c // // Description: This file contains code for UEFI2.0 wrapper // //---------------------------------------------------------------------------- // #include "minisetup.h" #include EFI_PROTOCOL_DEFINITION(Hii) #include EFI_PROTOCOL_DEFINITION(FormCallback) extern EFI_HII_PROTOCOL *gHiiProtocol; BOOLEAN gPackUpdatePending = FALSE; BOOLEAN gEnableProcessPack = FALSE; //Added to avoid build error 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 }; UINTN gTitle = (UINTN)&_Title; UINTN gHelp = (UINTN)&_Help; UINTN gSubTitle = (UINTN)&_SubTitle; UINTN gHelpTitle = (UINTN)&_HelpTitle; UINTN gNavStrings = (UINTN)&_NavStrings; EFI_IFR_FORM_SET *HiiGetFormSetFromHandle( /*EFI_HII_HANDLE*/VOID* handle ); EFI_IFR_FORM_SET *HiiGetFormSet( UINTN index ); VOID *UefiCreateStringTemplate(UINT16 Token); UINT32 FindVarFromITKQuestionId(UINT16 QuestionId); UINT32 GetVarNumFromVarID(UINT32 ID); VOID UefiSetHelpField(VOID *IfrPtr,UINT16 Token); ////For avoiding build error EIP101564 UINT32 gRefreshIdCount = 0; //No. of controls with Refresh Id set REFRESH_ID_INFO *gRefreshIdInfo = NULL; // //---------------------------------------------------------------------------- // Procedure: UefiGetHelpField // // Description: To get the specific help field // // Input: VOID *IfrPtr // // Output: Help Field // //---------------------------------------------------------------------------- // UINT16 UefiGetHelpField(VOID *IfrPtr) { EFI_IFR_OP_HEADER *OpHeader=(EFI_IFR_OP_HEADER *)IfrPtr; switch(OpHeader->OpCode) { case EFI_IFR_REF_OP: return ((EFI_IFR_REF*)OpHeader)->Help; break; case EFI_IFR_TEXT_OP: return ((EFI_IFR_TEXT*)OpHeader)->Help; break; case EFI_IFR_ONE_OF_OP: return ((EFI_IFR_ONE_OF*)OpHeader)->Help; break; case EFI_IFR_TIME_OP: case EFI_IFR_DATE_OP: case EFI_IFR_NUMERIC_OP: return ((EFI_IFR_NUMERIC*)OpHeader)->Help; break; case EFI_IFR_PASSWORD_OP: return ((EFI_IFR_PASSWORD*)OpHeader)->Help; break; case EFI_IFR_STRING_OP: return ((EFI_IFR_STRING*)OpHeader)->Help; break; default: break; } return 0; } // //---------------------------------------------------------------------------- // Procedure: UefiSetHelpField // // Description: To Set the specific help field // // Input: VOID *IfrPtr, UINT16 Token // // Output: VOID // //---------------------------------------------------------------------------- // 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)->Help = Token ; break; case EFI_IFR_TEXT_OP: ((EFI_IFR_TEXT*)OpHeader)->Help = Token ; break; case EFI_IFR_ONE_OF_OP: ((EFI_IFR_ONE_OF*)OpHeader)->Help = Token ; break; case EFI_IFR_TIME_OP: case EFI_IFR_DATE_OP: case EFI_IFR_NUMERIC_OP: ((EFI_IFR_NUMERIC*)OpHeader)->Help = Token ; break; case EFI_IFR_PASSWORD_OP: ((EFI_IFR_PASSWORD*)OpHeader)->Help = Token ; break; case EFI_IFR_STRING_OP: ((EFI_IFR_STRING*)OpHeader)->Help = Token ; break; default: break; } } // //---------------------------------------------------------------------------- // Procedure: UefiGetPromptField // // Description: To get the prompt field from ifr // // Input: VOID *IfrPtr // // Output: Prompt Field // //---------------------------------------------------------------------------- // UINT16 UefiGetPromptField(VOID *IfrPtr) { EFI_IFR_OP_HEADER *OpHeader=(EFI_IFR_OP_HEADER *)IfrPtr; switch(OpHeader->OpCode) { case EFI_IFR_REF_OP: return ((EFI_IFR_REF*)OpHeader)->Prompt; break; case EFI_IFR_NUMERIC_OP: case EFI_IFR_TIME_OP: case EFI_IFR_DATE_OP: return ((EFI_IFR_NUMERIC*)OpHeader)->Prompt; break; case EFI_IFR_ONE_OF_OP: return ((EFI_IFR_ONE_OF*)OpHeader)->Prompt; break; case EFI_IFR_ORDERED_LIST_OP: return ((EFI_IFR_ORDERED_LIST*)OpHeader)->Prompt; break; case EFI_IFR_CHECKBOX_OP: return ((EFI_IFR_CHECK_BOX*)OpHeader)->Prompt; break; case EFI_IFR_PASSWORD_OP: return ((EFI_IFR_PASSWORD*)OpHeader)->Prompt; break; case EFI_IFR_STRING_OP: return ((EFI_IFR_STRING*)OpHeader)->Prompt; break; default: break; } return 0; } // //---------------------------------------------------------------------------- // Procedure: UefiGetKeyField // // Description: To get the Key field from ifr // // Input: VOID *IfrPtr // // Output: Key Field // //---------------------------------------------------------------------------- // UINT16 UefiGetKeyField(VOID *IfrPtr) { EFI_IFR_OP_HEADER *OpHeader=(EFI_IFR_OP_HEADER *)IfrPtr; switch(OpHeader->OpCode) { case EFI_IFR_REF_OP: return ((EFI_IFR_REF*)OpHeader)->Key; break; case EFI_IFR_NUMERIC_OP: return ((EFI_IFR_NUMERIC*)OpHeader)->Key; break; case EFI_IFR_PASSWORD_OP: return ((EFI_IFR_PASSWORD*)OpHeader)->Key; break; case EFI_IFR_TEXT_OP: return ((EFI_IFR_TEXT*)OpHeader)->Key; break; case EFI_IFR_CHECKBOX_OP: return ((EFI_IFR_CHECK_BOX*)OpHeader)->Key; break; case EFI_IFR_ONE_OF_OP: case EFI_IFR_ORDERED_LIST_OP: if(OpHeader->OpCode == EFI_IFR_ORDERED_LIST_OP) OpHeader = (EFI_IFR_OP_HEADER *)(((UINT8 *)OpHeader) +sizeof(EFI_IFR_ORDERED_LIST) ); else OpHeader = (EFI_IFR_OP_HEADER *)(((UINT8 *)OpHeader) +sizeof(EFI_IFR_ONE_OF) ); return ((EFI_IFR_ONE_OF_OPTION*)OpHeader)->Key; break; case EFI_IFR_ONE_OF_OPTION_OP: return ((EFI_IFR_ONE_OF_OPTION*)OpHeader)->Key; break; case EFI_IFR_STRING_OP: return ((EFI_IFR_STRING*)OpHeader)->Key; break; default: break; } return 0; } // //---------------------------------------------------------------------------- // Procedure: UefiGetTitleField // // Description: To get the Title field from ifr // // Input: VOID *IfrPtr // // Output: Title Field // //---------------------------------------------------------------------------- // UINT16 UefiGetTitleField(VOID *IfrPtr) { EFI_IFR_OP_HEADER *OpHeader=(EFI_IFR_OP_HEADER *)IfrPtr; switch(OpHeader->OpCode) { case EFI_IFR_SUBTITLE_OP: return ((EFI_IFR_SUBTITLE*)OpHeader)->SubTitle; break; case EFI_IFR_FORM_OP: return ((EFI_IFR_FORM*)OpHeader)->FormTitle; break; default: break; } return 0; } // //---------------------------------------------------------------------------- // Procedure: UefiGetFlagsField // // Description: to get the Flags field from ifr // // Input: VOID *IfrPtr // // Output: Flags Field // //---------------------------------------------------------------------------- // UINT8 UefiGetFlagsField(VOID *IfrPtr) { EFI_IFR_OP_HEADER *OpHeader=(EFI_IFR_OP_HEADER *)IfrPtr; switch(OpHeader->OpCode) { case EFI_IFR_REF_OP: return ((EFI_IFR_REF*)OpHeader)->Flags; break; default: break; } return 0; } // //---------------------------------------------------------------------------- // Procedure: UefiIsInteractive // // Description: To get Uefi Interactive // // Input: CONTROL_INFO *ControlData // // Output: TRUE/FALSE // //---------------------------------------------------------------------------- // BOOLEAN UefiIsInteractive(CONTROL_INFO *ControlData) { EFI_IFR_OP_HEADER *OpHeader=(EFI_IFR_OP_HEADER *)ControlData->ControlPtr; switch(OpHeader->OpCode) { case EFI_IFR_REF_OP: return ((((EFI_IFR_REF*)OpHeader)->Flags & EFI_IFR_FLAG_INTERACTIVE)?TRUE:FALSE); break; case EFI_IFR_NUMERIC_OP: return ((((EFI_IFR_NUMERIC*)OpHeader)->Flags & EFI_IFR_FLAG_INTERACTIVE)?TRUE:FALSE); break; case EFI_IFR_STRING_OP: return ((((EFI_IFR_STRING*)OpHeader)->Flags & EFI_IFR_FLAG_INTERACTIVE)?TRUE:FALSE); break; case EFI_IFR_PASSWORD_OP: return ((((EFI_IFR_PASSWORD*)OpHeader)->Flags & EFI_IFR_FLAG_INTERACTIVE)?TRUE:FALSE); break; default: break; } return FALSE; } // //---------------------------------------------------------------------------- // Procedure: UefiGetControlKey // // Description: Helper function in obtaining Control Key // // Input: CONTROL_INFO *ControlData // // Output: Key Field // //---------------------------------------------------------------------------- // UINT16 UefiGetControlKey(CONTROL_INFO *ControlData) { return UefiGetKeyField((VOID*)ControlData->ControlPtr); } // //---------------------------------------------------------------------------- // Procedure: UefiGetTextField // // Description: Function to get the Text Field. // // Input: VOID *IfrPtr // // Output: Text Field // //---------------------------------------------------------------------------- // UINT16 UefiGetTextField(VOID *IfrPtr) { EFI_IFR_OP_HEADER *OpHeader=(EFI_IFR_OP_HEADER *)IfrPtr; switch(OpHeader->OpCode) { case EFI_IFR_TEXT_OP: return ((EFI_IFR_TEXT*)OpHeader)->Text; break; default: break; } return 0; } // //---------------------------------------------------------------------------- // Procedure: UefiGetTextTwoField // // Description: Function to get the Text Field. // // Input: VOID *IfrPtr // // Output: Text Field // //---------------------------------------------------------------------------- // UINT16 UefiGetTextTwoField(VOID *IfrPtr) { EFI_IFR_OP_HEADER *OpHeader=(EFI_IFR_OP_HEADER *)IfrPtr; switch(OpHeader->OpCode) { case EFI_IFR_TEXT_OP: return ((EFI_IFR_TEXT*)OpHeader)->TextTwo; break; default: break; } return 0; } // //---------------------------------------------------------------------------- // Procedure: UefiSetSubTitleField // // Description: Function to Set the Sub-Title Field. // // Input: VOID *IfrPtr, UINT16 Token // // Output: VOID // //---------------------------------------------------------------------------- // 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)->SubTitle = Token; break; default: break; } } // //---------------------------------------------------------------------------- // Procedure: UefiSetPromptField // // Description: Function to set the prompt Field. // // Input: VOID *IfrPtr, UINT16 Token // // Output: VOID // //---------------------------------------------------------------------------- // 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)->Prompt = Token; break; case EFI_IFR_NUMERIC_OP: case EFI_IFR_TIME_OP: case EFI_IFR_DATE_OP: ((EFI_IFR_NUMERIC*)OpHeader)->Prompt = Token; break; case EFI_IFR_ONE_OF_OP: ((EFI_IFR_ONE_OF*)OpHeader)->Prompt = Token; break; case EFI_IFR_ORDERED_LIST_OP: ((EFI_IFR_ORDERED_LIST*)OpHeader)->Prompt = Token; break; case EFI_IFR_CHECKBOX_OP: ((EFI_IFR_CHECK_BOX*)OpHeader)->Prompt = Token; break; case EFI_IFR_PASSWORD_OP: ((EFI_IFR_PASSWORD*)OpHeader)->Prompt = Token; break; case EFI_IFR_STRING_OP: ((EFI_IFR_STRING*)OpHeader)->Prompt = Token; break; } } // //---------------------------------------------------------------------------- // Procedure: UefiCreateSubTitleTemplate // // Description: Function to prepare the template for sub-title // // Input: UINT16 Token // // Output: VOID // //---------------------------------------------------------------------------- // 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; } // //---------------------------------------------------------------------------- // Procedure: UefiGetIfrLength // // Description: Function to get the length of Ifr // // Input: VOID *IfrPtr // // Output: Length // //---------------------------------------------------------------------------- // UINT8 UefiGetIfrLength(VOID *IfrPtr) { EFI_IFR_OP_HEADER *OpHeader=(EFI_IFR_OP_HEADER *)IfrPtr; return OpHeader->Length; } // //---------------------------------------------------------------------------- // Procedure: UefiGetMinValue // // Description: Function to get the minimum value // // Input: VOID *IfrPtr // // Output: UINT64 // //---------------------------------------------------------------------------- // UINT64 UefiGetMinValue(VOID *IfrPtr) { EFI_IFR_OP_HEADER *OpHeader=(EFI_IFR_OP_HEADER *)IfrPtr; switch(OpHeader->OpCode) { case EFI_IFR_NUMERIC_OP: return (UINT64)((EFI_IFR_NUMERIC*)OpHeader)->Minimum; break; case EFI_IFR_PASSWORD_OP: return (UINT64)((EFI_IFR_PASSWORD*)OpHeader)->MinSize; break; case EFI_IFR_STRING_OP: return (UINT64)((EFI_IFR_STRING*)OpHeader)->MinSize; break; default: break; } return (UINT64)0; } // //---------------------------------------------------------------------------- // Procedure: UefiGetMaxValue // // Description: Function to get the max value // // Input: VOID *IfrPtr // // Output: UINT64 // //---------------------------------------------------------------------------- // UINT64 UefiGetMaxValue(VOID *IfrPtr) { EFI_IFR_OP_HEADER *OpHeader=(EFI_IFR_OP_HEADER *)IfrPtr; switch(OpHeader->OpCode) { case EFI_IFR_NUMERIC_OP: return (UINT64)((EFI_IFR_NUMERIC*)OpHeader)->Maximum; break; case EFI_IFR_PASSWORD_OP: return (UINT64)((EFI_IFR_PASSWORD*)OpHeader)->MaxSize; break; case EFI_IFR_STRING_OP: return (UINT64)((EFI_IFR_STRING*)OpHeader)->MaxSize; break; default: break; } return (UINT64)0; } // //---------------------------------------------------------------------------- // Procedure: UefiGetStepValue // // Description: Function to get the step value // // Input: VOID *IfrPtr // // Output: UINT64 // //---------------------------------------------------------------------------- // UINT64 UefiGetStepValue(VOID *IfrPtr) { EFI_IFR_OP_HEADER *OpHeader=(EFI_IFR_OP_HEADER *)IfrPtr; switch(OpHeader->OpCode) { case EFI_IFR_NUMERIC_OP: return (UINT64)((EFI_IFR_NUMERIC*)OpHeader)->Step; break; default: break; } return (UINT64)0; } // //---------------------------------------------------------------------------- // Procedure: UefiGetBaseValue // // Description: Function to get the base value // // Input: VOID *IfrPtr // // Output: UINT8 // //---------------------------------------------------------------------------- // UINT8 UefiGetBaseValue(VOID *IfrPtr) { EFI_IFR_OP_HEADER *OpHeader=(EFI_IFR_OP_HEADER *)IfrPtr; switch(OpHeader->OpCode) { case EFI_IFR_NUMERIC_OP: return AMI_BASE_DEC; break; default: break; } return AMI_BASE_DEC; } // //---------------------------------------------------------------------------- // Procedure: UefiGetWidth // // Description: Function to get width // // Input: VOID *IfrPtr // // Output: UINT16 // //---------------------------------------------------------------------------- // UINT16 UefiGetWidth(VOID *IfrPtr) { EFI_IFR_OP_HEADER *OpHeader=(EFI_IFR_OP_HEADER *)IfrPtr; switch(OpHeader->OpCode) { case EFI_IFR_NUMERIC_OP: return (UINT16)((EFI_IFR_NUMERIC*)OpHeader)->Width; break; case EFI_IFR_PASSWORD_OP: return (UINT16)((EFI_IFR_PASSWORD*)OpHeader)->Width; break; case EFI_IFR_STRING_OP: return (UINT16)((EFI_IFR_STRING*)OpHeader)->Width; break; case EFI_IFR_ONE_OF_OP: return (UINT16)((EFI_IFR_ONE_OF*)OpHeader)->Width; break; case EFI_IFR_CHECKBOX_OP: return (UINT16)((EFI_IFR_CHECK_BOX*)OpHeader)->Width; break; case EFI_IFR_EQ_ID_VAL_OP: return (UINT16)((EFI_IFR_EQ_ID_VAL*)OpHeader)->Width; break; case EFI_IFR_EQ_ID_LIST_OP: return (UINT16)((EFI_IFR_EQ_ID_LIST*)OpHeader)->Width; break; case EFI_IFR_EQ_ID_ID_OP: return (UINT16)((EFI_IFR_EQ_ID_ID*)OpHeader)->Width; break; default: break; } return (UINT16)0; } // //---------------------------------------------------------------------------- // Procedure: UefiSetWidth // // Description: Function to set width // // Input: VOID *IfrPtr // // Output: UINT16 // //---------------------------------------------------------------------------- // VOID UefiSetWidth(VOID *IfrPtr,UINT8 Width) { EFI_IFR_OP_HEADER *OpHeader=(EFI_IFR_OP_HEADER *)IfrPtr; switch(OpHeader->OpCode) { case EFI_IFR_NUMERIC_OP: ((EFI_IFR_NUMERIC*)OpHeader)->Width = Width; break; case EFI_IFR_PASSWORD_OP: ((EFI_IFR_PASSWORD*)OpHeader)->Width = Width ; break; case EFI_IFR_STRING_OP: ((EFI_IFR_STRING*)OpHeader)->Width = Width; break; case EFI_IFR_ONE_OF_OP: ((EFI_IFR_ONE_OF*)OpHeader)->Width = Width; break; case EFI_IFR_CHECKBOX_OP: ((EFI_IFR_CHECK_BOX*)OpHeader)->Width = Width; break; case EFI_IFR_EQ_ID_VAL_OP: ((EFI_IFR_EQ_ID_VAL*)OpHeader)->Width = Width; break; case EFI_IFR_EQ_ID_LIST_OP: ((EFI_IFR_EQ_ID_LIST*)OpHeader)->Width = Width; break; case EFI_IFR_EQ_ID_ID_OP: ((EFI_IFR_EQ_ID_ID*)OpHeader)->Width = Width; break; default: break; } } // //---------------------------------------------------------------------------- // Procedure: UefiGetQuestionOffset // // Description: Function to get question offset // // Input: VOID *IfrPtr // // Output: UINT16 // //---------------------------------------------------------------------------- // UINT16 UefiGetQuestionOffset(VOID *IfrPtr) { EFI_IFR_OP_HEADER *OpHeader=(EFI_IFR_OP_HEADER *)IfrPtr; return (UINT16)((EFI_IFR_NV_DATA*)OpHeader)->QuestionId; } // //---------------------------------------------------------------------------- // Procedure: UefiGetDateTimeDetails // // Description: Function to get the details of data and time // // Input: VOID *IfrPtr, // UINT8 Type, // UINT16 * Help, // UINT16 * Min, // UINT16 * Max // // Output: VOID // //---------------------------------------------------------------------------- // 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; } } // //---------------------------------------------------------------------------- // Procedure: UefiGetOneOfOptions // // Description: Function to get OneOf options // // Input: VOID *IfrPtr, // VOID **Handle, // UINT16 **OptionPtrTokens, // UINT64 **ValuePtrTokens, // UINT16 * ItemCount, // UINT16 * Interactive, // UINT16 * CallBackKey // // Output: Status // //---------------------------------------------------------------------------- // 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_ONE_OF_OPTION *ptrData; UINT8 Opcode = OpHeader->OpCode; EFI_STATUS Status = EFI_SUCCESS; UINT16 Index= 0 ; if(Opcode == EFI_IFR_ORDERED_LIST_OP) ptrData = (EFI_IFR_ONE_OF_OPTION *)((UINT8 *)(OpHeader) +sizeof(EFI_IFR_ORDERED_LIST) ); else ptrData = (EFI_IFR_ONE_OF_OPTION *)((UINT8 *)(OpHeader) +sizeof(EFI_IFR_ONE_OF) ); switch ( Opcode ) { case EFI_IFR_ONE_OF_OP: case EFI_IFR_ORDERED_LIST_OP: // ordered list option while( ptrData[Index].Header.OpCode != EFI_IFR_END_ONE_OF_OP ) Index++; break; case EFI_IFR_CHECKBOX_OP: Index = 2; *Handle = gHiiHandle; break; } if( *OptionPtrTokens != NULL ) MemFreePointer( (VOID **)OptionPtrTokens); if(ValuePtrTokens) if( *ValuePtrTokens != NULL ) MemFreePointer( (VOID **)ValuePtrTokens); *OptionPtrTokens = EfiLibAllocatePool( Index * sizeof(UINT16) ); if(ValuePtrTokens) *ValuePtrTokens = EfiLibAllocatePool( Index * sizeof(UINT64) ); if ( *OptionPtrTokens == NULL ) Status = EFI_OUT_OF_RESOURCES; else { *ItemCount = Index; for ( Index = 0; Index < *ItemCount; Index++ ) { if( ((Opcode == EFI_IFR_ONE_OF_OP)|(Opcode == EFI_IFR_ORDERED_LIST_OP)) && (ptrData->Header.OpCode == EFI_IFR_ONE_OF_OPTION_OP) ) { (*OptionPtrTokens)[Index] = ptrData[Index].Option; if(ValuePtrTokens) (*ValuePtrTokens)[Index] = ptrData[Index].Value; if(ptrData[Index].Flags & EFI_IFR_FLAG_INTERACTIVE) { if(Interactive) *Interactive = TRUE; if(CallBackKey) *CallBackKey = ptrData[Index].Key; } } else { (*OptionPtrTokens)[Index] = gCheckboxTokens[Index]; if(ValuePtrTokens) (*ValuePtrTokens)[Index] = Index; if(((EFI_IFR_CHECK_BOX *)OpHeader)->Flags & EFI_IFR_FLAG_INTERACTIVE) { if(Interactive) *Interactive = TRUE; if(CallBackKey) *CallBackKey = ((EFI_IFR_CHECK_BOX *)OpHeader)->Key; } } } } return Status; } // //---------------------------------------------------------------------------- // Procedure: UefiGetMaxEntries // // Description: Function to get max entries // // Input: VOID *IfrPtr, // // Output: UINT8 // //---------------------------------------------------------------------------- // UINT8 UefiGetMaxEntries(VOID *IfrPtr) { EFI_IFR_OP_HEADER *OpHeader=(EFI_IFR_OP_HEADER *)IfrPtr; switch(OpHeader->OpCode) { case EFI_IFR_ORDERED_LIST_OP: return ((EFI_IFR_ORDERED_LIST*)OpHeader)->MaxEntries; break; default: break; } return 0; } // //---------------------------------------------------------------------------- // Procedure: UefiTseLiteGetBootOverRideIndex // // Description: Function to get boot override index // // Input: VOID *Ptr, // // Output: UINT16 // //---------------------------------------------------------------------------- // UINT16 UefiTseLiteGetBootOverRideIndex(VOID *Ptr) { UINT16 Index=0xFFFF; EFI_IFR_OP_HEADER * OpHeader = (EFI_IFR_OP_HEADER *)Ptr; EFI_IFR_EQ_ID_LIST *EqIdList; if ((OpHeader != NULL) && (OpHeader->OpCode == EFI_IFR_SUPPRESS_IF_OP)) { while(OpHeader->OpCode != EFI_IFR_EQ_ID_LIST_OP) { OpHeader = (EFI_IFR_OP_HEADER*)((UINT8*)OpHeader + OpHeader->Length); if(OpHeader->OpCode == EFI_IFR_END_IF_OP) // Not found return Index; } // 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; } } return Index; } // //---------------------------------------------------------------------------- // Procedure: UefiTseLiteGetAmiCallbackIndex // // Description: Function to get ami callback index // // Input: VOID *Ptr, // // Output: UINT16 // //---------------------------------------------------------------------------- // UINT16 UefiTseLiteGetAmiCallbackIndex(VOID * Ptr, VOID * Ptr2) { UINT16 Index=0xFFFF; EFI_IFR_OP_HEADER * OpHeader = (EFI_IFR_OP_HEADER *)Ptr; if ((OpHeader != NULL) && (OpHeader->OpCode == EFI_IFR_SUPPRESS_IF_OP)) { while(OpHeader->OpCode != EFI_IFR_EQ_ID_VAL_OP) { OpHeader = (EFI_IFR_OP_HEADER*)((UINT8*)OpHeader + OpHeader->Length); if(OpHeader->OpCode == EFI_IFR_END_IF_OP) // Not found return Index; } // 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; } } return Index; } // //---------------------------------------------------------------------------- // Procedure: UefiFormCallbackNVRead // // Description: Function to get callback nvread // // Input: CHAR16 *name, // EFI_GUID *guid, // UINT32 *attributes, // UINTN *size, // VOID **buffer // // Output: Status // //---------------------------------------------------------------------------- // EFI_STATUS UefiFormCallbackNVRead(CHAR16 *name, EFI_GUID *guid, UINT32 *attributes, UINTN *size, VOID **buffer) { EFI_FORM_CALLBACK_PROTOCOL *FormCallBack=NULL; EFI_STATUS Status = EFI_UNSUPPORTED; EFI_IFR_FORM_SET *FmSet=NULL; UINTN i=0; if(gSetupCount) { for ( i = 0; i < gSetupCount - 1; i++ ) { FmSet = HiiGetFormSet( i ); if(!FmSet) continue; if( EfiCompareGuid(&(FmSet->Guid),guid) && (EFI_HANDLE)((UINTN)FmSet->CallbackHandle) ) { Status = gBS->HandleProtocol( (EFI_HANDLE)((UINTN)FmSet->CallbackHandle), &gEfiFormCallbackProtocolGuid, &FormCallBack ); } if ( ! EFI_ERROR( Status ) ) { if( FormCallBack->NvRead ) { Status = FormCallBack->NvRead( FormCallBack, name, guid, attributes, size, *buffer ); if ( Status != EFI_BUFFER_TOO_SMALL ) break; *buffer = EfiLibAllocatePool( *size ); if ( *buffer == NULL ) return EFI_OUT_OF_RESOURCES; Status = FormCallBack->NvRead( FormCallBack, name, guid, attributes, size, *buffer ); break; } else Status = EFI_UNSUPPORTED; } } } return Status; } // //---------------------------------------------------------------------------- // Procedure: UefiFormCallbackNVWrite // // Description: Function to get callback nvwrite // // Input: CHAR16 *name, // EFI_GUID *guid, // UINT32 *attributes, // VOID **buffer // UINTN *size, // // Output: Status // //---------------------------------------------------------------------------- // EFI_STATUS UefiFormCallbackNVWrite(CHAR16 *name, EFI_GUID *guid, UINT32 attributes, VOID *buffer, UINTN size) { EFI_FORM_CALLBACK_PROTOCOL *FormCallBack=NULL; BOOLEAN Reset=FALSE; EFI_STATUS Status = EFI_UNSUPPORTED; EFI_IFR_FORM_SET * FmSet=NULL; UINTN i=0; if(gSetupCount) { for ( i = 0; i < gSetupCount - 1; i++ ) { FmSet = HiiGetFormSet( i ); if(!FmSet) continue; if( EfiCompareGuid(&(FmSet->Guid),guid) && (EFI_HANDLE)((UINTN)FmSet->CallbackHandle) ) { Status = gBS->HandleProtocol( (EFI_HANDLE)((UINTN)FmSet->CallbackHandle), &gEfiFormCallbackProtocolGuid, &FormCallBack ); } if ( ! EFI_ERROR(Status ) ) { if( FormCallBack->NvWrite ) { Reset = FALSE; Status = FormCallBack->NvWrite( FormCallBack, name, guid, attributes, size, buffer, &Reset ); if ( ( ! EFI_ERROR(Status ) ) && Reset ) gResetRequired = TRUE; break; } else Status = EFI_UNSUPPORTED; } } } return Status; } // //---------------------------------------------------------------------------- // Procedure: InitMiniSetupStrings // // Description: Function to init minisetup strings // // Input: VOID // // Output: Status // //---------------------------------------------------------------------------- // #if APTIO_4_00 != 1 && SETUP_USE_GUIDED_SECTION !=1 EFI_STATUS InitMiniSetupStrings( VOID ) { EFI_STATUS Status=EFI_SUCCESS; UINT16 Index = 0; #if HII_VERSION == 0 EFI_HII_PACK_LIST PackList; EFI_HII_PACK_LIST *PackageList; #else EFI_HII_PACKAGES *PackageList = NULL; #endif VOID **Package = NULL; EFI_GUID MiniSetupGuid = MINI_SETUP_GUID; Status = HiiInitializeProtocol(); if ( EFI_ERROR ( Status ) ) return Status; gHiiHandle = HiiFindHandle( &MiniSetupGuid, &Index ); if ( gHiiHandle == INVALID_HANDLE ) { #if HII_VERSION == 0 PackList.IfrPack = NULL; PackList.StringPack = (EFI_HII_STRING_PACK *)STRING_ARRAY_NAME; PackList.FontPack = NULL; PackList.KeyboardPack = NULL; PackList.GuidId = &MiniSetupGuid; PackageList = &PackList; #else PackageList = EfiLibAllocateZeroPool( sizeof(EFI_HII_PACKAGES) + sizeof(VOID *) ); if ( PackageList == NULL ) return EFI_OUT_OF_RESOURCES; PackageList->GuidId = &MiniSetupGuid; PackageList->NumberOfPackages = 1; Package = (VOID **) ((UINT8 *)PackageList + sizeof (EFI_HII_PACKAGES)); #ifdef USE_DEPRICATED_INTERFACE *Package = (VOID *)STRING_ARRAY_NAME; #else *Package = (VOID *)&STRING_ARRAY_NAME; #endif #endif Status = gHiiProtocol->NewPack( gHiiProtocol, PackageList, (EFI_HII_HANDLE *)&gHiiHandle ); #if HII_VERSION != 0 MemFreePointer( (VOID **)&PackageList ); #endif } return Status; } #endif // //---------------------------------------------------------------------------- // Procedure: UefiIsEfiVariable // // Description: Function to check efi variable // // Input: UINT32 variable, VARIABLE_INFO *varInfo // // Output: BOOLEAN // //---------------------------------------------------------------------------- // BOOLEAN UefiIsEfiVariable(UINT32 variable, VARIABLE_INFO *varInfo) { return TRUE; } // //---------------------------------------------------------------------------- // Procedure: UefiVarGetNvram // // Description: Function to get nvram // // Parameter: VARIABLE_INFO *VariableInfo, VOID **Buffer, UINTN Offset, // UINTN Size // // Output: STATUS // //---------------------------------------------------------------------------- // EFI_STATUS UefiVarGetNvram(VARIABLE_INFO *VariableInfo, VOID **Buffer, UINTN Offset, UINTN Size) { return EFI_UNSUPPORTED; } // //---------------------------------------------------------------------------- // Procedure: UefiVarGetNvram // // Description: Function to set nvram // // Parameter: VARIABLE_INFO *VariableInfo, VOID *Buffer, UINTN Offset, // UINTN Size // // Output: STATUS // //---------------------------------------------------------------------------- // EFI_STATUS UefiVarSetNvram(VARIABLE_INFO *VariableInfo, VOID *Buffer, UINTN Offset, UINTN Size) { return EFI_UNSUPPORTED; } #define AMI_FLAG_MANUFACTURING EFI_IFR_FLAG_MANUFACTURING #define AMI_FLAG_DEFAULT EFI_IFR_FLAG_DEFAULT // //---------------------------------------------------------------------------- // Procedure: HiiGetManufactuingMask // // Description: Function to get manufacturing mask // // Input: VOID // // Output: UINTN // //---------------------------------------------------------------------------- // UINTN HiiGetManufactuingMask(VOID) { return AMI_FLAG_MANUFACTURING; } // //---------------------------------------------------------------------------- // Procedure: HiiGetDefaultMask // // Description: Function to get default mask // // Input: VOID // // Output: UINTN // //---------------------------------------------------------------------------- // UINTN HiiGetDefaultMask(VOID) { return AMI_FLAG_DEFAULT; } // //---------------------------------------------------------------------------- // Procedure: GetControlConditionVarId // // Description: Function to get control variable id // // Input: CONTROL_INFO *control // // Output: UINT32 // //---------------------------------------------------------------------------- // UINT32 GetControlConditionVarId(CONTROL_INFO *control) { return (control->ControlConditionalVariable[0])?control->ControlConditionalVariable[0]:0xFFFF; } // //---------------------------------------------------------------------------- // Procedure: BBSUpdateControlOffset // // Description: Function to update control offset // // Input: CONTROL_INFO *control // // Output: VOID // //---------------------------------------------------------------------------- // VOID BBSUpdateControlOffset(CONTROL_INFO *control) { UINT16 offset= ((EFI_IFR_ONE_OF*)control->ControlPtr)->QuestionId; offset = offset +sizeof(UINT32)+sizeof(UINT16); offset = (UINT16)(offset + gCurrLegacyBootData->LegacyEntryOffset); ((EFI_IFR_ONE_OF*)control->ControlPtr)->QuestionId = offset; } // //---------------------------------------------------------------------------- // Procedure: UefiGetSpecialEqIDIfrPtr // // Description: Function to get special eqID Ifr pointer // // Input: VOID *Conditional, UINT32 Variable, GUID_INFO **GuidInfo // // Output: VOID* // //---------------------------------------------------------------------------- // VOID* UefiGetSpecialEqIDIfrPtr(CONTROL_INFO *ControlInfo, UINT32 *Variable, GUID_INFO **GuidInfo) { VOID *Conditional = ControlInfo->ControlConditionalPtr; VOID *ControlPtr = ControlInfo->ControlPtr; EFI_IFR_OP_HEADER *ifrPtr; VARIABLE_INFO *varInfo; UINTN i; GUID_INFO *specialGuid = NULL; ifrPtr = (EFI_IFR_OP_HEADER *)Conditional; if((ifrPtr==NULL) || (ControlPtr <= Conditional)) return NULL; if ( ( ifrPtr->OpCode != EFI_IFR_SUPPRESS_IF_OP ) && ( ifrPtr->OpCode != EFI_IFR_GRAYOUT_IF_OP ) ) return NULL; ifrPtr = (EFI_IFR_OP_HEADER *)((UINTN)ifrPtr + ifrPtr->Length); if ( ( ifrPtr->OpCode == EFI_IFR_VARSTORE_SELECT_OP ) || ( ifrPtr->OpCode == EFI_IFR_VARSTORE_SELECT_PAIR_OP ) ) 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(NoVarStoreSupport()) { if(*Variable == VARIABLE_ID_SETUP) { *Variable = FindVarFromITKQuestionId(UefiGetEqIDQuestionID(ifrPtr)); } } varInfo = VarGetVariableInfoIndex( *Variable ); if ( varInfo == NULL ) return NULL; 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 { ifrPtr = NULL; } // See if Other condition is Special condition if(ifrPtr == NULL) { if(ControlPtr > Conditional) { ifrPtr = (EFI_IFR_OP_HEADER *)Conditional; ifrPtr = (EFI_IFR_OP_HEADER *)((UINTN)ifrPtr + ifrPtr->Length); // To skip the SuppressIf or GrayOutIf // to skip current expression. while( (VOID*)ifrPtr < ControlPtr) { if ( (ifrPtr != ControlPtr) && ( ifrPtr->OpCode != EFI_IFR_SUPPRESS_IF_OP ) && ( ifrPtr->OpCode != EFI_IFR_GRAYOUT_IF_OP ) ) ifrPtr = (EFI_IFR_OP_HEADER *)((UINTN)ifrPtr + ifrPtr->Length); // To skip the SuppressIf or GrayOutIf else break; } Conditional = ifrPtr; if(ControlPtr > Conditional) { CONTROL_INFO TempCtlInfo; MemCopy(&TempCtlInfo, ControlInfo, sizeof (CONTROL_INFO)); TempCtlInfo.ControlConditionalPtr = Conditional; ifrPtr = (EFI_IFR_OP_HEADER *)((UINTN)ifrPtr + ifrPtr->Length); // To skip the SuppressIf or GrayOutIf if ( ( ifrPtr->OpCode == EFI_IFR_VARSTORE_SELECT_OP ) ) VarGetVariableInfoId( ((EFI_IFR_VARSTORE_SELECT*)((char*)ifrPtr))->VarId, Variable ); ifrPtr = UefiGetSpecialEqIDIfrPtr(&TempCtlInfo, Variable, GuidInfo); } else ifrPtr = NULL; } } return ifrPtr; } // //---------------------------------------------------------------------------- // Procedure: UefiGetSpecialEqIDValue // // Description: Function to get special eqID value // // Input: CONTROL_INFO *ControlInfo, GUID_INFO **GuidInfo // // Output: UINT16 // //---------------------------------------------------------------------------- // 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; } // //---------------------------------------------------------------------------- // Procedure: UefiSpecialGuidCallback // // Description: Function to get special guid callback // // Input: VOID * HiiHandle, UINT16 Key, EFI_GUID *pGUID // // Output: VOID // //---------------------------------------------------------------------------- // VOID UefiSpecialGuidCallback(VOID * HiiHandle, UINT16 Key, EFI_GUID *pGUID) { EFI_FORM_CALLBACK_PROTOCOL *FormCallBack=NULL; EFI_IFR_FORM_SET *FormSet = NULL; EFI_IFR_DATA_ARRAY callbackData; EFI_STATUS Status; MemSet( &callbackData, sizeof(callbackData), 0 ); FormSet = HiiGetFormSetFromHandle( HiiHandle ); if ( FormSet != NULL ) { Status = gBS->HandleProtocol ( (EFI_HANDLE)((UINTN) FormSet->CallbackHandle), &gEfiFormCallbackProtocolGuid, &FormCallBack); if(!EFI_ERROR(Status)) { (VOID*)callbackData.NvRamMap = (VOID*)pGUID; if ( ( FormCallBack != NULL ) && ( FormCallBack->Callback != NULL ) ) FormCallBack->Callback( FormCallBack, Key, &callbackData, NULL ); } } } // //---------------------------------------------------------------------------- // Procedure: UefiSetEqIDValue // // Description: Function to set EqID value // // Input: VOID *IfrPtr, UINT16 Value // // Output: VOID // //---------------------------------------------------------------------------- // 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; } } // //---------------------------------------------------------------------------- // Procedure: UefiIsOneOfControl // // Description: Function to check for OneOf controls // // Input: VOID *IfrPtr // // Output: BOOLEAN // //---------------------------------------------------------------------------- // BOOLEAN UefiIsOneOfControl(VOID *IfrPtr) { return (((EFI_IFR_OP_HEADER *)IfrPtr)->OpCode == EFI_IFR_ONE_OF_OP)? TRUE : FALSE; } // //---------------------------------------------------------------------------- // Procedure: UefiGetEqIDQuestionID // // Description: Function to check EqID question ID // // Input: VOID *IfrPtr // // Output: UINT16 // //---------------------------------------------------------------------------- // UINT16 UefiGetEqIDQuestionID(VOID *IfrPtr) { EFI_IFR_OP_HEADER *opHeader = (EFI_IFR_OP_HEADER *)IfrPtr; UINT16 questionID = 0; switch(opHeader->OpCode) { case EFI_IFR_EQ_ID_ID_OP: break; case EFI_IFR_EQ_ID_LIST_OP: questionID = ((EFI_IFR_EQ_ID_LIST *)opHeader)->QuestionId; break; case EFI_IFR_EQ_ID_VAL_OP: questionID = ((EFI_IFR_EQ_ID_VAL *)opHeader)->QuestionId; break; default: break; } return questionID; } // //---------------------------------------------------------------------------- // Procedure: UefiSetEqIDQuestionID // // Description: Function to set EqID question ID // // Input: VOID *IfrPtr, UINT16 Value // // Output: VOID // //---------------------------------------------------------------------------- // VOID UefiSetEqIDQuestionID(VOID *IfrPtr, UINT16 Value) { EFI_IFR_OP_HEADER *opHeader = (EFI_IFR_OP_HEADER *)IfrPtr; switch(opHeader->OpCode) { case EFI_IFR_EQ_ID_ID_OP: break; case EFI_IFR_EQ_ID_LIST_OP: ((EFI_IFR_EQ_ID_LIST *)opHeader)->QuestionId = Value; break; case EFI_IFR_EQ_ID_VAL_OP: ((EFI_IFR_EQ_ID_VAL *)opHeader)->QuestionId = Value; break; default: break; } } // //---------------------------------------------------------------------------- // Procedure: UefiCreateOneOfWithOptionsTemplate // // Description: Function to create OneOf option template // // Input: UINTN OptionCount, CONTROL_INFO *CtrlInfo // // Output: VOID* // //---------------------------------------------------------------------------- // VOID* UefiCreateOneOfWithOptionsTemplate(UINTN OptionCount, CONTROL_INFO *CtrlInfo) { VOID *buffer = NULL; UINTN length = 0; UINTN offset = (UINTN)CtrlInfo->ControlPtr - (UINTN)CtrlInfo->ControlConditionalPtr; UINT32 size = (UINT32)((UINT32)offset + sizeof(EFI_IFR_ONE_OF) + sizeof(EFI_IFR_END_ONE_OF) + 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 (buffer == NULL)?NULL:((UINT8*)buffer + offset); } // //---------------------------------------------------------------------------- // Procedure: UefiSetOneOfOption // // Description: Function to set OneOf option // // Input: VOID *IfrPtr, UINT64 Value, UINT32 Size, UINT8 Flag, UINT16 Option // // Output: VOID // //---------------------------------------------------------------------------- // 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_FLAG_DEFAULT : 0; flag |= ((Flag & AMI_FLAG_MANUFACTURING) == AMI_FLAG_MANUFACTURING)? EFI_IFR_FLAG_MANUFACTURING : 0; option->Value = (UINT16)Value; option->Option = Option; option->Flags = flag; } // //---------------------------------------------------------------------------- // Procedure: UefiUpdateControlVarOffset // // Description: Function to update control variable offset // // Input: VOID *IfrPtr, UINT16 Value // // Output: VOID // //---------------------------------------------------------------------------- // 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)->QuestionId = Value; break; default: break; } } // //---------------------------------------------------------------------------- // Procedure: UefiAddEndOp // // Description: Function to add end op code // // Input: VOID *IfrPtr // // Output: VOID // //---------------------------------------------------------------------------- // 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); } // //---------------------------------------------------------------------------- // Procedure: UefiGetQuestionID // // Description: Function to get question ID // // Input: CONTROL_INFO *control // // Output: UINT16 // //---------------------------------------------------------------------------- // UINT16 UefiGetQuestionID(CONTROL_INFO *control) { return UefiGetQuestionOffset(control->ControlPtr); } #pragma warning( disable : 4204 ) // //---------------------------------------------------------------------------- // Procedure: UefiCreateDynamicControlCondition // // Description: Function to create dynamic control condition // // Input: CONTROL_INFO *control,UINT16 VarId, UINT16 PrevControlQuestionID,UINT16 Value // // Output: VOID // //---------------------------------------------------------------------------- // VOID UefiCreateDynamicControlCondition(CONTROL_INFO *control,UINT16 VarId, UINT16 PrevControlQuestionID,UINT16 Value) { struct SuppressCondition { EFI_IFR_SUPPRESS Suppress; EFI_IFR_VARSTORE_SELECT VarStroreSelect; EFI_IFR_EQ_ID_VAL IDEqVal; EFI_IFR_END_IF Endif; }Condition= { {EFI_IFR_SUPPRESS_IF_OP,sizeof(EFI_IFR_SUPPRESS),0}, {EFI_IFR_VARSTORE_SELECT_OP,sizeof(EFI_IFR_VARSTORE_SELECT),0}, {EFI_IFR_EQ_ID_VAL_OP,sizeof(EFI_IFR_EQ_ID_VAL),0,sizeof(UINT16),Value }, {EFI_IFR_END_IF_OP,sizeof(EFI_IFR_END_IF)}}; Condition.VarStroreSelect.VarId = VarId; Condition.IDEqVal.QuestionId = PrevControlQuestionID; // Add the New code to update the ControlConditionalPtr MemCopy((void*)control->ControlConditionalPtr,(void*)&Condition,sizeof(Condition)); } // //---------------------------------------------------------------------------- // Procedure: UefiCreateStringTemplate // // Description: Function to create uefi string template // // Parameter: UINT16 Token // // Return value: VOID * //---------------------------------------------------------------------------- // 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; } // //---------------------------------------------------------------------------- // Procedure: ProcessActionQuestionConfiguration // // Description: Function to process Action Control Configuration String. // UEFI Action control is a 2.1 control // // Input: CONTROL_INFO *control // // Output: EFI_STATUS // //---------------------------------------------------------------------------- // EFI_STATUS ProcessActionQuestionConfiguration(CONTROL_INFO *control) { return EFI_SUCCESS; } //EIP 23354 : Start // //---------------------------------------------------------------------------- // Procedure: IsPasswordEncodeEnabled // // Description: Function to Password Encoding Status. // // Input: VOID *PwDataPtr // // Output: TRUE/FALSE // //---------------------------------------------------------------------------- // BOOLEAN IsPasswordEncodeEnabled ( CONTROL_INFO * controlInfo ) { EFI_IFR_PASSWORD *PwData = ((EFI_IFR_PASSWORD *)controlInfo->ControlPtr); return (PwData->Encoding == TRUE)? TRUE:FALSE; } //EIP 23354 : End // //---------------------------------------------------------------------------- // Procedure: UefiGetTime // // Description: Function to get time // // Parameter: CONTROL_INFO *control, EFI_TIME *Tm // // Return value: STATUS //---------------------------------------------------------------------------- // EFI_STATUS UefiGetTime(CONTROL_INFO *control, EFI_TIME *Tm) { return gRT->GetTime( Tm, NULL ); } // //---------------------------------------------------------------------------- // Procedure: UefiSetTime // // Description: Function to set time // // Parameter: CONTROL_INFO *control, EFI_TIME *Tm // // Return value: STATUS //---------------------------------------------------------------------------- // EFI_STATUS UefiSetTime(CONTROL_INFO *control, EFI_TIME *Tm) { return gRT->SetTime( Tm ); } // //---------------------------------------------------------------------------- // // Procedure: UefiIsProceedWithPageChange // // Description: For UEFI 2.0 Just return EFI_SUCCESS; // // Parameter: EFI_STATUS // // Return Value: EFI_STATUS //---------------------------------------------------------------------------- // EFI_STATUS UefiIsProceedWithPageChange(EFI_STATUS Status) { return EFI_SUCCESS; } // //---------------------------------------------------------------------------- // // Procedure: UefiPreControlUpdate // // Description: In UEFI 2.0 this is Dummy function. // // Parameter: CONTROL_INFO * ControlData // // Return Value: EFI_STATUS //---------------------------------------------------------------------------- // VOID UefiPreControlUpdate(CONTROL_INFO *ControlData) { } // //---------------------------------------------------------------------------- // Procedure: UefiRefershQuestionValueNvRAM // // Description: Function Refresh the question // // Parameter: CONTROL_INFO *control // // Return value: STATUS //---------------------------------------------------------------------------- // EFI_STATUS UefiRefershQuestionValueNvRAM(CONTROL_INFO *ControlData) { return EFI_SUCCESS; } //EIP:56413 START // //---------------------------------------------------------------------------- // Procedure: UefiupdateResetButtonDefault // // Description: In UEFI 2.0 this is Dummy function. // // Input: CONTROL_INFO ControlData, UINT16 DefaultId // // Output: EFI_STATUS // //---------------------------------------------------------------------------- // EFI_STATUS UefiupdateResetButtonDefault(CONTROL_INFO ControlData, UINT16 DefaultId) { return EFI_SUCCESS; } //EIP:56413: START // //---------------------------------------------------------------------------- // Procedure: UefiGetResetButtonDefaultid // // Description: In UEFI 2.0 this is Dummy function. // // Parameter: VOID *IfrPtr // // Return value: UINT16 //---------------------------------------------------------------------------- // UINT16 UefiGetResetButtonDefaultid(VOID *IfrPtr) { return 0xffff; } //EIP:56413 END //EIP: 55762 Start // //--------------------------------------------------------------------------- // Procedure: UpdateDestiantionQuestion // // Description: Dummy function for 2.0 // // Input: UINT32 CurrPageID - Current page ID // UINT32 DestQuestionId - Destination question ID to set focus // UINT32 *FocusControlIndex - // // Output: EFI_STATUS status - EFI_SUCCESS is successful //--------------------------------------------------------------------------- // EFI_STATUS UpdateDestiantionQuestion (UINT32 CurrPageID, UINT32 DestQuestionId, UINT32 *FocusControlIndex) { return EFI_UNSUPPORTED; } //EIP: 55762 End // //---------------------------------------------------------------------------- // 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 // //---------------------------------------------------------------------------- // CHAR16 *FindDriverHealthDriverName (UINT16 DriverEntry) { return NULL; } // //----------------------------------------------------------------------------------------------------- // 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 // //----------------------------------------------------------------------------------------------------- // UINT16 CtrlsSupportsHealthProtocol (UINT16 EntryItem) { return 0; } // //---------------------------------------------------------------------------------- // 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 // //----------------------------------------------------------------------------------- // CHAR16 *GetCtrlNameAndHealth (UINT16 ControllerEntry) { return NULL; } // //------------------------------------------------------------------------------------------- // Procedure: SetDrvHealthHandleAndCtrlCount // // Description: Finds and sets the number of controllers supports the driver health handle // // Input: UINT16 = Driver health handle entry // // Output: VOID // //-------------------------------------------------------------------------------------------- // VOID SetDrvHealthHandleAndCtrlCount (UINT16 ItemEntry) { } //EIP57661 Starts // //---------------------------------------------------------------------------- // Procedure: SetDriverHealthCount // // Description: Sets the DriverHealthCount and DriverHlthEnable variables // // Input: VOID // // Output: VOID // //---------------------------------------------------------------------------- // VOID SetDriverHealthCount (VOID) { } // //------------------------------------------------------------------------------------------- // 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 // //-------------------------------------------------------------------------------------------- // VOID DoDriverHealthOperation (VOID *Tempcontrol, UINT16 ControllerEntry) { } // //--------------------------------------------------------------------------- // Procedure: UefiGetValidOptionSize // // Description: Function to get sizeof option.UEFI2.0 doesn't have EFI_IFR_TYPE support // // Input: CONTROL_INFO *CtrlInfo - Pointer to the control info data // UINTN *Type - Returns EFI_IFR_TYPE_NUM_SIZE // // Output: VOID //--------------------------------------------------------------------------- // VOID UefiGetValidOptionType(CONTROL_INFO *CtrlInfo, UINTN *Type, UINT32 *SizeOfData) { *SizeOfData = sizeof(UINT8);//UEFI2.0 Supports UINT8 size of data for OrderList Control } // //--------------------------------------------------------------------------- // Procedure: CheckTimeFlags // // Description: Function to check the time flags. // // Input: UINT8 Flags // // Output: BOOLEAN //--------------------------------------------------------------------------- // BOOLEAN CheckTimeFlags(UINT8 Flags) { return FALSE; } // //--------------------------------------------------------------------------- // Procedure: CheckDateFlags // // Description: Function to check the Date flags. // // Input: UINT8 Flags // // Output: BOOLEAN //--------------------------------------------------------------------------- // BOOLEAN CheckDateFlags(UINT8 Flags) { return FALSE; } // //--------------------------------------------------------------------------- // Procedure: ProcessPackNotification // // Description: Processes the IFR notification queue // // Input: None // // Output: EFI_STATUS status - EFI_ABORTED, By default // EFI_SUCCESS, if successful // EFI_ERROR, otherwise //--------------------------------------------------------------------------- // EFI_STATUS ProcessPackNotification (VOID) { return EFI_ABORTED; } // //---------------------------------------------------------------------------- // // Procedure: RegFormNotification // // Description: Registers the hii pack notification // // Parameter: VOID // // Return value: EFI_STATUS //---------------------------------------------------------------------------- // EFI_STATUS RegFormNotification (VOID) { return EFI_SUCCESS; } // //---------------------------------------------------------------------------- // // Procedure: UnRegFormNotification // // Description: Unregisters the form notification // // Parameter: VOID // // Return value: VOID //---------------------------------------------------------------------------- // VOID UnRegFormNotification (VOID) { } // //---------------------------------------------------------------------------- // Procedure: EvaluateControlDefault // // Description: // // Parameter: CONTROL_INFO *CtrlInfo // // Return value: UINT64 //---------------------------------------------------------------------------- // UINT16 EvaluateControlDefault (CONTROL_INFO *CtrlInfo, UINT64 *Defaults) { return 0; } //********************************************************************** //********************************************************************** //** ** //** (C)Copyright 1985-2013, American Megatrends, Inc. ** //** ** //** All Rights Reserved. ** //** ** //** 5555 Oakbrook Pkwy, Building 200,Norcross, Georgia 30093 ** //** ** //** Phone: (770)-246-8600 ** //** ** //********************************************************************** //**********************************************************************