trace: Detect an infinite loop

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>
This commit is contained in:
Simon Glass 2023-01-15 14:15:51 -07:00 committed by Tom Rini
parent 80f91558a1
commit 852d4dbd70

View 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;
}
}