Update VfrCompiler to fix the following incompatible and check issues.
authorlgao4 <lgao4@7335b38e-4728-0410-8992-fb3ffe349368>
Tue, 2 Sep 2008 13:11:26 +0000 (13:11 +0000)
committerlgao4 <lgao4@7335b38e-4728-0410-8992-fb3ffe349368>
Tue, 2 Sep 2008 13:11:26 +0000 (13:11 +0000)
     1. First structure name will be declared as the default buffer varstore if no any buffer varstore is declared.
     2. Use numeric IFR type to declare the undefined question in order to support the different data type.
     3. Array check for CheckBox, Nemeric and Oneof Type, because they don't support the array as their question.
     4. Check the index in array for UEFI and Framework VFR question.

git-svn-id: https://buildtools.tianocore.org/svn/buildtools/trunk/BaseTools@1320 7335b38e-4728-0410-8992-fb3ffe349368

Source/C/VfrCompile/VfrError.cpp
Source/C/VfrCompile/VfrFormPkg.cpp
Source/C/VfrCompile/VfrFormPkg.h
Source/C/VfrCompile/VfrSyntax.g
Source/C/VfrCompile/VfrUtilityLib.cpp
Source/C/VfrCompile/VfrUtilityLib.h

index 58b15aa..1950e78 100644 (file)
@@ -40,7 +40,7 @@ static SVFR_ERROR_HANDLE VFR_ERROR_HANDLE_TABLE [] = {
   { VFR_RETURN_GET_NVVARSTORE_ERROR, "get name value varstore error" },\r
   { VFR_RETURN_QVAR_REUSE, "variable reused by more than one question" }, \r
   { VFR_RETURN_FLAGS_UNSUPPORTED, "flags unsupported" }, \r
-  { VFR_RETURN_ERROR_ARRARY_NUM, "array number error" },\r
+  { VFR_RETURN_ERROR_ARRARY_NUM, "array number error, the valid value is in (0 ~ MAX_INDEX-1) for UEFI vfr and in (1 ~ MAX_INDEX) for Framework Vfr" },\r
   { VFR_RETURN_DATA_STRING_ERROR, "data field string error or not support"},\r
   { VFR_RETURN_DEFAULT_VALUE_REDEFINED, "Default value re-defined with different value"},\r
   { VFR_RETURN_CODEUNDEFINED, "Undefined Error Code" }\r
index 06aa552..a0c39c4 100644 (file)
@@ -541,6 +541,7 @@ CFormPkg::DeclarePendingQuestion (
   IN CVfrVarDataTypeDB   &lCVfrVarDataTypeDB,\r
   IN CVfrDataStorage     &lCVfrDataStorage,\r
   IN CVfrQuestionDB      &lCVfrQuestionDB,\r
+  IN EFI_GUID            *LocalFormSetGuid,\r
   IN UINT32 LineNo\r
   )\r
 {\r
@@ -554,7 +555,7 @@ CFormPkg::DeclarePendingQuestion (
   for (pNode = PendingAssignList; pNode != NULL; pNode = pNode->mNext) {\r
     if (pNode->mFlag == PENDING) {\r
       //\r
-      //  declare this question as checkbox in SuppressIf True\r
+      //  declare this question as Numeric in SuppressIf True\r
       //\r
       // SuppressIf\r
       CIfrSuppressIf SIObj;\r
@@ -563,14 +564,14 @@ CFormPkg::DeclarePendingQuestion (
       //TrueOpcode\r
       CIfrTrue TObj (LineNo);\r
       \r
-      //CheckBox qeustion\r
-      CIfrCheckBox CBObj;\r
+      //Numeric qeustion\r
+      CIfrNumeric CNObj;\r
       EFI_VARSTORE_INFO Info; \r
          EFI_QUESTION_ID   QId   = EFI_QUESTION_ID_INVALID;\r
 \r
-      CBObj.SetLineNo (LineNo);\r
-      CBObj.SetPrompt (0x0);\r
-      CBObj.SetHelp (0x0);\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
@@ -578,6 +579,7 @@ CFormPkg::DeclarePendingQuestion (
       VarStr = pNode->mKey;\r
       ReturnCode = lCVfrQuestionDB.RegisterQuestion (NULL, VarStr, QId);\r
       if (ReturnCode != VFR_RETURN_SUCCESS) {\r
+        gCVfrErrorHandle.HandleError (ReturnCode, pNode->mLineNo, pNode->mKey);\r
         return ReturnCode;\r
       }\r
  \r
@@ -589,26 +591,55 @@ CFormPkg::DeclarePendingQuestion (
       //\r
       ReturnCode = lCVfrVarDataTypeDB.ExtractFieldNameAndArrary (VarStr, FName, ArrayIdx);\r
       if (ReturnCode != VFR_RETURN_SUCCESS) {\r
+        gCVfrErrorHandle.PrintMsg (pNode->mLineNo, pNode->mKey, "Error", "Var string is not the valid C variable");\r
+        return ReturnCode;\r
+      }\r
+      //\r
+      // Get VarStoreType\r
+      //\r
+      ReturnCode = lCVfrDataStorage.GetVarStoreType (FName, VarStoreType);\r
+      if (ReturnCode == VFR_RETURN_UNDEFINED) {\r
+        lCVfrDataStorage.DeclareBufferVarStore (\r
+                           FName, \r
+                           LocalFormSetGuid, \r
+                           &lCVfrVarDataTypeDB, \r
+                           FName,\r
+                           EFI_VARSTORE_ID_INVALID,\r
+                           FALSE\r
+                           );\r
+        ReturnCode = lCVfrDataStorage.GetVarStoreType (FName, VarStoreType);  \r
+      }\r
+      if (ReturnCode != VFR_RETURN_SUCCESS) {\r
+        gCVfrErrorHandle.PrintMsg (pNode->mLineNo, FName, "Error", "Var Store Type is not defined");\r
+        return ReturnCode;\r
+      }\r
+      \r
+      ReturnCode = lCVfrDataStorage.GetVarStoreId (FName, &Info.mVarStoreId);\r
+      if (ReturnCode != VFR_RETURN_SUCCESS) {\r
+        gCVfrErrorHandle.PrintMsg (pNode->mLineNo, FName, "Error", "Var Store Type is not defined");\r
         return ReturnCode;\r
       }\r
-      lCVfrDataStorage.GetVarStoreType (FName, VarStoreType);\r
-      lCVfrDataStorage.GetVarStoreId (FName, &Info.mVarStoreId);\r
 \r
       if (*VarStr == '\0' && ArrayIdx != INVALID_ARRAY_INDEX) {\r
-        lCVfrDataStorage.GetNameVarStoreInfo (&Info, ArrayIdx);\r
+        ReturnCode = lCVfrDataStorage.GetNameVarStoreInfo (&Info, ArrayIdx);\r
       } else {\r
         if (VarStoreType == EFI_VFR_VARSTORE_EFI) {\r
-          lCVfrDataStorage.GetEfiVarStoreInfo (&Info);\r
+          ReturnCode = lCVfrDataStorage.GetEfiVarStoreInfo (&Info);\r
         } else if (VarStoreType == EFI_VFR_VARSTORE_BUFFER) {\r
           VarStr = pNode->mKey;\r
-          lCVfrVarDataTypeDB.GetDataFieldInfo (VarStr, Info.mInfo.mVarOffset, Info.mVarType, Info.mVarTotalSize);\r
+          ReturnCode = lCVfrVarDataTypeDB.GetDataFieldInfo (VarStr, Info.mInfo.mVarOffset, Info.mVarType, Info.mVarTotalSize);\r
         } else {\r
-          return VFR_RETURN_UNSUPPORTED;\r
+          ReturnCode = VFR_RETURN_UNSUPPORTED;\r
         }\r
       }\r
+      if (ReturnCode != VFR_RETURN_SUCCESS) {\r
+        gCVfrErrorHandle.HandleError (ReturnCode, pNode->mLineNo, pNode->mKey);\r
+        return ReturnCode;\r
+      }\r
 \r
-      CBObj.SetQuestionId (QId);\r
-      CBObj.SetVarStoreInfo (&Info);\r
+      CNObj.SetQuestionId (QId);\r
+      CNObj.SetVarStoreInfo (&Info);\r
+      CNObj.SetFlags (0, Info.mVarType);\r
 \r
       //\r
       // For undefined Efi VarStore type question\r
@@ -620,7 +651,7 @@ CFormPkg::DeclarePendingQuestion (
       }\r
       \r
       //\r
-      // End for checkbox\r
+      // End for Numeric\r
       //\r
       CIfrEnd CEObj; \r
       CEObj.SetLineNo (LineNo);\r
@@ -904,6 +935,7 @@ CIfrRecordInfoDB::IfrRecordAdjust (
   UINT32             StackCount;\r
   UINT32             QuestionScope;\r
   UINT32             OpcodeOffset;\r
+  CHAR8              ErrorMsg[MAX_STRING_LEN] = {0, };\r
   EFI_VFR_RETURN_CODE  Status;\r
 \r
   //\r
@@ -965,7 +997,8 @@ CIfrRecordInfoDB::IfrRecordAdjust (
         //\r
         // report error; not found\r
         //\r
-        printf ("Inconsistent OpCode Record list invalid QuestionId is 0x%X\n", QuestionId);\r
+        sprintf (ErrorMsg, "Inconsistent OpCode Record list invalid QuestionId is 0x%X", QuestionId);\r
+        gCVfrErrorHandle.PrintMsg (0, NULL, "Error", ErrorMsg);\r
         Status = VFR_RETURN_MISMATCHED;\r
         break;\r
       }\r
@@ -1016,7 +1049,8 @@ CIfrRecordInfoDB::IfrRecordAdjust (
         //\r
         // not found matched question id, report error\r
         //\r
-        printf ("QuestionId required by Inconsistent OpCode is not found. QuestionId is 0x%X\n", QuestionId);\r
+        sprintf (ErrorMsg, "QuestionId required by Inconsistent OpCode is not found. QuestionId is 0x%X", QuestionId);\r
+        gCVfrErrorHandle.PrintMsg (0, NULL, "Error", ErrorMsg);\r
         Status = VFR_RETURN_MISMATCHED;\r
         break;\r
       }\r
@@ -1039,7 +1073,7 @@ CIfrRecordInfoDB::IfrRecordAdjust (
         //\r
         // invalid IfrCode, IfrCode end by EndOpCode\r
         // \r
-        printf ("No found End Opcode in the end\n");\r
+        gCVfrErrorHandle.PrintMsg (0, NULL, "Error", "No found End Opcode in the end");\r
         Status = VFR_RETURN_MISMATCHED;\r
         break;\r
       }\r
index b474bf0..58b1a8b 100644 (file)
@@ -139,6 +139,7 @@ public:
     IN CVfrVarDataTypeDB   &lCVfrVarDataTypeDB,\r
     IN CVfrDataStorage     &lCVfrDataStorage,\r
     IN CVfrQuestionDB      &lCVfrQuestionDB,\r
+    IN EFI_GUID            *LocalFormSetGuid,\r
     IN UINT32 LineNo\r
     );\r
 };\r
index 8ba2b3a..fdb4626 100644 (file)
@@ -768,12 +768,16 @@ vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr] :
      CHAR8                 *VarStr      = NULL;\r
      CHAR8                 *SName       = NULL;\r
      CHAR8                 *TName       = NULL;\r
-     CHAR8                 *SValue      = NULL;\r
      EFI_VFR_RETURN_CODE   VfrReturnCode = VFR_RETURN_SUCCESS;\r
   >>\r
   (\r
     SN1:StringIdentifier                            << SName = SN1->getText(); _STRCAT(&VarIdStr, SN1->getText()); >>\r
-    OpenBracket I1:Number CloseBracket              << Idx = _STOU32(I1->getText()); if (mCompatibleMode) Idx--; SValue = _U32TOS (Idx); _STRCAT(&VarIdStr, "["); _STRCAT(&VarIdStr, SValue); _STRCAT(&VarIdStr, "]"); delete SValue; >>\r
+    OpenBracket I1:Number CloseBracket              << \r
+                                                       Idx = _STOU32(I1->getText()); \r
+                                                       _STRCAT(&VarIdStr, "["); \r
+                                                       _STRCAT(&VarIdStr, I1->getText()); \r
+                                                       _STRCAT(&VarIdStr, "]"); \r
+                                                    >>\r
                                                     <<\r
                                                        VfrReturnCode = mCVfrDataStorage.GetVarStoreType (SName, VarStoreType);\r
                                                        if (mCompatibleMode && VfrReturnCode == VFR_RETURN_UNDEFINED) {\r
@@ -823,8 +827,22 @@ vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr] :
                                                                                                                                >>\r
       SF:StringIdentifier                           << _STRCAT(&VarIdStr, SF->getText()); _STRCAT(&VarStr, SF->getText()); >>\r
       {\r
-        OpenBracket I2:Number CloseBracket          << Idx = _STOU32(I2->getText()); if (mCompatibleMode) Idx--; SValue = _U32TOS (Idx); _STRCAT(&VarIdStr, "["); _STRCAT(&VarIdStr, SValue); _STRCAT(&VarIdStr, "]"); delete SValue; >>\r
-                                                    << _STRCAT(&VarStr, "["); _STRCAT(&VarStr, I2->getText()); _STRCAT(&VarStr, "]"); >>\r
+        OpenBracket I2:Number CloseBracket          << \r
+                                                       Idx = _STOU32(I2->getText()); \r
+                                                       if (mCompatibleMode) Idx --;\r
+                                                       if (Idx > 0) {\r
+                                                         //\r
+                                                         // Idx == 0, [0] can be ignored.\r
+                                                         // Array[0] is same to Array for unify the varid name to cover [0]\r
+                                                         //\r
+                                                         _STRCAT(&VarIdStr, "["); \r
+                                                         _STRCAT(&VarIdStr, I2->getText()); \r
+                                                         _STRCAT(&VarIdStr, "]"); \r
+                                                       }\r
+                                                       _STRCAT(&VarStr, "["); \r
+                                                       _STRCAT(&VarStr, I2->getText()); \r
+                                                       _STRCAT(&VarStr, "]"); \r
+                                                    >>\r
       }\r
     )*                                              << \r
                                                        switch (VarStoreType) {\r
@@ -846,13 +864,16 @@ vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr] :
 \r
 vfrQuestionDataFieldName [EFI_QUESTION_ID &QId, UINT32 &Mask, CHAR8 *&VarIdStr, UINT32 &LineNo] :\r
                                                     << \r
-                                                      CHAR8   *SValue      = NULL;\r
                                                       UINT32  Idx;\r
                                                       VarIdStr = NULL; LineNo = 0; \r
                                                     >>\r
   (\r
     SN1:StringIdentifier                            << _STRCAT(&VarIdStr, SN1->getText()); LineNo = SN1->getLine(); >>\r
-    OpenBracket I1:Number CloseBracket              << Idx = _STOU32(I1->getText()); if (mCompatibleMode) Idx--; SValue = _U32TOS (Idx); _STRCAT(&VarIdStr, "["); _STRCAT(&VarIdStr, SValue); _STRCAT(&VarIdStr, "]"); delete SValue; >>\r
+    OpenBracket I1:Number CloseBracket              << \r
+                                                       _STRCAT(&VarIdStr, "["); \r
+                                                       _STRCAT(&VarIdStr, I1->getText()); \r
+                                                       _STRCAT(&VarIdStr, "]"); \r
+                                                    >>\r
                                                     << mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, $QId, $Mask); >>\r
   )\r
   |\r
@@ -862,7 +883,19 @@ vfrQuestionDataFieldName [EFI_QUESTION_ID &QId, UINT32 &Mask, CHAR8 *&VarIdStr,
       "."                                           << _STRCAT (&VarIdStr, "."); >>\r
       SF:StringIdentifier                           << _STRCAT (&VarIdStr, SF->getText()); >>\r
       {\r
-        OpenBracket I2:Number CloseBracket          << Idx = _STOU32(I2->getText());if (mCompatibleMode) Idx--;  SValue = _U32TOS (Idx); _STRCAT(&VarIdStr, "["); _STRCAT(&VarIdStr, SValue); _STRCAT(&VarIdStr, "]"); delete SValue; >>\r
+        OpenBracket I2:Number CloseBracket          << \r
+                                                       Idx = _STOU32(I2->getText()); \r
+                                                       if (mCompatibleMode) Idx --;\r
+                                                       if (Idx > 0) {\r
+                                                         //\r
+                                                         // Idx == 0, [0] can be ignored.\r
+                                                         // Array[0] is same to Array\r
+                                                         //\r
+                                                         _STRCAT(&VarIdStr, "["); \r
+                                                         _STRCAT(&VarIdStr, I2->getText()); \r
+                                                         _STRCAT(&VarIdStr, "]");\r
+                                                       }\r
+                                                    >>\r
       }\r
     )*\r
                                                     << mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, $QId, $Mask); >>\r
@@ -944,6 +977,7 @@ vfrFormDefinition :
                                                                       mCVfrVarDataTypeDB, \r
                                                                       mCVfrDataStorage, \r
                                                                       mCVfrQuestionDB,\r
+                                                                      &mFormsetGuid,\r
                                                                       E->getLine()\r
                                                                     );\r
                                                         }\r
@@ -1298,9 +1332,17 @@ vfrStatementCheckBox :
      CIfrCheckBox       CBObj;\r
      EFI_IFR_TYPE_VALUE Val;\r
      CHAR8              *VarStoreName = NULL;\r
+     UINT32             DataTypeSize;\r
   >>\r
   L:CheckBox                                           << CBObj.SetLineNo(L->getLine()); >>\r
-  vfrQuestionHeader[CBObj] ","\r
+  vfrQuestionHeader[CBObj] ","                         << //check data type\r
+                                                          _PCATCH (mCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "CheckBox varid is not the valid data type");\r
+                                                          if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {\r
+                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid doesn't support array");\r
+                                                          } else if (_GET_CURRQEST_VARSIZE() != sizeof (BOOLEAN)) {\r
+                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid only support BOOLEAN data type");\r
+                                                          }\r
+                                                       >>\r
   {\r
     F:FLAGS "=" vfrCheckBoxFlags[CBObj, F->getLine()] ","\r
                                                        <<\r
@@ -1536,9 +1578,16 @@ vfrSetMinMaxStep[CIfrMinMaxStepData & MMSDObj] :
 vfrStatementNumeric :\r
   <<\r
      CIfrNumeric NObj;\r
+     UINT32 DataTypeSize;\r
   >>\r
   L:Numeric                                            << NObj.SetLineNo(L->getLine()); >>\r
-  vfrQuestionHeader[NObj] ","                          << _PCATCH(NObj.SetFlags (NObj.FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine()); >>\r
+  vfrQuestionHeader[NObj] ","                          << // check data type\r
+                                                          _PCATCH (mCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "Numeric varid is not the valid data type");\r
+                                                          if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {\r
+                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "Numeric varid doesn't support array");\r
+                                                          }\r
+                                                          _PCATCH(NObj.SetFlags (NObj.FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine()); \r
+                                                       >>\r
   { F:FLAGS "=" vfrNumericFlags[NObj, F->getLine()] "," }\r
   {\r
     Key   "=" KN:Number ","                            << AssignQuestionKey (NObj, KN); >>\r
@@ -1569,9 +1618,16 @@ numericFlagsField [UINT8 & HFlags, UINT8 & LFlags] :
 vfrStatementOneOf :\r
   <<\r
      CIfrOneOf OObj;\r
+     UINT32    DataTypeSize;\r
   >>\r
   L:OneOf                                              << OObj.SetLineNo(L->getLine()); >>\r
-  vfrQuestionHeader[OObj] ","                          << _PCATCH(OObj.SetFlags (OObj.FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine()); >>\r
+  vfrQuestionHeader[OObj] ","                          << //check data type\r
+                                                          _PCATCH (mCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "OneOf varid is not the valid data type");\r
+                                                          if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {\r
+                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "OneOf varid doesn't support array");\r
+                                                          }\r
+                                                          _PCATCH(OObj.SetFlags (OObj.FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine());\r
+                                                       >>\r
   { F:FLAGS "=" vfrOneofFlagsField[OObj, F->getLine()] "," }\r
   { \r
     vfrSetMinMaxStep[OObj]\r
@@ -3331,25 +3387,42 @@ EfiVfrParser::_DeclareDefaultFrameworkVarStore (
   )\r
 {\r
   SVfrVarStorageNode    *pNode; \r
+  UINT32                TypeSize;\r
 \r
   pNode = mCVfrDataStorage.GetBufferVarStoreList();\r
-  for (; pNode != NULL; pNode = pNode->mNext) {\r
+  if (pNode == NULL && mCVfrVarDataTypeDB.mFirstNewDataTypeName != NULL) {\r
     //\r
-    // create the default varstore opcode for not exist varstore\r
+    // Create the default Buffer Var Store when no VarStore is defined.\r
     //\r
-    if (!pNode->mAssignedFlag) {\r
-      CIfrVarStore      VSObj;\r
-      VSObj.SetLineNo (LineNo);\r
-      VSObj.SetVarStoreId (pNode->mVarStoreId);\r
-      VSObj.SetSize (pNode->mStorageInfo.mDataType->mTotalSize);\r
-      VSObj.SetName (pNode->mVarStoreName);\r
-      VSObj.SetGuid (&pNode->mGuid);\r
+    mCVfrVarDataTypeDB.GetDataTypeSize (mCVfrVarDataTypeDB.mFirstNewDataTypeName, &TypeSize);\r
+    CIfrVarStore      VSObj;\r
+    VSObj.SetLineNo (LineNo);\r
+    VSObj.SetVarStoreId (0x1); //the first and only one Buffer Var Store\r
+    VSObj.SetSize (TypeSize);\r
+    VSObj.SetName (mCVfrVarDataTypeDB.mFirstNewDataTypeName);\r
+    VSObj.SetGuid (&mFormsetGuid);\r
 #ifdef VFREXP_DEBUG\r
-      printf ("undefined VarStoreName is %s\n", pNode->mVarStoreName);\r
+    printf ("Create the default VarStoreName is %s\n", mCVfrVarDataTypeDB.mFirstNewDataTypeName);\r
 #endif\r
+  } else {\r
+    for (; pNode != NULL; pNode = pNode->mNext) {\r
+      //\r
+      // create the default varstore opcode for not declared varstore\r
+      //\r
+      if (!pNode->mAssignedFlag) {\r
+        CIfrVarStore      VSObj;\r
+        VSObj.SetLineNo (LineNo);\r
+        VSObj.SetVarStoreId (pNode->mVarStoreId);\r
+        VSObj.SetSize (pNode->mStorageInfo.mDataType->mTotalSize);\r
+        VSObj.SetName (pNode->mVarStoreName);\r
+        VSObj.SetGuid (&pNode->mGuid);\r
+#ifdef VFREXP_DEBUG\r
+        printf ("undefined VarStoreName is %s and Id is 0x%x\n", pNode->mVarStoreName, pNode->mVarStoreId);\r
+#endif\r
+      }\r
     }\r
   }\r
-\r
+  \r
   pNode = mCVfrDataStorage.GetEfiVarStoreList();\r
   for (; pNode != NULL; pNode = pNode->mNext) {\r
     //\r
@@ -3362,7 +3435,7 @@ EfiVfrParser::_DeclareDefaultFrameworkVarStore (
       VSEObj.SetGuid (&pNode->mGuid);\r
       VSEObj.SetVarStoreId (pNode->mVarStoreId); \r
 #ifdef VFREXP_DEBUG\r
-      printf ("undefined Efi VarStoreName is %s\n", pNode->mVarStoreName);\r
+      printf ("undefined Efi VarStoreName is %s and Id is 0x%x\n", pNode->mVarStoreName, pNode->mVarStoreId);\r
 #endif\r
     }\r
   }\r
index 29741c8..7388950 100644 (file)
@@ -645,10 +645,32 @@ CVfrVarDataTypeDB::GetFieldOffset (
   if (Field == NULL) {\r
     return VFR_RETURN_FATAL_ERROR;\r
   }\r
+  \r
+  //\r
+  // Framework Vfr file Array Index is from 1.\r
+  // But Uefi Vfr file Array Index is from 0.\r
+  //\r
+  if (VfrCompatibleMode && ArrayIdx != INVALID_ARRAY_INDEX) {\r
+    if (ArrayIdx == 0) {\r
+      return VFR_RETURN_ERROR_ARRARY_NUM;\r
+    }\r
+    ArrayIdx = ArrayIdx - 1;\r
+  }\r
 \r
   if ((ArrayIdx != INVALID_ARRAY_INDEX) && ((Field->mArrayNum == 0) || (Field->mArrayNum <= ArrayIdx))) {\r
     return VFR_RETURN_ERROR_ARRARY_NUM;\r
   }\r
+  \r
+  //\r
+  // Be compatible with the current usage\r
+  // If ArraryIdx is not specified, the first one is used.\r
+  //\r
+  // if ArrayNum is larger than zero, ArraryIdx must be specified.\r
+  //\r
+  // if ((ArrayIdx == INVALID_ARRAY_INDEX) && (Field->mArrayNum > 0)) {\r
+  //   return VFR_RETURN_ERROR_ARRARY_NUM;\r
+  // }\r
+  //\r
 \r
   Offset = Field->mOffset + Field->mFieldType->mTotalSize * ((ArrayIdx == INVALID_ARRAY_INDEX) ? 0 : ArrayIdx);\r
   return VFR_RETURN_SUCCESS;\r
@@ -765,6 +787,7 @@ CVfrVarDataTypeDB::CVfrVarDataTypeDB (
   mCurrDataField = NULL;\r
   mPackAlign     = DEFAULT_PACK_ALIGN;\r
   mPackStack     = NULL;\r
+  mFirstNewDataTypeName = NULL;\r
 \r
   InternalTypesListInit ();\r
 }\r
@@ -808,7 +831,7 @@ CVfrVarDataTypeDB::Pack (
   )\r
 {\r
   UINT32            PackAlign;\r
-  CHAR8             Msg[64] = {0, };\r
+  CHAR8             Msg[MAX_STRING_LEN] = {0, };\r
 \r
   if (Action & VFR_PACK_SHOW) {\r
     sprintf (Msg, "value of pragma pack(show) == %d", mPackAlign);\r
@@ -964,6 +987,10 @@ CVfrVarDataTypeDB::DeclareDataTypeEnd (
   }\r
 \r
   RegisterNewType (mNewDataType);\r
+  if (mFirstNewDataTypeName == NULL) {\r
+    mFirstNewDataTypeName = mNewDataType->mTypeName;\r
+  }\r
+\r
   mNewDataType             = NULL;\r
 }\r
 \r
@@ -971,7 +998,6 @@ EFI_VFR_RETURN_CODE
 CVfrVarDataTypeDB::GetDataType (\r
   IN  CHAR8         *TypeName,\r
   OUT SVfrDataType **DataType\r
-\r
   )\r
 {\r
   SVfrDataType *pDataType = NULL;\r
@@ -996,6 +1022,38 @@ CVfrVarDataTypeDB::GetDataType (
   return VFR_RETURN_UNDEFINED;\r
 }\r
 \r
+EFI_VFR_RETURN_CODE\r
+CVfrVarDataTypeDB::GetDataTypeSize (\r
+  IN  UINT8   DataType,\r
+  OUT UINT32 *Size\r
+  )\r
+{\r
+  SVfrDataType *pDataType = NULL;\r
+\r
+  if (Size == NULL) {\r
+    return VFR_RETURN_FATAL_ERROR;\r
+  }\r
+\r
+  *Size    = 0;\r
+  DataType = DataType & 0x0F;\r
+\r
+  //\r
+  // For user defined data type, the size can't be got by this function.\r
+  //\r
+  if (DataType == EFI_IFR_TYPE_OTHER) {\r
+    return VFR_RETURN_SUCCESS;\r
+  }\r
+\r
+  for (pDataType = mDataTypeList; pDataType != NULL; pDataType = pDataType->mNext) {\r
+    if (DataType == pDataType->mType) {\r
+      *Size = pDataType->mTotalSize;\r
+      return VFR_RETURN_SUCCESS;\r
+    }\r
+  }\r
+\r
+  return VFR_RETURN_UNDEFINED;\r
+}\r
+\r
 EFI_VFR_RETURN_CODE\r
 CVfrVarDataTypeDB::GetDataTypeSize (\r
   IN  CHAR8   *TypeName,\r
@@ -1274,12 +1332,23 @@ CVfrDataStorage::~CVfrDataStorage (
 \r
 EFI_VARSTORE_ID\r
 CVfrDataStorage::GetFreeVarStoreId (\r
-  VOID\r
+  EFI_VFR_VARSTORE_TYPE VarType\r
   )\r
 {\r
   UINT32  Index, Mask, Offset;\r
+  \r
+  //\r
+  // Assign the different ID range for the different type VarStore to support Framework Vfr\r
+  //\r
+  if ((!VfrCompatibleMode) || (VarType == EFI_VFR_VARSTORE_BUFFER)) {\r
+    Index = 0;\r
+  } else if (VarType == EFI_VFR_VARSTORE_EFI) {\r
+    Index = 1;\r
+  } else if (VarType == EFI_VFR_VARSTORE_NAME) {\r
+    Index = 2;\r
+  }\r
 \r
-  for (Index = 0; Index < EFI_FREE_VARSTORE_ID_BITMAP_SIZE; Index++) {\r
+  for (; Index < EFI_FREE_VARSTORE_ID_BITMAP_SIZE; Index++) {\r
     if (mFreeVarStoreIdBitMap[Index] != 0xFFFFFFFF) {\r
       break;\r
     }\r
@@ -1346,7 +1415,7 @@ CVfrDataStorage::DeclareNameVarStoreBegin (
     }\r
   }\r
 \r
-  VarStoreId = GetFreeVarStoreId ();\r
+  VarStoreId = GetFreeVarStoreId (EFI_VFR_VARSTORE_NAME);\r
   if ((pNode = new SVfrVarStorageNode (StoreName, VarStoreId)) == NULL) {\r
     return VFR_RETURN_UNDEFINED;\r
   }\r
@@ -1421,7 +1490,7 @@ CVfrDataStorage::DeclareEfiVarStore (
     }\r
   }\r
 \r
-  VarStoreId = GetFreeVarStoreId ();\r
+  VarStoreId = GetFreeVarStoreId (EFI_VFR_VARSTORE_EFI);\r
   if ((pNode = new SVfrVarStorageNode (Guid, StoreName, VarStoreId, NameStrId, VarSize, Flag)) == NULL) {\r
     return VFR_RETURN_OUT_FOR_RESOURCES;\r
   }\r
@@ -1452,7 +1521,7 @@ CVfrDataStorage::DeclareBufferVarStore (
   CHECK_ERROR_RETURN(DataTypeDB->GetDataType (TypeName, &pDataType), VFR_RETURN_SUCCESS);\r
 \r
   if (VarStoreId == EFI_VARSTORE_ID_INVALID) {\r
-    VarStoreId = GetFreeVarStoreId ();\r
+    VarStoreId = GetFreeVarStoreId (EFI_VFR_VARSTORE_BUFFER);\r
   } else {\r
     if (ChekVarStoreIdFree (VarStoreId) == FALSE) {\r
       return VFR_RETURN_VARSTOREID_REDEFINED;\r
@@ -1663,6 +1732,16 @@ CVfrDataStorage::GetNameVarStoreInfo (
   if (mCurrVarStorageNode == NULL) {\r
     return VFR_RETURN_GET_NVVARSTORE_ERROR;\r
   }\r
+  \r
+  //\r
+  // Framework Vfr file Index is from 1, but Uefi Vfr file Index is from 0.\r
+  //\r
+  if (VfrCompatibleMode) {\r
+    if (Index == 0) {\r
+      return VFR_RETURN_ERROR_ARRARY_NUM;\r
+    }\r
+    Index --;\r
+  }\r
 \r
   Info->mInfo.mVarName = mCurrVarStorageNode->mStorageInfo.mNameSpace.mNameTable[Index];\r
 \r
@@ -2293,7 +2372,7 @@ CVfrQuestionDB::RegisterQuestion (
     //\r
     // For Framework Vfr, don't check question ID conflict.\r
     //\r
-    if (!mCompatibleMode && ChekQuestionIdFree (QuestionId) == FALSE) {\r
+    if (!VfrCompatibleMode && ChekQuestionIdFree (QuestionId) == FALSE) {\r
       delete pNode;\r
       return VFR_RETURN_QUESTIONID_REDEFINED;\r
     }\r
@@ -2609,7 +2688,7 @@ CVfrQuestionDB::UpdateQuestionId (
   //\r
   // For Framework Vfr, don't check question ID conflict.\r
   //  \r
-  if (!mCompatibleMode && ChekQuestionIdFree (NewQId) == FALSE) {\r
+  if (!VfrCompatibleMode && ChekQuestionIdFree (NewQId) == FALSE) {\r
     return VFR_RETURN_REDEFINED;\r
   }\r
 \r
@@ -2710,3 +2789,4 @@ CVfrQuestionDB::FindQuestion (
   return VFR_RETURN_UNDEFINED;\r
 }\r
 \r
+BOOLEAN  VfrCompatibleMode = FALSE;\r
index 21ac0fb..d169e2d 100644 (file)
@@ -21,7 +21,10 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include "EfiVfr.h"\r
 #include "VfrError.h"\r
 \r
+extern BOOLEAN  VfrCompatibleMode;\r
+\r
 #define MAX_NAME_LEN                       64\r
+#define MAX_STRING_LEN                     0x100\r
 #define DEFAULT_ALIGN                      1\r
 #define DEFAULT_PACK_ALIGN                 0x8\r
 #define DEFAULT_NAME_TABLE_ITEMS           1024\r
@@ -188,13 +191,17 @@ public:
 \r
   EFI_VFR_RETURN_CODE GetDataType (IN CHAR8 *, OUT SVfrDataType **);\r
   EFI_VFR_RETURN_CODE GetDataTypeSize (IN CHAR8 *, OUT UINT32 *);\r
+  EFI_VFR_RETURN_CODE GetDataTypeSize (IN UINT8, OUT UINT32 *);\r
   EFI_VFR_RETURN_CODE GetDataFieldInfo (IN CHAR8 *, OUT UINT16 &, OUT UINT8 &, OUT UINT32 &);\r
 \r
   EFI_VFR_RETURN_CODE GetUserDefinedTypeNameList (OUT CHAR8 ***, OUT UINT32 *);\r
   EFI_VFR_RETURN_CODE ExtractFieldNameAndArrary (IN CHAR8 *&, OUT CHAR8 *, OUT UINT32 &);\r
 \r
   BOOLEAN             IsTypeNameDefined (IN CHAR8 *);\r
-\r
+  //\r
+  // First the declared \r
+  //\r
+  CHAR8               *mFirstNewDataTypeName;\r
 #ifdef CVFR_VARDATATYPEDB_DEBUG\r
   VOID ParserDB ();\r
 #endif\r
@@ -269,7 +276,7 @@ private:
 \r
 private:\r
 \r
-  EFI_VARSTORE_ID GetFreeVarStoreId (VOID);\r
+  EFI_VARSTORE_ID GetFreeVarStoreId (EFI_VFR_VARSTORE_TYPE VarType = EFI_VFR_VARSTORE_BUFFER);\r
   BOOLEAN         ChekVarStoreIdFree (IN EFI_VARSTORE_ID);\r
   VOID            MarkVarStoreIdUsed (IN EFI_VARSTORE_ID);\r
   VOID            MarkVarStoreIdUnused (IN EFI_VARSTORE_ID);\r
@@ -329,7 +336,6 @@ class CVfrQuestionDB {
 private:\r
   SVfrQuestionNode          *mQuestionList;\r
   UINT32                    mFreeQIdBitMap[EFI_FREE_QUESTION_ID_BITMAP_SIZE];\r
-  BOOLEAN                   mCompatibleMode;\r
 \r
 private:\r
   EFI_QUESTION_ID GetFreeQuestionId (VOID);\r
@@ -354,7 +360,7 @@ public:
   VOID                ResetInit (IN VOID); \r
 \r
   VOID SetCompatibleMode (IN BOOLEAN Mode) {\r
-    mCompatibleMode = Mode;\r
+    VfrCompatibleMode = Mode;\r
   }\r
 };\r
 \r