Rev 3455 | Rev 3485 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 3455 | Rev 3470 | ||
|---|---|---|---|
| Line 40... | Line 40... | ||
| 40 | #include <fibril.h> |
40 | #include <fibril.h> |
| 41 | #include <errno.h> |
41 | #include <errno.h> |
| 42 | #include <udebug.h> |
42 | #include <udebug.h> |
| 43 | #include <async.h> |
43 | #include <async.h> |
| 44 | #include <task.h> |
44 | #include <task.h> |
| - | 45 | #include <loader/loader.h> |
|
| 45 | 46 | ||
| 46 | // Temporary: service and method names |
47 | // Temporary: service and method names |
| 47 | #include "proto.h" |
48 | #include "proto.h" |
| 48 | #include <ipc/services.h> |
49 | #include <ipc/services.h> |
| 49 | #include "../../srv/vfs/vfs.h" |
50 | #include "../../srv/vfs/vfs.h" |
| Line 68... | Line 69... | ||
| 68 | 69 | ||
| 69 | void thread_trace_start(uintptr_t thread_hash); |
70 | void thread_trace_start(uintptr_t thread_hash); |
| 70 | 71 | ||
| 71 | static proto_t *proto_console; |
72 | static proto_t *proto_console; |
| 72 | static task_id_t task_id; |
73 | static task_id_t task_id; |
| - | 74 | static loader_t *task_ldr; |
|
| 73 | 75 | ||
| 74 | /** Combination of events/data to print. */ |
76 | /** Combination of events/data to print. */ |
| 75 | display_mask_t display_mask; |
77 | display_mask_t display_mask; |
| 76 | 78 | ||
| - | 79 | static int program_run_fibril(void *arg); |
|
| - | 80 | ||
| - | 81 | static void program_run(void) |
|
| - | 82 | { |
|
| - | 83 | fid_t fid; |
|
| - | 84 | ||
| - | 85 | fid = fibril_create(program_run_fibril, NULL); |
|
| - | 86 | if (fid == 0) { |
|
| - | 87 | printf("Error creating fibril\n"); |
|
| - | 88 | exit(1); |
|
| - | 89 | } |
|
| - | 90 | ||
| - | 91 | fibril_add_ready(fid); |
|
| - | 92 | } |
|
| - | 93 | ||
| - | 94 | static int program_run_fibril(void *arg) |
|
| - | 95 | { |
|
| - | 96 | int rc; |
|
| - | 97 | ||
| - | 98 | /* |
|
| - | 99 | * This must be done in background as it will block until |
|
| - | 100 | * we let the task reply to this call. |
|
| - | 101 | */ |
|
| - | 102 | rc = loader_run(task_ldr); |
|
| - | 103 | if (rc != 0) { |
|
| - | 104 | printf("Error running program\n"); |
|
| - | 105 | exit(1); |
|
| - | 106 | } |
|
| - | 107 | ||
| - | 108 | free(task_ldr); |
|
| - | 109 | task_ldr = NULL; |
|
| - | 110 | ||
| - | 111 | printf("program_run_fibril exiting\n"); |
|
| - | 112 | return 0; |
|
| - | 113 | } |
|
| - | 114 | ||
| - | 115 | ||
| 77 | static int task_connect(task_id_t task_id) |
116 | static int connect_task(task_id_t task_id) |
| 78 | { |
117 | { |
| 79 | int rc; |
118 | int rc; |
| 80 | 119 | ||
| 81 | rc = ipc_connect_kbox(task_id); |
120 | rc = ipc_connect_kbox(task_id); |
| 82 | 121 | ||
| Line 146... | Line 185... | ||
| 146 | case V_INTEGER: |
185 | case V_INTEGER: |
| 147 | printf("%ld", val); |
186 | printf("%ld", val); |
| 148 | break; |
187 | break; |
| 149 | 188 | ||
| 150 | case V_HASH: |
189 | case V_HASH: |
| - | 190 | case V_PTR: |
|
| 151 | printf("0x%08lx", val); |
191 | printf("0x%08lx", val); |
| 152 | break; |
192 | break; |
| 153 | 193 | ||
| 154 | case V_ERRNO: |
194 | case V_ERRNO: |
| 155 | if (val >= -15 && val <= 0) { |
195 | if (val >= -15 && val <= 0) { |
| Line 466... | Line 506... | ||
| 466 | printf("Warning: Failed creating fibril\n"); |
506 | printf("Warning: Failed creating fibril\n"); |
| 467 | } |
507 | } |
| 468 | fibril_add_ready(fid); |
508 | fibril_add_ready(fid); |
| 469 | } |
509 | } |
| 470 | 510 | ||
| - | 511 | static loader_t *preload_task(const char *path, char *const argv[], |
|
| 471 | static void trace_active_task(task_id_t task_id) |
512 | task_id_t *task_id) |
| 472 | { |
513 | { |
| 473 | int i; |
514 | loader_t *ldr; |
| 474 | int rc; |
515 | int rc; |
| 475 | int c; |
- | |
| 476 | 516 | ||
| - | 517 | /* Spawn a program loader */ |
|
| - | 518 | ldr = loader_spawn(); |
|
| - | 519 | if (ldr == NULL) |
|
| - | 520 | return 0; |
|
| - | 521 | ||
| - | 522 | /* Get task ID. */ |
|
| 477 | rc = task_connect(task_id); |
523 | rc = loader_get_task_id(ldr, task_id); |
| 478 | if (rc < 0) { |
524 | if (rc != EOK) |
| - | 525 | goto error; |
|
| - | 526 | ||
| - | 527 | /* Send program pathname */ |
|
| 479 | printf("Failed to connect to task %lld\n", task_id); |
528 | rc = loader_set_pathname(ldr, path); |
| - | 529 | if (rc != EOK) |
|
| - | 530 | goto error; |
|
| - | 531 | ||
| - | 532 | /* Send arguments */ |
|
| - | 533 | rc = loader_set_args(ldr, argv); |
|
| - | 534 | if (rc != EOK) |
|
| - | 535 | goto error; |
|
| - | 536 | ||
| - | 537 | /* Load the program. */ |
|
| - | 538 | rc = loader_load_program(ldr); |
|
| - | 539 | if (rc != EOK) |
|
| - | 540 | goto error; |
|
| - | 541 | ||
| - | 542 | /* Success */ |
|
| 480 | return; |
543 | return ldr; |
| - | 544 | ||
| - | 545 | /* Error exit */ |
|
| - | 546 | error: |
|
| - | 547 | loader_abort(ldr); |
|
| - | 548 | free(ldr); |
|
| - | 549 | return NULL; |
|
| 481 | } |
550 | } |
| 482 | 551 | ||
| 483 | printf("Connected to task %lld\n", task_id); |
552 | static void trace_task(task_id_t task_id) |
| - | 553 | { |
|
| - | 554 | int i; |
|
| - | 555 | int rc; |
|
| - | 556 | int c; |
|
| 484 | 557 | ||
| 485 | ipcp_init(); |
558 | ipcp_init(); |
| 486 | 559 | ||
| 487 | /* |
560 | /* |
| 488 | * User apps now typically have console on phone 3. |
561 | * User apps now typically have console on phone 3. |
| Line 654... | Line 727... | ||
| 654 | } else if (arg[0] == '-') { |
727 | } else if (arg[0] == '-') { |
| 655 | if (arg[1] == 't') { |
728 | if (arg[1] == 't') { |
| 656 | /* Trace an already running task */ |
729 | /* Trace an already running task */ |
| 657 | --argc; ++argv; |
730 | --argc; ++argv; |
| 658 | task_id = strtol(*argv, &err_p, 10); |
731 | task_id = strtol(*argv, &err_p, 10); |
| - | 732 | task_ldr = NULL; |
|
| 659 | if (*err_p) { |
733 | if (*err_p) { |
| 660 | printf("Task ID syntax error\n"); |
734 | printf("Task ID syntax error\n"); |
| 661 | print_syntax(); |
735 | print_syntax(); |
| 662 | return -1; |
736 | return -1; |
| 663 | } |
737 | } |
| Line 684... | Line 758... | ||
| 684 | printf("Missing argument\n"); |
758 | printf("Missing argument\n"); |
| 685 | print_syntax(); |
759 | print_syntax(); |
| 686 | return -1; |
760 | return -1; |
| 687 | } |
761 | } |
| 688 | 762 | ||
| 689 | /* Execute the specified command and trace the new task. */ |
763 | /* Preload the specified program file. */ |
| 690 | printf("Spawning '%s' with arguments:\n", *argv); |
764 | printf("Spawning '%s' with arguments:\n", *argv); |
| 691 | { |
765 | { |
| 692 | char **cp = argv; |
766 | char **cp = argv; |
| 693 | while (*cp) printf("'%s'\n", *cp++); |
767 | while (*cp) printf("'%s'\n", *cp++); |
| 694 | } |
768 | } |
| 695 | task_id = task_spawn(*argv, argv); |
769 | task_ldr = preload_task(*argv, argv, &task_id); |
| 696 | 770 | ||
| 697 | return 0; |
771 | return 0; |
| 698 | } |
772 | } |
| 699 | 773 | ||
| 700 | int main(int argc, char *argv[]) |
774 | int main(int argc, char *argv[]) |
| 701 | { |
775 | { |
| - | 776 | int rc; |
|
| - | 777 | ||
| 702 | printf("System Call / IPC Tracer\n"); |
778 | printf("System Call / IPC Tracer\n"); |
| 703 | 779 | ||
| 704 | display_mask = DM_THREAD | DM_SYSTEM | DM_USER; |
780 | display_mask = DM_THREAD | DM_SYSTEM | DM_USER; |
| 705 | 781 | ||
| 706 | if (parse_args(argc, argv) < 0) |
782 | if (parse_args(argc, argv) < 0) |
| 707 | return 1; |
783 | return 1; |
| 708 | 784 | ||
| 709 | main_init(); |
785 | main_init(); |
| - | 786 | ||
| - | 787 | rc = connect_task(task_id); |
|
| - | 788 | if (rc < 0) { |
|
| - | 789 | printf("Failed connecting to task %lld\n", task_id); |
|
| - | 790 | return 1; |
|
| - | 791 | } |
|
| - | 792 | ||
| - | 793 | printf("Connected to task %lld\n", task_id); |
|
| - | 794 | ||
| - | 795 | if (task_ldr != NULL) { |
|
| - | 796 | program_run(); |
|
| - | 797 | } |
|
| - | 798 | ||
| 710 | trace_active_task(task_id); |
799 | trace_task(task_id); |
| 711 | 800 | ||
| 712 | return 0; |
801 | return 0; |
| 713 | } |
802 | } |
| 714 | 803 | ||
| 715 | /** @} |
804 | /** @} |