Commit nios2 port to master.

This commit is contained in:
Chung-Lin Tang 2015-01-17 22:29:12 -08:00
parent 026eb207ed
commit 522e6ee3b4
98 changed files with 7681 additions and 0 deletions

104
ChangeLog
View File

@ -1,3 +1,107 @@
2015-01-18 Chung-Lin Tang <cltang@codesourcery.com>
Sandra Loosemore <sandra@codesourcery.com>
Andrew Jenner <andrew@codesourcery.com>
Joseph Myers <joseph@codesourcery.com>
Nathan Sidwell <nathan@codesourcery.com>
* NEWS: Mention new Nios II port.
* sysdeps/nios2/Implies: New file.
* sysdeps/nios2/Makefile: New file.
* sysdeps/nios2/Subdirs: New file.
* sysdeps/nios2/Versions: New file.
* sysdeps/nios2/__longjmp.S: New file.
* sysdeps/nios2/abort-instr.h: New file.
* sysdeps/nios2/backtrace.c: New file.
* sysdeps/nios2/bits/endian.h: New file.
* sysdeps/nios2/bits/fenv.h: New file.
* sysdeps/nios2/bits/link.h: New file.
* sysdeps/nios2/bits/setjmp.h: New file.
* sysdeps/nios2/bsd-_setjmp.S: New file.
* sysdeps/nios2/bsd-setjmp.S: New file.
* sysdeps/nios2/configure: New generated file.
* sysdeps/nios2/configure.ac: New file.
* sysdeps/nios2/crti.S: New file.
* sysdeps/nios2/crtn.S: New file.
* sysdeps/nios2/dl-init.c: New file.
* sysdeps/nios2/dl-machine.h: New file.
* sysdeps/nios2/dl-sysdep.h: New file.
* sysdeps/nios2/dl-tls.h: New file.
* sysdeps/nios2/dl-trampoline.S: New file.
* sysdeps/nios2/gccframe.h: New file.
* sysdeps/nios2/gmp-mparam.h: New file.
* sysdeps/nios2/jmpbuf-offsets.h: New file.
* sysdeps/nios2/jmpbuf-unwind.h: New file.
* sysdeps/nios2/ldsodefs.h: New file.
* sysdeps/nios2/libc-tls.c: New file.
* sysdeps/nios2/libm-test-ulps: New file.
* sysdeps/nios2/machine-gmon.h: New file.
* sysdeps/nios2/math-tests.h: New file.
* sysdeps/nios2/math_private.h: New file.
* sysdeps/nios2/memusage.h: New file.
* sysdeps/nios2/nptl/Makefile: New file.
* sysdeps/nios2/nptl/bits/pthreadtypes.h: New file.
* sysdeps/nios2/nptl/bits/semaphore.h: New file.
* sysdeps/nios2/nptl/pthread_spin_lock.c: New file.
* sysdeps/nios2/nptl/pthreaddef.h: New file.
* sysdeps/nios2/nptl/tcb-offsets.sym: New file.
* sysdeps/nios2/nptl/tls.h: New file.
* sysdeps/nios2/preconfigure: New file.
* sysdeps/nios2/s_fma.c: New file.
* sysdeps/nios2/s_fmaf.c: New file.
* sysdeps/nios2/setjmp.S: New file.
* sysdeps/nios2/sfp-machine.h: New file.
* sysdeps/nios2/sotruss-lib.c: New file.
* sysdeps/nios2/stackguard-macros.h: New file.
* sysdeps/nios2/stackinfo.h: New file.
* sysdeps/nios2/start.S: New file.
* sysdeps/nios2/sysdep.h: New file.
* sysdeps/nios2/tls-macros.h: New file.
* sysdeps/nios2/tst-audit.h: New file.
* sysdeps/unix/sysv/linux/nios2/Implies: New file.
* sysdeps/unix/sysv/linux/nios2/Makefile: New file.
* sysdeps/unix/sysv/linux/nios2/Versions: New file.
* sysdeps/unix/sysv/linux/nios2/arch-fork.h: New file.
* sysdeps/unix/sysv/linux/nios2/bits/atomic.h: New file.
* sysdeps/unix/sysv/linux/nios2/bits/mman.h: New file.
* sysdeps/unix/sysv/linux/nios2/cacheflush.c: New file.
* sysdeps/unix/sysv/linux/nios2/clone.S: New file.
* sysdeps/unix/sysv/linux/nios2/configure: New generated file.
* sysdeps/unix/sysv/linux/nios2/configure.ac: New file.
* sysdeps/unix/sysv/linux/nios2/getcontext.S: New file.
* sysdeps/unix/sysv/linux/nios2/kernel-features.h: New file.
* sysdeps/unix/sysv/linux/nios2/kernel_rt_sigframe.h: New file.
* sysdeps/unix/sysv/linux/nios2/makecontext.c: New file.
* sysdeps/unix/sysv/linux/nios2/profil-counter.h: New file.
* sysdeps/unix/sysv/linux/nios2/setcontext.S: New file.
* sysdeps/unix/sysv/linux/nios2/shlib-versions: New file.
* sysdeps/unix/sysv/linux/nios2/sigcontextinfo.h: New file.
* sysdeps/unix/sysv/linux/nios2/swapcontext.S: New file.
* sysdeps/unix/sysv/linux/nios2/sys/cachectl.h: New file.
* sysdeps/unix/sysv/linux/nios2/sys/procfs.h: New file.
* sysdeps/unix/sysv/linux/nios2/sys/ucontext.h: New file.
* sysdeps/unix/sysv/linux/nios2/sys/user.h: New file.
* sysdeps/unix/sysv/linux/nios2/syscall.S: New file.
* sysdeps/unix/sysv/linux/nios2/sysdep-cancel.h: New file.
* sysdeps/unix/sysv/linux/nios2/sysdep.S: New file.
* sysdeps/unix/sysv/linux/nios2/sysdep.h: New file.
* sysdeps/unix/sysv/linux/nios2/ucontext_i.sym: New file.
* sysdeps/unix/sysv/linux/nios2/vfork.S: New file.
* sysdeps/unix/sysv/linux/nios2/c++-types.data: New file.
* sysdeps/unix/sysv/linux/nios2/ld.abilist: New file.
* sysdeps/unix/sysv/linux/nios2/libBrokenLocale.abilist: New file.
* sysdeps/unix/sysv/linux/nios2/libanl.abilist: New file.
* sysdeps/unix/sysv/linux/nios2/libc.abilist: New file.
* sysdeps/unix/sysv/linux/nios2/libcrypt.abilist: New file.
* sysdeps/unix/sysv/linux/nios2/libdl.abilist: New file.
* sysdeps/unix/sysv/linux/nios2/libm.abilist: New file.
* sysdeps/unix/sysv/linux/nios2/libnsl.abilist: New file.
* sysdeps/unix/sysv/linux/nios2/libpthread.abilist: New file.
* sysdeps/unix/sysv/linux/nios2/libresolv.abilist: New file.
* sysdeps/unix/sysv/linux/nios2/librt.abilist: New file.
* sysdeps/unix/sysv/linux/nios2/libthread_db.abilist: New file.
* sysdeps/unix/sysv/linux/nios2/libutil.abilist: New file.
* sysdeps/unix/sysv/linux/nios2/localplt.data: New file.
2015-01-16 Stefan Liebler <stli@linux.vnet.ibm.com>
[BZ #17844]

2
NEWS
View File

@ -19,6 +19,8 @@ Version 2.21
17744, 17745, 17746, 17747, 17748, 17775, 17777, 17780, 17781, 17782,
17791, 17793, 17796, 17797, 17803, 17806, 17834, 17844, 17848
* Port to Altera Nios II has been contributed by Mentor Graphics.
* Optimized strcpy, stpcpy, strncpy, stpncpy, strcmp, and strncmp
implementations for powerpc64/powerpc64le.
Implemented by Adhemerval Zanella (IBM).

3
sysdeps/nios2/Implies Normal file
View File

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

35
sysdeps/nios2/Makefile Normal file
View File

@ -0,0 +1,35 @@
# Copyright (C) 1993-2015 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 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.
# 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
# Lesser General Public License for more details.
# You should have received a copy of the GNU Lesser General Public
# License along with the GNU C Library. If not, see
# <http://www.gnu.org/licenses/>.
pic-ccflag = -fpic
# We don't support long doubles as a distinct type. We don't need to set
# this variable; it's here mostly for documentational purposes.
long-double-fcts = no
ifeq ($(subdir),soft-fp)
sysdep_routines += $(filter-out sqrtsf2,$(gcc-single-routines)) \
$(filter-out sqrtdf2,$(gcc-double-routines))
endif
ifeq ($(subdir),csu)
gen-as-const-headers += tcb-offsets.sym
endif
ifeq ($(subdir),debug)
CFLAGS-backtrace.c += -funwind-tables
endif

1
sysdeps/nios2/Subdirs Normal file
View File

@ -0,0 +1 @@
soft-fp

12
sysdeps/nios2/Versions Normal file
View File

@ -0,0 +1,12 @@
libc {
GLIBC_2.21 {
__adddf3; __addsf3; __divdf3; __divsf3; __eqdf2; __eqsf2; __extendsfdf2;
__fixdfdi; __fixdfsi; __fixsfdi; __fixsfsi;
__fixunsdfdi; __fixunsdfsi; __fixunssfdi; __fixunssfsi;
__floatdidf; __floatdisf; __floatsidf; __floatsisf;
__floatundidf; __floatundisf; __floatunsidf; __floatunsisf;
__gedf2; __gesf2; __gtdf2; __gtsf2; __ledf2; __lesf2; __ltdf2; __ltsf2;
__muldf3; __mulsf3; __nedf2; __nesf2; __negdf2; __negsf2;
__subdf3; __subsf3; __truncdfsf2; __unorddf2; __unordsf2;
}
}

80
sysdeps/nios2/__longjmp.S Normal file
View File

@ -0,0 +1,80 @@
/* longjmp for Nios II.
Copyright (C) 2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library. If not, see
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
#include <jmpbuf-offsets.h>
/* __longjmp(jmpbuf, val) */
ENTRY (__longjmp)
mov r2, r5
bne r5, zero, 1f
movi r2, 1
1:
#ifdef PTR_DEMANGLE
PTR_MANGLE_GUARD (r3)
ldw r5, (JB_RA*4)(r4)
ldw r6, (JB_SP*4)(r4)
PTR_DEMANGLE (r5, r5, r3)
PTR_DEMANGLE (r6, r6, r3)
#endif
cfi_def_cfa (r4, 0)
cfi_offset (r16, JB_R16*4)
cfi_offset (r17, JB_R17*4)
cfi_offset (r18, JB_R18*4)
cfi_offset (r19, JB_R19*4)
cfi_offset (r20, JB_R20*4)
cfi_offset (r21, JB_R21*4)
cfi_offset (r22, JB_R22*4)
cfi_offset (fp, JB_FP*4)
#ifdef PTR_DEMANGLE
cfi_register (ra, r5)
cfi_register (sp, r7)
#else
cfi_offset (ra, JB_RA*4)
cfi_offset (sp, JB_SP*4)
#endif
ldw r16, (JB_R16*4)(r4)
ldw r17, (JB_R17*4)(r4)
ldw r18, (JB_R18*4)(r4)
ldw r19, (JB_R19*4)(r4)
ldw r20, (JB_R20*4)(r4)
ldw r21, (JB_R21*4)(r4)
ldw r22, (JB_R22*4)(r4)
ldw fp, (JB_FP*4)(r4)
#ifdef PTR_DEMANGLE
mov ra, r5
mov sp, r6
#else
ldw ra, (JB_RA*4)(r4)
ldw sp, (JB_SP*4)(r4)
#endif
cfi_same_value (r16)
cfi_same_value (r17)
cfi_same_value (r18)
cfi_same_value (r19)
cfi_same_value (r20)
cfi_same_value (r21)
cfi_same_value (r22)
cfi_same_value (fp)
cfi_same_value (ra)
cfi_same_value (sp)
ret
END (__longjmp)

View File

@ -0,0 +1,2 @@
/* An instruction which should crash any program is an unused trap. */
#define ABORT_INSTRUCTION asm ("trap 31")

View File

@ -0,0 +1 @@
#include <sysdeps/x86_64/backtrace.c>

View File

@ -0,0 +1,12 @@
/* The Nios II architecture has selectable endianness. */
#ifndef _ENDIAN_H
# error "Never use <bits/endian.h> directly; include <endian.h> instead."
#endif
#ifdef __nios2_big_endian__
# define __BYTE_ORDER __BIG_ENDIAN
#endif
#ifdef __nios2_little_endian__
# define __BYTE_ORDER __LITTLE_ENDIAN
#endif

44
sysdeps/nios2/bits/fenv.h Normal file
View File

@ -0,0 +1,44 @@
/* Copyright (C) 2012-2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library. If not, see
<http://www.gnu.org/licenses/>. */
#ifndef _FENV_H
# error "Never use <bits/fenv.h> directly; include <fenv.h> instead."
#endif
/* The Altera specified Nios II hardware FPU does not support exceptions,
nor does the software floating-point support. */
#define FE_ALL_EXCEPT 0
/* Nios II supports only round-to-nearest. The software
floating-point support also acts this way. */
enum
{
__FE_UNDEFINED = 0,
FE_TONEAREST =
#define FE_TONEAREST 1
FE_TONEAREST,
};
/* Type representing exception flags. */
typedef unsigned int fexcept_t;
/* Type representing floating-point environment. */
typedef unsigned int fenv_t;
/* If the default argument is used we use this value. */
#define FE_DFL_ENV ((const fenv_t *) -1)

54
sysdeps/nios2/bits/link.h Normal file
View File

@ -0,0 +1,54 @@
/* Machine-specific declarations for dynamic linker interface, Nios II version.
Copyright (C) 2009-2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library. If not, see
<http://www.gnu.org/licenses/>. */
#ifndef _LINK_H
# error "Never include <bits/link.h> directly; use <link.h> instead."
#endif
/* Registers for entry into PLT on Nios II. */
typedef struct La_nios2_regs
{
uint32_t lr_reg[4]; /* r4 through r7 */
uint32_t lr_ra;
uint32_t lr_sp;
} La_nios2_regs;
/* Return values for calls from PLT on Nios II. */
typedef struct La_nios2_retval
{
uint32_t lrv_r2;
uint32_t lrv_r3;
} La_nios2_retval;
__BEGIN_DECLS
extern Elf32_Addr la_nios2_gnu_pltenter (Elf32_Sym *__sym, unsigned int __ndx,
uintptr_t *__refcook,
uintptr_t *__defcook,
La_nios2_regs *__regs,
unsigned int *__flags,
const char *__symname,
long int *__framesizep);
extern unsigned int la_nios2_gnu_pltexit (Elf32_Sym *__sym, unsigned int __ndx,
uintptr_t *__refcook,
uintptr_t *__defcook,
const La_nios2_regs *__inregs,
La_nios2_retval *__outregs,
const char *symname);
__END_DECLS

View File

@ -0,0 +1,30 @@
/* Define the machine-dependent type `jmp_buf'. Nios II version.
Copyright (C) 1992-2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library. If not, see
<http://www.gnu.org/licenses/>. */
#ifndef _NIOS2_BITS_SETJMP_H
#define _NIOS2_BITS_SETJMP_H 1
#if !defined(_SETJMP_H) && !defined(_PTHREAD_H)
# error "Never include <bits/setjmp.h> directly; use <setjmp.h> instead."
#endif
/* Saves r16-r22 (callee-saved, including GOT pointer), fp (frame pointer),
ra (return address), and sp (stack pointer). */
typedef int __jmp_buf[10];
#endif /* _NIOS2_BITS_SETJMP_H */

View File

@ -0,0 +1 @@
/* _setjmp is in setjmp.S */

View File

@ -0,0 +1 @@
/* setjmp is in setjmp.S */

162
sysdeps/nios2/configure vendored Normal file
View File

@ -0,0 +1,162 @@
# This file is generated from configure.ac by Autoconf. DO NOT EDIT!
# Local configure fragment for sysdeps/nios2.
# Nios II big endian is not yet supported.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
if ${ac_cv_path_GREP+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -z "$GREP"; then
ac_path_GREP_found=false
# Loop through the user's path and test for each of PROGNAME-LIST
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_prog in grep ggrep; do
for ac_exec_ext in '' $ac_executable_extensions; do
ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
{ test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
# Check for GNU ac_path_GREP and select it if it is found.
# Check for GNU $ac_path_GREP
case `"$ac_path_GREP" --version 2>&1` in
*GNU*)
ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
*)
ac_count=0
$as_echo_n 0123456789 >"conftest.in"
while :
do
cat "conftest.in" "conftest.in" >"conftest.tmp"
mv "conftest.tmp" "conftest.in"
cp "conftest.in" "conftest.nl"
$as_echo 'GREP' >> "conftest.nl"
"$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
as_fn_arith $ac_count + 1 && ac_count=$as_val
if test $ac_count -gt ${ac_path_GREP_max-0}; then
# Best one so far, save it but keep looking for a better one
ac_cv_path_GREP="$ac_path_GREP"
ac_path_GREP_max=$ac_count
fi
# 10*(2^10) chars as input seems more than enough
test $ac_count -gt 10 && break
done
rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
esac
$ac_path_GREP_found && break 3
done
done
done
IFS=$as_save_IFS
if test -z "$ac_cv_path_GREP"; then
as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
fi
else
ac_cv_path_GREP=$GREP
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
$as_echo "$ac_cv_path_GREP" >&6; }
GREP="$ac_cv_path_GREP"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
$as_echo_n "checking for egrep... " >&6; }
if ${ac_cv_path_EGREP+:} false; then :
$as_echo_n "(cached) " >&6
else
if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
then ac_cv_path_EGREP="$GREP -E"
else
if test -z "$EGREP"; then
ac_path_EGREP_found=false
# Loop through the user's path and test for each of PROGNAME-LIST
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_prog in egrep; do
for ac_exec_ext in '' $ac_executable_extensions; do
ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
{ test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
# Check for GNU ac_path_EGREP and select it if it is found.
# Check for GNU $ac_path_EGREP
case `"$ac_path_EGREP" --version 2>&1` in
*GNU*)
ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
*)
ac_count=0
$as_echo_n 0123456789 >"conftest.in"
while :
do
cat "conftest.in" "conftest.in" >"conftest.tmp"
mv "conftest.tmp" "conftest.in"
cp "conftest.in" "conftest.nl"
$as_echo 'EGREP' >> "conftest.nl"
"$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
as_fn_arith $ac_count + 1 && ac_count=$as_val
if test $ac_count -gt ${ac_path_EGREP_max-0}; then
# Best one so far, save it but keep looking for a better one
ac_cv_path_EGREP="$ac_path_EGREP"
ac_path_EGREP_max=$ac_count
fi
# 10*(2^10) chars as input seems more than enough
test $ac_count -gt 10 && break
done
rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
esac
$ac_path_EGREP_found && break 3
done
done
done
IFS=$as_save_IFS
if test -z "$ac_cv_path_EGREP"; then
as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
fi
else
ac_cv_path_EGREP=$EGREP
fi
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
$as_echo "$ac_cv_path_EGREP" >&6; }
EGREP="$ac_cv_path_EGREP"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for big endian" >&5
$as_echo_n "checking for big endian... " >&6; }
if ${libc_cv_nios2_be+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#ifdef __nios2_big_endian__
yes
#endif
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
$EGREP "yes" >/dev/null 2>&1; then :
libc_cv_nios2_be=yes
else
libc_cv_nios2_be=no
fi
rm -f conftest*
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_nios2_be" >&5
$as_echo "$libc_cv_nios2_be" >&6; }
if test $libc_cv_nios2_be = yes; then
as_fn_error $? "Big endian not supported for Nios II" "$LINENO" 5
fi

View File

@ -0,0 +1,13 @@
GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
# Local configure fragment for sysdeps/nios2.
# Nios II big endian is not yet supported.
AC_CACHE_CHECK([for big endian],
[libc_cv_nios2_be],
[AC_EGREP_CPP(yes,[#ifdef __nios2_big_endian__
yes
#endif
], libc_cv_nios2_be=yes, libc_cv_nios2_be=no)])
if test $libc_cv_nios2_be = yes; then
AC_MSG_ERROR([Big endian not supported for Nios II])
fi

96
sysdeps/nios2/crti.S Normal file
View File

@ -0,0 +1,96 @@
/* Special .init and .fini section support for Nios II.
Copyright (C) 2012-2015 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 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.
In addition to the permissions in the GNU Lesser 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 GNU Lesser 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.)
Note that people who make modified versions of this file are not
obligated to grant this special exception for their modified
versions; it is their choice whether to do so. The GNU Lesser
General Public License gives permission to release a modified
version without this exception; this exception also makes it
possible to release a modified version which carries forward this
exception.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library. If not, see
<http://www.gnu.org/licenses/>. */
/* 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. The symbols _init and _fini are
magic and cause the linker to emit DT_INIT and DT_FINI. */
#include <libc-symbols.h>
#ifndef PREINIT_FUNCTION
# define PREINIT_FUNCTION __gmon_start__
#endif
#ifndef PREINIT_FUNCTION_WEAK
# define PREINIT_FUNCTION_WEAK 1
#endif
#if PREINIT_FUNCTION_WEAK
weak_extern (PREINIT_FUNCTION)
#else
.hidden PREINIT_FUNCTION
#endif
.section .init,"ax",@progbits
.align 2
.global _init
.type _init, @function
_init:
addi sp, sp, -8
stw r22, 0(sp)
nextpc r22
1:
movhi r8, %hiadj(_gp_got - 1b)
addi r8, r8, %lo(_gp_got - 1b)
add r22, r22, r8
stw ra, 4(sp)
#if PREINIT_FUNCTION_WEAK
movhi r2, %got_hiadj(PREINIT_FUNCTION)
addi r2, r2, %got_lo(PREINIT_FUNCTION)
add r2, r2, r22
ldw r2, 0(r2)
beq r2, zero, .L5
#endif
movhi r2, %call_hiadj(PREINIT_FUNCTION)
addi r2, r2, %call_lo(PREINIT_FUNCTION)
add r2, r2, r22
ldw r2, 0(r2)
callr r2
.L5:
.section .fini,"ax",@progbits
.align 2
.global _fini
.type _fini, @function
_fini:
addi sp, sp, -8
stw r22, 0(sp)
nextpc r22
1:
movhi r8, %hiadj(_gp_got - 1b)
addi r8, r8, %lo(_gp_got - 1b)
stw ra, 4(sp)
add r22, r22, r8

49
sysdeps/nios2/crtn.S Normal file
View File

@ -0,0 +1,49 @@
/* Special .init and .fini section support for Nios II.
Copyright (C) 2012-2015 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 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.
In addition to the permissions in the GNU Lesser 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 GNU Lesser 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.)
Note that people who make modified versions of this file are not
obligated to grant this special exception for their modified
versions; it is their choice whether to do so. The GNU Lesser
General Public License gives permission to release a modified
version without this exception; this exception also makes it
possible to release a modified version which carries forward this
exception.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library. If not, see
<http://www.gnu.org/licenses/>. */
/* crtn.S puts function epilogues in the .init and .fini sections
corresponding to the prologues in crti.S. */
.section .init,"ax",@progbits
ldw ra, 4(sp)
ldw r22, 0(sp)
addi sp, sp, 8
ret
.section .fini,"ax",@progbits
ldw ra, 4(sp)
ldw r22, 0(sp)
addi sp, sp, 8
ret

30
sysdeps/nios2/dl-init.c Normal file
View File

@ -0,0 +1,30 @@
/* Nios II specific procedures for initializing code.
Copyright (C) 2008-2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library. If not, see
<http://www.gnu.org/licenses/>. */
#include <elf/dl-init.c>
unsigned int
internal_function
_dl_nios2_get_gp_value (struct link_map *main_map)
{
ElfW(Dyn) *dyn = main_map->l_ld;
for (dyn = main_map->l_ld; dyn->d_tag != DT_NULL; ++dyn)
if (dyn->d_tag == DT_NIOS2_GP)
return (unsigned int)(dyn->d_un.d_ptr);
return 0;
}

335
sysdeps/nios2/dl-machine.h Normal file
View File

@ -0,0 +1,335 @@
/* Machine-dependent ELF dynamic relocation inline functions. Nios II version.
Copyright (C) 1995-2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library. If not, see
<http://www.gnu.org/licenses/>. */
#ifndef dl_machine_h
#define dl_machine_h
#define ELF_MACHINE_NAME "nios2"
#include <string.h>
#include <link.h>
#include <dl-tls.h>
/* Return nonzero iff ELF header is compatible with the running host. */
static inline int
elf_machine_matches_host (const Elf32_Ehdr *ehdr)
{
return ehdr->e_machine == EM_ALTERA_NIOS2;
}
/* Return the link-time address of _DYNAMIC. Conveniently, this is the
first element of the GOT. */
static inline Elf32_Addr
elf_machine_dynamic (void)
{
Elf32_Addr *dynamic;
int tmp;
asm ("nextpc\t%0\n\t"
"1: movhi\t%1, %%hiadj(_GLOBAL_OFFSET_TABLE_ - 1b)\n\t"
"addi\t%1, %1, %%lo(_GLOBAL_OFFSET_TABLE_ - 1b)\n\t"
"add\t%0, %0, %1\n"
: "=r" (dynamic), "=r" (tmp));
return *dynamic;
}
/* Return the run-time load address of the shared object. */
static inline Elf32_Addr
elf_machine_load_address (void)
{
Elf32_Addr result;
int tmp;
asm ("nextpc\t%0\n\t"
"1: movhi\t%1, %%hiadj(1b)\n\t"
"addi\t%1, %1, %%lo(1b)\n\t"
"sub\t%0, %0, %1\n"
: "=r" (result), "=r" (tmp));
return result;
}
/* 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__ ((always_inline))
elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
{
extern void _dl_runtime_resolve (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 r15 with
an offset into the .got section, load r14 with
_GLOBAL_OFFSET_TABLE_[1], and then jump to _GLOBAL_OFFSET_TABLE[2].
*/
Elf32_Addr *got = (Elf32_Addr *) D_PTR (l, l_info[DT_PLTGOT]);
got[1] = (Elf32_Addr) l; /* Identify this shared object. */
/* 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;
}
/* 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\
.type _start, %function\n\
_start:\n\
/* At start time, all the args are on the stack. */\n\
mov r4, sp\n\
\n\
/* Start the calculation of the GOT pointer. */\n\
nextpc r22\n\
1: movhi r8, %hiadj(_gp_got - 1b)\n\
addi r8, r8, %lo(_gp_got - 1b)\n\
\n\
/* Figure out where _dl_start will need to return to. */\n\
movhi ra, %hiadj(2f - 1b)\n\
addi ra, ra, %lo(2f - 1b)\n\
add ra, ra, r22\n\
\n\
/* Finish the calculation of the GOT pointer. */\n\
add r22, r22, r8\n\
\n\
br _dl_start\n\
\n\
/* Save the returned user entry point. */\n\
2: mov r16, r2\n\
\n\
/* Initialize gp. */\n\
ldw r4, %got(_rtld_local)(r22)\n\
ldw r4, 0(r4)\n\
ldw r8, %call(_dl_nios2_get_gp_value)(r22)\n\
callr r8\n\
mov gp, r2\n\
\n\
/* Find the number of arguments to skip. */\n\
ldw r8, %got(_dl_skip_args)(r22)\n\
ldw r8, 0(r8)\n\
\n\
/* Find the main_map from the GOT. */\n\
ldw r4, %got(_rtld_local)(r22)\n\
ldw r4, 0(r4)\n\
\n\
/* Find argc. */\n\
ldw r5, 0(sp)\n\
sub r5, r5, r8\n\
stw r5, 0(sp)\n\
\n\
/* Find the first unskipped argument. */\n\
slli r8, r8, 2\n\
addi r6, sp, 4\n\
add r9, r6, r8\n\
mov r10, r6\n\
\n\
/* Shuffle argv down. */\n\
3: ldw r11, 0(r9)\n\
stw r11, 0(r10)\n\
addi r9, r9, 4\n\
addi r10, r10, 4\n\
bne r11, zero, 3b\n\
\n\
/* Shuffle envp down. */\n\
mov r7, r10\n\
4: ldw r11, 0(r9)\n\
stw r11, 0(r10)\n\
addi r9, r9, 4\n\
addi r10, r10, 4\n\
bne r11, zero, 4b\n\
\n\
/* Shuffle auxv down. */\n\
5: ldw r11, 4(r9)\n\
stw r11, 4(r10)\n\
ldw r11, 0(r9)\n\
stw r11, 0(r10)\n\
addi r9, r9, 8\n\
addi r10, r10, 8\n\
bne r11, zero, 5b\n\
\n\
/* Update _dl_argv. */\n\
ldw r2, %got(_dl_argv)(r22)\n\
stw r6, 0(r2)\n\
\n\
/* Call _dl_init through the PLT. */\n\
ldw r8, %call(_dl_init)(r22)\n\
callr r8\n\
\n\
/* Find the finalization function. */\n\
ldw r4, %got(_dl_fini)(r22)\n\
\n\
/* Jump to the user's entry point. */\n\
jmp r16\n\
");
/* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry, so
PLT entries should not be allowed to define the value.
ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one
of the main executable's symbols, as for a COPY reloc. */
#define elf_machine_type_class(type) \
((((type) == R_NIOS2_JUMP_SLOT \
|| (type) == R_NIOS2_TLS_DTPMOD \
|| (type) == R_NIOS2_TLS_DTPREL \
|| (type) == R_NIOS2_TLS_TPREL) * ELF_RTYPE_CLASS_PLT) \
| (((type) == R_NIOS2_COPY) * ELF_RTYPE_CLASS_COPY))
/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */
#define ELF_MACHINE_JMP_SLOT R_NIOS2_JUMP_SLOT
/* The Nios II never uses Elf32_Rel relocations. */
#define ELF_MACHINE_NO_REL 1
#define ELF_MACHINE_NO_RELA 0
/* Fixup a PLT entry to bounce directly to the function at VALUE. */
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;
}
/* Names of the architecture-specific auditing callback functions. */
#define ARCH_LA_PLTENTER nios2_gnu_pltenter
#define ARCH_LA_PLTEXIT nios2_gnu_pltexit
#endif /* dl_machine_h */
#ifdef RESOLVE_MAP
/* Perform the relocation specified by RELOC and SYM (which is fully resolved).
LOADADDR is the load address of the object; INFO is an array indexed
by DT_* of the .dynamic section info. */
auto inline void __attribute__ ((always_inline))
elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc,
const ElfW(Sym) *sym, const struct r_found_version *version,
void *const reloc_addr_arg, int skip_ifunc)
{
Elf32_Addr *const reloc_addr = reloc_addr_arg;
const unsigned int r_type = ELF32_R_TYPE (reloc->r_info);
if (__glibc_unlikely (r_type == R_NIOS2_RELATIVE))
*reloc_addr = map->l_addr + reloc->r_addend;
else if (__glibc_unlikely (r_type == R_NIOS2_NONE))
return;
else
{
const Elf32_Sym *const refsym = sym;
struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type);
Elf32_Addr value = sym == NULL ? 0 : sym_map->l_addr + sym->st_value;
switch (r_type)
{
case R_NIOS2_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 && GLRO(dl_verbose)))
{
const char *strtab;
strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
_dl_error_printf ("\
%s: Symbol `%s' has different size in shared object, consider re-linking\n",
rtld_progname ?: "<program name unknown>",
strtab + refsym->st_name);
}
memcpy (reloc_addr_arg, (void *) value,
MIN (sym->st_size, refsym->st_size));
break;
case R_NIOS2_GLOB_DAT:
case R_NIOS2_JUMP_SLOT:
# ifdef RTLD_BOOTSTRAP
/* Fix weak undefined references. */
if (sym != NULL && sym->st_value == 0)
*reloc_addr = 0;
else
# endif
*reloc_addr = value;
break;
#ifndef RTLD_BOOTSTRAP
case R_NIOS2_TLS_DTPMOD:
/* Get the information from the link map returned by the
resolv function. */
if (sym_map != NULL)
*reloc_addr = sym_map->l_tls_modid;
break;
case R_NIOS2_TLS_DTPREL:
*reloc_addr = reloc->r_addend + TLS_DTPREL_VALUE(sym);
break;
case R_NIOS2_TLS_TPREL:
if (sym != NULL)
{
CHECK_STATIC_TLS (map, sym_map);
*reloc_addr = reloc->r_addend + TLS_TPREL_VALUE(sym_map, sym);
}
break;
#endif
case R_NIOS2_BFD_RELOC_32:
*reloc_addr = value + reloc->r_addend;
break;
default:
_dl_reloc_bad_type (map, r_type, 0);
break;
}
}
}
auto inline void __attribute__((always_inline))
elf_machine_rela_relative (ElfW(Addr) l_addr, const ElfW(Rela) *reloc,
void *const reloc_addr_arg)
{
Elf32_Addr *const reloc_addr = reloc_addr_arg;
*reloc_addr = l_addr + reloc->r_addend;
}
auto inline void __attribute__((always_inline))
elf_machine_lazy_rel (struct link_map *map,
ElfW(Addr) l_addr, const ElfW(Rela) *reloc,
int skip_ifunc)
{
Elf32_Addr *const reloc_addr = (void *) (l_addr + reloc->r_offset);
if (ELF32_R_TYPE (reloc->r_info) == R_NIOS2_JUMP_SLOT)
*reloc_addr += l_addr;
else
_dl_reloc_bad_type (map, ELF32_R_TYPE (reloc->r_info), 1);
}
#endif /* RESOLVE_MAP */

23
sysdeps/nios2/dl-sysdep.h Normal file
View File

@ -0,0 +1,23 @@
/* System-specific settings for dynamic linker code. Nios II version.
Copyright (C) 2009-2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library. If not, see
<http://www.gnu.org/licenses/>. */
#include_next <dl-sysdep.h>
/* _dl_argv cannot be attribute_relro, because _dl_start_user
might write into it after _dl_start returns. */
#define DL_ARGV_NOT_RELRO 1

48
sysdeps/nios2/dl-tls.h Normal file
View File

@ -0,0 +1,48 @@
/* Thread-local storage handling in the ELF dynamic linker. Nios II version.
Copyright (C) 2012-2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library. If not, see
<http://www.gnu.org/licenses/>. */
/* Type used for the representation of TLS information in the GOT. */
typedef struct
{
unsigned long int ti_module;
unsigned long int ti_offset;
} tls_index;
/* The thread pointer points 0x7000 past the first static TLS block. */
#define TLS_TP_OFFSET 0x7000
/* Dynamic thread vector pointers point 0x8000 past the start of each
TLS block. */
#define TLS_DTV_OFFSET 0x8000
/* Compute the value for a GOTTPREL reloc. */
#define TLS_TPREL_VALUE(sym_map, sym) \
((sym_map)->l_tls_offset + (sym)->st_value - TLS_TP_OFFSET)
/* Compute the value for a DTPREL reloc. */
#define TLS_DTPREL_VALUE(sym) \
((sym)->st_value - TLS_DTV_OFFSET)
extern void *__tls_get_addr (tls_index *ti);
# define GET_ADDR_OFFSET (ti->ti_offset + TLS_DTV_OFFSET)
# define __TLS_GET_ADDR(__ti) (__tls_get_addr (__ti) - TLS_DTV_OFFSET)
/* Value used for dtv entries for which the allocation is delayed. */
#define TLS_DTV_UNALLOCATED ((void *) -1l)

View File

@ -0,0 +1,79 @@
/* PLT trampolines. Nios II version.
Copyright (C) 2005-2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library. If not, see
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
#include <libc-symbols.h>
.text
.globl _dl_runtime_resolve
cfi_startproc
_dl_runtime_resolve:
/* The runtime resolver receives the original function arguments in r4
through r7, the shared library identifier from GOT[1]? in r14, and the
relocation index times four in r15. It updates the corresponding PLT GOT
entry so that the PLT entry will transfer control directly to the target
in the future, and then transfers control to the target. */
/* Save arguments and return address. */
subi sp, sp, 28
cfi_adjust_cfa_offset (28)
stw r22, 24(sp)
cfi_rel_offset (r22, 24)
stw r8, 20(sp) /* save r8, because this might be a call to mcount */
cfi_rel_offset (r8, 20)
stw r7, 16(sp)
cfi_rel_offset (r7, 16)
stw r6, 12(sp)
cfi_rel_offset (r6, 12)
stw r5, 8(sp)
cfi_rel_offset (r5, 8)
stw r4, 4(sp)
cfi_rel_offset (r4, 4)
stw ra, 0(sp)
cfi_rel_offset (ra, 0)
/* Get pointer to linker struct. */
mov r4, r14
/* Get the relocation offset. We're given a multiple of 4 and
need a multiple of 12, so multiply by 3. */
slli r5, r15, 1
add r5, r5, r15
/* Call the fixup routine. */
nextpc r22
1: movhi r2, %hiadj(_gp_got - 1b)
addi r2, r2, %lo(_gp_got - 1b)
add r22, r22, r2
ldw r2, %call(_dl_fixup)(r22)
callr r2
/* Restore the arguments and return address. */
ldw ra, 0(sp)
ldw r4, 4(sp)
ldw r5, 8(sp)
ldw r6, 12(sp)
ldw r7, 16(sp)
ldw r8, 20(sp)
ldw r22, 24(sp)
addi sp, sp, 28
cfi_adjust_cfa_offset (-28)
/* Jump to the newly found address. */
jmp r2
cfi_endproc

21
sysdeps/nios2/gccframe.h Normal file
View File

@ -0,0 +1,21 @@
/* Definition of object in frame unwind info. Nios II version.
Copyright (C) 2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library. If not, see
<http://www.gnu.org/licenses/>. */
#define FIRST_PSEUDO_REGISTER 40
#include <sysdeps/generic/gccframe.h>

View File

@ -0,0 +1,23 @@
/* gmp-mparam.h -- Compiler/machine parameter header file.
Copyright (C) 2015 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 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.
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 Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public License
along with the GNU MP Library; see the file COPYING.LIB. If not, see
<http://www.gnu.org/licenses/>. */
#include <sysdeps/generic/gmp-mparam.h>
#define IEEE_DOUBLE_BIG_ENDIAN 0

View File

@ -0,0 +1,48 @@
/* Private macros for accessing __jmp_buf contents. Nios II version.
Copyright (C) 2006-2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library. If not, see
<http://www.gnu.org/licenses/>. */
/* Save offsets within __jmp_buf. */
#define JB_R16 0
#define JB_R17 1
#define JB_R18 2
#define JB_R19 3
#define JB_R20 4
#define JB_R21 5
#define JB_R22 6
#define JB_FP 7
#define JB_RA 8
#define JB_SP 9
#ifndef __ASSEMBLER__
#include <setjmp.h>
#include <stdint.h>
#include <sysdep.h>
static inline uintptr_t __attribute__ ((unused))
_jmpbuf_sp (__jmp_buf jmpbuf)
{
uintptr_t sp = jmpbuf[JB_SP];
#ifdef PTR_DEMANGLE
PTR_DEMANGLE (sp);
#endif
return sp;
}
#endif
/* Helper for generic ____longjmp_chk(). */
#define JB_FRAME_ADDRESS(buf) ((void *) _jmpbuf_sp (buf))

View File

@ -0,0 +1,37 @@
/* Examine __jmp_buf for unwinding frames. Nios II version.
Copyright (C) 2005-2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library. If not, see
<http://www.gnu.org/licenses/>. */
#include <setjmp.h>
#include <jmpbuf-offsets.h>
#include <stdint.h>
#include <unwind.h>
/* Test if longjmp to JMPBUF would unwind the frame
containing a local variable at ADDRESS. */
#define _JMPBUF_UNWINDS(jmpbuf, address, demangle) \
((void *) (address) < (void *) demangle (jmpbuf[JB_SP]))
#define _JMPBUF_CFA_UNWINDS_ADJ(_jmpbuf, _context, _adj) \
_JMPBUF_UNWINDS_ADJ (_jmpbuf, (void *) _Unwind_GetCFA (_context), _adj)
#define _JMPBUF_UNWINDS_ADJ(_jmpbuf, _address, _adj) \
((uintptr_t) (_address) - (_adj) < (uintptr_t) (_jmpbuf_sp (_jmpbuf) - (_adj)))
/* We use the normal longjmp for unwinding. */
#define __libc_unwind_longjmp(buf, val) __libc_longjmp (buf, val)

43
sysdeps/nios2/ldsodefs.h Normal file
View File

@ -0,0 +1,43 @@
/* Run-time dynamic linker data structures for loaded ELF shared objects.
Copyright (C) 2000-2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library. If not, see
<http://www.gnu.org/licenses/>. */
#ifndef _NIOS2_LDSODEFS_H
#define _NIOS2_LDSODEFS_H 1
#include <elf.h>
struct La_nios2_regs;
struct La_nios2_retval;
#define ARCH_PLTENTER_MEMBERS \
ElfW(Addr) (*nios2_gnu_pltenter) (ElfW(Sym) *, unsigned int, \
uintptr_t *, uintptr_t *, \
const struct La_nios2_regs *, \
unsigned int *, const char *, \
long int *);
#define ARCH_PLTEXIT_MEMBERS \
unsigned int (*nios2_gnu_pltexit) (ElfW(Sym) *, unsigned int, \
uintptr_t *, uintptr_t *, \
const struct La_nios2_regs *, \
struct La_nios2_retval *, \
const char *);
#include_next <ldsodefs.h>
#endif

32
sysdeps/nios2/libc-tls.c Normal file
View File

@ -0,0 +1,32 @@
/* Thread-local storage handling in the ELF dynamic linker. Nios II version.
Copyright (C) 2005-2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library. If not, see
<http://www.gnu.org/licenses/>. */
#include <csu/libc-tls.c>
#include <dl-tls.h>
/* On Nios II, linker optimizations are not required, so __tls_get_addr
can be called even in statically linked binaries. In this case module
must be always 1 and PT_TLS segment exist in the binary, otherwise it
would not link. */
void *
__tls_get_addr (tls_index *ti)
{
dtv_t *dtv = THREAD_DTV ();
return (char *) dtv[1].pointer.val + GET_ADDR_OFFSET;
}

View File

@ -0,0 +1,333 @@
# Begin of automatic generation
# Maximal error of functions:
Function: "acosh":
double: 1
idouble: 1
Function: "asinh":
double: 1
float: 1
ifloat: 1
Function: "atan2":
float: 1
ifloat: 1
Function: "atanh":
float: 1
ifloat: 1
Function: Real part of "cacos":
double: 1
float: 2
idouble: 1
ifloat: 2
Function: Imaginary part of "cacos":
double: 1
float: 2
idouble: 1
ifloat: 2
Function: Real part of "cacosh":
double: 1
float: 2
idouble: 1
ifloat: 2
Function: Imaginary part of "cacosh":
double: 1
float: 2
idouble: 1
ifloat: 2
Function: Real part of "casin":
double: 1
float: 1
idouble: 1
ifloat: 1
Function: Imaginary part of "casin":
double: 1
float: 2
idouble: 1
ifloat: 2
Function: Real part of "casinh":
double: 1
float: 2
idouble: 1
ifloat: 2
Function: Imaginary part of "casinh":
double: 1
float: 1
idouble: 1
ifloat: 1
Function: Real part of "catan":
float: 1
ifloat: 1
Function: Imaginary part of "catan":
double: 1
float: 1
idouble: 1
ifloat: 1
Function: Real part of "catanh":
double: 1
float: 1
idouble: 1
ifloat: 1
Function: Imaginary part of "catanh":
float: 1
ifloat: 1
Function: "cbrt":
double: 1
float: 1
idouble: 1
ifloat: 1
Function: Real part of "ccos":
double: 1
float: 1
idouble: 1
ifloat: 1
Function: Imaginary part of "ccos":
double: 1
float: 1
idouble: 1
ifloat: 1
Function: Real part of "ccosh":
double: 1
float: 1
idouble: 1
ifloat: 1
Function: Imaginary part of "ccosh":
double: 1
float: 1
idouble: 1
ifloat: 1
Function: Real part of "cexp":
double: 2
float: 1
idouble: 2
ifloat: 1
Function: Imaginary part of "cexp":
double: 1
float: 2
idouble: 1
ifloat: 2
Function: Real part of "clog":
double: 1
float: 1
idouble: 1
ifloat: 1
Function: Imaginary part of "clog":
float: 1
ifloat: 1
Function: Real part of "clog10":
double: 2
float: 2
idouble: 2
ifloat: 2
Function: Imaginary part of "clog10":
double: 1
float: 1
idouble: 1
ifloat: 1
Function: "cos":
float: 1
ifloat: 1
Function: "cosh":
double: 1
float: 1
idouble: 1
ifloat: 1
Function: Real part of "cpow":
double: 2
float: 4
idouble: 2
ifloat: 4
Function: Imaginary part of "cpow":
float: 2
ifloat: 2
Function: Real part of "csin":
double: 1
float: 1
idouble: 1
ifloat: 1
Function: Real part of "csinh":
float: 1
ifloat: 1
Function: Imaginary part of "csinh":
double: 1
float: 1
idouble: 1
ifloat: 1
Function: Real part of "csqrt":
double: 1
float: 1
idouble: 1
ifloat: 1
Function: Imaginary part of "csqrt":
double: 1
float: 1
idouble: 1
ifloat: 1
Function: Real part of "ctan":
double: 1
float: 1
idouble: 1
ifloat: 1
Function: Imaginary part of "ctan":
double: 2
float: 1
idouble: 2
ifloat: 1
Function: Real part of "ctanh":
double: 2
float: 1
idouble: 2
ifloat: 1
Function: Imaginary part of "ctanh":
double: 2
float: 2
idouble: 2
ifloat: 2
Function: "erf":
double: 1
idouble: 1
Function: "erfc":
double: 1
float: 1
idouble: 1
ifloat: 1
Function: "exp10":
double: 1
idouble: 1
Function: "expm1":
double: 1
float: 1
idouble: 1
ifloat: 1
Function: "gamma":
double: 1
float: 1
idouble: 1
ifloat: 1
Function: "hypot":
double: 1
idouble: 1
Function: "j0":
double: 2
float: 2
idouble: 2
ifloat: 2
Function: "j1":
double: 1
float: 2
idouble: 1
ifloat: 2
Function: "jn":
double: 4
float: 4
idouble: 4
ifloat: 4
Function: "lgamma":
double: 1
float: 1
idouble: 1
ifloat: 1
Function: "log":
float: 1
ifloat: 1
Function: "log10":
double: 1
float: 2
idouble: 1
ifloat: 2
Function: "log1p":
float: 1
ifloat: 1
Function: "pow":
float: 1
ifloat: 1
Function: "pow10":
double: 1
idouble: 1
Function: "sin":
float: 1
ifloat: 1
Function: "sincos":
float: 1
ifloat: 1
Function: "tgamma":
double: 4
float: 3
idouble: 4
ifloat: 3
Function: "y0":
double: 2
float: 1
idouble: 2
ifloat: 1
Function: "y1":
double: 3
float: 2
idouble: 3
ifloat: 2
Function: "yn":
double: 3
float: 2
idouble: 3
ifloat: 2
# end of automatic generation

View File

@ -0,0 +1,64 @@
/* Machine-dependent definitions for profiling support. Nios II version.
Copyright (C) 1996-2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library. If not, see
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
#define _MCOUNT_DECL(frompc, selfpc) \
static void __attribute_used__ __mcount_internal (u_long frompc, u_long selfpc)
/* This macro/func MUST save r4, r5, r6, r7 and r8 because the compiler inserts
blind calls to mcount(), ignoring the fact that mcount may clobber
registers; therefore, mcount may NOT clobber registers. */
#if defined(__PIC__) || defined(PIC)
#define NIOS2_MCOUNT_CALL \
"nextpc r3\n\t" \
"1: movhi r2, %hiadj(_gp_got - 1b)\n\t" \
"addi r2, r2, %lo(_gp_got - 1b)\n\t" \
"add r2, r2, r3\n\t" \
"ldw r2, %call(__mcount_internal)(r2)\n\t" \
"callr r2\n\t"
#else
#define NIOS2_MCOUNT_CALL \
"call\tmcount_internal\n\t"
#endif
#define MCOUNT \
asm (".globl _mcount\n\t" \
".type _mcount,@function\n\t" \
"_mcount:\n\t" \
"subi sp, sp, 24\n\t" \
"stw ra, 20(sp)\n\t" \
"stw r8, 16(sp)\n\t" \
"stw r7, 12(sp)\n\t" \
"stw r6, 8(sp)\n\t" \
"stw r5, 4(sp)\n\t" \
"stw r4, 0(sp)\n\t" \
"mov r4, r8\n\t" \
"mov r5, ra\n\t" \
NIOS2_MCOUNT_CALL \
"ldw ra, 20(sp)\n\t" \
"ldw r8, 16(sp)\n\t" \
"ldw r7, 12(sp)\n\t" \
"ldw r6, 8(sp)\n\t" \
"ldw r5, 4(sp)\n\t" \
"ldw r4, 0(sp)\n\t" \
"addi sp, sp, 24\n\t" \
"ret\n\t" \
".size _mcount, . - _mcount\n\t" \
);

View File

@ -0,0 +1,28 @@
/* Configuration for math tests. Nios II version.
Copyright (C) 2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
/* Current Nios II soft-float does not support exceptions or rounding
modes. */
#define ROUNDING_TESTS_float(MODE) ((MODE) == FE_TONEAREST)
#define ROUNDING_TESTS_double(MODE) ((MODE) == FE_TONEAREST)
#define ROUNDING_TESTS_long_double(MODE) ((MODE) == FE_TONEAREST)
#define EXCEPTION_TESTS_float 0
#define EXCEPTION_TESTS_double 0
#define EXCEPTION_TESTS_long_double 0
#include_next <math-tests.h>

View File

@ -0,0 +1,33 @@
#ifndef _MATH_PRIVATE_H
/* Suppress use of exceptions here to avoid build errors if the FE_*
macros aren't defined. Only allow rounding modes implemented for Nios II.
This does mean that some code will silently fail to report exceptions,
set rounding mode as expected, etc., but it allows math code to compile
that otherwise wouldn't (such as math/s_fma.c) and so is valuable.
We intentionally ignore the "exception" arguments of functions that
take an exception, since we can't even evaluate the argument
without causing a build failure. The extra level of statement
expression wrapping avoids "statement with no effect" warnings.
Since the callers don't check for errors anyway, we just claim
success in every case.
The overrides for libc_ functions must happen before we include
the generic math_private.h, and the overrides for regular
<fenv.h> functions must happen afterwards, to avoid clashing with
the declarations of those functions. */
#define libc_fesetround(rnd) ({ 0; })
#define libc_fetestexcept(exc) ({ 0; })
#define libc_feholdexcept_setround(env, exc) ({ (void) (env); 0; })
#define libc_feupdateenv_test(env, exc) ({ (void) (env); 0; })
#include_next <math_private.h>
#define feraiseexcept(excepts) ({ 0; })
#define __feraiseexcept(excepts) ({ 0; })
#define feclearexcept(exc) ({ 0; })
#endif

23
sysdeps/nios2/memusage.h Normal file
View File

@ -0,0 +1,23 @@
/* Machine-specific definitions for memory usage profiling, Nios II version.
Copyright (C) 2000-2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library. If not, see
<http://www.gnu.org/licenses/>. */
#define GETSP() ({ register uintptr_t stack_ptr asm ("%sp"); stack_ptr; })
#define uatomic32_t unsigned int
#include <sysdeps/generic/memusage.h>

View File

@ -0,0 +1,22 @@
# NPTL makefile fragment for Nios II.
# Copyright (C) 2005-2015 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 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.
#
# 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
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with the GNU C Library. If not, see
# <http://www.gnu.org/licenses/>.
ifeq ($(subdir),csu)
gen-as-const-headers += tcb-offsets.sym
endif

View File

@ -0,0 +1,189 @@
/* Machine-specific pthread type layouts. Nios II version.
Copyright (C) 2012-2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library. If not, see
<http://www.gnu.org/licenses/>. */
#ifndef _BITS_PTHREADTYPES_H
#define _BITS_PTHREADTYPES_H 1
#include <endian.h>
#define __SIZEOF_PTHREAD_ATTR_T 36
#define __SIZEOF_PTHREAD_MUTEX_T 24
#define __SIZEOF_PTHREAD_MUTEXATTR_T 4
#define __SIZEOF_PTHREAD_COND_T 48
#define __SIZEOF_PTHREAD_CONDATTR_T 4
#define __SIZEOF_PTHREAD_RWLOCK_T 32
#define __SIZEOF_PTHREAD_RWLOCKATTR_T 8
#define __SIZEOF_PTHREAD_BARRIER_T 20
#define __SIZEOF_PTHREAD_BARRIERATTR_T 4
/* Thread identifiers. The structure of the attribute type is
deliberately not exposed. */
typedef unsigned long int pthread_t;
union pthread_attr_t
{
char __size[__SIZEOF_PTHREAD_ATTR_T];
long int __align;
};
#ifndef __have_pthread_attr_t
typedef union pthread_attr_t pthread_attr_t;
# define __have_pthread_attr_t 1
#endif
typedef struct __pthread_internal_slist
{
struct __pthread_internal_slist *__next;
} __pthread_slist_t;
/* Data structures for mutex handling. The structure of the attribute
type is deliberately not exposed. */
typedef union
{
struct __pthread_mutex_s
{
int __lock;
unsigned int __count;
int __owner;
/* KIND must stay at this position in the structure to maintain
binary compatibility. */
int __kind;
unsigned int __nusers;
__extension__ union
{
int __spins;
__pthread_slist_t __list;
};
} __data;
char __size[__SIZEOF_PTHREAD_MUTEX_T];
long int __align;
} pthread_mutex_t;
typedef union
{
char __size[__SIZEOF_PTHREAD_MUTEXATTR_T];
long int __align;
} pthread_mutexattr_t;
/* Mutex __spins initializer used by PTHREAD_MUTEX_INITIALIZER. */
#define __PTHREAD_SPINS 0
/* Data structure for conditional variable handling. The structure of
the attribute type is deliberately not exposed. */
typedef union
{
struct
{
int __lock;
unsigned int __futex;
__extension__ unsigned long long int __total_seq;
__extension__ unsigned long long int __wakeup_seq;
__extension__ unsigned long long int __woken_seq;
void *__mutex;
unsigned int __nwaiters;
unsigned int __broadcast_seq;
} __data;
char __size[__SIZEOF_PTHREAD_COND_T];
__extension__ long long int __align;
} pthread_cond_t;
typedef union
{
char __size[__SIZEOF_PTHREAD_CONDATTR_T];
long int __align;
} pthread_condattr_t;
/* Keys for thread-specific data */
typedef unsigned int pthread_key_t;
/* Once-only execution */
typedef int pthread_once_t;
#if defined __USE_UNIX98 || defined __USE_XOPEN2K
/* Data structure for read-write lock variable handling. The
structure of the attribute type is deliberately not exposed. */
typedef union
{
struct
{
int __lock;
unsigned int __nr_readers;
unsigned int __readers_wakeup;
unsigned int __writer_wakeup;
unsigned int __nr_readers_queued;
unsigned int __nr_writers_queued;
#if __BYTE_ORDER == __BIG_ENDIAN
unsigned char __pad1;
unsigned char __pad2;
unsigned char __shared;
/* FLAGS must stay at this position in the structure to maintain
binary compatibility. */
unsigned char __flags;
#else
/* FLAGS must stay at this position in the structure to maintain
binary compatibility. */
unsigned char __flags;
unsigned char __shared;
unsigned char __pad1;
unsigned char __pad2;
#endif
int __writer;
} __data;
char __size[__SIZEOF_PTHREAD_RWLOCK_T];
long int __align;
} pthread_rwlock_t;
#define __PTHREAD_RWLOCK_ELISION_EXTRA 0
typedef union
{
char __size[__SIZEOF_PTHREAD_RWLOCKATTR_T];
long int __align;
} pthread_rwlockattr_t;
#endif
#ifdef __USE_XOPEN2K
/* POSIX spinlock data type. */
typedef volatile int pthread_spinlock_t;
/* POSIX barriers data type. The structure of the type is
deliberately not exposed. */
typedef union
{
char __size[__SIZEOF_PTHREAD_BARRIER_T];
long int __align;
} pthread_barrier_t;
typedef union
{
char __size[__SIZEOF_PTHREAD_BARRIERATTR_T];
int __align;
} pthread_barrierattr_t;
#endif
#endif /* bits/pthreadtypes.h */

View File

@ -0,0 +1,32 @@
/* Machine-specific POSIX semaphore type layouts. Nios II version.
Copyright (C) 2002-2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#ifndef _SEMAPHORE_H
# error "Never use <bits/semaphore.h> directly; include <semaphore.h> instead."
#endif
#define __SIZEOF_SEM_T 16
/* Value returned if `sem_open' failed. */
#define SEM_FAILED ((sem_t *) 0)
typedef union
{
char __size[__SIZEOF_SEM_T];
long int __align;
} sem_t;

View File

@ -0,0 +1,24 @@
/* pthread spin-lock implementation for Nios II.
Copyright (C) 2005-2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library. If not, see
<http://www.gnu.org/licenses/>. */
#define SPIN_LOCK_READS_BETWEEN_CMPXCHG 1000
/* We can't use the normal "#include <nptl/pthread_spin_lock.c>" because
it will resolve to this very file. Using "sysdeps/.." as reference to the
top level directory does the job. */
#include <sysdeps/../nptl/pthread_spin_lock.c>

View File

@ -0,0 +1,32 @@
/* pthread machine parameter definitions, Nios II version.
Copyright (C) 2002-2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library. If not, see
<http://www.gnu.org/licenses/>. */
/* Default stack size. */
#define ARCH_STACK_DEFAULT_SIZE (2 * 1024 * 1024)
/* Required stack pointer alignment at beginning. */
#define STACK_ALIGN 4
/* Minimal stack size after allocating thread descriptor and guard size. */
#define MINIMAL_REST_STACK 2048
/* Alignment requirement for TCB. */
#define TCB_ALIGNMENT 4
/* Location of current stack frame. */
#define CURRENT_STACK_FRAME __builtin_frame_address (0)

View File

@ -0,0 +1,14 @@
#include <sysdep.h>
#include <tls.h>
--
-- Abuse tls.h macros to derive offsets relative to the thread register.
# undef __thread_self
# define __thread_self ((void *) 0)
# define thread_offsetof(mem) ((ptrdiff_t) THREAD_SELF + offsetof (struct pthread, mem))
MULTIPLE_THREADS_OFFSET thread_offsetof (header.multiple_threads)
PID_OFFSET thread_offsetof (pid)
TID_OFFSET thread_offsetof (tid)
POINTER_GUARD (offsetof (tcbhead_t, pointer_guard) - TLS_TCB_OFFSET - sizeof (tcbhead_t))

174
sysdeps/nios2/nptl/tls.h Normal file
View File

@ -0,0 +1,174 @@
/* Definition for thread-local data handling. NPTL/Nios II version.
Copyright (C) 2012-2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library. If not, see
<http://www.gnu.org/licenses/>. */
#ifndef _TLS_H
#define _TLS_H 1
#include <dl-sysdep.h>
#ifndef __ASSEMBLER__
# include <stdbool.h>
# include <stddef.h>
# include <stdint.h>
/* Type for the dtv. */
typedef union dtv
{
size_t counter;
struct
{
void *val;
bool is_static;
} pointer;
} dtv_t;
#else /* __ASSEMBLER__ */
# include <tcb-offsets.h>
#endif /* __ASSEMBLER__ */
#ifndef __ASSEMBLER__
/* Get system call information. */
# include <sysdep.h>
/* The TP points to the start of the thread blocks. */
# define TLS_DTV_AT_TP 1
# define TLS_TCB_AT_TP 0
/* Get the thread descriptor definition. */
# include <nptl/descr.h>
typedef struct
{
dtv_t *dtv;
uintptr_t pointer_guard;
unsigned spare[6];
} tcbhead_t;
register struct pthread *__thread_self __asm__("r23");
#define READ_THREAD_POINTER() ((void *) __thread_self)
/* This is the size of the initial TCB. Because our TCB is before the thread
pointer, we don't need this. */
# define TLS_INIT_TCB_SIZE 0
/* Alignment requirements for the initial TCB. */
# define TLS_INIT_TCB_ALIGN __alignof__ (struct pthread)
/* This is the size of the TCB. Because our TCB is before the thread
pointer, we don't need this. */
# define TLS_TCB_SIZE 0
/* Alignment requirements for the TCB. */
# define TLS_TCB_ALIGN __alignof__ (struct pthread)
/* This is the size we need before TCB - actually, it includes the TCB. */
# define TLS_PRE_TCB_SIZE \
(sizeof (struct pthread) \
+ ((sizeof (tcbhead_t) + TLS_TCB_ALIGN - 1) & ~(TLS_TCB_ALIGN - 1)))
/* The thread pointer (in hardware register r23) points to the end of
the TCB + 0x7000, as for PowerPC and MIPS. */
# define TLS_TCB_OFFSET 0x7000
/* Install the dtv pointer. The pointer passed is to the element with
index -1 which contain the length. */
# define INSTALL_DTV(tcbp, dtvp) \
(((tcbhead_t *) (tcbp))[-1].dtv = (dtvp) + 1)
/* Install new dtv for current thread. */
# define INSTALL_NEW_DTV(dtv) \
(THREAD_DTV() = (dtv))
/* Return dtv of given thread descriptor. */
# define GET_DTV(tcbp) \
(((tcbhead_t *) (tcbp))[-1].dtv)
/* Code to initially initialize the thread pointer. */
# define TLS_INIT_TP(tcbp) \
(__thread_self = (struct pthread *) ((char *) tcbp + TLS_TCB_OFFSET), NULL)
/* Value passed to 'clone' for initialization of the thread register. */
# define TLS_DEFINE_INIT_TP(tp, pd) \
void *tp = (void *) (pd) + TLS_TCB_OFFSET + TLS_PRE_TCB_SIZE
/* Return the address of the dtv for the current thread. */
# define THREAD_DTV() \
(((tcbhead_t *) (READ_THREAD_POINTER () - TLS_TCB_OFFSET))[-1].dtv)
/* Return the thread descriptor for the current thread. */
# define THREAD_SELF \
((struct pthread *) (READ_THREAD_POINTER () \
- TLS_TCB_OFFSET - TLS_PRE_TCB_SIZE))
/* Magic for libthread_db to know how to do THREAD_SELF. */
# define DB_THREAD_SELF \
REGISTER (32, 32, 23 * 4, -TLS_PRE_TCB_SIZE - TLS_TCB_OFFSET)
/* Access to data in the thread descriptor is easy. */
# define THREAD_GETMEM(descr, member) \
descr->member
# define THREAD_GETMEM_NC(descr, member, idx) \
descr->member[idx]
# define THREAD_SETMEM(descr, member, value) \
descr->member = (value)
# define THREAD_SETMEM_NC(descr, member, idx, value) \
descr->member[idx] = (value)
# define THREAD_GET_POINTER_GUARD() \
(((tcbhead_t *) (READ_THREAD_POINTER () \
- TLS_TCB_OFFSET))[-1].pointer_guard)
# define THREAD_SET_POINTER_GUARD(value) \
(THREAD_GET_POINTER_GUARD () = (value))
# define THREAD_COPY_POINTER_GUARD(descr) \
(((tcbhead_t *) ((void *) (descr) \
+ TLS_PRE_TCB_SIZE))[-1].pointer_guard \
= THREAD_GET_POINTER_GUARD())
/* l_tls_offset == 0 is perfectly valid on Nios II, so we have to use some
different value to mean unset l_tls_offset. */
# define NO_TLS_OFFSET -1
/* Get and set the global scope generation counter in struct pthread. */
#define THREAD_GSCOPE_FLAG_UNUSED 0
#define THREAD_GSCOPE_FLAG_USED 1
#define THREAD_GSCOPE_FLAG_WAIT 2
#define THREAD_GSCOPE_RESET_FLAG() \
do \
{ int __res \
= atomic_exchange_rel (&THREAD_SELF->header.gscope_flag, \
THREAD_GSCOPE_FLAG_UNUSED); \
if (__res == THREAD_GSCOPE_FLAG_WAIT) \
lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1, LLL_PRIVATE); \
} \
while (0)
#define THREAD_GSCOPE_SET_FLAG() \
do \
{ \
THREAD_SELF->header.gscope_flag = THREAD_GSCOPE_FLAG_USED; \
atomic_write_barrier (); \
} \
while (0)
#define THREAD_GSCOPE_WAIT() \
GL(dl_wait_lookup_done) ()
#endif /* __ASSEMBLER__ */
#endif /* tls.h */

View File

@ -0,0 +1,6 @@
case "$machine" in
nios2*)
base_machine=nios2
machine=nios2
;;
esac

1
sysdeps/nios2/s_fma.c Normal file
View File

@ -0,0 +1 @@
#include <soft-fp/fmadf4.c>

1
sysdeps/nios2/s_fmaf.c Normal file
View File

@ -0,0 +1 @@
#include <soft-fp/fmasf4.c>

73
sysdeps/nios2/setjmp.S Normal file
View File

@ -0,0 +1,73 @@
/* setjmp for Nios II.
Copyright (C) 1991-2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library. If not, see
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
#include <jmpbuf-offsets.h>
.text
ENTRY(setjmp)
movi r5, 1
br __sigsetjmp
END(setjmp)
ENTRY(_setjmp)
mov r5, zero
br __sigsetjmp
END(_setjmp)
libc_hidden_def (_setjmp)
/* Save the current program position in ENV and return 0. */
ENTRY(__sigsetjmp)
#ifdef PTR_MANGLE
PTR_MANGLE_GUARD (r9)
#endif
stw r16, (JB_R16*4)(r4)
stw r17, (JB_R17*4)(r4)
stw r18, (JB_R18*4)(r4)
stw r19, (JB_R19*4)(r4)
stw r20, (JB_R20*4)(r4)
stw r21, (JB_R21*4)(r4)
stw r22, (JB_R22*4)(r4)
stw fp, (JB_FP*4)(r4)
#ifdef PTR_MANGLE
PTR_MANGLE (r6, ra, r9)
PTR_MANGLE (r7, sp, r9)
stw r6, (JB_RA*4)(r4)
stw r7, (JB_SP*4)(r4)
#else
stw ra, (JB_RA*4)(r4)
stw sp, (JB_SP*4)(r4)
#endif
#if IS_IN (rtld)
/* In ld.so we never save the signal mask. */
mov r2, zero
ret
#else
/* Save the signal mask if requested. */
#if defined(__PIC__) || defined(PIC)
nextpc r2
1: movhi r3, %hiadj(__sigjmp_save - 1b)
addi r3, r3, %lo(__sigjmp_save - 1b)
add r2, r2, r3
jmp r2
#else
jmpi __sigjmp_save
#endif
#endif
END (__sigsetjmp)
libc_hidden_def (__sigsetjmp)

View File

@ -0,0 +1,51 @@
#define _FP_W_TYPE_SIZE 32
#define _FP_W_TYPE unsigned long
#define _FP_WS_TYPE signed long
#define _FP_I_TYPE long
#define _FP_MUL_MEAT_S(R,X,Y) \
_FP_MUL_MEAT_1_wide(_FP_WFRACBITS_S,R,X,Y,umul_ppmm)
#define _FP_MUL_MEAT_D(R,X,Y) \
_FP_MUL_MEAT_2_wide(_FP_WFRACBITS_D,R,X,Y,umul_ppmm)
#define _FP_MUL_MEAT_Q(R,X,Y) \
_FP_MUL_MEAT_4_wide(_FP_WFRACBITS_Q,R,X,Y,umul_ppmm)
#define _FP_MUL_MEAT_DW_S(R,X,Y) \
_FP_MUL_MEAT_DW_1_wide(_FP_WFRACBITS_S,R,X,Y,umul_ppmm)
#define _FP_MUL_MEAT_DW_D(R,X,Y) \
_FP_MUL_MEAT_DW_2_wide(_FP_WFRACBITS_D,R,X,Y,umul_ppmm)
#define _FP_MUL_MEAT_DW_Q(R,X,Y) \
_FP_MUL_MEAT_DW_4_wide(_FP_WFRACBITS_Q,R,X,Y,umul_ppmm)
#define _FP_DIV_MEAT_S(R,X,Y) _FP_DIV_MEAT_1_loop(S,R,X,Y)
#define _FP_DIV_MEAT_D(R,X,Y) _FP_DIV_MEAT_2_udiv(D,R,X,Y)
#define _FP_DIV_MEAT_Q(R,X,Y) _FP_DIV_MEAT_4_udiv(Q,R,X,Y)
#define _FP_NANFRAC_S ((_FP_QNANBIT_S << 1) - 1)
#define _FP_NANFRAC_D ((_FP_QNANBIT_D << 1) - 1), -1
#define _FP_NANFRAC_Q ((_FP_QNANBIT_Q << 1) - 1), -1, -1, -1
#define _FP_NANSIGN_S 0
#define _FP_NANSIGN_D 0
#define _FP_NANSIGN_Q 0
#define _FP_KEEPNANFRACP 1
#define _FP_QNANNEGATEDP 0
/* This is arbitrarily taken from the PowerPC version. */
#define _FP_CHOOSENAN(fs, wc, R, X, Y, OP) \
do { \
if ((_FP_FRAC_HIGH_RAW_##fs(X) & _FP_QNANBIT_##fs) \
&& !(_FP_FRAC_HIGH_RAW_##fs(Y) & _FP_QNANBIT_##fs)) \
{ \
R##_s = Y##_s; \
_FP_FRAC_COPY_##wc(R,Y); \
} \
else \
{ \
R##_s = X##_s; \
_FP_FRAC_COPY_##wc(R,X); \
} \
R##_c = FP_CLS_NAN; \
} while (0)
#define _FP_TININESS_AFTER_ROUNDING 0

View File

@ -0,0 +1,51 @@
/* Override generic sotruss-lib.c to define actual functions for Nios II.
Copyright (C) 2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library. If not, see
<http://www.gnu.org/licenses/>. */
#define HAVE_ARCH_PLTENTER
#define HAVE_ARCH_PLTEXIT
#include <elf/sotruss-lib.c>
ElfW(Addr)
la_nios2_gnu_pltenter (ElfW(Sym) *sym __attribute__ ((unused)),
unsigned int ndx __attribute__ ((unused)),
uintptr_t *refcook, uintptr_t *defcook,
La_nios2_regs *regs, unsigned int *flags,
const char *symname, long int *framesizep)
{
print_enter (refcook, defcook, symname,
regs->lr_reg[0], regs->lr_reg[1], regs->lr_reg[2],
*flags);
/* No need to copy anything, we will not need the parameters in any case. */
*framesizep = 0;
return sym->st_value;
}
unsigned int
la_nios2_gnu_pltexit (ElfW(Sym) *sym, unsigned int ndx, uintptr_t *refcook,
uintptr_t *defcook,
const struct La_nios2_regs *inregs,
struct La_nios2_retval *outregs, const char *symname)
{
print_exit (refcook, defcook, symname, outregs->lrv_r2);
return 0;
}

View File

@ -0,0 +1,6 @@
#include <stdint.h>
extern uintptr_t __stack_chk_guard;
#define STACK_CHK_GUARD __stack_chk_guard
#define POINTER_CHK_GUARD THREAD_GET_POINTER_GUARD()

33
sysdeps/nios2/stackinfo.h Normal file
View File

@ -0,0 +1,33 @@
/* Stack environment definitions for Nios II.
Copyright (C) 2012-2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library. If not, see
<http://www.gnu.org/licenses/>. */
/* This file contains a bit of information about the stack allocation
of the processor. */
#ifndef _STACKINFO_H
#define _STACKINFO_H 1
#include <elf.h>
/* On Nios II the stack grows down. */
#define _STACK_GROWS_DOWN 1
/* Default to a non-executable stack. */
#define DEFAULT_STACK_PERMS (PF_R|PF_W)
#endif /* stackinfo.h */

146
sysdeps/nios2/start.S Normal file
View File

@ -0,0 +1,146 @@
/* Startup code for Nios II
Copyright (C) 1995-2015 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 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.
In addition to the permissions in the GNU Lesser 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 GNU Lesser 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.)
Note that people who make modified versions of this file are not
obligated to grant this special exception for their modified
versions; it is their choice whether to do so. The GNU Lesser
General Public License gives permission to release a modified
version without this exception; this exception also makes it
possible to release a modified version which carries forward this
exception.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library. If not, see
<http://www.gnu.org/licenses/>. */
/* 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
The stack pointer, sp, will point to the argument count on the stack.
The initial state of the stack when a userspace process is started is:
Purpose Start Address Length
Unspecified High Addresses
Referenced strings, etc. Varies
Unspecified
Null auxilliary vector entry 4bytes
Auxilliary vector entries 8bytes each
NULL terminator for envp 4bytes
Environment pointers sp+8+4*argc 4bytes each
NULL terminator for argv sp+4+4*argc 4bytes
Argument pointers sp+4 4bytes each
Argument count sp 4bytes
Unspecified Low Addresses
If the application should register a destructor function with atexit,
the pointer will be placed in r4. Otherwise r4 will be zero.
The contents of all other registers are unspecified. User code should
set fp to zero to mark the end of the frame chain.
The auxilliary vector is a series of pairs of 32-bit tag and 32-bit
value, terminated by an AT_NULL tag.
*/
.text
.globl _start
.type _start,%function
_start:
/* Set up the global pointer. */
movhi gp, %hiadj(_gp)
addi gp, gp, %lo(_gp)
/* Save the stack pointer. */
mov r2, sp
/* Create room on the stack for the fini, rtld_fini and stack_end args
to __libc_start_main. */
subi sp, sp, 12
/* Push stack_end */
stw r2, 8(sp)
/* Push rtld_fini */
stw r4, 4(sp)
/* Set up the GOT pointer. */
nextpc r22
1: movhi r2, %hiadj(_gp_got - 1b)
addi r2, r2, %lo(_gp_got - 1b)
add r22, r22, r2
/* Push fini */
movhi r8, %call_hiadj(__libc_csu_fini)
addi r8, r8, %call_lo(__libc_csu_fini)
add r8, r8, r22
ldw r8, 0(r8)
stw r8, 0(sp)
/* r7 == init */
movhi r7, %call_hiadj(__libc_csu_init)
addi r7, r7, %call_lo(__libc_csu_init)
add r7, r7, r22
ldw r7, 0(r7)
/* r6 == argv */
addi r6, sp, 16
/* r5 == argc */
ldw r5, 12(sp)
/* r4 == main */
movhi r4, %call_hiadj(main)
addi r4, r4, %call_lo(main)
add r4, r4, r22
ldw r4, 0(r4)
/* fp == 0 */
mov fp, zero
/* __libc_start_main (main, argc, argv, init, fini, rtld_fini,
stack_end) */
/* Let the libc call main and exit with its return code. */
movhi r2, %call_hiadj(__libc_start_main)
addi r2, r2, %call_lo(__libc_start_main)
add r2, r2, r22
ldw r2, 0(r2)
callr r2
/* should never get here....*/
movhi r2, %call_hiadj(abort)
addi r2, r2, %call_lo(abort)
add r2, r2, r22
ldw r2, 0(r2)
callr r2
/* 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

65
sysdeps/nios2/sysdep.h Normal file
View File

@ -0,0 +1,65 @@
/* Assembler macros for Nios II.
Copyright (C) 2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include <sysdeps/generic/sysdep.h>
#ifdef __ASSEMBLER__
/* Syntactic details of assembler. */
#define ASM_SIZE_DIRECTIVE(name) .size name,.-name
#define ENTRY(name) \
.globl C_SYMBOL_NAME(name); \
.type C_SYMBOL_NAME(name),%function; \
C_LABEL(name) \
cfi_startproc; \
CALL_MCOUNT;
#undef END
#define END(name) \
cfi_endproc; \
ASM_SIZE_DIRECTIVE(name)
#ifdef PROF
# ifdef __PIC__
# define CALL_MCOUNT \
mov r8, ra; \
nextpc r2; \
1: \
movhi r3, %hiadj(_gp_got - 1b); \
addi r3, r3, %lo(_gp_got - 1b); \
add r2, r2, r3; \
ldw r2, %call(_mcount)(r2); \
callr r2; \
mov ra, r8; \
ret;
# else
# define CALL_MCOUNT \
mov r8, ra; \
call _mount; \
mov ra, r8; \
ret;
# endif
#else
# define CALL_MCOUNT /* Do nothing. */
#endif
#endif /* __ASSEMBLER__ */

View File

@ -0,0 +1,46 @@
#define TLS_LE(x) \
({ int *__result; \
asm ("addi %0, r23, %%tls_le(" #x ")" \
: "=r" (__result)); \
__result; })
#define TLS_IE(x) \
({ int *__result; \
int __tmp; \
asm ("nextpc %0 ; " \
"1: movhi %1, %%hiadj(_gp_got - 1b) ; " \
"addi %1, %1, %%lo(_gp_got - 1b) ; " \
"add %0, %0, %1 ; " \
"ldw %1, %%tls_ie(" #x ")(%0) ; " \
"add %1, r23, %1" \
: "=&r" (__tmp), "=&r" (__result)); \
__result; })
#define TLS_LD(x) \
({ char *__result; \
char *__result2; \
int *__result3; \
int __tmp; \
extern void *__tls_get_addr (void *); \
asm ("nextpc %0 ; " \
"1: movhi %1, %%hiadj(_gp_got - 1b) ; " \
"addi %1, %1, %%lo(_gp_got - 1b) ; " \
"add %0, %0, %1 ; " \
"addi %0, %0, %%tls_ldm(" #x ")" \
: "=r" (__result), "=r" (__tmp)); \
__result2 = (char *)__tls_get_addr (__result); \
asm ("addi %0, %1, %%tls_ldo(" #x ")" \
: "=r" (__result3) : "r" (__result2)); \
__result3; })
#define TLS_GD(x) \
({ int *__result; \
int __tmp; \
extern void *__tls_get_addr (void *); \
asm ("nextpc %0 ; " \
"1: movhi %1, %%hiadj(_gp_got - 1b) ; " \
"addi %1, %1, %%lo(_gp_got - 1b) ; " \
"add %0, %0, %1 ; " \
"addi %0, %0, %%tls_gd(" #x ")" \
: "=r" (__result), "=r" (__tmp)); \
(int *)__tls_get_addr (__result); })

23
sysdeps/nios2/tst-audit.h Normal file
View File

@ -0,0 +1,23 @@
/* Definitions for testing PLT entry/exit auditing. Nios II version.
Copyright (C) 2009-2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library. If not, see
<http://www.gnu.org/licenses/>. */
#define pltenter la_nios2_gnu_pltenter
#define pltexit la_nios2_gnu_pltexit
#define La_regs La_nios2_regs
#define La_retval La_nios2_retval
#define int_retval lrv_r2

View File

@ -0,0 +1,3 @@
nios2/nptl
unix/sysv/linux/generic/wordsize-32
unix/sysv/linux/generic

View File

@ -0,0 +1,13 @@
ifeq ($(subdir),stdlib)
gen-as-const-headers += ucontext_i.sym
endif
ifeq ($(subdir),misc)
# MIPS/Tile-style cacheflush routine
sysdep_headers += sys/cachectl.h
sysdep_routines += cacheflush
endif
ifeq ($(subdir),nptl)
libpthread-routines := $(filter-out pt-vfork,$(libpthread-routines))
endif

View File

@ -0,0 +1,6 @@
libc {
GLIBC_2.21 {
_flush_cache;
cacheflush;
}
}

View File

@ -0,0 +1,33 @@
/* ARCH_FORK definition for Linux fork implementation. Nios II version.
Copyright (C) 2005-2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include <sched.h>
#include <signal.h>
#include <sysdep.h>
#include <tls.h>
/* Argument 1 - Clone flags.
2 - Child stack pointer.
3 - Parent tid pointer.
4 - Child tid pointer.
5 - New TLS area pointer. */
#define ARCH_FORK() \
INLINE_SYSCALL (clone, 5, \
CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID | SIGCHLD, \
NULL, NULL, &THREAD_SELF->tid, NULL)

View File

@ -0,0 +1,92 @@
/* Low-level functions for atomic operations. Nios II version.
Copyright (C) 2012-2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library. If not, see
<http://www.gnu.org/licenses/>. */
#ifndef _NIOS2_BITS_ATOMIC_H
#define _NIOS2_BITS_ATOMIC_H 1
#include <stdint.h>
typedef int32_t atomic32_t;
typedef uint32_t uatomic32_t;
typedef int_fast32_t atomic_fast32_t;
typedef uint_fast32_t uatomic_fast32_t;
typedef intptr_t atomicptr_t;
typedef uintptr_t uatomicptr_t;
typedef intmax_t atomic_max_t;
typedef uintmax_t uatomic_max_t;
#define __HAVE_64B_ATOMICS 0
#define USE_ATOMIC_COMPILER_BUILTINS 0
#define __arch_compare_and_exchange_val_8_acq(mem, newval, oldval) \
(abort (), (__typeof (*mem)) 0)
#define __arch_compare_and_exchange_val_16_acq(mem, newval, oldval) \
(abort (), (__typeof (*mem)) 0)
#define __arch_compare_and_exchange_val_64_acq(mem, newval, oldval) \
(abort (), (__typeof (*mem)) 0)
#define __arch_compare_and_exchange_bool_8_acq(mem, newval, oldval) \
(abort (), 0)
#define __arch_compare_and_exchange_bool_16_acq(mem, newval, oldval) \
(abort (), 0)
#define __arch_compare_and_exchange_bool_64_acq(mem, newval, oldval) \
(abort (), 0)
#define __arch_compare_and_exchange_val_32_acq(mem, newval, oldval) \
({ \
register int r2 asm ("r2"); \
register int* r4 asm ("r4") = (int*)(mem); \
register int r5 asm ("r5"); \
register int r6 asm ("r6") = (int)(newval); \
int retval, orig_oldval = (int)(oldval); \
long kernel_cmpxchg = 0x1004; \
while (1) \
{ \
r5 = *r4; \
if (r5 != orig_oldval) \
{ \
retval = r5; \
break; \
} \
asm volatile ("callr %1\n" \
: "=r" (r2) \
: "r" (kernel_cmpxchg), "r" (r4), "r" (r5), "r" (r6) \
: "ra", "memory"); \
if (!r2) { retval = orig_oldval; break; } \
} \
(__typeof (*(mem))) retval; \
})
#define __arch_compare_and_exchange_bool_32_acq(mem, newval, oldval) \
({ \
register int r2 asm ("r2"); \
register int *r4 asm ("r4") = (int*)(mem); \
register int r5 asm ("r5") = (int)(oldval); \
register int r6 asm ("r6") = (int)(newval); \
long kernel_cmpxchg = 0x1004; \
asm volatile ("callr %1\n" \
: "=r" (r2) \
: "r" (kernel_cmpxchg), "r" (r4), "r" (r5), "r" (r6) \
: "ra", "memory"); \
r2; \
})
#define atomic_full_barrier() ({ asm volatile ("sync"); })
#endif /* _NIOS2_BITS_ATOMIC_H */

View File

@ -0,0 +1,42 @@
/* Definitions for POSIX memory map interface. Linux/Nios II version.
Copyright (C) 1997-2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library. If not, see
<http://www.gnu.org/licenses/>. */
#ifndef _SYS_MMAN_H
# error "Never use <bits/mman.h> directly; include <sys/mman.h> instead."
#endif
/* The following definitions basically come from the kernel headers.
But the kernel header is not namespace clean. */
/* These are Linux-specific. */
#ifdef __USE_MISC
# define MAP_GROWSDOWN 0x00100 /* Stack-like segment. */
# define MAP_DENYWRITE 0x00800 /* ETXTBSY */
# define MAP_EXECUTABLE 0x01000 /* Mark it as an executable. */
# define MAP_LOCKED 0x02000 /* Lock the mapping. */
# define MAP_NORESERVE 0x04000 /* Don't check for reservations. */
# define MAP_POPULATE 0x08000 /* Populate (prefault) pagetables. */
# define MAP_NONBLOCK 0x10000 /* Do not block on IO. */
# define MAP_STACK 0x20000 /* Allocation is for a stack. */
# define MAP_HUGETLB 0x40000 /* Create huge page mapping. */
#endif
/* Include generic Linux declarations. */
#include <bits/mman-linux.h>

View File

@ -0,0 +1,67 @@
blkcnt64_t:x
blkcnt_t:l
blksize_t:i
caddr_t:Pc
clockid_t:i
clock_t:l
daddr_t:i
dev_t:y
fd_mask:l
fsblkcnt64_t:y
fsblkcnt_t:m
fsfilcnt64_t:y
fsfilcnt_t:m
fsid_t:8__fsid_t
gid_t:j
id_t:j
ino64_t:y
ino_t:m
int16_t:s
int32_t:i
int64_t:x
int8_t:a
intptr_t:i
key_t:i
loff_t:x
mode_t:j
nlink_t:j
off64_t:x
off_t:l
pid_t:i
pthread_attr_t:14pthread_attr_t
pthread_barrier_t:17pthread_barrier_t
pthread_barrierattr_t:21pthread_barrierattr_t
pthread_cond_t:14pthread_cond_t
pthread_condattr_t:18pthread_condattr_t
pthread_key_t:j
pthread_mutex_t:15pthread_mutex_t
pthread_mutexattr_t:19pthread_mutexattr_t
pthread_once_t:i
pthread_rwlock_t:16pthread_rwlock_t
pthread_rwlockattr_t:20pthread_rwlockattr_t
pthread_spinlock_t:i
pthread_t:m
quad_t:x
register_t:i
rlim64_t:y
rlim_t:m
sigset_t:10__sigset_t
size_t:j
socklen_t:j
ssize_t:i
suseconds_t:l
time_t:l
u_char:h
uid_t:j
uint:j
u_int:j
u_int16_t:t
u_int32_t:j
u_int64_t:y
u_int8_t:h
ulong:m
u_long:m
u_quad_t:y
useconds_t:j
ushort:t
u_short:t

View File

@ -0,0 +1,29 @@
/* cacheflush system call for Nios II Linux.
Copyright (C) 2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library. If not, see
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
#include <stddef.h>
#include <unistd.h>
/* Flush cache(s). */
int
_flush_cache (char *addr, const int nbytes, const int op)
{
return INLINE_SYSCALL (cacheflush, 3, addr, nbytes, op);
}
weak_alias (_flush_cache, cacheflush)

View File

@ -0,0 +1,107 @@
/* clone() implementation for Nios II.
Copyright (C) 2008-2015 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Andrew Jenner <andrew@codesourcery.com>, 2008.
The GNU C Library is free software; you can redistribute it and/or
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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
/* 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>
#include <tcb-offsets.h>
#define CLONE_VM 0x00000100
#define CLONE_THREAD 0x00010000
/* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg,
void *parent_tidptr, void *tls, void *child_tidptr) */
.text
ENTRY(__clone)
/* Sanity check arguments. */
movi r2, EINVAL
/* No NULL function pointers. */
beq r4, zero, SYSCALL_ERROR_LABEL
/* No NULL stack pointers. */
beq r5, zero, SYSCALL_ERROR_LABEL
subi r5, r5, 8 /* Reserve argument save space. */
stw r4, 4(r5) /* Save function pointer. */
stw r7, 0(r5) /* Save argument pointer. */
/* Load arguments. */
mov r4, r6
ldw r6, 0(sp)
ldw r7, 8(sp)
ldw r8, 4(sp)
/* Do the system call. */
movi r2, SYS_ify (clone)
/* End FDE now, because in the child the unwind info will be
wrong. */
cfi_endproc
trap
/* Check for errors. */
bne r7, zero, SYSCALL_ERROR_LABEL
/* See if we're on the newly created thread. */
beq r2, zero, thread_start
/* Successful return from the parent */
ret
thread_start:
cfi_startproc
cfi_undefined (ra)
/* We expect the argument registers to be preserved across system
calls and across task cloning, so flags should be in r4 here. */
andhi r2, r4, %hi(CLONE_THREAD)
bne r2, zero, 2f
andi r3, r4, CLONE_VM
movi r2, -1
bne r3, zero, 3f
DO_CALL (getpid, 0)
3:
stw r2, PID_OFFSET(r23)
stw r2, TID_OFFSET(r23)
2:
ldw r5, 4(sp) /* Function pointer. */
ldw r4, 0(sp) /* Argument pointer. */
addi sp, sp, 8
/* Call the user's function. */
callr r5
/* _exit with the result. */
mov r4, r2
#ifdef PIC
nextpc r22
1: movhi r8, %hiadj(_gp_got - 1b)
addi r8, r8, %lo(_gp_got - 1b)
add r22, r22, r8
ldw r8, %call(HIDDEN_JUMPTARGET(_exit))(r22)
jmp r8
#else
jmpi _exit
#endif
cfi_endproc
cfi_startproc
PSEUDO_END (__clone)
weak_alias (__clone, clone)

View File

@ -0,0 +1,4 @@
# This file is generated from configure.in by Autoconf. DO NOT EDIT!
# Local configure fragment for sysdeps/unix/sysv/linux/nios2.
arch_minimum_kernel=3.19.0

View File

@ -0,0 +1,4 @@
GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
# Local configure fragment for sysdeps/unix/sysv/linux/nios2.
arch_minimum_kernel=3.19.0

View File

@ -0,0 +1,66 @@
/* Save current context.
Copyright (C) 2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
#include "ucontext_i.h"
/* int getcontext (ucontext_t *ucp)
Returns 0 on success -1 and errno on failure.
*/
.text
ENTRY(__getcontext)
stw r16, (UCONTEXT_MCONTEXT + 16*4)(r4)
stw r17, (UCONTEXT_MCONTEXT + 17*4)(r4)
stw r18, (UCONTEXT_MCONTEXT + 18*4)(r4)
stw r19, (UCONTEXT_MCONTEXT + 19*4)(r4)
stw r20, (UCONTEXT_MCONTEXT + 20*4)(r4)
stw r21, (UCONTEXT_MCONTEXT + 21*4)(r4)
stw r22, (UCONTEXT_MCONTEXT + 22*4)(r4)
stw ra, (UCONTEXT_MCONTEXT + 24*4)(r4)
stw fp, (UCONTEXT_MCONTEXT + 25*4)(r4)
stw gp, (UCONTEXT_MCONTEXT + 26*4)(r4)
/* Store return address at place for EA. */
stw ra, (UCONTEXT_MCONTEXT + 28*4)(r4)
stw sp, (UCONTEXT_MCONTEXT + 29*4)(r4)
/* Store zero for return success. */
stw zero, (UCONTEXT_MCONTEXT + 2*4)(r4)
/* Store value "1" at uc_flags to recognize as getcontext created. */
movi r2, 1
stw r2, UCONTEXT_FLAGS(r4)
/* Store MCONTEXT_VERSION at first word of mcontext_t. */
movi r2, MCONTEXT_VERSION
stw r2, UCONTEXT_MCONTEXT(r4)
/* Get signal mask. */
/* rt_sigprocmask (SIG_BLOCK, NULL, &ucp->uc_sigmask, _NSIG8) */
movi r7, _NSIG8
addi r6, r4, UCONTEXT_SIGMASK
mov r5, zero
movi r4, SIG_BLOCK
movi r2, SYS_ify (rt_sigprocmask)
trap
bne r7, zero, SYSCALL_ERROR_LABEL
mov r2, zero
ret
PSEUDO_END(__getcontext)
weak_alias(__getcontext, getcontext)

View File

@ -0,0 +1,31 @@
/* Set flags signalling availability of kernel features based on given
kernel version number.
Copyright (C) 2009-2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include <linux/version.h>
/* The minimum supported kernel version for Nios II is 3.19.0,
guaranteeing many kernel features. */
#define __ASSUME_ACCEPT4_SYSCALL 1
#define __ASSUME_RECVMMSG_SYSCALL 1
#define __ASSUME_SENDMMSG_SYSCALL 1
#include_next <kernel-features.h>

View File

@ -0,0 +1,26 @@
/* Linux kernel struct rt_sigframe declaration for Nios II.
Copyright (C) 2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
/* This structure must have the same shape as the Linux kernel
equivalent. */
struct kernel_rt_sigframe
{
siginfo_t info;
struct ucontext uc;
};

View File

@ -0,0 +1,12 @@
GLIBC_2.21
GLIBC_2.21 A
__libc_memalign F
__libc_stack_end D 0x4
__stack_chk_guard D 0x4
__tls_get_addr F
_dl_mcount F
_r_debug D 0x14
calloc F
free F
malloc F
realloc F

View File

@ -0,0 +1,3 @@
GLIBC_2.21
GLIBC_2.21 A
__ctype_get_mb_cur_max F

View File

@ -0,0 +1,6 @@
GLIBC_2.21
GLIBC_2.21 A
gai_cancel F
gai_error F
gai_suspend F
getaddrinfo_a F

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,9 @@
GLIBC_2.21
GLIBC_2.21 A
crypt F
crypt_r F
encrypt F
encrypt_r F
fcrypt F
setkey F
setkey_r F

View File

@ -0,0 +1,11 @@
GLIBC_2.21
GLIBC_2.21 A
dladdr F
dladdr1 F
dlclose F
dlerror F
dlinfo F
dlmopen F
dlopen F
dlsym F
dlvsym F

View File

@ -0,0 +1,370 @@
GLIBC_2.21
GLIBC_2.21 A
_LIB_VERSION D 0x4
__acos_finite F
__acosf_finite F
__acosh_finite F
__acoshf_finite F
__asin_finite F
__asinf_finite F
__atan2_finite F
__atan2f_finite F
__atanh_finite F
__atanhf_finite F
__clog10 F
__clog10f F
__clog10l F
__cosh_finite F
__coshf_finite F
__exp10_finite F
__exp10f_finite F
__exp2_finite F
__exp2f_finite F
__exp_finite F
__expf_finite F
__finite F
__finitef F
__finitel F
__fmod_finite F
__fmodf_finite F
__fpclassify F
__fpclassifyf F
__gamma_r_finite F
__gammaf_r_finite F
__hypot_finite F
__hypotf_finite F
__issignaling F
__issignalingf F
__j0_finite F
__j0f_finite F
__j1_finite F
__j1f_finite F
__jn_finite F
__jnf_finite F
__lgamma_r_finite F
__lgammaf_r_finite F
__log10_finite F
__log10f_finite F
__log2_finite F
__log2f_finite F
__log_finite F
__logf_finite F
__pow_finite F
__powf_finite F
__remainder_finite F
__remainderf_finite F
__scalb_finite F
__scalbf_finite F
__signbit F
__signbitf F
__sinh_finite F
__sinhf_finite F
__sqrt_finite F
__sqrtf_finite F
__y0_finite F
__y0f_finite F
__y1_finite F
__y1f_finite F
__yn_finite F
__ynf_finite F
acos F
acosf F
acosh F
acoshf F
acoshl F
acosl F
asin F
asinf F
asinh F
asinhf F
asinhl F
asinl F
atan F
atan2 F
atan2f F
atan2l F
atanf F
atanh F
atanhf F
atanhl F
atanl F
cabs F
cabsf F
cabsl F
cacos F
cacosf F
cacosh F
cacoshf F
cacoshl F
cacosl F
carg F
cargf F
cargl F
casin F
casinf F
casinh F
casinhf F
casinhl F
casinl F
catan F
catanf F
catanh F
catanhf F
catanhl F
catanl F
cbrt F
cbrtf F
cbrtl F
ccos F
ccosf F
ccosh F
ccoshf F
ccoshl F
ccosl F
ceil F
ceilf F
ceill F
cexp F
cexpf F
cexpl F
cimag F
cimagf F
cimagl F
clog F
clog10 F
clog10f F
clog10l F
clogf F
clogl F
conj F
conjf F
conjl F
copysign F
copysignf F
copysignl F
cos F
cosf F
cosh F
coshf F
coshl F
cosl F
cpow F
cpowf F
cpowl F
cproj F
cprojf F
cprojl F
creal F
crealf F
creall F
csin F
csinf F
csinh F
csinhf F
csinhl F
csinl F
csqrt F
csqrtf F
csqrtl F
ctan F
ctanf F
ctanh F
ctanhf F
ctanhl F
ctanl F
drem F
dremf F
dreml F
erf F
erfc F
erfcf F
erfcl F
erff F
erfl F
exp F
exp10 F
exp10f F
exp10l F
exp2 F
exp2f F
exp2l F
expf F
expl F
expm1 F
expm1f F
expm1l F
fabs F
fabsf F
fabsl F
fdim F
fdimf F
fdiml F
feclearexcept F
fedisableexcept F
feenableexcept F
fegetenv F
fegetexcept F
fegetexceptflag F
fegetround F
feholdexcept F
feraiseexcept F
fesetenv F
fesetexceptflag F
fesetround F
fetestexcept F
feupdateenv F
finite F
finitef F
finitel F
floor F
floorf F
floorl F
fma F
fmaf F
fmal F
fmax F
fmaxf F
fmaxl F
fmin F
fminf F
fminl F
fmod F
fmodf F
fmodl F
frexp F
frexpf F
frexpl F
gamma F
gammaf F
gammal F
hypot F
hypotf F
hypotl F
ilogb F
ilogbf F
ilogbl F
j0 F
j0f F
j0l F
j1 F
j1f F
j1l F
jn F
jnf F
jnl F
ldexp F
ldexpf F
ldexpl F
lgamma F
lgamma_r F
lgammaf F
lgammaf_r F
lgammal F
lgammal_r F
llrint F
llrintf F
llrintl F
llround F
llroundf F
llroundl F
log F
log10 F
log10f F
log10l F
log1p F
log1pf F
log1pl F
log2 F
log2f F
log2l F
logb F
logbf F
logbl F
logf F
logl F
lrint F
lrintf F
lrintl F
lround F
lroundf F
lroundl F
matherr F
modf F
modff F
modfl F
nan F
nanf F
nanl F
nearbyint F
nearbyintf F
nearbyintl F
nextafter F
nextafterf F
nextafterl F
nexttoward F
nexttowardf F
nexttowardl F
pow F
pow10 F
pow10f F
pow10l F
powf F
powl F
remainder F
remainderf F
remainderl F
remquo F
remquof F
remquol F
rint F
rintf F
rintl F
round F
roundf F
roundl F
scalb F
scalbf F
scalbl F
scalbln F
scalblnf F
scalblnl F
scalbn F
scalbnf F
scalbnl F
signgam D 0x4
significand F
significandf F
significandl F
sin F
sincos F
sincosf F
sincosl F
sinf F
sinh F
sinhf F
sinhl F
sinl F
sqrt F
sqrtf F
sqrtl F
tan F
tanf F
tanh F
tanhf F
tanhl F
tanl F
tgamma F
tgammaf F
tgammal F
trunc F
truncf F
truncl F
y0 F
y0f F
y0l F
y1 F
y1f F
y1l F
yn F
ynf F
ynl F

View File

@ -0,0 +1,123 @@
GLIBC_2.21
GLIBC_2.21 A
__free_fdresult F
__nis_default_access F
__nis_default_group F
__nis_default_owner F
__nis_default_ttl F
__nis_finddirectory F
__nis_hash F
__nisbind_connect F
__nisbind_create F
__nisbind_destroy F
__nisbind_next F
__yp_check F
nis_add F
nis_add_entry F
nis_addmember F
nis_checkpoint F
nis_clone_directory F
nis_clone_object F
nis_clone_result F
nis_creategroup F
nis_destroy_object F
nis_destroygroup F
nis_dir_cmp F
nis_domain_of F
nis_domain_of_r F
nis_first_entry F
nis_free_directory F
nis_free_object F
nis_free_request F
nis_freenames F
nis_freeresult F
nis_freeservlist F
nis_freetags F
nis_getnames F
nis_getservlist F
nis_ismember F
nis_leaf_of F
nis_leaf_of_r F
nis_lerror F
nis_list F
nis_local_directory F
nis_local_group F
nis_local_host F
nis_local_principal F
nis_lookup F
nis_mkdir F
nis_modify F
nis_modify_entry F
nis_name_of F
nis_name_of_r F
nis_next_entry F
nis_perror F
nis_ping F
nis_print_directory F
nis_print_entry F
nis_print_group F
nis_print_group_entry F
nis_print_link F
nis_print_object F
nis_print_result F
nis_print_rights F
nis_print_table F
nis_read_obj F
nis_remove F
nis_remove_entry F
nis_removemember F
nis_rmdir F
nis_servstate F
nis_sperrno F
nis_sperror F
nis_sperror_r F
nis_stats F
nis_verifygroup F
nis_write_obj F
readColdStartFile F
writeColdStartFile F
xdr_cback_data F
xdr_domainname F
xdr_keydat F
xdr_mapname F
xdr_obj_p F
xdr_peername F
xdr_valdat F
xdr_yp_buf F
xdr_ypall F
xdr_ypbind_binding F
xdr_ypbind_resp F
xdr_ypbind_resptype F
xdr_ypbind_setdom F
xdr_ypdelete_args F
xdr_ypmap_parms F
xdr_ypmaplist F
xdr_yppush_status F
xdr_yppushresp_xfr F
xdr_ypreq_key F
xdr_ypreq_nokey F
xdr_ypreq_xfr F
xdr_ypresp_all F
xdr_ypresp_key_val F
xdr_ypresp_maplist F
xdr_ypresp_master F
xdr_ypresp_order F
xdr_ypresp_val F
xdr_ypresp_xfr F
xdr_ypstat F
xdr_ypupdate_args F
xdr_ypxfrstat F
yp_all F
yp_bind F
yp_first F
yp_get_default_domain F
yp_maplist F
yp_master F
yp_match F
yp_next F
yp_order F
yp_unbind F
yp_update F
ypbinderr_string F
yperr_string F
ypprot_err F

View File

@ -0,0 +1,224 @@
GLIBC_2.21
GLIBC_2.21 A
_IO_flockfile F
_IO_ftrylockfile F
_IO_funlockfile F
__close F
__connect F
__errno_location F
__fcntl F
__fork F
__h_errno_location F
__libc_allocate_rtsig F
__libc_current_sigrtmax F
__libc_current_sigrtmin F
__lseek F
__nanosleep F
__open F
__open64 F
__pread64 F
__pthread_cleanup_routine F
__pthread_getspecific F
__pthread_key_create F
__pthread_mutex_destroy F
__pthread_mutex_init F
__pthread_mutex_lock F
__pthread_mutex_trylock F
__pthread_mutex_unlock F
__pthread_mutexattr_destroy F
__pthread_mutexattr_init F
__pthread_mutexattr_settype F
__pthread_once F
__pthread_register_cancel F
__pthread_register_cancel_defer F
__pthread_rwlock_destroy F
__pthread_rwlock_init F
__pthread_rwlock_rdlock F
__pthread_rwlock_tryrdlock F
__pthread_rwlock_trywrlock F
__pthread_rwlock_unlock F
__pthread_rwlock_wrlock F
__pthread_setspecific F
__pthread_unregister_cancel F
__pthread_unregister_cancel_restore F
__pthread_unwind_next F
__pwrite64 F
__read F
__res_state F
__send F
__sigaction F
__wait F
__write F
_pthread_cleanup_pop F
_pthread_cleanup_pop_restore F
_pthread_cleanup_push F
_pthread_cleanup_push_defer F
accept F
close F
connect F
fcntl F
flockfile F
fork F
fsync F
ftrylockfile F
funlockfile F
longjmp F
lseek F
lseek64 F
msync F
nanosleep F
open F
open64 F
pause F
pread F
pread64 F
pthread_attr_destroy F
pthread_attr_getaffinity_np F
pthread_attr_getdetachstate F
pthread_attr_getguardsize F
pthread_attr_getinheritsched F
pthread_attr_getschedparam F
pthread_attr_getschedpolicy F
pthread_attr_getscope F
pthread_attr_getstack F
pthread_attr_getstackaddr F
pthread_attr_getstacksize F
pthread_attr_init F
pthread_attr_setaffinity_np F
pthread_attr_setdetachstate F
pthread_attr_setguardsize F
pthread_attr_setinheritsched F
pthread_attr_setschedparam F
pthread_attr_setschedpolicy F
pthread_attr_setscope F
pthread_attr_setstack F
pthread_attr_setstackaddr F
pthread_attr_setstacksize F
pthread_barrier_destroy F
pthread_barrier_init F
pthread_barrier_wait F
pthread_barrierattr_destroy F
pthread_barrierattr_getpshared F
pthread_barrierattr_init F
pthread_barrierattr_setpshared F
pthread_cancel F
pthread_cond_broadcast F
pthread_cond_destroy F
pthread_cond_init F
pthread_cond_signal F
pthread_cond_timedwait F
pthread_cond_wait F
pthread_condattr_destroy F
pthread_condattr_getclock F
pthread_condattr_getpshared F
pthread_condattr_init F
pthread_condattr_setclock F
pthread_condattr_setpshared F
pthread_create F
pthread_detach F
pthread_equal F
pthread_exit F
pthread_getaffinity_np F
pthread_getattr_default_np F
pthread_getattr_np F
pthread_getconcurrency F
pthread_getcpuclockid F
pthread_getname_np F
pthread_getschedparam F
pthread_getspecific F
pthread_join F
pthread_key_create F
pthread_key_delete F
pthread_kill F
pthread_kill_other_threads_np F
pthread_mutex_consistent F
pthread_mutex_consistent_np F
pthread_mutex_destroy F
pthread_mutex_getprioceiling F
pthread_mutex_init F
pthread_mutex_lock F
pthread_mutex_setprioceiling F
pthread_mutex_timedlock F
pthread_mutex_trylock F
pthread_mutex_unlock F
pthread_mutexattr_destroy F
pthread_mutexattr_getkind_np F
pthread_mutexattr_getprioceiling F
pthread_mutexattr_getprotocol F
pthread_mutexattr_getpshared F
pthread_mutexattr_getrobust F
pthread_mutexattr_getrobust_np F
pthread_mutexattr_gettype F
pthread_mutexattr_init F
pthread_mutexattr_setkind_np F
pthread_mutexattr_setprioceiling F
pthread_mutexattr_setprotocol F
pthread_mutexattr_setpshared F
pthread_mutexattr_setrobust F
pthread_mutexattr_setrobust_np F
pthread_mutexattr_settype F
pthread_once F
pthread_rwlock_destroy F
pthread_rwlock_init F
pthread_rwlock_rdlock F
pthread_rwlock_timedrdlock F
pthread_rwlock_timedwrlock F
pthread_rwlock_tryrdlock F
pthread_rwlock_trywrlock F
pthread_rwlock_unlock F
pthread_rwlock_wrlock F
pthread_rwlockattr_destroy F
pthread_rwlockattr_getkind_np F
pthread_rwlockattr_getpshared F
pthread_rwlockattr_init F
pthread_rwlockattr_setkind_np F
pthread_rwlockattr_setpshared F
pthread_self F
pthread_setaffinity_np F
pthread_setattr_default_np F
pthread_setcancelstate F
pthread_setcanceltype F
pthread_setconcurrency F
pthread_setname_np F
pthread_setschedparam F
pthread_setschedprio F
pthread_setspecific F
pthread_sigmask F
pthread_sigqueue F
pthread_spin_destroy F
pthread_spin_init F
pthread_spin_lock F
pthread_spin_trylock F
pthread_spin_unlock F
pthread_testcancel F
pthread_timedjoin_np F
pthread_tryjoin_np F
pthread_yield F
pwrite F
pwrite64 F
raise F
read F
recv F
recvfrom F
recvmsg F
sem_close F
sem_destroy F
sem_getvalue F
sem_init F
sem_open F
sem_post F
sem_timedwait F
sem_trywait F
sem_unlink F
sem_wait F
send F
sendmsg F
sendto F
sigaction F
siglongjmp F
sigwait F
system F
tcdrain F
wait F
waitpid F
write F

View File

@ -0,0 +1,93 @@
GLIBC_2.21
GLIBC_2.21 A
__b64_ntop F
__b64_pton F
__dn_comp F
__dn_count_labels F
__dn_expand F
__dn_skipname F
__fp_nquery F
__fp_query F
__fp_resstat F
__hostalias F
__loc_aton F
__loc_ntoa F
__p_cdname F
__p_cdnname F
__p_class F
__p_class_syms D 0x54
__p_fqname F
__p_fqnname F
__p_option F
__p_query F
__p_rcode F
__p_secstodate F
__p_time F
__p_type F
__p_type_syms D 0x228
__putlong F
__putshort F
__res_close F
__res_dnok F
__res_hnok F
__res_hostalias F
__res_isourserver F
__res_mailok F
__res_mkquery F
__res_nameinquery F
__res_nmkquery F
__res_nquery F
__res_nquerydomain F
__res_nsearch F
__res_nsend F
__res_ownok F
__res_queriesmatch F
__res_query F
__res_querydomain F
__res_search F
__res_send F
__sym_ntop F
__sym_ntos F
__sym_ston F
_gethtbyaddr F
_gethtbyname F
_gethtbyname2 F
_gethtent F
_getlong F
_getshort F
_res_opcodes D 0x40
_sethtent F
inet_net_ntop F
inet_net_pton F
inet_neta F
ns_datetosecs F
ns_format_ttl F
ns_get16 F
ns_get32 F
ns_initparse F
ns_makecanon F
ns_msg_getflag F
ns_name_compress F
ns_name_ntol F
ns_name_ntop F
ns_name_pack F
ns_name_pton F
ns_name_rollback F
ns_name_skip F
ns_name_uncompress F
ns_name_unpack F
ns_parse_ttl F
ns_parserr F
ns_put16 F
ns_put32 F
ns_samedomain F
ns_samename F
ns_skiprr F
ns_sprintrr F
ns_sprintrrf F
ns_subdomain F
res_gethostbyaddr F
res_gethostbyname F
res_gethostbyname2 F
res_send_setqhook F
res_send_setrhook F

View File

@ -0,0 +1,37 @@
GLIBC_2.21
GLIBC_2.21 A
__mq_open_2 F
aio_cancel F
aio_cancel64 F
aio_error F
aio_error64 F
aio_fsync F
aio_fsync64 F
aio_init F
aio_read F
aio_read64 F
aio_return F
aio_return64 F
aio_suspend F
aio_suspend64 F
aio_write F
aio_write64 F
lio_listio F
lio_listio64 F
mq_close F
mq_getattr F
mq_notify F
mq_open F
mq_receive F
mq_send F
mq_setattr F
mq_timedreceive F
mq_timedsend F
mq_unlink F
shm_open F
shm_unlink F
timer_create F
timer_delete F
timer_getoverrun F
timer_gettime F
timer_settime F

View File

@ -0,0 +1,42 @@
GLIBC_2.21
GLIBC_2.21 A
td_init F
td_log F
td_symbol_list F
td_ta_clear_event F
td_ta_delete F
td_ta_enable_stats F
td_ta_event_addr F
td_ta_event_getmsg F
td_ta_get_nthreads F
td_ta_get_ph F
td_ta_get_stats F
td_ta_map_id2thr F
td_ta_map_lwp2thr F
td_ta_new F
td_ta_reset_stats F
td_ta_set_event F
td_ta_setconcurrency F
td_ta_thr_iter F
td_ta_tsd_iter F
td_thr_clear_event F
td_thr_dbresume F
td_thr_dbsuspend F
td_thr_event_enable F
td_thr_event_getmsg F
td_thr_get_info F
td_thr_getfpregs F
td_thr_getgregs F
td_thr_getxregs F
td_thr_getxregsize F
td_thr_set_event F
td_thr_setfpregs F
td_thr_setgregs F
td_thr_setprio F
td_thr_setsigpending F
td_thr_setxregs F
td_thr_sigsetmask F
td_thr_tls_get_addr F
td_thr_tlsbase F
td_thr_tsd F
td_thr_validate F

View File

@ -0,0 +1,8 @@
GLIBC_2.21
GLIBC_2.21 A
forkpty F
login F
login_tty F
logout F
logwtmp F
openpty F

View File

@ -0,0 +1,35 @@
libc.so: realloc
libc.so: __eqsf2
libc.so: __floatsisf
libc.so: __ltdf2
libc.so: __gedf2
libc.so: malloc
libc.so: __nesf2
libc.so: memalign
libc.so: __mulsf3
libc.so: __floatunsisf
libc.so: __addsf3
libc.so: __fixsfsi
libc.so: __subsf3
libc.so: calloc
libc.so: __muldf3
libc.so: __signbit
libc.so: free
libc.so: __subdf3
libc.so: __adddf3
libc.so: __divdf3
libc.so: __floatsidf
libc.so: __divsf3
libc.so: __nedf2
libc.so: __eqdf2
libm.so: __signbitf
libm.so: __signbit
libm.so: matherr
# The dynamic loader uses __libc_memalign internally to allocate aligned
# TLS storage. The other malloc family of functions are expected to allow
# user symbol interposition.
ld.so: __libc_memalign
ld.so: malloc
ld.so: calloc
ld.so: realloc
ld.so: free

View File

@ -0,0 +1,79 @@
/* Create new context.
Copyright (C) 2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
#include <stdarg.h>
#include <stdint.h>
#include <ucontext.h>
/* makecontext sets up a stack and the registers for the
user context. The stack looks like this:
+-----------------------+
| padding as required |
+-----------------------+
sp -> | parameters 5 to n |
+-----------------------+
The registers are set up like this:
r4--r7 : parameter 1 to 4
r16 : uc_link
sp : stack pointer.
*/
void
__makecontext (ucontext_t *ucp, void (*func) (void), int argc, ...)
{
extern void __startcontext (void);
unsigned long *sp;
va_list ap;
int i;
sp = (unsigned long *)
((uintptr_t) ucp->uc_stack.ss_sp + ucp->uc_stack.ss_size);
/* Allocate stack arguments. */
sp -= argc < 4 ? 0 : argc - 4;
/* Keep the stack aligned. */
sp = (unsigned long*) (((uintptr_t) sp) & -4L);
/* Init version field. */
ucp->uc_mcontext.version = 2;
/* Keep uc_link in r16. */
ucp->uc_mcontext.regs[15] = (uintptr_t) ucp->uc_link;
/* Return address points to __startcontext(). */
ucp->uc_mcontext.regs[23] = (uintptr_t) &__startcontext;
/* Frame pointer is null. */
ucp->uc_mcontext.regs[24] = (uintptr_t) 0;
/* Restart in user-space starting at 'func'. */
ucp->uc_mcontext.regs[27] = (uintptr_t) func;
/* Set stack pointer. */
ucp->uc_mcontext.regs[28] = (uintptr_t) sp;
va_start (ap, argc);
for (i = 0; i < argc; ++i)
if (i < 4)
ucp->uc_mcontext.regs[i + 3] = va_arg (ap, unsigned long);
else
sp[i - 4] = va_arg (ap, unsigned long);
va_end (ap);
}
weak_alias (__makecontext, makecontext)

View File

@ -0,0 +1,2 @@
/* We can use the ix86 version. */
#include <sysdeps/unix/sysv/linux/i386/profil-counter.h>

View File

@ -0,0 +1,103 @@
/* Set current context.
Copyright (C) 2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
#include "ucontext_i.h"
/* int setcontext (const ucontext_t *ucp) */
.text
ENTRY(__setcontext)
ldw r5, UCONTEXT_FLAGS(r4)
movi r6, 1
bne r5, r6, .Lsigreturn
mov r10, r4
/* Restore signal mask. */
/* rt_sigprocmask (SIG_SETMASK, NULL, &ucp->uc_sigmask, _NSIG8) */
movi r7, _NSIG8
addi r6, r4, UCONTEXT_SIGMASK
mov r5, zero
movi r4, SIG_SETMASK
movi r2, SYS_ify (rt_sigprocmask)
trap
bne r7, zero, SYSCALL_ERROR_LABEL
/* Restore argument registers, for the makecontext() case. */
ldw r4, (UCONTEXT_MCONTEXT + 4*4)(r10)
ldw r5, (UCONTEXT_MCONTEXT + 5*4)(r10)
ldw r6, (UCONTEXT_MCONTEXT + 6*4)(r10)
ldw r7, (UCONTEXT_MCONTEXT + 7*4)(r10)
ldw r16, (UCONTEXT_MCONTEXT + 16*4)(r10)
ldw r17, (UCONTEXT_MCONTEXT + 17*4)(r10)
ldw r18, (UCONTEXT_MCONTEXT + 18*4)(r10)
ldw r19, (UCONTEXT_MCONTEXT + 19*4)(r10)
ldw r20, (UCONTEXT_MCONTEXT + 20*4)(r10)
ldw r21, (UCONTEXT_MCONTEXT + 21*4)(r10)
ldw r22, (UCONTEXT_MCONTEXT + 22*4)(r10)
ldw ra, (UCONTEXT_MCONTEXT + 24*4)(r10)
ldw fp, (UCONTEXT_MCONTEXT + 25*4)(r10)
ldw gp, (UCONTEXT_MCONTEXT + 26*4)(r10)
/* Load address to continue execution. */
ldw r3, (UCONTEXT_MCONTEXT + 28*4)(r10)
ldw sp, (UCONTEXT_MCONTEXT + 29*4)(r10)
mov r2, zero
jmp r3
.Lsigreturn:
addi sp, sp, -RT_SIGFRAME_SIZE
cfi_adjust_cfa_offset (RT_SIGFRAME_SIZE)
addi r2, sp, RT_SIGFRAME_UCONTEXT
movi r3, UCONTEXT_SIZE-4
1:
add r6, r4, r3
ldw r5, 0(r6)
add r7, r2, r3
addi r3, r3, -4
stw r5, 0(r7)
bgt r3, zero, 1b
movi r2, SYS_ify (rt_sigreturn)
trap
addi sp, sp, RT_SIGFRAME_SIZE
cfi_adjust_cfa_offset (-RT_SIGFRAME_SIZE)
br SYSCALL_ERROR_LABEL
PSEUDO_END (__setcontext)
weak_alias (__setcontext, setcontext)
ENTRY(__startcontext)
mov r4, r16
bne r4, zero, __setcontext
/* If uc_link == zero, call _exit. */
#ifdef PIC
nextpc r22
1: movhi r8, %hiadj(_gp_got - 1b)
addi r8, r8, %lo(_gp_got - 1b)
add r22, r22, r8
ldw r8, %call(HIDDEN_JUMPTARGET(_exit))(r22)
jmp r8
#else
jmpi _exit
#endif
END(__startcontext)

View File

@ -0,0 +1,2 @@
DEFAULT GLIBC_2.21
ld=ld-linux-nios2.so.1

View File

@ -0,0 +1,35 @@
/* Nios II definitions for signal handling calling conventions.
Copyright (C) 2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include <sys/ucontext.h>
#include "kernel-features.h"
#define SIGCONTEXT siginfo_t *_si, struct ucontext *
#define GET_PC(ctx) ((void *) (ctx)->uc_mcontext.regs[27])
/* There is no reliable way to get the sigcontext unless we use a
three-argument signal handler. */
#define __sigaction(sig, act, oact) ({ \
(act)->sa_flags |= SA_SIGINFO; \
(__sigaction) (sig, act, oact); \
})
#define sigaction(sig, act, oact) ({ \
(act)->sa_flags |= SA_SIGINFO; \
(sigaction) (sig, act, oact); \
})

View File

@ -0,0 +1,125 @@
/* Modify saved context.
Copyright (C) 2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
#include "ucontext_i.h"
/* int swapcontext (ucontext_t *oucp, const ucontext_t *ucp) */
.text
ENTRY(__swapcontext)
/* Same as getcontext(). */
stw r16, (UCONTEXT_MCONTEXT + 16*4)(r4)
stw r17, (UCONTEXT_MCONTEXT + 17*4)(r4)
stw r18, (UCONTEXT_MCONTEXT + 18*4)(r4)
stw r19, (UCONTEXT_MCONTEXT + 19*4)(r4)
stw r20, (UCONTEXT_MCONTEXT + 20*4)(r4)
stw r21, (UCONTEXT_MCONTEXT + 21*4)(r4)
stw r22, (UCONTEXT_MCONTEXT + 22*4)(r4)
stw ra, (UCONTEXT_MCONTEXT + 24*4)(r4)
stw fp, (UCONTEXT_MCONTEXT + 25*4)(r4)
stw gp, (UCONTEXT_MCONTEXT + 26*4)(r4)
/* Store return address at place for EA. */
stw ra, (UCONTEXT_MCONTEXT + 28*4)(r4)
stw sp, (UCONTEXT_MCONTEXT + 29*4)(r4)
/* Store zero for return success. */
stw zero, (UCONTEXT_MCONTEXT + 2*4)(r4)
/* Store value "1" at uc_flags to recognize as getcontext created. */
movi r2, 1
stw r2, UCONTEXT_FLAGS(r4)
/* Store MCONTEXT_VERSION at first word of mcontext_t. */
movi r2, MCONTEXT_VERSION
stw r2, UCONTEXT_MCONTEXT(r4)
/* Save ucp to non-argument syscall preserved register. */
mov r10, r5
/* Get signal mask. */
/* rt_sigprocmask (SIG_BLOCK, NULL, &ucp->uc_sigmask, _NSIG8) */
movi r7, _NSIG8
addi r6, r4, UCONTEXT_SIGMASK
mov r5, zero
movi r4, SIG_BLOCK
movi r2, SYS_ify (rt_sigprocmask)
trap
bne r7, zero, SYSCALL_ERROR_LABEL
/* Same as setcontext(). */
ldw r5, UCONTEXT_FLAGS(r10)
movi r6, 1
bne r5, r6, .Lsigreturn
/* Restore signal mask. */
/* rt_sigprocmask (SIG_SETMASK, NULL, &ucp->uc_sigmask, _NSIG8) */
movi r7, _NSIG8
addi r6, r10, UCONTEXT_SIGMASK
mov r5, zero
movi r4, SIG_SETMASK
movi r2, SYS_ify (rt_sigprocmask)
trap
bne r7, zero, SYSCALL_ERROR_LABEL
/* Restore argument registers, for the makecontext() case. */
ldw r4, (UCONTEXT_MCONTEXT + 4*4)(r10)
ldw r5, (UCONTEXT_MCONTEXT + 5*4)(r10)
ldw r6, (UCONTEXT_MCONTEXT + 6*4)(r10)
ldw r7, (UCONTEXT_MCONTEXT + 7*4)(r10)
ldw r16, (UCONTEXT_MCONTEXT + 16*4)(r10)
ldw r17, (UCONTEXT_MCONTEXT + 17*4)(r10)
ldw r18, (UCONTEXT_MCONTEXT + 18*4)(r10)
ldw r19, (UCONTEXT_MCONTEXT + 19*4)(r10)
ldw r20, (UCONTEXT_MCONTEXT + 20*4)(r10)
ldw r21, (UCONTEXT_MCONTEXT + 21*4)(r10)
ldw r22, (UCONTEXT_MCONTEXT + 22*4)(r10)
ldw ra, (UCONTEXT_MCONTEXT + 24*4)(r10)
ldw fp, (UCONTEXT_MCONTEXT + 25*4)(r10)
ldw gp, (UCONTEXT_MCONTEXT + 26*4)(r10)
/* Load address to continue execution. */
ldw r3, (UCONTEXT_MCONTEXT + 28*4)(r10)
ldw sp, (UCONTEXT_MCONTEXT + 29*4)(r10)
mov r2, zero
jmp r3
.Lsigreturn:
addi sp, sp, -RT_SIGFRAME_SIZE
cfi_adjust_cfa_offset (RT_SIGFRAME_SIZE)
addi r2, sp, RT_SIGFRAME_UCONTEXT
movi r3, UCONTEXT_SIZE-4
1:
add r6, r4, r3
ldw r5, 0(r6)
add r7, r2, r3
addi r3, r3, -4
stw r5, 0(r7)
bgt r3, zero, 1b
movi r2, SYS_ify (rt_sigreturn)
trap
addi sp, sp, RT_SIGFRAME_SIZE
cfi_adjust_cfa_offset (-RT_SIGFRAME_SIZE)
br SYSCALL_ERROR_LABEL
PSEUDO_END (__swapcontext)
weak_alias (__swapcontext, swapcontext)

View File

@ -0,0 +1,36 @@
/* cacheflush - flush contents of instruction and/or data cache.
Copyright (C) 2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library. If not, see
<http://www.gnu.org/licenses/>. */
#ifndef _SYS_CACHECTL_H
#define _SYS_CACHECTL_H 1
#include <features.h>
/* Get the kernel definition for the op bits. */
#include <asm/cachectl.h>
__BEGIN_DECLS
#ifdef __USE_MISC
extern int cacheflush (void *__addr, const int __nbytes, const int __op) __THROW;
#endif
extern int _flush_cache (char *__addr, const int __nbytes, const int __op) __THROW;
__END_DECLS
#endif /* sys/cachectl.h */

View File

@ -0,0 +1,123 @@
/* Core image file related definitions, Nios II version.
Copyright (C) 1996-2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#ifndef _SYS_PROCFS_H
#define _SYS_PROCFS_H 1
/* This is somewhat modelled after the file of the same name on SVR4
systems. It provides a definition of the core file format for ELF
used on Linux. It doesn't have anything to do with the /proc file
system, even though Linux has one.
Anyway, the whole purpose of this file is for GDB and GDB only.
Don't read too much into it. Don't use it for anything other than
GDB unless you know what you are doing. */
#include <features.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/user.h>
__BEGIN_DECLS
/* Type for a general-purpose register. */
typedef unsigned long elf_greg_t;
/* And the whole bunch of them. We could have used `struct
user_regs' directly in the typedef, but tradition says that
the register set is an array, which does have some peculiar
semantics, so leave it that way. */
#define ELF_NGREG (sizeof (struct user_regs) / sizeof(elf_greg_t))
typedef elf_greg_t elf_gregset_t[ELF_NGREG];
/* Register set for the floating-point registers. */
typedef struct user_fpregs elf_fpregset_t;
/* Signal info. */
struct elf_siginfo
{
int si_signo; /* Signal number. */
int si_code; /* Extra code. */
int si_errno; /* Errno. */
};
/* Definitions to generate Intel SVR4-like core files. These mostly
have the same names as the SVR4 types with "elf_" tacked on the
front to prevent clashes with Linux definitions, and the typedef
forms have been avoided. This is mostly like the SVR4 structure,
but more Linuxy, with things that Linux does not support and which
GDB doesn't really use excluded. */
struct elf_prstatus
{
struct elf_siginfo pr_info; /* Info associated with signal. */
short int pr_cursig; /* Current signal. */
unsigned long int pr_sigpend; /* Set of pending signals. */
unsigned long int pr_sighold; /* Set of held signals. */
__pid_t pr_pid;
__pid_t pr_ppid;
__pid_t pr_pgrp;
__pid_t pr_sid;
struct timeval pr_utime; /* User time. */
struct timeval pr_stime; /* System time. */
struct timeval pr_cutime; /* Cumulative user time. */
struct timeval pr_cstime; /* Cumulative system time. */
elf_gregset_t pr_reg; /* GP registers. */
int pr_fpvalid; /* True if math copro being used. */
};
#define ELF_PRARGSZ (80) /* Number of chars for args. */
struct elf_prpsinfo
{
char pr_state; /* Numeric process state. */
char pr_sname; /* Char for pr_state. */
char pr_zomb; /* Zombie. */
char pr_nice; /* Nice val. */
unsigned long int pr_flag; /* Flags. */
unsigned short int pr_uid;
unsigned short int pr_gid;
int pr_pid, pr_ppid, pr_pgrp, pr_sid;
/* Lots missing */
char pr_fname[16]; /* Filename of executable. */
char pr_psargs[ELF_PRARGSZ]; /* Initial part of arg list. */
};
/* The rest of this file provides the types for emulation of the
Solaris <proc_service.h> interfaces that should be implemented by
users of libthread_db. */
/* Addresses. */
typedef void *psaddr_t;
/* Register sets. Linux has different names. */
typedef elf_gregset_t prgregset_t;
typedef elf_fpregset_t prfpregset_t;
/* We don't have any differences between processes and threads,
therefore have only one PID type. */
typedef __pid_t lwpid_t;
/* Process status and info. In the end we do provide typedefs for them. */
typedef struct elf_prstatus prstatus_t;
typedef struct elf_prpsinfo prpsinfo_t;
__END_DECLS
#endif /* sys/procfs.h */

View File

@ -0,0 +1,48 @@
/* struct ucontext definition, Nios II version.
Copyright (C) 2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
/* System V/Nios II ABI compliant context switching support. */
#ifndef _SYS_UCONTEXT_H
#define _SYS_UCONTEXT_H 1
#include <features.h>
#include <signal.h>
/* These definitions must be in sync with the kernel. */
#define MCONTEXT_VERSION 2
/* Context to describe whole processor state. */
typedef struct mcontext
{
int version;
unsigned long regs[32];
} mcontext_t;
/* Userlevel context. */
typedef struct ucontext
{
unsigned long 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,58 @@
/* ptrace register data format definitions.
Copyright (C) 1998-2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#ifndef _SYS_USER_H
#define _SYS_USER_H 1
/* The whole purpose of this file is for GDB and GDB only. Don't read
too much into it. Don't use it for anything other than GDB unless
you know what you are doing. */
struct user_fpregs
{
};
struct user_regs
{
unsigned long int uregs[49];
};
struct user
{
struct user_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 user_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_fpregs u_fp; /* Floating point registers */
struct user_fpregs *u_fp0; /* help gdb to find the FP registers. */
};
#endif /* sys/user.h */

View File

@ -0,0 +1,36 @@
/* syscall - indirect system call.
Copyright (C) 2005-2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
/* We don't need a special syscall to implement syscall(). It won't work
reliably with 64-bit arguments (but that is true on many modern platforms).
*/
ENTRY (syscall)
mov r2, r4
mov r4, r5
mov r5, r6
mov r6, r7
ldw r7, 0(sp)
ldw r8, 4(sp)
ldw r9, 8(sp)
trap
bne r7, zero, SYSCALL_ERROR_LABEL
ret
PSEUDO_END (syscall)

View File

@ -0,0 +1,141 @@
/* Assembler macros with cancellation support, Nios II version.
Copyright (C) 2003-2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
#include <tls.h>
#ifndef __ASSEMBLER__
# include <nptl/pthreadP.h>
#endif
#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
# undef PSEUDO
# define PSEUDO(name, syscall_name, args) \
.type __##syscall_name##_nocancel, @function; \
.globl __##syscall_name##_nocancel; \
__##syscall_name##_nocancel: \
cfi_startproc; \
DO_CALL (syscall_name, args); \
bne r7, zero, SYSCALL_ERROR_LABEL; \
ret; \
cfi_endproc; \
.size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
ENTRY (name) \
SINGLE_THREAD_P(r2); \
bne r2, zero, pseudo_cancel; \
DO_CALL (syscall_name, args); \
bne r7, zero, SYSCALL_ERROR_LABEL; \
ret; \
pseudo_cancel: \
SAVESTK_##args; /* save syscall args and adjust stack */ \
SAVEREG(ra, 0); /* save return address */ \
SAVEREG(r22, 4); /* save GOT pointer */ \
nextpc r22; \
1: movhi r2, %hiadj(_gp_got - 1b); \
addi r2, r2, %lo(_gp_got - 1b); \
add r22, r22, r2; \
CENABLE; \
callr r3; \
stw r2, 8(sp); /* save mask */ \
LOADARGS_##args; \
movi r2, SYS_ify(syscall_name); \
trap; \
stw r2, 12(sp); /* save syscall result */ \
stw r7, 16(sp); /* save syscall error flag */ \
ldw r4, 8(sp); /* pass mask as argument 1 */ \
CDISABLE; \
callr r3; \
ldw r7, 16(sp); /* restore syscall error flag */ \
ldw r2, 12(sp); /* restore syscall result */ \
ldw ra, 0(sp); /* restore return address */ \
ldw r22, 4(sp); /* restore GOT pointer */ \
RESTORESTK_##args; \
bne r7, zero, SYSCALL_ERROR_LABEL;
# undef PSEUDO_END
# define PSEUDO_END(sym) \
SYSCALL_ERROR_HANDLER \
END (sym)
#define SAVEREG(REG, LOC) stw REG, LOC(sp); cfi_rel_offset (REG, LOC)
#define SAVESTK(X) subi sp, sp, X; cfi_adjust_cfa_offset(X)
#define SAVESTK_0 SAVESTK(20)
#define SAVEARG_1 SAVEREG(r4, 20)
#define SAVESTK_1 SAVESTK(24); SAVEARG_1
#define SAVEARG_2 SAVEREG(r5, 24); SAVEARG_1
#define SAVESTK_2 SAVESTK(28); SAVEARG_2
#define SAVEARG_3 SAVEREG(r6, 28); SAVEARG_2
#define SAVESTK_3 SAVESTK(32); SAVEARG_3
#define SAVEARG_4 SAVEREG(r7, 32); SAVEARG_3
#define SAVESTK_4 SAVESTK(36); SAVEARG_4
#define SAVESTK_5 SAVESTK_4
#define SAVESTK_6 SAVESTK_5
#define LOADARGS_0
#define LOADARGS_1 ldw r4, 20(sp)
#define LOADARGS_2 LOADARGS_1; ldw r5, 24(sp)
#define LOADARGS_3 LOADARGS_2; ldw r6, 28(sp)
#define LOADARGS_4 LOADARGS_3; ldw r7, 32(sp)
#define LOADARGS_5 LOADARGS_4; ldw r8, 36(sp)
#define LOADARGS_6 LOADARGS_5; ldw r9, 40(sp)
#define RESTORESTK(X) addi sp, sp, X; cfi_adjust_cfa_offset(-X)
#define RESTORESTK_0 RESTORESTK(20)
#define RESTORESTK_1 RESTORESTK(24)
#define RESTORESTK_2 RESTORESTK(28)
#define RESTORESTK_3 RESTORESTK(32)
#define RESTORESTK_4 RESTORESTK(36)
#define RESTORESTK_5 RESTORESTK(36)
#define RESTORESTK_6 RESTORESTK(36)
# if IS_IN (libpthread)
# define CENABLE ldw r3, %call(__pthread_enable_asynccancel)(r22)
# define CDISABLE ldw r3, %call(__pthread_disable_asynccancel)(r22)
# elif IS_IN (librt)
# define CENABLE ldw r3, %call(__librt_enable_asynccancel)(r22)
# define CDISABLE ldw r3, %call(__librt_disable_asynccancel)(r22)
# elif IS_IN (libc)
# define CENABLE ldw r3, %call(__libc_enable_asynccancel)(r22)
# define CDISABLE ldw r3, %call(__libc_disable_asynccancel)(r22)
# else
# error Unsupported library
# endif
# ifndef __ASSEMBLER__
# define SINGLE_THREAD_P \
__builtin_expect (THREAD_GETMEM (THREAD_SELF, \
header.multiple_threads) \
== 0, 1)
# else
# define SINGLE_THREAD_P(reg) \
ldw reg, MULTIPLE_THREADS_OFFSET(r23)
#endif
#elif !defined __ASSEMBLER__
# define SINGLE_THREAD_P 1
# define NO_CANCELLATION 1
#endif
#ifndef __ASSEMBLER__
# define RTLD_SINGLE_THREAD_P \
__builtin_expect (THREAD_GETMEM (THREAD_SELF, \
header.multiple_threads) == 0, 1)
#endif

View File

@ -0,0 +1,50 @@
/* Static library error handling code fragment for Nios II.
Copyright (C) 2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
/* The following code is only used in the static library. In the shared
library, the error handling code is at the end of each function. */
#ifndef PIC
/* In the static library, the syscall stubs jump here when they detect
an error. */
# undef CALL_MCOUNT
# define CALL_MCOUNT /* Don't insert the profiling call, it clobbers r2. */
# if IS_IN (libc)
# define SYSCALL_ERROR_ERRNO __libc_errno
# else
# define SYSCALL_ERROR_ERRNO errno
# endif
.text
ENTRY (__syscall_error)
nextpc r3
1:
movhi r8, %hiadj(_gp_got - 1b)
addi r8, r8, %lo(_gp_got - 1b)
add r3, r3, r8
ldw r3, %tls_ie(SYSCALL_ERROR_ERRNO)(r3)
add r3, r23, r3
stw r2, 0(r3)
movi r2, -1
ret
END (__syscall_error)
#endif

View File

@ -0,0 +1,260 @@
/* Assembler macros for Nios II.
Copyright (C) 2000-2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#ifndef _LINUX_NIOS2_SYSDEP_H
#define _LINUX_NIOS2_SYSDEP_H 1
#include <asm/unistd.h>
#include <sysdeps/unix/sysdep.h>
#include <sysdeps/nios2/sysdep.h>
#include <sysdeps/unix/sysv/linux/generic/sysdep.h>
/* For RTLD_PRIVATE_ERRNO. */
#include <dl-sysdep.h>
#include <tls.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__
#define SYSCALL_ERROR_LABEL __local_syscall_error
#undef PSEUDO
#define PSEUDO(name, syscall_name, args) \
ENTRY (name) \
DO_CALL (syscall_name, args) \
bne r7, zero, SYSCALL_ERROR_LABEL; \
#undef PSEUDO_END
#define PSEUDO_END(name) \
SYSCALL_ERROR_HANDLER \
END (name)
#undef PSEUDO_NOERRNO
#define PSEUDO_NOERRNO(name, syscall_name, args) \
ENTRY (name) \
DO_CALL (syscall_name, args)
#undef PSEUDO_END_NOERRNO
#define PSEUDO_END_NOERRNO(name) \
END (name)
#undef ret_NOERRNO
#define ret_NOERRNO ret
#undef DO_CALL
#define DO_CALL(syscall_name, args) \
DOARGS_##args \
movi r2, SYS_ify(syscall_name); \
trap;
#if defined(__PIC__) || defined(PIC)
# if RTLD_PRIVATE_ERRNO
# define SYSCALL_ERROR_HANDLER \
SYSCALL_ERROR_LABEL: \
nextpc r3; \
1: \
movhi r8, %hiadj(rtld_errno - 1b); \
addi r8, r8, %lo(rtld_errno - 1b); \
add r3, r3, r8; \
stw r2, 0(r3); \
movi r2, -1; \
ret;
# else
# if IS_IN (libc)
# define SYSCALL_ERROR_ERRNO __libc_errno
# else
# define SYSCALL_ERROR_ERRNO errno
# endif
# define SYSCALL_ERROR_HANDLER \
SYSCALL_ERROR_LABEL: \
nextpc r3; \
1: \
movhi r8, %hiadj(_gp_got - 1b); \
addi r8, r8, %lo(_gp_got - 1b); \
add r3, r3, r8; \
ldw r3, %tls_ie(SYSCALL_ERROR_ERRNO)(r3); \
add r3, r23, r3; \
stw r2, 0(r3); \
movi r2, -1; \
ret;
# endif
#else
/* We can use a single error handler in the static library. */
#define SYSCALL_ERROR_HANDLER \
SYSCALL_ERROR_LABEL: \
jmpi __syscall_error;
#endif
#define DOARGS_0 /* nothing */
#define DOARGS_1 /* nothing */
#define DOARGS_2 /* nothing */
#define DOARGS_3 /* nothing */
#define DOARGS_4 /* nothing */
#define DOARGS_5 ldw r8, 0(sp);
#define DOARGS_6 ldw r9, 4(sp); ldw r8, 0(sp);
/* The function has to return the error code. */
#undef PSEUDO_ERRVAL
#define PSEUDO_ERRVAL(name, syscall_name, args) \
ENTRY (name) \
DO_CALL (syscall_name, args)
#undef PSEUDO_END_ERRVAL
#define PSEUDO_END_ERRVAL(name) \
END (name)
#define ret_ERRVAL ret
#else /* __ASSEMBLER__ */
/* In order to get __set_errno() definition in INLINE_SYSCALL. */
#include <errno.h>
/* Define a macro which expands into the inline wrapper code for a system
call. */
#undef INLINE_SYSCALL
#define INLINE_SYSCALL(name, nr, args...) \
({ INTERNAL_SYSCALL_DECL(err); \
unsigned int result_var = INTERNAL_SYSCALL (name, err, nr, args); \
if ( INTERNAL_SYSCALL_ERROR_P (result_var, err) ) \
{ \
__set_errno (INTERNAL_SYSCALL_ERRNO (result_var, err)); \
result_var = -1L; \
} \
(int) result_var; })
#undef INTERNAL_SYSCALL_DECL
#define INTERNAL_SYSCALL_DECL(err) unsigned int err __attribute__((unused))
#undef INTERNAL_SYSCALL_ERROR_P
#define INTERNAL_SYSCALL_ERROR_P(val, err) ((void) (val), (unsigned int) (err))
#undef INTERNAL_SYSCALL_ERRNO
#define INTERNAL_SYSCALL_ERRNO(val, err) ((void) (err), val)
#undef INTERNAL_SYSCALL_RAW
#define INTERNAL_SYSCALL_RAW(name, err, nr, args...) \
({ unsigned int _sys_result; \
{ \
/* Load argument values in temporary variables
to perform side effects like function calls
before the call-used registers are set. */ \
LOAD_ARGS_##nr (args) \
LOAD_REGS_##nr \
register int _r2 asm ("r2") = (int)(name); \
register int _err asm ("r7"); \
asm volatile ("trap" \
: "+r" (_r2), "=r" (_err) \
: ASM_ARGS_##nr \
: __SYSCALL_CLOBBERS); \
_sys_result = _r2; \
err = _err; \
} \
(int) _sys_result; })
#undef INTERNAL_SYSCALL
#define INTERNAL_SYSCALL(name, err, nr, args...) \
INTERNAL_SYSCALL_RAW(SYS_ify(name), err, nr, args)
#undef INTERNAL_SYSCALL_NCS
#define INTERNAL_SYSCALL_NCS(number, err, nr, args...) \
INTERNAL_SYSCALL_RAW(number, err, nr, args)
#define LOAD_ARGS_0()
#define LOAD_REGS_0
#define ASM_ARGS_0
#define LOAD_ARGS_1(a1) \
LOAD_ARGS_0 () \
int __arg1 = (int) (a1);
#define LOAD_REGS_1 \
register int _r4 asm ("r4") = __arg1; \
LOAD_REGS_0
#define ASM_ARGS_1 "r" (_r4)
#define LOAD_ARGS_2(a1, a2) \
LOAD_ARGS_1 (a1) \
int __arg2 = (int) (a2);
#define LOAD_REGS_2 \
register int _r5 asm ("r5") = __arg2; \
LOAD_REGS_1
#define ASM_ARGS_2 ASM_ARGS_1, "r" (_r5)
#define LOAD_ARGS_3(a1, a2, a3) \
LOAD_ARGS_2 (a1, a2) \
int __arg3 = (int) (a3);
#define LOAD_REGS_3 \
register int _r6 asm ("r6") = __arg3; \
LOAD_REGS_2
#define ASM_ARGS_3 ASM_ARGS_2, "r" (_r6)
#define LOAD_ARGS_4(a1, a2, a3, a4) \
LOAD_ARGS_3 (a1, a2, a3) \
int __arg4 = (int) (a4);
#define LOAD_REGS_4 \
register int _r7 asm ("r7") = __arg4; \
LOAD_REGS_3
#define ASM_ARGS_4 ASM_ARGS_3, "r" (_r7)
#define LOAD_ARGS_5(a1, a2, a3, a4, a5) \
LOAD_ARGS_4 (a1, a2, a3, a4) \
int __arg5 = (int) (a5);
#define LOAD_REGS_5 \
register int _r8 asm ("r8") = __arg5; \
LOAD_REGS_4
#define ASM_ARGS_5 ASM_ARGS_4, "r" (_r8)
#define LOAD_ARGS_6(a1, a2, a3, a4, a5, a6) \
LOAD_ARGS_5 (a1, a2, a3, a4, a5) \
int __arg6 = (int) (a6);
#define LOAD_REGS_6 \
register int _r9 asm ("r9") = __arg6; \
LOAD_REGS_5
#define ASM_ARGS_6 ASM_ARGS_5, "r" (_r9)
#define __SYSCALL_CLOBBERS "memory"
#endif /* __ASSEMBLER__ */
/* Pointer mangling support. */
#if IS_IN (rtld)
/* We cannot use the thread descriptor because in ld.so we use setjmp
earlier than the descriptor is initialized. */
#else
# ifdef __ASSEMBLER__
# define PTR_MANGLE_GUARD(guard) ldw guard, POINTER_GUARD(r23)
# define PTR_MANGLE(dst, src, guard) xor dst, src, guard
# define PTR_DEMANGLE(dst, src, guard) PTR_MANGLE (dst, src, guard)
# else
# define PTR_MANGLE(var) \
(var) = (__typeof (var)) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ())
# define PTR_DEMANGLE(var) PTR_MANGLE (var)
# endif
#endif
#endif /* linux/nios2/sysdep.h */

View File

@ -0,0 +1,29 @@
#include <inttypes.h>
#include <signal.h>
#include <stddef.h>
#include <sys/ucontext.h>
#include "kernel_rt_sigframe.h"
SIG_BLOCK
SIG_SETMASK
_NSIG8 (_NSIG / 8)
MCONTEXT_VERSION
-- Offsets of the fields in the kernel rt_sigframe_t structure.
#define rt_sigframe(member) offsetof (struct kernel_rt_sigframe, member)
RT_SIGFRAME_SIZE sizeof (struct kernel_rt_sigframe)
RT_SIGFRAME_UCONTEXT rt_sigframe (uc)
-- Offsets of the fields in the ucontext_t structure.
#define ucontext(member) offsetof (ucontext_t, member)
UCONTEXT_FLAGS ucontext (uc_flags)
UCONTEXT_LINK ucontext (uc_link)
UCONTEXT_STACK ucontext (uc_stack)
UCONTEXT_MCONTEXT ucontext (uc_mcontext)
UCONTEXT_SIGMASK ucontext (uc_sigmask)
UCONTEXT_SIZE sizeof (ucontext_t)

View File

@ -0,0 +1,44 @@
/* vfork for Nios II Linux.
Copyright (C) 2005-2015 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 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.
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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
#include <tcb-offsets.h>
ENTRY(__vfork)
ldw r6, PID_OFFSET(r23)
sub r7, zero, r6
bne r7, zero, 2f
movhi r7, %hi(0x80000000)
2:
stw r7, PID_OFFSET(r23)
movi r4, 0x4111 /* (CLONE_VM | CLONE_VFORK | SIGCHLD) */
mov r5, zero
DO_CALL (clone, 2)
beq r2, zero, 1f
stw r6, PID_OFFSET(r23)
1:
bne r7, zero, SYSCALL_ERROR_LABEL
ret
PSEUDO_END (__vfork)
libc_hidden_def (__vfork)
weak_alias (__vfork, vfork)