]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c
Add PI complied S3 implementation. Include the Opcode definition and EFI_BOOT_SCRIPT_...
[mirror_edk2.git] / MdeModulePkg / Universal / SetupBrowserDxe / IfrParse.c
index 3285cfe5aae6acc59c1363219affea71f84066ca..c0b2de7f05e7da3aa6cfd48ec18f4b88b020ec36 100644 (file)
@@ -13,7 +13,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 **/\r
 \r
 #include "Setup.h"\r
-#include "Ui.h"\r
 \r
 UINT16           mStatementIndex;\r
 UINT16           mExpressionOpCodeIndex;\r
@@ -96,15 +95,15 @@ CreateStatement (
   Convert a numeric value to a Unicode String and insert it to String Package.\r
   This string is used as the Unicode Name for the EFI Variable. This is to support\r
   the deprecated vareqval opcode.\r
-  \r
+\r
   @param FormSet        The FormSet.\r
   @param Statement      The numeric question whose VarStoreInfo.VarName is the\r
                         numeric value which is used to produce the Unicode Name\r
                         for the EFI Variable.\r
-                        \r
+\r
   If the Statement is NULL, the ASSERT.\r
   If the opcode is not Numeric, then ASSERT.\r
-  \r
+\r
   @retval EFI_SUCCESS The funtion always succeeds.\r
 **/\r
 EFI_STATUS\r
@@ -118,7 +117,7 @@ UpdateCheckBoxStringToken (
 \r
   ASSERT (Statement != NULL);\r
   ASSERT (Statement->Operand == EFI_IFR_NUMERIC_OP);\r
-  \r
+\r
   UnicodeValueToString (Str, 0, Statement->VarStoreInfo.VarName, MAXIMUM_VALUE_CHARACTERS - 1);\r
 \r
   Id = HiiSetString (FormSet->HiiHandle, 0, Str, NULL);\r
@@ -127,21 +126,21 @@ UpdateCheckBoxStringToken (
   }\r
 \r
   Statement->VarStoreInfo.VarName = Id;\r
-    \r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r
 /**\r
   Check if the next opcode is the EFI_IFR_EXTEND_OP_VAREQNAME.\r
-  \r
+\r
   @param OpCodeData     The current opcode.\r
-                        \r
+\r
   @retval TRUE Yes.\r
   @retval FALSE No.\r
 **/\r
 BOOLEAN\r
 IsNextOpCodeGuidedVarEqName (\r
-  UINT8 *OpCodeData\r
+  IN UINT8 *OpCodeData\r
   )\r
 {\r
   //\r
@@ -151,7 +150,7 @@ IsNextOpCodeGuidedVarEqName (
   if (*OpCodeData == EFI_IFR_GUID_OP) {\r
     if (CompareGuid (&gEfiIfrFrameworkGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {\r
       //\r
-      // Specific GUIDed opcodes to support IFR generated from Framework HII VFR \r
+      // Specific GUIDed opcodes to support IFR generated from Framework HII VFR\r
       //\r
       if ((((EFI_IFR_GUID_VAREQNAME *) OpCodeData)->ExtendOpCode) == EFI_IFR_EXTEND_OP_VAREQNAME) {\r
         return TRUE;\r
@@ -329,19 +328,19 @@ InitializeConfigHdr (
   )\r
 {\r
   CHAR16      *Name;\r
-  \r
+\r
   if (Storage->Type == EFI_HII_VARSTORE_BUFFER) {\r
     Name = Storage->Name;\r
   } else {\r
     Name = NULL;\r
   }\r
-  \r
+\r
   Storage->ConfigHdr = HiiConstructConfigHdr (\r
                          &Storage->Guid,\r
                          Name,\r
                          FormSet->DriverHandle\r
                          );\r
-  \r
+\r
   if (Storage->ConfigHdr == NULL) {\r
     return EFI_NOT_FOUND;\r
   }\r
@@ -652,8 +651,17 @@ DestroyFormSet (
   LIST_ENTRY            *Link;\r
   FORMSET_STORAGE       *Storage;\r
   FORMSET_DEFAULTSTORE  *DefaultStore;\r
+  FORM_EXPRESSION       *Expression;\r
   FORM_BROWSER_FORM     *Form;\r
 \r
+  if (FormSet->IfrBinaryData == NULL) {\r
+    //\r
+    // Uninitialized FormSet\r
+    //\r
+    FreePool (FormSet);\r
+    return;\r
+  }\r
+\r
   //\r
   // Free IFR binary buffer\r
   //\r
@@ -685,6 +693,17 @@ DestroyFormSet (
     }\r
   }\r
 \r
+  //\r
+  // Free Formset Expressions\r
+  //\r
+  while (!IsListEmpty (&FormSet->ExpressionListHead)) {\r
+    Link = GetFirstNode (&FormSet->ExpressionListHead);\r
+    Expression = FORM_EXPRESSION_FROM_LINK (Link);\r
+    RemoveEntryList (&Expression->Link);\r
+\r
+    DestroyExpression (Expression);\r
+  }\r
+\r
   //\r
   // Free Forms\r
   //\r
@@ -815,9 +834,12 @@ ParseOpCodes (
   UINT16                  NumberOfStatement;\r
   UINT16                  NumberOfExpression;\r
   EFI_IMAGE_ID            *ImageId;\r
+  BOOLEAN                 SuppressForQuestion;\r
   BOOLEAN                 SuppressForOption;\r
   BOOLEAN                 InScopeOptionSuppress;\r
   FORM_EXPRESSION         *OptionSuppressExpression;\r
+  BOOLEAN                 InScopeFormSuppress;\r
+  FORM_EXPRESSION         *FormSuppressExpression;\r
   UINT16                  DepthOfDisable;\r
   BOOLEAN                 OpCodeDisabled;\r
   BOOLEAN                 SingleOpCodeExpression;\r
@@ -825,7 +847,9 @@ ParseOpCodes (
   EFI_HII_VALUE           *Value;\r
 \r
   mInScopeSubtitle         = FALSE;\r
+  SuppressForQuestion      = FALSE;\r
   SuppressForOption        = FALSE;\r
+  InScopeFormSuppress      = FALSE;\r
   mInScopeSuppress         = FALSE;\r
   InScopeOptionSuppress    = FALSE;\r
   mInScopeGrayOut          = FALSE;\r
@@ -838,6 +862,7 @@ ParseOpCodes (
   CurrentDefault           = NULL;\r
   CurrentOption            = NULL;\r
   OptionSuppressExpression = NULL;\r
+  FormSuppressExpression   = NULL;\r
   ImageId                  = NULL;\r
 \r
   //\r
@@ -1086,6 +1111,8 @@ ParseOpCodes (
       //\r
       FormSet->NumberOfClassGuid = (UINT8) (((EFI_IFR_FORM_SET *) OpCodeData)->Flags & 0x3);\r
       CopyMem (FormSet->ClassGuid, OpCodeData + sizeof (EFI_IFR_FORM_SET), FormSet->NumberOfClassGuid * sizeof (EFI_GUID));\r
+\r
+      InitializeListHead (&FormSet->ExpressionListHead);\r
       break;\r
 \r
     case EFI_IFR_FORM_OP:\r
@@ -1101,6 +1128,20 @@ ParseOpCodes (
       CopyMem (&CurrentForm->FormId,    &((EFI_IFR_FORM *) OpCodeData)->FormId,    sizeof (UINT16));\r
       CopyMem (&CurrentForm->FormTitle, &((EFI_IFR_FORM *) OpCodeData)->FormTitle, sizeof (EFI_STRING_ID));\r
 \r
+      if (InScopeFormSuppress) {\r
+        //\r
+        // Form is inside of suppressif\r
+        //\r
+        CurrentForm->SuppressExpression = FormSuppressExpression;\r
+      }\r
+\r
+      if (Scope != 0) {\r
+        //\r
+        // Enter scope of a Form, suppressif will be used for Question or Option\r
+        //\r
+        SuppressForQuestion = TRUE;\r
+      }\r
+\r
       //\r
       // Insert into Form list of this FormSet\r
       //\r
@@ -1188,7 +1229,7 @@ ParseOpCodes (
     case EFI_IFR_SUBTITLE_OP:\r
       CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
       ASSERT (CurrentStatement != NULL);\r
-      \r
+\r
       CurrentStatement->Flags = ((EFI_IFR_SUBTITLE *) OpCodeData)->Flags;\r
 \r
       if (Scope != 0) {\r
@@ -1249,7 +1290,7 @@ ParseOpCodes (
     case EFI_IFR_NUMERIC_OP:\r
       CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
       ASSERT(CurrentStatement != NULL);\r
-      \r
+\r
       CurrentStatement->Flags = ((EFI_IFR_ONE_OF *) OpCodeData)->Flags;\r
       Value = &CurrentStatement->HiiValue;\r
 \r
@@ -1300,7 +1341,7 @@ ParseOpCodes (
     case EFI_IFR_ORDERED_LIST_OP:\r
       CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
       ASSERT(CurrentStatement != NULL);\r
-      \r
+\r
       CurrentStatement->Flags = ((EFI_IFR_ORDERED_LIST *) OpCodeData)->Flags;\r
       CurrentStatement->MaxContainers = ((EFI_IFR_ORDERED_LIST *) OpCodeData)->MaxContainers;\r
 \r
@@ -1314,7 +1355,7 @@ ParseOpCodes (
     case EFI_IFR_CHECKBOX_OP:\r
       CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
       ASSERT(CurrentStatement != NULL);\r
-      \r
+\r
       CurrentStatement->Flags = ((EFI_IFR_CHECKBOX *) OpCodeData)->Flags;\r
       CurrentStatement->StorageWidth = sizeof (BOOLEAN);\r
       CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_BOOLEAN;\r
@@ -1363,7 +1404,7 @@ ParseOpCodes (
     case EFI_IFR_DATE_OP:\r
       CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
       ASSERT(CurrentStatement != NULL);\r
-      \r
+\r
       CurrentStatement->Flags = ((EFI_IFR_DATE *) OpCodeData)->Flags;\r
       CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_DATE;\r
 \r
@@ -1383,7 +1424,7 @@ ParseOpCodes (
     case EFI_IFR_TIME_OP:\r
       CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
       ASSERT(CurrentStatement != NULL);\r
-      \r
+\r
       CurrentStatement->Flags = ((EFI_IFR_TIME *) OpCodeData)->Flags;\r
       CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_TIME;\r
 \r
@@ -1510,6 +1551,14 @@ ParseOpCodes (
         CurrentExpression->Type = EFI_HII_EXPRESSION_INCONSISTENT_IF;\r
         InsertTailList (&CurrentStatement->InconsistentListHead, &CurrentExpression->Link);\r
       }\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
     case EFI_IFR_SUPPRESS_IF_OP:\r
@@ -1518,14 +1567,30 @@ ParseOpCodes (
       //\r
       CurrentExpression = CreateExpression (CurrentForm);\r
       CurrentExpression->Type = EFI_HII_EXPRESSION_SUPPRESS_IF;\r
-      InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link);\r
+\r
+      if (CurrentForm == NULL) {\r
+        InsertTailList (&FormSet->ExpressionListHead, &CurrentExpression->Link);\r
+      } else {\r
+        InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link);\r
+      }\r
 \r
       if (SuppressForOption) {\r
         InScopeOptionSuppress = TRUE;\r
         OptionSuppressExpression = CurrentExpression;\r
-      } else {\r
+      } else if (SuppressForQuestion) {\r
         mInScopeSuppress = TRUE;\r
         mSuppressExpression = CurrentExpression;\r
+      } else {\r
+        InScopeFormSuppress = TRUE;\r
+        FormSuppressExpression = CurrentExpression;\r
+      }\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
@@ -1539,6 +1604,14 @@ ParseOpCodes (
 \r
       mInScopeGrayOut = TRUE;\r
       mGrayOutExpression = CurrentExpression;\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
     case EFI_IFR_DISABLE_IF_OP:\r
@@ -1597,6 +1670,14 @@ ParseOpCodes (
         ASSERT (CurrentStatement != NULL);\r
         CurrentStatement->ValueExpression = CurrentExpression;\r
       }\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
     case EFI_IFR_RULE_OP:\r
@@ -1605,6 +1686,14 @@ ParseOpCodes (
 \r
       CurrentExpression->RuleId = ((EFI_IFR_RULE *) OpCodeData)->RuleId;\r
       InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link);\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
@@ -1722,6 +1811,7 @@ ParseOpCodes (
         // End of Form\r
         //\r
         CurrentForm = NULL;\r
+        SuppressForQuestion = FALSE;\r
         break;\r
 \r
       case EFI_IFR_ONE_OF_OPTION_OP:\r
@@ -1745,8 +1835,10 @@ ParseOpCodes (
       case EFI_IFR_SUPPRESS_IF_OP:\r
         if (SuppressForOption) {\r
           InScopeOptionSuppress = FALSE;\r
-        } else {\r
+        } else if (SuppressForQuestion) {\r
           mInScopeSuppress = FALSE;\r
+        } else {\r
+          InScopeFormSuppress = FALSE;\r
         }\r
         break;\r
 \r