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
);
143 if (sizeof(UINTN
) == sizeof(UINT64
)) {
145 L
" Parameter Address (0x%016lx) (\n",
146 CallStackEntry
->ParameterAddr
148 if (ParameterNumber
== 0) {
153 // Print each parameter
155 for (SubIndex
= 0; SubIndex
< ParameterNumber
- 1; SubIndex
++) {
156 if (SubIndex
% 2 == 0) {
161 CallStackEntry
->Parameter
[SubIndex
]
163 if (SubIndex
% 2 == 1) {
167 if (SubIndex
% 2 == 0) {
172 CallStackEntry
->Parameter
[SubIndex
]
176 // break only for parameter
178 if ((((DebuggerPrivate
->CallStackEntryCount
- Index
) % (16 / ParameterNumber
)) == 0) &&
180 if (SetPageBreak ()) {
186 L
" Parameter Address (0x%08x) (\n",
187 CallStackEntry
->ParameterAddr
189 if (ParameterNumber
== 0) {
194 // Print each parameter
196 for (SubIndex
= 0; SubIndex
< ParameterNumber
- 1; SubIndex
++) {
197 if (SubIndex
% 4 == 0) {
202 CallStackEntry
->Parameter
[SubIndex
]
204 if (SubIndex
% 4 == 3) {
208 if (SubIndex
% 4 == 0) {
213 CallStackEntry
->Parameter
[SubIndex
]
217 // break only for parameter
219 if ((((DebuggerPrivate
->CallStackEntryCount
- Index
) % (32 / ParameterNumber
)) == 0) &&
221 if (SetPageBreak ()) {
232 return EFI_DEBUG_CONTINUE
;
237 DebuggerCommand - InstructionBranch.
239 @param CommandArg The argument for this command
240 @param DebuggerPrivate EBC Debugger private data structure
241 @param ExceptionType Exception type.
242 @param SystemContext EBC system context.
244 @retval EFI_DEBUG_CONTINUE formal return value
248 DebuggerInstructionBranch (
249 IN CHAR16
*CommandArg
,
250 IN EFI_DEBUGGER_PRIVATE_DATA
*DebuggerPrivate
,
251 IN EFI_EXCEPTION_TYPE ExceptionType
,
252 IN OUT EFI_SYSTEM_CONTEXT SystemContext
260 if (CommandArg
!= NULL
) {
261 if (StriCmp (CommandArg
, L
"c") == 0) {
265 DebuggerPrivate
->TraceEntryCount
= 0;
266 ZeroMem (DebuggerPrivate
->TraceEntry
, sizeof(DebuggerPrivate
->TraceEntry
));
267 EDBPrint (L
"Instruction Trace is cleared\n");
269 EDBPrint (L
"Trace argument Invalid\n");
271 return EFI_DEBUG_CONTINUE
;
275 // Check Trace Entry Count
277 if (DebuggerPrivate
->TraceEntryCount
== 0) {
278 EDBPrint (L
"No Instruction Trace\n");
279 return EFI_DEBUG_CONTINUE
;
280 } else if (DebuggerPrivate
->TraceEntryCount
> EFI_DEBUGGER_TRACE_MAX
) {
281 EDBPrint (L
"Instruction Trace Crash, re-initialize!\n");
282 DebuggerPrivate
->TraceEntryCount
= 0;
283 return EFI_DEBUG_CONTINUE
;
287 // Go through each Trace entry and print
289 EDBPrint (L
"Instruction Trace (->Latest):\n");
290 EDBPrint (L
" Source Addr Destination Addr Type\n");
291 EDBPrint (L
" ================== ================== ========\n");
292 //EDBPrint (L" 0x00000000FFFFFFFF 0xFFFFFFFF00000000 (CALLEX)\n");
293 for (Index
= 0; Index
< DebuggerPrivate
->TraceEntryCount
; Index
++) {
295 L
" 0x%016lx 0x%016lx %s\n",
296 DebuggerPrivate
->TraceEntry
[Index
].SourceAddress
,
297 DebuggerPrivate
->TraceEntry
[Index
].DestAddress
,
298 EdbBranchTypeToStr (DebuggerPrivate
->TraceEntry
[Index
].Type
)
305 return EFI_DEBUG_CONTINUE
;