From: gangchen@rdamicro.com (Chen Gang)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 1/1] ARM:r0 is also corrupted after calling __do_div64.
Date: Tue, 12 May 2015 18:42:47 +0800 [thread overview]
Message-ID: <5551D927.7070306@rdamicro.com> (raw)
In-Reply-To: <20150512100042.GN2067@n2100.arm.linux.org.uk>
On 05/12/2015 06:00 PM, Russell King - ARM Linux wrote:
> On Tue, May 12, 2015 at 02:33:06PM +0800, Chen Gang wrote:
>> R0 is corrupted after calling __do_div64 and compiler is not informed
>> about this in macro __do_div_asm. If n is to be used again after this
>> macro, r0 is not reloaded and n will contain incorrect value
> This isn't going to work if we're building for big endian (__ARMEB__
> set) because then we end up telling the compiler that __rem and __n
> are both in r0, which is impossible.
We tested your suggestion , it works and it feels better. I have
sent another patch based on your suggestions.
>
>> diff --git a/arch/arm/include/asm/div64.h b/arch/arm/include/asm/div64.h
>> index a66061a..93a9985 100644
>> --- a/arch/arm/include/asm/div64.h
>> +++ b/arch/arm/include/asm/div64.h
>> @@ -34,13 +34,13 @@
>> register unsigned long long __n asm("r0") = n; \
>> register unsigned long long __res asm("r2"); \
>> register unsigned int __rem asm(__xh); \
> register unsigned int __rem_xh asm(__xh); \
> register unsigned int __rem_xl asm(__xl); \
>
>> - asm( __asmeq("%0", __xh) \
>> + asm( __asmeq("%R0", __xh) \
> asm( __asmeq("%0", __xh) \
> __asmeq("%1", __xl) \
>
> ... and increment each following register %-spec by one...
>
>> __asmeq("%1", "r2") \
>> __asmeq("%2", "r0") \
>> __asmeq("%3", "r4") \
>> "bl __do_div64" \
>> - : "=r" (__rem), "=r" (__res) \
>> - : "r" (__n), "r" (__base) \
>> + : "=r" (__n), "=r" (__res) \
>> + : "0"(__n), "r" (__base) \
> This is obviously wrong because __rem is left unset, and that's one of
> the two values this macro returns.
>
> : "=r" (__rem_xh), "=r" (__rem_xl), "=r" (__res) \
> : "r" (__n), "r" (__base) \
>
>> : "ip", "lr", "cc"); \
>> n = __res; \
>> __rem; \
> __rem_xh;
>
> Basically this renames __rem to __rem_xh, and introduces a new __rem_xl
> to take the other half of the remainder which we don't use.
>
prev parent reply other threads:[~2015-05-12 10:42 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-12 6:33 [PATCH 1/1] ARM:r0 is also corrupted after calling __do_div64 Chen Gang
2015-05-12 10:00 ` Russell King - ARM Linux
2015-05-12 10:40 ` Chen Gang
2015-05-14 3:39 ` Chen Gang
2015-05-12 10:42 ` Chen Gang [this message]
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=5551D927.7070306@rdamicro.com \
--to=gangchen@rdamicro.com \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.