Add IntelFspPkg to support create FSP bin based on EDKII.
Contributed-under: TianoCore Contribution Agreement 1.0 Signed off by: Ravi Rangarajan <ravi.p.rangarajan@intel.com> Reviewed by: Maurice Ma <maurice.ma@intel.com> Reviewed by: Jiewen Yao <jiewen.yao@intel.com> Reviewed by: Giri Mudusuru <giri.p.mudusuru@intel.com> Reviewed by: Liming Gao <liming.gao@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15705 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
## @file
|
||||
#
|
||||
# Copyright (c) 2014, 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
|
||||
# http://opensource.org/licenses/bsd-license.php.
|
||||
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#
|
||||
##
|
||||
|
||||
[defines]
|
||||
INF_VERSION = 0x00010005
|
||||
BASE_NAME = BaseCacheAsRamLibNull
|
||||
FILE_GUID = FBB4A01B-947E-4d82-B27D-1E207C070053
|
||||
MODULE_TYPE = BASE
|
||||
VERSION_STRING = 1.0
|
||||
LIBRARY_CLASS = CacheAsRamLib
|
||||
|
||||
[sources.common]
|
||||
DisableCacheAsRamNull.c
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
IntelFspPkg/IntelFspPkg.dec
|
||||
|
||||
[LibraryClasses]
|
||||
|
@@ -0,0 +1,41 @@
|
||||
/** @file
|
||||
|
||||
Copyright (c) 2014, 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
|
||||
http://opensource.org/licenses/bsd-license.php.
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#include <Uefi.h>
|
||||
#include <Library/BaseLib.h>
|
||||
#include <Library/CacheAsRamLib.h>
|
||||
|
||||
/**
|
||||
This function disable CAR.
|
||||
|
||||
@param[in] DisableCar TRUE means use INVD, FALSE means use WBINVD
|
||||
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
DisableCacheAsRam (
|
||||
IN BOOLEAN DisableCar
|
||||
)
|
||||
{
|
||||
//
|
||||
// Disable CAR
|
||||
//
|
||||
|
||||
if (DisableCar) {
|
||||
AsmInvd ();
|
||||
} else {
|
||||
AsmWbinvd();
|
||||
}
|
||||
|
||||
return ;
|
||||
}
|
32
IntelFspPkg/Library/BaseCacheLib/BaseCacheLib.inf
Normal file
32
IntelFspPkg/Library/BaseCacheLib/BaseCacheLib.inf
Normal file
@@ -0,0 +1,32 @@
|
||||
## @file
|
||||
#
|
||||
# Copyright (c) 2014, 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
|
||||
# http://opensource.org/licenses/bsd-license.php.
|
||||
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#
|
||||
##
|
||||
|
||||
[defines]
|
||||
INF_VERSION = 0x00010005
|
||||
BASE_NAME = BaseCacheLib
|
||||
FILE_GUID = 01359d99-9446-456d-ada4-50a711c03adb
|
||||
MODULE_TYPE = BASE
|
||||
VERSION_STRING = 1.0
|
||||
LIBRARY_CLASS = CacheLib
|
||||
|
||||
[sources.IA32]
|
||||
CacheLib.c
|
||||
CacheLibInternal.h
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
IntelFspPkg/IntelFspPkg.dec
|
||||
|
||||
[LibraryClasses]
|
||||
BaseMemoryLib
|
||||
|
749
IntelFspPkg/Library/BaseCacheLib/CacheLib.c
Normal file
749
IntelFspPkg/Library/BaseCacheLib/CacheLib.c
Normal file
@@ -0,0 +1,749 @@
|
||||
/** @file
|
||||
|
||||
Copyright (c) 2014, 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
|
||||
http://opensource.org/licenses/bsd-license.php.
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#include <Uefi.h>
|
||||
#include <Library/BaseLib.h>
|
||||
#include <Library/CacheLib.h>
|
||||
#include <Library/CacheAsRamLib.h>
|
||||
#include "CacheLibInternal.h"
|
||||
|
||||
/**
|
||||
Calculate the maximum value which is a power of 2, but less the Input.
|
||||
|
||||
@param[in] Input The number to pass in.
|
||||
@return The maximum value which is align to power of 2 and less the Input
|
||||
**/
|
||||
UINT32
|
||||
SetPower2 (
|
||||
IN UINT32 Input
|
||||
);
|
||||
|
||||
/**
|
||||
Search the memory cache type for specific memory from MTRR.
|
||||
|
||||
@param[in] MemoryAddress the address of target memory
|
||||
@param[in] MemoryLength the length of target memory
|
||||
@param[in] ValidMtrrAddressMask the MTRR address mask
|
||||
@param[out] UsedMsrNum the used MSR number
|
||||
@param[out] UsedMemoryCacheType the cache type for the target memory
|
||||
|
||||
@retval EFI_SUCCESS The memory is found in MTRR and cache type is returned
|
||||
@retval EFI_NOT_FOUND The memory is not found in MTRR
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
SearchForExactMtrr (
|
||||
IN EFI_PHYSICAL_ADDRESS MemoryAddress,
|
||||
IN UINT64 MemoryLength,
|
||||
IN UINT64 ValidMtrrAddressMask,
|
||||
OUT UINT32 *UsedMsrNum,
|
||||
OUT EFI_MEMORY_CACHE_TYPE *MemoryCacheType
|
||||
);
|
||||
|
||||
/**
|
||||
Check if CacheType match current default setting.
|
||||
|
||||
@param[in] MemoryCacheType input cache type to be checked.
|
||||
|
||||
@retval TRUE MemoryCacheType is default MTRR setting.
|
||||
@retval TRUE MemoryCacheType is NOT default MTRR setting.
|
||||
**/
|
||||
BOOLEAN
|
||||
IsDefaultType (
|
||||
IN EFI_MEMORY_CACHE_TYPE MemoryCacheType
|
||||
);
|
||||
|
||||
/**
|
||||
Return MTRR alignment requirement for base address and size.
|
||||
|
||||
@param[in] BaseAddress Base address.
|
||||
@param[in] Size Size.
|
||||
|
||||
@retval Zero Alligned.
|
||||
@retval Non-Zero Not alligned.
|
||||
|
||||
**/
|
||||
UINT32
|
||||
CheckMtrrAlignment (
|
||||
IN UINT64 BaseAddress,
|
||||
IN UINT64 Size
|
||||
);
|
||||
|
||||
typedef struct {
|
||||
UINT32 Msr;
|
||||
UINT32 BaseAddress;
|
||||
UINT32 Length;
|
||||
} EFI_FIXED_MTRR;
|
||||
|
||||
EFI_FIXED_MTRR mFixedMtrrTable[] = {
|
||||
{ EFI_MSR_IA32_MTRR_FIX64K_00000, 0, 0x10000},
|
||||
{ EFI_MSR_IA32_MTRR_FIX16K_80000, 0x80000, 0x4000},
|
||||
{ EFI_MSR_IA32_MTRR_FIX16K_A0000, 0xA0000, 0x4000},
|
||||
{ EFI_MSR_IA32_MTRR_FIX4K_C0000, 0xC0000, 0x1000},
|
||||
{ EFI_MSR_IA32_MTRR_FIX4K_C8000, 0xC8000, 0x1000},
|
||||
{ EFI_MSR_IA32_MTRR_FIX4K_D0000, 0xD0000, 0x1000},
|
||||
{ EFI_MSR_IA32_MTRR_FIX4K_D8000, 0xD8000, 0x1000},
|
||||
{ EFI_MSR_IA32_MTRR_FIX4K_E0000, 0xE0000, 0x1000},
|
||||
{ EFI_MSR_IA32_MTRR_FIX4K_E8000, 0xE8000, 0x1000},
|
||||
{ EFI_MSR_IA32_MTRR_FIX4K_F0000, 0xF0000, 0x1000},
|
||||
{ EFI_MSR_IA32_MTRR_FIX4K_F8000, 0xF8000, 0x1000}
|
||||
};
|
||||
|
||||
/**
|
||||
Given the input, check if the number of MTRR is lesser.
|
||||
if positive or subtractive.
|
||||
|
||||
@param[in] Input Length of Memory to program MTRR.
|
||||
|
||||
@retval Zero do positive.
|
||||
@retval Non-Zero do subtractive.
|
||||
|
||||
**/
|
||||
INT8
|
||||
CheckDirection (
|
||||
IN UINT64 Input
|
||||
)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
Disable cache and its mtrr.
|
||||
|
||||
@param[out] OldMtrr To return the Old MTRR value
|
||||
|
||||
**/
|
||||
VOID
|
||||
EfiDisableCacheMtrr (
|
||||
OUT UINT64 *OldMtrr
|
||||
)
|
||||
{
|
||||
UINT64 TempQword;
|
||||
|
||||
//
|
||||
// Disable Cache MTRR
|
||||
//
|
||||
*OldMtrr = AsmReadMsr64(EFI_MSR_CACHE_IA32_MTRR_DEF_TYPE);
|
||||
TempQword = (*OldMtrr) & ~B_EFI_MSR_GLOBAL_MTRR_ENABLE & ~B_EFI_MSR_FIXED_MTRR_ENABLE;
|
||||
AsmWriteMsr64(EFI_MSR_CACHE_IA32_MTRR_DEF_TYPE, TempQword);
|
||||
AsmDisableCache ();
|
||||
}
|
||||
|
||||
/**
|
||||
Recover cache MTRR.
|
||||
|
||||
@param[in] EnableMtrr Whether to enable the MTRR
|
||||
@param[in] OldMtrr The saved old MTRR value to restore when not to enable the MTRR
|
||||
|
||||
**/
|
||||
VOID
|
||||
EfiRecoverCacheMtrr (
|
||||
IN BOOLEAN EnableMtrr,
|
||||
IN UINT64 OldMtrr
|
||||
)
|
||||
{
|
||||
UINT64 TempQword;
|
||||
|
||||
//
|
||||
// Enable Cache MTRR
|
||||
//
|
||||
if (EnableMtrr) {
|
||||
TempQword = AsmReadMsr64(EFI_MSR_CACHE_IA32_MTRR_DEF_TYPE);
|
||||
TempQword |= (B_EFI_MSR_GLOBAL_MTRR_ENABLE | B_EFI_MSR_FIXED_MTRR_ENABLE);
|
||||
} else {
|
||||
TempQword = OldMtrr;
|
||||
}
|
||||
|
||||
AsmWriteMsr64 (EFI_MSR_CACHE_IA32_MTRR_DEF_TYPE, TempQword);
|
||||
|
||||
AsmEnableCache ();
|
||||
}
|
||||
|
||||
/**
|
||||
Programming MTRR according to Memory address, length, and type.
|
||||
|
||||
@param[in] MtrrNumber the variable MTRR index number
|
||||
@param[in] MemoryAddress the address of target memory
|
||||
@param[in] MemoryLength the length of target memory
|
||||
@param[in] MemoryCacheType the cache type of target memory
|
||||
@param[in] ValidMtrrAddressMask the MTRR address mask
|
||||
|
||||
**/
|
||||
VOID
|
||||
EfiProgramMtrr (
|
||||
IN UINTN MtrrNumber,
|
||||
IN EFI_PHYSICAL_ADDRESS MemoryAddress,
|
||||
IN UINT64 MemoryLength,
|
||||
IN EFI_MEMORY_CACHE_TYPE MemoryCacheType,
|
||||
IN UINT64 ValidMtrrAddressMask
|
||||
)
|
||||
{
|
||||
UINT64 TempQword;
|
||||
UINT64 OldMtrr;
|
||||
|
||||
if (MemoryLength == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
EfiDisableCacheMtrr (&OldMtrr);
|
||||
|
||||
//
|
||||
// MTRR Physical Base
|
||||
//
|
||||
TempQword = (MemoryAddress & ValidMtrrAddressMask) | MemoryCacheType;
|
||||
AsmWriteMsr64 (MtrrNumber, TempQword);
|
||||
|
||||
//
|
||||
// MTRR Physical Mask
|
||||
//
|
||||
TempQword = ~(MemoryLength - 1);
|
||||
AsmWriteMsr64 (MtrrNumber + 1, (TempQword & ValidMtrrAddressMask) | B_EFI_MSR_CACHE_MTRR_VALID);
|
||||
|
||||
EfiRecoverCacheMtrr (TRUE, OldMtrr);
|
||||
}
|
||||
|
||||
/**
|
||||
Calculate the maximum value which is a power of 2, but less the MemoryLength.
|
||||
|
||||
@param[in] MemoryAddress Memory address.
|
||||
@param[in] MemoryLength The number to pass in.
|
||||
|
||||
@return The maximum value which is align to power of 2 and less the MemoryLength
|
||||
|
||||
**/
|
||||
UINT64
|
||||
Power2MaxMemory (
|
||||
IN UINT64 MemoryAddress,
|
||||
IN UINT64 MemoryLength
|
||||
)
|
||||
{
|
||||
UINT64 Result;
|
||||
|
||||
if (MemoryLength == 0) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
//
|
||||
// Compute inital power of 2 size to return
|
||||
//
|
||||
if (RShiftU64(MemoryLength, 32)) {
|
||||
Result = LShiftU64((UINT64)SetPower2((UINT32) RShiftU64(MemoryLength, 32)), 32);
|
||||
} else {
|
||||
Result = (UINT64)SetPower2((UINT32)MemoryLength);
|
||||
}
|
||||
|
||||
//
|
||||
// Special case base of 0 as all ranges are valid
|
||||
//
|
||||
if (MemoryAddress == 0) {
|
||||
return Result;
|
||||
}
|
||||
|
||||
//
|
||||
// Loop till a value that can be mapped to this base address is found
|
||||
//
|
||||
while (CheckMtrrAlignment (MemoryAddress, Result) != 0) {
|
||||
//
|
||||
// Need to try the next smaller power of 2
|
||||
//
|
||||
Result = RShiftU64 (Result, 1);
|
||||
}
|
||||
|
||||
return Result;
|
||||
}
|
||||
|
||||
/**
|
||||
Return MTRR alignment requirement for base address and size.
|
||||
|
||||
@param[in] BaseAddress Base address.
|
||||
@param[in] Size Size.
|
||||
|
||||
@retval Zero Alligned.
|
||||
@retval Non-Zero Not alligned.
|
||||
|
||||
**/
|
||||
UINT32
|
||||
CheckMtrrAlignment (
|
||||
IN UINT64 BaseAddress,
|
||||
IN UINT64 Size
|
||||
)
|
||||
{
|
||||
UINT32 ShiftedBase;
|
||||
UINT32 ShiftedSize;
|
||||
|
||||
//
|
||||
// Shift base and size right 12 bits to allow for larger memory sizes. The
|
||||
// MTRRs do not use the first 12 bits so this is safe for now. Only supports
|
||||
// up to 52 bits of physical address space.
|
||||
//
|
||||
ShiftedBase = (UINT32) RShiftU64 (BaseAddress, 12);
|
||||
ShiftedSize = (UINT32) RShiftU64 (Size, 12);
|
||||
|
||||
//
|
||||
// Return the results to the caller of the MOD
|
||||
//
|
||||
return ShiftedBase % ShiftedSize;
|
||||
}
|
||||
|
||||
/**
|
||||
Calculate the maximum value which is a power of 2, but less the Input.
|
||||
|
||||
@param[in] Input The number to pass in.
|
||||
|
||||
@return The maximum value which is align to power of 2 and less the Input.
|
||||
**/
|
||||
UINT32
|
||||
SetPower2 (
|
||||
IN UINT32 Input
|
||||
)
|
||||
{
|
||||
UINT32 Result;
|
||||
|
||||
Result = 0;
|
||||
#if defined(__GCC__)
|
||||
asm("bsr %1, \
|
||||
%%eax; \
|
||||
bts %%eax, \
|
||||
%0;" :"=r"(Result) :
|
||||
"r"(Input)
|
||||
);
|
||||
#elif defined(_MSC_VER)
|
||||
_asm {
|
||||
bsr eax, Input
|
||||
bts Result, eax
|
||||
}
|
||||
#endif
|
||||
return Result;
|
||||
}
|
||||
|
||||
/**
|
||||
Programs fixed MTRRs registers.
|
||||
|
||||
@param[in] MemoryCacheType The memory type to set.
|
||||
@param[in] Base The base address of memory range.
|
||||
@param[in] Length The length of memory range.
|
||||
|
||||
@retval RETURN_SUCCESS The cache type was updated successfully
|
||||
@retval RETURN_UNSUPPORTED The requested range or cache type was invalid
|
||||
for the fixed MTRRs.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
ProgramFixedMtrr (
|
||||
IN EFI_MEMORY_CACHE_TYPE MemoryCacheType,
|
||||
IN UINT64 *Base,
|
||||
IN UINT64 *Len
|
||||
)
|
||||
{
|
||||
UINT32 MsrNum;
|
||||
UINT32 ByteShift;
|
||||
UINT64 TempQword;
|
||||
UINT64 OrMask;
|
||||
UINT64 ClearMask;
|
||||
|
||||
TempQword = 0;
|
||||
OrMask = 0;
|
||||
ClearMask = 0;
|
||||
|
||||
for (MsrNum = 0; MsrNum < V_EFI_FIXED_MTRR_NUMBER; MsrNum++) {
|
||||
if ((*Base >= mFixedMtrrTable[MsrNum].BaseAddress) &&
|
||||
(*Base < (mFixedMtrrTable[MsrNum].BaseAddress + 8 * mFixedMtrrTable[MsrNum].Length))) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (MsrNum == V_EFI_FIXED_MTRR_NUMBER ) {
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
//
|
||||
// We found the fixed MTRR to be programmed
|
||||
//
|
||||
for (ByteShift=0; ByteShift < 8; ByteShift++) {
|
||||
if ( *Base == (mFixedMtrrTable[MsrNum].BaseAddress + ByteShift * mFixedMtrrTable[MsrNum].Length)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (ByteShift == 8 ) {
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
for (; ((ByteShift<8) && (*Len >= mFixedMtrrTable[MsrNum].Length));ByteShift++) {
|
||||
OrMask |= LShiftU64((UINT64) MemoryCacheType, (UINT32) (ByteShift* 8));
|
||||
ClearMask |= LShiftU64((UINT64) 0xFF, (UINT32) (ByteShift * 8));
|
||||
*Len -= mFixedMtrrTable[MsrNum].Length;
|
||||
*Base += mFixedMtrrTable[MsrNum].Length;
|
||||
}
|
||||
TempQword = AsmReadMsr64 (mFixedMtrrTable[MsrNum].Msr) & (~ClearMask | OrMask);
|
||||
AsmWriteMsr64 (mFixedMtrrTable[MsrNum].Msr, TempQword);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
Check if there is a valid variable MTRR that overlaps the given range.
|
||||
|
||||
@param[in] Start Base Address of the range to check.
|
||||
@param[in] End End address of the range to check.
|
||||
|
||||
@retval TRUE Mtrr overlap.
|
||||
@retval FALSE Mtrr not overlap.
|
||||
**/
|
||||
BOOLEAN
|
||||
CheckMtrrOverlap (
|
||||
IN EFI_PHYSICAL_ADDRESS Start,
|
||||
IN EFI_PHYSICAL_ADDRESS End
|
||||
)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
Given the memory range and cache type, programs the MTRRs.
|
||||
|
||||
@param[in] MemoryAddress Base Address of Memory to program MTRR.
|
||||
@param[in] MemoryLength Length of Memory to program MTRR.
|
||||
@param[in] MemoryCacheType Cache Type.
|
||||
|
||||
@retval EFI_SUCCESS Mtrr are set successfully.
|
||||
@retval EFI_LOAD_ERROR No empty MTRRs to use.
|
||||
@retval EFI_INVALID_PARAMETER The input parameter is not valid.
|
||||
@retval others An error occurs when setting MTTR.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SetCacheAttributes (
|
||||
IN EFI_PHYSICAL_ADDRESS MemoryAddress,
|
||||
IN UINT64 MemoryLength,
|
||||
IN EFI_MEMORY_CACHE_TYPE MemoryCacheType
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT32 MsrNum, MsrNumEnd;
|
||||
UINT64 TempQword;
|
||||
UINT32 LastVariableMtrrForBios;
|
||||
UINT64 OldMtrr;
|
||||
UINT32 UsedMsrNum;
|
||||
EFI_MEMORY_CACHE_TYPE UsedMemoryCacheType;
|
||||
UINT64 ValidMtrrAddressMask;
|
||||
UINT32 Cpuid_RegEax;
|
||||
|
||||
AsmCpuid (CPUID_EXTENDED_FUNCTION, &Cpuid_RegEax, NULL, NULL, NULL);
|
||||
if (Cpuid_RegEax >= CPUID_VIR_PHY_ADDRESS_SIZE) {
|
||||
AsmCpuid (CPUID_VIR_PHY_ADDRESS_SIZE, &Cpuid_RegEax, NULL, NULL, NULL);
|
||||
ValidMtrrAddressMask = (LShiftU64((UINT64) 1, (Cpuid_RegEax & 0xFF)) - 1) & (~(UINT64)0x0FFF);
|
||||
} else {
|
||||
ValidMtrrAddressMask = (LShiftU64((UINT64) 1, 36) - 1) & (~(UINT64)0x0FFF);
|
||||
}
|
||||
|
||||
//
|
||||
// Check for invalid parameter
|
||||
//
|
||||
if ((MemoryAddress & ~ValidMtrrAddressMask) != 0 || (MemoryLength & ~ValidMtrrAddressMask) != 0) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
if (MemoryLength == 0) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
switch (MemoryCacheType) {
|
||||
case EFI_CACHE_UNCACHEABLE:
|
||||
case EFI_CACHE_WRITECOMBINING:
|
||||
case EFI_CACHE_WRITETHROUGH:
|
||||
case EFI_CACHE_WRITEPROTECTED:
|
||||
case EFI_CACHE_WRITEBACK:
|
||||
break;
|
||||
|
||||
default:
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
//
|
||||
// Check if Fixed MTRR
|
||||
//
|
||||
if ((MemoryAddress + MemoryLength) <= (1 << 20)) {
|
||||
Status = EFI_SUCCESS;
|
||||
EfiDisableCacheMtrr (&OldMtrr);
|
||||
while ((MemoryLength > 0) && (Status == EFI_SUCCESS)) {
|
||||
Status = ProgramFixedMtrr (MemoryCacheType, &MemoryAddress, &MemoryLength);
|
||||
}
|
||||
EfiRecoverCacheMtrr (TRUE, OldMtrr);
|
||||
return Status;
|
||||
}
|
||||
|
||||
//
|
||||
// Search if the range attribute has been set before
|
||||
//
|
||||
Status = SearchForExactMtrr(
|
||||
MemoryAddress,
|
||||
MemoryLength,
|
||||
ValidMtrrAddressMask,
|
||||
&UsedMsrNum,
|
||||
&UsedMemoryCacheType
|
||||
);
|
||||
|
||||
if (!EFI_ERROR(Status)) {
|
||||
//
|
||||
// Compare if it has the same type as current setting
|
||||
//
|
||||
if (UsedMemoryCacheType == MemoryCacheType) {
|
||||
return EFI_SUCCESS;
|
||||
} else {
|
||||
//
|
||||
// Different type
|
||||
//
|
||||
|
||||
//
|
||||
// Check if the set type is the same as Default Type
|
||||
//
|
||||
if (IsDefaultType(MemoryCacheType)) {
|
||||
//
|
||||
// Clear the MTRR
|
||||
//
|
||||
AsmWriteMsr64(UsedMsrNum, 0);
|
||||
AsmWriteMsr64(UsedMsrNum + 1, 0);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
} else {
|
||||
//
|
||||
// Modify the MTRR type
|
||||
//
|
||||
EfiProgramMtrr(UsedMsrNum,
|
||||
MemoryAddress,
|
||||
MemoryLength,
|
||||
MemoryCacheType,
|
||||
ValidMtrrAddressMask
|
||||
);
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
//
|
||||
// @bug - Need to create memory map so that when checking for overlap we
|
||||
// can determine if an overlap exists based on all caching requests.
|
||||
//
|
||||
// Don't waste a variable MTRR if the caching attrib is same as default in MTRR_DEF_TYPE
|
||||
//
|
||||
if (MemoryCacheType == (AsmReadMsr64(EFI_MSR_CACHE_IA32_MTRR_DEF_TYPE) & B_EFI_MSR_CACHE_MEMORY_TYPE)) {
|
||||
if (!CheckMtrrOverlap (MemoryAddress, MemoryAddress+MemoryLength-1)) {
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
//
|
||||
// Find first unused MTRR
|
||||
//
|
||||
MsrNumEnd = EFI_MSR_CACHE_VARIABLE_MTRR_BASE + (2 * (UINT32)(AsmReadMsr64(EFI_MSR_IA32_MTRR_CAP) & B_EFI_MSR_IA32_MTRR_CAP_VARIABLE_SUPPORT));
|
||||
for (MsrNum = EFI_MSR_CACHE_VARIABLE_MTRR_BASE; MsrNum < MsrNumEnd; MsrNum +=2) {
|
||||
if ((AsmReadMsr64(MsrNum+1) & B_EFI_MSR_CACHE_MTRR_VALID) == 0 ) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Reserve 1 MTRR pair for OS.
|
||||
//
|
||||
LastVariableMtrrForBios = MsrNumEnd - 1 - (EFI_CACHE_NUM_VAR_MTRR_PAIRS_FOR_OS * 2);
|
||||
if (MsrNum > LastVariableMtrrForBios) {
|
||||
return EFI_LOAD_ERROR;
|
||||
}
|
||||
|
||||
//
|
||||
// Special case for 1 MB base address
|
||||
//
|
||||
if (MemoryAddress == BASE_1MB) {
|
||||
MemoryAddress = 0;
|
||||
}
|
||||
|
||||
//
|
||||
// Program MTRRs
|
||||
//
|
||||
TempQword = MemoryLength;
|
||||
|
||||
if (TempQword == Power2MaxMemory(MemoryAddress, TempQword)) {
|
||||
EfiProgramMtrr(MsrNum,
|
||||
MemoryAddress,
|
||||
MemoryLength,
|
||||
MemoryCacheType,
|
||||
ValidMtrrAddressMask
|
||||
);
|
||||
|
||||
} else {
|
||||
//
|
||||
// Fill in MTRRs with values. Direction can not be checked for this method
|
||||
// as we are using WB as the default cache type and only setting areas to UC.
|
||||
//
|
||||
do {
|
||||
//
|
||||
// Do boundary check so we don't go past last MTRR register
|
||||
// for BIOS use. Leave one MTRR pair for OS use.
|
||||
//
|
||||
if (MsrNum > LastVariableMtrrForBios) {
|
||||
return EFI_LOAD_ERROR;
|
||||
}
|
||||
|
||||
//
|
||||
// Set next power of 2 region
|
||||
//
|
||||
MemoryLength = Power2MaxMemory(MemoryAddress, TempQword);
|
||||
EfiProgramMtrr(MsrNum,
|
||||
MemoryAddress,
|
||||
MemoryLength,
|
||||
MemoryCacheType,
|
||||
ValidMtrrAddressMask
|
||||
);
|
||||
MemoryAddress += MemoryLength;
|
||||
TempQword -= MemoryLength;
|
||||
MsrNum += 2;
|
||||
} while (TempQword != 0);
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
Reset all the MTRRs to a known state.
|
||||
|
||||
@retval EFI_SUCCESS All MTRRs have been reset successfully.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
ResetCacheAttributes (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
UINT32 MsrNum, MsrNumEnd;
|
||||
UINT16 Index;
|
||||
UINT64 OldMtrr;
|
||||
UINT64 CacheType;
|
||||
BOOLEAN DisableCar;
|
||||
Index = 0;
|
||||
DisableCar = TRUE;
|
||||
|
||||
//
|
||||
// Determine default cache type
|
||||
//
|
||||
CacheType = EFI_CACHE_UNCACHEABLE;
|
||||
|
||||
//
|
||||
// Set default cache type
|
||||
//
|
||||
AsmWriteMsr64(EFI_MSR_CACHE_IA32_MTRR_DEF_TYPE, CacheType);
|
||||
|
||||
//
|
||||
// Disable CAR
|
||||
//
|
||||
DisableCacheAsRam (DisableCar);
|
||||
|
||||
EfiDisableCacheMtrr (&OldMtrr);
|
||||
|
||||
//
|
||||
// Reset Fixed MTRRs
|
||||
//
|
||||
for (Index = 0; Index < V_EFI_FIXED_MTRR_NUMBER; Index++) {
|
||||
AsmWriteMsr64 (mFixedMtrrTable[Index].Msr, 0);
|
||||
}
|
||||
|
||||
//
|
||||
// Reset Variable MTRRs
|
||||
//
|
||||
MsrNumEnd = EFI_MSR_CACHE_VARIABLE_MTRR_BASE + (2 * (UINT32)(AsmReadMsr64(EFI_MSR_IA32_MTRR_CAP) & B_EFI_MSR_IA32_MTRR_CAP_VARIABLE_SUPPORT));
|
||||
for (MsrNum = EFI_MSR_CACHE_VARIABLE_MTRR_BASE; MsrNum < MsrNumEnd; MsrNum++) {
|
||||
AsmWriteMsr64 (MsrNum, 0);
|
||||
}
|
||||
|
||||
//
|
||||
// Enable Fixed and Variable MTRRs
|
||||
//
|
||||
EfiRecoverCacheMtrr (TRUE, OldMtrr);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
Search the memory cache type for specific memory from MTRR.
|
||||
|
||||
@param[in] MemoryAddress the address of target memory
|
||||
@param[in] MemoryLength the length of target memory
|
||||
@param[in] ValidMtrrAddressMask the MTRR address mask
|
||||
@param[out] UsedMsrNum the used MSR number
|
||||
@param[out] UsedMemoryCacheType the cache type for the target memory
|
||||
|
||||
@retval EFI_SUCCESS The memory is found in MTRR and cache type is returned
|
||||
@retval EFI_NOT_FOUND The memory is not found in MTRR
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
SearchForExactMtrr (
|
||||
IN EFI_PHYSICAL_ADDRESS MemoryAddress,
|
||||
IN UINT64 MemoryLength,
|
||||
IN UINT64 ValidMtrrAddressMask,
|
||||
OUT UINT32 *UsedMsrNum,
|
||||
OUT EFI_MEMORY_CACHE_TYPE *UsedMemoryCacheType
|
||||
)
|
||||
{
|
||||
UINT32 MsrNum, MsrNumEnd;
|
||||
UINT64 TempQword;
|
||||
|
||||
if (MemoryLength == 0) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
MsrNumEnd = EFI_MSR_CACHE_VARIABLE_MTRR_BASE + (2 * (UINT32)(AsmReadMsr64(EFI_MSR_IA32_MTRR_CAP) & B_EFI_MSR_IA32_MTRR_CAP_VARIABLE_SUPPORT));
|
||||
for (MsrNum = EFI_MSR_CACHE_VARIABLE_MTRR_BASE; MsrNum < MsrNumEnd; MsrNum +=2) {
|
||||
TempQword = AsmReadMsr64(MsrNum+1);
|
||||
if ((TempQword & B_EFI_MSR_CACHE_MTRR_VALID) == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((TempQword & ValidMtrrAddressMask) != ((~(MemoryLength - 1)) & ValidMtrrAddressMask)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
TempQword = AsmReadMsr64 (MsrNum);
|
||||
if ((TempQword & ValidMtrrAddressMask) != (MemoryAddress & ValidMtrrAddressMask)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
*UsedMemoryCacheType = (EFI_MEMORY_CACHE_TYPE)(TempQword & B_EFI_MSR_CACHE_MEMORY_TYPE);
|
||||
*UsedMsrNum = MsrNum;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
/**
|
||||
Check if CacheType match current default setting.
|
||||
|
||||
@param[in] MemoryCacheType input cache type to be checked.
|
||||
|
||||
@retval TRUE MemoryCacheType is default MTRR setting.
|
||||
@retval TRUE MemoryCacheType is NOT default MTRR setting.
|
||||
**/
|
||||
BOOLEAN
|
||||
IsDefaultType (
|
||||
IN EFI_MEMORY_CACHE_TYPE MemoryCacheType
|
||||
)
|
||||
{
|
||||
if ((AsmReadMsr64(EFI_MSR_CACHE_IA32_MTRR_DEF_TYPE) & B_EFI_MSR_CACHE_MEMORY_TYPE) != MemoryCacheType) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
59
IntelFspPkg/Library/BaseCacheLib/CacheLibInternal.h
Normal file
59
IntelFspPkg/Library/BaseCacheLib/CacheLibInternal.h
Normal file
@@ -0,0 +1,59 @@
|
||||
/** @file
|
||||
|
||||
Copyright (c) 2014, 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
|
||||
http://opensource.org/licenses/bsd-license.php.
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#ifndef _CACHE_LIB_INTERNAL_H_
|
||||
#define _CACHE_LIB_INTERNAL_H_
|
||||
|
||||
#define EFI_MSR_CACHE_VARIABLE_MTRR_BASE 0x00000200
|
||||
#define EFI_MSR_CACHE_VARIABLE_MTRR_END 0x0000020F
|
||||
#define V_EFI_FIXED_MTRR_NUMBER 11
|
||||
|
||||
#define EFI_MSR_IA32_MTRR_FIX64K_00000 0x00000250
|
||||
#define EFI_MSR_IA32_MTRR_FIX16K_80000 0x00000258
|
||||
#define EFI_MSR_IA32_MTRR_FIX16K_A0000 0x00000259
|
||||
#define EFI_MSR_IA32_MTRR_FIX4K_C0000 0x00000268
|
||||
#define EFI_MSR_IA32_MTRR_FIX4K_C8000 0x00000269
|
||||
#define EFI_MSR_IA32_MTRR_FIX4K_D0000 0x0000026A
|
||||
#define EFI_MSR_IA32_MTRR_FIX4K_D8000 0x0000026B
|
||||
#define EFI_MSR_IA32_MTRR_FIX4K_E0000 0x0000026C
|
||||
#define EFI_MSR_IA32_MTRR_FIX4K_E8000 0x0000026D
|
||||
#define EFI_MSR_IA32_MTRR_FIX4K_F0000 0x0000026E
|
||||
#define EFI_MSR_IA32_MTRR_FIX4K_F8000 0x0000026F
|
||||
#define EFI_MSR_CACHE_IA32_MTRR_DEF_TYPE 0x000002FF
|
||||
#define B_EFI_MSR_CACHE_MTRR_VALID BIT11
|
||||
#define B_EFI_MSR_GLOBAL_MTRR_ENABLE BIT11
|
||||
#define B_EFI_MSR_FIXED_MTRR_ENABLE BIT10
|
||||
#define B_EFI_MSR_CACHE_MEMORY_TYPE (BIT2 | BIT1 | BIT0)
|
||||
|
||||
#define EFI_MSR_VALID_MASK 0xFFFFFFFFF
|
||||
#define EFI_CACHE_VALID_ADDRESS 0xFFFFFF000
|
||||
#define EFI_SMRR_CACHE_VALID_ADDRESS 0xFFFFF000
|
||||
#define EFI_CACHE_VALID_EXTENDED_ADDRESS 0xFFFFFFFFFF000
|
||||
|
||||
// Leave one MTRR pairs for OS use
|
||||
#define EFI_CACHE_NUM_VAR_MTRR_PAIRS_FOR_OS 1
|
||||
#define EFI_CACHE_LAST_VARIABLE_MTRR_FOR_BIOS (EFI_MSR_CACHE_VARIABLE_MTRR_END) - \
|
||||
(EFI_CACHE_NUM_VAR_MTRR_PAIRS_FOR_OS * 2)
|
||||
|
||||
#define EFI_MSR_IA32_MTRR_CAP 0x000000FE
|
||||
#define B_EFI_MSR_IA32_MTRR_CAP_EMRR_SUPPORT BIT12
|
||||
#define B_EFI_MSR_IA32_MTRR_CAP_SMRR_SUPPORT BIT11
|
||||
#define B_EFI_MSR_IA32_MTRR_CAP_WC_SUPPORT BIT10
|
||||
#define B_EFI_MSR_IA32_MTRR_CAP_FIXED_SUPPORT BIT8
|
||||
#define B_EFI_MSR_IA32_MTRR_CAP_VARIABLE_SUPPORT (BIT7 | BIT6 | BIT5 | BIT4 | BIT3 | BIT2 | BIT1 | BIT0)
|
||||
|
||||
#define CPUID_VIR_PHY_ADDRESS_SIZE 0x80000008
|
||||
#define CPUID_EXTENDED_FUNCTION 0x80000000
|
||||
|
||||
#endif
|
||||
|
@@ -0,0 +1,34 @@
|
||||
## @file
|
||||
# Debug device library instance that retrieves the current enabling state for
|
||||
# the platform debug output device.
|
||||
#
|
||||
# Copyright (c) 2014, 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
|
||||
# http://opensource.org/licenses/bsd-license.php.
|
||||
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#
|
||||
##
|
||||
|
||||
[Defines]
|
||||
INF_VERSION = 0x00010005
|
||||
BASE_NAME = BaseDebugDeviceLibNull
|
||||
FILE_GUID = 455D16DC-E3AF-4b5f-A9AD-A4BC198085BD
|
||||
MODULE_TYPE = BASE
|
||||
VERSION_STRING = 1.0
|
||||
LIBRARY_CLASS = DebugDeviceLib
|
||||
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32
|
||||
#
|
||||
|
||||
[Sources]
|
||||
DebugDeviceLibNull.c
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
IntelFspPkg/IntelFspPkg.dec
|
||||
|
@@ -0,0 +1,31 @@
|
||||
/** @file
|
||||
Debug device library instance that retrieves the current enabling state for
|
||||
the platform debug output device.
|
||||
|
||||
Copyright (c) 2014, 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
|
||||
http://opensource.org/licenses/bsd-license.php.
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#include <Base.h>
|
||||
|
||||
/**
|
||||
Returns the debug print device enable state.
|
||||
|
||||
@return Debug print device enable state.
|
||||
|
||||
**/
|
||||
UINT8
|
||||
EFIAPI
|
||||
GetDebugPrintDeviceEnable (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
return 1;
|
||||
}
|
37
IntelFspPkg/Library/BaseFspCommonLib/BaseFspCommonLib.inf
Normal file
37
IntelFspPkg/Library/BaseFspCommonLib/BaseFspCommonLib.inf
Normal file
@@ -0,0 +1,37 @@
|
||||
## @file
|
||||
#
|
||||
# Copyright (c) 2014, 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
|
||||
# http://opensource.org/licenses/bsd-license.php.
|
||||
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#
|
||||
##
|
||||
|
||||
[Defines]
|
||||
INF_VERSION = 0x00010005
|
||||
BASE_NAME = BaseFspCommonLib
|
||||
FILE_GUID = 54607F66-D728-448e-A282-49E0404A557F
|
||||
MODULE_TYPE = BASE
|
||||
VERSION_STRING = 1.0
|
||||
LIBRARY_CLASS = FspCommonLib
|
||||
|
||||
[Sources]
|
||||
FspCommonLib.c
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
IntelFspPkg/IntelFspPkg.dec
|
||||
|
||||
[LibraryClasses]
|
||||
BaseMemoryLib
|
||||
|
||||
[Pcd]
|
||||
gIntelFspPkgTokenSpaceGuid.PcdGlobalDataPointerAddress
|
||||
|
||||
[FixedPcd]
|
||||
gIntelFspPkgTokenSpaceGuid.PcdFspMaxPatchEntry
|
||||
gIntelFspPkgTokenSpaceGuid.PcdFspMaxPerfEntry
|
318
IntelFspPkg/Library/BaseFspCommonLib/FspCommonLib.c
Normal file
318
IntelFspPkg/Library/BaseFspCommonLib/FspCommonLib.c
Normal file
@@ -0,0 +1,318 @@
|
||||
/** @file
|
||||
|
||||
Copyright (c) 2014, 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
|
||||
http://opensource.org/licenses/bsd-license.php.
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#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 offset exit +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 ExitOff;
|
||||
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 paramter passed by the bootlaoder.
|
||||
|
||||
@retval ApiParameter FSP API paramter 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 paramter 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;
|
||||
}
|
||||
|
||||
/**
|
||||
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)++];
|
||||
}
|
@@ -0,0 +1,49 @@
|
||||
## @file
|
||||
#
|
||||
# Copyright (c) 2014, 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
|
||||
# http://opensource.org/licenses/bsd-license.php.
|
||||
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#
|
||||
##
|
||||
|
||||
[Defines]
|
||||
INF_VERSION = 0x00010005
|
||||
BASE_NAME = BaseFspDebugLibSerialPort
|
||||
FILE_GUID = BB83F95F-EDBC-4884-A520-CD42AF388FAE
|
||||
MODULE_TYPE = BASE
|
||||
VERSION_STRING = 1.0
|
||||
LIBRARY_CLASS = DebugLib
|
||||
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32
|
||||
#
|
||||
|
||||
[Sources]
|
||||
DebugLib.c
|
||||
|
||||
[Sources.Ia32]
|
||||
Ia32/FspDebug.asm | MSFT
|
||||
Ia32/FspDebug.s | GCC
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
IntelFspPkg/IntelFspPkg.dec
|
||||
|
||||
[LibraryClasses]
|
||||
SerialPortLib
|
||||
BaseMemoryLib
|
||||
PcdLib
|
||||
PrintLib
|
||||
BaseLib
|
||||
DebugDeviceLib
|
||||
DebugPrintErrorLevelLib
|
||||
|
||||
[Pcd]
|
||||
gEfiMdePkgTokenSpaceGuid.PcdDebugClearMemoryValue
|
||||
gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask
|
||||
|
305
IntelFspPkg/Library/BaseFspDebugLibSerialPort/DebugLib.c
Normal file
305
IntelFspPkg/Library/BaseFspDebugLibSerialPort/DebugLib.c
Normal file
@@ -0,0 +1,305 @@
|
||||
/** @file
|
||||
|
||||
Copyright (c) 2014, 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
|
||||
http://opensource.org/licenses/bsd-license.php.
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#include <Base.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/BaseLib.h>
|
||||
#include <Library/PrintLib.h>
|
||||
#include <Library/PcdLib.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/SerialPortLib.h>
|
||||
#include <Library/DebugDeviceLib.h>
|
||||
#include <Library/DebugPrintErrorLevelLib.h>
|
||||
|
||||
//
|
||||
// Define the maximum debug and assert message length that this library supports
|
||||
//
|
||||
#define MAX_DEBUG_MESSAGE_LENGTH 0x100
|
||||
|
||||
CONST CHAR8 *mHexTable = "0123456789ABCDEF";
|
||||
|
||||
/**
|
||||
Get stack frame pointer of function call.
|
||||
|
||||
@return StackFramePointer stack frame pointer of function call.
|
||||
**/
|
||||
UINT32 *
|
||||
EFIAPI
|
||||
GetStackFramePointer (
|
||||
VOID
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Prints a debug message to the debug output device if the specified error level is enabled.
|
||||
|
||||
If any bit in ErrorLevel is also set in DebugPrintErrorLevelLib function
|
||||
GetDebugPrintErrorLevel (), then print the message specified by Format and the
|
||||
associated variable argument list to the debug output device.
|
||||
|
||||
If Format is NULL, then ASSERT().
|
||||
|
||||
@param ErrorLevel The error level of the debug message.
|
||||
@param Format Format string for the debug message to print.
|
||||
@param ... Variable argument list whose contents are accessed
|
||||
based on the format string specified by Format.
|
||||
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
DebugPrint (
|
||||
IN UINTN ErrorLevel,
|
||||
IN CONST CHAR8 *Format,
|
||||
...
|
||||
)
|
||||
{
|
||||
CHAR8 Buffer[MAX_DEBUG_MESSAGE_LENGTH];
|
||||
VA_LIST Marker;
|
||||
|
||||
//
|
||||
// If Format is NULL, then ASSERT().
|
||||
//
|
||||
if (!GetDebugPrintDeviceEnable ()) {
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
// Check driver debug mask value and global mask
|
||||
//
|
||||
if ((ErrorLevel & GetDebugPrintErrorLevel ()) == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
// If Format is NULL, then ASSERT().
|
||||
//
|
||||
ASSERT (Format != NULL);
|
||||
|
||||
//
|
||||
// Convert the DEBUG() message to an ASCII String
|
||||
//
|
||||
VA_START (Marker, Format);
|
||||
AsciiVSPrint (Buffer, sizeof (Buffer), Format, Marker);
|
||||
VA_END (Marker);
|
||||
|
||||
//
|
||||
// Send the print string to a Serial Port
|
||||
//
|
||||
SerialPortWrite ((UINT8 *)Buffer, AsciiStrLen (Buffer));
|
||||
}
|
||||
|
||||
/**
|
||||
Convert an UINT32 value into HEX string sepcified by Buffer.
|
||||
|
||||
@param Value The HEX value to convert to string
|
||||
@param Buffer The pointer to the target buffer to be filled with HEX string
|
||||
|
||||
**/
|
||||
VOID
|
||||
FillHex (
|
||||
UINT32 Value,
|
||||
CHAR8 *Buffer
|
||||
)
|
||||
{
|
||||
INTN Idx;
|
||||
for (Idx = 7; Idx >= 0; Idx--) {
|
||||
Buffer[Idx] = mHexTable[Value & 0x0F];
|
||||
Value >>= 4;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Prints an assert message containing a filename, line number, and description.
|
||||
This may be followed by a breakpoint or a dead loop.
|
||||
|
||||
Print a message of the form "ASSERT <FileName>(<LineNumber>): <Description>\n"
|
||||
to the debug output device. If DEBUG_PROPERTY_ASSERT_BREAKPOINT_ENABLED bit of
|
||||
PcdDebugProperyMask is set then CpuBreakpoint() is called. Otherwise, if
|
||||
DEBUG_PROPERTY_ASSERT_DEADLOOP_ENABLED bit of PcdDebugProperyMask is set then
|
||||
CpuDeadLoop() is called. If neither of these bits are set, then this function
|
||||
returns immediately after the message is printed to the debug output device.
|
||||
DebugAssert() must actively prevent recursion. If DebugAssert() is called while
|
||||
processing another DebugAssert(), then DebugAssert() must return immediately.
|
||||
|
||||
If FileName is NULL, then a <FileName> string of "(NULL) Filename" is printed.
|
||||
If Description is NULL, then a <Description> string of "(NULL) Description" is printed.
|
||||
|
||||
**/
|
||||
VOID
|
||||
DebugAssertInternal (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
CHAR8 Buffer[MAX_DEBUG_MESSAGE_LENGTH];
|
||||
UINT32 *Frame;
|
||||
|
||||
Frame = (UINT32 *)GetStackFramePointer ();
|
||||
|
||||
//
|
||||
// Generate the ASSERT() message in Ascii format
|
||||
//
|
||||
AsciiStrCpy (Buffer, "-> EBP:0x00000000 EIP:0x00000000\n");
|
||||
SerialPortWrite ((UINT8 *)"ASSERT DUMP:\n", 13);
|
||||
while (Frame != NULL) {
|
||||
FillHex ((UINT32)Frame, Buffer + 9);
|
||||
FillHex (Frame[1], Buffer + 9 + 8 + 8);
|
||||
SerialPortWrite ((UINT8 *)Buffer, AsciiStrLen (Buffer));
|
||||
if ((Frame[0] > (UINT32)Frame) && (Frame[0] < (UINT32)Frame + 0x00100000)) {
|
||||
Frame = (UINT32 *)Frame[0];
|
||||
} else {
|
||||
Frame = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Dead loop
|
||||
//
|
||||
CpuDeadLoop ();
|
||||
}
|
||||
|
||||
/**
|
||||
Prints an assert message containing a filename, line number, and description.
|
||||
This may be followed by a breakpoint or a dead loop.
|
||||
|
||||
Print a message of the form "ASSERT <FileName>(<LineNumber>): <Description>\n"
|
||||
to the debug output device. If DEBUG_PROPERTY_ASSERT_BREAKPOINT_ENABLED bit of
|
||||
PcdDebugProperyMask is set then CpuBreakpoint() is called. Otherwise, if
|
||||
DEBUG_PROPERTY_ASSERT_DEADLOOP_ENABLED bit of PcdDebugProperyMask is set then
|
||||
CpuDeadLoop() is called. If neither of these bits are set, then this function
|
||||
returns immediately after the message is printed to the debug output device.
|
||||
DebugAssert() must actively prevent recursion. If DebugAssert() is called while
|
||||
processing another DebugAssert(), then DebugAssert() must return immediately.
|
||||
|
||||
If FileName is NULL, then a <FileName> string of "(NULL) Filename" is printed.
|
||||
If Description is NULL, then a <Description> string of "(NULL) Description" is printed.
|
||||
|
||||
@param FileName The pointer to the name of the source file that generated the assert condition.
|
||||
@param LineNumber The line number in the source file that generated the assert condition
|
||||
@param Description The pointer to the description of the assert condition.
|
||||
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
DebugAssert (
|
||||
IN CONST CHAR8 *FileName,
|
||||
IN UINTN LineNumber,
|
||||
IN CONST CHAR8 *Description
|
||||
)
|
||||
{
|
||||
DebugAssertInternal ();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Fills a target buffer with PcdDebugClearMemoryValue, and returns the target buffer.
|
||||
|
||||
This function fills Length bytes of Buffer with the value specified by
|
||||
PcdDebugClearMemoryValue, and returns Buffer.
|
||||
|
||||
If Buffer is NULL, then ASSERT().
|
||||
If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
|
||||
|
||||
@param Buffer The pointer to the target buffer to be filled with PcdDebugClearMemoryValue.
|
||||
@param Length The number of bytes in Buffer to fill with zeros PcdDebugClearMemoryValue.
|
||||
|
||||
@return Buffer The pointer to the target buffer filled with PcdDebugClearMemoryValue.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
EFIAPI
|
||||
DebugClearMemory (
|
||||
OUT VOID *Buffer,
|
||||
IN UINTN Length
|
||||
)
|
||||
{
|
||||
return Buffer;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Returns TRUE if ASSERT() macros are enabled.
|
||||
|
||||
This function returns TRUE if the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of
|
||||
PcdDebugProperyMask is set. Otherwise FALSE is returned.
|
||||
|
||||
@retval TRUE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is set.
|
||||
@retval FALSE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is clear.
|
||||
|
||||
**/
|
||||
BOOLEAN
|
||||
EFIAPI
|
||||
DebugAssertEnabled (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
return (BOOLEAN) ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED) != 0);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Returns TRUE if DEBUG() macros are enabled.
|
||||
|
||||
This function returns TRUE if the DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of
|
||||
PcdDebugProperyMask is set. Otherwise FALSE is returned.
|
||||
|
||||
@retval TRUE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugProperyMask is set.
|
||||
@retval FALSE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugProperyMask is clear.
|
||||
|
||||
**/
|
||||
BOOLEAN
|
||||
EFIAPI
|
||||
DebugPrintEnabled (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
return (BOOLEAN) ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_DEBUG_PRINT_ENABLED) != 0);
|
||||
}
|
||||
|
||||
/**
|
||||
Returns TRUE if DEBUG_CODE() macros are enabled.
|
||||
|
||||
This function returns TRUE if the DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of
|
||||
PcdDebugProperyMask is set. Otherwise FALSE is returned.
|
||||
|
||||
@retval TRUE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is set.
|
||||
@retval FALSE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is clear.
|
||||
|
||||
**/
|
||||
BOOLEAN
|
||||
EFIAPI
|
||||
DebugCodeEnabled (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
return (BOOLEAN) ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_DEBUG_CODE_ENABLED) != 0);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Returns TRUE if DEBUG_CLEAR_MEMORY() macro is enabled.
|
||||
|
||||
This function returns TRUE if the DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of
|
||||
PcdDebugProperyMask is set. Otherwise FALSE is returned.
|
||||
|
||||
@retval TRUE The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugProperyMask is set.
|
||||
@retval FALSE The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugProperyMask is clear.
|
||||
|
||||
**/
|
||||
BOOLEAN
|
||||
EFIAPI
|
||||
DebugClearMemoryEnabled (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
return (BOOLEAN) ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED) != 0);
|
||||
}
|
@@ -0,0 +1,34 @@
|
||||
;------------------------------------------------------------------------------
|
||||
;
|
||||
; Copyright (c) 2014, 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
|
||||
; http://opensource.org/licenses/bsd-license.php.
|
||||
;
|
||||
; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
;
|
||||
; Abstract:
|
||||
;
|
||||
; FSP Debug functions
|
||||
;
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
.386
|
||||
.model flat,C
|
||||
.code
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
; UINT32 *
|
||||
; EFIAPI
|
||||
; GetStackFramePointer (
|
||||
; VOID
|
||||
; );
|
||||
;------------------------------------------------------------------------------
|
||||
GetStackFramePointer PROC PUBLIC
|
||||
mov eax, ebp
|
||||
ret
|
||||
GetStackFramePointer ENDP
|
||||
|
||||
END
|
@@ -0,0 +1,30 @@
|
||||
#------------------------------------------------------------------------------
|
||||
#
|
||||
# Copyright (c) 2014, 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
|
||||
# http://opensource.org/licenses/bsd-license.php.
|
||||
#
|
||||
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#
|
||||
# Abstract:
|
||||
#
|
||||
# FSP Debug functions
|
||||
#
|
||||
#------------------------------------------------------------------------------
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# UINT32 *
|
||||
# EFIAPI
|
||||
# GetStackFramePointer (
|
||||
# VOID
|
||||
# )
|
||||
#------------------------------------------------------------------------------
|
||||
ASM_GLOBAL ASM_PFX(GetStackFramePointer)
|
||||
ASM_PFX(GetStackFramePointer):
|
||||
mov %ebp, %eax
|
||||
ret
|
||||
|
||||
|
@@ -0,0 +1,41 @@
|
||||
## @file
|
||||
#
|
||||
# Copyright (c) 2014, 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
|
||||
# http://opensource.org/licenses/bsd-license.php.
|
||||
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#
|
||||
##
|
||||
|
||||
[Defines]
|
||||
INF_VERSION = 0x00010005
|
||||
BASE_NAME = BaseFspPlatformLib
|
||||
FILE_GUID = 7DECCDAF-361F-4ec1-9714-260BAAF6F384
|
||||
MODULE_TYPE = BASE
|
||||
VERSION_STRING = 1.0
|
||||
LIBRARY_CLASS = FspPlatformLib
|
||||
|
||||
[Sources]
|
||||
FspPlatformMemory.c
|
||||
FspPlatformNotify.c
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
IntelFspPkg/IntelFspPkg.dec
|
||||
|
||||
[LibraryClasses]
|
||||
BaseMemoryLib
|
||||
|
||||
[Pcd]
|
||||
gIntelFspPkgTokenSpaceGuid.PcdGlobalDataPointerAddress
|
||||
gIntelFspPkgTokenSpaceGuid.PcdTemporaryRamBase
|
||||
gIntelFspPkgTokenSpaceGuid.PcdTemporaryRamSize
|
||||
gIntelFspPkgTokenSpaceGuid.PcdFspTemporaryRamSize
|
||||
|
||||
[FixedPcd]
|
||||
gIntelFspPkgTokenSpaceGuid.PcdFspMaxPatchEntry
|
||||
gIntelFspPkgTokenSpaceGuid.PcdFspMaxPerfEntry
|
155
IntelFspPkg/Library/BaseFspPlatformLib/FspPlatformMemory.c
Normal file
155
IntelFspPkg/Library/BaseFspPlatformLib/FspPlatformMemory.c
Normal file
@@ -0,0 +1,155 @@
|
||||
/** @file
|
||||
|
||||
Copyright (c) 2014, 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
|
||||
http://opensource.org/licenses/bsd-license.php.
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#include <PiPei.h>
|
||||
#include <Library/BaseLib.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/PcdLib.h>
|
||||
#include <Library/HobLib.h>
|
||||
#include <Library/PeiServicesLib.h>
|
||||
#include <Library/FspCommonLib.h>
|
||||
#include <Guid/GuidHobFsp.h>
|
||||
#include <FspGlobalData.h>
|
||||
#include <FspApi.h>
|
||||
|
||||
/**
|
||||
Get system memory from HOB.
|
||||
|
||||
@param[in,out] LowMemoryLength less than 4G memory length
|
||||
@param[in,out] HighMemoryLength greater than 4G memory length
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
FspGetSystemMemorySize (
|
||||
IN OUT UINT64 *LowMemoryLength,
|
||||
IN OUT UINT64 *HighMemoryLength
|
||||
)
|
||||
{
|
||||
EFI_PEI_HOB_POINTERS Hob;
|
||||
|
||||
*HighMemoryLength = 0;
|
||||
*LowMemoryLength = SIZE_1MB;
|
||||
//
|
||||
// Get the HOB list for processing
|
||||
//
|
||||
Hob.Raw = GetHobList ();
|
||||
|
||||
//
|
||||
// Collect memory ranges
|
||||
//
|
||||
while (!END_OF_HOB_LIST (Hob)) {
|
||||
if (Hob.Header->HobType == EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) {
|
||||
if (Hob.ResourceDescriptor->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY) {
|
||||
//
|
||||
// Need memory above 1MB to be collected here
|
||||
//
|
||||
if (Hob.ResourceDescriptor->PhysicalStart >= BASE_1MB &&
|
||||
Hob.ResourceDescriptor->PhysicalStart < (EFI_PHYSICAL_ADDRESS) BASE_4GB) {
|
||||
*LowMemoryLength += (UINT64) (Hob.ResourceDescriptor->ResourceLength);
|
||||
} else if (Hob.ResourceDescriptor->PhysicalStart >= (EFI_PHYSICAL_ADDRESS) BASE_4GB) {
|
||||
*HighMemoryLength += (UINT64) (Hob.ResourceDescriptor->ResourceLength);
|
||||
}
|
||||
}
|
||||
}
|
||||
Hob.Raw = GET_NEXT_HOB (Hob);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Migrate bootloader data before destroying CAR.
|
||||
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
FspMigrateTemporaryMemory (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
FSP_INIT_RT_COMMON_BUFFER *FspInitRtBuffer;
|
||||
UINT32 BootLoaderTempRamStart;
|
||||
UINT32 BootLoaderTempRamEnd;
|
||||
UINT32 BootLoaderTempRamSize;
|
||||
UINT32 OffsetGap;
|
||||
UINT32 FspParamPtr;
|
||||
FSP_INIT_PARAMS *FspInitParams;
|
||||
UINT32 *NewStackTop;
|
||||
VOID *BootLoaderTempRamHob;
|
||||
VOID *UpdDataRgnPtr;
|
||||
VOID *PlatformDataPtr;
|
||||
|
||||
//
|
||||
// Get the temporary memory range used by the bootloader
|
||||
//
|
||||
BootLoaderTempRamStart = PcdGet32(PcdTemporaryRamBase);
|
||||
BootLoaderTempRamSize = PcdGet32(PcdTemporaryRamSize) - PcdGet32(PcdFspTemporaryRamSize);
|
||||
BootLoaderTempRamEnd = BootLoaderTempRamStart + BootLoaderTempRamSize;
|
||||
|
||||
//
|
||||
// Build a Boot Loader Temporary Memory GUID HOB
|
||||
//
|
||||
BootLoaderTempRamHob = BuildGuidHob (&gFspBootLoaderTemporaryMemoryGuid, BootLoaderTempRamSize);
|
||||
CopyMem (BootLoaderTempRamHob, (VOID *)BootLoaderTempRamStart, BootLoaderTempRamSize);
|
||||
OffsetGap = (UINT32)BootLoaderTempRamHob - BootLoaderTempRamStart;
|
||||
|
||||
//
|
||||
// Set a new stack frame for the continuation function
|
||||
//
|
||||
FspInitParams = (FSP_INIT_PARAMS *)GetFspApiParameter ();
|
||||
FspInitRtBuffer = (FSP_INIT_RT_COMMON_BUFFER *)FspInitParams->RtBufferPtr;
|
||||
NewStackTop = (UINT32 *)FspInitRtBuffer->StackTop - 1;
|
||||
SetFspCoreStackPointer (NewStackTop);
|
||||
|
||||
//
|
||||
// Fix the FspInit Parameter Pointers to the new location.
|
||||
//
|
||||
FspParamPtr = GetFspApiParameter ();
|
||||
if (FspParamPtr >= BootLoaderTempRamStart && FspParamPtr < BootLoaderTempRamEnd) {
|
||||
SetFspApiParameter(FspParamPtr + OffsetGap);
|
||||
}
|
||||
|
||||
FspInitParams = (FSP_INIT_PARAMS *)GetFspApiParameter ();
|
||||
if ((UINT32)(FspInitParams->RtBufferPtr) >= BootLoaderTempRamStart &&
|
||||
(UINT32)(FspInitParams->RtBufferPtr) < BootLoaderTempRamEnd) {
|
||||
FspInitParams->RtBufferPtr = (VOID *)((UINT32)(FspInitParams->RtBufferPtr) + OffsetGap);
|
||||
}
|
||||
|
||||
if ((UINT32)(FspInitParams->NvsBufferPtr) >= BootLoaderTempRamStart &&
|
||||
(UINT32)(FspInitParams->NvsBufferPtr) < BootLoaderTempRamEnd) {
|
||||
FspInitParams->NvsBufferPtr = (VOID *)((UINT32)(FspInitParams->NvsBufferPtr) + OffsetGap);
|
||||
}
|
||||
|
||||
if ((UINT32)(((FSP_INIT_RT_COMMON_BUFFER *)(FspInitParams->RtBufferPtr))->UpdDataRgnPtr) >= BootLoaderTempRamStart &&
|
||||
(UINT32)(((FSP_INIT_RT_COMMON_BUFFER *)(FspInitParams->RtBufferPtr))->UpdDataRgnPtr) < BootLoaderTempRamEnd) {
|
||||
((FSP_INIT_RT_COMMON_BUFFER *)(FspInitParams->RtBufferPtr))->UpdDataRgnPtr = \
|
||||
(VOID *)((UINT32)(((FSP_INIT_RT_COMMON_BUFFER *)(FspInitParams->RtBufferPtr))->UpdDataRgnPtr) + OffsetGap);
|
||||
}
|
||||
|
||||
//
|
||||
// Update UPD pointer in FSP Global Data
|
||||
//
|
||||
UpdDataRgnPtr = ((FSP_INIT_RT_COMMON_BUFFER *)FspInitParams->RtBufferPtr)->UpdDataRgnPtr;
|
||||
if (UpdDataRgnPtr != NULL) {
|
||||
SetFspUpdDataPointer (UpdDataRgnPtr);
|
||||
}
|
||||
|
||||
//
|
||||
// Update Platform data pointer in FSP Global Data
|
||||
//
|
||||
PlatformDataPtr = GetFspPlatformDataPointer ();
|
||||
if (((UINT32)PlatformDataPtr >= BootLoaderTempRamStart) &&
|
||||
((UINT32)PlatformDataPtr < BootLoaderTempRamEnd)) {
|
||||
SetFspPlatformDataPointer ((UINT8 *)PlatformDataPtr + OffsetGap);
|
||||
}
|
||||
|
||||
}
|
178
IntelFspPkg/Library/BaseFspPlatformLib/FspPlatformNotify.c
Normal file
178
IntelFspPkg/Library/BaseFspPlatformLib/FspPlatformNotify.c
Normal file
@@ -0,0 +1,178 @@
|
||||
/** @file
|
||||
|
||||
Copyright (c) 2014, 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
|
||||
http://opensource.org/licenses/bsd-license.php.
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#include <PiPei.h>
|
||||
#include <Library/PeiServicesLib.h>
|
||||
#include <Library/PeiServicesTablePointerLib.h>
|
||||
#include <Library/BaseLib.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/PcdLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/HobLib.h>
|
||||
#include <Library/FspSwitchStackLib.h>
|
||||
#include <Library/FspCommonLib.h>
|
||||
#include <Guid/EventGroup.h>
|
||||
#include <FspApi.h>
|
||||
#include <Protocol/PciEnumerationComplete.h>
|
||||
|
||||
EFI_PEI_PPI_DESCRIPTOR mPeiPostPciEnumerationPpi = {
|
||||
(EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
|
||||
&gEfiPciEnumerationCompleteProtocolGuid,
|
||||
NULL
|
||||
};
|
||||
|
||||
EFI_PEI_PPI_DESCRIPTOR mPeiReadyToBootPpi = {
|
||||
(EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
|
||||
&gEfiEventReadyToBootGuid,
|
||||
NULL
|
||||
};
|
||||
|
||||
|
||||
UINT32 mFspNotfifySequence[] = {
|
||||
EnumInitPhaseAfterPciEnumeration,
|
||||
EnumInitPhaseReadyToBoot
|
||||
};
|
||||
|
||||
/**
|
||||
Install FSP notification.
|
||||
|
||||
@param[in] NotificatonCode FSP notification code
|
||||
|
||||
@retval EFI_SUCCESS Notify FSP successfully
|
||||
@retval EFI_INVALID_PARAMETER NotificatonCode is invalid
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
FspNotificationHandler (
|
||||
IN UINT32 NotificatonCode
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
||||
Status = EFI_SUCCESS;
|
||||
|
||||
switch (NotificatonCode) {
|
||||
case EnumInitPhaseAfterPciEnumeration:
|
||||
//
|
||||
// Do POST PCI initialization if needed
|
||||
//
|
||||
DEBUG ((DEBUG_INFO | DEBUG_INIT, "FSP Post PCI Enumeration ...\n"));
|
||||
PeiServicesInstallPpi (&mPeiPostPciEnumerationPpi);
|
||||
break;
|
||||
|
||||
case EnumInitPhaseReadyToBoot:
|
||||
//
|
||||
// Ready To Boot
|
||||
//
|
||||
DEBUG ((DEBUG_INFO| DEBUG_INIT, "FSP Ready To Boot ...\n"));
|
||||
PeiServicesInstallPpi (&mPeiReadyToBootPpi);
|
||||
break;
|
||||
|
||||
default:
|
||||
Status = EFI_INVALID_PARAMETER;
|
||||
break;
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
/**
|
||||
This function transfer control to the ContinuationFunc passed in by the
|
||||
bootloader.
|
||||
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
FspInitDone (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
FSP_INIT_PARAMS *FspInitParams;
|
||||
|
||||
FspInitParams = (FSP_INIT_PARAMS *)GetFspApiParameter ();
|
||||
|
||||
//
|
||||
// Modify the parameters for ContinuationFunc
|
||||
//
|
||||
SetFspContinuationFuncParameter(EFI_SUCCESS, 0);
|
||||
SetFspContinuationFuncParameter((UINT32)GetHobList(), 1);
|
||||
|
||||
//
|
||||
// Modify the return address to ContinuationFunc
|
||||
//
|
||||
SetFspApiReturnAddress((UINT32)FspInitParams->ContinuationFunc);
|
||||
|
||||
//
|
||||
// Give control back to the boot loader framework caller after FspInit is done
|
||||
// It is done throught the continuation function
|
||||
//
|
||||
SetFspMeasurePoint (FSP_PERF_ID_API_FSPINIT_EXIT);
|
||||
Pei2LoaderSwitchStack();
|
||||
}
|
||||
|
||||
/**
|
||||
This function handle NotifyPhase API call from the bootloader.
|
||||
It gives control back to the bootloader after it is handled. If the
|
||||
Notification code is a ReadyToBoot event, this function will return
|
||||
and FSP continues the remaining execution until it reaches the DxeIpl.
|
||||
|
||||
**/
|
||||
VOID
|
||||
FspWaitForNotify (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT32 NotificatonValue;
|
||||
UINT32 NotificatonCount;
|
||||
UINT8 Count;
|
||||
|
||||
NotificatonCount = 0;
|
||||
while (NotificatonCount < sizeof(mFspNotfifySequence) / sizeof(UINT32)) {
|
||||
|
||||
Count = (NotificatonCount << 1) & 0x07;
|
||||
SetFspMeasurePoint (FSP_PERF_ID_API_NOTIFY_POSTPCI_ENTRY + Count);
|
||||
|
||||
NotificatonValue = ((NOTIFY_PHASE_PARAMS *)(UINTN)GetFspApiParameter ())->Phase;
|
||||
DEBUG ((DEBUG_INFO, "FSP Got Notification. Notification Value : 0x%08X\n", NotificatonValue));
|
||||
|
||||
if (mFspNotfifySequence[NotificatonCount] != NotificatonValue) {
|
||||
//
|
||||
// Notify code does not follow the predefined order
|
||||
//
|
||||
SetFspApiReturnStatus(EFI_UNSUPPORTED);
|
||||
} else {
|
||||
//
|
||||
// Process Notification and Give control back to the boot loader framework caller
|
||||
//
|
||||
Status = FspNotificationHandler (NotificatonValue);
|
||||
SetFspApiReturnStatus(Status);
|
||||
if (!EFI_ERROR(Status)) {
|
||||
NotificatonCount++;
|
||||
SetFspApiReturnStatus(EFI_SUCCESS);
|
||||
if (NotificatonValue == EnumInitPhaseReadyToBoot) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
SetFspMeasurePoint (FSP_PERF_ID_API_NOTIFY_POSTPCI_EXIT + Count);
|
||||
Pei2LoaderSwitchStack();
|
||||
}
|
||||
|
||||
//
|
||||
// Control goes back to the PEI Core and it dispatches further PEIMs.
|
||||
// DXEIPL is the final one to transfer control back to the boot loader.
|
||||
//
|
||||
}
|
||||
|
@@ -0,0 +1,42 @@
|
||||
## @file
|
||||
#
|
||||
# Copyright (c) 2014, 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
|
||||
# http://opensource.org/licenses/bsd-license.php.
|
||||
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#
|
||||
##
|
||||
|
||||
[Defines]
|
||||
INF_VERSION = 0x00010005
|
||||
BASE_NAME = BaseFspSwitchStackLib
|
||||
FILE_GUID = 8A5EA987-27F9-4ad0-B07C-D61882BFF4FF
|
||||
MODULE_TYPE = BASE
|
||||
VERSION_STRING = 1.0
|
||||
LIBRARY_CLASS = FspSwitchStackLib
|
||||
|
||||
[Sources.IA32]
|
||||
FspSwitchStackLib.c
|
||||
|
||||
[Sources.IA32]
|
||||
Ia32/Stack.asm | MSFT
|
||||
Ia32/Stack.s | GCC
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
IntelFspPkg/IntelFspPkg.dec
|
||||
|
||||
[LibraryClasses]
|
||||
BaseLib
|
||||
IoLib
|
||||
|
||||
[FixedPcd]
|
||||
gIntelFspPkgTokenSpaceGuid.PcdFspMaxPatchEntry
|
||||
gIntelFspPkgTokenSpaceGuid.PcdFspMaxPerfEntry
|
||||
|
||||
|
||||
|
@@ -0,0 +1,42 @@
|
||||
/** @file
|
||||
|
||||
Copyright (c) 2014, 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
|
||||
http://opensource.org/licenses/bsd-license.php.
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#include <Base.h>
|
||||
#include <Library/BaseLib.h>
|
||||
#include <Library/FspCommonLib.h>
|
||||
|
||||
/**
|
||||
|
||||
Switch the current stack to the previous saved stack.
|
||||
|
||||
@param[in] NewStack The new stack to be switched.
|
||||
|
||||
@return OldStack After switching to the saved stack,
|
||||
this value will be saved in eax before returning.
|
||||
|
||||
|
||||
**/
|
||||
UINT32
|
||||
SwapStack (
|
||||
IN UINT32 NewStack
|
||||
)
|
||||
{
|
||||
FSP_GLOBAL_DATA *FspData;
|
||||
UINT32 OldStack;
|
||||
|
||||
FspData = GetFspGlobalDataPointer ();
|
||||
OldStack = FspData->CoreStack;
|
||||
FspData->CoreStack = NewStack;
|
||||
return OldStack;
|
||||
}
|
||||
|
65
IntelFspPkg/Library/BaseFspSwitchStackLib/Ia32/Stack.asm
Normal file
65
IntelFspPkg/Library/BaseFspSwitchStackLib/Ia32/Stack.asm
Normal file
@@ -0,0 +1,65 @@
|
||||
;------------------------------------------------------------------------------
|
||||
;
|
||||
; Copyright (c) 2014, 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
|
||||
; http://opensource.org/licenses/bsd-license.php.
|
||||
;
|
||||
; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
;
|
||||
; Abstract:
|
||||
;
|
||||
; Switch the stack from temporary memory to permenent memory.
|
||||
;
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
.586p
|
||||
.model flat,C
|
||||
.code
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
; UINT32
|
||||
; EFIAPI
|
||||
; Pei2LoaderSwitchStack (
|
||||
; VOID
|
||||
; )
|
||||
;------------------------------------------------------------------------------
|
||||
EXTERNDEF C MeasurePoint:PROC
|
||||
Pei2LoaderSwitchStack PROC C PUBLIC
|
||||
jmp Loader2PeiSwitchStack
|
||||
Pei2LoaderSwitchStack ENDP
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
; UINT32
|
||||
; EFIAPI
|
||||
; Loader2PeiSwitchStack (
|
||||
; VOID
|
||||
; )
|
||||
;------------------------------------------------------------------------------
|
||||
EXTERNDEF C SwapStack:PROC
|
||||
Loader2PeiSwitchStack PROC C PUBLIC
|
||||
; Save current contexts
|
||||
push offset exit
|
||||
pushfd
|
||||
cli
|
||||
pushad
|
||||
sub esp, 8
|
||||
sidt fword ptr [esp]
|
||||
|
||||
; Load new stack
|
||||
push esp
|
||||
call SwapStack
|
||||
mov esp, eax
|
||||
|
||||
; Restore previous contexts
|
||||
lidt fword ptr [esp]
|
||||
add esp, 8
|
||||
popad
|
||||
popfd
|
||||
exit:
|
||||
ret
|
||||
Loader2PeiSwitchStack ENDP
|
||||
|
||||
END
|
64
IntelFspPkg/Library/BaseFspSwitchStackLib/Ia32/Stack.s
Normal file
64
IntelFspPkg/Library/BaseFspSwitchStackLib/Ia32/Stack.s
Normal file
@@ -0,0 +1,64 @@
|
||||
#------------------------------------------------------------------------------
|
||||
#
|
||||
# Copyright (c) 2014, 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
|
||||
# http://opensource.org/licenses/bsd-license.php.
|
||||
#
|
||||
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#
|
||||
# Abstract:
|
||||
#
|
||||
# Switch the stack from temporary memory to permenent memory.
|
||||
#
|
||||
#------------------------------------------------------------------------------
|
||||
|
||||
ASM_GLOBAL ASM_PFX(Pei2LoaderSwitchStack)
|
||||
ASM_GLOBAL ASM_PFX(Loader2PeiSwitchStack)
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# UINT32
|
||||
# EFIAPI
|
||||
# Pei2LoaderSwitchStack (
|
||||
# VOID
|
||||
# )
|
||||
#------------------------------------------------------------------------------
|
||||
ASM_GLOBAL ASM_PFX(Pei2LoaderSwitchStack)
|
||||
ASM_PFX(Pei2LoaderSwitchStack):
|
||||
jmp ASM_PFX(Loader2PeiSwitchStack)
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# UINT32
|
||||
# EFIAPI
|
||||
# Loader2PeiSwitchStack (
|
||||
# )
|
||||
#------------------------------------------------------------------------------
|
||||
ASM_GLOBAL ASM_PFX(Loader2PeiSwitchStack)
|
||||
ASM_PFX(Loader2PeiSwitchStack):
|
||||
#Save current contexts
|
||||
push $exit
|
||||
pushf
|
||||
pushf
|
||||
cli
|
||||
pusha
|
||||
push $0x0
|
||||
push $0x0
|
||||
sidt (%esp)
|
||||
|
||||
# Load new stack
|
||||
push %esp
|
||||
call ASM_PFX(SwapStack)
|
||||
mov %eax,%esp
|
||||
|
||||
# Restore previous contexts
|
||||
lidt (%esp)
|
||||
add $8,%esp
|
||||
popa
|
||||
popf
|
||||
popf
|
||||
exit:
|
||||
ret
|
||||
|
||||
|
@@ -0,0 +1,29 @@
|
||||
/** @file
|
||||
Null instance of Platform Sec Lib.
|
||||
|
||||
Copyright (c) 2014, 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
|
||||
http://opensource.org/licenses/bsd-license.php.
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#include <PiPei.h>
|
||||
|
||||
/**
|
||||
This function provides dummy function so that SecCore can pass pass build
|
||||
Validation in Ia32FamilyCpuPkg. All real platform library instances needs
|
||||
to implement the real entry point in assembly.
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
_ModuleEntryPoint (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
return;
|
||||
}
|
@@ -0,0 +1,53 @@
|
||||
## @file
|
||||
#
|
||||
# Copyright (c) 2014, 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
|
||||
# http://opensource.org/licenses/bsd-license.php.
|
||||
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#
|
||||
##
|
||||
|
||||
################################################################################
|
||||
#
|
||||
# Defines Section - statements that will be processed to create a Makefile.
|
||||
#
|
||||
################################################################################
|
||||
[Defines]
|
||||
INF_VERSION = 0x00010005
|
||||
BASE_NAME = SecPlatformSecLibNull
|
||||
FILE_GUID = 6695974D-968C-420b-80B9-7870CD20118F
|
||||
MODULE_TYPE = SEC
|
||||
VERSION_STRING = 1.0
|
||||
LIBRARY_CLASS = NULL
|
||||
|
||||
|
||||
#
|
||||
# The following information is for reference only and not required by the build tools.
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32 X64
|
||||
#
|
||||
|
||||
################################################################################
|
||||
#
|
||||
# Sources Section - list of files that are required for the build to succeed.
|
||||
#
|
||||
################################################################################
|
||||
|
||||
[Sources]
|
||||
PlatformSecLibNull.c
|
||||
|
||||
|
||||
################################################################################
|
||||
#
|
||||
# Package Dependency Section - list of Package files that are required for
|
||||
# this module.
|
||||
#
|
||||
################################################################################
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
|
Reference in New Issue
Block a user