13cab2bb3Spatrick //===-- hwasan_interface_internal.h -----------------------------*- C++ -*-===// 23cab2bb3Spatrick // 33cab2bb3Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 43cab2bb3Spatrick // See https://llvm.org/LICENSE.txt for license information. 53cab2bb3Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 63cab2bb3Spatrick // 73cab2bb3Spatrick //===----------------------------------------------------------------------===// 83cab2bb3Spatrick // 93cab2bb3Spatrick // This file is a part of HWAddressSanitizer. 103cab2bb3Spatrick // 113cab2bb3Spatrick // Private Hwasan interface header. 123cab2bb3Spatrick //===----------------------------------------------------------------------===// 133cab2bb3Spatrick 143cab2bb3Spatrick #ifndef HWASAN_INTERFACE_INTERNAL_H 153cab2bb3Spatrick #define HWASAN_INTERFACE_INTERNAL_H 163cab2bb3Spatrick 173cab2bb3Spatrick #include "sanitizer_common/sanitizer_internal_defs.h" 183cab2bb3Spatrick #include "sanitizer_common/sanitizer_platform_limits_posix.h" 193cab2bb3Spatrick #include <link.h> 203cab2bb3Spatrick 213cab2bb3Spatrick extern "C" { 223cab2bb3Spatrick 233cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 243cab2bb3Spatrick void __hwasan_init_static(); 253cab2bb3Spatrick 263cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 273cab2bb3Spatrick void __hwasan_init(); 283cab2bb3Spatrick 293cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 303cab2bb3Spatrick void __hwasan_library_loaded(ElfW(Addr) base, const ElfW(Phdr) * phdr, 313cab2bb3Spatrick ElfW(Half) phnum); 323cab2bb3Spatrick 333cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 343cab2bb3Spatrick void __hwasan_library_unloaded(ElfW(Addr) base, const ElfW(Phdr) * phdr, 353cab2bb3Spatrick ElfW(Half) phnum); 363cab2bb3Spatrick 373cab2bb3Spatrick using __sanitizer::uptr; 383cab2bb3Spatrick using __sanitizer::sptr; 393cab2bb3Spatrick using __sanitizer::uu64; 403cab2bb3Spatrick using __sanitizer::uu32; 413cab2bb3Spatrick using __sanitizer::uu16; 423cab2bb3Spatrick using __sanitizer::u64; 433cab2bb3Spatrick using __sanitizer::u32; 443cab2bb3Spatrick using __sanitizer::u16; 453cab2bb3Spatrick using __sanitizer::u8; 463cab2bb3Spatrick 473cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 483cab2bb3Spatrick void __hwasan_init_frames(uptr, uptr); 493cab2bb3Spatrick 503cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 513cab2bb3Spatrick extern uptr __hwasan_shadow_memory_dynamic_address; 523cab2bb3Spatrick 533cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 543cab2bb3Spatrick void __hwasan_loadN(uptr, uptr); 553cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 563cab2bb3Spatrick void __hwasan_load1(uptr); 573cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 583cab2bb3Spatrick void __hwasan_load2(uptr); 593cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 603cab2bb3Spatrick void __hwasan_load4(uptr); 613cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 623cab2bb3Spatrick void __hwasan_load8(uptr); 633cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 643cab2bb3Spatrick void __hwasan_load16(uptr); 653cab2bb3Spatrick 663cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 673cab2bb3Spatrick void __hwasan_loadN_noabort(uptr, uptr); 683cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 693cab2bb3Spatrick void __hwasan_load1_noabort(uptr); 703cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 713cab2bb3Spatrick void __hwasan_load2_noabort(uptr); 723cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 733cab2bb3Spatrick void __hwasan_load4_noabort(uptr); 743cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 753cab2bb3Spatrick void __hwasan_load8_noabort(uptr); 763cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 773cab2bb3Spatrick void __hwasan_load16_noabort(uptr); 783cab2bb3Spatrick 793cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 803cab2bb3Spatrick void __hwasan_storeN(uptr, uptr); 813cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 823cab2bb3Spatrick void __hwasan_store1(uptr); 833cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 843cab2bb3Spatrick void __hwasan_store2(uptr); 853cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 863cab2bb3Spatrick void __hwasan_store4(uptr); 873cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 883cab2bb3Spatrick void __hwasan_store8(uptr); 893cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 903cab2bb3Spatrick void __hwasan_store16(uptr); 913cab2bb3Spatrick 923cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 933cab2bb3Spatrick void __hwasan_storeN_noabort(uptr, uptr); 943cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 953cab2bb3Spatrick void __hwasan_store1_noabort(uptr); 963cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 973cab2bb3Spatrick void __hwasan_store2_noabort(uptr); 983cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 993cab2bb3Spatrick void __hwasan_store4_noabort(uptr); 1003cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 1013cab2bb3Spatrick void __hwasan_store8_noabort(uptr); 1023cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 1033cab2bb3Spatrick void __hwasan_store16_noabort(uptr); 1043cab2bb3Spatrick 1053cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 1063cab2bb3Spatrick void __hwasan_tag_memory(uptr p, u8 tag, uptr sz); 1073cab2bb3Spatrick 1083cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 1093cab2bb3Spatrick uptr __hwasan_tag_pointer(uptr p, u8 tag); 1103cab2bb3Spatrick 1113cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 1123cab2bb3Spatrick void __hwasan_tag_mismatch(uptr addr, u8 ts); 1133cab2bb3Spatrick 1143cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 1153cab2bb3Spatrick void __hwasan_tag_mismatch4(uptr addr, uptr access_info, uptr *registers_frame, 1163cab2bb3Spatrick size_t outsize); 1173cab2bb3Spatrick 1183cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 1193cab2bb3Spatrick u8 __hwasan_generate_tag(); 1203cab2bb3Spatrick 1213cab2bb3Spatrick // Returns the offset of the first tag mismatch or -1 if the whole range is 1223cab2bb3Spatrick // good. 1233cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 1243cab2bb3Spatrick sptr __hwasan_test_shadow(const void *x, uptr size); 1253cab2bb3Spatrick 1263cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE 1273cab2bb3Spatrick /* OPTIONAL */ const char* __hwasan_default_options(); 1283cab2bb3Spatrick 1293cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 1303cab2bb3Spatrick void __hwasan_print_shadow(const void *x, uptr size); 1313cab2bb3Spatrick 1323cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 1333cab2bb3Spatrick void __hwasan_handle_longjmp(const void *sp_dst); 1343cab2bb3Spatrick 1353cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 1363cab2bb3Spatrick void __hwasan_handle_vfork(const void *sp_dst); 1373cab2bb3Spatrick 1383cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 1393cab2bb3Spatrick u16 __sanitizer_unaligned_load16(const uu16 *p); 1403cab2bb3Spatrick 1413cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 1423cab2bb3Spatrick u32 __sanitizer_unaligned_load32(const uu32 *p); 1433cab2bb3Spatrick 1443cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 1453cab2bb3Spatrick u64 __sanitizer_unaligned_load64(const uu64 *p); 1463cab2bb3Spatrick 1473cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 1483cab2bb3Spatrick void __sanitizer_unaligned_store16(uu16 *p, u16 x); 1493cab2bb3Spatrick 1503cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 1513cab2bb3Spatrick void __sanitizer_unaligned_store32(uu32 *p, u32 x); 1523cab2bb3Spatrick 1533cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 1543cab2bb3Spatrick void __sanitizer_unaligned_store64(uu64 *p, u64 x); 1553cab2bb3Spatrick 1563cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 1573cab2bb3Spatrick void __hwasan_enable_allocator_tagging(); 1583cab2bb3Spatrick 1593cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 1603cab2bb3Spatrick void __hwasan_disable_allocator_tagging(); 1613cab2bb3Spatrick 1623cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 1633cab2bb3Spatrick void __hwasan_thread_enter(); 1643cab2bb3Spatrick 1653cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 1663cab2bb3Spatrick void __hwasan_thread_exit(); 1673cab2bb3Spatrick 1683cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 1693cab2bb3Spatrick void __hwasan_print_memory_usage(); 1703cab2bb3Spatrick 171*810390e3Srobert // The compiler will generate this when 172*810390e3Srobert // `-hwasan-record-stack-history-with-calls` is added as a flag, which will add 173*810390e3Srobert // frame record information to the stack ring buffer. This is an alternative to 174*810390e3Srobert // the compiler emitting instructions in the prologue for doing the same thing 175*810390e3Srobert // by accessing the ring buffer directly. 1763cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 177*810390e3Srobert void __hwasan_add_frame_record(u64 frame_record_info); 1783cab2bb3Spatrick 1793cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 1803cab2bb3Spatrick void *__hwasan_memcpy(void *dst, const void *src, uptr size); 1813cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 1823cab2bb3Spatrick void *__hwasan_memset(void *s, int c, uptr n); 1833cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 1843cab2bb3Spatrick void *__hwasan_memmove(void *dest, const void *src, uptr n); 185d89ec533Spatrick 186d89ec533Spatrick SANITIZER_INTERFACE_ATTRIBUTE 187d89ec533Spatrick void __hwasan_set_error_report_callback(void (*callback)(const char *)); 1883cab2bb3Spatrick } // extern "C" 1893cab2bb3Spatrick 1903cab2bb3Spatrick #endif // HWASAN_INTERFACE_INTERNAL_H 191