]> 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 caadc29da97ef4d4f34eeb1faeb98314aa00f685..d6f5f437f25b60eb274f2c2d78e44a5b654df5e4 100644 (file)
@@ -1,5 +1,4 @@
 /*++\r
-\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
@@ -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