From patchwork Tue Jan 13 15:20:40 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chung-Lin Tang X-Patchwork-Id: 428472 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 56FDE140161 for ; Wed, 14 Jan 2015 02:30:06 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:message-id:date:from:mime-version:to:cc :subject:references:in-reply-to:content-type; q=dns; s=default; b= OJnnPPRt+WukkWuFx4KI+iYgNxUMUL3sivR0uctNRHTmmVoN0Wd61ESf5FaIY8UP +h53/neI6ldAuLg3USvtVWtSbmpd5iwFO+2zD5gSly7PPkzs5D2OCNKBEPLrY64X hEmrLDqctXVKzpjhvGxrd/dvg1kI56Loi70pu20wTVY= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:message-id:date:from:mime-version:to:cc :subject:references:in-reply-to:content-type; s=default; bh=E9ox s+sss4SO1Q9Mf/e8HwxVghw=; b=E6iIuhtud18r7avS3PsrCxxH5fLqJjCt9DE6 ZlAu23BCumjGfZVeWvTBc8dYM6p8pRCV/6TUgmIz6KO7RU1ZC5X2vKbi0+oXtO8G dNDfifkLYz35ik56asIWjg0RSVXqRWM7/Lb7KeiDNGnp+DVNIr9LDUtvcJhTt64u ufnONek= Received: (qmail 800 invoked by alias); 13 Jan 2015 15:20:57 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 622 invoked by uid 89); 13 Jan 2015 15:20:54 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=0.6 required=5.0 tests=AWL, BAYES_50, KAM_STOCKGEN, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=no version=3.3.2 X-HELO: relay1.mentorg.com Message-ID: <54B537C8.3090606@codesourcery.com> Date: Tue, 13 Jan 2015 23:20:40 +0800 From: Chung-Lin Tang User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Thunderbird/31.3.0 MIME-Version: 1.0 To: Joseph Myers CC: GNU C Library , Will Newton Subject: Re: [PATCH v3 1/4] Nios II port re-submission, sysdeps/nios2 References: <54B01897.1070805@codesourcery.com> In-Reply-To: On 2015/1/10 02:29 AM, Joseph Myers wrote: > On Sat, 10 Jan 2015, Chung-Lin Tang wrote: > >> * sysdeps/nios2/soft-fp/sfp-machine.h: New file. > > As Roland noted in > , soft-fp > subdirectories that are always used are redundant - the files in them can > be moved one level up, and the entries in Implies removed. Fixed. > Some new files have the copyright notice as their first line. The first > line should be a description of the file (like you have in > sysdeps/nios2/bits/setjmp.h, for example), with the copyright notice as > the next line. I've added brief descriptions to most files this time, mostly in line to what other ports have done. >> +libc { >> + GLIBC_2.20 { >> + __adddf3; __addsf3; __divdf3; __divsf3; __eqdf2; __eqsf2; __extendsfdf2; ... > > Should be GLIBC_2.21 (it's least confusing for Versions entries used only > on one system to reflect the actual symbol versions on that system, even > though references to older versions should get automatically adjusted when > glibc is built). Fixed. >> +/* XXX Until we have a better place keep the definitions here. */ >> +#define __exit_thread_inline(val) \ >> + INLINE_SYSCALL (exit, 1, (val)) > > This was removed from pthreaddef.h on 2014-05-13. Watch out for any other > such global changes for which there should be port updates.... Removed. I went over the ChangeLogs during that time again, and so far cannot find other such cases. I'll be ready to fix them should more be found. Attached is the updated patch, sysdeps/nios2 portions. Only a single change in the sfp-machine.h path in the ChangeLog, so not repeating it whole here. Thanks, Chung-Lin diff --git a/sysdeps/nios2/Implies b/sysdeps/nios2/Implies new file mode 100644 index 0000000..387a0ca --- /dev/null +++ b/sysdeps/nios2/Implies @@ -0,0 +1,3 @@ +wordsize-32 +ieee754/dbl-64 +ieee754/flt-32 diff --git a/sysdeps/nios2/Makefile b/sysdeps/nios2/Makefile new file mode 100644 index 0000000..e4e88da --- /dev/null +++ b/sysdeps/nios2/Makefile @@ -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 +# . + +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 diff --git a/sysdeps/nios2/Subdirs b/sysdeps/nios2/Subdirs new file mode 100644 index 0000000..87eadf3 --- /dev/null +++ b/sysdeps/nios2/Subdirs @@ -0,0 +1 @@ +soft-fp diff --git a/sysdeps/nios2/Versions b/sysdeps/nios2/Versions new file mode 100644 index 0000000..48a2351 --- /dev/null +++ b/sysdeps/nios2/Versions @@ -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; + } +} diff --git a/sysdeps/nios2/__longjmp.S b/sysdeps/nios2/__longjmp.S new file mode 100644 index 0000000..c5b7e19 --- /dev/null +++ b/sysdeps/nios2/__longjmp.S @@ -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 + . */ + +#include +#include + +/* __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) diff --git a/sysdeps/nios2/abort-instr.h b/sysdeps/nios2/abort-instr.h new file mode 100644 index 0000000..17502e4 --- /dev/null +++ b/sysdeps/nios2/abort-instr.h @@ -0,0 +1,2 @@ +/* An instruction which should crash any program is an unused trap. */ +#define ABORT_INSTRUCTION asm ("trap 31") diff --git a/sysdeps/nios2/backtrace.c b/sysdeps/nios2/backtrace.c new file mode 100644 index 0000000..27ce597 --- /dev/null +++ b/sysdeps/nios2/backtrace.c @@ -0,0 +1 @@ +#include diff --git a/sysdeps/nios2/bits/endian.h b/sysdeps/nios2/bits/endian.h new file mode 100644 index 0000000..164f9e4 --- /dev/null +++ b/sysdeps/nios2/bits/endian.h @@ -0,0 +1,12 @@ +/* The Nios II architecture has selectable endianness. */ + +#ifndef _ENDIAN_H +# error "Never use directly; include instead." +#endif + +#ifdef __nios2_big_endian__ +# define __BYTE_ORDER __BIG_ENDIAN +#endif +#ifdef __nios2_little_endian__ +# define __BYTE_ORDER __LITTLE_ENDIAN +#endif diff --git a/sysdeps/nios2/bits/fenv.h b/sysdeps/nios2/bits/fenv.h new file mode 100644 index 0000000..1eca40d --- /dev/null +++ b/sysdeps/nios2/bits/fenv.h @@ -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 + . */ + +#ifndef _FENV_H +# error "Never use directly; include 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) diff --git a/sysdeps/nios2/bits/link.h b/sysdeps/nios2/bits/link.h new file mode 100644 index 0000000..cd44add --- /dev/null +++ b/sysdeps/nios2/bits/link.h @@ -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 + . */ + +#ifndef _LINK_H +# error "Never include directly; use 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 diff --git a/sysdeps/nios2/bits/setjmp.h b/sysdeps/nios2/bits/setjmp.h new file mode 100644 index 0000000..d9abeb5 --- /dev/null +++ b/sysdeps/nios2/bits/setjmp.h @@ -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 + . */ + +#ifndef _NIOS2_BITS_SETJMP_H +#define _NIOS2_BITS_SETJMP_H 1 + +#if !defined(_SETJMP_H) && !defined(_PTHREAD_H) +# error "Never include directly; use 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 */ diff --git a/sysdeps/nios2/bsd-_setjmp.S b/sysdeps/nios2/bsd-_setjmp.S new file mode 100644 index 0000000..4e6a2da --- /dev/null +++ b/sysdeps/nios2/bsd-_setjmp.S @@ -0,0 +1 @@ +/* _setjmp is in setjmp.S */ diff --git a/sysdeps/nios2/bsd-setjmp.S b/sysdeps/nios2/bsd-setjmp.S new file mode 100644 index 0000000..1da848d --- /dev/null +++ b/sysdeps/nios2/bsd-setjmp.S @@ -0,0 +1 @@ +/* setjmp is in setjmp.S */ diff --git a/sysdeps/nios2/configure b/sysdeps/nios2/configure new file mode 100644 index 0000000..e820dc2 --- /dev/null +++ b/sysdeps/nios2/configure @@ -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 diff --git a/sysdeps/nios2/configure.ac b/sysdeps/nios2/configure.ac new file mode 100644 index 0000000..f05f438 --- /dev/null +++ b/sysdeps/nios2/configure.ac @@ -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 diff --git a/sysdeps/nios2/crti.S b/sysdeps/nios2/crti.S new file mode 100644 index 0000000..022d991 --- /dev/null +++ b/sysdeps/nios2/crti.S @@ -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 + . */ + +/* 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 + +#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 diff --git a/sysdeps/nios2/crtn.S b/sysdeps/nios2/crtn.S new file mode 100644 index 0000000..d348f21 --- /dev/null +++ b/sysdeps/nios2/crtn.S @@ -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 + . */ + +/* 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 diff --git a/sysdeps/nios2/dl-init.c b/sysdeps/nios2/dl-init.c new file mode 100644 index 0000000..1dae362 --- /dev/null +++ b/sysdeps/nios2/dl-init.c @@ -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 + . */ + +#include + +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; +} diff --git a/sysdeps/nios2/dl-machine.h b/sysdeps/nios2/dl-machine.h new file mode 100644 index 0000000..3efb0d7 --- /dev/null +++ b/sysdeps/nios2/dl-machine.h @@ -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 + . */ + +#ifndef dl_machine_h +#define dl_machine_h + +#define ELF_MACHINE_NAME "nios2" + +#include +#include +#include + +/* 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 ?: "", + 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 */ diff --git a/sysdeps/nios2/dl-sysdep.h b/sysdeps/nios2/dl-sysdep.h new file mode 100644 index 0000000..4f49c2d --- /dev/null +++ b/sysdeps/nios2/dl-sysdep.h @@ -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 + . */ + +#include_next + +/* _dl_argv cannot be attribute_relro, because _dl_start_user + might write into it after _dl_start returns. */ +#define DL_ARGV_NOT_RELRO 1 diff --git a/sysdeps/nios2/dl-tls.h b/sysdeps/nios2/dl-tls.h new file mode 100644 index 0000000..541e4b0 --- /dev/null +++ b/sysdeps/nios2/dl-tls.h @@ -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 + . */ + + +/* 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) diff --git a/sysdeps/nios2/dl-trampoline.S b/sysdeps/nios2/dl-trampoline.S new file mode 100644 index 0000000..e4a3f70 --- /dev/null +++ b/sysdeps/nios2/dl-trampoline.S @@ -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 + . */ + +#include +#include + + .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 diff --git a/sysdeps/nios2/gccframe.h b/sysdeps/nios2/gccframe.h new file mode 100644 index 0000000..731a269 --- /dev/null +++ b/sysdeps/nios2/gccframe.h @@ -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 + . */ + +#define FIRST_PSEUDO_REGISTER 40 + +#include diff --git a/sysdeps/nios2/gmp-mparam.h b/sysdeps/nios2/gmp-mparam.h new file mode 100644 index 0000000..67d25d3 --- /dev/null +++ b/sysdeps/nios2/gmp-mparam.h @@ -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 +. */ + +#include + +#define IEEE_DOUBLE_BIG_ENDIAN 0 diff --git a/sysdeps/nios2/jmpbuf-offsets.h b/sysdeps/nios2/jmpbuf-offsets.h new file mode 100644 index 0000000..7bbdcb6 --- /dev/null +++ b/sysdeps/nios2/jmpbuf-offsets.h @@ -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 + . */ + +/* 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 +#include +#include + +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)) diff --git a/sysdeps/nios2/jmpbuf-unwind.h b/sysdeps/nios2/jmpbuf-unwind.h new file mode 100644 index 0000000..bf7a22b --- /dev/null +++ b/sysdeps/nios2/jmpbuf-unwind.h @@ -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 + . */ + +#include +#include +#include +#include + +/* 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) diff --git a/sysdeps/nios2/ldsodefs.h b/sysdeps/nios2/ldsodefs.h new file mode 100644 index 0000000..629dbb6 --- /dev/null +++ b/sysdeps/nios2/ldsodefs.h @@ -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 + . */ + +#ifndef _NIOS2_LDSODEFS_H +#define _NIOS2_LDSODEFS_H 1 + +#include + +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 + +#endif diff --git a/sysdeps/nios2/libc-tls.c b/sysdeps/nios2/libc-tls.c new file mode 100644 index 0000000..de2d0df --- /dev/null +++ b/sysdeps/nios2/libc-tls.c @@ -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 + . */ + +#include +#include + +/* 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; +} diff --git a/sysdeps/nios2/libm-test-ulps b/sysdeps/nios2/libm-test-ulps new file mode 100644 index 0000000..0806905 --- /dev/null +++ b/sysdeps/nios2/libm-test-ulps @@ -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 diff --git a/sysdeps/nios2/machine-gmon.h b/sysdeps/nios2/machine-gmon.h new file mode 100644 index 0000000..6bec699 --- /dev/null +++ b/sysdeps/nios2/machine-gmon.h @@ -0,0 +1,65 @@ +/* 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 + . */ + +#include + +#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" \ + ); + diff --git a/sysdeps/nios2/math-tests.h b/sysdeps/nios2/math-tests.h new file mode 100644 index 0000000..5771140 --- /dev/null +++ b/sysdeps/nios2/math-tests.h @@ -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 + . */ + +/* 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 diff --git a/sysdeps/nios2/math_private.h b/sysdeps/nios2/math_private.h new file mode 100644 index 0000000..a89db44 --- /dev/null +++ b/sysdeps/nios2/math_private.h @@ -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 + 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 + +#define feraiseexcept(excepts) ({ 0; }) +#define __feraiseexcept(excepts) ({ 0; }) +#define feclearexcept(exc) ({ 0; }) + +#endif diff --git a/sysdeps/nios2/memusage.h b/sysdeps/nios2/memusage.h new file mode 100644 index 0000000..62f8ac4 --- /dev/null +++ b/sysdeps/nios2/memusage.h @@ -0,0 +1,22 @@ +/* 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 + . */ + +#define GETSP() ({ register uintptr_t stack_ptr asm ("%sp"); stack_ptr; }) + +#define uatomic32_t unsigned int + +#include diff --git a/sysdeps/nios2/nptl/Makefile b/sysdeps/nios2/nptl/Makefile new file mode 100644 index 0000000..f012c2b --- /dev/null +++ b/sysdeps/nios2/nptl/Makefile @@ -0,0 +1,21 @@ +# 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 +# . + +ifeq ($(subdir),csu) +gen-as-const-headers += tcb-offsets.sym +endif diff --git a/sysdeps/nios2/nptl/bits/pthreadtypes.h b/sysdeps/nios2/nptl/bits/pthreadtypes.h new file mode 100644 index 0000000..4a20803 --- /dev/null +++ b/sysdeps/nios2/nptl/bits/pthreadtypes.h @@ -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 + . */ + +#ifndef _BITS_PTHREADTYPES_H +#define _BITS_PTHREADTYPES_H 1 + +#include + +#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 */ diff --git a/sysdeps/nios2/nptl/bits/semaphore.h b/sysdeps/nios2/nptl/bits/semaphore.h new file mode 100644 index 0000000..aa9430e --- /dev/null +++ b/sysdeps/nios2/nptl/bits/semaphore.h @@ -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 + . */ + +#ifndef _SEMAPHORE_H +# error "Never use directly; include 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; diff --git a/sysdeps/nios2/nptl/pthread_spin_lock.c b/sysdeps/nios2/nptl/pthread_spin_lock.c new file mode 100644 index 0000000..3ea2538 --- /dev/null +++ b/sysdeps/nios2/nptl/pthread_spin_lock.c @@ -0,0 +1,23 @@ +/* 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 + . */ + +#define SPIN_LOCK_READS_BETWEEN_CMPXCHG 1000 + +/* We can't use the normal "#include " because + it will resolve to this very file. Using "sysdeps/.." as reference to the + top level directory does the job. */ +#include diff --git a/sysdeps/nios2/nptl/pthreaddef.h b/sysdeps/nios2/nptl/pthreaddef.h new file mode 100644 index 0000000..7138154 --- /dev/null +++ b/sysdeps/nios2/nptl/pthreaddef.h @@ -0,0 +1,31 @@ +/* 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 + . */ + +/* 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) diff --git a/sysdeps/nios2/nptl/tcb-offsets.sym b/sysdeps/nios2/nptl/tcb-offsets.sym new file mode 100644 index 0000000..d9ae952 --- /dev/null +++ b/sysdeps/nios2/nptl/tcb-offsets.sym @@ -0,0 +1,14 @@ +#include +#include + +-- + +-- 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)) diff --git a/sysdeps/nios2/nptl/tls.h b/sysdeps/nios2/nptl/tls.h new file mode 100644 index 0000000..465a4b9 --- /dev/null +++ b/sysdeps/nios2/nptl/tls.h @@ -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 + . */ + +#ifndef _TLS_H +#define _TLS_H 1 + +#include + +#ifndef __ASSEMBLER__ +# include +# include +# include + +/* Type for the dtv. */ +typedef union dtv +{ + size_t counter; + struct + { + void *val; + bool is_static; + } pointer; +} dtv_t; + +#else /* __ASSEMBLER__ */ +# include +#endif /* __ASSEMBLER__ */ + + +#ifndef __ASSEMBLER__ + +/* Get system call information. */ +# include + +/* 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 + +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 */ diff --git a/sysdeps/nios2/preconfigure b/sysdeps/nios2/preconfigure new file mode 100644 index 0000000..4b5bd49 --- /dev/null +++ b/sysdeps/nios2/preconfigure @@ -0,0 +1,6 @@ +case "$machine" in +nios2*) + base_machine=nios2 + machine=nios2 + ;; +esac diff --git a/sysdeps/nios2/s_fma.c b/sysdeps/nios2/s_fma.c new file mode 100644 index 0000000..d9613fa --- /dev/null +++ b/sysdeps/nios2/s_fma.c @@ -0,0 +1 @@ +#include diff --git a/sysdeps/nios2/s_fmaf.c b/sysdeps/nios2/s_fmaf.c new file mode 100644 index 0000000..aa5c9b2 --- /dev/null +++ b/sysdeps/nios2/s_fmaf.c @@ -0,0 +1 @@ +#include diff --git a/sysdeps/nios2/setjmp.S b/sysdeps/nios2/setjmp.S new file mode 100644 index 0000000..2a63c07 --- /dev/null +++ b/sysdeps/nios2/setjmp.S @@ -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 + . */ + +#include +#include + + .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) diff --git a/sysdeps/nios2/sfp-machine.h b/sysdeps/nios2/sfp-machine.h new file mode 100644 index 0000000..95eefc1 --- /dev/null +++ b/sysdeps/nios2/sfp-machine.h @@ -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 diff --git a/sysdeps/nios2/sotruss-lib.c b/sysdeps/nios2/sotruss-lib.c new file mode 100644 index 0000000..bdc6293 --- /dev/null +++ b/sysdeps/nios2/sotruss-lib.c @@ -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 + . */ + +#define HAVE_ARCH_PLTENTER +#define HAVE_ARCH_PLTEXIT + +#include + +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; +} diff --git a/sysdeps/nios2/stackguard-macros.h b/sysdeps/nios2/stackguard-macros.h new file mode 100644 index 0000000..55a5771 --- /dev/null +++ b/sysdeps/nios2/stackguard-macros.h @@ -0,0 +1,6 @@ +#include + +extern uintptr_t __stack_chk_guard; +#define STACK_CHK_GUARD __stack_chk_guard + +#define POINTER_CHK_GUARD THREAD_GET_POINTER_GUARD() diff --git a/sysdeps/nios2/stackinfo.h b/sysdeps/nios2/stackinfo.h new file mode 100644 index 0000000..3cbb0f7 --- /dev/null +++ b/sysdeps/nios2/stackinfo.h @@ -0,0 +1,32 @@ +/* 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 + . */ + +/* This file contains a bit of information about the stack allocation + of the processor. */ + +#ifndef _STACKINFO_H +#define _STACKINFO_H 1 + +#include + +/* 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 */ diff --git a/sysdeps/nios2/start.S b/sysdeps/nios2/start.S new file mode 100644 index 0000000..96cec96 --- /dev/null +++ b/sysdeps/nios2/start.S @@ -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 + . */ + +/* 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 diff --git a/sysdeps/nios2/sysdep.h b/sysdeps/nios2/sysdep.h new file mode 100644 index 0000000..6c597e5 --- /dev/null +++ b/sysdeps/nios2/sysdep.h @@ -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 + . */ + +#include + +#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__ */ diff --git a/sysdeps/nios2/tls-macros.h b/sysdeps/nios2/tls-macros.h new file mode 100644 index 0000000..7029530 --- /dev/null +++ b/sysdeps/nios2/tls-macros.h @@ -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); }) diff --git a/sysdeps/nios2/tst-audit.h b/sysdeps/nios2/tst-audit.h new file mode 100644 index 0000000..ab427a8 --- /dev/null +++ b/sysdeps/nios2/tst-audit.h @@ -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 + . */ + +#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