]> git.proxmox.com Git - mirror_edk2.git/commitdiff
BaseTools/VfrCompile: Add two new option for VfrCompile
authorDandan Bi <dandan.bi@intel.com>
Mon, 1 Aug 2016 11:18:31 +0000 (19:18 +0800)
committerYonghong Zhu <yonghong.zhu@intel.com>
Mon, 8 Aug 2016 03:07:24 +0000 (11:07 +0800)
1.--autodefault option
   VfrCompile will generate default opcodes for questions if some
   default are missing.
2 --checkdefault option
   VfrCompile will check whether every question has no default or
   has all default. If not, will generate an error to let user know
   the question misses default.

Cc: Liming Gao <liming.gao@intel.com>
Cc: Eric Dong <eric.dong@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Dandan Bi <dandan.bi@intel.com>
Reviewed-by: Eric Dong <eric.dong@intel.com>
Reviewed-by: Yonghong Zhu <yonghong.zhu@intel.com>
BaseTools/Source/C/VfrCompile/VfrCompiler.cpp
BaseTools/Source/C/VfrCompile/VfrCompiler.h
BaseTools/Source/C/VfrCompile/VfrFormPkg.cpp
BaseTools/Source/C/VfrCompile/VfrFormPkg.h
BaseTools/Source/C/VfrCompile/VfrSyntax.g
BaseTools/Source/C/VfrCompile/VfrUtilityLib.cpp
BaseTools/Source/C/VfrCompile/VfrUtilityLib.h

index 695ce6cc484c846aaf5261df9d0566d72b97d291..59f4bf3a8e557733eea84ebdaeb466b2a249d8bd 100644 (file)
@@ -83,6 +83,8 @@ CVfrCompiler::OptionInitialization (
   mOptions.CompatibleMode                = FALSE;\r
   mOptions.HasOverrideClassGuid          = FALSE;\r
   mOptions.WarningAsError                = FALSE;\r
+  mOptions.AutoDefault                   = FALSE;\r
+  mOptions.CheckDefault                  = FALSE;\r
   memset (&mOptions.OverrideClassGuid, 0, sizeof (EFI_GUID));\r
   \r
   if (Argc == 1) {\r
@@ -160,6 +162,10 @@ CVfrCompiler::OptionInitialization (
       mOptions.HasOverrideClassGuid = TRUE;\r
     } else if (stricmp(Argv[Index], "-w") == 0 || stricmp(Argv[Index], "--warning-as-error") == 0) {\r
       mOptions.WarningAsError = TRUE;\r
+    } else if (stricmp(Argv[Index], "-a") == 0 ||stricmp(Argv[Index], "--autodefault") == 0) {\r
+      mOptions.AutoDefault = TRUE;\r
+    } else if (stricmp(Argv[Index], "-d") == 0 ||stricmp(Argv[Index], "--checkdefault") == 0) {\r
+      mOptions.CheckDefault = TRUE;\r
     } else {\r
       DebugError (NULL, 0, 1000, "Unknown option", "unrecognized option %s", Argv[Index]);\r
       goto Fail;\r
@@ -437,6 +443,8 @@ CVfrCompiler::Usage (
     "                 format is xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",\r
     "  -w  --warning-as-error",\r
     "                 treat warning as an error",\r
+    "  -a  --autodefaut    generate default value for question opcode if some default is missing",\r
+    "  -d  --checkdefault  check the default information in a question opcode",\r
     NULL\r
     };\r
   for (Index = 0; Help[Index] != NULL; Index++) {\r
@@ -582,53 +590,29 @@ Fail:
 }\r
 \r
 VOID\r
-CVfrCompiler::UpdateInfoForDynamicOpcode (\r
+CVfrCompiler::AdjustBin (\r
   VOID\r
   )\r
 {\r
-  SIfrRecord          *pRecord;\r
+  EFI_VFR_RETURN_CODE Status;\r
 \r
-  if (!gNeedAdjustOpcode) {\r
+  if (!IS_RUN_STATUS(STATUS_COMPILEED)) {\r
     return;\r
   }\r
-  \r
-  //\r
-  // Base on the original offset info to update the record list.\r
-  //\r
-  if (!gCIfrRecordInfoDB.IfrAdjustDynamicOpcodeInRecords()) {\r
-    DebugError (NULL, 0, 1001, "Error parsing vfr file", "Can find the offset in the record.");\r
-  }\r
 \r
-  //\r
-  // Base on the opcode binary length to recalculate the offset for each opcode.\r
-  //\r
-  gCIfrRecordInfoDB.IfrAdjustOffsetForRecord();\r
+  if (gNeedAdjustOpcode) {\r
+    //\r
+    // When parsing the Vfr, has created some opcodes, now need to update the record info.\r
+    //\r
+    gCIfrRecordInfoDB.IfrUpdateRecordInfoForDynamicOpcode (FALSE);\r
+  }\r
 \r
   //\r
-  // Base on the offset to find the binary address.\r
+  // Check whether need to check default info for question or auto add default for question.\r
   //\r
-  pRecord = gCIfrRecordInfoDB.GetRecordInfoFromOffset(gAdjustOpcodeOffset);\r
-  while (pRecord != NULL) {\r
-    pRecord->mIfrBinBuf = gCFormPkg.GetBufAddrBaseOnOffset(pRecord->mOffset);\r
-    if (pRecord->mIfrBinBuf == NULL) {\r
-      DebugError (NULL, 0, 0001, "Error parsing vfr file", " 0x%X. offset not allocated.", pRecord->mOffset);\r
-    }\r
-    pRecord = pRecord->mNext;\r
+  if (mOptions.AutoDefault || mOptions.CheckDefault) {\r
+    gCIfrRecordInfoDB.IfrCheckAddDefaultRecord (mOptions.AutoDefault, mOptions.CheckDefault);\r
   }\r
-}\r
-\r
-VOID\r
-CVfrCompiler::AdjustBin (\r
-  VOID\r
-  )\r
-{\r
-  EFI_VFR_RETURN_CODE Status;\r
-\r
-  if (!IS_RUN_STATUS(STATUS_COMPILEED)) {\r
-    return;\r
-  }\r
-\r
-  UpdateInfoForDynamicOpcode ();\r
 \r
   //\r
   // Check Binary Code consistent between Form and IfrRecord\r
index f2d9814e68ae9a77295f3271b6129e1c194d52d8..7dd9dd0ecd5a586613c6e6fbf0b6bff4cef33985 100644 (file)
@@ -57,6 +57,8 @@ typedef struct {
   BOOLEAN HasOverrideClassGuid;\r
   EFI_GUID OverrideClassGuid;\r
   BOOLEAN WarningAsError;\r
+  BOOLEAN AutoDefault;\r
+  BOOLEAN CheckDefault;\r
 } OPTIONS;\r
 \r
 typedef enum {\r
@@ -88,7 +90,6 @@ private:
 \r
   VOID    SET_RUN_STATUS (IN COMPILER_RUN_STATUS);\r
   BOOLEAN IS_RUN_STATUS (IN COMPILER_RUN_STATUS);\r
-  VOID    UpdateInfoForDynamicOpcode (VOID);\r
 \r
 public:\r
   COMPILER_RUN_STATUS RunStatus (VOID) {\r
index 892b7b8fc7374794dedf3f34a2a9651ca9168f9a..db1e4bdd1e2e8c43331178dd0356cbb9c7a11ec9 100644 (file)
@@ -652,11 +652,12 @@ CFormPkg::GetBufAddrBaseOnOffset (
 \r
 EFI_VFR_RETURN_CODE\r
 CFormPkg::AdjustDynamicInsertOpcode (\r
-  IN CHAR8              *LastFormEndAddr,\r
-  IN CHAR8              *InsertOpcodeAddr\r
+  IN CHAR8              *InserPositionAddr,\r
+  IN CHAR8              *InsertOpcodeAddr,\r
+  IN BOOLEAN            CreateOpcodeAfterParsingVfr\r
   )\r
 {\r
-  SBufferNode *LastFormEndNode;\r
+  SBufferNode *InserPositionNode;\r
   SBufferNode *InsertOpcodeNode;\r
   SBufferNode *NewRestoreNodeBegin;\r
   SBufferNode *NewRestoreNodeEnd;\r
@@ -666,53 +667,53 @@ CFormPkg::AdjustDynamicInsertOpcode (
 \r
   NewRestoreNodeEnd = NULL;\r
 \r
-  LastFormEndNode  = GetBinBufferNodeForAddr(LastFormEndAddr);\r
+  InserPositionNode  = GetBinBufferNodeForAddr(InserPositionAddr);\r
   InsertOpcodeNode = GetBinBufferNodeForAddr(InsertOpcodeAddr);\r
 \r
-  if (LastFormEndNode == InsertOpcodeNode) {\r
+  if (InserPositionNode == InsertOpcodeNode) {\r
     //\r
     // Create New Node to save the restore opcode.\r
     //\r
-    NeedRestoreCodeLen = InsertOpcodeAddr - LastFormEndAddr;\r
+    NeedRestoreCodeLen = InsertOpcodeAddr - InserPositionAddr;\r
     gAdjustOpcodeLen   = NeedRestoreCodeLen;\r
     NewRestoreNodeBegin = CreateNewNode ();\r
     if (NewRestoreNodeBegin == NULL) {\r
       return VFR_RETURN_OUT_FOR_RESOURCES;\r
     }\r
-    memcpy (NewRestoreNodeBegin->mBufferFree, LastFormEndAddr, NeedRestoreCodeLen);\r
+    memcpy (NewRestoreNodeBegin->mBufferFree, InserPositionAddr, NeedRestoreCodeLen);\r
     NewRestoreNodeBegin->mBufferFree += NeedRestoreCodeLen;\r
 \r
     //\r
     // Override the restore buffer data.\r
     //\r
-    memmove (LastFormEndAddr, InsertOpcodeAddr, InsertOpcodeNode->mBufferFree - InsertOpcodeAddr);\r
+    memmove (InserPositionAddr, InsertOpcodeAddr, InsertOpcodeNode->mBufferFree - InsertOpcodeAddr);\r
     InsertOpcodeNode->mBufferFree -= NeedRestoreCodeLen;\r
     memset (InsertOpcodeNode->mBufferFree, 0, NeedRestoreCodeLen);\r
   } else {\r
     //\r
     // Create New Node to save the restore opcode.\r
     //\r
-    NeedRestoreCodeLen = LastFormEndNode->mBufferFree - LastFormEndAddr;\r
+    NeedRestoreCodeLen = InserPositionNode->mBufferFree - InserPositionAddr;\r
     gAdjustOpcodeLen   = NeedRestoreCodeLen;\r
     NewRestoreNodeBegin = CreateNewNode ();\r
     if (NewRestoreNodeBegin == NULL) {\r
       return VFR_RETURN_OUT_FOR_RESOURCES;\r
     }\r
-    memcpy (NewRestoreNodeBegin->mBufferFree, LastFormEndAddr, NeedRestoreCodeLen);\r
+    memcpy (NewRestoreNodeBegin->mBufferFree, InserPositionAddr, NeedRestoreCodeLen);\r
     NewRestoreNodeBegin->mBufferFree += NeedRestoreCodeLen;\r
     //\r
     // Override the restore buffer data.\r
     //\r
-    LastFormEndNode->mBufferFree -= NeedRestoreCodeLen;\r
+    InserPositionNode->mBufferFree -= NeedRestoreCodeLen;\r
     //\r
     // Link the restore data to new node.\r
     //\r
-    NewRestoreNodeBegin->mNext = LastFormEndNode->mNext;\r
+    NewRestoreNodeBegin->mNext = InserPositionNode->mNext;\r
 \r
     //\r
     // Count the Adjust opcode len.\r
     //\r
-    TmpNode = LastFormEndNode->mNext;\r
+    TmpNode = InserPositionNode->mNext;\r
     while (TmpNode != InsertOpcodeNode) {\r
       gAdjustOpcodeLen += TmpNode->mBufferFree - TmpNode->mBufferStart;\r
       TmpNode = TmpNode->mNext;\r
@@ -740,50 +741,64 @@ CFormPkg::AdjustDynamicInsertOpcode (
       // Insert the last restore data node.\r
       //\r
       TmpNode = GetNodeBefore (InsertOpcodeNode);\r
-      if (TmpNode == LastFormEndNode) {\r
+      if (TmpNode == InserPositionNode) {\r
         NewRestoreNodeBegin->mNext = NewRestoreNodeEnd;\r
       } else {\r
         TmpNode->mNext = NewRestoreNodeEnd;\r
       }\r
       //\r
-      // Connect the dynamic opcode node to the node before last form end node.\r
+      // Connect the dynamic opcode node to the node after InserPositionNode.\r
       //\r
-      LastFormEndNode->mNext = InsertOpcodeNode;\r
+      InserPositionNode->mNext = InsertOpcodeNode;\r
     }\r
   }\r
 \r
-  if (mBufferNodeQueueTail->mBufferFree - mBufferNodeQueueTail->mBufferStart > 2) {\r
+  if (CreateOpcodeAfterParsingVfr) {\r
     //\r
-    // End form set opcode all in the mBufferNodeQueueTail node.\r
+    // Th new opcodes were created after Parsing Vfr file,\r
+    // so the content in mBufferNodeQueueTail must be the new created opcodes.\r
+    // So connet the  NewRestoreNodeBegin to the tail and update the tail node.\r
     //\r
-    NewLastEndNode = CreateNewNode ();\r
-    if (NewLastEndNode == NULL) {\r
-      return VFR_RETURN_OUT_FOR_RESOURCES;\r
-    }\r
-    NewLastEndNode->mBufferStart[0] = 0x29;\r
-    NewLastEndNode->mBufferStart[1] = 0x02;\r
-    NewLastEndNode->mBufferFree += 2;\r
-\r
-    mBufferNodeQueueTail->mBufferFree -= 2;\r
-\r
     mBufferNodeQueueTail->mNext = NewRestoreNodeBegin;\r
     if (NewRestoreNodeEnd != NULL) {\r
-      NewRestoreNodeEnd->mNext = NewLastEndNode;\r
+      mBufferNodeQueueTail = NewRestoreNodeEnd;\r
     } else {\r
-      NewRestoreNodeBegin->mNext = NewLastEndNode;\r
+      mBufferNodeQueueTail = NewRestoreNodeBegin;\r
     }\r
+  } else {\r
+    if (mBufferNodeQueueTail->mBufferFree - mBufferNodeQueueTail->mBufferStart > 2) {\r
+      //\r
+      // End form set opcode all in the mBufferNodeQueueTail node.\r
+      //\r
+      NewLastEndNode = CreateNewNode ();\r
+      if (NewLastEndNode == NULL) {\r
+        return VFR_RETURN_OUT_FOR_RESOURCES;\r
+      }\r
+      NewLastEndNode->mBufferStart[0] = 0x29;\r
+      NewLastEndNode->mBufferStart[1] = 0x02;\r
+      NewLastEndNode->mBufferFree += 2;\r
 \r
-    mBufferNodeQueueTail = NewLastEndNode;\r
-  } else if (mBufferNodeQueueTail->mBufferFree - mBufferNodeQueueTail->mBufferStart == 2) {\r
-    TmpNode = GetNodeBefore(mBufferNodeQueueTail);\r
-    TmpNode->mNext = NewRestoreNodeBegin;\r
-    if (NewRestoreNodeEnd != NULL) {\r
-      NewRestoreNodeEnd->mNext = mBufferNodeQueueTail;\r
-    } else {\r
-      NewRestoreNodeBegin->mNext = mBufferNodeQueueTail;\r
+      mBufferNodeQueueTail->mBufferFree -= 2;\r
+\r
+      mBufferNodeQueueTail->mNext = NewRestoreNodeBegin;\r
+      if (NewRestoreNodeEnd != NULL) {\r
+        NewRestoreNodeEnd->mNext = NewLastEndNode;\r
+      } else {\r
+        NewRestoreNodeBegin->mNext = NewLastEndNode;\r
+      }\r
+\r
+      mBufferNodeQueueTail = NewLastEndNode;\r
+    } else if (mBufferNodeQueueTail->mBufferFree - mBufferNodeQueueTail->mBufferStart == 2) {\r
+      TmpNode = GetNodeBefore(mBufferNodeQueueTail);\r
+      TmpNode->mNext = NewRestoreNodeBegin;\r
+      if (NewRestoreNodeEnd != NULL) {\r
+        NewRestoreNodeEnd->mNext = mBufferNodeQueueTail;\r
+      } else {\r
+        NewRestoreNodeBegin->mNext = mBufferNodeQueueTail;\r
+      }\r
     }\r
   }\r
-\r
+  mCurrBufferNode = mBufferNodeQueueTail;\r
   return VFR_RETURN_SUCCESS;\r
 }\r
 \r
@@ -983,6 +998,10 @@ CIfrRecordInfoDB::CIfrRecordInfoDB (
   mRecordCount       = EFI_IFR_RECORDINFO_IDX_START;\r
   mIfrRecordListHead = NULL;\r
   mIfrRecordListTail = NULL;\r
+  mAllDefaultTypeCount = 0;\r
+  for (UINT8 i = 0; i < EFI_HII_MAX_SUPPORT_DEFAULT_TYPE; i++) {\r
+    mAllDefaultIdArray[i] = 0xffff;\r
+  }\r
 }\r
 \r
 CIfrRecordInfoDB::~CIfrRecordInfoDB (\r
@@ -1233,63 +1252,131 @@ CIfrRecordInfoDB::GetRecordInfoFromOffset (
   return pNode;\r
 }\r
 \r
-/*\r
+/**\r
   Add just the op code position.\r
 \r
+  Case1 (CreateOpcodeAfterParsingVfr == FALSE): The dynamic opcodes were created before the formset opcode,\r
+  so pDynamicOpcodeNodes is before mIfrRecordListTail.\r
+\r
   From\r
-  \r
-  | form end opcode + end of if opcode for form ... + Dynamic opcode + form set end opcode |\r
-  \r
+\r
+  |mIfrRecordListHead + ...+ pAdjustNode + pDynamicOpcodeNodes + mIfrRecordListTail|\r
+\r
   To\r
-  \r
-  | Dynamic opcode + form end opcode + end of if opcode for form ... + form set end opcode |\r
 \r
-*/\r
+  |mIfrRecordListHead + ...+ pDynamicOpcodeNodes + pAdjustNode + mIfrRecordListTail|\r
+\r
+  Case2 (CreateOpcodeAfterParsingVfr == TRUE): The dynamic opcodes were created after paring the vfr file,\r
+  so new records are appennded to the end of OriginalIfrRecordListTail.\r
+\r
+  From\r
+\r
+  |mIfrRecordListHead + ...+ pAdjustNode +  ... + OriginalIfrRecordListTail + pDynamicOpcodeNodes|\r
+\r
+  To\r
+\r
+  |mIfrRecordListHead + ...+ pDynamicOpcodeNodes + pAdjustNode +  ... + OriginalIfrRecordListTail|\r
+\r
+\r
+  @param CreateOpcodeAfterParsingVfr     Whether create the dynamic opcode after parsing the VFR file.\r
+\r
+**/\r
 BOOLEAN\r
 CIfrRecordInfoDB::IfrAdjustDynamicOpcodeInRecords (\r
-  VOID\r
+  IN BOOLEAN  CreateOpcodeAfterParsingVfr\r
   )\r
 {\r
   UINT32             OpcodeOffset;\r
   SIfrRecord         *pNode, *pPreNode;\r
-  SIfrRecord         *pStartNode, *pNodeBeforeStart;\r
-  SIfrRecord         *pEndNode;\r
-  \r
-  pStartNode = NULL;\r
-  pEndNode   = NULL;\r
-  OpcodeOffset = 0;\r
+  SIfrRecord         *pAdjustNode, *pNodeBeforeAdjust;\r
+  SIfrRecord         *pNodeBeforeDynamic;\r
+\r
+  pAdjustNode         = NULL;\r
+  pNodeBeforeDynamic  = NULL;\r
+  OpcodeOffset        = 0;\r
 \r
   //\r
-  // Base on the offset info to get the node.\r
+  // Base on the gAdjustOpcodeOffset and gAdjustOpcodeLen to find the pAdjustNod, the node before pAdjustNode,\r
+  // and the node before pDynamicOpcodeNode.\r
   //\r
-  for (pNode = mIfrRecordListHead; pNode->mNext != NULL; pPreNode = pNode,pNode = pNode->mNext) {\r
+  for (pNode = mIfrRecordListHead; pNode!= NULL; pNode = pNode->mNext) {\r
     if (OpcodeOffset == gAdjustOpcodeOffset) {\r
-      pStartNode       = pNode;\r
-      pNodeBeforeStart = pPreNode;\r
+      pAdjustNode       = pNode;\r
+      pNodeBeforeAdjust = pPreNode;\r
     } else if (OpcodeOffset == gAdjustOpcodeOffset + gAdjustOpcodeLen) {\r
-      pEndNode = pPreNode;\r
+      pNodeBeforeDynamic = pPreNode;\r
+    }\r
+    if (pNode->mNext != NULL) {\r
+      pPreNode = pNode;\r
     }\r
-\r
     OpcodeOffset += pNode->mBinBufLen;\r
   }\r
 \r
   //\r
-  // Check the value.\r
+  // Check the nodes whether exist.\r
   //\r
-  if (pEndNode == NULL || pStartNode == NULL) {\r
+  if (pNodeBeforeDynamic == NULL || pAdjustNode == NULL) {\r
     return FALSE;\r
   }\r
 \r
   //\r
   // Adjust the node. pPreNode save the Node before mIfrRecordListTail\r
   //\r
-  pNodeBeforeStart->mNext = pEndNode->mNext;\r
-  pPreNode->mNext = pStartNode;\r
-  pEndNode->mNext = mIfrRecordListTail;\r
+  pNodeBeforeAdjust->mNext = pNodeBeforeDynamic->mNext;\r
+  if (CreateOpcodeAfterParsingVfr) {\r
+    //\r
+    // mIfrRecordListTail is the end of pDynamicNode (Case2).\r
+    //\r
+    mIfrRecordListTail->mNext = pAdjustNode;\r
+    mIfrRecordListTail = pNodeBeforeDynamic;\r
+    mIfrRecordListTail->mNext = NULL;\r
+  } else {\r
+    //\r
+    //pPreNode is the end of pDynamicNode(Case1).\r
+    //\r
+    pPreNode->mNext = pAdjustNode;\r
+    pNodeBeforeDynamic->mNext = mIfrRecordListTail;\r
+  }\r
 \r
   return TRUE;\r
 }\r
 \r
+/**\r
+  Update the record info(the position in the record list, offset and mIfrBinBuf) for new created record.\r
+\r
+  @param CreateOpcodeAfterParsingVfr     Whether create the dynamic opcode after parsing the VFR file.\r
+\r
+**/\r
+VOID\r
+CIfrRecordInfoDB::IfrUpdateRecordInfoForDynamicOpcode (\r
+  IN BOOLEAN  CreateOpcodeAfterParsingVfr\r
+  )\r
+{\r
+  SIfrRecord          *pRecord;\r
+\r
+  //\r
+  // Base on the original offset info to update the record list.\r
+  //\r
+  if (!IfrAdjustDynamicOpcodeInRecords(CreateOpcodeAfterParsingVfr)) {\r
+    gCVfrErrorHandle.PrintMsg (0, "Error", "Can not find the adjust offset in the record.");\r
+  }\r
+\r
+  //\r
+  // Base on the opcode binary length to recalculate the offset for each opcode.\r
+  //\r
+  IfrAdjustOffsetForRecord();\r
+\r
+  //\r
+  // Base on the offset to find the binary address.\r
+  //\r
+  pRecord = GetRecordInfoFromOffset(gAdjustOpcodeOffset);\r
+  while (pRecord != NULL) {\r
+    pRecord->mIfrBinBuf = gCFormPkg.GetBufAddrBaseOnOffset(pRecord->mOffset);\r
+    pRecord = pRecord->mNext;\r
+  }\r
+}\r
+\r
+\r
 VOID\r
 CIfrRecordInfoDB::IfrAdjustOffsetForRecord (\r
   VOID\r
@@ -1522,6 +1609,579 @@ CIfrRecordInfoDB::IfrRecordAdjust (
   return Status;\r
 }\r
 \r
+/**\r
+  When the Varstore of the question is EFI_VFR_VARSTORE_BUFFER and the default value is not\r
+  given by expression, should save the default info for the Buffer VarStore.\r
+\r
+  @param  DefaultId           The default id.\r
+  @param  pQuestionNode       Point to the question opcode node.\r
+  @param  Value               The default value.\r
+**/\r
+VOID\r
+CIfrRecordInfoDB::IfrAddDefaultToBufferConfig (\r
+  IN  UINT16                  DefaultId,\r
+  IN  SIfrRecord              *pQuestionNode,\r
+  IN  EFI_IFR_TYPE_VALUE      Value\r
+  )\r
+{\r
+  CHAR8                   *VarStoreName = NULL;\r
+  EFI_VFR_VARSTORE_TYPE    VarStoreType  = EFI_VFR_VARSTORE_INVALID;\r
+  EFI_GUID                 *VarGuid      = NULL;\r
+  EFI_VARSTORE_INFO        VarInfo;\r
+  EFI_IFR_QUESTION_HEADER  *QuestionHead;\r
+  EFI_IFR_OP_HEADER        *pQuestionOpHead;\r
+\r
+  pQuestionOpHead = (EFI_IFR_OP_HEADER *) pQuestionNode->mIfrBinBuf;\r
+  QuestionHead    = (EFI_IFR_QUESTION_HEADER *) (pQuestionOpHead + 1);\r
+\r
+  //\r
+  // Get the Var Store name and type.\r
+  //\r
+  gCVfrDataStorage.GetVarStoreName (QuestionHead->VarStoreId, &VarStoreName);\r
+  VarGuid= gCVfrDataStorage.GetVarStoreGuid (QuestionHead->VarStoreId);\r
+  VarStoreType = gCVfrDataStorage.GetVarStoreType (QuestionHead->VarStoreId);\r
+\r
+  //\r
+  // Only for Buffer storage need to save the default info in the storage.\r
+  // Other type storage, just return.\r
+  //\r
+  if (VarStoreType != EFI_VFR_VARSTORE_BUFFER) {\r
+    return;\r
+  } else {\r
+    VarInfo.mInfo.mVarOffset = QuestionHead->VarStoreInfo.VarOffset;\r
+    VarInfo.mVarStoreId = QuestionHead->VarStoreId;\r
+  }\r
+\r
+  //\r
+  // Get the buffer storage info about this question.\r
+  //\r
+  gCVfrDataStorage.GetBufferVarStoreFieldInfo (&VarInfo);\r
+\r
+  //\r
+  // Add action.\r
+  //\r
+  gCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
+    DefaultId,\r
+    VarInfo,\r
+    VarStoreName,\r
+    VarGuid,\r
+    VarInfo.mVarType,\r
+    Value\r
+    );\r
+}\r
+\r
+/**\r
+  Record the number and default id of all defaultstore opcode.\r
+\r
+**/\r
+VOID\r
+CIfrRecordInfoDB::IfrGetDefaultStoreInfo (\r
+  VOID\r
+  )\r
+{\r
+  SIfrRecord             *pNode;\r
+  EFI_IFR_OP_HEADER      *pOpHead;\r
+  EFI_IFR_DEFAULTSTORE   *DefaultStore;\r
+\r
+  pNode                = mIfrRecordListHead;\r
+  mAllDefaultTypeCount = 0;\r
+\r
+  while (pNode != NULL) {\r
+    pOpHead = (EFI_IFR_OP_HEADER *) pNode->mIfrBinBuf;\r
+\r
+    if (pOpHead->OpCode == EFI_IFR_DEFAULTSTORE_OP){\r
+      DefaultStore = (EFI_IFR_DEFAULTSTORE *) pNode->mIfrBinBuf;\r
+      mAllDefaultIdArray[mAllDefaultTypeCount++] = DefaultStore->DefaultId;\r
+    }\r
+    pNode = pNode->mNext;\r
+  }\r
+}\r
+\r
+/**\r
+  Create new default opcode record.\r
+\r
+  @param    Size            The new default opcode size.\r
+  @param    DefaultId       The new default id.\r
+  @param    Type            The new default type.\r
+  @param    LineNo          The line number of the new record.\r
+  @param    Value           The new default value.\r
+\r
+**/\r
+VOID\r
+CIfrRecordInfoDB::IfrCreateDefaultRecord(\r
+  IN UINT8               Size,\r
+  IN UINT16              DefaultId,\r
+  IN UINT8               Type,\r
+  IN UINT32              LineNo,\r
+  IN EFI_IFR_TYPE_VALUE  Value\r
+  )\r
+{\r
+  CIfrDefault   *DObj;\r
+  CIfrDefault2  *DObj2;\r
+\r
+  DObj  = NULL;\r
+  DObj2 = NULL;\r
+\r
+  if (Type == EFI_IFR_TYPE_OTHER) {\r
+    DObj2 = new CIfrDefault2 (Size);\r
+    DObj2->SetDefaultId(DefaultId);\r
+    DObj2->SetType(Type);\r
+    DObj2->SetLineNo(LineNo);\r
+    DObj2->SetScope (1);\r
+    delete DObj2;\r
+  } else {\r
+    DObj = new CIfrDefault (Size);\r
+    DObj->SetDefaultId(DefaultId);\r
+    DObj->SetType(Type);\r
+    DObj->SetLineNo(LineNo);\r
+    DObj->SetValue (Value);\r
+    delete DObj;\r
+  }\r
+}\r
+\r
+/**\r
+  Create new default opcode for question base on the QuestionDefaultInfo.\r
+\r
+  @param  pQuestionNode              Point to the question opcode Node.\r
+  @param  QuestionDefaultInfo        Point to the QuestionDefaultInfo for current question.\r
+\r
+**/\r
+VOID\r
+CIfrRecordInfoDB::IfrCreateDefaultForQuestion (\r
+  IN  SIfrRecord              *pQuestionNode,\r
+  IN  QuestionDefaultRecord   *QuestionDefaultInfo\r
+  )\r
+{\r
+  EFI_IFR_OP_HEADER      *pOpHead;\r
+  EFI_IFR_DEFAULT        *Default;\r
+  SIfrRecord             *pSNode;\r
+  SIfrRecord             *pENode;\r
+  SIfrRecord             *pDefaultNode;\r
+  CIfrObj                *Obj;\r
+  CHAR8                  *ObjBinBuf;\r
+  UINT8                  ScopeCount;\r
+  UINT8                  OpcodeNumber;\r
+  UINT8                  OpcodeCount;\r
+  UINT8                  DefaultSize;\r
+  EFI_IFR_ONE_OF_OPTION  *DefaultOptionOpcode;\r
+  EFI_IFR_TYPE_VALUE     CheckBoxDefaultValue;\r
+\r
+  CheckBoxDefaultValue.b = 1;\r
+  pOpHead                = (EFI_IFR_OP_HEADER *) pQuestionNode->mIfrBinBuf;\r
+  ScopeCount             = 0;\r
+  OpcodeCount            = 0;\r
+  Obj                    = NULL;\r
+\r
+  //\r
+  // Record the offset of node which need to be adjust, will move the new created default opcode to this offset.\r
+  //\r
+  gAdjustOpcodeOffset = pQuestionNode->mNext->mOffset;\r
+  //\r
+  // Case 1:\r
+  // For oneof, the default with smallest default id is given by the option flag.\r
+  // So create the missing defaults base on the oneof option value(mDefaultValueRecord).\r
+  //\r
+  if (pOpHead->OpCode == EFI_IFR_ONE_OF_OP && !QuestionDefaultInfo->mIsDefaultOpcode) {\r
+    DefaultOptionOpcode = (EFI_IFR_ONE_OF_OPTION *)QuestionDefaultInfo->mDefaultValueRecord->mIfrBinBuf;\r
+    DefaultSize = QuestionDefaultInfo->mDefaultValueRecord->mBinBufLen - OFFSET_OF (EFI_IFR_ONE_OF_OPTION, Value);\r
+    DefaultSize += OFFSET_OF (EFI_IFR_DEFAULT, Value);\r
+    for (UINT8 i = 0; i < mAllDefaultTypeCount; i++) {\r
+      if (!QuestionDefaultInfo->mIsDefaultIdExist[i]) {\r
+        IfrCreateDefaultRecord (DefaultSize, mAllDefaultIdArray[i], DefaultOptionOpcode->Type, pQuestionNode->mLineNo, DefaultOptionOpcode->Value);\r
+        //\r
+        // Save the new created default in the buffer storage.\r
+        //\r
+        IfrAddDefaultToBufferConfig (mAllDefaultIdArray[i], pQuestionNode, DefaultOptionOpcode->Value);\r
+      }\r
+    }\r
+    return;\r
+  }\r
+\r
+  //\r
+  // Case2:\r
+  // For checkbox, the default with smallest default id is given by the question flag.\r
+  // And create the missing defaults with true value.\r
+  //\r
+  if (pOpHead-> OpCode == EFI_IFR_CHECKBOX_OP && !QuestionDefaultInfo->mIsDefaultOpcode) {\r
+    DefaultSize = OFFSET_OF (EFI_IFR_DEFAULT, Value) + sizeof (BOOLEAN);\r
+    for (UINT8 i = 0; i < mAllDefaultTypeCount; i++) {\r
+      if (!QuestionDefaultInfo->mIsDefaultIdExist[i]) {\r
+        IfrCreateDefaultRecord (DefaultSize, mAllDefaultIdArray[i], EFI_IFR_TYPE_BOOLEAN, pQuestionNode->mLineNo, CheckBoxDefaultValue);\r
+        //\r
+        // Save the new created default.\r
+        //\r
+        IfrAddDefaultToBufferConfig (mAllDefaultIdArray[i], pQuestionNode, CheckBoxDefaultValue);\r
+      }\r
+    }\r
+    return;\r
+  }\r
+\r
+  //\r
+  // Case3:\r
+  // The default with smallest default id is given by the default opcode.\r
+  // So create the missing defaults base on the value in the default opcode.\r
+  //\r
+\r
+  //\r
+  // pDefaultNode point to the mDefaultValueRecord in QuestionDefaultInfo.\r
+  //\r
+  pDefaultNode = QuestionDefaultInfo->mDefaultValueRecord;\r
+  Default = (EFI_IFR_DEFAULT *)pDefaultNode->mIfrBinBuf;\r
+  //\r
+  // Record the offset of node which need to be adjust, will move the new created default opcode to this offset.\r
+  //\r
+  gAdjustOpcodeOffset = pDefaultNode->mNext->mOffset;\r
+\r
+  if (Default->Type == EFI_IFR_TYPE_OTHER) {\r
+    //\r
+    // EFI_IFR_DEFAULT_2 opcode.\r
+    //\r
+    // Point to the first expression opcode.\r
+    //\r
+    pSNode = pDefaultNode->mNext;\r
+    ScopeCount++;\r
+    //\r
+    // Get opcode number behind the EFI_IFR_DEFAULT_2 until reach its END opcode (including the END opcode of EFI_IFR_DEFAULT_2)\r
+    //\r
+    while (pSNode != NULL && pSNode->mNext != NULL && ScopeCount != 0) {\r
+      pOpHead = (EFI_IFR_OP_HEADER *) pSNode->mIfrBinBuf;\r
+      if (pOpHead->Scope == 1) {\r
+        ScopeCount++;\r
+      }\r
+      if (pOpHead->OpCode == EFI_IFR_END_OP) {\r
+        ScopeCount--;\r
+      }\r
+      pENode = pSNode;\r
+      pSNode = pSNode->mNext;\r
+      OpcodeCount++;\r
+    }\r
+    //\r
+    // Record the offset of node which need to be adjust, will move the new created default opcode to this offset.\r
+    //\r
+    gAdjustOpcodeOffset = pSNode->mOffset;\r
+    //\r
+    // Create new default opcode node for missing default.\r
+    //\r
+    for (UINT8 i = 0; i < mAllDefaultTypeCount; i++) {\r
+      OpcodeNumber = OpcodeCount;\r
+      if (!QuestionDefaultInfo->mIsDefaultIdExist[i]) {\r
+        IfrCreateDefaultRecord (Default->Header.Length, mAllDefaultIdArray[i], Default->Type, pENode->mLineNo, Default->Value);\r
+        //\r
+        // Point to the first expression opcode node.\r
+        //\r
+        pSNode = pDefaultNode->mNext;\r
+        //\r
+        // Create the expression opcode and end opcode for the new created EFI_IFR_DEFAULT_2 opcode.\r
+        //\r
+        while (pSNode != NULL && pSNode->mNext != NULL && OpcodeNumber-- != 0) {\r
+          pOpHead = (EFI_IFR_OP_HEADER *) pSNode->mIfrBinBuf;\r
+          Obj = new CIfrObj (pOpHead->OpCode, NULL, pSNode->mBinBufLen, FALSE);\r
+          Obj->SetLineNo (pSNode->mLineNo);\r
+          ObjBinBuf = Obj->GetObjBinAddr();\r
+          memcpy (ObjBinBuf, pSNode->mIfrBinBuf, (UINTN)pSNode->mBinBufLen);\r
+          delete Obj;\r
+          pSNode = pSNode->mNext;\r
+        }\r
+      }\r
+    }\r
+  } else {\r
+    //\r
+    // EFI_IFR_DEFAULT opcode.\r
+    //\r
+    // Create new default opcode node for missing default.\r
+    //\r
+    for (UINT8 i = 0; i < mAllDefaultTypeCount; i++) {\r
+      if (!QuestionDefaultInfo->mIsDefaultIdExist[i]) {\r
+        IfrCreateDefaultRecord (Default->Header.Length, mAllDefaultIdArray[i], Default->Type, pDefaultNode->mLineNo, Default->Value);\r
+        //\r
+        // Save the new created default in the buffer storage..\r
+        //\r
+        IfrAddDefaultToBufferConfig (mAllDefaultIdArray[i], pQuestionNode, Default->Value);\r
+      }\r
+    }\r
+  }\r
+}\r
+\r
+/**\r
+  Parse the default information in a question, get the QuestionDefaultInfo.\r
+\r
+  @param  pQuestionNode          Point to the question record Node.\r
+  @param  QuestionDefaultInfo    On return, point to the QuestionDefaultInfo.\r
+**/\r
+VOID\r
+CIfrRecordInfoDB::IfrParseDefaulInfoInQuestion(\r
+  IN  SIfrRecord              *pQuestionNode,\r
+  OUT QuestionDefaultRecord   *QuestionDefaultInfo\r
+  )\r
+{\r
+  SIfrRecord              *pSNode;\r
+  EFI_IFR_ONE_OF_OPTION   *OneofOptionOpcode;\r
+  EFI_IFR_OP_HEADER       *pSOpHead;\r
+  EFI_IFR_CHECKBOX        *CheckBoxOpcode;\r
+  EFI_IFR_DEFAULT         *DefaultOpcode;\r
+  BOOLEAN                 IsOneOfOpcode;\r
+  UINT16                  SmallestDefaultId;\r
+  UINT8                   ScopeCount;\r
+\r
+  SmallestDefaultId  = 0xffff;\r
+  IsOneOfOpcode      = FALSE;\r
+  ScopeCount         = 0;\r
+  pSNode             = pQuestionNode;\r
+\r
+  //\r
+  // Parse all the opcodes in the Question.\r
+  //\r
+  while (pSNode != NULL) {\r
+    pSOpHead = (EFI_IFR_OP_HEADER *) pSNode->mIfrBinBuf;\r
+    //\r
+    // For a question, its scope bit must be set, the scope exists until it reaches a corresponding EFI_IFR_END_OP.\r
+    // Scopes may be nested within other scopes.\r
+    // When finishing parsing a question, the scope count must be zero.\r
+    //\r
+    if (pSOpHead->Scope == 1) {\r
+      ScopeCount++;\r
+    }\r
+    if (pSOpHead->OpCode == EFI_IFR_END_OP) {\r
+      ScopeCount--;\r
+    }\r
+    //\r
+    // Check whether finishing parsing a question.\r
+    //\r
+    if (ScopeCount == 0) {\r
+      break;\r
+    }\r
+\r
+    //\r
+    // Record the default information in the question.\r
+    //\r
+    switch (pSOpHead->OpCode) {\r
+    case EFI_IFR_ONE_OF_OP:\r
+      IsOneOfOpcode = TRUE;\r
+      break;\r
+    case EFI_IFR_CHECKBOX_OP:\r
+      //\r
+      // The default info of check box may be given by flag.\r
+      // So need to check the flag of check box.\r
+      //\r
+      CheckBoxOpcode = (EFI_IFR_CHECKBOX *)pSNode->mIfrBinBuf;\r
+      if ((CheckBoxOpcode->Flags & EFI_IFR_CHECKBOX_DEFAULT) != 0) {\r
+        //\r
+        // Check whether need to update the smallest default id.\r
+        //\r
+        if (SmallestDefaultId > EFI_HII_DEFAULT_CLASS_STANDARD) {\r
+          SmallestDefaultId = EFI_HII_DEFAULT_CLASS_STANDARD;\r
+        }\r
+        //\r
+        // Update the QuestionDefaultInfo.\r
+        //\r
+        for (UINT8 i = 0; i < mAllDefaultTypeCount; i++) {\r
+          if (mAllDefaultIdArray[i] == EFI_HII_DEFAULT_CLASS_STANDARD) {\r
+            if (!QuestionDefaultInfo->mIsDefaultIdExist[i]) {\r
+              QuestionDefaultInfo->mDefaultNumber ++;\r
+              QuestionDefaultInfo->mIsDefaultIdExist[i] = TRUE;\r
+            }\r
+            break;\r
+          }\r
+        }\r
+      }\r
+      if ((CheckBoxOpcode->Flags & EFI_IFR_CHECKBOX_DEFAULT_MFG) != 0) {\r
+        //\r
+        // Check whether need to update the smallest default id.\r
+        //\r
+        if (SmallestDefaultId > EFI_HII_DEFAULT_CLASS_MANUFACTURING) {\r
+          SmallestDefaultId = EFI_HII_DEFAULT_CLASS_MANUFACTURING;\r
+        }\r
+        //\r
+        // Update the QuestionDefaultInfo.\r
+        //\r
+        for (UINT8 i = 0; i < mAllDefaultTypeCount; i++) {\r
+          if (mAllDefaultIdArray[i] == EFI_HII_DEFAULT_CLASS_MANUFACTURING) {\r
+            if (!QuestionDefaultInfo->mIsDefaultIdExist[i]) {\r
+              QuestionDefaultInfo->mDefaultNumber ++;\r
+              QuestionDefaultInfo->mIsDefaultIdExist[i] = TRUE;\r
+            }\r
+            break;\r
+          }\r
+        }\r
+      }\r
+      break;\r
+    case EFI_IFR_ONE_OF_OPTION_OP:\r
+      if (!IsOneOfOpcode) {\r
+        //\r
+        // Only check the option in oneof.\r
+        //\r
+        break;\r
+      }\r
+      OneofOptionOpcode = (EFI_IFR_ONE_OF_OPTION *)pSNode->mIfrBinBuf;\r
+      if ((OneofOptionOpcode->Flags & EFI_IFR_OPTION_DEFAULT) != 0) {\r
+        //\r
+        // The option is used as the standard default.\r
+        // Check whether need to update the smallest default id and QuestionDefaultInfo.\r
+        //\r
+        if (SmallestDefaultId > EFI_HII_DEFAULT_CLASS_STANDARD) {\r
+          SmallestDefaultId = EFI_HII_DEFAULT_CLASS_STANDARD;\r
+          QuestionDefaultInfo->mDefaultValueRecord = pSNode;\r
+        }\r
+        //\r
+        // Update the IsDefaultIdExist array in QuestionDefaultInfo.\r
+        //\r
+        for (UINT8 i = 0; i < mAllDefaultTypeCount; i++) {\r
+          if (mAllDefaultIdArray[i] == EFI_HII_DEFAULT_CLASS_STANDARD) {\r
+            if (!QuestionDefaultInfo->mIsDefaultIdExist[i]) {\r
+              QuestionDefaultInfo->mDefaultNumber ++;\r
+              QuestionDefaultInfo->mIsDefaultIdExist[i] = TRUE;\r
+            }\r
+            break;\r
+          }\r
+        }\r
+      }\r
+      if ((OneofOptionOpcode->Flags & EFI_IFR_OPTION_DEFAULT_MFG) != 0) {\r
+        //\r
+        // This option is used as the manufacture default.\r
+        // Check whether need to update the smallest default id and QuestionDefaultInfo.\r
+        //\r
+        if (SmallestDefaultId > EFI_HII_DEFAULT_CLASS_MANUFACTURING) {\r
+          SmallestDefaultId = EFI_HII_DEFAULT_CLASS_MANUFACTURING;\r
+          QuestionDefaultInfo->mDefaultValueRecord = pSNode;\r
+        }\r
+        //\r
+        // Update the QuestionDefaultInfo.\r
+        //\r
+        for (UINT8 i = 0; i < mAllDefaultTypeCount; i++) {\r
+          if (mAllDefaultIdArray[i] == EFI_HII_DEFAULT_CLASS_MANUFACTURING) {\r
+            if (!QuestionDefaultInfo->mIsDefaultIdExist[i]) {\r
+              QuestionDefaultInfo->mDefaultNumber ++;\r
+              QuestionDefaultInfo->mIsDefaultIdExist[i] = TRUE;\r
+            }\r
+            break;\r
+          }\r
+        }\r
+      }\r
+      break;\r
+    case EFI_IFR_DEFAULT_OP:\r
+      DefaultOpcode = (EFI_IFR_DEFAULT *) pSNode->mIfrBinBuf;\r
+      //\r
+      // Check whether need to update the smallest default id and QuestionDefaultInfo.\r
+      //\r
+      if (SmallestDefaultId >= DefaultOpcode->DefaultId ) {\r
+        SmallestDefaultId = DefaultOpcode->DefaultId;\r
+        QuestionDefaultInfo->mDefaultValueRecord= pSNode;\r
+        QuestionDefaultInfo->mIsDefaultOpcode= TRUE;\r
+      }\r
+      //\r
+      // Update the QuestionDefaultInfo.\r
+      //\r
+      for (UINT8 i = 0; i < mAllDefaultTypeCount; i++){\r
+        if (mAllDefaultIdArray[i] == ((EFI_IFR_DEFAULT *)pSNode->mIfrBinBuf)->DefaultId) {\r
+          if (!QuestionDefaultInfo->mIsDefaultIdExist[i]) {\r
+            QuestionDefaultInfo->mDefaultNumber ++;\r
+            QuestionDefaultInfo->mIsDefaultIdExist[i] = TRUE;\r
+          }\r
+          break;\r
+        }\r
+      }\r
+      break;\r
+    default:\r
+      break;\r
+    }\r
+    //\r
+    // Parse next opcode in this question.\r
+    //\r
+    pSNode = pSNode->mNext;\r
+  }\r
+}\r
+\r
+/**\r
+  Check or add default for question if need.\r
+\r
+  This function will check the default info for question.\r
+  If the question has default, but the default number < defaultstore opcode number.\r
+  will do following two action :\r
+\r
+  1. if (AutoDefault) will add default for question to support all kinds of defaults.\r
+  2. if (CheckDefault) will generate an error to tell user the question misses some default value.\r
+\r
+  We assume that the two options can not be TRUE at same time.\r
+  If they are TRUE at same time, only do the action corresponding to AutoDefault option.\r
+\r
+  @param  AutoDefault          Add default for question if needed\r
+  @param  CheckDefault         Check the default info, if missing default, generates an error.\r
+\r
+**/\r
+VOID\r
+CIfrRecordInfoDB::IfrCheckAddDefaultRecord (\r
+  BOOLEAN  AutoDefault,\r
+  BOOLEAN  CheckDefault\r
+  )\r
+{\r
+  SIfrRecord            *pNode;\r
+  SIfrRecord            *pTailNode;\r
+  SIfrRecord            *pStartAdjustNode;\r
+  EFI_IFR_OP_HEADER     *pOpHead;\r
+  QuestionDefaultRecord  QuestionDefaultInfo;\r
+  UINT8                  MissingDefaultCount;\r
+  CHAR8                  Msg[MAX_STRING_LEN] = {0, };\r
+\r
+  pNode               = mIfrRecordListHead;\r
+\r
+  //\r
+  // Record the number and default id of all defaultstore opcode.\r
+  //\r
+  IfrGetDefaultStoreInfo ();\r
+\r
+  while (pNode != NULL) {\r
+    pOpHead = (EFI_IFR_OP_HEADER *) pNode->mIfrBinBuf;\r
+    //\r
+    // Check whether is question opcode.\r
+    //\r
+    if (CheckQuestionOpCode (pOpHead->OpCode)) {\r
+      //\r
+      // Initialize some local variables here, because they vary with question.\r
+      // Record the mIfrRecordListTail for each question, because may create default node for question after mIfrRecordListTail.\r
+      //\r
+      memset (&QuestionDefaultInfo, 0, sizeof (QuestionDefaultRecord));\r
+      pTailNode = mIfrRecordListTail;\r
+      //\r
+      // Get the QuestionDefaultInfo for current question.\r
+      //\r
+      IfrParseDefaulInfoInQuestion (pNode, &QuestionDefaultInfo);\r
+\r
+      if (QuestionDefaultInfo.mDefaultNumber != mAllDefaultTypeCount && QuestionDefaultInfo.mDefaultNumber != 0) {\r
+        if (AutoDefault) {\r
+          //\r
+          // Create default for question which misses default.\r
+          //\r
+          IfrCreateDefaultForQuestion (pNode, &QuestionDefaultInfo);\r
+\r
+          //\r
+          // Adjust the buffer content.\r
+          // pStartAdjustNode->mIfrBinBuf points to the insert position.\r
+          // pTailNode->mNext->mIfrBinBuf points to the inset opcodes.\r
+          //\r
+          pStartAdjustNode =GetRecordInfoFromOffset (gAdjustOpcodeOffset);\r
+          gCFormPkg.AdjustDynamicInsertOpcode (pStartAdjustNode->mIfrBinBuf, pTailNode->mNext->mIfrBinBuf, TRUE);\r
+\r
+          //\r
+          // Update the record info.\r
+          //\r
+          IfrUpdateRecordInfoForDynamicOpcode (TRUE);\r
+        } else if (CheckDefault) {\r
+          //\r
+          // Generate an error for question which misses default.\r
+          //\r
+          MissingDefaultCount = mAllDefaultTypeCount - QuestionDefaultInfo.mDefaultNumber;\r
+          sprintf (Msg, "The question misses %d default, the question's opcode is %d", MissingDefaultCount, pOpHead->OpCode);\r
+          gCVfrErrorHandle.PrintMsg (pNode->mLineNo, NULL, "Error", Msg);\r
+        }\r
+      }\r
+    }\r
+    //\r
+    // parse next opcode.\r
+    //\r
+    pNode = pNode->mNext;\r
+  }\r
+}\r
+\r
 CIfrRecordInfoDB gCIfrRecordInfoDB;\r
 \r
 VOID\r
index 644dfddad9434506f0797a53bf3ab87c47c631cf..051df28768acc94e355111051a6c7ab1552f97ed 100644 (file)
@@ -2,7 +2,7 @@
   \r
   The definition of CFormPkg's member function\r
 \r
-Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2016, 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
@@ -154,7 +154,8 @@ public:
     );\r
   EFI_VFR_RETURN_CODE AdjustDynamicInsertOpcode (\r
     IN CHAR8              *LastFormEndAddr,\r
-    IN CHAR8              *InsertOpcodeAddr\r
+    IN CHAR8              *InsertOpcodeAddr,\r
+    IN BOOLEAN            CreateOpcodeAfterParsingVfr\r
     );\r
   CHAR8 *             GetBufAddrBaseOnOffset (\r
     IN UINT32             Offset\r
@@ -177,8 +178,23 @@ struct SIfrRecord {
   ~SIfrRecord (VOID);\r
 };\r
 \r
+\r
 #define EFI_IFR_RECORDINFO_IDX_INVALUD 0xFFFFFF\r
 #define EFI_IFR_RECORDINFO_IDX_START   0x0\r
+#define EFI_HII_MAX_SUPPORT_DEFAULT_TYPE  0x08\r
+\r
+struct QuestionDefaultRecord {\r
+  BOOLEAN     mIsDefaultIdExist[EFI_HII_MAX_SUPPORT_DEFAULT_TYPE]; // Record the default id in mAllDefaultIdArray[EFI_HII_MAX_SUPPORT_DEFAULT_TYPE]\r
+                                                                   // whether exists in current question.\r
+\r
+  SIfrRecord  *mDefaultValueRecord;   // Point to the default value record in RecordList which has smallest default Id.\r
+                                      // (for checkbox it may be NULL, because the dedault value is always true when the flag is set.)\r
+\r
+  BOOLEAN     mIsDefaultOpcode;       // whether the default value with smallest default id is given by default opcode.\r
+                                      // (for oneof and checkbox default info may be given by flag.)\r
+\r
+  UINT16      mDefaultNumber;         // The default number of this question.\r
+};\r
 \r
 class CIfrRecordInfoDB {\r
 private:\r
@@ -186,6 +202,8 @@ private:
   UINT32     mRecordCount;\r
   SIfrRecord *mIfrRecordListHead;\r
   SIfrRecord *mIfrRecordListTail;\r
+  UINT8      mAllDefaultTypeCount;\r
+  UINT16     mAllDefaultIdArray[EFI_HII_MAX_SUPPORT_DEFAULT_TYPE];\r
 \r
   SIfrRecord * GetRecordInfoFromIdx (IN UINT32);\r
   BOOLEAN          CheckQuestionOpCode (IN UINT8);\r
@@ -205,13 +223,20 @@ public:
 \r
   SIfrRecord * GetRecordInfoFromOffset (IN UINT32);\r
   VOID        IfrAdjustOffsetForRecord (VOID);\r
-  BOOLEAN     IfrAdjustDynamicOpcodeInRecords (VOID);\r
+  BOOLEAN     IfrAdjustDynamicOpcodeInRecords (IN BOOLEAN);\r
 \r
   UINT32      IfrRecordRegister (IN UINT32, IN CHAR8 *, IN UINT8, IN UINT32);\r
   VOID        IfrRecordInfoUpdate (IN UINT32, IN UINT32, IN CHAR8*, IN UINT8, IN UINT32);\r
   VOID        IfrRecordOutput (IN FILE *, IN UINT32 LineNo);\r
   VOID        IfrRecordOutput (OUT PACKAGE_DATA &);\r
-  EFI_VFR_RETURN_CODE  IfrRecordAdjust (VOID);   \r
+  EFI_VFR_RETURN_CODE  IfrRecordAdjust (VOID);\r
+  VOID        IfrUpdateRecordInfoForDynamicOpcode (IN BOOLEAN);\r
+  VOID        IfrCheckAddDefaultRecord (IN BOOLEAN, IN BOOLEAN);\r
+  VOID        IfrGetDefaultStoreInfo ();\r
+  VOID        IfrCreateDefaultRecord (IN UINT8 Size,IN UINT16 DefaultId,IN UINT8 Type,IN UINT32 LineNo,IN EFI_IFR_TYPE_VALUE Value);\r
+  VOID        IfrCreateDefaultForQuestion (IN  SIfrRecord *, IN  QuestionDefaultRecord *);\r
+  VOID        IfrParseDefaulInfoInQuestion (IN  SIfrRecord *, OUT QuestionDefaultRecord *);\r
+  VOID        IfrAddDefaultToBufferConfig (IN  UINT16, IN  SIfrRecord *,IN  EFI_IFR_TYPE_VALUE);\r
 };\r
 \r
 extern CIfrRecordInfoDB gCIfrRecordInfoDB;\r
index 55a9a23ff2d7e0c834402ed75207711d6e04b2eb..4b42d3ca8c4ba6f88c49417619b81957df8f252f 100644 (file)
@@ -596,7 +596,7 @@ vfrFormSetDefinition :
                                                       if (gCFormPkg.HavePendingUnassigned()) {\r
                                                         mParserStatus += gCFormPkg.DeclarePendingQuestion (\r
                                                                     gCVfrVarDataTypeDB,\r
-                                                                    mCVfrDataStorage,\r
+                                                                    gCVfrDataStorage,\r
                                                                     mCVfrQuestionDB,\r
                                                                     &mFormsetGuid,\r
                                                                     E->getLine(),\r
@@ -614,7 +614,8 @@ vfrFormSetDefinition :
                                                       if (gNeedAdjustOpcode) {\r
                                                         gCFormPkg.AdjustDynamicInsertOpcode (\r
                                                           mLastFormEndAddr,\r
-                                                          InsertOpcodeAddr\r
+                                                          InsertOpcodeAddr,\r
+                                                          FALSE\r
                                                         );\r
                                                       }\r
 \r
@@ -834,14 +835,14 @@ vfrStatementDefaultStore :
     "," Attribute "=" A:Number                      << DefaultId = _STOU16(A->getText(), A->getLine()); >>\r
   }\r
                                                     <<\r
-                                                       if (mCVfrDefaultStore.DefaultIdRegistered (DefaultId) == FALSE) {\r
+                                                       if (gCVfrDefaultStore.DefaultIdRegistered (DefaultId) == FALSE) {\r
                                                          CIfrDefaultStore DSObj;\r
-                                                         _PCATCH(mCVfrDefaultStore.RegisterDefaultStore (DSObj.GetObjBinAddr(), N->getText(), _STOSID(S->getText(), S->getLine()), DefaultId)), D->getLine();\r
+                                                         _PCATCH(gCVfrDefaultStore.RegisterDefaultStore (DSObj.GetObjBinAddr(), N->getText(), _STOSID(S->getText(), S->getLine()), DefaultId)), D->getLine();\r
                                                          DSObj.SetLineNo(D->getLine());\r
                                                          DSObj.SetDefaultName (_STOSID(S->getText(), S->getLine()));\r
                                                          DSObj.SetDefaultId (DefaultId);\r
                                                        } else {\r
-                                                         _PCATCH(mCVfrDefaultStore.ReRegisterDefaultStoreById (DefaultId, N->getText(), _STOSID(S->getText(), S->getLine()))), D->getLine();\r
+                                                         _PCATCH(gCVfrDefaultStore.ReRegisterDefaultStoreById (DefaultId, N->getText(), _STOSID(S->getText(), S->getLine()))), D->getLine();\r
                                                        }\r
                                                     >>\r
   ";"\r
@@ -893,7 +894,7 @@ vfrStatementVarStoreLinear :
                                                        } else {\r
                                                          StoreName = SN->getText();\r
                                                        }\r
-                                                       _PCATCH(mCVfrDataStorage.DeclareBufferVarStore (\r
+                                                       _PCATCH(gCVfrDataStorage.DeclareBufferVarStore (\r
                                                                                   StoreName,\r
                                                                                   &Guid,\r
                                                                                   &gCVfrVarDataTypeDB,\r
@@ -901,7 +902,7 @@ vfrStatementVarStoreLinear :
                                                                                   VarStoreId\r
                                                                                   ), LineNum);\r
                                                        VSObj.SetGuid (&Guid);\r
-                                                       _PCATCH(mCVfrDataStorage.GetVarStoreId(StoreName, &VarStoreId, &Guid), SN);\r
+                                                       _PCATCH(gCVfrDataStorage.GetVarStoreId(StoreName, &VarStoreId, &Guid), SN);\r
                                                        VSObj.SetVarStoreId (VarStoreId);\r
                                                        _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &Size), LineNum);\r
                                                        VSObj.SetSize ((UINT16) Size);\r
@@ -985,24 +986,24 @@ vfrStatementVarStoreEfi :
 \r
   Uuid "=" guidDefinition[Guid]                     << \r
                                                        if (IsUEFI23EfiVarstore) {\r
-                                                       _PCATCH(mCVfrDataStorage.DeclareBufferVarStore (\r
+                                                       _PCATCH(gCVfrDataStorage.DeclareBufferVarStore (\r
                                                                                   StoreName,\r
                                                                                   &Guid,\r
                                                                                   &gCVfrVarDataTypeDB,\r
                                                                                   TypeName,\r
                                                                                   VarStoreId\r
                                                                                   ), LineNum);                                                        \r
-                                                         _PCATCH(mCVfrDataStorage.GetVarStoreId(StoreName, &VarStoreId, &Guid), SN);\r
+                                                         _PCATCH(gCVfrDataStorage.GetVarStoreId(StoreName, &VarStoreId, &Guid), SN);\r
                                                          _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &Size), LineNum);\r
                                                        } else {\r
-                                                        _PCATCH(mCVfrDataStorage.DeclareBufferVarStore (\r
+                                                        _PCATCH(gCVfrDataStorage.DeclareBufferVarStore (\r
                                                                                   TN->getText(),\r
                                                                                   &Guid,\r
                                                                                   &gCVfrVarDataTypeDB,\r
                                                                                   TypeName,\r
                                                                                   VarStoreId\r
                                                                                   ), LineNum);                                                      \r
-                                                         _PCATCH(mCVfrDataStorage.GetVarStoreId(TN->getText(), &VarStoreId, &Guid), VN);\r
+                                                         _PCATCH(gCVfrDataStorage.GetVarStoreId(TN->getText(), &VarStoreId, &Guid), VN);\r
                                                          _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &Size), N->getLine());\r
                                                        }\r
                                                        VSEObj.SetGuid (&Guid);                                                       \r
@@ -1043,16 +1044,16 @@ vfrStatementVarStoreNameValue :
   (\r
     Name "=" "STRING_TOKEN" "\(" N:Number "\)" ","  << \r
                                                        if (!Created) {\r
-                                                         _PCATCH(mCVfrDataStorage.DeclareNameVarStoreBegin (SN->getText(), VarStoreId), SN);\r
+                                                         _PCATCH(gCVfrDataStorage.DeclareNameVarStoreBegin (SN->getText(), VarStoreId), SN);\r
                                                          Created = TRUE;\r
                                                        }\r
-                                                       _PCATCH(mCVfrDataStorage.NameTableAddItem (_STOSID(N->getText(), N->getLine())), SN); \r
+                                                       _PCATCH(gCVfrDataStorage.NameTableAddItem (_STOSID(N->getText(), N->getLine())), SN);\r
                                                     >>\r
   )+\r
-  Uuid "=" guidDefinition[Guid]                     << _PCATCH(mCVfrDataStorage.DeclareNameVarStoreEnd (&Guid), SN); >>\r
+  Uuid "=" guidDefinition[Guid]                     << _PCATCH(gCVfrDataStorage.DeclareNameVarStoreEnd (&Guid), SN); >>\r
                                                     <<\r
                                                        VSNVObj.SetGuid (&Guid);\r
-                                                       _PCATCH(mCVfrDataStorage.GetVarStoreId(SN->getText(), &VarStoreId, &Guid), SN);\r
+                                                       _PCATCH(gCVfrDataStorage.GetVarStoreId(SN->getText(), &VarStoreId, &Guid), SN);\r
                                                        VSNVObj.SetVarStoreId (VarStoreId);\r
                                                     >>\r
   ";"\r
@@ -1244,9 +1245,9 @@ vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr, BOOLEAN CheckFl
                                                        _STRCAT(&VarIdStr, "]");\r
                                                     >>\r
                                                     <<\r
-                                                       VfrReturnCode = mCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId);\r
+                                                       VfrReturnCode = gCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId);\r
                                                        if (mCompatibleMode && VfrReturnCode == VFR_RETURN_UNDEFINED) {\r
-                                                          mCVfrDataStorage.DeclareBufferVarStore (\r
+                                                          gCVfrDataStorage.DeclareBufferVarStore (\r
                                                                              SName,\r
                                                                              &mFormsetGuid,\r
                                                                              &gCVfrVarDataTypeDB,\r
@@ -1254,11 +1255,11 @@ vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr, BOOLEAN CheckFl
                                                                              EFI_VARSTORE_ID_INVALID,\r
                                                                              FALSE\r
                                                                              );\r
-                                                          VfrReturnCode = mCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId, &mFormsetGuid);\r
+                                                          VfrReturnCode = gCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId, &mFormsetGuid);\r
                                                        }\r
                                                        if (CheckFlag || VfrReturnCode == VFR_RETURN_SUCCESS) {\r
                                                          _PCATCH(VfrReturnCode, SN1);\r
-                                                         _PCATCH(mCVfrDataStorage.GetNameVarStoreInfo (&$Info, Idx), SN1);\r
+                                                         _PCATCH(gCVfrDataStorage.GetNameVarStoreInfo (&$Info, Idx), SN1);\r
                                                        }\r
 \r
                                                        QuestVarIdStr = VarIdStr;\r
@@ -1268,9 +1269,9 @@ vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr, BOOLEAN CheckFl
   (\r
     SN2:StringIdentifier                            << SName = SN2->getText(); _STRCAT(&VarIdStr, SName); >>\r
                                                     <<\r
-                                                       VfrReturnCode = mCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId);\r
+                                                       VfrReturnCode = gCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId);\r
                                                        if (mCompatibleMode && VfrReturnCode == VFR_RETURN_UNDEFINED) {\r
-                                                          mCVfrDataStorage.DeclareBufferVarStore (\r
+                                                          gCVfrDataStorage.DeclareBufferVarStore (\r
                                                                              SName,\r
                                                                              &mFormsetGuid,\r
                                                                              &gCVfrVarDataTypeDB,\r
@@ -1278,13 +1279,13 @@ vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr, BOOLEAN CheckFl
                                                                              EFI_VARSTORE_ID_INVALID,\r
                                                                              FALSE\r
                                                                              );\r
-                                                          VfrReturnCode = mCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId, &mFormsetGuid);\r
+                                                          VfrReturnCode = gCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId, &mFormsetGuid);\r
                                                        }\r
                                                        if (CheckFlag || VfrReturnCode == VFR_RETURN_SUCCESS) {\r
                                                          _PCATCH(VfrReturnCode, SN2);\r
-                                                         VarStoreType = mCVfrDataStorage.GetVarStoreType ($Info.mVarStoreId);\r
+                                                         VarStoreType = gCVfrDataStorage.GetVarStoreType ($Info.mVarStoreId);\r
                                                          if (VarStoreType == EFI_VFR_VARSTORE_BUFFER) {\r
-                                                           _PCATCH(mCVfrDataStorage.GetBufferVarStoreDataTypeName(Info.mVarStoreId, &TName), SN2);\r
+                                                           _PCATCH(gCVfrDataStorage.GetBufferVarStoreDataTypeName(Info.mVarStoreId, &TName), SN2);\r
                                                            _STRCAT(&VarStr, TName);\r
                                                          }\r
                                                        }\r
@@ -1319,11 +1320,11 @@ vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr, BOOLEAN CheckFl
     )*                                              <<\r
                                                        switch (VarStoreType) {\r
                                                        case EFI_VFR_VARSTORE_EFI:\r
-                                                         _PCATCH(mCVfrDataStorage.GetEfiVarStoreInfo (&$Info), SN2);\r
+                                                         _PCATCH(gCVfrDataStorage.GetEfiVarStoreInfo (&$Info), SN2);\r
                                                          break;\r
                                                        case EFI_VFR_VARSTORE_BUFFER:\r
                                                          _PCATCH(gCVfrVarDataTypeDB.GetDataFieldInfo (VarStr, $Info.mInfo.mVarOffset, $Info.mVarType, $Info.mVarTotalSize), SN2->getLine(), VarStr);\r
-                                                         VarGuid = mCVfrDataStorage.GetVarStoreGuid($Info.mVarStoreId);\r
+                                                         VarGuid = gCVfrDataStorage.GetVarStoreGuid($Info.mVarStoreId);\r
                                                          _PCATCH((EFI_VFR_RETURN_CODE)gCVfrBufferConfig.Register (\r
                                                                     SName,\r
                                                                     VarGuid,\r
@@ -1339,6 +1340,7 @@ vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr, BOOLEAN CheckFl
                                                                     $Info.mVarTotalSize,\r
                                                                     Dummy),\r
                                                                  SN2->getLine());\r
+                                                         _PCATCH(gCVfrDataStorage.AddBufferVarStoreFieldInfo(&$Info ),SN2->getLine());\r
                                                          break;\r
                                                        case EFI_VFR_VARSTORE_NAME:\r
                                                        default: break;\r
@@ -1761,7 +1763,7 @@ vfrStatementDefault :
     )\r
     {\r
       DefaultStore "=" SN:StringIdentifier ","      << \r
-                                                        _PCATCH(mCVfrDefaultStore.GetDefaultId (SN->getText(), &DefaultId), SN); \r
+                                                        _PCATCH(gCVfrDefaultStore.GetDefaultId (SN->getText(), &DefaultId), SN);\r
                                                         if (DObj != NULL) {\r
                                                           DObj->SetDefaultId (DefaultId); \r
                                                         } \r
@@ -1774,11 +1776,11 @@ vfrStatementDefault :
                                                     <<\r
                                                       CheckDuplicateDefaultValue (DefaultId, D);\r
                                                       if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
-                                                       _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), D->getLine());\r
-                                                       VarGuid = mCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);\r
-                                                       VarStoreType = mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
+                                                       _PCATCH(gCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), D->getLine());\r
+                                                       VarGuid = gCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);\r
+                                                       VarStoreType = gCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
                                                        if ((IsExp == FALSE) && (VarStoreType == EFI_VFR_VARSTORE_BUFFER)) {\r
-                                                         _PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
+                                                         _PCATCH(gCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
                                                                    DefaultId,\r
                                                                    _GET_CURRQEST_VARTINFO(),\r
                                                                    VarStoreName,\r
@@ -2131,7 +2133,7 @@ vfrStatementResetButton :
   L:ResetButton                                        << RBObj.SetLineNo(L->getLine()); >>\r
   DefaultStore\r
   "=" N:StringIdentifier ","                           <<\r
-                                                          _PCATCH(mCVfrDefaultStore.GetDefaultId (N->getText(), &DefaultId), N->getLine());\r
+                                                          _PCATCH(gCVfrDefaultStore.GetDefaultId (N->getText(), &DefaultId), N->getLine());\r
                                                           RBObj.SetDefaultId (DefaultId);\r
                                                        >>\r
   vfrStatementHeader[&RBObj] ","\r
@@ -2174,7 +2176,7 @@ vfrStatementCheckBox :
                                                             _PCATCH (gCVfrVarDataTypeDB.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 ((mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId) == EFI_VFR_VARSTORE_BUFFER) &&\r
+                                                            } else if ((gCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId) == EFI_VFR_VARSTORE_BUFFER) &&\r
                                                                       (_GET_CURRQEST_VARSIZE() != sizeof (BOOLEAN))) {\r
                                                               _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid only support BOOLEAN data type");\r
                                                             }\r
@@ -2184,13 +2186,13 @@ vfrStatementCheckBox :
     F:FLAGS "=" vfrCheckBoxFlags[CBObj, F->getLine()] ","\r
                                                        <<\r
                                                          if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
-                                                            _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), VFR_RETURN_SUCCESS, L, "Failed to retrieve varstore name");\r
-                                                            VarStoreGuid = mCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);\r
+                                                            _PCATCH(gCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), VFR_RETURN_SUCCESS, L, "Failed to retrieve varstore name");\r
+                                                            VarStoreGuid = gCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);\r
                                                             Val.b = TRUE;\r
                                                             if (CBObj.GetFlags () & 0x01) {\r
                                                               CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_STANDARD, F);\r
                                                               _PCATCH(\r
-                                                                mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
+                                                                gCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
                                                                                     EFI_HII_DEFAULT_CLASS_STANDARD,\r
                                                                                     _GET_CURRQEST_VARTINFO(),\r
                                                                                     VarStoreName,\r
@@ -2206,7 +2208,7 @@ vfrStatementCheckBox :
                                                             if (CBObj.GetFlags () & 0x02) {\r
                                                               CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_MANUFACTURING, F);\r
                                                               _PCATCH(\r
-                                                                mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
+                                                                gCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
                                                                                     EFI_HII_DEFAULT_CLASS_MANUFACTURING,\r
                                                                                     _GET_CURRQEST_VARTINFO(),\r
                                                                                     VarStoreName,\r
@@ -2703,7 +2705,7 @@ vfrNumericFlags [CIfrNumeric & NObj, UINT32 LineNum] :
                                                        <<\r
                                                           //check data type flag\r
                                                           if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
-                                                            VarStoreType = mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
+                                                            VarStoreType = gCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
                                                             if (VarStoreType == EFI_VFR_VARSTORE_BUFFER || VarStoreType == EFI_VFR_VARSTORE_EFI) {\r
                                                               if (_GET_CURRQEST_DATATYPE() != (LFlags & EFI_IFR_NUMERIC_SIZE)) {\r
                                                                 _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Numeric Flag is not same to Numeric VarData type");\r
@@ -2793,7 +2795,7 @@ vfrOneofFlagsField [CIfrOneOf & OObj, UINT32 LineNum] :
                                                        <<\r
                                                           //check data type flag\r
                                                           if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
-                                                            VarStoreType = mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
+                                                            VarStoreType = gCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);\r
                                                             if (VarStoreType == EFI_VFR_VARSTORE_BUFFER || VarStoreType == EFI_VFR_VARSTORE_EFI) {\r
                                                               if (_GET_CURRQEST_DATATYPE() != (LFlags & EFI_IFR_NUMERIC_SIZE)) {\r
                                                                 _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Numeric Flag is not same to Numeric VarData type");\r
@@ -3445,11 +3447,11 @@ vfrStatementOneOfOption :
                                                           }\r
 \r
                                                           if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
-                                                            _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), L->getLine());\r
-                                                            VarStoreGuid = mCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);\r
+                                                            _PCATCH(gCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), L->getLine());\r
+                                                            VarStoreGuid = gCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);\r
                                                             if (OOOObj->GetFlags () & EFI_IFR_OPTION_DEFAULT) {\r
                                                               CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_STANDARD, F);\r
-                                                              _PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
+                                                              _PCATCH(gCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
                                                                         EFI_HII_DEFAULT_CLASS_STANDARD,\r
                                                                          _GET_CURRQEST_VARTINFO(),\r
                                                                         VarStoreName,\r
@@ -3460,7 +3462,7 @@ vfrStatementOneOfOption :
                                                             }\r
                                                             if (OOOObj->GetFlags () & EFI_IFR_OPTION_DEFAULT_MFG) {\r
                                                               CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_MANUFACTURING, F);\r
-                                                              _PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
+                                                              _PCATCH(gCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
                                                                         EFI_HII_DEFAULT_CLASS_MANUFACTURING,\r
                                                                          _GET_CURRQEST_VARTINFO(),\r
                                                                         VarStoreName,\r
@@ -3930,9 +3932,9 @@ vareqvalExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :
   OpenParen\r
   VN:Number                                           <<\r
                                                           VarIdStr = NULL; _STRCAT(&VarIdStr, VK->getText()); _STRCAT(&VarIdStr, VN->getText());\r
-                                                          VfrReturnCode = mCVfrDataStorage.GetVarStoreId (VarIdStr, &VarStoreId);\r
+                                                          VfrReturnCode = gCVfrDataStorage.GetVarStoreId (VarIdStr, &VarStoreId);\r
                                                           if (VfrReturnCode == VFR_RETURN_UNDEFINED) {\r
-                                                            _PCATCH (mCVfrDataStorage.DeclareEfiVarStore (\r
+                                                            _PCATCH (gCVfrDataStorage.DeclareEfiVarStore (\r
                                                                                         VarIdStr,\r
                                                                                         &mFormsetGuid,\r
                                                                                         _STOSID(VN->getText(), VN->getLine()),\r
@@ -4249,7 +4251,7 @@ getExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
                                                                 break;\r
                                                               }\r
                                                             } else {\r
-                                                              if ((mCVfrDataStorage.GetVarStoreType(Info.mVarStoreId) == EFI_VFR_VARSTORE_NAME) && (VarType == EFI_IFR_TYPE_UNDEFINED)) {\r
+                                                              if ((gCVfrDataStorage.GetVarStoreType(Info.mVarStoreId) == EFI_VFR_VARSTORE_NAME) && (VarType == EFI_IFR_TYPE_UNDEFINED)) {\r
                                                                 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support name string");\r
                                                               }\r
                                                               if (VarType != EFI_IFR_TYPE_UNDEFINED) {\r
@@ -4424,7 +4426,7 @@ setExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
                                                                 break;\r
                                                               }\r
                                                             } else {\r
-                                                              if ((mCVfrDataStorage.GetVarStoreType(Info.mVarStoreId) == EFI_VFR_VARSTORE_NAME) && (VarType == EFI_IFR_TYPE_UNDEFINED)) {\r
+                                                              if ((gCVfrDataStorage.GetVarStoreType(Info.mVarStoreId) == EFI_VFR_VARSTORE_NAME) && (VarType == EFI_IFR_TYPE_UNDEFINED)) {\r
                                                                 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support name string");\r
                                                               }\r
                                                               if (VarType != EFI_IFR_TYPE_UNDEFINED) {\r
@@ -4553,8 +4555,6 @@ private:
   UINT8               mParserStatus;\r
   BOOLEAN             mConstantOnlyInExpression;\r
 \r
-  CVfrDefaultStore    mCVfrDefaultStore;\r
-  CVfrDataStorage     mCVfrDataStorage;\r
   CVfrQuestionDB      mCVfrQuestionDB;\r
   CVfrRulesDB         mCVfrRulesDB;\r
 \r
@@ -5115,7 +5115,7 @@ EfiVfrParser::_DeclareDefaultFrameworkVarStore (
   CONST CHAR8           VarName[] = "Setup";\r
 \r
   FirstNode = TRUE;\r
-  pNode = mCVfrDataStorage.GetBufferVarStoreList();\r
+  pNode = gCVfrDataStorage.GetBufferVarStoreList();\r
   if (pNode == NULL && gCVfrVarDataTypeDB.mFirstNewDataTypeName != NULL) {\r
     //\r
     // Create the default Buffer Var Store when no VarStore is defined.\r
@@ -5157,7 +5157,7 @@ EfiVfrParser::_DeclareDefaultFrameworkVarStore (
     }\r
   }\r
 \r
-  pNode = mCVfrDataStorage.GetEfiVarStoreList();\r
+  pNode = gCVfrDataStorage.GetEfiVarStoreList();\r
   for (; pNode != NULL; pNode = pNode->mNext) {\r
     //\r
     // create the default efi varstore opcode for not exist varstore\r
@@ -5200,14 +5200,14 @@ EfiVfrParser::_DeclareDefaultLinearVarStore (
     CIfrVarStore      VSObj;\r
 \r
     VSObj.SetLineNo (LineNo);\r
-    mCVfrDataStorage.DeclareBufferVarStore (\r
+    gCVfrDataStorage.DeclareBufferVarStore (\r
                        TypeNameList[Index],\r
                        &mFormsetGuid,\r
                        &gCVfrVarDataTypeDB,\r
                        TypeNameList[Index],\r
                        EFI_VARSTORE_ID_INVALID\r
                        );\r
-    mCVfrDataStorage.GetVarStoreId(TypeNameList[Index], &VarStoreId, &mFormsetGuid);\r
+    gCVfrDataStorage.GetVarStoreId(TypeNameList[Index], &VarStoreId, &mFormsetGuid);\r
     VSObj.SetVarStoreId (VarStoreId);\r
     gCVfrVarDataTypeDB.GetDataTypeSize(TypeNameList[Index], &Size);\r
     VSObj.SetSize ((UINT16) Size);\r
@@ -5225,14 +5225,14 @@ EfiVfrParser::_DeclareDefaultLinearVarStore (
     CIfrVarStore      VSObj;\r
 \r
     VSObj.SetLineNo (LineNo);\r
-    mCVfrDataStorage.DeclareBufferVarStore (\r
+    gCVfrDataStorage.DeclareBufferVarStore (\r
                        (CHAR8 *) DateName,\r
                        &mFormsetGuid,\r
                        &gCVfrVarDataTypeDB,\r
                        (CHAR8 *) DateType,\r
                        EFI_VARSTORE_ID_INVALID\r
                        );\r
-    mCVfrDataStorage.GetVarStoreId((CHAR8 *) DateName, &VarStoreId, &mFormsetGuid);\r
+    gCVfrDataStorage.GetVarStoreId((CHAR8 *) DateName, &VarStoreId, &mFormsetGuid);\r
     VSObj.SetVarStoreId (VarStoreId);\r
     gCVfrVarDataTypeDB.GetDataTypeSize((CHAR8 *) DateType, &Size);\r
     VSObj.SetSize ((UINT16) Size);\r
@@ -5246,14 +5246,14 @@ EfiVfrParser::_DeclareDefaultLinearVarStore (
     CIfrVarStore      VSObj;\r
 \r
     VSObj.SetLineNo (LineNo);\r
-    mCVfrDataStorage.DeclareBufferVarStore (\r
+    gCVfrDataStorage.DeclareBufferVarStore (\r
                        (CHAR8 *) TimeName,\r
                        &mFormsetGuid,\r
                        &gCVfrVarDataTypeDB,\r
                        (CHAR8 *) TimeType,\r
                        EFI_VARSTORE_ID_INVALID\r
                        );\r
-    mCVfrDataStorage.GetVarStoreId((CHAR8 *) TimeName, &VarStoreId, &mFormsetGuid);\r
+    gCVfrDataStorage.GetVarStoreId((CHAR8 *) TimeName, &VarStoreId, &mFormsetGuid);\r
     VSObj.SetVarStoreId (VarStoreId);\r
     gCVfrVarDataTypeDB.GetDataTypeSize((CHAR8 *) TimeType, &Size);\r
     VSObj.SetSize ((UINT16) Size);\r
@@ -5272,7 +5272,7 @@ EfiVfrParser::_DeclareStandardDefaultStorage (
   //\r
   CIfrDefaultStore DSObj;\r
 \r
-  mCVfrDefaultStore.RegisterDefaultStore (DSObj.GetObjBinAddr(), (CHAR8 *) "Standard Defaults", EFI_STRING_ID_INVALID, EFI_HII_DEFAULT_CLASS_STANDARD);\r
+  gCVfrDefaultStore.RegisterDefaultStore (DSObj.GetObjBinAddr(), (CHAR8 *) "Standard Defaults", EFI_STRING_ID_INVALID, EFI_HII_DEFAULT_CLASS_STANDARD);\r
   DSObj.SetLineNo (LineNo);\r
   DSObj.SetDefaultName (EFI_STRING_ID_INVALID);\r
   DSObj.SetDefaultId (EFI_HII_DEFAULT_CLASS_STANDARD);\r
@@ -5282,7 +5282,7 @@ EfiVfrParser::_DeclareStandardDefaultStorage (
   //\r
   CIfrDefaultStore DSObjMF;\r
 \r
-  mCVfrDefaultStore.RegisterDefaultStore (DSObjMF.GetObjBinAddr(), (CHAR8 *) "Standard ManuFacturing", EFI_STRING_ID_INVALID, EFI_HII_DEFAULT_CLASS_MANUFACTURING);\r
+  gCVfrDefaultStore.RegisterDefaultStore (DSObjMF.GetObjBinAddr(), (CHAR8 *) "Standard ManuFacturing", EFI_STRING_ID_INVALID, EFI_HII_DEFAULT_CLASS_MANUFACTURING);\r
   DSObjMF.SetLineNo (LineNo);\r
   DSObjMF.SetDefaultName (EFI_STRING_ID_INVALID);\r
   DSObjMF.SetDefaultId (EFI_HII_DEFAULT_CLASS_MANUFACTURING);\r
index f73b70d794cc0851234b7a4493366501de4416c4..b3d1ac54ff3ffe2a5b077aff4fd0cd52de8bf742 100644 (file)
@@ -2,7 +2,7 @@
   \r
   Vfr common library functions.\r
 \r
-Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2016, 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
@@ -1419,6 +1419,8 @@ CVfrDataStorage::CVfrDataStorage (
   mNameVarStoreList        = NULL;\r
   mCurrVarStorageNode      = NULL;\r
   mNewVarStorageNode       = NULL;\r
+  mBufferFieldInfoListHead = NULL;\r
+  mBufferFieldInfoListTail = NULL;\r
 }\r
 \r
 CVfrDataStorage::~CVfrDataStorage (\r
@@ -1999,6 +2001,48 @@ CVfrDataStorage::GetEfiVarStoreInfo (
   return VFR_RETURN_SUCCESS;\r
 }\r
 \r
+EFI_VFR_RETURN_CODE\r
+CVfrDataStorage::AddBufferVarStoreFieldInfo (\r
+  IN EFI_VARSTORE_INFO  *Info\r
+  )\r
+{\r
+  BufferVarStoreFieldInfoNode *pNew;\r
+\r
+  if ((pNew = new BufferVarStoreFieldInfoNode(Info)) == NULL) {\r
+    return VFR_RETURN_FATAL_ERROR;\r
+  }\r
+\r
+  if (mBufferFieldInfoListHead == NULL) {\r
+    mBufferFieldInfoListHead = pNew;\r
+    mBufferFieldInfoListTail= pNew;\r
+  } else {\r
+    mBufferFieldInfoListTail->mNext = pNew;\r
+    mBufferFieldInfoListTail = pNew;\r
+  }\r
+\r
+  return VFR_RETURN_SUCCESS;\r
+}\r
+\r
+EFI_VFR_RETURN_CODE\r
+CVfrDataStorage::GetBufferVarStoreFieldInfo (\r
+  IN OUT EFI_VARSTORE_INFO  *Info\r
+  )\r
+{\r
+  BufferVarStoreFieldInfoNode *pNode;\r
+\r
+  pNode = mBufferFieldInfoListHead;\r
+  while (pNode != NULL) {\r
+    if (Info->mVarStoreId == pNode->mVarStoreInfo.mVarStoreId &&\r
+      Info->mInfo.mVarOffset == pNode->mVarStoreInfo.mInfo.mVarOffset) {\r
+      Info->mVarTotalSize = pNode->mVarStoreInfo.mVarTotalSize;\r
+      Info->mVarType      = pNode->mVarStoreInfo.mVarType;\r
+      return VFR_RETURN_SUCCESS;\r
+    }\r
+    pNode = pNode->mNext;\r
+  }\r
+  return VFR_RETURN_FATAL_ERROR;\r
+}\r
+\r
 EFI_VFR_RETURN_CODE\r
 CVfrDataStorage::GetNameVarStoreInfo (\r
   OUT EFI_VARSTORE_INFO  *Info,\r
@@ -2358,6 +2402,26 @@ EFI_VARSTORE_INFO::operator == (
   return FALSE;\r
 }\r
 \r
+BufferVarStoreFieldInfoNode::BufferVarStoreFieldInfoNode(\r
+  IN EFI_VARSTORE_INFO  *Info\r
+  )\r
+{\r
+  mVarStoreInfo.mVarType               = Info->mVarType;\r
+  mVarStoreInfo.mVarTotalSize          = Info->mVarTotalSize;\r
+  mVarStoreInfo.mInfo.mVarOffset       = Info->mInfo.mVarOffset;\r
+  mVarStoreInfo.mVarStoreId            = Info->mVarStoreId;\r
+  mNext = NULL;\r
+}\r
+\r
+BufferVarStoreFieldInfoNode::~BufferVarStoreFieldInfoNode ()\r
+{\r
+  mVarStoreInfo.mVarType               = EFI_IFR_TYPE_OTHER;\r
+  mVarStoreInfo.mVarTotalSize          = 0;\r
+  mVarStoreInfo.mInfo.mVarOffset       = EFI_VAROFFSET_INVALID;\r
+  mVarStoreInfo.mVarStoreId            = EFI_VARSTORE_ID_INVALID;\r
+  mNext = NULL;\r
+}\r
+\r
 static EFI_VARSTORE_INFO gEfiInvalidVarStoreInfo;\r
 \r
 EFI_QUESTION_ID\r
@@ -3632,5 +3696,7 @@ CVfrStringDB::GetUnicodeStringTextSize (
 BOOLEAN  VfrCompatibleMode = FALSE;\r
 \r
 CVfrVarDataTypeDB gCVfrVarDataTypeDB;\r
+CVfrDefaultStore  gCVfrDefaultStore;\r
+CVfrDataStorage  gCVfrDataStorage;\r
 \r
 \r
index c8f5333641bb6607d59c81d9aa39c7a010fca106..5faa1f40fdcfdfb480bfaba6d0fa1f01ad7eb916 100644 (file)
@@ -2,7 +2,7 @@
   \r
   Vfr common library functions.\r
 \r
-Copyright (c) 2004 - 2013, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2016, 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
@@ -265,6 +265,14 @@ struct EFI_VARSTORE_INFO {
   BOOLEAN operator == (IN EFI_VARSTORE_INFO *);\r
 };\r
 \r
+struct BufferVarStoreFieldInfoNode {\r
+  EFI_VARSTORE_INFO  mVarStoreInfo;\r
+  struct BufferVarStoreFieldInfoNode *mNext;\r
+\r
+  BufferVarStoreFieldInfoNode( IN EFI_VARSTORE_INFO  *Info );\r
+  ~BufferVarStoreFieldInfoNode ();\r
+};\r
+\r
 #define EFI_VARSTORE_ID_MAX              0xFFFF\r
 #define EFI_FREE_VARSTORE_ID_BITMAP_SIZE ((EFI_VARSTORE_ID_MAX + 1) / EFI_BITS_PER_UINT32)\r
 \r
@@ -278,6 +286,8 @@ private:
 \r
   struct SVfrVarStorageNode *mCurrVarStorageNode;\r
   struct SVfrVarStorageNode *mNewVarStorageNode;\r
+  BufferVarStoreFieldInfoNode    *mBufferFieldInfoListHead;\r
+  BufferVarStoreFieldInfoNode    *mBufferFieldInfoListTail;\r
 \r
 private:\r
 \r
@@ -317,8 +327,12 @@ public:
   EFI_VFR_RETURN_CODE GetBufferVarStoreDataTypeName (IN EFI_VARSTORE_ID, OUT CHAR8 **);\r
   EFI_VFR_RETURN_CODE GetEfiVarStoreInfo (IN EFI_VARSTORE_INFO *);\r
   EFI_VFR_RETURN_CODE GetNameVarStoreInfo (IN EFI_VARSTORE_INFO *, IN UINT32);\r
+  EFI_VFR_RETURN_CODE AddBufferVarStoreFieldInfo (IN EFI_VARSTORE_INFO *);\r
+  EFI_VFR_RETURN_CODE GetBufferVarStoreFieldInfo (IN OUT EFI_VARSTORE_INFO *);\r
 };\r
 \r
+extern CVfrDataStorage gCVfrDataStorage;\r
+\r
 #define EFI_QUESTION_ID_MAX              0xFFFF\r
 #define EFI_FREE_QUESTION_ID_BITMAP_SIZE ((EFI_QUESTION_ID_MAX + 1) / EFI_BITS_PER_UINT32)\r
 #define EFI_QUESTION_ID_INVALID          0x0\r
@@ -402,6 +416,8 @@ public:
   EFI_VFR_RETURN_CODE BufferVarStoreAltConfigAdd (IN EFI_VARSTORE_ID, IN EFI_VARSTORE_INFO &, IN CHAR8 *, IN EFI_GUID *, IN UINT8, IN EFI_IFR_TYPE_VALUE);\r
 };\r
 \r
+extern CVfrDefaultStore gCVfrDefaultStore;\r
+\r
 #define EFI_RULE_ID_START    0x01\r
 #define EFI_RULE_ID_INVALID  0x00\r
 \r