]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrUtilityLib.cpp
Sync all bug fixes between EDK1.04 and EDK1.06 into EdkCompatibilityPkg.
[mirror_edk2.git] / EdkCompatibilityPkg / Sample / Tools / Source / UefiVfrCompile / VfrUtilityLib.cpp
index 1080095c873df360617636f6b720d8492edf1793..d6f5f437f25b60eb274f2c2d78e44a5b654df5e4 100644 (file)
@@ -1,7 +1,6 @@
 /*++\r
-\r
-Copyright (c) 2004 - 2010, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
+Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
 http://opensource.org/licenses/bsd-license.php\r
@@ -10,8 +9,7 @@ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
 \r
 Module Name:\r
-\r
-VfrUtilityLib.cpp\r
+  VfrUtilityLib.cpp\r
 \r
 Abstract:\r
 \r
@@ -74,12 +72,13 @@ CVfrBinaryOutput::WriteEnd (
 }\r
 \r
 SConfigInfo::SConfigInfo (\r
-  IN UINT8              Type, \r
-  IN UINT16             Offset, \r
-  IN UINT32             Width, \r
+  IN UINT8              Type,\r
+  IN UINT16             Offset,\r
+  IN UINT32             Width,\r
   IN EFI_IFR_TYPE_VALUE Value\r
   )\r
 {\r
+  mNext   = NULL;\r
   mOffset = Offset;\r
   mWidth  = (UINT16)Width;\r
   mValue  = new UINT8[mWidth];\r
@@ -125,51 +124,51 @@ SConfigInfo::~SConfigInfo (
 }\r
 \r
 SConfigItem::SConfigItem (\r
-  IN INT8                *Id, \r
-  IN INT8                *Info\r
+  IN INT8                *Name,\r
+  IN INT8                *Id\r
   )\r
 {\r
-  mId          = NULL;\r
-  mInfo        = NULL;\r
+  mName          = NULL;\r
+  mId            = NULL;\r
   mInfoStrList = NULL;\r
   mNext        = NULL;\r
 \r
-  if (Id != NULL) {\r
-    if ((mId = new INT8[strlen (Id) + 1]) != NULL) {\r
-      strcpy (mId, Id);\r
+  if (Name != NULL) {\r
+    if ((mName = new INT8[strlen (Name) + 1]) != NULL) {\r
+      strcpy (mName, Name);\r
     }\r
   }\r
 \r
-  if (Info != NULL) {\r
-    if ((mInfo = new INT8[strlen (Info) + 1]) != NULL) {\r
-      strcpy (mInfo, Info);\r
+  if (Id != NULL) {\r
+    if ((mId = new INT8[strlen (Id) + 1]) != NULL) {\r
+      strcpy (mId, Id);\r
     }\r
   }\r
 }\r
 \r
 SConfigItem::SConfigItem (\r
-  IN INT8                *Id, \r
-  IN INT8                *Info,\r
+  IN INT8                *Name,\r
+  IN INT8                *Id,\r
   IN UINT8               Type,\r
   IN UINT16              Offset,\r
   IN UINT16              Width,\r
   IN EFI_IFR_TYPE_VALUE  Value\r
   )\r
 {\r
+  mName        = NULL;\r
   mId          = NULL;\r
-  mInfo        = NULL;\r
   mInfoStrList = NULL;\r
   mNext        = NULL;\r
 \r
-  if (Id != NULL) {\r
-    if ((mId = new INT8[strlen (Id) + 1]) != NULL) {\r
-      strcpy (mId, Id);\r
+  if (Name != NULL) {\r
+    if ((mName = new INT8[strlen (Name) + 1]) != NULL) {\r
+      strcpy (mName, Name);\r
     }\r
   }\r
 \r
-  if (Info != NULL) {\r
-    if ((mInfo = new INT8[strlen (Info) + 1]) != NULL) {\r
-      strcpy (mInfo, Info);\r
+  if (Id != NULL) {\r
+    if ((mId = new INT8[strlen (Id) + 1]) != NULL) {\r
+      strcpy (mId, Id);\r
     }\r
   }\r
 \r
@@ -182,8 +181,8 @@ SConfigItem::~SConfigItem (
 {\r
   SConfigInfo  *Info;\r
 \r
+  BUFFER_SAFE_FREE (mName);\r
   BUFFER_SAFE_FREE (mId);\r
-  BUFFER_SAFE_FREE (mInfo);\r
   while (mInfoStrList != NULL) {\r
     Info = mInfoStrList;\r
     mInfoStrList = mInfoStrList->mNext;\r
@@ -194,17 +193,17 @@ SConfigItem::~SConfigItem (
 \r
 UINT8\r
 CVfrBufferConfig::Register (\r
-  IN INT8                *Id, \r
-  IN INT8                *Info\r
+  IN INT8                *Name,\r
+  IN INT8                *Id\r
   )\r
 {\r
   SConfigItem *pNew;\r
 \r
-  if (Select (Id) == 0) {\r
+  if (Select (Name) == 0) {\r
     return 1;\r
   }\r
 \r
-  if ((pNew = new SConfigItem (Id, Info)) == NULL) {\r
+  if ((pNew = new SConfigItem (Name, Id)) == NULL) {\r
     return 2;\r
   }\r
   if (mItemListHead == NULL) {\r
@@ -237,25 +236,27 @@ CVfrBufferConfig::Eof(
 \r
 UINT8\r
 CVfrBufferConfig::Select (\r
-  IN INT8 *Id,\r
-  IN INT8 *Info\r
+  IN INT8  *Name,\r
+  IN INT8  *Id\r
   )\r
 {\r
   SConfigItem *p;\r
 \r
-  if (Id == NULL) {\r
+  if (Name == NULL) {\r
     mItemListPos = mItemListHead;\r
     return 0;\r
   } else {\r
     for (p = mItemListHead; p != NULL; p = p->mNext) {\r
-      if (strcmp (p->mId, Id) != 0) {\r
+      if (strcmp (p->mName, Name) != 0) {\r
         continue;\r
       }\r
 \r
-      if ((p->mInfo != NULL) && (Info != NULL)) {\r
-        if (strcmp (p->mInfo, Info) != 0) {\r
+      if (Id != NULL) {\r
+        if (p->mId == NULL || strcmp (p->mId, Id) != 0) {\r
           continue;\r
         }\r
+      } else if (p->mId != NULL) {\r
+        continue;\r
       }\r
 \r
       mItemListPos = p;\r
@@ -269,8 +270,8 @@ CVfrBufferConfig::Select (
 UINT8\r
 CVfrBufferConfig::Write (\r
   IN CONST CHAR8         Mode,\r
-  IN INT8                *Id, \r
-  IN INT8                *Info,\r
+  IN INT8                *Name,\r
+  IN INT8                *Id,\r
   IN UINT8               Type,\r
   IN UINT16              Offset,\r
   IN UINT32              Width,\r
@@ -281,16 +282,14 @@ CVfrBufferConfig::Write (
   SConfigItem   *pItem;\r
   SConfigInfo   *pInfo;\r
 \r
+  if ((Ret = Select (Name)) != 0) {\r
+    return Ret;\r
+  }\r
+\r
   switch (Mode) {\r
   case 'a' : // add\r
-    if (Select (Id) == 0) {\r
-      if((pInfo = new SConfigInfo (Type, Offset, Width, Value)) == NULL) {\r
-        return 2;\r
-      }\r
-      pInfo->mNext = mItemListPos->mInfoStrList;\r
-      mItemListPos->mInfoStrList = pInfo;\r
-    } else {\r
-      if ((pItem = new SConfigItem (Id, Info, Type, Offset, Width, Value)) == NULL) {\r
+    if (Select (Name, Id) != 0) {\r
+      if ((pItem = new SConfigItem (Name, Id, Type, Offset, Width, Value)) == NULL) {\r
         return 2;\r
       }\r
       if (mItemListHead == NULL) {\r
@@ -301,14 +300,26 @@ CVfrBufferConfig::Write (
         mItemListTail = pItem;\r
       }\r
       mItemListPos = pItem;\r
+    } else {\r
+      // tranverse the list to find out if there's already the value for the same offset\r
+      for (pInfo = mItemListPos->mInfoStrList; pInfo != NULL; pInfo = pInfo->mNext) {\r
+        if (pInfo->mOffset == Offset) {\r
+          // check if the value and width are the same; return error if not\r
+          if ((Id != NULL) && (pInfo->mWidth != Width || memcmp(pInfo->mValue, &Value, Width) != 0)) {\r
+            return VFR_RETURN_DEFAULT_VALUE_REDEFINED;\r
+          }\r
+          return 0;\r
+        }\r
+      }\r
+      if((pInfo = new SConfigInfo (Type, Offset, Width, Value)) == NULL) {\r
+        return 2;\r
+      }\r
+      pInfo->mNext = mItemListPos->mInfoStrList;\r
+      mItemListPos->mInfoStrList = pInfo;\r
     }\r
     break;\r
 \r
   case 'd' : // delete\r
-    if ((Ret = Select (Id)) != 0) {\r
-      return Ret;\r
-    }\r
-\r
     if (mItemListHead == mItemListPos) {\r
       mItemListHead = mItemListPos->mNext;\r
       delete mItemListPos;\r
@@ -327,18 +338,15 @@ CVfrBufferConfig::Write (
     break;\r
 \r
   case 'i' : // set info\r
-    if ((Ret = Select (Id)) != 0) {\r
-      return Ret;\r
-    }\r
-    if (mItemListPos->mInfo != NULL) {\r
-      delete mItemListPos->mInfo;\r
+    if (mItemListPos->mId != NULL) {\r
+      delete mItemListPos->mId;\r
     }\r
-    mItemListPos->mInfo = NULL;\r
-    if (Info != NULL) {\r
-      if ((mItemListPos->mInfo = new INT8[strlen (Info) + 1]) == NULL) {\r
+    mItemListPos->mId = NULL;\r
+    if (Id != NULL) {\r
+      if ((mItemListPos->mId = new INT8[strlen (Id) + 1]) == NULL) {\r
         return 2;\r
       }\r
-      strcpy (mItemListPos->mInfo, Info);\r
+      strcpy (mItemListPos->mId, Id);\r
     }\r
     break;\r
 \r
@@ -352,29 +360,29 @@ CVfrBufferConfig::Write (
 #if 0\r
 UINT8\r
 CVfrBufferConfig::ReadId (\r
-  OUT INT8   **Id, \r
-  OUT INT8   **Info\r
+  OUT INT8   **Name,\r
+  OUT INT8   **Id\r
   )\r
 {\r
   if (mInfoStrItemListPos == NULL) {\r
     return 1; // end read or some error occur\r
   }\r
 \r
+  if (Name != NULL) {\r
+    *Name = new INT8 (strlen (mInfoStrItemListPos->mName + 1));\r
+    strcpy (*Name, mInfoStrItemListPos->mName);\r
+  }\r
   if (Id != NULL) {\r
     *Id = new INT8 (strlen (mInfoStrItemListPos->mId + 1));\r
     strcpy (*Id, mInfoStrItemListPos->mId);\r
   }\r
-  if (Info != NULL) {\r
-    *Info = new INT8 (strlen (mInfoStrItemListPos->mInfo + 1));\r
-    strcpy (*Info, mInfoStrItemListPos->mInfo);\r
-  }\r
 \r
   return 0;\r
 }\r
 \r
 UINT8\r
 CVfrBufferConfig::ReadInfo (\r
-  IN  INT8      *Id, \r
+  IN  INT8      *Name,\r
   IN  UINT32    Index,\r
   IN OUT UINT32 &Number,\r
   OUT INT8      *Offset,\r
@@ -387,8 +395,8 @@ CVfrBufferConfig::ReadInfo (
   UINT32        idx;\r
   UINT32        num;\r
 \r
-  if (Id != NULL) {\r
-    if ((ret = Select (Id)) != 0) {\r
+  if (Name != NULL) {\r
+    if ((ret = Select (Name)) != 0) {\r
       return ret;\r
     }\r
   }\r
@@ -473,8 +481,28 @@ CVfrBufferConfig::OutputCFile (
   }\r
 \r
   for (Item = mItemListHead; Item != NULL; Item = Item->mNext) {\r
-    if (Item->mInfoStrList != NULL) {\r
-      fprintf (pFile, "\nunsigned char %s%sDefault%04x[] = {", BaseName, Item->mId, Item->mInfo);\r
+    if (Item->mId != NULL || Item->mInfoStrList == NULL) {\r
+      continue;\r
+    }\r
+    fprintf (pFile, "\nunsigned char %s%sBlockName[] = {", BaseName, Item->mName);\r
+\r
+    TotalLen = sizeof (UINT32);\r
+    for (Info = Item->mInfoStrList; Info != NULL; Info = Info->mNext) {\r
+      TotalLen += sizeof (UINT16) * 2;\r
+    }\r
+    Output.WriteLine (pFile, BYTES_PRE_LINE, "  ", (INT8 *)&TotalLen, sizeof (UINT32));\r
+\r
+    for (Info = Item->mInfoStrList; Info != NULL; Info = Info->mNext) {\r
+      fprintf (pFile, "\n");\r
+      Output.WriteLine (pFile, BYTES_PRE_LINE, "  ", (INT8 *)&Info->mOffset, sizeof (UINT16));\r
+      Output.WriteLine (pFile, BYTES_PRE_LINE, "  ", (INT8 *)&Info->mWidth, sizeof (UINT16));\r
+    }\r
+    fprintf (pFile, "\n};\n");\r
+  }\r
+\r
+  for (Item = mItemListHead; Item != NULL; Item = Item->mNext) {\r
+    if (Item->mId != NULL && Item->mInfoStrList != NULL) {\r
+      fprintf (pFile, "\nunsigned char %s%sDefault%s[] = {", BaseName, Item->mName, Item->mId);\r
 \r
       TotalLen = sizeof (UINT32);\r
       for (Info = Item->mInfoStrList; Info != NULL; Info = Info->mNext) {\r
@@ -483,6 +511,7 @@ CVfrBufferConfig::OutputCFile (
       Output.WriteLine (pFile, BYTES_PRE_LINE, "  ", (INT8 *)&TotalLen, sizeof (UINT32));\r
 \r
       for (Info = Item->mInfoStrList; Info != NULL; Info = Info->mNext) {\r
+        fprintf (pFile, "\n");\r
         Output.WriteLine (pFile, BYTES_PRE_LINE, "  ", (INT8 *)&Info->mOffset, sizeof (UINT16));\r
         Output.WriteLine (pFile, BYTES_PRE_LINE, "  ", (INT8 *)&Info->mWidth, sizeof (UINT16));\r
         if (Info->mNext == NULL) {\r
@@ -490,9 +519,8 @@ CVfrBufferConfig::OutputCFile (
         } else {\r
           Output.WriteLine (pFile, BYTES_PRE_LINE, "  ", (INT8 *)Info->mValue, Info->mWidth);\r
         }\r
-        fprintf (pFile, "\n"); \r
       }\r
-      fprintf (pFile, "};\n"); \r
+      fprintf (pFile, "\n};\n");\r
     }\r
   }\r
 }\r
@@ -536,7 +564,7 @@ static struct {
   {"UINT16",        EFI_IFR_TYPE_NUM_SIZE_16, sizeof (UINT16),       sizeof (UINT16)},\r
   {"UINT8",         EFI_IFR_TYPE_NUM_SIZE_8,  sizeof (UINT8),        sizeof (UINT8)},\r
   {"BOOLEAN",       EFI_IFR_TYPE_BOOLEAN,     sizeof (BOOLEAN),      sizeof (BOOLEAN)},\r
-  {"EFI_HII_DATE",  EFI_IFR_TYPE_DATE,        sizeof (EFI_HII_DATE), sizeof (UINT8)},\r
+  {"EFI_HII_DATE",  EFI_IFR_TYPE_DATE,        sizeof (EFI_HII_DATE), sizeof (UINT16)},\r
   {"EFI_STRING_ID", EFI_IFR_TYPE_STRING,      sizeof (EFI_STRING_ID),sizeof (EFI_STRING_ID)},\r
   {"EFI_HII_TIME",  EFI_IFR_TYPE_TIME,        sizeof (EFI_HII_TIME), sizeof (UINT8)},\r
   {NULL,            EFI_IFR_TYPE_OTHER,       0,                     0}\r
@@ -610,7 +638,7 @@ _STR2U32 (
     }\r
     if (c >= '0' && c <= '9') {\r
       Value += (c - '0');\r
-    } \r
+    }\r
   }\r
 \r
   return Value;\r
@@ -627,7 +655,7 @@ CVfrVarDataTypeDB::RegisterNewType (
 \r
 EFI_VFR_RETURN_CODE\r
 CVfrVarDataTypeDB::ExtractStructTypeName (\r
-  IN  INT8 *&VarStr, \r
+  IN  INT8 *&VarStr,\r
   OUT INT8 *TName\r
   )\r
 {\r
@@ -650,7 +678,7 @@ CVfrVarDataTypeDB::ExtractStructTypeName (
 \r
 EFI_VFR_RETURN_CODE\r
 CVfrVarDataTypeDB::ExtractFieldNameAndArrary (\r
-  IN  INT8   *&VarStr, \r
+  IN  INT8   *&VarStr,\r
   IN  INT8   *FName,\r
   OUT UINT32 &ArrayIdx\r
   )\r
@@ -658,15 +686,15 @@ CVfrVarDataTypeDB::ExtractFieldNameAndArrary (
   UINT32 Idx;\r
   INT8   ArrayStr[MAX_NAME_LEN + 1];\r
 \r
-  ArrayIdx = INVALID_ARRAY_INDEX; \r
+  ArrayIdx = INVALID_ARRAY_INDEX;\r
 \r
   if (FName == NULL) {\r
     return VFR_RETURN_FATAL_ERROR;\r
   }\r
 \r
   while((*VarStr != '\0') &&\r
-        (*VarStr != '.') && \r
-        (*VarStr != '[') && \r
+        (*VarStr != '.') &&\r
+        (*VarStr != '[') &&\r
         (*VarStr != ']')) {\r
     *FName = *VarStr;\r
     VarStr++;\r
@@ -703,8 +731,8 @@ CVfrVarDataTypeDB::ExtractFieldNameAndArrary (
 \r
 EFI_VFR_RETURN_CODE\r
 CVfrVarDataTypeDB::GetTypeField (\r
-  IN  INT8          *FName, \r
-  IN  SVfrDataType  *Type, \r
+  IN  INT8          *FName,\r
+  IN  SVfrDataType  *Type,\r
   OUT SVfrDataField *&Field\r
   )\r
 {\r
@@ -726,7 +754,7 @@ CVfrVarDataTypeDB::GetTypeField (
 \r
 EFI_VFR_RETURN_CODE\r
 CVfrVarDataTypeDB::GetFieldOffset (\r
-  IN  SVfrDataField *Field, \r
+  IN  SVfrDataField *Field,\r
   IN  UINT32        ArrayIdx,\r
   OUT UINT32        &Offset\r
   )\r
@@ -834,7 +862,7 @@ CVfrVarDataTypeDB::InternalTypesListInit (
         pSecondsField->mNext     = NULL;\r
         pSecondsField->mArrayNum = 0;\r
 \r
-        New->mMembers            = pHoursField;      \r
+        New->mMembers            = pHoursField;\r
       } else {\r
         New->mMembers            = NULL;\r
       }\r
@@ -853,6 +881,7 @@ CVfrVarDataTypeDB::CVfrVarDataTypeDB (
   mNewDataType   = NULL;\r
   mCurrDataField = NULL;\r
   mPackAlign     = DEFAULT_PACK_ALIGN;\r
+  mPackStack     = NULL;\r
 \r
   InternalTypesListInit ();\r
 }\r
@@ -861,8 +890,9 @@ CVfrVarDataTypeDB::~CVfrVarDataTypeDB (
   VOID\r
   )\r
 {\r
-  SVfrDataType  *pType;\r
-  SVfrDataField *pField;\r
+  SVfrDataType      *pType;\r
+  SVfrDataField     *pField;\r
+  SVfrPackStackNode *pPack;\r
 \r
   if (mNewDataType != NULL) {\r
     delete mNewDataType;\r
@@ -879,30 +909,64 @@ CVfrVarDataTypeDB::~CVfrVarDataTypeDB (
        delete pType;\r
   }\r
 \r
+  while (mPackStack != NULL) {\r
+    pPack = mPackStack;\r
+    mPackStack = mPackStack->mNext;\r
+    delete pPack;\r
+  }\r
 }\r
 \r
 EFI_VFR_RETURN_CODE\r
 CVfrVarDataTypeDB::Pack (\r
-  IN UINT32        Align\r
+  IN UINT32         LineNum,\r
+  IN UINT8          Action,\r
+  IN INT8           *Identifier,\r
+  IN UINT32         Number\r
   )\r
 {\r
-  if (Align == 0) {\r
-    return VFR_RETURN_INVALID_PARAMETER;\r
-  } else if (Align > 1) {\r
-    mPackAlign = Align + Align % 2;\r
-  } else {\r
-    mPackAlign = Align;\r
+  UINT32            PackAlign;\r
+  INT8              Msg[64] = {0, };\r
+\r
+  if (Action & VFR_PACK_SHOW) {\r
+    sprintf (Msg, "value of pragma pack(show) == %d", mPackAlign);\r
+    gCVfrErrorHandle.PrintMsg (LineNum, "", "Warning", Msg);\r
   }\r
 \r
-  return VFR_RETURN_SUCCESS;\r
-}\r
+  if (Action & VFR_PACK_PUSH) {\r
+    SVfrPackStackNode *pNew = NULL;\r
 \r
-VOID\r
-CVfrVarDataTypeDB::UnPack (\r
-  VOID\r
-  )\r
-{\r
-  mPackAlign = DEFAULT_PACK_ALIGN;\r
+    if ((pNew = new SVfrPackStackNode (Identifier, mPackAlign)) == NULL) {\r
+      return VFR_RETURN_FATAL_ERROR;\r
+    }\r
+    pNew->mNext = mPackStack;\r
+    mPackStack  = pNew;\r
+  }\r
+\r
+  if (Action & VFR_PACK_POP) {\r
+    SVfrPackStackNode *pNode = NULL;\r
+\r
+    if (mPackStack == NULL) {\r
+      gCVfrErrorHandle.PrintMsg (LineNum, "", "Warning", "#pragma pack(pop...) : more pops than pushes");\r
+    }\r
+\r
+    for (pNode = mPackStack; pNode != NULL; pNode = pNode->mNext) {\r
+      if (pNode->Match (Identifier) == TRUE) {\r
+        mPackAlign = pNode->mNumber;\r
+        mPackStack = pNode->mNext;\r
+      }\r
+    }\r
+  }\r
+\r
+  if (Action & VFR_PACK_ASSIGN) {\r
+    PackAlign = (Number > 1) ? Number + Number % 2 : Number;\r
+    if ((PackAlign == 0) || (PackAlign > 16)) {\r
+      gCVfrErrorHandle.PrintMsg (LineNum, "", "Warning", "expected pragma parameter to be '1', '2', '4', '8', or '16'");\r
+    } else {\r
+      mPackAlign = PackAlign;\r
+    }\r
+  }\r
+\r
+  return VFR_RETURN_SUCCESS;\r
 }\r
 \r
 VOID\r
@@ -952,8 +1016,8 @@ CVfrVarDataTypeDB::SetNewTypeName (
 \r
 EFI_VFR_RETURN_CODE\r
 CVfrVarDataTypeDB::DataTypeAddField (\r
-  IN INT8   *FieldName, \r
-  IN INT8   *TypeName, \r
+  IN INT8   *FieldName,\r
+  IN INT8   *TypeName,\r
   IN UINT32 ArrayNum\r
   )\r
 {\r
@@ -991,7 +1055,7 @@ CVfrVarDataTypeDB::DataTypeAddField (
     mNewDataType->mMembers = pNewField;\r
     pNewField->mNext       = NULL;\r
   } else {\r
-    for (pTmp = mNewDataType->mMembers; pTmp->mNext != NULL; pTmp = pTmp->mNext) \r
+    for (pTmp = mNewDataType->mMembers; pTmp->mNext != NULL; pTmp = pTmp->mNext)\r
       ;\r
     pTmp->mNext            = pNewField;\r
     pNewField->mNext       = NULL;\r
@@ -1049,6 +1113,38 @@ CVfrVarDataTypeDB::GetDataType (
   return VFR_RETURN_UNDEFINED;\r
 }\r
 \r
+EFI_VFR_RETURN_CODE\r
+CVfrVarDataTypeDB::GetDataTypeSize (\r
+  IN  UINT8   DataType,\r
+  OUT UINT32 *Size\r
+  )\r
+{\r
+  SVfrDataType *pDataType = NULL;\r
+\r
+  if (Size == NULL) {\r
+    return VFR_RETURN_FATAL_ERROR;\r
+  }\r
+\r
+  *Size    = 0;\r
+  DataType = DataType & 0x0F;\r
+\r
+  //\r
+  // For user defined data type, the size can't be got by this function.\r
+  //\r
+  if (DataType == EFI_IFR_TYPE_OTHER) {\r
+    return VFR_RETURN_SUCCESS;\r
+  }\r
+\r
+  for (pDataType = mDataTypeList; pDataType != NULL; pDataType = pDataType->mNext) {\r
+    if (DataType == pDataType->mType) {\r
+      *Size = pDataType->mTotalSize;\r
+      return VFR_RETURN_SUCCESS;\r
+    }\r
+  }\r
+\r
+  return VFR_RETURN_UNDEFINED;\r
+}\r
+\r
 EFI_VFR_RETURN_CODE\r
 CVfrVarDataTypeDB::GetDataTypeSize (\r
   IN  INT8   *TypeName,\r
@@ -1075,9 +1171,9 @@ CVfrVarDataTypeDB::GetDataTypeSize (
 \r
 EFI_VFR_RETURN_CODE\r
 CVfrVarDataTypeDB::GetDataFieldInfo (\r
-  IN  INT8     *VarStr, \r
-  OUT UINT16   &Offset, \r
-  OUT UINT8    &Type, \r
+  IN  INT8     *VarStr,\r
+  OUT UINT16   &Offset,\r
+  OUT UINT8    &Type,\r
   OUT UINT32   &Size\r
   )\r
 {\r
@@ -1113,7 +1209,7 @@ CVfrVarDataTypeDB::GetDataFieldInfo (
 \r
 EFI_VFR_RETURN_CODE\r
 CVfrVarDataTypeDB::GetUserDefinedTypeNameList  (\r
-  OUT INT8      ***NameList, \r
+  OUT INT8      ***NameList,\r
   OUT UINT32    *ListSize\r
   )\r
 {\r
@@ -1444,10 +1540,10 @@ CVfrDataStorage::DeclareNameVarStoreEnd (
   return VFR_RETURN_SUCCESS;\r
 }\r
 \r
-EFI_VFR_RETURN_CODE \r
+EFI_VFR_RETURN_CODE\r
 CVfrDataStorage::DeclareEfiVarStore (\r
-  IN INT8           *StoreName, \r
-  IN EFI_GUID       *Guid, \r
+  IN INT8           *StoreName,\r
+  IN EFI_GUID       *Guid,\r
   IN EFI_STRING_ID  NameStrId,\r
   IN UINT32         VarSize\r
   )\r
@@ -1480,10 +1576,10 @@ CVfrDataStorage::DeclareEfiVarStore (
   return VFR_RETURN_SUCCESS;\r
 }\r
 \r
-EFI_VFR_RETURN_CODE \r
+EFI_VFR_RETURN_CODE\r
 CVfrDataStorage::DeclareBufferVarStore (\r
-  IN INT8              *StoreName, \r
-  IN EFI_GUID          *Guid, \r
+  IN INT8              *StoreName,\r
+  IN EFI_GUID          *Guid,\r
   IN CVfrVarDataTypeDB *DataTypeDB,\r
   IN INT8              *TypeName,\r
   IN EFI_VARSTORE_ID   VarStoreId\r
@@ -1521,7 +1617,7 @@ CVfrDataStorage::DeclareBufferVarStore (
   return VFR_RETURN_SUCCESS;\r
 }\r
 \r
-EFI_VFR_RETURN_CODE \r
+EFI_VFR_RETURN_CODE\r
 CVfrDataStorage::GetVarStoreId (\r
   IN  INT8            *StoreName,\r
   OUT EFI_VARSTORE_ID *VarStoreId\r
@@ -1625,9 +1721,47 @@ CVfrDataStorage::GetVarStoreType (
   return VFR_RETURN_UNDEFINED;\r
 }\r
 \r
+EFI_VFR_VARSTORE_TYPE\r
+CVfrDataStorage::GetVarStoreType (\r
+  IN  EFI_VARSTORE_ID        VarStoreId\r
+  )\r
+{\r
+  SVfrVarStorageNode    *pNode;\r
+  EFI_VFR_VARSTORE_TYPE VarStoreType;\r
+\r
+  VarStoreType = EFI_VFR_VARSTORE_INVALID;\r
+\r
+  if (VarStoreId == EFI_VARSTORE_ID_INVALID) {\r
+    return VarStoreType;\r
+  }\r
+\r
+  for (pNode = mBufferVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
+    if (pNode->mVarStoreId == VarStoreId) {\r
+      VarStoreType = pNode->mVarStoreType;\r
+      return VarStoreType;\r
+    }\r
+  }\r
+\r
+  for (pNode = mEfiVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
+    if (pNode->mVarStoreId == VarStoreId) {\r
+      VarStoreType = pNode->mVarStoreType;\r
+      return VarStoreType;\r
+    }\r
+  }\r
+\r
+  for (pNode = mNameVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
+    if (pNode->mVarStoreId == VarStoreId) {\r
+      VarStoreType = pNode->mVarStoreType;\r
+      return VarStoreType;\r
+    }\r
+  }\r
+\r
+  return VarStoreType;\r
+}\r
+\r
 EFI_VFR_RETURN_CODE\r
 CVfrDataStorage::GetVarStoreName (\r
-  IN  EFI_VARSTORE_ID VarStoreId, \r
+  IN  EFI_VARSTORE_ID VarStoreId,\r
   OUT INT8            **VarStoreName\r
   )\r
 {\r
@@ -1725,7 +1859,7 @@ CVfrDataStorage::BufferVarStoreRequestElementAdd (
   INT8                  NewReqElt[128] = {'\0',};\r
   INT8                  *OldReqElt = NULL;\r
   SVfrVarStorageNode    *pNode = NULL;\r
-  EFI_IFR_TYPE_VALUE    Value;\r
+  EFI_IFR_TYPE_VALUE    Value = {0};\r
 \r
   for (pNode = mBufferVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
     if (strcmp (pNode->mVarStoreName, StoreName) == NULL) {\r
@@ -1749,8 +1883,8 @@ CVfrDataStorage::BufferVarStoreRequestElementAdd (
 \r
 SVfrDefaultStoreNode::SVfrDefaultStoreNode (\r
   IN EFI_IFR_DEFAULTSTORE *ObjBinAddr,\r
-  IN INT8                 *RefName, \r
-  IN EFI_STRING_ID        DefaultStoreNameId, \r
+  IN INT8                 *RefName,\r
+  IN EFI_STRING_ID        DefaultStoreNameId,\r
   IN UINT16               DefaultId\r
   )\r
 {\r
@@ -1828,7 +1962,7 @@ CVfrDefaultStore::RegisterDefaultStore (
 }\r
 \r
 /*\r
- * assign new reference name or new default store name id only if \r
+ * assign new reference name or new default store name id only if\r
  * the original is invalid\r
  */\r
 EFI_VFR_RETURN_CODE\r
@@ -1911,8 +2045,8 @@ CVfrDefaultStore::GetDefaultId (
 STATIC\r
 EFI_VFR_RETURN_CODE\r
 AltCfgItemPrintToBuffer (\r
-  IN INT8               *NewAltCfg, \r
-  IN EFI_VARSTORE_INFO  Info, \r
+  IN INT8               *NewAltCfg,\r
+  IN EFI_VARSTORE_INFO  Info,\r
   IN UINT8              Type,\r
   IN EFI_IFR_TYPE_VALUE Value\r
   )\r
@@ -1923,9 +2057,9 @@ AltCfgItemPrintToBuffer (
 \r
   if (NewAltCfg != NULL) {\r
     Count = sprintf (\r
-              NewAltCfg, \r
-              "&OFFSET=%x&WIDTH=%x&VALUE=", \r
-              Info.mInfo.mVarOffset, \r
+              NewAltCfg,\r
+              "&OFFSET=%x&WIDTH=%x&VALUE=",\r
+              Info.mInfo.mVarOffset,\r
               Info.mVarTotalSize\r
               );\r
     NewAltCfg += Count;\r
@@ -1984,7 +2118,7 @@ AltCfgItemPrintToBuffer (
        }\r
   }\r
 \r
-  return VFR_RETURN_FATAL_ERROR;    \r
+  return VFR_RETURN_FATAL_ERROR;\r
 }\r
 \r
 EFI_VFR_RETURN_CODE\r
@@ -1998,6 +2132,7 @@ CVfrDefaultStore::BufferVarStoreAltConfigAdd (
 {\r
   SVfrDefaultStoreNode  *pNode = NULL;\r
   INT8                  NewAltCfg[2 * 2 * sizeof (UINT16) + 1] = {0,};\r
+  INTN                  Returnvalue = 0;\r
 \r
   if (VarStoreName == NULL) {\r
     return VFR_RETURN_FATAL_ERROR;\r
@@ -2016,28 +2151,23 @@ CVfrDefaultStore::BufferVarStoreAltConfigAdd (
   gCVfrBufferConfig.Open ();\r
 \r
   sprintf (NewAltCfg, "%04x", pNode->mDefaultId);\r
-  if ((gCVfrBufferConfig.Select(VarStoreName) == 0) && \r
-      (gCVfrBufferConfig.Select(VarStoreName, NewAltCfg) != 0)) {\r
-    if (gCVfrBufferConfig.Write ('i', VarStoreName, NewAltCfg, Type, Info.mInfo.mVarOffset, Info.mVarTotalSize, Value) != 0) {\r
+  if ((Returnvalue = gCVfrBufferConfig.Select(VarStoreName)) == 0) {\r
+    if ((Returnvalue = gCVfrBufferConfig.Write ('a', VarStoreName, NewAltCfg, Type, Info.mInfo.mVarOffset, Info.mVarTotalSize, Value)) != 0) {\r
       goto WriteError;\r
     }\r
   }\r
 \r
-  if (gCVfrBufferConfig.Write ('a', VarStoreName, NULL, Type, Info.mInfo.mVarOffset, Info.mVarTotalSize, Value) != 0) {\r
-    goto WriteError;\r
-  }\r
-\r
   gCVfrBufferConfig.Close ();\r
 \r
   return VFR_RETURN_SUCCESS;\r
 \r
 WriteError:\r
   gCVfrBufferConfig.Close ();\r
-  return VFR_RETURN_FATAL_ERROR;\r
+  return (EFI_VFR_RETURN_CODE)Returnvalue;\r
 }\r
 \r
 SVfrRuleNode::SVfrRuleNode (\r
-  IN INT8        *RuleName, \r
+  IN INT8        *RuleName,\r
   IN UINT8       RuleId\r
   )\r
 {\r
@@ -2143,7 +2273,7 @@ EFI_VARSTORE_INFO::EFI_VARSTORE_INFO (
   mVarTotalSize    = Info.mVarTotalSize;\r
 }\r
 \r
-BOOLEAN \r
+BOOLEAN\r
 EFI_VARSTORE_INFO::operator == (\r
   IN EFI_VARSTORE_INFO  *Info\r
   )\r
@@ -2195,7 +2325,7 @@ CVfrQuestionDB::ChekQuestionIdFree (
   return (mFreeQIdBitMap[Index] & (0x80000000 >> Offset)) == 0;\r
 }\r
 \r
-VOID \r
+VOID\r
 CVfrQuestionDB::MarkQuestionIdUsed (\r
   IN EFI_QUESTION_ID QId\r
   )\r
@@ -2206,7 +2336,7 @@ CVfrQuestionDB::MarkQuestionIdUsed (
   mFreeQIdBitMap[Index] |= (0x80000000 >> Offset);\r
 }\r
 \r
-VOID \r
+VOID\r
 CVfrQuestionDB::MarkQuestionIdUnused (\r
   IN EFI_QUESTION_ID QId\r
   )\r
@@ -2321,9 +2451,9 @@ CVfrQuestionDB::RegisterQuestion (
 \r
 VOID\r
 CVfrQuestionDB::RegisterOldDateQuestion (\r
-  IN     INT8            *YearVarId, \r
-  IN     INT8            *MonthVarId, \r
-  IN     INT8            *DayVarId, \r
+  IN     INT8            *YearVarId,\r
+  IN     INT8            *MonthVarId,\r
+  IN     INT8            *DayVarId,\r
   IN OUT EFI_QUESTION_ID &QuestionId\r
   )\r
 {\r
@@ -2379,7 +2509,7 @@ Err:
 VOID\r
 CVfrQuestionDB::RegisterNewDateQuestion (\r
   IN     INT8            *Name,\r
-  IN     INT8            *BaseVarId, \r
+  IN     INT8            *BaseVarId,\r
   IN OUT EFI_QUESTION_ID &QuestionId\r
   )\r
 {\r
@@ -2463,9 +2593,9 @@ Err:
 \r
 VOID\r
 CVfrQuestionDB::RegisterOldTimeQuestion (\r
-  IN     INT8            *HourVarId, \r
-  IN     INT8            *MinuteVarId, \r
-  IN     INT8            *SecondVarId, \r
+  IN     INT8            *HourVarId,\r
+  IN     INT8            *MinuteVarId,\r
+  IN     INT8            *SecondVarId,\r
   IN OUT EFI_QUESTION_ID &QuestionId\r
   )\r
 {\r
@@ -2634,7 +2764,7 @@ CVfrQuestionDB::UpdateQuestionId (
   return VFR_RETURN_SUCCESS;\r
 }\r
 \r
-VOID \r
+VOID\r
 CVfrQuestionDB::GetQuestionId (\r
   IN  INT8              *Name,\r
   IN  INT8              *VarIdStr,\r
@@ -2672,7 +2802,7 @@ CVfrQuestionDB::GetQuestionId (
   return ;\r
 }\r
 \r
-EFI_VFR_RETURN_CODE \r
+EFI_VFR_RETURN_CODE\r
 CVfrQuestionDB::FindQuestion (\r
   IN EFI_QUESTION_ID QuestionId\r
   )\r
@@ -2692,7 +2822,7 @@ CVfrQuestionDB::FindQuestion (
   return VFR_RETURN_UNDEFINED;\r
 }\r
 \r
-EFI_VFR_RETURN_CODE \r
+EFI_VFR_RETURN_CODE\r
 CVfrQuestionDB::FindQuestion (\r
   IN INT8 *Name\r
   )\r