git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2264
6f19259b-4bc3-4df7-8a09-
765794883524
\r
#include "Service.h"\r
\r
\r
#include "Service.h"\r
\r
+EFI_LOCK mPcdDatabaseLock = EFI_INITIALIZE_LOCK_VARIABLE(EFI_TPL_CALLBACK);\r
\r
PCD_PROTOCOL mPcdInstance = {\r
DxePcdSetSku,\r
\r
PCD_PROTOCOL mPcdInstance = {\r
DxePcdSetSku,\r
IN PCD_PROTOCOL_CALLBACK CallBackFunction\r
)\r
{\r
IN PCD_PROTOCOL_CALLBACK CallBackFunction\r
)\r
{\r
+ EFI_STATUS Status;\r
+ \r
ASSERT (CallBackFunction != NULL);\r
\r
ASSERT (CallBackFunction != NULL);\r
\r
- return DxeRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction);\r
+ //\r
+ // Aquire lock to prevent reentrance from TPL_CALLBACK level\r
+ //\r
+ EfiAcquireLock (&mPcdDatabaseLock);\r
+\r
+ Status = DxeRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction);\r
+\r
+ EfiReleaseLock (&mPcdDatabaseLock);\r
+ \r
+ return Status;\r
IN PCD_PROTOCOL_CALLBACK CallBackFunction\r
)\r
{\r
IN PCD_PROTOCOL_CALLBACK CallBackFunction\r
)\r
{\r
+ EFI_STATUS Status;\r
+ \r
ASSERT (CallBackFunction != NULL);\r
ASSERT (CallBackFunction != NULL);\r
+\r
+ //\r
+ // Aquire lock to prevent reentrance from TPL_CALLBACK level\r
+ //\r
+ EfiAcquireLock (&mPcdDatabaseLock);\r
- return DxeUnRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction);\r
+ Status = DxeUnRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction);\r
+\r
+ EfiReleaseLock (&mPcdDatabaseLock);\r
+ \r
+ return Status;\r
{\r
UINT32 *LocalTokenNumberTable;\r
UINT16 *SizeTable;\r
{\r
UINT32 *LocalTokenNumberTable;\r
UINT16 *SizeTable;\r
- BOOLEAN IsPeiDb;\r
- UINT32 Offset;\r
EFI_GUID *GuidTable;\r
UINT16 *StringTable;\r
EFI_GUID *Guid;\r
UINT16 *Name;\r
VARIABLE_HEAD *VariableHead;\r
UINT8 *VaraiableDefaultBuffer;\r
EFI_GUID *GuidTable;\r
UINT16 *StringTable;\r
EFI_GUID *Guid;\r
UINT16 *Name;\r
VARIABLE_HEAD *VariableHead;\r
UINT8 *VaraiableDefaultBuffer;\r
- EFI_STATUS Status;\r
- UINTN DataSize;\r
UINT8 *Data;\r
VPD_HEAD *VpdHead;\r
UINT8 *PcdDb;\r
UINT8 *Data;\r
VPD_HEAD *VpdHead;\r
UINT8 *PcdDb;\r
- UINT16 StringTableIdx; \r
- UINT32 LocalTokenNumber;\r
UINTN MaxSize;\r
UINTN TmpTokenNumber;\r
UINTN MaxSize;\r
UINTN TmpTokenNumber;\r
+ UINTN DataSize;\r
+ EFI_STATUS Status;\r
+ UINT32 LocalTokenNumber;\r
+ UINT32 Offset;\r
+ UINT16 StringTableIdx; \r
+ BOOLEAN IsPeiDb;\r
+ //\r
+ // Aquire lock to prevent reentrance from TPL_CALLBACK level\r
+ //\r
+ EfiAcquireLock (&mPcdDatabaseLock);\r
+\r
+ RetPtr = NULL;\r
//\r
// TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
// We have to decrement TokenNumber by 1 to make it usable\r
//\r
// TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
// We have to decrement TokenNumber by 1 to make it usable\r
switch (LocalTokenNumber & PCD_TYPE_ALL_SET) {\r
case PCD_TYPE_VPD:\r
VpdHead = (VPD_HEAD *) ((UINT8 *) PcdDb + Offset);\r
switch (LocalTokenNumber & PCD_TYPE_ALL_SET) {\r
case PCD_TYPE_VPD:\r
VpdHead = (VPD_HEAD *) ((UINT8 *) PcdDb + Offset);\r
- return (VOID *) (UINTN) (FixedPcdGet32(PcdVpdBaseAddress) + VpdHead->Offset);\r
+ RetPtr = (VOID *) (UINTN) (FixedPcdGet32(PcdVpdBaseAddress) + VpdHead->Offset);\r
+ break;\r
\r
case PCD_TYPE_HII:\r
GuidTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.GuidTable :\r
\r
case PCD_TYPE_HII:\r
GuidTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.GuidTable :\r
// Return 1) either the default value specified by Platform Integrator \r
// 2) Or the value Set by a PCD set operation.\r
//\r
// Return 1) either the default value specified by Platform Integrator \r
// 2) Or the value Set by a PCD set operation.\r
//\r
- return (VOID *) VaraiableDefaultBuffer;\r
+ RetPtr = (VOID *) VaraiableDefaultBuffer;\r
+ break;\r
\r
case PCD_TYPE_STRING:\r
StringTableIdx = (UINT16) *((UINT8 *) PcdDb + Offset);\r
\r
case PCD_TYPE_STRING:\r
StringTableIdx = (UINT16) *((UINT8 *) PcdDb + Offset);\r
- return (VOID *) &StringTable[StringTableIdx];\r
+ RetPtr = (VOID *) &StringTable[StringTableIdx];\r
+ break;\r
- return (VOID *) ((UINT8 *) PcdDb + Offset);\r
+ RetPtr = (VOID *) ((UINT8 *) PcdDb + Offset);\r
- ASSERT (FALSE);\r
- \r
- return NULL;\r
+ EfiReleaseLock (&mPcdDatabaseLock);\r
+ \r
+ return RetPtr;\r
UINTN MaxSize;\r
UINTN TmpTokenNumber;\r
\r
UINTN MaxSize;\r
UINTN TmpTokenNumber;\r
\r
+ //\r
+ // Aquire lock to prevent reentrance from TPL_CALLBACK level\r
+ //\r
+ EfiAcquireLock (&mPcdDatabaseLock);\r
+\r
//\r
// TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
// We have to decrement TokenNumber by 1 to make it usable\r
//\r
// TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
// We have to decrement TokenNumber by 1 to make it usable\r
switch (LocalTokenNumber & PCD_TYPE_ALL_SET) {\r
case PCD_TYPE_VPD:\r
ASSERT (FALSE);\r
switch (LocalTokenNumber & PCD_TYPE_ALL_SET) {\r
case PCD_TYPE_VPD:\r
ASSERT (FALSE);\r
- return EFI_INVALID_PARAMETER;\r
+ Status = EFI_INVALID_PARAMETER;\r
+ break;\r
\r
case PCD_TYPE_STRING:\r
if (SetPtrTypeSize (TmpTokenNumber, Size)) {\r
CopyMem (&StringTable[*((UINT16 *)InternalData)], Data, *Size);\r
\r
case PCD_TYPE_STRING:\r
if (SetPtrTypeSize (TmpTokenNumber, Size)) {\r
CopyMem (&StringTable[*((UINT16 *)InternalData)], Data, *Size);\r
+ Status = EFI_SUCCESS;\r
- return EFI_INVALID_PARAMETER;\r
+ Status = EFI_INVALID_PARAMETER;\r
\r
case PCD_TYPE_HII:\r
if (PtrType) {\r
if (!SetPtrTypeSize (TmpTokenNumber, Size)) {\r
\r
case PCD_TYPE_HII:\r
if (PtrType) {\r
if (!SetPtrTypeSize (TmpTokenNumber, Size)) {\r
- return EFI_INVALID_PARAMETER;\r
+ Status = EFI_INVALID_PARAMETER;\r
+ break;\r
\r
if (EFI_NOT_FOUND == Status) {\r
CopyMem (PcdDb + VariableHead->DefaultValueOffset, Data, *Size);\r
\r
if (EFI_NOT_FOUND == Status) {\r
CopyMem (PcdDb + VariableHead->DefaultValueOffset, Data, *Size);\r
- return EFI_SUCCESS;\r
- } else {\r
- return Status;\r
- }\r
+ Status = EFI_SUCCESS;\r
+ } \r
+ break;\r
\r
case PCD_TYPE_DATA:\r
if (PtrType) {\r
if (SetPtrTypeSize (TmpTokenNumber, Size)) {\r
CopyMem (InternalData, Data, *Size);\r
\r
case PCD_TYPE_DATA:\r
if (PtrType) {\r
if (SetPtrTypeSize (TmpTokenNumber, Size)) {\r
CopyMem (InternalData, Data, *Size);\r
+ Status = EFI_SUCCESS;\r
- return EFI_INVALID_PARAMETER;\r
+ Status = EFI_INVALID_PARAMETER;\r
+ Status = EFI_SUCCESS;\r
switch (*Size) {\r
case sizeof(UINT8):\r
*((UINT8 *) InternalData) = *((UINT8 *) Data);\r
switch (*Size) {\r
case sizeof(UINT8):\r
*((UINT8 *) InternalData) = *((UINT8 *) Data);\r
\r
case sizeof(UINT16):\r
*((UINT16 *) InternalData) = *((UINT16 *) Data);\r
\r
case sizeof(UINT16):\r
*((UINT16 *) InternalData) = *((UINT16 *) Data);\r
\r
case sizeof(UINT32):\r
*((UINT32 *) InternalData) = *((UINT32 *) Data);\r
\r
case sizeof(UINT32):\r
*((UINT32 *) InternalData) = *((UINT32 *) Data);\r
\r
case sizeof(UINT64):\r
*((UINT64 *) InternalData) = *((UINT64 *) Data);\r
\r
case sizeof(UINT64):\r
*((UINT64 *) InternalData) = *((UINT64 *) Data);\r
\r
default:\r
ASSERT (FALSE);\r
\r
default:\r
ASSERT (FALSE);\r
- return EFI_NOT_FOUND;\r
+ Status = EFI_NOT_FOUND;\r
+ break;\r
\r
default:\r
ASSERT (FALSE);\r
\r
default:\r
ASSERT (FALSE);\r
+ Status = EFI_NOT_FOUND;\r
- \r
- ASSERT (FALSE);\r
- return EFI_NOT_FOUND;\r
+\r
+ EfiReleaseLock (&mPcdDatabaseLock);\r
+ \r
+ return Status;\r
\r
extern DXE_PCD_DATABASE_INIT gDXEPcdDbInit;\r
\r
\r
extern DXE_PCD_DATABASE_INIT gDXEPcdDbInit;\r
\r
+extern EFI_LOCK mPcdDatabaseLock;\r
+\r