Changeset 84876aa4 in mainline for uspace/app/trace/trace.c


Ignore:
Timestamp:
2019-11-15T13:46:34Z (4 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
ecb7828
Parents:
b093a62 (diff), d548fc0 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge master into gfx

Mainly to get XCW fixes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/trace/trace.c

    rb093a62 r84876aa4  
    4747#include <mem.h>
    4848#include <str.h>
    49 #include <loader/loader.h>
    5049#include <io/console.h>
    5150#include <io/keycode.h>
     
    8685void thread_trace_start(uintptr_t thread_hash);
    8786
     87static char *cmd_path;
     88static char **cmd_args;
     89
    8890static task_id_t task_id;
    89 static loader_t *task_ldr;
     91static task_wait_t task_w;
    9092static bool task_wait_for;
    9193
     
    9395display_mask_t display_mask;
    9496
    95 static errno_t program_run_fibril(void *arg);
    9697static errno_t cev_fibril(void *arg);
    97 
    98 static void program_run(void)
    99 {
    100         fid_t fid;
    101 
    102         fid = fibril_create(program_run_fibril, NULL);
    103         if (fid == 0) {
    104                 printf("Error creating fibril\n");
    105                 exit(1);
    106         }
    107 
    108         fibril_add_ready(fid);
    109 }
    11098
    11199static void cev_fibril_start(void)
     
    122110}
    123111
    124 static errno_t program_run_fibril(void *arg)
    125 {
    126         errno_t rc;
    127 
    128         /*
    129          * This must be done in background as it will block until
    130          * we let the task reply to this call.
    131          */
    132         rc = loader_run(task_ldr);
     112static errno_t program_run(void)
     113{
     114        errno_t rc;
     115
     116        rc = task_spawnv_debug(&task_id, &task_w, cmd_path,
     117            (const char *const *)cmd_args, &sess);
     118
     119        if (rc == ENOTSUP) {
     120                printf("You do not have userspace debugging support "
     121                    "compiled in the kernel.\n");
     122                printf("Compile kernel with 'Support for userspace debuggers' "
     123                    "(CONFIG_UDEBUG) enabled.\n");
     124        }
     125
    133126        if (rc != EOK) {
    134                 printf("Error running program\n");
    135                 exit(1);
    136         }
    137 
    138         task_ldr = NULL;
    139 
    140         printf("program_run_fibril exiting\n");
    141         return 0;
     127                printf("Error running program (%s)\n", str_error_name(rc));
     128                return rc;
     129        }
     130
     131        return EOK;
    142132}
    143133
    144134static errno_t connect_task(task_id_t task_id)
    145135{
    146         async_sess_t *ksess = async_connect_kbox(task_id);
    147 
    148         if (!ksess) {
    149                 if (errno == ENOTSUP) {
    150                         printf("You do not have userspace debugging support "
    151                             "compiled in the kernel.\n");
    152                         printf("Compile kernel with 'Support for userspace debuggers' "
    153                             "(CONFIG_UDEBUG) enabled.\n");
    154                         return errno;
    155                 }
    156 
    157                 printf("Error connecting\n");
    158                 printf("ipc_connect_task(%" PRIu64 ") -> %s ", task_id, str_error_name(errno));
    159                 return errno;
    160         }
    161 
    162         errno_t rc = udebug_begin(ksess);
    163         if (rc != EOK) {
    164                 printf("udebug_begin() -> %s\n", str_error_name(rc));
    165                 return rc;
    166         }
    167 
    168         rc = udebug_set_evmask(ksess, UDEBUG_EM_ALL);
     136        errno_t rc;
     137        bool debug_started = false;
     138        bool wait_set_up = false;
     139
     140        if (sess == NULL) {
     141                sess = async_connect_kbox(task_id);
     142                if (sess == NULL) {
     143                        printf("Error connecting to task %" PRIu64 ".\n",
     144                            task_id);
     145                        rc = EIO;
     146                        goto error;
     147                }
     148
     149                rc = udebug_begin(sess);
     150                if (rc != EOK) {
     151                        printf("Error starting debug session.\n");
     152                        goto error;
     153                }
     154
     155                debug_started = true;
     156
     157                rc = task_setup_wait(task_id, &task_w);
     158                if (rc != EOK) {
     159                        printf("Error setting up wait for task termination.\n");
     160                        goto error;
     161                }
     162
     163                wait_set_up = true;
     164        }
     165
     166        rc = udebug_set_evmask(sess, UDEBUG_EM_ALL);
    169167        if (rc != EOK) {
    170168                printf("udebug_set_evmask(0x%x) -> %s\n ", UDEBUG_EM_ALL, str_error_name(rc));
     
    172170        }
    173171
    174         sess = ksess;
    175         return 0;
     172        return EOK;
     173error:
     174        if (wait_set_up)
     175                task_cancel_wait(&task_w);
     176        if (debug_started)
     177                udebug_end(sess);
     178        if (sess != NULL)
     179                async_hangup(sess);
     180        return rc;
    176181}
    177182
     
    198203        printf("\ntotal of %zu threads\n", tb_needed / sizeof(uintptr_t));
    199204
    200         return 0;
     205        return EOK;
    201206}
    202207
     
    488493
    489494        printf("Finished tracing thread [%d].\n", thread_id);
    490         return 0;
     495        return EOK;
    491496}
    492497
     
    502507        }
    503508        fibril_add_ready(fid);
    504 }
    505 
    506 static loader_t *preload_task(const char *path, char **argv,
    507     task_id_t *task_id)
    508 {
    509         loader_t *ldr;
    510         errno_t rc;
    511 
    512         /* Spawn a program loader */
    513         ldr = loader_connect();
    514         if (ldr == NULL)
    515                 return NULL;
    516 
    517         /* Get task ID. */
    518         rc = loader_get_task_id(ldr, task_id);
    519         if (rc != EOK)
    520                 goto error;
    521 
    522         /* Send program. */
    523         rc = loader_set_program_path(ldr, path);
    524         if (rc != EOK)
    525                 goto error;
    526 
    527         /* Send arguments */
    528         rc = loader_set_args(ldr, (const char **) argv);
    529         if (rc != EOK)
    530                 goto error;
    531 
    532         /* Send default files */
    533         int fd_root;
    534         int fd_stdin;
    535         int fd_stdout;
    536         int fd_stderr;
    537 
    538         fd_root = vfs_root();
    539         if (fd_root >= 0) {
    540                 rc = loader_add_inbox(ldr, "root", fd_root);
    541                 vfs_put(fd_root);
    542                 if (rc != EOK)
    543                         goto error;
    544         }
    545 
    546         if ((stdin != NULL) && (vfs_fhandle(stdin, &fd_stdin) == EOK)) {
    547                 rc = loader_add_inbox(ldr, "stdin", fd_stdin);
    548                 if (rc != EOK)
    549                         goto error;
    550         }
    551 
    552         if ((stdout != NULL) && (vfs_fhandle(stdout, &fd_stdout) == EOK)) {
    553                 rc = loader_add_inbox(ldr, "stdout", fd_stdout);
    554                 if (rc != EOK)
    555                         goto error;
    556         }
    557 
    558         if ((stderr != NULL) && (vfs_fhandle(stderr, &fd_stderr) == EOK)) {
    559                 rc = loader_add_inbox(ldr, "stderr", fd_stderr);
    560                 if (rc != EOK)
    561                         goto error;
    562         }
    563 
    564         /* Load the program. */
    565         rc = loader_load_program(ldr);
    566         if (rc != EOK)
    567                 goto error;
    568 
    569         /* Success */
    570         return ldr;
    571 
    572         /* Error exit */
    573 error:
    574         loader_abort(ldr);
    575         return NULL;
    576509}
    577510
     
    807740                                ++argv;
    808741                                task_id = strtol(*argv, &err_p, 10);
    809                                 task_ldr = NULL;
    810742                                task_wait_for = false;
    811743                                if (*err_p) {
     
    848780                printf("'%s'\n", *cp++);
    849781
    850         task_ldr = preload_task(*argv, argv, &task_id);
     782        cmd_path = *argv;
     783        cmd_args = argv;
    851784        task_wait_for = true;
    852785
     
    869802
    870803        main_init();
     804
     805        if (cmd_path != NULL)
     806                program_run();
    871807
    872808        rc = connect_task(task_id);
     
    878814        printf("Connected to task %" PRIu64 ".\n", task_id);
    879815
    880         if (task_ldr != NULL)
    881                 program_run();
    882 
    883816        cev_fibril_start();
    884817        trace_task(task_id);
     
    887820                printf("Waiting for task to exit.\n");
    888821
    889                 rc = task_wait_task_id(task_id, &texit, &retval);
     822                rc = task_wait(&task_w, &texit, &retval);
    890823                if (rc != EOK) {
    891824                        printf("Failed waiting for task.\n");
Note: See TracChangeset for help on using the changeset viewer.