123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477 |
- /** @file
- Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.<BR>
- SPDX-License-Identifier: BSD-2-Clause-Patent
- **/
- #include <PiPei.h>
- #include <Library/BaseLib.h>
- #include <Library/DebugLib.h>
- #include <Library/PcdLib.h>
- #include <FspGlobalData.h>
- #include <FspApi.h>
- #pragma pack(1)
- //
- // Cont Func Parameter 2 +0x3C
- // Cont Func Parameter 1 +0x38
- //
- // API Parameter +0x34
- // API return address +0x30
- //
- // push FspInfoHeader +0x2C
- // pushfd +0x28
- // cli
- // pushad +0x24
- // sub esp, 8 +0x00
- // sidt fword ptr [esp]
- //
- typedef struct {
- UINT16 IdtrLimit;
- UINT32 IdtrBase;
- UINT16 Reserved;
- UINT32 Edi;
- UINT32 Esi;
- UINT32 Ebp;
- UINT32 Esp;
- UINT32 Ebx;
- UINT32 Edx;
- UINT32 Ecx;
- UINT32 Eax;
- UINT16 Flags[2];
- UINT32 FspInfoHeader;
- UINT32 ApiRet;
- UINT32 ApiParam;
- } CONTEXT_STACK;
- #define CONTEXT_STACK_OFFSET(x) (UINT32)&((CONTEXT_STACK *)(UINTN)0)->x
- #pragma pack()
- /**
- This function sets the FSP global data pointer.
- @param[in] FspData Fsp global data pointer.
- **/
- VOID
- EFIAPI
- SetFspGlobalDataPointer (
- IN FSP_GLOBAL_DATA *FspData
- )
- {
- ASSERT (FspData != NULL);
- *((volatile UINT32 *)(UINTN)PcdGet32(PcdGlobalDataPointerAddress)) = (UINT32)(UINTN)FspData;
- }
- /**
- This function gets the FSP global data pointer.
- **/
- FSP_GLOBAL_DATA *
- EFIAPI
- GetFspGlobalDataPointer (
- VOID
- )
- {
- FSP_GLOBAL_DATA *FspData;
- FspData = *(FSP_GLOBAL_DATA **)(UINTN)PcdGet32(PcdGlobalDataPointerAddress);
- return FspData;
- }
- /**
- This function gets back the FSP API parameter passed by the bootlaoder.
- @retval ApiParameter FSP API parameter passed by the bootlaoder.
- **/
- UINT32
- EFIAPI
- GetFspApiParameter (
- VOID
- )
- {
- FSP_GLOBAL_DATA *FspData;
- FspData = GetFspGlobalDataPointer ();
- return *(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET(ApiParam));
- }
- /**
- This function sets the FSP API parameter in the stack.
- @param[in] Value New parameter value.
- **/
- VOID
- EFIAPI
- SetFspApiParameter (
- IN UINT32 Value
- )
- {
- FSP_GLOBAL_DATA *FspData;
- FspData = GetFspGlobalDataPointer ();
- *(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET(ApiParam)) = Value;
- }
- /**
- This function sets the FSP continuation function parameters in the stack.
- @param[in] Value New parameter value to set.
- @param[in] Index Parameter index.
- **/
- VOID
- EFIAPI
- SetFspContinuationFuncParameter (
- IN UINT32 Value,
- IN UINT32 Index
- )
- {
- FSP_GLOBAL_DATA *FspData;
- FspData = GetFspGlobalDataPointer ();
- *(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET(ApiParam) + (Index + 1) * sizeof(UINT32)) = Value;
- }
- /**
- This function changes the BootLoader return address in stack.
- @param[in] ReturnAddress Address to return.
- **/
- VOID
- EFIAPI
- SetFspApiReturnAddress (
- IN UINT32 ReturnAddress
- )
- {
- FSP_GLOBAL_DATA *FspData;
- FspData = GetFspGlobalDataPointer ();
- *(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET(ApiRet)) = ReturnAddress;
- }
- /**
- This function set the API status code returned to the BootLoader.
- @param[in] ReturnStatus Status code to return.
- **/
- VOID
- EFIAPI
- SetFspApiReturnStatus (
- IN UINT32 ReturnStatus
- )
- {
- FSP_GLOBAL_DATA *FspData;
- FspData = GetFspGlobalDataPointer ();
- *(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET(Eax)) = ReturnStatus;
- }
- /**
- This function sets the context switching stack to a new stack frame.
- @param[in] NewStackTop New core stack to be set.
- **/
- VOID
- EFIAPI
- SetFspCoreStackPointer (
- IN VOID *NewStackTop
- )
- {
- FSP_GLOBAL_DATA *FspData;
- UINT32 *OldStack;
- UINT32 *NewStack;
- UINT32 StackContextLen;
- FspData = GetFspGlobalDataPointer ();
- StackContextLen = sizeof(CONTEXT_STACK) / sizeof(UINT32);
- //
- // Reserve space for the ContinuationFunc two parameters
- //
- OldStack = (UINT32 *)FspData->CoreStack;
- NewStack = (UINT32 *)NewStackTop - StackContextLen - 2;
- FspData->CoreStack = (UINT32)NewStack;
- while (StackContextLen-- != 0) {
- *NewStack++ = *OldStack++;
- }
- }
- /**
- This function sets the platform specific data pointer.
- @param[in] PlatformData Fsp platform specific data pointer.
- **/
- VOID
- EFIAPI
- SetFspPlatformDataPointer (
- IN VOID *PlatformData
- )
- {
- FSP_GLOBAL_DATA *FspData;
- FspData = GetFspGlobalDataPointer ();
- FspData->PlatformData.DataPtr = PlatformData;
- }
- /**
- This function gets the platform specific data pointer.
- @param[in] PlatformData Fsp platform specific data pointer.
- **/
- VOID *
- EFIAPI
- GetFspPlatformDataPointer (
- VOID
- )
- {
- FSP_GLOBAL_DATA *FspData;
- FspData = GetFspGlobalDataPointer ();
- return FspData->PlatformData.DataPtr;
- }
- /**
- This function sets the UPD data pointer.
- @param[in] UpdDataRgnPtr UPD data pointer.
- **/
- VOID
- EFIAPI
- SetFspUpdDataPointer (
- IN VOID *UpdDataRgnPtr
- )
- {
- FSP_GLOBAL_DATA *FspData;
- //
- // Get the Fsp Global Data Pointer
- //
- FspData = GetFspGlobalDataPointer ();
- //
- // Set the UPD pointer.
- //
- FspData->UpdDataRgnPtr = UpdDataRgnPtr;
- }
- /**
- This function gets the UPD data pointer.
- @return UpdDataRgnPtr UPD data pointer.
- **/
- VOID *
- EFIAPI
- GetFspUpdDataPointer (
- VOID
- )
- {
- FSP_GLOBAL_DATA *FspData;
- FspData = GetFspGlobalDataPointer ();
- return FspData->UpdDataRgnPtr;
- }
- /**
- This function sets the memory init UPD data pointer.
- @param[in] MemoryInitUpdPtr memory init UPD data pointer.
- **/
- VOID
- EFIAPI
- SetFspMemoryInitUpdDataPointer (
- IN VOID *MemoryInitUpdPtr
- )
- {
- FSP_GLOBAL_DATA *FspData;
- //
- // Get the Fsp Global Data Pointer
- //
- FspData = GetFspGlobalDataPointer ();
- //
- // Set the memory init UPD pointer.
- //
- FspData->MemoryInitUpdPtr = MemoryInitUpdPtr;
- }
- /**
- This function gets the memory init UPD data pointer.
- @return memory init UPD data pointer.
- **/
- VOID *
- EFIAPI
- GetFspMemoryInitUpdDataPointer (
- VOID
- )
- {
- FSP_GLOBAL_DATA *FspData;
- FspData = GetFspGlobalDataPointer ();
- return FspData->MemoryInitUpdPtr;
- }
- /**
- This function sets the silicon init UPD data pointer.
- @param[in] SiliconInitUpdPtr silicon init UPD data pointer.
- **/
- VOID
- EFIAPI
- SetFspSiliconInitUpdDataPointer (
- IN VOID *SiliconInitUpdPtr
- )
- {
- FSP_GLOBAL_DATA *FspData;
- //
- // Get the Fsp Global Data Pointer
- //
- FspData = GetFspGlobalDataPointer ();
- //
- // Set the silicon init UPD data pointer.
- //
- FspData->SiliconInitUpdPtr = SiliconInitUpdPtr;
- }
- /**
- This function gets the silicon init UPD data pointer.
- @return silicon init UPD data pointer.
- **/
- VOID *
- EFIAPI
- GetFspSiliconInitUpdDataPointer (
- VOID
- )
- {
- FSP_GLOBAL_DATA *FspData;
- FspData = GetFspGlobalDataPointer ();
- return FspData->SiliconInitUpdPtr;
- }
- /**
- Set FSP measurement point timestamp.
- @param[in] Id Measurement point ID.
- @return performance timestamp.
- **/
- UINT64
- EFIAPI
- SetFspMeasurePoint (
- IN UINT8 Id
- )
- {
- FSP_GLOBAL_DATA *FspData;
- //
- // Bit [55: 0] will be the timestamp
- // Bit [63:56] will be the ID
- //
- FspData = GetFspGlobalDataPointer ();
- if (FspData->PerfIdx < sizeof(FspData->PerfData) / sizeof(FspData->PerfData[0])) {
- FspData->PerfData[FspData->PerfIdx] = AsmReadTsc ();
- ((UINT8 *)(&FspData->PerfData[FspData->PerfIdx]))[7] = Id;
- }
- return FspData->PerfData[(FspData->PerfIdx)++];
- }
- /**
- This function gets the FSP info header pointer.
- @retval FspInfoHeader FSP info header pointer
- **/
- FSP_INFO_HEADER *
- EFIAPI
- GetFspInfoHeader (
- VOID
- )
- {
- return GetFspGlobalDataPointer()->FspInfoHeader;
- }
- /**
- This function gets the FSP info header pointer using the API stack context.
- @retval FspInfoHeader FSP info header pointer using the API stack context
- **/
- FSP_INFO_HEADER *
- EFIAPI
- GetFspInfoHeaderFromApiContext (
- VOID
- )
- {
- FSP_GLOBAL_DATA *FspData;
- FspData = GetFspGlobalDataPointer ();
- return (FSP_INFO_HEADER *)(*(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET(FspInfoHeader)));
- }
- /**
- This function gets the VPD data pointer.
- @return VpdDataRgnPtr VPD data pointer.
- **/
- VOID *
- EFIAPI
- GetFspVpdDataPointer (
- VOID
- )
- {
- FSP_INFO_HEADER *FspInfoHeader;
- FspInfoHeader = GetFspInfoHeader ();
- return (VOID *)(FspInfoHeader->ImageBase + FspInfoHeader->CfgRegionOffset);
- }
- /**
- This function gets FSP API calling mode.
- @retval API calling mode
- **/
- UINT8
- EFIAPI
- GetFspApiCallingMode (
- VOID
- )
- {
- return GetFspGlobalDataPointer()->ApiMode;
- }
- /**
- This function sets FSP API calling mode.
- @param[in] Mode API calling mode
- **/
- VOID
- EFIAPI
- SetFspApiCallingMode (
- UINT8 Mode
- )
- {
- FSP_GLOBAL_DATA *FspData;
- FspData = GetFspGlobalDataPointer ();
- FspData->ApiMode = Mode;
- }
|