public inbox for linux-arm-kernel@lists.infradead.org 
 help / color / mirror / Atom feed
From: luxiangyu@huawei•com (luxiangyu)
To: linux-arm-kernel@lists•infradead.org
Subject: [PATCH] ARM: fix do_div() bug in big-endian systems
Date: Tue, 15 Apr 2014 16:44:15 +0800	[thread overview]
Message-ID: <534CF15F.3030403@huawei.com> (raw)
In-Reply-To: <20140415081805.GB3596@e103592.cambridge.arm.com>

On 2014/4/15 16:18, Dave Martin wrote:
> On Mon, Apr 14, 2014 at 12:03:09PM -0400, Nicolas Pitre wrote:
>> On Mon, 14 Apr 2014, Dave Martin wrote:
>>
>>> On Fri, Apr 11, 2014 at 06:16:24PM +0800, Lu Xiangyu wrote:
>>>> From: Xiangyu Lu <luxiangyu@huawei•com>
>>>>
>>>> In big-endian systems, "%1" get the most significant part of the value, cause
>>>> the instruction to get the wrong result.
>>>>
>>>> When viewing ftrace record in big-endian ARM systems, we found that
>>>> the timestamp errors:
>>>>
>>>> swapper-0     [001]  1325.970000:      0:120:R ==> [001]    16:120:R events/1
>>>> events/1-16   [001]  1325.970000:      16:120:S ==> [001]    0:120:R swapper
>>>> swapper-0     [000]  1325.1000000:     0:120:R   + [000]    15:120:R events/0
>>>> swapper-0     [000]  1325.1000000:     0:120:R ==> [000]    15:120:R events/0
>>>> swapper-0     [000]  1326.030000:      0:120:R   + [000]  1150:120:R sshd
>>>> swapper-0     [000]  1326.030000:      0:120:R ==> [000]  1150:120:R sshd
>>>>
>>>> When viewed ftrace records, it will call the do_div(n, base) function, which
>>>> achieved arch/arm/include/asm/div64.h in. When n = 10000000, base = 1000000, in
>>>> do_div(n, base) will execute "umull %Q0, %R0, %1, %Q2".
>>>>
>>>> Cc: <stable@vger•kernel.org> # 2.6.20+
>>>> Signed-off-by: Alex Wu <wuquanming@huawei•com>
>>>> Signed-off-by: Xiangyu Lu <luxiangyu@huawei•com>
>>>> ---
>>>>   arch/arm/include/asm/div64.h |    2 +-
>>>>   1 file changed, 1 insertion(+), 1 deletion(-)
>>>>
>>>> diff --git a/arch/arm/include/asm/div64.h b/arch/arm/include/asm/div64.h
>>>> index 191ada6..662c7bd 100644
>>>> --- a/arch/arm/include/asm/div64.h
>>>> +++ b/arch/arm/include/asm/div64.h
>>>> @@ -156,7 +156,7 @@
>>>>   		/* Select the best insn combination to perform the   */	\
>>>>   		/* actual __m * __n / (__p << 64) operation.         */	\
>>>>   		if (!__c) {						\
>>>> -			asm (	"umull	%Q0, %R0, %1, %Q2\n\t"		\
>>>> +			asm (	"umull	%Q0, %R0, %Q1, %Q2\n\t"		\
>>> This looks plausible: these if() clauses are all concerned with
>>> multiplying the low parts of __m and __n together, and this seems
>>> to be the only 64-bit asm operand reference where Q or R is suspiciously
>>> missing: so it looks likely that "Q" is required here for consistency.
>>>
>>> My understanding of the details of this code are limited: do you have
>>> a simple test case to demonstrate the error and the fix?
>> No need -- it is indeed wrong on big endian and has been so for the last
>> 7.5 years.
> OK, well with that sanity-check on my reasoning I'm happy to:
>
> Reviewed-by: Dave Martin <Dave.Martin@arm•com>
>
> I suggest you go ahead and send it to Russell's patch system.
>
> Cheers
> ---Dave
> .
>
OK, thanks.

  reply	other threads:[~2014-04-15  8:44 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-04-11 10:16 [PATCH] ARM: fix do_div() bug in big-endian systems Lu Xiangyu
2014-04-14 11:12 ` Dave Martin
2014-04-14 16:03   ` Nicolas Pitre
2014-04-15  8:18     ` Dave Martin
2014-04-15  8:44       ` luxiangyu [this message]
2014-04-14 15:59 ` Nicolas Pitre

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=534CF15F.3030403@huawei.com \
    --to=luxiangyu@huawei$(echo .)com \
    --cc=linux-arm-kernel@lists$(echo .)infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox