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;
 | 
						|
}
 |