/** @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; | |
} |