1d6d1731bSAleksandr Iashchenko /* SPDX-License-Identifier: BSD-2-Clause */ 2d6d1731bSAleksandr Iashchenko /* 3d6d1731bSAleksandr Iashchenko * Copyright (c) 2016, Linaro Limited 4d6d1731bSAleksandr Iashchenko */ 5d6d1731bSAleksandr Iashchenko #ifndef __ASAN_H 6d6d1731bSAleksandr Iashchenko #define __ASAN_H 7d6d1731bSAleksandr Iashchenko 8d6d1731bSAleksandr Iashchenko #include <stdint.h> 9d6d1731bSAleksandr Iashchenko 10d6d1731bSAleksandr Iashchenko #define ASAN_DATA_RED_ZONE -1 11d6d1731bSAleksandr Iashchenko #define ASAN_HEAP_RED_ZONE -2 12d6d1731bSAleksandr Iashchenko 13d6d1731bSAleksandr Iashchenko #define ASAN_BLOCK_SIZE U(8) 14d6d1731bSAleksandr Iashchenko #define ASAN_BLOCK_SHIFT U(3) 15d6d1731bSAleksandr Iashchenko #define ASAN_BLOCK_MASK (ASAN_BLOCK_SIZE - 1) 16d6d1731bSAleksandr Iashchenko 17d6d1731bSAleksandr Iashchenko #ifndef __ASSEMBLER__ 18d6d1731bSAleksandr Iashchenko #include <compiler.h> 19d6d1731bSAleksandr Iashchenko #include <string.h> 20d6d1731bSAleksandr Iashchenko #include <types_ext.h> 21d6d1731bSAleksandr Iashchenko 2260aa5df7SAleksandr Iashchenko #define ASAN_VA_REGS_MAX 32 2360aa5df7SAleksandr Iashchenko 2460aa5df7SAleksandr Iashchenko /* Represents memory mapped region */ 2560aa5df7SAleksandr Iashchenko struct asan_va_reg { 2660aa5df7SAleksandr Iashchenko vaddr_t lo; 2760aa5df7SAleksandr Iashchenko vaddr_t hi; 2860aa5df7SAleksandr Iashchenko }; 2960aa5df7SAleksandr Iashchenko 3060aa5df7SAleksandr Iashchenko /* Global structure with ASan metadata */ 3160aa5df7SAleksandr Iashchenko struct asan_global_info { 3260aa5df7SAleksandr Iashchenko /* Virtual memory regions allowed for ASan checks */ 3360aa5df7SAleksandr Iashchenko size_t regs_count; 3460aa5df7SAleksandr Iashchenko struct asan_va_reg regs[ASAN_VA_REGS_MAX]; 354cafd8a3SAleksandr Iashchenko /* Shadow memory regions */ 364cafd8a3SAleksandr Iashchenko size_t s_regs_count; 374cafd8a3SAleksandr Iashchenko struct asan_va_reg s_regs[ASAN_VA_REGS_MAX]; 3860aa5df7SAleksandr Iashchenko }; 3960aa5df7SAleksandr Iashchenko 404cafd8a3SAleksandr Iashchenko #ifdef __KERNEL__ 4160aa5df7SAleksandr Iashchenko #define GET_ASAN_INFO() (&__asan_global_info) 424cafd8a3SAleksandr Iashchenko #else 434cafd8a3SAleksandr Iashchenko #define GET_ASAN_INFO() ((struct asan_global_info *) \ 444cafd8a3SAleksandr Iashchenko (CFG_USER_ASAN_SHADOW_OFFSET - SMALL_PAGE_SIZE)) 454cafd8a3SAleksandr Iashchenko #endif 4660aa5df7SAleksandr Iashchenko 47*9f2dc7a1SAleksandr Iashchenko #if ((!defined(__KERNEL__) && !defined(__LDELF__)) && \ 48*9f2dc7a1SAleksandr Iashchenko defined(CFG_TA_SANITIZE_KADDRESS)) || \ 49*9f2dc7a1SAleksandr Iashchenko ((defined(__KERNEL__) || defined(__LDELF__)) && \ 504cafd8a3SAleksandr Iashchenko defined(CFG_CORE_SANITIZE_KADDRESS)) 514cafd8a3SAleksandr Iashchenko #define ASAN_IS_ENABLED 1 524cafd8a3SAleksandr Iashchenko #else 534cafd8a3SAleksandr Iashchenko #define ASAN_IS_ENABLED 0 544cafd8a3SAleksandr Iashchenko #endif 554cafd8a3SAleksandr Iashchenko 564cafd8a3SAleksandr Iashchenko #if ASAN_IS_ENABLED 574cafd8a3SAleksandr Iashchenko /* ASAN enabled */ 58d6d1731bSAleksandr Iashchenko typedef void (*asan_panic_cb_t)(void); 59d6d1731bSAleksandr Iashchenko 6060aa5df7SAleksandr Iashchenko void asan_add_shadowed(const void *va_begin, const void *va_end); 61d6d1731bSAleksandr Iashchenko void asan_start(void); 62d6d1731bSAleksandr Iashchenko void asan_panic(void); 63d6d1731bSAleksandr Iashchenko void asan_set_panic_cb(asan_panic_cb_t panic_cb); 64d6d1731bSAleksandr Iashchenko 65d6d1731bSAleksandr Iashchenko void asan_tag_no_access(const void *begin, const void *end); 66d6d1731bSAleksandr Iashchenko void asan_tag_access(const void *begin, const void *end); 67d6d1731bSAleksandr Iashchenko void asan_tag_heap_free(const void *begin, const void *end); 68d6d1731bSAleksandr Iashchenko void *asan_memset_unchecked(void *s, int c, size_t n); 69d6d1731bSAleksandr Iashchenko void *asan_memcpy_unchecked(void *__restrict s1, const void *__restrict s2, 70d6d1731bSAleksandr Iashchenko size_t n); 714cafd8a3SAleksandr Iashchenko int asan_user_map_shadow(void *lo, void *hi); 72d6d1731bSAleksandr Iashchenko #else 73d6d1731bSAleksandr Iashchenko static inline void asan_tag_no_access(const void *begin __unused, 74d6d1731bSAleksandr Iashchenko const void *end __unused) 75d6d1731bSAleksandr Iashchenko { 76d6d1731bSAleksandr Iashchenko } 77d6d1731bSAleksandr Iashchenko static inline void asan_tag_access(const void *begin __unused, 78d6d1731bSAleksandr Iashchenko const void *end __unused) 79d6d1731bSAleksandr Iashchenko { 80d6d1731bSAleksandr Iashchenko } 81d6d1731bSAleksandr Iashchenko static inline void asan_tag_heap_free(const void *begin __unused, 82d6d1731bSAleksandr Iashchenko const void *end __unused) 83d6d1731bSAleksandr Iashchenko { 84d6d1731bSAleksandr Iashchenko } 85d6d1731bSAleksandr Iashchenko 86d6d1731bSAleksandr Iashchenko static inline void *asan_memset_unchecked(void *s, int c, size_t n) 87d6d1731bSAleksandr Iashchenko { 88d6d1731bSAleksandr Iashchenko return memset(s, c, n); 89d6d1731bSAleksandr Iashchenko } 90d6d1731bSAleksandr Iashchenko 91d6d1731bSAleksandr Iashchenko static inline void *asan_memcpy_unchecked(void *__restrict s1, 92d6d1731bSAleksandr Iashchenko const void *__restrict s2, size_t n) 93d6d1731bSAleksandr Iashchenko { 94d6d1731bSAleksandr Iashchenko return memcpy(s1, s2, n); 95d6d1731bSAleksandr Iashchenko } 96d6d1731bSAleksandr Iashchenko 974cafd8a3SAleksandr Iashchenko static inline void asan_start(void) 984cafd8a3SAleksandr Iashchenko { 994cafd8a3SAleksandr Iashchenko } 1004cafd8a3SAleksandr Iashchenko 1014cafd8a3SAleksandr Iashchenko static inline int asan_user_map_shadow(void *lo __unused, void *hi __unused) 1024cafd8a3SAleksandr Iashchenko { 1034cafd8a3SAleksandr Iashchenko return 0; 1044cafd8a3SAleksandr Iashchenko } 1054cafd8a3SAleksandr Iashchenko #endif /* ASAN_IS_ENABLED */ 106d6d1731bSAleksandr Iashchenko 107d6d1731bSAleksandr Iashchenko #endif /*__ASSEMBLER__*/ 108d6d1731bSAleksandr Iashchenko #endif /*__ASAN_H*/ 109