/** 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 IsBsp ( IN UINT32 ProcessorIndex ) { MSR_IA32_APIC_BASE_REGISTER MsrApicBase; // // If there are less than 2 CPUs detected, then the currently executing CPU // must be the BSP. This avoids an access to an MSR that may not be supported // on single core CPUs. // if (mDebugCpuData.CpuCount < 2) { return TRUE; } MsrApicBase.Uint64 = AsmReadMsr64 (MSR_IA32_APIC_BASE); if (MsrApicBase.Bits.BSP == 1) { if (mDebugMpContext.BspIndex != ProcessorIndex) { AcquireMpSpinLock (&mDebugMpContext.MpContextSpinLock); mDebugMpContext.BspIndex = ProcessorIndex; ReleaseMpSpinLock (&mDebugMpContext.MpContextSpinLock); } return TRUE; } else { return FALSE; } }
/** Get the current processor's index. @return Processor index value. **/ UINT32 GetProcessorIndex ( VOID ) { UINT32 Index; UINT16 LocalApicID; LocalApicID = (UINT16) GetApicId (); AcquireMpSpinLock (&mDebugMpContext.MpContextSpinLock); for (Index = 0; Index < mDebugCpuData.CpuCount; Index ++) { if (mDebugCpuData.ApicID[Index] == LocalApicID) { break; } } if (Index == mDebugCpuData.CpuCount) { mDebugCpuData.ApicID[Index] = LocalApicID; mDebugCpuData.CpuCount ++ ; } ReleaseMpSpinLock (&mDebugMpContext.MpContextSpinLock); return Index; }
/** 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 ) { AcquireMpSpinLock (&mDebugMpContext.MpContextSpinLock); mDebugMpContext.IpiSentByAp = IpiSentByApFlag; ReleaseMpSpinLock (&mDebugMpContext.MpContextSpinLock); }
/** Set the current view point to be debugged. @param[in] ProcessorIndex Processor index value. **/ VOID SetDebugViewPoint ( IN UINT32 ProcessorIndex ) { AcquireMpSpinLock (&mDebugMpContext.MpContextSpinLock); mDebugMpContext.ViewPointIndex = ProcessorIndex; ReleaseMpSpinLock (&mDebugMpContext.MpContextSpinLock); }
/** 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 ) { AcquireMpSpinLock (&mDebugMpContext.MpContextSpinLock); mDebugMpContext.RunCommandSet = RunningFlag; ReleaseMpSpinLock (&mDebugMpContext.MpContextSpinLock); }
/** Get Debug Agent Mailbox pointer. @return Mailbox pointer. **/ DEBUG_AGENT_MAILBOX * GetMailboxPointer ( VOID ) { AcquireMpSpinLock (&mDebugMpContext.MailboxSpinLock); VerifyMailboxChecksum (mMailboxPointer); ReleaseMpSpinLock (&mDebugMpContext.MailboxSpinLock); return mMailboxPointer; }
/** 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 ) { UINT8 Value; UINTN Index; AcquireMpSpinLock (&mDebugMpContext.MpContextSpinLock); Value = mDebugMpContext.CpuBreakMask[ProcessorIndex / 8]; Index = ProcessorIndex % 8; if (BreakFlag) { Value = BitFieldWrite8 (Value, Index, Index, 1); } else { Value = BitFieldWrite8 (Value, Index, Index, 0); } mDebugMpContext.CpuBreakMask[ProcessorIndex / 8] = Value; ReleaseMpSpinLock (&mDebugMpContext.MpContextSpinLock); }