]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/C/VfrCompile/VfrFormPkg.cpp
BaseTool/VfrCompiler: Support Bit fields in EFI/Buffer VarStore
[mirror_edk2.git] / BaseTools / Source / C / VfrCompile / VfrFormPkg.cpp
index 2be0c385e31371a28ce542ec78f166907301fff5..b8350623f2a06f8c6f3dc6855f43bec5e3018448 100644 (file)
@@ -2,7 +2,7 @@
   \r
   The definition of CFormPkg's member function\r
 \r
-Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2017, 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
@@ -829,6 +829,9 @@ CFormPkg::DeclarePendingQuestion (
   UINT32         ShrinkSize = 0;\r
   EFI_VFR_RETURN_CODE  ReturnCode;\r
   EFI_VFR_VARSTORE_TYPE VarStoreType  = EFI_VFR_VARSTORE_INVALID;\r
+  UINT8    LFlags;\r
+  UINT32   MaxValue;\r
+  CIfrGuid *GuidObj = NULL;\r
 \r
   //\r
   // Declare all questions as Numeric in DisableIf True\r
@@ -844,14 +847,8 @@ CFormPkg::DeclarePendingQuestion (
   // Declare Numeric qeustion for each undefined question.\r
   for (pNode = PendingAssignList; pNode != NULL; pNode = pNode->mNext) {\r
     if (pNode->mFlag == PENDING) {\r
-      CIfrNumeric CNObj;\r
       EFI_VARSTORE_INFO Info; \r
       EFI_QUESTION_ID   QId   = EFI_QUESTION_ID_INVALID;\r
-\r
-      CNObj.SetLineNo (LineNo);\r
-      CNObj.SetPrompt (0x0);\r
-      CNObj.SetHelp (0x0);\r
-\r
       //\r
       // Register this question, assume it is normal question, not date or time question\r
       //\r
@@ -888,7 +885,7 @@ CFormPkg::DeclarePendingQuestion (
       } else {\r
         if (VarStoreType == EFI_VFR_VARSTORE_EFI) {\r
           ReturnCode = lCVfrDataStorage.GetEfiVarStoreInfo (&Info);\r
-        } else if (VarStoreType == EFI_VFR_VARSTORE_BUFFER) {\r
+        } else if (VarStoreType == EFI_VFR_VARSTORE_BUFFER || VarStoreType == EFI_VFR_VARSTORE_BUFFER_BITS) {\r
           VarStr = pNode->mKey;\r
           //convert VarStr with store name to VarStr with structure name\r
           ReturnCode = lCVfrDataStorage.GetBufferVarStoreDataTypeName (Info.mVarStoreId, &SName);\r
@@ -897,7 +894,7 @@ CFormPkg::DeclarePendingQuestion (
             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
+            ReturnCode = lCVfrVarDataTypeDB.GetDataFieldInfo (NewStr, Info.mInfo.mVarOffset, Info.mVarType, Info.mVarTotalSize, Info.mIsBitVar);\r
             delete[] NewStr;\r
           }\r
         } else {\r
@@ -908,39 +905,63 @@ CFormPkg::DeclarePendingQuestion (
         gCVfrErrorHandle.HandleError (ReturnCode, pNode->mLineNo, pNode->mKey);\r
         return ReturnCode;\r
       }\r
-\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
+      // If the storage is bit fields, create Guid opcode to wrap the numeric opcode.\r
       //\r
-      if (Info.mVarType == EFI_IFR_TYPE_BOOLEAN) {\r
-        Info.mVarType = EFI_IFR_TYPE_NUM_SIZE_8;\r
+      if (Info.mIsBitVar) {\r
+        GuidObj = new CIfrGuid(0);\r
+        GuidObj->SetGuid (&gEdkiiIfrBitVarGuid);\r
+        GuidObj->SetLineNo(LineNo);\r
       }\r
-      CNObj.SetFlags (0, Info.mVarType);\r
+\r
+      CIfrNumeric CNObj;\r
+      CNObj.SetLineNo (LineNo);\r
+      CNObj.SetPrompt (0x0);\r
+      CNObj.SetHelp (0x0);\r
+      CNObj.SetQuestionId (QId);\r
+      CNObj.SetVarStoreInfo (&Info);\r
+\r
       //\r
-      // Use maximum value not to limit the vaild value for the undefined question.\r
+      // Set Min/Max/Step Data and flags for the question with bit fields.Min/Max/Step Data are saved as UINT32 type for bit question.\r
       //\r
-      switch (Info.mVarType) {\r
-      case EFI_IFR_TYPE_NUM_SIZE_64:\r
-        CNObj.SetMinMaxStepData ((UINT64) 0, (UINT64) -1 , (UINT64) 0);\r
-        ShrinkSize = 0;\r
-        break;\r
-      case EFI_IFR_TYPE_NUM_SIZE_32:\r
-        CNObj.SetMinMaxStepData ((UINT32) 0, (UINT32) -1 , (UINT32) 0);\r
+      if (Info.mIsBitVar) {\r
+        MaxValue = (1 << Info.mVarTotalSize) -1;\r
+        CNObj.SetMinMaxStepData ((UINT32) 0, MaxValue, (UINT32) 0);\r
         ShrinkSize = 12;\r
-        break;\r
-      case EFI_IFR_TYPE_NUM_SIZE_16:\r
-        CNObj.SetMinMaxStepData ((UINT16) 0, (UINT16) -1 , (UINT16) 0);\r
-        ShrinkSize = 18;\r
-        break;\r
-      case EFI_IFR_TYPE_NUM_SIZE_8:\r
-        CNObj.SetMinMaxStepData ((UINT8) 0, (UINT8) -1 , (UINT8) 0);\r
-        ShrinkSize = 21;\r
-        break;\r
-      default:\r
-        break;\r
+        LFlags = (EDKII_IFR_NUMERIC_SIZE_BIT & Info.mVarTotalSize);\r
+        CNObj.SetFlagsForBitField (0, LFlags);\r
+      } else {\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
+          ShrinkSize = 0;\r
+          break;\r
+        case EFI_IFR_TYPE_NUM_SIZE_32:\r
+          CNObj.SetMinMaxStepData ((UINT32) 0, (UINT32) -1 , (UINT32) 0);\r
+          ShrinkSize = 12;\r
+          break;\r
+        case EFI_IFR_TYPE_NUM_SIZE_16:\r
+          CNObj.SetMinMaxStepData ((UINT16) 0, (UINT16) -1 , (UINT16) 0);\r
+          ShrinkSize = 18;\r
+          break;\r
+        case EFI_IFR_TYPE_NUM_SIZE_8:\r
+          CNObj.SetMinMaxStepData ((UINT8) 0, (UINT8) -1 , (UINT8) 0);\r
+          ShrinkSize = 21;\r
+          break;\r
+        default:\r
+          break;\r
+        }\r
       }\r
       CNObj.ShrinkBinSize (ShrinkSize);\r
 \r
@@ -956,8 +977,18 @@ CFormPkg::DeclarePendingQuestion (
       //\r
       // End for Numeric\r
       //\r
-      CIfrEnd CEObj; \r
+      CIfrEnd CEObj;\r
       CEObj.SetLineNo (LineNo);\r
+      //\r
+      // End for Guided opcode\r
+      //\r
+      if (GuidObj != NULL) {\r
+        CIfrEnd CEObjGuid;\r
+        CEObjGuid.SetLineNo (LineNo);\r
+        GuidObj->SetScope(1);\r
+        delete GuidObj;\r
+        GuidObj = NULL;\r
+      }\r
     }\r
   }\r
 \r