Re: [PATCH v8 30/43] arm64: kasan: Allow enabling in-kernel MTE
From: Andrey Konovalov <hidden>
Date: 2020-11-05 11:36:29
Also in:
linux-mm, lkml
On Thu, Nov 5, 2020 at 12:13 PM Vincenzo Frascino [off-list ref] wrote:
Hi Andrey, On 11/4/20 11:18 PM, Andrey Konovalov wrote:quoted
Hardware tag-based KASAN relies on Memory Tagging Extension (MTE) feature and requires it to be enabled. MTE supports This patch adds a new mte_init_tags() helper, that enables MTE in Synchronous mode in EL1 and is intended to be called from KASAN runtime during initialization. The Tag Checking operation causes a synchronous data abort as a consequence of a tag check fault when MTE is configured in synchronous mode. As part of this change enable match-all tag for EL1 to allow the kernel to access user pages without faulting. This is required because the kernel does not have knowledge of the tags set by the user in a page. Note: For MTE, the TCF bit field in SCTLR_EL1 affects only EL1 in a similar way as TCF0 affects EL0. MTE that is built on top of the Top Byte Ignore (TBI) feature hence we enable it as part of this patch as well.seems that in this patch you dropped me as author. Would you mind to clarify the reason?
Sorry, a mistake while squashing/rebasing, will fix in the next version.
quoted
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com> Co-developed-by: Andrey Konovalov <redacted> Signed-off-by: Andrey Konovalov <redacted> --- Change-Id: I4d67497268bb7f0c2fc5dcacefa1e273df4af71d --- arch/arm64/include/asm/mte-kasan.h | 6 ++++++ arch/arm64/kernel/mte.c | 7 +++++++ arch/arm64/mm/proc.S | 23 ++++++++++++++++++++--- 3 files changed, 33 insertions(+), 3 deletions(-)diff --git a/arch/arm64/include/asm/mte-kasan.h b/arch/arm64/include/asm/mte-kasan.h index 3a70fb1807fd..ae75feaea2d4 100644 --- a/arch/arm64/include/asm/mte-kasan.h +++ b/arch/arm64/include/asm/mte-kasan.h@@ -29,6 +29,8 @@ u8 mte_get_mem_tag(void *addr); u8 mte_get_random_tag(void); void *mte_set_mem_tag_range(void *addr, size_t size, u8 tag); +void __init mte_init_tags(u64 max_tag); + #else /* CONFIG_ARM64_MTE */ static inline u8 mte_get_ptr_tag(void *ptr)@@ -49,6 +51,10 @@ static inline void *mte_set_mem_tag_range(void *addr, size_t size, u8 tag) return addr; } +static inline void mte_init_tags(u64 max_tag) +{ +} + #endif /* CONFIG_ARM64_MTE */ #endif /* __ASSEMBLY__ */diff --git a/arch/arm64/kernel/mte.c b/arch/arm64/kernel/mte.c index 06ba6c923ab7..fcfbefcc3174 100644 --- a/arch/arm64/kernel/mte.c +++ b/arch/arm64/kernel/mte.c@@ -121,6 +121,13 @@ void *mte_set_mem_tag_range(void *addr, size_t size, u8 tag) return ptr; } +void __init mte_init_tags(u64 max_tag) +{ + /* Enable MTE Sync Mode for EL1. */ + sysreg_clear_set(sctlr_el1, SCTLR_ELx_TCF_MASK, SCTLR_ELx_TCF_SYNC); + isb();I am fine with the approach of letting cpu_enable_mte() call directly kasan_init_tags(), but how does it work of the other 2 implementation of KASAN? Is it still called in arch_setup()?
Yes, the other 2 modes are initialized in setup_arch().
I would prefer to keep the code that initializes the sync mode in cpu_enable_mte() (calling kasan_init_tags() before then that)
This won't work, we'll later need to make the decision about whether to turn on MTE at all in KASAN runtime based on KASAN boot flags.
or in a separate function since setting the mode has nothing to do with initializing the tags.
This will work. Any preference on the name of this function? Alternatively we can rename mte_init_tags() to something else and let it handle both RRND and sync/async. Thanks! _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel