Path: blob/main/contrib/llvm-project/compiler-rt/lib/asan/asan_rtl_x86_64.S
35233 views
#include "asan_mapping.h"1#include "sanitizer_common/sanitizer_asm.h"23#if defined(__x86_64__)4#include "sanitizer_common/sanitizer_platform.h"56.file "asan_rtl_x86_64.S"78#define NAME(n, reg, op, s, i) n##_##op##_##i##_##s##_##reg910#define FNAME(reg, op, s, i) NAME(__asan_check, reg, op, s, i)11#define RLABEL(reg, op, s, i) NAME(.return, reg, op, s, i)12#define CLABEL(reg, op, s, i) NAME(.check, reg, op, s, i)13#define FLABEL(reg, op, s, i) NAME(.fail, reg, op, s, i)1415#define BEGINF(reg, op, s, i) \16.section .text.FNAME(reg, op, s, i),"ax",@progbits ;\17.globl FNAME(reg, op, s, i) ;\18.hidden FNAME(reg, op, s, i) ;\19ASM_TYPE_FUNCTION(FNAME(reg, op, s, i)) ;\20.cfi_startproc ;\21FNAME(reg, op, s, i): ;\2223#define ENDF .cfi_endproc ;\2425// Access check functions for 1,2 and 4 byte types, which require extra checks.26#define ASAN_MEMORY_ACCESS_INITIAL_CHECK_ADD(reg, op, s) \27mov %##reg,%r10 ;\28shr $0x3,%r10 ;\29.if ASAN_SHADOW_OFFSET_CONST < 0x80000000 ;\30movsbl ASAN_SHADOW_OFFSET_CONST(%r10),%r10d ;\31.else ;\32movabsq $ASAN_SHADOW_OFFSET_CONST,%r11 ;\33movsbl (%r10,%r11),%r10d ;\34.endif ;\35test %r10d,%r10d ;\36jne CLABEL(reg, op, s, add) ;\37RLABEL(reg, op, s, add): ;\38retq ;\3940#define ASAN_MEMORY_ACCESS_EXTRA_CHECK_1(reg, op, i) \41CLABEL(reg, op, 1, i): ;\42mov %##reg,%r11 ;\43and $0x7,%r11d ;\44cmp %r10d,%r11d ;\45jl RLABEL(reg, op, 1, i);\46mov %##reg,%rdi ;\47jmp __asan_report_##op##1_asm ;\4849#define ASAN_MEMORY_ACCESS_EXTRA_CHECK_2(reg, op, i) \50CLABEL(reg, op, 2, i): ;\51mov %##reg,%r11 ;\52and $0x7,%r11d ;\53add $0x1,%r11d ;\54cmp %r10d,%r11d ;\55jl RLABEL(reg, op, 2, i);\56mov %##reg,%rdi ;\57jmp __asan_report_##op##2_asm ;\5859#define ASAN_MEMORY_ACCESS_EXTRA_CHECK_4(reg, op, i) \60CLABEL(reg, op, 4, i): ;\61mov %##reg,%r11 ;\62and $0x7,%r11d ;\63add $0x3,%r11d ;\64cmp %r10d,%r11d ;\65jl RLABEL(reg, op, 4, i);\66mov %##reg,%rdi ;\67jmp __asan_report_##op##4_asm ;\6869#define ASAN_MEMORY_ACCESS_CALLBACK_ADD_1(reg, op) \70BEGINF(reg, op, 1, add) ;\71ASAN_MEMORY_ACCESS_INITIAL_CHECK_ADD(reg, op, 1) ;\72ASAN_MEMORY_ACCESS_EXTRA_CHECK_1(reg, op, add) ;\73ENDF7475#define ASAN_MEMORY_ACCESS_CALLBACK_ADD_2(reg, op) \76BEGINF(reg, op, 2, add) ;\77ASAN_MEMORY_ACCESS_INITIAL_CHECK_ADD(reg, op, 2) ;\78ASAN_MEMORY_ACCESS_EXTRA_CHECK_2(reg, op, add) ;\79ENDF8081#define ASAN_MEMORY_ACCESS_CALLBACK_ADD_4(reg, op) \82BEGINF(reg, op, 4, add) ;\83ASAN_MEMORY_ACCESS_INITIAL_CHECK_ADD(reg, op, 4) ;\84ASAN_MEMORY_ACCESS_EXTRA_CHECK_4(reg, op, add) ;\85ENDF8687// Access check functions for 8 and 16 byte types: no extra checks required.88#define ASAN_MEMORY_ACCESS_CHECK_ADD(reg, op, s, c) \89mov %##reg,%r10 ;\90shr $0x3,%r10 ;\91.if ASAN_SHADOW_OFFSET_CONST < 0x80000000 ;\92##c $0x0,ASAN_SHADOW_OFFSET_CONST(%r10) ;\93.else ;\94movabsq $ASAN_SHADOW_OFFSET_CONST,%r11 ;\95##c $0x0,(%r10,%r11) ;\96.endif ;\97jne FLABEL(reg, op, s, add) ;\98retq ;\99100#define ASAN_MEMORY_ACCESS_FAIL(reg, op, s, i) \101FLABEL(reg, op, s, i): ;\102mov %##reg,%rdi ;\103jmp __asan_report_##op##s##_asm;\104105#define ASAN_MEMORY_ACCESS_CALLBACK_ADD_8(reg, op) \106BEGINF(reg, op, 8, add) ;\107ASAN_MEMORY_ACCESS_CHECK_ADD(reg, op, 8, cmpb) ;\108ASAN_MEMORY_ACCESS_FAIL(reg, op, 8, add) ;\109ENDF110111#define ASAN_MEMORY_ACCESS_CALLBACK_ADD_16(reg, op) \112BEGINF(reg, op, 16, add) ;\113ASAN_MEMORY_ACCESS_CHECK_ADD(reg, op, 16, cmpw) ;\114ASAN_MEMORY_ACCESS_FAIL(reg, op, 16, add) ;\115ENDF116117#define ASAN_MEMORY_ACCESS_CALLBACKS_ADD(reg) \118ASAN_MEMORY_ACCESS_CALLBACK_ADD_1(reg, load) \119ASAN_MEMORY_ACCESS_CALLBACK_ADD_1(reg, store) \120ASAN_MEMORY_ACCESS_CALLBACK_ADD_2(reg, load) \121ASAN_MEMORY_ACCESS_CALLBACK_ADD_2(reg, store) \122ASAN_MEMORY_ACCESS_CALLBACK_ADD_4(reg, load) \123ASAN_MEMORY_ACCESS_CALLBACK_ADD_4(reg, store) \124ASAN_MEMORY_ACCESS_CALLBACK_ADD_8(reg, load) \125ASAN_MEMORY_ACCESS_CALLBACK_ADD_8(reg, store) \126ASAN_MEMORY_ACCESS_CALLBACK_ADD_16(reg, load) \127ASAN_MEMORY_ACCESS_CALLBACK_ADD_16(reg, store) \128129130// Instantiate all but R10 and R11 callbacks. We are using PLTSafe class with131// the intrinsic, which guarantees that the code generation will never emit132// R10 or R11 callback.133ASAN_MEMORY_ACCESS_CALLBACKS_ADD(RAX)134ASAN_MEMORY_ACCESS_CALLBACKS_ADD(RBX)135ASAN_MEMORY_ACCESS_CALLBACKS_ADD(RCX)136ASAN_MEMORY_ACCESS_CALLBACKS_ADD(RDX)137ASAN_MEMORY_ACCESS_CALLBACKS_ADD(RSI)138ASAN_MEMORY_ACCESS_CALLBACKS_ADD(RDI)139ASAN_MEMORY_ACCESS_CALLBACKS_ADD(RBP)140ASAN_MEMORY_ACCESS_CALLBACKS_ADD(R8)141ASAN_MEMORY_ACCESS_CALLBACKS_ADD(R9)142ASAN_MEMORY_ACCESS_CALLBACKS_ADD(R12)143ASAN_MEMORY_ACCESS_CALLBACKS_ADD(R13)144ASAN_MEMORY_ACCESS_CALLBACKS_ADD(R14)145ASAN_MEMORY_ACCESS_CALLBACKS_ADD(R15)146147#endif148149NO_EXEC_STACK_DIRECTIVE150151152