3 Copyright (c) 2007, Intel Corporation. All rights reserved.<BR>
4 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.
19 Check the Hook flag, and trigger exception if match.
21 @param VmPtr - EbcDebuggerCheckHookFlag
22 @param Flag - Feature flag
26 EbcDebuggerCheckHookFlag (
31 if ((mDebuggerPrivate
.FeatureFlags
& Flag
) == Flag
) {
32 mDebuggerPrivate
.StatusFlags
= Flag
;
33 EbcDebugSignalException (
34 EXCEPT_EBC_BREAKPOINT
,
44 It will record soruce address for Callstack entry.
46 @param SourceEntry - Source address
47 @param Type - Branch type
51 EbcDebuggerPushCallstackSource (
52 IN UINT64 SourceEntry
,
53 IN EFI_DEBUGGER_BRANCH_TYPE Type
56 if (mDebuggerPrivate
.CallStackEntryCount
> EFI_DEBUGGER_CALLSTACK_MAX
) {
58 mDebuggerPrivate
.CallStackEntryCount
= EFI_DEBUGGER_CALLSTACK_MAX
;
61 // Record the new callstack entry
63 mDebuggerPrivate
.CallStackEntry
[mDebuggerPrivate
.CallStackEntryCount
].SourceAddress
= SourceEntry
;
64 mDebuggerPrivate
.CallStackEntry
[mDebuggerPrivate
.CallStackEntryCount
].Type
= Type
;
67 // Do not change CallStackEntryCount
75 It will record parameter for Callstack entry.
77 @param ParameterAddress - The address for the parameter
78 @param Type - Branch type
82 EbcDebuggerPushCallstackParameter (
83 IN UINT64 ParameterAddress
,
84 IN EFI_DEBUGGER_BRANCH_TYPE Type
87 if (mDebuggerPrivate
.CallStackEntryCount
> EFI_DEBUGGER_CALLSTACK_MAX
) {
89 mDebuggerPrivate
.CallStackEntryCount
= EFI_DEBUGGER_CALLSTACK_MAX
;
92 // Record the new callstack parameter
94 mDebuggerPrivate
.CallStackEntry
[mDebuggerPrivate
.CallStackEntryCount
].ParameterAddr
= (UINTN
)ParameterAddress
;
96 mDebuggerPrivate
.CallStackEntry
[mDebuggerPrivate
.CallStackEntryCount
].Parameter
,
97 (VOID
*)(UINTN
)ParameterAddress
,
98 sizeof(mDebuggerPrivate
.CallStackEntry
[mDebuggerPrivate
.CallStackEntryCount
].Parameter
)
102 // Do not change CallStackEntryCount
110 It will record source address for callstack entry.
112 @param DestEntry - Source address
113 @param Type - Branch type
117 EbcDebuggerPushCallstackDest (
119 IN EFI_DEBUGGER_BRANCH_TYPE Type
124 if (mDebuggerPrivate
.CallStackEntryCount
< EFI_DEBUGGER_CALLSTACK_MAX
) {
126 // If there is empty entry for callstack, add it
128 ASSERT (mDebuggerPrivate
.CallStackEntry
[mDebuggerPrivate
.CallStackEntryCount
].Type
== Type
);
129 mDebuggerPrivate
.CallStackEntry
[mDebuggerPrivate
.CallStackEntryCount
].DestAddress
= DestEntry
;
130 mDebuggerPrivate
.CallStackEntryCount
++;
133 // If there is no empty entry for callstack, throw the oldest one
135 ASSERT (mDebuggerPrivate
.CallStackEntry
[EFI_DEBUGGER_TRACE_MAX
].Type
== Type
);
136 for (Index
= 0; Index
< EFI_DEBUGGER_CALLSTACK_MAX
; Index
++) {
137 mDebuggerPrivate
.CallStackEntry
[Index
] = mDebuggerPrivate
.CallStackEntry
[Index
+ 1];
139 mDebuggerPrivate
.CallStackEntry
[EFI_DEBUGGER_CALLSTACK_MAX
- 1].DestAddress
= DestEntry
;
140 mDebuggerPrivate
.CallStackEntryCount
= EFI_DEBUGGER_CALLSTACK_MAX
;
148 It will throw the newest Callstack entry.
152 EbcDebuggerPopCallstack (
156 if ((mDebuggerPrivate
.CallStackEntryCount
> 0) &&
157 (mDebuggerPrivate
.CallStackEntryCount
<= EFI_DEBUGGER_CALLSTACK_MAX
)) {
159 // Throw the newest one
161 mDebuggerPrivate
.CallStackEntryCount
--;
162 mDebuggerPrivate
.CallStackEntry
[mDebuggerPrivate
.CallStackEntryCount
].SourceAddress
= 0;
163 mDebuggerPrivate
.CallStackEntry
[mDebuggerPrivate
.CallStackEntryCount
].DestAddress
= 0;
164 } else if (mDebuggerPrivate
.CallStackEntryCount
== 0) {
166 // NOT assert here because it is reasonable, because when we start to build
167 // callstack, we do not know how many function already called.
178 It will record source address for trace entry.
180 @param SourceEntry - Source address
181 @param Type - Branch type
185 EbcDebuggerPushTraceSourceEntry (
186 IN UINT64 SourceEntry
,
187 IN EFI_DEBUGGER_BRANCH_TYPE Type
190 if (mDebuggerPrivate
.TraceEntryCount
> EFI_DEBUGGER_TRACE_MAX
) {
192 mDebuggerPrivate
.TraceEntryCount
= EFI_DEBUGGER_TRACE_MAX
;
195 // Record the new trace entry
197 mDebuggerPrivate
.TraceEntry
[mDebuggerPrivate
.TraceEntryCount
].SourceAddress
= SourceEntry
;
198 mDebuggerPrivate
.TraceEntry
[mDebuggerPrivate
.TraceEntryCount
].Type
= Type
;
201 // Do not change TraceEntryCount
209 It will record destination address for trace entry.
211 @param DestEntry - Destination address
212 @param Type - Branch type
216 EbcDebuggerPushTraceDestEntry (
218 IN EFI_DEBUGGER_BRANCH_TYPE Type
223 if (mDebuggerPrivate
.TraceEntryCount
< EFI_DEBUGGER_TRACE_MAX
) {
225 // If there is empty entry for trace, add it
227 ASSERT (mDebuggerPrivate
.TraceEntry
[mDebuggerPrivate
.TraceEntryCount
].Type
== Type
);
228 mDebuggerPrivate
.TraceEntry
[mDebuggerPrivate
.TraceEntryCount
].DestAddress
= DestEntry
;
229 mDebuggerPrivate
.TraceEntryCount
++;
232 // If there is no empty entry for trace, throw the oldest one
234 ASSERT (mDebuggerPrivate
.TraceEntry
[EFI_DEBUGGER_TRACE_MAX
].Type
== Type
);
235 for (Index
= 0; Index
< EFI_DEBUGGER_TRACE_MAX
; Index
++) {
236 mDebuggerPrivate
.TraceEntry
[Index
] = mDebuggerPrivate
.TraceEntry
[Index
+ 1];
238 mDebuggerPrivate
.TraceEntry
[EFI_DEBUGGER_CALLSTACK_MAX
- 1].DestAddress
= DestEntry
;
239 mDebuggerPrivate
.TraceEntryCount
= EFI_DEBUGGER_TRACE_MAX
;
247 It will record address for StepEntry, if STEPOVER or STEPOUT is enabled.
249 @param Entry - Break Address
250 @param FramePtr - Break Frame pointer
251 @param Flag - for STEPOVER or STEPOUT
255 EbcDebuggerPushStepEntry (
264 if ((Flag
== EFI_DEBUG_FLAG_EBC_STEPOVER
) &&
265 ((mDebuggerPrivate
.FeatureFlags
& EFI_DEBUG_FLAG_EBC_STEPOVER
) == EFI_DEBUG_FLAG_EBC_STEPOVER
)) {
266 mDebuggerPrivate
.StepContext
.BreakAddress
= Entry
;
267 mDebuggerPrivate
.StepContext
.FramePointer
= FramePtr
;
268 mDebuggerPrivate
.FeatureFlags
&= ~EFI_DEBUG_FLAG_EBC_B_STEPOVER
;
273 if ((Flag
== EFI_DEBUG_FLAG_EBC_STEPOUT
) &&
274 ((mDebuggerPrivate
.FeatureFlags
& EFI_DEBUG_FLAG_EBC_STEPOUT
) == EFI_DEBUG_FLAG_EBC_STEPOUT
)) {
275 mDebuggerPrivate
.StepContext
.BreakAddress
= Entry
;
276 mDebuggerPrivate
.StepContext
.FramePointer
= FramePtr
;
277 mDebuggerPrivate
.FeatureFlags
&= ~EFI_DEBUG_FLAG_EBC_B_STEPOUT
;
283 EbcDebuggerBreakEventFunc (
290 if ((mDebuggerPrivate
.FeatureFlags
& EFI_DEBUG_FLAG_EBC_BOK
) != EFI_DEBUG_FLAG_EBC_BOK
) {
294 Status
= gBS
->CheckEvent (gST
->ConIn
->WaitForKey
);
295 if (Status
== EFI_SUCCESS
) {
296 mDebuggerPrivate
.StatusFlags
= EFI_DEBUG_FLAG_EBC_BOK
;
302 The hook in InitializeEbcDriver.
303 It will init the EbcDebuggerPrivate data structure.
305 @param Handle - The EbcDebugProtocol handle.
306 @param EbcDebugProtocol - The EbcDebugProtocol interface.
310 EbcDebuggerHookInit (
311 IN EFI_HANDLE Handle
,
312 IN EFI_DEBUG_SUPPORT_PROTOCOL
*EbcDebugProtocol
317 EFI_DEBUGGER_SYMBOL_OBJECT
*Object
;
318 EFI_DEBUGGER_SYMBOL_ENTRY
*Entry
;
322 // Register all exception handler
324 for (Index
= EXCEPT_EBC_UNDEFINED
; Index
<= EXCEPT_EBC_STEP
; Index
++) {
325 EbcDebugProtocol
->RegisterExceptionCallback (
331 EbcDebugProtocol
->RegisterExceptionCallback (
342 Object
= AllocateZeroPool (sizeof(EFI_DEBUGGER_SYMBOL_OBJECT
) * EFI_DEBUGGER_SYMBOL_OBJECT_MAX
);
343 ASSERT (Object
!= NULL
);
344 mDebuggerPrivate
.DebuggerSymbolContext
.Object
= Object
;
345 mDebuggerPrivate
.DebuggerSymbolContext
.ObjectCount
= 0;
346 mDebuggerPrivate
.DebuggerSymbolContext
.MaxObjectCount
= EFI_DEBUGGER_SYMBOL_OBJECT_MAX
;
347 for (Index
= 0; Index
< EFI_DEBUGGER_SYMBOL_OBJECT_MAX
; Index
++) {
348 Entry
= AllocateZeroPool (sizeof(EFI_DEBUGGER_SYMBOL_ENTRY
) * EFI_DEBUGGER_SYMBOL_ENTRY_MAX
);
349 ASSERT (Entry
!= NULL
);
350 Object
[Index
].Entry
= Entry
;
351 Object
[Index
].MaxEntryCount
= EFI_DEBUGGER_SYMBOL_ENTRY_MAX
;
352 Object
[Index
].SourceBuffer
= AllocateZeroPool (sizeof(VOID
*) * (EFI_DEBUGGER_SYMBOL_ENTRY_MAX
+ 1));
353 ASSERT (Object
[Index
].SourceBuffer
!= NULL
);
357 // locate PciRootBridgeIo
359 Status
= gBS
->LocateProtocol (
360 &gEfiPciRootBridgeIoProtocolGuid
,
362 (VOID
**) &mDebuggerPrivate
.PciRootBridgeIo
366 // locate DebugImageInfoTable
368 Status
= EfiGetSystemConfigurationTable (
369 &gEfiDebugImageInfoTableGuid
,
370 (VOID
**) &mDebuggerPrivate
.DebugImageInfoTableHeader
374 // Register Debugger Configuration Protocol, for config in shell
376 Status
= gBS
->InstallProtocolInterface (
378 &gEfiDebuggerConfigurationProtocolGuid
,
379 EFI_NATIVE_INTERFACE
,
380 &mDebuggerPrivate
.DebuggerConfiguration
385 // Create break event
387 Status
= gBS
->CreateEvent (
388 EVT_TIMER
| EVT_NOTIFY_SIGNAL
,
390 EbcDebuggerBreakEventFunc
,
392 &mDebuggerPrivate
.BreakEvent
394 if (!EFI_ERROR (Status
)) {
395 Status
= gBS
->SetTimer (
396 mDebuggerPrivate
.BreakEvent
,
398 EFI_DEBUG_BREAK_TIMER_INTERVAL
407 The hook in UnloadImage for EBC Interpreter.
408 It clean up the environment.
412 EbcDebuggerHookUnload (
418 EFI_DEBUGGER_SYMBOL_OBJECT
*Object
;
421 // Close the break event
423 if (mDebuggerPrivate
.BreakEvent
!= NULL
) {
424 gBS
->CloseEvent (mDebuggerPrivate
.BreakEvent
);
428 // Clean up the symbol
430 Object
= mDebuggerPrivate
.DebuggerSymbolContext
.Object
;
431 for (Index
= 0; Index
< EFI_DEBUGGER_SYMBOL_OBJECT_MAX
; Index
++) {
435 gBS
->FreePool (Object
[Index
].Entry
);
436 Object
[Index
].Entry
= NULL
;
437 Object
[Index
].EntryCount
= 0;
439 // Clean up source buffer
441 for (SubIndex
= 0; Object
[Index
].SourceBuffer
[SubIndex
] != NULL
; SubIndex
++) {
442 gBS
->FreePool (Object
[Index
].SourceBuffer
[SubIndex
]);
443 Object
[Index
].SourceBuffer
[SubIndex
] = NULL
;
445 gBS
->FreePool (Object
[Index
].SourceBuffer
);
446 Object
[Index
].SourceBuffer
= NULL
;
452 gBS
->FreePool (Object
);
453 mDebuggerPrivate
.DebuggerSymbolContext
.Object
= NULL
;
454 mDebuggerPrivate
.DebuggerSymbolContext
.ObjectCount
= 0;
464 The hook in EbcUnloadImage.
465 Currently do nothing here.
467 @param Handle - The EbcImage handle.
472 EbcDebuggerHookEbcUnloadImage (
481 The hook in ExecuteEbcImageEntryPoint.
482 It will record the call-stack entry. (-1 means EbcImageEntryPoint call)
483 and trigger Exception if BOE enabled.
486 @param VmPtr - pointer to VM context.
490 EbcDebuggerHookExecuteEbcImageEntryPoint (
494 EbcDebuggerPushCallstackSource ((UINT64
)(UINTN
)-1, EfiDebuggerBranchTypeEbcCall
);
495 EbcDebuggerPushCallstackParameter ((UINT64
)(UINTN
)VmPtr
->Gpr
[0], EfiDebuggerBranchTypeEbcCall
);
496 EbcDebuggerPushCallstackDest ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcCall
);
497 EbcDebuggerCheckHookFlag (VmPtr
, EFI_DEBUG_FLAG_EBC_BOE
);
503 The hook in ExecuteEbcImageEntryPoint.
504 It will record the call-stack entry. (-2 means EbcInterpret call)
505 and trigger Exception if BOT enabled.
507 @param VmPtr - pointer to VM context.
511 EbcDebuggerHookEbcInterpret (
515 EbcDebuggerPushCallstackSource ((UINT64
)(UINTN
)-2, EfiDebuggerBranchTypeEbcCall
);
516 EbcDebuggerPushCallstackParameter ((UINT64
)(UINTN
)VmPtr
->Gpr
[0], EfiDebuggerBranchTypeEbcCall
);
517 EbcDebuggerPushCallstackDest ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcCall
);
518 EbcDebuggerCheckHookFlag (VmPtr
, EFI_DEBUG_FLAG_EBC_BOT
);
524 The hook in EbcExecute, before ExecuteFunction.
525 It will trigger Exception if GoTil, StepOver, or StepOut hit.
527 @param VmPtr - pointer to VM context.
531 EbcDebuggerHookExecuteStart (
538 // Check Ip for GoTil
540 if (mDebuggerPrivate
.GoTilContext
.BreakAddress
== (UINT64
)(UINTN
)VmPtr
->Ip
) {
541 mDebuggerPrivate
.StatusFlags
= EFI_DEBUG_FLAG_EBC_GT
;
542 mDebuggerPrivate
.GoTilContext
.BreakAddress
= 0;
543 EbcDebugSignalException (
544 EXCEPT_EBC_BREAKPOINT
,
548 mDebuggerPrivate
.StatusFlags
&= ~EFI_DEBUG_FLAG_EBC_B_GT
;
552 // Check ReturnAddress for StepOver
554 if ((mDebuggerPrivate
.StepContext
.BreakAddress
== (UINT64
)(UINTN
)VmPtr
->Ip
) &&
555 (mDebuggerPrivate
.StepContext
.FramePointer
== (UINT64
)(UINTN
)VmPtr
->FramePtr
)) {
556 mDebuggerPrivate
.StatusFlags
= EFI_DEBUG_FLAG_EBC_STEPOVER
;
557 mDebuggerPrivate
.StepContext
.BreakAddress
= 0;
558 mDebuggerPrivate
.StepContext
.FramePointer
= 0;
559 EbcDebugSignalException (
560 EXCEPT_EBC_BREAKPOINT
,
564 mDebuggerPrivate
.StatusFlags
&= ~EFI_DEBUG_FLAG_EBC_B_STEPOVER
;
567 // Check FramePtr for StepOut
569 if (mDebuggerPrivate
.StepContext
.BreakAddress
== (UINT64
)(UINTN
)VmPtr
->FramePtr
) {
570 mDebuggerPrivate
.StatusFlags
= EFI_DEBUG_FLAG_EBC_STEPOUT
;
571 mDebuggerPrivate
.StepContext
.BreakAddress
= 0;
572 mDebuggerPrivate
.StepContext
.FramePointer
= 0;
573 EbcDebugSignalException (
574 EXCEPT_EBC_BREAKPOINT
,
578 mDebuggerPrivate
.StatusFlags
&= ~EFI_DEBUG_FLAG_EBC_B_STEPOUT
;
581 // Check Flags for BreakOnKey
583 if (mDebuggerPrivate
.StatusFlags
== EFI_DEBUG_FLAG_EBC_BOK
) {
585 // Only break when the current TPL <= TPL_APPLICATION
587 CurrentTpl
= gBS
->RaiseTPL (TPL_HIGH_LEVEL
);
588 gBS
->RestoreTPL (CurrentTpl
);
589 if (CurrentTpl
<= TPL_APPLICATION
) {
590 EbcDebugSignalException (
591 EXCEPT_EBC_BREAKPOINT
,
595 mDebuggerPrivate
.StatusFlags
&= ~EFI_DEBUG_FLAG_EBC_B_BOK
;
603 The hook in EbcExecute, after ExecuteFunction.
604 It will record StepOut Entry if need.
606 @param VmPtr - pointer to VM context.
610 EbcDebuggerHookExecuteEnd (
617 // Use FramePtr as checkpoint for StepOut
619 CopyMem (&Address
, (VOID
*)((UINTN
)VmPtr
->FramePtr
), sizeof(Address
));
620 EbcDebuggerPushStepEntry (Address
, (UINT64
)(UINTN
)VmPtr
->FramePtr
, EFI_DEBUG_FLAG_EBC_STEPOUT
);
627 The hook in ExecuteCALL, before move IP.
628 It will trigger Exception if BOC enabled,
629 and record Callstack, and trace information.
631 @param VmPtr - pointer to VM context.
635 EbcDebuggerHookCALLStart (
639 EbcDebuggerCheckHookFlag (VmPtr
, EFI_DEBUG_FLAG_EBC_BOC
);
640 EbcDebuggerPushCallstackSource ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcCall
);
641 EbcDebuggerPushCallstackParameter ((UINT64
)(UINTN
)VmPtr
->Gpr
[0], EfiDebuggerBranchTypeEbcCall
);
642 EbcDebuggerPushTraceSourceEntry ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcCall
);
648 The hook in ExecuteCALL, after move IP.
649 It will record Callstack, trace information
650 and record StepOver/StepOut Entry if need.
652 @param VmPtr - pointer to VM context.
656 EbcDebuggerHookCALLEnd (
663 EbcDebuggerPushCallstackDest ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcCall
);
664 EbcDebuggerPushTraceDestEntry ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcCall
);
669 CopyMem (&FramePtr
, (VOID
*)((UINTN
)VmPtr
->FramePtr
), sizeof(FramePtr
));
672 // Use ReturnAddress as checkpoint for StepOver
674 CopyMem (&Address
, (VOID
*)(UINTN
)VmPtr
->Gpr
[0], sizeof(Address
));
675 EbcDebuggerPushStepEntry (Address
, FramePtr
, EFI_DEBUG_FLAG_EBC_STEPOVER
);
678 // Use FramePtr as checkpoint for StepOut
681 CopyMem (&Address
, (VOID
*)(FramePtr
), sizeof(UINTN
));
682 EbcDebuggerPushStepEntry (Address
, FramePtr
, EFI_DEBUG_FLAG_EBC_STEPOUT
);
689 The hook in ExecuteCALL, before call EbcLLCALLEX.
690 It will trigger Exception if BOCX enabled,
691 and record Callstack information.
693 @param VmPtr - pointer to VM context.
697 EbcDebuggerHookCALLEXStart (
701 EbcDebuggerCheckHookFlag (VmPtr
, EFI_DEBUG_FLAG_EBC_BOCX
);
702 // EbcDebuggerPushCallstackSource ((UINT64)(UINTN)VmPtr->Ip, EfiDebuggerBranchTypeEbcCallEx);
703 // EbcDebuggerPushCallstackParameter ((UINT64)(UINTN)VmPtr->R[0], EfiDebuggerBranchTypeEbcCallEx);
704 EbcDebuggerPushTraceSourceEntry ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcCallEx
);
710 The hook in ExecuteCALL, after call EbcLLCALLEX.
711 It will record trace information.
713 @param VmPtr - pointer to VM context.
717 EbcDebuggerHookCALLEXEnd (
721 // EbcDebuggerPushCallstackDest ((UINT64)(UINTN)VmPtr->Ip, EfiDebuggerBranchTypeEbcCallEx);
722 EbcDebuggerPushTraceDestEntry ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcCallEx
);
728 The hook in ExecuteRET, before move IP.
729 It will trigger Exception if BOR enabled,
730 and record Callstack, and trace information.
732 @param VmPtr - pointer to VM context.
736 EbcDebuggerHookRETStart (
740 EbcDebuggerCheckHookFlag (VmPtr
, EFI_DEBUG_FLAG_EBC_BOR
);
741 EbcDebuggerPopCallstack ();
742 EbcDebuggerPushTraceSourceEntry ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcRet
);
748 The hook in ExecuteRET, after move IP.
749 It will record trace information.
751 @param VmPtr - pointer to VM context.
755 EbcDebuggerHookRETEnd (
759 EbcDebuggerPushTraceDestEntry ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcRet
);
765 The hook in ExecuteJMP, before move IP.
766 It will record trace information.
768 @param VmPtr - pointer to VM context.
772 EbcDebuggerHookJMPStart (
776 EbcDebuggerPushTraceSourceEntry ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcJmp
);
782 The hook in ExecuteJMP, after move IP.
783 It will record trace information.
785 @param VmPtr - pointer to VM context.
789 EbcDebuggerHookJMPEnd (
793 EbcDebuggerPushTraceDestEntry ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcJmp
);
799 The hook in ExecuteJMP8, before move IP.
800 It will record trace information.
802 @param VmPtr - pointer to VM context.
806 EbcDebuggerHookJMP8Start (
810 EbcDebuggerPushTraceSourceEntry ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcJmp8
);
816 The hook in ExecuteJMP8, after move IP.
817 It will record trace information.
819 @param VmPtr - pointer to VM context.
823 EbcDebuggerHookJMP8End (
827 EbcDebuggerPushTraceDestEntry ((UINT64
)(UINTN
)VmPtr
->Ip
, EfiDebuggerBranchTypeEbcJmp8
);