trace: Update the file header
It seems better to put the TEXT_BASE value in the file header rather than
in an entry record. While it is true that there is a separate base for
pre-relocation, this can be handled by using offsets in the file.
It is useful to have a version number in case we need to change the trace
format again.
Update the header to make these changes.
Signed-off-by: Simon Glass <sjg@chromium.org>
diff --git a/include/trace.h b/include/trace.h
index e7aee02..2be8d81 100644
--- a/include/trace.h
+++ b/include/trace.h
@@ -6,6 +6,8 @@
#ifndef __TRACE_H
#define __TRACE_H
+/* this file is included from a tool so uses uint32_t instead of u32, etc. */
+
enum {
/*
* This affects the granularity of our trace. We can bin function
@@ -23,6 +25,8 @@
* this value.
*/
FUNC_SITE_SIZE = 4, /* distance between function sites */
+
+ TRACE_VERSION = 1,
};
enum trace_chunk_type {
@@ -39,7 +43,11 @@
/* A header at the start of the trace output buffer */
struct trace_output_hdr {
enum trace_chunk_type type; /* Record type */
- size_t rec_count; /* Number of records */
+ uint32_t version; /* Version (TRACE_VERSION) */
+ uint32_t rec_count; /* Number of records */
+ uint32_t spare; /* 0 */
+ uint64_t text_base; /* Value of CONFIG_TEXT_BASE */
+ uint64_t spare2; /* 0 */
};
/* Print statistics about traced function calls */
@@ -63,7 +71,7 @@
enum ftrace_flags {
FUNCF_EXIT = 0UL << 30,
FUNCF_ENTRY = 1UL << 30,
- FUNCF_TEXTBASE = 2UL << 30,
+ /* two more values are available */
FUNCF_TIMESTAMP_MASK = 0x3fffffff,
};
diff --git a/lib/trace.c b/lib/trace.c
index b9dc6d2..2e2c1be 100644
--- a/lib/trace.c
+++ b/lib/trace.c
@@ -118,18 +118,6 @@
hdr->ftrace_count++;
}
-static void notrace add_textbase(void)
-{
- if (hdr->ftrace_count < hdr->ftrace_size) {
- struct trace_call *rec = &hdr->ftrace[hdr->ftrace_count];
-
- rec->func = CONFIG_TEXT_BASE;
- rec->caller = 0;
- rec->flags = FUNCF_TEXTBASE;
- }
- hdr->ftrace_count++;
-}
-
/**
* __cyg_profile_func_enter() - record function entry
*
@@ -278,8 +266,11 @@
/* Update the header */
if (output_hdr) {
+ memset(output_hdr, '\0', sizeof(*output_hdr));
output_hdr->rec_count = upto;
output_hdr->type = TRACE_CHUNK_CALLS;
+ output_hdr->version = TRACE_VERSION;
+ output_hdr->text_base = CONFIG_TEXT_BASE;
}
/* Work out how must of the buffer we used */
@@ -385,10 +376,9 @@
/* Use any remaining space for the timed function trace */
hdr->ftrace = (struct trace_call *)(buff + needed);
hdr->ftrace_size = (buff_size - needed) / sizeof(*hdr->ftrace);
- add_textbase();
+ hdr->depth_limit = CONFIG_TRACE_CALL_DEPTH_LIMIT;
puts("trace: enabled\n");
- hdr->depth_limit = CONFIG_TRACE_CALL_DEPTH_LIMIT;
trace_enabled = 1;
trace_inited = 1;
@@ -426,7 +416,6 @@
/* Use any remaining space for the timed function trace */
hdr->ftrace = (struct trace_call *)((char *)hdr + needed);
hdr->ftrace_size = (buff_size - needed) / sizeof(*hdr->ftrace);
- add_textbase();
hdr->depth_limit = CONFIG_TRACE_EARLY_CALL_DEPTH_LIMIT;
printf("trace: early enable at %08x\n", CONFIG_TRACE_EARLY_ADDR);