]>
Commit | Line | Data |
---|---|---|
5aa4ac64 QZ |
1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | #ifndef __ASM_KASAN_H | |
3 | #define __ASM_KASAN_H | |
4 | ||
5 | #ifndef __ASSEMBLY__ | |
6 | ||
7 | #include <linux/linkage.h> | |
8 | #include <linux/mmzone.h> | |
9 | #include <asm/addrspace.h> | |
10 | #include <asm/io.h> | |
11 | #include <asm/pgtable.h> | |
12 | ||
5aa4ac64 QZ |
13 | #define KASAN_SHADOW_SCALE_SHIFT 3 |
14 | #define KASAN_SHADOW_OFFSET _AC(CONFIG_KASAN_SHADOW_OFFSET, UL) | |
15 | ||
16 | #define XRANGE_SHIFT (48) | |
17 | ||
18 | /* Valid address length */ | |
19 | #define XRANGE_SHADOW_SHIFT (PGDIR_SHIFT + PAGE_SHIFT - 3) | |
20 | /* Used for taking out the valid address */ | |
21 | #define XRANGE_SHADOW_MASK GENMASK_ULL(XRANGE_SHADOW_SHIFT - 1, 0) | |
22 | /* One segment whole address space size */ | |
23 | #define XRANGE_SIZE (XRANGE_SHADOW_MASK + 1) | |
24 | ||
25 | /* 64-bit segment value. */ | |
26 | #define XKPRANGE_UC_SEG (0x8000) | |
27 | #define XKPRANGE_CC_SEG (0x9000) | |
28 | #define XKVRANGE_VC_SEG (0xffff) | |
29 | ||
30 | /* Cached */ | |
31 | #define XKPRANGE_CC_START CACHE_BASE | |
32 | #define XKPRANGE_CC_SIZE XRANGE_SIZE | |
33 | #define XKPRANGE_CC_KASAN_OFFSET (0) | |
34 | #define XKPRANGE_CC_SHADOW_SIZE (XKPRANGE_CC_SIZE >> KASAN_SHADOW_SCALE_SHIFT) | |
35 | #define XKPRANGE_CC_SHADOW_END (XKPRANGE_CC_KASAN_OFFSET + XKPRANGE_CC_SHADOW_SIZE) | |
36 | ||
37 | /* UnCached */ | |
38 | #define XKPRANGE_UC_START UNCACHE_BASE | |
39 | #define XKPRANGE_UC_SIZE XRANGE_SIZE | |
40 | #define XKPRANGE_UC_KASAN_OFFSET XKPRANGE_CC_SHADOW_END | |
41 | #define XKPRANGE_UC_SHADOW_SIZE (XKPRANGE_UC_SIZE >> KASAN_SHADOW_SCALE_SHIFT) | |
42 | #define XKPRANGE_UC_SHADOW_END (XKPRANGE_UC_KASAN_OFFSET + XKPRANGE_UC_SHADOW_SIZE) | |
43 | ||
44 | /* VMALLOC (Cached or UnCached) */ | |
45 | #define XKVRANGE_VC_START MODULES_VADDR | |
46 | #define XKVRANGE_VC_SIZE round_up(KFENCE_AREA_END - MODULES_VADDR + 1, PGDIR_SIZE) | |
47 | #define XKVRANGE_VC_KASAN_OFFSET XKPRANGE_UC_SHADOW_END | |
48 | #define XKVRANGE_VC_SHADOW_SIZE (XKVRANGE_VC_SIZE >> KASAN_SHADOW_SCALE_SHIFT) | |
49 | #define XKVRANGE_VC_SHADOW_END (XKVRANGE_VC_KASAN_OFFSET + XKVRANGE_VC_SHADOW_SIZE) | |
50 | ||
51 | /* KAsan shadow memory start right after vmalloc. */ | |
52 | #define KASAN_SHADOW_START round_up(KFENCE_AREA_END, PGDIR_SIZE) | |
53 | #define KASAN_SHADOW_SIZE (XKVRANGE_VC_SHADOW_END - XKPRANGE_CC_KASAN_OFFSET) | |
54 | #define KASAN_SHADOW_END round_up(KASAN_SHADOW_START + KASAN_SHADOW_SIZE, PGDIR_SIZE) | |
55 | ||
56 | #define XKPRANGE_CC_SHADOW_OFFSET (KASAN_SHADOW_START + XKPRANGE_CC_KASAN_OFFSET) | |
57 | #define XKPRANGE_UC_SHADOW_OFFSET (KASAN_SHADOW_START + XKPRANGE_UC_KASAN_OFFSET) | |
58 | #define XKVRANGE_VC_SHADOW_OFFSET (KASAN_SHADOW_START + XKVRANGE_VC_KASAN_OFFSET) | |
59 | ||
60 | extern bool kasan_early_stage; | |
61 | extern unsigned char kasan_early_shadow_page[PAGE_SIZE]; | |
62 | ||
2a86f1b5 | 63 | #define kasan_mem_to_shadow kasan_mem_to_shadow |
99e5a247 | 64 | void *kasan_mem_to_shadow(const void *addr); |
5aa4ac64 | 65 | |
2a86f1b5 | 66 | #define kasan_shadow_to_mem kasan_shadow_to_mem |
99e5a247 HC |
67 | const void *kasan_shadow_to_mem(const void *shadow_addr); |
68 | ||
69 | #define kasan_arch_is_ready kasan_arch_is_ready | |
70 | static __always_inline bool kasan_arch_is_ready(void) | |
5aa4ac64 | 71 | { |
99e5a247 | 72 | return !kasan_early_stage; |
5aa4ac64 QZ |
73 | } |
74 | ||
2a86f1b5 HC |
75 | #define addr_has_metadata addr_has_metadata |
76 | static __always_inline bool addr_has_metadata(const void *addr) | |
77 | { | |
78 | return (kasan_mem_to_shadow((void *)addr) != NULL); | |
79 | } | |
80 | ||
5aa4ac64 QZ |
81 | void kasan_init(void); |
82 | asmlinkage void kasan_early_init(void); | |
83 | ||
84 | #endif | |
85 | #endif |