return (const void *)(__addr | __tag_shifted(tag));
 }
 
+#ifdef CONFIG_KASAN_HW_TAGS
+#define arch_enable_tagging()                  mte_enable_kernel()
+#define arch_init_tags(max_tag)                        mte_init_tags(max_tag)
+#define arch_get_random_tag()                  mte_get_random_tag()
+#define arch_get_mem_tag(addr)                 mte_get_mem_tag(addr)
+#define arch_set_mem_tag_range(addr, size, tag)        \
+                       mte_set_mem_tag_range((addr), (size), (tag))
+#endif /* CONFIG_KASAN_HW_TAGS */
+
 /*
  * Physical vs virtual RAM address space conversion.  These are
  * private definitions which should NOT be used outside memory.h
 
 #define reset_tag(addr)                ((void *)arch_kasan_reset_tag(addr))
 #define get_tag(addr)          arch_kasan_get_tag(addr)
 
+#ifdef CONFIG_KASAN_HW_TAGS
+
+#ifndef arch_enable_tagging
+#define arch_enable_tagging()
+#endif
+#ifndef arch_init_tags
+#define arch_init_tags(max_tag)
+#endif
+#ifndef arch_get_random_tag
+#define arch_get_random_tag()  (0xFF)
+#endif
+#ifndef arch_get_mem_tag
+#define arch_get_mem_tag(addr) (0xFF)
+#endif
+#ifndef arch_set_mem_tag_range
+#define arch_set_mem_tag_range(addr, size, tag) ((void *)(addr))
+#endif
+
+#define hw_enable_tagging()                    arch_enable_tagging()
+#define hw_init_tags(max_tag)                  arch_init_tags(max_tag)
+#define hw_get_random_tag()                    arch_get_random_tag()
+#define hw_get_mem_tag(addr)                   arch_get_mem_tag(addr)
+#define hw_set_mem_tag_range(addr, size, tag)  arch_set_mem_tag_range((addr), (size), (tag))
+
+#endif /* CONFIG_KASAN_HW_TAGS */
+
 /*
  * Exported functions for interfaces called from assembly or from generated
  * code. Declarations here to avoid warning about missing declarations.