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