From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752837AbcFTJa4 (ORCPT ); Mon, 20 Jun 2016 05:30:56 -0400 Received: from szxga01-in.huawei.com ([58.251.152.64]:63424 "EHLO szxga01-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751599AbcFTJ3O (ORCPT ); Mon, 20 Jun 2016 05:29:14 -0400 Subject: Re: [PATCH v2] tools/perf: Fix the mask in regs_dump__printf and To: Jiri Olsa , Madhavan Srinivasan References: <1466412241-27502-1-git-send-email-maddy@linux.vnet.ibm.com> <20160620091818.GC27702@krava> CC: , , "Yury Norov" , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Alexander Shishkin , Jiri Olsa , Adrian Hunter , Kan Liang , Michael Ellerman From: "Wangnan (F)" Message-ID: <5767B6FD.4080708@huawei.com> Date: Mon, 20 Jun 2016 17:27:25 +0800 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Thunderbird/38.5.0 MIME-Version: 1.0 In-Reply-To: <20160620091818.GC27702@krava> Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [10.111.66.109] X-CFilter-Loop: Reflected X-Mirapoint-Virus-RAPID-Raw: score=unknown(0), refid=str=0001.0A090205.5767B713.0018,ss=1,re=0.000,recu=0.000,reip=0.000,cl=1,cld=1,fgs=0, ip=0.0.0.0, so=2013-06-18 04:22:30, dmn=2013-03-21 17:37:32 X-Mirapoint-Loop-Id: 05bfb07b7e632d5386ac31568504cc18 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2016/6/20 17:18, Jiri Olsa wrote: > On Mon, Jun 20, 2016 at 02:14:01PM +0530, Madhavan Srinivasan wrote: >> When decoding the perf_regs mask in regs_dump__printf(), >> we loop through the mask using find_first_bit and find_next_bit functions. >> "mask" is of type "u64", but sent as a "unsigned long *" to >> lib functions along with sizeof(). While the exisitng code works fine in >> most of the case, the logic is broken when using a 32bit perf on a >> 64bit kernel (Big Endian). We end up reading the wrong word of the u64 >> first in the lib functions. > hum, I still don't see why this happens.. why do we read the > wrong word in this case? If you read a u64 using (u32 *)(&val)[0] and (u32 *)(&val)[1] you can get wrong value. This is what _find_next_bit() is doing. In a big endian environment where 'unsigned long' is 32 bits long, "(u32 *)(&val)[0]" gets upper 32 bits, but without this patch perf assumes it gets lower 32 bits. The root cause is wrongly convert u64 value to bitmap. Thank you.