[PATCH v2] ARM: tlb: ASID macro should give 32bit result for BE correct operation

Will Deacon will.deacon at arm.com
Mon Oct 7 11:50:43 EDT 2013


On Mon, Oct 07, 2013 at 04:48:23PM +0100, Victor Kamensky wrote:
> In order for ASID macro to be used as expression passed to
> inline asm as 'r' operand it needs to give 32 bit unsigned result,
> not unsigned 64bit expression.
> 
> Otherwise when 64bit ASID is passed to inline assembler statement
> as 'r' operand (32bit) compiler behavior is not well specified.
> For example when __flush_tlb_mm function compiled in big endian
> case, and ASID is passed to tlb_op macro directly, 0 will be passed
> as 'mcr	15, 0, r4, cr8, cr3, {2}' argument in r4, unless ASID
> macro changed to produce 32 bit result.
> 
> Signed-off-by: Victor Kamensky <victor.kamensky at linaro.org>
> ---
>  arch/arm/include/asm/mmu.h | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/arch/arm/include/asm/mmu.h b/arch/arm/include/asm/mmu.h
> index 6f18da0..64fd151 100644
> --- a/arch/arm/include/asm/mmu.h
> +++ b/arch/arm/include/asm/mmu.h
> @@ -16,7 +16,7 @@ typedef struct {
>  #ifdef CONFIG_CPU_HAS_ASID
>  #define ASID_BITS	8
>  #define ASID_MASK	((~0ULL) << ASID_BITS)
> -#define ASID(mm)	((mm)->context.id.counter & ~ASID_MASK)
> +#define ASID(mm)	((unsigned int)((mm)->context.id.counter & ~ASID_MASK))
>  #else
>  #define ASID(mm)	(0)
>  #endif

  Acked-by: Will Deacon <will.deacon at arm.com>

Cheers,

Will



More information about the linux-arm-kernel mailing list