1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-29 11:41:21 +03:00
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:
Ulrich Drepper
2000-06-12 20:50:37 +00:00
parent 55985355ad
commit 3846ef75cf
96 changed files with 6360 additions and 0 deletions

102
ChangeLog
View File

@ -1,3 +1,105 @@
2000-06-12 Kazumoto Kojima <kkojima@rr.iij4u.or.jp>
Yutaka Niibe <gniibe@chroot.org>
* sysdeps/sh/Dist: New file.
* sysdeps/sh/Implies: New file.
* sysdeps/sh/gmp-mparam.h: New file.
* sysdeps/sh/init-first.c: New file.
* sysdeps/sh/machine-gmon.h: New file.
* sysdeps/sh/memcpy.S: New file.
* sysdeps/sh/memprof.h: New file.
* sysdeps/sh/memset.S: New file.
* sysdeps/sh/sh3/__longjmp.S: New file.
* sysdeps/sh/sh3/bits/endian.h: New file.
* sysdeps/sh/sh3/bits/huge_val.h: New file.
* sysdeps/sh/sh3/bits/setjmp.h: New file.
* sysdeps/sh/sh3/bsd-_setjmp.S: New file.
* sysdeps/sh/sh3/bsd-setjmp.S: New file.
* sysdeps/sh/sh3/dl-machine.h: New file.
* sysdeps/sh/sh3/elf/initfini.c: New file.
* sysdeps/sh/sh3/elf/start.S: New file.
* sysdeps/sh/sh3/setjmp.S: New file.
* sysdeps/sh/sh3/sys/ucontext.h: New file.
* sysdeps/sh/sh4/__longjmp.S: New file.
* sysdeps/sh/sh4/bits/endian.h: New file.
* sysdeps/sh/sh4/bits/huge_val.h: New file.
* sysdeps/sh/sh4/bits/setjmp.h: New file.
* sysdeps/sh/sh4/bsd-_setjmp.S: New file.
* sysdeps/sh/sh4/bsd-setjmp.S: New file.
* sysdeps/sh/sh4/dl-machine.h: New file.
* sysdeps/sh/sh4/elf/initfini.c: New file.
* sysdeps/sh/sh4/elf/start.S: New file.
* sysdeps/sh/sh4/fpu/bits/fenv.h: New file.
* sysdeps/sh/sh4/fpu/bits/huge_val.h: New file.
* sysdeps/sh/sh4/fpu/bits/mathdef.h: New file.
* sysdeps/sh/sh4/fpu/fclrexcpt.c: New file.
* sysdeps/sh/sh4/fpu/fegetenv.c: New file.
* sysdeps/sh/sh4/fpu/fegetround.c: New file.
* sysdeps/sh/sh4/fpu/feholdexcpt.c: New file.
* sysdeps/sh/sh4/fpu/fesetenv.c: New file.
* sysdeps/sh/sh4/fpu/fesetround.c: New file.
* sysdeps/sh/sh4/fpu/fpu_control.h: New file.
* sysdeps/sh/sh4/fpu/fraiseexcpt.c: New file.
* sysdeps/sh/sh4/fpu/fsetexcptflg.c: New file.
* sysdeps/sh/sh4/fpu/ftestexcept.c: New file.
* sysdeps/sh/sh4/fpu/libm-test-ulps: New file.
* sysdeps/sh/sh4/setjmp.S: New file.
* sysdeps/sh/sh4/sys/ucontext.h: New file.
* sysdeps/sh/strlen.S: New file.
* sysdeps/sh/sysdep.h: New file.
* sysdeps/unix/sh/sysdep.S: New file.
* sysdeps/unix/sh/sysdep.h: New file.
* sysdeps/unix/sysv/linux/sh/Dist: New file.
* sysdeps/unix/sysv/linux/sh/Makefile: New file.
* sysdeps/unix/sysv/linux/sh/Versions: New file.
* sysdeps/unix/sysv/linux/sh/bits/mman.h: New file.
* sysdeps/unix/sysv/linux/sh/bits/resource.h: New file.
* sysdeps/unix/sysv/linux/sh/brk.c: New file.
* sysdeps/unix/sysv/linux/sh/chown.c: New file.
* sysdeps/unix/sysv/linux/sh/clone.S: New file.
* sysdeps/unix/sysv/linux/sh/fchown.c: New file.
* sysdeps/unix/sysv/linux/sh/fxstat.c: New file.
* sysdeps/unix/sysv/linux/sh/getegid.c: New file.
* sysdeps/unix/sysv/linux/sh/geteuid.c: New file.
* sysdeps/unix/sysv/linux/sh/getgroups.c: New file.
* sysdeps/unix/sysv/linux/sh/getresgid.c: New file.
* sysdeps/unix/sysv/linux/sh/getresuid.c: New file.
* sysdeps/unix/sysv/linux/sh/getrlimit.c: New file.
* sysdeps/unix/sysv/linux/sh/getrlimit64.c: New file.
* sysdeps/unix/sysv/linux/sh/getuid.c: New file.
* sysdeps/unix/sysv/linux/sh/lchown.c: New file.
* sysdeps/unix/sysv/linux/sh/lxstat.c: New file.
* sysdeps/unix/sysv/linux/sh/msgctl.c: New file.
* sysdeps/unix/sysv/linux/sh/oldgetrlimit64.c: New file.
* sysdeps/unix/sysv/linux/sh/pipe.S: New file.
* sysdeps/unix/sysv/linux/sh/profil-counter.h: New file.
* sysdeps/unix/sysv/linux/sh/semctl.c: New file.
* sysdeps/unix/sysv/linux/sh/setegid.c: New file.
* sysdeps/unix/sysv/linux/sh/seteuid.c: New file.
* sysdeps/unix/sysv/linux/sh/setfsgid.c: New file.
* sysdeps/unix/sysv/linux/sh/setfsuid.c: New file.
* sysdeps/unix/sysv/linux/sh/setgid.c: New file.
* sysdeps/unix/sysv/linux/sh/setgroups.c: New file.
* sysdeps/unix/sysv/linux/sh/setregid.c: New file.
* sysdeps/unix/sysv/linux/sh/setresgid.c: New file.
* sysdeps/unix/sysv/linux/sh/setresuid.c: New file.
* sysdeps/unix/sysv/linux/sh/setreuid.c: New file.
* sysdeps/unix/sysv/linux/sh/setrlimit.c: New file.
* sysdeps/unix/sysv/linux/sh/setuid.c: New file.
* sysdeps/unix/sysv/linux/sh/sh3/register-dump.h: New file.
* sysdeps/unix/sysv/linux/sh/sh4/register-dump.h: New file.
* sysdeps/unix/sysv/linux/sh/shmctl.c: New file.
* sysdeps/unix/sysv/linux/sh/sigcontextinfo.h: New file.
* sysdeps/unix/sysv/linux/sh/socket.S: New file.
* sysdeps/unix/sysv/linux/sh/sys/io.h: New file.
* sysdeps/unix/sysv/linux/sh/sys/ucontext.h: New file.
* sysdeps/unix/sysv/linux/sh/sys/user.h: New file.
* sysdeps/unix/sysv/linux/sh/syscalls.list: New file.
* sysdeps/unix/sysv/linux/sh/sysdep.S: New file.
* sysdeps/unix/sysv/linux/sh/sysdep.h: New file.
* sysdeps/unix/sysv/linux/sh/vfork.S: New file.
* sysdeps/unix/sysv/linux/sh/xstat.c: New file.
2000-06-12 Ulrich Drepper <drepper@redhat.com> 2000-06-12 Ulrich Drepper <drepper@redhat.com>
* Rules (%.out): Define GCONV_PATH in the environment. * Rules (%.out): Define GCONV_PATH in the environment.

View File

@ -1,3 +1,9 @@
2000-06-12 Kazumoto Kojima <kkojima@rr.iij4u.or.jp>
Yutaka Niibe <gniibe@chroot.org>
* sysdeps/sh/pspinlock.c: New file.
* sysdeps/sh/pt-machine.h: New file.
2000-06-12 Ulrich Drepper <drepper@redhat.com> 2000-06-12 Ulrich Drepper <drepper@redhat.com>
* Makefile (tests): Add joinrace. * Makefile (tests): Add joinrace.

View 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)

View 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
View File

@ -0,0 +1 @@
ieee754.h

3
sysdeps/sh/Implies Normal file
View File

@ -0,0 +1,3 @@
wordsize-32
ieee754/flt-32
ieee754/dbl-64

151
sysdeps/sh/elf/initfini.c Normal file
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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)

View 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)

View 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

View 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. */

View 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])

View 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)

View 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
View 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
View 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)

View 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)

View 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

View 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. */

View 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])

View 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)

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

View 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);

View 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);

View 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;
}

View 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;
}

View 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);

View 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;
}

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

View 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);

View 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);

View 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;
}

File diff suppressed because it is too large Load Diff

72
sysdeps/sh/sh4/setjmp.S Normal file
View 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
View 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
View 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
View 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
View 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
View 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

View 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

View 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

View File

@ -0,0 +1,6 @@
libc {
GLIBC_2.2 {
# New rlimit interface
getrlimit; setrlimit; getrlimit64;
}
}

View 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

View 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
};

View 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)

View File

@ -0,0 +1 @@
#include <sysdeps/unix/sysv/linux/m68k/chown.c>

View 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)

View File

@ -0,0 +1 @@
#include <sysdeps/unix/sysv/linux/i386/fchown.c>

View File

@ -0,0 +1 @@
#include <sysdeps/unix/sysv/linux/i386/fxstat.c>

View File

@ -0,0 +1 @@
#include <sysdeps/unix/sysv/linux/i386/getegid.c>

View File

@ -0,0 +1 @@
#include <sysdeps/unix/sysv/linux/i386/geteuid.c>

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

View File

@ -0,0 +1 @@
#include <sysdeps/unix/sysv/linux/i386/getresgid.c>

View File

@ -0,0 +1 @@
#include <sysdeps/unix/sysv/linux/i386/getresuid.c>

View File

@ -0,0 +1 @@
#include <sysdeps/unix/sysv/linux/i386/getrlimit.c>

View File

@ -0,0 +1 @@
#include <sysdeps/unix/sysv/linux/i386/getrlimit64.c>

View File

@ -0,0 +1 @@
#include <sysdeps/unix/sysv/linux/i386/getuid.c>

View File

@ -0,0 +1 @@
#include <sysdeps/unix/sysv/linux/i386/lchown.c>

View File

@ -0,0 +1,2 @@
#include <sysdeps/unix/sysv/linux/i386/lxstat.c>

View File

@ -0,0 +1 @@
#include <sysdeps/unix/sysv/linux/i386/msgctl.c>

View File

@ -0,0 +1 @@
#include <sysdeps/unix/sysv/linux/i386/oldgetrlimit64.c>

View 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)

View 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);
}

View File

@ -0,0 +1 @@
#include <sysdeps/unix/sysv/linux/i386/semctl.c>

View File

@ -0,0 +1 @@
#include <sysdeps/unix/sysv/linux/i386/setegid.c>

View File

@ -0,0 +1 @@
#include <sysdeps/unix/sysv/linux/i386/seteuid.c>

View File

@ -0,0 +1 @@
#include <sysdeps/unix/sysv/linux/i386/setfsgid.c>

View File

@ -0,0 +1 @@
#include <sysdeps/unix/sysv/linux/i386/setfsuid.c>

View File

@ -0,0 +1 @@
#include <sysdeps/unix/sysv/linux/i386/setgid.c>

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

View File

@ -0,0 +1 @@
#include <sysdeps/unix/sysv/linux/i386/setregid.c>

View File

@ -0,0 +1 @@
#include <sysdeps/unix/sysv/linux/i386/setresgid.c>

View File

@ -0,0 +1 @@
#include <sysdeps/unix/sysv/linux/i386/setresuid.c>

View File

@ -0,0 +1 @@
#include <sysdeps/unix/sysv/linux/i386/setreuid.c>

View File

@ -0,0 +1 @@
#include <sysdeps/unix/sysv/linux/i386/setrlimit.c>

View File

@ -0,0 +1 @@
#include <sysdeps/unix/sysv/linux/i386/setuid.c>

View 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)

View 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)

View File

@ -0,0 +1 @@
#include <sysdeps/unix/sysv/linux/i386/shmctl.c>

View 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])

View 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)

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

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

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

View 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

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

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

View 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)

View File

@ -0,0 +1 @@
#include <sysdeps/unix/sysv/linux/i386/xstat.c>