2016-01-04 16:05:18 +00:00
|
|
|
/* Copyright (C) 1992-2016 Free Software Foundation, Inc.
|
2000-06-12 20:50:37 +00:00
|
|
|
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
|
2001-07-06 04:58:11 +00:00
|
|
|
modify it under the terms of the GNU Lesser General Public
|
|
|
|
License as published by the Free Software Foundation; either
|
|
|
|
version 2.1 of the License, or (at your option) any later version.
|
2000-06-12 20:50:37 +00:00
|
|
|
|
|
|
|
The GNU C Library is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
2001-07-06 04:58:11 +00:00
|
|
|
Lesser General Public License for more details.
|
2000-06-12 20:50:37 +00:00
|
|
|
|
2001-07-06 04:58:11 +00:00
|
|
|
You should have received a copy of the GNU Lesser General Public
|
2012-02-09 23:18:22 +00:00
|
|
|
License along with the GNU C Library; if not, see
|
|
|
|
<http://www.gnu.org/licenses/>. */
|
2000-06-12 20:50:37 +00:00
|
|
|
|
|
|
|
#ifndef _LINUX_SH_SYSDEP_H
|
|
|
|
#define _LINUX_SH_SYSDEP_H 1
|
|
|
|
|
|
|
|
/* There is some commonality. */
|
Add INLINE_SYSCALL_ERROR_RETURN_VALUE
For ia32 PIC, the first thing of many syscalls does is to call
__x86.get_pc_thunk.reg to load PC into reg in case there is an error,
which is required for setting errno. In most cases, there are no
errors. But we still call __x86.get_pc_thunk.reg. This patch adds
INLINE_SYSCALL_ERROR_RETURN_VALUE so that i386 can optimize setting
errno by branching to the internal __syscall_error without PLT.
With i386 INLINE_SYSCALL_ERROR_RETURN_VALUE and i386 syscall inlining
optimization for GCC 5, for sysdeps/unix/sysv/linux/fchmodat.c with
-O2 -march=i686 -mtune=generic, GCC 5.2 now generates:
<fchmodat>:
0: push %ebx
1: mov 0x14(%esp),%eax
5: mov 0x8(%esp),%ebx
9: mov 0xc(%esp),%ecx
d: mov 0x10(%esp),%edx
11: test $0xfffffeff,%eax
16: jne 38 <fchmodat+0x38>
18: test $0x1,%ah
1b: jne 48 <fchmodat+0x48>
1d: mov $0x132,%eax
22: call *%gs:0x10
29: cmp $0xfffff000,%eax
2e: ja 58 <fchmodat+0x58>
30: pop %ebx
31: ret
32: lea 0x0(%esi),%esi
38: pop %ebx
39: mov $0xffffffea,%eax
3e: jmp 3f <fchmodat+0x3f> 3f: R_386_PC32 __syscall_error
43: nop
44: lea 0x0(%esi,%eiz,1),%esi
48: pop %ebx
49: mov $0xffffffa1,%eax
4e: jmp 4f <fchmodat+0x4f> 4f: R_386_PC32 __syscall_error
53: nop
54: lea 0x0(%esi,%eiz,1),%esi
58: pop %ebx
59: jmp 5a <fchmodat+0x5a> 5a: R_386_PC32 __syscall_error
instead of
<fchmodat>:
0: sub $0x8,%esp
3: mov 0x18(%esp),%eax
7: mov %ebx,(%esp)
a: call b <fchmodat+0xb> b: R_386_PC32 __x86.get_pc_thunk.bx
f: add $0x2,%ebx 11: R_386_GOTPC _GLOBAL_OFFSET_TABLE_
15: mov %edi,0x4(%esp)
19: test $0xfffffeff,%eax
1e: jne 70 <fchmodat+0x70>
20: test $0x1,%ah
23: jne 88 <fchmodat+0x88>
25: mov 0x14(%esp),%edx
29: mov 0x10(%esp),%ecx
2d: mov 0xc(%esp),%edi
31: xchg %ebx,%edi
33: mov $0x132,%eax
38: call *%gs:0x10
3f: xchg %edi,%ebx
41: cmp $0xfffff000,%eax
46: ja 58 <fchmodat+0x58>
48: mov (%esp),%ebx
4b: mov 0x4(%esp),%edi
4f: add $0x8,%esp
52: ret
53: nop
54: lea 0x0(%esi,%eiz,1),%esi
58: mov 0x0(%ebx),%edx 5a: R_386_TLS_GOTIE __libc_errno
5e: neg %eax
60: mov %eax,%gs:(%edx)
63: mov $0xffffffff,%eax
68: jmp 48 <fchmodat+0x48>
6a: lea 0x0(%esi),%esi
70: mov 0x0(%ebx),%eax 72: R_386_TLS_GOTIE __libc_errno
76: movl $0x16,%gs:(%eax)
7d: mov $0xffffffff,%eax
82: jmp 48 <fchmodat+0x48>
84: lea 0x0(%esi,%eiz,1),%esi
88: mov 0x0(%ebx),%eax 8a: R_386_TLS_GOTIE __libc_errno
8e: movl $0x5f,%gs:(%eax)
95: mov $0xffffffff,%eax
9a: jmp 48 <fchmodat+0x48>
* sysdeps/unix/sysv/linux/sysdep.h: New file.
* sysdeps/unix/sysv/linux/i386/sysdep.c: Likewise.
* sysdeps/unix/sysv/linux/alpha/sysdep.h: Include
<sysdeps/unix/sysv/linux/sysdep.h>.
* sysdeps/unix/sysv/linux/arm/sysdep.h: Likewise.
* sysdeps/unix/sysv/linux/generic/sysdep.h: Likewise.
* sysdeps/unix/sysv/linux/hppa/sysdep.h: Likewise.
* sysdeps/unix/sysv/linux/ia64/sysdep.h: Likewise.
* sysdeps/unix/sysv/linux/m68k/sysdep.h: Likewise.
* sysdeps/unix/sysv/linux/microblaze/sysdep.h: Likewise.
* sysdeps/unix/sysv/linux/mips/mips32/sysdep.h: Likewise.
* sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h: Likewise.
* sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h: Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h: Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h: Likewise.
* sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h: Likewise.
* sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h: Likewise.
* sysdeps/unix/sysv/linux/sh/sysdep.h: Likewise.
* sysdeps/unix/sysv/linux/sparc/sysdep.h: Likewise.
* sysdeps/unix/sysv/linux/x86_64/sysdep.h: Likewise.
* sysdeps/unix/sysv/linux/i386/Makefile [$(subdir) == csu]
(sysdep-dl-routines): Add sysdep.
[$(subdir) == nptl] (libpthread-routines): Likewise.
[$(subdir) == rt] (librt-routines): Likewise.
* sysdeps/unix/sysv/linux/i386/clone.S (__clone): Don't check
PIC when branching to SYSCALL_ERROR_LABEL.
* sysdeps/unix/sysv/linux/i386/sysdep.S: Removed.
* sysdeps/unix/sysv/linux/i386/sysdep.h: Include
<sysdeps/unix/sysv/linux/sysdep.h>.
(SYSCALL_ERROR_LABEL): Changed to __syscall_error.
(SYSCALL_ERROR_ERRNO): Removed.
(SYSCALL_ERROR_HANDLER): Changed to empty.
(SYSCALL_ERROR_HANDLER_TLS_STORE): Likewise.
(__syscall_error): New prototype.
[IS_IN (libc)] (INLINE_SYSCALL): New macro.
(INLINE_SYSCALL_ERROR_RETURN_VALUE): Likewise.
2015-10-13 18:58:53 +00:00
|
|
|
#include <sysdeps/unix/sysv/linux/sysdep.h>
|
2000-06-12 20:50:37 +00:00
|
|
|
#include <sysdeps/unix/sh/sysdep.h>
|
2005-12-20 15:28:51 +00:00
|
|
|
#include <tls.h>
|
2000-06-12 20:50:37 +00:00
|
|
|
|
|
|
|
/* 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. */
|
|
|
|
|
2003-01-05 11:26:28 +00:00
|
|
|
#define _IMM1 #-1
|
2000-06-12 20:50:37 +00:00
|
|
|
#define _IMM12 #-12
|
|
|
|
#undef PSEUDO
|
|
|
|
#define PSEUDO(name, syscall_name, args) \
|
|
|
|
.text; \
|
|
|
|
ENTRY (name); \
|
* locale/programs/ld-ctype.c (ctype_read): When given a repertoire
name of "", store a null pointer instead.
* configure.in (elf): Set to yes for freebsd*, netbsd*.
* configure: Regenerated.
* locale/xlocale.c [! (USE_TLS && HAVE___THREAD)] (__libc_tsd_LOCALE):
Initialize this instead of __libc_tsd_LOCALE_data.
* sysdeps/unix/grantpt.c (pts_name): Convert ENOTTY return from
ptsname_r to EINVAL.
* sysdeps/generic/ptsname.c (__ptsname_r): Return ENOSYS instead of 0.
* rt/Makefile: Revert last change, it was inappropriate to presume aio
implementations depend on pthreads.
* rt/tst-aio.c (do_test): Exit happy if first failure is ENOSYS.
* rt/tst-aio64.c (do_test): Likewise.
* rt/tst-aio2.c (do_test): Likewise.
* rt/tst-aio3.c (do_test): Likewise.
* rt/tst-aio4.c (do_test): Likewise.
* rt/tst-aio5.c (do_test): Likewise.
* rt/tst-aio6.c (do_test): Likewise.
* rt/tst-aio7.c (do_test): Likewise.
* sysdeps/generic/bits/libc-lock.h (__libc_setspecific): Use a cast to
void so as to avoid compiler warnings.
* libio/oldstdfiles.c [! _IO_MTSAFE_IO] (DEF_STDFILE): Don't define
_IO_wide_data_FD, which is never used here.
* libio/iofread.c
[! _IO_MTSAFE_IO] (fread_unlocked): Add libc_hidden_ver defn.
* libio/iofputs.c [! _IO_MTSAFE_IO] (fputs_unlocked): Likewise.
* libio/iofgets.c [! _IO_MTSAFE_IO] (fgets_unlocked): Likewise.
* include/resolv.h [! _LIBC_REENTRANT] (_res): #undef it before decl.
* include/netdb.h [! _LIBC_REENTRANT] (h_errno): Declare normal extern.
* misc/syslog.c (openlog): Conditionalize locking on [_LIBC_REENTRANT].
(closelog): Likewise.
2002-07-06 Bruno Haible <bruno@clisp.org>
* sysdeps/alpha/fpu/fpu_control.h: Comment fix.
* sysdeps/unix/sysv/linux/alpha/pipe.S: Moved to ...
* sysdeps/unix/alpha/pipe.S: ... here.
* sysdeps/unix/bsd/osf/alpha/pipe.S: File removed.
* sysdeps/unix/i386/brk.S: Rename local label to '.Lhere' in ELF.
* sysdeps/unix/i386/brk.S: Add PSEUDO_END invocation.
* sysdeps/unix/i386/fork.S: Likewise.
* sysdeps/unix/i386/pipe.S: Likewise.
* sysdeps/unix/i386/wait.S: Likewise.
* sysdeps/unix/fork.S: Fix PSEUDO_END argument.
* sysdeps/unix/arm/fork.S: Likewise.
* sysdeps/unix/sysv/linux/arm/sysdep.h (PSEUDO): Swap DO_CALL
arguments.
(DO_CALL): Swap argument order.
* sysdeps/unix/sysv/linux/hppa/sysdep.h (PSEUDO): Swap DO_CALL
arguments.
(DO_CALL): Swap argument order.
* sysdeps/unix/sysv/linux/i386/sysdep.h (PSEUDO): Swap DO_CALL
arguments.
(DO_CALL): Swap argument order.
* sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h (PSEUDO): Swap DO_CALL
arguments.
(DO_CALL): Swap argument order.
* sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h (PSEUDO): Swap DO_CALL
arguments.
(DO_CALL): Swap argument order.
* sysdeps/unix/sysv/linux/sh/sysdep.h (PSEUDO): Swap DO_CALL
arguments.
(DO_CALL): Swap argument order.
* sysdeps/unix/sysv/linux/x86_64/sysdep.h (PSEUDO): Swap DO_CALL
arguments.
(DO_CALL): Swap argument order.
* sysdeps/i386/sysdep.h (PSEUDO): Fix syntax error.
(L): Define right for ELF.
* sysdeps/unix/sysv/linux/i386/sysdep.h (L): Remove definition.
Now defined in sysdeps/i386/sysdep.h.
* sysdeps/posix/readv.c: Ansify function definition.
* sysdeps/posix/writev.c: Likewise.
* stdio-common/tst-fseek.c (main): Don't assume that off_t and size_t
have the same size. Avoid direct cast from size_t to off_t.
* login/tst-utmp.c (simulate_login): Don't leave garbage after the
nul byte in entry[n].ut_user.
(simulate_logout): Likewise.
* login/programs/utmpdump.c (print_entry): Test _HAVE_UT_TYPE,
_HAVE_UT_PID, _HAVE_UT_ID, _HAVE_UT_HOST, instead of assuming the
existence of corresponding members of 'struct utmp'.
* login/tst-utmp.c: Trivialize the test if testing 'struct utmp' and
!_HAVE_UT_TYPE.
* sysdeps/unix/opendir.c (__opendir): If st_blksize is 0 or too small,
allocate a buffer of at least BUFSIZ bytes, not just of
sizeof (struct dirent).
* sysdeps/generic/glob.c: Include <limits.h>.
(NAME_MAX): Define a fallback.
(glob_in_dir): Allocate enough room for a 'struct dirent64' on the
stack.
* posix/tst-dir.c: Include <stddef.h>, for offsetof.
(main): Allocate enough room for a 'struct dirent64' on the stack.
* posix/tst-gnuglob.c (my_DIR): Allocate enough room for a
'struct dirent'.
* sysdeps/unix/sysv/linux/init-first.c: Don't include
kernel-features.h.
* inet/htontest.c: Include <sys/types.h>.
* sysdeps/generic/sys/sysinfo.h: Surround with __{BEGIN,END}_DECLS.
* include/sys/sysctl.h: Comment fix.
* elf/rtld.c (_rtld_global) [! _LIBC_REENTRANT]: Don't initialize
_dl_load_lock.
* libio/fileno.c (fileno_unlocked): Define regardless of _IO_MTSAFE_IO.
* sysdeps/unix/bsd/bsd4.4/syscalls.list (__sigaltstack): New alias.
* sysdeps/unix/inet/syscalls.list (__connect_internal): New alias.
(__getpeername): New alias.
(__getsockname): New alias.
(__socket): New alias.
* sysdeps/unix/common/syscalls.list (getpgid): Remove.
* sysdeps/unix/syscalls.list (__chown_internal): New alias.
(__fcntl_internal): New alias.
(__profil): New alias.
2002-08-26 11:39:12 +00:00
|
|
|
DO_CALL (syscall_name, args); \
|
2000-06-12 20:50:37 +00:00
|
|
|
mov r0,r1; \
|
|
|
|
mov _IMM12,r2; \
|
|
|
|
shad r2,r1; \
|
|
|
|
not r1,r1; \
|
|
|
|
tst r1,r1; \
|
2003-01-05 11:26:28 +00:00
|
|
|
bf .Lpseudo_end; \
|
|
|
|
SYSCALL_ERROR_HANDLER; \
|
|
|
|
.Lpseudo_end:
|
2000-06-12 20:50:37 +00:00
|
|
|
|
|
|
|
#undef PSEUDO_END
|
|
|
|
#define PSEUDO_END(name) \
|
|
|
|
END (name)
|
|
|
|
|
2003-03-23 19:44:31 +00:00
|
|
|
#undef PSEUDO_NOERRNO
|
|
|
|
#define PSEUDO_NOERRNO(name, syscall_name, args) \
|
|
|
|
.text; \
|
|
|
|
ENTRY (name); \
|
|
|
|
DO_CALL (syscall_name, args)
|
|
|
|
|
|
|
|
#undef PSEUDO_END_NOERRNO
|
|
|
|
#define PSEUDO_END_NOERRNO(name) \
|
|
|
|
END (name)
|
|
|
|
|
|
|
|
#define ret_NOERRNO ret
|
|
|
|
|
2003-09-01 04:06:40 +00:00
|
|
|
#define PSEUDO_ERRVAL(name, syscall_name, args) \
|
|
|
|
.text; \
|
|
|
|
ENTRY (name); \
|
|
|
|
DO_CALL (syscall_name, args);
|
|
|
|
|
|
|
|
#undef PSEUDO_END_ERRVAL
|
|
|
|
#define PSEUDO_END_ERRVAL(name) \
|
|
|
|
END (name)
|
|
|
|
|
|
|
|
#define ret_ERRVAL ret
|
|
|
|
|
2003-01-05 11:26:28 +00:00
|
|
|
#ifndef PIC
|
Update.
2003-01-11 Jim Meyering <jim@meyering.net>
* io/ftw.c [HAVE_CONFIG_H]: Include <config.h>.
[HAVE_SYS_PARAM_H || _LIBC]: Guard inclusion of <sys/param.h>.
Include <sys/stat.h>, not <include/sys/stat.h>, if !_LIBC.
[!_LIBC] (__chdir, __closedir, __fchdir, __getcwd, __opendir): Define.
[!_LIBC] (__readdir64, __tdestroy, __tfind, __tsearch): Define.
[!_LIBC] (internal_function, dirent64, MAX): Define.
(__set_errno): Define if not already defined.
(open_dir_stream): When FTW_CHDIR is enabled, invoke opendir on
the basename, not the entire file name.
(process_entry): When FTW_CHDIR is enabled, invoke XSTAT or LXSTAT on
the basename, not the entire file name.
2003-01-12 Ulrich Drepper <drepper@redhat.com>
* string/tester.c (test_strcpy): Disable last added strcpy until
it is fixed.
2003-01-11 Philip Blundell <philb@gnu.org>
* sysdeps/unix/sysv/linux/arm/socket.S: Add cancellation support.
2003-01-11 Andreas Schwab <schwab@suse.de>
* Makerules: Add vpath for %.dynsym and %.so so that the
implicit rule chaining for check-abi works.
2003-01-11 Kaz Kojima <kkojima@rr.iij4u.or.jp>
* sysdeps/unix/sysv/linux/sh/sysdep.h (SYSCALL_ERROR_HANDLER):
Add non-PIC case.
2003-01-11 Jakub Jelinek <jakub@redhat.com>
* elf/tls-macros.h [__ia64__] (__TLS_CALL_CLOBBERS): Define.
[__ia64__] (TLS_LE, TLS_IE): Fix typos. Add ;; at start of asm if
gp is used early.
[__ia64__] (TLS_LD, TLS_GD): Likewise. Use __TLS_CALL_CLOBBERS.
* elf/Makefile ($(objpfx)tst-tlsmod5.so, $(objpfx)tst-tlsmod6.so):
Ensure libc.so in DT_NEEDED.
* sysdeps/alpha/dl-machine.h (elf_machine_rela): Move
CHECK_STATIC_TLS before l_tls_offset use.
* sysdeps/i386/dl-machine.h (elf_machine_rel, elf_machine_rela):
Likewise.
* sysdeps/sh/dl-machine.h (elf_machine_rela): Likewise.
* sysdeps/generic/dl-tls.c (_dl_allocate_tls_storage) [TLS_DTV_AT_TP]:
Allocate TLS_PRE_TCB_SIZE bytes below result.
(_dl_deallocate_tls) [TLS_DTV_AT_TP]: Adjust before freeing.
* sysdeps/generic/libc-tls.c (__libc_setup_tls): If
TLS_INIT_TP_EXPENSIVE is not defined, allocate even if no PT_TLS
segment has been found. If TLS_DTV_AT_TP, allocate TLS_PRE_TCB_SIZE
bytes below result and add tcb_offset to memsz.
* sysdeps/ia64/dl-tls.h (__tls_get_addr): New prototype.
* sysdeps/ia64/dl-machine.h: Include tls.h.
(elf_machine_type_class): Return ELF_RTYPE_CLASS_PLT for TLS relocs
too.
(elf_machine_rela): Assume if sym_map != NULL sym is non-NULL too.
Handle R_IA64_DTPMOD*, R_IA64_DTPREL* and R_IA64_TPREL* relocations.
* sysdeps/ia64/libc-tls.c: New file.
2003-01-10 Steven Munroe <sjmunroe@us.ibm.com>
* sysdeps/powerpc/powerpc64/sysdep.h (PSEUDO_RET): Add branch hit.
* sysdeps/unix/sysv/linux/powerpc/bits/stat.h (STAT_VER_LINUX):
Fix type. Move definition out of #if.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/ftruncate64.c: New file.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/pread.c: New file.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/pread64.c: New file.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/pwrite.c: New file.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/pwrite64.c: New file.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/socket.S: Add cancellation
support.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/syscalls.list: Remove
ftruncate64, pread64, pwrite64, truncate64 entries.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h
(INLINE_SYSCALL): New version that supports function call like
syscalls. Add __builtin_expect.
(LOADARGS_n): Add argument size safety checks.
(INTERNAL_SYSCALL): New Macro.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/truncate64.c: New file.
* sysdeps/unix/sysv/linux/powerpc/sys/procfs.h [__PPC_ELF_H]: Avoid
redefinition of elf_fpreg_t and elf_fpregset_t.
2003-01-12 Ulrich Drepper <drepper@redhat.com>
* elf/dl-close.c (_dl_close): Add several asserts. Correct and
simplify test for unloading. If loader of a DSO is unloaded do not
use its scope anymore. Fall back to own scope and adjust opencounts.
Fix several comments.
* elf/dl-deps.c (_dl_map_object_deps): Always allocate memory for
the l_searchlist, not only for l_initfini.
* elf/dl-lookup.c (add_dependencies): Avoid creating relocation
dependencies if objects cannot be removed. Remove object with the
definition as not unloadable if necessary.
* elf/reldep6.c: Create relocation dependency before closing the first
module.
2003-01-10 Guido Gnther <agx@sigxcpu.org>
* elf/Makefile: Add rules to build and run reldep9 test.
* elf/reldep9.c: New file.
* elf/reldep9mod1.c: New file.
* elf/reldep9mod2.c: New file.
* elf/reldep9mod3.c: New file.
2003-01-09 Jakub Jelinek <jakub@redhat.com>
* elf/Makefile: Add rules to build and run nodelete2 test.
* elf/nodelete2.c: New file.
* elf/nodel2mod1.c: New file.
* elf/nodel2mod2.c: New file.
* elf/nodel2mod3.c: New file.
2003-01-09 Jakub Jelinek <jakub@redhat.com>
2003-01-12 10:11:16 +00:00
|
|
|
# define SYSCALL_ERROR_HANDLER \
|
|
|
|
mov.l 0f,r1; \
|
|
|
|
jmp @r1; \
|
|
|
|
mov r0,r4; \
|
|
|
|
.align 2; \
|
|
|
|
0: .long __syscall_error
|
2003-01-05 11:26:28 +00:00
|
|
|
#else
|
|
|
|
# if RTLD_PRIVATE_ERRNO
|
|
|
|
# define SYSCALL_ERROR_HANDLER \
|
|
|
|
neg r0,r1; \
|
2012-06-23 10:11:13 +00:00
|
|
|
mov r12,r2; \
|
|
|
|
cfi_register (r12, r2); \
|
2003-01-05 11:26:28 +00:00
|
|
|
mov.l 0f,r12; \
|
|
|
|
mova 0f,r0; \
|
|
|
|
add r0,r12; \
|
|
|
|
mov.l 1f,r0; \
|
2005-12-20 15:28:51 +00:00
|
|
|
mov.l r1,@(r0,r12); \
|
2012-06-23 10:11:13 +00:00
|
|
|
mov r2,r12; \
|
|
|
|
cfi_restore (r12); \
|
2003-01-05 11:26:28 +00:00
|
|
|
bra .Lpseudo_end; \
|
|
|
|
mov _IMM1,r0; \
|
|
|
|
.align 2; \
|
|
|
|
0: .long _GLOBAL_OFFSET_TABLE_; \
|
2004-10-04 20:59:38 +00:00
|
|
|
1: .long rtld_errno@GOTOFF
|
2003-01-05 11:26:28 +00:00
|
|
|
|
|
|
|
# elif defined _LIBC_REENTRANT
|
|
|
|
|
2014-11-24 09:33:45 +00:00
|
|
|
# if IS_IN (libc)
|
2011-09-10 20:50:28 +00:00
|
|
|
# define SYSCALL_ERROR_ERRNO __libc_errno
|
|
|
|
# else
|
|
|
|
# define SYSCALL_ERROR_ERRNO errno
|
|
|
|
# endif
|
|
|
|
# define SYSCALL_ERROR_HANDLER \
|
2003-01-05 11:26:28 +00:00
|
|
|
neg r0,r1; \
|
|
|
|
mov r12,r2; \
|
2012-06-23 10:11:13 +00:00
|
|
|
cfi_register (r12, r2); \
|
2003-01-05 11:26:28 +00:00
|
|
|
mov.l 0f,r12; \
|
|
|
|
mova 0f,r0; \
|
|
|
|
add r0,r12; \
|
|
|
|
mov.l 1f,r0; \
|
|
|
|
stc gbr, r4; \
|
|
|
|
mov.l @(r0,r12),r0; \
|
|
|
|
mov r2,r12; \
|
2012-06-23 10:11:13 +00:00
|
|
|
cfi_restore (r12); \
|
2003-01-05 11:26:28 +00:00
|
|
|
add r4,r0; \
|
|
|
|
mov.l r1,@r0; \
|
|
|
|
bra .Lpseudo_end; \
|
|
|
|
mov _IMM1,r0; \
|
|
|
|
.align 2; \
|
|
|
|
0: .long _GLOBAL_OFFSET_TABLE_; \
|
|
|
|
1: .long SYSCALL_ERROR_ERRNO@GOTTPOFF
|
|
|
|
# else
|
|
|
|
/* Store (-r0) into errno through the GOT. */
|
|
|
|
# define SYSCALL_ERROR_HANDLER \
|
|
|
|
neg r0,r1; \
|
|
|
|
mov r12,r2; \
|
2012-06-23 10:11:13 +00:00
|
|
|
cfi_register (r12, r2); \
|
2003-01-05 11:26:28 +00:00
|
|
|
mov.l 0f,r12; \
|
|
|
|
mova 0f,r0; \
|
|
|
|
add r0,r12; \
|
|
|
|
mov.l 1f,r0; \
|
|
|
|
mov.l @(r0,r12),r0; \
|
|
|
|
mov r2,r12; \
|
2012-06-23 10:11:13 +00:00
|
|
|
cfi_restore (r12); \
|
2003-01-05 11:26:28 +00:00
|
|
|
mov.l r1,@r0; \
|
|
|
|
bra .Lpseudo_end; \
|
|
|
|
mov _IMM1,r0; \
|
|
|
|
.align 2; \
|
|
|
|
0: .long _GLOBAL_OFFSET_TABLE_; \
|
|
|
|
1: .long errno@GOT
|
|
|
|
# endif /* _LIBC_REENTRANT */
|
|
|
|
#endif /* PIC */
|
2000-06-12 20:50:37 +00:00
|
|
|
|
2003-10-15 05:47:36 +00:00
|
|
|
# ifdef NEED_SYSCALL_INST_PAD
|
|
|
|
# define SYSCALL_INST_PAD \
|
|
|
|
or r0,r0; or r0,r0; or r0,r0; or r0,r0; or r0,r0
|
|
|
|
# else
|
|
|
|
# define SYSCALL_INST_PAD
|
|
|
|
# endif
|
|
|
|
|
Update.
2000-10-26 Kazumoto Kojima <kkojima@rr.iij4u.or.jp>
Yutaka Niibe <gniibe@chroot.org>
* sysdeps/sh/dl-machine.h (elf_machine_rela): Handle in place
relocation which is generated by new ld.
* sysdeps/sh/elf/initfini.c (_init): Preseted __fpscr_values.
(_fini): Delete an obsolete register prefix.
* sysdeps/unix/sysv/linux/sh/Versions: Add __xstat64, __fxstat64,
__lxstat64, alphasort64, glob64, readdir64, readdir64_r, scandir64
and versionsort64 as the 2.2-versioned symbols.
* sysdeps/unix/sysv/linux/sh/bits/fcntl.h: New file.
* sysdeps/unix/sysv/linux/sh/brk.c: Changes for the new system call
calling convention of the kernel.
* sysdeps/unix/sysv/linux/sh/pipe.S: Likewise.
* sysdeps/unix/sysv/linux/sh/socket.S: Likewise.
* sysdeps/unix/sysv/linux/sh/clone.S: Likewise.
* sysdeps/unix/sysv/linux/sh/vfork.S: Likewise.
* sysdeps/unix/sysv/linux/sh/sysdep.h: Likewise.
* sysdeps/unix/sysv/linux/sh/fcntl.c: New file.
* sysdeps/unix/sysv/linux/sh/lockf64.c: New file.
* sysdeps/unix/sysv/linux/sh/sys/user.h: Include the kernel header
file and delete the definitions of struct user and user_fp.
* sysdeps/unix/sysv/linux/sh/syscall.S: New file.
* sysdeps/unix/sysv/linux/sh/syscalls.list: Remove entries for
s_ioctl, s_ipc, s_llseek, s_chown, s_fchown, s_lchown, s_execve,
rt_sigaction, rt_sigpending, rt_sigprocmask, rt_sigqueueinfo,
rt_sigsuspend, rt_sigtimedwait, s_getcwd, s_getdents, s_getgroups,
s_getpriority, s_getegid, s_geteuid, s_getuid, getresgid, getresuid,
s_getrlimit, s_poll, s_pread64, s_ptrace, s_pwrite64, s_reboot,
s_setrlimit, s_sigaction, s_sigpending, s_sigprocmask, s_sigsuspend,
s_setfsgid, s_setfsuid, s_setgid, s_setgroups, s_setregid,
s_setresgid, s_setresuid, s_setreuid, s_setuid, s_sysctl,
s_ugetrlimit, s_ustat, sys_fstat, sys_lstat, sys_mknod, sys_readv,
sys_stat, sys_writev and syscall.
2000-10-26 02:34:17 +00:00
|
|
|
#define SYSCALL_INST0 trapa #0x10
|
|
|
|
#define SYSCALL_INST1 trapa #0x11
|
|
|
|
#define SYSCALL_INST2 trapa #0x12
|
|
|
|
#define SYSCALL_INST3 trapa #0x13
|
|
|
|
#define SYSCALL_INST4 trapa #0x14
|
|
|
|
#define SYSCALL_INST5 mov.l @(0,r15),r0; trapa #0x15
|
|
|
|
#define SYSCALL_INST6 mov.l @(0,r15),r0; mov.l @(4,r15),r1; trapa #0x16
|
2000-06-12 20:50:37 +00:00
|
|
|
|
|
|
|
#undef DO_CALL
|
* locale/programs/ld-ctype.c (ctype_read): When given a repertoire
name of "", store a null pointer instead.
* configure.in (elf): Set to yes for freebsd*, netbsd*.
* configure: Regenerated.
* locale/xlocale.c [! (USE_TLS && HAVE___THREAD)] (__libc_tsd_LOCALE):
Initialize this instead of __libc_tsd_LOCALE_data.
* sysdeps/unix/grantpt.c (pts_name): Convert ENOTTY return from
ptsname_r to EINVAL.
* sysdeps/generic/ptsname.c (__ptsname_r): Return ENOSYS instead of 0.
* rt/Makefile: Revert last change, it was inappropriate to presume aio
implementations depend on pthreads.
* rt/tst-aio.c (do_test): Exit happy if first failure is ENOSYS.
* rt/tst-aio64.c (do_test): Likewise.
* rt/tst-aio2.c (do_test): Likewise.
* rt/tst-aio3.c (do_test): Likewise.
* rt/tst-aio4.c (do_test): Likewise.
* rt/tst-aio5.c (do_test): Likewise.
* rt/tst-aio6.c (do_test): Likewise.
* rt/tst-aio7.c (do_test): Likewise.
* sysdeps/generic/bits/libc-lock.h (__libc_setspecific): Use a cast to
void so as to avoid compiler warnings.
* libio/oldstdfiles.c [! _IO_MTSAFE_IO] (DEF_STDFILE): Don't define
_IO_wide_data_FD, which is never used here.
* libio/iofread.c
[! _IO_MTSAFE_IO] (fread_unlocked): Add libc_hidden_ver defn.
* libio/iofputs.c [! _IO_MTSAFE_IO] (fputs_unlocked): Likewise.
* libio/iofgets.c [! _IO_MTSAFE_IO] (fgets_unlocked): Likewise.
* include/resolv.h [! _LIBC_REENTRANT] (_res): #undef it before decl.
* include/netdb.h [! _LIBC_REENTRANT] (h_errno): Declare normal extern.
* misc/syslog.c (openlog): Conditionalize locking on [_LIBC_REENTRANT].
(closelog): Likewise.
2002-07-06 Bruno Haible <bruno@clisp.org>
* sysdeps/alpha/fpu/fpu_control.h: Comment fix.
* sysdeps/unix/sysv/linux/alpha/pipe.S: Moved to ...
* sysdeps/unix/alpha/pipe.S: ... here.
* sysdeps/unix/bsd/osf/alpha/pipe.S: File removed.
* sysdeps/unix/i386/brk.S: Rename local label to '.Lhere' in ELF.
* sysdeps/unix/i386/brk.S: Add PSEUDO_END invocation.
* sysdeps/unix/i386/fork.S: Likewise.
* sysdeps/unix/i386/pipe.S: Likewise.
* sysdeps/unix/i386/wait.S: Likewise.
* sysdeps/unix/fork.S: Fix PSEUDO_END argument.
* sysdeps/unix/arm/fork.S: Likewise.
* sysdeps/unix/sysv/linux/arm/sysdep.h (PSEUDO): Swap DO_CALL
arguments.
(DO_CALL): Swap argument order.
* sysdeps/unix/sysv/linux/hppa/sysdep.h (PSEUDO): Swap DO_CALL
arguments.
(DO_CALL): Swap argument order.
* sysdeps/unix/sysv/linux/i386/sysdep.h (PSEUDO): Swap DO_CALL
arguments.
(DO_CALL): Swap argument order.
* sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h (PSEUDO): Swap DO_CALL
arguments.
(DO_CALL): Swap argument order.
* sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h (PSEUDO): Swap DO_CALL
arguments.
(DO_CALL): Swap argument order.
* sysdeps/unix/sysv/linux/sh/sysdep.h (PSEUDO): Swap DO_CALL
arguments.
(DO_CALL): Swap argument order.
* sysdeps/unix/sysv/linux/x86_64/sysdep.h (PSEUDO): Swap DO_CALL
arguments.
(DO_CALL): Swap argument order.
* sysdeps/i386/sysdep.h (PSEUDO): Fix syntax error.
(L): Define right for ELF.
* sysdeps/unix/sysv/linux/i386/sysdep.h (L): Remove definition.
Now defined in sysdeps/i386/sysdep.h.
* sysdeps/posix/readv.c: Ansify function definition.
* sysdeps/posix/writev.c: Likewise.
* stdio-common/tst-fseek.c (main): Don't assume that off_t and size_t
have the same size. Avoid direct cast from size_t to off_t.
* login/tst-utmp.c (simulate_login): Don't leave garbage after the
nul byte in entry[n].ut_user.
(simulate_logout): Likewise.
* login/programs/utmpdump.c (print_entry): Test _HAVE_UT_TYPE,
_HAVE_UT_PID, _HAVE_UT_ID, _HAVE_UT_HOST, instead of assuming the
existence of corresponding members of 'struct utmp'.
* login/tst-utmp.c: Trivialize the test if testing 'struct utmp' and
!_HAVE_UT_TYPE.
* sysdeps/unix/opendir.c (__opendir): If st_blksize is 0 or too small,
allocate a buffer of at least BUFSIZ bytes, not just of
sizeof (struct dirent).
* sysdeps/generic/glob.c: Include <limits.h>.
(NAME_MAX): Define a fallback.
(glob_in_dir): Allocate enough room for a 'struct dirent64' on the
stack.
* posix/tst-dir.c: Include <stddef.h>, for offsetof.
(main): Allocate enough room for a 'struct dirent64' on the stack.
* posix/tst-gnuglob.c (my_DIR): Allocate enough room for a
'struct dirent'.
* sysdeps/unix/sysv/linux/init-first.c: Don't include
kernel-features.h.
* inet/htontest.c: Include <sys/types.h>.
* sysdeps/generic/sys/sysinfo.h: Surround with __{BEGIN,END}_DECLS.
* include/sys/sysctl.h: Comment fix.
* elf/rtld.c (_rtld_global) [! _LIBC_REENTRANT]: Don't initialize
_dl_load_lock.
* libio/fileno.c (fileno_unlocked): Define regardless of _IO_MTSAFE_IO.
* sysdeps/unix/bsd/bsd4.4/syscalls.list (__sigaltstack): New alias.
* sysdeps/unix/inet/syscalls.list (__connect_internal): New alias.
(__getpeername): New alias.
(__getsockname): New alias.
(__socket): New alias.
* sysdeps/unix/common/syscalls.list (getpgid): Remove.
* sysdeps/unix/syscalls.list (__chown_internal): New alias.
(__fcntl_internal): New alias.
(__profil): New alias.
2002-08-26 11:39:12 +00:00
|
|
|
#define DO_CALL(syscall_name, args) \
|
Update.
2000-10-26 Kazumoto Kojima <kkojima@rr.iij4u.or.jp>
Yutaka Niibe <gniibe@chroot.org>
* sysdeps/sh/dl-machine.h (elf_machine_rela): Handle in place
relocation which is generated by new ld.
* sysdeps/sh/elf/initfini.c (_init): Preseted __fpscr_values.
(_fini): Delete an obsolete register prefix.
* sysdeps/unix/sysv/linux/sh/Versions: Add __xstat64, __fxstat64,
__lxstat64, alphasort64, glob64, readdir64, readdir64_r, scandir64
and versionsort64 as the 2.2-versioned symbols.
* sysdeps/unix/sysv/linux/sh/bits/fcntl.h: New file.
* sysdeps/unix/sysv/linux/sh/brk.c: Changes for the new system call
calling convention of the kernel.
* sysdeps/unix/sysv/linux/sh/pipe.S: Likewise.
* sysdeps/unix/sysv/linux/sh/socket.S: Likewise.
* sysdeps/unix/sysv/linux/sh/clone.S: Likewise.
* sysdeps/unix/sysv/linux/sh/vfork.S: Likewise.
* sysdeps/unix/sysv/linux/sh/sysdep.h: Likewise.
* sysdeps/unix/sysv/linux/sh/fcntl.c: New file.
* sysdeps/unix/sysv/linux/sh/lockf64.c: New file.
* sysdeps/unix/sysv/linux/sh/sys/user.h: Include the kernel header
file and delete the definitions of struct user and user_fp.
* sysdeps/unix/sysv/linux/sh/syscall.S: New file.
* sysdeps/unix/sysv/linux/sh/syscalls.list: Remove entries for
s_ioctl, s_ipc, s_llseek, s_chown, s_fchown, s_lchown, s_execve,
rt_sigaction, rt_sigpending, rt_sigprocmask, rt_sigqueueinfo,
rt_sigsuspend, rt_sigtimedwait, s_getcwd, s_getdents, s_getgroups,
s_getpriority, s_getegid, s_geteuid, s_getuid, getresgid, getresuid,
s_getrlimit, s_poll, s_pread64, s_ptrace, s_pwrite64, s_reboot,
s_setrlimit, s_sigaction, s_sigpending, s_sigprocmask, s_sigsuspend,
s_setfsgid, s_setfsuid, s_setgid, s_setgroups, s_setregid,
s_setresgid, s_setresuid, s_setreuid, s_setuid, s_sysctl,
s_ugetrlimit, s_ustat, sys_fstat, sys_lstat, sys_mknod, sys_readv,
sys_stat, sys_writev and syscall.
2000-10-26 02:34:17 +00:00
|
|
|
mov.l 1f,r3; \
|
|
|
|
SYSCALL_INST##args; \
|
2003-10-15 05:47:36 +00:00
|
|
|
SYSCALL_INST_PAD; \
|
Update.
2000-10-26 Kazumoto Kojima <kkojima@rr.iij4u.or.jp>
Yutaka Niibe <gniibe@chroot.org>
* sysdeps/sh/dl-machine.h (elf_machine_rela): Handle in place
relocation which is generated by new ld.
* sysdeps/sh/elf/initfini.c (_init): Preseted __fpscr_values.
(_fini): Delete an obsolete register prefix.
* sysdeps/unix/sysv/linux/sh/Versions: Add __xstat64, __fxstat64,
__lxstat64, alphasort64, glob64, readdir64, readdir64_r, scandir64
and versionsort64 as the 2.2-versioned symbols.
* sysdeps/unix/sysv/linux/sh/bits/fcntl.h: New file.
* sysdeps/unix/sysv/linux/sh/brk.c: Changes for the new system call
calling convention of the kernel.
* sysdeps/unix/sysv/linux/sh/pipe.S: Likewise.
* sysdeps/unix/sysv/linux/sh/socket.S: Likewise.
* sysdeps/unix/sysv/linux/sh/clone.S: Likewise.
* sysdeps/unix/sysv/linux/sh/vfork.S: Likewise.
* sysdeps/unix/sysv/linux/sh/sysdep.h: Likewise.
* sysdeps/unix/sysv/linux/sh/fcntl.c: New file.
* sysdeps/unix/sysv/linux/sh/lockf64.c: New file.
* sysdeps/unix/sysv/linux/sh/sys/user.h: Include the kernel header
file and delete the definitions of struct user and user_fp.
* sysdeps/unix/sysv/linux/sh/syscall.S: New file.
* sysdeps/unix/sysv/linux/sh/syscalls.list: Remove entries for
s_ioctl, s_ipc, s_llseek, s_chown, s_fchown, s_lchown, s_execve,
rt_sigaction, rt_sigpending, rt_sigprocmask, rt_sigqueueinfo,
rt_sigsuspend, rt_sigtimedwait, s_getcwd, s_getdents, s_getgroups,
s_getpriority, s_getegid, s_geteuid, s_getuid, getresgid, getresuid,
s_getrlimit, s_poll, s_pread64, s_ptrace, s_pwrite64, s_reboot,
s_setrlimit, s_sigaction, s_sigpending, s_sigprocmask, s_sigsuspend,
s_setfsgid, s_setfsuid, s_setgid, s_setgroups, s_setregid,
s_setresgid, s_setresuid, s_setreuid, s_setuid, s_sysctl,
s_ugetrlimit, s_ustat, sys_fstat, sys_lstat, sys_mknod, sys_readv,
sys_stat, sys_writev and syscall.
2000-10-26 02:34:17 +00:00
|
|
|
bra 2f; \
|
|
|
|
nop; \
|
|
|
|
.align 2; \
|
|
|
|
1: .long SYS_ify (syscall_name); \
|
2000-06-12 20:50:37 +00:00
|
|
|
2:
|
|
|
|
|
|
|
|
#else /* not __ASSEMBLER__ */
|
|
|
|
|
Update.
2000-10-26 Kazumoto Kojima <kkojima@rr.iij4u.or.jp>
Yutaka Niibe <gniibe@chroot.org>
* sysdeps/sh/dl-machine.h (elf_machine_rela): Handle in place
relocation which is generated by new ld.
* sysdeps/sh/elf/initfini.c (_init): Preseted __fpscr_values.
(_fini): Delete an obsolete register prefix.
* sysdeps/unix/sysv/linux/sh/Versions: Add __xstat64, __fxstat64,
__lxstat64, alphasort64, glob64, readdir64, readdir64_r, scandir64
and versionsort64 as the 2.2-versioned symbols.
* sysdeps/unix/sysv/linux/sh/bits/fcntl.h: New file.
* sysdeps/unix/sysv/linux/sh/brk.c: Changes for the new system call
calling convention of the kernel.
* sysdeps/unix/sysv/linux/sh/pipe.S: Likewise.
* sysdeps/unix/sysv/linux/sh/socket.S: Likewise.
* sysdeps/unix/sysv/linux/sh/clone.S: Likewise.
* sysdeps/unix/sysv/linux/sh/vfork.S: Likewise.
* sysdeps/unix/sysv/linux/sh/sysdep.h: Likewise.
* sysdeps/unix/sysv/linux/sh/fcntl.c: New file.
* sysdeps/unix/sysv/linux/sh/lockf64.c: New file.
* sysdeps/unix/sysv/linux/sh/sys/user.h: Include the kernel header
file and delete the definitions of struct user and user_fp.
* sysdeps/unix/sysv/linux/sh/syscall.S: New file.
* sysdeps/unix/sysv/linux/sh/syscalls.list: Remove entries for
s_ioctl, s_ipc, s_llseek, s_chown, s_fchown, s_lchown, s_execve,
rt_sigaction, rt_sigpending, rt_sigprocmask, rt_sigqueueinfo,
rt_sigsuspend, rt_sigtimedwait, s_getcwd, s_getdents, s_getgroups,
s_getpriority, s_getegid, s_geteuid, s_getuid, getresgid, getresuid,
s_getrlimit, s_poll, s_pread64, s_ptrace, s_pwrite64, s_reboot,
s_setrlimit, s_sigaction, s_sigpending, s_sigprocmask, s_sigsuspend,
s_setfsgid, s_setfsuid, s_setgid, s_setgroups, s_setregid,
s_setresgid, s_setresuid, s_setreuid, s_setuid, s_sysctl,
s_ugetrlimit, s_ustat, sys_fstat, sys_lstat, sys_mknod, sys_readv,
sys_stat, sys_writev and syscall.
2000-10-26 02:34:17 +00:00
|
|
|
#define SYSCALL_INST_STR0 "trapa #0x10\n\t"
|
|
|
|
#define SYSCALL_INST_STR1 "trapa #0x11\n\t"
|
|
|
|
#define SYSCALL_INST_STR2 "trapa #0x12\n\t"
|
|
|
|
#define SYSCALL_INST_STR3 "trapa #0x13\n\t"
|
|
|
|
#define SYSCALL_INST_STR4 "trapa #0x14\n\t"
|
|
|
|
#define SYSCALL_INST_STR5 "trapa #0x15\n\t"
|
|
|
|
#define SYSCALL_INST_STR6 "trapa #0x16\n\t"
|
|
|
|
|
2003-02-08 02:34:27 +00:00
|
|
|
# ifdef NEED_SYSCALL_INST_PAD
|
|
|
|
# define SYSCALL_INST_PAD "\
|
|
|
|
or r0,r0; or r0,r0; or r0,r0; or r0,r0; or r0,r0"
|
|
|
|
# else
|
|
|
|
# define SYSCALL_INST_PAD
|
|
|
|
# endif
|
|
|
|
|
Update.
2000-10-26 Kazumoto Kojima <kkojima@rr.iij4u.or.jp>
Yutaka Niibe <gniibe@chroot.org>
* sysdeps/sh/dl-machine.h (elf_machine_rela): Handle in place
relocation which is generated by new ld.
* sysdeps/sh/elf/initfini.c (_init): Preseted __fpscr_values.
(_fini): Delete an obsolete register prefix.
* sysdeps/unix/sysv/linux/sh/Versions: Add __xstat64, __fxstat64,
__lxstat64, alphasort64, glob64, readdir64, readdir64_r, scandir64
and versionsort64 as the 2.2-versioned symbols.
* sysdeps/unix/sysv/linux/sh/bits/fcntl.h: New file.
* sysdeps/unix/sysv/linux/sh/brk.c: Changes for the new system call
calling convention of the kernel.
* sysdeps/unix/sysv/linux/sh/pipe.S: Likewise.
* sysdeps/unix/sysv/linux/sh/socket.S: Likewise.
* sysdeps/unix/sysv/linux/sh/clone.S: Likewise.
* sysdeps/unix/sysv/linux/sh/vfork.S: Likewise.
* sysdeps/unix/sysv/linux/sh/sysdep.h: Likewise.
* sysdeps/unix/sysv/linux/sh/fcntl.c: New file.
* sysdeps/unix/sysv/linux/sh/lockf64.c: New file.
* sysdeps/unix/sysv/linux/sh/sys/user.h: Include the kernel header
file and delete the definitions of struct user and user_fp.
* sysdeps/unix/sysv/linux/sh/syscall.S: New file.
* sysdeps/unix/sysv/linux/sh/syscalls.list: Remove entries for
s_ioctl, s_ipc, s_llseek, s_chown, s_fchown, s_lchown, s_execve,
rt_sigaction, rt_sigpending, rt_sigprocmask, rt_sigqueueinfo,
rt_sigsuspend, rt_sigtimedwait, s_getcwd, s_getdents, s_getgroups,
s_getpriority, s_getegid, s_geteuid, s_getuid, getresgid, getresuid,
s_getrlimit, s_poll, s_pread64, s_ptrace, s_pwrite64, s_reboot,
s_setrlimit, s_sigaction, s_sigpending, s_sigprocmask, s_sigsuspend,
s_setfsgid, s_setfsuid, s_setgid, s_setgroups, s_setregid,
s_setresgid, s_setresuid, s_setreuid, s_setuid, s_sysctl,
s_ugetrlimit, s_ustat, sys_fstat, sys_lstat, sys_mknod, sys_readv,
sys_stat, sys_writev and syscall.
2000-10-26 02:34:17 +00:00
|
|
|
#define ASMFMT_0
|
|
|
|
#define ASMFMT_1 \
|
|
|
|
, "r" (r4)
|
|
|
|
#define ASMFMT_2 \
|
|
|
|
, "r" (r4), "r" (r5)
|
|
|
|
#define ASMFMT_3 \
|
|
|
|
, "r" (r4), "r" (r5), "r" (r6)
|
|
|
|
#define ASMFMT_4 \
|
|
|
|
, "r" (r4), "r" (r5), "r" (r6), "r" (r7)
|
|
|
|
#define ASMFMT_5 \
|
|
|
|
, "r" (r4), "r" (r5), "r" (r6), "r" (r7), "0" (r0)
|
|
|
|
#define ASMFMT_6 \
|
|
|
|
, "r" (r4), "r" (r5), "r" (r6), "r" (r7), "0" (r0), "r" (r1)
|
|
|
|
#define ASMFMT_7 \
|
|
|
|
, "r" (r4), "r" (r5), "r" (r6), "r" (r7), "0" (r0), "r" (r1), "r" (r2)
|
|
|
|
|
|
|
|
#define SUBSTITUTE_ARGS_0()
|
2004-04-16 19:07:07 +00:00
|
|
|
#define SUBSTITUTE_ARGS_1(arg1) \
|
|
|
|
long int _arg1 = (long int) (arg1); \
|
|
|
|
register long int r4 asm ("%r4") = (long int) (_arg1)
|
|
|
|
#define SUBSTITUTE_ARGS_2(arg1, arg2) \
|
|
|
|
long int _arg1 = (long int) (arg1); \
|
|
|
|
long int _arg2 = (long int) (arg2); \
|
|
|
|
register long int r4 asm ("%r4") = (long int) (_arg1); \
|
|
|
|
register long int r5 asm ("%r5") = (long int) (_arg2)
|
|
|
|
#define SUBSTITUTE_ARGS_3(arg1, arg2, arg3) \
|
|
|
|
long int _arg1 = (long int) (arg1); \
|
|
|
|
long int _arg2 = (long int) (arg2); \
|
|
|
|
long int _arg3 = (long int) (arg3); \
|
|
|
|
register long int r4 asm ("%r4") = (long int) (_arg1); \
|
|
|
|
register long int r5 asm ("%r5") = (long int) (_arg2); \
|
|
|
|
register long int r6 asm ("%r6") = (long int) (_arg3)
|
|
|
|
#define SUBSTITUTE_ARGS_4(arg1, arg2, arg3, arg4) \
|
|
|
|
long int _arg1 = (long int) (arg1); \
|
|
|
|
long int _arg2 = (long int) (arg2); \
|
|
|
|
long int _arg3 = (long int) (arg3); \
|
|
|
|
long int _arg4 = (long int) (arg4); \
|
|
|
|
register long int r4 asm ("%r4") = (long int) (_arg1); \
|
|
|
|
register long int r5 asm ("%r5") = (long int) (_arg2); \
|
|
|
|
register long int r6 asm ("%r6") = (long int) (_arg3); \
|
|
|
|
register long int r7 asm ("%r7") = (long int) (_arg4)
|
|
|
|
#define SUBSTITUTE_ARGS_5(arg1, arg2, arg3, arg4, arg5) \
|
|
|
|
long int _arg1 = (long int) (arg1); \
|
|
|
|
long int _arg2 = (long int) (arg2); \
|
|
|
|
long int _arg3 = (long int) (arg3); \
|
|
|
|
long int _arg4 = (long int) (arg4); \
|
|
|
|
long int _arg5 = (long int) (arg5); \
|
|
|
|
register long int r4 asm ("%r4") = (long int) (_arg1); \
|
|
|
|
register long int r5 asm ("%r5") = (long int) (_arg2); \
|
|
|
|
register long int r6 asm ("%r6") = (long int) (_arg3); \
|
|
|
|
register long int r7 asm ("%r7") = (long int) (_arg4); \
|
|
|
|
register long int r0 asm ("%r0") = (long int) (_arg5)
|
|
|
|
#define SUBSTITUTE_ARGS_6(arg1, arg2, arg3, arg4, arg5, arg6) \
|
|
|
|
long int _arg1 = (long int) (arg1); \
|
|
|
|
long int _arg2 = (long int) (arg2); \
|
|
|
|
long int _arg3 = (long int) (arg3); \
|
|
|
|
long int _arg4 = (long int) (arg4); \
|
|
|
|
long int _arg5 = (long int) (arg5); \
|
|
|
|
long int _arg6 = (long int) (arg6); \
|
|
|
|
register long int r4 asm ("%r4") = (long int)(_arg1); \
|
|
|
|
register long int r5 asm ("%r5") = (long int) (_arg2); \
|
|
|
|
register long int r6 asm ("%r6") = (long int) (_arg3); \
|
|
|
|
register long int r7 asm ("%r7") = (long int) (_arg4); \
|
|
|
|
register long int r0 asm ("%r0") = (long int) (_arg5); \
|
|
|
|
register long int r1 asm ("%r1") = (long int) (_arg6)
|
|
|
|
#define SUBSTITUTE_ARGS_7(arg1, arg2, arg3, arg4, arg5, arg6, arg7) \
|
|
|
|
long int _arg1 = (long int) (arg1); \
|
|
|
|
long int _arg2 = (long int) (arg2); \
|
|
|
|
long int _arg3 = (long int) (arg3); \
|
|
|
|
long int _arg4 = (long int) (arg4); \
|
|
|
|
long int _arg5 = (long int) (arg5); \
|
|
|
|
long int _arg6 = (long int) (arg6); \
|
|
|
|
long int _arg7 = (long int) (arg7); \
|
|
|
|
register long int r4 asm ("%r4") = (long int) (_arg1); \
|
|
|
|
register long int r5 asm ("%r5") = (long int) (_arg2); \
|
|
|
|
register long int r6 asm ("%r6") = (long int) (_arg3); \
|
|
|
|
register long int r7 asm ("%r7") = (long int) (_arg4); \
|
|
|
|
register long int r0 asm ("%r0") = (long int) (_arg5); \
|
|
|
|
register long int r1 asm ("%r1") = (long int) (_arg6); \
|
|
|
|
register long int r2 asm ("%r2") = (long int) (_arg7)
|
Update.
2000-10-26 Kazumoto Kojima <kkojima@rr.iij4u.or.jp>
Yutaka Niibe <gniibe@chroot.org>
* sysdeps/sh/dl-machine.h (elf_machine_rela): Handle in place
relocation which is generated by new ld.
* sysdeps/sh/elf/initfini.c (_init): Preseted __fpscr_values.
(_fini): Delete an obsolete register prefix.
* sysdeps/unix/sysv/linux/sh/Versions: Add __xstat64, __fxstat64,
__lxstat64, alphasort64, glob64, readdir64, readdir64_r, scandir64
and versionsort64 as the 2.2-versioned symbols.
* sysdeps/unix/sysv/linux/sh/bits/fcntl.h: New file.
* sysdeps/unix/sysv/linux/sh/brk.c: Changes for the new system call
calling convention of the kernel.
* sysdeps/unix/sysv/linux/sh/pipe.S: Likewise.
* sysdeps/unix/sysv/linux/sh/socket.S: Likewise.
* sysdeps/unix/sysv/linux/sh/clone.S: Likewise.
* sysdeps/unix/sysv/linux/sh/vfork.S: Likewise.
* sysdeps/unix/sysv/linux/sh/sysdep.h: Likewise.
* sysdeps/unix/sysv/linux/sh/fcntl.c: New file.
* sysdeps/unix/sysv/linux/sh/lockf64.c: New file.
* sysdeps/unix/sysv/linux/sh/sys/user.h: Include the kernel header
file and delete the definitions of struct user and user_fp.
* sysdeps/unix/sysv/linux/sh/syscall.S: New file.
* sysdeps/unix/sysv/linux/sh/syscalls.list: Remove entries for
s_ioctl, s_ipc, s_llseek, s_chown, s_fchown, s_lchown, s_execve,
rt_sigaction, rt_sigpending, rt_sigprocmask, rt_sigqueueinfo,
rt_sigsuspend, rt_sigtimedwait, s_getcwd, s_getdents, s_getgroups,
s_getpriority, s_getegid, s_geteuid, s_getuid, getresgid, getresuid,
s_getrlimit, s_poll, s_pread64, s_ptrace, s_pwrite64, s_reboot,
s_setrlimit, s_sigaction, s_sigpending, s_sigprocmask, s_sigsuspend,
s_setfsgid, s_setfsuid, s_setgid, s_setgroups, s_setregid,
s_setresgid, s_setresuid, s_setreuid, s_setuid, s_sysctl,
s_ugetrlimit, s_ustat, sys_fstat, sys_lstat, sys_mknod, sys_readv,
sys_stat, sys_writev and syscall.
2000-10-26 02:34:17 +00:00
|
|
|
|
2000-06-12 20:50:37 +00:00
|
|
|
#undef INLINE_SYSCALL
|
2003-02-08 02:34:27 +00:00
|
|
|
#define INLINE_SYSCALL(name, nr, args...) \
|
|
|
|
({ \
|
|
|
|
unsigned int resultvar = INTERNAL_SYSCALL (name, , nr, args); \
|
|
|
|
if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (resultvar, ), 0)) \
|
|
|
|
{ \
|
2011-09-10 20:50:28 +00:00
|
|
|
__set_errno (INTERNAL_SYSCALL_ERRNO (resultvar, )); \
|
|
|
|
resultvar = 0xffffffff; \
|
2003-02-08 02:34:27 +00:00
|
|
|
} \
|
|
|
|
(int) resultvar; })
|
|
|
|
|
|
|
|
#undef INTERNAL_SYSCALL
|
|
|
|
#define INTERNAL_SYSCALL(name, err, nr, args...) \
|
2004-04-16 19:07:07 +00:00
|
|
|
({ \
|
|
|
|
unsigned long int resultvar; \
|
|
|
|
register long int r3 asm ("%r3") = SYS_ify (name); \
|
|
|
|
SUBSTITUTE_ARGS_##nr(args); \
|
|
|
|
\
|
|
|
|
asm volatile (SYSCALL_INST_STR##nr SYSCALL_INST_PAD \
|
|
|
|
: "=z" (resultvar) \
|
|
|
|
: "r" (r3) ASMFMT_##nr \
|
2009-01-28 16:11:36 +00:00
|
|
|
: "memory", "t"); \
|
2004-04-16 19:07:07 +00:00
|
|
|
\
|
Update.
2000-10-26 Kazumoto Kojima <kkojima@rr.iij4u.or.jp>
Yutaka Niibe <gniibe@chroot.org>
* sysdeps/sh/dl-machine.h (elf_machine_rela): Handle in place
relocation which is generated by new ld.
* sysdeps/sh/elf/initfini.c (_init): Preseted __fpscr_values.
(_fini): Delete an obsolete register prefix.
* sysdeps/unix/sysv/linux/sh/Versions: Add __xstat64, __fxstat64,
__lxstat64, alphasort64, glob64, readdir64, readdir64_r, scandir64
and versionsort64 as the 2.2-versioned symbols.
* sysdeps/unix/sysv/linux/sh/bits/fcntl.h: New file.
* sysdeps/unix/sysv/linux/sh/brk.c: Changes for the new system call
calling convention of the kernel.
* sysdeps/unix/sysv/linux/sh/pipe.S: Likewise.
* sysdeps/unix/sysv/linux/sh/socket.S: Likewise.
* sysdeps/unix/sysv/linux/sh/clone.S: Likewise.
* sysdeps/unix/sysv/linux/sh/vfork.S: Likewise.
* sysdeps/unix/sysv/linux/sh/sysdep.h: Likewise.
* sysdeps/unix/sysv/linux/sh/fcntl.c: New file.
* sysdeps/unix/sysv/linux/sh/lockf64.c: New file.
* sysdeps/unix/sysv/linux/sh/sys/user.h: Include the kernel header
file and delete the definitions of struct user and user_fp.
* sysdeps/unix/sysv/linux/sh/syscall.S: New file.
* sysdeps/unix/sysv/linux/sh/syscalls.list: Remove entries for
s_ioctl, s_ipc, s_llseek, s_chown, s_fchown, s_lchown, s_execve,
rt_sigaction, rt_sigpending, rt_sigprocmask, rt_sigqueueinfo,
rt_sigsuspend, rt_sigtimedwait, s_getcwd, s_getdents, s_getgroups,
s_getpriority, s_getegid, s_geteuid, s_getuid, getresgid, getresuid,
s_getrlimit, s_poll, s_pread64, s_ptrace, s_pwrite64, s_reboot,
s_setrlimit, s_sigaction, s_sigpending, s_sigprocmask, s_sigsuspend,
s_setfsgid, s_setfsuid, s_setgid, s_setgroups, s_setregid,
s_setresgid, s_setresuid, s_setreuid, s_setuid, s_sysctl,
s_ugetrlimit, s_ustat, sys_fstat, sys_lstat, sys_mknod, sys_readv,
sys_stat, sys_writev and syscall.
2000-10-26 02:34:17 +00:00
|
|
|
(int) resultvar; })
|
2000-06-12 20:50:37 +00:00
|
|
|
|
2004-09-24 07:18:48 +00:00
|
|
|
/* The _NCS variant allows non-constant syscall numbers. */
|
|
|
|
#define INTERNAL_SYSCALL_NCS(name, err, nr, args...) \
|
|
|
|
({ \
|
|
|
|
unsigned long int resultvar; \
|
2011-09-10 20:50:28 +00:00
|
|
|
register long int r3 asm ("%r3") = (name); \
|
2004-09-24 07:18:48 +00:00
|
|
|
SUBSTITUTE_ARGS_##nr(args); \
|
|
|
|
\
|
|
|
|
asm volatile (SYSCALL_INST_STR##nr SYSCALL_INST_PAD \
|
|
|
|
: "=z" (resultvar) \
|
|
|
|
: "r" (r3) ASMFMT_##nr \
|
2009-01-28 16:11:36 +00:00
|
|
|
: "memory", "t"); \
|
2004-09-24 07:18:48 +00:00
|
|
|
\
|
|
|
|
(int) resultvar; })
|
|
|
|
|
2003-02-08 02:34:27 +00:00
|
|
|
#undef INTERNAL_SYSCALL_DECL
|
|
|
|
#define INTERNAL_SYSCALL_DECL(err) do { } while (0)
|
|
|
|
|
|
|
|
#undef INTERNAL_SYSCALL_ERROR_P
|
|
|
|
#define INTERNAL_SYSCALL_ERROR_P(val, err) \
|
|
|
|
((unsigned int) (val) >= 0xfffff001u)
|
|
|
|
|
|
|
|
#undef INTERNAL_SYSCALL_ERRNO
|
|
|
|
#define INTERNAL_SYSCALL_ERRNO(val, err) (-(val))
|
|
|
|
|
2000-06-12 20:50:37 +00:00
|
|
|
#endif /* __ASSEMBLER__ */
|
|
|
|
|
2005-12-20 15:28:51 +00:00
|
|
|
/* Pointer mangling support. */
|
2014-11-20 15:39:43 +00:00
|
|
|
#if IS_IN (rtld)
|
2005-12-20 15:28:51 +00:00
|
|
|
/* We cannot use the thread descriptor because in ld.so we use setjmp
|
|
|
|
earlier than the descriptor is initialized. Using a global variable
|
|
|
|
is too complicated here since we have no PC-relative addressing mode. */
|
|
|
|
#else
|
|
|
|
# ifdef __ASSEMBLER__
|
2006-01-20 16:49:36 +00:00
|
|
|
# define PTR_MANGLE(reg, tmp) \
|
|
|
|
stc gbr,tmp; mov.l @(POINTER_GUARD,tmp),tmp; xor tmp,reg
|
|
|
|
# define PTR_MANGLE2(reg, tmp) xor tmp,reg
|
|
|
|
# define PTR_DEMANGLE(reg, tmp) PTR_MANGLE (reg, tmp)
|
|
|
|
# define PTR_DEMANGLE2(reg, tmp) PTR_MANGLE2 (reg, tmp)
|
2005-12-20 15:28:51 +00:00
|
|
|
# else
|
|
|
|
# define PTR_MANGLE(var) \
|
|
|
|
(var) = (void *) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ())
|
|
|
|
# define PTR_DEMANGLE(var) PTR_MANGLE (var)
|
|
|
|
# endif
|
|
|
|
#endif
|
|
|
|
|
2000-06-12 20:50:37 +00:00
|
|
|
#endif /* linux/sh/sysdep.h */
|