Subversion Repositories HelenOS

Rev

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

Rev 4655 Rev 4656
Line 70... Line 70...
70
int phoneid;
70
int phoneid;
71
int abort_trace;
71
int abort_trace;
72
 
72
 
73
uintptr_t thash;
73
uintptr_t thash;
74
volatile int paused;
74
volatile int paused;
75
fibril_condvar_t paused_cv;
75
fibril_condvar_t state_cv;
76
fibril_mutex_t paused_lock;
76
fibril_mutex_t state_lock;
-
 
77
 
-
 
78
int cev_valid;
-
 
79
console_event_t cev;
77
 
80
 
78
void thread_trace_start(uintptr_t thread_hash);
81
void thread_trace_start(uintptr_t thread_hash);
79
 
82
 
80
static proto_t *proto_console;
83
static proto_t *proto_console;
81
static task_id_t task_id;
84
static task_id_t task_id;
Line 83... Line 86...
83
 
86
 
84
/** Combination of events/data to print. */
87
/** Combination of events/data to print. */
85
display_mask_t display_mask;
88
display_mask_t display_mask;
86
 
89
 
87
static int program_run_fibril(void *arg);
90
static int program_run_fibril(void *arg);
-
 
91
static int cev_fibril(void *arg);
88
 
92
 
89
static void program_run(void)
93
static void program_run(void)
90
{
94
{
91
    fid_t fid;
95
    fid_t fid;
92
 
96
 
Line 97... Line 101...
97
    }
101
    }
98
 
102
 
99
    fibril_add_ready(fid);
103
    fibril_add_ready(fid);
100
}
104
}
101
 
105
 
-
 
106
static void cev_fibril_start(void)
-
 
107
{
-
 
108
    fid_t fid;
-
 
109
 
-
 
110
    fid = fibril_create(cev_fibril, NULL);
-
 
111
    if (fid == 0) {
-
 
112
        printf("Error creating fibril\n");
-
 
113
        exit(1);
-
 
114
    }
-
 
115
 
-
 
116
    fibril_add_ready(fid);
-
 
117
}
-
 
118
 
102
static int program_run_fibril(void *arg)
119
static int program_run_fibril(void *arg)
103
{
120
{
104
    int rc;
121
    int rc;
105
 
122
 
106
    /*
123
    /*
Line 454... Line 471...
454
 
471
 
455
    printf("Start tracing thread [%d] (hash 0x%lx).\n", thread_id, thread_hash);
472
    printf("Start tracing thread [%d] (hash 0x%lx).\n", thread_id, thread_hash);
456
 
473
 
457
    while (!abort_trace) {
474
    while (!abort_trace) {
458
 
475
 
459
        fibril_mutex_lock(&paused_lock);
476
        fibril_mutex_lock(&state_lock);
460
        if (paused) {
477
        if (paused) {
461
            printf("Thread [%d] paused. Press R to resume.\n",
478
            printf("Thread [%d] paused. Press R to resume.\n",
462
                thread_id);
479
                thread_id);
463
 
480
 
464
            while (paused)
481
            while (paused)
465
                fibril_condvar_wait(&paused_cv, &paused_lock);
482
                fibril_condvar_wait(&state_cv, &state_lock);
466
 
483
 
467
            printf("Thread [%d] resumed.\n", thread_id);
484
            printf("Thread [%d] resumed.\n", thread_id);
468
        }
485
        }
469
        fibril_mutex_unlock(&paused_lock);
486
        fibril_mutex_unlock(&state_lock);
470
 
487
 
471
        /* Run thread until an event occurs */
488
        /* Run thread until an event occurs */
472
        rc = udebug_go(phoneid, thread_hash,
489
        rc = udebug_go(phoneid, thread_hash,
473
            &ev_type, &val0, &val1);
490
            &ev_type, &val0, &val1);
474
 
491
 
Line 486... Line 503...
486
            case UDEBUG_EVENT_SYSCALL_E:
503
            case UDEBUG_EVENT_SYSCALL_E:
487
                event_syscall_e(thread_id, thread_hash, val0, (int)val1);
504
                event_syscall_e(thread_id, thread_hash, val0, (int)val1);
488
                break;
505
                break;
489
            case UDEBUG_EVENT_STOP:
506
            case UDEBUG_EVENT_STOP:
490
                printf("Stop event\n");
507
                printf("Stop event\n");
491
                fibril_mutex_lock(&paused_lock);
508
                fibril_mutex_lock(&state_lock);
492
                paused = 1;
509
                paused = 1;
493
                fibril_mutex_unlock(&paused_lock);
510
                fibril_mutex_unlock(&state_lock);
494
                break;
511
                break;
495
            case UDEBUG_EVENT_THREAD_B:
512
            case UDEBUG_EVENT_THREAD_B:
496
                event_thread_b(val0);
513
                event_thread_b(val0);
497
                break;
514
                break;
498
            case UDEBUG_EVENT_THREAD_E:
515
            case UDEBUG_EVENT_THREAD_E:
499
                printf("Thread 0x%lx exited.\n", val0);
516
                printf("Thread 0x%lx exited.\n", val0);
-
 
517
                fibril_mutex_lock(&state_lock);
500
                abort_trace = 1;
518
                abort_trace = 1;
-
 
519
                fibril_condvar_broadcast(&state_cv);
-
 
520
                fibril_mutex_unlock(&state_lock);
501
                break;
521
                break;
502
            default:
522
            default:
503
                printf("Unknown event type %d.\n", ev_type);
523
                printf("Unknown event type %d.\n", ev_type);
504
                break;
524
                break;
505
            }
525
            }
Line 590... Line 610...
590
    loader_abort(ldr);
610
    loader_abort(ldr);
591
    free(ldr);
611
    free(ldr);
592
    return NULL;
612
    return NULL;
593
}
613
}
594
 
614
 
-
 
615
static int cev_fibril(void *arg)
-
 
616
{
-
 
617
    (void) arg;
-
 
618
 
-
 
619
    printf("cev_fibril()\n");
-
 
620
    while (true) {
-
 
621
        printf("cev_fibril: wait for cev_valid == 0\n");
-
 
622
        fibril_mutex_lock(&state_lock);
-
 
623
        while (cev_valid)
-
 
624
            fibril_condvar_wait(&state_cv, &state_lock);
-
 
625
        fibril_mutex_unlock(&state_lock);
-
 
626
 
-
 
627
        printf("cev_fibril: wait for key\n");
-
 
628
 
-
 
629
        if (!console_get_event(fphone(stdin), &cev))
-
 
630
            return -1;
-
 
631
 
-
 
632
        printf("cev_fibril: broadcast cev_valid = 1\n");
-
 
633
 
-
 
634
        fibril_mutex_lock(&state_lock);
-
 
635
        cev_valid = 1;
-
 
636
        fibril_condvar_broadcast(&state_cv);
-
 
637
        fibril_mutex_unlock(&state_lock);      
-
 
638
    }
-
 
639
}
-
 
640
 
595
static void trace_task(task_id_t task_id)
641
static void trace_task(task_id_t task_id)
596
{
642
{
597
    console_event_t ev;
643
    console_event_t ev;
598
    bool done;
644
    bool done;
599
    int i;
645
    int i;
Line 620... Line 666...
620
    }
666
    }
621
 
667
 
622
    done = false;
668
    done = false;
623
 
669
 
624
    while (!done) {
670
    while (!done) {
-
 
671
        printf("trace_task: wait for cev_valid || abort_trace\n");
-
 
672
        fibril_mutex_lock(&state_lock);
-
 
673
        while (!cev_valid && !abort_trace)
625
        if (!console_get_event(fphone(stdin), &ev))
674
            fibril_condvar_wait(&state_cv, &state_lock);
-
 
675
        fibril_mutex_unlock(&state_lock);
-
 
676
 
-
 
677
        printf("trace_task: got something\n");
-
 
678
 
-
 
679
        ev = cev;
-
 
680
 
-
 
681
        fibril_mutex_lock(&state_lock);
-
 
682
        cev_valid = false;
-
 
683
        fibril_condvar_broadcast(&state_cv);
-
 
684
        fibril_mutex_unlock(&state_lock);
-
 
685
 
-
 
686
        if (abort_trace)
626
            return;
687
            break;
627
 
688
 
628
        if (ev.type != KEY_PRESS)
689
        if (ev.type != KEY_PRESS)
629
            continue;
690
            continue;
630
 
691
 
631
        switch (ev.key) {
692
        switch (ev.key) {
Line 637... Line 698...
637
            rc = udebug_stop(phoneid, thash);
698
            rc = udebug_stop(phoneid, thash);
638
            if (rc != EOK)
699
            if (rc != EOK)
639
                printf("Error: stop -> %d\n", rc);
700
                printf("Error: stop -> %d\n", rc);
640
            break;
701
            break;
641
        case KC_R:
702
        case KC_R:
642
            fibril_mutex_lock(&paused_lock);
703
            fibril_mutex_lock(&state_lock);
643
            paused = 0;
704
            paused = 0;
644
            fibril_condvar_broadcast(&paused_cv);
705
            fibril_condvar_broadcast(&state_cv);
645
            fibril_mutex_unlock(&paused_lock);
706
            fibril_mutex_unlock(&state_lock);
646
            printf("Resume...\n");
707
            printf("Resume...\n");
647
            break;
708
            break;
648
        }
709
        }
649
    }
710
    }
650
 
711
 
Line 680... Line 741...
680
        V_INTEGER
741
        V_INTEGER
681
    };
742
    };
682
 
743
 
683
    next_thread_id = 1;
744
    next_thread_id = 1;
684
    paused = 0;
745
    paused = 0;
-
 
746
    cev_valid = 0;
-
 
747
 
685
    fibril_mutex_initialize(&paused_lock);
748
    fibril_mutex_initialize(&state_lock);
686
    fibril_condvar_initialize(&paused_cv);
749
    fibril_condvar_initialize(&state_cv);
687
 
750
 
688
    proto_init();
751
    proto_init();
689
 
752
 
690
    p = proto_new("vfs");
753
    p = proto_new("vfs");
691
    o = oper_new("read", 1, arg_def, V_ERRNO, 1, resp_def);
754
    o = oper_new("read", 1, arg_def, V_ERRNO, 1, resp_def);
Line 871... Line 934...
871
 
934
 
872
    if (task_ldr != NULL) {
935
    if (task_ldr != NULL) {
873
        program_run();
936
        program_run();
874
    }
937
    }
875
 
938
 
-
 
939
    cev_fibril_start();
876
    trace_task(task_id);
940
    trace_task(task_id);
877
 
941
 
878
    return 0;
942
    return 0;
879
}
943
}
880
 
944