kasan.h (7fae3dd08e3e88491f06e22e648913e3f8cf30f0) | kasan.h (59e6e098d1c156f7c449af903c3b48a5470f6120) |
---|---|
1/* SPDX-License-Identifier: GPL-2.0 */ 2#ifndef __MM_KASAN_KASAN_H 3#define __MM_KASAN_KASAN_H 4 5#include <linux/kasan.h> 6#include <linux/kasan-tags.h> 7#include <linux/kfence.h> 8#include <linux/stackdepot.h> --- 132 unchanged lines hidden (view full) --- 141 142/* Metadata layout customization. */ 143#define META_BYTES_PER_BLOCK 1 144#define META_BLOCKS_PER_ROW 16 145#define META_BYTES_PER_ROW (META_BLOCKS_PER_ROW * META_BYTES_PER_BLOCK) 146#define META_MEM_BYTES_PER_ROW (META_BYTES_PER_ROW * KASAN_GRANULE_SIZE) 147#define META_ROWS_AROUND_ADDR 2 148 | 1/* SPDX-License-Identifier: GPL-2.0 */ 2#ifndef __MM_KASAN_KASAN_H 3#define __MM_KASAN_KASAN_H 4 5#include <linux/kasan.h> 6#include <linux/kasan-tags.h> 7#include <linux/kfence.h> 8#include <linux/stackdepot.h> --- 132 unchanged lines hidden (view full) --- 141 142/* Metadata layout customization. */ 143#define META_BYTES_PER_BLOCK 1 144#define META_BLOCKS_PER_ROW 16 145#define META_BYTES_PER_ROW (META_BLOCKS_PER_ROW * META_BYTES_PER_BLOCK) 146#define META_MEM_BYTES_PER_ROW (META_BYTES_PER_ROW * KASAN_GRANULE_SIZE) 147#define META_ROWS_AROUND_ADDR 2 148 |
149#define KASAN_STACK_DEPTH 64 150 151struct kasan_track { 152 u32 pid; 153 depot_stack_handle_t stack; 154}; 155 |
|
149enum kasan_report_type { 150 KASAN_REPORT_ACCESS, 151 KASAN_REPORT_INVALID_FREE, 152 KASAN_REPORT_DOUBLE_FREE, 153}; 154 155struct kasan_report_info { 156 /* Filled in by kasan_report_*(). */ 157 enum kasan_report_type type; 158 void *access_addr; 159 size_t access_size; 160 bool is_write; 161 unsigned long ip; 162 163 /* Filled in by the common reporting code. */ 164 void *first_bad_addr; 165 struct kmem_cache *cache; 166 void *object; | 156enum kasan_report_type { 157 KASAN_REPORT_ACCESS, 158 KASAN_REPORT_INVALID_FREE, 159 KASAN_REPORT_DOUBLE_FREE, 160}; 161 162struct kasan_report_info { 163 /* Filled in by kasan_report_*(). */ 164 enum kasan_report_type type; 165 void *access_addr; 166 size_t access_size; 167 bool is_write; 168 unsigned long ip; 169 170 /* Filled in by the common reporting code. */ 171 void *first_bad_addr; 172 struct kmem_cache *cache; 173 void *object; |
174 175 /* Filled in by the mode-specific reporting code. */ 176 const char *bug_type; 177 struct kasan_track alloc_track; 178 struct kasan_track free_track; |
|
167}; 168 169/* Do not change the struct layout: compiler ABI. */ 170struct kasan_source_location { 171 const char *filename; 172 int line_no; 173 int column_no; 174}; --- 9 unchanged lines hidden (view full) --- 184#if KASAN_ABI_VERSION >= 4 185 struct kasan_source_location *location; 186#endif 187#if KASAN_ABI_VERSION >= 5 188 char *odr_indicator; 189#endif 190}; 191 | 179}; 180 181/* Do not change the struct layout: compiler ABI. */ 182struct kasan_source_location { 183 const char *filename; 184 int line_no; 185 int column_no; 186}; --- 9 unchanged lines hidden (view full) --- 196#if KASAN_ABI_VERSION >= 4 197 struct kasan_source_location *location; 198#endif 199#if KASAN_ABI_VERSION >= 5 200 char *odr_indicator; 201#endif 202}; 203 |
192/* Structures for keeping alloc and free tracks. */ | 204/* Structures for keeping alloc and free meta. */ |
193 | 205 |
194#define KASAN_STACK_DEPTH 64 195 196struct kasan_track { 197 u32 pid; 198 depot_stack_handle_t stack; 199}; 200 | |
201#ifdef CONFIG_KASAN_GENERIC 202 203struct kasan_alloc_meta { 204 struct kasan_track alloc_track; 205 /* Free track is stored in kasan_free_meta. */ 206 depot_stack_handle_t aux_stack[2]; 207}; 208 --- 56 unchanged lines hidden (view full) --- 265 266static inline bool addr_has_metadata(const void *addr) 267{ 268 return (is_vmalloc_addr(addr) || virt_addr_valid(addr)); 269} 270 271#endif /* CONFIG_KASAN_GENERIC || CONFIG_KASAN_SW_TAGS */ 272 | 206#ifdef CONFIG_KASAN_GENERIC 207 208struct kasan_alloc_meta { 209 struct kasan_track alloc_track; 210 /* Free track is stored in kasan_free_meta. */ 211 depot_stack_handle_t aux_stack[2]; 212}; 213 --- 56 unchanged lines hidden (view full) --- 270 271static inline bool addr_has_metadata(const void *addr) 272{ 273 return (is_vmalloc_addr(addr) || virt_addr_valid(addr)); 274} 275 276#endif /* CONFIG_KASAN_GENERIC || CONFIG_KASAN_SW_TAGS */ 277 |
278void *kasan_find_first_bad_addr(void *addr, size_t size); 279void kasan_complete_mode_report_info(struct kasan_report_info *info); 280void kasan_metadata_fetch_row(char *buffer, void *row); 281 |
|
273#if defined(CONFIG_KASAN_SW_TAGS) || defined(CONFIG_KASAN_HW_TAGS) 274void kasan_print_tags(u8 addr_tag, const void *addr); 275#else 276static inline void kasan_print_tags(u8 addr_tag, const void *addr) { } 277#endif 278 | 282#if defined(CONFIG_KASAN_SW_TAGS) || defined(CONFIG_KASAN_HW_TAGS) 283void kasan_print_tags(u8 addr_tag, const void *addr); 284#else 285static inline void kasan_print_tags(u8 addr_tag, const void *addr) { } 286#endif 287 |
279void *kasan_find_first_bad_addr(void *addr, size_t size); 280const char *kasan_get_bug_type(struct kasan_report_info *info); 281void kasan_metadata_fetch_row(char *buffer, void *row); 282 | |
283#if defined(CONFIG_KASAN_STACK) 284void kasan_print_address_stack_frame(const void *addr); 285#else 286static inline void kasan_print_address_stack_frame(const void *addr) { } 287#endif 288 289#ifdef CONFIG_KASAN_GENERIC 290void kasan_print_aux_stacks(struct kmem_cache *cache, const void *object); --- 18 unchanged lines hidden (view full) --- 309static inline void kasan_init_cache_meta(struct kmem_cache *cache, unsigned int *size) { } 310static inline void kasan_init_object_meta(struct kmem_cache *cache, const void *object) { } 311#endif 312 313depot_stack_handle_t kasan_save_stack(gfp_t flags, bool can_alloc); 314void kasan_set_track(struct kasan_track *track, gfp_t flags); 315void kasan_save_alloc_info(struct kmem_cache *cache, void *object, gfp_t flags); 316void kasan_save_free_info(struct kmem_cache *cache, void *object); | 288#if defined(CONFIG_KASAN_STACK) 289void kasan_print_address_stack_frame(const void *addr); 290#else 291static inline void kasan_print_address_stack_frame(const void *addr) { } 292#endif 293 294#ifdef CONFIG_KASAN_GENERIC 295void kasan_print_aux_stacks(struct kmem_cache *cache, const void *object); --- 18 unchanged lines hidden (view full) --- 314static inline void kasan_init_cache_meta(struct kmem_cache *cache, unsigned int *size) { } 315static inline void kasan_init_object_meta(struct kmem_cache *cache, const void *object) { } 316#endif 317 318depot_stack_handle_t kasan_save_stack(gfp_t flags, bool can_alloc); 319void kasan_set_track(struct kasan_track *track, gfp_t flags); 320void kasan_save_alloc_info(struct kmem_cache *cache, void *object, gfp_t flags); 321void kasan_save_free_info(struct kmem_cache *cache, void *object); |
317struct kasan_track *kasan_get_alloc_track(struct kmem_cache *cache, 318 void *object); 319struct kasan_track *kasan_get_free_track(struct kmem_cache *cache, 320 void *object, u8 tag); | |
321 322#if defined(CONFIG_KASAN_GENERIC) && \ 323 (defined(CONFIG_SLAB) || defined(CONFIG_SLUB)) 324bool kasan_quarantine_put(struct kmem_cache *cache, void *object); 325void kasan_quarantine_reduce(void); 326void kasan_quarantine_remove_cache(struct kmem_cache *cache); 327#else 328static inline bool kasan_quarantine_put(struct kmem_cache *cache, void *object) { return false; } --- 271 unchanged lines hidden --- | 322 323#if defined(CONFIG_KASAN_GENERIC) && \ 324 (defined(CONFIG_SLAB) || defined(CONFIG_SLUB)) 325bool kasan_quarantine_put(struct kmem_cache *cache, void *object); 326void kasan_quarantine_reduce(void); 327void kasan_quarantine_remove_cache(struct kmem_cache *cache); 328#else 329static inline bool kasan_quarantine_put(struct kmem_cache *cache, void *object) { return false; } --- 271 unchanged lines hidden --- |