]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c
MdeModulePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdeModulePkg / Universal / SetupBrowserDxe / IfrParse.c
index 61ba0b50474daaecfe56e26c3e54b33c0fd519e8..034edb51a79a160430e70458fe1c06841273f7f2 100644 (file)
@@ -1,14 +1,8 @@
 /** @file\r
 Parser for IFR binary encoding.\r
 \r
-Copyright (c) 2007 - 2016, 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
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -37,7 +31,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 +53,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 +64,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 +111,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 +240,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 +320,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
@@ -451,39 +446,6 @@ IntializeBrowserStorage (
   }\r
 }\r
 \r
-/**\r
-  Check whether exist device path info in the ConfigHdr string.\r
-\r
-  @param  String                 UEFI configuration string\r
-\r
-  @retval TRUE                   Device Path exist.\r
-  @retval FALSE                  Not exist device path info.\r
-\r
-**/\r
-BOOLEAN\r
-IsDevicePathExist (\r
-  IN  EFI_STRING                   String\r
-  )\r
-{\r
-  UINTN                    Length;\r
-\r
-  for (; (*String != 0 && StrnCmp (String, L"PATH=", StrLen (L"PATH=")) != 0); String++);\r
-  if (*String == 0) {\r
-    return FALSE;\r
-  }\r
-\r
-  String += StrLen (L"PATH=");\r
-  if (*String == 0) {\r
-    return FALSE;\r
-  }\r
-\r
-  for (Length = 0; *String != 0 && *String != L'&'; String++, Length++);\r
-  if (((Length + 1) / 2) < sizeof (EFI_DEVICE_PATH_PROTOCOL)) {\r
-    return FALSE;\r
-  }\r
-\r
-  return TRUE;\r
-}\r
 \r
 /**\r
   Allocate a FORMSET_STORAGE data structure and insert to FormSet Storage List.\r
@@ -620,7 +582,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 +668,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
@@ -1314,6 +1276,8 @@ ParseOpCodes (
   FORMSET_DEFAULTSTORE    *PreDefaultStore;\r
   LIST_ENTRY              *DefaultLink;\r
   BOOLEAN                 HaveInserted;\r
+  UINT16                  TotalBits;\r
+  BOOLEAN                 QuestionReferBitField;\r
 \r
   SuppressForQuestion      = FALSE;\r
   SuppressForOption        = FALSE;\r
@@ -1335,6 +1299,7 @@ ParseOpCodes (
   ConditionalExprCount     = 0;\r
   InUnknownScope           = FALSE;\r
   UnknownDepth             = 0;\r
+  QuestionReferBitField    = FALSE;\r
 \r
   //\r
   // Get the number of Statements and Expressions\r
@@ -1518,7 +1483,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
@@ -1559,8 +1524,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
@@ -1750,7 +1715,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
@@ -1816,7 +1781,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
@@ -1968,7 +1933,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
@@ -1980,43 +1945,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
@@ -2047,6 +2063,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
@@ -2215,7 +2243,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
@@ -2329,11 +2357,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
@@ -2588,26 +2616,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
@@ -2650,7 +2683,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