]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Enhance the browser parse opcode logic, skip the opcode which is not defined in UEFI...
authorEric Dong <eric.dong@intel.com>
Fri, 18 Apr 2014 03:17:54 +0000 (03:17 +0000)
committerydong10 <ydong10@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 18 Apr 2014 03:17:54 +0000 (03:17 +0000)
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Eric Dong <eric.dong@intel.com>
Reviewed-by: Gao, Liming <liming,gao@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15475 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c

index b4f045df601ae543f46ae214729fce4d54bedfc9..920c839956d67a0c25850223e3eddcacb318b427 100644 (file)
@@ -1073,6 +1073,23 @@ IsStatementOpCode (
   }\r
 }\r
 \r
+/**\r
+  Tell whether this Operand is an known OpCode.\r
+\r
+  @param  Operand                Operand of an IFR OpCode.\r
+\r
+  @retval TRUE                   This is an Statement OpCode.\r
+  @retval FALSE                  Not an Statement OpCode.\r
+\r
+**/\r
+BOOLEAN\r
+IsUnKnownOpCode (\r
+  IN UINT8              Operand\r
+  )\r
+{\r
+  return Operand > EFI_IFR_WARNING_IF_OP ? TRUE : FALSE;\r
+}\r
+\r
 /**\r
   Calculate number of Statemens(Questions) and Expression OpCodes.\r
 \r
@@ -1165,6 +1182,8 @@ ParseOpCodes (
   EFI_VARSTORE_ID         TempVarstoreId;\r
   BOOLEAN                 InScopeDisable;\r
   INTN                    ConditionalExprCount;\r
+  BOOLEAN                 InUnknownScope;\r
+  UINT8                   UnknownDepth;\r
 \r
   SuppressForQuestion      = FALSE;\r
   SuppressForOption        = FALSE;\r
@@ -1184,6 +1203,8 @@ ParseOpCodes (
   MapExpressionList        = NULL;\r
   TempVarstoreId           = 0;\r
   ConditionalExprCount     = 0;\r
+  InUnknownScope           = FALSE;\r
+  UnknownDepth             = 0;\r
 \r
   //\r
   // Get the number of Statements and Expressions\r
@@ -1226,6 +1247,31 @@ ParseOpCodes (
     Operand = ((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode;\r
     Scope = ((EFI_IFR_OP_HEADER *) OpCodeData)->Scope;\r
 \r
+    if (InUnknownScope) {\r
+      if (Operand == EFI_IFR_END_OP) {\r
+        UnknownDepth --;\r
+\r
+        if (UnknownDepth == 0) {\r
+          InUnknownScope = FALSE;\r
+        }\r
+      } else {\r
+        if (Scope != 0) {\r
+          UnknownDepth ++;\r
+        }\r
+      }\r
+\r
+      continue;\r
+    }\r
+\r
+    if (IsUnKnownOpCode(Operand)) {\r
+      if (Scope != 0) {\r
+        InUnknownScope = TRUE;\r
+        UnknownDepth ++;\r
+      }\r
+\r
+      continue;\r
+    }\r
+\r
     //\r
     // If scope bit set, push onto scope stack\r
     //\r