Home | History | Annotate | Download | only in DebugAgentCommon
      1 /** @file
      2   Header file for Multi-Processor support.
      3 
      4   Copyright (c) 2010 - 2013, Intel Corporation. All rights reserved.<BR>
      5   This program and the accompanying materials
      6   are licensed and made available under the terms and conditions of the BSD License
      7   which accompanies this distribution.  The full text of the license may be found at
      8   http://opensource.org/licenses/bsd-license.php.
      9 
     10   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     11   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     12 
     13 **/
     14 
     15 #ifndef _DEBUG_MP_H_
     16 #define _DEBUG_MP_H_
     17 
     18 #define DEBUG_CPU_MAX_COUNT             256
     19 
     20 typedef struct {
     21   UINT32    CpuCount;                            ///< Processor count
     22   UINT16    ApicID[DEBUG_CPU_MAX_COUNT];         ///< Record the local apic id for each processor
     23 } DEBUG_CPU_DATA;
     24 
     25 typedef struct {
     26   SPIN_LOCK                 MpContextSpinLock;   ///< Lock for writting MP context
     27   SPIN_LOCK                 DebugPortSpinLock;   ///< Lock for access debug port
     28   SPIN_LOCK                 MailboxSpinLock;     ///< Lock for accessing mail box
     29   UINT8                     CpuBreakMask[DEBUG_CPU_MAX_COUNT/8];        ///< Bitmask of all breaking CPUs
     30   UINT8                     CpuStopStatusMask[DEBUG_CPU_MAX_COUNT/8];   ///< Bitmask of CPU stop status
     31   UINT32                    ViewPointIndex;      ///< Current view point to be debugged
     32   UINT32                    BspIndex;            ///< Processor index value of BSP
     33   UINT32                    BreakAtCpuIndex;     ///< Processor index value of the current breaking CPU
     34   UINT32                    DebugTimerInitCount; ///< Record BSP's init timer count
     35   BOOLEAN                   IpiSentByAp;         ///< TRUR: IPI is sent by AP. TALSE: IPI is sent by BSP
     36   BOOLEAN                   RunCommandSet;       ///< TRUE: RUN commmand is executing. FALSE : RUN command has been executed.
     37 } DEBUG_MP_CONTEXT;
     38 
     39 extern DEBUG_MP_CONTEXT volatile   mDebugMpContext;
     40 extern DEBUG_CPU_DATA   volatile   mDebugCpuData;
     41 
     42 /**
     43   Break the other processor by send IPI.
     44 
     45   @param[in] CurrentProcessorIndex  Current processor index value.
     46 
     47 **/
     48 VOID
     49 HaltOtherProcessors (
     50   IN UINT32             CurrentProcessorIndex
     51   );
     52 
     53 /**
     54   Get the current processor's index.
     55 
     56   @return Processor index value.
     57 
     58 **/
     59 UINT32
     60 GetProcessorIndex (
     61   VOID
     62   );
     63 
     64 /**
     65   Acquire a spin lock when Multi-processor supported.
     66 
     67   It will block in the function if cannot get the access control.
     68   If Multi-processor is not supported, return directly.
     69 
     70   @param[in, out] MpSpinLock      A pointer to the spin lock.
     71 
     72 **/
     73 VOID
     74 AcquireMpSpinLock (
     75   IN OUT SPIN_LOCK           *MpSpinLock
     76   );
     77 
     78 /**
     79   Release a spin lock when Multi-processor supported.
     80 
     81   @param[in, out] MpSpinLock      A pointer to the spin lock.
     82 
     83 **/
     84 VOID
     85 ReleaseMpSpinLock (
     86   IN OUT SPIN_LOCK           *MpSpinLock
     87   );
     88 
     89 /**
     90   Check if the specified processor is BSP or not.
     91 
     92   @param[in] ProcessorIndex Processor index value.
     93 
     94   @retval TRUE    It is BSP.
     95   @retval FALSE   It isn't BSP.
     96 
     97 **/
     98 BOOLEAN
     99 IsBsp (
    100   IN UINT32             ProcessorIndex
    101   );
    102 
    103 /**
    104   Set processor stop flag bitmask in MP context.
    105 
    106   @param[in] ProcessorIndex Processor index value.
    107   @param[in] StopFlag       TRUE means set stop flag.
    108                             FALSE means clean break flag.
    109 
    110 **/
    111 VOID
    112 SetCpuStopFlagByIndex (
    113   IN UINT32             ProcessorIndex,
    114   IN BOOLEAN            StopFlag
    115   );
    116 
    117 /**
    118   Set processor break flag bitmask in MP context.
    119 
    120   @param[in] ProcessorIndex Processor index value.
    121   @param[in] BreakFlag      TRUE means set break flag.
    122                             FALSE means clean break flag.
    123 
    124 **/
    125 VOID
    126 SetCpuBreakFlagByIndex (
    127   IN UINT32             ProcessorIndex,
    128   IN BOOLEAN            BreakFlag
    129   );
    130 
    131 /**
    132   Check if processor is stopped already.
    133 
    134   @param[in] ProcessorIndex   Processor index value.
    135 
    136   @retval TRUE        Processor is stopped already.
    137   @retval FALSE       Processor isn't stopped.
    138 
    139 **/
    140 BOOLEAN
    141 IsCpuStopped (
    142   IN UINT32              ProcessorIndex
    143   );
    144 
    145 /**
    146   Set the run command flag.
    147 
    148   @param[in] RunningFlag   TRUE means run command flag is set.
    149                            FALSE means run command flag is cleared.
    150 
    151 **/
    152 VOID
    153 SetCpuRunningFlag (
    154   IN BOOLEAN            RunningFlag
    155   );
    156 
    157 /**
    158   Set the current view point to be debugged.
    159 
    160   @param[in] ProcessorIndex   Processor index value.
    161 
    162 **/
    163 VOID
    164 SetDebugViewPoint (
    165   IN UINT32             ProcessorIndex
    166   );
    167 
    168 /**
    169   Set the IPI send by BPS/AP flag.
    170 
    171   @param[in] IpiSentByApFlag   TRUE means this IPI is sent by AP.
    172                                FALSE means this IPI is sent by BSP.
    173 
    174 **/
    175 VOID
    176 SetIpiSentByApFlag (
    177   IN BOOLEAN            IpiSentByApFlag
    178   );
    179 
    180 /**
    181   Check the next pending breaking CPU.
    182 
    183   @retval others      There is at least one processor broken, the minimum
    184                       index number of Processor returned.
    185   @retval -1          No any processor broken.
    186 
    187 **/
    188 UINT32
    189 FindNextPendingBreakCpu (
    190   VOID
    191   );
    192 
    193 /**
    194   Check if all processors are in running status.
    195 
    196   @retval TRUE        All processors run.
    197   @retval FALSE       At least one processor does not run.
    198 
    199 **/
    200 BOOLEAN
    201 IsAllCpuRunning (
    202   VOID
    203   );
    204 
    205 /**
    206   Check if the current processor is the first breaking processor.
    207 
    208   If yes, halt other processors.
    209 
    210   @param[in] ProcessorIndex   Processor index value.
    211 
    212   @return TRUE       This processor is the first breaking processor.
    213   @return FALSE      This processor is not the first breaking processor.
    214 
    215 **/
    216 BOOLEAN
    217 IsFirstBreakProcessor (
    218   IN UINT32              ProcessorIndex
    219   );
    220 
    221 #endif
    222 
    223