]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkCompatibilityPkg/Compatibility/FrameworkHiiOnUefiHiiThunk/OpcodeCreation.c
MdePkg: introduce standalone MM entry point library implementation
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / FrameworkHiiOnUefiHiiThunk / OpcodeCreation.c
index 3ac72115794692765bbbf9be4c58a2a1ec481b6e..a3ddce9b44ec6d55a1514ad88ea4825555f1a307 100644 (file)
@@ -2,8 +2,8 @@
 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
+Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>\r
+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
@@ -26,7 +26,7 @@ typedef struct {
   UINT8 UefiIfrOp;\r
 } IFR_OPCODE_MAP;\r
   \r
-IFR_OPCODE_MAP mQuestionOpcodeMap [] = {\r
+IFR_OPCODE_MAP QuestionOpcodeMap[] = {\r
   { FRAMEWORK_EFI_IFR_ONE_OF_OP,        EFI_IFR_ONE_OF_OP},\r
   { FRAMEWORK_EFI_IFR_CHECKBOX_OP,      EFI_IFR_CHECKBOX_OP},\r
   { FRAMEWORK_EFI_IFR_NUMERIC_OP,       EFI_IFR_NUMERIC_OP},\r
@@ -51,25 +51,27 @@ QuestionOpFwToUefi (
 {\r
   UINTN       Index;\r
 \r
-  for (Index = 0; Index < sizeof (mQuestionOpcodeMap) / sizeof (mQuestionOpcodeMap[0]); Index++) {\r
-    if (FwOp == mQuestionOpcodeMap[Index].FrameworkIfrOp) {\r
-      *UefiOp = mQuestionOpcodeMap[Index].UefiIfrOp;\r
+  for (Index = 0; Index < ARRAY_SIZE (QuestionOpcodeMap); Index++) {\r
+    if (FwOp == QuestionOpcodeMap[Index].FrameworkIfrOp) {\r
+      *UefiOp = QuestionOpcodeMap[Index].UefiIfrOp;\r
       return EFI_SUCCESS;\r
     }\r
   }\r
 \r
-  *UefiOp = (UINT8) (FRAMEWORK_EFI_IFR_LAST_OPCODE + 1);\r
+  *UefiOp = (UINT8) (EFI_IFR_LAST_OPCODE + 1);\r
   return EFI_NOT_FOUND;\r
 }\r
 \r
 /**\r
-  Translate a Framework Question Opcode to UEFI Question Opcode.\r
+  Translate a Framework Question ID to UEFI Question ID.\r
 \r
-  @param FwOp     Framework Opcode.\r
-  @param UefiOp   UEFI Opcode.\r
+  @param FormSet   FormSet context\r
+  @param FwOpCode  Framework Opcode\r
+  @param FwQId     Framework Question Id\r
+  @param UefiQId   UEFI Question ID.\r
 \r
-  @retval     EFI_SUCCESS     The UEFI opcode is found and returned.\r
-  @retval     EFI_NOT_FOUND   The UEFI opcode is not found.\r
+  @retval     EFI_SUCCESS     The UEFI Question Id is found and returned.\r
+  @retval     EFI_NOT_FOUND   The UEFI Question Id is not found.\r
 **/\r
 EFI_STATUS\r
 FwQIdToUefiQId (\r
@@ -150,6 +152,9 @@ FwQIdToUefiQId (
 \r
   If FwQuestionId is not 0, then it is used as the Framework Question ID.\r
 \r
+  @param FwQuestionId \r
+  @param FormSet      \r
+\r
   @return The Framework Question ID.\r
 **/\r
 EFI_QUESTION_ID\r
@@ -169,8 +174,8 @@ AssignQuestionId (
 /**\r
   Create UEFI HII Text Opcode from a Framework HII Text Opcode.\r
 \r
-  @param FwOpcode              The input Framework Opcode.\r
   @param UefiUpdateDataHandle  The newly created UEFI HII opcode is appended to UefiUpdateDataHandle.\r
+  @param FwOpcode              The input Framework Opcode.\r
 \r
   @retval NULL   There is not enough space left in Buffer to add the opcode.\r
   @retval Other  A pointer to the created opcode.\r
@@ -184,11 +189,11 @@ F2UCreateTextOpCode (
 {\r
   EFI_IFR_TEXT      UTextOpCode;\r
 \r
-  if ((FwOpcode->Flags & FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE) == 0) {\r
+  if ((FwOpcode->Flags & 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
+    UTextOpCode.Header.Length = (UINT8) sizeof (EFI_IFR_TEXT);\r
 \r
     UTextOpCode.Statement.Help   = FwOpcode->Help;\r
 \r
@@ -207,8 +212,8 @@ F2UCreateTextOpCode (
 /**\r
   Create UEFI HII Reference Opcode from a Framework HII Reference Opcode.\r
 \r
-  @param FwOpcode              The input Framework Opcode.\r
   @param UefiUpdateDataHandle  The newly created UEFI HII opcode is appended to UefiUpdateDataHandle.\r
+  @param FwOpcode              The input Framework Opcode.\r
 \r
   @retval NULL   There is not enough space left in Buffer to add the opcode.\r
   @retval Other  A pointer to the created opcode.\r
@@ -224,7 +229,7 @@ F2UCreateReferenceOpCode (
 \r
   ZeroMem (&UOpcode, sizeof(UOpcode));\r
 \r
-  UOpcode.Header.Length = sizeof(UOpcode);\r
+  UOpcode.Header.Length = (UINT8) sizeof (UOpcode);\r
   UOpcode.Header.OpCode = EFI_IFR_REF_OP;\r
 \r
   UOpcode.Question.Header.Prompt = FwOpcode->Prompt;\r
@@ -234,10 +239,10 @@ F2UCreateReferenceOpCode (
   UOpcode.FormId = FwOpcode->FormId;\r
 \r
   //\r
-  // We only map FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE and FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED to \r
+  // We only map EFI_IFR_FLAG_INTERACTIVE and EFI_IFR_FLAG_RESET_REQUIRED to \r
   // UEFI IFR Opcode flags. The rest flags are obsolete.\r
   //\r
-  UOpcode.Question.Flags  = (UINT8) (FwOpcode->Flags & (FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE | FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED));\r
+  UOpcode.Question.Flags  = (UINT8) (FwOpcode->Flags & (EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_RESET_REQUIRED));\r
   \r
   return HiiCreateRawOpCodes (UefiUpdateDataHandle, (UINT8 *) &UOpcode, sizeof(UOpcode));\r
 }\r
@@ -245,9 +250,9 @@ F2UCreateReferenceOpCode (
 /**\r
   Create UEFI HII "One Of Option" Opcode from a Framework HII "One Of Option" Opcode.\r
 \r
+  @param UefiUpdateDataHandle  The newly created UEFI HII opcode is appended to UefiUpdateDataHandle.\r
   @param FwOpcode              The input Framework Opcode.\r
   @param Width                 The size of the One Of Option. 1 bytes or 2 bytes.\r
-  @param UefiUpdateDataHandle  The newly created UEFI HII opcode is appended to UefiUpdateDataHandle.\r
 \r
   @retval NULL   There is not enough space left in Buffer to add the opcode.\r
   @retval Other  A pointer to the created opcode.\r
@@ -264,19 +269,19 @@ F2UCreateOneOfOptionOpCode (
 \r
   ZeroMem (&UOpcode, sizeof(UOpcode));\r
 \r
-  UOpcode.Header.Length = sizeof(UOpcode);\r
+  UOpcode.Header.Length = (UINT8) 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
-  // #define FRAMEWORK_EFI_IFR_FLAG_DEFAULT           0x01\r
-  // #define FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING     0x02\r
+  // #define EFI_IFR_FLAG_DEFAULT           0x01\r
+  // #define 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) (UOpcode.Flags  | (FwOpcode->Flags & (FRAMEWORK_EFI_IFR_FLAG_DEFAULT | FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING)) << 4);\r
+  UOpcode.Flags = (UINT8) (UOpcode.Flags  | (FwOpcode->Flags & (EFI_IFR_FLAG_DEFAULT | EFI_IFR_FLAG_MANUFACTURING)) << 4);\r
 \r
   switch (Width) {\r
     case 1:\r
@@ -300,10 +305,10 @@ F2UCreateOneOfOptionOpCode (
   to a UEFI Question ID. This information is used to invoke the Framework HII Browser Callback\r
   function. The opcode is appened to UefiUpdateDataHandle.\r
 \r
+  @param    UefiUpdateDataHandle  The UEFI Update Data buffer.\r
   @param    QuestionId            The UEFI Question ID.\r
   @param    OptionValue           The value of the "One Of Option".\r
   @param    KeyValue              The Framework "One Of Option" callback key.\r
-  @param    UefiUpdateDataHandle  The UEFI Update Data buffer.\r
 \r
   @retval NULL   There is not enough space left in Buffer to add the opcode.\r
   @retval Other  A pointer to the created opcode.\r
@@ -336,10 +341,10 @@ CreateGuidOptionKeyOpCode (
 /**\r
   Create UEFI HII "One Of" Opcode from a Framework HII "One Of" Opcode.\r
 \r
+  @param UefiUpdateDataHandle     The newly created UEFI HII opcode is appended to UefiUpdateDataHandle.\r
   @param ThunkContext             The HII Thunk Context.\r
   @param FwOpcode                 The input Framework Opcode.\r
-  @param UefiUpdateDataHandle     The newly created UEFI HII opcode is appended to UefiUpdateDataHandle.\r
-  @param NextFwOpcode             Returns the position of the next Framework Opcode after FRAMEWORK_EFI_IFR_END_ONE_OF_OP of\r
+  @param NextFwOpcode             Returns the position of the next Framework Opcode after EFI_IFR_END_ONE_OF_OP of\r
                                   the "One Of Option".\r
   @param OpcodeCount              The number of Opcode for the complete Framework "One Of" Opcode.\r
                       \r
@@ -369,7 +374,7 @@ F2UCreateOneOfOpCode (
   ZeroMem (&UOpcode, sizeof(UOpcode));\r
   *OpcodeCount = 0;\r
 \r
-  UOpcode.Header.Length = sizeof(UOpcode);\r
+  UOpcode.Header.Length = (UINT8) sizeof (UOpcode);\r
   UOpcode.Header.OpCode = EFI_IFR_ONE_OF_OP;\r
   UOpcode.Header.Scope  = 1;\r
 \r
@@ -382,11 +387,11 @@ F2UCreateOneOfOpCode (
   // 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
+  while (FwOpHeader->OpCode != 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
+    if ((FwOneOfOp->Flags & EFI_IFR_FLAG_INTERACTIVE) != 0) {\r
       UOpcode.Question.Flags |= EFI_IFR_FLAG_CALLBACK;\r
       \r
       if (UOpcode.Question.QuestionId == 0) {\r
@@ -398,7 +403,7 @@ F2UCreateOneOfOpCode (
 \r
     }\r
 \r
-    if (FwOneOfOp->Flags & FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED) {\r
+    if ((FwOneOfOp->Flags & EFI_IFR_FLAG_RESET_REQUIRED) == EFI_IFR_FLAG_RESET_REQUIRED) {\r
       UOpcode.Question.Flags |= EFI_IFR_FLAG_RESET_REQUIRED;\r
     }\r
 \r
@@ -426,7 +431,7 @@ F2UCreateOneOfOpCode (
   // 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
+  while (FwOpHeader->OpCode != EFI_IFR_END_ONE_OF_OP) {\r
 \r
     FwOneOfOp = (FRAMEWORK_EFI_IFR_ONE_OF_OPTION *) FwOpHeader;\r
       \r
@@ -456,10 +461,10 @@ F2UCreateOneOfOpCode (
 /**\r
   Create UEFI HII "Ordered List" Opcode from a Framework HII "Ordered List" Opcode.\r
 \r
+  @param UefiUpdateDataHandle The newly created UEFI HII opcode is appended to UefiUpdateDataHandle.\r
   @param ThunkContext         The HII Thunk Context.\r
   @param FwOpcode             The input Framework Opcode.\r
-  @param UefiUpdateDataHandle The newly created UEFI HII opcode is appended to UefiUpdateDataHandle.\r
-  @param NextFwOpcode         Returns the position of the next Framework Opcode after FRAMEWORK_EFI_IFR_END_ONE_OF_OP of\r
+  @param NextFwOpcode         Returns the position of the next Framework Opcode after EFI_IFR_END_ONE_OF_OP of\r
                               the "Ordered List".\r
   @param OpcodeCount          The number of Opcode for the complete Framework "Ordered List" Opcode.\r
                       \r
@@ -486,7 +491,7 @@ F2UCreateOrderedListOpCode (
   ZeroMem (&UOpcode, sizeof(UOpcode));\r
   *OpcodeCount = 0;\r
 \r
-  UOpcode.Header.Length = sizeof(UOpcode);\r
+  UOpcode.Header.Length = (UINT8) sizeof (UOpcode);\r
   UOpcode.Header.OpCode = EFI_IFR_ORDERED_LIST_OP;\r
   UOpcode.Header.Scope  = 1;\r
 \r
@@ -501,11 +506,11 @@ F2UCreateOrderedListOpCode (
   // 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
+  while (FwOpHeader->OpCode != 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
+    if ((FwOneOfOp->Flags & EFI_IFR_FLAG_INTERACTIVE) != 0) {\r
       UOpcode.Question.Flags |= EFI_IFR_FLAG_CALLBACK;\r
       \r
       if (UOpcode.Question.QuestionId == 0) {\r
@@ -517,7 +522,7 @@ F2UCreateOrderedListOpCode (
       }\r
     }\r
 \r
-    if (FwOneOfOp->Flags & FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED) {\r
+    if ((FwOneOfOp->Flags & EFI_IFR_FLAG_RESET_REQUIRED) ==  EFI_IFR_FLAG_RESET_REQUIRED) {\r
       UOpcode.Question.Flags |= EFI_IFR_FLAG_RESET_REQUIRED;\r
     }\r
 \r
@@ -538,7 +543,7 @@ F2UCreateOrderedListOpCode (
   *OpcodeCount += 1;\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
+  while (FwOpHeader->OpCode != EFI_IFR_END_ONE_OF_OP) {\r
     //\r
     // Each entry of Order List in Framework HII is always 1 byte in size\r
     //\r
@@ -562,9 +567,9 @@ F2UCreateOrderedListOpCode (
 /**\r
   Create UEFI HII CheckBox Opcode from a Framework HII Checkbox Opcode.\r
 \r
+  @param UefiUpdateDataHandle  The newly created UEFI HII opcode is appended to UefiUpdateDataHandle.\r
   @param ThunkContext          The HII Thunk Context.\r
   @param FwOpcode              The input Framework Opcode.\r
-  @param UefiUpdateDataHandle  The newly created UEFI HII opcode is appended to UefiUpdateDataHandle.\r
 \r
   @retval NULL   There is not enough space left in Buffer to add the opcode.\r
   @retval Other  A pointer to the created opcode.\r
@@ -582,7 +587,7 @@ F2UCreateCheckBoxOpCode (
 \r
   ZeroMem (&UOpcode, sizeof(UOpcode));\r
 \r
-  UOpcode.Header.Length = sizeof(UOpcode);\r
+  UOpcode.Header.Length = (UINT8) sizeof (UOpcode);\r
   UOpcode.Header.OpCode = EFI_IFR_CHECKBOX_OP;\r
 \r
   UOpcode.Question.Header.Prompt = FwOpcode->Prompt;\r
@@ -602,11 +607,11 @@ F2UCreateCheckBoxOpCode (
 \r
   //\r
   // We map 2 flags:\r
-  //      FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE, \r
-  //      FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED,\r
+  //      EFI_IFR_FLAG_INTERACTIVE, \r
+  //      EFI_IFR_FLAG_RESET_REQUIRED,\r
   // to UEFI IFR Opcode Question flags. The rest flags are obsolete.\r
   //\r
-  UOpcode.Question.Flags  = (UINT8) (FwOpcode->Flags & (FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE | FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED));\r
+  UOpcode.Question.Flags  = (UINT8) (FwOpcode->Flags & (EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_RESET_REQUIRED));\r
 \r
 \r
   UOpcode.Question.VarStoreId    = ThunkContext->FormSet->DefaultVarStoreId;\r
@@ -614,11 +619,11 @@ F2UCreateCheckBoxOpCode (
 \r
   //\r
   // We also map these 2 flags:\r
-  //      FRAMEWORK_EFI_IFR_FLAG_DEFAULT, \r
-  //      FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING,\r
+  //      EFI_IFR_FLAG_DEFAULT, \r
+  //      EFI_IFR_FLAG_MANUFACTURING,\r
   // to UEFI IFR CheckBox Opcode default flags.\r
   //\r
-  UOpcode.Flags           = (UINT8) (FwOpcode->Flags & (FRAMEWORK_EFI_IFR_FLAG_DEFAULT | FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING));\r
+  UOpcode.Flags           = (UINT8) (FwOpcode->Flags & (EFI_IFR_FLAG_DEFAULT | EFI_IFR_FLAG_MANUFACTURING));\r
 \r
   return HiiCreateRawOpCodes (UefiUpdateDataHandle, (UINT8 *) &UOpcode, sizeof(UOpcode));\r
 }\r
@@ -627,9 +632,9 @@ F2UCreateCheckBoxOpCode (
 /**\r
   Create UEFI HII Numeric Opcode from a Framework HII Numeric Opcode.\r
 \r
+  @param UefiUpdateDataHandle    The newly created UEFI HII opcode is appended to UefiUpdateDataHandle.\r
   @param ThunkContext            The HII Thunk Context.\r
   @param FwOpcode                The input Framework Opcode.\r
-  @param UefiUpdateDataHandle    The newly created UEFI HII opcode is appended to UefiUpdateDataHandle.\r
 \r
   @retval NULL   There is not enough space left in Buffer to add the opcode.\r
   @retval Other  A pointer to the created opcode.\r
@@ -662,7 +667,7 @@ F2UCreateNumericOpCode (
     UOpcode.Question.QuestionId    = FwOpcode->Key;\r
   }\r
 \r
-  UOpcode.Header.Length = sizeof(UOpcode);\r
+  UOpcode.Header.Length = (UINT8) 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
@@ -676,7 +681,7 @@ F2UCreateNumericOpCode (
   UOpcode.Question.VarStoreId    = ThunkContext->FormSet->DefaultVarStoreId;\r
   UOpcode.Question.VarStoreInfo.VarOffset = FwOpcode->QuestionId;\r
 \r
-  UOpcode.Question.Flags  = (UINT8) (FwOpcode->Flags & (FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE | FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED));\r
+  UOpcode.Question.Flags  = (UINT8) (FwOpcode->Flags & (EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_RESET_REQUIRED));\r
 \r
   //\r
   // Framework Numeric values are all in UINT16 and displayed as decimal.\r
@@ -712,7 +717,7 @@ F2UCreateNumericOpCode (
   // We need to create a default value.\r
   //\r
   ZeroMem (&UOpcodeDefault, sizeof (UOpcodeDefault));\r
-  UOpcodeDefault.Header.Length = sizeof (UOpcodeDefault);\r
+  UOpcodeDefault.Header.Length = (UINT8) sizeof (UOpcodeDefault);\r
   UOpcodeDefault.Header.OpCode = EFI_IFR_DEFAULT_OP;\r
 \r
   UOpcodeDefault.DefaultId = 0;\r
@@ -749,9 +754,9 @@ F2UCreateNumericOpCode (
 /**\r
   Create UEFI HII String Opcode from a Framework HII String Opcode.\r
 \r
+  @param UefiUpdateDataHandle     The newly created UEFI HII opcode is appended to UefiUpdateDataHandle.\r
   @param ThunkContext             The HII Thunk Context.\r
   @param FwOpcode                 The input Framework Opcode.\r
-  @param UefiUpdateDataHandle     The newly created UEFI HII opcode is appended to UefiUpdateDataHandle.\r
 \r
   @retval NULL   There is not enough space left in Buffer to add the opcode.\r
   @retval Other  A pointer to the created opcode.\r
@@ -781,13 +786,13 @@ F2UCreateStringOpCode (
     UOpcode.Question.QuestionId    = FwOpcode->Key;\r
   }\r
 \r
-  UOpcode.Header.Length = sizeof(UOpcode);\r
+  UOpcode.Header.Length = (UINT8) 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.Flags  = (UINT8) (FwOpcode->Flags & (FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE | FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED));\r
+  UOpcode.Question.Flags  = (UINT8) (FwOpcode->Flags & (EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_RESET_REQUIRED));\r
 \r
   UOpcode.Question.VarStoreId    = ThunkContext->FormSet->DefaultVarStoreId;\r
   UOpcode.Question.VarStoreInfo.VarOffset = FwOpcode->QuestionId;\r
@@ -802,8 +807,8 @@ F2UCreateStringOpCode (
 /**\r
   Create UEFI HII Banner Opcode from a Framework HII Banner Opcode.\r
 \r
-  @param FwOpcode                 The input Framework Opcode.\r
   @param UefiUpdateDataHandle     The newly created UEFI HII opcode is appended to UefiUpdateDataHandle.\r
+  @param FwOpcode                 The input Framework Opcode.\r
 \r
   @retval NULL   There is not enough space left in Buffer to add the opcode.\r
   @retval Other  A pointer to the created opcode.\r
@@ -811,8 +816,8 @@ F2UCreateStringOpCode (
 **/\r
 UINT8 *\r
 F2UCreateBannerOpCode (\r
-  IN OUT   VOID                        *UefiUpdateDataHandle,\r
-  IN CONST FRAMEWORK_EFI_IFR_BANNER    *FwOpcode\r
+  IN OUT   VOID              *UefiUpdateDataHandle,\r
+  IN CONST EFI_IFR_BANNER    *FwOpcode\r
   )\r
 {\r
   EFI_IFR_GUID_BANNER *UOpcode;\r
@@ -837,7 +842,7 @@ F2UCreateBannerOpCode (
 \r
   @param ThunkContext         The HII Thunk Context.\r
   @param FwUpdateData         The Framework Update Data.\r
-  @param UefiUpdateData       The UEFI Update Data.\r
+  @param UefiOpCodeHandle     The UEFI opcode handle.\r
 \r
   @retval EFI_SUCCESS       The UEFI Update Data is created successfully.\r
   @retval EFI_UNSUPPORTED   There is unsupported opcode in FwUpdateData.\r
@@ -855,9 +860,19 @@ FwUpdateDataToUefiUpdateData (
   UINTN                                Index;\r
   UINTN                                DataCount;\r
   UINT8                                *OpCodeBuffer;\r
+  LIST_ENTRY                           *StorageList;\r
+  FORMSET_STORAGE                      *Storage;\r
+  FORM_BROWSER_FORMSET                 *FormSet;\r
+  CHAR16                               *DefaultVarStoreName;\r
+  UINT16                               DefaultVarStoreId;\r
+  EFI_IFR_VARSTORE_SELECT              *SelectVarOp;\r
 \r
   FwOpCode = (FRAMEWORK_EFI_IFR_OP_HEADER *) &FwUpdateData->Data;\r
 \r
+  FormSet = ThunkContext->FormSet;\r
+  DefaultVarStoreId   = FormSet->DefaultVarStoreId;\r
+  DefaultVarStoreName = FormSet->OriginalDefaultVarStoreName;\r
+\r
   for (Index = 0; Index < FwUpdateData->DataCount; Index += DataCount) {\r
     switch (FwOpCode->OpCode) {\r
       case FRAMEWORK_EFI_IFR_SUBTITLE_OP:\r
@@ -907,12 +922,12 @@ FwUpdateDataToUefiUpdateData (
         DataCount = 1;\r
         break;\r
 \r
-      case FRAMEWORK_EFI_IFR_BANNER_OP:\r
-        OpCodeBuffer = F2UCreateBannerOpCode (UefiOpCodeHandle, (FRAMEWORK_EFI_IFR_BANNER *) FwOpCode);  \r
+      case EFI_IFR_BANNER_OP:\r
+        OpCodeBuffer = F2UCreateBannerOpCode (UefiOpCodeHandle, (EFI_IFR_BANNER *) FwOpCode);  \r
         DataCount = 1;\r
         break;\r
 \r
-      case FRAMEWORK_EFI_IFR_END_ONE_OF_OP:\r
+      case EFI_IFR_END_ONE_OF_OP:\r
         OpCodeBuffer = HiiCreateEndOpCode (UefiOpCodeHandle);\r
         DataCount = 1;\r
         break;\r
@@ -921,6 +936,31 @@ FwUpdateDataToUefiUpdateData (
         OpCodeBuffer = F2UCreateNumericOpCode (UefiOpCodeHandle, ThunkContext, (FRAMEWORK_EFI_IFR_NUMERIC *) FwOpCode);\r
         DataCount = 1;\r
         break;\r
+      \r
+      case EFI_IFR_VARSTORE_SELECT_OP:\r
+        OpCodeBuffer = (UINT8 *) FwOpCode;\r
+        SelectVarOp  = (EFI_IFR_VARSTORE_SELECT *) FwOpCode;\r
+        //\r
+        // Check whether the selected VarId is in StorageList.\r
+        //\r
+        StorageList = GetFirstNode (&FormSet->StorageListHead);\r
+        while (!IsNull (&FormSet->StorageListHead, StorageList)) {\r
+          Storage = FORMSET_STORAGE_FROM_LINK (StorageList);\r
+          if (Storage->VarStoreId == SelectVarOp->VarId) {\r
+            break;\r
+          }\r
+          StorageList = GetNextNode (&FormSet->StorageListHead, StorageList);\r
+        }\r
+        ASSERT (!IsNull (&FormSet->StorageListHead, StorageList));\r
+        //\r
+        // Change VarStoreId to the selected VarId.\r
+        //\r
+        FormSet->DefaultVarStoreId = SelectVarOp->VarId;\r
+        if (SelectVarOp->VarId == DefaultVarStoreId)  {\r
+          FormSet->OriginalDefaultVarStoreName = DefaultVarStoreName;\r
+        }\r
+        DataCount = 1;\r
+        break;\r
 \r
       default:\r
         ASSERT (FALSE);\r
@@ -934,6 +974,11 @@ FwUpdateDataToUefiUpdateData (
     FwOpCode = (FRAMEWORK_EFI_IFR_OP_HEADER *)((UINT8 *) FwOpCode + FwOpCode->Length);\r
   }\r
 \r
+  //\r
+  // Revert FromSet default varstore ID.\r
+  //\r
+  FormSet->DefaultVarStoreId           = DefaultVarStoreId;\r
+  FormSet->OriginalDefaultVarStoreName = DefaultVarStoreName;\r
   return EFI_SUCCESS;\r
 }\r
 \r