diff options
Diffstat (limited to 'core/host/task.c')
-rw-r--r-- | core/host/task.c | 100 |
1 files changed, 16 insertions, 84 deletions
diff --git a/core/host/task.c b/core/host/task.c index 08c70da66b..5bff856def 100644 --- a/core/host/task.c +++ b/core/host/task.c @@ -5,7 +5,6 @@ /* Task scheduling / events module for Chrome EC operating system */ -#include <execinfo.h> #include <malloc.h> #include <pthread.h> #include <semaphore.h> @@ -18,7 +17,7 @@ #include "atomic.h" #include "common.h" #include "console.h" -#include "host_test.h" +#include "host_task.h" #include "task.h" #include "task_id.h" #include "test_util.h" @@ -26,22 +25,6 @@ #define SIGNAL_INTERRUPT SIGUSR1 -#define SIGNAL_TRACE_DUMP SIGTERM -#define MAX_TRACE 30 -/* - * When trace dump is requested from signal handler, skip: - * _task_dump_trace_impl - * _task_dump_trace_dispath - * A function in libc - */ -#define SIGNAL_TRACE_OFFSET 3 -/* - * When trace dump is requested from task_dump_trace(), skip: - * task_dump_trace - * _task_dump_trace_impl - */ -#define DIRECT_TRACE_OFFSET 2 - struct emu_task_t { pthread_t thread; pthread_cond_t resume; @@ -60,7 +43,6 @@ static pthread_cond_t scheduler_cond; static pthread_mutex_t run_lock; static task_id_t running_task_id; static int task_started; -static pthread_t main_thread; static sem_t interrupt_sem; static pthread_mutex_t interrupt_lock; @@ -141,71 +123,6 @@ static void _task_execute_isr(int sig) in_interrupt = 0; } -static void __attribute__((noinline)) _task_dump_trace_impl(int offset) -{ - void *trace[MAX_TRACE]; - size_t sz; - char **messages; - char buf[256]; - FILE *file; - int i, nb; - - sz = backtrace(trace, MAX_TRACE); - messages = backtrace_symbols(trace + offset, sz - offset); - - for (i = 0; i < sz - offset; ++i) { - fprintf(stderr, "#%-2d %s\n", i, messages[i]); - sprintf(buf, "addr2line %p -e %s", - trace[i + offset], __get_prog_name()); - file = popen(buf, "r"); - if (file) { - nb = fread(buf, 1, sizeof(buf) - 1, file); - buf[nb] = '\0'; - fprintf(stderr, " %s", buf); - pclose(file); - } - } - fflush(stderr); - free(messages); -} - -void __attribute__((noinline)) task_dump_trace(void) -{ - _task_dump_trace_impl(DIRECT_TRACE_OFFSET); -} - -static void __attribute__((noinline)) _task_dump_trace_dispatch(int sig) -{ - int need_dispatch = 1; - - if (!pthread_equal(pthread_self(), main_thread)) { - need_dispatch = 0; - } else if (!task_start_called()) { - fprintf(stderr, "Stack trace of main thread:\n"); - need_dispatch = 0; - } else if (in_interrupt_context()) { - fprintf(stderr, "Stack trace of ISR:\n"); - } else { - fprintf(stderr, "Stack trace of task %d (%s):\n", - running_task_id, task_names[running_task_id]); - } - - if (need_dispatch) { - pthread_kill(tasks[running_task_id].thread, SIGNAL_TRACE_DUMP); - } else { - _task_dump_trace_impl(SIGNAL_TRACE_OFFSET); - udelay(100 * MSEC); /* Leave time for stderr to flush */ - exit(1); - } -} - -void task_register_tracedump(void) -{ - /* Trace dumper MUST be registered from main thread */ - main_thread = pthread_self(); - signal(SIGNAL_TRACE_DUMP, _task_dump_trace_dispatch); -} - static void task_register_interrupt(void) { sem_init(&interrupt_sem, 0, 0); @@ -242,6 +159,16 @@ void interrupt_generator_udelay(unsigned us) generator_sleeping = 0; } +const char *task_get_name(task_id_t tskid) +{ + return task_names[tskid]; +} + +pthread_t task_get_thread(task_id_t tskid) +{ + return tasks[tskid].thread; +} + uint32_t task_set_event(task_id_t tskid, uint32_t event, int wait) { tasks[tskid].event = event; @@ -307,6 +234,11 @@ task_id_t task_get_current(void) return my_task_id; } +task_id_t task_get_running(void) +{ + return running_task_id; +} + void wait_for_task_started(void) { int i, ok; |