]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkModulePkg/Universal/PCD/Dxe/Service.c
Add Lock for cirtical section in PCD database processing routines as PCD database...
[mirror_edk2.git] / EdkModulePkg / Universal / PCD / Dxe / Service.c
index a2706d0bd3949c166845d50ead7f86bc16a1297e..13abab001a824920ad34cfc345169dd56f50b335 100644 (file)
@@ -1,5 +1,5 @@
 /** @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
@@ -17,11 +17,6 @@ Module Name: Service.c
 #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
@@ -34,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
@@ -105,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
@@ -124,7 +127,7 @@ GetWorker (
           // 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
@@ -139,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
@@ -155,9 +160,9 @@ GetWorker (
       \r
   }\r
 \r
-  ASSERT (FALSE);\r
-      \r
-  return NULL;\r
+  EfiReleaseLock (&mPcdDatabaseLock);\r
+  \r
+  return RetPtr;\r
   \r
 }\r
 \r
@@ -341,7 +346,6 @@ BuildPcdDxeDataBase (
   ASSERT (mPcdDatabase != NULL);\r
 \r
   GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);\r
-\r
   if (GuidHob != NULL) {\r
 \r
     //\r
@@ -566,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
@@ -627,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 (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
@@ -657,54 +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
-      //\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
@@ -777,7 +790,7 @@ SetHiiVariable (
   Status = gRT->GetVariable (\r
     (UINT16 *)VariableName,\r
     VariableGuid,\r
-    &Attribute,\r
+    NULL,\r
     &Size,\r
     NULL\r
     );\r