1 /* SPDX-License-Identifier: GPL-2.0 */
5 #if defined(CONFIG_KASAN) && !defined(CONFIG_CC_HAS_KASAN_MEMINTRINSIC_PREFIX)
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)
10 #define _GLOBAL_KASAN(fn) _GLOBAL(fn)
11 #define _GLOBAL_TOC_KASAN(fn) _GLOBAL_TOC(fn)
12 #define EXPORT_SYMBOL_KASAN(fn)
18 #include <linux/sizes.h>
20 #define KASAN_SHADOW_SCALE_SHIFT 3
22 #if defined(CONFIG_EXECMEM) && defined(CONFIG_PPC32)
23 #define KASAN_KERN_START ALIGN_DOWN(PAGE_OFFSET - SZ_256M, SZ_256M)
25 #define KASAN_KERN_START PAGE_OFFSET
28 #define KASAN_SHADOW_START (KASAN_SHADOW_OFFSET + \
29 (KASAN_KERN_START >> KASAN_SHADOW_SCALE_SHIFT))
31 #define KASAN_SHADOW_OFFSET ASM_CONST(CONFIG_KASAN_SHADOW_OFFSET)
34 #define KASAN_SHADOW_END (-(-KASAN_SHADOW_START >> KASAN_SHADOW_SCALE_SHIFT))
35 #elif defined(CONFIG_PPC_BOOK3S_64)
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
41 #define KASAN_SHADOW_END 0xc00fc00000000000UL
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.
51 #define KASAN_SHADOW_END 0xc000200000000000UL
56 #ifdef CONFIG_PPC_BOOK3S_64
57 DECLARE_STATIC_KEY_FALSE(powerpc_kasan_enabled_key
);
59 static __always_inline
bool kasan_arch_is_ready(void)
61 if (static_branch_likely(&powerpc_kasan_enabled_key
))
66 #define kasan_arch_is_ready kasan_arch_is_ready
69 void kasan_early_init(void);
70 void kasan_mmu_init(void);
71 void kasan_init(void);
72 void kasan_late_init(void);
74 static inline void kasan_init(void) { }
75 static inline void kasan_mmu_init(void) { }
76 static inline void kasan_late_init(void) { }
79 void kasan_update_early_region(unsigned long k_start
, unsigned long k_end
, pte_t pte
);
80 int kasan_init_shadow_page_tables(unsigned long k_start
, unsigned long k_end
);
81 int kasan_init_region(void *start
, size_t size
);
83 #endif /* __ASSEMBLY */