Thread (5 messages) flat view 5 messages, 3 authors, 2016-06-22

Re: [PATCH v3] tools/perf: Fix the mask in regs_dump__printf and print_sample_iregs

From: Jiri Olsa <hidden>
Date: 2016-06-22 06:51:29
Also in: lkml

On Tue, Jun 21, 2016 at 06:35:31PM +0300, Yury Norov wrote:

SNIP
quoted
index 5214974e841a..1337b1c73f82 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -940,8 +940,22 @@ static void branch_stack__printf(struct perf_sample *sample)
 static void regs_dump__printf(u64 mask, u64 *regs)
 {
 	unsigned rid, i = 0;
+	unsigned long _mask[sizeof(mask)/sizeof(unsigned long)];
 
-	for_each_set_bit(rid, (unsigned long *) &mask, sizeof(mask) * 8) {
+	/*
+	 * Since u64 is passed as 'unsigned long *', check
+	 * to see whether we need to swap words within u64.
+	 * Reason being, in 32 bit big endian userspace on a
+	 * 64bit kernel, 'unsigned long' is 32 bits.
+	 * When reading u64 using (u32 *)(&val)[0] and (u32 *)(&val)[1],
+	 * we will get wrong value for the mask. This is what
+	 * find_first_bit() and find_next_bit() is doing.
+	 * Issue here is "(u32 *)(&val)[0]" gets upper 32 bits of u64,
+	 * but perf assumes it gets lower 32bits of u64. Hence the check
+	 * and swap.
+	 */
Identical comments... I'd prefer to see it in commit message, or
better in function description. For me it's pretty straightforward in
understanding what happens here in-place without comments.
yep, please use this just once as the fucntion description

thanks,
jirka
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help