diff options
Diffstat (limited to 'lib/csu/sh')
-rw-r--r-- | lib/csu/sh/Makefile | 10 | ||||
-rw-r--r-- | lib/csu/sh/crt0.c | 119 | ||||
-rw-r--r-- | lib/csu/sh/md_init.h | 22 |
3 files changed, 26 insertions, 125 deletions
diff --git a/lib/csu/sh/Makefile b/lib/csu/sh/Makefile index d5e2faa724c..2e59cd613c1 100644 --- a/lib/csu/sh/Makefile +++ b/lib/csu/sh/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.5 2011/11/08 10:37:09 guenther Exp $ +# $OpenBSD: Makefile,v 1.6 2013/12/03 06:21:41 guenther Exp $ # from: @(#)Makefile 8.1 (Berkeley) 6/1/93 OBJS= crt0.o gcrt0.o crtbegin.o crtend.o crtbeginS.o crtendS.o @@ -11,14 +11,14 @@ CFLAGS+= -I${ELFDIR} -I${.CURDIR} all: ${OBJS} crt0.o: crt0.c - @echo ${COMPILE.c} -DCRT0 -fpie -DPIC ${.CURDIR}/crt0.c -o ${.TARGET} - @${COMPILE.c} -DCRT0 -fpie -DPIC ${.CURDIR}/crt0.c -o ${.TARGET}.o + @echo ${COMPILE.c} -DCRT0 -fpie -DPIC ${ELFDIR}/crt0.c -o ${.TARGET} + @${COMPILE.c} -DCRT0 -fpie -DPIC ${ELFDIR}/crt0.c -o ${.TARGET}.o @${LD} -x -r -o ${.TARGET} ${.TARGET}.o @rm -f ${.TARGET}.o gcrt0.o: crt0.c - @echo ${COMPILE.c} -DMCRT0 ${.CURDIR}/crt0.c -o ${.TARGET} - @${COMPILE.c} -DMCRT0 ${.CURDIR}/crt0.c -o ${.TARGET}.o + @echo ${COMPILE.c} -DMCRT0 ${ELFDIR}/crt0.c -o ${.TARGET} + @${COMPILE.c} -DMCRT0 ${ELFDIR}/crt0.c -o ${.TARGET}.o @${LD} -x -r -o ${.TARGET} ${.TARGET}.o @rm -f ${.TARGET}.o diff --git a/lib/csu/sh/crt0.c b/lib/csu/sh/crt0.c deleted file mode 100644 index 0f547a3a1d0..00000000000 --- a/lib/csu/sh/crt0.c +++ /dev/null @@ -1,119 +0,0 @@ -/* $OpenBSD: crt0.c,v 1.7 2013/12/01 17:18:31 guenther Exp $ */ -/* $NetBSD: crt0.c,v 1.10 2004/08/26 21:16:41 thorpej Exp $ */ - -/* - * Copyright (c) 1998 Christos Zoulas - * Copyright (c) 1995 Christopher G. Demetriou - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed for the - * NetBSD Project. See http://www.NetBSD.org/ for - * information about NetBSD. - * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * <<Id: LICENSE,v 1.2 2000/06/14 15:57:33 cgd Exp>> - */ - -#include <sys/param.h> - -#include <machine/asm.h> -#include <machine/fpu.h> -#include <stdlib.h> - -static char *_strrchr(const char *, char); - -char **environ; - -char * __progname = ""; - -char __progname_storage[NAME_MAX+1]; - -#if defined(__SH4__) && !defined(__SH4_NOFPU__) -unsigned int __fpscr_values[2]; -#endif - -#ifdef MCRT0 -extern void monstartup(u_long, u_long); -extern void _mcleanup(void); -extern unsigned char _etext, _eprol; -#endif /* MCRT0 */ - -void __start(int, char *[], char *[], void (*)(void)); - -void -__start(int argc, char **argv, char **envp, void (*cleanup)(void)) -{ - char *s; - -#if defined(__SH4__) && !defined(__SH4_NOFPU__) - extern void __set_fpscr(unsigned int); - - __set_fpscr(0); - __fpscr_values[0] |= FPSCR_DN; - __fpscr_values[1] |= FPSCR_DN; - __asm__ __volatile__ ("lds %0, fpscr" : : "r" (__fpscr_values[1])); -#endif - - environ = envp; - - if ((__progname = argv[0]) != NULL) { /* NULL ptr if argc = 0 */ - if ((__progname = _strrchr(__progname, '/')) == NULL) - __progname = argv[0]; - else - __progname++; - for (s = __progname_storage; *__progname && - s < &__progname_storage[sizeof __progname_storage - 1]; ) - *s++ = *__progname++; - *s = '\0'; - __progname = __progname_storage; - } - - if (cleanup) - atexit(cleanup); -#ifdef MCRT0 - atexit(_mcleanup); - monstartup((u_long)&_eprol, (u_long)&_etext); -#endif /* MCRT0 */ - - __init(); - -__asm("__callmain:"); /* Defined for the benefit of debuggers */ - exit(main(argc, argv, envp)); -} - -static char * -_strrchr(const char *p, char ch) -{ - char *save; - - for (save = NULL;; ++p) { - if (*p == ch) - save = (char *)p; - if (!*p) - return(save); - } - /* NOTREACHED */ -} -asm (" .section \".text\" \n_eprol:"); diff --git a/lib/csu/sh/md_init.h b/lib/csu/sh/md_init.h index c3885ad22a5..2d600e25dee 100644 --- a/lib/csu/sh/md_init.h +++ b/lib/csu/sh/md_init.h @@ -1,4 +1,4 @@ -/* $OpenBSD: md_init.h,v 1.1 2006/10/10 22:07:10 miod Exp $ */ +/* $OpenBSD: md_init.h,v 1.2 2013/12/03 06:21:41 guenther Exp $ */ /* $NetBSD: dot_init.h,v 1.3 2005/12/24 22:02:10 perry Exp $ */ /*- @@ -66,3 +66,23 @@ __asm(".section " #section "\n" \ "0: .p2align 2 \n" \ "1: .long " #func " - 0b \n" \ "2: .previous"); + + +/* no ASM stub for __start; the C routine can be called directly */ +#define MD_START __start + +#if defined(__SH4__) && !defined(__SH4_NOFPU__) +#include <machine/fpu.h> + +#define MD_CRT0_START \ + void __set_fpscr(unsigned int); \ + unsigned int __fpscr_values[2] + +#define MD_START_SETUP \ + __set_fpscr(0); \ + __fpscr_values[0] |= FPSCR_DN; \ + __fpscr_values[1] |= FPSCR_DN; \ + __asm __volatile__ ("lds %0, fpscr" \ + : : "r" (__fpscr_values[1])); +#endif /* defined(__SH4__) && !defined(__SH4_NOFPU__) */ + |