Subversion Repositories HelenOS

Rev

Rev 3424 | Rev 3611 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3424 Rev 3471
Line 31... Line 31...
31
 */
31
 */
32
 
32
 
33
/**
33
/**
34
 * @file
34
 * @file
35
 * @brief   Udebug IPC message handling.
35
 * @brief   Udebug IPC message handling.
-
 
36
 *
-
 
37
 * This module handles udebug IPC messages and calls the appropriate
-
 
38
 * functions from the udebug_ops module which implement them.
36
 */
39
 */
37
 
40
 
38
#include <print.h>
-
 
39
#include <proc/task.h>
41
#include <proc/task.h>
40
#include <proc/thread.h>
42
#include <proc/thread.h>
41
#include <arch.h>
43
#include <arch.h>
42
#include <errno.h>
44
#include <errno.h>
43
#include <ipc/ipc.h>
45
#include <ipc/ipc.h>
Line 114... Line 116...
114
    }
116
    }
115
 
117
 
116
    return 0;
118
    return 0;
117
}
119
}
118
 
120
 
-
 
121
/** Process a BEGIN call.
-
 
122
 *
-
 
123
 * Initiates a debugging session for the current task. The reply
-
 
124
 * to this call may or may not be sent before this function returns.
-
 
125
 *
-
 
126
 * @param call  The call structure.
-
 
127
 */
119
static void udebug_receive_begin(call_t *call)
128
static void udebug_receive_begin(call_t *call)
120
{
129
{
121
    int rc;
130
    int rc;
122
 
131
 
123
    rc = udebug_begin(call);
132
    rc = udebug_begin(call);
Line 125... Line 134...
125
        IPC_SET_RETVAL(call->data, rc);
134
        IPC_SET_RETVAL(call->data, rc);
126
        ipc_answer(&TASK->kernel_box, call);
135
        ipc_answer(&TASK->kernel_box, call);
127
        return;
136
        return;
128
    }
137
    }
129
 
138
 
-
 
139
    /*
-
 
140
     * If the initialization of the debugging session has finished,
-
 
141
     * send a reply.
-
 
142
     */
130
    if (rc != 0) {
143
    if (rc != 0) {
131
        IPC_SET_RETVAL(call->data, 0);
144
        IPC_SET_RETVAL(call->data, 0);
132
        ipc_answer(&TASK->kernel_box, call);
145
        ipc_answer(&TASK->kernel_box, call);
133
    }
146
    }
134
}
147
}
135
 
148
 
-
 
149
/** Process an END call.
-
 
150
 *
-
 
151
 * Terminates the debugging session for the current task.
-
 
152
 * @param call  The call structure.
-
 
153
 */
136
static void udebug_receive_end(call_t *call)
154
static void udebug_receive_end(call_t *call)
137
{
155
{
138
    int rc;
156
    int rc;
139
 
157
 
140
    rc = udebug_end();
158
    rc = udebug_end();
141
 
159
 
142
    IPC_SET_RETVAL(call->data, rc);
160
    IPC_SET_RETVAL(call->data, rc);
143
    ipc_answer(&TASK->kernel_box, call);
161
    ipc_answer(&TASK->kernel_box, call);
144
}
162
}
145
 
163
 
-
 
164
/** Process a SET_EVMASK call.
-
 
165
 *
-
 
166
 * Sets an event mask for the current debugging session.
-
 
167
 * @param call  The call structure.
-
 
168
 */
146
static void udebug_receive_set_evmask(call_t *call)
169
static void udebug_receive_set_evmask(call_t *call)
147
{
170
{
148
    int rc;
171
    int rc;
149
    udebug_evmask_t mask;
172
    udebug_evmask_t mask;
150
 
173
 
Line 154... Line 177...
154
    IPC_SET_RETVAL(call->data, rc);
177
    IPC_SET_RETVAL(call->data, rc);
155
    ipc_answer(&TASK->kernel_box, call);
178
    ipc_answer(&TASK->kernel_box, call);
156
}
179
}
157
 
180
 
158
 
181
 
-
 
182
/** Process a GO call.
-
 
183
 *
-
 
184
 * Resumes execution of the specified thread.
-
 
185
 * @param call  The call structure.
-
 
186
 */
159
static void udebug_receive_go(call_t *call)
187
static void udebug_receive_go(call_t *call)
160
{
188
{
161
    thread_t *t;
189
    thread_t *t;
162
    int rc;
190
    int rc;
163
 
191
 
164
    //printf("debug_go()\n");
-
 
165
 
-
 
166
    t = (thread_t *)IPC_GET_ARG2(call->data);
192
    t = (thread_t *)IPC_GET_ARG2(call->data);
167
 
193
 
168
    rc = udebug_go(t, call);
194
    rc = udebug_go(t, call);
169
    if (rc < 0) {
195
    if (rc < 0) {
170
        IPC_SET_RETVAL(call->data, rc);
196
        IPC_SET_RETVAL(call->data, rc);
171
        ipc_answer(&TASK->kernel_box, call);
197
        ipc_answer(&TASK->kernel_box, call);
172
        return;
198
        return;
173
    }
199
    }
174
}
200
}
175
 
201
 
-
 
202
/** Process a STOP call.
-
 
203
 *
-
 
204
 * Suspends execution of the specified thread.
-
 
205
 * @param call  The call structure.
-
 
206
 */
176
static void udebug_receive_stop(call_t *call)
207
static void udebug_receive_stop(call_t *call)
177
{
208
{
178
    thread_t *t;
209
    thread_t *t;
179
    int rc;
210
    int rc;
180
 
211
 
181
    printf("debug_stop()\n");
-
 
182
 
-
 
183
    t = (thread_t *)IPC_GET_ARG2(call->data);
212
    t = (thread_t *)IPC_GET_ARG2(call->data);
184
 
213
 
185
    rc = udebug_stop(t, call);
214
    rc = udebug_stop(t, call);
186
    IPC_SET_RETVAL(call->data, rc);
215
    IPC_SET_RETVAL(call->data, rc);
187
    ipc_answer(&TASK->kernel_box, call);
216
    ipc_answer(&TASK->kernel_box, call);
188
}
217
}
189
 
218
 
-
 
219
/** Process a THREAD_READ call.
-
 
220
 *
-
 
221
 * Reads the list of hashes of the (userspace) threads in the current task.
-
 
222
 * @param call  The call structure.
-
 
223
 */
190
static void udebug_receive_thread_read(call_t *call)
224
static void udebug_receive_thread_read(call_t *call)
191
{
225
{
192
    unative_t uspace_addr;
226
    unative_t uspace_addr;
193
    unative_t to_copy;
227
    unative_t to_copy;
194
    unsigned total_bytes;
228
    unsigned total_bytes;
Line 235... Line 269...
235
    call->buffer = buffer;
269
    call->buffer = buffer;
236
 
270
 
237
    ipc_answer(&TASK->kernel_box, call);
271
    ipc_answer(&TASK->kernel_box, call);
238
}
272
}
239
 
273
 
-
 
274
/** Process an ARGS_READ call.
-
 
275
 *
-
 
276
 * Reads the argument of a current syscall event (SYSCALL_B or SYSCALL_E).
-
 
277
 * @param call  The call structure.
-
 
278
 */
240
static void udebug_receive_args_read(call_t *call)
279
static void udebug_receive_args_read(call_t *call)
241
{
280
{
242
    thread_t *t;
281
    thread_t *t;
243
    unative_t uspace_addr;
282
    unative_t uspace_addr;
244
    int rc;
283
    int rc;
Line 332... Line 371...
332
    call->buffer = NULL;
371
    call->buffer = NULL;
333
 
372
 
334
    ipc_answer(&TASK->kernel_box, call);
373
    ipc_answer(&TASK->kernel_box, call);
335
}
374
}
336
 
375
 
-
 
376
/** Process an MEM_READ call.
337
 
377
 *
-
 
378
 * Reads memory of the current (debugged) task.
-
 
379
 * @param call  The call structure.
-
 
380
 */
338
static void udebug_receive_mem_read(call_t *call)
381
static void udebug_receive_mem_read(call_t *call)
339
{
382
{
340
    unative_t uspace_dst;
383
    unative_t uspace_dst;
341
    unative_t uspace_src;
384
    unative_t uspace_src;
342
    unsigned size;
385
    unsigned size;
Line 389... Line 432...
389
 
432
 
390
    ipc_answer(&TASK->kernel_box, call);
433
    ipc_answer(&TASK->kernel_box, call);
391
}
434
}
392
 
435
 
393
 
436
 
394
/**
-
 
395
 * Handle a debug call received on the kernel answerbox.
437
/** Handle a debug call received on the kernel answerbox.
396
 *
438
 *
397
 * This is called by the kbox servicing thread.
439
 * This is called by the kbox servicing thread. Verifies that the sender
-
 
440
 * is indeed the debugger and calls the appropriate processing function.
398
 */
441
 */
399
void udebug_call_receive(call_t *call)
442
void udebug_call_receive(call_t *call)
400
{
443
{
401
    int debug_method;
444
    int debug_method;
402
 
445