Module Name: src
Committed By: matt
Date: Wed Aug 26 03:32:53 UTC 2009
Modified Files:
src/libexec/ld.elf_so/arch/mips [matt-nb5-mips64]: Makefile.inc
rtld_start.S
Log Message:
Make this compile under N32/N64. No idea if it works.
To generate a diff of this commit:
cvs rdiff -u -r1.15 -r1.15.32.1 src/libexec/ld.elf_so/arch/mips/Makefile.inc
cvs rdiff -u -r1.9 -r1.9.44.1 src/libexec/ld.elf_so/arch/mips/rtld_start.S
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/libexec/ld.elf_so/arch/mips/Makefile.inc
diff -u src/libexec/ld.elf_so/arch/mips/Makefile.inc:1.15 src/libexec/ld.elf_so/arch/mips/Makefile.inc:1.15.32.1
--- src/libexec/ld.elf_so/arch/mips/Makefile.inc:1.15 Sat Jun 4 16:17:17 2005
+++ src/libexec/ld.elf_so/arch/mips/Makefile.inc Wed Aug 26 03:32:53 2009
@@ -1,11 +1,12 @@
-# $NetBSD: Makefile.inc,v 1.15 2005/06/04 16:17:17 lukem Exp $
+# $NetBSD: Makefile.inc,v 1.15.32.1 2009/08/26 03:32:53 matt Exp $
SRCS+= rtld_start.S mips_reloc.c
# XXX Should not be in CPPFLAGS!
-CPPFLAGS+= -mabicalls -G0 -fPIC
+CPUFLAGS+= -G0
CPPFLAGS+= -DELFSIZE=32
CPPFLAGS+= -DRTLD_INHIBIT_COPY_RELOCS
+AFLAGS+= -Wa,--fatal-warnings
LDFLAGS+= -Wl,-e,.rtld_start
Index: src/libexec/ld.elf_so/arch/mips/rtld_start.S
diff -u src/libexec/ld.elf_so/arch/mips/rtld_start.S:1.9 src/libexec/ld.elf_so/arch/mips/rtld_start.S:1.9.44.1
--- src/libexec/ld.elf_so/arch/mips/rtld_start.S:1.9 Sat Oct 5 11:59:05 2002
+++ src/libexec/ld.elf_so/arch/mips/rtld_start.S Wed Aug 26 03:32:53 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: rtld_start.S,v 1.9 2002/10/05 11:59:05 mycroft Exp $ */
+/* $NetBSD: rtld_start.S,v 1.9.44.1 2009/08/26 03:32:53 matt Exp $ */
/*
* Copyright 1997 Michael L. Hitch <[email protected]>
@@ -35,71 +35,101 @@
LEAF(rtld_start)
.set noreorder
+ SETUP_GP
+ PTR_SUBU sp, 2*SZREG # adjust stack pointer
+ SETUP_GP64(s4, rtld_start)
+ SAVE_GP(s4)
+ # -> 0*SZREG(sp) for atexit
+ # -> 1*SZREG(sp) for obj_main
+ move s0, a0 # save stack pointer from a0
+ move s3, a3 # save ps_strings pointer
- .cpload t9
- addu sp, sp, -12 # adjust stack pointer
- .cprestore 0 # -> 0(sp) for gp
- # -> 4(sp) for atexit
- # -> 8(sp) for obj_main
- move s0,a0 # save stack pointer from a0
- move s1,a3 # save ps_strings pointer
-
- la a1, 1f
+ PTR_LA a1, 1f
bal 1f
- la t9,_C_LABEL(_rtld_relocate_nonplt_self)
-1: subu a1, ra, a1 # relocbase
+ PTR_LA t9, _C_LABEL(_rtld_relocate_nonplt_self)
+1: PTR_SUBU a1, ra, a1 # relocbase
move s2,a1
- la a0,_DYNAMIC
- addu t9, a1, t9
- jalr t9
- addu a0, a1, a0 # &_DYNAMIC
+ PTR_LA a0,_DYNAMIC
+ PTR_ADDU t9, a1, t9
+ jalr t9 # _rtld_relocate_nonplt_self(dynp, relocabase)
+ PTR_ADDU a0, a1, a0 # &_DYNAMIC
- move a1,s2 # relocbase
- addu a0, sp, 4 # sp
+ move a1, s2 # relocbase
+ move a0, sp # sp
jal _C_LABEL(_rtld) # v0 = _rtld(sp, relocbase)
nop
- lw a1, 4(sp) # our atexit function
- lw a2, 8(sp) # obj_main entry
- addu sp, sp,12 # readjust stack
- move a0,s0 # stack pointer
- move t9,v0
+ PTR_L a1, 0*SZREG(sp) # our atexit function
+ PTR_L a2, 1*SZREG(sp) # obj_main entry
+ PTR_ADDU sp, 3*SZREG # readjust stack
+ move a0, s0 # stack pointer
+ move t9, v0
jr t9 # _start(sp, cleanup, obj);
- move a3,s1 # restore ps_strings
+ move a3, s3 # restore ps_strings
END(rtld_start)
+#define XCALLFRAME_SIZ (11*SZREG)
+#define XCALLFRAME_RA (10*SZREG)
+#define XCALLFRAME_GP (9*SZREG)
+#define XCALLFRAME_S0 (8*SZREG)
+#define XCALLFRAME_A3 (7*SZREG)
+#define XCALLFRAME_A2 (6*SZREG)
+#define XCALLFRAME_A1 (5*SZREG)
+#define XCALLFRAME_A0 (4*SZREG)
+#if defined(__mips_n32) || defined(__mips_n64)
+#define XCALLFRAME_A7 (3*SZREG)
+#define XCALLFRAME_A6 (2*SZREG)
+#define XCALLFRAME_A5 (1*SZREG)
+#define XCALLFRAME_A4 (0*SZREG)
+#endif
+
.globl _rtld_bind_start
.ent _rtld_bind_start
_rtld_bind_start:
-
- move v1,gp # save old GP
- add t9,8 # modify T9 to point at .cpload
- .cpload t9
- subu sp,44 # save arguments and sp value in stack
- .cprestore 36
- sw t7,40(sp)
- sw a0,16(sp)
- sw a1,20(sp)
- sw a2,24(sp)
- sw a3,28(sp)
- sw s0,32(sp)
- move s0,sp
- move a0,t8 # symbol index
- move a1,t7 # old RA
- move a2,v1 # old GP
- move a3,ra # current RA
+#if defined(__mips_o32) || defined(__mips_o64)
+ move v1, gp # save old GP
+ PTR_ADDU t9, 8 # modify T9 to point at .cpload
+#endif
+ SETUP_GP
+ PTR_SUBU sp, XCALLFRAME_SIZ # save arguments and sp value in stack
+ SETUP_GP64(XCALLFRAME_GP, _rtld_bind_start)
+ SAVE_GP(XCALLFRAME_GP)
+#if defined(__mips_n32) || defined(__mips_n64)
+ REG_S a4, XCALLFRAME_A4(sp)
+ REG_S a5, XCALLFRAME_A5(sp)
+ REG_S a6, XCALLFRAME_A6(sp)
+ REG_S a7, XCALLFRAME_A7(sp)
+#endif
+ REG_S a0, XCALLFRAME_A0(sp)
+ REG_S a1, XCALLFRAME_A1(sp)
+ REG_S a2, XCALLFRAME_A2(sp)
+ REG_S a3, XCALLFRAME_A3(sp)
+ REG_S $15, XCALLFRAME_RA(sp) # ra is in t7/t3
+ REG_S s0, XCALLFRAME_SP(sp)
+ move s0, sp
+ move a0, t8 # symbol index
+ move a1, $15 # old RA
+ move a2, v1 # old GP
+ move a3, ra # current RA
jal _C_LABEL(_rtld_bind)
- nop
- move sp,s0
- lw ra,40(sp)
- lw a0,16(sp)
- lw a1,20(sp)
- lw a2,24(sp)
- lw a3,28(sp)
- lw s0,32(sp)
- addu sp,44
- move t9,v0
+ nop
+ move sp, s0
+ REG_L ra, XCALLFRAME_RA(sp)
+ REG_L s0, XCALLFRAME_S0(sp)
+ REG_L a0, XCALLFRAME_A0(sp)
+ REG_L a1, XCALLFRAME_A1(sp)
+ REG_L a2, XCALLFRAME_A2(sp)
+ REG_L a3, XCALLFRAME_A3(sp)
+#if defined(__mips_n32) || defined(__mips_n64)
+ REG_L a4, XCALLFRAME_A4(sp)
+ REG_L a5, XCALLFRAME_A5(sp)
+ REG_L a6, XCALLFRAME_A6(sp)
+ REG_L a7, XCALLFRAME_A7(sp)
+#endif
+ RESTORE_GP64
+ PTR_ADDU sp, XCALLFRAME_SIZ
+ move t9, v0
jr t9
- nop
- .end _rtld_bind_start
+ nop
+END(_rtld_bind_start)