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 |
|