#ifndef __ASSEMBLY__
 
+#include <linux/kasan-checks.h>
+
 #define __nops(n)      ".rept  " #n "\nnop\n.endr\n"
 #define nops(n)                asm volatile(__nops(n))
 
 
 #define __smp_store_release(p, v)                                      \
 do {                                                                   \
+       typeof(p) __p = (p);                                            \
        union { typeof(*p) __val; char __c[1]; } __u =                  \
-               { .__val = (__force typeof(*p)) (v) };                  \
+               { .__val = (__force typeof(*p)) (v) };                  \
        compiletime_assert_atomic_type(*p);                             \
+       kasan_check_write(__p, sizeof(*p));                             \
        switch (sizeof(*p)) {                                           \
        case 1:                                                         \
                asm volatile ("stlrb %w1, %0"                           \
-                               : "=Q" (*p)                             \
+                               : "=Q" (*__p)                           \
                                : "r" (*(__u8 *)__u.__c)                \
                                : "memory");                            \
                break;                                                  \
        case 2:                                                         \
                asm volatile ("stlrh %w1, %0"                           \
-                               : "=Q" (*p)                             \
+                               : "=Q" (*__p)                           \
                                : "r" (*(__u16 *)__u.__c)               \
                                : "memory");                            \
                break;                                                  \
        case 4:                                                         \
                asm volatile ("stlr %w1, %0"                            \
-                               : "=Q" (*p)                             \
+                               : "=Q" (*__p)                           \
                                : "r" (*(__u32 *)__u.__c)               \
                                : "memory");                            \
                break;                                                  \
        case 8:                                                         \
                asm volatile ("stlr %1, %0"                             \
-                               : "=Q" (*p)                             \
+                               : "=Q" (*__p)                           \
                                : "r" (*(__u64 *)__u.__c)               \
                                : "memory");                            \
                break;                                                  \
 #define __smp_load_acquire(p)                                          \
 ({                                                                     \
        union { typeof(*p) __val; char __c[1]; } __u;                   \
+       typeof(p) __p = (p);                                            \
        compiletime_assert_atomic_type(*p);                             \
+       kasan_check_read(__p, sizeof(*p));                              \
        switch (sizeof(*p)) {                                           \
        case 1:                                                         \
                asm volatile ("ldarb %w0, %1"                           \
                        : "=r" (*(__u8 *)__u.__c)                       \
-                       : "Q" (*p) : "memory");                         \
+                       : "Q" (*__p) : "memory");                       \
                break;                                                  \
        case 2:                                                         \
                asm volatile ("ldarh %w0, %1"                           \
                        : "=r" (*(__u16 *)__u.__c)                      \
-                       : "Q" (*p) : "memory");                         \
+                       : "Q" (*__p) : "memory");                       \
                break;                                                  \
        case 4:                                                         \
                asm volatile ("ldar %w0, %1"                            \
                        : "=r" (*(__u32 *)__u.__c)                      \
-                       : "Q" (*p) : "memory");                         \
+                       : "Q" (*__p) : "memory");                       \
                break;                                                  \
        case 8:                                                         \
                asm volatile ("ldar %0, %1"                             \
                        : "=r" (*(__u64 *)__u.__c)                      \
-                       : "Q" (*p) : "memory");                         \
+                       : "Q" (*__p) : "memory");                       \
                break;                                                  \
        }                                                               \
        __u.__val;                                                      \