| // The content of this file is AArch64-only: |
| #if defined(__aarch64__) |
| |
| #include "sanitizer_common/sanitizer_asm.h" |
| |
| #if defined(__APPLE__) |
| .align 2 |
| |
| .section __DATA,__nl_symbol_ptr,non_lazy_symbol_pointers |
| .long _setjmp$non_lazy_ptr |
| _setjmp$non_lazy_ptr: |
| .indirect_symbol _setjmp |
| .long 0 |
| |
| .section __DATA,__nl_symbol_ptr,non_lazy_symbol_pointers |
| .long __setjmp$non_lazy_ptr |
| __setjmp$non_lazy_ptr: |
| .indirect_symbol __setjmp |
| .long 0 |
| |
| .section __DATA,__nl_symbol_ptr,non_lazy_symbol_pointers |
| .long _sigsetjmp$non_lazy_ptr |
| _sigsetjmp$non_lazy_ptr: |
| .indirect_symbol _sigsetjmp |
| .long 0 |
| #endif |
| |
| #if !defined(__APPLE__) |
| .section .text |
| #else |
| .section __TEXT,__text |
| .align 3 |
| #endif |
| |
| ASM_HIDDEN(__tsan_setjmp) |
| .comm _ZN14__interception11real_setjmpE,8,8 |
| .globl ASM_SYMBOL_INTERCEPTOR(setjmp) |
| ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(setjmp)) |
| ASM_SYMBOL_INTERCEPTOR(setjmp): |
| CFI_STARTPROC |
| |
| // Save frame/link register |
| stp x29, x30, [sp, -32]! |
| CFI_DEF_CFA_OFFSET (32) |
| CFI_OFFSET (29, -32) |
| CFI_OFFSET (30, -24) |
| |
| // Adjust the SP for previous frame |
| add x29, sp, 0 |
| CFI_DEF_CFA_REGISTER (29) |
| |
| // Save env parameter |
| str x0, [sp, 16] |
| CFI_OFFSET (0, -16) |
| |
| // Obtain SP, first argument to `void __tsan_setjmp(uptr sp)` |
| add x0, x29, 32 |
| |
| // call tsan interceptor |
| bl ASM_SYMBOL(__tsan_setjmp) |
| |
| // Restore env parameter |
| ldr x0, [sp, 16] |
| CFI_RESTORE (0) |
| |
| // Restore frame/link register |
| ldp x29, x30, [sp], 32 |
| CFI_RESTORE (29) |
| CFI_RESTORE (30) |
| CFI_DEF_CFA (31, 0) |
| |
| // tail jump to libc setjmp |
| #if !defined(__APPLE__) |
| adrp x1, :got:_ZN14__interception11real_setjmpE |
| ldr x1, [x1, #:got_lo12:_ZN14__interception11real_setjmpE] |
| ldr x1, [x1] |
| #else |
| adrp x1, _setjmp$non_lazy_ptr@page |
| add x1, x1, _setjmp$non_lazy_ptr@pageoff |
| ldr x1, [x1] |
| #endif |
| br x1 |
| |
| CFI_ENDPROC |
| ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(setjmp)) |
| |
| .comm _ZN14__interception12real__setjmpE,8,8 |
| .globl ASM_SYMBOL_INTERCEPTOR(_setjmp) |
| ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(_setjmp)) |
| ASM_SYMBOL_INTERCEPTOR(_setjmp): |
| CFI_STARTPROC |
| |
| // Save frame/link register |
| stp x29, x30, [sp, -32]! |
| CFI_DEF_CFA_OFFSET (32) |
| CFI_OFFSET (29, -32) |
| CFI_OFFSET (30, -24) |
| |
| // Adjust the SP for previous frame |
| add x29, sp, 0 |
| CFI_DEF_CFA_REGISTER (29) |
| |
| // Save env parameter |
| str x0, [sp, 16] |
| CFI_OFFSET (0, -16) |
| |
| // Obtain SP, first argument to `void __tsan_setjmp(uptr sp)` |
| add x0, x29, 32 |
| |
| // call tsan interceptor |
| bl ASM_SYMBOL(__tsan_setjmp) |
| |
| // Restore env parameter |
| ldr x0, [sp, 16] |
| CFI_RESTORE (0) |
| |
| // Restore frame/link register |
| ldp x29, x30, [sp], 32 |
| CFI_RESTORE (29) |
| CFI_RESTORE (30) |
| CFI_DEF_CFA (31, 0) |
| |
| // tail jump to libc setjmp |
| #if !defined(__APPLE__) |
| adrp x1, :got:_ZN14__interception12real__setjmpE |
| ldr x1, [x1, #:got_lo12:_ZN14__interception12real__setjmpE] |
| ldr x1, [x1] |
| #else |
| adrp x1, __setjmp$non_lazy_ptr@page |
| add x1, x1, __setjmp$non_lazy_ptr@pageoff |
| ldr x1, [x1] |
| #endif |
| br x1 |
| |
| CFI_ENDPROC |
| ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(_setjmp)) |
| |
| .comm _ZN14__interception14real_sigsetjmpE,8,8 |
| .globl ASM_SYMBOL_INTERCEPTOR(sigsetjmp) |
| ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(sigsetjmp)) |
| ASM_SYMBOL_INTERCEPTOR(sigsetjmp): |
| CFI_STARTPROC |
| |
| // Save frame/link register |
| stp x29, x30, [sp, -32]! |
| CFI_DEF_CFA_OFFSET (32) |
| CFI_OFFSET (29, -32) |
| CFI_OFFSET (30, -24) |
| |
| // Adjust the SP for previous frame |
| add x29, sp, 0 |
| CFI_DEF_CFA_REGISTER (29) |
| |
| // Save env and savesigs parameter |
| stp x0, x1, [sp, 16] |
| CFI_OFFSET (0, -16) |
| CFI_OFFSET (1, -8) |
| |
| // Obtain SP, first argument to `void __tsan_setjmp(uptr sp)` |
| add x0, x29, 32 |
| |
| // call tsan interceptor |
| bl ASM_SYMBOL(__tsan_setjmp) |
| |
| // Restore env and savesigs parameter |
| ldp x0, x1, [sp, 16] |
| CFI_RESTORE (0) |
| CFI_RESTORE (1) |
| |
| // Restore frame/link register |
| ldp x29, x30, [sp], 32 |
| CFI_RESTORE (29) |
| CFI_RESTORE (30) |
| CFI_DEF_CFA (31, 0) |
| |
| // tail jump to libc sigsetjmp |
| #if !defined(__APPLE__) |
| adrp x2, :got:_ZN14__interception14real_sigsetjmpE |
| ldr x2, [x2, #:got_lo12:_ZN14__interception14real_sigsetjmpE] |
| ldr x2, [x2] |
| #else |
| adrp x2, _sigsetjmp$non_lazy_ptr@page |
| add x2, x2, _sigsetjmp$non_lazy_ptr@pageoff |
| ldr x2, [x2] |
| #endif |
| br x2 |
| CFI_ENDPROC |
| ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(sigsetjmp)) |
| |
| #if !defined(__APPLE__) |
| .comm _ZN14__interception16real___sigsetjmpE,8,8 |
| .globl ASM_SYMBOL_INTERCEPTOR(__sigsetjmp) |
| ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp)) |
| ASM_SYMBOL_INTERCEPTOR(__sigsetjmp): |
| CFI_STARTPROC |
| |
| // Save frame/link register |
| stp x29, x30, [sp, -32]! |
| CFI_DEF_CFA_OFFSET (32) |
| CFI_OFFSET (29, -32) |
| CFI_OFFSET (30, -24) |
| |
| // Adjust the SP for previous frame |
| add x29, sp, 0 |
| CFI_DEF_CFA_REGISTER (29) |
| |
| // Save env and savesigs parameter |
| stp x0, x1, [sp, 16] |
| CFI_OFFSET (0, -16) |
| CFI_OFFSET (1, -8) |
| |
| // Obtain SP, first argument to `void __tsan_setjmp(uptr sp)` |
| add x0, x29, 32 |
| |
| // call tsan interceptor |
| bl ASM_SYMBOL(__tsan_setjmp) |
| |
| // Restore env and savesigs parameter |
| ldp x0, x1, [sp, 16] |
| CFI_RESTORE (0) |
| CFI_RESTORE (1) |
| |
| // Restore frame/link register |
| ldp x29, x30, [sp], 32 |
| CFI_RESTORE (29) |
| CFI_RESTORE (30) |
| CFI_DEF_CFA (31, 0) |
| |
| // tail jump to libc __sigsetjmp |
| #if !defined(__APPLE__) |
| adrp x2, :got:_ZN14__interception16real___sigsetjmpE |
| ldr x2, [x2, #:got_lo12:_ZN14__interception16real___sigsetjmpE] |
| ldr x2, [x2] |
| #else |
| adrp x2, ASM_SYMBOL(__sigsetjmp)@page |
| add x2, x2, ASM_SYMBOL(__sigsetjmp)@pageoff |
| #endif |
| br x2 |
| CFI_ENDPROC |
| ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp)) |
| #endif |
| |
| NO_EXEC_STACK_DIRECTIVE |
| |
| #endif |