]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Add support to map more Framework Opcode (such as OrderedList, OneOf, etc) to Uefi...
authorqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 30 Apr 2008 03:20:10 +0000 (03:20 +0000)
committerqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 30 Apr 2008 03:20:10 +0000 (03:20 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@5152 6f19259b-4bc3-4df7-8a09-765794883524

EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Forms.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/FrameworkHiiToUefiHiiThunk.inf
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/OpcodeCreation.c [new file with mode: 0644]
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/OpcodeCreation.h [new file with mode: 0644]
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Package.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/ThunkIfrSupportLib.h [new file with mode: 0644]
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/UefiIfrDefault.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/UefiIfrDefault.h

index e5615cf8a49e8ffcaf9a076997b0f2fa4a396710..95bd618bb6414a23717b62a5d28c381287fe1e5b 100644 (file)
@@ -15,6 +15,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 #include "HiiDatabase.h"\r
 #include "UefiIfrDefault.h"\r
+#include "OpcodeCreation.h"\r
 \r
 EFI_STATUS\r
 EFIAPI\r
@@ -189,128 +190,6 @@ ThunkUpdateFormCallBack (
   return EFI_SUCCESS;\r
 }\r
 \r
-#define LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL   0x1000\r
-\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
-F2UCreateSubtitleOpCode (\r
-  IN CONST FRAMEWORK_EFI_IFR_SUBTITLE  *FwSubTitle,\r
-  OUT      EFI_HII_UPDATE_DATA         *UefiData\r
-  )\r
-{\r
-  EFI_IFR_SUBTITLE USubTitle;\r
-\r
-  ZeroMem (&USubTitle, sizeof(USubTitle));\r
-\r
-  USubTitle.Header.OpCode = EFI_IFR_SUBTITLE_OP;\r
-  USubTitle.Header.Length = sizeof (EFI_IFR_SUBTITLE);\r
-\r
-  USubTitle.Statement.Prompt = FwSubTitle->SubTitle;\r
-\r
-  return AppendToUpdateBuffer ((UINT8 *)&USubTitle, sizeof(EFI_IFR_SUBTITLE), 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 UText;\r
-\r
-  ZeroMem (&UText, sizeof(UText));\r
-  \r
-  UText.Header.OpCode = EFI_IFR_TEXT_OP;\r
-  UText.Header.Length = sizeof (EFI_IFR_TEXT);\r
-\r
-  UText.Statement.Help   = FwText->Help;\r
-\r
-  UText.Statement.Prompt = FwText->Text;\r
-  UText.TextTwo          = FwText->TextTwo;\r
-  \r
-  return AppendToUpdateBuffer ((UINT8 *) &UText, sizeof(EFI_IFR_TEXT), UefiData);\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
-  EFI_HII_UPDATE_DATA                  *UefiUpdateDataBuffer;\r
-  UINTN                                Index;\r
-  EFI_STATUS                           Status;\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
-      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
 STATIC\r
 EFI_STATUS\r
@@ -569,7 +448,8 @@ Returns:
 \r
     UefiHiiUpdateData = NULL;\r
     \r
-    ThunkFrameworkUpdateDataToUefiUpdateData (Data, AddData, &UefiHiiUpdateData);\r
+    Status = ThunkFrameworkUpdateDataToUefiUpdateData (Data, AddData, &UefiHiiUpdateData);\r
+    ASSERT_EFI_ERROR (Status);\r
 \r
     Status = ThunkLocateFormId (UefiHiiHandle, Label, &FormsetGuid, &FormId);\r
     ASSERT_EFI_ERROR (Status);\r
index 9026256f491525ea9ad962f036c22d443851894e..5ccb1d64c786378bd8cff8a883d4395585209411 100644 (file)
@@ -33,6 +33,8 @@
 #\r
 \r
 [Sources.common]\r
+  OpcodeCreation.c\r
+  OpcodeCreation.h\r
   UefiIfrParserInternal.h\r
   UefiIfrParserCommon.c\r
   UefiIfrParserCommon.h\r
diff --git a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/OpcodeCreation.c b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/OpcodeCreation.c
new file mode 100644 (file)
index 0000000..fb6169b
--- /dev/null
@@ -0,0 +1,845 @@
+/** @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
diff --git a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/OpcodeCreation.h b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/OpcodeCreation.h
new file mode 100644 (file)
index 0000000..061937d
--- /dev/null
@@ -0,0 +1,111 @@
+/** @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
+\r
+#ifndef _HII_THUNK_OPCODE_CREATION_H\r
+#define _HII_THUNK_OPCODE_CREATION_H\r
+\r
+EFI_STATUS\r
+UCreateEndOfOpcode (\r
+  OUT      EFI_HII_UPDATE_DATA         *UefiData\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+F2UCreateSubtitleOpCode (\r
+  IN CONST FRAMEWORK_EFI_IFR_SUBTITLE  *FwOpcode,\r
+  OUT      EFI_HII_UPDATE_DATA         *UefiData\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+F2UCreateTextOpCode (\r
+  IN CONST FRAMEWORK_EFI_IFR_TEXT      *FwOpcode,\r
+  OUT      EFI_HII_UPDATE_DATA         *UefiData\r
+  )\r
+;\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
+\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
+\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
+\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
+\r
+\r
+EFI_STATUS\r
+F2UCreateCheckBoxOpCode (\r
+  IN CONST FRAMEWORK_EFI_IFR_CHECKBOX  *FwOpcode,\r
+  OUT      EFI_HII_UPDATE_DATA         *UefiData\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
+\r
+\r
+EFI_STATUS\r
+F2UCreateStringOpCode (\r
+  IN CONST FRAMEWORK_EFI_IFR_STRING    *FwOpcode,\r
+  OUT      EFI_HII_UPDATE_DATA         *UefiData\r
+  )\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
+\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
+#endif\r
+\r
index c22c5a65250bfb67fd5f8ead5512c363f0050693..a1370eae35e5a7365932930d20d6fbecfd9ab104 100644 (file)
@@ -331,7 +331,8 @@ UefiRegisterPackageList(
   Status = GetIfrAndStringPackNum (Packages, &IfrPackNum, &StringPackNum);\r
   ASSERT_EFI_ERROR (Status);\r
   //\r
-  // Thunk Layer only handle the following combinations of IfrPack, StringPkg and FontPack\r
+  // Thunk Layer only handle the following combinations of IfrPack, StringPkg and FontPack.\r
+  // Thunk Layer only allow zero or one IfrPack in the Package List.\r
   //\r
   if (IfrPackNum > 1) {\r
     return EFI_UNSUPPORTED;\r
@@ -365,7 +366,7 @@ UefiRegisterPackageList(
 \r
   //\r
   // UEFI HII require EFI_HII_CONFIG_ACCESS_PROTOCOL to be installed on a EFI_HANDLE, so\r
-  // that Setup Utility will load the Buffer Storage\r
+  // that Setup Utility can load the Buffer Storage using this protocol.\r
   //\r
   if (IfrPackNum != 0) {\r
     InstallDefaultUefiConfigAccessProtocol (Packages, &UefiHiiDriverHandle, HandleMappingEntry);\r
diff --git a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/ThunkIfrSupportLib.h b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/ThunkIfrSupportLib.h
new file mode 100644 (file)
index 0000000..bd74331
--- /dev/null
@@ -0,0 +1,29 @@
+/**@file\r
+\r
+  This file contains utility functions by HII Thunk Modules.\r
+  \r
+Copyright (c) 2006 - 2008, 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
+\r
+#ifndef _THUNK_IFR_SUPPORTLIB_H\r
+#define _THUNK_IFR_SUPPORTLIB_H\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+#endif\r
index 2ba1ffc1284ea5a9a0f07d40b0f9761e47706f2b..fa01c3f7dc23c07923c2f61d58243242d9842f47 100644 (file)
@@ -708,7 +708,7 @@ UefiDefaultsToFrameworkDefaults (
       // So the default storage of Var Store in VFR from a Framework module \r
       // should be translated to 0xFFEE.\r
       //\r
-      if (Node->StoreId == 0xFFEE) {\r
+      if (Node->StoreId == RESERVED_VARSTORE_ID) {\r
         Pack->VariableId = 0;\r
       }\r
       //\r
index ee54e32e8e1f248675c75aa3b7a18883ca792af5..efdbf333a253f85fdb7bc177304e8c7b1817b80f 100644 (file)
 #ifndef _HII_THUNK_UEFI_IFR_DEFAULT_\r
 #define _HII_THUNK_UEFI_IFR_DEFAULT_\r
 \r
+//\r
+// VARSTORE ID of 0 for Buffer Storage Type Storage is reserved in UEFI IFR form. But VARSTORE ID\r
+// 0 in Framework IFR is the default VarStore ID for storage without explicit declaration. So we have\r
+// to reseved 0xFFEE in UEFI VARSTORE ID to represetn default storage id in Framework IFR.\r
+// Framework VFR has to be ported or pre-processed to change the default VARSTORE to a VARSTORE\r
+// with ID equal to 0xFFEE.\r
+//\r
+#define RESERVED_VARSTORE_ID 0xFFEE\r
 \r
 #define UEFI_IFR_BUFFER_STORAGE_NODE_FROM_LIST(a) CR(a, UEFI_IFR_BUFFER_STORAGE_NODE, List, UEFI_IFR_BUFFER_STORAGE_NODE_SIGNATURE)\r
 #define UEFI_IFR_BUFFER_STORAGE_NODE_SIGNATURE  EFI_SIGNATURE_32 ('I', 'b', 'S', 'n')\r