CloverBootloader/MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbCmdStep.c
2019-09-03 12:58:42 +03:00

157 lines
3.5 KiB
C

/** @file
Copyright (c) 2007, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include "Edb.h"
/**
Check whether current IP is EBC CALL instruction (NOTE: CALLEX is exclusive)
@param Address - EBC IP address.
@retval TRUE - Current IP is EBC CALL instruction
@retval FALSE - Current IP is not EBC CALL instruction
**/
BOOLEAN
IsEBCCALL (
IN UINTN Address
)
{
if (GET_OPCODE(Address) != OPCODE_CALL) {
return FALSE;
}
if (GET_OPERANDS (Address) & OPERAND_M_NATIVE_CALL) {
return FALSE;
} else {
return TRUE;
}
}
/**
Check whether current IP is EBC RET instruction.
@param Address - EBC IP address.
@retval TRUE - Current IP is EBC RET instruction
@retval FALSE - Current IP is not EBC RET instruction
**/
BOOLEAN
IsEBCRET (
IN UINTN Address
)
{
if (GET_OPCODE(Address) != OPCODE_RET) {
return FALSE;
}
if (GET_OPERANDS (Address) != 0) {
return FALSE;
} else {
return TRUE;
}
}
/**
DebuggerCommand - StepInto.
@param CommandArg - The argument for this command
@param DebuggerPrivate - EBC Debugger private data structure
@param ExceptionType - Exception type.
@param SystemContext - EBC system context.
@retval EFI_DEBUG_CONTINUE - formal return value
**/
EFI_DEBUG_STATUS
DebuggerStepInto (
IN CHAR16 *CommandArg,
IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,
IN EFI_EXCEPTION_TYPE ExceptionType,
IN OUT EFI_SYSTEM_CONTEXT SystemContext
)
{
SystemContext.SystemContextEbc->Flags |= VMFLAGS_STEP;
return EFI_DEBUG_BREAK;
}
/**
DebuggerCommand - StepOver.
@param CommandArg - The argument for this command
@param DebuggerPrivate - EBC Debugger private data structure
@param ExceptionType - Exception type.
@param SystemContext - EBC system context.
@retval EFI_DEBUG_CONTINUE - formal return value
**/
EFI_DEBUG_STATUS
DebuggerStepOver (
IN CHAR16 *CommandArg,
IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,
IN EFI_EXCEPTION_TYPE ExceptionType,
IN OUT EFI_SYSTEM_CONTEXT SystemContext
)
{
if (IsEBCCALL((UINTN)SystemContext.SystemContextEbc->Ip)) {
//
// Check CALL (NOTE: CALLEX is exclusive)
//
DebuggerPrivate->FeatureFlags |= EFI_DEBUG_FLAG_EBC_STEPOVER;
} else {
//
// Other instruction including CALLEX
//
SystemContext.SystemContextEbc->Flags |= VMFLAGS_STEP;
}
return EFI_DEBUG_BREAK;
}
/**
DebuggerCommand - StepOut.
@param CommandArg - The argument for this command
@param DebuggerPrivate - EBC Debugger private data structure
@param ExceptionType - Exception type.
@param SystemContext - EBC system context.
@retval EFI_DEBUG_CONTINUE - formal return value
**/
EFI_DEBUG_STATUS
DebuggerStepOut (
IN CHAR16 *CommandArg,
IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,
IN EFI_EXCEPTION_TYPE ExceptionType,
IN OUT EFI_SYSTEM_CONTEXT SystemContext
)
{
if (IsEBCRET((UINTN)SystemContext.SystemContextEbc->Ip)) {
//
// Check RET
//
SystemContext.SystemContextEbc->Flags |= VMFLAGS_STEP;
} else {
//
// Other instruction
//
DebuggerPrivate->FeatureFlags |= EFI_DEBUG_FLAG_EBC_STEPOUT;
}
return EFI_DEBUG_BREAK;
}