[PATCH 1/1] trace: avoid infinite recursion
Pragnesh Patel
pragnesh.patel at openfive.com
Thu Nov 12 08:22:54 CET 2020
Hi Heinrich,
>-----Original Message-----
>From: Heinrich Schuchardt <xypron.glpk at gmx.de>
>Sent: 12 November 2020 12:44
>To: Simon Glass <sjg at chromium.org>
>Cc: Pragnesh Patel <pragnesh.patel at openfive.com>; u-boot at lists.denx.de;
>Heinrich Schuchardt <xypron.glpk at gmx.de>
>Subject: [PATCH 1/1] trace: avoid infinite recursion
>
>[External Email] Do not click links or attachments unless you recognize the
>sender and know the content is safe
>
>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
Replace one of __cyg_profile_func_exit() with __cyg_profile_func_enter()
>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.patel at openfive.com>
>Signed-off-by: Heinrich Schuchardt <xypron.glpk at 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) {
>+
No need for new line
> 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
Is this necessary ?
>+
> 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
More information about the U-Boot
mailing list