Home | History | Annotate | Line # | Download | only in tsan
      1 // The content of this file is AArch64-only:
      2 #if defined(__aarch64__)
      3 
      4 #include "sanitizer_common/sanitizer_asm.h"
      5 
      6 #if !defined(__APPLE__)
      7 .section .text
      8 #else
      9 .section __TEXT,__text
     10 .align 3
     11 #endif
     12 
     13 ASM_HIDDEN(__tsan_setjmp)
     14 .comm _ZN14__interception11real_setjmpE,8,8
     15 .globl ASM_SYMBOL_INTERCEPTOR(setjmp)
     16 ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(setjmp))
     17 ASM_SYMBOL_INTERCEPTOR(setjmp):
     18   CFI_STARTPROC
     19 
     20   // Save frame/link register
     21   stp     x29, x30, [sp, -32]!
     22   CFI_DEF_CFA_OFFSET (32)
     23   CFI_OFFSET (29, -32)
     24   CFI_OFFSET (30, -24)
     25 
     26   // Adjust the SP for previous frame
     27   add     x29, sp, 0
     28   CFI_DEF_CFA_REGISTER (29)
     29 
     30   // Save env parameter
     31   str     x0, [sp, 16]
     32   CFI_OFFSET (0, -16)
     33 
     34   // Obtain SP, first argument to `void __tsan_setjmp(uptr sp)`
     35   add     x0, x29, 32
     36 
     37   // call tsan interceptor
     38   bl      ASM_SYMBOL(__tsan_setjmp)
     39 
     40   // Restore env parameter
     41   ldr     x0, [sp, 16]
     42   CFI_RESTORE (0)
     43 
     44   // Restore frame/link register
     45   ldp     x29, x30, [sp], 32
     46   CFI_RESTORE (29)
     47   CFI_RESTORE (30)
     48   CFI_DEF_CFA (31, 0)
     49 
     50   // tail jump to libc setjmp
     51 #if !defined(__APPLE__)
     52   adrp    x1, :got:_ZN14__interception11real_setjmpE
     53   ldr     x1, [x1, #:got_lo12:_ZN14__interception11real_setjmpE]
     54   ldr     x1, [x1]
     55 #else
     56   adrp    x1, _setjmp@GOTPAGE
     57   ldr     x1, [x1, _setjmp@GOTPAGEOFF]
     58 #endif
     59   br      x1
     60 
     61   CFI_ENDPROC
     62 ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(setjmp))
     63 
     64 .comm _ZN14__interception12real__setjmpE,8,8
     65 .globl ASM_SYMBOL_INTERCEPTOR(_setjmp)
     66 ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(_setjmp))
     67 ASM_SYMBOL_INTERCEPTOR(_setjmp):
     68   CFI_STARTPROC
     69 
     70   // Save frame/link register
     71   stp     x29, x30, [sp, -32]!
     72   CFI_DEF_CFA_OFFSET (32)
     73   CFI_OFFSET (29, -32)
     74   CFI_OFFSET (30, -24)
     75 
     76   // Adjust the SP for previous frame
     77   add     x29, sp, 0
     78   CFI_DEF_CFA_REGISTER (29)
     79 
     80   // Save env parameter
     81   str     x0, [sp, 16]
     82   CFI_OFFSET (0, -16)
     83 
     84   // Obtain SP, first argument to `void __tsan_setjmp(uptr sp)`
     85   add     x0, x29, 32
     86 
     87   // call tsan interceptor
     88   bl      ASM_SYMBOL(__tsan_setjmp)
     89 
     90   // Restore env parameter
     91   ldr     x0, [sp, 16]
     92   CFI_RESTORE (0)
     93 
     94   // Restore frame/link register
     95   ldp     x29, x30, [sp], 32
     96   CFI_RESTORE (29)
     97   CFI_RESTORE (30)
     98   CFI_DEF_CFA (31, 0)
     99 
    100   // tail jump to libc setjmp
    101 #if !defined(__APPLE__)
    102   adrp    x1, :got:_ZN14__interception12real__setjmpE
    103   ldr     x1, [x1, #:got_lo12:_ZN14__interception12real__setjmpE]
    104   ldr     x1, [x1]
    105 #else
    106   adrp    x1, __setjmp@GOTPAGE
    107   ldr     x1, [x1, __setjmp@GOTPAGEOFF]
    108 #endif
    109   br      x1
    110 
    111   CFI_ENDPROC
    112 ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(_setjmp))
    113 
    114 .comm _ZN14__interception14real_sigsetjmpE,8,8
    115 .globl ASM_SYMBOL_INTERCEPTOR(sigsetjmp)
    116 ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(sigsetjmp))
    117 ASM_SYMBOL_INTERCEPTOR(sigsetjmp):
    118   CFI_STARTPROC
    119 
    120   // Save frame/link register
    121   stp     x29, x30, [sp, -32]!
    122   CFI_DEF_CFA_OFFSET (32)
    123   CFI_OFFSET (29, -32)
    124   CFI_OFFSET (30, -24)
    125 
    126   // Adjust the SP for previous frame
    127   add     x29, sp, 0
    128   CFI_DEF_CFA_REGISTER (29)
    129 
    130   // Save env and savesigs parameter
    131   stp     x0, x1, [sp, 16]
    132   CFI_OFFSET (0, -16)
    133   CFI_OFFSET (1, -8)
    134 
    135   // Obtain SP, first argument to `void __tsan_setjmp(uptr sp)`
    136   add     x0, x29, 32
    137 
    138   // call tsan interceptor
    139   bl      ASM_SYMBOL(__tsan_setjmp)
    140 
    141   // Restore env and savesigs parameter
    142   ldp     x0, x1, [sp, 16]
    143   CFI_RESTORE (0)
    144   CFI_RESTORE (1)
    145 
    146   // Restore frame/link register
    147   ldp     x29, x30, [sp], 32
    148   CFI_RESTORE (29)
    149   CFI_RESTORE (30)
    150   CFI_DEF_CFA (31, 0)
    151 
    152   // tail jump to libc sigsetjmp
    153 #if !defined(__APPLE__)
    154   adrp    x2, :got:_ZN14__interception14real_sigsetjmpE
    155   ldr     x2, [x2, #:got_lo12:_ZN14__interception14real_sigsetjmpE]
    156   ldr     x2, [x2]
    157 #else
    158   adrp    x2, _sigsetjmp@GOTPAGE
    159   ldr     x2, [x2, _sigsetjmp@GOTPAGEOFF]
    160 #endif
    161   br      x2
    162   CFI_ENDPROC
    163 ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(sigsetjmp))
    164 
    165 #if !defined(__APPLE__)
    166 .comm _ZN14__interception16real___sigsetjmpE,8,8
    167 .globl ASM_SYMBOL_INTERCEPTOR(__sigsetjmp)
    168 ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp))
    169 ASM_SYMBOL_INTERCEPTOR(__sigsetjmp):
    170   CFI_STARTPROC
    171 
    172   // Save frame/link register
    173   stp     x29, x30, [sp, -32]!
    174   CFI_DEF_CFA_OFFSET (32)
    175   CFI_OFFSET (29, -32)
    176   CFI_OFFSET (30, -24)
    177 
    178   // Adjust the SP for previous frame
    179   add     x29, sp, 0
    180   CFI_DEF_CFA_REGISTER (29)
    181 
    182   // Save env and savesigs parameter
    183   stp     x0, x1, [sp, 16]
    184   CFI_OFFSET (0, -16)
    185   CFI_OFFSET (1, -8)
    186 
    187   // Obtain SP, first argument to `void __tsan_setjmp(uptr sp)`
    188   add     x0, x29, 32
    189 
    190   // call tsan interceptor
    191   bl      ASM_SYMBOL(__tsan_setjmp)
    192 
    193   // Restore env and savesigs parameter
    194   ldp     x0, x1, [sp, 16]
    195   CFI_RESTORE (0)
    196   CFI_RESTORE (1)
    197 
    198   // Restore frame/link register
    199   ldp     x29, x30, [sp], 32
    200   CFI_RESTORE (29)
    201   CFI_RESTORE (30)
    202   CFI_DEF_CFA (31, 0)
    203 
    204   // tail jump to libc __sigsetjmp
    205 #if !defined(__APPLE__)
    206   adrp    x2, :got:_ZN14__interception16real___sigsetjmpE
    207   ldr     x2, [x2, #:got_lo12:_ZN14__interception16real___sigsetjmpE]
    208   ldr     x2, [x2]
    209 #else
    210   adrp    x2, ASM_SYMBOL(__sigsetjmp)@page
    211   add     x2, x2, ASM_SYMBOL(__sigsetjmp)@pageoff
    212 #endif
    213   br      x2
    214   CFI_ENDPROC
    215 ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp))
    216 #endif
    217 
    218 NO_EXEC_STACK_DIRECTIVE
    219 
    220 #endif
    221