8000 debugability: trace_event with 4 parameters, assertion on invalid number of params by akloniex · Pull Request #478 · thesofproject/sof · GitHub
[go: up one dir, main page]

Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions src/include/sof/sof.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,12 @@ struct sa;
#define PP_NARG(...) (sizeof((unsigned int[]){0, ##__VA_ARGS__}) \
/ sizeof(unsigned int) - 1)

/* compile-time assertion */
#define STATIC_ASSERT(COND, MESSAGE) \
__attribute__((unused)) \
typedef char assertion_failed_##MESSAGE[(COND) ? 1 : -1]


/* general firmware context */
struct sof {
/* init data */
Expand Down
52 changes: 34 additions & 18 deletions src/include/sof/trace.h
8000
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,15 @@ void _trace_event_atomic3(uint32_t log_entry, uint32_t param1, uint32_t param2,
void _trace_event_mbox_atomic3(uint32_t log_entry, uint32_t param1,
uint32_t param2, uint32_t param3);

void _trace_event4(uint32_t log_entry, uint32_t param1, uint32_t param2,
uint32_t param3, uint32_t param4);
void _trace_event_mbox4(uint32_t log_entry, uint32_t param1, uint32_t param2,
uint32_t param3, uint32_t param4);
void _trace_event_atomic4(uint32_t log_entry, uint32_t param1, uint32_t param2,
uint32_t param3, uint32_t param4);
void _trace_event_mbox_atomic4(uint32_t log_entry, uint32_t param1,
uint32_t param2, uint32_t param3, uint32_t param4);

void trace_flush(void);
void trace_off(void);
void trace_init(struct sof *sof);
Expand All @@ -124,8 +133,9 @@ void trace_init(struct sof *sof);
* It comes in 2 main flavours, atomic and non-atomic. Depending of definitions
* above, it might also propagate log messages to mbox if desired.
*
* First argument is always class of event being logged, as defined above.
* Second argument is string literal in printf format, followed by up to 3
* First argument is always class of event being logged, as defined in
* uapi/logging.h.
* Second argument is string literal in printf format, followed by up to 4
* parameters (uint32_t), that are used to expand into string fromat when
* parsing log data.
*
Expand Down Expand Up @@ -217,22 +227,28 @@ typedef void(*log_func)();
format \
}

#define BASE_LOG(function_name, entry, ...) \
{ \
log_func log_function = NULL; \
if (PP_NARG(__VA_ARGS__) == 0) { \
log_function = (log_func)&function_name##0; \
log_function(entry, ##__VA_ARGS__); \
} else if (PP_NARG(__VA_ARGS__) == 1) { \
log_function = (log_func)&function_name##1; \
log_function(entry, ##__VA_ARGS__); \
} else if (PP_NARG(__VA_ARGS__) == 2) { \
log_function = (log_func)&function_name##2; \
log_function(entry, ##__VA_ARGS__); \
} else if (PP_NARG(__VA_ARGS__) == 3) { \
log_function = (log_func)&function_name##3; \
log_function(entry, ##__VA_ARGS__); \
} \
#define BASE_LOG(function_name, entry, ...) \
{ \
log_func log_function = NULL; \
if (PP_NARG(__VA_ARGS__) == 0) { \
log_function = (log_func)&function_name##0; \
log_function(entry, ##__VA_ARGS__); \
} else if (PP_NARG(__VA_ARGS__) == 1) { \
log_function = (log_func)&function_name##1; \
log_function(entry, ##__VA_ARGS__); \
} else if (PP_NARG(__VA_ARGS__) == 2) { \
log_function = (log_func)&function_name##2; \
log_function(entry, ##__VA_ARGS__); \
} else if (PP_NARG(__VA_ARGS__) == 3) { \
log_function = (log_func)&function_name##3; \
log_function(entry, ##__VA_ARGS__); \
} else if (PP_NARG(__VA_ARGS__) == 4) { \
log_function = (log_func)&function_name##4; \
log_function(entry, ##__VA_ARGS__); \
} else { \
STATIC_ASSERT(PP_NARG(__VA_ARGS__) <= 4, \
unsupported_amount_of_params_in_trace_event); \
} \
}

#define __log_message(func_name, lvl, comp_id, format, ...) \
Expand Down
140 changes: 140 additions & 0 deletions src/lib/trace.c
Original file line number Diff line number Diff line change
Expand Up @@ -558,6 +558,146 @@ void _trace_event_mbox_atomic3(uint32_t log_entry, uint32_t param1,
sizeof(uint32_t) * message_size_dwords);
}

/* send trace events only to the local trace buffer */
void _trace_event4(uint32_t log_entry, uint32_t param1, uint32_t param2,
uint32_t param3, uint32_t param4)
{
uint32_t message_size_dwords = MESSAGE_SIZE(4);
uint32_t payload_offset = sizeof(struct log_entry_header)
/ sizeof(uint32_t);
uint32_t dt[MESSAGE_SIZE(4)];

if (!trace->enable)
return;

put_header(dt, platform_timer_get(platform_timer));

dt[payload_offset] = log_entry;
dt[payload_offset + 1] = param1;
dt[payload_offset + 2] = param2;
dt[payload_offset + 3] = param3;
dt[payload_offset + 4] = param4;
dtrace_event((const char *)dt, sizeof(uint32_t) * message_size_dwords);
}

void _trace_event_atomic4(uint32_t log_entry, uint32_t param1, uint32_t param2,
uint32_t param3, uint32_t param4)
{
uint32_t message_size_dwords = MESSAGE_SIZE(4);
uint32_t payload_offset = sizeof(struct log_entry_header)
/ sizeof(uint32_t);
uint32_t dt[MESSAGE_SIZE(4)];

if (!trace->enable)
return;

put_header(dt, platform_timer_get(platform_timer));

dt[payload_offset] = log_entry;
dt[payload_offset + 1] = param1;
dt[payload_offset + 2] = param2;
dt[payload_offset + 3] = param3;
dt[payload_offset + 4] = param4;
dtrace_event_atomic((const char *)dt,
sizeof(uint32_t) * message_size_dwords);
}

/* send trace events to the local trace buffer and the mailbox */
void _trace_event_mbox4(uint32_t log_entry, uint32_t param1, uint32_t param2,
uint32_t param3, uint32_t param4)
{
unsigned long flags;
uint32_t message_size_dwords = MESSAGE_SIZE(4);
uint32_t payload_offset = sizeof(struct log_entry_header)
/ sizeof(uint32_t);
uint32_t dt[MESSAGE_SIZE(4)];
uint64_t time;

volatile uint32_t *t;

if (!trace->enable)
return;

time = platform_timer_get(platform_timer);

put_header(dt, time);

dt[payload_offset] = log_entry;
dt[payload_offset + 1] = param1;
dt[payload_offset + 2] = param2;
dt[payload_offset + 3] = param3;
dt[payload_offset + 4] = param4;
dtrace_event((const char *)dt, sizeof(uint32_t) * message_size_dwords);

/* send event by mail box too. */
spin_lock_irq(&trace->lock, flags);

/* write timestamp and event to trace buffer */
t = (volatile uint32_t *)(MAILBOX_TRACE_BASE + trace->pos);
trace->pos += sizeof(uint32_t) * message_size_dwords;

if (trace->pos > MAILBOX_TRACE_SIZE
- sizeof(uint32_t) * message_size_dwords)
trace->pos = 0;

spin_unlock_irq(&trace->lock, flags);

put_header(t, time);
t[payload_offset] = log_entry;
t[payload_offset + 1] = param1;
t[payload_offset + 2] = param2;
t[payload_offset + 3] = param3;
t[payload_offset + 4] = param4;

/* writeback trace data */
dcache_writeback_region((void *)t,
sizeof(uint32_t) * message_size_dwords);
}

void _trace_event_mbox_atomic4(uint32_t log_entry, uint32_t param1,
uint32_t param2, uint32_t param3, uint32_t param4)
{
volatile uint32_t *t;
uint32_t message_size_dwords = MESSAGE_SIZE(4);
uint32_t payload_offset = sizeof(struct log_entry_header)
/ sizeof(uint32_t);
uint32_t dt[MESSAGE_SIZE(4)];
uint64_t time;

if (!trace->enable)
return;

time = platform_timer_get(platform_timer);

put_header(dt, time);
dt[payload_offset] = log_entry;
dt[payload_offset + 1] = param1;
dt[payload_offset + 2] = param2;
dt[payload_offset + 3] = param3;
dt[payload_offset + 4] = param4;
dtrace_event_atomic((const char *)dt,
sizeof(uint32_t) * message_size_dwords);

/* write timestamp and event to trace buffer */
t = (volatile uint32_t *)(MAILBOX_TRACE_BASE + trace->pos);
trace->pos += sizeof(uint32_t) * message_size_dwords;

if (trace->pos > MAILBOX_TRACE_SIZE
- sizeof(uint32_t) * message_size_dwords)
trace->pos = 0;

put_header(t, time);
t[payload_offset] = log_entry;
t[payload_offset + 1] = param1;
t[payload_offset + 2] = param2;
t[payload_offset + 3] = param3;
t[payload_offset + 4] = param4;

/* writeback trace data */
dcache_writeback_region((void *)t,
sizeof(uint32_t) * message_size_dwords);
}

void trace_flush(void)
{
volatile uint64_t *t;
Expand Down
0