diff --git a/ChangeLog b/ChangeLog index 6a751ed9fa..f3cecc8b28 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,117 @@ +1997-06-29 23:43 Ulrich Drepper + + * config.make.in: Define need-nopic-initfini. + * configure.in: Write out nopic_initfini. + * csu/Makefile: Generate no-PIC crt code if need-nopic-initfini + is defined. + + * sysdeps/i386/fpu/fraiseexcpt.c: Correct FE_INEXACT case. + + * sysdeps/sparc/rem.S: Get trap definition properly. + * sysdeps/sparc/sdiv.S: Likewise. + * sysdeps/sparc/udiv.S: Likewise. + * sysdeps/sparc/urem.S: Likewise. + * sysdeps/sparc/setjmp.S: Include . + * sysdeps/sparc/sys/trap.h: New file. + * sysdeps/unix/sysv/linux/sparc/sys/trap.h: New file. + +1997-06-25 10:26 Thorsten Kukuk + + * sysdeps/generic/rpc/auth.h: Add xdr_opaque_auth declaration. + +1997-06-29 10:34 Fila Kolodny + + * sysdeps/mach/hurd/select.c (__select): Change MACH_MSG_SIZE_INTEGER_T + to MACH_MSG_TYPE_INTEGER_T. + +1997-06-29 01:04 Richard Henderson + + Initial sparc64-linux support: + * configure.in: Recognize sparc64 as being different from sparc. + * io/ftwtest-sh: Only invoke ld.so if it exists. + * math/Makefile (LDLIBS-*): Change from libm to math/libm to get + static tests to link. Honour $(omit-long-double-fcts) == yes. + * math/libm-test.c (test_single_exception): The argument to + fetestexcept is `int' not `fexcept_t'. + * shlib-versions: Recognize sparc64. + * signal/signal.h: Add typedef for stack_t. + + * stdio-common/_itoa.c: Defaulting UMUL_TIME==UDIV_TIME is broken. + Attempt to fix up most of this by cleaning up assumptions below, + but give up and change the defaults. + + * setjmp/longjmp.c: Moved to ... + * sysdeps/generic/longjmp.c: ... here. + * setjmp/sigjmp.c: Moved to ... + * sysdeps/generic/sigjmp.c: ... here. + + * sysdeps/sparc/bsd-_setjmp.S [PIC]: There wasn't even valid asm here. + Ought to fix up gas to catch these silly things properly. + * sysdeps/sparc/bsd-setjmp.S: Likewise. + + * sysdeps/unix/sysv/linux/sparc/errno.c: Remove. + * sysdeps/unix/sysv/linux/sparc/kernel_sigaction.h: Remove. + * sysdeps/unix/sysv/linux/sparc/kernel_stat.h: Tell xstat about + the unused fields. + + * sysdeps/sparc/sparc64/add_n.s: Moved to ... + * sysdeps/sparc64/add_n.S: ... here. Fix up %g4 and stack usage. + * sysdeps/sparc/sparc64/addmul_1.s: Likewise. + * sysdeps/sparc/sparc64/gmp-mparam.h: Likewise. + * sysdeps/sparc/sparc64/lshift.s: Likewise. + * sysdeps/sparc/sparc64/mul_1.s: Likewise. + * sysdeps/sparc/sparc64/rshift.s: Likewise. + * sysdeps/sparc/sparc64/sub_n.s: Likewise. + * sysdeps/sparc/sparc64/submul_1.s: Likewise. + + * sysdeps/sparc64/Implies: New file. + * sysdeps/sparc64/Makefile: Likewise. + * sysdeps/sparc64/bits/endian.h: Likewise. + * sysdeps/sparc64/bsd-_setjmp.S: Likewise. + * sysdeps/sparc64/bsd-setjmp.S: Likewise. + * sysdeps/sparc64/dl-machine.h: Likewise. + * sysdeps/sparc64/elf/Makefile: Likewise. + * sysdeps/sparc64/elf/crtbegin.S: Likewise. + * sysdeps/sparc64/elf/crtbeginS.S: Likewise. + * sysdeps/sparc64/elf/crtend.S: Likewise. + * sysdeps/sparc64/elf/crtendS.S: Likewise. + * sysdeps/sparc64/elf/start.S: Likewise. + * sysdeps/sparc64/fpu_control.h: Likewise. + * sysdeps/unix/sysv/linux/sparc64/Makefile: Likewise. + * sysdeps/unix/sysv/linux/sparc64/__longjmp.S: Likewise. + * sysdeps/unix/sysv/linux/sparc64/bits/setjmp.h: Likewise. + * sysdeps/unix/sysv/linux/sparc64/bits/types.h: Likewise. + * sysdeps/unix/sysv/linux/sparc64/brk.S: Likewise. + * sysdeps/unix/sysv/linux/sparc64/clone.S: Likewise. + * sysdeps/unix/sysv/linux/sparc64/fork.S: Likewise. + * sysdeps/unix/sysv/linux/sparc64/getcontext.S: Likewise. + * sysdeps/unix/sysv/linux/sparc64/init-first.h: Likewise. + * sysdeps/unix/sysv/linux/sparc64/kernel_stat.h: Likewise. + * sysdeps/unix/sysv/linux/sparc64/longjmp.S: Likewise. + * sysdeps/unix/sysv/linux/sparc64/pipe.S: Likewise. + * sysdeps/unix/sysv/linux/sparc64/profil-counter.h: Likewise. + * sysdeps/unix/sysv/linux/sparc64/setcontext.S: Likewise. + * sysdeps/unix/sysv/linux/sparc64/setjmp.S: Likewise. + * sysdeps/unix/sysv/linux/sparc64/sigjmp.S: Likewise. + * sysdeps/unix/sysv/linux/sparc64/syscalls.list: Likewise. + * sysdeps/unix/sysv/linux/sparc64/sysdep.S: Likewise. + * sysdeps/unix/sysv/linux/sparc64/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/sparc64/ucontext.h: Likewise. + +1997-06-28 16:28 H.J. Lu + + * configure.in: Add -nostartfiles -nostdlib when check for + --version-script. + +1997-06-28 12:03 H.J. Lu + + * sysdeps/powerpc/bits/endian.h: New file. + +1997-06-28 20:52 Ulrich Drepper + + * sysdeps/unix/sysv/linux/syscalls.list: Add getresgid and + setresgid. + 1997-06-27 20:09 Ulrich Drepper * sysdeps/unix/sysv/linux/sys/quota.h: Add . diff --git a/config.guess b/config.guess index c22925bcfe..6cbbe8c938 100755 --- a/config.guess +++ b/config.guess @@ -423,6 +423,9 @@ EOF i*:CYGWIN*:*) echo i386-pc-cygwin32 exit 0 ;; + i*:MINGW*:*) + echo i386-pc-mingw32 + exit 0 ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin32 exit 0 ;; diff --git a/config.make.in b/config.make.in index 2bf33b487f..14ce430a30 100644 --- a/config.make.in +++ b/config.make.in @@ -25,6 +25,7 @@ defines = @DEFINES@ elf = @elf@ have-initfini = @libc_cv_have_initfini@ +need-nopic-initfini = @nopic_initfini@ versioning = @VERSIONING@ diff --git a/config.sub b/config.sub index 484d854300..3caaa0c088 100755 --- a/config.sub +++ b/config.sub @@ -1,6 +1,6 @@ #! /bin/sh # Configuration validation subroutine script, version 1.1. -# Copyright (C) 1991, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. +# Copyright (C) 1991, 92, 93, 94, 95, 96, 1997 Free Software Foundation, Inc. # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. @@ -701,7 +701,7 @@ case $os in | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -cygwin32* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ - | -linux-gnu* | -uxpv*) + | -mingw32* | -linux-gnu* | -uxpv*) # Remember, each alternative MUST END IN *, to match a version number. ;; -linux*) diff --git a/configure b/configure index 253d947776..0652d6fc30 100755 --- a/configure +++ b/configure @@ -826,6 +826,7 @@ mips*) base_machine=mips machine=mips/$machine ;; mips64*) base_machine=mips64 machine=mips/mips64/$machine ;; sparc[6789]) base_machine=sparc machine=sparc/$machine ;; supersparc) base_machine=sparc machine=sparc/sparc8 ;; +sparc64) base_machine=sparc64 machine=sparc64/$machine ;; esac @@ -833,7 +834,7 @@ esac # This can take a while to compute. sysdep_dir=$srcdir/sysdeps echo $ac_n "checking sysdep dirs""... $ac_c" 1>&6 -echo "configure:837: checking sysdep dirs" >&5 +echo "configure:838: checking sysdep dirs" >&5 # Make sco3.2v4 become sco3.2.4 and sunos4.1.1_U1 become sunos4.1.1.U1. os="`echo $os | sed 's/\([0-9A-Z]\)[v_]\([0-9A-Z]\)/\1.\2/g'`" @@ -1034,7 +1035,7 @@ echo "$ac_t""sysdeps/generic sysdeps/stub include" 1>&6 # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 -echo "configure:1038: checking for a BSD compatible install" >&5 +echo "configure:1039: checking for a BSD compatible install" >&5 if test -z "$INSTALL"; then if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1088,7 +1089,7 @@ if test "$INSTALL" = "${srcdir}/install-sh -c"; then INSTALL='$(..)./install-sh -c' fi echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6 -echo "configure:1092: checking whether ln -s works" >&5 +echo "configure:1093: checking whether ln -s works" >&5 if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1113,7 +1114,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1117: checking for $ac_word" >&5 +echo "configure:1118: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_MSGFMT'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1146,7 +1147,7 @@ test -n "$MSGFMT" || MSGFMT=":" # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1150: checking for $ac_word" >&5 +echo "configure:1151: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1175,7 +1176,7 @@ if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1179: checking for $ac_word" >&5 +echo "configure:1180: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1223,7 +1224,7 @@ fi fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:1227: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 +echo "configure:1228: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. @@ -1233,11 +1234,11 @@ ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS cross_compiling=$ac_cv_prog_cc_cross cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1242: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then ac_cv_prog_cc_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then @@ -1260,13 +1261,13 @@ else cross_linkable=yes fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:1264: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "configure:1265: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 cross_compiling=$ac_cv_prog_cc_cross echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 -echo "configure:1270: checking whether we are using GNU C" >&5 +echo "configure:1271: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1275,7 +1276,7 @@ else yes; #endif EOF -if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1279: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then +if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1280: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no @@ -1292,7 +1293,7 @@ if test $ac_cv_prog_gcc = yes; then yes; #endif EOF - if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1296: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then + if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1297: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then if test -z "$CFLAGS"; then CFLAGS="-g -O2" fi @@ -1304,7 +1305,7 @@ else fi echo $ac_n "checking build system type""... $ac_c" 1>&6 -echo "configure:1308: checking build system type" >&5 +echo "configure:1309: checking build system type" >&5 build_alias=$build case "$build_alias" in @@ -1327,7 +1328,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1331: checking for $ac_word" >&5 +echo "configure:1332: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_BUILD_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1358,7 +1359,7 @@ done fi echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 -echo "configure:1362: checking how to run the C preprocessor" >&5 +echo "configure:1363: checking how to run the C preprocessor" >&5 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= @@ -1373,13 +1374,13 @@ else # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1383: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:1384: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then : @@ -1390,13 +1391,13 @@ else rm -rf conftest* CPP="${CC-cc} -E -traditional-cpp" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1400: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:1401: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then : @@ -1427,7 +1428,7 @@ fi # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1431: checking for $ac_word" >&5 +echo "configure:1432: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1458,7 +1459,7 @@ fi # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1462: checking for $ac_word" >&5 +echo "configure:1463: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1489,7 +1490,7 @@ if test -n "$ac_tool_prefix"; then # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1493: checking for $ac_word" >&5 +echo "configure:1494: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1524,7 +1525,7 @@ fi # Extract the first word of "bash", so it can be a program name with args. set dummy bash; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1528: checking for $ac_word" >&5 +echo "configure:1529: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_BASH'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1565,7 +1566,7 @@ if test "$BASH" = no; then # Extract the first word of "ksh", so it can be a program name with args. set dummy ksh; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1569: checking for $ac_word" >&5 +echo "configure:1570: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_KSH'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1607,7 +1608,7 @@ fi echo $ac_n "checking for signed size_t type""... $ac_c" 1>&6 -echo "configure:1611: checking for signed size_t type" >&5 +echo "configure:1612: checking for signed size_t type" >&5 if eval "test \"`echo '$''{'libc_cv_signed_size_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1631,12 +1632,12 @@ EOF fi echo $ac_n "checking for libc-friendly stddef.h""... $ac_c" 1>&6 -echo "configure:1635: checking for libc-friendly stddef.h" >&5 +echo "configure:1636: checking for libc-friendly stddef.h" >&5 if eval "test \"`echo '$''{'libc_cv_friendly_stddef'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1656: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* libc_cv_friendly_stddef=yes else @@ -1670,7 +1671,7 @@ override stddef.h = # The installed seems to be libc-friendly." fi echo $ac_n "checking whether we need to use -P to assemble .S files""... $ac_c" 1>&6 -echo "configure:1674: checking whether we need to use -P to assemble .S files" >&5 +echo "configure:1675: checking whether we need to use -P to assemble .S files" >&5 if eval "test \"`echo '$''{'libc_cv_need_minus_P'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1693,7 +1694,7 @@ asm-CPPFLAGS = -P # The assembler can't grok cpp's # line directives." fi echo $ac_n "checking for assembler global-symbol directive""... $ac_c" 1>&6 -echo "configure:1697: checking for assembler global-symbol directive" >&5 +echo "configure:1698: checking for assembler global-symbol directive" >&5 if eval "test \"`echo '$''{'libc_cv_asm_global_directive'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1723,7 +1724,7 @@ EOF fi echo $ac_n "checking for .set assembler directive""... $ac_c" 1>&6 -echo "configure:1727: checking for .set assembler directive" >&5 +echo "configure:1728: checking for .set assembler directive" >&5 if eval "test \"`echo '$''{'libc_cv_asm_set_directive'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1757,7 +1758,7 @@ EOF fi echo $ac_n "checking for .symver assembler directive""... $ac_c" 1>&6 -echo "configure:1761: checking for .symver assembler directive" >&5 +echo "configure:1762: checking for .symver assembler directive" >&5 if eval "test \"`echo '$''{'libc_cv_asm_symver_directive'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1776,7 +1777,7 @@ fi echo "$ac_t""$libc_cv_asm_symver_directive" 1>&6 echo $ac_n "checking for ld --version-script""... $ac_c" 1>&6 -echo "configure:1780: checking for ld --version-script" >&5 +echo "configure:1781: checking for ld --version-script" >&5 if eval "test \"`echo '$''{'libc_cv_ld_version_script_option'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1792,9 +1793,10 @@ VERS { }; EOF if ${CC-cc} -c $CFLAGS $CPPFLAGS conftest.s 1>&5 2>&5; then - if { ac_try='${CC-cc} $CFLAGS --shared -o conftest.so conftest.o + if { ac_try='${CC-cc} $CFLAGS -shared -o conftest.so conftest.o + -nostartfiles -nostdlib -Wl,--version-script,conftest.map - 1>&5'; { (eval echo configure:1798: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; + 1>&5'; { (eval echo configure:1800: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then libc_cv_ld_version_script_option=yes else @@ -1824,7 +1826,7 @@ fi if test $elf = yes; then echo $ac_n "checking for .previous assembler directive""... $ac_c" 1>&6 -echo "configure:1828: checking for .previous assembler directive" >&5 +echo "configure:1830: checking for .previous assembler directive" >&5 if eval "test \"`echo '$''{'libc_cv_asm_previous_directive'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1832,7 +1834,7 @@ else .section foo_section .previous EOF - if { ac_try='${CC-cc} -c $CFLAGS conftest.s 1>&5'; { (eval echo configure:1836: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then + if { ac_try='${CC-cc} -c $CFLAGS conftest.s 1>&5'; { (eval echo configure:1838: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then libc_cv_asm_previous_directive=yes else libc_cv_asm_previous_directive=no @@ -1848,7 +1850,7 @@ EOF else echo $ac_n "checking for .popsection assembler directive""... $ac_c" 1>&6 -echo "configure:1852: checking for .popsection assembler directive" >&5 +echo "configure:1854: checking for .popsection assembler directive" >&5 if eval "test \"`echo '$''{'libc_cv_asm_popsection_directive'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1856,7 +1858,7 @@ else .pushsection foo_section .popsection EOF - if { ac_try='${CC-cc} -c $CFLAGS conftest.s 1>&5'; { (eval echo configure:1860: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then + if { ac_try='${CC-cc} -c $CFLAGS conftest.s 1>&5'; { (eval echo configure:1862: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then libc_cv_asm_popsection_directive=yes else libc_cv_asm_popsection_directive=no @@ -1876,12 +1878,12 @@ fi if test $elf != yes; then echo $ac_n "checking for .init and .fini sections""... $ac_c" 1>&6 -echo "configure:1880: checking for .init and .fini sections" >&5 +echo "configure:1882: checking for .init and .fini sections" >&5 if eval "test \"`echo '$''{'libc_cv_have_initfini'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1896: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* libc_cv_have_initfini=yes else @@ -1915,19 +1917,19 @@ if test $elf = yes; then libc_cv_asm_underscores=no else echo $ac_n "checking for _ prefix on C symbol names""... $ac_c" 1>&6 -echo "configure:1919: checking for _ prefix on C symbol names" >&5 +echo "configure:1921: checking for _ prefix on C symbol names" >&5 if eval "test \"`echo '$''{'libc_cv_asm_underscores'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1933: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* libc_cv_asm_underscores=yes else @@ -1954,7 +1956,7 @@ if test $elf = yes; then libc_cv_asm_weakext_directive=no else echo $ac_n "checking for assembler .weak directive""... $ac_c" 1>&6 -echo "configure:1958: checking for assembler .weak directive" >&5 +echo "configure:1960: checking for assembler .weak directive" >&5 if eval "test \"`echo '$''{'libc_cv_asm_weak_directive'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1977,7 +1979,7 @@ echo "$ac_t""$libc_cv_asm_weak_directive" 1>&6 if test $libc_cv_asm_weak_directive = no; then echo $ac_n "checking for assembler .weakext directive""... $ac_c" 1>&6 -echo "configure:1981: checking for assembler .weakext directive" >&5 +echo "configure:1983: checking for assembler .weakext directive" >&5 if eval "test \"`echo '$''{'libc_cv_asm_weakext_directive'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2014,7 +2016,7 @@ EOF fi echo $ac_n "checking for ld --no-whole-archive""... $ac_c" 1>&6 -echo "configure:2018: checking for ld --no-whole-archive" >&5 +echo "configure:2020: checking for ld --no-whole-archive" >&5 if eval "test \"`echo '$''{'libc_cv_ld_no_whole_archive'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2025,7 +2027,7 @@ __throw () {} EOF if { ac_try='${CC-cc} $CFLAGS -nostdlib -nostartfiles -Wl,--no-whole-archive - -o conftest conftest.c 1>&5'; { (eval echo configure:2029: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then + -o conftest conftest.c 1>&5'; { (eval echo configure:2031: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then libc_cv_ld_no_whole_archive=yes else libc_cv_ld_no_whole_archive=no @@ -2036,7 +2038,7 @@ fi echo "$ac_t""$libc_cv_ld_no_whole_archive" 1>&6 echo $ac_n "checking for gcc -fno-exceptions""... $ac_c" 1>&6 -echo "configure:2040: checking for gcc -fno-exceptions" >&5 +echo "configure:2042: checking for gcc -fno-exceptions" >&5 if eval "test \"`echo '$''{'libc_cv_gcc_no_exceptions'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2047,7 +2049,7 @@ __throw () {} EOF if { ac_try='${CC-cc} $CFLAGS -nostdlib -nostartfiles -fno-exceptions - -o conftest conftest.c 1>&5'; { (eval echo configure:2051: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then + -o conftest conftest.c 1>&5'; { (eval echo configure:2053: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then libc_cv_gcc_no_exceptions=yes else libc_cv_gcc_no_exceptions=no @@ -2099,7 +2101,7 @@ if test "$uname" = "sysdeps/generic"; then fi echo $ac_n "checking OS release for uname""... $ac_c" 1>&6 -echo "configure:2103: checking OS release for uname" >&5 +echo "configure:2105: checking OS release for uname" >&5 if eval "test \"`echo '$''{'libc_cv_uname_release'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2121,7 +2123,7 @@ echo "$ac_t""$libc_cv_uname_release" 1>&6 uname_release="$libc_cv_uname_release" echo $ac_n "checking OS version for uname""... $ac_c" 1>&6 -echo "configure:2125: checking OS version for uname" >&5 +echo "configure:2127: checking OS version for uname" >&5 if eval "test \"`echo '$''{'libc_cv_uname_version'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2143,7 +2145,7 @@ else fi echo $ac_n "checking stdio selection""... $ac_c" 1>&6 -echo "configure:2147: checking stdio selection" >&5 +echo "configure:2149: checking stdio selection" >&5 case $stdio in libio) cat >> confdefs.h <<\EOF @@ -2197,6 +2199,7 @@ fi + if test "`(cd $srcdir; pwd)`" = "`pwd`"; then config_makefile= else @@ -2385,6 +2388,7 @@ s%@profile@%$profile%g s%@omitfp@%$omitfp%g s%@bounded@%$bounded%g s%@static_nss@%$static_nss%g +s%@nopic_initfini@%$nopic_initfini%g s%@DEFINES@%$DEFINES%g s%@VERSION@%$VERSION%g diff --git a/configure.in b/configure.in index e734a9b876..2da201940e 100644 --- a/configure.in +++ b/configure.in @@ -159,6 +159,7 @@ mips*) base_machine=mips machine=mips/$machine ;; mips64*) base_machine=mips64 machine=mips/mips64/$machine ;; sparc[6789]) base_machine=sparc machine=sparc/$machine ;; supersparc) base_machine=sparc machine=sparc/sparc8 ;; +sparc64) base_machine=sparc64 machine=sparc64/$machine ;; esac changequote([,])dnl AC_SUBST(base_machine) @@ -527,7 +528,8 @@ VERS { }; EOF if ${CC-cc} -c $CFLAGS $CPPFLAGS conftest.s 1>&AC_FD_CC 2>&AC_FD_CC; then - if AC_TRY_COMMAND([${CC-cc} $CFLAGS --shared -o conftest.so conftest.o + if AC_TRY_COMMAND([${CC-cc} $CFLAGS -shared -o conftest.so conftest.o + -nostartfiles -nostdlib -Wl,--version-script,conftest.map 1>&AC_FD_CC]); then @@ -822,6 +824,7 @@ AC_SUBST(profile) AC_SUBST(omitfp) AC_SUBST(bounded) AC_SUBST(static_nss) +AC_SUBST(nopic_initfini) AC_SUBST(DEFINES) diff --git a/csu/Makefile b/csu/Makefile index c13ec1ec88..4c343541ae 100644 --- a/csu/Makefile +++ b/csu/Makefile @@ -52,19 +52,42 @@ CPPFLAGS += -DHAVE_INITFINI # "functions" _init and _fini to run the .init and .fini sections. crtstuff = crti crtn +# If we need separate startup code, require separate code. +ifeq ($(need-nopic-initfini),yes) +crtstuff += crtiS crtnS +endif + install-lib += $(crtstuff:=.o) extra-objs += $(crtstuff:=.o) -generated += $(crtstuff:=.S) initfini.s align.h end.h +generated += $(crtstuff:=.S) initfini.s initfiniS.s align.h end.h omit-deps += $(crtstuff) # Special rules for the building of crti.o and crtn.o $(objpfx)crt%.o: $(objpfx)crt%.S $(objpfx)defs.h - $(compile.S) -fPIC -g0 -o $@ + $(compile.S) -g0 -o $@ $(objpfx)initfini.s: initfini.c + $(compile.c) -g0 -S -finhibit-size-directive \ + $(no-exceptions) -o $@ + +$(objpfx)initfiniS.s: initfini.c $(compile.c) -g0 -S -fPIC -finhibit-size-directive \ $(no-exceptions) -o $@ +ifneq ($(need-nopic-initfini),yes) +# We only have one kind of startup code files. Static binaries and +# shared libraries are build using the PIC version. +$(objpfx)crti.S: $(objpfx)initfiniS.s + sed -n -e '1,/@HEADER_ENDS/p' \ + -e '/@_.*_PROLOG_BEGINS/,/@_.*_PROLOG_ENDS/p' \ + -e '/@TRAILER_BEGINS/,$$p' $< > $@ + +$(objpfx)crtn.S: $(objpfx)initfiniS.s + sed -n -e '1,/@HEADER_ENDS/p' \ + -e '/@_.*_EPILOG_BEGINS/,/@_.*_EPILOG_ENDS/p' \ + -e '/@TRAILER_BEGINS/,$$p' $< > $@ +else +# We have to build two versions, one with one without PIC code. $(objpfx)crti.S: $(objpfx)initfini.s sed -n -e '1,/@HEADER_ENDS/p' \ -e '/@_.*_PROLOG_BEGINS/,/@_.*_PROLOG_ENDS/p' \ @@ -75,6 +98,17 @@ $(objpfx)crtn.S: $(objpfx)initfini.s -e '/@_.*_EPILOG_BEGINS/,/@_.*_EPILOG_ENDS/p' \ -e '/@TRAILER_BEGINS/,$$p' $< > $@ +$(objpfx)crtiS.S: $(objpfx)initfiniS.s + sed -n -e '1,/@HEADER_ENDS/p' \ + -e '/@_.*_PROLOG_BEGINS/,/@_.*_PROLOG_ENDS/p' \ + -e '/@TRAILER_BEGINS/,$$p' $< > $@ + +$(objpfx)crtnS.S: $(objpfx)initfiniS.s + sed -n -e '1,/@HEADER_ENDS/p' \ + -e '/@_.*_EPILOG_BEGINS/,/@_.*_EPILOG_ENDS/p' \ + -e '/@TRAILER_BEGINS/,$$p' $< > $@ +endif + $(objpfx)defs.h: $(objpfx)initfini.s sed -n -e '/@TESTS_BEGIN/,/@TESTS_END/p' $< | \ awk -f defs.awk > $@ diff --git a/io/ftwtest-sh b/io/ftwtest-sh index da2eaf7313..79c35d4f9c 100644 --- a/io/ftwtest-sh +++ b/io/ftwtest-sh @@ -16,6 +16,8 @@ testprogram=$2 tmp=${TMPDIR:-/tmp} tmpdir=$tmp/ftwtest.d +[ -f ${objpfx}elf/ld.so ] && ldso=${objpfx}elf/ld.so + trap 'chmod -R a+x $tmpdir; rm -fr $tmpdir $testout' 1 2 3 15 if test -d $tmpdir; then @@ -40,7 +42,7 @@ chmod a-x,a+r $tmpdir/bar testout=${TMPDIR:-/tmp}/ftwtest.out -LD_LIBRARY_PATH=$objpfx ${objpfx}elf/ld.so $testprogram $tmpdir | +LD_LIBRARY_PATH=$objpfx $ldso $testprogram $tmpdir | sort > $testout cat < $testout cat < $testout cat < 0pt \epsfxsize=#2\relax \fi + \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi + \epsfbox{#1.eps}% +} % End of control word definitions. + \message{and turning on texinfo input format.} \def\openindices{% diff --git a/math/Makefile b/math/Makefile index 4eeb37f1e0..44b4e7de3e 100644 --- a/math/Makefile +++ b/math/Makefile @@ -87,13 +87,13 @@ tests = test-float test-double $(test-longdouble-$(long-double-fcts)) \ CFLAGS-test-float.c = -fno-inline CFLAGS-test-double.c = -fno-inline CFLAGS-test-ldouble.c = -fno-inline -LDLIBS-test-ifloat = libm -LDLIBS-test-idouble = libm -LDLIBS-test-ildoubl = libm -LDLIBS-test-float = libm -LDLIBS-test-double = libm -LDLIBS-test-ldouble = libm -LDLIBS-test-matherr = libm +LDLIBS-test-ifloat = math/libm +LDLIBS-test-idouble = math/libm +LDLIBS-test-ildoubl = math/libm +LDLIBS-test-float = math/libm +LDLIBS-test-double = math/libm +LDLIBS-test-ldouble = math/libm +LDLIBS-test-matherr = math/libm distribute += libm-test.c @@ -116,6 +116,8 @@ CPPFLAGS-s_lib_version.c := -D_POSIX_MODE # only the fdlibm code. CPPFLAGS += -D__NO_MATH_INLINES +# Using omit-long-double-fcts is only a temporary hack. +ifneq ($(omit-long-double-fcts),yes) ifneq ($(long-double-fcts),yes) # The `double' and `long double' types are the same on this machine. # We won't compile the `long double' code at all. Tell the `double' code @@ -124,6 +126,7 @@ ifneq ($(long-double-fcts),yes) # `double' instead of `long double'. CPPFLAGS += -DNO_LONG_DOUBLE -D_Mlong_double_=double endif +endif # The fdlibm code generates a lot of these warnings but is otherwise clean. override CFLAGS += -Wno-uninitialized -Wno-write-strings diff --git a/math/libm-test.c b/math/libm-test.c index 3dc6922a67..c2103d4a8b 100644 --- a/math/libm-test.c +++ b/math/libm-test.c @@ -251,7 +251,7 @@ static void test_single_exception (const char *test_name, short int exception, short int exc_flag, - fexcept_t fe_flag, + int fe_flag, const char *flag_name) { #ifndef TEST_INLINE diff --git a/shlib-versions b/shlib-versions index ac9ef78c62..e1a9f9a3a8 100644 --- a/shlib-versions +++ b/shlib-versions @@ -12,6 +12,7 @@ i.86-.*-.* libm=6 m68k-.*-.* libm=6 sparc-.*-.* libm=6 +sparc64-.*-.* libm=6 alpha-.*-linux.* libm=6.1 alpha-.*-.* libm=6 powerpc-.*-.* libm=6 @@ -33,6 +34,7 @@ alpha-.*-linux.* libc=6.1 # The dynamic loader also requires different names. i.86-.*-linux.* ld=ld-linux.so.2 sparc-.*-linux.* ld=ld-linux.so.2 +sparc64-.*-linux.* ld=ld-linux.so.2 alpha-.*-linux.* ld=ld-linux.so.2 # We use the ELF ABI standard name for the default. .*-.*-.* ld=ld.so.1 diff --git a/signal/signal.h b/signal/signal.h index 4e5d857d10..588c779f11 100644 --- a/signal/signal.h +++ b/signal/signal.h @@ -297,12 +297,12 @@ extern int sigstack __P ((__const struct sigstack *__ss, struct sigstack *__oss)); /* Alternate interface. */ -struct sigaltstack +typedef struct sigaltstack { __ptr_t ss_sp; size_t ss_size; int ss_flags; - }; + } stack_t; extern int sigaltstack __P ((__const struct sigaltstack *__ss, struct sigaltstack *__oss)); diff --git a/stdio-common/_itoa.c b/stdio-common/_itoa.c index cf0b0f1235..77181d940a 100644 --- a/stdio-common/_itoa.c +++ b/stdio-common/_itoa.c @@ -33,7 +33,7 @@ # define UMUL_TIME 1 #endif #ifndef UDIV_TIME -# define UDIV_TIME 1 +# define UDIV_TIME 3 #endif /* Control memory layout. */ @@ -68,14 +68,12 @@ struct base_table_t /* To reduce the memory needed we include some fields of the tables only conditionally. */ -#if BITS_PER_MP_LIMB == 32 -# if UDIV_TIME > 2 * UMUL_TIME -# define SEL1(X) X, -# define SEL2(X) ,X -# else -# define SEL1(X) -# define SEL2(X) -# endif +#if UDIV_TIME > 2 * UMUL_TIME +# define SEL1(X) X, +# define SEL2(X) ,X +#else +# define SEL1(X) +# define SEL2(X) #endif @@ -83,41 +81,41 @@ struct base_table_t static const struct base_table_t base_table[] = { #if BITS_PER_MP_LIMB == 64 - /* 2 */ {0ul, 1, 1}, - /* 3 */ {0xaaaaaaaaaaaaaaabul, 0, 1}, - /* 4 */ {0ul, 1, 2}, - /* 5 */ {0xcccccccccccccccdul, 0, 2}, - /* 6 */ {0xaaaaaaaaaaaaaaabul, 0, 2}, - /* 7 */ {0x2492492492492493ul, 1, 3}, - /* 8 */ {0ul, 1, 3}, - /* 9 */ {0xe38e38e38e38e38ful, 0, 3}, - /* 10 */ {0xcccccccccccccccdul, 0, 3}, - /* 11 */ {0x2e8ba2e8ba2e8ba3ul, 0, 1}, - /* 12 */ {0xaaaaaaaaaaaaaaabul, 0, 3}, - /* 13 */ {0x4ec4ec4ec4ec4ec5ul, 0, 2}, - /* 14 */ {0x2492492492492493ul, 1, 4}, - /* 15 */ {0x8888888888888889ul, 0, 3}, - /* 16 */ {0ul, 1, 4}, - /* 17 */ {0xf0f0f0f0f0f0f0f1ul, 0, 4}, - /* 18 */ {0xe38e38e38e38e38ful, 0, 4}, - /* 19 */ {0xd79435e50d79435ful, 0, 4}, - /* 20 */ {0xcccccccccccccccdul, 0, 4}, - /* 21 */ {0x8618618618618619ul, 1, 5}, - /* 22 */ {0x2e8ba2e8ba2e8ba3ul, 0, 2}, - /* 23 */ {0x642c8590b21642c9ul, 1, 5}, - /* 24 */ {0xaaaaaaaaaaaaaaabul, 0, 4}, - /* 25 */ {0x47ae147ae147ae15ul, 1, 5}, - /* 26 */ {0x4ec4ec4ec4ec4ec5ul, 0, 3}, - /* 27 */ {0x97b425ed097b425ful, 0, 4}, - /* 28 */ {0x2492492492492493ul, 1, 5}, - /* 29 */ {0x1a7b9611a7b9611bul, 1, 5}, - /* 30 */ {0x8888888888888889ul, 0, 4}, - /* 31 */ {0x0842108421084211ul, 1, 5}, - /* 32 */ {0ul, 1, 5}, - /* 33 */ {0x0f83e0f83e0f83e1ul, 0, 1}, - /* 34 */ {0xf0f0f0f0f0f0f0f1ul, 0, 5}, - /* 35 */ {0xea0ea0ea0ea0ea0ful, 0, 5}, - /* 36 */ {0xe38e38e38e38e38ful, 0, 5} + /* 2 */ {SEL1(0ul) 1, 1}, + /* 3 */ {SEL1(0xaaaaaaaaaaaaaaabul) 0, 1}, + /* 4 */ {SEL1(0ul) 1, 2}, + /* 5 */ {SEL1(0xcccccccccccccccdul) 0, 2}, + /* 6 */ {SEL1(0xaaaaaaaaaaaaaaabul) 0, 2}, + /* 7 */ {SEL1(0x2492492492492493ul) 1, 3}, + /* 8 */ {SEL1(0ul) 1, 3}, + /* 9 */ {SEL1(0xe38e38e38e38e38ful) 0, 3}, + /* 10 */ {SEL1(0xcccccccccccccccdul) 0, 3}, + /* 11 */ {SEL1(0x2e8ba2e8ba2e8ba3ul) 0, 1}, + /* 12 */ {SEL1(0xaaaaaaaaaaaaaaabul) 0, 3}, + /* 13 */ {SEL1(0x4ec4ec4ec4ec4ec5ul) 0, 2}, + /* 14 */ {SEL1(0x2492492492492493ul) 1, 4}, + /* 15 */ {SEL1(0x8888888888888889ul) 0, 3}, + /* 16 */ {SEL1(0ul) 1, 4}, + /* 17 */ {SEL1(0xf0f0f0f0f0f0f0f1ul) 0, 4}, + /* 18 */ {SEL1(0xe38e38e38e38e38ful) 0, 4}, + /* 19 */ {SEL1(0xd79435e50d79435ful) 0, 4}, + /* 20 */ {SEL1(0xcccccccccccccccdul) 0, 4}, + /* 21 */ {SEL1(0x8618618618618619ul) 1, 5}, + /* 22 */ {SEL1(0x2e8ba2e8ba2e8ba3ul) 0, 2}, + /* 23 */ {SEL1(0x642c8590b21642c9ul) 1, 5}, + /* 24 */ {SEL1(0xaaaaaaaaaaaaaaabul) 0, 4}, + /* 25 */ {SEL1(0x47ae147ae147ae15ul) 1, 5}, + /* 26 */ {SEL1(0x4ec4ec4ec4ec4ec5ul) 0, 3}, + /* 27 */ {SEL1(0x97b425ed097b425ful) 0, 4}, + /* 28 */ {SEL1(0x2492492492492493ul) 1, 5}, + /* 29 */ {SEL1(0x1a7b9611a7b9611bul) 1, 5}, + /* 30 */ {SEL1(0x8888888888888889ul) 0, 4}, + /* 31 */ {SEL1(0x0842108421084211ul) 1, 5}, + /* 32 */ {SEL1(0ul) 1, 5}, + /* 33 */ {SEL1(0x0f83e0f83e0f83e1ul) 0, 1}, + /* 34 */ {SEL1(0xf0f0f0f0f0f0f0f1ul) 0, 5}, + /* 35 */ {SEL1(0xea0ea0ea0ea0ea0ful) 0, 5}, + /* 36 */ {SEL1(0xe38e38e38e38e38ful) 0, 5} #endif #if BITS_PER_MP_LIMB == 32 /* 2 */ {SEL1(0ul) 1, 1, {0, 31, 0x80000000ul SEL2(0xfffffffful)}}, diff --git a/setjmp/longjmp.c b/sysdeps/generic/longjmp.c similarity index 100% rename from setjmp/longjmp.c rename to sysdeps/generic/longjmp.c diff --git a/sysdeps/generic/rpc/auth.h b/sysdeps/generic/rpc/auth.h index 532c4d295f..b4022853d5 100644 --- a/sysdeps/generic/rpc/auth.h +++ b/sysdeps/generic/rpc/auth.h @@ -177,6 +177,11 @@ extern AUTH *authdes_create __P ((char *__servername, u_int __window, #define AUTH_DES 3 /* des style (encrypted timestamps) */ #define AUTH_KERB 4 /* kerberos style */ +/* + * XDR an opaque authentication struct. + */ +extern bool_t xdr_opaque_auth __P ((XDR *__xdrs, struct opaque_auth *__ap)); + __END_DECLS #endif /* rpc/auth.h */ diff --git a/setjmp/sigjmp.c b/sysdeps/generic/sigjmp.c similarity index 100% rename from setjmp/sigjmp.c rename to sysdeps/generic/sigjmp.c diff --git a/sysdeps/i386/fpu/fraiseexcpt.c b/sysdeps/i386/fpu/fraiseexcpt.c index c6cd6d6672..174f5ad2b2 100644 --- a/sysdeps/i386/fpu/fraiseexcpt.c +++ b/sysdeps/i386/fpu/fraiseexcpt.c @@ -25,7 +25,7 @@ void feraiseexcept (int excepts) { /* Raise exceptions represented by EXPECTS. But we must raise only - one signal at a time. It is important the if the overflow/underflow + one signal at a time. It is important that if the overflow/underflow exception and the inexact exception are given at the same time, the overflow/underflow exception follows the inexact exception. */ @@ -91,8 +91,21 @@ feraiseexcept (int excepts) /* Last: inexact. */ if ((FE_INEXACT & excepts) != 0) { - long double d; - __asm__ ("fmul %%st, %%st(0); fwait" : "=t" (d) : "0" (LDBL_MAX)); - (void) &d; + /* There is no way to raise only the overflow flag. Do it the + hard way. */ + fenv_t temp; + + /* Bah, we have to clear selected exceptions. Since there is no + `fldsw' instruction we have to do it the hard way. */ + __asm__ ("fnstenv %0" : "=m" (*&temp)); + + /* Set the relevant bits. */ + temp.status_word |= FE_INEXACT; + + /* Put the new data in effect. */ + __asm__ ("fldenv %0" : : "m" (*&temp)); + + /* And raise the exception. */ + __asm__ ("fwait"); } } diff --git a/sysdeps/mach/hurd/select.c b/sysdeps/mach/hurd/select.c index 1ea6b2cb14..be27b667b9 100644 --- a/sysdeps/mach/hurd/select.c +++ b/sysdeps/mach/hurd/select.c @@ -223,7 +223,7 @@ __select (nfds, readfds, writefds, exceptfds, timeout) /* We got a message. Decode it. */ #define IO_SELECT_REPLY_MSGID (21012 + 100) /* XXX */ const mach_msg_type_t inttype = - { MACH_MSG_TYPE_INTEGER_T, sizeof (MACH_MSG_SIZE_INTEGER_T), + { MACH_MSG_TYPE_INTEGER_T, sizeof (MACH_MSG_TYPE_INTEGER_T), 1, 1, 0, 0 }; if (msg.head.msgh_id == IO_SELECT_REPLY_MSGID && msg.head.msgh_size >= sizeof msg.error && diff --git a/sysdeps/powerpc/bits/endian.h b/sysdeps/powerpc/bits/endian.h new file mode 100644 index 0000000000..e0e90cfd7a --- /dev/null +++ b/sysdeps/powerpc/bits/endian.h @@ -0,0 +1,3 @@ +/* PowerPC is big-endian. */ + +#define __BYTE_ORDER __BIG_ENDIAN diff --git a/sysdeps/sparc/bsd-_setjmp.S b/sysdeps/sparc/bsd-_setjmp.S index 522fe0e3a1..bf49765f4d 100644 --- a/sysdeps/sparc/bsd-_setjmp.S +++ b/sysdeps/sparc/bsd-_setjmp.S @@ -20,24 +20,21 @@ #include ENTRY (_setjmp) -#ifdef PIC -1: - jmpl 2f,%o1 - nop -2: - sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)),%l7 - or %l7,%lo(_GLOBAL_OFFSET_TABLE_-(1b-.)),%l7 - add %l7,%o1,%l7 - sethi %hi(C_SYMBOL_NAME (__sigsetjmp)),%g1 - or %g1,%lo(C_SYMBOL_NAME (__sigsetjmp)),%g1 - ld [%l7+%g1],%g1 - ld [%g1],%g1 - jmpl %g1,%g0 - mov %g0,%o1 /* Pass second argument of zero */ -#else - sethi %hi(C_SYMBOL_NAME (__sigsetjmp)), %g1 - or %lo(C_SYMBOL_NAME (__sigsetjmp)), %g1, %g1 - jmp %g1 - mov %g0, %o1 /* Pass second argument of zero. */ +#ifdef PIC + save %sp, -64, %sp +1: call 2f + sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %g1 +2: or %l7, %lo(_GLOBAL_OFFSET_TABLE_-(1b-.)), %g1 + add %g1, %o7, %g1 + sethi %hi(C_SYMBOL_NAME(__sigsetjmp)), %g2 + restore + or %g2, %lo(C_SYMBOL_NAME(__sigsetjmp)), %g2 + ld [%g1+%g2], %g1 +#else + sethi %hi(C_SYMBOL_NAME(__sigsetjmp)), %g1 + or %g1, %lo(C_SYMBOL_NAME(__sigsetjmp)), %g1 #endif + + jmp %g1 + mov %g0, %o1 /* Pass second argument of zero. */ diff --git a/sysdeps/sparc/bsd-setjmp.S b/sysdeps/sparc/bsd-setjmp.S index 09aee661da..16dc260765 100644 --- a/sysdeps/sparc/bsd-setjmp.S +++ b/sysdeps/sparc/bsd-setjmp.S @@ -20,23 +20,21 @@ #include ENTRY (setjmp) + #ifdef PIC -1: - jmpl 2f,%o1 - nop -2: - sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)),%l7 - or %l7,%lo(_GLOBAL_OFFSET_TABLE_-(1b-.)),%l7 - add %l7,%o1,%l7 - sethi %hi(C_SYMBOL_NAME (__sigsetjmp)),%g1 - or %g1,%lo(C_SYMBOL_NAME (__sigsetjmp)),%g1 - ld [%l7+%g1],%g1 - ld [%g1],%g1 - jmpl %g1,%g0 - mov 1,%o1 + save %sp, -64, %sp +1: call 2f + sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %g1 +2: or %l7, %lo(_GLOBAL_OFFSET_TABLE_-(1b-.)), %g1 + add %g1, %o7, %g1 + sethi %hi(C_SYMBOL_NAME(__sigsetjmp)), %g2 + restore + or %g2, %lo(C_SYMBOL_NAME(__sigsetjmp)), %g2 + ld [%g1+%g2], %g1 #else - sethi %hi(C_SYMBOL_NAME (__sigsetjmp)), %g1 - or %lo(C_SYMBOL_NAME (__sigsetjmp)), %g1, %g1 - jmp %g1 - mov 1, %o1 /* Pass second argument of one. */ + sethi %hi(C_SYMBOL_NAME(__sigsetjmp)), %g1 + or %g1, %lo(C_SYMBOL_NAME(__sigsetjmp)), %g1 #endif + + jmp %g1 + mov 1, %o1 /* Pass second argument of one. */ diff --git a/sysdeps/sparc/rem.S b/sysdeps/sparc/rem.S index 565fc0f678..05916f0b06 100644 --- a/sysdeps/sparc/rem.S +++ b/sysdeps/sparc/rem.S @@ -38,15 +38,7 @@ #include "DEFS.h" -#ifdef __linux__ -#include -#else -#ifdef __svr4__ #include -#else -#include -#endif -#endif FUNC(.rem) ! compute sign of result; if neither is negative, no problem @@ -189,14 +181,14 @@ Ldivloop: subcc %o3,%o5,%o3 b 9f add %o2, (7*2+1), %o2 - + L.4.23: ! remainder is negative addcc %o3,%o5,%o3 b 9f add %o2, (7*2-1), %o2 - - + + L.3.19: ! remainder is negative addcc %o3,%o5,%o3 @@ -207,15 +199,15 @@ L.3.19: subcc %o3,%o5,%o3 b 9f add %o2, (5*2+1), %o2 - + L.4.21: ! remainder is negative addcc %o3,%o5,%o3 b 9f add %o2, (5*2-1), %o2 - - - + + + L.2.17: ! remainder is negative addcc %o3,%o5,%o3 @@ -231,14 +223,14 @@ L.2.17: subcc %o3,%o5,%o3 b 9f add %o2, (3*2+1), %o2 - + L.4.19: ! remainder is negative addcc %o3,%o5,%o3 b 9f add %o2, (3*2-1), %o2 - - + + L.3.17: ! remainder is negative addcc %o3,%o5,%o3 @@ -249,16 +241,16 @@ L.3.17: subcc %o3,%o5,%o3 b 9f add %o2, (1*2+1), %o2 - + L.4.17: ! remainder is negative addcc %o3,%o5,%o3 b 9f add %o2, (1*2-1), %o2 - - - - + + + + L.1.16: ! remainder is negative addcc %o3,%o5,%o3 @@ -279,14 +271,14 @@ L.1.16: subcc %o3,%o5,%o3 b 9f add %o2, (-1*2+1), %o2 - + L.4.15: ! remainder is negative addcc %o3,%o5,%o3 b 9f add %o2, (-1*2-1), %o2 - - + + L.3.15: ! remainder is negative addcc %o3,%o5,%o3 @@ -297,15 +289,15 @@ L.3.15: subcc %o3,%o5,%o3 b 9f add %o2, (-3*2+1), %o2 - + L.4.13: ! remainder is negative addcc %o3,%o5,%o3 b 9f add %o2, (-3*2-1), %o2 - - - + + + L.2.15: ! remainder is negative addcc %o3,%o5,%o3 @@ -321,14 +313,14 @@ L.2.15: subcc %o3,%o5,%o3 b 9f add %o2, (-5*2+1), %o2 - + L.4.11: ! remainder is negative addcc %o3,%o5,%o3 b 9f add %o2, (-5*2-1), %o2 - - + + L.3.13: ! remainder is negative addcc %o3,%o5,%o3 @@ -339,16 +331,16 @@ L.3.13: subcc %o3,%o5,%o3 b 9f add %o2, (-7*2+1), %o2 - + L.4.9: ! remainder is negative addcc %o3,%o5,%o3 b 9f add %o2, (-7*2-1), %o2 - - - - + + + + 9: Lend_regular_divide: subcc %o4, 1, %o4 diff --git a/sysdeps/sparc/sdiv.S b/sysdeps/sparc/sdiv.S index 7397e5edb8..910cea528a 100644 --- a/sysdeps/sparc/sdiv.S +++ b/sysdeps/sparc/sdiv.S @@ -38,15 +38,7 @@ #include "DEFS.h" -#ifdef __linux__ -#include -#else -#ifdef __svr4__ #include -#else -#include -#endif -#endif FUNC(.div) ! compute sign of result; if neither is negative, no problem @@ -189,14 +181,14 @@ Ldivloop: subcc %o3,%o5,%o3 b 9f add %o2, (7*2+1), %o2 - + L.4.23: ! remainder is negative addcc %o3,%o5,%o3 b 9f add %o2, (7*2-1), %o2 - - + + L.3.19: ! remainder is negative addcc %o3,%o5,%o3 @@ -207,15 +199,15 @@ L.3.19: subcc %o3,%o5,%o3 b 9f add %o2, (5*2+1), %o2 - + L.4.21: ! remainder is negative addcc %o3,%o5,%o3 b 9f add %o2, (5*2-1), %o2 - - - + + + L.2.17: ! remainder is negative addcc %o3,%o5,%o3 @@ -231,14 +223,14 @@ L.2.17: subcc %o3,%o5,%o3 b 9f add %o2, (3*2+1), %o2 - + L.4.19: ! remainder is negative addcc %o3,%o5,%o3 b 9f add %o2, (3*2-1), %o2 - - + + L.3.17: ! remainder is negative addcc %o3,%o5,%o3 @@ -249,16 +241,16 @@ L.3.17: subcc %o3,%o5,%o3 b 9f add %o2, (1*2+1), %o2 - + L.4.17: ! remainder is negative addcc %o3,%o5,%o3 b 9f add %o2, (1*2-1), %o2 - - - - + + + + L.1.16: ! remainder is negative addcc %o3,%o5,%o3 @@ -279,14 +271,14 @@ L.1.16: subcc %o3,%o5,%o3 b 9f add %o2, (-1*2+1), %o2 - + L.4.15: ! remainder is negative addcc %o3,%o5,%o3 b 9f add %o2, (-1*2-1), %o2 - - + + L.3.15: ! remainder is negative addcc %o3,%o5,%o3 @@ -297,15 +289,15 @@ L.3.15: subcc %o3,%o5,%o3 b 9f add %o2, (-3*2+1), %o2 - + L.4.13: ! remainder is negative addcc %o3,%o5,%o3 b 9f add %o2, (-3*2-1), %o2 - - - + + + L.2.15: ! remainder is negative addcc %o3,%o5,%o3 @@ -321,14 +313,14 @@ L.2.15: subcc %o3,%o5,%o3 b 9f add %o2, (-5*2+1), %o2 - + L.4.11: ! remainder is negative addcc %o3,%o5,%o3 b 9f add %o2, (-5*2-1), %o2 - - + + L.3.13: ! remainder is negative addcc %o3,%o5,%o3 @@ -339,16 +331,16 @@ L.3.13: subcc %o3,%o5,%o3 b 9f add %o2, (-7*2+1), %o2 - + L.4.9: ! remainder is negative addcc %o3,%o5,%o3 b 9f add %o2, (-7*2-1), %o2 - - - - + + + + 9: Lend_regular_divide: subcc %o4, 1, %o4 diff --git a/sysdeps/sparc/setjmp.S b/sysdeps/sparc/setjmp.S index b80a83046e..772ec723a3 100644 --- a/sysdeps/sparc/setjmp.S +++ b/sysdeps/sparc/setjmp.S @@ -17,6 +17,7 @@ Boston, MA 02111-1307, USA. */ #include +#include #define _ASM 1 #include diff --git a/sysdeps/sparc/sparc64/add_n.s b/sysdeps/sparc/sparc64/add_n.s deleted file mode 100644 index 01d1f49564..0000000000 --- a/sysdeps/sparc/sparc64/add_n.s +++ /dev/null @@ -1,58 +0,0 @@ -! SPARC v9 __mpn_add_n -- Add two limb vectors of the same length > 0 and store -! sum in a third limb vector. - -! Copyright (C) 1995, 1996 Free Software Foundation, Inc. - -! This file is part of the GNU MP Library. - -! The GNU MP Library is free software; you can redistribute it and/or modify -! it under the terms of the GNU Library General Public License as published by -! the Free Software Foundation; either version 2 of the License, or (at your -! option) any later version. - -! The GNU MP Library is distributed in the hope that it will be useful, but -! WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -! or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public -! License for more details. - -! You should have received a copy of the GNU Library General Public License -! along with the GNU MP Library; see the file COPYING.LIB. If not, write to -! the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -! MA 02111-1307, USA. - - -! INPUT PARAMETERS -! res_ptr %o0 -! s1_ptr %o1 -! s2_ptr %o2 -! size %o3 - -.section ".text" - .align 4 - .global __mpn_add_n - .type __mpn_add_n,#function - .proc 04 -__mpn_add_n: - sub %g0,%o3,%g3 - sllx %o3,3,%g1 - add %o1,%g1,%o1 ! make s1_ptr point at end - add %o2,%g1,%o2 ! make s2_ptr point at end - add %o0,%g1,%o0 ! make res_ptr point at end - mov 0,%o4 ! clear carry variable - sllx %g3,3,%o5 ! compute initial address index - -.Loop: ldx [%o2+%o5],%g1 ! load s2 limb - add %g3,1,%g3 ! increment loop count - ldx [%o1+%o5],%g2 ! load s1 limb - addcc %g1,%o4,%g1 ! add s2 limb and carry variable - movcc %xcc,0,%o4 ! if carry-out, o4 was 1; clear it - addcc %g1,%g2,%g1 ! add s1 limb to sum - stx %g1,[%o0+%o5] ! store result - add %o5,8,%o5 ! increment address index - brnz,pt %g3,.Loop - movcs %xcc,1,%o4 ! if s1 add gave carry, record it - - retl - mov %o4,%o0 -.LLfe1: - .size __mpn_add_n,.LLfe1-__mpn_add_n diff --git a/sysdeps/sparc/sparc64/lshift.s b/sysdeps/sparc/sparc64/lshift.s deleted file mode 100644 index ad1f667fa3..0000000000 --- a/sysdeps/sparc/sparc64/lshift.s +++ /dev/null @@ -1,96 +0,0 @@ -! SPARC v9 __mpn_lshift -- - -! Copyright (C) 1996 Free Software Foundation, Inc. - -! This file is part of the GNU MP Library. - -! The GNU MP Library is free software; you can redistribute it and/or modify -! it under the terms of the GNU Library General Public License as published by -! the Free Software Foundation; either version 2 of the License, or (at your -! option) any later version. - -! The GNU MP Library is distributed in the hope that it will be useful, but -! WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -! or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public -! License for more details. - -! You should have received a copy of the GNU Library General Public License -! along with the GNU MP Library; see the file COPYING.LIB. If not, write to -! the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -! MA 02111-1307, USA. - - -! INPUT PARAMETERS -! res_ptr %o0 -! src_ptr %o1 -! size %o2 -! cnt %o3 - -.section ".text" - .align 4 - .global __mpn_lshift - .type __mpn_lshift,#function - .proc 04 -__mpn_lshift: - sllx %o2,3,%g1 - add %o1,%g1,%o1 ! make %o1 point at end of src - ldx [%o1-8],%g2 ! load first limb - sub %g0,%o3,%o5 ! negate shift count - add %o0,%g1,%o0 ! make %o0 point at end of res - add %o2,-1,%o2 - and %o2,4-1,%g4 ! number of limbs in first loop - srlx %g2,%o5,%g1 ! compute function result - brz,pn %g4,.L0 ! if multiple of 4 limbs, skip first loop - stx %g1,[%sp+80] - - sub %o2,%g4,%o2 ! adjust count for main loop - -.Loop0: ldx [%o1-16],%g3 - add %o0,-8,%o0 - add %o1,-8,%o1 - add %g4,-1,%g4 - sllx %g2,%o3,%o4 - srlx %g3,%o5,%g1 - mov %g3,%g2 - or %o4,%g1,%o4 - brnz,pt %g4,.Loop0 - stx %o4,[%o0+0] - -.L0: brz,pn %o2,.Lend - nop - -.Loop: ldx [%o1-16],%g3 - add %o0,-32,%o0 - add %o2,-4,%o2 - sllx %g2,%o3,%o4 - srlx %g3,%o5,%g1 - - ldx [%o1-24],%g2 - sllx %g3,%o3,%g4 - or %o4,%g1,%o4 - stx %o4,[%o0+24] - srlx %g2,%o5,%g1 - - ldx [%o1-32],%g3 - sllx %g2,%o3,%o4 - or %g4,%g1,%g4 - stx %g4,[%o0+16] - srlx %g3,%o5,%g1 - - ldx [%o1-40],%g2 - sllx %g3,%o3,%g4 - or %o4,%g1,%o4 - stx %o4,[%o0+8] - srlx %g2,%o5,%g1 - - add %o1,-32,%o1 - or %g4,%g1,%g4 - brnz,pt %o2,.Loop - stx %g4,[%o0+0] - -.Lend: sllx %g2,%o3,%g2 - stx %g2,[%o0-8] - retl - ldx [%sp+80],%o0 -.LLfe1: - .size __mpn_lshift,.LLfe1-__mpn_lshift diff --git a/sysdeps/sparc/sparc64/rshift.s b/sysdeps/sparc/sparc64/rshift.s deleted file mode 100644 index ff6a380160..0000000000 --- a/sysdeps/sparc/sparc64/rshift.s +++ /dev/null @@ -1,93 +0,0 @@ -! SPARC v9 __mpn_rshift -- - -! Copyright (C) 1996 Free Software Foundation, Inc. - -! This file is part of the GNU MP Library. - -! The GNU MP Library is free software; you can redistribute it and/or modify -! it under the terms of the GNU Library General Public License as published by -! the Free Software Foundation; either version 2 of the License, or (at your -! option) any later version. - -! The GNU MP Library is distributed in the hope that it will be useful, but -! WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -! or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public -! License for more details. - -! You should have received a copy of the GNU Library General Public License -! along with the GNU MP Library; see the file COPYING.LIB. If not, write to -! the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -! MA 02111-1307, USA. - - -! INPUT PARAMETERS -! res_ptr %o0 -! src_ptr %o1 -! size %o2 -! cnt %o3 - -.section ".text" - .align 4 - .global __mpn_rshift - .type __mpn_rshift,#function - .proc 04 -__mpn_rshift: - ldx [%o1],%g2 ! load first limb - sub %g0,%o3,%o5 ! negate shift count - add %o2,-1,%o2 - and %o2,4-1,%g4 ! number of limbs in first loop - sllx %g2,%o5,%g1 ! compute function result - brz,pn %g4,.L0 ! if multiple of 4 limbs, skip first loop - stx %g1,[%sp+80] - - sub %o2,%g4,%o2 ! adjust count for main loop - -.Loop0: ldx [%o1+8],%g3 - add %o0,8,%o0 - add %o1,8,%o1 - add %g4,-1,%g4 - srlx %g2,%o3,%o4 - sllx %g3,%o5,%g1 - mov %g3,%g2 - or %o4,%g1,%o4 - brnz,pt %g4,.Loop0 - stx %o4,[%o0-8] - -.L0: brz,pn %o2,.Lend - nop - -.Loop: ldx [%o1+8],%g3 - add %o0,32,%o0 - add %o2,-4,%o2 - srlx %g2,%o3,%o4 - sllx %g3,%o5,%g1 - - ldx [%o1+16],%g2 - srlx %g3,%o3,%g4 - or %o4,%g1,%o4 - stx %o4,[%o0-32] - sllx %g2,%o5,%g1 - - ldx [%o1+24],%g3 - srlx %g2,%o3,%o4 - or %g4,%g1,%g4 - stx %g4,[%o0-24] - sllx %g3,%o5,%g1 - - ldx [%o1+32],%g2 - srlx %g3,%o3,%g4 - or %o4,%g1,%o4 - stx %o4,[%o0-16] - sllx %g2,%o5,%g1 - - add %o1,32,%o1 - or %g4,%g1,%g4 - brnz %o2,.Loop - stx %g4,[%o0-8] - -.Lend: srlx %g2,%o3,%g2 - stx %g2,[%o0-0] - retl - ldx [%sp+80],%o0 -.LLfe1: - .size __mpn_rshift,.LLfe1-__mpn_rshift diff --git a/sysdeps/sparc/sparc64/sub_n.s b/sysdeps/sparc/sparc64/sub_n.s deleted file mode 100644 index d4842b8cdd..0000000000 --- a/sysdeps/sparc/sparc64/sub_n.s +++ /dev/null @@ -1,58 +0,0 @@ -! SPARC v9 __mpn_sub_n -- Subtract two limb vectors of the same length > 0 and -! store difference in a third limb vector. - -! Copyright (C) 1995, 1996 Free Software Foundation, Inc. - -! This file is part of the GNU MP Library. - -! The GNU MP Library is free software; you can redistribute it and/or modify -! it under the terms of the GNU Library General Public License as published by -! the Free Software Foundation; either version 2 of the License, or (at your -! option) any later version. - -! The GNU MP Library is distributed in the hope that it will be useful, but -! WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -! or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public -! License for more details. - -! You should have received a copy of the GNU Library General Public License -! along with the GNU MP Library; see the file COPYING.LIB. If not, write to -! the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -! MA 02111-1307, USA. - - -! INPUT PARAMETERS -! res_ptr %o0 -! s1_ptr %o1 -! s2_ptr %o2 -! size %o3 - -.section ".text" - .align 4 - .global __mpn_sub_n - .type __mpn_sub_n,#function - .proc 04 -__mpn_sub_n: - sub %g0,%o3,%g3 - sllx %o3,3,%g1 - add %o1,%g1,%o1 ! make s1_ptr point at end - add %o2,%g1,%o2 ! make s2_ptr point at end - add %o0,%g1,%o0 ! make res_ptr point at end - mov 0,%o4 ! clear carry variable - sllx %g3,3,%o5 ! compute initial address index - -.Loop: ldx [%o2+%o5],%g1 ! load s2 limb - add %g3,1,%g3 ! increment loop count - ldx [%o1+%o5],%g2 ! load s1 limb - addcc %g1,%o4,%g1 ! add s2 limb and carry variable - movcc %xcc,0,%o4 ! if carry-out, o4 was 1; clear it - subcc %g1,%g2,%g1 ! subtract s1 limb from sum - stx %g1,[%o0+%o5] ! store result - add %o5,8,%o5 ! increment address index - brnz,pt %g3,.Loop - movcs %xcc,1,%o4 ! if s1 subtract gave carry, record it - - retl - mov %o4,%o0 -.LLfe1: - .size __mpn_sub_n,.LLfe1-__mpn_sub_n diff --git a/sysdeps/sparc/sys/trap.h b/sysdeps/sparc/sys/trap.h new file mode 100644 index 0000000000..50be40668f --- /dev/null +++ b/sysdeps/sparc/sys/trap.h @@ -0,0 +1,7 @@ +/* Include trap definitions. */ +#ifndef _SYS_TRAP_H +#define _SYS_TRAP_H 1 + +#include + +#endif /* sys/trap.h */ diff --git a/sysdeps/sparc/udiv.S b/sysdeps/sparc/udiv.S index 252afd0193..49df8ab2a7 100644 --- a/sysdeps/sparc/udiv.S +++ b/sysdeps/sparc/udiv.S @@ -38,15 +38,7 @@ #include "DEFS.h" -#ifdef __linux__ -#include -#else -#ifdef __svr4__ #include -#else -#include -#endif -#endif FUNC(.udiv) @@ -176,14 +168,14 @@ Ldivloop: subcc %o3,%o5,%o3 b 9f add %o2, (7*2+1), %o2 - + L.4.23: ! remainder is negative addcc %o3,%o5,%o3 b 9f add %o2, (7*2-1), %o2 - - + + L.3.19: ! remainder is negative addcc %o3,%o5,%o3 @@ -194,15 +186,15 @@ L.3.19: subcc %o3,%o5,%o3 b 9f add %o2, (5*2+1), %o2 - + L.4.21: ! remainder is negative addcc %o3,%o5,%o3 b 9f add %o2, (5*2-1), %o2 - - - + + + L.2.17: ! remainder is negative addcc %o3,%o5,%o3 @@ -218,14 +210,14 @@ L.2.17: subcc %o3,%o5,%o3 b 9f add %o2, (3*2+1), %o2 - + L.4.19: ! remainder is negative addcc %o3,%o5,%o3 b 9f add %o2, (3*2-1), %o2 - - + + L.3.17: ! remainder is negative addcc %o3,%o5,%o3 @@ -236,16 +228,16 @@ L.3.17: subcc %o3,%o5,%o3 b 9f add %o2, (1*2+1), %o2 - + L.4.17: ! remainder is negative addcc %o3,%o5,%o3 b 9f add %o2, (1*2-1), %o2 - - - - + + + + L.1.16: ! remainder is negative addcc %o3,%o5,%o3 @@ -266,14 +258,14 @@ L.1.16: subcc %o3,%o5,%o3 b 9f add %o2, (-1*2+1), %o2 - + L.4.15: ! remainder is negative addcc %o3,%o5,%o3 b 9f add %o2, (-1*2-1), %o2 - - + + L.3.15: ! remainder is negative addcc %o3,%o5,%o3 @@ -284,15 +276,15 @@ L.3.15: subcc %o3,%o5,%o3 b 9f add %o2, (-3*2+1), %o2 - + L.4.13: ! remainder is negative addcc %o3,%o5,%o3 b 9f add %o2, (-3*2-1), %o2 - - - + + + L.2.15: ! remainder is negative addcc %o3,%o5,%o3 @@ -308,14 +300,14 @@ L.2.15: subcc %o3,%o5,%o3 b 9f add %o2, (-5*2+1), %o2 - + L.4.11: ! remainder is negative addcc %o3,%o5,%o3 b 9f add %o2, (-5*2-1), %o2 - - + + L.3.13: ! remainder is negative addcc %o3,%o5,%o3 @@ -326,16 +318,16 @@ L.3.13: subcc %o3,%o5,%o3 b 9f add %o2, (-7*2+1), %o2 - + L.4.9: ! remainder is negative addcc %o3,%o5,%o3 b 9f add %o2, (-7*2-1), %o2 - - - - + + + + 9: Lend_regular_divide: subcc %o4, 1, %o4 diff --git a/sysdeps/sparc/urem.S b/sysdeps/sparc/urem.S index 99a5acf40a..7f6a0812bf 100644 --- a/sysdeps/sparc/urem.S +++ b/sysdeps/sparc/urem.S @@ -38,15 +38,7 @@ #include "DEFS.h" -#ifdef __linux__ -#include -#else -#ifdef __svr4__ #include -#else -#include -#endif -#endif FUNC(.urem) @@ -176,14 +168,14 @@ Ldivloop: subcc %o3,%o5,%o3 b 9f add %o2, (7*2+1), %o2 - + L.4.23: ! remainder is negative addcc %o3,%o5,%o3 b 9f add %o2, (7*2-1), %o2 - - + + L.3.19: ! remainder is negative addcc %o3,%o5,%o3 @@ -194,15 +186,15 @@ L.3.19: subcc %o3,%o5,%o3 b 9f add %o2, (5*2+1), %o2 - + L.4.21: ! remainder is negative addcc %o3,%o5,%o3 b 9f add %o2, (5*2-1), %o2 - - - + + + L.2.17: ! remainder is negative addcc %o3,%o5,%o3 @@ -218,14 +210,14 @@ L.2.17: subcc %o3,%o5,%o3 b 9f add %o2, (3*2+1), %o2 - + L.4.19: ! remainder is negative addcc %o3,%o5,%o3 b 9f add %o2, (3*2-1), %o2 - - + + L.3.17: ! remainder is negative addcc %o3,%o5,%o3 @@ -236,16 +228,16 @@ L.3.17: subcc %o3,%o5,%o3 b 9f add %o2, (1*2+1), %o2 - + L.4.17: ! remainder is negative addcc %o3,%o5,%o3 b 9f add %o2, (1*2-1), %o2 - - - - + + + + L.1.16: ! remainder is negative addcc %o3,%o5,%o3 @@ -266,14 +258,14 @@ L.1.16: subcc %o3,%o5,%o3 b 9f add %o2, (-1*2+1), %o2 - + L.4.15: ! remainder is negative addcc %o3,%o5,%o3 b 9f add %o2, (-1*2-1), %o2 - - + + L.3.15: ! remainder is negative addcc %o3,%o5,%o3 @@ -284,15 +276,15 @@ L.3.15: subcc %o3,%o5,%o3 b 9f add %o2, (-3*2+1), %o2 - + L.4.13: ! remainder is negative addcc %o3,%o5,%o3 b 9f add %o2, (-3*2-1), %o2 - - - + + + L.2.15: ! remainder is negative addcc %o3,%o5,%o3 @@ -308,14 +300,14 @@ L.2.15: subcc %o3,%o5,%o3 b 9f add %o2, (-5*2+1), %o2 - + L.4.11: ! remainder is negative addcc %o3,%o5,%o3 b 9f add %o2, (-5*2-1), %o2 - - + + L.3.13: ! remainder is negative addcc %o3,%o5,%o3 @@ -326,16 +318,16 @@ L.3.13: subcc %o3,%o5,%o3 b 9f add %o2, (-7*2+1), %o2 - + L.4.9: ! remainder is negative addcc %o3,%o5,%o3 b 9f add %o2, (-7*2-1), %o2 - - - - + + + + 9: Lend_regular_divide: subcc %o4, 1, %o4 diff --git a/sysdeps/sparc64/Implies b/sysdeps/sparc64/Implies new file mode 100644 index 0000000000..1d793f9fb1 --- /dev/null +++ b/sysdeps/sparc64/Implies @@ -0,0 +1,3 @@ +wordsize-64 +# SPARC uses IEEE 754 floating point. +ieee754 diff --git a/sysdeps/sparc64/Makefile b/sysdeps/sparc64/Makefile new file mode 100644 index 0000000000..48a86c6acb --- /dev/null +++ b/sysdeps/sparc64/Makefile @@ -0,0 +1,11 @@ +# The Sparc`long double' is a distinct type we support. +#long-double-fcts = yes + +# But the support for ieee quads is so bad we just skip the whole thing. +# XXX This is only a temporary hack. +omit-long-double-fcts = yes + +# But we do need these few functions to even link stdio proggies +ifeq ($(subdir),math) +sysdep_routines += s_isinfl s_isnanl +endif diff --git a/sysdeps/sparc64/add_n.S b/sysdeps/sparc64/add_n.S new file mode 100644 index 0000000000..68bb008a7d --- /dev/null +++ b/sysdeps/sparc64/add_n.S @@ -0,0 +1,58 @@ +/* SPARC v9 __mpn_add_n -- Add two limb vectors of the same length > 0 and + store sum in a third limb vector. + + Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. + + This file is part of the GNU MP Library. + + The GNU MP Library is free software; you can redistribute it and/or modify + it under the terms of the GNU Library General Public License as published by + the Free Software Foundation; either version 2 of the License, or (at your + option) any later version. + + The GNU MP Library is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public + License for more details. + + You should have received a copy of the GNU Library General Public License + along with the GNU MP Library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA. */ + + +#include + + +/* INPUT PARAMETERS + res_ptr %o0 + s1_ptr %o1 + s2_ptr %o2 + size %o3 */ + + +ENTRY(__mpn_add_n) + + sub %g0,%o3,%g3 + sllx %o3,3,%g1 + add %o1,%g1,%o1 ! make s1_ptr point at end + add %o2,%g1,%o2 ! make s2_ptr point at end + add %o0,%g1,%o0 ! make res_ptr point at end + mov 0,%o4 ! clear carry variable + sllx %g3,3,%o5 ! compute initial address index + +1: ldx [%o2+%o5],%g1 ! load s2 limb + add %g3,1,%g3 ! increment loop count + ldx [%o1+%o5],%g2 ! load s1 limb + addcc %g1,%o4,%g1 ! add s2 limb and carry variable + movcc %xcc,0,%o4 ! if carry-out, o4 was 1; clear it + addcc %g1,%g2,%g1 ! add s1 limb to sum + stx %g1,[%o0+%o5] ! store result + add %o5,8,%o5 ! increment address index + brnz,pt %g3,1b + movcs %xcc,1,%o4 ! if s1 add gave carry, record it + + retl + mov %o4,%o0 + +END(__mpn_add_n) diff --git a/sysdeps/sparc/sparc64/addmul_1.s b/sysdeps/sparc64/addmul_1.S similarity index 50% rename from sysdeps/sparc/sparc64/addmul_1.s rename to sysdeps/sparc64/addmul_1.S index 8d86390808..260481230f 100644 --- a/sysdeps/sparc/sparc64/addmul_1.s +++ b/sysdeps/sparc64/addmul_1.S @@ -1,41 +1,40 @@ -! SPARC v9 __mpn_addmul_1 -- Multiply a limb vector with a single limb and -! add the product to a second limb vector. +/* SPARC v9 __mpn_addmul_1 -- Multiply a limb vector with a single limb and + add the product to a second limb vector. -! Copyright (C) 1996 Free Software Foundation, Inc. + Copyright (C) 1996 Free Software Foundation, Inc. -! This file is part of the GNU MP Library. + This file is part of the GNU MP Library. -! The GNU MP Library is free software; you can redistribute it and/or modify -! it under the terms of the GNU Library General Public License as published by -! the Free Software Foundation; either version 2 of the License, or (at your -! option) any later version. + The GNU MP Library is free software; you can redistribute it and/or modify + it under the terms of the GNU Library General Public License as published by + the Free Software Foundation; either version 2 of the License, or (at your + option) any later version. -! The GNU MP Library is distributed in the hope that it will be useful, but -! WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -! or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public -! License for more details. + The GNU MP Library is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public + License for more details. -! You should have received a copy of the GNU Library General Public License -! along with the GNU MP Library; see the file COPYING.LIB. If not, write to -! the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -! MA 02111-1307, USA. + You should have received a copy of the GNU Library General Public License + along with the GNU MP Library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA. */ + +#include -! INPUT PARAMETERS -! res_ptr o0 -! s1_ptr o1 -! size o2 -! s2_limb o3 +/* INPUT PARAMETERS + res_ptr o0 + s1_ptr o1 + size o2 + s2_limb o3 */ -.section ".text" - .align 4 - .global __mpn_addmul_1 - .type __mpn_addmul_1,#function - .proc 016 -__mpn_addmul_1: + +ENTRY(__mpn_addmul_1) !#PROLOGUE# 0 - save %sp,-160,%sp + save %sp,-128,%sp !#PROLOGUE# 1 + sub %g0,%i2,%o7 sllx %o7,3,%g5 sub %i1,%g5,%o3 @@ -51,7 +50,7 @@ __mpn_addmul_1: ! mid-1 ! ! mid-2 ! ! lo ! -.Loop: +1: sllx %o7,3,%g1 ldx [%o3+%g1],%g5 srl %g5,0,%i0 ! zero hi bits @@ -79,11 +78,11 @@ __mpn_addmul_1: addcc %l1,%i0,%i0 movcs %xcc,1,%g5 stx %i0,[%o4+%g1] - brnz %o7,.Loop - add %i1,%g5,%o0 ! compute new cy_limb + brnz %o7,1b + add %i1,%g5,%o0 ! compute new cy_limb mov %o0,%i0 - ret - restore -.LLfe1: - .size __mpn_addmul_1,.LLfe1-__mpn_addmul_1 + jmpl %i7+8, %g0 + restore + +END(__mpn_addmul_1) diff --git a/sysdeps/sparc64/bits/endian.h b/sysdeps/sparc64/bits/endian.h new file mode 100644 index 0000000000..a2ab07249a --- /dev/null +++ b/sysdeps/sparc64/bits/endian.h @@ -0,0 +1,8 @@ +/* Sparc is big-endian, but v9 supports endian conversion on loads/stores + and GCC supports such a mode. Be prepared. */ + +#ifdef __LITTLE_ENDIAN__ +#define __BYTE_ORDER __LITTLE_ENDIAN +#else +#define __BYTE_ORDER __BIG_ENDIAN +#endif diff --git a/sysdeps/sparc64/bsd-_setjmp.S b/sysdeps/sparc64/bsd-_setjmp.S new file mode 100644 index 0000000000..1388c4c238 --- /dev/null +++ b/sysdeps/sparc64/bsd-_setjmp.S @@ -0,0 +1,43 @@ +/* BSD `_setjmp' entry point to `sigsetjmp (..., 0)'. Sparc64 version. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +ENTRY(_setjmp) + +#ifdef PIC +1: rd %pc,%g1 + sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)),%g2 + or %g2,%lo(_GLOBAL_OFFSET_TABLE_-(1b-.)),%g2 + add %g1,%g2,%g1 + sethi %hi(C_SYMBOL_NAME(__sigsetjmp)),%g2 + or %g2,%lo(C_SYMBOL_NAME(__sigsetjmp)),%g2 + ld [%g1+%g2], %g1 +#else + sethi %hi(C_SYMBOL_NAME(__sigsetjmp)), %g1 + or %lo(C_SYMBOL_NAME(__sigsetjmp)), %g1, %g1 + add %g1, %g4, %g1 +#endif + + jmp %g1 + mov %g0, %o1 /* Pass second argument of zero. */ + +END(_setjmp) + +strong_alias(_setjmp, __setjmp) diff --git a/sysdeps/sparc64/bsd-setjmp.S b/sysdeps/sparc64/bsd-setjmp.S new file mode 100644 index 0000000000..c42123fc42 --- /dev/null +++ b/sysdeps/sparc64/bsd-setjmp.S @@ -0,0 +1,41 @@ +/* BSD `setjmp' entry point to `sigsetjmp (..., 1)'. Sparc64 version. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +ENTRY(setjmp) + +#ifdef PIC +1: rd %pc,%g1 + sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)),%g2 + or %g2,%lo(_GLOBAL_OFFSET_TABLE_-(1b-.)),%g2 + add %g1,%g2,%g1 + sethi %hi(C_SYMBOL_NAME(__sigsetjmp)),%g2 + or %g2,%lo(C_SYMBOL_NAME(__sigsetjmp)),%g2 + ld [%g1+%g2], %g1 +#else + sethi %hi(C_SYMBOL_NAME(__sigsetjmp)), %g1 + or %lo(C_SYMBOL_NAME(__sigsetjmp)), %g1, %g1 + add %g1, %g4, %g1 +#endif + + jmp %g1 + mov 1, %o1 /* Pass second argument of one. */ + +END(setjmp) diff --git a/sysdeps/sparc64/configure b/sysdeps/sparc64/configure new file mode 100755 index 0000000000..099f5b0470 --- /dev/null +++ b/sysdeps/sparc64/configure @@ -0,0 +1,3 @@ + # Local configure fragment for sysdeps/sparc64 + +nopic_initfini=yes diff --git a/sysdeps/sparc64/configure.in b/sysdeps/sparc64/configure.in new file mode 100644 index 0000000000..662f8a22ba --- /dev/null +++ b/sysdeps/sparc64/configure.in @@ -0,0 +1,7 @@ +sinclude(./aclocal.m4)dnl Autoconf lossage +GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory. +# Local configure fragment for sysdeps/sparc64 + +dnl We need to have separate crt? files for static linking which does +dnl not use PIC. +nopic_initfini=yes \ No newline at end of file diff --git a/sysdeps/sparc64/dl-machine.h b/sysdeps/sparc64/dl-machine.h new file mode 100644 index 0000000000..21c3d6b9bd --- /dev/null +++ b/sysdeps/sparc64/dl-machine.h @@ -0,0 +1,304 @@ +/* Machine-dependent ELF dynamic relocation inline functions. Sparc64 version. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If + not, write to the Free Software Foundation, Inc., + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#define ELF_MACHINE_NAME "sparc64" + +#include +#include +#include +#include +#include + + +/* Return nonzero iff E_MACHINE is compatible with the running host. */ +static inline int +elf_machine_matches_host (Elf64_Half e_machine) +{ + return e_machine == EM_SPARC64; +} + + +/* Return the link-time address of _DYNAMIC. Conveniently, this is the + first element of the GOT. This must be inlined in a function which + uses global data. */ +static inline Elf64_Addr +elf_machine_dynamic (void) +{ + register Elf64_Addr *got asm ("%l7"); + return *got; +} + + +/* Return the run-time load address of the shared object. */ +static inline Elf64_Addr +elf_machine_load_address (void) +{ + Elf64_Addr here; + + __asm("rd %pc,%0\n\t" + "ba 1f\n\t" + " add %0,12,%0\n\t" + ".weak __load_address_undefined\n\t" + "call __load_address_undefined\n" + "1:" + : "=r"(here)); + + return here + (*(int *)here << 2); +} + +#ifdef RESOLVE +/* Perform the relocation specified by RELOC and SYM (which is fully resolved). + MAP is the object containing the reloc. */ + +static inline void +elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc, + const Elf64_Sym *sym, const struct r_found_version *version) +{ + Elf64_Addr *const reloc_addr = (void *) (map->l_addr + reloc->r_offset); + Elf64_Addr loadbase; + +#ifndef RTLD_BOOTSTRAP + /* This is defined in rtld.c, but nowhere in the static libc.a; make the + reference weak so static programs can still link. This declaration + cannot be done when compiling rtld.c (i.e. #ifdef RTLD_BOOTSTRAP) + because rtld.c contains the common defn for _dl_rtld_map, which is + incompatible with a weak decl in the same file. */ + weak_extern (_dl_rtld_map); +#endif + + if (ELF64_R_TYPE (reloc->r_info) == R_SPARC_RELATIVE) + { +#ifndef RTLD_BOOTSTRAP + if (map != &_dl_rtld_map) /* Already done in rtld itself. */ +#endif + *reloc_addr += map->l_addr + reloc->r_addend; + } + else + { + const Elf64_Sym *const refsym = sym; + Elf64_Addr value; + if (sym->st_shndx != SHN_UNDEF && + ELF64_ST_BIND (sym->st_info) == STB_LOCAL) + value = map->l_addr; + else + { + value = RESOLVE (&sym, version, ELF64_R_TYPE (reloc->r_info)); + if (sym) + value += sym->st_value; + } + value += reloc->r_addend; /* Assume copy relocs have zero addend. */ + + switch (ELF64_R_TYPE (reloc->r_info)) + { + case R_SPARC_COPY: + if (sym->st_size > refsym->st_size + || (_dl_verbose && sym->st_size < refsym->st_size)) + { + const char *strtab; + + strtab = ((void *) map->l_addr + + map->l_info[DT_STRTAB]->d_un.d_ptr); + _dl_sysdep_error ("Symbol `", strtab + refsym->st_name, + "' has different size in shared object, " + "consider re-linking\n", NULL); + } + memcpy (reloc_addr, (void *) value, MIN (sym->st_size, + refsym->st_size)); + break; + case R_SPARC_GLOB_DAT: + /* case R_SPARC_64: */ + case R_SPARC_JMP_SLOT: + *reloc_addr = value; + break; + case R_SPARC_8: + *(char *) reloc_addr = value; + break; + case R_SPARC_16: + *(short *) reloc_addr = value; + break; + case R_SPARC_DISP8: + *(char *) reloc_addr = (value - (Elf64_Addr) reloc_addr); + break; + case R_SPARC_DISP16: + *(short *) reloc_addr = (value - (Elf64_Addr) reloc_addr); + break; + case R_SPARC_DISP32: + *(unsigned int *)reloc_addr = (value - (Elf64_Addr) reloc_addr); + break; + case R_SPARC_LO10: + *(unsigned *)reloc_addr = (*(unsigned *)reloc_addr & ~0x3ff) + | (value & 0x3ff); + break; + case R_SPARC_WDISP30: + *(unsigned *)reloc_addr = ((*(unsigned *)reloc_addr & 0xc0000000) + | ((value - (Elf64_Addr) reloc_addr) >> 2)); + break; + case R_SPARC_HI22: + *(unsigned *)reloc_addr = (*(unsigned *)reloc_addr & 0xffc00000) + | (value >> 10); + break; + case R_SPARC_NONE: /* Alright, Wilbur. */ + break; + default: + assert (! "unexpected dynamic reloc type"); + break; + } + } +} + +static inline void +elf_machine_lazy_rel (struct link_map *map, const Elf64_Rela *reloc) +{ + switch (ELF64_R_TYPE (reloc->r_info)) + { + case R_SPARC_NONE: + break; + case R_SPARC_JMP_SLOT: + break; + default: + assert (! "unexpected PLT reloc type"); + break; + } +} + +#endif /* RESOLVE */ + +/* Nonzero iff TYPE should not be allowed to resolve to one of + the main executable's symbols, as for a COPY reloc. */ +#define elf_machine_lookup_noexec_p(type) ((type) == R_SPARC_COPY) + +/* Nonzero iff TYPE describes relocation of a PLT entry, so + PLT entries should not be allowed to define the value. */ +#define elf_machine_lookup_noplt_p(type) ((type) == R_SPARC_JMP_SLOT) + +/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */ +#define ELF_MACHINE_RELOC_NOPLT R_SPARC_JMP_SLOT + +/* The SPARC never uses Elf64_Rel relocations. */ +#define ELF_MACHINE_NO_REL 1 + + +/* Set up the loaded object described by L so its unrelocated PLT + entries will jump to the on-demand fixup code in dl-runtime.c. */ + +static inline int +elf_machine_runtime_setup (struct link_map *l, int lazy) +{ + Elf64_Addr *got; + extern void _dl_runtime_resolve (Elf64_Word); + + if (l->l_info[DT_JMPREL] && lazy) + { + got = (Elf64_Addr *) (l->l_addr + l->l_info[DT_PLTGOT]->d_un.d_ptr); + got[1] = (Elf64_Addr) l; /* Identify this shared object. */ + /* This function will get called to fix up the GOT entry indicated by + the offset on the stack, and then jump to the resolved address. */ + got[2] = (Elf64_Addr) &_dl_runtime_resolve; + } + + return lazy; +} + +/* This code is used in dl-runtime.c to call the `fixup' function + and then redirect to the address it returns. */ +#define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\ + .globl _dl_runtime_resolve + .type _dl_runtime_resolve, @function +_dl_runtime_resolve: + save %sp, -160, %sp + mov %g1, %o1 + call fixup + mov %g2, %o0 + jmp %o0 + restore + .size _dl_runtime_resolve, .-_dl_runtime_resolve +"); + +/* The PLT uses Elf64_Rela relocs. */ +#define elf_machine_relplt elf_machine_rela + + +/* Mask identifying addresses reserved for the user program, + where the dynamic linker should not map anything. */ +#define ELF_MACHINE_USER_ADDRESS_MASK ??? + +/* Initial entry point code for the dynamic linker. + The C function `_dl_start' is the real entry point; + its return value is the user program's entry point. */ + +#define __S1(x) #x +#define __S(x) __S1(x) + +#define RTLD_START __asm__ ( "\ + .global _start + .type _start, @function +_start: + /* Make room for functions to drop their arguments on the stack. */ + sub %sp, 6*8, %sp + /* Pass pointer to argument block to _dl_start. */ + call _dl_start + add %sp," __S(STACK_BIAS) "+22*8,%o0 + /* FALLTHRU */ + + .global _dl_start_user + .type _dl_start_user, @function +_dl_start_user: + /* Load the GOT register. */ +1: rd %pc,%g1 + sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)),%l7 + or %l2,%lo(_GLOBAL_OFFSET_TABLE_-(1b-.)),%l7 + add %l7,%g1,%l7 + /* Save the user entry point address in %l0. */ + mov %o0,%l0 + /* See if we were run as a command with the executable file name as an + extra leading argument. If so, adjust the stack pointer. */ + sethi %hi(_dl_skip_args), %g2 + or %g2, %lo(_dl_skip_args), %g2 + ld [%l7+%g2], %i0 + brz,pt %i0, 2f + ldx [%sp+" __S(STACK_BIAS) "+22*8], %i1 + sub %i1, %i0, %i1 + sllx %i0, 3, %i2 + add %sp, %i2, %sp + stx %i1, [%sp+" __S(STACK_BIAS) "+22*8] + /* Load _dl_default_scope[2] to pass to _dl_init_next. */ +2: sethi %hi(_dl_default_scope), %g2 + or %g2, %lo(_dl_defalt_scope), %g2 + add %g2, 2*8, %g2 + ldx [%l7+%g2], %l1 + /* Call _dl_init_next to return the address of an initializer to run. */ +3: call _dl_init_next + mov %l1, %o0 + brz,pn %o0, 4f + nop + jmpl %o0, %o7 + nop + ba,a 3b + /* Clear the startup flag. */ +4: sethi %hi(_dl_starting_up), %g2 + or %g2, %lo(_dl_starting_up), %g2 + st %g0, [%l7+%g2] + /* Pass our finalizer function to the user in %g1 + sethi %hi(_dl_fini), %g1 + or %g1, %lo(_dl_fini), %g1 + ldx [%l7+%g1], %g1 + /* Jump to the user's entry point & undo the allocation of the xtra regs. */ + jmp %l0 + add %sp, 6*8, %sp + .size _dl_start_user, .-_dl_start_user"); diff --git a/sysdeps/sparc64/elf/Makefile b/sysdeps/sparc64/elf/Makefile new file mode 100644 index 0000000000..1b38355b38 --- /dev/null +++ b/sysdeps/sparc64/elf/Makefile @@ -0,0 +1,10 @@ +# The assembler on SPARC needs the -fPIC flag even when it's assembler code. +ASFLAGS-.so = -fPIC + +ifeq ($(subdir), csu) +extra-objs += crtbegin.o crtend.o crtbeginS.o crtendS.o +install-lib += crtbegin.o crtend.o crtbeginS.o crtendS.o + +CPPFLAGS-crtbeginS.S = -fPIC -DPIC +CPPFLAGS-crtendS.S = -fPIC -DPIC +endif diff --git a/sysdeps/sparc64/elf/crtbegin.S b/sysdeps/sparc64/elf/crtbegin.S new file mode 100644 index 0000000000..fbd731cad0 --- /dev/null +++ b/sysdeps/sparc64/elf/crtbegin.S @@ -0,0 +1,49 @@ +.section ".ctors",#alloc,#write + + .align 8 +__CTOR_LIST__: + .xword -1 + +.section ".dtors",#alloc,#write + + .align 8 +__DTOR_LIST__: + .xword -1 + +.section ".fini",#alloc,#execinstr + + call __do_global_dtors_aux + nop + +.text + + .align 4 + .type __do_global_dtors_aux,#function +__do_global_dtors_aux: + save %sp,-160,%sp + +#ifdef PIC +1: rd %pc, %g1 + sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7 + or %l7, %lo(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7 + add %l7, %g1, %l7 + sethi %hi(__DTOR_LIST__), %l0 + or %l0, %lo(__DTOR_LIST__), %l0 + ldx [%l7+%l0], %l0 +#else + sethi %hi(__DTOR_LIST__), %l0 + or %l0, %lo(__DTOR_LIST__), %l0 + add %l0, %g4, %l0 +#endif + + ba 3f + ldx [%l0+8], %l1 +2: jmpl %l1, %o7 + ldx [%l0+8], %l1 +3: brnz,pt %l1, 2b + add %l0, 8, %l0 + + ret + restore + + .size __do_global_dtors_aux,.-__do_global_dtors_aux diff --git a/sysdeps/sparc64/elf/crtbeginS.S b/sysdeps/sparc64/elf/crtbeginS.S new file mode 100644 index 0000000000..7db4bc590e --- /dev/null +++ b/sysdeps/sparc64/elf/crtbeginS.S @@ -0,0 +1 @@ +#include "crtbegin.S" diff --git a/sysdeps/sparc64/elf/crtend.S b/sysdeps/sparc64/elf/crtend.S new file mode 100644 index 0000000000..ea69083d69 --- /dev/null +++ b/sysdeps/sparc64/elf/crtend.S @@ -0,0 +1,50 @@ +.section ".ctors",#alloc,#write + + .align 8 +__CTOR_END__: + .xword 0 + +.section ".dtors",#alloc,#write + + .align 8 +__DTOR_END__: + .xword 0 + +.section ".init",#alloc,#execinstr + + call __do_global_ctors_aux + nop + +.text + + .align 4 + .type __do_global_ctors_aux,#function +__do_global_ctors_aux: + save %sp,-160,%sp + +#ifdef PIC +1: rd %pc, %g1 + sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7 + or %l7, %lo(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7 + add %l7, %g1, %l7 + sethi %hi(__CTOR_END__), %l0 + or %l0, %lo(__CTOR_END__), %l0 + ldx [%l7+%l0], %l0 +#else + sethi %hi(__CTOR_END__), %l0 + or %l0, %lo(__CTOR_END__), %l0 + add %l0, %g4, %l0 +#endif + + ba 3f + ldx [%l0+8], %l1 +2: jmpl %l1, %o7 + ldx [%l0+8], %l1 +3: addcc %l1, 1, %g0 + bnz,pt %xcc, 2b + add %l0, 8, %l0 + + ret + restore + + .size __do_global_ctors_aux,.-__do_global_ctors_aux diff --git a/sysdeps/sparc64/elf/crtendS.S b/sysdeps/sparc64/elf/crtendS.S new file mode 100644 index 0000000000..56532f567d --- /dev/null +++ b/sysdeps/sparc64/elf/crtendS.S @@ -0,0 +1 @@ +#include "crtend.S" diff --git a/sysdeps/sparc64/elf/start.S b/sysdeps/sparc64/elf/start.S new file mode 100644 index 0000000000..334f85b129 --- /dev/null +++ b/sysdeps/sparc64/elf/start.S @@ -0,0 +1,93 @@ +/* Startup code for elf64-sparc + Copyright (C) 1997 Free Software Foundation, Inc. + Contributed by Richard Henderson , 1997. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If + not, write to the Free Software Foundation, Inc., 675 Mass Ave, + Cambridge, MA 02139, USA. */ + +#include + + + .section ".text" + .align 4 + .global _start + .type _start,#function +_start: + + /* First order of business is to load %g4 with our base address. */ + sethi %uhi(_start), %g4 + or %g4, %ulo(_start), %g4 + sllx %g4, 32, %g4 + + /* Terminate the stack frame, and reserve space for functions to + drop their arguments. */ + mov %g0, %fp + sub %sp, 6*8, %sp + + /* Save %g1. When starting a binary via the dynamic linker, %g1 + contains the address of the shared library termination function, + which we will register below with atexit() to be called by exit(). + If we are statically linked, this will be NULL. */ + + /* Do essential libc initialization (sp points to argc, argv, and envp) */ + call __libc_init_first + mov %g1, %l0 + + /* Now that we have the proper stack frame, register library termination + function, if there is any: */ + + brz,pn %l0, 1f + nop + call atexit + mov %l0, %o0 +1: + + /* Extract the arguments and environment as encoded on the stack. The + argument info starts after one register window (16 words) past the SP, + plus the bias we added, plus the magic v9 STACK_BIAS. */ + ldx [%sp+STACK_BIAS+22*8], %o0 + add %sp, STACK_BIAS+23*8, %o1 + sllx %o0, 3, %o2 + add %o2, %o1, %o2 + sethi %hi(__environ), %g2 + add %o2, 8, %o2 + add %g2, %g4, %g2 + stx %o2, [%g2+%lo(__environ)] + + mov %o0, %l0 /* tuck them away */ + mov %o1, %l1 + + /* Call _init, the entry point to our own .init section. */ + call _init + mov %o2, %l2 + + /* Register our .fini section with atexit. */ + sethi %hi(_fini), %o0 + add %o0, %g4, %o0 + call atexit + add %o0, %lo(_fini), %o0 + + /* Call the user's main and exit with its return value. */ + mov %l0, %o0 + mov %l1, %o1 + call main + mov %l2, %o2 + call exit + nop + + /* Die very horribly if exit returns. */ + illtrap 0 + + .size _start,.-_start diff --git a/sysdeps/sparc64/fpu_control.h b/sysdeps/sparc64/fpu_control.h new file mode 100644 index 0000000000..fd8abb19f1 --- /dev/null +++ b/sysdeps/sparc64/fpu_control.h @@ -0,0 +1,69 @@ +/* FPU control word bits. SPARC v9 version. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Miguel de Icaza + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _FPU_CONTROL_H +#define _FPU_CONTROL_H 1 + + +#include + +/* precision control */ +#define _FPU_EXTENDED 0x00000000 /* RECOMMENDED */ +#define _FPU_DOUBLE 0x20000000 +#define _FPU_80BIT 0x30000000 +#define _FPU_SINGLE 0x10000000 /* DO NOT USE */ + +/* rounding control / Sparc */ +#define _FPU_RC_DOWN 0xc0000000 +#define _FPU_RC_UP 0x80000000 +#define _FPU_RC_ZERO 0x40000000 +#define _FPU_RC_NEAREST 0x0 /* RECOMMENDED */ + +#define _FPU_RESERVED 0x30300000 /* Reserved bits in cw */ + + +/* Now two recommended cw */ + +/* Linux default: + - extended precision + - rounding to nearest + - no exceptions */ +#define _FPU_DEFAULT 0x0 + +/* IEEE: same as above */ +#define _FPU_IEEE 0x0 + +/* Type of the control word. */ +typedef unsigned long fpu_control_t; + +#define _FPU_GETCW(cw) __asm__ ("stx %%fsr,%0" : "=m" (*&cw)) +#define _FPU_SETCW(cw) __asm__ ("ldx %0,%%fsr" : : "m" (*&cw)) + +/* Default control word set at startup. */ +extern fpu_control_t __fpu_control; + +__BEGIN_DECLS + +/* Called at startup. It can be used to manipulate fpu control register. */ +extern void __setfpucw __P ((fpu_control_t)); + +__END_DECLS + +#endif /* fpu_control.h */ diff --git a/sysdeps/sparc/sparc64/gmp-mparam.h b/sysdeps/sparc64/gmp-mparam.h similarity index 100% rename from sysdeps/sparc/sparc64/gmp-mparam.h rename to sysdeps/sparc64/gmp-mparam.h diff --git a/sysdeps/sparc64/lshift.S b/sysdeps/sparc64/lshift.S new file mode 100644 index 0000000000..1678991529 --- /dev/null +++ b/sysdeps/sparc64/lshift.S @@ -0,0 +1,96 @@ +/* SPARC v9 __mpn_lshift -- + + Copyright (C) 1996 Free Software Foundation, Inc. + + This file is part of the GNU MP Library. + + The GNU MP Library is free software; you can redistribute it and/or modify + it under the terms of the GNU Library General Public License as published by + the Free Software Foundation; either version 2 of the License, or (at your + option) any later version. + + The GNU MP Library is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public + License for more details. + + You should have received a copy of the GNU Library General Public License + along with the GNU MP Library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA. */ + +#include + +/* INPUT PARAMETERS + res_ptr %i0 + src_ptr %i1 + size %i2 + cnt %i3 */ + +ENTRY(__mpn_lshift) + save %sp, -128, %sp + + sllx %i2,3,%g1 + add %i1,%g1,%i1 ! make %i1 point at end of src + ldx [%i1-8],%g2 ! load first limb + sub %g0,%i3,%i5 ! negate shift count + add %i0,%g1,%i0 ! make %i0 point at end of res + add %i2,-1,%i2 + and %i2,4-1,%l4 ! number of limbs in first loop + srlx %g2,%i5,%g1 ! compute function result + brz,pn %l4,.L0 ! if multiple of 4 limbs, skip first loop + mov %g1,%l1 + + sub %i2,%l4,%i2 ! adjust count for main loop + +.Loop0: ldx [%i1-16],%g3 + add %i0,-8,%i0 + add %i1,-8,%i1 + add %l4,-1,%l4 + sllx %g2,%i3,%i4 + srlx %g3,%i5,%g1 + mov %g3,%g2 + or %i4,%g1,%i4 + brnz,pt %l4,.Loop0 + stx %i4,[%i0+0] + +.L0: brz,pn %i2,.Lend + nop + +.Loop: ldx [%i1-16],%g3 + add %i0,-32,%i0 + add %i2,-4,%i2 + sllx %g2,%i3,%i4 + srlx %g3,%i5,%g1 + + ldx [%i1-24],%g2 + sllx %g3,%i3,%l4 + or %i4,%g1,%i4 + stx %i4,[%i0+24] + srlx %g2,%i5,%g1 + + ldx [%i1-32],%g3 + sllx %g2,%i3,%i4 + or %l4,%g1,%l4 + stx %l4,[%i0+16] + srlx %g3,%i5,%g1 + + ldx [%i1-40],%g2 + sllx %g3,%i3,%l4 + or %i4,%g1,%i4 + stx %i4,[%i0+8] + srlx %g2,%i5,%g1 + + add %i1,-32,%i1 + or %l4,%g1,%l4 + brnz,pt %i2,.Loop + stx %l4,[%i0+0] + +.Lend: sllx %g2,%i3,%g2 + stx %g2,[%i0-8] + + mov %l1,%i0 + jmpl %i7+8, %g0 + restore + +END(__mpn_lshift) diff --git a/sysdeps/sparc/sparc64/mul_1.s b/sysdeps/sparc64/mul_1.S similarity index 50% rename from sysdeps/sparc/sparc64/mul_1.s rename to sysdeps/sparc64/mul_1.S index 91d6eb01b8..87e441d7eb 100644 --- a/sysdeps/sparc/sparc64/mul_1.s +++ b/sysdeps/sparc64/mul_1.S @@ -1,41 +1,39 @@ -! SPARC v9 __mpn_mul_1 -- Multiply a limb vector with a single limb and -! store the product in a second limb vector. +/* SPARC v9 __mpn_mul_1 -- Multiply a limb vector with a single limb and + store the product in a second limb vector. -! Copyright (C) 1995, 1996 Free Software Foundation, Inc. + Copyright (C) 1995, 1996 Free Software Foundation, Inc. -! This file is part of the GNU MP Library. + This file is part of the GNU MP Library. -! The GNU MP Library is free software; you can redistribute it and/or modify -! it under the terms of the GNU Library General Public License as published by -! the Free Software Foundation; either version 2 of the License, or (at your -! option) any later version. + The GNU MP Library is free software; you can redistribute it and/or modify + it under the terms of the GNU Library General Public License as published by + the Free Software Foundation; either version 2 of the License, or (at your + option) any later version. -! The GNU MP Library is distributed in the hope that it will be useful, but -! WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -! or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public -! License for more details. + The GNU MP Library is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public + License for more details. -! You should have received a copy of the GNU Library General Public License -! along with the GNU MP Library; see the file COPYING.LIB. If not, write to -! the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -! MA 02111-1307, USA. + You should have received a copy of the GNU Library General Public License + along with the GNU MP Library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA. */ + +#include -! INPUT PARAMETERS -! res_ptr o0 -! s1_ptr o1 -! size o2 -! s2_limb o3 +/* INPUT PARAMETERS + res_ptr o0 + s1_ptr o1 + size o2 + s2_limb o3 */ -.section ".text" - .align 4 - .global __mpn_mul_1 - .type __mpn_mul_1,#function - .proc 016 -__mpn_mul_1: +ENTRY(__mpn_mul_1) !#PROLOGUE# 0 - save %sp,-160,%sp + save %sp,-128,%sp !#PROLOGUE# 1 + sub %g0,%i2,%o7 sllx %o7,3,%g5 sub %i1,%g5,%o3 @@ -77,10 +75,10 @@ __mpn_mul_1: add %o7,1,%o7 stx %i0,[%o4+%g1] brnz %o7,.Loop - add %i1,%g5,%o0 ! compute new cy_limb + add %i1,%g5,%o0 ! compute new cy_limb mov %o0,%i0 - ret - restore -.LLfe1: - .size __mpn_mul_1,.LLfe1-__mpn_mul_1 + jmpl %i7+8,%g0 + restore + +END(__mpn_mul_1) diff --git a/sysdeps/sparc64/rshift.S b/sysdeps/sparc64/rshift.S new file mode 100644 index 0000000000..e1b3aca112 --- /dev/null +++ b/sysdeps/sparc64/rshift.S @@ -0,0 +1,93 @@ +/* SPARC v9 __mpn_rshift -- + + Copyright (C) 1996 Free Software Foundation, Inc. + + This file is part of the GNU MP Library. + + The GNU MP Library is free software; you can redistribute it and/or modify + it under the terms of the GNU Library General Public License as published by + the Free Software Foundation; either version 2 of the License, or (at your + option) any later version. + + The GNU MP Library is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public + License for more details. + + You should have received a copy of the GNU Library General Public License + along with the GNU MP Library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA. */ + +#include + +/* INPUT PARAMETERS + res_ptr %i0 + src_ptr %i1 + size %i2 + cnt %i3 */ + +ENTRY(__mpn_rshift) + save %sp, -128, %sp + + ldx [%i1],%g2 ! load first limb + sub %g0,%i3,%i5 ! negate shift count + add %i2,-1,%i2 + and %i2,4-1,%l4 ! number of limbs in first loop + sllx %g2,%i5,%g1 ! compute function result + brz,pn %l4,.L0 ! if multiple of 4 limbs, skip first loop + mov %g1,%l1 + + sub %i2,%l4,%i2 ! adjust count for main loop + +.Loop0: ldx [%i1+8],%g3 + add %i0,8,%i0 + add %i1,8,%i1 + add %l4,-1,%l4 + srlx %g2,%i3,%i4 + sllx %g3,%i5,%g1 + mov %g3,%g2 + or %i4,%g1,%i4 + brnz,pt %l4,.Loop0 + stx %i4,[%i0-8] + +.L0: brz,pn %i2,.Lend + nop + +.Loop: ldx [%i1+8],%g3 + add %i0,32,%i0 + add %i2,-4,%i2 + srlx %g2,%i3,%i4 + sllx %g3,%i5,%g1 + + ldx [%i1+16],%g2 + srlx %g3,%i3,%l4 + or %i4,%g1,%i4 + stx %i4,[%i0-32] + sllx %g2,%i5,%g1 + + ldx [%i1+24],%g3 + srlx %g2,%i3,%i4 + or %l4,%g1,%l4 + stx %l4,[%i0-24] + sllx %g3,%i5,%g1 + + ldx [%i1+32],%g2 + srlx %g3,%i3,%l4 + or %i4,%g1,%i4 + stx %i4,[%i0-16] + sllx %g2,%i5,%g1 + + add %i1,32,%i1 + or %l4,%g1,%l4 + brnz %i2,.Loop + stx %l4,[%i0-8] + +.Lend: srlx %g2,%i3,%g2 + stx %g2,[%i0-0] + + mov %l1,%i0 + jmpl %i7+8,%g0 + restore + +END(__mpn_rshift) diff --git a/sysdeps/sparc64/sub_n.S b/sysdeps/sparc64/sub_n.S new file mode 100644 index 0000000000..93f8a8235d --- /dev/null +++ b/sysdeps/sparc64/sub_n.S @@ -0,0 +1,55 @@ +/* SPARC v9 __mpn_sub_n -- Subtract two limb vectors of the same length > 0 + and store difference in a third limb vector. + + Copyright (C) 1995, 1996 Free Software Foundation, Inc. + + This file is part of the GNU MP Library. + + The GNU MP Library is free software; you can redistribute it and/or modify + it under the terms of the GNU Library General Public License as published by + the Free Software Foundation; either version 2 of the License, or (at your + option) any later version. + + The GNU MP Library is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public + License for more details. + + You should have received a copy of the GNU Library General Public License + along with the GNU MP Library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA. */ + +#include + +/* INPUT PARAMETERS + res_ptr %o0 + s1_ptr %o1 + s2_ptr %o2 + size %o3 */ + +ENTRY(__mpn_sub_n) + + sub %g0,%o3,%g3 + sllx %o3,3,%g1 + add %o1,%g1,%o1 ! make s1_ptr point at end + add %o2,%g1,%o2 ! make s2_ptr point at end + add %o0,%g1,%o0 ! make res_ptr point at end + mov 0,%o4 ! clear carry variable + sllx %g3,3,%o5 ! compute initial address index + +1: ldx [%o2+%o5],%g1 ! load s2 limb + add %g3,1,%g3 ! increment loop count + ldx [%o1+%o5],%g2 ! load s1 limb + addcc %g1,%o4,%g1 ! add s2 limb and carry variable + movcc %xcc,0,%o4 ! if carry-out, o4 was 1; clear it + subcc %g1,%g2,%g1 ! subtract s1 limb from sum + stx %g1,[%o0+%o5] ! store result + add %o5,8,%o5 ! increment address index + brnz,pt %g3,1b + movcs %xcc,1,%o4 ! if s1 subtract gave carry, record it + + retl + mov %o4,%o0 + +END(__mpn_sub_n) diff --git a/sysdeps/sparc/sparc64/submul_1.s b/sysdeps/sparc64/submul_1.S similarity index 51% rename from sysdeps/sparc/sparc64/submul_1.s rename to sysdeps/sparc64/submul_1.S index e796243470..3cc0e3bb08 100644 --- a/sysdeps/sparc/sparc64/submul_1.s +++ b/sysdeps/sparc64/submul_1.S @@ -1,41 +1,39 @@ -! SPARC v9 __mpn_submul_1 -- Multiply a limb vector with a single limb and -! subtract the product from a second limb vector. +/* SPARC v9 __mpn_submul_1 -- Multiply a limb vector with a single limb and + subtract the product from a second limb vector. -! Copyright (C) 1996 Free Software Foundation, Inc. + Copyright (C) 1996 Free Software Foundation, Inc. -! This file is part of the GNU MP Library. + This file is part of the GNU MP Library. -! The GNU MP Library is free software; you can redistribute it and/or modify -! it under the terms of the GNU Library General Public License as published by -! the Free Software Foundation; either version 2 of the License, or (at your -! option) any later version. + The GNU MP Library is free software; you can redistribute it and/or modify + it under the terms of the GNU Library General Public License as published by + the Free Software Foundation; either version 2 of the License, or (at your + option) any later version. -! The GNU MP Library is distributed in the hope that it will be useful, but -! WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -! or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public -! License for more details. + The GNU MP Library is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public + License for more details. -! You should have received a copy of the GNU Library General Public License -! along with the GNU MP Library; see the file COPYING.LIB. If not, write to -! the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -! MA 02111-1307, USA. + You should have received a copy of the GNU Library General Public License + along with the GNU MP Library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA. */ + +#include -! INPUT PARAMETERS -! res_ptr o0 -! s1_ptr o1 -! size o2 -! s2_limb o3 +/* INPUT PARAMETERS + res_ptr o0 + s1_ptr o1 + size o2 + s2_limb o3 */ -.section ".text" - .align 4 - .global __mpn_submul_1 - .type __mpn_submul_1,#function - .proc 016 -__mpn_submul_1: +ENTRY(__mpn_submul_1) !#PROLOGUE# 0 - save %sp,-160,%sp + save %sp,-128,%sp !#PROLOGUE# 1 + sub %g0,%i2,%o7 sllx %o7,3,%g5 sub %i1,%g5,%o3 @@ -80,10 +78,10 @@ __mpn_submul_1: movcs %xcc,1,%g5 stx %i0,[%o4+%g1] brnz %o7,.Loop - add %i1,%g5,%o0 ! compute new cy_limb + add %i1,%g5,%o0 ! compute new cy_limb mov %o0,%i0 - ret - restore -.LLfe1: - .size __mpn_submul_1,.LLfe1-__mpn_submul_1 + jmpl %i7+8,%g0 + restore + +END(__mpn_submul_1) diff --git a/sysdeps/unix/sysv/linux/sparc/errno.c b/sysdeps/unix/sysv/linux/sparc/errno.c deleted file mode 100644 index 663ab33e93..0000000000 --- a/sysdeps/unix/sysv/linux/sparc/errno.c +++ /dev/null @@ -1 +0,0 @@ -itn errno; diff --git a/sysdeps/unix/sysv/linux/sparc/kernel_sigaction.h b/sysdeps/unix/sysv/linux/sparc/kernel_sigaction.h deleted file mode 100644 index f870d15082..0000000000 --- a/sysdeps/unix/sysv/linux/sparc/kernel_sigaction.h +++ /dev/null @@ -1,12 +0,0 @@ -/* Linux/SPARC version. This is the sigaction struction from the Linux - 2.1.20 kernel. */ - -struct sigaction - { - __sighandler_t sa_handler; - sigset_t sa_mask; - unsigned long int sa_flags; - void (*sa_restorer) (void); /* not used by Linux/SPARC yet */ - }; - -#define HAVE_SA_RESTORER diff --git a/sysdeps/unix/sysv/linux/sparc/kernel_stat.h b/sysdeps/unix/sysv/linux/sparc/kernel_stat.h index 993a8664dc..91f02f4e20 100644 --- a/sysdeps/unix/sysv/linux/sparc/kernel_stat.h +++ b/sysdeps/unix/sysv/linux/sparc/kernel_stat.h @@ -17,5 +17,12 @@ struct kernel_stat unsigned long int __unused3; long int st_blksize; long int st_blocks; - unsigned long int __unused4[2]; + unsigned long int __unused4; + unsigned long int __unused5; }; + +#define _HAVE___UNUSED1 +#define _HAVE___UNUSED2 +#define _HAVE___UNUSED3 +#define _HAVE___UNUSED4 +#define _HAVE___UNUSED5 diff --git a/sysdeps/unix/sysv/linux/sparc/sys/trap.h b/sysdeps/unix/sysv/linux/sparc/sys/trap.h new file mode 100644 index 0000000000..99b9c60e06 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sys/trap.h @@ -0,0 +1,7 @@ +/* Include Linux/SPARC specific trap definitions. */ +#ifndef _SYS_TRAP_H +#define _SYS_TRAP_H 1 + +#include + +#endif /* sys/trap.h */ diff --git a/sysdeps/unix/sysv/linux/sparc64/Makefile b/sysdeps/unix/sysv/linux/sparc64/Makefile new file mode 100644 index 0000000000..c4d83226a2 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc64/Makefile @@ -0,0 +1,4 @@ +ifeq ($(subdir),misc) +sysdep_headers += ucontext.h +sysdep_routines += getcontext setcontext +endif diff --git a/sysdeps/unix/sysv/linux/sparc64/__longjmp.S b/sysdeps/unix/sysv/linux/sparc64/__longjmp.S new file mode 100644 index 0000000000..3107179fdc --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc64/__longjmp.S @@ -0,0 +1 @@ +/* There is no need for __longjmp what with setcontext. */ diff --git a/sysdeps/unix/sysv/linux/sparc64/bits/setjmp.h b/sysdeps/unix/sysv/linux/sparc64/bits/setjmp.h new file mode 100644 index 0000000000..ab850e5301 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc64/bits/setjmp.h @@ -0,0 +1,26 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _JMP_BUF_H +#define _JMP_BUF_H 1 + +#include + +typedef ucontext_t __jmp_buf[1]; + +#endif /* jmp_buf.h */ diff --git a/sysdeps/unix/sysv/linux/sparc64/bits/types.h b/sysdeps/unix/sysv/linux/sparc64/bits/types.h new file mode 100644 index 0000000000..222967881f --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc64/bits/types.h @@ -0,0 +1,95 @@ +/* Copyright (C) 1991, 92, 94, 95, 96, 97 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* + * Never include this file directly; use instead. + */ + +#ifndef _BITS_TYPES_H +#define _BITS_TYPES_H 1 + +#include + +/* Convenience types. */ +typedef unsigned char __u_char; +typedef unsigned short __u_short; +typedef unsigned int __u_int; +typedef unsigned long __u_long; +typedef unsigned long int __u_quad_t; +typedef long int __quad_t; +typedef signed char __int8_t; +typedef unsigned char __uint8_t; +typedef signed short int __int16_t; +typedef unsigned short int __uint16_t; +typedef signed int __int32_t; +typedef unsigned int __uint32_t; +typedef signed long int __int64_t; +typedef unsigned long int __uint64_t; +typedef __quad_t *__qaddr_t; + +typedef __u_int __dev_t; /* Type of device numbers. */ +typedef __u_int __uid_t; /* Type of user identifications. */ +typedef __u_int __gid_t; /* Type of group identifications. */ +typedef __u_int __ino_t; /* Type of file serial numbers. */ +typedef __u_int __mode_t; /* Type of file attribute bitmasks. */ +typedef __u_int __nlink_t; /* Type of file link counts. */ +typedef long int __off_t; /* Type of file sizes and offsets. */ +typedef __quad_t __loff_t; /* Type of file sizes and offsets. */ +typedef int __pid_t; /* Type of process identifications. */ +typedef long int __ssize_t; /* Type of a byte count, or error. */ + +typedef struct + { + int __val[2]; + } __fsid_t; /* Type of file system IDs. */ + +/* Everythin' else. */ +typedef int __daddr_t; /* The type of a disk address. */ +typedef char *__caddr_t; +typedef long int __time_t; +typedef long int __swblk_t; /* Type of a swap block maybe? */ + +typedef long int __clock_t; + +/* One element in the file descriptor mask array. */ +typedef unsigned long int __fd_mask; + +/* Due to incaution, we may have gotten these from a kernel header file. */ +#undef __FD_SETSIZE +#undef __NFDBITS +#undef __FDMASK + +/* Number of descriptors that can fit in an `fd_set'. */ +#define __FD_SETSIZE 1024 + +/* It's easier to assume 8-bit bytes than to get CHAR_BIT. */ +#define __NFDBITS (8 * sizeof (__fd_mask)) +#define __FDELT(d) ((d) / __NFDBITS) +#define __FDMASK(d) (1 << ((d) % __NFDBITS)) + +/* fd_set for select and pselect. */ +typedef struct + { + /* XPG4.2 requires this member name. */ + __fd_mask fds_bits[__FD_SETSIZE / __NFDBITS]; + } __fd_set; + + +typedef int __key_t; + +#endif /* bits/types.h */ diff --git a/sysdeps/unix/sysv/linux/sparc64/brk.S b/sysdeps/unix/sysv/linux/sparc64/brk.S new file mode 100644 index 0000000000..87412e095a --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc64/brk.S @@ -0,0 +1,97 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Richard Henderson , 1997. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* __brk is a special syscall under Linux since it never returns an + error. Instead, the error condition is indicated by returning the old + break value (instead of the new, requested one). */ + +#include +#define _ERRNO_H +#include + +#ifdef PIC +.section .bss + .align 8 + .globl __curbrk +__curbrk: .skip 8 + .type __curbrk,@object + .size __curbrk,8 +#else +.common __curbrk, 8, 8 +#endif + + .text +ENTRY(__brk) + save %sp, -160, %sp +#ifdef PIC +1: rd %pc, %g1 + sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7 + or %l7, %lo(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7 + add %l7, %g1, %l7 +#endif + + LOADSYSCALL(brk) + mov %i0, %o0 + + ta 0x11 + + /* All the ways we can fail... */ + bcs,pn %xcc, .Lerr1 + nop + brz %i0, .Lok + subcc %i0, %o0, %g0 + bne,pn %xcc, .Lerr0 + + /* Update __curbrk and return cleanly. */ +.Lok: sethi %hi(__curbrk), %g1 + or %g1, %lo(__curbrk), %g1 +#ifdef PIC + ldx [%l7+%g1], %g1 + stx %o0, [%g1] +#else + stx %o0, [%g4+%g1] +#endif + mov %g0, %i0 + + /* Don't use "ret" cause the preprocessor will eat it. */ + jmpl %i7+8, %g0 + restore + + /* What a horrible way to die. */ +.Lerr0: set ENOMEM, %o0 +.Lerr1: sethi %hi(errno), %g1 + or %g1, %lo(errno), %g1 +#ifdef PIC + ldx [%l7+%g1], %g1 + st %o0, [%g1] +#else + st %o0, [%g4+%g1] +#endif +#ifdef _LIBC_REENTRANT + call __errno_location + mov %o0,%l1 + st %l1, [%o0] +#endif + sub %g0, 1, %i0 + jmpl %i7+8, %g0 + restore + + .size __brk, .-__brk + +weak_alias (__brk, brk) diff --git a/sysdeps/unix/sysv/linux/sparc64/clone.S b/sysdeps/unix/sysv/linux/sparc64/clone.S new file mode 100644 index 0000000000..fe38bf4ab7 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc64/clone.S @@ -0,0 +1,89 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + Contributed by Richard Henderson (rth@tamu.edu). + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* clone() is even more special than fork() as it mucks with stacks + and invokes a function in the right context after its all over. */ + +#include +#include + +/* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg); */ + + .text + .align 4 + .globl __libc_clone + .type __libc_clone,@function + .weak clone + __clone = __libc_clone + clone = __libc_clone + +__libc_clone: + save %sp,-160,%sp + + /* sanity check arguments */ + brz,pn %i0, 99f + mov %i0, %l0 /* save fn */ + brz,pn %i1, 99f + mov %i3, %l3 /* save arg */ + + /* Do the system call */ + mov %i1, %o1 + mov %i2, %o0 + set __NR_clone, %g1 + ta 0x11 + bcs,pn %xcc, 99f + nop + brnz %o0, __thread_start + mov %o0, %i0 + ret + restore +99: +#ifdef PIC + rd %pc, %g1 + sethi %hi(_GLOBAL_OFFSET_TABLE_-(99b-.)), %l7 + or %l7, %lo(_GLOBAL_OFFSET_TABLE_-(99b-.)), %l7 + add %l7, %g1, %l7 + set EINVAL, %i0 + sethi %hi(errno), %g2 + or %g2, %lo(errno), %g2 + st %i0, [%l7+%g2] +#else + sethi %hi(errno), %g2 + add %g2, %g4, %g2 + set EINVAL, %i0 + st %i0, [%g2+%lo(errno)] +#endif +#ifdef _LIBC_REENTRANT + call __errno_location + nop + st %i0, [%o0] +#endif + mov -1,%i0 + ret + restore + .size __libc_clone,.-__libc_clone + + .type __thread_start,@function +__thread_start: + mov %g0, %fp /* terminate backtrace */ + sub %sp, 6*8, %sp /* provide arg storage */ + call %l0 + mov %l3,%o0 + call _exit,0 + nop + .size __thread_start,.-__thread_start diff --git a/sysdeps/unix/sysv/linux/sparc64/fork.S b/sysdeps/unix/sysv/linux/sparc64/fork.S new file mode 100644 index 0000000000..d57736b733 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc64/fork.S @@ -0,0 +1,33 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Miguel de Icaza , 1997. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If + not, write to the Free Software Foundation, Inc., 675 Mass Ave, + Cambridge, MA 02139, USA. */ + +#include + +PSEUDO (__libc_fork, fork, 0) + tst %o1 + be %xcc, 1f + nop + /* child: return 0 */ + clr %o0 +1: ret + +PSEUDO_END (__libc_fork) + +weak_alias (__libc_fork, __fork) +weak_alias (__libc_fork, fork) diff --git a/sysdeps/unix/sysv/linux/sparc64/getcontext.S b/sysdeps/unix/sysv/linux/sparc64/getcontext.S new file mode 100644 index 0000000000..05b06269e4 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc64/getcontext.S @@ -0,0 +1,30 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + Contributed by Richard Henderson (rth@tamu.edu). + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +/* void getcontext(ucontext_t *); */ + +ENTRY(__getcontext) + + ta 0x6e + ret + +END(__getcontext) + +weak_alias(__getcontext, getcontext) diff --git a/sysdeps/unix/sysv/linux/sparc64/init-first.h b/sysdeps/unix/sysv/linux/sparc64/init-first.h new file mode 100644 index 0000000000..f7fad7f87f --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc64/init-first.h @@ -0,0 +1,92 @@ +/* Prepare arguments for library initialization function. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* The job of this fragment it to find argc and friends for INIT. + This is done in one of two ways: either in the stack context + of program start, or having dlopen pass them in. */ + +#include + +#define __S1(x) #x +#define __S(x) __S1(x) + +#ifdef PIC + +#define SYSDEP_CALL_INIT(NAME, INIT) asm("\ + .weak _dl_starting_up + .global " #NAME " + .type " #NAME ",@function +" #NAME ": + save %sp, -64, %sp +1: rd %pc, %g1 + sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7 + or %l7, %lo(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7 + add %l7, %o7, %l7 + /* Are we a dynamic libc being loaded into a static program? */ + sethi %hi(_dl_starting_up), %g2 + or %g2, %lo(_dl_starting_up), %g2 + ld [%l7+%g2], %g2 + brz,pn %g2, 3f + sethi %hi(__libc_multiple_libcs), %g3 + ld [%g2], %g2 + subcc %g0, %g2, %g0 + subc %g0, -1, %g2 +3: or %g3, %lo(__libc_multiple_libcs), %g3 + ld [%l7+%g3], %g3 + st %g2, [%g3] + /* If so, argc et al are in %o0-%o2 already. Otherwise, load them. */ + brnz,pn %g2, " #INIT " + restore + ld [%sp+" __S(STACK_BIAS) "+22*8], %o0 + add %sp, " __S(STACK_BIAS) "+23*8, %o1 + sll %o0, 3, %o2 + add %o2, %o1, %o2 + add %o2, 8, %o2 + ba,a " #INIT " + .size "#NAME " .-" #NAME); + +#else + +#define SYSDEP_CALL_INIT(NAME, INIT) asm("\ + .weak _dl_starting_up + .global " #NAME " + .type " #NAME ",@function +" #NAME ": + /* Are we a dynamic libc being loaded into a static program? */ + sethi %hi(_dl_starting_up), %g2 + or %g2, %lo(_dl_starting_up), %g2 + brz,pt %g2, 3f + sethi %hi(__libc_multiple_libcs), %g3 + ld [%g4+%g2], %g2 + subcc %g0, %g2, %g0 + subc %g0, -1, %g2 +3: add %g3, %g4, %g3 + st %g2, [%g3+%lo(__libc_multiple_libcs)] + /* If so, argc et al are in %o0-%o2 already. Otherwise, load them. */ + brnz,pn %g2, " #INIT " + nop + ld [%sp+" __S(STACK_BIAS) "+22*8], %o0 + add %sp, " __S(STACK_BIAS) "+23*8, %o1 + sll %o0, 3, %o2 + add %o2, %o1, %o2 + add %o2, 8, %o2 + ba,a " #INIT " + .size "#NAME ", .-" #NAME); + +#endif diff --git a/sysdeps/unix/sysv/linux/sparc64/kernel_stat.h b/sysdeps/unix/sysv/linux/sparc64/kernel_stat.h new file mode 100644 index 0000000000..fcb752e3ec --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc64/kernel_stat.h @@ -0,0 +1,22 @@ +/* Definition of `struct stat' used in the kernel */ +struct kernel_stat + { + unsigned int st_dev; + unsigned int st_ino; + unsigned int st_mode; + short int st_nlink; + unsigned int st_uid; + unsigned int st_gid; + unsigned int st_rdev; + long int st_size; + long int st_atime; + long int st_mtime; + long int st_ctime; + long int st_blksize; + long int st_blocks; + unsigned long int __unused1; + unsigned long int __unused2; + }; + +#define _HAVE___UNUSED1 +#define _HAVE___UNUSED2 diff --git a/sysdeps/unix/sysv/linux/sparc64/longjmp.S b/sysdeps/unix/sysv/linux/sparc64/longjmp.S new file mode 100644 index 0000000000..c81b10495e --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc64/longjmp.S @@ -0,0 +1,44 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + Contributed by Richard Henderson (rth@tamu.edu). + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* longjmp is implemented in terms of the setcontext trap on Linux/Sparc64. */ + +#include + +/* Offsets into the jmp_buf structure. */ + +#define O_mask_was_saved 512 +#define O_gregs 32 +#define O_g1 (O_gregs + 4*8) + + +/* void longjmp (sigjmp_buf env, int val) */ + +ENTRY(longjmp) + + /* Modify the context with the value we want to return. */ + movre %o1, 1, %o1 + stx %o1, [%o0 + O_g1] + + /* Let setcontext know if we want to modify the current sigmask. */ + ld [%o0 + O_mask_was_saved], %o1 + + /* And bamf back to where we belong! */ + ta 0x6f + +END(longjmp) diff --git a/sysdeps/unix/sysv/linux/sparc64/pipe.S b/sysdeps/unix/sysv/linux/sparc64/pipe.S new file mode 100644 index 0000000000..82ff4eae3c --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc64/pipe.S @@ -0,0 +1,37 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Miguel de Icaza , 1997. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +ENTRY (__libc_pipe) + mov %o0, %o2 /* Save PIPEDES. */ + LOADSYSCALL(pipe) + ta 0x11 + bcc,pn %xcc, 2f + nop + SYSCALL_ERROR_HANDLER + +2: st %o0, [%o2] /* PIPEDES[0] = %o0; */ + st %o1, [%o2 + 4] /* PIPEDES[1] = %o1; */ + retl + clr %o0 +PSEUDO_END (__libc_pipe) + +weak_alias (__libc_pipe, __pipe) +weak_alias (__libc_pipe, pipe) diff --git a/sysdeps/unix/sysv/linux/sparc64/profil-counter.h b/sysdeps/unix/sysv/linux/sparc64/profil-counter.h new file mode 100644 index 0000000000..6a3f0a291a --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc64/profil-counter.h @@ -0,0 +1,26 @@ +/* Low-level statistical profiling support function. Linux/Sparc64 version. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +void +profil_counter (int signo, __siginfo_t *si) +{ + profil_count ((void *) si->si_regs.tpc); +} diff --git a/sysdeps/unix/sysv/linux/sparc64/setcontext.S b/sysdeps/unix/sysv/linux/sparc64/setcontext.S new file mode 100644 index 0000000000..2968b65633 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc64/setcontext.S @@ -0,0 +1,33 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + Contributed by Richard Henderson (rth@tamu.edu). + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + + +/* void setcontext(ucontext_t *ctx); */ +.weak setcontext +ENTRY(setcontext) + + mov 1, %o1 + +/* void __setcontext(ucontext_t *ctx, int restoremask); */ +ENTRY(__setcontext) + + ta 0x6f + +END(__setcontext) diff --git a/sysdeps/unix/sysv/linux/sparc64/setjmp.S b/sysdeps/unix/sysv/linux/sparc64/setjmp.S new file mode 100644 index 0000000000..8b88b49ac4 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc64/setjmp.S @@ -0,0 +1,48 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + Contributed by Richard Henderson (rth@tamu.edu). + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* __sigsetjmp is implemented in terms of the getcontext trap on + Linux/Sparc64. */ + +#include + +/* Offsets into the jmp_buf structure. */ + +#define O_mask_was_saved 512 +#define O_gregs 32 +#define O_g1 (O_gregs + 4*8) + + +/* int __sigsetjmp(jmp_buf, savemask) */ + +ENTRY(__sigsetjmp) + + /* Record whether the user is intending to save the sigmask. */ + st %o1, [%o0 + O_mask_was_saved] + + /* Load up our return value, as longjmp is going to override + the jmp_buf on its way back. */ + mov %g0, %g1 + + /* And call getcontext! */ + ta 0x6e + + retl + mov %g1, %o0 + +END(__sigsetjmp) diff --git a/sysdeps/unix/sysv/linux/sparc64/sigjmp.S b/sysdeps/unix/sysv/linux/sparc64/sigjmp.S new file mode 100644 index 0000000000..940ccbcf68 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc64/sigjmp.S @@ -0,0 +1 @@ +/* There is no need for __sigjmp_save what with getcontext. */ diff --git a/sysdeps/unix/sysv/linux/sparc64/syscalls.list b/sysdeps/unix/sysv/linux/sparc64/syscalls.list new file mode 100644 index 0000000000..66ba470994 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc64/syscalls.list @@ -0,0 +1,26 @@ +# File name Caller Syscall name # args Strong name Weak names + +# Whee! 64-bit systems naturally implement llseek. +llseek EXTRA lseek 3 llseek + +# Override select.S in parent directory: +select - select 5 __select select +accept - accept 3 __accept accept +bind - bind 3 __bind bind +connect - connect 3 __connect connect +getpeername - getpeername 3 __getpeername getpeername +getsockname - getsockname 3 __getsockname getsockname +getsockopt - getsockopt 5 __getsockopt getsockopt +listen - listen 2 __listen listen +recv - recv 4 __recv recv +recvfrom - recvfrom 6 __recvfrom recvfrom +recvmsg - recvmsg 3 __recvmsg recvmsg +send - send 4 __send send +sendmsg - sendmsg 3 __sendmsg sendmsg +sendto - sendto 6 __sendto sendto +setsockopt - setsockopt 5 __setsockopt setsockopt +shutdown - shutdown 2 __shutdown shutdown +socketpair - socketpair 4 __socketpair socketpair + +# Another broken Linux/i386 idea layed to rest +ptrace - ptrace 4 __ptrace ptrace diff --git a/sysdeps/unix/sysv/linux/sparc64/sysdep.S b/sysdeps/unix/sysv/linux/sparc64/sysdep.S new file mode 100644 index 0000000000..736578083c --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc64/sysdep.S @@ -0,0 +1,31 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Richard Henderson , 1997. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + + +/* Define errno */ + + .section .bss + .globl errno + .align 2 +errno: .space 4 + .type errno, @object + .size errno, 4 + + .globl __errno +__errno = errno diff --git a/sysdeps/unix/sysv/linux/sparc64/sysdep.h b/sysdeps/unix/sysv/linux/sparc64/sysdep.h new file mode 100644 index 0000000000..f01c1f43cd --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc64/sysdep.h @@ -0,0 +1,116 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Richard Henderson , 1997. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _LINUX_SPARC64_SYSDEP_H +#define _LINUX_SPARC64_SYSDEP_H 1 + +#include + +#undef SYS_ify +#define SYS_ify(syscall_name) __NR_##syscall_name + +#ifdef ASSEMBLER + +#ifdef DONT_LOAD_G1 +# define LOADSYSCALL(x) +#else +# define LOADSYSCALL(x) mov __NR_##x, %g1 +#endif + +/* Linux/SPARC uses a different trap number */ +#undef PSEUDO +#undef ENTRY + +#define ENTRY(name) \ + .global C_SYMBOL_NAME(name); \ + .align 2; \ + C_LABEL(name); \ + .type name,@function; + +#ifdef PIC +#define SYSCALL_ERROR_HANDLER1(R) \ + .global C_SYMBOL_NAME(errno); \ + .type C_SYMBOL_NAME(errno),@object; \ +0: rd %pc,%g1; \ + sethi %hi(_GLOBAL_OFFSET_TABLE_-(0b-.)),%g2; \ + add %g2,%lo(_GLOBAL_OFFSET_TABLE_-(0b-.)),%g2; \ + add %g2,%g1,%g1; \ + sethi %hi(errno),%g2; \ + add %g2,%lo(errno),%g2; \ + ldx [%g1+%g2],%g2; \ + st R,[%g2] +#else +#define SYSCALL_ERROR_HANDLER1(R) \ + .global C_SYMBOL_NAME(errno); \ + .type C_SYMBOL_NAME(errno),@object; \ + sethi %hi(errno),%g1; \ + add %g1,%g4,%g1; \ + st R,[%g1+%lo(errno)] +#endif + +#ifdef _LIBC_REENTRANT +#define SYSCALL_ERROR_HANDLER \ + .global C_SYMBOL_NAME(__errno_location); \ + .type C_SYMBOL_NAME(__errno_location),@function; \ + save %sp,-128,%sp; \ + SYSCALL_ERROR_HANDLER1(%i0); \ + call __errno_location; \ + nop; \ + st %i0,[%o0]; \ + sub %g0,1,%i0; \ + jmpl %i7+8, %g0; \ + restore +#else +#define SYSCALL_ERROR_HANDLER \ + SYSCALL_ERROR_HANDLER1(%o0); \ + retl; \ + sub %g0,1,%i0 +#endif + +#define PSEUDO(name, syscall_name, args) \ + .text; \ + ENTRY(name); \ + LOADSYSCALL(syscall_name); \ + ta 0x11; \ + bcc,pt %xcc,1f; \ + nop; \ + SYSCALL_ERROR_HANDLER; \ +1: + +#undef PSEUDO_END +#define PSEUDO_END(name) \ + .size name,.-name + +#undef END +#define END(name) \ + .size name,.-name + +/* Careful here! This "ret" define can interfere; use jmpl if unsure. */ +#define ret retl; nop +#define r0 %o0 +#define r1 %o1 +#define MOVE(x,y) mov x, y + +#endif /* ASSEMBLER */ + +/* This is the offset from the %sp to the backing store above the + register windows. So if you poke stack memory directly you add this. */ +#define STACK_BIAS 2047 + +#endif /* linux/sparc64/sysdep.h */ diff --git a/sysdeps/unix/sysv/linux/sparc64/ucontext.h b/sysdeps/unix/sysv/linux/sparc64/ucontext.h new file mode 100644 index 0000000000..160e2fc43a --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc64/ucontext.h @@ -0,0 +1,67 @@ +#ifndef _UCONTEXT_H +#define _UCONTEXT_H + +#include + +#define MC_TSTATE 0 +#define MC_PC 1 +#define MC_NPC 2 +#define MC_Y 3 +#define MC_G1 4 +#define MC_G2 5 +#define MC_G3 6 +#define MC_G4 7 +#define MC_G5 8 +#define MC_G6 9 +#define MC_G7 10 +#define MC_O0 11 +#define MC_O1 12 +#define MC_O2 13 +#define MC_O3 14 +#define MC_O4 15 +#define MC_O5 16 +#define MC_O6 17 +#define MC_O7 18 +#define MC_NGREG 19 + +typedef unsigned long mc_greg_t; +typedef mc_greg_t mc_gregset_t[MC_NGREG]; + +#define MC_MAXFPQ 16 +struct mc_fq { + unsigned long *mcfq_addr; + unsigned int mcfq_insn; +}; + +struct mc_fpu { + union { + unsigned int sregs[32]; + unsigned long dregs[32]; + long double qregs[16]; + } mcfpu_fregs; + unsigned long mcfpu_fsr; + unsigned long mcfpu_fprs; + unsigned long mcfpu_gsr; + struct mc_fq *mcfpu_fq; + unsigned char mcfpu_qcnt; + unsigned char mcfpu_qentsz; + unsigned char mcfpu_enab; +}; +typedef struct mc_fpu mc_fpu_t; + +typedef struct { + mc_gregset_t mc_gregs; + mc_greg_t mc_fp; + mc_greg_t mc_i7; + mc_fpu_t mc_fpregs; +} mcontext_t; + +struct ucontext { + struct ucontext *uc_link; + unsigned long uc_flags; + unsigned long uc_sigmask; + mcontext_t uc_mcontext; +}; +typedef struct ucontext ucontext_t; + +#endif /* ucontext.h */ diff --git a/sysdeps/unix/sysv/linux/syscalls.list b/sysdeps/unix/sysv/linux/syscalls.list index 5d91a2edfe..f11370d6cb 100644 --- a/sysdeps/unix/sysv/linux/syscalls.list +++ b/sysdeps/unix/sysv/linux/syscalls.list @@ -13,6 +13,7 @@ geteuid - geteuid 0 __geteuid geteuid getpgid - getpgid 1 __getpgid getpgid getpgrp - getpgrp 0 getpgrp getppid - getppid 0 __getppid getppid +getresgid EXTRA getresgid 3 getresgid getresuid EXTRA getresuid 3 getresuid getsid - getsid 1 getsid init_module EXTRA init_module 5 init_module @@ -54,6 +55,7 @@ select - _newselect 5 __select select setfsgid EXTRA setfsgid 1 setfsgid setfsuid EXTRA setfsuid 1 setfsuid setpgid - setpgid 2 __setpgid setpgid +setresgid EXTRA setresgid 3 setresgid setresuid EXTRA setresuid 3 setresuid sigpending - sigpending 1 sigpending sigprocmask - sigprocmask 3 __sigprocmask sigprocmask