zephyr/subsys/debug/tracing/ctf/ctf_top.c

193 lines
3.4 KiB
C

/*
* Copyright (c) 2018 Oticon A/S
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr.h>
#include <kernel_structs.h>
#include <init.h>
#include "ctf_top.h"
#ifndef CONFIG_SMP
extern k_tid_t const _idle_thread;
#endif
static inline int is_idle_thread(struct k_thread *thread)
{
#ifdef CONFIG_SMP
return thread->base.is_idle;
#else
return thread == _idle_thread;
#endif
}
void sys_trace_thread_switched_out(void)
{
struct k_thread *thread = k_current_get();
ctf_top_thread_switched_out((u32_t)(uintptr_t)thread);
}
void sys_trace_thread_switched_in(void)
{
struct k_thread *thread = k_current_get();
ctf_top_thread_switched_in((u32_t)(uintptr_t)thread);
}
void sys_trace_thread_priority_set(struct k_thread *thread)
{
ctf_top_thread_priority_set((u32_t)(uintptr_t)thread,
thread->base.prio);
}
void sys_trace_thread_create(struct k_thread *thread)
{
ctf_bounded_string_t name = { "Unnamed thread" };
#if defined(CONFIG_THREAD_NAME)
if (thread->name != NULL) {
strncpy(name.buf, thread->name, sizeof(name.buf));
/* strncpy may not always null-terminate */
name.buf[sizeof(name.buf) - 1] = 0;
}
#endif
ctf_top_thread_create(
(u32_t)(uintptr_t)thread,
thread->base.prio,
name
);
#if defined(CONFIG_THREAD_STACK_INFO)
ctf_top_thread_info(
(u32_t)(uintptr_t)thread,
thread->stack_info.size,
thread->stack_info.start
);
#endif
}
void sys_trace_thread_abort(struct k_thread *thread)
{
ctf_top_thread_abort((u32_t)(uintptr_t)thread);
}
void sys_trace_thread_suspend(struct k_thread *thread)
{
ctf_top_thread_suspend((u32_t)(uintptr_t)thread);
}
void sys_trace_thread_resume(struct k_thread *thread)
{
ctf_top_thread_resume((u32_t)(uintptr_t)thread);
}
void sys_trace_thread_ready(struct k_thread *thread)
{
ctf_top_thread_ready((u32_t)(uintptr_t)thread);
}
void sys_trace_thread_pend(struct k_thread *thread)
{
ctf_top_thread_pend((u32_t)(uintptr_t)thread);
}
void sys_trace_thread_info(struct k_thread *thread)
{
#if defined(CONFIG_THREAD_STACK_INFO)
ctf_top_thread_info(
(u32_t)(uintptr_t)thread,
thread->stack_info.size,
thread->stack_info.start
);
#endif
}
void sys_trace_thread_name_set(struct k_thread *thread)
{
#if defined(CONFIG_THREAD_NAME)
ctf_bounded_string_t name = { "Unnamed thread" };
if (thread->name != NULL) {
strncpy(name.buf, thread->name, sizeof(name.buf));
/* strncpy may not always null-terminate */
name.buf[sizeof(name.buf) - 1] = 0;
}
ctf_top_thread_name_set(
(u32_t)(uintptr_t)thread,
name
);
#endif
}
void sys_trace_isr_enter(void)
{
ctf_top_isr_enter();
}
void sys_trace_isr_exit(void)
{
ctf_top_isr_exit();
}
void sys_trace_isr_exit_to_scheduler(void)
{
ctf_top_isr_exit_to_scheduler();
}
void sys_trace_idle(void)
{
ctf_top_idle();
}
void sys_trace_void(unsigned int id)
{
ctf_top_void(id);
}
void sys_trace_end_call(unsigned int id)
{
ctf_top_end_call(id);
}
void z_sys_trace_thread_switched_out(void)
{
sys_trace_thread_switched_out();
}
void z_sys_trace_thread_switched_in(void)
{
sys_trace_thread_switched_in();
}
void z_sys_trace_isr_enter(void)
{
sys_trace_isr_enter();
}
void z_sys_trace_isr_exit(void)
{
sys_trace_isr_exit();
}
void z_sys_trace_isr_exit_to_scheduler(void)
{
sys_trace_isr_exit_to_scheduler();
}
void z_sys_trace_idle(void)
{
sys_trace_idle();
}
static int ctf_top_init(struct device *arg)
{
ARG_UNUSED(arg);
ctf_bottom_configure();
ctf_bottom_start();
return 0;
}
SYS_INIT(ctf_top_init, PRE_KERNEL_1, 0);