diff options
Diffstat (limited to 'libc/sysdeps/linux')
-rw-r--r-- | libc/sysdeps/linux/sh/Makefile | 23 | ||||
-rw-r--r-- | libc/sysdeps/linux/sh/___fpscr_values.S | 34 | ||||
-rw-r--r-- | libc/sysdeps/linux/sh/crt1.S (renamed from libc/sysdeps/linux/sh/crt0.S) | 106 | ||||
-rw-r--r-- | libc/sysdeps/linux/sh/longjmp.c | 3 |
4 files changed, 74 insertions, 92 deletions
diff --git a/libc/sysdeps/linux/sh/Makefile b/libc/sysdeps/linux/sh/Makefile index 3532ef2b9..f224acdbf 100644 --- a/libc/sysdeps/linux/sh/Makefile +++ b/libc/sysdeps/linux/sh/Makefile @@ -20,35 +20,36 @@ TOPDIR=../../../../ include $(TOPDIR)Rules.mak -CFLAGS+= -I../ -ASFLAGS+=-I.. -D__ASSEMBLER__ - -CRT0_SRC = crt0.S -CRT0_OBJ = crt0.o crt1.o -CRT0_DEPS=gmon-start.S +CRT_SRC = crt1.S +CRT_OBJ = crt1.o +SCRT_OBJ = $(patsubst %,S%, $(CRT_OBJ)) CTOR_TARGETS=$(TOPDIR)lib/crti.o $(TOPDIR)lib/crtn.o -SSRC=setjmp.S __longjmp.S vfork.S clone.S +SSRC=setjmp.S __longjmp.S vfork.S clone.S ___fpscr_values.S SOBJS=$(patsubst %.S,%.o, $(SSRC)) CSRC=mmap.c longjmp.c pipe.c __init_brk.c brk.c sbrk.c syscall.c pread_write.c COBJS=$(patsubst %.c,%.o, $(CSRC)) -OBJS=$(SOBJS) $(MOBJ) $(COBJS) +OBJS=$(SOBJS) $(COBJS) OBJ_LIST=../../../obj.sysdeps.$(TARGET_ARCH) all: $(OBJ_LIST) -$(OBJ_LIST): $(OBJS) $(CRT0_OBJ) $(CTOR_TARGETS) +$(OBJ_LIST): $(OBJS) $(CRT_OBJ) $(SCRT_OBJ) $(CTOR_TARGETS) echo $(patsubst %, sysdeps/linux/$(TARGET_ARCH)/%, $(OBJS)) > $(OBJ_LIST) $(INSTALL) -d $(TOPDIR)lib/ - cp $(CRT0_OBJ) $(TOPDIR)lib/ + cp $(CRT_OBJ) $(SCRT_OBJ) $(TOPDIR)lib/ -$(CRT0_OBJ): $(CRT0_SRC) +$(CRT_OBJ): $(CRT_SRC) $(CC) $(ASFLAGS) -DL_$* $< -c -o $*.o $(STRIPTOOL) -x -R .note -R .comment $*.o +$(SCRT_OBJ): $(CRT_SRC) + $(CC) $(ASFLAGS) $(PIEFLAG) -DL_$* $< -c -o $*.o + $(STRIPTOOL) -x -R .note -R .comment $*.o + $(SOBJS): %.o : %.S $(CC) $(ASFLAGS) -c $< -o $@ $(STRIPTOOL) -x -R .note -R .comment $*.o diff --git a/libc/sysdeps/linux/sh/___fpscr_values.S b/libc/sysdeps/linux/sh/___fpscr_values.S new file mode 100644 index 000000000..de8f0b42d --- /dev/null +++ b/libc/sysdeps/linux/sh/___fpscr_values.S @@ -0,0 +1,34 @@ +/* Startup code for SH & ELF. + Copyright (C) 1999 Free Software Foundation, Inc. + Copyright (C) 2001 Hewlett-Packard Australia + Copyright (C) 2002 Stefan Allius + + This program is free software; you can redistribute it and/or modify it under + the terms of the GNU Library General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your option) any + later version. + + This program is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more + details. + + You should have received a copy of the GNU Library General Public License + along with this program; if not, write to the Free Software Foundation, Inc., + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include <features.h> + +.data +#if defined(__CONFIG_SH4__) +.global ___fpscr_values +.type ___fpscr_values,@object +.size ___fpscr_values,8 +___fpscr_values: + .long 0 + .long 0x80000 + +.weak __fpscr_values + __fpscr_values = ___fpscr_values +#endif diff --git a/libc/sysdeps/linux/sh/crt0.S b/libc/sysdeps/linux/sh/crt1.S index 6851698d5..fc0ce355d 100644 --- a/libc/sysdeps/linux/sh/crt0.S +++ b/libc/sysdeps/linux/sh/crt1.S @@ -36,96 +36,51 @@ #include <features.h> - .file "crt0.S" .text .globl _start - .type _start,@function - .type main,@function - .size _start,_start_end - _start + .type _start,%function + .type main,%function _start: /* Clear the frame pointer since this is the outermost frame. */ mov #0, r14 /* Pop argc off the stack and save a pointer to argv */ - mov.l @r15+,r4 - mov r15, r5 - -#if defined L_crt0 || ! defined __UCLIBC_CTOR_DTOR__ - /* - * Setup the value for the environment pointer: - * r6 = (argc + 1) * 4 - * r6 += argv (in delay slot) - */ - mov r4,r6 - add #1,r6 - shll2 r6 - - /* jump to __uClibc_main (argc, argv, envp) */ - mov.l L_main, r0 - jsr @r0 - add r5, r6 /* delay slot */ + mov.l @r15+,r5 + mov r15, r6 - /* We should not get here. */ - mov.l L_abort, r0 - jmp @r0 - nop + /* Push the fini func onto the stack */ + mov.l r4,@-r15 + mov.l L_fini,r0 + mov.l r0,@-r15 -_start_end: - .align 2 + /* Set up the main/init funcs that go in registers */ + mov.l L_main,r4 + mov.l L_init,r7 -L_main: - .long __uClibc_main /* in libuClibc.*.so */ - -#else /* (L_crt1) && __UCLIBC_CTOR_DTOR__ */ - /* Push the finip argument to __uClibc_start_main() onto the stack */ - mov.l L_fini,r6 - mov.l r6,@-r15 - - /* Setup the value for the initp argument */ - mov.l L_init, r7 - - /* - * Setup the value for the environment pointer: - * r6 = (argc + 1) * 4 - * r6 += argv (in delay slot) - */ - mov r4,r6 - add #1,r6 - shll2 r6 - - /* jump to __uClibc_start_main (argc, argv, envp, app_init, app_fini) */ - mov.l L_main, r0 - jsr @r0 - add r5, r6 /* delay slot */ + /* __uClibc_main (main, argc, argv, init, fini) */ + + /* Let the libc call main and exit with its return code. */ + mov.l L_uClibc_main,r1 + jsr @r1 + nop /* We should not get here. */ - mov.l L_abort, r0 - jmp @r0 + mov.l L_abort,r1 + jmp @r1 nop -_start_end: + + .size _start,.-_start .align 2 L_main: - .long __uClibc_start_main /* in libuClibc.*.so */ - - .weak _init - .type _init,@function -_init: - rts - nop - - .size _init,.-_init - .weak _fini - .set _fini,_init - + .long main L_init: - .long _init + .long _init L_fini: - .long _fini - -#endif - + .long _fini +L_uClibc_main: + .long __uClibc_main L_abort: - .long abort + .long abort /* Define a symbol for the first piece of initialized data. */ .data @@ -134,10 +89,3 @@ __data_start: .long 0 .weak data_start data_start = __data_start -#if defined __CONFIG_SH4__ - .global __fpscr_values -__fpscr_values: - .long 0 - .long 0x80000 -#endif - diff --git a/libc/sysdeps/linux/sh/longjmp.c b/libc/sysdeps/linux/sh/longjmp.c index 14e32d502..c36344cd1 100644 --- a/libc/sysdeps/linux/sh/longjmp.c +++ b/libc/sysdeps/linux/sh/longjmp.c @@ -25,7 +25,6 @@ #include <signal.h> extern int __longjmp(char *env, int val); -extern int __sigprocmask(int how, const sigset_t *set, sigset_t *oldset); /* Set the signal mask to the one specified in ENV, and jump to the position specified in ENV, causing the setjmp @@ -34,7 +33,7 @@ void __libc_siglongjmp (sigjmp_buf env, int val) { if (env[0].__mask_was_saved) /* Restore the saved signal mask. */ - (void) __sigprocmask (SIG_SETMASK, &env[0].__saved_mask, + (void) sigprocmask (SIG_SETMASK, &env[0].__saved_mask, (sigset_t *) NULL); /* Call the machine-dependent function to restore machine state. */ |