]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - mm/kasan/kasan.h
mm, kasan: stackdepot implementation. Enable stackdepot for SLAB
[mirror_ubuntu-artful-kernel.git] / mm / kasan / kasan.h
index 4f6c62e5c21edd2d800484b2f18025e45ce034fb..30a2f0ba0e097e0b270f58be50bcd7ff7e4177fa 100644 (file)
@@ -2,6 +2,7 @@
 #define __MM_KASAN_KASAN_H
 
 #include <linux/kasan.h>
+#include <linux/stackdepot.h>
 
 #define KASAN_SHADOW_SCALE_SIZE (1UL << KASAN_SHADOW_SCALE_SHIFT)
 #define KASAN_SHADOW_MASK       (KASAN_SHADOW_SCALE_SIZE - 1)
@@ -54,6 +55,42 @@ struct kasan_global {
 #endif
 };
 
+/**
+ * Structures to keep alloc and free tracks *
+ */
+
+enum kasan_state {
+       KASAN_STATE_INIT,
+       KASAN_STATE_ALLOC,
+       KASAN_STATE_FREE
+};
+
+#define KASAN_STACK_DEPTH 64
+
+struct kasan_track {
+       u32 pid;
+       depot_stack_handle_t stack;
+};
+
+struct kasan_alloc_meta {
+       struct kasan_track track;
+       u32 state : 2;  /* enum kasan_state */
+       u32 alloc_size : 30;
+       u32 reserved;
+};
+
+struct kasan_free_meta {
+       /* Allocator freelist pointer, unused by KASAN. */
+       void **freelist;
+       struct kasan_track track;
+};
+
+struct kasan_alloc_meta *get_alloc_info(struct kmem_cache *cache,
+                                       const void *object);
+struct kasan_free_meta *get_free_info(struct kmem_cache *cache,
+                                       const void *object);
+
+
 static inline const void *kasan_shadow_to_mem(const void *shadow_addr)
 {
        return (void *)(((unsigned long)shadow_addr - KASAN_SHADOW_OFFSET)