Subversion Repositories HelenOS

Rev

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

Rev 2805 Rev 2807
Line 303... Line 303...
303
    spinlock_lock(&ta->lock);
303
    spinlock_lock(&ta->lock);
304
 
304
 
305
    return ta;
305
    return ta;
306
}
306
}
307
 
307
 
-
 
308
static thread_t *get_task_thread_by_id(task_t *ta, thread_id_t tid)
-
 
309
{
-
 
310
    thread_t *t;
-
 
311
    link_t *cur;
-
 
312
 
-
 
313
    for (cur = ta->th_head.next; cur != &ta->th_head; cur = cur->next) {
-
 
314
        t = list_get_instance(cur, thread_t, th_link);     
-
 
315
        if (tid == t->tid) return t;
-
 
316
    }
-
 
317
 
-
 
318
    return NULL;
-
 
319
}
-
 
320
 
308
#include <console/klog.h>
321
#include <console/klog.h>
309
 
322
 
310
static int debug_begin(call_t *call, phone_t *phone)
323
static int debug_begin(call_t *call, phone_t *phone)
311
{
324
{
312
    task_t *ta;
325
    task_t *ta;
Line 338... Line 351...
338
 
351
 
339
    klog_printf("debug_begin() done (wait for stoppability)");
352
    klog_printf("debug_begin() done (wait for stoppability)");
340
    return 0;
353
    return 0;
341
}
354
}
342
 
355
 
343
static void debug_go(call_t *call, phone_t *phone)
356
static int debug_go(call_t *call, phone_t *phone)
344
{
357
{
345
    thread_t *t;
358
    thread_t *t;
346
    link_t *l;
-
 
347
    task_t *ta;
359
    task_t *ta;
348
 
360
 
349
    klog_printf("debug_go()");
361
    klog_printf("debug_go()");
350
    ta = get_lock_callee_task(phone);
362
    ta = get_lock_callee_task(phone);
351
 
363
 
352
    ta->debug_go_call = call;
364
    ta->debug_go_call = call;
353
 
-
 
354
    l = ta->th_head.next;
365
    t = get_task_thread_by_id(ta, IPC_GET_ARG1(call->data));
355
    if (l != &TASK->th_head) {
366
    if (t == NULL) {
356
        t = list_get_instance(l, thread_t, th_link);
-
 
357
        klog_printf("debug_go(): waitq_wakeup");
367
        spinlock_unlock(&ta->lock);
358
        waitq_wakeup(&t->go_wq, WAKEUP_FIRST);
368
        return ENOENT;
359
    }
369
    }
360
 
370
 
-
 
371
    klog_printf("debug_go(): waitq_wakeup");
-
 
372
    waitq_wakeup(&t->go_wq, WAKEUP_FIRST);
-
 
373
 
361
    spinlock_unlock(&ta->lock);
374
    spinlock_unlock(&ta->lock);
-
 
375
 
-
 
376
    return 0; /* no backsend */
362
}
377
}
363
 
378
 
364
static int debug_args_read(call_t *call, phone_t *phone)
379
static int debug_args_read(call_t *call, phone_t *phone)
365
{
380
{
366
    thread_t *t;
381
    thread_t *t;
367
    link_t *l;
-
 
368
    task_t *ta;
382
    task_t *ta;
369
    void *uspace_buffer;
383
    void *uspace_buffer;
370
    unative_t to_copy;
384
    unative_t to_copy;
371
    int rc;
385
    int rc;
372
 
386
 
373
    klog_printf("debug_args_read()");
387
    klog_printf("debug_args_read()");
374
    // FIXME: verify task/thread state
388
    // FIXME: verify task/thread state
375
 
389
 
376
    ta = get_lock_callee_task(phone);
390
    ta = get_lock_callee_task(phone);
377
    klog_printf("task %llu", ta->taskid);
391
    klog_printf("task %llu", ta->taskid);
-
 
392
    t = get_task_thread_by_id(ta, IPC_GET_ARG1(call->data));
-
 
393
    if (t == NULL) {
-
 
394
        spinlock_unlock(&ta->lock);
-
 
395
        return ENOENT;
-
 
396
    }
378
 
397
 
379
    l = ta->th_head.next;
-
 
380
    if (l != &TASK->th_head) {
-
 
381
        t = list_get_instance(l, thread_t, th_link);
-
 
382
        /* t = requested thread */
-
 
383
        uspace_buffer = (void *)IPC_GET_ARG2(call->data);
398
    uspace_buffer = (void *)IPC_GET_ARG2(call->data);
384
        to_copy = IPC_GET_ARG3(call->data);
399
    to_copy = IPC_GET_ARG3(call->data);
-
 
400
    if (to_copy > 6) to_copy = 6;
-
 
401
 
385
        rc = copy_to_uspace(uspace_buffer, t->syscall_args, to_copy);
402
    rc = copy_to_uspace(uspace_buffer, t->syscall_args, to_copy);
386
        if (rc != 0) {
403
    if (rc != 0) {
387
            spinlock_unlock(&ta->lock);
404
        spinlock_unlock(&ta->lock);
388
            klog_printf("debug_args_read() - copy failed");
405
        klog_printf("debug_args_read() - copy failed");
389
            return rc;
406
        return rc;
390
        }
-
 
391
        IPC_SET_ARG1(call->data, to_copy);
-
 
392
    }
407
    }
393
 
408
 
394
    spinlock_unlock(&ta->lock);
409
    spinlock_unlock(&ta->lock);
395
 
410
 
-
 
411
    IPC_SET_ARG1(call->data, to_copy);
-
 
412
 
396
    klog_printf("debug_args_read() done");
413
    klog_printf("debug_args_read() done");
397
    return 1; /* actually need becksend with retval 0 */
414
    return 1; /* actually need becksend with retval 0 */
398
}
415
}
399
 
416
 
-
 
417
static int debug_thread_read(call_t *call, phone_t *phone)
-
 
418
{
-
 
419
    thread_t *t;
-
 
420
    link_t *cur;
-
 
421
    task_t *ta;
-
 
422
    unative_t *uspace_buffer;
-
 
423
    unative_t to_copy;
-
 
424
    int rc;
-
 
425
    unsigned copied, total;
-
 
426
    unsigned buf_size;
-
 
427
    unative_t tid;
-
 
428
 
-
 
429
    klog_printf("debug_thread_read()");
-
 
430
    // FIXME: verify task/thread state
-
 
431
 
-
 
432
    ta = get_lock_callee_task(phone);
-
 
433
    klog_printf("task %llu", ta->taskid);
-
 
434
   
-
 
435
    uspace_buffer = (void *)IPC_GET_ARG1(call->data);
-
 
436
    buf_size = IPC_GET_ARG2(call->data);
-
 
437
 
-
 
438
    copied = total = 0;
-
 
439
    for (cur = ta->th_head.next; cur != &ta->th_head; cur = cur->next) {
-
 
440
        t = list_get_instance(cur, thread_t, th_link);
-
 
441
       
-
 
442
        //FIXME: id cropped!!
-
 
443
        tid = (unative_t) t->tid;
-
 
444
 
-
 
445
        to_copy = sizeof(unative_t);
-
 
446
        if (copied + to_copy >= buf_size)
-
 
447
            to_copy = buf_size - copied;
-
 
448
 
-
 
449
        if (to_copy > 0) {
-
 
450
            rc = copy_to_uspace(uspace_buffer, &tid, to_copy);
-
 
451
            if (rc != 0) {
-
 
452
                spinlock_unlock(&ta->lock);
-
 
453
                klog_printf("debug_thread_read() - copy failed");
-
 
454
                return rc;
-
 
455
            }
-
 
456
        }
-
 
457
 
-
 
458
        ++uspace_buffer;
-
 
459
        total += sizeof(unative_t);
-
 
460
        copied += to_copy;
-
 
461
    }
-
 
462
 
-
 
463
    spinlock_unlock(&ta->lock);
-
 
464
 
-
 
465
    IPC_SET_ARG1(call->data, copied);
-
 
466
    IPC_SET_ARG2(call->data, total);
-
 
467
 
-
 
468
    klog_printf("debug_thread_read() done");
-
 
469
    return 1; /* actually need becksend with retval 0 */
-
 
470
}
-
 
471
 
400
 
472
 
401
/** Called before the request is sent.
473
/** Called before the request is sent.
402
 *
474
 *
403
 * @param call      Call structure with the request.
475
 * @param call      Call structure with the request.
404
 * @param phone     Phone that the call will be sent through.
476
 * @param phone     Phone that the call will be sent through.
Line 450... Line 522...
450
    case IPC_M_DEBUG_BEGIN:
522
    case IPC_M_DEBUG_BEGIN:
451
        /* actually need possibility of backsend with 0 result code */
523
        /* actually need possibility of backsend with 0 result code */
452
        rc = debug_begin(call, phone);
524
        rc = debug_begin(call, phone);
453
        return rc;
525
        return rc;
454
    case IPC_M_DEBUG_GO:
526
    case IPC_M_DEBUG_GO:
455
        debug_go(call, phone);
527
        rc = debug_go(call, phone);
456
        break;
528
        return rc;
457
    case IPC_M_DEBUG_ARGS_READ:
529
    case IPC_M_DEBUG_ARGS_READ:
458
        rc = debug_args_read(call, phone);
530
        rc = debug_args_read(call, phone);
459
        return rc;
531
        return rc;
-
 
532
    case IPC_M_DEBUG_THREAD_READ:
-
 
533
        rc = debug_thread_read(call, phone);
-
 
534
        return rc;
460
    default:
535
    default:
461
        break;
536
        break;
462
    }
537
    }
463
    return 0;
538
    return 0;
464
}
539
}