3 Copyright (c) 2007, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
24 // Hook support function
27 EbcDebuggerCheckHookFlag (
35 Check the Hook flag, and trigger exception if match.
39 VmPtr - EbcDebuggerCheckHookFlag
47 if ((mDebuggerPrivate
.FeatureFlags
& Flag
) == Flag
) {
48 mDebuggerPrivate
.StatusFlags
= Flag
;
49 EbcDebugSignalException (
50 EXCEPT_EBC_BREAKPOINT
,
59 EbcDebuggerPushCallstackSource (
60 IN UINT64 SourceEntry
,
61 IN EFI_DEBUGGER_BRANCH_TYPE Type
67 It will record soruce address for Callstack entry.
71 SourceEntry - Source address
79 if (mDebuggerPrivate
.CallStackEntryCount
> EFI_DEBUGGER_CALLSTACK_MAX
) {
81 mDebuggerPrivate
.CallStackEntryCount
= EFI_DEBUGGER_CALLSTACK_MAX
;
84 // Record the new callstack entry
86 mDebuggerPrivate
.CallStackEntry
[mDebuggerPrivate
.CallStackEntryCount
].SourceAddress
= SourceEntry
;
87 mDebuggerPrivate
.CallStackEntry
[mDebuggerPrivate
.CallStackEntryCount
].Type
= Type
;
90 // Do not change CallStackEntryCount
97 EbcDebuggerPushCallstackParameter (
98 IN UINT64 ParameterAddress
,
99 IN EFI_DEBUGGER_BRANCH_TYPE Type
105 It will record parameter for Callstack entry.
109 ParameterAddress - The address for the parameter
117 if (mDebuggerPrivate
.CallStackEntryCount
> EFI_DEBUGGER_CALLSTACK_MAX
) {
119 mDebuggerPrivate
.CallStackEntryCount
= EFI_DEBUGGER_CALLSTACK_MAX
;
122 // Record the new callstack parameter
124 mDebuggerPrivate
.CallStackEntry
[mDebuggerPrivate
.CallStackEntryCount
].ParameterAddr
= (UINTN
)ParameterAddress
;
126 mDebuggerPrivate
.CallStackEntry
[mDebuggerPrivate
.CallStackEntryCount
].Parameter
,
127 (VOID
*)(UINTN
)ParameterAddress
,
128 sizeof(mDebuggerPrivate
.CallStackEntry
[mDebuggerPrivate
.CallStackEntryCount
].Parameter
)
132 // Do not change CallStackEntryCount
139 EbcDebuggerPushCallstackDest (
141 IN EFI_DEBUGGER_BRANCH_TYPE Type
147 It will record source address for callstack entry.
151 DestEntry - Source address
161 if (mDebuggerPrivate
.CallStackEntryCount
< EFI_DEBUGGER_CALLSTACK_MAX
) {
163 // If there is empty entry for callstack, add it
165 ASSERT (mDebuggerPrivate
.CallStackEntry
[mDebuggerPrivate
.CallStackEntryCount
].Type
== Type
);
166 mDebuggerPrivate
.CallStackEntry
[mDebuggerPrivate
.CallStackEntryCount
].DestAddress
= DestEntry
;
167 mDebuggerPrivate
.CallStackEntryCount
++;
170 // If there is no empty entry for callstack, throw the oldest one
172 ASSERT (mDebuggerPrivate
.CallStackEntry
[EFI_DEBUGGER_TRACE_MAX
].Type
== Type
);
173 for (Index
= 0; Index
< EFI_DEBUGGER_CALLSTACK_MAX
; Index
++) {
174 mDebuggerPrivate
.CallStackEntry
[Index
] = mDebuggerPrivate
.CallStackEntry
[Index
+ 1];
176 mDebuggerPrivate
.CallStackEntry
[EFI_DEBUGGER_CALLSTACK_MAX
- 1].DestAddress
= DestEntry
;
177 mDebuggerPrivate
.CallStackEntryCount
= EFI_DEBUGGER_CALLSTACK_MAX
;
184 EbcDebuggerPopCallstack (
191 It will throw the newest Callstack entry.
202 if ((mDebuggerPrivate
.CallStackEntryCount
> 0) &&
203 (mDebuggerPrivate
.CallStackEntryCount
<= EFI_DEBUGGER_CALLSTACK_MAX
)) {
205 // Throw the newest one
207 mDebuggerPrivate
.CallStackEntryCount
--;
208 mDebuggerPrivate
.CallStackEntry
[mDebuggerPrivate
.CallStackEntryCount
].SourceAddress
= 0;
209 mDebuggerPrivate
.CallStackEntry
[mDebuggerPrivate
.CallStackEntryCount
].DestAddress
= 0;
210 } else if (mDebuggerPrivate
.CallStackEntryCount
== 0) {
212 // NOT assert here because it is reasonable, because when we start to build
213 // callstack, we do not know how many function already called.
223 EbcDebuggerPushTraceSourceEntry (
224 IN UINT64 SourceEntry
,
225 IN EFI_DEBUGGER_BRANCH_TYPE Type
231 It will record source address for trace entry.
235 SourceEntry - Source address
243 if (mDebuggerPrivate
.TraceEntryCount
> EFI_DEBUGGER_TRACE_MAX
) {
245 mDebuggerPrivate
.TraceEntryCount
= EFI_DEBUGGER_TRACE_MAX
;
248 // Record the new trace entry
250 mDebuggerPrivate
.TraceEntry
[mDebuggerPrivate
.TraceEntryCount
].SourceAddress
= SourceEntry
;
251 mDebuggerPrivate
.TraceEntry
[mDebuggerPrivate
.TraceEntryCount
].Type
= Type
;
254 // Do not change TraceEntryCount
261 EbcDebuggerPushTraceDestEntry (
263 IN EFI_DEBUGGER_BRANCH_TYPE Type
269 It will record destination address for trace entry.
273 DestEntry - Destination address
283 if (mDebuggerPrivate
.TraceEntryCount
< EFI_DEBUGGER_TRACE_MAX
) {
285 // If there is empty entry for trace, add it
287 ASSERT (mDebuggerPrivate
.TraceEntry
[mDebuggerPrivate
.TraceEntryCount
].Type
== Type
);
288 mDebuggerPrivate
.TraceEntry
[mDebuggerPrivate
.TraceEntryCount
].DestAddress
= DestEntry
;
289 mDebuggerPrivate
.TraceEntryCount
++;
292 // If there is no empty entry for trace, throw the oldest one
294 ASSERT (mDebuggerPrivate
.TraceEntry
[EFI_DEBUGGER_TRACE_MAX
].Type
== Type
);
295 for (Index
= 0; Index
< EFI_DEBUGGER_TRACE_MAX
; Index
++) {
296 mDebuggerPrivate
.TraceEntry
[Index
] = mDebuggerPrivate
.TraceEntry
[Index
+ 1];
298 mDebuggerPrivate
.TraceEntry
[EFI_DEBUGGER_CALLSTACK_MAX
- 1].DestAddress
= DestEntry
;
299 mDebuggerPrivate
.TraceEntryCount
= EFI_DEBUGGER_TRACE_MAX
;
306 EbcDebuggerPushStepEntry (
315 It will record address for StepEntry, if STEPOVER or STEPOUT is enabled.
319 Entry - Break Address
320 FramePtr - Break Frame pointer
321 Flag - for STEPOVER or STEPOUT
331 if ((Flag
== EFI_DEBUG_FLAG_EBC_STEPOVER
) &&
332 ((mDebuggerPrivate
.FeatureFlags
& EFI_DEBUG_FLAG_EBC_STEPOVER
) == EFI_DEBUG_FLAG_EBC_STEPOVER
)) {
333 mDebuggerPrivate
.StepContext
.BreakAddress
= Entry
;
334 mDebuggerPrivate
.StepContext
.FramePointer
= FramePtr
;
335 mDebuggerPrivate
.FeatureFlags
&= ~EFI_DEBUG_FLAG_EBC_B_STEPOVER
;
340 if ((Flag
== EFI_DEBUG_FLAG_EBC_STEPOUT
) &&
341 ((mDebuggerPrivate
.FeatureFlags
& EFI_DEBUG_FLAG_EBC_STEPOUT
) == EFI_DEBUG_FLAG_EBC_STEPOUT
)) {
342 mDebuggerPrivate
.StepContext
.BreakAddress
= Entry
;
343 mDebuggerPrivate
.StepContext
.FramePointer
= FramePtr
;
344 mDebuggerPrivate
.FeatureFlags
&= ~EFI_DEBUG_FLAG_EBC_B_STEPOUT
;
350 EbcDebuggerBreakEventFunc (
357 if ((mDebuggerPrivate
.FeatureFlags
& EFI_DEBUG_FLAG_EBC_BOK
) != EFI_DEBUG_FLAG_EBC_BOK
) {
361 Status
= gBS
->CheckEvent (gST
->ConIn
->WaitForKey
);
362 if (Status
== EFI_SUCCESS
) {
363 mDebuggerPrivate
.StatusFlags
= EFI_DEBUG_FLAG_EBC_BOK
;
368 // Hook function implementation
371 EbcDebuggerHookInit (
372 IN EFI_HANDLE Handle
,
373 IN EFI_DEBUG_SUPPORT_PROTOCOL
*EbcDebugProtocol
379 The hook in InitializeEbcDriver.
380 It will init the EbcDebuggerPrivate data structure.
384 Handle - The EbcDebugProtocol handle.
385 EbcDebugProtocol - The EbcDebugProtocol interface.
394 EFI_DEBUGGER_SYMBOL_OBJECT
*Object
;
395 EFI_DEBUGGER_SYMBOL_ENTRY
*Entry
;
399 // Register all exception handler
401 for (Index
= EXCEPT_EBC_UNDEFINED
; Index
<= EXCEPT_EBC_STEP
; Index
++) {
402 EbcDebugProtocol
->RegisterExceptionCallback (
408 EbcDebugProtocol
->RegisterExceptionCallback (
419 Object
= AllocateZeroPool (sizeof(EFI_DEBUGGER_SYMBOL_OBJECT
) * EFI_DEBUGGER_SYMBOL_OBJECT_MAX
);
420 ASSERT (Object
!= NULL
);
421 mDebuggerPrivate
.DebuggerSymbolContext
.Object
= Object
;
422 mDebuggerPrivate
.DebuggerSymbolContext
.ObjectCount
= 0;
423 mDebuggerPrivate
.DebuggerSymbolContext
.MaxObjectCount
= EFI_DEBUGGER_SYMBOL_OBJECT_MAX
;
424 for (Index
= 0; Index
< EFI_DEBUGGER_SYMBOL_OBJECT_MAX
; Index
++) {
425 Entry
= AllocateZeroPool (sizeof(EFI_DEBUGGER_SYMBOL_ENTRY
) * EFI_DEBUGGER_SYMBOL_ENTRY_MAX
);
426 ASSERT (Entry
!= NULL
);
427 Object
[Index
].Entry
= Entry
;
428 Object
[Index
].MaxEntryCount
= EFI_DEBUGGER_SYMBOL_ENTRY_MAX
;
429 Object
[Index
].SourceBuffer
= AllocateZeroPool (sizeof(VOID
*) * (EFI_DEBUGGER_SYMBOL_ENTRY_MAX
+ 1));
430 ASSERT (Object
[Index
].SourceBuffer
!= NULL
);
434 // locate PciRootBridgeIo
436 Status
= gBS
->LocateProtocol (
437 &gEfiPciRootBridgeIoProtocolGuid
,
439 (VOID
**) &mDebuggerPrivate
.PciRootBridgeIo
443 // locate DebugImageInfoTable
445 Status
= EfiGetSystemConfigurationTable (
446 &gEfiDebugImageInfoTableGuid
,
447 (VOID
**) &mDebuggerPrivate
.DebugImageInfoTableHeader
451 // Create break event
453 Status
= gBS
->CreateEvent (
454 EVT_TIMER
| EVT_NOTIFY_SIGNAL
,
456 EbcDebuggerBreakEventFunc
,
458 &mDebuggerPrivate
.BreakEvent
460 Status
= gBS
->SetTimer (
461 mDebuggerPrivate
.BreakEvent
,
463 EFI_DEBUG_BREAK_TIMER_INTERVAL
470 EbcDebuggerHookUnload (
477 The hook in UnloadImage for EBC Interpreter.
478 It clean up the environment.
491 EFI_DEBUGGER_SYMBOL_OBJECT
*Object
;
494 // Close the break event
496 gBS
->CloseEvent (mDebuggerPrivate
.BreakEvent
);
499 // Clean up the symbol
501 Object
= mDebuggerPrivate
.DebuggerSymbolContext
.Object
;
502 for (Index
= 0; Index
< EFI_DEBUGGER_SYMBOL_OBJECT_MAX
; Index
++) {
506 gBS
->FreePool (Object
[Index
].Entry
);
507 Object
[Index
].Entry
= NULL
;
508 Object
[Index
].EntryCount
= 0;
510 // Clean up source buffer
512 for (SubIndex
= 0; Object
[Index
].SourceBuffer
[SubIndex
] != NULL
; SubIndex
++) {
513 gBS
->FreePool (Object
[Index
].SourceBuffer
[SubIndex
]);
514 Object
[Index
].SourceBuffer
[SubIndex
] = NULL
;
516 gBS
->FreePool (Object
[Index
].SourceBuffer
);
517 Object
[Index
].SourceBuffer
= NULL
;
523 gBS
->FreePool (Object
);
524 mDebuggerPrivate
.DebuggerSymbolContext
.Object
= NULL
;
525 mDebuggerPrivate
.DebuggerSymbolContext
.ObjectCount
= 0;
534 EbcDebuggerHookEbcUnloadImage (
541 The hook in EbcUnloadImage.
542 Currently do nothing here.
546 Handle - The EbcImage handle.
557 EbcDebuggerHookExecuteEbcImageEntryPoint (
564 The hook in ExecuteEbcImageEntryPoint.
565 It will record the call-stack entry. (-1 means EbcImageEntryPoint call)
566 and trigger Exception if BOE enabled.
570 VmPtr - pointer to VM context.
577 EbcDebuggerPushCallstackSource ((UINT64
)(UINTN
)-1, EfiDebuggerBranchTypeEbcCall
);
578 EbcDebuggerPushCallstackParameter ((UINT64
)(UINTN
)VmPtr
->Gpr
[0], EfiDebuggerBranchTypeEbcCall
);
579 EbcDebuggerPushCallstackDest ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcCall
);
580 EbcDebuggerCheckHookFlag (VmPtr
, EFI_DEBUG_FLAG_EBC_BOE
);
585 EbcDebuggerHookEbcInterpret (
592 The hook in ExecuteEbcImageEntryPoint.
593 It will record the call-stack entry. (-2 means EbcInterpret call)
594 and trigger Exception if BOT enabled.
598 VmPtr - pointer to VM context.
605 EbcDebuggerPushCallstackSource ((UINT64
)(UINTN
)-2, EfiDebuggerBranchTypeEbcCall
);
606 EbcDebuggerPushCallstackParameter ((UINT64
)(UINTN
)VmPtr
->Gpr
[0], EfiDebuggerBranchTypeEbcCall
);
607 EbcDebuggerPushCallstackDest ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcCall
);
608 EbcDebuggerCheckHookFlag (VmPtr
, EFI_DEBUG_FLAG_EBC_BOT
);
613 EbcDebuggerHookExecuteStart (
620 The hook in EbcExecute, before ExecuteFunction.
621 It will trigger Exception if GoTil, StepOver, or StepOut hit.
625 VmPtr - pointer to VM context.
635 // Check Ip for GoTil
637 if (mDebuggerPrivate
.GoTilContext
.BreakAddress
== (UINT64
)(UINTN
)VmPtr
->Ip
) {
638 mDebuggerPrivate
.StatusFlags
= EFI_DEBUG_FLAG_EBC_GT
;
639 mDebuggerPrivate
.GoTilContext
.BreakAddress
= 0;
640 EbcDebugSignalException (
641 EXCEPT_EBC_BREAKPOINT
,
645 mDebuggerPrivate
.StatusFlags
&= ~EFI_DEBUG_FLAG_EBC_B_GT
;
649 // Check ReturnAddress for StepOver
651 if ((mDebuggerPrivate
.StepContext
.BreakAddress
== (UINT64
)(UINTN
)VmPtr
->Ip
) &&
652 (mDebuggerPrivate
.StepContext
.FramePointer
== (UINT64
)(UINTN
)VmPtr
->FramePtr
)) {
653 mDebuggerPrivate
.StatusFlags
= EFI_DEBUG_FLAG_EBC_STEPOVER
;
654 mDebuggerPrivate
.StepContext
.BreakAddress
= 0;
655 mDebuggerPrivate
.StepContext
.FramePointer
= 0;
656 EbcDebugSignalException (
657 EXCEPT_EBC_BREAKPOINT
,
661 mDebuggerPrivate
.StatusFlags
&= ~EFI_DEBUG_FLAG_EBC_B_STEPOVER
;
664 // Check FramePtr for StepOut
666 if (mDebuggerPrivate
.StepContext
.BreakAddress
== (UINT64
)(UINTN
)VmPtr
->FramePtr
) {
667 mDebuggerPrivate
.StatusFlags
= EFI_DEBUG_FLAG_EBC_STEPOUT
;
668 mDebuggerPrivate
.StepContext
.BreakAddress
= 0;
669 mDebuggerPrivate
.StepContext
.FramePointer
= 0;
670 EbcDebugSignalException (
671 EXCEPT_EBC_BREAKPOINT
,
675 mDebuggerPrivate
.StatusFlags
&= ~EFI_DEBUG_FLAG_EBC_B_STEPOUT
;
678 // Check Flags for BreakOnKey
680 if (mDebuggerPrivate
.StatusFlags
== EFI_DEBUG_FLAG_EBC_BOK
) {
682 // Only break when the current TPL <= TPL_APPLICATION
684 CurrentTpl
= gBS
->RaiseTPL (TPL_HIGH_LEVEL
);
685 gBS
->RestoreTPL (CurrentTpl
);
686 if (CurrentTpl
<= TPL_APPLICATION
) {
687 EbcDebugSignalException (
688 EXCEPT_EBC_BREAKPOINT
,
692 mDebuggerPrivate
.StatusFlags
&= ~EFI_DEBUG_FLAG_EBC_B_BOK
;
699 EbcDebuggerHookExecuteEnd (
706 The hook in EbcExecute, after ExecuteFunction.
707 It will record StepOut Entry if need.
711 VmPtr - pointer to VM context.
721 // Use FramePtr as checkpoint for StepOut
723 CopyMem (&Address
, (VOID
*)((UINTN
)VmPtr
->FramePtr
), sizeof(Address
));
724 EbcDebuggerPushStepEntry (Address
, (UINT64
)(UINTN
)VmPtr
->FramePtr
, EFI_DEBUG_FLAG_EBC_STEPOUT
);
730 EbcDebuggerHookCALLStart (
737 The hook in ExecuteCALL, before move IP.
738 It will trigger Exception if BOC enabled,
739 and record Callstack, and trace information.
743 VmPtr - pointer to VM context.
750 EbcDebuggerCheckHookFlag (VmPtr
, EFI_DEBUG_FLAG_EBC_BOC
);
751 EbcDebuggerPushCallstackSource ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcCall
);
752 EbcDebuggerPushCallstackParameter ((UINT64
)(UINTN
)VmPtr
->Gpr
[0], EfiDebuggerBranchTypeEbcCall
);
753 EbcDebuggerPushTraceSourceEntry ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcCall
);
758 EbcDebuggerHookCALLEnd (
765 The hook in ExecuteCALL, after move IP.
766 It will record Callstack, trace information
767 and record StepOver/StepOut Entry if need.
771 VmPtr - pointer to VM context.
781 EbcDebuggerPushCallstackDest ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcCall
);
782 EbcDebuggerPushTraceDestEntry ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcCall
);
787 CopyMem (&FramePtr
, (VOID
*)((UINTN
)VmPtr
->FramePtr
), sizeof(FramePtr
));
790 // Use ReturnAddress as checkpoint for StepOver
792 CopyMem (&Address
, (VOID
*)(UINTN
)VmPtr
->Gpr
[0], sizeof(Address
));
793 EbcDebuggerPushStepEntry (Address
, FramePtr
, EFI_DEBUG_FLAG_EBC_STEPOVER
);
796 // Use FramePtr as checkpoint for StepOut
799 CopyMem (&Address
, (VOID
*)(FramePtr
), sizeof(UINTN
));
800 EbcDebuggerPushStepEntry (Address
, FramePtr
, EFI_DEBUG_FLAG_EBC_STEPOUT
);
806 EbcDebuggerHookCALLEXStart (
813 The hook in ExecuteCALL, before call EbcLLCALLEX.
814 It will trigger Exception if BOCX enabled,
815 and record Callstack information.
819 VmPtr - pointer to VM context.
826 EbcDebuggerCheckHookFlag (VmPtr
, EFI_DEBUG_FLAG_EBC_BOCX
);
827 // EbcDebuggerPushCallstackSource ((UINT64)(UINTN)VmPtr->Ip, EfiDebuggerBranchTypeEbcCallEx);
828 // EbcDebuggerPushCallstackParameter ((UINT64)(UINTN)VmPtr->R[0], EfiDebuggerBranchTypeEbcCallEx);
829 EbcDebuggerPushTraceSourceEntry ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcCallEx
);
834 EbcDebuggerHookCALLEXEnd (
841 The hook in ExecuteCALL, after call EbcLLCALLEX.
842 It will record trace information.
846 VmPtr - pointer to VM context.
853 // EbcDebuggerPushCallstackDest ((UINT64)(UINTN)VmPtr->Ip, EfiDebuggerBranchTypeEbcCallEx);
854 EbcDebuggerPushTraceDestEntry ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcCallEx
);
859 EbcDebuggerHookRETStart (
866 The hook in ExecuteRET, before move IP.
867 It will trigger Exception if BOR enabled,
868 and record Callstack, and trace information.
872 VmPtr - pointer to VM context.
879 EbcDebuggerCheckHookFlag (VmPtr
, EFI_DEBUG_FLAG_EBC_BOR
);
880 EbcDebuggerPopCallstack ();
881 EbcDebuggerPushTraceSourceEntry ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcRet
);
886 EbcDebuggerHookRETEnd (
893 The hook in ExecuteRET, after move IP.
894 It will record trace information.
898 VmPtr - pointer to VM context.
905 EbcDebuggerPushTraceDestEntry ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcRet
);
910 EbcDebuggerHookJMPStart (
917 The hook in ExecuteJMP, before move IP.
918 It will record trace information.
922 VmPtr - pointer to VM context.
929 EbcDebuggerPushTraceSourceEntry ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcJmp
);
934 EbcDebuggerHookJMPEnd (
941 The hook in ExecuteJMP, after move IP.
942 It will record trace information.
946 VmPtr - pointer to VM context.
953 EbcDebuggerPushTraceDestEntry ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcJmp
);
958 EbcDebuggerHookJMP8Start (
965 The hook in ExecuteJMP8, before move IP.
966 It will record trace information.
970 VmPtr - pointer to VM context.
977 EbcDebuggerPushTraceSourceEntry ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcJmp8
);
982 EbcDebuggerHookJMP8End (
989 The hook in ExecuteJMP8, after move IP.
990 It will record trace information.
994 VmPtr - pointer to VM context.
1001 EbcDebuggerPushTraceDestEntry ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcJmp8
);