3 Copyright (c) 2007, Intel Corporation. All rights reserved.<BR>
4 SPDX-License-Identifier: BSD-2-Clause-Patent
11 CHAR16
*mBranchTypeStr
[] = {
21 Comvert Branch Type to string.
23 @param Type Branch Type
25 @retval String string of Branch Type.
30 IN EFI_DEBUGGER_BRANCH_TYPE Type
33 if ((Type
< 0) || (Type
>= EfiDebuggerBranchTypeEbcMax
)) {
34 return L
"(Unknown Type)";
37 return mBranchTypeStr
[Type
];
42 DebuggerCommand - CallStack.
44 @param CommandArg The argument for this command
45 @param DebuggerPrivate EBC Debugger private data structure
46 @param ExceptionType Exception type.
47 @param SystemContext EBC system context.
49 @retval EFI_DEBUG_CONTINUE formal return value
54 IN CHAR16
*CommandArg
,
55 IN EFI_DEBUGGER_PRIVATE_DATA
*DebuggerPrivate
,
56 IN EFI_EXCEPTION_TYPE ExceptionType
,
57 IN OUT EFI_SYSTEM_CONTEXT SystemContext
63 EFI_DEBUGGER_CALLSTACK_CONTEXT
*CallStackEntry
;
64 BOOLEAN ShowParameter
;
65 UINTN ParameterNumber
;
67 ShowParameter
= FALSE
;
68 ParameterNumber
= EFI_DEBUGGER_CALL_DEFAULT_PARAMETER
;
73 if (CommandArg
!= NULL
) {
74 if (StriCmp (CommandArg
, L
"c") == 0) {
78 DebuggerPrivate
->CallStackEntryCount
= 0;
79 ZeroMem (DebuggerPrivate
->CallStackEntry
, sizeof (DebuggerPrivate
->CallStackEntry
));
80 EDBPrint (L
"Call-Stack is cleared\n");
81 return EFI_DEBUG_CONTINUE
;
82 } else if (StriCmp (CommandArg
, L
"p") == 0) {
84 // Print Call-Stack with parameter
87 CommandArg
= StrGetNextTokenLine (L
" ");
88 if (CommandArg
!= NULL
) {
90 // Try to get the parameter number
92 ParameterNumber
= Atoi (CommandArg
);
93 if (ParameterNumber
> 16) {
94 EDBPrint (L
"Call-Stack argument Invalid\n");
95 return EFI_DEBUG_CONTINUE
;
99 EDBPrint (L
"Call-Stack argument Invalid\n");
100 return EFI_DEBUG_CONTINUE
;
105 // Check CallStack Entry Count
107 if (DebuggerPrivate
->CallStackEntryCount
== 0) {
108 EDBPrint (L
"No Call-Stack\n");
109 return EFI_DEBUG_CONTINUE
;
110 } else if (DebuggerPrivate
->CallStackEntryCount
> EFI_DEBUGGER_CALLSTACK_MAX
) {
111 EDBPrint (L
"Call-Stack Crash, re-initialize!\n");
112 DebuggerPrivate
->CallStackEntryCount
= 0;
113 return EFI_DEBUG_CONTINUE
;
117 // Go through each CallStack entry and print
119 EDBPrint (L
"Call-Stack (TOP):\n");
120 EDBPrint (L
" Caller Callee Name\n");
121 EDBPrint (L
" ================== ================== ========\n");
122 // EDBPrint (L" 0x00000000FFFFFFFF 0xFFFFFFFF00000000 EfiMain\n");
123 for (Index
= (INTN
)(DebuggerPrivate
->CallStackEntryCount
- 1); Index
>= 0; Index
--) {
125 // Get CallStack and print
127 CallStackEntry
= &DebuggerPrivate
->CallStackEntry
[Index
];
129 L
" 0x%016lx 0x%016lx",
130 CallStackEntry
->SourceAddress
,
131 CallStackEntry
->DestAddress
133 FuncName
= FindSymbolStr ((UINTN
)CallStackEntry
->DestAddress
);
134 if (FuncName
!= NULL
) {
135 EDBPrint (L
" %a()", FuncName
);
144 if (sizeof (UINTN
) == sizeof (UINT64
)) {
146 L
" Parameter Address (0x%016lx) (\n",
147 CallStackEntry
->ParameterAddr
149 if (ParameterNumber
== 0) {
155 // Print each parameter
157 for (SubIndex
= 0; SubIndex
< ParameterNumber
- 1; SubIndex
++) {
158 if (SubIndex
% 2 == 0) {
164 CallStackEntry
->Parameter
[SubIndex
]
166 if (SubIndex
% 2 == 1) {
171 if (SubIndex
% 2 == 0) {
177 CallStackEntry
->Parameter
[SubIndex
]
181 // break only for parameter
183 if ((((DebuggerPrivate
->CallStackEntryCount
- Index
) % (16 / ParameterNumber
)) == 0) &&
186 if (SetPageBreak ()) {
192 L
" Parameter Address (0x%08x) (\n",
193 CallStackEntry
->ParameterAddr
195 if (ParameterNumber
== 0) {
201 // Print each parameter
203 for (SubIndex
= 0; SubIndex
< ParameterNumber
- 1; SubIndex
++) {
204 if (SubIndex
% 4 == 0) {
210 CallStackEntry
->Parameter
[SubIndex
]
212 if (SubIndex
% 4 == 3) {
217 if (SubIndex
% 4 == 0) {
223 CallStackEntry
->Parameter
[SubIndex
]
227 // break only for parameter
229 if ((((DebuggerPrivate
->CallStackEntryCount
- Index
) % (32 / ParameterNumber
)) == 0) &&
232 if (SetPageBreak ()) {
243 return EFI_DEBUG_CONTINUE
;
248 DebuggerCommand - InstructionBranch.
250 @param CommandArg The argument for this command
251 @param DebuggerPrivate EBC Debugger private data structure
252 @param ExceptionType Exception type.
253 @param SystemContext EBC system context.
255 @retval EFI_DEBUG_CONTINUE formal return value
259 DebuggerInstructionBranch (
260 IN CHAR16
*CommandArg
,
261 IN EFI_DEBUGGER_PRIVATE_DATA
*DebuggerPrivate
,
262 IN EFI_EXCEPTION_TYPE ExceptionType
,
263 IN OUT EFI_SYSTEM_CONTEXT SystemContext
271 if (CommandArg
!= NULL
) {
272 if (StriCmp (CommandArg
, L
"c") == 0) {
276 DebuggerPrivate
->TraceEntryCount
= 0;
277 ZeroMem (DebuggerPrivate
->TraceEntry
, sizeof (DebuggerPrivate
->TraceEntry
));
278 EDBPrint (L
"Instruction Trace is cleared\n");
280 EDBPrint (L
"Trace argument Invalid\n");
283 return EFI_DEBUG_CONTINUE
;
287 // Check Trace Entry Count
289 if (DebuggerPrivate
->TraceEntryCount
== 0) {
290 EDBPrint (L
"No Instruction Trace\n");
291 return EFI_DEBUG_CONTINUE
;
292 } else if (DebuggerPrivate
->TraceEntryCount
> EFI_DEBUGGER_TRACE_MAX
) {
293 EDBPrint (L
"Instruction Trace Crash, re-initialize!\n");
294 DebuggerPrivate
->TraceEntryCount
= 0;
295 return EFI_DEBUG_CONTINUE
;
299 // Go through each Trace entry and print
301 EDBPrint (L
"Instruction Trace (->Latest):\n");
302 EDBPrint (L
" Source Addr Destination Addr Type\n");
303 EDBPrint (L
" ================== ================== ========\n");
304 // EDBPrint (L" 0x00000000FFFFFFFF 0xFFFFFFFF00000000 (CALLEX)\n");
305 for (Index
= 0; Index
< DebuggerPrivate
->TraceEntryCount
; Index
++) {
307 L
" 0x%016lx 0x%016lx %s\n",
308 DebuggerPrivate
->TraceEntry
[Index
].SourceAddress
,
309 DebuggerPrivate
->TraceEntry
[Index
].DestAddress
,
310 EdbBranchTypeToStr (DebuggerPrivate
->TraceEntry
[Index
].Type
)
317 return EFI_DEBUG_CONTINUE
;