aboutsummaryrefslogtreecommitdiff
path: root/lib/tsan/rtl/tsan_rtl_amd64.S
blob: 2028ec5086111a9f05021a31a8c8eb6883e9f58a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
.section .text

.globl __tsan_trace_switch_thunk
__tsan_trace_switch_thunk:
  # Save scratch registers.
  push %rax
  push %rcx
  push %rdx
  push %rsi
  push %rdi
  push %r8
  push %r9
  push %r10
  push %r11
  # Align stack frame.
  push %rbx  # non-scratch
  mov %rsp, %rbx  # save current rsp
  shr $4, %rsp  # clear 4 lsb, align to 16
  shl $4, %rsp

  call __tsan_trace_switch

  # Unalign stack frame back.
  mov %rbx, %rsp  # restore the original rsp
  pop %rbx
  # Restore scratch registers.
  pop %r11
  pop %r10
  pop %r9
  pop %r8
  pop %rdi
  pop %rsi
  pop %rdx
  pop %rcx
  pop %rax
  ret

.globl __tsan_report_race_thunk
__tsan_report_race_thunk:
  # Save scratch registers.
  push %rax
  push %rcx
  push %rdx
  push %rsi
  push %rdi
  push %r8
  push %r9
  push %r10
  push %r11
  # Align stack frame.
  push %rbx  # non-scratch
  mov %rsp, %rbx  # save current rsp
  shr $4, %rsp  # clear 4 lsb, align to 16
  shl $4, %rsp

  call __tsan_report_race

  # Unalign stack frame back.
  mov %rbx, %rsp  # restore the original rsp
  pop %rbx
  # Restore scratch registers.
  pop %r11
  pop %r10
  pop %r9
  pop %r8
  pop %rdi
  pop %rsi
  pop %rdx
  pop %rcx
  pop %rax
  ret