[PATCH 1/1] ARM:r0 is also corrupted after calling __do_div64.

Chen Gang gangchen at rdamicro.com
Wed May 13 20:39:02 PDT 2015


Hi, Russell

The following patch is made according to your suggestion. Could you 
review or merge it before your context is cleaned? Thanks!

Br, Chen Gang

On 05/12/2015 06:40 PM, 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
>
> Signed-off-by: Chen Gang <gangchen at rdamicro.com>
> ---
>   arch/arm/include/asm/div64.h | 12 +++++++-----
>   1 file changed, 7 insertions(+), 5 deletions(-)
>
> diff --git a/arch/arm/include/asm/div64.h b/arch/arm/include/asm/div64.h
> index a66061a..4829618 100644
> --- a/arch/arm/include/asm/div64.h
> +++ b/arch/arm/include/asm/div64.h
> @@ -34,13 +34,15 @@
>   	register unsigned long long __n   asm("r0") = n;	\
>   	register unsigned long long __res asm("r2");		\
>   	register unsigned int __rem       asm(__xh);		\
> +	register unsigned int __clobber   asm(__xl);		\
>   	asm(	__asmeq("%0", __xh)				\
> -		__asmeq("%1", "r2")				\
> -		__asmeq("%2", "r0")				\
> -		__asmeq("%3", "r4")				\
> +		__asmeq("%1", __xl)				\
> +		__asmeq("%2", "r2")				\
> +		__asmeq("%3", "r0")				\
> +		__asmeq("%4", "r4")				\
>   		"bl	__do_div64"				\
> -		: "=r" (__rem), "=r" (__res)			\
> -		: "r" (__n), "r" (__base)			\
> +		: "=r"(__rem), "=r"(__clobber), "=r"(__res)	\
> +		: "r"(__n), "r"(__base)				\
>   		: "ip", "lr", "cc");				\
>   	n = __res;						\
>   	__rem;							\





More information about the linux-arm-kernel mailing list