blob: 8a0d33ce0a056de92dcf2f91d662f14145cf3f67 [file] [log] [blame]
/*
* Copyright (c) 2018 Oticon A/S
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr.h>
#include <kernel_structs.h>
#include <kernel_internal.h>
#include <ctf_top.h>
static void _get_thread_name(struct k_thread *thread,
ctf_bounded_string_t *name)
{
const char *tname = k_thread_name_get(thread);
if (tname != NULL && tname[0] != '\0') {
strncpy(name->buf, tname, sizeof(name->buf));
/* strncpy may not always null-terminate */
name->buf[sizeof(name->buf) - 1] = 0;
}
}
void sys_trace_thread_switched_out(void)
{
ctf_bounded_string_t name = { "unknown" };
struct k_thread *thread;
thread = k_current_get();
_get_thread_name(thread, &name);
ctf_top_thread_switched_out((uint32_t)(uintptr_t)thread, name);
}
void sys_trace_thread_switched_in(void)
{
struct k_thread *thread;
ctf_bounded_string_t name = { "unknown" };
thread = k_current_get();
_get_thread_name(thread, &name);
ctf_top_thread_switched_in((uint32_t)(uintptr_t)thread, name);
}
void sys_trace_thread_priority_set(struct k_thread *thread)
{
ctf_bounded_string_t name = { "unknown" };
_get_thread_name(thread, &name);
ctf_top_thread_priority_set((uint32_t)(uintptr_t)thread,
thread->base.prio, name);
}
void sys_trace_thread_create(struct k_thread *thread)
{
ctf_bounded_string_t name = { "unknown" };
_get_thread_name(thread, &name);
ctf_top_thread_create(
(uint32_t)(uintptr_t)thread,
thread->base.prio,
name
);
#if defined(CONFIG_THREAD_STACK_INFO)
ctf_top_thread_info(
(uint32_t)(uintptr_t)thread,
name,
thread->stack_info.start,
thread->stack_info.size
);
#endif
}
void sys_trace_thread_abort(struct k_thread *thread)
{
ctf_bounded_string_t name = { "unknown" };
_get_thread_name(thread, &name);
ctf_top_thread_abort((uint32_t)(uintptr_t)thread, name);
}
void sys_trace_thread_suspend(struct k_thread *thread)
{
ctf_bounded_string_t name = { "unknown" };
_get_thread_name(thread, &name);
ctf_top_thread_suspend((uint32_t)(uintptr_t)thread, name);
}
void sys_trace_thread_resume(struct k_thread *thread)
{
ctf_bounded_string_t name = { "unknown" };
_get_thread_name(thread, &name);
ctf_top_thread_resume((uint32_t)(uintptr_t)thread, name);
}
void sys_trace_thread_ready(struct k_thread *thread)
{
ctf_bounded_string_t name = { "unknown" };
_get_thread_name(thread, &name);
ctf_top_thread_ready((uint32_t)(uintptr_t)thread, name);
}
void sys_trace_thread_pend(struct k_thread *thread)
{
ctf_bounded_string_t name = { "unknown" };
_get_thread_name(thread, &name);
ctf_top_thread_pend((uint32_t)(uintptr_t)thread, name);
}
void sys_trace_thread_info(struct k_thread *thread)
{
#if defined(CONFIG_THREAD_STACK_INFO)
ctf_bounded_string_t name = { "unknown" };
_get_thread_name(thread, &name);
ctf_top_thread_info(
(uint32_t)(uintptr_t)thread,
name,
thread->stack_info.start,
thread->stack_info.size
);
#endif
}
void sys_trace_thread_name_set(struct k_thread *thread)
{
ctf_bounded_string_t name = { "unknown" };
_get_thread_name(thread, &name);
ctf_top_thread_name_set(
(uint32_t)(uintptr_t)thread,
name
);
}
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_semaphore_init(struct k_sem *sem)
{
ctf_top_semaphore_init(
(uint32_t)(uintptr_t)sem
);
}
void sys_trace_semaphore_take(struct k_sem *sem)
{
ctf_top_semaphore_take(
(uint32_t)(uintptr_t)sem
);
}
void sys_trace_semaphore_give(struct k_sem *sem)
{
ctf_top_semaphore_give(
(uint32_t)(uintptr_t)sem
);
}
void sys_trace_mutex_init(struct k_mutex *mutex)
{
ctf_top_mutex_init(
(uint32_t)(uintptr_t)mutex
);
}
void sys_trace_mutex_lock(struct k_mutex *mutex)
{
ctf_top_mutex_lock(
(uint32_t)(uintptr_t)mutex
);
}
void sys_trace_mutex_unlock(struct k_mutex *mutex)
{
ctf_top_mutex_unlock(
(uint32_t)(uintptr_t)mutex
);
}
void sys_trace_end_call(unsigned int id)
{
ctf_top_end_call(id);
}