]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
trace: Fix alignment logic in flyrecord header
authorMichal Simek <michal.simek@amd.com>
Fri, 15 Sep 2023 12:12:05 +0000 (14:12 +0200)
committerMichal Simek <michal.simek@amd.com>
Thu, 21 Sep 2023 11:20:12 +0000 (13:20 +0200)
Current alignment which is using 16 bytes is not correct in connection to
trace_clocks description and it's length.
That's why use start_addr variable and record proper size based on used
entries.

Fixes: be16fc81b2ed ("trace: Update proftool to use new binary format").
Reviewed-by: Simon Glass <sjg@chromium.org>
Signed-off-by: Michal Simek <michal.simek@amd.com>
Link: https://lore.kernel.org/r/691dad64df80993ca4cfb6d0e33964ed26f50bee.1694779918.git.michal.simek@amd.com
tools/proftool.c

index 7c95a94482fc45c76419f74cb9643a579f649ce1..fca45e4a5af64056fe6ca94d55c4672fb4cd384b 100644 (file)
@@ -1493,19 +1493,43 @@ static int write_pages(struct twriter *tw, enum out_format_t out_format,
 static int write_flyrecord(struct twriter *tw, enum out_format_t out_format,
                           int *missing_countp, int *skip_countp)
 {
-       unsigned long long start, len;
+       unsigned long long start, start_ofs, len;
        int ret;
        FILE *fout = tw->fout;
        char str[200];
 
+       /* Record start pointer */
+       start_ofs = tw->ptr;
+       debug("Start of flyrecord header at: 0x%llx\n", start_ofs);
+
        tw->ptr += fprintf(fout, "flyrecord%c", 0);
 
+       /* flyrecord\0 - allocated 10 bytes */
+       start_ofs += 10;
+
+       /*
+        * 8 bytes that are a 64-bit word containing the offset into the file
+        * that holds the data for the CPU.
+        *
+        * 8 bytes that are a 64-bit word containing the size of the CPU
+        * data at that offset.
+        */
+       start_ofs += 16;
+
        snprintf(str, sizeof(str),
                 "[local] global counter uptime perf mono mono_raw boot x86-tsc\n");
        len = strlen(str);
 
+       /* trace clock length - 8 bytes */
+       start_ofs += 8;
+       /* trace clock data */
+       start_ofs += len;
+
+       debug("Calculated flyrecord header end at: 0x%llx, trace clock len: 0x%llx\n",
+             start_ofs, len);
+
        /* trace data */
-       start = ALIGN(tw->ptr + 16, TRACE_PAGE_SIZE);
+       start = ALIGN(start_ofs, TRACE_PAGE_SIZE);
        tw->ptr += tputq(fout, start);
 
        /* use a placeholder for the size */
@@ -1517,6 +1541,9 @@ static int write_flyrecord(struct twriter *tw, enum out_format_t out_format,
        tw->ptr += tputq(fout, len);
        tw->ptr += tputs(fout, str);
 
+       debug("End of flyrecord header at: 0x%x, offset: 0x%llx\n",
+             tw->ptr, start);
+
        debug("trace text base %lx, map file %lx\n", text_base, text_offset);
 
        ret = write_pages(tw, out_format, missing_countp, skip_countp);