Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef __ASM_KASAN_H
3#define __ASM_KASAN_H
4
5#ifdef CONFIG_KASAN
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
15#ifndef __ASSEMBLY__
16
17#include <asm/page.h>
18#include <linux/sizes.h>
19
20#define KASAN_SHADOW_SCALE_SHIFT 3
21
22#ifdef CONFIG_MODULES
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
28#define KASAN_SHADOW_START (KASAN_SHADOW_OFFSET + \
29 (KASAN_KERN_START >> KASAN_SHADOW_SCALE_SHIFT))
30
31#define KASAN_SHADOW_OFFSET ASM_CONST(CONFIG_KASAN_SHADOW_OFFSET)
32
33#ifdef CONFIG_PPC32
34#define KASAN_SHADOW_END (-(-KASAN_SHADOW_START >> KASAN_SHADOW_SCALE_SHIFT))
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
42#endif
43
44#ifdef CONFIG_KASAN
45#ifdef CONFIG_PPC_BOOK3S_64
46DECLARE_STATIC_KEY_FALSE(powerpc_kasan_enabled_key);
47
48static __always_inline bool kasan_arch_is_ready(void)
49{
50 if (static_branch_likely(&powerpc_kasan_enabled_key))
51 return true;
52 return false;
53}
54
55#define kasan_arch_is_ready kasan_arch_is_ready
56#endif
57
58void kasan_early_init(void);
59void kasan_mmu_init(void);
60void kasan_init(void);
61void kasan_late_init(void);
62#else
63static inline void kasan_init(void) { }
64static inline void kasan_mmu_init(void) { }
65static inline void kasan_late_init(void) { }
66#endif
67
68void kasan_update_early_region(unsigned long k_start, unsigned long k_end, pte_t pte);
69int kasan_init_shadow_page_tables(unsigned long k_start, unsigned long k_end);
70int kasan_init_region(void *start, size_t size);
71
72#endif /* __ASSEMBLY */
73#endif