}\r
\r
PcdDb = IsPeiDb ? ((UINT8 *) &mPcdDatabase->PeiDb) : ((UINT8 *) &mPcdDatabase->DxeDb);\r
- StringTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.StringTable :\r
- mPcdDatabase->DxeDb.Init.StringTable;\r
+ \r
+ if (IsPeiDb) {\r
+ StringTable = (UINT16 *) (&mPcdDatabase->PeiDb.Init.StringTable[0]);\r
+ } else {\r
+ StringTable = (UINT16 *) (&mPcdDatabase->DxeDb.Init.StringTable[0]);\r
+ }\r
+ \r
\r
Offset = LocalTokenNumber & PCD_DATABASE_OFFSET_MASK;\r
\r
break;\r
\r
case PCD_TYPE_HII:\r
- GuidTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.GuidTable :\r
- mPcdDatabase->DxeDb.Init.GuidTable;\r
+ if (IsPeiDb) {\r
+ GuidTable = (EFI_GUID *) (&mPcdDatabase->PeiDb.Init.GuidTable[0]);\r
+ } else {\r
+ GuidTable = (EFI_GUID *) (&mPcdDatabase->DxeDb.Init.GuidTable[0]);\r
+ }\r
\r
VariableHead = (VARIABLE_HEAD *) (PcdDb + Offset);\r
\r
- Guid = &(GuidTable[VariableHead->GuidTableIndex]);\r
- Name = &(StringTable[VariableHead->StringIndex]);\r
+ Guid = GuidTable + VariableHead->GuidTableIndex;\r
+ Name = StringTable + VariableHead->StringIndex;\r
VaraiableDefaultBuffer = (UINT8 *) PcdDb + VariableHead->DefaultValueOffset;\r
\r
Status = GetHiiVariable (Guid, Name, &Data, &DataSize);\r
\r
case PCD_TYPE_STRING:\r
StringTableIdx = (UINT16) *((UINT8 *) PcdDb + Offset);\r
- RetPtr = (VOID *) &StringTable[StringTableIdx];\r
+ RetPtr = (VOID *) (StringTable + StringTableIdx);\r
break;\r
\r
case PCD_TYPE_DATA:\r
\r
PcdDb = IsPeiDb ? ((UINT8 *) &mPcdDatabase->PeiDb) : ((UINT8 *) &mPcdDatabase->DxeDb);\r
\r
- StringTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.StringTable :\r
- mPcdDatabase->DxeDb.Init.StringTable;\r
+ if (IsPeiDb) {\r
+ StringTable = (UINT16 *) (&mPcdDatabase->PeiDb.Init.StringTable[0]);\r
+ } else {\r
+ StringTable = (UINT16 *) (&mPcdDatabase->DxeDb.Init.StringTable[0]);\r
+ }\r
+\r
\r
InternalData = PcdDb + Offset;\r
\r
\r
case PCD_TYPE_STRING:\r
if (SetPtrTypeSize (TmpTokenNumber, Size)) {\r
- CopyMem (&StringTable[*((UINT16 *)InternalData)], Data, *Size);\r
+ CopyMem (StringTable + *((UINT16 *)InternalData), Data, *Size);\r
Status = EFI_SUCCESS;\r
} else {\r
Status = EFI_INVALID_PARAMETER;\r
}\r
}\r
\r
- GuidTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.GuidTable :\r
- mPcdDatabase->DxeDb.Init.GuidTable;\r
+ if (IsPeiDb) {\r
+ GuidTable = (EFI_GUID *) (&mPcdDatabase->PeiDb.Init.GuidTable[0]);\r
+ } else {\r
+ GuidTable = (EFI_GUID *) (&mPcdDatabase->DxeDb.Init.GuidTable[0]);\r
+ }\r
\r
VariableHead = (VARIABLE_HEAD *) (PcdDb + Offset);\r
\r
- Guid = &(GuidTable[VariableHead->GuidTableIndex]);\r
- Name = &(StringTable[VariableHead->StringIndex]);\r
+ Guid = GuidTable + VariableHead->GuidTableIndex;\r
+ Name = StringTable + VariableHead->StringIndex;\r
VariableOffset = VariableHead->Offset;\r
\r
Status = SetHiiVariable (Guid, Name, Data, *Size, VariableOffset);\r
\r
Size = 0;\r
\r
+ //\r
+ // Try to get original variable size information.\r
+ //\r
Status = gRT->GetVariable (\r
(UINT16 *)VariableName,\r
VariableGuid,\r
);\r
\r
if (Status == EFI_BUFFER_TOO_SMALL) {\r
-\r
+ //\r
+ // Patch new PCD's value to offset in given HII variable.\r
+ //\r
+ \r
Buffer = AllocatePool (Size);\r
\r
ASSERT (Buffer != NULL);\r
FreePool (Buffer);\r
return Status;\r
\r
- } \r
+ } else if (Status == EFI_NOT_FOUND) {\r
+ //\r
+ // If variable does not exist, a new variable need to be created.\r
+ //\r
+ \r
+ Size = Offset + DataSize;\r
+ \r
+ Buffer = AllocateZeroPool (Size);\r
+ ASSERT (Buffer != NULL);\r
+ \r
+ CopyMem ((UINT8 *)Buffer + Offset, Data, DataSize);\r
+ \r
+ Status = gRT->SetVariable (\r
+ VariableName,\r
+ VariableGuid,\r
+ EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
+ Size,\r
+ Buffer\r
+ );\r
+\r
+ FreePool (Buffer);\r
+ return Status; \r
+ }\r
\r
//\r
- // If we drop to here, we don't have a Variable entry in\r
- // the variable service yet. So, we will save the data\r
- // in the PCD Database's volatile area.\r
+ // If we drop to here, the value is failed to be written in to variable area\r
+ // So, we will save the data in the PCD Database's volatile area.\r
//\r
return Status;\r
}\r
\r
}\r
\r
-\r
/**\r
- Get index of PCD entry in size table.\r
-\r
+ Wrapper function of getting index of PCD entry in size table.\r
+ \r
@param LocalTokenNumberTableIdx Index of this PCD in local token number table.\r
- @param LocalTokenNumberTable Pointer to local token number table in PCD database.\r
@param IsPeiDb If TRUE, the pcd entry is initialized in PEI phase,\r
If FALSE, the pcd entry is initialized in DXE phase.\r
\r
@return index of PCD entry in size table.\r
-\r
**/\r
UINTN\r
-GetSizeTableIndexA (\r
- IN UINTN LocalTokenNumberTableIdx,\r
- IN UINT32 *LocalTokenNumberTable,\r
- IN BOOLEAN IsPeiDb\r
+GetSizeTableIndex (\r
+ IN UINTN LocalTokenNumberTableIdx,\r
+ IN BOOLEAN IsPeiDb\r
)\r
{\r
- UINTN Index;\r
- UINTN SizeTableIdx;\r
- UINTN LocalTokenNumber;\r
- SKU_ID *SkuIdTable;\r
+ UINT32 *LocalTokenNumberTable;\r
+ UINTN LocalTokenNumber;\r
+ UINTN Index;\r
+ UINTN SizeTableIdx;\r
+ SKU_ID *SkuIdTable;\r
\r
+ if (IsPeiDb) {\r
+ LocalTokenNumberTable = mPcdDatabase->PeiDb.Init.LocalTokenNumberTable;\r
+ } else {\r
+ LocalTokenNumberTable = mPcdDatabase->DxeDb.Init.LocalTokenNumberTable;\r
+ }\r
+\r
SizeTableIdx = 0;\r
\r
- for (Index=0; Index<LocalTokenNumberTableIdx; Index++) {\r
+ for (Index = 0; Index < LocalTokenNumberTableIdx; Index ++) {\r
LocalTokenNumber = LocalTokenNumberTable[Index];\r
\r
if ((LocalTokenNumber & PCD_DATUM_TYPE_ALL_SET) == PCD_DATUM_TYPE_POINTER) {\r
\r
}\r
\r
- return SizeTableIdx;\r
-}\r
-\r
-\r
-\r
-/**\r
- Wrapper function of getting index of PCD entry in size table.\r
- \r
- @param LocalTokenNumberTableIdx Index of this PCD in local token number table.\r
- @param IsPeiDb If TRUE, the pcd entry is initialized in PEI phase,\r
- If FALSE, the pcd entry is initialized in DXE phase.\r
-\r
- @return index of PCD entry in size table.\r
-**/\r
-UINTN\r
-GetSizeTableIndex (\r
- IN UINTN LocalTokenNumberTableIdx,\r
- IN BOOLEAN IsPeiDb\r
- )\r
-{\r
- UINT32 *LocalTokenNumberTable;\r
- \r
- if (IsPeiDb) {\r
- LocalTokenNumberTable = mPcdDatabase->PeiDb.Init.LocalTokenNumberTable;\r
- } else {\r
- LocalTokenNumberTable = mPcdDatabase->DxeDb.Init.LocalTokenNumberTable;\r
- }\r
- return GetSizeTableIndexA (LocalTokenNumberTableIdx, \r
- LocalTokenNumberTable,\r
- IsPeiDb);\r
+ return SizeTableIdx; \r
}\r
\r
/**\r