RFC: https://bugzilla.tianocore.org/show_bug.cgi?id=3429 In TDVF BSP and APs are simplified. BSP is the vCPU-0, while the others are treated as APs. So MP intialization is rather simple. ApWorker is not supported, BSP is always the working processor, while the APs are just in a wait-for-precedure state. Cc: Brijesh Singh <brijesh.singh@amd.com> Cc: Erdem Aktas <erdemaktas@google.com> Cc: James Bottomley <jejb@linux.ibm.com> Cc: Jiewen Yao <jiewen.yao@intel.com> Cc: Tom Lendacky <thomas.lendacky@amd.com> Cc: Eric Dong <eric.dong@intel.com> Cc: Ray Ni <ray.ni@intel.com> Cc: Rahul Kumar <rahul1.kumar@intel.com> Cc: Gerd Hoffmann <kraxel@redhat.com> Acked-by: Gerd Hoffmann <kraxel@redhat.com> Reviewed-by: Ray Ni <ray.ni@intel.com> Reviewed-by: Jiewen Yao <jiewen.yao@intel.com> Signed-off-by: Min Xu <min.m.xu@intel.com>
		
			
				
	
	
		
			107 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			107 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  CPU MP Initialize Library common functions for Td guest.
 | 
						|
 | 
						|
  Copyright (c) 2020 - 2022, Intel Corporation. All rights reserved.<BR>
 | 
						|
 | 
						|
  SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
#include "MpLib.h"
 | 
						|
#include "MpIntelTdx.h"
 | 
						|
 | 
						|
/**
 | 
						|
  Gets detailed MP-related information on the requested processor at the
 | 
						|
  instant this call is made. This service may only be called from the BSP.
 | 
						|
 | 
						|
  In current stage only the BSP is workable. So ProcessorNumber should be 0.
 | 
						|
 | 
						|
  @param[in]  ProcessorNumber       The handle number of processor.
 | 
						|
  @param[out] ProcessorInfoBuffer   A pointer to the buffer where information for
 | 
						|
                                    the requested processor is deposited.
 | 
						|
  @param[out]  HealthData            Return processor health data.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS             Processor information was returned.
 | 
						|
  @retval EFI_DEVICE_ERROR        The calling processor is an AP.
 | 
						|
  @retval EFI_INVALID_PARAMETER   ProcessorInfoBuffer is NULL or ProcessorNumber is not 0.
 | 
						|
  @retval EFI_NOT_FOUND           The processor with the handle specified by
 | 
						|
                                  ProcessorNumber does not exist in the platform.
 | 
						|
  @retval EFI_NOT_READY           MP Initialize Library is not initialized.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
TdxMpInitLibGetProcessorInfo (
 | 
						|
  IN  UINTN                      ProcessorNumber,
 | 
						|
  OUT EFI_PROCESSOR_INFORMATION  *ProcessorInfoBuffer,
 | 
						|
  OUT EFI_HEALTH_FLAGS           *HealthData  OPTIONAL
 | 
						|
  )
 | 
						|
{
 | 
						|
  UINTN  OriginalProcessorNumber;
 | 
						|
 | 
						|
  //
 | 
						|
  // Lower 24 bits contains the actual processor number.
 | 
						|
  //
 | 
						|
  OriginalProcessorNumber = ProcessorNumber;
 | 
						|
  ProcessorNumber        &= BIT24 - 1;
 | 
						|
 | 
						|
  if ((ProcessorInfoBuffer == NULL) || (ProcessorNumber != 0)) {
 | 
						|
    return EFI_INVALID_PARAMETER;
 | 
						|
  }
 | 
						|
 | 
						|
  ProcessorInfoBuffer->ProcessorId = 0;
 | 
						|
  ProcessorInfoBuffer->StatusFlag  = PROCESSOR_AS_BSP_BIT | PROCESSOR_ENABLED_BIT;
 | 
						|
  ZeroMem (&ProcessorInfoBuffer->Location, sizeof (EFI_CPU_PHYSICAL_LOCATION));
 | 
						|
 | 
						|
  if ((OriginalProcessorNumber & CPU_V2_EXTENDED_TOPOLOGY) != 0) {
 | 
						|
    ZeroMem (&ProcessorInfoBuffer->ExtendedInformation.Location2, sizeof (EFI_CPU_PHYSICAL_LOCATION2));
 | 
						|
  }
 | 
						|
 | 
						|
  if (HealthData != NULL) {
 | 
						|
    HealthData->Uint32 = 0;
 | 
						|
  }
 | 
						|
 | 
						|
  return EFI_SUCCESS;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Retrieves the number of logical processor in the platform and the number of
 | 
						|
  those logical processors that are enabled on this boot. This service may only
 | 
						|
  be called from the BSP.
 | 
						|
 | 
						|
  @param[out] NumberOfProcessors          Pointer to the total number of logical
 | 
						|
                                          processors in the system, including the BSP
 | 
						|
                                          and disabled APs.
 | 
						|
  @param[out] NumberOfEnabledProcessors   Pointer to the number of enabled logical
 | 
						|
                                          processors that exist in system, including
 | 
						|
                                          the BSP.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS             The number of logical processors and enabled
 | 
						|
                                  logical processors was retrieved.
 | 
						|
  @retval EFI_DEVICE_ERROR        The calling processor is an AP.
 | 
						|
  @retval EFI_INVALID_PARAMETER   NumberOfProcessors is NULL and NumberOfEnabledProcessors
 | 
						|
                                  is NULL.
 | 
						|
  @retval EFI_NOT_READY           MP Initialize Library is not initialized.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
TdxMpInitLibGetNumberOfProcessors (
 | 
						|
  OUT UINTN *NumberOfProcessors, OPTIONAL
 | 
						|
  OUT UINTN *NumberOfEnabledProcessors OPTIONAL
 | 
						|
  )
 | 
						|
{
 | 
						|
  ASSERT (NumberOfProcessors != NULL || NumberOfEnabledProcessors != NULL);
 | 
						|
  //
 | 
						|
  // In current stage only the BSP is workable. So NumberOfProcessors
 | 
						|
  // & NumberOfEnableddProcessors are both 1.
 | 
						|
  //
 | 
						|
  if (NumberOfProcessors != NULL) {
 | 
						|
    *NumberOfProcessors = 1;
 | 
						|
  }
 | 
						|
 | 
						|
  if (NumberOfEnabledProcessors != NULL) {
 | 
						|
    *NumberOfEnabledProcessors = 1;
 | 
						|
  }
 | 
						|
 | 
						|
  return EFI_SUCCESS;
 | 
						|
}
 |