10b57cec5SDimitry Andric// The content of this file is AArch64-only: 20b57cec5SDimitry Andric#if defined(__aarch64__) 30b57cec5SDimitry Andric 40b57cec5SDimitry Andric#include "sanitizer_common/sanitizer_asm.h" 50b57cec5SDimitry Andric 60b57cec5SDimitry Andric#if !defined(__APPLE__) 70b57cec5SDimitry Andric.section .text 80b57cec5SDimitry Andric#else 90b57cec5SDimitry Andric.section __TEXT,__text 100b57cec5SDimitry Andric.align 3 110b57cec5SDimitry Andric#endif 120b57cec5SDimitry Andric 130b57cec5SDimitry AndricASM_HIDDEN(__tsan_setjmp) 140b57cec5SDimitry Andric.comm _ZN14__interception11real_setjmpE,8,8 150b57cec5SDimitry Andric.globl ASM_SYMBOL_INTERCEPTOR(setjmp) 160b57cec5SDimitry AndricASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(setjmp)) 170b57cec5SDimitry AndricASM_SYMBOL_INTERCEPTOR(setjmp): 180b57cec5SDimitry Andric CFI_STARTPROC 190b57cec5SDimitry Andric 200b57cec5SDimitry Andric // Save frame/link register 210b57cec5SDimitry Andric stp x29, x30, [sp, -32]! 220b57cec5SDimitry Andric CFI_DEF_CFA_OFFSET (32) 230b57cec5SDimitry Andric CFI_OFFSET (29, -32) 240b57cec5SDimitry Andric CFI_OFFSET (30, -24) 250b57cec5SDimitry Andric 260b57cec5SDimitry Andric // Adjust the SP for previous frame 270b57cec5SDimitry Andric add x29, sp, 0 280b57cec5SDimitry Andric CFI_DEF_CFA_REGISTER (29) 290b57cec5SDimitry Andric 300b57cec5SDimitry Andric // Save env parameter 310b57cec5SDimitry Andric str x0, [sp, 16] 320b57cec5SDimitry Andric CFI_OFFSET (0, -16) 330b57cec5SDimitry Andric 340b57cec5SDimitry Andric // Obtain SP, first argument to `void __tsan_setjmp(uptr sp)` 350b57cec5SDimitry Andric add x0, x29, 32 360b57cec5SDimitry Andric 370b57cec5SDimitry Andric // call tsan interceptor 380b57cec5SDimitry Andric bl ASM_SYMBOL(__tsan_setjmp) 390b57cec5SDimitry Andric 400b57cec5SDimitry Andric // Restore env parameter 410b57cec5SDimitry Andric ldr x0, [sp, 16] 420b57cec5SDimitry Andric CFI_RESTORE (0) 430b57cec5SDimitry Andric 440b57cec5SDimitry Andric // Restore frame/link register 450b57cec5SDimitry Andric ldp x29, x30, [sp], 32 460b57cec5SDimitry Andric CFI_RESTORE (29) 470b57cec5SDimitry Andric CFI_RESTORE (30) 480b57cec5SDimitry Andric CFI_DEF_CFA (31, 0) 490b57cec5SDimitry Andric 500b57cec5SDimitry Andric // tail jump to libc setjmp 510b57cec5SDimitry Andric#if !defined(__APPLE__) 520b57cec5SDimitry Andric adrp x1, :got:_ZN14__interception11real_setjmpE 530b57cec5SDimitry Andric ldr x1, [x1, #:got_lo12:_ZN14__interception11real_setjmpE] 540b57cec5SDimitry Andric ldr x1, [x1] 550b57cec5SDimitry Andric#else 5606c3fb27SDimitry Andric adrp x1, _setjmp@GOTPAGE 5706c3fb27SDimitry Andric ldr x1, [x1, _setjmp@GOTPAGEOFF] 580b57cec5SDimitry Andric#endif 590b57cec5SDimitry Andric br x1 600b57cec5SDimitry Andric 610b57cec5SDimitry Andric CFI_ENDPROC 620b57cec5SDimitry AndricASM_SIZE(ASM_SYMBOL_INTERCEPTOR(setjmp)) 630b57cec5SDimitry Andric 640b57cec5SDimitry Andric.comm _ZN14__interception12real__setjmpE,8,8 650b57cec5SDimitry Andric.globl ASM_SYMBOL_INTERCEPTOR(_setjmp) 660b57cec5SDimitry AndricASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(_setjmp)) 670b57cec5SDimitry AndricASM_SYMBOL_INTERCEPTOR(_setjmp): 680b57cec5SDimitry Andric CFI_STARTPROC 690b57cec5SDimitry Andric 700b57cec5SDimitry Andric // Save frame/link register 710b57cec5SDimitry Andric stp x29, x30, [sp, -32]! 720b57cec5SDimitry Andric CFI_DEF_CFA_OFFSET (32) 730b57cec5SDimitry Andric CFI_OFFSET (29, -32) 740b57cec5SDimitry Andric CFI_OFFSET (30, -24) 750b57cec5SDimitry Andric 760b57cec5SDimitry Andric // Adjust the SP for previous frame 770b57cec5SDimitry Andric add x29, sp, 0 780b57cec5SDimitry Andric CFI_DEF_CFA_REGISTER (29) 790b57cec5SDimitry Andric 800b57cec5SDimitry Andric // Save env parameter 810b57cec5SDimitry Andric str x0, [sp, 16] 820b57cec5SDimitry Andric CFI_OFFSET (0, -16) 830b57cec5SDimitry Andric 840b57cec5SDimitry Andric // Obtain SP, first argument to `void __tsan_setjmp(uptr sp)` 850b57cec5SDimitry Andric add x0, x29, 32 860b57cec5SDimitry Andric 870b57cec5SDimitry Andric // call tsan interceptor 880b57cec5SDimitry Andric bl ASM_SYMBOL(__tsan_setjmp) 890b57cec5SDimitry Andric 900b57cec5SDimitry Andric // Restore env parameter 910b57cec5SDimitry Andric ldr x0, [sp, 16] 920b57cec5SDimitry Andric CFI_RESTORE (0) 930b57cec5SDimitry Andric 940b57cec5SDimitry Andric // Restore frame/link register 950b57cec5SDimitry Andric ldp x29, x30, [sp], 32 960b57cec5SDimitry Andric CFI_RESTORE (29) 970b57cec5SDimitry Andric CFI_RESTORE (30) 980b57cec5SDimitry Andric CFI_DEF_CFA (31, 0) 990b57cec5SDimitry Andric 1000b57cec5SDimitry Andric // tail jump to libc setjmp 1010b57cec5SDimitry Andric#if !defined(__APPLE__) 1020b57cec5SDimitry Andric adrp x1, :got:_ZN14__interception12real__setjmpE 1030b57cec5SDimitry Andric ldr x1, [x1, #:got_lo12:_ZN14__interception12real__setjmpE] 1040b57cec5SDimitry Andric ldr x1, [x1] 1050b57cec5SDimitry Andric#else 10606c3fb27SDimitry Andric adrp x1, __setjmp@GOTPAGE 10706c3fb27SDimitry Andric ldr x1, [x1, __setjmp@GOTPAGEOFF] 1080b57cec5SDimitry Andric#endif 1090b57cec5SDimitry Andric br x1 1100b57cec5SDimitry Andric 1110b57cec5SDimitry Andric CFI_ENDPROC 1120b57cec5SDimitry AndricASM_SIZE(ASM_SYMBOL_INTERCEPTOR(_setjmp)) 1130b57cec5SDimitry Andric 1140b57cec5SDimitry Andric.comm _ZN14__interception14real_sigsetjmpE,8,8 1150b57cec5SDimitry Andric.globl ASM_SYMBOL_INTERCEPTOR(sigsetjmp) 1160b57cec5SDimitry AndricASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(sigsetjmp)) 1170b57cec5SDimitry AndricASM_SYMBOL_INTERCEPTOR(sigsetjmp): 1180b57cec5SDimitry Andric CFI_STARTPROC 1190b57cec5SDimitry Andric 1200b57cec5SDimitry Andric // Save frame/link register 1210b57cec5SDimitry Andric stp x29, x30, [sp, -32]! 1220b57cec5SDimitry Andric CFI_DEF_CFA_OFFSET (32) 1230b57cec5SDimitry Andric CFI_OFFSET (29, -32) 1240b57cec5SDimitry Andric CFI_OFFSET (30, -24) 1250b57cec5SDimitry Andric 1260b57cec5SDimitry Andric // Adjust the SP for previous frame 1270b57cec5SDimitry Andric add x29, sp, 0 1280b57cec5SDimitry Andric CFI_DEF_CFA_REGISTER (29) 1290b57cec5SDimitry Andric 1300b57cec5SDimitry Andric // Save env and savesigs parameter 1310b57cec5SDimitry Andric stp x0, x1, [sp, 16] 1320b57cec5SDimitry Andric CFI_OFFSET (0, -16) 1330b57cec5SDimitry Andric CFI_OFFSET (1, -8) 1340b57cec5SDimitry Andric 1350b57cec5SDimitry Andric // Obtain SP, first argument to `void __tsan_setjmp(uptr sp)` 1360b57cec5SDimitry Andric add x0, x29, 32 1370b57cec5SDimitry Andric 1380b57cec5SDimitry Andric // call tsan interceptor 1390b57cec5SDimitry Andric bl ASM_SYMBOL(__tsan_setjmp) 1400b57cec5SDimitry Andric 1410b57cec5SDimitry Andric // Restore env and savesigs parameter 1420b57cec5SDimitry Andric ldp x0, x1, [sp, 16] 1430b57cec5SDimitry Andric CFI_RESTORE (0) 1440b57cec5SDimitry Andric CFI_RESTORE (1) 1450b57cec5SDimitry Andric 1460b57cec5SDimitry Andric // Restore frame/link register 1470b57cec5SDimitry Andric ldp x29, x30, [sp], 32 1480b57cec5SDimitry Andric CFI_RESTORE (29) 1490b57cec5SDimitry Andric CFI_RESTORE (30) 1500b57cec5SDimitry Andric CFI_DEF_CFA (31, 0) 1510b57cec5SDimitry Andric 1520b57cec5SDimitry Andric // tail jump to libc sigsetjmp 1530b57cec5SDimitry Andric#if !defined(__APPLE__) 1540b57cec5SDimitry Andric adrp x2, :got:_ZN14__interception14real_sigsetjmpE 1550b57cec5SDimitry Andric ldr x2, [x2, #:got_lo12:_ZN14__interception14real_sigsetjmpE] 1560b57cec5SDimitry Andric ldr x2, [x2] 1570b57cec5SDimitry Andric#else 15806c3fb27SDimitry Andric adrp x2, _sigsetjmp@GOTPAGE 15906c3fb27SDimitry Andric ldr x2, [x2, _sigsetjmp@GOTPAGEOFF] 1600b57cec5SDimitry Andric#endif 1610b57cec5SDimitry Andric br x2 1620b57cec5SDimitry Andric CFI_ENDPROC 1630b57cec5SDimitry AndricASM_SIZE(ASM_SYMBOL_INTERCEPTOR(sigsetjmp)) 1640b57cec5SDimitry Andric 1650b57cec5SDimitry Andric#if !defined(__APPLE__) 1660b57cec5SDimitry Andric.comm _ZN14__interception16real___sigsetjmpE,8,8 1670b57cec5SDimitry Andric.globl ASM_SYMBOL_INTERCEPTOR(__sigsetjmp) 1680b57cec5SDimitry AndricASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp)) 1690b57cec5SDimitry AndricASM_SYMBOL_INTERCEPTOR(__sigsetjmp): 1700b57cec5SDimitry Andric CFI_STARTPROC 1710b57cec5SDimitry Andric 1720b57cec5SDimitry Andric // Save frame/link register 1730b57cec5SDimitry Andric stp x29, x30, [sp, -32]! 1740b57cec5SDimitry Andric CFI_DEF_CFA_OFFSET (32) 1750b57cec5SDimitry Andric CFI_OFFSET (29, -32) 1760b57cec5SDimitry Andric CFI_OFFSET (30, -24) 1770b57cec5SDimitry Andric 1780b57cec5SDimitry Andric // Adjust the SP for previous frame 1790b57cec5SDimitry Andric add x29, sp, 0 1800b57cec5SDimitry Andric CFI_DEF_CFA_REGISTER (29) 1810b57cec5SDimitry Andric 1820b57cec5SDimitry Andric // Save env and savesigs parameter 1830b57cec5SDimitry Andric stp x0, x1, [sp, 16] 1840b57cec5SDimitry Andric CFI_OFFSET (0, -16) 1850b57cec5SDimitry Andric CFI_OFFSET (1, -8) 1860b57cec5SDimitry Andric 1870b57cec5SDimitry Andric // Obtain SP, first argument to `void __tsan_setjmp(uptr sp)` 1880b57cec5SDimitry Andric add x0, x29, 32 1890b57cec5SDimitry Andric 1900b57cec5SDimitry Andric // call tsan interceptor 1910b57cec5SDimitry Andric bl ASM_SYMBOL(__tsan_setjmp) 1920b57cec5SDimitry Andric 1930b57cec5SDimitry Andric // Restore env and savesigs parameter 1940b57cec5SDimitry Andric ldp x0, x1, [sp, 16] 1950b57cec5SDimitry Andric CFI_RESTORE (0) 1960b57cec5SDimitry Andric CFI_RESTORE (1) 1970b57cec5SDimitry Andric 1980b57cec5SDimitry Andric // Restore frame/link register 1990b57cec5SDimitry Andric ldp x29, x30, [sp], 32 2000b57cec5SDimitry Andric CFI_RESTORE (29) 2010b57cec5SDimitry Andric CFI_RESTORE (30) 2020b57cec5SDimitry Andric CFI_DEF_CFA (31, 0) 2030b57cec5SDimitry Andric 2040b57cec5SDimitry Andric // tail jump to libc __sigsetjmp 2050b57cec5SDimitry Andric#if !defined(__APPLE__) 2060b57cec5SDimitry Andric adrp x2, :got:_ZN14__interception16real___sigsetjmpE 2070b57cec5SDimitry Andric ldr x2, [x2, #:got_lo12:_ZN14__interception16real___sigsetjmpE] 2080b57cec5SDimitry Andric ldr x2, [x2] 2090b57cec5SDimitry Andric#else 2100b57cec5SDimitry Andric adrp x2, ASM_SYMBOL(__sigsetjmp)@page 2110b57cec5SDimitry Andric add x2, x2, ASM_SYMBOL(__sigsetjmp)@pageoff 2120b57cec5SDimitry Andric#endif 2130b57cec5SDimitry Andric br x2 2140b57cec5SDimitry Andric CFI_ENDPROC 2150b57cec5SDimitry AndricASM_SIZE(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp)) 2160b57cec5SDimitry Andric#endif 2170b57cec5SDimitry Andric 2180b57cec5SDimitry AndricNO_EXEC_STACK_DIRECTIVE 2190b57cec5SDimitry Andric 2200b57cec5SDimitry Andric#endif 221