Path: blob/main/contrib/llvm-project/compiler-rt/lib/asan_abi/asan_abi_shim.cpp
35235 views
//===-asan_abi_shim.cpp - ASan Stable ABI Shim-----------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "../asan/asan_interface_internal.h"9#include "asan_abi.h"10#include <assert.h>1112extern "C" {13// Functions concerning instrumented global variables14void __asan_register_image_globals(uptr *flag) {15__asan_abi_register_image_globals();16}17void __asan_unregister_image_globals(uptr *flag) {18__asan_abi_unregister_image_globals();19}20void __asan_register_elf_globals(uptr *flag, void *start, void *stop) {21bool bFlag = *flag;22__asan_abi_register_elf_globals(&bFlag, start, stop);23*flag = bFlag;24}25void __asan_unregister_elf_globals(uptr *flag, void *start, void *stop) {26bool bFlag = *flag;27__asan_abi_unregister_elf_globals(&bFlag, start, stop);28*flag = bFlag;29}30void __asan_register_globals(__asan_global *globals, uptr n) {31__asan_abi_register_globals(globals, n);32}33void __asan_unregister_globals(__asan_global *globals, uptr n) {34__asan_abi_unregister_globals(globals, n);35}3637// Functions concerning dynamic library initialization38void __asan_before_dynamic_init(const char *module_name) {39__asan_abi_before_dynamic_init(module_name);40}41void __asan_after_dynamic_init(void) { __asan_abi_after_dynamic_init(); }4243// Functions concerning block memory destinations44void *__asan_memcpy(void *dst, const void *src, uptr size) {45return __asan_abi_memcpy(dst, src, size);46}47void *__asan_memset(void *s, int c, uptr n) {48return __asan_abi_memset(s, c, n);49}50void *__asan_memmove(void *dest, const void *src, uptr n) {51return __asan_abi_memmove(dest, src, n);52}5354// Functions concerning RTL startup and initialization55void __asan_init(void) {56static_assert(sizeof(uptr) == 8 || sizeof(uptr) == 4);57static_assert(sizeof(u64) == 8);58static_assert(sizeof(u32) == 4);5960__asan_abi_init();61}6263void __asan_handle_no_return(void) { __asan_abi_handle_no_return(); }6465// Variables concerning RTL state. These provisionally exist for completeness66// but will likely move into the Stable ABI implementation and not in the shim.67uptr __asan_shadow_memory_dynamic_address = (uptr)0L;68int __asan_option_detect_stack_use_after_return = 1;6970// Functions concerning memory load and store reporting71void __asan_report_load1(uptr addr) {72__asan_abi_report_load_n((void *)addr, 1, true);73}74void __asan_report_load2(uptr addr) {75__asan_abi_report_load_n((void *)addr, 2, true);76}77void __asan_report_load4(uptr addr) {78__asan_abi_report_load_n((void *)addr, 4, true);79}80void __asan_report_load8(uptr addr) {81__asan_abi_report_load_n((void *)addr, 8, true);82}83void __asan_report_load16(uptr addr) {84__asan_abi_report_load_n((void *)addr, 16, true);85}86void __asan_report_load_n(uptr addr, uptr size) {87__asan_abi_report_load_n((void *)addr, size, true);88}89void __asan_report_store1(uptr addr) {90__asan_abi_report_store_n((void *)addr, 1, true);91}92void __asan_report_store2(uptr addr) {93__asan_abi_report_store_n((void *)addr, 2, true);94}95void __asan_report_store4(uptr addr) {96__asan_abi_report_store_n((void *)addr, 4, true);97}98void __asan_report_store8(uptr addr) {99__asan_abi_report_store_n((void *)addr, 8, true);100}101void __asan_report_store16(uptr addr) {102__asan_abi_report_store_n((void *)addr, 16, true);103}104void __asan_report_store_n(uptr addr, uptr size) {105__asan_abi_report_store_n((void *)addr, size, true);106}107108// Functions concerning memory load and store reporting (experimental variants)109void __asan_report_exp_load1(uptr addr, u32 exp) {110__asan_abi_report_exp_load_n((void *)addr, exp, 1, true);111}112void __asan_report_exp_load2(uptr addr, u32 exp) {113__asan_abi_report_exp_load_n((void *)addr, exp, 2, true);114}115void __asan_report_exp_load4(uptr addr, u32 exp) {116__asan_abi_report_exp_load_n((void *)addr, exp, 4, true);117}118void __asan_report_exp_load8(uptr addr, u32 exp) {119__asan_abi_report_exp_load_n((void *)addr, exp, 8, true);120}121void __asan_report_exp_load16(uptr addr, u32 exp) {122__asan_abi_report_exp_load_n((void *)addr, exp, 16, true);123}124void __asan_report_exp_load_n(uptr addr, uptr size, u32 exp) {125__asan_abi_report_exp_load_n((void *)addr, size, exp, true);126}127void __asan_report_exp_store1(uptr addr, u32 exp) {128__asan_abi_report_exp_store_n((void *)addr, exp, 1, true);129}130void __asan_report_exp_store2(uptr addr, u32 exp) {131__asan_abi_report_exp_store_n((void *)addr, exp, 2, true);132}133void __asan_report_exp_store4(uptr addr, u32 exp) {134__asan_abi_report_exp_store_n((void *)addr, exp, 4, true);135}136void __asan_report_exp_store8(uptr addr, u32 exp) {137__asan_abi_report_exp_store_n((void *)addr, exp, 8, true);138}139void __asan_report_exp_store16(uptr addr, u32 exp) {140__asan_abi_report_exp_store_n((void *)addr, exp, 16, true);141}142void __asan_report_exp_store_n(uptr addr, uptr size, u32 exp) {143__asan_abi_report_exp_store_n((void *)addr, size, exp, true);144}145146// Functions concerning memory load and store reporting (noabort variants)147void __asan_report_load1_noabort(uptr addr) {148__asan_abi_report_load_n((void *)addr, 1, false);149}150void __asan_report_load2_noabort(uptr addr) {151__asan_abi_report_load_n((void *)addr, 2, false);152}153void __asan_report_load4_noabort(uptr addr) {154__asan_abi_report_load_n((void *)addr, 4, false);155}156void __asan_report_load8_noabort(uptr addr) {157__asan_abi_report_load_n((void *)addr, 8, false);158}159void __asan_report_load16_noabort(uptr addr) {160__asan_abi_report_load_n((void *)addr, 16, false);161}162void __asan_report_load_n_noabort(uptr addr, uptr size) {163__asan_abi_report_load_n((void *)addr, size, false);164}165void __asan_report_store1_noabort(uptr addr) {166__asan_abi_report_store_n((void *)addr, 1, false);167}168void __asan_report_store2_noabort(uptr addr) {169__asan_abi_report_store_n((void *)addr, 2, false);170}171void __asan_report_store4_noabort(uptr addr) {172__asan_abi_report_store_n((void *)addr, 4, false);173}174void __asan_report_store8_noabort(uptr addr) {175__asan_abi_report_store_n((void *)addr, 8, false);176}177void __asan_report_store16_noabort(uptr addr) {178__asan_abi_report_store_n((void *)addr, 16, false);179}180void __asan_report_store_n_noabort(uptr addr, uptr size) {181__asan_abi_report_store_n((void *)addr, size, false);182}183184// Functions concerning memory load and store185void __asan_load1(uptr addr) { __asan_abi_load_n((void *)addr, 1, true); }186void __asan_load2(uptr addr) { __asan_abi_load_n((void *)addr, 2, true); }187void __asan_load4(uptr addr) { __asan_abi_load_n((void *)addr, 4, true); }188void __asan_load8(uptr addr) { __asan_abi_load_n((void *)addr, 8, true); }189void __asan_load16(uptr addr) { __asan_abi_load_n((void *)addr, 16, true); }190void __asan_loadN(uptr addr, uptr size) {191__asan_abi_load_n((void *)addr, size, true);192}193void __asan_store1(uptr addr) { __asan_abi_store_n((void *)addr, 1, true); }194void __asan_store2(uptr addr) { __asan_abi_store_n((void *)addr, 2, true); }195void __asan_store4(uptr addr) { __asan_abi_store_n((void *)addr, 4, true); }196void __asan_store8(uptr addr) { __asan_abi_store_n((void *)addr, 8, true); }197void __asan_store16(uptr addr) { __asan_abi_store_n((void *)addr, 16, true); }198void __asan_storeN(uptr addr, uptr size) {199__asan_abi_store_n((void *)addr, size, true);200}201202// Functions concerning memory load and store (experimental variants)203void __asan_exp_load1(uptr addr, u32 exp) {204__asan_abi_exp_load_n((void *)addr, 1, exp, true);205}206void __asan_exp_load2(uptr addr, u32 exp) {207__asan_abi_exp_load_n((void *)addr, 2, exp, true);208}209void __asan_exp_load4(uptr addr, u32 exp) {210__asan_abi_exp_load_n((void *)addr, 4, exp, true);211}212void __asan_exp_load8(uptr addr, u32 exp) {213__asan_abi_exp_load_n((void *)addr, 8, exp, true);214}215void __asan_exp_load16(uptr addr, u32 exp) {216__asan_abi_exp_load_n((void *)addr, 16, exp, true);217}218void __asan_exp_loadN(uptr addr, uptr size, u32 exp) {219__asan_abi_exp_load_n((void *)addr, size, exp, true);220}221void __asan_exp_store1(uptr addr, u32 exp) {222__asan_abi_exp_store_n((void *)addr, 1, exp, true);223}224void __asan_exp_store2(uptr addr, u32 exp) {225__asan_abi_exp_store_n((void *)addr, 2, exp, true);226}227void __asan_exp_store4(uptr addr, u32 exp) {228__asan_abi_exp_store_n((void *)addr, 4, exp, true);229}230void __asan_exp_store8(uptr addr, u32 exp) {231__asan_abi_exp_store_n((void *)addr, 8, exp, true);232}233void __asan_exp_store16(uptr addr, u32 exp) {234__asan_abi_exp_store_n((void *)addr, 16, exp, true);235}236void __asan_exp_storeN(uptr addr, uptr size, u32 exp) {237__asan_abi_exp_store_n((void *)addr, size, exp, true);238}239240// Functions concerning memory load and store (noabort variants)241void __asan_load1_noabort(uptr addr) {242__asan_abi_load_n((void *)addr, 1, false);243}244void __asan_load2_noabort(uptr addr) {245__asan_abi_load_n((void *)addr, 2, false);246}247void __asan_load4_noabort(uptr addr) {248__asan_abi_load_n((void *)addr, 4, false);249}250void __asan_load8_noabort(uptr addr) {251__asan_abi_load_n((void *)addr, 8, false);252}253void __asan_load16_noabort(uptr addr) {254__asan_abi_load_n((void *)addr, 16, false);255}256void __asan_loadN_noabort(uptr addr, uptr size) {257__asan_abi_load_n((void *)addr, size, false);258}259void __asan_store1_noabort(uptr addr) {260__asan_abi_store_n((void *)addr, 1, false);261}262void __asan_store2_noabort(uptr addr) {263__asan_abi_store_n((void *)addr, 2, false);264}265void __asan_store4_noabort(uptr addr) {266__asan_abi_store_n((void *)addr, 4, false);267}268void __asan_store8_noabort(uptr addr) {269__asan_abi_store_n((void *)addr, 8, false);270}271void __asan_store16_noabort(uptr addr) {272__asan_abi_store_n((void *)addr, 16, false);273}274void __asan_storeN_noabort(uptr addr, uptr size) {275__asan_abi_store_n((void *)addr, size, false);276}277278// Functions concerning query about whether memory is poisoned279int __asan_address_is_poisoned(void const volatile *addr) {280return __asan_abi_address_is_poisoned(addr);281}282uptr __asan_region_is_poisoned(uptr beg, uptr size) {283return (uptr)__asan_abi_region_is_poisoned((void *)beg, size);284}285286// Functions concerning the poisoning of memory287void __asan_poison_memory_region(void const volatile *addr, uptr size) {288__asan_abi_poison_memory_region(addr, size);289}290void __asan_unpoison_memory_region(void const volatile *addr, uptr size) {291__asan_abi_unpoison_memory_region(addr, size);292}293294// Functions concerning the partial poisoning of memory295void __asan_set_shadow_00(uptr addr, uptr size) {296__asan_abi_set_shadow_xx_n((void *)addr, 0x00, size);297}298void __asan_set_shadow_01(uptr addr, uptr size) {299__asan_abi_set_shadow_xx_n((void *)addr, 0x01, size);300}301void __asan_set_shadow_02(uptr addr, uptr size) {302__asan_abi_set_shadow_xx_n((void *)addr, 0x02, size);303}304void __asan_set_shadow_03(uptr addr, uptr size) {305__asan_abi_set_shadow_xx_n((void *)addr, 0x03, size);306}307void __asan_set_shadow_04(uptr addr, uptr size) {308__asan_abi_set_shadow_xx_n((void *)addr, 0x04, size);309}310void __asan_set_shadow_05(uptr addr, uptr size) {311__asan_abi_set_shadow_xx_n((void *)addr, 0x05, size);312}313void __asan_set_shadow_06(uptr addr, uptr size) {314__asan_abi_set_shadow_xx_n((void *)addr, 0x06, size);315}316void __asan_set_shadow_07(uptr addr, uptr size) {317__asan_abi_set_shadow_xx_n((void *)addr, 0x07, size);318}319void __asan_set_shadow_f1(uptr addr, uptr size) {320__asan_abi_set_shadow_xx_n((void *)addr, 0xf1, size);321}322void __asan_set_shadow_f2(uptr addr, uptr size) {323__asan_abi_set_shadow_xx_n((void *)addr, 0xf2, size);324}325void __asan_set_shadow_f3(uptr addr, uptr size) {326__asan_abi_set_shadow_xx_n((void *)addr, 0xf3, size);327}328void __asan_set_shadow_f5(uptr addr, uptr size) {329__asan_abi_set_shadow_xx_n((void *)addr, 0xf5, size);330}331void __asan_set_shadow_f8(uptr addr, uptr size) {332__asan_abi_set_shadow_xx_n((void *)addr, 0xf8, size);333}334335// Functions concerning stack poisoning336void __asan_poison_stack_memory(uptr addr, uptr size) {337__asan_abi_poison_stack_memory((void *)addr, size);338}339void __asan_unpoison_stack_memory(uptr addr, uptr size) {340__asan_abi_unpoison_stack_memory((void *)addr, size);341}342343// Functions concerning redzone poisoning344void __asan_poison_intra_object_redzone(uptr p, uptr size) {345__asan_abi_poison_intra_object_redzone((void *)p, size);346}347void __asan_unpoison_intra_object_redzone(uptr p, uptr size) {348__asan_abi_unpoison_intra_object_redzone((void *)p, size);349}350351// Functions concerning array cookie poisoning352void __asan_poison_cxx_array_cookie(uptr p) {353__asan_abi_poison_cxx_array_cookie((void *)p);354}355uptr __asan_load_cxx_array_cookie(uptr *p) {356return (uptr)__asan_abi_load_cxx_array_cookie((void **)p);357}358359// Functions concerning fake stacks360void *__asan_get_current_fake_stack(void) {361return __asan_abi_get_current_fake_stack();362}363void *__asan_addr_is_in_fake_stack(void *fake_stack, void *addr, void **beg,364void **end) {365return __asan_abi_addr_is_in_fake_stack(fake_stack, addr, beg, end);366}367368// Functions concerning poisoning and unpoisoning fake stack alloca369void __asan_alloca_poison(uptr addr, uptr size) {370__asan_abi_alloca_poison((void *)addr, size);371}372void __asan_allocas_unpoison(uptr top, uptr bottom) {373__asan_abi_allocas_unpoison((void *)top, (void *)bottom);374}375376// Functions concerning fake stack malloc377uptr __asan_stack_malloc_0(uptr size) {378return (uptr)__asan_abi_stack_malloc_n(0, size);379}380uptr __asan_stack_malloc_1(uptr size) {381return (uptr)__asan_abi_stack_malloc_n(1, size);382}383uptr __asan_stack_malloc_2(uptr size) {384return (uptr)__asan_abi_stack_malloc_n(2, size);385}386uptr __asan_stack_malloc_3(uptr size) {387return (uptr)__asan_abi_stack_malloc_n(3, size);388}389uptr __asan_stack_malloc_4(uptr size) {390return (uptr)__asan_abi_stack_malloc_n(4, size);391}392uptr __asan_stack_malloc_5(uptr size) {393return (uptr)__asan_abi_stack_malloc_n(5, size);394}395uptr __asan_stack_malloc_6(uptr size) {396return (uptr)__asan_abi_stack_malloc_n(6, size);397}398uptr __asan_stack_malloc_7(uptr size) {399return (uptr)__asan_abi_stack_malloc_n(7, size);400}401uptr __asan_stack_malloc_8(uptr size) {402return (uptr)__asan_abi_stack_malloc_n(8, size);403}404uptr __asan_stack_malloc_9(uptr size) {405return (uptr)__asan_abi_stack_malloc_n(9, size);406}407uptr __asan_stack_malloc_10(uptr size) {408return (uptr)__asan_abi_stack_malloc_n(10, size);409}410411// Functions concerning fake stack malloc (always variants)412uptr __asan_stack_malloc_always_0(uptr size) {413return (uptr)__asan_abi_stack_malloc_always_n(0, size);414}415uptr __asan_stack_malloc_always_1(uptr size) {416return (uptr)__asan_abi_stack_malloc_always_n(1, size);417}418uptr __asan_stack_malloc_always_2(uptr size) {419return (uptr)__asan_abi_stack_malloc_always_n(2, size);420}421uptr __asan_stack_malloc_always_3(uptr size) {422return (uptr)__asan_abi_stack_malloc_always_n(3, size);423}424uptr __asan_stack_malloc_always_4(uptr size) {425return (uptr)__asan_abi_stack_malloc_always_n(4, size);426}427uptr __asan_stack_malloc_always_5(uptr size) {428return (uptr)__asan_abi_stack_malloc_always_n(5, size);429}430uptr __asan_stack_malloc_always_6(uptr size) {431return (uptr)__asan_abi_stack_malloc_always_n(6, size);432}433uptr __asan_stack_malloc_always_7(uptr size) {434return (uptr)__asan_abi_stack_malloc_always_n(7, size);435}436uptr __asan_stack_malloc_always_8(uptr size) {437return (uptr)__asan_abi_stack_malloc_always_n(8, size);438}439uptr __asan_stack_malloc_always_9(uptr size) {440return (uptr)__asan_abi_stack_malloc_always_n(9, size);441}442uptr __asan_stack_malloc_always_10(uptr size) {443return (uptr)__asan_abi_stack_malloc_always_n(10, size);444}445446// Functions concerning fake stack free447void __asan_stack_free_0(uptr ptr, uptr size) {448__asan_abi_stack_free_n(0, (void *)ptr, size);449}450void __asan_stack_free_1(uptr ptr, uptr size) {451__asan_abi_stack_free_n(1, (void *)ptr, size);452}453void __asan_stack_free_2(uptr ptr, uptr size) {454__asan_abi_stack_free_n(2, (void *)ptr, size);455}456void __asan_stack_free_3(uptr ptr, uptr size) {457__asan_abi_stack_free_n(3, (void *)ptr, size);458}459void __asan_stack_free_4(uptr ptr, uptr size) {460__asan_abi_stack_free_n(4, (void *)ptr, size);461}462void __asan_stack_free_5(uptr ptr, uptr size) {463__asan_abi_stack_free_n(5, (void *)ptr, size);464}465void __asan_stack_free_6(uptr ptr, uptr size) {466__asan_abi_stack_free_n(6, (void *)ptr, size);467}468void __asan_stack_free_7(uptr ptr, uptr size) {469__asan_abi_stack_free_n(7, (void *)ptr, size);470}471void __asan_stack_free_8(uptr ptr, uptr size) {472__asan_abi_stack_free_n(8, (void *)ptr, size);473}474void __asan_stack_free_9(uptr ptr, uptr size) {475__asan_abi_stack_free_n(9, (void *)ptr, size);476}477void __asan_stack_free_10(uptr ptr, uptr size) {478__asan_abi_stack_free_n(10, (void *)ptr, size);479}480}481482483