mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-11-29 12:35:53 +01:00
138 lines
4.0 KiB
C
138 lines
4.0 KiB
C
|
/** @file
|
||
|
Main SEC phase code. Handles initial TDX Hob List Processing
|
||
|
|
||
|
Copyright (c) 2008, Intel Corporation. All rights reserved.<BR>
|
||
|
(C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
|
||
|
|
||
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||
|
|
||
|
**/
|
||
|
|
||
|
#include <PiPei.h>
|
||
|
#include <Library/BaseLib.h>
|
||
|
#include <Library/DebugLib.h>
|
||
|
#include <Library/HobLib.h>
|
||
|
#include <Library/BaseMemoryLib.h>
|
||
|
#include <Library/PciLib.h>
|
||
|
#include <Library/PrePiLib.h>
|
||
|
#include <Library/QemuFwCfgLib.h>
|
||
|
#include <IndustryStandard/Tdx.h>
|
||
|
#include <IndustryStandard/UefiTcgPlatform.h>
|
||
|
#include <Library/PlatformInitLib.h>
|
||
|
#include <OvmfPlatforms.h>
|
||
|
#include <Pi/PrePiHob.h>
|
||
|
#include "PeilessStartupInternal.h"
|
||
|
|
||
|
/**
|
||
|
* Construct the HobList in SEC phase.
|
||
|
*
|
||
|
* @return EFI_SUCCESS Successfully construct the firmware hoblist.
|
||
|
* @return EFI_NOT_FOUND Cannot find a memory region to be the fw hoblist.
|
||
|
*/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
ConstructSecHobList (
|
||
|
)
|
||
|
{
|
||
|
UINT32 LowMemorySize;
|
||
|
UINT32 LowMemoryStart;
|
||
|
|
||
|
EFI_HOB_HANDOFF_INFO_TABLE *HobList;
|
||
|
EFI_HOB_PLATFORM_INFO PlatformInfoHob;
|
||
|
|
||
|
ZeroMem (&PlatformInfoHob, sizeof (PlatformInfoHob));
|
||
|
PlatformInfoHob.HostBridgeDevId = PciRead16 (OVMF_HOSTBRIDGE_DID);
|
||
|
PlatformGetSystemMemorySizeBelow4gb (&PlatformInfoHob);
|
||
|
LowMemorySize = PlatformInfoHob.LowMemory;
|
||
|
ASSERT (LowMemorySize != 0);
|
||
|
LowMemoryStart = FixedPcdGet32 (PcdOvmfDxeMemFvBase) + FixedPcdGet32 (PcdOvmfDxeMemFvSize);
|
||
|
LowMemorySize -= LowMemoryStart;
|
||
|
|
||
|
DEBUG ((DEBUG_INFO, "LowMemory Start and End: %x, %x\n", LowMemoryStart, LowMemoryStart + LowMemorySize));
|
||
|
HobList = HobConstructor (
|
||
|
(VOID *)(UINTN)LowMemoryStart,
|
||
|
LowMemorySize,
|
||
|
(VOID *)(UINTN)LowMemoryStart,
|
||
|
(VOID *)(UINTN)(LowMemoryStart + LowMemorySize)
|
||
|
);
|
||
|
|
||
|
SetHobList ((VOID *)(UINT64)HobList);
|
||
|
|
||
|
return EFI_SUCCESS;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* This function is to find a memory region which is the largest one below 4GB.
|
||
|
* It will be used as the firmware hoblist.
|
||
|
*
|
||
|
* @param VmmHobList Vmm passed hoblist which constains the memory information.
|
||
|
* @return EFI_SUCCESS Successfully construct the firmware hoblist.
|
||
|
*/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
ConstructFwHobList (
|
||
|
IN CONST VOID *VmmHobList
|
||
|
)
|
||
|
{
|
||
|
EFI_PEI_HOB_POINTERS Hob;
|
||
|
EFI_PHYSICAL_ADDRESS PhysicalEnd;
|
||
|
UINT64 ResourceLength;
|
||
|
EFI_PHYSICAL_ADDRESS LowMemoryStart;
|
||
|
UINT64 LowMemoryLength;
|
||
|
|
||
|
ASSERT (VmmHobList != NULL);
|
||
|
|
||
|
Hob.Raw = (UINT8 *)VmmHobList;
|
||
|
|
||
|
LowMemoryLength = 0;
|
||
|
LowMemoryStart = 0;
|
||
|
|
||
|
//
|
||
|
// Parse the HOB list until end of list or matching type is found.
|
||
|
//
|
||
|
while (!END_OF_HOB_LIST (Hob)) {
|
||
|
if (Hob.Header->HobType == EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) {
|
||
|
if (Hob.ResourceDescriptor->ResourceType == BZ3937_EFI_RESOURCE_MEMORY_UNACCEPTED) {
|
||
|
PhysicalEnd = Hob.ResourceDescriptor->PhysicalStart + Hob.ResourceDescriptor->ResourceLength;
|
||
|
ResourceLength = Hob.ResourceDescriptor->ResourceLength;
|
||
|
|
||
|
if (PhysicalEnd <= BASE_4GB) {
|
||
|
if (ResourceLength > LowMemoryLength) {
|
||
|
LowMemoryStart = Hob.ResourceDescriptor->PhysicalStart;
|
||
|
LowMemoryLength = ResourceLength;
|
||
|
}
|
||
|
} else {
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Hob.Raw = GET_NEXT_HOB (Hob);
|
||
|
}
|
||
|
|
||
|
if (LowMemoryLength == 0) {
|
||
|
DEBUG ((DEBUG_ERROR, "Cannot find a memory region under 4GB for Fw hoblist.\n"));
|
||
|
return EFI_NOT_FOUND;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// HobLib doesn't like HobStart at address 0 so adjust is needed
|
||
|
//
|
||
|
if (LowMemoryStart == 0) {
|
||
|
LowMemoryStart += EFI_PAGE_SIZE;
|
||
|
LowMemoryLength -= EFI_PAGE_SIZE;
|
||
|
}
|
||
|
|
||
|
DEBUG ((DEBUG_INFO, "LowMemory Start and End: %x, %x\n", LowMemoryStart, LowMemoryStart + LowMemoryLength));
|
||
|
HobConstructor (
|
||
|
(VOID *)LowMemoryStart,
|
||
|
LowMemoryLength,
|
||
|
(VOID *)LowMemoryStart,
|
||
|
(VOID *)(LowMemoryStart + LowMemoryLength)
|
||
|
);
|
||
|
|
||
|
SetHobList ((VOID *)(UINT64)LowMemoryStart);
|
||
|
|
||
|
return EFI_SUCCESS;
|
||
|
}
|