[PATCH] arm64: io: permit offset addressing

Will Deacon will at kernel.org
Tue Jan 30 03:56:42 PST 2024


On Wed, Jan 24, 2024 at 11:12:59AM +0000, Mark Rutland wrote:
> diff --git a/arch/arm64/include/asm/io.h b/arch/arm64/include/asm/io.h
> index 3b694511b98f8..8d825522c55c8 100644
> --- a/arch/arm64/include/asm/io.h
> +++ b/arch/arm64/include/asm/io.h
> @@ -24,25 +24,29 @@
>  #define __raw_writeb __raw_writeb
>  static __always_inline void __raw_writeb(u8 val, volatile void __iomem *addr)
>  {
> -	asm volatile("strb %w0, [%1]" : : "rZ" (val), "r" (addr));
> +	volatile u8 __iomem *ptr = addr;
> +	asm volatile("strb %w0, %1" : : "rZ" (val), "Qo" (*ptr));
>  }
>  
>  #define __raw_writew __raw_writew
>  static __always_inline void __raw_writew(u16 val, volatile void __iomem *addr)
>  {
> -	asm volatile("strh %w0, [%1]" : : "rZ" (val), "r" (addr));
> +	volatile u16 __iomem *ptr = addr;
> +	asm volatile("strh %w0, %1" : : "rZ" (val), "Qo" (*ptr));
>  }
>  
>  #define __raw_writel __raw_writel
>  static __always_inline void __raw_writel(u32 val, volatile void __iomem *addr)
>  {
> -	asm volatile("str %w0, [%1]" : : "rZ" (val), "r" (addr));
> +	volatile u32 __iomem *ptr = addr;
> +	asm volatile("str %w0, %1" : : "rZ" (val), "Qo" (*ptr));
>  }
>  
>  #define __raw_writeq __raw_writeq
>  static __always_inline void __raw_writeq(u64 val, volatile void __iomem *addr)
>  {
> -	asm volatile("str %x0, [%1]" : : "rZ" (val), "r" (addr));
> +	volatile u64 __iomem *ptr = addr;
> +	asm volatile("str %x0, %1" : : "rZ" (val), "Qo" (*ptr));
>  }
>  
>  #define __raw_readb __raw_readb
> -- 
> 2.30.2

Acked-by: Will Deacon <will at kernel.org>

Will



More information about the linux-arm-kernel mailing list