subsys: debug: tracing: Fix thread tracing

Change fixes issue with thread execution tracing.

Signed-off-by: Marek Pieta <Marek.Pieta@nordicsemi.no>
This commit is contained in:
Marek Pieta 2018-10-26 16:54:16 +02:00 committed by Anas Nashif
commit e87193896a
7 changed files with 52 additions and 4 deletions

View file

@ -46,7 +46,7 @@ SECTION_FUNC(TEXT, __pendsv)
#ifdef CONFIG_TRACING #ifdef CONFIG_TRACING
/* Register the context switch */ /* Register the context switch */
push {lr} push {lr}
bl z_sys_trace_thread_switched_in bl z_sys_trace_thread_switched_out
#if defined(CONFIG_ARMV6_M_ARMV8_M_BASELINE) #if defined(CONFIG_ARMV6_M_ARMV8_M_BASELINE)
pop {r0} pop {r0}
mov lr, r0 mov lr, r0
@ -255,6 +255,18 @@ _thread_irq_disabled:
ldm sp!,{r0-r3} /* Load back regs ro to r4 */ ldm sp!,{r0-r3} /* Load back regs ro to r4 */
#endif /* CONFIG_EXECUTION_BENCHMARKING */ #endif /* CONFIG_EXECUTION_BENCHMARKING */
#ifdef CONFIG_TRACING
/* Register the context switch */
push {lr}
bl z_sys_trace_thread_switched_in
#if defined(CONFIG_ARMV6_M_ARMV8_M_BASELINE)
pop {r0}
mov lr, r0
#else
pop {lr}
#endif /* CONFIG_ARMV6_M_ARMV8_M_BASELINE */
#endif /* CONFIG_TRACING */
/* exc return */ /* exc return */
bx lr bx lr

View file

@ -55,7 +55,13 @@ _arch_switch_to_main_thread(struct k_thread *main_thread,
#endif #endif
start_of_main_stack = (void *)STACK_ROUND_DOWN(start_of_main_stack); start_of_main_stack = (void *)STACK_ROUND_DOWN(start_of_main_stack);
#ifdef CONFIG_TRACING
z_sys_trace_thread_switched_out();
#endif
_current = main_thread; _current = main_thread;
#ifdef CONFIG_TRACING
z_sys_trace_thread_switched_in();
#endif
/* the ready queue cache already contains the main thread */ /* the ready queue cache already contains the main thread */

View file

@ -23,6 +23,7 @@ void z_sys_trace_idle(void);
void z_sys_trace_isr_enter(void); void z_sys_trace_isr_enter(void);
void z_sys_trace_isr_exit_to_scheduler(void); void z_sys_trace_isr_exit_to_scheduler(void);
void z_sys_trace_thread_switched_in(void); void z_sys_trace_thread_switched_in(void);
void z_sys_trace_thread_switched_out(void);
#endif #endif
#ifdef CONFIG_SEGGER_SYSTEMVIEW #ifdef CONFIG_SEGGER_SYSTEMVIEW
@ -122,5 +123,7 @@ void z_sys_trace_thread_switched_in(void);
#define z_sys_trace_thread_switched_in() #define z_sys_trace_thread_switched_in()
#define z_sys_trace_thread_switched_out()
#endif #endif
#endif #endif

View file

@ -90,12 +90,16 @@ static inline int _Swap(unsigned int key)
int ret; int ret;
_check_stack_sentinel(); _check_stack_sentinel();
#ifndef CONFIG_ARM
#ifdef CONFIG_TRACING #ifdef CONFIG_TRACING
sys_trace_thread_switched_out(); sys_trace_thread_switched_out();
#endif
#endif #endif
ret = __swap(key); ret = __swap(key);
#ifndef CONFIG_ARM
#ifdef CONFIG_TRACING #ifdef CONFIG_TRACING
sys_trace_thread_switched_in(); sys_trace_thread_switched_in();
#endif
#endif #endif
return ret; return ret;

View file

@ -279,6 +279,15 @@ static void prepare_multithreading(struct k_thread *dummy_thread)
#ifdef CONFIG_ARCH_HAS_CUSTOM_SWAP_TO_MAIN #ifdef CONFIG_ARCH_HAS_CUSTOM_SWAP_TO_MAIN
ARG_UNUSED(dummy_thread); ARG_UNUSED(dummy_thread);
#else #else
#ifdef CONFIG_TRACING
sys_trace_thread_switched_out();
#endif
_current = dummy_thread;
#ifdef CONFIG_TRACING
sys_trace_thread_switched_in();
#endif
/* /*
* Initialize the current execution thread to permit a level of * Initialize the current execution thread to permit a level of
* debugging output if an exception should happen during kernel * debugging output if an exception should happen during kernel
@ -286,9 +295,6 @@ static void prepare_multithreading(struct k_thread *dummy_thread)
* fields of the dummy thread beyond those needed to identify it as a * fields of the dummy thread beyond those needed to identify it as a
* dummy thread. * dummy thread.
*/ */
_current = dummy_thread;
dummy_thread->base.user_options = K_ESSENTIAL; dummy_thread->base.user_options = K_ESSENTIAL;
dummy_thread->base.thread_state = _THREAD_DUMMY; dummy_thread->base.thread_state = _THREAD_DUMMY;
#ifdef CONFIG_THREAD_STACK_INFO #ifdef CONFIG_THREAD_STACK_INFO

View file

@ -508,12 +508,24 @@ void *_get_next_switch_handle(void *interrupted)
if (_current != th) { if (_current != th) {
reset_time_slice(); reset_time_slice();
_current_cpu->swap_ok = 0; _current_cpu->swap_ok = 0;
#ifdef CONFIG_TRACING
sys_trace_thread_switched_out();
#endif
_current = th; _current = th;
#ifdef CONFIG_TRACING
sys_trace_thread_switched_in();
#endif
} }
} }
#else #else
#ifdef CONFIG_TRACING
sys_trace_thread_switched_out();
#endif
_current = _get_next_ready_thread(); _current = _get_next_ready_thread();
#ifdef CONFIG_TRACING
sys_trace_thread_switched_in();
#endif
#endif #endif
_check_stack_sentinel(); _check_stack_sentinel();

View file

@ -39,6 +39,11 @@ void z_sys_trace_thread_switched_in(void)
sys_trace_thread_switched_in(); sys_trace_thread_switched_in();
} }
void z_sys_trace_thread_switched_out(void)
{
sys_trace_thread_switched_out();
}
static void send_task_list_cb(void) static void send_task_list_cb(void)
{ {
struct k_thread *thread; struct k_thread *thread;