Skip to content

Commit

Permalink
2006-12-08 Sa Liu <[email protected]>
Browse files Browse the repository at this point in the history
        * spu/exit.c (libgloss_exit): Rename from this ..
        (_exit): .. to this. Overhaul.
        (exit): Remove.
        * spu/crt0.S, spu/crti.S, spu/crtn.S: New files.
        * spu/crt0.C, spu/init.c: Remove.
        * spu/configure.in (AC_INIT): Check for crt0.S, not crt0.C.
        * spu/configure: Regenerate.
        * spu/Makefile.in (crti.o, crtn.o, crt1.o, crt2.o): New targets.
        (OBJS): Remove init.o.
        (CRTOBJS): New.
        (OUTPUTS): Add $(CRTOBJS).
  • Loading branch information
jjohnstn committed Dec 8, 2006
1 parent da6b5ab commit b81d0f0
Show file tree
Hide file tree
Showing 9 changed files with 323 additions and 86 deletions.
16 changes: 15 additions & 1 deletion libgloss/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,4 +1,18 @@
2006-11-27 Jeff Johnston <[email protected]>
2006-12-08 Sa Liu <[email protected]>

* spu/exit.c (libgloss_exit): Rename from this ..
(_exit): .. to this. Overhaul.
(exit): Remove.
* spu/crt0.S, spu/crti.S, spu/crtn.S: New files.
* spu/crt0.C, spu/init.c: Remove.
* spu/configure.in (AC_INIT): Check for crt0.S, not crt0.C.
* spu/configure: Regenerate.
* spu/Makefile.in (crti.o, crtn.o, crt1.o, crt2.o): New targets.
(OBJS): Remove init.o.
(CRTOBJS): New.
(OUTPUTS): Add $(CRTOBJS).

I2006-11-27 Jeff Johnston <[email protected]>

* mips/crt0.S: Fix preprocessor statements from previous patch
to be ANSI.
Expand Down
18 changes: 16 additions & 2 deletions libgloss/spu/Makefile.in
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ OBJDUMP = `t='$(program_transform_name)'; echo objdump | sed -e $$t`
OBJCOPY = `t='$(program_transform_name)'; echo objcopy | sed -e $$t`

# object files needed
OBJS = syscalls.o init.o exit.o sbrk.o close.o fstat.o getpid.o isatty.o \
OBJS = syscalls.o exit.o sbrk.o close.o fstat.o getpid.o isatty.o \
kill.o lseek.o open.o read.o unlink.o write.o stat.o

# Object files specific to particular targets.
Expand All @@ -63,7 +63,8 @@ EVALOBJS = ${OBJS}
GCC_LDFLAGS = `if [ -d ${objroot}/../gcc ] ; \
then echo -L${objroot}/../gcc ; fi`

OUTPUTS = libgloss.a crt0.o
CRTOBJS = crti.o crtn.o crt1.o crt2.o
OUTPUTS = libgloss.a $(CRTOBJS)

NEWLIB_CFLAGS = `if [ -d ${objroot}/newlib ]; then echo -I${objroot}/newlib/targ-include -I${srcroot}/newlib/libc/include; fi` -ffunction-sections -fdata-sections
NEWLIB_LDFLAGS = `if [ -d ${objroot}/newlib ]; then echo -B${objroot}/newlib/ -L${objroot}/newlib/; fi`
Expand Down Expand Up @@ -111,6 +112,19 @@ libgloss.a: $(EVALOBJS)
${AR} ${ARFLAGS} $@ $(EVALOBJS)
${RANLIB} $@

# C Runtime Library startup code.
crti.o:
$(CC) $(srcdir)/crti.S -c -o crti.o

crtn.o:
$(CC) $(srcdir)/crtn.S -c -o crtn.o

crt1.o:
$(CC) $(srcdir)/crt0.S -c -o crt1.o

crt2.o:
$(CC) $(srcdir)/crt0.S -D_STD_MAIN -c -o crt2.o

doc:

clean mostlyclean:
Expand Down
2 changes: 1 addition & 1 deletion libgloss/spu/configure
Original file line number Diff line number Diff line change
Expand Up @@ -271,7 +271,7 @@ PACKAGE_VERSION=
PACKAGE_STRING=
PACKAGE_BUGREPORT=

ac_unique_file="crt0.c"
ac_unique_file="crt0.S"
ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CC am__leading_dot DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE AS AR LD RANLIB ac_ct_RANLIB CCAS CCASFLAGS host_makefile_frag_path LIBOBJS LTLIBOBJS'
ac_subst_files='host_makefile_frag'

Expand Down
2 changes: 1 addition & 1 deletion libgloss/spu/configure.in
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
dnl Process this file with autoconf to produce a configure script.
AC_PREREQ(2.59)dnl
AC_INIT(crt0.c)
AC_INIT(crt0.S)

if test "$srcdir" = "." ; then
if test "${with_target_subdir}" != "." ; then
Expand Down
168 changes: 168 additions & 0 deletions libgloss/spu/crt0.S
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
/* (C) Copyright IBM Corp. 2005, 2006
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* 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.
* Neither the name of IBM nor the names of its contributors may be
used to endorse or promote products derived from this software without
specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
*/

/* crt0.S - entry function for C Runtime.
*
* With _STD_MAIN switch, the crt0.S will be compiled to crt2.o.
* The crt2.o sets up a C99-style interface for the SPU application's
* main() function, including a local copy of argv strings.
*
* The number of argument strings is passed in R3. The size and EA
* location of the argument vector region is passed in R4. Once the
* argv region is copied to the highest range of LS, and $SP is set
* just below it.
*
* Without _STD_MAIN, the crt0.S is compiled to crt1.o.
* The crt1.o prepares the entry for an SPU module. The main() function
* is called with different parameter list: spu_id, param and env
* are passed by R3, R4 and R5 respectively.
*/

#ifdef _STD_MAIN
#define MFC_TAG_UPDATE_ALL 2
#define MFC_GET_CMD 0x40
#define TAGID 0
#define TAGMASK 1
#endif

.text
.global _start
.type _start, @function

_start:
#ifdef _STD_MAIN
/*
* Copy the argument vector region from EA to LS. The DMA
* parameters are passed in R4:
*
* +-------+-------+-------+-------+
* R4 | LS | EA-HI | EA-LO | SIZE |
* +-------+-------+-------+-------+
* word 0 1 2 3
*
* By the end of this sequence, the prefered slot (word 0) of
* R4 will contain the LS offset of argv region, which also
* serves as the base offset for $SP.
*/
wrch $MFC_LSA, $4
rotqbyi $4, $4, 4
wrch $MFC_EAH, $4
rotqbyi $4, $4, 4
wrch $MFC_EAL, $4
rotqbyi $4, $4, 4
wrch $MFC_Size, $4
rotqbyi $4, $4, 4
il $LR, TAGID
wrch $MFC_TagID, $LR

/* Issue MFC_GET_CMD, then wait for transfer of argument
* vector region to complete.
*/
il $LR, MFC_GET_CMD
wrch $MFC_Cmd, $LR
il $LR, TAGMASK
wrch $MFC_WrTagMask, $LR
il $LR, MFC_TAG_UPDATE_ALL
wrch $MFC_WrTagUpdate, $LR
rdch $LR, $MFC_RdTagStat
#endif

/* Save parameter list of main function to the non-volatile
* registers. spu_thread module has three parameters, while
* spulet only has two.
*/
ori $80, $3, 0
ori $81, $4, 0
#ifndef _STD_MAIN
ori $82, $5, 0
#endif

/* The Link Register is initialized to NULL.
*/
il $LR, 0

#ifdef _STD_MAIN
/* For spulet, initialize stack pointer just below the argv region.
*/
ai $SP,$4,-16
#else
/* For spe_thread module, the stack pointer is initialized
* below the area where __stack points to.
*/
ila $SP,__stack
#endif
/* Initialize back chain to NULL.
*/
stqd $LR,0($SP)

/* Allocate 2 slots for stack frame.
*/
stqd $SP,-32($SP)
ai $SP,$SP,-32

/* Save the Link Register in Link Register Save Area.
*/
stqd $LR,16($SP)

/* Calculate stack size.
*/
ila $3,_end
sf $3,$3,$SP

/* The BE Linux ABI passes the stack size in $2, or use
* the default if $2 == 0.
*/
rotqbyi $4,$2,12
ceqi $5,$4,0
selb $3,$4,$3,$5
fsmbi $4,3840
selb $SP,$SP,$3,$4

/* Call the _init function.
*/
brsl $LR, _init

/* Call the _fini function at exit time.
*/
ila $3, _fini
brsl $LR, atexit

ori $3,$80,0
ori $4,$81,0
#ifndef _STD_MAIN
ori $5,$82,0
#endif

/* Call the programs main.
*/
brsl $LR, main

/* Call exit.
*/
brsl $LR, exit

66 changes: 66 additions & 0 deletions libgloss/spu/crti.S
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
# (C) Copyright IBM Corp. 2005, 2006
#
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# * 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.
# * Neither the name of IBM nor the names of its contributors may be
# used to endorse or promote products derived from this software without
# specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
#
# This file just make a stack frame for the contents of the .fini and
# .init sections. Users may put any desired instructions in those
# sections.

# Note - this macro is complimented by the FUNC_END macro
# in crtn.S. If you change this macro you must also change
# that macro match.
.macro FUNC_START
# Create a stack frame with two slots: LR and BC
# The .init and .fini section don't change the call-preserved
# registes, therefore no need to save them.
stqd $lr, 16($sp)
stqd $sp, -32($sp)
ai $sp, $sp, -32
.endm

.file "crti.S"

.section ".init"
.align 2

# To make sure the address of _init is not zero, because
# the default linker entry point is 0.
nop

.global _init
.type _init, @function
_init:
FUNC_START


.section ".fini"
.align 2
.global _fini
.type _fini, @function
_fini:
FUNC_START

56 changes: 56 additions & 0 deletions libgloss/spu/crtn.S
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
# (C) Copyright IBM Corp. 2005, 2006
#
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# * 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.
# * Neither the name of IBM nor the names of its contributors may be
# used to endorse or promote products derived from this software without
# specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
#
# This file just makes sure that the .fini and .init sections do in
# fact return. Users may put any desired instructions in those sections.
# This file is the last thing linked into any executable.

# Note - this macro is complimented by the FUNC_START macro
# in crti.S. If you change this macro you must also change
# that macro match.
#
# Note - we do not try any fancy optimisations of the return
# sequences here, it is just not worth it. Instead keep things
# simple. The link register is restored and then the correct
# function return instruction is performed.
.macro FUNC_END
ai $sp, $sp, 32
lqd $lr, 16($sp)
bi $lr
.endm
.file "crtn.S"

.section ".init"

FUNC_END

.section ".fini"

FUNC_END

# end of crtn.S
Loading

0 comments on commit b81d0f0

Please sign in to comment.