]> git.baikalelectronics.ru Git - uboot.git/commitdiff
trace: Detect an infinite loop
authorSimon Glass <sjg@chromium.org>
Sun, 15 Jan 2023 21:15:51 +0000 (14:15 -0700)
committerTom Rini <trini@konsulko.com>
Sat, 11 Feb 2023 17:22:35 +0000 (12:22 -0500)
If something is wrong with a board's timer function such that it calls
functions not marked with notrace, U-Boot will hang.

Detect this, print a message and disable the trace.

Signed-off-by: Simon Glass <sjg@chromium.org>
lib/trace.c

index bbc316af29593350e5c5383b4da7777a688b949c..1091a5793a1cab6523e7082a0009c8e874c1b6e8 100644 (file)
@@ -39,6 +39,7 @@ struct trace_hdr {
        int depth_limit;        /* Depth limit to trace to */
        int max_depth;          /* Maximum depth seen so far */
        int min_depth;          /* Minimum depth seen so far */
+       bool trace_locked;      /* Used to detect recursive tracing */
 };
 
 /* Pointer to start of trace buffer */
@@ -133,6 +134,14 @@ void notrace __cyg_profile_func_enter(void *func_ptr, void *caller)
        if (trace_enabled) {
                int func;
 
+               if (hdr->trace_locked) {
+                       trace_enabled = 0;
+                       puts("trace: recursion detected, disabling\n");
+                       hdr->trace_locked = false;
+                       return;
+               }
+
+               hdr->trace_locked = true;
                trace_swap_gd();
                add_ftrace(func_ptr, caller, FUNCF_ENTRY);
                func = func_ptr_to_num(func_ptr);
@@ -146,6 +155,7 @@ void notrace __cyg_profile_func_enter(void *func_ptr, void *caller)
                if (hdr->depth > hdr->max_depth)
                        hdr->max_depth = hdr->depth;
                trace_swap_gd();
+               hdr->trace_locked = false;
        }
 }