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>
|
||||
|
||||
* 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>
|
||||
|
||||
* 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