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