Add Lock for cirtical section in PCD database processing routines as PCD database...
authorqwang12 <qwang12@de2fecce-e211-0410-80a6-f3fac2684e05>
Thu, 18 Jan 2007 02:46:28 +0000 (02:46 +0000)
committerqwang12 <qwang12@de2fecce-e211-0410-80a6-f3fac2684e05>
Thu, 18 Jan 2007 02:46:28 +0000 (02:46 +0000)
git-svn-id: https://edk2.tianocore.org/svn/edk2/trunk@2264 de2fecce-e211-0410-80a6-f3fac2684e05

edk2/EdkModulePkg/Universal/PCD/Dxe/Pcd.c
edk2/EdkModulePkg/Universal/PCD/Dxe/Service.c
edk2/EdkModulePkg/Universal/PCD/Dxe/Service.h

index c8db1b0..57c67d6 100644 (file)
@@ -17,6 +17,7 @@ Module Name: Pcd.c
 \r
 #include "Service.h"\r
 \r
+EFI_LOCK mPcdDatabaseLock = EFI_INITIALIZE_LOCK_VARIABLE(EFI_TPL_CALLBACK);\r
 \r
 PCD_PROTOCOL mPcdInstance = {\r
   DxePcdSetSku,\r
@@ -472,9 +473,20 @@ DxeRegisterCallBackOnSet (
   IN  PCD_PROTOCOL_CALLBACK   CallBackFunction\r
   )\r
 {\r
+  EFI_STATUS Status;\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
 }\r
 \r
 \r
@@ -487,9 +499,20 @@ DxeUnRegisterCallBackOnSet (
   IN  PCD_PROTOCOL_CALLBACK   CallBackFunction\r
   )\r
 {\r
+  EFI_STATUS Status;\r
+  \r
   ASSERT (CallBackFunction != NULL);\r
+\r
+  //\r
+  // Aquire lock to prevent reentrance from TPL_CALLBACK level\r
+  //\r
+  EfiAcquireLock (&mPcdDatabaseLock);\r
   \r
-  return DxeUnRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction);\r
+  Status = DxeUnRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction);\r
+\r
+  EfiReleaseLock (&mPcdDatabaseLock);\r
+  \r
+  return Status;\r
 }\r
 \r
 \r
index a4b1987..13abab0 100644 (file)
@@ -29,24 +29,31 @@ GetWorker (
 {\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
@@ -100,7 +107,8 @@ GetWorker (
   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
@@ -134,14 +142,16 @@ GetWorker (
       // 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
@@ -150,9 +160,9 @@ GetWorker (
       \r
   }\r
 \r
-  ASSERT (FALSE);\r
-      \r
-  return NULL;\r
+  EfiReleaseLock (&mPcdDatabaseLock);\r
+  \r
+  return RetPtr;\r
   \r
 }\r
 \r
@@ -560,6 +570,11 @@ SetWorker (
   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
@@ -621,20 +636,23 @@ SetWorker (
   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
-        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 (TmpTokenNumber, Size)) {\r
-          return EFI_INVALID_PARAMETER;\r
+          Status = EFI_INVALID_PARAMETER;\r
+          break;\r
         }\r
       }\r
       \r
@@ -651,50 +669,55 @@ SetWorker (
 \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
-          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
index 67a7435..572d172 100644 (file)
@@ -475,4 +475,6 @@ extern PCD_DATABASE * mPcdDatabase;
 \r
 extern DXE_PCD_DATABASE_INIT gDXEPcdDbInit;\r
 \r
+extern EFI_LOCK mPcdDatabaseLock;\r
+\r
 #endif\r