/** @file | |
Header file for Multi-Processor support. | |
Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR> | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
**/ | |
#ifndef _DEBUG_MP_H_ | |
#define _DEBUG_MP_H_ | |
#define DEBUG_CPU_MAX_COUNT 256 | |
typedef struct { | |
UINT32 CpuCount; ///< Processor count | |
UINT16 ApicID[DEBUG_CPU_MAX_COUNT]; ///< Record the local apic id for each processor | |
} DEBUG_CPU_DATA; | |
typedef struct { | |
SPIN_LOCK MpContextSpinLock; ///< Lock for writing MP context | |
SPIN_LOCK DebugPortSpinLock; ///< Lock for access debug port | |
SPIN_LOCK MailboxSpinLock; ///< Lock for accessing mail box | |
UINT8 CpuBreakMask[DEBUG_CPU_MAX_COUNT/8]; ///< Bitmask of all breaking CPUs | |
UINT8 CpuStopStatusMask[DEBUG_CPU_MAX_COUNT/8]; ///< Bitmask of CPU stop status | |
UINT32 ViewPointIndex; ///< Current view point to be debugged | |
UINT32 BspIndex; ///< Processor index value of BSP | |
UINT32 BreakAtCpuIndex; ///< Processor index value of the current breaking CPU | |
UINT32 DebugTimerInitCount; ///< Record BSP's init timer count | |
BOOLEAN IpiSentByAp; ///< TRUE: IPI is sent by AP. FALSE: IPI is sent by BSP | |
BOOLEAN RunCommandSet; ///< TRUE: RUN command is executing. FALSE: RUN command has been executed. | |
} DEBUG_MP_CONTEXT; | |
extern DEBUG_MP_CONTEXT volatile mDebugMpContext; | |
extern DEBUG_CPU_DATA volatile mDebugCpuData; | |
/** | |
Break the other processor by send IPI. | |
@param[in] CurrentProcessorIndex Current processor index value. | |
**/ | |
VOID | |
HaltOtherProcessors ( | |
IN UINT32 CurrentProcessorIndex | |
); | |
/** | |
Get the current processor's index. | |
@return Processor index value. | |
**/ | |
UINT32 | |
GetProcessorIndex ( | |
VOID | |
); | |
/** | |
Acquire a spin lock when Multi-processor supported. | |
It will block in the function if cannot get the access control. | |
If Multi-processor is not supported, return directly. | |
@param[in, out] MpSpinLock A pointer to the spin lock. | |
**/ | |
VOID | |
AcquireMpSpinLock ( | |
IN OUT SPIN_LOCK *MpSpinLock | |
); | |
/** | |
Release a spin lock when Multi-processor supported. | |
@param[in, out] MpSpinLock A pointer to the spin lock. | |
**/ | |
VOID | |
ReleaseMpSpinLock ( | |
IN OUT SPIN_LOCK *MpSpinLock | |
); | |
/** | |
Check if the specified processor is BSP or not. | |
@param[in] ProcessorIndex Processor index value. | |
@retval TRUE It is BSP. | |
@retval FALSE It isn't BSP. | |
**/ | |
BOOLEAN | |
DebugAgentIsBsp ( | |
IN UINT32 ProcessorIndex | |
); | |
/** | |
Set processor stop flag bitmask in MP context. | |
@param[in] ProcessorIndex Processor index value. | |
@param[in] StopFlag TRUE means set stop flag. | |
FALSE means clean break flag. | |
**/ | |
VOID | |
SetCpuStopFlagByIndex ( | |
IN UINT32 ProcessorIndex, | |
IN BOOLEAN StopFlag | |
); | |
/** | |
Set processor break flag bitmask in MP context. | |
@param[in] ProcessorIndex Processor index value. | |
@param[in] BreakFlag TRUE means set break flag. | |
FALSE means clean break flag. | |
**/ | |
VOID | |
SetCpuBreakFlagByIndex ( | |
IN UINT32 ProcessorIndex, | |
IN BOOLEAN BreakFlag | |
); | |
/** | |
Check if processor is stopped already. | |
@param[in] ProcessorIndex Processor index value. | |
@retval TRUE Processor is stopped already. | |
@retval FALSE Processor isn't stopped. | |
**/ | |
BOOLEAN | |
IsCpuStopped ( | |
IN UINT32 ProcessorIndex | |
); | |
/** | |
Set the run command flag. | |
@param[in] RunningFlag TRUE means run command flag is set. | |
FALSE means run command flag is cleared. | |
**/ | |
VOID | |
SetCpuRunningFlag ( | |
IN BOOLEAN RunningFlag | |
); | |
/** | |
Set the current view point to be debugged. | |
@param[in] ProcessorIndex Processor index value. | |
**/ | |
VOID | |
SetDebugViewPoint ( | |
IN UINT32 ProcessorIndex | |
); | |
/** | |
Set the IPI send by BPS/AP flag. | |
@param[in] IpiSentByApFlag TRUE means this IPI is sent by AP. | |
FALSE means this IPI is sent by BSP. | |
**/ | |
VOID | |
SetIpiSentByApFlag ( | |
IN BOOLEAN IpiSentByApFlag | |
); | |
/** | |
Check the next pending breaking CPU. | |
@retval others There is at least one processor broken, the minimum | |
index number of Processor returned. | |
@retval -1 No any processor broken. | |
**/ | |
UINT32 | |
FindNextPendingBreakCpu ( | |
VOID | |
); | |
/** | |
Check if all processors are in running status. | |
@retval TRUE All processors run. | |
@retval FALSE At least one processor does not run. | |
**/ | |
BOOLEAN | |
IsAllCpuRunning ( | |
VOID | |
); | |
/** | |
Check if the current processor is the first breaking processor. | |
If yes, halt other processors. | |
@param[in] ProcessorIndex Processor index value. | |
@return TRUE This processor is the first breaking processor. | |
@return FALSE This processor is not the first breaking processor. | |
**/ | |
BOOLEAN | |
IsFirstBreakProcessor ( | |
IN UINT32 ProcessorIndex | |
); | |
#endif |