arm64: memory: Implement __tag_set() as common function
authorWill Deacon <will@kernel.org>
Tue, 13 Aug 2019 16:01:05 +0000 (17:01 +0100)
committerWill Deacon <will@kernel.org>
Wed, 14 Aug 2019 12:08:44 +0000 (13:08 +0100)
There's no need for __tag_set() to be a complicated macro when
CONFIG_KASAN_SW_TAGS=y and a simple static inline otherwise. Rewrite
the thing as a common static inline function.

Tested-by: Steve Capper <steve.capper@arm.com>
Reviewed-by: Steve Capper <steve.capper@arm.com>
Tested-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
Reviewed-by: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Will Deacon <will@kernel.org>
arch/arm64/include/asm/memory.h

index a7a985602cba22ec6c7a0539e3fcce89bfef5455..fb0062555305770db0a9e83bdfe7a6f90619bfce 100644 (file)
@@ -218,20 +218,20 @@ static inline unsigned long kaslr_offset(void)
 
 #ifdef CONFIG_KASAN_SW_TAGS
 #define __tag_shifted(tag)     ((u64)(tag) << 56)
-#define __tag_set(addr, tag)   (__typeof__(addr))( \
-               ((u64)(addr) & ~__tag_shifted(0xff)) | __tag_shifted(tag))
 #define __tag_reset(addr)      untagged_addr(addr)
 #define __tag_get(addr)                (__u8)((u64)(addr) >> 56)
 #else
-static inline const void *__tag_set(const void *addr, u8 tag)
-{
-       return addr;
-}
-
+#define __tag_shifted(tag)     0UL
 #define __tag_reset(addr)      (addr)
 #define __tag_get(addr)                0
 #endif
 
+static inline const void *__tag_set(const void *addr, u8 tag)
+{
+       u64 __addr = (u64)addr & ~__tag_shifted(0xff);
+       return (const void *)(__addr | __tag_shifted(tag));
+}
+
 /*
  * Physical vs virtual RAM address space conversion.  These are
  * private definitions which should NOT be used outside memory.h