15d26313cSKostya Serebryany //===-- hwasan_interface_internal.h -----------------------------*- C++ -*-===// 29595d168SEvgeniy Stepanov // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 69595d168SEvgeniy Stepanov // 79595d168SEvgeniy Stepanov //===----------------------------------------------------------------------===// 89595d168SEvgeniy Stepanov // 99595d168SEvgeniy Stepanov // This file is a part of HWAddressSanitizer. 109595d168SEvgeniy Stepanov // 119595d168SEvgeniy Stepanov // Private Hwasan interface header. 129595d168SEvgeniy Stepanov //===----------------------------------------------------------------------===// 139595d168SEvgeniy Stepanov 149595d168SEvgeniy Stepanov #ifndef HWASAN_INTERFACE_INTERNAL_H 159595d168SEvgeniy Stepanov #define HWASAN_INTERFACE_INTERNAL_H 169595d168SEvgeniy Stepanov 179595d168SEvgeniy Stepanov #include "sanitizer_common/sanitizer_internal_defs.h" 18fe4808ebSEvgeniy Stepanov #include "sanitizer_common/sanitizer_platform_limits_posix.h" 190930643fSPeter Collingbourne #include <link.h> 209595d168SEvgeniy Stepanov 219595d168SEvgeniy Stepanov extern "C" { 2279866cadSAlex Shlyapnikov 239595d168SEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 24886b7cc1SPeter Collingbourne void __hwasan_init_static(); 25c68be8d2SEvgeniy Stepanov 26c68be8d2SEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 279595d168SEvgeniy Stepanov void __hwasan_init(); 289595d168SEvgeniy Stepanov 290930643fSPeter Collingbourne SANITIZER_INTERFACE_ATTRIBUTE 300930643fSPeter Collingbourne void __hwasan_library_loaded(ElfW(Addr) base, const ElfW(Phdr) * phdr, 310930643fSPeter Collingbourne ElfW(Half) phnum); 320930643fSPeter Collingbourne 330930643fSPeter Collingbourne SANITIZER_INTERFACE_ATTRIBUTE 340930643fSPeter Collingbourne void __hwasan_library_unloaded(ElfW(Addr) base, const ElfW(Phdr) * phdr, 350930643fSPeter Collingbourne ElfW(Half) phnum); 360930643fSPeter Collingbourne 379595d168SEvgeniy Stepanov using __sanitizer::uptr; 389595d168SEvgeniy Stepanov using __sanitizer::sptr; 399595d168SEvgeniy Stepanov using __sanitizer::uu64; 409595d168SEvgeniy Stepanov using __sanitizer::uu32; 419595d168SEvgeniy Stepanov using __sanitizer::uu16; 429595d168SEvgeniy Stepanov using __sanitizer::u64; 439595d168SEvgeniy Stepanov using __sanitizer::u32; 449595d168SEvgeniy Stepanov using __sanitizer::u16; 459595d168SEvgeniy Stepanov using __sanitizer::u8; 469595d168SEvgeniy Stepanov 479595d168SEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 48af95597cSKostya Serebryany void __hwasan_init_frames(uptr, uptr); 49af95597cSKostya Serebryany 50af95597cSKostya Serebryany SANITIZER_INTERFACE_ATTRIBUTE 5179866cadSAlex Shlyapnikov extern uptr __hwasan_shadow_memory_dynamic_address; 5279866cadSAlex Shlyapnikov 5379866cadSAlex Shlyapnikov SANITIZER_INTERFACE_ATTRIBUTE 5402f7841eSAlex Shlyapnikov void __hwasan_loadN(uptr, uptr); 559595d168SEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 569595d168SEvgeniy Stepanov void __hwasan_load1(uptr); 579595d168SEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 589595d168SEvgeniy Stepanov void __hwasan_load2(uptr); 599595d168SEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 609595d168SEvgeniy Stepanov void __hwasan_load4(uptr); 619595d168SEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 629595d168SEvgeniy Stepanov void __hwasan_load8(uptr); 639595d168SEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 649595d168SEvgeniy Stepanov void __hwasan_load16(uptr); 659595d168SEvgeniy Stepanov 669595d168SEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 6702f7841eSAlex Shlyapnikov void __hwasan_loadN_noabort(uptr, uptr); 683fd1b1a7SEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 693fd1b1a7SEvgeniy Stepanov void __hwasan_load1_noabort(uptr); 703fd1b1a7SEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 713fd1b1a7SEvgeniy Stepanov void __hwasan_load2_noabort(uptr); 723fd1b1a7SEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 733fd1b1a7SEvgeniy Stepanov void __hwasan_load4_noabort(uptr); 743fd1b1a7SEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 753fd1b1a7SEvgeniy Stepanov void __hwasan_load8_noabort(uptr); 763fd1b1a7SEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 773fd1b1a7SEvgeniy Stepanov void __hwasan_load16_noabort(uptr); 783fd1b1a7SEvgeniy Stepanov 793fd1b1a7SEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 80b33dcc5bSEnna1 void __hwasan_loadN_match_all(uptr, uptr, u8); 81b33dcc5bSEnna1 SANITIZER_INTERFACE_ATTRIBUTE 82b33dcc5bSEnna1 void __hwasan_load1_match_all(uptr, u8); 83b33dcc5bSEnna1 SANITIZER_INTERFACE_ATTRIBUTE 84b33dcc5bSEnna1 void __hwasan_load2_match_all(uptr, u8); 85b33dcc5bSEnna1 SANITIZER_INTERFACE_ATTRIBUTE 86b33dcc5bSEnna1 void __hwasan_load4_match_all(uptr, u8); 87b33dcc5bSEnna1 SANITIZER_INTERFACE_ATTRIBUTE 88b33dcc5bSEnna1 void __hwasan_load8_match_all(uptr, u8); 89b33dcc5bSEnna1 SANITIZER_INTERFACE_ATTRIBUTE 90b33dcc5bSEnna1 void __hwasan_load16_match_all(uptr, u8); 91b33dcc5bSEnna1 92b33dcc5bSEnna1 SANITIZER_INTERFACE_ATTRIBUTE 93b33dcc5bSEnna1 void __hwasan_loadN_match_all_noabort(uptr, uptr, u8); 94b33dcc5bSEnna1 SANITIZER_INTERFACE_ATTRIBUTE 95b33dcc5bSEnna1 void __hwasan_load1_match_all_noabort(uptr, u8); 96b33dcc5bSEnna1 SANITIZER_INTERFACE_ATTRIBUTE 97b33dcc5bSEnna1 void __hwasan_load2_match_all_noabort(uptr, u8); 98b33dcc5bSEnna1 SANITIZER_INTERFACE_ATTRIBUTE 99b33dcc5bSEnna1 void __hwasan_load4_match_all_noabort(uptr, u8); 100b33dcc5bSEnna1 SANITIZER_INTERFACE_ATTRIBUTE 101b33dcc5bSEnna1 void __hwasan_load8_match_all_noabort(uptr, u8); 102b33dcc5bSEnna1 SANITIZER_INTERFACE_ATTRIBUTE 103b33dcc5bSEnna1 void __hwasan_load16_match_all_noabort(uptr, u8); 104b33dcc5bSEnna1 105b33dcc5bSEnna1 SANITIZER_INTERFACE_ATTRIBUTE 10602f7841eSAlex Shlyapnikov void __hwasan_storeN(uptr, uptr); 1079595d168SEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 1089595d168SEvgeniy Stepanov void __hwasan_store1(uptr); 1099595d168SEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 1109595d168SEvgeniy Stepanov void __hwasan_store2(uptr); 1119595d168SEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 1129595d168SEvgeniy Stepanov void __hwasan_store4(uptr); 1139595d168SEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 1149595d168SEvgeniy Stepanov void __hwasan_store8(uptr); 1159595d168SEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 1169595d168SEvgeniy Stepanov void __hwasan_store16(uptr); 1179595d168SEvgeniy Stepanov 1183fd1b1a7SEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 11902f7841eSAlex Shlyapnikov void __hwasan_storeN_noabort(uptr, uptr); 1203fd1b1a7SEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 1213fd1b1a7SEvgeniy Stepanov void __hwasan_store1_noabort(uptr); 1223fd1b1a7SEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 1233fd1b1a7SEvgeniy Stepanov void __hwasan_store2_noabort(uptr); 1243fd1b1a7SEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 1253fd1b1a7SEvgeniy Stepanov void __hwasan_store4_noabort(uptr); 1263fd1b1a7SEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 1273fd1b1a7SEvgeniy Stepanov void __hwasan_store8_noabort(uptr); 1283fd1b1a7SEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 1293fd1b1a7SEvgeniy Stepanov void __hwasan_store16_noabort(uptr); 1303fd1b1a7SEvgeniy Stepanov 13199fa3e77SEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 132b33dcc5bSEnna1 void __hwasan_storeN_match_all(uptr, uptr, u8); 133b33dcc5bSEnna1 SANITIZER_INTERFACE_ATTRIBUTE 134b33dcc5bSEnna1 void __hwasan_store1_match_all(uptr, u8); 135b33dcc5bSEnna1 SANITIZER_INTERFACE_ATTRIBUTE 136b33dcc5bSEnna1 void __hwasan_store2_match_all(uptr, u8); 137b33dcc5bSEnna1 SANITIZER_INTERFACE_ATTRIBUTE 138b33dcc5bSEnna1 void __hwasan_store4_match_all(uptr, u8); 139b33dcc5bSEnna1 SANITIZER_INTERFACE_ATTRIBUTE 140b33dcc5bSEnna1 void __hwasan_store8_match_all(uptr, u8); 141b33dcc5bSEnna1 SANITIZER_INTERFACE_ATTRIBUTE 142b33dcc5bSEnna1 void __hwasan_store16_match_all(uptr, u8); 143b33dcc5bSEnna1 144b33dcc5bSEnna1 SANITIZER_INTERFACE_ATTRIBUTE 145b33dcc5bSEnna1 void __hwasan_storeN_match_all_noabort(uptr, uptr, u8); 146b33dcc5bSEnna1 SANITIZER_INTERFACE_ATTRIBUTE 147b33dcc5bSEnna1 void __hwasan_store1_match_all_noabort(uptr, u8); 148b33dcc5bSEnna1 SANITIZER_INTERFACE_ATTRIBUTE 149b33dcc5bSEnna1 void __hwasan_store2_match_all_noabort(uptr, u8); 150b33dcc5bSEnna1 SANITIZER_INTERFACE_ATTRIBUTE 151b33dcc5bSEnna1 void __hwasan_store4_match_all_noabort(uptr, u8); 152b33dcc5bSEnna1 SANITIZER_INTERFACE_ATTRIBUTE 153b33dcc5bSEnna1 void __hwasan_store8_match_all_noabort(uptr, u8); 154b33dcc5bSEnna1 SANITIZER_INTERFACE_ATTRIBUTE 155b33dcc5bSEnna1 void __hwasan_store16_match_all_noabort(uptr, u8); 156b33dcc5bSEnna1 157b33dcc5bSEnna1 SANITIZER_INTERFACE_ATTRIBUTE 15899fa3e77SEvgeniy Stepanov void __hwasan_tag_memory(uptr p, u8 tag, uptr sz); 15999fa3e77SEvgeniy Stepanov 160080e0d40SEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 161a265a13bSEvgeniy Stepanov uptr __hwasan_tag_pointer(uptr p, u8 tag); 162a265a13bSEvgeniy Stepanov 163a265a13bSEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 164*64fa90bfSVitaly Buka u8 __hwasan_get_tag_from_pointer(uptr p); 165*64fa90bfSVitaly Buka 166*64fa90bfSVitaly Buka SANITIZER_INTERFACE_ATTRIBUTE 167790edbc1SMitch Phillips void __hwasan_tag_mismatch(uptr addr, u8 ts); 168790edbc1SMitch Phillips 169790edbc1SMitch Phillips SANITIZER_INTERFACE_ATTRIBUTE 1706d11abfeSDavid Tellenbach void __hwasan_tag_mismatch4(uptr addr, uptr access_info, uptr *registers_frame, 1716d11abfeSDavid Tellenbach size_t outsize); 1726d11abfeSDavid Tellenbach 1736d11abfeSDavid Tellenbach SANITIZER_INTERFACE_ATTRIBUTE 174080e0d40SEvgeniy Stepanov u8 __hwasan_generate_tag(); 175080e0d40SEvgeniy Stepanov 1769595d168SEvgeniy Stepanov // Returns the offset of the first tag mismatch or -1 if the whole range is 1779595d168SEvgeniy Stepanov // good. 1789595d168SEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 1799595d168SEvgeniy Stepanov sptr __hwasan_test_shadow(const void *x, uptr size); 1809595d168SEvgeniy Stepanov 1819595d168SEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE 1829595d168SEvgeniy Stepanov /* OPTIONAL */ const char* __hwasan_default_options(); 1839595d168SEvgeniy Stepanov 1849595d168SEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 1859595d168SEvgeniy Stepanov void __hwasan_print_shadow(const void *x, uptr size); 1869595d168SEvgeniy Stepanov 1879595d168SEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 18837fb8965SEvgeniy Stepanov void __hwasan_handle_longjmp(const void *sp_dst); 18937fb8965SEvgeniy Stepanov 19037fb8965SEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 191f46a52b5SEvgeniy Stepanov void __hwasan_handle_vfork(const void *sp_dst); 192f46a52b5SEvgeniy Stepanov 193f46a52b5SEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 1949595d168SEvgeniy Stepanov u16 __sanitizer_unaligned_load16(const uu16 *p); 1959595d168SEvgeniy Stepanov 1969595d168SEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 1979595d168SEvgeniy Stepanov u32 __sanitizer_unaligned_load32(const uu32 *p); 1989595d168SEvgeniy Stepanov 1999595d168SEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 2009595d168SEvgeniy Stepanov u64 __sanitizer_unaligned_load64(const uu64 *p); 2019595d168SEvgeniy Stepanov 2029595d168SEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 2039595d168SEvgeniy Stepanov void __sanitizer_unaligned_store16(uu16 *p, u16 x); 2049595d168SEvgeniy Stepanov 2059595d168SEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 2069595d168SEvgeniy Stepanov void __sanitizer_unaligned_store32(uu32 *p, u32 x); 2079595d168SEvgeniy Stepanov 2089595d168SEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 2099595d168SEvgeniy Stepanov void __sanitizer_unaligned_store64(uu64 *p, u64 x); 2109595d168SEvgeniy Stepanov 2119595d168SEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 2129595d168SEvgeniy Stepanov void __hwasan_enable_allocator_tagging(); 2139595d168SEvgeniy Stepanov 2149595d168SEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 2159595d168SEvgeniy Stepanov void __hwasan_disable_allocator_tagging(); 2169595d168SEvgeniy Stepanov 2174f0e10ffSEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 2184f0e10ffSEvgeniy Stepanov void __hwasan_thread_enter(); 2194f0e10ffSEvgeniy Stepanov 2204f0e10ffSEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 2214f0e10ffSEvgeniy Stepanov void __hwasan_thread_exit(); 2224f0e10ffSEvgeniy Stepanov 223950a1a39SKostya Serebryany SANITIZER_INTERFACE_ATTRIBUTE 224950a1a39SKostya Serebryany void __hwasan_print_memory_usage(); 225950a1a39SKostya Serebryany 22621f72c05SLeonard Chan // The compiler will generate this when 22721f72c05SLeonard Chan // `-hwasan-record-stack-history-with-calls` is added as a flag, which will add 22821f72c05SLeonard Chan // frame record information to the stack ring buffer. This is an alternative to 22921f72c05SLeonard Chan // the compiler emitting instructions in the prologue for doing the same thing 23021f72c05SLeonard Chan // by accessing the ring buffer directly. 23121f72c05SLeonard Chan SANITIZER_INTERFACE_ATTRIBUTE 23221f72c05SLeonard Chan void __hwasan_add_frame_record(u64 frame_record_info); 23321f72c05SLeonard Chan 234fe4808ebSEvgeniy Stepanov SANITIZER_INTERFACE_ATTRIBUTE 235d3bd6148SEugene Leviant void *__hwasan_memcpy(void *dst, const void *src, uptr size); 236d3bd6148SEugene Leviant SANITIZER_INTERFACE_ATTRIBUTE 237d3bd6148SEugene Leviant void *__hwasan_memset(void *s, int c, uptr n); 238d3bd6148SEugene Leviant SANITIZER_INTERFACE_ATTRIBUTE 239d3bd6148SEugene Leviant void *__hwasan_memmove(void *dest, const void *src, uptr n); 24008d90f72SEvgenii Stepanov 24108d90f72SEvgenii Stepanov SANITIZER_INTERFACE_ATTRIBUTE 242ba13e1b4SEnna1 void *__hwasan_memcpy_match_all(void *dst, const void *src, uptr size, u8); 243ba13e1b4SEnna1 SANITIZER_INTERFACE_ATTRIBUTE 244ba13e1b4SEnna1 void *__hwasan_memset_match_all(void *s, int c, uptr n, u8); 245ba13e1b4SEnna1 SANITIZER_INTERFACE_ATTRIBUTE 246ba13e1b4SEnna1 void *__hwasan_memmove_match_all(void *dest, const void *src, uptr n, u8); 247ba13e1b4SEnna1 248ba13e1b4SEnna1 SANITIZER_INTERFACE_ATTRIBUTE 24908d90f72SEvgenii Stepanov void __hwasan_set_error_report_callback(void (*callback)(const char *)); 2509595d168SEvgeniy Stepanov } // extern "C" 2519595d168SEvgeniy Stepanov 2529595d168SEvgeniy Stepanov #endif // HWASAN_INTERFACE_INTERNAL_H 253