1 /** @file
2   This PEIM will parse the hoblist from fsp and report them into pei core.
3   This file contains the main entrypoint of the PEIM.
4 
5   Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
6   This program and the accompanying materials
7   are licensed and made available under the terms and conditions of the BSD License
8   which accompanies this distribution.  The full text of the license may be found at
9   http://opensource.org/licenses/bsd-license.php.
10 
11   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13 
14 **/
15 
16 
17 #include <PiPei.h>
18 #include <Library/DebugLib.h>
19 
20 #include <Ppi/TopOfTemporaryRam.h>
21 #include <Ppi/SecPlatformInformation.h>
22 
23 /**
24   Save BIST value before call FspInit.
25 
26   @param Bist   BIST value.
27 **/
28 VOID
29 AsmSaveBistValue (
30   IN UINT32  Bist
31   );
32 
33 /**
34   Save Ticker value before call FspInit.
35 
36   @param Ticker   Ticker value.
37 **/
38 VOID
39 AsmSaveTickerValue (
40   IN UINT64  Ticker
41   );
42 
43 /**
44   Save SEC context before call FspInit.
45 
46   @param PeiServices  Pointer to PEI Services Table.
47 **/
48 VOID
49 EFIAPI
SaveSecContext(IN CONST EFI_PEI_SERVICES ** PeiServices)50 SaveSecContext (
51   IN CONST EFI_PEI_SERVICES                     **PeiServices
52   )
53 {
54   UINT32      *Bist;
55   UINT64      *Ticker;
56   UINT32      Size;
57   UINT32      Count;
58   UINT32      TopOfTemporaryRam;
59   VOID        *TopOfTemporaryRamPpi;
60   EFI_STATUS  Status;
61 
62   DEBUG ((DEBUG_INFO, "SaveSecContext - 0x%x\n", PeiServices));
63 
64   Status = (*PeiServices)->LocatePpi (
65                              PeiServices,
66                              &gTopOfTemporaryRamPpiGuid,
67                              0,
68                              NULL,
69                              (VOID **) &TopOfTemporaryRamPpi
70                              );
71   if (EFI_ERROR (Status)) {
72     return ;
73   }
74 
75   DEBUG ((DEBUG_INFO, "TopOfTemporaryRamPpi - 0x%x\n", TopOfTemporaryRamPpi));
76 
77   //
78   // The entries of BIST information, together with the number of them,
79   // reside in the bottom of stack, left untouched by normal stack operation.
80   // This routine copies the BIST information to the buffer pointed by
81   // PlatformInformationRecord for output.
82   //
83   // |--------------| <- TopOfTemporaryRam
84   // |Number of BSPs|
85   // |--------------|
86   // |     BIST     |
87   // |--------------|
88   // |     ....     |
89   // |--------------|
90   // |  TSC[63:32]  |
91   // |--------------|
92   // |  TSC[31:00]  |
93   // |--------------|
94   //
95 
96   TopOfTemporaryRam = (UINT32)(UINTN)TopOfTemporaryRamPpi - sizeof(UINT32);
97   TopOfTemporaryRam -= sizeof(UINT32) * 2;
98   DEBUG ((DEBUG_INFO, "TopOfTemporaryRam - 0x%x\n", TopOfTemporaryRam));
99   Count             = *(UINT32 *)(UINTN)(TopOfTemporaryRam - sizeof(UINT32));
100   DEBUG ((DEBUG_INFO, "Count - 0x%x\n", Count));
101   Size              = Count * sizeof (IA32_HANDOFF_STATUS);
102   DEBUG ((DEBUG_INFO, "Size - 0x%x\n", Size));
103 
104   Bist   = (UINT32 *)(UINTN)(TopOfTemporaryRam - sizeof(UINT32) - Size);
105   DEBUG ((DEBUG_INFO, "Bist - 0x%x\n", *Bist));
106   Ticker = (UINT64 *)(UINTN)(TopOfTemporaryRam - sizeof(UINT32) - Size - sizeof(UINT64));
107   DEBUG ((DEBUG_INFO, "Ticker - 0x%lx\n", *Ticker));
108 
109   //
110   // Just need record BSP
111   //
112   AsmSaveBistValue (*Bist);
113   AsmSaveTickerValue (*Ticker);
114 }
115