---
 BaseTools/Source/C/VfrCompile/VfrFormPkg.h | 27 +++++++++++++
 BaseTools/Source/C/VfrCompile/VfrSyntax.g  | 61 ++++++++++++++++++++++++++----
 2 files changed, 81 insertions(+), 7 deletions(-)

diff --git a/BaseTools/Source/C/VfrCompile/VfrFormPkg.h b/BaseTools/Source/C/VfrCompile/VfrFormPkg.h
index 3d2def8..1587059 100644
--- a/BaseTools/Source/C/VfrCompile/VfrFormPkg.h
+++ b/BaseTools/Source/C/VfrCompile/VfrFormPkg.h
@@ -952,6 +952,33 @@ public:
   VOID SetValue (IN EFI_IFR_TYPE_VALUE Value) {
     memmove (&mDefault->Value, &Value, mDefault->Header.Length - OFFSET_OF (EFI_IFR_DEFAULT, Value));
   }
+  VOID SetBuffer(IN UINT64 *Buffer, IN UINT8 Count, IN UINT8 Size) {
+    UINT8 i = 0;
+    if(Size == EFI_IFR_TYPE_NUM_SIZE_8)
+    {
+	  UINT8 *Ptr = (UINT8*)&(mDefault->Value);
+	  for(i = 0; i < Count; i++)
+        Ptr[i] = (UINT8)Buffer[i];	
+	}	
+    else if(Size == EFI_IFR_TYPE_NUM_SIZE_16)
+    {
+	  UINT16 *Ptr = (UINT16*)&(mDefault->Value);
+	  for(i = 0; i < Count; i++)
+        Ptr[i] = (UINT16)Buffer[i];	
+	}
+    else if(Size == EFI_IFR_TYPE_NUM_SIZE_32)
+    {
+	  UINT32 *Ptr = (UINT32*)&(mDefault->Value);
+	  for(i = 0; i < Count; i++)
+        Ptr[i] = (UINT32)Buffer[i];	
+	}	
+    else if(Size == EFI_IFR_TYPE_NUM_SIZE_64)
+    {
+	  UINT64 *Ptr = (UINT64*)&(mDefault->Value);
+	  for(i = 0; i < Count; i++)
+        Ptr[i] = (UINT64)Buffer[i];	
+	}
+  }
 };
 
 class CIfrDefault2 : public CIfrObj, public CIfrOpHeader {
diff --git a/BaseTools/Source/C/VfrCompile/VfrSyntax.g b/BaseTools/Source/C/VfrCompile/VfrSyntax.g
index 2255d6f..e2a9a5d 100644
--- a/BaseTools/Source/C/VfrCompile/VfrSyntax.g
+++ b/BaseTools/Source/C/VfrCompile/VfrSyntax.g
@@ -1533,29 +1533,76 @@ vfrStatementDefault :
      EFI_VFR_VARSTORE_TYPE VarStoreType  = EFI_VFR_VARSTORE_INVALID;
      UINT32                Size          = 0;
      EFI_GUID              *VarGuid      = NULL;
+	
+     UINT64          	   ValueList[EFI_IFR_MAX_LENGTH] = {0,}; 
+     UINT16          	   ListLen = 0;
   >>
   D:Default                                         
   (
     (
-      "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE()] > [Val] ","  
+      "=" 
+      (
+	    vfrConstantValueField[_GET_CURRQEST_DATATYPE()] > [Val]   	<< 
+																		switch(_GET_CURRQEST_DATATYPE())
+																		{
+																			case EFI_IFR_TYPE_NUM_SIZE_8:
+																				ValueList[ListLen] = (UINT8)Val.u8;
+																				ListLen++;
+																				break;
+																			case EFI_IFR_TYPE_NUM_SIZE_16:
+																				ValueList[ListLen] = (UINT16)Val.u16;
+																				ListLen++;
+																				break;
+																			case EFI_IFR_TYPE_NUM_SIZE_32:
+																				ValueList[ListLen] = (UINT32)Val.u32;
+																				ListLen++;
+																				break;
+																			case EFI_IFR_TYPE_NUM_SIZE_64:
+																				ValueList[ListLen] = (UINT64)Val.u64;
+																				ListLen++;
+																				break;
+																			default:
+																				_PCATCH(VFR_RETURN_FATAL_ERROR, D->getLine(), "Multiple default values not supported by this type");
+																		}
+																	>>
+      ) + 
+	  ","
                                                     << 
-                                                        if (gCurrentMinMaxData != NULL && gCurrentMinMaxData->IsNumericOpcode()) {
+														if ( (ListLen > 1) && (_GET_CURRQEST_ARRAY_SIZE() < ListLen))
+														{
+														  _PCATCH(VFR_RETURN_FATAL_ERROR, D->getLine(), "Number of default values exceeds storage array size.");
+														}
+                                                        if (gCurrentMinMaxData != NULL && gCurrentMinMaxData->IsNumericOpcode()) 
+													    {
                                                           //check default value is valid for Numeric Opcode
-                                                          if (Val.u64 < gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE()) || Val.u64 > gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE())) {
+                                                          if (Val.u64 < gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE()) || Val.u64 > gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE())) 
+                                                          {
                                                             _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");
                                                           }
                                                         }
-                                                        if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {
+                                                        if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) 
+                                                        {
                                                           _PCATCH (VFR_RETURN_FATAL_ERROR, D->getLine(), "Default data type error.");
                                                           Size = sizeof (EFI_IFR_TYPE_VALUE);
-                                                        } else {
+                                                        }
+														else
+                                                        {
                                                           _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &Size), D->getLine());
                                                         }
+														if( ListLen > 1) 
+														{
+															Size = Size *_GET_CURRQEST_ARRAY_SIZE();
+														}
                                                         Size += OFFSET_OF (EFI_IFR_DEFAULT, Value);
                                                         DObj = new CIfrDefault ((UINT8)Size);
                                                         DObj->SetLineNo(D->getLine());
-                                                        DObj->SetType (_GET_CURRQEST_DATATYPE()); 
-                                                        DObj->SetValue(Val);
+														if( ListLen > 1) {
+															DObj->SetType (EFI_IFR_TYPE_BUFFER); 
+															DObj->SetBuffer(ValueList, ListLen, _GET_CURRQEST_DATATYPE());
+														} else {
+															DObj->SetType (_GET_CURRQEST_DATATYPE()); 
+														    DObj->SetValue(Val);
+														}
                                                     >>
       |                                             << IsExp = TRUE; DObj2 = new CIfrDefault2; DObj2->SetLineNo(D->getLine()); DObj2->SetScope (1); >>
         vfrStatementValue ","                       << CIfrEnd EndObj1; EndObj1.SetLineNo(D->getLine()); >>
-- 
1.9.4.msysgit.2

