1c8ec22a266cdd134ac99c3021003710130613a40jyao/** @file 2c8ec22a266cdd134ac99c3021003710130613a40jyao 3d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.<BR> 4c8ec22a266cdd134ac99c3021003710130613a40jyao This program and the accompanying materials 5c8ec22a266cdd134ac99c3021003710130613a40jyao are licensed and made available under the terms and conditions of the BSD License 6c8ec22a266cdd134ac99c3021003710130613a40jyao which accompanies this distribution. The full text of the license may be found at 7c8ec22a266cdd134ac99c3021003710130613a40jyao http://opensource.org/licenses/bsd-license.php. 8c8ec22a266cdd134ac99c3021003710130613a40jyao 9c8ec22a266cdd134ac99c3021003710130613a40jyao THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 10c8ec22a266cdd134ac99c3021003710130613a40jyao WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 11c8ec22a266cdd134ac99c3021003710130613a40jyao 12c8ec22a266cdd134ac99c3021003710130613a40jyao**/ 13c8ec22a266cdd134ac99c3021003710130613a40jyao 14c8ec22a266cdd134ac99c3021003710130613a40jyao#include <PiPei.h> 15c8ec22a266cdd134ac99c3021003710130613a40jyao#include <Library/BaseLib.h> 16c8ec22a266cdd134ac99c3021003710130613a40jyao#include <Library/DebugLib.h> 17c8ec22a266cdd134ac99c3021003710130613a40jyao#include <Library/PcdLib.h> 18c8ec22a266cdd134ac99c3021003710130613a40jyao#include <FspGlobalData.h> 19c8ec22a266cdd134ac99c3021003710130613a40jyao#include <FspApi.h> 20c8ec22a266cdd134ac99c3021003710130613a40jyao 21c8ec22a266cdd134ac99c3021003710130613a40jyao#pragma pack(1) 22c8ec22a266cdd134ac99c3021003710130613a40jyao 23c8ec22a266cdd134ac99c3021003710130613a40jyao// 24c8ec22a266cdd134ac99c3021003710130613a40jyao// Cont Func Parameter 2 +0x3C 25c8ec22a266cdd134ac99c3021003710130613a40jyao// Cont Func Parameter 1 +0x38 26c8ec22a266cdd134ac99c3021003710130613a40jyao// 27c8ec22a266cdd134ac99c3021003710130613a40jyao// API Parameter +0x34 28c8ec22a266cdd134ac99c3021003710130613a40jyao// API return address +0x30 29c8ec22a266cdd134ac99c3021003710130613a40jyao// 303b17b2458726bf7e2cf640d29ebe14f8af587905Ma, Maurice// push FspInfoHeader +0x2C 31c8ec22a266cdd134ac99c3021003710130613a40jyao// pushfd +0x28 32c8ec22a266cdd134ac99c3021003710130613a40jyao// cli 33c8ec22a266cdd134ac99c3021003710130613a40jyao// pushad +0x24 34c8ec22a266cdd134ac99c3021003710130613a40jyao// sub esp, 8 +0x00 35c8ec22a266cdd134ac99c3021003710130613a40jyao// sidt fword ptr [esp] 36c8ec22a266cdd134ac99c3021003710130613a40jyao// 37c8ec22a266cdd134ac99c3021003710130613a40jyaotypedef struct { 38c8ec22a266cdd134ac99c3021003710130613a40jyao UINT16 IdtrLimit; 39c8ec22a266cdd134ac99c3021003710130613a40jyao UINT32 IdtrBase; 40c8ec22a266cdd134ac99c3021003710130613a40jyao UINT16 Reserved; 41c8ec22a266cdd134ac99c3021003710130613a40jyao UINT32 Edi; 42c8ec22a266cdd134ac99c3021003710130613a40jyao UINT32 Esi; 43c8ec22a266cdd134ac99c3021003710130613a40jyao UINT32 Ebp; 44c8ec22a266cdd134ac99c3021003710130613a40jyao UINT32 Esp; 45c8ec22a266cdd134ac99c3021003710130613a40jyao UINT32 Ebx; 46c8ec22a266cdd134ac99c3021003710130613a40jyao UINT32 Edx; 47c8ec22a266cdd134ac99c3021003710130613a40jyao UINT32 Ecx; 48c8ec22a266cdd134ac99c3021003710130613a40jyao UINT32 Eax; 49c8ec22a266cdd134ac99c3021003710130613a40jyao UINT16 Flags[2]; 503b17b2458726bf7e2cf640d29ebe14f8af587905Ma, Maurice UINT32 FspInfoHeader; 51c8ec22a266cdd134ac99c3021003710130613a40jyao UINT32 ApiRet; 52c8ec22a266cdd134ac99c3021003710130613a40jyao UINT32 ApiParam; 53c8ec22a266cdd134ac99c3021003710130613a40jyao} CONTEXT_STACK; 54c8ec22a266cdd134ac99c3021003710130613a40jyao 55c8ec22a266cdd134ac99c3021003710130613a40jyao#define CONTEXT_STACK_OFFSET(x) (UINT32)&((CONTEXT_STACK *)(UINTN)0)->x 56c8ec22a266cdd134ac99c3021003710130613a40jyao 57c8ec22a266cdd134ac99c3021003710130613a40jyao#pragma pack() 58c8ec22a266cdd134ac99c3021003710130613a40jyao 59c8ec22a266cdd134ac99c3021003710130613a40jyao/** 60c8ec22a266cdd134ac99c3021003710130613a40jyao This function sets the FSP global data pointer. 61c8ec22a266cdd134ac99c3021003710130613a40jyao 62c8ec22a266cdd134ac99c3021003710130613a40jyao @param[in] FspData Fsp global data pointer. 63c8ec22a266cdd134ac99c3021003710130613a40jyao 64c8ec22a266cdd134ac99c3021003710130613a40jyao**/ 65c8ec22a266cdd134ac99c3021003710130613a40jyaoVOID 66c8ec22a266cdd134ac99c3021003710130613a40jyaoEFIAPI 67c8ec22a266cdd134ac99c3021003710130613a40jyaoSetFspGlobalDataPointer ( 68c8ec22a266cdd134ac99c3021003710130613a40jyao IN FSP_GLOBAL_DATA *FspData 69c8ec22a266cdd134ac99c3021003710130613a40jyao ) 70c8ec22a266cdd134ac99c3021003710130613a40jyao{ 71c8ec22a266cdd134ac99c3021003710130613a40jyao ASSERT (FspData != NULL); 72c8ec22a266cdd134ac99c3021003710130613a40jyao *((volatile UINT32 *)(UINTN)PcdGet32(PcdGlobalDataPointerAddress)) = (UINT32)(UINTN)FspData; 73c8ec22a266cdd134ac99c3021003710130613a40jyao} 74c8ec22a266cdd134ac99c3021003710130613a40jyao 75c8ec22a266cdd134ac99c3021003710130613a40jyao/** 76c8ec22a266cdd134ac99c3021003710130613a40jyao This function gets the FSP global data pointer. 77c8ec22a266cdd134ac99c3021003710130613a40jyao 78c8ec22a266cdd134ac99c3021003710130613a40jyao**/ 79c8ec22a266cdd134ac99c3021003710130613a40jyaoFSP_GLOBAL_DATA * 80c8ec22a266cdd134ac99c3021003710130613a40jyaoEFIAPI 81c8ec22a266cdd134ac99c3021003710130613a40jyaoGetFspGlobalDataPointer ( 82c8ec22a266cdd134ac99c3021003710130613a40jyao VOID 83c8ec22a266cdd134ac99c3021003710130613a40jyao ) 84c8ec22a266cdd134ac99c3021003710130613a40jyao{ 85c8ec22a266cdd134ac99c3021003710130613a40jyao FSP_GLOBAL_DATA *FspData; 86c8ec22a266cdd134ac99c3021003710130613a40jyao 87c8ec22a266cdd134ac99c3021003710130613a40jyao FspData = *(FSP_GLOBAL_DATA **)(UINTN)PcdGet32(PcdGlobalDataPointerAddress); 88c8ec22a266cdd134ac99c3021003710130613a40jyao return FspData; 89c8ec22a266cdd134ac99c3021003710130613a40jyao} 90c8ec22a266cdd134ac99c3021003710130613a40jyao 91c8ec22a266cdd134ac99c3021003710130613a40jyao/** 9213ca714cd24830d42252fdbd012abf5a5f716246Gary Lin This function gets back the FSP API parameter passed by the bootlaoder. 93c8ec22a266cdd134ac99c3021003710130613a40jyao 9413ca714cd24830d42252fdbd012abf5a5f716246Gary Lin @retval ApiParameter FSP API parameter passed by the bootlaoder. 95c8ec22a266cdd134ac99c3021003710130613a40jyao**/ 96c8ec22a266cdd134ac99c3021003710130613a40jyaoUINT32 97c8ec22a266cdd134ac99c3021003710130613a40jyaoEFIAPI 98c8ec22a266cdd134ac99c3021003710130613a40jyaoGetFspApiParameter ( 99c8ec22a266cdd134ac99c3021003710130613a40jyao VOID 100c8ec22a266cdd134ac99c3021003710130613a40jyao ) 101c8ec22a266cdd134ac99c3021003710130613a40jyao{ 102c8ec22a266cdd134ac99c3021003710130613a40jyao FSP_GLOBAL_DATA *FspData; 103c8ec22a266cdd134ac99c3021003710130613a40jyao 104c8ec22a266cdd134ac99c3021003710130613a40jyao FspData = GetFspGlobalDataPointer (); 105c8ec22a266cdd134ac99c3021003710130613a40jyao return *(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET(ApiParam)); 106c8ec22a266cdd134ac99c3021003710130613a40jyao} 107c8ec22a266cdd134ac99c3021003710130613a40jyao 108c8ec22a266cdd134ac99c3021003710130613a40jyao/** 10913ca714cd24830d42252fdbd012abf5a5f716246Gary Lin This function sets the FSP API parameter in the stack. 110c8ec22a266cdd134ac99c3021003710130613a40jyao 111c8ec22a266cdd134ac99c3021003710130613a40jyao @param[in] Value New parameter value. 112c8ec22a266cdd134ac99c3021003710130613a40jyao 113c8ec22a266cdd134ac99c3021003710130613a40jyao**/ 114c8ec22a266cdd134ac99c3021003710130613a40jyaoVOID 115c8ec22a266cdd134ac99c3021003710130613a40jyaoEFIAPI 116c8ec22a266cdd134ac99c3021003710130613a40jyaoSetFspApiParameter ( 117c8ec22a266cdd134ac99c3021003710130613a40jyao IN UINT32 Value 118c8ec22a266cdd134ac99c3021003710130613a40jyao ) 119c8ec22a266cdd134ac99c3021003710130613a40jyao{ 120c8ec22a266cdd134ac99c3021003710130613a40jyao FSP_GLOBAL_DATA *FspData; 121c8ec22a266cdd134ac99c3021003710130613a40jyao 122c8ec22a266cdd134ac99c3021003710130613a40jyao FspData = GetFspGlobalDataPointer (); 123c8ec22a266cdd134ac99c3021003710130613a40jyao *(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET(ApiParam)) = Value; 124c8ec22a266cdd134ac99c3021003710130613a40jyao} 125c8ec22a266cdd134ac99c3021003710130613a40jyao 126c8ec22a266cdd134ac99c3021003710130613a40jyao/** 127c8ec22a266cdd134ac99c3021003710130613a40jyao This function sets the FSP continuation function parameters in the stack. 128c8ec22a266cdd134ac99c3021003710130613a40jyao 129c8ec22a266cdd134ac99c3021003710130613a40jyao @param[in] Value New parameter value to set. 130c8ec22a266cdd134ac99c3021003710130613a40jyao @param[in] Index Parameter index. 131c8ec22a266cdd134ac99c3021003710130613a40jyao**/ 132c8ec22a266cdd134ac99c3021003710130613a40jyaoVOID 133c8ec22a266cdd134ac99c3021003710130613a40jyaoEFIAPI 134c8ec22a266cdd134ac99c3021003710130613a40jyaoSetFspContinuationFuncParameter ( 135c8ec22a266cdd134ac99c3021003710130613a40jyao IN UINT32 Value, 136c8ec22a266cdd134ac99c3021003710130613a40jyao IN UINT32 Index 137c8ec22a266cdd134ac99c3021003710130613a40jyao ) 138c8ec22a266cdd134ac99c3021003710130613a40jyao{ 139c8ec22a266cdd134ac99c3021003710130613a40jyao FSP_GLOBAL_DATA *FspData; 140c8ec22a266cdd134ac99c3021003710130613a40jyao 141c8ec22a266cdd134ac99c3021003710130613a40jyao FspData = GetFspGlobalDataPointer (); 142c8ec22a266cdd134ac99c3021003710130613a40jyao *(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET(ApiParam) + (Index + 1) * sizeof(UINT32)) = Value; 143c8ec22a266cdd134ac99c3021003710130613a40jyao} 144c8ec22a266cdd134ac99c3021003710130613a40jyao 145c8ec22a266cdd134ac99c3021003710130613a40jyao 146c8ec22a266cdd134ac99c3021003710130613a40jyao/** 1479da591867c0bad1abbe17a321dc5b16d95226c6aYao, Jiewen This function changes the BootLoader return address in stack. 148c8ec22a266cdd134ac99c3021003710130613a40jyao 149c8ec22a266cdd134ac99c3021003710130613a40jyao @param[in] ReturnAddress Address to return. 150c8ec22a266cdd134ac99c3021003710130613a40jyao 151c8ec22a266cdd134ac99c3021003710130613a40jyao**/ 152c8ec22a266cdd134ac99c3021003710130613a40jyaoVOID 153c8ec22a266cdd134ac99c3021003710130613a40jyaoEFIAPI 154c8ec22a266cdd134ac99c3021003710130613a40jyaoSetFspApiReturnAddress ( 155c8ec22a266cdd134ac99c3021003710130613a40jyao IN UINT32 ReturnAddress 156c8ec22a266cdd134ac99c3021003710130613a40jyao ) 157c8ec22a266cdd134ac99c3021003710130613a40jyao{ 158c8ec22a266cdd134ac99c3021003710130613a40jyao FSP_GLOBAL_DATA *FspData; 159c8ec22a266cdd134ac99c3021003710130613a40jyao 160c8ec22a266cdd134ac99c3021003710130613a40jyao FspData = GetFspGlobalDataPointer (); 161c8ec22a266cdd134ac99c3021003710130613a40jyao *(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET(ApiRet)) = ReturnAddress; 162c8ec22a266cdd134ac99c3021003710130613a40jyao} 163c8ec22a266cdd134ac99c3021003710130613a40jyao 164c8ec22a266cdd134ac99c3021003710130613a40jyao/** 1659da591867c0bad1abbe17a321dc5b16d95226c6aYao, Jiewen This function set the API status code returned to the BootLoader. 166c8ec22a266cdd134ac99c3021003710130613a40jyao 167c8ec22a266cdd134ac99c3021003710130613a40jyao @param[in] ReturnStatus Status code to return. 168c8ec22a266cdd134ac99c3021003710130613a40jyao 169c8ec22a266cdd134ac99c3021003710130613a40jyao**/ 170c8ec22a266cdd134ac99c3021003710130613a40jyaoVOID 171c8ec22a266cdd134ac99c3021003710130613a40jyaoEFIAPI 172c8ec22a266cdd134ac99c3021003710130613a40jyaoSetFspApiReturnStatus ( 173c8ec22a266cdd134ac99c3021003710130613a40jyao IN UINT32 ReturnStatus 174c8ec22a266cdd134ac99c3021003710130613a40jyao ) 175c8ec22a266cdd134ac99c3021003710130613a40jyao{ 176c8ec22a266cdd134ac99c3021003710130613a40jyao FSP_GLOBAL_DATA *FspData; 177c8ec22a266cdd134ac99c3021003710130613a40jyao 178c8ec22a266cdd134ac99c3021003710130613a40jyao FspData = GetFspGlobalDataPointer (); 179c8ec22a266cdd134ac99c3021003710130613a40jyao *(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET(Eax)) = ReturnStatus; 180c8ec22a266cdd134ac99c3021003710130613a40jyao} 181c8ec22a266cdd134ac99c3021003710130613a40jyao 182c8ec22a266cdd134ac99c3021003710130613a40jyao/** 183c8ec22a266cdd134ac99c3021003710130613a40jyao This function sets the context switching stack to a new stack frame. 184c8ec22a266cdd134ac99c3021003710130613a40jyao 185c8ec22a266cdd134ac99c3021003710130613a40jyao @param[in] NewStackTop New core stack to be set. 186c8ec22a266cdd134ac99c3021003710130613a40jyao 187c8ec22a266cdd134ac99c3021003710130613a40jyao**/ 188c8ec22a266cdd134ac99c3021003710130613a40jyaoVOID 189c8ec22a266cdd134ac99c3021003710130613a40jyaoEFIAPI 190c8ec22a266cdd134ac99c3021003710130613a40jyaoSetFspCoreStackPointer ( 191c8ec22a266cdd134ac99c3021003710130613a40jyao IN VOID *NewStackTop 192c8ec22a266cdd134ac99c3021003710130613a40jyao ) 193c8ec22a266cdd134ac99c3021003710130613a40jyao{ 194c8ec22a266cdd134ac99c3021003710130613a40jyao FSP_GLOBAL_DATA *FspData; 195c8ec22a266cdd134ac99c3021003710130613a40jyao UINT32 *OldStack; 196c8ec22a266cdd134ac99c3021003710130613a40jyao UINT32 *NewStack; 197c8ec22a266cdd134ac99c3021003710130613a40jyao UINT32 StackContextLen; 198c8ec22a266cdd134ac99c3021003710130613a40jyao 199c8ec22a266cdd134ac99c3021003710130613a40jyao FspData = GetFspGlobalDataPointer (); 200c8ec22a266cdd134ac99c3021003710130613a40jyao StackContextLen = sizeof(CONTEXT_STACK) / sizeof(UINT32); 201c8ec22a266cdd134ac99c3021003710130613a40jyao 202c8ec22a266cdd134ac99c3021003710130613a40jyao // 203c8ec22a266cdd134ac99c3021003710130613a40jyao // Reserve space for the ContinuationFunc two parameters 204c8ec22a266cdd134ac99c3021003710130613a40jyao // 205c8ec22a266cdd134ac99c3021003710130613a40jyao OldStack = (UINT32 *)FspData->CoreStack; 206c8ec22a266cdd134ac99c3021003710130613a40jyao NewStack = (UINT32 *)NewStackTop - StackContextLen - 2; 207c8ec22a266cdd134ac99c3021003710130613a40jyao FspData->CoreStack = (UINT32)NewStack; 208c8ec22a266cdd134ac99c3021003710130613a40jyao while (StackContextLen-- != 0) { 209c8ec22a266cdd134ac99c3021003710130613a40jyao *NewStack++ = *OldStack++; 210c8ec22a266cdd134ac99c3021003710130613a40jyao } 211c8ec22a266cdd134ac99c3021003710130613a40jyao} 212c8ec22a266cdd134ac99c3021003710130613a40jyao 213c8ec22a266cdd134ac99c3021003710130613a40jyao/** 214c8ec22a266cdd134ac99c3021003710130613a40jyao This function sets the platform specific data pointer. 215c8ec22a266cdd134ac99c3021003710130613a40jyao 216c8ec22a266cdd134ac99c3021003710130613a40jyao @param[in] PlatformData Fsp platform specific data pointer. 217c8ec22a266cdd134ac99c3021003710130613a40jyao 218c8ec22a266cdd134ac99c3021003710130613a40jyao**/ 219c8ec22a266cdd134ac99c3021003710130613a40jyaoVOID 220c8ec22a266cdd134ac99c3021003710130613a40jyaoEFIAPI 221c8ec22a266cdd134ac99c3021003710130613a40jyaoSetFspPlatformDataPointer ( 222c8ec22a266cdd134ac99c3021003710130613a40jyao IN VOID *PlatformData 223c8ec22a266cdd134ac99c3021003710130613a40jyao ) 224c8ec22a266cdd134ac99c3021003710130613a40jyao{ 225c8ec22a266cdd134ac99c3021003710130613a40jyao FSP_GLOBAL_DATA *FspData; 226c8ec22a266cdd134ac99c3021003710130613a40jyao 227c8ec22a266cdd134ac99c3021003710130613a40jyao FspData = GetFspGlobalDataPointer (); 228c8ec22a266cdd134ac99c3021003710130613a40jyao FspData->PlatformData.DataPtr = PlatformData; 229c8ec22a266cdd134ac99c3021003710130613a40jyao} 230c8ec22a266cdd134ac99c3021003710130613a40jyao 231c8ec22a266cdd134ac99c3021003710130613a40jyao 232c8ec22a266cdd134ac99c3021003710130613a40jyao/** 233c8ec22a266cdd134ac99c3021003710130613a40jyao This function gets the platform specific data pointer. 234c8ec22a266cdd134ac99c3021003710130613a40jyao 235c8ec22a266cdd134ac99c3021003710130613a40jyao @param[in] PlatformData Fsp platform specific data pointer. 236c8ec22a266cdd134ac99c3021003710130613a40jyao 237c8ec22a266cdd134ac99c3021003710130613a40jyao**/ 238c8ec22a266cdd134ac99c3021003710130613a40jyaoVOID * 239c8ec22a266cdd134ac99c3021003710130613a40jyaoEFIAPI 240c8ec22a266cdd134ac99c3021003710130613a40jyaoGetFspPlatformDataPointer ( 241c8ec22a266cdd134ac99c3021003710130613a40jyao VOID 242c8ec22a266cdd134ac99c3021003710130613a40jyao ) 243c8ec22a266cdd134ac99c3021003710130613a40jyao{ 244c8ec22a266cdd134ac99c3021003710130613a40jyao FSP_GLOBAL_DATA *FspData; 245c8ec22a266cdd134ac99c3021003710130613a40jyao 246c8ec22a266cdd134ac99c3021003710130613a40jyao FspData = GetFspGlobalDataPointer (); 247c8ec22a266cdd134ac99c3021003710130613a40jyao return FspData->PlatformData.DataPtr; 248c8ec22a266cdd134ac99c3021003710130613a40jyao} 249c8ec22a266cdd134ac99c3021003710130613a40jyao 250c8ec22a266cdd134ac99c3021003710130613a40jyao 251c8ec22a266cdd134ac99c3021003710130613a40jyao/** 252c8ec22a266cdd134ac99c3021003710130613a40jyao This function sets the UPD data pointer. 253c8ec22a266cdd134ac99c3021003710130613a40jyao 254c8ec22a266cdd134ac99c3021003710130613a40jyao @param[in] UpdDataRgnPtr UPD data pointer. 255c8ec22a266cdd134ac99c3021003710130613a40jyao**/ 256c8ec22a266cdd134ac99c3021003710130613a40jyaoVOID 257c8ec22a266cdd134ac99c3021003710130613a40jyaoEFIAPI 258c8ec22a266cdd134ac99c3021003710130613a40jyaoSetFspUpdDataPointer ( 259c8ec22a266cdd134ac99c3021003710130613a40jyao IN VOID *UpdDataRgnPtr 260c8ec22a266cdd134ac99c3021003710130613a40jyao ) 261c8ec22a266cdd134ac99c3021003710130613a40jyao{ 262c8ec22a266cdd134ac99c3021003710130613a40jyao FSP_GLOBAL_DATA *FspData; 263c8ec22a266cdd134ac99c3021003710130613a40jyao 264c8ec22a266cdd134ac99c3021003710130613a40jyao // 265c8ec22a266cdd134ac99c3021003710130613a40jyao // Get the Fsp Global Data Pointer 266c8ec22a266cdd134ac99c3021003710130613a40jyao // 267c8ec22a266cdd134ac99c3021003710130613a40jyao FspData = GetFspGlobalDataPointer (); 268c8ec22a266cdd134ac99c3021003710130613a40jyao 269c8ec22a266cdd134ac99c3021003710130613a40jyao // 270c8ec22a266cdd134ac99c3021003710130613a40jyao // Set the UPD pointer. 271c8ec22a266cdd134ac99c3021003710130613a40jyao // 272c8ec22a266cdd134ac99c3021003710130613a40jyao FspData->UpdDataRgnPtr = UpdDataRgnPtr; 273c8ec22a266cdd134ac99c3021003710130613a40jyao} 274c8ec22a266cdd134ac99c3021003710130613a40jyao 275c8ec22a266cdd134ac99c3021003710130613a40jyao/** 276c8ec22a266cdd134ac99c3021003710130613a40jyao This function gets the UPD data pointer. 277c8ec22a266cdd134ac99c3021003710130613a40jyao 278c8ec22a266cdd134ac99c3021003710130613a40jyao @return UpdDataRgnPtr UPD data pointer. 279c8ec22a266cdd134ac99c3021003710130613a40jyao**/ 280c8ec22a266cdd134ac99c3021003710130613a40jyaoVOID * 281c8ec22a266cdd134ac99c3021003710130613a40jyaoEFIAPI 282c8ec22a266cdd134ac99c3021003710130613a40jyaoGetFspUpdDataPointer ( 283c8ec22a266cdd134ac99c3021003710130613a40jyao VOID 284c8ec22a266cdd134ac99c3021003710130613a40jyao ) 285c8ec22a266cdd134ac99c3021003710130613a40jyao{ 286c8ec22a266cdd134ac99c3021003710130613a40jyao FSP_GLOBAL_DATA *FspData; 287c8ec22a266cdd134ac99c3021003710130613a40jyao 288c8ec22a266cdd134ac99c3021003710130613a40jyao FspData = GetFspGlobalDataPointer (); 289c8ec22a266cdd134ac99c3021003710130613a40jyao return FspData->UpdDataRgnPtr; 290c8ec22a266cdd134ac99c3021003710130613a40jyao} 291c8ec22a266cdd134ac99c3021003710130613a40jyao 292b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen 293b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen/** 294b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen This function sets the memory init UPD data pointer. 295b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen 296b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen @param[in] MemoryInitUpdPtr memory init UPD data pointer. 297b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen**/ 298b23441875c34bd15badb76e8d0b001ebd5d7010dYao, JiewenVOID 299b23441875c34bd15badb76e8d0b001ebd5d7010dYao, JiewenEFIAPI 300b23441875c34bd15badb76e8d0b001ebd5d7010dYao, JiewenSetFspMemoryInitUpdDataPointer ( 301b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen IN VOID *MemoryInitUpdPtr 302b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen ) 303b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen{ 304b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen FSP_GLOBAL_DATA *FspData; 305b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen 306b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen // 307b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen // Get the Fsp Global Data Pointer 308b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen // 309b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen FspData = GetFspGlobalDataPointer (); 310b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen 311b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen // 312b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen // Set the memory init UPD pointer. 313b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen // 314b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen FspData->MemoryInitUpdPtr = MemoryInitUpdPtr; 315b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen} 316b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen 317b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen/** 318b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen This function gets the memory init UPD data pointer. 319b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen 320b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen @return memory init UPD data pointer. 321b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen**/ 322b23441875c34bd15badb76e8d0b001ebd5d7010dYao, JiewenVOID * 323b23441875c34bd15badb76e8d0b001ebd5d7010dYao, JiewenEFIAPI 324b23441875c34bd15badb76e8d0b001ebd5d7010dYao, JiewenGetFspMemoryInitUpdDataPointer ( 325b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen VOID 326b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen ) 327b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen{ 328b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen FSP_GLOBAL_DATA *FspData; 329b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen 330b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen FspData = GetFspGlobalDataPointer (); 331b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen return FspData->MemoryInitUpdPtr; 332b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen} 333b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen 334b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen 335b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen/** 336b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen This function sets the silicon init UPD data pointer. 337b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen 338b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen @param[in] SiliconInitUpdPtr silicon init UPD data pointer. 339b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen**/ 340b23441875c34bd15badb76e8d0b001ebd5d7010dYao, JiewenVOID 341b23441875c34bd15badb76e8d0b001ebd5d7010dYao, JiewenEFIAPI 342b23441875c34bd15badb76e8d0b001ebd5d7010dYao, JiewenSetFspSiliconInitUpdDataPointer ( 343b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen IN VOID *SiliconInitUpdPtr 344b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen ) 345b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen{ 346b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen FSP_GLOBAL_DATA *FspData; 347b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen 348b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen // 349b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen // Get the Fsp Global Data Pointer 350b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen // 351b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen FspData = GetFspGlobalDataPointer (); 352b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen 353b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen // 354b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen // Set the silicon init UPD data pointer. 355b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen // 356b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen FspData->SiliconInitUpdPtr = SiliconInitUpdPtr; 357b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen} 358b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen 359b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen/** 360b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen This function gets the silicon init UPD data pointer. 361b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen 362b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen @return silicon init UPD data pointer. 363b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen**/ 364b23441875c34bd15badb76e8d0b001ebd5d7010dYao, JiewenVOID * 365b23441875c34bd15badb76e8d0b001ebd5d7010dYao, JiewenEFIAPI 366b23441875c34bd15badb76e8d0b001ebd5d7010dYao, JiewenGetFspSiliconInitUpdDataPointer ( 367b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen VOID 368b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen ) 369b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen{ 370b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen FSP_GLOBAL_DATA *FspData; 371b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen 372b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen FspData = GetFspGlobalDataPointer (); 373b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen return FspData->SiliconInitUpdPtr; 374b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen} 375b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen 376b23441875c34bd15badb76e8d0b001ebd5d7010dYao, Jiewen 377c8ec22a266cdd134ac99c3021003710130613a40jyao/** 378c8ec22a266cdd134ac99c3021003710130613a40jyao Set FSP measurement point timestamp. 379c8ec22a266cdd134ac99c3021003710130613a40jyao 380c8ec22a266cdd134ac99c3021003710130613a40jyao @param[in] Id Measurement point ID. 381c8ec22a266cdd134ac99c3021003710130613a40jyao 382c8ec22a266cdd134ac99c3021003710130613a40jyao @return performance timestamp. 383c8ec22a266cdd134ac99c3021003710130613a40jyao**/ 384c8ec22a266cdd134ac99c3021003710130613a40jyaoUINT64 385c8ec22a266cdd134ac99c3021003710130613a40jyaoEFIAPI 386c8ec22a266cdd134ac99c3021003710130613a40jyaoSetFspMeasurePoint ( 387c8ec22a266cdd134ac99c3021003710130613a40jyao IN UINT8 Id 388c8ec22a266cdd134ac99c3021003710130613a40jyao ) 389c8ec22a266cdd134ac99c3021003710130613a40jyao{ 390c8ec22a266cdd134ac99c3021003710130613a40jyao FSP_GLOBAL_DATA *FspData; 391c8ec22a266cdd134ac99c3021003710130613a40jyao 392c8ec22a266cdd134ac99c3021003710130613a40jyao // 393c8ec22a266cdd134ac99c3021003710130613a40jyao // Bit [55: 0] will be the timestamp 394c8ec22a266cdd134ac99c3021003710130613a40jyao // Bit [63:56] will be the ID 395c8ec22a266cdd134ac99c3021003710130613a40jyao // 396c8ec22a266cdd134ac99c3021003710130613a40jyao FspData = GetFspGlobalDataPointer (); 397c8ec22a266cdd134ac99c3021003710130613a40jyao if (FspData->PerfIdx < sizeof(FspData->PerfData) / sizeof(FspData->PerfData[0])) { 398c8ec22a266cdd134ac99c3021003710130613a40jyao FspData->PerfData[FspData->PerfIdx] = AsmReadTsc (); 399c8ec22a266cdd134ac99c3021003710130613a40jyao ((UINT8 *)(&FspData->PerfData[FspData->PerfIdx]))[7] = Id; 400c8ec22a266cdd134ac99c3021003710130613a40jyao } 401c8ec22a266cdd134ac99c3021003710130613a40jyao 402c8ec22a266cdd134ac99c3021003710130613a40jyao return FspData->PerfData[(FspData->PerfIdx)++]; 403c8ec22a266cdd134ac99c3021003710130613a40jyao} 404d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen 405d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen/** 406d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen This function gets the FSP info header pointer. 407d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen 408d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen @retval FspInfoHeader FSP info header pointer 409d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen**/ 410d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, JiewenFSP_INFO_HEADER * 411d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, JiewenEFIAPI 412d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, JiewenGetFspInfoHeader ( 413d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen VOID 414d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen ) 415d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen{ 416d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen return GetFspGlobalDataPointer()->FspInfoHeader; 417d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen} 418d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen 419d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen/** 4203b17b2458726bf7e2cf640d29ebe14f8af587905Ma, Maurice This function gets the FSP info header pointer using the API stack context. 4213b17b2458726bf7e2cf640d29ebe14f8af587905Ma, Maurice 4223b17b2458726bf7e2cf640d29ebe14f8af587905Ma, Maurice @retval FspInfoHeader FSP info header pointer using the API stack context 4233b17b2458726bf7e2cf640d29ebe14f8af587905Ma, Maurice**/ 4243b17b2458726bf7e2cf640d29ebe14f8af587905Ma, MauriceFSP_INFO_HEADER * 4253b17b2458726bf7e2cf640d29ebe14f8af587905Ma, MauriceEFIAPI 4263b17b2458726bf7e2cf640d29ebe14f8af587905Ma, MauriceGetFspInfoHeaderFromApiContext ( 4273b17b2458726bf7e2cf640d29ebe14f8af587905Ma, Maurice VOID 4283b17b2458726bf7e2cf640d29ebe14f8af587905Ma, Maurice ) 4293b17b2458726bf7e2cf640d29ebe14f8af587905Ma, Maurice{ 4303b17b2458726bf7e2cf640d29ebe14f8af587905Ma, Maurice FSP_GLOBAL_DATA *FspData; 4313b17b2458726bf7e2cf640d29ebe14f8af587905Ma, Maurice 4323b17b2458726bf7e2cf640d29ebe14f8af587905Ma, Maurice FspData = GetFspGlobalDataPointer (); 4333b17b2458726bf7e2cf640d29ebe14f8af587905Ma, Maurice return (FSP_INFO_HEADER *)(*(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET(FspInfoHeader))); 4343b17b2458726bf7e2cf640d29ebe14f8af587905Ma, Maurice} 4353b17b2458726bf7e2cf640d29ebe14f8af587905Ma, Maurice 4363b17b2458726bf7e2cf640d29ebe14f8af587905Ma, Maurice/** 4379da591867c0bad1abbe17a321dc5b16d95226c6aYao, Jiewen This function gets the VPD data pointer. 4389da591867c0bad1abbe17a321dc5b16d95226c6aYao, Jiewen 4399da591867c0bad1abbe17a321dc5b16d95226c6aYao, Jiewen @return VpdDataRgnPtr VPD data pointer. 4409da591867c0bad1abbe17a321dc5b16d95226c6aYao, Jiewen**/ 4419da591867c0bad1abbe17a321dc5b16d95226c6aYao, JiewenVOID * 4429da591867c0bad1abbe17a321dc5b16d95226c6aYao, JiewenEFIAPI 4439da591867c0bad1abbe17a321dc5b16d95226c6aYao, JiewenGetFspVpdDataPointer ( 4449da591867c0bad1abbe17a321dc5b16d95226c6aYao, Jiewen VOID 4459da591867c0bad1abbe17a321dc5b16d95226c6aYao, Jiewen ) 4469da591867c0bad1abbe17a321dc5b16d95226c6aYao, Jiewen{ 4479da591867c0bad1abbe17a321dc5b16d95226c6aYao, Jiewen FSP_INFO_HEADER *FspInfoHeader; 4489da591867c0bad1abbe17a321dc5b16d95226c6aYao, Jiewen 4499da591867c0bad1abbe17a321dc5b16d95226c6aYao, Jiewen FspInfoHeader = GetFspInfoHeader (); 4509da591867c0bad1abbe17a321dc5b16d95226c6aYao, Jiewen return (VOID *)(FspInfoHeader->ImageBase + FspInfoHeader->CfgRegionOffset); 4519da591867c0bad1abbe17a321dc5b16d95226c6aYao, Jiewen} 4529da591867c0bad1abbe17a321dc5b16d95226c6aYao, Jiewen 4539da591867c0bad1abbe17a321dc5b16d95226c6aYao, Jiewen/** 4546ca9135a654a658c9fbaa698cfa69a76c7719be1Yao, Jiewen This function gets FSP API calling mode. 455d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen 456d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen @retval API calling mode 457d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen**/ 458d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, JiewenUINT8 459d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, JiewenEFIAPI 460d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, JiewenGetFspApiCallingMode ( 461d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen VOID 462d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen ) 463d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen{ 464d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen return GetFspGlobalDataPointer()->ApiMode; 465d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen} 466d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen 467d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen/** 4686ca9135a654a658c9fbaa698cfa69a76c7719be1Yao, Jiewen This function sets FSP API calling mode. 469d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen 470d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen @param[in] Mode API calling mode 471d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen**/ 472d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, JiewenVOID 473d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, JiewenEFIAPI 474d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, JiewenSetFspApiCallingMode ( 475d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen UINT8 Mode 476d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen ) 477d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen{ 478d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen FSP_GLOBAL_DATA *FspData; 479d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen 480d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen FspData = GetFspGlobalDataPointer (); 481d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen FspData->ApiMode = Mode; 482d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen} 483d5fb1edfb16a2af29486ffbf5aa32a036da9caa4Yao, Jiewen 484