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