3 Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR>
4 SPDX-License-Identifier: BSD-2-Clause-Patent
13 Check the Hook flag, and trigger exception if match.
15 @param VmPtr - EbcDebuggerCheckHookFlag
16 @param Flag - Feature flag
20 EbcDebuggerCheckHookFlag (
25 if ((mDebuggerPrivate
.FeatureFlags
& Flag
) == Flag
) {
26 mDebuggerPrivate
.StatusFlags
= Flag
;
27 EbcDebugSignalException (
28 EXCEPT_EBC_BREAKPOINT
,
38 It will record soruce address for Callstack entry.
40 @param SourceEntry - Source address
41 @param Type - Branch type
45 EbcDebuggerPushCallstackSource (
46 IN UINT64 SourceEntry
,
47 IN EFI_DEBUGGER_BRANCH_TYPE Type
50 if (mDebuggerPrivate
.CallStackEntryCount
> EFI_DEBUGGER_CALLSTACK_MAX
) {
52 mDebuggerPrivate
.CallStackEntryCount
= EFI_DEBUGGER_CALLSTACK_MAX
;
55 // Record the new callstack entry
57 mDebuggerPrivate
.CallStackEntry
[mDebuggerPrivate
.CallStackEntryCount
].SourceAddress
= SourceEntry
;
58 mDebuggerPrivate
.CallStackEntry
[mDebuggerPrivate
.CallStackEntryCount
].Type
= Type
;
61 // Do not change CallStackEntryCount
69 It will record parameter for Callstack entry.
71 @param ParameterAddress - The address for the parameter
72 @param Type - Branch type
76 EbcDebuggerPushCallstackParameter (
77 IN UINT64 ParameterAddress
,
78 IN EFI_DEBUGGER_BRANCH_TYPE Type
81 if (mDebuggerPrivate
.CallStackEntryCount
> EFI_DEBUGGER_CALLSTACK_MAX
) {
83 mDebuggerPrivate
.CallStackEntryCount
= EFI_DEBUGGER_CALLSTACK_MAX
;
86 // Record the new callstack parameter
88 mDebuggerPrivate
.CallStackEntry
[mDebuggerPrivate
.CallStackEntryCount
].ParameterAddr
= (UINTN
)ParameterAddress
;
90 mDebuggerPrivate
.CallStackEntry
[mDebuggerPrivate
.CallStackEntryCount
].Parameter
,
91 (VOID
*)(UINTN
)ParameterAddress
,
92 sizeof(mDebuggerPrivate
.CallStackEntry
[mDebuggerPrivate
.CallStackEntryCount
].Parameter
)
96 // Do not change CallStackEntryCount
104 It will record source address for callstack entry.
106 @param DestEntry - Source address
107 @param Type - Branch type
111 EbcDebuggerPushCallstackDest (
113 IN EFI_DEBUGGER_BRANCH_TYPE Type
118 if (mDebuggerPrivate
.CallStackEntryCount
< EFI_DEBUGGER_CALLSTACK_MAX
) {
120 // If there is empty entry for callstack, add it
122 ASSERT (mDebuggerPrivate
.CallStackEntry
[mDebuggerPrivate
.CallStackEntryCount
].Type
== Type
);
123 mDebuggerPrivate
.CallStackEntry
[mDebuggerPrivate
.CallStackEntryCount
].DestAddress
= DestEntry
;
124 mDebuggerPrivate
.CallStackEntryCount
++;
127 // If there is no empty entry for callstack, throw the oldest one
129 ASSERT (mDebuggerPrivate
.CallStackEntry
[EFI_DEBUGGER_TRACE_MAX
].Type
== Type
);
130 for (Index
= 0; Index
< EFI_DEBUGGER_CALLSTACK_MAX
; Index
++) {
131 CopyMem (&mDebuggerPrivate
.CallStackEntry
[Index
],
132 &mDebuggerPrivate
.CallStackEntry
[Index
+ 1],
133 sizeof (mDebuggerPrivate
.CallStackEntry
[Index
])
136 mDebuggerPrivate
.CallStackEntry
[EFI_DEBUGGER_CALLSTACK_MAX
- 1].DestAddress
= DestEntry
;
137 mDebuggerPrivate
.CallStackEntryCount
= EFI_DEBUGGER_CALLSTACK_MAX
;
145 It will throw the newest Callstack entry.
149 EbcDebuggerPopCallstack (
153 if ((mDebuggerPrivate
.CallStackEntryCount
> 0) &&
154 (mDebuggerPrivate
.CallStackEntryCount
<= EFI_DEBUGGER_CALLSTACK_MAX
)) {
156 // Throw the newest one
158 mDebuggerPrivate
.CallStackEntryCount
--;
159 mDebuggerPrivate
.CallStackEntry
[mDebuggerPrivate
.CallStackEntryCount
].SourceAddress
= 0;
160 mDebuggerPrivate
.CallStackEntry
[mDebuggerPrivate
.CallStackEntryCount
].DestAddress
= 0;
161 } else if (mDebuggerPrivate
.CallStackEntryCount
== 0) {
163 // NOT assert here because it is reasonable, because when we start to build
164 // callstack, we do not know how many function already called.
175 It will record source address for trace entry.
177 @param SourceEntry - Source address
178 @param Type - Branch type
182 EbcDebuggerPushTraceSourceEntry (
183 IN UINT64 SourceEntry
,
184 IN EFI_DEBUGGER_BRANCH_TYPE Type
187 if (mDebuggerPrivate
.TraceEntryCount
> EFI_DEBUGGER_TRACE_MAX
) {
189 mDebuggerPrivate
.TraceEntryCount
= EFI_DEBUGGER_TRACE_MAX
;
192 // Record the new trace entry
194 mDebuggerPrivate
.TraceEntry
[mDebuggerPrivate
.TraceEntryCount
].SourceAddress
= SourceEntry
;
195 mDebuggerPrivate
.TraceEntry
[mDebuggerPrivate
.TraceEntryCount
].Type
= Type
;
198 // Do not change TraceEntryCount
206 It will record destination address for trace entry.
208 @param DestEntry - Destination address
209 @param Type - Branch type
213 EbcDebuggerPushTraceDestEntry (
215 IN EFI_DEBUGGER_BRANCH_TYPE Type
220 if (mDebuggerPrivate
.TraceEntryCount
< EFI_DEBUGGER_TRACE_MAX
) {
222 // If there is empty entry for trace, add it
224 ASSERT (mDebuggerPrivate
.TraceEntry
[mDebuggerPrivate
.TraceEntryCount
].Type
== Type
);
225 mDebuggerPrivate
.TraceEntry
[mDebuggerPrivate
.TraceEntryCount
].DestAddress
= DestEntry
;
226 mDebuggerPrivate
.TraceEntryCount
++;
229 // If there is no empty entry for trace, throw the oldest one
231 ASSERT (mDebuggerPrivate
.TraceEntry
[EFI_DEBUGGER_TRACE_MAX
].Type
== Type
);
232 for (Index
= 0; Index
< EFI_DEBUGGER_TRACE_MAX
; Index
++) {
233 mDebuggerPrivate
.TraceEntry
[Index
] = mDebuggerPrivate
.TraceEntry
[Index
+ 1];
235 mDebuggerPrivate
.TraceEntry
[EFI_DEBUGGER_CALLSTACK_MAX
- 1].DestAddress
= DestEntry
;
236 mDebuggerPrivate
.TraceEntryCount
= EFI_DEBUGGER_TRACE_MAX
;
244 It will record address for StepEntry, if STEPOVER or STEPOUT is enabled.
246 @param Entry - Break Address
247 @param FramePtr - Break Frame pointer
248 @param Flag - for STEPOVER or STEPOUT
252 EbcDebuggerPushStepEntry (
261 if ((Flag
== EFI_DEBUG_FLAG_EBC_STEPOVER
) &&
262 ((mDebuggerPrivate
.FeatureFlags
& EFI_DEBUG_FLAG_EBC_STEPOVER
) == EFI_DEBUG_FLAG_EBC_STEPOVER
)) {
263 mDebuggerPrivate
.StepContext
.BreakAddress
= Entry
;
264 mDebuggerPrivate
.StepContext
.FramePointer
= FramePtr
;
265 mDebuggerPrivate
.FeatureFlags
&= ~EFI_DEBUG_FLAG_EBC_B_STEPOVER
;
270 if ((Flag
== EFI_DEBUG_FLAG_EBC_STEPOUT
) &&
271 ((mDebuggerPrivate
.FeatureFlags
& EFI_DEBUG_FLAG_EBC_STEPOUT
) == EFI_DEBUG_FLAG_EBC_STEPOUT
)) {
272 mDebuggerPrivate
.StepContext
.BreakAddress
= Entry
;
273 mDebuggerPrivate
.StepContext
.FramePointer
= FramePtr
;
274 mDebuggerPrivate
.FeatureFlags
&= ~EFI_DEBUG_FLAG_EBC_B_STEPOUT
;
280 Notify the callback function when an event is triggered.
282 @param Event Indicates the event that invoke this function.
283 @param Context Indicates the calling context.
288 EbcDebuggerBreakEventFunc (
295 if ((mDebuggerPrivate
.FeatureFlags
& EFI_DEBUG_FLAG_EBC_BOK
) != EFI_DEBUG_FLAG_EBC_BOK
) {
299 Status
= gBS
->CheckEvent (gST
->ConIn
->WaitForKey
);
300 if (Status
== EFI_SUCCESS
) {
301 mDebuggerPrivate
.StatusFlags
= EFI_DEBUG_FLAG_EBC_BOK
;
307 The hook in InitializeEbcDriver.
308 It will init the EbcDebuggerPrivate data structure.
310 @param Handle - The EbcDebugProtocol handle.
311 @param EbcDebugProtocol - The EbcDebugProtocol interface.
315 EbcDebuggerHookInit (
316 IN EFI_HANDLE Handle
,
317 IN EFI_DEBUG_SUPPORT_PROTOCOL
*EbcDebugProtocol
322 EFI_DEBUGGER_SYMBOL_OBJECT
*Object
;
323 EFI_DEBUGGER_SYMBOL_ENTRY
*Entry
;
327 // Register all exception handler
329 for (Index
= EXCEPT_EBC_UNDEFINED
; Index
<= EXCEPT_EBC_STEP
; Index
++) {
330 EbcDebugProtocol
->RegisterExceptionCallback (
336 EbcDebugProtocol
->RegisterExceptionCallback (
347 Object
= AllocateZeroPool (sizeof(EFI_DEBUGGER_SYMBOL_OBJECT
) * EFI_DEBUGGER_SYMBOL_OBJECT_MAX
);
348 ASSERT (Object
!= NULL
);
349 mDebuggerPrivate
.DebuggerSymbolContext
.Object
= Object
;
350 mDebuggerPrivate
.DebuggerSymbolContext
.ObjectCount
= 0;
351 mDebuggerPrivate
.DebuggerSymbolContext
.MaxObjectCount
= EFI_DEBUGGER_SYMBOL_OBJECT_MAX
;
352 for (Index
= 0; Index
< EFI_DEBUGGER_SYMBOL_OBJECT_MAX
; Index
++) {
353 Entry
= AllocateZeroPool (sizeof(EFI_DEBUGGER_SYMBOL_ENTRY
) * EFI_DEBUGGER_SYMBOL_ENTRY_MAX
);
354 ASSERT (Entry
!= NULL
);
355 Object
[Index
].Entry
= Entry
;
356 Object
[Index
].MaxEntryCount
= EFI_DEBUGGER_SYMBOL_ENTRY_MAX
;
357 Object
[Index
].SourceBuffer
= AllocateZeroPool (sizeof(VOID
*) * (EFI_DEBUGGER_SYMBOL_ENTRY_MAX
+ 1));
358 ASSERT (Object
[Index
].SourceBuffer
!= NULL
);
362 // locate PciRootBridgeIo
364 Status
= gBS
->LocateProtocol (
365 &gEfiPciRootBridgeIoProtocolGuid
,
367 (VOID
**) &mDebuggerPrivate
.PciRootBridgeIo
371 // locate DebugImageInfoTable
373 Status
= EfiGetSystemConfigurationTable (
374 &gEfiDebugImageInfoTableGuid
,
375 (VOID
**) &mDebuggerPrivate
.DebugImageInfoTableHeader
379 // Register Debugger Configuration Protocol, for config in shell
381 Status
= gBS
->InstallProtocolInterface (
383 &gEfiDebuggerConfigurationProtocolGuid
,
384 EFI_NATIVE_INTERFACE
,
385 &mDebuggerPrivate
.DebuggerConfiguration
390 // Create break event
392 Status
= gBS
->CreateEvent (
393 EVT_TIMER
| EVT_NOTIFY_SIGNAL
,
395 EbcDebuggerBreakEventFunc
,
397 &mDebuggerPrivate
.BreakEvent
399 if (!EFI_ERROR (Status
)) {
400 Status
= gBS
->SetTimer (
401 mDebuggerPrivate
.BreakEvent
,
403 EFI_DEBUG_BREAK_TIMER_INTERVAL
412 The hook in UnloadImage for EBC Interpreter.
413 It clean up the environment.
417 EbcDebuggerHookUnload (
423 EFI_DEBUGGER_SYMBOL_OBJECT
*Object
;
426 // Close the break event
428 if (mDebuggerPrivate
.BreakEvent
!= NULL
) {
429 gBS
->CloseEvent (mDebuggerPrivate
.BreakEvent
);
433 // Clean up the symbol
435 Object
= mDebuggerPrivate
.DebuggerSymbolContext
.Object
;
436 for (Index
= 0; Index
< EFI_DEBUGGER_SYMBOL_OBJECT_MAX
; Index
++) {
440 gBS
->FreePool (Object
[Index
].Entry
);
441 Object
[Index
].Entry
= NULL
;
442 Object
[Index
].EntryCount
= 0;
444 // Clean up source buffer
446 for (SubIndex
= 0; Object
[Index
].SourceBuffer
[SubIndex
] != NULL
; SubIndex
++) {
447 gBS
->FreePool (Object
[Index
].SourceBuffer
[SubIndex
]);
448 Object
[Index
].SourceBuffer
[SubIndex
] = NULL
;
450 gBS
->FreePool (Object
[Index
].SourceBuffer
);
451 Object
[Index
].SourceBuffer
= NULL
;
457 gBS
->FreePool (Object
);
458 mDebuggerPrivate
.DebuggerSymbolContext
.Object
= NULL
;
459 mDebuggerPrivate
.DebuggerSymbolContext
.ObjectCount
= 0;
469 The hook in EbcUnloadImage.
470 Currently do nothing here.
472 @param Handle - The EbcImage handle.
476 EbcDebuggerHookEbcUnloadImage (
485 The hook in ExecuteEbcImageEntryPoint.
486 It will record the call-stack entry. (-1 means EbcImageEntryPoint call)
487 and trigger Exception if BOE enabled.
490 @param VmPtr - pointer to VM context.
494 EbcDebuggerHookExecuteEbcImageEntryPoint (
498 EbcDebuggerPushCallstackSource ((UINT64
)(UINTN
)-1, EfiDebuggerBranchTypeEbcCall
);
499 EbcDebuggerPushCallstackParameter ((UINT64
)(UINTN
)VmPtr
->Gpr
[0], EfiDebuggerBranchTypeEbcCall
);
500 EbcDebuggerPushCallstackDest ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcCall
);
501 EbcDebuggerCheckHookFlag (VmPtr
, EFI_DEBUG_FLAG_EBC_BOE
);
507 The hook in ExecuteEbcImageEntryPoint.
508 It will record the call-stack entry. (-2 means EbcInterpret call)
509 and trigger Exception if BOT enabled.
511 @param VmPtr - pointer to VM context.
515 EbcDebuggerHookEbcInterpret (
519 EbcDebuggerPushCallstackSource ((UINT64
)(UINTN
)-2, EfiDebuggerBranchTypeEbcCall
);
520 EbcDebuggerPushCallstackParameter ((UINT64
)(UINTN
)VmPtr
->Gpr
[0], EfiDebuggerBranchTypeEbcCall
);
521 EbcDebuggerPushCallstackDest ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcCall
);
522 EbcDebuggerCheckHookFlag (VmPtr
, EFI_DEBUG_FLAG_EBC_BOT
);
528 The hook in EbcExecute, before ExecuteFunction.
529 It will trigger Exception if GoTil, StepOver, or StepOut hit.
531 @param VmPtr - pointer to VM context.
535 EbcDebuggerHookExecuteStart (
542 // Check Ip for GoTil
544 if (mDebuggerPrivate
.GoTilContext
.BreakAddress
== (UINT64
)(UINTN
)VmPtr
->Ip
) {
545 mDebuggerPrivate
.StatusFlags
= EFI_DEBUG_FLAG_EBC_GT
;
546 mDebuggerPrivate
.GoTilContext
.BreakAddress
= 0;
547 EbcDebugSignalException (
548 EXCEPT_EBC_BREAKPOINT
,
552 mDebuggerPrivate
.StatusFlags
&= ~EFI_DEBUG_FLAG_EBC_B_GT
;
556 // Check ReturnAddress for StepOver
558 if ((mDebuggerPrivate
.StepContext
.BreakAddress
== (UINT64
)(UINTN
)VmPtr
->Ip
) &&
559 (mDebuggerPrivate
.StepContext
.FramePointer
== (UINT64
)(UINTN
)VmPtr
->FramePtr
)) {
560 mDebuggerPrivate
.StatusFlags
= EFI_DEBUG_FLAG_EBC_STEPOVER
;
561 mDebuggerPrivate
.StepContext
.BreakAddress
= 0;
562 mDebuggerPrivate
.StepContext
.FramePointer
= 0;
563 EbcDebugSignalException (
564 EXCEPT_EBC_BREAKPOINT
,
568 mDebuggerPrivate
.StatusFlags
&= ~EFI_DEBUG_FLAG_EBC_B_STEPOVER
;
571 // Check FramePtr for StepOut
573 if (mDebuggerPrivate
.StepContext
.BreakAddress
== (UINT64
)(UINTN
)VmPtr
->FramePtr
) {
574 mDebuggerPrivate
.StatusFlags
= EFI_DEBUG_FLAG_EBC_STEPOUT
;
575 mDebuggerPrivate
.StepContext
.BreakAddress
= 0;
576 mDebuggerPrivate
.StepContext
.FramePointer
= 0;
577 EbcDebugSignalException (
578 EXCEPT_EBC_BREAKPOINT
,
582 mDebuggerPrivate
.StatusFlags
&= ~EFI_DEBUG_FLAG_EBC_B_STEPOUT
;
585 // Check Flags for BreakOnKey
587 if (mDebuggerPrivate
.StatusFlags
== EFI_DEBUG_FLAG_EBC_BOK
) {
589 // Only break when the current TPL <= TPL_APPLICATION
591 CurrentTpl
= gBS
->RaiseTPL (TPL_HIGH_LEVEL
);
592 gBS
->RestoreTPL (CurrentTpl
);
593 if (CurrentTpl
<= TPL_APPLICATION
) {
594 EbcDebugSignalException (
595 EXCEPT_EBC_BREAKPOINT
,
599 mDebuggerPrivate
.StatusFlags
&= ~EFI_DEBUG_FLAG_EBC_B_BOK
;
607 The hook in EbcExecute, after ExecuteFunction.
608 It will record StepOut Entry if need.
610 @param VmPtr - pointer to VM context.
614 EbcDebuggerHookExecuteEnd (
621 // Use FramePtr as checkpoint for StepOut
623 CopyMem (&Address
, (VOID
*)((UINTN
)VmPtr
->FramePtr
), sizeof(Address
));
624 EbcDebuggerPushStepEntry (Address
, (UINT64
)(UINTN
)VmPtr
->FramePtr
, EFI_DEBUG_FLAG_EBC_STEPOUT
);
631 The hook in ExecuteCALL, before move IP.
632 It will trigger Exception if BOC enabled,
633 and record Callstack, and trace information.
635 @param VmPtr - pointer to VM context.
639 EbcDebuggerHookCALLStart (
643 EbcDebuggerCheckHookFlag (VmPtr
, EFI_DEBUG_FLAG_EBC_BOC
);
644 EbcDebuggerPushCallstackSource ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcCall
);
645 EbcDebuggerPushCallstackParameter ((UINT64
)(UINTN
)VmPtr
->Gpr
[0], EfiDebuggerBranchTypeEbcCall
);
646 EbcDebuggerPushTraceSourceEntry ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcCall
);
652 The hook in ExecuteCALL, after move IP.
653 It will record Callstack, trace information
654 and record StepOver/StepOut Entry if need.
656 @param VmPtr - pointer to VM context.
660 EbcDebuggerHookCALLEnd (
667 EbcDebuggerPushCallstackDest ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcCall
);
668 EbcDebuggerPushTraceDestEntry ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcCall
);
673 CopyMem (&FramePtr
, (VOID
*)((UINTN
)VmPtr
->FramePtr
), sizeof(FramePtr
));
676 // Use ReturnAddress as checkpoint for StepOver
678 CopyMem (&Address
, (VOID
*)(UINTN
)VmPtr
->Gpr
[0], sizeof(Address
));
679 EbcDebuggerPushStepEntry (Address
, FramePtr
, EFI_DEBUG_FLAG_EBC_STEPOVER
);
682 // Use FramePtr as checkpoint for StepOut
685 CopyMem (&Address
, (VOID
*)(FramePtr
), sizeof(UINTN
));
686 EbcDebuggerPushStepEntry (Address
, FramePtr
, EFI_DEBUG_FLAG_EBC_STEPOUT
);
693 The hook in ExecuteCALL, before call EbcLLCALLEX.
694 It will trigger Exception if BOCX enabled,
695 and record Callstack information.
697 @param VmPtr - pointer to VM context.
701 EbcDebuggerHookCALLEXStart (
705 EbcDebuggerCheckHookFlag (VmPtr
, EFI_DEBUG_FLAG_EBC_BOCX
);
706 // EbcDebuggerPushCallstackSource ((UINT64)(UINTN)VmPtr->Ip, EfiDebuggerBranchTypeEbcCallEx);
707 // EbcDebuggerPushCallstackParameter ((UINT64)(UINTN)VmPtr->R[0], EfiDebuggerBranchTypeEbcCallEx);
708 EbcDebuggerPushTraceSourceEntry ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcCallEx
);
714 The hook in ExecuteCALL, after call EbcLLCALLEX.
715 It will record trace information.
717 @param VmPtr - pointer to VM context.
721 EbcDebuggerHookCALLEXEnd (
725 // EbcDebuggerPushCallstackDest ((UINT64)(UINTN)VmPtr->Ip, EfiDebuggerBranchTypeEbcCallEx);
726 EbcDebuggerPushTraceDestEntry ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcCallEx
);
732 The hook in ExecuteRET, before move IP.
733 It will trigger Exception if BOR enabled,
734 and record Callstack, and trace information.
736 @param VmPtr - pointer to VM context.
740 EbcDebuggerHookRETStart (
744 EbcDebuggerCheckHookFlag (VmPtr
, EFI_DEBUG_FLAG_EBC_BOR
);
745 EbcDebuggerPopCallstack ();
746 EbcDebuggerPushTraceSourceEntry ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcRet
);
752 The hook in ExecuteRET, after move IP.
753 It will record trace information.
755 @param VmPtr - pointer to VM context.
759 EbcDebuggerHookRETEnd (
763 EbcDebuggerPushTraceDestEntry ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcRet
);
769 The hook in ExecuteJMP, before move IP.
770 It will record trace information.
772 @param VmPtr - pointer to VM context.
776 EbcDebuggerHookJMPStart (
780 EbcDebuggerPushTraceSourceEntry ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcJmp
);
786 The hook in ExecuteJMP, after move IP.
787 It will record trace information.
789 @param VmPtr - pointer to VM context.
793 EbcDebuggerHookJMPEnd (
797 EbcDebuggerPushTraceDestEntry ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcJmp
);
803 The hook in ExecuteJMP8, before move IP.
804 It will record trace information.
806 @param VmPtr - pointer to VM context.
810 EbcDebuggerHookJMP8Start (
814 EbcDebuggerPushTraceSourceEntry ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcJmp8
);
820 The hook in ExecuteJMP8, after move IP.
821 It will record trace information.
823 @param VmPtr - pointer to VM context.
827 EbcDebuggerHookJMP8End (
831 EbcDebuggerPushTraceDestEntry ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcJmp8
);