Add PlatformGetLowMemoryCB() callback function for use with PlatformScanE820(). It stores the low memory size in PlatformInfoHob->LowMemory. This replaces calls to PlatformScanOrAdd64BitE820Ram() with non-NULL LowMemory. Write any actions done (setting LowMemory) to the firmware log with INFO loglevel. Also change PlatformGetSystemMemorySizeBelow4gb() to likewise set PlatformInfoHob->LowMemory instead of returning the value. Update all Callers to the new convention. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Reviewed-by: Laszlo Ersek <lersek@redhat.com>
		
			
				
	
	
		
			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;
 | |
| }
 |