11bb92983SJerome Forissier /* SPDX-License-Identifier: BSD-2-Clause */
21d171f95SJens Wiklander /*
31d171f95SJens Wiklander * Copyright (c) 2016, Linaro Limited
41d171f95SJens Wiklander */
51d171f95SJens Wiklander #ifndef __KERNEL_ASAN_H
61d171f95SJens Wiklander #define __KERNEL_ASAN_H
71d171f95SJens Wiklander
8b4bfc9a9SJens Wiklander #include <stdint.h>
91d171f95SJens Wiklander
101d171f95SJens Wiklander #define ASAN_DATA_RED_ZONE -1
111d171f95SJens Wiklander #define ASAN_HEAP_RED_ZONE -2
121d171f95SJens Wiklander
13b4bfc9a9SJens Wiklander #define ASAN_BLOCK_SIZE U(8)
14b4bfc9a9SJens Wiklander #define ASAN_BLOCK_SHIFT U(3)
151d171f95SJens Wiklander #define ASAN_BLOCK_MASK (ASAN_BLOCK_SIZE - 1)
161d171f95SJens Wiklander
17757331fcSJens Wiklander #ifndef __ASSEMBLER__
18555bde4bSJens Wiklander #include <compiler.h>
19abccd909SJens Wiklander #include <string.h>
201d171f95SJens Wiklander #include <types_ext.h>
211d171f95SJens Wiklander
22*c9c847d5SAleksandr Iashchenko typedef void (*asan_panic_cb_t)(void);
23*c9c847d5SAleksandr Iashchenko
24bce4951cSJens Wiklander void asan_set_shadowed(const void *va_begin, const void *va_end);
251d171f95SJens Wiklander void asan_start(void);
26*c9c847d5SAleksandr Iashchenko void asan_panic(void);
27*c9c847d5SAleksandr Iashchenko void asan_set_panic_cb(asan_panic_cb_t panic_cb);
281d171f95SJens Wiklander
291d171f95SJens Wiklander #ifdef CFG_CORE_SANITIZE_KADDRESS
30bce4951cSJens Wiklander void asan_tag_no_access(const void *begin, const void *end);
31bce4951cSJens Wiklander void asan_tag_access(const void *begin, const void *end);
32bce4951cSJens Wiklander void asan_tag_heap_free(const void *begin, const void *end);
33abccd909SJens Wiklander void *asan_memset_unchecked(void *s, int c, size_t n);
3406fe4216SJens Wiklander void *asan_memcpy_unchecked(void *__restrict s1, const void *__restrict s2,
3506fe4216SJens Wiklander size_t n);
361d171f95SJens Wiklander #else
asan_tag_no_access(const void * begin __unused,const void * end __unused)37bce4951cSJens Wiklander static inline void asan_tag_no_access(const void *begin __unused,
38bce4951cSJens Wiklander const void *end __unused)
391d171f95SJens Wiklander {
401d171f95SJens Wiklander }
asan_tag_access(const void * begin __unused,const void * end __unused)41bce4951cSJens Wiklander static inline void asan_tag_access(const void *begin __unused,
42bce4951cSJens Wiklander const void *end __unused)
431d171f95SJens Wiklander {
441d171f95SJens Wiklander }
asan_tag_heap_free(const void * begin __unused,const void * end __unused)45bce4951cSJens Wiklander static inline void asan_tag_heap_free(const void *begin __unused,
46bce4951cSJens Wiklander const void *end __unused)
471d171f95SJens Wiklander {
481d171f95SJens Wiklander }
49abccd909SJens Wiklander
asan_memset_unchecked(void * s,int c,size_t n)50abccd909SJens Wiklander static inline void *asan_memset_unchecked(void *s, int c, size_t n)
51abccd909SJens Wiklander {
52abccd909SJens Wiklander return memset(s, c, n);
53abccd909SJens Wiklander }
54abccd909SJens Wiklander
asan_memcpy_unchecked(void * __restrict s1,const void * __restrict s2,size_t n)5506fe4216SJens Wiklander static inline void *asan_memcpy_unchecked(void *__restrict s1,
5606fe4216SJens Wiklander const void *__restrict s2, size_t n)
5706fe4216SJens Wiklander {
5806fe4216SJens Wiklander return memcpy(s1, s2, n);
5906fe4216SJens Wiklander }
6006fe4216SJens Wiklander
611d171f95SJens Wiklander #endif
621d171f95SJens Wiklander
63757331fcSJens Wiklander #endif /*__ASSEMBLER__*/
641d171f95SJens Wiklander #endif /*__KERNEL_ASAN_H*/
65