]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/UefiIfrParser.c
1) Add in support for Framework VFR file which specify all VAR Store correctly. This...
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / FrameworkHiiToUefiHiiThunk / UefiIfrParser.c
index 8b130af45fdbdceb942615764b18e8493738e0a7..aacba8d416962310335b43db6372d3bceccea92e 100644 (file)
@@ -12,22 +12,90 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 **/\r
 \r
+#include <PiDxe.h>\r
+\r
+#include <Protocol/Print.h>\r
+#include <Protocol/HiiConfigAccess.h>\r
+#include <Protocol/HiiConfigRouting.h>\r
+#include <Protocol/HiiDatabase.h>\r
+#include <Protocol/HiiString.h>\r
+\r
+#include <Library/BaseLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/HiiLib.h>\r
+#include <Library/IfrSupportLib.h>\r
+#include <Library/MemoryAllocationLib.h>\r
+#include <Library/PrintLib.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+\r
+#include <MdeModuleHii.h>\r
+\r
 #include "UefiIfrParser.h"\r
-#include "UefiIfrParserExpression.h"\r
-#include "UefiIfrParserInternal.h"\r
-#include "UefiIfrParserCommon.h"\r
 \r
+#include "UefiIfrParserExpression.h"\r
 \r
 UINT16           mStatementIndex;\r
-UINT16           mExpressionOpCodeIndex;\r
 \r
 BOOLEAN          mInScopeSubtitle;\r
 BOOLEAN          mInScopeSuppress;\r
 BOOLEAN          mInScopeGrayOut;\r
-FORM_EXPRESSION  *mSuppressExpression;\r
-FORM_EXPRESSION  *mGrayOutExpression;\r
 \r
-EFI_GUID  gZeroGuid = {0, 0, 0, {0, 0, 0, 0, 0, 0, 0, 0}};\r
+EFI_GUID  mFrameworkHiiCompatibilityGuid = EFI_IFR_FRAMEWORK_GUID;\r
+extern EFI_GUID mTianoHiiIfrGuid;\r
+\r
+LIST_ENTRY *\r
+GetOneOfOptionMapEntryListHead (\r
+  IN CONST FORM_BROWSER_FORMSET  *FormSet,\r
+  IN       UINT16                 QuestionId\r
+  )\r
+{\r
+  LIST_ENTRY            *Link;\r
+  ONE_OF_OPTION_MAP     *Map;\r
+\r
+  Link = GetFirstNode (&FormSet->OneOfOptionMapListHead);\r
+\r
+  while (!IsNull (&FormSet->OneOfOptionMapListHead, Link)) {\r
+    Map = ONE_OF_OPTION_MAP_FROM_LINK (Link);\r
+    if (QuestionId == Map->QuestionId) {\r
+      return &Map->OneOfOptionMapEntryListHead;\r
+    }\r
+    Link = GetNextNode (&FormSet->OneOfOptionMapListHead, Link);\r
+  }\r
+  \r
+  return NULL;\r
+}\r
+\r
+VOID\r
+DestoryOneOfOptionMap (\r
+  IN LIST_ENTRY     *OneOfOptionMapListHead\r
+  )\r
+{\r
+  ONE_OF_OPTION_MAP         *Map;\r
+  ONE_OF_OPTION_MAP_ENTRY   *MapEntry;\r
+  LIST_ENTRY                *Link;\r
+  LIST_ENTRY                *Link2;\r
+\r
+  while (!IsListEmpty (OneOfOptionMapListHead)) {\r
+    Link = GetFirstNode (OneOfOptionMapListHead);\r
+    \r
+    Map = ONE_OF_OPTION_MAP_FROM_LINK (Link);\r
+\r
+    while (!IsListEmpty (&Map->OneOfOptionMapEntryListHead)) {\r
+      Link2 = GetFirstNode (&Map->OneOfOptionMapEntryListHead);\r
+      \r
+      MapEntry = ONE_OF_OPTION_MAP_ENTRY_FROM_LINK (Link2);\r
+\r
+      RemoveEntryList (Link2);\r
+\r
+      FreePool (MapEntry);\r
+    }\r
+\r
+    RemoveEntryList (Link);\r
+    FreePool (Map);\r
+  }\r
+}\r
+\r
 \r
 /**\r
   Initialize Statement header members.\r
@@ -61,8 +129,6 @@ CreateStatement (
 \r
   InitializeListHead (&Statement->DefaultListHead);\r
   InitializeListHead (&Statement->OptionListHead);\r
-  InitializeListHead (&Statement->InconsistentListHead);\r
-  InitializeListHead (&Statement->NoSubmitListHead);\r
 \r
   Statement->Signature = FORM_BROWSER_STATEMENT_SIGNATURE;\r
 \r
@@ -72,14 +138,6 @@ CreateStatement (
   CopyMem (&Statement->Prompt, &StatementHdr->Prompt, sizeof (EFI_STRING_ID));\r
   CopyMem (&Statement->Help, &StatementHdr->Help, sizeof (EFI_STRING_ID));\r
 \r
-  if (mInScopeSuppress) {\r
-    Statement->SuppressExpression = mSuppressExpression;\r
-  }\r
-\r
-  if (mInScopeGrayOut) {\r
-    Statement->GrayOutExpression = mGrayOutExpression;\r
-  }\r
-\r
   Statement->InSubtitle = mInScopeSubtitle;\r
 \r
   //\r
@@ -90,7 +148,6 @@ CreateStatement (
   return Statement;\r
 }\r
 \r
-\r
 /**\r
   Initialize Question's members.\r
 \r
@@ -112,7 +169,6 @@ CreateQuestion (
   EFI_IFR_QUESTION_HEADER  *QuestionHdr;\r
   LIST_ENTRY               *Link;\r
   FORMSET_STORAGE          *Storage;\r
-  NAME_VALUE_NODE          *NameValueNode;\r
 \r
   Statement = CreateStatement (OpCodeData, FormSet, Form);\r
   if (Statement == NULL) {\r
@@ -124,6 +180,10 @@ CreateQuestion (
   CopyMem (&Statement->VarStoreId, &QuestionHdr->VarStoreId, sizeof (EFI_VARSTORE_ID));\r
   CopyMem (&Statement->VarStoreInfo.VarOffset, &QuestionHdr->VarStoreInfo.VarOffset, sizeof (UINT16));\r
 \r
+  if (FormSet->MaxQuestionId < QuestionHdr->QuestionId) {\r
+    FormSet->MaxQuestionId = QuestionHdr->QuestionId;\r
+  }\r
+\r
   Statement->QuestionFlags = QuestionHdr->Flags;\r
 \r
   if (Statement->VarStoreId == 0) {\r
@@ -149,59 +209,9 @@ CreateQuestion (
   }\r
   ASSERT (Statement->Storage != NULL);\r
 \r
-  //\r
-  // Initialilze varname for Name/Value or EFI Variable\r
-  //\r
-  if ((Statement->Storage->Type == EFI_HII_VARSTORE_NAME_VALUE) ||\r
-      (Statement->Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE)) {\r
-    Statement->VariableName = GetToken (Statement->VarStoreInfo.VarName, FormSet->HiiHandle);\r
-    ASSERT (Statement->VariableName != NULL);\r
-\r
-    if (Statement->Storage->Type == EFI_HII_VARSTORE_NAME_VALUE) {\r
-      //\r
-      // Insert to Name/Value varstore list\r
-      //\r
-      NameValueNode = AllocateZeroPool (sizeof (NAME_VALUE_NODE));\r
-      ASSERT (NameValueNode != NULL);\r
-      NameValueNode->Signature = NAME_VALUE_NODE_SIGNATURE;\r
-      NameValueNode->Name = AllocateCopyPool (StrSize (Statement->VariableName), Statement->VariableName);\r
-      ASSERT (NameValueNode->Name != NULL);\r
-      NameValueNode->Value = AllocateZeroPool (0x10);\r
-      ASSERT (NameValueNode->Value != NULL);\r
-      NameValueNode->EditValue = AllocateZeroPool (0x10);\r
-      ASSERT (NameValueNode->EditValue != NULL);\r
-\r
-      InsertTailList (&Statement->Storage->NameValueListHead, &NameValueNode->Link);\r
-    }\r
-  }\r
-\r
   return Statement;\r
 }\r
 \r
-\r
-/**\r
-  Allocate a FORM_EXPRESSION node.\r
-\r
-  @param  Form                   The Form associated with this Expression\r
-\r
-  @return Pointer to a FORM_EXPRESSION data structure.\r
-\r
-**/\r
-FORM_EXPRESSION *\r
-CreateExpression (\r
-  IN OUT FORM_BROWSER_FORM        *Form\r
-  )\r
-{\r
-  FORM_EXPRESSION  *Expression;\r
-\r
-  Expression = AllocateZeroPool (sizeof (FORM_EXPRESSION));\r
-  Expression->Signature = FORM_EXPRESSION_SIGNATURE;\r
-  InitializeListHead (&Expression->OpCodeListHead);\r
-\r
-  return Expression;\r
-}\r
-\r
-\r
 /**\r
   Allocate a FORMSET_STORAGE data structure and insert to FormSet Storage List.\r
 \r
@@ -219,185 +229,11 @@ CreateStorage (
 \r
   Storage = AllocateZeroPool (sizeof (FORMSET_STORAGE));\r
   Storage->Signature = FORMSET_STORAGE_SIGNATURE;\r
-  InitializeListHead (&Storage->NameValueListHead);\r
   InsertTailList (&FormSet->StorageListHead, &Storage->Link);\r
 \r
   return Storage;\r
 }\r
 \r
-\r
-/**\r
-  Create ConfigHdr string for a storage.\r
-\r
-  @param  FormSet                Pointer of the current FormSet\r
-  @param  Storage                Pointer of the storage\r
-\r
-  @retval EFI_SUCCESS            Initialize ConfigHdr success\r
-\r
-**/\r
-EFI_STATUS\r
-InitializeConfigHdr (\r
-  IN FORM_BROWSER_FORMSET  *FormSet,\r
-  IN OUT FORMSET_STORAGE   *Storage\r
-  )\r
-{\r
-  EFI_STATUS  Status;\r
-  UINTN       StrBufferLen;\r
-  CHAR16      *Name;\r
-\r
-  if (Storage->Type == EFI_HII_VARSTORE_BUFFER) {\r
-    Name = Storage->Name;\r
-  } else {\r
-    Name = NULL;\r
-  }\r
-\r
-  StrBufferLen = 0;\r
-  Status = ConstructConfigHdr (\r
-             Storage->ConfigHdr,\r
-             &StrBufferLen,\r
-             &Storage->Guid,\r
-             Name,\r
-             FormSet->DriverHandle\r
-             );\r
-  if (Status == EFI_BUFFER_TOO_SMALL) {\r
-    Storage->ConfigHdr = AllocateZeroPool (StrBufferLen);\r
-    Status = ConstructConfigHdr (\r
-               Storage->ConfigHdr,\r
-               &StrBufferLen,\r
-               &Storage->Guid,\r
-               Name,\r
-               FormSet->DriverHandle\r
-               );\r
-  }\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-\r
-  Storage->ConfigRequest = AllocateCopyPool (StrBufferLen, Storage->ConfigHdr);\r
-  Storage->SpareStrLen = 0;\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-\r
-/**\r
-  Initialize Request Element of a Question. <RequestElement> ::= '&'<BlockName> | '&'<Label>\r
-\r
-  @param  FormSet                Pointer of the current FormSet.\r
-  @param  Question               The Question to be initialized.\r
-\r
-  @retval EFI_SUCCESS            Function success.\r
-  @retval EFI_INVALID_PARAMETER  No storage associated with the Question.\r
-\r
-**/\r
-EFI_STATUS\r
-InitializeRequestElement (\r
-  IN OUT FORM_BROWSER_FORMSET     *FormSet,\r
-  IN OUT FORM_BROWSER_STATEMENT   *Question\r
-  )\r
-{\r
-  FORMSET_STORAGE  *Storage;\r
-  UINTN            StrLen;\r
-  UINTN            StringSize;\r
-  CHAR16           *NewStr;\r
-  CHAR16           RequestElement[30];\r
-\r
-  Storage = Question->Storage;\r
-  if (Storage == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE) {\r
-    //\r
-    // <ConfigRequest> is unnecessary for EFI variable storage,\r
-    // GetVariable()/SetVariable() will be used to retrieve/save values\r
-    //\r
-    return EFI_SUCCESS;\r
-  }\r
-\r
-  //\r
-  // Prepare <RequestElement>\r
-  //\r
-  if (Storage->Type == EFI_HII_VARSTORE_BUFFER) {\r
-    StrLen = UnicodeSPrint (\r
-               RequestElement,\r
-               30 * sizeof (CHAR16),\r
-               L"&OFFSET=%x&WIDTH=%x",\r
-               Question->VarStoreInfo.VarOffset,\r
-               Question->StorageWidth\r
-               );\r
-    Question->BlockName = AllocateCopyPool ((StrLen + 1) * sizeof (CHAR16), RequestElement);\r
-  } else {\r
-    StrLen = UnicodeSPrint (RequestElement, 30 * sizeof (CHAR16), L"&%s", Question->VariableName);\r
-  }\r
-\r
-  if ((Question->Operand == EFI_IFR_PASSWORD_OP) && (Question->QuestionFlags & EFI_IFR_FLAG_CALLBACK)) {\r
-    //\r
-    // Password with CALLBACK flag is stored in encoded format,\r
-    // so don't need to append it to <ConfigRequest>\r
-    //\r
-    return EFI_SUCCESS;\r
-  }\r
-\r
-  //\r
-  // Append <RequestElement> to <ConfigRequest>\r
-  //\r
-  if (StrLen > Storage->SpareStrLen) {\r
-    //\r
-    // Old String buffer is not sufficient for RequestElement, allocate a new one\r
-    //\r
-    StringSize = (Storage->ConfigRequest != NULL) ? StrSize (Storage->ConfigRequest) : sizeof (CHAR16);\r
-    NewStr = AllocateZeroPool (StringSize + CONFIG_REQUEST_STRING_INCREMENTAL * sizeof (CHAR16));\r
-    if (Storage->ConfigRequest != NULL) {\r
-      CopyMem (NewStr, Storage->ConfigRequest, StringSize);\r
-      gBS->FreePool (Storage->ConfigRequest);\r
-    }\r
-    Storage->ConfigRequest = NewStr;\r
-    Storage->SpareStrLen   = CONFIG_REQUEST_STRING_INCREMENTAL;\r
-  }\r
-\r
-  StrCat (Storage->ConfigRequest, RequestElement);\r
-  Storage->ElementCount++;\r
-  Storage->SpareStrLen -= StrLen;\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-\r
-/**\r
-  Free resources of a Expression\r
-\r
-  @param  FormSet                Pointer of the Expression\r
-\r
-  @return None.\r
-\r
-**/\r
-VOID\r
-DestroyExpression (\r
-  IN FORM_EXPRESSION   *Expression\r
-  )\r
-{\r
-  LIST_ENTRY         *Link;\r
-  EXPRESSION_OPCODE  *OpCode;\r
-\r
-  while (!IsListEmpty (&Expression->OpCodeListHead)) {\r
-    Link = GetFirstNode (&Expression->OpCodeListHead);\r
-    OpCode = EXPRESSION_OPCODE_FROM_LINK (Link);\r
-    RemoveEntryList (&OpCode->Link);\r
-\r
-    if (OpCode->ValueList != NULL) {\r
-      FreePool (OpCode->ValueList);\r
-    }\r
-  }\r
-\r
-  //\r
-  // Free this Expression\r
-  //\r
-  gBS->FreePool (Expression);\r
-}\r
-\r
-\r
 /**\r
   Free resources of a storage\r
 \r
@@ -411,31 +247,14 @@ DestroyStorage (
   IN FORMSET_STORAGE   *Storage\r
   )\r
 {\r
-  LIST_ENTRY         *Link;\r
-  NAME_VALUE_NODE    *NameValueNode;\r
-\r
   if (Storage == NULL) {\r
     return;\r
   }\r
 \r
-  FreePool (Storage->Name);\r
-  FreePool (Storage->Buffer);\r
-  FreePool (Storage->EditBuffer);\r
-\r
-  while (!IsListEmpty (&Storage->NameValueListHead)) {\r
-    Link = GetFirstNode (&Storage->NameValueListHead);\r
-    NameValueNode = NAME_VALUE_NODE_FROM_LINK (Link);\r
-    RemoveEntryList (&NameValueNode->Link);\r
-\r
-    FreePool (NameValueNode->Name);\r
-    FreePool (NameValueNode->Value);\r
-    FreePool (NameValueNode->EditValue);\r
-    FreePool (NameValueNode);\r
+  if (Storage->Name!= NULL) {\r
+    FreePool (Storage->Name);\r
   }\r
 \r
-  FreePool (Storage->ConfigHdr);\r
-  FreePool (Storage->ConfigRequest);\r
-\r
   FreePool (Storage);\r
 }\r
 \r
@@ -456,7 +275,6 @@ DestroyStatement (
   LIST_ENTRY        *Link;\r
   QUESTION_DEFAULT  *Default;\r
   QUESTION_OPTION   *Option;\r
-  FORM_EXPRESSION   *Expression;\r
 \r
   //\r
   // Free Default value List\r
@@ -480,34 +298,6 @@ DestroyStatement (
     gBS->FreePool (Option);\r
   }\r
 \r
-  //\r
-  // Free Inconsistent List\r
-  //\r
-  while (!IsListEmpty (&Statement->InconsistentListHead)) {\r
-    Link = GetFirstNode (&Statement->InconsistentListHead);\r
-    Expression = FORM_EXPRESSION_FROM_LINK (Link);\r
-    RemoveEntryList (&Expression->Link);\r
-\r
-    DestroyExpression (Expression);\r
-  }\r
-\r
-  //\r
-  // Free NoSubmit List\r
-  //\r
-  while (!IsListEmpty (&Statement->NoSubmitListHead)) {\r
-    Link = GetFirstNode (&Statement->NoSubmitListHead);\r
-    Expression = FORM_EXPRESSION_FROM_LINK (Link);\r
-    RemoveEntryList (&Expression->Link);\r
-\r
-    DestroyExpression (Expression);\r
-  }\r
-\r
-  if (Statement->VariableName != NULL) {\r
-    FreePool (Statement->VariableName);\r
-  }\r
-  if (Statement->BlockName != NULL) {\r
-    FreePool (Statement->BlockName);\r
-  }\r
 }\r
 \r
 \r
@@ -526,20 +316,8 @@ DestroyForm (
   )\r
 {\r
   LIST_ENTRY              *Link;\r
-  FORM_EXPRESSION         *Expression;\r
   FORM_BROWSER_STATEMENT  *Statement;\r
 \r
-  //\r
-  // Free Form Expressions\r
-  //\r
-  while (!IsListEmpty (&Form->ExpressionListHead)) {\r
-    Link = GetFirstNode (&Form->ExpressionListHead);\r
-    Expression = FORM_EXPRESSION_FROM_LINK (Link);\r
-    RemoveEntryList (&Expression->Link);\r
-\r
-    DestroyExpression (Expression);\r
-  }\r
-\r
   //\r
   // Free Statements/Questions\r
   //\r
@@ -623,10 +401,9 @@ DestroyFormSet (
   if (FormSet->StatementBuffer != NULL) {\r
     FreePool (FormSet->StatementBuffer);\r
   }\r
-  if (FormSet->ExpressionBuffer != NULL) {\r
-    FreePool (FormSet->ExpressionBuffer);\r
-  }\r
 \r
+  DestoryOneOfOptionMap (&FormSet->OneOfOptionMapListHead);\r
+  \r
   FreePool (FormSet);\r
 }\r
 \r
@@ -718,8 +495,6 @@ ParseOpCodes (
   UINT16                  Index;\r
   FORM_BROWSER_FORM       *CurrentForm;\r
   FORM_BROWSER_STATEMENT  *CurrentStatement;\r
-  EXPRESSION_OPCODE       *ExpressionOpCode;\r
-  FORM_EXPRESSION         *CurrentExpression;\r
   UINT8                   Operand;\r
   UINT8                   Scope;\r
   UINTN                   OpCodeOffset;\r
@@ -736,13 +511,18 @@ ParseOpCodes (
   EFI_IMAGE_ID            *ImageId;\r
   BOOLEAN                 SuppressForOption;\r
   BOOLEAN                 InScopeOptionSuppress;\r
-  FORM_EXPRESSION         *OptionSuppressExpression;\r
   BOOLEAN                 InScopeDisable;\r
   UINT16                  DepthOfDisable;\r
   BOOLEAN                 OpCodeDisabled;\r
   BOOLEAN                 SingleOpCodeExpression;\r
   BOOLEAN                 InScopeDefault;\r
   EFI_HII_VALUE           *Value;\r
+  LIST_ENTRY              *OneOfOptinMapEntryListHead;\r
+  EFI_IFR_GUID_OPTIONKEY  *OptionMap;\r
+  ONE_OF_OPTION_MAP       *OneOfOptionMap;\r
+  ONE_OF_OPTION_MAP_ENTRY *OneOfOptionMapEntry;\r
+  UINT8                   OneOfType;\r
+  EFI_IFR_ONE_OF          *OneOfOpcode;\r
 \r
   mInScopeSubtitle         = FALSE;\r
   SuppressForOption        = FALSE;\r
@@ -754,15 +534,19 @@ ParseOpCodes (
   OpCodeDisabled           = FALSE;\r
   SingleOpCodeExpression   = FALSE;\r
   InScopeDefault           = FALSE;\r
-  CurrentExpression        = NULL;\r
   CurrentDefault           = NULL;\r
   CurrentOption            = NULL;\r
-  OptionSuppressExpression = NULL;\r
+\r
+  //\r
+  // Set to a invalid value.\r
+  //\r
+  OneOfType = (UINT8) -1;\r
 \r
   //\r
   // Get the number of Statements and Expressions\r
   //\r
   CountOpCodes (FormSet, &NumberOfStatement, &NumberOfExpression);\r
+  FormSet->NumberOfStatement = NumberOfStatement;\r
 \r
   mStatementIndex = 0;\r
   FormSet->StatementBuffer = AllocateZeroPool (NumberOfStatement * sizeof (FORM_BROWSER_STATEMENT));\r
@@ -770,15 +554,10 @@ ParseOpCodes (
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
-  mExpressionOpCodeIndex = 0;\r
-  FormSet->ExpressionBuffer = AllocateZeroPool (NumberOfExpression * sizeof (EXPRESSION_OPCODE));\r
-  if (FormSet->ExpressionBuffer == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
   InitializeListHead (&FormSet->StorageListHead);\r
   InitializeListHead (&FormSet->DefaultStoreListHead);\r
   InitializeListHead (&FormSet->FormListHead);\r
+  InitializeListHead (&FormSet->OneOfOptionMapListHead);\r
 \r
   CurrentForm = NULL;\r
   CurrentStatement = NULL;\r
@@ -827,157 +606,6 @@ ParseOpCodes (
     }\r
 \r
     if (IsExpressionOpCode (Operand)) {\r
-      ExpressionOpCode = &FormSet->ExpressionBuffer[mExpressionOpCodeIndex];\r
-      mExpressionOpCodeIndex++;\r
-\r
-      ExpressionOpCode->Signature = EXPRESSION_OPCODE_SIGNATURE;\r
-      ExpressionOpCode->Operand = Operand;\r
-      Value = &ExpressionOpCode->Value;\r
-\r
-      switch (Operand) {\r
-      case EFI_IFR_EQ_ID_VAL_OP:\r
-        CopyMem (&ExpressionOpCode->QuestionId, &((EFI_IFR_EQ_ID_VAL *) OpCodeData)->QuestionId, sizeof (EFI_QUESTION_ID));\r
-\r
-        Value->Type = EFI_IFR_TYPE_NUM_SIZE_16;\r
-        CopyMem (&Value->Value.u16, &((EFI_IFR_EQ_ID_VAL *) OpCodeData)->Value, sizeof (UINT16));\r
-        break;\r
-\r
-      case EFI_IFR_EQ_ID_ID_OP:\r
-        CopyMem (&ExpressionOpCode->QuestionId, &((EFI_IFR_EQ_ID_ID *) OpCodeData)->QuestionId1, sizeof (EFI_QUESTION_ID));\r
-        CopyMem (&ExpressionOpCode->QuestionId2, &((EFI_IFR_EQ_ID_ID *) OpCodeData)->QuestionId2, sizeof (EFI_QUESTION_ID));\r
-        break;\r
-\r
-      case EFI_IFR_EQ_ID_LIST_OP:\r
-        CopyMem (&ExpressionOpCode->QuestionId, &((EFI_IFR_EQ_ID_LIST *) OpCodeData)->QuestionId, sizeof (EFI_QUESTION_ID));\r
-        CopyMem (&ExpressionOpCode->ListLength, &((EFI_IFR_EQ_ID_LIST *) OpCodeData)->ListLength, sizeof (UINT16));\r
-        ExpressionOpCode->ValueList = AllocateCopyPool (ExpressionOpCode->ListLength * sizeof (UINT16), &((EFI_IFR_EQ_ID_LIST *) OpCodeData)->ValueList);\r
-        break;\r
-\r
-      case EFI_IFR_TO_STRING_OP:\r
-      case EFI_IFR_FIND_OP:\r
-        ExpressionOpCode->Format = (( EFI_IFR_TO_STRING *) OpCodeData)->Format;\r
-        break;\r
-\r
-      case EFI_IFR_STRING_REF1_OP:\r
-        Value->Type = EFI_IFR_TYPE_STRING;\r
-        CopyMem (&Value->Value.string, &(( EFI_IFR_STRING_REF1 *) OpCodeData)->StringId, sizeof (EFI_STRING_ID));\r
-        break;\r
-\r
-      case EFI_IFR_RULE_REF_OP:\r
-        ExpressionOpCode->RuleId = (( EFI_IFR_RULE_REF *) OpCodeData)->RuleId;\r
-        break;\r
-\r
-      case EFI_IFR_SPAN_OP:\r
-        ExpressionOpCode->Flags = (( EFI_IFR_SPAN *) OpCodeData)->Flags;\r
-        break;\r
-\r
-      case EFI_IFR_THIS_OP:\r
-        ExpressionOpCode->QuestionId = CurrentStatement->QuestionId;\r
-        break;\r
-\r
-      case EFI_IFR_QUESTION_REF1_OP:\r
-        CopyMem (&ExpressionOpCode->QuestionId, &((EFI_IFR_EQ_ID_LIST *) OpCodeData)->QuestionId, sizeof (EFI_QUESTION_ID));\r
-        break;\r
-\r
-      case EFI_IFR_QUESTION_REF3_OP:\r
-        if (OpCodeLength >= sizeof (EFI_IFR_QUESTION_REF3_2)) {\r
-          CopyMem (&ExpressionOpCode->DevicePath, &(( EFI_IFR_QUESTION_REF3_2 *) OpCodeData)->DevicePath, sizeof (EFI_STRING_ID));\r
-\r
-          if (OpCodeLength >= sizeof (EFI_IFR_QUESTION_REF3_3)) {\r
-            CopyMem (&ExpressionOpCode->Guid, &(( EFI_IFR_QUESTION_REF3_3 *) OpCodeData)->Guid, sizeof (EFI_GUID));\r
-          }\r
-        }\r
-        break;\r
-\r
-      //\r
-      // constant\r
-      //\r
-      case EFI_IFR_TRUE_OP:\r
-        Value->Type = EFI_IFR_TYPE_BOOLEAN;\r
-        Value->Value.b = TRUE;\r
-        break;\r
-\r
-      case EFI_IFR_FALSE_OP:\r
-        Value->Type = EFI_IFR_TYPE_BOOLEAN;\r
-        Value->Value.b = FALSE;\r
-        break;\r
-\r
-      case EFI_IFR_ONE_OP:\r
-        Value->Type = EFI_IFR_TYPE_NUM_SIZE_8;\r
-        Value->Value.u8 = 1;\r
-        break;\r
-\r
-      case EFI_IFR_ZERO_OP:\r
-        Value->Type = EFI_IFR_TYPE_NUM_SIZE_8;\r
-        Value->Value.u8 = 0;\r
-        break;\r
-\r
-      case EFI_IFR_ONES_OP:\r
-        Value->Type = EFI_IFR_TYPE_NUM_SIZE_64;\r
-        Value->Value.u64 = 0xffffffffffffffffULL;\r
-        break;\r
-\r
-      case EFI_IFR_UINT8_OP:\r
-        Value->Type = EFI_IFR_TYPE_NUM_SIZE_8;\r
-        Value->Value.u8 = (( EFI_IFR_UINT8 *) OpCodeData)->Value;\r
-        break;\r
-\r
-      case EFI_IFR_UINT16_OP:\r
-        Value->Type = EFI_IFR_TYPE_NUM_SIZE_16;\r
-        CopyMem (&Value->Value.u16, &(( EFI_IFR_UINT16 *) OpCodeData)->Value, sizeof (UINT16));\r
-        break;\r
-\r
-      case EFI_IFR_UINT32_OP:\r
-        Value->Type = EFI_IFR_TYPE_NUM_SIZE_32;\r
-        CopyMem (&Value->Value.u32, &(( EFI_IFR_UINT32 *) OpCodeData)->Value, sizeof (UINT32));\r
-        break;\r
-\r
-      case EFI_IFR_UINT64_OP:\r
-        Value->Type = EFI_IFR_TYPE_NUM_SIZE_64;\r
-        CopyMem (&Value->Value.u64, &(( EFI_IFR_UINT64 *) OpCodeData)->Value, sizeof (UINT64));\r
-        break;\r
-\r
-      case EFI_IFR_UNDEFINED_OP:\r
-        Value->Type = EFI_IFR_TYPE_OTHER;\r
-        break;\r
-\r
-      case EFI_IFR_VERSION_OP:\r
-        Value->Type = EFI_IFR_TYPE_NUM_SIZE_16;\r
-        Value->Value.u16 = EFI_IFR_SPECIFICATION_VERSION;\r
-        break;\r
-\r
-      default:\r
-        break;\r
-      }\r
-\r
-      InsertTailList (&CurrentExpression->OpCodeListHead, &ExpressionOpCode->Link);\r
-\r
-      if (SingleOpCodeExpression) {\r
-        //\r
-        // There are two cases to indicate the end of an Expression:\r
-        // for single OpCode expression: one Expression OpCode\r
-        // for expression consists of more than one OpCode: EFI_IFR_END\r
-        //\r
-        SingleOpCodeExpression = FALSE;\r
-\r
-        if (InScopeDisable) {\r
-          //\r
-          // Evaluate DisableIf expression\r
-          //\r
-          Status = EvaluateExpression (FormSet, CurrentForm, CurrentExpression);\r
-          if (EFI_ERROR (Status)) {\r
-            return Status;\r
-          }\r
-          if (CurrentExpression->Result.Type != EFI_IFR_TYPE_BOOLEAN) {\r
-            return EFI_INVALID_PARAMETER;\r
-          }\r
-\r
-          OpCodeDisabled = CurrentExpression->Result.Value.b;\r
-        }\r
-\r
-        CurrentExpression = NULL;\r
-      }\r
-\r
       continue;\r
     }\r
 \r
@@ -1004,7 +632,7 @@ ParseOpCodes (
       //\r
       CurrentForm = AllocateZeroPool (sizeof (FORM_BROWSER_FORM));\r
       CurrentForm->Signature = FORM_BROWSER_FORM_SIGNATURE;\r
-      InitializeListHead (&CurrentForm->ExpressionListHead);\r
+\r
       InitializeListHead (&CurrentForm->StatementListHead);\r
 \r
       CopyMem (&CurrentForm->FormId,    &((EFI_IFR_FORM *) OpCodeData)->FormId,    sizeof (UINT16));\r
@@ -1030,9 +658,6 @@ ParseOpCodes (
       CopyMem (&Storage->Guid,       &((EFI_IFR_VARSTORE *) OpCodeData)->Guid,       sizeof (EFI_GUID));\r
       CopyMem (&Storage->Size,       &((EFI_IFR_VARSTORE *) OpCodeData)->Size,       sizeof (UINT16));\r
 \r
-      Storage->Buffer = AllocateZeroPool (Storage->Size);\r
-      Storage->EditBuffer = AllocateZeroPool (Storage->Size);\r
-\r
       AsciiString = (CHAR8 *) ((EFI_IFR_VARSTORE *) OpCodeData)->Name;\r
       Storage->Name = AllocateZeroPool (AsciiStrSize (AsciiString) * 2);\r
       ASSERT (Storage->Name != NULL);\r
@@ -1040,26 +665,11 @@ ParseOpCodes (
         Storage->Name[Index] = (CHAR16) AsciiString[Index];\r
       }\r
 \r
-      //\r
-      // Initialize <ConfigHdr>\r
-      //\r
-      InitializeConfigHdr (FormSet, Storage);\r
       break;\r
 \r
     case EFI_IFR_VARSTORE_NAME_VALUE_OP:\r
-      //\r
-      // Create a name/value Storage for this FormSet\r
-      //\r
-      Storage = CreateStorage (FormSet);\r
-      Storage->Type = EFI_HII_VARSTORE_NAME_VALUE;\r
+      ASSERT (FALSE);\r
 \r
-      CopyMem (&Storage->VarStoreId, &((EFI_IFR_VARSTORE_NAME_VALUE *) OpCodeData)->VarStoreId, sizeof (EFI_VARSTORE_ID));\r
-      CopyMem (&Storage->Guid,       &((EFI_IFR_VARSTORE_NAME_VALUE *) OpCodeData)->Guid,       sizeof (EFI_GUID));\r
-\r
-      //\r
-      // Initialize <ConfigHdr>\r
-      //\r
-      InitializeConfigHdr (FormSet, Storage);\r
       break;\r
 \r
     case EFI_IFR_VARSTORE_EFI_OP:\r
@@ -1191,11 +801,14 @@ ParseOpCodes (
         break;\r
       }\r
 \r
-      InitializeRequestElement (FormSet, CurrentStatement);\r
-\r
       if ((Operand == EFI_IFR_ONE_OF_OP) && Scope) {\r
         SuppressForOption = TRUE;\r
       }\r
+\r
+      if (Operand == EFI_IFR_ONE_OF_OP) {\r
+        OneOfOpcode = (EFI_IFR_ONE_OF *) OpCodeData;\r
+        OneOfType   = OneOfOpcode->Flags & EFI_IFR_NUMERIC_SIZE;\r
+      }\r
       break;\r
 \r
     case EFI_IFR_ORDERED_LIST_OP:\r
@@ -1204,7 +817,6 @@ ParseOpCodes (
       CurrentStatement->Flags = ((EFI_IFR_ORDERED_LIST *) OpCodeData)->Flags;\r
       CurrentStatement->MaxContainers = ((EFI_IFR_ORDERED_LIST *) OpCodeData)->MaxContainers;\r
       CurrentStatement->StorageWidth = (UINT16)(CurrentStatement->MaxContainers * sizeof (UINT8));\r
-      InitializeRequestElement (FormSet, CurrentStatement);\r
 \r
       //\r
       // No buffer type is defined in EFI_IFR_TYPE_VALUE, so a Configuration Driver\r
@@ -1226,7 +838,6 @@ ParseOpCodes (
       CurrentStatement->StorageWidth = sizeof (BOOLEAN);\r
       CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_BOOLEAN;\r
 \r
-      InitializeRequestElement (FormSet, CurrentStatement);\r
       break;\r
 \r
     case EFI_IFR_STRING_OP:\r
@@ -1245,7 +856,6 @@ ParseOpCodes (
       CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_STRING;\r
       CurrentStatement->BufferValue = AllocateZeroPool (CurrentStatement->StorageWidth);\r
 \r
-      InitializeRequestElement (FormSet, CurrentStatement);\r
       break;\r
 \r
     case EFI_IFR_PASSWORD_OP:\r
@@ -1263,7 +873,6 @@ ParseOpCodes (
       CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_STRING;\r
       CurrentStatement->BufferValue = AllocateZeroPool (CurrentStatement->StorageWidth);\r
 \r
-      InitializeRequestElement (FormSet, CurrentStatement);\r
       break;\r
 \r
     case EFI_IFR_DATE_OP:\r
@@ -1272,17 +881,6 @@ ParseOpCodes (
       CurrentStatement->Flags = ((EFI_IFR_DATE *) OpCodeData)->Flags;\r
       CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_DATE;\r
 \r
-      if ((CurrentStatement->Flags & EFI_QF_DATE_STORAGE) == QF_DATE_STORAGE_NORMAL) {\r
-        CurrentStatement->StorageWidth = sizeof (EFI_HII_DATE);\r
-\r
-        InitializeRequestElement (FormSet, CurrentStatement);\r
-      } else {\r
-        //\r
-        // Don't assign storage for RTC type of date/time\r
-        //\r
-        CurrentStatement->Storage = NULL;\r
-        CurrentStatement->StorageWidth = 0;\r
-      }\r
       break;\r
 \r
     case EFI_IFR_TIME_OP:\r
@@ -1291,17 +889,6 @@ ParseOpCodes (
       CurrentStatement->Flags = ((EFI_IFR_TIME *) OpCodeData)->Flags;\r
       CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_TIME;\r
 \r
-      if ((CurrentStatement->Flags & QF_TIME_STORAGE) == QF_TIME_STORAGE_NORMAL) {\r
-        CurrentStatement->StorageWidth = sizeof (EFI_IFR_TIME);\r
-\r
-        InitializeRequestElement (FormSet, CurrentStatement);\r
-      } else {\r
-        //\r
-        // Don't assign storage for RTC type of date/time\r
-        //\r
-        CurrentStatement->Storage = NULL;\r
-        CurrentStatement->StorageWidth = 0;\r
-      }\r
       break;\r
 \r
     //\r
@@ -1348,10 +935,6 @@ ParseOpCodes (
       CopyMem (&CurrentOption->Value.Value, &((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Value, sizeof (EFI_IFR_TYPE_VALUE));\r
       ExtendValueToU64 (&CurrentOption->Value);\r
 \r
-      if (InScopeOptionSuppress) {\r
-        CurrentOption->SuppressExpression = OptionSuppressExpression;\r
-      }\r
-\r
       //\r
       // Insert to Option list of current Question\r
       //\r
@@ -1363,99 +946,25 @@ ParseOpCodes (
     //\r
     case EFI_IFR_NO_SUBMIT_IF_OP:\r
     case EFI_IFR_INCONSISTENT_IF_OP:\r
-      //\r
-      // Create an Expression node\r
-      //\r
-      CurrentExpression = CreateExpression (CurrentForm);\r
-      CopyMem (&CurrentExpression->Error, &((EFI_IFR_INCONSISTENT_IF *) OpCodeData)->Error, sizeof (EFI_STRING_ID));\r
-\r
-      if (Operand == EFI_IFR_NO_SUBMIT_IF_OP) {\r
-        CurrentExpression->Type = EFI_HII_EXPRESSION_NO_SUBMIT_IF;\r
-        InsertTailList (&CurrentStatement->NoSubmitListHead, &CurrentExpression->Link);\r
-      } else {\r
-        CurrentExpression->Type = EFI_HII_EXPRESSION_INCONSISTENT_IF;\r
-        InsertTailList (&CurrentStatement->InconsistentListHead, &CurrentExpression->Link);\r
-      }\r
       break;\r
 \r
     case EFI_IFR_SUPPRESS_IF_OP:\r
-      //\r
-      // Question and Option will appear in scope of this OpCode\r
-      //\r
-      CurrentExpression = CreateExpression (CurrentForm);\r
-      CurrentExpression->Type = EFI_HII_EXPRESSION_SUPPRESS_IF;\r
-      InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link);\r
-\r
-      if (SuppressForOption) {\r
-        InScopeOptionSuppress = TRUE;\r
-        OptionSuppressExpression = CurrentExpression;\r
-      } else {\r
-        mInScopeSuppress = TRUE;\r
-        mSuppressExpression = CurrentExpression;\r
-      }\r
       break;\r
 \r
     case EFI_IFR_GRAY_OUT_IF_OP:\r
-      //\r
-      // Questions will appear in scope of this OpCode\r
-      //\r
-      CurrentExpression = CreateExpression (CurrentForm);\r
-      CurrentExpression->Type = EFI_HII_EXPRESSION_GRAY_OUT_IF;\r
-      InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link);\r
-\r
-      mInScopeGrayOut = TRUE;\r
-      mGrayOutExpression = CurrentExpression;\r
       break;\r
 \r
     case EFI_IFR_DISABLE_IF_OP:\r
-      //\r
-      // The DisableIf expression should only rely on constant, so it could be\r
-      // evaluated at initialization and it will not be queued\r
-      //\r
-      CurrentExpression = AllocateZeroPool (sizeof (FORM_EXPRESSION));\r
-      CurrentExpression->Signature = FORM_EXPRESSION_SIGNATURE;\r
-      CurrentExpression->Type = EFI_HII_EXPRESSION_DISABLE_IF;\r
-      InitializeListHead (&CurrentExpression->OpCodeListHead);\r
-\r
-      InScopeDisable = TRUE;\r
-      OpCodeDisabled = FALSE;\r
+      ASSERT (FALSE);\r
 \r
-      //\r
-      // Take a look at next OpCode to see whether current expression consists\r
-      // of single OpCode\r
-      //\r
-      if (((EFI_IFR_OP_HEADER *) (OpCodeData + OpCodeLength))->Scope == 0) {\r
-        SingleOpCodeExpression = TRUE;\r
-      }\r
-      break;\r
 \r
     //\r
     // Expression\r
     //\r
     case EFI_IFR_VALUE_OP:\r
-      CurrentExpression = CreateExpression (CurrentForm);\r
-      CurrentExpression->Type = EFI_HII_EXPRESSION_VALUE;\r
-      InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link);\r
-\r
-      if (InScopeDefault) {\r
-        //\r
-        // Used for default (EFI_IFR_DEFAULT)\r
-        //\r
-        CurrentDefault->ValueExpression = CurrentExpression;\r
-      } else {\r
-        //\r
-        // If used for a question, then the question will be read-only\r
-        //\r
-        CurrentStatement->ValueExpression = CurrentExpression;\r
-      }\r
       break;\r
 \r
     case EFI_IFR_RULE_OP:\r
-      CurrentExpression = CreateExpression (CurrentForm);\r
-      CurrentExpression->Type = EFI_HII_EXPRESSION_RULE;\r
-\r
-      CurrentExpression->RuleId = ((EFI_IFR_RULE *) OpCodeData)->RuleId;\r
-      InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link);\r
       break;\r
 \r
     //\r
@@ -1500,7 +1009,9 @@ ParseOpCodes (
     // Vendor specific\r
     //\r
     case EFI_IFR_GUID_OP:\r
-      if (CompareGuid (&gTianoHiiIfrGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {\r
+      OptionMap = (EFI_IFR_GUID_OPTIONKEY *) OpCodeData;\r
+      \r
+      if (CompareGuid (&mTianoHiiIfrGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {\r
         //\r
         // Tiano specific GUIDed opcodes\r
         //\r
@@ -1511,18 +1022,6 @@ ParseOpCodes (
           //\r
           break;\r
 \r
-#if 0\r
-        case EFI_IFR_EXTEND_OP_BANNER:\r
-          if (FormSet->SubClass == EFI_FRONT_PAGE_SUBCLASS) {\r
-            CopyMem (\r
-              &BannerData->Banner[((EFI_IFR_GUID_BANNER *) OpCodeData)->LineNumber][\r
-              ((EFI_IFR_GUID_BANNER *) OpCodeData)->Alignment],\r
-              &((EFI_IFR_GUID_BANNER *) OpCodeData)->Title,\r
-              sizeof (EFI_STRING_ID)\r
-              );\r
-          }\r
-          break;\r
-#endif\r
 \r
         case EFI_IFR_EXTEND_OP_CLASS:\r
           CopyMem (&FormSet->Class, &((EFI_IFR_GUID_CLASS *) OpCodeData)->Class, sizeof (UINT16));\r
@@ -1535,7 +1034,36 @@ ParseOpCodes (
         default:\r
           break;\r
         }\r
-      }\r
+      } \r
+      else if (CompareGuid ((EFI_GUID *)(VOID *)&OptionMap->Guid, &mFrameworkHiiCompatibilityGuid)) {\r
+        if (OptionMap->ExtendOpCode == EFI_IFR_EXTEND_OP_OPTIONKEY) {\r
+          OneOfOptinMapEntryListHead = GetOneOfOptionMapEntryListHead (FormSet, OptionMap->QuestionId);\r
+          if (OneOfOptinMapEntryListHead == NULL) {\r
+            OneOfOptionMap = AllocateZeroPool (sizeof (ONE_OF_OPTION_MAP));\r
+            ASSERT (OneOfOptionMap != NULL);\r
+\r
+            OneOfOptionMap->Signature = ONE_OF_OPTION_MAP_SIGNATURE;\r
+            OneOfOptionMap->QuestionId = OptionMap->QuestionId;\r
+\r
+            //\r
+            // Make sure OneOfType is initialized.\r
+            //\r
+            ASSERT (OneOfType != (UINT8) -1);\r
+            OneOfOptionMap->ValueType = OneOfType;\r
+            InitializeListHead (&OneOfOptionMap->OneOfOptionMapEntryListHead);\r
+            OneOfOptinMapEntryListHead = &OneOfOptionMap->OneOfOptionMapEntryListHead;\r
+            InsertTailList (&FormSet->OneOfOptionMapListHead, &OneOfOptionMap->Link);\r
+          }\r
+          OneOfOptionMapEntry = AllocateZeroPool (sizeof (ONE_OF_OPTION_MAP_ENTRY));\r
+          ASSERT (OneOfOptionMapEntry != NULL);\r
+\r
+          OneOfOptionMapEntry->Signature = ONE_OF_OPTION_MAP_ENTRY_SIGNATURE;\r
+          OneOfOptionMapEntry->FwKey = OptionMap->KeyValue;\r
+          CopyMem (&OneOfOptionMapEntry->Value, &OptionMap->OptionValue, sizeof (EFI_IFR_TYPE_VALUE));\r
+          \r
+          InsertTailList (OneOfOptinMapEntryListHead, &OneOfOptionMapEntry->Link);\r
+        }\r
+     }\r
       break;\r
 \r
     //\r
@@ -1610,29 +1138,6 @@ ParseOpCodes (
 \r
       default:\r
         if (IsExpressionOpCode (ScopeOpCode)) {\r
-          if (InScopeDisable) {\r
-            //\r
-            // Evaluate DisableIf expression\r
-            //\r
-            Status = EvaluateExpression (FormSet, CurrentForm, CurrentExpression);\r
-            if (EFI_ERROR (Status)) {\r
-              return Status;\r
-            }\r
-            if (CurrentExpression->Result.Type != EFI_IFR_TYPE_BOOLEAN) {\r
-              return EFI_INVALID_PARAMETER;\r
-            }\r
-\r
-            OpCodeDisabled = CurrentExpression->Result.Value.b;\r
-            //\r
-            // DisableIf Expression is only used once and not quequed, free it\r
-            //\r
-            DestroyExpression (CurrentExpression);\r
-          }\r
-\r
-          //\r
-          // End of current Expression\r
-          //\r
-          CurrentExpression = NULL;\r
         }\r
         break;\r
       }\r