When tracing functions is enabled this adds calls to __cyg_profile_func_enter() and __cyg_profile_func_exit() to the traced functions.
__cyg_profile_func_exit() and __cyg_profile_func_exit() invoke timer_get_us() to record the entry and exit time. If timer_get_us() or any function used to implement does not carry __attribute__((no_instrument_function)) this will lead to an indefinite recursion. The patch changes __cyg_profile_func_enter() and __cyg_profile_func_exit() such that during their execution no function is traced by temporarily setting trace_enabled to false. Reported-by: Pragnesh Patel <pragnesh.pa...@openfive.com> Signed-off-by: Heinrich Schuchardt <xypron.g...@gmx.de> --- lib/trace.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/trace.c b/lib/trace.c index defc9716d8..b84b9fbfef 100644 --- a/lib/trace.c +++ b/lib/trace.c @@ -141,9 +141,12 @@ static void __attribute__((no_instrument_function)) add_textbase(void) void __attribute__((no_instrument_function)) __cyg_profile_func_enter( void *func_ptr, void *caller) { + if (trace_enabled) { int func; + char trace_enabled_old = trace_enabled; + trace_enabled = 0; trace_swap_gd(); add_ftrace(func_ptr, caller, FUNCF_ENTRY); func = func_ptr_to_num(func_ptr); @@ -157,6 +160,7 @@ void __attribute__((no_instrument_function)) __cyg_profile_func_enter( if (hdr->depth > hdr->depth_limit) hdr->max_depth = hdr->depth; trace_swap_gd(); + trace_enabled = trace_enabled_old; } } @@ -169,11 +173,17 @@ void __attribute__((no_instrument_function)) __cyg_profile_func_enter( void __attribute__((no_instrument_function)) __cyg_profile_func_exit( void *func_ptr, void *caller) { + trace_enabled + if (trace_enabled) { + char trace_enabled_old = trace_enabled; + + trace_enabled = 0; trace_swap_gd(); add_ftrace(func_ptr, caller, FUNCF_EXIT); hdr->depth--; trace_swap_gd(); + trace_enabled = trace_enabled_old; } } -- 2.28.0