public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: Star Zeng <star.zeng@intel.com>
To: edk2-devel@lists.01.org
Cc: Star Zeng <star.zeng@intel.com>, Liming Gao <liming.gao@intel.com>
Subject: [PATCH 2/2] MdeModulePkg PeiCore: Install SEC HOB data
Date: Wed,  2 Aug 2017 18:37:09 +0800	[thread overview]
Message-ID: <1501670229-52272-3-git-send-email-star.zeng@intel.com> (raw)
In-Reply-To: <1501670229-52272-1-git-send-email-star.zeng@intel.com>

If the EFI_SEC_HOB_DATA_PPI is in the list of PPIs passed to the PEI
entry point, the PEI Foundation will call the GetHobs() member
function and install all HOBs returned into the HOB list. It does
this after installing all PPIs passed from SEC into the PPI database
and before dispatching any PEIMs.

Cc: Liming Gao <liming.gao@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Star Zeng <star.zeng@intel.com>
---
 MdeModulePkg/Core/Pei/Hob/Hob.c   | 74 ++++++++++++++++++++++++++++++++++++++-
 MdeModulePkg/Core/Pei/PeiMain.h   | 17 +++++++++
 MdeModulePkg/Core/Pei/PeiMain.inf |  3 +-
 MdeModulePkg/Core/Pei/Ppi/Ppi.c   | 19 +++++++++-
 4 files changed, 110 insertions(+), 3 deletions(-)

diff --git a/MdeModulePkg/Core/Pei/Hob/Hob.c b/MdeModulePkg/Core/Pei/Hob/Hob.c
index e0ee8e7f1062..bb9f3f744e96 100644
--- a/MdeModulePkg/Core/Pei/Hob/Hob.c
+++ b/MdeModulePkg/Core/Pei/Hob/Hob.c
@@ -1,7 +1,7 @@
 /** @file
   This module provide Hand-Off Block manupulation.
   
-Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>
 This program and the accompanying materials                          
 are licensed and made available under the terms and conditions of the BSD License         
 which accompanies this distribution.  The full text of the license may be found at        
@@ -125,6 +125,78 @@ PeiCreateHob (
 }
 
 /**
+  Install SEC HOB data to the HOB List.
+
+  @param PeiServices    An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.
+  @param SecHobList     Pointer to SEC HOB List.
+
+  @return EFI_SUCCESS           Success to install SEC HOB data.
+  @retval EFI_OUT_OF_RESOURCES  If there is no more memory to grow the Hoblist.
+
+**/
+EFI_STATUS
+PeiInstallSecHobData (
+  IN CONST EFI_PEI_SERVICES     **PeiServices,
+  IN EFI_HOB_GENERIC_HEADER     *SecHobList
+  )
+{
+  EFI_STATUS                    Status;
+  EFI_HOB_HANDOFF_INFO_TABLE    *HandOffHob;
+  EFI_PEI_HOB_POINTERS          HobStart;
+  EFI_PEI_HOB_POINTERS          Hob;
+  UINTN                         SecHobListLength;
+  EFI_PHYSICAL_ADDRESS          FreeMemory;
+  EFI_HOB_GENERIC_HEADER        *HobEnd;
+
+  HandOffHob = NULL;
+  Status = PeiGetHobList (PeiServices, (VOID **) &HandOffHob);
+  if (EFI_ERROR(Status)) {
+    return Status;
+  }
+  ASSERT (HandOffHob != NULL);
+
+  HobStart.Raw = (UINT8 *) SecHobList;
+  //
+  // The HobList must not contain a EFI_HOB_HANDOFF_INFO_TABLE HOB (PHIT) HOB.
+  //
+  ASSERT (HobStart.Header->HobType != EFI_HOB_TYPE_HANDOFF);
+  //
+  // Calculate the SEC HOB List length,
+  // not including the terminated HOB(EFI_HOB_TYPE_END_OF_HOB_LIST).
+  //
+  for (Hob.Raw = HobStart.Raw; !END_OF_HOB_LIST (Hob); Hob.Raw = GET_NEXT_HOB (Hob));
+  SecHobListLength = (UINTN) Hob.Raw - (UINTN) HobStart.Raw;
+  //
+  // The length must be 8-bytes aligned.
+  //
+  ASSERT ((SecHobListLength & 0x7) == 0);
+
+  FreeMemory = HandOffHob->EfiFreeMemoryTop -
+               HandOffHob->EfiFreeMemoryBottom;
+
+  if (FreeMemory < SecHobListLength) {
+    DEBUG ((DEBUG_ERROR, "PeiInstallSecHobData fail: SecHobListLength - 0x%08x\n", SecHobListLength));
+    DEBUG ((DEBUG_ERROR, "  FreeMemoryTop    - 0x%08x\n", (UINTN)HandOffHob->EfiFreeMemoryTop));
+    DEBUG ((DEBUG_ERROR, "  FreeMemoryBottom - 0x%08x\n", (UINTN)HandOffHob->EfiFreeMemoryBottom));
+    return EFI_OUT_OF_RESOURCES;
+  }
+
+  Hob.Raw = (UINT8 *) (UINTN) HandOffHob->EfiEndOfHobList;
+  CopyMem (Hob.Raw, HobStart.Raw, SecHobListLength);
+
+  HobEnd = (EFI_HOB_GENERIC_HEADER *) ((UINTN) Hob.Raw + SecHobListLength);
+  HandOffHob->EfiEndOfHobList = (EFI_PHYSICAL_ADDRESS) (UINTN) HobEnd;
+
+  HobEnd->HobType   = EFI_HOB_TYPE_END_OF_HOB_LIST;
+  HobEnd->HobLength = (UINT16) sizeof (EFI_HOB_GENERIC_HEADER);
+  HobEnd->Reserved  = 0;
+  HobEnd++;
+  HandOffHob->EfiFreeMemoryBottom = (EFI_PHYSICAL_ADDRESS) (UINTN) HobEnd;
+
+  return EFI_SUCCESS;
+}
+
+/**
 
   Builds a Handoff Information Table HOB
 
diff --git a/MdeModulePkg/Core/Pei/PeiMain.h b/MdeModulePkg/Core/Pei/PeiMain.h
index e95b1c3d8cd7..277f54a0c6ad 100644
--- a/MdeModulePkg/Core/Pei/PeiMain.h
+++ b/MdeModulePkg/Core/Pei/PeiMain.h
@@ -30,6 +30,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include <Ppi/Security2.h>
 #include <Ppi/TemporaryRamSupport.h>
 #include <Ppi/TemporaryRamDone.h>
+#include <Ppi/SecHobData.h>
 #include <Library/DebugLib.h>
 #include <Library/PeiCoreEntryPoint.h>
 #include <Library/BaseLib.h>
@@ -721,6 +722,22 @@ PeiCoreBuildHobHandoffInfoTable (
   IN UINT64                MemoryLength
   );
 
+/**
+  Install SEC HOB data to the HOB List.
+
+  @param PeiServices    An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.
+  @param SecHobList     Pointer to SEC HOB List.
+
+  @return EFI_SUCCESS           Success to install SEC HOB data.
+  @retval EFI_OUT_OF_RESOURCES  If there is no more memory to grow the Hoblist.
+
+**/
+EFI_STATUS
+PeiInstallSecHobData (
+  IN CONST EFI_PEI_SERVICES     **PeiServices,
+  IN EFI_HOB_GENERIC_HEADER     *SecHobList
+  );
+
 
 //
 // FFS Fw Volume support functions
diff --git a/MdeModulePkg/Core/Pei/PeiMain.inf b/MdeModulePkg/Core/Pei/PeiMain.inf
index 39a464f32633..21ce2be7784d 100644
--- a/MdeModulePkg/Core/Pei/PeiMain.inf
+++ b/MdeModulePkg/Core/Pei/PeiMain.inf
@@ -6,7 +6,7 @@
 # 2) Dispatch PEIM from discovered FV.
 # 3) Handoff control to DxeIpl to load DXE core and enter DXE phase.
 #
-# Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>
+# Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>
 #
 #  This program and the accompanying materials
 #  are licensed and made available under the terms and conditions of the BSD License
@@ -101,6 +101,7 @@ [Ppis]
   gEfiTemporaryRamSupportPpiGuid                ## SOMETIMES_CONSUMES
   gEfiTemporaryRamDonePpiGuid                   ## SOMETIMES_CONSUMES
   gEfiPeiReset2PpiGuid                          ## SOMETIMES_CONSUMES
+  gEfiSecHobDataPpiGuid                         ## SOMETIMES_CONSUMES
 
 [Pcd]  
   gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreMaxFvSupported                   ## CONSUMES
diff --git a/MdeModulePkg/Core/Pei/Ppi/Ppi.c b/MdeModulePkg/Core/Pei/Ppi/Ppi.c
index b2ab3fbd2086..36b8c235b235 100644
--- a/MdeModulePkg/Core/Pei/Ppi/Ppi.c
+++ b/MdeModulePkg/Core/Pei/Ppi/Ppi.c
@@ -726,7 +726,9 @@ ProcessPpiListFromSec (
   IN CONST EFI_PEI_PPI_DESCRIPTOR   *PpiList
   )
 {
-  EFI_STATUS    Status;
+  EFI_STATUS                Status;
+  EFI_SEC_HOB_DATA_PPI      *SecHobDataPpi;
+  EFI_HOB_GENERIC_HEADER    *SecHobList;
 
   for (;;) {
     if ((PpiList->Flags & EFI_PEI_PPI_DESCRIPTOR_NOTIFY_TYPES) != 0) {
@@ -752,5 +754,20 @@ ProcessPpiListFromSec (
 
     PpiList++;
   }
+
+  //
+  // If the EFI_SEC_HOB_DATA_PPI is in the list of PPIs passed to the PEI entry point,
+  // the PEI Foundation will call the GetHobs() member function and install all HOBs
+  // returned into the HOB list. It does this after installing all PPIs passed from SEC
+  // into the PPI database and before dispatching any PEIMs.
+  //
+  Status = PeiLocatePpi (PeiServices, &gEfiSecHobDataPpiGuid, 0, NULL, (VOID **) &SecHobDataPpi);
+  if (!EFI_ERROR (Status)) {
+    Status = SecHobDataPpi->GetHobs (SecHobDataPpi, &SecHobList);
+    if (!EFI_ERROR (Status)) {
+      Status = PeiInstallSecHobData (PeiServices, SecHobList);
+      ASSERT_EFI_ERROR (Status);
+    }
+  }
 }
 
-- 
2.7.0.windows.1



      parent reply	other threads:[~2017-08-02 10:35 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-08-02 10:37 [PATCH 0/2] Add SecHobData PPI support Star Zeng
2017-08-02 10:37 ` [PATCH 1/2] MdePkg: Add definition for SecHobData PPI Star Zeng
2017-08-03 15:17   ` Gao, Liming
2017-08-02 10:37 ` Star Zeng [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1501670229-52272-3-git-send-email-star.zeng@intel.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox