]> Git Repo - u-boot.git/commitdiff
trace: Correct the relocation handover with buffer overflow
authorSimon Glass <[email protected]>
Sun, 15 Jan 2023 21:15:50 +0000 (14:15 -0700)
committerTom Rini <[email protected]>
Sat, 11 Feb 2023 17:22:35 +0000 (12:22 -0500)
When the early trace buffer overflows it leaves a gap in the trace buffer
between where the actual data finished and where it would have finished if
there were enough buffer space. This results in corrupted output.

Adjust the logic to resolve this and add a message when the buffer
overflows.

Signed-off-by: Simon Glass <[email protected]>
lib/trace.c

index c3354a256fbf5fb9b94cb2b06df9a109127f129a..bbc316af29593350e5c5383b4da7777a688b949c 100644 (file)
@@ -360,8 +360,8 @@ int notrace trace_init(void *buff, size_t buff_size)
 
        if (!was_disabled) {
 #ifdef CONFIG_TRACE_EARLY
+               ulong used, count;
                char *end;
-               ulong used;
 
                /*
                 * Copy over the early trace data if we have it. Disable
@@ -370,12 +370,19 @@ int notrace trace_init(void *buff, size_t buff_size)
                trace_enabled = 0;
                hdr = map_sysmem(CONFIG_TRACE_EARLY_ADDR,
                                 CONFIG_TRACE_EARLY_SIZE);
-               end = (char *)&hdr->ftrace[min(hdr->ftrace_count,
-                                              hdr->ftrace_size)];
+               count = min(hdr->ftrace_count, hdr->ftrace_size);
+               end = (char *)&hdr->ftrace[count];
                used = end - (char *)hdr;
                printf("trace: copying %08lx bytes of early data from %x to %08lx\n",
                       used, CONFIG_TRACE_EARLY_ADDR,
                       (ulong)map_to_sysmem(buff));
+               printf("%lu traced function calls", count);
+               if (hdr->ftrace_count > hdr->ftrace_size) {
+                       printf(" (%lu dropped due to overflow)",
+                              hdr->ftrace_count - hdr->ftrace_size);
+                       hdr->ftrace_count = hdr->ftrace_size;
+               }
+               puts("\n");
                memcpy(buff, hdr, used);
 #else
                puts("trace: already enabled\n");
This page took 0.035511 seconds and 4 git commands to generate.