Print this page
6507 i386 makecontext(3c) needs to 16-byte align the stack
Split |
Close |
Expand all |
Collapse all |
--- old/usr/src/lib/common/i386/crti.s
+++ new/usr/src/lib/common/i386/crti.s
1 1 /*
2 2 * CDDL HEADER START
3 3 *
4 4 * The contents of this file are subject to the terms of the
5 5 * Common Development and Distribution License, Version 1.0 only
6 6 * (the "License"). You may not use this file except in compliance
7 7 * with the License.
8 8 *
9 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 10 * or http://www.opensolaris.org/os/licensing.
11 11 * See the License for the specific language governing permissions
12 12 * and limitations under the License.
13 13 *
14 14 * When distributing Covered Code, include this CDDL HEADER in each
15 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 16 * If applicable, add the following below this CDDL HEADER, with the
17 17 * fields enclosed by brackets "[]" replaced with your own identifying
18 18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 19 *
20 20 * CDDL HEADER END
21 21 */
22 22 /*
23 23 * Copyright (c) 2001 by Sun Microsystems, Inc.
24 24 * All rights reserved.
25 25 */
26 26 /*
27 27 * Copyright (c) 2013, Joyent, Inc. All rights reserved.
28 28 */
29 29
30 30 /*
31 31 * These crt*.o modules are provided as the bare minimum required
32 32 * from a crt*.o for inclusion in building low level system
↓ open down ↓ |
32 lines elided |
↑ open up ↑ |
33 33 * libraries. The are only be to included in libraries which
34 34 * contain *no* C++ code and want to avoid the startup code
35 35 * that the C++ runtime has introduced into the crt*.o modules.
36 36 *
37 37 * For further details - see bug#4433015
38 38 */
39 39
40 40 .file "crti.s"
41 41
42 42 /*
43 - * Note that when _init and _fini are called we have 16-byte alignment per the
44 - * ABI. We need to make sure that our asm leaves it such that subsequent calls
45 - * will be aligned. gcc expects stack alignment before the call instruction is
46 - * executed. Specifically if we call function foo(), the stack pointer will be
47 - * 0xc aligned after executing the call instruction and before executing foo's
48 - * prologue. Note that because 16-byte alignment also ensures 4-byte alignment
49 - * we will not be breaking compatibility with older applications.
43 + * Note that when _init and _fini are called the stack needs to be 16-byte
44 + * aligned with a 4-byte bias. See comment in lib/libc/i386/gen/makectxt.c.
45 + *
46 + * Note: If you change it, you need to change it in the following files as
47 + * well:
48 + *
49 + * - lib/libc/i386/threads/machdep.c
50 + * - lib/libc/i386/gen/makectxt.c
51 + * - lib/common/i386/crt1.s
50 52 */
51 53
52 54 /*
53 55 * _init function prologue
54 56 */
55 57 .section .init,"ax"
56 58 .globl _init
57 59 .type _init,@function
58 60 .align 16
59 61 _init:
60 62 pushl %ebp
61 63 movl %esp, %ebp
62 64 andl $-16,%esp
63 65 subl $12,%esp
64 66 pushl %ebx
65 67 call .L1
66 68 .L1: popl %ebx
67 69 addl $_GLOBAL_OFFSET_TABLE_+[.-.L1], %ebx
68 70
69 71 /*
70 72 * _fini function prologue
71 73 */
72 74 .section .fini,"ax"
73 75 .globl _fini
74 76 .type _fini,@function
75 77 .align 16
76 78 _fini:
77 79 pushl %ebp
78 80 movl %esp, %ebp
79 81 andl $-16,%esp
80 82 subl $12,%esp
81 83 pushl %ebx
82 84 call .L2
83 85 .L2: popl %ebx
84 86 addl $_GLOBAL_OFFSET_TABLE_+[.-.L2], %ebx
↓ open down ↓ |
25 lines elided |
↑ open up ↑ |
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX