]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/C/VfrCompile/VfrFormPkg.cpp
Fix a bug in secure boot configuration driver: Enroll DB/KEK will disable Attempt...
[mirror_edk2.git] / BaseTools / Source / C / VfrCompile / VfrFormPkg.cpp
index ccbc04455a629ac8c1d17bd12b07d8c30c24b5da..2e859b8dfa626826c668d2697bc6de921af26bd2 100644 (file)
@@ -2,8 +2,8 @@
   \r
   The definition of CFormPkg's member function\r
 \r
-Copyright (c) 2004 - 2010, Intel Corporation                                                         \r
-All rights reserved. This program and the accompanying materials                          \r
+Copyright (c) 2004 - 2012, 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
@@ -561,22 +561,24 @@ CFormPkg::DeclarePendingQuestion (
   CHAR8          *VarStr;\r
   UINT32         ArrayIdx;\r
   CHAR8          FName[MAX_NAME_LEN];\r
+  CHAR8          *SName;\r
+  CHAR8          *NewStr;\r
   EFI_VFR_RETURN_CODE  ReturnCode;\r
   EFI_VFR_VARSTORE_TYPE VarStoreType  = EFI_VFR_VARSTORE_INVALID;\r
 \r
+  //\r
+  // Declare all questions as Numeric in DisableIf True\r
+  //\r
+  // DisableIf\r
+  CIfrDisableIf DIObj;\r
+  DIObj.SetLineNo (LineNo);\r
+  \r
+  //TrueOpcode\r
+  CIfrTrue TObj (LineNo);\r
+\r
+  // Declare Numeric qeustion for each undefined question.\r
   for (pNode = PendingAssignList; pNode != NULL; pNode = pNode->mNext) {\r
     if (pNode->mFlag == PENDING) {\r
-      //\r
-      //  declare this question as Numeric in SuppressIf True\r
-      //\r
-      // SuppressIf\r
-      CIfrSuppressIf SIObj;\r
-      SIObj.SetLineNo (LineNo);\r
-      \r
-      //TrueOpcode\r
-      CIfrTrue TObj (LineNo);\r
-      \r
-      //Numeric qeustion\r
       CIfrNumeric CNObj;\r
       EFI_VARSTORE_INFO Info; \r
          EFI_QUESTION_ID   QId   = EFI_QUESTION_ID_INVALID;\r
@@ -639,7 +641,16 @@ CFormPkg::DeclarePendingQuestion (
           ReturnCode = lCVfrDataStorage.GetEfiVarStoreInfo (&Info);\r
         } else if (VarStoreType == EFI_VFR_VARSTORE_BUFFER) {\r
           VarStr = pNode->mKey;\r
-          ReturnCode = lCVfrVarDataTypeDB.GetDataFieldInfo (VarStr, Info.mInfo.mVarOffset, Info.mVarType, Info.mVarTotalSize);\r
+          //convert VarStr with store name to VarStr with structure name\r
+          ReturnCode = lCVfrDataStorage.GetBufferVarStoreDataTypeName (FName, &SName);\r
+          if (ReturnCode == VFR_RETURN_SUCCESS) {\r
+            NewStr = new CHAR8[strlen (VarStr) + strlen (SName) + 1];\r
+            NewStr[0] = '\0';\r
+            strcpy (NewStr, SName);\r
+            strcat (NewStr, VarStr + strlen (FName));\r
+            ReturnCode = lCVfrVarDataTypeDB.GetDataFieldInfo (NewStr, Info.mInfo.mVarOffset, Info.mVarType, Info.mVarTotalSize);\r
+            delete NewStr;\r
+          }\r
         } else {\r
           ReturnCode = VFR_RETURN_UNSUPPORTED;\r
         }\r
@@ -651,13 +662,39 @@ CFormPkg::DeclarePendingQuestion (
 \r
       CNObj.SetQuestionId (QId);\r
       CNObj.SetVarStoreInfo (&Info);\r
+      //\r
+      // Numeric doesn't support BOOLEAN data type. \r
+      // BOOLEAN type has the same data size to UINT8. \r
+      //\r
+      if (Info.mVarType == EFI_IFR_TYPE_BOOLEAN) {\r
+        Info.mVarType = EFI_IFR_TYPE_NUM_SIZE_8;\r
+      }\r
       CNObj.SetFlags (0, Info.mVarType);\r
+      //\r
+      // Use maximum value not to limit the vaild value for the undefined question.\r
+      //\r
+      switch (Info.mVarType) {\r
+      case EFI_IFR_TYPE_NUM_SIZE_64:\r
+        CNObj.SetMinMaxStepData ((UINT64) 0, (UINT64) -1 , (UINT64) 0);\r
+        break;\r
+      case EFI_IFR_TYPE_NUM_SIZE_32:\r
+        CNObj.SetMinMaxStepData ((UINT32) 0, (UINT32) -1 , (UINT32) 0);\r
+        break;\r
+      case EFI_IFR_TYPE_NUM_SIZE_16:\r
+        CNObj.SetMinMaxStepData ((UINT16) 0, (UINT16) -1 , (UINT16) 0);\r
+        break;\r
+      case EFI_IFR_TYPE_NUM_SIZE_8:\r
+        CNObj.SetMinMaxStepData ((UINT8) 0, (UINT8) -1 , (UINT8) 0);\r
+        break;\r
+      default:\r
+        break;\r
+      }\r
 \r
       //\r
       // For undefined Efi VarStore type question\r
       // Append the extended guided opcode to contain VarName\r
       //\r
-      if (VarStoreType == EFI_VFR_VARSTORE_EFI) {\r
+      if (VarStoreType == EFI_VFR_VARSTORE_EFI || VfrCompatibleMode) {\r
         CIfrVarEqName CVNObj (QId, Info.mInfo.mVarName);\r
         CVNObj.SetLineNo (LineNo);\r
       }\r
@@ -667,13 +704,15 @@ CFormPkg::DeclarePendingQuestion (
       //\r
       CIfrEnd CEObj; \r
       CEObj.SetLineNo (LineNo);\r
-      //\r
-      // End for SuppressIf\r
-      //\r
-      CIfrEnd SEObj;\r
-      SEObj.SetLineNo (LineNo);\r
     }\r
   }\r
+\r
+  //\r
+  // End for DisableIf\r
+  //\r
+  CIfrEnd SEObj;\r
+  SEObj.SetLineNo (LineNo);\r
+\r
   return VFR_RETURN_SUCCESS;\r
 }\r
 \r
@@ -924,7 +963,7 @@ CIfrRecordInfoDB::CheckIdOpCode (
   switch (OpCode) {\r
   case EFI_IFR_EQ_ID_VAL_OP:\r
   case EFI_IFR_EQ_ID_ID_OP:\r
-  case EFI_IFR_EQ_ID_LIST_OP:\r
+  case EFI_IFR_EQ_ID_VAL_LIST_OP:\r
   case EFI_IFR_QUESTION_REF1_OP:\r
     return TRUE;\r
   default:\r
@@ -1305,6 +1344,8 @@ static struct {
   { sizeof (EFI_IFR_CATENATE), 0 },            // EFI_IFR_CATENATE_OP\r
   { sizeof (EFI_IFR_GUID), 0 },                // EFI_IFR_GUID_OP\r
   { sizeof (EFI_IFR_SECURITY), 0 },            // EFI_IFR_SECURITY_OP - 0x60\r
+  { sizeof (EFI_IFR_MODAL), 0},                // EFI_IFR_MODAL_OP - 0x61\r
+  { sizeof (EFI_IFR_REFRESH_ID), 0},           // EFI_IFR_REFRESH_ID_OP - 0x62\r
 };\r
 \r
 #ifdef CIFROBJ_DEUBG\r
@@ -1327,7 +1368,7 @@ static struct {
   "EFI_IFR_STRING_REF1","EFI_IFR_STRING_REF2",          "EFI_IFR_CONDITIONAL",   "EFI_IFR_QUESTION_REF3",   "EFI_IFR_ZERO",          "EFI_IFR_ONE",\r
   "EFI_IFR_ONES",       "EFI_IFR_UNDEFINED",            "EFI_IFR_LENGTH",        "EFI_IFR_DUP",             "EFI_IFR_THIS",          "EFI_IFR_SPAN",\r
   "EFI_IFR_VALUE",      "EFI_IFR_DEFAULT",              "EFI_IFR_DEFAULTSTORE",  "EFI_IFR_FORM_MAP",        "EFI_IFR_CATENATE",      "EFI_IFR_GUID",\r
-  "EFI_IFR_SECURITY",\r
+  "EFI_IFR_SECURITY",   "EFI_IFR_MODAL",                "EFI_IFR_REFRESH_ID",\r
 };\r
 \r
 VOID\r