Hi Steven,
Thanks for checking this out.
quoted
+TRACE_EVENT(fsi_master_write,
+ TP_PROTO(const struct fsi_master *master, int link, int id,
+ uint32_t addr, size_t size, const void *data),
+ TP_ARGS(master, link, id, addr, size, data),
+ TP_STRUCT__entry(
+ __field(int, master_idx)
+ __field(int, link)
+ __field(int, id)
+ __field(__u32, addr)
+ __field(size_t, size)
+ __field(__u32, data)
+ ),
+ TP_fast_assign(
+ __entry->master_idx = master->idx;
+ __entry->link = link;
+ __entry->id = id;
+ __entry->addr = addr;
+ __entry->size = size;
+ __entry->data = 0;
+ memcpy(&__entry->data, data, size);
Um, can size ever be greater than 4? If so, this is a bug.
No, size will only ever be 1, 2, or 4, as they're the only valid FSI bus
transactions. Hence storing ->data as a u32 to keep things simple.
I think you may want to use a dynamic array here.
TP_STRUCT__entry(
[..]
__dynamic_array(char, data, size)
[..]
TP_fast_assign(
[..]
memcpy(__get_dynamic_array(data), data, size);
[..]
TP_printk(...
[..]
__entry->size,
__get_dynamic_array(data)
You may also want to look at __print_array() too.
The %ph specifier seems to do a decent job though...
Cheers,
Jeremy