2021-01-02 19:32:25 +00:00
|
|
|
/* Copyright (C) 2000-2021 Free Software Foundation, Inc.
|
2000-01-31 06:42:36 +00:00
|
|
|
This file is part of the GNU C Library.
|
|
|
|
Contributed by Jakub Jelinek <jakub@redhat.com>, 2000.
|
|
|
|
|
|
|
|
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-01-31 06:42:36 +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-01-31 06:42:36 +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
|
Prefer https to http for gnu.org and fsf.org URLs
Also, change sources.redhat.com to sourceware.org.
This patch was automatically generated by running the following shell
script, which uses GNU sed, and which avoids modifying files imported
from upstream:
sed -ri '
s,(http|ftp)(://(.*\.)?(gnu|fsf|sourceware)\.org($|[^.]|\.[^a-z])),https\2,g
s,(http|ftp)(://(.*\.)?)sources\.redhat\.com($|[^.]|\.[^a-z]),https\2sourceware.org\4,g
' \
$(find $(git ls-files) -prune -type f \
! -name '*.po' \
! -name 'ChangeLog*' \
! -path COPYING ! -path COPYING.LIB \
! -path manual/fdl-1.3.texi ! -path manual/lgpl-2.1.texi \
! -path manual/texinfo.tex ! -path scripts/config.guess \
! -path scripts/config.sub ! -path scripts/install-sh \
! -path scripts/mkinstalldirs ! -path scripts/move-if-change \
! -path INSTALL ! -path locale/programs/charmap-kw.h \
! -path po/libc.pot ! -path sysdeps/gnu/errlist.c \
! '(' -name configure \
-execdir test -f configure.ac -o -f configure.in ';' ')' \
! '(' -name preconfigure \
-execdir test -f preconfigure.ac ';' ')' \
-print)
and then by running 'make dist-prepare' to regenerate files built
from the altered files, and then executing the following to cleanup:
chmod a+x sysdeps/unix/sysv/linux/riscv/configure
# Omit irrelevant whitespace and comment-only changes,
# perhaps from a slightly-different Autoconf version.
git checkout -f \
sysdeps/csky/configure \
sysdeps/hppa/configure \
sysdeps/riscv/configure \
sysdeps/unix/sysv/linux/csky/configure
# Omit changes that caused a pre-commit check to fail like this:
# remote: *** error: sysdeps/powerpc/powerpc64/ppc-mcount.S: trailing lines
git checkout -f \
sysdeps/powerpc/powerpc64/ppc-mcount.S \
sysdeps/unix/sysv/linux/s390/s390-64/syscall.S
# Omit change that caused a pre-commit check to fail like this:
# remote: *** error: sysdeps/sparc/sparc64/multiarch/memcpy-ultra3.S: last line does not end in newline
git checkout -f sysdeps/sparc/sparc64/multiarch/memcpy-ultra3.S
2019-09-07 05:40:42 +00:00
|
|
|
<https://www.gnu.org/licenses/>. */
|
2000-01-31 06:42:36 +00:00
|
|
|
|
|
|
|
#ifndef _LINUX_SPARC_SYSDEP_H
|
|
|
|
#define _LINUX_SPARC_SYSDEP_H 1
|
|
|
|
|
Delete everything under sysdeps/unix/sparc/
* sysdeps/unix/sparc/brk.S: Delete.
* sysdeps/unix/sparc/dl-brk.S: Delete.
* sysdeps/unix/sparc/pipe.S: Delete.
* sysdeps/unix/sparc/sysdep.S: Delete.
* sysdeps/unix/sparc/sysdep.h: Delete.
* sysdeps/unix/sparc/vfork.S: Delete.
* sysdeps/sparc/sysdep.h (SPARC_PIC_THUNK, SPARC_PIC_REG,
SPARC_PIC_REG_LEAF, ENTRY, END, LOC): Define.
* sysdeps/unix/sysv/linux/sparc/sysdep.h (ret, ret_NOERRNO,
ret_ERRVAL, r0, r1, MOVE): Define.
(JUMPTARGET): Remove.
* sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h: Don't include
sysdeps/unix/sparc/sysdep.h
(ENTRY, END): Remove.
* sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h: Likewise.
2012-04-25 18:44:02 +00:00
|
|
|
#include <sysdeps/unix/sysdep.h>
|
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>
|
Delete everything under sysdeps/unix/sparc/
* sysdeps/unix/sparc/brk.S: Delete.
* sysdeps/unix/sparc/dl-brk.S: Delete.
* sysdeps/unix/sparc/pipe.S: Delete.
* sysdeps/unix/sparc/sysdep.S: Delete.
* sysdeps/unix/sparc/sysdep.h: Delete.
* sysdeps/unix/sparc/vfork.S: Delete.
* sysdeps/sparc/sysdep.h (SPARC_PIC_THUNK, SPARC_PIC_REG,
SPARC_PIC_REG_LEAF, ENTRY, END, LOC): Define.
* sysdeps/unix/sysv/linux/sparc/sysdep.h (ret, ret_NOERRNO,
ret_ERRVAL, r0, r1, MOVE): Define.
(JUMPTARGET): Remove.
* sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h: Don't include
sysdeps/unix/sparc/sysdep.h
(ENTRY, END): Remove.
* sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h: Likewise.
2012-04-25 18:44:02 +00:00
|
|
|
#include <sysdeps/sparc/sysdep.h>
|
|
|
|
|
|
|
|
#ifdef __ASSEMBLER__
|
|
|
|
|
|
|
|
#define ret retl; nop
|
|
|
|
#define ret_NOERRNO retl; nop
|
|
|
|
#define ret_ERRVAL retl; nop
|
|
|
|
#define r0 %o0
|
|
|
|
#define r1 %o1
|
|
|
|
#define MOVE(x,y) mov x, y
|
|
|
|
|
|
|
|
#else /* __ASSEMBLER__ */
|
|
|
|
|
Remove PREPARE_VERSION and PREPARE_VERSION_KNOW
This patch removes the PREPARE_VERSION and PREPARE_VERSION_KNOW macro
and uses a static inline function instead, get_vdso_symbol. Each
architecture that supports vDSO must define the Linux version and its
hash for symbol resolution (VDSO_NAME and VDSO_HASH macro respectively).
It also organizes the HAVE_*_VSYSCALL for mips, powerpc, and s390 to
define them on a common header.
The idea is to require less code to configure and enable vDSO support
for newer ports. No semantic changes are expected.
Checked with a build against all affected architectures.
* sysdeps/unix/make-syscalls.sh: Make vDSO call use get_vdso_symbol.
* sysdeps/unix/sysv/linux/aarch64/gettimeofday.c (__gettimeofday):
Use get_vdso_symbol instead of _dl_vdso_vsym.
* sysdeps/unix/sysv/linux/powerpc/time.c (time): Likewise.
* sysdeps/unix/sysv/linux/riscv/flush-icache.c
(__lookup_riscv_flush_icache): Likewise.
* sysdeps/unix/sysv/linux/x86/gettimeofday.c (__gettimeofday):
Likewise.
* sysdeps/unix/sysv/linux/x86/time.c (time): Likewise.
* sysdeps/unix/sysv/linux/powerpc/gettimeofday.c: Likewise.
* sysdeps/unix/sysv/linux/aarch64/init-first.c: Likewise.
* sysdeps/unix/sysv/linux/arm/init-first.c: Likewise.
* sysdeps/unix/sysv/linux/i386/init-first.c: Likewise.
* sysdeps/unix/sysv/linux/mips/init-first.c: Likewise.
* sysdeps/unix/sysv/linux/powerpc/init-first.c: Likewise.
* sysdeps/unix/sysv/linux/riscv/init-first.c: Likewise.
* sysdeps/unix/sysv/linux/sparc/init-first.c: Likewise.
* sysdeps/unix/sysv/linux/s390/init-first.c: Likewise.
* sysdeps/unix/sysv/linux/x86_64/init-first.c: Likewise.
* sysdeps/unix/sysv/linux/aarch64/sysdep.h (VDSO_NAME, VDSO_HASH):
Define.
* sysdeps/unix/sysv/linux/arm/sysdep.h (VDSO_NAME, VDSO_HASH):
Likewise.
* sysdeps/unix/sysv/linux/i386/sysdep.h (VDSO_NAME, VDSO_HASH):
Likewise.
* sysdeps/unix/sysv/linux/riscv/sysdep.h (VDSO_NAME, VDSO_HASH):
Likewise.
* sysdeps/unix/sysv/linux/sparc/sysdep.h (VDSO_NAME, VDSO_HASH):
Likewise.
* sysdeps/unix/sysv/linux/x86_64/sysdep.h (VDSO_NAME, VDSO_HASH):
Likewise.
* sysdeps/unix/sysv/linux/mips/mips32/sysdep.h
(HAVE_CLOCK_GETTIME_VSYSCALL, HAVE_GETTIMEOFDAY_VSYSCALL): Remove
definition.
* sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h
(HAVE_CLOCK_GETTIME_VSYSCALL, HAVE_GETTIMEOFDAY_VSYSCALL): Likewise.
* sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h
(HAVE_CLOCK_GETTIME_VSYSCALL, HAVE_GETTIMEOFDAY_VSYSCALL): Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h
(HAVE_CLOCK_GETTIME_VSYSCALL, HAVE_GETTIMEOFDAY_VSYSCALL): Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h
(HAVE_CLOCK_GETTIME_VSYSCALL, HAVE_GETTIMEOFDAY_VSYSCALL): Likewise.
* sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h
(HAVE_CLOCK_GETRES_VSYSCALL, HAVE_CLOCK_GETTIME_VSYSCALL,
HAVE_GETTIMEOFDAY_VSYSCALL, HAVE_GETCPU_VSYSCALL): Likewise.
* sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h
(HAVE_CLOCK_GETRES_VSYSCALL, HAVE_CLOCK_GETTIME_VSYSCALL,
HAVE_GETTIMEOFDAY_VSYSCALL, HAVE_GETCPU_VSYSCALL): Likewise.
* sysdeps/unix/sysv/linux/mips/sysdep.h: New file.
* sysdeps/unix/sysv/linux/powerpc/sysdep.h: Likewise.
* sysdeps/unix/sysv/linux/s390/sysdep.h: Likewise.
* sysdeps/unix/sysv/linux/dl-vdso.h (PREPARE_VERSION,
PREPARE_VERSION_KNOWN, VDSO_NAME_LINUX_2_6, VDSO_HASH_LINUX_2_6,
VDSO_NAME_LINUX_2_6_15, VDSO_HASH_LINUX_2_6_15,
VDSO_NAME_LINUX_2_6_29, VDSO_HASH_LINUX_2_6_29,
VDSO_NAME_LINUX_4_15, VDSO_HASH_LINUX_4_15): Remove defines.
(get_vdso_symbol): New function.
2019-05-23 19:33:32 +00:00
|
|
|
# define VDSO_NAME "LINUX_2.6"
|
|
|
|
# define VDSO_HASH 61765110
|
|
|
|
|
2018-10-18 18:42:19 +00:00
|
|
|
/* List of system calls which are supported as vsyscalls. */
|
2019-12-11 14:13:50 +00:00
|
|
|
# ifdef __arch64__
|
|
|
|
# define HAVE_CLOCK_GETTIME64_VSYSCALL "__vdso_clock_gettime"
|
|
|
|
# else
|
|
|
|
# define HAVE_CLOCK_GETTIME_VSYSCALL "__vdso_clock_gettime"
|
|
|
|
# endif
|
Refactor vDSO initialization code
Linux vDSO initialization code the internal function pointers require a
lot of duplicated boilerplate over different architectures. This patch
aims to simplify not only the code but the required definition to enable
a vDSO symbol.
The changes are:
1. Consolidate all init-first.c on only one implementation and enable
the symbol based on HAVE_*_VSYSCALL existence.
2. Set the HAVE_*_VSYSCALL to the architecture expected names string.
3. Add a new internal implementation, get_vdso_mangle_symbol, which
returns a mangled function pointer.
Currently the clock_gettime, clock_getres, gettimeofday, getcpu, and time
are handled in an arch-independent way, powerpc still uses some
arch-specific vDSO symbol handled in a specific init-first implementation.
Checked on aarch64-linux-gnu, arm-linux-gnueabihf, i386-linux-gnu,
mips64-linux-gnu, powerpc64le-linux-gnu, s390x-linux-gnu,
sparc64-linux-gnu, and x86_64-linux-gnu.
* sysdeps/powerpc/powerpc32/backtrace.c (is_sigtramp_address,
is_sigtramp_address_rt): Use HAVE_SIGTRAMP_{RT}32 instead of SHARED.
* sysdeps/powerpc/powerpc64/backtrace.c (is_sigtramp_address):
Likewise.
* sysdeps/unix/sysv/linux/aarch64/init-first.c: Remove file.
* sysdeps/unix/sysv/linux/aarch64/libc-vdso.h: Likewise.
* sysdeps/unix/sysv/linux/arm/init-first.c: Likewise.
* sysdeps/unix/sysv/linux/arm/libc-vdso.h: Likewise.
* sysdeps/unix/sysv/linux/mips/init-first.c: Likewise.
* sysdeps/unix/sysv/linux/mips/libc-vdso.h: Likewise.
* sysdeps/unix/sysv/linux/i386/init-first.c: Likewise.
* sysdeps/unix/sysv/linux/riscv/init-first.c: Likewise.
* sysdeps/unix/sysv/linux/riscv/libc-vdso.h: Likewise.
* sysdeps/unix/sysv/linux/s390/init-first.c: Likewise.
* sysdeps/unix/sysv/linux/s390/libc-vdso.h: Likewise.
* sysdeps/unix/sysv/linux/sparc/init-first.c: Likewise.
* sysdeps/unix/sysv/linux/sparc/libc-vdso.h: Likewise.
* sysdeps/unix/sysv/linux/x86/libc-vdso.h: Likewise.
* sysdeps/unix/sysv/linux/x86_64/init-first.c: Likewise.
* sysdeps/unix/sysv/linux/aarch64/sysdep.h
(HAVE_CLOCK_GETRES_VSYSCALL, HAVE_CLOCK_GETTIME_VSYSCALL,
HAVE_GETTIMEOFDAY_VSYSCALL): Define value based on kernel exported
name.
* sysdeps/unix/sysv/linux/arm/sysdep.h (HAVE_CLOCK_GETTIME_VSYSCALL,
HAVE_GETTIMEOFDAY_VSYSCALL): Likewise.
* sysdeps/unix/sysv/linux/i386/sysdep.h (HAVE_CLOCK_GETTIME_VSYSCALL,
HAVE_GETTIMEOFDAY_VSYSCALL): Likewise.
* sysdeps/unix/sysv/linux/mips/sysdep.h (HAVE_CLOCK_GETTIME_VSYSCALL,
HAVE_GETTIMEOFDAY_VSYSCALL): Likewise.
* sysdeps/unix/sysv/linux/powerpc/sysdep.h
(HAVE_CLOCK_GETRES_VSYSCALL, HAVE_CLOCK_GETTIME_VSYSCALL,
HAVE_GETCPU_VSYSCALL, HAVE_TIME_VSYSCALL, HAVE_GET_TBFREQ,
HAVE_SIGTRAMP_RT64, HAVE_SIGTRAMP_32, HAVE_SIGTRAMP_RT32i,
HAVE_GETTIMEOFDAY_VSYSCALL): Likewise.
* sysdeps/unix/sysv/linux/riscv/sysdep.h (HAVE_CLOCK_GETRES_VSYSCALL,
HAVE_CLOCK_GETTIME_VSYSCALL, HAVE_GETTIMEOFDAY_VSYSCALL,
HAVE_GETCPU_VSYSCALL): Likewise.
* sysdeps/unix/sysv/linux/s390/sysdep.h (HAVE_CLOCK_GETRES_VSYSCALL,
HAVE_CLOCK_GETTIME_VSYSCALL, HAVE_GETTIMEOFDAY_VSYSCALL,
HAVE_GETCPU_VSYSCALL): Likewise.
* sysdeps/unix/sysv/linux/sparc/sysdep.h (HAVE_CLOCK_GETTIME_VSYSCALL,
HAVE_GETTIMEOFDAY_VSYSCALL): Likewise.
* sysdeps/unix/sysv/linux/x86_64/sysdep.h
(HAVE_CLOCK_GETTIME_VSYSCALL, HAVE_GETTIMEOFDAY_VSYSCALL,
HAVE_GETCPU_VSYSCALL): Likewise.
* sysdeps/unix/sysv/linux/dl-vdso.h (VDSO_NAME, VDSO_HASH): Define to
invalid names if architecture does not define them.
(get_vdso_mangle_symbol): New symbol.
* sysdeps/unix/sysv/linux/init-first.c: New file.
* sysdeps/unix/sysv/linux/libc-vdso.h: Likewise.
* sysdeps/unix/sysv/linux/powerpc/init-first.c (gettimeofday,
clock_gettime, clock_getres, getcpu, time): Remove declaration.
(__libc_vdso_platform_setup_arch): Likewise and use
get_vdso_mangle_symbol to setup vDSO symbols.
(sigtramp_rt64, sigtramp32, sigtramp_rt32, get_tbfreq): Add
attribute_hidden.
* sysdeps/unix/sysv/linux/powerpc/libc-vdso.h: Likewise.
* sysdeps/unix/sysv/linux/sysdep-vdso.h (VDSO_SYMBOL): Remove
definition.
2019-06-03 13:22:13 +00:00
|
|
|
# define HAVE_GETTIMEOFDAY_VSYSCALL "__vdso_gettimeofday"
|
2018-10-18 18:42:19 +00:00
|
|
|
|
* sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h (INTERNAL_SYSCALL,
INTERNAL_SYSCALL_ERROR_P, INTERNAL_SYSCALL_ERRNO): New macros.
(INLINE_SYSCALL): Use that.
* sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h (INTERNAL_SYSCALL,
INTERNAL_SYSCALL_ERROR_P, INTERNAL_SYSCALL_ERRNO): New macros.
(INLINE_SYSCALL): Use that.
* sysdeps/unix/sysv/linux/x86_64/sysdep.h (INTERNAL_SYSCALL,
INTERNAL_SYSCALL_ERROR_P, INTERNAL_SYSCALL_ERRNO): New macros.
(INLINE_SYSCALL): Use that.
* sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h: Include
dl-sysdep.h.
(SYSCALL_ERROR_HANDLER): Define RTLD_PRIVATE_ERRNO variant.
(__INTERNAL_SYSCALL_STRING): Define.
* sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h: Include
dl-sysdep.h.
(SYSCALL_ERROR_HANDLER): Define RTLD_PRIVATE_ERRNO variant.
(__INTERNAL_SYSCALL_STRING): Define.
* sysdeps/unix/sysv/linux/sparc/sysdep.h (INLINE_SYSCALL): Pass
__SYSCALL_STRING to inline_syscall*.
(INTERNAL_SYSCALL, INTERNAL_SYSCALL_ERROR_P, INTERNAL_SYSCALL_ERRNO):
New macros.
(inline_syscall0, inline_syscall1, inline_syscall2, inline_syscall3,
inline_syscall4, inline_syscall5, inline_syscall6): Add string
argument.
2002-10-24 Roland McGrath <roland@redhat.com>
* libio/bug-wfflush.c: New file.
* libio/Makefile (tests): Add bug-wfflush.
2002-10-24 18:49:00 +00:00
|
|
|
#undef INTERNAL_SYSCALL
|
2020-01-29 20:38:36 +00:00
|
|
|
#define INTERNAL_SYSCALL(name, nr, args...) \
|
|
|
|
internal_syscall##nr(__SYSCALL_STRING, __NR_##name, args)
|
2004-09-23 05:17:06 +00:00
|
|
|
|
|
|
|
#undef INTERNAL_SYSCALL_NCS
|
2020-01-29 20:38:36 +00:00
|
|
|
#define INTERNAL_SYSCALL_NCS(name, nr, args...) \
|
|
|
|
internal_syscall##nr(__SYSCALL_STRING, name, args)
|
* sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h (INTERNAL_SYSCALL,
INTERNAL_SYSCALL_ERROR_P, INTERNAL_SYSCALL_ERRNO): New macros.
(INLINE_SYSCALL): Use that.
* sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h (INTERNAL_SYSCALL,
INTERNAL_SYSCALL_ERROR_P, INTERNAL_SYSCALL_ERRNO): New macros.
(INLINE_SYSCALL): Use that.
* sysdeps/unix/sysv/linux/x86_64/sysdep.h (INTERNAL_SYSCALL,
INTERNAL_SYSCALL_ERROR_P, INTERNAL_SYSCALL_ERRNO): New macros.
(INLINE_SYSCALL): Use that.
* sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h: Include
dl-sysdep.h.
(SYSCALL_ERROR_HANDLER): Define RTLD_PRIVATE_ERRNO variant.
(__INTERNAL_SYSCALL_STRING): Define.
* sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h: Include
dl-sysdep.h.
(SYSCALL_ERROR_HANDLER): Define RTLD_PRIVATE_ERRNO variant.
(__INTERNAL_SYSCALL_STRING): Define.
* sysdeps/unix/sysv/linux/sparc/sysdep.h (INLINE_SYSCALL): Pass
__SYSCALL_STRING to inline_syscall*.
(INTERNAL_SYSCALL, INTERNAL_SYSCALL_ERROR_P, INTERNAL_SYSCALL_ERRNO):
New macros.
(inline_syscall0, inline_syscall1, inline_syscall2, inline_syscall3,
inline_syscall4, inline_syscall5, inline_syscall6): Add string
argument.
2002-10-24 Roland McGrath <roland@redhat.com>
* libio/bug-wfflush.c: New file.
* libio/Makefile (tests): Add bug-wfflush.
2002-10-24 18:49:00 +00:00
|
|
|
|
2020-01-29 20:38:36 +00:00
|
|
|
#define internal_syscall0(string,name,dummy...) \
|
2000-01-31 06:42:36 +00:00
|
|
|
({ \
|
2020-01-28 22:33:01 +00:00
|
|
|
register long int __g1 __asm__ ("g1") = (name); \
|
2000-01-31 06:42:36 +00:00
|
|
|
register long __o0 __asm__ ("o0"); \
|
2020-01-28 22:33:01 +00:00
|
|
|
__asm __volatile (string : "=r" (__o0) : \
|
|
|
|
"r" (__g1) : \
|
2002-09-29 11:32:03 +00:00
|
|
|
__SYSCALL_CLOBBERS); \
|
2000-01-31 06:42:36 +00:00
|
|
|
__o0; \
|
|
|
|
})
|
|
|
|
|
2020-01-29 20:38:36 +00:00
|
|
|
#define internal_syscall1(string,name,arg1) \
|
2000-01-31 06:42:36 +00:00
|
|
|
({ \
|
2020-02-10 15:57:28 +00:00
|
|
|
long int _arg1 = (long int) (arg1); \
|
2020-01-28 22:33:01 +00:00
|
|
|
register long int __g1 __asm__("g1") = (name); \
|
2020-02-10 15:57:28 +00:00
|
|
|
register long int __o0 __asm__ ("o0") = _arg1; \
|
2020-01-28 22:33:01 +00:00
|
|
|
__asm __volatile (string : "=r" (__o0) : \
|
|
|
|
"r" (__g1), "0" (__o0) : \
|
2002-09-29 11:32:03 +00:00
|
|
|
__SYSCALL_CLOBBERS); \
|
2000-01-31 06:42:36 +00:00
|
|
|
__o0; \
|
|
|
|
})
|
|
|
|
|
2020-01-29 20:38:36 +00:00
|
|
|
#define internal_syscall2(string,name,arg1,arg2) \
|
2000-01-31 06:42:36 +00:00
|
|
|
({ \
|
2020-02-10 15:57:28 +00:00
|
|
|
long int _arg1 = (long int) (arg1); \
|
|
|
|
long int _arg2 = (long int) (arg2); \
|
2020-01-28 22:33:01 +00:00
|
|
|
register long int __g1 __asm__("g1") = (name); \
|
2020-02-10 15:57:28 +00:00
|
|
|
register long int __o0 __asm__ ("o0") = _arg1; \
|
|
|
|
register long int __o1 __asm__ ("o1") = _arg2; \
|
2020-01-28 22:33:01 +00:00
|
|
|
__asm __volatile (string : "=r" (__o0) : \
|
|
|
|
"r" (__g1), "0" (__o0), "r" (__o1) : \
|
2002-09-29 11:32:03 +00:00
|
|
|
__SYSCALL_CLOBBERS); \
|
2000-01-31 06:42:36 +00:00
|
|
|
__o0; \
|
|
|
|
})
|
|
|
|
|
2020-01-29 20:38:36 +00:00
|
|
|
#define internal_syscall3(string,name,arg1,arg2,arg3) \
|
2000-01-31 06:42:36 +00:00
|
|
|
({ \
|
2020-02-10 15:57:28 +00:00
|
|
|
long int _arg1 = (long int) (arg1); \
|
|
|
|
long int _arg2 = (long int) (arg2); \
|
|
|
|
long int _arg3 = (long int) (arg3); \
|
2020-01-28 22:33:01 +00:00
|
|
|
register long int __g1 __asm__("g1") = (name); \
|
2020-02-10 15:57:28 +00:00
|
|
|
register long int __o0 __asm__ ("o0") = _arg1; \
|
|
|
|
register long int __o1 __asm__ ("o1") = _arg2; \
|
|
|
|
register long int __o2 __asm__ ("o2") = _arg3; \
|
2020-01-28 22:33:01 +00:00
|
|
|
__asm __volatile (string : "=r" (__o0) : \
|
|
|
|
"r" (__g1), "0" (__o0), "r" (__o1), \
|
2002-09-29 11:32:03 +00:00
|
|
|
"r" (__o2) : \
|
|
|
|
__SYSCALL_CLOBBERS); \
|
2000-01-31 06:42:36 +00:00
|
|
|
__o0; \
|
|
|
|
})
|
|
|
|
|
2020-01-29 20:38:36 +00:00
|
|
|
#define internal_syscall4(string,name,arg1,arg2,arg3,arg4) \
|
2000-01-31 06:42:36 +00:00
|
|
|
({ \
|
2020-02-10 15:57:28 +00:00
|
|
|
long int _arg1 = (long int) (arg1); \
|
|
|
|
long int _arg2 = (long int) (arg2); \
|
|
|
|
long int _arg3 = (long int) (arg3); \
|
|
|
|
long int _arg4 = (long int) (arg4); \
|
2020-01-28 22:33:01 +00:00
|
|
|
register long int __g1 __asm__("g1") = (name); \
|
2020-02-10 15:57:28 +00:00
|
|
|
register long int __o0 __asm__ ("o0") = _arg1; \
|
|
|
|
register long int __o1 __asm__ ("o1") = _arg2; \
|
|
|
|
register long int __o2 __asm__ ("o2") = _arg3; \
|
|
|
|
register long int __o3 __asm__ ("o3") = _arg4; \
|
2020-01-28 22:33:01 +00:00
|
|
|
__asm __volatile (string : "=r" (__o0) : \
|
|
|
|
"r" (__g1), "0" (__o0), "r" (__o1), \
|
2002-09-29 11:32:03 +00:00
|
|
|
"r" (__o2), "r" (__o3) : \
|
|
|
|
__SYSCALL_CLOBBERS); \
|
2000-01-31 06:42:36 +00:00
|
|
|
__o0; \
|
|
|
|
})
|
|
|
|
|
2020-01-29 20:38:36 +00:00
|
|
|
#define internal_syscall5(string,name,arg1,arg2,arg3,arg4,arg5) \
|
2000-01-31 06:42:36 +00:00
|
|
|
({ \
|
2020-02-10 15:57:28 +00:00
|
|
|
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); \
|
2020-01-28 22:33:01 +00:00
|
|
|
register long int __g1 __asm__("g1") = (name); \
|
2020-02-10 15:57:28 +00:00
|
|
|
register long int __o0 __asm__ ("o0") = _arg1; \
|
|
|
|
register long int __o1 __asm__ ("o1") = _arg2; \
|
|
|
|
register long int __o2 __asm__ ("o2") = _arg3; \
|
|
|
|
register long int __o3 __asm__ ("o3") = _arg4; \
|
|
|
|
register long int __o4 __asm__ ("o4") = _arg5; \
|
2020-01-28 22:33:01 +00:00
|
|
|
__asm __volatile (string : "=r" (__o0) : \
|
|
|
|
"r" (__g1), "0" (__o0), "r" (__o1), \
|
2002-09-29 11:32:03 +00:00
|
|
|
"r" (__o2), "r" (__o3), "r" (__o4) : \
|
|
|
|
__SYSCALL_CLOBBERS); \
|
2000-01-31 06:42:36 +00:00
|
|
|
__o0; \
|
|
|
|
})
|
|
|
|
|
2020-01-29 20:38:36 +00:00
|
|
|
#define internal_syscall6(string,name,arg1,arg2,arg3,arg4,arg5,arg6) \
|
2000-01-31 06:42:36 +00:00
|
|
|
({ \
|
2020-02-10 15:57:28 +00:00
|
|
|
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); \
|
2020-01-28 22:33:01 +00:00
|
|
|
register long int __g1 __asm__("g1") = (name); \
|
2020-02-10 15:57:28 +00:00
|
|
|
register long int __o0 __asm__ ("o0") = _arg1; \
|
|
|
|
register long int __o1 __asm__ ("o1") = _arg2; \
|
|
|
|
register long int __o2 __asm__ ("o2") = _arg3; \
|
|
|
|
register long int __o3 __asm__ ("o3") = _arg4; \
|
|
|
|
register long int __o4 __asm__ ("o4") = _arg5; \
|
|
|
|
register long int __o5 __asm__ ("o5") = _arg6; \
|
2020-01-28 22:33:01 +00:00
|
|
|
__asm __volatile (string : "=r" (__o0) : \
|
|
|
|
"r" (__g1), "0" (__o0), "r" (__o1), \
|
2002-09-29 11:32:03 +00:00
|
|
|
"r" (__o2), "r" (__o3), "r" (__o4), \
|
|
|
|
"r" (__o5) : \
|
|
|
|
__SYSCALL_CLOBBERS); \
|
2000-01-31 06:42:36 +00:00
|
|
|
__o0; \
|
|
|
|
})
|
|
|
|
|
2003-08-31 18:10:47 +00:00
|
|
|
#define INLINE_CLONE_SYSCALL(arg1,arg2,arg3,arg4,arg5) \
|
|
|
|
({ \
|
2020-02-10 15:57:28 +00:00
|
|
|
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 __o0 __asm__ ("o0") = _arg1; \
|
|
|
|
register long int __o1 __asm__ ("o1") = _arg2; \
|
|
|
|
register long int __o2 __asm__ ("o2") = _arg3; \
|
|
|
|
register long int __o3 __asm__ ("o3") = _arg4; \
|
|
|
|
register long int __o4 __asm__ ("o4") = _arg5; \
|
|
|
|
register long int __g1 __asm__ ("g1") = __NR_clone; \
|
2011-09-01 00:30:41 +00:00
|
|
|
__asm __volatile (__SYSCALL_STRING : \
|
2020-01-28 22:33:01 +00:00
|
|
|
"=r" (__o0), "=r" (__o1) : \
|
|
|
|
"r" (__g1), "0" (__o0), "1" (__o1), \
|
2003-08-31 18:10:47 +00:00
|
|
|
"r" (__o2), "r" (__o3), "r" (__o4) : \
|
|
|
|
__SYSCALL_CLOBBERS); \
|
2020-01-28 22:33:01 +00:00
|
|
|
if (__glibc_unlikely ((unsigned long int) (__o0) > -4096UL)) \
|
2011-09-01 00:30:41 +00:00
|
|
|
{ \
|
2020-01-28 22:33:01 +00:00
|
|
|
__set_errno (-__o0); \
|
2011-09-01 00:30:41 +00:00
|
|
|
__o0 = -1L; \
|
|
|
|
} \
|
|
|
|
else \
|
|
|
|
{ \
|
|
|
|
__o0 &= (__o1 - 1); \
|
|
|
|
} \
|
2003-08-31 18:10:47 +00:00
|
|
|
__o0; \
|
|
|
|
})
|
|
|
|
|
Delete everything under sysdeps/unix/sparc/
* sysdeps/unix/sparc/brk.S: Delete.
* sysdeps/unix/sparc/dl-brk.S: Delete.
* sysdeps/unix/sparc/pipe.S: Delete.
* sysdeps/unix/sparc/sysdep.S: Delete.
* sysdeps/unix/sparc/sysdep.h: Delete.
* sysdeps/unix/sparc/vfork.S: Delete.
* sysdeps/sparc/sysdep.h (SPARC_PIC_THUNK, SPARC_PIC_REG,
SPARC_PIC_REG_LEAF, ENTRY, END, LOC): Define.
* sysdeps/unix/sysv/linux/sparc/sysdep.h (ret, ret_NOERRNO,
ret_ERRVAL, r0, r1, MOVE): Define.
(JUMPTARGET): Remove.
* sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h: Don't include
sysdeps/unix/sparc/sysdep.h
(ENTRY, END): Remove.
* sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h: Likewise.
2012-04-25 18:44:02 +00:00
|
|
|
#endif /* __ASSEMBLER__ */
|
2003-08-31 18:10:47 +00:00
|
|
|
|
2000-01-31 06:42:36 +00:00
|
|
|
#endif /* _LINUX_SPARC_SYSDEP_H */
|