Skip to content

Commit dc6a49d

Browse files
committed
tracing: Adjust addresses for printing out fields
Add adjustments to the values of the "fields" output if the buffer is a persistent ring buffer to adjust the addresses to both the kernel core and kernel modules if they match a module in the persistent memory and that module is also loaded. Cc: Masami Hiramatsu <mhiramat@kernel.org> Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Andrew Morton <akpm@linux-foundation.org> Link: https://lore.kernel.org/20250325185619.54b85587@gandalf.local.home Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
1 parent 00d872d commit dc6a49d

File tree

1 file changed

+21
-17
lines changed

1 file changed

+21
-17
lines changed

kernel/trace/trace_output.c

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -938,6 +938,9 @@ static void print_fields(struct trace_iterator *iter, struct trace_event_call *c
938938
struct list_head *head)
939939
{
940940
struct ftrace_event_field *field;
941+
struct trace_array *tr = iter->tr;
942+
unsigned long long laddr;
943+
unsigned long addr;
941944
int offset;
942945
int len;
943946
int ret;
@@ -974,8 +977,8 @@ static void print_fields(struct trace_iterator *iter, struct trace_event_call *c
974977
case FILTER_PTR_STRING:
975978
if (!iter->fmt_size)
976979
trace_iter_expand_format(iter);
977-
pos = *(void **)pos;
978-
ret = strncpy_from_kernel_nofault(iter->fmt, pos,
980+
addr = trace_adjust_address(tr, *(unsigned long *)pos);
981+
ret = strncpy_from_kernel_nofault(iter->fmt, (void *)addr,
979982
iter->fmt_size);
980983
if (ret < 0)
981984
trace_seq_printf(&iter->seq, "(0x%px)", pos);
@@ -984,8 +987,8 @@ static void print_fields(struct trace_iterator *iter, struct trace_event_call *c
984987
pos, iter->fmt);
985988
break;
986989
case FILTER_TRACE_FN:
987-
pos = *(void **)pos;
988-
trace_seq_printf(&iter->seq, "%pS", pos);
990+
addr = trace_adjust_address(tr, *(unsigned long *)pos);
991+
trace_seq_printf(&iter->seq, "%pS", (void *)addr);
989992
break;
990993
case FILTER_CPU:
991994
case FILTER_OTHER:
@@ -1015,24 +1018,25 @@ static void print_fields(struct trace_iterator *iter, struct trace_event_call *c
10151018
break;
10161019
}
10171020

1018-
if (sizeof(long) == 4)
1021+
addr = *(unsigned int *)pos;
1022+
if (sizeof(long) == 4) {
1023+
addr = trace_adjust_address(tr, addr);
10191024
trace_seq_printf(&iter->seq, "%pS (%d)",
1020-
*(void **)pos,
1021-
*(unsigned int *)pos);
1022-
else
1025+
(void *)addr, (int)addr);
1026+
} else {
10231027
trace_seq_printf(&iter->seq, "0x%x (%d)",
1024-
*(unsigned int *)pos,
1025-
*(unsigned int *)pos);
1028+
(unsigned int)addr, (int)addr);
1029+
}
10261030
break;
10271031
case 8:
1028-
if (sizeof(long) == 8)
1032+
laddr = *(unsigned long long *)pos;
1033+
if (sizeof(long) == 8) {
1034+
laddr = trace_adjust_address(tr, (unsigned long)laddr);
10291035
trace_seq_printf(&iter->seq, "%pS (%lld)",
1030-
*(void **)pos,
1031-
*(unsigned long long *)pos);
1032-
else
1033-
trace_seq_printf(&iter->seq, "0x%llx (%lld)",
1034-
*(unsigned long long *)pos,
1035-
*(unsigned long long *)pos);
1036+
(void *)(long)laddr, laddr);
1037+
} else {
1038+
trace_seq_printf(&iter->seq, "0x%llx (%lld)", laddr, laddr);
1039+
}
10361040
break;
10371041
default:
10381042
trace_seq_puts(&iter->seq, "<INVALID-SIZE>");

0 commit comments

Comments
 (0)