10b57cec5SDimitry Andric //===-- msan_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 MemorySanitizer. 100b57cec5SDimitry Andric // 110b57cec5SDimitry Andric // Private MSan interface header. 120b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 130b57cec5SDimitry Andric 140b57cec5SDimitry Andric #ifndef MSAN_INTERFACE_INTERNAL_H 150b57cec5SDimitry Andric #define MSAN_INTERFACE_INTERNAL_H 160b57cec5SDimitry Andric 170b57cec5SDimitry Andric #include "sanitizer_common/sanitizer_internal_defs.h" 180b57cec5SDimitry Andric 190b57cec5SDimitry Andric extern "C" { 200b57cec5SDimitry Andric // FIXME: document all interface functions. 210b57cec5SDimitry Andric 220b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 230b57cec5SDimitry Andric int __msan_get_track_origins(); 240b57cec5SDimitry Andric 250b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 260b57cec5SDimitry Andric void __msan_init(); 270b57cec5SDimitry Andric 280b57cec5SDimitry Andric // Print a warning and maybe return. 290b57cec5SDimitry Andric // This function can die based on common_flags()->exitcode. 300b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 310b57cec5SDimitry Andric void __msan_warning(); 320b57cec5SDimitry Andric 330b57cec5SDimitry Andric // Print a warning and die. 34349cc55cSDimitry Andric // Instrumentation inserts calls to this function when building in "fast" mode 350b57cec5SDimitry Andric // (i.e. -mllvm -msan-keep-going) 360b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE __attribute__((noreturn)) 370b57cec5SDimitry Andric void __msan_warning_noreturn(); 380b57cec5SDimitry Andric 390b57cec5SDimitry Andric using __sanitizer::uptr; 400b57cec5SDimitry Andric using __sanitizer::sptr; 410b57cec5SDimitry Andric using __sanitizer::uu64; 420b57cec5SDimitry Andric using __sanitizer::uu32; 430b57cec5SDimitry Andric using __sanitizer::uu16; 440b57cec5SDimitry Andric using __sanitizer::u64; 450b57cec5SDimitry Andric using __sanitizer::u32; 460b57cec5SDimitry Andric using __sanitizer::u16; 470b57cec5SDimitry Andric using __sanitizer::u8; 480b57cec5SDimitry Andric 495ffd83dbSDimitry Andric // Versions of the above which take Origin as a parameter 505ffd83dbSDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 515ffd83dbSDimitry Andric void __msan_warning_with_origin(u32 origin); 525ffd83dbSDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE __attribute__((noreturn)) void 535ffd83dbSDimitry Andric __msan_warning_with_origin_noreturn(u32 origin); 545ffd83dbSDimitry Andric 550b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 560b57cec5SDimitry Andric void __msan_maybe_warning_1(u8 s, u32 o); 570b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 580b57cec5SDimitry Andric void __msan_maybe_warning_2(u16 s, u32 o); 590b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 600b57cec5SDimitry Andric void __msan_maybe_warning_4(u32 s, u32 o); 610b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 620b57cec5SDimitry Andric void __msan_maybe_warning_8(u64 s, u32 o); 630b57cec5SDimitry Andric 640b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 650b57cec5SDimitry Andric void __msan_maybe_store_origin_1(u8 s, void *p, u32 o); 660b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 670b57cec5SDimitry Andric void __msan_maybe_store_origin_2(u16 s, void *p, u32 o); 680b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 690b57cec5SDimitry Andric void __msan_maybe_store_origin_4(u32 s, void *p, u32 o); 700b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 710b57cec5SDimitry Andric void __msan_maybe_store_origin_8(u64 s, void *p, u32 o); 720b57cec5SDimitry Andric 730b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 740b57cec5SDimitry Andric void __msan_unpoison(const void *a, uptr size); 750b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 760b57cec5SDimitry Andric void __msan_unpoison_string(const char *s); 770b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 780b57cec5SDimitry Andric void __msan_unpoison_param(uptr n); 790b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 800b57cec5SDimitry Andric void __msan_clear_and_unpoison(void *a, uptr size); 810b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 820b57cec5SDimitry Andric void* __msan_memcpy(void *dst, const void *src, uptr size); 830b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 840b57cec5SDimitry Andric void* __msan_memset(void *s, int c, uptr n); 850b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 860b57cec5SDimitry Andric void* __msan_memmove(void* dest, const void* src, uptr n); 870b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 880b57cec5SDimitry Andric void __msan_poison(const void *a, uptr size); 890b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 900b57cec5SDimitry Andric void __msan_poison_stack(void *a, uptr size); 910b57cec5SDimitry Andric 920b57cec5SDimitry Andric // Copy size bytes from src to dst and unpoison the result. 930b57cec5SDimitry Andric // Useful to implement unsafe loads. 940b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 950b57cec5SDimitry Andric void __msan_load_unpoisoned(void *src, uptr size, void *dst); 960b57cec5SDimitry Andric 970b57cec5SDimitry Andric // Returns the offset of the first (at least partially) poisoned byte, 980b57cec5SDimitry Andric // or -1 if the whole range is good. 990b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 1000b57cec5SDimitry Andric sptr __msan_test_shadow(const void *x, uptr size); 1010b57cec5SDimitry Andric 1020b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 1030b57cec5SDimitry Andric void __msan_check_mem_is_initialized(const void *x, uptr size); 1040b57cec5SDimitry Andric 1050b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 1060b57cec5SDimitry Andric void __msan_set_origin(const void *a, uptr size, u32 origin); 1070b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 1080b57cec5SDimitry Andric void __msan_set_alloca_origin(void *a, uptr size, char *descr); 1090b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 1100b57cec5SDimitry Andric void __msan_set_alloca_origin4(void *a, uptr size, char *descr, uptr pc); 1110b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 112bdd1243dSDimitry Andric void __msan_set_alloca_origin_with_descr(void *a, uptr size, u32 *id_ptr, 113bdd1243dSDimitry Andric char *descr); 114bdd1243dSDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 115bdd1243dSDimitry Andric void __msan_set_alloca_origin_no_descr(void *a, uptr size, u32 *id_ptr); 116bdd1243dSDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 1170b57cec5SDimitry Andric u32 __msan_chain_origin(u32 id); 1180b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 1190b57cec5SDimitry Andric u32 __msan_get_origin(const void *a); 1200b57cec5SDimitry Andric 1210b57cec5SDimitry Andric // Test that this_id is a descendant of prev_id (or they are simply equal). 1220b57cec5SDimitry Andric // "descendant" here means that are part of the same chain, created with 1230b57cec5SDimitry Andric // __msan_chain_origin. 1240b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 1250b57cec5SDimitry Andric int __msan_origin_is_descendant_or_same(u32 this_id, u32 prev_id); 1260b57cec5SDimitry Andric 1270b57cec5SDimitry Andric 1280b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 1290b57cec5SDimitry Andric void __msan_clear_on_return(); 1300b57cec5SDimitry Andric 1310b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 1320b57cec5SDimitry Andric void __msan_set_keep_going(int keep_going); 1330b57cec5SDimitry Andric 1340b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 1350b57cec5SDimitry Andric int __msan_set_poison_in_malloc(int do_poison); 1360b57cec5SDimitry Andric 137e8d8bef9SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 138e8d8bef9SDimitry Andric const char *__msan_default_options(); 1390b57cec5SDimitry Andric 1400b57cec5SDimitry Andric // For testing. 1410b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 1420b57cec5SDimitry Andric void __msan_set_expect_umr(int expect_umr); 1430b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 1440b57cec5SDimitry Andric void __msan_print_shadow(const void *x, uptr size); 1450b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 1460b57cec5SDimitry Andric void __msan_dump_shadow(const void *x, uptr size); 1470b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 1480b57cec5SDimitry Andric int __msan_has_dynamic_component(); 1490b57cec5SDimitry Andric 1500b57cec5SDimitry Andric // For testing. 1510b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 1520b57cec5SDimitry Andric u32 __msan_get_umr_origin(); 1530b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 1540b57cec5SDimitry Andric void __msan_partial_poison(const void* data, void* shadow, uptr size); 1550b57cec5SDimitry Andric 1560b57cec5SDimitry Andric // Tell MSan about newly allocated memory (ex.: custom allocator). 1570b57cec5SDimitry Andric // Memory will be marked uninitialized, with origin at the call site. 1580b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 1590b57cec5SDimitry Andric void __msan_allocated_memory(const void* data, uptr size); 1600b57cec5SDimitry Andric 1610b57cec5SDimitry Andric // Tell MSan about newly destroyed memory. Memory will be marked 1620b57cec5SDimitry Andric // uninitialized. 1630b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 1640b57cec5SDimitry Andric void __sanitizer_dtor_callback(const void* data, uptr size); 165bdd1243dSDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 166bdd1243dSDimitry Andric void __sanitizer_dtor_callback_fields(const void *data, uptr size); 167bdd1243dSDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 168bdd1243dSDimitry Andric void __sanitizer_dtor_callback_vptr(const void *data); 1690b57cec5SDimitry Andric 1700b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 1710b57cec5SDimitry Andric u16 __sanitizer_unaligned_load16(const uu16 *p); 1720b57cec5SDimitry Andric 1730b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 1740b57cec5SDimitry Andric u32 __sanitizer_unaligned_load32(const uu32 *p); 1750b57cec5SDimitry Andric 1760b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 1770b57cec5SDimitry Andric u64 __sanitizer_unaligned_load64(const uu64 *p); 1780b57cec5SDimitry Andric 1790b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 1800b57cec5SDimitry Andric void __sanitizer_unaligned_store16(uu16 *p, u16 x); 1810b57cec5SDimitry Andric 1820b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 1830b57cec5SDimitry Andric void __sanitizer_unaligned_store32(uu32 *p, u32 x); 1840b57cec5SDimitry Andric 1850b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 1860b57cec5SDimitry Andric void __sanitizer_unaligned_store64(uu64 *p, u64 x); 1870b57cec5SDimitry Andric 1880b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 1890b57cec5SDimitry Andric void __msan_set_death_callback(void (*callback)(void)); 1900b57cec5SDimitry Andric 1910b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 1920b57cec5SDimitry Andric void __msan_copy_shadow(void *dst, const void *src, uptr size); 1930b57cec5SDimitry Andric 1940b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 1950b57cec5SDimitry Andric void __msan_scoped_disable_interceptor_checks(); 1960b57cec5SDimitry Andric 1970b57cec5SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 1980b57cec5SDimitry Andric void __msan_scoped_enable_interceptor_checks(); 199e8d8bef9SDimitry Andric 200e8d8bef9SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 201e8d8bef9SDimitry Andric void __msan_start_switch_fiber(const void *bottom, uptr size); 202e8d8bef9SDimitry Andric 203e8d8bef9SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE 204e8d8bef9SDimitry Andric void __msan_finish_switch_fiber(const void **bottom_old, uptr *size_old); 2050b57cec5SDimitry Andric } // extern "C" 2060b57cec5SDimitry Andric 2070b57cec5SDimitry Andric #endif // MSAN_INTERFACE_INTERNAL_H 208