10b57cec5SDimitry Andric //===-- hwasan_interface_internal.h -----------------------------*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric // This file is a part of HWAddressSanitizer.
100b57cec5SDimitry Andric //
110b57cec5SDimitry Andric // Private Hwasan interface header.
120b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
130b57cec5SDimitry Andric 
140b57cec5SDimitry Andric #ifndef HWASAN_INTERFACE_INTERNAL_H
150b57cec5SDimitry Andric #define HWASAN_INTERFACE_INTERNAL_H
160b57cec5SDimitry Andric 
170b57cec5SDimitry Andric #include "sanitizer_common/sanitizer_internal_defs.h"
180b57cec5SDimitry Andric #include "sanitizer_common/sanitizer_platform_limits_posix.h"
1968d75effSDimitry Andric #include <link.h>
200b57cec5SDimitry Andric 
210b57cec5SDimitry Andric extern "C" {
220b57cec5SDimitry Andric 
230b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
240b57cec5SDimitry Andric void __hwasan_init_static();
250b57cec5SDimitry Andric 
260b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
270b57cec5SDimitry Andric void __hwasan_init();
280b57cec5SDimitry Andric 
2968d75effSDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
3068d75effSDimitry Andric void __hwasan_library_loaded(ElfW(Addr) base, const ElfW(Phdr) * phdr,
3168d75effSDimitry Andric                              ElfW(Half) phnum);
3268d75effSDimitry Andric 
3368d75effSDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
3468d75effSDimitry Andric void __hwasan_library_unloaded(ElfW(Addr) base, const ElfW(Phdr) * phdr,
3568d75effSDimitry Andric                                ElfW(Half) phnum);
3668d75effSDimitry Andric 
370b57cec5SDimitry Andric using __sanitizer::uptr;
380b57cec5SDimitry Andric using __sanitizer::sptr;
390b57cec5SDimitry Andric using __sanitizer::uu64;
400b57cec5SDimitry Andric using __sanitizer::uu32;
410b57cec5SDimitry Andric using __sanitizer::uu16;
420b57cec5SDimitry Andric using __sanitizer::u64;
430b57cec5SDimitry Andric using __sanitizer::u32;
440b57cec5SDimitry Andric using __sanitizer::u16;
450b57cec5SDimitry Andric using __sanitizer::u8;
460b57cec5SDimitry Andric 
470b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
480b57cec5SDimitry Andric void __hwasan_init_frames(uptr, uptr);
490b57cec5SDimitry Andric 
500b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
510b57cec5SDimitry Andric extern uptr __hwasan_shadow_memory_dynamic_address;
520b57cec5SDimitry Andric 
530b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
540b57cec5SDimitry Andric void __hwasan_loadN(uptr, uptr);
550b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
560b57cec5SDimitry Andric void __hwasan_load1(uptr);
570b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
580b57cec5SDimitry Andric void __hwasan_load2(uptr);
590b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
600b57cec5SDimitry Andric void __hwasan_load4(uptr);
610b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
620b57cec5SDimitry Andric void __hwasan_load8(uptr);
630b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
640b57cec5SDimitry Andric void __hwasan_load16(uptr);
650b57cec5SDimitry Andric 
660b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
670b57cec5SDimitry Andric void __hwasan_loadN_noabort(uptr, uptr);
680b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
690b57cec5SDimitry Andric void __hwasan_load1_noabort(uptr);
700b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
710b57cec5SDimitry Andric void __hwasan_load2_noabort(uptr);
720b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
730b57cec5SDimitry Andric void __hwasan_load4_noabort(uptr);
740b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
750b57cec5SDimitry Andric void __hwasan_load8_noabort(uptr);
760b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
770b57cec5SDimitry Andric void __hwasan_load16_noabort(uptr);
780b57cec5SDimitry Andric 
790b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
8006c3fb27SDimitry Andric void __hwasan_loadN_match_all(uptr, uptr, u8);
8106c3fb27SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
8206c3fb27SDimitry Andric void __hwasan_load1_match_all(uptr, u8);
8306c3fb27SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
8406c3fb27SDimitry Andric void __hwasan_load2_match_all(uptr, u8);
8506c3fb27SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
8606c3fb27SDimitry Andric void __hwasan_load4_match_all(uptr, u8);
8706c3fb27SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
8806c3fb27SDimitry Andric void __hwasan_load8_match_all(uptr, u8);
8906c3fb27SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
9006c3fb27SDimitry Andric void __hwasan_load16_match_all(uptr, u8);
9106c3fb27SDimitry Andric 
9206c3fb27SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
9306c3fb27SDimitry Andric void __hwasan_loadN_match_all_noabort(uptr, uptr, u8);
9406c3fb27SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
9506c3fb27SDimitry Andric void __hwasan_load1_match_all_noabort(uptr, u8);
9606c3fb27SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
9706c3fb27SDimitry Andric void __hwasan_load2_match_all_noabort(uptr, u8);
9806c3fb27SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
9906c3fb27SDimitry Andric void __hwasan_load4_match_all_noabort(uptr, u8);
10006c3fb27SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
10106c3fb27SDimitry Andric void __hwasan_load8_match_all_noabort(uptr, u8);
10206c3fb27SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
10306c3fb27SDimitry Andric void __hwasan_load16_match_all_noabort(uptr, u8);
10406c3fb27SDimitry Andric 
10506c3fb27SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
1060b57cec5SDimitry Andric void __hwasan_storeN(uptr, uptr);
1070b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
1080b57cec5SDimitry Andric void __hwasan_store1(uptr);
1090b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
1100b57cec5SDimitry Andric void __hwasan_store2(uptr);
1110b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
1120b57cec5SDimitry Andric void __hwasan_store4(uptr);
1130b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
1140b57cec5SDimitry Andric void __hwasan_store8(uptr);
1150b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
1160b57cec5SDimitry Andric void __hwasan_store16(uptr);
1170b57cec5SDimitry Andric 
1180b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
1190b57cec5SDimitry Andric void __hwasan_storeN_noabort(uptr, uptr);
1200b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
1210b57cec5SDimitry Andric void __hwasan_store1_noabort(uptr);
1220b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
1230b57cec5SDimitry Andric void __hwasan_store2_noabort(uptr);
1240b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
1250b57cec5SDimitry Andric void __hwasan_store4_noabort(uptr);
1260b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
1270b57cec5SDimitry Andric void __hwasan_store8_noabort(uptr);
1280b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
1290b57cec5SDimitry Andric void __hwasan_store16_noabort(uptr);
1300b57cec5SDimitry Andric 
1310b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
13206c3fb27SDimitry Andric void __hwasan_storeN_match_all(uptr, uptr, u8);
13306c3fb27SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
13406c3fb27SDimitry Andric void __hwasan_store1_match_all(uptr, u8);
13506c3fb27SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
13606c3fb27SDimitry Andric void __hwasan_store2_match_all(uptr, u8);
13706c3fb27SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
13806c3fb27SDimitry Andric void __hwasan_store4_match_all(uptr, u8);
13906c3fb27SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
14006c3fb27SDimitry Andric void __hwasan_store8_match_all(uptr, u8);
14106c3fb27SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
14206c3fb27SDimitry Andric void __hwasan_store16_match_all(uptr, u8);
14306c3fb27SDimitry Andric 
14406c3fb27SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
14506c3fb27SDimitry Andric void __hwasan_storeN_match_all_noabort(uptr, uptr, u8);
14606c3fb27SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
14706c3fb27SDimitry Andric void __hwasan_store1_match_all_noabort(uptr, u8);
14806c3fb27SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
14906c3fb27SDimitry Andric void __hwasan_store2_match_all_noabort(uptr, u8);
15006c3fb27SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
15106c3fb27SDimitry Andric void __hwasan_store4_match_all_noabort(uptr, u8);
15206c3fb27SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
15306c3fb27SDimitry Andric void __hwasan_store8_match_all_noabort(uptr, u8);
15406c3fb27SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
15506c3fb27SDimitry Andric void __hwasan_store16_match_all_noabort(uptr, u8);
15606c3fb27SDimitry Andric 
15706c3fb27SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
1580b57cec5SDimitry Andric void __hwasan_tag_memory(uptr p, u8 tag, uptr sz);
1590b57cec5SDimitry Andric 
1600b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
1610b57cec5SDimitry Andric uptr __hwasan_tag_pointer(uptr p, u8 tag);
1620b57cec5SDimitry Andric 
1630b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
1645f757f3fSDimitry Andric u8 __hwasan_get_tag_from_pointer(uptr p);
1655f757f3fSDimitry Andric 
1665f757f3fSDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
1670b57cec5SDimitry Andric void __hwasan_tag_mismatch(uptr addr, u8 ts);
1680b57cec5SDimitry Andric 
1690b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
170480093f4SDimitry Andric void __hwasan_tag_mismatch4(uptr addr, uptr access_info, uptr *registers_frame,
171480093f4SDimitry Andric                             size_t outsize);
172480093f4SDimitry Andric 
173480093f4SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
1740b57cec5SDimitry Andric u8 __hwasan_generate_tag();
1750b57cec5SDimitry Andric 
1760b57cec5SDimitry Andric // Returns the offset of the first tag mismatch or -1 if the whole range is
1770b57cec5SDimitry Andric // good.
1780b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
1790b57cec5SDimitry Andric sptr __hwasan_test_shadow(const void *x, uptr size);
1800b57cec5SDimitry Andric 
1810b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE
1820b57cec5SDimitry Andric /* OPTIONAL */ const char* __hwasan_default_options();
1830b57cec5SDimitry Andric 
1840b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
1850b57cec5SDimitry Andric void __hwasan_print_shadow(const void *x, uptr size);
1860b57cec5SDimitry Andric 
1870b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
1880b57cec5SDimitry Andric void __hwasan_handle_longjmp(const void *sp_dst);
1890b57cec5SDimitry Andric 
1900b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
1910b57cec5SDimitry Andric void __hwasan_handle_vfork(const void *sp_dst);
1920b57cec5SDimitry Andric 
1930b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
1940b57cec5SDimitry Andric u16 __sanitizer_unaligned_load16(const uu16 *p);
1950b57cec5SDimitry Andric 
1960b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
1970b57cec5SDimitry Andric u32 __sanitizer_unaligned_load32(const uu32 *p);
1980b57cec5SDimitry Andric 
1990b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
2000b57cec5SDimitry Andric u64 __sanitizer_unaligned_load64(const uu64 *p);
2010b57cec5SDimitry Andric 
2020b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
2030b57cec5SDimitry Andric void __sanitizer_unaligned_store16(uu16 *p, u16 x);
2040b57cec5SDimitry Andric 
2050b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
2060b57cec5SDimitry Andric void __sanitizer_unaligned_store32(uu32 *p, u32 x);
2070b57cec5SDimitry Andric 
2080b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
2090b57cec5SDimitry Andric void __sanitizer_unaligned_store64(uu64 *p, u64 x);
2100b57cec5SDimitry Andric 
2110b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
2120b57cec5SDimitry Andric void __hwasan_enable_allocator_tagging();
2130b57cec5SDimitry Andric 
2140b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
2150b57cec5SDimitry Andric void __hwasan_disable_allocator_tagging();
2160b57cec5SDimitry Andric 
2170b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
2180b57cec5SDimitry Andric void __hwasan_thread_enter();
2190b57cec5SDimitry Andric 
2200b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
2210b57cec5SDimitry Andric void __hwasan_thread_exit();
2220b57cec5SDimitry Andric 
2230b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
2240b57cec5SDimitry Andric void __hwasan_print_memory_usage();
2250b57cec5SDimitry Andric 
226753f127fSDimitry Andric // The compiler will generate this when
227753f127fSDimitry Andric // `-hwasan-record-stack-history-with-calls` is added as a flag, which will add
228753f127fSDimitry Andric // frame record information to the stack ring buffer. This is an alternative to
229753f127fSDimitry Andric // the compiler emitting instructions in the prologue for doing the same thing
230753f127fSDimitry Andric // by accessing the ring buffer directly.
231753f127fSDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
232753f127fSDimitry Andric void __hwasan_add_frame_record(u64 frame_record_info);
233753f127fSDimitry Andric 
2340b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
2350b57cec5SDimitry Andric void *__hwasan_memcpy(void *dst, const void *src, uptr size);
2360b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
2370b57cec5SDimitry Andric void *__hwasan_memset(void *s, int c, uptr n);
2380b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
2390b57cec5SDimitry Andric void *__hwasan_memmove(void *dest, const void *src, uptr n);
240e8d8bef9SDimitry Andric 
241e8d8bef9SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
24206c3fb27SDimitry Andric void *__hwasan_memcpy_match_all(void *dst, const void *src, uptr size, u8);
24306c3fb27SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
24406c3fb27SDimitry Andric void *__hwasan_memset_match_all(void *s, int c, uptr n, u8);
24506c3fb27SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
24606c3fb27SDimitry Andric void *__hwasan_memmove_match_all(void *dest, const void *src, uptr n, u8);
24706c3fb27SDimitry Andric 
24806c3fb27SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE
249e8d8bef9SDimitry Andric void __hwasan_set_error_report_callback(void (*callback)(const char *));
2500b57cec5SDimitry Andric }  // extern "C"
2510b57cec5SDimitry Andric 
2520b57cec5SDimitry Andric #endif  // HWASAN_INTERFACE_INTERNAL_H
253