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 if (!EFI_ERROR (Status
)) {
461 Status
= gBS
->SetTimer (
462 mDebuggerPrivate
.BreakEvent
,
464 EFI_DEBUG_BREAK_TIMER_INTERVAL
472 EbcDebuggerHookUnload (
479 The hook in UnloadImage for EBC Interpreter.
480 It clean up the environment.
493 EFI_DEBUGGER_SYMBOL_OBJECT
*Object
;
496 // Close the break event
498 if (mDebuggerPrivate
.BreakEvent
!= NULL
) {
499 gBS
->CloseEvent (mDebuggerPrivate
.BreakEvent
);
503 // Clean up the symbol
505 Object
= mDebuggerPrivate
.DebuggerSymbolContext
.Object
;
506 for (Index
= 0; Index
< EFI_DEBUGGER_SYMBOL_OBJECT_MAX
; Index
++) {
510 gBS
->FreePool (Object
[Index
].Entry
);
511 Object
[Index
].Entry
= NULL
;
512 Object
[Index
].EntryCount
= 0;
514 // Clean up source buffer
516 for (SubIndex
= 0; Object
[Index
].SourceBuffer
[SubIndex
] != NULL
; SubIndex
++) {
517 gBS
->FreePool (Object
[Index
].SourceBuffer
[SubIndex
]);
518 Object
[Index
].SourceBuffer
[SubIndex
] = NULL
;
520 gBS
->FreePool (Object
[Index
].SourceBuffer
);
521 Object
[Index
].SourceBuffer
= NULL
;
527 gBS
->FreePool (Object
);
528 mDebuggerPrivate
.DebuggerSymbolContext
.Object
= NULL
;
529 mDebuggerPrivate
.DebuggerSymbolContext
.ObjectCount
= 0;
538 EbcDebuggerHookEbcUnloadImage (
545 The hook in EbcUnloadImage.
546 Currently do nothing here.
550 Handle - The EbcImage handle.
561 EbcDebuggerHookExecuteEbcImageEntryPoint (
568 The hook in ExecuteEbcImageEntryPoint.
569 It will record the call-stack entry. (-1 means EbcImageEntryPoint call)
570 and trigger Exception if BOE enabled.
574 VmPtr - pointer to VM context.
581 EbcDebuggerPushCallstackSource ((UINT64
)(UINTN
)-1, EfiDebuggerBranchTypeEbcCall
);
582 EbcDebuggerPushCallstackParameter ((UINT64
)(UINTN
)VmPtr
->Gpr
[0], EfiDebuggerBranchTypeEbcCall
);
583 EbcDebuggerPushCallstackDest ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcCall
);
584 EbcDebuggerCheckHookFlag (VmPtr
, EFI_DEBUG_FLAG_EBC_BOE
);
589 EbcDebuggerHookEbcInterpret (
596 The hook in ExecuteEbcImageEntryPoint.
597 It will record the call-stack entry. (-2 means EbcInterpret call)
598 and trigger Exception if BOT enabled.
602 VmPtr - pointer to VM context.
609 EbcDebuggerPushCallstackSource ((UINT64
)(UINTN
)-2, EfiDebuggerBranchTypeEbcCall
);
610 EbcDebuggerPushCallstackParameter ((UINT64
)(UINTN
)VmPtr
->Gpr
[0], EfiDebuggerBranchTypeEbcCall
);
611 EbcDebuggerPushCallstackDest ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcCall
);
612 EbcDebuggerCheckHookFlag (VmPtr
, EFI_DEBUG_FLAG_EBC_BOT
);
617 EbcDebuggerHookExecuteStart (
624 The hook in EbcExecute, before ExecuteFunction.
625 It will trigger Exception if GoTil, StepOver, or StepOut hit.
629 VmPtr - pointer to VM context.
639 // Check Ip for GoTil
641 if (mDebuggerPrivate
.GoTilContext
.BreakAddress
== (UINT64
)(UINTN
)VmPtr
->Ip
) {
642 mDebuggerPrivate
.StatusFlags
= EFI_DEBUG_FLAG_EBC_GT
;
643 mDebuggerPrivate
.GoTilContext
.BreakAddress
= 0;
644 EbcDebugSignalException (
645 EXCEPT_EBC_BREAKPOINT
,
649 mDebuggerPrivate
.StatusFlags
&= ~EFI_DEBUG_FLAG_EBC_B_GT
;
653 // Check ReturnAddress for StepOver
655 if ((mDebuggerPrivate
.StepContext
.BreakAddress
== (UINT64
)(UINTN
)VmPtr
->Ip
) &&
656 (mDebuggerPrivate
.StepContext
.FramePointer
== (UINT64
)(UINTN
)VmPtr
->FramePtr
)) {
657 mDebuggerPrivate
.StatusFlags
= EFI_DEBUG_FLAG_EBC_STEPOVER
;
658 mDebuggerPrivate
.StepContext
.BreakAddress
= 0;
659 mDebuggerPrivate
.StepContext
.FramePointer
= 0;
660 EbcDebugSignalException (
661 EXCEPT_EBC_BREAKPOINT
,
665 mDebuggerPrivate
.StatusFlags
&= ~EFI_DEBUG_FLAG_EBC_B_STEPOVER
;
668 // Check FramePtr for StepOut
670 if (mDebuggerPrivate
.StepContext
.BreakAddress
== (UINT64
)(UINTN
)VmPtr
->FramePtr
) {
671 mDebuggerPrivate
.StatusFlags
= EFI_DEBUG_FLAG_EBC_STEPOUT
;
672 mDebuggerPrivate
.StepContext
.BreakAddress
= 0;
673 mDebuggerPrivate
.StepContext
.FramePointer
= 0;
674 EbcDebugSignalException (
675 EXCEPT_EBC_BREAKPOINT
,
679 mDebuggerPrivate
.StatusFlags
&= ~EFI_DEBUG_FLAG_EBC_B_STEPOUT
;
682 // Check Flags for BreakOnKey
684 if (mDebuggerPrivate
.StatusFlags
== EFI_DEBUG_FLAG_EBC_BOK
) {
686 // Only break when the current TPL <= TPL_APPLICATION
688 CurrentTpl
= gBS
->RaiseTPL (TPL_HIGH_LEVEL
);
689 gBS
->RestoreTPL (CurrentTpl
);
690 if (CurrentTpl
<= TPL_APPLICATION
) {
691 EbcDebugSignalException (
692 EXCEPT_EBC_BREAKPOINT
,
696 mDebuggerPrivate
.StatusFlags
&= ~EFI_DEBUG_FLAG_EBC_B_BOK
;
703 EbcDebuggerHookExecuteEnd (
710 The hook in EbcExecute, after ExecuteFunction.
711 It will record StepOut Entry if need.
715 VmPtr - pointer to VM context.
725 // Use FramePtr as checkpoint for StepOut
727 CopyMem (&Address
, (VOID
*)((UINTN
)VmPtr
->FramePtr
), sizeof(Address
));
728 EbcDebuggerPushStepEntry (Address
, (UINT64
)(UINTN
)VmPtr
->FramePtr
, EFI_DEBUG_FLAG_EBC_STEPOUT
);
734 EbcDebuggerHookCALLStart (
741 The hook in ExecuteCALL, before move IP.
742 It will trigger Exception if BOC enabled,
743 and record Callstack, and trace information.
747 VmPtr - pointer to VM context.
754 EbcDebuggerCheckHookFlag (VmPtr
, EFI_DEBUG_FLAG_EBC_BOC
);
755 EbcDebuggerPushCallstackSource ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcCall
);
756 EbcDebuggerPushCallstackParameter ((UINT64
)(UINTN
)VmPtr
->Gpr
[0], EfiDebuggerBranchTypeEbcCall
);
757 EbcDebuggerPushTraceSourceEntry ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcCall
);
762 EbcDebuggerHookCALLEnd (
769 The hook in ExecuteCALL, after move IP.
770 It will record Callstack, trace information
771 and record StepOver/StepOut Entry if need.
775 VmPtr - pointer to VM context.
785 EbcDebuggerPushCallstackDest ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcCall
);
786 EbcDebuggerPushTraceDestEntry ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcCall
);
791 CopyMem (&FramePtr
, (VOID
*)((UINTN
)VmPtr
->FramePtr
), sizeof(FramePtr
));
794 // Use ReturnAddress as checkpoint for StepOver
796 CopyMem (&Address
, (VOID
*)(UINTN
)VmPtr
->Gpr
[0], sizeof(Address
));
797 EbcDebuggerPushStepEntry (Address
, FramePtr
, EFI_DEBUG_FLAG_EBC_STEPOVER
);
800 // Use FramePtr as checkpoint for StepOut
803 CopyMem (&Address
, (VOID
*)(FramePtr
), sizeof(UINTN
));
804 EbcDebuggerPushStepEntry (Address
, FramePtr
, EFI_DEBUG_FLAG_EBC_STEPOUT
);
810 EbcDebuggerHookCALLEXStart (
817 The hook in ExecuteCALL, before call EbcLLCALLEX.
818 It will trigger Exception if BOCX enabled,
819 and record Callstack information.
823 VmPtr - pointer to VM context.
830 EbcDebuggerCheckHookFlag (VmPtr
, EFI_DEBUG_FLAG_EBC_BOCX
);
831 // EbcDebuggerPushCallstackSource ((UINT64)(UINTN)VmPtr->Ip, EfiDebuggerBranchTypeEbcCallEx);
832 // EbcDebuggerPushCallstackParameter ((UINT64)(UINTN)VmPtr->R[0], EfiDebuggerBranchTypeEbcCallEx);
833 EbcDebuggerPushTraceSourceEntry ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcCallEx
);
838 EbcDebuggerHookCALLEXEnd (
845 The hook in ExecuteCALL, after call EbcLLCALLEX.
846 It will record trace information.
850 VmPtr - pointer to VM context.
857 // EbcDebuggerPushCallstackDest ((UINT64)(UINTN)VmPtr->Ip, EfiDebuggerBranchTypeEbcCallEx);
858 EbcDebuggerPushTraceDestEntry ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcCallEx
);
863 EbcDebuggerHookRETStart (
870 The hook in ExecuteRET, before move IP.
871 It will trigger Exception if BOR enabled,
872 and record Callstack, and trace information.
876 VmPtr - pointer to VM context.
883 EbcDebuggerCheckHookFlag (VmPtr
, EFI_DEBUG_FLAG_EBC_BOR
);
884 EbcDebuggerPopCallstack ();
885 EbcDebuggerPushTraceSourceEntry ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcRet
);
890 EbcDebuggerHookRETEnd (
897 The hook in ExecuteRET, after move IP.
898 It will record trace information.
902 VmPtr - pointer to VM context.
909 EbcDebuggerPushTraceDestEntry ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcRet
);
914 EbcDebuggerHookJMPStart (
921 The hook in ExecuteJMP, before move IP.
922 It will record trace information.
926 VmPtr - pointer to VM context.
933 EbcDebuggerPushTraceSourceEntry ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcJmp
);
938 EbcDebuggerHookJMPEnd (
945 The hook in ExecuteJMP, after move IP.
946 It will record trace information.
950 VmPtr - pointer to VM context.
957 EbcDebuggerPushTraceDestEntry ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcJmp
);
962 EbcDebuggerHookJMP8Start (
969 The hook in ExecuteJMP8, before move IP.
970 It will record trace information.
974 VmPtr - pointer to VM context.
981 EbcDebuggerPushTraceSourceEntry ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcJmp8
);
986 EbcDebuggerHookJMP8End (
993 The hook in ExecuteJMP8, after move IP.
994 It will record trace information.
998 VmPtr - pointer to VM context.
1005 EbcDebuggerPushTraceDestEntry ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcJmp8
);