-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
arm64: mte: add in-kernel MTE helpers
Provide helper functions to manipulate allocation and pointer tags for kernel addresses. Low-level helper functions (mte_assign_*, written in assembly) operate tag values from the [0x0, 0xF] range. High-level helper functions (mte_get/set_*) use the [0xF0, 0xFF] range to preserve compatibility with normal kernel pointers that have 0xFF in their top byte. MTE_GRANULE_SIZE and related definitions are moved to mte-def.h header that doesn't have any dependencies and is safe to include into any low-level header. Link: https://lkml.kernel.org/r/c31bf759b4411b2d98cdd801eb928e241584fd1f.1606161801.git.andreyknvl@google.com Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com> Co-developed-by: Andrey Konovalov <andreyknvl@google.com> Signed-off-by: Andrey Konovalov <andreyknvl@google.com> Reviewed-by: Catalin Marinas <catalin.marinas@arm.com> Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com> Cc: Alexander Potapenko <glider@google.com> Cc: Andrey Ryabinin <aryabinin@virtuozzo.com> Cc: Branislav Rankov <Branislav.Rankov@arm.com> Cc: Dmitry Vyukov <dvyukov@google.com> Cc: Evgenii Stepanov <eugenis@google.com> Cc: Kevin Brodsky <kevin.brodsky@arm.com> Cc: Marco Elver <elver@google.com> Cc: Vasily Gorbik <gor@linux.ibm.com> Cc: Will Deacon <will.deacon@arm.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
- Loading branch information
Vincenzo Frascino
authored and
Linus Torvalds
committed
Dec 22, 2020
1 parent
f469c03
commit 85f49ca
Showing
6 changed files
with
150 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
/* SPDX-License-Identifier: GPL-2.0 */ | ||
/* | ||
* Copyright (C) 2020 ARM Ltd. | ||
*/ | ||
#ifndef __ASM_MTE_DEF_H | ||
#define __ASM_MTE_DEF_H | ||
|
||
#define MTE_GRANULE_SIZE UL(16) | ||
#define MTE_GRANULE_MASK (~(MTE_GRANULE_SIZE - 1)) | ||
#define MTE_TAG_SHIFT 56 | ||
#define MTE_TAG_SIZE 4 | ||
#define MTE_TAG_MASK GENMASK((MTE_TAG_SHIFT + (MTE_TAG_SIZE - 1)), MTE_TAG_SHIFT) | ||
#define MTE_TAG_MAX (MTE_TAG_MASK >> MTE_TAG_SHIFT) | ||
|
||
#endif /* __ASM_MTE_DEF_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
/* SPDX-License-Identifier: GPL-2.0 */ | ||
/* | ||
* Copyright (C) 2020 ARM Ltd. | ||
*/ | ||
#ifndef __ASM_MTE_KASAN_H | ||
#define __ASM_MTE_KASAN_H | ||
|
||
#include <asm/mte-def.h> | ||
|
||
#ifndef __ASSEMBLY__ | ||
|
||
#include <linux/types.h> | ||
|
||
/* | ||
* The functions below are meant to be used only for the | ||
* KASAN_HW_TAGS interface defined in asm/memory.h. | ||
*/ | ||
#ifdef CONFIG_ARM64_MTE | ||
|
||
static inline u8 mte_get_ptr_tag(void *ptr) | ||
{ | ||
/* Note: The format of KASAN tags is 0xF<x> */ | ||
u8 tag = 0xF0 | (u8)(((u64)(ptr)) >> MTE_TAG_SHIFT); | ||
|
||
return tag; | ||
} | ||
|
||
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); | ||
|
||
#else /* CONFIG_ARM64_MTE */ | ||
|
||
static inline u8 mte_get_ptr_tag(void *ptr) | ||
{ | ||
return 0xFF; | ||
} | ||
|
||
static inline u8 mte_get_mem_tag(void *addr) | ||
{ | ||
return 0xFF; | ||
} | ||
static inline u8 mte_get_random_tag(void) | ||
{ | ||
return 0xFF; | ||
} | ||
static inline void *mte_set_mem_tag_range(void *addr, size_t size, u8 tag) | ||
{ | ||
return addr; | ||
} | ||
|
||
#endif /* CONFIG_ARM64_MTE */ | ||
|
||
#endif /* __ASSEMBLY__ */ | ||
|
||
#endif /* __ASM_MTE_KASAN_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters