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
20typedef 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
25typedef 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
39extern DEBUG_MP_CONTEXT volatile   mDebugMpContext;
40extern 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**/
48VOID
49HaltOtherProcessors (
50  IN UINT32             CurrentProcessorIndex
51  );
52
53/**
54  Get the current processor's index.
55
56  @return Processor index value.
57
58**/
59UINT32
60GetProcessorIndex (
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**/
73VOID
74AcquireMpSpinLock (
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**/
84VOID
85ReleaseMpSpinLock (
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**/
98BOOLEAN
99IsBsp (
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**/
111VOID
112SetCpuStopFlagByIndex (
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**/
125VOID
126SetCpuBreakFlagByIndex (
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**/
140BOOLEAN
141IsCpuStopped (
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**/
152VOID
153SetCpuRunningFlag (
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**/
163VOID
164SetDebugViewPoint (
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**/
175VOID
176SetIpiSentByApFlag (
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**/
188UINT32
189FindNextPendingBreakCpu (
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**/
200BOOLEAN
201IsAllCpuRunning (
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**/
216BOOLEAN
217IsFirstBreakProcessor (
218  IN UINT32              ProcessorIndex
219  );
220
221#endif
222
223