X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=IntelFspPkg%2FLibrary%2FBaseFspPlatformLib%2FFspPlatformMemory.c;fp=IntelFspPkg%2FLibrary%2FBaseFspPlatformLib%2FFspPlatformMemory.c;h=2f1c0b14e53b588c45e914fd44782b05de07f71d;hp=0000000000000000000000000000000000000000;hb=c8ec22a266cdd134ac99c3021003710130613a40;hpb=0d807dae4adf222ee0c1b3abe504c9a271a46062 diff --git a/IntelFspPkg/Library/BaseFspPlatformLib/FspPlatformMemory.c b/IntelFspPkg/Library/BaseFspPlatformLib/FspPlatformMemory.c new file mode 100644 index 0000000000..2f1c0b14e5 --- /dev/null +++ b/IntelFspPkg/Library/BaseFspPlatformLib/FspPlatformMemory.c @@ -0,0 +1,155 @@ +/** @file + + Copyright (c) 2014, Intel Corporation. All rights reserved.
+ 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/** + 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); + } + +}