mirror of
				https://github.com/acidanthera/audk.git
				synced 2025-11-03 21:17:23 +01:00 
			
		
		
		
	UefiCpuPkg/MpInitLib: Avoid call PcdGet* in Ap & Bsp.
MicrocodeDetect function will run by every threads, and it will use PcdGet to get PcdCpuMicrocodePatchAddress and PcdCpuMicrocodePatchRegionSize, if change both PCD default to dynamic, system will in non-deterministic behavior. By design, UEFI/PI services are single threaded and not re-entrant so Multi processor code should not use UEFI/PI services. Here, Pcd protocol/PPI is used to access dynamic PCDs so it would result in non-deterministic behavior. This code get PCD value in BSP and save them in CPU_MP_DATA for Ap. https://bugzilla.tianocore.org/show_bug.cgi?id=726 Cc: Crystal Lee <CrystalLee@ami.com.tw> Cc: Ruiyu Ni <ruiyu.ni@intel.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Eric Dong <eric.dong@intel.com> Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com>
This commit is contained in:
		
							parent
							
								
									3539e850eb
								
							
						
					
					
						commit
						1e3f7a3782
					
				@ -1,7 +1,7 @@
 | 
				
			|||||||
/** @file
 | 
					/** @file
 | 
				
			||||||
  Implementation of loading microcode on processors.
 | 
					  Implementation of loading microcode on processors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>
 | 
					  Copyright (c) 2015 - 2017, Intel Corporation. All rights reserved.<BR>
 | 
				
			||||||
  This program and the accompanying materials
 | 
					  This program and the accompanying materials
 | 
				
			||||||
  are licensed and made available under the terms and conditions of the BSD License
 | 
					  are licensed and made available under the terms and conditions of the BSD License
 | 
				
			||||||
  which accompanies this distribution.  The full text of the license may be found at
 | 
					  which accompanies this distribution.  The full text of the license may be found at
 | 
				
			||||||
@ -42,8 +42,6 @@ MicrocodeDetect (
 | 
				
			|||||||
  IN CPU_MP_DATA             *CpuMpData
 | 
					  IN CPU_MP_DATA             *CpuMpData
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINT64                                  MicrocodePatchAddress;
 | 
					 | 
				
			||||||
  UINT64                                  MicrocodePatchRegionSize;
 | 
					 | 
				
			||||||
  UINT32                                  ExtendedTableLength;
 | 
					  UINT32                                  ExtendedTableLength;
 | 
				
			||||||
  UINT32                                  ExtendedTableCount;
 | 
					  UINT32                                  ExtendedTableCount;
 | 
				
			||||||
  CPU_MICROCODE_EXTENDED_TABLE            *ExtendedTable;
 | 
					  CPU_MICROCODE_EXTENDED_TABLE            *ExtendedTable;
 | 
				
			||||||
@ -61,9 +59,7 @@ MicrocodeDetect (
 | 
				
			|||||||
  VOID                                    *MicrocodeData;
 | 
					  VOID                                    *MicrocodeData;
 | 
				
			||||||
  MSR_IA32_PLATFORM_ID_REGISTER           PlatformIdMsr;
 | 
					  MSR_IA32_PLATFORM_ID_REGISTER           PlatformIdMsr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  MicrocodePatchAddress    = PcdGet64 (PcdCpuMicrocodePatchAddress);
 | 
					  if (CpuMpData->MicrocodePatchRegionSize == 0) {
 | 
				
			||||||
  MicrocodePatchRegionSize = PcdGet64 (PcdCpuMicrocodePatchRegionSize);
 | 
					 | 
				
			||||||
  if (MicrocodePatchRegionSize == 0) {
 | 
					 | 
				
			||||||
    //
 | 
					    //
 | 
				
			||||||
    // There is no microcode patches
 | 
					    // There is no microcode patches
 | 
				
			||||||
    //
 | 
					    //
 | 
				
			||||||
@ -93,8 +89,8 @@ MicrocodeDetect (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  LatestRevision = 0;
 | 
					  LatestRevision = 0;
 | 
				
			||||||
  MicrocodeData  = NULL;
 | 
					  MicrocodeData  = NULL;
 | 
				
			||||||
  MicrocodeEnd = (UINTN) (MicrocodePatchAddress + MicrocodePatchRegionSize);
 | 
					  MicrocodeEnd = (UINTN) (CpuMpData->MicrocodePatchAddress + CpuMpData->MicrocodePatchRegionSize);
 | 
				
			||||||
  MicrocodeEntryPoint = (CPU_MICROCODE_HEADER *) (UINTN) MicrocodePatchAddress;
 | 
					  MicrocodeEntryPoint = (CPU_MICROCODE_HEADER *) (UINTN) CpuMpData->MicrocodePatchAddress;
 | 
				
			||||||
  do {
 | 
					  do {
 | 
				
			||||||
    //
 | 
					    //
 | 
				
			||||||
    // Check if the microcode is for the Cpu and the version is newer
 | 
					    // Check if the microcode is for the Cpu and the version is newer
 | 
				
			||||||
 | 
				
			|||||||
@ -1458,6 +1458,8 @@ MpInitLibInitialize (
 | 
				
			|||||||
  CpuMpData->SwitchBspFlag    = FALSE;
 | 
					  CpuMpData->SwitchBspFlag    = FALSE;
 | 
				
			||||||
  CpuMpData->CpuData          = (CPU_AP_DATA *) (CpuMpData + 1);
 | 
					  CpuMpData->CpuData          = (CPU_AP_DATA *) (CpuMpData + 1);
 | 
				
			||||||
  CpuMpData->CpuInfoInHob     = (UINT64) (UINTN) (CpuMpData->CpuData + MaxLogicalProcessorNumber);
 | 
					  CpuMpData->CpuInfoInHob     = (UINT64) (UINTN) (CpuMpData->CpuData + MaxLogicalProcessorNumber);
 | 
				
			||||||
 | 
					  CpuMpData->MicrocodePatchAddress    = PcdGet64 (PcdCpuMicrocodePatchAddress);
 | 
				
			||||||
 | 
					  CpuMpData->MicrocodePatchRegionSize = PcdGet64 (PcdCpuMicrocodePatchRegionSize);
 | 
				
			||||||
  InitializeSpinLock(&CpuMpData->MpLock);
 | 
					  InitializeSpinLock(&CpuMpData->MpLock);
 | 
				
			||||||
  //
 | 
					  //
 | 
				
			||||||
  // Save BSP's Control registers to APs
 | 
					  // Save BSP's Control registers to APs
 | 
				
			||||||
 | 
				
			|||||||
@ -233,6 +233,8 @@ struct _CPU_MP_DATA {
 | 
				
			|||||||
  UINT8                          Vector;
 | 
					  UINT8                          Vector;
 | 
				
			||||||
  BOOLEAN                        PeriodicMode;
 | 
					  BOOLEAN                        PeriodicMode;
 | 
				
			||||||
  BOOLEAN                        TimerInterruptState;
 | 
					  BOOLEAN                        TimerInterruptState;
 | 
				
			||||||
 | 
					  UINT64                         MicrocodePatchAddress;
 | 
				
			||||||
 | 
					  UINT64                         MicrocodePatchRegionSize;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern EFI_GUID mCpuInitMpLibHobGuid;
 | 
					extern EFI_GUID mCpuInitMpLibHobGuid;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user