]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c
MdeModulePkg: Clean up source files
[mirror_edk2.git] / MdeModulePkg / Universal / SetupBrowserDxe / IfrParse.c
index 8e8607d4c0093c77589c9189d4542c1ac4a0c70c..3d28e7aa50b47f5a57d38db7cb3a72959d8f9a3b 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
 Parser for IFR binary encoding.\r
 \r
-Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2007 - 2018, 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
@@ -22,7 +22,7 @@ extern LIST_ENTRY      gBrowserStorageList;
   Initialize Statement header members.\r
 \r
   @param  OpCodeData             Pointer of the raw OpCode data.\r
-  @param  FormSet                Pointer of the current FormSe.\r
+  @param  FormSet                Pointer of the current FormSet.\r
   @param  Form                   Pointer of the current Form.\r
 \r
   @return The Statement.\r
@@ -37,7 +37,7 @@ CreateStatement (
 {\r
   FORM_BROWSER_STATEMENT    *Statement;\r
   EFI_IFR_STATEMENT_HEADER  *StatementHdr;\r
-  INTN                      ConditionalExprCount; \r
+  INTN                      ConditionalExprCount;\r
 \r
   if (Form == NULL) {\r
     //\r
@@ -59,6 +59,7 @@ CreateStatement (
 \r
   Statement->Operand = ((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode;\r
   Statement->OpCode  = (EFI_IFR_OP_HEADER *) OpCodeData;\r
+  Statement->QuestionReferToBitField = FALSE;\r
 \r
   StatementHdr = (EFI_IFR_STATEMENT_HEADER *) (OpCodeData + sizeof (EFI_IFR_OP_HEADER));\r
   CopyMem (&Statement->Prompt, &StatementHdr->Prompt, sizeof (EFI_STRING_ID));\r
@@ -69,8 +70,8 @@ CreateStatement (
     //\r
     // Form is inside of suppressif\r
     //\r
-    \r
-    Statement->Expression = (FORM_EXPRESSION_LIST *) AllocatePool( \r
+\r
+    Statement->Expression = (FORM_EXPRESSION_LIST *) AllocatePool(\r
                                              (UINTN) (sizeof(FORM_EXPRESSION_LIST) + ((ConditionalExprCount -1) * sizeof(FORM_EXPRESSION *))));\r
     ASSERT (Statement->Expression != NULL);\r
     Statement->Expression->Count     = (UINTN) ConditionalExprCount;\r
@@ -116,7 +117,7 @@ UpdateCheckBoxStringToken (
   ASSERT (Statement != NULL);\r
   ASSERT (Statement->Operand == EFI_IFR_NUMERIC_OP);\r
 \r
-  UnicodeValueToString (Str, 0, Statement->VarStoreInfo.VarName, MAXIMUM_VALUE_CHARACTERS - 1);\r
+  UnicodeValueToStringS (Str, sizeof (Str), 0, Statement->VarStoreInfo.VarName, MAXIMUM_VALUE_CHARACTERS - 1);\r
 \r
   Id = HiiSetString (FormSet->HiiHandle, 0, Str, NULL);\r
   if (Id == 0) {\r
@@ -245,7 +246,7 @@ CreateQuestion (
       // Check whether old string node already exist.\r
       //\r
       Find = FALSE;\r
-      if (!IsListEmpty(&Statement->Storage->NameValueListHead)) {  \r
+      if (!IsListEmpty(&Statement->Storage->NameValueListHead)) {\r
         Link = GetFirstNode (&Statement->Storage->NameValueListHead);\r
         while (!IsNull (&Statement->Storage->NameValueListHead, Link)) {\r
           NameValueNode = NAME_VALUE_NODE_FROM_LINK (Link);\r
@@ -325,7 +326,7 @@ InitializeConfigHdr (
 {\r
   CHAR16      *Name;\r
 \r
-  if (Storage->BrowserStorage->Type == EFI_HII_VARSTORE_BUFFER || \r
+  if (Storage->BrowserStorage->Type == EFI_HII_VARSTORE_BUFFER ||\r
       Storage->BrowserStorage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
     Name = Storage->BrowserStorage->Name;\r
   } else {\r
@@ -620,7 +621,7 @@ GetFstStgFromVarId (
   @param  Storage              browser storage info.\r
 \r
   @return Pointer to a FORMSET_STORAGE data structure.\r
-  \r
+\r
 \r
 **/\r
 FORMSET_STORAGE *\r
@@ -706,7 +707,7 @@ InitializeRequestElement (
   //\r
   // Prepare <RequestElement>\r
   //\r
-  if (Storage->Type == EFI_HII_VARSTORE_BUFFER || \r
+  if (Storage->Type == EFI_HII_VARSTORE_BUFFER ||\r
       Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
     StrLen = UnicodeSPrint (\r
                RequestElement,\r
@@ -1311,6 +1312,11 @@ ParseOpCodes (
   INTN                    ConditionalExprCount;\r
   BOOLEAN                 InUnknownScope;\r
   UINT8                   UnknownDepth;\r
+  FORMSET_DEFAULTSTORE    *PreDefaultStore;\r
+  LIST_ENTRY              *DefaultLink;\r
+  BOOLEAN                 HaveInserted;\r
+  UINT16                  TotalBits;\r
+  BOOLEAN                 QuestionReferBitField;\r
 \r
   SuppressForQuestion      = FALSE;\r
   SuppressForOption        = FALSE;\r
@@ -1332,6 +1338,7 @@ ParseOpCodes (
   ConditionalExprCount     = 0;\r
   InUnknownScope           = FALSE;\r
   UnknownDepth             = 0;\r
+  QuestionReferBitField    = FALSE;\r
 \r
   //\r
   // Get the number of Statements and Expressions\r
@@ -1515,7 +1522,7 @@ ParseOpCodes (
         ExpressionOpCode->ValueType = ((EFI_IFR_GET *) OpCodeData)->VarStoreType;\r
         switch (ExpressionOpCode->ValueType) {\r
         case EFI_IFR_TYPE_BOOLEAN:\r
-        case EFI_IFR_TYPE_NUM_SIZE_8: \r
+        case EFI_IFR_TYPE_NUM_SIZE_8:\r
           ExpressionOpCode->ValueWidth = 1;\r
           break;\r
 \r
@@ -1556,8 +1563,8 @@ ParseOpCodes (
         }\r
         CopyMem (&ExpressionOpCode->VarStoreInfo.VarName,   &((EFI_IFR_GET *) OpCodeData)->VarStoreInfo.VarName,   sizeof (EFI_STRING_ID));\r
         CopyMem (&ExpressionOpCode->VarStoreInfo.VarOffset, &((EFI_IFR_GET *) OpCodeData)->VarStoreInfo.VarOffset, sizeof (UINT16));\r
-        if ((ExpressionOpCode->VarStorage != NULL) && \r
-            (ExpressionOpCode->VarStorage->Type == EFI_HII_VARSTORE_NAME_VALUE || \r
+        if ((ExpressionOpCode->VarStorage != NULL) &&\r
+            (ExpressionOpCode->VarStorage->Type == EFI_HII_VARSTORE_NAME_VALUE ||\r
              ExpressionOpCode->VarStorage->Type == EFI_HII_VARSTORE_EFI_VARIABLE)) {\r
           ExpressionOpCode->ValueName = GetToken (ExpressionOpCode->VarStoreInfo.VarName, FormSet->HiiHandle);\r
           if (ExpressionOpCode->ValueName == NULL) {\r
@@ -1747,7 +1754,7 @@ ParseOpCodes (
         //\r
         // Form is inside of suppressif\r
         //\r
-        CurrentForm->SuppressExpression = (FORM_EXPRESSION_LIST *) AllocatePool( \r
+        CurrentForm->SuppressExpression = (FORM_EXPRESSION_LIST *) AllocatePool(\r
                                                  (UINTN) (sizeof(FORM_EXPRESSION_LIST) + ((ConditionalExprCount -1) * sizeof(FORM_EXPRESSION *))));\r
         ASSERT (CurrentForm->SuppressExpression != NULL);\r
         CurrentForm->SuppressExpression->Count     = (UINTN) ConditionalExprCount;\r
@@ -1813,7 +1820,7 @@ ParseOpCodes (
         //\r
         // Form is inside of suppressif\r
         //\r
-        CurrentForm->SuppressExpression = (FORM_EXPRESSION_LIST *) AllocatePool( \r
+        CurrentForm->SuppressExpression = (FORM_EXPRESSION_LIST *) AllocatePool(\r
                                                  (UINTN) (sizeof(FORM_EXPRESSION_LIST) + ((ConditionalExprCount -1) * sizeof(FORM_EXPRESSION *))));\r
         ASSERT (CurrentForm->SuppressExpression != NULL);\r
         CurrentForm->SuppressExpression->Count     = (UINTN) ConditionalExprCount;\r
@@ -1875,17 +1882,31 @@ ParseOpCodes (
     // DefaultStore\r
     //\r
     case EFI_IFR_DEFAULTSTORE_OP:\r
+      HaveInserted = FALSE;\r
       DefaultStore = AllocateZeroPool (sizeof (FORMSET_DEFAULTSTORE));\r
       ASSERT (DefaultStore != NULL);\r
       DefaultStore->Signature = FORMSET_DEFAULTSTORE_SIGNATURE;\r
 \r
       CopyMem (&DefaultStore->DefaultId,   &((EFI_IFR_DEFAULTSTORE *) OpCodeData)->DefaultId,   sizeof (UINT16));\r
       CopyMem (&DefaultStore->DefaultName, &((EFI_IFR_DEFAULTSTORE *) OpCodeData)->DefaultName, sizeof (EFI_STRING_ID));\r
-\r
       //\r
-      // Insert to DefaultStore list of this Formset\r
+      // Insert it to the DefaultStore list of this Formset with ascending order.\r
       //\r
-      InsertTailList (&FormSet->DefaultStoreListHead, &DefaultStore->Link);\r
+      if (!IsListEmpty (&FormSet->DefaultStoreListHead)) {\r
+        DefaultLink = GetFirstNode (&FormSet->DefaultStoreListHead);\r
+        while (!IsNull (&FormSet->DefaultStoreListHead, DefaultLink)) {\r
+          PreDefaultStore = FORMSET_DEFAULTSTORE_FROM_LINK(DefaultLink);\r
+          DefaultLink = GetNextNode (&FormSet->DefaultStoreListHead, DefaultLink);\r
+          if (DefaultStore->DefaultId < PreDefaultStore->DefaultId) {\r
+            InsertTailList (&PreDefaultStore->Link, &DefaultStore->Link);\r
+            HaveInserted = TRUE;\r
+            break;\r
+          }\r
+        }\r
+      }\r
+      if (!HaveInserted) {\r
+        InsertTailList (&FormSet->DefaultStoreListHead, &DefaultStore->Link);\r
+      }\r
       break;\r
 \r
     //\r
@@ -1951,7 +1972,7 @@ ParseOpCodes (
           }\r
         }\r
       }\r
-      CurrentStatement->StorageWidth = (UINT16) sizeof (EFI_HII_REF);        \r
+      CurrentStatement->StorageWidth = (UINT16) sizeof (EFI_HII_REF);\r
       InitializeRequestElement (FormSet, CurrentStatement, CurrentForm);\r
       break;\r
 \r
@@ -1963,43 +1984,94 @@ ParseOpCodes (
       CurrentStatement->Flags = ((EFI_IFR_ONE_OF *) OpCodeData)->Flags;\r
       Value = &CurrentStatement->HiiValue;\r
 \r
-      switch (CurrentStatement->Flags & EFI_IFR_NUMERIC_SIZE) {\r
-      case EFI_IFR_NUMERIC_SIZE_1:\r
-        CurrentStatement->Minimum = ((EFI_IFR_NUMERIC *) OpCodeData)->data.u8.MinValue;\r
-        CurrentStatement->Maximum = ((EFI_IFR_NUMERIC *) OpCodeData)->data.u8.MaxValue;\r
-        CurrentStatement->Step    = ((EFI_IFR_NUMERIC *) OpCodeData)->data.u8.Step;\r
-        CurrentStatement->StorageWidth = (UINT16) sizeof (UINT8);\r
-        Value->Type = EFI_IFR_TYPE_NUM_SIZE_8;\r
-        break;\r
+      if (QuestionReferBitField) {\r
+        //\r
+        // Get the bit var store info (bit/byte offset, bit/byte offset)\r
+        //\r
+        CurrentStatement->QuestionReferToBitField = TRUE;\r
+        CurrentStatement->BitStorageWidth = CurrentStatement->Flags & EDKII_IFR_NUMERIC_SIZE_BIT;\r
+        CurrentStatement->BitVarOffset = CurrentStatement->VarStoreInfo.VarOffset;\r
+        CurrentStatement->VarStoreInfo.VarOffset = CurrentStatement->BitVarOffset / 8;\r
+        TotalBits = CurrentStatement->BitVarOffset % 8 + CurrentStatement->BitStorageWidth;\r
+        CurrentStatement->StorageWidth = (TotalBits % 8 == 0? TotalBits / 8: TotalBits / 8 + 1);\r
 \r
-      case EFI_IFR_NUMERIC_SIZE_2:\r
-        CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u16.MinValue, sizeof (UINT16));\r
-        CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u16.MaxValue, sizeof (UINT16));\r
-        CopyMem (&CurrentStatement->Step,    &((EFI_IFR_NUMERIC *) OpCodeData)->data.u16.Step,     sizeof (UINT16));\r
-        CurrentStatement->StorageWidth = (UINT16) sizeof (UINT16);\r
-        Value->Type = EFI_IFR_TYPE_NUM_SIZE_16;\r
-        break;\r
+        //\r
+        // Get the Minimum/Maximum/Step value(Note: bit field type has been stored as UINT32 type)\r
+        //\r
+        CurrentStatement->Minimum = ((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.MinValue;\r
+        CurrentStatement->Maximum = ((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.MaxValue;\r
+        CurrentStatement->Step    = ((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.Step;\r
 \r
-      case EFI_IFR_NUMERIC_SIZE_4:\r
-        CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.MinValue, sizeof (UINT32));\r
-        CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.MaxValue, sizeof (UINT32));\r
-        CopyMem (&CurrentStatement->Step,    &((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.Step,     sizeof (UINT32));\r
-        CurrentStatement->StorageWidth = (UINT16) sizeof (UINT32);\r
-        Value->Type = EFI_IFR_TYPE_NUM_SIZE_32;\r
-        break;\r
+        //\r
+        // Update the Flag and type of Minimum/Maximum/Step according to the actual width of bit field,\r
+        // in order to make Browser handle these question with bit varstore correctly.\r
+        //\r
+        ((EFI_IFR_NUMERIC *) OpCodeData)->Flags &=  EDKII_IFR_DISPLAY_BIT;\r
+        ((EFI_IFR_NUMERIC *) OpCodeData)->Flags >>= 2;\r
+        switch (CurrentStatement->StorageWidth) {\r
+        case 1:\r
+          ((EFI_IFR_NUMERIC *) OpCodeData)->Flags |= EFI_IFR_TYPE_NUM_SIZE_8;\r
+          ((EFI_IFR_NUMERIC *) OpCodeData)->data.u8.MinValue = (UINT8)CurrentStatement->Minimum;\r
+          ((EFI_IFR_NUMERIC *) OpCodeData)->data.u8.MaxValue = (UINT8)CurrentStatement->Maximum;\r
+          ((EFI_IFR_NUMERIC *) OpCodeData)->data.u8.Step = (UINT8)CurrentStatement->Step;\r
+          Value->Type = EFI_IFR_TYPE_NUM_SIZE_8;\r
+          break;\r
+        case 2:\r
+          ((EFI_IFR_NUMERIC *) OpCodeData)->Flags |= EFI_IFR_TYPE_NUM_SIZE_16;\r
+          ((EFI_IFR_NUMERIC *) OpCodeData)->data.u16.MinValue = (UINT16)CurrentStatement->Minimum;\r
+          ((EFI_IFR_NUMERIC *) OpCodeData)->data.u16.MaxValue = (UINT16)CurrentStatement->Maximum;\r
+          ((EFI_IFR_NUMERIC *) OpCodeData)->data.u16.Step = (UINT16)CurrentStatement->Step;\r
+          Value->Type = EFI_IFR_TYPE_NUM_SIZE_16;\r
+          break;\r
+        case 3:\r
+        case 4:\r
+          ((EFI_IFR_NUMERIC *) OpCodeData)->Flags |= EFI_IFR_TYPE_NUM_SIZE_32;\r
+          ((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.MinValue = (UINT32)CurrentStatement->Minimum;\r
+          ((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.MaxValue = (UINT32)CurrentStatement->Maximum;\r
+          ((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.Step = (UINT32)CurrentStatement->Step;\r
+          Value->Type = EFI_IFR_TYPE_NUM_SIZE_32;\r
+          break;\r
+        default:\r
+          break;\r
+        }\r
+      } else {\r
+        switch (CurrentStatement->Flags & EFI_IFR_NUMERIC_SIZE) {\r
+        case EFI_IFR_NUMERIC_SIZE_1:\r
+          CurrentStatement->Minimum = ((EFI_IFR_NUMERIC *) OpCodeData)->data.u8.MinValue;\r
+          CurrentStatement->Maximum = ((EFI_IFR_NUMERIC *) OpCodeData)->data.u8.MaxValue;\r
+          CurrentStatement->Step    = ((EFI_IFR_NUMERIC *) OpCodeData)->data.u8.Step;\r
+          CurrentStatement->StorageWidth = (UINT16) sizeof (UINT8);\r
+          Value->Type = EFI_IFR_TYPE_NUM_SIZE_8;\r
+          break;\r
 \r
-      case EFI_IFR_NUMERIC_SIZE_8:\r
-        CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u64.MinValue, sizeof (UINT64));\r
-        CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u64.MaxValue, sizeof (UINT64));\r
-        CopyMem (&CurrentStatement->Step,    &((EFI_IFR_NUMERIC *) OpCodeData)->data.u64.Step,     sizeof (UINT64));\r
-        CurrentStatement->StorageWidth = (UINT16) sizeof (UINT64);\r
-        Value->Type = EFI_IFR_TYPE_NUM_SIZE_64;\r
-        break;\r
+        case EFI_IFR_NUMERIC_SIZE_2:\r
+          CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u16.MinValue, sizeof (UINT16));\r
+          CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u16.MaxValue, sizeof (UINT16));\r
+          CopyMem (&CurrentStatement->Step,    &((EFI_IFR_NUMERIC *) OpCodeData)->data.u16.Step,     sizeof (UINT16));\r
+          CurrentStatement->StorageWidth = (UINT16) sizeof (UINT16);\r
+          Value->Type = EFI_IFR_TYPE_NUM_SIZE_16;\r
+          break;\r
 \r
-      default:\r
-        break;\r
-      }\r
+        case EFI_IFR_NUMERIC_SIZE_4:\r
+          CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.MinValue, sizeof (UINT32));\r
+          CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.MaxValue, sizeof (UINT32));\r
+          CopyMem (&CurrentStatement->Step,    &((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.Step,     sizeof (UINT32));\r
+          CurrentStatement->StorageWidth = (UINT16) sizeof (UINT32);\r
+          Value->Type = EFI_IFR_TYPE_NUM_SIZE_32;\r
+          break;\r
+\r
+        case EFI_IFR_NUMERIC_SIZE_8:\r
+          CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u64.MinValue, sizeof (UINT64));\r
+          CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u64.MaxValue, sizeof (UINT64));\r
+          CopyMem (&CurrentStatement->Step,    &((EFI_IFR_NUMERIC *) OpCodeData)->data.u64.Step,     sizeof (UINT64));\r
+          CurrentStatement->StorageWidth = (UINT16) sizeof (UINT64);\r
+          Value->Type = EFI_IFR_TYPE_NUM_SIZE_64;\r
+          break;\r
 \r
+        default:\r
+          break;\r
+        }\r
+      }\r
       InitializeRequestElement (FormSet, CurrentStatement, CurrentForm);\r
 \r
       if ((Operand == EFI_IFR_ONE_OF_OP) && Scope != 0) {\r
@@ -2030,6 +2102,18 @@ ParseOpCodes (
       CurrentStatement->StorageWidth = (UINT16) sizeof (BOOLEAN);\r
       CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_BOOLEAN;\r
 \r
+      if (QuestionReferBitField) {\r
+        //\r
+        // Get the bit var store info (bit/byte offset, bit/byte offset)\r
+        //\r
+        CurrentStatement->QuestionReferToBitField = TRUE;\r
+        CurrentStatement->BitStorageWidth = 1;\r
+        CurrentStatement->BitVarOffset = CurrentStatement->VarStoreInfo.VarOffset;\r
+        CurrentStatement->VarStoreInfo.VarOffset = CurrentStatement->BitVarOffset / 8;\r
+        TotalBits = CurrentStatement->BitVarOffset % 8 + CurrentStatement->BitStorageWidth;\r
+        CurrentStatement->StorageWidth = (TotalBits % 8 == 0? TotalBits / 8: TotalBits / 8 + 1);\r
+      }\r
+\r
       InitializeRequestElement (FormSet, CurrentStatement, CurrentForm);\r
 \r
       break;\r
@@ -2198,7 +2282,7 @@ ParseOpCodes (
         //\r
         // Form is inside of suppressif\r
         //\r
-        CurrentOption->SuppressExpression = (FORM_EXPRESSION_LIST *) AllocatePool( \r
+        CurrentOption->SuppressExpression = (FORM_EXPRESSION_LIST *) AllocatePool(\r
                                                  (UINTN) (sizeof(FORM_EXPRESSION_LIST) + ((ConditionalExprCount -1) * sizeof(FORM_EXPRESSION *))));\r
         ASSERT (CurrentOption->SuppressExpression != NULL);\r
         CurrentOption->SuppressExpression->Count     = (UINTN) ConditionalExprCount;\r
@@ -2312,11 +2396,11 @@ ParseOpCodes (
       }\r
 \r
       if (SuppressForOption) {\r
-        PushConditionalExpression(CurrentExpression, ExpressOption);       \r
+        PushConditionalExpression(CurrentExpression, ExpressOption);\r
       } else if (SuppressForQuestion) {\r
-        PushConditionalExpression(CurrentExpression, ExpressStatement);  \r
+        PushConditionalExpression(CurrentExpression, ExpressStatement);\r
       } else {\r
-        PushConditionalExpression(CurrentExpression, ExpressForm);  \r
+        PushConditionalExpression(CurrentExpression, ExpressForm);\r
       }\r
 \r
       //\r
@@ -2571,26 +2655,31 @@ ParseOpCodes (
       default:\r
         ASSERT (ParentStatement != NULL);\r
         ParentStatement->Locked = TRUE;\r
-      }      \r
+      }\r
       break;\r
 \r
     //\r
     // Vendor specific\r
     //\r
-    case EFI_IFR_GUID_OP:     \r
+    case EFI_IFR_GUID_OP:\r
       CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
+      if (CompareGuid ((EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER)), &gEdkiiIfrBitVarstoreGuid)) {\r
+        Scope = 0;\r
+        QuestionReferBitField = TRUE;\r
+      }\r
       break;\r
 \r
     //\r
     // Scope End\r
     //\r
     case EFI_IFR_END_OP:\r
+      QuestionReferBitField = FALSE;\r
       Status = PopScope (&ScopeOpCode);\r
       if (EFI_ERROR (Status)) {\r
         ResetScopeStack ();\r
         return Status;\r
       }\r
-      \r
+\r
       //\r
       // Parent statement end tag found, update ParentStatement info.\r
       //\r
@@ -2633,7 +2722,7 @@ ParseOpCodes (
 \r
       case EFI_IFR_SUPPRESS_IF_OP:\r
         if (SuppressForOption) {\r
-          PopConditionalExpression(ExpressOption);      \r
+          PopConditionalExpression(ExpressOption);\r
         } else if (SuppressForQuestion) {\r
           PopConditionalExpression(ExpressStatement);\r
         } else {\r