This is the mail archive of the libc-hacker@sourceware.cygnus.com mailing list for the glibc project.
Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Hi, Here's a patch for glibc-2.1.3 to support new sh-linux-gnu target for Linux on Hitachi SH processors. We've already done the paper work for copyright assignment, and got back the copy from FSF. Patch consists of two parts. One is for changes of generic part, and another is SH specific part. For the changes of generic part, there are four diffs. First three diffs are trivial, just add sh[34] support. We need the 4-th diff for csu/Makefile to get cststuff routines directly. This is needed because we couldn't use generated files. The constant (for label) is emitted far away than expected by the generation, after the function epilogue. Sorry for this long patch. Any comments are appreciated. Thanks, -- 2000-05-25 Kazumoto Kojima <kkojima@rr.iij4u.or.jp> Yutaka Niibe <gniibe@chroot.org> * configure.in: Add machine sh3, sh4. * configure: Likewise * scripts/config.sub: Likewise. * csu/Makefile: Add new variable crts-predefined whose non-zero value means to generate crt[in].o from system dependent predefined crt[in].S instead of initfini.c. * elf/elf.h: Add SH specific declarations of relocations. * sysdeps/sh/Dist: New file. * sysdeps/sh/Implies: New file. * sysdeps/sh/gmp-mparam.h: New file for SH specific definitions for GNU MP library. * sysdeps/sh/machine-gmon.h: New file for SH specific definitions for profiling support. * sysdeps/sh/memcpy.S: New file for memcpy function written in assembler. * sysdeps/sh/memset.S: Likewise for memset. * sysdeps/sh/strlen.S: Likewise for strlen. * sysdeps/sh/sysdep.h: New file for SH specific assembler macros. * sysdeps/sh/sh3/__longjmp.S: New file for SH-3 specific __longjmp function written in assembler. * sysdeps/sh/sh3/bits/endian.h: New file for SH-3 specific definitions for endian. * sysdeps/sh/sh3/bits/huge_val.h: New file for SH-3 specific definitions for HUGE_VAL constant. * sysdeps/sh/sh3/bits/setjmp.h: New file for SH-3 specific definitions for jmp_buf. * sysdeps/sh/sh3/bsd-_setjmp.S: New file for SH-3 specific BSD _setjmp function written in assembler. * sysdeps/sh/sh3/bsd-setjmp.S: Likewise for setjmp. * sysdeps/sh/sh3/dl-machine.h: New file for SH-3 specific ELF dynamic location inline functions. * sysdeps/sh/sh3/elf/crti.S: Likewise for _init and _fini function prologue. * sysdeps/sh/sh3/elf/crti.S: Likewise for their epilogue and __gmon_start__ function. * sysdeps/sh/sh3/elf/start.S: New file for the startup code for SH-3 in ELF. * sysdeps/sh/sh3/setjmp.S: New file for SH specific __setjmp and __sigsetjmp functions written in assembler. * sysdeps/sh/sh3/sys/ucontext.h: New file for SH-3 specific definitions for user context. * sysdeps/sh/sh4/__longjmp.S: New file for SH-4 specific __longjmp function written in assembler. * sysdeps/sh/sh4/bits/endian.h: New file for SH-4 specific definitions for endian. * sysdeps/sh/sh4/bits/huge_val.h: New file for SH-4 specific definitions for HUGE_VAL constant. * sysdeps/sh/sh4/bits/setjmp.h: New file for SH-4 specific definitions for jmp_buf. * sysdeps/sh/sh4/bsd-_setjmp.S: New file for SH-4 specific BSD _setjmp function written in assembler. * sysdeps/sh/sh4/bsd-setjmp.S: Likewise for setjmp. * sysdeps/sh/sh4/dl-machine.h: New file for SH-4 specific ELF dynamic location inline functions. * sysdeps/sh/sh4/elf/crti.S: Likewise for _init and _fini function prologue. * sysdeps/sh/sh4/elf/crti.S: Likewise for their epilogue and __gmon_start__ function. * sysdeps/sh/sh4/elf/start.S: New file for the startup code for SH-4 in ELF. * sysdeps/sh/sh4/setjmp.S: New file for SH specific __setjmp and __sigsetjmp functions written in assembler. * sysdeps/sh/sh4/sys/ucontext.h: New file for SH-4 specific definitions for user context. * sysdeps/sh/sh4/fpu/bits/fenv.h: New file for SH-4 specific definitions for FPU. * sysdeps/sh/sh4/fpu/fclrexcpt.c: New file for SH-4 specific feclearexcept function. * sysdeps/sh/sh4/fpu/fegetenv.c: Likewise for fegetenv. * sysdeps/sh/sh4/fpu/fegetround.c: Likewise for fegetround. * sysdeps/sh/sh4/fpu/feholdexcpt.c: Likewise for feholdexcept. * sysdeps/sh/sh4/fpu/fesetenv.c: Likewise for fesetenv. * sysdeps/sh/sh4/fpu/fesetround.c: Likewise for fesetround. * sysdeps/sh/sh4/fpu/fraiseexcpt.c: Likewise for feraiseexcept. * sysdeps/sh/sh4/fpu/fsetexcptflg.c: Likewise for fesetexceptflag. * sysdeps/sh/sh4/fpu/ftestexcept.c: Likewise for fetestexcept. * sysdeps/sh/sh4/fpu/fpu_control.h: New file for SH-4 specific FPU control word definitions. * sysdeps/unix/sh/sysdep.S: New file for SH specific __syscall_error function in unix. * /sysdeps/unix/sh/sysdep.h: New file for SH specific miscellaneous definitions in unix. * sysdeps/unix/sysv/linux/sh/Dist: New file. * sysdeps/unix/sysv/linux/sh/Makefile: Likewise. * sysdeps/unix/sysv/linux/sh/Versions: Likewise. * sysdeps/unix/sysv/linux/sh/bits/mman.h: New file for Linux/SH specific definitions for mmap interface. * sysdeps/unix/sysv/linux/sh/sysdep.S: New files for Linux/SH specific definitions for system call and errno. * sysdeps/unix/sysv/linux/sh/brk.c: New file for Linux/SH specific definitions for brk function. * sysdeps/unix/sysv/linux/sh/clone.S: Likewise for clone. * sysdeps/unix/sysv/linux/sh/pipe.S: Likewise for pipe. * sysdeps/unix/sysv/linux/sh/socket.S: Likewise for socket. * sysdeps/unix/sysv/linux/sh/vfork.S: Likewise for vfork. * sysdeps/unix/sysv/linux/sh/sigrestorer.S: Likewise for signal restorers. * sysdeps/unix/sysv/linux/sh/getgroups.c: Likewise for getgroups. * sysdeps/unix/sysv/linux/sh/pread.c: Likewise for pread. * sysdeps/unix/sysv/linux/sh/pread64.c: Likewise for pread64. * sysdeps/unix/sysv/linux/sh/pwrite.c: Likewise for pwrite. * sysdeps/unix/sysv/linux/sh/pwrite64.c: Likewise for pwrite64. * sysdeps/unix/sysv/linux/sh/setgid.c: Likewise for setgid. * sysdeps/unix/sysv/linux/sh/seteuid.c: Likewise for seteuid. * sysdeps/unix/sysv/linux/sh/setfsgid.c: Likewise for setfsgid. * sysdeps/unix/sysv/linux/sh/setfsuid.c: Likewise for setfsuid. * sysdeps/unix/sysv/linux/sh/setgid.c: Likewise for setgid. * sysdeps/unix/sysv/linux/sh/setgroups.c: Likewise for setgroups. * sysdeps/unix/sysv/linux/sh/setregid.c: Likewise for setregid. * sysdeps/unix/sysv/linux/sh/setresgid.c: Likewise for setresgid. * sysdeps/unix/sysv/linux/sh/setresuid.c: Likewise for setresuid. * sysdeps/unix/sysv/linux/sh/setreuid.c: Likewise for setreuid. * sysdeps/unix/sysv/linux/sh/setuid.c: Likewise for setuid. * sysdeps/unix/sysv/linux/sh/errlist.c: New file for Linux/SH specific definitions for errlist. * sysdeps/unix/sysv/linux/sh/errlist.c: Likewise for siglist. * sysdeps/unix/sysv/linux/sh/sigaction.c: New file for Linux/SH specific definitions for sigaction. * /sysdeps/unix/sysv/linux/sh/init-first.h: New file for Linux/SH specific definitions for library initialization. * sysdeps/unix/sysv/linux/sh/profil-counter.h: New file for Linux/SH specific definitions for profiling support. * sysdeps/unix/sysv/linux/sh/register-dump.h: New file for Linux/SH specific definitions for register dump. * sysdeps/unix/sysv/linux/sh/sigcontextinfo.h: New file for Linux/SH specific definitions for signal context. * sysdeps/unix/sysv/linux/sh/sys/io.h: New file for Linux/SH specific definitions for low level I/O. * sysdeps/unix/sysv/linux/sh/sys/user.h: New file for Linux/SH specific definitions for low level user context. * sysdeps/unix/sysv/linux/sh/syscalls.list: New file for Linux/SH specific system call list. * linuxthreads/sysdeps/sh/pt-machine.h: New file for SH specific definitions in linuxthreads. diff -u -r -N glibc-2.1.3-original/configure glibc-2.1.3/configure --- glibc-2.1.3-original/configure Tue Oct 5 09:56:26 1999 +++ glibc-2.1.3/configure Wed May 24 04:38:56 2000 @@ -903,6 +903,8 @@ IP22) machine=mips/mips3 ;; *) machine=mips/$machine ;; esac ;; +sh3*) base_machine=sh machine=sh/sh3 ;; +sh4*) base_machine=sh machine=sh/sh4 ;; sparc | sparcv[67]) base_machine=sparc machine=sparc/sparc32 ;; sparcv8 | supersparc | hypersparc) diff -u -r -N glibc-2.1.3-original/configure.in glibc-2.1.3/configure.in --- glibc-2.1.3-original/configure.in Tue Oct 5 09:55:45 1999 +++ glibc-2.1.3/configure.in Wed May 24 04:37:59 2000 @@ -219,6 +219,8 @@ IP22) machine=mips/mips3 ;; *) machine=mips/$machine ;; esac ;; +sh3*) base_machine=sh machine=sh/sh3 ;; +sh4*) base_machine=sh machine=sh/sh4 ;; sparc | sparcv[67]) base_machine=sparc machine=sparc/sparc32 ;; sparcv8 | supersparc | hypersparc) diff -u -r -N glibc-2.1.3-original/csu/Makefile glibc-2.1.3/csu/Makefile --- glibc-2.1.3-original/csu/Makefile Sat Apr 10 21:43:02 1999 +++ glibc-2.1.3/csu/Makefile Thu May 25 17:08:11 2000 @@ -76,12 +76,19 @@ install-lib += $(crtstuff:=.o) extra-objs += $(crtstuff:=.o) +ifneq (yes,$(crts-predefined)) generated += $(crtstuff:=.S) initfini.s defs.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) -g0 $(ASFLAGS-.os) -o $@ +else +generated += initfini.s defs.h + +$(objpfx)crti.o: $(objpfx)defs.h +$(objpfx)crtn.o: $(objpfx)defs.h +endif CFLAGS-initfini.s = -g0 -fPIC -fno-inline-functions @@ -91,6 +98,7 @@ # We only have one kind of startup code files. Static binaries and # shared libraries are build using the PIC version. +ifneq (yes,$(crts-predefined)) $(objpfx)crti.S: $(objpfx)initfini.s sed -n -e '1,/@HEADER_ENDS/p' \ -e '/@_.*_PROLOG_BEGINS/,/@_.*_PROLOG_ENDS/p' \ @@ -100,6 +108,7 @@ 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' $< | \ diff -u -r -N glibc-2.1.3-original/elf/elf.h glibc-2.1.3/elf/elf.h --- glibc-2.1.3-original/elf/elf.h Wed Feb 23 16:02:47 2000 +++ glibc-2.1.3/elf/elf.h Sun Mar 12 04:09:08 2000 @@ -1580,6 +1580,41 @@ /* Keep this the last entry. */ #define R_ARM_NUM 256 +/* SH specific declarations */ + +/* SH relocs. */ +#define R_SH_NONE 0 +#define R_SH_DIR32 1 +#define R_SH_REL32 2 +#define R_SH_DIR8WPN 3 +#define R_SH_IND12W 4 +#define R_SH_DIR8WPL 5 +#define R_SH_DIR8WPZ 6 +#define R_SH_DIR8BP 7 +#define R_SH_DIR8W 8 +#define R_SH_DIR8L 9 +#define R_SH_SWITCH16 25 +#define R_SH_SWITCH32 26 +#define R_SH_USES 27 +#define R_SH_COUNT 28 +#define R_SH_ALIGN 29 +#define R_SH_CODE 30 +#define R_SH_DATA 31 +#define R_SH_LABEL 32 +#define R_SH_SWITCH8 33 +#define R_SH_GNU_VTINHERIT 34 +#define R_SH_GNU_VTENTRY 35 +#define R_SH_GOT32 160 +#define R_SH_PLT32 161 +#define R_SH_COPY 162 +#define R_SH_GLOB_DAT 163 +#define R_SH_JMP_SLOT 164 +#define R_SH_RELATIVE 165 +#define R_SH_GOTOFF 166 +#define R_SH_GOTPC 167 +/* Keep this the last entry. */ +#define R_SH_NUM 256 + __END_DECLS #endif /* elf.h */ diff -u -r -N glibc-2.1.3-original/linuxthreads/sysdeps/sh/pt-machine.h glibc-2.1.3/linuxthreads/sysdeps/sh/pt-machine.h --- glibc-2.1.3-original/linuxthreads/sysdeps/sh/pt-machine.h Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/linuxthreads/sysdeps/sh/pt-machine.h Sun Mar 12 07:54:45 2000 @@ -0,0 +1,46 @@ +/* Machine-dependent pthreads configuration and inline functions. + SuperH version. + Copyright (C) 1999, 2000 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Niibe Yutaka <gniibe@m17n.org>. + + 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 PT_EI +# define PT_EI extern inline +#endif + +/* Spinlock implementation; required. */ +PT_EI int +testandset (int *spinlock) +{ + int ret; + + __asm__ __volatile__( + "tas.b %1\n\t" + "movt %0" + : "=z" (ret), "=m" (*spinlock) + : /* "1" (*spinlock) */ + : "memory", "cc"); + + return ret; +} + + +/* Get some notion of the current stack. Need not be exactly the top + of the stack, just something somewhere in the current frame. */ +#define CURRENT_STACK_FRAME stack_pointer +register char * stack_pointer __asm__ ("r15"); diff -u -r -N glibc-2.1.3-original/scripts/config.sub glibc-2.1.3/scripts/config.sub --- glibc-2.1.3-original/scripts/config.sub Tue Oct 26 05:23:27 1999 +++ glibc-2.1.3/scripts/config.sub Thu May 25 17:06:42 2000 @@ -171,7 +171,7 @@ | 580 | i960 | h8300 \ | hppa | hppa1.0 | hppa1.1 | hppa2.0 | hppa2.0w | hppa2.0n \ | alpha | alphaev[4-7] | alphaev56 | alphapca5[67] \ - | we32k | ns16k | clipper | i370 | sh | powerpc | powerpcle \ + | we32k | ns16k | clipper | i370 | sh | sh[34] | powerpc | powerpcle \ | 1750a | dsp16xx | pdp11 | mips16 | mips64 | mipsel | mips64el \ | mips64orion | mips64orionel | mipstx39 | mipstx39el \ | mips64vr4300 | mips64vr4300el | mips64vr4100 | mips64vr4100el \ @@ -837,6 +837,9 @@ ;; we32k) basic_machine=we32k-att + ;; + sh3 | sh4 | sh3-unknown | sh4-unknown) + base_machine=sh ;; sparc | sparcv9) basic_machine=sparc-sun diff -u -r -N glibc-2.1.3-original/sysdeps/generic/bits/libc-lock.h glibc-2.1.3/sysdeps/generic/bits/libc-lock.h --- glibc-2.1.3-original/sysdeps/generic/bits/libc-lock.h Mon Oct 13 12:53:17 1997 +++ glibc-2.1.3/sysdeps/generic/bits/libc-lock.h Sun Mar 12 18:21:12 2000 @@ -90,7 +90,9 @@ /* End critical region with cleanup. */ #define __libc_cleanup_region_end(DOIT) - +/* Sometimes we have to exit the block in the middle. */ +#define __libc_cleanup_end(DOIT) + /* We need portable names for some of the functions. */ #define __libc_mutex_unlock diff -u -r -N glibc-2.1.3-original/sysdeps/sh/Dist glibc-2.1.3/sysdeps/sh/Dist --- glibc-2.1.3-original/sysdeps/sh/Dist Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/Dist Sun Mar 12 04:09:09 2000 @@ -0,0 +1 @@ +ieee754.h diff -u -r -N glibc-2.1.3-original/sysdeps/sh/Implies glibc-2.1.3/sysdeps/sh/Implies --- glibc-2.1.3-original/sysdeps/sh/Implies Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/Implies Sun Mar 12 04:15:28 2000 @@ -0,0 +1,2 @@ +wordsize-32 +ieee754 diff -u -r -N glibc-2.1.3-original/sysdeps/sh/bits/string.h glibc-2.1.3/sysdeps/sh/bits/string.h --- glibc-2.1.3-original/sysdeps/sh/bits/string.h Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/bits/string.h Sun Mar 12 04:09:09 2000 @@ -0,0 +1,22 @@ +/* SH specific definitions for string functions. + Copyright (C) 2000 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 _HAVE_STRING_ARCH_strcpy 1 +#define _HAVE_STRING_ARCH_stpcpy 1 +#define _HAVE_STRING_ARCH_mempcpy 1 diff -u -r -N glibc-2.1.3-original/sysdeps/sh/gmp-mparam.h glibc-2.1.3/sysdeps/sh/gmp-mparam.h --- glibc-2.1.3-original/sysdeps/sh/gmp-mparam.h Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/gmp-mparam.h Sun Mar 12 04:09:09 2000 @@ -0,0 +1,30 @@ +/* gmp-mparam.h -- Compiler/machine parameter header file. + +Copyright (C) 1991, 1993, 1994, 1995, 2000 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. */ + +#define BITS_PER_MP_LIMB 32 +#define BYTES_PER_MP_LIMB 4 +#define BITS_PER_LONGINT 32 +#define BITS_PER_INT 32 +#define BITS_PER_SHORTINT 16 +#define BITS_PER_CHAR 8 + +#define IEEE_DOUBLE_BIG_ENDIAN 0 +#define IEEE_DOUBLE_MIXED_ENDIAN 1 diff -u -r -N glibc-2.1.3-original/sysdeps/sh/machine-gmon.h glibc-2.1.3/sysdeps/sh/machine-gmon.h --- glibc-2.1.3-original/sysdeps/sh/machine-gmon.h Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/machine-gmon.h Sun Mar 12 04:09:09 2000 @@ -0,0 +1,34 @@ +/* Machine-dependent definitions for profiling support. SH version. + Copyright (C) 1996, 1997, 1998, 2000 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. */ + +/* NOTYET */ + +/* We must not pollute the global namespace. */ +#define mcount_internal __mcount_internal + +void mcount_internal (u_long frompc, u_long selfpc); + +#define _MCOUNT_DECL(frompc, selfpc) \ +void mcount_internal (u_long frompc, u_long selfpc) + + +/* Define MCOUNT as empty since we have the implementation in another + file. */ +#define MCOUNT + diff -u -r -N glibc-2.1.3-original/sysdeps/sh/memcpy.S glibc-2.1.3/sysdeps/sh/memcpy.S --- glibc-2.1.3-original/sysdeps/sh/memcpy.S Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/memcpy.S Sun Mar 12 04:09:09 2000 @@ -0,0 +1,231 @@ +/* Copyright (C) 1999, 2000 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 <sysdep.h> +#include <endian.h> + +/* + * void *memcpy(void *dst, const void *src, size_t n); + * No overlap between the memory of DST and of SRC are assumed. + */ + +ENTRY(memcpy) + tst r6,r6 + bt/s 1f + mov r4,r0 + mov #12,r1 + cmp/gt r6,r1 + bf 2f +0: + mov.b @r5+,r1 + dt r6 + mov.b r1,@r4 + bf/s 0b + add #1,r4 +1: + rts + nop +2: + mov.l r8,@-r15 + mov.l r9,@-r15 + mov r6,r2 + mov.l r10,@-r15 + mov.l r11,@-r15 + mov.l r14,@-r15 + mov r4,r11 + mov r15,r14 + mov r5,r0 + and #1,r0 + tst r0,r0 + bt/s .L42 + mov r5,r0 + mov.b @r5+,r1 + add #-1,r2 + add #1,r4 + mov.b r1,@r11 + mov r5,r0 +.L42: + and #2,r0 + tst r0,r0 + bt/s .L43 + mov r4,r0 + mov.b @r5+,r1 + mov.b r1,@r4 + mov.b @r5+,r1 + add #1,r4 + add #-2,r2 + mov.b r1,@r4 + add #1,r4 + mov r4,r0 +.L43: + and #1,r0 + tst r0,r0 + bf/s .L38 + mov r4,r0 + and #2,r0 + tst r0,r0 + bf/s .L7 + mov r2,r0 + shlr2 r0 + and #3,r0 + cmp/eq #2,r0 + bt/s .L10 + mov #2,r1 + cmp/gt r1,r0 + bt/s .L14 + cmp/eq #3,r0 + cmp/eq #1,r0 + bt/s .L11 + mov r0,r1 + bra .L44 + shll2 r1 + .align 5 +.L14: + bf .L8 + mov.l @(8,r5),r1 + mov.l r1,@(8,r4) +.L10: + mov.l @(4,r5),r1 + mov.l r1,@(4,r4) +.L11: + mov.l @r5,r1 + mov.l r1,@r4 +.L8: + mov r0,r1 + shll2 r1 +.L44: + add r1,r4 + add r1,r5 + mov r2,r0 + mov #-4,r1 + shad r1,r0 + mov #3,r6 + bra .L37 + and r2,r6 + .align 5 +.L18: + mov.l @r5+,r1 + mov.l @r5+,r2 + mov.l @r5+,r3 + mov.l @r5+,r7 + mov.l r1,@r4 + mov.l r2,@(4,r4) + mov.l r3,@(8,r4) + mov.l r7,@(12,r4) + add #16,r4 +.L37: + cmp/pl r0 + bt/s .L18 + add #-1,r0 + mov r6,r2 +.L38: + bra .L40 + mov r2,r0 + .align 5 +.L7: + shar r0 + and #3,r0 + cmp/eq #2,r0 + bt/s .L23 + mov #2,r1 + cmp/gt r1,r0 + bt/s .L27 + cmp/eq #3,r0 + cmp/eq #1,r0 + bt/s .L24 + mov r0,r1 + bra .L45 + add r0,r1 + .align 5 +.L27: + bf .L21 + add #4,r5 + mov.w @r5,r1 + add #4,r4 + mov.w r1,@r4 + add #-4,r5 + add #-4,r4 +.L23: + add #2,r5 + mov.w @r5,r1 + add #2,r4 + mov.w r1,@r4 + add #-2,r5 + add #-2,r4 +.L24: + mov.w @r5,r1 + mov.w r1,@r4 +.L21: + mov r0,r1 + add r0,r1 +.L45: + add r1,r4 + add r1,r5 + mov r2,r0 + mov #-3,r1 + shad r1,r0 + mov #1,r10 + mov r0,r1 + and r2,r10 + cmp/pl r1 + bf/s .L29 + add #-1,r0 + mov r4,r9 + mov r4,r8 + add #4,r9 + mov r4,r6 + add #6,r8 + add #2,r6 +.L31: + mov.w @r5+,r1 + mov.w @r5+,r2 + mov.w @r5+,r3 + mov.w @r5+,r7 + mov.w r1,@r4 + mov.w r2,@r6 + add #8,r4 + mov r0,r1 + add #8,r6 + mov.w r3,@r9 + add #-1,r0 + add #8,r9 + mov.w r7,@r8 + cmp/pl r1 + bt/s .L31 + add #8,r8 +.L29: + mov r10,r2 + mov r2,r0 +.L40: + cmp/pl r0 + bf .L34 +.L35: + mov.b @r5+,r1 + dt r2 + mov.b r1,@r4 + bf/s .L35 + add #1,r4 +.L34: + mov r11,r0 + mov r14,r15 + mov.l @r15+,r14 + mov.l @r15+,r11 + mov.l @r15+,r10 + mov.l @r15+,r9 + rts + mov.l @r15+,r8 diff -u -r -N glibc-2.1.3-original/sysdeps/sh/memprof.h glibc-2.1.3/sysdeps/sh/memprof.h --- glibc-2.1.3-original/sysdeps/sh/memprof.h Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/memprof.h Sun Mar 12 04:09:09 2000 @@ -0,0 +1,21 @@ +/* Copyright (C) 2000 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 GETSP() ({ register uintptr_t stack_ptr asm ("%r15"); stack_ptr; }) + +#include <sysdeps/generic/memprof.h> diff -u -r -N glibc-2.1.3-original/sysdeps/sh/memset.S glibc-2.1.3/sysdeps/sh/memset.S --- glibc-2.1.3-original/sysdeps/sh/memset.S Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/memset.S Sun Mar 12 04:09:09 2000 @@ -0,0 +1,79 @@ +/* Copyright (C) 1999, 2000 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Kazumoto Kojima <kkojima@rr.iij4u.or.jp> + + 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 <sysdep.h> + +/* void *memset (t, c, len) */ + +ENTRY(memset) + tst r6, r6 + bt/s end + mov r4, r3 + mov #3, r0 + cmp/hs r6, r0 + bt/s 2f + and r4, r0 + tst r0, r0 + bt/s 1f + add r0, r6 + add #-1, r0 + shll2 r0 + braf r0 + add #-4, r6 + + mov.b r5, @r4 + add #1, r4 + mov.b r5, @r4 + add #1, r4 + mov.b r5, @r4 + add #1, r4 +1: + extu.b r5, r0 + shll8 r5 + or r5, r0 + extu.w r0, r0 + mov r0, r5 + swap.w r5, r5 + or r0, r5 + +2: + add #-4, r6 + cmp/pz r6 + bf afew + mov.l r5, @r4 + bra 2b + add #4, r4 + +afew: + mov #-1, r0 + sub r6, r0 + shll2 r0 + braf r0 + nop + + mov.b r5, @r4 + add #1, r4 + mov.b r5, @r4 + add #1, r4 + mov.b r5, @r4 + add #1, r4 +end: + rts + mov r3, r0 +END(memset) diff -u -r -N glibc-2.1.3-original/sysdeps/sh/sh3/__longjmp.S glibc-2.1.3/sysdeps/sh/sh3/__longjmp.S --- glibc-2.1.3-original/sysdeps/sh/sh3/__longjmp.S Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/sh3/__longjmp.S Sun Mar 12 04:09:09 2000 @@ -0,0 +1,44 @@ +/* longjmp for SH. + Copyright (C) 1999, 2000 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 <sysdep.h> +#define _SETJMP_H +#define _ASM +#include <bits/setjmp.h> + +/* __longjmp(jmpbuf, val) */ + +ENTRY (__longjmp) + mov.l @r4+, r8 + mov.l @r4+, r9 + mov.l @r4+, r10 + mov.l @r4+, r11 + mov.l @r4+, r12 + mov.l @r4+, r13 + mov.l @r4+, r14 + mov.l @r4+, r15 + mov r5, r0 /* get the return value in place */ + tst r0, r0 + bf.s 1f + lds.l @r4+, pr + mov #1,r0 /* can't let setjmp() return zero! */ +1: + rts + ldc.l @r4+, gbr +END (__longjmp) diff -u -r -N glibc-2.1.3-original/sysdeps/sh/sh3/bits/endian.h glibc-2.1.3/sysdeps/sh/sh3/bits/endian.h --- glibc-2.1.3-original/sysdeps/sh/sh3/bits/endian.h Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/sh3/bits/endian.h Sun Mar 12 04:09:09 2000 @@ -0,0 +1,13 @@ +/* SH is bi-endian but with a big-endian FPU. */ + +#ifndef _ENDIAN_H +# error "Never use <bits/endian.h> directly; include <endian.h> instead." +#endif + +#ifdef __LITTLE_ENDIAN__ +#define __BYTE_ORDER __LITTLE_ENDIAN +#define __FLOAT_WORD_ORDER __LITTLE_ENDIAN +#else +#define __BYTE_ORDER __BIG_ENDIAN +#define __FLOAT_WORD_ORDER __BIG_ENDIAN +#endif diff -u -r -N glibc-2.1.3-original/sysdeps/sh/sh3/bits/huge_val.h glibc-2.1.3/sysdeps/sh/sh3/bits/huge_val.h --- glibc-2.1.3-original/sysdeps/sh/sh3/bits/huge_val.h Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/sh3/bits/huge_val.h Sun Mar 12 04:09:09 2000 @@ -0,0 +1,88 @@ +/* `HUGE_VAL' constants for IEEE 754 machines (where it is infinity). + Used by <stdlib.h> and <math.h> functions for overflow. + SH version. + Copyright (C) 1992, 95, 96, 97, 98, 99, 2000 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 _MATH_H +# error "Never use <bits/huge_val.h> directly; include <math.h> instead." +#endif + +#include <features.h> + +/* IEEE positive infinity (-HUGE_VAL is negative infinity). */ + +#ifdef __GNUC__ + +# define HUGE_VAL \ + (__extension__ \ + ((union { unsigned __l __attribute__((__mode__(__DI__))); double __d; }) \ + { __l: 0x000000007ff00000ULL }).__d) + +#else /* not GCC */ + +# include <endian.h> + +typedef union { unsigned char __c[8]; double __d; } __huge_val_t; + +# if __BYTE_ORDER == __BIG_ENDIAN +# define __HUGE_VAL_bytes { 0, 0, 0, 0, 0x7f, 0xf0, 0, 0 } +# endif +# if __BYTE_ORDER == __LITTLE_ENDIAN +# define __HUGE_VAL_bytes { 0, 0, 0xf0, 0x7f, 0, 0, 0, 0 } +# endif + +static __huge_val_t __huge_val = { __HUGE_VAL_bytes }; +# define HUGE_VAL (__huge_val.__d) + +#endif /* GCC. */ + + +/* ISO C 9X extensions: (float) HUGE_VALF and (long double) HUGE_VALL. */ + +#ifdef __USE_ISOC9X + +# ifdef __GNUC__ + +# define HUGE_VALF \ + (__extension__ \ + ((union { unsigned __l __attribute__((__mode__(__SI__))); float __d; }) \ + { __l: 0x7f800000UL }).__d) + +# else /* not GCC */ + +typedef union { unsigned char __c[4]; float __f; } __huge_valf_t; + +# if __BYTE_ORDER == __BIG_ENDIAN +# define __HUGE_VALF_bytes { 0x7f, 0x80, 0, 0 } +# endif +# if __BYTE_ORDER == __LITTLE_ENDIAN +# define __HUGE_VALF_bytes { 0, 0, 0x80, 0x7f } +# endif + +static __huge_valf_t __huge_valf = { __HUGE_VALF_bytes }; +# define HUGE_VALF (__huge_valf.__f) + +# endif /* GCC. */ + + +/* Generally there is no separate `long double' format and it is the + same as `double'. */ +# define HUGE_VALL HUGE_VAL + +#endif /* __USE_ISOC9X. */ diff -u -r -N glibc-2.1.3-original/sysdeps/sh/sh3/bits/setjmp.h glibc-2.1.3/sysdeps/sh/sh3/bits/setjmp.h --- glibc-2.1.3-original/sysdeps/sh/sh3/bits/setjmp.h Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/sh3/bits/setjmp.h Sun Mar 12 04:09:09 2000 @@ -0,0 +1,45 @@ +/* Copyright (C) 1999, 2000 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 the machine-dependent type `jmp_buf'. SH version. */ + +#ifndef _SETJMP_H +# error "Never include <bits/setjmp.h> directly; use <setjmp.h> instead." +#endif + +#ifndef _ASM +typedef struct + { + /* Callee-saved registers r8 through r15. */ + int __regs[8]; + + /* Program counter. */ + __ptr_t __pc; + + /* The global pointer. */ + __ptr_t __gbr; + + } __jmp_buf[1]; +#endif + +#define JB_SIZE (4 * 10) + +/* Test if longjmp to JMPBUF would unwind the frame + containing a local variable at ADDRESS. */ +#define _JMPBUF_UNWINDS(jmpbuf, address) \ + ((__ptr_t) (address) < &(jmpbuf)[0].__regs[7]) diff -u -r -N glibc-2.1.3-original/sysdeps/sh/sh3/bsd-_setjmp.S glibc-2.1.3/sysdeps/sh/sh3/bsd-_setjmp.S --- glibc-2.1.3-original/sysdeps/sh/sh3/bsd-_setjmp.S Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/sh3/bsd-_setjmp.S Sun Mar 12 04:09:09 2000 @@ -0,0 +1,51 @@ +/* BSD `_setjmp' entry point to `sigsetjmp (..., 0)'. SH version. + Copyright (C) 1999, 2000 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. */ + +/* This just does a tail-call to `__sigsetjmp (ARG, 0)'. + We cannot do it in C because it must be a tail-call, so frame-unwinding + in setjmp doesn't clobber the state restored by longjmp. */ + +#include <sysdep.h> + +ENTRY (_setjmp) +#ifdef PIC + mova 1f, r0 + mov.l 1f, r1 + bra 2f + add r1, r0 + .align 2 +1: + .long _GLOBAL_OFFSET_TABLE_ +2: + mov.l 3f, r1 + mov.l @(r0,r1), r1 + jmp @r1 + mov #0, r0 + .align 2 +3: + .long C_SYMBOL_NAME(__sigsetjmp@GOT) +#else + mov.l 1f, r1 + jmp @r1 + mov #0, r0 + .align 2 +1: + .long C_SYMBOL_NAME(__sigsetjmp) +#endif +END (_setjmp) diff -u -r -N glibc-2.1.3-original/sysdeps/sh/sh3/bsd-setjmp.S glibc-2.1.3/sysdeps/sh/sh3/bsd-setjmp.S --- glibc-2.1.3-original/sysdeps/sh/sh3/bsd-setjmp.S Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/sh3/bsd-setjmp.S Sun Mar 12 04:09:09 2000 @@ -0,0 +1,51 @@ +/* BSD `setjmp' entry point to `sigsetjmp (..., 1)'. SH version. + Copyright (C) 1999, 2000 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. */ + +/* This just does a tail-call to `__sigsetjmp (ARG, 1)'. + We cannot do it in C because it must be a tail-call, so frame-unwinding + in setjmp doesn't clobber the state restored by longjmp. */ + +#include <sysdep.h> + +ENTRY (setjmp) +#ifdef PIC + mova 1f, r0 + mov.l 1f, r1 + bra 2f + add r1, r0 + .align 2 +1: + .long _GLOBAL_OFFSET_TABLE_ +2: + mov.l 3f, r1 + mov.l @(r0,r1), r1 + jmp @r1 + mov #1, r0 + .align 2 +3: + .long C_SYMBOL_NAME(__sigsetjmp@GOT) +#else + mov.l 1f, r1 + jmp @r1 + mov #1, r0 + .align 2 +1: + .long C_SYMBOL_NAME(__sigsetjmp) +#endif +END (setjmp) diff -u -r -N glibc-2.1.3-original/sysdeps/sh/sh3/dl-machine.h glibc-2.1.3/sysdeps/sh/sh3/dl-machine.h --- glibc-2.1.3-original/sysdeps/sh/sh3/dl-machine.h Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/sh3/dl-machine.h Sun Mar 12 16:02:39 2000 @@ -0,0 +1,523 @@ +/* Machine-dependent ELF dynamic relocation inline functions. SH-3 version. + Copyright (C) 1999, 2000 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 dl_machine_h +#define dl_machine_h + +/* Only dummy. This doesn't work. */ + +#define ELF_MACHINE_NAME "SH" + +#include <sys/param.h> + +#include <assert.h> + +/* Return nonzero iff E_MACHINE is compatible with the running host. */ +static inline int __attribute__ ((unused)) +elf_machine_matches_host (Elf32_Half e_machine) +{ + switch (e_machine) + { + case EM_SH: + return 1; + default: + return 0; + } +} + + +/* 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 Elf32_Addr __attribute__ ((unused)) +elf_machine_dynamic (void) +{ + register Elf32_Addr *got; + asm ("mov r12,%0" :"=r" (got)); + return *got; +} + + +/* Return the run-time load address of the shared object. */ +static inline Elf32_Addr __attribute__ ((unused)) +elf_machine_load_address (void) +{ + Elf32_Addr addr; + asm ("mov.l .L1,r0 + mov.l .L3,r2 + add r12,r2 + mov.l @(r0,r12),r0 + bra .L2 + sub r0,r2 + .align 2 + .L1: .long _dl_start@GOT + .L3: .long _dl_start@GOTOFF + .L2: mov r2,%0" + : "=r" (addr) : : "r0", "r1", "r2"); + return addr; +} + + +/* 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 __attribute__ ((unused)) +elf_machine_runtime_setup (struct link_map *l, int lazy, int profile) +{ + Elf32_Addr *got; + extern void _dl_runtime_resolve (Elf32_Word); + extern void _dl_runtime_profile (Elf32_Word); + + if (l->l_info[DT_JMPREL] && lazy) + { + /* The GOT entries for functions in the PLT have not yet been filled + in. Their initial contents will arrange when called to load an + offset into the .rela.plt section and _GLOBAL_OFFSET_TABLE_[1], + and then jump to _GLOBAL_OFFSET_TABLE[2]. */ + got = (Elf32_Addr *) l->l_info[DT_PLTGOT]->d_un.d_ptr; + got[1] = (Elf32_Addr) l; /* Identify this shared object. */ + + /* The got[2] entry contains the address of a function which gets + called to get the address of a so far unresolved function and + jump to it. The profiling extension of the dynamic linker allows + to intercept the calls to collect information. In this case we + don't store the address in the GOT so that all future calls also + end in this function. */ + if (profile) + { + got[2] = (Elf32_Addr) &_dl_runtime_profile; + /* Say that we really want profiling and the timers are started. */ + _dl_profile_map = l; + } + else + /* 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] = (Elf32_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_FIXUP_ARGS int plt_type + +#ifdef PIC +#define FUN_ADDR "\ + mov.l 1f,r2 + mova 1f,r0 + bra 2f + add r0,r2 ! Get GOT address in r2 +0: .align 2 +1: .long _GLOBAL_OFFSET_TABLE_ +2: mov.l 3f,r0 + add r2,r0" +#define GOTJMP(x) #x "@GOTOFF" +#else +#define FUN_ADDR "\ + mov.l 3f,r0" +#define GOTJMP(x) #x +#endif + +#if defined (KERNEL_MATH_EMULATION) +#define FGR_SAVE "\ + sts.l fpscr, @-r15 + mov #8,r3 + swap.w r3, r3 + lds r3, fpscr + fmov.s fr11, @-r15 + fmov.s fr10, @-r15 + fmov.s fr9, @-r15 + fmov.s fr8, @-r15 + fmov.s fr7, @-r15 + fmov.s fr6, @-r15 + fmov.s fr5, @-r15 + fmov.s fr4, @-r15" +#define FGR_LOAD "\ + fmov.s @r15+, fr4 + fmov.s @r15+, fr5 + fmov.s @r15+, fr6 + fmov.s @r15+, fr7 + fmov.s @r15+, fr8 + fmov.s @r15+, fr9 + fmov.s @r15+, fr10 + fmov.s @r15+, fr11 + lds.l @r15+, fpscr" +#else +#define FGR_SAVE "" +#define FGR_LOAD "" +#endif + +#ifndef PROF +# define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\ + .text + .globl _dl_runtime_resolve + .type _dl_runtime_resolve, @function + .align 5 +_dl_runtime_resolve: + mov.l r3,@-r15 + mov.l r4,@-r15 + mov.l r5,@-r15 + mov.l r6,@-r15 + mov.l r7,@-r15 + mov.l r12,@-r15 + movt r3 ! Save T flag. + mov.l r3,@-r15 + " FGR_SAVE " + sts.l pr,@-r15 + mov r0,r4 ! PLT type + mov r2,r5 ! link map address + " FUN_ADDR " + jsr @r0 ! Call resolver. + mov r1,r6 ! reloc offset + lds.l @r15+,pr ! Get register content back. + " FGR_LOAD " + mov.l @r15+,r3 + shal r3 ! Lode T flag. + mov.l @r15+,r12 + mov.l @r15+,r7 + mov.l @r15+,r6 + mov.l @r15+,r5 + mov.l @r15+,r4 + jmp @r0 ! Jump to function address. + mov.l @r15+,r3 + .align 2 +3: + .long " GOTJMP (fixup) " + .size _dl_runtime_resolve, .-_dl_runtime_resolve + + .globl _dl_runtime_profile + .type _dl_runtime_profile, @function + .align 5 +_dl_runtime_profile: + mov.l r3,@-r15 + mov.l r4,@-r15 + mov.l r5,@-r15 + mov.l r6,@-r15 + mov.l r7,@-r15 + mov.l r12,@-r15 + movt r3 ! Save T flag. + mov.l r3,@-r15 + " FGR_SAVE " + sts.l pr,@-r15 + mov r0,r4 ! PLT type + mov r2,r5 ! link map address + sts pr,r7 ! return address + " FUN_ADDR " + jsr @r0 ! Call resolver. + mov r1,r6 ! reloc offset + lds.l @r15+,pr ! Get register content back. + " FGR_LOAD " + mov.l @r15+,r3 + shal r3 ! Lode T flag. + mov.l @r15+,r12 + mov.l @r15+,r7 + mov.l @r15+,r6 + mov.l @r15+,r5 + mov.l @r15+,r4 + jmp @r0 ! Jump to function address. + mov.l @r15+,r3 + .align 2 +3: + .long " GOTJMP (profile_fixup) " + .size _dl_runtime_profile, .-_dl_runtime_profile + .previous +"); +#else +# define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\ + .text + .globl _dl_runtime_resolve + .globl _dl_runtime_profile + .type _dl_runtime_resolve, @function + .type _dl_runtime_profile, @function + .align 5 +_dl_runtime_resolve: +_dl_runtime_profile: + mov.l r3,@-r15 + mov.l r4,@-r15 + mov.l r5,@-r15 + mov.l r6,@-r15 + mov.l r7,@-r15 + mov.l r12,@-r15 + movt r3 ! Save T flag. + mov.l r3,@-r15 + " FGR_SAVE " + sts.l pr,@-r15 + mov r0,r4 ! PLT type + mov r2,r5 ! link map address + sts pr,r7 ! return address + " FUN_ADDR " + jsr @r0 ! Call resolver. + mov r1,r6 ! reloc offset + lds.l @r15+,pr ! Get register content back. + " FGR_LOAD " + mov.l @r15+,r3 + shal r3 ! Lode T flag. + mov.l @r15+,r12 + mov.l @r15+,r7 + mov.l @r15+,r6 + mov.l @r15+,r5 + mov.l @r15+,r4 + jmp @r0 ! Jump to function address. + mov.l @r15+,r3 + .align 2 +3: + .long " GOTJMP (fixup) " + .size _dl_runtime_resolve, .-_dl_runtime_resolve + .size _dl_runtime_profile, .-_dl_runtime_profile + .previous +"); +#endif + +/* Mask identifying addresses reserved for the user program, + where the dynamic linker should not map anything. */ +#define ELF_MACHINE_USER_ADDRESS_MASK 0x80000000UL + +/* 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 RTLD_START asm ("\ +.text\n\ +.globl _start\n\ +.globl _dl_start_user\n\ +_start:\n\ + mov r15,r4\n\ + mov.l .L_dl_start,r1\n\ + mova .L_dl_start,r0\n\ + add r1,r0\n\ + jsr @r0\n\ + nop\n\ +_dl_start_user:\n\ + ! Save the user entry point address in r8.\n\ + mov r0,r8\n\ + ! Point r12 at the GOT.\n\ + mov.l 1f,r12\n\ + mova 1f,r0\n\ + bra 2f\n\ + add r0,r12\n\ + .align 2\n\ +1: .long _GLOBAL_OFFSET_TABLE_\n\ +2: ! Store the highest stack address\n\ + mov.l .L_stack_end,r0\n\ + mov.l @(r0,r12),r0\n\ + mov.l r15,@r0\n\ + ! See if we were run as a command with the executable file\n\ + ! name as an extra leading argument.\n\ + mov.l .L_dl_skip_args,r0\n\ + mov.l @(r0,r12),r0\n\ + mov.l @r0,r0\n\ + ! Get the original argument count.\n\ + mov.l @r15,r2\n\ + ! Subtract _dl_skip_args from it.\n\ + sub r0,r2\n\ + ! Adjust the stack pointer to skip _dl_skip_args words.\n\ + shll2 r0\n\ + add r0,r15\n\ + ! Store back the modified argument count.\n\ + mov.l r2,@r15\n\ + ! Push the searchlist of the main object as argument in\n\ + ! _dl_init_next call below.\n\ + mov.l .L_dl_main_searchlist,r0\n\ + mov.l @(r0,r12),r0\n\ + mov.l @r0,r9\n\ +0: mov r9,r4\n\ + ! Call _dl_init_next to return the address of an initializer\n\ + ! function to run.\n\ + mov.l .L_dl_init_next,r1\n\ + mova .L_dl_init_next,r0\n\ + add r1,r0\n\ + jsr @r0\n\ + nop\n\ + ! Check for zero return, when out of initializers.\n\ + tst r0,r0\n\ + bt 1f\n\ + ! Call the shared object initializer function.\n\ + jsr @r0\n\ + nop\n\ + ! Loop to call _dl_init_next for the next initializer.\n\ + bra 0b\n\ + nop\n\ +1: ! Clear the startup flag.\n\ + mov.l .L_dl_starting_up,r0\n\ + mov.l @(r0,r12),r0\n\ + mov #0,r2\n\ + mov.l r2,@r0\n\ + ! Pass our finalizer function to the user in r4, as per ELF ABI.\n\ + mov.l .L_dl_fini,r0\n\ + mov.l @(r0,r12),r4\n\ + ! Jump to the user's entry point.\n\ + jmp @r8\n\ + nop\n\ + .align 2\n\ +.L_dl_start:\n\ + .long _dl_start@PLT\n\ +.L_stack_end:\n\ + .long __libc_stack_end@GOT\n\ +.L_dl_skip_args:\n\ + .long _dl_skip_args@GOT\n\ +.L_dl_main_searchlist:\n\ + .long _dl_main_searchlist@GOT\n\ +.L_dl_init_next:\n\ + .long _dl_init_next@PLT\n\ +.L_dl_starting_up:\n\ + .long _dl_starting_up@GOT\n\ +.L_dl_fini:\n\ + .long _dl_fini@GOT\n\ +.previous\n\ +"); + +/* 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_SH_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_SH_JMP_SLOT) + +/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */ +#define ELF_MACHINE_JMP_SLOT R_SH_JMP_SLOT + +/* We define an initialization functions. This is called very early in + _dl_sysdep_start. */ +#define DL_PLATFORM_INIT dl_platform_init () + +extern const char *_dl_platform; + +static inline void __attribute__ ((unused)) +dl_platform_init (void) +{ + if (_dl_platform != NULL && *_dl_platform == '\0') + /* Avoid an empty string which would disturb us. */ + _dl_platform = NULL; +} + +static inline void +elf_machine_fixup_plt (struct link_map *map, const Elf32_Rela *reloc, + Elf32_Addr *reloc_addr, Elf32_Addr value) +{ + *reloc_addr = value; +} + +/* Return the final value of a plt relocation. */ +static inline Elf32_Addr +elf_machine_plt_value (struct link_map *map, const Elf32_Rela *reloc, + Elf32_Addr value) +{ + return value + reloc->r_addend; +} + +#endif /* !dl_machine_h */ + +#ifdef RESOLVE + +/* SH never uses Elf32_Rel relocations. */ +#define ELF_MACHINE_NO_REL 1 + +extern char **_dl_argv; + +/* 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 Elf32_Rela *reloc, + const Elf32_Sym *sym, const struct r_found_version *version, + Elf32_Addr *const reloc_addr) +{ + if (ELF32_R_TYPE (reloc->r_info) == R_SH_RELATIVE) + { +#ifndef RTLD_BOOTSTRAP + if (map != &_dl_rtld_map) /* Already done in rtld itself. */ +#endif + *reloc_addr = map->l_addr + reloc->r_addend; + } + else if (ELF32_R_TYPE (reloc->r_info) != R_SH_NONE) + { + const Elf32_Sym *const refsym = sym; + Elf32_Addr value = RESOLVE (&sym, version, ELF32_R_TYPE (reloc->r_info)); + if (sym) + value += sym->st_value; + value += reloc->r_addend; + + switch (ELF32_R_TYPE (reloc->r_info)) + { + case R_SH_COPY: + if (sym == NULL) + /* This can happen in trace mode if an object could not be + found. */ + break; + if (sym->st_size > refsym->st_size + || (sym->st_size < refsym->st_size && _dl_verbose)) + { + const char *strtab; + + strtab = (const char *) map->l_info[DT_STRTAB]->d_un.d_ptr; + _dl_sysdep_error (_dl_argv[0] ?: "<program name unknown>", + ": 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_SH_GLOB_DAT: + case R_SH_JMP_SLOT: + *reloc_addr = value; + break; + case R_SH_DIR32: + { +#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); + if (map == &_dl_rtld_map) + /* Undo the relocation done here during bootstrapping. + Now we will relocate it anew, possibly using a + binding found in the user program or a loaded library + rather than the dynamic linker's built-in definitions + used while loading those libraries. */ + value -= map->l_addr + refsym->st_value + reloc->r_addend; +#endif + *reloc_addr = value; + break; + } + case R_SH_REL32: + *reloc_addr = (value - (Elf32_Addr) reloc_addr); + break; + default: + assert (! "unexpected dynamic reloc type"); + break; + } + } +} + +static inline void +elf_machine_lazy_rel (Elf32_Addr l_addr, const Elf32_Rela *reloc) +{ + Elf32_Addr *const reloc_addr = (void *) (l_addr + reloc->r_offset); + /* Check for unexpected PLT reloc type. */ + assert (ELF32_R_TYPE (reloc->r_info) == R_SH_JMP_SLOT); + *reloc_addr += l_addr; /* + reloc->r_addend; */ +} + +#endif /* RESOLVE */ diff -u -r -N glibc-2.1.3-original/sysdeps/sh/sh3/elf/crti.S glibc-2.1.3/sysdeps/sh/sh3/elf/crti.S --- glibc-2.1.3-original/sysdeps/sh/sh3/elf/crti.S Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/sh3/elf/crti.S Sun Mar 12 04:09:09 2000 @@ -0,0 +1,94 @@ + .file "initfini.c" +gcc2_compiled.: + +#include "defs.h" +#define PIC + +/*@HEADER_ENDS*/ +/*@_init_PROLOG_BEGINS*/ + .section .init + .align 5 + .global _init + .type _init,@function +_init: + mov.l r12,@-r15 + mov.l r14,@-r15 + sts.l pr,@-r15 +#ifdef PIC + mova .L22,r0 + mov.l .L22,r12 + add r0,r12 + mova .L23,r0 + mov.l .L23,r1 + add r0,r1 +#else + mov.l .L23,r1 +#endif + jsr @r1 + mov r15,r14 +#ifdef KERNEL_MATH_EMULATION +#ifdef PIC + mova .L24,r0 + mov.l .L24,r1 + add r0,r1 +#else + mov.l .L24,r1 +#endif + mov #8,r4 + jsr @r1 + swap.w r4,r4 +#endif + bra 1f + nop + .align 2 +#ifdef PIC +.L22: + .long _GLOBAL_OFFSET_TABLE_ +.L23: + .long __gmon_start__@PLT +#else +.L23: + .long __gmon_start__ +#endif +#ifdef KERNEL_MATH_EMULATION +.L24: +#ifdef PIC + .long __set_fpscr@PLT +#else + .long __set_fpscr +#endif +#endif +1: + ALIGN + END_INIT + + +/*@_init_PROLOG_ENDS*/ +/*@_fini_PROLOG_BEGINS*/ + .section .fini + .align 5 + .global _fini + .type _fini,@function +_fini: + mov.l r12,@-$r15 + mov.l r14,@-r15 + sts.l pr,@-r15 +#ifdef PIC + mova .L27,r0 + mov.l .L27,r12 + add r0,r12 +#endif + mov r15,r14 + ALIGN + END_FINI +#ifdef PIC + bra 1f + nop + .align 2 +.L27: + .long _GLOBAL_OFFSET_TABLE_ +#endif +1: +/*@_fini_PROLOG_ENDS*/ +/*@TRAILER_BEGINS*/ + .ident "GCC: (GNU) 2.95.1 19990816 (release)" diff -u -r -N glibc-2.1.3-original/sysdeps/sh/sh3/elf/crtn.S glibc-2.1.3/sysdeps/sh/sh3/elf/crtn.S --- glibc-2.1.3-original/sysdeps/sh/sh3/elf/crtn.S Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/sh3/elf/crtn.S Sun Mar 12 04:09:09 2000 @@ -0,0 +1,40 @@ + .file "initfini.c" +gcc2_compiled.: + +#include "defs.h" +#define PIC + +/*@HEADER_ENDS*/ +/*@_init_EPILOG_BEGINS*/ + .section .init + mov r14,r15 + lds.l @r15+,pr + mov.l @r15+,r14 + rts + mov.l @r15+,r12 + END_INIT + .section .text + .align 5 + .weak __gmon_start__ + .type __gmon_start__,@function +__gmon_start__: + mov.l r14,@-r15 + mov r15,r14 + mov r14,r15 + rts + mov.l @r15+,r14 + +/*@_init_EPILOG_ENDS*/ +/*@_fini_EPILOG_BEGINS*/ + .section .fini + mov r14,r15 + lds.l @r15+,pr + mov.l @r15+,r14 + rts + mov.l @r15+,r12 + + END_FINI + +/*@_fini_EPILOG_ENDS*/ +/*@TRAILER_BEGINS*/ + .ident "GCC: (GNU) 2.95.1 19990816 (release)" diff -u -r -N glibc-2.1.3-original/sysdeps/sh/sh3/elf/start.S glibc-2.1.3/sysdeps/sh/sh3/elf/start.S --- glibc-2.1.3-original/sysdeps/sh/sh3/elf/start.S Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/sh3/elf/start.S Sun Mar 12 04:09:09 2000 @@ -0,0 +1,90 @@ +/* Startup code for SH & ELF + Copyright (C) 1999 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. */ + +/* This is the canonical entry point, usually the first thing in the text + segment. + + Note that the code in the .init section has already been run. + This includes _init and _libc_init + + + At this entry point, most registers' values are unspecified, except: + + r4 Contains a function pointer to be registered with `atexit'. + This is how the dynamic linker arranges to have DT_FINI + functions called for shared libraries that have been loaded + before this code runs. + + sp The stack contains the arguments and environment: + 0(sp) argc + 4(sp) argv[0] + ... + (4*argc)(sp) NULL + (4*(argc+1))(sp) envp[0] + ... + NULL +*/ + + .text + .globl _start +_start: + /* Clear the frame pointer since this is the outermost frame. */ + mov #0, r14 + + /* Pop argc off the stack and save a pointer to argv */ + mov.l @r15+,r5 + mov r15, r6 + + /* Push the last arguments to main() onto the stack */ + mov.l r4,@-r15 + mov.l L_fini,r0 + mov.l r0,@-r15 + + /* Set up the other arguments for main() that go in registers */ + mov.l L_main,r4 + mov.l L_init,r7 + + /* __libc_start_main (main, argc, argv, init, fini, rtld_fini) */ + + /* Let the libc call main and exit with its return code. */ + mov.l L_libc_start_main,r1 + jsr @r1 + nop + /* should never get here....*/ + mov.l L_abort,r1 + jsr @r1 + nop + .align 2 +L_main: + .long main +L_init: + .long _init +L_fini: + .long _fini +L_libc_start_main: + .long __libc_start_main +L_abort: + .long abort +/* Define a symbol for the first piece of initialized data. */ + .data + .globl __data_start +__data_start: + .long 0 + .weak data_start + data_start = __data_start diff -u -r -N glibc-2.1.3-original/sysdeps/sh/sh3/setjmp.S glibc-2.1.3/sysdeps/sh/sh3/setjmp.S --- glibc-2.1.3-original/sysdeps/sh/sh3/setjmp.S Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/sh3/setjmp.S Sun Mar 12 04:09:09 2000 @@ -0,0 +1,67 @@ +/* setjmp for SH4. + Copyright (C) 1999, 2000 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 <sysdep.h> +#define _SETJMP_H +#define _ASM +#include <bits/setjmp.h> + + /* Binary compatibility entry point. */ +ENTRY (__setjmp) + mov #0, r5 +ENTRY (__sigsetjmp) + /* Save registers */ + add #JB_SIZE, r4 + stc.l gbr, @-r4 + sts.l pr, @-r4 + mov.l r15, @-r4 + mov.l r14, @-r4 + mov.l r13, @-r4 + mov.l r12, @-r4 + mov.l r11, @-r4 + mov.l r10, @-r4 + mov.l r9, @-r4 + mov.l r8, @-r4 + + /* Make a tail call to __sigjmp_save; it takes the same args. */ +#ifdef PIC + mov.l 1f, r1 + mova 1f, r0 + bra 2f + add r1, r0 + .align 2 +1: + .long _GLOBAL_OFFSET_TABLE_ +2: + mov.l .L1, r1 + mov.l @(r0,r1), r1 + jmp @r1 + nop + .align 2 +.L1: + .long C_SYMBOL_NAME(__sigjmp_save@GOT) +#else + mov.l .L1, r1 + jmp @r1 + nop + .align 2 +.L1: + .long C_SYMBOL_NAME(__sigjmp_save) +#endif +END (__setjmp) diff -u -r -N glibc-2.1.3-original/sysdeps/sh/sh3/sys/ucontext.h glibc-2.1.3/sysdeps/sh/sh3/sys/ucontext.h --- glibc-2.1.3-original/sysdeps/sh/sh3/sys/ucontext.h Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/sh3/sys/ucontext.h Sun Mar 12 04:09:09 2000 @@ -0,0 +1,99 @@ +/* Copyright (C) 1999, 2000 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. */ + +/* Where is System V/SH ABI? */ + +#ifndef _SYS_UCONTEXT_H +#define _SYS_UCONTEXT_H 1 + +#include <features.h> +#include <signal.h> + +typedef int greg_t; + +/* Number of general registers. */ +#define NGREG 16 + +/* Container for all general registers. */ +typedef greg_t gregset_t[NGREG]; + +/* Number of each register is the `gregset_t' array. */ +enum +{ + R0 = 0, +#define R0 R0 + R1 = 1, +#define R1 R1 + R2 = 2, +#define R2 R2 + R3 = 3, +#define R3 R3 + R4 = 4, +#define R4 R4 + R5 = 5, +#define R5 R5 + R6 = 6, +#define R6 R6 + R7 = 7, +#define R7 R7 + R8 = 8, +#define R8 R8 + R9 = 9, +#define R9 R9 + R10 = 10, +#define R10 R10 + R11 = 11, +#define R11 R11 + R12 = 12, +#define R12 R12 + R13 = 13, +#define R13 R13 + R14 = 14, +#define R14 R14 + R15 = 15, +#define R15 R15 +}; + +typedef int freg_t; + +/* Number of FPU registers. */ +#define NFREG 16 + +/* Structure to describe FPU registers. */ +typedef freg_t fpregset_t[NFREG]; + +/* Context to describe whole processor state. */ +typedef struct + { + gregset_t gregs; + fpregset_t fpregs; + fpregset_t xfpregs; + } mcontext_t; + +/* Userlevel context. */ +typedef struct ucontext + { + unsigned long int uc_flags; + struct ucontext *uc_link; + __sigset_t uc_sigmask; + stack_t uc_stack; + mcontext_t uc_mcontext; + long int uc_filler[5]; + } ucontext_t; + +#endif /* sys/ucontext.h */ diff -u -r -N glibc-2.1.3-original/sysdeps/sh/sh4/__longjmp.S glibc-2.1.3/sysdeps/sh/sh4/__longjmp.S --- glibc-2.1.3-original/sysdeps/sh/sh4/__longjmp.S Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/sh4/__longjmp.S Sun Mar 12 04:09:09 2000 @@ -0,0 +1,49 @@ +/* longjmp for SH. + Copyright (C) 1999, 2000 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 <sysdep.h> +#define _SETJMP_H +#define _ASM +#include <bits/setjmp.h> + +/* __longjmp(jmpbuf, val) */ + +ENTRY (__longjmp) + mov.l @r4+, r8 + mov.l @r4+, r9 + mov.l @r4+, r10 + mov.l @r4+, r11 + mov.l @r4+, r12 + mov.l @r4+, r13 + mov.l @r4+, r14 + mov.l @r4+, r15 + mov r5, r0 /* get the return value in place */ + tst r0, r0 + bf.s 1f + lds.l @r4+, pr + mov #1,r0 /* can't let setjmp() return zero! */ +1: + ldc.l @r4+, gbr + lds.l @r4+, fpscr + fmov.s @r4+, fr12 + fmov.s @r4+, fr13 + fmov.s @r4+, fr14 + rts + fmov.s @r4+, fr15 +END (__longjmp) diff -u -r -N glibc-2.1.3-original/sysdeps/sh/sh4/bits/endian.h glibc-2.1.3/sysdeps/sh/sh4/bits/endian.h --- glibc-2.1.3-original/sysdeps/sh/sh4/bits/endian.h Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/sh4/bits/endian.h Sun Mar 12 04:09:09 2000 @@ -0,0 +1,13 @@ +/* SH is bi-endian but with a big-endian FPU. */ + +#ifndef _ENDIAN_H +# error "Never use <bits/endian.h> directly; include <endian.h> instead." +#endif + +#ifdef __LITTLE_ENDIAN__ +#define __BYTE_ORDER __LITTLE_ENDIAN +#define __FLOAT_WORD_ORDER __LITTLE_ENDIAN +#else +#define __BYTE_ORDER __BIG_ENDIAN +#define __FLOAT_WORD_ORDER __BIG_ENDIAN +#endif diff -u -r -N glibc-2.1.3-original/sysdeps/sh/sh4/bits/huge_val.h glibc-2.1.3/sysdeps/sh/sh4/bits/huge_val.h --- glibc-2.1.3-original/sysdeps/sh/sh4/bits/huge_val.h Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/sh4/bits/huge_val.h Sun Mar 12 04:09:09 2000 @@ -0,0 +1,88 @@ +/* `HUGE_VAL' constants for IEEE 754 machines (where it is infinity). + Used by <stdlib.h> and <math.h> functions for overflow. + SH version. + Copyright (C) 1992, 95, 96, 97, 98, 99, 2000 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 _MATH_H +# error "Never use <bits/huge_val.h> directly; include <math.h> instead." +#endif + +#include <features.h> + +/* IEEE positive infinity (-HUGE_VAL is negative infinity). */ + +#ifdef __GNUC__ + +# define HUGE_VAL \ + (__extension__ \ + ((union { unsigned __l __attribute__((__mode__(__DI__))); double __d; }) \ + { __l: 0x000000007ff00000ULL }).__d) + +#else /* not GCC */ + +# include <endian.h> + +typedef union { unsigned char __c[8]; double __d; } __huge_val_t; + +# if __BYTE_ORDER == __BIG_ENDIAN +# define __HUGE_VAL_bytes { 0, 0, 0, 0, 0x7f, 0xf0, 0, 0 } +# endif +# if __BYTE_ORDER == __LITTLE_ENDIAN +# define __HUGE_VAL_bytes { 0, 0, 0xf0, 0x7f, 0, 0, 0, 0 } +# endif + +static __huge_val_t __huge_val = { __HUGE_VAL_bytes }; +# define HUGE_VAL (__huge_val.__d) + +#endif /* GCC. */ + + +/* ISO C 9X extensions: (float) HUGE_VALF and (long double) HUGE_VALL. */ + +#ifdef __USE_ISOC9X + +# ifdef __GNUC__ + +# define HUGE_VALF \ + (__extension__ \ + ((union { unsigned __l __attribute__((__mode__(__SI__))); float __d; }) \ + { __l: 0x7f800000UL }).__d) + +# else /* not GCC */ + +typedef union { unsigned char __c[4]; float __f; } __huge_valf_t; + +# if __BYTE_ORDER == __BIG_ENDIAN +# define __HUGE_VALF_bytes { 0x7f, 0x80, 0, 0 } +# endif +# if __BYTE_ORDER == __LITTLE_ENDIAN +# define __HUGE_VALF_bytes { 0, 0, 0x80, 0x7f } +# endif + +static __huge_valf_t __huge_valf = { __HUGE_VALF_bytes }; +# define HUGE_VALF (__huge_valf.__f) + +# endif /* GCC. */ + + +/* Generally there is no separate `long double' format and it is the + same as `double'. */ +# define HUGE_VALL HUGE_VAL + +#endif /* __USE_ISOC9X. */ diff -u -r -N glibc-2.1.3-original/sysdeps/sh/sh4/bits/setjmp.h glibc-2.1.3/sysdeps/sh/sh4/bits/setjmp.h --- glibc-2.1.3-original/sysdeps/sh/sh4/bits/setjmp.h Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/sh4/bits/setjmp.h Sun Mar 12 04:09:09 2000 @@ -0,0 +1,50 @@ +/* Copyright (C) 1999, 2000 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 the machine-dependent type `jmp_buf'. SH version. */ + +#ifndef _SETJMP_H +# error "Never include <bits/setjmp.h> directly; use <setjmp.h> instead." +#endif + +#ifndef _ASM +typedef struct + { + /* Callee-saved registers r8 through r15. */ + int __regs[8]; + + /* Program counter. */ + __ptr_t __pc; + + /* The global pointer. */ + __ptr_t __gbr; + + /* Floating point status register. */ + int __fpscr; + + /* Callee-saved floating point registers fr12 through fr15. */ + int __fpregs[4]; + } __jmp_buf[1]; +#endif + +#define JB_SIZE (4 * 15) + +/* Test if longjmp to JMPBUF would unwind the frame + containing a local variable at ADDRESS. */ +#define _JMPBUF_UNWINDS(jmpbuf, address) \ + ((__ptr_t) (address) < &(jmpbuf)[0].__regs[7]) diff -u -r -N glibc-2.1.3-original/sysdeps/sh/sh4/bsd-_setjmp.S glibc-2.1.3/sysdeps/sh/sh4/bsd-_setjmp.S --- glibc-2.1.3-original/sysdeps/sh/sh4/bsd-_setjmp.S Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/sh4/bsd-_setjmp.S Sun Mar 12 04:09:09 2000 @@ -0,0 +1,50 @@ +/* BSD `_setjmp' entry point to `sigsetjmp (..., 0)'. SH version. + Copyright (C) 1999, 2000 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. */ + +/* This just does a tail-call to `__sigsetjmp (ARG, 0)'. + We cannot do it in C because it must be a tail-call, so frame-unwinding + in setjmp doesn't clobber the state restored by longjmp. */ + +#include <sysdep.h> + +ENTRY (_setjmp) +#ifdef PIC + mova 1f, r0 + mov.l 1f, r1 + bra 2f + add r1, r0 + .align 2 +1: + .long _GLOBAL_OFFSET_TABLE_ +2: + mov.l 3f, r1 + mov.l @(r0,r1), r1 + jmp @r1 + mov #0, r0 +3: + .long C_SYMBOL_NAME(__sigsetjmp@GOT) +#else + mov.l 1f, r1 + jmp @r1 + mov #0, r0 + .align 2 +1: + .long C_SYMBOL_NAME(__sigsetjmp) +#endif +END (_setjmp) diff -u -r -N glibc-2.1.3-original/sysdeps/sh/sh4/bsd-setjmp.S glibc-2.1.3/sysdeps/sh/sh4/bsd-setjmp.S --- glibc-2.1.3-original/sysdeps/sh/sh4/bsd-setjmp.S Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/sh4/bsd-setjmp.S Sun Mar 12 04:09:09 2000 @@ -0,0 +1,50 @@ +/* BSD `setjmp' entry point to `sigsetjmp (..., 1)'. SH version. + Copyright (C) 1999, 2000 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. */ + +/* This just does a tail-call to `__sigsetjmp (ARG, 1)'. + We cannot do it in C because it must be a tail-call, so frame-unwinding + in setjmp doesn't clobber the state restored by longjmp. */ + +#include <sysdep.h> + +ENTRY (setjmp) +#ifdef PIC + mova 1f, r0 + mov.l 1f, r1 + bra 2f + add r1, r0 + .align 2 +1: + .long _GLOBAL_OFFSET_TABLE_ +2: + mov.l 3f, r1 + mov.l @(r0,r1), r1 + jmp @r1 + mov #1, r0 +3: + .long C_SYMBOL_NAME(__sigsetjmp@GOT) +#else + mov.l 1f, r1 + jmp @r1 + mov #1, r0 + .align 2 +1: + .long C_SYMBOL_NAME(__sigsetjmp) +#endif +END (setjmp) diff -u -r -N glibc-2.1.3-original/sysdeps/sh/sh4/dl-machine.h glibc-2.1.3/sysdeps/sh/sh4/dl-machine.h --- glibc-2.1.3-original/sysdeps/sh/sh4/dl-machine.h Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/sh4/dl-machine.h Sun Mar 12 16:02:25 2000 @@ -0,0 +1,518 @@ +/* Machine-dependent ELF dynamic relocation inline functions. SH-4 version. + Copyright (C) 1999, 2000 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 dl_machine_h +#define dl_machine_h + +/* Only dummy. This doesn't work. */ + +#define ELF_MACHINE_NAME "SH" + +#include <sys/param.h> + +#include <assert.h> + +/* Return nonzero iff E_MACHINE is compatible with the running host. */ +static inline int __attribute__ ((unused)) +elf_machine_matches_host (Elf32_Half e_machine) +{ + switch (e_machine) + { + case EM_SH: + return 1; + default: + return 0; + } +} + + +/* 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 Elf32_Addr __attribute__ ((unused)) +elf_machine_dynamic (void) +{ + register Elf32_Addr *got; + asm ("mov r12,%0" :"=r" (got)); + return *got; +} + + +/* Return the run-time load address of the shared object. */ +static inline Elf32_Addr __attribute__ ((unused)) +elf_machine_load_address (void) +{ + Elf32_Addr addr; + asm ("mov.l .L1,r0 + mov.l .L3,r2 + add r12,r2 + mov.l @(r0,r12),r0 + bra .L2 + sub r0,r2 + .align 2 + .L1: .long _dl_start@GOT + .L3: .long _dl_start@GOTOFF + .L2: mov r2,%0" + : "=r" (addr) : : "r0", "r1", "r2"); + return addr; +} + + +/* 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 __attribute__ ((unused)) +elf_machine_runtime_setup (struct link_map *l, int lazy, int profile) +{ + Elf32_Addr *got; + extern void _dl_runtime_resolve (Elf32_Word); + extern void _dl_runtime_profile (Elf32_Word); + + if (l->l_info[DT_JMPREL] && lazy) + { + /* The GOT entries for functions in the PLT have not yet been filled + in. Their initial contents will arrange when called to load an + offset into the .rela.plt section and _GLOBAL_OFFSET_TABLE_[1], + and then jump to _GLOBAL_OFFSET_TABLE[2]. */ + got = (Elf32_Addr *) l->l_info[DT_PLTGOT]->d_un.d_ptr; + got[1] = (Elf32_Addr) l; /* Identify this shared object. */ + + /* The got[2] entry contains the address of a function which gets + called to get the address of a so far unresolved function and + jump to it. The profiling extension of the dynamic linker allows + to intercept the calls to collect information. In this case we + don't store the address in the GOT so that all future calls also + end in this function. */ + if (profile) + { + got[2] = (Elf32_Addr) &_dl_runtime_profile; + /* Say that we really want profiling and the timers are started. */ + _dl_profile_map = l; + } + else + /* 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] = (Elf32_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_FIXUP_ARGS int plt_type + +#ifdef PIC +#define FUN_ADDR "\ + mov.l 1f,r2 + mova 1f,r0 + bra 2f + add r0,r2 ! Get GOT address in r2 +0: .align 2 +1: .long _GLOBAL_OFFSET_TABLE_ +2: mov.l 3f,r0 + add r2,r0" +#define GOTJMP(x) #x "@GOTOFF" +#else +#define FUN_ADDR "\ + mov.l 3f,r0" +#define GOTJMP(x) #x +#endif + +#define FGR_SAVE "\ + sts.l fpscr, @-r15 + mov #8,r3 + swap.w r3, r3 + lds r3, fpscr + fmov.s fr11, @-r15 + fmov.s fr10, @-r15 + fmov.s fr9, @-r15 + fmov.s fr8, @-r15 + fmov.s fr7, @-r15 + fmov.s fr6, @-r15 + fmov.s fr5, @-r15 + fmov.s fr4, @-r15" +#define FGR_LOAD "\ + fmov.s @r15+, fr4 + fmov.s @r15+, fr5 + fmov.s @r15+, fr6 + fmov.s @r15+, fr7 + fmov.s @r15+, fr8 + fmov.s @r15+, fr9 + fmov.s @r15+, fr10 + fmov.s @r15+, fr11 + lds.l @r15+, fpscr" + +#ifndef PROF +# define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\ + .text + .globl _dl_runtime_resolve + .type _dl_runtime_resolve, @function + .align 5 +_dl_runtime_resolve: + mov.l r3,@-r15 + mov.l r4,@-r15 + mov.l r5,@-r15 + mov.l r6,@-r15 + mov.l r7,@-r15 + mov.l r12,@-r15 + movt r3 ! Save T flag. + mov.l r3,@-r15 + " FGR_SAVE " + sts.l pr,@-r15 + mov r0,r4 ! PLT type + mov r2,r5 ! link map address + " FUN_ADDR " + jsr @r0 ! Call resolver. + mov r1,r6 ! reloc offset + lds.l @r15+,pr ! Get register content back. + " FGR_LOAD " + mov.l @r15+,r3 + shal r3 ! Lode T flag. + mov.l @r15+,r12 + mov.l @r15+,r7 + mov.l @r15+,r6 + mov.l @r15+,r5 + mov.l @r15+,r4 + jmp @r0 ! Jump to function address. + mov.l @r15+,r3 + .align 2 +3: + .long " GOTJMP (fixup) " + .size _dl_runtime_resolve, .-_dl_runtime_resolve + + .globl _dl_runtime_profile + .type _dl_runtime_profile, @function + .align 5 +_dl_runtime_profile: + mov.l r3,@-r15 + mov.l r4,@-r15 + mov.l r5,@-r15 + mov.l r6,@-r15 + mov.l r7,@-r15 + mov.l r12,@-r15 + movt r3 ! Save T flag. + mov.l r3,@-r15 + " FGR_SAVE " + sts.l pr,@-r15 + mov r0,r4 ! PLT type + mov r2,r5 ! link map address + sts pr,r7 ! return address + " FUN_ADDR " + jsr @r0 ! Call resolver. + mov r1,r6 ! reloc offset + lds.l @r15+,pr ! Get register content back. + " FGR_LOAD " + mov.l @r15+,r3 + shal r3 ! Lode T flag. + mov.l @r15+,r12 + mov.l @r15+,r7 + mov.l @r15+,r6 + mov.l @r15+,r5 + mov.l @r15+,r4 + jmp @r0 ! Jump to function address. + mov.l @r15+,r3 + .align 2 +3: + .long " GOTJMP (profile_fixup) " + .size _dl_runtime_profile, .-_dl_runtime_profile + .previous +"); +#else +# define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\ + .text + .globl _dl_runtime_resolve + .globl _dl_runtime_profile + .type _dl_runtime_resolve, @function + .type _dl_runtime_profile, @function + .align 5 +_dl_runtime_resolve: +_dl_runtime_profile: + mov.l r3,@-r15 + mov.l r4,@-r15 + mov.l r5,@-r15 + mov.l r6,@-r15 + mov.l r7,@-r15 + mov.l r12,@-r15 + movt r3 ! Save T flag. + mov.l r3,@-r15 + " FGR_SAVE " + sts.l pr,@-r15 + mov r0,r4 ! PLT type + mov r2,r5 ! link map address + sts pr,r7 ! return address + " FUN_ADDR " + jsr @r0 ! Call resolver. + mov r1,r6 ! reloc offset + lds.l @r15+,pr ! Get register content back. + " FGR_LOAD " + mov.l @r15+,r3 + shal r3 ! Lode T flag. + mov.l @r15+,r12 + mov.l @r15+,r7 + mov.l @r15+,r6 + mov.l @r15+,r5 + mov.l @r15+,r4 + jmp @r0 ! Jump to function address. + mov.l @r15+,r3 + .align 2 +3: + .long " GOTJMP (fixup) " + .size _dl_runtime_resolve, .-_dl_runtime_resolve + .size _dl_runtime_profile, .-_dl_runtime_profile + .previous +"); +#endif + +/* Mask identifying addresses reserved for the user program, + where the dynamic linker should not map anything. */ +#define ELF_MACHINE_USER_ADDRESS_MASK 0x80000000UL + +/* 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 RTLD_START asm ("\ +.text\n\ +.globl _start\n\ +.globl _dl_start_user\n\ +_start:\n\ + mov r15,r4\n\ + mov.l .L_dl_start,r1\n\ + mova .L_dl_start,r0\n\ + add r1,r0\n\ + jsr @r0\n\ + nop\n\ +_dl_start_user:\n\ + ! Save the user entry point address in r8.\n\ + mov r0,r8\n\ + ! Point r12 at the GOT.\n\ + mov.l 1f,r12\n\ + mova 1f,r0\n\ + bra 2f\n\ + add r0,r12\n\ + .align 2\n\ +1: .long _GLOBAL_OFFSET_TABLE_\n\ +2: ! Store the highest stack address\n\ + mov.l .L_stack_end,r0\n\ + mov.l @(r0,r12),r0\n\ + mov.l r15,@r0\n\ + ! See if we were run as a command with the executable file\n\ + ! name as an extra leading argument.\n\ + mov.l .L_dl_skip_args,r0\n\ + mov.l @(r0,r12),r0\n\ + mov.l @r0,r0\n\ + ! Get the original argument count.\n\ + mov.l @r15,r2\n\ + ! Subtract _dl_skip_args from it.\n\ + sub r0,r2\n\ + ! Adjust the stack pointer to skip _dl_skip_args words.\n\ + shll2 r0\n\ + add r0,r15\n\ + ! Store back the modified argument count.\n\ + mov.l r2,@r15\n\ + ! Push the searchlist of the main object as argument in\n\ + ! _dl_init_next call below.\n\ + mov.l .L_dl_main_searchlist,r0\n\ + mov.l @(r0,r12),r0\n\ + mov.l @r0,r9\n\ +0: mov r9,r4\n\ + ! Call _dl_init_next to return the address of an initializer\n\ + ! function to run.\n\ + mov.l .L_dl_init_next,r1\n\ + mova .L_dl_init_next,r0\n\ + add r1,r0\n\ + jsr @r0\n\ + nop\n\ + ! Check for zero return, when out of initializers.\n\ + tst r0,r0\n\ + bt 1f\n\ + ! Call the shared object initializer function.\n\ + jsr @r0\n\ + nop\n\ + ! Loop to call _dl_init_next for the next initializer.\n\ + bra 0b\n\ + nop\n\ +1: ! Clear the startup flag.\n\ + mov.l .L_dl_starting_up,r0\n\ + mov.l @(r0,r12),r0\n\ + mov #0,r2\n\ + mov.l r2,@r0\n\ + ! Pass our finalizer function to the user in r4, as per ELF ABI.\n\ + mov.l .L_dl_fini,r0\n\ + mov.l @(r0,r12),r4\n\ + ! Jump to the user's entry point.\n\ + jmp @r8\n\ + nop\n\ + .align 2\n\ +.L_dl_start:\n\ + .long _dl_start@PLT\n\ +.L_stack_end:\n\ + .long __libc_stack_end@GOT\n\ +.L_dl_skip_args:\n\ + .long _dl_skip_args@GOT\n\ +.L_dl_main_searchlist:\n\ + .long _dl_main_searchlist@GOT\n\ +.L_dl_init_next:\n\ + .long _dl_init_next@PLT\n\ +.L_dl_starting_up:\n\ + .long _dl_starting_up@GOT\n\ +.L_dl_fini:\n\ + .long _dl_fini@GOT\n\ +.previous\n\ +"); + +/* 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_SH_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_SH_JMP_SLOT) + +/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */ +#define ELF_MACHINE_JMP_SLOT R_SH_JMP_SLOT + +/* We define an initialization functions. This is called very early in + _dl_sysdep_start. */ +#define DL_PLATFORM_INIT dl_platform_init () + +extern const char *_dl_platform; + +static inline void __attribute__ ((unused)) +dl_platform_init (void) +{ + if (_dl_platform != NULL && *_dl_platform == '\0') + /* Avoid an empty string which would disturb us. */ + _dl_platform = NULL; +} + +static inline void +elf_machine_fixup_plt (struct link_map *map, const Elf32_Rela *reloc, + Elf32_Addr *reloc_addr, Elf32_Addr value) +{ + *reloc_addr = value; +} + +/* Return the final value of a plt relocation. */ +static inline Elf32_Addr +elf_machine_plt_value (struct link_map *map, const Elf32_Rela *reloc, + Elf32_Addr value) +{ + return value + reloc->r_addend; +} + +#endif /* !dl_machine_h */ + +#ifdef RESOLVE + +/* SH never uses Elf32_Rel relocations. */ +#define ELF_MACHINE_NO_REL 1 + +extern char **_dl_argv; + +/* 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 Elf32_Rela *reloc, + const Elf32_Sym *sym, const struct r_found_version *version, + Elf32_Addr *const reloc_addr) +{ + if (ELF32_R_TYPE (reloc->r_info) == R_SH_RELATIVE) + { +#ifndef RTLD_BOOTSTRAP + if (map != &_dl_rtld_map) /* Already done in rtld itself. */ +#endif + *reloc_addr = map->l_addr + reloc->r_addend; + } + else if (ELF32_R_TYPE (reloc->r_info) != R_SH_NONE) + { + const Elf32_Sym *const refsym = sym; + Elf32_Addr value = RESOLVE (&sym, version, ELF32_R_TYPE (reloc->r_info)); + if (sym) + value += sym->st_value; + value += reloc->r_addend; + + switch (ELF32_R_TYPE (reloc->r_info)) + { + case R_SH_COPY: + if (sym == NULL) + /* This can happen in trace mode if an object could not be + found. */ + break; + if (sym->st_size > refsym->st_size + || (sym->st_size < refsym->st_size && _dl_verbose)) + { + const char *strtab; + + strtab = (const char *) map->l_info[DT_STRTAB]->d_un.d_ptr; + _dl_sysdep_error (_dl_argv[0] ?: "<program name unknown>", + ": 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_SH_GLOB_DAT: + case R_SH_JMP_SLOT: + *reloc_addr = value; + break; + case R_SH_DIR32: + { +#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); + if (map == &_dl_rtld_map) + /* Undo the relocation done here during bootstrapping. + Now we will relocate it anew, possibly using a + binding found in the user program or a loaded library + rather than the dynamic linker's built-in definitions + used while loading those libraries. */ + value -= map->l_addr + refsym->st_value + reloc->r_addend; +#endif + *reloc_addr = value; + break; + } + case R_SH_REL32: + *reloc_addr = (value - (Elf32_Addr) reloc_addr); + break; + default: + assert (! "unexpected dynamic reloc type"); + break; + } + } +} + +static inline void +elf_machine_lazy_rel (Elf32_Addr l_addr, const Elf32_Rela *reloc) +{ + Elf32_Addr *const reloc_addr = (void *) (l_addr + reloc->r_offset); + /* Check for unexpected PLT reloc type. */ + assert (ELF32_R_TYPE (reloc->r_info) == R_SH_JMP_SLOT); + *reloc_addr += l_addr; /* + reloc->r_addend; */ +} + +#endif /* RESOLVE */ diff -u -r -N glibc-2.1.3-original/sysdeps/sh/sh4/elf/crti.S glibc-2.1.3/sysdeps/sh/sh4/elf/crti.S --- glibc-2.1.3-original/sysdeps/sh/sh4/elf/crti.S Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/sh4/elf/crti.S Wed May 24 07:44:54 2000 @@ -0,0 +1,74 @@ + .file "initfini.c" +gcc2_compiled.: + +#include "defs.h" +#define PIC + +/*@HEADER_ENDS*/ +/*@_init_PROLOG_BEGINS*/ + .section .init + .align 5 + .global _init + .type _init,@function +_init: + mov.l r12,@-r15 + mov.l r14,@-r15 + sts.l pr,@-r15 +#ifdef PIC + mova .L22,r0 + mov.l .L22,r12 + add r0,r12 + mova .L23,r0 + mov.l .L23,r1 + add r0,r1 +#else + mov.l .L23,r1 +#endif + jsr @r1 + mov r15,r14 + bra 1f + nop + .align 2 +#ifdef PIC +.L22: + .long _GLOBAL_OFFSET_TABLE_ +.L23: + .long __gmon_start__@PLT +#else +.L23: + .long __gmon_start__ +#endif +1: + ALIGN + END_INIT + + +/*@_init_PROLOG_ENDS*/ +/*@_fini_PROLOG_BEGINS*/ + .section .fini + .align 5 + .global _fini + .type _fini,@function +_fini: + mov.l r12,@-$r15 + mov.l r14,@-r15 + sts.l pr,@-r15 +#ifdef PIC + mova .L27,r0 + mov.l .L27,r12 + add r0,r12 +#endif + mov r15,r14 + ALIGN + END_FINI +#ifdef PIC + bra 1f + nop + .align 2 +.L27: + .long _GLOBAL_OFFSET_TABLE_ +#endif +1: +/*@_fini_PROLOG_ENDS*/ +/*@TRAILER_BEGINS*/ + .ident "GCC: (GNU) 2.95.1 19990816 (release)" diff -u -r -N glibc-2.1.3-original/sysdeps/sh/sh4/elf/crtn.S glibc-2.1.3/sysdeps/sh/sh4/elf/crtn.S --- glibc-2.1.3-original/sysdeps/sh/sh4/elf/crtn.S Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/sh4/elf/crtn.S Sun Mar 12 04:09:09 2000 @@ -0,0 +1,40 @@ + .file "initfini.c" +gcc2_compiled.: + +#include "defs.h" +#define PIC + +/*@HEADER_ENDS*/ +/*@_init_EPILOG_BEGINS*/ + .section .init + mov r14,r15 + lds.l @r15+,pr + mov.l @r15+,r14 + rts + mov.l @r15+,r12 + END_INIT + .section .text + .align 5 + .weak __gmon_start__ + .type __gmon_start__,@function +__gmon_start__: + mov.l r14,@-r15 + mov r15,r14 + mov r14,r15 + rts + mov.l @r15+,r14 + +/*@_init_EPILOG_ENDS*/ +/*@_fini_EPILOG_BEGINS*/ + .section .fini + mov r14,r15 + lds.l @r15+,pr + mov.l @r15+,r14 + rts + mov.l @r15+,r12 + + END_FINI + +/*@_fini_EPILOG_ENDS*/ +/*@TRAILER_BEGINS*/ + .ident "GCC: (GNU) 2.95.1 19990816 (release)" diff -u -r -N glibc-2.1.3-original/sysdeps/sh/sh4/elf/start.S glibc-2.1.3/sysdeps/sh/sh4/elf/start.S --- glibc-2.1.3-original/sysdeps/sh/sh4/elf/start.S Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/sh4/elf/start.S Sun Mar 12 04:09:09 2000 @@ -0,0 +1,90 @@ +/* Startup code for SH & ELF + Copyright (C) 1999 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. */ + +/* This is the canonical entry point, usually the first thing in the text + segment. + + Note that the code in the .init section has already been run. + This includes _init and _libc_init + + + At this entry point, most registers' values are unspecified, except: + + r4 Contains a function pointer to be registered with `atexit'. + This is how the dynamic linker arranges to have DT_FINI + functions called for shared libraries that have been loaded + before this code runs. + + sp The stack contains the arguments and environment: + 0(sp) argc + 4(sp) argv[0] + ... + (4*argc)(sp) NULL + (4*(argc+1))(sp) envp[0] + ... + NULL +*/ + + .text + .globl _start +_start: + /* Clear the frame pointer since this is the outermost frame. */ + mov #0, r14 + + /* Pop argc off the stack and save a pointer to argv */ + mov.l @r15+,r5 + mov r15, r6 + + /* Push the last arguments to main() onto the stack */ + mov.l r4,@-r15 + mov.l L_fini,r0 + mov.l r0,@-r15 + + /* Set up the other arguments for main() that go in registers */ + mov.l L_main,r4 + mov.l L_init,r7 + + /* __libc_start_main (main, argc, argv, init, fini, rtld_fini) */ + + /* Let the libc call main and exit with its return code. */ + mov.l L_libc_start_main,r1 + jsr @r1 + nop + /* should never get here....*/ + mov.l L_abort,r1 + jsr @r1 + nop + .align 2 +L_main: + .long main +L_init: + .long _init +L_fini: + .long _fini +L_libc_start_main: + .long __libc_start_main +L_abort: + .long abort +/* Define a symbol for the first piece of initialized data. */ + .data + .globl __data_start +__data_start: + .long 0 + .weak data_start + data_start = __data_start diff -u -r -N glibc-2.1.3-original/sysdeps/sh/sh4/fpu/bits/fenv.h glibc-2.1.3/sysdeps/sh/sh4/fpu/bits/fenv.h --- glibc-2.1.3-original/sysdeps/sh/sh4/fpu/bits/fenv.h Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/sh4/fpu/bits/fenv.h Sun Mar 12 04:09:09 2000 @@ -0,0 +1,72 @@ +/* Copyright (C) 1999, 2000 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 _FENV_H +# error "Never use <bits/fenv.h> directly; include <fenv.h> instead." +#endif + + +/* Define bits representing the exception. We use the bit positions + of the appropriate bits in the FPU control word. */ +enum + { + FE_INEXACT = 0x04, +#define FE_INEXACT FE_INEXACT + FE_UNDERFLOW = 0x08, +#define FE_UNDERFLOW FE_UNDERFLOW + FE_OVERFLOW = 0x10, +#define FE_OVERFLOW FE_OVERFLOW + FE_DIVBYZERO = 0x20, +#define FE_DIVBYZERO FE_DIVBYZERO + FE_INVALID = 0x40, +#define FE_INVALID FE_INVALID + }; + +#define FE_ALL_EXCEPT \ + (FE_INEXACT | FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW | FE_INVALID) + +/* The SH FPU supports all of the four defined rounding modes. We + use again the bit positions in the FPU control word as the values + for the appropriate macros. */ +enum + { + FE_TONEAREST = 0x0, +#define FE_TONEAREST FE_TONEAREST + FE_TOWARDZERO = 0x1, +#define FE_TOWARDZERO FE_TOWARDZERO + FE_UPWARD = 0x2, +#define FE_UPWARD FE_UPWARD + FE_DOWNWARD = 0x3 +#define FE_DOWNWARD FE_DOWNWARD + }; + + +/* Type representing exception flags. */ +typedef unsigned short int fexcept_t; + + +/* Type representing floating-point environment. This function corresponds + to the layout of the block written by the `fstenv'. */ +typedef struct + { + unsigned int __fpscr; + } +fenv_t; + +/* If the default argument is used we use this value. */ +#define FE_DFL_ENV ((fenv_t *) -1) diff -u -r -N glibc-2.1.3-original/sysdeps/sh/sh4/fpu/fclrexcpt.c glibc-2.1.3/sysdeps/sh/sh4/fpu/fclrexcpt.c --- glibc-2.1.3-original/sysdeps/sh/sh4/fpu/fclrexcpt.c Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/sh4/fpu/fclrexcpt.c Sun Mar 12 21:13:05 2000 @@ -0,0 +1,40 @@ +/* Clear given exceptions in current floating-point environment. + Copyright (C) 1998, 2000 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Andreas Jaeger <aj@arthur.rhein-neckar.de>, 1998. + + 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 <fenv.h> +#include <fpu_control.h> + +void +feclearexcept (int excepts) +{ + int cw; + + /* Mask out unsupported bits/exceptions. */ + excepts &= FE_ALL_EXCEPT; + + /* Read the complete control word. */ + _FPU_GETCW (cw); + + /* Clear exception bits. */ + cw &= ~excepts; + + /* Put the new data in effect. */ + _FPU_SETCW (cw); +} diff -u -r -N glibc-2.1.3-original/sysdeps/sh/sh4/fpu/fegetenv.c glibc-2.1.3/sysdeps/sh/sh4/fpu/fegetenv.c --- glibc-2.1.3-original/sysdeps/sh/sh4/fpu/fegetenv.c Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/sh4/fpu/fegetenv.c Sun Mar 12 21:13:05 2000 @@ -0,0 +1,29 @@ +/* Store current floating-point environment. + Copyright (C) 1997, 1998, 1999, 2000 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 <fenv.h> +#include <fpu_control.h> + +void +fegetenv (fenv_t *envp) +{ + unsigned long int temp; + _FPU_GETCW(temp); + envp->__fpscr = temp; +} diff -u -r -N glibc-2.1.3-original/sysdeps/sh/sh4/fpu/fegetround.c glibc-2.1.3/sysdeps/sh/sh4/fpu/fegetround.c --- glibc-2.1.3-original/sysdeps/sh/sh4/fpu/fegetround.c Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/sh4/fpu/fegetround.c Sun Mar 12 21:13:05 2000 @@ -0,0 +1,33 @@ +/* Return current rounding direction. + Copyright (C) 1998, 2000 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Andreas Jaeger <aj@arthur.rhein-neckar.de>, 1998. + + 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 <fenv.h> +#include <fpu_control.h> + +int +fegetround (void) +{ + int cw; + + /* Get control word. */ + _FPU_GETCW (cw); + + return cw & 0x3; +} diff -u -r -N glibc-2.1.3-original/sysdeps/sh/sh4/fpu/feholdexcpt.c glibc-2.1.3/sysdeps/sh/sh4/fpu/feholdexcpt.c --- glibc-2.1.3-original/sysdeps/sh/sh4/fpu/feholdexcpt.c Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/sh4/fpu/feholdexcpt.c Sun Mar 12 21:13:05 2000 @@ -0,0 +1,37 @@ +/* Store current floating-point environment and clear exceptions. + Copyright (C) 1997, 1998, 1999, 2000 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 <fenv.h> +#include <fpu_control.h> + +int +feholdexcept (fenv_t *envp) +{ + unsigned long int temp; + + /* Store the environment. */ + _FPU_GETCW(temp); + envp->__fpscr = temp; + + /* Now set all exceptions to non-stop. */ + temp &= ~FE_ALL_EXCEPT; + _FPU_SETCW(temp); + + return 1; +} diff -u -r -N glibc-2.1.3-original/sysdeps/sh/sh4/fpu/fesetenv.c glibc-2.1.3/sysdeps/sh/sh4/fpu/fesetenv.c --- glibc-2.1.3-original/sysdeps/sh/sh4/fpu/fesetenv.c Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/sh4/fpu/fesetenv.c Sun Mar 12 21:13:05 2000 @@ -0,0 +1,33 @@ +/* Install given floating-point environment. + Copyright (C) 1997, 1998, 1999, 2000 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 <fenv.h> +#include <fpu_control.h> + +void +fesetenv (const fenv_t *envp) +{ + if (envp == FE_DFL_ENV) + _FPU_SETCW(_FPU_DEFAULT); + else + { + unsigned long temp = envp->__fpscr; + _FPU_SETCW(temp); + } +} diff -u -r -N glibc-2.1.3-original/sysdeps/sh/sh4/fpu/fesetround.c glibc-2.1.3/sysdeps/sh/sh4/fpu/fesetround.c --- glibc-2.1.3-original/sysdeps/sh/sh4/fpu/fesetround.c Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/sh4/fpu/fesetround.c Sun Mar 12 21:13:05 2000 @@ -0,0 +1,43 @@ +/* Set current rounding direction. + Copyright (C) 1998, 2000 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Andreas Jaeger <aj@arthur.rhein-neckar.de>, 1998. + + 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 <fenv.h> +#include <fpu_control.h> + +int +fesetround (int round) +{ + unsigned int cw; + + if ((round & ~0x3) != 0) + /* ROUND is no valid rounding mode. */ + return 0; + + /* Get current state. */ + _FPU_GETCW (cw); + + /* Set rounding bits. */ + cw &= ~0x3; + cw |= round; + /* Set new state. */ + _FPU_SETCW (cw); + + return 1; +} diff -u -r -N glibc-2.1.3-original/sysdeps/sh/sh4/fpu/fpu_control.h glibc-2.1.3/sysdeps/sh/sh4/fpu/fpu_control.h --- glibc-2.1.3-original/sysdeps/sh/sh4/fpu/fpu_control.h Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/sh4/fpu/fpu_control.h Sun Mar 12 04:09:09 2000 @@ -0,0 +1,55 @@ +/* FPU control word definitions. SH version. + Copyright (C) 1999, 2000 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 _FPU_CONTROL_H +#define _FPU_CONTROL_H + +/* masking of interrupts */ +#define _FPU_MASK_V 0x0800 /* Invalid operation */ +#define _FPU_MASK_Z 0x0400 /* Division by zero */ +#define _FPU_MASK_O 0x0200 /* Overflow */ +#define _FPU_MASK_U 0x0100 /* Underflow */ +#define _FPU_MASK_I 0x0080 /* Inexact operation */ + +/* rounding control */ +#define _FPU_RC_NEAREST 0x0 /* RECOMMENDED */ +#define _FPU_RC_ZERO 0x1 + +#define _FPU_RESERVED 0xffc00000 /* These bits are reserved. */ + +/* The fdlibm code requires strict IEEE double precision arithmetic, + and no interrupts for exceptions, rounding to nearest. */ +#define _FPU_DEFAULT 0x00080000 /* Default value. */ + +/* Type of the control word. */ +typedef unsigned int fpu_control_t; + +/* Macros for accessing the hardware control word. */ +#define _FPU_GETCW(cw) __asm__ ("sts fpscr,%0" : "=r" (cw)) + +#if defined __GNUC__ +#define _FPU_SETCW(cw) __set_fpscr ((cw)) +#else +#define _FPU_SETCW(cw) __asm__ ("lds %0,fpscr" : : "r" (cw)) +#endif + +/* Default control word set at startup. */ +extern fpu_control_t __fpu_control; + +#endif /* _FPU_CONTROL_H */ diff -u -r -N glibc-2.1.3-original/sysdeps/sh/sh4/fpu/fraiseexcpt.c glibc-2.1.3/sysdeps/sh/sh4/fpu/fraiseexcpt.c --- glibc-2.1.3-original/sysdeps/sh/sh4/fpu/fraiseexcpt.c Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/sh4/fpu/fraiseexcpt.c Sun Mar 12 21:13:05 2000 @@ -0,0 +1,33 @@ +/* Raise given exceptions. + Copyright (C) 1997, 1998, 2000 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 <fenv.h> +#include <fpu_control.h> +#include <math.h> + +void +feraiseexcept (int excepts) +{ + /* Raise exceptions represented by EXPECTS. */ + fexcept_t temp; + _FPU_GETCW(temp); + temp |= (excepts & FE_ALL_EXCEPT); + temp |= (excepts & FE_ALL_EXCEPT) << 5; + _FPU_SETCW(temp); +} diff -u -r -N glibc-2.1.3-original/sysdeps/sh/sh4/fpu/fsetexcptflg.c glibc-2.1.3/sysdeps/sh/sh4/fpu/fsetexcptflg.c --- glibc-2.1.3-original/sysdeps/sh/sh4/fpu/fsetexcptflg.c Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/sh4/fpu/fsetexcptflg.c Sun Mar 12 21:13:05 2000 @@ -0,0 +1,38 @@ +/* Set floating-point environment exception handling. + Copyright (C) 1997, 1998, 2000 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 <fenv.h> +#include <math.h> +#include <fpu_control.h> + +void +fesetexceptflag (const fexcept_t *flagp, int excepts) +{ + fexcept_t temp; + + /* Get the current environment. */ + _FPU_GETCW(temp); + + /* Set the desired exception mask. */ + temp &= ~(excepts & FE_ALL_EXCEPT); + temp |= (*flagp & excepts & FE_ALL_EXCEPT); + + /* Save state back to the FPU. */ + _FPU_SETCW(temp); +} diff -u -r -N glibc-2.1.3-original/sysdeps/sh/sh4/fpu/ftestexcept.c glibc-2.1.3/sysdeps/sh/sh4/fpu/ftestexcept.c --- glibc-2.1.3-original/sysdeps/sh/sh4/fpu/ftestexcept.c Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/sh4/fpu/ftestexcept.c Sun Mar 12 21:13:05 2000 @@ -0,0 +1,32 @@ +/* Test exception in current environment. + Copyright (C) 1997, 1998, 2000 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 <fenv.h> +#include <fpu_control.h> + +int +fetestexcept (int excepts) +{ + fexcept_t temp; + + /* Get current exceptions. */ + _FPU_GETCW(temp); + + return temp & excepts & FE_ALL_EXCEPT; +} diff -u -r -N glibc-2.1.3-original/sysdeps/sh/sh4/setjmp.S glibc-2.1.3/sysdeps/sh/sh4/setjmp.S --- glibc-2.1.3-original/sysdeps/sh/sh4/setjmp.S Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/sh4/setjmp.S Sun Mar 12 04:09:09 2000 @@ -0,0 +1,72 @@ +/* setjmp for SH4. + Copyright (C) 1999, 2000 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 <sysdep.h> +#define _SETJMP_H +#define _ASM +#include <bits/setjmp.h> + + /* Binary compatibility entry point. */ +ENTRY (__setjmp) + mov #0, r5 +ENTRY (__sigsetjmp) + /* Save registers */ + add #JB_SIZE, r4 + fmov.s fr15, @-r4 + fmov.s fr14, @-r4 + fmov.s fr13, @-r4 + fmov.s fr12, @-r4 + sts.l fpscr, @-r4 + stc.l gbr, @-r4 + sts.l pr, @-r4 + mov.l r15, @-r4 + mov.l r14, @-r4 + mov.l r13, @-r4 + mov.l r12, @-r4 + mov.l r11, @-r4 + mov.l r10, @-r4 + mov.l r9, @-r4 + mov.l r8, @-r4 + + /* Make a tail call to __sigjmp_save; it takes the same args. */ +#ifdef PIC + mov.l 1f, r1 + mova 1f, r0 + bra 2f + add r1, r0 + .align 2 +1: + .long _GLOBAL_OFFSET_TABLE_ +2: + mov.l .L1, r1 + mov.l @(r0,r1), r1 + jmp @r1 + nop + .align 2 +.L1: + .long C_SYMBOL_NAME(__sigjmp_save@GOT) +#else + mov.l .L1, r1 + jmp @r1 + nop + .align 2 +.L1: + .long C_SYMBOL_NAME(__sigjmp_save) +#endif +END (__setjmp) diff -u -r -N glibc-2.1.3-original/sysdeps/sh/sh4/sys/ucontext.h glibc-2.1.3/sysdeps/sh/sh4/sys/ucontext.h --- glibc-2.1.3-original/sysdeps/sh/sh4/sys/ucontext.h Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/sh4/sys/ucontext.h Sun Mar 12 04:09:09 2000 @@ -0,0 +1,99 @@ +/* Copyright (C) 1999, 2000 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. */ + +/* Where is System V/SH ABI? */ + +#ifndef _SYS_UCONTEXT_H +#define _SYS_UCONTEXT_H 1 + +#include <features.h> +#include <signal.h> + +typedef int greg_t; + +/* Number of general registers. */ +#define NGREG 16 + +/* Container for all general registers. */ +typedef greg_t gregset_t[NGREG]; + +/* Number of each register is the `gregset_t' array. */ +enum +{ + R0 = 0, +#define R0 R0 + R1 = 1, +#define R1 R1 + R2 = 2, +#define R2 R2 + R3 = 3, +#define R3 R3 + R4 = 4, +#define R4 R4 + R5 = 5, +#define R5 R5 + R6 = 6, +#define R6 R6 + R7 = 7, +#define R7 R7 + R8 = 8, +#define R8 R8 + R9 = 9, +#define R9 R9 + R10 = 10, +#define R10 R10 + R11 = 11, +#define R11 R11 + R12 = 12, +#define R12 R12 + R13 = 13, +#define R13 R13 + R14 = 14, +#define R14 R14 + R15 = 15, +#define R15 R15 +}; + +typedef int freg_t; + +/* Number of FPU registers. */ +#define NFREG 16 + +/* Structure to describe FPU registers. */ +typedef freg_t fpregset_t[NFREG]; + +/* Context to describe whole processor state. */ +typedef struct + { + gregset_t gregs; + fpregset_t fpregs; + fpregset_t xfpregs; + } mcontext_t; + +/* Userlevel context. */ +typedef struct ucontext + { + unsigned long int uc_flags; + struct ucontext *uc_link; + __sigset_t uc_sigmask; + stack_t uc_stack; + mcontext_t uc_mcontext; + long int uc_filler[5]; + } ucontext_t; + +#endif /* sys/ucontext.h */ diff -u -r -N glibc-2.1.3-original/sysdeps/sh/strlen.S glibc-2.1.3/sysdeps/sh/strlen.S --- glibc-2.1.3-original/sysdeps/sh/strlen.S Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/strlen.S Sun Mar 12 04:09:09 2000 @@ -0,0 +1,84 @@ +/* Copyright (C) 1999, 2000 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Kazumoto Kojima <kkojima@rr.iij4u.or.jp> + + 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 <sysdep.h> +#include <endian.h> + +/* size_t strlen (const char *s) */ + +ENTRY(strlen) + mov r4, r0 + and #3, r0 + tst r0, r0 + bt/s 1f + mov #0, r2 + + add #-1, r0 + shll2 r0 + shll r0 + braf r0 + nop + + mov.b @r4+, r1 + tst r1, r1 + bt 8f + add #1, r2 + + mov.b @r4+, r1 + tst r1, r1 + bt 8f + add #1, r2 + + mov.b @r4+, r1 + tst r1, r1 + bt 8f + add #1, r2 + +1: + mov #0, r3 +2: + mov.l @r4+, r1 + cmp/str r3, r1 + bf/s 2b + add #4, r2 + + add #-4, r2 +#if __BYTE_ORDER == __BIG_ENDIAN + swap.b r1, r1 + swap.w r1, r1 + swap.b r1, r1 +#endif + extu.b r1, r0 + tst r0, r0 + bt/s 8f + shlr8 r1 + add #1, r2 + extu.b r1, r0 + tst r0, r0 + bt/s 8f + shlr8 r1 + add #1, r2 + extu.b r1, r0 + tst r0, r0 + bt 8f + add #1, r2 +8: + rts + mov r2, r0 +END(strlen) diff -u -r -N glibc-2.1.3-original/sysdeps/sh/sysdep.h glibc-2.1.3/sysdeps/sh/sysdep.h --- glibc-2.1.3-original/sysdeps/sh/sysdep.h Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/sh/sysdep.h Sun Mar 12 04:09:09 2000 @@ -0,0 +1,76 @@ +/* Assembler macros for SH. + Copyright (C) 1999, 2000 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 <sysdeps/generic/sysdep.h> + +#ifdef __ASSEMBLER__ + +/* Syntactic details of assembler. */ + +#ifdef HAVE_ELF + +#define ALIGNARG(log2) log2 +/* For ELF we need the `.type' directive to make shared libs work right. */ +#define ASM_TYPE_DIRECTIVE(name,typearg) .type name,@##typearg; +#define ASM_SIZE_DIRECTIVE(name) .size name,.-name + +#ifdef PIC +#define PLTJMP(_x) _x##@PLT +#else +#define PLTJMP(_x) _x +#endif + +#else + +#define ALIGNARG(log2) log2 +#define ASM_TYPE_DIRECTIVE(name,type) /* Nothing is specified. */ +#define ASM_SIZE_DIRECTIVE(name) /* Nothing is specified. */ + +#define PLTJMP(_x) _x + +#endif + +/* Define an entry point visible from C. */ +#define ENTRY(name) \ + ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name); \ + ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),function) \ + .align ALIGNARG(5); \ + C_LABEL(name) \ + CALL_MCOUNT + +#undef END +#define END(name) \ + ASM_SIZE_DIRECTIVE(C_SYMBOL_NAME(name)) + +/* If compiled for profiling, call `mcount' at the start of each function. */ +#ifdef PROF +#define CALL_MCOUNT /* NOTYET */ +#else +#define CALL_MCOUNT /* Do nothing. */ +#endif + +#ifdef NO_UNDERSCORES +/* Since C identifiers are not normally prefixed with an underscore + on this system, the asm identifier `syscall_error' intrudes on the + C name space. Make sure we use an innocuous name. */ +#define syscall_error __syscall_error +#define mcount _mcount +#endif + +#endif /* __ASSEMBLER__ */ diff -u -r -N glibc-2.1.3-original/sysdeps/unix/sh/sysdep.S glibc-2.1.3/sysdeps/unix/sh/sysdep.S --- glibc-2.1.3-original/sysdeps/unix/sh/sysdep.S Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/unix/sh/sysdep.S Sun Mar 12 04:09:09 2000 @@ -0,0 +1,102 @@ +/* Copyright (C) 1999, 2000 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 <sysdep.h> +#define _ERRNO_H +#include <bits/errno.h> + +ENTRY(__syscall_error) +#if defined (EWOULDBLOCK_sys) && EWOULDBLOCK_sys != EAGAIN + /* We translate the system's EWOULDBLOCK error into EAGAIN. + The GNU C library always defines EWOULDBLOCK==EAGAIN. + EWOULDBLOCK_sys is the original number. */ + mov.l .L1, r1 + cmp/eq r1, r0 + bf skip + nop + mov.l .L2, r0 +skip: +#endif + /* Store it in errno... */ +#ifndef PIC +#ifndef _LIBC_REENTRANT + mov.l .L3, r1 + mov.l r0, @r1 +#else + mov.l .L3, r1 + sts.l pr, @-r15 + jsr @r1 + mov.l r0, @-r15 + mov.l @r15+, r1 + lds.l @r15+, pr + mov.l r1, @r0 +#endif +#else + mov.l r12, @-r15 +#ifndef _LIBC_REENTRANT + mov r0, r2 + mov.l 0f, r12 + mova 0f, r0 + add r0, r12 + mov.l .L3, r0 + mov.l @(r0,r12), r1 + mov.l r2, @r1 +#else + mov.l r0, @-r15 + sts.l pr, @-r15 + mov.l 0f, r12 + mova 0f, r0 + add r0, r12 + mov.l .L3, r1 + mova .L3, r0 + add r0, r1 + jsr @r1 + nop + lds.l @r15+, pr + mov.l @r15+, r1 + mov.l r1, @r0 +#endif + mov.l @r15+, r12 +#endif + /* And just kick back a -1. */ + rts + mov #-1, r0 + + .align 2 +#if defined (EWOULDBLOCK_sys) && EWOULDBLOCK_sys != EAGAIN +.L1: .long EWOULDBLOCK_sys +.L2: .long EAGAIN +#endif +#ifndef PIC +#ifndef _LIBC_REENTRANT +.L3: .long C_SYMBOL_NAME(errno) +#else +.L3: .long C_SYMBOL_NAME(__errno_location) +#endif +#else +0: + .long _GLOBAL_OFFSET_TABLE_ +#ifndef _LIBC_REENTRANT +.L3: .long C_SYMBOL_NAME(errno@GOT) +#else +.L3: .long C_SYMBOL_NAME(__errno_location@PLT) +#endif +#endif +END(__syscall_error) + +weak_alias (__syscall_error, syscall_error) diff -u -r -N glibc-2.1.3-original/sysdeps/unix/sh/sysdep.h glibc-2.1.3/sysdeps/unix/sh/sysdep.h --- glibc-2.1.3-original/sysdeps/unix/sh/sysdep.h Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/unix/sh/sysdep.h Sun Mar 12 04:09:09 2000 @@ -0,0 +1,29 @@ +/* Copyright (C) 1999, 2000 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 <sysdeps/unix/sysdep.h> +#include <sysdeps/sh/sysdep.h> + +#ifdef __ASSEMBLER__ + +#define ret rts ; nop + +/* The sh move insn is s, d. */ +#define MOVE(x,y) mov x , y + +#endif diff -u -r -N glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/Dist glibc-2.1.3/sysdeps/unix/sysv/linux/sh/Dist --- glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/Dist Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/unix/sysv/linux/sh/Dist Sun Mar 12 04:09:09 2000 @@ -0,0 +1,12 @@ +clone.S +init-first.h +ioperm.c +pipe.S +setresuid.c +setresgid.c +setfsuid.c +setfsgid.c +sigrestorer.S +bits/shsigctx.h +sys/io.h +sys/user.h diff -u -r -N glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/Makefile glibc-2.1.3/sysdeps/unix/sysv/linux/sh/Makefile --- glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/Makefile Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/unix/sysv/linux/sh/Makefile Sun Mar 12 04:09:09 2000 @@ -0,0 +1,13 @@ +ifeq ($(subdir),io) +sysdep_routines += pipe +endif + +ifeq ($(subdir),misc) +sysdep_routines += setfsgid setfsuid setresgid setresuid ioperm +endif + +ifeq ($(subdir),signal) +sysdep_routines += rt_sigsuspend rt_sigprocmask rt_sigtimedwait \ + rt_sigqueueinfo rt_sigaction rt_sigpending \ + sigrestorer +endif diff -u -r -N glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/Versions glibc-2.1.3/sysdeps/unix/sysv/linux/sh/Versions --- glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/Versions Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/unix/sysv/linux/sh/Versions Sun Mar 12 04:20:49 2000 @@ -0,0 +1,4 @@ +libc { + GLIBC_2.1 { + } +} diff -u -r -N glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/bits/mman.h glibc-2.1.3/sysdeps/unix/sysv/linux/sh/bits/mman.h --- glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/bits/mman.h Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/unix/sysv/linux/sh/bits/mman.h Sun Mar 12 04:09:09 2000 @@ -0,0 +1,75 @@ +/* Definitions for POSIX memory map interface. Linux/SH version. + Copyright (C) 1997, 1999 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 _SYS_MMAN_H +# error "Never include this file directly. Use <sys/mman.h> instead" +#endif + +/* The following definitions basically come from the kernel headers. + But the kernel header is not namespace clean. */ + + +/* Protections are chosen from these bits, OR'd together. The + implementation does not necessarily support PROT_EXEC or PROT_WRITE + without PROT_READ. The only guarantees are that no writing will be + allowed without PROT_WRITE and no access will be allowed for PROT_NONE. */ + +#define PROT_READ 0x1 /* Page can be read. */ +#define PROT_WRITE 0x2 /* Page can be written. */ +#define PROT_EXEC 0x4 /* Page can be executed. */ +#define PROT_NONE 0x0 /* Page can not be accessed. */ + +/* Sharing types (must choose one and only one of these). */ +#define MAP_SHARED 0x01 /* Share changes. */ +#define MAP_PRIVATE 0x02 /* Changes are private. */ +#ifdef __USE_MISC +# define MAP_TYPE 0x0f /* Mask for type of mapping. */ +#endif + +/* Other flags. */ +#define MAP_FIXED 0x10 /* Interpret addr exactly. */ +#ifdef __USE_MISC +# define MAP_FILE 0 +# define MAP_ANONYMOUS 0x20 /* Don't use a file. */ +# define MAP_ANON MAP_ANONYMOUS +#endif + +/* These are Linux-specific. */ +#ifdef __USE_MISC +# define MAP_GROWSDOWN 0x0100 /* Stack-like segment. */ +# define MAP_DENYWRITE 0x0800 /* ETXTBSY */ +# define MAP_EXECUTABLE 0x1000 /* Mark it as an executable. */ +# define MAP_LOCKED 0x2000 /* Lock the mapping. */ +# define MAP_NORESERVE 0x4000 /* Don't check for reservations. */ +#endif + +/* Flags to `msync'. */ +#define MS_ASYNC 1 /* Sync memory asynchronously. */ +#define MS_SYNC 4 /* Synchronous memory sync. */ +#define MS_INVALIDATE 2 /* Invalidate the caches. */ + +/* Flags for `mlockall'. */ +#define MCL_CURRENT 1 /* Lock all currently mapped pages. */ +#define MCL_FUTURE 2 /* Lock all additions to address + space. */ + +/* Flags for `mremap'. */ +#ifdef __USE_GNU +# define MREMAP_MAYMOVE 1 +#endif diff -u -r -N glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/brk.c glibc-2.1.3/sysdeps/unix/sysv/linux/sh/brk.c --- glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/brk.c Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/unix/sysv/linux/sh/brk.c Thu Apr 27 21:26:38 2000 @@ -0,0 +1,48 @@ +/* brk system call for Linux/SH. + Copyright (C) 1999, 2000 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 <errno.h> +#include <unistd.h> +#include <sysdep.h> + +/* This must be initialized data because commons can't have aliases. */ +void *__curbrk = 0; + +int +__brk (void *addr) +{ + void *newbrk; + register long __r3 __asm__ ("$r3") = (long) SYS_ify (brk); + register long __r4 __asm__ ("$r4") = (long) addr; + + asm ("trapa #0x11\n" /* do the system call */ + : "=z" (newbrk) + : "r" (__r3), "r" (__r4)); + + __curbrk = newbrk; + + if (newbrk < addr) + { + __set_errno (ENOMEM); + return -1; + } + + return 0; +} +weak_alias (__brk, brk) diff -u -r -N glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/clone.S glibc-2.1.3/sysdeps/unix/sysv/linux/sh/clone.S --- glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/clone.S Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/unix/sysv/linux/sh/clone.S Thu Apr 27 21:26:38 2000 @@ -0,0 +1,133 @@ +/* Copyright (C) 1999, 2000 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. */ + +/* 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 <sysdep.h> +#define _ERRNO_H 1 +#include <bits/errno.h> + +/* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg); */ + + .text +ENTRY(__clone) + /* sanity check arguments. */ + tst r4, r4 + bf/s 1f + tst r5, r5 + bf/s 1f + mov.l .L1, r1 +#ifdef PIC + mov.l r12, @-r15 + sts.l pr, @-r15 + mov.l .LG, r12 + mova .LG, r0 + add r0, r12 + mova .L1, r0 + add r0, r1 + jsr @r1 + mov #-EINVAL, r4 + lds.l @r15+, pr + rts + mov.l @r15+, r12 +#else + jmp @r1 + mov #-EINVAL, r4 +#endif + .align 2 +.L1: + .long PLTJMP(C_SYMBOL_NAME(__syscall_error)) +1: + /* insert the args onto the new stack */ + mov.l r7, @-r5 + /* save the function pointer as the 0th element */ + mov.l r4, @-r5 + + /* do the system call */ + mov $r6, $r4 + mov #+SYS_ify(clone), $r3 + trapa #0x12 + mov $r0, $r1 + mov #-12, $r2 + shad $r2, $r1 + not r1, r1 // r1=0 means r0 = -1 to -4095 + tst r1, r1 // i.e. error in linux + bf 2f + mov.l .L2, r1 +#ifdef PIC + mov r0, r4 + mov.l r12, @-r15 + sts.l pr, @-r15 + mov.l .LG, r12 + mova .LG, r0 + add r0, r12 + mova .L2, r0 + add r0, r1 + jsr @r1 + nop + lds.l @r15+, pr + rts + mov.l @r15+, r12 +#else + jmp @r1 + mov r0, r4 +#endif + .align 2 +.L2: + .long PLTJMP(C_SYMBOL_NAME(__syscall_error)) + +2: + tst r0, r0 + bt 3f + rts + nop +3: + /* thread starts */ + mov.l @r15, r1 + jsr @r1 + mov.l @(4,r15), r4 + + /* we are done, passing the return value through r0 */ + mov.l .L3, r1 +#ifdef PIC + mov.l r12, @-r15 + sts.l pr, @-r15 + mov r0, r4 + mova .LG, r0 + mov.l .LG, r12 + add r0, r12 + mova .L3, r0 + add r0, r1 + jsr @r1 + nop + lds.l @r15+, pr + rts + mov.l @r15+, r12 +#else + jmp @r1 + mov r0, r4 +#endif + .align 2 +.LG: + .long _GLOBAL_OFFSET_TABLE_ +.L3: + .long PLTJMP(C_SYMBOL_NAME(_exit)) +PSEUDO_END (__clone) + +weak_alias (__clone, clone) diff -u -r -N glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/errlist.c glibc-2.1.3/sysdeps/unix/sysv/linux/sh/errlist.c --- glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/errlist.c Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/unix/sysv/linux/sh/errlist.c Sun Mar 12 04:09:09 2000 @@ -0,0 +1,55 @@ +/* Copyright (C) 1998, 1999, 2000 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 <sizes.h> +#include <errlist.h> + +#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING + +# define SYS_ERRLIST __new_sys_errlist +# define SYS_NERR __new_sys_nerr + +asm (".data; .globl __old_sys_errlist; __old_sys_errlist:"); +#endif + +#include <sysdeps/gnu/errlist.c> + +#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING +asm (".type __old_sys_errlist,%object;.size __old_sys_errlist," + OLD_ERRLIST_SIZE_STR "*" PTR_SIZE_STR); + +extern const char *const *__old_sys_errlist; + +const int __old_sys_nerr = OLD_ERRLIST_SIZE; + +strong_alias (__old_sys_nerr, _old_sys_nerr); +weak_alias (__old_sys_nerr, _old_sys_nerr) +symbol_version (__old_sys_nerr, _sys_nerr, GLIBC_2.0); +symbol_version (_old_sys_nerr, sys_nerr, GLIBC_2.0); +weak_alias (__old_sys_errlist, _old_sys_errlist); +symbol_version (__old_sys_errlist, _sys_errlist, GLIBC_2.0); +symbol_version (_old_sys_errlist, sys_errlist, GLIBC_2.0); + +weak_alias (__new_sys_nerr, _new_sys_nerr) +default_symbol_version (__new_sys_nerr, _sys_nerr, GLIBC_2.1); +default_symbol_version (_new_sys_nerr, sys_nerr, GLIBC_2.1); +weak_alias (__new_sys_errlist, _new_sys_errlist) +default_symbol_version (__new_sys_errlist, _sys_errlist, GLIBC_2.1); +default_symbol_version (_new_sys_errlist, sys_errlist, GLIBC_2.1); + +#endif diff -u -r -N glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/getgroups.c glibc-2.1.3/sysdeps/unix/sysv/linux/sh/getgroups.c --- glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/getgroups.c Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/unix/sysv/linux/sh/getgroups.c Sun Mar 12 04:09:09 2000 @@ -0,0 +1,2 @@ +/* We also have to rewrite the kernel gid_t to the user land type. */ +#include <sysdeps/unix/sysv/linux/i386/getgroups.c> diff -u -r -N glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/init-first.h glibc-2.1.3/sysdeps/unix/sysv/linux/sh/init-first.h --- glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/init-first.h Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/unix/sysv/linux/sh/init-first.h Sun Mar 12 04:09:09 2000 @@ -0,0 +1,52 @@ +/* Prepare arguments for library initialization function. + Copyright (C) 1999, 2000 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. */ + +#define SYSDEP_CALL_INIT(NAME, INIT) \ +void NAME (void *arg, void *arg1, void *arg2, void *arg3, void *argp) \ +{ \ + int argc; \ + char** argv; \ + char** envp; \ + /* The next variable is only here to work around a bug in gcc <= 2.7.2.2. \ + If the address would be taken inside the expression the optimizer \ + would try to be too smart and throws it away. Grrr. */ \ + int *dummy_addr = &_dl_starting_up; \ + \ + __libc_multiple_libcs = dummy_addr && !_dl_starting_up; \ + \ + if (!__libc_multiple_libcs) \ + { \ + /* In SH, argp is the first argument on stack. */ \ + argc = *(int*) (&argp); \ + argv = (char **) &argp + 1; \ + envp = &argv[argc+1]; \ + } \ + else \ + { \ + argc = (int) arg; \ + argv = (char**) arg1; \ + envp = (char**) arg2; \ + } \ + \ + INIT (argc, argv, envp); \ +} diff -u -r -N glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/pipe.S glibc-2.1.3/sysdeps/unix/sysv/linux/sh/pipe.S --- glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/pipe.S Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/unix/sysv/linux/sh/pipe.S Thu Apr 27 21:26:38 2000 @@ -0,0 +1,63 @@ +/* Copyright (C) 1999, 2000 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 <sysdep.h> + +ENTRY (__libc_pipe) + mov #+__NR_pipe, $r3 + trapa #0x10 + mov r0, r3 + mov #-12, r2 + shad r2, r3 + not r3, r3 // r1=0 means r0 = -1 to -4095 + tst r3, r3 // i.e. error in linux + bf 1f + mov.l .L2, r1 +#ifdef PIC + mov r0, r4 + mov.l r12, @-r15 + sts.l pr, @-r15 + mov.l 0f, r12 + mova 0f, r0 + add r0, r12 + mova .L2, r0 + add r0, r1 + jsr @r1 + nop + lds.l @r15+, pr + rts + mov.l @r15+, r12 + .align 2 +0: + .long _GLOBAL_OFFSET_TABLE_ +#else + jmp @r1 + mov r0, r4 +#endif +1: + mov.l r0, @r4 + mov.l r1, @(4, r4) + rts + mov #0, r0 + .align 2 +.L2: + .long PLTJMP(C_SYMBOL_NAME(__syscall_error)) +PSEUDO_END (__libc_pipe) + +weak_alias (__libc_pipe, __pipe) +weak_alias (__libc_pipe, pipe) diff -u -r -N glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/pread.c glibc-2.1.3/sysdeps/unix/sysv/linux/sh/pread.c --- glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/pread.c Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/unix/sysv/linux/sh/pread.c Sun Mar 12 04:09:09 2000 @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/pread.c> diff -u -r -N glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/pread64.c glibc-2.1.3/sysdeps/unix/sysv/linux/sh/pread64.c --- glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/pread64.c Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/unix/sysv/linux/sh/pread64.c Sun Mar 12 04:09:09 2000 @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/pread64.c> diff -u -r -N glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/profil-counter.h glibc-2.1.3/sysdeps/unix/sysv/linux/sh/profil-counter.h --- glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/profil-counter.h Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/unix/sysv/linux/sh/profil-counter.h Sun Mar 12 04:09:09 2000 @@ -0,0 +1,28 @@ +/* Low-level statistical profiling support function. Linux/SH version. + Copyright (C) 1996, 1997, 1998, 2000 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 <signal.h> + +void +profil_counter (int signo, int _a2, int _a3, int _a4, struct sigcontext sc) +{ + void *pc; + pc = (void *) sc.sc_pc; + profil_count (pc); +} diff -u -r -N glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/pwrite.c glibc-2.1.3/sysdeps/unix/sysv/linux/sh/pwrite.c --- glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/pwrite.c Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/unix/sysv/linux/sh/pwrite.c Sun Mar 12 04:09:09 2000 @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/pwrite.c> diff -u -r -N glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/pwrite64.c glibc-2.1.3/sysdeps/unix/sysv/linux/sh/pwrite64.c --- glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/pwrite64.c Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/unix/sysv/linux/sh/pwrite64.c Sun Mar 12 04:09:09 2000 @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/pwrite64.c> diff -u -r -N glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/setegid.c glibc-2.1.3/sysdeps/unix/sysv/linux/sh/setegid.c --- glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/setegid.c Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/unix/sysv/linux/sh/setegid.c Sun Mar 12 04:09:09 2000 @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/setegid.c> diff -u -r -N glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/seteuid.c glibc-2.1.3/sysdeps/unix/sysv/linux/sh/seteuid.c --- glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/seteuid.c Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/unix/sysv/linux/sh/seteuid.c Sun Mar 12 04:09:10 2000 @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/seteuid.c> diff -u -r -N glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/setfsgid.c glibc-2.1.3/sysdeps/unix/sysv/linux/sh/setfsgid.c --- glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/setfsgid.c Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/unix/sysv/linux/sh/setfsgid.c Sun Mar 12 04:09:10 2000 @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/setfsgid.c> diff -u -r -N glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/setfsuid.c glibc-2.1.3/sysdeps/unix/sysv/linux/sh/setfsuid.c --- glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/setfsuid.c Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/unix/sysv/linux/sh/setfsuid.c Sun Mar 12 04:09:10 2000 @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/setfsuid.c> diff -u -r -N glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/setgid.c glibc-2.1.3/sysdeps/unix/sysv/linux/sh/setgid.c --- glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/setgid.c Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/unix/sysv/linux/sh/setgid.c Sun Mar 12 04:09:10 2000 @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/setgid.c> diff -u -r -N glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/setgroups.c glibc-2.1.3/sysdeps/unix/sysv/linux/sh/setgroups.c --- glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/setgroups.c Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/unix/sysv/linux/sh/setgroups.c Sun Mar 12 04:09:10 2000 @@ -0,0 +1,2 @@ +/* We also have to rewrite the kernel gid_t to the user land type. */ +#include <sysdeps/unix/sysv/linux/i386/setgroups.c> diff -u -r -N glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/setregid.c glibc-2.1.3/sysdeps/unix/sysv/linux/sh/setregid.c --- glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/setregid.c Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/unix/sysv/linux/sh/setregid.c Sun Mar 12 04:09:10 2000 @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/setregid.c> diff -u -r -N glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/setresgid.c glibc-2.1.3/sysdeps/unix/sysv/linux/sh/setresgid.c --- glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/setresgid.c Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/unix/sysv/linux/sh/setresgid.c Sun Mar 12 04:09:10 2000 @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/setresgid.c> diff -u -r -N glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/setresuid.c glibc-2.1.3/sysdeps/unix/sysv/linux/sh/setresuid.c --- glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/setresuid.c Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/unix/sysv/linux/sh/setresuid.c Sun Mar 12 04:09:10 2000 @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/setresuid.c> diff -u -r -N glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/setreuid.c glibc-2.1.3/sysdeps/unix/sysv/linux/sh/setreuid.c --- glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/setreuid.c Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/unix/sysv/linux/sh/setreuid.c Sun Mar 12 04:09:10 2000 @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/setreuid.c> diff -u -r -N glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/setuid.c glibc-2.1.3/sysdeps/unix/sysv/linux/sh/setuid.c --- glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/setuid.c Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/unix/sysv/linux/sh/setuid.c Sun Mar 12 04:09:10 2000 @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/setuid.c> diff -u -r -N glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/sh3/register-dump.h glibc-2.1.3/sysdeps/unix/sysv/linux/sh/sh3/register-dump.h --- glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/sh3/register-dump.h Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/unix/sysv/linux/sh/sh3/register-dump.h Sun Mar 12 04:09:10 2000 @@ -0,0 +1,151 @@ +/* Dump registers. + Copyright (C) 1999, 2000 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 <sys/uio.h> +#include <stdio-common/_itoa.h> + +/* We will print the register dump in this format: + + R0: XXXXXXXX R1: XXXXXXXX R2: XXXXXXXX R3: XXXXXXXX + R4: XXXXXXXX R5: XXXXXXXX R6: XXXXXXXX R7: XXXXXXXX + R8: XXXXXXXX R9: XXXXXXXX R10: XXXXXXXX R11: XXXXXXXX + R12: XXXXXXXX R13: XXXXXXXX R14: XXXXXXXX R15: XXXXXXXX + +MACL: XXXXXXXX MACH: XXXXXXXX + + PC: XXXXXXXX PR: XXXXXXXX GBR: XXXXXXXX SR: XXXXXXXX + + FR0: XXXXXXXX FR1: XXXXXXXX FR2: XXXXXXXX FR3: XXXXXXXX + FR4: XXXXXXXX FR5: XXXXXXXX FR6: XXXXXXXX FR7: XXXXXXXX + FR8: XXXXXXXX FR9: XXXXXXXX FR10: XXXXXXXX FR11: XXXXXXXX +FR12: XXXXXXXX FR13: XXXXXXXX FR14: XXXXXXXX FR15: XXXXXXXX + + XR0: XXXXXXXX XR1: XXXXXXXX XR2: XXXXXXXX XR3: XXXXXXXX + XR4: XXXXXXXX XR5: XXXXXXXX XR6: XXXXXXXX XR7: XXXXXXXX + XR8: XXXXXXXX XR9: XXXXXXXX XR10: XXXXXXXX XR11: XXXXXXXX +XR12: XXXXXXXX XR13: XXXXXXXX XR14: XXXXXXXX XR15: XXXXXXXX + +FPSCR: XXXXXXXX FPUL: XXXXXXXX + + */ + +static void +hexvalue (unsigned long int value, char *buf, size_t len) +{ + char *cp = _itoa_word (value, buf + len, 16, 0); + while (cp > buf) + *--cp = '0'; +} + +static void +register_dump (int fd, struct sigcontext *ctx) +{ + char regs[22][8]; + struct iovec iov[112]; + size_t nr = 0; + +#define ADD_STRING(str) \ + iov[nr].iov_base = (char *) str; \ + iov[nr].iov_len = strlen (str); \ + ++nr +#define ADD_MEM(str, len) \ + iov[nr].iov_base = str; \ + iov[nr].iov_len = len; \ + ++nr + + /* Generate strings of register contents. */ + hexvalue (ctx->sc_regs[0], regs[0], 8); + hexvalue (ctx->sc_regs[1], regs[1], 8); + hexvalue (ctx->sc_regs[2], regs[2], 8); + hexvalue (ctx->sc_regs[3], regs[3], 8); + hexvalue (ctx->sc_regs[4], regs[4], 8); + hexvalue (ctx->sc_regs[5], regs[5], 8); + hexvalue (ctx->sc_regs[6], regs[6], 8); + hexvalue (ctx->sc_regs[7], regs[7], 8); + hexvalue (ctx->sc_regs[8], regs[8], 8); + hexvalue (ctx->sc_regs[9], regs[9], 8); + hexvalue (ctx->sc_regs[10], regs[10], 8); + hexvalue (ctx->sc_regs[11], regs[11], 8); + hexvalue (ctx->sc_regs[12], regs[12], 8); + hexvalue (ctx->sc_regs[13], regs[13], 8); + hexvalue (ctx->sc_regs[14], regs[14], 8); + hexvalue (ctx->sc_regs[15], regs[15], 8); + hexvalue (ctx->sc_macl, regs[16], 8); + hexvalue (ctx->sc_mach, regs[17], 8); + hexvalue (ctx->sc_pc, regs[18], 8); + hexvalue (ctx->sc_pr, regs[19], 8); + hexvalue (ctx->sc_gbr, regs[20], 8); + hexvalue (ctx->sc_sr, regs[21], 8); + + /* Generate the output. */ + ADD_STRING ("Register dump:\n\n R0: "); + ADD_MEM (regs[0], 8); + ADD_STRING (" R1: "); + ADD_MEM (regs[1], 8); + ADD_STRING (" R2: "); + ADD_MEM (regs[2], 8); + ADD_STRING (" R3: "); + ADD_MEM (regs[3], 8); + ADD_STRING ("\n R4: "); + ADD_MEM (regs[4], 8); + ADD_STRING (" R5: "); + ADD_MEM (regs[5], 8); + ADD_STRING (" R6: "); + ADD_MEM (regs[6], 8); + ADD_STRING (" R7: "); + ADD_MEM (regs[7], 8); + ADD_STRING ("\n R8: "); + ADD_MEM (regs[8], 8); + ADD_STRING (" R9: "); + ADD_MEM (regs[9], 8); + ADD_STRING (" R10: "); + ADD_MEM (regs[10], 8); + ADD_STRING (" R11: "); + ADD_MEM (regs[11], 8); + ADD_STRING ("\n R12: "); + ADD_MEM (regs[12], 8); + ADD_STRING (" R13: "); + ADD_MEM (regs[13], 8); + ADD_STRING (" R14: "); + ADD_MEM (regs[14], 8); + ADD_STRING (" R15: "); + ADD_MEM (regs[15], 8); + + ADD_STRING ("\n\nMACL: "); + ADD_MEM (regs[16], 8); + ADD_STRING (" MACH: "); + ADD_MEM (regs[17], 8); + + ADD_STRING ("\n\n PC: "); + ADD_MEM (regs[18], 8); + ADD_STRING (" PR: "); + ADD_MEM (regs[19], 8); + ADD_STRING (" GBR: "); + ADD_MEM (regs[20], 8); + ADD_STRING (" SR: "); + ADD_MEM (regs[21], 8); + + ADD_STRING ("\n"); + + /* Write the stuff out. */ + writev (fd, iov, nr); +} + + +#define REGISTER_DUMP register_dump (fd, &ctx) diff -u -r -N glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/sh4/register-dump.h glibc-2.1.3/sysdeps/unix/sysv/linux/sh/sh4/register-dump.h --- glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/sh4/register-dump.h Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/unix/sysv/linux/sh/sh4/register-dump.h Sun Mar 12 04:09:10 2000 @@ -0,0 +1,262 @@ +/* Dump registers. + Copyright (C) 1999, 2000 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 <sys/uio.h> +#include <stdio-common/_itoa.h> + +/* We will print the register dump in this format: + + R0: XXXXXXXX R1: XXXXXXXX R2: XXXXXXXX R3: XXXXXXXX + R4: XXXXXXXX R5: XXXXXXXX R6: XXXXXXXX R7: XXXXXXXX + R8: XXXXXXXX R9: XXXXXXXX R10: XXXXXXXX R11: XXXXXXXX + R12: XXXXXXXX R13: XXXXXXXX R14: XXXXXXXX R15: XXXXXXXX + +MACL: XXXXXXXX MACH: XXXXXXXX + + PC: XXXXXXXX PR: XXXXXXXX GBR: XXXXXXXX SR: XXXXXXXX + + FR0: XXXXXXXX FR1: XXXXXXXX FR2: XXXXXXXX FR3: XXXXXXXX + FR4: XXXXXXXX FR5: XXXXXXXX FR6: XXXXXXXX FR7: XXXXXXXX + FR8: XXXXXXXX FR9: XXXXXXXX FR10: XXXXXXXX FR11: XXXXXXXX +FR12: XXXXXXXX FR13: XXXXXXXX FR14: XXXXXXXX FR15: XXXXXXXX + + XR0: XXXXXXXX XR1: XXXXXXXX XR2: XXXXXXXX XR3: XXXXXXXX + XR4: XXXXXXXX XR5: XXXXXXXX XR6: XXXXXXXX XR7: XXXXXXXX + XR8: XXXXXXXX XR9: XXXXXXXX XR10: XXXXXXXX XR11: XXXXXXXX +XR12: XXXXXXXX XR13: XXXXXXXX XR14: XXXXXXXX XR15: XXXXXXXX + +FPSCR: XXXXXXXX FPUL: XXXXXXXX + + */ + +static void +hexvalue (unsigned long int value, char *buf, size_t len) +{ + char *cp = _itoa_word (value, buf + len, 16, 0); + while (cp > buf) + *--cp = '0'; +} + +static void +register_dump (int fd, struct sigcontext *ctx) +{ + char regs[22][8]; + char fpregs[34][8]; + struct iovec iov[112]; + size_t nr = 0; + +#define ADD_STRING(str) \ + iov[nr].iov_base = (char *) str; \ + iov[nr].iov_len = strlen (str); \ + ++nr +#define ADD_MEM(str, len) \ + iov[nr].iov_base = str; \ + iov[nr].iov_len = len; \ + ++nr + + /* Generate strings of register contents. */ + hexvalue (ctx->sc_regs[0], regs[0], 8); + hexvalue (ctx->sc_regs[1], regs[1], 8); + hexvalue (ctx->sc_regs[2], regs[2], 8); + hexvalue (ctx->sc_regs[3], regs[3], 8); + hexvalue (ctx->sc_regs[4], regs[4], 8); + hexvalue (ctx->sc_regs[5], regs[5], 8); + hexvalue (ctx->sc_regs[6], regs[6], 8); + hexvalue (ctx->sc_regs[7], regs[7], 8); + hexvalue (ctx->sc_regs[8], regs[8], 8); + hexvalue (ctx->sc_regs[9], regs[9], 8); + hexvalue (ctx->sc_regs[10], regs[10], 8); + hexvalue (ctx->sc_regs[11], regs[11], 8); + hexvalue (ctx->sc_regs[12], regs[12], 8); + hexvalue (ctx->sc_regs[13], regs[13], 8); + hexvalue (ctx->sc_regs[14], regs[14], 8); + hexvalue (ctx->sc_regs[15], regs[15], 8); + hexvalue (ctx->sc_macl, regs[16], 8); + hexvalue (ctx->sc_mach, regs[17], 8); + hexvalue (ctx->sc_pc, regs[18], 8); + hexvalue (ctx->sc_pr, regs[19], 8); + hexvalue (ctx->sc_gbr, regs[20], 8); + hexvalue (ctx->sc_sr, regs[21], 8); + + /* Generate the output. */ + ADD_STRING ("Register dump:\n\n R0: "); + ADD_MEM (regs[0], 8); + ADD_STRING (" R1: "); + ADD_MEM (regs[1], 8); + ADD_STRING (" R2: "); + ADD_MEM (regs[2], 8); + ADD_STRING (" R3: "); + ADD_MEM (regs[3], 8); + ADD_STRING ("\n R4: "); + ADD_MEM (regs[4], 8); + ADD_STRING (" R5: "); + ADD_MEM (regs[5], 8); + ADD_STRING (" R6: "); + ADD_MEM (regs[6], 8); + ADD_STRING (" R7: "); + ADD_MEM (regs[7], 8); + ADD_STRING ("\n R8: "); + ADD_MEM (regs[8], 8); + ADD_STRING (" R9: "); + ADD_MEM (regs[9], 8); + ADD_STRING (" R10: "); + ADD_MEM (regs[10], 8); + ADD_STRING (" R11: "); + ADD_MEM (regs[11], 8); + ADD_STRING ("\n R12: "); + ADD_MEM (regs[12], 8); + ADD_STRING (" R13: "); + ADD_MEM (regs[13], 8); + ADD_STRING (" R14: "); + ADD_MEM (regs[14], 8); + ADD_STRING (" R15: "); + ADD_MEM (regs[15], 8); + + ADD_STRING ("\n\nMACL: "); + ADD_MEM (regs[16], 8); + ADD_STRING (" MACH: "); + ADD_MEM (regs[17], 8); + + ADD_STRING ("\n\n PC: "); + ADD_MEM (regs[18], 8); + ADD_STRING (" PR: "); + ADD_MEM (regs[19], 8); + ADD_STRING (" GBR: "); + ADD_MEM (regs[20], 8); + ADD_STRING (" SR: "); + ADD_MEM (regs[21], 8); + + ADD_STRING ("\n"); + + if (ctx->sc_ownedfp != NULL) + { + hexvalue (ctx->sc_fpregs[0], fpregs[0], 8); + hexvalue (ctx->sc_fpregs[1], fpregs[1], 8); + hexvalue (ctx->sc_fpregs[2], fpregs[2], 8); + hexvalue (ctx->sc_fpregs[3], fpregs[3], 8); + hexvalue (ctx->sc_fpregs[4], fpregs[4], 8); + hexvalue (ctx->sc_fpregs[5], fpregs[5], 8); + hexvalue (ctx->sc_fpregs[6], fpregs[6], 8); + hexvalue (ctx->sc_fpregs[7], fpregs[7], 8); + hexvalue (ctx->sc_fpregs[8], fpregs[8], 8); + hexvalue (ctx->sc_fpregs[9], fpregs[9], 8); + hexvalue (ctx->sc_fpregs[10], fpregs[10], 8); + hexvalue (ctx->sc_fpregs[11], fpregs[11], 8); + hexvalue (ctx->sc_fpregs[12], fpregs[12], 8); + hexvalue (ctx->sc_fpregs[13], fpregs[13], 8); + hexvalue (ctx->sc_fpregs[14], fpregs[14], 8); + hexvalue (ctx->sc_fpregs[15], fpregs[15], 8); + hexvalue (ctx->sc_xfpregs[0], fpregs[16], 8); + hexvalue (ctx->sc_xfpregs[1], fpregs[17], 8); + hexvalue (ctx->sc_xfpregs[2], fpregs[18], 8); + hexvalue (ctx->sc_xfpregs[3], fpregs[19], 8); + hexvalue (ctx->sc_xfpregs[4], fpregs[20], 8); + hexvalue (ctx->sc_xfpregs[5], fpregs[21], 8); + hexvalue (ctx->sc_xfpregs[6], fpregs[22], 8); + hexvalue (ctx->sc_xfpregs[7], fpregs[23], 8); + hexvalue (ctx->sc_xfpregs[8], fpregs[24], 8); + hexvalue (ctx->sc_xfpregs[9], fpregs[25], 8); + hexvalue (ctx->sc_xfpregs[10], fpregs[26], 8); + hexvalue (ctx->sc_xfpregs[11], fpregs[27], 8); + hexvalue (ctx->sc_xfpregs[12], fpregs[28], 8); + hexvalue (ctx->sc_xfpregs[13], fpregs[29], 8); + hexvalue (ctx->sc_xfpregs[14], fpregs[30], 8); + hexvalue (ctx->sc_xfpregs[15], fpregs[31], 8); + hexvalue (ctx->sc_fpscr, fpregs[32], 8); + hexvalue (ctx->sc_fpul, fpregs[33], 8); + + ADD_STRING ("\n\n FR0: "); + ADD_MEM (fpregs[0], 8); + ADD_STRING (" FR1: "); + ADD_MEM (fpregs[1], 8); + ADD_STRING (" FR2: "); + ADD_MEM (fpregs[2], 8); + ADD_STRING (" FR3: "); + ADD_MEM (fpregs[3], 8); + ADD_STRING ("\n FR4: "); + ADD_MEM (fpregs[4], 8); + ADD_STRING (" FR5: "); + ADD_MEM (fpregs[5], 8); + ADD_STRING (" FR6: "); + ADD_MEM (fpregs[6], 8); + ADD_STRING (" FR7: "); + ADD_MEM (fpregs[7], 8); + ADD_STRING ("\n FR8: "); + ADD_MEM (fpregs[8], 8); + ADD_STRING (" FR9: "); + ADD_MEM (fpregs[9], 8); + ADD_STRING (" FR10: "); + ADD_MEM (fpregs[10], 8); + ADD_STRING (" FR11: "); + ADD_MEM (fpregs[11], 8); + ADD_STRING ("\nFR12: "); + ADD_MEM (fpregs[12], 8); + ADD_STRING (" FR13: "); + ADD_MEM (fpregs[13], 8); + ADD_STRING (" FR14: "); + ADD_MEM (fpregs[14], 8); + ADD_STRING (" FR15: "); + ADD_MEM (fpregs[15], 8); + ADD_STRING ("\n\n XR0: "); + ADD_MEM (fpregs[16], 8); + ADD_STRING (" XR1: "); + ADD_MEM (fpregs[17], 8); + ADD_STRING (" XR2: "); + ADD_MEM (fpregs[18], 8); + ADD_STRING (" XR3: "); + ADD_MEM (fpregs[19], 8); + ADD_STRING ("\n XR4: "); + ADD_MEM (fpregs[20], 8); + ADD_STRING (" XR5: "); + ADD_MEM (fpregs[21], 8); + ADD_STRING (" XR6: "); + ADD_MEM (fpregs[22], 8); + ADD_STRING (" XR7: "); + ADD_MEM (fpregs[23], 8); + ADD_STRING ("\n XR8: "); + ADD_MEM (fpregs[24], 8); + ADD_STRING (" XR9: "); + ADD_MEM (fpregs[25], 8); + ADD_STRING (" XR10: "); + ADD_MEM (fpregs[26], 8); + ADD_STRING (" XR11: "); + ADD_MEM (fpregs[27], 8); + ADD_STRING ("\nXR12: "); + ADD_MEM (fpregs[28], 8); + ADD_STRING (" XR13: "); + ADD_MEM (fpregs[29], 8); + ADD_STRING (" XR14: "); + ADD_MEM (fpregs[30], 8); + ADD_STRING (" XR15: "); + ADD_MEM (fpregs[31], 8); + + ADD_STRING ("\n\nFPSCR: "); + ADD_MEM (fpregs[32], 8); + ADD_STRING (" FPUL: "); + ADD_MEM (fpregs[33], 8); + + ADD_STRING ("\n"); + } + + /* Write the stuff out. */ + writev (fd, iov, nr); +} + + +#define REGISTER_DUMP register_dump (fd, &ctx) diff -u -r -N glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/sigaction.c glibc-2.1.3/sysdeps/unix/sysv/linux/sh/sigaction.c --- glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/sigaction.c Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/unix/sysv/linux/sh/sigaction.c Sun Mar 12 04:09:10 2000 @@ -0,0 +1,150 @@ +/* Copyright (C) 1997, 1998, 1999, 2000 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 <errno.h> +#include <signal.h> +#include <string.h> + +#include <sysdep.h> +#include <sys/syscall.h> + +/* The difference here is that the sigaction structure used in the + kernel is not the same as we use in the libc. Therefore we must + translate it here. */ +#include <kernel_sigaction.h> + +extern int __syscall_sigaction (int, const struct old_kernel_sigaction *, + struct old_kernel_sigaction *); +extern int __syscall_rt_sigaction (int, const struct kernel_sigaction *, + struct kernel_sigaction *, size_t); + +/* The variable is shared between all wrappers around signal handling + functions which have RT equivalents. */ +int __libc_missing_rt_sigs; + +#define SA_RESTORER 0x04000000 + +extern void __default_sa_restorer(void); +extern void __default_rt_sa_restorer(void); + +/* When RT signals are in use we need to use a different return stub. */ +#ifdef __NR_rt_sigreturn +#define choose_restorer(flags) \ + (flags & SA_SIGINFO) ? __default_rt_sa_restorer \ + : __default_sa_restorer +#else +#define choose_restorer(flags) \ + __default_sa_restorer +#endif + +/* If ACT is not NULL, change the action for SIG to *ACT. + If OACT is not NULL, put the old action for SIG in *OACT. */ +int +__sigaction (sig, act, oact) + int sig; + const struct sigaction *act; + struct sigaction *oact; +{ + struct old_kernel_sigaction k_sigact, k_osigact; + int result; + +#ifdef __NR_rt_sigaction + /* First try the RT signals. */ + if (!__libc_missing_rt_sigs) + { + struct kernel_sigaction kact, koact; + int saved_errno = errno; + + if (act) + { + kact.k_sa_handler = act->sa_handler; + memcpy (&kact.sa_mask, &act->sa_mask, sizeof (sigset_t)); + kact.sa_flags = act->sa_flags; +# ifdef HAVE_SA_RESTORER + /* If the user specified SA_ONSTACK this means she is trying to + use the old-style stack switching. Unfortunately this + requires the sa_restorer field so we cannot install our own + handler. (In fact the user is likely to be out of luck anyway + since the kernel currently only supports stack switching via + the X/Open sigaltstack interface, but we allow for the + possibility that this might change in the future.) */ + if (kact.sa_flags & (SA_RESTORER | SA_ONSTACK)) + kact.sa_restorer = act->sa_restorer; + else + { + kact.sa_restorer = choose_restorer (kact.sa_flags); + kact.sa_flags |= SA_RESTORER; + } +# endif + } + + /* XXX The size argument hopefully will have to be changed to the + real size of the user-level sigset_t. */ + result = INLINE_SYSCALL (rt_sigaction, 4, sig, act ? &kact : NULL, + oact ? &koact : NULL, _NSIG / 8); + + if (result >= 0 || errno != ENOSYS) + { + if (oact && result >= 0) + { + oact->sa_handler = koact.k_sa_handler; + memcpy (&oact->sa_mask, &koact.sa_mask, sizeof (sigset_t)); + oact->sa_flags = koact.sa_flags; +# ifdef HAVE_SA_RESTORER + oact->sa_restorer = koact.sa_restorer; +# endif + } + return result; + } + + __set_errno (saved_errno); + __libc_missing_rt_sigs = 1; + } +#endif + + if (act) + { + k_sigact.k_sa_handler = act->sa_handler; + k_sigact.sa_mask = act->sa_mask.__val[0]; + k_sigact.sa_flags = act->sa_flags; +#ifdef HAVE_SA_RESTORER + /* See the comments above for why we test SA_ONSTACK. */ + if (k_sigact.sa_flags & (SA_RESTORER | SA_ONSTACK)) + k_sigact.sa_restorer = act->sa_restorer; + else + { + k_sigact.sa_restorer = choose_restorer (k_sigact.sa_flags); + k_sigact.sa_flags |= SA_RESTORER; + } +#endif + } + result = INLINE_SYSCALL (sigaction, 3, sig, act ? &k_sigact : NULL, + oact ? &k_osigact : NULL); + if (oact && result >= 0) + { + oact->sa_handler = k_osigact.k_sa_handler; + oact->sa_mask.__val[0] = k_osigact.sa_mask; + oact->sa_flags = k_osigact.sa_flags; +#ifdef HAVE_SA_RESTORER + oact->sa_restorer = k_osigact.sa_restorer; +#endif + } + return result; +} + +weak_alias (__sigaction, sigaction) diff -u -r -N glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/sigcontextinfo.h glibc-2.1.3/sysdeps/unix/sysv/linux/sh/sigcontextinfo.h --- glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/sigcontextinfo.h Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/unix/sysv/linux/sh/sigcontextinfo.h Sun Mar 12 04:09:10 2000 @@ -0,0 +1,25 @@ +/* Copyright (C) 1999, 2000 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Philip Blundell <philb@gnu.org>, 1999. + + 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 SIGCONTEXT int _a2, int _a3, int _a4, struct sigcontext + +#define SIGCONTEXT_EXTRA_ARGS _a2, _a3, _a4, +#define GET_PC(ctx) ((void *) ctx.sc_pc) +#define GET_FRAME(ctx) ((void *) ctx.sc_regs[14]) +#define GET_STACK(ctx) ((void *) ctx.sc_regs[15]) diff -u -r -N glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/siglist.c glibc-2.1.3/sysdeps/unix/sysv/linux/sh/siglist.c --- glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/siglist.c Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/unix/sysv/linux/sh/siglist.c Sun Mar 12 04:09:10 2000 @@ -0,0 +1,76 @@ +/* Copyright (C) 1997, 1998, 2000 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 <stddef.h> +#include <signal.h> +#include <sizes.h> +#include <libintl.h> + +#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING +# define SYS_SIGLIST __new_sys_siglist +# define SYS_SIGABBREV __new_sys_sigabbrev +#else +# define SYS_SIGLIST _sys_siglist +# define SYS_SIGABBREV _sys_sigabbrev +#endif + +#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING +asm (".data; .globl __old_sys_siglist; __old_sys_siglist:"); +#endif + +const char *const SYS_SIGLIST[NSIG] = +{ +#define init_sig(sig, abbrev, desc) [sig] desc, +#include "siglist.h" +#undef init_sig +}; + +#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING +asm (".type __old_sys_siglist,%object;.size __old_sys_siglist," + OLD_SIGLIST_SIZE_STR "*" PTR_SIZE_STR); + +asm (".data; .globl __old_sys_sigabbrev; __old_sys_sigabbrev:"); +#endif + +const char *const SYS_SIGABBREV[NSIG] = +{ +#define init_sig(sig, abbrev, desc) [sig] abbrev, +#include "siglist.h" +#undef init_sig +}; + +#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING +asm (".type __old_sys_sigabbrev,%object;.size __old_sys_sigabbrev," + OLD_SIGLIST_SIZE_STR "*" PTR_SIZE_STR); + +extern const char *const *__old_sys_siglist; +extern const char *const *__old_sys_sigabbrev; + +strong_alias (__old_sys_siglist, _old_sys_siglist) +symbol_version (__old_sys_siglist, _sys_siglist, GLIBC_2.0); +symbol_version (_old_sys_siglist, sys_siglist, GLIBC_2.0); +symbol_version (__old_sys_sigabbrev, sys_sigabbrev, GLIBC_2.0); + +strong_alias (__new_sys_siglist, _new_sys_siglist) +default_symbol_version (__new_sys_siglist, _sys_siglist, GLIBC_2.1); +default_symbol_version (_new_sys_siglist, sys_siglist, GLIBC_2.1); +default_symbol_version (__new_sys_sigabbrev, sys_sigabbrev, GLIBC_2.1); +#else +weak_alias (_sys_siglist, sys_siglist) +weak_alias (_sys_sigabbrev, sys_sigabbrev) +#endif diff -u -r -N glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/sigrestorer.S glibc-2.1.3/sysdeps/unix/sysv/linux/sh/sigrestorer.S --- glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/sigrestorer.S Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/unix/sysv/linux/sh/sigrestorer.S Thu Apr 27 21:26:38 2000 @@ -0,0 +1,42 @@ +/* Copyright (C) 1999, 2000 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 <sysdep.h> + +/* If no SA_RESTORER function was specified by the application we use + one of these. This avoids the need for the kernel to synthesise a return + instruction on the stack, which would involve expensive cache flushes. */ + +ENTRY(__default_sa_restorer) + mov.w 2f, $r3 + trapa #0x10 +1: bra 1b + nop +2: + .word SYS_ify(sigreturn) + +#ifdef __NR_rt_sigreturn + +ENTRY(__default_rt_sa_restorer) + mov.w 2f, $r3 + trapa #0x10 +1: bra 1b + nop +2: + .word SYS_ify(rt_sigreturn) +#endif diff -u -r -N glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/socket.S glibc-2.1.3/sysdeps/unix/sysv/linux/sh/socket.S --- glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/socket.S Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/unix/sysv/linux/sh/socket.S Tue May 16 01:17:23 2000 @@ -0,0 +1,116 @@ +/* Copyright (C) 1999, 2000 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 <sysdep.h> +#include <socketcall.h> + +#define P(a, b) P2(a, b) +#define P2(a, b) a##b + + .text +/* The socket-oriented system calls are handled unusally in Linux. + They are all gated through the single `socketcall' system call number. + `socketcall' takes two arguments: the first is the subcode, specifying + which socket function is being called; and the second is a pointer to + the arguments to the specific function. + + The .S files for the other calls just #define socket and #include this. */ + +#ifndef __socket +#define __socket P(__,socket) +#endif + +#define PUSHARGS_1 mov.l r4,@-r15 +#define PUSHARGS_2 mov.l r5,@-r15; PUSHARGS_1 +#define PUSHARGS_3 mov.l r6,@-r15; PUSHARGS_2 +#define PUSHARGS_4 mov.l r7,@-r15; PUSHARGS_3 +#define PUSHARGS_5 PUSHARGS_4 /* Caller has already pushed arg 5 */ +#define PUSHARGS_6 PUSHARGS_4 /* Caller has already pushed arg 5,6 */ + +#define POPARGS_1 add #4,r15 +#define POPARGS_2 add #8,r15 +#define POPARGS_3 add #12,r15 +#define POPARGS_4 add #16,r15 +#define POPARGS_5 add #16,r15 +#define POPARGS_6 add #16,r15 + +#ifndef NARGS +#define NARGS 3 /* If we were called with no wrapper, this is really socket() */ +#endif + +.globl __socket +ENTRY (__socket) + /* This will not work in the case of a socket call being interrupted + by a signal. If the signal handler uses any stack the arguments + to socket will be trashed. The results of a restart of any + socket call are then unpredictable. */ + + /* Push args onto the stack. */ + P(PUSHARGS_,NARGS) + + /* Do the system call trap. */ + mov #+P(SOCKOP_,socket), r4 + mov r15, r5 + mov.l .L1, $r3 + trapa #0x12 + + /* Pop args off the stack */ + P(POPARGS_,NARGS) + + mov r0, r1 + mov #-12, r2 + shad r2, r1 + not r1, r1 // r1=0 means r0 = -1 to -4095 + tst r1, r1 // i.e. error in linux + bf 1f + + mov.l .L2, r1 +#ifdef PIC + mov r0, r4 + mov.l r12, @-r15 + sts.l pr, @-r15 + mov.l 0f, r12 + mova 0f, r0 + add r0, r12 + mova .L2, r0 + add r0, r1 + jsr @r1 + nop + lds.l @r15+, pr + rts + mov.l @r15+, r12 + .align 2 +0: + .long _GLOBAL_OFFSET_TABLE_ +#else + jmp @r1 + nop +#endif +1: + /* Successful; return the syscall's value. */ + rts + nop + .align 2 +.L1: + .long SYS_ify(socketcall) +.L2: + .long PLTJMP(C_SYMBOL_NAME(__syscall_error)) + +PSEUDO_END (__socket) + +weak_alias (__socket, socket) diff -u -r -N glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/sys/io.h glibc-2.1.3/sysdeps/unix/sysv/linux/sh/sys/io.h --- glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/sys/io.h Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/unix/sysv/linux/sh/sys/io.h Sun Mar 12 04:09:10 2000 @@ -0,0 +1,48 @@ +/* Copyright (C) 1996, 1998, 1999 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 _SYS_IO_H + +#define _SYS_IO_H 1 +#include <features.h> + +__BEGIN_DECLS + +/* If TURN_ON is TRUE, request for permission to do direct i/o on the + port numbers in the range [FROM,FROM+NUM-1]. Otherwise, turn I/O + permission off for that range. This call requires root privileges. */ +extern int ioperm __P ((unsigned long int __from, unsigned long int __num, + int __turn_on)); + +/* Set the I/O privilege level to LEVEL. If LEVEL is nonzero, + permission to access any I/O port is granted. This call requires + root privileges. */ +extern int iopl __P ((int __level)); + +/* The functions that actually perform reads and writes. */ +extern unsigned char inb (unsigned long port); +extern unsigned short inw (unsigned long port); +extern unsigned long inl (unsigned long port); + +extern void outb (unsigned char value, unsigned long port); +extern void outw (unsigned short value, unsigned long port); +extern void outl (unsigned long value, unsigned long port); + +__END_DECLS + +#endif /* _SYS_IO_H */ diff -u -r -N glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/sys/user.h glibc-2.1.3/sysdeps/unix/sysv/linux/sh/sys/user.h --- glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/sys/user.h Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/unix/sysv/linux/sh/sys/user.h Thu Apr 27 21:26:38 2000 @@ -0,0 +1,30 @@ +/* Copyright (C) 1998, 1999, 2000 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 _SYS_USER_H +#define _SYS_USER_H 1 + +#include <features.h> + +/* <sys/ptrace.h> and <linux/ptrace.h> both define the PTRACE_* macros. + This leads to compilation problems with programs which include both + user.h and ptrace.h (eg: GDB). Do not include <linux/ptrace.h> here. */ +#include <asm/ptrace.h> +#include <asm/user.h> + +#endif /* sys/user.h */ diff -u -r -N glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/syscalls.list glibc-2.1.3/sysdeps/unix/sysv/linux/sh/syscalls.list --- glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/syscalls.list Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/unix/sysv/linux/sh/syscalls.list Thu Apr 27 21:26:38 2000 @@ -0,0 +1,52 @@ +# File name Caller Syscall name # args Strong name Weak names + +s_ioctl ioctl ioctl 3 __syscall_ioctl +s_ipc msgget ipc 5 __syscall_ipc +s_llseek llseek _llseek 5 __syscall__llseek +s_chown chown chown 3 __syscall_chown +s_execve execve execve 3 __syscall_execve +rt_sigaction - rt_sigaction 4 __syscall_rt_sigaction +rt_sigpending - rt_sigpending 2 __syscall_rt_sigpending +rt_sigprocmask - rt_sigprocmask 4 __syscall_rt_sigprocmask +rt_sigqueueinfo - rt_sigqueueinfo 3 __syscall_rt_sigqueueinfo +rt_sigsuspend - rt_sigsuspend 2 __syscall_rt_sigsuspend +rt_sigtimedwait - rt_sigtimedwait 4 __syscall_rt_sigtimedwait +s_getcwd getcwd getcwd 2 __syscall_getcwd +s_getdents getdents getdents 3 __syscall_getdents +s_getgroups getgroups getgroups 2 __syscall_getgroups +s_getpriority getpriority getpriority 2 __syscall_getpriority +getresgid - getresgid 3 getresgid +getresuid - getresuid 3 getresuid +s_poll poll poll 3 __syscall_poll +s_pread64 pread64 pread 5 __syscall_pread +s_ptrace ptrace ptrace 4 __syscall_ptrace +s_pwrite64 pwrite64 pwrite 5 __syscall_pwrite +s_reboot reboot reboot 3 __syscall_reboot +s_sigaction sigaction sigaction 3 __syscall_sigaction +s_sigpending sigpending sigpending 1 __syscall_sigpending +s_sigprocmask sigprocmask sigprocmask 3 __syscall_sigprocmask +s_sigsuspend sigsuspend sigsuspend 3 __syscall_sigsuspend +s_setfsgid setfsgid setfsgid 1 __syscall_setfsgid +s_setfsuid setfsuid setfsuid 1 __syscall_setfsuid +s_setgid setgid setgid 1 __syscall_setgid +s_setgroups setgroups setgroups 2 __syscall_setgroups +s_setregid setregid setregid 2 __syscall_setregid +s_setresgid setresgid setresgid 3 __syscall_setresgid +s_setresuid setresuid setresuid 3 __syscall_setresuid +s_setreuid setreuid setreuid 2 __syscall_setreuid +s_setuid setuid setuid 1 __syscall_setuid +s_sysctl sysctl _sysctl 1 __syscall__sysctl +s_ugetrlimit getrlimit ugetrlimit 2 __syscall_ugetrlimit +s_ustat ustat ustat 2 __syscall_ustat +sys_fstat fxstat fstat 2 __syscall_fstat +sys_lstat lxstat lstat 2 __syscall_lstat +sys_mknod xmknod mknod 3 __syscall_mknod +sys_readv readv readv 3 __syscall_readv +sys_stat xstat stat 2 __syscall_stat +sys_writev writev writev 3 __syscall_writev +syscall - syscall 5 syscall +s_fstat64 fxstat64 fstat64 2 __syscall_fstat64 +s_ftruncate64 ftruncate64 ftruncate64 3 __syscall_ftruncate64 +s_lstat64 lxstat64 lstat64 2 __syscall_lstat64 +s_truncate64 truncate64 truncate64 3 __syscall_truncate64 +s_stat64 xstat64 stat64 2 __syscall_stat64 diff -u -r -N glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/sysdep.S glibc-2.1.3/sysdeps/unix/sysv/linux/sh/sysdep.S --- glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/sysdep.S Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/unix/sysv/linux/sh/sysdep.S Sun Mar 12 04:09:10 2000 @@ -0,0 +1,43 @@ +/* Copyright (C) 1995, 1996, 1997, 1998, 1999 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 <sysdep.h> + +/* We define errno here, to be consistent with Linux/i386. */ + + .section .bss + .globl C_SYMBOL_NAME(errno) + .type C_SYMBOL_NAME(errno), @object + .size C_SYMBOL_NAME(errno), 4 +C_SYMBOL_NAME(errno): + .space 4 +weak_alias (errno, _errno) + .text + +/* The syscall stubs jump here when they detect an error. + The code for Linux is almost identical to the canonical Unix + code, except that the error number in R0 is negated. */ + +#undef CALL_MCOUNT +#define CALL_MCOUNT /* Don't insert the profiling call, it clobbers R0. */ + +ENTRY (__syscall_error) + neg r4, r0 + +#define __syscall_error __syscall_error_1 +#include <sysdeps/unix/sh/sysdep.S> diff -u -r -N glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/sysdep.h glibc-2.1.3/sysdeps/unix/sysv/linux/sh/sysdep.h --- glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/sysdep.h Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/unix/sysv/linux/sh/sysdep.h Thu Apr 27 21:26:38 2000 @@ -0,0 +1,143 @@ +/* Copyright (C) 1992, 93, 95-99, 2000 Free Software Foundation, + Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>, August 1995. + Changed by Kaz Kojima, <kkojima@rr.iij4u.or.jp>. + + 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_SH_SYSDEP_H +#define _LINUX_SH_SYSDEP_H 1 + +/* There is some commonality. */ +#include <sysdeps/unix/sh/sysdep.h> + +/* For Linux we can use the system call table in the header file + /usr/include/asm/unistd.h + of the kernel. But these symbols do not follow the SYS_* syntax + so we have to redefine the `SYS_ify' macro here. */ +#undef SYS_ify +#define SYS_ify(syscall_name) (__NR_##syscall_name) + + +#ifdef __ASSEMBLER__ + +/* Linux uses a negative return value to indicate syscall errors, + unlike most Unices, which use the condition codes' carry flag. + + Since version 2.1 the return value of a system call might be + negative even if the call succeeded. E.g., the `lseek' system call + might return a large offset. Therefore we must not anymore test + for < 0, but test for a real error by making sure the value in R0 + is a real error number. Linus said he will make sure the no syscall + returns a value in -1 .. -4095 as a valid result so we can savely + test with -4095. */ + +#define _IMM12 #-12 +#undef PSEUDO +#ifdef PIC +#define PSEUDO(name, syscall_name, args) \ + .text; \ + ENTRY (name); \ + DO_CALL (args, syscall_name); \ + mov r0,r1; \ + mov _IMM12,r2; \ + shad r2,r1; \ + not r1,r1; \ + tst r1,r1; \ + bf 1f; \ + mov r0,r4; \ + mov.l r12,@-r15; \ + sts.l pr,@-r15; \ + mov.l 0f,r12; \ + mova 0f,r0; \ + add r0,r12; \ + mov.l 2f,r1; \ + mova 2f,r0; \ + add r0,r1; \ + jsr @r1; \ + nop; \ + lds.l @r15+,pr; \ + rts; \ + mov.l @r15+,r12; \ + .align 2; \ + 2: .long PLTJMP(C_SYMBOL_NAME(__syscall_error)); \ + 0: .long _GLOBAL_OFFSET_TABLE_; \ + 1: +#else +#define PSEUDO(name, syscall_name, args) \ + .text; \ + ENTRY (name); \ + DO_CALL (args, syscall_name); \ + mov r0,r1; \ + mov _IMM12,r2; \ + shad r2,r1; \ + not r1,r1; \ + tst r1,r1; \ + bf 1f; \ + mov.l 2f,r1; \ + jmp @r1; \ + mov r0, r4; \ + .align 2; \ + 2: .long PLTJMP(C_SYMBOL_NAME(__syscall_error)); \ + 1: +#endif + +#undef PSEUDO_END +#define PSEUDO_END(name) \ + SYSCALL_ERROR_HANDLER \ + END (name) + +#define SYSCALL_ERROR_HANDLER /* Nothing here; code in sysdep.S is used. */ + +#define SYSCALL_ARGS0 +#define SYSCALL_ARGS1 +#define SYSCALL_ARGS2 +#define SYSCALL_ARGS3 +#define SYSCALL_ARGS4 +#define SYSCALL_ARGS5 mov.l @$r15, $r0 +#define SYSCALL_ARGS6 SYSCALL_ARGS5; mov.l @(4,$r15), $r1 +#define SYSCALL_ARGS7 SYSCALL_ARGS6; mov.l @(8,$r15), $r2 + +#define SYSCALL_INST0 trapa #0x10 +#define SYSCALL_INST1 trapa #0x11 +#define SYSCALL_INST2 trapa #0x12 +#define SYSCALL_INST3 trapa #0x13 +#define SYSCALL_INST4 trapa #0x14 +#define SYSCALL_INST5 trapa #0x15 +#define SYSCALL_INST6 trapa #0x16 +#define SYSCALL_INST7 trapa #0x17 + +#undef DO_CALL +#define DO_CALL(args, syscall_name) \ + SYSCALL_ARGS##args; \ + mov.l 1f, $r3; \ + SYSCALL_INST##args; \ + bra 2f; \ + nop; \ + .align 2; \ + 1: .long SYS_ify(syscall_name); \ + 2: + +#else /* not __ASSEMBLER__ */ + +#undef INLINE_SYSCALL +#define INLINE_SYSCALL(name, nr, args...) \ + __syscall_##name(args) + +#endif /* __ASSEMBLER__ */ + +#endif /* linux/sh/sysdep.h */ diff -u -r -N glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/vfork.S glibc-2.1.3/sysdeps/unix/sysv/linux/sh/vfork.S --- glibc-2.1.3-original/sysdeps/unix/sysv/linux/sh/vfork.S Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/unix/sysv/linux/sh/vfork.S Thu Apr 27 21:26:38 2000 @@ -0,0 +1,112 @@ +/* Copyright (C) 1999, 2000 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 <sysdep.h> +#define _ERRNO_H 1 +#include <bits/errno.h> + +/* Clone the calling process, but without copying the whole address space. + The calling process is suspended until the new process exits or is + replaced by a call to `execve'. Return -1 for errors, 0 to the new process, + and the process ID of the new process to the old process. */ + +ENTRY (__vfork) + +#ifdef __NR_vfork + mov #+__NR_vfork, $r3 + trapa #0x10 + mov r0, r1 + mov #-12, r2 + shad r2, r1 + not r1, r1 // r1=0 means r0 = -1 to -4095 + tst r1, r1 // i.e. error in linux + bf 1f + mov.w .L1, r1 + cmp/eq r1, r0 + bt 2f + mov.l .L2, r1 +#ifdef PIC + mov r0, r4 + mov.l r12, @-r15 + sts.l pr, @-r15 + mov.l 0f, r12 + mova 0f, r0 + add r0, r12 + mova .L2, r0 + add r0, r1 + jsr @r1 + nop + lds.l @r15+, pr + rts + mov.l @r15+, r12 + .align 2 +0: + .long _GLOBAL_OFFSET_TABLE_ +#else + jmp @r1 + mov r0, r4 +#endif +.L1: + .word -ENOSYS +1: + rts + nop +2: +#endif + + /* If we don't have vfork, fork is close enough. */ + mov #+__NR_fork, $r3 + trapa #0x10 + mov r0, r1 + mov #-12, r2 + shad r2, r1 + not r1, r1 // r1=0 means r0 = -1 to -4095 + tst r1, r1 // i.e. error in linux + bf 1f + mov.l .L2, r1 +#ifdef PIC + mov r0, r4 + mov.l r12, @-r15 + sts.l pr, @-r15 + mov.l 0f, r12 + mova 0f, r0 + add r0, r12 + mova .L2, r0 + add r0, r1 + jsr @r1 + nop + lds.l @r15+, pr + rts + mov.l @r15+, r12 + .align 2 +0: + .long _GLOBAL_OFFSET_TABLE_ +#else + jmp @r1 + mov r0, r4 +#endif + .align 2 +.L2: + .long PLTJMP(C_SYMBOL_NAME(__syscall_error)) +1: + rts + nop + +PSEUDO_END (__vfork) + +weak_alias (__vfork, vfork) diff -u -r -N glibc-2.1.3-original/sysdeps/unix/sysv/linux/syscall.S glibc-2.1.3/sysdeps/unix/sysv/linux/syscall.S --- glibc-2.1.3-original/sysdeps/unix/sysv/linux/syscall.S Thu Jan 1 09:00:00 1970 +++ glibc-2.1.3/sysdeps/unix/sysv/linux/syscall.S Sun Mar 12 04:09:10 2000 @@ -0,0 +1,33 @@ +/* Copyright (C) 2000 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 <sysdep.h> + +/* Please consult the file sysdeps/unix/sysv/linux/sh/sysdep.h for + more information about the value -4095 used below.*/ + + .text +ENTRY(__syscall) + + /* XXX should be implemented !! */ + rts /* Return to caller. */ + nop + +PSEUDO_END (__syscall) + +weak_alias (__syscall, clone)
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |