]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Ensure there is only one instance of Status Code PPI in system.
authorxli24 <xli24@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 14 Jan 2010 07:23:10 +0000 (07:23 +0000)
committerxli24 <xli24@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 14 Jan 2010 07:23:10 +0000 (07:23 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9747 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Universal/ReportStatusCodeRouter/Pei/ReportStatusCodeRouterPei.c

index eb5b490d1b2a08947dd858c20fb96a2b398bd646..8f5a3a0ceb722f415c90b68c326e49d83fc862a3 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
-  Copyright (c) 2009, Intel Corporation\r
+  Copyright (c) 2009 - 2010, Intel Corporation\r
   All rights reserved. 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
@@ -23,12 +23,15 @@ EFI_PEI_PROGRESS_CODE_PPI     mStatusCodePpi = {
   ReportDispatcher\r
   };\r
 \r
-EFI_PEI_PPI_DESCRIPTOR   mStatusCodePpiList[] = {\r
+EFI_PEI_PPI_DESCRIPTOR   mRscHandlerPpiList[] = {\r
   {\r
-    EFI_PEI_PPI_DESCRIPTOR_PPI,\r
+    EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,\r
     &gEfiPeiRscHandlerPpiGuid,\r
     &mRscHandlerPpi\r
-  },\r
+  }\r
+};\r
+\r
+EFI_PEI_PPI_DESCRIPTOR   mStatusCodePpiList[] = {\r
   {\r
     EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,\r
     &gEfiPeiStatusCodePpiGuid,\r
@@ -257,11 +260,35 @@ GenericStatusCodePeiEntry (
   IN CONST EFI_PEI_SERVICES     **PeiServices\r
   )\r
 {\r
-  EFI_STATUS     Status;\r
+  EFI_STATUS                 Status;\r
+  EFI_PEI_PPI_DESCRIPTOR     *OldDescriptor;\r
+  EFI_PEI_PROGRESS_CODE_PPI  *OldStatusCodePpi;\r
 \r
   CreateRscHandlerCallbackPacket ();\r
 \r
-  Status = PeiServicesInstallPpi (mStatusCodePpiList);\r
+  //\r
+  // Install Report Status Code Handler PPI\r
+  //\r
+  Status = PeiServicesInstallPpi (mRscHandlerPpiList);\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  //\r
+  // Install Status Code PPI. PI spec specifies that there can be only one instance\r
+  // of this PPI in system. So first check if other instance already exists.\r
+  // If no other instance exists, then just install the PPI.\r
+  // If other instance already exists, then reinstall it.\r
+  //\r
+  Status = PeiServicesLocatePpi (\r
+             &gEfiPeiStatusCodePpiGuid,\r
+             0,\r
+             &OldDescriptor,\r
+             (VOID **) &OldStatusCodePpi\r
+             );\r
+  if (!EFI_ERROR (Status)) {\r
+    Status = PeiServicesReInstallPpi (OldDescriptor, mStatusCodePpiList);\r
+  } else {\r
+    Status = PeiServicesInstallPpi (mStatusCodePpiList);\r
+  }\r
   ASSERT_EFI_ERROR (Status);\r
 \r
   return EFI_SUCCESS;\r