summaryrefslogtreecommitdiff
path: root/core/host/task.c
diff options
context:
space:
mode:
Diffstat (limited to 'core/host/task.c')
-rw-r--r--core/host/task.c100
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;