]> git.proxmox.com Git - mirror_edk2.git/commitdiff
When status code handler unregister itself, status code dispatch in status code route...
authorli-elvin <li-elvin@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 1 Aug 2011 07:39:02 +0000 (07:39 +0000)
committerli-elvin <li-elvin@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 1 Aug 2011 07:39:02 +0000 (07:39 +0000)
Signed-off-by: li-elvin
Reviewed-by: lgao4
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12068 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Universal/ReportStatusCodeRouter/Pei/ReportStatusCodeRouterPei.c
MdeModulePkg/Universal/ReportStatusCodeRouter/RuntimeDxe/ReportStatusCodeRouterRuntimeDxe.c
MdeModulePkg/Universal/ReportStatusCodeRouter/Smm/ReportStatusCodeRouterSmm.c

index eb65916e8da384df0b39f123e4a342f1afe797c0..e3ae334836fa4cafad6537a5895c71c1ff92224f 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Report Status Code Router PEIM which produces Report Stataus Code Handler PPI and Status Code PPI.\r
 \r
 /** @file\r
   Report Status Code Router PEIM which produces Report Stataus Code Handler PPI and Status Code PPI.\r
 \r
-  Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>\r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
   which accompanies this distribution.  The full text of the license may be found at\r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
   which accompanies this distribution.  The full text of the license may be found at\r
@@ -95,19 +95,26 @@ Register (
   EFI_PEI_RSC_HANDLER_CALLBACK  *CallbackEntry;\r
   UINTN                         *NumberOfEntries;\r
   UINTN                         Index;\r
   EFI_PEI_RSC_HANDLER_CALLBACK  *CallbackEntry;\r
   UINTN                         *NumberOfEntries;\r
   UINTN                         Index;\r
+  UINTN                         FreeEntryIndex;\r
   UINTN                         *FreePacket;\r
 \r
   if (Callback == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
   UINTN                         *FreePacket;\r
 \r
   if (Callback == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  Hob.Raw  = GetFirstGuidHob (&gStatusCodeCallbackGuid);\r
-  FreePacket = NULL;\r
+  Hob.Raw        = GetFirstGuidHob (&gStatusCodeCallbackGuid);\r
+  FreePacket     = NULL;\r
+  FreeEntryIndex = 0;\r
   while (Hob.Raw != NULL) {\r
     NumberOfEntries = GET_GUID_HOB_DATA (Hob);\r
     CallbackEntry   = (EFI_PEI_RSC_HANDLER_CALLBACK *) (NumberOfEntries + 1);\r
   while (Hob.Raw != NULL) {\r
     NumberOfEntries = GET_GUID_HOB_DATA (Hob);\r
     CallbackEntry   = (EFI_PEI_RSC_HANDLER_CALLBACK *) (NumberOfEntries + 1);\r
-    if (*NumberOfEntries < 64) {\r
+    if (FreePacket == NULL && *NumberOfEntries < 64) {\r
+      //\r
+      // If current total number of handlers does not exceed 64, put new handler\r
+      // at the last of packet\r
+      //\r
       FreePacket = NumberOfEntries;\r
       FreePacket = NumberOfEntries;\r
+      FreeEntryIndex = *NumberOfEntries;\r
     }\r
     for (Index = 0; Index < *NumberOfEntries; Index++) {\r
       if (CallbackEntry[Index] == Callback) {\r
     }\r
     for (Index = 0; Index < *NumberOfEntries; Index++) {\r
       if (CallbackEntry[Index] == Callback) {\r
@@ -116,6 +123,14 @@ Register (
         //\r
         return EFI_ALREADY_STARTED;\r
       }\r
         //\r
         return EFI_ALREADY_STARTED;\r
       }\r
+      if (FreePacket == NULL && CallbackEntry[Index] == NULL) {\r
+        //\r
+        // If the total number of handlers in current packet is max value 64,\r
+        // search an entry with NULL pointer and fill new handler into this entry.\r
+        //  \r
+        FreePacket = NumberOfEntries;\r
+        FreeEntryIndex = Index;\r
+      }\r
     }\r
     Hob.Raw = GET_NEXT_HOB (Hob);\r
     Hob.Raw = GetNextGuidHob (&gStatusCodeCallbackGuid, Hob.Raw);\r
     }\r
     Hob.Raw = GET_NEXT_HOB (Hob);\r
     Hob.Raw = GetNextGuidHob (&gStatusCodeCallbackGuid, Hob.Raw);\r
@@ -126,8 +141,15 @@ Register (
   }\r
 \r
   CallbackEntry = (EFI_PEI_RSC_HANDLER_CALLBACK *) (FreePacket + 1);\r
   }\r
 \r
   CallbackEntry = (EFI_PEI_RSC_HANDLER_CALLBACK *) (FreePacket + 1);\r
-  CallbackEntry[*FreePacket] = Callback;\r
-  *FreePacket += 1;\r
+  CallbackEntry[FreeEntryIndex] = Callback;\r
+  \r
+  if (*FreePacket == FreeEntryIndex) {\r
+    //\r
+    // If new registered callback is added as a new entry in the packet,\r
+    // increase the total number of handlers in the packet.\r
+    //\r
+    *FreePacket += 1;\r
+  }\r
 \r
   return EFI_SUCCESS;\r
 }\r
 \r
   return EFI_SUCCESS;\r
 }\r
@@ -166,8 +188,10 @@ Unregister (
     CallbackEntry   = (EFI_PEI_RSC_HANDLER_CALLBACK *) (NumberOfEntries + 1);\r
     for (Index = 0; Index < *NumberOfEntries; Index++) {\r
       if (CallbackEntry[Index] == Callback) {\r
     CallbackEntry   = (EFI_PEI_RSC_HANDLER_CALLBACK *) (NumberOfEntries + 1);\r
     for (Index = 0; Index < *NumberOfEntries; Index++) {\r
       if (CallbackEntry[Index] == Callback) {\r
-        CallbackEntry[Index] = CallbackEntry[*NumberOfEntries - 1];\r
-        *NumberOfEntries -= 1;\r
+        //\r
+        // Set removed entry as NULL.\r
+        //\r
+        CallbackEntry[Index] = NULL;\r
         return EFI_SUCCESS;\r
       }\r
     }\r
         return EFI_SUCCESS;\r
       }\r
     }\r
index 86809307238e8a15db3d056fd08354b80d056308..f859075da658b49fefa6dc73b623e62ff519e6d9 100644 (file)
@@ -252,9 +252,12 @@ ReportDispatcher (
     return EFI_DEVICE_ERROR;\r
   }\r
 \r
     return EFI_DEVICE_ERROR;\r
   }\r
 \r
-  for (Link = GetFirstNode (&mCallbackListHead); !IsNull (&mCallbackListHead, Link); Link = GetNextNode (&mCallbackListHead, Link)) {\r
+  for (Link = GetFirstNode (&mCallbackListHead); !IsNull (&mCallbackListHead, Link);) {\r
     CallbackEntry = CR (Link, RSC_HANDLER_CALLBACK_ENTRY, Node, RSC_HANDLER_CALLBACK_ENTRY_SIGNATURE);\r
     CallbackEntry = CR (Link, RSC_HANDLER_CALLBACK_ENTRY, Node, RSC_HANDLER_CALLBACK_ENTRY_SIGNATURE);\r
-\r
+    //\r
+    // The handler may remove itself, so get the next handler in advance.\r
+    //\r
+    Link = GetNextNode (&mCallbackListHead, Link);\r
     if ((CallbackEntry->Tpl == TPL_HIGH_LEVEL) || EfiAtRuntime ()) {\r
       CallbackEntry->RscHandlerCallback (\r
                        Type,\r
     if ((CallbackEntry->Tpl == TPL_HIGH_LEVEL) || EfiAtRuntime ()) {\r
       CallbackEntry->RscHandlerCallback (\r
                        Type,\r
index ef1bd4d2e8c85f8cf01c1e0c7c187313c849755f..79c8d1e36f95ae27538d5b23dfee02d48b43fc96 100644 (file)
@@ -2,7 +2,7 @@
   Report Status Code Router Driver which produces SMM Report Stataus Code Handler Protocol\r
   and SMM Status Code Protocol.\r
 \r
   Report Status Code Router Driver which produces SMM Report Stataus Code Handler Protocol\r
   and SMM Status Code Protocol.\r
 \r
-  Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>\r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
   which accompanies this distribution.  The full text of the license may be found at\r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
   which accompanies this distribution.  The full text of the license may be found at\r
@@ -165,9 +165,12 @@ ReportDispatcher (
     return EFI_DEVICE_ERROR;\r
   }\r
 \r
     return EFI_DEVICE_ERROR;\r
   }\r
 \r
-  for (Link = GetFirstNode (&mCallbackListHead); !IsNull (&mCallbackListHead, Link); Link = GetNextNode (&mCallbackListHead, Link)) {\r
+  for (Link = GetFirstNode (&mCallbackListHead); !IsNull (&mCallbackListHead, Link);) {\r
     CallbackEntry = CR (Link, SMM_RSC_HANDLER_CALLBACK_ENTRY, Node, SMM_RSC_HANDLER_CALLBACK_ENTRY_SIGNATURE);\r
     CallbackEntry = CR (Link, SMM_RSC_HANDLER_CALLBACK_ENTRY, Node, SMM_RSC_HANDLER_CALLBACK_ENTRY_SIGNATURE);\r
-\r
+    //\r
+    // The handler may remove itself, so get the next handler in advance.\r
+    //\r
+    Link = GetNextNode (&mCallbackListHead, Link);\r
     CallbackEntry->RscHandlerCallback (\r
                      Type,\r
                      Value,\r
     CallbackEntry->RscHandlerCallback (\r
                      Type,\r
                      Value,\r