]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/OpcodeCreation.c
Bug fixes for FrameworkHiiToUefiHiiThunk;
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / FrameworkHiiToUefiHiiThunk / OpcodeCreation.c
index e71cb9d8b91c87c385f9bcad064d967cb267f140..87763853759a9aad049e126625d531914be54dcc 100644 (file)
@@ -44,6 +44,41 @@ AppendToUpdateBuffer (
   return EFI_SUCCESS;\r
 }\r
 \r
+\r
+\r
+EFI_STATUS\r
+FwQuestionIdToUefiQuestionId (\r
+  IN HII_THUNK_CONTEXT            *ThunkContext,\r
+  IN UINT16                       VarStoreId,\r
+  IN UINT16                       FwId,\r
+  OUT EFI_QUESTION_ID             *UefiQId\r
+  )\r
+{\r
+  LIST_ENTRY                *MapEntryListHead;\r
+  LIST_ENTRY                *Link;\r
+  QUESTION_ID_MAP_ENTRY     *MapEntry;\r
+\r
+  MapEntryListHead = GetMapEntryListHead (ThunkContext, VarStoreId);\r
+  ASSERT (MapEntryListHead != NULL);\r
+\r
+  Link = GetFirstNode (MapEntryListHead);\r
+\r
+  while (!IsNull (MapEntryListHead, Link)) {\r
+    MapEntry = QUESTION_ID_MAP_ENTRY_FROM_LINK (Link);\r
+\r
+    if (MapEntry->FwQId == FwId) {\r
+      *UefiQId = MapEntry->UefiQid;\r
+      return EFI_SUCCESS;\r
+    }\r
+\r
+    Link = GetNextNode (MapEntryListHead, Link);\r
+  }\r
+\r
+  return EFI_NOT_FOUND;\r
+}\r
+\r
+\r
+\r
 EFI_STATUS\r
 UCreateEndOfOpcode (\r
   OUT      EFI_HII_UPDATE_DATA         *UefiData\r
@@ -83,19 +118,39 @@ F2UCreateTextOpCode (
   OUT      EFI_HII_UPDATE_DATA         *UefiData\r
   )\r
 {\r
-  EFI_IFR_TEXT UOpcode;\r
+  EFI_IFR_TEXT      UTextOpCode;\r
+  EFI_IFR_ACTION    UActionOpCode;\r
 \r
-  ZeroMem (&UOpcode, sizeof(UOpcode));\r
-  \r
-  UOpcode.Header.OpCode = EFI_IFR_TEXT_OP;\r
-  UOpcode.Header.Length = sizeof (EFI_IFR_TEXT);\r
+  if ((FwText->Flags & FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE) == 0) {\r
+    ZeroMem (&UTextOpCode, sizeof(UTextOpCode));\r
+    \r
+    UTextOpCode.Header.OpCode = EFI_IFR_TEXT_OP;\r
+    UTextOpCode.Header.Length = sizeof (EFI_IFR_TEXT);\r
 \r
-  UOpcode.Statement.Help   = FwText->Help;\r
+    UTextOpCode.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
+    UTextOpCode.Statement.Prompt = FwText->Text;\r
+    UTextOpCode.TextTwo          = FwText->TextTwo;\r
+    \r
+    return AppendToUpdateBuffer ((UINT8 *) &UTextOpCode, sizeof(UTextOpCode), UefiData);\r
+  } else {\r
+    //\r
+    // Iteractive Text Opcode is EFI_IFR_ACTION\r
+    //\r
+\r
+    ZeroMem (&UActionOpCode, sizeof (UActionOpCode));\r
+\r
+    UActionOpCode.Header.OpCode = EFI_IFR_ACTION_OP;\r
+    UActionOpCode.Header.Length = sizeof (EFI_IFR_ACTION);\r
+\r
+    UActionOpCode.Question.Header.Prompt = FwText->Text;\r
+    UActionOpCode.Question.Header.Help  = FwText->Help;\r
+    UActionOpCode.Question.Flags      = EFI_IFR_FLAG_CALLBACK;\r
+    UActionOpCode.Question.QuestionId = FwText->Key;\r
+\r
+    return AppendToUpdateBuffer ((UINT8 *) &UActionOpCode, sizeof(UActionOpCode), UefiData);\r
+    \r
+  }\r
 }\r
 \r
 /*\r
@@ -267,21 +322,26 @@ typedef struct {
 \r
 EFI_STATUS\r
 F2UCreateOneOfOpCode (\r
+  IN       HII_THUNK_CONTEXT           *ThunkContext,\r
+  IN       UINT16                      VarStoreId,\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
   OUT      UINTN                       *DataCount\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
+  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
+  ONE_OF_OPTION_MAP                   *OneOfOptionMap;\r
+  ONE_OF_OPTION_MAP_ENTRY             *OneOfOptionMapEntry;\r
 \r
   ASSERT (NextFwOpcode != NULL);\r
   ASSERT (DataCount != NULL);\r
 \r
+  OneOfOptionMap = NULL;\r
+\r
   ZeroMem (&UOpcode, sizeof(UOpcode));\r
   *DataCount = 0;\r
 \r
@@ -292,29 +352,78 @@ F2UCreateOneOfOpCode (
   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
-  *DataCount += 1;\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
+    if ((FwOneOfOp->Flags & FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE) != 0) {\r
+      UOpcode.Question.Flags |= EFI_IFR_FLAG_CALLBACK;\r
+      \r
+      if (UOpcode.Question.QuestionId == 0) {\r
+        Status = FwQuestionIdToUefiQuestionId (ThunkContext, VarStoreId, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
+        if (EFI_ERROR (Status)) {\r
+          UOpcode.Question.QuestionId = FwOneOfOp->Key;\r
+        }\r
+\r
+        OneOfOptionMap = AllocateZeroPool (sizeof (ONE_OF_OPTION_MAP));\r
+        ASSERT (OneOfOptionMap != NULL);\r
+        OneOfOptionMap->Signature = ONE_OF_OPTION_MAP_SIGNATURE;\r
+        OneOfOptionMap->QuestionId = UOpcode.Question.QuestionId;\r
+        InitializeListHead (&OneOfOptionMap->OneOfOptionMapEntryListHead);\r
+        switch (FwOpcode->Width) {\r
+        case 1:\r
+          OneOfOptionMap->ValueType = EFI_IFR_TYPE_NUM_SIZE_8;\r
+          break;\r
+        case 2:\r
+          OneOfOptionMap->ValueType = EFI_IFR_TYPE_NUM_SIZE_16;\r
+        default:\r
+          ASSERT (FALSE);\r
+          break;\r
+        }\r
+\r
+        InsertTailList (&ThunkContext->OneOfOptionMapListHead, &OneOfOptionMap->Link);\r
+      } else {      \r
+        OneOfOptionMapEntry = AllocateZeroPool (sizeof (ONE_OF_OPTION_MAP_ENTRY));\r
+        ASSERT (OneOfOptionMapEntry != NULL);\r
+\r
+        OneOfOptionMapEntry->FwKey = FwOneOfOp->Key;\r
+        OneOfOptionMapEntry->Signature = ONE_OF_OPTION_MAP_ENTRY_SIGNATURE;\r
+        \r
+        CopyMem (&OneOfOptionMapEntry->Value, &FwOneOfOp->Value, FwOpcode->Width);\r
+\r
+        ASSERT (OneOfOptionMap != NULL);\r
+        InsertTailList (&OneOfOptionMap->OneOfOptionMapEntryListHead, &OneOfOptionMapEntry->Link);\r
+      }\r
+    }\r
+\r
+    if (FwOneOfOp->Flags & FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED) {\r
+      UOpcode.Question.Flags |= EFI_IFR_FLAG_RESET_REQUIRED;\r
     }\r
 \r
     FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpHeader + FwOpHeader->Length);\r
   }\r
 \r
+\r
+  if (UOpcode.Question.QuestionId == 0) {\r
+    //\r
+    // Assign QuestionId if still not assigned.\r
+    //\r
+    Status = FwQuestionIdToUefiQuestionId (ThunkContext, VarStoreId, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
+    if (EFI_ERROR (Status)) {\r
+      UOpcode.Question.QuestionId = FwOpcode->QuestionId;\r
+    }\r
+  }\r
+  \r
+  Status = AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof (UOpcode), UefiData);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+  *DataCount += 1;\r
+\r
   //\r
   // Go over again the Framework IFR binary to build the UEFI One Of Option opcodes.\r
   //\r
@@ -367,6 +476,8 @@ typedef struct {
 */\r
 EFI_STATUS\r
 F2UCreateOrderedListOpCode (\r
+  IN       HII_THUNK_CONTEXT               *ThunkContext,\r
+  IN       UINT16                      VarStoreId,\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
@@ -376,6 +487,7 @@ F2UCreateOrderedListOpCode (
   EFI_IFR_ORDERED_LIST              UOpcode;\r
   EFI_STATUS                        Status;\r
   FRAMEWORK_EFI_IFR_OP_HEADER       *FwOpHeader;\r
+  FRAMEWORK_EFI_IFR_ONE_OF_OPTION     *FwOneOfOp;\r
 \r
   ZeroMem (&UOpcode, sizeof(UOpcode));\r
   *DataCount = 0;\r
@@ -386,8 +498,43 @@ F2UCreateOrderedListOpCode (
 \r
   UOpcode.Question.Header.Prompt = FwOpcode->Prompt;\r
   UOpcode.Question.Header.Help = FwOpcode->Help;\r
+  UOpcode.Question.VarStoreId  = VarStoreId;\r
 \r
   UOpcode.MaxContainers = FwOpcode->MaxEntries;\r
+\r
+  //\r
+  // Go over the Framework IFR binary to get the QuestionId for generated UEFI One Of Option opcode\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
+    ASSERT (FwOpHeader->OpCode == FRAMEWORK_EFI_IFR_ONE_OF_OPTION_OP);\r
+    \r
+    FwOneOfOp = (FRAMEWORK_EFI_IFR_ONE_OF_OPTION *) FwOpHeader;\r
+    if ((FwOneOfOp->Flags & FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE) != 0) {\r
+      UOpcode.Question.Flags |= EFI_IFR_FLAG_CALLBACK;\r
+      \r
+      if (UOpcode.Question.QuestionId == 0) {\r
+        Status = FwQuestionIdToUefiQuestionId (ThunkContext, VarStoreId, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
+        if (EFI_ERROR (Status)) {\r
+          UOpcode.Question.QuestionId = FwOneOfOp->Key;\r
+        }\r
+\r
+      }\r
+    }\r
+\r
+    if (FwOneOfOp->Flags & FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED) {\r
+      UOpcode.Question.Flags |= EFI_IFR_FLAG_RESET_REQUIRED;\r
+    }\r
+\r
+    FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpHeader + FwOpHeader->Length);\r
+  }\r
+\r
+  if (UOpcode.Question.QuestionId == 0) {\r
+    Status = FwQuestionIdToUefiQuestionId (ThunkContext, VarStoreId, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
+    if (EFI_ERROR (Status)) {\r
+      UOpcode.Question.QuestionId = FwOpcode->QuestionId;\r
+    }\r
+  }\r
  \r
   Status = AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiData);\r
   if (EFI_ERROR (Status)) {\r
@@ -397,7 +544,10 @@ F2UCreateOrderedListOpCode (
 \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
+    //\r
+    // Each entry of Order List in Framework HII is always 1 byte in size\r
+    //\r
+    Status = F2UCreateOneOfOptionOpCode ((CONST FRAMEWORK_EFI_IFR_ONE_OF_OPTION *) FwOpHeader, 1, UefiData);\r
     if (EFI_ERROR (Status)) {\r
       return Status;\r
     }\r
@@ -450,10 +600,13 @@ typedef struct {
 \r
 EFI_STATUS\r
 F2UCreateCheckBoxOpCode (\r
+  IN       HII_THUNK_CONTEXT           *ThunkContext,\r
+  IN       UINT16                      VarStoreId,\r
   IN CONST FRAMEWORK_EFI_IFR_CHECKBOX  *FwOpcode,\r
   OUT      EFI_HII_UPDATE_DATA         *UefiData\r
   )\r
 {\r
+  EFI_STATUS       Status;\r
   EFI_IFR_CHECKBOX UOpcode;\r
 \r
   ZeroMem (&UOpcode, sizeof(UOpcode));\r
@@ -464,7 +617,18 @@ F2UCreateCheckBoxOpCode (
   UOpcode.Question.Header.Prompt = FwOpcode->Prompt;\r
   UOpcode.Question.Header.Help = FwOpcode->Help;\r
 \r
-  UOpcode.Question.QuestionId    = FwOpcode->Key;\r
+  if (FwOpcode->Key == 0) {\r
+    Status = FwQuestionIdToUefiQuestionId (ThunkContext, VarStoreId, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
+    if (EFI_ERROR (Status)) {\r
+      //\r
+      // Add a new opcode and it will not trigger call back. So we just reuse the FW QuestionId.\r
+      //\r
+      UOpcode.Question.QuestionId = FwOpcode->QuestionId;\r
+    }\r
+  } else {\r
+    UOpcode.Question.QuestionId    = FwOpcode->Key;\r
+  }\r
+\r
   UOpcode.Question.VarStoreId    = RESERVED_VARSTORE_ID;\r
   UOpcode.Question.VarStoreInfo.VarOffset = FwOpcode->QuestionId;\r
 \r
@@ -478,8 +642,8 @@ F2UCreateCheckBoxOpCode (
 \r
   //\r
   // We also map 2 flags:\r
-  //      FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE\r
-  //      FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED,\r
+  //      FRAMEWORK_EFI_IFR_FLAG_DEFAULT\r
+  //      FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING,\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
@@ -550,6 +714,8 @@ typedef struct {
 \r
 EFI_STATUS\r
 F2UCreateNumericOpCode (\r
+  IN       HII_THUNK_CONTEXT               *ThunkContext,\r
+  IN       UINT16                      VarStoreId,\r
   IN CONST FRAMEWORK_EFI_IFR_NUMERIC   *FwOpcode,\r
   OUT      EFI_HII_UPDATE_DATA         *UefiData\r
   )\r
@@ -560,6 +726,18 @@ F2UCreateNumericOpCode (
 \r
   ZeroMem (&UOpcode, sizeof(UOpcode));\r
 \r
+  if (FwOpcode->Key == 0) {\r
+    Status = FwQuestionIdToUefiQuestionId (ThunkContext, VarStoreId, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
+    if (EFI_ERROR (Status)) {\r
+      //\r
+      // Add a new opcode and it will not trigger call back. So we just reuse the FW QuestionId.\r
+      //\r
+      UOpcode.Question.QuestionId = FwOpcode->QuestionId;\r
+    }\r
+  } else {\r
+    UOpcode.Question.QuestionId    = FwOpcode->Key;\r
+  }\r
+\r
   UOpcode.Header.Length = sizeof(UOpcode);\r
   UOpcode.Header.OpCode = EFI_IFR_NUMERIC_OP;\r
   //\r
@@ -574,6 +752,9 @@ F2UCreateNumericOpCode (
   UOpcode.Question.Header.Help = FwOpcode->Help;\r
 \r
   UOpcode.Question.QuestionId    = FwOpcode->Key;\r
+  //\r
+  // BUGBUG RESERVED_VARSTORE_ID should be passed in.\r
+  //\r
   UOpcode.Question.VarStoreId    = RESERVED_VARSTORE_ID;\r
   UOpcode.Question.VarStoreInfo.VarOffset = FwOpcode->QuestionId;\r
 \r
@@ -684,6 +865,8 @@ typedef struct {
 \r
 EFI_STATUS\r
 F2UCreateStringOpCode (\r
+  IN       HII_THUNK_CONTEXT               *ThunkContext,\r
+  IN       UINT16                      VarStoreId,\r
   IN CONST FRAMEWORK_EFI_IFR_STRING    *FwOpcode,\r
   OUT      EFI_HII_UPDATE_DATA         *UefiData\r
   )\r
@@ -692,6 +875,12 @@ F2UCreateStringOpCode (
 \r
   ZeroMem (&UOpcode, sizeof(UOpcode));\r
 \r
+  if (FwOpcode->Key == 0) {\r
+    FwQuestionIdToUefiQuestionId (ThunkContext, VarStoreId, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
+  } else {\r
+    UOpcode.Question.QuestionId    = FwOpcode->Key;\r
+  }\r
+\r
   UOpcode.Header.Length = sizeof(UOpcode);\r
   UOpcode.Header.OpCode = EFI_IFR_STRING_OP;\r
 \r
@@ -753,113 +942,116 @@ F2UCreateBannerOpCode (
 }\r
 \r
 \r
-\r
 EFI_STATUS\r
-ThunkFrameworkUpdateDataToUefiUpdateData (\r
+FwUpdateDataToUefiUpdateData (\r
+  IN       HII_THUNK_CONTEXT                 *ThunkContext,\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
+  FRAMEWORK_EFI_IFR_OP_HEADER          *FwOpCode;\r
+  FRAMEWORK_EFI_IFR_OP_HEADER          *NextFwOpCode;\r
+  EFI_HII_UPDATE_DATA                  *UefiOpCode;\r
   UINTN                                Index;\r
   EFI_STATUS                           Status;\r
   UINTN                                DataCount;\r
-  static UINTN                         mOneOfOptionWidth;\r
+  UINT16                               VarStoreId;\r
 \r
-  mOneOfOptionWidth = 0;\r
-  \r
+  //\r
+  // Assume all dynamic opcode created is using active variable with VarStoreId of 1.\r
+  //\r
+  VarStoreId = 1;\r
 \r
-  UefiUpdateDataBuffer = AllocateZeroPool (sizeof (EFI_HII_UPDATE_DATA));\r
-  if (UefiUpdateDataBuffer == NULL) {\r
+  UefiOpCode = AllocateZeroPool (sizeof (EFI_HII_UPDATE_DATA));\r
+  if (UefiOpCode == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
   \r
-  UefiUpdateDataBuffer->Data = AllocateZeroPool (LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL);\r
-  if (UefiUpdateDataBuffer->Data == NULL) {\r
+  UefiOpCode->Data = AllocateZeroPool (LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL);\r
+  if (UefiOpCode->Data == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
-  UefiUpdateDataBuffer->BufferSize = LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL;\r
-  UefiUpdateDataBuffer->Offset = 0;\r
+  UefiOpCode->BufferSize = LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL;\r
+  UefiOpCode->Offset = 0;\r
 \r
-  FrameworkOpcodeBuffer = (FRAMEWORK_EFI_IFR_OP_HEADER *) &Data->Data;\r
+  FwOpCode = (FRAMEWORK_EFI_IFR_OP_HEADER *) &Data->Data;\r
 \r
   for (Index = 0; Index < Data->DataCount; Index += DataCount) {\r
-    //\r
-    // By default Datacount is 1. For FRAMEWORK_EFI_IFR_ONE_OF_OP and FRAMEWORK_EFI_IFR_ORDERED_LIST_OP,\r
-    // DataCount maybe more than 1.\r
-    //\r
-    DataCount = 1;\r
-    switch (FrameworkOpcodeBuffer->OpCode) {\r
+    switch (FwOpCode->OpCode) {\r
       case FRAMEWORK_EFI_IFR_SUBTITLE_OP:\r
-        Status = F2UCreateSubtitleOpCode ((FRAMEWORK_EFI_IFR_SUBTITLE  *) FrameworkOpcodeBuffer, UefiUpdateDataBuffer);\r
+        Status = F2UCreateSubtitleOpCode ((FRAMEWORK_EFI_IFR_SUBTITLE  *) FwOpCode, UefiOpCode);\r
+        DataCount = 1;\r
         break;\r
         \r
       case FRAMEWORK_EFI_IFR_TEXT_OP:\r
-        Status = F2UCreateTextOpCode ((FRAMEWORK_EFI_IFR_TEXT  *) FrameworkOpcodeBuffer, UefiUpdateDataBuffer);  \r
+        Status = F2UCreateTextOpCode ((FRAMEWORK_EFI_IFR_TEXT  *) FwOpCode, UefiOpCode);  \r
+        DataCount = 1;\r
         break;\r
 \r
       case FRAMEWORK_EFI_IFR_REF_OP:\r
-        Status = F2UCreateGotoOpCode ((FRAMEWORK_EFI_IFR_REF *) FrameworkOpcodeBuffer, UefiUpdateDataBuffer);  \r
+        Status = F2UCreateGotoOpCode ((FRAMEWORK_EFI_IFR_REF *) FwOpCode, UefiOpCode);  \r
+        DataCount = 1;\r
         break;\r
         \r
       case FRAMEWORK_EFI_IFR_ONE_OF_OP:\r
-        Status = F2UCreateOneOfOpCode ((FRAMEWORK_EFI_IFR_ONE_OF *) FrameworkOpcodeBuffer, UefiUpdateDataBuffer, &NextFrameworkOpcodeBuffer, &DataCount);\r
+        Status = F2UCreateOneOfOpCode (ThunkContext, VarStoreId, (FRAMEWORK_EFI_IFR_ONE_OF *) FwOpCode, UefiOpCode, &NextFwOpCode, &DataCount);\r
         if (!EFI_ERROR (Status)) {\r
-          FrameworkOpcodeBuffer = NextFrameworkOpcodeBuffer;\r
+          FwOpCode = NextFwOpCode;\r
           //\r
-          // F2UCreateOneOfOpCode has updated FrameworkOpcodeBuffer to point to the next opcode.\r
+          // FwOpCode is already updated 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, &DataCount);\r
+        Status = F2UCreateOrderedListOpCode (ThunkContext, VarStoreId, (FRAMEWORK_EFI_IFR_ORDERED_LIST *) FwOpCode, UefiOpCode, &NextFwOpCode, &DataCount);\r
         if (!EFI_ERROR (Status)) {\r
-          FrameworkOpcodeBuffer = NextFrameworkOpcodeBuffer;\r
+          FwOpCode = NextFwOpCode;\r
           //\r
-          // F2UCreateOrderedListOpCode has updated FrameworkOpcodeBuffer to point to the next opcode.\r
+          // FwOpCode is already updated 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
+        Status = F2UCreateCheckBoxOpCode (ThunkContext, VarStoreId, (FRAMEWORK_EFI_IFR_CHECKBOX *) FwOpCode, UefiOpCode);  \r
+        DataCount = 1;\r
         break;\r
 \r
       case FRAMEWORK_EFI_IFR_STRING_OP:\r
-        Status = F2UCreateStringOpCode ((FRAMEWORK_EFI_IFR_STRING *) FrameworkOpcodeBuffer, UefiUpdateDataBuffer);  \r
+        Status = F2UCreateStringOpCode (ThunkContext, VarStoreId, (FRAMEWORK_EFI_IFR_STRING *) FwOpCode, UefiOpCode);  \r
+        DataCount = 1;\r
         break;\r
 \r
       case FRAMEWORK_EFI_IFR_BANNER_OP:\r
-        Status = F2UCreateBannerOpCode ((FRAMEWORK_EFI_IFR_BANNER *) FrameworkOpcodeBuffer, UefiUpdateDataBuffer);  \r
+        Status = F2UCreateBannerOpCode ((FRAMEWORK_EFI_IFR_BANNER *) FwOpCode, UefiOpCode);  \r
+        DataCount = 1;\r
         break;\r
 \r
       case FRAMEWORK_EFI_IFR_END_ONE_OF_OP:\r
-        Status = UCreateEndOfOpcode (UefiUpdateDataBuffer);\r
-        mOneOfOptionWidth = 0;\r
+        Status = UCreateEndOfOpcode (UefiOpCode);\r
+        DataCount = 1;\r
         break;\r
-        \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
+      FreePool (UefiOpCode->Data);\r
+      FreePool (UefiOpCode);\r
       return Status;\r
     }\r
 \r
-    FrameworkOpcodeBuffer = (FRAMEWORK_EFI_IFR_OP_HEADER *)((UINT8 *) FrameworkOpcodeBuffer + FrameworkOpcodeBuffer->Length);\r
+    FwOpCode = (FRAMEWORK_EFI_IFR_OP_HEADER *)((UINT8 *) FwOpCode + FwOpCode->Length);\r
   }\r
 \r
-  *UefiData = UefiUpdateDataBuffer;\r
+  *UefiData = UefiOpCode;\r
   \r
   return EFI_SUCCESS;\r
 }\r