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