blob: 2d2201da9286c42f5253daa9d7fa2dfe30071724 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007-2021 Wind River Systems, Inc. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* Contributors:
* Wind River Systems - initial API and implementation
*******************************************************************************/
package org.eclipse.tcf.services;
import java.util.Collection;
import java.util.Map;
import org.eclipse.tcf.protocol.IService;
import org.eclipse.tcf.protocol.IToken;
/**
* Run Control service provides basic run control operations for execution contexts on a target.
*
* @noimplement This interface is not intended to be implemented by clients.
*/
public interface IRunControl extends IService {
/**
* This service name, as it appears on the wire - a TCF name of the service.
*/
static final String NAME = "RunControl";
/* Context property names ---------------------------------------------- */
static final String
/** Run control context ID */
PROP_ID = "ID",
/** Context parent (owner) ID, for a thread it is same as process ID */
PROP_PARENT_ID = "ParentID",
/** Context process (memory space) ID */
PROP_PROCESS_ID = "ProcessID",
/** ID of a context that created this context */
PROP_CREATOR_ID = "CreatorID",
/** Human readable context name */
PROP_NAME = "Name",
/** true if the context is a container. Container can propagate run control commands to his children */
PROP_IS_CONTAINER = "IsContainer",
/** true if context has execution state - can be suspended/resumed */
PROP_HAS_STATE = "HasState",
/** Bit-set of RM_ values that are supported by the context */
PROP_CAN_RESUME = "CanResume",
/** Bit-set of RM_ values that can be used with count > 1 */
PROP_CAN_COUNT = "CanCount",
/** true if suspend command is supported by the context */
PROP_CAN_SUSPEND = "CanSuspend",
/** true if terminate command is supported by the context */
PROP_CAN_TERMINATE = "CanTerminate",
/** true if detach command is supported by the context */
PROP_CAN_DETACH = "CanDetach",
/** Context ID of a run control group that contains the context.
* Members of same group are always suspended and resumed together:
* resuming/suspending a context resumes/suspends all members of the group */
PROP_RC_GROUP = "RCGroup",
/** Context ID of a breakpoints group that contains the context.
* Members of same group share same breakpoint instances:
* a breakpoint is planted once for the group, no need to plant
* the breakpoint for each member of the group */
PROP_BP_GROUP = "BPGroup",
/** Context ID of a symbols group that contains the context.
* Members of a symbols group share same symbol reader configuration settings,
* like user defined memory map entries and source lookup info */
PROP_SYMBOLS_GROUP = "SymbolsGroup";
/** @since 1.3 */
static final String
/** Array of String, the access types allowed for this context
* when accessing context registers.
*/
PROP_REG_ACCESS_TYPES = "RegAccessTypes";
/**
* Values of "RegAccessTypes".
* @since 1.3
*/
static final String
REG_ACCESS_RD_RUNNING = "rd-running", /** Context supports reading registers while running */
REG_ACCESS_WR_RUNNUNG = "wr-running"; /** Context supports writing registers while running */
/**
* Values of "RegAccessTypes".
* @since 1.4
*/
static final String
REG_ACCESS_RD_STOP = "rd-stop", /** Debugger should stop the context to read registers */
REG_ACCESS_WR_STOP = "wr-stop"; /** Debugger should stop the context to write registers */
/**
* Context resume modes.
*/
static final int
RM_RESUME = 0,
/**
* Step over a single instruction.
* If the instruction is a function call then don't stop until the function returns.
*/
RM_STEP_OVER = 1,
/**
* Step a single instruction.
* If the instruction is a function call then stop at first instruction of the function.
*/
RM_STEP_INTO = 2,
/**
* Step over a single source code line.
* If the line contains a function call then don't stop until the function returns.
*/
RM_STEP_OVER_LINE = 3,
/**
* Step a single source code line.
* If the line contains a function call then stop at first line of the function.
*/
RM_STEP_INTO_LINE = 4,
/**
* Run until control returns from current function.
*/
RM_STEP_OUT = 5,
/**
* Start running backwards.
* Execution will continue until suspended by command or breakpoint.
*/
RM_REVERSE_RESUME = 6,
/**
* Reverse of RM_STEP_OVER - run backwards over a single instruction.
* If the instruction is a function call then don't stop until get out of the function.
*/
RM_REVERSE_STEP_OVER = 7,
/**
* Reverse of RM_STEP_INTO.
* This effectively "un-executes" the previous instruction
*/
RM_REVERSE_STEP_INTO = 8,
/**
* Reverse of RM_STEP_OVER_LINE.
* Resume backward execution of given context until control reaches an instruction that belongs
* to a different source line.
* If the line contains a function call then don't stop until get out of the function.
* Error is returned if line number information not available.
*/
RM_REVERSE_STEP_OVER_LINE = 9,
/**
* Reverse of RM_STEP_INTO_LINE,
* Resume backward execution of given context until control reaches an instruction that belongs
* to a different line of source code.
* If a function is called, stop at the beginning of the last line of the function code.
* Error is returned if line number information not available.
*/
RM_REVERSE_STEP_INTO_LINE = 10,
/**
* Reverse of RM_STEP_OUT.
* Resume backward execution of the given context until control reaches the point where the current function was called.
*/
RM_REVERSE_STEP_OUT = 11,
/**
* Step over instructions until PC is outside the specified range.
* Any function call within the range is considered to be in range.
*/
RM_STEP_OVER_RANGE = 12,
/**
* Step instruction until PC is outside the specified range for any reason.
*/
RM_STEP_INTO_RANGE = 13,
/**
* Reverse of RM_STEP_OVER_RANGE
*/
RM_REVERSE_STEP_OVER_RANGE = 14,
/**
* Reverse of RM_STEP_INTO_RANGE
*/
RM_REVERSE_STEP_INTO_RANGE = 15,
/**
* Run until the context becomes active - scheduled to run on a target CPU
*/
RM_UNTIL_ACTIVE = 16,
/**
* Run reverse until the context becomes active
*/
RM_REVERSE_UNTIL_ACTIVE = 17;
/**
* State change reason of a context.
* Reason can be any text, but if it is one of predefined strings,
* a generic client might be able to handle it better.
*/
static final String
/** Context suspended by suspend command */
REASON_USER_REQUEST = "Suspended",
/** Context suspended by step command */
REASON_STEP = "Step",
/** Context suspended by breakpoint */
REASON_BREAKPOINT = "Breakpoint",
/** Context suspended by exception */
REASON_EXCEPTION = "Exception",
/** Context suspended as part of container */
REASON_CONTAINER = "Container",
/** Context suspended by watchpoint (data breakpoint) */
REASON_WATCHPOINT = "Watchpoint",
/** Context suspended because it received a signal */
REASON_SIGNAL = "Signal",
/** Context suspended because a shared library is loaded or unloaded */
REASON_SHAREDLIB = "Shared Library",
/** Context suspended because of an error in execution environment */
REASON_ERROR = "Error";
/* Optional parameters of context state -------------------------------- */
/**
* Context state parameter:
* Integer - signal that caused the context to become suspended.
*/
static final String STATE_SIGNAL = "Signal";
/**
* Context state parameter:
* String - name of the signal that caused the context to become suspended.
*/
static final String STATE_SIGNAL_NAME = "SignalName";
/**
* Context state parameter:
* String - description of the signal that caused the context to become suspended.
*/
static final String STATE_SIGNAL_DESCRIPTION = "SignalDescription";
/**
* Context state parameter:
* Array of string - IDs of breakpoints that were triggered by the context.
*/
static final String STATE_BREAKPOINT_IDS = "BPs";
/**
* Context state parameter:
* Object - error report that describes a reason why program counter of the context is not available.
*/
static final String STATE_PC_ERROR = "PCError";
/**
* Context state parameter:
* Object - error report if last stepping operation failed to reach its destination.
* @since 1.2
*/
static final String STATE_STEP_ERROR = "StepError";
/**
* Context state parameter:
* Boolean - true if the context is stopped by a function call injection.
* @since 1.2
*/
static final String STATE_FUNC_CALL = "FuncCall";
/**
* Context state parameter:
* Boolean - true if the context is running in reverse.
*/
static final String STATE_REVERSING = "Reversing";
/**
* Context state parameter:
* String - name of a context that owns this context.
*/
static final String STATE_CONTEXT = "Context";
/**
* Context state parameter:
* String - name of CPU that is executing the context.
*/
static final String STATE_CPU = "CPU";
/**
* Context state parameter:
* String - name of current state if other than "Running", for example: "Sleeping", "Reset", "No Clock".
*/
static final String STATE_NAME = "StateName";
/* Optional parameters of resume command ------------------------------- */
/**
* Resume command parameter:
* Integer - starting address of step range, inclusive.
*/
static final String RP_RANGE_START = "RangeStart";
/**
* Resume command parameter:
* Integer - ending address of step range, exclusive.
*/
static final String RP_RANGE_END = "RangeEnd";
/**
* Resume command parameter:
* Boolean - allow to stop in a hidden code during stepping.
* @since 1.4
*/
static final String RP_STEP_INTO_HIDDEN = "StepIntoHidden";
/* Commands ------------------------------------------------------------ */
/**
* Retrieve context properties for given context ID.
*
* @param id - context ID.
* @param done - callback interface called when operation is completed.
*/
IToken getContext(String id, DoneGetContext done);
/**
* Client callback interface for getContext().
*/
interface DoneGetContext {
/**
* Called when context data retrieval is done.
* @param error - error description if operation failed, null if succeeded.
* @param context - context data.
*/
void doneGetContext(IToken token, Exception error, RunControlContext context);
}
/**
* Retrieve children of given context.
*
* @param parent_context_id - parent context ID. Can be null -
* to retrieve top level of the hierarchy, or one of context IDs retrieved
* by previous getContext or getChildren commands.
* @param done - callback interface called when operation is completed.
*/
IToken getChildren(String parent_context_id, DoneGetChildren done);
/**
* Client callback interface for getChildren().
*/
interface DoneGetChildren {
/**
* Called when context list retrieval is done.
* @param error - error description if operation failed, null if succeeded.
* @param context_ids - array of available context IDs.
*/
void doneGetChildren(IToken token, Exception error, String[] context_ids);
}
/**
* A context corresponds to an execution thread, process, address space, etc.
* A context can belong to a parent context. Contexts hierarchy can be simple
* plain list or it can form a tree. It is up to target agent developers to choose
* layout that is most descriptive for a given target. Context IDs are valid across
* all services. In other words, all services access same hierarchy of contexts,
* with same IDs, however, each service accesses its own subset of context's
* attributes and functionality, which is relevant to that service.
* @noimplement This interface is not intended to be implemented by clients.
*/
interface RunControlContext {
/**
* Get context properties. See PROP_* definitions for property names.
* Context properties are read only, clients should not try to modify them.
* @return Map of context properties.
*/
Map<String,Object> getProperties();
/**
* Retrieve context ID.
* Same as getProperties().get("ID")
*/
String getID();
/**
* Retrieve parent context ID.
* Same as getProperties().get("ParentID")
*/
String getParentID();
/**
* Retrieve context process ID.
* Same as getProperties().get("ProcessID")
*/
String getProcessID();
/**
* Retrieve context creator ID.
* Same as getProperties().get("CreatorID")
*/
String getCreatorID();
/**
* Retrieve human readable context name.
* Same as getProperties().get("Name")
*/
String getName();
/**
* Utility method to read context property PROP_IS_CONTAINER.
* Executing resume or suspend command on a container causes all its children to resume or suspend.
* @return value of PROP_IS_CONTAINER.
*/
boolean isContainer();
/**
* Utility method to read context property PROP_HAS_STATE.
* Only context that has a state can be resumed or suspended.
* @return value of PROP_HAS_STATE.
*/
boolean hasState();
/**
* Utility method to read context property PROP_CAN_SUSPEND.
* Value 'true' means suspend command is supported by the context,
* however the method does not check that the command can be executed successfully in
* the current state of the context. For example, the command still can fail if context is
* already suspended.
* @return value of PROP_CAN_SUSPEND.
*/
boolean canSuspend();
/**
* Utility method to read a 'mode' bit in context property PROP_CAN_RESUME.
* Value 'true' means resume command is supported by the context,
* however the method does not check that the command can be executed successfully in
* the current state of the context. For example, the command still can fail if context is
* already resumed.
* @param mode - resume mode, see RM_*.
* @return value of requested bit of PROP_CAN_RESUME.
*/
boolean canResume(int mode);
/**
* Utility method to read a 'mode' bit in context property PROP_CAN_COUNT.
* Value 'true' means resume command with count other then 1 is supported by the context,
* however the method does not check that the command can be executed successfully in
* the current state of the context. For example, the command still can fail if context is
* already resumed.
* @param mode - resume mode, see RM_*.
* @return value of requested bit of PROP_CAN_COUNT.
*/
boolean canCount(int mode);
/**
* Utility method to read context property PROP_CAN_TERMINATE.
* Value 'true' means terminate command is supported by the context,
* however the method does not check that the command can be executed successfully in
* the current state of the context. For example, the command still can fail if the context
* already has exited.
* @return value of PROP_CAN_TERMINATE.
*/
boolean canTerminate();
/**
* Utility method to read context property PROP_CAN_DETACH.
* Value 'true' means detach command is supported by the context,
* however the method does not check that the command can be executed successfully in
* the current state of the context. For example, the command still can fail if the context
* already has exited.
* @return value of PROP_CAN_DETACH.
*/
boolean canDetach();
/**
* Utility method to read context property PROP_RC_GROUP -
* context ID of a run control group that contains the context.
* Members of same group are always suspended and resumed together:
* resuming/suspending a context resumes/suspends all members of the group.
* @return value of PROP_RC_GROUP.
*/
String getRCGroup();
/**
* Utility method to read context property PROP_BP_GROUP -
* context ID of a breakpoints group that contains the context.
* Members of same group share same breakpoint instances:
* a breakpoint is planted once for the group, no need to plant
* the breakpoint for each member of the group
* @return value of PROP_BP_GROUP or null if the context does not support breakpoints.
*/
String getBPGroup();
/**
* Utility method to read context property PROP_SYMBOLS_GROUP -
* context ID of a symbols group that contains the context.
* Members of a symbols group share same symbol reader configuration settings,
* like user defined memory map entries and source lookup info.
* @return value of PROP_SYMBOLS_GROUP or null if the context is not a member of a symbols group.
*/
String getSymbolsGroup();
/**
* Get the register access types allowed for this context.
* @return collection of access type names.
* @since 1.3
*/
Collection<String> getRegAccessTypes();
/**
* Send a command to retrieve current state of a context.
* @param done - command result call back object.
* @return pending command handle, can be used to cancel the command.
*/
IToken getState(DoneGetState done);
/**
* Send a command to retrieve current state of a context.
* Similar to getState, but does not retrieve PC.
* With some targets, it can be substantially faster.
* @param done - command result call back object.
* @return pending command handle, can be used to cancel the command.
*/
IToken getMinState(DoneGetMinState done);
/**
* Send a command to suspend a context.
* Also suspends children if context is a container.
* @param done - command result call back object.
* @return pending command handle, can be used to cancel the command.
*/
IToken suspend(DoneCommand done);
/**
* Send a command to resume a context.
* Also resumes children if context is a container.
* @param mode - defines how to resume the context, see RM_*.
* @param count - if mode implies stepping, defines how many steps to perform.
* @param done - command result call back object.
* @return pending command handle, can be used to cancel the command.
*/
IToken resume(int mode, int count, DoneCommand done);
/**
* Send a command to resume a context.
* Also resumes children if context is a container.
* @param mode - defines how to resume the context, see RM_*.
* @param count - if mode implies stepping, defines how many steps to perform.
* @param params - resume parameters, for example, step range definition, see RP_*.
* @param done - command result call back object.
* @return pending command handle, can be used to cancel the command.
*/
IToken resume(int mode, int count, Map<String,Object> params, DoneCommand done);
/**
* Send a command to terminate a context.
* @param done - command result call back object.
* @return pending command handle, can be used to cancel the command.
*/
IToken terminate(DoneCommand done);
/**
* Send a command to detach a context.
* @param done - command result call back object.
* @return pending command handle, can be used to cancel the command.
*/
IToken detach(DoneCommand done);
}
interface DoneGetState {
/**
* Called when getState command execution is complete.
* @param token - pending command handle.
* @param error - command execution error or null.
* @param suspended - true if the context is suspended
* @param pc - program counter of the context (if suspended).
* @param reason - suspend reason (if suspended), see REASON_*.
* @param params - additional target specific data about context state, see STATE_*.
*/
void doneGetState(IToken token, Exception error, boolean suspended, String pc,
String reason, Map<String,Object> params);
}
interface DoneGetMinState {
/**
* Called when getMinState command execution is complete.
* @param token - pending command handle.
* @param error - command execution error or null.
* @param suspended - true if the context is suspended
* @param reason - suspend reason (if suspended), see REASON_*.
* @param params - additional target specific data about context state, see STATE_*.
*/
void doneGetMinState(IToken token, Exception error, boolean suspended,
String reason, Map<String,Object> params);
}
interface DoneCommand {
/**
* Called when run control command execution is complete.
* @param token - pending command handle.
* @param error - command execution error or null.
*/
void doneCommand(IToken token, Exception error);
}
/**
* Add run control event listener.
* @param listener - run control event listener to add.
*/
void addListener(RunControlListener listener);
/**
* Remove run control event listener.
* @param listener - run control event listener to remove.
*/
void removeListener(RunControlListener listener);
/**
* Service events listener interface.
*/
interface RunControlListener {
/**
* Called when new contexts are created.
* @param contexts - array of new context properties.
*/
void contextAdded(RunControlContext contexts[]);
/**
* Called when a context properties changed.
* @param contexts - array of new context properties.
*/
void contextChanged(RunControlContext contexts[]);
/**
* Called when contexts are removed.
* @param context_ids - array of removed context IDs.
*/
void contextRemoved(String context_ids[]);
/**
* Called when a thread is suspended.
* @param context - ID of a context that was suspended.
* @param pc - program counter of the context, can be null.
* @param reason - human readable description of suspend reason.
* @param params - additional, target specific data about suspended context.
*/
void contextSuspended(String context, String pc,
String reason, Map<String,Object> params);
/**
* Called when a thread is resumed.
* @param context - ID of a context that was resumed.
*/
void contextResumed(String context);
/**
* Called when target simultaneously suspends multiple threads in a container
* (process, core, etc.).
*
* @param context - ID of a context responsible for the event. It can be container ID or
* any one of container children, for example, it can be thread that hit "suspend all" breakpoint.
* Client expected to move focus (selection) to this context.
* @param pc - program counter of the context.
* @param reason - suspend reason, see REASON_*.
* @param params - additional target specific data about context state, see STATE_*.
* @param suspended_ids - full list of all contexts that were suspended.
*/
void containerSuspended(String context, String pc,
String reason, Map<String,Object> params, String[] suspended_ids);
/**
* Called when target simultaneously resumes multiple threads in a container (process,
* core, etc.).
*
* @param context_ids - full list of all contexts that were resumed.
*/
void containerResumed(String[] context_ids);
/**
* Called when an exception is detected in a target thread.
* @param context - ID of a context that caused an exception.
* @param msg - human readable description of the exception.
*/
void contextException(String context, String msg);
}
/**
* Service events listener interface - extended.
*/
interface RunControlListenerV1 extends RunControlListener {
/**
* Called when context state changes and the context is not and was not in suspended state.
* Changes to and from suspended state should be reported by other events:
* contextSuspended, contextResumed, containerSuspended, containerResumed.
* @param context - ID of a context that changed state.
*/
void contextStateChanged(String context);
}
}