mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-29 11:41:21 +03:00
Update.
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.
This commit is contained in:
102
ChangeLog
102
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>
|
2000-06-12 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
* Rules (%.out): Define GCONV_PATH in the environment.
|
* Rules (%.out): Define GCONV_PATH in the environment.
|
||||||
|
@ -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>
|
2000-06-12 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
* Makefile (tests): Add joinrace.
|
* Makefile (tests): Add joinrace.
|
||||||
|
80
linuxthreads/sysdeps/sh/pspinlock.c
Normal file
80
linuxthreads/sysdeps/sh/pspinlock.c
Normal file
@ -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)
|
46
linuxthreads/sysdeps/sh/pt-machine.h
Normal file
46
linuxthreads/sysdeps/sh/pt-machine.h
Normal file
@ -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");
|
1
sysdeps/sh/Dist
Normal file
1
sysdeps/sh/Dist
Normal file
@ -0,0 +1 @@
|
|||||||
|
ieee754.h
|
3
sysdeps/sh/Implies
Normal file
3
sysdeps/sh/Implies
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
wordsize-32
|
||||||
|
ieee754/flt-32
|
||||||
|
ieee754/dbl-64
|
151
sysdeps/sh/elf/initfini.c
Normal file
151
sysdeps/sh/elf/initfini.c
Normal file
@ -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*/
|
||||||
|
");
|
90
sysdeps/sh/elf/start.S
Normal file
90
sysdeps/sh/elf/start.S
Normal file
@ -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
|
30
sysdeps/sh/gmp-mparam.h
Normal file
30
sysdeps/sh/gmp-mparam.h
Normal file
@ -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
|
69
sysdeps/sh/init-first.c
Normal file
69
sysdeps/sh/init-first.c
Normal file
@ -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
|
||||||
|
}
|
34
sysdeps/sh/machine-gmon.h
Normal file
34
sysdeps/sh/machine-gmon.h
Normal file
@ -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
|
||||||
|
|
231
sysdeps/sh/memcpy.S
Normal file
231
sysdeps/sh/memcpy.S
Normal file
@ -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
|
21
sysdeps/sh/memprof.h
Normal file
21
sysdeps/sh/memprof.h
Normal file
@ -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>
|
79
sysdeps/sh/memset.S
Normal file
79
sysdeps/sh/memset.S
Normal file
@ -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)
|
44
sysdeps/sh/sh3/__longjmp.S
Normal file
44
sysdeps/sh/sh3/__longjmp.S
Normal file
@ -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)
|
13
sysdeps/sh/sh3/bits/endian.h
Normal file
13
sysdeps/sh/sh3/bits/endian.h
Normal file
@ -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
|
104
sysdeps/sh/sh3/bits/huge_val.h
Normal file
104
sysdeps/sh/sh3/bits/huge_val.h
Normal file
@ -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. */
|
45
sysdeps/sh/sh3/bits/setjmp.h
Normal file
45
sysdeps/sh/sh3/bits/setjmp.h
Normal file
@ -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])
|
51
sysdeps/sh/sh3/bsd-_setjmp.S
Normal file
51
sysdeps/sh/sh3/bsd-_setjmp.S
Normal file
@ -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)
|
51
sysdeps/sh/sh3/bsd-setjmp.S
Normal file
51
sysdeps/sh/sh3/bsd-setjmp.S
Normal file
@ -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)
|
520
sysdeps/sh/sh3/dl-machine.h
Normal file
520
sysdeps/sh/sh3/dl-machine.h
Normal file
@ -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 */
|
67
sysdeps/sh/sh3/setjmp.S
Normal file
67
sysdeps/sh/sh3/setjmp.S
Normal file
@ -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)
|
49
sysdeps/sh/sh4/__longjmp.S
Normal file
49
sysdeps/sh/sh4/__longjmp.S
Normal file
@ -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)
|
13
sysdeps/sh/sh4/bits/endian.h
Normal file
13
sysdeps/sh/sh4/bits/endian.h
Normal file
@ -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
|
104
sysdeps/sh/sh4/bits/huge_val.h
Normal file
104
sysdeps/sh/sh4/bits/huge_val.h
Normal file
@ -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. */
|
50
sysdeps/sh/sh4/bits/setjmp.h
Normal file
50
sysdeps/sh/sh4/bits/setjmp.h
Normal file
@ -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])
|
50
sysdeps/sh/sh4/bsd-_setjmp.S
Normal file
50
sysdeps/sh/sh4/bsd-_setjmp.S
Normal file
@ -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)
|
50
sysdeps/sh/sh4/bsd-setjmp.S
Normal file
50
sysdeps/sh/sh4/bsd-setjmp.S
Normal file
@ -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)
|
515
sysdeps/sh/sh4/dl-machine.h
Normal file
515
sysdeps/sh/sh4/dl-machine.h
Normal file
@ -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 */
|
45
sysdeps/sh/sh4/fpu/fclrexcpt.c
Normal file
45
sysdeps/sh/sh4/fpu/fclrexcpt.c
Normal file
@ -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);
|
34
sysdeps/sh/sh4/fpu/fegetenv.c
Normal file
34
sysdeps/sh/sh4/fpu/fegetenv.c
Normal file
@ -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);
|
33
sysdeps/sh/sh4/fpu/fegetround.c
Normal file
33
sysdeps/sh/sh4/fpu/fegetround.c
Normal file
@ -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;
|
||||||
|
}
|
37
sysdeps/sh/sh4/fpu/feholdexcpt.c
Normal file
37
sysdeps/sh/sh4/fpu/feholdexcpt.c
Normal file
@ -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;
|
||||||
|
}
|
37
sysdeps/sh/sh4/fpu/fesetenv.c
Normal file
37
sysdeps/sh/sh4/fpu/fesetenv.c
Normal file
@ -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);
|
43
sysdeps/sh/sh4/fpu/fesetround.c
Normal file
43
sysdeps/sh/sh4/fpu/fesetround.c
Normal file
@ -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;
|
||||||
|
}
|
56
sysdeps/sh/sh4/fpu/fpu_control.h
Normal file
56
sysdeps/sh/sh4/fpu/fpu_control.h
Normal file
@ -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 */
|
38
sysdeps/sh/sh4/fpu/fraiseexcpt.c
Normal file
38
sysdeps/sh/sh4/fpu/fraiseexcpt.c
Normal file
@ -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);
|
43
sysdeps/sh/sh4/fpu/fsetexcptflg.c
Normal file
43
sysdeps/sh/sh4/fpu/fsetexcptflg.c
Normal file
@ -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);
|
32
sysdeps/sh/sh4/fpu/ftestexcept.c
Normal file
32
sysdeps/sh/sh4/fpu/ftestexcept.c
Normal file
@ -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;
|
||||||
|
}
|
1079
sysdeps/sh/sh4/fpu/libm-test-ulps
Normal file
1079
sysdeps/sh/sh4/fpu/libm-test-ulps
Normal file
File diff suppressed because it is too large
Load Diff
72
sysdeps/sh/sh4/setjmp.S
Normal file
72
sysdeps/sh/sh4/setjmp.S
Normal file
@ -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)
|
84
sysdeps/sh/strlen.S
Normal file
84
sysdeps/sh/strlen.S
Normal file
@ -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)
|
99
sysdeps/sh/sys/ucontext.h
Normal file
99
sysdeps/sh/sys/ucontext.h
Normal file
@ -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 */
|
76
sysdeps/sh/sysdep.h
Normal file
76
sysdeps/sh/sysdep.h
Normal file
@ -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__ */
|
102
sysdeps/unix/sh/sysdep.S
Normal file
102
sysdeps/unix/sh/sysdep.S
Normal file
@ -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)
|
29
sysdeps/unix/sh/sysdep.h
Normal file
29
sysdeps/unix/sh/sysdep.h
Normal file
@ -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
|
9
sysdeps/unix/sysv/linux/sh/Dist
Normal file
9
sysdeps/unix/sysv/linux/sh/Dist
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
clone.S
|
||||||
|
ioperm.c
|
||||||
|
pipe.S
|
||||||
|
setresuid.c
|
||||||
|
setresgid.c
|
||||||
|
setfsuid.c
|
||||||
|
setfsgid.c
|
||||||
|
sys/io.h
|
||||||
|
sys/user.h
|
12
sysdeps/unix/sysv/linux/sh/Makefile
Normal file
12
sysdeps/unix/sysv/linux/sh/Makefile
Normal file
@ -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
|
6
sysdeps/unix/sysv/linux/sh/Versions
Normal file
6
sysdeps/unix/sysv/linux/sh/Versions
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
libc {
|
||||||
|
GLIBC_2.2 {
|
||||||
|
# New rlimit interface
|
||||||
|
getrlimit; setrlimit; getrlimit64;
|
||||||
|
}
|
||||||
|
}
|
93
sysdeps/unix/sysv/linux/sh/bits/mman.h
Normal file
93
sysdeps/unix/sysv/linux/sh/bits/mman.h
Normal file
@ -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
|
205
sysdeps/unix/sysv/linux/sh/bits/resource.h
Normal file
205
sysdeps/unix/sysv/linux/sh/bits/resource.h
Normal file
@ -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
|
||||||
|
};
|
50
sysdeps/unix/sysv/linux/sh/brk.c
Normal file
50
sysdeps/unix/sysv/linux/sh/brk.c
Normal file
@ -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)
|
1
sysdeps/unix/sysv/linux/sh/chown.c
Normal file
1
sysdeps/unix/sysv/linux/sh/chown.c
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include <sysdeps/unix/sysv/linux/m68k/chown.c>
|
133
sysdeps/unix/sysv/linux/sh/clone.S
Normal file
133
sysdeps/unix/sysv/linux/sh/clone.S
Normal file
@ -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)
|
1
sysdeps/unix/sysv/linux/sh/fchown.c
Normal file
1
sysdeps/unix/sysv/linux/sh/fchown.c
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include <sysdeps/unix/sysv/linux/i386/fchown.c>
|
1
sysdeps/unix/sysv/linux/sh/fxstat.c
Normal file
1
sysdeps/unix/sysv/linux/sh/fxstat.c
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include <sysdeps/unix/sysv/linux/i386/fxstat.c>
|
1
sysdeps/unix/sysv/linux/sh/getegid.c
Normal file
1
sysdeps/unix/sysv/linux/sh/getegid.c
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include <sysdeps/unix/sysv/linux/i386/getegid.c>
|
1
sysdeps/unix/sysv/linux/sh/geteuid.c
Normal file
1
sysdeps/unix/sysv/linux/sh/geteuid.c
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include <sysdeps/unix/sysv/linux/i386/geteuid.c>
|
2
sysdeps/unix/sysv/linux/sh/getgroups.c
Normal file
2
sysdeps/unix/sysv/linux/sh/getgroups.c
Normal file
@ -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>
|
1
sysdeps/unix/sysv/linux/sh/getresgid.c
Normal file
1
sysdeps/unix/sysv/linux/sh/getresgid.c
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include <sysdeps/unix/sysv/linux/i386/getresgid.c>
|
1
sysdeps/unix/sysv/linux/sh/getresuid.c
Normal file
1
sysdeps/unix/sysv/linux/sh/getresuid.c
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include <sysdeps/unix/sysv/linux/i386/getresuid.c>
|
1
sysdeps/unix/sysv/linux/sh/getrlimit.c
Normal file
1
sysdeps/unix/sysv/linux/sh/getrlimit.c
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include <sysdeps/unix/sysv/linux/i386/getrlimit.c>
|
1
sysdeps/unix/sysv/linux/sh/getrlimit64.c
Normal file
1
sysdeps/unix/sysv/linux/sh/getrlimit64.c
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include <sysdeps/unix/sysv/linux/i386/getrlimit64.c>
|
1
sysdeps/unix/sysv/linux/sh/getuid.c
Normal file
1
sysdeps/unix/sysv/linux/sh/getuid.c
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include <sysdeps/unix/sysv/linux/i386/getuid.c>
|
1
sysdeps/unix/sysv/linux/sh/lchown.c
Normal file
1
sysdeps/unix/sysv/linux/sh/lchown.c
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include <sysdeps/unix/sysv/linux/i386/lchown.c>
|
2
sysdeps/unix/sysv/linux/sh/lxstat.c
Normal file
2
sysdeps/unix/sysv/linux/sh/lxstat.c
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
#include <sysdeps/unix/sysv/linux/i386/lxstat.c>
|
||||||
|
|
1
sysdeps/unix/sysv/linux/sh/msgctl.c
Normal file
1
sysdeps/unix/sysv/linux/sh/msgctl.c
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include <sysdeps/unix/sysv/linux/i386/msgctl.c>
|
1
sysdeps/unix/sysv/linux/sh/oldgetrlimit64.c
Normal file
1
sysdeps/unix/sysv/linux/sh/oldgetrlimit64.c
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include <sysdeps/unix/sysv/linux/i386/oldgetrlimit64.c>
|
63
sysdeps/unix/sysv/linux/sh/pipe.S
Normal file
63
sysdeps/unix/sysv/linux/sh/pipe.S
Normal file
@ -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)
|
28
sysdeps/unix/sysv/linux/sh/profil-counter.h
Normal file
28
sysdeps/unix/sysv/linux/sh/profil-counter.h
Normal file
@ -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);
|
||||||
|
}
|
1
sysdeps/unix/sysv/linux/sh/semctl.c
Normal file
1
sysdeps/unix/sysv/linux/sh/semctl.c
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include <sysdeps/unix/sysv/linux/i386/semctl.c>
|
1
sysdeps/unix/sysv/linux/sh/setegid.c
Normal file
1
sysdeps/unix/sysv/linux/sh/setegid.c
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include <sysdeps/unix/sysv/linux/i386/setegid.c>
|
1
sysdeps/unix/sysv/linux/sh/seteuid.c
Normal file
1
sysdeps/unix/sysv/linux/sh/seteuid.c
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include <sysdeps/unix/sysv/linux/i386/seteuid.c>
|
1
sysdeps/unix/sysv/linux/sh/setfsgid.c
Normal file
1
sysdeps/unix/sysv/linux/sh/setfsgid.c
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include <sysdeps/unix/sysv/linux/i386/setfsgid.c>
|
1
sysdeps/unix/sysv/linux/sh/setfsuid.c
Normal file
1
sysdeps/unix/sysv/linux/sh/setfsuid.c
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include <sysdeps/unix/sysv/linux/i386/setfsuid.c>
|
1
sysdeps/unix/sysv/linux/sh/setgid.c
Normal file
1
sysdeps/unix/sysv/linux/sh/setgid.c
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include <sysdeps/unix/sysv/linux/i386/setgid.c>
|
2
sysdeps/unix/sysv/linux/sh/setgroups.c
Normal file
2
sysdeps/unix/sysv/linux/sh/setgroups.c
Normal file
@ -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>
|
1
sysdeps/unix/sysv/linux/sh/setregid.c
Normal file
1
sysdeps/unix/sysv/linux/sh/setregid.c
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include <sysdeps/unix/sysv/linux/i386/setregid.c>
|
1
sysdeps/unix/sysv/linux/sh/setresgid.c
Normal file
1
sysdeps/unix/sysv/linux/sh/setresgid.c
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include <sysdeps/unix/sysv/linux/i386/setresgid.c>
|
1
sysdeps/unix/sysv/linux/sh/setresuid.c
Normal file
1
sysdeps/unix/sysv/linux/sh/setresuid.c
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include <sysdeps/unix/sysv/linux/i386/setresuid.c>
|
1
sysdeps/unix/sysv/linux/sh/setreuid.c
Normal file
1
sysdeps/unix/sysv/linux/sh/setreuid.c
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include <sysdeps/unix/sysv/linux/i386/setreuid.c>
|
1
sysdeps/unix/sysv/linux/sh/setrlimit.c
Normal file
1
sysdeps/unix/sysv/linux/sh/setrlimit.c
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include <sysdeps/unix/sysv/linux/i386/setrlimit.c>
|
1
sysdeps/unix/sysv/linux/sh/setuid.c
Normal file
1
sysdeps/unix/sysv/linux/sh/setuid.c
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include <sysdeps/unix/sysv/linux/i386/setuid.c>
|
151
sysdeps/unix/sysv/linux/sh/sh3/register-dump.h
Normal file
151
sysdeps/unix/sysv/linux/sh/sh3/register-dump.h
Normal file
@ -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)
|
262
sysdeps/unix/sysv/linux/sh/sh4/register-dump.h
Normal file
262
sysdeps/unix/sysv/linux/sh/sh4/register-dump.h
Normal file
@ -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)
|
1
sysdeps/unix/sysv/linux/sh/shmctl.c
Normal file
1
sysdeps/unix/sysv/linux/sh/shmctl.c
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include <sysdeps/unix/sysv/linux/i386/shmctl.c>
|
25
sysdeps/unix/sysv/linux/sh/sigcontextinfo.h
Normal file
25
sysdeps/unix/sysv/linux/sh/sigcontextinfo.h
Normal file
@ -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])
|
116
sysdeps/unix/sysv/linux/sh/socket.S
Normal file
116
sysdeps/unix/sysv/linux/sh/socket.S
Normal file
@ -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)
|
48
sysdeps/unix/sysv/linux/sh/sys/io.h
Normal file
48
sysdeps/unix/sysv/linux/sh/sys/io.h
Normal file
@ -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 */
|
109
sysdeps/unix/sysv/linux/sh/sys/ucontext.h
Normal file
109
sysdeps/unix/sysv/linux/sh/sys/ucontext.h
Normal file
@ -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 */
|
68
sysdeps/unix/sysv/linux/sh/sys/user.h
Normal file
68
sysdeps/unix/sysv/linux/sh/sys/user.h
Normal file
@ -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 */
|
54
sysdeps/unix/sysv/linux/sh/syscalls.list
Normal file
54
sysdeps/unix/sysv/linux/sh/syscalls.list
Normal file
@ -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
|
43
sysdeps/unix/sysv/linux/sh/sysdep.S
Normal file
43
sysdeps/unix/sysv/linux/sh/sysdep.S
Normal file
@ -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>
|
132
sysdeps/unix/sysv/linux/sh/sysdep.h
Normal file
132
sysdeps/unix/sysv/linux/sh/sysdep.h
Normal file
@ -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 */
|
112
sysdeps/unix/sysv/linux/sh/vfork.S
Normal file
112
sysdeps/unix/sysv/linux/sh/vfork.S
Normal file
@ -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)
|
1
sysdeps/unix/sysv/linux/sh/xstat.c
Normal file
1
sysdeps/unix/sysv/linux/sh/xstat.c
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include <sysdeps/unix/sysv/linux/i386/xstat.c>
|
Reference in New Issue
Block a user