/** @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;
}
