[PATCH V4 1/1] ARM : missing corrupted reg in __div64_32
陈刚(Gangchen)
gangchen at rdamicro.com
Fri Apr 1 04:35:13 PDT 2016
On 04/01/2016 07:03 PM, Dave Martin wrote:
> On Fri, Apr 01, 2016 at 06:28:49PM +0800, chengang wrote:
>> __xl(R0 in little endian system, or R1 in big endian system) is corrupted
>> by the call to __do_div64i(). The compiler is not aware of this, so if
> Should that be "__do_div64", not "__do_div64i"?
>
>> n is used afterwards __xl won't be reloaded and n will contain incorrect value.
>>
>> Mark 64bits variable __n as inputi/output to inform compiler both r0 and r1
> Typo: "inputi"
>
>> are changed by the funciton call.
>>
>> Signed-off-by: Chen Gang <gangchen at rdamicro.com>
>> Signed-off-by: Chen Gang <changeang.beijing at outlook.com>
>> ---
>> arch/arm/include/asm/div64.h | 22 ++++++++--------------
>> 1 file changed, 8 insertions(+), 14 deletions(-)
>>
>> diff --git a/arch/arm/include/asm/div64.h b/arch/arm/include/asm/div64.h
>> index e1f0776..1153e6d 100644
>> --- a/arch/arm/include/asm/div64.h
>> +++ b/arch/arm/include/asm/div64.h
>> @@ -21,30 +21,24 @@
>> * for arguments and results (beware).
>> */
>>
>> -#ifdef __ARMEB__
>> -#define __xh "r0"
>> -#define __xl "r1"
>> -#else
>> -#define __xl "r0"
>> -#define __xh "r1"
>> -#endif
>>
>> static inline uint32_t __div64_32(uint64_t *n, uint32_t base)
>> {
>> register unsigned int __base asm("r4") = base;
>> register unsigned long long __n asm("r0") = *n;
>> register unsigned long long __res asm("r2");
>> - register unsigned int __rem asm(__xh);
>> - asm( __asmeq("%0", __xh)
>> + asm( __asmeq("%0", "r0")
>> __asmeq("%1", "r2")
>> - __asmeq("%2", "r0")
>> - __asmeq("%3", "r4")
>> + __asmeq("%2", "r4")
>> "bl __do_div64"
>> - : "=r" (__rem), "=r" (__res)
>> - : "r" (__n), "r" (__base)
>> + : "+r" (__n), "=r" (__res)
>> + : "r" (__base)
>> : "ip", "lr", "cc");
>> *n = __res;
>> - return __rem;
>> + /*
>> + * __do_div64 returns the remainder in the upper word of __n
>> + */
> Minor nit: ^ this is short enough to be a one-line comment
>
>> + return __n >> 32;
>> }
>> #define __div64_32 __div64_32
> With those changes,
>
> Reviewed-by: Dave Martin <Dave.Martin at arm.com>
Thanks a lot , especially for your patience! I just sent V5, cheers!
>
> Cheers
> ---Dave
More information about the linux-arm-kernel
mailing list