|  | diff -ruN glibc-2.19/scripts/config.sub glibc-2.19-riscv/scripts/config.sub | 
|  | --- glibc-2.19/scripts/config.sub	2014-02-07 01:04:38.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/scripts/config.sub	2014-12-09 16:55:55.061008453 -0800 | 
|  | @@ -301,6 +301,7 @@ | 
|  | | pdp10 | pdp11 | pj | pjl \ | 
|  | | powerpc | powerpc64 | powerpc64le | powerpcle \ | 
|  | | pyramid \ | 
|  | +	| riscv \ | 
|  | | rl78 | rx \ | 
|  | | score \ | 
|  | | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | 
|  | Binary files glibc-2.19/scripts/.config.sub.rej.swp and glibc-2.19-riscv/scripts/.config.sub.rej.swp differ | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/abort-instr.h glibc-2.19-riscv/sysdeps/riscv/abort-instr.h | 
|  | --- glibc-2.19/sysdeps/riscv/abort-instr.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/abort-instr.h	2014-12-09 16:55:03.152727766 -0800 | 
|  | @@ -0,0 +1,2 @@ | 
|  | +/* An instruction which should crash any program is a breakpoint.  */ | 
|  | +#define ABORT_INSTRUCTION asm ("unimp") | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/bits/atomic.h glibc-2.19-riscv/sysdeps/riscv/bits/atomic.h | 
|  | --- glibc-2.19/sysdeps/riscv/bits/atomic.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/bits/atomic.h	2014-12-09 16:55:03.152727766 -0800 | 
|  | @@ -0,0 +1,119 @@ | 
|  | +/* Low-level functions for atomic operations. Mips version. | 
|  | +   Copyright (C) 2005 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef _MIPS_BITS_ATOMIC_H | 
|  | +#define _MIPS_BITS_ATOMIC_H 1 | 
|  | + | 
|  | +#include <inttypes.h> | 
|  | +#include <sgidefs.h> | 
|  | + | 
|  | +typedef int32_t atomic32_t; | 
|  | +typedef uint32_t uatomic32_t; | 
|  | +typedef int_fast32_t atomic_fast32_t; | 
|  | +typedef uint_fast32_t uatomic_fast32_t; | 
|  | + | 
|  | +typedef int64_t atomic64_t; | 
|  | +typedef uint64_t uatomic64_t; | 
|  | +typedef int_fast64_t atomic_fast64_t; | 
|  | +typedef uint_fast64_t uatomic_fast64_t; | 
|  | + | 
|  | +typedef intptr_t atomicptr_t; | 
|  | +typedef uintptr_t uatomicptr_t; | 
|  | +typedef intmax_t atomic_max_t; | 
|  | +typedef uintmax_t uatomic_max_t; | 
|  | + | 
|  | +/* Atomic compare and exchange. */ | 
|  | + | 
|  | +#define atomic_compare_and_exchange_val_acq(mem, newval, oldval)         \ | 
|  | +  ({ __sync_synchronize();                      \ | 
|  | +     __sync_val_compare_and_swap(mem, oldval, newval); }) | 
|  | + | 
|  | +#define atomic_compare_and_exchange_val_rel(mem, newval, oldval)         \ | 
|  | +  ({ typeof(*mem) __prev;                       \ | 
|  | +     __prev = __sync_val_compare_and_swap(mem, value);  \ | 
|  | +     __sync_synchronize();                      \ | 
|  | +     __prev; }) | 
|  | + | 
|  | +/* Atomic exchange (without compare).  */ | 
|  | + | 
|  | +#define atomic_exchange_acq(mem, value)         \ | 
|  | +  ({ __sync_synchronize();                      \ | 
|  | +     __sync_lock_test_and_set(mem, value); }) | 
|  | + | 
|  | +#define atomic_exchange_rel(mem, value)         \ | 
|  | +  ({ typeof(*mem) __prev;                       \ | 
|  | +     __prev = __sync_lock_test_and_set(mem, value);  \ | 
|  | +     __sync_synchronize();                      \ | 
|  | +     __prev; }) | 
|  | + | 
|  | + | 
|  | +/* Atomically add value and return the previous (unincremented) value.  */ | 
|  | + | 
|  | +/* ??? Barrier semantics for atomic_exchange_and_add appear to be | 
|  | +   undefined.  Use full barrier for now, as that's safe.  */ | 
|  | +#define atomic_exchange_and_add(mem, value)             \ | 
|  | +  ({ typeof(*mem) __prev;                               \ | 
|  | +     __sync_synchronize();                              \ | 
|  | +     __prev = __sync_fetch_and_add(mem, value);         \ | 
|  | +     __sync_synchronize();                              \ | 
|  | +     __prev; }) | 
|  | + | 
|  | +#define catomic_exchange_and_add(mem, value)		\ | 
|  | +  atomic_exchange_and_add(mem, value) | 
|  | + | 
|  | +#define atomic_bit_test_set(mem, bit)                   \ | 
|  | +  ({ typeof(*mem) __prev;                               \ | 
|  | +     typeof(*mem) __mask = (typeof(*mem))1 << (bit);    \ | 
|  | +     __sync_synchronize();                              \ | 
|  | +     __prev = __sync_fetch_and_or(mem, __mask);         \ | 
|  | +     __sync_synchronize();                              \ | 
|  | +     __prev & __mask; }) | 
|  | + | 
|  | +#define asm_maxmin(which, size, res, mem, value) \ | 
|  | +  asm ("amo" which "." size "\t%0, %1, 0(%2)" : "=r"(res) : "r"(value), "r"(mem) : "memory") | 
|  | + | 
|  | +#define atomic_max(mem, value)		        	\ | 
|  | +  ({  typeof(*mem) __prev;                    		\ | 
|  | +      __sync_synchronize();                            	\ | 
|  | +      if (sizeof(*mem) == 4)				\ | 
|  | +	asm_maxmin("maxu", "s", __prev, mem, value);	\ | 
|  | +      else if(sizeof(*mem) == 8)			\ | 
|  | +	asm_maxmin("maxu", "d", __prev, mem, value);	\ | 
|  | +      else						\ | 
|  | +	abort();					\ | 
|  | +     __sync_synchronize();                              \ | 
|  | +     __prev; }) | 
|  | + | 
|  | +#define catomic_max(mem, value) atomic_max(mem, value) | 
|  | + | 
|  | +#define atomic_min(mem, value)		        	\ | 
|  | +  ({  typeof(*mem) __prev;                    		\ | 
|  | +      __sync_synchronize();                            	\ | 
|  | +      if (sizeof(*mem) == 4)				\ | 
|  | +	asm_maxmin("minu", "s", __prev, mem, value);	\ | 
|  | +      else if(sizeof(*mem) == 8)			\ | 
|  | +	asm_maxmin("minu", "d", __prev, mem, value);	\ | 
|  | +      else						\ | 
|  | +	abort();					\ | 
|  | +     __sync_synchronize();                              \ | 
|  | +     __prev; }) | 
|  | + | 
|  | +#define atomic_full_barrier() __sync_synchronize() | 
|  | + | 
|  | +#endif /* bits/atomic.h */ | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/bits/dlfcn.h glibc-2.19-riscv/sysdeps/riscv/bits/dlfcn.h | 
|  | --- glibc-2.19/sysdeps/riscv/bits/dlfcn.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/bits/dlfcn.h	2014-12-09 16:55:03.152727766 -0800 | 
|  | @@ -0,0 +1,66 @@ | 
|  | +/* System dependent definitions for run-time dynamic loading. | 
|  | +   Copyright (C) 1996, 1997, 1999, 2000, 2001, 2004 | 
|  | +	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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef _DLFCN_H | 
|  | +# error "Never use <bits/dlfcn.h> directly; include <dlfcn.h> instead." | 
|  | +#endif | 
|  | + | 
|  | +/* The MODE argument to `dlopen' contains one of the following: */ | 
|  | +#define RTLD_LAZY	0x0001	/* Lazy function call binding.  */ | 
|  | +#define RTLD_NOW	0x0002	/* Immediate function call binding.  */ | 
|  | +#define RTLD_BINDING_MASK  0x3	/* Mask of binding time value.  */ | 
|  | +#define RTLD_NOLOAD	0x00008	/* Do not load the object.  */ | 
|  | +#define RTLD_DEEPBIND	0x00010	/* Use deep binding.  */ | 
|  | + | 
|  | +/* If the following bit is set in the MODE argument to `dlopen', | 
|  | +   the symbols of the loaded object and its dependencies are made | 
|  | +   visible as if the object were linked directly into the program.  */ | 
|  | +#define RTLD_GLOBAL	0x0004 | 
|  | + | 
|  | +/* Unix98 demands the following flag which is the inverse to RTLD_GLOBAL. | 
|  | +   The implementation does this by default and so we can define the | 
|  | +   value to zero.  */ | 
|  | +#define RTLD_LOCAL      0 | 
|  | + | 
|  | +/* Do not delete object when closed.  */ | 
|  | +#define RTLD_NODELETE	0x01000 | 
|  | + | 
|  | +#ifdef __USE_GNU | 
|  | +/* To support profiling of shared objects it is a good idea to call | 
|  | +   the function found using `dlsym' using the following macro since | 
|  | +   these calls do not use the PLT.  But this would mean the dynamic | 
|  | +   loader has no chance to find out when the function is called.  The | 
|  | +   macro applies the necessary magic so that profiling is possible. | 
|  | +   Rewrite | 
|  | +	foo = (*fctp) (arg1, arg2); | 
|  | +   into | 
|  | +        foo = DL_CALL_FCT (fctp, (arg1, arg2)); | 
|  | +*/ | 
|  | +# define DL_CALL_FCT(fctp, args) \ | 
|  | +  (_dl_mcount_wrapper_check ((void *) (fctp)), (*(fctp)) args) | 
|  | + | 
|  | +__BEGIN_DECLS | 
|  | + | 
|  | +/* This function calls the profiling functions.  */ | 
|  | +extern void _dl_mcount_wrapper_check (void *__selfpc) __THROW; | 
|  | + | 
|  | +__END_DECLS | 
|  | + | 
|  | +#endif | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/bits/endian.h glibc-2.19-riscv/sysdeps/riscv/bits/endian.h | 
|  | --- glibc-2.19/sysdeps/riscv/bits/endian.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/bits/endian.h	2014-12-09 16:55:03.152727766 -0800 | 
|  | @@ -0,0 +1,13 @@ | 
|  | +/* The MIPS architecture has selectable endianness. | 
|  | +   This file is for a machine using big-endian mode.  */ | 
|  | + | 
|  | +#ifndef _ENDIAN_H | 
|  | +# error "Never use <bits/endian.h> directly; include <endian.h> instead." | 
|  | +#endif | 
|  | + | 
|  | +#if __RISCVEB | 
|  | +# define __BYTE_ORDER __BIG_ENDIAN | 
|  | +#endif | 
|  | +#if __RISCVEL | 
|  | +# define __BYTE_ORDER __LITTLE_ENDIAN | 
|  | +#endif | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/bits/fenv.h glibc-2.19-riscv/sysdeps/riscv/bits/fenv.h | 
|  | --- glibc-2.19/sysdeps/riscv/bits/fenv.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/bits/fenv.h	2014-12-09 16:55:03.152727766 -0800 | 
|  | @@ -0,0 +1,77 @@ | 
|  | +/* Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | + | 
|  | +   The GNU C Library is free software; you can redistribute it and/or | 
|  | +   modify it under the terms of the GNU 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef _FENV_H | 
|  | +# error "Never use <bits/fenv.h> directly; include <fenv.h> instead." | 
|  | +#endif | 
|  | + | 
|  | + | 
|  | +/* Define bits representing the exception.  We use the bit positions | 
|  | +   of the appropriate bits in the FPU control word.  */ | 
|  | +enum | 
|  | +  { | 
|  | +    FE_INEXACT = 0x04, | 
|  | +#define FE_INEXACT	FE_INEXACT | 
|  | +    FE_UNDERFLOW = 0x08, | 
|  | +#define FE_UNDERFLOW	FE_UNDERFLOW | 
|  | +    FE_OVERFLOW = 0x10, | 
|  | +#define FE_OVERFLOW	FE_OVERFLOW | 
|  | +    FE_DIVBYZERO = 0x20, | 
|  | +#define FE_DIVBYZERO	FE_DIVBYZERO | 
|  | +    FE_INVALID = 0x40, | 
|  | +#define FE_INVALID	FE_INVALID | 
|  | +  }; | 
|  | + | 
|  | +#define FE_ALL_EXCEPT \ | 
|  | +	(FE_INEXACT | FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW | FE_INVALID) | 
|  | + | 
|  | +/* The MIPS FPU supports all of the four defined rounding modes.  We | 
|  | +   use again the bit positions in the FPU control word as the values | 
|  | +   for the appropriate macros.  */ | 
|  | +enum | 
|  | +  { | 
|  | +    FE_TONEAREST = 0x0, | 
|  | +#define FE_TONEAREST	FE_TONEAREST | 
|  | +    FE_TOWARDZERO = 0x1, | 
|  | +#define FE_TOWARDZERO	FE_TOWARDZERO | 
|  | +    FE_UPWARD = 0x2, | 
|  | +#define FE_UPWARD	FE_UPWARD | 
|  | +    FE_DOWNWARD = 0x3 | 
|  | +#define FE_DOWNWARD	FE_DOWNWARD | 
|  | +  }; | 
|  | + | 
|  | + | 
|  | +/* Type representing exception flags.  */ | 
|  | +typedef unsigned short int fexcept_t; | 
|  | + | 
|  | + | 
|  | +/* Type representing floating-point environment.  This function corresponds | 
|  | +   to the layout of the block written by the `fstenv'.  */ | 
|  | +typedef struct | 
|  | +  { | 
|  | +    unsigned int __fp_control_register; | 
|  | +  } | 
|  | +fenv_t; | 
|  | + | 
|  | +/* If the default argument is used we use this value.  */ | 
|  | +#define FE_DFL_ENV	((__const fenv_t *) -1) | 
|  | + | 
|  | +#ifdef __USE_GNU | 
|  | +/* Floating-point environment where none of the exception is masked.  */ | 
|  | +# define FE_NOMASK_ENV  ((__const fenv_t *) -2) | 
|  | +#endif | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/bits/ipctypes.h glibc-2.19-riscv/sysdeps/riscv/bits/ipctypes.h | 
|  | --- glibc-2.19/sysdeps/riscv/bits/ipctypes.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/bits/ipctypes.h	2014-12-09 16:55:03.152727766 -0800 | 
|  | @@ -0,0 +1,32 @@ | 
|  | +/* bits/ipctypes.h -- Define some types used by SysV IPC/MSG/SHM.  MIPS version | 
|  | +   Copyright (C) 2002 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +/* | 
|  | + * Never include <bits/ipctypes.h> directly. | 
|  | + */ | 
|  | + | 
|  | +#ifndef _BITS_IPCTYPES_H | 
|  | +#define _BITS_IPCTYPES_H	1 | 
|  | + | 
|  | +#include <bits/types.h> | 
|  | + | 
|  | +typedef __SLONG32_TYPE __ipc_pid_t; | 
|  | + | 
|  | + | 
|  | +#endif /* bits/ipctypes.h */ | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/bits/link.h glibc-2.19-riscv/sysdeps/riscv/bits/link.h | 
|  | --- glibc-2.19/sysdeps/riscv/bits/link.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/bits/link.h	2014-12-09 16:55:03.152727766 -0800 | 
|  | @@ -0,0 +1,76 @@ | 
|  | +/* Copyright (C) 2005, 2009 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef	_LINK_H | 
|  | +# error "Never include <bits/link.h> directly; use <link.h> instead." | 
|  | +#endif | 
|  | + | 
|  | +typedef struct La_mips_64_regs | 
|  | +{ | 
|  | +  unsigned long lr_reg[8]; /* $a0 through $a7 */ | 
|  | +  double lr_fpreg[8]; /* $f4 throgh $f11 */ | 
|  | +  unsigned long lr_ra; | 
|  | +  unsigned long lr_sp; | 
|  | +} La_mips_64_regs; | 
|  | + | 
|  | +/* Return values for calls from PLT on MIPS.  */ | 
|  | +typedef struct La_mips_64_retval | 
|  | +{ | 
|  | +  unsigned long lrv_v0; | 
|  | +  unsigned long lrv_v1; | 
|  | +  double lrv_fv0; | 
|  | +  double lrv_fv1; | 
|  | +} La_mips_64_retval; | 
|  | + | 
|  | +__BEGIN_DECLS | 
|  | + | 
|  | +#if _RISCV_SIM == _ABI32 | 
|  | + | 
|  | +extern Elf32_Addr la_mips_n32_gnu_pltenter (Elf32_Sym *__sym, unsigned int __ndx, | 
|  | +					    uintptr_t *__refcook, | 
|  | +					    uintptr_t *__defcook, | 
|  | +					    La_mips_64_regs *__regs, | 
|  | +					    unsigned int *__flags, | 
|  | +					    const char *__symname, | 
|  | +					    long int *__framesizep); | 
|  | +extern unsigned int la_mips_n32_gnu_pltexit (Elf32_Sym *__sym, unsigned int __ndx, | 
|  | +					     uintptr_t *__refcook, | 
|  | +					     uintptr_t *__defcook, | 
|  | +					     const La_mips_64_regs *__inregs, | 
|  | +					     La_mips_64_retval *__outregs, | 
|  | +					     const char *__symname); | 
|  | + | 
|  | +#else | 
|  | + | 
|  | +extern Elf64_Addr la_mips_n64_gnu_pltenter (Elf64_Sym *__sym, unsigned int __ndx, | 
|  | +					    uintptr_t *__refcook, | 
|  | +					    uintptr_t *__defcook, | 
|  | +					    La_mips_64_regs *__regs, | 
|  | +					    unsigned int *__flags, | 
|  | +					    const char *__symname, | 
|  | +					    long int *__framesizep); | 
|  | +extern unsigned int la_mips_n64_gnu_pltexit (Elf64_Sym *__sym, unsigned int __ndx, | 
|  | +					     uintptr_t *__refcook, | 
|  | +					     uintptr_t *__defcook, | 
|  | +					     const La_mips_64_regs *__inregs, | 
|  | +					     La_mips_64_retval *__outregs, | 
|  | +					     const char *__symname); | 
|  | + | 
|  | +#endif | 
|  | + | 
|  | +__END_DECLS | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/bits/linkmap.h glibc-2.19-riscv/sysdeps/riscv/bits/linkmap.h | 
|  | --- glibc-2.19/sysdeps/riscv/bits/linkmap.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/bits/linkmap.h	2014-12-09 16:55:03.152727766 -0800 | 
|  | @@ -0,0 +1,4 @@ | 
|  | +struct link_map_machine | 
|  | +  { | 
|  | +    ElfW(Addr) plt; /* Address of .plt */ | 
|  | +  }; | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/bits/mathdef.h glibc-2.19-riscv/sysdeps/riscv/bits/mathdef.h | 
|  | --- glibc-2.19/sysdeps/riscv/bits/mathdef.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/bits/mathdef.h	2014-12-09 16:55:03.152727766 -0800 | 
|  | @@ -0,0 +1,45 @@ | 
|  | +/* Copyright (C) 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2007 | 
|  | +	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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#if !defined _MATH_H && !defined _COMPLEX_H | 
|  | +# error "Never use <bits/mathdef.h> directly; include <math.h> instead" | 
|  | +#endif | 
|  | + | 
|  | +#include <sgidefs.h> | 
|  | + | 
|  | +#if defined  __USE_ISOC99 && defined _MATH_H && !defined _MATH_H_MATHDEF | 
|  | +# define _MATH_H_MATHDEF	1 | 
|  | + | 
|  | +/* MIPS has `float' and `double' operations.  */ | 
|  | +typedef float float_t;		/* `float' expressions are evaluated as | 
|  | +				   `float'.  */ | 
|  | +typedef double double_t;	/* `double' expressions are evaluated as | 
|  | +				   `double'.  */ | 
|  | + | 
|  | +/* The values returned by `ilogb' for 0 and NaN respectively.  */ | 
|  | +# define FP_ILOGB0	(-2147483647) | 
|  | +# define FP_ILOGBNAN	2147483647 | 
|  | + | 
|  | +#endif	/* ISO C99 */ | 
|  | + | 
|  | +#if ! defined __NO_LONG_DOUBLE_MATH && _RISCV_SIM == _ABI32 | 
|  | +/* Signal that we do not really have a `long double'.  This disables the | 
|  | +   declaration of all the `long double' function variants.  */ | 
|  | +# define __NO_LONG_DOUBLE_MATH	1 | 
|  | +#endif | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/bits/nan.h glibc-2.19-riscv/sysdeps/riscv/bits/nan.h | 
|  | --- glibc-2.19/sysdeps/riscv/bits/nan.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/bits/nan.h	2014-12-09 16:55:03.156727789 -0800 | 
|  | @@ -0,0 +1,56 @@ | 
|  | +/* `NAN' constant for IEEE 754 machines. | 
|  | +   Copyright (C) 1992, 1996, 1997, 1999, 2002, 2004 | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef _MATH_H | 
|  | +# error "Never use <bits/nan.h> directly; include <math.h> instead." | 
|  | +#endif | 
|  | + | 
|  | + | 
|  | +/* IEEE Not A Number (QNaN). Note that MIPS has the QNaN and SNaN patterns | 
|  | +   reversed compared to most other architectures. The IEEE spec left | 
|  | +   the definition of this open to implementations, and for MIPS the top | 
|  | +   bit of the mantissa must be SET to indicate a SNaN.  */ | 
|  | + | 
|  | +#if __GNUC_PREREQ(3,3) | 
|  | + | 
|  | +# define NAN	(__builtin_nanf("")) | 
|  | + | 
|  | +#elif defined __GNUC__ | 
|  | + | 
|  | +# define NAN \ | 
|  | +  (__extension__                                                            \ | 
|  | +   ((union { unsigned __l __attribute__((__mode__(__SI__))); float __d; })  \ | 
|  | +    { __l: 0x7fbfffffUL }).__d) | 
|  | + | 
|  | +#else | 
|  | + | 
|  | +# include <endian.h> | 
|  | + | 
|  | +# if __BYTE_ORDER == __BIG_ENDIAN | 
|  | +#  define __nan_bytes		{ 0x7f, 0xbf, 0xff, 0xff } | 
|  | +# endif | 
|  | +# if __BYTE_ORDER == __LITTLE_ENDIAN | 
|  | +#  define __nan_bytes		{ 0xff, 0xff, 0xbf, 0x7f } | 
|  | +# endif | 
|  | + | 
|  | +static union { unsigned char __c[4]; float __d; } __nan_union = { __nan_bytes }; | 
|  | +# define NAN	(__nan_union.__d) | 
|  | + | 
|  | +#endif	/* GCC.  */ | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/bits/setjmp.h glibc-2.19-riscv/sysdeps/riscv/bits/setjmp.h | 
|  | --- glibc-2.19/sysdeps/riscv/bits/setjmp.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/bits/setjmp.h	2014-12-09 16:55:03.156727789 -0800 | 
|  | @@ -0,0 +1,43 @@ | 
|  | +/* Define the machine-dependent type `jmp_buf'.  RISC-V version. | 
|  | +   Copyright (C) 1992,1993,1995,1997,2000,2002,2003,2004,2005,2006 | 
|  | +	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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef _RISCV_BITS_SETJMP_H | 
|  | +#define _RISCV_BITS_SETJMP_H | 
|  | + | 
|  | +typedef struct __jmp_buf_internal_tag | 
|  | +  { | 
|  | +    /* Program counter.  */ | 
|  | +    long __pc; | 
|  | +    /* Callee-saved registers. */ | 
|  | +    long __regs[12]; | 
|  | +    /* Stack pointer.  */ | 
|  | +    long __sp; | 
|  | +    /* Thread pointer. */ | 
|  | +    long __tp; | 
|  | +    /* Floating point status register.  */ | 
|  | +    long __fsr; | 
|  | + | 
|  | +    /* Callee-saved floating point registers. | 
|  | +       Note that there are an even number of preceding words in this struct, | 
|  | +       so no padding will be inserted before __fpregs, even for RV32. */ | 
|  | +    double __fpregs[16]; | 
|  | +  } __jmp_buf[1]; | 
|  | + | 
|  | +#endif /* _RISCV_BITS_SETJMP_H */ | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/bits/string.h glibc-2.19-riscv/sysdeps/riscv/bits/string.h | 
|  | --- glibc-2.19/sysdeps/riscv/bits/string.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/bits/string.h	2014-12-09 16:55:03.156727789 -0800 | 
|  | @@ -0,0 +1,47 @@ | 
|  | +/* This file should provide inline versions of string functions. | 
|  | + | 
|  | +   Surround GCC-specific parts with #ifdef __GNUC__, and use `__extern_inline'. | 
|  | + | 
|  | +   This file should define __STRING_INLINES if functions are actually defined | 
|  | +   as inlines.  */ | 
|  | + | 
|  | +#ifndef _BITS_STRING_H | 
|  | +#define _BITS_STRING_H	1 | 
|  | + | 
|  | +#if defined(__GNUC__) && !defined(__cplusplus) | 
|  | + | 
|  | +#define _HAVE_STRING_ARCH_memcpy 1 | 
|  | +#define __use_memcpy_align(k, d, s, n) \ | 
|  | +  (__builtin_constant_p(n) && (n) % (k) == 0 && (n) <= 64 && \ | 
|  | +   __alignof__(d) >= (k) && __alignof__(s) >= (k)) | 
|  | +#define memcpy(d, s, n) \ | 
|  | +  (__use_memcpy_align(8, d, s, n) ? __memcpy_align8(d, s, n) : \ | 
|  | +   __use_memcpy_align(4, d, s, n) ? __memcpy_align4(d, s, n) : \ | 
|  | +   __memcpy_g(d, s, n)) | 
|  | + | 
|  | +#define __declare_memcpy_align(size, type) \ | 
|  | +  static inline void *__memcpy_align ## size(void *__restrict __dest, \ | 
|  | +                        __const void *__restrict __src, size_t __n) { \ | 
|  | +    type *__d = (type*)__dest; \ | 
|  | +    const type *__s = (const type*)__src, *__e = (const type*)(__src + __n); \ | 
|  | +    while (__s < __e) { \ | 
|  | +      type __t = *__s; \ | 
|  | +      __d++, __s++; \ | 
|  | +      *(__d-1) = __t; \ | 
|  | +    } \ | 
|  | +    return __dest; \ | 
|  | +  } | 
|  | +__declare_memcpy_align(8, long long) | 
|  | +__declare_memcpy_align(4, int) | 
|  | + | 
|  | +#ifdef _LIBC | 
|  | +extern void *__memcpy_g (void *__restrict __dest, | 
|  | +                         __const void *__restrict __src, size_t __n); | 
|  | +libc_hidden_proto (__memcpy_g) | 
|  | +#else | 
|  | +# define __memcpy_g memcpy | 
|  | +#endif | 
|  | + | 
|  | +#endif /* __GNUC__ && !__cplusplus */ | 
|  | + | 
|  | +#endif /* bits/string.h */ | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/bits/wordsize.h glibc-2.19-riscv/sysdeps/riscv/bits/wordsize.h | 
|  | --- glibc-2.19/sysdeps/riscv/bits/wordsize.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/bits/wordsize.h	2014-12-09 16:55:03.156727789 -0800 | 
|  | @@ -0,0 +1,22 @@ | 
|  | +/* Copyright (C) 2002, 2003 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#define __WORDSIZE	_RISCV_SZPTR | 
|  | +#if _RISCV_SIM == _ABI64 | 
|  | +# define __WORDSIZE_COMPAT32	1 | 
|  | +#endif | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/bsd-_setjmp.c glibc-2.19-riscv/sysdeps/riscv/bsd-_setjmp.c | 
|  | --- glibc-2.19/sysdeps/riscv/bsd-_setjmp.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/bsd-_setjmp.c	2014-12-09 16:55:03.156727789 -0800 | 
|  | @@ -0,0 +1 @@ | 
|  | +/* _setjmp is implemented in setjmp.S */ | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/bsd-setjmp.c glibc-2.19-riscv/sysdeps/riscv/bsd-setjmp.c | 
|  | --- glibc-2.19/sysdeps/riscv/bsd-setjmp.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/bsd-setjmp.c	2014-12-09 16:55:03.156727789 -0800 | 
|  | @@ -0,0 +1 @@ | 
|  | +/* setjmp is implemented in setjmp.S */ | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/dl-dtprocnum.h glibc-2.19-riscv/sysdeps/riscv/dl-dtprocnum.h | 
|  | --- glibc-2.19/sysdeps/riscv/dl-dtprocnum.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/dl-dtprocnum.h	2014-12-09 16:55:03.156727789 -0800 | 
|  | @@ -0,0 +1,22 @@ | 
|  | +/* Configuration of lookup functions.  MIPS version. | 
|  | +   Copyright (C) 2000 Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | + | 
|  | +   The GNU C Library is free software; you can redistribute it and/or | 
|  | +   modify it under the terms of the GNU 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +/* Number of extra dynamic section entries for this architecture.  By | 
|  | +   default there are none.  */ | 
|  | +#define DT_THISPROCNUM	DT_MIPS_NUM | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/dl-lookup.c glibc-2.19-riscv/sysdeps/riscv/dl-lookup.c | 
|  | --- glibc-2.19/sysdeps/riscv/dl-lookup.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/dl-lookup.c	2014-12-09 16:55:03.156727789 -0800 | 
|  | @@ -0,0 +1,1033 @@ | 
|  | +/* Look up a symbol in the loaded objects. | 
|  | +   MIPS/Linux version - special handling of non-PIC undefined symbol rules. | 
|  | +   Copyright (C) 1995-2005, 2006, 2007, 2009, 2010 | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <alloca.h> | 
|  | +#include <libintl.h> | 
|  | +#include <stdlib.h> | 
|  | +#include <string.h> | 
|  | +#include <unistd.h> | 
|  | +#include <ldsodefs.h> | 
|  | +#include <dl-hash.h> | 
|  | +#include <dl-machine.h> | 
|  | +#include <sysdep-cancel.h> | 
|  | +#include <bits/libc-lock.h> | 
|  | +#include <tls.h> | 
|  | + | 
|  | +#include <assert.h> | 
|  | + | 
|  | +#define VERSTAG(tag)	(DT_NUM + DT_THISPROCNUM + DT_VERSIONTAGIDX (tag)) | 
|  | + | 
|  | +/* We need this string more than once.  */ | 
|  | +static const char undefined_msg[] = "undefined symbol: "; | 
|  | + | 
|  | + | 
|  | +struct sym_val | 
|  | +  { | 
|  | +    const ElfW(Sym) *s; | 
|  | +    struct link_map *m; | 
|  | +  }; | 
|  | + | 
|  | + | 
|  | +#define make_string(string, rest...) \ | 
|  | +  ({									      \ | 
|  | +    const char *all[] = { string, ## rest };				      \ | 
|  | +    size_t len, cnt;							      \ | 
|  | +    char *result, *cp;							      \ | 
|  | +									      \ | 
|  | +    len = 1;								      \ | 
|  | +    for (cnt = 0; cnt < sizeof (all) / sizeof (all[0]); ++cnt)		      \ | 
|  | +      len += strlen (all[cnt]);						      \ | 
|  | +									      \ | 
|  | +    cp = result = alloca (len);						      \ | 
|  | +    for (cnt = 0; cnt < sizeof (all) / sizeof (all[0]); ++cnt)		      \ | 
|  | +      cp = __stpcpy (cp, all[cnt]);					      \ | 
|  | +									      \ | 
|  | +    result;								      \ | 
|  | +  }) | 
|  | + | 
|  | +/* Statistics function.  */ | 
|  | +#ifdef SHARED | 
|  | +# define bump_num_relocations() ++GL(dl_num_relocations) | 
|  | +#else | 
|  | +# define bump_num_relocations() ((void) 0) | 
|  | +#endif | 
|  | + | 
|  | + | 
|  | +/* Inner part of the lookup functions.  We return a value > 0 if we | 
|  | +   found the symbol, the value 0 if nothing is found and < 0 if | 
|  | +   something bad happened.  */ | 
|  | +static int | 
|  | +__attribute_noinline__ | 
|  | +do_lookup_x (const char *undef_name, uint_fast32_t new_hash, | 
|  | +	     unsigned long int *old_hash, const ElfW(Sym) *ref, | 
|  | +	     struct sym_val *result, struct r_scope_elem *scope, size_t i, | 
|  | +	     const struct r_found_version *const version, int flags, | 
|  | +	     struct link_map *skip, int type_class, struct link_map *undef_map) | 
|  | +{ | 
|  | +  size_t n = scope->r_nlist; | 
|  | +  /* Make sure we read the value before proceeding.  Otherwise we | 
|  | +     might use r_list pointing to the initial scope and r_nlist being | 
|  | +     the value after a resize.  That is the only path in dl-open.c not | 
|  | +     protected by GSCOPE.  A read barrier here might be to expensive.  */ | 
|  | +  __asm volatile ("" : "+r" (n), "+m" (scope->r_list)); | 
|  | +  struct link_map **list = scope->r_list; | 
|  | + | 
|  | +  do | 
|  | +    { | 
|  | +      /* These variables are used in the nested function.  */ | 
|  | +      Elf_Symndx symidx; | 
|  | +      int num_versions = 0; | 
|  | +      const ElfW(Sym) *versioned_sym = NULL; | 
|  | + | 
|  | +      const struct link_map *map = list[i]->l_real; | 
|  | + | 
|  | +      /* Here come the extra test needed for `_dl_lookup_symbol_skip'.  */ | 
|  | +      if (map == skip) | 
|  | +	continue; | 
|  | + | 
|  | +      /* Don't search the executable when resolving a copy reloc.  */ | 
|  | +      if ((type_class & ELF_RTYPE_CLASS_COPY) && map->l_type == lt_executable) | 
|  | +	continue; | 
|  | + | 
|  | +      /* Do not look into objects which are going to be removed.  */ | 
|  | +      if (map->l_removed) | 
|  | +	continue; | 
|  | + | 
|  | +      /* Print some debugging info if wanted.  */ | 
|  | +      if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_SYMBOLS, 0)) | 
|  | +	_dl_debug_printf ("symbol=%s;  lookup in file=%s [%lu]\n", | 
|  | +			  undef_name, | 
|  | +			  map->l_name[0] ? map->l_name : rtld_progname, | 
|  | +			  map->l_ns); | 
|  | + | 
|  | +      /* If the hash table is empty there is nothing to do here.  */ | 
|  | +      if (map->l_nbuckets == 0) | 
|  | +	continue; | 
|  | + | 
|  | +      /* The tables for this map.  */ | 
|  | +      const ElfW(Sym) *symtab = (const void *) D_PTR (map, l_info[DT_SYMTAB]); | 
|  | +      const char *strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]); | 
|  | + | 
|  | + | 
|  | +      /* Nested routine to check whether the symbol matches.  */ | 
|  | +      const ElfW(Sym) * | 
|  | +      __attribute_noinline__ | 
|  | +      check_match (const ElfW(Sym) *sym) | 
|  | +      { | 
|  | +	unsigned int stt = ELFW(ST_TYPE) (sym->st_info); | 
|  | +	assert (ELF_RTYPE_CLASS_PLT == 1); | 
|  | +	/* The semantics of zero/non-zero values of undefined symbols | 
|  | +	   differs depending on whether the non-PIC ABI is in use. | 
|  | +	   Under the non-PIC ABI, a non-zero value indicates that | 
|  | +	   there is an address reference to the symbol and thus it | 
|  | +	   must always be resolved (except when resolving a jump slot | 
|  | +	   relocation) to the PLT entry whose address is provided as | 
|  | +	   the symbol's value; a zero value indicates that this | 
|  | +	   canonical-address behaviour is not required.  Yet under the | 
|  | +	   classic MIPS psABI, a zero value indicates that there is an | 
|  | +	   address reference to the function and the dynamic linker | 
|  | +	   must resolve the symbol immediately upon loading.  To avoid | 
|  | +	   conflict, symbols for which the dynamic linker must assume | 
|  | +	   the non-PIC ABI semantics are marked with the STO_MIPS_PLT | 
|  | +	   flag.  */ | 
|  | +	if (__builtin_expect ((sym->st_value == 0 /* No value.  */ | 
|  | +			       && stt != STT_TLS) | 
|  | +			      || (sym->st_shndx == SHN_UNDEF | 
|  | +				  && !(sym->st_other & STO_MIPS_PLT)) | 
|  | +			      || (type_class & (sym->st_shndx == SHN_UNDEF)), | 
|  | +			      0)) | 
|  | +	  return NULL; | 
|  | + | 
|  | +	/* Ignore all but STT_NOTYPE, STT_OBJECT, STT_FUNC, | 
|  | +	   STT_COMMON, STT_TLS, and STT_GNU_IFUNC since these are no | 
|  | +	   code/data definitions.  */ | 
|  | +#define ALLOWED_STT \ | 
|  | +	((1 << STT_NOTYPE) | (1 << STT_OBJECT) | (1 << STT_FUNC) \ | 
|  | +	 | (1 << STT_COMMON) | (1 << STT_TLS) | (1 << STT_GNU_IFUNC)) | 
|  | +	if (__builtin_expect (((1 << stt) & ALLOWED_STT) == 0, 0)) | 
|  | +	  return NULL; | 
|  | + | 
|  | +	if (sym != ref && strcmp (strtab + sym->st_name, undef_name)) | 
|  | +	  /* Not the symbol we are looking for.  */ | 
|  | +	  return NULL; | 
|  | + | 
|  | +	const ElfW(Half) *verstab = map->l_versyms; | 
|  | +	if (version != NULL) | 
|  | +	  { | 
|  | +	    if (__builtin_expect (verstab == NULL, 0)) | 
|  | +	      { | 
|  | +		/* We need a versioned symbol but haven't found any.  If | 
|  | +		   this is the object which is referenced in the verneed | 
|  | +		   entry it is a bug in the library since a symbol must | 
|  | +		   not simply disappear. | 
|  | + | 
|  | +		   It would also be a bug in the object since it means that | 
|  | +		   the list of required versions is incomplete and so the | 
|  | +		   tests in dl-version.c haven't found a problem.*/ | 
|  | +		assert (version->filename == NULL | 
|  | +			|| ! _dl_name_match_p (version->filename, map)); | 
|  | + | 
|  | +		/* Otherwise we accept the symbol.  */ | 
|  | +	      } | 
|  | +	    else | 
|  | +	      { | 
|  | +		/* We can match the version information or use the | 
|  | +		   default one if it is not hidden.  */ | 
|  | +		ElfW(Half) ndx = verstab[symidx] & 0x7fff; | 
|  | +		if ((map->l_versions[ndx].hash != version->hash | 
|  | +		     || strcmp (map->l_versions[ndx].name, version->name)) | 
|  | +		    && (version->hidden || map->l_versions[ndx].hash | 
|  | +			|| (verstab[symidx] & 0x8000))) | 
|  | +		  /* It's not the version we want.  */ | 
|  | +		  return NULL; | 
|  | +	      } | 
|  | +	  } | 
|  | +	else | 
|  | +	  { | 
|  | +	    /* No specific version is selected.  There are two ways we | 
|  | +	       can got here: | 
|  | + | 
|  | +	       - a binary which does not include versioning information | 
|  | +	       is loaded | 
|  | + | 
|  | +	       - dlsym() instead of dlvsym() is used to get a symbol which | 
|  | +	       might exist in more than one form | 
|  | + | 
|  | +	       If the library does not provide symbol version information | 
|  | +	       there is no problem at at: we simply use the symbol if it | 
|  | +	       is defined. | 
|  | + | 
|  | +	       These two lookups need to be handled differently if the | 
|  | +	       library defines versions.  In the case of the old | 
|  | +	       unversioned application the oldest (default) version | 
|  | +	       should be used.  In case of a dlsym() call the latest and | 
|  | +	       public interface should be returned.  */ | 
|  | +	    if (verstab != NULL) | 
|  | +	      { | 
|  | +		if ((verstab[symidx] & 0x7fff) | 
|  | +		    >= ((flags & DL_LOOKUP_RETURN_NEWEST) ? 2 : 3)) | 
|  | +		  { | 
|  | +		    /* Don't accept hidden symbols.  */ | 
|  | +		    if ((verstab[symidx] & 0x8000) == 0 | 
|  | +			&& num_versions++ == 0) | 
|  | +		      /* No version so far.  */ | 
|  | +		      versioned_sym = sym; | 
|  | + | 
|  | +		    return NULL; | 
|  | +		  } | 
|  | +	      } | 
|  | +	  } | 
|  | + | 
|  | +	/* There cannot be another entry for this symbol so stop here.  */ | 
|  | +	return sym; | 
|  | +      } | 
|  | + | 
|  | +      const ElfW(Sym) *sym; | 
|  | +      const ElfW(Addr) *bitmask = map->l_gnu_bitmask; | 
|  | +      if (__builtin_expect (bitmask != NULL, 1)) | 
|  | +	{ | 
|  | +	  ElfW(Addr) bitmask_word | 
|  | +	    = bitmask[(new_hash / __ELF_NATIVE_CLASS) | 
|  | +		      & map->l_gnu_bitmask_idxbits]; | 
|  | + | 
|  | +	  unsigned int hashbit1 = new_hash & (__ELF_NATIVE_CLASS - 1); | 
|  | +	  unsigned int hashbit2 = ((new_hash >> map->l_gnu_shift) | 
|  | +				   & (__ELF_NATIVE_CLASS - 1)); | 
|  | + | 
|  | +	  if (__builtin_expect ((bitmask_word >> hashbit1) | 
|  | +				& (bitmask_word >> hashbit2) & 1, 0)) | 
|  | +	    { | 
|  | +	      Elf32_Word bucket = map->l_gnu_buckets[new_hash | 
|  | +						     % map->l_nbuckets]; | 
|  | +	      if (bucket != 0) | 
|  | +		{ | 
|  | +		  const Elf32_Word *hasharr = &map->l_gnu_chain_zero[bucket]; | 
|  | + | 
|  | +		  do | 
|  | +		    if (((*hasharr ^ new_hash) >> 1) == 0) | 
|  | +		      { | 
|  | +			symidx = hasharr - map->l_gnu_chain_zero; | 
|  | +			sym = check_match (&symtab[symidx]); | 
|  | +			if (sym != NULL) | 
|  | +			  goto found_it; | 
|  | +		      } | 
|  | +		  while ((*hasharr++ & 1u) == 0); | 
|  | +		} | 
|  | +	    } | 
|  | +	  /* No symbol found.  */ | 
|  | +	  symidx = SHN_UNDEF; | 
|  | +	} | 
|  | +      else | 
|  | +	{ | 
|  | +	  if (*old_hash == 0xffffffff) | 
|  | +	    *old_hash = _dl_elf_hash (undef_name); | 
|  | + | 
|  | +	  /* Use the old SysV-style hash table.  Search the appropriate | 
|  | +	     hash bucket in this object's symbol table for a definition | 
|  | +	     for the same symbol name.  */ | 
|  | +	  for (symidx = map->l_buckets[*old_hash % map->l_nbuckets]; | 
|  | +	       symidx != STN_UNDEF; | 
|  | +	       symidx = map->l_chain[symidx]) | 
|  | +	    { | 
|  | +	      sym = check_match (&symtab[symidx]); | 
|  | +	      if (sym != NULL) | 
|  | +		goto found_it; | 
|  | +	    } | 
|  | +	} | 
|  | + | 
|  | +      /* If we have seen exactly one versioned symbol while we are | 
|  | +	 looking for an unversioned symbol and the version is not the | 
|  | +	 default version we still accept this symbol since there are | 
|  | +	 no possible ambiguities.  */ | 
|  | +      sym = num_versions == 1 ? versioned_sym : NULL; | 
|  | + | 
|  | +      if (sym != NULL) | 
|  | +	{ | 
|  | +	found_it: | 
|  | +	  switch (__builtin_expect (ELFW(ST_BIND) (sym->st_info), STB_GLOBAL)) | 
|  | +	    { | 
|  | +	    case STB_WEAK: | 
|  | +	      /* Weak definition.  Use this value if we don't find another.  */ | 
|  | +	      if (__builtin_expect (GLRO(dl_dynamic_weak), 0)) | 
|  | +		{ | 
|  | +		  if (! result->s) | 
|  | +		    { | 
|  | +		      result->s = sym; | 
|  | +		      result->m = (struct link_map *) map; | 
|  | +		    } | 
|  | +		  break; | 
|  | +		} | 
|  | +	      /* FALLTHROUGH */ | 
|  | +	    case STB_GLOBAL: | 
|  | +	    success: | 
|  | +	      /* Global definition.  Just what we need.  */ | 
|  | +	      result->s = sym; | 
|  | +	      result->m = (struct link_map *) map; | 
|  | +	      return 1; | 
|  | + | 
|  | +	    case STB_GNU_UNIQUE:; | 
|  | +	      /* We have to determine whether we already found a | 
|  | +		 symbol with this name before.  If not then we have to | 
|  | +		 add it to the search table.  If we already found a | 
|  | +		 definition we have to use it.  */ | 
|  | +	      void enter (struct unique_sym *table, size_t size, | 
|  | +			  unsigned int hash, const char *name, | 
|  | +			  const ElfW(Sym) *sym, struct link_map *map) | 
|  | +	      { | 
|  | +		size_t idx = hash % size; | 
|  | +		size_t hash2 = 1 + hash % (size - 2); | 
|  | +		while (1) | 
|  | +		  { | 
|  | +		    if (table[idx].name == NULL) | 
|  | +		      { | 
|  | +			table[idx].hashval = hash; | 
|  | +			table[idx].name = name; | 
|  | +			if ((type_class & ELF_RTYPE_CLASS_COPY) != 0) | 
|  | +			  { | 
|  | +			    table[idx].sym = ref; | 
|  | +			    table[idx].map = undef_map; | 
|  | +			  } | 
|  | +			else | 
|  | +			  { | 
|  | +			    table[idx].sym = sym; | 
|  | +			    table[idx].map = map; | 
|  | + | 
|  | +			    if (map->l_type == lt_loaded) | 
|  | +			      /* Make sure we don't unload this object by | 
|  | +				 setting the appropriate flag.  */ | 
|  | +			      map->l_flags_1 |= DF_1_NODELETE; | 
|  | +			  } | 
|  | + | 
|  | +			return; | 
|  | +		      } | 
|  | + | 
|  | +		    idx += hash2; | 
|  | +		    if (idx >= size) | 
|  | +		      idx -= size; | 
|  | +		  } | 
|  | +	      } | 
|  | + | 
|  | +	      struct unique_sym_table *tab | 
|  | +		= &GL(dl_ns)[map->l_ns]._ns_unique_sym_table; | 
|  | + | 
|  | +	      __rtld_lock_lock_recursive (tab->lock); | 
|  | + | 
|  | +	      struct unique_sym *entries = tab->entries; | 
|  | +	      size_t size = tab->size; | 
|  | +	      if (entries != NULL) | 
|  | +		{ | 
|  | +		  size_t idx = new_hash % size; | 
|  | +		  size_t hash2 = 1 + new_hash % (size - 2); | 
|  | +		  while (1) | 
|  | +		    { | 
|  | +		      if (entries[idx].hashval == new_hash | 
|  | +			  && strcmp (entries[idx].name, undef_name) == 0) | 
|  | +			{ | 
|  | +			  result->s = entries[idx].sym; | 
|  | +			  result->m = (struct link_map *) entries[idx].map; | 
|  | +			  __rtld_lock_unlock_recursive (tab->lock); | 
|  | +			  return 1; | 
|  | +			} | 
|  | + | 
|  | +		      if (entries[idx].name == NULL) | 
|  | +			break; | 
|  | + | 
|  | +		      idx += hash2; | 
|  | +		      if (idx >= size) | 
|  | +			idx -= size; | 
|  | +		    } | 
|  | + | 
|  | +		  if (size * 3 <= tab->n_elements * 4) | 
|  | +		    { | 
|  | +		      /* Expand the table.  */ | 
|  | +#ifdef RTLD_CHECK_FOREIGN_CALL | 
|  | +		      /* This must not happen during runtime relocations.  */ | 
|  | +		      assert (!RTLD_CHECK_FOREIGN_CALL); | 
|  | +#endif | 
|  | +		      size_t newsize = _dl_higher_prime_number (size + 1); | 
|  | +		      struct unique_sym *newentries | 
|  | +			= calloc (sizeof (struct unique_sym), newsize); | 
|  | +		      if (newentries == NULL) | 
|  | +			{ | 
|  | +			nomem: | 
|  | +			  __rtld_lock_unlock_recursive (tab->lock); | 
|  | +			  _dl_fatal_printf ("out of memory\n"); | 
|  | +			} | 
|  | + | 
|  | +		      for (idx = 0; idx < size; ++idx) | 
|  | +			if (entries[idx].name != NULL) | 
|  | +			  enter (newentries, newsize, entries[idx].hashval, | 
|  | +				 entries[idx].name, entries[idx].sym, | 
|  | +				 entries[idx].map); | 
|  | + | 
|  | +		      tab->free (entries); | 
|  | +		      tab->size = newsize; | 
|  | +		      size = newsize; | 
|  | +		      entries = tab->entries = newentries; | 
|  | +		      tab->free = free; | 
|  | +		    } | 
|  | +		} | 
|  | +	      else | 
|  | +		{ | 
|  | +#ifdef RTLD_CHECK_FOREIGN_CALL | 
|  | +		  /* This must not happen during runtime relocations.  */ | 
|  | +		  assert (!RTLD_CHECK_FOREIGN_CALL); | 
|  | +#endif | 
|  | + | 
|  | +#ifdef SHARED | 
|  | +		  /* If tab->entries is NULL, but tab->size is not, it means | 
|  | +		     this is the second, conflict finding, lookup for | 
|  | +		     LD_TRACE_PRELINKING in _dl_debug_bindings.  Don't | 
|  | +		     allocate anything and don't enter anything into the | 
|  | +		     hash table.  */ | 
|  | +		  if (__builtin_expect (tab->size, 0)) | 
|  | +		    { | 
|  | +		      assert (GLRO(dl_debug_mask) & DL_DEBUG_PRELINK); | 
|  | +		      __rtld_lock_unlock_recursive (tab->lock); | 
|  | +		      goto success; | 
|  | +		    } | 
|  | +#endif | 
|  | + | 
|  | +#define INITIAL_NUNIQUE_SYM_TABLE 31 | 
|  | +		  size = INITIAL_NUNIQUE_SYM_TABLE; | 
|  | +		  entries = calloc (sizeof (struct unique_sym), size); | 
|  | +		  if (entries == NULL) | 
|  | +		    goto nomem; | 
|  | + | 
|  | +		  tab->entries = entries; | 
|  | +		  tab->size = size; | 
|  | +		  tab->free = free; | 
|  | +		} | 
|  | + | 
|  | +	      enter (entries, size, new_hash, strtab + sym->st_name, sym, | 
|  | +		     (struct link_map *) map); | 
|  | +	      ++tab->n_elements; | 
|  | + | 
|  | +	      __rtld_lock_unlock_recursive (tab->lock); | 
|  | + | 
|  | +	      goto success; | 
|  | + | 
|  | +	    default: | 
|  | +	      /* Local symbols are ignored.  */ | 
|  | +	      break; | 
|  | +	    } | 
|  | +	} | 
|  | + | 
|  | +      /* If this current map is the one mentioned in the verneed entry | 
|  | +	 and we have not found a weak entry, it is a bug.  */ | 
|  | +      if (symidx == STN_UNDEF && version != NULL && version->filename != NULL | 
|  | +	  && __builtin_expect (_dl_name_match_p (version->filename, map), 0)) | 
|  | +	return -1; | 
|  | +    } | 
|  | +  while (++i < n); | 
|  | + | 
|  | +  /* We have not found anything until now.  */ | 
|  | +  return 0; | 
|  | +} | 
|  | + | 
|  | + | 
|  | +static uint_fast32_t | 
|  | +dl_new_hash (const char *s) | 
|  | +{ | 
|  | +  uint_fast32_t h = 5381; | 
|  | +  for (unsigned char c = *s; c != '\0'; c = *++s) | 
|  | +    h = h * 33 + c; | 
|  | +  return h & 0xffffffff; | 
|  | +} | 
|  | + | 
|  | + | 
|  | +/* Add extra dependency on MAP to UNDEF_MAP.  */ | 
|  | +static int | 
|  | +internal_function | 
|  | +add_dependency (struct link_map *undef_map, struct link_map *map, int flags) | 
|  | +{ | 
|  | +  struct link_map *runp; | 
|  | +  unsigned int i; | 
|  | +  int result = 0; | 
|  | + | 
|  | +  /* Avoid self-references and references to objects which cannot be | 
|  | +     unloaded anyway.  */ | 
|  | +  if (undef_map == map) | 
|  | +    return 0; | 
|  | + | 
|  | +  /* Avoid references to objects which cannot be unloaded anyway.  */ | 
|  | +  assert (map->l_type == lt_loaded); | 
|  | +  if ((map->l_flags_1 & DF_1_NODELETE) != 0) | 
|  | +    return 0; | 
|  | + | 
|  | +  struct link_map_reldeps *l_reldeps | 
|  | +    = atomic_forced_read (undef_map->l_reldeps); | 
|  | + | 
|  | +  /* Make sure l_reldeps is read before l_initfini.  */ | 
|  | +  atomic_read_barrier (); | 
|  | + | 
|  | +  /* Determine whether UNDEF_MAP already has a reference to MAP.  First | 
|  | +     look in the normal dependencies.  */ | 
|  | +  struct link_map **l_initfini = atomic_forced_read (undef_map->l_initfini); | 
|  | +  if (l_initfini != NULL) | 
|  | +    { | 
|  | +      for (i = 0; l_initfini[i] != NULL; ++i) | 
|  | +	if (l_initfini[i] == map) | 
|  | +	  return 0; | 
|  | +    } | 
|  | + | 
|  | +  /* No normal dependency.  See whether we already had to add it | 
|  | +     to the special list of dynamic dependencies.  */ | 
|  | +  unsigned int l_reldepsact = 0; | 
|  | +  if (l_reldeps != NULL) | 
|  | +    { | 
|  | +      struct link_map **list = &l_reldeps->list[0]; | 
|  | +      l_reldepsact = l_reldeps->act; | 
|  | +      for (i = 0; i < l_reldepsact; ++i) | 
|  | +	if (list[i] == map) | 
|  | +	  return 0; | 
|  | +    } | 
|  | + | 
|  | +  /* Save serial number of the target MAP.  */ | 
|  | +  unsigned long long serial = map->l_serial; | 
|  | + | 
|  | +  /* Make sure nobody can unload the object while we are at it.  */ | 
|  | +  if (__builtin_expect (flags & DL_LOOKUP_GSCOPE_LOCK, 0)) | 
|  | +    { | 
|  | +      /* We can't just call __rtld_lock_lock_recursive (GL(dl_load_lock)) | 
|  | +	 here, that can result in ABBA deadlock.  */ | 
|  | +      THREAD_GSCOPE_RESET_FLAG (); | 
|  | +      __rtld_lock_lock_recursive (GL(dl_load_lock)); | 
|  | +      /* While MAP value won't change, after THREAD_GSCOPE_RESET_FLAG () | 
|  | +	 it can e.g. point to unallocated memory.  So avoid the optimizer | 
|  | +	 treating the above read from MAP->l_serial as ensurance it | 
|  | +	 can safely dereference it.  */ | 
|  | +      map = atomic_forced_read (map); | 
|  | + | 
|  | +      /* From this point on it is unsafe to dereference MAP, until it | 
|  | +	 has been found in one of the lists.  */ | 
|  | + | 
|  | +      /* Redo the l_initfini check in case undef_map's l_initfini | 
|  | +	 changed in the mean time.  */ | 
|  | +      if (undef_map->l_initfini != l_initfini | 
|  | +	  && undef_map->l_initfini != NULL) | 
|  | +	{ | 
|  | +	  l_initfini = undef_map->l_initfini; | 
|  | +	  for (i = 0; l_initfini[i] != NULL; ++i) | 
|  | +	    if (l_initfini[i] == map) | 
|  | +	      goto out_check; | 
|  | +	} | 
|  | + | 
|  | +      /* Redo the l_reldeps check if undef_map's l_reldeps changed in | 
|  | +	 the mean time.  */ | 
|  | +      if (undef_map->l_reldeps != NULL) | 
|  | +	{ | 
|  | +	  if (undef_map->l_reldeps != l_reldeps) | 
|  | +	    { | 
|  | +	      struct link_map **list = &undef_map->l_reldeps->list[0]; | 
|  | +	      l_reldepsact = undef_map->l_reldeps->act; | 
|  | +	      for (i = 0; i < l_reldepsact; ++i) | 
|  | +		if (list[i] == map) | 
|  | +		  goto out_check; | 
|  | +	    } | 
|  | +	  else if (undef_map->l_reldeps->act > l_reldepsact) | 
|  | +	    { | 
|  | +	      struct link_map **list | 
|  | +		= &undef_map->l_reldeps->list[0]; | 
|  | +	      i = l_reldepsact; | 
|  | +	      l_reldepsact = undef_map->l_reldeps->act; | 
|  | +	      for (; i < l_reldepsact; ++i) | 
|  | +		if (list[i] == map) | 
|  | +		  goto out_check; | 
|  | +	    } | 
|  | +	} | 
|  | +    } | 
|  | +  else | 
|  | +    __rtld_lock_lock_recursive (GL(dl_load_lock)); | 
|  | + | 
|  | +  /* The object is not yet in the dependency list.  Before we add | 
|  | +     it make sure just one more time the object we are about to | 
|  | +     reference is still available.  There is a brief period in | 
|  | +     which the object could have been removed since we found the | 
|  | +     definition.  */ | 
|  | +  runp = GL(dl_ns)[undef_map->l_ns]._ns_loaded; | 
|  | +  while (runp != NULL && runp != map) | 
|  | +    runp = runp->l_next; | 
|  | + | 
|  | +  if (runp != NULL) | 
|  | +    { | 
|  | +      /* The object is still available.  */ | 
|  | + | 
|  | +      /* MAP could have been dlclosed, freed and then some other dlopened | 
|  | +	 library could have the same link_map pointer.  */ | 
|  | +      if (map->l_serial != serial) | 
|  | +	goto out_check; | 
|  | + | 
|  | +      /* Redo the NODELETE check, as when dl_load_lock wasn't held | 
|  | +	 yet this could have changed.  */ | 
|  | +      if ((map->l_flags_1 & DF_1_NODELETE) != 0) | 
|  | +	goto out; | 
|  | + | 
|  | +      /* If the object with the undefined reference cannot be removed ever | 
|  | +	 just make sure the same is true for the object which contains the | 
|  | +	 definition.  */ | 
|  | +      if (undef_map->l_type != lt_loaded | 
|  | +	  || (undef_map->l_flags_1 & DF_1_NODELETE) != 0) | 
|  | +	{ | 
|  | +	  map->l_flags_1 |= DF_1_NODELETE; | 
|  | +	  goto out; | 
|  | +	} | 
|  | + | 
|  | +      /* Add the reference now.  */ | 
|  | +      if (__builtin_expect (l_reldepsact >= undef_map->l_reldepsmax, 0)) | 
|  | +	{ | 
|  | +	  /* Allocate more memory for the dependency list.  Since this | 
|  | +	     can never happen during the startup phase we can use | 
|  | +	     `realloc'.  */ | 
|  | +	  struct link_map_reldeps *newp; | 
|  | +	  unsigned int max | 
|  | +	    = undef_map->l_reldepsmax ? undef_map->l_reldepsmax * 2 : 10; | 
|  | + | 
|  | +#ifdef RTLD_PREPARE_FOREIGN_CALL | 
|  | +	  RTLD_PREPARE_FOREIGN_CALL; | 
|  | +#endif | 
|  | + | 
|  | +	  newp = malloc (sizeof (*newp) + max * sizeof (struct link_map *)); | 
|  | +	  if (newp == NULL) | 
|  | +	    { | 
|  | +	      /* If we didn't manage to allocate memory for the list this is | 
|  | +		 no fatal problem.  We simply make sure the referenced object | 
|  | +		 cannot be unloaded.  This is semantically the correct | 
|  | +		 behavior.  */ | 
|  | +	      map->l_flags_1 |= DF_1_NODELETE; | 
|  | +	      goto out; | 
|  | +	    } | 
|  | +	  else | 
|  | +	    { | 
|  | +	      if (l_reldepsact) | 
|  | +		memcpy (&newp->list[0], &undef_map->l_reldeps->list[0], | 
|  | +			l_reldepsact * sizeof (struct link_map *)); | 
|  | +	      newp->list[l_reldepsact] = map; | 
|  | +	      newp->act = l_reldepsact + 1; | 
|  | +	      atomic_write_barrier (); | 
|  | +	      void *old = undef_map->l_reldeps; | 
|  | +	      undef_map->l_reldeps = newp; | 
|  | +	      undef_map->l_reldepsmax = max; | 
|  | +	      if (old) | 
|  | +		_dl_scope_free (old); | 
|  | +	    } | 
|  | +	} | 
|  | +      else | 
|  | +	{ | 
|  | +	  undef_map->l_reldeps->list[l_reldepsact] = map; | 
|  | +	  atomic_write_barrier (); | 
|  | +	  undef_map->l_reldeps->act = l_reldepsact + 1; | 
|  | +	} | 
|  | + | 
|  | +      /* Display information if we are debugging.  */ | 
|  | +      if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_FILES, 0)) | 
|  | +	_dl_debug_printf ("\ | 
|  | +\nfile=%s [%lu];  needed by %s [%lu] (relocation dependency)\n\n", | 
|  | +			  map->l_name[0] ? map->l_name : rtld_progname, | 
|  | +			  map->l_ns, | 
|  | +			  undef_map->l_name[0] | 
|  | +			  ? undef_map->l_name : rtld_progname, | 
|  | +			  undef_map->l_ns); | 
|  | +    } | 
|  | +  else | 
|  | +    /* Whoa, that was bad luck.  We have to search again.  */ | 
|  | +    result = -1; | 
|  | + | 
|  | + out: | 
|  | +  /* Release the lock.  */ | 
|  | +  __rtld_lock_unlock_recursive (GL(dl_load_lock)); | 
|  | + | 
|  | +  if (__builtin_expect (flags & DL_LOOKUP_GSCOPE_LOCK, 0)) | 
|  | +    THREAD_GSCOPE_SET_FLAG (); | 
|  | + | 
|  | +  return result; | 
|  | + | 
|  | + out_check: | 
|  | +  if (map->l_serial != serial) | 
|  | +    result = -1; | 
|  | +  goto out; | 
|  | +} | 
|  | + | 
|  | +static void | 
|  | +internal_function | 
|  | +_dl_debug_bindings (const char *undef_name, struct link_map *undef_map, | 
|  | +		    const ElfW(Sym) **ref, struct sym_val *value, | 
|  | +		    const struct r_found_version *version, int type_class, | 
|  | +		    int protected); | 
|  | + | 
|  | + | 
|  | +/* Search loaded objects' symbol tables for a definition of the symbol | 
|  | +   UNDEF_NAME, perhaps with a requested version for the symbol. | 
|  | + | 
|  | +   We must never have calls to the audit functions inside this function | 
|  | +   or in any function which gets called.  If this would happen the audit | 
|  | +   code might create a thread which can throw off all the scope locking.  */ | 
|  | +lookup_t | 
|  | +internal_function | 
|  | +_dl_lookup_symbol_x (const char *undef_name, struct link_map *undef_map, | 
|  | +		     const ElfW(Sym) **ref, | 
|  | +		     struct r_scope_elem *symbol_scope[], | 
|  | +		     const struct r_found_version *version, | 
|  | +		     int type_class, int flags, struct link_map *skip_map) | 
|  | +{ | 
|  | +  const uint_fast32_t new_hash = dl_new_hash (undef_name); | 
|  | +  unsigned long int old_hash = 0xffffffff; | 
|  | +  struct sym_val current_value = { NULL, NULL }; | 
|  | +  struct r_scope_elem **scope = symbol_scope; | 
|  | + | 
|  | +  bump_num_relocations (); | 
|  | + | 
|  | +  /* No other flag than DL_LOOKUP_ADD_DEPENDENCY or DL_LOOKUP_GSCOPE_LOCK | 
|  | +     is allowed if we look up a versioned symbol.  */ | 
|  | +  assert (version == NULL | 
|  | +	  || (flags & ~(DL_LOOKUP_ADD_DEPENDENCY | DL_LOOKUP_GSCOPE_LOCK)) | 
|  | +	     == 0); | 
|  | + | 
|  | +  size_t i = 0; | 
|  | +  if (__builtin_expect (skip_map != NULL, 0)) | 
|  | +    /* Search the relevant loaded objects for a definition.  */ | 
|  | +    while ((*scope)->r_list[i] != skip_map) | 
|  | +      ++i; | 
|  | + | 
|  | +  /* Search the relevant loaded objects for a definition.  */ | 
|  | +  for (size_t start = i; *scope != NULL; start = 0, ++scope) | 
|  | +    { | 
|  | +      int res = do_lookup_x (undef_name, new_hash, &old_hash, *ref, | 
|  | +			     ¤t_value, *scope, start, version, flags, | 
|  | +			     skip_map, type_class, undef_map); | 
|  | +      if (res > 0) | 
|  | +	break; | 
|  | + | 
|  | +      if (__builtin_expect (res, 0) < 0 && skip_map == NULL) | 
|  | +	{ | 
|  | +	  /* Oh, oh.  The file named in the relocation entry does not | 
|  | +	     contain the needed symbol.  This code is never reached | 
|  | +	     for unversioned lookups.  */ | 
|  | +	  assert (version != NULL); | 
|  | +	  const char *reference_name = undef_map ? undef_map->l_name : NULL; | 
|  | + | 
|  | +	  /* XXX We cannot translate the message.  */ | 
|  | +	  _dl_signal_cerror (0, (reference_name[0] | 
|  | +				 ? reference_name | 
|  | +				 : (rtld_progname ?: "<main program>")), | 
|  | +			     N_("relocation error"), | 
|  | +			     make_string ("symbol ", undef_name, ", version ", | 
|  | +					  version->name, | 
|  | +					  " not defined in file ", | 
|  | +					  version->filename, | 
|  | +					  " with link time reference", | 
|  | +					  res == -2 | 
|  | +					  ? " (no version symbols)" : "")); | 
|  | +	  *ref = NULL; | 
|  | +	  return 0; | 
|  | +	} | 
|  | +    } | 
|  | + | 
|  | +  if (__builtin_expect (current_value.s == NULL, 0)) | 
|  | +    { | 
|  | +      if ((*ref == NULL || ELFW(ST_BIND) ((*ref)->st_info) != STB_WEAK) | 
|  | +	  && skip_map == NULL) | 
|  | +	{ | 
|  | +	  /* We could find no value for a strong reference.  */ | 
|  | +	  const char *reference_name = undef_map ? undef_map->l_name : ""; | 
|  | +	  const char *versionstr = version ? ", version " : ""; | 
|  | +	  const char *versionname = (version && version->name | 
|  | +				     ? version->name : ""); | 
|  | + | 
|  | +	  /* XXX We cannot translate the message.  */ | 
|  | +	  _dl_signal_cerror (0, (reference_name[0] | 
|  | +				 ? reference_name | 
|  | +				 : (rtld_progname ?: "<main program>")), | 
|  | +			     N_("symbol lookup error"), | 
|  | +			     make_string (undefined_msg, undef_name, | 
|  | +					  versionstr, versionname)); | 
|  | +	} | 
|  | +      *ref = NULL; | 
|  | +      return 0; | 
|  | +    } | 
|  | + | 
|  | +  int protected = (*ref | 
|  | +		   && ELFW(ST_VISIBILITY) ((*ref)->st_other) == STV_PROTECTED); | 
|  | +  if (__builtin_expect (protected != 0, 0)) | 
|  | +    { | 
|  | +      /* It is very tricky.  We need to figure out what value to | 
|  | +	 return for the protected symbol.  */ | 
|  | +      if (type_class == ELF_RTYPE_CLASS_PLT) | 
|  | +	{ | 
|  | +	  if (current_value.s != NULL && current_value.m != undef_map) | 
|  | +	    { | 
|  | +	      current_value.s = *ref; | 
|  | +	      current_value.m = undef_map; | 
|  | +	    } | 
|  | +	} | 
|  | +      else | 
|  | +	{ | 
|  | +	  struct sym_val protected_value = { NULL, NULL }; | 
|  | + | 
|  | +	  for (scope = symbol_scope; *scope != NULL; i = 0, ++scope) | 
|  | +	    if (do_lookup_x (undef_name, new_hash, &old_hash, *ref, | 
|  | +			     &protected_value, *scope, i, version, flags, | 
|  | +			     skip_map, ELF_RTYPE_CLASS_PLT, NULL) != 0) | 
|  | +	      break; | 
|  | + | 
|  | +	  if (protected_value.s != NULL && protected_value.m != undef_map) | 
|  | +	    { | 
|  | +	      current_value.s = *ref; | 
|  | +	      current_value.m = undef_map; | 
|  | +	    } | 
|  | +	} | 
|  | +    } | 
|  | + | 
|  | +  /* We have to check whether this would bind UNDEF_MAP to an object | 
|  | +     in the global scope which was dynamically loaded.  In this case | 
|  | +     we have to prevent the latter from being unloaded unless the | 
|  | +     UNDEF_MAP object is also unloaded.  */ | 
|  | +  if (__builtin_expect (current_value.m->l_type == lt_loaded, 0) | 
|  | +      /* Don't do this for explicit lookups as opposed to implicit | 
|  | +	 runtime lookups.  */ | 
|  | +      && (flags & DL_LOOKUP_ADD_DEPENDENCY) != 0 | 
|  | +      /* Add UNDEF_MAP to the dependencies.  */ | 
|  | +      && add_dependency (undef_map, current_value.m, flags) < 0) | 
|  | +      /* Something went wrong.  Perhaps the object we tried to reference | 
|  | +	 was just removed.  Try finding another definition.  */ | 
|  | +      return _dl_lookup_symbol_x (undef_name, undef_map, ref, | 
|  | +				  (flags & DL_LOOKUP_GSCOPE_LOCK) | 
|  | +				  ? undef_map->l_scope : symbol_scope, | 
|  | +				  version, type_class, flags, skip_map); | 
|  | + | 
|  | +  /* The object is used.  */ | 
|  | +  if (__builtin_expect (current_value.m->l_used == 0, 0)) | 
|  | +    current_value.m->l_used = 1; | 
|  | + | 
|  | +  if (__builtin_expect (GLRO(dl_debug_mask) | 
|  | +			& (DL_DEBUG_BINDINGS|DL_DEBUG_PRELINK), 0)) | 
|  | +    _dl_debug_bindings (undef_name, undef_map, ref, | 
|  | +			¤t_value, version, type_class, protected); | 
|  | + | 
|  | +  *ref = current_value.s; | 
|  | +  return LOOKUP_VALUE (current_value.m); | 
|  | +} | 
|  | + | 
|  | + | 
|  | +/* Cache the location of MAP's hash table.  */ | 
|  | + | 
|  | +void | 
|  | +internal_function | 
|  | +_dl_setup_hash (struct link_map *map) | 
|  | +{ | 
|  | +  Elf_Symndx *hash; | 
|  | +  Elf_Symndx nchain; | 
|  | + | 
|  | +  if (__builtin_expect (map->l_info[DT_ADDRTAGIDX (DT_GNU_HASH) + DT_NUM | 
|  | +				    + DT_THISPROCNUM + DT_VERSIONTAGNUM | 
|  | +				    + DT_EXTRANUM + DT_VALNUM] != NULL, 1)) | 
|  | +    { | 
|  | +      Elf32_Word *hash32 | 
|  | +	= (void *) D_PTR (map, l_info[DT_ADDRTAGIDX (DT_GNU_HASH) + DT_NUM | 
|  | +				      + DT_THISPROCNUM + DT_VERSIONTAGNUM | 
|  | +				      + DT_EXTRANUM + DT_VALNUM]); | 
|  | +      map->l_nbuckets = *hash32++; | 
|  | +      Elf32_Word symbias = *hash32++; | 
|  | +      Elf32_Word bitmask_nwords = *hash32++; | 
|  | +      /* Must be a power of two.  */ | 
|  | +      assert ((bitmask_nwords & (bitmask_nwords - 1)) == 0); | 
|  | +      map->l_gnu_bitmask_idxbits = bitmask_nwords - 1; | 
|  | +      map->l_gnu_shift = *hash32++; | 
|  | + | 
|  | +      map->l_gnu_bitmask = (ElfW(Addr) *) hash32; | 
|  | +      hash32 += __ELF_NATIVE_CLASS / 32 * bitmask_nwords; | 
|  | + | 
|  | +      map->l_gnu_buckets = hash32; | 
|  | +      hash32 += map->l_nbuckets; | 
|  | +      map->l_gnu_chain_zero = hash32 - symbias; | 
|  | +      return; | 
|  | +    } | 
|  | + | 
|  | +  if (!map->l_info[DT_HASH]) | 
|  | +    return; | 
|  | +  hash = (void *) D_PTR (map, l_info[DT_HASH]); | 
|  | + | 
|  | +  map->l_nbuckets = *hash++; | 
|  | +  nchain = *hash++; | 
|  | +  map->l_buckets = hash; | 
|  | +  hash += map->l_nbuckets; | 
|  | +  map->l_chain = hash; | 
|  | +} | 
|  | + | 
|  | + | 
|  | +static void | 
|  | +internal_function | 
|  | +_dl_debug_bindings (const char *undef_name, struct link_map *undef_map, | 
|  | +		    const ElfW(Sym) **ref, struct sym_val *value, | 
|  | +		    const struct r_found_version *version, int type_class, | 
|  | +		    int protected) | 
|  | +{ | 
|  | +  const char *reference_name = undef_map->l_name; | 
|  | + | 
|  | +  if (GLRO(dl_debug_mask) & DL_DEBUG_BINDINGS) | 
|  | +    { | 
|  | +      _dl_debug_printf ("binding file %s [%lu] to %s [%lu]: %s symbol `%s'", | 
|  | +			(reference_name[0] | 
|  | +			 ? reference_name | 
|  | +			 : (rtld_progname ?: "<main program>")), | 
|  | +			undef_map->l_ns, | 
|  | +			value->m->l_name[0] ? value->m->l_name : rtld_progname, | 
|  | +			value->m->l_ns, | 
|  | +			protected ? "protected" : "normal", undef_name); | 
|  | +      if (version) | 
|  | +	_dl_debug_printf_c (" [%s]\n", version->name); | 
|  | +      else | 
|  | +	_dl_debug_printf_c ("\n"); | 
|  | +    } | 
|  | +#ifdef SHARED | 
|  | +  if (GLRO(dl_debug_mask) & DL_DEBUG_PRELINK) | 
|  | +    { | 
|  | +      int conflict = 0; | 
|  | +      struct sym_val val = { NULL, NULL }; | 
|  | + | 
|  | +      if ((GLRO(dl_trace_prelink_map) == NULL | 
|  | +	   || GLRO(dl_trace_prelink_map) == GL(dl_ns)[LM_ID_BASE]._ns_loaded) | 
|  | +	  && undef_map != GL(dl_ns)[LM_ID_BASE]._ns_loaded) | 
|  | +	{ | 
|  | +	  const uint_fast32_t new_hash = dl_new_hash (undef_name); | 
|  | +	  unsigned long int old_hash = 0xffffffff; | 
|  | +	  struct unique_sym *saved_entries | 
|  | +	    = GL(dl_ns)[LM_ID_BASE]._ns_unique_sym_table.entries; | 
|  | + | 
|  | +	  GL(dl_ns)[LM_ID_BASE]._ns_unique_sym_table.entries = NULL; | 
|  | +	  do_lookup_x (undef_name, new_hash, &old_hash, *ref, &val, | 
|  | +		       undef_map->l_local_scope[0], 0, version, 0, NULL, | 
|  | +		       type_class, undef_map); | 
|  | +	  if (val.s != value->s || val.m != value->m) | 
|  | +	    conflict = 1; | 
|  | +	  else if (__builtin_expect (undef_map->l_symbolic_in_local_scope, 0) | 
|  | +		   && val.s | 
|  | +		   && __builtin_expect (ELFW(ST_BIND) (val.s->st_info), | 
|  | +					STB_GLOBAL) == STB_GNU_UNIQUE) | 
|  | +	    { | 
|  | +	      /* If it is STB_GNU_UNIQUE and undef_map's l_local_scope | 
|  | +		 contains any DT_SYMBOLIC libraries, unfortunately there | 
|  | +		 can be conflicts even if the above is equal.  As symbol | 
|  | +		 resolution goes from the last library to the first and | 
|  | +		 if a STB_GNU_UNIQUE symbol is found in some late DT_SYMBOLIC | 
|  | +		 library, it would be the one that is looked up.  */ | 
|  | +	      struct sym_val val2 = { NULL, NULL }; | 
|  | +	      size_t n; | 
|  | +	      struct r_scope_elem *scope = undef_map->l_local_scope[0]; | 
|  | + | 
|  | +	      for (n = 0; n < scope->r_nlist; n++) | 
|  | +		if (scope->r_list[n] == val.m) | 
|  | +		  break; | 
|  | + | 
|  | +	      for (n++; n < scope->r_nlist; n++) | 
|  | +		if (scope->r_list[n]->l_info[DT_SYMBOLIC] != NULL | 
|  | +		    && do_lookup_x (undef_name, new_hash, &old_hash, *ref, | 
|  | +				    &val2, | 
|  | +				    &scope->r_list[n]->l_symbolic_searchlist, | 
|  | +				    0, version, 0, NULL, type_class, | 
|  | +				    undef_map) > 0) | 
|  | +		  { | 
|  | +		    conflict = 1; | 
|  | +		    val = val2; | 
|  | +		    break; | 
|  | +		  } | 
|  | +	    } | 
|  | +	  GL(dl_ns)[LM_ID_BASE]._ns_unique_sym_table.entries = saved_entries; | 
|  | +	} | 
|  | + | 
|  | +      if (value->s) | 
|  | +	{ | 
|  | +	  if (__builtin_expect (ELFW(ST_TYPE) (value->s->st_info) | 
|  | +				== STT_TLS, 0)) | 
|  | +	    type_class = 4; | 
|  | +	  else if (__builtin_expect (ELFW(ST_TYPE) (value->s->st_info) | 
|  | +				     == STT_GNU_IFUNC, 0)) | 
|  | +	    type_class |= 8; | 
|  | +	} | 
|  | + | 
|  | +      if (conflict | 
|  | +	  || GLRO(dl_trace_prelink_map) == undef_map | 
|  | +	  || GLRO(dl_trace_prelink_map) == NULL | 
|  | +	  || type_class >= 4) | 
|  | +	{ | 
|  | +	  _dl_printf ("%s 0x%0*Zx 0x%0*Zx -> 0x%0*Zx 0x%0*Zx ", | 
|  | +		      conflict ? "conflict" : "lookup", | 
|  | +		      (int) sizeof (ElfW(Addr)) * 2, | 
|  | +		      (size_t) undef_map->l_map_start, | 
|  | +		      (int) sizeof (ElfW(Addr)) * 2, | 
|  | +		      (size_t) (((ElfW(Addr)) *ref) - undef_map->l_map_start), | 
|  | +		      (int) sizeof (ElfW(Addr)) * 2, | 
|  | +		      (size_t) (value->s ? value->m->l_map_start : 0), | 
|  | +		      (int) sizeof (ElfW(Addr)) * 2, | 
|  | +		      (size_t) (value->s ? value->s->st_value : 0)); | 
|  | + | 
|  | +	  if (conflict) | 
|  | +	    _dl_printf ("x 0x%0*Zx 0x%0*Zx ", | 
|  | +			(int) sizeof (ElfW(Addr)) * 2, | 
|  | +			(size_t) (val.s ? val.m->l_map_start : 0), | 
|  | +			(int) sizeof (ElfW(Addr)) * 2, | 
|  | +			(size_t) (val.s ? val.s->st_value : 0)); | 
|  | + | 
|  | +	  _dl_printf ("/%x %s\n", type_class, undef_name); | 
|  | +	} | 
|  | +    } | 
|  | +#endif | 
|  | +} | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/dl-machine.h glibc-2.19-riscv/sysdeps/riscv/dl-machine.h | 
|  | --- glibc-2.19/sysdeps/riscv/dl-machine.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/dl-machine.h	2014-12-09 16:55:03.156727789 -0800 | 
|  | @@ -0,0 +1,717 @@ | 
|  | +/* Machine-dependent ELF dynamic relocation inline functions.  MIPS version. | 
|  | +   Copyright (C) 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007 | 
|  | +   Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by Kazumoto Kojima <kkojima@info.kanagawa-u.ac.jp>. | 
|  | + | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +/*  FIXME: Profiling of shared libraries is not implemented yet.  */ | 
|  | +#ifndef dl_machine_h | 
|  | +#define dl_machine_h | 
|  | + | 
|  | +#define ELF_MACHINE_NAME "RISC-V" | 
|  | + | 
|  | +#include <entry.h> | 
|  | + | 
|  | +#ifndef ENTRY_POINT | 
|  | +#error ENTRY_POINT needs to be defined for MIPS. | 
|  | +#endif | 
|  | + | 
|  | +#include <sys/asm.h> | 
|  | +#include <dl-tls.h> | 
|  | + | 
|  | +#ifndef _RTLD_PROLOGUE | 
|  | +# define _RTLD_PROLOGUE(entry)						\ | 
|  | +	".globl\t" __STRING(entry) "\n\t"				\ | 
|  | +	".type\t" __STRING(entry) ", @function\n"			\ | 
|  | +	__STRING(entry) ":\n\t" | 
|  | +#endif | 
|  | + | 
|  | +#ifndef _RTLD_EPILOGUE | 
|  | +# define _RTLD_EPILOGUE(entry)						\ | 
|  | +	".size\t" __STRING(entry) ", . - " __STRING(entry) "\n\t" | 
|  | +#endif | 
|  | + | 
|  | +/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. | 
|  | +   This only makes sense on MIPS when using PLTs, so choose the | 
|  | +   PLT relocation (not encountered when not using PLTs).  */ | 
|  | +#define ELF_MACHINE_JMP_SLOT			R_MIPS_JUMP_SLOT | 
|  | +#define elf_machine_type_class(type) \ | 
|  | +  ((((type) == ELF_MACHINE_JMP_SLOT) * ELF_RTYPE_CLASS_PLT)	\ | 
|  | +   | (((type) == R_MIPS_COPY) * ELF_RTYPE_CLASS_COPY)) | 
|  | + | 
|  | +#define ELF_MACHINE_PLT_REL 1 | 
|  | + | 
|  | +/* Translate a processor specific dynamic tag to the index | 
|  | +   in l_info array.  */ | 
|  | +#define DT_MIPS(x) (DT_MIPS_##x - DT_LOPROC + DT_NUM) | 
|  | + | 
|  | +/* If there is a DT_MIPS_RLD_MAP entry in the dynamic section, fill it in | 
|  | +   with the run-time address of the r_debug structure  */ | 
|  | +#define ELF_MACHINE_DEBUG_SETUP(l,r) \ | 
|  | +do { if ((l)->l_info[DT_MIPS (RLD_MAP)]) \ | 
|  | +       *(ElfW(Addr) *)((l)->l_info[DT_MIPS (RLD_MAP)]->d_un.d_ptr) = \ | 
|  | +       (ElfW(Addr)) (r); \ | 
|  | +   } while (0) | 
|  | + | 
|  | +/* Return nonzero iff ELF header is compatible with the running host.  */ | 
|  | +static inline int __attribute_used__ | 
|  | +elf_machine_matches_host (const ElfW(Ehdr) *ehdr) | 
|  | +{ | 
|  | +  return 1; | 
|  | +} | 
|  | + | 
|  | +static inline ElfW(Addr) * | 
|  | +elf_mips_got_from_gpreg (ElfW(Addr) gpreg) | 
|  | +{ | 
|  | +  return (ElfW(Addr) *) gpreg; | 
|  | +} | 
|  | + | 
|  | +/* Return the link-time address of _DYNAMIC.  Conveniently, this is the | 
|  | +   first element of the GOT.  This must be inlined in a function which | 
|  | +   uses global data.  */ | 
|  | +static inline ElfW(Addr) | 
|  | +elf_machine_dynamic (void) | 
|  | +{ | 
|  | +  ElfW(Addr) load, link, got; | 
|  | +  asm ("   la   %0, 1f\n" | 
|  | +       "   la   %1, _GLOBAL_OFFSET_TABLE_\n" | 
|  | +       "1: rdpc %2" | 
|  | +       : "=r"(link), "=r"(got), "=r"(load)); | 
|  | + | 
|  | +  return *elf_mips_got_from_gpreg(load - link + got); | 
|  | +} | 
|  | + | 
|  | +#define STRINGXP(X) __STRING(X) | 
|  | +#define STRINGXV(X) STRINGV_(X) | 
|  | +#define STRINGV_(...) # __VA_ARGS__ | 
|  | + | 
|  | +/* Return the run-time load address of the shared object.  */ | 
|  | +static inline ElfW(Addr) | 
|  | +elf_machine_load_address (void) | 
|  | +{ | 
|  | +  ElfW(Addr) load, link; | 
|  | +  asm ("   la   %0, 1f\n" | 
|  | +       "1: rdpc %1\n" | 
|  | +       : "=r"(link), "=r"(load)); | 
|  | + | 
|  | +  return load - link; | 
|  | +} | 
|  | + | 
|  | +/* The MSB of got[1] of a gnu object is set to identify gnu objects.  */ | 
|  | +#ifdef __riscv64 | 
|  | +# define ELF_MIPS_GNU_GOT1_MASK	0x8000000000000000L | 
|  | +#else | 
|  | +# define ELF_MIPS_GNU_GOT1_MASK	0x80000000L | 
|  | +#endif | 
|  | + | 
|  | +/* We can't rely on elf_machine_got_rel because _dl_object_relocation_scope | 
|  | +   fiddles with global data.  */ | 
|  | +#define ELF_MACHINE_BEFORE_RTLD_RELOC(dynamic_info)			\ | 
|  | +do {									\ | 
|  | +  struct link_map *map = &bootstrap_map;				\ | 
|  | +  ElfW(Sym) *sym;							\ | 
|  | +  ElfW(Addr) *got;							\ | 
|  | +  int i, n;								\ | 
|  | +									\ | 
|  | +  got = (ElfW(Addr) *) D_PTR (map, l_info[DT_PLTGOT]);			\ | 
|  | +									\ | 
|  | +  if (__builtin_expect (map->l_addr == 0, 1))				\ | 
|  | +    break;								\ | 
|  | +									\ | 
|  | +  /* got[0] is reserved. got[1] is also reserved for the dynamic object	\ | 
|  | +     generated by gnu ld. Skip these reserved entries from		\ | 
|  | +     relocation.  */							\ | 
|  | +  i = (got[1] & ELF_MIPS_GNU_GOT1_MASK)? 2 : 1;				\ | 
|  | +  n = map->l_info[DT_MIPS (LOCAL_GOTNO)]->d_un.d_val;			\ | 
|  | +									\ | 
|  | +  /* Add the run-time displacement to all local got entries. */		\ | 
|  | +  while (i < n)								\ | 
|  | +    got[i++] += map->l_addr;						\ | 
|  | +									\ | 
|  | +  /* Handle global got entries. */					\ | 
|  | +  got += n;								\ | 
|  | +  sym = (ElfW(Sym) *) D_PTR(map, l_info[DT_SYMTAB])			\ | 
|  | +       + map->l_info[DT_MIPS (GOTSYM)]->d_un.d_val;			\ | 
|  | +  i = (map->l_info[DT_MIPS (SYMTABNO)]->d_un.d_val			\ | 
|  | +       - map->l_info[DT_MIPS (GOTSYM)]->d_un.d_val);			\ | 
|  | +									\ | 
|  | +  while (i--)								\ | 
|  | +    {									\ | 
|  | +      if (sym->st_shndx == SHN_UNDEF || sym->st_shndx == SHN_COMMON)	\ | 
|  | +	*got = map->l_addr + sym->st_value;				\ | 
|  | +      else if (ELFW(ST_TYPE) (sym->st_info) == STT_FUNC			\ | 
|  | +	       && *got != sym->st_value)				\ | 
|  | +	*got += map->l_addr;						\ | 
|  | +      else if (ELFW(ST_TYPE) (sym->st_info) == STT_SECTION)		\ | 
|  | +	{								\ | 
|  | +	  if (sym->st_other == 0)					\ | 
|  | +	    *got += map->l_addr;					\ | 
|  | +	}								\ | 
|  | +      else								\ | 
|  | +	*got = map->l_addr + sym->st_value;				\ | 
|  | +									\ | 
|  | +      got++;								\ | 
|  | +      sym++;								\ | 
|  | +    }									\ | 
|  | +} while(0) | 
|  | + | 
|  | + | 
|  | +/* Mask identifying addresses reserved for the user program, | 
|  | +   where the dynamic linker should not map anything.  */ | 
|  | +#define ELF_MACHINE_USER_ADDRESS_MASK	0x80000000UL | 
|  | + | 
|  | + | 
|  | +/* Initial entry point code for the dynamic linker. | 
|  | +   The C function `_dl_start' is the real entry point; | 
|  | +   its return value is the user program's entry point. */ | 
|  | + | 
|  | +#define RTLD_START asm (\ | 
|  | +	".text\n\ | 
|  | +	" _RTLD_PROLOGUE(ENTRY_POINT) "\ | 
|  | +	# Store &_DYNAMIC in the first entry of the GOT.\n\ | 
|  | +	la a1, 1f\n\ | 
|  | +	la a2, _GLOBAL_OFFSET_TABLE_\n\ | 
|  | +	la a3, _DYNAMIC\n\ | 
|  | +	1: rdpc a0\n\ | 
|  | +	sub a0, a0, a1\n\ | 
|  | +	add a0, a0, a2\n\ | 
|  | +	" STRINGXP(REG_S) " a3, 0(a0)\n\ | 
|  | +	move a0, sp\n\ | 
|  | +	jal _dl_start\n\ | 
|  | +	# Fall through to _dl_start_user \ | 
|  | +	" _RTLD_EPILOGUE(ENTRY_POINT) "\ | 
|  | +	\n\ | 
|  | +	\n\ | 
|  | +	" _RTLD_PROLOGUE(_dl_start_user) "\ | 
|  | +	# Stash user entry point in s0.\n\ | 
|  | +	move s0, v0\n\ | 
|  | +	# See if we were run as a command with the executable file\n\ | 
|  | +	# name as an extra leading argument.\n\ | 
|  | +	la v0, _dl_skip_args\n\ | 
|  | +	lw v0, 0(v0)\n\ | 
|  | +	beqz v0, 1f\n\ | 
|  | +	# Load the original argument count.\n\ | 
|  | +	" STRINGXP(REG_L) " a0, 0(sp)\n\ | 
|  | +	# Subtract _dl_skip_args from it.\n\ | 
|  | +	sub a0, a0, v0\n\ | 
|  | +	# Adjust the stack pointer to skip _dl_skip_args words.\n\ | 
|  | +	sll v0, v0, " STRINGXP (PTRLOG) "\n\ | 
|  | +	add sp, sp, v0\n\ | 
|  | +	# Save back the modified argument count.\n\ | 
|  | +	" STRINGXP(REG_S) " a0, 0(sp)\n\ | 
|  | +1:	# Call _dl_init (struct link_map *main_map, int argc, char **argv, char **env) \n\ | 
|  | +	la a0, _rtld_local\n\ | 
|  | +	" STRINGXP(REG_L) " a0, 0(a0)\n\ | 
|  | +	" STRINGXP(REG_L) " a1, 0(sp)\n\ | 
|  | +	add a2, sp, " STRINGXP (PTRSIZE) "\n\ | 
|  | +	sll a3, a1, " STRINGXP (PTRLOG) "\n\ | 
|  | +	add a3, a3, a2\n\ | 
|  | +	add a3, a3, " STRINGXP (PTRSIZE) "\n\ | 
|  | +	# Call the function to run the initializers.\n\ | 
|  | +	jal _dl_init_internal\n\ | 
|  | +	# Pass our finalizer function to the user in v0 as per ELF ABI.\n\ | 
|  | +	la v0, _dl_fini\n\ | 
|  | +	# Jump to the user entry point.\n\ | 
|  | +	jr s0\n\t"\ | 
|  | +	_RTLD_EPILOGUE(_dl_start_user)\ | 
|  | +	".previous"\ | 
|  | +); | 
|  | + | 
|  | +/* Names of the architecture-specific auditing callback functions.  */ | 
|  | +# ifdef __riscv64 | 
|  | +#  define ARCH_LA_PLTENTER mips_n64_gnu_pltenter | 
|  | +#  define ARCH_LA_PLTEXIT mips_n64_gnu_pltexit | 
|  | +# else | 
|  | +#  define ARCH_LA_PLTENTER mips_n32_gnu_pltenter | 
|  | +#  define ARCH_LA_PLTEXIT mips_n32_gnu_pltexit | 
|  | +# endif | 
|  | + | 
|  | +/* For a non-writable PLT, rewrite the .got.plt entry at RELOC_ADDR to | 
|  | +   point at the symbol with address VALUE.  For a writable PLT, rewrite | 
|  | +   the corresponding PLT entry instead.  */ | 
|  | +static inline ElfW(Addr) | 
|  | +elf_machine_fixup_plt (struct link_map *map, lookup_t t, | 
|  | +		       const ElfW(Rel) *reloc, | 
|  | +		       ElfW(Addr) *reloc_addr, ElfW(Addr) value) | 
|  | +{ | 
|  | +  return *reloc_addr = value; | 
|  | +} | 
|  | + | 
|  | +static inline ElfW(Addr) | 
|  | +elf_machine_plt_value (struct link_map *map, const ElfW(Rel) *reloc, | 
|  | +		       ElfW(Addr) value) | 
|  | +{ | 
|  | +  return value; | 
|  | +} | 
|  | + | 
|  | +#endif /* !dl_machine_h */ | 
|  | + | 
|  | +#ifdef RESOLVE_MAP | 
|  | + | 
|  | +/* Perform a relocation described by R_INFO at the location pointed to | 
|  | +   by RELOC_ADDR.  SYM is the relocation symbol specified by R_INFO and | 
|  | +   MAP is the object containing the reloc.  */ | 
|  | + | 
|  | +auto inline void | 
|  | +__attribute__ ((always_inline)) | 
|  | +elf_machine_reloc (struct link_map *map, ElfW(Addr) r_info, | 
|  | +		   const ElfW(Sym) *sym, const struct r_found_version *version, | 
|  | +		   void *reloc_addr, ElfW(Addr) r_addend, int inplace_p) | 
|  | +{ | 
|  | +  const unsigned long int r_type = ELFW(R_TYPE) (r_info); | 
|  | +  ElfW(Addr) *addr_field = (ElfW(Addr) *) reloc_addr; | 
|  | + | 
|  | +#if !defined RTLD_BOOTSTRAP && !defined SHARED | 
|  | +  /* This is defined in rtld.c, but nowhere in the static libc.a; | 
|  | +     make the reference weak so static programs can still link.  This | 
|  | +     declaration cannot be done when compiling rtld.c (i.e.  #ifdef | 
|  | +     RTLD_BOOTSTRAP) because rtld.c contains the common defn for | 
|  | +     _dl_rtld_map, which is incompatible with a weak decl in the same | 
|  | +     file.  */ | 
|  | +  weak_extern (GL(dl_rtld_map)); | 
|  | +#endif | 
|  | + | 
|  | +  switch (r_type) | 
|  | +    { | 
|  | +#if defined (USE_TLS) && !defined (RTLD_BOOTSTRAP) | 
|  | +# if _RISCV_SIM == _ABI64 | 
|  | +    case R_MIPS_TLS_DTPMOD64: | 
|  | +    case R_MIPS_TLS_DTPREL64: | 
|  | +    case R_MIPS_TLS_TPREL64: | 
|  | +# else | 
|  | +    case R_MIPS_TLS_DTPMOD32: | 
|  | +    case R_MIPS_TLS_DTPREL32: | 
|  | +    case R_MIPS_TLS_TPREL32: | 
|  | +# endif | 
|  | +      { | 
|  | +	struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type); | 
|  | + | 
|  | +	switch (r_type) | 
|  | +	  { | 
|  | +	  case R_MIPS_TLS_DTPMOD64: | 
|  | +	  case R_MIPS_TLS_DTPMOD32: | 
|  | +	    if (sym_map) | 
|  | +	      *addr_field = sym_map->l_tls_modid; | 
|  | +	    break; | 
|  | + | 
|  | +	  case R_MIPS_TLS_DTPREL64: | 
|  | +	  case R_MIPS_TLS_DTPREL32: | 
|  | +	    if (sym) | 
|  | +	      { | 
|  | +		if (inplace_p) | 
|  | +		  r_addend = *addr_field; | 
|  | +		*addr_field = r_addend + TLS_DTPREL_VALUE (sym); | 
|  | +	      } | 
|  | +	    break; | 
|  | + | 
|  | +	  case R_MIPS_TLS_TPREL32: | 
|  | +	  case R_MIPS_TLS_TPREL64: | 
|  | +	    if (sym) | 
|  | +	      { | 
|  | +		CHECK_STATIC_TLS (map, sym_map); | 
|  | +		if (inplace_p) | 
|  | +		  r_addend = *addr_field; | 
|  | +		*addr_field = r_addend + TLS_TPREL_VALUE (sym_map, sym); | 
|  | +	      } | 
|  | +	    break; | 
|  | +	  } | 
|  | + | 
|  | +	break; | 
|  | +      } | 
|  | +#endif | 
|  | + | 
|  | +#if _RISCV_SIM == _ABI64 | 
|  | +    case (R_MIPS_64 << 8) | R_MIPS_REL32: | 
|  | +#else | 
|  | +    case R_MIPS_REL32: | 
|  | +#endif | 
|  | +      { | 
|  | +	int symidx = ELFW(R_SYM) (r_info); | 
|  | +	ElfW(Addr) reloc_value; | 
|  | + | 
|  | +	if (inplace_p) | 
|  | +	  /* Support relocations on mis-aligned offsets.  */ | 
|  | +	  __builtin_memcpy (&reloc_value, reloc_addr, sizeof (reloc_value)); | 
|  | +	else | 
|  | +	  reloc_value = r_addend; | 
|  | + | 
|  | +	if (symidx) | 
|  | +	  { | 
|  | +	    const ElfW(Word) gotsym | 
|  | +	      = (const ElfW(Word)) map->l_info[DT_MIPS (GOTSYM)]->d_un.d_val; | 
|  | + | 
|  | +	    if ((ElfW(Word))symidx < gotsym) | 
|  | +	      { | 
|  | +		/* This wouldn't work for a symbol imported from other | 
|  | +		   libraries for which there's no GOT entry, but MIPS | 
|  | +		   requires every symbol referenced in a dynamic | 
|  | +		   relocation to have a GOT entry in the primary GOT, | 
|  | +		   so we only get here for locally-defined symbols. | 
|  | +		   For section symbols, we should *NOT* be adding | 
|  | +		   sym->st_value (per the definition of the meaning of | 
|  | +		   S in reloc expressions in the ELF64 MIPS ABI), | 
|  | +		   since it should have already been added to | 
|  | +		   reloc_value by the linker, but older versions of | 
|  | +		   GNU ld didn't add it, and newer versions don't emit | 
|  | +		   useless relocations to section symbols any more, so | 
|  | +		   it is safe to keep on adding sym->st_value, even | 
|  | +		   though it's not ABI compliant.  Some day we should | 
|  | +		   bite the bullet and stop doing this.  */ | 
|  | +#ifndef RTLD_BOOTSTRAP | 
|  | +		if (map != &GL(dl_rtld_map)) | 
|  | +#endif | 
|  | +		  reloc_value += sym->st_value + map->l_addr; | 
|  | +	      } | 
|  | +	    else | 
|  | +	      { | 
|  | +#ifndef RTLD_BOOTSTRAP | 
|  | +		const ElfW(Addr) *got | 
|  | +		  = (const ElfW(Addr) *) D_PTR (map, l_info[DT_PLTGOT]); | 
|  | +		const ElfW(Word) local_gotno | 
|  | +		  = (const ElfW(Word)) | 
|  | +		    map->l_info[DT_MIPS (LOCAL_GOTNO)]->d_un.d_val; | 
|  | + | 
|  | +		reloc_value += got[symidx + local_gotno - gotsym]; | 
|  | +#endif | 
|  | +	      } | 
|  | +	  } | 
|  | +	else | 
|  | +#ifndef RTLD_BOOTSTRAP | 
|  | +	  if (map != &GL(dl_rtld_map)) | 
|  | +#endif | 
|  | +	    reloc_value += map->l_addr; | 
|  | + | 
|  | +	__builtin_memcpy (reloc_addr, &reloc_value, sizeof (reloc_value)); | 
|  | +      } | 
|  | +      break; | 
|  | +#ifndef RTLD_BOOTSTRAP | 
|  | +#if _RISCV_SIM == _ABI64 | 
|  | +    case (R_MIPS_64 << 8) | R_MIPS_GLOB_DAT: | 
|  | +#else | 
|  | +    case R_MIPS_GLOB_DAT: | 
|  | +#endif | 
|  | +      { | 
|  | +	int symidx = ELFW(R_SYM) (r_info); | 
|  | +	const ElfW(Word) gotsym | 
|  | +	  = (const ElfW(Word)) map->l_info[DT_MIPS (GOTSYM)]->d_un.d_val; | 
|  | + | 
|  | +	if (__builtin_expect ((ElfW(Word)) symidx >= gotsym, 1)) | 
|  | +	  { | 
|  | +	    const ElfW(Addr) *got | 
|  | +	      = (const ElfW(Addr) *) D_PTR (map, l_info[DT_PLTGOT]); | 
|  | +	    const ElfW(Word) local_gotno | 
|  | +	      = ((const ElfW(Word)) | 
|  | +		 map->l_info[DT_MIPS (LOCAL_GOTNO)]->d_un.d_val); | 
|  | + | 
|  | +	    ElfW(Addr) reloc_value = got[symidx + local_gotno - gotsym]; | 
|  | +	    __builtin_memcpy (reloc_addr, &reloc_value, sizeof (reloc_value)); | 
|  | +	  } | 
|  | +      } | 
|  | +      break; | 
|  | +#endif | 
|  | +    case R_MIPS_NONE:		/* Alright, Wilbur.  */ | 
|  | +      break; | 
|  | + | 
|  | +    case R_MIPS_JUMP_SLOT: | 
|  | +      { | 
|  | +	struct link_map *sym_map; | 
|  | +	ElfW(Addr) value; | 
|  | + | 
|  | +	/* The addend for a jump slot relocation must always be zero: | 
|  | +	   calls via the PLT always branch to the symbol's address and | 
|  | +	   not to the address plus a non-zero offset.  */ | 
|  | +	if (r_addend != 0) | 
|  | +	  _dl_signal_error (0, map->l_name, NULL, | 
|  | +			    "found jump slot relocation with non-zero addend"); | 
|  | + | 
|  | +	sym_map = RESOLVE_MAP (&sym, version, r_type); | 
|  | +	value = sym_map == NULL ? 0 : sym_map->l_addr + sym->st_value; | 
|  | +	*addr_field = value; | 
|  | + | 
|  | +	break; | 
|  | +      } | 
|  | + | 
|  | +    case R_MIPS_COPY: | 
|  | +      { | 
|  | +	const ElfW(Sym) *const refsym = sym; | 
|  | +	struct link_map *sym_map; | 
|  | +	ElfW(Addr) value; | 
|  | + | 
|  | +	/* Calculate the address of the symbol.  */ | 
|  | +	sym_map = RESOLVE_MAP (&sym, version, r_type); | 
|  | +	value = sym_map == NULL ? 0 : sym_map->l_addr + sym->st_value; | 
|  | + | 
|  | +	if (__builtin_expect (sym == NULL, 0)) | 
|  | +	  /* This can happen in trace mode if an object could not be | 
|  | +	     found.  */ | 
|  | +	  break; | 
|  | +	if (__builtin_expect (sym->st_size > refsym->st_size, 0) | 
|  | +	    || (__builtin_expect (sym->st_size < refsym->st_size, 0) | 
|  | +		&& GLRO(dl_verbose))) | 
|  | +	  { | 
|  | +	    const char *strtab; | 
|  | + | 
|  | +	    strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]); | 
|  | +	    _dl_error_printf ("\ | 
|  | +  %s: Symbol `%s' has different size in shared object, consider re-linking\n", | 
|  | +			      rtld_progname ?: "<program name unknown>", | 
|  | +			      strtab + refsym->st_name); | 
|  | +	  } | 
|  | +	memcpy (reloc_addr, (void *) value, | 
|  | +	        MIN (sym->st_size, refsym->st_size)); | 
|  | +	break; | 
|  | +      } | 
|  | + | 
|  | +#if _RISCV_SIM == _ABI64 | 
|  | +    case R_MIPS_64: | 
|  | +      /* For full compliance with the ELF64 ABI, one must precede the | 
|  | +	 _REL32/_64 pair of relocations with a _64 relocation, such | 
|  | +	 that the in-place addend is read as a 64-bit value.  IRIX | 
|  | +	 didn't pick up on this requirement, so we treat the | 
|  | +	 _REL32/_64 relocation as a 64-bit relocation even if it's by | 
|  | +	 itself.  For ABI compliance, we ignore such _64 dummy | 
|  | +	 relocations.  For RELA, this may be simply removed, since | 
|  | +	 it's totally unnecessary.  */ | 
|  | +      if (ELFW(R_SYM) (r_info) == 0) | 
|  | +	break; | 
|  | +      /* Fall through.  */ | 
|  | +#endif | 
|  | +    default: | 
|  | +      _dl_reloc_bad_type (map, r_type, 0); | 
|  | +      break; | 
|  | +    } | 
|  | +} | 
|  | + | 
|  | +/* Perform the relocation specified by RELOC and SYM (which is fully resolved). | 
|  | +   MAP is the object containing the reloc.  */ | 
|  | + | 
|  | +auto inline void | 
|  | +__attribute__ ((always_inline)) | 
|  | +elf_machine_rel (struct link_map *map, const ElfW(Rel) *reloc, | 
|  | +		 const ElfW(Sym) *sym, const struct r_found_version *version, | 
|  | +		 void *const reloc_addr) | 
|  | +{ | 
|  | +  elf_machine_reloc (map, reloc->r_info, sym, version, reloc_addr, 0, 1); | 
|  | +} | 
|  | + | 
|  | +auto inline void | 
|  | +__attribute__((always_inline)) | 
|  | +elf_machine_rel_relative (ElfW(Addr) l_addr, const ElfW(Rel) *reloc, | 
|  | +			  void *const reloc_addr) | 
|  | +{ | 
|  | +  /* XXX Nothing to do.  There is no relative relocation, right?  */ | 
|  | +} | 
|  | + | 
|  | +auto inline void | 
|  | +__attribute__((always_inline)) | 
|  | +elf_machine_lazy_rel (struct link_map *map, | 
|  | +		      ElfW(Addr) l_addr, const ElfW(Rel) *reloc) | 
|  | +{ | 
|  | +  ElfW(Addr) *const reloc_addr = (void *) (l_addr + reloc->r_offset); | 
|  | +  const unsigned int r_type = ELFW(R_TYPE) (reloc->r_info); | 
|  | +  /* Check for unexpected PLT reloc type.  */ | 
|  | +  if (__builtin_expect (r_type == R_MIPS_JUMP_SLOT, 1)) | 
|  | +    { | 
|  | +      if (__builtin_expect (map->l_mach.plt, 0) == 0) | 
|  | +	{ | 
|  | +	  /* Nothing is required here since we only support lazy | 
|  | +	     relocation in executables.  */ | 
|  | +	} | 
|  | +      else | 
|  | +	*reloc_addr = map->l_mach.plt; | 
|  | +    } | 
|  | +  else | 
|  | +    _dl_reloc_bad_type (map, r_type, 1); | 
|  | +} | 
|  | + | 
|  | +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) | 
|  | +{ | 
|  | +  elf_machine_reloc (map, reloc->r_info, sym, version, reloc_addr, | 
|  | +		     reloc->r_addend, 0); | 
|  | +} | 
|  | + | 
|  | +auto inline void | 
|  | +__attribute__((always_inline)) | 
|  | +elf_machine_rela_relative (ElfW(Addr) l_addr, const ElfW(Rela) *reloc, | 
|  | +			   void *const reloc_addr) | 
|  | +{ | 
|  | +} | 
|  | + | 
|  | +#ifndef RTLD_BOOTSTRAP | 
|  | +/* Relocate GOT. */ | 
|  | +auto inline void | 
|  | +__attribute__((always_inline)) | 
|  | +elf_machine_got_rel (struct link_map *map, int lazy) | 
|  | +{ | 
|  | +  ElfW(Addr) *got; | 
|  | +  ElfW(Sym) *sym; | 
|  | +  const ElfW(Half) *vernum; | 
|  | +  int i, n, symidx; | 
|  | + | 
|  | +#define RESOLVE_GOTSYM(sym,vernum,sym_index,reloc)			  \ | 
|  | +    ({									  \ | 
|  | +      const ElfW(Sym) *ref = sym;					  \ | 
|  | +      const struct r_found_version *version				  \ | 
|  | +        = vernum ? &map->l_versions[vernum[sym_index] & 0x7fff] : NULL;	  \ | 
|  | +      struct link_map *sym_map;						  \ | 
|  | +      sym_map = RESOLVE_MAP (&ref, version, reloc);			  \ | 
|  | +      ref ? sym_map->l_addr + ref->st_value : 0;			  \ | 
|  | +    }) | 
|  | + | 
|  | +  if (map->l_info[VERSYMIDX (DT_VERSYM)] != NULL) | 
|  | +    vernum = (const void *) D_PTR (map, l_info[VERSYMIDX (DT_VERSYM)]); | 
|  | +  else | 
|  | +    vernum = NULL; | 
|  | + | 
|  | +  got = (ElfW(Addr) *) D_PTR (map, l_info[DT_PLTGOT]); | 
|  | + | 
|  | +  n = map->l_info[DT_MIPS (LOCAL_GOTNO)]->d_un.d_val; | 
|  | +  /* The dynamic linker's local got entries have already been relocated.  */ | 
|  | +  if (map != &GL(dl_rtld_map)) | 
|  | +    { | 
|  | +      /* got[0] is reserved. got[1] is also reserved for the dynamic object | 
|  | +	 generated by gnu ld. Skip these reserved entries from relocation.  */ | 
|  | +      i = (got[1] & ELF_MIPS_GNU_GOT1_MASK)? 2 : 1; | 
|  | + | 
|  | +      /* Add the run-time displacement to all local got entries if | 
|  | +         needed.  */ | 
|  | +      if (__builtin_expect (map->l_addr != 0, 0)) | 
|  | +	{ | 
|  | +	  while (i < n) | 
|  | +	    got[i++] += map->l_addr; | 
|  | +	} | 
|  | +    } | 
|  | + | 
|  | +  /* Handle global got entries. */ | 
|  | +  got += n; | 
|  | +  /* Keep track of the symbol index.  */ | 
|  | +  symidx = map->l_info[DT_MIPS (GOTSYM)]->d_un.d_val; | 
|  | +  sym = (ElfW(Sym) *) D_PTR (map, l_info[DT_SYMTAB]) + symidx; | 
|  | +  i = (map->l_info[DT_MIPS (SYMTABNO)]->d_un.d_val | 
|  | +       - map->l_info[DT_MIPS (GOTSYM)]->d_un.d_val); | 
|  | + | 
|  | +  /* This loop doesn't handle Quickstart.  */ | 
|  | +  while (i--) | 
|  | +    { | 
|  | +      if (sym->st_shndx == SHN_UNDEF) | 
|  | +	{ | 
|  | +	  if (ELFW(ST_TYPE) (sym->st_info) == STT_FUNC && sym->st_value | 
|  | +	      && !(sym->st_other & STO_MIPS_PLT)) | 
|  | +	    { | 
|  | +	      if (lazy) | 
|  | +		*got = sym->st_value + map->l_addr; | 
|  | +	      else | 
|  | +		/* This is a lazy-binding stub, so we don't need the | 
|  | +		   canonical address.  */ | 
|  | +		*got = RESOLVE_GOTSYM (sym, vernum, symidx, R_MIPS_JUMP_SLOT); | 
|  | +	    } | 
|  | +	  else | 
|  | +	    *got = RESOLVE_GOTSYM (sym, vernum, symidx, R_MIPS_32); | 
|  | +	} | 
|  | +      else if (sym->st_shndx == SHN_COMMON) | 
|  | +	*got = RESOLVE_GOTSYM (sym, vernum, symidx, R_MIPS_32); | 
|  | +      else if (ELFW(ST_TYPE) (sym->st_info) == STT_FUNC | 
|  | +	       && *got != sym->st_value) | 
|  | +	{ | 
|  | +	  if (lazy) | 
|  | +	    *got += map->l_addr; | 
|  | +	  else | 
|  | +	    /* This is a lazy-binding stub, so we don't need the | 
|  | +	       canonical address.  */ | 
|  | +	    *got = RESOLVE_GOTSYM (sym, vernum, symidx, R_MIPS_JUMP_SLOT); | 
|  | +	} | 
|  | +      else if (ELFW(ST_TYPE) (sym->st_info) == STT_SECTION) | 
|  | +	{ | 
|  | +	  if (sym->st_other == 0) | 
|  | +	    *got += map->l_addr; | 
|  | +	} | 
|  | +      else | 
|  | +	*got = RESOLVE_GOTSYM (sym, vernum, symidx, R_MIPS_32); | 
|  | + | 
|  | +      ++got; | 
|  | +      ++sym; | 
|  | +      ++symidx; | 
|  | +    } | 
|  | + | 
|  | +#undef RESOLVE_GOTSYM | 
|  | +} | 
|  | +#endif | 
|  | + | 
|  | +/* Set up the loaded object described by L so its stub function | 
|  | +   will jump to the on-demand fixup code __dl_runtime_resolve.  */ | 
|  | + | 
|  | +auto inline int | 
|  | +__attribute__((always_inline)) | 
|  | +elf_machine_runtime_setup (struct link_map *l, int lazy, int profile) | 
|  | +{ | 
|  | +# ifndef RTLD_BOOTSTRAP | 
|  | +  ElfW(Addr) *got; | 
|  | +  extern void _dl_runtime_resolve (ElfW(Word)); | 
|  | +  extern void _dl_fixup (void); | 
|  | +  extern int _dl_mips_gnu_objects; | 
|  | + | 
|  | +  if (lazy) | 
|  | +    { | 
|  | +      /* The GOT entries for functions have not yet been filled in. | 
|  | +	 Their initial contents will arrange when called to put an | 
|  | +	 offset into the .dynsym section in t8, the return address | 
|  | +	 in t7 and then jump to _GLOBAL_OFFSET_TABLE[0].  */ | 
|  | +      got = (ElfW(Addr) *) D_PTR (l, l_info[DT_PLTGOT]); | 
|  | + | 
|  | +      /* This function will get called to fix up the GOT entry indicated by | 
|  | +	 the register t8, and then jump to the resolved address.  */ | 
|  | +      got[0] = (ElfW(Addr)) &_dl_runtime_resolve; | 
|  | + | 
|  | +      /* Store l to _GLOBAL_OFFSET_TABLE[1] for gnu object. The MSB | 
|  | +	 of got[1] of a gnu object is set to identify gnu objects. | 
|  | +	 Where we can store l for non gnu objects? XXX  */ | 
|  | +      if ((got[1] & ELF_MIPS_GNU_GOT1_MASK) != 0) | 
|  | +	got[1] = ((ElfW(Addr)) l | ELF_MIPS_GNU_GOT1_MASK); | 
|  | +      else | 
|  | +	_dl_mips_gnu_objects = 0; | 
|  | +    } | 
|  | + | 
|  | +  /* Relocate global offset table.  */ | 
|  | +  elf_machine_got_rel (l, lazy); | 
|  | + | 
|  | +  /* If using PLTs, fill in the first two entries of .got.plt.  */ | 
|  | +  if (l->l_info[DT_JMPREL] && lazy) | 
|  | +    { | 
|  | +      ElfW(Addr) *gotplt; | 
|  | +      gotplt = (ElfW(Addr) *) D_PTR (l, l_info[DT_MIPS (PLTGOT)]); | 
|  | +      /* If a library is prelinked but we have to relocate anyway, | 
|  | +	 we have to be able to undo the prelinking of .got.plt. | 
|  | +	 The prelinker saved the address of .plt for us here.  */ | 
|  | +      if (gotplt[1]) | 
|  | +	l->l_mach.plt = gotplt[1] + l->l_addr; | 
|  | +      gotplt[0] = (ElfW(Addr)) &_dl_fixup; | 
|  | +      gotplt[1] = (ElfW(Addr)) l; | 
|  | +      /* Relocate subsequent .got.plt entries. */ | 
|  | +      for (gotplt += 2; *gotplt; gotplt++) | 
|  | +	*gotplt += l->l_addr; | 
|  | +    } | 
|  | + | 
|  | +# endif | 
|  | +  return lazy; | 
|  | +} | 
|  | + | 
|  | +#endif /* RESOLVE_MAP */ | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/dl-tls.h glibc-2.19-riscv/sysdeps/riscv/dl-tls.h | 
|  | --- glibc-2.19/sysdeps/riscv/dl-tls.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/dl-tls.h	2014-12-09 16:55:03.156727789 -0800 | 
|  | @@ -0,0 +1,49 @@ | 
|  | +/* Thread-local storage handling in the ELF dynamic linker.  MIPS version. | 
|  | +   Copyright (C) 2005 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | + | 
|  | +/* 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 -ruN glibc-2.19/sysdeps/riscv/dl-trampoline.c glibc-2.19-riscv/sysdeps/riscv/dl-trampoline.c | 
|  | --- glibc-2.19/sysdeps/riscv/dl-trampoline.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/dl-trampoline.c	2014-12-09 16:55:03.156727789 -0800 | 
|  | @@ -0,0 +1,104 @@ | 
|  | +/* PLT trampoline.  MIPS version. | 
|  | +   Copyright (C) 1996-2001, 2002, 2003, 2004, 2005 | 
|  | +   Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by Kazumoto Kojima <kkojima@info.kanagawa-u.ac.jp>. | 
|  | + | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +/*  FIXME: Profiling of shared libraries is not implemented yet.  */ | 
|  | + | 
|  | +#include <sysdep.h> | 
|  | +#include <link.h> | 
|  | +#include <elf.h> | 
|  | +#include <ldsodefs.h> | 
|  | +#include <dl-machine.h> | 
|  | + | 
|  | +/* The flag _dl_mips_gnu_objects is set if all dynamic objects are | 
|  | +   generated by the gnu linker. */ | 
|  | +int _dl_mips_gnu_objects = 1; | 
|  | + | 
|  | +/* Get link map for callers object containing STUB_PC.  */ | 
|  | +static inline struct link_map * | 
|  | +elf_machine_runtime_link_map (ElfW(Addr) gpreg, ElfW(Addr) stub_pc) | 
|  | +{ | 
|  | +  /* got[1] is reserved to keep its link map address for the shared | 
|  | +     object generated by the gnu linker.  If all are such objects, we | 
|  | +     can find the link map from current GPREG simply.  If not so, get | 
|  | +     the link map for caller's object containing STUB_PC.  */ | 
|  | + | 
|  | +  if (_dl_mips_gnu_objects) | 
|  | +    { | 
|  | +      ElfW(Addr) *got = elf_mips_got_from_gpreg (gpreg); | 
|  | +      ElfW(Word) g1; | 
|  | + | 
|  | +      g1 = ((ElfW(Word) *) got)[1]; | 
|  | + | 
|  | +      if ((g1 & ELF_MIPS_GNU_GOT1_MASK) != 0) | 
|  | +	{ | 
|  | +	  struct link_map *l = | 
|  | +	    (struct link_map *) (g1 & ~ELF_MIPS_GNU_GOT1_MASK); | 
|  | +	  ElfW(Addr) base, limit; | 
|  | +	  const ElfW(Phdr) *p = l->l_phdr; | 
|  | +	  ElfW(Half) this, nent = l->l_phnum; | 
|  | + | 
|  | +	  /* For the common case of a stub being called from the containing | 
|  | +	     object, STUB_PC will point to somewhere within the object that | 
|  | +	     is described by the link map fetched via got[1].  Otherwise we | 
|  | +	     have to scan all maps.  */ | 
|  | +	  for (this = 0; this < nent; this++) | 
|  | +	    { | 
|  | +	      if (p[this].p_type == PT_LOAD) | 
|  | +		{ | 
|  | +		  base = p[this].p_vaddr + l->l_addr; | 
|  | +		  limit = base + p[this].p_memsz; | 
|  | +		  if (stub_pc >= base && stub_pc < limit) | 
|  | +		    return l; | 
|  | +		} | 
|  | +	    } | 
|  | +	} | 
|  | +    } | 
|  | + | 
|  | +    struct link_map *l; | 
|  | +    Lmid_t nsid; | 
|  | + | 
|  | +    for (nsid = 0; nsid < DL_NNS; ++nsid) | 
|  | +      for (l = GL(dl_ns)[nsid]._ns_loaded; l != NULL; l = l->l_next) | 
|  | +	{ | 
|  | +	  ElfW(Addr) base, limit; | 
|  | +	  const ElfW(Phdr) *p = l->l_phdr; | 
|  | +	  ElfW(Half) this, nent = l->l_phnum; | 
|  | + | 
|  | +	  for (this = 0; this < nent; ++this) | 
|  | +	    { | 
|  | +	      if (p[this].p_type == PT_LOAD) | 
|  | +		{ | 
|  | +		  base = p[this].p_vaddr + l->l_addr; | 
|  | +		  limit = base + p[this].p_memsz; | 
|  | +		  if (stub_pc >= base && stub_pc < limit) | 
|  | +		    return l; | 
|  | +		} | 
|  | +	    } | 
|  | +	} | 
|  | + | 
|  | +  _dl_signal_error (0, NULL, NULL, "cannot find runtime link map"); | 
|  | +  return NULL; | 
|  | +} | 
|  | + | 
|  | +void _dl_runtime_resolve(void) | 
|  | +{ | 
|  | +  while (1); | 
|  | +} | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/elf/configure glibc-2.19-riscv/sysdeps/riscv/elf/configure | 
|  | --- glibc-2.19/sysdeps/riscv/elf/configure	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/elf/configure	2014-12-09 16:55:03.156727789 -0800 | 
|  | @@ -0,0 +1,126 @@ | 
|  | + | 
|  | +# as_fn_set_status STATUS | 
|  | +# ----------------------- | 
|  | +# Set $? to STATUS, without forking. | 
|  | +as_fn_set_status () | 
|  | +{ | 
|  | +  return $1 | 
|  | +} # as_fn_set_status | 
|  | + | 
|  | +# as_fn_exit STATUS | 
|  | +# ----------------- | 
|  | +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. | 
|  | +as_fn_exit () | 
|  | +{ | 
|  | +  set +e | 
|  | +  as_fn_set_status $1 | 
|  | +  exit $1 | 
|  | +} # as_fn_exit | 
|  | +if expr a : '\(a\)' >/dev/null 2>&1 && | 
|  | +   test "X`expr 00001 : '.*\(...\)'`" = X001; then | 
|  | +  as_expr=expr | 
|  | +else | 
|  | +  as_expr=false | 
|  | +fi | 
|  | + | 
|  | +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then | 
|  | +  as_basename=basename | 
|  | +else | 
|  | +  as_basename=false | 
|  | +fi | 
|  | + | 
|  | +as_me=`$as_basename -- "$0" || | 
|  | +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ | 
|  | +	 X"$0" : 'X\(//\)$' \| \ | 
|  | +	 X"$0" : 'X\(/\)' \| . 2>/dev/null || | 
|  | +$as_echo X/"$0" | | 
|  | +    sed '/^.*\/\([^/][^/]*\)\/*$/{ | 
|  | +	    s//\1/ | 
|  | +	    q | 
|  | +	  } | 
|  | +	  /^X\/\(\/\/\)$/{ | 
|  | +	    s//\1/ | 
|  | +	    q | 
|  | +	  } | 
|  | +	  /^X\/\(\/\).*/{ | 
|  | +	    s//\1/ | 
|  | +	    q | 
|  | +	  } | 
|  | +	  s/.*/./; q'` | 
|  | + | 
|  | + | 
|  | +  as_lineno_1=$LINENO as_lineno_1a=$LINENO | 
|  | +  as_lineno_2=$LINENO as_lineno_2a=$LINENO | 
|  | +  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && | 
|  | +  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { | 
|  | +  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-) | 
|  | +  sed -n ' | 
|  | +    p | 
|  | +    /[$]LINENO/= | 
|  | +  ' <$as_myself | | 
|  | +    sed ' | 
|  | +      s/[$]LINENO.*/&-/ | 
|  | +      t lineno | 
|  | +      b | 
|  | +      :lineno | 
|  | +      N | 
|  | +      :loop | 
|  | +      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ | 
|  | +      t loop | 
|  | +      s/-\n.*// | 
|  | +    ' >$as_me.lineno && | 
|  | +  chmod +x "$as_me.lineno" || | 
|  | +    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } | 
|  | + | 
|  | +  # Don't try to exec as it changes $[0], causing all sort of problems | 
|  | +  # (the dirname of $[0] is not the place where we might find the | 
|  | +  # original and so on.  Autoconf is especially sensitive to this). | 
|  | +  . "./$as_me.lineno" | 
|  | +  # Exit status is that of the last command. | 
|  | +  exit | 
|  | +} | 
|  | + | 
|  | +# This file is generated from configure.in by Autoconf.  DO NOT EDIT! | 
|  | + # Local configure fragment for sysdeps/mips/elf. | 
|  | + | 
|  | +if test "$usetls" != no; then | 
|  | +# Check for support of thread-local storage handling in assembler and | 
|  | +# linker. | 
|  | +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for MIPS TLS support" >&5 | 
|  | +$as_echo_n "checking for MIPS TLS support... " >&6; } | 
|  | +if ${libc_cv_mips_tls+:} false; then : | 
|  | +  $as_echo_n "(cached) " >&6 | 
|  | +else | 
|  | +  cat > conftest.s <<\EOF | 
|  | +	.section ".tdata", "awT", %progbits | 
|  | +	.globl foo | 
|  | +foo:	.long	1 | 
|  | +	.section ".tbss", "awT", %nobits | 
|  | +	.globl bar | 
|  | +bar:	.skip	4 | 
|  | +	.text | 
|  | + | 
|  | +	la		v0, __tls_get_addr | 
|  | +	la.tls.gd	a0, x | 
|  | +	jalr		v0 | 
|  | +EOF | 
|  | +if { ac_try='${CC-cc} -c $CFLAGS conftest.s 1>&5' | 
|  | +  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 | 
|  | +  (eval $ac_try) 2>&5 | 
|  | +  ac_status=$? | 
|  | +  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 | 
|  | +  test $ac_status = 0; }; }; then | 
|  | +  libc_cv_mips_tls=yes | 
|  | +else | 
|  | +  libc_cv_mips_tls=no | 
|  | +fi | 
|  | +rm -f conftest* | 
|  | +fi | 
|  | +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_mips_tls" >&5 | 
|  | +$as_echo "$libc_cv_mips_tls" >&6; } | 
|  | +if test $libc_cv_mips_tls = yes; then | 
|  | +  $as_echo "#define HAVE_TLS_SUPPORT 1" >>confdefs.h | 
|  | + | 
|  | +fi | 
|  | +fi | 
|  | + | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/elf/configure.in glibc-2.19-riscv/sysdeps/riscv/elf/configure.in | 
|  | --- glibc-2.19/sysdeps/riscv/elf/configure.in	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/elf/configure.in	2014-12-09 16:55:03.160727813 -0800 | 
|  | @@ -0,0 +1,35 @@ | 
|  | +GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory. | 
|  | +# Local configure fragment for sysdeps/mips/elf. | 
|  | + | 
|  | +if test "$usetls" != no; then | 
|  | +# Check for support of thread-local storage handling in assembler and | 
|  | +# linker. | 
|  | +AC_CACHE_CHECK(for MIPS TLS support, libc_cv_mips_tls, [dnl | 
|  | +cat > conftest.s <<\EOF | 
|  | +	.section ".tdata", "awT", %progbits | 
|  | +	.globl foo | 
|  | +foo:	.long	1 | 
|  | +	.section ".tbss", "awT", %nobits | 
|  | +	.globl bar | 
|  | +bar:	.skip	4 | 
|  | +	.text | 
|  | + | 
|  | +	la		v0, __tls_get_addr | 
|  | +	la.tls.gd	a0, x | 
|  | +	jalr		v0 | 
|  | +EOF | 
|  | +dnl | 
|  | +if AC_TRY_COMMAND(${CC-cc} -c $CFLAGS conftest.s 1>&AS_MESSAGE_LOG_FD); then | 
|  | +  libc_cv_mips_tls=yes | 
|  | +else | 
|  | +  libc_cv_mips_tls=no | 
|  | +fi | 
|  | +rm -f conftest*]) | 
|  | +if test $libc_cv_mips_tls = yes; then | 
|  | +  AC_DEFINE(HAVE_TLS_SUPPORT) | 
|  | +fi | 
|  | +fi | 
|  | + | 
|  | +dnl No MIPS GCC supports accessing static and hidden symbols in an | 
|  | +dnl position independent way. | 
|  | +dnl AC_DEFINE(PI_STATIC_AND_HIDDEN) | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/elf/start.S glibc-2.19-riscv/sysdeps/riscv/elf/start.S | 
|  | --- glibc-2.19/sysdeps/riscv/elf/start.S	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/elf/start.S	2014-12-09 16:55:03.160727813 -0800 | 
|  | @@ -0,0 +1,98 @@ | 
|  | +/* Startup code compliant to the ELF Mips ABI. | 
|  | +   Copyright (C) 1995, 1997, 2000, 2001, 2002, 2003, 2004 | 
|  | +	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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#define __ASSEMBLY__ 1 | 
|  | +#include <entry.h> | 
|  | +#include <sgidefs.h> | 
|  | +#include <sys/asm.h> | 
|  | + | 
|  | +#ifndef ENTRY_POINT | 
|  | +#error ENTRY_POINT needs to be defined for start.S on MIPS/ELF. | 
|  | +#endif | 
|  | + | 
|  | +/* This is the canonical entry point, usually the first thing in the text | 
|  | +   segment.  The SVR4/Mips ABI (pages 3-31, 3-32) says that when the entry | 
|  | +   point runs, most registers' values are unspecified, except for: | 
|  | + | 
|  | +   v0 ($2)	Contains a function pointer to be registered with `atexit'. | 
|  | +		This is how the dynamic linker arranges to have DT_FINI | 
|  | +		functions called for shared libraries that have been loaded | 
|  | +		before this code runs. | 
|  | + | 
|  | +   sp ($29)	The stack contains the arguments and environment: | 
|  | +		0(%esp)			argc | 
|  | +		4(%esp)			argv[0] | 
|  | +		... | 
|  | +		(4*argc)(%esp)		NULL | 
|  | +		(4*(argc+1))(%esp)	envp[0] | 
|  | +		... | 
|  | +					NULL | 
|  | +   ra ($31)	The return address register is set to zero so that programs | 
|  | +		that search backword through stack frames recognize the last | 
|  | +		stack frame. | 
|  | +*/ | 
|  | + | 
|  | + | 
|  | +/* We need to call: | 
|  | +   __libc_start_main (int (*main) (int, char **, char **), int argc, | 
|  | +		      char **argv, void (*init) (void), void (*fini) (void), | 
|  | +		      void (*rtld_fini) (void), void *stack_end) | 
|  | +*/ | 
|  | + | 
|  | +	.text | 
|  | +	.globl ENTRY_POINT | 
|  | +	.type ENTRY_POINT,@function | 
|  | +ENTRY_POINT: | 
|  | +	la    a0, main | 
|  | +	REG_L a1, 0(sp)      /* argc */ | 
|  | +	addi  a2, sp, SZREG  /* argv */ | 
|  | +	andi  sp, sp, ALMASK /* Align stack. */ | 
|  | +	la    a3, __libc_csu_init | 
|  | +	la    a4, __libc_csu_fini | 
|  | +	move  a5, v0  /* rtld_fini */ | 
|  | +	move  a6, sp  /* stack_end */ | 
|  | + | 
|  | +	la    v0, __libc_start_main | 
|  | +	jr    v0 | 
|  | + | 
|  | +/* 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 -ruN glibc-2.19/sysdeps/riscv/fpu/bits/mathinline.h glibc-2.19-riscv/sysdeps/riscv/fpu/bits/mathinline.h | 
|  | --- glibc-2.19/sysdeps/riscv/fpu/bits/mathinline.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/fpu/bits/mathinline.h	2014-12-09 16:55:03.160727813 -0800 | 
|  | @@ -0,0 +1,52 @@ | 
|  | +/* Inline math functions for RISC-V. | 
|  | +   Copyright (C) 2011 | 
|  | +   Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by Jakub Jelinek <jakub@redhat.com>. | 
|  | + | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef _MATH_H | 
|  | +# error "Never use <bits/mathinline.h> directly; include <math.h> instead." | 
|  | +#endif | 
|  | + | 
|  | +#include <bits/wordsize.h> | 
|  | + | 
|  | +#ifdef __GNUC__ | 
|  | + | 
|  | +#if defined __USE_ISOC99 | 
|  | +# undef isgreater | 
|  | +# undef isgreaterequal | 
|  | +# undef isless | 
|  | +# undef islessequal | 
|  | +# undef islessgreater | 
|  | +# undef isunordered | 
|  | + | 
|  | +# define isgreater(x, y) ((x) > (y)) | 
|  | +# define isgreaterequal(x, y) ((x) >= (y)) | 
|  | +# define isless(x, y) ((x) < (y)) | 
|  | +# define islessequal(x, y) ((x) <= (y)) | 
|  | +# define islessgreater(x, y) (!!(isless(x, y) + isgreater(x, y))) | 
|  | +# define isunordered(x, y) (((x) == (x)) + ((y) == (y)) < 2) | 
|  | + | 
|  | +#endif /* __USE_ISOC99 */ | 
|  | + | 
|  | +#if (!defined __NO_MATH_INLINES || defined __LIBC_INTERNAL_MATH_INLINES) && defined __OPTIMIZE__ | 
|  | + | 
|  | +/* Nothing yet. */ | 
|  | + | 
|  | +#endif /* !__NO_MATH_INLINES && __OPTIMIZE__ */ | 
|  | +#endif /* __GNUC__ */ | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/fpu/e_sqrt.c glibc-2.19-riscv/sysdeps/riscv/fpu/e_sqrt.c | 
|  | --- glibc-2.19/sysdeps/riscv/fpu/e_sqrt.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/fpu/e_sqrt.c	2014-12-09 16:55:03.160727813 -0800 | 
|  | @@ -0,0 +1,26 @@ | 
|  | +/* Copyright (C) 2002 Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by Hartvig Ekner <hartvige@mips.com>, 2002. | 
|  | + | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +double | 
|  | +__ieee754_sqrt (double x) | 
|  | +{ | 
|  | +  double z; | 
|  | +  __asm__ ("fsqrt.d %0,%1" : "=f" (z) : "f" (x)); | 
|  | +  return z; | 
|  | +} | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/fpu/e_sqrtf.c glibc-2.19-riscv/sysdeps/riscv/fpu/e_sqrtf.c | 
|  | --- glibc-2.19/sysdeps/riscv/fpu/e_sqrtf.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/fpu/e_sqrtf.c	2014-12-09 16:55:03.160727813 -0800 | 
|  | @@ -0,0 +1,26 @@ | 
|  | +/* Copyright (C) 2002 Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by Hartvig Ekner <hartvige@mips.com>, 2002. | 
|  | + | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +float | 
|  | +__ieee754_sqrtf (float x) | 
|  | +{ | 
|  | +  float z; | 
|  | +  __asm__ ("fsqrt.s %0,%1" : "=f" (z) : "f" (x)); | 
|  | +  return z; | 
|  | +} | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/fpu/fclrexcpt.c glibc-2.19-riscv/sysdeps/riscv/fpu/fclrexcpt.c | 
|  | --- glibc-2.19/sysdeps/riscv/fpu/fclrexcpt.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/fpu/fclrexcpt.c	2014-12-09 16:55:03.160727813 -0800 | 
|  | @@ -0,0 +1,47 @@ | 
|  | +/* Clear given exceptions in current floating-point environment. | 
|  | +   Copyright (C) 1998, 1999, 2000, 2002 Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by Andreas Jaeger <aj@suse.de>, 1998. | 
|  | + | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <fenv.h> | 
|  | +#include <fenv_libc.h> | 
|  | +#include <fpu_control.h> | 
|  | + | 
|  | +int | 
|  | +feclearexcept (int excepts) | 
|  | +{ | 
|  | +  int cw; | 
|  | + | 
|  | +  /* Mask out unsupported bits/exceptions.  */ | 
|  | +  excepts &= FE_ALL_EXCEPT; | 
|  | + | 
|  | +  /* Read the complete control word.  */ | 
|  | +  _FPU_GETCW (cw); | 
|  | + | 
|  | +  /* Clear exception flag bits and cause bits. If the cause bit is not | 
|  | +     cleared, the next CTC instruction (just below) will re-generate the | 
|  | +     exception.  */ | 
|  | + | 
|  | +  cw &= ~(excepts | (excepts << CAUSE_SHIFT)); | 
|  | + | 
|  | +  /* Put the new data in effect.  */ | 
|  | +  _FPU_SETCW (cw); | 
|  | + | 
|  | +  /* Success.  */ | 
|  | +  return 0; | 
|  | +} | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/fpu/fedisblxcpt.c glibc-2.19-riscv/sysdeps/riscv/fpu/fedisblxcpt.c | 
|  | --- glibc-2.19/sysdeps/riscv/fpu/fedisblxcpt.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/fpu/fedisblxcpt.c	2014-12-09 16:55:03.160727813 -0800 | 
|  | @@ -0,0 +1,42 @@ | 
|  | +/* Disable floating-point exceptions. | 
|  | +   Copyright (C) 2000 Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by Andreas Jaeger <aj@suse.de>, 2000. | 
|  | + | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <fenv.h> | 
|  | +#include <fenv_libc.h> | 
|  | +#include <fpu_control.h> | 
|  | + | 
|  | +int | 
|  | +fedisableexcept (int excepts) | 
|  | +{ | 
|  | +  unsigned int new_exc, old_exc; | 
|  | + | 
|  | +  /* Get the current control word.  */ | 
|  | +  _FPU_GETCW (new_exc); | 
|  | + | 
|  | +  old_exc = (new_exc & ENABLE_MASK) >> ENABLE_SHIFT; | 
|  | + | 
|  | +  excepts &= FE_ALL_EXCEPT; | 
|  | + | 
|  | +  new_exc &= ~(excepts << ENABLE_SHIFT); | 
|  | +  new_exc &= ~_FPU_RESERVED; | 
|  | +  _FPU_SETCW (new_exc); | 
|  | + | 
|  | +  return old_exc; | 
|  | +} | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/fpu/feenablxcpt.c glibc-2.19-riscv/sysdeps/riscv/fpu/feenablxcpt.c | 
|  | --- glibc-2.19/sysdeps/riscv/fpu/feenablxcpt.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/fpu/feenablxcpt.c	2014-12-09 16:55:03.160727813 -0800 | 
|  | @@ -0,0 +1,42 @@ | 
|  | +/* Enable floating-point exceptions. | 
|  | +   Copyright (C) 2000 Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by Andreas Jaeger <aj@suse.de>, 2000. | 
|  | + | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <fenv.h> | 
|  | +#include <fenv_libc.h> | 
|  | +#include <fpu_control.h> | 
|  | + | 
|  | +int | 
|  | +feenableexcept (int excepts) | 
|  | +{ | 
|  | +  unsigned int new_exc, old_exc; | 
|  | + | 
|  | +  /* Get the current control word.  */ | 
|  | +  _FPU_GETCW (new_exc); | 
|  | + | 
|  | +  old_exc = (new_exc & ENABLE_MASK) >> ENABLE_SHIFT; | 
|  | + | 
|  | +  excepts &= FE_ALL_EXCEPT; | 
|  | + | 
|  | +  new_exc |= excepts << ENABLE_SHIFT; | 
|  | +  new_exc &= ~_FPU_RESERVED; | 
|  | +  _FPU_SETCW (new_exc); | 
|  | + | 
|  | +  return old_exc; | 
|  | +} | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/fpu/fegetenv.c glibc-2.19-riscv/sysdeps/riscv/fpu/fegetenv.c | 
|  | --- glibc-2.19/sysdeps/riscv/fpu/fegetenv.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/fpu/fegetenv.c	2014-12-09 16:55:03.160727813 -0800 | 
|  | @@ -0,0 +1,32 @@ | 
|  | +/* Store current floating-point environment. | 
|  | +   Copyright (C) 1998, 1999, 2000, 2002, 2010 Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by Andreas Jaeger <aj@suse.de>, 1998. | 
|  | + | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <fenv.h> | 
|  | +#include <fpu_control.h> | 
|  | + | 
|  | +int | 
|  | +fegetenv (fenv_t *envp) | 
|  | +{ | 
|  | +  _FPU_GETCW (*envp); | 
|  | + | 
|  | +  /* Success.  */ | 
|  | +  return 0; | 
|  | +} | 
|  | +libm_hidden_def (fegetenv) | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/fpu/fegetexcept.c glibc-2.19-riscv/sysdeps/riscv/fpu/fegetexcept.c | 
|  | --- glibc-2.19/sysdeps/riscv/fpu/fegetexcept.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/fpu/fegetexcept.c	2014-12-09 16:55:03.160727813 -0800 | 
|  | @@ -0,0 +1,34 @@ | 
|  | +/* Get enabled floating-point exceptions. | 
|  | +   Copyright (C) 2000 Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by Andreas Jaeger <aj@suse.de>, 2000. | 
|  | + | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <fenv.h> | 
|  | +#include <fenv_libc.h> | 
|  | +#include <fpu_control.h> | 
|  | + | 
|  | +int | 
|  | +fegetexcept (void) | 
|  | +{ | 
|  | +  unsigned int exc; | 
|  | + | 
|  | +  /* Get the current control word.  */ | 
|  | +  _FPU_GETCW (exc); | 
|  | + | 
|  | +  return (exc & ENABLE_MASK) >> ENABLE_SHIFT; | 
|  | +} | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/fpu/fegetround.c glibc-2.19-riscv/sysdeps/riscv/fpu/fegetround.c | 
|  | --- glibc-2.19/sysdeps/riscv/fpu/fegetround.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/fpu/fegetround.c	2014-12-09 16:55:03.160727813 -0800 | 
|  | @@ -0,0 +1,33 @@ | 
|  | +/* Return current rounding direction. | 
|  | +   Copyright (C) 1998 Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by Andreas Jaeger <aj@arthur.rhein-neckar.de>, 1998. | 
|  | + | 
|  | +   The GNU C Library is free software; you can redistribute it and/or | 
|  | +   modify it under the terms of the GNU 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <fenv.h> | 
|  | +#include <fpu_control.h> | 
|  | + | 
|  | +int | 
|  | +fegetround (void) | 
|  | +{ | 
|  | +  int cw; | 
|  | + | 
|  | +  /* Get control word.  */ | 
|  | +  _FPU_GETCW (cw); | 
|  | + | 
|  | +  return cw & 0x3; | 
|  | +} | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/fpu/feholdexcpt.c glibc-2.19-riscv/sysdeps/riscv/fpu/feholdexcpt.c | 
|  | --- glibc-2.19/sysdeps/riscv/fpu/feholdexcpt.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/fpu/feholdexcpt.c	2014-12-09 16:55:03.160727813 -0800 | 
|  | @@ -0,0 +1,40 @@ | 
|  | +/* Store current floating-point environment and clear exceptions. | 
|  | +   Copyright (C) 2000 Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by Andreas Jaeger <aj@suse.de>, 2000. | 
|  | + | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <fenv.h> | 
|  | +#include <fpu_control.h> | 
|  | + | 
|  | +int | 
|  | +feholdexcept (fenv_t *envp) | 
|  | +{ | 
|  | +  fpu_control_t cw; | 
|  | + | 
|  | +  /* Save the current state.  */ | 
|  | +  _FPU_GETCW (cw); | 
|  | +  envp->__fp_control_register = cw; | 
|  | + | 
|  | +  /* Clear all exception enable bits and flags.  */ | 
|  | +  cw &= ~(_FPU_MASK_V|_FPU_MASK_Z|_FPU_MASK_O|_FPU_MASK_U|_FPU_MASK_I|FE_ALL_EXCEPT); | 
|  | +  _FPU_SETCW (cw); | 
|  | + | 
|  | +  return 0; | 
|  | +} | 
|  | + | 
|  | +libm_hidden_def (feholdexcept) | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/fpu/fenv_libc.h glibc-2.19-riscv/sysdeps/riscv/fpu/fenv_libc.h | 
|  | --- glibc-2.19/sysdeps/riscv/fpu/fenv_libc.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/fpu/fenv_libc.h	2014-12-09 16:55:03.160727813 -0800 | 
|  | @@ -0,0 +1,32 @@ | 
|  | +/* Copyright (C) 2000, 2002 Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by Andreas Jaeger <aj@suse.de>. | 
|  | + | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef _FENV_LIBC_H | 
|  | +#define _FENV_LIBC_H    1 | 
|  | + | 
|  | +/* Mask for enabling exceptions and for the CAUSE bits.  */ | 
|  | +#define ENABLE_MASK	0x00F80U | 
|  | +#define CAUSE_MASK	0x1F000U | 
|  | + | 
|  | +/* Shift for FE_* flags to get up to the ENABLE bits and the CAUSE bits.  */ | 
|  | +#define	ENABLE_SHIFT	5 | 
|  | +#define	CAUSE_SHIFT	10 | 
|  | + | 
|  | + | 
|  | +#endif /* _FENV_LIBC_H */ | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/fpu/fesetenv.c glibc-2.19-riscv/sysdeps/riscv/fpu/fesetenv.c | 
|  | --- glibc-2.19/sysdeps/riscv/fpu/fesetenv.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/fpu/fesetenv.c	2014-12-09 16:55:03.160727813 -0800 | 
|  | @@ -0,0 +1,43 @@ | 
|  | +/* Install given floating-point environment. | 
|  | +   Copyright (C) 1998, 1999, 2000, 2002 Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by Andreas Jaeger <aj@suse.de>, 1998. | 
|  | + | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <fenv.h> | 
|  | +#include <fpu_control.h> | 
|  | + | 
|  | +int | 
|  | +fesetenv (const fenv_t *envp) | 
|  | +{ | 
|  | +  fpu_control_t cw; | 
|  | + | 
|  | +  /* Read first current state to flush fpu pipeline.  */ | 
|  | +  _FPU_GETCW (cw); | 
|  | + | 
|  | +  if (envp == FE_DFL_ENV) | 
|  | +    _FPU_SETCW (_FPU_DEFAULT); | 
|  | +  else if (envp == FE_NOMASK_ENV) | 
|  | +    _FPU_SETCW (_FPU_IEEE); | 
|  | +  else | 
|  | +    _FPU_SETCW (envp->__fp_control_register); | 
|  | + | 
|  | +  /* Success.  */ | 
|  | +  return 0; | 
|  | +} | 
|  | + | 
|  | +libm_hidden_def (fesetenv) | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/fpu/fesetround.c glibc-2.19-riscv/sysdeps/riscv/fpu/fesetround.c | 
|  | --- glibc-2.19/sysdeps/riscv/fpu/fesetround.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/fpu/fesetround.c	2014-12-09 16:55:03.160727813 -0800 | 
|  | @@ -0,0 +1,45 @@ | 
|  | +/* Set current rounding direction. | 
|  | +   Copyright (C) 1998 Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by Andreas Jaeger <aj@arthur.rhein-neckar.de>, 1998. | 
|  | + | 
|  | +   The GNU C Library is free software; you can redistribute it and/or | 
|  | +   modify it under the terms of the GNU 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <fenv.h> | 
|  | +#include <fpu_control.h> | 
|  | + | 
|  | +int | 
|  | +fesetround (int round) | 
|  | +{ | 
|  | +  fpu_control_t cw; | 
|  | + | 
|  | +  if ((round & ~0x3) != 0) | 
|  | +    /* ROUND is no valid rounding mode.  */ | 
|  | +    return 1; | 
|  | + | 
|  | +  /* Get current state.  */ | 
|  | +  _FPU_GETCW (cw); | 
|  | + | 
|  | +  /* Set rounding bits.  */ | 
|  | +  cw &= ~0x3; | 
|  | +  cw |= round; | 
|  | +  /* Set new state.  */ | 
|  | +  _FPU_SETCW (cw); | 
|  | + | 
|  | +  return 0; | 
|  | +} | 
|  | + | 
|  | +libm_hidden_def (fesetround) | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/fpu/feupdateenv.c glibc-2.19-riscv/sysdeps/riscv/fpu/feupdateenv.c | 
|  | --- glibc-2.19/sysdeps/riscv/fpu/feupdateenv.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/fpu/feupdateenv.c	2014-12-09 16:55:03.160727813 -0800 | 
|  | @@ -0,0 +1,44 @@ | 
|  | +/* Install given floating-point environment and raise exceptions. | 
|  | +   Copyright (C) 1998, 1999, 2000, 2002, 2010 Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by Andreas Jaeger <aj@suse.de>, 1998. | 
|  | + | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <fenv.h> | 
|  | +#include <fpu_control.h> | 
|  | + | 
|  | +int | 
|  | +feupdateenv (const fenv_t *envp) | 
|  | +{ | 
|  | +  int temp; | 
|  | + | 
|  | +  /* Save current exceptions.  */ | 
|  | +  _FPU_GETCW (temp); | 
|  | +  temp &= FE_ALL_EXCEPT; | 
|  | + | 
|  | +  /* Install new environment.  */ | 
|  | +  fesetenv (envp); | 
|  | + | 
|  | +  /* Raise the safed exception.  Incidently for us the implementation | 
|  | +     defined format of the values in objects of type fexcept_t is the | 
|  | +     same as the ones specified using the FE_* constants.  */ | 
|  | +  feraiseexcept (temp); | 
|  | + | 
|  | +  /* Success.  */ | 
|  | +  return 0; | 
|  | +} | 
|  | +libm_hidden_def (feupdateenv) | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/fpu/fgetexcptflg.c glibc-2.19-riscv/sysdeps/riscv/fpu/fgetexcptflg.c | 
|  | --- glibc-2.19/sysdeps/riscv/fpu/fgetexcptflg.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/fpu/fgetexcptflg.c	2014-12-09 16:55:03.160727813 -0800 | 
|  | @@ -0,0 +1,40 @@ | 
|  | +/* Store current representation for exceptions. | 
|  | +   Copyright (C) 1998, 1999, 2000, 2002 Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by Andreas Jaeger <aj@suse.de>, 1998. | 
|  | + | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <fenv.h> | 
|  | +#include <fpu_control.h> | 
|  | + | 
|  | +int | 
|  | +fegetexceptflag (fexcept_t *flagp, int excepts) | 
|  | +{ | 
|  | +  fpu_control_t temp; | 
|  | + | 
|  | +  /* Get the current exceptions.  */ | 
|  | +  _FPU_GETCW (temp); | 
|  | + | 
|  | +  /* We only save the relevant bits here. In particular, care has to be | 
|  | +     taken with the CAUSE bits, as an inadvertent restore later on could | 
|  | +     generate unexpected exceptions.  */ | 
|  | + | 
|  | +  *flagp = temp & excepts & FE_ALL_EXCEPT; | 
|  | + | 
|  | +  /* Success.  */ | 
|  | +  return 0; | 
|  | +} | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/fpu/fraiseexcpt.c glibc-2.19-riscv/sysdeps/riscv/fpu/fraiseexcpt.c | 
|  | --- glibc-2.19/sysdeps/riscv/fpu/fraiseexcpt.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/fpu/fraiseexcpt.c	2014-12-09 16:55:03.160727813 -0800 | 
|  | @@ -0,0 +1,47 @@ | 
|  | +/* Raise given exceptions. | 
|  | +   Copyright (C) 2000, 2002 Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by Andreas Jaeger <aj@suse.de>, 2000. | 
|  | + | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <fenv.h> | 
|  | +#include <fenv_libc.h> | 
|  | +#include <fpu_control.h> | 
|  | + | 
|  | +int | 
|  | +feraiseexcept (int excepts) | 
|  | +{ | 
|  | +  fpu_control_t cw; | 
|  | + | 
|  | +  /* Get current state.  */ | 
|  | +  _FPU_GETCW (cw); | 
|  | + | 
|  | +  /* Set flag bits (which are accumulative), and *also* set the | 
|  | +     cause bits. The setting of the cause bits is what actually causes | 
|  | +     the hardware to generate the exception, if the corresponding enable | 
|  | +     bit is set as well.  */ | 
|  | + | 
|  | +  excepts &= FE_ALL_EXCEPT; | 
|  | +  cw |= excepts | (excepts << CAUSE_SHIFT); | 
|  | + | 
|  | +  /* Set new state.  */ | 
|  | +  _FPU_SETCW (cw); | 
|  | + | 
|  | +  return 0; | 
|  | +} | 
|  | + | 
|  | +libm_hidden_def (feraiseexcept) | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/fpu/fsetexcptflg.c glibc-2.19-riscv/sysdeps/riscv/fpu/fsetexcptflg.c | 
|  | --- glibc-2.19/sysdeps/riscv/fpu/fsetexcptflg.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/fpu/fsetexcptflg.c	2014-12-09 16:55:03.160727813 -0800 | 
|  | @@ -0,0 +1,43 @@ | 
|  | +/* Set floating-point environment exception handling. | 
|  | +   Copyright (C) 1998, 1999, 2000, 2002 Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by Hartvig Ekner <hartvige@mips.com>, 2002. | 
|  | + | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <fenv.h> | 
|  | +#include <fpu_control.h> | 
|  | + | 
|  | +int | 
|  | +fesetexceptflag (const fexcept_t *flagp, int excepts) | 
|  | +{ | 
|  | +  fpu_control_t temp; | 
|  | + | 
|  | +  /* Get the current exceptions.  */ | 
|  | +  _FPU_GETCW (temp); | 
|  | + | 
|  | +  /* Make sure the flags we want restored are legal.  */ | 
|  | +  excepts &= FE_ALL_EXCEPT; | 
|  | + | 
|  | +  /* Now clear the bits called for, and copy them in from flagp. Note that | 
|  | +     we ignore all non-flag bits from *flagp, so they don't matter.  */ | 
|  | +  temp = (temp & ~excepts) | (*flagp & excepts); | 
|  | + | 
|  | +  _FPU_SETCW (temp); | 
|  | + | 
|  | +  /* Success.  */ | 
|  | +  return 0; | 
|  | +} | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/fpu/ftestexcept.c glibc-2.19-riscv/sysdeps/riscv/fpu/ftestexcept.c | 
|  | --- glibc-2.19/sysdeps/riscv/fpu/ftestexcept.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/fpu/ftestexcept.c	2014-12-09 16:55:03.160727813 -0800 | 
|  | @@ -0,0 +1,34 @@ | 
|  | +/* Test exception in current environment. | 
|  | +   Copyright (C) 1998, 2010 Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by Andreas Jaeger <aj@arthur.rhein-neckar.de>, 1998. | 
|  | + | 
|  | +   The GNU C Library is free software; you can redistribute it and/or | 
|  | +   modify it under the terms of the GNU 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <fenv.h> | 
|  | +#include <fpu_control.h> | 
|  | + | 
|  | +int | 
|  | +fetestexcept (int excepts) | 
|  | +{ | 
|  | +  int cw; | 
|  | + | 
|  | +  /* Get current control word.  */ | 
|  | +  _FPU_GETCW (cw); | 
|  | + | 
|  | +  return cw & excepts & FE_ALL_EXCEPT; | 
|  | +} | 
|  | +libm_hidden_def (fetestexcept) | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/fpu/libm-test-ulps glibc-2.19-riscv/sysdeps/riscv/fpu/libm-test-ulps | 
|  | --- glibc-2.19/sysdeps/riscv/fpu/libm-test-ulps	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/fpu/libm-test-ulps	2014-12-09 16:55:03.164727835 -0800 | 
|  | @@ -0,0 +1,890 @@ | 
|  | +# Begin of automatic generation | 
|  | + | 
|  | +# atan2 | 
|  | +Test "atan2 (-0.75, -1.0) == -2.49809154479650885165983415456218025": | 
|  | +float: 3 | 
|  | +ifloat: 3 | 
|  | +Test "atan2 (0.75, -1.0) == 2.49809154479650885165983415456218025": | 
|  | +float: 3 | 
|  | +ifloat: 3 | 
|  | +Test "atan2 (1.390625, 0.9296875) == 0.981498387184244311516296577615519772": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +# atanh | 
|  | +Test "atanh (0.75) == 0.972955074527656652552676371721589865": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +# cacosh | 
|  | +Test "Real part of: cacosh (-2 - 3 i) == 1.9833870299165354323470769028940395 - 2.1414491111159960199416055713254211 i": | 
|  | +double: 1 | 
|  | +float: 7 | 
|  | +idouble: 1 | 
|  | +ifloat: 7 | 
|  | +Test "Imaginary part of: cacosh (-2 - 3 i) == 1.9833870299165354323470769028940395 - 2.1414491111159960199416055713254211 i": | 
|  | +double: 1 | 
|  | +float: 3 | 
|  | +idouble: 1 | 
|  | +ifloat: 3 | 
|  | + | 
|  | +# casin | 
|  | +Test "Real part of: casin (0.75 + 1.25 i) == 0.453276177638793913448921196101971749 + 1.13239363160530819522266333696834467 i": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +# casinh | 
|  | +Test "Real part of: casinh (-2 - 3 i) == -1.9686379257930962917886650952454982 - 0.96465850440760279204541105949953237 i": | 
|  | +double: 5 | 
|  | +float: 1 | 
|  | +idouble: 5 | 
|  | +ifloat: 1 | 
|  | +Test "Imaginary part of: casinh (-2 - 3 i) == -1.9686379257930962917886650952454982 - 0.96465850440760279204541105949953237 i": | 
|  | +double: 3 | 
|  | +float: 6 | 
|  | +idouble: 3 | 
|  | +ifloat: 6 | 
|  | +Test "Real part of: casinh (0.75 + 1.25 i) == 1.03171853444778027336364058631006594 + 0.911738290968487636358489564316731207 i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Imaginary part of: casinh (0.75 + 1.25 i) == 1.03171853444778027336364058631006594 + 0.911738290968487636358489564316731207 i": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +# catan | 
|  | +Test "Real part of: catan (-2 - 3 i) == -1.4099210495965755225306193844604208 - 0.22907268296853876629588180294200276 i": | 
|  | +float: 3 | 
|  | +ifloat: 3 | 
|  | +Test "Imaginary part of: catan (-2 - 3 i) == -1.4099210495965755225306193844604208 - 0.22907268296853876629588180294200276 i": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Real part of: catan (0.75 + 1.25 i) == 1.10714871779409050301706546017853704 + 0.549306144334054845697622618461262852 i": | 
|  | +float: 4 | 
|  | +ifloat: 4 | 
|  | + | 
|  | +# catanh | 
|  | +Test "Real part of: catanh (-2 - 3 i) == -0.14694666622552975204743278515471595 - 1.3389725222944935611241935759091443 i": | 
|  | +double: 4 | 
|  | +idouble: 4 | 
|  | +Test "Imaginary part of: catanh (-2 - 3 i) == -0.14694666622552975204743278515471595 - 1.3389725222944935611241935759091443 i": | 
|  | +float: 4 | 
|  | +ifloat: 4 | 
|  | +Test "Real part of: catanh (0.75 + 1.25 i) == 0.261492138795671927078652057366532140 + 0.996825126463918666098902241310446708 i": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | +Test "Imaginary part of: catanh (0.75 + 1.25 i) == 0.261492138795671927078652057366532140 + 0.996825126463918666098902241310446708 i": | 
|  | +float: 6 | 
|  | +ifloat: 6 | 
|  | + | 
|  | +# cbrt | 
|  | +Test "cbrt (-27.0) == -3.0": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | +Test "cbrt (0.75) == 0.908560296416069829445605878163630251": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | +Test "cbrt (0.9921875) == 0.997389022060725270579075195353955217": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | + | 
|  | +# ccos | 
|  | +Test "Imaginary part of: ccos (-2 - 3 i) == -4.18962569096880723013255501961597373 - 9.10922789375533659797919726277886212 i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Real part of: ccos (0.75 + 1.25 i) == 1.38173873063425888530729933139078645 - 1.09193013555397466170919531722024128 i": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Imaginary part of: ccos (0.75 + 1.25 i) == 1.38173873063425888530729933139078645 - 1.09193013555397466170919531722024128 i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +# ccosh | 
|  | +Test "Real part of: ccosh (-2 - 3 i) == -3.72454550491532256547397070325597253 + 0.511822569987384608834463849801875634 i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Imaginary part of: ccosh (-2 - 3 i) == -3.72454550491532256547397070325597253 + 0.511822569987384608834463849801875634 i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Real part of: ccosh (0.75 + 1.25 i) == 0.408242591877968807788852146397499084 + 0.780365930845853240391326216300863152 i": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Imaginary part of: ccosh (0.75 + 1.25 i) == 0.408242591877968807788852146397499084 + 0.780365930845853240391326216300863152 i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +# cexp | 
|  | +Test "Imaginary part of: cexp (-2.0 - 3.0 i) == -0.13398091492954261346140525546115575 - 0.019098516261135196432576240858800925 i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Real part of: cexp (0.75 + 1.25 i) == 0.667537446429131586942201977015932112 + 2.00900045494094876258347228145863909 i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +# clog | 
|  | +Test "Imaginary part of: clog (-2 - 3 i) == 1.2824746787307683680267437207826593 - 2.1587989303424641704769327722648368 i": | 
|  | +float: 3 | 
|  | +ifloat: 3 | 
|  | +Test "Real part of: clog (0.75 + 1.25 i) == 0.376885901188190075998919126749298416 + 1.03037682652431246378774332703115153 i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +# clog10 | 
|  | +Test "Imaginary part of: clog10 (-0 + inf i) == inf + pi/2*log10(e) i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Imaginary part of: clog10 (-0 - inf i) == inf - pi/2*log10(e) i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Imaginary part of: clog10 (-2 - 3 i) == 0.556971676153418384603252578971164214 - 0.937554462986374708541507952140189646 i": | 
|  | +double: 1 | 
|  | +float: 5 | 
|  | +idouble: 1 | 
|  | +ifloat: 5 | 
|  | +Test "Imaginary part of: clog10 (-3 + inf i) == inf + pi/2*log10(e) i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Imaginary part of: clog10 (-3 - inf i) == inf - pi/2*log10(e) i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Imaginary part of: clog10 (-inf + 0 i) == inf + pi*log10(e) i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Imaginary part of: clog10 (-inf + 1 i) == inf + pi*log10(e) i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Imaginary part of: clog10 (-inf - 0 i) == inf - pi*log10(e) i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Imaginary part of: clog10 (-inf - 1 i) == inf - pi*log10(e) i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Imaginary part of: clog10 (0 + inf i) == inf + pi/2*log10(e) i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Imaginary part of: clog10 (0 - inf i) == inf - pi/2*log10(e) i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Real part of: clog10 (0.75 + 1.25 i) == 0.163679467193165171449476605077428975 + 0.447486970040493067069984724340855636 i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Imaginary part of: clog10 (3 + inf i) == inf + pi/2*log10(e) i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Imaginary part of: clog10 (3 - inf i) == inf - pi/2*log10(e) i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Imaginary part of: clog10 (inf + inf i) == inf + pi/4*log10(e) i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Imaginary part of: clog10 (inf - inf i) == inf - pi/4*log10(e) i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +# cos | 
|  | +Test "cos (M_PI_6l * 2.0) == 0.5": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "cos (M_PI_6l * 4.0) == -0.5": | 
|  | +double: 2 | 
|  | +float: 1 | 
|  | +idouble: 2 | 
|  | +ifloat: 1 | 
|  | +Test "cos (pi/2) == 0": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +# cpow | 
|  | +Test "Real part of: cpow (0.75 + 1.25 i, 0.0 + 1.0 i) == 0.331825439177608832276067945276730566 + 0.131338600281188544930936345230903032 i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Imaginary part of: cpow (0.75 + 1.25 i, 0.0 + 1.0 i) == 0.331825439177608832276067945276730566 + 0.131338600281188544930936345230903032 i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Real part of: cpow (0.75 + 1.25 i, 0.75 + 1.25 i) == 0.117506293914473555420279832210420483 + 0.346552747708338676483025352060418001 i": | 
|  | +double: 1 | 
|  | +float: 4 | 
|  | +idouble: 1 | 
|  | +ifloat: 4 | 
|  | +Test "Real part of: cpow (0.75 + 1.25 i, 1.0 + 1.0 i) == 0.0846958290317209430433805274189191353 + 0.513285749182902449043287190519090481 i": | 
|  | +double: 2 | 
|  | +float: 3 | 
|  | +idouble: 2 | 
|  | +ifloat: 3 | 
|  | +Test "Real part of: cpow (2 + 3 i, 4 + 0 i) == -119.0 - 120.0 i": | 
|  | +double: 1 | 
|  | +float: 4 | 
|  | +idouble: 1 | 
|  | +ifloat: 4 | 
|  | +Test "Imaginary part of: cpow (2 + 3 i, 4 + 0 i) == -119.0 - 120.0 i": | 
|  | +float: 2 | 
|  | +ifloat: 2 | 
|  | +Test "Imaginary part of: cpow (e + 0 i, 0 + 2 * M_PIl i) == 1.0 + 0.0 i": | 
|  | +double: 2 | 
|  | +float: 2 | 
|  | +idouble: 2 | 
|  | +ifloat: 2 | 
|  | + | 
|  | +# csinh | 
|  | +Test "Imaginary part of: csinh (-2 - 3 i) == 3.59056458998577995201256544779481679 - 0.530921086248519805267040090660676560 i": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | +Test "Real part of: csinh (0.75 + 1.25 i) == 0.259294854551162779153349830618433028 + 1.22863452409509552219214606515777594 i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Imaginary part of: csinh (0.75 + 1.25 i) == 0.259294854551162779153349830618433028 + 1.22863452409509552219214606515777594 i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +# csqrt | 
|  | +Test "Real part of: csqrt (-2 + 3 i) == 0.89597747612983812471573375529004348 + 1.6741492280355400404480393008490519 i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Real part of: csqrt (-2 - 3 i) == 0.89597747612983812471573375529004348 - 1.6741492280355400404480393008490519 i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +# ctan | 
|  | +Test "Real part of: ctan (-2 - 3 i) == 0.376402564150424829275122113032269084e-2 - 1.00323862735360980144635859782192726 i": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | +Test "Imaginary part of: ctan (0.75 + 1.25 i) == 0.160807785916206426725166058173438663 + 0.975363285031235646193581759755216379 i": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | + | 
|  | +# ctanh | 
|  | +Test "Real part of: ctanh (-2 - 3 i) == -0.965385879022133124278480269394560686 + 0.988437503832249372031403430350121098e-2 i": | 
|  | +double: 1 | 
|  | +float: 2 | 
|  | +idouble: 1 | 
|  | +ifloat: 2 | 
|  | +Test "Imaginary part of: ctanh (0 + pi/4 i) == 0.0 + 1.0 i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Real part of: ctanh (0.75 + 1.25 i) == 1.37260757053378320258048606571226857 + 0.385795952609750664177596760720790220 i": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | + | 
|  | +# erf | 
|  | +Test "erf (1.25) == 0.922900128256458230136523481197281140": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | + | 
|  | +# erfc | 
|  | +Test "erfc (2.0) == 0.00467773498104726583793074363274707139": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | +Test "erfc (4.125) == 0.542340079956506600531223408575531062e-8": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | + | 
|  | +# exp10 | 
|  | +Test "exp10 (-1) == 0.1": | 
|  | +double: 2 | 
|  | +float: 1 | 
|  | +idouble: 2 | 
|  | +ifloat: 1 | 
|  | +Test "exp10 (0.75) == 5.62341325190349080394951039776481231": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "exp10 (3) == 1000": | 
|  | +double: 6 | 
|  | +float: 2 | 
|  | +idouble: 6 | 
|  | +ifloat: 2 | 
|  | + | 
|  | +# expm1 | 
|  | +Test "expm1 (0.75) == 1.11700001661267466854536981983709561": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | +Test "expm1 (1) == M_El - 1.0": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +# hypot | 
|  | +Test "hypot (-0.7, -12.4) == 12.419742348374220601176836866763271": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "hypot (-0.7, 12.4) == 12.419742348374220601176836866763271": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "hypot (-12.4, -0.7) == 12.419742348374220601176836866763271": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "hypot (-12.4, 0.7) == 12.419742348374220601176836866763271": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "hypot (0.7, -12.4) == 12.419742348374220601176836866763271": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "hypot (0.7, 12.4) == 12.419742348374220601176836866763271": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "hypot (12.4, -0.7) == 12.419742348374220601176836866763271": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "hypot (12.4, 0.7) == 12.419742348374220601176836866763271": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +# j0 | 
|  | +Test "j0 (-4.0) == -3.9714980986384737228659076845169804197562E-1": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "j0 (0.75) == 0.864242275166648623555731103820923211": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "j0 (10.0) == -0.245935764451348335197760862485328754": | 
|  | +double: 2 | 
|  | +float: 1 | 
|  | +idouble: 2 | 
|  | +ifloat: 1 | 
|  | +Test "j0 (2.0) == 0.223890779141235668051827454649948626": | 
|  | +float: 2 | 
|  | +ifloat: 2 | 
|  | +Test "j0 (4.0) == -3.9714980986384737228659076845169804197562E-1": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "j0 (8.0) == 0.171650807137553906090869407851972001": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +# j1 | 
|  | +Test "j1 (10.0) == 0.0434727461688614366697487680258592883": | 
|  | +float: 2 | 
|  | +ifloat: 2 | 
|  | +Test "j1 (2.0) == 0.576724807756873387202448242269137087": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | +Test "j1 (8.0) == 0.234636346853914624381276651590454612": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | + | 
|  | +# jn | 
|  | +Test "jn (0, -4.0) == -3.9714980986384737228659076845169804197562E-1": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "jn (0, 0.75) == 0.864242275166648623555731103820923211": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "jn (0, 10.0) == -0.245935764451348335197760862485328754": | 
|  | +double: 2 | 
|  | +float: 1 | 
|  | +idouble: 2 | 
|  | +ifloat: 1 | 
|  | +Test "jn (0, 2.0) == 0.223890779141235668051827454649948626": | 
|  | +float: 2 | 
|  | +ifloat: 2 | 
|  | +Test "jn (0, 4.0) == -3.9714980986384737228659076845169804197562E-1": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "jn (0, 8.0) == 0.171650807137553906090869407851972001": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "jn (1, 10.0) == 0.0434727461688614366697487680258592883": | 
|  | +float: 2 | 
|  | +ifloat: 2 | 
|  | +Test "jn (1, 2.0) == 0.576724807756873387202448242269137087": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | +Test "jn (1, 8.0) == 0.234636346853914624381276651590454612": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | +Test "jn (10, 0.125) == 0.250543369809369890173993791865771547e-18": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "jn (10, 0.75) == 0.149621713117596814698712483621682835e-10": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "jn (10, 10.0) == 0.207486106633358857697278723518753428": | 
|  | +double: 4 | 
|  | +float: 3 | 
|  | +idouble: 4 | 
|  | +ifloat: 3 | 
|  | +Test "jn (10, 2.0) == 0.251538628271673670963516093751820639e-6": | 
|  | +float: 4 | 
|  | +ifloat: 4 | 
|  | +Test "jn (3, 0.125) == 0.406503832554912875023029337653442868e-4": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "jn (3, 0.75) == 0.848438342327410884392755236884386804e-2": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "jn (3, 10.0) == 0.0583793793051868123429354784103409563": | 
|  | +double: 3 | 
|  | +float: 1 | 
|  | +idouble: 3 | 
|  | +ifloat: 1 | 
|  | +Test "jn (3, 2.0) == 0.128943249474402051098793332969239835": | 
|  | +double: 1 | 
|  | +float: 2 | 
|  | +idouble: 1 | 
|  | +ifloat: 2 | 
|  | + | 
|  | +# lgamma | 
|  | +Test "lgamma (0.7) == 0.260867246531666514385732417016759578": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "lgamma (1.2) == -0.853740900033158497197028392998854470e-1": | 
|  | +double: 1 | 
|  | +float: 2 | 
|  | +idouble: 1 | 
|  | +ifloat: 2 | 
|  | + | 
|  | +# log10 | 
|  | +Test "log10 (0.75) == -0.124938736608299953132449886193870744": | 
|  | +double: 1 | 
|  | +float: 2 | 
|  | +idouble: 1 | 
|  | +ifloat: 2 | 
|  | +Test "log10 (e) == log10(e)": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +# log1p | 
|  | +Test "log1p (-0.25) == -0.287682072451780927439219005993827432": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +# sincos | 
|  | +Test "sincos (M_PI_6l*2.0, &sin_res, &cos_res) puts 0.5 in cos_res": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "sincos (M_PI_6l*2.0, &sin_res, &cos_res) puts 0.86602540378443864676372317075293616 in sin_res": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "sincos (pi/2, &sin_res, &cos_res) puts 0 in cos_res": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "sincos (pi/6, &sin_res, &cos_res) puts 0.86602540378443864676372317075293616 in cos_res": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +# tan | 
|  | +Test "tan (pi/4) == 1": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | + | 
|  | +# tgamma | 
|  | +Test "tgamma (-0.5) == -2 sqrt (pi)": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "tgamma (0.5) == sqrt (pi)": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "tgamma (0.7) == 1.29805533264755778568117117915281162": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +# y0 | 
|  | +Test "y0 (1.0) == 0.0882569642156769579829267660235151628": | 
|  | +double: 2 | 
|  | +float: 1 | 
|  | +idouble: 2 | 
|  | +ifloat: 1 | 
|  | +Test "y0 (1.5) == 0.382448923797758843955068554978089862": | 
|  | +double: 2 | 
|  | +float: 1 | 
|  | +idouble: 2 | 
|  | +ifloat: 1 | 
|  | +Test "y0 (10.0) == 0.0556711672835993914244598774101900481": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "y0 (8.0) == 0.223521489387566220527323400498620359": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +# y1 | 
|  | +Test "y1 (0.125) == -5.19993611253477499595928744876579921": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | +Test "y1 (1.5) == -0.412308626973911295952829820633445323": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "y1 (10.0) == 0.249015424206953883923283474663222803": | 
|  | +double: 3 | 
|  | +float: 1 | 
|  | +idouble: 3 | 
|  | +ifloat: 1 | 
|  | +Test "y1 (2.0) == -0.107032431540937546888370772277476637": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "y1 (8.0) == -0.158060461731247494255555266187483550": | 
|  | +double: 1 | 
|  | +float: 2 | 
|  | +idouble: 1 | 
|  | +ifloat: 2 | 
|  | + | 
|  | +# yn | 
|  | +Test "yn (0, 1.0) == 0.0882569642156769579829267660235151628": | 
|  | +double: 2 | 
|  | +float: 1 | 
|  | +idouble: 2 | 
|  | +ifloat: 1 | 
|  | +Test "yn (0, 1.5) == 0.382448923797758843955068554978089862": | 
|  | +double: 2 | 
|  | +float: 1 | 
|  | +idouble: 2 | 
|  | +ifloat: 1 | 
|  | +Test "yn (0, 10.0) == 0.0556711672835993914244598774101900481": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "yn (0, 8.0) == 0.223521489387566220527323400498620359": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "yn (1, 0.125) == -5.19993611253477499595928744876579921": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | +Test "yn (1, 1.5) == -0.412308626973911295952829820633445323": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "yn (1, 10.0) == 0.249015424206953883923283474663222803": | 
|  | +double: 3 | 
|  | +float: 1 | 
|  | +idouble: 3 | 
|  | +ifloat: 1 | 
|  | +Test "yn (1, 2.0) == -0.107032431540937546888370772277476637": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "yn (1, 8.0) == -0.158060461731247494255555266187483550": | 
|  | +double: 1 | 
|  | +float: 2 | 
|  | +idouble: 1 | 
|  | +ifloat: 2 | 
|  | +Test "yn (10, 0.125) == -127057845771019398.252538486899753195": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | +Test "yn (10, 0.75) == -2133501638.90573424452445412893839236": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "yn (10, 1.0) == -121618014.278689189288130426667971145": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | +Test "yn (10, 10.0) == -0.359814152183402722051986577343560609": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "yn (10, 2.0) == -129184.542208039282635913145923304214": | 
|  | +double: 2 | 
|  | +idouble: 2 | 
|  | +Test "yn (3, 0.125) == -2612.69757350066712600220955744091741": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | +Test "yn (3, 0.75) == -12.9877176234475433186319774484809207": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "yn (3, 10.0) == -0.251362657183837329779204747654240998": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "yn (3, 2.0) == -1.12778377684042778608158395773179238": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | + | 
|  | +# Maximal error of functions: | 
|  | +Function: "atan2": | 
|  | +float: 3 | 
|  | +ifloat: 3 | 
|  | + | 
|  | +Function: "atanh": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +Function: Real part of "cacosh": | 
|  | +double: 1 | 
|  | +float: 7 | 
|  | +idouble: 1 | 
|  | +ifloat: 7 | 
|  | + | 
|  | +Function: Imaginary part of "cacosh": | 
|  | +double: 1 | 
|  | +float: 3 | 
|  | +idouble: 1 | 
|  | +ifloat: 3 | 
|  | + | 
|  | +Function: Real part of "casin": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +Function: Real part of "casinh": | 
|  | +double: 5 | 
|  | +float: 1 | 
|  | +idouble: 5 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +Function: Imaginary part of "casinh": | 
|  | +double: 3 | 
|  | +float: 6 | 
|  | +idouble: 3 | 
|  | +ifloat: 6 | 
|  | + | 
|  | +Function: Real part of "catan": | 
|  | +float: 4 | 
|  | +ifloat: 4 | 
|  | + | 
|  | +Function: Imaginary part of "catan": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +Function: Real part of "catanh": | 
|  | +double: 4 | 
|  | +idouble: 4 | 
|  | + | 
|  | +Function: Imaginary part of "catanh": | 
|  | +float: 6 | 
|  | +ifloat: 6 | 
|  | + | 
|  | +Function: "cbrt": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | + | 
|  | +Function: Real part of "ccos": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +Function: Imaginary part of "ccos": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +Function: Real part of "ccosh": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +Function: Imaginary part of "ccosh": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +Function: Real part of "cexp": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +Function: Imaginary part of "cexp": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +Function: Real part of "clog": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +Function: Imaginary part of "clog": | 
|  | +float: 3 | 
|  | +ifloat: 3 | 
|  | + | 
|  | +Function: Real part of "clog10": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +Function: Imaginary part of "clog10": | 
|  | +double: 1 | 
|  | +float: 5 | 
|  | +idouble: 1 | 
|  | +ifloat: 5 | 
|  | + | 
|  | +Function: "cos": | 
|  | +double: 2 | 
|  | +float: 1 | 
|  | +idouble: 2 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +Function: Real part of "cpow": | 
|  | +double: 2 | 
|  | +float: 4 | 
|  | +idouble: 2 | 
|  | +ifloat: 4 | 
|  | + | 
|  | +Function: Imaginary part of "cpow": | 
|  | +double: 2 | 
|  | +float: 2 | 
|  | +idouble: 2 | 
|  | +ifloat: 2 | 
|  | + | 
|  | +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": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +Function: Real part of "ctan": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | + | 
|  | +Function: Imaginary part of "ctan": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | + | 
|  | +Function: Real part of "ctanh": | 
|  | +double: 1 | 
|  | +float: 2 | 
|  | +idouble: 1 | 
|  | +ifloat: 2 | 
|  | + | 
|  | +Function: Imaginary part of "ctanh": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +Function: "erf": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | + | 
|  | +Function: "erfc": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | + | 
|  | +Function: "exp10": | 
|  | +double: 6 | 
|  | +float: 2 | 
|  | +idouble: 6 | 
|  | +ifloat: 2 | 
|  | + | 
|  | +Function: "expm1": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +Function: "hypot": | 
|  | +float: 1 | 
|  | +ifloat: 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: 2 | 
|  | +idouble: 1 | 
|  | +ifloat: 2 | 
|  | + | 
|  | +Function: "log10": | 
|  | +double: 1 | 
|  | +float: 2 | 
|  | +idouble: 1 | 
|  | +ifloat: 2 | 
|  | + | 
|  | +Function: "log1p": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +Function: "sincos": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +Function: "tan": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | + | 
|  | +Function: "tgamma": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +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 -ruN glibc-2.19/sysdeps/riscv/fpu_control.h glibc-2.19-riscv/sysdeps/riscv/fpu_control.h | 
|  | --- glibc-2.19/sysdeps/riscv/fpu_control.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/fpu_control.h	2014-12-09 16:55:03.164727835 -0800 | 
|  | @@ -0,0 +1,112 @@ | 
|  | +/* FPU control word bits.  Mips version. | 
|  | +   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2006, 2008 | 
|  | +   Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by Olaf Flebbe and Ralf Baechle. | 
|  | + | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef _FPU_CONTROL_H | 
|  | +#define _FPU_CONTROL_H | 
|  | + | 
|  | +/* MIPS FPU floating point control register bits. | 
|  | + * | 
|  | + * 31-25  -> floating point conditions code bits 7-1.  These bits are only | 
|  | + *           available in MIPS IV. | 
|  | + * 24     -> flush denormalized results to zero instead of | 
|  | + *           causing unimplemented operation exception.  This bit is only | 
|  | + *           available for MIPS III and newer. | 
|  | + * 23     -> Condition bit | 
|  | + * 22-18  -> reserved (read as 0, write with 0) | 
|  | + * 17     -> cause bit for unimplemented operation | 
|  | + * 16     -> cause bit for invalid exception | 
|  | + * 15     -> cause bit for division by zero exception | 
|  | + * 14     -> cause bit for overflow exception | 
|  | + * 13     -> cause bit for underflow exception | 
|  | + * 12     -> cause bit for inexact exception | 
|  | + * 11     -> enable exception for invalid exception | 
|  | + * 10     -> enable exception for division by zero exception | 
|  | + *  9     -> enable exception for overflow exception | 
|  | + *  8     -> enable exception for underflow exception | 
|  | + *  7     -> enable exception for inexact exception | 
|  | + *  6     -> flag invalid exception | 
|  | + *  5     -> flag division by zero exception | 
|  | + *  4     -> flag overflow exception | 
|  | + *  3     -> flag underflow exception | 
|  | + *  2     -> flag inexact exception | 
|  | + *  1-0   -> rounding control | 
|  | + * | 
|  | + * | 
|  | + * Rounding Control: | 
|  | + * 00 - rounding to nearest (RN) | 
|  | + * 01 - rounding toward zero (RZ) | 
|  | + * 10 - rounding (up) toward plus infinity (RP) | 
|  | + * 11 - rounding (down)toward minus infinity (RM) | 
|  | + */ | 
|  | + | 
|  | +#include <features.h> | 
|  | + | 
|  | +#ifdef __mips_soft_float | 
|  | + | 
|  | +#define _FPU_RESERVED 0xffffffff | 
|  | +#define _FPU_DEFAULT  0x00000000 | 
|  | +typedef unsigned int fpu_control_t; | 
|  | +#define _FPU_GETCW(cw) 0 | 
|  | +#define _FPU_SETCW(cw) do { } while (0) | 
|  | +extern fpu_control_t __fpu_control; | 
|  | + | 
|  | +#else /* __mips_soft_float */ | 
|  | + | 
|  | +/* masking of interrupts */ | 
|  | +#define _FPU_MASK_V     0x0800  /* Invalid operation */ | 
|  | +#define _FPU_MASK_Z     0x0400  /* Division by zero  */ | 
|  | +#define _FPU_MASK_O     0x0200  /* Overflow          */ | 
|  | +#define _FPU_MASK_U     0x0100  /* Underflow         */ | 
|  | +#define _FPU_MASK_I     0x0080  /* Inexact operation */ | 
|  | + | 
|  | +/* flush denormalized numbers to zero */ | 
|  | +#define _FPU_FLUSH_TZ   0x1000000 | 
|  | + | 
|  | +/* rounding control */ | 
|  | +#define _FPU_RC_NEAREST 0x0     /* RECOMMENDED */ | 
|  | +#define _FPU_RC_ZERO    0x1 | 
|  | +#define _FPU_RC_UP      0x2 | 
|  | +#define _FPU_RC_DOWN    0x3 | 
|  | + | 
|  | +#define _FPU_RESERVED 0xfe3c0000  /* Reserved bits in cw */ | 
|  | + | 
|  | + | 
|  | +/* The fdlibm code requires strict IEEE double precision arithmetic, | 
|  | +   and no interrupts for exceptions, rounding to nearest.  */ | 
|  | + | 
|  | +#define _FPU_DEFAULT  0x00000000 | 
|  | + | 
|  | +/* IEEE:  same as above, but exceptions */ | 
|  | +#define _FPU_IEEE     0x00000F80 | 
|  | + | 
|  | +/* Type of the control word.  */ | 
|  | +typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__SI__))); | 
|  | + | 
|  | +/* Macros for accessing the hardware control word.  */ | 
|  | +#define _FPU_GETCW(cw) __asm__ volatile ("mffsr %0" : "=r" (cw)) | 
|  | +#define _FPU_SETCW(cw) __asm__ volatile ("mtfsr %0" : : "r" (cw)) | 
|  | + | 
|  | +/* Default control word set at startup.  */ | 
|  | +extern fpu_control_t __fpu_control; | 
|  | + | 
|  | +#endif /* __mips_soft_float */ | 
|  | + | 
|  | +#endif	/* fpu_control.h */ | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/gccframe.h glibc-2.19-riscv/sysdeps/riscv/gccframe.h | 
|  | --- glibc-2.19/sysdeps/riscv/gccframe.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/gccframe.h	2014-12-09 16:55:03.164727835 -0800 | 
|  | @@ -0,0 +1,22 @@ | 
|  | +/* Definition of object in frame unwind info.  mips version. | 
|  | +   Copyright (C) 2001 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#define FIRST_PSEUDO_REGISTER 76 | 
|  | + | 
|  | +#include <sysdeps/generic/gccframe.h> | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/ieee754.h glibc-2.19-riscv/sysdeps/riscv/ieee754.h | 
|  | --- glibc-2.19/sysdeps/riscv/ieee754.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/ieee754.h	2014-12-09 16:55:03.164727835 -0800 | 
|  | @@ -0,0 +1,325 @@ | 
|  | +/* Copyright (C) 1992, 1995, 1996, 1999, 2002, 2003 | 
|  | +	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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef _IEEE754_H | 
|  | + | 
|  | +#define _IEEE754_H 1 | 
|  | +#include <features.h> | 
|  | + | 
|  | +#include <endian.h> | 
|  | + | 
|  | +#include <float.h> | 
|  | + | 
|  | +__BEGIN_DECLS | 
|  | + | 
|  | +union ieee754_float | 
|  | +  { | 
|  | +    float f; | 
|  | + | 
|  | +    /* This is the IEEE 754 single-precision format.  */ | 
|  | +    struct | 
|  | +      { | 
|  | +#if	__BYTE_ORDER == __BIG_ENDIAN | 
|  | +	unsigned int negative:1; | 
|  | +	unsigned int exponent:8; | 
|  | +	unsigned int mantissa:23; | 
|  | +#endif				/* Big endian.  */ | 
|  | +#if	__BYTE_ORDER == __LITTLE_ENDIAN | 
|  | +	unsigned int mantissa:23; | 
|  | +	unsigned int exponent:8; | 
|  | +	unsigned int negative:1; | 
|  | +#endif				/* Little endian.  */ | 
|  | +      } ieee; | 
|  | + | 
|  | +    /* This format makes it easier to see if a NaN is a signalling NaN.  */ | 
|  | +    struct | 
|  | +      { | 
|  | +#if	__BYTE_ORDER == __BIG_ENDIAN | 
|  | +	unsigned int negative:1; | 
|  | +	unsigned int exponent:8; | 
|  | +	unsigned int quiet_nan:1; | 
|  | +	unsigned int mantissa:22; | 
|  | +#endif				/* Big endian.  */ | 
|  | +#if	__BYTE_ORDER == __LITTLE_ENDIAN | 
|  | +	unsigned int mantissa:22; | 
|  | +	unsigned int quiet_nan:1; | 
|  | +	unsigned int exponent:8; | 
|  | +	unsigned int negative:1; | 
|  | +#endif				/* Little endian.  */ | 
|  | +      } ieee_nan; | 
|  | +  }; | 
|  | + | 
|  | +#define IEEE754_FLOAT_BIAS	0x7f /* Added to exponent.  */ | 
|  | + | 
|  | + | 
|  | +union ieee754_double | 
|  | +  { | 
|  | +    double d; | 
|  | + | 
|  | +    /* This is the IEEE 754 double-precision format.  */ | 
|  | +    struct | 
|  | +      { | 
|  | +#if	__BYTE_ORDER == __BIG_ENDIAN | 
|  | +	unsigned int negative:1; | 
|  | +	unsigned int exponent:11; | 
|  | +	/* Together these comprise the mantissa.  */ | 
|  | +	unsigned int mantissa0:20; | 
|  | +	unsigned int mantissa1:32; | 
|  | +#endif				/* Big endian.  */ | 
|  | +#if	__BYTE_ORDER == __LITTLE_ENDIAN | 
|  | +# if	__FLOAT_WORD_ORDER == __BIG_ENDIAN | 
|  | +	unsigned int mantissa0:20; | 
|  | +	unsigned int exponent:11; | 
|  | +	unsigned int negative:1; | 
|  | +	unsigned int mantissa1:32; | 
|  | +# else | 
|  | +	/* Together these comprise the mantissa.  */ | 
|  | +	unsigned int mantissa1:32; | 
|  | +	unsigned int mantissa0:20; | 
|  | +	unsigned int exponent:11; | 
|  | +	unsigned int negative:1; | 
|  | +# endif | 
|  | +#endif				/* Little endian.  */ | 
|  | +      } ieee; | 
|  | + | 
|  | +    /* This format makes it easier to see if a NaN is a signalling NaN.  */ | 
|  | +    struct | 
|  | +      { | 
|  | +#if	__BYTE_ORDER == __BIG_ENDIAN | 
|  | +	unsigned int negative:1; | 
|  | +	unsigned int exponent:11; | 
|  | +	unsigned int quiet_nan:1; | 
|  | +	/* Together these comprise the mantissa.  */ | 
|  | +	unsigned int mantissa0:19; | 
|  | +	unsigned int mantissa1:32; | 
|  | +#else | 
|  | +# if	__FLOAT_WORD_ORDER == __BIG_ENDIAN | 
|  | +	unsigned int mantissa0:19; | 
|  | +	unsigned int quiet_nan:1; | 
|  | +	unsigned int exponent:11; | 
|  | +	unsigned int negative:1; | 
|  | +	unsigned int mantissa1:32; | 
|  | +# else | 
|  | +	/* Together these comprise the mantissa.  */ | 
|  | +	unsigned int mantissa1:32; | 
|  | +	unsigned int mantissa0:19; | 
|  | +	unsigned int quiet_nan:1; | 
|  | +	unsigned int exponent:11; | 
|  | +	unsigned int negative:1; | 
|  | +# endif | 
|  | +#endif | 
|  | +      } ieee_nan; | 
|  | +  }; | 
|  | + | 
|  | +#define IEEE754_DOUBLE_BIAS	0x3ff /* Added to exponent.  */ | 
|  | + | 
|  | +#if LDBL_MANT_DIG == 113 | 
|  | + | 
|  | +union ieee854_long_double | 
|  | +  { | 
|  | +    long double d; | 
|  | + | 
|  | +    /* This is the IEEE 854 quad-precision format.  */ | 
|  | +    struct | 
|  | +      { | 
|  | +#if	__BYTE_ORDER == __BIG_ENDIAN | 
|  | +	unsigned int negative:1; | 
|  | +	unsigned int exponent:15; | 
|  | +	/* Together these comprise the mantissa.  */ | 
|  | +	unsigned int mantissa0:16; | 
|  | +	unsigned int mantissa1:32; | 
|  | +	unsigned int mantissa2:32; | 
|  | +	unsigned int mantissa3:32; | 
|  | +#endif				/* Big endian.  */ | 
|  | +#if	__BYTE_ORDER == __LITTLE_ENDIAN | 
|  | +	/* Together these comprise the mantissa.  */ | 
|  | +	unsigned int mantissa3:32; | 
|  | +	unsigned int mantissa2:32; | 
|  | +	unsigned int mantissa1:32; | 
|  | +	unsigned int mantissa0:16; | 
|  | +	unsigned int exponent:15; | 
|  | +	unsigned int negative:1; | 
|  | +#endif				/* Little endian.  */ | 
|  | +      } ieee; | 
|  | + | 
|  | +    /* This format makes it easier to see if a NaN is a signalling NaN.  */ | 
|  | +    struct | 
|  | +      { | 
|  | +#if	__BYTE_ORDER == __BIG_ENDIAN | 
|  | +	unsigned int negative:1; | 
|  | +	unsigned int exponent:15; | 
|  | +	unsigned int quiet_nan:1; | 
|  | +	/* Together these comprise the mantissa.  */ | 
|  | +	unsigned int mantissa0:15; | 
|  | +	unsigned int mantissa1:32; | 
|  | +	unsigned int mantissa2:32; | 
|  | +	unsigned int mantissa3:32; | 
|  | +#endif				/* Big endian.  */ | 
|  | +#if	__BYTE_ORDER == __LITTLE_ENDIAN | 
|  | +	/* Together these comprise the mantissa.  */ | 
|  | +	unsigned int mantissa3:32; | 
|  | +	unsigned int mantissa2:32; | 
|  | +	unsigned int mantissa1:32; | 
|  | +	unsigned int mantissa0:15; | 
|  | +	unsigned int quiet_nan:1; | 
|  | +	unsigned int exponent:15; | 
|  | +	unsigned int negative:1; | 
|  | +#endif				/* Little endian.  */ | 
|  | +      } ieee_nan; | 
|  | +  }; | 
|  | + | 
|  | +#define IEEE854_LONG_DOUBLE_BIAS 0x3fff /* Added to exponent.  */ | 
|  | + | 
|  | +#elif LDBL_MANT_DIG == 64 | 
|  | + | 
|  | +union ieee854_long_double | 
|  | +  { | 
|  | +    long double d; | 
|  | + | 
|  | +    /* This is the IEEE 854 double-extended-precision format.  */ | 
|  | +    struct | 
|  | +      { | 
|  | +#if	__BYTE_ORDER == __BIG_ENDIAN | 
|  | +	unsigned int negative:1; | 
|  | +	unsigned int exponent:15; | 
|  | +	unsigned int empty:16; | 
|  | +	unsigned int mantissa0:32; | 
|  | +	unsigned int mantissa1:32; | 
|  | +#endif | 
|  | +#if	__BYTE_ORDER == __LITTLE_ENDIAN | 
|  | +# if	__FLOAT_WORD_ORDER == __BIG_ENDIAN | 
|  | +	unsigned int exponent:15; | 
|  | +	unsigned int negative:1; | 
|  | +	unsigned int empty:16; | 
|  | +	unsigned int mantissa0:32; | 
|  | +	unsigned int mantissa1:32; | 
|  | +# else | 
|  | +	unsigned int mantissa1:32; | 
|  | +	unsigned int mantissa0:32; | 
|  | +	unsigned int exponent:15; | 
|  | +	unsigned int negative:1; | 
|  | +	unsigned int empty:16; | 
|  | +# endif | 
|  | +#endif | 
|  | +      } ieee; | 
|  | + | 
|  | +    /* This is for NaNs in the IEEE 854 double-extended-precision format.  */ | 
|  | +    struct | 
|  | +      { | 
|  | +#if	__BYTE_ORDER == __BIG_ENDIAN | 
|  | +	unsigned int negative:1; | 
|  | +	unsigned int exponent:15; | 
|  | +	unsigned int empty:16; | 
|  | +	unsigned int one:1; | 
|  | +	unsigned int quiet_nan:1; | 
|  | +	unsigned int mantissa0:30; | 
|  | +	unsigned int mantissa1:32; | 
|  | +#endif | 
|  | +#if	__BYTE_ORDER == __LITTLE_ENDIAN | 
|  | +# if	__FLOAT_WORD_ORDER == __BIG_ENDIAN | 
|  | +	unsigned int exponent:15; | 
|  | +	unsigned int negative:1; | 
|  | +	unsigned int empty:16; | 
|  | +	unsigned int mantissa0:30; | 
|  | +	unsigned int quiet_nan:1; | 
|  | +	unsigned int one:1; | 
|  | +	unsigned int mantissa1:32; | 
|  | +# else | 
|  | +	unsigned int mantissa1:32; | 
|  | +	unsigned int mantissa0:30; | 
|  | +	unsigned int quiet_nan:1; | 
|  | +	unsigned int one:1; | 
|  | +	unsigned int exponent:15; | 
|  | +	unsigned int negative:1; | 
|  | +	unsigned int empty:16; | 
|  | +# endif | 
|  | +#endif | 
|  | +      } ieee_nan; | 
|  | +  }; | 
|  | + | 
|  | +#define IEEE854_LONG_DOUBLE_BIAS 0x3fff | 
|  | + | 
|  | +#elif LDBL_MANT_DIG == 53 | 
|  | + | 
|  | +union ieee854_long_double | 
|  | +  { | 
|  | +    long double d; | 
|  | + | 
|  | +    /* This is the IEEE 754 double-precision format.  */ | 
|  | +    struct | 
|  | +      { | 
|  | +#if	__BYTE_ORDER == __BIG_ENDIAN | 
|  | +	unsigned int negative:1; | 
|  | +	unsigned int exponent:11; | 
|  | +	/* Together these comprise the mantissa.  */ | 
|  | +	unsigned int mantissa0:20; | 
|  | +	unsigned int mantissa1:32; | 
|  | +#endif				/* Big endian.  */ | 
|  | +#if	__BYTE_ORDER == __LITTLE_ENDIAN | 
|  | +# if	__FLOAT_WORD_ORDER == __BIG_ENDIAN | 
|  | +	unsigned int mantissa0:20; | 
|  | +	unsigned int exponent:11; | 
|  | +	unsigned int negative:1; | 
|  | +	unsigned int mantissa1:32; | 
|  | +# else | 
|  | +	/* Together these comprise the mantissa.  */ | 
|  | +	unsigned int mantissa1:32; | 
|  | +	unsigned int mantissa0:20; | 
|  | +	unsigned int exponent:11; | 
|  | +	unsigned int negative:1; | 
|  | +# endif | 
|  | +#endif				/* Little endian.  */ | 
|  | +      } ieee; | 
|  | + | 
|  | +    /* This format makes it easier to see if a NaN is a signalling NaN.  */ | 
|  | +    struct | 
|  | +      { | 
|  | +#if	__BYTE_ORDER == __BIG_ENDIAN | 
|  | +	unsigned int negative:1; | 
|  | +	unsigned int exponent:11; | 
|  | +	unsigned int quiet_nan:1; | 
|  | +	/* Together these comprise the mantissa.  */ | 
|  | +	unsigned int mantissa0:19; | 
|  | +	unsigned int mantissa1:32; | 
|  | +#else | 
|  | +# if	__FLOAT_WORD_ORDER == __BIG_ENDIAN | 
|  | +	unsigned int mantissa0:19; | 
|  | +	unsigned int quiet_nan:1; | 
|  | +	unsigned int exponent:11; | 
|  | +	unsigned int negative:1; | 
|  | +	unsigned int mantissa1:32; | 
|  | +# else | 
|  | +	/* Together these comprise the mantissa.  */ | 
|  | +	unsigned int mantissa1:32; | 
|  | +	unsigned int mantissa0:19; | 
|  | +	unsigned int quiet_nan:1; | 
|  | +	unsigned int exponent:11; | 
|  | +	unsigned int negative:1; | 
|  | +# endif | 
|  | +#endif | 
|  | +      } ieee_nan; | 
|  | +  }; | 
|  | + | 
|  | +#define IEEE854_LONG_DOUBLE_BIAS	0x3ff /* Added to exponent.  */ | 
|  | + | 
|  | +#endif /* LDBL_MANT_DIG == 53 */ | 
|  | + | 
|  | +__END_DECLS | 
|  | + | 
|  | +#endif /* ieee754.h */ | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/Implies glibc-2.19-riscv/sysdeps/riscv/Implies | 
|  | --- glibc-2.19/sysdeps/riscv/Implies	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/Implies	2014-12-09 16:55:03.152727766 -0800 | 
|  | @@ -0,0 +1,5 @@ | 
|  | +ieee754/flt-32 | 
|  | +ieee754/dbl-64 | 
|  | + | 
|  | +# This needs to change to support rv32 | 
|  | +riscv/rv64 | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/init-first.c glibc-2.19-riscv/sysdeps/riscv/init-first.c | 
|  | --- glibc-2.19/sysdeps/riscv/init-first.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/init-first.c	2014-12-09 16:55:03.164727835 -0800 | 
|  | @@ -0,0 +1,66 @@ | 
|  | +/* Initialization code run first thing by the ELF startup code.  For mips/Unix. | 
|  | +   Copyright (C) 1996, 1997, 2010 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <unistd.h> | 
|  | + | 
|  | +extern void __libc_init (int, char **, char **); | 
|  | +extern void __libc_global_ctors (void); | 
|  | + | 
|  | + | 
|  | +static void | 
|  | +init (int *data) | 
|  | +{ | 
|  | +  int argc = *data; | 
|  | +  char **argv = (void *) (data + 1); | 
|  | +  char **envp = &argv[argc + 1]; | 
|  | + | 
|  | +  __environ = envp; | 
|  | +  __libc_init (argc, argv, envp); | 
|  | +} | 
|  | + | 
|  | +#ifdef SHARED | 
|  | +/* This function is called to initialize the shared C library. | 
|  | +   It is called just before the user _start code from mips/elf/start.S, | 
|  | +   with the stack set up as that code gets it.  */ | 
|  | + | 
|  | +/* NOTE!  The linker notices the magical name `_init' and sets the DT_INIT | 
|  | +   pointer in the dynamic section based solely on that.  It is convention | 
|  | +   for this function to be in the `.init' section, but the symbol name is | 
|  | +   the only thing that really matters!!  */ | 
|  | +/*void _init (int argc, ...) __attribute__ ((unused, section (".init")));*/ | 
|  | + | 
|  | +void | 
|  | +_init (int argc, ...) | 
|  | +{ | 
|  | +  init (&argc); | 
|  | + | 
|  | +#ifndef NO_CTORS_DTORS_SECTIONS | 
|  | +  __libc_global_ctors (); | 
|  | +#endif | 
|  | +} | 
|  | +#endif | 
|  | + | 
|  | + | 
|  | +void | 
|  | +__libc_init_first (int argc __attribute__ ((unused)), ...) | 
|  | +{ | 
|  | +#ifndef SHARED | 
|  | +  init (&argc); | 
|  | +#endif | 
|  | +} | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/jmpbuf-unwind.h glibc-2.19-riscv/sysdeps/riscv/jmpbuf-unwind.h | 
|  | --- glibc-2.19/sysdeps/riscv/jmpbuf-unwind.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/jmpbuf-unwind.h	2014-12-09 16:55:03.164727835 -0800 | 
|  | @@ -0,0 +1,46 @@ | 
|  | +/* Copyright (C) 2003, 2005, 2006 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <setjmp.h> | 
|  | +#include <stdint.h> | 
|  | +#include <unwind.h> | 
|  | +#include <sysdep.h> | 
|  | + | 
|  | +/* Test if longjmp to JMPBUF would unwind the frame | 
|  | +   containing a local variable at ADDRESS.  */ | 
|  | +#define _JMPBUF_UNWINDS(jmpbuf, address, demangle)		\ | 
|  | +  ((void *) (address) < (void *) demangle ((jmpbuf)[0].__sp)) | 
|  | + | 
|  | +#define _JMPBUF_CFA_UNWINDS_ADJ(_jmpbuf, _context, _adj) \ | 
|  | +  _JMPBUF_UNWINDS_ADJ (_jmpbuf, (void *) _Unwind_GetCFA (_context), _adj) | 
|  | + | 
|  | +static inline uintptr_t __attribute__ ((unused)) | 
|  | +_jmpbuf_sp (__jmp_buf regs) | 
|  | +{ | 
|  | +  uintptr_t sp = regs[0].__sp; | 
|  | +#ifdef PTR_DEMANGLE | 
|  | +  PTR_DEMANGLE (sp); | 
|  | +#endif | 
|  | +  return sp; | 
|  | +} | 
|  | + | 
|  | +#define _JMPBUF_UNWINDS_ADJ(_jmpbuf, _address, _adj) \ | 
|  | +  ((uintptr_t) (_address) - (_adj) < _jmpbuf_sp (_jmpbuf) - (_adj)) | 
|  | + | 
|  | +/* We use the normal longjmp for unwinding.  */ | 
|  | +#define __libc_unwind_longjmp(buf, val) __libc_longjmp (buf, val) | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/ldsodefs.h glibc-2.19-riscv/sysdeps/riscv/ldsodefs.h | 
|  | --- glibc-2.19/sysdeps/riscv/ldsodefs.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/ldsodefs.h	2014-12-09 16:55:03.164727835 -0800 | 
|  | @@ -0,0 +1,150 @@ | 
|  | +/* Run-time dynamic linker data structures for loaded ELF shared objects. | 
|  | +   Copyright (C) 2000, 2002, 2003, 2006, 2007 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef _MIPS_LDSODEFS_H | 
|  | +#define _MIPS_LDSODEFS_H 1 | 
|  | + | 
|  | +#include <elf.h> | 
|  | + | 
|  | +struct La_mips_32_regs; | 
|  | +struct La_mips_32_retval; | 
|  | +struct La_mips_64_regs; | 
|  | +struct La_mips_64_retval; | 
|  | + | 
|  | +#define ARCH_PLTENTER_MEMBERS						    \ | 
|  | +    Elf32_Addr (*mips_o32_gnu_pltenter) (Elf32_Sym *, unsigned int,	    \ | 
|  | +					 uintptr_t *, uintptr_t *,	    \ | 
|  | +					 const struct La_mips_32_regs *,    \ | 
|  | +					 unsigned int *, const char *name,  \ | 
|  | +					 long int *framesizep);		    \ | 
|  | +    Elf32_Addr (*mips_n32_gnu_pltenter) (Elf32_Sym *, unsigned int,	    \ | 
|  | +					 uintptr_t *, uintptr_t *,	    \ | 
|  | +					 const struct La_mips_64_regs *,    \ | 
|  | +					 unsigned int *, const char *name,  \ | 
|  | +					 long int *framesizep);		    \ | 
|  | +    Elf64_Addr (*mips_n64_gnu_pltenter) (Elf64_Sym *, unsigned int,	    \ | 
|  | +					 uintptr_t *, uintptr_t *,	    \ | 
|  | +					 const struct La_mips_64_regs *,    \ | 
|  | +					 unsigned int *, const char *name,  \ | 
|  | +					 long int *framesizep); | 
|  | + | 
|  | +#define ARCH_PLTEXIT_MEMBERS						    \ | 
|  | +    unsigned int (*mips_o32_gnu_pltexit) (Elf32_Sym *, unsigned int,	    \ | 
|  | +					  uintptr_t *, uintptr_t *,	    \ | 
|  | +					  const struct La_mips_32_regs *,   \ | 
|  | +					  struct La_mips_32_retval *,	    \ | 
|  | +					  const char *);		    \ | 
|  | +    unsigned int (*mips_n32_gnu_pltexit) (Elf32_Sym *, unsigned int,	    \ | 
|  | +					  uintptr_t *, uintptr_t *,	    \ | 
|  | +					  const struct La_mips_64_regs *,   \ | 
|  | +					  struct La_mips_64_retval *,	    \ | 
|  | +					  const char *);		    \ | 
|  | +    unsigned int (*mips_n64_gnu_pltexit) (Elf64_Sym *, unsigned int,	    \ | 
|  | +					  uintptr_t *, uintptr_t *,	    \ | 
|  | +					  const struct La_mips_64_regs *,   \ | 
|  | +					  struct La_mips_64_retval *,	    \ | 
|  | +					  const char *); | 
|  | + | 
|  | +/* The MIPS ABI specifies that the dynamic section has to be read-only.  */ | 
|  | + | 
|  | +#define DL_RO_DYN_SECTION 1 | 
|  | + | 
|  | +#include_next <ldsodefs.h> | 
|  | + | 
|  | +/* The 64-bit MIPS ELF ABI uses an unusual reloc format.  Each | 
|  | +   relocation entry specifies up to three actual relocations, all at | 
|  | +   the same address.  The first relocation which required a symbol | 
|  | +   uses the symbol in the r_sym field.  The second relocation which | 
|  | +   requires a symbol uses the symbol in the r_ssym field.  If all | 
|  | +   three relocations require a symbol, the third one uses a zero | 
|  | +   value. | 
|  | + | 
|  | +   We define these structures in internal headers because we're not | 
|  | +   sure we want to make them part of the ABI yet.  Eventually, some of | 
|  | +   this may move into elf/elf.h.  */ | 
|  | + | 
|  | +/* An entry in a 64 bit SHT_REL section.  */ | 
|  | + | 
|  | +typedef struct | 
|  | +{ | 
|  | +  Elf32_Word    r_sym;		/* Symbol index */ | 
|  | +  unsigned char r_ssym;		/* Special symbol for 2nd relocation */ | 
|  | +  unsigned char r_type3;	/* 3rd relocation type */ | 
|  | +  unsigned char r_type2;	/* 2nd relocation type */ | 
|  | +  unsigned char r_type1;	/* 1st relocation type */ | 
|  | +} _Elf64_Mips_R_Info; | 
|  | + | 
|  | +typedef union | 
|  | +{ | 
|  | +  Elf64_Xword	r_info_number; | 
|  | +  _Elf64_Mips_R_Info r_info_fields; | 
|  | +} _Elf64_Mips_R_Info_union; | 
|  | + | 
|  | +typedef struct | 
|  | +{ | 
|  | +  Elf64_Addr	r_offset;		/* Address */ | 
|  | +  _Elf64_Mips_R_Info_union r_info;	/* Relocation type and symbol index */ | 
|  | +} Elf64_Mips_Rel; | 
|  | + | 
|  | +typedef struct | 
|  | +{ | 
|  | +  Elf64_Addr	r_offset;		/* Address */ | 
|  | +  _Elf64_Mips_R_Info_union r_info;	/* Relocation type and symbol index */ | 
|  | +  Elf64_Sxword	r_addend;		/* Addend */ | 
|  | +} Elf64_Mips_Rela; | 
|  | + | 
|  | +#define ELF64_MIPS_R_SYM(i) \ | 
|  | +  ((__extension__ (_Elf64_Mips_R_Info_union)(i)).r_info_fields.r_sym) | 
|  | +#define ELF64_MIPS_R_TYPE(i) \ | 
|  | +  (((_Elf64_Mips_R_Info_union)(i)).r_info_fields.r_type1 \ | 
|  | +   | ((Elf32_Word)(__extension__ (_Elf64_Mips_R_Info_union)(i) \ | 
|  | +		   ).r_info_fields.r_type2 << 8) \ | 
|  | +   | ((Elf32_Word)(__extension__ (_Elf64_Mips_R_Info_union)(i) \ | 
|  | +		   ).r_info_fields.r_type3 << 16) \ | 
|  | +   | ((Elf32_Word)(__extension__ (_Elf64_Mips_R_Info_union)(i) \ | 
|  | +		   ).r_info_fields.r_ssym << 24)) | 
|  | +#define ELF64_MIPS_R_INFO(sym, type) \ | 
|  | +  (__extension__ (_Elf64_Mips_R_Info_union) \ | 
|  | +   (__extension__ (_Elf64_Mips_R_Info) \ | 
|  | +   { (sym), ELF64_MIPS_R_SSYM (type), \ | 
|  | +       ELF64_MIPS_R_TYPE3 (type), \ | 
|  | +       ELF64_MIPS_R_TYPE2 (type), \ | 
|  | +       ELF64_MIPS_R_TYPE1 (type) \ | 
|  | +   }).r_info_number) | 
|  | +/* These macros decompose the value returned by ELF64_MIPS_R_TYPE, and | 
|  | +   compose it back into a value that it can be used as an argument to | 
|  | +   ELF64_MIPS_R_INFO.  */ | 
|  | +#define ELF64_MIPS_R_SSYM(i) (((i) >> 24) & 0xff) | 
|  | +#define ELF64_MIPS_R_TYPE3(i) (((i) >> 16) & 0xff) | 
|  | +#define ELF64_MIPS_R_TYPE2(i) (((i) >> 8) & 0xff) | 
|  | +#define ELF64_MIPS_R_TYPE1(i) ((i) & 0xff) | 
|  | +#define ELF64_MIPS_R_TYPEENC(type1, type2, type3, ssym) \ | 
|  | +  ((type1) \ | 
|  | +   | ((Elf32_Word)(type2) << 8) \ | 
|  | +   | ((Elf32_Word)(type3) << 16) \ | 
|  | +   | ((Elf32_Word)(ssym) << 24)) | 
|  | + | 
|  | +#undef ELF64_R_SYM | 
|  | +#define ELF64_R_SYM(i) ELF64_MIPS_R_SYM (i) | 
|  | +#undef ELF64_R_TYPE | 
|  | +#define ELF64_R_TYPE(i) ELF64_MIPS_R_TYPE (i) | 
|  | +#undef ELF64_R_INFO | 
|  | +#define ELF64_R_INFO(sym, type) ELF64_MIPS_R_INFO ((sym), (type)) | 
|  | + | 
|  | +#endif | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/libc-tls.c glibc-2.19-riscv/sysdeps/riscv/libc-tls.c | 
|  | --- glibc-2.19/sysdeps/riscv/libc-tls.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/libc-tls.c	2014-12-09 16:55:03.164727835 -0800 | 
|  | @@ -0,0 +1,37 @@ | 
|  | +/* Thread-local storage handling in the ELF dynamic linker.  MIPS version. | 
|  | +   Copyright (C) 2005 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <csu/libc-tls.c> | 
|  | +#include <dl-tls.h> | 
|  | + | 
|  | +#if USE_TLS | 
|  | + | 
|  | +/* On MIPS, 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; | 
|  | +} | 
|  | + | 
|  | +#endif | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/__longjmp.S glibc-2.19-riscv/sysdeps/riscv/__longjmp.S | 
|  | --- glibc-2.19/sysdeps/riscv/__longjmp.S	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/__longjmp.S	2014-12-09 16:55:03.152727766 -0800 | 
|  | @@ -0,0 +1,67 @@ | 
|  | +/* Copyright (C) 1996, 1997, 2000, 2002, 2003, 2004 | 
|  | +	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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <sysdep.h> | 
|  | +#include <sys/asm.h> | 
|  | + | 
|  | +ENTRY (__longjmp) | 
|  | +	REG_L ra,  0*SZREG(a0) | 
|  | +	REG_L s0,  1*SZREG(a0) | 
|  | +	REG_L s1,  2*SZREG(a0) | 
|  | +	REG_L s2,  3*SZREG(a0) | 
|  | +	REG_L s3,  4*SZREG(a0) | 
|  | +	REG_L s4,  5*SZREG(a0) | 
|  | +	REG_L s5,  6*SZREG(a0) | 
|  | +	REG_L s6,  7*SZREG(a0) | 
|  | +	REG_L s7,  8*SZREG(a0) | 
|  | +	REG_L s8,  9*SZREG(a0) | 
|  | +	REG_L s9, 10*SZREG(a0) | 
|  | +	REG_L s10,11*SZREG(a0) | 
|  | +	REG_L s11,12*SZREG(a0) | 
|  | +	REG_L sp, 13*SZREG(a0) | 
|  | +	REG_L tp, 14*SZREG(a0) | 
|  | + | 
|  | +#ifdef __riscv_hard_float | 
|  | +	REG_L a3, 15*SZREG(a0) | 
|  | + | 
|  | +	fld  fs0, 16*SZREG+ 0*8(a0) | 
|  | +	fld  fs1, 16*SZREG+ 1*8(a0) | 
|  | +	fld  fs2, 16*SZREG+ 2*8(a0) | 
|  | +	fld  fs3, 16*SZREG+ 3*8(a0) | 
|  | +	fld  fs4, 16*SZREG+ 4*8(a0) | 
|  | +	fld  fs5, 16*SZREG+ 5*8(a0) | 
|  | +	fld  fs6, 16*SZREG+ 6*8(a0) | 
|  | +	fld  fs7, 16*SZREG+ 7*8(a0) | 
|  | +	fld  fs8, 16*SZREG+ 8*8(a0) | 
|  | +	fld  fs9, 16*SZREG+ 9*8(a0) | 
|  | +	fld  fs10,16*SZREG+10*8(a0) | 
|  | +	fld  fs11,16*SZREG+11*8(a0) | 
|  | +	fld  fs12,16*SZREG+12*8(a0) | 
|  | +	fld  fs13,16*SZREG+13*8(a0) | 
|  | +	fld  fs14,16*SZREG+14*8(a0) | 
|  | +	fld  fs15,16*SZREG+15*8(a0) | 
|  | + | 
|  | +	mtfsr a3 | 
|  | +#endif | 
|  | + | 
|  | +	sltu a3, a1, 1    # a3 = (a1 == 0) | 
|  | +	add  v0, a3, a1   # v0 = (a1 == 0 ? 1 : a1) | 
|  | +	ret | 
|  | + | 
|  | +END(__longjmp) | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/Makefile glibc-2.19-riscv/sysdeps/riscv/Makefile | 
|  | --- glibc-2.19/sysdeps/riscv/Makefile	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/Makefile	2014-12-09 16:55:03.152727766 -0800 | 
|  | @@ -0,0 +1,9 @@ | 
|  | +ifeq ($(subdir),misc) | 
|  | +sysdep_headers += sys/asm.h sgidefs.h | 
|  | +endif | 
|  | + | 
|  | +ifeq ($(subdir),rt) | 
|  | +librt-sysdep_routines += rt-sysdep | 
|  | +endif | 
|  | + | 
|  | +ASFLAGS-.os += $(pic-ccflag) | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/memcpy.c glibc-2.19-riscv/sysdeps/riscv/memcpy.c | 
|  | --- glibc-2.19/sysdeps/riscv/memcpy.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/memcpy.c	2014-12-09 16:55:03.164727835 -0800 | 
|  | @@ -0,0 +1,52 @@ | 
|  | +#include <string.h> | 
|  | + | 
|  | +#undef memcpy | 
|  | +#undef __memcpy_g | 
|  | + | 
|  | +void* __memcpy_g(void* dst, const void* src, size_t n) | 
|  | +{ | 
|  | +  void* dst0 = dst; | 
|  | +  void* end = dst + n; | 
|  | + | 
|  | +  /* are dst and src word-aligned? */ | 
|  | +  if ((((long)dst | (long)src) & (sizeof(long)-1)) == 0) | 
|  | +  { | 
|  | +    /* copy 10 words at a time */ | 
|  | +    for ( ; dst <= end - 10*sizeof(long); dst += 10*sizeof(long), src += 10*sizeof(long)) | 
|  | +    { | 
|  | +      long t0 = *(const long*)(src+0*sizeof(long)); | 
|  | +      long t1 = *(const long*)(src+1*sizeof(long)); | 
|  | +      long t2 = *(const long*)(src+2*sizeof(long)); | 
|  | +      long t3 = *(const long*)(src+3*sizeof(long)); | 
|  | +      long t4 = *(const long*)(src+4*sizeof(long)); | 
|  | +      long t5 = *(const long*)(src+5*sizeof(long)); | 
|  | +      long t6 = *(const long*)(src+6*sizeof(long)); | 
|  | +      long t7 = *(const long*)(src+7*sizeof(long)); | 
|  | +      long t8 = *(const long*)(src+8*sizeof(long)); | 
|  | +      long t9 = *(const long*)(src+9*sizeof(long)); | 
|  | +      *(long*)(dst+0*sizeof(long)) = t0; | 
|  | +      *(long*)(dst+1*sizeof(long)) = t1; | 
|  | +      *(long*)(dst+2*sizeof(long)) = t2; | 
|  | +      *(long*)(dst+3*sizeof(long)) = t3; | 
|  | +      *(long*)(dst+4*sizeof(long)) = t4; | 
|  | +      *(long*)(dst+5*sizeof(long)) = t5; | 
|  | +      *(long*)(dst+6*sizeof(long)) = t6; | 
|  | +      *(long*)(dst+7*sizeof(long)) = t7; | 
|  | +      *(long*)(dst+8*sizeof(long)) = t8; | 
|  | +      *(long*)(dst+9*sizeof(long)) = t9; | 
|  | +    } | 
|  | + | 
|  | +    /* copy a word at a time */ | 
|  | +    for ( ; dst <= end - sizeof(long); dst += sizeof(long), src += sizeof(long)) | 
|  | +      *(long*)dst = *(const long*)src; | 
|  | +  } | 
|  | + | 
|  | +  /* copy a byte at a time */ | 
|  | +  for ( ; dst < end; dst++, src++) | 
|  | +    *(char*)dst = *(const char*)src; | 
|  | + | 
|  | +  return dst0; | 
|  | +} | 
|  | +libc_hidden_def (__memcpy_g) | 
|  | +strong_alias (__memcpy_g, memcpy) | 
|  | +libc_hidden_builtin_def (memcpy) | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/memset.c glibc-2.19-riscv/sysdeps/riscv/memset.c | 
|  | --- glibc-2.19/sysdeps/riscv/memset.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/memset.c	2014-12-09 16:55:03.164727835 -0800 | 
|  | @@ -0,0 +1,49 @@ | 
|  | +typedef unsigned long size_t; | 
|  | +//#include <string.h> | 
|  | + | 
|  | +void* memset(void* dst, int val, size_t n) | 
|  | +{ | 
|  | +  void* dst0 = dst; | 
|  | +  void* end = dst + n; | 
|  | +  unsigned char v = val; | 
|  | + | 
|  | +  /* is dst word-aligned? */ | 
|  | +  if (((long)dst & (sizeof(long)-1)) == 0) | 
|  | +  { | 
|  | +    long lval = v; | 
|  | +    lval |= lval << 8; | 
|  | +    lval |= lval << 16; | 
|  | +    #ifdef __riscv64 | 
|  | +    lval |= lval << 32; | 
|  | +    #elif !defined(__riscv32) | 
|  | +    # error | 
|  | +    #endif | 
|  | + | 
|  | +    /* set 10 words at a time */ | 
|  | +    for ( ; dst <= end - 10*sizeof(long); dst += 10*sizeof(long)) | 
|  | +    { | 
|  | +      *(long*)(dst+0*sizeof(long)) = lval; | 
|  | +      *(long*)(dst+1*sizeof(long)) = lval; | 
|  | +      *(long*)(dst+2*sizeof(long)) = lval; | 
|  | +      *(long*)(dst+3*sizeof(long)) = lval; | 
|  | +      *(long*)(dst+4*sizeof(long)) = lval; | 
|  | +      *(long*)(dst+5*sizeof(long)) = lval; | 
|  | +      *(long*)(dst+6*sizeof(long)) = lval; | 
|  | +      *(long*)(dst+7*sizeof(long)) = lval; | 
|  | +      *(long*)(dst+8*sizeof(long)) = lval; | 
|  | +      *(long*)(dst+9*sizeof(long)) = lval; | 
|  | +    } | 
|  | + | 
|  | +    /* set a word at a time */ | 
|  | +    for ( ; dst <= end - sizeof(long); dst += sizeof(long)) | 
|  | +      *(long*)dst = lval; | 
|  | +  } | 
|  | + | 
|  | +  /* set a byte at a time */ | 
|  | +  for ( ; dst < end; dst++) | 
|  | +    *(unsigned char*)dst = v; | 
|  | + | 
|  | +  return dst0; | 
|  | +} | 
|  | + | 
|  | +weak_alias (memset, __GI_memset) | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/memusage.h glibc-2.19-riscv/sysdeps/riscv/memusage.h | 
|  | --- glibc-2.19/sysdeps/riscv/memusage.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/memusage.h	2014-12-09 16:55:03.164727835 -0800 | 
|  | @@ -0,0 +1,21 @@ | 
|  | +/* Copyright (C) 2000 Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | + | 
|  | +   The GNU C Library is free software; you can redistribute it and/or | 
|  | +   modify it under the terms of the GNU 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#define GETSP() ({ register uintptr_t stack_ptr asm ("sp"); stack_ptr; }) | 
|  | + | 
|  | +#include <sysdeps/generic/memusage.h> | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/nptl/Makefile glibc-2.19-riscv/sysdeps/riscv/nptl/Makefile | 
|  | --- glibc-2.19/sysdeps/riscv/nptl/Makefile	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/nptl/Makefile	2014-12-09 16:55:03.164727835 -0800 | 
|  | @@ -0,0 +1,25 @@ | 
|  | +# Copyright (C) 2005 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, write to the Free | 
|  | +# Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +# 02111-1307 USA. | 
|  | + | 
|  | +ifeq ($(subdir),csu) | 
|  | +gen-as-const-headers += tcb-offsets.sym | 
|  | +endif | 
|  | + | 
|  | +ifeq ($(subdir),nptl) | 
|  | +libpthread-sysdep_routines += nptl-sysdep | 
|  | +endif | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/nptl/nptl-sysdep.c glibc-2.19-riscv/sysdeps/riscv/nptl/nptl-sysdep.c | 
|  | --- glibc-2.19/sysdeps/riscv/nptl/nptl-sysdep.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/nptl/nptl-sysdep.c	2014-12-09 16:55:03.164727835 -0800 | 
|  | @@ -0,0 +1,2 @@ | 
|  | +/* Pull in __syscall_error.  */ | 
|  | +#include <sysdep.c> | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/nptl/pthreaddef.h glibc-2.19-riscv/sysdeps/riscv/nptl/pthreaddef.h | 
|  | --- glibc-2.19/sysdeps/riscv/nptl/pthreaddef.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/nptl/pthreaddef.h	2014-12-09 16:55:03.168727857 -0800 | 
|  | @@ -0,0 +1,39 @@ | 
|  | +/* Copyright (C) 2002, 2003, 2005 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +/* Default stack size.  */ | 
|  | +#define ARCH_STACK_DEFAULT_SIZE	(2 * 1024 * 1024) | 
|  | + | 
|  | +/* Required stack pointer alignment at beginning.  */ | 
|  | +#define STACK_ALIGN		16 | 
|  | + | 
|  | +/* Minimal stack size after allocating thread descriptor and guard size.  */ | 
|  | +#define MINIMAL_REST_STACK	2048 | 
|  | + | 
|  | +/* Alignment requirement for TCB.  */ | 
|  | +#define TCB_ALIGNMENT		16 | 
|  | + | 
|  | + | 
|  | +/* Location of current stack frame.  */ | 
|  | +#define CURRENT_STACK_FRAME	__builtin_frame_address (0) | 
|  | + | 
|  | + | 
|  | +/* XXX Until we have a better place keep the definitions here.  */ | 
|  | + | 
|  | +#define __exit_thread_inline(val) \ | 
|  | +  INLINE_SYSCALL (exit, 1, (val)) | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/nptl/pthread_spin_lock.c glibc-2.19-riscv/sysdeps/riscv/nptl/pthread_spin_lock.c | 
|  | --- glibc-2.19/sysdeps/riscv/nptl/pthread_spin_lock.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/nptl/pthread_spin_lock.c	2014-12-09 16:55:03.164727835 -0800 | 
|  | @@ -0,0 +1,32 @@ | 
|  | +/* Copyright (C) 2005 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <errno.h> | 
|  | + | 
|  | +int pthread_spin_lock(pthread_spinlock_t* lock) | 
|  | +{ | 
|  | +  while (__sync_fetch_and_or(lock, 1) != 0) | 
|  | +  { | 
|  | +    while (*lock) | 
|  | +      ; | 
|  | +  } | 
|  | + | 
|  | +  __sync_synchronize(); | 
|  | + | 
|  | +  return 0; | 
|  | +} | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/nptl/pthread_spin_trylock.c glibc-2.19-riscv/sysdeps/riscv/nptl/pthread_spin_trylock.c | 
|  | --- glibc-2.19/sysdeps/riscv/nptl/pthread_spin_trylock.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/nptl/pthread_spin_trylock.c	2014-12-09 16:55:03.164727835 -0800 | 
|  | @@ -0,0 +1,33 @@ | 
|  | +/* Copyright (C) 2005 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <errno.h> | 
|  | + | 
|  | +int pthread_spin_trylock(pthread_spinlock_t* lock) | 
|  | +{ | 
|  | +  int ret; | 
|  | + | 
|  | +  if (__sync_fetch_and_or(lock, 1) == 0) | 
|  | +    ret = 0; | 
|  | +  else | 
|  | +    ret = EBUSY; | 
|  | + | 
|  | +  __sync_synchronize(); | 
|  | + | 
|  | +  return ret; | 
|  | +} | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/nptl/tcb-offsets.sym glibc-2.19-riscv/sysdeps/riscv/nptl/tcb-offsets.sym | 
|  | --- glibc-2.19/sysdeps/riscv/nptl/tcb-offsets.sym	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/nptl/tcb-offsets.sym	2014-12-09 16:55:03.168727857 -0800 | 
|  | @@ -0,0 +1,11 @@ | 
|  | +#include <sysdep.h> | 
|  | +#include <tls.h> | 
|  | + | 
|  | +-- | 
|  | + | 
|  | +-- Abuse tls.h macros to derive offsets relative to the thread register. | 
|  | +#define thread_offsetof(mem)	(long)(offsetof(struct pthread, mem) - TLS_TCB_OFFSET - TLS_PRE_TCB_SIZE) | 
|  | + | 
|  | +MULTIPLE_THREADS_OFFSET		thread_offsetof (header.multiple_threads) | 
|  | +PID_OFFSET			thread_offsetof (pid) | 
|  | +TID_OFFSET			thread_offsetof (tid) | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/nptl/tls.h glibc-2.19-riscv/sysdeps/riscv/nptl/tls.h | 
|  | --- glibc-2.19/sysdeps/riscv/nptl/tls.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/nptl/tls.h	2014-12-09 16:55:03.168727857 -0800 | 
|  | @@ -0,0 +1,165 @@ | 
|  | +/* Definition for thread-local data handling.  NPTL/MIPS version. | 
|  | +   Copyright (C) 2005, 2007 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef _TLS_H | 
|  | +#define _TLS_H	1 | 
|  | + | 
|  | +#include <dl-sysdep.h> | 
|  | + | 
|  | +#ifndef __ASSEMBLER__ | 
|  | +# include <stdbool.h> | 
|  | +# include <stddef.h> | 
|  | +# include <stdint.h> | 
|  | + | 
|  | +/* Type for the dtv.  */ | 
|  | +typedef union dtv | 
|  | +{ | 
|  | +  size_t counter; | 
|  | +  struct | 
|  | +  { | 
|  | +    void *val; | 
|  | +    bool is_static; | 
|  | +  } pointer; | 
|  | +} dtv_t; | 
|  | + | 
|  | +register void* __thread_self asm("tp"); | 
|  | +# define READ_THREAD_POINTER() ({ __thread_self; }) | 
|  | + | 
|  | +#endif /* __ASSEMBLER__ */ | 
|  | + | 
|  | + | 
|  | +/* We require TLS support in the tools.  */ | 
|  | +#ifndef HAVE_TLS_SUPPORT | 
|  | +# error "TLS support is required." | 
|  | +#endif | 
|  | + | 
|  | +/* Signal that TLS support is available.  */ | 
|  | +#define USE_TLS	1 | 
|  | + | 
|  | +#ifndef __ASSEMBLER__ | 
|  | + | 
|  | +/* Get system call information.  */ | 
|  | +# include <sysdep.h> | 
|  | + | 
|  | +/* The TP points to the start of the thread blocks.  */ | 
|  | +# define TLS_DTV_AT_TP	1 | 
|  | + | 
|  | +/* Get the thread descriptor definition.  */ | 
|  | +# include <nptl/descr.h> | 
|  | + | 
|  | +typedef struct | 
|  | +{ | 
|  | +  dtv_t *dtv; | 
|  | +  void *private; | 
|  | +} tcbhead_t; | 
|  | + | 
|  | +/* 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 $29) points to the end of | 
|  | +   the TCB + 0x7000, as for PowerPC.  The pthread_descr structure is | 
|  | +   immediately in front of the TCB.  */ | 
|  | +# 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, secondcall) \ | 
|  | +  ({ __thread_self = (char*)tcbp + TLS_TCB_OFFSET; NULL; }) | 
|  | + | 
|  | +/* 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 \ | 
|  | +  CONST_THREAD_AREA (32, TLS_TCB_OFFSET + TLS_PRE_TCB_SIZE) | 
|  | + | 
|  | +/* 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) | 
|  | + | 
|  | +/* l_tls_offset == 0 is perfectly valid on MIPS, 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 -ruN glibc-2.19/sysdeps/riscv/preconfigure glibc-2.19-riscv/sysdeps/riscv/preconfigure | 
|  | --- glibc-2.19/sysdeps/riscv/preconfigure	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/preconfigure	2014-12-09 16:55:03.168727857 -0800 | 
|  | @@ -0,0 +1,21 @@ | 
|  | +ccccase "$CC $CFLAGS $CPPFLAGS " in | 
|  | +*" -m32 "*) mips_cc_abi=32 ;; | 
|  | +*" -m64 "*) mips_cc_abi=64 ;; | 
|  | +*) mips_cc_abi=default ;; | 
|  | +esac | 
|  | +case $config_os in | 
|  | +*abi64*) mips_config_abi=64 ;; | 
|  | +*abi32*) mips_config_abi=32 ;; | 
|  | +*) mips_config_abi=$mips_cc_abi ;; | 
|  | +esac | 
|  | +case $mips_config_abi in | 
|  | +default) machine=riscv/rv64 ;; | 
|  | +32) machine=riscv/rv32 ;; | 
|  | +esac | 
|  | +machine=$machine/$config_machine | 
|  | +if test $mips_config_abi != $mips_cc_abi; then | 
|  | +  # This won't make it to config.make, but we want to | 
|  | +  # set this in case configure tests depend on it. | 
|  | +  CPPFLAGS="$CPPFLAGS -m$mips_config_abi" | 
|  | +fi | 
|  | +;; | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/rv32/Implies glibc-2.19-riscv/sysdeps/riscv/rv32/Implies | 
|  | --- glibc-2.19/sysdeps/riscv/rv32/Implies	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/rv32/Implies	2014-12-09 16:55:03.168727857 -0800 | 
|  | @@ -0,0 +1,2 @@ | 
|  | +riscv | 
|  | +wordsize-32 | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/rv32/Makefile glibc-2.19-riscv/sysdeps/riscv/rv32/Makefile | 
|  | --- glibc-2.19/sysdeps/riscv/rv32/Makefile	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/rv32/Makefile	2014-12-09 16:55:03.168727857 -0800 | 
|  | @@ -0,0 +1,3 @@ | 
|  | +ifeq ($(filter -m32,$(CC)),) | 
|  | +CC += -m32 | 
|  | +endif | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/rv64/gmp-mparam.h glibc-2.19-riscv/sysdeps/riscv/rv64/gmp-mparam.h | 
|  | --- glibc-2.19/sysdeps/riscv/rv64/gmp-mparam.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/rv64/gmp-mparam.h	2014-12-09 16:55:03.168727857 -0800 | 
|  | @@ -0,0 +1,31 @@ | 
|  | +/* gmp-mparam.h -- Compiler/machine parameter header file. | 
|  | + | 
|  | +Copyright (C) 1991, 1993, 1994, 2002, 2003 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, write to | 
|  | +the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ | 
|  | + | 
|  | +#if defined __GMP_H__ && ! defined _LONG_LONG_LIMB | 
|  | +#error "Included too late for _LONG_LONG_LIMB to take effect" | 
|  | +#endif | 
|  | + | 
|  | +#define _LONG_LONG_LIMB | 
|  | +#define BITS_PER_MP_LIMB 64 | 
|  | +#define BYTES_PER_MP_LIMB 8 | 
|  | +#define BITS_PER_LONGINT __WORDSIZE | 
|  | +#define BITS_PER_INT 32 | 
|  | +#define BITS_PER_SHORTINT 16 | 
|  | +#define BITS_PER_CHAR 8 | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/rv64/Implies glibc-2.19-riscv/sysdeps/riscv/rv64/Implies | 
|  | --- glibc-2.19/sysdeps/riscv/rv64/Implies	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/rv64/Implies	2014-12-09 16:55:03.168727857 -0800 | 
|  | @@ -0,0 +1,6 @@ | 
|  | +ieee754/flt-32 | 
|  | +ieee754/dbl-64 | 
|  | +riscv/rv64/soft-fp | 
|  | +riscv/rv64 | 
|  | +riscv | 
|  | +wordsize-64 | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/rv64/libm-test-ulps glibc-2.19-riscv/sysdeps/riscv/rv64/libm-test-ulps | 
|  | --- glibc-2.19/sysdeps/riscv/rv64/libm-test-ulps	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/rv64/libm-test-ulps	2014-12-09 16:55:03.168727857 -0800 | 
|  | @@ -0,0 +1,1245 @@ | 
|  | +# Begin of automatic generation | 
|  | + | 
|  | +# atan2 | 
|  | +Test "atan2 (-0.00756827042671106339, -.001792735857538728036) == -1.80338464113663849327153994379639112": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "atan2 (-0.75, -1.0) == -2.49809154479650885165983415456218025": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "atan2 (0.75, -1.0) == 2.49809154479650885165983415456218025": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "atan2 (1.390625, 0.9296875) == 0.981498387184244311516296577615519772": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +# atanh | 
|  | +Test "atanh (0.75) == 0.972955074527656652552676371721589865": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +# cacos | 
|  | +Test "Imaginary part of: cacos (0.75 + 1.25 i) == 1.11752014915610270578240049553777969 - 1.13239363160530819522266333696834467 i": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +# cacosh | 
|  | +Test "Imaginary part of: cacosh (-2 - 3 i) == 1.9833870299165354323470769028940395 - 2.1414491111159960199416055713254211 i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +# casin | 
|  | +Test "Real part of: casin (0.75 + 1.25 i) == 0.453276177638793913448921196101971749 + 1.13239363160530819522266333696834467 i": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Imaginary part of: casin (0.75 + 1.25 i) == 0.453276177638793913448921196101971749 + 1.13239363160530819522266333696834467 i": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +# casinh | 
|  | +Test "Real part of: casinh (-2 - 3 i) == -1.9686379257930962917886650952454982 - 0.96465850440760279204541105949953237 i": | 
|  | +double: 5 | 
|  | +float: 1 | 
|  | +idouble: 5 | 
|  | +ifloat: 1 | 
|  | +ildouble: 4 | 
|  | +ldouble: 4 | 
|  | +Test "Imaginary part of: casinh (-2 - 3 i) == -1.9686379257930962917886650952454982 - 0.96465850440760279204541105949953237 i": | 
|  | +double: 3 | 
|  | +float: 6 | 
|  | +idouble: 3 | 
|  | +ifloat: 6 | 
|  | +ildouble: 2 | 
|  | +ldouble: 2 | 
|  | +Test "Real part of: casinh (0.75 + 1.25 i) == 1.03171853444778027336364058631006594 + 0.911738290968487636358489564316731207 i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "Imaginary part of: casinh (0.75 + 1.25 i) == 1.03171853444778027336364058631006594 + 0.911738290968487636358489564316731207 i": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +# catan | 
|  | +Test "Imaginary part of: catan (-2 - 3 i) == -1.4099210495965755225306193844604208 - 0.22907268296853876629588180294200276 i": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Imaginary part of: catan (0.75 + 1.25 i) == 1.10714871779409050301706546017853704 + 0.549306144334054845697622618461262852 i": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +# catanh | 
|  | +Test "Real part of: catanh (-2 - 3 i) == -0.14694666622552975204743278515471595 - 1.3389725222944935611241935759091443 i": | 
|  | +double: 4 | 
|  | +idouble: 4 | 
|  | +Test "Real part of: catanh (0.75 + 1.25 i) == 0.261492138795671927078652057366532140 + 0.996825126463918666098902241310446708 i": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "Imaginary part of: catanh (0.75 + 1.25 i) == 0.261492138795671927078652057366532140 + 0.996825126463918666098902241310446708 i": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +# cbrt | 
|  | +Test "cbrt (-0.001) == -0.1": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "cbrt (-27.0) == -3.0": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | +Test "cbrt (0.75) == 0.908560296416069829445605878163630251": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | +Test "cbrt (0.9921875) == 0.997389022060725270579075195353955217": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | + | 
|  | +# ccos | 
|  | +Test "Real part of: ccos (-2 - 3 i) == -4.18962569096880723013255501961597373 - 9.10922789375533659797919726277886212 i": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "Imaginary part of: ccos (-2 - 3 i) == -4.18962569096880723013255501961597373 - 9.10922789375533659797919726277886212 i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "Real part of: ccos (0.75 + 1.25 i) == 1.38173873063425888530729933139078645 - 1.09193013555397466170919531722024128 i": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Imaginary part of: ccos (0.75 + 1.25 i) == 1.38173873063425888530729933139078645 - 1.09193013555397466170919531722024128 i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +# ccosh | 
|  | +Test "Real part of: ccosh (-2 - 3 i) == -3.72454550491532256547397070325597253 + 0.511822569987384608834463849801875634 i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "Imaginary part of: ccosh (-2 - 3 i) == -3.72454550491532256547397070325597253 + 0.511822569987384608834463849801875634 i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "Real part of: ccosh (0.75 + 1.25 i) == 0.408242591877968807788852146397499084 + 0.780365930845853240391326216300863152 i": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Imaginary part of: ccosh (0.75 + 1.25 i) == 0.408242591877968807788852146397499084 + 0.780365930845853240391326216300863152 i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +# cexp | 
|  | +Test "Real part of: cexp (-2.0 - 3.0 i) == -0.13398091492954261346140525546115575 - 0.019098516261135196432576240858800925 i": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "Imaginary part of: cexp (-2.0 - 3.0 i) == -0.13398091492954261346140525546115575 - 0.019098516261135196432576240858800925 i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "Real part of: cexp (0.75 + 1.25 i) == 0.667537446429131586942201977015932112 + 2.00900045494094876258347228145863909 i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Imaginary part of: cexp (0.75 + 1.25 i) == 0.667537446429131586942201977015932112 + 2.00900045494094876258347228145863909 i": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +# clog | 
|  | +Test "Real part of: clog (0.75 + 1.25 i) == 0.376885901188190075998919126749298416 + 1.03037682652431246378774332703115153 i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +# clog10 | 
|  | +Test "Imaginary part of: clog10 (-0 + inf i) == inf + pi/2*log10(e) i": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Imaginary part of: clog10 (-0 - inf i) == inf - pi/2*log10(e) i": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Real part of: clog10 (-2 - 3 i) == 0.556971676153418384603252578971164214 - 0.937554462986374708541507952140189646 i": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "Imaginary part of: clog10 (-2 - 3 i) == 0.556971676153418384603252578971164214 - 0.937554462986374708541507952140189646 i": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "Imaginary part of: clog10 (-3 + inf i) == inf + pi/2*log10(e) i": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Imaginary part of: clog10 (-3 - inf i) == inf - pi/2*log10(e) i": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Imaginary part of: clog10 (-inf + 0 i) == inf + pi*log10(e) i": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Imaginary part of: clog10 (-inf + 1 i) == inf + pi*log10(e) i": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Imaginary part of: clog10 (-inf + inf i) == inf + 3/4 pi*log10(e) i": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | +Test "Imaginary part of: clog10 (-inf - 0 i) == inf - pi*log10(e) i": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Imaginary part of: clog10 (-inf - 1 i) == inf - pi*log10(e) i": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Imaginary part of: clog10 (0 + inf i) == inf + pi/2*log10(e) i": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Imaginary part of: clog10 (0 - inf i) == inf - pi/2*log10(e) i": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Real part of: clog10 (0.75 + 1.25 i) == 0.163679467193165171449476605077428975 + 0.447486970040493067069984724340855636 i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Imaginary part of: clog10 (0.75 + 1.25 i) == 0.163679467193165171449476605077428975 + 0.447486970040493067069984724340855636 i": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "Imaginary part of: clog10 (3 + inf i) == inf + pi/2*log10(e) i": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Imaginary part of: clog10 (3 - inf i) == inf - pi/2*log10(e) i": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Imaginary part of: clog10 (inf + inf i) == inf + pi/4*log10(e) i": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Imaginary part of: clog10 (inf - inf i) == inf - pi/4*log10(e) i": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +# cos | 
|  | +Test "cos (M_PI_6l * 2.0) == 0.5": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "cos (M_PI_6l * 4.0) == -0.5": | 
|  | +double: 2 | 
|  | +float: 1 | 
|  | +idouble: 2 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +# cpow | 
|  | +Test "Real part of: cpow (0.75 + 1.25 i, 0.0 + 1.0 i) == 0.331825439177608832276067945276730566 + 0.131338600281188544930936345230903032 i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Imaginary part of: cpow (0.75 + 1.25 i, 0.0 + 1.0 i) == 0.331825439177608832276067945276730566 + 0.131338600281188544930936345230903032 i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Real part of: cpow (0.75 + 1.25 i, 0.75 + 1.25 i) == 0.117506293914473555420279832210420483 + 0.346552747708338676483025352060418001 i": | 
|  | +double: 1 | 
|  | +float: 4 | 
|  | +idouble: 1 | 
|  | +ifloat: 4 | 
|  | +ildouble: 4 | 
|  | +ldouble: 4 | 
|  | +Test "Real part of: cpow (0.75 + 1.25 i, 1.0 + 0.0 i) == 0.75 + 1.25 i": | 
|  | +ildouble: 2 | 
|  | +ldouble: 2 | 
|  | +Test "Imaginary part of: cpow (0.75 + 1.25 i, 1.0 + 0.0 i) == 0.75 + 1.25 i": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "Real part of: cpow (0.75 + 1.25 i, 1.0 + 1.0 i) == 0.0846958290317209430433805274189191353 + 0.513285749182902449043287190519090481 i": | 
|  | +double: 2 | 
|  | +float: 3 | 
|  | +idouble: 2 | 
|  | +ifloat: 3 | 
|  | +ildouble: 10 | 
|  | +ldouble: 10 | 
|  | +Test "Real part of: cpow (2 + 0 i, 10 + 0 i) == 1024.0 + 0.0 i": | 
|  | +ildouble: 2 | 
|  | +ldouble: 2 | 
|  | +Test "Real part of: cpow (2 + 3 i, 4 + 0 i) == -119.0 - 120.0 i": | 
|  | +double: 1 | 
|  | +float: 4 | 
|  | +idouble: 1 | 
|  | +ifloat: 4 | 
|  | +ildouble: 3 | 
|  | +ldouble: 3 | 
|  | +Test "Imaginary part of: cpow (2 + 3 i, 4 + 0 i) == -119.0 - 120.0 i": | 
|  | +float: 2 | 
|  | +ifloat: 2 | 
|  | +Test "Imaginary part of: cpow (e + 0 i, 0 + 2 * M_PIl i) == 1.0 + 0.0 i": | 
|  | +double: 2 | 
|  | +float: 2 | 
|  | +idouble: 2 | 
|  | +ifloat: 2 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +# csin | 
|  | +Test "Imaginary part of: csin (-2 - 3 i) == -9.15449914691142957346729954460983256 + 4.16890695996656435075481305885375484 i": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "Real part of: csin (0.75 + 1.25 i) == 1.28722291002649188575873510790565441 + 1.17210635989270256101081285116138863 i": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +# csinh | 
|  | +Test "Real part of: csinh (-2 - 3 i) == 3.59056458998577995201256544779481679 - 0.530921086248519805267040090660676560 i": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "Imaginary part of: csinh (-2 - 3 i) == 3.59056458998577995201256544779481679 - 0.530921086248519805267040090660676560 i": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | +Test "Real part of: csinh (0.75 + 1.25 i) == 0.259294854551162779153349830618433028 + 1.22863452409509552219214606515777594 i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Imaginary part of: csinh (0.75 + 1.25 i) == 0.259294854551162779153349830618433028 + 1.22863452409509552219214606515777594 i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +# csqrt | 
|  | +Test "Real part of: csqrt (-2 + 3 i) == 0.89597747612983812471573375529004348 + 1.6741492280355400404480393008490519 i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "Real part of: csqrt (-2 - 3 i) == 0.89597747612983812471573375529004348 - 1.6741492280355400404480393008490519 i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "Imaginary part of: csqrt (0.75 + 1.25 i) == 1.05065169626078392338656675760808326 + 0.594868882070379067881984030639932657 i": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +# ctan | 
|  | +Test "Real part of: ctan (-2 - 3 i) == 0.376402564150424829275122113032269084e-2 - 1.00323862735360980144635859782192726 i": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "Imaginary part of: ctan (-2 - 3 i) == 0.376402564150424829275122113032269084e-2 - 1.00323862735360980144635859782192726 i": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "Imaginary part of: ctan (0.75 + 1.25 i) == 0.160807785916206426725166058173438663 + 0.975363285031235646193581759755216379 i": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | +ildouble: 2 | 
|  | +ldouble: 2 | 
|  | + | 
|  | +# ctanh | 
|  | +Test "Real part of: ctanh (-2 - 3 i) == -0.965385879022133124278480269394560686 + 0.988437503832249372031403430350121098e-2 i": | 
|  | +double: 1 | 
|  | +float: 2 | 
|  | +idouble: 1 | 
|  | +ifloat: 2 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "Imaginary part of: ctanh (-2 - 3 i) == -0.965385879022133124278480269394560686 + 0.988437503832249372031403430350121098e-2 i": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "Imaginary part of: ctanh (0 + pi/4 i) == 0.0 + 1.0 i": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "Real part of: ctanh (0.75 + 1.25 i) == 1.37260757053378320258048606571226857 + 0.385795952609750664177596760720790220 i": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | + | 
|  | +# erf | 
|  | +Test "erf (1.25) == 0.922900128256458230136523481197281140": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | + | 
|  | +# erfc | 
|  | +Test "erfc (2.0) == 0.00467773498104726583793074363274707139": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | +Test "erfc (27.0) == 0.523704892378925568501606768284954709e-318": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "erfc (4.125) == 0.542340079956506600531223408575531062e-8": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | + | 
|  | +# exp10 | 
|  | +Test "exp10 (-1) == 0.1": | 
|  | +double: 2 | 
|  | +float: 1 | 
|  | +idouble: 2 | 
|  | +ifloat: 1 | 
|  | +Test "exp10 (0.75) == 5.62341325190349080394951039776481231": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "exp10 (3) == 1000": | 
|  | +double: 6 | 
|  | +float: 2 | 
|  | +idouble: 6 | 
|  | +ifloat: 2 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +# exp2 | 
|  | +Test "exp2 (10) == 1024": | 
|  | +ildouble: 2 | 
|  | +ldouble: 2 | 
|  | + | 
|  | +# expm1 | 
|  | +Test "expm1 (0.75) == 1.11700001661267466854536981983709561": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | +Test "expm1 (1) == M_El - 1.0": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +# gamma | 
|  | +Test "gamma (-0.5) == log(2*sqrt(pi))": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +# hypot | 
|  | +Test "hypot (-0.7, -12.4) == 12.419742348374220601176836866763271": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "hypot (-0.7, 12.4) == 12.419742348374220601176836866763271": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "hypot (-12.4, -0.7) == 12.419742348374220601176836866763271": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "hypot (-12.4, 0.7) == 12.419742348374220601176836866763271": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "hypot (0.7, -12.4) == 12.419742348374220601176836866763271": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "hypot (0.7, 12.4) == 12.419742348374220601176836866763271": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "hypot (12.4, -0.7) == 12.419742348374220601176836866763271": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "hypot (12.4, 0.7) == 12.419742348374220601176836866763271": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +# j0 | 
|  | +Test "j0 (-4.0) == -3.9714980986384737228659076845169804197562E-1": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "j0 (0.75) == 0.864242275166648623555731103820923211": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "j0 (10.0) == -0.245935764451348335197760862485328754": | 
|  | +double: 2 | 
|  | +float: 1 | 
|  | +idouble: 2 | 
|  | +ifloat: 1 | 
|  | +ildouble: 2 | 
|  | +ldouble: 2 | 
|  | +Test "j0 (2.0) == 0.223890779141235668051827454649948626": | 
|  | +float: 2 | 
|  | +ifloat: 2 | 
|  | +ildouble: 2 | 
|  | +ldouble: 2 | 
|  | +Test "j0 (4.0) == -3.9714980986384737228659076845169804197562E-1": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "j0 (8.0) == 0.171650807137553906090869407851972001": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +# j1 | 
|  | +Test "j1 (-1.0) == -0.440050585744933515959682203718914913": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "j1 (0.75) == 0.349243602174862192523281016426251335": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "j1 (1.0) == 0.440050585744933515959682203718914913": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "j1 (10.0) == 0.0434727461688614366697487680258592883": | 
|  | +float: 2 | 
|  | +ifloat: 2 | 
|  | +ildouble: 2 | 
|  | +ldouble: 2 | 
|  | +Test "j1 (2.0) == 0.576724807756873387202448242269137087": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | +Test "j1 (8.0) == 0.234636346853914624381276651590454612": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | +ildouble: 4 | 
|  | +ldouble: 4 | 
|  | + | 
|  | +# jn | 
|  | +Test "jn (0, -4.0) == -3.9714980986384737228659076845169804197562E-1": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "jn (0, 0.75) == 0.864242275166648623555731103820923211": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "jn (0, 10.0) == -0.245935764451348335197760862485328754": | 
|  | +double: 2 | 
|  | +float: 1 | 
|  | +idouble: 2 | 
|  | +ifloat: 1 | 
|  | +ildouble: 2 | 
|  | +ldouble: 2 | 
|  | +Test "jn (0, 2.0) == 0.223890779141235668051827454649948626": | 
|  | +float: 2 | 
|  | +ifloat: 2 | 
|  | +ildouble: 2 | 
|  | +ldouble: 2 | 
|  | +Test "jn (0, 4.0) == -3.9714980986384737228659076845169804197562E-1": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "jn (0, 8.0) == 0.171650807137553906090869407851972001": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "jn (1, -1.0) == -0.440050585744933515959682203718914913": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "jn (1, 0.75) == 0.349243602174862192523281016426251335": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "jn (1, 1.0) == 0.440050585744933515959682203718914913": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "jn (1, 10.0) == 0.0434727461688614366697487680258592883": | 
|  | +float: 2 | 
|  | +ifloat: 2 | 
|  | +ildouble: 2 | 
|  | +ldouble: 2 | 
|  | +Test "jn (1, 2.0) == 0.576724807756873387202448242269137087": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | +Test "jn (1, 8.0) == 0.234636346853914624381276651590454612": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | +ildouble: 4 | 
|  | +ldouble: 4 | 
|  | +Test "jn (10, -1.0) == 0.263061512368745320699785368779050294e-9": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "jn (10, 0.125) == 0.250543369809369890173993791865771547e-18": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "jn (10, 0.75) == 0.149621713117596814698712483621682835e-10": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "jn (10, 1.0) == 0.263061512368745320699785368779050294e-9": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "jn (10, 10.0) == 0.207486106633358857697278723518753428": | 
|  | +double: 4 | 
|  | +float: 3 | 
|  | +idouble: 4 | 
|  | +ifloat: 3 | 
|  | +ildouble: 2 | 
|  | +ldouble: 2 | 
|  | +Test "jn (10, 2.0) == 0.251538628271673670963516093751820639e-6": | 
|  | +float: 4 | 
|  | +ifloat: 4 | 
|  | +Test "jn (3, 0.125) == 0.406503832554912875023029337653442868e-4": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "jn (3, 0.75) == 0.848438342327410884392755236884386804e-2": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "jn (3, 10.0) == 0.0583793793051868123429354784103409563": | 
|  | +double: 3 | 
|  | +float: 1 | 
|  | +idouble: 3 | 
|  | +ifloat: 1 | 
|  | +ildouble: 2 | 
|  | +ldouble: 2 | 
|  | +Test "jn (3, 2.0) == 0.128943249474402051098793332969239835": | 
|  | +double: 1 | 
|  | +float: 2 | 
|  | +idouble: 1 | 
|  | +ifloat: 2 | 
|  | + | 
|  | +# lgamma | 
|  | +Test "lgamma (-0.5) == log(2*sqrt(pi))": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "lgamma (0.7) == 0.260867246531666514385732417016759578": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "lgamma (1.2) == -0.853740900033158497197028392998854470e-1": | 
|  | +double: 1 | 
|  | +float: 2 | 
|  | +idouble: 1 | 
|  | +ifloat: 2 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +# log10 | 
|  | +Test "log10 (0.75) == -0.124938736608299953132449886193870744": | 
|  | +double: 1 | 
|  | +float: 2 | 
|  | +idouble: 1 | 
|  | +ifloat: 2 | 
|  | +Test "log10 (e) == log10(e)": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +# log1p | 
|  | +Test "log1p (-0.25) == -0.287682072451780927439219005993827432": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +# log2 | 
|  | +Test "log2 (0.75) == -.415037499278843818546261056052183492": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +# sincos | 
|  | +Test "sincos (M_PI_6l*2.0, &sin_res, &cos_res) puts 0.5 in cos_res": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "sincos (M_PI_6l*2.0, &sin_res, &cos_res) puts 0.86602540378443864676372317075293616 in sin_res": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "sincos (pi/6, &sin_res, &cos_res) puts 0.86602540378443864676372317075293616 in cos_res": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +# sqrt | 
|  | +Test "sqrt (2) == M_SQRT2l": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +# tanh | 
|  | +Test "tanh (-0.75) == -0.635148952387287319214434357312496495": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "tanh (-1.0) == -0.7615941559557648881194582826047935904": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "tanh (0.75) == 0.635148952387287319214434357312496495": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "tanh (1.0) == 0.7615941559557648881194582826047935904": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +# tgamma | 
|  | +Test "tgamma (-0.5) == -2 sqrt (pi)": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "tgamma (0.5) == sqrt (pi)": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +Test "tgamma (0.7) == 1.29805533264755778568117117915281162": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +Test "tgamma (4) == 6": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +# y0 | 
|  | +Test "y0 (1.0) == 0.0882569642156769579829267660235151628": | 
|  | +double: 2 | 
|  | +float: 1 | 
|  | +idouble: 2 | 
|  | +ifloat: 1 | 
|  | +Test "y0 (1.5) == 0.382448923797758843955068554978089862": | 
|  | +double: 2 | 
|  | +float: 1 | 
|  | +idouble: 2 | 
|  | +ifloat: 1 | 
|  | +Test "y0 (10.0) == 0.0556711672835993914244598774101900481": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 3 | 
|  | +ldouble: 3 | 
|  | +Test "y0 (8.0) == 0.223521489387566220527323400498620359": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 3 | 
|  | +ldouble: 3 | 
|  | + | 
|  | +# y1 | 
|  | +Test "y1 (0.125) == -5.19993611253477499595928744876579921": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | +Test "y1 (0.75) == -1.03759455076928541973767132140642198": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "y1 (1.5) == -0.412308626973911295952829820633445323": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "y1 (10.0) == 0.249015424206953883923283474663222803": | 
|  | +double: 3 | 
|  | +float: 1 | 
|  | +idouble: 3 | 
|  | +ifloat: 1 | 
|  | +Test "y1 (2.0) == -0.107032431540937546888370772277476637": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "y1 (8.0) == -0.158060461731247494255555266187483550": | 
|  | +double: 1 | 
|  | +float: 2 | 
|  | +idouble: 1 | 
|  | +ifloat: 2 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +# yn | 
|  | +Test "yn (0, 1.0) == 0.0882569642156769579829267660235151628": | 
|  | +double: 2 | 
|  | +float: 1 | 
|  | +idouble: 2 | 
|  | +ifloat: 1 | 
|  | +Test "yn (0, 1.5) == 0.382448923797758843955068554978089862": | 
|  | +double: 2 | 
|  | +float: 1 | 
|  | +idouble: 2 | 
|  | +ifloat: 1 | 
|  | +Test "yn (0, 10.0) == 0.0556711672835993914244598774101900481": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 3 | 
|  | +ldouble: 3 | 
|  | +Test "yn (0, 8.0) == 0.223521489387566220527323400498620359": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 3 | 
|  | +ldouble: 3 | 
|  | +Test "yn (1, 0.125) == -5.19993611253477499595928744876579921": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | +Test "yn (1, 0.75) == -1.03759455076928541973767132140642198": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "yn (1, 1.5) == -0.412308626973911295952829820633445323": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "yn (1, 10.0) == 0.249015424206953883923283474663222803": | 
|  | +double: 3 | 
|  | +float: 1 | 
|  | +idouble: 3 | 
|  | +ifloat: 1 | 
|  | +Test "yn (1, 2.0) == -0.107032431540937546888370772277476637": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "yn (1, 8.0) == -0.158060461731247494255555266187483550": | 
|  | +double: 1 | 
|  | +float: 2 | 
|  | +idouble: 1 | 
|  | +ifloat: 2 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "yn (10, 0.125) == -127057845771019398.252538486899753195": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | +ildouble: 2 | 
|  | +ldouble: 2 | 
|  | +Test "yn (10, 0.75) == -2133501638.90573424452445412893839236": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 5 | 
|  | +ldouble: 5 | 
|  | +Test "yn (10, 1.0) == -121618014.278689189288130426667971145": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "yn (10, 10.0) == -0.359814152183402722051986577343560609": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 2 | 
|  | +ldouble: 2 | 
|  | +Test "yn (10, 2.0) == -129184.542208039282635913145923304214": | 
|  | +double: 2 | 
|  | +idouble: 2 | 
|  | +ildouble: 2 | 
|  | +ldouble: 2 | 
|  | +Test "yn (3, 0.125) == -2612.69757350066712600220955744091741": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | +Test "yn (3, 0.75) == -12.9877176234475433186319774484809207": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 2 | 
|  | +ldouble: 2 | 
|  | +Test "yn (3, 10.0) == -0.251362657183837329779204747654240998": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | +Test "yn (3, 2.0) == -1.12778377684042778608158395773179238": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | + | 
|  | +# Maximal error of functions: | 
|  | +Function: "atan2": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +Function: "atanh": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +Function: Imaginary part of "cacos": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +Function: Imaginary part of "cacosh": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +Function: Real part of "casin": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +Function: Imaginary part of "casin": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +Function: Real part of "casinh": | 
|  | +double: 5 | 
|  | +float: 1 | 
|  | +idouble: 5 | 
|  | +ifloat: 1 | 
|  | +ildouble: 4 | 
|  | +ldouble: 4 | 
|  | + | 
|  | +Function: Imaginary part of "casinh": | 
|  | +double: 3 | 
|  | +float: 6 | 
|  | +idouble: 3 | 
|  | +ifloat: 6 | 
|  | +ildouble: 2 | 
|  | +ldouble: 2 | 
|  | + | 
|  | +Function: Imaginary part of "catan": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +Function: Real part of "catanh": | 
|  | +double: 4 | 
|  | +idouble: 4 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +Function: Imaginary part of "catanh": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +Function: "cbrt": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +Function: Real part of "ccos": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +Function: Imaginary part of "ccos": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +Function: Real part of "ccosh": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +Function: Imaginary part of "ccosh": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +Function: Real part of "cexp": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +Function: Imaginary part of "cexp": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +Function: Real part of "clog": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +Function: Real part of "clog10": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +Function: Imaginary part of "clog10": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +Function: "cos": | 
|  | +double: 2 | 
|  | +float: 1 | 
|  | +idouble: 2 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +Function: Real part of "cpow": | 
|  | +double: 2 | 
|  | +float: 4 | 
|  | +idouble: 2 | 
|  | +ifloat: 4 | 
|  | +ildouble: 10 | 
|  | +ldouble: 10 | 
|  | + | 
|  | +Function: Imaginary part of "cpow": | 
|  | +double: 2 | 
|  | +float: 2 | 
|  | +idouble: 2 | 
|  | +ifloat: 2 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +Function: Real part of "csin": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +Function: Imaginary part of "csin": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +Function: Real part of "csinh": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +Function: Imaginary part of "csinh": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +Function: Real part of "csqrt": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +Function: Imaginary part of "csqrt": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +Function: Real part of "ctan": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +Function: Imaginary part of "ctan": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | +ildouble: 2 | 
|  | +ldouble: 2 | 
|  | + | 
|  | +Function: Real part of "ctanh": | 
|  | +double: 1 | 
|  | +float: 2 | 
|  | +idouble: 1 | 
|  | +ifloat: 2 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +Function: Imaginary part of "ctanh": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +Function: "erf": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | + | 
|  | +Function: "erfc": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +Function: "exp10": | 
|  | +double: 6 | 
|  | +float: 2 | 
|  | +idouble: 6 | 
|  | +ifloat: 2 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +Function: "exp2": | 
|  | +ildouble: 2 | 
|  | +ldouble: 2 | 
|  | + | 
|  | +Function: "expm1": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +Function: "gamma": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +Function: "hypot": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | + | 
|  | +Function: "j0": | 
|  | +double: 2 | 
|  | +float: 2 | 
|  | +idouble: 2 | 
|  | +ifloat: 2 | 
|  | +ildouble: 2 | 
|  | +ldouble: 2 | 
|  | + | 
|  | +Function: "j1": | 
|  | +double: 1 | 
|  | +float: 2 | 
|  | +idouble: 1 | 
|  | +ifloat: 2 | 
|  | +ildouble: 4 | 
|  | +ldouble: 4 | 
|  | + | 
|  | +Function: "jn": | 
|  | +double: 4 | 
|  | +float: 4 | 
|  | +idouble: 4 | 
|  | +ifloat: 4 | 
|  | +ildouble: 4 | 
|  | +ldouble: 4 | 
|  | + | 
|  | +Function: "lgamma": | 
|  | +double: 1 | 
|  | +float: 2 | 
|  | +idouble: 1 | 
|  | +ifloat: 2 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +Function: "log10": | 
|  | +double: 1 | 
|  | +float: 2 | 
|  | +idouble: 1 | 
|  | +ifloat: 2 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +Function: "log1p": | 
|  | +float: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +Function: "log2": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +Function: "sincos": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +Function: "sqrt": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +Function: "tan": | 
|  | +double: 1 | 
|  | +idouble: 1 | 
|  | + | 
|  | +Function: "tanh": | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +Function: "tgamma": | 
|  | +double: 1 | 
|  | +float: 1 | 
|  | +idouble: 1 | 
|  | +ifloat: 1 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +Function: "y0": | 
|  | +double: 2 | 
|  | +float: 1 | 
|  | +idouble: 2 | 
|  | +ifloat: 1 | 
|  | +ildouble: 3 | 
|  | +ldouble: 3 | 
|  | + | 
|  | +Function: "y1": | 
|  | +double: 3 | 
|  | +float: 2 | 
|  | +idouble: 3 | 
|  | +ifloat: 2 | 
|  | +ildouble: 1 | 
|  | +ldouble: 1 | 
|  | + | 
|  | +Function: "yn": | 
|  | +double: 3 | 
|  | +float: 2 | 
|  | +idouble: 3 | 
|  | +ifloat: 2 | 
|  | +ildouble: 5 | 
|  | +ldouble: 5 | 
|  | + | 
|  | +# end of automatic generation | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/rv64/Makefile glibc-2.19-riscv/sysdeps/riscv/rv64/Makefile | 
|  | --- glibc-2.19/sysdeps/riscv/rv64/Makefile	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/rv64/Makefile	2014-12-09 16:55:03.168727857 -0800 | 
|  | @@ -0,0 +1,3 @@ | 
|  | +ifeq ($(filter -m64,$(CC)),) | 
|  | +CC += -m64 | 
|  | +endif | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/rv64/soft-fp/e_sqrtl.c glibc-2.19-riscv/sysdeps/riscv/rv64/soft-fp/e_sqrtl.c | 
|  | --- glibc-2.19/sysdeps/riscv/rv64/soft-fp/e_sqrtl.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/rv64/soft-fp/e_sqrtl.c	2014-12-09 16:55:03.168727857 -0800 | 
|  | @@ -0,0 +1,39 @@ | 
|  | +/* long double square root in software floating-point emulation. | 
|  | +   Copyright (C) 1997, 1999, 2006 Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by Richard Henderson (rth@cygnus.com) and | 
|  | +		  Jakub Jelinek (jj@ultra.linux.cz). | 
|  | + | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <stdlib.h> | 
|  | +#include <soft-fp.h> | 
|  | +#include <quad.h> | 
|  | + | 
|  | +long double | 
|  | +__ieee754_sqrtl (const long double a) | 
|  | +{ | 
|  | +  FP_DECL_EX; | 
|  | +  FP_DECL_Q(A); FP_DECL_Q(C); | 
|  | +  long double c; | 
|  | + | 
|  | +  FP_INIT_ROUNDMODE; | 
|  | +  FP_UNPACK_Q(A, a); | 
|  | +  FP_SQRT_Q(C, A); | 
|  | +  FP_PACK_Q(c, C); | 
|  | +  FP_HANDLE_EXCEPTIONS; | 
|  | +  return c; | 
|  | +} | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/rv64/soft-fp/Makefile glibc-2.19-riscv/sysdeps/riscv/rv64/soft-fp/Makefile | 
|  | --- glibc-2.19/sysdeps/riscv/rv64/soft-fp/Makefile	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/rv64/soft-fp/Makefile	2014-12-09 16:55:03.168727857 -0800 | 
|  | @@ -0,0 +1,3 @@ | 
|  | +ifeq ($(subdir),math) | 
|  | +CPPFLAGS += -I../soft-fp | 
|  | +endif | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/rv64/soft-fp/sfp-machine.h glibc-2.19-riscv/sysdeps/riscv/rv64/soft-fp/sfp-machine.h | 
|  | --- glibc-2.19/sysdeps/riscv/rv64/soft-fp/sfp-machine.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/rv64/soft-fp/sfp-machine.h	2014-12-09 16:55:03.168727857 -0800 | 
|  | @@ -0,0 +1,74 @@ | 
|  | +#include <fenv.h> | 
|  | +#include <fpu_control.h> | 
|  | + | 
|  | +#define _FP_W_TYPE_SIZE		64 | 
|  | +#define _FP_W_TYPE		unsigned long long | 
|  | +#define _FP_WS_TYPE		signed long long | 
|  | +#define _FP_I_TYPE		long long | 
|  | + | 
|  | +#define _FP_MUL_MEAT_S(R,X,Y)					\ | 
|  | +  _FP_MUL_MEAT_1_imm(_FP_WFRACBITS_S,R,X,Y) | 
|  | +#define _FP_MUL_MEAT_D(R,X,Y)					\ | 
|  | +  _FP_MUL_MEAT_1_wide(_FP_WFRACBITS_D,R,X,Y,umul_ppmm) | 
|  | +#define _FP_MUL_MEAT_Q(R,X,Y)					\ | 
|  | +  _FP_MUL_MEAT_2_wide_3mul(_FP_WFRACBITS_Q,R,X,Y,umul_ppmm) | 
|  | + | 
|  | +#define _FP_DIV_MEAT_S(R,X,Y)	_FP_DIV_MEAT_1_imm(S,R,X,Y,_FP_DIV_HELP_imm) | 
|  | +#define _FP_DIV_MEAT_D(R,X,Y)	_FP_DIV_MEAT_1_udiv_norm(D,R,X,Y) | 
|  | +#define _FP_DIV_MEAT_Q(R,X,Y)	_FP_DIV_MEAT_2_udiv(Q,R,X,Y) | 
|  | + | 
|  | +#define _FP_NANFRAC_S		((_FP_QNANBIT_S << 1) - 1) | 
|  | +#define _FP_NANFRAC_D		((_FP_QNANBIT_D << 1) - 1) | 
|  | +#define _FP_NANFRAC_Q		((_FP_QNANBIT_Q << 1) - 1), -1 | 
|  | +#define _FP_NANSIGN_S		0 | 
|  | +#define _FP_NANSIGN_D		0 | 
|  | +#define _FP_NANSIGN_Q		0 | 
|  | + | 
|  | +#define _FP_KEEPNANFRACP 1 | 
|  | +/* From my experiments it seems X is chosen unless one of the | 
|  | +   NaNs is sNaN,  in which case the result is NANSIGN/NANFRAC.  */ | 
|  | +#define _FP_CHOOSENAN(fs, wc, R, X, Y, OP)			\ | 
|  | +  do {								\ | 
|  | +    if ((_FP_FRAC_HIGH_RAW_##fs(X) |				\ | 
|  | +	 _FP_FRAC_HIGH_RAW_##fs(Y)) & _FP_QNANBIT_##fs)		\ | 
|  | +      {								\ | 
|  | +	R##_s = _FP_NANSIGN_##fs;				\ | 
|  | +        _FP_FRAC_SET_##wc(R,_FP_NANFRAC_##fs);			\ | 
|  | +      }								\ | 
|  | +    else							\ | 
|  | +      {								\ | 
|  | +	R##_s = X##_s;						\ | 
|  | +        _FP_FRAC_COPY_##wc(R,X);				\ | 
|  | +      }								\ | 
|  | +    R##_c = FP_CLS_NAN;						\ | 
|  | +  } while (0) | 
|  | + | 
|  | +#define _FP_DECL_EX		fpu_control_t _fcw | 
|  | + | 
|  | +#define FP_ROUNDMODE		(_fcw & 0x3) | 
|  | + | 
|  | +#define FP_RND_NEAREST		FE_TONEAREST | 
|  | +#define FP_RND_ZERO		FE_TOWARDZERO | 
|  | +#define FP_RND_PINF		FE_UPWARD | 
|  | +#define FP_RND_MINF		FE_DOWNWARD | 
|  | + | 
|  | +#define FP_EX_INVALID		FE_INVALID | 
|  | +#define FP_EX_OVERFLOW		FE_OVERFLOW | 
|  | +#define FP_EX_UNDERFLOW		FE_UNDERFLOW | 
|  | +#define FP_EX_DIVZERO		FE_DIVBYZERO | 
|  | +#define FP_EX_INEXACT		FE_INEXACT | 
|  | + | 
|  | +#ifdef __mips_hard_float | 
|  | +#define FP_INIT_ROUNDMODE			\ | 
|  | +do {						\ | 
|  | +  _FPU_GETCW (_fcw);				\ | 
|  | +} while (0) | 
|  | + | 
|  | +#define FP_HANDLE_EXCEPTIONS			\ | 
|  | +do {						\ | 
|  | +  if (__builtin_expect (_fex, 0))		\ | 
|  | +    _FPU_SETCW (_fcw | _fex | (_fex << 10));	\ | 
|  | +} while (0) | 
|  | +#else | 
|  | +#define FP_INIT_ROUNDMODE	_fcw = FP_RND_NEAREST | 
|  | +#endif | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/rv64/Versions glibc-2.19-riscv/sysdeps/riscv/rv64/Versions | 
|  | --- glibc-2.19/sysdeps/riscv/rv64/Versions	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/rv64/Versions	2014-12-09 16:55:03.168727857 -0800 | 
|  | @@ -0,0 +1,7 @@ | 
|  | +libm { | 
|  | +  GLIBC_2.1 { | 
|  | +    # A generic bug got this omitted from other configurations' version | 
|  | +    # sets, but we always had it. | 
|  | +    exp2l; | 
|  | +  } | 
|  | +} | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/setjmp.S glibc-2.19-riscv/sysdeps/riscv/setjmp.S | 
|  | --- glibc-2.19/sysdeps/riscv/setjmp.S	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/setjmp.S	2014-12-09 16:55:03.172727878 -0800 | 
|  | @@ -0,0 +1,83 @@ | 
|  | +/* Copyright (C) 1996, 1997, 2000, 2002, 2003, 2004 | 
|  | +	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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <sysdep.h> | 
|  | +#include <sys/asm.h> | 
|  | + | 
|  | +ENTRY (_setjmp) | 
|  | +  li	a1, 0 | 
|  | +  j	__sigsetjmp | 
|  | +END (_setjmp) | 
|  | +ENTRY (setjmp) | 
|  | +  li	a1, 1 | 
|  | +  /* Fallthrough */ | 
|  | +END (setjmp) | 
|  | +ENTRY (__sigsetjmp) | 
|  | +	REG_S ra,  0*SZREG(a0) | 
|  | +	REG_S s0,  1*SZREG(a0) | 
|  | +	REG_S s1,  2*SZREG(a0) | 
|  | +	REG_S s2,  3*SZREG(a0) | 
|  | +	REG_S s3,  4*SZREG(a0) | 
|  | +	REG_S s4,  5*SZREG(a0) | 
|  | +	REG_S s5,  6*SZREG(a0) | 
|  | +	REG_S s6,  7*SZREG(a0) | 
|  | +	REG_S s7,  8*SZREG(a0) | 
|  | +	REG_S s8,  9*SZREG(a0) | 
|  | +	REG_S s9, 10*SZREG(a0) | 
|  | +	REG_S s10,11*SZREG(a0) | 
|  | +	REG_S s11,12*SZREG(a0) | 
|  | +	REG_S sp, 13*SZREG(a0) | 
|  | +	REG_S tp, 14*SZREG(a0) | 
|  | + | 
|  | +#ifdef __riscv_hard_float | 
|  | +	mffsr a3 | 
|  | + | 
|  | +	fsd  fs0, 16*SZREG+ 0*8(a0) | 
|  | +	fsd  fs1, 16*SZREG+ 1*8(a0) | 
|  | +	fsd  fs2, 16*SZREG+ 2*8(a0) | 
|  | +	fsd  fs3, 16*SZREG+ 3*8(a0) | 
|  | +	fsd  fs4, 16*SZREG+ 4*8(a0) | 
|  | +	fsd  fs5, 16*SZREG+ 5*8(a0) | 
|  | +	fsd  fs6, 16*SZREG+ 6*8(a0) | 
|  | +	fsd  fs7, 16*SZREG+ 7*8(a0) | 
|  | +	fsd  fs8, 16*SZREG+ 8*8(a0) | 
|  | +	fsd  fs9, 16*SZREG+ 9*8(a0) | 
|  | +	fsd  fs10,16*SZREG+10*8(a0) | 
|  | +	fsd  fs11,16*SZREG+11*8(a0) | 
|  | +	fsd  fs12,16*SZREG+12*8(a0) | 
|  | +	fsd  fs13,16*SZREG+13*8(a0) | 
|  | +	fsd  fs14,16*SZREG+14*8(a0) | 
|  | +	fsd  fs15,16*SZREG+15*8(a0) | 
|  | + | 
|  | +	REG_S a3, 15*SZREG(a0) | 
|  | +#endif | 
|  | + | 
|  | +#if defined NOT_IN_libc && defined IS_IN_rtld | 
|  | +  /* In ld.so we never save the signal mask.  */ | 
|  | +  li v0, 0 | 
|  | +  ret | 
|  | +#else | 
|  | +  /* Make a tail call to __sigjmp_save; it takes the same args.  */ | 
|  | +  j __sigjmp_save | 
|  | +#endif | 
|  | + | 
|  | + | 
|  | +END(__sigsetjmp) | 
|  | + | 
|  | +weak_alias(_setjmp, __GI__setjmp) | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/sgidefs.h glibc-2.19-riscv/sysdeps/riscv/sgidefs.h | 
|  | --- glibc-2.19/sysdeps/riscv/sgidefs.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/sgidefs.h	2014-12-09 16:55:03.172727878 -0800 | 
|  | @@ -0,0 +1,41 @@ | 
|  | +/* Copyright (C) 1996, 1997, 1998, 2003, 2004 Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by Ralf Baechle <ralf@gnu.org>. | 
|  | + | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef _SGIDEFS_H | 
|  | +#define _SGIDEFS_H	1 | 
|  | + | 
|  | +/* | 
|  | + * Subprogram calling convention | 
|  | + */ | 
|  | +#ifndef _ABIO32 | 
|  | +# define _ABIO32		1 | 
|  | +#endif | 
|  | +#define _RISCV_SIM_ABI32		_ABIO32 | 
|  | + | 
|  | +#ifndef _ABIN32 | 
|  | +# define _ABIN32		2 | 
|  | +#endif | 
|  | +#define _RISCV_SIM_NABI32	_ABIN32 | 
|  | + | 
|  | +#ifndef _ABI64 | 
|  | +# define _ABI64			3 | 
|  | +#endif | 
|  | +#define _RISCV_SIM_ABI64		_ABI64 | 
|  | + | 
|  | +#endif /* sgidefs.h */ | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/shlib-versions glibc-2.19-riscv/sysdeps/riscv/shlib-versions | 
|  | --- glibc-2.19/sysdeps/riscv/shlib-versions	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/shlib-versions	2014-12-09 16:55:03.172727878 -0800 | 
|  | @@ -0,0 +1,21 @@ | 
|  | +mips.*-.*-linux.*	libm=6			GLIBC_2.0 GLIBC_2.2 | 
|  | + | 
|  | +# Working mips versions were never released between 2.0 and 2.2. | 
|  | +mips.*-.*-linux.*	libc=6			GLIBC_2.0 GLIBC_2.2 | 
|  | + | 
|  | +mips.*-.*-linux.*	ld=ld.so.1		GLIBC_2.0 GLIBC_2.2 | 
|  | +mips.*-.*-linux.*	libdl=2			GLIBC_2.0 GLIBC_2.2 | 
|  | + | 
|  | +mips.*-.*-linux.*	libresolv=2		GLIBC_2.0 GLIBC_2.2 | 
|  | + | 
|  | +mips.*-.*-linux.*	libnss_files=2		GLIBC_2.0 GLIBC_2.2 | 
|  | +mips.*-.*-linux.*	libnss_dns=2		GLIBC_2.0 GLIBC_2.2 | 
|  | +mips.*-.*-linux.*	libnss_compat=2		GLIBC_2.0 GLIBC_2.2 | 
|  | +mips.*-.*-linux.*	libnss_nis=2		GLIBC_2.0 GLIBC_2.2 | 
|  | +mips.*-.*-linux.*	libnss_nisplus=2	GLIBC_2.0 GLIBC_2.2 | 
|  | +mips.*-.*-linux.*	libnss_ldap=2		GLIBC_2.0 GLIBC_2.2 | 
|  | +mips.*-.*-linux.*	libnss_hesiod=2		GLIBC_2.0 GLIBC_2.2 | 
|  | + | 
|  | +mips.*-.*-linux.*	libnsl=1		GLIBC_2.0 GLIBC_2.2 | 
|  | + | 
|  | +mips.*-.*-linux.*	librt=1			GLIBC_2.0 GLIBC_2.2 | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/soft-fp/sfp-machine.h glibc-2.19-riscv/sysdeps/riscv/soft-fp/sfp-machine.h | 
|  | --- glibc-2.19/sysdeps/riscv/soft-fp/sfp-machine.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/soft-fp/sfp-machine.h	2014-12-09 16:55:03.172727878 -0800 | 
|  | @@ -0,0 +1,47 @@ | 
|  | +#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_DIV_MEAT_S(R,X,Y)	_FP_DIV_MEAT_1_udiv_norm(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 | 
|  | +/* From my experiments it seems X is chosen unless one of the | 
|  | +   NaNs is sNaN,  in which case the result is NANSIGN/NANFRAC.  */ | 
|  | +#define _FP_CHOOSENAN(fs, wc, R, X, Y, OP)			\ | 
|  | +  do {								\ | 
|  | +    if ((_FP_FRAC_HIGH_RAW_##fs(X) |				\ | 
|  | +	 _FP_FRAC_HIGH_RAW_##fs(Y)) & _FP_QNANBIT_##fs)		\ | 
|  | +      {								\ | 
|  | +	R##_s = _FP_NANSIGN_##fs;				\ | 
|  | +        _FP_FRAC_SET_##wc(R,_FP_NANFRAC_##fs);			\ | 
|  | +      }								\ | 
|  | +    else							\ | 
|  | +      {								\ | 
|  | +	R##_s = X##_s;						\ | 
|  | +        _FP_FRAC_COPY_##wc(R,X);				\ | 
|  | +      }								\ | 
|  | +    R##_c = FP_CLS_NAN;						\ | 
|  | +  } while (0) | 
|  | + | 
|  | +#define FP_EX_INVALID           (1 << 4) | 
|  | +#define FP_EX_DIVZERO           (1 << 3) | 
|  | +#define FP_EX_OVERFLOW          (1 << 2) | 
|  | +#define FP_EX_UNDERFLOW         (1 << 1) | 
|  | +#define FP_EX_INEXACT           (1 << 0) | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/stackinfo.h glibc-2.19-riscv/sysdeps/riscv/stackinfo.h | 
|  | --- glibc-2.19/sysdeps/riscv/stackinfo.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/stackinfo.h	2014-12-09 16:55:03.172727878 -0800 | 
|  | @@ -0,0 +1,34 @@ | 
|  | +/* Copyright (C) 2000, 2010 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +/* This file contains a bit of information about the stack allocation | 
|  | +   of the processor.  */ | 
|  | + | 
|  | +#ifndef _STACKINFO_H | 
|  | +#define _STACKINFO_H	1 | 
|  | + | 
|  | +#include <elf.h> | 
|  | + | 
|  | +/* On MIPS the stack grows down.  */ | 
|  | +#define _STACK_GROWS_DOWN	1 | 
|  | + | 
|  | +/* Default to an executable stack.  PF_X can be overridden if PT_GNU_STACK is | 
|  | + * present, but it is presumed absent.  */ | 
|  | +#define DEFAULT_STACK_PERMS (PF_R|PF_W|PF_X) | 
|  | + | 
|  | +#endif	/* stackinfo.h */ | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/sys/asm.h glibc-2.19-riscv/sysdeps/riscv/sys/asm.h | 
|  | --- glibc-2.19/sysdeps/riscv/sys/asm.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/sys/asm.h	2014-12-09 16:55:03.172727878 -0800 | 
|  | @@ -0,0 +1,148 @@ | 
|  | +/* copyright (c) 1997, 1998, 2002, 2003, 2004, 2005 | 
|  | +   Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by Ralf Baechle <ralf@gnu.org>. | 
|  | + | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef _SYS_ASM_H | 
|  | +#define _SYS_ASM_H | 
|  | + | 
|  | +#ifndef CAT | 
|  | +# ifdef __STDC__ | 
|  | +#  define __CAT(str1,str2) str1##str2 | 
|  | +# else | 
|  | +#  define __CAT(str1,str2) str1/**/str2 | 
|  | +# endif | 
|  | +# define CAT(str1,str2) __CAT(str1,str2) | 
|  | +#endif | 
|  | + | 
|  | +/* | 
|  | + * Macros to handle different pointer/register sizes for 32/64-bit code | 
|  | + * | 
|  | + * 64 bit address space isn't used yet, so we may use the R3000 32 bit | 
|  | + * defines for now. | 
|  | + */ | 
|  | +#ifdef __riscv64 | 
|  | +# define PTR .dword | 
|  | +# define PTRSIZE 8 | 
|  | +# define PTRLOG 3 | 
|  | +#else | 
|  | +# define PTR .word | 
|  | +# define PTRSIZE 4 | 
|  | +# define PTRLOG 2 | 
|  | +#endif | 
|  | + | 
|  | +/* | 
|  | + * LEAF - declare leaf routine | 
|  | + */ | 
|  | +#define	LEAF(symbol)	\ | 
|  | +		.globl	symbol;                         \ | 
|  | +		.align	2;                              \ | 
|  | +		.type	symbol,@function;               \ | 
|  | +symbol: | 
|  | + | 
|  | +/* | 
|  | + * NESTED - declare nested routine entry point | 
|  | + */ | 
|  | +#define	NESTED(symbol, framesize, rpc) LEAF(symbol) | 
|  | + | 
|  | +/* | 
|  | + * END - mark end of function | 
|  | + */ | 
|  | +#ifndef END | 
|  | +# define END(function)                                   \ | 
|  | +		.size	function,.-function | 
|  | +#endif | 
|  | + | 
|  | +/* | 
|  | + * EXPORT - export definition of symbol | 
|  | + */ | 
|  | +#define	EXPORT(symbol)                                  \ | 
|  | +		.globl	symbol;                         \ | 
|  | +symbol: | 
|  | + | 
|  | +/* | 
|  | + * ABS - export absolute symbol | 
|  | + */ | 
|  | +#define	ABS(symbol,value)                               \ | 
|  | +		.globl	symbol;                         \ | 
|  | +symbol		=	value | 
|  | + | 
|  | +#define	PANIC(msg)                                      \ | 
|  | +		.set	push;				\ | 
|  | +		.set	reorder;                        \ | 
|  | +		la	a0,8f;                          \ | 
|  | +		jal	panic;                          \ | 
|  | +9:		b	9b;                             \ | 
|  | +		.set	pop;				\ | 
|  | +		TEXT(msg) | 
|  | + | 
|  | +/* | 
|  | + * Print formated string | 
|  | + */ | 
|  | +#define PRINT(string)                                   \ | 
|  | +		.set	push;				\ | 
|  | +		.set	reorder;                        \ | 
|  | +		la	a0,8f;                          \ | 
|  | +		jal	printk;                         \ | 
|  | +		.set	pop;				\ | 
|  | +		TEXT(string) | 
|  | + | 
|  | +#define	TEXT(msg)                                       \ | 
|  | +		.data;                                  \ | 
|  | +8:		.asciiz	msg;                            \ | 
|  | +		.previous; | 
|  | + | 
|  | +/* | 
|  | + * Build text tables | 
|  | + */ | 
|  | +#define TTABLE(string)                                  \ | 
|  | +		.text;                                  \ | 
|  | +		.word	1f;                             \ | 
|  | +		.previous;                              \ | 
|  | +		.data;                                  \ | 
|  | +1:		.asciz	string;                         \ | 
|  | +		.previous | 
|  | + | 
|  | +/* | 
|  | + * Stack alignment | 
|  | + */ | 
|  | +#define ALSZ	15 | 
|  | +#define ALMASK	~15 | 
|  | + | 
|  | +/* | 
|  | + * Size of a register | 
|  | + */ | 
|  | +#ifdef __riscv64 | 
|  | +# define SZREG	8 | 
|  | +#else | 
|  | +# define SZREG	4 | 
|  | +#endif | 
|  | + | 
|  | +/* | 
|  | + * Use the following macros in assemblercode to load/store registers, | 
|  | + * pointers etc. | 
|  | + */ | 
|  | +#if (SZREG == 4) | 
|  | +# define REG_S sw | 
|  | +# define REG_L lw | 
|  | +#else | 
|  | +# define REG_S sd | 
|  | +# define REG_L ld | 
|  | +#endif | 
|  | + | 
|  | +#endif /* sys/asm.h */ | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/sys/ucontext.h glibc-2.19-riscv/sysdeps/riscv/sys/ucontext.h | 
|  | --- glibc-2.19/sysdeps/riscv/sys/ucontext.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/sys/ucontext.h	2014-12-09 16:55:03.172727878 -0800 | 
|  | @@ -0,0 +1,144 @@ | 
|  | +/* Copyright (C) 1998, 1999, 2002, 2003, 2004 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +/* System V/mips ABI compliant context switching support.  */ | 
|  | + | 
|  | +#ifndef _SYS_UCONTEXT_H | 
|  | +#define _SYS_UCONTEXT_H	1 | 
|  | + | 
|  | +#include <features.h> | 
|  | +#include <signal.h> | 
|  | + | 
|  | +/* Type for general register.  */ | 
|  | +typedef unsigned long greg_t; | 
|  | + | 
|  | +/* Number of general registers.  */ | 
|  | +#define NGREG	36 | 
|  | + | 
|  | +/* Container for all general registers.  */ | 
|  | +typedef greg_t gregset_t[NGREG]; | 
|  | + | 
|  | +/* Number of each register is the `gregset_t' array.  */ | 
|  | +enum | 
|  | +{ | 
|  | +  CTX_R0 = 0, | 
|  | +#define CTX_R0	CTX_R0 | 
|  | +  CTX_AT = 1, | 
|  | +#define CTX_AT	CTX_AT | 
|  | +  CTX_V0 = 2, | 
|  | +#define CTX_V0	CTX_V0 | 
|  | +  CTX_V1 = 3, | 
|  | +#define CTX_V1	CTX_V1 | 
|  | +  CTX_A0 = 4, | 
|  | +#define CTX_A0	CTX_A0 | 
|  | +  CTX_A1 = 5, | 
|  | +#define CTX_A1	CTX_A1 | 
|  | +  CTX_A2 = 6, | 
|  | +#define CTX_A2	CTX_A2 | 
|  | +  CTX_A3 = 7, | 
|  | +#define CTX_A3	CTX_A3 | 
|  | +  CTX_T0 = 8, | 
|  | +#define CTX_T0	CTX_T0 | 
|  | +  CTX_T1 = 9, | 
|  | +#define CTX_T1	CTX_T1 | 
|  | +  CTX_T2 = 10, | 
|  | +#define CTX_T2	CTX_T2 | 
|  | +  CTX_T3 = 11, | 
|  | +#define CTX_T3	CTX_T3 | 
|  | +  CTX_T4 = 12, | 
|  | +#define CTX_T4	CTX_T4 | 
|  | +  CTX_T5 = 13, | 
|  | +#define CTX_T5	CTX_T5 | 
|  | +  CTX_T6 = 14, | 
|  | +#define CTX_T6	CTX_T6 | 
|  | +  CTX_T7 = 15, | 
|  | +#define CTX_T7	CTX_T7 | 
|  | +  CTX_S0 = 16, | 
|  | +#define CTX_S0	CTX_S0 | 
|  | +  CTX_S1 = 17, | 
|  | +#define CTX_S1	CTX_S1 | 
|  | +  CTX_S2 = 18, | 
|  | +#define CTX_S2	CTX_S2 | 
|  | +  CTX_S3 = 19, | 
|  | +#define CTX_S3	CTX_S3 | 
|  | +  CTX_S4 = 20, | 
|  | +#define CTX_S4	CTX_S4 | 
|  | +  CTX_S5 = 21, | 
|  | +#define CTX_S5	CTX_S5 | 
|  | +  CTX_S6 = 22, | 
|  | +#define CTX_S6	CTX_S6 | 
|  | +  CTX_S7 = 23, | 
|  | +#define CTX_S7	CTX_S7 | 
|  | +  CTX_T8 = 24, | 
|  | +#define CTX_T8	CTX_T8 | 
|  | +  CTX_T9 = 25, | 
|  | +#define CTX_T9	CTX_T9 | 
|  | +  CTX_K0 = 26, | 
|  | +#define CTX_K0	CTX_K0 | 
|  | +  CTX_K1 = 27, | 
|  | +#define CTX_K1	CTX_K1 | 
|  | +  CTX_GP = 28, | 
|  | +#define CTX_GP	CTX_GP | 
|  | +  CTX_SP = 29, | 
|  | +#define CTX_SP	CTX_SP | 
|  | +  CTX_S8 = 30, | 
|  | +#define CTX_S8	CTX_S8 | 
|  | +  CTX_RA = 31, | 
|  | +#define CTX_RA	CTX_RA | 
|  | +  CTX_MDLO = 32, | 
|  | +#define CTX_MDLO	CTX_MDLO | 
|  | +  CTX_MDHI = 33, | 
|  | +#define CTX_MDHI	CTX_MDHI | 
|  | +  CTX_CAUSE = 34, | 
|  | +#define CTX_CAUSE	CTX_CAUSE | 
|  | +  CTX_EPC = 35, | 
|  | +#define CTX_EPC	CTX_EPC | 
|  | +}; | 
|  | + | 
|  | +/* Structure to describe FPU registers.  */ | 
|  | +typedef struct fpregset | 
|  | +{ | 
|  | +  union | 
|  | +  { | 
|  | +    double fp_dregs[32]; | 
|  | +    /* float fp_fregs[32]; */ | 
|  | +    __uint64_t fp_regs[32]; | 
|  | +  } fp_r; | 
|  | +  unsigned int fp_csr; | 
|  | +  unsigned int fp_pad; | 
|  | +} fpregset_t; | 
|  | + | 
|  | +/* Context to describe whole processor state.  */ | 
|  | +typedef struct | 
|  | +{ | 
|  | +  gregset_t gpregs; | 
|  | +  fpregset_t fpregs; | 
|  | +} mcontext_t; | 
|  | + | 
|  | +/* Userlevel context.  */ | 
|  | +typedef struct ucontext | 
|  | +{ | 
|  | +  unsigned long int uc_flags; | 
|  | +  struct ucontext *uc_link; | 
|  | +  __sigset_t uc_sigmask; | 
|  | +  stack_t uc_stack; | 
|  | +  mcontext_t uc_mcontext; | 
|  | +  int uc_filler[48]; | 
|  | +} ucontext_t; | 
|  | + | 
|  | +#endif /* sys/ucontext.h */ | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/tcb-offsets.sym glibc-2.19-riscv/sysdeps/riscv/tcb-offsets.sym | 
|  | --- glibc-2.19/sysdeps/riscv/tcb-offsets.sym	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/tcb-offsets.sym	2014-12-09 16:55:03.172727878 -0800 | 
|  | @@ -0,0 +1,11 @@ | 
|  | +#include <sysdep.h> | 
|  | +#include <tls.h> | 
|  | + | 
|  | +-- | 
|  | + | 
|  | +-- Abuse tls.h macros to derive offsets relative to the thread register. | 
|  | +#define thread_offsetof(mem)	(long)(offsetof(struct pthread, mem) - TLS_TCB_OFFSET - TLS_PRE_TCB_SIZE) | 
|  | + | 
|  | +MULTIPLE_THREADS_OFFSET		thread_offsetof (header.multiple_threads) | 
|  | +PID_OFFSET			thread_offsetof (pid) | 
|  | +TID_OFFSET			thread_offsetof (tid) | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/tls-macros.h glibc-2.19-riscv/sysdeps/riscv/tls-macros.h | 
|  | --- glibc-2.19/sysdeps/riscv/tls-macros.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/tls-macros.h	2014-12-09 16:55:03.172727878 -0800 | 
|  | @@ -0,0 +1,51 @@ | 
|  | +/* Macros to support TLS testing in times of missing compiler support.  */ | 
|  | + | 
|  | +#include <sys/cdefs.h> | 
|  | +#include <sys/asm.h> | 
|  | + | 
|  | +#define __STRING2(X) __STRING(X) | 
|  | +#define LW __STRING2(REG_L) | 
|  | + | 
|  | +/* Load the GOT pointer, which may not be in $28 in a non-PIC | 
|  | +   (abicalls pic0) function.  */ | 
|  | +#ifndef __PIC__ | 
|  | +# define LOAD_GP "move %[tmp], gp\n\tla gp, __gnu_local_gp\n\t" | 
|  | +# define UNLOAD_GP "\n\tmove gp, %[tmp]" | 
|  | +#else | 
|  | +# define LOAD_GP | 
|  | +# define UNLOAD_GP | 
|  | +#endif | 
|  | + | 
|  | +# define TLS_GD(x)					\ | 
|  | +  ({ void *__result, *__tmp;				\ | 
|  | +     extern void *__tls_get_addr (void *);		\ | 
|  | +     asm ("addi %0, gp, %%tlsgd(" #x ")"	        \ | 
|  | +	  UNLOAD_GP					\ | 
|  | +	  : "=r" (__result), [tmp] "=&r" (__tmp));	\ | 
|  | +     (int *)__tls_get_addr (__result); }) | 
|  | +# define TLS_LD(x)					\ | 
|  | +  ({ void *__result, *__tmp;				\ | 
|  | +     extern void *__tls_get_addr (void *);		\ | 
|  | +     asm (LOAD_GP "addi %0, gp, %%tlsldm(" #x ")"	\ | 
|  | +	  UNLOAD_GP					\ | 
|  | +	  : "=r" (__result), [tmp] "=&r" (__tmp));	\ | 
|  | +     __result = __tls_get_addr (__result);		\ | 
|  | +     asm ("lui %1,%%dtprel_hi(" #x ")\n\t"		\ | 
|  | +	  "addi %1,%1,%%dtprel_lo(" #x ")\n\t"		\ | 
|  | +	  "add %0,%0,%1"				\ | 
|  | +	  : "+r" (__result), "=&r"(__tmp));		\ | 
|  | +     __result; }) | 
|  | +# define TLS_IE(x)					\ | 
|  | +  ({ void *__result, *__tmp, *__tmp2;			\ | 
|  | +     asm (LOAD_GP LW " %2,%%gottprel(" #x ")(gp)\n\t"	\ | 
|  | +	  "add %0,tp,%2"				\ | 
|  | +	  UNLOAD_GP					\ | 
|  | +	  : "=r" (__result), [tmp] "=&r" (__tmp), "=&r" (__tmp2)); \ | 
|  | +     __result; }) | 
|  | +# define TLS_LE(x)					\ | 
|  | +  ({ void *__result, *__tmp;				\ | 
|  | +     asm ("lui %1,%%tprel_hi(" #x ")\n\t"		\ | 
|  | +	  "addi %1,%1,%%tprel_lo(" #x ")\n\t"		\ | 
|  | +	  "add %0,tp,%1"				\ | 
|  | +	  : "=r" (__result), "=&r" (__tmp)		\ | 
|  | +     __result; }) | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/tst-audit.h glibc-2.19-riscv/sysdeps/riscv/tst-audit.h | 
|  | --- glibc-2.19/sysdeps/riscv/tst-audit.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/tst-audit.h	2014-12-09 16:55:03.172727878 -0800 | 
|  | @@ -0,0 +1,33 @@ | 
|  | +/* Definitions for testing PLT entry/exit auditing.  ARM version. | 
|  | + | 
|  | +   Copyright (C) 2005 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <sgidefs.h> | 
|  | + | 
|  | +#if _RISCV_SIM == _ABI32 | 
|  | +#define pltenter la_mips_n32_gnu_pltenter | 
|  | +#define pltexit la_mips_n32_gnu_pltexit | 
|  | +#else | 
|  | +#define pltenter la_mips_n64_gnu_pltenter | 
|  | +#define pltexit la_mips_n64_gnu_pltexit | 
|  | +#endif | 
|  | +#define La_regs La_mips_64_regs | 
|  | +#define La_retval La_mips_64_retval | 
|  | +#define int_retval lrv_v0 | 
|  | diff -ruN glibc-2.19/sysdeps/riscv/Versions glibc-2.19-riscv/sysdeps/riscv/Versions | 
|  | --- glibc-2.19/sysdeps/riscv/Versions	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/riscv/Versions	2014-12-09 16:55:03.152727766 -0800 | 
|  | @@ -0,0 +1,5 @@ | 
|  | +libc { | 
|  | +  GLIBC_2.0 { | 
|  | +    __memcpy_g; | 
|  | +  } | 
|  | +} | 
|  | diff -ruN glibc-2.19/sysdeps/unix/riscv/pipe.S glibc-2.19-riscv/sysdeps/unix/riscv/pipe.S | 
|  | --- glibc-2.19/sysdeps/unix/riscv/pipe.S	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/riscv/pipe.S	2014-12-09 16:55:03.172727878 -0800 | 
|  | @@ -0,0 +1,34 @@ | 
|  | +/* Copyright (C) 1992, 1995, 1997, 2000, 2002 Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by Brendan Kehoe (brendan@zen.org). | 
|  | + | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <sysdep.h> | 
|  | + | 
|  | +SYSCALL__ (pipe, 1) | 
|  | +	/* Plop in the two descriptors.  */ | 
|  | +/*	sw v0, 0(a0) | 
|  | +	sw v1, 4(a0) | 
|  | + | 
|  | +*/ | 
|  | +	/* Go out with a clean status.  */ | 
|  | +	move v0, zero | 
|  | +	ret | 
|  | +PSEUDO_END(__pipe) | 
|  | + | 
|  | +libc_hidden_def (__pipe) | 
|  | +weak_alias (__pipe, pipe) | 
|  | diff -ruN glibc-2.19/sysdeps/unix/riscv/rt-sysdep.c glibc-2.19-riscv/sysdeps/unix/riscv/rt-sysdep.c | 
|  | --- glibc-2.19/sysdeps/unix/riscv/rt-sysdep.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/riscv/rt-sysdep.c	2014-12-09 16:55:03.172727878 -0800 | 
|  | @@ -0,0 +1 @@ | 
|  | +#include <sysdep.c> | 
|  | diff -ruN glibc-2.19/sysdeps/unix/riscv/sysdep.c glibc-2.19-riscv/sysdeps/unix/riscv/sysdep.c | 
|  | --- glibc-2.19/sysdeps/unix/riscv/sysdep.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/riscv/sysdep.c	2014-12-09 16:55:03.172727878 -0800 | 
|  | @@ -0,0 +1,43 @@ | 
|  | +/* Copyright (C) 1992, 1993, 1994, 1997, 1998, 1999, 2000, 2002, 2003 | 
|  | +   Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by Brendan Kehoe (brendan@zen.org). | 
|  | + | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <sysdep.h> | 
|  | +#include <errno.h> | 
|  | + | 
|  | +long __syscall_error() | 
|  | +{ | 
|  | +  register long v0 asm("v0"); | 
|  | + | 
|  | +  /* Referencing errno may call a function, clobbering v0. */ | 
|  | +  long errno_val = v0; | 
|  | + | 
|  | +#if defined (EWOULDBLOCK_sys) && EWOULDBLOCK_sys != EAGAIN | 
|  | +	/* We translate the system's EWOULDBLOCK error into EAGAIN. | 
|  | +	   The GNU C library always defines EWOULDBLOCK==EAGAIN. | 
|  | +	   EWOULDBLOCK_sys is the original number.  */ | 
|  | + | 
|  | +  if (errno_val == EWOULDBLOCK_sys) | 
|  | +    errno_val = EAGAIN; | 
|  | +#endif | 
|  | + | 
|  | +  errno = errno_val; | 
|  | + | 
|  | +  return -1; | 
|  | +} | 
|  | diff -ruN glibc-2.19/sysdeps/unix/riscv/sysdep.h glibc-2.19-riscv/sysdeps/unix/riscv/sysdep.h | 
|  | --- glibc-2.19/sysdeps/unix/riscv/sysdep.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/riscv/sysdep.h	2014-12-09 16:55:03.172727878 -0800 | 
|  | @@ -0,0 +1,72 @@ | 
|  | +/* Copyright (C) 1992, 1995, 1997, 1999, 2000, 2002, 2003, 2004 | 
|  | +   Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by Brendan Kehoe (brendan@zen.org). | 
|  | + | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <sysdeps/unix/sysdep.h> | 
|  | + | 
|  | +#ifdef __ASSEMBLER__ | 
|  | + | 
|  | +#include <sys/asm.h> | 
|  | + | 
|  | +#define ENTRY(name) LEAF(name) | 
|  | + | 
|  | +#undef END | 
|  | +#define	END(function)                                   \ | 
|  | +		.size	function,.-function | 
|  | + | 
|  | +#define ret	ret | 
|  | + | 
|  | +#undef PSEUDO_END | 
|  | +#define PSEUDO_END(sym) .size sym,.-sym | 
|  | + | 
|  | +#define PSEUDO_NOERRNO(name, syscall_name, args)	\ | 
|  | +  .align 2;						\ | 
|  | +  ENTRY(name)						\ | 
|  | +  li v0, SYS_ify(syscall_name);				\ | 
|  | +  syscall | 
|  | + | 
|  | +#undef PSEUDO_END_NOERRNO | 
|  | +#define PSEUDO_END_NOERRNO(sym) .size sym,.-sym | 
|  | + | 
|  | +#define ret_NOERRNO ret | 
|  | + | 
|  | +#define PSEUDO_ERRVAL(name, syscall_name, args) \ | 
|  | +  PSEUDO_NOERRNO(name, syscall_name, args) | 
|  | + | 
|  | +#undef PSEUDO_END_ERRVAL | 
|  | +#define PSEUDO_END_ERRVAL(sym) PSEUDO_END_NOERRNO(sym) | 
|  | + | 
|  | +#define ret_ERRVAL ret | 
|  | + | 
|  | +#define r0	v0 | 
|  | +#define r1	v1 | 
|  | +#define MOVE(x,y)	move y , x | 
|  | + | 
|  | +#define L(label) .L ## label | 
|  | + | 
|  | +#define PSEUDO(name, syscall_name, args) \ | 
|  | +  .align 2;							\ | 
|  | +  99: j __syscall_error;					\ | 
|  | +  ENTRY(name)							\ | 
|  | +  li v0, SYS_ify(syscall_name);					\ | 
|  | +  syscall;							\ | 
|  | +  bne a3, zero, 99b;						\ | 
|  | +L(syse1): | 
|  | + | 
|  | +#endif | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/bits/endian.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/bits/endian.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/bits/endian.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/bits/endian.h	2014-12-09 16:55:03.172727878 -0800 | 
|  | @@ -0,0 +1,16 @@ | 
|  | +/* The MIPS architecture has selectable endianness. | 
|  | +   Linux/MIPS exists in two both little and big endian flavours and we | 
|  | +   want to be able to share the installed headerfiles between both, | 
|  | +   so we define __BYTE_ORDER based on GCC's predefines.  */ | 
|  | + | 
|  | +#ifndef _ENDIAN_H | 
|  | +# error "Never use <bits/endian.h> directly; include <endian.h> instead." | 
|  | +#endif | 
|  | + | 
|  | +#ifdef __RISCVEB__ | 
|  | +# define __BYTE_ORDER __BIG_ENDIAN | 
|  | +#else | 
|  | +# ifdef __RISCVEL__ | 
|  | +#  define __BYTE_ORDER __LITTLE_ENDIAN | 
|  | +# endif | 
|  | +#endif | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/bits/errno.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/bits/errno.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/bits/errno.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/bits/errno.h	2014-12-09 16:55:03.172727878 -0800 | 
|  | @@ -0,0 +1,63 @@ | 
|  | +/* Error constants.  MIPS/Linux specific version. | 
|  | +   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2006 | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifdef _ERRNO_H | 
|  | + | 
|  | +# undef EDOM | 
|  | +# undef EILSEQ | 
|  | +# undef ERANGE | 
|  | +# include <linux/errno.h> | 
|  | + | 
|  | +/* Linux has no ENOTSUP error code.  */ | 
|  | +# define ENOTSUP EOPNOTSUPP | 
|  | + | 
|  | +# ifndef ECANCELED | 
|  | +#  define ECANCELED	158 | 
|  | +# endif | 
|  | + | 
|  | +/* Support for error codes to support robust mutexes was added later, too.  */ | 
|  | +# ifndef EOWNERDEAD | 
|  | +#  define EOWNERDEAD		165 | 
|  | +#  define ENOTRECOVERABLE	166 | 
|  | +# endif | 
|  | + | 
|  | +# ifndef ERFKILL | 
|  | +#  define ERFKILL		167 | 
|  | +# endif | 
|  | + | 
|  | +# ifndef __ASSEMBLER__ | 
|  | +/* Function to get address of global `errno' variable.  */ | 
|  | +extern int *__errno_location (void) __THROW __attribute__ ((__const__)); | 
|  | + | 
|  | +#  if !defined _LIBC || defined _LIBC_REENTRANT | 
|  | +/* When using threads, errno is a per-thread value.  */ | 
|  | +#   define errno (*__errno_location ()) | 
|  | +#  endif | 
|  | +# endif /* !__ASSEMBLER__ */ | 
|  | +#endif /* _ERRNO_H */ | 
|  | + | 
|  | +#if !defined _ERRNO_H && defined __need_Emath | 
|  | +/* This is ugly but the kernel header is not clean enough.  We must | 
|  | +   define only the values EDOM, EILSEQ and ERANGE in case __need_Emath is | 
|  | +   defined.  */ | 
|  | +# define EDOM	33	/* Math argument out of domain of function.  */ | 
|  | +# define EILSEQ	88	/* Illegal byte sequence.  */ | 
|  | +# define ERANGE	34	/* Math result not representable.  */ | 
|  | +#endif /* !_ERRNO_H && __need_Emath */ | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/bits/fcntl.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/bits/fcntl.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/bits/fcntl.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/bits/fcntl.h	2014-12-09 16:55:03.172727878 -0800 | 
|  | @@ -0,0 +1,278 @@ | 
|  | +/* O_*, F_*, FD_* bit values for Linux. | 
|  | +   Copyright (C) 1995, 1996, 1997, 1998, 2000, 2002, 2003, 2004, 2006, | 
|  | +   2007, 2009, 2010 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef	_FCNTL_H | 
|  | +# error "Never use <bits/fcntl.h> directly; include <fcntl.h> instead." | 
|  | +#endif | 
|  | + | 
|  | +#include <sgidefs.h> | 
|  | +#include <sys/types.h> | 
|  | +#ifdef __USE_GNU | 
|  | +# include <bits/uio.h> | 
|  | +#endif | 
|  | + | 
|  | + | 
|  | +/* open/fcntl - O_SYNC is only implemented on blocks devices and on files | 
|  | +   located on an ext2 file system */ | 
|  | +#define O_ACCMODE	00000003 | 
|  | +#define O_RDONLY	00000000 | 
|  | +#define O_WRONLY	00000001 | 
|  | +#define O_RDWR		00000002 | 
|  | +#define O_CREAT		00000100	/* not fcntl */ | 
|  | +#define O_EXCL		00000200	/* not fcntl */ | 
|  | +#define O_NOCTTY	00000400	/* not fcntl */ | 
|  | +#define O_TRUNC		00001000	/* not fcntl */ | 
|  | +#define O_APPEND	00002000 | 
|  | +#define O_NONBLOCK	00004000 | 
|  | +#define O_DSYNC		00010000	/* used to be O_SYNC, see below */ | 
|  | +#define O_DIRECT	00040000	/* direct disk access hint */ | 
|  | +#define O_LARGEFILE	00100000 | 
|  | +#define O_DIRECTORY	00200000	/* must be a directory */ | 
|  | +#define O_NOFOLLOW	00400000	/* don't follow links */ | 
|  | +#define O_NOATIME	01000000 | 
|  | +#define O_CLOEXEC	02000000	/* set close_on_exec */ | 
|  | +#define __O_SYNC	04000000 | 
|  | +#define O_SYNC		(__O_SYNC|O_DSYNC) | 
|  | +#define O_PATH		010000000 | 
|  | +#define O_NDELAY	O_NONBLOCK | 
|  | + | 
|  | +/* Values for the second argument to `fcntl'.  */ | 
|  | +#define F_DUPFD		0	/* dup */ | 
|  | +#define F_GETFD		1	/* get close_on_exec */ | 
|  | +#define F_SETFD		2	/* set/clear close_on_exec */ | 
|  | +#define F_GETFL		3	/* get file->f_flags */ | 
|  | +#define F_SETFL		4	/* set file->f_flags */ | 
|  | + | 
|  | +#define F_GETLK64	33	/* Get record locking info.  */ | 
|  | +#define F_SETLK64	34	/* Set record locking info (non-blocking).  */ | 
|  | +#define F_SETLKW64	35	/* Set record locking info (blocking).	*/ | 
|  | + | 
|  | +#if _RISCV_SIM == _ABI32 | 
|  | +#define F_GETLK		F_GETLK64 | 
|  | +#define F_SETLK		F_SETLK64 | 
|  | +#define F_SETLKW	F_SETLKW64 | 
|  | +#else | 
|  | +#define F_GETLK		5 | 
|  | +#define F_SETLK		6 | 
|  | +#define F_SETLKW	7 | 
|  | +#endif | 
|  | + | 
|  | +#define F_SETOWN	8	/* for sockets. */ | 
|  | +#define F_GETOWN	9	/* for sockets. */ | 
|  | + | 
|  | +#define F_SETSIG	10	/* for sockets. */ | 
|  | +#define F_GETSIG	11	/* for sockets. */ | 
|  | +#define F_SETOWN_EX	15 | 
|  | +#define F_GETOWN_EX	16 | 
|  | + | 
|  | +#ifdef __USE_GNU | 
|  | +# define F_SETLEASE	1024	/* Set a lease.	 */ | 
|  | +# define F_GETLEASE	1025	/* Enquire what lease is active.  */ | 
|  | +# define F_NOTIFY	1026	/* Request notfications on a directory.	 */ | 
|  | +# define F_SETPIPE_SZ	1031	/* Set pipe page size array.  */ | 
|  | +# define F_GETPIPE_SZ	1032	/* Set pipe page size array.  */ | 
|  | +#endif | 
|  | +#ifdef __USE_XOPEN2K8 | 
|  | +# define F_DUPFD_CLOEXEC 1030	/* Duplicate file descriptor with | 
|  | +				   close-on-exit set.  */ | 
|  | +#endif | 
|  | + | 
|  | +/* For F_[GET|SET]FD.  */ | 
|  | +#define FD_CLOEXEC	1	/* actually anything with low bit set goes */ | 
|  | + | 
|  | +/* For posix fcntl() and `l_type' field of a `struct flock' for lockf().  */ | 
|  | +#define F_RDLCK		0	/* Read lock.  */ | 
|  | +#define F_WRLCK		1	/* Write lock.	*/ | 
|  | +#define F_UNLCK		2	/* Remove lock.	 */ | 
|  | + | 
|  | +/* For old implementation of bsd flock().  */ | 
|  | +#define F_EXLCK		4	/* or 3 */ | 
|  | +#define F_SHLCK		8	/* or 4 */ | 
|  | + | 
|  | +#ifdef __USE_BSD | 
|  | +/* Operations for bsd flock(), also used by the kernel implementation.	*/ | 
|  | +# define LOCK_SH	1	/* shared lock */ | 
|  | +# define LOCK_EX	2	/* exclusive lock */ | 
|  | +# define LOCK_NB	4	/* or'd with one of the above to prevent | 
|  | +				   blocking */ | 
|  | +# define LOCK_UN	8	/* remove lock */ | 
|  | +#endif | 
|  | + | 
|  | +#ifdef __USE_GNU | 
|  | +# define LOCK_MAND	32	/* This is a mandatory flock:	*/ | 
|  | +# define LOCK_READ	64	/* ... which allows concurrent read operations.	 */ | 
|  | +# define LOCK_WRITE	128	/* ... which allows concurrent write operations.  */ | 
|  | +# define LOCK_RW	192	/* ... Which allows concurrent read & write operations.	 */ | 
|  | +#endif | 
|  | + | 
|  | +#ifdef __USE_GNU | 
|  | +/* Types of directory notifications that may be requested with F_NOTIFY.  */ | 
|  | +# define DN_ACCESS	0x00000001	/* File accessed.  */ | 
|  | +# define DN_MODIFY	0x00000002	/* File modified.  */ | 
|  | +# define DN_CREATE	0x00000004	/* File created.  */ | 
|  | +# define DN_DELETE	0x00000008	/* File removed.  */ | 
|  | +# define DN_RENAME	0x00000010	/* File renamed.  */ | 
|  | +# define DN_ATTRIB	0x00000020	/* File changed attibutes.  */ | 
|  | +# define DN_MULTISHOT	0x80000000	/* Don't remove notifier.  */ | 
|  | +#endif | 
|  | + | 
|  | +struct flock | 
|  | +  { | 
|  | +    short int l_type;	/* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK.	*/ | 
|  | +    short int l_whence;	/* Where `l_start' is relative to (like `lseek').  */ | 
|  | +#ifndef __USE_FILE_OFFSET64 | 
|  | +    __off_t l_start;	/* Offset where the lock begins.  */ | 
|  | +    __off_t l_len;	/* Size of the locked area; zero means until EOF.  */ | 
|  | +#if _RISCV_SIM != _ABI64 | 
|  | +    /* The 64-bit flock structure, used by the n64 ABI, and for 64-bit | 
|  | +       fcntls in o32 and n32, never has this field.  */ | 
|  | +    long int l_sysid; | 
|  | +#endif | 
|  | +#else | 
|  | +    __off64_t l_start;	/* Offset where the lock begins.  */ | 
|  | +    __off64_t l_len;	/* Size of the locked area; zero means until EOF.  */ | 
|  | +#endif | 
|  | +    __pid_t l_pid;	/* Process holding the lock.  */ | 
|  | +#if ! defined __USE_FILE_OFFSET64 && _RISCV_SIM != _ABI64 | 
|  | +    /* The 64-bit flock structure, used by the n64 ABI, and for 64-bit | 
|  | +       flock in o32 and n32, never has this field.  */ | 
|  | +    long int pad[4]; | 
|  | +#endif | 
|  | +  }; | 
|  | +typedef struct flock flock_t; | 
|  | + | 
|  | +#ifdef __USE_LARGEFILE64 | 
|  | +struct flock64 | 
|  | +  { | 
|  | +    short int l_type;	/* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK.	*/ | 
|  | +    short int l_whence;	/* Where `l_start' is relative to (like `lseek').  */ | 
|  | +    __off64_t l_start;	/* Offset where the lock begins.  */ | 
|  | +    __off64_t l_len;	/* Size of the locked area; zero means until EOF.  */ | 
|  | +    __pid_t l_pid;	/* Process holding the lock.  */ | 
|  | +  }; | 
|  | +#endif | 
|  | + | 
|  | +#ifdef __USE_GNU | 
|  | +/* Owner types.  */ | 
|  | +enum __pid_type | 
|  | +  { | 
|  | +    F_OWNER_TID = 0,		/* Kernel thread.  */ | 
|  | +    F_OWNER_PID,		/* Process.  */ | 
|  | +    F_OWNER_PGRP,		/* Process group.  */ | 
|  | +    F_OWNER_GID = F_OWNER_PGRP	/* Alternative, obsolete name.  */ | 
|  | +  }; | 
|  | + | 
|  | +/* Structure to use with F_GETOWN_EX and F_SETOWN_EX.  */ | 
|  | +struct f_owner_ex | 
|  | +  { | 
|  | +    enum __pid_type type;	/* Owner type of ID.  */ | 
|  | +    __pid_t pid;		/* ID of owner.  */ | 
|  | +  }; | 
|  | +#endif | 
|  | + | 
|  | +/* Define some more compatibility macros to be backward compatible with | 
|  | +   BSD systems which did not managed to hide these kernel macros.  */ | 
|  | +#ifdef	__USE_BSD | 
|  | +# define FAPPEND	O_APPEND | 
|  | +# define FFSYNC		O_FSYNC | 
|  | +# define FASYNC		O_ASYNC | 
|  | +# define FNONBLOCK	O_NONBLOCK | 
|  | +# define FNDELAY	O_NDELAY | 
|  | +#endif /* Use BSD.  */ | 
|  | + | 
|  | +/* Advise to `posix_fadvise'.  */ | 
|  | +#ifdef __USE_XOPEN2K | 
|  | +# define POSIX_FADV_NORMAL	0 /* No further special treatment.  */ | 
|  | +# define POSIX_FADV_RANDOM	1 /* Expect random page references.  */ | 
|  | +# define POSIX_FADV_SEQUENTIAL	2 /* Expect sequential page references.	 */ | 
|  | +# define POSIX_FADV_WILLNEED	3 /* Will need these pages.  */ | 
|  | +# define POSIX_FADV_DONTNEED	4 /* Don't need these pages.  */ | 
|  | +# define POSIX_FADV_NOREUSE	5 /* Data will be accessed once.  */ | 
|  | +#endif | 
|  | + | 
|  | + | 
|  | +#ifdef __USE_GNU | 
|  | +/* Flags for SYNC_FILE_RANGE.  */ | 
|  | +# define SYNC_FILE_RANGE_WAIT_BEFORE	1 /* Wait upon writeout of all pages | 
|  | +					     in the range before performing the | 
|  | +					     write.  */ | 
|  | +# define SYNC_FILE_RANGE_WRITE		2 /* Initiate writeout of all those | 
|  | +					     dirty pages in the range which are | 
|  | +					     not presently under writeback.  */ | 
|  | +# define SYNC_FILE_RANGE_WAIT_AFTER	4 /* Wait upon writeout of all pages in | 
|  | +					     the range after performing the | 
|  | +					     write.  */ | 
|  | + | 
|  | +/* Flags for SPLICE and VMSPLICE.  */ | 
|  | +# define SPLICE_F_MOVE		1	/* Move pages instead of copying.  */ | 
|  | +# define SPLICE_F_NONBLOCK	2	/* Don't block on the pipe splicing | 
|  | +					   (but we may still block on the fd | 
|  | +					   we splice from/to).  */ | 
|  | +# define SPLICE_F_MORE		4	/* Expect more data.  */ | 
|  | +# define SPLICE_F_GIFT		8	/* Pages passed in are a gift.  */ | 
|  | +#endif | 
|  | + | 
|  | +__BEGIN_DECLS | 
|  | + | 
|  | +#ifdef __USE_GNU | 
|  | + | 
|  | +/* Provide kernel hint to read ahead.  */ | 
|  | +extern ssize_t readahead (int __fd, __off64_t __offset, size_t __count) | 
|  | +    __THROW; | 
|  | + | 
|  | + | 
|  | +/* Selective file content synch'ing.  */ | 
|  | +extern int sync_file_range (int __fd, __off64_t __offset, __off64_t __count, | 
|  | +			    unsigned int __flags); | 
|  | + | 
|  | + | 
|  | +/* Splice address range into a pipe.  */ | 
|  | +extern ssize_t vmsplice (int __fdout, const struct iovec *__iov, | 
|  | +			 size_t __count, unsigned int __flags); | 
|  | + | 
|  | +/* Splice two files together.  */ | 
|  | +extern ssize_t splice (int __fdin, __off64_t *__offin, int __fdout, | 
|  | +		       __off64_t *__offout, size_t __len, | 
|  | +		       unsigned int __flags); | 
|  | + | 
|  | +/* In-kernel implementation of tee for pipe buffers.  */ | 
|  | +extern ssize_t tee (int __fdin, int __fdout, size_t __len, | 
|  | +		    unsigned int __flags); | 
|  | + | 
|  | +/* Reserve storage for the data of the file associated with FD.  */ | 
|  | +# ifndef __USE_FILE_OFFSET64 | 
|  | +extern int fallocate (int __fd, int __mode, __off_t __offset, __off_t __len); | 
|  | +# else | 
|  | +#  ifdef __REDIRECT | 
|  | +extern int __REDIRECT (fallocate, (int __fd, int __mode, __off64_t __offset, | 
|  | +				   __off64_t __len), | 
|  | +		       fallocate64); | 
|  | +#  else | 
|  | +#   define fallocate fallocate64 | 
|  | +#  endif | 
|  | +# endif | 
|  | +# ifdef __USE_LARGEFILE64 | 
|  | +extern int fallocate64 (int __fd, int __mode, __off64_t __offset, | 
|  | +			__off64_t __len); | 
|  | +# endif | 
|  | + | 
|  | +#endif | 
|  | + | 
|  | +__END_DECLS | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/bits/ioctl-types.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/bits/ioctl-types.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/bits/ioctl-types.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/bits/ioctl-types.h	2014-12-09 16:55:03.172727878 -0800 | 
|  | @@ -0,0 +1,76 @@ | 
|  | +/* Structure types for pre-termios terminal ioctls.  Linux/MIPS version. | 
|  | +   Copyright (C) 1997, 1999, 2000, 2001 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef _SYS_IOCTL_H | 
|  | +# error "Never use <bits/ioctl-types.h> directly; include <sys/ioctl.h> instead." | 
|  | +#endif | 
|  | + | 
|  | +/* Get definition of constants for use with `ioctl'.  */ | 
|  | +#include <asm/ioctls.h> | 
|  | + | 
|  | +struct winsize | 
|  | +  { | 
|  | +    unsigned short int ws_row; | 
|  | +    unsigned short int ws_col; | 
|  | +    unsigned short int ws_xpixel; | 
|  | +    unsigned short int ws_ypixel; | 
|  | +  }; | 
|  | + | 
|  | +#define NCC	8 | 
|  | +struct termio | 
|  | +  { | 
|  | +    unsigned short int c_iflag;		/* input mode flags */ | 
|  | +    unsigned short int c_oflag;		/* output mode flags */ | 
|  | +    unsigned short int c_cflag;		/* control mode flags */ | 
|  | +    unsigned short int c_lflag;		/* local mode flags */ | 
|  | +    char c_line;			/* line discipline */ | 
|  | +    /* Yes, this is really NCCS.  */ | 
|  | +    unsigned char c_cc[32 /* NCCS */]; /* control characters */ | 
|  | +  }; | 
|  | + | 
|  | +/* modem lines */ | 
|  | +#define TIOCM_LE	0x001		/* line enable */ | 
|  | +#define TIOCM_DTR	0x002		/* data terminal ready */ | 
|  | +#define TIOCM_RTS	0x004		/* request to send */ | 
|  | +#define TIOCM_ST	0x010		/* secondary transmit */ | 
|  | +#define TIOCM_SR	0x020		/* secondary receive */ | 
|  | +#define TIOCM_CTS	0x040		/* clear to send */ | 
|  | +#define TIOCM_CAR	0x100		/* carrier detect */ | 
|  | +#define TIOCM_CD	TIOCM_CAR | 
|  | +#define TIOCM_RNG	0x200		/* ring */ | 
|  | +#define TIOCM_RI	TIOCM_RNG | 
|  | +#define TIOCM_DSR	0x400		/* data set ready */ | 
|  | + | 
|  | +/* line disciplines */ | 
|  | +#define N_TTY		0 | 
|  | +#define N_SLIP		1 | 
|  | +#define N_MOUSE		2 | 
|  | +#define N_PPP		3 | 
|  | +#define N_STRIP		4 | 
|  | +#define N_AX25		5 | 
|  | +#define N_X25		6	/* X.25 async  */ | 
|  | +#define N_6PACK		7 | 
|  | +#define N_MASC		8	/* Mobitex module  */ | 
|  | +#define N_R3964		9	/* Simatic R3964 module  */ | 
|  | +#define N_PROFIBUS_FDL	10	/* Profibus  */ | 
|  | +#define N_IRDA		11	/* Linux IR  */ | 
|  | +#define N_SMSBLOCK	12	/* SMS block mode  */ | 
|  | +#define N_HDLC		13	/* synchronous HDLC  */ | 
|  | +#define N_SYNC_PPP	14	/* synchronous PPP  */ | 
|  | +#define	N_HCI		15	/* Bluetooth HCI UART  */ | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/bits/ipc.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/bits/ipc.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/bits/ipc.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/bits/ipc.h	2014-12-09 16:55:03.172727878 -0800 | 
|  | @@ -0,0 +1,55 @@ | 
|  | +/* Copyright (C) 1995, 96, 97, 98, 99, 2000, 2001 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef _SYS_IPC_H | 
|  | +# error "Never use <bits/ipc.h> directly; include <sys/ipc.h> instead." | 
|  | +#endif | 
|  | + | 
|  | +#include <bits/types.h> | 
|  | + | 
|  | +/* Mode bits for `msgget', `semget', and `shmget'.  */ | 
|  | +#define IPC_CREAT	01000		/* Create key if key does not exist. */ | 
|  | +#define IPC_EXCL	02000		/* Fail if key exists.	*/ | 
|  | +#define IPC_NOWAIT	04000		/* Return error on wait.  */ | 
|  | + | 
|  | +/* Control commands for `msgctl', `semctl', and `shmctl'.  */ | 
|  | +#define IPC_RMID	0		/* Remove identifier.  */ | 
|  | +#define IPC_SET		1		/* Set `ipc_perm' options.  */ | 
|  | +#define IPC_STAT	2		/* Get `ipc_perm' options.  */ | 
|  | +#ifdef __USE_GNU | 
|  | +# define IPC_INFO	3		/* See ipcs.  */ | 
|  | +#endif | 
|  | + | 
|  | +/* Special key values.	*/ | 
|  | +#define IPC_PRIVATE	((__key_t) 0)	/* Private key.	 */ | 
|  | + | 
|  | + | 
|  | +/* Data structure used to pass permission information to IPC operations.  */ | 
|  | +struct ipc_perm | 
|  | +  { | 
|  | +    __key_t __key;			/* Key.  */ | 
|  | +    unsigned int uid;			/* Owner's user ID.  */ | 
|  | +    unsigned int gid;			/* Owner's group ID.  */ | 
|  | +    unsigned int cuid;			/* Creator's user ID.  */ | 
|  | +    unsigned int cgid;			/* Creator's group ID.	*/ | 
|  | +    unsigned int mode;			/* Read/write permission.  */ | 
|  | +    unsigned short int __seq;		/* Sequence number.  */ | 
|  | +    unsigned short int __pad1; | 
|  | +    unsigned long int __unused1; | 
|  | +    unsigned long int __unused2; | 
|  | +}; | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/bits/mman.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/bits/mman.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/bits/mman.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/bits/mman.h	2014-12-09 16:55:03.172727878 -0800 | 
|  | @@ -0,0 +1,112 @@ | 
|  | +/* Definitions for POSIX memory map interface.  Linux/MIPS version. | 
|  | +   Copyright (C) 1997, 2000, 2003, 2004, 2005, 2006, 2009, 2011 | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef _SYS_MMAN_H | 
|  | +# error "Never use <bits/mman.h> directly; include <sys/mman.h> instead." | 
|  | +#endif | 
|  | + | 
|  | +/* The following definitions basically come from the kernel headers. | 
|  | +   But the kernel header is not namespace clean.  */ | 
|  | + | 
|  | + | 
|  | +/* Protections are chosen from these bits, OR'd together.  The | 
|  | +   implementation does not necessarily support PROT_EXEC or PROT_WRITE | 
|  | +   without PROT_READ.  The only guarantees are that no writing will be | 
|  | +   allowed without PROT_WRITE and no access will be allowed for PROT_NONE. */ | 
|  | + | 
|  | +#define PROT_READ	0x1		/* Page can be read.  */ | 
|  | +#define PROT_WRITE	0x2		/* Page can be written.  */ | 
|  | +#define PROT_EXEC	0x4		/* Page can be executed.  */ | 
|  | +#define PROT_NONE	0x0		/* Page can not be accessed.  */ | 
|  | +#define PROT_GROWSDOWN	0x01000000	/* Extend change to start of | 
|  | +					   growsdown vma (mprotect only).  */ | 
|  | +#define PROT_GROWSUP	0x02000000	/* Extend change to start of | 
|  | +					   growsup vma (mprotect only).  */ | 
|  | + | 
|  | +/* Sharing types (must choose one and only one of these).  */ | 
|  | +#define MAP_SHARED	0x01		/* Share changes.  */ | 
|  | +#define MAP_PRIVATE	0x02		/* Changes are private.  */ | 
|  | +#ifdef __USE_MISC | 
|  | +# define MAP_TYPE	0x0f		/* Mask for type of mapping.  */ | 
|  | +#endif | 
|  | + | 
|  | +/* Other flags.  */ | 
|  | +#define MAP_FIXED	0x10		/* Interpret addr exactly.  */ | 
|  | +#ifdef __USE_MISC | 
|  | +# define MAP_FILE	0 | 
|  | +# define MAP_ANONYMOUS	0x20		/* Don't use a file.  */ | 
|  | +# define MAP_ANON	MAP_ANONYMOUS | 
|  | +# define MAP_RENAME	MAP_ANONYMOUS | 
|  | +#endif | 
|  | + | 
|  | +/* These are Linux-specific.  */ | 
|  | +#ifdef __USE_MISC | 
|  | +# define MAP_GROWSDOWN	0x0100		/* stack-like segment */ | 
|  | +# define MAP_DENYWRITE	0x0800		/* ETXTBSY */ | 
|  | +# define MAP_EXECUTABLE	0x1000		/* mark it as an executable */ | 
|  | +# define MAP_LOCKED	0x2000		/* pages are locked */ | 
|  | +# define MAP_NORESERVE	0x4000		/* don't check for reservations */ | 
|  | +# define MAP_POPULATE	0x8000		/* populate (prefault) pagetables */ | 
|  | +# define MAP_NONBLOCK	0x10000		/* do not block on IO */ | 
|  | +# define MAP_STACK	0x20000		/* give out an address that is best suited for process/thread stacks */ | 
|  | +# define MAP_HUGETLB	0x40000		/* create a huge page mapping */ | 
|  | +#endif | 
|  | + | 
|  | +/* Flags to `msync'.  */ | 
|  | +#define MS_ASYNC	1		/* Sync memory asynchronously.  */ | 
|  | +#define MS_SYNC		4		/* Synchronous memory sync.  */ | 
|  | +#define MS_INVALIDATE	2		/* Invalidate the caches.  */ | 
|  | + | 
|  | +/* Flags for `mlockall'.  */ | 
|  | +#define MCL_CURRENT	1		/* Lock all currently mapped pages.  */ | 
|  | +#define MCL_FUTURE	2		/* Lock all additions to address | 
|  | +					   space.  */ | 
|  | + | 
|  | +/* Flags for `mremap'.  */ | 
|  | +#ifdef __USE_GNU | 
|  | +# define MREMAP_MAYMOVE	1 | 
|  | +# define MREMAP_FIXED	2 | 
|  | +#endif | 
|  | + | 
|  | +/* Advice to `madvise'.  */ | 
|  | +#ifdef __USE_BSD | 
|  | +# define MADV_NORMAL	  0	/* No further special treatment.  */ | 
|  | +# define MADV_RANDOM	  1	/* Expect random page references.  */ | 
|  | +# define MADV_SEQUENTIAL  2	/* Expect sequential page references.  */ | 
|  | +# define MADV_WILLNEED	  3	/* Will need these pages.  */ | 
|  | +# define MADV_DONTNEED	  4	/* Don't need these pages.  */ | 
|  | +# define MADV_REMOVE	  9	/* Remove these pages and resources.  */ | 
|  | +# define MADV_DONTFORK	  10	/* Do not inherit across fork.  */ | 
|  | +# define MADV_DOFORK	  11	/* Do inherit across fork.  */ | 
|  | +# define MADV_MERGEABLE	  12	/* KSM may merge identical pages.  */ | 
|  | +# define MADV_UNMERGEABLE 13	/* KSM may not merge identical pages.  */ | 
|  | +# define MADV_HUGEPAGE	  14	/* Worth backing with hugepages.  */ | 
|  | +# define MADV_NOHUGEPAGE  15	/* Not worth backing with hugepages.  */ | 
|  | +# define MADV_HWPOISON	  100	/* Poison a page for testing.  */ | 
|  | +#endif | 
|  | + | 
|  | +/* The POSIX people had to invent similar names for the same things.  */ | 
|  | +#ifdef __USE_XOPEN2K | 
|  | +# define POSIX_MADV_NORMAL	0 /* No further special treatment.  */ | 
|  | +# define POSIX_MADV_RANDOM	1 /* Expect random page references.  */ | 
|  | +# define POSIX_MADV_SEQUENTIAL	2 /* Expect sequential page references.  */ | 
|  | +# define POSIX_MADV_WILLNEED	3 /* Will need these pages.  */ | 
|  | +# define POSIX_MADV_DONTNEED	4 /* Don't need these pages.  */ | 
|  | +#endif | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/bits/msq.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/bits/msq.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/bits/msq.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/bits/msq.h	2014-12-09 16:55:03.172727878 -0800 | 
|  | @@ -0,0 +1,92 @@ | 
|  | +/* Copyright (C) 2002, 2007 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef _SYS_MSG_H | 
|  | +# error "Never use <bits/msq.h> directly; include <sys/msg.h> instead." | 
|  | +#endif | 
|  | + | 
|  | +#include <bits/types.h> | 
|  | + | 
|  | +/* Define options for message queue functions.  */ | 
|  | +#define MSG_NOERROR	010000	/* no error if message is too big */ | 
|  | +#ifdef __USE_GNU | 
|  | +# define MSG_EXCEPT	020000	/* recv any msg except of specified type */ | 
|  | +#endif | 
|  | + | 
|  | +/* Types used in the structure definition.  */ | 
|  | +typedef unsigned long int msgqnum_t; | 
|  | +typedef unsigned long int msglen_t; | 
|  | + | 
|  | + | 
|  | +/* Structure of record for one message inside the kernel. | 
|  | +   The type `struct msg' is opaque.  */ | 
|  | +struct msqid_ds | 
|  | +{ | 
|  | +  struct ipc_perm msg_perm;	/* structure describing operation permission */ | 
|  | +#if __WORDSIZE == 32 && defined (__MIPSEB__) | 
|  | +  unsigned long int __unused1; | 
|  | +#endif | 
|  | +  __time_t msg_stime;		/* time of last msgsnd command */ | 
|  | +#if __WORDSIZE == 32 && defined (__MIPSEL__) | 
|  | +  unsigned long int __unused1; | 
|  | +#endif | 
|  | +#if __WORDSIZE == 32 && defined (__MIPSEB__) | 
|  | +  unsigned long int __unused2; | 
|  | +#endif | 
|  | +  __time_t msg_rtime;		/* time of last msgrcv command */ | 
|  | +#if __WORDSIZE == 32 && defined (__MIPSEL__) | 
|  | +  unsigned long int __unused2; | 
|  | +#endif | 
|  | +#if __WORDSIZE == 32 && defined (__MIPSEB__) | 
|  | +  unsigned long int __unused3; | 
|  | +#endif | 
|  | +  __time_t msg_ctime;		/* time of last change */ | 
|  | +#if __WORDSIZE == 32 && defined (__MIPSEL__) | 
|  | +  unsigned long int __unused3; | 
|  | +#endif | 
|  | +  unsigned long int __msg_cbytes; /* current number of bytes on queue */ | 
|  | +  msgqnum_t msg_qnum;		/* number of messages currently on queue */ | 
|  | +  msglen_t msg_qbytes;		/* max number of bytes allowed on queue */ | 
|  | +  __pid_t msg_lspid;		/* pid of last msgsnd() */ | 
|  | +  __pid_t msg_lrpid;		/* pid of last msgrcv() */ | 
|  | +  unsigned long int __unused4; | 
|  | +  unsigned long int __unused5; | 
|  | +}; | 
|  | + | 
|  | +#ifdef __USE_MISC | 
|  | + | 
|  | +# define msg_cbytes	__msg_cbytes | 
|  | + | 
|  | +/* ipcs ctl commands */ | 
|  | +# define MSG_STAT 11 | 
|  | +# define MSG_INFO 12 | 
|  | + | 
|  | +/* buffer for msgctl calls IPC_INFO, MSG_INFO */ | 
|  | +struct msginfo | 
|  | +  { | 
|  | +    int msgpool; | 
|  | +    int msgmap; | 
|  | +    int msgmax; | 
|  | +    int msgmnb; | 
|  | +    int msgmni; | 
|  | +    int msgssz; | 
|  | +    int msgtql; | 
|  | +    unsigned short int msgseg; | 
|  | +  }; | 
|  | + | 
|  | +#endif /* __USE_MISC */ | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/bits/poll.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/bits/poll.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/bits/poll.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/bits/poll.h	2014-12-09 16:55:03.172727878 -0800 | 
|  | @@ -0,0 +1,50 @@ | 
|  | +/* Copyright (C) 1997, 2001, 2006, 2009 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef _SYS_POLL_H | 
|  | +# error "Never use <bits/poll.h> directly; include <sys/poll.h> instead." | 
|  | +#endif | 
|  | + | 
|  | +/* Event types that can be polled for.  These bits may be set in `events' | 
|  | +   to indicate the interesting event types; they will appear in `revents' | 
|  | +   to indicate the status of the file descriptor.  */ | 
|  | +#define POLLIN		0x001		/* There is data to read.  */ | 
|  | +#define POLLPRI		0x002		/* There is urgent data to read.  */ | 
|  | +#define POLLOUT		0x004		/* Writing now will not block.  */ | 
|  | + | 
|  | +#if defined __USE_XOPEN || defined __USE_XOPEN2K8 | 
|  | +/* These values are defined in XPG4.2.  */ | 
|  | +# define POLLRDNORM	0x040		/* Normal data may be read.  */ | 
|  | +# define POLLRDBAND	0x080		/* Priority data may be read.  */ | 
|  | +# define POLLWRNORM	POLLOUT		/* Writing now will not block.  */ | 
|  | +# define POLLWRBAND	0x100		/* Priority data may be written.  */ | 
|  | +#endif | 
|  | + | 
|  | +#ifdef __USE_GNU | 
|  | +/* These are extensions for Linux.  */ | 
|  | +# define POLLMSG	0x400 | 
|  | +# define POLLREMOVE	0x1000 | 
|  | +# define POLLRDHUP	0x2000 | 
|  | +#endif | 
|  | + | 
|  | +/* Event types always implicitly polled for.  These bits need not be set in | 
|  | +   `events', but they will appear in `revents' to indicate the status of | 
|  | +   the file descriptor.  */ | 
|  | +#define POLLERR		0x008		/* Error condition.  */ | 
|  | +#define POLLHUP		0x010		/* Hung up.  */ | 
|  | +#define POLLNVAL	0x020		/* Invalid polling request.  */ | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/bits/resource.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/bits/resource.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/bits/resource.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/bits/resource.h	2014-12-09 16:55:03.172727878 -0800 | 
|  | @@ -0,0 +1,270 @@ | 
|  | +/* Bit values & structures for resource limits.  Linux/MIPS version. | 
|  | +   Copyright (C) 1994, 1996, 1997, 1998, 1999, 2000, 2004, 2005, 2006, 2008, | 
|  | +   2009, 2010 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef _SYS_RESOURCE_H | 
|  | +# error "Never use <bits/resource.h> directly; include <sys/resource.h> instead." | 
|  | +#endif | 
|  | + | 
|  | +#include <bits/types.h> | 
|  | + | 
|  | +/* Transmute defines to enumerations.  The macro re-definitions are | 
|  | +   necessary because some programs want to test for operating system | 
|  | +   features with #ifdef RUSAGE_SELF.  In ISO C the reflexive | 
|  | +   definition is a no-op.  */ | 
|  | + | 
|  | +/* Kinds of resource limit.  */ | 
|  | +enum __rlimit_resource | 
|  | +{ | 
|  | +  /* Per-process CPU limit, in seconds.  */ | 
|  | +  RLIMIT_CPU = 0, | 
|  | +#define RLIMIT_CPU RLIMIT_CPU | 
|  | + | 
|  | +  /* Largest file that can be created, in bytes.  */ | 
|  | +  RLIMIT_FSIZE = 1, | 
|  | +#define	RLIMIT_FSIZE RLIMIT_FSIZE | 
|  | + | 
|  | +  /* Maximum size of data segment, in bytes.  */ | 
|  | +  RLIMIT_DATA = 2, | 
|  | +#define	RLIMIT_DATA RLIMIT_DATA | 
|  | + | 
|  | +  /* Maximum size of stack segment, in bytes.  */ | 
|  | +  RLIMIT_STACK = 3, | 
|  | +#define	RLIMIT_STACK RLIMIT_STACK | 
|  | + | 
|  | +  /* Largest core file that can be created, in bytes.  */ | 
|  | +  RLIMIT_CORE = 4, | 
|  | +#define	RLIMIT_CORE RLIMIT_CORE | 
|  | + | 
|  | +  /* Largest resident set size, in bytes. | 
|  | +     This affects swapping; processes that are exceeding their | 
|  | +     resident set size will be more likely to have physical memory | 
|  | +     taken from them.  */ | 
|  | +  __RLIMIT_RSS = 7, | 
|  | +#define	RLIMIT_RSS __RLIMIT_RSS | 
|  | + | 
|  | +  /* Number of open files.  */ | 
|  | +  RLIMIT_NOFILE = 5, | 
|  | +  __RLIMIT_OFILE = RLIMIT_NOFILE, /* BSD name for same.  */ | 
|  | +#define RLIMIT_NOFILE RLIMIT_NOFILE | 
|  | +#define RLIMIT_OFILE __RLIMIT_OFILE | 
|  | + | 
|  | +  /* Address space limit (?) */ | 
|  | +  RLIMIT_AS = 6, | 
|  | +#define RLIMIT_AS RLIMIT_AS | 
|  | + | 
|  | +  /* Number of processes.  */ | 
|  | +  __RLIMIT_NPROC = 8, | 
|  | +#define RLIMIT_NPROC __RLIMIT_NPROC | 
|  | + | 
|  | +  /* Locked-in-memory address space.  */ | 
|  | +  __RLIMIT_MEMLOCK = 9, | 
|  | +#define RLIMIT_MEMLOCK __RLIMIT_MEMLOCK | 
|  | + | 
|  | +  /* Maximum number of file locks.  */ | 
|  | +  __RLIMIT_LOCKS = 10, | 
|  | +#define RLIMIT_LOCKS __RLIMIT_LOCKS | 
|  | + | 
|  | +  /* Maximum number of pending signals.  */ | 
|  | +  __RLIMIT_SIGPENDING = 11, | 
|  | +#define RLIMIT_SIGPENDING __RLIMIT_SIGPENDING | 
|  | + | 
|  | +  /* Maximum bytes in POSIX message queues.  */ | 
|  | +  __RLIMIT_MSGQUEUE = 12, | 
|  | +#define RLIMIT_MSGQUEUE __RLIMIT_MSGQUEUE | 
|  | + | 
|  | +  /* Maximum nice priority allowed to raise to. | 
|  | +     Nice levels 19 .. -20 correspond to 0 .. 39 | 
|  | +     values of this resource limit.  */ | 
|  | +  __RLIMIT_NICE = 13, | 
|  | +#define RLIMIT_NICE __RLIMIT_NICE | 
|  | + | 
|  | +  /* Maximum realtime priority allowed for non-priviledged | 
|  | +     processes.  */ | 
|  | +  __RLIMIT_RTPRIO = 14, | 
|  | +#define RLIMIT_RTPRIO __RLIMIT_RTPRIO | 
|  | + | 
|  | +  __RLIMIT_NLIMITS = 15, | 
|  | +  __RLIM_NLIMITS = __RLIMIT_NLIMITS | 
|  | +#define RLIMIT_NLIMITS __RLIMIT_NLIMITS | 
|  | +#define RLIM_NLIMITS __RLIM_NLIMITS | 
|  | +}; | 
|  | + | 
|  | +/* Value to indicate that there is no limit.  */ | 
|  | +#if _RISCV_SIM == _ABI64 | 
|  | +/* The N64 syscall uses this value.  */ | 
|  | +# define RLIM_INFINITY 0xffffffffffffffffUL | 
|  | +# ifdef __USE_LARGEFILE64 | 
|  | +#  define RLIM64_INFINITY 0xffffffffffffffffUL | 
|  | +# endif | 
|  | +#else | 
|  | +/* The O32 and N32 syscalls use 0x7fffffff.  */ | 
|  | +# ifndef __USE_FILE_OFFSET64 | 
|  | +#  define RLIM_INFINITY ((long int)(~0UL >> 1)) | 
|  | +# else | 
|  | +#  define RLIM_INFINITY 0x7fffffffffffffffULL | 
|  | +# endif | 
|  | +# ifdef __USE_LARGEFILE64 | 
|  | +#  define RLIM64_INFINITY 0x7fffffffffffffffULL | 
|  | +# endif | 
|  | +#endif | 
|  | + | 
|  | +/* We can represent all limits.  */ | 
|  | +#define RLIM_SAVED_MAX	RLIM_INFINITY | 
|  | +#define RLIM_SAVED_CUR	RLIM_INFINITY | 
|  | + | 
|  | + | 
|  | +/* Type for resource quantity measurement.  */ | 
|  | +#ifndef __USE_FILE_OFFSET64 | 
|  | +typedef __rlim_t rlim_t; | 
|  | +#else | 
|  | +typedef __rlim64_t rlim_t; | 
|  | +#endif | 
|  | +#ifdef __USE_LARGEFILE64 | 
|  | +typedef __rlim64_t rlim64_t; | 
|  | +#endif | 
|  | + | 
|  | +struct rlimit | 
|  | +  { | 
|  | +    /* The current (soft) limit.  */ | 
|  | +    rlim_t rlim_cur; | 
|  | +    /* The hard limit.  */ | 
|  | +    rlim_t rlim_max; | 
|  | +  }; | 
|  | + | 
|  | +#ifdef __USE_LARGEFILE64 | 
|  | +struct rlimit64 | 
|  | +  { | 
|  | +    /* The current (soft) limit.  */ | 
|  | +    rlim64_t rlim_cur; | 
|  | +    /* The hard limit.  */ | 
|  | +    rlim64_t rlim_max; | 
|  | + }; | 
|  | +#endif | 
|  | + | 
|  | +/* Whose usage statistics do you want?  */ | 
|  | +enum __rusage_who | 
|  | +{ | 
|  | +  /* The calling process.  */ | 
|  | +  RUSAGE_SELF = 0, | 
|  | +#define RUSAGE_SELF RUSAGE_SELF | 
|  | + | 
|  | +  /* All of its terminated child processes.  */ | 
|  | +  RUSAGE_CHILDREN = -1 | 
|  | +#define RUSAGE_CHILDREN RUSAGE_CHILDREN | 
|  | + | 
|  | +#ifdef __USE_GNU | 
|  | +  , | 
|  | +  /* The calling thread.  */ | 
|  | +  RUSAGE_THREAD = 1 | 
|  | +# define RUSAGE_THREAD RUSAGE_THREAD | 
|  | +  /* Name for the same functionality on Solaris.  */ | 
|  | +# define RUSAGE_LWP RUSAGE_THREAD | 
|  | +#endif | 
|  | +}; | 
|  | + | 
|  | +#define __need_timeval | 
|  | +#include <bits/time.h>		/* For `struct timeval'.  */ | 
|  | + | 
|  | +/* Structure which says how much of each resource has been used.  */ | 
|  | +struct rusage | 
|  | +  { | 
|  | +    /* Total amount of user time used.  */ | 
|  | +    struct timeval ru_utime; | 
|  | +    /* Total amount of system time used.  */ | 
|  | +    struct timeval ru_stime; | 
|  | +    /* Maximum resident set size (in kilobytes).  */ | 
|  | +    long int ru_maxrss; | 
|  | +    /* Amount of sharing of text segment memory | 
|  | +       with other processes (kilobyte-seconds).  */ | 
|  | +    long int ru_ixrss; | 
|  | +    /* Amount of data segment memory used (kilobyte-seconds).  */ | 
|  | +    long int ru_idrss; | 
|  | +    /* Amount of stack memory used (kilobyte-seconds).  */ | 
|  | +    long int ru_isrss; | 
|  | +    /* Number of soft page faults (i.e. those serviced by reclaiming | 
|  | +       a page from the list of pages awaiting reallocation.  */ | 
|  | +    long int ru_minflt; | 
|  | +    /* Number of hard page faults (i.e. those that required I/O).  */ | 
|  | +    long int ru_majflt; | 
|  | +    /* Number of times a process was swapped out of physical memory.  */ | 
|  | +    long int ru_nswap; | 
|  | +    /* Number of input operations via the file system.  Note: This | 
|  | +       and `ru_oublock' do not include operations with the cache.  */ | 
|  | +    long int ru_inblock; | 
|  | +    /* Number of output operations via the file system.  */ | 
|  | +    long int ru_oublock; | 
|  | +    /* Number of IPC messages sent.  */ | 
|  | +    long int ru_msgsnd; | 
|  | +    /* Number of IPC messages received.  */ | 
|  | +    long int ru_msgrcv; | 
|  | +    /* Number of signals delivered.  */ | 
|  | +    long int ru_nsignals; | 
|  | +    /* Number of voluntary context switches, i.e. because the process | 
|  | +       gave up the process before it had to (usually to wait for some | 
|  | +       resource to be available).  */ | 
|  | +    long int ru_nvcsw; | 
|  | +    /* Number of involuntary context switches, i.e. a higher priority process | 
|  | +       became runnable or the current process used up its time slice.  */ | 
|  | +    long int ru_nivcsw; | 
|  | +  }; | 
|  | + | 
|  | +/* Priority limits.  */ | 
|  | +#define PRIO_MIN	-20	/* Minimum priority a process can have.  */ | 
|  | +#define PRIO_MAX	20	/* Maximum priority a process can have.  */ | 
|  | + | 
|  | +/* The type of the WHICH argument to `getpriority' and `setpriority', | 
|  | +   indicating what flavor of entity the WHO argument specifies.  */ | 
|  | +enum __priority_which | 
|  | +{ | 
|  | +  PRIO_PROCESS = 0,		/* WHO is a process ID.  */ | 
|  | +#define PRIO_PROCESS PRIO_PROCESS | 
|  | +  PRIO_PGRP = 1,		/* WHO is a process group ID.  */ | 
|  | +#define PRIO_PGRP PRIO_PGRP | 
|  | +  PRIO_USER = 2			/* WHO is a user ID.  */ | 
|  | +#define PRIO_USER PRIO_USER | 
|  | +}; | 
|  | + | 
|  | + | 
|  | +__BEGIN_DECLS | 
|  | + | 
|  | +#ifdef __USE_GNU | 
|  | +/* Modify and return resource limits of a process atomically.  */ | 
|  | +# ifndef __USE_FILE_OFFSET64 | 
|  | +extern int prlimit (__pid_t __pid, enum __rlimit_resource __resource, | 
|  | +		    __const struct rlimit *__new_limit, | 
|  | +		    struct rlimit *__old_limit) __THROW; | 
|  | +# else | 
|  | +#  ifdef __REDIRECT_NTH | 
|  | +extern int __REDIRECT_NTH (prlimit, (__pid_t __pid, | 
|  | +				     enum __rlimit_resource __resource, | 
|  | +				     __const struct rlimit *__new_limit, | 
|  | +				     struct rlimit *__old_limit), prlimit64); | 
|  | +#  else | 
|  | +#   define prlimit prlimit64 | 
|  | +#  endif | 
|  | +# endif | 
|  | +# ifdef __USE_LARGEFILE64 | 
|  | +extern int prlimit64 (__pid_t __pid, enum __rlimit_resource __resource, | 
|  | +		      __const struct rlimit64 *__new_limit, | 
|  | +		      struct rlimit64 *__old_limit) __THROW; | 
|  | +# endif | 
|  | +#endif | 
|  | + | 
|  | +__END_DECLS | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/bits/sem.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/bits/sem.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/bits/sem.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/bits/sem.h	2014-12-09 16:55:03.172727878 -0800 | 
|  | @@ -0,0 +1,85 @@ | 
|  | +/* Copyright (C) 1995, 1996, 1997, 1998, 2000, 2001 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef _SYS_SEM_H | 
|  | +# error "Never include <bits/sem.h> directly; use <sys/sem.h> instead." | 
|  | +#endif | 
|  | + | 
|  | +#include <sys/types.h> | 
|  | + | 
|  | +/* Flags for `semop'.  */ | 
|  | +#define SEM_UNDO	0x1000		/* undo the operation on exit */ | 
|  | + | 
|  | +/* Commands for `semctl'.  */ | 
|  | +#define GETPID		11		/* get sempid */ | 
|  | +#define GETVAL		12		/* get semval */ | 
|  | +#define GETALL		13		/* get all semval's */ | 
|  | +#define GETNCNT		14		/* get semncnt */ | 
|  | +#define GETZCNT		15		/* get semzcnt */ | 
|  | +#define SETVAL		16		/* set semval */ | 
|  | +#define SETALL		17		/* set all semval's */ | 
|  | + | 
|  | + | 
|  | +/* Data structure describing a set of semaphores.  */ | 
|  | +struct semid_ds | 
|  | +{ | 
|  | +  struct ipc_perm sem_perm;		/* operation permission struct */ | 
|  | +  __time_t sem_otime;			/* last semop() time */ | 
|  | +  __time_t sem_ctime;			/* last time changed by semctl() */ | 
|  | +  unsigned long int sem_nsems;		/* number of semaphores in set */ | 
|  | +  unsigned long int __unused1; | 
|  | +  unsigned long int __unused2; | 
|  | +}; | 
|  | + | 
|  | +/* The user should define a union like the following to use it for arguments | 
|  | +   for `semctl'. | 
|  | + | 
|  | +   union semun | 
|  | +   { | 
|  | +     int val;				<= value for SETVAL | 
|  | +     struct semid_ds *buf;		<= buffer for IPC_STAT & IPC_SET | 
|  | +     unsigned short int *array;		<= array for GETALL & SETALL | 
|  | +     struct seminfo *__buf;		<= buffer for IPC_INFO | 
|  | +   }; | 
|  | + | 
|  | +   Previous versions of this file used to define this union but this is | 
|  | +   incorrect.  One can test the macro _SEM_SEMUN_UNDEFINED to see whether | 
|  | +   one must define the union or not.  */ | 
|  | +#define _SEM_SEMUN_UNDEFINED	1 | 
|  | + | 
|  | +#ifdef __USE_MISC | 
|  | + | 
|  | +/* ipcs ctl cmds */ | 
|  | +# define SEM_STAT 18 | 
|  | +# define SEM_INFO 19 | 
|  | + | 
|  | +struct  seminfo | 
|  | +{ | 
|  | +  int semmap; | 
|  | +  int semmni; | 
|  | +  int semmns; | 
|  | +  int semmnu; | 
|  | +  int semmsl; | 
|  | +  int semopm; | 
|  | +  int semume; | 
|  | +  int semusz; | 
|  | +  int semvmx; | 
|  | +  int semaem; | 
|  | +}; | 
|  | + | 
|  | +#endif /* __USE_MISC */ | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/bits/shm.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/bits/shm.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/bits/shm.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/bits/shm.h	2014-12-09 16:55:03.172727878 -0800 | 
|  | @@ -0,0 +1,95 @@ | 
|  | +/* Copyright (C) 1995,1996,1997,2000,2001,2002,2003,2009 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef _SYS_SHM_H | 
|  | +# error "Never include <bits/shm.h> directly; use <sys/shm.h> instead." | 
|  | +#endif | 
|  | + | 
|  | +#include <bits/types.h> | 
|  | + | 
|  | +/* Permission flag for shmget.  */ | 
|  | +#define SHM_R		0400		/* or S_IRUGO from <linux/stat.h> */ | 
|  | +#define SHM_W		0200		/* or S_IWUGO from <linux/stat.h> */ | 
|  | + | 
|  | +/* Flags for `shmat'.  */ | 
|  | +#define SHM_RDONLY	010000		/* attach read-only else read-write */ | 
|  | +#define SHM_RND		020000		/* round attach address to SHMLBA */ | 
|  | +#define SHM_REMAP	040000		/* take-over region on attach */ | 
|  | +#define SHM_EXEC	0100000		/* execution access */ | 
|  | + | 
|  | +/* Commands for `shmctl'.  */ | 
|  | +#define SHM_LOCK	11		/* lock segment (root only) */ | 
|  | +#define SHM_UNLOCK	12		/* unlock segment (root only) */ | 
|  | + | 
|  | +/* Segment low boundary address multiple.  */ | 
|  | +#define SHMLBA		0x40000 | 
|  | + | 
|  | + | 
|  | +/* Type to count number of attaches.  */ | 
|  | +typedef unsigned long int shmatt_t; | 
|  | + | 
|  | +/* Data structure describing a shared memory segment.  */ | 
|  | +struct shmid_ds | 
|  | +  { | 
|  | +    struct ipc_perm shm_perm;		/* operation permission struct */ | 
|  | +    size_t shm_segsz;			/* size of segment in bytes */ | 
|  | +    __time_t shm_atime;			/* time of last shmat() */ | 
|  | +    __time_t shm_dtime;			/* time of last shmdt() */ | 
|  | +    __time_t shm_ctime;			/* time of last change by shmctl() */ | 
|  | +    __pid_t shm_cpid;			/* pid of creator */ | 
|  | +    __pid_t shm_lpid;			/* pid of last shmop */ | 
|  | +    shmatt_t shm_nattch;		/* number of current attaches */ | 
|  | +    unsigned long int __unused1; | 
|  | +    unsigned long int __unused2; | 
|  | +  }; | 
|  | + | 
|  | +#ifdef __USE_MISC | 
|  | + | 
|  | +/* ipcs ctl commands */ | 
|  | +# define SHM_STAT	13 | 
|  | +# define SHM_INFO	14 | 
|  | + | 
|  | +/* shm_mode upper byte flags */ | 
|  | +# define SHM_DEST	01000	/* segment will be destroyed on last detach */ | 
|  | +# define SHM_LOCKED	02000   /* segment will not be swapped */ | 
|  | +# define SHM_HUGETLB	04000	/* segment is mapped via hugetlb */ | 
|  | + | 
|  | +struct shminfo | 
|  | +  { | 
|  | +    unsigned long int shmmax; | 
|  | +    unsigned long int shmmin; | 
|  | +    unsigned long int shmmni; | 
|  | +    unsigned long int shmseg; | 
|  | +    unsigned long int shmall; | 
|  | +    unsigned long int __unused1; | 
|  | +    unsigned long int __unused2; | 
|  | +    unsigned long int __unused3; | 
|  | +    unsigned long int __unused4; | 
|  | +  }; | 
|  | + | 
|  | +struct shm_info | 
|  | +  { | 
|  | +    int used_ids; | 
|  | +    unsigned long int shm_tot;  /* total allocated shm */ | 
|  | +    unsigned long int shm_rss;  /* total resident shm */ | 
|  | +    unsigned long int shm_swp;  /* total swapped shm */ | 
|  | +    unsigned long int swap_attempts; | 
|  | +    unsigned long int swap_successes; | 
|  | +  }; | 
|  | + | 
|  | +#endif /* __USE_MISC */ | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/bits/sigaction.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/bits/sigaction.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/bits/sigaction.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/bits/sigaction.h	2014-12-09 16:55:03.172727878 -0800 | 
|  | @@ -0,0 +1,91 @@ | 
|  | +/* The proper definitions for Linux/MIPS's sigaction. | 
|  | +   Copyright (C) 1993, 1994, 1995, 1997, 1998, 1999, 2000, 2003, 2010 | 
|  | +	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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef _SIGNAL_H | 
|  | +# error "Never include <bits/sigaction.h> directly; use <signal.h> instead." | 
|  | +#endif | 
|  | + | 
|  | +/* Structure describing the action to be taken when a signal arrives.  */ | 
|  | +struct sigaction | 
|  | +  { | 
|  | +    /* Special flags.  */ | 
|  | +    unsigned int sa_flags; | 
|  | + | 
|  | +    /* Signal handler.  */ | 
|  | +#ifdef __USE_POSIX199309 | 
|  | +    union | 
|  | +      { | 
|  | +	/* Used if SA_SIGINFO is not set.  */ | 
|  | +	__sighandler_t sa_handler; | 
|  | +	/* Used if SA_SIGINFO is set.  */ | 
|  | +	void (*sa_sigaction) (int, siginfo_t *, void *); | 
|  | +      } | 
|  | +    __sigaction_handler; | 
|  | +# define sa_handler    __sigaction_handler.sa_handler | 
|  | +# define sa_sigaction  __sigaction_handler.sa_sigaction | 
|  | +#else | 
|  | +    __sighandler_t sa_handler; | 
|  | +#endif | 
|  | +    /* Additional set of signals to be blocked.  */ | 
|  | +    __sigset_t sa_mask; | 
|  | + | 
|  | +    /* The ABI says here are two unused ints following. */ | 
|  | +    /* Restore handler.  */ | 
|  | +    void (*sa_restorer) (void); | 
|  | + | 
|  | +#if _RISCV_SZPTR < 64 | 
|  | +    int sa_resv[1]; | 
|  | +#endif | 
|  | +  }; | 
|  | + | 
|  | +/* Bits in `sa_flags'.  */ | 
|  | +/* Please note that some Linux kernels versions use different values for these | 
|  | +   flags which is a bug in those kernel versions.  */ | 
|  | +#define SA_NOCLDSTOP  0x00000001 /* Don't send SIGCHLD when children stop.  */ | 
|  | +#define SA_NOCLDWAIT  0x00010000 /* Don't create zombie on child death.  */ | 
|  | +#define SA_SIGINFO    0x00000008 /* Invoke signal-catching function with | 
|  | +				    three arguments instead of one.  */ | 
|  | +#if defined __USE_UNIX98 || defined __USE_MISC | 
|  | +# define SA_ONSTACK   0x08000000 /* Use signal stack by using `sa_restorer'. */ | 
|  | +#endif | 
|  | +#if defined __USE_UNIX98 || defined __USE_MISC || defined __USE_XOPEN2K8 | 
|  | +# define SA_RESETHAND 0x80000000 /* Reset to SIG_DFL on entry to handler.  */ | 
|  | +# define SA_RESTART   0x10000000 /* Restart syscall on signal return.  */ | 
|  | +# define SA_NODEFER   0x40000000 /* Don't automatically block the signal when | 
|  | +				    its handler is being executed.  */ | 
|  | +#endif | 
|  | +#ifdef __USE_MISC | 
|  | +# define SA_INTERRUPT 0x20000000 /* Historical no-op.  */ | 
|  | + | 
|  | +/* Some aliases for the SA_ constants.  */ | 
|  | +# define SA_NOMASK    SA_NODEFER | 
|  | +# define SA_ONESHOT   SA_RESETHAND | 
|  | +# define SA_STACK     SA_ONSTACK | 
|  | +#endif | 
|  | + | 
|  | +/* Values for the HOW argument to `sigprocmask'.  */ | 
|  | +#define SIG_NOP	      0		/* 0 is unused to catch errors */ | 
|  | +#define	SIG_BLOCK     1		/* Block signals.  */ | 
|  | +#define	SIG_UNBLOCK   2		/* Unblock signals.  */ | 
|  | +#define	SIG_SETMASK   3		/* Set the set of blocked signals.  */ | 
|  | +#ifdef __USE_MISC | 
|  | +# define SIG_SETMASK32 256	/* Goodie from SGI for BSD compatibility: | 
|  | +				   set only the low 32 bit of the sigset.  */ | 
|  | +#endif | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h	2014-12-09 16:55:03.172727878 -0800 | 
|  | @@ -0,0 +1,84 @@ | 
|  | +/* Copyright (C) 1996, 1997, 1998, 2003, 2004, 2006 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef _BITS_SIGCONTEXT_H | 
|  | +#define _BITS_SIGCONTEXT_H 1 | 
|  | + | 
|  | +#if !defined _SIGNAL_H && !defined _SYS_UCONTEXT_H | 
|  | +# error "Never use <bits/sigcontext.h> directly; include <signal.h> instead." | 
|  | +#endif | 
|  | + | 
|  | +#include <sgidefs.h> | 
|  | + | 
|  | +#if _RISCV_SIM == _ABIO32 | 
|  | + | 
|  | +/* Certain unused fields were replaced with new ones in 2.6.12-rc4. | 
|  | +   The changes were as follows: | 
|  | + | 
|  | +   sc_cause -> sc_hi1 | 
|  | +   sc_badvaddr -> sc_lo1 | 
|  | +   sc_sigset[0] -> sc_hi2 | 
|  | +   sc_sigset[1] -> sc_lo2 | 
|  | +   sc_sigset[2] -> sc_hi3 | 
|  | +   sc_sigset[3] -> sc_lo3 | 
|  | + | 
|  | +   sc_regmask, sc_ownedfp and sc_fpc_eir are not used.  */ | 
|  | +struct sigcontext { | 
|  | +  unsigned int sc_regmask; | 
|  | +  unsigned int sc_status; | 
|  | +  unsigned long long sc_pc; | 
|  | +  unsigned long long sc_regs[32]; | 
|  | +  unsigned long long sc_fpregs[32]; | 
|  | +  unsigned int sc_ownedfp; | 
|  | +  unsigned int sc_fpc_csr; | 
|  | +  unsigned int sc_fpc_eir; | 
|  | +  unsigned int sc_used_math; | 
|  | +  unsigned int sc_dsp; | 
|  | +  unsigned long long sc_mdhi; | 
|  | +  unsigned long long sc_mdlo; | 
|  | +  unsigned long sc_hi1; | 
|  | +  unsigned long sc_lo1; | 
|  | +  unsigned long sc_hi2; | 
|  | +  unsigned long sc_lo2; | 
|  | +  unsigned long sc_hi3; | 
|  | +  unsigned long sc_lo3; | 
|  | +}; | 
|  | + | 
|  | +#else | 
|  | + | 
|  | +/* This structure changed in 2.6.12-rc4 when DSP support was added.  */ | 
|  | +struct sigcontext { | 
|  | +  unsigned long long sc_regs[32]; | 
|  | +  unsigned long long sc_fpregs[32]; | 
|  | +  unsigned long long sc_mdhi; | 
|  | +  unsigned long long sc_hi1; | 
|  | +  unsigned long long sc_hi2; | 
|  | +  unsigned long long sc_hi3; | 
|  | +  unsigned long long sc_mdlo; | 
|  | +  unsigned long long sc_lo1; | 
|  | +  unsigned long long sc_lo2; | 
|  | +  unsigned long long sc_lo3; | 
|  | +  unsigned long long sc_pc; | 
|  | +  unsigned int sc_fpc_csr; | 
|  | +  unsigned int sc_used_math; | 
|  | +  unsigned int sc_dsp; | 
|  | +  unsigned int sc_reserved; | 
|  | +}; | 
|  | + | 
|  | +#endif /* _RISCV_SIM != _ABIO32 */ | 
|  | +#endif | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/bits/siginfo.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/bits/siginfo.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/bits/siginfo.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/bits/siginfo.h	2014-12-09 16:55:03.172727878 -0800 | 
|  | @@ -0,0 +1,319 @@ | 
|  | +/* siginfo_t, sigevent and constants.  Linux/MIPS version. | 
|  | +   Copyright (C) 1997, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008 | 
|  | +	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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#if !defined _SIGNAL_H && !defined __need_siginfo_t \ | 
|  | +    && !defined __need_sigevent_t | 
|  | +# error "Never include this file directly.  Use <signal.h> instead" | 
|  | +#endif | 
|  | + | 
|  | +#include <bits/wordsize.h> | 
|  | + | 
|  | +#define HAVE_PSIGNAL | 
|  | + | 
|  | +#if (!defined __have_sigval_t \ | 
|  | +     && (defined _SIGNAL_H || defined __need_siginfo_t \ | 
|  | +	 || defined __need_sigevent_t)) | 
|  | +# define __have_sigval_t	1 | 
|  | + | 
|  | +/* Type for data associated with a signal.  */ | 
|  | +typedef union sigval | 
|  | +  { | 
|  | +    int sival_int; | 
|  | +    void *sival_ptr; | 
|  | +  } sigval_t; | 
|  | +#endif | 
|  | + | 
|  | +#if (!defined __have_siginfo_t \ | 
|  | +     && (defined _SIGNAL_H || defined __need_siginfo_t)) | 
|  | +# define __have_siginfo_t	1 | 
|  | + | 
|  | +# define __SI_MAX_SIZE		128 | 
|  | +# if __WORDSIZE == 64 | 
|  | +#  define __SI_PAD_SIZE		((__SI_MAX_SIZE / sizeof (int)) - 4) | 
|  | +# else | 
|  | +#  define __SI_PAD_SIZE		((__SI_MAX_SIZE / sizeof (int)) - 3) | 
|  | +# endif | 
|  | + | 
|  | + | 
|  | +typedef struct siginfo | 
|  | +  { | 
|  | +    int si_signo;		/* Signal number.  */ | 
|  | +    int si_code;		/* Signal code.  */ | 
|  | +    int si_errno;		/* If non-zero, an errno value associated with | 
|  | +				   this signal, as defined in <errno.h>.  */ | 
|  | +    int __pad0[__SI_MAX_SIZE / sizeof (int) - __SI_PAD_SIZE - 3]; | 
|  | +				/* Explicit padding.  */ | 
|  | + | 
|  | +    union | 
|  | +      { | 
|  | +	int _pad[__SI_PAD_SIZE]; | 
|  | + | 
|  | +	 /* kill().  */ | 
|  | +	struct | 
|  | +	  { | 
|  | +	    __pid_t si_pid;	/* Sending process ID.  */ | 
|  | +	    __uid_t si_uid;	/* Real user ID of sending process.  */ | 
|  | +	  } _kill; | 
|  | + | 
|  | +	/* POSIX.1b timers.  */ | 
|  | +	struct | 
|  | +	  { | 
|  | +	    int si_tid;		/* Timer ID.  */ | 
|  | +	    int si_overrun;	/* Overrun count.  */ | 
|  | +	    sigval_t si_sigval;	/* Signal value.  */ | 
|  | +	  } _timer; | 
|  | + | 
|  | +	/* POSIX.1b signals.  */ | 
|  | +	struct | 
|  | +	  { | 
|  | +	    __pid_t si_pid;	/* Sending process ID.  */ | 
|  | +	    __uid_t si_uid;	/* Real user ID of sending process.  */ | 
|  | +	    sigval_t si_sigval;	/* Signal value.  */ | 
|  | +	  } _rt; | 
|  | + | 
|  | +	/* SIGCHLD.  */ | 
|  | +	struct | 
|  | +	  { | 
|  | +	    __pid_t si_pid;	/* Which child.  */ | 
|  | +	    __uid_t si_uid;	/* Real user ID of sending process.  */ | 
|  | +	    int si_status;	/* Exit value or signal.  */ | 
|  | +	    __clock_t si_utime; | 
|  | +	    __clock_t si_stime; | 
|  | +	  } _sigchld; | 
|  | + | 
|  | +	/* SIGILL, SIGFPE, SIGSEGV, SIGBUS.  */ | 
|  | +	struct | 
|  | +	  { | 
|  | +	    void *si_addr;	/* Faulting insn/memory ref.  */ | 
|  | +	  } _sigfault; | 
|  | + | 
|  | +	/* SIGPOLL.  */ | 
|  | +	struct | 
|  | +	  { | 
|  | +	    long int si_band;	/* Band event for SIGPOLL.  */ | 
|  | +	    int si_fd; | 
|  | +	  } _sigpoll; | 
|  | +      } _sifields; | 
|  | +  } siginfo_t; | 
|  | + | 
|  | + | 
|  | +/* X/Open requires some more fields with fixed names.  */ | 
|  | +# define si_pid		_sifields._kill.si_pid | 
|  | +# define si_uid		_sifields._kill.si_uid | 
|  | +# define si_timerid	_sifields._timer.si_tid | 
|  | +# define si_overrun	_sifields._timer.si_overrun | 
|  | +# define si_status	_sifields._sigchld.si_status | 
|  | +# define si_utime	_sifields._sigchld.si_utime | 
|  | +# define si_stime	_sifields._sigchld.si_stime | 
|  | +# define si_value	_sifields._rt.si_sigval | 
|  | +# define si_int		_sifields._rt.si_sigval.sival_int | 
|  | +# define si_ptr		_sifields._rt.si_sigval.sival_ptr | 
|  | +# define si_addr	_sifields._sigfault.si_addr | 
|  | +# define si_band	_sifields._sigpoll.si_band | 
|  | +# define si_fd		_sifields._sigpoll.si_fd | 
|  | + | 
|  | + | 
|  | +/* Values for `si_code'.  Positive values are reserved for kernel-generated | 
|  | +   signals.  */ | 
|  | +enum | 
|  | +{ | 
|  | +  SI_ASYNCNL = -60,		/* Sent by asynch name lookup completion.  */ | 
|  | +# define SI_ASYNCNL	SI_ASYNCNL | 
|  | +  SI_TKILL = -6,		/* Sent by tkill.  */ | 
|  | +# define SI_TKILL	SI_TKILL | 
|  | +  SI_SIGIO,			/* Sent by queued SIGIO.  */ | 
|  | +# define SI_SIGIO	SI_SIGIO | 
|  | +  SI_MESGQ,			/* Sent by real time mesq state change.  */ | 
|  | +# define SI_MESGQ	SI_MESGQ | 
|  | +  SI_TIMER,			/* Sent by real time mesq state change.  */ | 
|  | +# define SI_TIMER	SI_TIMER | 
|  | +  SI_ASYNCIO,			/* Sent by AIO completion.  */ | 
|  | +# define SI_ASYNCIO	SI_ASYNCIO | 
|  | +  SI_QUEUE,			/* Sent by sigqueue.  */ | 
|  | +# define SI_QUEUE	SI_QUEUE | 
|  | +  SI_USER,			/* Sent by kill, sigsend, raise.  */ | 
|  | +# define SI_USER	SI_USER | 
|  | +  SI_KERNEL = 0x80		/* Send by kernel.  */ | 
|  | +#define SI_KERNEL	SI_KERNEL | 
|  | +}; | 
|  | + | 
|  | + | 
|  | +/* `si_code' values for SIGILL signal.  */ | 
|  | +enum | 
|  | +{ | 
|  | +  ILL_ILLOPC = 1,		/* Illegal opcode.  */ | 
|  | +# define ILL_ILLOPC	ILL_ILLOPC | 
|  | +  ILL_ILLOPN,			/* Illegal operand.  */ | 
|  | +# define ILL_ILLOPN	ILL_ILLOPN | 
|  | +  ILL_ILLADR,			/* Illegal addressing mode.  */ | 
|  | +# define ILL_ILLADR	ILL_ILLADR | 
|  | +  ILL_ILLTRP,			/* Illegal trap.  */ | 
|  | +# define ILL_ILLTRP	ILL_ILLTRP | 
|  | +  ILL_PRVOPC,			/* Privileged opcode.  */ | 
|  | +# define ILL_PRVOPC	ILL_PRVOPC | 
|  | +  ILL_PRVREG,			/* Privileged register.  */ | 
|  | +# define ILL_PRVREG	ILL_PRVREG | 
|  | +  ILL_COPROC,			/* Coprocessor error.  */ | 
|  | +# define ILL_COPROC	ILL_COPROC | 
|  | +  ILL_BADSTK			/* Internal stack error.  */ | 
|  | +# define ILL_BADSTK	ILL_BADSTK | 
|  | +}; | 
|  | + | 
|  | +/* `si_code' values for SIGFPE signal.  */ | 
|  | +enum | 
|  | +{ | 
|  | +  FPE_INTDIV = 1,		/* Integer divide by zero.  */ | 
|  | +# define FPE_INTDIV	FPE_INTDIV | 
|  | +  FPE_INTOVF,			/* Integer overflow.  */ | 
|  | +# define FPE_INTOVF	FPE_INTOVF | 
|  | +  FPE_FLTDIV,			/* Floating point divide by zero.  */ | 
|  | +# define FPE_FLTDIV	FPE_FLTDIV | 
|  | +  FPE_FLTOVF,			/* Floating point overflow.  */ | 
|  | +# define FPE_FLTOVF	FPE_FLTOVF | 
|  | +  FPE_FLTUND,			/* Floating point underflow.  */ | 
|  | +# define FPE_FLTUND	FPE_FLTUND | 
|  | +  FPE_FLTRES,			/* Floating point inexact result.  */ | 
|  | +# define FPE_FLTRES	FPE_FLTRES | 
|  | +  FPE_FLTINV,			/* Floating point invalid operation.  */ | 
|  | +# define FPE_FLTINV	FPE_FLTINV | 
|  | +  FPE_FLTSUB			/* Subscript out of range.  */ | 
|  | +# define FPE_FLTSUB	FPE_FLTSUB | 
|  | +}; | 
|  | + | 
|  | +/* `si_code' values for SIGSEGV signal.  */ | 
|  | +enum | 
|  | +{ | 
|  | +  SEGV_MAPERR = 1,		/* Address not mapped to object.  */ | 
|  | +# define SEGV_MAPERR	SEGV_MAPERR | 
|  | +  SEGV_ACCERR			/* Invalid permissions for mapped object.  */ | 
|  | +# define SEGV_ACCERR	SEGV_ACCERR | 
|  | +}; | 
|  | + | 
|  | +/* `si_code' values for SIGBUS signal.  */ | 
|  | +enum | 
|  | +{ | 
|  | +  BUS_ADRALN = 1,		/* Invalid address alignment.  */ | 
|  | +# define BUS_ADRALN	BUS_ADRALN | 
|  | +  BUS_ADRERR,			/* Non-existant physical address.  */ | 
|  | +# define BUS_ADRERR	BUS_ADRERR | 
|  | +  BUS_OBJERR			/* Object specific hardware error.  */ | 
|  | +# define BUS_OBJERR	BUS_OBJERR | 
|  | +}; | 
|  | + | 
|  | +/* `si_code' values for SIGTRAP signal.  */ | 
|  | +enum | 
|  | +{ | 
|  | +  TRAP_BRKPT = 1,		/* Process breakpoint.  */ | 
|  | +# define TRAP_BRKPT	TRAP_BRKPT | 
|  | +  TRAP_TRACE			/* Process trace trap.  */ | 
|  | +# define TRAP_TRACE	TRAP_TRACE | 
|  | +}; | 
|  | + | 
|  | +/* `si_code' values for SIGCHLD signal.  */ | 
|  | +enum | 
|  | +{ | 
|  | +  CLD_EXITED = 1,		/* Child has exited.  */ | 
|  | +# define CLD_EXITED	CLD_EXITED | 
|  | +  CLD_KILLED,			/* Child was killed.  */ | 
|  | +# define CLD_KILLED	CLD_KILLED | 
|  | +  CLD_DUMPED,			/* Child terminated abnormally.  */ | 
|  | +# define CLD_DUMPED	CLD_DUMPED | 
|  | +  CLD_TRAPPED,			/* Traced child has trapped.  */ | 
|  | +# define CLD_TRAPPED	CLD_TRAPPED | 
|  | +  CLD_STOPPED,			/* Child has stopped.  */ | 
|  | +# define CLD_STOPPED	CLD_STOPPED | 
|  | +  CLD_CONTINUED			/* Stopped child has continued.  */ | 
|  | +# define CLD_CONTINUED	CLD_CONTINUED | 
|  | +}; | 
|  | + | 
|  | +/* `si_code' values for SIGPOLL signal.  */ | 
|  | +enum | 
|  | +{ | 
|  | +  POLL_IN = 1,			/* Data input available.  */ | 
|  | +# define POLL_IN	POLL_IN | 
|  | +  POLL_OUT,			/* Output buffers available.  */ | 
|  | +# define POLL_OUT	POLL_OUT | 
|  | +  POLL_MSG,			/* Input message available.   */ | 
|  | +# define POLL_MSG	POLL_MSG | 
|  | +  POLL_ERR,			/* I/O error.  */ | 
|  | +# define POLL_ERR	POLL_ERR | 
|  | +  POLL_PRI,			/* High priority input available.  */ | 
|  | +# define POLL_PRI	POLL_PRI | 
|  | +  POLL_HUP			/* Device disconnected.  */ | 
|  | +# define POLL_HUP	POLL_HUP | 
|  | +}; | 
|  | + | 
|  | +# undef __need_siginfo_t | 
|  | +#endif	/* !have siginfo_t && (have _SIGNAL_H || need siginfo_t).  */ | 
|  | + | 
|  | + | 
|  | +#if (defined _SIGNAL_H || defined __need_sigevent_t) \ | 
|  | +    && !defined __have_sigevent_t | 
|  | +# define __have_sigevent_t	1 | 
|  | + | 
|  | +/* Structure to transport application-defined values with signals.  */ | 
|  | +# define __SIGEV_MAX_SIZE	64 | 
|  | +# if __WORDSIZE == 64 | 
|  | +#  define __SIGEV_PAD_SIZE	((__SIGEV_MAX_SIZE / sizeof (int)) - 4) | 
|  | +# else | 
|  | +#  define __SIGEV_PAD_SIZE	((__SIGEV_MAX_SIZE / sizeof (int)) - 3) | 
|  | +# endif | 
|  | + | 
|  | +typedef struct sigevent | 
|  | +  { | 
|  | +    sigval_t sigev_value; | 
|  | +    int sigev_signo; | 
|  | +    int sigev_notify; | 
|  | + | 
|  | +    union | 
|  | +      { | 
|  | +	int _pad[__SIGEV_PAD_SIZE]; | 
|  | + | 
|  | +	/* When SIGEV_SIGNAL and SIGEV_THREAD_ID set, LWP ID of the | 
|  | +	   thread to receive the signal.  */ | 
|  | +	__pid_t _tid; | 
|  | + | 
|  | +	struct | 
|  | +	  { | 
|  | +	    void (*_function) (sigval_t);	/* Function to start.  */ | 
|  | +	    void *_attribute;			/* Really pthread_attr_t.  */ | 
|  | +	  } _sigev_thread; | 
|  | +      } _sigev_un; | 
|  | +  } sigevent_t; | 
|  | + | 
|  | +/* POSIX names to access some of the members.  */ | 
|  | +# define sigev_notify_function   _sigev_un._sigev_thread._function | 
|  | +# define sigev_notify_attributes _sigev_un._sigev_thread._attribute | 
|  | + | 
|  | +/* `sigev_notify' values.  */ | 
|  | +enum | 
|  | +{ | 
|  | +  SIGEV_SIGNAL = 0,		/* Notify via signal.  */ | 
|  | +# define SIGEV_SIGNAL	SIGEV_SIGNAL | 
|  | +  SIGEV_NONE,			/* Other notification: meaningless.  */ | 
|  | +# define SIGEV_NONE	SIGEV_NONE | 
|  | +  SIGEV_THREAD,			/* Deliver via thread creation.  */ | 
|  | +# define SIGEV_THREAD	SIGEV_THREAD | 
|  | + | 
|  | +  SIGEV_THREAD_ID = 4		/* Send signal to specific thread.  */ | 
|  | +#define SIGEV_THREAD_ID	SIGEV_THREAD_ID | 
|  | +}; | 
|  | + | 
|  | +#endif	/* have _SIGNAL_H.  */ | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/bits/signum.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/bits/signum.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/bits/signum.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/bits/signum.h	2014-12-09 16:55:03.172727878 -0800 | 
|  | @@ -0,0 +1,121 @@ | 
|  | +/* Signal number definitions.  Linux version. | 
|  | +   Copyright (C) 1995, 1997, 1998 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifdef	_SIGNAL_H | 
|  | + | 
|  | +/* Fake signal functions.  */ | 
|  | +#define SIG_ERR ((__sighandler_t) -1)		/* Error return.  */ | 
|  | +#define SIG_DFL ((__sighandler_t) 0)		/* Default action.  */ | 
|  | +#define SIG_IGN ((__sighandler_t) 1)		/* Ignore signal.  */ | 
|  | + | 
|  | +#ifdef __USE_UNIX98 | 
|  | +# define SIG_HOLD	((__sighandler_t) 2)	/* Add signal to hold mask.  */ | 
|  | +#endif | 
|  | + | 
|  | +#define SIGEMT		0 | 
|  | +#define SIGHUP		 1 | 
|  | +#define SIGINT		 2 | 
|  | +#define SIGQUIT		 3 | 
|  | +#define SIGILL		 4 | 
|  | +#define SIGTRAP		 5 | 
|  | +#define SIGABRT		 6 | 
|  | +#define SIGIOT		 6 | 
|  | +#define SIGBUS		 7 | 
|  | +#define SIGFPE		 8 | 
|  | +#define SIGKILL		 9 | 
|  | +#define SIGUSR1		10 | 
|  | +#define SIGSEGV		11 | 
|  | +#define SIGUSR2		12 | 
|  | +#define SIGPIPE		13 | 
|  | +#define SIGALRM		14 | 
|  | +#define SIGTERM		15 | 
|  | +#define SIGSTKFLT	16 | 
|  | +#define SIGCHLD		17 | 
|  | +#define SIGCLD		SIGCHLD | 
|  | +#define SIGCONT		18 | 
|  | +#define SIGSTOP		19 | 
|  | +#define SIGTSTP		20 | 
|  | +#define SIGTTIN		21 | 
|  | +#define SIGTTOU		22 | 
|  | +#define SIGURG		23 | 
|  | +#define SIGXCPU		24 | 
|  | +#define SIGXFSZ		25 | 
|  | +#define SIGVTALRM	26 | 
|  | +#define SIGPROF		27 | 
|  | +#define SIGWINCH	28 | 
|  | +#define SIGIO		29 | 
|  | +#define SIGPOLL		SIGIO | 
|  | +/* | 
|  | +#define SIGLOST		29 | 
|  | +*/ | 
|  | +#define SIGPWR		30 | 
|  | +#define SIGSYS		31 | 
|  | + | 
|  | + | 
|  | + | 
|  | +#if 0 | 
|  | +#define SIGHUP		 1	/* Hangup (POSIX).  */ | 
|  | +#define SIGINT		 2	/* Interrupt (ANSI).  */ | 
|  | +#define SIGQUIT		 3	/* Quit (POSIX).  */ | 
|  | +#define SIGILL		 4	/* Illegal instruction (ANSI).  */ | 
|  | +#define SIGTRAP		 5	/* Trace trap (POSIX).  */ | 
|  | +#define SIGIOT		 6	/* IOT trap (4.2 BSD).  */ | 
|  | +#define SIGABRT		 SIGIOT	/* Abort (ANSI).  */ | 
|  | +#define SIGEMT		 7 | 
|  | +#define SIGFPE		 8	/* Floating-point exception (ANSI).  */ | 
|  | +#define SIGKILL		 9	/* Kill, unblockable (POSIX).  */ | 
|  | +#define SIGBUS		10	/* BUS error (4.2 BSD).  */ | 
|  | +#define SIGSEGV		11	/* Segmentation violation (ANSI).  */ | 
|  | +#define SIGSYS		12 | 
|  | +#define SIGPIPE		13	/* Broken pipe (POSIX).  */ | 
|  | +#define SIGALRM		14	/* Alarm clock (POSIX).  */ | 
|  | +#define SIGTERM		15	/* Termination (ANSI).  */ | 
|  | +#define SIGUSR1		16	/* User-defined signal 1 (POSIX).  */ | 
|  | +#define SIGUSR2		17	/* User-defined signal 2 (POSIX).  */ | 
|  | +#define SIGCHLD		18	/* Child status has changed (POSIX).  */ | 
|  | +#define SIGCLD		SIGCHLD	/* Same as SIGCHLD (System V).  */ | 
|  | +#define SIGPWR		19	/* Power failure restart (System V).  */ | 
|  | +#define SIGWINCH	20	/* Window size change (4.3 BSD, Sun).  */ | 
|  | +#define SIGURG		21	/* Urgent condition on socket (4.2 BSD).  */ | 
|  | +#define SIGIO		22	/* I/O now possible (4.2 BSD).  */ | 
|  | +#define SIGPOLL		SIGIO	/* Pollable event occurred (System V).  */ | 
|  | +#define SIGSTOP		23	/* Stop, unblockable (POSIX).  */ | 
|  | +#define SIGTSTP		24	/* Keyboard stop (POSIX).  */ | 
|  | +#define SIGCONT		25	/* Continue (POSIX).  */ | 
|  | +#define SIGTTIN		26	/* Background read from tty (POSIX).  */ | 
|  | +#define SIGTTOU		27	/* Background write to tty (POSIX).  */ | 
|  | +#define SIGVTALRM	28	/* Virtual alarm clock (4.2 BSD).  */ | 
|  | +#define SIGPROF		29	/* Profiling alarm clock (4.2 BSD).  */ | 
|  | +#define SIGXCPU		30	/* CPU limit exceeded (4.2 BSD).  */ | 
|  | +#define SIGXFSZ		31	/* File size limit exceeded (4.2 BSD).  */ | 
|  | +#endif | 
|  | + | 
|  | + | 
|  | +#define _NSIG		128	/* Biggest signal number + 1 | 
|  | +				   (including real-time signals).  */ | 
|  | + | 
|  | +#define SIGRTMIN	(__libc_current_sigrtmin ()) | 
|  | +#define SIGRTMAX	(__libc_current_sigrtmax ()) | 
|  | + | 
|  | +/* These are the hard limits of the kernel.  These values should not be | 
|  | +   used directly at user level.  */ | 
|  | +#define __SIGRTMIN	32 | 
|  | +#define __SIGRTMAX	(_NSIG - 1) | 
|  | + | 
|  | +#endif	/* <signal.h> included.  */ | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/bits/sigstack.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/bits/sigstack.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/bits/sigstack.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/bits/sigstack.h	2014-12-09 16:55:03.172727878 -0800 | 
|  | @@ -0,0 +1,55 @@ | 
|  | +/* sigstack, sigaltstack definitions. | 
|  | +   Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | + | 
|  | +   The GNU C Library is free software; you can redistribute it and/or | 
|  | +   modify it under the terms of the GNU 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef _SIGNAL_H | 
|  | +# error "Never include this file directly.  Use <signal.h> instead" | 
|  | +#endif | 
|  | + | 
|  | + | 
|  | +/* Structure describing a signal stack (obsolete).  */ | 
|  | +struct sigstack | 
|  | +  { | 
|  | +    void *ss_sp;		/* Signal stack pointer.  */ | 
|  | +    int ss_onstack;		/* Nonzero if executing on this stack.  */ | 
|  | +  }; | 
|  | + | 
|  | + | 
|  | +/* Possible values for `ss_flags.'.  */ | 
|  | +enum | 
|  | +{ | 
|  | +  SS_ONSTACK = 1, | 
|  | +#define SS_ONSTACK	SS_ONSTACK | 
|  | +  SS_DISABLE | 
|  | +#define SS_DISABLE	SS_DISABLE | 
|  | +}; | 
|  | + | 
|  | +/* Minimum stack size for a signal handler.  */ | 
|  | +#define MINSIGSTKSZ	2048 | 
|  | + | 
|  | +/* System default stack size.  */ | 
|  | +#define SIGSTKSZ	8192 | 
|  | + | 
|  | + | 
|  | +/* Alternate, preferred interface.  */ | 
|  | +typedef struct sigaltstack | 
|  | +  { | 
|  | +    void *ss_sp; | 
|  | +    size_t ss_size; | 
|  | +    int ss_flags; | 
|  | +  } stack_t; | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/bits/statfs.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/bits/statfs.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/bits/statfs.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/bits/statfs.h	2014-12-09 16:55:03.172727878 -0800 | 
|  | @@ -0,0 +1,74 @@ | 
|  | +/* Copyright (C) 1997, 2000, 2010 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef _SYS_STATFS_H | 
|  | +# error "Never include <bits/statfs.h> directly; use <sys/statfs.h> instead." | 
|  | +#endif | 
|  | + | 
|  | +#include <bits/types.h>  /* for __fsid_t and __fsblkcnt_t*/ | 
|  | + | 
|  | +struct statfs | 
|  | +  { | 
|  | +    long int f_type; | 
|  | +#define f_fstyp f_type | 
|  | +    long int f_bsize; | 
|  | +    long int f_frsize;	/* Fragment size - unsupported */ | 
|  | +#ifndef __USE_FILE_OFFSET64 | 
|  | +    __fsblkcnt_t f_blocks; | 
|  | +    __fsblkcnt_t f_bfree; | 
|  | +    __fsblkcnt_t f_files; | 
|  | +    __fsblkcnt_t f_ffree; | 
|  | +    __fsblkcnt_t f_bavail; | 
|  | +#else | 
|  | +    __fsblkcnt64_t f_blocks; | 
|  | +    __fsblkcnt64_t f_bfree; | 
|  | +    __fsblkcnt64_t f_files; | 
|  | +    __fsblkcnt64_t f_ffree; | 
|  | +    __fsblkcnt64_t f_bavail; | 
|  | +#endif | 
|  | + | 
|  | +	/* Linux specials */ | 
|  | +    __fsid_t f_fsid; | 
|  | +    long int f_namelen; | 
|  | +    long int f_flags; | 
|  | +    long int f_spare[5]; | 
|  | +  }; | 
|  | + | 
|  | +#ifdef __USE_LARGEFILE64 | 
|  | +struct statfs64 | 
|  | +  { | 
|  | +    long int f_type; | 
|  | +#define f_fstyp f_type | 
|  | +    long int f_bsize; | 
|  | +    long int f_frsize;	/* Fragment size - unsupported */ | 
|  | +    __fsblkcnt64_t f_blocks; | 
|  | +    __fsblkcnt64_t f_bfree; | 
|  | +    __fsblkcnt64_t f_files; | 
|  | +    __fsblkcnt64_t f_ffree; | 
|  | +    __fsblkcnt64_t f_bavail; | 
|  | + | 
|  | +	/* Linux specials */ | 
|  | +    __fsid_t f_fsid; | 
|  | +    long int f_namelen; | 
|  | +    long int f_flags; | 
|  | +    long int f_spare[5]; | 
|  | +  }; | 
|  | +#endif | 
|  | + | 
|  | +/* Tell code we have these members.  */ | 
|  | +#define _STATFS_F_NAMELEN | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/bits/termios.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/bits/termios.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/bits/termios.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/bits/termios.h	2014-12-09 16:55:03.172727878 -0800 | 
|  | @@ -0,0 +1,221 @@ | 
|  | +/* termios type and macro definitions.  Linux/MIPS version. | 
|  | +   Copyright (C) 1993, 94, 95, 96, 97, 99, 2010 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef _TERMIOS_H | 
|  | +# error "Never include <bits/termios.h> directly; use <termios.h> instead." | 
|  | +#endif | 
|  | + | 
|  | +typedef unsigned char	cc_t; | 
|  | +typedef unsigned int	speed_t; | 
|  | +typedef unsigned int	tcflag_t; | 
|  | + | 
|  | +#define NCCS 32 | 
|  | +struct termios | 
|  | +  { | 
|  | +    tcflag_t c_iflag;		/* input mode flags */ | 
|  | +    tcflag_t c_oflag;		/* output mode flags */ | 
|  | +    tcflag_t c_cflag;		/* control mode flags */ | 
|  | +    tcflag_t c_lflag;		/* local mode flags */ | 
|  | +    cc_t c_line;		/* line discipline */ | 
|  | +    cc_t c_cc[NCCS];		/* control characters */ | 
|  | +  }; | 
|  | + | 
|  | +/* c_cc characters */ | 
|  | +#define VINTR		0	/* Interrupt character [ISIG].  */ | 
|  | +#define VQUIT		1	/* Quit character [ISIG].  */ | 
|  | +#define VERASE		2	/* Erase character [ICANON].  */ | 
|  | +#define VKILL		3	/* Kill-line character [ICANON].  */ | 
|  | +#define VMIN		4	/* Minimum number of bytes read at once [!ICANON].  */ | 
|  | +#define VTIME		5	/* Time-out value (tenths of a second) [!ICANON].  */ | 
|  | +#define VEOL2		6	/* Second EOL character [ICANON].  */ | 
|  | +#define VSWTC		7 | 
|  | +#define VSWTCH		VSWTC | 
|  | +#define VSTART		8	/* Start (X-ON) character [IXON, IXOFF].  */ | 
|  | +#define VSTOP		9	/* Stop (X-OFF) character [IXON, IXOFF].  */ | 
|  | +#define VSUSP		10	/* Suspend character [ISIG].  */ | 
|  | +				/* VDSUSP is not supported on Linux. */ | 
|  | +/* #define VDSUSP	11	/ * Delayed suspend character [ISIG].  */ | 
|  | +#define VREPRINT	12	/* Reprint-line character [ICANON].  */ | 
|  | +#define VDISCARD	13	/* Discard character [IEXTEN].  */ | 
|  | +#define VWERASE		14	/* Word-erase character [ICANON].  */ | 
|  | +#define VLNEXT		15	/* Literal-next character [IEXTEN].  */ | 
|  | +#define VEOF		16	/* End-of-file character [ICANON].  */ | 
|  | +#define VEOL		17	/* End-of-line character [ICANON].  */ | 
|  | + | 
|  | +/* c_iflag bits */ | 
|  | +#define IGNBRK	0000001		/* Ignore break condition.  */ | 
|  | +#define BRKINT	0000002		/* Signal interrupt on break.  */ | 
|  | +#define IGNPAR	0000004		/* Ignore characters with parity errors.  */ | 
|  | +#define PARMRK	0000010		/* Mark parity and framing errors.  */ | 
|  | +#define INPCK	0000020		/* Enable input parity check.  */ | 
|  | +#define ISTRIP	0000040		/* Strip 8th bit off characters.  */ | 
|  | +#define INLCR	0000100		/* Map NL to CR on input.  */ | 
|  | +#define IGNCR	0000200		/* Ignore CR.  */ | 
|  | +#define ICRNL	0000400		/* Map CR to NL on input.  */ | 
|  | +#define IUCLC	0001000		/* Map upper case to lower case on input.  */ | 
|  | +#define IXON	0002000		/* Enable start/stop output control.  */ | 
|  | +#define IXANY	0004000		/* Any character will restart after stop.  */ | 
|  | +#define IXOFF	0010000		/* Enable start/stop input control.  */ | 
|  | +#define IMAXBEL 0020000		/* Ring bell when input queue is full.  */ | 
|  | +#define IUTF8	0040000		/* Input is UTF8.  */ | 
|  | + | 
|  | +/* c_oflag bits */ | 
|  | +#define OPOST	0000001		/* Perform output processing.  */ | 
|  | +#define OLCUC	0000002		/* Map lower case to upper case on output.  */ | 
|  | +#define ONLCR	0000004		/* Map NL to CR-NL on output.  */ | 
|  | +#define OCRNL	0000010 | 
|  | +#define ONOCR	0000020 | 
|  | +#define ONLRET	0000040 | 
|  | +#define OFILL	0000100 | 
|  | +#define OFDEL	0000200 | 
|  | +#if defined __USE_MISC || defined __USE_XOPEN | 
|  | +# define NLDLY	0000400 | 
|  | +# define   NL0	0000000 | 
|  | +# define   NL1	0000400 | 
|  | +# define CRDLY	0003000 | 
|  | +# define   CR0	0000000 | 
|  | +# define   CR1	0001000 | 
|  | +# define   CR2	0002000 | 
|  | +# define   CR3	0003000 | 
|  | +# define TABDLY	0014000 | 
|  | +# define   TAB0	0000000 | 
|  | +# define   TAB1	0004000 | 
|  | +# define   TAB2	0010000 | 
|  | +# define   TAB3	0014000 | 
|  | +# define BSDLY	0020000 | 
|  | +# define   BS0	0000000 | 
|  | +# define   BS1	0020000 | 
|  | +# define FFDLY	0100000 | 
|  | +# define   FF0	0000000 | 
|  | +# define   FF1	0100000 | 
|  | +#endif | 
|  | + | 
|  | +#define VTDLY	0040000 | 
|  | +#define   VT0	0000000 | 
|  | +#define   VT1	0040000 | 
|  | + | 
|  | +#ifdef __USE_MISC | 
|  | +# define XTABS  0014000 | 
|  | +#endif | 
|  | + | 
|  | +/* c_cflag bit meaning */ | 
|  | +#ifdef __USE_MISC | 
|  | +# define CBAUD	0010017 | 
|  | +#endif | 
|  | +#define  B0	0000000		/* hang up */ | 
|  | +#define  B50	0000001 | 
|  | +#define  B75	0000002 | 
|  | +#define  B110	0000003 | 
|  | +#define  B134	0000004 | 
|  | +#define  B150	0000005 | 
|  | +#define  B200	0000006 | 
|  | +#define  B300	0000007 | 
|  | +#define  B600	0000010 | 
|  | +#define  B1200	0000011 | 
|  | +#define  B1800	0000012 | 
|  | +#define  B2400	0000013 | 
|  | +#define  B4800	0000014 | 
|  | +#define  B9600	0000015 | 
|  | +#define  B19200	0000016 | 
|  | +#define  B38400	0000017 | 
|  | +#ifdef __USE_MISC | 
|  | +# define EXTA B19200 | 
|  | +# define EXTB B38400 | 
|  | +#endif | 
|  | +#define CSIZE	0000060		/* Number of bits per byte (mask).  */ | 
|  | +#define   CS5	0000000		/* 5 bits per byte.  */ | 
|  | +#define   CS6	0000020		/* 6 bits per byte.  */ | 
|  | +#define   CS7	0000040		/* 7 bits per byte.  */ | 
|  | +#define   CS8	0000060		/* 8 bits per byte.  */ | 
|  | +#define CSTOPB	0000100		/* Two stop bits instead of one.  */ | 
|  | +#define CREAD	0000200		/* Enable receiver.  */ | 
|  | +#define PARENB	0000400		/* Parity enable.  */ | 
|  | +#define PARODD	0001000		/* Odd parity instead of even.  */ | 
|  | +#define HUPCL	0002000		/* Hang up on last close.  */ | 
|  | +#define CLOCAL	0004000		/* Ignore modem status lines.  */ | 
|  | +#ifdef __USE_MISC | 
|  | +# define CBAUDEX   0010000 | 
|  | +#endif | 
|  | +#define  B57600   0010001 | 
|  | +#define  B115200  0010002 | 
|  | +#define  B230400  0010003 | 
|  | +#define  B460800  0010004 | 
|  | +#define  B500000  0010005 | 
|  | +#define  B576000  0010006 | 
|  | +#define  B921600  0010007 | 
|  | +#define  B1000000 0010010 | 
|  | +#define  B1152000 0010011 | 
|  | +#define  B1500000 0010012 | 
|  | +#define  B2000000 0010013 | 
|  | +#define  B2500000 0010014 | 
|  | +#define  B3000000 0010015 | 
|  | +#define  B3500000 0010016 | 
|  | +#define  B4000000 0010017 | 
|  | +#define __MAX_BAUD B4000000 | 
|  | +#ifdef __USE_MISC | 
|  | +# define CIBAUD	  002003600000	/* input baud rate (not used) */ | 
|  | +# define CRTSCTS  020000000000		/* flow control */ | 
|  | +#endif | 
|  | + | 
|  | +/* c_lflag bits */ | 
|  | +#define ISIG	0000001		/* Enable signals.  */ | 
|  | +#define ICANON	0000002		/* Do erase and kill processing.  */ | 
|  | +#if defined __USE_MISC || defined __USE_XOPEN | 
|  | +# define XCASE	0000004 | 
|  | +#endif | 
|  | +#define ECHO	0000010		/* Enable echo.  */ | 
|  | +#define ECHOE	0000020		/* Visual erase for ERASE.  */ | 
|  | +#define ECHOK	0000040		/* Echo NL after KILL.  */ | 
|  | +#define ECHONL	0000100		/* Echo NL even if ECHO is off.  */ | 
|  | +#define NOFLSH	0000200		/* Disable flush after interrupt.  */ | 
|  | +#define IEXTEN	0000400		/* Enable DISCARD and LNEXT.  */ | 
|  | +#ifdef __USE_MISC | 
|  | +# define ECHOCTL 0001000	/* Echo control characters as ^X.  */ | 
|  | +# define ECHOPRT 0002000	/* Hardcopy visual erase.  */ | 
|  | +# define ECHOKE	 0004000	/* Visual erase for KILL.  */ | 
|  | +# define FLUSHO	0020000 | 
|  | +# define PENDIN	0040000		/* Retype pending input (state).  */ | 
|  | +#endif | 
|  | +#define TOSTOP	0100000		/* Send SIGTTOU for background output.  */ | 
|  | +#define ITOSTOP	TOSTOP | 
|  | +#ifdef __USE_BSD | 
|  | +# define EXTPROC 0200000 | 
|  | +#endif | 
|  | + | 
|  | +/* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */ | 
|  | +#define TIOCSER_TEMT    0x01	/* Transmitter physically empty */ | 
|  | + | 
|  | +/* tcflow() and TCXONC use these */ | 
|  | +#define	TCOOFF		0	/* Suspend output.  */ | 
|  | +#define	TCOON		1	/* Restart suspended output.  */ | 
|  | +#define	TCIOFF		2	/* Send a STOP character.  */ | 
|  | +#define	TCION		3	/* Send a START character.  */ | 
|  | + | 
|  | +/* tcflush() and TCFLSH use these */ | 
|  | +#define	TCIFLUSH	0	/* Discard data received but not yet read.  */ | 
|  | +#define	TCOFLUSH	1	/* Discard data written but not yet sent.  */ | 
|  | +#define	TCIOFLUSH	2	/* Discard all pending data.  */ | 
|  | + | 
|  | +/* tcsetattr uses these */ | 
|  | +#define	TCSANOW		0x540e	/* Same as TCSETS; change immediately.  */ | 
|  | +#define	TCSADRAIN	0x540f	/* Same as TCSETSW; change when pending output is written.  */ | 
|  | +#define	TCSAFLUSH	0x5410	/* Same as TCSETSF; flush pending input before changing.  */ | 
|  | + | 
|  | +#define _IOT_termios /* Hurd ioctl type field.  */ \ | 
|  | +  _IOT (_IOTS (cflag_t), 4, _IOTS (cc_t), NCCS, _IOTS (speed_t), 2) | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/brk.c glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/brk.c | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/brk.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/brk.c	2014-12-09 16:55:03.172727878 -0800 | 
|  | @@ -0,0 +1,60 @@ | 
|  | +/* brk system call for Linux/MIPS. | 
|  | +   Copyright (C) 2000, 2005, 2006 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <errno.h> | 
|  | +#include <unistd.h> | 
|  | +#include <sysdep.h> | 
|  | + | 
|  | +void *__curbrk = 0; | 
|  | + | 
|  | +/* Old braindamage in GCC's crtstuff.c requires this symbol in an attempt | 
|  | +   to work around different old braindamage in the old Linux/x86 ELF | 
|  | +   dynamic linker.  Sigh.  */ | 
|  | +weak_alias (__curbrk, ___brk_addr) | 
|  | + | 
|  | +int | 
|  | +__brk (void *addr) | 
|  | +{ | 
|  | +  void *newbrk; | 
|  | + | 
|  | +  { | 
|  | +    register long res asm ("v0"); | 
|  | +    register void*  arg asm ("a0"); | 
|  | + | 
|  | +    res = SYS_ify (brk); | 
|  | +    arg = addr; | 
|  | + | 
|  | +    asm ("syscall"		/* Perform the system call.  */ | 
|  | +	 : "+r" (res) | 
|  | +	 : "r" (arg) | 
|  | +	 : "a3", __SYSCALL_CLOBBERS); | 
|  | + | 
|  | +    newbrk = (void *) res; | 
|  | +  } | 
|  | +  __curbrk = newbrk; | 
|  | + | 
|  | +  if (newbrk < addr) | 
|  | +    { | 
|  | +      __set_errno (ENOMEM); | 
|  | +      return -1; | 
|  | +    } | 
|  | + | 
|  | +  return 0; | 
|  | +} | 
|  | +weak_alias (__brk, brk) | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/clone.S glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/clone.S | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/clone.S	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/clone.S	2014-12-09 16:55:03.172727878 -0800 | 
|  | @@ -0,0 +1,123 @@ | 
|  | +/* Copyright (C) 1996, 1997, 2000, 2003, 2005 Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by Ralf Baechle <ralf@linux-mips.org>, 1996. | 
|  | + | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +/* clone() is even more special than fork() as it mucks with stacks | 
|  | +   and invokes a function in the right context after its all over.  */ | 
|  | + | 
|  | +#include <sys/asm.h> | 
|  | +#include <sysdep.h> | 
|  | +#define _ERRNO_H	1 | 
|  | +#include <bits/errno.h> | 
|  | +#ifdef RESET_PID | 
|  | +#include <tls.h> | 
|  | +#include "tcb-offsets.h" | 
|  | +#endif | 
|  | + | 
|  | +#define CLONE_VM      0x00000100 | 
|  | +#define CLONE_THREAD  0x00010000 | 
|  | + | 
|  | +/* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg, | 
|  | +	     void *parent_tidptr, void *tls, void *child_tidptr) */ | 
|  | + | 
|  | +	.text | 
|  | +LEAF(__clone) | 
|  | + | 
|  | +	/* Sanity check arguments.  */ | 
|  | +	li		v0,EINVAL | 
|  | +	beqz		a0,L(error)	/* No NULL function pointers.  */ | 
|  | +	beqz		a1,L(error)	/* No NULL stack pointers.  */ | 
|  | + | 
|  | +	addi		a1,a1,-32		/* Reserve argument save space.  */ | 
|  | +	REG_S		a0,0(a1)	/* Save function pointer.  */ | 
|  | +	REG_S		a3,PTRSIZE(a1)	/* Save argument pointer.  */ | 
|  | +#ifdef RESET_PID | 
|  | +	REG_S		a2,(PTRSIZE*2)(a1)	/* Save clone flags.  */ | 
|  | +#endif | 
|  | + | 
|  | +	move		a0,a2 | 
|  | + | 
|  | +	/* Shuffle in the last three arguments - arguments 5, 6, and 7 to | 
|  | +	   this function, but arguments 3, 4, and 5 to the syscall.  */ | 
|  | +	move		a2,a4 | 
|  | +	move		a3,a5 | 
|  | +	move		a4,a6 | 
|  | + | 
|  | +	/* Do the system call */ | 
|  | +	li		v0,__NR_clone | 
|  | +	syscall | 
|  | + | 
|  | +	bnez		a3,L(error) | 
|  | +	beqz		v0,L(thread_start) | 
|  | + | 
|  | +	/* Successful return from the parent */ | 
|  | +	ret | 
|  | + | 
|  | +	/* Something bad happened -- no child created */ | 
|  | +L(error): | 
|  | +	j		__syscall_error | 
|  | +	END(__clone) | 
|  | + | 
|  | +/* Load up the arguments to the function.  Put this block of code in | 
|  | +   its own function so that we can terminate the stack trace with our | 
|  | +   debug info.  */ | 
|  | + | 
|  | +ENTRY(__thread_start) | 
|  | +L(thread_start): | 
|  | +	/* The stackframe has been created on entry of clone().  */ | 
|  | + | 
|  | +#ifdef RESET_PID | 
|  | +	/* Check and see if we need to reset the PID.  */ | 
|  | +	REG_L		a0,(PTRSIZE*2)(sp) | 
|  | +	li		a1,CLONE_THREAD | 
|  | +	and		a1,a0,a1 | 
|  | +	beqz		a1,L(restore_pid) | 
|  | +L(donepid): | 
|  | +#endif | 
|  | + | 
|  | +	/* Restore the arg for user's function.  */ | 
|  | +	REG_L		v0,0(sp)	/* Function pointer.  */ | 
|  | +	REG_L		a0,SZREG(sp)	/* Argument pointer.  */ | 
|  | + | 
|  | +	/* Call the user's function.  */ | 
|  | +	jalr		v0 | 
|  | + | 
|  | +	/* Call _exit rather than doing it inline for breakpoint purposes.  */ | 
|  | +	move		a0,v0 | 
|  | +	j		_exit | 
|  | + | 
|  | +#ifdef RESET_PID | 
|  | +L(restore_pid): | 
|  | +	and		a1,a0,CLONE_VM | 
|  | +	li		v0,-1 | 
|  | +	bnez		a1,L(gotpid) | 
|  | +	li		v0,__NR_getpid | 
|  | +	syscall | 
|  | +L(gotpid): | 
|  | +	lui		a0,%hi(PID_OFFSET) | 
|  | +	add		a0,a0,tp | 
|  | +	sw		v0,%lo(PID_OFFSET)(a0) | 
|  | +	lui		a0,%hi(PID_OFFSET) | 
|  | +	add		a0,a0,tp | 
|  | +	sw		v0,%lo(TID_OFFSET)(a0) | 
|  | +	b		L(donepid) | 
|  | +#endif | 
|  | + | 
|  | +	END(__thread_start) | 
|  | + | 
|  | +weak_alias (__clone, clone) | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/configure glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/configure | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/configure	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/configure	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1,28 @@ | 
|  | +# This file is generated from configure.in by Autoconf.  DO NOT EDIT! | 
|  | + # Local configure fragment for sysdeps/unix/sysv/linux/riscv. | 
|  | + | 
|  | +case "$prefix" in | 
|  | +/usr | /usr/) | 
|  | +  # 32-bit libraries on bi-arch platforms go in /lib32 instead of /lib. | 
|  | +  # Allow earlier configure scripts to handle libc_cv_slibdir, libdir, | 
|  | +  # and libc_cv_localedir. | 
|  | +  test -n "$libc_cv_slibdir" || \ | 
|  | +  case $machine in | 
|  | +  riscv/rv32* ) | 
|  | +    libc_cv_slibdir="/lib32" | 
|  | +    if test "$libdir" = '${exec_prefix}/lib'; then | 
|  | +      libdir='${exec_prefix}/lib32'; | 
|  | +      # Locale data can be shared between 32bit and 64bit libraries | 
|  | +      libc_cv_localedir='${exec_prefix}/lib/locale' | 
|  | +    fi | 
|  | +    ;; | 
|  | +  *) | 
|  | +    libc_cv_slibdir="/lib" | 
|  | +    ;; | 
|  | +  esac | 
|  | +esac | 
|  | + | 
|  | +if test -z "$arch_minimum_kernel"; then | 
|  | +  arch_minimum_kernel=2.4.1 | 
|  | +  libc_cv_gcc_unwind_find_fde=yes | 
|  | +fi | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/configure.in glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/configure.in | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/configure.in	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/configure.in	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1,29 @@ | 
|  | +sinclude(./aclocal.m4)dnl Autoconf lossage | 
|  | +GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory. | 
|  | +# Local configure fragment for sysdeps/unix/sysv/linux/riscv. | 
|  | + | 
|  | +case "$prefix" in | 
|  | +/usr | /usr/) | 
|  | +  # 32-bit libraries on bi-arch platforms go in /lib32 instead of /lib. | 
|  | +  # Allow earlier configure scripts to handle libc_cv_slibdir, libdir, | 
|  | +  # and libc_cv_localedir. | 
|  | +  test -n "$libc_cv_slibdir" || \ | 
|  | +  case $machine in | 
|  | +  riscv/rv32* ) | 
|  | +    libc_cv_slibdir="/lib32" | 
|  | +    if test "$libdir" = '${exec_prefix}/lib'; then | 
|  | +      libdir='${exec_prefix}/lib32'; | 
|  | +      # Locale data can be shared between 32bit and 64bit libraries | 
|  | +      libc_cv_localedir='${exec_prefix}/lib/locale' | 
|  | +    fi | 
|  | +    ;; | 
|  | +  *) | 
|  | +    libc_cv_slibdir="/lib" | 
|  | +    ;; | 
|  | +  esac | 
|  | +esac | 
|  | + | 
|  | +if test -z "$arch_minimum_kernel"; then | 
|  | +  arch_minimum_kernel=2.4.1 | 
|  | +  libc_cv_gcc_unwind_find_fde=yes | 
|  | +fi | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/dl-cache.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/dl-cache.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/dl-cache.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/dl-cache.h	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1,57 @@ | 
|  | +/* Support for reading /etc/ld.so.cache files written by Linux ldconfig. | 
|  | +   Copyright (C) 2003, 2007 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <ldconfig.h> | 
|  | + | 
|  | +/* Redefine the cache ID for new ABIs; o32 keeps using the generic check.  */ | 
|  | +#if _RISCV_SIM == _ABI64 | 
|  | +# define _DL_CACHE_DEFAULT_ID	(FLAG_MIPS64_LIBN64 | FLAG_ELF_LIBC6) | 
|  | +#elif _RISCV_SIM == _ABIN32 | 
|  | +# define _DL_CACHE_DEFAULT_ID	(FLAG_MIPS64_LIBN32 | FLAG_ELF_LIBC6) | 
|  | +#endif | 
|  | + | 
|  | +#ifdef _DL_CACHE_DEFAULT_ID | 
|  | +# define _dl_cache_check_flags(flags) \ | 
|  | +  ((flags) == _DL_CACHE_DEFAULT_ID) | 
|  | +#endif | 
|  | + | 
|  | +#define add_system_dir(dir) \ | 
|  | +  do								\ | 
|  | +    {								\ | 
|  | +      size_t len = strlen (dir);				\ | 
|  | +      char path[len + 3];					\ | 
|  | +      memcpy (path, dir, len + 1);				\ | 
|  | +      if (len >= 6						\ | 
|  | +	  && (! memcmp (path + len - 6, "/lib64", 6)		\ | 
|  | +	      || ! memcmp (path + len - 6, "/lib32", 6)))	\ | 
|  | +	{							\ | 
|  | +	  len -= 2;						\ | 
|  | +	  path[len] = '\0';					\ | 
|  | +	}							\ | 
|  | +      add_dir (path);						\ | 
|  | +      if (len >= 4 && ! memcmp (path + len - 4, "/lib", 4))	\ | 
|  | +	{							\ | 
|  | +	  memcpy (path + len, "32", 3);				\ | 
|  | +	  add_dir (path);					\ | 
|  | +	  memcpy (path + len, "64", 3);				\ | 
|  | +	  add_dir (path);					\ | 
|  | +	}							\ | 
|  | +    } while (0) | 
|  | + | 
|  | +#include_next <dl-cache.h> | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/dl-static.c glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/dl-static.c | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/dl-static.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/dl-static.c	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1,92 @@ | 
|  | +/* Variable initialization.  MIPS version. | 
|  | +   Copyright (C) 2001, 2002, 2003, 2005 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <ldsodefs.h> | 
|  | + | 
|  | +#ifdef SHARED | 
|  | + | 
|  | +void | 
|  | +_dl_var_init (void *array[]) | 
|  | +{ | 
|  | +  /* It has to match "variables" below. */ | 
|  | +  enum | 
|  | +    { | 
|  | +      DL_PAGESIZE = 0 | 
|  | +    }; | 
|  | + | 
|  | +  GLRO(dl_pagesize) = *((size_t *) array[DL_PAGESIZE]); | 
|  | +} | 
|  | + | 
|  | +#else | 
|  | +#include <bits/libc-lock.h> | 
|  | + | 
|  | +__libc_lock_define_initialized_recursive (static, _dl_static_lock) | 
|  | + | 
|  | +static void *variables[] = | 
|  | +{ | 
|  | +  &GLRO(dl_pagesize) | 
|  | +}; | 
|  | + | 
|  | +static void | 
|  | +_dl_unprotect_relro (struct link_map *l) | 
|  | +{ | 
|  | +  ElfW(Addr) start = ((l->l_addr + l->l_relro_addr) | 
|  | +		      & ~(GLRO(dl_pagesize) - 1)); | 
|  | +  ElfW(Addr) end = ((l->l_addr + l->l_relro_addr + l->l_relro_size) | 
|  | +		    & ~(GLRO(dl_pagesize) - 1)); | 
|  | + | 
|  | +  if (start != end) | 
|  | +    __mprotect ((void *) start, end - start, PROT_READ | PROT_WRITE); | 
|  | +} | 
|  | + | 
|  | +void | 
|  | +_dl_static_init (struct link_map *l) | 
|  | +{ | 
|  | +  struct link_map *rtld_map = l; | 
|  | +  struct r_scope_elem **scope; | 
|  | +  const ElfW(Sym) *ref = NULL; | 
|  | +  lookup_t loadbase; | 
|  | +  void (*f) (void *[]); | 
|  | +  size_t i; | 
|  | + | 
|  | +  __libc_lock_lock_recursive (_dl_static_lock); | 
|  | + | 
|  | +  loadbase = _dl_lookup_symbol_x ("_dl_var_init", l, &ref, l->l_local_scope, | 
|  | +				  NULL, 0, 1, NULL); | 
|  | + | 
|  | +  for (scope = l->l_local_scope; *scope != NULL; scope++) | 
|  | +    for (i = 0; i < (*scope)->r_nlist; i++) | 
|  | +      if ((*scope)->r_list[i] == loadbase) | 
|  | +	{ | 
|  | +	  rtld_map = (*scope)->r_list[i]; | 
|  | +	  break; | 
|  | +	} | 
|  | + | 
|  | +  if (ref != NULL) | 
|  | +    { | 
|  | +      f = (void (*) (void *[])) DL_SYMBOL_ADDRESS (loadbase, ref); | 
|  | +      _dl_unprotect_relro (rtld_map); | 
|  | +      f (variables); | 
|  | +      _dl_protect_relro (rtld_map); | 
|  | +    } | 
|  | + | 
|  | +  __libc_lock_unlock_recursive (_dl_static_lock); | 
|  | +} | 
|  | + | 
|  | +#endif | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/fcntl.c glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/fcntl.c | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/fcntl.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/fcntl.c	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1 @@ | 
|  | +#include <sysdeps/unix/sysv/linux/i386/fcntl.c> | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/ftruncate64.c glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/ftruncate64.c | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/ftruncate64.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/ftruncate64.c	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1,76 @@ | 
|  | +/* Copyright (C) 1997,1998,1999,2000,2001,2002,2003,2005,2006 | 
|  | +	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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <sys/types.h> | 
|  | +#include <errno.h> | 
|  | +#include <endian.h> | 
|  | +#include <unistd.h> | 
|  | + | 
|  | +#include <sysdep.h> | 
|  | +#include <sys/syscall.h> | 
|  | + | 
|  | +#include <kernel-features.h> | 
|  | + | 
|  | +#ifdef __NR_ftruncate64 | 
|  | +#ifndef __ASSUME_TRUNCATE64_SYSCALL | 
|  | +/* The variable is shared between all wrappers around *truncate64 calls.  */ | 
|  | +extern int __have_no_truncate64; | 
|  | +#endif | 
|  | + | 
|  | +/* Truncate the file FD refers to to LENGTH bytes.  */ | 
|  | +int | 
|  | +__ftruncate64 (int fd, off64_t length) | 
|  | +{ | 
|  | +#ifndef __ASSUME_TRUNCATE64_SYSCALL | 
|  | +  if (! __have_no_truncate64) | 
|  | +#endif | 
|  | +    { | 
|  | +      unsigned int low = length & 0xffffffff; | 
|  | +      unsigned int high = length >> 32; | 
|  | +#ifndef __ASSUME_TRUNCATE64_SYSCALL | 
|  | +      int saved_errno = errno; | 
|  | +#endif | 
|  | +      int result = INLINE_SYSCALL (ftruncate64, 4, fd, 0, | 
|  | +				   __LONG_LONG_PAIR (high, low)); | 
|  | +#ifndef __ASSUME_TRUNCATE64_SYSCALL | 
|  | +      if (result != -1 || errno != ENOSYS) | 
|  | +#endif | 
|  | +	return result; | 
|  | + | 
|  | +#ifndef __ASSUME_TRUNCATE64_SYSCALL | 
|  | +      __set_errno (saved_errno); | 
|  | +      __have_no_truncate64 = 1; | 
|  | +#endif | 
|  | +    } | 
|  | + | 
|  | +#ifndef __ASSUME_TRUNCATE64_SYSCALL | 
|  | +  if ((off_t) length != length) | 
|  | +    { | 
|  | +      __set_errno (EINVAL); | 
|  | +      return -1; | 
|  | +    } | 
|  | +  return __ftruncate (fd, (off_t) length); | 
|  | +#endif | 
|  | +} | 
|  | +weak_alias (__ftruncate64, ftruncate64) | 
|  | + | 
|  | +#else | 
|  | +/* Use the generic implementation.  */ | 
|  | +# include <misc/ftruncate64.c> | 
|  | +#endif | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/getcontext.S glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/getcontext.S | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/getcontext.S	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/getcontext.S	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1,91 @@ | 
|  | +/* Save current context. | 
|  | +   Copyright (C) 2009 Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by Maciej W. Rozycki <macro@codesourcery.com>. | 
|  | + | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA | 
|  | +   02110-1301, USA.  */ | 
|  | + | 
|  | +#include <sysdep.h> | 
|  | +#include <sys/asm.h> | 
|  | + | 
|  | +#include "ucontext_i.h" | 
|  | + | 
|  | +/* int getcontext (ucontext_t *ucp) */ | 
|  | + | 
|  | +	.text | 
|  | +LEAF (__getcontext) | 
|  | +	/* Store a magic flag.	*/ | 
|  | +	li	v1, 1 | 
|  | +	REG_S	v1, ( 0 * SZREG + MCONTEXT_GREGS)(a0)	/* zero */ | 
|  | + | 
|  | +	REG_S	ra, MCONTEXT_PC(a0) | 
|  | +	REG_S	ra, ( 1 * SZREG + MCONTEXT_GREGS)(a0) | 
|  | +	REG_S	s0, ( 2 * SZREG + MCONTEXT_GREGS)(a0) | 
|  | +	REG_S	s1, ( 3 * SZREG + MCONTEXT_GREGS)(a0) | 
|  | +	REG_S	s2, ( 4 * SZREG + MCONTEXT_GREGS)(a0) | 
|  | +	REG_S	s3, ( 5 * SZREG + MCONTEXT_GREGS)(a0) | 
|  | +	REG_S	s4, ( 6 * SZREG + MCONTEXT_GREGS)(a0) | 
|  | +	REG_S	s5, ( 7 * SZREG + MCONTEXT_GREGS)(a0) | 
|  | +	REG_S	s6, ( 8 * SZREG + MCONTEXT_GREGS)(a0) | 
|  | +	REG_S	s7, ( 9 * SZREG + MCONTEXT_GREGS)(a0) | 
|  | +	REG_S	s8, (10 * SZREG + MCONTEXT_GREGS)(a0) | 
|  | +	REG_S	s9, (11 * SZREG + MCONTEXT_GREGS)(a0) | 
|  | +	REG_S	s10,(12 * SZREG + MCONTEXT_GREGS)(a0) | 
|  | +	REG_S	s11,(13 * SZREG + MCONTEXT_GREGS)(a0) | 
|  | +	REG_S	sp, (14 * SZREG + MCONTEXT_GREGS)(a0) | 
|  | +	REG_S	tp, (15 * SZREG + MCONTEXT_GREGS)(a0) | 
|  | + | 
|  | +#ifdef __riscv_hard_float | 
|  | +  mffsr v1 | 
|  | + | 
|  | +	fsd	fs0, ( 0 * 8 + MCONTEXT_FPREGS)(a0) | 
|  | +	fsd	fs1, ( 1 * 8 + MCONTEXT_FPREGS)(a0) | 
|  | +	fsd	fs2, ( 2 * 8 + MCONTEXT_FPREGS)(a0) | 
|  | +	fsd	fs3, ( 3 * 8 + MCONTEXT_FPREGS)(a0) | 
|  | +	fsd	fs4, ( 4 * 8 + MCONTEXT_FPREGS)(a0) | 
|  | +	fsd	fs5, ( 5 * 8 + MCONTEXT_FPREGS)(a0) | 
|  | +	fsd	fs6, ( 6 * 8 + MCONTEXT_FPREGS)(a0) | 
|  | +	fsd	fs7, ( 7 * 8 + MCONTEXT_FPREGS)(a0) | 
|  | +	fsd	fs8, ( 8 * 8 + MCONTEXT_FPREGS)(a0) | 
|  | +	fsd	fs9, ( 9 * 8 + MCONTEXT_FPREGS)(a0) | 
|  | +	fsd	fs10,(10 * 8 + MCONTEXT_FPREGS)(a0) | 
|  | +	fsd	fs11,(11 * 8 + MCONTEXT_FPREGS)(a0) | 
|  | +	fsd	fs12,(12 * 8 + MCONTEXT_FPREGS)(a0) | 
|  | +	fsd	fs13,(13 * 8 + MCONTEXT_FPREGS)(a0) | 
|  | +	fsd	fs14,(14 * 8 + MCONTEXT_FPREGS)(a0) | 
|  | +	fsd	fs15,(15 * 8 + MCONTEXT_FPREGS)(a0) | 
|  | + | 
|  | +	sw	v1, MCONTEXT_FSR(a0) | 
|  | +#endif /* __mips_hard_float */ | 
|  | + | 
|  | +/* rt_sigprocmask (SIG_BLOCK, NULL, &ucp->uc_sigmask, _NSIG8) */ | 
|  | +	li	a3, _NSIG8 | 
|  | +	add     a2, a0, UCONTEXT_SIGMASK | 
|  | +	move	a1, zero | 
|  | +	li	a0, SIG_BLOCK | 
|  | + | 
|  | +	li	v0, SYS_ify (rt_sigprocmask) | 
|  | +	syscall | 
|  | +	bnez	a3, 99f | 
|  | + | 
|  | +	move	v0, zero | 
|  | +	ret | 
|  | + | 
|  | +99:	j	__syscall_error | 
|  | + | 
|  | +PSEUDO_END (__getcontext) | 
|  | + | 
|  | +weak_alias (__getcontext, getcontext) | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/getmsg.c glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/getmsg.c | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/getmsg.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/getmsg.c	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1 @@ | 
|  | +#include <sysdeps/unix/sysv/linux/i386/getmsg.c> | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/getsysstats.c glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/getsysstats.c | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/getsysstats.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/getsysstats.c	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1,37 @@ | 
|  | +/* Determine various system internal values, Linux/MIPS version. | 
|  | +   Copyright (C) 2001, 2009 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | + | 
|  | +/* We need to define a special parser for /proc/cpuinfo.  */ | 
|  | +#define GET_NPROCS_PARSER(FD, BUFFER, CP, RE, BUFFER_END, RESULT)	  \ | 
|  | +  do									  \ | 
|  | +    {									  \ | 
|  | +      (RESULT) = 0;							  \ | 
|  | +      /* Read all lines and count the lines starting with the string	  \ | 
|  | +	 "cpu model".  We don't have to fear extremely long lines since	  \ | 
|  | +	 the kernel will not generate them.  8192 bytes are really	  \ | 
|  | +	 enough.  */							  \ | 
|  | +      char *l;								  \ | 
|  | +      while ((l = next_line (FD, BUFFER, &CP, &RE, BUFFER_END)) != NULL)  \ | 
|  | +	if (strncmp (l, "cpu model", 9) == 0)				  \ | 
|  | +	  ++(RESULT);							  \ | 
|  | +    }									  \ | 
|  | +  while (0) | 
|  | + | 
|  | +#include <sysdeps/unix/sysv/linux/getsysstats.c> | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/Implies glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/Implies | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/Implies	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/Implies	2014-12-09 16:55:03.172727878 -0800 | 
|  | @@ -0,0 +1,2 @@ | 
|  | +# This needs to change to support rv32 | 
|  | +unix/sysv/linux/riscv/rv64 | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/ipc_priv.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/ipc_priv.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/ipc_priv.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/ipc_priv.h	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1 @@ | 
|  | +#include <sysdeps/unix/sysv/linux/powerpc/ipc_priv.h> | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/kernel-features.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/kernel-features.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/kernel-features.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/kernel-features.h	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1,46 @@ | 
|  | +/* Set flags signalling availability of kernel features based on given | 
|  | +   kernel version number. | 
|  | +   Copyright (C) 1999-2003, 2004, 2005, 2006 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <sgidefs.h> | 
|  | + | 
|  | +/* Linux 2.3.39 introduced 32bit UID/GIDs.  Some platforms had 32 | 
|  | +   bit type all along.  */ | 
|  | +#define __ASSUME_32BITUIDS		1 | 
|  | + | 
|  | +/* MIPS platforms had IPC64 all along.  */ | 
|  | +#define __ASSUME_IPC64		1 | 
|  | + | 
|  | +#if _RISCV_SIM == _ABIN32 | 
|  | +# define __ASSUME_FCNTL64		1 | 
|  | +#endif | 
|  | + | 
|  | +/* Support for the eventfd2 and signalfd4 syscalls was added in 2.6.27.  */ | 
|  | +#if __LINUX_KERNEL_VERSION >= 0x02061c | 
|  | +# define __ASSUME_EVENTFD2	1 | 
|  | +# define __ASSUME_SIGNALFD4	1 | 
|  | +#endif | 
|  | + | 
|  | +#include_next <kernel-features.h> | 
|  | + | 
|  | +/* The n32 syscall ABI did not have a getdents64 syscall until | 
|  | +   2.6.35.  */ | 
|  | +#if _RISCV_SIM == _ABIN32 && __LINUX_KERNEL_VERSION < 0x020623 | 
|  | +# undef __ASSUME_GETDENTS64_SYSCALL | 
|  | +#endif | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/kernel_rt_sigframe.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/kernel_rt_sigframe.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/kernel_rt_sigframe.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/kernel_rt_sigframe.h	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1,10 @@ | 
|  | +/* Linux kernel RT signal frame. */ | 
|  | +typedef struct kernel_rt_sigframe | 
|  | +  { | 
|  | +    uint32_t rs_ass[4]; | 
|  | +    uint32_t rs_code[2]; | 
|  | +    struct siginfo rs_info; | 
|  | +    struct ucontext rs_uc; | 
|  | +    uint32_t rs_altcode[8] __attribute__ ((__aligned__ (1 << 7))); | 
|  | +  } | 
|  | +kernel_rt_sigframe_t; | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/kernel_sigaction.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/kernel_sigaction.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/kernel_sigaction.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/kernel_sigaction.h	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1,40 @@ | 
|  | +/* This is the sigaction structure from the Linux 2.1.24 kernel.  */ | 
|  | + | 
|  | +#include <sgidefs.h> | 
|  | + | 
|  | +#define HAVE_SA_RESTORER | 
|  | + | 
|  | +struct old_kernel_sigaction { | 
|  | +	unsigned int	sa_flags; | 
|  | +	__sighandler_t	k_sa_handler; | 
|  | +	unsigned long	sa_mask; | 
|  | +	unsigned int    __pad0[3]; /* reserved, keep size constant */ | 
|  | + | 
|  | +	/* Abi says here follows reserved int[2] */ | 
|  | +	void		(*sa_restorer)(void); | 
|  | +#if (_RISCV_SZPTR < 64) | 
|  | +	/* | 
|  | +	 * For 32 bit code we have to pad struct sigaction to get | 
|  | +	 * constant size for the ABI | 
|  | +	 */ | 
|  | +	int		pad1[1]; /* reserved */ | 
|  | +#endif | 
|  | +}; | 
|  | + | 
|  | + | 
|  | +#define _KERNEL_NSIG	       128 | 
|  | +#define _KERNEL_NSIG_BPW       _RISCV_SZLONG | 
|  | +#define _KERNEL_NSIG_WORDS     (_KERNEL_NSIG / _KERNEL_NSIG_BPW) | 
|  | + | 
|  | +typedef struct { | 
|  | +	unsigned long sig[_KERNEL_NSIG_WORDS]; | 
|  | +} kernel_sigset_t; | 
|  | + | 
|  | +/* This is the sigaction structure from the Linux 2.1.68 kernel.  */ | 
|  | +struct kernel_sigaction { | 
|  | +	unsigned int	sa_flags; | 
|  | +	__sighandler_t	k_sa_handler; | 
|  | +	kernel_sigset_t	sa_mask; | 
|  | +	void		(*sa_restorer)(void); | 
|  | +	int		s_resv[1]; /* reserved */ | 
|  | +}; | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/kernel_stat.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/kernel_stat.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/kernel_stat.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/kernel_stat.h	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1,66 @@ | 
|  | +#ifndef __ASM_GENERIC_STAT_H | 
|  | +#define __ASM_GENERIC_STAT_H | 
|  | + | 
|  | +/* | 
|  | + * Everybody gets this wrong and has to stick with it for all | 
|  | + * eternity. Hopefully, this version gets used by new architectures | 
|  | + * so they don't fall into the same traps. | 
|  | + * | 
|  | + * stat64 is copied from powerpc64, with explicit padding added. | 
|  | + * stat is the same structure layout on 64-bit, without the 'long long' | 
|  | + * types. | 
|  | + * | 
|  | + * By convention, 64 bit architectures use the stat interface, while | 
|  | + * 32 bit architectures use the stat64 interface. Note that we don't | 
|  | + * provide an __old_kernel_stat here, which new architecture should | 
|  | + * not have to start with. | 
|  | + */ | 
|  | + | 
|  | +#ifdef _RISCV_SIM == _ABI64 | 
|  | + | 
|  | +#define STAT_HAVE_NSEC 1 | 
|  | + | 
|  | +struct kernel_stat { | 
|  | +	unsigned long	st_dev;		/* Device.  */ | 
|  | +	unsigned long	st_ino;		/* File serial number.  */ | 
|  | +	unsigned int	st_mode;	/* File mode.  */ | 
|  | +	unsigned int	st_nlink;	/* Link count.  */ | 
|  | +	unsigned int	st_uid;		/* User ID of the file's owner.  */ | 
|  | +	unsigned int	st_gid;		/* Group ID of the file's group. */ | 
|  | +	unsigned long	st_rdev;	/* Device number, if device.  */ | 
|  | +	unsigned long	__pad1; | 
|  | +	long		st_size;	/* Size of file, in bytes.  */ | 
|  | +	int		st_blksize;	/* Optimal block size for I/O.  */ | 
|  | +	int		__pad2; | 
|  | +	long		st_blocks;	/* Number 512-byte blocks allocated. */ | 
|  | +    struct timespec st_atim; | 
|  | +    struct timespec st_mtim; | 
|  | +    struct timespec st_ctim; | 
|  | +	unsigned int	__unused4; | 
|  | +	unsigned int	__unused5; | 
|  | +}; | 
|  | + | 
|  | +/* This matches struct stat64 in glibc2.1. Only used for 32 bit. */ | 
|  | +#else | 
|  | +struct kernel_stat { | 
|  | +	unsigned long long st_dev;	/* Device.  */ | 
|  | +	unsigned long long st_ino;	/* File serial number.  */ | 
|  | +	unsigned int	st_mode;	/* File mode.  */ | 
|  | +	unsigned int	st_nlink;	/* Link count.  */ | 
|  | +	unsigned int	st_uid;		/* User ID of the file's owner.  */ | 
|  | +	unsigned int	st_gid;		/* Group ID of the file's group. */ | 
|  | +	unsigned long long st_rdev;	/* Device number, if device.  */ | 
|  | +	unsigned long long __pad1; | 
|  | +	long long	st_size;	/* Size of file, in bytes.  */ | 
|  | +	int		st_blksize;	/* Optimal block size for I/O.  */ | 
|  | +	int		__pad2; | 
|  | +	long long	st_blocks;	/* Number 512-byte blocks allocated. */ | 
|  | +    struct timespec st_atim; | 
|  | +    struct timespec st_mtim; | 
|  | +    struct timespec st_ctim; | 
|  | +	unsigned int	__unused4; | 
|  | +	unsigned int	__unused5; | 
|  | +}; | 
|  | +#endif | 
|  | + | 
|  | +#endif /* __ASM_GENERIC_STAT_H */ | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/kernel_termios.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/kernel_termios.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/kernel_termios.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/kernel_termios.h	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1,35 @@ | 
|  | +/* Copyright (C) 1997 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef _KERNEL_TERMIOS_H | 
|  | +#define _KERNEL_TERMIOS_H 1 | 
|  | +/* The following corresponds to the values from the Linux 2.1.24 kernel.  */ | 
|  | + | 
|  | +#define __KERNEL_NCCS 23 | 
|  | + | 
|  | +struct __kernel_termios | 
|  | +  { | 
|  | +    tcflag_t c_iflag;		/* input mode flags */ | 
|  | +    tcflag_t c_oflag;		/* output mode flags */ | 
|  | +    tcflag_t c_cflag;		/* control mode flags */ | 
|  | +    tcflag_t c_lflag;		/* local mode flags */ | 
|  | +    cc_t c_line;		/* line discipline */ | 
|  | +    cc_t c_cc[__KERNEL_NCCS];	/* control characters */ | 
|  | +  }; | 
|  | + | 
|  | +#endif /* kernel_termios.h */ | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/ldsodefs.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/ldsodefs.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/ldsodefs.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/ldsodefs.h	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1,41 @@ | 
|  | +/* Run-time dynamic linker data structures for loaded ELF shared objects. MIPS. | 
|  | +   Copyright (C) 2001, 2003 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef	_LDSODEFS_H | 
|  | + | 
|  | +/* Get the real definitions.  */ | 
|  | +#include_next <ldsodefs.h> | 
|  | + | 
|  | +/* Now define our stuff.  */ | 
|  | + | 
|  | +/* We need special support to initialize DSO loaded for statically linked | 
|  | +   binaries.  */ | 
|  | +extern void _dl_static_init (struct link_map *map); | 
|  | +#undef DL_STATIC_INIT | 
|  | +#define DL_STATIC_INIT(map) _dl_static_init (map) | 
|  | + | 
|  | +/* Allow ABIVERSION == 1, meaning PLTs and copy relocations are | 
|  | +   required, with ELFOSABI_SYSV.  */ | 
|  | +#undef VALID_ELF_ABIVERSION | 
|  | +#define VALID_ELF_ABIVERSION(osabi,ver)			\ | 
|  | +  (ver == 0						\ | 
|  | +   || (osabi == ELFOSABI_SYSV && ver < 2)		\ | 
|  | +   || (osabi == ELFOSABI_LINUX && ver < LIBC_ABI_MAX)) | 
|  | + | 
|  | +#endif /* ldsodefs.h */ | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/libc-abis glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/libc-abis | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/libc-abis	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/libc-abis	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1,13 @@ | 
|  | +# See the copy of this file in libc for detailed explanations.  This | 
|  | +# copy needs to include all libc definitions applicable to MIPS; only | 
|  | +# one copy will be used. | 
|  | +# | 
|  | +# Feature Name	Configuration | 
|  | +# ------------	------------- | 
|  | +# | 
|  | +# MIPS PLTs. | 
|  | +MIPS_PLT	mips*-*-linux* | 
|  | +# | 
|  | +# Unique symbol definitions for C++. | 
|  | +# Architecture independent, all ELF targets (== all targets) | 
|  | +UNIQUE | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/lockf64.c glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/lockf64.c | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/lockf64.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/lockf64.c	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1 @@ | 
|  | +#include <sysdeps/unix/sysv/linux/i386/lockf64.c> | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/____longjmp_chk.S glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/____longjmp_chk.S | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/____longjmp_chk.S	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/____longjmp_chk.S	2014-12-09 16:55:03.172727878 -0800 | 
|  | @@ -0,0 +1,2 @@ | 
|  | +#define __longjmp ____longjmp_chk | 
|  | +#include <__longjmp.S> | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/makecontext.c glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/makecontext.c | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/makecontext.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/makecontext.c	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1,34 @@ | 
|  | +#include <sysdep.h> | 
|  | +#include <sys/asm.h> | 
|  | +#include <sys/ucontext.h> | 
|  | +#include <stdarg.h> | 
|  | + | 
|  | +void __makecontext (ucontext_t *ucp, void (*func) (), int argc, ...) | 
|  | +{ | 
|  | +  extern void __start_context(void); | 
|  | +  int i, reg_args; | 
|  | +  long sp; | 
|  | +  va_list vl; | 
|  | +  va_start(vl, argc); | 
|  | + | 
|  | +  /* Store a magic flag in x0's save slot */ | 
|  | +  ucp->uc_mcontext.gregs[0] = 1; | 
|  | + | 
|  | +  /* Set up the stack. */ | 
|  | +  sp = ((long)ucp->uc_stack.ss_sp + ucp->uc_stack.ss_size) & ALMASK; | 
|  | +  reg_args = argc < 8 ? argc : 8; | 
|  | +  sp = (sp - (argc - reg_args) * sizeof(long)) & ALMASK; | 
|  | + | 
|  | +  /* Put args in a0-a7, then put any remaining args on the stack. */ | 
|  | +  for (i = 0; i < reg_args; i++) | 
|  | +    ucp->uc_mcontext.gregs[4 + i] = va_arg(vl, long); | 
|  | +  for (i = 0; i < argc - reg_args; i++) | 
|  | +    ((long*)sp)[i] = va_arg(vl, long); | 
|  | + | 
|  | +  ucp->uc_mcontext.gregs[1] = (long)&__start_context; | 
|  | +  ucp->uc_mcontext.gregs[20] = (long)ucp->uc_link; | 
|  | +  ucp->uc_mcontext.gregs[30] = sp; | 
|  | +  ucp->uc_mcontext.pc = (long)func; | 
|  | +} | 
|  | + | 
|  | +weak_alias (__makecontext, makecontext) | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/Makefile glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/Makefile | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/Makefile	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/Makefile	2014-12-09 16:55:03.172727878 -0800 | 
|  | @@ -0,0 +1,139 @@ | 
|  | +ifeq ($(subdir),signal) | 
|  | +#sysdep_routines += sigsuspend | 
|  | +endif | 
|  | + | 
|  | +ifeq ($(subdir),misc) | 
|  | + | 
|  | +no_syscall_list_h = 1 | 
|  | + | 
|  | +# A callable macro that expands to a shell command.  Preprocess file $(1) | 
|  | +# using ABI option $(2) and see which macros it defines.  Print FOO for each | 
|  | +# macro of the form __NR$(3)_FOO, filtering out ABI-specific __NR macros | 
|  | +# that have a prefix other than $(3). | 
|  | +mips_list_syscalls =	$(filter-out -m%,$(CC)) -E -x c $(+includes) \ | 
|  | +			    $(sysincludes) -D_LIBC -dM -m$(2) $(1) | \ | 
|  | +			sed -n 's@^\#define __NR$(3)_\([^ ]*\) .*@\1@p' | \ | 
|  | +			sed -e '/^[ON]32_/d' -e '/^N64_/d' -e '/^64_/d' | \ | 
|  | +			LC_ALL=C sort | 
|  | + | 
|  | +# Generate a list of SYS_* macros from the linux __NR macros. | 
|  | +# | 
|  | +# Before version 2.6, linux had separate 32-bit and 64-bit MIPS ports, | 
|  | +# each with its own set of headers.  The ports were merged for 2.6 and | 
|  | +# this merged port defines the syscalls in a slightly different way. | 
|  | +# There are therefore three sets of headers that we need to consider: | 
|  | +# | 
|  | +#    (1) Headers from the separate 32-bit MIPS port.  They just define | 
|  | +#	 a single list of __NR macros. | 
|  | +# | 
|  | +#    (2) Headers from the separate 64-bit MIPS port.  They unconditionally | 
|  | +#	 define syscalls for all three ABIs, with o32 syscalls prefixed | 
|  | +#	 by __NR_O32, n32 syscalls prefixed by __NR_N32 and n64 syscalls | 
|  | +#	 prefixed by plain __NR. | 
|  | +# | 
|  | +#    (3) Headers from the combined port.  They use the _RISCV_SIM macro to | 
|  | +#	 define the right set of syscalls for the current ABI.  The syscalls | 
|  | +#	 themselves have no special ABI prefix, but the headers also define: | 
|  | +# | 
|  | +#	    __NR_O32_Linux{,_syscalls} | 
|  | +#	    __NR_N32_Linux{,_syscalls} | 
|  | +#	    __NR_64_Linux{,_syscalls} | 
|  | +# | 
|  | +# In case (1) we just want a simple list of SYS_* macros.  In cases (2) | 
|  | +# and (3) we want a file that will work for all three ABIs, regardless | 
|  | +# of which ABI we are currently using.  We also want the file to work | 
|  | +# if the user later moves from (2) to (3).  Thus the file we create | 
|  | +# for (2) and (3) has the form: | 
|  | +# | 
|  | +#    #if _RISCV_SIM == _ABIN32 | 
|  | +#    # ifdef __NR_N32_open | 
|  | +#    #  define SYS_n32syscall1 __NR_N32_n32syscall1 | 
|  | +#    #  ... | 
|  | +#    # else | 
|  | +#    #  define SYS_n32syscall1 __NR_n32syscall1 | 
|  | +#    #  ... | 
|  | +#    # endif | 
|  | +#    #elif _RISCV_SIM == _ABI64 | 
|  | +#    # define SYS_n64syscall1 __NR_n64syscall1 | 
|  | +#    # ... | 
|  | +#    #else | 
|  | +#    # ifdef __NR_O32_open | 
|  | +#    #  define SYS_o32syscall1 __NR_O32_o32syscall1 | 
|  | +#    #  ... | 
|  | +#    # else | 
|  | +#    #  define SYS_o32syscall1 __NR_o32syscall1 | 
|  | +#    #  ... | 
|  | +#    # endif | 
|  | +#    #endif | 
|  | +# | 
|  | +# Here, __NR_N32_open and __NR_O32_open are used to detect case (2) | 
|  | +# over case (3).  The n64 SYS_* macros can always use the normal | 
|  | +# ABI-less names. | 
|  | +$(objpfx)syscall-%.h $(objpfx)syscall-%.d: ../sysdeps/unix/sysv/linux/mips/sys/syscall.h | 
|  | +	$(make-target-directory) | 
|  | +	$(CC) -E -x c $(+includes) $(sysincludes) -D_LIBC $< -MD -MP \ | 
|  | +	      -MF $(@:.h=.d)-t -MT '$(@:.d=.h) $(@:.h=.d)' > /dev/null | 
|  | +	{ \ | 
|  | +	 echo '/* Generated at libc build time from kernel syscall list.  */';\ | 
|  | +	 echo ''; \ | 
|  | +	 echo '#ifndef _SYSCALL_H'; \ | 
|  | +	 echo '# error "Never use <bits/syscall.h> directly; include <sys/syscall.h> instead."'; \ | 
|  | +	 echo '#endif'; \ | 
|  | +	 echo ''; \ | 
|  | +	 echo '#include <sgidefs.h>'; \ | 
|  | +	 rm -f $(@:.d=.h).new32 $(@:.d=.h).newn32 $(@:.d=.h).new64; \ | 
|  | +	 $(call mips_list_syscalls,$<,n32,_N32) > $(@:.d=.h).newn32; \ | 
|  | +	 if test -s $(@:.d=.h).newn32; then \ | 
|  | +	   if grep open $(@:.d=.h).newn32 > /dev/null; then \ | 
|  | +	     $(call mips_list_syscalls,$<,32,_O32) > $(@:.d=.h).new32; \ | 
|  | +	     $(call mips_list_syscalls,$<,64,) > $(@:.d=.h).new64; \ | 
|  | +	   else \ | 
|  | +	     $(call mips_list_syscalls,$<,32,) > $(@:.d=.h).new32; \ | 
|  | +	     $(call mips_list_syscalls,$<,n32,) > $(@:.d=.h).newn32; \ | 
|  | +	     $(call mips_list_syscalls,$<,64,) > $(@:.d=.h).new64; \ | 
|  | +	   fi; \ | 
|  | +	   echo '#if _RISCV_SIM == _ABIN32'; \ | 
|  | +	   echo '# ifdef __NR_N32_open'; \ | 
|  | +	   sed 's@\(.*\)@#  define SYS_\1 __NR_N32_\1@' < $(@:.d=.h).newn32; \ | 
|  | +	   echo '# else'; \ | 
|  | +	   sed 's@\(.*\)@#  define SYS_\1 __NR_\1@' < $(@:.d=.h).newn32; \ | 
|  | +	   echo '# endif'; \ | 
|  | +	   echo '#elif _RISCV_SIM == _ABI64'; \ | 
|  | +	   sed 's@\(.*\)@# define SYS_\1 __NR_\1@' < $(@:.d=.h).new64; \ | 
|  | +	   echo '#else'; \ | 
|  | +	   echo '# ifdef __NR_O32_open'; \ | 
|  | +	   sed 's@\(.*\)@#  define SYS_\1 __NR_O32_\1@' < $(@:.d=.h).new32; \ | 
|  | +	   echo '# else'; \ | 
|  | +	   sed 's@\(.*\)@#  define SYS_\1 __NR_\1@' < $(@:.d=.h).new32; \ | 
|  | +	   echo '# endif'; \ | 
|  | +	   echo '#endif'; \ | 
|  | +	 else \ | 
|  | +	   $(CC) -E -x c $(+includes) $(sysincludes) -D_LIBC -dM $< | \ | 
|  | +	   sed -n 's@^\#define __NR_\([^ ]*\) .*@\#define SYS_\1 __NR_\1@p' | \ | 
|  | +	   LC_ALL=C sort; \ | 
|  | +	 fi; \ | 
|  | +	 rm -f $(@:.d=.h).new32 $(@:.d=.h).newn32 $(@:.d=.h).new64; \ | 
|  | +	} > $(@:.d=.h).new | 
|  | +	mv -f $(@:.d=.h).new $(@:.d=.h) | 
|  | +ifneq (,$(objpfx)) | 
|  | +	sed $(sed-remove-objpfx) $(@:.h=.d)-t > $(@:.h=.d)-t2 | 
|  | +	rm -f $(@:.h=.d)-t | 
|  | +	mv -f $(@:.h=.d)-t2 $(@:.h=.d) | 
|  | +else | 
|  | +	mv -f $(@:.h=.d)-t $(@:.h=.d) | 
|  | +endif | 
|  | +endif | 
|  | + | 
|  | +ifeq ($(subdir),elf) | 
|  | +ifeq ($(build-shared),yes) | 
|  | +# This is needed for DSO loading from static binaries. | 
|  | +sysdep-dl-routines += dl-static | 
|  | +sysdep_routines += dl-static | 
|  | +sysdep-rtld-routines += dl-static | 
|  | +endif | 
|  | +endif | 
|  | + | 
|  | +ifeq ($(subdir),stdlib) | 
|  | +sysdep_routines += __start_context | 
|  | +gen-as-const-headers += ucontext_i.sym | 
|  | +endif | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/nptl/bits/local_lim.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/nptl/bits/local_lim.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/nptl/bits/local_lim.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/nptl/bits/local_lim.h	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1,101 @@ | 
|  | +/* Minimum guaranteed maximum values for system limits.  MIPS Linux version. | 
|  | +   Copyright (C) 1993-1998,2000,2002,2003,2004,2007,2008 | 
|  | +   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; see the file COPYING.LIB.  If not, | 
|  | +   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | 
|  | +   Boston, MA 02111-1307, USA.  */ | 
|  | + | 
|  | +/* The kernel header pollutes the namespace with the NR_OPEN symbol | 
|  | +   and defines LINK_MAX although filesystems have different maxima.  A | 
|  | +   similar thing is true for OPEN_MAX: the limit can be changed at | 
|  | +   runtime and therefore the macro must not be defined.  Remove this | 
|  | +   after including the header if necessary.  */ | 
|  | +#ifndef NR_OPEN | 
|  | +# define __undef_NR_OPEN | 
|  | +#endif | 
|  | +#ifndef LINK_MAX | 
|  | +# define __undef_LINK_MAX | 
|  | +#endif | 
|  | +#ifndef OPEN_MAX | 
|  | +# define __undef_OPEN_MAX | 
|  | +#endif | 
|  | +#ifndef ARG_MAX | 
|  | +# define __undef_ARG_MAX | 
|  | +#endif | 
|  | + | 
|  | +/* The kernel sources contain a file with all the needed information.  */ | 
|  | +#include <linux/limits.h> | 
|  | + | 
|  | +/* Have to remove NR_OPEN?  */ | 
|  | +#ifdef __undef_NR_OPEN | 
|  | +# undef NR_OPEN | 
|  | +# undef __undef_NR_OPEN | 
|  | +#endif | 
|  | +/* Have to remove LINK_MAX?  */ | 
|  | +#ifdef __undef_LINK_MAX | 
|  | +# undef LINK_MAX | 
|  | +# undef __undef_LINK_MAX | 
|  | +#endif | 
|  | +/* Have to remove OPEN_MAX?  */ | 
|  | +#ifdef __undef_OPEN_MAX | 
|  | +# undef OPEN_MAX | 
|  | +# undef __undef_OPEN_MAX | 
|  | +#endif | 
|  | +/* Have to remove ARG_MAX?  */ | 
|  | +#ifdef __undef_ARG_MAX | 
|  | +# undef ARG_MAX | 
|  | +# undef __undef_ARG_MAX | 
|  | +#endif | 
|  | + | 
|  | +/* The number of data keys per process.  */ | 
|  | +#define _POSIX_THREAD_KEYS_MAX	128 | 
|  | +/* This is the value this implementation supports.  */ | 
|  | +#define PTHREAD_KEYS_MAX	1024 | 
|  | + | 
|  | +/* Controlling the iterations of destructors for thread-specific data.  */ | 
|  | +#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS	4 | 
|  | +/* Number of iterations this implementation does.  */ | 
|  | +#define PTHREAD_DESTRUCTOR_ITERATIONS	_POSIX_THREAD_DESTRUCTOR_ITERATIONS | 
|  | + | 
|  | +/* The number of threads per process.  */ | 
|  | +#define _POSIX_THREAD_THREADS_MAX	64 | 
|  | +/* We have no predefined limit on the number of threads.  */ | 
|  | +#undef PTHREAD_THREADS_MAX | 
|  | + | 
|  | +/* Maximum amount by which a process can descrease its asynchronous I/O | 
|  | +   priority level.  */ | 
|  | +#define AIO_PRIO_DELTA_MAX	20 | 
|  | + | 
|  | +/* Minimum size for a thread.  At least two pages with 64k pages.  */ | 
|  | +#define PTHREAD_STACK_MIN	131072 | 
|  | + | 
|  | +/* Maximum number of timer expiration overruns.  */ | 
|  | +#define DELAYTIMER_MAX	2147483647 | 
|  | + | 
|  | +/* Maximum tty name length.  */ | 
|  | +#define TTY_NAME_MAX		32 | 
|  | + | 
|  | +/* Maximum login name length.  This is arbitrary.  */ | 
|  | +#define LOGIN_NAME_MAX		256 | 
|  | + | 
|  | +/* Maximum host name length.  */ | 
|  | +#define HOST_NAME_MAX		64 | 
|  | + | 
|  | +/* Maximum message queue priority level.  */ | 
|  | +#define MQ_PRIO_MAX		32768 | 
|  | + | 
|  | +/* Maximum value the semaphore can have.  */ | 
|  | +#define SEM_VALUE_MAX   (2147483647) | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/nptl/bits/pthreadtypes.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/nptl/bits/pthreadtypes.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/nptl/bits/pthreadtypes.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/nptl/bits/pthreadtypes.h	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1,229 @@ | 
|  | +/* Machine-specific pthread type layouts.  MIPS version. | 
|  | +   Copyright (C) 2005, 2006 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef _BITS_PTHREADTYPES_H | 
|  | +#define _BITS_PTHREADTYPES_H	1 | 
|  | + | 
|  | +#include <endian.h> | 
|  | + | 
|  | +#if _RISCV_SIM == _ABI64 | 
|  | +# define __SIZEOF_PTHREAD_ATTR_T 56 | 
|  | +# define __SIZEOF_PTHREAD_MUTEX_T 40 | 
|  | +# define __SIZEOF_PTHREAD_MUTEXATTR_T 4 | 
|  | +# define __SIZEOF_PTHREAD_COND_T 48 | 
|  | +# define __SIZEOF_PTHREAD_CONDATTR_T 4 | 
|  | +# define __SIZEOF_PTHREAD_RWLOCK_T 56 | 
|  | +# define __SIZEOF_PTHREAD_RWLOCKATTR_T 8 | 
|  | +# define __SIZEOF_PTHREAD_BARRIER_T 32 | 
|  | +# define __SIZEOF_PTHREAD_BARRIERATTR_T 4 | 
|  | +#else | 
|  | +# 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 | 
|  | +#endif | 
|  | + | 
|  | + | 
|  | +/* Thread identifiers.  The structure of the attribute type is | 
|  | +   deliberately not exposed.  */ | 
|  | +typedef unsigned long int pthread_t; | 
|  | + | 
|  | + | 
|  | +typedef union | 
|  | +{ | 
|  | +  char __size[__SIZEOF_PTHREAD_ATTR_T]; | 
|  | +  long int __align; | 
|  | +} pthread_attr_t; | 
|  | + | 
|  | + | 
|  | +#if _RISCV_SIM == _ABI64 | 
|  | +typedef struct __pthread_internal_list | 
|  | +{ | 
|  | +  struct __pthread_internal_list *__prev; | 
|  | +  struct __pthread_internal_list *__next; | 
|  | +} __pthread_list_t; | 
|  | +#else | 
|  | +typedef struct __pthread_internal_slist | 
|  | +{ | 
|  | +  struct __pthread_internal_slist *__next; | 
|  | +} __pthread_slist_t; | 
|  | +#endif | 
|  | + | 
|  | + | 
|  | +/* 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; | 
|  | +#if _RISCV_SIM == _ABI64 | 
|  | +    unsigned int __nusers; | 
|  | +#endif | 
|  | +    /* KIND must stay at this position in the structure to maintain | 
|  | +       binary compatibility.  */ | 
|  | +    int __kind; | 
|  | +#if _RISCV_SIM == _ABI64 | 
|  | +    int __spins; | 
|  | +    __pthread_list_t __list; | 
|  | +# define __PTHREAD_MUTEX_HAVE_PREV	1 | 
|  | +#else | 
|  | +    unsigned int __nusers; | 
|  | +    __extension__ union | 
|  | +    { | 
|  | +      int __spins; | 
|  | +      __pthread_slist_t __list; | 
|  | +    }; | 
|  | +#endif | 
|  | +  } __data; | 
|  | +  char __size[__SIZEOF_PTHREAD_MUTEX_T]; | 
|  | +  long int __align; | 
|  | +} pthread_mutex_t; | 
|  | + | 
|  | +typedef union | 
|  | +{ | 
|  | +  char __size[__SIZEOF_PTHREAD_MUTEXATTR_T]; | 
|  | +  int __align; | 
|  | +} pthread_mutexattr_t; | 
|  | + | 
|  | + | 
|  | +/* 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]; | 
|  | +  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 | 
|  | +{ | 
|  | +# if _RISCV_SIM == _ABI64 | 
|  | +  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; | 
|  | +    int __writer; | 
|  | +    int __shared; | 
|  | +    unsigned long int __pad1; | 
|  | +    unsigned long int __pad2; | 
|  | +    /* FLAGS must stay at this position in the structure to maintain | 
|  | +       binary compatibility.  */ | 
|  | +    unsigned int __flags; | 
|  | +  } __data; | 
|  | +# else | 
|  | +  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; | 
|  | +# endif | 
|  | +  char __size[__SIZEOF_PTHREAD_RWLOCK_T]; | 
|  | +  long int __align; | 
|  | +} pthread_rwlock_t; | 
|  | + | 
|  | +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 -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/nptl/bits/semaphore.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/nptl/bits/semaphore.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/nptl/bits/semaphore.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/nptl/bits/semaphore.h	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1,37 @@ | 
|  | +/* Copyright (C) 2002, 2005, 2007 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef _SEMAPHORE_H | 
|  | +# error "Never use <bits/semaphore.h> directly; include <semaphore.h> instead." | 
|  | +#endif | 
|  | + | 
|  | +#if _RISCV_SIM == _ABI64 | 
|  | +# define __SIZEOF_SEM_T	32 | 
|  | +#else | 
|  | +# define __SIZEOF_SEM_T	16 | 
|  | +#endif | 
|  | + | 
|  | +/* 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 -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/nptl/clone.S glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/nptl/clone.S | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/nptl/clone.S	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/nptl/clone.S	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1,2 @@ | 
|  | +#define RESET_PID | 
|  | +#include <sysdeps/unix/sysv/linux/riscv/clone.S> | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/nptl/createthread.c glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/nptl/createthread.c | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/nptl/createthread.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/nptl/createthread.c	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1,24 @@ | 
|  | +/* Copyright (C) 2005 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +/* Value passed to 'clone' for initialization of the thread register.  */ | 
|  | +#define TLS_VALUE ((void *) (pd) \ | 
|  | +		   + TLS_TCB_OFFSET + TLS_PRE_TCB_SIZE) | 
|  | + | 
|  | +/* Get the real implementation.	 */ | 
|  | +#include <nptl/sysdeps/pthread/createthread.c> | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/nptl/fork.c glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/nptl/fork.c | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/nptl/fork.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/nptl/fork.c	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1 @@ | 
|  | +#include <sysdeps/unix/sysv/linux/i386/fork.c> | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/nptl/lowlevellock.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/nptl/lowlevellock.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/nptl/lowlevellock.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/nptl/lowlevellock.h	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1,293 @@ | 
|  | +/* Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, | 
|  | +   2009 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef _LOWLEVELLOCK_H | 
|  | +#define _LOWLEVELLOCK_H	1 | 
|  | + | 
|  | +#include <time.h> | 
|  | +#include <sys/param.h> | 
|  | +#include <bits/pthreadtypes.h> | 
|  | +#include <atomic.h> | 
|  | +#include <sysdep.h> | 
|  | +#include <kernel-features.h> | 
|  | + | 
|  | +#define FUTEX_WAIT		0 | 
|  | +#define FUTEX_WAKE		1 | 
|  | +#define FUTEX_REQUEUE		3 | 
|  | +#define FUTEX_CMP_REQUEUE	4 | 
|  | +#define FUTEX_WAKE_OP		5 | 
|  | +#define FUTEX_OP_CLEAR_WAKE_IF_GT_ONE	((4 << 24) | 1) | 
|  | +#define FUTEX_LOCK_PI		6 | 
|  | +#define FUTEX_UNLOCK_PI		7 | 
|  | +#define FUTEX_TRYLOCK_PI	8 | 
|  | +#define FUTEX_WAIT_BITSET	9 | 
|  | +#define FUTEX_WAKE_BITSET	10 | 
|  | +#define FUTEX_PRIVATE_FLAG	128 | 
|  | +#define FUTEX_CLOCK_REALTIME	256 | 
|  | + | 
|  | +#define FUTEX_BITSET_MATCH_ANY	0xffffffff | 
|  | + | 
|  | +/* Values for 'private' parameter of locking macros.  Yes, the | 
|  | +   definition seems to be backwards.  But it is not.  The bit will be | 
|  | +   reversed before passing to the system call.  */ | 
|  | +#define LLL_PRIVATE	0 | 
|  | +#define LLL_SHARED	FUTEX_PRIVATE_FLAG | 
|  | + | 
|  | + | 
|  | +#if !defined NOT_IN_libc || defined IS_IN_rtld | 
|  | +/* In libc.so or ld.so all futexes are private.  */ | 
|  | +# ifdef __ASSUME_PRIVATE_FUTEX | 
|  | +#  define __lll_private_flag(fl, private) \ | 
|  | +  ((fl) | FUTEX_PRIVATE_FLAG) | 
|  | +# else | 
|  | +#  define __lll_private_flag(fl, private) \ | 
|  | +  ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex)) | 
|  | +# endif | 
|  | +#else | 
|  | +# ifdef __ASSUME_PRIVATE_FUTEX | 
|  | +#  define __lll_private_flag(fl, private) \ | 
|  | +  (((fl) | FUTEX_PRIVATE_FLAG) ^ (private)) | 
|  | +# else | 
|  | +#  define __lll_private_flag(fl, private) \ | 
|  | +  (__builtin_constant_p (private)					      \ | 
|  | +   ? ((private) == 0							      \ | 
|  | +      ? ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex))	      \ | 
|  | +      : (fl))								      \ | 
|  | +   : ((fl) | (((private) ^ FUTEX_PRIVATE_FLAG)				      \ | 
|  | +	      & THREAD_GETMEM (THREAD_SELF, header.private_futex)))) | 
|  | +# endif | 
|  | +#endif | 
|  | + | 
|  | + | 
|  | +#define lll_futex_wait(futexp, val, private) \ | 
|  | +  lll_futex_timed_wait(futexp, val, NULL, private) | 
|  | + | 
|  | +#define lll_futex_timed_wait(futexp, val, timespec, private) \ | 
|  | +  ({									      \ | 
|  | +    INTERNAL_SYSCALL_DECL (__err);					      \ | 
|  | +    long int __ret;							      \ | 
|  | +    __ret = INTERNAL_SYSCALL (futex, __err, 4, (long) (futexp),		      \ | 
|  | +			      __lll_private_flag (FUTEX_WAIT, private),	      \ | 
|  | +			      (val), (timespec));			      \ | 
|  | +    INTERNAL_SYSCALL_ERROR_P (__ret, __err) ? -__ret : __ret;		      \ | 
|  | +  }) | 
|  | + | 
|  | +#define lll_futex_wake(futexp, nr, private) \ | 
|  | +  ({									      \ | 
|  | +    INTERNAL_SYSCALL_DECL (__err);					      \ | 
|  | +    long int __ret;							      \ | 
|  | +    __ret = INTERNAL_SYSCALL (futex, __err, 4, (long) (futexp),		      \ | 
|  | +			      __lll_private_flag (FUTEX_WAKE, private),	      \ | 
|  | +			      (nr), 0);	      \ | 
|  | +    INTERNAL_SYSCALL_ERROR_P (__ret, __err) ? -__ret : __ret;		      \ | 
|  | +  }) | 
|  | + | 
|  | +#define lll_robust_dead(futexv, private) \ | 
|  | +  do									      \ | 
|  | +    {									      \ | 
|  | +      int *__futexp = &(futexv);					      \ | 
|  | +      atomic_or (__futexp, FUTEX_OWNER_DIED);				      \ | 
|  | +      lll_futex_wake (__futexp, 1, private);				      \ | 
|  | +    }									      \ | 
|  | +  while (0) | 
|  | + | 
|  | +/* Returns non-zero if error happened, zero if success.  */ | 
|  | +#define lll_futex_requeue(futexp, nr_wake, nr_move, mutex, val, private) \ | 
|  | +  ({									      \ | 
|  | +    INTERNAL_SYSCALL_DECL (__err);					      \ | 
|  | +    long int __ret;							      \ | 
|  | +    __ret = INTERNAL_SYSCALL (futex, __err, 6, (long) (futexp),		      \ | 
|  | +			      __lll_private_flag (FUTEX_CMP_REQUEUE, private),\ | 
|  | +			      (nr_wake), (nr_move), (mutex), (val));	      \ | 
|  | +    INTERNAL_SYSCALL_ERROR_P (__ret, __err);				      \ | 
|  | +  }) | 
|  | + | 
|  | +/* Returns non-zero if error happened, zero if success.  */ | 
|  | +#define lll_futex_wake_unlock(futexp, nr_wake, nr_wake2, futexp2, private) \ | 
|  | +  ({									      \ | 
|  | +    INTERNAL_SYSCALL_DECL (__err);					      \ | 
|  | +    long int __ret;							      \ | 
|  | +									      \ | 
|  | +    __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		      \ | 
|  | +			      __lll_private_flag (FUTEX_WAKE_OP, private),    \ | 
|  | +			      (nr_wake), (nr_wake2), (futexp2),		      \ | 
|  | +			      FUTEX_OP_CLEAR_WAKE_IF_GT_ONE);		      \ | 
|  | +    INTERNAL_SYSCALL_ERROR_P (__ret, __err);				      \ | 
|  | +  }) | 
|  | + | 
|  | +static inline int | 
|  | +__attribute__ ((always_inline)) | 
|  | +__lll_trylock (int *futex) | 
|  | +{ | 
|  | +  return atomic_compare_and_exchange_val_acq (futex, 1, 0) != 0; | 
|  | +} | 
|  | +#define lll_trylock(futex) __lll_trylock (&(futex)) | 
|  | + | 
|  | +static inline int | 
|  | +__attribute__ ((always_inline)) | 
|  | +__lll_cond_trylock (int *futex) | 
|  | +{ | 
|  | +  return atomic_compare_and_exchange_val_acq (futex, 2, 0) != 0; | 
|  | +} | 
|  | +#define lll_cond_trylock(futex) __lll_cond_trylock (&(futex)) | 
|  | + | 
|  | +static inline int | 
|  | +__attribute__ ((always_inline)) | 
|  | +__lll_robust_trylock (int *futex, int id) | 
|  | +{ | 
|  | +  return atomic_compare_and_exchange_val_acq (futex, id, 0) != 0; | 
|  | +} | 
|  | +#define lll_robust_trylock(futex, id) \ | 
|  | +  __lll_robust_trylock (&(futex), id) | 
|  | + | 
|  | + | 
|  | +extern void __lll_lock_wait_private (int *futex) attribute_hidden; | 
|  | +extern void __lll_lock_wait (int *futex, int private) attribute_hidden; | 
|  | +extern int __lll_robust_lock_wait (int *futex, int private) attribute_hidden; | 
|  | + | 
|  | +static inline void | 
|  | +__attribute__ ((always_inline)) | 
|  | +__lll_lock (int *futex, int private) | 
|  | +{ | 
|  | +  int val = atomic_compare_and_exchange_val_acq (futex, 1, 0); | 
|  | + | 
|  | +  if (__builtin_expect (val != 0, 0)) | 
|  | +    { | 
|  | +      if (__builtin_constant_p (private) && private == LLL_PRIVATE) | 
|  | +	__lll_lock_wait_private (futex); | 
|  | +      else | 
|  | +	__lll_lock_wait (futex, private); | 
|  | +    } | 
|  | +} | 
|  | +#define lll_lock(futex, private) __lll_lock (&(futex), private) | 
|  | + | 
|  | +static inline int | 
|  | +__attribute__ ((always_inline)) | 
|  | +__lll_robust_lock (int *futex, int id, int private) | 
|  | +{ | 
|  | +  int result = 0; | 
|  | +  if (atomic_compare_and_exchange_bool_acq (futex, id, 0) != 0) | 
|  | +    result = __lll_robust_lock_wait (futex, private); | 
|  | +  return result; | 
|  | +} | 
|  | +#define lll_robust_lock(futex, id, private) \ | 
|  | +  __lll_robust_lock (&(futex), id, private) | 
|  | + | 
|  | +static inline void | 
|  | +__attribute__ ((always_inline)) | 
|  | +__lll_cond_lock (int *futex, int private) | 
|  | +{ | 
|  | +  int val = atomic_compare_and_exchange_val_acq (futex, 2, 0); | 
|  | + | 
|  | +  if (__builtin_expect (val != 0, 0)) | 
|  | +    __lll_lock_wait (futex, private); | 
|  | +} | 
|  | +#define lll_cond_lock(futex, private) __lll_cond_lock (&(futex), private) | 
|  | + | 
|  | +#define lll_robust_cond_lock(futex, id, private) \ | 
|  | +  __lll_robust_lock (&(futex), (id) | FUTEX_WAITERS, private) | 
|  | + | 
|  | + | 
|  | +extern int __lll_timedlock_wait (int *futex, const struct timespec *, | 
|  | +				 int private) attribute_hidden; | 
|  | +extern int __lll_robust_timedlock_wait (int *futex, const struct timespec *, | 
|  | +					int private) attribute_hidden; | 
|  | + | 
|  | +static inline int | 
|  | +__attribute__ ((always_inline)) | 
|  | +__lll_timedlock (int *futex, const struct timespec *abstime, int private) | 
|  | +{ | 
|  | +  int val = atomic_compare_and_exchange_val_acq (futex, 1, 0); | 
|  | +  int result = 0; | 
|  | + | 
|  | +  if (__builtin_expect (val != 0, 0)) | 
|  | +    result = __lll_timedlock_wait (futex, abstime, private); | 
|  | +  return result; | 
|  | +} | 
|  | +#define lll_timedlock(futex, abstime, private) \ | 
|  | +  __lll_timedlock (&(futex), abstime, private) | 
|  | + | 
|  | +static inline int | 
|  | +__attribute__ ((always_inline)) | 
|  | +__lll_robust_timedlock (int *futex, const struct timespec *abstime, | 
|  | +			int id, int private) | 
|  | +{ | 
|  | +  int result = 0; | 
|  | +  if (atomic_compare_and_exchange_bool_acq (futex, id, 0) != 0) | 
|  | +    result = __lll_robust_timedlock_wait (futex, abstime, private); | 
|  | +  return result; | 
|  | +} | 
|  | +#define lll_robust_timedlock(futex, abstime, id, private) \ | 
|  | +  __lll_robust_timedlock (&(futex), abstime, id, private) | 
|  | + | 
|  | +#define lll_unlock(lock, private) \ | 
|  | +  ((void) ({								      \ | 
|  | +    int *__futex = &(lock);						      \ | 
|  | +    int __val = atomic_exchange_rel (__futex, 0);			      \ | 
|  | +    if (__builtin_expect (__val > 1, 0))				      \ | 
|  | +      lll_futex_wake (__futex, 1, private);				      \ | 
|  | +  })) | 
|  | + | 
|  | +#define lll_robust_unlock(lock, private) \ | 
|  | +  ((void) ({								      \ | 
|  | +    int *__futex = &(lock);						      \ | 
|  | +    int __val = atomic_exchange_rel (__futex, 0);			      \ | 
|  | +    if (__builtin_expect (__val & FUTEX_WAITERS, 0))			      \ | 
|  | +      lll_futex_wake (__futex, 1, private);				      \ | 
|  | +  })) | 
|  | + | 
|  | +#define lll_islocked(futex) \ | 
|  | +  (futex != 0) | 
|  | + | 
|  | + | 
|  | +/* Our internal lock implementation is identical to the binary-compatible | 
|  | +   mutex implementation. */ | 
|  | + | 
|  | +/* Initializers for lock.  */ | 
|  | +#define LLL_LOCK_INITIALIZER		(0) | 
|  | +#define LLL_LOCK_INITIALIZER_LOCKED	(1) | 
|  | + | 
|  | +/* The states of a lock are: | 
|  | +    0  -  untaken | 
|  | +    1  -  taken by one user | 
|  | +   >1  -  taken by more users */ | 
|  | + | 
|  | +/* The kernel notifies a process which uses CLONE_CLEARTID via futex | 
|  | +   wakeup when the clone terminates.  The memory location contains the | 
|  | +   thread ID while the clone is running and is reset to zero | 
|  | +   afterwards.	*/ | 
|  | +#define lll_wait_tid(tid) \ | 
|  | +  do {							\ | 
|  | +    __typeof (tid) __tid;				\ | 
|  | +    while ((__tid = (tid)) != 0)			\ | 
|  | +      lll_futex_wait (&(tid), __tid, LLL_SHARED);	\ | 
|  | +  } while (0) | 
|  | + | 
|  | +extern int __lll_timedwait_tid (int *, const struct timespec *) | 
|  | +     attribute_hidden; | 
|  | + | 
|  | +#define lll_timedwait_tid(tid, abstime) \ | 
|  | +  ({							\ | 
|  | +    int __res = 0;					\ | 
|  | +    if ((tid) != 0)					\ | 
|  | +      __res = __lll_timedwait_tid (&(tid), (abstime));	\ | 
|  | +    __res;						\ | 
|  | +  }) | 
|  | + | 
|  | +#endif	/* lowlevellock.h */ | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/nptl/pt-vfork.S glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/nptl/pt-vfork.S | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/nptl/pt-vfork.S	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/nptl/pt-vfork.S	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1,40 @@ | 
|  | +/* Copyright (C) 2005, 2006 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <tls.h> | 
|  | +#include "tcb-offsets.h" | 
|  | + | 
|  | +/* Save the PID value.  */ | 
|  | +#define SAVE_PID \ | 
|  | +	lui	a13, %hi(PID_OFFSET);                                   	\ | 
|  | +	add	a13, a13, tp;                                            	\ | 
|  | +	lw	a12, %lo(PID_OFFSET)(a13);	/* Load the saved PID.  */	\ | 
|  | +	neg	a12, a12;		        /* Negate it.  */		\ | 
|  | +	sw	a12, %lo(PID_OFFSET)(a13);	/* Store the temporary PID.  */ | 
|  | + | 
|  | +/* Restore the old PID value in the parent.  */ | 
|  | +#define RESTORE_PID \ | 
|  | +	beqz	v0, 1f;				/* If we are the parent... */	\ | 
|  | +	lui	a13, %hi(PID_OFFSET);                                   	\ | 
|  | +	add	a13, a13, tp;                                            	\ | 
|  | +	lw	a12, %lo(PID_OFFSET)(a13);	/* Load the saved PID.  */	\ | 
|  | +	neg	a12, a12;		        /* Re-negate it.  */		\ | 
|  | +	sw	a12, %lo(PID_OFFSET)(a13);      /* Restore the PID.  */		\ | 
|  | +1: | 
|  | + | 
|  | +#include <sysdeps/unix/sysv/linux/riscv/vfork.S> | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/nptl/sysdep-cancel.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/nptl/sysdep-cancel.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/nptl/sysdep-cancel.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/nptl/sysdep-cancel.h	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1,161 @@ | 
|  | +/* Copyright (C) 2003, 2004, 2005, 2006 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <sysdep.h> | 
|  | +#include <sysdeps/generic/sysdep.h> | 
|  | +#include <tls.h> | 
|  | +#ifndef __ASSEMBLER__ | 
|  | +# include <nptl/pthreadP.h> | 
|  | +#endif | 
|  | +#include <sys/asm.h> | 
|  | + | 
|  | +/* Gas will put the initial save of $gp into the CIE, because it appears to | 
|  | +   happen before any instructions.  So we use cfi_same_value instead of | 
|  | +   cfi_restore.  */ | 
|  | + | 
|  | +#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt | 
|  | + | 
|  | +#ifdef __PIC__ | 
|  | +# undef PSEUDO | 
|  | +# define PSEUDO(name, syscall_name, args)				      \ | 
|  | +      .align 2;								      \ | 
|  | +  L(pseudo_start):							      \ | 
|  | +      cfi_startproc;							      \ | 
|  | +      cfi_adjust_cfa_offset (STKSPACE);					      \ | 
|  | +  99: RESTORESTK;							      \ | 
|  | +      j __syscall_error;						      \ | 
|  | +  .type __##syscall_name##_nocancel, @function;				      \ | 
|  | +  .globl __##syscall_name##_nocancel;					      \ | 
|  | +  __##syscall_name##_nocancel:						      \ | 
|  | +    SAVESTK;								      \ | 
|  | +    li v0, SYS_ify(syscall_name);					      \ | 
|  | +    syscall;								      \ | 
|  | +    bnez a3, SYSCALL_ERROR_LABEL;			       		      \ | 
|  | +    RESTORESTK;								      \ | 
|  | +    ret;								      \ | 
|  | +  .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel;	      \ | 
|  | +  ENTRY (name)								      \ | 
|  | +    SAVESTK;								      \ | 
|  | +    SINGLE_THREAD_P(v1);						      \ | 
|  | +    bnez v1, L(pseudo_cancel);  					      \ | 
|  | +    li v0, SYS_ify(syscall_name);					      \ | 
|  | +    syscall;								      \ | 
|  | +    bnez a3, SYSCALL_ERROR_LABEL;			       		      \ | 
|  | +    RESTORESTK;								      \ | 
|  | +    ret;								      \ | 
|  | +  L(pseudo_cancel):							      \ | 
|  | +    cfi_adjust_cfa_offset (STKSPACE);					      \ | 
|  | +    REG_S ra, STKOFF_RA(sp);						      \ | 
|  | +    cfi_rel_offset (ra, STKOFF_RA);					      \ | 
|  | +      PUSHARGS_##args;			/* save syscall args */	      	      \ | 
|  | +      CENABLE;								      \ | 
|  | +      REG_S v0, STKOFF_SVMSK(sp);		/* save mask */			      \ | 
|  | +      POPARGS_##args;			/* restore syscall args */	      \ | 
|  | +      li v0, SYS_ify (syscall_name);				      	      \ | 
|  | +      syscall;								      \ | 
|  | +      REG_S v0, STKOFF_SC_V0(sp);		/* save syscall result */             \ | 
|  | +      REG_S a3, STKOFF_SC_ERR(sp);	/* save syscall error flag */	      \ | 
|  | +      REG_L a0, STKOFF_SVMSK(sp);		/* pass mask as arg1 */		      \ | 
|  | +      CDISABLE;								      \ | 
|  | +      REG_L a3, STKOFF_SC_ERR(sp);	/* restore syscall error flag */      \ | 
|  | +      REG_L ra, STKOFF_RA(sp);		/* restore return address */	      \ | 
|  | +      REG_L v0, STKOFF_SC_V0(sp);		/* restore syscall result */          \ | 
|  | +      bnez a3, SYSCALL_ERROR_LABEL;					      \ | 
|  | +      RESTORESTK;								      \ | 
|  | +    L(pseudo_end): | 
|  | + | 
|  | + | 
|  | +  # undef PSEUDO_END | 
|  | +  # define PSEUDO_END(sym) cfi_endproc; .size sym,.-sym | 
|  | + | 
|  | +  #endif | 
|  | + | 
|  | +# define PUSHARGS_0	/* nothing to do */ | 
|  | +# define PUSHARGS_1	PUSHARGS_0 REG_S a0, STKOFF_A0(sp); cfi_rel_offset (a0, STKOFF_A0); | 
|  | +# define PUSHARGS_2	PUSHARGS_1 REG_S a1, STKOFF_A1(sp); cfi_rel_offset (a1, STKOFF_A1); | 
|  | +# define PUSHARGS_3	PUSHARGS_2 REG_S a2, STKOFF_A2(sp); cfi_rel_offset (a2, STKOFF_A2); | 
|  | +# define PUSHARGS_4	PUSHARGS_3 REG_S a3, STKOFF_A3(sp); cfi_rel_offset (a3, STKOFF_A3); | 
|  | +# define PUSHARGS_5	PUSHARGS_4 REG_S a4, STKOFF_A4(sp); cfi_rel_offset (a3, STKOFF_A4); | 
|  | +# define PUSHARGS_6	PUSHARGS_5 REG_S a5, STKOFF_A5(sp); cfi_rel_offset (a3, STKOFF_A5); | 
|  | + | 
|  | +# define POPARGS_0	/* nothing to do */ | 
|  | +# define POPARGS_1	POPARGS_0 REG_L a0, STKOFF_A0(sp); | 
|  | +# define POPARGS_2	POPARGS_1 REG_L a1, STKOFF_A1(sp); | 
|  | +# define POPARGS_3	POPARGS_2 REG_L a2, STKOFF_A2(sp); | 
|  | +# define POPARGS_4	POPARGS_3 REG_L a3, STKOFF_A3(sp); | 
|  | +# define POPARGS_5	POPARGS_4 REG_L a4, STKOFF_A4(sp); | 
|  | +# define POPARGS_6	POPARGS_5 REG_L a5, STKOFF_A5(sp); | 
|  | + | 
|  | +/* Save an even number of slots.  Should be 0 if an even number of slots | 
|  | +   are used below, or SZREG if an odd number are used.  */ | 
|  | +# define STK_PAD	0 | 
|  | + | 
|  | +/* Place values that we are more likely to use later in this sequence, i.e. | 
|  | +   closer to the SP at function entry.  If you do that, the are more | 
|  | +   likely to already be in your d-cache.  */ | 
|  | +# define STKOFF_A5	(STK_PAD) | 
|  | +# define STKOFF_A4	(STKOFF_A5 + SZREG) | 
|  | +# define STKOFF_A3	(STKOFF_A4 + SZREG) | 
|  | +# define STKOFF_A2	(STKOFF_A3 + SZREG)	/* MT and more args.  */ | 
|  | +# define STKOFF_A1	(STKOFF_A2 + SZREG)	/* MT and 2 args.  */ | 
|  | +# define STKOFF_A0	(STKOFF_A1 + SZREG)	/* MT and 1 arg.  */ | 
|  | +# define STKOFF_RA	(STKOFF_A0 + SZREG)	/* Used if MT.  */ | 
|  | +# define STKOFF_SC_V0	(STKOFF_RA + SZREG)	/* Used if MT.  */ | 
|  | +# define STKOFF_SC_ERR	(STKOFF_SC_V0 + SZREG)	/* Used if MT.  */ | 
|  | +# define STKOFF_SVMSK	(STKOFF_SC_ERR + SZREG)	/* Used if MT.  */ | 
|  | + | 
|  | +# define STKSPACE	(STKOFF_SVMSK + SZREG) | 
|  | +# define SAVESTK 	addi sp, sp, -STKSPACE; cfi_adjust_cfa_offset(STKSPACE) | 
|  | +# define RESTORESTK 	addi sp, sp, STKSPACE; cfi_adjust_cfa_offset(-STKSPACE) | 
|  | + | 
|  | +# ifdef IS_IN_libpthread | 
|  | +#  define CENABLE  j __pthread_enable_asynccancel | 
|  | +#  define CDISABLE j __pthread_disable_asynccancel | 
|  | +# elif defined IS_IN_librt | 
|  | +#  define CENABLE  j __librt_enable_asynccancel | 
|  | +#  define CDISABLE j __librt_disable_asynccancel | 
|  | +# else | 
|  | +#  define CENABLE  j __libc_enable_asynccancel | 
|  | +#  define CDISABLE j __libc_disable_asynccancel | 
|  | +# endif | 
|  | + | 
|  | +# ifndef __ASSEMBLER__ | 
|  | +#  define SINGLE_THREAD_P						\ | 
|  | +	__builtin_expect (THREAD_GETMEM (THREAD_SELF,			\ | 
|  | +					 header.multiple_threads)	\ | 
|  | +			  == 0, 1) | 
|  | +# else | 
|  | +#  include "tcb-offsets.h" | 
|  | +#  define SINGLE_THREAD_P(reg)						\ | 
|  | +	lui reg, %hi(MULTIPLE_THREADS_OFFSET);				\ | 
|  | +	add reg, reg, tp;                				\ | 
|  | +	lw reg, %lo(MULTIPLE_THREADS_OFFSET)(reg) | 
|  | +#endif | 
|  | + | 
|  | +#elif !defined __ASSEMBLER__ | 
|  | + | 
|  | +# define SINGLE_THREAD_P 1 | 
|  | +# define NO_CANCELLATION 1 | 
|  | + | 
|  | +#endif | 
|  | + | 
|  | +#ifndef __ASSEMBLER__ | 
|  | +# define RTLD_SINGLE_THREAD_P \ | 
|  | +  __builtin_expect (THREAD_GETMEM (THREAD_SELF, \ | 
|  | +				   header.multiple_threads) == 0, 1) | 
|  | +#endif | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/nptl/vfork.S glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/nptl/vfork.S | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/nptl/vfork.S	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/nptl/vfork.S	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1,45 @@ | 
|  | +/* Copyright (C) 2005, 2006 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <tls.h> | 
|  | +#include "tcb-offsets.h" | 
|  | + | 
|  | +/* Save the PID value.  */ | 
|  | +#define SAVE_PID \ | 
|  | +	lui	a13, %hi(PID_OFFSET);                                   	\ | 
|  | +	add	a13, a13, tp;                                            	\ | 
|  | +	lw	a12, %lo(PID_OFFSET)(a13);	/* Load the saved PID.  */	\ | 
|  | +	neg	a12, a12;		        /* Negate it.  */		\ | 
|  | +	bnez	a12, 1f;			/* If it was zero... */		\ | 
|  | +	li	a12, 0x80000000;		/* use 0x80000000 instead.  */	\ | 
|  | +1:	sw	a12, %lo(PID_OFFSET)(a13);      /* Store the temporary PID.  */ | 
|  | + | 
|  | +/* Restore the old PID value in the parent.  */ | 
|  | +#define RESTORE_PID \ | 
|  | +	beqz	v0, 1f;				/* If we are the parent... */	\ | 
|  | +	lui	a13, %hi(PID_OFFSET);                                   	\ | 
|  | +	add	a13, a13, tp;                                            	\ | 
|  | +	lw	a12, %lo(PID_OFFSET)(a13);	/* Load the saved PID.  */	\ | 
|  | +	neg	a12, a12;		        /* Re-negate it.  */		\ | 
|  | +	li	a10, 0x80000000;		/* Load 0x80000000... */	\ | 
|  | +	bne	a12, a10, 2f;			/* ... compare against it... */	\ | 
|  | +	li	a12, 0;				/* ... use 0 instead.  */	\ | 
|  | +2:	sw	a12, %lo(PID_OFFSET)(a13);	/* Restore the PID.  */		\ | 
|  | +1: | 
|  | + | 
|  | +#include <sysdeps/unix/sysv/linux/riscv/vfork.S> | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/pipe.S glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/pipe.S | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/pipe.S	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/pipe.S	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1 @@ | 
|  | +#include <sysdeps/unix/riscv/pipe.S> | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/pread64.c glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/pread64.c | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/pread64.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/pread64.c	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1,107 @@ | 
|  | +/* Copyright (C) 1997, 1998, 2000, 2002, 2003, 2004 | 
|  | +   Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. | 
|  | + | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <errno.h> | 
|  | +#ifndef NO_SGIDEFS_H | 
|  | +#include <sgidefs.h> | 
|  | +#endif | 
|  | +#include <unistd.h> | 
|  | +#include <endian.h> | 
|  | + | 
|  | +#include <sysdep-cancel.h> | 
|  | +#include <sys/syscall.h> | 
|  | +#include <bp-checks.h> | 
|  | + | 
|  | +#include <kernel-features.h> | 
|  | + | 
|  | +#ifdef __NR_pread64	     /* Newer kernels renamed but it's the same.  */ | 
|  | +# ifdef __NR_pread | 
|  | +#  error "__NR_pread and __NR_pread64 both defined???" | 
|  | +# endif | 
|  | +# define __NR_pread __NR_pread64 | 
|  | +#endif | 
|  | + | 
|  | +#if defined __NR_pread || __ASSUME_PREAD_SYSCALL > 0 | 
|  | + | 
|  | +# if __ASSUME_PREAD_SYSCALL == 0 | 
|  | +static ssize_t __emulate_pread64 (int fd, void *buf, size_t count, | 
|  | +				  off64_t offset) internal_function; | 
|  | +# endif | 
|  | + | 
|  | +ssize_t | 
|  | +__libc_pread64 (fd, buf, count, offset) | 
|  | +     int fd; | 
|  | +     void *buf; | 
|  | +     size_t count; | 
|  | +     off64_t offset; | 
|  | +{ | 
|  | +  ssize_t result; | 
|  | + | 
|  | + | 
|  | +  if (SINGLE_THREAD_P) | 
|  | +    { | 
|  | +     /* First try the syscall.  */ | 
|  | +#if _RISCV_SIM == _ABIN32 || _RISCV_SIM == _ABI64 | 
|  | +      result = INLINE_SYSCALL (pread, 4, fd, CHECK_N (buf, count), count, | 
|  | +			       offset); | 
|  | +#else | 
|  | +     result = INLINE_SYSCALL (pread, 6, fd, CHECK_N (buf, count), count, 0, | 
|  | +			      __LONG_LONG_PAIR ((off_t) (offset >> 32), | 
|  | +			      (off_t) (offset & 0xffffffff))); | 
|  | +#endif | 
|  | +# if __ASSUME_PREAD_SYSCALL == 0 | 
|  | +     if (result == -1 && errno == ENOSYS) | 
|  | +     /* No system call available.  Use the emulation.  */ | 
|  | +     result = __emulate_pread64 (fd, buf, count, offset); | 
|  | +# endif | 
|  | +     return result; | 
|  | +    } | 
|  | + | 
|  | +  int oldtype = LIBC_CANCEL_ASYNC (); | 
|  | + | 
|  | +  /* First try the syscall.  */ | 
|  | +#if _RISCV_SIM == _ABIN32 || _RISCV_SIM == _ABI64 | 
|  | +  result = INLINE_SYSCALL (pread, 4, fd, CHECK_N (buf, count), count, offset); | 
|  | +#else | 
|  | +  result = INLINE_SYSCALL (pread, 6, fd, CHECK_N (buf, count), count, 0, | 
|  | +			   __LONG_LONG_PAIR ((off_t) (offset >> 32), | 
|  | +					     (off_t) (offset & 0xffffffff))); | 
|  | +#endif | 
|  | +# if __ASSUME_PREAD_SYSCALL == 0 | 
|  | +  if (result == -1 && errno == ENOSYS) | 
|  | +    /* No system call available.  Use the emulation.  */ | 
|  | +    result = __emulate_pread64 (fd, buf, count, offset); | 
|  | +# endif | 
|  | + | 
|  | +  LIBC_CANCEL_RESET (oldtype); | 
|  | + | 
|  | +  return result; | 
|  | +} | 
|  | + | 
|  | +weak_alias (__libc_pread64, __pread64) | 
|  | +weak_alias (__libc_pread64, pread64) | 
|  | + | 
|  | +# define __libc_pread64(fd, buf, count, offset) \ | 
|  | +     static internal_function __emulate_pread64 (fd, buf, count, offset) | 
|  | +#endif | 
|  | + | 
|  | +#if __ASSUME_PREAD_SYSCALL == 0 | 
|  | +# include <sysdeps/posix/pread64.c> | 
|  | +#endif | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/pread.c glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/pread.c | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/pread.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/pread.c	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1,109 @@ | 
|  | +/* Copyright (C) 1997, 1998, 2000, 2002, 2003, 2004 | 
|  | +   Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. | 
|  | + | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <assert.h> | 
|  | +#include <errno.h> | 
|  | +#ifndef NO_SGIDEFS_H | 
|  | +#include <sgidefs.h> | 
|  | +#endif | 
|  | +#include <unistd.h> | 
|  | +#include <endian.h> | 
|  | + | 
|  | +#include <sysdep-cancel.h> | 
|  | +#include <sys/syscall.h> | 
|  | +#include <bp-checks.h> | 
|  | + | 
|  | +#include <kernel-features.h> | 
|  | + | 
|  | +#ifdef __NR_pread64	     /* Newer kernels renamed but it's the same.  */ | 
|  | +# ifdef __NR_pread | 
|  | +#  error "__NR_pread and __NR_pread64 both defined???" | 
|  | +# endif | 
|  | +# define __NR_pread __NR_pread64 | 
|  | +#endif | 
|  | + | 
|  | +#if defined __NR_pread || __ASSUME_PREAD_SYSCALL > 0 | 
|  | + | 
|  | +# if __ASSUME_PREAD_SYSCALL == 0 | 
|  | +static ssize_t __emulate_pread (int fd, void *buf, size_t count, | 
|  | +				off_t offset) internal_function; | 
|  | +# endif | 
|  | + | 
|  | +ssize_t | 
|  | +__libc_pread (fd, buf, count, offset) | 
|  | +     int fd; | 
|  | +     void *buf; | 
|  | +     size_t count; | 
|  | +     off_t offset; | 
|  | +{ | 
|  | +  ssize_t result; | 
|  | + | 
|  | +#if _RISCV_SIM != _ABI64 | 
|  | +  assert (sizeof (offset) == 4); | 
|  | +#endif | 
|  | + | 
|  | +  if (SINGLE_THREAD_P) | 
|  | +    { | 
|  | +      /* First try the syscall.  */ | 
|  | +#if _RISCV_SIM == _ABIN32 || _RISCV_SIM == _ABI64 | 
|  | +      result = INLINE_SYSCALL (pread, 4, fd, CHECK_N (buf, count), count, | 
|  | +			       offset); | 
|  | +#else | 
|  | +      result = INLINE_SYSCALL (pread, 6, fd, CHECK_N (buf, count), count, 0, | 
|  | +			       __LONG_LONG_PAIR (offset >> 31, offset)); | 
|  | +#endif | 
|  | +# if __ASSUME_PREAD_SYSCALL == 0 | 
|  | +      if (result == -1 && errno == ENOSYS) | 
|  | +	/* No system call available.  Use the emulation.  */ | 
|  | +	result = __emulate_pread (fd, buf, count, offset); | 
|  | +# endif | 
|  | +      return result; | 
|  | +    } | 
|  | + | 
|  | +  int oldtype = LIBC_CANCEL_ASYNC (); | 
|  | + | 
|  | +  /* First try the syscall.  */ | 
|  | +#if _RISCV_SIM == _ABIN32 || _RISCV_SIM == _ABI64 | 
|  | +  result = INLINE_SYSCALL (pread, 4, fd, CHECK_N (buf, count), count, offset); | 
|  | +#else | 
|  | +  result = INLINE_SYSCALL (pread, 6, fd, CHECK_N (buf, count), count, 0, | 
|  | +			   __LONG_LONG_PAIR (offset >> 31, offset)); | 
|  | +#endif | 
|  | +# if __ASSUME_PREAD_SYSCALL == 0 | 
|  | +  if (result == -1 && errno == ENOSYS) | 
|  | +    /* No system call available.  Use the emulation.  */ | 
|  | +    result = __emulate_pread (fd, buf, count, offset); | 
|  | +# endif | 
|  | + | 
|  | +  LIBC_CANCEL_RESET (oldtype); | 
|  | + | 
|  | +  return result; | 
|  | +} | 
|  | + | 
|  | +strong_alias (__libc_pread, __pread) | 
|  | +weak_alias (__libc_pread, pread) | 
|  | + | 
|  | +# define __libc_pread(fd, buf, count, offset) \ | 
|  | +     static internal_function __emulate_pread (fd, buf, count, offset) | 
|  | +#endif | 
|  | + | 
|  | +#if __ASSUME_PREAD_SYSCALL == 0 | 
|  | +# include <sysdeps/posix/pread.c> | 
|  | +#endif | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/profil-counter.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/profil-counter.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/profil-counter.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/profil-counter.h	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1,2 @@ | 
|  | +/* We can use the ix86 version.  */ | 
|  | +#include <sysdeps/unix/sysv/linux/i386/profil-counter.h> | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/pthread_once.c glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/pthread_once.c | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/pthread_once.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/pthread_once.c	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1 @@ | 
|  | +#include <nptl/sysdeps/unix/sysv/linux/sparc/pthread_once.c> | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/putmsg.c glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/putmsg.c | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/putmsg.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/putmsg.c	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1 @@ | 
|  | +#include <sysdeps/unix/sysv/linux/i386/putmsg.c> | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/pwrite64.c glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/pwrite64.c | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/pwrite64.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/pwrite64.c	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1,108 @@ | 
|  | +/* Copyright (C) 1997, 1998, 2000, 2002, 2003, 2004 | 
|  | +   Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by Ralf Baechle <ralf@gnu.org>, 1998. | 
|  | + | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <errno.h> | 
|  | +#ifndef NO_SGIDEFS_H | 
|  | +#include <sgidefs.h> | 
|  | +#endif | 
|  | +#include <unistd.h> | 
|  | +#include <endian.h> | 
|  | + | 
|  | +#include <sysdep-cancel.h> | 
|  | +#include <sys/syscall.h> | 
|  | +#include <bp-checks.h> | 
|  | + | 
|  | +#include <kernel-features.h> | 
|  | + | 
|  | +#ifdef __NR_pwrite64	    /* Newer kernels renamed but it's the same.  */ | 
|  | +# ifdef __NR_pwrite | 
|  | +#  error "__NR_pwrite and __NR_pwrite64 both defined???" | 
|  | +# endif | 
|  | +# define __NR_pwrite __NR_pwrite64 | 
|  | +#endif | 
|  | + | 
|  | +#if defined __NR_pwrite || __ASSUME_PWRITE_SYSCALL > 0 | 
|  | + | 
|  | +# if __ASSUME_PWRITE_SYSCALL == 0 | 
|  | +static ssize_t __emulate_pwrite64 (int fd, const void *buf, size_t count, | 
|  | +				   off64_t offset) internal_function; | 
|  | +# endif | 
|  | + | 
|  | +ssize_t | 
|  | +__libc_pwrite64 (fd, buf, count, offset) | 
|  | +     int fd; | 
|  | +     const void *buf; | 
|  | +     size_t count; | 
|  | +     off64_t offset; | 
|  | +{ | 
|  | +  ssize_t result; | 
|  | + | 
|  | +  if (SINGLE_THREAD_P) | 
|  | +    { | 
|  | +     /* First try the syscall.  */ | 
|  | +#if _RISCV_SIM == _ABIN32 || _RISCV_SIM == _ABI64 | 
|  | +      result = INLINE_SYSCALL (pwrite, 4, fd, CHECK_N (buf, count), count, | 
|  | +			       offset); | 
|  | +#else | 
|  | +     result = INLINE_SYSCALL (pwrite, 6, fd, CHECK_N (buf, count), count, 0, | 
|  | +			      __LONG_LONG_PAIR ((off_t) (offset >> 32), | 
|  | +			     (off_t) (offset & 0xffffffff))); | 
|  | +#endif | 
|  | +# if __ASSUME_PWRITE_SYSCALL == 0 | 
|  | +     if (result == -1 && errno == ENOSYS) | 
|  | +     /* No system call available.  Use the emulation.  */ | 
|  | +     result = __emulate_pwrite64 (fd, buf, count, offset); | 
|  | +# endif | 
|  | + | 
|  | +     return result; | 
|  | +    } | 
|  | + | 
|  | +  int oldtype = LIBC_CANCEL_ASYNC (); | 
|  | + | 
|  | +  /* First try the syscall.  */ | 
|  | +#if _RISCV_SIM == _ABIN32 || _RISCV_SIM == _ABI64 | 
|  | +  result = INLINE_SYSCALL (pwrite, 4, fd, CHECK_N (buf, count), count, offset); | 
|  | +#else | 
|  | +  result = INLINE_SYSCALL (pwrite, 6, fd, CHECK_N (buf, count), count, 0, | 
|  | +			   __LONG_LONG_PAIR ((off_t) (offset >> 32), | 
|  | +					     (off_t) (offset & 0xffffffff))); | 
|  | +#endif | 
|  | +# if __ASSUME_PWRITE_SYSCALL == 0 | 
|  | +  if (result == -1 && errno == ENOSYS) | 
|  | +    /* No system call available.  Use the emulation.  */ | 
|  | +    result = __emulate_pwrite64 (fd, buf, count, offset); | 
|  | +# endif | 
|  | + | 
|  | +  LIBC_CANCEL_RESET (oldtype); | 
|  | + | 
|  | +  return result; | 
|  | +} | 
|  | + | 
|  | +weak_alias (__libc_pwrite64, __pwrite64) | 
|  | +libc_hidden_weak (__pwrite64) | 
|  | +weak_alias (__libc_pwrite64, pwrite64) | 
|  | + | 
|  | +# define __libc_pwrite64(fd, buf, count, offset) \ | 
|  | +     static internal_function __emulate_pwrite64 (fd, buf, count, offset) | 
|  | +#endif | 
|  | + | 
|  | +#if __ASSUME_PWRITE_SYSCALL == 0 | 
|  | +# include <sysdeps/posix/pwrite64.c> | 
|  | +#endif | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/pwrite.c glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/pwrite.c | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/pwrite.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/pwrite.c	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1,109 @@ | 
|  | +/* Copyright (C) 1997, 1998, 2000, 2002, 2003, 2004 | 
|  | +   Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. | 
|  | + | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <assert.h> | 
|  | +#include <errno.h> | 
|  | +#ifndef NO_SGIDEFS_H | 
|  | +#include <sgidefs.h> | 
|  | +#endif | 
|  | +#include <unistd.h> | 
|  | +#include <endian.h> | 
|  | + | 
|  | +#include <sysdep-cancel.h> | 
|  | +#include <sys/syscall.h> | 
|  | +#include <bp-checks.h> | 
|  | + | 
|  | +#include <kernel-features.h> | 
|  | + | 
|  | +#ifdef __NR_pwrite64	    /* Newer kernels renamed but it's the same.  */ | 
|  | +# ifdef __NR_pwrite | 
|  | +#  error "__NR_pwrite and __NR_pwrite64 both defined???" | 
|  | +# endif | 
|  | +# define __NR_pwrite __NR_pwrite64 | 
|  | +#endif | 
|  | + | 
|  | +#if defined __NR_pwrite || __ASSUME_PWRITE_SYSCALL > 0 | 
|  | + | 
|  | +# if __ASSUME_PWRITE_SYSCALL == 0 | 
|  | +static ssize_t __emulate_pwrite (int fd, const void *buf, size_t count, | 
|  | +				 off_t offset) internal_function; | 
|  | +# endif | 
|  | + | 
|  | +ssize_t | 
|  | +__libc_pwrite (fd, buf, count, offset) | 
|  | +     int fd; | 
|  | +     const void *buf; | 
|  | +     size_t count; | 
|  | +     off_t offset; | 
|  | +{ | 
|  | +  ssize_t result; | 
|  | + | 
|  | +#if _RISCV_SIM != _ABI64 | 
|  | +  assert (sizeof (offset) == 4); | 
|  | +#endif | 
|  | + | 
|  | +  if (SINGLE_THREAD_P) | 
|  | +    { | 
|  | +      /* First try the syscall.  */ | 
|  | +#if _RISCV_SIM == _ABIN32 || _RISCV_SIM == _ABI64 | 
|  | +      result = INLINE_SYSCALL (pwrite, 4, fd, CHECK_N (buf, count), count, | 
|  | +			       offset); | 
|  | +#else | 
|  | +      result = INLINE_SYSCALL (pwrite, 6, fd, CHECK_N (buf, count), count, 0, | 
|  | +			       __LONG_LONG_PAIR (offset >> 31, offset)); | 
|  | +#endif | 
|  | +# if __ASSUME_PWRITE_SYSCALL == 0 | 
|  | +      if (result == -1 && errno == ENOSYS) | 
|  | +	/* No system call available.  Use the emulation.  */ | 
|  | +	result = __emulate_pwrite (fd, buf, count, offset); | 
|  | +# endif | 
|  | +      return result; | 
|  | +    } | 
|  | + | 
|  | +  int oldtype = LIBC_CANCEL_ASYNC (); | 
|  | + | 
|  | +  /* First try the syscall.  */ | 
|  | +#if _RISCV_SIM == _ABIN32 || _RISCV_SIM == _ABI64 | 
|  | +  result = INLINE_SYSCALL (pwrite, 4, fd, CHECK_N (buf, count), count, offset); | 
|  | +#else | 
|  | +  result = INLINE_SYSCALL (pwrite, 6, fd, CHECK_N (buf, count), count, 0, | 
|  | +			   __LONG_LONG_PAIR (offset >> 31, offset)); | 
|  | +#endif | 
|  | +# if __ASSUME_PWRITE_SYSCALL == 0 | 
|  | +  if (result == -1 && errno == ENOSYS) | 
|  | +    /* No system call available.  Use the emulation.  */ | 
|  | +    result = __emulate_pwrite (fd, buf, count, offset); | 
|  | +# endif | 
|  | + | 
|  | +  LIBC_CANCEL_RESET (oldtype); | 
|  | + | 
|  | +  return result; | 
|  | +} | 
|  | + | 
|  | +strong_alias (__libc_pwrite, __pwrite) | 
|  | +weak_alias (__libc_pwrite, pwrite) | 
|  | + | 
|  | +# define __libc_pwrite(fd, buf, count, offset) \ | 
|  | +     static internal_function __emulate_pwrite (fd, buf, count, offset) | 
|  | +#endif | 
|  | + | 
|  | +#if __ASSUME_PWRITE_SYSCALL == 0 | 
|  | +# include <sysdeps/posix/pwrite.c> | 
|  | +#endif | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/readelflib.c glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/readelflib.c | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/readelflib.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/readelflib.c	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1,74 @@ | 
|  | +/* Copyright (C) 1999, 2001, 2002, 2003, 2005, 2009 | 
|  | +   Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by Alexandre Oliva <aoliva@redhat.com> | 
|  | +   Based on work ../x86_64/readelflib.c, | 
|  | +   contributed by Andreas Jaeger <aj@suse.de>, 1999 and | 
|  | +		  Jakub Jelinek <jakub@redhat.com>, 1999. | 
|  | + | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | + | 
|  | +int process_elf32_file (const char *file_name, const char *lib, int *flag, | 
|  | +			unsigned int *osversion, char **soname, | 
|  | +			void *file_contents, size_t file_length); | 
|  | +int process_elf64_file (const char *file_name, const char *lib, int *flag, | 
|  | +			unsigned int *osversion, char **soname, | 
|  | +			void *file_contents, size_t file_length); | 
|  | + | 
|  | +/* Returns 0 if everything is ok, != 0 in case of error.  */ | 
|  | +int | 
|  | +process_elf_file (const char *file_name, const char *lib, int *flag, | 
|  | +		  unsigned int *osversion, char **soname, void *file_contents, | 
|  | +		  size_t file_length) | 
|  | +{ | 
|  | +  ElfW(Ehdr) *elf_header = (ElfW(Ehdr) *) file_contents; | 
|  | +  int ret; | 
|  | + | 
|  | +  if (elf_header->e_ident [EI_CLASS] == ELFCLASS32) | 
|  | +    { | 
|  | +      Elf32_Ehdr *elf32_header = (Elf32_Ehdr *) elf_header; | 
|  | + | 
|  | +      ret = process_elf32_file (file_name, lib, flag, osversion, soname, | 
|  | +				file_contents, file_length); | 
|  | + | 
|  | +      /* n32 libraries are always libc.so.6+.  */ | 
|  | +      if (!ret && (elf32_header->e_flags & EF_MIPS_ABI2) != 0) | 
|  | +	*flag = FLAG_MIPS64_LIBN32|FLAG_ELF_LIBC6; | 
|  | +    } | 
|  | +  else | 
|  | +    { | 
|  | +      ret = process_elf64_file (file_name, lib, flag, osversion, soname, | 
|  | +				file_contents, file_length); | 
|  | +      /* n64 libraries are always libc.so.6+.  */ | 
|  | +      if (!ret) | 
|  | +	*flag = FLAG_MIPS64_LIBN64|FLAG_ELF_LIBC6; | 
|  | +    } | 
|  | + | 
|  | +  return ret; | 
|  | +} | 
|  | + | 
|  | +#undef __ELF_NATIVE_CLASS | 
|  | +#undef process_elf_file | 
|  | +#define process_elf_file process_elf32_file | 
|  | +#define __ELF_NATIVE_CLASS 32 | 
|  | +#include "elf/readelflib.c" | 
|  | + | 
|  | +#undef __ELF_NATIVE_CLASS | 
|  | +#undef process_elf_file | 
|  | +#define process_elf_file process_elf64_file | 
|  | +#define __ELF_NATIVE_CLASS 64 | 
|  | +#include "elf/readelflib.c" | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/register-dump.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/register-dump.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/register-dump.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/register-dump.h	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1,105 @@ | 
|  | +/* Dump registers. | 
|  | +   Copyright (C) 2000, 2001, 2002, 2006 Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by Andreas Jaeger <aj@suse.de>, 2000. | 
|  | + | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <sys/uio.h> | 
|  | +#include <stdio-common/_itoa.h> | 
|  | + | 
|  | +/* We will print the register dump in this format: | 
|  | + | 
|  | + R0   XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX | 
|  | + R8   XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX | 
|  | + R16  XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX | 
|  | + R24  XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX | 
|  | +	    pc       lo       hi | 
|  | +      XXXXXXXX XXXXXXXX XXXXXXXX | 
|  | + The FPU registers will not be printed. | 
|  | +*/ | 
|  | + | 
|  | +static void | 
|  | +hexvalue (unsigned long int value, char *buf, size_t len) | 
|  | +{ | 
|  | +  char *cp = _itoa_word (value, buf + len, 16, 0); | 
|  | +  while (cp > buf) | 
|  | +    *--cp = '0'; | 
|  | +} | 
|  | + | 
|  | +static void | 
|  | +register_dump (int fd, struct sigcontext *ctx) | 
|  | +{ | 
|  | +  char regs[38][8]; | 
|  | +  struct iovec iov[38 * 2 + 10]; | 
|  | +  size_t nr = 0; | 
|  | +  int i; | 
|  | + | 
|  | +#define ADD_STRING(str) \ | 
|  | +  iov[nr].iov_base = (char *) str;					      \ | 
|  | +  iov[nr].iov_len = strlen (str);					      \ | 
|  | +  ++nr | 
|  | +#define ADD_MEM(str, len) \ | 
|  | +  iov[nr].iov_base = str;						      \ | 
|  | +  iov[nr].iov_len = len;						      \ | 
|  | +  ++nr | 
|  | + | 
|  | +  /* Generate strings of register contents.  */ | 
|  | +  for (i = 0; i < 32; i++) | 
|  | +    hexvalue (ctx->sc_regs[i], regs[i], 8); | 
|  | +  hexvalue (ctx->sc_pc, regs[32], 8); | 
|  | +  hexvalue (ctx->sc_mdhi, regs[33], 8); | 
|  | +  hexvalue (ctx->sc_mdlo, regs[34], 8); | 
|  | + | 
|  | +  /* Generate the output.  */ | 
|  | +  ADD_STRING ("Register dump:\n\n R0   "); | 
|  | +  for (i = 0; i < 8; i++) | 
|  | +    { | 
|  | +      ADD_MEM (regs[i], 8); | 
|  | +      ADD_STRING (" "); | 
|  | +    } | 
|  | +  ADD_STRING ("\n R8   "); | 
|  | +  for (i = 8; i < 16; i++) | 
|  | +    { | 
|  | +      ADD_MEM (regs[i], 8); | 
|  | +      ADD_STRING (" "); | 
|  | +    } | 
|  | +  ADD_STRING ("\n R16  "); | 
|  | +  for (i = 16; i < 24; i++) | 
|  | +    { | 
|  | +      ADD_MEM (regs[i], 8); | 
|  | +      ADD_STRING (" "); | 
|  | +    } | 
|  | +  ADD_STRING ("\n R24  "); | 
|  | +  for (i = 24; i < 32; i++) | 
|  | +    { | 
|  | +      ADD_MEM (regs[i], 8); | 
|  | +      ADD_STRING (" "); | 
|  | +    } | 
|  | +  ADD_STRING ("\n	    pc       lo       hi\n      "); | 
|  | +  for (i = 32; i < 35; i++) | 
|  | +    { | 
|  | +      ADD_MEM (regs[i], 8); | 
|  | +      ADD_STRING (" "); | 
|  | +    } | 
|  | +  ADD_STRING ("\n"); | 
|  | + | 
|  | +  /* Write the stuff out.  */ | 
|  | +  writev (fd, iov, nr); | 
|  | +} | 
|  | + | 
|  | + | 
|  | +#define REGISTER_DUMP register_dump (fd, ctx) | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv32/accept4.c glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv32/accept4.c | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv32/accept4.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv32/accept4.c	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1,32 @@ | 
|  | +/* Copyright (C) 2008, 2009 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +/* Avoid accept4.c trying to use a definition based on the socketcall | 
|  | +   syscall and internal_accept4.S.  */ | 
|  | + | 
|  | +#include <errno.h> | 
|  | +#include <signal.h> | 
|  | +#include <sys/socket.h> | 
|  | + | 
|  | +#include <sysdep-cancel.h> | 
|  | +#include <sys/syscall.h> | 
|  | +#include <kernel-features.h> | 
|  | + | 
|  | +#undef __NR_socketcall | 
|  | + | 
|  | +#include <sysdeps/unix/sysv/linux/accept4.c> | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv32/fxstatat.c glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv32/fxstatat.c | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv32/fxstatat.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv32/fxstatat.c	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1 @@ | 
|  | +#include <sysdeps/unix/sysv/linux/i386/fxstatat.c> | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv32/internal_accept4.S glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv32/internal_accept4.S | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv32/internal_accept4.S	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv32/internal_accept4.S	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1,2 @@ | 
|  | +/* MIPS does not have socket.S and the socketcall syscall should | 
|  | +   generally be avoided, though it exists.  */ | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv32/internal_recvmmsg.S glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv32/internal_recvmmsg.S | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv32/internal_recvmmsg.S	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv32/internal_recvmmsg.S	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1,2 @@ | 
|  | +/* MIPS does not have socket.S and the socketcall syscall should | 
|  | +   generally be avoided, though it exists.  */ | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv32/posix_fadvise64.c glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv32/posix_fadvise64.c | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv32/posix_fadvise64.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv32/posix_fadvise64.c	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1,61 @@ | 
|  | +/* Copyright (C) 2007 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <errno.h> | 
|  | +#include <fcntl.h> | 
|  | +#include <sysdep.h> | 
|  | + | 
|  | +/* Advice the system about the expected behaviour of the application with | 
|  | +   respect to the file associated with FD.  */ | 
|  | + | 
|  | +int | 
|  | +__posix_fadvise64_l64 (int fd, off64_t offset, off64_t len, int advise) | 
|  | +{ | 
|  | +/* MIPS kernel only has NR_fadvise64 which acts as NR_fadvise64_64 */ | 
|  | +#ifdef __NR_fadvise64 | 
|  | +  INTERNAL_SYSCALL_DECL (err); | 
|  | +  int ret = INTERNAL_SYSCALL (fadvise64, err, 7, fd, 0, | 
|  | +			      __LONG_LONG_PAIR ((long) (offset >> 32), | 
|  | +						(long) offset), | 
|  | +			      __LONG_LONG_PAIR ((long) (len >> 32), | 
|  | +						(long) len), | 
|  | +			      advise); | 
|  | +  if (INTERNAL_SYSCALL_ERROR_P (ret, err)) | 
|  | +    return INTERNAL_SYSCALL_ERRNO (ret, err); | 
|  | +  return 0; | 
|  | +#else | 
|  | +  return ENOSYS; | 
|  | +#endif | 
|  | +} | 
|  | + | 
|  | +#include <shlib-compat.h> | 
|  | + | 
|  | +#if SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) | 
|  | + | 
|  | +int | 
|  | +attribute_compat_text_section | 
|  | +__posix_fadvise64_l32 (int fd, off64_t offset, size_t len, int advise) | 
|  | +{ | 
|  | +  return __posix_fadvise64_l64 (fd, offset, len, advise); | 
|  | +} | 
|  | + | 
|  | +versioned_symbol (libc, __posix_fadvise64_l64, posix_fadvise64, GLIBC_2_3_3); | 
|  | +compat_symbol (libc, __posix_fadvise64_l32, posix_fadvise64, GLIBC_2_2); | 
|  | +#else | 
|  | +strong_alias (__posix_fadvise64_l64, posix_fadvise64); | 
|  | +#endif | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv32/posix_fadvise.c glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv32/posix_fadvise.c | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv32/posix_fadvise.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv32/posix_fadvise.c	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1,42 @@ | 
|  | +/* Copyright (C) 2007 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <errno.h> | 
|  | +#include <fcntl.h> | 
|  | +#include <sysdep.h> | 
|  | + | 
|  | +/* Advice the system about the expected behaviour of the application with | 
|  | +   respect to the file associated with FD.  */ | 
|  | + | 
|  | +int | 
|  | +posix_fadvise (int fd, off_t offset, off_t len, int advise) | 
|  | +{ | 
|  | +/* MIPS kernel only has NR_fadvise64 which acts as NR_fadvise64_64 */ | 
|  | +#ifdef __NR_fadvise64 | 
|  | +  INTERNAL_SYSCALL_DECL (err); | 
|  | +  int ret = INTERNAL_SYSCALL (fadvise64, err, 7, fd, 0, | 
|  | +			      __LONG_LONG_PAIR (offset >> 31, offset), | 
|  | +			      __LONG_LONG_PAIR (len >> 31, len), | 
|  | +			      advise); | 
|  | +  if (INTERNAL_SYSCALL_ERROR_P (ret, err)) | 
|  | +    return INTERNAL_SYSCALL_ERRNO (ret, err); | 
|  | +  return 0; | 
|  | +#else | 
|  | +  return ENOSYS; | 
|  | +#endif | 
|  | +} | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv32/readahead.c glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv32/readahead.c | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv32/readahead.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv32/readahead.c	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1 @@ | 
|  | +#include <sysdeps/unix/sysv/linux/arm/eabi/readahead.c> | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv32/recvmmsg.c glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv32/recvmmsg.c | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv32/recvmmsg.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv32/recvmmsg.c	2014-12-09 16:55:03.176727898 -0800 | 
|  | @@ -0,0 +1,31 @@ | 
|  | +/* Copyright (C) 2010 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +/* Avoid recvmmsg.c trying to use a definition based on the socketcall | 
|  | +   syscall and internal_recvmmsg.S.  */ | 
|  | + | 
|  | +#include <errno.h> | 
|  | +#include <sys/socket.h> | 
|  | + | 
|  | +#include <sysdep-cancel.h> | 
|  | +#include <sys/syscall.h> | 
|  | +#include <kernel-features.h> | 
|  | + | 
|  | +#undef __NR_socketcall | 
|  | + | 
|  | +#include <sysdeps/unix/sysv/linux/recvmmsg.c> | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv32/sync_file_range.c glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv32/sync_file_range.c | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv32/sync_file_range.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv32/sync_file_range.c	2014-12-09 16:55:03.180727918 -0800 | 
|  | @@ -0,0 +1,47 @@ | 
|  | +/* Selective file content synch'ing. | 
|  | +   Copyright (C) 2006, 2007 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <errno.h> | 
|  | +#include <fcntl.h> | 
|  | +#include <sys/types.h> | 
|  | + | 
|  | +#include <sysdep.h> | 
|  | +#include <sys/syscall.h> | 
|  | + | 
|  | + | 
|  | +#ifdef __NR_sync_file_range | 
|  | +int | 
|  | +sync_file_range (int fd, __off64_t from, __off64_t to, unsigned int flags) | 
|  | +{ | 
|  | +  return INLINE_SYSCALL (sync_file_range, 7, fd, 0, | 
|  | +			 __LONG_LONG_PAIR ((long) (from >> 32), (long) from), | 
|  | +			 __LONG_LONG_PAIR ((long) (to >> 32), (long) to), | 
|  | +			 flags); | 
|  | +} | 
|  | +#else | 
|  | +int | 
|  | +sync_file_range (int fd, __off64_t from, __off64_t to, unsigned int flags) | 
|  | +{ | 
|  | +  __set_errno (ENOSYS); | 
|  | +  return -1; | 
|  | +} | 
|  | +stub_warning (sync_file_range) | 
|  | + | 
|  | +# include <stub-tag.h> | 
|  | +#endif | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv32/syscalls.list glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv32/syscalls.list | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv32/syscalls.list	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv32/syscalls.list	2014-12-09 16:55:03.180727918 -0800 | 
|  | @@ -0,0 +1,5 @@ | 
|  | +# File name	Caller	Syscall name	# args	Strong name	Weak names | 
|  | + | 
|  | +prlimit64	EXTRA	prlimit64	i:iipp	prlimit64 | 
|  | + | 
|  | +fanotify_mark	EXTRA	fanotify_mark	i:iiiiis	fanotify_mark | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv64/configure glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv64/configure | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv64/configure	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv64/configure	2014-12-09 16:55:03.180727918 -0800 | 
|  | @@ -0,0 +1,4 @@ | 
|  | +# This file is generated from configure.in by Autoconf.  DO NOT EDIT! | 
|  | + # Local configure fragment for sysdeps/unix/sysv/linux/mips/mips64. | 
|  | + | 
|  | +ldd_rewrite_script=$dest/ldd-rewrite.sed | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv64/configure.in glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv64/configure.in | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv64/configure.in	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv64/configure.in	2014-12-09 16:55:03.180727918 -0800 | 
|  | @@ -0,0 +1,5 @@ | 
|  | +sinclude(./aclocal.m4)dnl Autoconf lossage | 
|  | +GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory. | 
|  | +# Local configure fragment for sysdeps/unix/sysv/linux/mips/mips64. | 
|  | + | 
|  | +ldd_rewrite_script=$dest/ldd-rewrite.sed | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv64/fallocate64.c glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv64/fallocate64.c | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv64/fallocate64.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv64/fallocate64.c	2014-12-09 16:55:03.180727918 -0800 | 
|  | @@ -0,0 +1 @@ | 
|  | +/* fallocate64 is in fallocate.c */ | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv64/fallocate.c glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv64/fallocate.c | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv64/fallocate.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv64/fallocate.c	2014-12-09 16:55:03.180727918 -0800 | 
|  | @@ -0,0 +1 @@ | 
|  | +#include <sysdeps/unix/sysv/linux/wordsize-64/fallocate.c> | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv64/glob64.c glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv64/glob64.c | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv64/glob64.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv64/glob64.c	2014-12-09 16:55:03.180727918 -0800 | 
|  | @@ -0,0 +1 @@ | 
|  | +/* glob64 is in glob.c */ | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv64/ldconfig.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv64/ldconfig.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv64/ldconfig.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv64/ldconfig.h	2014-12-09 16:55:03.180727918 -0800 | 
|  | @@ -0,0 +1,26 @@ | 
|  | +/* Copyright (C) 2001, 2002, 2003 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <sysdeps/generic/ldconfig.h> | 
|  | + | 
|  | +#define SYSDEP_KNOWN_INTERPRETER_NAMES \ | 
|  | +  { "/lib32/ld.so.1", FLAG_ELF_LIBC6 }, \ | 
|  | +  { "/lib/ld.so.1", FLAG_ELF_LIBC6 }, | 
|  | +#define SYSDEP_KNOWN_LIBRARY_NAMES \ | 
|  | +  { "libc.so.6", FLAG_ELF_LIBC6 },	\ | 
|  | +  { "libm.so.6", FLAG_ELF_LIBC6 }, | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv64/ldd-rewrite.sed glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv64/ldd-rewrite.sed | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv64/ldd-rewrite.sed	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv64/ldd-rewrite.sed	2014-12-09 16:55:03.180727918 -0800 | 
|  | @@ -0,0 +1 @@ | 
|  | +s_^\(RTLDLIST=\)\(.*lib\)\(\|32\|64\)\(/[^/]*\.so\.[0-9.]*\)[ 	]*$_\1"\232\4 \264\4 \2\4"_ | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv64/llseek.c glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv64/llseek.c | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv64/llseek.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv64/llseek.c	2014-12-09 16:55:03.180727918 -0800 | 
|  | @@ -0,0 +1 @@ | 
|  | +/* lseek() is 64-bit capable already.  */ | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv64/Makefile glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv64/Makefile | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv64/Makefile	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv64/Makefile	2014-12-09 16:55:03.180727918 -0800 | 
|  | @@ -0,0 +1,9 @@ | 
|  | +ifeq ($(subdir),socket) | 
|  | +CFLAGS-recv.c += -fexceptions | 
|  | +CFLAGS-send.c += -fexceptions | 
|  | +endif | 
|  | + | 
|  | +ifeq ($(subdir),nptl) | 
|  | +CFLAGS-recv.c += -fexceptions | 
|  | +CFLAGS-send.c += -fexceptions | 
|  | +endif | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv64/posix_fadvise64.c glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv64/posix_fadvise64.c | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv64/posix_fadvise64.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv64/posix_fadvise64.c	2014-12-09 16:55:03.180727918 -0800 | 
|  | @@ -0,0 +1 @@ | 
|  | +/* posix_fadvise64 is in posix_fadvise.c */ | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv64/posix_fadvise.c glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv64/posix_fadvise.c | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv64/posix_fadvise.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv64/posix_fadvise.c	2014-12-09 16:55:03.180727918 -0800 | 
|  | @@ -0,0 +1 @@ | 
|  | +#include <sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise.c> | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv64/posix_fallocate64.c glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv64/posix_fallocate64.c | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv64/posix_fallocate64.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv64/posix_fallocate64.c	2014-12-09 16:55:03.180727918 -0800 | 
|  | @@ -0,0 +1 @@ | 
|  | +/* posix_fallocate64 is in posix_fallocate.c */ | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv64/posix_fallocate.c glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv64/posix_fallocate.c | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv64/posix_fallocate.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv64/posix_fallocate.c	2014-12-09 16:55:03.180727918 -0800 | 
|  | @@ -0,0 +1 @@ | 
|  | +#include <sysdeps/unix/sysv/linux/wordsize-64/posix_fallocate.c> | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv64/preadv64.c glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv64/preadv64.c | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv64/preadv64.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv64/preadv64.c	2014-12-09 16:55:03.180727918 -0800 | 
|  | @@ -0,0 +1 @@ | 
|  | +/* Empty since the preadv syscall is equivalent.  */ | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv64/pwritev64.c glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv64/pwritev64.c | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv64/pwritev64.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv64/pwritev64.c	2014-12-09 16:55:03.180727918 -0800 | 
|  | @@ -0,0 +1 @@ | 
|  | +/* Empty since the pwritev syscall is equivalent.  */ | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv64/syscalls.list glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv64/syscalls.list | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv64/syscalls.list	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv64/syscalls.list	2014-12-09 16:55:03.180727918 -0800 | 
|  | @@ -0,0 +1,17 @@ | 
|  | +# File name	Caller	Syscall name	Args	Strong name	Weak names | 
|  | + | 
|  | +lseek		-	lseek		Ci:iii	__libc_lseek	__lseek lseek __llseek llseek __libc_lseek64 __lseek64 lseek64 | 
|  | +prlimit		EXTRA	prlimit64	i:iipp	prlimit		prlimit64 | 
|  | +fanotify_mark	EXTRA	fanotify_mark	i:iiiis	fanotify_mark | 
|  | + | 
|  | +# Semaphore and shm system calls.  msgctl, shmctl, and semctl have C | 
|  | +# wrappers (to set __IPC_64). | 
|  | +msgget		-	msgget		i:ii	__msgget	msgget | 
|  | +msgrcv		-	msgrcv		Ci:ibnii __msgrcv	msgrcv | 
|  | +msgsnd		-	msgsnd		Ci:ibni	__msgsnd	msgsnd | 
|  | +shmat		-	shmat		i:ipi	__shmat		shmat | 
|  | +shmdt		-	shmdt		i:s	__shmdt		shmdt | 
|  | +shmget		-	shmget		i:iii	__shmget	shmget | 
|  | +semop		-	semop		i:ipi	__semop		semop | 
|  | +semtimedop	-	semtimedop	i:ipip	semtimedop | 
|  | +semget		-	semget		i:iii	__semget	semget | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv64/umount.c glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv64/umount.c | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/rv64/umount.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/rv64/umount.c	2014-12-09 16:55:03.180727918 -0800 | 
|  | @@ -0,0 +1,31 @@ | 
|  | +/* Copyright (C) 2000, 2001 Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by David Huggins-Daines <dhd@debian.org>, 2000. | 
|  | + | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +/* Since we don't have an oldumount system call, do what the kernel | 
|  | +   does down here.  */ | 
|  | + | 
|  | +extern long int __umount2 (const char *name, int flags); | 
|  | + | 
|  | +long int | 
|  | +__umount (const char *name) | 
|  | +{ | 
|  | +  return __umount2 (name, 0); | 
|  | +} | 
|  | + | 
|  | +weak_alias (__umount, umount); | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/setcontext.S glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/setcontext.S | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/setcontext.S	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/setcontext.S	2014-12-09 16:55:03.180727918 -0800 | 
|  | @@ -0,0 +1,145 @@ | 
|  | +/* Set current context. | 
|  | +   Copyright (C) 2009 Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by Maciej W. Rozycki <macro@codesourcery.com>. | 
|  | + | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA | 
|  | +   02110-1301, USA.  */ | 
|  | + | 
|  | +#include <sysdep.h> | 
|  | +#include <sys/asm.h> | 
|  | + | 
|  | +#include "ucontext_i.h" | 
|  | + | 
|  | +/* int setcontext (const ucontext_t *ucp) */ | 
|  | + | 
|  | +	.text | 
|  | +LEAF (__setcontext) | 
|  | + | 
|  | +	addi    sp, sp, -SZREG | 
|  | +	REG_S	a0, 0(sp) | 
|  | + | 
|  | +	/* Check for the magic flag.  */ | 
|  | +	li	v0, 1 | 
|  | +	REG_L	v1, (0 * SZREG + MCONTEXT_GREGS)(a0)	/* zero */ | 
|  | +	bne	v0, v1, 98f | 
|  | + | 
|  | +/* rt_sigprocmask (SIG_SETMASK, &ucp->uc_sigmask, NULL, _NSIG8) */ | 
|  | +	li	a3, _NSIG8 | 
|  | +	move	a2, zero | 
|  | +	add     a1, a0, UCONTEXT_SIGMASK | 
|  | +	li	a0, SIG_SETMASK | 
|  | + | 
|  | +	li	v0, SYS_ify (rt_sigprocmask) | 
|  | +	syscall | 
|  | + | 
|  | +	REG_L   v0, 0(sp) | 
|  | +	addi    sp, sp, SZREG | 
|  | +	bnez	a3, 99f | 
|  | + | 
|  | +#ifdef __riscv_hard_float | 
|  | +	lw	v1, MCONTEXT_FSR(v0) | 
|  | + | 
|  | +	fld	fs0, ( 0 * 8 + MCONTEXT_FPREGS)(v0) | 
|  | +	fld	fs1, ( 1 * 8 + MCONTEXT_FPREGS)(v0) | 
|  | +	fld	fs2, ( 2 * 8 + MCONTEXT_FPREGS)(v0) | 
|  | +	fld	fs3, ( 3 * 8 + MCONTEXT_FPREGS)(v0) | 
|  | +	fld	fs4, ( 4 * 8 + MCONTEXT_FPREGS)(v0) | 
|  | +	fld	fs5, ( 5 * 8 + MCONTEXT_FPREGS)(v0) | 
|  | +	fld	fs6, ( 6 * 8 + MCONTEXT_FPREGS)(v0) | 
|  | +	fld	fs7, ( 7 * 8 + MCONTEXT_FPREGS)(v0) | 
|  | +	fld	fs8, ( 8 * 8 + MCONTEXT_FPREGS)(v0) | 
|  | +	fld	fs9, ( 9 * 8 + MCONTEXT_FPREGS)(v0) | 
|  | +	fld	fs10,(10 * 8 + MCONTEXT_FPREGS)(v0) | 
|  | +	fld	fs11,(11 * 8 + MCONTEXT_FPREGS)(v0) | 
|  | +	fld	fs12,(12 * 8 + MCONTEXT_FPREGS)(v0) | 
|  | +	fld	fs13,(13 * 8 + MCONTEXT_FPREGS)(v0) | 
|  | +	fld	fs14,(14 * 8 + MCONTEXT_FPREGS)(v0) | 
|  | +	fld	fs15,(15 * 8 + MCONTEXT_FPREGS)(v0) | 
|  | + | 
|  | +	mtfsr	v1 | 
|  | +#endif /* __mips_hard_float */ | 
|  | + | 
|  | +	/* Note the contents of argument registers will be random | 
|  | +	   unless makecontext() has been called.  */ | 
|  | +	REG_L	ra, ( 1 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	s0, ( 2 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	s1, ( 3 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	s2, ( 4 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	s3, ( 5 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	s4, ( 6 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	s5, ( 7 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	s6, ( 8 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	s7, ( 9 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	s8, (10 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	s9, (11 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	s10,(12 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	s11,(13 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	sp, (14 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	tp, (15 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	a0, (18 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	a1, (19 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	a2, (20 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	a3, (21 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	a4, (22 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	a5, (23 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	a6, (24 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	a7, (25 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	a8, (26 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	a9, (27 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	a10,(28 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	a11,(29 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	a12,(30 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	a13,(31 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	v1, MCONTEXT_PC(v0) | 
|  | +	addi    sp, sp, SZREG | 
|  | + | 
|  | +	move	v0, zero | 
|  | +	jr	v1 | 
|  | + | 
|  | +98: | 
|  | +	/* This is a context obtained from a signal handler. | 
|  | +	   Perform a full restore by pushing the context | 
|  | +	   passed onto a simulated signal frame on the stack | 
|  | +	   and call the signal return syscall as if a signal | 
|  | +	   handler exited normally.  */ | 
|  | +	addi    sp, sp, -((RT_SIGFRAME_SIZE + ALSZ) & ALMASK) | 
|  | + | 
|  | +	/* Only ucontext is referred to from rt_sigreturn, | 
|  | +	   copy it.  */ | 
|  | +	addi    a1, sp, RT_SIGFRAME_UCONTEXT | 
|  | +	li	v1, ((UCONTEXT_SIZE + SZREG - 1) / SZREG) - 1 | 
|  | +0: | 
|  | +	REG_L	v0, (a0) | 
|  | +	addi	v1, v1, -1 | 
|  | +	addi    a1, a1, SZREG | 
|  | +	addi    a0, a0, SZREG | 
|  | +	REG_S	v0, -SZREG(a1) | 
|  | +	bgez	v1, 0b | 
|  | + | 
|  | +/* rt_sigreturn () -- no arguments, sp points to struct rt_sigframe.  */ | 
|  | +	li	v0, SYS_ify (rt_sigreturn) | 
|  | +	syscall | 
|  | + | 
|  | +	/* Restore the stack and fall through to the error | 
|  | +	   path.  Successful rt_sigreturn never returns to | 
|  | +	   its calling place.  */ | 
|  | +	addi    sp, sp, ((RT_SIGFRAME_SIZE + ALSZ) & ALMASK) | 
|  | + | 
|  | +99:	j	__syscall_error | 
|  | + | 
|  | +PSEUDO_END (__setcontext) | 
|  | + | 
|  | +weak_alias (__setcontext, setcontext) | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/sigaction.c glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/sigaction.c | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/sigaction.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/sigaction.c	2014-12-09 16:55:03.180727918 -0800 | 
|  | @@ -0,0 +1,192 @@ | 
|  | +/* Copyright (C) 1997,1998,1999,2000,2002,2003,2004,2006 | 
|  | +	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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <errno.h> | 
|  | +#include <sgidefs.h> | 
|  | +#include <signal.h> | 
|  | +#include <string.h> | 
|  | + | 
|  | +#include <sysdep.h> | 
|  | +#include <sys/syscall.h> | 
|  | + | 
|  | +#include <sgidefs.h> | 
|  | + | 
|  | +#include <kernel-features.h> | 
|  | + | 
|  | +/* The difference here is that the sigaction structure used in the | 
|  | +   kernel is not the same as we use in the libc.  Therefore we must | 
|  | +   translate it here.  */ | 
|  | +#include <kernel_sigaction.h> | 
|  | + | 
|  | +#if __ASSUME_REALTIME_SIGNALS == 0 | 
|  | +/* The variable is shared between all wrappers around signal handling | 
|  | +   functions which have RT equivalents.	 This is the definition.  */ | 
|  | +int __libc_missing_rt_sigs; | 
|  | + | 
|  | +#endif | 
|  | + | 
|  | +#if _RISCV_SIM != _ABIO32 | 
|  | + | 
|  | +# ifdef __NR_rt_sigreturn | 
|  | +static void restore_rt (void) asm ("__restore_rt"); | 
|  | +# endif | 
|  | +# ifdef __NR_sigreturn | 
|  | +static void restore (void) asm ("__restore"); | 
|  | +# endif | 
|  | +#endif | 
|  | + | 
|  | +/* If ACT is not NULL, change the action for SIG to *ACT. | 
|  | +   If OACT is not NULL, put the old action for SIG in *OACT.  */ | 
|  | +int | 
|  | +__libc_sigaction (sig, act, oact) | 
|  | +     int sig; | 
|  | +     const struct sigaction *act; | 
|  | +     struct sigaction *oact; | 
|  | +{ | 
|  | +#if __ASSUME_REALTIME_SIGNALS == 0 | 
|  | +  struct old_kernel_sigaction k_sigact, k_osigact; | 
|  | +#endif | 
|  | +  int result; | 
|  | + | 
|  | +#if defined __NR_rt_sigaction || __ASSUME_REALTIME_SIGNALS > 0 | 
|  | +  /* First try the RT signals.	*/ | 
|  | +# if __ASSUME_REALTIME_SIGNALS == 0 | 
|  | +  if (!__libc_missing_rt_sigs) | 
|  | +# endif | 
|  | +    { | 
|  | +      struct kernel_sigaction kact, koact; | 
|  | +      /* Save the current error value for later.  We need not do this | 
|  | +	 if we are guaranteed to have realtime signals.	 */ | 
|  | +# if __ASSUME_REALTIME_SIGNALS == 0 | 
|  | +      int saved_errno = errno; | 
|  | +# endif | 
|  | + | 
|  | +      if (act) | 
|  | +	{ | 
|  | +	  kact.k_sa_handler = act->sa_handler; | 
|  | +	  memcpy (&kact.sa_mask, &act->sa_mask, sizeof (kernel_sigset_t)); | 
|  | +	  kact.sa_flags = act->sa_flags; | 
|  | +# ifdef HAVE_SA_RESTORER | 
|  | +#  if _RISCV_SIM == _ABIO32 | 
|  | +	  kact.sa_restorer = act->sa_restorer; | 
|  | +#  else | 
|  | +	  kact.sa_restorer = &restore_rt; | 
|  | +#  endif | 
|  | +# endif | 
|  | +	} | 
|  | + | 
|  | +      /* XXX The size argument hopefully will have to be changed to the | 
|  | +	 real size of the user-level sigset_t.	*/ | 
|  | +      result = INLINE_SYSCALL (rt_sigaction, 4, sig, | 
|  | +			       act ? __ptrvalue (&kact) : NULL, | 
|  | +			       oact ? __ptrvalue (&koact) : NULL, | 
|  | +			       sizeof (kernel_sigset_t)); | 
|  | + | 
|  | +# if __ASSUME_REALTIME_SIGNALS == 0 | 
|  | +      if (result >= 0 || errno != ENOSYS) | 
|  | +# endif | 
|  | +	{ | 
|  | +	  if (oact && result >= 0) | 
|  | +	    { | 
|  | +	      oact->sa_handler = koact.k_sa_handler; | 
|  | +	      memcpy (&oact->sa_mask, &koact.sa_mask, | 
|  | +				sizeof (kernel_sigset_t)); | 
|  | +	      oact->sa_flags = koact.sa_flags; | 
|  | +# ifdef HAVE_SA_RESTORER | 
|  | +	      oact->sa_restorer = koact.sa_restorer; | 
|  | +# endif | 
|  | +	    } | 
|  | +	  return result; | 
|  | +	} | 
|  | + | 
|  | +# if __ASSUME_REALTIME_SIGNALS == 0 | 
|  | +      __set_errno (saved_errno); | 
|  | +      __libc_missing_rt_sigs = 1; | 
|  | +# endif | 
|  | +    } | 
|  | +#endif | 
|  | + | 
|  | +#if __ASSUME_REALTIME_SIGNALS == 0 | 
|  | +  if (act) | 
|  | +    { | 
|  | +      k_sigact.k_sa_handler = act->sa_handler; | 
|  | +      k_sigact.sa_mask = act->sa_mask.__val[0]; | 
|  | +      k_sigact.sa_flags = act->sa_flags; | 
|  | +# ifdef HAVE_SA_RESTORER | 
|  | +      k_sigact.sa_restorer = act->sa_restorer; | 
|  | +# endif | 
|  | +    } | 
|  | +  result = INLINE_SYSCALL (sigaction, 3, sig, | 
|  | +			   act ? __ptrvalue (&k_sigact) : NULL, | 
|  | +			   oact ? __ptrvalue (&k_osigact) : NULL); | 
|  | +  if (oact && result >= 0) | 
|  | +    { | 
|  | +      oact->sa_handler = k_osigact.k_sa_handler; | 
|  | +      oact->sa_mask.__val[0] = k_osigact.sa_mask; | 
|  | +      oact->sa_flags = k_osigact.sa_flags; | 
|  | +# ifdef HAVE_SA_RESTORER | 
|  | +#  if _RISCV_SIM == _ABIO32 | 
|  | +      oact->sa_restorer = k_osigact.sa_restorer; | 
|  | +#  else | 
|  | +      oact->sa_restorer = &restore; | 
|  | +#  endif | 
|  | +# endif | 
|  | +    } | 
|  | +  return result; | 
|  | +#endif | 
|  | +} | 
|  | +libc_hidden_def (__libc_sigaction) | 
|  | + | 
|  | +#ifdef WRAPPER_INCLUDE | 
|  | +# include WRAPPER_INCLUDE | 
|  | +#endif | 
|  | + | 
|  | +#ifndef LIBC_SIGACTION | 
|  | +weak_alias (__libc_sigaction, __sigaction) | 
|  | +libc_hidden_weak (__sigaction) | 
|  | +weak_alias (__libc_sigaction, sigaction) | 
|  | +#endif | 
|  | + | 
|  | +/* NOTE: Please think twice before making any changes to the bits of | 
|  | +   code below.  GDB needs some intimate knowledge about it to | 
|  | +   recognize them as signal trampolines, and make backtraces through | 
|  | +   signal handlers work right.  Important are both the names | 
|  | +   (__restore_rt) and the exact instruction sequence. | 
|  | +   If you ever feel the need to make any changes, please notify the | 
|  | +   appropriate GDB maintainer.  */ | 
|  | + | 
|  | +#define RESTORE(name, syscall) RESTORE2 (name, syscall) | 
|  | +#define RESTORE2(name, syscall) \ | 
|  | +asm						\ | 
|  | +  (						\ | 
|  | +   ".align 4\n"					\ | 
|  | +   "__" #name ":\n"				\ | 
|  | +   "	li v0, " #syscall "\n"			\ | 
|  | +   "	syscall\n"				\ | 
|  | +   ); | 
|  | + | 
|  | +/* The return code for realtime-signals.  */ | 
|  | +#if _RISCV_SIM != _ABIO32 | 
|  | +# ifdef __NR_rt_sigreturn | 
|  | +RESTORE (restore_rt, __NR_rt_sigreturn) | 
|  | +# endif | 
|  | +# ifdef __NR_sigreturn | 
|  | +RESTORE (restore, __NR_sigreturn) | 
|  | +# endif | 
|  | +#endif | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/sigcontextinfo.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/sigcontextinfo.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/sigcontextinfo.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/sigcontextinfo.h	2014-12-09 16:55:03.180727918 -0800 | 
|  | @@ -0,0 +1,43 @@ | 
|  | +/* Copyright (C) 2000, 2001, 2003, 2004 Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by Andreas Jaeger <aj@suse.de>, 2000. | 
|  | + | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | + | 
|  | +#include <sgidefs.h> | 
|  | + | 
|  | +#if _RISCV_SIM == _ABIO32 | 
|  | + | 
|  | +#define SIGCONTEXT unsigned long _code, struct sigcontext * | 
|  | +#define SIGCONTEXT_EXTRA_ARGS _code, | 
|  | +#define GET_PC(ctx)	((void *) ctx->sc_pc) | 
|  | +#define GET_FRAME(ctx)	((void *) ctx->sc_regs[30]) | 
|  | +#define GET_STACK(ctx)	((void *) ctx->sc_regs[29]) | 
|  | +#define CALL_SIGHANDLER(handler, signo, ctx) \ | 
|  | +  (handler)((signo), SIGCONTEXT_EXTRA_ARGS (ctx)) | 
|  | + | 
|  | +#else | 
|  | + | 
|  | +#define SIGCONTEXT unsigned long _code, ucontext_t * | 
|  | +#define SIGCONTEXT_EXTRA_ARGS _code, | 
|  | +#define GET_PC(ctx)	((void *) ctx->uc_mcontext.pc) | 
|  | +#define GET_FRAME(ctx)	((void *) ctx->uc_mcontext.gregs[30]) | 
|  | +#define GET_STACK(ctx)	((void *) ctx->uc_mcontext.gregs[29]) | 
|  | +#define CALL_SIGHANDLER(handler, signo, ctx) \ | 
|  | +  (handler)((signo), SIGCONTEXT_EXTRA_ARGS (ctx)) | 
|  | + | 
|  | +#endif | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/socket.S glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/socket.S | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/socket.S	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/socket.S	2014-12-09 16:55:03.180727918 -0800 | 
|  | @@ -0,0 +1,91 @@ | 
|  | +/* Copyright (C) 1997, 1998, 2002, 2003 Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by Miguel de Icaza <miguel@gnu.ai.mit.edu>, 1997. | 
|  | + | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <sysdep-cancel.h> | 
|  | +#include <socketcall.h> | 
|  | + | 
|  | +#define P(a, b) P2(a, b) | 
|  | +#define P2(a, b) a##b | 
|  | + | 
|  | +#ifndef NARGS | 
|  | +#ifdef socket | 
|  | +#error NARGS not defined | 
|  | +#endif | 
|  | +#define NARGS 3 | 
|  | +#endif | 
|  | + | 
|  | +	.text | 
|  | +/* The socket-oriented system calls are handled unusually in Linux. | 
|  | +   They are all gated through the single `socketcall' system call number. | 
|  | +   `socketcall' takes two arguments: the first is the subcode, specifying | 
|  | +   which socket function is being called; and the second is a pointer to | 
|  | +   the arguments to the specific function. | 
|  | + | 
|  | +   The .S files for the other calls just #define socket and #include this.  */ | 
|  | + | 
|  | +#ifndef __socket | 
|  | +# ifndef NO_WEAK_ALIAS | 
|  | +#  define __socket P(__,socket) | 
|  | +# else | 
|  | +#  define __socket socket | 
|  | +# endif | 
|  | +#endif | 
|  | + | 
|  | +LEAF (__socket) | 
|  | + | 
|  | +	addi  sp, sp, -SZREG*NARGS | 
|  | + | 
|  | +	REG_S a0, 0*SZREG(sp) | 
|  | +	REG_S a1, 1*SZREG(sp) | 
|  | +#if NARGS > 2 | 
|  | +	REG_S a2, 2*SZREG(sp) | 
|  | +#if NARGS > 3 | 
|  | +	REG_S a3, 3*SZREG(sp) | 
|  | +#if NARGS > 4 | 
|  | +	REG_S a4, 4*SZREG(sp) | 
|  | +#if NARGS > 5 | 
|  | +	REG_S a5, 5*SZREG(sp) | 
|  | +#endif | 
|  | +#endif | 
|  | +#endif | 
|  | +#endif | 
|  | + | 
|  | +#if defined NEED_CANCELLATION && defined CENABLE | 
|  | +	SINGLE_THREAD_P(a0) | 
|  | +	bnez  a0, 1f | 
|  | +#endif | 
|  | +	li    a0, P(SOCKOP_,socket)   /* arg 1: socket subfunction */ | 
|  | +	move  a1, sp			/* arg 2: parameter block */ | 
|  | +	li    v0, SYS_ify (rt_sigprocmask) | 
|  | +	syscall | 
|  | + | 
|  | +	addi  sp, sp, SZREG*NARGS | 
|  | +	bnez	a3, 99f | 
|  | + | 
|  | +#if defined NEED_CANCELLATION && defined CENABLE | 
|  | +1:unimp | 
|  | +#endif | 
|  | + | 
|  | +99: 	j	__syscall_error | 
|  | + | 
|  | +END (__socket) | 
|  | + | 
|  | +#ifndef NO_WEAK_ALIAS | 
|  | +weak_alias (__socket, socket) | 
|  | +#endif | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/__start_context.S glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/__start_context.S | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/__start_context.S	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/__start_context.S	2014-12-09 16:55:03.172727878 -0800 | 
|  | @@ -0,0 +1,38 @@ | 
|  | +/* Modify saved context. | 
|  | +   Copyright (C) 2009 Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by Maciej W. Rozycki <macro@codesourcery.com>. | 
|  | + | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA | 
|  | +   02110-1301, USA.  */ | 
|  | + | 
|  | +#include <sysdep.h> | 
|  | +#include <sys/asm.h> | 
|  | + | 
|  | +#include "ucontext_i.h" | 
|  | + | 
|  | +	.text | 
|  | +LEAF (__start_context) | 
|  | +	move	a0, zero | 
|  | +	beqz	s0, 1f | 
|  | + | 
|  | +	/* setcontext (ucp) */ | 
|  | +	move	a0, s0 | 
|  | +	jal	__setcontext | 
|  | +	move	a0, v0 | 
|  | + | 
|  | +1:	jal	HIDDEN_JUMPTARGET (exit) | 
|  | + | 
|  | +PSEUDO_END (__start_context) | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/swapcontext.S glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/swapcontext.S | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/swapcontext.S	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/swapcontext.S	2014-12-09 16:55:03.180727918 -0800 | 
|  | @@ -0,0 +1,153 @@ | 
|  | +/* Save and set current context. | 
|  | +   Copyright (C) 2009 Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by Maciej W. Rozycki <macro@codesourcery.com>. | 
|  | + | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA | 
|  | +   02110-1301, USA.  */ | 
|  | + | 
|  | +#include <sysdep.h> | 
|  | +#include <sys/asm.h> | 
|  | + | 
|  | +#include "ucontext_i.h" | 
|  | + | 
|  | +/* int swapcontext (ucontext_t *oucp, const ucontext_t *ucp) */ | 
|  | + | 
|  | +LEAF (__swapcontext) | 
|  | +	/* Store a magic flag.	*/ | 
|  | +	li	v1, 1 | 
|  | +	REG_S	v1, ( 0 * SZREG + MCONTEXT_GREGS)(a0)	/* zero */ | 
|  | + | 
|  | +	REG_S	ra, MCONTEXT_PC(a0) | 
|  | +	REG_S	ra, ( 1 * SZREG + MCONTEXT_GREGS)(a0) | 
|  | +	REG_S	s0, ( 2 * SZREG + MCONTEXT_GREGS)(a0) | 
|  | +	REG_S	s1, ( 3 * SZREG + MCONTEXT_GREGS)(a0) | 
|  | +	REG_S	s2, ( 4 * SZREG + MCONTEXT_GREGS)(a0) | 
|  | +	REG_S	s3, ( 5 * SZREG + MCONTEXT_GREGS)(a0) | 
|  | +	REG_S	s4, ( 6 * SZREG + MCONTEXT_GREGS)(a0) | 
|  | +	REG_S	s5, ( 7 * SZREG + MCONTEXT_GREGS)(a0) | 
|  | +	REG_S	s6, ( 8 * SZREG + MCONTEXT_GREGS)(a0) | 
|  | +	REG_S	s7, ( 9 * SZREG + MCONTEXT_GREGS)(a0) | 
|  | +	REG_S	s8, (10 * SZREG + MCONTEXT_GREGS)(a0) | 
|  | +	REG_S	s9, (11 * SZREG + MCONTEXT_GREGS)(a0) | 
|  | +	REG_S	s10,(12 * SZREG + MCONTEXT_GREGS)(a0) | 
|  | +	REG_S	s11,(13 * SZREG + MCONTEXT_GREGS)(a0) | 
|  | +	REG_S	sp, (14 * SZREG + MCONTEXT_GREGS)(a0) | 
|  | +	REG_S	tp, (15 * SZREG + MCONTEXT_GREGS)(a0) | 
|  | + | 
|  | +#ifdef __riscv_hard_float | 
|  | +  mffsr v1 | 
|  | + | 
|  | +	fsd	fs0, ( 0 * 8 + MCONTEXT_FPREGS)(a0) | 
|  | +	fsd	fs1, ( 1 * 8 + MCONTEXT_FPREGS)(a0) | 
|  | +	fsd	fs2, ( 2 * 8 + MCONTEXT_FPREGS)(a0) | 
|  | +	fsd	fs3, ( 3 * 8 + MCONTEXT_FPREGS)(a0) | 
|  | +	fsd	fs4, ( 4 * 8 + MCONTEXT_FPREGS)(a0) | 
|  | +	fsd	fs5, ( 5 * 8 + MCONTEXT_FPREGS)(a0) | 
|  | +	fsd	fs6, ( 6 * 8 + MCONTEXT_FPREGS)(a0) | 
|  | +	fsd	fs7, ( 7 * 8 + MCONTEXT_FPREGS)(a0) | 
|  | +	fsd	fs8, ( 8 * 8 + MCONTEXT_FPREGS)(a0) | 
|  | +	fsd	fs9, ( 9 * 8 + MCONTEXT_FPREGS)(a0) | 
|  | +	fsd	fs10,(10 * 8 + MCONTEXT_FPREGS)(a0) | 
|  | +	fsd	fs11,(11 * 8 + MCONTEXT_FPREGS)(a0) | 
|  | +	fsd	fs12,(12 * 8 + MCONTEXT_FPREGS)(a0) | 
|  | +	fsd	fs13,(13 * 8 + MCONTEXT_FPREGS)(a0) | 
|  | +	fsd	fs14,(14 * 8 + MCONTEXT_FPREGS)(a0) | 
|  | +	fsd	fs15,(15 * 8 + MCONTEXT_FPREGS)(a0) | 
|  | + | 
|  | +	sw	v1, MCONTEXT_FSR(a0) | 
|  | +#endif /* __mips_hard_float */ | 
|  | + | 
|  | +	addi    sp, sp, -SZREG | 
|  | +	REG_S	a1, 0(sp) | 
|  | + | 
|  | +/* rt_sigprocmask (SIG_SETMASK, &ucp->uc_sigmask, NULL, _NSIG8) */ | 
|  | +	li	a3, _NSIG8 | 
|  | +	add	a2, a0, UCONTEXT_SIGMASK | 
|  | +	add     a1, a1, UCONTEXT_SIGMASK | 
|  | +	li	a0, SIG_SETMASK | 
|  | + | 
|  | +	li	v0, SYS_ify (rt_sigprocmask) | 
|  | +	syscall | 
|  | + | 
|  | +	REG_L   v0, 0(sp) | 
|  | +	addi    sp, sp, SZREG | 
|  | +	bnez	a3, 99f | 
|  | + | 
|  | +#ifdef __riscv_hard_float | 
|  | +	lw	v1, MCONTEXT_FSR(v0) | 
|  | + | 
|  | +	fld	fs0, ( 0 * 8 + MCONTEXT_FPREGS)(v0) | 
|  | +	fld	fs1, ( 1 * 8 + MCONTEXT_FPREGS)(v0) | 
|  | +	fld	fs2, ( 2 * 8 + MCONTEXT_FPREGS)(v0) | 
|  | +	fld	fs3, ( 3 * 8 + MCONTEXT_FPREGS)(v0) | 
|  | +	fld	fs4, ( 4 * 8 + MCONTEXT_FPREGS)(v0) | 
|  | +	fld	fs5, ( 5 * 8 + MCONTEXT_FPREGS)(v0) | 
|  | +	fld	fs6, ( 6 * 8 + MCONTEXT_FPREGS)(v0) | 
|  | +	fld	fs7, ( 7 * 8 + MCONTEXT_FPREGS)(v0) | 
|  | +	fld	fs8, ( 8 * 8 + MCONTEXT_FPREGS)(v0) | 
|  | +	fld	fs9, ( 9 * 8 + MCONTEXT_FPREGS)(v0) | 
|  | +	fld	fs10,(10 * 8 + MCONTEXT_FPREGS)(v0) | 
|  | +	fld	fs11,(11 * 8 + MCONTEXT_FPREGS)(v0) | 
|  | +	fld	fs12,(12 * 8 + MCONTEXT_FPREGS)(v0) | 
|  | +	fld	fs13,(13 * 8 + MCONTEXT_FPREGS)(v0) | 
|  | +	fld	fs14,(14 * 8 + MCONTEXT_FPREGS)(v0) | 
|  | +	fld	fs15,(15 * 8 + MCONTEXT_FPREGS)(v0) | 
|  | + | 
|  | +	mtfsr	v1 | 
|  | +#endif /* __mips_hard_float */ | 
|  | + | 
|  | +	/* Note the contents of argument registers will be random | 
|  | +	   unless makecontext() has been called.  */ | 
|  | +	REG_L	ra, ( 1 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	s0, ( 2 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	s1, ( 3 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	s2, ( 4 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	s3, ( 5 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	s4, ( 6 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	s5, ( 7 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	s6, ( 8 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	s7, ( 9 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	s8, (10 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	s9, (11 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	s10,(12 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	s11,(13 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	sp, (14 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	tp, (15 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	a0, (18 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	a1, (19 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	a2, (20 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	a3, (21 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	a4, (22 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	a5, (23 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	a6, (24 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	a7, (25 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	a8, (26 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	a9, (27 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	a10,(28 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	a11,(29 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	a12,(30 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	a13,(31 * SZREG + MCONTEXT_GREGS)(v0) | 
|  | +	REG_L	v1, MCONTEXT_PC(v0) | 
|  | +	addi    sp, sp, SZREG | 
|  | + | 
|  | +	move	v0, zero | 
|  | +	jr	v1 | 
|  | + | 
|  | +99:	j	__syscall_error | 
|  | + | 
|  | +PSEUDO_END (__swapcontext) | 
|  | + | 
|  | +weak_alias (__swapcontext, swapcontext) | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/sys/cachectl.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/sys/cachectl.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/sys/cachectl.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/sys/cachectl.h	2014-12-09 16:55:03.180727918 -0800 | 
|  | @@ -0,0 +1,42 @@ | 
|  | +/* Copyright (C) 1995, 1996, 1997, 2000, 2009 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef _SYS_CACHECTL_H | 
|  | +#define _SYS_CACHECTL_H 1 | 
|  | + | 
|  | +#include <features.h> | 
|  | + | 
|  | +/* | 
|  | + * Get the kernel definition for the op bits. | 
|  | + */ | 
|  | +#include <asm/cachectl.h> | 
|  | + | 
|  | +__BEGIN_DECLS | 
|  | + | 
|  | +#ifdef __USE_MISC | 
|  | +extern int cachectl (void *__addr, __const int __nbytes, __const int __op) __THROW; | 
|  | +#endif | 
|  | +extern int __cachectl (void *__addr, __const int __nbytes, __const int __op) __THROW; | 
|  | +#ifdef __USE_MISC | 
|  | +extern int cacheflush (void *__addr, __const int __nbytes, __const int __op) __THROW; | 
|  | +#endif | 
|  | +extern int _flush_cache (char *__addr, __const int __nbytes, __const int __op) __THROW; | 
|  | + | 
|  | +__END_DECLS | 
|  | + | 
|  | +#endif /* sys/cachectl.h */ | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/sys/epoll.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/sys/epoll.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/sys/epoll.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/sys/epoll.h	2014-12-09 16:55:03.180727918 -0800 | 
|  | @@ -0,0 +1,144 @@ | 
|  | +/* Copyright (C) 2002-2006, 2007, 2008 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef	_SYS_EPOLL_H | 
|  | +#define	_SYS_EPOLL_H	1 | 
|  | + | 
|  | +#include <stdint.h> | 
|  | +#include <sys/types.h> | 
|  | + | 
|  | +/* Get __sigset_t.  */ | 
|  | +#include <bits/sigset.h> | 
|  | + | 
|  | +#ifndef __sigset_t_defined | 
|  | +# define __sigset_t_defined | 
|  | +typedef __sigset_t sigset_t; | 
|  | +#endif | 
|  | + | 
|  | + | 
|  | +/* Flags to be passed to epoll_create1.  */ | 
|  | +enum | 
|  | +  { | 
|  | +    EPOLL_CLOEXEC = 02000000, | 
|  | +#define EPOLL_CLOEXEC EPOLL_CLOEXEC | 
|  | +    EPOLL_NONBLOCK = 0200 | 
|  | +#define EPOLL_NONBLOCK EPOLL_NONBLOCK | 
|  | +  }; | 
|  | + | 
|  | + | 
|  | +enum EPOLL_EVENTS | 
|  | +  { | 
|  | +    EPOLLIN = 0x001, | 
|  | +#define EPOLLIN EPOLLIN | 
|  | +    EPOLLPRI = 0x002, | 
|  | +#define EPOLLPRI EPOLLPRI | 
|  | +    EPOLLOUT = 0x004, | 
|  | +#define EPOLLOUT EPOLLOUT | 
|  | +    EPOLLRDNORM = 0x040, | 
|  | +#define EPOLLRDNORM EPOLLRDNORM | 
|  | +    EPOLLRDBAND = 0x080, | 
|  | +#define EPOLLRDBAND EPOLLRDBAND | 
|  | +    EPOLLWRNORM = 0x100, | 
|  | +#define EPOLLWRNORM EPOLLWRNORM | 
|  | +    EPOLLWRBAND = 0x200, | 
|  | +#define EPOLLWRBAND EPOLLWRBAND | 
|  | +    EPOLLMSG = 0x400, | 
|  | +#define EPOLLMSG EPOLLMSG | 
|  | +    EPOLLERR = 0x008, | 
|  | +#define EPOLLERR EPOLLERR | 
|  | +    EPOLLHUP = 0x010, | 
|  | +#define EPOLLHUP EPOLLHUP | 
|  | +    EPOLLRDHUP = 0x2000, | 
|  | +#define EPOLLRDHUP EPOLLRDHUP | 
|  | +    EPOLLONESHOT = (1 << 30), | 
|  | +#define EPOLLONESHOT EPOLLONESHOT | 
|  | +    EPOLLET = (1 << 31) | 
|  | +#define EPOLLET EPOLLET | 
|  | +  }; | 
|  | + | 
|  | + | 
|  | +/* Valid opcodes ( "op" parameter ) to issue to epoll_ctl().  */ | 
|  | +#define EPOLL_CTL_ADD 1	/* Add a file descriptor to the interface.  */ | 
|  | +#define EPOLL_CTL_DEL 2	/* Remove a file descriptor from the interface.  */ | 
|  | +#define EPOLL_CTL_MOD 3	/* Change file descriptor epoll_event structure.  */ | 
|  | + | 
|  | + | 
|  | +typedef union epoll_data | 
|  | +{ | 
|  | +  void *ptr; | 
|  | +  int fd; | 
|  | +  uint32_t u32; | 
|  | +  uint64_t u64; | 
|  | +} epoll_data_t; | 
|  | + | 
|  | +struct epoll_event | 
|  | +{ | 
|  | +  uint32_t events;	/* Epoll events */ | 
|  | +  epoll_data_t data;	/* User data variable */ | 
|  | +}; | 
|  | + | 
|  | + | 
|  | +__BEGIN_DECLS | 
|  | + | 
|  | +/* Creates an epoll instance.  Returns an fd for the new instance. | 
|  | +   The "size" parameter is a hint specifying the number of file | 
|  | +   descriptors to be associated with the new instance.  The fd | 
|  | +   returned by epoll_create() should be closed with close().  */ | 
|  | +extern int epoll_create (int __size) __THROW; | 
|  | + | 
|  | +/* Same as epoll_create but with an FLAGS parameter.  The unused SIZE | 
|  | +   parameter has been dropped.  */ | 
|  | +extern int epoll_create1 (int __flags) __THROW; | 
|  | + | 
|  | + | 
|  | +/* Manipulate an epoll instance "epfd". Returns 0 in case of success, | 
|  | +   -1 in case of error ( the "errno" variable will contain the | 
|  | +   specific error code ) The "op" parameter is one of the EPOLL_CTL_* | 
|  | +   constants defined above. The "fd" parameter is the target of the | 
|  | +   operation. The "event" parameter describes which events the caller | 
|  | +   is interested in and any associated user data.  */ | 
|  | +extern int epoll_ctl (int __epfd, int __op, int __fd, | 
|  | +		      struct epoll_event *__event) __THROW; | 
|  | + | 
|  | + | 
|  | +/* Wait for events on an epoll instance "epfd". Returns the number of | 
|  | +   triggered events returned in "events" buffer. Or -1 in case of | 
|  | +   error with the "errno" variable set to the specific error code. The | 
|  | +   "events" parameter is a buffer that will contain triggered | 
|  | +   events. The "maxevents" is the maximum number of events to be | 
|  | +   returned ( usually size of "events" ). The "timeout" parameter | 
|  | +   specifies the maximum wait time in milliseconds (-1 == infinite). | 
|  | + | 
|  | +   This function is a cancellation point and therefore not marked with | 
|  | +   __THROW.  */ | 
|  | +extern int epoll_wait (int __epfd, struct epoll_event *__events, | 
|  | +		       int __maxevents, int __timeout); | 
|  | + | 
|  | + | 
|  | +/* Same as epoll_wait, but the thread's signal mask is temporarily | 
|  | +   and atomically replaced with the one provided as parameter. | 
|  | + | 
|  | +   This function is a cancellation point and therefore not marked with | 
|  | +   __THROW.  */ | 
|  | +extern int epoll_pwait (int __epfd, struct epoll_event *__events, | 
|  | +			int __maxevents, int __timeout, | 
|  | +			__const __sigset_t *__ss); | 
|  | + | 
|  | +__END_DECLS | 
|  | + | 
|  | +#endif /* sys/epoll.h */ | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/sys/eventfd.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/sys/eventfd.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/sys/eventfd.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/sys/eventfd.h	2014-12-09 16:55:03.180727918 -0800 | 
|  | @@ -0,0 +1,54 @@ | 
|  | +/* Copyright (C) 2007, 2008, 2009 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef	_SYS_EVENTFD_H | 
|  | +#define	_SYS_EVENTFD_H	1 | 
|  | + | 
|  | +#include <stdint.h> | 
|  | + | 
|  | + | 
|  | +/* Type for event counter.  */ | 
|  | +typedef uint64_t eventfd_t; | 
|  | + | 
|  | +/* Flags for signalfd.  */ | 
|  | +enum | 
|  | +  { | 
|  | +    EFD_SEMAPHORE = 1, | 
|  | +#define EFD_SEMAPHORE EFD_SEMAPHORE | 
|  | +    EFD_CLOEXEC = 02000000, | 
|  | +#define EFD_CLOEXEC EFD_CLOEXEC | 
|  | +    EFD_NONBLOCK = 0200 | 
|  | +#define EFD_NONBLOCK EFD_NONBLOCK | 
|  | +  }; | 
|  | + | 
|  | + | 
|  | +__BEGIN_DECLS | 
|  | + | 
|  | +/* Return file descriptor for generic event channel.  Set initial | 
|  | +   value to COUNT.  */ | 
|  | +extern int eventfd (int __count, int __flags) __THROW; | 
|  | + | 
|  | +/* Read event counter and possibly wait for events.  */ | 
|  | +extern int eventfd_read (int __fd, eventfd_t *__value); | 
|  | + | 
|  | +/* Increment event counter.  */ | 
|  | +extern int eventfd_write (int __fd, eventfd_t __value); | 
|  | + | 
|  | +__END_DECLS | 
|  | + | 
|  | +#endif /* sys/eventfd.h */ | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/sys/inotify.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/sys/inotify.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/sys/inotify.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/sys/inotify.h	2014-12-09 16:55:03.180727918 -0800 | 
|  | @@ -0,0 +1,107 @@ | 
|  | +/* Copyright (C) 2005, 2006, 2008, 2009, 2010 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef	_SYS_INOTIFY_H | 
|  | +#define	_SYS_INOTIFY_H	1 | 
|  | + | 
|  | +#include <stdint.h> | 
|  | + | 
|  | + | 
|  | +/* Flags for the parameter of inotify_init1.  */ | 
|  | +enum | 
|  | +  { | 
|  | +    IN_CLOEXEC = 02000000, | 
|  | +#define IN_CLOEXEC IN_CLOEXEC | 
|  | +    IN_NONBLOCK = 0200 | 
|  | +#define IN_NONBLOCK IN_NONBLOCK | 
|  | +  }; | 
|  | + | 
|  | + | 
|  | +/* Structure describing an inotify event.  */ | 
|  | +struct inotify_event | 
|  | +{ | 
|  | +  int wd;		/* Watch descriptor.  */ | 
|  | +  uint32_t mask;	/* Watch mask.  */ | 
|  | +  uint32_t cookie;	/* Cookie to synchronize two events.  */ | 
|  | +  uint32_t len;		/* Length (including NULs) of name.  */ | 
|  | +  char name __flexarr;	/* Name.  */ | 
|  | +}; | 
|  | + | 
|  | + | 
|  | +/* Supported events suitable for MASK parameter of INOTIFY_ADD_WATCH.  */ | 
|  | +#define IN_ACCESS	 0x00000001	/* File was accessed.  */ | 
|  | +#define IN_MODIFY	 0x00000002	/* File was modified.  */ | 
|  | +#define IN_ATTRIB	 0x00000004	/* Metadata changed.  */ | 
|  | +#define IN_CLOSE_WRITE	 0x00000008	/* Writtable file was closed.  */ | 
|  | +#define IN_CLOSE_NOWRITE 0x00000010	/* Unwrittable file closed.  */ | 
|  | +#define IN_CLOSE	 (IN_CLOSE_WRITE | IN_CLOSE_NOWRITE) /* Close.  */ | 
|  | +#define IN_OPEN		 0x00000020	/* File was opened.  */ | 
|  | +#define IN_MOVED_FROM	 0x00000040	/* File was moved from X.  */ | 
|  | +#define IN_MOVED_TO      0x00000080	/* File was moved to Y.  */ | 
|  | +#define IN_MOVE		 (IN_MOVED_FROM | IN_MOVED_TO) /* Moves.  */ | 
|  | +#define IN_CREATE	 0x00000100	/* Subfile was created.  */ | 
|  | +#define IN_DELETE	 0x00000200	/* Subfile was deleted.  */ | 
|  | +#define IN_DELETE_SELF	 0x00000400	/* Self was deleted.  */ | 
|  | +#define IN_MOVE_SELF	 0x00000800	/* Self was moved.  */ | 
|  | + | 
|  | +/* Events sent by the kernel.  */ | 
|  | +#define IN_UNMOUNT	 0x00002000	/* Backing fs was unmounted.  */ | 
|  | +#define IN_Q_OVERFLOW	 0x00004000	/* Event queued overflowed.  */ | 
|  | +#define IN_IGNORED	 0x00008000	/* File was ignored.  */ | 
|  | + | 
|  | +/* Helper events.  */ | 
|  | +#define IN_CLOSE	 (IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)	/* Close.  */ | 
|  | +#define IN_MOVE		 (IN_MOVED_FROM | IN_MOVED_TO)		/* Moves.  */ | 
|  | + | 
|  | +/* Special flags.  */ | 
|  | +#define IN_ONLYDIR	 0x01000000	/* Only watch the path if it is a | 
|  | +					   directory.  */ | 
|  | +#define IN_DONT_FOLLOW	 0x02000000	/* Do not follow a sym link.  */ | 
|  | +#define IN_EXCL_UNLINK	 0x04000000	/* Exclude events on unlinked | 
|  | +					   objects.  */ | 
|  | +#define IN_MASK_ADD	 0x20000000	/* Add to the mask of an already | 
|  | +					   existing watch.  */ | 
|  | +#define IN_ISDIR	 0x40000000	/* Event occurred against dir.  */ | 
|  | +#define IN_ONESHOT	 0x80000000	/* Only send event once.  */ | 
|  | + | 
|  | +/* All events which a program can wait on.  */ | 
|  | +#define IN_ALL_EVENTS	 (IN_ACCESS | IN_MODIFY | IN_ATTRIB | IN_CLOSE_WRITE  \ | 
|  | +			  | IN_CLOSE_NOWRITE | IN_OPEN | IN_MOVED_FROM	      \ | 
|  | +			  | IN_MOVED_TO | IN_CREATE | IN_DELETE		      \ | 
|  | +			  | IN_DELETE_SELF | IN_MOVE_SELF) | 
|  | + | 
|  | + | 
|  | +__BEGIN_DECLS | 
|  | + | 
|  | +/* Create and initialize inotify instance.  */ | 
|  | +extern int inotify_init (void) __THROW; | 
|  | + | 
|  | +/* Create and initialize inotify instance.  */ | 
|  | +extern int inotify_init1 (int __flags) __THROW; | 
|  | + | 
|  | +/* Add watch of object NAME to inotify instance FD.  Notify about | 
|  | +   events specified by MASK.  */ | 
|  | +extern int inotify_add_watch (int __fd, const char *__name, uint32_t __mask) | 
|  | +  __THROW; | 
|  | + | 
|  | +/* Remove the watch specified by WD from the inotify instance FD.  */ | 
|  | +extern int inotify_rm_watch (int __fd, int __wd) __THROW; | 
|  | + | 
|  | +__END_DECLS | 
|  | + | 
|  | +#endif /* sys/inotify.h */ | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/sys/procfs.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/sys/procfs.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/sys/procfs.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/sys/procfs.h	2014-12-09 16:55:03.180727918 -0800 | 
|  | @@ -0,0 +1,128 @@ | 
|  | +/* Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004 | 
|  | +	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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef _SYS_PROCFS_H | 
|  | +#define _SYS_PROCFS_H	1 | 
|  | + | 
|  | +/* This is somehow modelled after the file of the same name on SysVr4 | 
|  | +   systems.  It provides a definition of the core file format for ELF | 
|  | +   used on Linux.  */ | 
|  | + | 
|  | +#include <features.h> | 
|  | +#include <sgidefs.h> | 
|  | +#include <sys/time.h> | 
|  | +#include <sys/types.h> | 
|  | +#include <sys/user.h> | 
|  | +#include <sgidefs.h> | 
|  | + | 
|  | +/* ELF register definitions */ | 
|  | +#define ELF_NGREG	45 | 
|  | +#define ELF_NFPREG	33 | 
|  | + | 
|  | +#if _RISCV_SIM == _ABIN32 | 
|  | +__extension__ typedef unsigned long long elf_greg_t; | 
|  | +#else | 
|  | +typedef unsigned long elf_greg_t; | 
|  | +#endif | 
|  | +typedef elf_greg_t elf_gregset_t[ELF_NGREG]; | 
|  | + | 
|  | +typedef double elf_fpreg_t; | 
|  | +typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG]; | 
|  | + | 
|  | +__BEGIN_DECLS | 
|  | + | 
|  | +struct elf_siginfo | 
|  | +  { | 
|  | +    int si_signo;			/* Signal number.  */ | 
|  | +    int si_code;			/* Extra code.  */ | 
|  | +    int si_errno;			/* Errno.  */ | 
|  | +  }; | 
|  | + | 
|  | + | 
|  | +/* Definitions to generate Intel SVR4-like core files.  These mostly | 
|  | +   have the same names as the SVR4 types with "elf_" tacked on the | 
|  | +   front to prevent clashes with linux definitions, and the typedef | 
|  | +   forms have been avoided.  This is mostly like the SVR4 structure, | 
|  | +   but more Linuxy, with things that Linux does not support and which | 
|  | +   gdb doesn't really use excluded.  Fields present but not used are | 
|  | +   marked with "XXX".  */ | 
|  | +struct elf_prstatus | 
|  | +  { | 
|  | +    struct elf_siginfo pr_info;		/* Info associated with signal.  */ | 
|  | +    short int pr_cursig;		/* Current signal.  */ | 
|  | +#if _RISCV_SIM == _ABIN32 | 
|  | +    __extension__ unsigned long long int pr_sigpend; | 
|  | +    __extension__ unsigned long long int pr_sighold; | 
|  | +#else | 
|  | +    unsigned long int pr_sigpend;	/* Set of pending signals.  */ | 
|  | +    unsigned long int pr_sighold;	/* Set of held signals.  */ | 
|  | +#endif | 
|  | +    __pid_t pr_pid; | 
|  | +    __pid_t pr_ppid; | 
|  | +    __pid_t pr_pgrp; | 
|  | +    __pid_t pr_sid; | 
|  | +    struct timeval pr_utime;		/* User time.  */ | 
|  | +    struct timeval pr_stime;		/* System time.  */ | 
|  | +    struct timeval pr_cutime;		/* Cumulative user time.  */ | 
|  | +    struct timeval pr_cstime;		/* Cumulative system time.  */ | 
|  | +    elf_gregset_t pr_reg;		/* GP registers.  */ | 
|  | +    int pr_fpvalid;			/* True if math copro being used.  */ | 
|  | +  }; | 
|  | + | 
|  | + | 
|  | +#define ELF_PRARGSZ     (80)    /* Number of chars for args */ | 
|  | + | 
|  | +struct elf_prpsinfo | 
|  | +  { | 
|  | +    char pr_state;			/* Numeric process state.  */ | 
|  | +    char pr_sname;			/* Char for pr_state.  */ | 
|  | +    char pr_zomb;			/* Zombie.  */ | 
|  | +    char pr_nice;			/* Nice val.  */ | 
|  | +#if _RISCV_SIM == _ABIN32 | 
|  | +    __extension__ unsigned long long int pr_flag; | 
|  | +#else | 
|  | +    unsigned long int pr_flag;		/* Flags.  */ | 
|  | +#endif | 
|  | +    long pr_uid; | 
|  | +    long pr_gid; | 
|  | +    int pr_pid, pr_ppid, pr_pgrp, pr_sid; | 
|  | +    /* Lots missing */ | 
|  | +    char pr_fname[16];			/* Filename of executable.  */ | 
|  | +    char pr_psargs[ELF_PRARGSZ];	/* Initial part of arg list.  */ | 
|  | +  }; | 
|  | + | 
|  | + | 
|  | +/* Addresses.  */ | 
|  | +typedef void *psaddr_t; | 
|  | + | 
|  | +/* Register sets.  Linux has different names.  */ | 
|  | +typedef elf_gregset_t prgregset_t; | 
|  | +typedef elf_fpregset_t prfpregset_t; | 
|  | + | 
|  | +/* We don't have any differences between processes and threads, | 
|  | +   therefore habe only ine PID type.  */ | 
|  | +typedef __pid_t lwpid_t; | 
|  | + | 
|  | + | 
|  | +typedef struct elf_prstatus prstatus_t; | 
|  | +typedef struct elf_prpsinfo prpsinfo_t; | 
|  | + | 
|  | +__END_DECLS | 
|  | + | 
|  | +#endif	/* sys/procfs.h */ | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/sys/signalfd.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/sys/signalfd.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/sys/signalfd.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/sys/signalfd.h	2014-12-09 16:55:03.180727918 -0800 | 
|  | @@ -0,0 +1,66 @@ | 
|  | +/* Copyright (C) 2007, 2008 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef	_SYS_SIGNALFD_H | 
|  | +#define	_SYS_SIGNALFD_H	1 | 
|  | + | 
|  | +#define __need_sigset_t | 
|  | +#include <signal.h> | 
|  | +#include <stdint.h> | 
|  | + | 
|  | + | 
|  | +struct signalfd_siginfo | 
|  | +{ | 
|  | +  uint32_t ssi_signo; | 
|  | +  int32_t ssi_errno; | 
|  | +  int32_t ssi_code; | 
|  | +  uint32_t ssi_pid; | 
|  | +  uint32_t ssi_uid; | 
|  | +  int32_t ssi_fd; | 
|  | +  uint32_t ssi_tid; | 
|  | +  uint32_t ssi_band; | 
|  | +  uint32_t ssi_overrun; | 
|  | +  uint32_t ssi_trapno; | 
|  | +  int32_t ssi_status; | 
|  | +  int32_t ssi_int; | 
|  | +  uint64_t ssi_ptr; | 
|  | +  uint64_t ssi_utime; | 
|  | +  uint64_t ssi_stime; | 
|  | +  uint64_t ssi_addr; | 
|  | +  uint8_t __pad[48]; | 
|  | +}; | 
|  | + | 
|  | +/* Flags for signalfd.  */ | 
|  | +enum | 
|  | +  { | 
|  | +    SFD_CLOEXEC = 02000000, | 
|  | +#define SFD_CLOEXEC SFD_CLOEXEC | 
|  | +    SFD_NONBLOCK = 0200 | 
|  | +#define SFD_NONBLOCK SFD_NONBLOCK | 
|  | +  }; | 
|  | + | 
|  | +__BEGIN_DECLS | 
|  | + | 
|  | +/* Request notification for delivery of signals in MASK to be | 
|  | +   performed using descriptor FD.*/ | 
|  | +extern int signalfd (int __fd, const sigset_t *__mask, int __flags) | 
|  | +  __THROW __nonnull ((2)); | 
|  | + | 
|  | +__END_DECLS | 
|  | + | 
|  | +#endif /* sys/signalfd.h */ | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/sys/syscall.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/sys/syscall.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/sys/syscall.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/sys/syscall.h	2014-12-09 16:55:03.180727918 -0800 | 
|  | @@ -0,0 +1,35 @@ | 
|  | +/* Copyright (C) 1995, 1996, 1997, 2003 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef _SYSCALL_H | 
|  | +#define _SYSCALL_H	1 | 
|  | + | 
|  | +/* This file should list the numbers of the system the system knows. | 
|  | +   But instead of duplicating this we use the information available | 
|  | +   from the kernel sources.  */ | 
|  | +#include <asm/unistd.h> | 
|  | + | 
|  | +#ifndef _LIBC | 
|  | +/* The Linux kernel header file defines macros `__NR_<name>', but some | 
|  | +   programs expect the traditional form `SYS_<name>'.  So in building libc | 
|  | +   we scan the kernel's list and produce <bits/syscall.h> with macros for | 
|  | +   all the `SYS_' names.  */ | 
|  | +# include <bits/syscall.h> | 
|  | +#endif | 
|  | + | 
|  | +#endif | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/sys/sysmips.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/sys/sysmips.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/sys/sysmips.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/sys/sysmips.h	2014-12-09 16:55:03.180727918 -0800 | 
|  | @@ -0,0 +1,43 @@ | 
|  | +/* Copyright (C) 1995, 1997, 2000, 2001, 2009 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef _SYS_SYSMIPS_H | 
|  | +#define _SYS_SYSMIPS_H 1 | 
|  | + | 
|  | +#include <features.h> | 
|  | + | 
|  | +/* | 
|  | + * Commands for the sysmips(2) call | 
|  | + * | 
|  | + * sysmips(2) is deprecated - though some existing software uses it. | 
|  | + * We only support the following commands.  Sysmips exists for compatibility | 
|  | + * purposes only so new software should avoid it. | 
|  | + */ | 
|  | +#define SETNAME                   1	/* set hostname                  */ | 
|  | +#define FLUSH_CACHE		   3	/* writeback and invalidate caches */ | 
|  | +#define MIPS_FIXADE               7	/* control address error fixing  */ | 
|  | +#define MIPS_RDNVRAM              10	/* read NVRAM			 */ | 
|  | +#define MIPS_ATOMIC_SET		2001	/* atomically set variable       */ | 
|  | + | 
|  | +__BEGIN_DECLS | 
|  | + | 
|  | +extern int sysmips (__const int __cmd, ...) __THROW; | 
|  | + | 
|  | +__END_DECLS | 
|  | + | 
|  | +#endif /* sys/sysmips.h */ | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/sys/tas.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/sys/tas.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/sys/tas.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/sys/tas.h	2014-12-09 16:55:03.180727918 -0800 | 
|  | @@ -0,0 +1,51 @@ | 
|  | +/* Copyright (C) 2000, 2002, 2003, 2004, 2007, 2009 | 
|  | +   Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by Maciej W. Rozycki <macro@ds2.pg.gda.pl>, 2000. | 
|  | + | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef _SYS_TAS_H | 
|  | +#define _SYS_TAS_H 1 | 
|  | + | 
|  | +#include <features.h> | 
|  | +#include <sgidefs.h> | 
|  | + | 
|  | +__BEGIN_DECLS | 
|  | + | 
|  | +extern int _test_and_set (int *__p, int __v) __THROW; | 
|  | + | 
|  | +#ifdef __USE_EXTERN_INLINES | 
|  | + | 
|  | +# ifndef _EXTERN_INLINE | 
|  | +#  define _EXTERN_INLINE __extern_inline | 
|  | +# endif | 
|  | + | 
|  | +_EXTERN_INLINE int | 
|  | +__NTH (_test_and_set (int *__p, int __v)) | 
|  | +{ | 
|  | +  int __r = __sync_lock_test_and_set(__p, __v); | 
|  | + | 
|  | +  __sync_synchronize(); | 
|  | + | 
|  | +  return __r; | 
|  | +} | 
|  | + | 
|  | +#endif /* __USE_EXTERN_INLINES */ | 
|  | + | 
|  | +__END_DECLS | 
|  | + | 
|  | +#endif /* sys/tas.h */ | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/sys/timerfd.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/sys/timerfd.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/sys/timerfd.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/sys/timerfd.h	2014-12-09 16:55:03.180727918 -0800 | 
|  | @@ -0,0 +1,60 @@ | 
|  | +/* Copyright (C) 2008 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef	_SYS_TIMERFD_H | 
|  | +#define	_SYS_TIMERFD_H	1 | 
|  | + | 
|  | +#include <time.h> | 
|  | + | 
|  | + | 
|  | +/* Bits to be set in the FLAGS parameter of `timerfd_create'.  */ | 
|  | +enum | 
|  | +  { | 
|  | +    TFD_CLOEXEC = 02000000, | 
|  | +#define TFD_CLOEXEC TFD_CLOEXEC | 
|  | +    TFD_NONBLOCK = 0200 | 
|  | +#define TFD_NONBLOCK TFD_NONBLOCK | 
|  | +  }; | 
|  | + | 
|  | + | 
|  | +/* Bits to be set in the FLAGS parameter of `timerfd_settime'.  */ | 
|  | +enum | 
|  | +  { | 
|  | +    TFD_TIMER_ABSTIME = 1 << 0 | 
|  | +#define TFD_TIMER_ABSTIME TFD_TIMER_ABSTIME | 
|  | +  }; | 
|  | + | 
|  | + | 
|  | +__BEGIN_DECLS | 
|  | + | 
|  | +/* Return file descriptor for new interval timer source.  */ | 
|  | +extern int timerfd_create (clockid_t __clock_id, int __flags) __THROW; | 
|  | + | 
|  | +/* Set next expiration time of interval timer source UFD to UTMR.  If | 
|  | +   FLAGS has the TFD_TIMER_ABSTIME flag set the timeout value is | 
|  | +   absolute.  Optionally return the old expiration time in OTMR.  */ | 
|  | +extern int timerfd_settime (int __ufd, int __flags, | 
|  | +			    __const struct itimerspec *__utmr, | 
|  | +			    struct itimerspec *__otmr) __THROW; | 
|  | + | 
|  | +/* Return the next expiration time of UFD.  */ | 
|  | +extern int timerfd_gettime (int __ufd, struct itimerspec *__otmr) __THROW; | 
|  | + | 
|  | +__END_DECLS | 
|  | + | 
|  | +#endif /* sys/timerfd.h */ | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/sys/ucontext.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/sys/ucontext.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/sys/ucontext.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/sys/ucontext.h	2014-12-09 16:55:03.180727918 -0800 | 
|  | @@ -0,0 +1,69 @@ | 
|  | +/* Copyright (C) 1997, 1998, 2000, 2003, 2004, 2006, 2009 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +/* Don't rely on this, the interface is currently messed up and may need to | 
|  | +   be broken to be fixed.  */ | 
|  | +#ifndef _SYS_UCONTEXT_H | 
|  | +#define _SYS_UCONTEXT_H	1 | 
|  | + | 
|  | +#include <features.h> | 
|  | +#include <sgidefs.h> | 
|  | +#include <signal.h> | 
|  | + | 
|  | +/* We need the signal context definitions even if they are not used | 
|  | +   included in <signal.h>.  */ | 
|  | +#include <bits/sigcontext.h> | 
|  | + | 
|  | +/* Type for general register.  Even in o32 we assume 64-bit registers, | 
|  | +   like the kernel.  */ | 
|  | +__extension__ typedef unsigned long long int greg_t; | 
|  | + | 
|  | +/* Number of general registers.  */ | 
|  | +#define NGREG	32 | 
|  | +#define NFPREG	32 | 
|  | + | 
|  | +/* Container for all general registers.  */ | 
|  | +typedef greg_t gregset_t[NGREG]; | 
|  | + | 
|  | +/* Container for all FPU registers.  */ | 
|  | +typedef double fpregset_t[NFPREG]; | 
|  | + | 
|  | + | 
|  | +/* Context to describe whole processor state.  */ | 
|  | +typedef struct | 
|  | +  { | 
|  | +    gregset_t gregs; | 
|  | +    fpregset_t fpregs; | 
|  | +    greg_t pc; | 
|  | +    unsigned int fsr; | 
|  | +    unsigned int used_math; | 
|  | +    unsigned int dsp; | 
|  | +    unsigned int reserved; | 
|  | +  } mcontext_t; | 
|  | + | 
|  | +/* Userlevel context.  */ | 
|  | +typedef struct ucontext | 
|  | +  { | 
|  | +    unsigned long int uc_flags; | 
|  | +    struct ucontext *uc_link; | 
|  | +    stack_t uc_stack; | 
|  | +    mcontext_t uc_mcontext; | 
|  | +    __sigset_t uc_sigmask; | 
|  | +  } ucontext_t; | 
|  | + | 
|  | +#endif /* sys/ucontext.h */ | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/sys/user.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/sys/user.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/sys/user.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/sys/user.h	2014-12-09 16:55:03.180727918 -0800 | 
|  | @@ -0,0 +1,219 @@ | 
|  | +/* Copyright (C) 2002, 2003, 2004 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef _SYS_USER_H | 
|  | +#define _SYS_USER_H	1 | 
|  | + | 
|  | +#include <sgidefs.h> | 
|  | + | 
|  | +/* The whole purpose of this file is for GDB and GDB only.  Don't read | 
|  | +   too much into it.  Don't use it for anything other than GDB unless | 
|  | +   you know what you are doing.  */ | 
|  | + | 
|  | +/* #include <asm/reg.h> */ | 
|  | +/* Instead of including the kernel header, that will vary depending on | 
|  | +   whether the 32- or the 64-bit kernel is installed, we paste its | 
|  | +   contents here.  Note that the fact that the file is inline here, | 
|  | +   instead of included separately, doesn't change in any way the | 
|  | +   licensing status of a program that includes user.h.  Since this is | 
|  | +   for gdb alone, and gdb is GPLed, no surprises here.  */ | 
|  | +#if _RISCV_SIM == _ABIO32 | 
|  | +/* | 
|  | + * Various register offset definitions for debuggers, core file | 
|  | + * examiners and whatnot. | 
|  | + * | 
|  | + * This file is subject to the terms and conditions of the GNU General Public | 
|  | + * License.  See the file "COPYING" in the main directory of this archive | 
|  | + * for more details. | 
|  | + * | 
|  | + * Copyright (C) 1995, 1999 by Ralf Baechle | 
|  | + */ | 
|  | +#ifndef __ASM_MIPS_REG_H | 
|  | +#define __ASM_MIPS_REG_H | 
|  | + | 
|  | +/* | 
|  | + * This defines/structures correspond to the register layout on stack - | 
|  | + * if the order here is changed, it needs to be updated in | 
|  | + * include/asm-mips/stackframe.h | 
|  | + */ | 
|  | +#define EF_REG0			6 | 
|  | +#define EF_REG1			7 | 
|  | +#define EF_REG2			8 | 
|  | +#define EF_REG3			9 | 
|  | +#define EF_REG4			10 | 
|  | +#define EF_REG5			11 | 
|  | +#define EF_REG6			12 | 
|  | +#define EF_REG7			13 | 
|  | +#define EF_REG8			14 | 
|  | +#define EF_REG9			15 | 
|  | +#define EF_REG10		16 | 
|  | +#define EF_REG11		17 | 
|  | +#define EF_REG12		18 | 
|  | +#define EF_REG13		19 | 
|  | +#define EF_REG14		20 | 
|  | +#define EF_REG15		21 | 
|  | +#define EF_REG16		22 | 
|  | +#define EF_REG17		23 | 
|  | +#define EF_REG18		24 | 
|  | +#define EF_REG19		25 | 
|  | +#define EF_REG20		26 | 
|  | +#define EF_REG21		27 | 
|  | +#define EF_REG22		28 | 
|  | +#define EF_REG23		29 | 
|  | +#define EF_REG24		30 | 
|  | +#define EF_REG25		31 | 
|  | +/* | 
|  | + * k0/k1 unsaved | 
|  | + */ | 
|  | +#define EF_REG28		34 | 
|  | +#define EF_REG29		35 | 
|  | +#define EF_REG30		36 | 
|  | +#define EF_REG31		37 | 
|  | + | 
|  | +/* | 
|  | + * Saved special registers | 
|  | + */ | 
|  | +#define EF_LO			38 | 
|  | +#define EF_HI			39 | 
|  | + | 
|  | +#define EF_CP0_EPC		40 | 
|  | +#define EF_CP0_BADVADDR		41 | 
|  | +#define EF_CP0_STATUS		42 | 
|  | +#define EF_CP0_CAUSE		43 | 
|  | + | 
|  | +#define EF_SIZE			180	/* size in bytes */ | 
|  | + | 
|  | +#endif /* __ASM_MIPS_REG_H */ | 
|  | + | 
|  | +#else /* _RISCV_SIM != _ABIO32 */ | 
|  | + | 
|  | +/* | 
|  | + * Various register offset definitions for debuggers, core file | 
|  | + * examiners and whatnot. | 
|  | + * | 
|  | + * This file is subject to the terms and conditions of the GNU General Public | 
|  | + * License.  See the file "COPYING" in the main directory of this archive | 
|  | + * for more details. | 
|  | + * | 
|  | + * Copyright (C) 1995, 1999 Ralf Baechle | 
|  | + * Copyright (C) 1995, 1999 Silicon Graphics | 
|  | + */ | 
|  | +#ifndef _ASM_REG_H | 
|  | +#define _ASM_REG_H | 
|  | + | 
|  | +/* | 
|  | + * This defines/structures correspond to the register layout on stack - | 
|  | + * if the order here is changed, it needs to be updated in | 
|  | + * include/asm-mips/stackframe.h | 
|  | + */ | 
|  | +#define EF_REG0			 0 | 
|  | +#define EF_REG1			 1 | 
|  | +#define EF_REG2			 2 | 
|  | +#define EF_REG3			 3 | 
|  | +#define EF_REG4			 4 | 
|  | +#define EF_REG5			 5 | 
|  | +#define EF_REG6			 6 | 
|  | +#define EF_REG7			 7 | 
|  | +#define EF_REG8			 8 | 
|  | +#define EF_REG9			 9 | 
|  | +#define EF_REG10		10 | 
|  | +#define EF_REG11		11 | 
|  | +#define EF_REG12		12 | 
|  | +#define EF_REG13		13 | 
|  | +#define EF_REG14		14 | 
|  | +#define EF_REG15		15 | 
|  | +#define EF_REG16		16 | 
|  | +#define EF_REG17		17 | 
|  | +#define EF_REG18		18 | 
|  | +#define EF_REG19		19 | 
|  | +#define EF_REG20		20 | 
|  | +#define EF_REG21		21 | 
|  | +#define EF_REG22		22 | 
|  | +#define EF_REG23		23 | 
|  | +#define EF_REG24		24 | 
|  | +#define EF_REG25		25 | 
|  | +/* | 
|  | + * k0/k1 unsaved | 
|  | + */ | 
|  | +#define EF_REG28		28 | 
|  | +#define EF_REG29		29 | 
|  | +#define EF_REG30		30 | 
|  | +#define EF_REG31		31 | 
|  | + | 
|  | +/* | 
|  | + * Saved special registers | 
|  | + */ | 
|  | +#define EF_LO			32 | 
|  | +#define EF_HI			33 | 
|  | + | 
|  | +#define EF_CP0_EPC		34 | 
|  | +#define EF_CP0_BADVADDR		35 | 
|  | +#define EF_CP0_STATUS		36 | 
|  | +#define EF_CP0_CAUSE		37 | 
|  | + | 
|  | +#define EF_SIZE			304	/* size in bytes */ | 
|  | + | 
|  | +#endif /* _ASM_REG_H */ | 
|  | + | 
|  | +#endif /* _RISCV_SIM != _ABIO32 */ | 
|  | + | 
|  | +#if _RISCV_SIM == _ABIO32 | 
|  | + | 
|  | +struct user | 
|  | +{ | 
|  | +  unsigned long	regs[EF_SIZE/4+64];	/* integer and fp regs */ | 
|  | +  size_t	u_tsize;		/* text size (pages) */ | 
|  | +  size_t	u_dsize;		/* data size (pages) */ | 
|  | +  size_t	u_ssize;		/* stack size (pages) */ | 
|  | +  unsigned long	start_code;		/* text starting address */ | 
|  | +  unsigned long	start_data;		/* data starting address */ | 
|  | +  unsigned long	start_stack;		/* stack starting address */ | 
|  | +  long int	signal;			/* signal causing core dump */ | 
|  | +  void*		u_ar0;			/* help gdb find registers */ | 
|  | +  unsigned long	magic;			/* identifies a core file */ | 
|  | +  char		u_comm[32];		/* user command name */ | 
|  | +}; | 
|  | + | 
|  | +#else | 
|  | + | 
|  | +struct user { | 
|  | +  __extension__ unsigned long	regs[EF_SIZE/8+64]; /* integer and fp regs */ | 
|  | +  __extension__ unsigned long	u_tsize;	/* text size (pages) */ | 
|  | +  __extension__ unsigned long	u_dsize;	/* data size (pages) */ | 
|  | +  __extension__ unsigned long	u_ssize;	/* stack size (pages) */ | 
|  | +  __extension__ unsigned long long start_code;	/* text starting address */ | 
|  | +  __extension__ unsigned long long start_data;	/* data starting address */ | 
|  | +  __extension__ unsigned long long start_stack;	/* stack starting address */ | 
|  | +  __extension__ long long	signal;		/* signal causing core dump */ | 
|  | +  __extension__ unsigned long long u_ar0;	/* help gdb find registers */ | 
|  | +  __extension__ unsigned long long magic;	/* identifies a core file */ | 
|  | +  char		u_comm[32];		/* user command name */ | 
|  | +}; | 
|  | + | 
|  | +#endif | 
|  | + | 
|  | +#define PAGE_SHIFT		12 | 
|  | +#define PAGE_SIZE		(1UL << PAGE_SHIFT) | 
|  | +#define PAGE_MASK		(~(PAGE_SIZE-1)) | 
|  | +#define NBPG			PAGE_SIZE | 
|  | +#define UPAGES			1 | 
|  | +#define HOST_TEXT_START_ADDR	(u.start_code) | 
|  | +#define HOST_DATA_START_ADDR	(u.start_data) | 
|  | +#define HOST_STACK_END_ADDR	(u.start_stack + u.u_ssize * NBPG) | 
|  | + | 
|  | +#endif	/* _SYS_USER_H */ | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/syscall.c glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/syscall.c | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/syscall.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/syscall.c	2014-12-09 16:55:03.180727918 -0800 | 
|  | @@ -0,0 +1,36 @@ | 
|  | +/* Copyright (C) 2001, 2002, 2003, 2005 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <sysdep.h> | 
|  | + | 
|  | +long syscall (long syscall_number, long arg1, long arg2, long arg3, | 
|  | +	      long arg4, long arg5, long arg6, long arg7) | 
|  | +{ | 
|  | +  long ret, err; | 
|  | + | 
|  | +  ret = INTERNAL_SYSCALL_NCS(syscall_number, err, 7, arg1, arg2, arg3, arg4, | 
|  | +			     arg5, arg6, arg7); | 
|  | + | 
|  | +  if (INTERNAL_SYSCALL_ERROR_P(ret, err)) | 
|  | +  { | 
|  | +    __set_errno(INTERNAL_SYSCALL_ERRNO(ret, err)); | 
|  | +    ret = -1; | 
|  | +  } | 
|  | + | 
|  | +  return ret; | 
|  | +} | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/syscalls.list glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/syscalls.list | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/syscalls.list	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/syscalls.list	2014-12-09 16:55:03.180727918 -0800 | 
|  | @@ -0,0 +1,31 @@ | 
|  | +# File name	Caller	Syscall name	Args	Strong name	Weak names | 
|  | + | 
|  | +# | 
|  | +# Calls for compatibility with existing MIPS OS implementations and | 
|  | +# compilers. | 
|  | +# | 
|  | +cachectl	-	cachectl	i:pii	__cachectl	cachectl | 
|  | +cacheflush	-	cacheflush	i:pii	_flush_cache	cacheflush | 
|  | +sysmips		-	sysmips		i:iiii	__sysmips	sysmips | 
|  | + | 
|  | +# | 
|  | +# Socket functions; Linux/MIPS doesn't use the socketcall(2) wrapper; | 
|  | +# it's provided for compatibility, though. | 
|  | +# | 
|  | +accept		-	accept		Ci:iBN	__libc_accept	__accept accept | 
|  | +bind		-	bind		i:ipi	__bind		bind | 
|  | +connect		-	connect		Ci:ipi	__libc_connect	__connect_internal __connect connect | 
|  | +getpeername	-	getpeername	i:ipp	__getpeername	getpeername | 
|  | +getsockname	-	getsockname	i:ipp	__getsockname	getsockname | 
|  | +getsockopt	-	getsockopt	i:iiiBN	__getsockopt	getsockopt | 
|  | +listen		-	listen		i:ii	__listen	listen | 
|  | +recv		-	recv		Ci:ibni	__libc_recv	__recv recv | 
|  | +recvfrom	-	recvfrom	Ci:ibniBN __libc_recvfrom __recvfrom recvfrom | 
|  | +recvmsg		-	recvmsg		Ci:ipi	__libc_recvmsg	__recvmsg recvmsg | 
|  | +send		-	send		Ci:ibni	__libc_send	__send send | 
|  | +sendmsg		-	sendmsg		Ci:ipi	__libc_sendmsg	__sendmsg sendmsg | 
|  | +sendto		-	sendto		Ci:ibnibn __libc_sendto	__sendto sendto | 
|  | +setsockopt	-	setsockopt	i:iiibn	__setsockopt	setsockopt | 
|  | +shutdown	-	shutdown	i:ii	__shutdown	shutdown | 
|  | +socket		-	socket		i:iii	__socket	socket | 
|  | +socketpair	-	socketpair	i:iiif	__socketpair	socketpair | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/sysdep.h glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/sysdep.h | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/sysdep.h	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/sysdep.h	2014-12-09 16:55:03.180727918 -0800 | 
|  | @@ -0,0 +1,259 @@ | 
|  | +/* Copyright (C) 2000, 2002, 2003, 2004, 2005, 2006, 2009 | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#ifndef _LINUX_MIPS_SYSDEP_H | 
|  | +#define _LINUX_MIPS_SYSDEP_H 1 | 
|  | + | 
|  | +/* There is some commonality.  */ | 
|  | +#include <sysdeps/unix/riscv/sysdep.h> | 
|  | + | 
|  | +#include <tls.h> | 
|  | + | 
|  | +/* In order to get __set_errno() definition in INLINE_SYSCALL.  */ | 
|  | +#ifndef __ASSEMBLER__ | 
|  | +#include <errno.h> | 
|  | +#endif | 
|  | + | 
|  | +/* For Linux we can use the system call table in the header file | 
|  | +	/usr/include/asm/unistd.h | 
|  | +   of the kernel.  But these symbols do not follow the SYS_* syntax | 
|  | +   so we have to redefine the `SYS_ify' macro here.  */ | 
|  | +#undef SYS_ify | 
|  | +#ifdef __STDC__ | 
|  | +# define SYS_ify(syscall_name)	__NR_##syscall_name | 
|  | +#else | 
|  | +# define SYS_ify(syscall_name)	__NR_/**/syscall_name | 
|  | +#endif | 
|  | + | 
|  | +#ifdef __ASSEMBLER__ | 
|  | + | 
|  | +/* We don't want the label for the error handler to be visible in the symbol | 
|  | +   table when we define it here.  */ | 
|  | +#ifdef __PIC__ | 
|  | +# define SYSCALL_ERROR_LABEL 99b | 
|  | +#endif | 
|  | + | 
|  | +#else   /* ! __ASSEMBLER__ */ | 
|  | + | 
|  | +/* Define a macro which expands into the inline wrapper code for a system | 
|  | +   call.  */ | 
|  | +#undef INLINE_SYSCALL | 
|  | +#define INLINE_SYSCALL(name, nr, args...)			       \ | 
|  | +  ({ INTERNAL_SYSCALL_DECL(err);					\ | 
|  | +     long result_var = INTERNAL_SYSCALL (name, err, nr, args);      	\ | 
|  | +     if ( INTERNAL_SYSCALL_ERROR_P (result_var, err) )  		\ | 
|  | +       {								\ | 
|  | +	 __set_errno (INTERNAL_SYSCALL_ERRNO (result_var, err));      	\ | 
|  | +	 result_var = -1L;			       		\ | 
|  | +       }								\ | 
|  | +     result_var; }) | 
|  | + | 
|  | +#undef INTERNAL_SYSCALL_DECL | 
|  | +#define INTERNAL_SYSCALL_DECL(err) long err | 
|  | + | 
|  | +#undef INTERNAL_SYSCALL_ERROR_P | 
|  | +#define INTERNAL_SYSCALL_ERROR_P(val, err)   ((long) (err)) | 
|  | + | 
|  | +#undef INTERNAL_SYSCALL_ERRNO | 
|  | +#define INTERNAL_SYSCALL_ERRNO(val, err)     (-val) | 
|  | + | 
|  | +#undef INTERNAL_SYSCALL | 
|  | +#define INTERNAL_SYSCALL(name, err, nr, args...) \ | 
|  | +	internal_syscall##nr (SYS_ify (name), err, args) | 
|  | + | 
|  | +#undef INTERNAL_SYSCALL_NCS | 
|  | +#define INTERNAL_SYSCALL_NCS(number, err, nr, args...) \ | 
|  | +	internal_syscall##nr (number, err, args) | 
|  | + | 
|  | +#define internal_syscall0(number, err, dummy...)			\ | 
|  | +({ 									\ | 
|  | +	long _sys_result;						\ | 
|  | +									\ | 
|  | +	{								\ | 
|  | +	register long __v0 asm("v0") = number;				\ | 
|  | +	register long __a3 asm("a3");					\ | 
|  | +	__asm__ volatile ( 						\ | 
|  | +	"syscall\n\t" 							\ | 
|  | +	: "+r" (__v0), "=r" (__a3) 					\ | 
|  | +	: "r" (__v0)							\ | 
|  | +	: __SYSCALL_CLOBBERS); 						\ | 
|  | +	err = __a3;							\ | 
|  | +	_sys_result = __v0;						\ | 
|  | +	}								\ | 
|  | +	_sys_result;							\ | 
|  | +}) | 
|  | + | 
|  | +#define internal_syscall1(number, err, arg0)				\ | 
|  | +({ 									\ | 
|  | +	long _sys_result;						\ | 
|  | +									\ | 
|  | +	{								\ | 
|  | +	register long __v0 asm("v0") = number;				\ | 
|  | +	register long __a0 asm("a0") = (long) (arg0); 			\ | 
|  | +	register long __a3 asm("a3");					\ | 
|  | +	__asm__ volatile ( 						\ | 
|  | +	"syscall\n\t" 							\ | 
|  | +	: "+r" (__v0), "=r" (__a3) 					\ | 
|  | +	: "r" (__v0), "r"(__a0)						\ | 
|  | +	: __SYSCALL_CLOBBERS); 						\ | 
|  | +	err = __a3;							\ | 
|  | +	_sys_result = __v0;						\ | 
|  | +	}								\ | 
|  | +	_sys_result;							\ | 
|  | +}) | 
|  | + | 
|  | +#define internal_syscall2(number, err, arg0, arg1)	    		\ | 
|  | +({ 									\ | 
|  | +	long _sys_result;						\ | 
|  | +									\ | 
|  | +	{								\ | 
|  | +	register long __v0 asm("v0") = number;				\ | 
|  | +	register long __a0 asm("a0") = (long) (arg0); 			\ | 
|  | +	register long __a1 asm("a1") = (long) (arg1); 			\ | 
|  | +	register long __a3 asm("a3");					\ | 
|  | +	__asm__ volatile ( 						\ | 
|  | +	"syscall\n\t" 							\ | 
|  | +	: "+r" (__v0), "=r" (__a3) 					\ | 
|  | +	: "r" (__v0), "r"(__a0), "r"(__a1)				\ | 
|  | +	: __SYSCALL_CLOBBERS); 						\ | 
|  | +	err = __a3;							\ | 
|  | +	_sys_result = __v0;						\ | 
|  | +	}								\ | 
|  | +	_sys_result;							\ | 
|  | +}) | 
|  | + | 
|  | +#define internal_syscall3(number, err, arg0, arg1, arg2)      		\ | 
|  | +({ 									\ | 
|  | +	long _sys_result;						\ | 
|  | +									\ | 
|  | +	{								\ | 
|  | +	register long __v0 asm("v0") = number;				\ | 
|  | +	register long __a0 asm("a0") = (long) (arg0); 			\ | 
|  | +	register long __a1 asm("a1") = (long) (arg1); 			\ | 
|  | +	register long __a2 asm("a2") = (long) (arg2); 			\ | 
|  | +	register long __a3 asm("a3");					\ | 
|  | +	__asm__ volatile ( 						\ | 
|  | +	"syscall\n\t" 							\ | 
|  | +	: "+r" (__v0), "=r" (__a3) 					\ | 
|  | +	: "r" (__v0), "r"(__a0), "r"(__a1), "r"(__a2)			\ | 
|  | +	: __SYSCALL_CLOBBERS); 						\ | 
|  | +	err = __a3;							\ | 
|  | +	_sys_result = __v0;						\ | 
|  | +	}								\ | 
|  | +	_sys_result;							\ | 
|  | +}) | 
|  | + | 
|  | +#define internal_syscall4(number, err, arg0, arg1, arg2, arg3)	  \ | 
|  | +({ 									\ | 
|  | +	long _sys_result;						\ | 
|  | +									\ | 
|  | +	{								\ | 
|  | +	register long __v0 asm("v0") = number;				\ | 
|  | +	register long __a0 asm("a0") = (long) (arg0); 			\ | 
|  | +	register long __a1 asm("a1") = (long) (arg1); 			\ | 
|  | +	register long __a2 asm("a2") = (long) (arg2); 			\ | 
|  | +	register long __a3 asm("a3") = (long) (arg3);   		\ | 
|  | +	__asm__ volatile ( 						\ | 
|  | +	"syscall\n\t" 							\ | 
|  | +	: "+r" (__v0), "+r" (__a3) 					\ | 
|  | +	: "r" (__v0), "r"(__a0), "r"(__a1), "r"(__a2), "r"(__a3)	\ | 
|  | +	: __SYSCALL_CLOBBERS); 						\ | 
|  | +	err = __a3;							\ | 
|  | +	_sys_result = __v0;						\ | 
|  | +	}								\ | 
|  | +	_sys_result;							\ | 
|  | +}) | 
|  | + | 
|  | +#define internal_syscall5(number, err, arg0, arg1, arg2, arg3, arg4)    \ | 
|  | +({ 									\ | 
|  | +	long _sys_result;						\ | 
|  | +									\ | 
|  | +	{								\ | 
|  | +	register long __v0 asm("v0") = number;				\ | 
|  | +	register long __a0 asm("a0") = (long) (arg0); 			\ | 
|  | +	register long __a1 asm("a1") = (long) (arg1); 			\ | 
|  | +	register long __a2 asm("a2") = (long) (arg2); 			\ | 
|  | +	register long __a3 asm("a3") = (long) (arg3);   		\ | 
|  | +	register long __a4 asm("a4") = (long) (arg4);   		\ | 
|  | +	__asm__ volatile ( 						\ | 
|  | +	"syscall\n\t" 							\ | 
|  | +	: "+r" (__v0), "+r" (__a3) 					\ | 
|  | +	: "r" (__v0), "r"(__a0), "r"(__a1), "r"(__a2), "r"(__a3), "r"(__a4)     \ | 
|  | +	: __SYSCALL_CLOBBERS); 						\ | 
|  | +	err = __a3;							\ | 
|  | +	_sys_result = __v0;						\ | 
|  | +	}								\ | 
|  | +	_sys_result;							\ | 
|  | +}) | 
|  | + | 
|  | +#define internal_syscall6(number, err, arg0, arg1, arg2, arg3, arg4, arg5) \ | 
|  | +({ 									\ | 
|  | +	long _sys_result;						\ | 
|  | +									\ | 
|  | +	{								\ | 
|  | +	register long __v0 asm("v0") = number;				\ | 
|  | +	register long __a0 asm("a0") = (long) (arg0); 			\ | 
|  | +	register long __a1 asm("a1") = (long) (arg1); 			\ | 
|  | +	register long __a2 asm("a2") = (long) (arg2); 			\ | 
|  | +	register long __a3 asm("a3") = (long) (arg3);   		\ | 
|  | +	register long __a4 asm("a4") = (long) (arg4);   		\ | 
|  | +	register long __a5 asm("a5") = (long) (arg5);   		\ | 
|  | +	__asm__ volatile ( 						\ | 
|  | +	"syscall\n\t" 							\ | 
|  | +	: "+r" (__v0), "+r" (__a3) 					\ | 
|  | +	: "r" (__v0), "r"(__a0), "r"(__a1), "r"(__a2), "r"(__a3), "r"(__a4), "r"(__a5)     \ | 
|  | +	: __SYSCALL_CLOBBERS); 						\ | 
|  | +	err = __a3;							\ | 
|  | +	_sys_result = __v0;						\ | 
|  | +	}								\ | 
|  | +	_sys_result;							\ | 
|  | +}) | 
|  | + | 
|  | +#define internal_syscall7(number, err, arg0, arg1, arg2, arg3, arg4, arg5, arg6) \ | 
|  | +({ 									\ | 
|  | +	long _sys_result;						\ | 
|  | +									\ | 
|  | +	{								\ | 
|  | +	register long __v0 asm("v0") = number;				\ | 
|  | +	register long __a0 asm("a0") = (long) (arg0); 			\ | 
|  | +	register long __a1 asm("a1") = (long) (arg1); 			\ | 
|  | +	register long __a2 asm("a2") = (long) (arg2); 			\ | 
|  | +	register long __a3 asm("a3") = (long) (arg3);   		\ | 
|  | +	register long __a4 asm("a4") = (long) (arg4);   		\ | 
|  | +	register long __a5 asm("a5") = (long) (arg5);   		\ | 
|  | +	register long __a6 asm("a6") = (long) (arg6);   		\ | 
|  | +	__asm__ volatile ( 						\ | 
|  | +	"syscall\n\t" 							\ | 
|  | +	: "+r" (__v0), "+r" (__a3) 					\ | 
|  | +	: "r" (__v0), "r"(__a0), "r"(__a1), "r"(__a2), "r"(__a3), "r"(__a4), "r"(__a5), "r"(__a6)     \ | 
|  | +	: __SYSCALL_CLOBBERS); 						\ | 
|  | +	err = __a3;							\ | 
|  | +	_sys_result = __v0;						\ | 
|  | +	}								\ | 
|  | +	_sys_result;							\ | 
|  | +}) | 
|  | + | 
|  | +#define __SYSCALL_CLOBBERS "v1", "memory" | 
|  | +#endif /* __ASSEMBLER__ */ | 
|  | + | 
|  | +/* Pointer mangling is not supported.  */ | 
|  | +#define PTR_MANGLE(var) (void) (var) | 
|  | +#define PTR_DEMANGLE(var) (void) (var) | 
|  | + | 
|  | +#endif /* linux/mips/sysdep.h */ | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/_test_and_set.c glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/_test_and_set.c | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/_test_and_set.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/_test_and_set.c	2014-12-09 16:55:03.172727878 -0800 | 
|  | @@ -0,0 +1,30 @@ | 
|  | +/* Copyright (C) 2000 Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by Maciej W. Rozycki <macro@ds2.pg.gda.pl>, 2000. | 
|  | + | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +/* Define the real-function versions of all inline functions | 
|  | +   defined in sys/tas.h  */ | 
|  | + | 
|  | +#include <features.h> | 
|  | + | 
|  | +#define _EXTERN_INLINE | 
|  | +#ifndef __USE_EXTERN_INLINES | 
|  | +# define __USE_EXTERN_INLINES 1 | 
|  | +#endif | 
|  | + | 
|  | +#include "sys/tas.h" | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/truncate64.c glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/truncate64.c | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/truncate64.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/truncate64.c	2014-12-09 16:55:03.180727918 -0800 | 
|  | @@ -0,0 +1,76 @@ | 
|  | +/* Copyright (C) 1997,1998,1999,2000,2002,2003,2005,2006 | 
|  | +   	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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <sys/types.h> | 
|  | +#include <endian.h> | 
|  | +#include <errno.h> | 
|  | +#include <unistd.h> | 
|  | + | 
|  | +#include <sysdep.h> | 
|  | +#include <sys/syscall.h> | 
|  | +#include <bp-checks.h> | 
|  | + | 
|  | +#include <kernel-features.h> | 
|  | + | 
|  | +#ifdef __NR_truncate64 | 
|  | +#ifndef __ASSUME_TRUNCATE64_SYSCALL | 
|  | +/* The variable is shared between all wrappers around *truncate64 calls.  */ | 
|  | +int __have_no_truncate64; | 
|  | +#endif | 
|  | + | 
|  | +/* Truncate the file FD refers to to LENGTH bytes.  */ | 
|  | +int | 
|  | +truncate64 (const char *path, off64_t length) | 
|  | +{ | 
|  | +#ifndef __ASSUME_TRUNCATE64_SYSCALL | 
|  | +  if (! __have_no_truncate64) | 
|  | +#endif | 
|  | +    { | 
|  | +      unsigned int low = length & 0xffffffff; | 
|  | +      unsigned int high = length >> 32; | 
|  | +#ifndef __ASSUME_TRUNCATE64_SYSCALL | 
|  | +      int saved_errno = errno; | 
|  | +#endif | 
|  | +      int result = INLINE_SYSCALL (truncate64, 4, CHECK_STRING (path), 0, | 
|  | +				   __LONG_LONG_PAIR (high, low)); | 
|  | +#ifndef __ASSUME_TRUNCATE64_SYSCALL | 
|  | +      if (result != -1 || errno != ENOSYS) | 
|  | +#endif | 
|  | +	return result; | 
|  | + | 
|  | +#ifndef __ASSUME_TRUNCATE64_SYSCALL | 
|  | +      __set_errno (saved_errno); | 
|  | +      __have_no_truncate64 = 1; | 
|  | +#endif | 
|  | +    } | 
|  | + | 
|  | +#ifndef __ASSUME_TRUNCATE64_SYSCALL | 
|  | +  if ((off_t) length != length) | 
|  | +    { | 
|  | +      __set_errno (EINVAL); | 
|  | +      return -1; | 
|  | +    } | 
|  | +  return truncate (path, (off_t) length); | 
|  | +#endif | 
|  | +} | 
|  | + | 
|  | +#else | 
|  | +/* Use the generic implementation.  */ | 
|  | +# include <misc/truncate64.c> | 
|  | +#endif | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/ucontext_i.sym glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/ucontext_i.sym | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/ucontext_i.sym	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/ucontext_i.sym	2014-12-09 16:55:03.180727918 -0800 | 
|  | @@ -0,0 +1,43 @@ | 
|  | +#include <inttypes.h> | 
|  | +#include <signal.h> | 
|  | +#include <stddef.h> | 
|  | +#include <sys/ucontext.h> | 
|  | + | 
|  | +#include <kernel_rt_sigframe.h> | 
|  | + | 
|  | +-- Constants used by the rt_sigprocmask call. | 
|  | + | 
|  | +SIG_BLOCK | 
|  | +SIG_SETMASK | 
|  | + | 
|  | +_NSIG8				(_NSIG / 8) | 
|  | + | 
|  | +-- Offsets of the fields in the kernel rt_sigframe_t structure. | 
|  | +#define rt_sigframe(member)	offsetof (kernel_rt_sigframe_t, member) | 
|  | + | 
|  | +RT_SIGFRAME_UCONTEXT		rt_sigframe (rs_uc) | 
|  | + | 
|  | +RT_SIGFRAME_SIZE		sizeof (kernel_rt_sigframe_t) | 
|  | + | 
|  | +-- Offsets of the fields in the ucontext_t structure. | 
|  | +#define ucontext(member)	offsetof (ucontext_t, member) | 
|  | +#define stack(member)		ucontext (uc_stack.member) | 
|  | +#define mcontext(member)	ucontext (uc_mcontext.member) | 
|  | + | 
|  | +UCONTEXT_FLAGS			ucontext (uc_flags) | 
|  | +UCONTEXT_LINK			ucontext (uc_link) | 
|  | +UCONTEXT_STACK			ucontext (uc_stack) | 
|  | +UCONTEXT_MCONTEXT		ucontext (uc_mcontext) | 
|  | +UCONTEXT_SIGMASK		ucontext (uc_sigmask) | 
|  | + | 
|  | +STACK_SP			stack (ss_sp) | 
|  | +STACK_SIZE			stack (ss_size) | 
|  | +STACK_FLAGS			stack (ss_flags) | 
|  | + | 
|  | +MCONTEXT_GREGS			mcontext (gregs) | 
|  | +MCONTEXT_FPREGS			mcontext (fpregs) | 
|  | +MCONTEXT_PC			mcontext (pc) | 
|  | +MCONTEXT_FSR		mcontext (fsr) | 
|  | +MCONTEXT_USED_MATH		mcontext (used_math) | 
|  | + | 
|  | +UCONTEXT_SIZE			sizeof (ucontext_t) | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/ustat.c glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/ustat.c | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/ustat.c	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/ustat.c	2014-12-09 16:55:03.180727918 -0800 | 
|  | @@ -0,0 +1,37 @@ | 
|  | +/* Copyright (C) 1997, 1998, 2000, 2003 Free Software Foundation, Inc. | 
|  | +   This file is part of the GNU C Library. | 
|  | +   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. | 
|  | + | 
|  | +   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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +#include <errno.h> | 
|  | +#include <sys/ustat.h> | 
|  | +#include <sys/sysmacros.h> | 
|  | + | 
|  | +#include <sysdep.h> | 
|  | +#include <sys/syscall.h> | 
|  | +#include <bp-checks.h> | 
|  | + | 
|  | +int | 
|  | +ustat (dev_t dev, struct ustat *ubuf) | 
|  | +{ | 
|  | +  unsigned long k_dev; | 
|  | + | 
|  | +  /* We must convert the value to dev_t type used by the kernel.  */ | 
|  | +  k_dev = ((major (dev) & 0xff) << 8) | (minor (dev) & 0xff); | 
|  | + | 
|  | +  return INLINE_SYSCALL (ustat, 2, k_dev, CHECK_1 (ubuf)); | 
|  | +} | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/Versions glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/Versions | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/Versions	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/Versions	2014-12-09 16:55:03.172727878 -0800 | 
|  | @@ -0,0 +1,40 @@ | 
|  | +ld { | 
|  | +  GLIBC_PRIVATE { | 
|  | +    # used for loading by static libraries | 
|  | +    _dl_var_init; | 
|  | +  } | 
|  | +} | 
|  | +libc { | 
|  | +  # The comment lines with "#errlist-compat" are magic; see errlist-compat.awk. | 
|  | +  # When you get an error from errlist-compat.awk, you need to add a new | 
|  | +  # version here.  Don't do this blindly, since this means changing the ABI | 
|  | +  # for all GNU/Linux configurations. | 
|  | + | 
|  | +  GLIBC_2.0 { | 
|  | +    #errlist-compat	123 | 
|  | +    _sys_errlist; sys_errlist; _sys_nerr; sys_nerr; | 
|  | + | 
|  | +    # Exception handling support functions from libgcc | 
|  | +    __register_frame; __register_frame_table; __deregister_frame; | 
|  | +    __frame_state_for; __register_frame_info_table; | 
|  | + | 
|  | +    # Needed by gcc: | 
|  | +    _flush_cache; | 
|  | + | 
|  | +    # c* | 
|  | +    cachectl; cacheflush; | 
|  | + | 
|  | +    # s* | 
|  | +    sysmips; | 
|  | +  } | 
|  | +  GLIBC_2.2 { | 
|  | +    #errlist-compat	1134 | 
|  | +    _sys_errlist; sys_errlist; _sys_nerr; sys_nerr; | 
|  | + | 
|  | +    # _* | 
|  | +    _test_and_set; | 
|  | +  } | 
|  | +  GLIBC_2.11 { | 
|  | +    fallocate64; | 
|  | +  } | 
|  | +} | 
|  | diff -ruN glibc-2.19/sysdeps/unix/sysv/linux/riscv/vfork.S glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/vfork.S | 
|  | --- glibc-2.19/sysdeps/unix/sysv/linux/riscv/vfork.S	1969-12-31 16:00:00.000000000 -0800 | 
|  | +++ glibc-2.19-riscv/sysdeps/unix/sysv/linux/riscv/vfork.S	2014-12-09 16:55:03.180727918 -0800 | 
|  | @@ -0,0 +1,65 @@ | 
|  | +/* Copyright (C) 2005 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, write to the Free | 
|  | +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
|  | +   02111-1307 USA.  */ | 
|  | + | 
|  | +/* vfork() is just a special case of clone().  */ | 
|  | + | 
|  | +#include <sys/asm.h> | 
|  | +#include <sysdep.h> | 
|  | +#include <asm/unistd.h> | 
|  | +#include <sgidefs.h> | 
|  | + | 
|  | +#ifndef SAVE_PID | 
|  | +#define SAVE_PID | 
|  | +#endif | 
|  | + | 
|  | +#ifndef RESTORE_PID | 
|  | +#define RESTORE_PID | 
|  | +#endif | 
|  | + | 
|  | + | 
|  | +/* int vfork() */ | 
|  | + | 
|  | +	.text | 
|  | +LEAF(__vfork) | 
|  | + | 
|  | +	SAVE_PID | 
|  | + | 
|  | +	li		a0, 0x4112	/* CLONE_VM | CLONE_VFORK | SIGCHLD */ | 
|  | +	move		a1, sp | 
|  | +	li		a2, 0 | 
|  | +	li		a3, 0 | 
|  | +	li		a4, 0 | 
|  | + | 
|  | +	/* Do the system call */ | 
|  | +	li		v0,__NR_clone | 
|  | +	syscall | 
|  | + | 
|  | +	RESTORE_PID | 
|  | + | 
|  | +	bnez		a3,L(error) | 
|  | + | 
|  | +	ret | 
|  | + | 
|  | +	/* Something bad happened -- no child created.  */ | 
|  | +L(error): | 
|  | +	j		__syscall_error | 
|  | + | 
|  | +	END(__vfork) | 
|  | + | 
|  | +libc_hidden_def(__vfork) | 
|  | +weak_alias (__vfork, vfork) |