Index: head/contrib/compiler-rt/lib/tsan/rtl/tsan_rtl_aarch64.S =================================================================== --- head/contrib/compiler-rt/lib/tsan/rtl/tsan_rtl_aarch64.S (revision 319515) +++ head/contrib/compiler-rt/lib/tsan/rtl/tsan_rtl_aarch64.S (revision 319516) @@ -1,258 +1,258 @@ #include "sanitizer_common/sanitizer_asm.h" .section .bss .type __tsan_pointer_chk_guard, %object .size __tsan_pointer_chk_guard, 8 __tsan_pointer_chk_guard: .zero 8 .section .text // GLIBC mangles the function pointers in jmp_buf (used in {set,long}*jmp // functions) by XORing them with a random guard pointer. For AArch64 it is a // global variable rather than a TCB one (as for x86_64/powerpc) and althought // its value is exported by the loader, it lies within a private GLIBC // namespace (meaning it should be only used by GLIBC itself and the ABI is // not stable). So InitializeGuardPtr obtains the pointer guard value by // issuing a setjmp and checking the resulting pointers values against the // original ones. .hidden _Z18InitializeGuardPtrv .global _Z18InitializeGuardPtrv .type _Z18InitializeGuardPtrv, @function _Z18InitializeGuardPtrv: CFI_STARTPROC // Allocates a jmp_buf for the setjmp call. stp x29, x30, [sp, -336]! CFI_DEF_CFA_OFFSET (336) CFI_OFFSET (29, -336) CFI_OFFSET (30, -328) add x29, sp, 0 CFI_DEF_CFA_REGISTER (29) add x0, x29, 24 // Call libc setjmp that mangle the stack pointer value adrp x1, :got:_ZN14__interception12real__setjmpE ldr x1, [x1, #:got_lo12:_ZN14__interception12real__setjmpE] ldr x1, [x1] blr x1 // glibc setjmp mangles both the frame pointer (FP, pc+4 on blr) and the // stack pointer (SP). FP will be placed on ((uintptr*)jmp_buf)[11] and // SP at ((uintptr*)jmp_buf)[13]. // The mangle operation is just 'value' xor 'pointer guard value' and // if we know the original value (SP) and the expected one, we can derive // the guard pointer value. mov x0, sp // Loads the mangled SP pointer. ldr x1, [x29, 128] eor x0, x0, x1 adrp x2, __tsan_pointer_chk_guard str x0, [x2, #:lo12:__tsan_pointer_chk_guard] ldp x29, x30, [sp], 336 CFI_RESTORE (30) CFI_RESTORE (19) CFI_DEF_CFA (31, 0) ret CFI_ENDPROC .size _Z18InitializeGuardPtrv, .-_Z18InitializeGuardPtrv .hidden __tsan_setjmp .comm _ZN14__interception11real_setjmpE,8,8 .type setjmp, @function setjmp: CFI_STARTPROC // save env parameters for function call 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 jmp_buf str x19, [sp, 16] CFI_OFFSET (19, -16) mov x19, x0 // SP pointer mangling (see glibc setjmp) adrp x2, __tsan_pointer_chk_guard ldr x2, [x2, #:lo12:__tsan_pointer_chk_guard] add x0, x29, 32 eor x1, x2, x0 // call tsan interceptor bl __tsan_setjmp // restore env parameter mov x0, x19 ldr x19, [sp, 16] ldp x29, x30, [sp], 32 CFI_RESTORE (30) CFI_RESTORE (19) CFI_DEF_CFA (31, 0) // tail jump to libc setjmp adrp x1, :got:_ZN14__interception11real_setjmpE ldr x1, [x1, #:got_lo12:_ZN14__interception11real_setjmpE] ldr x1, [x1] br x1 CFI_ENDPROC .size setjmp, .-setjmp .comm _ZN14__interception12real__setjmpE,8,8 .globl _setjmp .type _setjmp, @function _setjmp: CFI_STARTPROC // save env parameters for function call 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 jmp_buf str x19, [sp, 16] CFI_OFFSET (19, -16) mov x19, x0 // SP pointer mangling (see glibc setjmp) adrp x2, __tsan_pointer_chk_guard ldr x2, [x2, #:lo12:__tsan_pointer_chk_guard] add x0, x29, 32 eor x1, x2, x0 // call tsan interceptor bl __tsan_setjmp // Restore jmp_buf parameter mov x0, x19 ldr x19, [sp, 16] ldp x29, x30, [sp], 32 CFI_RESTORE (30) CFI_RESTORE (19) CFI_DEF_CFA (31, 0) // tail jump to libc setjmp adrp x1, :got:_ZN14__interception12real__setjmpE ldr x1, [x1, #:got_lo12:_ZN14__interception12real__setjmpE] ldr x1, [x1] br x1 CFI_ENDPROC .size _setjmp, .-_setjmp .comm _ZN14__interception14real_sigsetjmpE,8,8 .globl sigsetjmp .type sigsetjmp, @function sigsetjmp: CFI_STARTPROC // save env parameters for function call 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 jmp_buf and savesigs stp x19, x20, [sp, 16] CFI_OFFSET (19, -16) CFI_OFFSET (20, -8) mov w20, w1 mov x19, x0 // SP pointer mangling (see glibc setjmp) adrp x2, __tsan_pointer_chk_guard ldr x2, [x2, #:lo12:__tsan_pointer_chk_guard] add x0, x29, 32 eor x1, x2, x0 // call tsan interceptor bl __tsan_setjmp // restore env parameter mov w1, w20 mov x0, x19 ldp x19, x20, [sp, 16] ldp x29, x30, [sp], 32 CFI_RESTORE (30) CFI_RESTORE (29) CFI_RESTORE (19) CFI_RESTORE (20) CFI_DEF_CFA (31, 0) // tail jump to libc sigsetjmp adrp x2, :got:_ZN14__interception14real_sigsetjmpE ldr x2, [x2, #:got_lo12:_ZN14__interception14real_sigsetjmpE] ldr x2, [x2] br x2 CFI_ENDPROC .size sigsetjmp, .-sigsetjmp .comm _ZN14__interception16real___sigsetjmpE,8,8 .globl __sigsetjmp .type __sigsetjmp, @function __sigsetjmp: CFI_STARTPROC // save env parameters for function call 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 jmp_buf and savesigs stp x19, x20, [sp, 16] CFI_OFFSET (19, -16) CFI_OFFSET (20, -8) mov w20, w1 mov x19, x0 // SP pointer mangling (see glibc setjmp) adrp x2, __tsan_pointer_chk_guard ldr x2, [x2, #:lo12:__tsan_pointer_chk_guard] add x0, x29, 32 eor x1, x2, x0 // call tsan interceptor bl __tsan_setjmp mov w1, w20 mov x0, x19 ldp x19, x20, [sp, 16] ldp x29, x30, [sp], 32 CFI_RESTORE (30) CFI_RESTORE (29) CFI_RESTORE (19) CFI_RESTORE (20) CFI_DEF_CFA (31, 0) // tail jump to libc __sigsetjmp adrp x2, :got:_ZN14__interception16real___sigsetjmpE ldr x2, [x2, #:got_lo12:_ZN14__interception16real___sigsetjmpE] ldr x2, [x2] br x2 CFI_ENDPROC .size __sigsetjmp, .-__sigsetjmp -#if defined(__linux__) +#if defined(__FreeBSD__) || defined(__linux__) /* We do not need executable stack. */ .section .note.GNU-stack,"",@progbits #endif