Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 #ifndef __ASM_KASAN_H
0003 #define __ASM_KASAN_H
0004 
0005 #ifdef CONFIG_KASAN
0006 #define _GLOBAL_KASAN(fn)   _GLOBAL(__##fn)
0007 #define _GLOBAL_TOC_KASAN(fn)   _GLOBAL_TOC(__##fn)
0008 #define EXPORT_SYMBOL_KASAN(fn) EXPORT_SYMBOL(__##fn)
0009 #else
0010 #define _GLOBAL_KASAN(fn)   _GLOBAL(fn)
0011 #define _GLOBAL_TOC_KASAN(fn)   _GLOBAL_TOC(fn)
0012 #define EXPORT_SYMBOL_KASAN(fn)
0013 #endif
0014 
0015 #ifndef __ASSEMBLY__
0016 
0017 #include <asm/page.h>
0018 #include <linux/sizes.h>
0019 
0020 #define KASAN_SHADOW_SCALE_SHIFT    3
0021 
0022 #if defined(CONFIG_MODULES) && defined(CONFIG_PPC32)
0023 #define KASAN_KERN_START    ALIGN_DOWN(PAGE_OFFSET - SZ_256M, SZ_256M)
0024 #else
0025 #define KASAN_KERN_START    PAGE_OFFSET
0026 #endif
0027 
0028 #define KASAN_SHADOW_START  (KASAN_SHADOW_OFFSET + \
0029                  (KASAN_KERN_START >> KASAN_SHADOW_SCALE_SHIFT))
0030 
0031 #define KASAN_SHADOW_OFFSET ASM_CONST(CONFIG_KASAN_SHADOW_OFFSET)
0032 
0033 #ifdef CONFIG_PPC32
0034 #define KASAN_SHADOW_END    (-(-KASAN_SHADOW_START >> KASAN_SHADOW_SCALE_SHIFT))
0035 #elif defined(CONFIG_PPC_BOOK3S_64)
0036 /*
0037  * The shadow ends before the highest accessible address
0038  * because we don't need a shadow for the shadow. Instead:
0039  * c00e000000000000 << 3 + a80e000000000000 = c00fc00000000000
0040  */
0041 #define KASAN_SHADOW_END 0xc00fc00000000000UL
0042 
0043 #else
0044 
0045 /*
0046  * The shadow ends before the highest accessible address
0047  * because we don't need a shadow for the shadow.
0048  * But it doesn't hurt to have a shadow for the shadow,
0049  * keep shadow end aligned eases things.
0050  */
0051 #define KASAN_SHADOW_END 0xc000200000000000UL
0052 
0053 #endif
0054 
0055 #ifdef CONFIG_KASAN
0056 #ifdef CONFIG_PPC_BOOK3S_64
0057 DECLARE_STATIC_KEY_FALSE(powerpc_kasan_enabled_key);
0058 
0059 static __always_inline bool kasan_arch_is_ready(void)
0060 {
0061     if (static_branch_likely(&powerpc_kasan_enabled_key))
0062         return true;
0063     return false;
0064 }
0065 
0066 #define kasan_arch_is_ready kasan_arch_is_ready
0067 #endif
0068 
0069 void kasan_early_init(void);
0070 void kasan_mmu_init(void);
0071 void kasan_init(void);
0072 void kasan_late_init(void);
0073 #else
0074 static inline void kasan_init(void) { }
0075 static inline void kasan_mmu_init(void) { }
0076 static inline void kasan_late_init(void) { }
0077 #endif
0078 
0079 void kasan_update_early_region(unsigned long k_start, unsigned long k_end, pte_t pte);
0080 int kasan_init_shadow_page_tables(unsigned long k_start, unsigned long k_end);
0081 int kasan_init_region(void *start, size_t size);
0082 
0083 #endif /* __ASSEMBLY */
0084 #endif