Update.
authorUlrich Drepper <drepper@redhat.com>
Mon, 12 Jun 2000 20:50:37 +0000 (20:50 +0000)
committerUlrich Drepper <drepper@redhat.com>
Mon, 12 Jun 2000 20:50:37 +0000 (20:50 +0000)
2000-06-12  Kazumoto Kojima  <kkojima@rr.iij4u.or.jp>
    Yutaka Niibe  <gniibe@chroot.org>

* sysdeps/sh/Dist: New file.
* sysdeps/sh/Implies: New file.
* sysdeps/sh/gmp-mparam.h: New file.
* sysdeps/sh/init-first.c: New file.
* sysdeps/sh/machine-gmon.h: New file.
* sysdeps/sh/memcpy.S: New file.
* sysdeps/sh/memprof.h: New file.
* sysdeps/sh/memset.S: New file.
* sysdeps/sh/sh3/__longjmp.S: New file.
* sysdeps/sh/sh3/bits/endian.h: New file.
* sysdeps/sh/sh3/bits/huge_val.h: New file.
* sysdeps/sh/sh3/bits/setjmp.h: New file.
* sysdeps/sh/sh3/bsd-_setjmp.S: New file.
* sysdeps/sh/sh3/bsd-setjmp.S: New file.
* sysdeps/sh/sh3/dl-machine.h: New file.
* sysdeps/sh/sh3/elf/initfini.c: New file.
* sysdeps/sh/sh3/elf/start.S: New file.
* sysdeps/sh/sh3/setjmp.S: New file.
* sysdeps/sh/sh3/sys/ucontext.h: New file.
* sysdeps/sh/sh4/__longjmp.S: New file.
* sysdeps/sh/sh4/bits/endian.h: New file.
* sysdeps/sh/sh4/bits/huge_val.h: New file.
* sysdeps/sh/sh4/bits/setjmp.h: New file.
* sysdeps/sh/sh4/bsd-_setjmp.S: New file.
* sysdeps/sh/sh4/bsd-setjmp.S: New file.
* sysdeps/sh/sh4/dl-machine.h: New file.
* sysdeps/sh/sh4/elf/initfini.c: New file.
* sysdeps/sh/sh4/elf/start.S: New file.
* sysdeps/sh/sh4/fpu/bits/fenv.h: New file.
* sysdeps/sh/sh4/fpu/bits/huge_val.h: New file.
* sysdeps/sh/sh4/fpu/bits/mathdef.h: New file.
* sysdeps/sh/sh4/fpu/fclrexcpt.c: New file.
* sysdeps/sh/sh4/fpu/fegetenv.c: New file.
* sysdeps/sh/sh4/fpu/fegetround.c: New file.
* sysdeps/sh/sh4/fpu/feholdexcpt.c: New file.
* sysdeps/sh/sh4/fpu/fesetenv.c: New file.
* sysdeps/sh/sh4/fpu/fesetround.c: New file.
* sysdeps/sh/sh4/fpu/fpu_control.h: New file.
* sysdeps/sh/sh4/fpu/fraiseexcpt.c: New file.
* sysdeps/sh/sh4/fpu/fsetexcptflg.c: New file.
* sysdeps/sh/sh4/fpu/ftestexcept.c: New file.
* sysdeps/sh/sh4/fpu/libm-test-ulps: New file.
* sysdeps/sh/sh4/setjmp.S: New file.
* sysdeps/sh/sh4/sys/ucontext.h: New file.
* sysdeps/sh/strlen.S: New file.
* sysdeps/sh/sysdep.h: New file.
* sysdeps/unix/sh/sysdep.S: New file.
* sysdeps/unix/sh/sysdep.h: New file.
* sysdeps/unix/sysv/linux/sh/Dist: New file.
* sysdeps/unix/sysv/linux/sh/Makefile: New file.
* sysdeps/unix/sysv/linux/sh/Versions: New file.
* sysdeps/unix/sysv/linux/sh/bits/mman.h: New file.
* sysdeps/unix/sysv/linux/sh/bits/resource.h: New file.
* sysdeps/unix/sysv/linux/sh/brk.c: New file.
* sysdeps/unix/sysv/linux/sh/chown.c: New file.
* sysdeps/unix/sysv/linux/sh/clone.S: New file.
* sysdeps/unix/sysv/linux/sh/fchown.c: New file.
* sysdeps/unix/sysv/linux/sh/fxstat.c: New file.
* sysdeps/unix/sysv/linux/sh/getegid.c: New file.
* sysdeps/unix/sysv/linux/sh/geteuid.c: New file.
* sysdeps/unix/sysv/linux/sh/getgroups.c: New file.
* sysdeps/unix/sysv/linux/sh/getresgid.c: New file.
* sysdeps/unix/sysv/linux/sh/getresuid.c: New file.
* sysdeps/unix/sysv/linux/sh/getrlimit.c: New file.
* sysdeps/unix/sysv/linux/sh/getrlimit64.c: New file.
* sysdeps/unix/sysv/linux/sh/getuid.c: New file.
* sysdeps/unix/sysv/linux/sh/lchown.c: New file.
* sysdeps/unix/sysv/linux/sh/lxstat.c: New file.
* sysdeps/unix/sysv/linux/sh/msgctl.c: New file.
* sysdeps/unix/sysv/linux/sh/oldgetrlimit64.c: New file.
* sysdeps/unix/sysv/linux/sh/pipe.S: New file.
* sysdeps/unix/sysv/linux/sh/profil-counter.h: New file.
* sysdeps/unix/sysv/linux/sh/semctl.c: New file.
* sysdeps/unix/sysv/linux/sh/setegid.c: New file.
* sysdeps/unix/sysv/linux/sh/seteuid.c: New file.
* sysdeps/unix/sysv/linux/sh/setfsgid.c: New file.
* sysdeps/unix/sysv/linux/sh/setfsuid.c: New file.
* sysdeps/unix/sysv/linux/sh/setgid.c: New file.
* sysdeps/unix/sysv/linux/sh/setgroups.c: New file.
* sysdeps/unix/sysv/linux/sh/setregid.c: New file.
* sysdeps/unix/sysv/linux/sh/setresgid.c: New file.
* sysdeps/unix/sysv/linux/sh/setresuid.c: New file.
* sysdeps/unix/sysv/linux/sh/setreuid.c: New file.
* sysdeps/unix/sysv/linux/sh/setrlimit.c: New file.
* sysdeps/unix/sysv/linux/sh/setuid.c: New file.
* sysdeps/unix/sysv/linux/sh/sh3/register-dump.h: New file.
* sysdeps/unix/sysv/linux/sh/sh4/register-dump.h: New file.
* sysdeps/unix/sysv/linux/sh/shmctl.c: New file.
* sysdeps/unix/sysv/linux/sh/sigcontextinfo.h: New file.
* sysdeps/unix/sysv/linux/sh/socket.S: New file.
* sysdeps/unix/sysv/linux/sh/sys/io.h: New file.
* sysdeps/unix/sysv/linux/sh/sys/ucontext.h: New file.
* sysdeps/unix/sysv/linux/sh/sys/user.h: New file.
* sysdeps/unix/sysv/linux/sh/syscalls.list: New file.
* sysdeps/unix/sysv/linux/sh/sysdep.S: New file.
* sysdeps/unix/sysv/linux/sh/sysdep.h: New file.
* sysdeps/unix/sysv/linux/sh/vfork.S: New file.
* sysdeps/unix/sysv/linux/sh/xstat.c: New file.

96 files changed:
ChangeLog
linuxthreads/ChangeLog
linuxthreads/sysdeps/sh/pspinlock.c [new file with mode: 0644]
linuxthreads/sysdeps/sh/pt-machine.h [new file with mode: 0644]
sysdeps/sh/Dist [new file with mode: 0644]
sysdeps/sh/Implies [new file with mode: 0644]
sysdeps/sh/elf/initfini.c [new file with mode: 0644]
sysdeps/sh/elf/start.S [new file with mode: 0644]
sysdeps/sh/gmp-mparam.h [new file with mode: 0644]
sysdeps/sh/init-first.c [new file with mode: 0644]
sysdeps/sh/machine-gmon.h [new file with mode: 0644]
sysdeps/sh/memcpy.S [new file with mode: 0644]
sysdeps/sh/memprof.h [new file with mode: 0644]
sysdeps/sh/memset.S [new file with mode: 0644]
sysdeps/sh/sh3/__longjmp.S [new file with mode: 0644]
sysdeps/sh/sh3/bits/endian.h [new file with mode: 0644]
sysdeps/sh/sh3/bits/huge_val.h [new file with mode: 0644]
sysdeps/sh/sh3/bits/setjmp.h [new file with mode: 0644]
sysdeps/sh/sh3/bsd-_setjmp.S [new file with mode: 0644]
sysdeps/sh/sh3/bsd-setjmp.S [new file with mode: 0644]
sysdeps/sh/sh3/dl-machine.h [new file with mode: 0644]
sysdeps/sh/sh3/setjmp.S [new file with mode: 0644]
sysdeps/sh/sh4/__longjmp.S [new file with mode: 0644]
sysdeps/sh/sh4/bits/endian.h [new file with mode: 0644]
sysdeps/sh/sh4/bits/huge_val.h [new file with mode: 0644]
sysdeps/sh/sh4/bits/setjmp.h [new file with mode: 0644]
sysdeps/sh/sh4/bsd-_setjmp.S [new file with mode: 0644]
sysdeps/sh/sh4/bsd-setjmp.S [new file with mode: 0644]
sysdeps/sh/sh4/dl-machine.h [new file with mode: 0644]
sysdeps/sh/sh4/fpu/fclrexcpt.c [new file with mode: 0644]
sysdeps/sh/sh4/fpu/fegetenv.c [new file with mode: 0644]
sysdeps/sh/sh4/fpu/fegetround.c [new file with mode: 0644]
sysdeps/sh/sh4/fpu/feholdexcpt.c [new file with mode: 0644]
sysdeps/sh/sh4/fpu/fesetenv.c [new file with mode: 0644]
sysdeps/sh/sh4/fpu/fesetround.c [new file with mode: 0644]
sysdeps/sh/sh4/fpu/fpu_control.h [new file with mode: 0644]
sysdeps/sh/sh4/fpu/fraiseexcpt.c [new file with mode: 0644]
sysdeps/sh/sh4/fpu/fsetexcptflg.c [new file with mode: 0644]
sysdeps/sh/sh4/fpu/ftestexcept.c [new file with mode: 0644]
sysdeps/sh/sh4/fpu/libm-test-ulps [new file with mode: 0644]
sysdeps/sh/sh4/setjmp.S [new file with mode: 0644]
sysdeps/sh/strlen.S [new file with mode: 0644]
sysdeps/sh/sys/ucontext.h [new file with mode: 0644]
sysdeps/sh/sysdep.h [new file with mode: 0644]
sysdeps/unix/sh/sysdep.S [new file with mode: 0644]
sysdeps/unix/sh/sysdep.h [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/Dist [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/Makefile [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/Versions [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/bits/mman.h [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/bits/resource.h [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/brk.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/chown.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/clone.S [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/fchown.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/fxstat.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/getegid.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/geteuid.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/getgroups.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/getresgid.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/getresuid.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/getrlimit.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/getrlimit64.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/getuid.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/lchown.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/lxstat.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/msgctl.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/oldgetrlimit64.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/pipe.S [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/profil-counter.h [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/semctl.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/setegid.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/seteuid.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/setfsgid.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/setfsuid.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/setgid.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/setgroups.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/setregid.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/setresgid.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/setresuid.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/setreuid.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/setrlimit.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/setuid.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/sh3/register-dump.h [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/sh4/register-dump.h [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/shmctl.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/sigcontextinfo.h [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/socket.S [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/sys/io.h [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/sys/ucontext.h [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/sys/user.h [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/syscalls.list [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/sysdep.S [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/sysdep.h [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/vfork.S [new file with mode: 0644]
sysdeps/unix/sysv/linux/sh/xstat.c [new file with mode: 0644]

index 4f3f8ff..b9453fe 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,105 @@
+2000-06-12  Kazumoto Kojima  <kkojima@rr.iij4u.or.jp>
+           Yutaka Niibe  <gniibe@chroot.org>
+
+       * sysdeps/sh/Dist: New file.
+       * sysdeps/sh/Implies: New file.
+       * sysdeps/sh/gmp-mparam.h: New file.
+       * sysdeps/sh/init-first.c: New file.
+       * sysdeps/sh/machine-gmon.h: New file.
+       * sysdeps/sh/memcpy.S: New file.
+       * sysdeps/sh/memprof.h: New file.
+       * sysdeps/sh/memset.S: New file.
+       * sysdeps/sh/sh3/__longjmp.S: New file.
+       * sysdeps/sh/sh3/bits/endian.h: New file.
+       * sysdeps/sh/sh3/bits/huge_val.h: New file.
+       * sysdeps/sh/sh3/bits/setjmp.h: New file.
+       * sysdeps/sh/sh3/bsd-_setjmp.S: New file.
+       * sysdeps/sh/sh3/bsd-setjmp.S: New file.
+       * sysdeps/sh/sh3/dl-machine.h: New file.
+       * sysdeps/sh/sh3/elf/initfini.c: New file.
+       * sysdeps/sh/sh3/elf/start.S: New file.
+       * sysdeps/sh/sh3/setjmp.S: New file.
+       * sysdeps/sh/sh3/sys/ucontext.h: New file.
+       * sysdeps/sh/sh4/__longjmp.S: New file.
+       * sysdeps/sh/sh4/bits/endian.h: New file.
+       * sysdeps/sh/sh4/bits/huge_val.h: New file.
+       * sysdeps/sh/sh4/bits/setjmp.h: New file.
+       * sysdeps/sh/sh4/bsd-_setjmp.S: New file.
+       * sysdeps/sh/sh4/bsd-setjmp.S: New file.
+       * sysdeps/sh/sh4/dl-machine.h: New file.
+       * sysdeps/sh/sh4/elf/initfini.c: New file.
+       * sysdeps/sh/sh4/elf/start.S: New file.
+       * sysdeps/sh/sh4/fpu/bits/fenv.h: New file.
+       * sysdeps/sh/sh4/fpu/bits/huge_val.h: New file.
+       * sysdeps/sh/sh4/fpu/bits/mathdef.h: New file.
+       * sysdeps/sh/sh4/fpu/fclrexcpt.c: New file.
+       * sysdeps/sh/sh4/fpu/fegetenv.c: New file.
+       * sysdeps/sh/sh4/fpu/fegetround.c: New file.
+       * sysdeps/sh/sh4/fpu/feholdexcpt.c: New file.
+       * sysdeps/sh/sh4/fpu/fesetenv.c: New file.
+       * sysdeps/sh/sh4/fpu/fesetround.c: New file.
+       * sysdeps/sh/sh4/fpu/fpu_control.h: New file.
+       * sysdeps/sh/sh4/fpu/fraiseexcpt.c: New file.
+       * sysdeps/sh/sh4/fpu/fsetexcptflg.c: New file.
+       * sysdeps/sh/sh4/fpu/ftestexcept.c: New file.
+       * sysdeps/sh/sh4/fpu/libm-test-ulps: New file.
+       * sysdeps/sh/sh4/setjmp.S: New file.
+       * sysdeps/sh/sh4/sys/ucontext.h: New file.
+       * sysdeps/sh/strlen.S: New file.
+       * sysdeps/sh/sysdep.h: New file.
+       * sysdeps/unix/sh/sysdep.S: New file.
+       * sysdeps/unix/sh/sysdep.h: New file.
+       * sysdeps/unix/sysv/linux/sh/Dist: New file.
+       * sysdeps/unix/sysv/linux/sh/Makefile: New file.
+       * sysdeps/unix/sysv/linux/sh/Versions: New file.
+       * sysdeps/unix/sysv/linux/sh/bits/mman.h: New file.
+       * sysdeps/unix/sysv/linux/sh/bits/resource.h: New file.
+       * sysdeps/unix/sysv/linux/sh/brk.c: New file.
+       * sysdeps/unix/sysv/linux/sh/chown.c: New file.
+       * sysdeps/unix/sysv/linux/sh/clone.S: New file.
+       * sysdeps/unix/sysv/linux/sh/fchown.c: New file.
+       * sysdeps/unix/sysv/linux/sh/fxstat.c: New file.
+       * sysdeps/unix/sysv/linux/sh/getegid.c: New file.
+       * sysdeps/unix/sysv/linux/sh/geteuid.c: New file.
+       * sysdeps/unix/sysv/linux/sh/getgroups.c: New file.
+       * sysdeps/unix/sysv/linux/sh/getresgid.c: New file.
+       * sysdeps/unix/sysv/linux/sh/getresuid.c: New file.
+       * sysdeps/unix/sysv/linux/sh/getrlimit.c: New file.
+       * sysdeps/unix/sysv/linux/sh/getrlimit64.c: New file.
+       * sysdeps/unix/sysv/linux/sh/getuid.c: New file.
+       * sysdeps/unix/sysv/linux/sh/lchown.c: New file.
+       * sysdeps/unix/sysv/linux/sh/lxstat.c: New file.
+       * sysdeps/unix/sysv/linux/sh/msgctl.c: New file.
+       * sysdeps/unix/sysv/linux/sh/oldgetrlimit64.c: New file.
+       * sysdeps/unix/sysv/linux/sh/pipe.S: New file.
+       * sysdeps/unix/sysv/linux/sh/profil-counter.h: New file.
+       * sysdeps/unix/sysv/linux/sh/semctl.c: New file.
+       * sysdeps/unix/sysv/linux/sh/setegid.c: New file.
+       * sysdeps/unix/sysv/linux/sh/seteuid.c: New file.
+       * sysdeps/unix/sysv/linux/sh/setfsgid.c: New file.
+       * sysdeps/unix/sysv/linux/sh/setfsuid.c: New file.
+       * sysdeps/unix/sysv/linux/sh/setgid.c: New file.
+       * sysdeps/unix/sysv/linux/sh/setgroups.c: New file.
+       * sysdeps/unix/sysv/linux/sh/setregid.c: New file.
+       * sysdeps/unix/sysv/linux/sh/setresgid.c: New file.
+       * sysdeps/unix/sysv/linux/sh/setresuid.c: New file.
+       * sysdeps/unix/sysv/linux/sh/setreuid.c: New file.
+       * sysdeps/unix/sysv/linux/sh/setrlimit.c: New file.
+       * sysdeps/unix/sysv/linux/sh/setuid.c: New file.
+       * sysdeps/unix/sysv/linux/sh/sh3/register-dump.h: New file.
+       * sysdeps/unix/sysv/linux/sh/sh4/register-dump.h: New file.
+       * sysdeps/unix/sysv/linux/sh/shmctl.c: New file.
+       * sysdeps/unix/sysv/linux/sh/sigcontextinfo.h: New file.
+       * sysdeps/unix/sysv/linux/sh/socket.S: New file.
+       * sysdeps/unix/sysv/linux/sh/sys/io.h: New file.
+       * sysdeps/unix/sysv/linux/sh/sys/ucontext.h: New file.
+       * sysdeps/unix/sysv/linux/sh/sys/user.h: New file.
+       * sysdeps/unix/sysv/linux/sh/syscalls.list: New file.
+       * sysdeps/unix/sysv/linux/sh/sysdep.S: New file.
+       * sysdeps/unix/sysv/linux/sh/sysdep.h: New file.
+       * sysdeps/unix/sysv/linux/sh/vfork.S: New file.
+       * sysdeps/unix/sysv/linux/sh/xstat.c: New file.
+
 2000-06-12  Ulrich Drepper  <drepper@redhat.com>
 
        * Rules (%.out): Define GCONV_PATH in the environment.
index 3066c0d..3d2d818 100644 (file)
@@ -1,3 +1,9 @@
+2000-06-12  Kazumoto Kojima  <kkojima@rr.iij4u.or.jp>
+           Yutaka Niibe  <gniibe@chroot.org>
+
+       * sysdeps/sh/pspinlock.c: New file.
+       * sysdeps/sh/pt-machine.h: New file.
+
 2000-06-12  Ulrich Drepper  <drepper@redhat.com>
 
        * Makefile (tests): Add joinrace.
diff --git a/linuxthreads/sysdeps/sh/pspinlock.c b/linuxthreads/sysdeps/sh/pspinlock.c
new file mode 100644 (file)
index 0000000..be9fc80
--- /dev/null
@@ -0,0 +1,80 @@
+/* POSIX spinlock implementation.  SH version.
+   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 <errno.h>
+#include <pthread.h>
+
+
+int
+__pthread_spin_lock (pthread_spinlock_t *lock)
+{
+  unsigned int val;
+
+  do
+    asm volatile ("tas.b @%1; movt %0"
+                 : "=r" (val)
+                 : "r" (lock)
+                 : "memory");
+  while (val != 0);
+
+  return 0;
+}
+weak_alias (__pthread_spin_lock, pthread_spin_lock)
+
+
+int
+__pthread_spin_trylock (pthread_spinlock_t *lock)
+{
+  unsigned int val;
+
+  asm volatile ("tas.b @%1; movt %0"
+               : "=r" (val)
+               : "r" (lock)
+               : "memory");
+  return val ? EBUSY : 0;
+}
+weak_alias (__pthread_spin_trylock, pthread_spin_trylock)
+
+
+int
+__pthread_spin_unlock (pthread_spinlock_t *lock)
+{
+  return *lock = 0;
+}
+weak_alias (__pthread_spin_unlock, pthread_spin_unlock)
+
+
+int
+__pthread_spin_init (pthread_spinlock_t *lock, int pshared)
+{
+  /* We can ignore the `pshared' parameter.  Since we are busy-waiting
+     all processes which can access the memory location `lock' points
+     to can use the spinlock.  */
+  return *lock = 0;
+}
+weak_alias (__pthread_spin_init, pthread_spin_init)
+
+
+int
+__pthread_spin_destroy (pthread_spinlock_t *lock)
+{
+  /* Nothing to do.  */
+  return 0;
+}
+weak_alias (__pthread_spin_destroy, pthread_spin_destroy)
diff --git a/linuxthreads/sysdeps/sh/pt-machine.h b/linuxthreads/sysdeps/sh/pt-machine.h
new file mode 100644 (file)
index 0000000..1fc9c47
--- /dev/null
@@ -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 --git a/sysdeps/sh/Dist b/sysdeps/sh/Dist
new file mode 100644 (file)
index 0000000..d78de40
--- /dev/null
@@ -0,0 +1 @@
+ieee754.h
diff --git a/sysdeps/sh/Implies b/sysdeps/sh/Implies
new file mode 100644 (file)
index 0000000..780c4e2
--- /dev/null
@@ -0,0 +1,3 @@
+wordsize-32
+ieee754/flt-32
+ieee754/dbl-64
diff --git a/sysdeps/sh/elf/initfini.c b/sysdeps/sh/elf/initfini.c
new file mode 100644 (file)
index 0000000..0660c2c
--- /dev/null
@@ -0,0 +1,151 @@
+/* Special .init and .fini section support for SH.
+   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.
+
+   In addition to the permissions in the GNU Library General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file with other
+   programs, and to distribute those programs without any restriction
+   coming from the use of this file.  (The Library General Public
+   License restrictions do apply in other respects; for example, they
+   cover modification of the file, and distribution when not linked
+   into another program.)
+
+   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, 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+/* This file is compiled into assembly code which is then munged by a sed
+   script into two files: crti.s and crtn.s.
+
+   * crti.s puts a function prologue at the beginning of the
+   .init and .fini sections and defines global symbols for
+   those addresses, so they can be called as functions.
+
+   * crtn.s puts the corresponding function epilogues
+   in the .init and .fini sections. */
+
+__asm__ ("
+
+#include \"defs.h\"
+#define SHARED
+
+/*@HEADER_ENDS*/
+
+/*@TESTS_BEGIN*/
+
+/*@TESTS_END*/
+
+/*@_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 SHARED
+       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 SHARED
+.L22:
+       .long   _GLOBAL_OFFSET_TABLE_
+.L23:
+       .long   __gmon_start__@PLT
+#else
+.L23:
+       .long   __gmon_start__
+#endif
+1:
+       ALIGN
+       END_INIT
+
+       
+/*@_init_PROLOG_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_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 SHARED
+       mova    .L27,r0
+       mov.l   .L27,r12
+       add     r0,r12
+#endif
+       mov     r15,r14
+       ALIGN
+       END_FINI
+#ifdef SHARED
+       bra     1f
+        nop
+       .align  2
+.L27:
+       .long   _GLOBAL_OFFSET_TABLE_
+#endif
+1:
+/*@_fini_PROLOG_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*/
+");
diff --git a/sysdeps/sh/elf/start.S b/sysdeps/sh/elf/start.S
new file mode 100644 (file)
index 0000000..21b1ec2
--- /dev/null
@@ -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 --git a/sysdeps/sh/gmp-mparam.h b/sysdeps/sh/gmp-mparam.h
new file mode 100644 (file)
index 0000000..f6423c3
--- /dev/null
@@ -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 --git a/sysdeps/sh/init-first.c b/sysdeps/sh/init-first.c
new file mode 100644 (file)
index 0000000..20d417f
--- /dev/null
@@ -0,0 +1,69 @@
+/* Initialization code run first thing by the ELF startup code.  For SH.
+   Copyright (C) 1995, 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 <unistd.h>
+
+extern void __libc_init (int, char **, char **);
+extern void __getopt_clean_environment (char **);
+extern void __libc_global_ctors (void);
+
+int __libc_multiple_libcs = 1;
+
+static void
+init (int *data)
+{
+  int argc = *data;
+  char **argv = (void *) (data + 1);
+  char **envp = &argv[argc + 1];
+
+  __environ = envp;
+  __libc_init (argc, argv, envp);
+
+  /* This is a hack to make the special getopt in GNU libc working.  */
+  __getopt_clean_environment (envp);
+}
+
+#ifdef SHARED
+/* This function is called to initialize the shared C library.
+   It is called just before the user _start code from sh/sh[34]/elf/start.S,
+   with the stack set up as that code gets it.  */
+
+/* NOTE!  The linker notices the magical name `_init' and sets the DT_INIT
+   pointer in the dynamic section based solely on that.  It is convention
+   for this function to be in the `.init' section, but the symbol name is
+   the only thing that really matters!!  */
+/*void _init (int argc, ...) __attribute__ ((unused, section (".init")));*/
+
+void
+_init (int argc, ...)
+{
+  init (&argc);
+
+  __libc_global_ctors ();
+}
+#endif
+
+
+void
+__libc_init_first (int argc __attribute__ ((unused)), ...)
+{
+#ifndef SHARED
+  init (&argc);
+#endif
+}
diff --git a/sysdeps/sh/machine-gmon.h b/sysdeps/sh/machine-gmon.h
new file mode 100644 (file)
index 0000000..d8b86e5
--- /dev/null
@@ -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 --git a/sysdeps/sh/memcpy.S b/sysdeps/sh/memcpy.S
new file mode 100644 (file)
index 0000000..18be7dc
--- /dev/null
@@ -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 --git a/sysdeps/sh/memprof.h b/sysdeps/sh/memprof.h
new file mode 100644 (file)
index 0000000..a02949f
--- /dev/null
@@ -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 --git a/sysdeps/sh/memset.S b/sysdeps/sh/memset.S
new file mode 100644 (file)
index 0000000..a44a8f7
--- /dev/null
@@ -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 --git a/sysdeps/sh/sh3/__longjmp.S b/sysdeps/sh/sh3/__longjmp.S
new file mode 100644 (file)
index 0000000..09f829a
--- /dev/null
@@ -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 --git a/sysdeps/sh/sh3/bits/endian.h b/sysdeps/sh/sh3/bits/endian.h
new file mode 100644 (file)
index 0000000..1fef1ff
--- /dev/null
@@ -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 --git a/sysdeps/sh/sh3/bits/huge_val.h b/sysdeps/sh/sh3/bits/huge_val.h
new file mode 100644 (file)
index 0000000..a058c99
--- /dev/null
@@ -0,0 +1,104 @@
+/* `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__
+
+# if __GNUC_PREREQ(2,96)
+
+#  define HUGE_VAL (__extension__ 0x1.0p2047)
+
+# else
+
+#  define HUGE_VAL \
+  (__extension__                                                             \
+   ((union { unsigned __l __attribute__((__mode__(__DI__))); double __d; })   \
+    { __l: 0x000000007ff00000ULL }).__d)
+
+# endif
+
+#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 C99 extensions: (float) HUGE_VALF and (long double) HUGE_VALL.  */
+
+#ifdef __USE_ISOC99
+
+# ifdef __GNUC__
+
+#  if __GNUC_PREREQ(2,96)
+
+#   define HUGE_VALF (__extension__ 0x1.0p255f)
+
+#  else
+
+#   define HUGE_VALF \
+  (__extension__                                                             \
+   ((union { unsigned __l __attribute__((__mode__(__SI__))); float __d; })    \
+    { __l: 0x7f800000UL }).__d)
+
+#  endif
+
+# 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_ISOC99.  */
diff --git a/sysdeps/sh/sh3/bits/setjmp.h b/sysdeps/sh/sh3/bits/setjmp.h
new file mode 100644 (file)
index 0000000..d2c4a42
--- /dev/null
@@ -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.  */
+    void * __pc;
+
+    /* The global pointer.  */
+    void * __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) \
+  ((void *) (address) < &(jmpbuf)[0].__regs[7])
diff --git a/sysdeps/sh/sh3/bsd-_setjmp.S b/sysdeps/sh/sh3/bsd-_setjmp.S
new file mode 100644 (file)
index 0000000..d787cd2
--- /dev/null
@@ -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 SHARED
+       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 --git a/sysdeps/sh/sh3/bsd-setjmp.S b/sysdeps/sh/sh3/bsd-setjmp.S
new file mode 100644 (file)
index 0000000..7ffb691
--- /dev/null
@@ -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 SHARED
+       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 --git a/sysdeps/sh/sh3/dl-machine.h b/sysdeps/sh/sh3/dl-machine.h
new file mode 100644 (file)
index 0000000..93a65ac
--- /dev/null
@@ -0,0 +1,520 @@
+/* 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 *) D_PTR (l, l_info[DT_PLTGOT]);
+      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 SHARED
+#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,r5\n\
+       ! Subtract _dl_skip_args from it.\n\
+       sub r0,r5\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 r5,@r15\n\
+       ! Compute argv address and envp.\n\
+       mov r15,r6\n\
+       add #4,r6\n\
+       mov r5,r7\n\
+       shll2 r7\n\
+       add r15,r7\n\
+       mov.l .L_dl_loaded,r0\n\
+       mov.l @(r0,r12),r0\n\
+       mov.l @r0,r4\n\
+       ! Call _dl_init.\n\
+       mov.l .L_dl_init,r1\n\
+       mova .L_dl_init,r0\n\
+       add r1,r0\n\
+       jsr @r0\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_init:\n\
+       .long _dl_init@PLT\n\
+.L_dl_loaded:\n\
+       .long _dl_loaded@GOT\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 Elf32_Addr
+elf_machine_fixup_plt (struct link_map *map, lookup_t t,
+                      const Elf32_Rela *reloc,
+                      Elf32_Addr *reloc_addr, Elf32_Addr value)
+{
+  return *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 *) D_PTR (map, l_info[DT_STRTAB]);
+             _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:
+         _dl_reloc_bad_type (map, ELF32_R_TYPE (reloc->r_info), 0);
+         break;
+       }
+    }
+}
+
+static inline void
+elf_machine_lazy_rel (struct link_map *map,
+                     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.  */
+  if (ELF32_R_TYPE (reloc->r_info) == R_SH_JMP_SLOT)
+    *reloc_addr += l_addr;
+  else
+    _dl_reloc_bad_type (map, ELF32_R_TYPE (reloc->r_info), 1);
+}
+
+#endif /* RESOLVE */
diff --git a/sysdeps/sh/sh3/setjmp.S b/sysdeps/sh/sh3/setjmp.S
new file mode 100644 (file)
index 0000000..ea41f45
--- /dev/null
@@ -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 SHARED
+       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 --git a/sysdeps/sh/sh4/__longjmp.S b/sysdeps/sh/sh4/__longjmp.S
new file mode 100644 (file)
index 0000000..c7100cb
--- /dev/null
@@ -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 --git a/sysdeps/sh/sh4/bits/endian.h b/sysdeps/sh/sh4/bits/endian.h
new file mode 100644 (file)
index 0000000..1fef1ff
--- /dev/null
@@ -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 --git a/sysdeps/sh/sh4/bits/huge_val.h b/sysdeps/sh/sh4/bits/huge_val.h
new file mode 100644 (file)
index 0000000..a058c99
--- /dev/null
@@ -0,0 +1,104 @@
+/* `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__
+
+# if __GNUC_PREREQ(2,96)
+
+#  define HUGE_VAL (__extension__ 0x1.0p2047)
+
+# else
+
+#  define HUGE_VAL \
+  (__extension__                                                             \
+   ((union { unsigned __l __attribute__((__mode__(__DI__))); double __d; })   \
+    { __l: 0x000000007ff00000ULL }).__d)
+
+# endif
+
+#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 C99 extensions: (float) HUGE_VALF and (long double) HUGE_VALL.  */
+
+#ifdef __USE_ISOC99
+
+# ifdef __GNUC__
+
+#  if __GNUC_PREREQ(2,96)
+
+#   define HUGE_VALF (__extension__ 0x1.0p255f)
+
+#  else
+
+#   define HUGE_VALF \
+  (__extension__                                                             \
+   ((union { unsigned __l __attribute__((__mode__(__SI__))); float __d; })    \
+    { __l: 0x7f800000UL }).__d)
+
+#  endif
+
+# 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_ISOC99.  */
diff --git a/sysdeps/sh/sh4/bits/setjmp.h b/sysdeps/sh/sh4/bits/setjmp.h
new file mode 100644 (file)
index 0000000..d5918f2
--- /dev/null
@@ -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.  */
+    void * __pc;
+
+    /* The global pointer.  */
+    void * __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) \
+  ((void *) (address) < &(jmpbuf)[0].__regs[7])
diff --git a/sysdeps/sh/sh4/bsd-_setjmp.S b/sysdeps/sh/sh4/bsd-_setjmp.S
new file mode 100644 (file)
index 0000000..468c857
--- /dev/null
@@ -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 SHARED
+       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 --git a/sysdeps/sh/sh4/bsd-setjmp.S b/sysdeps/sh/sh4/bsd-setjmp.S
new file mode 100644 (file)
index 0000000..2be74bd
--- /dev/null
@@ -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 SHARED
+       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 --git a/sysdeps/sh/sh4/dl-machine.h b/sysdeps/sh/sh4/dl-machine.h
new file mode 100644 (file)
index 0000000..a8de19a
--- /dev/null
@@ -0,0 +1,515 @@
+/* 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 *) D_PTR (l, l_info[DT_PLTGOT]);
+      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 SHARED
+#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,r5\n\
+       ! Subtract _dl_skip_args from it.\n\
+       sub r0,r5\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 r5,@r15\n\
+       ! Compute argv address and envp.\n\
+       mov r15,r6\n\
+       add #4,r6\n\
+       mov r5,r7\n\
+       shll2 r7\n\
+       add r15,r7\n\
+       mov.l .L_dl_loaded,r0\n\
+       mov.l @(r0,r12),r0\n\
+       mov.l @r0,r4\n\
+       ! Call _dl_init.\n\
+       mov.l .L_dl_init,r1\n\
+       mova .L_dl_init,r0\n\
+       add r1,r0\n\
+       jsr @r0\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_init:\n\
+       .long _dl_init@PLT\n\
+.L_dl_loaded:\n\
+       .long _dl_loaded@GOT\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 Elf32_Addr
+elf_machine_fixup_plt (struct link_map *map, lookup_t t,
+                      const Elf32_Rela *reloc,
+                      Elf32_Addr *reloc_addr, Elf32_Addr value)
+{
+  return *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 *) D_PTR (map, l_info[DT_STRTAB]);
+             _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:
+         _dl_reloc_bad_type (map, ELF32_R_TYPE (reloc->r_info), 0);
+         break;
+       }
+    }
+}
+
+static inline void
+elf_machine_lazy_rel (struct link_map *map,
+                     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.  */
+  if (ELF32_R_TYPE (reloc->r_info) == R_SH_JMP_SLOT)
+    *reloc_addr += l_addr;
+  else
+    _dl_reloc_bad_type (map, ELF32_R_TYPE (reloc->r_info), 1);
+}
+
+#endif /* RESOLVE */
diff --git a/sysdeps/sh/sh4/fpu/fclrexcpt.c b/sysdeps/sh/sh4/fpu/fclrexcpt.c
new file mode 100644 (file)
index 0000000..cf77cfe
--- /dev/null
@@ -0,0 +1,45 @@
+/* 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>
+
+int
+__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);
+
+  return 0;
+}
+strong_alias (__feclearexcept, __old_feclearexcept)
+symbol_version (__old_feclearexcept, feclearexcept, GLIBC_2.1);
+default_symbol_version (__feclearexcept, feclearexcept, GLIBC_2.2);
diff --git a/sysdeps/sh/sh4/fpu/fegetenv.c b/sysdeps/sh/sh4/fpu/fegetenv.c
new file mode 100644 (file)
index 0000000..8bd540b
--- /dev/null
@@ -0,0 +1,34 @@
+/* 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>
+
+int
+__fegetenv (fenv_t *envp)
+{
+  unsigned long int temp;
+  _FPU_GETCW (temp);
+  envp->__fpscr = temp;
+
+  return 0;
+}
+strong_alias (__fegetenv, __old_fegetenv)
+symbol_version (__old_fegetenv, fegetenv, GLIBC_2.1);
+default_symbol_version (__fegetenv, fegetenv, GLIBC_2.2);
diff --git a/sysdeps/sh/sh4/fpu/fegetround.c b/sysdeps/sh/sh4/fpu/fegetround.c
new file mode 100644 (file)
index 0000000..f53924a
--- /dev/null
@@ -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 --git a/sysdeps/sh/sh4/fpu/feholdexcpt.c b/sysdeps/sh/sh4/fpu/feholdexcpt.c
new file mode 100644 (file)
index 0000000..43a464d
--- /dev/null
@@ -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 --git a/sysdeps/sh/sh4/fpu/fesetenv.c b/sysdeps/sh/sh4/fpu/fesetenv.c
new file mode 100644 (file)
index 0000000..8424782
--- /dev/null
@@ -0,0 +1,37 @@
+/* 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>
+
+int
+__fesetenv (const fenv_t *envp)
+{
+  if (envp == FE_DFL_ENV)
+      _FPU_SETCW (_FPU_DEFAULT);
+  else
+    {
+      unsigned long int temp = envp->__fpscr;
+      _FPU_SETCW (temp);
+    }
+  return 0;
+}
+strong_alias (__fesetenv, __old_fesetenv)
+symbol_version (__old_fesetenv, fesetenv, GLIBC_2.1);
+default_symbol_version (__fesetenv, fesetenv, GLIBC_2.2);
diff --git a/sysdeps/sh/sh4/fpu/fesetround.c b/sysdeps/sh/sh4/fpu/fesetround.c
new file mode 100644 (file)
index 0000000..1d3ec2e
--- /dev/null
@@ -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 --git a/sysdeps/sh/sh4/fpu/fpu_control.h b/sysdeps/sh/sh4/fpu/fpu_control.h
new file mode 100644 (file)
index 0000000..1cf5154
--- /dev/null
@@ -0,0 +1,56 @@
+/* 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_VM   0x0800  /* Invalid operation */
+#define _FPU_MASK_ZM   0x0400  /* Division by zero  */
+#define _FPU_MASK_OM   0x0200  /* Overflow          */
+#define _FPU_MASK_UM   0x0100  /* Underflow         */
+#define _FPU_MASK_IM   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.  */
+#define _FPU_IEEE      0x00080f80 /* Default + exceptions enabled. */
+
+/* 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 --git a/sysdeps/sh/sh4/fpu/fraiseexcpt.c b/sysdeps/sh/sh4/fpu/fraiseexcpt.c
new file mode 100644 (file)
index 0000000..31d8d92
--- /dev/null
@@ -0,0 +1,38 @@
+/* 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>
+
+int
+__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);
+
+  return 0;
+}
+strong_alias (__feraiseexcept, __old_feraiseexcept)
+symbol_version (__old_feraiseexcept, feraiseexcept, GLIBC_2.1);
+default_symbol_version (__feraiseexcept, feraiseexcept, GLIBC_2.2);
diff --git a/sysdeps/sh/sh4/fpu/fsetexcptflg.c b/sysdeps/sh/sh4/fpu/fsetexcptflg.c
new file mode 100644 (file)
index 0000000..b88077a
--- /dev/null
@@ -0,0 +1,43 @@
+/* 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>
+
+int
+__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);
+
+  return 0;
+}
+strong_alias (__fesetexceptflag, __old_fesetexceptflag)
+symbol_version (__old_fesetexceptflag, fesetexceptflag, GLIBC_2.1);
+default_symbol_version (__fesetexceptflag, fesetexceptflag, GLIBC_2.2);
diff --git a/sysdeps/sh/sh4/fpu/ftestexcept.c b/sysdeps/sh/sh4/fpu/ftestexcept.c
new file mode 100644 (file)
index 0000000..23ce149
--- /dev/null
@@ -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 --git a/sysdeps/sh/sh4/fpu/libm-test-ulps b/sysdeps/sh/sh4/fpu/libm-test-ulps
new file mode 100644 (file)
index 0000000..4737025
--- /dev/null
@@ -0,0 +1,1079 @@
+# Begin of automatic generation
+
+# asin
+Test "asin (-0.5) == -pi/6":
+float: 2
+ifloat: 2
+Test "asin (0.5) == pi/6":
+float: 2
+ifloat: 2
+Test "asin (0.7) == 0.7753974966107530637":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+# atanh
+Test "atanh (0.7) == 0.8673005276940531944":
+double: 1
+idouble: 1
+
+# cabs
+Test "cabs (-0.7 + 12.4 i) == 12.41974234837422060118":
+float: 1
+ifloat: 1
+Test "cabs (-0.7 - 12.4 i) == 12.41974234837422060118":
+float: 1
+ifloat: 1
+Test "cabs (-12.4 + 0.7 i) == 12.41974234837422060118":
+float: 1
+ifloat: 1
+Test "cabs (-12.4 - 0.7 i) == 12.41974234837422060118":
+float: 1
+ifloat: 1
+Test "cabs (0.7 + 1.2 i) == 1.3892443989449804508":
+double: 1
+idouble: 1
+Test "cabs (0.7 + 12.4 i) == 12.41974234837422060118":
+float: 1
+ifloat: 1
+
+# cacos
+Test "Real part of: cacos (0.7 + 1.2 i) == 1.1351827477151551089 - 1.0927647857577371459 i":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Imaginary part of: cacos (0.7 + 1.2 i) == 1.1351827477151551089 - 1.0927647857577371459 i":
+float: 1
+ifloat: 1
+
+# cacosh
+Test "Real part of: cacosh (-2 - 3 i) == -1.9833870299165354323 + 2.1414491111159960199 i":
+double: 1
+float: 7
+idouble: 1
+ifloat: 7
+Test "Imaginary part of: cacosh (-2 - 3 i) == -1.9833870299165354323 + 2.1414491111159960199 i":
+double: 1
+float: 3
+idouble: 1
+ifloat: 3
+Test "Real part of: cacosh (0.7 + 1.2 i) == 1.0927647857577371459 + 1.1351827477151551089 i":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+# casin
+Test "Real part of: casin (0.7 + 1.2 i) == 0.4356135790797415103 + 1.0927647857577371459 i":
+double: 3
+float: 2
+idouble: 3
+ifloat: 2
+Test "Imaginary part of: casin (0.7 + 1.2 i) == 0.4356135790797415103 + 1.0927647857577371459 i":
+float: 1
+ifloat: 1
+
+# casinh
+Test "Real part of: casinh (-2 - 3 i) == -1.9686379257930962917 - 0.9646585044076027920 i":
+double: 5
+float: 1
+idouble: 5
+ifloat: 1
+Test "Imaginary part of: casinh (-2 - 3 i) == -1.9686379257930962917 - 0.9646585044076027920 i":
+double: 3
+float: 6
+idouble: 3
+ifloat: 6
+Test "Real part of: casinh (0.7 + 1.2 i) == 0.9786545955936738768 + 0.9113541895315601156 i":
+double: 1
+idouble: 1
+Test "Imaginary part of: casinh (0.7 + 1.2 i) == 0.9786545955936738768 + 0.9113541895315601156 i":
+float: 1
+ifloat: 1
+
+# catan
+Test "Real part of: catan (-2 - 3 i) == -1.4099210495965755225 - 0.2290726829685387662 i":
+float: 3
+ifloat: 3
+Test "Imaginary part of: catan (-2 - 3 i) == -1.4099210495965755225 - 0.2290726829685387662 i":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Real part of: catan (0.7 + 1.2 i) == 1.0785743834118921877 + 0.5770573776534306764 i":
+float: 4
+ifloat: 4
+Test "Imaginary part of: catan (0.7 + 1.2 i) == 1.0785743834118921877 + 0.5770573776534306764 i":
+double: 1
+idouble: 1
+
+# catanh
+Test "Real part of: catanh (-2 - 3 i) == -0.1469466662255297520 - 1.3389725222944935611 i":
+double: 4
+idouble: 4
+Test "Imaginary part of: catanh (-2 - 3 i) == -0.1469466662255297520 - 1.3389725222944935611 i":
+float: 4
+ifloat: 4
+Test "Real part of: catanh (0.7 + 1.2 i) == 0.2600749516525135959 + 0.9702403077950989849 i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: catanh (0.7 + 1.2 i) == 0.2600749516525135959 + 0.9702403077950989849 i":
+double: 1
+float: 6
+idouble: 1
+ifloat: 6
+
+# cbrt
+Test "cbrt (-27.0) == -3.0":
+double: 1
+idouble: 1
+Test "cbrt (0.970299) == 0.99":
+double: 1
+idouble: 1
+
+# ccos
+Test "Imaginary part of: ccos (-2 - 3 i) == -4.1896256909688072301 - 9.1092278937553365979 i":
+float: 1
+ifloat: 1
+Test "Real part of: ccos (0.7 + 1.2 i) == 1.3848657645312111080 - 0.97242170335830028619 i":
+double: 1
+idouble: 1
+Test "Imaginary part of: ccos (0.7 + 1.2 i) == 1.3848657645312111080 - 0.97242170335830028619 i":
+double: 1
+idouble: 1
+
+# ccosh
+Test "Real part of: ccosh (-2 - 3 i) == -3.7245455049153225654 + 0.5118225699873846088 i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: ccosh (-2 - 3 i) == -3.7245455049153225654 + 0.5118225699873846088 i":
+float: 1
+ifloat: 1
+Test "Real part of: ccosh (0.7 + 1.2 i) == 0.4548202223691477654 + 0.7070296600921537682 i":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Imaginary part of: ccosh (0.7 + 1.2 i) == 0.4548202223691477654 + 0.7070296600921537682 i":
+double: 1
+idouble: 1
+
+# cexp
+Test "Imaginary part of: cexp (-2.0 - 3.0 i) == -0.1339809149295426134 - 0.0190985162611351964 i":
+float: 1
+ifloat: 1
+Test "Real part of: cexp (0.7 + 1.2 i) == 0.7296989091503236012 + 1.8768962328348102821 i":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Imaginary part of: cexp (0.7 + 1.2 i) == 0.7296989091503236012 + 1.8768962328348102821 i":
+float: 1
+ifloat: 1
+
+# clog
+Test "Imaginary part of: clog (-2 - 3 i) == 1.2824746787307683680 - 2.1587989303424641704 i":
+double: 1
+float: 3
+idouble: 1
+ifloat: 3
+
+# clog10
+Test "Imaginary part of: clog10 (-0 + inf i) == inf + pi/2*log10(e) i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: clog10 (-0 - inf i) == inf - pi/2*log10(e) i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: clog10 (-2 - 3 i) == 0.5569716761534183846 - 0.9375544629863747085 i":
+double: 1
+float: 5
+idouble: 1
+ifloat: 5
+Test "Imaginary part of: clog10 (-3 + inf i) == inf + pi/2*log10(e) i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: clog10 (-3 - inf i) == inf - pi/2*log10(e) i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: clog10 (-inf + 0 i) == inf + pi*log10(e) i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: clog10 (-inf + 1 i) == inf + pi*log10(e) i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: clog10 (-inf - 0 i) == inf - pi*log10(e) i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: clog10 (-inf - 1 i) == inf - pi*log10(e) i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: clog10 (0 + inf i) == inf + pi/2*log10(e) i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: clog10 (0 - inf i) == inf - pi/2*log10(e) i":
+float: 1
+ifloat: 1
+Test "Real part of: clog10 (0.7 + 1.2 i) == 0.1427786545038868803 + 0.4528483579352493248 i":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Imaginary part of: clog10 (0.7 + 1.2 i) == 0.1427786545038868803 + 0.4528483579352493248 i":
+double: 1
+idouble: 1
+Test "Imaginary part of: clog10 (3 + inf i) == inf + pi/2*log10(e) i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: clog10 (3 - inf i) == inf - pi/2*log10(e) i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: clog10 (inf + inf i) == inf + pi/4*log10(e) i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: clog10 (inf - inf i) == inf - pi/4*log10(e) i":
+float: 1
+ifloat: 1
+
+# cos
+Test "cos (0.7) == 0.7648421872844884262":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "cos (M_PI_6l * 2.0) == 0.5":
+double: 1
+float: 0.5
+idouble: 1
+ifloat: 0.5
+Test "cos (M_PI_6l * 4.0) == -0.5":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+Test "cos (pi/2) == 0":
+double: 0.2758
+float: 0.3667
+idouble: 0.2758
+ifloat: 0.3667
+
+# cpow
+Test "Real part of: cpow (2 + 3 i, 4 + 0 i) == -119.0 - 120.0 i":
+double: 1
+float: 4
+idouble: 1
+ifloat: 4
+Test "Imaginary part of: cpow (2 + 3 i, 4 + 0 i) == -119.0 - 120.0 i":
+float: 2
+ifloat: 2
+Test "Imaginary part of: cpow (e + 0 i, 0 + 2 * M_PIl i) == 1.0 + 0.0 i":
+double: 1.1031
+float: 1.5
+idouble: 1.1031
+ifloat: 1.5
+
+# csin
+Test "Imaginary part of: csin (0.7 + 1.2 i) == 1.1664563419657581376 + 1.1544997246948547371 i":
+float: 1
+ifloat: 1
+
+# csinh
+Test "Imaginary part of: csinh (-2 - 3 i) == 3.5905645899857799520 - 0.5309210862485198052 i":
+double: 1
+idouble: 1
+Test "Real part of: csinh (0.7 + 1.2 i) == 0.27487868678117583582 + 1.1698665727426565139 i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: csinh (0.7 + 1.2 i) == 0.27487868678117583582 + 1.1698665727426565139 i":
+float: 1
+ifloat: 1
+
+# csqrt
+Test "Real part of: csqrt (-2 + 3 i) == 0.8959774761298381247 + 1.6741492280355400404 i":
+float: 1
+ifloat: 1
+Test "Real part of: csqrt (-2 - 3 i) == 0.8959774761298381247 - 1.6741492280355400404 i":
+float: 1
+ifloat: 1
+Test "Real part of: csqrt (0.7 + 1.2 i) == 1.0220676100300264507 + 0.5870453129635652115 i":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Imaginary part of: csqrt (0.7 + 1.2 i) == 1.0220676100300264507 + 0.5870453129635652115 i":
+float: 1
+ifloat: 1
+
+# ctan
+Test "Real part of: ctan (-2 - 3 i) == 0.0037640256415042482 - 1.0032386273536098014 i":
+double: 1
+idouble: 1
+Test "Real part of: ctan (0.7 + 1.2 i) == 0.1720734197630349001 + 0.9544807059989405538 i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: ctan (0.7 + 1.2 i) == 0.1720734197630349001 + 0.9544807059989405538 i":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+# ctanh
+Test "Real part of: ctanh (-2 - 3 i) == -0.9653858790221331242 + 0.0098843750383224937 i":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+Test "Imaginary part of: ctanh (0 + pi/4 i) == 0.0 + 1.0 i":
+float: 1
+ifloat: 1
+Test "Real part of: ctanh (0.7 + 1.2 i) == 1.3472197399061191630 + 0.4778641038326365540 i":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+Test "Imaginary part of: ctanh (0.7 + 1.2 i) == 1.3472197399061191630 + 0.4778641038326365540 i":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+
+# erfc
+Test "erfc (0.7) == 0.32219880616258152702":
+double: 1
+idouble: 1
+Test "erfc (1.2) == 0.089686021770364619762":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+Test "erfc (2.0) == 0.0046777349810472658379":
+double: 1
+idouble: 1
+Test "erfc (4.1) == 0.67000276540848983727e-8":
+double: 24
+float: 12
+idouble: 24
+ifloat: 12
+
+# exp10
+Test "exp10 (-1) == 0.1":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+Test "exp10 (0.7) == 5.0118723362727228500":
+float: 1
+ifloat: 1
+Test "exp10 (3) == 1000":
+double: 6
+float: 2
+idouble: 6
+ifloat: 2
+
+# expm1
+Test "expm1 (1) == M_El - 1.0":
+float: 1
+ifloat: 1
+
+# fmod
+Test "fmod (-6.5, -2.3) == -1.9":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+Test "fmod (-6.5, 2.3) == -1.9":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+Test "fmod (6.5, -2.3) == 1.9":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+Test "fmod (6.5, 2.3) == 1.9":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+
+# hypot
+Test "hypot (-0.7, -12.4) == 12.41974234837422060118":
+float: 1
+ifloat: 1
+Test "hypot (-0.7, 12.4) == 12.41974234837422060118":
+float: 1
+ifloat: 1
+Test "hypot (-12.4, -0.7) == 12.41974234837422060118":
+float: 1
+ifloat: 1
+Test "hypot (-12.4, 0.7) == 12.41974234837422060118":
+float: 1
+ifloat: 1
+Test "hypot (0.7, -12.4) == 12.41974234837422060118":
+float: 1
+ifloat: 1
+Test "hypot (0.7, 1.2) == 1.3892443989449804508":
+double: 1
+idouble: 1
+Test "hypot (0.7, 12.4) == 12.41974234837422060118":
+float: 1
+ifloat: 1
+Test "hypot (12.4, -0.7) == 12.41974234837422060118":
+float: 1
+ifloat: 1
+Test "hypot (12.4, 0.7) == 12.41974234837422060118":
+float: 1
+ifloat: 1
+
+# j0
+Test "j0 (10.0) == -0.24593576445134833520":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+Test "j0 (2.0) == 0.22389077914123566805":
+float: 2
+ifloat: 2
+Test "j0 (8.0) == 0.17165080713755390609":
+float: 1
+ifloat: 1
+
+# j1
+Test "j1 (10.0) == 0.043472746168861436670":
+float: 2
+ifloat: 2
+Test "j1 (2.0) == 0.57672480775687338720":
+double: 1
+idouble: 1
+Test "j1 (8.0) == 0.23463634685391462438":
+double: 1
+idouble: 1
+
+# jn
+Test "jn (0, 10.0) == -0.24593576445134833520":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+Test "jn (0, 2.0) == 0.22389077914123566805":
+float: 2
+ifloat: 2
+Test "jn (0, 8.0) == 0.17165080713755390609":
+float: 1
+ifloat: 1
+Test "jn (1, 10.0) == 0.043472746168861436670":
+float: 2
+ifloat: 2
+Test "jn (1, 2.0) == 0.57672480775687338720":
+double: 1
+idouble: 1
+Test "jn (1, 8.0) == 0.23463634685391462438":
+double: 1
+idouble: 1
+Test "jn (10, 0.1) == 0.26905328954342155795e-19":
+double: 6
+float: 4
+idouble: 6
+ifloat: 4
+Test "jn (10, 0.7) == 0.75175911502153953928e-11":
+double: 3
+float: 1
+idouble: 3
+ifloat: 1
+Test "jn (10, 10.0) == 0.20748610663335885770":
+double: 4
+float: 3
+idouble: 4
+ifloat: 3
+Test "jn (10, 2.0) == 0.25153862827167367096e-6":
+float: 4
+ifloat: 4
+Test "jn (3, 0.1) == 0.000020820315754756261429":
+double: 1
+idouble: 1
+Test "jn (3, 0.7) == 0.0069296548267508408077":
+float: 1
+ifloat: 1
+Test "jn (3, 10.0) == 0.058379379305186812343":
+double: 3
+float: 1
+idouble: 3
+ifloat: 1
+Test "jn (3, 2.0) == 0.12894324947440205110":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+# lgamma
+Test "lgamma (0.7) == 0.26086724653166651439":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "lgamma (1.2) == -0.853740900033158497197e-1":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+# log
+Test "log (0.7) == -0.35667494393873237891":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+# log10
+Test "log10 (0.7) == -0.15490195998574316929":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "log10 (e) == log10(e)":
+float: 1
+ifloat: 1
+
+# log1p
+Test "log1p (-0.3) == -0.35667494393873237891":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+# log2
+Test "log2 (0.7) == -0.51457317282975824043":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+# sincos
+Test "sincos (0.7, &sin_res, &cos_res) puts 0.76484218728448842626 in cos_res":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "sincos (M_PI_6l*2.0, &sin_res, &cos_res) puts 0.5 in cos_res":
+double: 1
+float: 0.5
+idouble: 1
+ifloat: 0.5
+Test "sincos (M_PI_6l*2.0, &sin_res, &cos_res) puts 0.866025403784438646764 in sin_res":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "sincos (pi/2, &sin_res, &cos_res) puts 0 in cos_res":
+double: 0.2758
+float: 0.3667
+idouble: 0.2758
+ifloat: 0.3667
+Test "sincos (pi/6, &sin_res, &cos_res) puts 0.866025403784438646764 in cos_res":
+float: 1
+ifloat: 1
+
+# sinh
+Test "sinh (0.7) == 0.75858370183953350346":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+# tan
+Test "tan (pi/4) == 1":
+double: 0.5
+idouble: 0.5
+
+# tanh
+Test "tanh (0.7) == 0.60436777711716349631":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+# tgamma
+Test "tgamma (-0.5) == -2 sqrt (pi)":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "tgamma (0.5) == sqrt (pi)":
+float: 1
+ifloat: 1
+Test "tgamma (0.7) == 1.29805533264755778568":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+# y0
+Test "y0 (0.7) == -0.19066492933739506743":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+Test "y0 (1.0) == 0.088256964215676957983":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+Test "y0 (1.5) == 0.38244892379775884396":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+Test "y0 (10.0) == 0.055671167283599391424":
+float: 1
+ifloat: 1
+Test "y0 (8.0) == 0.22352148938756622053":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+# y1
+Test "y1 (0.1) == -6.4589510947020269877":
+double: 1
+idouble: 1
+Test "y1 (0.7) == -1.1032498719076333697":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "y1 (1.5) == -0.41230862697391129595":
+float: 1
+ifloat: 1
+Test "y1 (10.0) == 0.24901542420695388392":
+double: 3
+float: 1
+idouble: 3
+ifloat: 1
+Test "y1 (2.0) == -0.10703243154093754689":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "y1 (8.0) == -0.15806046173124749426":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+# yn
+Test "yn (0, 0.7) == -0.19066492933739506743":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+Test "yn (0, 1.0) == 0.088256964215676957983":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+Test "yn (0, 1.5) == 0.38244892379775884396":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+Test "yn (0, 10.0) == 0.055671167283599391424":
+float: 1
+ifloat: 1
+Test "yn (0, 8.0) == 0.22352148938756622053":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "yn (1, 0.1) == -6.4589510947020269877":
+double: 1
+idouble: 1
+Test "yn (1, 0.7) == -1.1032498719076333697":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "yn (1, 1.5) == -0.41230862697391129595":
+float: 1
+ifloat: 1
+Test "yn (1, 10.0) == 0.24901542420695388392":
+double: 3
+float: 1
+idouble: 3
+ifloat: 1
+Test "yn (1, 2.0) == -0.10703243154093754689":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "yn (1, 8.0) == -0.15806046173124749426":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+Test "yn (10, 0.1) == -0.11831335132045197885e19":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+Test "yn (10, 0.7) == -0.42447194260703866924e10":
+double: 3
+idouble: 3
+Test "yn (10, 1.0) == -0.12161801427868918929e9":
+double: 1
+idouble: 1
+Test "yn (10, 10.0) == -0.35981415218340272205":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "yn (10, 2.0) == -129184.54220803928264":
+double: 2
+idouble: 2
+Test "yn (3, 0.1) == -5099.3323786129048894":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "yn (3, 0.7) == -15.819479052819633505":
+double: 3
+float: 1
+idouble: 3
+ifloat: 1
+Test "yn (3, 10.0) == -0.25136265718383732978":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "yn (3, 2.0) == -1.1277837768404277861":
+double: 1
+idouble: 1
+
+# Maximal error of functions:
+Function: "asin":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: "atanh":
+double: 1
+idouble: 1
+
+Function: "cabs":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Real part of "cacos":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Imaginary part of "cacos":
+float: 1
+ifloat: 1
+
+Function: Real part of "cacosh":
+double: 1
+float: 7
+idouble: 1
+ifloat: 7
+
+Function: Imaginary part of "cacosh":
+double: 1
+float: 3
+idouble: 1
+ifloat: 3
+
+Function: Real part of "casin":
+double: 3
+float: 2
+idouble: 3
+ifloat: 2
+
+Function: Imaginary part of "casin":
+float: 1
+ifloat: 1
+
+Function: Real part of "casinh":
+double: 5
+float: 1
+idouble: 5
+ifloat: 1
+
+Function: Imaginary part of "casinh":
+double: 3
+float: 6
+idouble: 3
+ifloat: 6
+
+Function: Real part of "catan":
+float: 4
+ifloat: 4
+
+Function: Imaginary part of "catan":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Real part of "catanh":
+double: 4
+float: 1
+idouble: 4
+ifloat: 1
+
+Function: Imaginary part of "catanh":
+double: 1
+float: 6
+idouble: 1
+ifloat: 6
+
+Function: "cbrt":
+double: 1
+idouble: 1
+
+Function: Real part of "ccos":
+double: 1
+idouble: 1
+
+Function: Imaginary part of "ccos":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Real part of "ccosh":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Imaginary part of "ccosh":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Real part of "cexp":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Imaginary part of "cexp":
+float: 1
+ifloat: 1
+
+Function: Imaginary part of "clog":
+double: 1
+float: 3
+idouble: 1
+ifloat: 3
+
+Function: Real part of "clog10":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Imaginary part of "clog10":
+double: 1
+float: 5
+idouble: 1
+ifloat: 5
+
+Function: "cos":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+
+Function: Real part of "cpow":
+double: 1
+float: 4
+idouble: 1
+ifloat: 4
+
+Function: Imaginary part of "cpow":
+double: 1.1031
+float: 2
+idouble: 1.1031
+ifloat: 2
+
+Function: Imaginary part of "csin":
+float: 1
+ifloat: 1
+
+Function: Real part of "csinh":
+float: 1
+ifloat: 1
+
+Function: Imaginary part of "csinh":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Real part of "csqrt":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Imaginary part of "csqrt":
+float: 1
+ifloat: 1
+
+Function: Real part of "ctan":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Imaginary part of "ctan":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Real part of "ctanh":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: Imaginary part of "ctanh":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+
+Function: "erfc":
+double: 24
+float: 12
+idouble: 24
+ifloat: 12
+
+Function: "exp10":
+double: 6
+float: 2
+idouble: 6
+ifloat: 2
+
+Function: "expm1":
+float: 1
+ifloat: 1
+
+Function: "fmod":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+
+Function: "hypot":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "j0":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: "j1":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: "jn":
+double: 6
+float: 4
+idouble: 6
+ifloat: 4
+
+Function: "lgamma":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: "log":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "log10":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "log1p":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "log2":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "sincos":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "sinh":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "tan":
+double: 0.5
+idouble: 0.5
+
+Function: "tanh":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "tgamma":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "y0":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+
+Function: "y1":
+double: 3
+float: 2
+idouble: 3
+ifloat: 2
+
+Function: "yn":
+double: 3
+float: 2
+idouble: 3
+ifloat: 2
+
+# end of automatic generation
diff --git a/sysdeps/sh/sh4/setjmp.S b/sysdeps/sh/sh4/setjmp.S
new file mode 100644 (file)
index 0000000..76061cd
--- /dev/null
@@ -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 SHARED
+       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 --git a/sysdeps/sh/strlen.S b/sysdeps/sh/strlen.S
new file mode 100644 (file)
index 0000000..f79a5cd
--- /dev/null
@@ -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 --git a/sysdeps/sh/sys/ucontext.h b/sysdeps/sh/sys/ucontext.h
new file mode 100644 (file)
index 0000000..84ff44a
--- /dev/null
@@ -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 --git a/sysdeps/sh/sysdep.h b/sysdeps/sh/sysdep.h
new file mode 100644 (file)
index 0000000..b0e791e
--- /dev/null
@@ -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 SHARED
+#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 --git a/sysdeps/unix/sh/sysdep.S b/sysdeps/unix/sh/sysdep.S
new file mode 100644 (file)
index 0000000..671eaba
--- /dev/null
@@ -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 SHARED
+#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 SHARED
+#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 --git a/sysdeps/unix/sh/sysdep.h b/sysdeps/unix/sh/sysdep.h
new file mode 100644 (file)
index 0000000..6e8a168
--- /dev/null
@@ -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 --git a/sysdeps/unix/sysv/linux/sh/Dist b/sysdeps/unix/sysv/linux/sh/Dist
new file mode 100644 (file)
index 0000000..41c9f08
--- /dev/null
@@ -0,0 +1,9 @@
+clone.S
+ioperm.c
+pipe.S
+setresuid.c
+setresgid.c
+setfsuid.c
+setfsgid.c
+sys/io.h
+sys/user.h
diff --git a/sysdeps/unix/sysv/linux/sh/Makefile b/sysdeps/unix/sysv/linux/sh/Makefile
new file mode 100644 (file)
index 0000000..57cd3d9
--- /dev/null
@@ -0,0 +1,12 @@
+ifeq ($(subdir),io)
+sysdep_routines += pipe
+endif
+
+ifeq ($(subdir),misc)
+sysdep_routines += setfsgid setfsuid setresgid setresuid
+endif
+
+ifeq ($(subdir),signal)
+sysdep_routines += rt_sigsuspend rt_sigprocmask rt_sigtimedwait        \
+                  rt_sigqueueinfo rt_sigaction rt_sigpending
+endif
diff --git a/sysdeps/unix/sysv/linux/sh/Versions b/sysdeps/unix/sysv/linux/sh/Versions
new file mode 100644 (file)
index 0000000..bd4b693
--- /dev/null
@@ -0,0 +1,6 @@
+libc {
+  GLIBC_2.2 {
+    # New rlimit interface
+    getrlimit; setrlimit; getrlimit64;
+  }
+}
diff --git a/sysdeps/unix/sysv/linux/sh/bits/mman.h b/sysdeps/unix/sysv/linux/sh/bits/mman.h
new file mode 100644 (file)
index 0000000..0086250
--- /dev/null
@@ -0,0 +1,93 @@
+/* Definitions for POSIX memory map interface.  Linux/SH version.
+   Copyright (C) 1997, 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_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
+
+/* Advice to `madvise'.  */
+#ifdef __USE_BSD
+# define MADV_NORMAL    0      /* No further special treatment.  */
+# define MADV_RANDOM    1      /* Expect random page references.  */
+# define MADV_SEQUENTIAL 2     /* Expect sequential page references.  */
+# define MADV_WILLNEED  3      /* Will need these pages.  */
+# define MADV_DONTNEED  4      /* Don't need these pages.  */
+#endif
+
+/* The POSIX people had to invent similar names for the same things.  */
+#ifdef __USE_XOPEN2K
+# define POSIX_MADV_NORMAL     0 /* No further special treatment.  */
+# define POSIX_MADV_RANDOM     1 /* Expect random page references.  */
+# define POSIX_MADV_SEQUENTIAL 2 /* Expect sequential page references.  */
+# define POSIX_MADV_WILLNEED   3 /* Will need these pages.  */
+# define POSIX_MADV_DONTNEED   4 /* Don't need these pages.  */
+#endif
diff --git a/sysdeps/unix/sysv/linux/sh/bits/resource.h b/sysdeps/unix/sysv/linux/sh/bits/resource.h
new file mode 100644 (file)
index 0000000..710f111
--- /dev/null
@@ -0,0 +1,205 @@
+/* Bit values & structures for resource limits.  Linux version.
+   Copyright (C) 1994, 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.  */
+
+#ifndef _SYS_RESOURCE_H
+# error "Never use <bits/resource.h> directly; include <sys/resource.h> instead."
+#endif
+
+#include <bits/types.h>
+
+/* Transmute defines to enumerations.  The macro re-definitions are
+   necessary because some programs want to test for operating system
+   features with #ifdef RUSAGE_SELF.  In ISO C the reflexive
+   definition is a no-op.  */
+
+/* Kinds of resource limit.  */
+enum __rlimit_resource
+{
+  /* Per-process CPU limit, in seconds.  */
+  RLIMIT_CPU = 0,
+#define RLIMIT_CPU RLIMIT_CPU
+
+  /* Largest file that can be created, in bytes.  */
+  RLIMIT_FSIZE = 1,
+#define        RLIMIT_FSIZE RLIMIT_FSIZE
+
+  /* Maximum size of data segment, in bytes.  */
+  RLIMIT_DATA = 2,
+#define        RLIMIT_DATA RLIMIT_DATA
+
+  /* Maximum size of stack segment, in bytes.  */
+  RLIMIT_STACK = 3,
+#define        RLIMIT_STACK RLIMIT_STACK
+
+  /* Largest core file that can be created, in bytes.  */
+  RLIMIT_CORE = 4,
+#define        RLIMIT_CORE RLIMIT_CORE
+
+  /* Largest resident set size, in bytes.
+     This affects swapping; processes that are exceeding their
+     resident set size will be more likely to have physical memory
+     taken from them.  */
+  RLIMIT_RSS = 5,
+#define        RLIMIT_RSS RLIMIT_RSS
+
+  /* Number of open files.  */
+  RLIMIT_NOFILE = 7,
+  RLIMIT_OFILE = RLIMIT_NOFILE, /* BSD name for same.  */
+#define RLIMIT_NOFILE RLIMIT_NOFILE
+#define RLIMIT_OFILE RLIMIT_OFILE
+
+  /* Address space limit.  */
+  RLIMIT_AS = 9,
+#define RLIMIT_AS RLIMIT_AS
+
+  /* Number of processes.  */
+  RLIMIT_NPROC = 6,
+#define RLIMIT_NPROC RLIMIT_NPROC
+
+  /* Locked-in-memory address space.  */
+  RLIMIT_MEMLOCK = 8,
+#define RLIMIT_MEMLOCK RLIMIT_MEMLOCK
+
+  RLIMIT_NLIMITS = 10,
+  RLIM_NLIMITS = RLIMIT_NLIMITS
+#define RLIMIT_NLIMITS RLIMIT_NLIMITS
+#define RLIM_NLIMITS RLIM_NLIMITS
+};
+
+/* Value to indicate that there is no limit.  */
+#ifndef __USE_FILE_OFFSET64
+# define RLIM_INFINITY ((unsigned long int)(~0UL))
+#else
+# define RLIM_INFINITY 0xffffffffffffffffuLL
+#endif
+
+#ifdef __USE_LARGEFILE64
+# define RLIM64_INFINITY 0xffffffffffffffffuLL
+#endif
+
+/* We can represent all limits.  */
+#define RLIM_SAVED_MAX RLIM_INFINITY
+#define RLIM_SAVED_CUR RLIM_INFINITY
+
+
+/* Type for resource quantity measurement.  */
+#ifndef __USE_FILE_OFFSET64
+typedef __rlim_t rlim_t;
+#else
+typedef __rlim64_t rlim_t;
+#endif
+#ifdef __USE_LARGEFILE64
+typedef __rlim64_t rlim64_t;
+#endif
+
+struct rlimit
+  {
+    /* The current (soft) limit.  */
+    rlim_t rlim_cur;
+    /* The hard limit.  */
+    rlim_t rlim_max;
+  };
+
+#ifdef __USE_LARGEFILE64
+struct rlimit64
+  {
+    /* The current (soft) limit.  */
+    rlim64_t rlim_cur;
+    /* The hard limit.  */
+    rlim64_t rlim_max;
+ };
+#endif
+
+/* Whose usage statistics do you want?  */
+enum __rusage_who
+{
+  /* The calling process.  */
+  RUSAGE_SELF = 0,
+#define RUSAGE_SELF RUSAGE_SELF
+
+  /* All of its terminated child processes.  */
+  RUSAGE_CHILDREN = -1,
+#define RUSAGE_CHILDREN RUSAGE_CHILDREN
+
+  /* Both.  */
+  RUSAGE_BOTH = -2
+#define RUSAGE_BOTH RUSAGE_BOTH
+};
+
+#define __need_timeval
+#include <bits/time.h>         /* For `struct timeval'.  */
+
+/* Structure which says how much of each resource has been used.  */
+struct rusage
+  {
+    /* Total amount of user time used.  */
+    struct timeval ru_utime;
+    /* Total amount of system time used.  */
+    struct timeval ru_stime;
+    /* Maximum resident set size (in kilobytes).  */
+    long int ru_maxrss;
+    /* Amount of sharing of text segment memory
+       with other processes (kilobyte-seconds).  */
+    long int ru_ixrss;
+    /* Amount of data segment memory used (kilobyte-seconds).  */
+    long int ru_idrss;
+    /* Amount of stack memory used (kilobyte-seconds).  */
+    long int ru_isrss;
+    /* Number of soft page faults (i.e. those serviced by reclaiming
+       a page from the list of pages awaiting reallocation.  */
+    long int ru_minflt;
+    /* Number of hard page faults (i.e. those that required I/O).  */
+    long int ru_majflt;
+    /* Number of times a process was swapped out of physical memory.  */
+    long int ru_nswap;
+    /* Number of input operations via the file system.  Note: This
+       and `ru_oublock' do not include operations with the cache.  */
+    long int ru_inblock;
+    /* Number of output operations via the file system.  */
+    long int ru_oublock;
+    /* Number of IPC messages sent.  */
+    long int ru_msgsnd;
+    /* Number of IPC messages received.  */
+    long int ru_msgrcv;
+    /* Number of signals delivered.  */
+    long int ru_nsignals;
+    /* Number of voluntary context switches, i.e. because the process
+       gave up the process before it had to (usually to wait for some
+       resource to be available).  */
+    long int ru_nvcsw;
+    /* Number of involuntary context switches, i.e. a higher priority process
+       became runnable or the current process used up its time slice.  */
+    long int ru_nivcsw;
+  };
+
+/* Priority limits.  */
+#define PRIO_MIN       -20     /* Minimum priority a process can have.  */
+#define PRIO_MAX       20      /* Maximum priority a process can have.  */
+
+/* The type of the WHICH argument to `getpriority' and `setpriority',
+   indicating what flavor of entity the WHO argument specifies.  */
+enum __priority_which
+{
+  PRIO_PROCESS = 0,            /* WHO is a process ID.  */
+#define PRIO_PROCESS PRIO_PROCESS
+  PRIO_PGRP = 1,               /* WHO is a process group ID.  */
+#define PRIO_PGRP PRIO_PGRP
+  PRIO_USER = 2                        /* WHO is a user ID.  */
+#define PRIO_USER PRIO_USER
+};
diff --git a/sysdeps/unix/sysv/linux/sh/brk.c b/sysdeps/unix/sysv/linux/sh/brk.c
new file mode 100644 (file)
index 0000000..79c43b7
--- /dev/null
@@ -0,0 +1,50 @@
+/* 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;
+
+  asm ("mov %1, r4\n"
+       "mov %2, r0\n"
+       "trapa #0\n"    /* do the system call */
+       "mov r0, %0;"   /* keep the return value */
+       : "=r"(newbrk) 
+       : "r"(addr), "i" (SYS_ify (brk))
+       : "r0");
+
+  __curbrk = newbrk;
+
+  if (newbrk < addr)
+    {
+      __set_errno (ENOMEM);
+      return -1;
+    }
+
+  return 0;
+}
+weak_alias (__brk, brk)
diff --git a/sysdeps/unix/sysv/linux/sh/chown.c b/sysdeps/unix/sysv/linux/sh/chown.c
new file mode 100644 (file)
index 0000000..1961622
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/m68k/chown.c>
diff --git a/sysdeps/unix/sysv/linux/sh/clone.S b/sysdeps/unix/sysv/linux/sh/clone.S
new file mode 100644 (file)
index 0000000..e181850
--- /dev/null
@@ -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 SHARED
+       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), r0
+       trapa   #0
+       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 SHARED
+       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 SHARED
+       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 --git a/sysdeps/unix/sysv/linux/sh/fchown.c b/sysdeps/unix/sysv/linux/sh/fchown.c
new file mode 100644 (file)
index 0000000..3a69ecc
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/fchown.c>
diff --git a/sysdeps/unix/sysv/linux/sh/fxstat.c b/sysdeps/unix/sysv/linux/sh/fxstat.c
new file mode 100644 (file)
index 0000000..4f219f0
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/fxstat.c>
diff --git a/sysdeps/unix/sysv/linux/sh/getegid.c b/sysdeps/unix/sysv/linux/sh/getegid.c
new file mode 100644 (file)
index 0000000..37b4b4a
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getegid.c>
diff --git a/sysdeps/unix/sysv/linux/sh/geteuid.c b/sysdeps/unix/sysv/linux/sh/geteuid.c
new file mode 100644 (file)
index 0000000..ebcb555
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/geteuid.c>
diff --git a/sysdeps/unix/sysv/linux/sh/getgroups.c b/sysdeps/unix/sysv/linux/sh/getgroups.c
new file mode 100644 (file)
index 0000000..102ea24
--- /dev/null
@@ -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 --git a/sysdeps/unix/sysv/linux/sh/getresgid.c b/sysdeps/unix/sysv/linux/sh/getresgid.c
new file mode 100644 (file)
index 0000000..b703a41
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getresgid.c>
diff --git a/sysdeps/unix/sysv/linux/sh/getresuid.c b/sysdeps/unix/sysv/linux/sh/getresuid.c
new file mode 100644 (file)
index 0000000..0b14cef
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getresuid.c>
diff --git a/sysdeps/unix/sysv/linux/sh/getrlimit.c b/sysdeps/unix/sysv/linux/sh/getrlimit.c
new file mode 100644 (file)
index 0000000..fc06dbd
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getrlimit.c>
diff --git a/sysdeps/unix/sysv/linux/sh/getrlimit64.c b/sysdeps/unix/sysv/linux/sh/getrlimit64.c
new file mode 100644 (file)
index 0000000..fef018f
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getrlimit64.c>
diff --git a/sysdeps/unix/sysv/linux/sh/getuid.c b/sysdeps/unix/sysv/linux/sh/getuid.c
new file mode 100644 (file)
index 0000000..d682c79
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getuid.c>
diff --git a/sysdeps/unix/sysv/linux/sh/lchown.c b/sysdeps/unix/sysv/linux/sh/lchown.c
new file mode 100644 (file)
index 0000000..c89de99
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/lchown.c>
diff --git a/sysdeps/unix/sysv/linux/sh/lxstat.c b/sysdeps/unix/sysv/linux/sh/lxstat.c
new file mode 100644 (file)
index 0000000..2371cd9
--- /dev/null
@@ -0,0 +1,2 @@
+#include <sysdeps/unix/sysv/linux/i386/lxstat.c>
+
diff --git a/sysdeps/unix/sysv/linux/sh/msgctl.c b/sysdeps/unix/sysv/linux/sh/msgctl.c
new file mode 100644 (file)
index 0000000..9f9b843
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/msgctl.c>
diff --git a/sysdeps/unix/sysv/linux/sh/oldgetrlimit64.c b/sysdeps/unix/sysv/linux/sh/oldgetrlimit64.c
new file mode 100644 (file)
index 0000000..4c27e95
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/oldgetrlimit64.c>
diff --git a/sysdeps/unix/sysv/linux/sh/pipe.S b/sysdeps/unix/sysv/linux/sh/pipe.S
new file mode 100644 (file)
index 0000000..c5c87b3
--- /dev/null
@@ -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, r0
+       trapa   #0
+       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 SHARED
+       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 --git a/sysdeps/unix/sysv/linux/sh/profil-counter.h b/sysdeps/unix/sysv/linux/sh/profil-counter.h
new file mode 100644 (file)
index 0000000..f55c956
--- /dev/null
@@ -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>
+
+static 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 --git a/sysdeps/unix/sysv/linux/sh/semctl.c b/sysdeps/unix/sysv/linux/sh/semctl.c
new file mode 100644 (file)
index 0000000..e9b1a48
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/semctl.c>
diff --git a/sysdeps/unix/sysv/linux/sh/setegid.c b/sysdeps/unix/sysv/linux/sh/setegid.c
new file mode 100644 (file)
index 0000000..2e3a54c
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setegid.c>
diff --git a/sysdeps/unix/sysv/linux/sh/seteuid.c b/sysdeps/unix/sysv/linux/sh/seteuid.c
new file mode 100644 (file)
index 0000000..18e41d0
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/seteuid.c>
diff --git a/sysdeps/unix/sysv/linux/sh/setfsgid.c b/sysdeps/unix/sysv/linux/sh/setfsgid.c
new file mode 100644 (file)
index 0000000..0886712
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setfsgid.c>
diff --git a/sysdeps/unix/sysv/linux/sh/setfsuid.c b/sysdeps/unix/sysv/linux/sh/setfsuid.c
new file mode 100644 (file)
index 0000000..a9f22eb
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setfsuid.c>
diff --git a/sysdeps/unix/sysv/linux/sh/setgid.c b/sysdeps/unix/sysv/linux/sh/setgid.c
new file mode 100644 (file)
index 0000000..377021d
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setgid.c>
diff --git a/sysdeps/unix/sysv/linux/sh/setgroups.c b/sysdeps/unix/sysv/linux/sh/setgroups.c
new file mode 100644 (file)
index 0000000..0e70862
--- /dev/null
@@ -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 --git a/sysdeps/unix/sysv/linux/sh/setregid.c b/sysdeps/unix/sysv/linux/sh/setregid.c
new file mode 100644 (file)
index 0000000..99c57ad
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setregid.c>
diff --git a/sysdeps/unix/sysv/linux/sh/setresgid.c b/sysdeps/unix/sysv/linux/sh/setresgid.c
new file mode 100644 (file)
index 0000000..daca1a4
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setresgid.c>
diff --git a/sysdeps/unix/sysv/linux/sh/setresuid.c b/sysdeps/unix/sysv/linux/sh/setresuid.c
new file mode 100644 (file)
index 0000000..3aeabe9
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setresuid.c>
diff --git a/sysdeps/unix/sysv/linux/sh/setreuid.c b/sysdeps/unix/sysv/linux/sh/setreuid.c
new file mode 100644 (file)
index 0000000..8ad6122
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setreuid.c>
diff --git a/sysdeps/unix/sysv/linux/sh/setrlimit.c b/sysdeps/unix/sysv/linux/sh/setrlimit.c
new file mode 100644 (file)
index 0000000..bfaef74
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setrlimit.c>
diff --git a/sysdeps/unix/sysv/linux/sh/setuid.c b/sysdeps/unix/sysv/linux/sh/setuid.c
new file mode 100644 (file)
index 0000000..de39437
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setuid.c>
diff --git a/sysdeps/unix/sysv/linux/sh/sh3/register-dump.h b/sysdeps/unix/sysv/linux/sh/sh3/register-dump.h
new file mode 100644 (file)
index 0000000..969d8cb
--- /dev/null
@@ -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 --git a/sysdeps/unix/sysv/linux/sh/sh4/register-dump.h b/sysdeps/unix/sysv/linux/sh/sh4/register-dump.h
new file mode 100644 (file)
index 0000000..ba9988d
--- /dev/null
@@ -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 --git a/sysdeps/unix/sysv/linux/sh/shmctl.c b/sysdeps/unix/sysv/linux/sh/shmctl.c
new file mode 100644 (file)
index 0000000..7eac638
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/shmctl.c>
diff --git a/sysdeps/unix/sysv/linux/sh/sigcontextinfo.h b/sysdeps/unix/sysv/linux/sh/sigcontextinfo.h
new file mode 100644 (file)
index 0000000..f35322f
--- /dev/null
@@ -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 --git a/sysdeps/unix/sysv/linux/sh/socket.S b/sysdeps/unix/sysv/linux/sh/socket.S
new file mode 100644 (file)
index 0000000..814380e
--- /dev/null
@@ -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,r0
+       trapa #0
+
+       /* 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 SHARED
+       mov     r0, r2
+       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
+        mov    r2, r0
+       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 --git a/sysdeps/unix/sysv/linux/sh/sys/io.h b/sysdeps/unix/sysv/linux/sh/sys/io.h
new file mode 100644 (file)
index 0000000..5cb7a26
--- /dev/null
@@ -0,0 +1,48 @@
+/* Copyright (C) 1996, 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_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 (unsigned long int __from, unsigned long int __num,
+                  int __turn_on) __THROW;
+
+/* 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 (int __level) __THROW;
+
+/* The functions that actually perform reads and writes.  */
+extern unsigned char inb (unsigned long int port) __THROW;
+extern unsigned short int inw (unsigned long int port) __THROW;
+extern unsigned long int inl (unsigned long int port) __THROW;
+
+extern void outb (unsigned char value, unsigned long int port) __THROW;
+extern void outw (unsigned short value, unsigned long int port) __THROW;
+extern void outl (unsigned long value, unsigned long int port) __THROW;
+
+__END_DECLS
+
+#endif /* _SYS_IO_H */
diff --git a/sysdeps/unix/sysv/linux/sh/sys/ucontext.h b/sysdeps/unix/sysv/linux/sh/sys/ucontext.h
new file mode 100644 (file)
index 0000000..b057060
--- /dev/null
@@ -0,0 +1,109 @@
+/* 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>
+
+/* We need the signal context definitions even if they are not used
+   included in <signal.h>.  */
+#include <bits/sigcontext.h>
+
+
+typedef int greg_t;
+
+/* Number of general registers.  */
+#define NGREG  16
+
+/* Container for all general registers.  */
+typedef greg_t gregset_t[NGREG];
+
+#ifdef __USE_GNU
+/* 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
+};
+#endif
+
+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;
+    unsigned int fpscr;
+    unsigned int fpul;
+    unsigned int macl;
+    unsigned int mach;
+  } mcontext_t;
+
+/* Userlevel context.  */
+typedef struct ucontext
+  {
+    unsigned long int uc_flags;
+    struct ucontext *uc_link;
+    stack_t uc_stack;
+    mcontext_t uc_mcontext;
+    __sigset_t uc_sigmask;
+  } ucontext_t;
+
+#endif /* sys/ucontext.h */
diff --git a/sysdeps/unix/sysv/linux/sh/sys/user.h b/sysdeps/unix/sysv/linux/sh/sys/user.h
new file mode 100644 (file)
index 0000000..7ea3cf6
--- /dev/null
@@ -0,0 +1,68 @@
+/* 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>
+
+struct user_fp
+{
+  struct fp_reg
+  {
+    unsigned int sign1:1;
+    unsigned int unused:15;
+    unsigned int sign2:1;
+    unsigned int exponent:14;
+    unsigned int j:1;
+    unsigned int mantissa1:31;
+    unsigned int mantissa0:32;
+  } fpregs[8];
+  unsigned int fpsr:32;
+  unsigned int fpcr:32;
+};
+
+struct user
+{
+  struct pt_regs regs;         /* General registers */
+  int u_fpvalid;               /* True if math co-processor being used. */
+
+  unsigned long int u_tsize;   /* Text segment size (pages). */
+  unsigned long int u_dsize;   /* Data segment size (pages). */
+  unsigned long int u_ssize;   /* Stack segment size (pages). */
+
+  unsigned long start_code;    /* Starting virtual address of text. */
+  unsigned long start_stack;   /* Starting virtual address of stack. */
+
+  long int signal;                     /* Signal that caused the core dump. */
+  int reserved;                        /* No longer used */
+  struct pt_regs *u_ar0;       /* help gdb to find the general registers. */
+
+  unsigned long magic;         /* uniquely identify a core file */
+  char u_comm[32];             /* User command that was responsible */
+  int u_debugreg[8];
+  struct user_fp u_fp;         /* Floating point registers */
+  struct user_fp_struct *u_fp0;        /* help gdb to find the FP registers. */
+};
+
+#endif  /* sys/user.h */
diff --git a/sysdeps/unix/sysv/linux/sh/syscalls.list b/sysdeps/unix/sysv/linux/sh/syscalls.list
new file mode 100644 (file)
index 0000000..5446f44
--- /dev/null
@@ -0,0 +1,54 @@
+# 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_fchown       fchown  fchown          3       __syscall_fchown
+s_lchown       lchown  lchown          3       __syscall_lchown
+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
+s_getegid      getegid getegid         0       __syscall_getegid
+s_geteuid      geteuid geteuid         0       __syscall_geteuid
+s_getuid       getuid  getuid          0       __syscall_getuid
+getresgid      -       getresgid       3       getresgid
+getresuid      -       getresuid       3       getresuid
+s_getrlimit    getrlimit getrlimit     2       __syscall_getrlimit
+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_setrlimit    setrlimit setrlimit     3       __syscall_setrlimit
+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
diff --git a/sysdeps/unix/sysv/linux/sh/sysdep.S b/sysdeps/unix/sysv/linux/sh/sysdep.S
new file mode 100644 (file)
index 0000000..6f9bea1
--- /dev/null
@@ -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 --git a/sysdeps/unix/sysv/linux/sh/sysdep.h b/sysdeps/unix/sysv/linux/sh/sysdep.h
new file mode 100644 (file)
index 0000000..6024b9f
--- /dev/null
@@ -0,0 +1,132 @@
+/* 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 SHARED
+#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_INST0  trapa #0
+#define SYSCALL_INST1  trapa #0
+#define SYSCALL_INST2  trapa #0
+#define SYSCALL_INST3  trapa #0
+#define SYSCALL_INST4  trapa #0
+#define SYSCALL_INST5  trapa #1
+#define SYSCALL_INST6  trapa #2
+
+#undef DO_CALL
+#define DO_CALL(args, syscall_name) \
+    mov.l 1f,r0; \
+    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 --git a/sysdeps/unix/sysv/linux/sh/vfork.S b/sysdeps/unix/sysv/linux/sh/vfork.S
new file mode 100644 (file)
index 0000000..27381fb
--- /dev/null
@@ -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, r0
+       trapa   #0
+       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 SHARED
+       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, r0
+       trapa   #0
+       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 SHARED
+       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 --git a/sysdeps/unix/sysv/linux/sh/xstat.c b/sysdeps/unix/sysv/linux/sh/xstat.c
new file mode 100644 (file)
index 0000000..e9869f5
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/xstat.c>