/** @file\r
-Private functions used by PCD DXE driver.s\r
+Private functions used by PCD DXE driver.\r
\r
Copyright (c) 2006, Intel Corporation\r
All rights reserved. This program and the accompanying materials\r
#include "Service.h"\r
\r
\r
-//\r
-// Build Tool will generate DXE_PCD_DB_INIT_VALUE in Autogen.h\r
-// Compression Algorithm will take care of the size optimization.\r
-//\r
-\r
PCD_DATABASE * mPcdDatabase;\r
\r
LIST_ENTRY *mCallbackFnTable;\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_STATUS Status;\r
- UINTN DataSize;\r
UINT8 *Data;\r
VPD_HEAD *VpdHead;\r
UINT8 *PcdDb;\r
- UINT16 StringTableIdx; \r
- UINT32 LocalTokenNumber;\r
+ VOID *RetPtr;\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
+ //\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
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
// It is a pointer type. So get the MaxSize reserved for\r
// this PCD entry.\r
//\r
- GetPtrTypeSize (TokenNumber, &GetSize);\r
+ GetPtrTypeSize (TmpTokenNumber, &GetSize);\r
}\r
CopyMem (VaraiableDefaultBuffer, Data + VariableHead->Offset, GetSize);\r
FreePool (Data);\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
- return (VOID *) &StringTable[StringTableIdx];\r
+ RetPtr = (VOID *) &StringTable[StringTableIdx];\r
+ break;\r
\r
case PCD_TYPE_DATA:\r
- return (VOID *) ((UINT8 *) PcdDb + Offset);\r
+ RetPtr = (VOID *) ((UINT8 *) PcdDb + Offset);\r
break;\r
\r
default:\r
\r
}\r
\r
- ASSERT (FALSE);\r
- \r
- return NULL;\r
+ EfiReleaseLock (&mPcdDatabaseLock);\r
+ \r
+ return RetPtr;\r
\r
}\r
\r
ASSERT (mPcdDatabase != NULL);\r
\r
GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);\r
-\r
if (GuidHob != NULL) {\r
\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
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 (TokenNumber, Size)) {\r
+ if (SetPtrTypeSize (TmpTokenNumber, Size)) {\r
CopyMem (&StringTable[*((UINT16 *)InternalData)], Data, *Size);\r
- return EFI_SUCCESS;\r
+ Status = EFI_SUCCESS;\r
} else {\r
- return EFI_INVALID_PARAMETER;\r
+ Status = EFI_INVALID_PARAMETER;\r
}\r
+ break;\r
\r
case PCD_TYPE_HII:\r
if (PtrType) {\r
- if (!SetPtrTypeSize (TokenNumber, Size)) {\r
- return EFI_INVALID_PARAMETER;\r
+ if (!SetPtrTypeSize (TmpTokenNumber, Size)) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ break;\r
}\r
}\r
\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
- //\r
- // Bug Bug: Please implement this\r
- //\r
-\r
case PCD_TYPE_DATA:\r
if (PtrType) {\r
- if (SetPtrTypeSize (TokenNumber, Size)) {\r
+ if (SetPtrTypeSize (TmpTokenNumber, Size)) {\r
CopyMem (InternalData, Data, *Size);\r
- return EFI_SUCCESS;\r
+ Status = EFI_SUCCESS;\r
} else {\r
- return EFI_INVALID_PARAMETER;\r
+ Status = EFI_INVALID_PARAMETER;\r
}\r
+ break;\r
}\r
\r
+ Status = EFI_SUCCESS;\r
switch (*Size) {\r
case sizeof(UINT8):\r
*((UINT8 *) InternalData) = *((UINT8 *) Data);\r
- return EFI_SUCCESS;\r
+ break;\r
\r
case sizeof(UINT16):\r
*((UINT16 *) InternalData) = *((UINT16 *) Data);\r
- return EFI_SUCCESS;\r
+ break;\r
\r
case sizeof(UINT32):\r
*((UINT32 *) InternalData) = *((UINT32 *) Data);\r
- return EFI_SUCCESS;\r
+ break;\r
\r
case sizeof(UINT64):\r
*((UINT64 *) InternalData) = *((UINT64 *) Data);\r
- return EFI_SUCCESS;\r
+ break;\r
\r
default:\r
ASSERT (FALSE);\r
- return EFI_NOT_FOUND;\r
+ Status = EFI_NOT_FOUND;\r
+ break;\r
}\r
+ break;\r
\r
default:\r
ASSERT (FALSE);\r
+ Status = EFI_NOT_FOUND;\r
break;\r
}\r
- \r
- ASSERT (FALSE);\r
- return EFI_NOT_FOUND;\r
+\r
+ EfiReleaseLock (&mPcdDatabaseLock);\r
+ \r
+ return Status;\r
}\r
\r
\r
Status = gRT->GetVariable (\r
(UINT16 *)VariableName,\r
VariableGuid,\r
- &Attribute,\r
+ NULL,\r
&Size,\r
NULL\r
);\r