diff options
author | Theo de Raadt <deraadt@cvs.openbsd.org> | 1995-11-01 17:38:03 +0000 |
---|---|---|
committer | Theo de Raadt <deraadt@cvs.openbsd.org> | 1995-11-01 17:38:03 +0000 |
commit | 952758d5aa005809245ccafdd31eeba9e0d12561 (patch) | |
tree | 70410983e596456ae2ff3d534b8a833947bf529f /lib | |
parent | 5025c83625fbec13ffb1775535d37a612dcf48d1 (diff) |
vax c runtime support
Diffstat (limited to 'lib')
-rw-r--r-- | lib/csu/vax/Makefile | 31 | ||||
-rw-r--r-- | lib/csu/vax/crt0.c | 115 |
2 files changed, 146 insertions, 0 deletions
diff --git a/lib/csu/vax/Makefile b/lib/csu/vax/Makefile new file mode 100644 index 00000000000..a107a7b6b45 --- /dev/null +++ b/lib/csu/vax/Makefile @@ -0,0 +1,31 @@ +# from: @(#)Makefile 5.6 (Berkeley) 5/22/91 +# $Id: Makefile,v 1.1 1995/11/01 17:38:00 deraadt Exp $ + +CFLAGS+= -DLIBC_SCCS -I${.CURDIR}/.. +OBJS= crt0.o gcrt0.o scrt0.o +CLEANFILES+= core a.out + +all: ${OBJS} + +crt0.o: crt0.c + ${COMPILE.c} -DCRT0 -UDYNAMIC ${.ALLSRC} + ${LD} -x -r ${.TARGET} + mv a.out ${.TARGET} + +gcrt0.o: crt0.c + ${COMPILE.c} -DMCRT0 ${.ALLSRC} -o ${.TARGET} + ${LD} -x -r ${.TARGET} + mv a.out ${.TARGET} + +scrt0.o: crt0.c + ${COMPILE.c} -DSCRT0 ${.ALLSRC} -o ${.TARGET} + ${LD} -x -r ${.TARGET} + mv a.out ${.TARGET} + +install: + install ${COPY} -o ${BINOWN} -g ${BINGRP} -m 444 ${OBJS} \ + ${DESTDIR}/usr/lib + +depend lint tags: + +.include <bsd.prog.mk> diff --git a/lib/csu/vax/crt0.c b/lib/csu/vax/crt0.c new file mode 100644 index 00000000000..5c53d6b94e9 --- /dev/null +++ b/lib/csu/vax/crt0.c @@ -0,0 +1,115 @@ +/* $NetBSD: crt0.c,v 1.1.2.1 1995/10/15 19:40:04 ragge Exp $ */ +/* + * Copyright (c) 1993 Paul Kranenburg + * 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 by Paul Kranenburg. + * 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. + * + */ + + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "%W% (Erasmus) %G%"; +#endif /* LIBC_SCCS and not lint */ + +#include <sys/param.h> +#include <stdlib.h> + +#include "common.h" + +extern void start __P((void)) asm("start"); + +void +start() +{ + struct kframe { + int kargc; + char *kargv[1]; /* size depends on kargc */ + char kargstr[1]; /* size varies */ + char kenvstr[1]; /* size varies */ + }; + /* + * ALL REGISTER VARIABLES!!! + */ + register struct kframe *kfp; + register char **argv, *ap; + +#ifdef lint + kfp = 0; + initcode = initcode = 0; +#else /* not lint */ + /* make kfp point to the arguments on stack */ + asm ("movl sp, %0" : "=r" (kfp)); +#endif /* not lint */ + argv = &kfp->kargv[0]; + environ = argv + kfp->kargc + 1; + + if (ap = argv[0]) + if ((__progname = _strrchr(ap, '/')) == NULL) + __progname = ap; + else + ++__progname; + +#ifdef DYNAMIC + /* ld(1) convention: if DYNAMIC = 0 then statically linked */ +#ifdef stupid_gcc + if (&_DYNAMIC) +#else + if ( ({volatile caddr_t x = (caddr_t)&_DYNAMIC; x; }) ) +#endif + __load_rtld(&_DYNAMIC); +#endif /* DYNAMIC */ + +asm("eprol:"); + +#ifdef MCRT0 + atexit(_mcleanup); + monstartup((u_long)&eprol, (u_long)&etext); +#endif MCRT0 + +asm ("__callmain:"); /* Defined for the benefit of debuggers */ + exit(main(kfp->kargc, argv, environ)); +} + +#ifdef DYNAMIC + asm(" ___syscall:"); + asm(" .word 0"); /* no registers to save */ + asm(" movl 4(ap), r0"); /* get syscall number */ + asm(" subl3 $1,(ap)+,(ap)"); /* n-1 args to syscall */ + asm(" chmk r0"); /* do system call */ + asm(" jcs 1f"); /* check error */ + asm(" ret"); /* return */ + asm(" 1: movl $-1, r0"); + asm(" ret"); + +#endif /* DYNAMIC */ + +#include "common.c" + +#ifdef MCRT0 +asm (" .text"); +asm ("_eprol:"); +#endif |