source: mainline/kernel/generic/include/udebug/udebug.h@ 03333bc

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 03333bc was a074b4f, checked in by Jiri Svoboda <jiri@…>, 16 years ago

Implement fault notifications and task monitoring service.

  • Property mode set to 100644
File size: 6.4 KB
Line 
1/*
2 * Copyright (c) 2008 Jiri Svoboda
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @addtogroup generic
30 * @{
31 */
32/** @file
33 */
34
35#ifndef KERN_UDEBUG_H_
36#define KERN_UDEBUG_H_
37
38#include <ipc/ipc.h>
39
40typedef enum { /* udebug_method_t */
41
42/** Start debugging the recipient.
43 * Causes all threads in the receiving task to stop. When they
44 * are all stoped, an answer with retval 0 is generated.
45 */
46UDEBUG_M_BEGIN = 1,
47
48/** Finish debugging the recipient.
49 * Answers all pending GO and GUARD messages.
50 */
51UDEBUG_M_END,
52
53/** Set which events should be captured.
54 */
55UDEBUG_M_SET_EVMASK,
56
57/** Make sure the debugged task is still there.
58 * This message is answered when the debugged task dies
59 * or the debugging session ends.
60 */
61UDEBUG_M_GUARD,
62
63/** Run a thread until a debugging event occurs.
64 * This message is answered when the thread stops
65 * in a debugging event.
66 *
67 * - ARG2 - id of the thread to run
68 */
69UDEBUG_M_GO,
70
71/** Stop a thread being debugged.
72 * Creates a special STOP event in the thread, causing
73 * it to answer a pending GO message (if any).
74 */
75UDEBUG_M_STOP,
76
77/** Read arguments of a syscall.
78 *
79 * - ARG2 - thread identification
80 * - ARG3 - destination address in the caller's address space
81 *
82 */
83UDEBUG_M_ARGS_READ,
84
85/** Read the list of the debugged tasks's threads.
86 *
87 * - ARG2 - destination address in the caller's address space
88 * - ARG3 - size of receiving buffer in bytes
89 *
90 * The kernel fills the buffer with a series of sysarg_t values
91 * (thread ids). On answer, the kernel will set:
92 *
93 * - ARG2 - number of bytes that were actually copied
94 * - ARG3 - number of bytes of the complete data
95 *
96 */
97UDEBUG_M_THREAD_READ,
98
99/** Read the list of the debugged task's address space areas.
100 *
101 * - ARG2 - destination address in the caller's address space
102 * - ARG3 - size of receiving buffer in bytes
103 *
104 * The kernel fills the buffer with a series of as_area_info_t structures.
105 * Upon answer, the kernel will set:
106 *
107 * - ARG2 - number of bytes that were actually copied
108 * - ARG3 - number of bytes of the complete data
109 *
110 */
111UDEBUG_M_AREAS_READ,
112
113/** Read the debugged tasks's memory.
114 *
115 * - ARG2 - destination address in the caller's address space
116 * - ARG3 - source address in the recipient's address space
117 * - ARG4 - size of receiving buffer in bytes
118 *
119 */
120UDEBUG_M_MEM_READ,
121
122} udebug_method_t;
123
124
125typedef enum {
126 UDEBUG_EVENT_FINISHED = 1, /**< Debuging session has finished */
127 UDEBUG_EVENT_STOP, /**< Stopped on DEBUG_STOP request */
128 UDEBUG_EVENT_SYSCALL_B, /**< Before beginning syscall execution */
129 UDEBUG_EVENT_SYSCALL_E, /**< After finishing syscall execution */
130 UDEBUG_EVENT_THREAD_B, /**< The task created a new thread */
131 UDEBUG_EVENT_THREAD_E /**< A thread exited */
132} udebug_event_t;
133
134#define UDEBUG_EVMASK(event) (1 << ((event) - 1))
135
136typedef enum {
137 UDEBUG_EM_FINISHED = UDEBUG_EVMASK(UDEBUG_EVENT_FINISHED),
138 UDEBUG_EM_STOP = UDEBUG_EVMASK(UDEBUG_EVENT_STOP),
139 UDEBUG_EM_SYSCALL_B = UDEBUG_EVMASK(UDEBUG_EVENT_SYSCALL_B),
140 UDEBUG_EM_SYSCALL_E = UDEBUG_EVMASK(UDEBUG_EVENT_SYSCALL_E),
141 UDEBUG_EM_THREAD_B = UDEBUG_EVMASK(UDEBUG_EVENT_THREAD_B),
142 UDEBUG_EM_THREAD_E = UDEBUG_EVMASK(UDEBUG_EVENT_THREAD_E),
143 UDEBUG_EM_ALL =
144 UDEBUG_EVMASK(UDEBUG_EVENT_FINISHED) |
145 UDEBUG_EVMASK(UDEBUG_EVENT_STOP) |
146 UDEBUG_EVMASK(UDEBUG_EVENT_SYSCALL_B) |
147 UDEBUG_EVMASK(UDEBUG_EVENT_SYSCALL_E) |
148 UDEBUG_EVMASK(UDEBUG_EVENT_THREAD_B) |
149 UDEBUG_EVMASK(UDEBUG_EVENT_THREAD_E)
150} udebug_evmask_t;
151
152#ifdef KERNEL
153
154#include <synch/mutex.h>
155#include <synch/condvar.h>
156#include <arch/interrupt.h>
157#include <atomic.h>
158
159typedef enum {
160 /** Task is not being debugged */
161 UDEBUG_TS_INACTIVE,
162 /** BEGIN operation in progress (waiting for threads to stop) */
163 UDEBUG_TS_BEGINNING,
164 /** Debugger fully connected */
165 UDEBUG_TS_ACTIVE
166} udebug_task_state_t;
167
168/** Debugging part of task_t structure.
169 */
170typedef struct {
171 /** Synchronize debug ops on this task / access to this structure */
172 mutex_t lock;
173 char *lock_owner;
174
175 udebug_task_state_t dt_state;
176 call_t *begin_call;
177 int not_stoppable_count;
178 struct task *debugger;
179 udebug_evmask_t evmask;
180} udebug_task_t;
181
182/** Debugging part of thread_t structure.
183 */
184typedef struct {
185 /** Synchronize debug ops on this thread / access to this structure. */
186 mutex_t lock;
187
188 waitq_t go_wq;
189 call_t *go_call;
190 unative_t syscall_args[6];
191 istate_t *uspace_state;
192
193 /** What type of event are we stopped in or 0 if none. */
194 udebug_event_t cur_event;
195 bool go; /**< thread is GO */
196 bool stoppable; /**< thread is stoppable */
197 bool active; /**< thread is in a debugging session */
198 condvar_t active_cv;
199} udebug_thread_t;
200
201struct task;
202struct thread;
203
204void udebug_task_init(udebug_task_t *ut);
205void udebug_thread_initialize(udebug_thread_t *ut);
206
207void udebug_syscall_event(unative_t a1, unative_t a2, unative_t a3,
208 unative_t a4, unative_t a5, unative_t a6, unative_t id, unative_t rc,
209 bool end_variant);
210
211void udebug_thread_b_event_attach(struct thread *t, struct task *ta);
212void udebug_thread_e_event(void);
213
214void udebug_stoppable_begin(void);
215void udebug_stoppable_end(void);
216
217void udebug_before_thread_runs(void);
218
219int udebug_task_cleanup(struct task *ta);
220
221#endif
222
223#endif
224
225/** @}
226 */
Note: See TracBrowser for help on using the repository browser.