blob: 802e9f7d4a6508bdb97671f01e5a67130460769d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007 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 v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Wind River Systems - initial API and implementation
*******************************************************************************/
/*
* This module handles process/thread OS contexts and their state machine.
*/
#ifndef D_context
#define D_context
#include <sys/types.h>
#include "mdep.h"
#include "link.h"
extern LINK context_root;
#define ctxl2ctxp(A) ((Context *)((char *)(A) - (int)&((Context *)0)->ctxl))
#define pidl2ctxp(A) ((Context *)((char *)(A) - (int)&((Context *)0)->pidl))
#define cldl2ctxp(A) ((Context *)((char *)(A) - (int)&((Context *)0)->cldl))
typedef struct Context Context;
struct Context {
LINK ctxl;
LINK pidl;
LINK cldl;
LINK children;
Context * parent;
unsigned int ref_count; /* reference count, see context_lock() and context_unlock() */
pid_t pid; /* process or thread identifier */
pid_t mem; /* context memory space identifier */
int stopped; /* OS kernel has stopped this context */
int stopped_by_bp; /* stopped by breakpoint */
int exiting; /* context is about to exit */
int exited; /* context exited */
int intercepted; /* context is reported to a host as suspended */
int pending_step; /* context is executing single instruction step */
int pending_intercept; /* host is waiting for this context to be suspended */
int pending_safe_event; /* safe events are waiting for this context to be stopped */
unsigned long pending_signals; /* bitset of signals that were received, but not handled yet */
int signal; /* signal that stopped this context */
int event; /* tracing event code when signal is SIGTRAP */
REG_SET regs; /* copy of context registers, updated when context stops */
int regs_error; /* if not 0, 'regs' is invalid */
int regs_dirty; /* if not 0, 'regs' is modified and needs to be saved before context is continued */
void * stack_trace;
int trace_flags;
#if defined(_WRS_KERNEL)
VXDBG_BP_INFO bp_info; /* breakpoint information */
pid_t bp_pid; /* process or thread that hit breakpoint */
#endif
};
extern void ini_contexts(void);
extern char * event_name(int event);
extern char * signal_name(int signal);
extern char * context_state_name(Context * ctx);
/*
* Convert PID to TCF Context ID
*/
extern char * pid2id(pid_t pid, pid_t parent);
/*
* Get context thread ID
*/
extern char * thread_id(Context * ctx);
/*
* Get context container ID
*/
extern char * container_id(Context * ctx);
/*
* Convert TCF Context ID to PID
*/
extern pid_t id2pid(char * id, pid_t * parent);
/*
* Search Context record by TCF Context ID
*/
extern Context * id2ctx(char * id);
/*
* Find a context by PID
*/
extern Context * context_find_from_pid(pid_t pid);
/*
* Start tracing of a process.
*/
extern int context_attach(pid_t pid, Context ** ctx);
/*
* Increment reference counter of Context object.
* While ref count > 0 object will not be deleted even when context exits.
*/
extern void context_lock(Context * ctx);
/*
* Decrement reference counter.
* If ref count == 0, delete Context object.
*/
extern void context_unlock(Context * ctx);
extern int context_stop(Context * ctx);
extern int context_continue(Context * ctx);
extern int context_single_step(Context * ctx);
extern int context_write_mem(Context * ctx, unsigned long address, void * buf, size_t size);
extern int context_read_mem(Context * ctx, unsigned long address, void * buf, size_t size);
typedef struct ContextEventListener {
void (*context_created)(Context * ctx);
void (*context_exited)(Context * ctx);
void (*context_stopped)(Context * ctx);
void (*context_started)(Context * ctx);
void (*context_changed)(Context * ctx);
struct ContextEventListener * next;
} ContextEventListener;
extern void add_context_event_listener(ContextEventListener * listener);
#ifdef _WRS_KERNEL
extern VXDBG_CLNT_ID vxdbg_clnt_id;
#endif
#endif