--- /dev/null
+/** @file\r
+Implement Functions to convert IFR Opcode in format defined in Framework HII specification to\r
+format defined in UEFI HII Specification.\r
+\r
+Copyright (c) 2007, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+#include "HiiDatabase.h"\r
+#include "OpcodeCreation.h"\r
+#include "UefiIfrDefault.h"\r
+\r
+EFI_GUID mTianoExtendedOpcodeGuid = EFI_IFR_TIANO_GUID;\r
+\r
+#define LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL 0x1000\r
+EFI_STATUS\r
+AppendToUpdateBuffer (\r
+ IN CONST UINT8 *OpCodeBuf,\r
+ IN UINTN BufSize,\r
+ OUT EFI_HII_UPDATE_DATA *UefiData\r
+ )\r
+{\r
+ UINT8 * NewBuff;\r
+ \r
+ if (UefiData->Offset + BufSize > UefiData->BufferSize) {\r
+ NewBuff = AllocateCopyPool (UefiData->BufferSize + LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL, UefiData->Data);\r
+ if (NewBuff == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+ UefiData->BufferSize += LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL;\r
+ FreePool (UefiData->Data);\r
+ UefiData->Data = NewBuff;\r
+ }\r
+ \r
+ CopyMem (UefiData->Data + UefiData->Offset, OpCodeBuf, BufSize);\r
+ UefiData->Offset += (UINT32) BufSize;\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+UCreateEndOfOpcode (\r
+ OUT EFI_HII_UPDATE_DATA *UefiData\r
+ )\r
+{\r
+ EFI_IFR_END UOpcode;\r
+\r
+ ZeroMem (&UOpcode, sizeof (UOpcode));\r
+\r
+ UOpcode.Header.OpCode = EFI_IFR_END_OP;\r
+ UOpcode.Header.Length = sizeof (UOpcode);\r
+\r
+ return AppendToUpdateBuffer ((UINT8 *)&UOpcode, sizeof(UOpcode), UefiData);\r
+}\r
+\r
+EFI_STATUS\r
+F2UCreateSubtitleOpCode (\r
+ IN CONST FRAMEWORK_EFI_IFR_SUBTITLE *FwSubTitle,\r
+ OUT EFI_HII_UPDATE_DATA *UefiData\r
+ )\r
+{\r
+ EFI_IFR_SUBTITLE UOpcode;\r
+\r
+ ZeroMem (&UOpcode, sizeof(UOpcode));\r
+\r
+ UOpcode.Header.OpCode = EFI_IFR_SUBTITLE_OP;\r
+ UOpcode.Header.Length = sizeof (EFI_IFR_SUBTITLE);\r
+\r
+ UOpcode.Statement.Prompt = FwSubTitle->SubTitle;\r
+\r
+ return AppendToUpdateBuffer ((UINT8 *)&UOpcode, sizeof(UOpcode), UefiData);\r
+}\r
+\r
+EFI_STATUS\r
+F2UCreateTextOpCode (\r
+ IN CONST FRAMEWORK_EFI_IFR_TEXT *FwText,\r
+ OUT EFI_HII_UPDATE_DATA *UefiData\r
+ )\r
+{\r
+ EFI_IFR_TEXT UOpcode;\r
+\r
+ ZeroMem (&UOpcode, sizeof(UOpcode));\r
+ \r
+ UOpcode.Header.OpCode = EFI_IFR_TEXT_OP;\r
+ UOpcode.Header.Length = sizeof (EFI_IFR_TEXT);\r
+\r
+ UOpcode.Statement.Help = FwText->Help;\r
+\r
+ UOpcode.Statement.Prompt = FwText->Text;\r
+ UOpcode.TextTwo = FwText->TextTwo;\r
+ \r
+ return AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiData);\r
+}\r
+\r
+/*\r
+typedef struct {\r
+ FRAMEWORK_EFI_IFR_OP_HEADER Header;\r
+ UINT16 FormId;\r
+ STRING_REF Prompt;\r
+ STRING_REF Help; // The string Token for the context-help\r
+ UINT8 Flags; // This is included solely for purposes of interactive/dynamic support.\r
+ UINT16 Key; // Value to be passed to caller to identify this particular op-code\r
+} FRAMEWORK_EFI_IFR_REF;\r
+\r
+*/\r
+EFI_STATUS\r
+F2UCreateGotoOpCode (\r
+ IN CONST FRAMEWORK_EFI_IFR_REF *FwOpcode,\r
+ OUT EFI_HII_UPDATE_DATA *UefiData\r
+ )\r
+{\r
+ EFI_IFR_REF UOpcode;\r
+\r
+ ZeroMem (&UOpcode, sizeof(UOpcode));\r
+\r
+ UOpcode.Header.Length = sizeof(UOpcode);\r
+ UOpcode.Header.OpCode = EFI_IFR_REF_OP;\r
+\r
+ UOpcode.Question.Header.Prompt = FwOpcode->Prompt;\r
+ UOpcode.Question.Header.Help = FwOpcode->Help;\r
+ UOpcode.Question.QuestionId = FwOpcode->Key;\r
+\r
+ UOpcode.FormId = FwOpcode->FormId;\r
+\r
+ //\r
+ // We only map FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE and FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED to \r
+ // UEFI IFR Opcode flags. The rest flags are obsolete.\r
+ //\r
+ UOpcode.Question.Flags = (FwOpcode->Flags & (FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE | FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED));\r
+ \r
+\r
+ return AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiData);\r
+}\r
+\r
+\r
+/*\r
+typedef struct {\r
+ FRAMEWORK_EFI_IFR_OP_HEADER Header;\r
+ STRING_REF Option; // The string token describing the option\r
+ UINT16 Value; // The value associated with this option that is stored in the NVRAM if chosen\r
+ UINT8 Flags; // For now, if non-zero, means that it is the default option, - further definition likely above\r
+ UINT16 Key; // Value to be passed to caller to identify this particular op-code\r
+} FRAMEWORK_EFI_IFR_ONE_OF_OPTION;\r
+\r
+typedef union {\r
+ UINT8 u8;\r
+ UINT16 u16;\r
+ UINT32 u32;\r
+ UINT64 u64;\r
+ BOOLEAN b;\r
+ EFI_HII_TIME time;\r
+ EFI_HII_DATE date;\r
+ EFI_STRING_ID string;\r
+} EFI_IFR_TYPE_VALUE;\r
+\r
+typedef struct _EFI_IFR_ONE_OF_OPTION {\r
+ EFI_IFR_OP_HEADER Header;\r
+ EFI_STRING_ID Option;\r
+ UINT8 Flags;\r
+ UINT8 Type;\r
+ EFI_IFR_TYPE_VALUE Value;\r
+} EFI_IFR_ONE_OF_OPTION;\r
+\r
+*/\r
+EFI_STATUS\r
+F2UCreateOneOfOptionOpCode (\r
+ IN CONST FRAMEWORK_EFI_IFR_ONE_OF_OPTION *FwOpcode,\r
+ IN UINTN Width,\r
+ OUT EFI_HII_UPDATE_DATA *UefiData\r
+ )\r
+{\r
+ EFI_IFR_ONE_OF_OPTION UOpcode;\r
+\r
+ ZeroMem (&UOpcode, sizeof(UOpcode));\r
+\r
+ UOpcode.Header.Length = sizeof(UOpcode);\r
+ UOpcode.Header.OpCode = EFI_IFR_ONE_OF_OPTION_OP;\r
+\r
+ UOpcode.Option = FwOpcode->Option;\r
+ CopyMem (&UOpcode.Value.u8, &FwOpcode->Value, Width);\r
+\r
+ //\r
+ \r
+ // #define FRAMEWORK_EFI_IFR_FLAG_DEFAULT 0x01\r
+ // #define FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING 0x02\r
+ // #define EFI_IFR_OPTION_DEFAULT 0x10\r
+ // #define EFI_IFR_OPTION_DEFAULT_MFG 0x20\r
+ //\r
+ UOpcode.Flags |= (UINT8) ((FwOpcode->Flags & (FRAMEWORK_EFI_IFR_FLAG_DEFAULT | FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING)) << 4);\r
+\r
+ switch (Width) {\r
+ case 1:\r
+ UOpcode.Type = EFI_IFR_TYPE_NUM_SIZE_8;\r
+ break;\r
+ \r
+ case 2:\r
+ UOpcode.Type = EFI_IFR_TYPE_NUM_SIZE_16;\r
+ break;\r
+ \r
+ default:\r
+ ASSERT (FALSE);\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
+ return AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiData);\r
+}\r
+\r
+\r
+/*\r
+typedef struct _EFI_IFR_QUESTION_HEADER {\r
+ EFI_IFR_STATEMENT_HEADER Header;\r
+ EFI_QUESTION_ID QuestionId;\r
+ EFI_VARSTORE_ID VarStoreId;\r
+ union {\r
+ EFI_STRING_ID VarName;\r
+ UINT16 VarOffset;\r
+ } VarStoreInfo;\r
+ UINT8 Flags;\r
+} EFI_IFR_QUESTION_HEADER;\r
+\r
+typedef union {\r
+ struct {\r
+ UINT8 MinValue;\r
+ UINT8 MaxValue;\r
+ UINT8 Step;\r
+ } u8;\r
+ struct {\r
+ UINT16 MinValue;\r
+ UINT16 MaxValue;\r
+ UINT16 Step;\r
+ } u16;\r
+ struct {\r
+ UINT32 MinValue;\r
+ UINT32 MaxValue;\r
+ UINT32 Step;\r
+ } u32;\r
+ struct {\r
+ UINT64 MinValue;\r
+ UINT64 MaxValue;\r
+ UINT64 Step;\r
+ } u64;\r
+} MINMAXSTEP_DATA;\r
+\r
+typedef struct _EFI_IFR_ONE_OF {\r
+ EFI_IFR_OP_HEADER Header;\r
+ EFI_IFR_QUESTION_HEADER Question;\r
+ UINT8 Flags;\r
+ MINMAXSTEP_DATA data;\r
+} EFI_IFR_ONE_OF;\r
+\r
+typedef struct {\r
+ FRAMEWORK_EFI_IFR_OP_HEADER Header;\r
+ UINT16 QuestionId; // The ID designating what the question is about...sucked in from a #define, likely in the form of a variable name\r
+ UINT8 Width; // The Size of the Data being saved\r
+ STRING_REF Prompt; // The String Token for the Prompt\r
+ STRING_REF Help; // The string Token for the context-help\r
+} FRAMEWORK_EFI_IFR_ONE_OF;\r
+\r
+\r
+*/\r
+\r
+EFI_STATUS\r
+F2UCreateOneOfOpCode (\r
+ IN CONST FRAMEWORK_EFI_IFR_ONE_OF *FwOpcode,\r
+ OUT EFI_HII_UPDATE_DATA *UefiData,\r
+ OUT FRAMEWORK_EFI_IFR_OP_HEADER **NextFwOpcode\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_IFR_ONE_OF UOpcode;\r
+ FRAMEWORK_EFI_IFR_OP_HEADER *FwOpHeader;\r
+ FRAMEWORK_EFI_IFR_ONE_OF_OPTION *FwOneOfOp;\r
+ BOOLEAN HasQuestionId;\r
+\r
+ ZeroMem (&UOpcode, sizeof(UOpcode));\r
+\r
+ UOpcode.Header.Length = sizeof(UOpcode);\r
+ UOpcode.Header.OpCode = EFI_IFR_ONE_OF_OP;\r
+ UOpcode.Header.Scope = 1;\r
+\r
+ UOpcode.Question.Header.Prompt = FwOpcode->Prompt;\r
+ UOpcode.Question.Header.Help = FwOpcode->Help;\r
+ \r
+ Status = AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiData);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+ //\r
+ // Go over the Framework IFR binary to get the QuestionId for generated UEFI One Of Option opcode\r
+ //\r
+ HasQuestionId = FALSE;\r
+ FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpcode + FwOpcode->Header.Length);\r
+ while (FwOpHeader->OpCode != FRAMEWORK_EFI_IFR_END_ONE_OF_OP) {\r
+ ASSERT (FwOpHeader->OpCode == FRAMEWORK_EFI_IFR_ONE_OF_OPTION_OP);\r
+ \r
+ FwOneOfOp = (FRAMEWORK_EFI_IFR_ONE_OF_OPTION *) FwOpHeader;\r
+ if (((FwOneOfOp->Key & FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE) == 0) & !HasQuestionId) {\r
+ HasQuestionId = TRUE;\r
+ UOpcode.Question.QuestionId = FwOneOfOp->Key;\r
+ }\r
+\r
+ FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpHeader + FwOpHeader->Length);\r
+ }\r
+\r
+ //\r
+ // Go over again the Framework IFR binary to build the UEFI One Of Option opcodes.\r
+ //\r
+ FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpcode + FwOpcode->Header.Length);\r
+ while (FwOpHeader->OpCode != FRAMEWORK_EFI_IFR_END_ONE_OF_OP) {\r
+ Status = F2UCreateOneOfOptionOpCode ((FRAMEWORK_EFI_IFR_ONE_OF_OPTION *) FwOpHeader, FwOpcode->Width, UefiData);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+ }\r
+\r
+ Status = UCreateEndOfOpcode (UefiData);\r
+ if (!EFI_ERROR (Status)) {\r
+ *NextFwOpcode = (FRAMEWORK_EFI_IFR_OP_HEADER *)((UINT8 *) FwOpHeader + FwOpHeader->Length);\r
+ }\r
+\r
+ return Status;\r
+}\r
+\r
+/*\r
+typedef struct _EFI_IFR_QUESTION_HEADER {\r
+ EFI_IFR_STATEMENT_HEADER Header;\r
+ EFI_QUESTION_ID QuestionId;\r
+ EFI_VARSTORE_ID VarStoreId;\r
+ union {\r
+ EFI_STRING_ID VarName;\r
+ UINT16 VarOffset;\r
+ } VarStoreInfo;\r
+ UINT8 Flags;\r
+} EFI_IFR_QUESTION_HEADER;\r
+\r
+typedef struct _EFI_IFR_ORDERED_LIST {\r
+ EFI_IFR_OP_HEADER Header;\r
+ EFI_IFR_QUESTION_HEADER Question;\r
+ UINT8 MaxContainers;\r
+ UINT8 Flags;\r
+} EFI_IFR_ORDERED_LIST;\r
+\r
+typedef struct {\r
+ FRAMEWORK_EFI_IFR_OP_HEADER Header;\r
+ UINT16 QuestionId; // The offset in NV for storage of the data\r
+ UINT8 MaxEntries; // The maximum number of options in the ordered list (=size of NVStore)\r
+ STRING_REF Prompt; // The string token for the prompt\r
+ STRING_REF Help; // The string token for the context-help\r
+} FRAMEWORK_EFI_IFR_ORDERED_LIST;\r
+\r
+*/\r
+EFI_STATUS\r
+F2UCreateOrderedListOpCode (\r
+ IN CONST FRAMEWORK_EFI_IFR_ORDERED_LIST *FwOpcode,\r
+ OUT EFI_HII_UPDATE_DATA *UefiData,\r
+ OUT FRAMEWORK_EFI_IFR_OP_HEADER **NextFwOpcode\r
+ )\r
+{\r
+ EFI_IFR_ORDERED_LIST UOpcode;\r
+ EFI_STATUS Status;\r
+ FRAMEWORK_EFI_IFR_OP_HEADER *FwOpHeader;\r
+\r
+ ZeroMem (&UOpcode, sizeof(UOpcode));\r
+\r
+ UOpcode.Header.Length = sizeof(UOpcode);\r
+ UOpcode.Header.OpCode = EFI_IFR_ORDERED_LIST_OP;\r
+ UOpcode.Header.Scope = 1;\r
+\r
+ UOpcode.Question.Header.Prompt = FwOpcode->Prompt;\r
+ UOpcode.Question.Header.Help = FwOpcode->Help;\r
+\r
+ UOpcode.MaxContainers = FwOpcode->MaxEntries;\r
+ \r
+ Status = AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiData);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+ FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpcode + FwOpcode->Header.Length);\r
+ while (FwOpHeader->OpCode != FRAMEWORK_EFI_IFR_END_ONE_OF_OP) {\r
+ Status = F2UCreateOneOfOptionOpCode ((CONST FRAMEWORK_EFI_IFR_ONE_OF_OPTION *) FwOpHeader, FwOpcode->MaxEntries, UefiData);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+ }\r
+\r
+ Status = UCreateEndOfOpcode (UefiData);\r
+ if (!EFI_ERROR (Status)) {\r
+ *NextFwOpcode = (FRAMEWORK_EFI_IFR_OP_HEADER *)((UINT8 *) FwOpHeader + FwOpHeader->Length);\r
+ }\r
+\r
+ return AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiData);\r
+}\r
+\r
+/*\r
+typedef struct _EFI_IFR_QUESTION_HEADER {\r
+ EFI_IFR_STATEMENT_HEADER Header;\r
+ EFI_QUESTION_ID QuestionId;\r
+ EFI_VARSTORE_ID VarStoreId;\r
+ union {\r
+ EFI_STRING_ID VarName;\r
+ UINT16 VarOffset;\r
+ } VarStoreInfo;\r
+ UINT8 Flags;\r
+} EFI_IFR_QUESTION_HEADER;\r
+*/\r
+\r
+/*\r
+typedef struct _EFI_IFR_CHECKBOX {\r
+ EFI_IFR_OP_HEADER Header;\r
+ EFI_IFR_QUESTION_HEADER Question;\r
+ UINT8 Flags;\r
+} EFI_IFR_CHECKBOX;\r
+*/\r
+\r
+/*\r
+typedef struct {\r
+ FRAMEWORK_EFI_IFR_OP_HEADER Header;\r
+ UINT16 QuestionId; // The ID designating what the question is about...sucked in from a #define, likely in the form of a variable name\r
+ UINT8 Width; // The Size of the Data being saved\r
+ STRING_REF Prompt; // The String Token for the Prompt\r
+ STRING_REF Help; // The string Token for the context-help\r
+ UINT8 Flags; // For now, if non-zero, means that it is the default option, - further definition likely\r
+ UINT16 Key; // Value to be passed to caller to identify this particular op-code\r
+} FRAMEWORK_EFI_IFR_CHECKBOX, FRAMEWORK_EFI_IFR_CHECK_BOX;\r
+*/\r
+\r
+\r
+EFI_STATUS\r
+F2UCreateCheckBoxOpCode (\r
+ IN CONST FRAMEWORK_EFI_IFR_CHECKBOX *FwOpcode,\r
+ OUT EFI_HII_UPDATE_DATA *UefiData\r
+ )\r
+{\r
+ EFI_IFR_CHECKBOX UOpcode;\r
+\r
+ ZeroMem (&UOpcode, sizeof(UOpcode));\r
+\r
+ UOpcode.Header.Length = sizeof(UOpcode);\r
+ UOpcode.Header.OpCode = EFI_IFR_CHECKBOX_OP;\r
+\r
+ UOpcode.Question.Header.Prompt = FwOpcode->Prompt;\r
+ UOpcode.Question.Header.Help = FwOpcode->Help;\r
+\r
+ UOpcode.Question.QuestionId = FwOpcode->Key;\r
+ UOpcode.Question.VarStoreId = RESERVED_VARSTORE_ID;\r
+ UOpcode.Question.VarStoreInfo.VarOffset = FwOpcode->QuestionId;\r
+\r
+ //\r
+ // We only map 2 flags:\r
+ // FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE, \r
+ // FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED,\r
+ // to UEFI IFR Opcode Question flags. The rest flags are obsolete.\r
+ //\r
+ UOpcode.Question.Flags = (FwOpcode->Flags & (FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE | FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED));\r
+\r
+ //\r
+ // We also map 2 flags:\r
+ // FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE, \r
+ // FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED,\r
+ // to UEFI IFR CheckBox Opcode default flags.\r
+ //\r
+ UOpcode.Flags = (FwOpcode->Flags & (FRAMEWORK_EFI_IFR_FLAG_DEFAULT | FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING));\r
+\r
+ return AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiData);\r
+}\r
+\r
+\r
+/*\r
+typedef struct _EFI_IFR_QUESTION_HEADER {\r
+ EFI_IFR_STATEMENT_HEADER Header;\r
+ EFI_QUESTION_ID QuestionId;\r
+ EFI_VARSTORE_ID VarStoreId;\r
+ union {\r
+ EFI_STRING_ID VarName;\r
+ UINT16 VarOffset;\r
+ } VarStoreInfo;\r
+ UINT8 Flags;\r
+} EFI_IFR_QUESTION_HEADER;\r
+\r
+typedef union {\r
+ struct {\r
+ UINT8 MinValue;\r
+ UINT8 MaxValue;\r
+ UINT8 Step;\r
+ } u8;\r
+ struct {\r
+ UINT16 MinValue;\r
+ UINT16 MaxValue;\r
+ UINT16 Step;\r
+ } u16;\r
+ struct {\r
+ UINT32 MinValue;\r
+ UINT32 MaxValue;\r
+ UINT32 Step;\r
+ } u32;\r
+ struct {\r
+ UINT64 MinValue;\r
+ UINT64 MaxValue;\r
+ UINT64 Step;\r
+ } u64;\r
+} MINMAXSTEP_DATA;\r
+\r
+typedef struct _EFI_IFR_NUMERIC {\r
+ EFI_IFR_OP_HEADER Header;\r
+ EFI_IFR_QUESTION_HEADER Question;\r
+ UINT8 Flags;\r
+ MINMAXSTEP_DATA data;\r
+} EFI_IFR_NUMERIC;\r
+\r
+\r
+typedef struct {\r
+ FRAMEWORK_EFI_IFR_OP_HEADER Header;\r
+ UINT16 QuestionId; // The ID designating what the question is about...sucked in from a #define, likely in the form of a variable name\r
+ UINT8 Width; // The Size of the Data being saved\r
+ STRING_REF Prompt; // The String Token for the Prompt\r
+ STRING_REF Help; // The string Token for the context-help\r
+ UINT8 Flags; // This is included solely for purposes of interactive/dynamic support.\r
+ UINT16 Key; // Value to be passed to caller to identify this particular op-code\r
+ UINT16 Minimum;\r
+ UINT16 Maximum;\r
+ UINT16 Step; // If step is 0, then manual input is specified, otherwise, left/right arrow selection is called for\r
+ UINT16 Default;\r
+} FRAMEWORK_EFI_IFR_NUMERIC;\r
+\r
+*/\r
+\r
+\r
+EFI_STATUS\r
+F2UCreateNumericOpCode (\r
+ IN CONST FRAMEWORK_EFI_IFR_NUMERIC *FwOpcode,\r
+ OUT EFI_HII_UPDATE_DATA *UefiData\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_IFR_NUMERIC UOpcode;\r
+ EFI_IFR_DEFAULT UOpcodeDefault;\r
+\r
+ ZeroMem (&UOpcode, sizeof(UOpcode));\r
+\r
+ UOpcode.Header.Length = sizeof(UOpcode);\r
+ UOpcode.Header.OpCode = EFI_IFR_NUMERIC_OP;\r
+ //\r
+ // We need to create a nested default value for the UEFI Numeric Opcode.\r
+ // So turn on the scope.\r
+ //\r
+ if (FwOpcode->Default != 0) {\r
+ UOpcode.Header.Scope = 1;\r
+ }\r
+\r
+ UOpcode.Question.Header.Prompt = FwOpcode->Prompt;\r
+ UOpcode.Question.Header.Help = FwOpcode->Help;\r
+\r
+ UOpcode.Question.QuestionId = FwOpcode->Key;\r
+ UOpcode.Question.VarStoreId = RESERVED_VARSTORE_ID;\r
+ UOpcode.Question.VarStoreInfo.VarOffset = FwOpcode->QuestionId;\r
+\r
+ UOpcode.Question.Flags = (FwOpcode->Flags & (FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE | FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED));\r
+\r
+ //\r
+ // Framework Numeric values are all in UINT16 and displayed as decimal.\r
+ //\r
+ UOpcode.data.u16.MinValue = FwOpcode->Minimum;\r
+ UOpcode.data.u16.MaxValue = FwOpcode->Maximum;\r
+ UOpcode.data.u16.Step = FwOpcode->Step;\r
+\r
+ switch (FwOpcode->Width) {\r
+ case 1: \r
+ {\r
+ UOpcode.Flags = EFI_IFR_NUMERIC_SIZE_2 | EFI_IFR_DISPLAY_UINT_DEC; \r
+ break;\r
+ } \r
+ case 2: \r
+ {\r
+ UOpcode.Flags = EFI_IFR_NUMERIC_SIZE_1 | EFI_IFR_DISPLAY_UINT_DEC; \r
+ break;\r
+ }\r
+ default: \r
+ {\r
+ ASSERT (FALSE);\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ }\r
+ \r
+ Status = AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiData);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+ //\r
+ // We need to create a default \r
+ //\r
+ if (FwOpcode->Default != 0) {\r
+ ZeroMem (&UOpcodeDefault, sizeof (UOpcodeDefault));\r
+ UOpcodeDefault.Header.Length = sizeof (UOpcodeDefault);\r
+ UOpcodeDefault.Header.OpCode = EFI_IFR_DEFAULT_OP;\r
+\r
+ UOpcodeDefault.DefaultId = 0;\r
+\r
+ switch (FwOpcode->Width) {\r
+ case 1: \r
+ {\r
+ UOpcodeDefault.Type = EFI_IFR_TYPE_NUM_SIZE_8;\r
+ break;\r
+ } \r
+ case 2: \r
+ {\r
+ UOpcodeDefault.Type = EFI_IFR_TYPE_NUM_SIZE_16;\r
+ break;\r
+ }\r
+ }\r
+\r
+ CopyMem (&UOpcodeDefault.Value.u8, &FwOpcode->Default, FwOpcode->Width);\r
+\r
+ Status = AppendToUpdateBuffer ((UINT8 *) &UOpcodeDefault, sizeof(UOpcodeDefault), UefiData);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+ Status = UCreateEndOfOpcode (UefiData);\r
+ }\r
+\r
+ return Status;\r
+}\r
+\r
+\r
+/*\r
+\r
+typedef struct _EFI_IFR_QUESTION_HEADER {\r
+ EFI_IFR_STATEMENT_HEADER Header;\r
+ EFI_QUESTION_ID QuestionId;\r
+ EFI_VARSTORE_ID VarStoreId;\r
+ union {\r
+ EFI_STRING_ID VarName;\r
+ UINT16 VarOffset;\r
+ } VarStoreInfo;\r
+ UINT8 Flags;\r
+} EFI_IFR_QUESTION_HEADER;\r
+\r
+typedef struct _EFI_IFR_STRING {\r
+ EFI_IFR_OP_HEADER Header;\r
+ EFI_IFR_QUESTION_HEADER Question;\r
+ UINT8 MinSize;\r
+ UINT8 MaxSize;\r
+ UINT8 Flags;\r
+} EFI_IFR_STRING;\r
+\r
+\r
+typedef struct {\r
+ FRAMEWORK_EFI_IFR_OP_HEADER Header;\r
+ UINT16 QuestionId; // The ID designating what the question is about...sucked in from a #define, likely in the form of a variable name\r
+ UINT8 Width; // The Size of the Data being saved -- BUGBUG -- remove someday\r
+ STRING_REF Prompt; // The String Token for the Prompt\r
+ STRING_REF Help; // The string Token for the context-help\r
+ UINT8 Flags; // This is included solely for purposes of interactive/dynamic support.\r
+ UINT16 Key; // Value to be passed to caller to identify this particular op-code\r
+ UINT8 MinSize; // Minimum allowable sized password\r
+ UINT8 MaxSize; // Maximum allowable sized password\r
+} FRAMEWORK_EFI_IFR_STRING;\r
+\r
+\r
+*/\r
+\r
+EFI_STATUS\r
+F2UCreateStringOpCode (\r
+ IN CONST FRAMEWORK_EFI_IFR_STRING *FwOpcode,\r
+ OUT EFI_HII_UPDATE_DATA *UefiData\r
+ )\r
+{\r
+ EFI_IFR_STRING UOpcode;\r
+\r
+ ZeroMem (&UOpcode, sizeof(UOpcode));\r
+\r
+ UOpcode.Header.Length = sizeof(UOpcode);\r
+ UOpcode.Header.OpCode = EFI_IFR_STRING_OP;\r
+\r
+ UOpcode.Question.Header.Prompt = FwOpcode->Prompt;\r
+ UOpcode.Question.Header.Help = FwOpcode->Help;\r
+\r
+ UOpcode.Question.QuestionId = FwOpcode->Key;\r
+ UOpcode.Question.VarStoreId = RESERVED_VARSTORE_ID;\r
+ UOpcode.Question.VarStoreInfo.VarOffset = FwOpcode->QuestionId;\r
+\r
+ UOpcode.Question.Flags = (FwOpcode->Flags & (FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE | FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED));\r
+\r
+ UOpcode.MinSize = FwOpcode->MinSize;\r
+ UOpcode.MaxSize = FwOpcode->MaxSize;\r
+ UOpcode.Flags = EFI_IFR_STRING_MULTI_LINE;\r
+\r
+ return AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiData);\r
+}\r
+\r
+/*\r
+typedef struct _EFI_IFR_GUID_BANNER {\r
+ EFI_IFR_OP_HEADER Header;\r
+ EFI_GUID Guid;\r
+ UINT8 ExtendOpCode; // Extended opcode is EFI_IFR_EXTEND_OP_BANNER\r
+ EFI_STRING_ID Title; // The string token for the banner title\r
+ UINT16 LineNumber; // 1-based line number\r
+ UINT8 Alignment; // left, center, or right-aligned\r
+} EFI_IFR_GUID_BANNER;\r
+\r
+typedef struct {\r
+ FRAMEWORK_EFI_IFR_OP_HEADER Header;\r
+ STRING_REF Title; // The string token for the banner title\r
+ UINT16 LineNumber; // 1-based line number\r
+ UINT8 Alignment; // left, center, or right-aligned\r
+} FRAMEWORK_EFI_IFR_BANNER;\r
+\r
+*/\r
+\r
+EFI_STATUS\r
+F2UCreateBannerOpCode (\r
+ IN CONST FRAMEWORK_EFI_IFR_BANNER *FwOpcode,\r
+ OUT EFI_HII_UPDATE_DATA *UefiData\r
+ )\r
+{\r
+ EFI_IFR_GUID_BANNER UOpcode;\r
+\r
+ ZeroMem (&UOpcode, sizeof(UOpcode));\r
+\r
+ UOpcode.Header.Length = sizeof(UOpcode);\r
+ UOpcode.Header.OpCode = EFI_IFR_GUID_OP;\r
+\r
+ CopyMem (&UOpcode.Guid, &mTianoExtendedOpcodeGuid, sizeof (EFI_GUID));\r
+ UOpcode.ExtendOpCode = EFI_IFR_EXTEND_OP_BANNER;\r
+ UOpcode.Title = FwOpcode->Title;\r
+ UOpcode.LineNumber = FwOpcode->LineNumber;\r
+ UOpcode.Alignment = FwOpcode->Alignment;\r
+\r
+ return AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiData);\r
+}\r
+\r
+\r
+\r
+EFI_STATUS\r
+ThunkFrameworkUpdateDataToUefiUpdateData (\r
+ IN CONST FRAMEWORK_EFI_HII_UPDATE_DATA *Data,\r
+ IN BOOLEAN AddData,\r
+ OUT EFI_HII_UPDATE_DATA **UefiData\r
+ )\r
+{\r
+ FRAMEWORK_EFI_IFR_OP_HEADER *FrameworkOpcodeBuffer;\r
+ FRAMEWORK_EFI_IFR_OP_HEADER *NextFrameworkOpcodeBuffer;\r
+ EFI_HII_UPDATE_DATA *UefiUpdateDataBuffer;\r
+ UINTN Index;\r
+ EFI_STATUS Status;\r
+ static UINTN mOneOfOptionWidth;\r
+\r
+ mOneOfOptionWidth = 0;\r
+ \r
+\r
+ UefiUpdateDataBuffer = AllocateZeroPool (sizeof (EFI_HII_UPDATE_DATA));\r
+ if (UefiUpdateDataBuffer == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+ \r
+ UefiUpdateDataBuffer->Data = AllocateZeroPool (LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL);\r
+ if (UefiUpdateDataBuffer->Data == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ UefiUpdateDataBuffer->BufferSize = LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL;\r
+ UefiUpdateDataBuffer->Offset = 0;\r
+\r
+ FrameworkOpcodeBuffer = (FRAMEWORK_EFI_IFR_OP_HEADER *) &Data->Data;\r
+\r
+ for (Index = 0; Index < Data->DataCount; Index++) {\r
+ switch (FrameworkOpcodeBuffer->OpCode) {\r
+ case FRAMEWORK_EFI_IFR_SUBTITLE_OP:\r
+ Status = F2UCreateSubtitleOpCode ((FRAMEWORK_EFI_IFR_SUBTITLE *) FrameworkOpcodeBuffer, UefiUpdateDataBuffer);\r
+ break;\r
+ \r
+ case FRAMEWORK_EFI_IFR_TEXT_OP:\r
+ Status = F2UCreateTextOpCode ((FRAMEWORK_EFI_IFR_TEXT *) FrameworkOpcodeBuffer, UefiUpdateDataBuffer); \r
+ break;\r
+\r
+ case FRAMEWORK_EFI_IFR_REF_OP:\r
+ Status = F2UCreateGotoOpCode ((FRAMEWORK_EFI_IFR_REF *) FrameworkOpcodeBuffer, UefiUpdateDataBuffer); \r
+ break;\r
+ \r
+ case FRAMEWORK_EFI_IFR_ONE_OF_OP:\r
+ Status = F2UCreateOneOfOpCode ((FRAMEWORK_EFI_IFR_ONE_OF *) FrameworkOpcodeBuffer, UefiUpdateDataBuffer, &NextFrameworkOpcodeBuffer);\r
+ if (!EFI_ERROR (Status)) {\r
+ FrameworkOpcodeBuffer = NextFrameworkOpcodeBuffer;\r
+ //\r
+ // F2UCreateOneOfOpCode has updated FrameworkOpcodeBuffer to point to the next opcode.\r
+ //\r
+ continue;\r
+ }\r
+ break;\r
+\r
+ case FRAMEWORK_EFI_IFR_ORDERED_LIST_OP:\r
+ Status = F2UCreateOrderedListOpCode ((FRAMEWORK_EFI_IFR_ORDERED_LIST *) FrameworkOpcodeBuffer, UefiUpdateDataBuffer, &NextFrameworkOpcodeBuffer);\r
+ if (!EFI_ERROR (Status)) {\r
+ FrameworkOpcodeBuffer = NextFrameworkOpcodeBuffer;\r
+ //\r
+ // F2UCreateOrderedListOpCode has updated FrameworkOpcodeBuffer to point to the next opcode.\r
+ //\r
+ continue;\r
+ }\r
+ break;\r
+ \r
+ case FRAMEWORK_EFI_IFR_CHECKBOX_OP:\r
+ Status = F2UCreateCheckBoxOpCode ((FRAMEWORK_EFI_IFR_CHECKBOX *) FrameworkOpcodeBuffer, UefiUpdateDataBuffer); \r
+ break;\r
+\r
+ case FRAMEWORK_EFI_IFR_STRING_OP:\r
+ Status = F2UCreateStringOpCode ((FRAMEWORK_EFI_IFR_STRING *) FrameworkOpcodeBuffer, UefiUpdateDataBuffer); \r
+ break;\r
+\r
+ case FRAMEWORK_EFI_IFR_BANNER_OP:\r
+ Status = F2UCreateBannerOpCode ((FRAMEWORK_EFI_IFR_BANNER *) FrameworkOpcodeBuffer, UefiUpdateDataBuffer); \r
+ break;\r
+\r
+ case FRAMEWORK_EFI_IFR_END_ONE_OF_OP:\r
+ Status = UCreateEndOfOpcode (UefiUpdateDataBuffer);\r
+ mOneOfOptionWidth = 0;\r
+ break;\r
+ \r
+ default:\r
+ ASSERT (FALSE);\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
+ if (EFI_ERROR (Status)) {\r
+ FreePool (UefiUpdateDataBuffer->Data);\r
+ FreePool (UefiUpdateDataBuffer);\r
+ return Status;\r
+ }\r
+\r
+ FrameworkOpcodeBuffer = (FRAMEWORK_EFI_IFR_OP_HEADER *)((UINT8 *) FrameworkOpcodeBuffer + FrameworkOpcodeBuffer->Length);\r
+ }\r
+\r
+ *UefiData = UefiUpdateDataBuffer;\r
+ \r
+ return EFI_SUCCESS;\r
+}\r
+\r