Deleted Added
full compact
rtld_start.S (107572) rtld_start.S (115396)
1/* $NetBSD: rtld_start.S,v 1.4 2001/09/26 04:06:43 mycroft Exp $ */
2
3/*-
4 * Copyright (C) 1998 Tsubai Masanari
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions

--- 12 unchanged lines hidden (view full) ---

21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 *
1/* $NetBSD: rtld_start.S,v 1.4 2001/09/26 04:06:43 mycroft Exp $ */
2
3/*-
4 * Copyright (C) 1998 Tsubai Masanari
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions

--- 12 unchanged lines hidden (view full) ---

21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 *
29 * $FreeBSD: head/libexec/rtld-elf/powerpc/rtld_start.S 107572 2002-12-04 07:32:20Z grehan $
29 * $FreeBSD: head/libexec/rtld-elf/powerpc/rtld_start.S 115396 2003-05-29 22:58:26Z kan $
30 */
31
32#include <machine/asm.h>
33
34.extern _GLOBAL_OFFSET_TABLE_
35.extern _DYNAMIC
30 */
31
32#include <machine/asm.h>
33
34.extern _GLOBAL_OFFSET_TABLE_
35.extern _DYNAMIC
36
36
37_ENTRY(.rtld_start)
37_ENTRY(.rtld_start)
38 stwu %r1,-48(%r1) /* 16-byte aligned stack for reg saves +
39 exit_proc & obj _rtld args +
38 stwu %r1,-48(%r1) /* 16-byte aligned stack for reg saves +
39 exit_proc & obj _rtld args +
40 backchain & lrsave stack frame */
41 stw %r3,16(%r1) /* argc */
42 stw %r4,20(%r1) /* argv */
43 stw %r5,24(%r1) /* envp */
44/* stw %r6,28(%r1) *//* obj (always 0) */
45/* stw %r7,32(%r1) *//* cleanup (always 0) */
46 stw %r8,36(%r1) /* ps_strings */
47

--- 18 unchanged lines hidden (view full) ---

661:
67 mflr %r3 /* PC value at .long */
68 lwz %r4,4(%r3)
69 add %r4,%r4,%r3 /* &_GLOBAL_OFFSET_TABLE-4, blrl insn. */
70 dcbst %r0,%r4 /* sync i-cache with d-cache */
71 sync
72 icbi %r0,%r4
73 isync
40 backchain & lrsave stack frame */
41 stw %r3,16(%r1) /* argc */
42 stw %r4,20(%r1) /* argv */
43 stw %r5,24(%r1) /* envp */
44/* stw %r6,28(%r1) *//* obj (always 0) */
45/* stw %r7,32(%r1) *//* cleanup (always 0) */
46 stw %r8,36(%r1) /* ps_strings */
47

--- 18 unchanged lines hidden (view full) ---

661:
67 mflr %r3 /* PC value at .long */
68 lwz %r4,4(%r3)
69 add %r4,%r4,%r3 /* &_GLOBAL_OFFSET_TABLE-4, blrl insn. */
70 dcbst %r0,%r4 /* sync i-cache with d-cache */
71 sync
72 icbi %r0,%r4
73 isync
74
74
75 lwz %r4,0(%r3) /* offset to _DYNAMIC */
76 add %r3,%r4,%r3 /* r3 = &_DYNAMIC, absolute value */
77
78 bl _GLOBAL_OFFSET_TABLE_@local-4
79 mflr %r4 /* &_GLOBAL_OFFSET_TABLE_, absolute value */
80 lwz %r4,0(%r4) /* linker &_DYNAMIC, from got[0] */
81 subf %r4,%r4,%r3 /* subtract to calculate relocbase */
75 lwz %r4,0(%r3) /* offset to _DYNAMIC */
76 add %r3,%r4,%r3 /* r3 = &_DYNAMIC, absolute value */
77
78 bl _GLOBAL_OFFSET_TABLE_@local-4
79 mflr %r4 /* &_GLOBAL_OFFSET_TABLE_, absolute value */
80 lwz %r4,0(%r4) /* linker &_DYNAMIC, from got[0] */
81 subf %r4,%r4,%r3 /* subtract to calculate relocbase */
82
82
83 bl reloc_non_plt_self@plt /* reloc_non_plt_self(&_DYNAMIC,base) */
84
85 /*
86 * The _rtld() function likes to see a stack layout containing
87 * { argc, argv[0], argv[1] ... argv[N], 0, env[0], ... , env[N] }
88 * Since the PowerPC stack was 16-byte aligned at exec time, the
89 * original stack layout has to be found by moving back a word
90 * from the argv pointer.

--- 94 unchanged lines hidden (view full) ---

185 * jumptable and transferred to
186 */
187_ENTRY(_rtld_powerpc_pltcall)
188 slwi %r11,%r11,2 # jmptab offset = index * 4
189 addis %r11,%r11,0 # addis 11,11,jmptab@ha
190 lwz %r11,0(%r11) # lwz 11,jmptab@l(11)
191 mtctr %r11
192 bctr # (*jmptab[index])()
83 bl reloc_non_plt_self@plt /* reloc_non_plt_self(&_DYNAMIC,base) */
84
85 /*
86 * The _rtld() function likes to see a stack layout containing
87 * { argc, argv[0], argv[1] ... argv[N], 0, env[0], ... , env[N] }
88 * Since the PowerPC stack was 16-byte aligned at exec time, the
89 * original stack layout has to be found by moving back a word
90 * from the argv pointer.

--- 94 unchanged lines hidden (view full) ---

185 * jumptable and transferred to
186 */
187_ENTRY(_rtld_powerpc_pltcall)
188 slwi %r11,%r11,2 # jmptab offset = index * 4
189 addis %r11,%r11,0 # addis 11,11,jmptab@ha
190 lwz %r11,0(%r11) # lwz 11,jmptab@l(11)
191 mtctr %r11
192 bctr # (*jmptab[index])()
193
194
193
194