annotate usr/src/cmd/sgs/rtld/amd64/boot_elf.s @ 2133:f845bbe77e56

6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
author ab196087
date Tue, 06 Jun 2006 12:55:51 -0700
parents 68f95e015346
children 685e2f65770b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
4 * The contents of this file are subject to the terms of the
2133
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
5 * Common Development and Distribution License (the "License").
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
6 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
7 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
9 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
10 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
11 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
12 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
13 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
15 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
16 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
17 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
18 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
19 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
20 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
21 /*
2133
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
22 * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
23 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
24 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
25 #pragma ident "%Z%%M% %I% %E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
26
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
27 #if defined(lint)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
28
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
29 #include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
30 #include <_rtld.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
31 #include <_audit.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
32 #include <_elf.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
33 #include <sys/regset.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
34
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
35 /* ARGSUSED0 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
36 int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
37 elf_plt_trace()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
38 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
39 return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
40 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
41 #else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
42
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
43 #include <link.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
44 #include <_audit.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
45 #include <sys/asm_linkage.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
46
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
47 .file "boot_elf.s"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
48 .text
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
49
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
50 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
51 * On entry the 'glue code' has already done the following:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
52 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
53 * pushq %rbp
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
54 * movq %rsp, %rbp
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
55 * subq $0x10, %rsp
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
56 * leaq trace_fields(%rip), %r11
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
57 * movq %r11, -0x8(%rbp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
58 * movq $elf_plt_trace, %r11
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
59 * jmp *%r11
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
60 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
61 * so - -8(%rbp) contains the dyndata ptr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
62 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
63 * 0x0 Addr *reflmp
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
64 * 0x8 Addr *deflmp
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
65 * 0x10 Word symndx
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
66 * 0x14 Word sb_flags
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
67 * 0x18 Sym symdef.st_name
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
68 * 0x1c symdef.st_info
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
69 * 0x1d symdef.st_other
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
70 * 0x1e symdef.st_shndx
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
71 * 0x20 symdef.st_value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
72 * 0x28 symdef.st_size
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
73 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
74 * Also note - on entry 16 bytes have already been subtracted
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
75 * from the %rsp. The first 8 bytes is for the dyn_data_ptr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
76 * the second 8 bytes are to align the stack and are available
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
77 * for use.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
78 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
79 #define REFLMP_OFF 0x0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
80 #define DEFLMP_OFF 0x8
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
81 #define SYMNDX_OFF 0x10
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
82 #define SBFLAGS_OFF 0x14
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
83 #define SYMDEF_OFF 0x18
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
84 #define SYMDEF_VALUE_OFF 0x20
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
85 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
86 * Local stack space storage for elf_plt_trace is allocated
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
87 * as follows:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
88 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
89 * First - before we got here - %rsp has been decremented
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
90 * by 0x10 to make space for the dyndata ptr (and another
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
91 * free word). In addition to that, we create space
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
92 * for the following:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
93 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
94 * La_amd64_regs 8 * 8: 64
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
95 * prev_stack_size 8 8
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
96 * Saved regs:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
97 * %rdi 8
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
98 * %rsi 8
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
99 * %rdx 8
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
100 * %rcx 8
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
101 * %r8 8
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
102 * %r9 8
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
103 * %r10 8
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
104 * %r11 8
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
105 * %rax 8
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
106 * =======
2133
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
107 * Subtotal: 144 (16byte aligned)
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
108 *
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
109 * Saved Media Regs (used to pass floating point args):
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
110 * %xmm0 - %xmm7 16 * 8: 128
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
111 * =======
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
112 * Total: 272 (16byte aligned)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
113 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
114 * So - will subtract the following to create enough space
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
115 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
116 * -8(%rbp) store dyndata ptr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
117 * -16(%rbp) store call destination
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
118 * -80(%rbp) space for La_amd64_regs
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
119 * -88(%rbp) prev stack size
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
120 * -96(%rbp) entering %rdi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
121 * -104(%rbp) entering %rsi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
122 * -112(%rbp) entering %rdx
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
123 * -120(%rbp) entering %rcx
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
124 * -128(%rbp) entering %r8
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
125 * -136(%rbp) entering %r9
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
126 * -144(%rbp) entering %r10
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
127 * -152(%rbp) entering %r11
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
128 * -160(%rax) entering %rax
2133
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
129 * -176(%xmm0) entering %xmm0
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
130 * -192(%xmm1) entering %xmm1
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
131 * -208(%xmm2) entering %xmm2
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
132 * -224(%xmm3) entering %xmm3
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
133 * -240(%xmm4) entering %xmm4
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
134 * -256(%xmm5) entering %xmm5
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
135 * -272(%xmm6) entering %xmm6
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
136 * -288(%xmm7) entering %xmm7
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
137 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
138 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
139 #define SPDYNOFF -8
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
140 #define SPDESTOFF -16
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
141 #define SPLAREGOFF -80
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
142 #define SPPRVSTKOFF -88
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
143 #define SPRDIOFF -96
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
144 #define SPRSIOFF -104
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
145 #define SPRDXOFF -112
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
146 #define SPRCXOFF -120
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
147 #define SPR8OFF -128
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
148 #define SPR9OFF -136
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
149 #define SPR10OFF -144
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
150 #define SPR11OFF -152
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
151 #define SPRAXOFF -160
2133
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
152 #define SPXMM0OFF -176
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
153 #define SPXMM1OFF -192
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
154 #define SPXMM2OFF -208
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
155 #define SPXMM3OFF -224
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
156 #define SPXMM4OFF -240
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
157 #define SPXMM5OFF -256
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
158 #define SPXMM6OFF -272
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
159 #define SPXMM7OFF -288
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
160
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
161 .globl elf_plt_trace
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
162 .type elf_plt_trace,@function
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
163 .align 16
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
164 elf_plt_trace:
2133
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
165 subq $272,%rsp / create some local storage
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
166 movq %rdi, SPRDIOFF(%rbp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
167 movq %rsi, SPRSIOFF(%rbp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
168 movq %rdx, SPRDXOFF(%rbp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
169 movq %rcx, SPRCXOFF(%rbp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
170 movq %r8, SPR8OFF(%rbp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
171 movq %r9, SPR9OFF(%rbp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
172 movq %r10, SPR10OFF(%rbp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
173 movq %r11, SPR11OFF(%rbp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
174 movq %rax, SPRAXOFF(%rbp)
2133
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
175 movdqa %xmm0, SPXMM0OFF(%rbp)
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
176 movdqa %xmm1, SPXMM1OFF(%rbp)
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
177 movdqa %xmm2, SPXMM2OFF(%rbp)
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
178 movdqa %xmm3, SPXMM3OFF(%rbp)
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
179 movdqa %xmm4, SPXMM4OFF(%rbp)
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
180 movdqa %xmm5, SPXMM5OFF(%rbp)
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
181 movdqa %xmm6, SPXMM6OFF(%rbp)
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
182 movdqa %xmm7, SPXMM7OFF(%rbp)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
183
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
184 movq SPDYNOFF(%rbp), %rax / %rax = dyndata
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
185 testb $LA_SYMB_NOPLTENTER, SBFLAGS_OFF(%rax) / <link.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
186 je .start_pltenter
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
187 movq SYMDEF_VALUE_OFF(%rax), %rdi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
188 movq %rdi, SPDESTOFF(%rbp) / save destination address
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
189 jmp .end_pltenter
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
190
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
191 .start_pltenter:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
192 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
193 * save all registers into La_amd64_regs
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
194 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
195 leaq SPLAREGOFF(%rbp), %rsi / %rsi = &La_amd64_regs
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
196 leaq 8(%rbp), %rdi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
197 movq %rdi, 0(%rsi) / la_rsp
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
198 movq 0(%rbp), %rdi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
199 movq %rdi, 8(%rsi) / la_rbp
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
200 movq SPRDIOFF(%rbp), %rdi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
201 movq %rdi, 16(%rsi) / la_rdi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
202 movq SPRSIOFF(%rbp), %rdi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
203 movq %rdi, 24(%rsi) / la_rsi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
204 movq SPRDXOFF(%rbp), %rdi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
205 movq %rdi, 32(%rsi) / la_rdx
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
206 movq SPRCXOFF(%rbp), %rdi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
207 movq %rdi, 40(%rsi) / la_rcx
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
208 movq SPR8OFF(%rbp), %rdi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
209 movq %rdi, 48(%rsi) / la_r8
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
210 movq SPR9OFF(%rbp), %rdi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
211 movq %rdi, 56(%rsi) / la_r9
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
212
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
213 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
214 * prepare for call to la_pltenter
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
215 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
216 movq SPDYNOFF(%rbp), %r11 / %r11 = &dyndata
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
217 leaq SBFLAGS_OFF(%r11), %r9 / arg6 (&sb_flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
218 leaq SPLAREGOFF(%rbp), %r8 / arg5 (&La_amd64_regs)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
219 movl SYMNDX_OFF(%r11), %ecx / arg4 (symndx)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
220 leaq SYMDEF_OFF(%r11), %rdx / arg3 (&Sym)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
221 movq DEFLMP_OFF(%r11), %rsi / arg2 (dlmp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
222 movq REFLMP_OFF(%r11), %rdi / arg1 (rlmp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
223 call audit_pltenter@PLT
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
224 movq %rax, SPDESTOFF(%rbp) / save calling address
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
225 .end_pltenter:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
226
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
227 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
228 * If *no* la_pltexit() routines exist
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
229 * we do not need to keep the stack frame
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
230 * before we call the actual routine. Instead we
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
231 * jump to it and remove our stack from the stack
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
232 * at the same time.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
233 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
234 movl audit_flags(%rip), %eax
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
235 andl $AF_PLTEXIT, %eax / value of audit.h:AF_PLTEXIT
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
236 cmpl $0, %eax
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
237 je .bypass_pltexit
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
238 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
239 * Has the *nopltexit* flag been set for this entry point
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
240 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
241 movq SPDYNOFF(%rbp), %r11 / %r11 = &dyndata
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
242 testb $LA_SYMB_NOPLTEXIT, SBFLAGS_OFF(%r11)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
243 je .start_pltexit
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
244
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
245 .bypass_pltexit:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
246 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
247 * No PLTEXIT processing required.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
248 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
249 movq 0(%rbp), %r11
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
250 movq %r11, -8(%rbp) / move prev %rbp
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
251 movq SPDESTOFF(%rbp), %r11 / r11 == calling destination
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
252 movq %r11, 0(%rbp) / store destination at top
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
253
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
254 /
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
255 / Restore registers
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
256 /
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
257 movq SPRDIOFF(%rbp), %rdi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
258 movq SPRSIOFF(%rbp), %rsi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
259 movq SPRDXOFF(%rbp), %rdx
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
260 movq SPRCXOFF(%rbp), %rcx
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
261 movq SPR8OFF(%rbp), %r8
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
262 movq SPR9OFF(%rbp), %r9
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
263 movq SPR10OFF(%rbp), %r10
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
264 movq SPR11OFF(%rbp), %r11
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
265 movq SPRAXOFF(%rbp), %rax
2133
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
266 movdqa SPXMM0OFF(%rbp), %xmm0
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
267 movdqa SPXMM1OFF(%rbp), %xmm1
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
268 movdqa SPXMM2OFF(%rbp), %xmm2
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
269 movdqa SPXMM3OFF(%rbp), %xmm3
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
270 movdqa SPXMM4OFF(%rbp), %xmm4
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
271 movdqa SPXMM5OFF(%rbp), %xmm5
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
272 movdqa SPXMM6OFF(%rbp), %xmm6
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
273 movdqa SPXMM7OFF(%rbp), %xmm7
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
274
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
275 subq $8, %rbp / adjust %rbp for 'ret'
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
276 movq %rbp, %rsp /
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
277 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
278 * At this point, after a little doctoring, we should
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
279 * have the following on the stack:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
280 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
281 * 16(%rsp): ret addr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
282 * 8(%rsp): dest_addr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
283 * 0(%rsp): Previous %rbp
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
284 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
285 * So - we pop the previous %rbp, and then
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
286 * ret to our final destination.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
287 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
288 popq %rbp /
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
289 ret / jmp to final destination
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
290 / and clean up stack :)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
291
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
292 .start_pltexit:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
293 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
294 * In order to call the destination procedure and then return
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
295 * to audit_pltexit() for post analysis we must first grow
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
296 * our stack frame and then duplicate the original callers
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
297 * stack state. This duplicates all of the arguements
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
298 * that were to be passed to the destination procedure.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
299 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
300 movq %rbp, %rdi /
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
301 addq $16, %rdi / %rdi = src
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
302 movq (%rbp), %rdx /
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
303 subq %rdi, %rdx / %rdx == prev frame sz
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
304 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
305 * If audit_argcnt > 0 then we limit the number of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
306 * arguements that will be duplicated to audit_argcnt.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
307 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
308 * If (prev_stack_size > (audit_argcnt * 8))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
309 * prev_stack_size = audit_argcnt * 8;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
310 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
311 movl audit_argcnt(%rip),%eax / %eax = audit_argcnt
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
312 cmpl $0, %eax
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
313 jle .grow_stack
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
314 leaq (,%rax,8), %rax / %eax = %eax * 4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
315 cmpq %rax,%rdx
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
316 jle .grow_stack
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
317 movq %rax, %rdx
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
318 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
319 * Grow the stack and duplicate the arguements of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
320 * original caller.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
321 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
322 .grow_stack:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
323 subq %rdx, %rsp / grow the stack
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
324 movq %rdx, SPPRVSTKOFF(%rbp) / -88(%rbp) == prev frame sz
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
325 movq %rsp, %rcx / %rcx = dest
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
326 addq %rcx, %rdx / %rdx == tail of dest
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
327 .while_base:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
328 cmpq %rdx, %rcx / while (base+size >= src++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
329 jge .end_while /
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
330 movq (%rdi), %rsi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
331 movq %rsi,(%rcx) / *dest = *src
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
332 addq $8, %rdi / src++
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
333 addq $8, %rcx / dest++
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
334 jmp .while_base / }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
335
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
336 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
337 * The above stack is now an exact duplicate of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
338 * the stack of the original calling procedure.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
339 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
340 .end_while:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
341 /
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
342 / Restore registers
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
343 /
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
344 movq SPRDIOFF(%rbp), %rdi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
345 movq SPRSIOFF(%rbp), %rsi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
346 movq SPRDXOFF(%rbp), %rdx
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
347 movq SPRCXOFF(%rbp), %rcx
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
348 movq SPR8OFF(%rbp), %r8
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
349 movq SPR9OFF(%rbp), %r9
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
350 movq SPR10OFF(%rbp), %r10
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
351 movq SPR11OFF(%rbp), %r11
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
352 movq SPRAXOFF(%rbp), %rax
2133
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
353 movdqa SPXMM0OFF(%rbp), %xmm0
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
354 movdqa SPXMM1OFF(%rbp), %xmm1
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
355 movdqa SPXMM2OFF(%rbp), %xmm2
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
356 movdqa SPXMM3OFF(%rbp), %xmm3
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
357 movdqa SPXMM4OFF(%rbp), %xmm4
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
358 movdqa SPXMM5OFF(%rbp), %xmm5
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
359 movdqa SPXMM6OFF(%rbp), %xmm6
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
360 movdqa SPXMM7OFF(%rbp), %xmm7
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
361
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
362 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
363 * Call to desitnation function - we'll return here
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
364 * for pltexit monitoring.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
365 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
366 call *SPDESTOFF(%rbp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
367
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
368 addq SPPRVSTKOFF(%rbp), %rsp / cleanup dupped stack
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
369
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
370 /
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
371 / prepare for call to audit_pltenter()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
372 /
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
373 movq SPDYNOFF(%rbp), %r11 / %r11 = &dyndata
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
374 movq SYMNDX_OFF(%r11), %r8 / arg5 (symndx)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
375 leaq SYMDEF_OFF(%r11), %rcx / arg4 (&Sym)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
376 movq DEFLMP_OFF(%r11), %rdx / arg3 (dlmp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
377 movq REFLMP_OFF(%r11), %rsi / arg2 (rlmp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
378 movq %rax, %rdi / arg1 (returnval)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
379 call audit_pltexit@PLT
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
380
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
381 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
382 * Clean up after ourselves and return to the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
383 * original calling procedure.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
384 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
385
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
386 /
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
387 / Restore registers
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
388 /
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
389 movq SPRDIOFF(%rbp), %rdi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
390 movq SPRSIOFF(%rbp), %rsi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
391 movq SPRDXOFF(%rbp), %rdx
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
392 movq SPRCXOFF(%rbp), %rcx
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
393 movq SPR8OFF(%rbp), %r8
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
394 movq SPR9OFF(%rbp), %r9
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
395 movq SPR10OFF(%rbp), %r10
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
396 movq SPR11OFF(%rbp), %r11
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
397 // rax already contains return value
2133
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
398 movdqa SPXMM0OFF(%rbp), %xmm0
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
399 movdqa SPXMM1OFF(%rbp), %xmm1
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
400 movdqa SPXMM2OFF(%rbp), %xmm2
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
401 movdqa SPXMM3OFF(%rbp), %xmm3
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
402 movdqa SPXMM4OFF(%rbp), %xmm4
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
403 movdqa SPXMM5OFF(%rbp), %xmm5
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
404 movdqa SPXMM6OFF(%rbp), %xmm6
f845bbe77e56 6431835 data corruption on x64 in 64-bit mode while LD_PROFILE is in effect
ab196087
parents: 0
diff changeset
405 movdqa SPXMM7OFF(%rbp), %xmm7
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
406
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
407 movq %rbp, %rsp /
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
408 popq %rbp /
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
409 ret / return to caller
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
410 .size elf_plt_trace, .-elf_plt_trace
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
411 #endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
412
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
413 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
414 * We got here because a call to a function resolved to a procedure
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
415 * linkage table entry. That entry did a JMPL to the first PLT entry, which
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
416 * in turn did a call to elf_rtbndr.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
417 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
418 * the code sequence that got us here was:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
419 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
420 * .PLT0:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
421 * pushq GOT+8(%rip) #GOT[1]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
422 * jmp *GOT+16(%rip) #GOT[2]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
423 * nop
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
424 * nop
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
425 * nop
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
426 * nop
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
427 * ...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
428 * PLT entry for foo:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
429 * jmp *name1@GOTPCREL(%rip)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
430 * pushl $rel.plt.foo
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
431 * jmp PLT0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
432 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
433 * At entry, the stack looks like this:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
434 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
435 * return address 16(%rsp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
436 * $rel.plt.foo (plt index) 8(%rsp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
437 * lmp 0(%rsp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
438 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
439 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
440 #if defined(lint)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
441
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
442 extern unsigned long elf_bndr(Rt_map *, unsigned long, caddr_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
443
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
444 void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
445 elf_rtbndr(Rt_map * lmp, unsigned long reloc, caddr_t pc)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
446 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
447 (void) elf_bndr(lmp, reloc, pc);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
448 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
449
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
450 #else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
451 .weak _elf_rtbndr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
452 _elf_rtbndr = elf_rtbndr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
453
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
454 ENTRY(elf_rtbndr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
455
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
456 pushq %rbp
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
457 movq %rsp, %rbp
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
458
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
459 pushq %rax /* for SSE register count */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
460 pushq %rdi /* arg 0 .. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
461 pushq %rsi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
462 pushq %rdx
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
463 pushq %rcx
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
464 pushq %r8
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
465 pushq %r9 /* .. arg 5 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
466 pushq %r10 /* call chain reg */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
467
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
468 movq 8(%rbp), %rdi /* arg1 - *lmp */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
469 movq 16(%rbp), %rsi /* arg2 - reloc index */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
470 movq 24(%rbp), %rdx /* arg3 - pc of caller */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
471 call elf_bndr@PLT /* call elf_rtbndr(lmp, relndx, pc) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
472 movq %rax, 16(%rbp) /* store final destination */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
473
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
474 popq %r10
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
475 popq %r9
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
476 popq %r8
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
477 popq %rcx
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
478 popq %rdx
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
479 popq %rsi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
480 popq %rdi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
481 popq %rax
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
482
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
483 movq %rbp, %rsp
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
484 popq %rbp
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
485
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
486 addq $8, %rsp /* pop 1st plt-pushed args */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
487 /* the second arguement is used */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
488 /* for the 'return' address to our */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
489 /* final destination */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
490
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
491 ret /* invoke resolved function */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
492 .size elf_rtbndr, .-elf_rtbndr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
493 #endif