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

Reply via email to