| #ifndef __MM_KASAN_KASAN_H |
| #define __MM_KASAN_KASAN_H |
| |
| #include <linux/kasan.h> |
| |
| #define KASAN_SHADOW_SCALE_SIZE (1UL << KASAN_SHADOW_SCALE_SHIFT) |
| #define KASAN_SHADOW_MASK (KASAN_SHADOW_SCALE_SIZE - 1) |
| |
| #define KASAN_FREE_PAGE 0xFF /* page was freed */ |
| #define KASAN_FREE_PAGE 0xFF /* page was freed */ |
| #define KASAN_PAGE_REDZONE 0xFE /* redzone for kmalloc_large allocations */ |
| #define KASAN_KMALLOC_REDZONE 0xFC /* redzone inside slub object */ |
| #define KASAN_KMALLOC_FREE 0xFB /* object was freed (kmem_cache_free/kfree) */ |
| |
| |
| struct kasan_access_info { |
| const void *access_addr; |
| const void *first_bad_addr; |
| size_t access_size; |
| bool is_write; |
| unsigned long ip; |
| }; |
| |
| void kasan_report_error(struct kasan_access_info *info); |
| void kasan_report_user_access(struct kasan_access_info *info); |
| |
| static inline const void *kasan_shadow_to_mem(const void *shadow_addr) |
| { |
| return (void *)(((unsigned long)shadow_addr - KASAN_SHADOW_OFFSET) |
| << KASAN_SHADOW_SCALE_SHIFT); |
| } |
| |
| static inline bool kasan_enabled(void) |
| { |
| return !current->kasan_depth; |
| } |
| |
| void kasan_report(unsigned long addr, size_t size, |
| bool is_write, unsigned long ip); |
| |
| #endif |