]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Pass the correct TokenNumber into a CallbackOnSet notification function. The value...
authormdkinney <mdkinney@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 11 Feb 2010 03:51:17 +0000 (03:51 +0000)
committermdkinney <mdkinney@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 11 Feb 2010 03:51:17 +0000 (03:51 +0000)
This would not normally cause an issue because the correct notification function was being called.  There is only an issue if the same notification function is being used for multiple tokens, and the notification function needs to use the TokenNumber parameter to determine which token setting caused the callback function to be called.

Update the logic so the CallbackOnSet notification functions are not called with the internal PCD database lock in the acquired state.  This allows other PCD Get/Set operations to be performed from within a CallbackOnSet notification.

Update logic so the PCD database lock is not left in the acquired state when SetWorker() returns EFI_INVALID_PARAMETER.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9981 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Universal/PCD/Dxe/Service.c

index 5cd9eb8ce56ad87097f26b58c6350bba776c0e05..59038fb45213562935bd6cce5b2fd396e49d0ebc 100644 (file)
@@ -14,9 +14,9 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 #include "Service.h"\r
 \r
-PCD_DATABASE mPcdDatabase;\r
+PCD_DATABASE  *mPcdDatabase;\r
 \r
-LIST_ENTRY *mCallbackFnTable;\r
+LIST_ENTRY    *mCallbackFnTable;\r
 \r
 /**\r
   Get the PCD entry pointer in PCD database.\r
@@ -213,11 +213,9 @@ DxeRegisterCallBackWorker (
   //\r
   // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
   // We have to decrement TokenNumber by 1 to make it usable\r
-  // as the array index.\r
+  // as the array index of mCallbackFnTable[].\r
   //\r
-  TokenNumber--;\r
-\r
-  ListHead = &mCallbackFnTable[TokenNumber];\r
+  ListHead = &mCallbackFnTable[TokenNumber - 1];\r
   ListNode = GetFirstNode (ListHead);\r
 \r
   while (ListNode != ListHead) {\r
@@ -274,11 +272,9 @@ DxeUnRegisterCallBackWorker (
   //\r
   // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
   // We have to decrement TokenNumber by 1 to make it usable\r
-  // as the array index.\r
+  // as the array index of mCallbackFnTable[].\r
   //\r
-  TokenNumber--;\r
-\r
-  ListHead = &mCallbackFnTable[TokenNumber];\r
+  ListHead = &mCallbackFnTable[TokenNumber - 1];\r
   ListNode = GetFirstNode (ListHead);\r
 \r
   while (ListNode != ListHead) {\r
@@ -624,15 +620,13 @@ InvokeCallbackOnSet (
   //\r
   // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
   // We have to decrement TokenNumber by 1 to make it usable\r
-  // as the array index.\r
+  // as the array index of mCallbackFnTable[].\r
   //\r
-  TokenNumber--;\r
-  \r
-  ListHead = &mCallbackFnTable[TokenNumber];\r
+  ListHead = &mCallbackFnTable[TokenNumber - 1];\r
   ListNode = GetFirstNode (ListHead);\r
 \r
   while (ListNode != ListHead) {\r
-    FnTableEntry = CR_FNENTRY_FROM_LISTNODE(ListNode, CALLBACK_FN_ENTRY, Node);\r
+    FnTableEntry = CR_FNENTRY_FROM_LISTNODE (ListNode, CALLBACK_FN_ENTRY, Node);\r
 \r
     FnTableEntry->CallbackFn(Guid, \r
                     (Guid == NULL) ? TokenNumber : ExTokenNumber,\r
@@ -707,11 +701,6 @@ 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
@@ -731,26 +720,31 @@ SetWorker (
   if ((!PtrType) && (*Size != DxePcdGetSize (TokenNumber + 1))) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
-  \r
+\r
   //\r
   // EBC compiler is very choosy. It may report warning about comparison\r
   // between UINTN and 0 . So we add 1 in each size of the \r
   // comparison.\r
   //\r
-  IsPeiDb = (BOOLEAN) ((TokenNumber + 1 < PEI_LOCAL_TOKEN_NUMBER + 1) ? TRUE : FALSE);\r
+  if ((TokenNumber + 1 < PEI_NEX_TOKEN_NUMBER + 1) ||\r
+      (TokenNumber + 1 >= PEI_LOCAL_TOKEN_NUMBER + 1 || TokenNumber + 1 < (PEI_LOCAL_TOKEN_NUMBER + DXE_NEX_TOKEN_NUMBER + 1))) {\r
+    InvokeCallbackOnSet (0, NULL, TokenNumber + 1, Data, *Size);\r
+  }\r
 \r
-  LocalTokenNumberTable  = IsPeiDb ? mPcdDatabase->PeiDb.Init.LocalTokenNumberTable : \r
-                                     mPcdDatabase->DxeDb.Init.LocalTokenNumberTable;\r
+  //\r
+  // Aquire lock to prevent reentrance from TPL_CALLBACK level\r
+  //\r
+  EfiAcquireLock (&mPcdDatabaseLock);\r
 \r
   //\r
   // EBC compiler is very choosy. It may report warning about comparison\r
   // between UINTN and 0 . So we add 1 in each size of the \r
   // comparison.\r
   //\r
-  if ((TokenNumber + 1 < PEI_NEX_TOKEN_NUMBER + 1) ||\r
-      (TokenNumber + 1 >= PEI_LOCAL_TOKEN_NUMBER + 1 || TokenNumber + 1 < (PEI_LOCAL_TOKEN_NUMBER + DXE_NEX_TOKEN_NUMBER + 1))) {\r
-    InvokeCallbackOnSet (0, NULL, TokenNumber + 1, Data, *Size);\r
-  }\r
+  IsPeiDb = (BOOLEAN) ((TokenNumber + 1 < PEI_LOCAL_TOKEN_NUMBER + 1) ? TRUE : FALSE);\r
+\r
+  LocalTokenNumberTable  = IsPeiDb ? mPcdDatabase->PeiDb.Init.LocalTokenNumberTable : \r
+                                     mPcdDatabase->DxeDb.Init.LocalTokenNumberTable;\r
 \r
   TokenNumber = IsPeiDb ? TokenNumber\r
                         : TokenNumber - PEI_LOCAL_TOKEN_NUMBER;\r