diff options
author | Frederic Weisbecker <fweisbec@gmail.com> | 2010-05-20 05:44:19 -0400 |
---|---|---|
committer | Steven Rostedt <rostedt@goodmis.org> | 2010-05-24 22:47:23 -0400 |
commit | 3c570c713da86adc56d655865b29da47a12c6005 (patch) | |
tree | ccee83968334189c503adef7f3abf9378b335413 | |
parent | e17252c0f125dcc14873412151950f9259021e13 (diff) |
parse-events: Fix unaligned accesses while fetching trace values
Accessing trace values of an 8 size may end up in a segfault
on archs that can't deal with misaligned access, which is the
case for sparc 64. This is because PERF_SAMPLE_RAW are aligned
to 4 and not to 8.
Fix this on the macros that get the values of 8 size.
This fixes segfaults on perf tools in sparc 64.
[ Got permission from Frederic to include this for LGPL trace-cmd ]
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
LKML-Reference: <1274348659-15417-4-git-send-regression-fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Tom Zanussi <tzanussi@gmail.com>
Cc: Masami Hiramatsu <mhiramat@redhat.com>
Cc: David Miller <davem@davemloft.net>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-rw-r--r-- | parse-events.h | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/parse-events.h b/parse-events.h index 7d1c42e..be28245 100644 --- a/parse-events.h +++ b/parse-events.h | |||
@@ -403,7 +403,13 @@ __data2host8(struct pevent *pevent, unsigned long long data) | |||
403 | 403 | ||
404 | #define data2host2(pevent, ptr) __data2host2(pevent, *(unsigned short *)(ptr)) | 404 | #define data2host2(pevent, ptr) __data2host2(pevent, *(unsigned short *)(ptr)) |
405 | #define data2host4(pevent, ptr) __data2host4(pevent, *(unsigned int *)(ptr)) | 405 | #define data2host4(pevent, ptr) __data2host4(pevent, *(unsigned int *)(ptr)) |
406 | #define data2host8(pevent, ptr) __data2host8(pevent, *(unsigned long long *)(ptr)) | 406 | #define data2host8(pevent, ptr) \ |
407 | ({ \ | ||
408 | unsigned long long __val; \ | ||
409 | \ | ||
410 | memcpy(&__val, (ptr), sizeof(unsigned long long)); \ | ||
411 | __data2host8(pevent, __val); \ | ||
412 | }) | ||
407 | 413 | ||
408 | /* taken from kernel/trace/trace.h */ | 414 | /* taken from kernel/trace/trace.h */ |
409 | enum trace_flag_type { | 415 | enum trace_flag_type { |