All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrey Konovalov <andreyknvl@google.com>
To: Catalin Marinas <catalin.marinas@arm.com>
Cc: Will Deacon <will.deacon@arm.com>,
	Vincenzo Frascino <vincenzo.frascino@arm.com>,
	Dmitry Vyukov <dvyukov@google.com>,
	Andrey Ryabinin <aryabinin@virtuozzo.com>,
	Alexander Potapenko <glider@google.com>,
	Marco Elver <elver@google.com>,
	Evgenii Stepanov <eugenis@google.com>,
	Branislav Rankov <Branislav.Rankov@arm.com>,
	Kevin Brodsky <kevin.brodsky@arm.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	kasan-dev@googlegroups.com, linux-arm-kernel@lists.infradead.org,
	linux-mm@kvack.org, linux-kernel@vger.kernel.org,
	Andrey Konovalov <andreyknvl@google.com>
Subject: [PATCH v9 39/44] kasan, arm64: implement HW_TAGS runtime
Date: Tue, 10 Nov 2020 23:10:36 +0100	[thread overview]
Message-ID: <9f8119934070b7ffa8d129b64c9d05644ce7d20a.1605046192.git.andreyknvl@google.com> (raw)
In-Reply-To: <cover.1605046192.git.andreyknvl@google.com>

Provide implementation of KASAN functions required for the hardware
tag-based mode. Those include core functions for memory and pointer
tagging (tags_hw.c) and bug reporting (report_tags_hw.c). Also adapt
common KASAN code to support the new mode.

Signed-off-by: Andrey Konovalov <andreyknvl@google.com>
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com>
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
---
Change-Id: I8a8689ba098174a4d0ef3f1d008178387c80ee1c
---
 arch/arm64/include/asm/memory.h   |  4 +-
 arch/arm64/kernel/cpufeature.c    |  3 ++
 arch/arm64/kernel/smp.c           |  2 +
 include/linux/kasan.h             | 24 +++++++---
 include/linux/mm.h                |  2 +-
 include/linux/page-flags-layout.h |  2 +-
 mm/kasan/Makefile                 |  5 ++
 mm/kasan/common.c                 | 15 +++---
 mm/kasan/hw_tags.c                | 80 +++++++++++++++++++++++++++++++
 mm/kasan/kasan.h                  | 17 +++++--
 mm/kasan/report_hw_tags.c         | 42 ++++++++++++++++
 mm/kasan/report_sw_tags.c         |  2 +-
 mm/kasan/shadow.c                 |  2 +-
 mm/kasan/sw_tags.c                |  2 +-
 14 files changed, 177 insertions(+), 25 deletions(-)
 create mode 100644 mm/kasan/hw_tags.c
 create mode 100644 mm/kasan/report_hw_tags.c

diff --git a/arch/arm64/include/asm/memory.h b/arch/arm64/include/asm/memory.h
index 656aaddb7014..5042eef5b111 100644
--- a/arch/arm64/include/asm/memory.h
+++ b/arch/arm64/include/asm/memory.h
@@ -214,7 +214,7 @@ static inline unsigned long kaslr_offset(void)
 	(__force __typeof__(addr))__addr;				\
 })
 
-#ifdef CONFIG_KASAN_SW_TAGS
+#if defined(CONFIG_KASAN_SW_TAGS) || defined(CONFIG_KASAN_HW_TAGS)
 #define __tag_shifted(tag)	((u64)(tag) << 56)
 #define __tag_reset(addr)	__untagged_addr(addr)
 #define __tag_get(addr)		(__u8)((u64)(addr) >> 56)
@@ -222,7 +222,7 @@ static inline unsigned long kaslr_offset(void)
 #define __tag_shifted(tag)	0UL
 #define __tag_reset(addr)	(addr)
 #define __tag_get(addr)		0
-#endif /* CONFIG_KASAN_SW_TAGS */
+#endif /* CONFIG_KASAN_SW_TAGS || CONFIG_KASAN_HW_TAGS */
 
 static inline const void *__tag_set(const void *addr, u8 tag)
 {
diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c
index dcc165b3fc04..6a1f2e3558c5 100644
--- a/arch/arm64/kernel/cpufeature.c
+++ b/arch/arm64/kernel/cpufeature.c
@@ -70,6 +70,7 @@
 #include <linux/types.h>
 #include <linux/mm.h>
 #include <linux/cpu.h>
+#include <linux/kasan.h>
 #include <asm/cpu.h>
 #include <asm/cpufeature.h>
 #include <asm/cpu_ops.h>
@@ -1704,6 +1705,8 @@ static void cpu_enable_mte(struct arm64_cpu_capabilities const *cap)
 		cleared_zero_page = true;
 		mte_clear_page_tags(lm_alias(empty_zero_page));
 	}
+
+	kasan_init_hw_tags_cpu();
 }
 #endif /* CONFIG_ARM64_MTE */
 
diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c
index 09c96f57818c..7235b9478413 100644
--- a/arch/arm64/kernel/smp.c
+++ b/arch/arm64/kernel/smp.c
@@ -461,6 +461,8 @@ void __init smp_prepare_boot_cpu(void)
 	/* Conditionally switch to GIC PMR for interrupt masking */
 	if (system_uses_irq_prio_masking())
 		init_gic_priority_masking();
+
+	kasan_init_hw_tags();
 }
 
 static u64 __init of_get_cpu_mpidr(struct device_node *dn)
diff --git a/include/linux/kasan.h b/include/linux/kasan.h
index b6fc14b3da53..f22bdef82111 100644
--- a/include/linux/kasan.h
+++ b/include/linux/kasan.h
@@ -189,25 +189,35 @@ static inline void kasan_record_aux_stack(void *ptr) {}
 
 #endif /* CONFIG_KASAN_GENERIC */
 
-#ifdef CONFIG_KASAN_SW_TAGS
-
-void __init kasan_init_sw_tags(void);
+#if defined(CONFIG_KASAN_SW_TAGS) || defined(CONFIG_KASAN_HW_TAGS)
 
 void *kasan_reset_tag(const void *addr);
 
 bool kasan_report(unsigned long addr, size_t size,
 		bool is_write, unsigned long ip);
 
-#else /* CONFIG_KASAN_SW_TAGS */
-
-static inline void kasan_init_sw_tags(void) { }
+#else /* CONFIG_KASAN_SW_TAGS || CONFIG_KASAN_HW_TAGS */
 
 static inline void *kasan_reset_tag(const void *addr)
 {
 	return (void *)addr;
 }
 
-#endif /* CONFIG_KASAN_SW_TAGS */
+#endif /* CONFIG_KASAN_SW_TAGS || CONFIG_KASAN_HW_TAGS*/
+
+#ifdef CONFIG_KASAN_SW_TAGS
+void __init kasan_init_sw_tags(void);
+#else
+static inline void kasan_init_sw_tags(void) { }
+#endif
+
+#ifdef CONFIG_KASAN_HW_TAGS
+void kasan_init_hw_tags_cpu(void);
+void kasan_init_hw_tags(void);
+#else
+static inline void kasan_init_hw_tags_cpu(void) { }
+static inline void kasan_init_hw_tags(void) { }
+#endif
 
 #ifdef CONFIG_KASAN_VMALLOC
 
diff --git a/include/linux/mm.h b/include/linux/mm.h
index db6ae4d3fb4e..0793d03a4183 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -1413,7 +1413,7 @@ static inline bool cpupid_match_pid(struct task_struct *task, int cpupid)
 }
 #endif /* CONFIG_NUMA_BALANCING */
 
-#ifdef CONFIG_KASAN_SW_TAGS
+#if defined(CONFIG_KASAN_SW_TAGS) || defined(CONFIG_KASAN_HW_TAGS)
 static inline u8 page_kasan_tag(const struct page *page)
 {
 	return (page->flags >> KASAN_TAG_PGSHIFT) & KASAN_TAG_MASK;
diff --git a/include/linux/page-flags-layout.h b/include/linux/page-flags-layout.h
index e200eef6a7fd..7d4ec26d8a3e 100644
--- a/include/linux/page-flags-layout.h
+++ b/include/linux/page-flags-layout.h
@@ -77,7 +77,7 @@
 #define LAST_CPUPID_SHIFT 0
 #endif
 
-#ifdef CONFIG_KASAN_SW_TAGS
+#if defined(CONFIG_KASAN_SW_TAGS) || defined(CONFIG_KASAN_HW_TAGS)
 #define KASAN_TAG_WIDTH 8
 #else
 #define KASAN_TAG_WIDTH 0
diff --git a/mm/kasan/Makefile b/mm/kasan/Makefile
index f1d68a34f3c9..9fe39a66388a 100644
--- a/mm/kasan/Makefile
+++ b/mm/kasan/Makefile
@@ -10,8 +10,10 @@ CFLAGS_REMOVE_init.o = $(CC_FLAGS_FTRACE)
 CFLAGS_REMOVE_quarantine.o = $(CC_FLAGS_FTRACE)
 CFLAGS_REMOVE_report.o = $(CC_FLAGS_FTRACE)
 CFLAGS_REMOVE_report_generic.o = $(CC_FLAGS_FTRACE)
+CFLAGS_REMOVE_report_hw_tags.o = $(CC_FLAGS_FTRACE)
 CFLAGS_REMOVE_report_sw_tags.o = $(CC_FLAGS_FTRACE)
 CFLAGS_REMOVE_shadow.o = $(CC_FLAGS_FTRACE)
+CFLAGS_REMOVE_hw_tags.o = $(CC_FLAGS_FTRACE)
 CFLAGS_REMOVE_sw_tags.o = $(CC_FLAGS_FTRACE)
 
 # Function splitter causes unnecessary splits in __asan_load1/__asan_store1
@@ -27,10 +29,13 @@ CFLAGS_init.o := $(CC_FLAGS_KASAN_RUNTIME)
 CFLAGS_quarantine.o := $(CC_FLAGS_KASAN_RUNTIME)
 CFLAGS_report.o := $(CC_FLAGS_KASAN_RUNTIME)
 CFLAGS_report_generic.o := $(CC_FLAGS_KASAN_RUNTIME)
+CFLAGS_report_hw_tags.o := $(CC_FLAGS_KASAN_RUNTIME)
 CFLAGS_report_sw_tags.o := $(CC_FLAGS_KASAN_RUNTIME)
 CFLAGS_shadow.o := $(CC_FLAGS_KASAN_RUNTIME)
+CFLAGS_hw_tags.o := $(CC_FLAGS_KASAN_RUNTIME)
 CFLAGS_sw_tags.o := $(CC_FLAGS_KASAN_RUNTIME)
 
 obj-$(CONFIG_KASAN) := common.o report.o
 obj-$(CONFIG_KASAN_GENERIC) += init.o generic.o report_generic.o shadow.o quarantine.o
+obj-$(CONFIG_KASAN_HW_TAGS) += hw_tags.o report_hw_tags.o
 obj-$(CONFIG_KASAN_SW_TAGS) += init.o report_sw_tags.o shadow.o sw_tags.o
diff --git a/mm/kasan/common.c b/mm/kasan/common.c
index d0b3ff410b0c..2bb0ef6da6bd 100644
--- a/mm/kasan/common.c
+++ b/mm/kasan/common.c
@@ -113,7 +113,7 @@ void kasan_free_pages(struct page *page, unsigned int order)
  */
 static inline unsigned int optimal_redzone(unsigned int object_size)
 {
-	if (IS_ENABLED(CONFIG_KASAN_SW_TAGS))
+	if (!IS_ENABLED(CONFIG_KASAN_GENERIC))
 		return 0;
 
 	return
@@ -178,14 +178,14 @@ size_t kasan_metadata_size(struct kmem_cache *cache)
 struct kasan_alloc_meta *get_alloc_info(struct kmem_cache *cache,
 					const void *object)
 {
-	return (void *)object + cache->kasan_info.alloc_meta_offset;
+	return (void *)reset_tag(object) + cache->kasan_info.alloc_meta_offset;
 }
 
 struct kasan_free_meta *get_free_info(struct kmem_cache *cache,
 				      const void *object)
 {
 	BUILD_BUG_ON(sizeof(struct kasan_free_meta) > 32);
-	return (void *)object + cache->kasan_info.free_meta_offset;
+	return (void *)reset_tag(object) + cache->kasan_info.free_meta_offset;
 }
 
 void kasan_poison_slab(struct page *page)
@@ -267,9 +267,8 @@ void * __must_check kasan_init_slab_obj(struct kmem_cache *cache,
 	alloc_info = get_alloc_info(cache, object);
 	__memset(alloc_info, 0, sizeof(*alloc_info));
 
-	if (IS_ENABLED(CONFIG_KASAN_SW_TAGS))
-		object = set_tag(object,
-				assign_tag(cache, object, true, false));
+	if (IS_ENABLED(CONFIG_KASAN_SW_TAGS) || IS_ENABLED(CONFIG_KASAN_HW_TAGS))
+		object = set_tag(object, assign_tag(cache, object, true, false));
 
 	return (void *)object;
 }
@@ -337,10 +336,10 @@ static void *__kasan_kmalloc(struct kmem_cache *cache, const void *object,
 	redzone_end = round_up((unsigned long)object + cache->object_size,
 				KASAN_GRANULE_SIZE);
 
-	if (IS_ENABLED(CONFIG_KASAN_SW_TAGS))
+	if (IS_ENABLED(CONFIG_KASAN_SW_TAGS) || IS_ENABLED(CONFIG_KASAN_HW_TAGS))
 		tag = assign_tag(cache, object, false, keep_tag);
 
-	/* Tag is ignored in set_tag without CONFIG_KASAN_SW_TAGS */
+	/* Tag is ignored in set_tag without CONFIG_KASAN_SW/HW_TAGS */
 	kasan_unpoison_memory(set_tag(object, tag), size);
 	kasan_poison_memory((void *)redzone_start, redzone_end - redzone_start,
 		KASAN_KMALLOC_REDZONE);
diff --git a/mm/kasan/hw_tags.c b/mm/kasan/hw_tags.c
new file mode 100644
index 000000000000..0080b78ec843
--- /dev/null
+++ b/mm/kasan/hw_tags.c
@@ -0,0 +1,80 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * This file contains core hardware tag-based KASAN code.
+ *
+ * Copyright (c) 2020 Google, Inc.
+ * Author: Andrey Konovalov <andreyknvl@google.com>
+ */
+
+#define pr_fmt(fmt) "kasan: " fmt
+
+#include <linux/kasan.h>
+#include <linux/kernel.h>
+#include <linux/memory.h>
+#include <linux/mm.h>
+#include <linux/string.h>
+#include <linux/types.h>
+
+#include "kasan.h"
+
+/* kasan_init_hw_tags_cpu() is called for each CPU. */
+void kasan_init_hw_tags_cpu(void)
+{
+	hw_init_tags(KASAN_TAG_MAX);
+	hw_enable_tagging();
+}
+
+/* kasan_init_hw_tags() is called once on boot CPU. */
+void kasan_init_hw_tags(void)
+{
+	pr_info("KernelAddressSanitizer initialized\n");
+}
+
+void *kasan_reset_tag(const void *addr)
+{
+	return reset_tag(addr);
+}
+
+void kasan_poison_memory(const void *address, size_t size, u8 value)
+{
+	hw_set_mem_tag_range(reset_tag(address),
+			round_up(size, KASAN_GRANULE_SIZE), value);
+}
+
+void kasan_unpoison_memory(const void *address, size_t size)
+{
+	hw_set_mem_tag_range(reset_tag(address),
+			round_up(size, KASAN_GRANULE_SIZE), get_tag(address));
+}
+
+u8 random_tag(void)
+{
+	return hw_get_random_tag();
+}
+
+bool check_invalid_free(void *addr)
+{
+	u8 ptr_tag = get_tag(addr);
+	u8 mem_tag = hw_get_mem_tag(addr);
+
+	return (mem_tag == KASAN_TAG_INVALID) ||
+		(ptr_tag != KASAN_TAG_KERNEL && ptr_tag != mem_tag);
+}
+
+void kasan_set_free_info(struct kmem_cache *cache,
+				void *object, u8 tag)
+{
+	struct kasan_alloc_meta *alloc_meta;
+
+	alloc_meta = get_alloc_info(cache, object);
+	kasan_set_track(&alloc_meta->free_track[0], GFP_NOWAIT);
+}
+
+struct kasan_track *kasan_get_free_track(struct kmem_cache *cache,
+				void *object, u8 tag)
+{
+	struct kasan_alloc_meta *alloc_meta;
+
+	alloc_meta = get_alloc_info(cache, object);
+	return &alloc_meta->free_track[0];
+}
diff --git a/mm/kasan/kasan.h b/mm/kasan/kasan.h
index d745a78745dd..21fe75c66f26 100644
--- a/mm/kasan/kasan.h
+++ b/mm/kasan/kasan.h
@@ -153,6 +153,10 @@ struct kasan_alloc_meta *get_alloc_info(struct kmem_cache *cache,
 struct kasan_free_meta *get_free_info(struct kmem_cache *cache,
 					const void *object);
 
+void kasan_poison_memory(const void *address, size_t size, u8 value);
+
+#if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS)
+
 static inline const void *kasan_shadow_to_mem(const void *shadow_addr)
 {
 	return (void *)(((unsigned long)shadow_addr - KASAN_SHADOW_OFFSET)
@@ -164,8 +168,6 @@ static inline bool addr_has_metadata(const void *addr)
 	return (addr >= kasan_shadow_to_mem((void *)KASAN_SHADOW_START));
 }
 
-void kasan_poison_memory(const void *address, size_t size, u8 value);
-
 /**
  * check_memory_region - Check memory region, and report if invalid access.
  * @addr: the accessed address
@@ -177,6 +179,15 @@ void kasan_poison_memory(const void *address, size_t size, u8 value);
 bool check_memory_region(unsigned long addr, size_t size, bool write,
 				unsigned long ret_ip);
 
+#else /* CONFIG_KASAN_GENERIC || CONFIG_KASAN_SW_TAGS */
+
+static inline bool addr_has_metadata(const void *addr)
+{
+	return true;
+}
+
+#endif /* CONFIG_KASAN_GENERIC || CONFIG_KASAN_SW_TAGS */
+
 bool check_invalid_free(void *addr);
 
 void *find_first_bad_addr(void *addr, size_t size);
@@ -213,7 +224,7 @@ static inline void quarantine_reduce(void) { }
 static inline void quarantine_remove_cache(struct kmem_cache *cache) { }
 #endif
 
-#ifdef CONFIG_KASAN_SW_TAGS
+#if defined(CONFIG_KASAN_SW_TAGS) || defined(CONFIG_KASAN_HW_TAGS)
 
 void print_tags(u8 addr_tag, const void *addr);
 
diff --git a/mm/kasan/report_hw_tags.c b/mm/kasan/report_hw_tags.c
new file mode 100644
index 000000000000..da543eb832cd
--- /dev/null
+++ b/mm/kasan/report_hw_tags.c
@@ -0,0 +1,42 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * This file contains hardware tag-based KASAN specific error reporting code.
+ *
+ * Copyright (c) 2020 Google, Inc.
+ * Author: Andrey Konovalov <andreyknvl@google.com>
+ */
+
+#include <linux/kasan.h>
+#include <linux/kernel.h>
+#include <linux/memory.h>
+#include <linux/mm.h>
+#include <linux/string.h>
+#include <linux/types.h>
+
+#include "kasan.h"
+
+const char *get_bug_type(struct kasan_access_info *info)
+{
+	return "invalid-access";
+}
+
+void *find_first_bad_addr(void *addr, size_t size)
+{
+	return reset_tag(addr);
+}
+
+void metadata_fetch_row(char *buffer, void *row)
+{
+	int i;
+
+	for (i = 0; i < META_BYTES_PER_ROW; i++)
+		buffer[i] = hw_get_mem_tag(row + i * KASAN_GRANULE_SIZE);
+}
+
+void print_tags(u8 addr_tag, const void *addr)
+{
+	u8 memory_tag = hw_get_mem_tag((void *)addr);
+
+	pr_err("Pointer tag: [%02x], memory tag: [%02x]\n",
+		addr_tag, memory_tag);
+}
diff --git a/mm/kasan/report_sw_tags.c b/mm/kasan/report_sw_tags.c
index add2dfe6169c..aebc44a29e83 100644
--- a/mm/kasan/report_sw_tags.c
+++ b/mm/kasan/report_sw_tags.c
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0
 /*
- * This file contains tag-based KASAN specific error reporting code.
+ * This file contains software tag-based KASAN specific error reporting code.
  *
  * Copyright (c) 2014 Samsung Electronics Co., Ltd.
  * Author: Andrey Ryabinin <ryabinin.a.a@gmail.com>
diff --git a/mm/kasan/shadow.c b/mm/kasan/shadow.c
index 1fadd4930d54..616ac64c4a21 100644
--- a/mm/kasan/shadow.c
+++ b/mm/kasan/shadow.c
@@ -107,7 +107,7 @@ void kasan_unpoison_memory(const void *address, size_t size)
 
 		if (IS_ENABLED(CONFIG_KASAN_SW_TAGS))
 			*shadow = tag;
-		else
+		else /* CONFIG_KASAN_GENERIC */
 			*shadow = size & KASAN_GRANULE_MASK;
 	}
 }
diff --git a/mm/kasan/sw_tags.c b/mm/kasan/sw_tags.c
index b09a2c06abad..dfe707dd8d0d 100644
--- a/mm/kasan/sw_tags.c
+++ b/mm/kasan/sw_tags.c
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0
 /*
- * This file contains core tag-based KASAN code.
+ * This file contains core software tag-based KASAN code.
  *
  * Copyright (c) 2018 Google, Inc.
  * Author: Andrey Konovalov <andreyknvl@google.com>
-- 
2.29.2.222.g5d2a92d10f8-goog


WARNING: multiple messages have this Message-ID (diff)
From: Andrey Konovalov <andreyknvl@google.com>
To: Catalin Marinas <catalin.marinas@arm.com>
Cc: linux-arm-kernel@lists.infradead.org,
	Marco Elver <elver@google.com>,
	Andrey Konovalov <andreyknvl@google.com>,
	Kevin Brodsky <kevin.brodsky@arm.com>,
	Will Deacon <will.deacon@arm.com>,
	Branislav Rankov <Branislav.Rankov@arm.com>,
	kasan-dev@googlegroups.com, linux-kernel@vger.kernel.org,
	linux-mm@kvack.org, Alexander Potapenko <glider@google.com>,
	Evgenii Stepanov <eugenis@google.com>,
	Andrey Ryabinin <aryabinin@virtuozzo.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	Vincenzo Frascino <vincenzo.frascino@arm.com>,
	Dmitry Vyukov <dvyukov@google.com>
Subject: [PATCH v9 39/44] kasan, arm64: implement HW_TAGS runtime
Date: Tue, 10 Nov 2020 23:10:36 +0100	[thread overview]
Message-ID: <9f8119934070b7ffa8d129b64c9d05644ce7d20a.1605046192.git.andreyknvl@google.com> (raw)
In-Reply-To: <cover.1605046192.git.andreyknvl@google.com>

Provide implementation of KASAN functions required for the hardware
tag-based mode. Those include core functions for memory and pointer
tagging (tags_hw.c) and bug reporting (report_tags_hw.c). Also adapt
common KASAN code to support the new mode.

Signed-off-by: Andrey Konovalov <andreyknvl@google.com>
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com>
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
---
Change-Id: I8a8689ba098174a4d0ef3f1d008178387c80ee1c
---
 arch/arm64/include/asm/memory.h   |  4 +-
 arch/arm64/kernel/cpufeature.c    |  3 ++
 arch/arm64/kernel/smp.c           |  2 +
 include/linux/kasan.h             | 24 +++++++---
 include/linux/mm.h                |  2 +-
 include/linux/page-flags-layout.h |  2 +-
 mm/kasan/Makefile                 |  5 ++
 mm/kasan/common.c                 | 15 +++---
 mm/kasan/hw_tags.c                | 80 +++++++++++++++++++++++++++++++
 mm/kasan/kasan.h                  | 17 +++++--
 mm/kasan/report_hw_tags.c         | 42 ++++++++++++++++
 mm/kasan/report_sw_tags.c         |  2 +-
 mm/kasan/shadow.c                 |  2 +-
 mm/kasan/sw_tags.c                |  2 +-
 14 files changed, 177 insertions(+), 25 deletions(-)
 create mode 100644 mm/kasan/hw_tags.c
 create mode 100644 mm/kasan/report_hw_tags.c

diff --git a/arch/arm64/include/asm/memory.h b/arch/arm64/include/asm/memory.h
index 656aaddb7014..5042eef5b111 100644
--- a/arch/arm64/include/asm/memory.h
+++ b/arch/arm64/include/asm/memory.h
@@ -214,7 +214,7 @@ static inline unsigned long kaslr_offset(void)
 	(__force __typeof__(addr))__addr;				\
 })
 
-#ifdef CONFIG_KASAN_SW_TAGS
+#if defined(CONFIG_KASAN_SW_TAGS) || defined(CONFIG_KASAN_HW_TAGS)
 #define __tag_shifted(tag)	((u64)(tag) << 56)
 #define __tag_reset(addr)	__untagged_addr(addr)
 #define __tag_get(addr)		(__u8)((u64)(addr) >> 56)
@@ -222,7 +222,7 @@ static inline unsigned long kaslr_offset(void)
 #define __tag_shifted(tag)	0UL
 #define __tag_reset(addr)	(addr)
 #define __tag_get(addr)		0
-#endif /* CONFIG_KASAN_SW_TAGS */
+#endif /* CONFIG_KASAN_SW_TAGS || CONFIG_KASAN_HW_TAGS */
 
 static inline const void *__tag_set(const void *addr, u8 tag)
 {
diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c
index dcc165b3fc04..6a1f2e3558c5 100644
--- a/arch/arm64/kernel/cpufeature.c
+++ b/arch/arm64/kernel/cpufeature.c
@@ -70,6 +70,7 @@
 #include <linux/types.h>
 #include <linux/mm.h>
 #include <linux/cpu.h>
+#include <linux/kasan.h>
 #include <asm/cpu.h>
 #include <asm/cpufeature.h>
 #include <asm/cpu_ops.h>
@@ -1704,6 +1705,8 @@ static void cpu_enable_mte(struct arm64_cpu_capabilities const *cap)
 		cleared_zero_page = true;
 		mte_clear_page_tags(lm_alias(empty_zero_page));
 	}
+
+	kasan_init_hw_tags_cpu();
 }
 #endif /* CONFIG_ARM64_MTE */
 
diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c
index 09c96f57818c..7235b9478413 100644
--- a/arch/arm64/kernel/smp.c
+++ b/arch/arm64/kernel/smp.c
@@ -461,6 +461,8 @@ void __init smp_prepare_boot_cpu(void)
 	/* Conditionally switch to GIC PMR for interrupt masking */
 	if (system_uses_irq_prio_masking())
 		init_gic_priority_masking();
+
+	kasan_init_hw_tags();
 }
 
 static u64 __init of_get_cpu_mpidr(struct device_node *dn)
diff --git a/include/linux/kasan.h b/include/linux/kasan.h
index b6fc14b3da53..f22bdef82111 100644
--- a/include/linux/kasan.h
+++ b/include/linux/kasan.h
@@ -189,25 +189,35 @@ static inline void kasan_record_aux_stack(void *ptr) {}
 
 #endif /* CONFIG_KASAN_GENERIC */
 
-#ifdef CONFIG_KASAN_SW_TAGS
-
-void __init kasan_init_sw_tags(void);
+#if defined(CONFIG_KASAN_SW_TAGS) || defined(CONFIG_KASAN_HW_TAGS)
 
 void *kasan_reset_tag(const void *addr);
 
 bool kasan_report(unsigned long addr, size_t size,
 		bool is_write, unsigned long ip);
 
-#else /* CONFIG_KASAN_SW_TAGS */
-
-static inline void kasan_init_sw_tags(void) { }
+#else /* CONFIG_KASAN_SW_TAGS || CONFIG_KASAN_HW_TAGS */
 
 static inline void *kasan_reset_tag(const void *addr)
 {
 	return (void *)addr;
 }
 
-#endif /* CONFIG_KASAN_SW_TAGS */
+#endif /* CONFIG_KASAN_SW_TAGS || CONFIG_KASAN_HW_TAGS*/
+
+#ifdef CONFIG_KASAN_SW_TAGS
+void __init kasan_init_sw_tags(void);
+#else
+static inline void kasan_init_sw_tags(void) { }
+#endif
+
+#ifdef CONFIG_KASAN_HW_TAGS
+void kasan_init_hw_tags_cpu(void);
+void kasan_init_hw_tags(void);
+#else
+static inline void kasan_init_hw_tags_cpu(void) { }
+static inline void kasan_init_hw_tags(void) { }
+#endif
 
 #ifdef CONFIG_KASAN_VMALLOC
 
diff --git a/include/linux/mm.h b/include/linux/mm.h
index db6ae4d3fb4e..0793d03a4183 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -1413,7 +1413,7 @@ static inline bool cpupid_match_pid(struct task_struct *task, int cpupid)
 }
 #endif /* CONFIG_NUMA_BALANCING */
 
-#ifdef CONFIG_KASAN_SW_TAGS
+#if defined(CONFIG_KASAN_SW_TAGS) || defined(CONFIG_KASAN_HW_TAGS)
 static inline u8 page_kasan_tag(const struct page *page)
 {
 	return (page->flags >> KASAN_TAG_PGSHIFT) & KASAN_TAG_MASK;
diff --git a/include/linux/page-flags-layout.h b/include/linux/page-flags-layout.h
index e200eef6a7fd..7d4ec26d8a3e 100644
--- a/include/linux/page-flags-layout.h
+++ b/include/linux/page-flags-layout.h
@@ -77,7 +77,7 @@
 #define LAST_CPUPID_SHIFT 0
 #endif
 
-#ifdef CONFIG_KASAN_SW_TAGS
+#if defined(CONFIG_KASAN_SW_TAGS) || defined(CONFIG_KASAN_HW_TAGS)
 #define KASAN_TAG_WIDTH 8
 #else
 #define KASAN_TAG_WIDTH 0
diff --git a/mm/kasan/Makefile b/mm/kasan/Makefile
index f1d68a34f3c9..9fe39a66388a 100644
--- a/mm/kasan/Makefile
+++ b/mm/kasan/Makefile
@@ -10,8 +10,10 @@ CFLAGS_REMOVE_init.o = $(CC_FLAGS_FTRACE)
 CFLAGS_REMOVE_quarantine.o = $(CC_FLAGS_FTRACE)
 CFLAGS_REMOVE_report.o = $(CC_FLAGS_FTRACE)
 CFLAGS_REMOVE_report_generic.o = $(CC_FLAGS_FTRACE)
+CFLAGS_REMOVE_report_hw_tags.o = $(CC_FLAGS_FTRACE)
 CFLAGS_REMOVE_report_sw_tags.o = $(CC_FLAGS_FTRACE)
 CFLAGS_REMOVE_shadow.o = $(CC_FLAGS_FTRACE)
+CFLAGS_REMOVE_hw_tags.o = $(CC_FLAGS_FTRACE)
 CFLAGS_REMOVE_sw_tags.o = $(CC_FLAGS_FTRACE)
 
 # Function splitter causes unnecessary splits in __asan_load1/__asan_store1
@@ -27,10 +29,13 @@ CFLAGS_init.o := $(CC_FLAGS_KASAN_RUNTIME)
 CFLAGS_quarantine.o := $(CC_FLAGS_KASAN_RUNTIME)
 CFLAGS_report.o := $(CC_FLAGS_KASAN_RUNTIME)
 CFLAGS_report_generic.o := $(CC_FLAGS_KASAN_RUNTIME)
+CFLAGS_report_hw_tags.o := $(CC_FLAGS_KASAN_RUNTIME)
 CFLAGS_report_sw_tags.o := $(CC_FLAGS_KASAN_RUNTIME)
 CFLAGS_shadow.o := $(CC_FLAGS_KASAN_RUNTIME)
+CFLAGS_hw_tags.o := $(CC_FLAGS_KASAN_RUNTIME)
 CFLAGS_sw_tags.o := $(CC_FLAGS_KASAN_RUNTIME)
 
 obj-$(CONFIG_KASAN) := common.o report.o
 obj-$(CONFIG_KASAN_GENERIC) += init.o generic.o report_generic.o shadow.o quarantine.o
+obj-$(CONFIG_KASAN_HW_TAGS) += hw_tags.o report_hw_tags.o
 obj-$(CONFIG_KASAN_SW_TAGS) += init.o report_sw_tags.o shadow.o sw_tags.o
diff --git a/mm/kasan/common.c b/mm/kasan/common.c
index d0b3ff410b0c..2bb0ef6da6bd 100644
--- a/mm/kasan/common.c
+++ b/mm/kasan/common.c
@@ -113,7 +113,7 @@ void kasan_free_pages(struct page *page, unsigned int order)
  */
 static inline unsigned int optimal_redzone(unsigned int object_size)
 {
-	if (IS_ENABLED(CONFIG_KASAN_SW_TAGS))
+	if (!IS_ENABLED(CONFIG_KASAN_GENERIC))
 		return 0;
 
 	return
@@ -178,14 +178,14 @@ size_t kasan_metadata_size(struct kmem_cache *cache)
 struct kasan_alloc_meta *get_alloc_info(struct kmem_cache *cache,
 					const void *object)
 {
-	return (void *)object + cache->kasan_info.alloc_meta_offset;
+	return (void *)reset_tag(object) + cache->kasan_info.alloc_meta_offset;
 }
 
 struct kasan_free_meta *get_free_info(struct kmem_cache *cache,
 				      const void *object)
 {
 	BUILD_BUG_ON(sizeof(struct kasan_free_meta) > 32);
-	return (void *)object + cache->kasan_info.free_meta_offset;
+	return (void *)reset_tag(object) + cache->kasan_info.free_meta_offset;
 }
 
 void kasan_poison_slab(struct page *page)
@@ -267,9 +267,8 @@ void * __must_check kasan_init_slab_obj(struct kmem_cache *cache,
 	alloc_info = get_alloc_info(cache, object);
 	__memset(alloc_info, 0, sizeof(*alloc_info));
 
-	if (IS_ENABLED(CONFIG_KASAN_SW_TAGS))
-		object = set_tag(object,
-				assign_tag(cache, object, true, false));
+	if (IS_ENABLED(CONFIG_KASAN_SW_TAGS) || IS_ENABLED(CONFIG_KASAN_HW_TAGS))
+		object = set_tag(object, assign_tag(cache, object, true, false));
 
 	return (void *)object;
 }
@@ -337,10 +336,10 @@ static void *__kasan_kmalloc(struct kmem_cache *cache, const void *object,
 	redzone_end = round_up((unsigned long)object + cache->object_size,
 				KASAN_GRANULE_SIZE);
 
-	if (IS_ENABLED(CONFIG_KASAN_SW_TAGS))
+	if (IS_ENABLED(CONFIG_KASAN_SW_TAGS) || IS_ENABLED(CONFIG_KASAN_HW_TAGS))
 		tag = assign_tag(cache, object, false, keep_tag);
 
-	/* Tag is ignored in set_tag without CONFIG_KASAN_SW_TAGS */
+	/* Tag is ignored in set_tag without CONFIG_KASAN_SW/HW_TAGS */
 	kasan_unpoison_memory(set_tag(object, tag), size);
 	kasan_poison_memory((void *)redzone_start, redzone_end - redzone_start,
 		KASAN_KMALLOC_REDZONE);
diff --git a/mm/kasan/hw_tags.c b/mm/kasan/hw_tags.c
new file mode 100644
index 000000000000..0080b78ec843
--- /dev/null
+++ b/mm/kasan/hw_tags.c
@@ -0,0 +1,80 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * This file contains core hardware tag-based KASAN code.
+ *
+ * Copyright (c) 2020 Google, Inc.
+ * Author: Andrey Konovalov <andreyknvl@google.com>
+ */
+
+#define pr_fmt(fmt) "kasan: " fmt
+
+#include <linux/kasan.h>
+#include <linux/kernel.h>
+#include <linux/memory.h>
+#include <linux/mm.h>
+#include <linux/string.h>
+#include <linux/types.h>
+
+#include "kasan.h"
+
+/* kasan_init_hw_tags_cpu() is called for each CPU. */
+void kasan_init_hw_tags_cpu(void)
+{
+	hw_init_tags(KASAN_TAG_MAX);
+	hw_enable_tagging();
+}
+
+/* kasan_init_hw_tags() is called once on boot CPU. */
+void kasan_init_hw_tags(void)
+{
+	pr_info("KernelAddressSanitizer initialized\n");
+}
+
+void *kasan_reset_tag(const void *addr)
+{
+	return reset_tag(addr);
+}
+
+void kasan_poison_memory(const void *address, size_t size, u8 value)
+{
+	hw_set_mem_tag_range(reset_tag(address),
+			round_up(size, KASAN_GRANULE_SIZE), value);
+}
+
+void kasan_unpoison_memory(const void *address, size_t size)
+{
+	hw_set_mem_tag_range(reset_tag(address),
+			round_up(size, KASAN_GRANULE_SIZE), get_tag(address));
+}
+
+u8 random_tag(void)
+{
+	return hw_get_random_tag();
+}
+
+bool check_invalid_free(void *addr)
+{
+	u8 ptr_tag = get_tag(addr);
+	u8 mem_tag = hw_get_mem_tag(addr);
+
+	return (mem_tag == KASAN_TAG_INVALID) ||
+		(ptr_tag != KASAN_TAG_KERNEL && ptr_tag != mem_tag);
+}
+
+void kasan_set_free_info(struct kmem_cache *cache,
+				void *object, u8 tag)
+{
+	struct kasan_alloc_meta *alloc_meta;
+
+	alloc_meta = get_alloc_info(cache, object);
+	kasan_set_track(&alloc_meta->free_track[0], GFP_NOWAIT);
+}
+
+struct kasan_track *kasan_get_free_track(struct kmem_cache *cache,
+				void *object, u8 tag)
+{
+	struct kasan_alloc_meta *alloc_meta;
+
+	alloc_meta = get_alloc_info(cache, object);
+	return &alloc_meta->free_track[0];
+}
diff --git a/mm/kasan/kasan.h b/mm/kasan/kasan.h
index d745a78745dd..21fe75c66f26 100644
--- a/mm/kasan/kasan.h
+++ b/mm/kasan/kasan.h
@@ -153,6 +153,10 @@ struct kasan_alloc_meta *get_alloc_info(struct kmem_cache *cache,
 struct kasan_free_meta *get_free_info(struct kmem_cache *cache,
 					const void *object);
 
+void kasan_poison_memory(const void *address, size_t size, u8 value);
+
+#if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS)
+
 static inline const void *kasan_shadow_to_mem(const void *shadow_addr)
 {
 	return (void *)(((unsigned long)shadow_addr - KASAN_SHADOW_OFFSET)
@@ -164,8 +168,6 @@ static inline bool addr_has_metadata(const void *addr)
 	return (addr >= kasan_shadow_to_mem((void *)KASAN_SHADOW_START));
 }
 
-void kasan_poison_memory(const void *address, size_t size, u8 value);
-
 /**
  * check_memory_region - Check memory region, and report if invalid access.
  * @addr: the accessed address
@@ -177,6 +179,15 @@ void kasan_poison_memory(const void *address, size_t size, u8 value);
 bool check_memory_region(unsigned long addr, size_t size, bool write,
 				unsigned long ret_ip);
 
+#else /* CONFIG_KASAN_GENERIC || CONFIG_KASAN_SW_TAGS */
+
+static inline bool addr_has_metadata(const void *addr)
+{
+	return true;
+}
+
+#endif /* CONFIG_KASAN_GENERIC || CONFIG_KASAN_SW_TAGS */
+
 bool check_invalid_free(void *addr);
 
 void *find_first_bad_addr(void *addr, size_t size);
@@ -213,7 +224,7 @@ static inline void quarantine_reduce(void) { }
 static inline void quarantine_remove_cache(struct kmem_cache *cache) { }
 #endif
 
-#ifdef CONFIG_KASAN_SW_TAGS
+#if defined(CONFIG_KASAN_SW_TAGS) || defined(CONFIG_KASAN_HW_TAGS)
 
 void print_tags(u8 addr_tag, const void *addr);
 
diff --git a/mm/kasan/report_hw_tags.c b/mm/kasan/report_hw_tags.c
new file mode 100644
index 000000000000..da543eb832cd
--- /dev/null
+++ b/mm/kasan/report_hw_tags.c
@@ -0,0 +1,42 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * This file contains hardware tag-based KASAN specific error reporting code.
+ *
+ * Copyright (c) 2020 Google, Inc.
+ * Author: Andrey Konovalov <andreyknvl@google.com>
+ */
+
+#include <linux/kasan.h>
+#include <linux/kernel.h>
+#include <linux/memory.h>
+#include <linux/mm.h>
+#include <linux/string.h>
+#include <linux/types.h>
+
+#include "kasan.h"
+
+const char *get_bug_type(struct kasan_access_info *info)
+{
+	return "invalid-access";
+}
+
+void *find_first_bad_addr(void *addr, size_t size)
+{
+	return reset_tag(addr);
+}
+
+void metadata_fetch_row(char *buffer, void *row)
+{
+	int i;
+
+	for (i = 0; i < META_BYTES_PER_ROW; i++)
+		buffer[i] = hw_get_mem_tag(row + i * KASAN_GRANULE_SIZE);
+}
+
+void print_tags(u8 addr_tag, const void *addr)
+{
+	u8 memory_tag = hw_get_mem_tag((void *)addr);
+
+	pr_err("Pointer tag: [%02x], memory tag: [%02x]\n",
+		addr_tag, memory_tag);
+}
diff --git a/mm/kasan/report_sw_tags.c b/mm/kasan/report_sw_tags.c
index add2dfe6169c..aebc44a29e83 100644
--- a/mm/kasan/report_sw_tags.c
+++ b/mm/kasan/report_sw_tags.c
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0
 /*
- * This file contains tag-based KASAN specific error reporting code.
+ * This file contains software tag-based KASAN specific error reporting code.
  *
  * Copyright (c) 2014 Samsung Electronics Co., Ltd.
  * Author: Andrey Ryabinin <ryabinin.a.a@gmail.com>
diff --git a/mm/kasan/shadow.c b/mm/kasan/shadow.c
index 1fadd4930d54..616ac64c4a21 100644
--- a/mm/kasan/shadow.c
+++ b/mm/kasan/shadow.c
@@ -107,7 +107,7 @@ void kasan_unpoison_memory(const void *address, size_t size)
 
 		if (IS_ENABLED(CONFIG_KASAN_SW_TAGS))
 			*shadow = tag;
-		else
+		else /* CONFIG_KASAN_GENERIC */
 			*shadow = size & KASAN_GRANULE_MASK;
 	}
 }
diff --git a/mm/kasan/sw_tags.c b/mm/kasan/sw_tags.c
index b09a2c06abad..dfe707dd8d0d 100644
--- a/mm/kasan/sw_tags.c
+++ b/mm/kasan/sw_tags.c
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0
 /*
- * This file contains core tag-based KASAN code.
+ * This file contains core software tag-based KASAN code.
  *
  * Copyright (c) 2018 Google, Inc.
  * Author: Andrey Konovalov <andreyknvl@google.com>
-- 
2.29.2.222.g5d2a92d10f8-goog


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  parent reply	other threads:[~2020-11-10 22:13 UTC|newest]

Thread overview: 307+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-11-10 22:09 [PATCH v9 00/44] kasan: add hardware tag-based mode for arm64 Andrey Konovalov
2020-11-10 22:09 ` Andrey Konovalov
2020-11-10 22:09 ` Andrey Konovalov
2020-11-10 22:09 ` [PATCH v9 01/44] kasan: drop unnecessary GPL text from comment headers Andrey Konovalov
2020-11-10 22:09   ` Andrey Konovalov
2020-11-10 22:09   ` Andrey Konovalov
2020-11-11 13:16   ` Alexander Potapenko
2020-11-11 13:16     ` Alexander Potapenko
2020-11-11 13:16     ` Alexander Potapenko
2020-11-10 22:09 ` [PATCH v9 02/44] kasan: KASAN_VMALLOC depends on KASAN_GENERIC Andrey Konovalov
2020-11-10 22:09   ` Andrey Konovalov
2020-11-10 22:09   ` Andrey Konovalov
2020-11-11 13:19   ` Alexander Potapenko
2020-11-11 13:19     ` Alexander Potapenko
2020-11-11 13:19     ` Alexander Potapenko
2020-11-10 22:10 ` [PATCH v9 03/44] kasan: group vmalloc code Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-11 13:21   ` Alexander Potapenko
2020-11-11 13:21     ` Alexander Potapenko
2020-11-11 13:21     ` Alexander Potapenko
2020-11-10 22:10 ` [PATCH v9 04/44] s390/kasan: include asm/page.h from asm/kasan.h Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10 ` [PATCH v9 05/44] kasan: shadow declarations only for software modes Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-11 13:25   ` Alexander Potapenko
2020-11-11 13:25     ` Alexander Potapenko
2020-11-11 13:25     ` Alexander Potapenko
2020-11-10 22:10 ` [PATCH v9 06/44] kasan: rename (un)poison_shadow to (un)poison_memory Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-11 13:26   ` Alexander Potapenko
2020-11-11 13:26     ` Alexander Potapenko
2020-11-11 13:26     ` Alexander Potapenko
2020-11-10 22:10 ` [PATCH v9 07/44] kasan: rename KASAN_SHADOW_* to KASAN_GRANULE_* Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-11 13:45   ` Alexander Potapenko
2020-11-11 13:45     ` Alexander Potapenko
2020-11-11 13:45     ` Alexander Potapenko
2020-11-10 22:10 ` [PATCH v9 08/44] kasan: only build init.c for software modes Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-11 13:46   ` Alexander Potapenko
2020-11-11 13:46     ` Alexander Potapenko
2020-11-11 13:46     ` Alexander Potapenko
2020-11-10 22:10 ` [PATCH v9 09/44] kasan: split out shadow.c from common.c Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-11 14:07   ` Alexander Potapenko
2020-11-11 14:07     ` Alexander Potapenko
2020-11-11 14:07     ` Alexander Potapenko
2020-11-10 22:10 ` [PATCH v9 10/44] kasan: define KASAN_GRANULE_PAGE Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-11 14:13   ` Alexander Potapenko
2020-11-11 14:13     ` Alexander Potapenko
2020-11-11 14:13     ` Alexander Potapenko
2020-11-11 18:47     ` Andrey Konovalov
2020-11-11 18:47       ` Andrey Konovalov
2020-11-11 18:47       ` Andrey Konovalov
2020-11-11 19:04       ` Marco Elver
2020-11-11 19:04         ` Marco Elver
2020-11-11 19:04         ` Marco Elver
2020-11-12  0:05         ` Andrey Konovalov
2020-11-12  0:05           ` Andrey Konovalov
2020-11-12  0:05           ` Andrey Konovalov
2020-11-10 22:10 ` [PATCH v9 11/44] kasan: rename report and tags files Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-11 14:15   ` Alexander Potapenko
2020-11-11 14:15     ` Alexander Potapenko
2020-11-11 14:15     ` Alexander Potapenko
2020-11-10 22:10 ` [PATCH v9 12/44] kasan: don't duplicate config dependencies Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-11 14:20   ` Alexander Potapenko
2020-11-11 14:20     ` Alexander Potapenko
2020-11-11 14:20     ` Alexander Potapenko
2020-11-10 22:10 ` [PATCH v9 13/44] kasan: hide invalid free check implementation Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-11 14:23   ` Alexander Potapenko
2020-11-11 14:23     ` Alexander Potapenko
2020-11-11 14:23     ` Alexander Potapenko
2020-11-10 22:10 ` [PATCH v9 14/44] kasan: decode stack frame only with KASAN_STACK_ENABLE Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-11 14:25   ` Alexander Potapenko
2020-11-11 14:25     ` Alexander Potapenko
2020-11-11 14:25     ` Alexander Potapenko
2020-11-10 22:10 ` [PATCH v9 15/44] kasan, arm64: only init shadow for software modes Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-11 14:30   ` Alexander Potapenko
2020-11-11 14:30     ` Alexander Potapenko
2020-11-11 14:30     ` Alexander Potapenko
2020-11-10 22:10 ` [PATCH v9 16/44] kasan, arm64: only use kasan_depth " Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-11 14:59   ` Alexander Potapenko
2020-11-11 14:59     ` Alexander Potapenko
2020-11-11 14:59     ` Alexander Potapenko
2020-11-10 22:10 ` [PATCH v9 17/44] kasan, arm64: move initialization message Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-11 15:03   ` Alexander Potapenko
2020-11-11 15:03     ` Alexander Potapenko
2020-11-11 15:03     ` Alexander Potapenko
2020-11-11 18:50     ` Andrey Konovalov
2020-11-11 18:50       ` Andrey Konovalov
2020-11-11 18:50       ` Andrey Konovalov
2020-11-12 15:09       ` Alexander Potapenko
2020-11-12 15:09         ` Alexander Potapenko
2020-11-12 15:09         ` Alexander Potapenko
2020-11-10 22:10 ` [PATCH v9 18/44] kasan, arm64: rename kasan_init_tags and mark as __init Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-11 15:05   ` Alexander Potapenko
2020-11-11 15:05     ` Alexander Potapenko
2020-11-11 15:05     ` Alexander Potapenko
2020-11-10 22:10 ` [PATCH v9 19/44] kasan: rename addr_has_shadow to addr_has_metadata Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-11 15:06   ` Alexander Potapenko
2020-11-11 15:06     ` Alexander Potapenko
2020-11-11 15:06     ` Alexander Potapenko
2020-11-10 22:10 ` [PATCH v9 20/44] kasan: rename print_shadow_for_address to print_memory_metadata Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-11 15:07   ` Alexander Potapenko
2020-11-11 15:07     ` Alexander Potapenko
2020-11-11 15:07     ` Alexander Potapenko
2020-11-10 22:10 ` [PATCH v9 21/44] kasan: kasan_non_canonical_hook only for software modes Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-11 15:08   ` Alexander Potapenko
2020-11-11 15:08     ` Alexander Potapenko
2020-11-11 15:08     ` Alexander Potapenko
2020-11-11 18:52     ` Andrey Konovalov
2020-11-11 18:52       ` Andrey Konovalov
2020-11-11 18:52       ` Andrey Konovalov
2020-11-12 15:16       ` Alexander Potapenko
2020-11-12 15:16         ` Alexander Potapenko
2020-11-12 15:16         ` Alexander Potapenko
2020-11-12 19:27         ` Andrey Konovalov
2020-11-12 19:27           ` Andrey Konovalov
2020-11-12 19:27           ` Andrey Konovalov
2020-11-10 22:10 ` [PATCH v9 22/44] kasan: rename SHADOW layout macros to META Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-11 15:18   ` Alexander Potapenko
2020-11-11 15:18     ` Alexander Potapenko
2020-11-11 15:18     ` Alexander Potapenko
2020-11-10 22:10 ` [PATCH v9 23/44] kasan: separate metadata_fetch_row for each mode Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-11 15:22   ` Alexander Potapenko
2020-11-11 15:22     ` Alexander Potapenko
2020-11-11 15:22     ` Alexander Potapenko
2020-11-11 16:19     ` Alexander Potapenko
2020-11-11 16:19       ` Alexander Potapenko
2020-11-11 16:19       ` Alexander Potapenko
2020-11-10 22:10 ` [PATCH v9 24/44] kasan, arm64: don't allow SW_TAGS with ARM64_MTE Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-11 15:52   ` Alexander Potapenko
2020-11-11 15:52     ` Alexander Potapenko
2020-11-11 15:52     ` Alexander Potapenko
2020-11-10 22:10 ` [PATCH v9 25/44] kasan: introduce CONFIG_KASAN_HW_TAGS Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-11 15:58   ` Alexander Potapenko
2020-11-11 15:58     ` Alexander Potapenko
2020-11-11 15:58     ` Alexander Potapenko
2020-11-11 18:53     ` Andrey Konovalov
2020-11-11 18:53       ` Andrey Konovalov
2020-11-11 18:53       ` Andrey Konovalov
2020-11-10 22:10 ` [PATCH v9 26/44] arm64: Enable armv8.5-a asm-arch option Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10 ` [PATCH v9 27/44] arm64: mte: Add in-kernel MTE helpers Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10 ` [PATCH v9 28/44] arm64: mte: Reset the page tag in page->flags Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-12  9:31   ` Catalin Marinas
2020-11-12  9:31     ` Catalin Marinas
2020-11-12  9:39     ` Vincenzo Frascino
2020-11-12  9:39       ` Vincenzo Frascino
2020-11-10 22:10 ` [PATCH v9 29/44] arm64: mte: Add in-kernel tag fault handler Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10 ` [PATCH v9 30/44] arm64: kasan: Allow enabling in-kernel MTE Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-12  9:43   ` Catalin Marinas
2020-11-12  9:43     ` Catalin Marinas
2020-11-12 16:46     ` Vincenzo Frascino
2020-11-12 16:46       ` Vincenzo Frascino
2020-11-13 11:17     ` Vincenzo Frascino
2020-11-13 11:17       ` Vincenzo Frascino
2020-11-13 12:00       ` Catalin Marinas
2020-11-13 12:00         ` Catalin Marinas
2020-11-13 12:04         ` Vincenzo Frascino
2020-11-13 12:04           ` Vincenzo Frascino
2020-11-10 22:10 ` [PATCH v9 31/44] arm64: mte: Convert gcr_user into an exclude mask Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10 ` [PATCH v9 32/44] arm64: mte: Switch GCR_EL1 in kernel entry and exit Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-12  9:39   ` Catalin Marinas
2020-11-12  9:39     ` Catalin Marinas
2020-11-12  9:45     ` Vincenzo Frascino
2020-11-12  9:45       ` Vincenzo Frascino
2020-11-12  9:45       ` Catalin Marinas
2020-11-12  9:45         ` Catalin Marinas
2020-11-12  9:55         ` Vincenzo Frascino
2020-11-12  9:55           ` Vincenzo Frascino
2020-11-10 22:10 ` [PATCH v9 33/44] kasan, mm: untag page address in free_reserved_area Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10 ` [PATCH v9 34/44] arm64: kasan: Align allocations for HW_TAGS Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-11 16:10   ` Alexander Potapenko
2020-11-11 16:10     ` Alexander Potapenko
2020-11-11 16:10     ` Alexander Potapenko
2020-11-10 22:10 ` [PATCH v9 35/44] arm64: kasan: Add arch layer for memory tagging helpers Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10 ` [PATCH v9 36/44] kasan: define KASAN_GRANULE_SIZE for HW_TAGS Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-11 16:13   ` Alexander Potapenko
2020-11-11 16:13     ` Alexander Potapenko
2020-11-11 16:13     ` Alexander Potapenko
2020-11-10 22:10 ` [PATCH v9 37/44] kasan, x86, s390: update undef CONFIG_KASAN Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-11 16:15   ` Alexander Potapenko
2020-11-11 16:15     ` Alexander Potapenko
2020-11-11 16:15     ` Alexander Potapenko
2020-11-10 22:10 ` [PATCH v9 38/44] kasan, arm64: expand CONFIG_KASAN checks Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-11 16:22   ` Alexander Potapenko
2020-11-11 16:22     ` Alexander Potapenko
2020-11-11 16:22     ` Alexander Potapenko
2020-11-10 22:10 ` Andrey Konovalov [this message]
2020-11-10 22:10   ` [PATCH v9 39/44] kasan, arm64: implement HW_TAGS runtime Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-12 17:37   ` Alexander Potapenko
2020-11-12 17:37     ` Alexander Potapenko
2020-11-12 17:37     ` Alexander Potapenko
2020-11-10 22:10 ` [PATCH v9 40/44] kasan, arm64: print report from tag fault handler Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-11 16:43   ` Alexander Potapenko
2020-11-11 16:43     ` Alexander Potapenko
2020-11-11 16:43     ` Alexander Potapenko
2020-11-10 22:10 ` [PATCH v9 41/44] kasan, mm: reset tags when accessing metadata Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-12 16:10   ` Alexander Potapenko
2020-11-12 16:10     ` Alexander Potapenko
2020-11-12 16:10     ` Alexander Potapenko
2020-11-10 22:10 ` [PATCH v9 42/44] kasan, arm64: enable CONFIG_KASAN_HW_TAGS Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-11 16:49   ` Alexander Potapenko
2020-11-11 16:49     ` Alexander Potapenko
2020-11-11 16:49     ` Alexander Potapenko
2020-11-10 22:10 ` [PATCH v9 43/44] kasan: add documentation for hardware tag-based mode Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-11 16:57   ` Alexander Potapenko
2020-11-11 16:57     ` Alexander Potapenko
2020-11-11 16:57     ` Alexander Potapenko
2020-11-11 18:54     ` Andrey Konovalov
2020-11-11 18:54       ` Andrey Konovalov
2020-11-11 18:54       ` Andrey Konovalov
2020-11-10 22:10 ` [PATCH v9 44/44] kselftest/arm64: Check GCR_EL1 after context switch Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-10 22:10   ` Andrey Konovalov
2020-11-12  9:46   ` Catalin Marinas
2020-11-12  9:46     ` Catalin Marinas
2020-11-12 15:59   ` Alexander Potapenko
2020-11-12 15:59     ` Alexander Potapenko
2020-11-12 15:59     ` Alexander Potapenko
2020-11-12 16:09     ` Marco Elver
2020-11-12 16:09       ` Marco Elver
2020-11-12 16:09       ` Marco Elver
2020-11-12 16:41       ` Alexander Potapenko
2020-11-12 16:41         ` Alexander Potapenko
2020-11-12 16:41         ` Alexander Potapenko
2020-11-13 11:47     ` Vincenzo Frascino
2020-11-13 11:47       ` Vincenzo Frascino
2020-11-10 22:54 ` [PATCH v9 00/44] kasan: add hardware tag-based mode for arm64 Andrew Morton
2020-11-10 22:54   ` Andrew Morton
2020-11-11 14:35   ` Andrey Konovalov
2020-11-11 14:35     ` Andrey Konovalov
2020-11-11 14:35     ` Andrey Konovalov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=9f8119934070b7ffa8d129b64c9d05644ce7d20a.1605046192.git.andreyknvl@google.com \
    --to=andreyknvl@google.com \
    --cc=Branislav.Rankov@arm.com \
    --cc=akpm@linux-foundation.org \
    --cc=aryabinin@virtuozzo.com \
    --cc=catalin.marinas@arm.com \
    --cc=dvyukov@google.com \
    --cc=elver@google.com \
    --cc=eugenis@google.com \
    --cc=glider@google.com \
    --cc=kasan-dev@googlegroups.com \
    --cc=kevin.brodsky@arm.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=vincenzo.frascino@arm.com \
    --cc=will.deacon@arm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.