/** The hook in ExecuteCALL, after move IP. It will record Callstack, trace information and record StepOver/StepOut Entry if need. @param VmPtr - pointer to VM context. **/ VOID EbcDebuggerHookCALLEnd ( IN VM_CONTEXT *VmPtr ) { UINT64 Address; UINTN FramePtr; EbcDebuggerPushCallstackDest ((UINT64)(UINTN)VmPtr->Ip, EfiDebuggerBranchTypeEbcCall); EbcDebuggerPushTraceDestEntry ((UINT64)(UINTN)VmPtr->Ip, EfiDebuggerBranchTypeEbcCall); // // Get Old FramePtr // CopyMem (&FramePtr, (VOID *)((UINTN)VmPtr->FramePtr), sizeof(FramePtr)); // // Use ReturnAddress as checkpoint for StepOver // CopyMem (&Address, (VOID *)(UINTN)VmPtr->Gpr[0], sizeof(Address)); EbcDebuggerPushStepEntry (Address, FramePtr, EFI_DEBUG_FLAG_EBC_STEPOVER); // // Use FramePtr as checkpoint for StepOut // Address = 0; CopyMem (&Address, (VOID *)(FramePtr), sizeof(UINTN)); EbcDebuggerPushStepEntry (Address, FramePtr, EFI_DEBUG_FLAG_EBC_STEPOUT); return ; }
/** The hook in EbcExecute, after ExecuteFunction. It will record StepOut Entry if need. @param VmPtr - pointer to VM context. **/ VOID EbcDebuggerHookExecuteEnd ( IN VM_CONTEXT *VmPtr ) { UINTN Address; // // Use FramePtr as checkpoint for StepOut // CopyMem (&Address, (VOID *)((UINTN)VmPtr->FramePtr), sizeof(Address)); EbcDebuggerPushStepEntry (Address, (UINT64)(UINTN)VmPtr->FramePtr, EFI_DEBUG_FLAG_EBC_STEPOUT); return ; }