RetPtr = (VOID *) (UINTN) (PcdGet32 (PcdVpdBaseAddress) + VpdHead->Offset);\r
break;\r
\r
+ case PCD_TYPE_HII|PCD_TYPE_STRING:\r
case PCD_TYPE_HII:\r
if (IsPeiDb) {\r
GuidTable = (EFI_GUID *) (&mPcdDatabase->PeiDb.Init.GuidTable[0]);\r
}\r
\r
VariableHead = (VARIABLE_HEAD *) (PcdDb + Offset);\r
- \r
Guid = GuidTable + VariableHead->GuidTableIndex;\r
Name = (UINT16*)(StringTable + VariableHead->StringIndex);\r
- VaraiableDefaultBuffer = (UINT8 *) PcdDb + VariableHead->DefaultValueOffset;\r
-\r
- Status = GetHiiVariable (Guid, Name, &Data, &DataSize);\r
- if (Status == EFI_SUCCESS) {\r
- if (GetSize == 0) {\r
- //\r
- // It is a pointer type. So get the MaxSize reserved for\r
- // this PCD entry.\r
- //\r
- GetPtrTypeSize (TmpTokenNumber, &GetSize);\r
+ \r
+ if ((LocalTokenNumber & PCD_TYPE_ALL_SET) == (PCD_TYPE_HII|PCD_TYPE_STRING)) {\r
+ //\r
+ // If a HII type PCD's datum type is VOID*, the DefaultValueOffset is the index of \r
+ // string array in string table.\r
+ //\r
+ StringTableIdx = *(UINT16*)((UINT8 *) PcdDb + VariableHead->DefaultValueOffset); \r
+ VaraiableDefaultBuffer = (VOID *) (StringTable + StringTableIdx); \r
+ Status = GetHiiVariable (Guid, Name, &Data, &DataSize);\r
+ if (Status == EFI_SUCCESS) {\r
+ if (GetSize == 0) {\r
+ //\r
+ // It is a pointer type. So get the MaxSize reserved for\r
+ // this PCD entry.\r
+ //\r
+ GetPtrTypeSize (TmpTokenNumber, &GetSize);\r
+ }\r
+ CopyMem (VaraiableDefaultBuffer, Data + VariableHead->Offset, GetSize);\r
+ FreePool (Data);\r
}\r
- CopyMem (VaraiableDefaultBuffer, Data + VariableHead->Offset, GetSize);\r
- FreePool (Data);\r
+ RetPtr = (VOID *) VaraiableDefaultBuffer; \r
+ } else {\r
+ VaraiableDefaultBuffer = (UINT8 *) PcdDb + VariableHead->DefaultValueOffset;\r
+ \r
+ Status = GetHiiVariable (Guid, Name, &Data, &DataSize);\r
+ if (Status == EFI_SUCCESS) {\r
+ if (GetSize == 0) {\r
+ //\r
+ // It is a pointer type. So get the MaxSize reserved for\r
+ // this PCD entry.\r
+ //\r
+ GetPtrTypeSize (TmpTokenNumber, &GetSize);\r
+ }\r
+ CopyMem (VaraiableDefaultBuffer, Data + VariableHead->Offset, GetSize);\r
+ FreePool (Data);\r
+ }\r
+ //\r
+ // If the operation is successful, we copy the data\r
+ // to the default value buffer in the PCD Database.\r
+ // So that we can free the Data allocated in GetHiiVariable.\r
+ //\r
+ //\r
+ // If the operation is not successful, \r
+ // Return 1) either the default value specified by Platform Integrator \r
+ // 2) Or the value Set by a PCD set operation.\r
+ //\r
+ RetPtr = (VOID *) VaraiableDefaultBuffer;\r
}\r
- //\r
- // If the operation is successful, we copy the data\r
- // to the default value buffer in the PCD Database.\r
- // So that we can free the Data allocated in GetHiiVariable.\r
- //\r
- //\r
- // If the operation is not successful, \r
- // Return 1) either the default value specified by Platform Integrator \r
- // 2) Or the value Set by a PCD set operation.\r
- //\r
- RetPtr = (VOID *) VaraiableDefaultBuffer;\r
break;\r
\r
case PCD_TYPE_STRING:\r
}\r
break;\r
\r
+ case PCD_TYPE_HII|PCD_TYPE_STRING:\r
case PCD_TYPE_HII:\r
if (PtrType) {\r
if (!SetPtrTypeSize (TmpTokenNumber, Size)) {\r
Guid = GuidTable + VariableHead->GuidTableIndex;\r
Name = (UINT16*) (StringTable + VariableHead->StringIndex);\r
VariableOffset = VariableHead->Offset;\r
-\r
Status = SetHiiVariable (Guid, Name, Data, *Size, VariableOffset);\r
-\r
+ \r
if (EFI_NOT_FOUND == Status) {\r
- CopyMem (PcdDb + VariableHead->DefaultValueOffset, Data, *Size);\r
+ if ((LocalTokenNumber & PCD_TYPE_ALL_SET) == (PCD_TYPE_HII|PCD_TYPE_STRING)) {\r
+ CopyMem (\r
+ StringTable + *(UINT16 *)(PcdDb + VariableHead->DefaultValueOffset),\r
+ Data,\r
+ *Size\r
+ );\r
+ } else {\r
+ CopyMem (PcdDb + VariableHead->DefaultValueOffset, Data, *Size);\r
+ } \r
Status = EFI_SUCCESS;\r
- } \r
+ }\r
break;\r
\r
case PCD_TYPE_DATA:\r