summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDale S. Rahn <rahnds@cvs.openbsd.org>1996-12-21 20:53:49 +0000
committerDale S. Rahn <rahnds@cvs.openbsd.org>1996-12-21 20:53:49 +0000
commit5931c17bfc5d8719067bddd56a85b2ec82559bcc (patch)
tree30c15e41f4cafdfa5d90771fccbb40ec5db09640
parentd778f4b0cd93dd08c913ce458b461ea7d9c5190c (diff)
Check-in of powerpc csu support.
NOTE: This will not work until the other pieces are checked in. This is primarily the NetBSD powerpc port, with modifications to support ELF. A change needs to be made to one of the bsd.*.mk files to support DESTDIR compilation with the crtbegin and crtend files.
-rw-r--r--lib/csu/powerpc/Makefile38
-rw-r--r--lib/csu/powerpc/crt0.s64
-rw-r--r--lib/csu/powerpc/crtbegin.c116
-rw-r--r--lib/csu/powerpc/crtend.s8
4 files changed, 226 insertions, 0 deletions
diff --git a/lib/csu/powerpc/Makefile b/lib/csu/powerpc/Makefile
new file mode 100644
index 00000000000..fd37c1d03d8
--- /dev/null
+++ b/lib/csu/powerpc/Makefile
@@ -0,0 +1,38 @@
+# from: @(#)Makefile 8.1 (Berkeley) 6/1/93
+# $Id: Makefile,v 1.1 1996/12/21 20:53:48 rahnds Exp $
+
+CFLAGS= -DLIBC_SCCS
+OBJS= crt0.o gcrt0.o crtbegin.o crtend.o
+CLEANFILES+= core a.out
+
+all: ${OBJS}
+
+crt0.o: crt0.s
+ ${CPP} -DCRT0 ${.ALLSRC} | ${AS} -o $@
+ @${LD} -x -r ${.TARGET}
+ @mv a.out ${.TARGET}
+
+gcrt0.o: crt0.s
+ ${CPP} -DMCRT0 ${.ALLSRC} | ${AS} -o $@
+ @${LD} -x -r ${.TARGET}
+ @mv a.out ${.TARGET}
+
+crtbegin.o: crtbegin.c
+ @echo ${CC} ${CFLAGS} -c ${.ALLSRC} -o ${.TARGET}
+ @${CC} ${CFLAGS} -c ${.ALLSRC} -o ${.TARGET}.o
+ @${LD} -x -r -o ${.TARGET} ${.TARGET}.o
+ @rm -f ${.TARGET}.o
+
+crtend.o: crtend.s
+ @echo ${CC} ${CFLAGS} -c ${.ALLSRC} -o ${.TARGET}
+ @${CC} ${CFLAGS} -c ${.ALLSRC} -o ${.TARGET}.o
+ @${LD} -x -r -o ${.TARGET} ${.TARGET}.o
+ @rm -f ${.TARGET}.o
+
+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/powerpc/crt0.s b/lib/csu/powerpc/crt0.s
new file mode 100644
index 00000000000..964a05f3861
--- /dev/null
+++ b/lib/csu/powerpc/crt0.s
@@ -0,0 +1,64 @@
+
+
+ .data 1
+ .comm environ, 4
+ .globl __progname
+__progname:
+ .long L1
+L1: .long 0 # null string plus padding
+
+
+
+ .text
+ .globl start
+start:
+ .globl _start
+_start:
+
+ # squirrel away the arguments for main
+ mr 13, 3
+ mr 14, 4
+ mr 15, 5
+ mr 16, 6
+
+ # determine the program name (__progname)
+ lwz 28, 0(4) # r28 = argv[0] (program name)
+ cmpwi 28, 0 # argv[0] == NULL?
+ beq call_main # yep forget setup of progname
+ mr 3, 28 # r3 = argv[0]
+ li 4, '/' # r4 = '/'
+ .extern strrchr
+ bl strrchr # strrchr(argv[0], '/')
+ cmpwi 3, 0 # == 0?
+ beq no_slash_found # not found, use argv[0] still in r28
+ addi 28, 3, 1 # was found, point at char after '/'
+no_slash_found:
+ # store the address of the basename found in argv[0]
+ lis 31, __progname@HA
+ stw 28, __progname@L(31)
+
+ lis 26, environ@HA
+ stw 5, environ@L(26)
+
+call_main:
+ .globl __init
+ bl __init
+ # recover those saved registers
+ mr 3, 13
+ mr 4, 14
+ mr 5, 15
+ mr 6, 16
+
+ bl main
+ .extern exit
+ mr 13, 3
+ bl __fini
+ mr 3, 13
+ bl exit
+
+ .globl __main
+__main:
+ .globl __eabi
+__eabi:
+ blr
+
diff --git a/lib/csu/powerpc/crtbegin.c b/lib/csu/powerpc/crtbegin.c
new file mode 100644
index 00000000000..efe485a5946
--- /dev/null
+++ b/lib/csu/powerpc/crtbegin.c
@@ -0,0 +1,116 @@
+/* $OpenBSD: crtbegin.c,v 1.1 1996/12/21 20:53:48 rahnds Exp $ */
+/* $NetBSD: crtbegin.c,v 1.1 1996/09/12 16:59:03 cgd 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.
+ */
+
+#ifndef ECOFF_COMPAT
+
+/*
+ * XXX EVENTUALLY SHOULD BE MERGED BACK WITH c++rt0.c
+ */
+
+/*
+ * Run-time module for GNU C++ compiled shared libraries.
+ *
+ * The linker constructs the following arrays of pointers to global
+ * constructors and destructors. The first element contains the
+ * number of pointers in each.
+ * The tables are also null-terminated.
+
+ */
+#include <stdlib.h>
+
+/* XXX hack */
+__asm__("
+.section .ctors,\"aw\"
+ .long -1
+.section .dtors,\"aw\"
+ .long -1
+");
+
+void (*__CTOR_LIST__[0]) __P((void));
+void (*__DTOR_LIST__[0]) __P((void));
+
+static void __dtors __P((void));
+static void __ctors __P((void));
+
+static void
+__dtors()
+{
+ unsigned long i = (unsigned long) __DTOR_LIST__[0];
+ void (**p)(void);
+
+ if (i == -1) {
+ for (i = 1; __DTOR_LIST__[i] != NULL; i++)
+ ;
+ i--;
+ }
+ p = __DTOR_LIST__ + i;
+ while (i--)
+ (**p--)();
+}
+
+static void
+__ctors()
+{
+ void (**p)(void) = __CTOR_LIST__ + 1;
+
+ while (*p)
+ (**p++)();
+}
+
+void
+__init()
+{
+ static int initialized = 0;
+
+ /*
+ * Call global constructors.
+ * Arrange to call global destructors at exit.
+ */
+ if (!initialized) {
+ initialized = 1;
+ __ctors();
+ }
+ atexit(__dtors);
+
+}
+
+void
+__fini()
+{
+ /*
+ * Call global destructors.
+ */
+ __dtors();
+}
+
+#endif /* !ECOFF_COMPAT */
diff --git a/lib/csu/powerpc/crtend.s b/lib/csu/powerpc/crtend.s
new file mode 100644
index 00000000000..e7d0ca90a9b
--- /dev/null
+++ b/lib/csu/powerpc/crtend.s
@@ -0,0 +1,8 @@
+/*
+ * Emperically created.
+ * this is the NULL terminator for the ctors and dtors lists.
+ */
+.section .ctors,"aw"
+ .long 0
+.section .dtors,"aw"
+ .long 0