diff options
Diffstat (limited to 'context.h')
-rw-r--r-- | context.h | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/context.h b/context.h new file mode 100644 index 00000000..802e9f7d --- /dev/null +++ b/context.h @@ -0,0 +1,136 @@ +/******************************************************************************* + * 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 |