summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichal Simek <michal.simek@amd.com>2023-09-15 15:12:05 +0300
committerSimon Glass <sjg@chromium.org>2023-09-23 18:00:37 +0300
commite278ad9a2ea5e4a089773a8fd79a5ea0e8572316 (patch)
tree97e9fe98dfc5b00ef2211fa1c1c65a7022612798
parent5ae43b8706c8897cbd711dbb0f023703b08b5fd3 (diff)
downloadu-boot-e278ad9a2ea5e4a089773a8fd79a5ea0e8572316.tar.xz
trace: Fix alignment logic in flyrecord header
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"). Signed-off-by: Michal Simek <michal.simek@amd.com> Reviewed-by: Simon Glass <sjg@chromium.org>
-rw-r--r--tools/proftool.c31
1 files changed, 29 insertions, 2 deletions
diff --git a/tools/proftool.c b/tools/proftool.c
index 7c95a94482..fca45e4a5a 100644
--- a/tools/proftool.c
+++ b/tools/proftool.c
@@ -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);