Home | History | Annotate | Line # | Download | only in rtl
      1 // The content of this file is x86_64-only:
      2 #if defined(__x86_64__)
      3 
      4 #include "sanitizer_common/sanitizer_asm.h"
      5 
      6 #if !defined(__APPLE__)
      7 .section .text
      8 #else
      9 .section __TEXT,__text
     10 #endif
     11 
     12 ASM_HIDDEN(__tsan_trace_switch)
     13 .globl ASM_SYMBOL(__tsan_trace_switch_thunk)
     14 ASM_SYMBOL(__tsan_trace_switch_thunk):
     15   CFI_STARTPROC
     16   # Save scratch registers.
     17   push %rax
     18   CFI_ADJUST_CFA_OFFSET(8)
     19   CFI_REL_OFFSET(%rax, 0)
     20   push %rcx
     21   CFI_ADJUST_CFA_OFFSET(8)
     22   CFI_REL_OFFSET(%rcx, 0)
     23   push %rdx
     24   CFI_ADJUST_CFA_OFFSET(8)
     25   CFI_REL_OFFSET(%rdx, 0)
     26   push %rsi
     27   CFI_ADJUST_CFA_OFFSET(8)
     28   CFI_REL_OFFSET(%rsi, 0)
     29   push %rdi
     30   CFI_ADJUST_CFA_OFFSET(8)
     31   CFI_REL_OFFSET(%rdi, 0)
     32   push %r8
     33   CFI_ADJUST_CFA_OFFSET(8)
     34   CFI_REL_OFFSET(%r8, 0)
     35   push %r9
     36   CFI_ADJUST_CFA_OFFSET(8)
     37   CFI_REL_OFFSET(%r9, 0)
     38   push %r10
     39   CFI_ADJUST_CFA_OFFSET(8)
     40   CFI_REL_OFFSET(%r10, 0)
     41   push %r11
     42   CFI_ADJUST_CFA_OFFSET(8)
     43   CFI_REL_OFFSET(%r11, 0)
     44   # Align stack frame.
     45   push %rbx  # non-scratch
     46   CFI_ADJUST_CFA_OFFSET(8)
     47   CFI_REL_OFFSET(%rbx, 0)
     48   mov %rsp, %rbx  # save current rsp
     49   CFI_DEF_CFA_REGISTER(%rbx)
     50   shr $4, %rsp  # clear 4 lsb, align to 16
     51   shl $4, %rsp
     52 
     53   call ASM_SYMBOL(__tsan_trace_switch)
     54 
     55   # Unalign stack frame back.
     56   mov %rbx, %rsp  # restore the original rsp
     57   CFI_DEF_CFA_REGISTER(%rsp)
     58   pop %rbx
     59   CFI_ADJUST_CFA_OFFSET(-8)
     60   # Restore scratch registers.
     61   pop %r11
     62   CFI_ADJUST_CFA_OFFSET(-8)
     63   pop %r10
     64   CFI_ADJUST_CFA_OFFSET(-8)
     65   pop %r9
     66   CFI_ADJUST_CFA_OFFSET(-8)
     67   pop %r8
     68   CFI_ADJUST_CFA_OFFSET(-8)
     69   pop %rdi
     70   CFI_ADJUST_CFA_OFFSET(-8)
     71   pop %rsi
     72   CFI_ADJUST_CFA_OFFSET(-8)
     73   pop %rdx
     74   CFI_ADJUST_CFA_OFFSET(-8)
     75   pop %rcx
     76   CFI_ADJUST_CFA_OFFSET(-8)
     77   pop %rax
     78   CFI_ADJUST_CFA_OFFSET(-8)
     79   CFI_RESTORE(%rax)
     80   CFI_RESTORE(%rbx)
     81   CFI_RESTORE(%rcx)
     82   CFI_RESTORE(%rdx)
     83   CFI_RESTORE(%rsi)
     84   CFI_RESTORE(%rdi)
     85   CFI_RESTORE(%r8)
     86   CFI_RESTORE(%r9)
     87   CFI_RESTORE(%r10)
     88   CFI_RESTORE(%r11)
     89   ret
     90   CFI_ENDPROC
     91 
     92 ASM_HIDDEN(__tsan_report_race)
     93 .globl ASM_SYMBOL(__tsan_report_race_thunk)
     94 ASM_SYMBOL(__tsan_report_race_thunk):
     95   CFI_STARTPROC
     96   # Save scratch registers.
     97   push %rax
     98   CFI_ADJUST_CFA_OFFSET(8)
     99   CFI_REL_OFFSET(%rax, 0)
    100   push %rcx
    101   CFI_ADJUST_CFA_OFFSET(8)
    102   CFI_REL_OFFSET(%rcx, 0)
    103   push %rdx
    104   CFI_ADJUST_CFA_OFFSET(8)
    105   CFI_REL_OFFSET(%rdx, 0)
    106   push %rsi
    107   CFI_ADJUST_CFA_OFFSET(8)
    108   CFI_REL_OFFSET(%rsi, 0)
    109   push %rdi
    110   CFI_ADJUST_CFA_OFFSET(8)
    111   CFI_REL_OFFSET(%rdi, 0)
    112   push %r8
    113   CFI_ADJUST_CFA_OFFSET(8)
    114   CFI_REL_OFFSET(%r8, 0)
    115   push %r9
    116   CFI_ADJUST_CFA_OFFSET(8)
    117   CFI_REL_OFFSET(%r9, 0)
    118   push %r10
    119   CFI_ADJUST_CFA_OFFSET(8)
    120   CFI_REL_OFFSET(%r10, 0)
    121   push %r11
    122   CFI_ADJUST_CFA_OFFSET(8)
    123   CFI_REL_OFFSET(%r11, 0)
    124   # Align stack frame.
    125   push %rbx  # non-scratch
    126   CFI_ADJUST_CFA_OFFSET(8)
    127   CFI_REL_OFFSET(%rbx, 0)
    128   mov %rsp, %rbx  # save current rsp
    129   CFI_DEF_CFA_REGISTER(%rbx)
    130   shr $4, %rsp  # clear 4 lsb, align to 16
    131   shl $4, %rsp
    132 
    133   call ASM_SYMBOL(__tsan_report_race)
    134 
    135   # Unalign stack frame back.
    136   mov %rbx, %rsp  # restore the original rsp
    137   CFI_DEF_CFA_REGISTER(%rsp)
    138   pop %rbx
    139   CFI_ADJUST_CFA_OFFSET(-8)
    140   # Restore scratch registers.
    141   pop %r11
    142   CFI_ADJUST_CFA_OFFSET(-8)
    143   pop %r10
    144   CFI_ADJUST_CFA_OFFSET(-8)
    145   pop %r9
    146   CFI_ADJUST_CFA_OFFSET(-8)
    147   pop %r8
    148   CFI_ADJUST_CFA_OFFSET(-8)
    149   pop %rdi
    150   CFI_ADJUST_CFA_OFFSET(-8)
    151   pop %rsi
    152   CFI_ADJUST_CFA_OFFSET(-8)
    153   pop %rdx
    154   CFI_ADJUST_CFA_OFFSET(-8)
    155   pop %rcx
    156   CFI_ADJUST_CFA_OFFSET(-8)
    157   pop %rax
    158   CFI_ADJUST_CFA_OFFSET(-8)
    159   CFI_RESTORE(%rax)
    160   CFI_RESTORE(%rbx)
    161   CFI_RESTORE(%rcx)
    162   CFI_RESTORE(%rdx)
    163   CFI_RESTORE(%rsi)
    164   CFI_RESTORE(%rdi)
    165   CFI_RESTORE(%r8)
    166   CFI_RESTORE(%r9)
    167   CFI_RESTORE(%r10)
    168   CFI_RESTORE(%r11)
    169   ret
    170   CFI_ENDPROC
    171 
    172 ASM_HIDDEN(__tsan_setjmp)
    173 #if defined(__NetBSD__)
    174 .comm _ZN14__interception15real___setjmp14E,8,8
    175 #elif !defined(__APPLE__)
    176 .comm _ZN14__interception11real_setjmpE,8,8
    177 #endif
    178 #if defined(__NetBSD__)
    179 .globl ASM_SYMBOL_INTERCEPTOR(__setjmp14)
    180 ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(__setjmp14))
    181 ASM_SYMBOL_INTERCEPTOR(__setjmp14):
    182 #else
    183 .globl ASM_SYMBOL_INTERCEPTOR(setjmp)
    184 ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(setjmp))
    185 ASM_SYMBOL_INTERCEPTOR(setjmp):
    186 #endif
    187   CFI_STARTPROC
    188   // save env parameter
    189   push %rdi
    190   CFI_ADJUST_CFA_OFFSET(8)
    191   CFI_REL_OFFSET(%rdi, 0)
    192   // obtain %rsp
    193 #if defined(__FreeBSD__) || defined(__NetBSD__)
    194   lea 8(%rsp), %rdi
    195   mov %rdi, %rsi
    196 #elif defined(__APPLE__)
    197   lea 16(%rsp), %rdi
    198   mov %rdi, %rsi
    199   xorq ___tsan_darwin_setjmp_xor_key(%rip), %rsi
    200 #elif defined(__linux__)
    201   lea 16(%rsp), %rdi
    202   mov %rdi, %rsi
    203   xor %fs:0x30, %rsi  // magic mangling of rsp (see libc setjmp)
    204   rol $0x11, %rsi
    205 #else
    206 # error "Unknown platform"
    207 #endif
    208   // call tsan interceptor
    209   call ASM_SYMBOL(__tsan_setjmp)
    210   // restore env parameter
    211   pop %rdi
    212   CFI_ADJUST_CFA_OFFSET(-8)
    213   CFI_RESTORE(%rdi)
    214   // tail jump to libc setjmp
    215   movl $0, %eax
    216 #if defined(__NetBSD__)
    217   movq _ZN14__interception15real___setjmp14E@GOTPCREL(%rip), %rdx
    218   jmp *(%rdx)
    219 #elif !defined(__APPLE__)
    220   movq _ZN14__interception11real_setjmpE@GOTPCREL(%rip), %rdx
    221   jmp *(%rdx)
    222 #else
    223   jmp ASM_SYMBOL(setjmp)
    224 #endif
    225   CFI_ENDPROC
    226 #if defined(__NetBSD__)
    227 ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(__setjmp14))
    228 #else
    229 ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(setjmp))
    230 #endif
    231 
    232 .comm _ZN14__interception12real__setjmpE,8,8
    233 .globl ASM_SYMBOL_INTERCEPTOR(_setjmp)
    234 ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(_setjmp))
    235 ASM_SYMBOL_INTERCEPTOR(_setjmp):
    236   CFI_STARTPROC
    237   // save env parameter
    238   push %rdi
    239   CFI_ADJUST_CFA_OFFSET(8)
    240   CFI_REL_OFFSET(%rdi, 0)
    241   // obtain %rsp
    242 #if defined(__FreeBSD__) || defined(__NetBSD__)
    243   lea 8(%rsp), %rdi
    244   mov %rdi, %rsi
    245 #elif defined(__APPLE__)
    246   lea 16(%rsp), %rdi
    247   mov %rdi, %rsi
    248   xorq ___tsan_darwin_setjmp_xor_key(%rip), %rsi
    249 #elif defined(__linux__)
    250   lea 16(%rsp), %rdi
    251   mov %rdi, %rsi
    252   xor %fs:0x30, %rsi  // magic mangling of rsp (see libc setjmp)
    253   rol $0x11, %rsi
    254 #else
    255 # error "Unknown platform"
    256 #endif
    257   // call tsan interceptor
    258   call ASM_SYMBOL(__tsan_setjmp)
    259   // restore env parameter
    260   pop %rdi
    261   CFI_ADJUST_CFA_OFFSET(-8)
    262   CFI_RESTORE(%rdi)
    263   // tail jump to libc setjmp
    264   movl $0, %eax
    265 #if !defined(__APPLE__)
    266   movq _ZN14__interception12real__setjmpE@GOTPCREL(%rip), %rdx
    267   jmp *(%rdx)
    268 #else
    269   jmp ASM_SYMBOL(_setjmp)
    270 #endif
    271   CFI_ENDPROC
    272 ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(_setjmp))
    273 
    274 #if defined(__NetBSD__)
    275 .comm _ZN14__interception18real___sigsetjmp14E,8,8
    276 .globl ASM_SYMBOL_INTERCEPTOR(__sigsetjmp14)
    277 ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp14))
    278 ASM_SYMBOL_INTERCEPTOR(__sigsetjmp14):
    279 #else
    280 .comm _ZN14__interception14real_sigsetjmpE,8,8
    281 .globl ASM_SYMBOL_INTERCEPTOR(sigsetjmp)
    282 ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(sigsetjmp))
    283 ASM_SYMBOL_INTERCEPTOR(sigsetjmp):
    284 #endif
    285   CFI_STARTPROC
    286   // save env parameter
    287   push %rdi
    288   CFI_ADJUST_CFA_OFFSET(8)
    289   CFI_REL_OFFSET(%rdi, 0)
    290   // save savesigs parameter
    291   push %rsi
    292   CFI_ADJUST_CFA_OFFSET(8)
    293   CFI_REL_OFFSET(%rsi, 0)
    294   // align stack frame
    295   sub $8, %rsp
    296   CFI_ADJUST_CFA_OFFSET(8)
    297   // obtain %rsp
    298 #if defined(__FreeBSD__) || defined(__NetBSD__)
    299   lea 24(%rsp), %rdi
    300   mov %rdi, %rsi
    301 #elif defined(__APPLE__)
    302   lea 32(%rsp), %rdi
    303   mov %rdi, %rsi
    304   xorq ___tsan_darwin_setjmp_xor_key(%rip), %rsi
    305 #elif defined(__linux__)
    306   lea 32(%rsp), %rdi
    307   mov %rdi, %rsi
    308   xor %fs:0x30, %rsi  // magic mangling of rsp (see libc setjmp)
    309   rol $0x11, %rsi
    310 #else
    311 # error "Unknown platform"
    312 #endif
    313   // call tsan interceptor
    314   call ASM_SYMBOL(__tsan_setjmp)
    315   // unalign stack frame
    316   add $8, %rsp
    317   CFI_ADJUST_CFA_OFFSET(-8)
    318   // restore savesigs parameter
    319   pop %rsi
    320   CFI_ADJUST_CFA_OFFSET(-8)
    321   CFI_RESTORE(%rsi)
    322   // restore env parameter
    323   pop %rdi
    324   CFI_ADJUST_CFA_OFFSET(-8)
    325   CFI_RESTORE(%rdi)
    326   // tail jump to libc sigsetjmp
    327   movl $0, %eax
    328 #if defined(__NetBSD__)
    329   movq _ZN14__interception18real___sigsetjmp14E@GOTPCREL(%rip), %rdx
    330   jmp *(%rdx)
    331 #elif !defined(__APPLE__)
    332   movq _ZN14__interception14real_sigsetjmpE@GOTPCREL(%rip), %rdx
    333   jmp *(%rdx)
    334 #else
    335   jmp ASM_SYMBOL(sigsetjmp)
    336 #endif
    337   CFI_ENDPROC
    338 #if defined(__NetBSD__)
    339 ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp14))
    340 #else
    341 ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(sigsetjmp))
    342 #endif
    343 
    344 #if !defined(__APPLE__) && !defined(__NetBSD__)
    345 .comm _ZN14__interception16real___sigsetjmpE,8,8
    346 .globl ASM_SYMBOL_INTERCEPTOR(__sigsetjmp)
    347 ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp))
    348 ASM_SYMBOL_INTERCEPTOR(__sigsetjmp):
    349   CFI_STARTPROC
    350   // save env parameter
    351   push %rdi
    352   CFI_ADJUST_CFA_OFFSET(8)
    353   CFI_REL_OFFSET(%rdi, 0)
    354   // save savesigs parameter
    355   push %rsi
    356   CFI_ADJUST_CFA_OFFSET(8)
    357   CFI_REL_OFFSET(%rsi, 0)
    358   // align stack frame
    359   sub $8, %rsp
    360   CFI_ADJUST_CFA_OFFSET(8)
    361   // obtain %rsp
    362 #if defined(__FreeBSD__)
    363   lea 24(%rsp), %rdi
    364   mov %rdi, %rsi
    365 #else
    366   lea 32(%rsp), %rdi
    367   mov %rdi, %rsi
    368   xor %fs:0x30, %rsi  // magic mangling of rsp (see libc setjmp)
    369   rol $0x11, %rsi
    370 #endif
    371   // call tsan interceptor
    372   call ASM_SYMBOL(__tsan_setjmp)
    373   // unalign stack frame
    374   add $8, %rsp
    375   CFI_ADJUST_CFA_OFFSET(-8)
    376   // restore savesigs parameter
    377   pop %rsi
    378   CFI_ADJUST_CFA_OFFSET(-8)
    379   CFI_RESTORE(%rsi)
    380   // restore env parameter
    381   pop %rdi
    382   CFI_ADJUST_CFA_OFFSET(-8)
    383   CFI_RESTORE(%rdi)
    384   // tail jump to libc sigsetjmp
    385   movl $0, %eax
    386   movq _ZN14__interception16real___sigsetjmpE@GOTPCREL(%rip), %rdx
    387   jmp *(%rdx)
    388   CFI_ENDPROC
    389 ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp))
    390 #endif  // !defined(__APPLE__) && !defined(__NetBSD__)
    391 
    392 #if defined(__FreeBSD__) || defined(__linux__)
    393 /* We do not need executable stack.  */
    394 /* This note is not needed on NetBSD. */
    395 .section        .note.GNU-stack,"",@progbits
    396 #endif
    397 
    398 #endif
    399