xref: /linux/arch/powerpc/include/asm/kasan.h (revision bba2c3615bd6cfee7456d1130f2e6b01b3f4e9ba)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef __ASM_KASAN_H
3 #define __ASM_KASAN_H
4 
5 #if defined(CONFIG_KASAN) && !defined(CONFIG_CC_HAS_KASAN_MEMINTRINSIC_PREFIX)
6 #define _GLOBAL_KASAN(fn)			\
7 	_GLOBAL(fn);				\
8 	_GLOBAL(__##fn)
9 #define _GLOBAL_TOC_KASAN(fn)			\
10 	_GLOBAL_TOC(fn);			\
11 	_GLOBAL_TOC(__##fn)
12 #define EXPORT_SYMBOL_KASAN(fn)			\
13 	EXPORT_SYMBOL(__##fn)
14 #else /* CONFIG_KASAN && !CONFIG_CC_HAS_KASAN_MEMINTRINSIC_PREFIX */
15 #define _GLOBAL_KASAN(fn)	_GLOBAL(fn)
16 #define _GLOBAL_TOC_KASAN(fn)	_GLOBAL_TOC(fn)
17 #define EXPORT_SYMBOL_KASAN(fn)
18 #endif /* CONFIG_KASAN && !CONFIG_CC_HAS_KASAN_MEMINTRINSIC_PREFIX */
19 
20 #ifndef __ASSEMBLER__
21 
22 #include <asm/page.h>
23 #include <linux/sizes.h>
24 
25 #define KASAN_SHADOW_SCALE_SHIFT	3
26 
27 #if defined(CONFIG_EXECMEM) && defined(CONFIG_PPC32)
28 #define KASAN_KERN_START	ALIGN_DOWN(PAGE_OFFSET - SZ_256M, SZ_256M)
29 #else
30 #define KASAN_KERN_START	PAGE_OFFSET
31 #endif
32 
33 #define KASAN_SHADOW_START	(KASAN_SHADOW_OFFSET + \
34 				 (KASAN_KERN_START >> KASAN_SHADOW_SCALE_SHIFT))
35 
36 #define KASAN_SHADOW_OFFSET	ASM_CONST(CONFIG_KASAN_SHADOW_OFFSET)
37 
38 #ifdef CONFIG_PPC32
39 #define KASAN_SHADOW_END	(-(-KASAN_SHADOW_START >> KASAN_SHADOW_SCALE_SHIFT))
40 #elif defined(CONFIG_PPC_BOOK3S_64)
41 /*
42  * The shadow ends before the highest accessible address
43  * because we don't need a shadow for the shadow. Instead:
44  * c00e000000000000 << 3 + a80e000000000000 = c00fc00000000000
45  */
46 #define KASAN_SHADOW_END 0xc00fc00000000000UL
47 
48 #else
49 
50 /*
51  * The shadow ends before the highest accessible address
52  * because we don't need a shadow for the shadow.
53  * But it doesn't hurt to have a shadow for the shadow,
54  * keep shadow end aligned eases things.
55  */
56 #define KASAN_SHADOW_END 0xc000200000000000UL
57 
58 #endif
59 
60 #ifdef CONFIG_KASAN
61 
62 void kasan_early_init(void);
63 void kasan_mmu_init(void);
64 void kasan_init(void);
65 void kasan_late_init(void);
66 #else
67 static inline void kasan_init(void) { }
68 static inline void kasan_mmu_init(void) { }
69 static inline void kasan_late_init(void) { }
70 #endif
71 
72 void kasan_update_early_region(unsigned long k_start, unsigned long k_end, pte_t pte);
73 int kasan_init_shadow_page_tables(unsigned long k_start, unsigned long k_end);
74 int kasan_init_region(void *start, size_t size);
75 
76 #endif /* __ASSEMBLER__ */
77 #endif
78