1) Add in support to traverse taken space

2) Remove unused import in DynamicTokenValue.java.
3) Support Byte Stream input for Pointer type Dynamic PCD entry in FPD file.


git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@616 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
qwang12 2006-06-23 14:41:16 +00:00
parent e88ea4239b
commit 4276d5dacf
13 changed files with 474 additions and 87 deletions

View File

@ -553,7 +553,9 @@ DxePcdGetNextToken (
); );
} }
if (!DXE_EXMAP_TABLE_EMPTY) { if ((ExTokenNumber == PCD_INVALID_TOKEN_NUMBER) &&
!DXE_EXMAP_TABLE_EMPTY
) {
ExTokenNumber = ExGetNextTokeNumber ( ExTokenNumber = ExGetNextTokeNumber (
Guid, Guid,
ExTokenNumber, ExTokenNumber,
@ -569,3 +571,119 @@ DxePcdGetNextToken (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
EFI_GUID **
GetDistinctTokenSpace (
IN OUT UINTN *ExMapTableSize,
IN DYNAMICEX_MAPPING *ExMapTable,
IN EFI_GUID *GuidTable
)
{
EFI_GUID **DistinctTokenSpace;
UINTN OldGuidIndex;
UINTN TsIdx;
UINTN Idx;
DistinctTokenSpace = AllocateZeroPool (*ExMapTableSize * sizeof (EFI_GUID *));
ASSERT (DistinctTokenSpace != NULL);
TsIdx = 0;
OldGuidIndex = ExMapTable[0].ExGuidIndex;
DistinctTokenSpace[TsIdx] = &GuidTable[OldGuidIndex];
for (Idx = 1; Idx < PEI_EXMAPPING_TABLE_SIZE; Idx++) {
if (ExMapTable[Idx].ExGuidIndex != OldGuidIndex) {
OldGuidIndex = ExMapTable[Idx].ExGuidIndex;
DistinctTokenSpace[++TsIdx] = &GuidTable[OldGuidIndex];
}
}
*ExMapTableSize = TsIdx;
return DistinctTokenSpace;
}
STATIC EFI_GUID *TmpTokenSpaceBuffer[PEI_EXMAPPING_TABLE_SIZE + DXE_EXMAPPING_TABLE_SIZE] = { 0 };
EFI_STATUS
EFIAPI
DxePcdGetNextTokenSpace (
IN OUT CONST EFI_GUID **Guid
)
{
UINTN Idx;
UINTN Idx2;
UINTN Idx3;
UINTN PeiTokenSpaceTableSize;
UINTN DxeTokenSpaceTableSize;
EFI_GUID **PeiTokenSpaceTable;
EFI_GUID **DxeTokenSpaceTable;
BOOLEAN Match;
ASSERT (Guid != NULL);
if (PEI_EXMAP_TABLE_EMPTY && DXE_EXMAP_TABLE_EMPTY) {
if (*Guid != NULL) {
return EFI_NOT_FOUND;
} else {
return EFI_SUCCESS;
}
}
if (TmpTokenSpaceBuffer[0] != NULL) {
PeiTokenSpaceTableSize = 0;
if (!PEI_EXMAP_TABLE_EMPTY) {
PeiTokenSpaceTableSize = PEI_EXMAPPING_TABLE_SIZE;
PeiTokenSpaceTable = GetDistinctTokenSpace (&PeiTokenSpaceTableSize,
mPcdDatabase->PeiDb.Init.ExMapTable,
mPcdDatabase->PeiDb.Init.GuidTable
);
CopyMem (TmpTokenSpaceBuffer, PeiTokenSpaceTable, sizeof (EFI_GUID*) * PeiTokenSpaceTableSize);
}
if (!DXE_EXMAP_TABLE_EMPTY) {
DxeTokenSpaceTableSize = DXE_EXMAPPING_TABLE_SIZE;
DxeTokenSpaceTable = GetDistinctTokenSpace (&DxeTokenSpaceTableSize,
mPcdDatabase->DxeDb.Init.ExMapTable,
mPcdDatabase->DxeDb.Init.GuidTable
);
//
// Make sure EFI_GUID in DxeTokenSpaceTable does not exist in PeiTokenSpaceTable
//
for (Idx2 = 0, Idx3 = PeiTokenSpaceTableSize; Idx2 < DxeTokenSpaceTableSize; Idx2++) {
Match = FALSE;
for (Idx = 0; Idx < PeiTokenSpaceTableSize; Idx++) {
if (CompareGuid (TmpTokenSpaceBuffer[Idx], DxeTokenSpaceTable[Idx2])) {
Match = TRUE;
break;
}
}
if (!Match) {
TmpTokenSpaceBuffer[Idx3++] = DxeTokenSpaceTable[Idx2];
}
}
}
}
if (*Guid == NULL) {
*Guid = TmpTokenSpaceBuffer[0];
return EFI_SUCCESS;
}
for (Idx = 0; Idx < (PEI_EXMAPPING_TABLE_SIZE + DXE_EXMAPPING_TABLE_SIZE); Idx++) {
if(CompareGuid (*Guid, TmpTokenSpaceBuffer[Idx])) {
Idx++;
*Guid = TmpTokenSpaceBuffer[Idx];
return EFI_SUCCESS;
}
}
return EFI_NOT_FOUND;
}

View File

@ -52,7 +52,8 @@ PCD_PPI mPcdPpiInstance = {
PeiRegisterCallBackOnSet, PeiRegisterCallBackOnSet,
PcdUnRegisterCallBackOnSet, PcdUnRegisterCallBackOnSet,
PeiPcdGetNextToken PeiPcdGetNextToken,
PeiPcdGetNextTokenSpace
}; };
@ -568,7 +569,7 @@ PeiPcdGetNextToken (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
PeiPcdGetNextTokenSpaceGuid ( PeiPcdGetNextTokenSpace (
IN OUT CONST EFI_GUID **Guid IN OUT CONST EFI_GUID **Guid
) )
{ {
@ -579,17 +580,15 @@ PeiPcdGetNextTokenSpaceGuid (
UINTN i; UINTN i;
BOOLEAN Found; BOOLEAN Found;
if (*Guid == NULL) { ASSERT (Guid != NULL);
if (PEI_EXMAP_TABLE_EMPTY) {
return EFI_SUCCESS; if (PEI_EXMAP_TABLE_EMPTY) {
if (*Guid != NULL) {
return EFI_NOT_FOUND;
} else { } else {
//
// return the first Token Space Guid.
//
*Guid = &PeiPcdDb->Init.GuidTable[ExMapTable[0].ExGuidIndex];
return EFI_SUCCESS; return EFI_SUCCESS;
} }
} }
// //
// Assume PCD Database AutoGen tool is sorting the ExMap based on the following order // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order
@ -598,6 +597,16 @@ PeiPcdGetNextTokenSpaceGuid (
// //
PeiPcdDb = GetPcdDatabase (); PeiPcdDb = GetPcdDatabase ();
ExMapTable = PeiPcdDb->Init.ExMapTable;
if (*Guid == NULL) {
//
// return the first Token Space Guid.
//
*Guid = &PeiPcdDb->Init.GuidTable[ExMapTable[0].ExGuidIndex];
return EFI_SUCCESS;
}
MatchGuid = ScanGuid (PeiPcdDb->Init.GuidTable, sizeof(PeiPcdDb->Init.GuidTable), *Guid); MatchGuid = ScanGuid (PeiPcdDb->Init.GuidTable, sizeof(PeiPcdDb->Init.GuidTable), *Guid);
if (MatchGuid == NULL) { if (MatchGuid == NULL) {
@ -606,8 +615,6 @@ PeiPcdGetNextTokenSpaceGuid (
GuidTableIdx = MatchGuid - PeiPcdDb->Init.GuidTable; GuidTableIdx = MatchGuid - PeiPcdDb->Init.GuidTable;
ExMapTable = PeiPcdDb->Init.ExMapTable;
Found = FALSE; Found = FALSE;
for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) { for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) {
if (ExMapTable[i].ExGuidIndex == GuidTableIdx) { if (ExMapTable[i].ExGuidIndex == GuidTableIdx) {
@ -617,12 +624,15 @@ PeiPcdGetNextTokenSpaceGuid (
} }
if (Found) { if (Found) {
i++;
for ( ; i < PEI_EXMAPPING_TABLE_SIZE; i++ ) { for ( ; i < PEI_EXMAPPING_TABLE_SIZE; i++ ) {
if (ExMapTable[i].ExGuidIndex != GuidTableIdx ) { if (ExMapTable[i].ExGuidIndex != GuidTableIdx ) {
*Guid = &PeiPcdDb->Init.GuidTable[ExMapTable[i].ExGuidIndex]; *Guid = &PeiPcdDb->Init.GuidTable[ExMapTable[i].ExGuidIndex];
return EFI_SUCCESS; return EFI_SUCCESS;
} }
} }
*Guid = NULL;
return EFI_SUCCESS;
} }
return EFI_NOT_FOUND; return EFI_NOT_FOUND;

View File

@ -381,6 +381,14 @@ PeiPcdGetNextToken (
) )
; ;
EFI_STATUS
EFIAPI
PeiPcdGetNextTokenSpace (
IN CONST EFI_GUID **Guid
)
;
extern EFI_GUID gPcdDataBaseHobGuid; extern EFI_GUID gPcdDataBaseHobGuid;
extern EFI_GUID gPcdPeiCallbackFnTableHobGuid; extern EFI_GUID gPcdPeiCallbackFnTableHobGuid;

View File

@ -436,10 +436,20 @@ LibPcdSet64 (
/** /**
Sets a buffer for the token specified by TokenNumber to Sets a buffer for the token specified by TokenNumber to
the value specified by Value. Value is returned. the value specified by Buffer and SizeOfValue. Buffer to
If Value is NULL, then ASSERT(). be set is returned. The content of the buffer could be
overwritten if a Callback on SET is registered with this
TokenNumber.
If SizeOfValue is greater than the maximum
size support by TokenNumber, then set SizeOfValue to the
maximum size supported by TokenNumber and return NULL to
indicate that the set operation was not actually performed.
If SizeOfValue > 0 and Buffer is NULL, then ASSERT().
@param[in] TokenNumber The PCD token number to set a current value for. @param[in] TokenNumber The PCD token number to set a current value for.
@param[in,out] SizeOfBuffer The size, in bytes, of Buffer.
@param[in] Value A pointer to the buffer to set. @param[in] Value A pointer to the buffer to set.
@retval VOID* Return the pointer for the buffer been set. @retval VOID* Return the pointer for the buffer been set.
@ -448,9 +458,9 @@ LibPcdSet64 (
VOID* VOID*
EFIAPI EFIAPI
LibPcdSetPtr ( LibPcdSetPtr (
IN UINTN TokenNumber, IN UINTN TokenNumber,
IN UINTN SizeOfBuffer, IN OUT UINTN *SizeOfBuffer,
IN VOID *Value IN VOID *Value
); );
@ -561,26 +571,30 @@ LibPcdSetEx64 (
/** /**
Sets a buffer for the token specified by TokenNumber and Sets a buffer for the token specified by TokenNumber to the value specified by
Guid to the value specified by Value. Value is returned. Buffer and SizeOfValue. Buffer is returned. If SizeOfValue is greater than
If Guid is NULL, then ASSERT(). the maximum size support by TokenNumber, then set SizeOfValue to the maximum size
If Value is NULL, then ASSERT(). supported by TokenNumber and return NULL to indicate that the set operation
was not actually performed.
If SizeOfValue > 0 and Buffer is NULL, then ASSERT().
@param[in] Guid Pointer to a 128-bit unique value that @param[in] Guid Pointer to a 128-bit unique value that
designates which namespace to set a value from. designates which namespace to set a value from.
@param[in] TokenNumber The PCD token number to set a current value for. @param[in] TokenNumber The PCD token number to set a current value for.
@param[in] Value The 8-bit value to set. @param[in, out] SizeOfBuffer The size, in bytes, of Buffer.
@param[in] Buffer A pointer to the buffer to set.
@retval VOID * Return the value been set. @retval VOID * Return the pinter to the buffer been set.
**/ **/
VOID * VOID *
EFIAPI EFIAPI
LibPcdSetExPtr ( LibPcdSetExPtr (
IN CONST GUID *Guid, IN CONST GUID *Guid,
IN UINTN TokenNumber, IN UINTN TokenNumber,
IN UINTN SizeOfBuffer, IN OUT UINTN *SizeOfBuffer,
IN VOID *Value IN VOID *Buffer
); );
@ -697,4 +711,30 @@ LibPcdGetNextToken (
IN UINTN TokenNumber IN UINTN TokenNumber
); );
/**
Retrieves the next PCD token space from a token space specified by Guid.
Guid of NULL is reserved to mark the default local token namespace on the current
platform. If Guid is NULL, then the GUID of the first non-local token space of the
current platform is returned. If Guid is the last non-local token space,
then NULL is returned.
If Guid is not NULL and is not a valid token space in the current platform, then ASSERT().
@param[in] Pointer to a 128-bit unique value that designates from which namespace
to start the search.
@retval CONST GUID * The next valid token namespace.
**/
CONST GUID*
EFIAPI
LibPcdGetNextTokenSpace (
IN CONST GUID *Guid
);
#endif #endif

View File

@ -256,6 +256,12 @@ EFI_STATUS
IN OUT UINTN *TokenNumber IN OUT UINTN *TokenNumber
); );
typedef
EFI_STATUS
(EFIAPI *PCD_PPI_GET_NEXT_TOKENSPACE) (
IN OUT CONST EFI_GUID **Guid
);
typedef struct { typedef struct {
PCD_PPI_SET_SKU SetSku; PCD_PPI_SET_SKU SetSku;
@ -292,6 +298,7 @@ typedef struct {
PCD_PPI_CALLBACK_ONSET CallbackOnSet; PCD_PPI_CALLBACK_ONSET CallbackOnSet;
PCD_PPI_CANCEL_CALLBACK CancelCallback; PCD_PPI_CANCEL_CALLBACK CancelCallback;
PCD_PPI_GET_NEXT_TOKEN GetNextToken; PCD_PPI_GET_NEXT_TOKEN GetNextToken;
PCD_PPI_GET_NEXT_TOKENSPACE GetNextTokenSpace;
} PCD_PPI; } PCD_PPI;

View File

@ -256,6 +256,14 @@ EFI_STATUS
IN OUT UINTN *TokenNumber IN OUT UINTN *TokenNumber
); );
typedef
EFI_STATUS
(EFIAPI *PCD_PROTOCOL_GET_NEXT_TOKENSPACE) (
IN CONST EFI_GUID **Guid
);
typedef struct { typedef struct {
PCD_PROTOCOL_SET_SKU SetSku; PCD_PROTOCOL_SET_SKU SetSku;
@ -292,6 +300,7 @@ typedef struct {
PCD_PROTOCOL_CALLBACK_ONSET CallbackOnSet; PCD_PROTOCOL_CALLBACK_ONSET CallbackOnSet;
PCD_PROTOCOL_CANCEL_CALLBACK CancelCallback; PCD_PROTOCOL_CANCEL_CALLBACK CancelCallback;
PCD_PROTOCOL_GET_NEXT_TOKEN GetNextToken; PCD_PROTOCOL_GET_NEXT_TOKEN GetNextToken;
PCD_PROTOCOL_GET_NEXT_TOKENSPACE GetNextTokenSpace;
} PCD_PROTOCOL; } PCD_PROTOCOL;
#endif #endif

View File

@ -434,10 +434,20 @@ LibPcdSet64 (
/** /**
Sets a buffer for the token specified by TokenNumber to Sets a buffer for the token specified by TokenNumber to
the value specified by Value. Value is returned. the value specified by Buffer and SizeOfValue. Buffer to
If Value is NULL, then ASSERT(). be set is returned. The content of the buffer could be
overwritten if a Callback on SET is registered with this
TokenNumber.
If SizeOfValue is greater than the maximum
size support by TokenNumber, then set SizeOfValue to the
maximum size supported by TokenNumber and return NULL to
indicate that the set operation was not actually performed.
If SizeOfValue > 0 and Buffer is NULL, then ASSERT().
@param[in] TokenNumber The PCD token number to set a current value for. @param[in] TokenNumber The PCD token number to set a current value for.
@param[in,out] SizeOfBuffer The size, in bytes, of Buffer.
@param[in] Value A pointer to the buffer to set. @param[in] Value A pointer to the buffer to set.
@retval VOID* Return the pointer for the buffer been set. @retval VOID* Return the pointer for the buffer been set.
@ -446,9 +456,9 @@ LibPcdSet64 (
VOID * VOID *
EFIAPI EFIAPI
LibPcdSetPtr ( LibPcdSetPtr (
IN UINTN TokenNumber, IN UINTN TokenNumber,
IN UINTN SizeOfBuffer, IN OUT UINTN *SizeOfBuffer,
IN VOID *Buffer IN VOID *Buffer
) )
{ {
ASSERT (Buffer != NULL); ASSERT (Buffer != NULL);
@ -593,26 +603,30 @@ LibPcdSetEx64 (
/** /**
Sets a buffer for the token specified by TokenNumber and Sets a buffer for the token specified by TokenNumber to the value specified by
Guid to the value specified by Value. Value is returned. Buffer and SizeOfValue. Buffer is returned. If SizeOfValue is greater than
If Guid is NULL, then ASSERT(). the maximum size support by TokenNumber, then set SizeOfValue to the maximum size
If Value is NULL, then ASSERT(). supported by TokenNumber and return NULL to indicate that the set operation
was not actually performed.
If SizeOfValue > 0 and Buffer is NULL, then ASSERT().
@param[in] Guid Pointer to a 128-bit unique value that @param[in] Guid Pointer to a 128-bit unique value that
designates which namespace to set a value from. designates which namespace to set a value from.
@param[in] TokenNumber The PCD token number to set a current value for. @param[in] TokenNumber The PCD token number to set a current value for.
@param[in] Value The 8-bit value to set. @param[in, out] SizeOfBuffer The size, in bytes, of Buffer.
@param[in] Buffer A pointer to the buffer to set.
@retval VOID * Return the value been set. @retval VOID * Return the pinter to the buffer been set.
**/ **/
VOID * VOID *
EFIAPI EFIAPI
LibPcdSetExPtr ( LibPcdSetExPtr (
IN CONST GUID *Guid, IN CONST GUID *Guid,
IN UINTN TokenNumber, IN UINTN TokenNumber,
IN UINTN SizeOfBuffer, IN OUT UINTN *SizeOfBuffer,
IN VOID *Buffer IN VOID *Buffer
) )
{ {
ASSERT (Guid != NULL); ASSERT (Guid != NULL);
@ -729,3 +743,31 @@ LibPcdGetNextToken (
{ {
return 0; return 0;
} }
/**
Retrieves the next PCD token space from a token space specified by Guid.
Guid of NULL is reserved to mark the default local token namespace on the current
platform. If Guid is NULL, then the GUID of the first non-local token space of the
current platform is returned. If Guid is the last non-local token space,
then NULL is returned.
If Guid is not NULL and is not a valid token space in the current platform, then ASSERT().
@param[in] Pointer to a 128-bit unique value that designates from which namespace
to start the search.
@retval CONST GUID * The next valid token namespace.
**/
CONST GUID*
EFIAPI
LibPcdGetNextTokenSpace (
IN CONST GUID *Guid
)
{
return NULL;
}

View File

@ -483,28 +483,47 @@ LibPcdSet64 (
/** /**
Sets a buffer for the token specified by TokenNumber to Sets a buffer for the token specified by TokenNumber to
the value specified by Value. Value is returned. the value specified by Buffer and SizeOfValue. Buffer to
If Value is NULL, then ASSERT(). be set is returned. The content of the buffer could be
overwritten if a Callback on SET is registered with this
TokenNumber.
If SizeOfValue is greater than the maximum
size support by TokenNumber, then set SizeOfValue to the
maximum size supported by TokenNumber and return NULL to
indicate that the set operation was not actually performed.
If SizeOfValue > 0 and Buffer is NULL, then ASSERT().
@param[in] TokenNumber The PCD token number to set a current value for. @param[in] TokenNumber The PCD token number to set a current value for.
@param[in,out] SizeOfBuffer The size, in bytes, of Buffer.
@param[in] Value A pointer to the buffer to set. @param[in] Value A pointer to the buffer to set.
@retval VOID* Return the pointer for the buffer been set. @retval VOID* Return the pointer for the buffer been set.
**/ **/
VOID * VOID *
EFIAPI EFIAPI
LibPcdSetPtr ( LibPcdSetPtr (
IN UINTN TokenNumber, IN UINTN TokenNumber,
IN UINTN SizeOfBuffer, IN OUT UINTN *SizeOfBuffer,
IN VOID *Buffer IN VOID *Buffer
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
UINTN Size;
ASSERT (Buffer != NULL); ASSERT ((*SizeOfBuffer > 0) && Buffer == NULL);
Status = mPcd->SetPtr (TokenNumber, SizeOfBuffer, Buffer); Size = LibPcdGetSize (TokenNumber);
if (*SizeOfBuffer > Size) {
*SizeOfBuffer = Size;
return NULL;
}
Status = mPcd->SetPtr (TokenNumber, *SizeOfBuffer, Buffer);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
@ -678,34 +697,45 @@ LibPcdSetEx64 (
/** /**
Sets a buffer for the token specified by TokenNumber and Sets a buffer for the token specified by TokenNumber to the value specified by
Guid to the value specified by Value. Value is returned. Buffer and SizeOfValue. Buffer is returned. If SizeOfValue is greater than
If Guid is NULL, then ASSERT(). the maximum size support by TokenNumber, then set SizeOfValue to the maximum size
If Value is NULL, then ASSERT(). supported by TokenNumber and return NULL to indicate that the set operation
was not actually performed.
If SizeOfValue > 0 and Buffer is NULL, then ASSERT().
@param[in] Guid Pointer to a 128-bit unique value that @param[in] Guid Pointer to a 128-bit unique value that
designates which namespace to set a value from. designates which namespace to set a value from.
@param[in] TokenNumber The PCD token number to set a current value for. @param[in] TokenNumber The PCD token number to set a current value for.
@param[in] Value The 8-bit value to set. @param[in, out] SizeOfBuffer The size, in bytes, of Buffer.
@param[in] Buffer A pointer to the buffer to set.
@retval VOID * Return the value been set. @retval VOID * Return the pinter to the buffer been set.
**/ **/
VOID * VOID *
EFIAPI EFIAPI
LibPcdSetExPtr ( LibPcdSetExPtr (
IN CONST GUID *Guid, IN CONST GUID *Guid,
IN UINTN TokenNumber, IN UINTN TokenNumber,
IN UINTN SizeOfBuffer, IN OUT UINTN *SizeOfBuffer,
IN VOID *Buffer IN VOID *Buffer
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
UINTN Size;
ASSERT (Guid != NULL); ASSERT (Guid != NULL);
ASSERT (Buffer != NULL); ASSERT (Buffer != NULL);
Status = mPcd->SetPtrEx (Guid, TokenNumber, SizeOfBuffer, Buffer); Size = LibPcdGetExSize (Guid, TokenNumber);
if (*SizeOfBuffer > Size) {
*SizeOfBuffer = Size;
return NULL;
}
Status = mPcd->SetPtrEx (Guid, TokenNumber, *SizeOfBuffer, Buffer);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
@ -849,3 +879,37 @@ LibPcdGetNextToken (
return TokenNumber; return TokenNumber;
} }
/**
Retrieves the next PCD token space from a token space specified by Guid.
Guid of NULL is reserved to mark the default local token namespace on the current
platform. If Guid is NULL, then the GUID of the first non-local token space of the
current platform is returned. If Guid is the last non-local token space,
then NULL is returned.
If Guid is not NULL and is not a valid token space in the current platform, then ASSERT().
@param[in] Pointer to a 128-bit unique value that designates from which namespace
to start the search.
@retval CONST GUID * The next valid token namespace.
**/
CONST GUID*
EFIAPI
LibPcdGetNextTokenSpace (
IN CONST GUID *Guid
)
{
EFI_STATUS Status;
Status = mPcd->GetNextTokenSpace (&Guid);
ASSERT_EFI_ERROR (Status);
return Guid;
}

View File

@ -555,10 +555,20 @@ LibPcdSet64 (
/** /**
Sets a buffer for the token specified by TokenNumber to Sets a buffer for the token specified by TokenNumber to
the value specified by Value. Value is returned. the value specified by Buffer and SizeOfValue. Buffer to
If Value is NULL, then ASSERT(). be set is returned. The content of the buffer could be
overwritten if a Callback on SET is registered with this
TokenNumber.
If SizeOfValue is greater than the maximum
size support by TokenNumber, then set SizeOfValue to the
maximum size supported by TokenNumber and return NULL to
indicate that the set operation was not actually performed.
If SizeOfValue > 0 and Buffer is NULL, then ASSERT().
@param[in] TokenNumber The PCD token number to set a current value for. @param[in] TokenNumber The PCD token number to set a current value for.
@param[in,out] SizeOfBuffer The size, in bytes, of Buffer.
@param[in] Value A pointer to the buffer to set. @param[in] Value A pointer to the buffer to set.
@retval VOID* Return the pointer for the buffer been set. @retval VOID* Return the pointer for the buffer been set.
@ -567,18 +577,27 @@ LibPcdSet64 (
VOID * VOID *
EFIAPI EFIAPI
LibPcdSetPtr ( LibPcdSetPtr (
IN UINTN TokenNumber, IN UINTN TokenNumber,
IN UINTN SizeOfBuffer, IN OUT UINTN *SizeOfBuffer,
IN VOID *Buffer IN VOID *Buffer
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
PCD_PPI * PcdPpi; PCD_PPI *PcdPpi;
UINTN Size;
PcdPpi = GetPcdPpiPtr (); PcdPpi = GetPcdPpiPtr ();
ASSERT ((*SizeOfBuffer > 0) && Buffer == NULL);
Status = PcdPpi->SetPtr (TokenNumber, SizeOfBuffer, Buffer); Size = LibPcdGetSize (TokenNumber);
if (*SizeOfBuffer > Size) {
*SizeOfBuffer = Size;
return NULL;
}
Status = PcdPpi->SetPtr (TokenNumber, *SizeOfBuffer, Buffer);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
@ -764,34 +783,45 @@ LibPcdSetEx64 (
/** /**
Sets a buffer for the token specified by TokenNumber and Sets a buffer for the token specified by TokenNumber to the value specified by
Guid to the value specified by Value. Value is returned. Buffer and SizeOfValue. Buffer is returned. If SizeOfValue is greater than
If Guid is NULL, then ASSERT(). the maximum size support by TokenNumber, then set SizeOfValue to the maximum size
If Value is NULL, then ASSERT(). supported by TokenNumber and return NULL to indicate that the set operation
was not actually performed.
If SizeOfValue > 0 and Buffer is NULL, then ASSERT().
@param[in] Guid Pointer to a 128-bit unique value that @param[in] Guid Pointer to a 128-bit unique value that
designates which namespace to set a value from. designates which namespace to set a value from.
@param[in] TokenNumber The PCD token number to set a current value for. @param[in] TokenNumber The PCD token number to set a current value for.
@param[in] Value The 8-bit value to set. @param[in, out] SizeOfBuffer The size, in bytes, of Buffer.
@param[in] Buffer A pointer to the buffer to set.
@retval VOID * Return the value been set. @retval VOID * Return the pinter to the buffer been set.
**/ **/
VOID * VOID *
EFIAPI EFIAPI
LibPcdSetExPtr ( LibPcdSetExPtr (
IN CONST GUID *Guid, IN CONST GUID *Guid,
IN UINTN TokenNumber, IN UINTN TokenNumber,
IN UINTN SizeOfBuffer, IN OUT UINTN *SizeOfBuffer,
IN VOID *Buffer IN VOID *Buffer
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
PCD_PPI * PcdPpi; PCD_PPI *PcdPpi;
UINTN Size;
PcdPpi = GetPcdPpiPtr (); PcdPpi = GetPcdPpiPtr ();
Status = PcdPpi->SetPtrEx (Guid, TokenNumber, SizeOfBuffer, Buffer); Size = LibPcdGetExSize (Guid, TokenNumber);
if (*SizeOfBuffer > Size) {
*SizeOfBuffer = Size;
return NULL;
}
Status = PcdPpi->SetPtrEx (Guid, TokenNumber, *SizeOfBuffer, Buffer);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
@ -944,3 +974,41 @@ LibPcdGetNextToken (
return TokenNumber; return TokenNumber;
} }
/**
Retrieves the next PCD token space from a token space specified by Guid.
Guid of NULL is reserved to mark the default local token namespace on the current
platform. If Guid is NULL, then the GUID of the first non-local token space of the
current platform is returned. If Guid is the last non-local token space,
then NULL is returned.
If Guid is not NULL and is not a valid token space in the current platform, then ASSERT().
@param[in] Pointer to a 128-bit unique value that designates from which namespace
to start the search.
@retval CONST GUID * The next valid token namespace.
**/
CONST GUID*
EFIAPI
LibPcdGetNextTokenSpace (
IN CONST GUID *Guid
)
{
EFI_STATUS Status;
PCD_PPI * PcdPpi;
PcdPpi = GetPcdPpiPtr ();
Status = PcdPpi->GetNextTokenSpace (&Guid);
ASSERT_EFI_ERROR (Status);
return Guid;
}

View File

@ -1684,7 +1684,14 @@ class PcdDatabase {
*/ */
s += tab + tab + String.format("{ %s }", t.skuData.get(i).value.vpdOffset); s += tab + tab + String.format("{ %s }", t.skuData.get(i).value.vpdOffset);
} else { } else {
s += tab + tab + String.format("{ %s }", t.skuData.get(i).value.value); if (t.isByteStreamType()) {
//
// Byte stream type input has their own "{" "}", so we won't help to insert.
//
s += tab + tab + String.format(" %s ", t.skuData.get(i).value.value);
} else {
s += tab + tab + String.format("{ %s }", t.skuData.get(i).value.value);
}
} }
if (i != t.skuData.size() - 1) { if (i != t.skuData.size() - 1) {

View File

@ -15,10 +15,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/ **/
package org.tianocore.build.pcd.entity; package org.tianocore.build.pcd.entity;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.UUID; import java.util.UUID;
import org.tianocore.build.pcd.exception.EntityException; import org.tianocore.build.pcd.exception.EntityException;

View File

@ -708,6 +708,23 @@ public class Token {
return false; return false;
} }
public boolean isByteStreamType () {
String str = getDynamicDefaultValue();
if (str == null) {
return false;
}
if (datumType == Token.DATUM_TYPE.POINTER &&
str.startsWith("{") &&
str.endsWith("}")) {
return true;
}
return false;
}
public String getStringTypeString () { public String getStringTypeString () {
return getDefaultSku().value.substring(2, getDefaultSku().value.length() - 1); return getDefaultSku().value.substring(2, getDefaultSku().value.length() - 1);
} }