Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'context.h')
-rw-r--r--context.h136
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

Back to the top