From 03254710db8d2de44d948787e0cb022144693cc5 Mon Sep 17 00:00:00 2001 From: qwang12 Date: Mon, 1 Dec 2008 07:16:55 +0000 Subject: 1) Fix a bug of DefaultVarStoreId of the Form Set should be used when Framework IfrSupportLib create new opcode. 2) Remove the unnecessary OpcodeCreation.h 3) Update the doxygen function header. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@6787 6f19259b-4bc3-4df7-8a09-765794883524 --- .../FrameworkHiiToUefiHiiThunk/Forms.c | 1 - .../FrameworkHiiToUefiHiiThunk.inf | 1 - .../FrameworkHiiToUefiHiiThunk/HiiDatabase.h | 19 + .../FrameworkHiiToUefiHiiThunk/Keyboard.c | 3 +- .../FrameworkHiiToUefiHiiThunk/OpcodeCreation.c | 698 +++++++++------------ .../FrameworkHiiToUefiHiiThunk/OpcodeCreation.h | 111 ---- .../ThunkIfrSupportLib.h | 29 - .../FrameworkHiiToUefiHiiThunk/UefiIfrDefault.c | 2 +- .../FrameworkHiiToUefiHiiThunk/UefiIfrParser.h | 5 + .../FrameworkHiiToUefiHiiThunk/Utility.c | 7 +- 10 files changed, 341 insertions(+), 535 deletions(-) delete mode 100644 EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/OpcodeCreation.h delete mode 100644 EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/ThunkIfrSupportLib.h (limited to 'EdkCompatibilityPkg/Compatibility') diff --git a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Forms.c b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Forms.c index 0078082b7d..efc205e919 100644 --- a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Forms.c +++ b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Forms.c @@ -15,7 +15,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include "HiiDatabase.h" #include "UefiIfrDefault.h" -#include "OpcodeCreation.h" // // This structure is only intended to be used in this file. diff --git a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/FrameworkHiiToUefiHiiThunk.inf b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/FrameworkHiiToUefiHiiThunk.inf index fcdcabfc56..b79a98459e 100644 --- a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/FrameworkHiiToUefiHiiThunk.inf +++ b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/FrameworkHiiToUefiHiiThunk.inf @@ -42,7 +42,6 @@ ConfigAccess.c ConfigAccess.h OpcodeCreation.c - OpcodeCreation.h UefiIfrParser.c UefiIfrParser.h UefiIfrParserExpression.c diff --git a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiDatabase.h b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiDatabase.h index 6b7810eb92..b2f35eb69a 100644 --- a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiDatabase.h +++ b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiDatabase.h @@ -422,6 +422,25 @@ NewOrAddPackNotify ( IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType ); +/** + Create a EFI_HII_UPDATE_DATA structure used to call IfrLibUpdateForm. + + @param ThunkContext The HII Thunk Context. + @param FwUpdateData The Framework Update Data. + @param UefiUpdateData The UEFI Update Data. + + @retval EFI_SUCCESS The UEFI Update Data is created successfully. + @retval EFI_UNSUPPORTED There is unsupported opcode in FwUpdateData. + @retval EFI_OUT_OF_RESOURCES There is not enough resource. +**/ +EFI_STATUS +FwUpdateDataToUefiUpdateData ( + IN HII_THUNK_CONTEXT *ThunkContext, + IN CONST FRAMEWORK_EFI_HII_UPDATE_DATA *FwUpdateData, + OUT EFI_HII_UPDATE_DATA **UefiUpdateData + ) +; + #include "Utility.h" #include "ConfigAccess.h" diff --git a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Keyboard.c b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Keyboard.c index 087cd7aedb..32e4f93345 100644 --- a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Keyboard.c +++ b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Keyboard.c @@ -22,7 +22,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. @param This A pointer to the EFI_HII_PROTOCOL instance. @param DescriptorCount A pointer to the number of Descriptor entries being described in the keyboard layout being retrieved. - @param Descriptor A pointer to a buffer containing an array of EFI_KEY_DESCRIPTOR entries. Each entry will reflect the definition of a specific physical key. Type EFI_KEY_DESCRIPTOR is defined in "Related Definitions" below. + @param Descriptor A pointer to a buffer containing an array of EFI_KEY_DESCRIPTOR entries. Each entry will reflect the + definition of a specific physical key. Type EFI_KEY_DESCRIPTOR is defined in "Related Definitions" below. @retval EFI_SUCCESS The keyboard layout was retrieved successfully. diff --git a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/OpcodeCreation.c b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/OpcodeCreation.c index b010885de3..5b6fb7655a 100644 --- a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/OpcodeCreation.c +++ b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/OpcodeCreation.c @@ -12,8 +12,8 @@ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. **/ + #include "HiiDatabase.h" -#include "OpcodeCreation.h" #include "UefiIfrDefault.h" EFI_GUID mTianoExtendedOpcodeGuid = EFI_IFR_TIANO_GUID; @@ -28,11 +28,16 @@ EFI_IFR_GUID_OPTIONKEY mOptionKeyTemplate = { 0 }; +/** + The dynamic creation of these opcodes is supported in Framework HII modules. + Therefore, Framework HII Thunk module only map these opcode between Framework + HII's definitions to UEFI HII's. +**/ typedef struct { UINT8 FrameworkIfrOp; UINT8 UefiIfrOp; } IFR_OPCODE_MAP; - + IFR_OPCODE_MAP mQuestionOpcodeMap [] = { { FRAMEWORK_EFI_IFR_ONE_OF_OP, EFI_IFR_ONE_OF_OP}, { FRAMEWORK_EFI_IFR_CHECKBOX_OP, EFI_IFR_CHECKBOX_OP}, @@ -41,6 +46,15 @@ IFR_OPCODE_MAP mQuestionOpcodeMap [] = { { FRAMEWORK_EFI_IFR_ORDERED_LIST_OP, EFI_IFR_ORDERED_LIST_OP} }; +/** + Translate a Framework Question Opcode to UEFI Question Opcode. + + @param FwOp Framework Opcode. + @param UefiOp UEFI Opcode. + + @retval EFI_SUCCESS The UEFI opcode is found and returned. + @retval EFI_NOT_FOUND The UEFI opcode is not found. +**/ EFI_STATUS QuestionOpFwToUefi ( IN UINT8 FwOp, @@ -60,11 +74,18 @@ QuestionOpFwToUefi ( return EFI_NOT_FOUND; } +/** + Translate a Framework Question Opcode to UEFI Question Opcode. + + @param FwOp Framework Opcode. + @param UefiOp UEFI Opcode. + @retval EFI_SUCCESS The UEFI opcode is found and returned. + @retval EFI_NOT_FOUND The UEFI opcode is not found. +**/ EFI_STATUS FwQIdToUefiQId ( IN CONST FORM_BROWSER_FORMSET *FormSet, - IN UINT16 VarStoreId, IN UINT8 FwOpCode, IN UINT16 FwQId, OUT UINT16 *UefiQId @@ -74,10 +95,13 @@ FwQIdToUefiQId ( LIST_ENTRY *StatementList; FORM_BROWSER_FORM *Form; FORM_BROWSER_STATEMENT *Statement; + FORM_BROWSER_STATEMENT *StatementFound; EFI_STATUS Status; UINT8 UefiOp; + *UefiQId = 0; + StatementFound = NULL; FormList = GetFirstNode (&FormSet->FormListHead); @@ -93,19 +117,24 @@ FwQIdToUefiQId ( Status = QuestionOpFwToUefi (FwOpCode, &UefiOp); ASSERT_EFI_ERROR (Status); - if (UefiOp == Statement->Operand) { + if ((UefiOp == Statement->Operand) && (FormSet->DefaultVarStoreId == Statement->VarStoreId)) { // - // If ASSERT here, the Framework VFR file has two IFR Question with the Same Type refering to the - // same field in NvMap. This is ambigurity, we don't handle it for now. + // If ASSERT here, the Framework VFR file has two Questions with all three attibutes the same: + // 1) Same Question Type, + // 2) Same Variable Storage + // 3) Refering to the Same offset in Variable Map (NvMap). + // This is ambigurity as FwQIdToUefiQId () can't find which UEFI Question + // ID to return. // + // One possible solution is to remove the one of the duplicated questions in this Form Set. // - // UEFI Question ID is unique in a FormSet. - // - ASSERT (VarStoreId == Statement->VarStoreId); - *UefiQId = Statement->QuestionId; + ASSERT (StatementFound == NULL); + StatementFound= Statement; - return EFI_SUCCESS; - + // + // Continue the search to check if the Form Set contains more than one questins that has the 3 attributes + // with same value. + // } } } @@ -115,6 +144,11 @@ FwQIdToUefiQId ( FormList = GetNextNode (&FormSet->FormListHead, FormList); } + + if (StatementFound != NULL) { + *UefiQId = StatementFound->QuestionId; + return EFI_SUCCESS; + } return EFI_NOT_FOUND; } @@ -122,31 +156,56 @@ FwQIdToUefiQId ( #define LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL 0x1000 +/** + Append the newly created OpCode buffer to EFI_HII_UPDATE_DATA buffer. + Increase the Data buffer in EFI_HII_UPDATE_DATA if the EFI_HII_UPDATE_DATA + buffer's Data Buffer does not have space left for the newly created + OpCode. + + @param OpCodeBuf The newly created OpCode Buffer to be appended to + EFI_HII_UPDATE_DATA buffer. + @param OpCodeBufSize The size of OpCodeBuf. + @param UefiUpdateData The EFI_HII_UPDATE_DATA to be appended. + + @retval EFI_SUCCESS The OpCode buffer is appended to EFI_HII_UPDATE_DATA successfull. + @retval EFI_OUT_OF_RESOURCES There is not enough memory. +**/ EFI_STATUS AppendToUpdateBuffer ( IN CONST UINT8 *OpCodeBuf, - IN UINTN BufSize, - OUT EFI_HII_UPDATE_DATA *UefiData + IN UINTN OpCodeBufSize, + IN OUT EFI_HII_UPDATE_DATA *UefiUpdateData ) { UINT8 * NewBuff; - if (UefiData->Offset + BufSize > UefiData->BufferSize) { - NewBuff = AllocateCopyPool (UefiData->BufferSize + LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL, UefiData->Data); + if (UefiUpdateData->Offset + OpCodeBufSize > UefiUpdateData->BufferSize) { + NewBuff = AllocateCopyPool (UefiUpdateData->BufferSize + LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL, UefiUpdateData->Data); if (NewBuff == NULL) { return EFI_OUT_OF_RESOURCES; } - UefiData->BufferSize += LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL; - FreePool (UefiData->Data); - UefiData->Data = NewBuff; + UefiUpdateData->BufferSize += LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL; + FreePool (UefiUpdateData->Data); + UefiUpdateData->Data = NewBuff; } - CopyMem (UefiData->Data + UefiData->Offset, OpCodeBuf, BufSize); - UefiData->Offset += (UINT32) BufSize; + CopyMem (UefiUpdateData->Data + UefiUpdateData->Offset, OpCodeBuf, OpCodeBufSize); + UefiUpdateData->Offset += (UINT32) OpCodeBufSize; return EFI_SUCCESS; } +/** + Assign a Question ID. + + If FwQuestionId is 0, then assign a new question ID. The new question ID + is MaxQuestionId incremented by 1. The MaxQuestionId of FormSet is also + incremented by 1. + + If FwQuestionId is not 0, then it is used as the Framework Question ID. + + @return The Framework Question ID. +**/ EFI_QUESTION_ID AssignQuestionId ( IN UINT16 FwQuestionId, @@ -161,9 +220,18 @@ AssignQuestionId ( } } +/** + Create UEFI HII "End Of" Opcode and append it to UefiUpdateData buffer. + + @param UefiUpdateData The newly created UEFI HII opcode is appended to UefiUpdateData. + + @retval EFI_SUCCESS The UEFI HII opcode is created successfully and appended to UefiUpdateData. + @retval EFI_OUT_OF_RESOURCE There is not enough resource. + +**/ EFI_STATUS UCreateEndOfOpcode ( - OUT EFI_HII_UPDATE_DATA *UefiData + IN OUT EFI_HII_UPDATE_DATA *UefiUpdateData ) { EFI_IFR_END UOpcode; @@ -173,13 +241,23 @@ UCreateEndOfOpcode ( UOpcode.Header.OpCode = EFI_IFR_END_OP; UOpcode.Header.Length = sizeof (UOpcode); - return AppendToUpdateBuffer ((UINT8 *)&UOpcode, sizeof(UOpcode), UefiData); + return AppendToUpdateBuffer ((UINT8 *)&UOpcode, sizeof(UOpcode), UefiUpdateData); } +/** + Create UEFI HII Subtitle Opcode from a Framework HII Subtitle Opcode. + + @param FwOpcode The input Framework Opcode. + @param UefiUpdateData The newly created UEFI HII opcode is appended to UefiUpdateData. + + @retval EFI_SUCCESS The UEFI HII opcode is created successfully and appended to UefiUpdateData. + @retval EFI_OUT_OF_RESOURCE There is not enough resource. + +**/ EFI_STATUS F2UCreateSubtitleOpCode ( - IN CONST FRAMEWORK_EFI_IFR_SUBTITLE *FwSubTitle, - OUT EFI_HII_UPDATE_DATA *UefiData + IN CONST FRAMEWORK_EFI_IFR_SUBTITLE *FwOpcode, + IN OUT EFI_HII_UPDATE_DATA *UefiUpdateData ) { EFI_IFR_SUBTITLE UOpcode; @@ -189,32 +267,42 @@ F2UCreateSubtitleOpCode ( UOpcode.Header.OpCode = EFI_IFR_SUBTITLE_OP; UOpcode.Header.Length = sizeof (EFI_IFR_SUBTITLE); - UOpcode.Statement.Prompt = FwSubTitle->SubTitle; + UOpcode.Statement.Prompt = FwOpcode->SubTitle; - return AppendToUpdateBuffer ((UINT8 *)&UOpcode, sizeof(UOpcode), UefiData); + return AppendToUpdateBuffer ((UINT8 *)&UOpcode, sizeof(UOpcode), UefiUpdateData); } +/** + Create UEFI HII Text Opcode from a Framework HII Text Opcode. + + @param FwOpcode The input Framework Opcode. + @param UefiUpdateData The newly created UEFI HII opcode is appended to UefiUpdateData. + + @retval EFI_SUCCESS The UEFI HII opcode is created successfully and appended to UefiUpdateData. + @retval EFI_OUT_OF_RESOURCE There is not enough resource. + +**/ EFI_STATUS F2UCreateTextOpCode ( - IN CONST FRAMEWORK_EFI_IFR_TEXT *FwText, - OUT EFI_HII_UPDATE_DATA *UefiData + IN CONST FRAMEWORK_EFI_IFR_TEXT *FwOpcode, + IN OUT EFI_HII_UPDATE_DATA *UefiUpdateData ) { EFI_IFR_TEXT UTextOpCode; EFI_IFR_ACTION UActionOpCode; - if ((FwText->Flags & FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE) == 0) { + if ((FwOpcode->Flags & FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE) == 0) { ZeroMem (&UTextOpCode, sizeof(UTextOpCode)); UTextOpCode.Header.OpCode = EFI_IFR_TEXT_OP; UTextOpCode.Header.Length = sizeof (EFI_IFR_TEXT); - UTextOpCode.Statement.Help = FwText->Help; + UTextOpCode.Statement.Help = FwOpcode->Help; - UTextOpCode.Statement.Prompt = FwText->Text; - UTextOpCode.TextTwo = FwText->TextTwo; + UTextOpCode.Statement.Prompt = FwOpcode->Text; + UTextOpCode.TextTwo = FwOpcode->TextTwo; - return AppendToUpdateBuffer ((UINT8 *) &UTextOpCode, sizeof(UTextOpCode), UefiData); + return AppendToUpdateBuffer ((UINT8 *) &UTextOpCode, sizeof(UTextOpCode), UefiUpdateData); } else { // // Iteractive Text Opcode is EFI_IFR_ACTION @@ -225,31 +313,30 @@ F2UCreateTextOpCode ( UActionOpCode.Header.OpCode = EFI_IFR_ACTION_OP; UActionOpCode.Header.Length = sizeof (EFI_IFR_ACTION); - UActionOpCode.Question.Header.Prompt = FwText->Text; - UActionOpCode.Question.Header.Help = FwText->Help; + UActionOpCode.Question.Header.Prompt = FwOpcode->Text; + UActionOpCode.Question.Header.Help = FwOpcode->Help; UActionOpCode.Question.Flags = EFI_IFR_FLAG_CALLBACK; - UActionOpCode.Question.QuestionId = FwText->Key; + UActionOpCode.Question.QuestionId = FwOpcode->Key; - return AppendToUpdateBuffer ((UINT8 *) &UActionOpCode, sizeof(UActionOpCode), UefiData); + return AppendToUpdateBuffer ((UINT8 *) &UActionOpCode, sizeof(UActionOpCode), UefiUpdateData); } } -/* -typedef struct { - FRAMEWORK_EFI_IFR_OP_HEADER Header; - UINT16 FormId; - STRING_REF Prompt; - STRING_REF Help; // The string Token for the context-help - UINT8 Flags; // This is included solely for purposes of interactive/dynamic support. - UINT16 Key; // Value to be passed to caller to identify this particular op-code -} FRAMEWORK_EFI_IFR_REF; - -*/ +/** + Create UEFI HII Reference Opcode from a Framework HII Reference Opcode. + + @param FwOpcode The input Framework Opcode. + @param UefiUpdateData The newly created UEFI HII opcode is appended to UefiUpdateData. + + @retval EFI_SUCCESS The UEFI HII opcode is created successfully and appended to UefiUpdateData. + @retval EFI_OUT_OF_RESOURCE There is not enough resource. + +**/ EFI_STATUS -F2UCreateGotoOpCode ( +F2UCreateReferenceOpCode ( IN CONST FRAMEWORK_EFI_IFR_REF *FwOpcode, - OUT EFI_HII_UPDATE_DATA *UefiData + IN OUT EFI_HII_UPDATE_DATA *UefiUpdateData ) { EFI_IFR_REF UOpcode; @@ -272,44 +359,26 @@ F2UCreateGotoOpCode ( UOpcode.Question.Flags = (UINT8) (FwOpcode->Flags & (FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE | FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED)); - return AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiData); + return AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiUpdateData); } -/* -typedef struct { - FRAMEWORK_EFI_IFR_OP_HEADER Header; - STRING_REF Option; // The string token describing the option - UINT16 Value; // The value associated with this option that is stored in the NVRAM if chosen - UINT8 Flags; // For now, if non-zero, means that it is the default option, - further definition likely above - UINT16 Key; // Value to be passed to caller to identify this particular op-code -} FRAMEWORK_EFI_IFR_ONE_OF_OPTION; - -typedef union { - UINT8 u8; - UINT16 u16; - UINT32 u32; - UINT64 u64; - BOOLEAN b; - EFI_HII_TIME time; - EFI_HII_DATE date; - EFI_STRING_ID string; -} EFI_IFR_TYPE_VALUE; - -typedef struct _EFI_IFR_ONE_OF_OPTION { - EFI_IFR_OP_HEADER Header; - EFI_STRING_ID Option; - UINT8 Flags; - UINT8 Type; - EFI_IFR_TYPE_VALUE Value; -} EFI_IFR_ONE_OF_OPTION; - -*/ +/** + Create UEFI HII "One Of Option" Opcode from a Framework HII "One Of Option" Opcode. + + @param FwOpcode The input Framework Opcode. + @param Width The size of the One Of Option. 1 bytes or 2 bytes. + @param UefiUpdateData The newly created UEFI HII opcode is appended to UefiUpdateData. + + @retval EFI_SUCCESS The UEFI HII opcode is created successfully and appended to UefiUpdateData. + @retval EFI_OUT_OF_RESOURCE There is not enough resource. + +**/ EFI_STATUS F2UCreateOneOfOptionOpCode ( IN CONST FRAMEWORK_EFI_IFR_ONE_OF_OPTION *FwOpcode, IN UINTN Width, - OUT EFI_HII_UPDATE_DATA *UefiData + IN OUT EFI_HII_UPDATE_DATA *UefiUpdateData ) { EFI_IFR_ONE_OF_OPTION UOpcode; @@ -323,11 +392,10 @@ F2UCreateOneOfOptionOpCode ( CopyMem (&UOpcode.Value.u8, &FwOpcode->Value, Width); // - - // #define FRAMEWORK_EFI_IFR_FLAG_DEFAULT 0x01 - // #define FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING 0x02 - // #define EFI_IFR_OPTION_DEFAULT 0x10 - // #define EFI_IFR_OPTION_DEFAULT_MFG 0x20 + // #define FRAMEWORK_EFI_IFR_FLAG_DEFAULT 0x01 + // #define FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING 0x02 + // #define EFI_IFR_OPTION_DEFAULT 0x10 + // #define EFI_IFR_OPTION_DEFAULT_MFG 0x20 // UOpcode.Flags = (UINT8) (UOpcode.Flags | (FwOpcode->Flags & (FRAMEWORK_EFI_IFR_FLAG_DEFAULT | FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING)) << 4); @@ -345,15 +413,29 @@ F2UCreateOneOfOptionOpCode ( return EFI_UNSUPPORTED; } - return AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiData); + return AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiUpdateData); } +/** + Create a GUID Opcode EFI_IFR_GUID_OPTIONKEY to map the Framework One Of Option callback key + to a UEFI Question ID. This information is used to invoke the Framework HII Browser Callback + function. The opcode is appened to UefiUpdateData. + + @param QuestionId The UEFI Question ID. + @param OptionValue The value of the "One Of Option". + @param KeyValue The Framework "One Of Option" callback key. + @param UefiDat The UEFI Update Data buffer. + + @retval EFI_SUCCESS The UEFI HII opcode is created successfully and appended to UefiUpdateData. + @retval EFI_OUT_OF_RESOURCE There is not enough resource. +**/ + EFI_STATUS CreateGuidOptionKeyOpCode ( IN EFI_QUESTION_ID QuestionId, IN UINT16 OptionValue, IN EFI_QUESTION_ID KeyValue, - OUT EFI_HII_UPDATE_DATA *UefiData + IN OUT EFI_HII_UPDATE_DATA *UefiUpdateData ) { EFI_IFR_GUID_OPTIONKEY UOpcode; @@ -364,70 +446,30 @@ CreateGuidOptionKeyOpCode ( CopyMem (&UOpcode.OptionValue, &OptionValue, sizeof (OptionValue)); UOpcode.KeyValue = KeyValue; - return AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiData); + return AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiUpdateData); } -/* -typedef struct _EFI_IFR_QUESTION_HEADER { - EFI_IFR_STATEMENT_HEADER Header; - EFI_QUESTION_ID QuestionId; - EFI_VARSTORE_ID VarStoreId; - union { - EFI_STRING_ID VarName; - UINT16 VarOffset; - } VarStoreInfo; - UINT8 Flags; -} EFI_IFR_QUESTION_HEADER; - -typedef union { - struct { - UINT8 MinValue; - UINT8 MaxValue; - UINT8 Step; - } u8; - struct { - UINT16 MinValue; - UINT16 MaxValue; - UINT16 Step; - } u16; - struct { - UINT32 MinValue; - UINT32 MaxValue; - UINT32 Step; - } u32; - struct { - UINT64 MinValue; - UINT64 MaxValue; - UINT64 Step; - } u64; -} MINMAXSTEP_DATA; - -typedef struct _EFI_IFR_ONE_OF { - EFI_IFR_OP_HEADER Header; - EFI_IFR_QUESTION_HEADER Question; - UINT8 Flags; - MINMAXSTEP_DATA data; -} EFI_IFR_ONE_OF; - -typedef struct { - FRAMEWORK_EFI_IFR_OP_HEADER Header; - UINT16 QuestionId; // The ID designating what the question is about...sucked in from a #define, likely in the form of a variable name - UINT8 Width; // The Size of the Data being saved - STRING_REF Prompt; // The String Token for the Prompt - STRING_REF Help; // The string Token for the context-help -} FRAMEWORK_EFI_IFR_ONE_OF; - - -*/ - +/** + Create UEFI HII "One Of" Opcode from a Framework HII "One Of" Opcode. + + @param ThunkContext The HII Thunk Context. + @param FwOpcode The input Framework Opcode. + @param UefiUpdateData The newly created UEFI HII opcode is appended to UefiUpdateData. + @param NextFwOpcode Returns the position of the next Framework Opcode after FRAMEWORK_EFI_IFR_END_ONE_OF_OP of + the "One Of Option". + @param OpcodeCount The number of Opcode for the complete Framework "One Of" Opcode. + + @retval EFI_SUCCESS The UEFI HII opcode is created successfully and appended to UefiUpdateData. + @retval EFI_OUT_OF_RESOURCE There is not enough resource. + +**/ EFI_STATUS F2UCreateOneOfOpCode ( IN HII_THUNK_CONTEXT *ThunkContext, - IN UINT16 VarStoreId, IN CONST FRAMEWORK_EFI_IFR_ONE_OF *FwOpcode, - OUT EFI_HII_UPDATE_DATA *UefiData, + IN OUT EFI_HII_UPDATE_DATA *UefiUpdateData, OUT FRAMEWORK_EFI_IFR_OP_HEADER **NextFwOpcode, - OUT UINTN *DataCount + OUT UINTN *OpcodeCount ) { EFI_STATUS Status; @@ -436,10 +478,10 @@ F2UCreateOneOfOpCode ( FRAMEWORK_EFI_IFR_ONE_OF_OPTION *FwOneOfOp; ASSERT (NextFwOpcode != NULL); - ASSERT (DataCount != NULL); + ASSERT (OpcodeCount != NULL); ZeroMem (&UOpcode, sizeof(UOpcode)); - *DataCount = 0; + *OpcodeCount = 0; UOpcode.Header.Length = sizeof(UOpcode); UOpcode.Header.OpCode = EFI_IFR_ONE_OF_OP; @@ -447,7 +489,7 @@ F2UCreateOneOfOpCode ( UOpcode.Question.Header.Prompt = FwOpcode->Prompt; UOpcode.Question.Header.Help = FwOpcode->Help; - UOpcode.Question.VarStoreId = VarStoreId; + UOpcode.Question.VarStoreId = ThunkContext->FormSet->DefaultVarStoreId; UOpcode.Question.VarStoreInfo.VarOffset = FwOpcode->QuestionId; // @@ -462,7 +504,7 @@ F2UCreateOneOfOpCode ( UOpcode.Question.Flags |= EFI_IFR_FLAG_CALLBACK; if (UOpcode.Question.QuestionId == 0) { - Status = FwQIdToUefiQId (ThunkContext->FormSet, VarStoreId, FwOpcode->Header.OpCode, FwOpcode->QuestionId, &UOpcode.Question.QuestionId); + Status = FwQIdToUefiQId (ThunkContext->FormSet, FwOpcode->Header.OpCode, FwOpcode->QuestionId, &UOpcode.Question.QuestionId); if (EFI_ERROR (Status)) { UOpcode.Question.QuestionId = AssignQuestionId (FwOneOfOp->Key, ThunkContext->FormSet); } @@ -482,17 +524,17 @@ F2UCreateOneOfOpCode ( // // Assign QuestionId if still not assigned. // - Status = FwQIdToUefiQId (ThunkContext->FormSet, VarStoreId, FwOpcode->Header.OpCode, FwOpcode->QuestionId, &UOpcode.Question.QuestionId); + Status = FwQIdToUefiQId (ThunkContext->FormSet, FwOpcode->Header.OpCode, FwOpcode->QuestionId, &UOpcode.Question.QuestionId); if (EFI_ERROR (Status)) { UOpcode.Question.QuestionId = AssignQuestionId (FwOpcode->QuestionId, ThunkContext->FormSet); } } - Status = AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof (UOpcode), UefiData); + Status = AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof (UOpcode), UefiUpdateData); if (EFI_ERROR (Status)) { return Status; } - *DataCount += 1; + *OpcodeCount += 1; // // Go over again the Framework IFR binary to build the UEFI One Of Option opcodes. @@ -502,64 +544,49 @@ F2UCreateOneOfOpCode ( FwOneOfOp = (FRAMEWORK_EFI_IFR_ONE_OF_OPTION *) FwOpHeader; - Status = F2UCreateOneOfOptionOpCode ((FRAMEWORK_EFI_IFR_ONE_OF_OPTION *) FwOpHeader, FwOpcode->Width, UefiData); + Status = F2UCreateOneOfOptionOpCode ((FRAMEWORK_EFI_IFR_ONE_OF_OPTION *) FwOpHeader, FwOpcode->Width, UefiUpdateData); if (EFI_ERROR (Status)) { return Status; } - Status = CreateGuidOptionKeyOpCode (UOpcode.Question.QuestionId, FwOneOfOp->Value, FwOneOfOp->Key, UefiData); + Status = CreateGuidOptionKeyOpCode (UOpcode.Question.QuestionId, FwOneOfOp->Value, FwOneOfOp->Key, UefiUpdateData); if (EFI_ERROR (Status)) { return Status; } FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpHeader + FwOpHeader->Length); - *DataCount += 1; + *OpcodeCount += 1; } - Status = UCreateEndOfOpcode (UefiData); + Status = UCreateEndOfOpcode (UefiUpdateData); if (!EFI_ERROR (Status)) { *NextFwOpcode = (FRAMEWORK_EFI_IFR_OP_HEADER *)((UINT8 *) FwOpHeader + FwOpHeader->Length); - *DataCount += 1; + *OpcodeCount += 1; } return Status; } -/* -typedef struct _EFI_IFR_QUESTION_HEADER { - EFI_IFR_STATEMENT_HEADER Header; - EFI_QUESTION_ID QuestionId; - EFI_VARSTORE_ID VarStoreId; - union { - EFI_STRING_ID VarName; - UINT16 VarOffset; - } VarStoreInfo; - UINT8 Flags; -} EFI_IFR_QUESTION_HEADER; - -typedef struct _EFI_IFR_ORDERED_LIST { - EFI_IFR_OP_HEADER Header; - EFI_IFR_QUESTION_HEADER Question; - UINT8 MaxContainers; - UINT8 Flags; -} EFI_IFR_ORDERED_LIST; - -typedef struct { - FRAMEWORK_EFI_IFR_OP_HEADER Header; - UINT16 QuestionId; // The offset in NV for storage of the data - UINT8 MaxEntries; // The maximum number of options in the ordered list (=size of NVStore) - STRING_REF Prompt; // The string token for the prompt - STRING_REF Help; // The string token for the context-help -} FRAMEWORK_EFI_IFR_ORDERED_LIST; - -*/ +/** + Create UEFI HII "Ordered List" Opcode from a Framework HII "Ordered List" Opcode. + + @param ThunkContext The HII Thunk Context. + @param FwOpcode The input Framework Opcode. + @param UefiUpdateData The newly created UEFI HII opcode is appended to UefiUpdateData. + @param NextFwOpcode Returns the position of the next Framework Opcode after FRAMEWORK_EFI_IFR_END_ONE_OF_OP of + the "Ordered List". + @param OpcodeCount The number of Opcode for the complete Framework "Ordered List" Opcode. + + @retval EFI_SUCCESS The UEFI HII opcode is created successfully and appended to UefiUpdateData. + @retval EFI_OUT_OF_RESOURCE There is not enough resource. + +**/ EFI_STATUS F2UCreateOrderedListOpCode ( - IN HII_THUNK_CONTEXT *ThunkContext, - IN UINT16 VarStoreId, + IN HII_THUNK_CONTEXT *ThunkContext, IN CONST FRAMEWORK_EFI_IFR_ORDERED_LIST *FwOpcode, - OUT EFI_HII_UPDATE_DATA *UefiData, - OUT FRAMEWORK_EFI_IFR_OP_HEADER **NextFwOpcode, - OUT UINTN *DataCount + IN OUT EFI_HII_UPDATE_DATA *UefiUpdateData, + OUT FRAMEWORK_EFI_IFR_OP_HEADER **NextFwOpcode, + OUT UINTN *OpcodeCount ) { EFI_IFR_ORDERED_LIST UOpcode; @@ -568,7 +595,7 @@ F2UCreateOrderedListOpCode ( FRAMEWORK_EFI_IFR_ONE_OF_OPTION *FwOneOfOp; ZeroMem (&UOpcode, sizeof(UOpcode)); - *DataCount = 0; + *OpcodeCount = 0; UOpcode.Header.Length = sizeof(UOpcode); UOpcode.Header.OpCode = EFI_IFR_ORDERED_LIST_OP; @@ -576,7 +603,7 @@ F2UCreateOrderedListOpCode ( UOpcode.Question.Header.Prompt = FwOpcode->Prompt; UOpcode.Question.Header.Help = FwOpcode->Help; - UOpcode.Question.VarStoreId = VarStoreId; + UOpcode.Question.VarStoreId = ThunkContext->FormSet->DefaultVarStoreId; UOpcode.Question.VarStoreInfo.VarOffset = FwOpcode->QuestionId; UOpcode.MaxContainers = FwOpcode->MaxEntries; @@ -593,7 +620,7 @@ F2UCreateOrderedListOpCode ( UOpcode.Question.Flags |= EFI_IFR_FLAG_CALLBACK; if (UOpcode.Question.QuestionId == 0) { - Status = FwQIdToUefiQId (ThunkContext->FormSet, VarStoreId, FwOpcode->Header.OpCode, FwOpcode->QuestionId, &UOpcode.Question.QuestionId); + Status = FwQIdToUefiQId (ThunkContext->FormSet, FwOpcode->Header.OpCode, FwOpcode->QuestionId, &UOpcode.Question.QuestionId); if (EFI_ERROR (Status)) { UOpcode.Question.QuestionId = AssignQuestionId (FwOneOfOp->Key, ThunkContext->FormSet); } @@ -609,80 +636,56 @@ F2UCreateOrderedListOpCode ( } if (UOpcode.Question.QuestionId == 0) { - Status = FwQIdToUefiQId (ThunkContext->FormSet, VarStoreId, FwOpcode->Header.OpCode, FwOpcode->QuestionId, &UOpcode.Question.QuestionId); + Status = FwQIdToUefiQId (ThunkContext->FormSet, FwOpcode->Header.OpCode, FwOpcode->QuestionId, &UOpcode.Question.QuestionId); if (EFI_ERROR (Status)) { UOpcode.Question.QuestionId = AssignQuestionId (FwOpcode->QuestionId, ThunkContext->FormSet); } } - Status = AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiData); + Status = AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiUpdateData); if (EFI_ERROR (Status)) { return Status; } - *DataCount += 1; + *OpcodeCount += 1; FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpcode + FwOpcode->Header.Length); while (FwOpHeader->OpCode != FRAMEWORK_EFI_IFR_END_ONE_OF_OP) { // // Each entry of Order List in Framework HII is always 1 byte in size // - Status = F2UCreateOneOfOptionOpCode ((CONST FRAMEWORK_EFI_IFR_ONE_OF_OPTION *) FwOpHeader, 1, UefiData); + Status = F2UCreateOneOfOptionOpCode ((CONST FRAMEWORK_EFI_IFR_ONE_OF_OPTION *) FwOpHeader, 1, UefiUpdateData); if (EFI_ERROR (Status)) { return Status; } FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpHeader + FwOpHeader->Length); - *DataCount += 1; + *OpcodeCount += 1; } - Status = UCreateEndOfOpcode (UefiData); + Status = UCreateEndOfOpcode (UefiUpdateData); if (!EFI_ERROR (Status)) { *NextFwOpcode = (FRAMEWORK_EFI_IFR_OP_HEADER *)((UINT8 *) FwOpHeader + FwOpHeader->Length); - *DataCount += 1; + *OpcodeCount += 1; } return Status; } -/* -typedef struct _EFI_IFR_QUESTION_HEADER { - EFI_IFR_STATEMENT_HEADER Header; - EFI_QUESTION_ID QuestionId; - EFI_VARSTORE_ID VarStoreId; - union { - EFI_STRING_ID VarName; - UINT16 VarOffset; - } VarStoreInfo; - UINT8 Flags; -} EFI_IFR_QUESTION_HEADER; -*/ - -/* -typedef struct _EFI_IFR_CHECKBOX { - EFI_IFR_OP_HEADER Header; - EFI_IFR_QUESTION_HEADER Question; - UINT8 Flags; -} EFI_IFR_CHECKBOX; -*/ - -/* -typedef struct { - FRAMEWORK_EFI_IFR_OP_HEADER Header; - UINT16 QuestionId; // The ID designating what the question is about...sucked in from a #define, likely in the form of a variable name - UINT8 Width; // The Size of the Data being saved - STRING_REF Prompt; // The String Token for the Prompt - STRING_REF Help; // The string Token for the context-help - UINT8 Flags; // For now, if non-zero, means that it is the default option, - further definition likely - UINT16 Key; // Value to be passed to caller to identify this particular op-code -} FRAMEWORK_EFI_IFR_CHECKBOX, FRAMEWORK_EFI_IFR_CHECK_BOX; -*/ +/** + Create UEFI HII CheckBox Opcode from a Framework HII Checkbox Opcode. + @param ThunkContext The HII Thunk Context. + @param FwOpcode The input Framework Opcode. + @param UefiUpdateData The newly created UEFI HII opcode is appended to UefiUpdateData. + @retval EFI_SUCCESS The UEFI HII opcode is created successfully and appended to UefiUpdateData. + @retval EFI_OUT_OF_RESOURCE There is not enough resource. + +**/ EFI_STATUS F2UCreateCheckBoxOpCode ( IN HII_THUNK_CONTEXT *ThunkContext, - IN UINT16 VarStoreId, IN CONST FRAMEWORK_EFI_IFR_CHECKBOX *FwOpcode, - OUT EFI_HII_UPDATE_DATA *UefiData + IN OUT EFI_HII_UPDATE_DATA *UefiUpdateData ) { EFI_STATUS Status; @@ -697,7 +700,7 @@ F2UCreateCheckBoxOpCode ( UOpcode.Question.Header.Help = FwOpcode->Help; if (FwOpcode->Key == 0) { - Status = FwQIdToUefiQId (ThunkContext->FormSet, VarStoreId, FwOpcode->Header.OpCode, FwOpcode->QuestionId, &UOpcode.Question.QuestionId); + Status = FwQIdToUefiQId (ThunkContext->FormSet, FwOpcode->Header.OpCode, FwOpcode->QuestionId, &UOpcode.Question.QuestionId); if (EFI_ERROR (Status)) { // // Add a new opcode and it will not trigger call back. So we just reuse the FW QuestionId. @@ -708,95 +711,46 @@ F2UCreateCheckBoxOpCode ( UOpcode.Question.QuestionId = FwOpcode->Key; } - UOpcode.Question.VarStoreId = FRAMEWORK_RESERVED_VARSTORE_ID; - UOpcode.Question.VarStoreInfo.VarOffset = FwOpcode->QuestionId; - // - // We only map 2 flags: + // We map 2 flags: // FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE, // FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED, // to UEFI IFR Opcode Question flags. The rest flags are obsolete. // UOpcode.Question.Flags = (UINT8) (FwOpcode->Flags & (FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE | FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED)); + + UOpcode.Question.VarStoreId = ThunkContext->FormSet->DefaultVarStoreId; + UOpcode.Question.VarStoreInfo.VarOffset = FwOpcode->QuestionId; + // - // We also map 2 flags: + // We also map these 2 flags: // FRAMEWORK_EFI_IFR_FLAG_DEFAULT, // FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING, // to UEFI IFR CheckBox Opcode default flags. // UOpcode.Flags = (UINT8) (FwOpcode->Flags & (FRAMEWORK_EFI_IFR_FLAG_DEFAULT | FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING)); - return AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiData); + return AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiUpdateData); } -/* -typedef struct _EFI_IFR_QUESTION_HEADER { - EFI_IFR_STATEMENT_HEADER Header; - EFI_QUESTION_ID QuestionId; - EFI_VARSTORE_ID VarStoreId; - union { - EFI_STRING_ID VarName; - UINT16 VarOffset; - } VarStoreInfo; - UINT8 Flags; -} EFI_IFR_QUESTION_HEADER; - -typedef union { - struct { - UINT8 MinValue; - UINT8 MaxValue; - UINT8 Step; - } u8; - struct { - UINT16 MinValue; - UINT16 MaxValue; - UINT16 Step; - } u16; - struct { - UINT32 MinValue; - UINT32 MaxValue; - UINT32 Step; - } u32; - struct { - UINT64 MinValue; - UINT64 MaxValue; - UINT64 Step; - } u64; -} MINMAXSTEP_DATA; - -typedef struct _EFI_IFR_NUMERIC { - EFI_IFR_OP_HEADER Header; - EFI_IFR_QUESTION_HEADER Question; - UINT8 Flags; - MINMAXSTEP_DATA data; -} EFI_IFR_NUMERIC; - - -typedef struct { - FRAMEWORK_EFI_IFR_OP_HEADER Header; - UINT16 QuestionId; // The ID designating what the question is about...sucked in from a #define, likely in the form of a variable name - UINT8 Width; // The Size of the Data being saved - STRING_REF Prompt; // The String Token for the Prompt - STRING_REF Help; // The string Token for the context-help - UINT8 Flags; // This is included solely for purposes of interactive/dynamic support. - UINT16 Key; // Value to be passed to caller to identify this particular op-code - UINT16 Minimum; - UINT16 Maximum; - UINT16 Step; // If step is 0, then manual input is specified, otherwise, left/right arrow selection is called for - UINT16 Default; -} FRAMEWORK_EFI_IFR_NUMERIC; - -*/ +/** + Create UEFI HII Numeric Opcode from a Framework HII Numeric Opcode. + @param ThunkContext The HII Thunk Context. + @param FwOpcode The input Framework Opcode. + @param UefiUpdateData The newly created UEFI HII opcode is appended to UefiUpdateData. + @retval EFI_SUCCESS The UEFI HII opcode is created successfully and appended to UefiUpdateData. + @retval EFI_OUT_OF_RESOURCE There is not enough resource. + +**/ EFI_STATUS F2UCreateNumericOpCode ( IN HII_THUNK_CONTEXT *ThunkContext, - IN UINT16 VarStoreId, IN CONST FRAMEWORK_EFI_IFR_NUMERIC *FwOpcode, - OUT EFI_HII_UPDATE_DATA *UefiData + IN OUT EFI_HII_UPDATE_DATA *UefiUpdateData ) { EFI_STATUS Status; @@ -806,7 +760,7 @@ F2UCreateNumericOpCode ( ZeroMem (&UOpcode, sizeof(UOpcode)); if (FwOpcode->Key == 0) { - Status = FwQIdToUefiQId (ThunkContext->FormSet, VarStoreId, FwOpcode->Header.OpCode, FwOpcode->QuestionId, &UOpcode.Question.QuestionId); + Status = FwQIdToUefiQId (ThunkContext->FormSet, FwOpcode->Header.OpCode, FwOpcode->QuestionId, &UOpcode.Question.QuestionId); if (EFI_ERROR (Status)) { // // Add a new opcode and it will not trigger call back. So we just reuse the FW QuestionId. @@ -828,7 +782,7 @@ F2UCreateNumericOpCode ( UOpcode.Question.Header.Prompt = FwOpcode->Prompt; UOpcode.Question.Header.Help = FwOpcode->Help; - UOpcode.Question.VarStoreId = VarStoreId; + UOpcode.Question.VarStoreId = ThunkContext->FormSet->DefaultVarStoreId; UOpcode.Question.VarStoreInfo.VarOffset = FwOpcode->QuestionId; UOpcode.Question.Flags = (UINT8) (FwOpcode->Flags & (FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE | FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED)); @@ -858,7 +812,7 @@ F2UCreateNumericOpCode ( } } - Status = AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiData); + Status = AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiUpdateData); if (EFI_ERROR (Status)) { return Status; } @@ -887,59 +841,32 @@ F2UCreateNumericOpCode ( CopyMem (&UOpcodeDefault.Value.u8, &FwOpcode->Default, FwOpcode->Width); - Status = AppendToUpdateBuffer ((UINT8 *) &UOpcodeDefault, sizeof(UOpcodeDefault), UefiData); + Status = AppendToUpdateBuffer ((UINT8 *) &UOpcodeDefault, sizeof(UOpcodeDefault), UefiUpdateData); if (EFI_ERROR (Status)) { return Status; } - Status = UCreateEndOfOpcode (UefiData); + Status = UCreateEndOfOpcode (UefiUpdateData); return Status; } -/* +/** + Create UEFI HII String Opcode from a Framework HII String Opcode. -typedef struct _EFI_IFR_QUESTION_HEADER { - EFI_IFR_STATEMENT_HEADER Header; - EFI_QUESTION_ID QuestionId; - EFI_VARSTORE_ID VarStoreId; - union { - EFI_STRING_ID VarName; - UINT16 VarOffset; - } VarStoreInfo; - UINT8 Flags; -} EFI_IFR_QUESTION_HEADER; - -typedef struct _EFI_IFR_STRING { - EFI_IFR_OP_HEADER Header; - EFI_IFR_QUESTION_HEADER Question; - UINT8 MinSize; - UINT8 MaxSize; - UINT8 Flags; -} EFI_IFR_STRING; - - -typedef struct { - FRAMEWORK_EFI_IFR_OP_HEADER Header; - UINT16 QuestionId; // The ID designating what the question is about...sucked in from a #define, likely in the form of a variable name - UINT8 Width; // The Size of the Data being saved -- BUGBUG -- remove someday - STRING_REF Prompt; // The String Token for the Prompt - STRING_REF Help; // The string Token for the context-help - UINT8 Flags; // This is included solely for purposes of interactive/dynamic support. - UINT16 Key; // Value to be passed to caller to identify this particular op-code - UINT8 MinSize; // Minimum allowable sized password - UINT8 MaxSize; // Maximum allowable sized password -} FRAMEWORK_EFI_IFR_STRING; - - -*/ + @param ThunkContext The HII Thunk Context. + @param FwOpcode The input Framework Opcode. + @param UefiUpdateData The newly created UEFI HII opcode is appended to UefiUpdateData. + @retval EFI_SUCCESS The UEFI HII opcode is created successfully and appended to UefiUpdateData. + @retval EFI_OUT_OF_RESOURCE There is not enough resource. + +**/ EFI_STATUS F2UCreateStringOpCode ( - IN HII_THUNK_CONTEXT *ThunkContext, - IN UINT16 VarStoreId, + IN HII_THUNK_CONTEXT *ThunkContext, IN CONST FRAMEWORK_EFI_IFR_STRING *FwOpcode, - OUT EFI_HII_UPDATE_DATA *UefiData + IN OUT EFI_HII_UPDATE_DATA *UefiUpdateData ) { EFI_IFR_STRING UOpcode; @@ -947,7 +874,7 @@ F2UCreateStringOpCode ( ZeroMem (&UOpcode, sizeof(UOpcode)); if (FwOpcode->Key == 0) { - FwQIdToUefiQId (ThunkContext->FormSet, VarStoreId, FwOpcode->Header.OpCode, FwOpcode->QuestionId, &UOpcode.Question.QuestionId); + FwQIdToUefiQId (ThunkContext->FormSet, FwOpcode->Header.OpCode, FwOpcode->QuestionId, &UOpcode.Question.QuestionId); } else { UOpcode.Question.QuestionId = FwOpcode->Key; } @@ -959,41 +886,32 @@ F2UCreateStringOpCode ( UOpcode.Question.Header.Help = FwOpcode->Help; UOpcode.Question.QuestionId = FwOpcode->Key; - UOpcode.Question.VarStoreId = FRAMEWORK_RESERVED_VARSTORE_ID; - UOpcode.Question.VarStoreInfo.VarOffset = FwOpcode->QuestionId; - UOpcode.Question.Flags = (UINT8) (FwOpcode->Flags & (FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE | FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED)); + UOpcode.Question.VarStoreId = ThunkContext->FormSet->DefaultVarStoreId; + UOpcode.Question.VarStoreInfo.VarOffset = FwOpcode->QuestionId; + UOpcode.MinSize = FwOpcode->MinSize; UOpcode.MaxSize = FwOpcode->MaxSize; UOpcode.Flags = EFI_IFR_STRING_MULTI_LINE; - return AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiData); + return AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiUpdateData); } -/* -typedef struct _EFI_IFR_GUID_BANNER { - EFI_IFR_OP_HEADER Header; - EFI_GUID Guid; - UINT8 ExtendOpCode; // Extended opcode is EFI_IFR_EXTEND_OP_BANNER - EFI_STRING_ID Title; // The string token for the banner title - UINT16 LineNumber; // 1-based line number - UINT8 Alignment; // left, center, or right-aligned -} EFI_IFR_GUID_BANNER; - -typedef struct { - FRAMEWORK_EFI_IFR_OP_HEADER Header; - STRING_REF Title; // The string token for the banner title - UINT16 LineNumber; // 1-based line number - UINT8 Alignment; // left, center, or right-aligned -} FRAMEWORK_EFI_IFR_BANNER; - -*/ +/** + Create UEFI HII Banner Opcode from a Framework HII Banner Opcode. + + @param FwOpcode The input Framework Opcode. + @param UefiUpdateData The newly created UEFI HII opcode is appended to UefiUpdateData. + @retval EFI_SUCCESS The UEFI HII opcode is created successfully and appended to UefiUpdateData. + @retval EFI_OUT_OF_RESOURCE There is not enough resource. + +**/ EFI_STATUS F2UCreateBannerOpCode ( IN CONST FRAMEWORK_EFI_IFR_BANNER *FwOpcode, - OUT EFI_HII_UPDATE_DATA *UefiData + IN OUT EFI_HII_UPDATE_DATA *UefiUpdateData ) { EFI_IFR_GUID_BANNER UOpcode; @@ -1009,15 +927,25 @@ F2UCreateBannerOpCode ( UOpcode.LineNumber = FwOpcode->LineNumber; UOpcode.Alignment = FwOpcode->Alignment; - return AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiData); + return AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiUpdateData); } +/** + Create a EFI_HII_UPDATE_DATA structure used to call IfrLibUpdateForm. + @param ThunkContext The HII Thunk Context. + @param FwUpdateData The Framework Update Data. + @param UefiUpdateData The UEFI Update Data. + + @retval EFI_SUCCESS The UEFI Update Data is created successfully. + @retval EFI_UNSUPPORTED There is unsupported opcode in FwUpdateData. + @retval EFI_OUT_OF_RESOURCES There is not enough resource. +**/ EFI_STATUS FwUpdateDataToUefiUpdateData ( - IN HII_THUNK_CONTEXT *ThunkContext, - IN CONST FRAMEWORK_EFI_HII_UPDATE_DATA *Data, - OUT EFI_HII_UPDATE_DATA **UefiData + IN HII_THUNK_CONTEXT *ThunkContext, + IN CONST FRAMEWORK_EFI_HII_UPDATE_DATA *FwUpdateData, + OUT EFI_HII_UPDATE_DATA **UefiUpdateData ) { FRAMEWORK_EFI_IFR_OP_HEADER *FwOpCode; @@ -1026,12 +954,6 @@ FwUpdateDataToUefiUpdateData ( UINTN Index; EFI_STATUS Status; UINTN DataCount; - UINT16 VarStoreId; - - // - // Assume all dynamic opcode created is using active variable with VarStoreId of 1. - // - VarStoreId = 1; UefiOpCode = AllocateZeroPool (sizeof (EFI_HII_UPDATE_DATA)); if (UefiOpCode == NULL) { @@ -1046,9 +968,9 @@ FwUpdateDataToUefiUpdateData ( UefiOpCode->BufferSize = LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL; UefiOpCode->Offset = 0; - FwOpCode = (FRAMEWORK_EFI_IFR_OP_HEADER *) &Data->Data; + FwOpCode = (FRAMEWORK_EFI_IFR_OP_HEADER *) &FwUpdateData->Data; - for (Index = 0; Index < Data->DataCount; Index += DataCount) { + for (Index = 0; Index < FwUpdateData->DataCount; Index += DataCount) { switch (FwOpCode->OpCode) { case FRAMEWORK_EFI_IFR_SUBTITLE_OP: Status = F2UCreateSubtitleOpCode ((FRAMEWORK_EFI_IFR_SUBTITLE *) FwOpCode, UefiOpCode); @@ -1061,12 +983,12 @@ FwUpdateDataToUefiUpdateData ( break; case FRAMEWORK_EFI_IFR_REF_OP: - Status = F2UCreateGotoOpCode ((FRAMEWORK_EFI_IFR_REF *) FwOpCode, UefiOpCode); + Status = F2UCreateReferenceOpCode ((FRAMEWORK_EFI_IFR_REF *) FwOpCode, UefiOpCode); DataCount = 1; break; case FRAMEWORK_EFI_IFR_ONE_OF_OP: - Status = F2UCreateOneOfOpCode (ThunkContext, VarStoreId, (FRAMEWORK_EFI_IFR_ONE_OF *) FwOpCode, UefiOpCode, &NextFwOpCode, &DataCount); + Status = F2UCreateOneOfOpCode (ThunkContext, (FRAMEWORK_EFI_IFR_ONE_OF *) FwOpCode, UefiOpCode, &NextFwOpCode, &DataCount); if (!EFI_ERROR (Status)) { FwOpCode = NextFwOpCode; // @@ -1077,7 +999,7 @@ FwUpdateDataToUefiUpdateData ( break; case FRAMEWORK_EFI_IFR_ORDERED_LIST_OP: - Status = F2UCreateOrderedListOpCode (ThunkContext, VarStoreId, (FRAMEWORK_EFI_IFR_ORDERED_LIST *) FwOpCode, UefiOpCode, &NextFwOpCode, &DataCount); + Status = F2UCreateOrderedListOpCode (ThunkContext, (FRAMEWORK_EFI_IFR_ORDERED_LIST *) FwOpCode, UefiOpCode, &NextFwOpCode, &DataCount); if (!EFI_ERROR (Status)) { FwOpCode = NextFwOpCode; // @@ -1088,12 +1010,12 @@ FwUpdateDataToUefiUpdateData ( break; case FRAMEWORK_EFI_IFR_CHECKBOX_OP: - Status = F2UCreateCheckBoxOpCode (ThunkContext, VarStoreId, (FRAMEWORK_EFI_IFR_CHECKBOX *) FwOpCode, UefiOpCode); + Status = F2UCreateCheckBoxOpCode (ThunkContext, (FRAMEWORK_EFI_IFR_CHECKBOX *) FwOpCode, UefiOpCode); DataCount = 1; break; case FRAMEWORK_EFI_IFR_STRING_OP: - Status = F2UCreateStringOpCode (ThunkContext, VarStoreId, (FRAMEWORK_EFI_IFR_STRING *) FwOpCode, UefiOpCode); + Status = F2UCreateStringOpCode (ThunkContext, (FRAMEWORK_EFI_IFR_STRING *) FwOpCode, UefiOpCode); DataCount = 1; break; @@ -1108,7 +1030,7 @@ FwUpdateDataToUefiUpdateData ( break; case FRAMEWORK_EFI_IFR_NUMERIC_OP: - Status = F2UCreateNumericOpCode (ThunkContext, VarStoreId, (FRAMEWORK_EFI_IFR_NUMERIC *) FwOpCode, UefiOpCode); + Status = F2UCreateNumericOpCode (ThunkContext, (FRAMEWORK_EFI_IFR_NUMERIC *) FwOpCode, UefiOpCode); DataCount = 1; break; @@ -1126,7 +1048,7 @@ FwUpdateDataToUefiUpdateData ( FwOpCode = (FRAMEWORK_EFI_IFR_OP_HEADER *)((UINT8 *) FwOpCode + FwOpCode->Length); } - *UefiData = UefiOpCode; + *UefiUpdateData = UefiOpCode; return EFI_SUCCESS; } diff --git a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/OpcodeCreation.h b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/OpcodeCreation.h deleted file mode 100644 index 3cdc33a365..0000000000 --- a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/OpcodeCreation.h +++ /dev/null @@ -1,111 +0,0 @@ -/** @file -Implement Functions to convert IFR Opcode in format defined in Framework HII specification to -format defined in UEFI HII Specification. - -Copyright (c) 2007, Intel Corporation -All rights reserved. This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _HII_THUNK_OPCODE_CREATION_H -#define _HII_THUNK_OPCODE_CREATION_H - -EFI_STATUS -UCreateEndOfOpcode ( - OUT EFI_HII_UPDATE_DATA *UefiData - ); - -EFI_STATUS -F2UCreateSubtitleOpCode ( - IN CONST FRAMEWORK_EFI_IFR_SUBTITLE *FwOpcode, - OUT EFI_HII_UPDATE_DATA *UefiData - ); - -EFI_STATUS -F2UCreateTextOpCode ( - IN CONST FRAMEWORK_EFI_IFR_TEXT *FwOpcode, - OUT EFI_HII_UPDATE_DATA *UefiData - ); - - -EFI_STATUS -F2UCreateGotoOpCode ( - IN CONST FRAMEWORK_EFI_IFR_REF *FwOpcode, - OUT EFI_HII_UPDATE_DATA *UefiData - ); - -EFI_STATUS -F2UCreateOneOfOptionOpCode ( - IN CONST FRAMEWORK_EFI_IFR_ONE_OF_OPTION *FwOpcode, - IN UINTN Width, - OUT EFI_HII_UPDATE_DATA *UefiData - ); - -EFI_STATUS -F2UCreateOneOfOpCode ( - IN HII_THUNK_CONTEXT *ThunkContext, - IN UINT16 VarStoreId, - IN CONST FRAMEWORK_EFI_IFR_ONE_OF *FwOpcode, - OUT EFI_HII_UPDATE_DATA *UefiData, - OUT FRAMEWORK_EFI_IFR_OP_HEADER **NextFwOpcode, - OUT UINTN *DataCount - ); - -EFI_STATUS -F2UCreateOrderedListOpCode ( - IN HII_THUNK_CONTEXT *ThunkContext, - IN UINT16 VarStoreId, - IN CONST FRAMEWORK_EFI_IFR_ORDERED_LIST *FwOpcode, - OUT EFI_HII_UPDATE_DATA *UefiData, - OUT FRAMEWORK_EFI_IFR_OP_HEADER **NextFwOpcode, - OUT UINTN *DataCount - ); - - -EFI_STATUS -F2UCreateCheckBoxOpCode ( - IN HII_THUNK_CONTEXT *ThunkContext, - IN UINT16 VarStoreId, - IN CONST FRAMEWORK_EFI_IFR_CHECKBOX *FwOpcode, - OUT EFI_HII_UPDATE_DATA *UefiData - ); - - -EFI_STATUS -F2UCreateNumericOpCode ( - IN HII_THUNK_CONTEXT *ThunkContext, - IN UINT16 VarStoreId, - IN CONST FRAMEWORK_EFI_IFR_NUMERIC *FwOpcode, - OUT EFI_HII_UPDATE_DATA *UefiData - ); - - -EFI_STATUS -F2UCreateStringOpCode ( - IN HII_THUNK_CONTEXT *ThunkContext, - IN UINT16 VarStoreId, - IN CONST FRAMEWORK_EFI_IFR_STRING *FwOpcode, - OUT EFI_HII_UPDATE_DATA *UefiData - ); - - -EFI_STATUS -F2UCreateBannerOpCode ( - IN CONST FRAMEWORK_EFI_IFR_BANNER *FwOpcode, - OUT EFI_HII_UPDATE_DATA *UefiData - ); - -EFI_STATUS -FwUpdateDataToUefiUpdateData ( - IN HII_THUNK_CONTEXT *ThunkContext, - IN CONST FRAMEWORK_EFI_HII_UPDATE_DATA *Data, - OUT EFI_HII_UPDATE_DATA **UefiData - ); -#endif - diff --git a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/ThunkIfrSupportLib.h b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/ThunkIfrSupportLib.h deleted file mode 100644 index bd74331486..0000000000 --- a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/ThunkIfrSupportLib.h +++ /dev/null @@ -1,29 +0,0 @@ -/**@file - - This file contains utility functions by HII Thunk Modules. - -Copyright (c) 2006 - 2008, Intel Corporation -All rights reserved. This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _THUNK_IFR_SUPPORTLIB_H -#define _THUNK_IFR_SUPPORTLIB_H - - - - - - - - - - - -#endif diff --git a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/UefiIfrDefault.c b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/UefiIfrDefault.c index c8262f6adb..34d6cba6f8 100644 --- a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/UefiIfrDefault.c +++ b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/UefiIfrDefault.c @@ -487,7 +487,7 @@ UefiDefaultsToFwDefaults ( // // In UEFI, 0 is defined to be invalid for EFI_IFR_VARSTORE.VarStoreId. // So the default storage of Var Store in VFR from a Framework module - // should be translated to 0x0001 (FRAMEWORK_RESERVED_VARSTORE_ID). + // should be translated to the default Varstore ID. // if (Node->StoreId == UefiFormSetDefaultVarStoreId) { Pack->VariableId = 0; diff --git a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/UefiIfrParser.h b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/UefiIfrParser.h index 7ca232c6e6..4ca4c5e3bd 100644 --- a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/UefiIfrParser.h +++ b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/UefiIfrParser.h @@ -317,6 +317,11 @@ typedef struct { UINT16 MaxQuestionId; + // + // Added for Framework HII Thunk. + // Default Variable Storage built from a Framework VFR file using UEFI VFR Compiler in Compatibility mode is determined + // by priority rules defined in GetFormsetDefaultVarstoreId (). See the function description for details. + // EFI_VARSTORE_ID DefaultVarStoreId; UINTN NumberOfStatement; diff --git a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.c b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.c index ca870990e1..ca5ecbf0b6 100644 --- a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.c +++ b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.c @@ -392,10 +392,11 @@ DestroyThunkContext ( /** Get the FormSet's Default Varstore ID based on the rule (Descending Priority): - 1) Var Store ID of FRAMEWORK_RESERVED_VARSTORE_ID (0x01). - 2) First Var Store ID. + 1) If VarStore ID of FRAMEWORK_RESERVED_VARSTORE_ID (0x01) is found, Var Store ID is used. + 2) If VarStore ID of FRAMEWORK_RESERVED_VARSTORE_ID is not found, First Var Store ID is used + as the default Var Store ID. - @param FormSet The Form Set. + @param FormSet The Form Set. The Default Varstore ID is updated if found. **/ VOID -- cgit v1.2.3