]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/C/VfrCompile/VfrFormPkg.cpp
Sync BaseTool trunk (version r2599) into EDKII BaseTools.
[mirror_edk2.git] / BaseTools / Source / C / VfrCompile / VfrFormPkg.cpp
index 2e859b8dfa626826c668d2697bc6de921af26bd2..7cadf0f42b892654f10ea291add71a999b288b04 100644 (file)
@@ -2,7 +2,7 @@
   \r
   The definition of CFormPkg's member function\r
 \r
-Copyright (c) 2004 - 2012, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2013, 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
@@ -152,12 +152,39 @@ CFormPkg::~CFormPkg ()
   PendingAssignList = NULL;\r
 }\r
 \r
+SBufferNode *\r
+CFormPkg::CreateNewNode (\r
+  VOID\r
+  )\r
+{\r
+  SBufferNode *Node;\r
+\r
+  Node = new SBufferNode;\r
+  if (Node == NULL) {\r
+    return NULL;\r
+  }\r
+\r
+  Node->mBufferStart = new CHAR8[mBufferSize];\r
+  if (Node->mBufferStart == NULL) {\r
+    delete Node;\r
+    return NULL;\r
+  } else {\r
+    memset (Node->mBufferStart, 0, mBufferSize);\r
+    Node->mBufferEnd  = Node->mBufferStart + mBufferSize;\r
+    Node->mBufferFree = Node->mBufferStart;\r
+    Node->mNext       = NULL;\r
+  }\r
+\r
+  return Node;\r
+}\r
+\r
 CHAR8 *\r
 CFormPkg::IfrBinBufferGet (\r
   IN UINT32 Len\r
   )\r
 {\r
-  CHAR8 *BinBuffer = NULL;\r
+  CHAR8       *BinBuffer = NULL;\r
+  SBufferNode *Node      = NULL;\r
 \r
   if ((Len == 0) || (Len > mBufferSize)) {\r
     return NULL;\r
@@ -167,24 +194,11 @@ CFormPkg::IfrBinBufferGet (
     BinBuffer = mCurrBufferNode->mBufferFree;\r
     mCurrBufferNode->mBufferFree += Len;\r
   } else {\r
-    SBufferNode *Node;\r
-\r
-    Node = new SBufferNode;\r
+    Node = CreateNewNode ();\r
     if (Node == NULL) {\r
       return NULL;\r
     }\r
 \r
-    Node->mBufferStart = new CHAR8[mBufferSize];\r
-    if (Node->mBufferStart == NULL) {\r
-      delete Node;\r
-      return NULL;\r
-    } else {\r
-      memset (Node->mBufferStart, 0, mBufferSize);\r
-      Node->mBufferEnd  = Node->mBufferStart + mBufferSize;\r
-      Node->mBufferFree = Node->mBufferStart;\r
-      Node->mNext       = NULL;\r
-    }\r
-\r
     if (mBufferNodeQueueTail == NULL) {\r
       mBufferNodeQueueHead = mBufferNodeQueueTail = Node;\r
     } else {\r
@@ -245,7 +259,7 @@ CFormPkg::Read (
   }\r
 \r
   if (mReadBufferNode == NULL) {\r
-       return 0;\r
+    return 0;\r
   }\r
 \r
   for (Index = 0; Index < Size; Index++) {\r
@@ -256,7 +270,7 @@ CFormPkg::Read (
         return Index;\r
       } else {\r
         mReadBufferOffset = 0;\r
-        Buffer[Index] = mReadBufferNode->mBufferStart[mReadBufferOffset++];\r
+        Index --;\r
       }\r
     }\r
   }\r
@@ -402,6 +416,9 @@ CFormPkg::_WRITE_PKG_END (
 }\r
 \r
 #define BYTES_PRE_LINE 0x10\r
+UINT32   gAdjustOpcodeOffset = 0;\r
+BOOLEAN  gNeedAdjustOpcode   = FALSE;\r
+UINT32   gAdjustOpcodeLen    = 0;\r
 \r
 EFI_VFR_RETURN_CODE \r
 CFormPkg::GenCFile (\r
@@ -548,13 +565,236 @@ CFormPkg::PendingAssignPrintAll (
   }\r
 }\r
 \r
+SBufferNode *\r
+CFormPkg::GetBinBufferNodeForAddr (\r
+  IN CHAR8              *BinBuffAddr\r
+  )\r
+{\r
+  SBufferNode *TmpNode;\r
+\r
+  TmpNode = mBufferNodeQueueHead;\r
+\r
+  while (TmpNode != NULL) {\r
+    if (TmpNode->mBufferStart <= BinBuffAddr && TmpNode->mBufferFree >= BinBuffAddr) {\r
+      return TmpNode;\r
+    }\r
+\r
+    TmpNode = TmpNode->mNext;\r
+  }\r
+\r
+  return NULL;\r
+}\r
+\r
+SBufferNode *\r
+CFormPkg::GetNodeBefore(\r
+  IN SBufferNode *CurrentNode\r
+  )\r
+{\r
+  SBufferNode *FirstNode   = mBufferNodeQueueHead;\r
+  SBufferNode *LastNode    = mBufferNodeQueueHead;\r
+\r
+  while (FirstNode != NULL) {\r
+    if (FirstNode == CurrentNode) {\r
+      break;\r
+    }\r
+\r
+    LastNode    = FirstNode;\r
+    FirstNode   = FirstNode->mNext;\r
+  }\r
+\r
+  if (FirstNode == NULL) {\r
+    LastNode = NULL;\r
+  }\r
+\r
+  return LastNode;\r
+}\r
+\r
+EFI_VFR_RETURN_CODE\r
+CFormPkg::InsertNodeBefore(\r
+  IN SBufferNode *CurrentNode,\r
+  IN SBufferNode *NewNode\r
+  )\r
+{\r
+  SBufferNode *LastNode = GetNodeBefore (CurrentNode);\r
+\r
+  if (LastNode == NULL) {\r
+    return VFR_RETURN_MISMATCHED;\r
+  }\r
+\r
+  NewNode->mNext = LastNode->mNext;\r
+  LastNode->mNext = NewNode;\r
+\r
+  return VFR_RETURN_SUCCESS;\r
+}\r
+\r
+CHAR8 *\r
+CFormPkg::GetBufAddrBaseOnOffset (\r
+  IN UINT32      Offset\r
+  )\r
+{\r
+  SBufferNode *TmpNode;\r
+  UINT32      TotalBufLen;\r
+  UINT32      CurrentBufLen;\r
+\r
+  TotalBufLen = 0;\r
+\r
+  for (TmpNode = mBufferNodeQueueHead; TmpNode != NULL; TmpNode = TmpNode->mNext) {\r
+    CurrentBufLen = TmpNode->mBufferFree - TmpNode->mBufferStart;\r
+    if (Offset >= TotalBufLen && Offset < TotalBufLen + CurrentBufLen) {\r
+      return TmpNode->mBufferStart + (Offset - TotalBufLen);\r
+    }\r
+\r
+    TotalBufLen += CurrentBufLen;\r
+  }\r
+\r
+  return NULL;\r
+}\r
+\r
+EFI_VFR_RETURN_CODE\r
+CFormPkg::AdjustDynamicInsertOpcode (\r
+  IN CHAR8              *LastFormEndAddr,\r
+  IN CHAR8              *InsertOpcodeAddr\r
+  )\r
+{\r
+  SBufferNode *LastFormEndNode;\r
+  SBufferNode *InsertOpcodeNode;\r
+  SBufferNode *NewRestoreNodeBegin;\r
+  SBufferNode *NewRestoreNodeEnd;\r
+  SBufferNode *NewLastEndNode;\r
+  SBufferNode *TmpNode;\r
+  UINT32      NeedRestoreCodeLen;\r
+\r
+  NewRestoreNodeEnd = NULL;\r
+\r
+  LastFormEndNode  = GetBinBufferNodeForAddr(LastFormEndAddr);\r
+  InsertOpcodeNode = GetBinBufferNodeForAddr(InsertOpcodeAddr);\r
+\r
+  if (LastFormEndNode == InsertOpcodeNode) {\r
+    //\r
+    // Create New Node to save the restore opcode.\r
+    //\r
+    NeedRestoreCodeLen = InsertOpcodeAddr - LastFormEndAddr;\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
+    NewRestoreNodeBegin->mBufferFree += NeedRestoreCodeLen;\r
+\r
+    //\r
+    // Override the restore buffer data.\r
+    //\r
+    memcpy (LastFormEndAddr, 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
+    gAdjustOpcodeLen   = NeedRestoreCodeLen;\r
+    NewRestoreNodeBegin = CreateNewNode ();\r
+    if (NewRestoreNodeBegin == NULL) {\r
+      return VFR_RETURN_OUT_FOR_RESOURCES;\r
+    }\r
+    memcpy (NewRestoreNodeBegin->mBufferFree, LastFormEndAddr, NeedRestoreCodeLen);\r
+    NewRestoreNodeBegin->mBufferFree += NeedRestoreCodeLen;\r
+    //\r
+    // Override the restore buffer data.\r
+    //\r
+    LastFormEndNode->mBufferFree -= NeedRestoreCodeLen;\r
+    //\r
+    // Link the restore data to new node.\r
+    //\r
+    NewRestoreNodeBegin->mNext = LastFormEndNode->mNext;\r
+\r
+    //\r
+    // Count the Adjust opcode len.\r
+    //\r
+    TmpNode = LastFormEndNode->mNext;\r
+    while (TmpNode != InsertOpcodeNode) {\r
+      gAdjustOpcodeLen += TmpNode->mBufferFree - TmpNode->mBufferStart;\r
+      TmpNode = TmpNode->mNext;\r
+    }\r
+\r
+    //\r
+    // Create New Node to save the last node of restore opcode.\r
+    //\r
+    NeedRestoreCodeLen = InsertOpcodeAddr - InsertOpcodeNode->mBufferStart;\r
+    gAdjustOpcodeLen  += NeedRestoreCodeLen;\r
+    if (NeedRestoreCodeLen > 0) {\r
+      NewRestoreNodeEnd = CreateNewNode ();\r
+      if (NewRestoreNodeEnd == NULL) {\r
+        return VFR_RETURN_OUT_FOR_RESOURCES;\r
+      }\r
+      memcpy (NewRestoreNodeEnd->mBufferFree, InsertOpcodeNode->mBufferStart, NeedRestoreCodeLen);\r
+      NewRestoreNodeEnd->mBufferFree += NeedRestoreCodeLen;\r
+      //\r
+      // Override the restore buffer data.\r
+      //\r
+      memcpy (InsertOpcodeNode->mBufferStart, InsertOpcodeAddr, InsertOpcodeNode->mBufferFree - InsertOpcodeAddr);\r
+      InsertOpcodeNode->mBufferFree -= InsertOpcodeAddr - InsertOpcodeNode->mBufferStart;\r
+\r
+      //\r
+      // Insert the last restore data node.\r
+      //\r
+      TmpNode = GetNodeBefore (InsertOpcodeNode);\r
+      if (TmpNode == LastFormEndNode) {\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
+      //\r
+      LastFormEndNode->mNext = InsertOpcodeNode;\r
+    }\r
+  }\r
+\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->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
+  return VFR_RETURN_SUCCESS;\r
+}\r
+\r
 EFI_VFR_RETURN_CODE\r
 CFormPkg::DeclarePendingQuestion (\r
   IN CVfrVarDataTypeDB   &lCVfrVarDataTypeDB,\r
   IN CVfrDataStorage     &lCVfrDataStorage,\r
   IN CVfrQuestionDB      &lCVfrQuestionDB,\r
   IN EFI_GUID            *LocalFormSetGuid,\r
-  IN UINT32 LineNo\r
+  IN UINT32              LineNo,\r
+  OUT CHAR8              **InsertOpcodeAddr\r
   )\r
 {\r
   SPendingAssign *pNode;\r
@@ -563,8 +803,10 @@ CFormPkg::DeclarePendingQuestion (
   CHAR8          FName[MAX_NAME_LEN];\r
   CHAR8          *SName;\r
   CHAR8          *NewStr;\r
+  UINT32         ShrinkSize;\r
   EFI_VFR_RETURN_CODE  ReturnCode;\r
   EFI_VFR_VARSTORE_TYPE VarStoreType  = EFI_VFR_VARSTORE_INVALID;\r
+  EFI_VARSTORE_ID       VarStoreId    = EFI_VARSTORE_ID_INVALID;\r
 \r
   //\r
   // Declare all questions as Numeric in DisableIf True\r
@@ -572,6 +814,7 @@ CFormPkg::DeclarePendingQuestion (
   // DisableIf\r
   CIfrDisableIf DIObj;\r
   DIObj.SetLineNo (LineNo);\r
+  *InsertOpcodeAddr = DIObj.GetObjBinAddr ();\r
   \r
   //TrueOpcode\r
   CIfrTrue TObj (LineNo);\r
@@ -581,7 +824,7 @@ CFormPkg::DeclarePendingQuestion (
     if (pNode->mFlag == PENDING) {\r
       CIfrNumeric CNObj;\r
       EFI_VARSTORE_INFO Info; \r
-         EFI_QUESTION_ID   QId   = EFI_QUESTION_ID_INVALID;\r
+      EFI_QUESTION_ID   QId   = EFI_QUESTION_ID_INVALID;\r
 \r
       CNObj.SetLineNo (LineNo);\r
       CNObj.SetPrompt (0x0);\r
@@ -611,7 +854,7 @@ CFormPkg::DeclarePendingQuestion (
       //\r
       // Get VarStoreType\r
       //\r
-      ReturnCode = lCVfrDataStorage.GetVarStoreType (FName, VarStoreType);\r
+      ReturnCode = lCVfrDataStorage.GetVarStoreId (FName, &Info.mVarStoreId);\r
       if (ReturnCode == VFR_RETURN_UNDEFINED) {\r
         lCVfrDataStorage.DeclareBufferVarStore (\r
                            FName, \r
@@ -621,18 +864,13 @@ CFormPkg::DeclarePendingQuestion (
                            EFI_VARSTORE_ID_INVALID,\r
                            FALSE\r
                            );\r
-        ReturnCode = lCVfrDataStorage.GetVarStoreType (FName, VarStoreType);  \r
+        ReturnCode = lCVfrDataStorage.GetVarStoreId (FName, &Info.mVarStoreId, LocalFormSetGuid); \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
+      VarStoreType = lCVfrDataStorage.GetVarStoreType (Info.mVarStoreId); \r
 \r
       if (*VarStr == '\0' && ArrayIdx != INVALID_ARRAY_INDEX) {\r
         ReturnCode = lCVfrDataStorage.GetNameVarStoreInfo (&Info, ArrayIdx);\r
@@ -642,7 +880,7 @@ CFormPkg::DeclarePendingQuestion (
         } else if (VarStoreType == EFI_VFR_VARSTORE_BUFFER) {\r
           VarStr = pNode->mKey;\r
           //convert VarStr with store name to VarStr with structure name\r
-          ReturnCode = lCVfrDataStorage.GetBufferVarStoreDataTypeName (FName, &SName);\r
+          ReturnCode = lCVfrDataStorage.GetBufferVarStoreDataTypeName (Info.mVarStoreId, &SName);\r
           if (ReturnCode == VFR_RETURN_SUCCESS) {\r
             NewStr = new CHAR8[strlen (VarStr) + strlen (SName) + 1];\r
             NewStr[0] = '\0';\r
@@ -676,19 +914,24 @@ CFormPkg::DeclarePendingQuestion (
       switch (Info.mVarType) {\r
       case EFI_IFR_TYPE_NUM_SIZE_64:\r
         CNObj.SetMinMaxStepData ((UINT64) 0, (UINT64) -1 , (UINT64) 0);\r
+        ShrinkSize = 0;\r
         break;\r
       case EFI_IFR_TYPE_NUM_SIZE_32:\r
         CNObj.SetMinMaxStepData ((UINT32) 0, (UINT32) -1 , (UINT32) 0);\r
+        ShrinkSize = 12;\r
         break;\r
       case EFI_IFR_TYPE_NUM_SIZE_16:\r
         CNObj.SetMinMaxStepData ((UINT16) 0, (UINT16) -1 , (UINT16) 0);\r
+        ShrinkSize = 18;\r
         break;\r
       case EFI_IFR_TYPE_NUM_SIZE_8:\r
         CNObj.SetMinMaxStepData ((UINT8) 0, (UINT8) -1 , (UINT8) 0);\r
+        ShrinkSize = 21;\r
         break;\r
       default:\r
         break;\r
       }\r
+      CNObj.ShrinkBinSize (ShrinkSize);\r
 \r
       //\r
       // For undefined Efi VarStore type question\r
@@ -698,7 +941,7 @@ CFormPkg::DeclarePendingQuestion (
         CIfrVarEqName CVNObj (QId, Info.mInfo.mVarName);\r
         CVNObj.SetLineNo (LineNo);\r
       }\r
-      \r
+\r
       //\r
       // End for Numeric\r
       //\r
@@ -983,6 +1226,94 @@ CIfrRecordInfoDB::GetOpcodeQuestionId (
   return QuestionHead->QuestionId;\r
 }\r
 \r
+SIfrRecord *\r
+CIfrRecordInfoDB::GetRecordInfoFromOffset (\r
+  IN UINT32 Offset\r
+  )\r
+{\r
+  SIfrRecord *pNode = NULL;\r
+\r
+  for (pNode = mIfrRecordListHead; pNode != NULL; pNode = pNode->mNext) {\r
+    if (pNode->mOffset == Offset) {\r
+      return pNode;\r
+    }\r
+  }\r
+\r
+  return pNode;\r
+}\r
+\r
+/*\r
+  Add just the op code position.\r
+\r
+  From\r
+  \r
+  | form end opcode + end of if opcode for form ... + Dynamic opcode + form set end opcode |\r
+  \r
+  To\r
+  \r
+  | Dynamic opcode + form end opcode + end of if opcode for form ... + form set end opcode |\r
+\r
+*/\r
+BOOLEAN\r
+CIfrRecordInfoDB::IfrAdjustDynamicOpcodeInRecords (\r
+  VOID\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
+\r
+  //\r
+  // Base on the offset info to get the node.\r
+  //\r
+  for (pNode = mIfrRecordListHead; pNode->mNext != NULL; pPreNode = pNode,pNode = pNode->mNext) {\r
+    if (OpcodeOffset == gAdjustOpcodeOffset) {\r
+      pStartNode       = pNode;\r
+      pNodeBeforeStart = pPreNode;\r
+    } else if (OpcodeOffset == gAdjustOpcodeOffset + gAdjustOpcodeLen) {\r
+      pEndNode = pPreNode;\r
+    }\r
+\r
+    OpcodeOffset += pNode->mBinBufLen;\r
+  }\r
+\r
+  //\r
+  // Check the value.\r
+  //\r
+  if (pEndNode == NULL || pStartNode == 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
+\r
+  return TRUE;\r
+}\r
+\r
+VOID\r
+CIfrRecordInfoDB::IfrAdjustOffsetForRecord (\r
+  VOID\r
+  )\r
+{\r
+  UINT32             OpcodeOffset;\r
+  SIfrRecord         *pNode;\r
+\r
+  OpcodeOffset = 0;\r
+  for (pNode = mIfrRecordListHead; pNode != NULL; pNode = pNode->mNext) {\r
+    pNode->mOffset = OpcodeOffset;\r
+    OpcodeOffset += pNode->mBinBufLen;\r
+  }\r
+}\r
+\r
 EFI_VFR_RETURN_CODE\r
 CIfrRecordInfoDB::IfrRecordAdjust (\r
   VOID\r
@@ -1195,11 +1526,7 @@ CIfrRecordInfoDB::IfrRecordAdjust (
   // Update Ifr Opcode Offset\r
   //\r
   if (Status == VFR_RETURN_SUCCESS) {\r
-    OpcodeOffset = 0;\r
-    for (pNode = mIfrRecordListHead; pNode != NULL; pNode = pNode->mNext) {\r
-      pNode->mOffset = OpcodeOffset;\r
-      OpcodeOffset += pNode->mBinBufLen;\r
-    }\r
+    IfrAdjustOffsetForRecord ();\r
   }\r
   return Status;\r
 }\r
@@ -1344,7 +1671,7 @@ static struct {
   { sizeof (EFI_IFR_CATENATE), 0 },            // EFI_IFR_CATENATE_OP\r
   { sizeof (EFI_IFR_GUID), 0 },                // EFI_IFR_GUID_OP\r
   { sizeof (EFI_IFR_SECURITY), 0 },            // EFI_IFR_SECURITY_OP - 0x60\r
-  { sizeof (EFI_IFR_MODAL), 0},                // EFI_IFR_MODAL_OP - 0x61\r
+  { sizeof (EFI_IFR_MODAL_TAG), 0},            // EFI_IFR_MODAL_TAG_OP - 0x61\r
   { sizeof (EFI_IFR_REFRESH_ID), 0},           // EFI_IFR_REFRESH_ID_OP - 0x62\r
 };\r
 \r
@@ -1368,7 +1695,7 @@ static struct {
   "EFI_IFR_STRING_REF1","EFI_IFR_STRING_REF2",          "EFI_IFR_CONDITIONAL",   "EFI_IFR_QUESTION_REF3",   "EFI_IFR_ZERO",          "EFI_IFR_ONE",\r
   "EFI_IFR_ONES",       "EFI_IFR_UNDEFINED",            "EFI_IFR_LENGTH",        "EFI_IFR_DUP",             "EFI_IFR_THIS",          "EFI_IFR_SPAN",\r
   "EFI_IFR_VALUE",      "EFI_IFR_DEFAULT",              "EFI_IFR_DEFAULTSTORE",  "EFI_IFR_FORM_MAP",        "EFI_IFR_CATENATE",      "EFI_IFR_GUID",\r
-  "EFI_IFR_SECURITY",   "EFI_IFR_MODAL",                "EFI_IFR_REFRESH_ID",\r
+  "EFI_IFR_SECURITY",   "EFI_IFR_MODAL_TAG",            "EFI_IFR_REFRESH_ID",\r
 };\r
 \r
 VOID\r