]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/compiler-rt/lib/xray/xray_trampoline_x86_64.S
Pull down pjdfstest 0.1
[FreeBSD/FreeBSD.git] / contrib / compiler-rt / lib / xray / xray_trampoline_x86_64.S
1 //===-- xray_trampoline_x86.s -----------------------------------*- ASM -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file is a part of XRay, a dynamic runtime instrumentation system.
11 //
12 // This implements the X86-specific assembler for the trampolines.
13 //
14 //===----------------------------------------------------------------------===//
15
16 .macro SAVE_REGISTERS
17         subq $200, %rsp
18         movupd  %xmm0, 184(%rsp)
19         movupd  %xmm1, 168(%rsp)
20         movupd  %xmm2, 152(%rsp)
21         movupd  %xmm3, 136(%rsp)
22         movupd  %xmm4, 120(%rsp)
23         movupd  %xmm5, 104(%rsp)
24         movupd  %xmm6, 88(%rsp)
25         movupd  %xmm7, 72(%rsp)
26         movq    %rdi, 64(%rsp)
27         movq    %rax, 56(%rsp)
28         movq    %rdx, 48(%rsp)
29         movq    %rsi, 40(%rsp)
30         movq    %rcx, 32(%rsp)
31         movq    %r8, 24(%rsp)
32         movq    %r9, 16(%rsp)
33 .endm
34
35 .macro RESTORE_REGISTERS
36         movupd  184(%rsp), %xmm0
37         movupd  168(%rsp), %xmm1
38         movupd  152(%rsp), %xmm2
39         movupd  136(%rsp), %xmm3
40         movupd  120(%rsp), %xmm4
41         movupd  104(%rsp), %xmm5
42         movupd  88(%rsp) , %xmm6
43         movupd  72(%rsp) , %xmm7
44         movq    64(%rsp), %rdi
45         movq    56(%rsp), %rax
46         movq    48(%rsp), %rdx
47         movq    40(%rsp), %rsi
48         movq    32(%rsp), %rcx
49         movq    24(%rsp), %r8
50         movq    16(%rsp), %r9
51         addq    $200, %rsp
52 .endm
53
54         .text
55         .file "xray_trampoline_x86.S"
56         .globl __xray_FunctionEntry
57         .align 16, 0x90
58         .type __xray_FunctionEntry,@function
59
60 __xray_FunctionEntry:
61         .cfi_startproc
62         pushq %rbp
63         .cfi_def_cfa_offset 16
64         SAVE_REGISTERS
65
66         // This load has to be atomic, it's concurrent with __xray_patch().
67         // On x86/amd64, a simple (type-aligned) MOV instruction is enough.
68         movq    _ZN6__xray19XRayPatchedFunctionE(%rip), %rax
69         testq   %rax, %rax
70         je      .Ltmp0
71
72         // The patched function prolog puts its xray_instr_map index into %r10d.
73         movl    %r10d, %edi
74         xor     %esi,%esi
75         callq   *%rax
76 .Ltmp0:
77         RESTORE_REGISTERS
78         popq    %rbp
79         retq
80 .Ltmp1:
81         .size __xray_FunctionEntry, .Ltmp1-__xray_FunctionEntry
82         .cfi_endproc
83
84         .globl __xray_FunctionExit
85         .align 16, 0x90
86         .type __xray_FunctionExit,@function
87 __xray_FunctionExit:
88         .cfi_startproc
89         // Save the important registers first. Since we're assuming that this
90         // function is only jumped into, we only preserve the registers for
91         // returning.
92         pushq   %rbp
93         .cfi_def_cfa_offset 16
94         subq    $56, %rsp
95         .cfi_def_cfa_offset 32
96         movupd  %xmm0, 40(%rsp)
97         movupd  %xmm1, 24(%rsp)
98         movq    %rax, 16(%rsp)
99         movq    %rdx, 8(%rsp)
100         movq    _ZN6__xray19XRayPatchedFunctionE(%rip), %rax
101         testq %rax,%rax
102         je      .Ltmp2
103
104         movl    %r10d, %edi
105         movl    $1, %esi
106         callq   *%rax
107 .Ltmp2:
108         // Restore the important registers.
109         movupd  40(%rsp), %xmm0
110         movupd  24(%rsp), %xmm1
111         movq    16(%rsp), %rax
112         movq    8(%rsp), %rdx
113         addq    $56, %rsp
114         popq    %rbp
115         retq
116 .Ltmp3:
117         .size __xray_FunctionExit, .Ltmp3-__xray_FunctionExit
118         .cfi_endproc
119
120         .global __xray_FunctionTailExit
121         .align 16, 0x90
122         .type __xray_FunctionTailExit,@function
123 __xray_FunctionTailExit:
124         .cfi_startproc
125         // Save the important registers as in the entry trampoline, but indicate that
126         // this is an exit. In the future, we will introduce a new entry type that
127         // differentiates between a normal exit and a tail exit, but we'd have to do
128         // this and increment the version number for the header.
129         pushq %rbp
130         .cfi_def_cfa_offset 16
131         SAVE_REGISTERS
132
133         movq    _ZN6__xray19XRayPatchedFunctionE(%rip), %rax
134         testq %rax,%rax
135         je      .Ltmp4
136
137         movl    %r10d, %edi
138         movl    $1, %esi
139         callq   *%rax
140
141 .Ltmp4:
142         RESTORE_REGISTERS
143         popq    %rbp
144         retq
145 .Ltmp5:
146         .size __xray_FunctionTailExit, .Ltmp5-__xray_FunctionTailExit
147         .cfi_endproc