Subversion Repositories HelenOS

Rev

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

Rev 2810 Rev 2812
Line 360... Line 360...
360
 
360
 
361
    klog_printf("debug_go()");
361
    klog_printf("debug_go()");
362
    ta = get_lock_callee_task(phone);
362
    ta = get_lock_callee_task(phone);
363
 
363
 
364
    ta->debug_go_call = call;
364
    ta->debug_go_call = call;
365
    t = get_task_thread_by_id(ta, IPC_GET_ARG1(call->data));
365
    t = get_task_thread_by_id(ta, IPC_GET_ARG2(call->data));
366
    if (t == NULL) {
366
    if (t == NULL) {
367
        spinlock_unlock(&ta->lock);
367
        spinlock_unlock(&ta->lock);
368
        return ENOENT;
368
        return ENOENT;
369
    }
369
    }
370
 
370
 
Line 387... Line 387...
387
    klog_printf("debug_args_read()");
387
    klog_printf("debug_args_read()");
388
    // FIXME: verify task/thread state
388
    // FIXME: verify task/thread state
389
 
389
 
390
    ta = get_lock_callee_task(phone);
390
    ta = get_lock_callee_task(phone);
391
    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));
392
    t = get_task_thread_by_id(ta, IPC_GET_ARG2(call->data));
393
    if (t == NULL) {
393
    if (t == NULL) {
394
        spinlock_unlock(&ta->lock);
394
        spinlock_unlock(&ta->lock);
395
        return ENOENT;
395
        return ENOENT;
396
    }
396
    }
397
 
397
 
398
    uspace_buffer = (void *)IPC_GET_ARG2(call->data);
398
    uspace_buffer = (void *)IPC_GET_ARG3(call->data);
399
    to_copy = IPC_GET_ARG3(call->data);
399
    to_copy = IPC_GET_ARG4(call->data);
400
    if (to_copy > 6 * sizeof(unative_t)) to_copy = 6 * sizeof(unative_t);
400
    if (to_copy > 6 * sizeof(unative_t)) to_copy = 6 * sizeof(unative_t);
401
 
401
 
402
    rc = copy_to_uspace(uspace_buffer, t->syscall_args, to_copy);
402
    rc = copy_to_uspace(uspace_buffer, t->syscall_args, to_copy);
403
    if (rc != 0) {
403
    if (rc != 0) {
404
        spinlock_unlock(&ta->lock);
404
        spinlock_unlock(&ta->lock);
Line 430... Line 430...
430
    // FIXME: verify task/thread state
430
    // FIXME: verify task/thread state
431
 
431
 
432
    ta = get_lock_callee_task(phone);
432
    ta = get_lock_callee_task(phone);
433
    klog_printf("task %llu", ta->taskid);
433
    klog_printf("task %llu", ta->taskid);
434
   
434
   
435
    uspace_buffer = (void *)IPC_GET_ARG1(call->data);
435
    uspace_buffer = (void *)IPC_GET_ARG2(call->data);
436
    buf_size = IPC_GET_ARG2(call->data);
436
    buf_size = IPC_GET_ARG3(call->data);
437
 
437
 
438
    copied = total = 0;
438
    copied = total = 0;
439
    for (cur = ta->th_head.next; cur != &ta->th_head; cur = cur->next) {
439
    for (cur = ta->th_head.next; cur != &ta->th_head; cur = cur->next) {
440
        t = list_get_instance(cur, thread_t, th_link);
440
        t = list_get_instance(cur, thread_t, th_link);
441
 
441
 
Line 471... Line 471...
471
 
471
 
472
    klog_printf("debug_thread_read() done");
472
    klog_printf("debug_thread_read() done");
473
    return 1; /* actually need becksend with retval 0 */
473
    return 1; /* actually need becksend with retval 0 */
474
}
474
}
475
 
475
 
-
 
476
#include <udebug.h>
-
 
477
 
-
 
478
static int debug_request_preprocess(call_t *call, phone_t *phone)
-
 
479
{
-
 
480
    int rc;
-
 
481
 
-
 
482
    switch (IPC_GET_ARG1(call->data)) {
-
 
483
    case UDEBUG_M_BEGIN:
-
 
484
        rc = debug_begin(call, phone);
-
 
485
        return rc;
-
 
486
    case UDEBUG_M_GO:
-
 
487
        rc = debug_go(call, phone);
-
 
488
        return rc;
-
 
489
    case UDEBUG_M_ARGS_READ:
-
 
490
        rc = debug_args_read(call, phone);
-
 
491
        return rc;
-
 
492
    case UDEBUG_M_THREAD_READ:
-
 
493
        rc = debug_thread_read(call, phone);
-
 
494
        return rc;
-
 
495
    default:
-
 
496
        break;
-
 
497
    }
-
 
498
 
-
 
499
    return 0;
-
 
500
}
476
 
501
 
477
/** Called before the request is sent.
502
/** Called before the request is sent.
478
 *
503
 *
479
 * @param call      Call structure with the request.
504
 * @param call      Call structure with the request.
480
 * @param phone     Phone that the call will be sent through.
505
 * @param phone     Phone that the call will be sent through.
Line 521... Line 546...
521
        if (rc != 0) {
546
        if (rc != 0) {
522
            free(call->buffer);
547
            free(call->buffer);
523
            return rc;
548
            return rc;
524
        }
549
        }
525
        break;
550
        break;
526
    case IPC_M_DEBUG_BEGIN:
551
    case IPC_M_DEBUG_ALL:
527
        /* actually need possibility of backsend with 0 result code */
552
        /* actually need possibility of backsend with 0 result code */
528
        rc = debug_begin(call, phone);
-
 
529
        return rc;
-
 
530
    case IPC_M_DEBUG_GO:
-
 
531
        rc = debug_go(call, phone);
-
 
532
        return rc;
-
 
533
    case IPC_M_DEBUG_ARGS_READ:
-
 
534
        rc = debug_args_read(call, phone);
-
 
535
        return rc;
-
 
536
    case IPC_M_DEBUG_THREAD_READ:
-
 
537
        rc = debug_thread_read(call, phone);
553
        rc = debug_request_preprocess(call, phone);
538
        return rc;
554
        return rc;
539
    default:
555
    default:
540
        break;
556
        break;
541
    }
557
    }
542
    return 0;
558
    return 0;
Line 563... Line 579...
563
            IPC_SET_ARG5(call->data, call->priv);
579
            IPC_SET_ARG5(call->data, call->priv);
564
    }
580
    }
565
 
581
 
566
    if (call->buffer) {
582
    if (call->buffer) {
567
        /* This must be an affirmative answer to IPC_M_DATA_READ. */
583
        /* This must be an affirmative answer to IPC_M_DATA_READ. */
568
        /* or IPC_M_DEBUG_MEM_READ... */
584
        /* or IPC_M_DEBUG_ALL/UDEBUG_M_MEM_READ... */
569
        uintptr_t dst = IPC_GET_ARG1(call->data);
585
        uintptr_t dst = IPC_GET_ARG1(call->data);
570
        size_t size = IPC_GET_ARG2(call->data);
586
        size_t size = IPC_GET_ARG2(call->data);
571
        int rc = copy_to_uspace((void *) dst, call->buffer, size);
587
        int rc = copy_to_uspace((void *) dst, call->buffer, size);
572
        if (rc)
588
        if (rc)
573
            IPC_SET_RETVAL(call->data, rc);
589
            IPC_SET_RETVAL(call->data, rc);
Line 596... Line 612...
596
            return -1;
612
            return -1;
597
        }
613
        }
598
        IPC_SET_ARG5(call->data, phoneid);
614
        IPC_SET_ARG5(call->data, phoneid);
599
    }
615
    }
600
    switch (IPC_GET_METHOD(call->data)) {
616
    switch (IPC_GET_METHOD(call->data)) {
601
    case IPC_M_DEBUG_BEGIN:
-
 
602
    case IPC_M_DEBUG_END:
617
    case IPC_M_DEBUG_ALL:
603
    case IPC_M_DEBUG_GO:
-
 
604
    case IPC_M_DEBUG_STOP:
-
 
605
    case IPC_M_DEBUG_GUARD:
-
 
606
        return -1;
618
        return -1;
607
    default:
619
    default:
608
        break;
620
        break;
609
    }
621
    }
610
    return 0;
622
    return 0;