Check-in of powerpc csu support.
authorrahnds <rahnds@openbsd.org>
Sat, 21 Dec 1996 20:53:48 +0000 (20:53 +0000)
committerrahnds <rahnds@openbsd.org>
Sat, 21 Dec 1996 20:53:48 +0000 (20:53 +0000)
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.

lib/csu/powerpc/Makefile [new file with mode: 0644]
lib/csu/powerpc/crt0.s [new file with mode: 0644]
lib/csu/powerpc/crtbegin.c [new file with mode: 0644]
lib/csu/powerpc/crtend.s [new file with mode: 0644]

diff --git a/lib/csu/powerpc/Makefile b/lib/csu/powerpc/Makefile
new file mode 100644 (file)
index 0000000..b845845
--- /dev/null
@@ -0,0 +1,38 @@
+#      from: @(#)Makefile      8.1 (Berkeley) 6/1/93
+#      $Id: Makefile,v 1.1.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 (file)
index 0000000..964a05f
--- /dev/null
@@ -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 (file)
index 0000000..ff818f2
--- /dev/null
@@ -0,0 +1,116 @@
+/*     $OpenBSD: crtbegin.c,v 1.1.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 (file)
index 0000000..e7d0ca9
--- /dev/null
@@ -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