diff --git a/extra/Configs/Config.in b/extra/Configs/Config.in
index cb2d4d1..719218f 100644
--- a/extra/Configs/Config.in
+++ b/extra/Configs/Config.in
@@ -522,7 +522,6 @@ config UCLIBC_HAS_THREADS_NATIVE
 		   !TARGET_ia64 && \
 		   !TARGET_m68k && \
 		   !TARGET_nds32 && \
-		   !TARGET_nios2 && \
 		   !TARGET_or1k && \
 		   ARCH_USE_MMU
 	help
diff --git a/extra/Configs/Config.nios2 b/extra/Configs/Config.nios2
index 2310a46..958607c 100644
--- a/extra/Configs/Config.nios2
+++ b/extra/Configs/Config.nios2
@@ -11,6 +11,4 @@ config FORCE_OPTIONS_FOR_ARCH
 	bool
 	default y
 	select ARCH_LITTLE_ENDIAN
-	select ARCH_HAS_NO_MMU
 	select ARCH_HAS_NO_LDSO
-	select HAVE_NO_PIC
diff --git a/include/elf.h b/include/elf.h
index cca3d38..e0937b7 100644
--- a/include/elf.h
+++ b/include/elf.h
@@ -3081,53 +3081,56 @@ typedef Elf32_Addr Elf32_Conflict;
 /* Andes ELF Version 1.3 and after */
 #define E_NDS32_ELF_VER_1_3			0x1
 
-/* NIOS relocations. */
-#define R_NIOS_NONE				0
-#define R_NIOS_32				1	/* A 32 bit absolute relocation.*/
-#define R_NIOS_LO16_LO5			2	/* A LO-16 5 bit absolute relocation.  */
-#define R_NIOS_LO16_HI11		3	/* A LO-16 top 11 bit absolute relocation.  */
-#define R_NIOS_HI16_LO5			4	/* A HI-16 5 bit absolute relocation.  */
-#define R_NIOS_HI16_HI11		5	/* A HI-16 top 11 bit absolute relocation.  */
-#define R_NIOS_PCREL6			6	/* A 6 bit relative relocation.  */
-#define R_NIOS_PCREL8			7	/* An 8 bit relative relocation.  */
-#define R_NIOS_PCREL11			8	/* An 11 bit relative relocation.  */
-#define R_NIOS_16				9	/* A 16 bit absolute relocation.  */
-#define R_NIOS_H_LO5			10	/* Low 5-bits of absolute relocation in halfwords.  */
-#define R_NIOS_H_HI11			11	/* Top 11 bits of 16-bit absolute relocation in halfwords.  */
-#define R_NIOS_H_XLO5			12	/* Low 5 bits of top 16-bits of 32-bit absolute relocation in halfwords.  */
-#define R_NIOS_H_XHI11			13	/* Top 11 bits of top 16-bits of 32-bit absolute relocation in halfwords.  */
-#define R_NIOS_H_16				14	/* Half-word @h value */
-#define R_NIOS_H_32				15	/* Word @h value */
-#define R_NIOS_GNU_VTINHERIT	200	/* GNU extension to record C++ vtable hierarchy */
-#define R_NIOS_GNU_VTENTRY		201	/* GNU extension to record C++ vtable member usage */
-/* Keep this the last entry.  */
-#define R_NIOS_NUM				202
-
-/* NIOS II relocations */
-#define R_NIOS2_NONE			0
-#define R_NIOS2_S16				1
-#define R_NIOS2_U16				2
-#define R_NIOS2_PCREL16			3
-#define R_NIOS2_CALL26			4
-#define R_NIOS2_IMM5			5
-#define R_NIOS2_CACHE_OPX		6
-#define R_NIOS2_IMM6			7
-#define R_NIOS2_IMM8			8
-#define R_NIOS2_HI16			9
-#define R_NIOS2_LO16			10
-#define R_NIOS2_HIADJ16		11
-#define R_NIOS2_BFD_RELOC_32	12
-#define R_NIOS2_BFD_RELOC_16	13
-#define R_NIOS2_BFD_RELOC_8	14
-#define R_NIOS2_GPREL			15
-#define R_NIOS2_GNU_VTINHERIT	16
-#define R_NIOS2_GNU_VTENTRY	17
-#define R_NIOS2_UJMP			18
-#define R_NIOS2_CJMP			19
-#define R_NIOS2_CALLR			20
-#define R_NIOS2_ALIGN			21
-/* Keep this the last entry.  */
-#define R_NIOS2_NUM				22
+/* Legal values for d_tag (dynamic entry type).  */
+#define DT_NIOS2_GP             0x70000002 /* Address of _gp.  */
+
+/* Nios II relocations.  */
+#define R_NIOS2_NONE		0	/* No reloc.  */
+#define R_NIOS2_S16		1	/* Direct signed 16 bit.  */
+#define R_NIOS2_U16		2	/* Direct unsigned 16 bit.  */
+#define R_NIOS2_PCREL16		3	/* PC relative 16 bit.  */
+#define R_NIOS2_CALL26		4	/* Direct call.  */
+#define R_NIOS2_IMM5		5	/* 5 bit constant expression.  */
+#define R_NIOS2_CACHE_OPX	6	/* 5 bit expression, shift 22.  */
+#define R_NIOS2_IMM6		7	/* 6 bit constant expression.  */
+#define R_NIOS2_IMM8		8	/* 8 bit constant expression.  */
+#define R_NIOS2_HI16		9	/* High 16 bit.  */
+#define R_NIOS2_LO16		10	/* Low 16 bit.  */
+#define R_NIOS2_HIADJ16		11	/* High 16 bit, adjusted.  */
+#define R_NIOS2_BFD_RELOC_32	12	/* 32 bit symbol value + addend.  */
+#define R_NIOS2_BFD_RELOC_16	13	/* 16 bit symbol value + addend.  */
+#define R_NIOS2_BFD_RELOC_8	14	/* 8 bit symbol value + addend.  */
+#define R_NIOS2_GPREL		15	/* 16 bit GP pointer offset.  */
+#define R_NIOS2_GNU_VTINHERIT	16	/* GNU C++ vtable hierarchy.  */
+#define R_NIOS2_GNU_VTENTRY	17	/* GNU C++ vtable member usage.  */
+#define R_NIOS2_UJMP		18	/* Unconditional branch.  */
+#define R_NIOS2_CJMP		19	/* Conditional branch.  */
+#define R_NIOS2_CALLR		20	/* Indirect call through register.  */
+#define R_NIOS2_ALIGN		21	/* Alignment requirement for linker relaxation.  */
+#define R_NIOS2_GOT16		22	/* 16 bit GOT entry.  */
+#define R_NIOS2_CALL16		23	/* 16 bit GOT entry for function.  */
+#define R_NIOS2_GOTOFF_LO	24	/* %lo of offset to GOT pointer.  */
+#define R_NIOS2_GOTOFF_HA	25	/* %hiadj of offset to GOT pointer.  */
+#define R_NIOS2_PCREL_LO	26	/* %lo of PC relative offset.  */
+#define R_NIOS2_PCREL_HA	27	/* %hiadj of PC relative offset.  */
+#define R_NIOS2_TLS_GD16	28	/* 16 bit GOT offset for TLS GD.  */
+#define R_NIOS2_TLS_LDM16	29	/* 16 bit GOT offset for TLS LDM.  */
+#define R_NIOS2_TLS_LDO16	30	/* 16 bit module relative offset.  */
+#define R_NIOS2_TLS_IE16	31	/* 16 bit GOT offset for TLS IE.  */
+#define R_NIOS2_TLS_LE16	32	/* 16 bit LE TP-relative offset.  */
+#define R_NIOS2_TLS_DTPMOD	33	/* Module number.  */
+#define R_NIOS2_TLS_DTPREL	34	/* Module-relative offset.  */
+#define R_NIOS2_TLS_TPREL	35	/* TP-relative offset.  */
+#define R_NIOS2_COPY		36	/* Copy symbol at runtime.  */
+#define R_NIOS2_GLOB_DAT	37	/* Create GOT entry.  */
+#define R_NIOS2_JUMP_SLOT	38	/* Create PLT entry.  */
+#define R_NIOS2_RELATIVE	39	/* Adjust by program base.  */
+#define R_NIOS2_GOTOFF		40	/* 16 bit offset to GOT pointer.  */
+#define R_NIOS2_CALL26_NOAT	41	/* Direct call in .noat section.  */
+#define R_NIOS2_GOT_LO		42	/* %lo() of GOT entry.  */
+#define R_NIOS2_GOT_HA		43	/* %hiadj() of GOT entry.  */
+#define R_NIOS2_CALL_LO		44	/* %lo() of function GOT entry.  */
+#define R_NIOS2_CALL_HA		45	/* %hiadj() of function GOT entry.  */
 
 /* Xtensa-specific declarations */
 
diff --git a/ldso/ldso/nios2/dl-debug.h b/ldso/ldso/nios2/dl-debug.h
new file mode 100644
index 0000000..1fb596a
--- /dev/null
+++ b/ldso/ldso/nios2/dl-debug.h
@@ -0,0 +1,18 @@
+/* nios2 shared library loader suppport */
+
+static const char * const _dl_reltypes_tab[] =
+	{
+		"R_NIOS2_NONE",
+		"R_NIOS2_BFD_RELOC_32",
+		"R_NIOS2_BFD_RELOC_16",
+		"R_NIOS2_BFD_RELOC_8",
+		"R_NIOS2_GNU_VTINHERIT",
+		"R_NIOS2_GNU_VTENTRY",
+		"R_NIOS2_GOT16",
+		"R_NIOS2_CALL16",
+		"R_NIOS2_JUMP_SLOT",
+		"R_NIOS2_GLOB_DAT",
+		"R_NIOS2_RELATIVE",
+		"R_NIOS2_GOTOFF",
+		"R_NIOS2_COPY",
+	};
diff --git a/ldso/ldso/nios2/dl-inlines.h b/ldso/ldso/nios2/dl-inlines.h
new file mode 100644
index 0000000..7cf7e4a
--- /dev/null
+++ b/ldso/ldso/nios2/dl-inlines.h
@@ -0,0 +1,12 @@
+
+unsigned int
+internal_function
+_dl_nios2_get_gp_value (struct link_map *main_map)
+{ 
+  ElfW(Dyn) *dyn = main_map->l_ld;
+  for (dyn = main_map->l_ld; dyn->d_tag != DT_NULL; ++dyn)
+    if (dyn->d_tag == DT_NIOS2_GP)
+      return (unsigned int)(dyn->d_un.d_ptr);
+  return 0;
+}
+
diff --git a/ldso/ldso/nios2/dl-startup.h b/ldso/ldso/nios2/dl-startup.h
new file mode 100644
index 0000000..982e555
--- /dev/null
+++ b/ldso/ldso/nios2/dl-startup.h
@@ -0,0 +1,34 @@
+__asm__ ("\
+	.text\n\
+	.globl _start\n\
+	.type _start, %function\n\
+_start:\n\
+        mov r4, sp\n\
+        br _dl_start\n\
+	mov r16, r4\n\
+        jmp r16\n\
+");
+
+/*
+ * Get a pointer to the argv array.  On many platforms this can be just
+ * the address of the first argument, on other platforms we need to
+ * do something a little more subtle here.
+ */
+#define GET_ARGV(ARGVP, ARGS) ARGVP = (((unsigned long*) ARGS)+1)
+
+/* The ld.so library requires relocations */
+#define ARCH_NEEDS_BOOTSTRAP_RELOCS
+
+static __always_inline
+void PERFORM_BOOTSTRAP_RELOC(ELF_RELOC *rpnt, unsigned long *reloc_addr,
+	unsigned long symbol_addr, unsigned long load_addr, attribute_unused Elf32_Sym *symtab)
+{
+	switch (ELF_R_TYPE(rpnt->r_info)) {
+		case R_NIOS2_RELATIVE:
+			*reloc_addr = load_addr + rpnt->r_addend;
+			break;
+		default:
+			_dl_exit(1);
+			break;
+	}
+}
diff --git a/ldso/ldso/xtensa/dl-syscalls.h b/ldso/ldso/nios2/dl-syscalls.h
similarity index 100%
copy from ldso/ldso/xtensa/dl-syscalls.h
copy to ldso/ldso/nios2/dl-syscalls.h
diff --git a/ldso/ldso/nios2/dl-sysdep.h b/ldso/ldso/nios2/dl-sysdep.h
new file mode 100644
index 0000000..5ae3ce3
--- /dev/null
+++ b/ldso/ldso/nios2/dl-sysdep.h
@@ -0,0 +1,74 @@
+/* Use reloca */
+#define ELF_USES_RELOCA
+
+#include <elf.h>
+
+/* Initialise the GOT */
+#define INIT_GOT(GOT_BASE,MODULE)					\
+do {									\
+	GOT_BASE[2] = (unsigned long) _dl_linux_resolve;		\
+	GOT_BASE[1] = (unsigned long) MODULE;				\
+} while(0)
+
+/* Here we define the magic numbers that this dynamic loader should accept */
+
+#define MAGIC1 EM_ALTERA_NIOS2
+#undef  MAGIC2
+/* Used for error messages */
+#define ELF_TARGET "nios2"
+
+struct elf_resolve;
+unsigned long _dl_linux_resolver(struct elf_resolve * tpnt, int reloc_entry);
+
+/* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry, so
+   PLT entries should not be allowed to define the value.
+   ELF_RTYPE_CLASS_COPY iff TYPE should not be allowed to resolve to one
+   of the main executable's symbols, as for a COPY reloc.  */
+#define elf_machine_type_class(type)				\
+  ((((type) == R_NIOS2_JUMP_SLOT				\
+     || (type) == R_NIOS2_TLS_DTPMOD				\
+     || (type) == R_NIOS2_TLS_DTPREL				\
+     || (type) == R_NIOS2_TLS_TPREL) * ELF_RTYPE_CLASS_PLT)	\
+   | (((type) == R_NIOS2_COPY) * ELF_RTYPE_CLASS_COPY))
+
+/* Return the link-time address of _DYNAMIC.  Conveniently, this is the
+   first element of the GOT.  */
+static inline Elf32_Addr
+elf_machine_dynamic (void)
+{
+  Elf32_Addr *dynamic;
+  int tmp;
+  __asm__ ("nextpc\t%0\n\t"
+       "1: movhi\t%1, %%hiadj(_GLOBAL_OFFSET_TABLE_ - 1b)\n\t"
+       "addi\t%1, %1, %%lo(_GLOBAL_OFFSET_TABLE_ - 1b)\n\t"
+       "add\t%0, %0, %1\n"
+       : "=r" (dynamic), "=r" (tmp));
+  return *dynamic;
+}
+
+/* Return the run-time load address of the shared object.  */
+static inline Elf32_Addr
+elf_machine_load_address (void)
+{
+  Elf32_Addr result;
+  int tmp;
+  __asm__ ("nextpc\t%0\n\t"
+       "1: movhi\t%1, %%hiadj(1b)\n\t"
+       "addi\t%1, %1, %%lo(1b)\n\t"
+       "sub\t%0, %0, %1\n"
+       : "=r" (result), "=r" (tmp));
+  return result;
+}
+
+static __always_inline void
+elf_machine_relative (Elf32_Addr load_off, const Elf32_Addr rel_addr,
+		      Elf32_Word relative_count)
+{
+	Elf32_Rel * rpnt = (void *) rel_addr;
+	do {
+		Elf32_Addr *const reloc_addr = (void *) (load_off + (rpnt)->r_offset);
+
+		*reloc_addr += load_off;
+	} while (--relative_count);
+}
+
diff --git a/ldso/ldso/or1k/elfinterp.c b/ldso/ldso/nios2/elfinterp.c
similarity index 80%
copy from ldso/ldso/or1k/elfinterp.c
copy to ldso/ldso/nios2/elfinterp.c
index 928e95b..bdbaa33 100644
--- a/ldso/ldso/or1k/elfinterp.c
+++ b/ldso/ldso/nios2/elfinterp.c
@@ -1,5 +1,4 @@
-/* vi: set sw=4 ts=4: */
-/* OpenRISC 1000 ELF shared library loader suppport
+/* nios2 ELF shared library loader suppport
  *
  * Copyright (c) 1994-2000 Eric Youngdale, Peter MacDonald,
  *                              David Engel, Hongjiu Lu and Mitch D'Souza
@@ -35,13 +34,6 @@
    References to symbols in sharable libraries can be resolved by either
    an ELF sharable library or a linux style of shared library. */
 
-/* Disclaimer:  I have never seen any AT&T source code for SVr4, nor have
-   I ever taken any courses on internals.  This program was developed using
-   information available through the book "UNIX SYSTEM V RELEASE 4,
-   Programmers guide: Ansi C and Programming Support Tools", which did
-   a more than adequate job of explaining everything required to get this
-   working. */
-
 extern int _dl_linux_resolve(void);
 
 unsigned long
@@ -72,20 +64,17 @@ _dl_linux_resolver(struct elf_resolve *tpnt, int reloc_entry)
 	/* Get the address of the GOT entry. */
 	new_addr = _dl_find_hash(symname, &_dl_loaded_modules->symbol_scope, tpnt, ELF_RTYPE_CLASS_PLT, NULL);
 	if (unlikely(!new_addr)) {
-		_dl_dprintf(2, "%s: can't resolve symbol '%s' in lib '%s'.\n",
-			    _dl_progname, symname, tpnt->libname);
+		_dl_dprintf(2, "%s: Can't resolve symbol '%s'\n", _dl_progname, symname);
 		_dl_exit(1);
 	}
 
 #if defined (__SUPPORT_LD_DEBUG__)
-	if ((unsigned long)got_addr < 0x40000000) {
-		if (_dl_debug_bindings) {
-			_dl_dprintf(_dl_debug_file, "\nresolve function: %s", symname);
-			if (_dl_debug_detail)
-				_dl_dprintf(_dl_debug_file,
-				            "\tpatched: %x ==> %x @ %x\n",
-				            *got_addr, new_addr, got_addr);
-		}
+	if (_dl_debug_bindings) {
+		_dl_dprintf(_dl_debug_file, "\nresolve function: %s", symname);
+		if (_dl_debug_detail)
+			_dl_dprintf(_dl_debug_file,
+			            "\tpatched: %x ==> %x @ %x\n",
+			            *got_addr, new_addr, got_addr);
 	}
 	if (!_dl_debug_nofixups)
 #endif
@@ -159,7 +148,7 @@ _dl_do_reloc(struct elf_resolve *tpnt, struct r_scope_elem *scope,
 	int symtab_index;
 	char *symname;
 #if defined USE_TLS && USE_TLS
-	struct elf_resolve *tls_tpnt;
+	struct elf_resolve *tls_tpnt = NULL;
 #endif
 	struct symbol_ref sym_ref;
 	ElfW(Addr) *reloc_addr;
@@ -168,10 +157,6 @@ _dl_do_reloc(struct elf_resolve *tpnt, struct r_scope_elem *scope,
 	ElfW(Addr) old_val;
 #endif
 
-	struct unaligned {
-		Elf32_Addr x;
-	} __attribute__ ((packed, may_alias));
-
 	reloc_addr = (ElfW(Addr)*)(tpnt->loadaddr + (unsigned long)rpnt->r_offset);
 	reloc_type = ELF_R_TYPE(rpnt->r_info);
 	symtab_index = ELF_R_SYM(rpnt->r_info);
@@ -209,41 +194,27 @@ _dl_do_reloc(struct elf_resolve *tpnt, struct r_scope_elem *scope,
 
 #if defined (__SUPPORT_LD_DEBUG__)
 	if (reloc_addr) {
-		old_val = ((struct unaligned *)reloc_addr)->x;
+		old_val = *reloc_addr;
 	} else {
 		old_val = 0;
 	}
 #endif
 
 	switch (reloc_type) {
-		case R_OR1K_NONE:
+		case R_NIOS2_NONE:
 			break;
 
-		case R_OR1K_8:
-		case R_OR1K_16:
-		case R_OR1K_32:
-			/* Support relocations on mis-aligned offsets.  */
-			((struct unaligned *)reloc_addr)->x = symbol_addr +
-				rpnt->r_addend;
-			break;
-
-		case R_OR1K_8_PCREL:
-		case R_OR1K_16_PCREL:
-		case R_OR1K_32_PCREL:
-		case R_OR1K_INSN_REL_26:
+		case R_NIOS2_BFD_RELOC_32:
+		case R_NIOS2_GLOB_DAT:
+		case R_NIOS2_JUMP_SLOT:
 			*reloc_addr = symbol_addr + rpnt->r_addend;
 			break;
 
-		case R_OR1K_GLOB_DAT:
-		case R_OR1K_JMP_SLOT:
-			*reloc_addr = symbol_addr + rpnt->r_addend;
-			break;
-/* Handled by elf_machine_relative */
-		case R_OR1K_RELATIVE:
+		case R_NIOS2_RELATIVE:
 			*reloc_addr = (unsigned long)tpnt->loadaddr + rpnt->r_addend;
 			break;
 
-		case R_OR1K_COPY:
+		case R_NIOS2_COPY:
 			if (symbol_addr) {
 #if defined (__SUPPORT_LD_DEBUG__)
 				if (_dl_debug_move)
@@ -257,10 +228,6 @@ _dl_do_reloc(struct elf_resolve *tpnt, struct r_scope_elem *scope,
 					   (char *)symbol_addr,
 					   sym_ref.sym->st_size);
 			}
-#if defined (__SUPPORT_LD_DEBUG__)
-			else
-				_dl_dprintf(_dl_debug_file, "no symbol_addr to copy !?\n");
-#endif
 			break;
 
 		default:
@@ -270,8 +237,7 @@ _dl_do_reloc(struct elf_resolve *tpnt, struct r_scope_elem *scope,
 #if defined (__SUPPORT_LD_DEBUG__)
 	if (_dl_debug_reloc && _dl_debug_detail)
 		_dl_dprintf(_dl_debug_file, "\tpatched: %x ==> %x @ %x\n",
-			    old_val, ((struct unaligned *)reloc_addr)->x,
-			    reloc_addr);
+			    old_val, *reloc_addr, reloc_addr);
 #endif
 
 	return 0;
@@ -282,14 +248,12 @@ _dl_do_lazy_reloc(struct elf_resolve *tpnt, struct r_scope_elem *scope,
 		  ELF_RELOC *rpnt, ElfW(Sym) *symtab, char *strtab)
 {
 	int reloc_type;
-	int symtab_index;
 	ElfW(Addr) *reloc_addr;
 #if defined (__SUPPORT_LD_DEBUG__)
 	ElfW(Addr) old_val;
 #endif
 
 	(void)scope;
-	symtab_index = ELF_R_SYM(rpnt->r_info);
 	(void)strtab;
 
 	reloc_addr = (ElfW(Addr)*)(tpnt->loadaddr + rpnt->r_offset);
@@ -300,9 +264,9 @@ _dl_do_lazy_reloc(struct elf_resolve *tpnt, struct r_scope_elem *scope,
 #endif
 
 	switch (reloc_type) {
-		case R_OR1K_NONE:
+		case R_NIOS2_NONE:
 			break;
-		case R_OR1K_JMP_SLOT:
+		case R_NIOS2_JUMP_SLOT:
 			*reloc_addr += (unsigned long)tpnt->loadaddr;
 			break;
 		default:
diff --git a/ldso/ldso/nios2/resolve.S b/ldso/ldso/nios2/resolve.S
new file mode 100644
index 0000000..a71839e
--- /dev/null
+++ b/ldso/ldso/nios2/resolve.S
@@ -0,0 +1,73 @@
+/* PLT trampolines.  Nios II version.
+   Copyright (C) 2005-2016 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/* This code is used in dl-runtime.c to call the `fixup' function
+   and then redirect to the address it returns. */
+
+	.text
+	.align 4
+	.globl _dl_linux_resolver
+	.globl _dl_linux_resolve
+	.type  _dl_linux_resolve,@function
+
+_dl_linux_resolve:
+/* The runtime resolver receives the original function arguments in r4
+   through r7, the shared library identifier from GOT[1]? in r14, and the
+   relocation index times four in r15. It updates the corresponding PLT GOT
+   entry so that the PLT entry will transfer control directly to the target
+   in the future, and then transfers control to the target. */
+	/* Save arguments and return address.  */
+	subi sp, sp, 28
+	stw r22, 24(sp)
+	stw r8, 20(sp)  /* save r8, because this might be a call to mcount */
+	stw r7, 16(sp)
+	stw r6, 12(sp)
+	stw r5, 8(sp)
+	stw r4, 4(sp)
+	stw ra, 0(sp)
+
+	/* Get pointer to linker struct.  */
+	mov r4, r14
+
+	/* Get the relocation offset.  We're given a multiple of 4 and
+	   need a multiple of 12, so multiply by 3. */
+	slli r5, r15, 1
+	add r5, r5, r15
+
+	/* Call the fixup routine.  */
+	nextpc r22
+1:	movhi r2, %hiadj(_gp_got - 1b)
+	addi r2, r2, %lo(_gp_got - 1b)
+	add r22, r22, r2
+	ldw r2, %call(_dl_linux_resolver)(r22)
+	callr r2
+
+	/* Restore the arguments and return address.  */
+	ldw ra, 0(sp)
+	ldw r4, 4(sp)
+	ldw r5, 8(sp)
+	ldw r6, 12(sp)
+	ldw r7, 16(sp)
+	ldw r8, 20(sp)
+	ldw r22, 24(sp)
+	addi sp, sp, 28
+
+	/* Jump to the newly found address.  */
+	jmp r2
+
+    .size _dl_linux_resolve, . - _dl_linux_resolve
diff --git a/libc/sysdeps/linux/nios2/Makefile.arch b/libc/sysdeps/linux/nios2/Makefile.arch
index e36e06b..887ce5a 100644
--- a/libc/sysdeps/linux/nios2/Makefile.arch
+++ b/libc/sysdeps/linux/nios2/Makefile.arch
@@ -1,12 +1,5 @@
 # Makefile for uClibc
-#
-# Copyright (C) 2000-2005 Erik Andersen <andersen@uclibc.org>
-#
 # Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
-#
 
-CSRC-y := brk.c syscall.c
-
-SSRC-y := \
-	__longjmp.S bsd-_setjmp.S bsd-setjmp.S setjmp.S \
-	vfork.S clone.S
+CSRC-y := __syscall_error.c
+SSRC-y := __longjmp.S setjmp.S vfork.S clone.S
diff --git a/libc/sysdeps/linux/nios2/__longjmp.S b/libc/sysdeps/linux/nios2/__longjmp.S
index 7df5997..3f112f1 100644
--- a/libc/sysdeps/linux/nios2/__longjmp.S
+++ b/libc/sysdeps/linux/nios2/__longjmp.S
@@ -1,48 +1,39 @@
-/*
- * libc/sysdeps/linux/nios2/__longjmp.S
- *
- *  Copyright (C) 2004,05,06  Microtronix Datacom Ltd
- *
- * This file is subject to the terms and conditions of the GNU Lesser
- * General Public License.  See the file COPYING.LIB in the main
- * directory of this archive for more details.
- * 
- * Written by Wentao Xu <wentao@microtronix.com>
- * 
- */
+/* longjmp for Nios II.
+   Copyright (C) 2015-2016 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
 
-#include <features.h>
-#include <jmpbuf-offsets.h>
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
 
-.globl __longjmp
-.type  __longjmp,@function
-.balign 4
+#include <sysdep.h>
+#include <jmpbuf-offsets.h>
 
-__longjmp:
-    /* return value is in r5*/
+ENTRY (__longjmp)
     mov     r2,  r5
-  
-    /* jmp_buf in r4, restore regs.  */
-    ldw     r16, (JB_REGS+ 0)(r4)
-    ldw     r17, (JB_REGS+ 4)(r4)
-    ldw     r18, (JB_REGS+ 8)(r4)
-    ldw     r19, (JB_REGS+12)(r4)
-    ldw     r20, (JB_REGS+16)(r4)
-    ldw     r21, (JB_REGS+20)(r4)
-    ldw     r22, (JB_REGS+24)(r4)
-    ldw     r23, (JB_REGS+28)(r4)
-    
-    ldw     ra, JB_PC(r4)
-    ldw     fp, JB_FP(r4)
-    ldw     gp, JB_GP(r4)
-    ldw     sp, JB_SP(r4)
-    
-#ifdef __UCLIBC_HAS_FPU__
-    RESTORE_FPU r4 JB_FPREGS
-#endif
 
-  /* return to saved RA */    
+    ldw	    r16, (JB_R16*4)(r4)
+    ldw	    r17, (JB_R17*4)(r4)
+    ldw	    r18, (JB_R18*4)(r4)
+    ldw	    r19, (JB_R19*4)(r4)
+    ldw	    r20, (JB_R20*4)(r4)
+    ldw     r21, (JB_R21*4)(r4)
+    ldw	    r22, (JB_R22*4)(r4)
+    ldw	    fp,  (JB_FP*4)(r4)
+    ldw	    ra,  (JB_RA*4)(r4)
+    ldw	    sp,  (JB_SP*4)(r4)
+  
     ret
 
-.size __longjmp,.-__longjmp
+END (__longjmp)
 libc_hidden_def(__longjmp)
diff --git a/libc/sysdeps/linux/xtensa/__syscall_error.c b/libc/sysdeps/linux/nios2/__syscall_error.c
similarity index 100%
copy from libc/sysdeps/linux/xtensa/__syscall_error.c
copy to libc/sysdeps/linux/nios2/__syscall_error.c
diff --git a/libc/sysdeps/linux/nios2/bits/fcntl.h b/libc/sysdeps/linux/nios2/bits/fcntl.h
index d8386d6..4fe1ee3 100644
--- a/libc/sysdeps/linux/nios2/bits/fcntl.h
+++ b/libc/sysdeps/linux/nios2/bits/fcntl.h
@@ -44,9 +44,9 @@
 #define O_ASYNC		 020000
 
 #ifdef __USE_GNU
-# define O_DIRECTORY	 040000	/* Must be a directory.	 */
-# define O_NOFOLLOW	0100000	/* Do not follow links.	 */
-# define O_DIRECT	0200000	/* Direct disk access.	*/
+# define O_DIRECTORY	0200000 /* Must be a directory.	 */
+# define O_NOFOLLOW	0400000	/* Do not follow links.	 */
+# define O_DIRECT	 040000	/* Direct disk access.	*/
 # define O_NOATIME     01000000 /* Do not set atime.  */
 # define O_CLOEXEC     02000000 /* set close_on_exec */
 # define O_PATH       010000000 /* Resolve pathname but do not open file.  */
diff --git a/libc/sysdeps/linux/nios2/bits/kernel_stat.h b/libc/sysdeps/linux/nios2/bits/kernel_stat.h
deleted file mode 100644
index 99a6cba..0000000
--- a/libc/sysdeps/linux/nios2/bits/kernel_stat.h
+++ /dev/null
@@ -1,50 +0,0 @@
-#ifndef _BITS_STAT_STRUCT_H
-#define _BITS_STAT_STRUCT_H
-
-/* This file provides whatever this particular arch's kernel thinks
- * struct kernel_stat should look like...  It turns out each arch has a
- * different opinion on the subject... */
-
-struct kernel_stat {
-	unsigned short st_dev;
-	unsigned short __pad1;
-	unsigned long st_ino;
-	unsigned short st_mode;
-	unsigned short st_nlink;
-	unsigned short st_uid;
-	unsigned short st_gid;
-	unsigned short st_rdev;
-	unsigned short __pad2;
-	unsigned long  st_size;
-	unsigned long  st_blksize;
-	unsigned long  st_blocks;
-	struct timespec st_atim;
-	struct timespec st_mtim;
-	struct timespec st_ctim;
-	unsigned long  __unused4;
-	unsigned long  __unused5;
-};
-
-struct kernel_stat64 {
-	unsigned short	st_dev;
-	unsigned char	__pad0[10];
-#define _HAVE_STAT64___ST_INO
-	unsigned long	__st_ino;
-	unsigned int	st_mode;
-	unsigned int	st_nlink;
-	unsigned long	st_uid;
-	unsigned long	st_gid;
-	unsigned short	st_rdev;
-	unsigned char	__pad3[10];
-	long long	st_size;
-	unsigned long	st_blksize;
-	unsigned long	st_blocks;	/* Number 512-byte blocks allocated. */
-	unsigned long	__pad4;		/* future possible st_blocks high bits */
-	struct timespec	st_atim;
-	struct timespec	st_mtim;
-	struct timespec	st_ctim;
-	unsigned long long	st_ino;
-};
-
-#endif	/*  _BITS_STAT_STRUCT_H */
-
diff --git a/libc/sysdeps/linux/nios2/bits/kernel_types.h b/libc/sysdeps/linux/nios2/bits/kernel_types.h
index 004f9c7..5c122b5 100644
--- a/libc/sysdeps/linux/nios2/bits/kernel_types.h
+++ b/libc/sysdeps/linux/nios2/bits/kernel_types.h
@@ -10,10 +10,10 @@
 typedef unsigned long	__kernel_dev_t;
 typedef unsigned long	__kernel_ino_t;
 typedef unsigned short	__kernel_mode_t;
-typedef unsigned short	__kernel_nlink_t;
+typedef unsigned long	__kernel_nlink_t;
 typedef long		__kernel_off_t;
 typedef int		__kernel_pid_t;
-typedef unsigned short	__kernel_ipc_pid_t;
+typedef int		__kernel_ipc_pid_t;
 typedef unsigned int	__kernel_uid_t;
 typedef unsigned int	__kernel_gid_t;
 typedef unsigned int	__kernel_size_t;
@@ -22,6 +22,8 @@ typedef int		__kernel_ptrdiff_t;
 typedef long		__kernel_time_t;
 typedef long		__kernel_suseconds_t;
 typedef long		__kernel_clock_t;
+typedef int		__kernel_timer_t;
+typedef int		__kernel_clockid_t;
 typedef int		__kernel_daddr_t;
 typedef char *		__kernel_caddr_t;
 typedef unsigned short	__kernel_uid16_t;
diff --git a/libc/sysdeps/linux/nios2/bits/setjmp.h b/libc/sysdeps/linux/nios2/bits/setjmp.h
index bc6f308..2fbb395 100644
--- a/libc/sysdeps/linux/nios2/bits/setjmp.h
+++ b/libc/sysdeps/linux/nios2/bits/setjmp.h
@@ -1,5 +1,5 @@
-/* Define the machine-dependent type `jmp_buf'.  Nios2 version.
-   Copyright (C) 1992,93,95,97,2000 Free Software Foundation, Inc.
+/* Define the machine-dependent type `jmp_buf'.  Nios II version.
+   Copyright (C) 1992-2016 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
@@ -13,7 +13,7 @@
    Lesser General Public License for more details.
 
    You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
+   License along with the GNU C Library.  If not, see
    <http://www.gnu.org/licenses/>.  */
 
 #ifndef _BITS_SETJMP_H
@@ -23,27 +23,9 @@
 # error "Never include <bits/setjmp.h> directly; use <setjmp.h> instead."
 #endif
 
-typedef struct
-{
-    /* Callee-saved registers r16 through r23.  */
-    unsigned long __regs[8];
+/* Saves r16-r22 (callee-saved, including GOT pointer), fp (frame pointer),
+   ra (return address), and sp (stack pointer).  */
 
-    /* Program counter.  */
-    unsigned long __pc;
-
-    /* Stack pointer.  */
-    unsigned long __sp;
-
-    /* The frame pointer.  */
-    unsigned long __fp;
-
-    /* The global pointer.  */
-    unsigned long __gp;
-
-	/* floating point regs, if any */
-#ifdef __UCLIBC_HAS_FPU__
-    unsigned long __fpregs[64];
-#endif
-} __jmp_buf[1];
+typedef int __jmp_buf[10];
 
 #endif	/* bits/setjmp.h */
diff --git a/libc/sysdeps/linux/nios2/bits/stat.h b/libc/sysdeps/linux/nios2/bits/stat.h
deleted file mode 100644
index 6e3b019..0000000
--- a/libc/sysdeps/linux/nios2/bits/stat.h
+++ /dev/null
@@ -1,167 +0,0 @@
-/* Copyright (C) 1992,95,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, see
-   <http://www.gnu.org/licenses/>.  */
-
-#ifndef _SYS_STAT_H
-# error "Never include <bits/stat.h> directly; use <sys/stat.h> instead."
-#endif
-
-/* Versions of the `struct stat' data structure.  */
-#define _STAT_VER_LINUX_OLD	1
-#define _STAT_VER_KERNEL	1
-#define _STAT_VER_SVR4		2
-#define _STAT_VER_LINUX		3
-#define _STAT_VER		_STAT_VER_LINUX	/* The one defined below.  */
-
-/* Versions of the `xmknod' interface.  */
-#define _MKNOD_VER_LINUX	1
-#define _MKNOD_VER_SVR4		2
-#define _MKNOD_VER		_MKNOD_VER_LINUX /* The bits defined below.  */
-
-
-struct stat
-  {
-    __dev_t st_dev;			/* Device.  */
-    unsigned short int __pad1;
-#ifndef __USE_FILE_OFFSET64
-    __ino_t st_ino;			/* File serial number.	*/
-#else
-    __ino_t __st_ino;			/* 32bit file serial number.	*/
-#endif
-    __mode_t st_mode;			/* File mode.  */
-    __nlink_t st_nlink;			/* Link count.  */
-    __uid_t st_uid;			/* User ID of the file's owner.	*/
-    __gid_t st_gid;			/* Group ID of the file's group.*/
-    __dev_t st_rdev;			/* Device number, if device.  */
-    unsigned short int __pad2;
-#ifndef __USE_FILE_OFFSET64
-    __off_t st_size;			/* Size of file, in bytes.  */
-#else
-    __off64_t st_size;			/* Size of file, in bytes.  */
-#endif
-    __blksize_t st_blksize;		/* Optimal block size for I/O.  */
-
-#ifndef __USE_FILE_OFFSET64
-    __blkcnt_t st_blocks;		/* Number 512-byte blocks allocated. */
-#else
-    __blkcnt64_t st_blocks;		/* Number 512-byte blocks allocated. */
-#endif
-#ifdef __USE_MISC
-    /* Nanosecond resolution timestamps are stored in a format
-       equivalent to 'struct timespec'.  This is the type used
-       whenever possible but the Unix namespace rules do not allow the
-       identifier 'timespec' to appear in the <sys/stat.h> header.
-       Therefore we have to handle the use of this header in strictly
-       standard-compliant sources special.  */
-    struct timespec st_atim;		/* Time of last access.  */
-    struct timespec st_mtim;		/* Time of last modification.  */
-    struct timespec st_ctim;		/* Time of last status change.  */
-# define st_atime st_atim.tv_sec	/* Backward compatibility.  */
-# define st_mtime st_mtim.tv_sec
-# define st_ctime st_ctim.tv_sec
-#else
-    __time_t st_atime;			/* Time of last access.  */
-    unsigned long int st_atimensec;	/* Nscecs of last access.  */
-    __time_t st_mtime;			/* Time of last modification.  */
-    unsigned long int st_mtimensec;	/* Nsecs of last modification.  */
-    __time_t st_ctime;			/* Time of last status change.  */
-    unsigned long int st_ctimensec;	/* Nsecs of last status change.  */
-#endif
-#ifndef __USE_FILE_OFFSET64
-    unsigned long int __unused4;
-    unsigned long int __unused5;
-#else
-    __ino64_t st_ino;			/* File serial number.	*/
-#endif
-  };
-
-#ifdef __USE_LARGEFILE64
-struct stat64
-  {
-    __dev_t st_dev;			/* Device.  */
-    unsigned int __pad1;
-
-    __ino_t __st_ino;			/* 32bit file serial number.	*/
-    __mode_t st_mode;			/* File mode.  */
-    __nlink_t st_nlink;			/* Link count.  */
-    __uid_t st_uid;			/* User ID of the file's owner.	*/
-    __gid_t st_gid;			/* Group ID of the file's group.*/
-    __dev_t st_rdev;			/* Device number, if device.  */
-    unsigned int __pad2;
-    __off64_t st_size;			/* Size of file, in bytes.  */
-    __blksize_t st_blksize;		/* Optimal block size for I/O.  */
-
-    __blkcnt64_t st_blocks;		/* Number 512-byte blocks allocated. */
-#ifdef __USE_MISC
-    /* Nanosecond resolution timestamps are stored in a format
-       equivalent to 'struct timespec'.  This is the type used
-       whenever possible but the Unix namespace rules do not allow the
-       identifier 'timespec' to appear in the <sys/stat.h> header.
-       Therefore we have to handle the use of this header in strictly
-       standard-compliant sources special.  */
-    struct timespec st_atim;		/* Time of last access.  */
-    struct timespec st_mtim;		/* Time of last modification.  */
-    struct timespec st_ctim;		/* Time of last status change.  */
-#else
-    __time_t st_atime;			/* Time of last access.  */
-    unsigned long int st_atimensec;	/* Nscecs of last access.  */
-    __time_t st_mtime;			/* Time of last modification.  */
-    unsigned long int st_mtimensec;	/* Nsecs of last modification.  */
-    __time_t st_ctime;			/* Time of last status change.  */
-    unsigned long int st_ctimensec;	/* Nsecs of last status change.  */
-#endif
-    __ino64_t st_ino;			/* File serial number.		*/
-  };
-#endif
-
-/* Tell code we have these members.  */
-#define	_STATBUF_ST_BLKSIZE
-#define _STATBUF_ST_RDEV
-/* Nanosecond resolution time values are supported.  */
-#define _STATBUF_ST_NSEC
-
-/* Encoding of the file mode.  */
-
-#define	__S_IFMT	0170000	/* These bits determine file type.  */
-
-/* File types.  */
-#define	__S_IFDIR	0040000	/* Directory.  */
-#define	__S_IFCHR	0020000	/* Character device.  */
-#define	__S_IFBLK	0060000	/* Block device.  */
-#define	__S_IFREG	0100000	/* Regular file.  */
-#define	__S_IFIFO	0010000	/* FIFO.  */
-#define	__S_IFLNK	0120000	/* Symbolic link.  */
-#define	__S_IFSOCK	0140000	/* Socket.  */
-
-/* POSIX.1b objects.  Note that these macros always evaluate to zero.  But
-   they do it by enforcing the correct use of the macros.  */
-#define __S_TYPEISMQ(buf)  ((buf)->st_mode - (buf)->st_mode)
-#define __S_TYPEISSEM(buf) ((buf)->st_mode - (buf)->st_mode)
-#define __S_TYPEISSHM(buf) ((buf)->st_mode - (buf)->st_mode)
-
-/* Protection bits.  */
-
-#define	__S_ISUID	04000	/* Set user ID on execution.  */
-#define	__S_ISGID	02000	/* Set group ID on execution.  */
-#define	__S_ISVTX	01000	/* Save swapped text after use (sticky).  */
-#define	__S_IREAD	0400	/* Read by owner.  */
-#define	__S_IWRITE	0200	/* Write by owner.  */
-#define	__S_IEXEC	0100	/* Execute by owner.  */
-
-#ifdef __USE_ATFILE
-# define UTIME_NOW	((1l << 30) - 1l)
-# define UTIME_OMIT	((1l << 30) - 2l)
-#endif
diff --git a/libc/sysdeps/linux/nios2/bits/syscalls.h b/libc/sysdeps/linux/nios2/bits/syscalls.h
index 5be5d4d..2b12343 100644
--- a/libc/sysdeps/linux/nios2/bits/syscalls.h
+++ b/libc/sysdeps/linux/nios2/bits/syscalls.h
@@ -4,106 +4,97 @@
 # error "Never use <bits/syscalls.h> directly; include <sys/syscall.h> instead."
 #endif
 
-#define TRAP_ID_SYSCALL	0
+#ifdef __ASSEMBLER__
 
-#ifndef __ASSEMBLER__
+#undef DO_CALL
+#define DO_CALL(syscall_name, args) \
+    DOARGS_##args                   \
+    movi r2, SYS_ify(syscall_name);  \
+    trap;
 
-#include <errno.h>
-
-#define __syscall_return(type, res)					\
-	do {								\
-		if (unlikely(INTERNAL_SYSCALL_ERROR_P(res, ))) {	\
-			__set_errno(INTERNAL_SYSCALL_ERRNO(res, ));	\
-			res = (unsigned long) -1;			\
-		}							\
-		return (type) (res);					\
-	} while (0)
+#define DOARGS_0 /* nothing */
+#define DOARGS_1 /* nothing */
+#define DOARGS_2 /* nothing */
+#define DOARGS_3 /* nothing */
+#define DOARGS_4 /* nothing */
+#define DOARGS_5 ldw r8, 0(sp);
+#define DOARGS_6 ldw r9, 4(sp); ldw r8, 0(sp);
 
-#define INTERNAL_SYSCALL_NCS(name, err, nr, args...)			\
-(__extension__ \
-	({								\
-		long __res;						\
-		__asm__ __volatile__ (					\
-			"movi    r2,    %2\n\t"   /* TRAP_ID_SYSCALL */ \
-			"movi    r3,    %1\n\t"   /* __NR_##name     */	\
-			ASM_ARGS_##nr					\
-			"trap\n\t"					\
-			"mov     %0,    r2\n\t"   /* syscall return  */	\
-			:   "=r" (__res)          /* %0              */	\
-			:   "i" (name)            /* %1              */	\
-			  , "i" (TRAP_ID_SYSCALL) /* %2              */	\
-			  MAP_ARGS_##nr (args)    /* %3-%8           */	\
-			:   "r2"					\
-			  , "r3"					\
-			  CLOB_ARGS_##nr          /* Clobbered       */ \
-		);							\
-		__res;							\
-	}) \
-)
+#else
 
-#define INTERNAL_SYSCALL_ERROR_P(val, err)	\
-	((unsigned long)(val) >= (unsigned long)(-125))
-
-#define ASM_ARGS_0
-#define MAP_ARGS_0()
-#define CLOB_ARGS_0
-
-#define ASM_ARGS_1		\
-	"mov     r4,    %3\n\t"
-#define MAP_ARGS_1(a)		\
-	, "r" ((long) a)
-#define CLOB_ARGS_1		\
-	, "r4"
+#include <errno.h>
 
-#define ASM_ARGS_2		\
-	ASM_ARGS_1		\
-	"mov     r5,    %4\n\t"
-#define MAP_ARGS_2(a, b)	\
-	MAP_ARGS_1(a)		\
-	, "r" ((long) b)
-#define CLOB_ARGS_2		\
-	CLOB_ARGS_1		\
-	, "r5"
+#undef INTERNAL_SYSCALL_DECL
+#define INTERNAL_SYSCALL_DECL(err) unsigned int err __attribute__((unused))
 
-#define ASM_ARGS_3		\
-	ASM_ARGS_2		\
-	"mov     r6,    %5\n\t"
-#define MAP_ARGS_3(a, b, c)	\
-	MAP_ARGS_2(a, b)	\
-	, "r" ((long) c)
-#define CLOB_ARGS_3		\
-	CLOB_ARGS_2		\
-	, "r6"
+#undef INTERNAL_SYSCALL_ERROR_P
+#define INTERNAL_SYSCALL_ERROR_P(val, err) ((void) (val), (unsigned int) (err))
 
-#define ASM_ARGS_4		\
-	ASM_ARGS_3		\
-	"mov     r7,    %6\n\t"
-#define MAP_ARGS_4(a, b, c, d)	\
-	MAP_ARGS_3(a, b, c)	\
-	, "r" ((long) d)
-#define CLOB_ARGS_4		\
-	CLOB_ARGS_3		\
-	, "r7"
+#undef INTERNAL_SYSCALL_ERRNO
+#define INTERNAL_SYSCALL_ERRNO(val, err)   ((void) (err), val)
 
-#define ASM_ARGS_5		\
-	ASM_ARGS_4		\
-	"mov     r8,    %7\n\t"
-#define MAP_ARGS_5(a, b, c, d, e)	\
-	MAP_ARGS_4(a, b, c, d)		\
-	, "r" ((long) e)
-#define CLOB_ARGS_5		\
-	CLOB_ARGS_4		\
-	, "r8"
+#undef INTERNAL_SYSCALL_NCS
+#define INTERNAL_SYSCALL_NCS(name, err, nr, args...)            \
+  ({ unsigned int _sys_result;                                  \
+     {                                                          \
+       LOAD_ARGS_##nr (args)					\
+       LOAD_REGS_##nr						\
+       register int _r2 __asm__ ("r2") = (int)(name);           \
+       register int _sys_err __asm__ ("r7");                        \
+       __asm__ volatile ("trap"                                 \
+                     : "+r" (_r2), "=r" (_sys_err)              \
+                     : ASM_ARGS_##nr				\
+                     : "memory");                               \
+       _sys_result = _r2;                                       \
+       err = _sys_err;						\
+     }                                                          \
+     (int) _sys_result; })
 
-#define ASM_ARGS_6		\
-	ASM_ARGS_5		\
-	"mov     r9,    %8\n\t"
-#define MAP_ARGS_6(a, b, c, d, e, f)	\
-	MAP_ARGS_5(a, b, c, d, e)	\
-	, "r" ((long) f)
-#define CLOB_ARGS_6		\
-	CLOB_ARGS_5		\
-	, "r9"
+#define LOAD_ARGS_0()
+#define LOAD_REGS_0
+#define ASM_ARGS_0
+#define LOAD_ARGS_1(a1)				\
+  LOAD_ARGS_0 ()				\
+  int __arg1 = (int) (a1);
+#define LOAD_REGS_1				\
+  register int _r4 __asm__ ("r4") = __arg1;	\
+  LOAD_REGS_0
+#define ASM_ARGS_1                  "r" (_r4)
+#define LOAD_ARGS_2(a1, a2)			\
+  LOAD_ARGS_1 (a1)				\
+  int __arg2 = (int) (a2);
+#define LOAD_REGS_2				\
+  register int _r5 __asm__ ("r5") = __arg2;	\
+  LOAD_REGS_1
+#define ASM_ARGS_2      ASM_ARGS_1, "r" (_r5)
+#define LOAD_ARGS_3(a1, a2, a3)			\
+  LOAD_ARGS_2 (a1, a2)				\
+  int __arg3 = (int) (a3);
+#define LOAD_REGS_3				\
+  register int _r6 __asm__ ("r6") = __arg3;	\
+  LOAD_REGS_2
+#define ASM_ARGS_3      ASM_ARGS_2, "r" (_r6)
+#define LOAD_ARGS_4(a1, a2, a3, a4)		\
+  LOAD_ARGS_3 (a1, a2, a3)			\
+  int __arg4 = (int) (a4);
+#define LOAD_REGS_4				\
+  register int _r7 __asm__ ("r7") = __arg4;	\
+  LOAD_REGS_3
+#define ASM_ARGS_4      ASM_ARGS_3, "r" (_r7)
+#define LOAD_ARGS_5(a1, a2, a3, a4, a5)		\
+  LOAD_ARGS_4 (a1, a2, a3, a4)			\
+  int __arg5 = (int) (a5);
+#define LOAD_REGS_5				\
+  register int _r8 __asm__ ("r8") = __arg5;	\
+  LOAD_REGS_4
+#define ASM_ARGS_5      ASM_ARGS_4, "r" (_r8)
+#define LOAD_ARGS_6(a1, a2, a3, a4, a5, a6)	\
+  LOAD_ARGS_5 (a1, a2, a3, a4, a5)		\
+  int __arg6 = (int) (a6);
+#define LOAD_REGS_6			    \
+  register int _r9 __asm__ ("r9") = __arg6;     \
+  LOAD_REGS_5
+#define ASM_ARGS_6      ASM_ARGS_5, "r" (_r9)
 
 #endif /* __ASSEMBLER__ */
 #endif /* _BITS_SYSCALLS_H */
diff --git a/libc/sysdeps/linux/nios2/bsd-_setjmp.S b/libc/sysdeps/linux/nios2/bsd-_setjmp.S
deleted file mode 100644
index e1350f5..0000000
--- a/libc/sysdeps/linux/nios2/bsd-_setjmp.S
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * libc/sysdeps/linux/nios2/bsd-_setjmp.S
- *
- *  Copyright (C) 2004,05,06  Microtronix Datacom Ltd
- *
- * This file is subject to the terms and conditions of the GNU Lesser
- * General Public License.  See the file COPYING.LIB in the main
- * directory of this archive for more details.
- * 
- * Written by Wentao Xu <wentao@microtronix.com>
- * 
- */
-
-#include <features.h>
-#include <jmpbuf-offsets.h>
-
-   .globl _setjmp
-   .type  _setjmp,@function
-   .balign 4
-
-_setjmp:
-    stw     r16, (JB_REGS+ 0)(r4)
-    stw     r17, (JB_REGS+ 4)(r4)
-    stw     r18, (JB_REGS+ 8)(r4)
-    stw     r19, (JB_REGS+12)(r4)
-    stw     r20, (JB_REGS+16)(r4)
-    stw     r21, (JB_REGS+20)(r4)
-    stw     r22, (JB_REGS+24)(r4)
-    stw     r23, (JB_REGS+28)(r4)
-    
-    stw     ra, JB_PC(r4)
-    stw     sp, JB_SP(r4)
-    stw     fp, JB_FP(r4)
-    stw     gp, JB_GP(r4)
-    
-#ifdef __UCLIBC_HAS_FPU__
-    SAVE_FPU r4 JB_FPREGS
-#endif
-    stw     r0, JB_SIZE(r4) /* signal mask is not saved */
-    mov     r2, zero
-    ret
-
-
-
diff --git a/libc/sysdeps/linux/nios2/bsd-setjmp.S b/libc/sysdeps/linux/nios2/bsd-setjmp.S
deleted file mode 100644
index f533754..0000000
--- a/libc/sysdeps/linux/nios2/bsd-setjmp.S
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * libc/sysdeps/linux/nios2/bsd-setjmp.S
- *
- *  Copyright (C) 2004,05,06  Microtronix Datacom Ltd
- *
- * This file is subject to the terms and conditions of the GNU Lesser
- * General Public License.  See the file COPYING.LIB in the main
- * directory of this archive for more details.
- * 
- * Written by Wentao Xu <wentao@microtronix.com>
- * 
- */
-
-
-#include <features.h>
-#include <jmpbuf-offsets.h>
-
-   .globl setjmp
-   .type  setjmp,@function
-   .balign 4
-
-setjmp:
-    stw     r16, (JB_REGS+ 0)(r4)
-    stw     r17, (JB_REGS+ 4)(r4)
-    stw     r18, (JB_REGS+ 8)(r4)
-    stw     r19, (JB_REGS+12)(r4)
-    stw     r20, (JB_REGS+16)(r4)
-    stw     r21, (JB_REGS+20)(r4)
-    stw     r22, (JB_REGS+24)(r4)
-    stw     r23, (JB_REGS+28)(r4)
-    
-    stw     ra, JB_PC(r4)
-    stw     sp, JB_SP(r4)
-    stw     fp, JB_FP(r4)
-    stw     gp, JB_GP(r4)
-    
-#ifdef __UCLIBC_HAS_FPU__
-    SAVE_FPU r4 JB_FPREGS
-#endif
-
-    movui r5, 1
-#ifdef __PIC__
-    /* just pray 16 bit offset is enough */
-    br __sigjmp_save
-#else
-    movhi r8, %hi(__sigjmp_save)
-    ori r8, r8, %lo(__sigjmp_save)    
-    jmp r8
-#endif
-
-
diff --git a/libc/sysdeps/linux/nios2/clone.S b/libc/sysdeps/linux/nios2/clone.S
index 4afcb7d..0626d8a 100644
--- a/libc/sysdeps/linux/nios2/clone.S
+++ b/libc/sysdeps/linux/nios2/clone.S
@@ -1,70 +1,94 @@
-/*
- * libc/sysdeps/linux/nios2/clone.S -- `clone' syscall for linux/nios2
- *
- *  Copyright (C) 2004  Microtronix Datacom Ltd
- *
- * This file is subject to the terms and conditions of the GNU Lesser
- * General Public License.  See the file COPYING.LIB in the main
- * directory of this archive for more details.
- * 
- * Written by Wentao Xu <wentao@microtronix.com>
- */
-
-#define _ERRNO_H
+/* clone() implementation for Nios II.
+   Copyright (C) 2008-2016 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Andrew Jenner <andrew@codesourcery.com>, 2008.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/* clone() is even more special than fork() as it mucks with stacks
+   and invokes a function in the right context after its all over.  */
+
+#include <sysdep.h>
+#define _ERRNO_H	1
 #include <bits/errno.h>
-#include <sys/syscall.h>
-
-#ifdef __NR_clone
-/* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg); */
-
-.text
-.global clone
-.type   clone,%function
-.align 4
-clone:
-	addi    sp,sp,-8
-	mov     r8,r4
-	stw     ra,4(sp)
-	stw     r16,0(sp)
-
-	mov     r4,r6
-	movi    r2,-EINVAL
-	
-	/* sanity check */
-	beq     r8,zero,CLONE_ERROR_LABEL
-	beq     r5,zero,CLONE_ERROR_LABEL
-	
-	/* system call */
-	movi    r2,TRAP_ID_SYSCALL
-	movi    r3,__NR_clone
-	trap
-	
-	/* child call the function */
-	mov     r4,r7
-	bne     r2,zero,CLONE_ERROR_LABEL
-	callr   r8
-	
-	/* exit if it returns */
-	mov     r4,r2
-	movi    r3,__NR_exit
+
+#ifdef __UCLIBC_HAS_THREADS_NATIVE__
+#include <tcb-offsets.h>
+#endif
+
+#define CLONE_VM      0x00000100
+
+/* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg,
+	     void *parent_tidptr, void *tls, void *child_tidptr) */
+
+	.text
+ENTRY(__clone)
+	/* Sanity check arguments.  */
+	movi	r2, EINVAL
+
+	subi	r5, r5, 8	/* Reserve argument save space.  */
+	stw	r4, 4(r5)	/* Save function pointer.  */
+	stw	r7, 0(r5)	/* Save argument pointer.  */
+
+	/* Load arguments.  */
+	mov	r4, r6
+	ldw	r6, 0(sp)
+	ldw	r7, 8(sp)
+	ldw	r8, 4(sp)
+
+	/* Do the system call.  */
+	movi	r2, SYS_ify (clone)
+
 	trap
-	
-CLONE_ERROR_LABEL: 
-	movi    r3,-4096
-	sub     r16,zero,r2
-	bgeu    r3,r2,CLONE_OK
-	
-	/* store errno */
-	call    __errno_location
-	stw     r16,0(r2)
-	movi    r2,-1
-
-CLONE_OK:
-	ldw     ra,4(sp)
-	ldw     r16,0(sp)
-	addi    sp,sp,8
+
+	/* See if we're on the newly created thread.  */
+	beq	r2, zero, thread_start
+	/* Successful return from the parent */
 	ret
 
-.size clone,.-clone
+thread_start:
+	/* We expect the argument registers to be preserved across system
+	   calls and across task cloning, so flags should be in r4 here.  */
+	andi	r2, r4, CLONE_VM
+	bne	r2, zero, 2f
+        DO_CALL (getpid, 0)
+#ifdef RESET_PID
+	stw	r2, PID_OFFSET(r23)
+	stw	r2, TID_OFFSET(r23)
+#endif
+2:
+	ldw	r5, 4(sp)	/* Function pointer.  */
+	ldw	r4, 0(sp)	/* Argument pointer.  */
+	addi	sp, sp, 8
+
+        /* Call the user's function.  */
+	callr	r5
 
+	/* _exit with the result.  */
+	mov	r4, r2
+#ifdef __PIC__
+	nextpc	r22
+1:	movhi	r8, %hiadj(_gp_got - 1b)
+	addi	r8, r8, %lo(_gp_got - 1b)
+	add	r22, r22, r8
+	ldw	r8, %call(HIDDEN_JUMPTARGET(_exit))(r22)
+	jmp	r8
+#else
+	jmpi	_exit
 #endif
+
+END(__clone)
+libc_hidden_def (__clone)
+weak_alias (__clone, clone)
diff --git a/libc/sysdeps/linux/nios2/clone.c b/libc/sysdeps/linux/nios2/clone.c
deleted file mode 100644
index eec9f42..0000000
--- a/libc/sysdeps/linux/nios2/clone.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * libc/sysdeps/linux/nios2/clone.c -- `clone' syscall for linux/nios2
- * Copyright (C) 2000-2006 Erik Andersen <andersen@uclibc.org>
- *
- * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
- *
- *
- *  Copyright (C) 2004,05  Microtronix Datacom Ltd
- *  Copyright (C) 2002,03  NEC Electronics Corporation
- *  Copyright (C) 2002,03  Miles Bader <miles@gnu.org>
- *
- * Written by Miles Bader <miles@gnu.org>
- * Nios2 port by Wentao Xu
- */
-
-#include <errno.h>
-#include <sched.h>
-#include <sys/syscall.h>
-
-int clone (int (*fn)(void *arg), void *child_stack, int flags, void *arg, ...)
-{
-  register unsigned long rval __asm__ ("r2") = -EINVAL;
-
-  if (fn && child_stack) {
-      register unsigned long syscall __asm__ ("r3");
-      register unsigned long arg0 __asm__ ("r4");
-      register unsigned long arg1 __asm__ ("r5");
-
-      /* Clone this thread.  */
-      rval = TRAP_ID_SYSCALL;
-      syscall = __NR_clone;
-      arg0 = flags;
-      arg1 = (unsigned long)child_stack;
-      __asm__ __volatile__ ("trap "
-         : "=r" (rval), "=r" (syscall)
-         : "0" (rval),"1" (syscall), "r" (arg0), "r" (arg1)
-         );
-
-      if (rval == 0) {
-         /* In child thread, call fn and exit.  */
-         arg0 = (*fn) (arg);
-         syscall = __NR_exit;
-         __asm__ __volatile__ ("trap "
-          : "=r" (rval), "=r" (syscall)
-          : "1" (syscall), "r" (arg0));
-      }
-   }
-
-  __syscall_return (int, rval);
-}
diff --git a/libc/sysdeps/linux/nios2/crt1.S b/libc/sysdeps/linux/nios2/crt1.S
index c178452..e13d595 100644
--- a/libc/sysdeps/linux/nios2/crt1.S
+++ b/libc/sysdeps/linux/nios2/crt1.S
@@ -1,20 +1,40 @@
-/*
- * libc/sysdeps/linux/nios2/crt0.S -- entry point for linux/nios2
- *
- *  Copyright (C) 2004,05,06  Microtronix Datacom Ltd
- *
- * This file is subject to the terms and conditions of the GNU Lesser
- * General Public License.  See the file COPYING.LIB in the main
- * directory of this archive for more details.
- * 
- * Written by Wentao Xu <wentao@microtronix.com>
- * Updated by Thomas Chou <thomas@wytron.com.tw> for crt1.S
- * 
- */
+/* Startup code for Nios II
+   Copyright (C) 1995-2016 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file with other
+   programs, and to distribute those programs without any restriction
+   coming from the use of this file. (The GNU Lesser General Public
+   License restrictions do apply in other respects; for example, they
+   cover modification of the file, and distribution when not linked
+   into another program.)
+
+   Note that people who make modified versions of this file are not
+   obligated to grant this special exception for their modified
+   versions; it is their choice whether to do so. The GNU Lesser
+   General Public License gives permission to release a modified
+   version without this exception; this exception also makes it
+   possible to release a modified version which carries forward this
+   exception.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
 
 #include <features.h>
 #include <asm/unistd.h>
-#define TRAP_ID_SYSCALL        0
 
     .global _start
     .type   _start,@function
@@ -27,45 +47,64 @@
     .type   main,@function
     .type   __uClibc_main,@function
     .text
-	.balign 4
+
 _start:
-    nop
-    br 0f
-0:
-    /* load gp */
-    movhi gp, %hiadj(_gp)
-    addi gp, gp, %lo(_gp)
-
-    /* load main, argc, argv from stack */
-    movhi r4, %hi(main)
-    ori  r4, r4, %lo(main)	/* main */
-    ldw r5, 0(sp)		/* argc */
-    ldw r6, 4(sp)		/* argv */
-
-    /* load the 4th arg */
-    movhi r7, %hi(_init)
-    ori  r7, r7, %lo(_init)
-
-    /* Allocate space on the stack for 6-7th arg, reuse 5th space */
-    addi sp,sp,-8
-    /* push 5-7th args on stack */
-    movhi r8, %hi(_fini)
-    ori  r8, r8, %lo(_fini)
-    stw  r8, 0(sp)
-
-    stw  r2, 4(sp)		/* rtld_fini */
-    stw  sp, 8(sp)		/* stack_end */
-
-    /* call uClibc_main, shouldn't return */
-#ifdef __PIC__
-    /* just pray 16 bit offset is enough */
-    br __uClibc_main
-#else
-    call __uClibc_main
-#endif
+	/* Set up the global pointer.  */
+	movhi	gp, %hiadj(_gp)
+	addi	gp, gp, %lo(_gp)
+
+	/* Save the stack pointer.  */
+	mov	r2, sp
+
+	/* Create room on the stack for the fini, rtld_fini and stack_end args
+	   to __uClibc_main. */
+	subi	sp, sp, 12
+
+	/* Push stack_end */
+	stw	r2, 8(sp)
+
+	/* Push rtld_fini */
+	stw	r4, 4(sp)
+
+	/* Set up the GOT pointer.  */
+	nextpc	r22
+1:	movhi	r2, %hiadj(_gp_got - 1b)
+	addi	r2, r2, %lo(_gp_got - 1b)
+	add	r22, r22, r2
+
+	/* r6 == argv */
+	addi	r6, sp, 16
+
+	/* r5 == argc */
+	ldw	r5, 12(sp)
+
+	/* r4 == main */
+	movhi	r4, %call_hiadj(main)
+	addi	r4, r4, %call_lo(main)
+	add	r4, r4, r22
+	ldw	r4, 0(r4)
+
+	/* fp == 0 */
+	mov	fp, zero
+
+	/* Let the libc call main and exit with its return code.  */
+	movhi	r2, %call_hiadj(__uClibc_main)
+	addi	r2, r2, %call_lo(__uClibc_main)
+	add	r2, r2, r22
+	ldw	r2, 0(r2)
+	callr	r2
+
+	/* should never get here....*/
+	movhi	r2, %call_hiadj(abort)
+	addi	r2, r2, %call_lo(abort)
+	add	r2, r2, r22
+	ldw	r2, 0(r2)
+	callr	r2
 
-    /* crash in the event of return */
-__exit:
-    movui r2, TRAP_ID_SYSCALL
-    movui r3, __NR_exit
-    trap
+/* Define a symbol for the first piece of initialized data.  */
+	.data
+	.globl __data_start
+__data_start:
+	.long 0
+	.weak data_start
+	data_start = __data_start
diff --git a/libc/sysdeps/linux/nios2/fpu_control.h b/libc/sysdeps/linux/nios2/fpu_control.h
deleted file mode 100644
index 4ba51b5..0000000
--- a/libc/sysdeps/linux/nios2/fpu_control.h
+++ /dev/null
@@ -1,98 +0,0 @@
-/* FPU control word bits.  Nios2 version.
-   Copyright (C) 1996, 1997, 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, see
-   <http://www.gnu.org/licenses/>.  */
-
-#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>
-
-/* 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__ ("cfc1 %0,$31" : "=r" (cw))
-#define _FPU_SETCW(cw) __asm__ ("ctc1 %0,$31" : : "r" (cw))
-
-#if 0
-/* Default control word set at startup.  */
-extern fpu_control_t __fpu_control;
-#endif
-
-#endif	/* fpu_control.h */
diff --git a/libc/sysdeps/linux/nios2/jmpbuf-offsets.h b/libc/sysdeps/linux/nios2/jmpbuf-offsets.h
index b7d19ca..20482b3 100644
--- a/libc/sysdeps/linux/nios2/jmpbuf-offsets.h
+++ b/libc/sysdeps/linux/nios2/jmpbuf-offsets.h
@@ -6,12 +6,16 @@
 
 #include <features.h>
 
-#define JB_REGS		0
-#define JB_PC		32
-#define JB_SP		36
-#define JB_FP		40
-#define JB_GP		44
-#define JB_FPREGS 	48
+#define JB_R16 0
+#define JB_R17 1
+#define JB_R18 2
+#define JB_R19 3
+#define JB_R20 4
+#define JB_R21 5
+#define JB_R22 6
+#define JB_FP  7
+#define JB_RA  8
+#define JB_SP  9
 
 #ifdef __UCLIBC_HAS_FPU__
 # define JB_SIZE 304
diff --git a/libc/sysdeps/linux/nios2/jmpbuf-unwind.h b/libc/sysdeps/linux/nios2/jmpbuf-unwind.h
index c22ab24..fe0028b 100644
--- a/libc/sysdeps/linux/nios2/jmpbuf-unwind.h
+++ b/libc/sysdeps/linux/nios2/jmpbuf-unwind.h
@@ -1,12 +1,39 @@
-/*
- * Copyright (C) 2000-2006 Erik Andersen <andersen@uclibc.org>
- *
- * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
- */
+/* Examine __jmp_buf for unwinding frames.  Nios II version.
+   Copyright (C) 2005-2016 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
 
 #include <setjmp.h>
+#include <jmpbuf-offsets.h>
 
 /* Test if longjmp to JMPBUF would unwind the frame
    containing a local variable at ADDRESS.  */
+
 #define _JMPBUF_UNWINDS(jmpbuf, address) \
-  ((void *) (address) < (void *) (jmpbuf)->__sp)
+  ((void *) (address) < (void *) (jmpbuf[JB_SP]))
+
+#ifdef __UCLIBC_HAS_THREADS_NATIVE__
+
+#include <stdint.h>
+#include <unwind.h>
+
+#define _JMPBUF_CFA_UNWINDS_ADJ(_jmpbuf, _context, _adj) \
+  _JMPBUF_UNWINDS_ADJ (_jmpbuf, (void *) _Unwind_GetCFA (_context), _adj)
+
+#define _JMPBUF_UNWINDS_ADJ(_jmpbuf, _address, _adj) \
+  ((uintptr_t) (_address) - (_adj) < (uintptr_t) (_jmpbuf)[JB_SP] - (_adj))
+
+#endif
diff --git a/libc/sysdeps/linux/nios2/setjmp.S b/libc/sysdeps/linux/nios2/setjmp.S
index 6071685..8050dba 100644
--- a/libc/sysdeps/linux/nios2/setjmp.S
+++ b/libc/sysdeps/linux/nios2/setjmp.S
@@ -1,49 +1,56 @@
-/*
- * libc/sysdeps/linux/nios2/setjmp.S
- *
- *  Copyright (C) 2004,05,06  Microtronix Datacom Ltd
- *
- * This file is subject to the terms and conditions of the GNU Lesser
- * General Public License.  See the file COPYING.LIB in the main
- * directory of this archive for more details.
- * 
- * Written by Wentao Xu <wentao@microtronix.com>
- * 
- */
-
-#include <features.h>
+/* setjmp for Nios II.
+   Copyright (C) 1991-2016 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <sysdep.h>
 #include <jmpbuf-offsets.h>
 
-.globl __sigsetjmp
-.type  __sigsetjmp,@function
-.balign 4
-
-__sigsetjmp:
-    stw     r16, (JB_REGS+ 0)(r4)
-    stw     r17, (JB_REGS+ 4)(r4)
-    stw     r18, (JB_REGS+ 8)(r4)
-    stw     r19, (JB_REGS+12)(r4)
-    stw     r20, (JB_REGS+16)(r4)
-    stw     r21, (JB_REGS+20)(r4)
-    stw     r22, (JB_REGS+24)(r4)
-    stw     r23, (JB_REGS+28)(r4)
-    
-    stw     ra, JB_PC(r4)
-    stw     sp, JB_SP(r4)
-    stw     fp, JB_FP(r4)
-    stw     gp, JB_GP(r4)
-    
-#ifdef __UCLIBC_HAS_FPU__
-    SAVE_FPU r4 JB_FPREGS
-#endif
-
-#ifdef   __PIC__
-    /* just pray 16 bit offset is enough */
-    br __sigjmp_save
-#else
-    movhi r8, %hi(__sigjmp_save)
-    ori r8, r8, %lo(__sigjmp_save)    
-    jmp r8
-#endif
-
-.size __sigsetjmp,.-__sigsetjmp
+	.text
+ENTRY(setjmp)
+	movi	r5, 1
+	br	__sigsetjmp
+END(setjmp)
+libc_hidden_def(setjmp)
+
+ENTRY(_setjmp)
+	mov	r5, zero
+	br	__sigsetjmp
+END(_setjmp)
+libc_hidden_def(_setjmp)
+
+/* Save the current program position in ENV and return 0.  */
+ENTRY(__sigsetjmp)
+	stw	r16, (JB_R16*4)(r4)
+	stw	r17, (JB_R17*4)(r4)
+	stw	r18, (JB_R18*4)(r4)
+	stw	r19, (JB_R19*4)(r4)
+	stw	r20, (JB_R20*4)(r4)
+	stw	r21, (JB_R21*4)(r4)
+	stw	r22, (JB_R22*4)(r4)
+	stw	fp,  (JB_FP*4)(r4)
+	stw	ra,  (JB_RA*4)(r4)
+	stw	sp,  (JB_SP*4)(r4)
+	/* Save the signal mask if requested.  */
+        nextpc r2
+
+1:	movhi r3, %hiadj(__sigjmp_save - 1b)
+	addi r3, r3, %lo(__sigjmp_save - 1b)
+	add r2, r2, r3
+	jmp r2
+
+END(__sigsetjmp)
+libc_hidden_def(__sigsetjmp)
diff --git a/libc/sysdeps/linux/nios2/syscall.c b/libc/sysdeps/linux/nios2/syscall.c
deleted file mode 100644
index 60ddd02..0000000
--- a/libc/sysdeps/linux/nios2/syscall.c
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * libc/sysdeps/linux/nios2/syscall.c -- generic syscall function for linux/nios2
- *
- * Copyright (C) 2004 Microtronix Datacom Ltd.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Library General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program 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 Library General Public License
- * for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this program; see the file COPYING.LIB.  If not, see
- * <http://www.gnu.org/licenses/>.
- */
-
-#include <features.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/syscall.h>
-
-
-long syscall(long sysnum, long a, long b, long c, long d, long e, long f)
-{
-    register long _r2 __asm__("r2")=(long)TRAP_ID_SYSCALL;
-    register long _r3 __asm__("r3")=(long)sysnum;
-
-    register long _r4 __asm__("r4")=(long)(a);
-    register long _r5 __asm__("r5")=(long)(b);
-    register long _r6 __asm__("r6")=(long)(c);
-    register long _r7 __asm__("r7")=(long)(d);
-    register long _r8 __asm__("r8")=(long)(e);
-    register long _r9 __asm__("r9")=(long)(f);
-    __asm__ __volatile__(
-	    "trap "
-	    : "=r"(_r2), "=r"(_r3)
-	    : "0"(_r2), "1"(_r3),
-	      "r"(_r4), "r"(_r5), "r"(_r6), "r"(_r7), "r"(_r8), "r"(_r9)
-	    : "memory");
-
-  __syscall_return (long, _r2);
-}
-
diff --git a/libpthread/nptl/sysdeps/microblaze/dl-tls.h b/libc/sysdeps/linux/nios2/sysdep.h
similarity index 64%
copy from libpthread/nptl/sysdeps/microblaze/dl-tls.h
copy to libc/sysdeps/linux/nios2/sysdep.h
index 5613e21..6813818 100644
--- a/libpthread/nptl/sysdeps/microblaze/dl-tls.h
+++ b/libc/sysdeps/linux/nios2/sysdep.h
@@ -1,5 +1,5 @@
-/* Copyright (C) 2005-2016 Free Software Foundation, Inc.
-
+/* Assembler macros for Nios II.
+   Copyright (C) 2015-2016 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
@@ -16,11 +16,19 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-/* Type used for the representation of TLS information in the GOT.  */
-typedef struct
-{
-  unsigned long int ti_module;
-  unsigned long int ti_offset;
-} tls_index;
+#include <common/sysdep.h>
+
+#ifdef	__ASSEMBLER__
+
+#define ASM_SIZE_DIRECTIVE(name) .size name,.-name
+
+#define ENTRY(name)						 \
+  .globl C_SYMBOL_NAME(name);					 \
+  .type C_SYMBOL_NAME(name),%function;				 \
+  C_LABEL(name)
+
+#undef  END
+#define END(name)				\
+  ASM_SIZE_DIRECTIVE(name)
 
-extern void *__tls_get_addr (tls_index *ti);
+#endif	/* __ASSEMBLER__ */
diff --git a/libc/sysdeps/linux/nios2/vfork.S b/libc/sysdeps/linux/nios2/vfork.S
index 2aee81e..99e4a73 100644
--- a/libc/sysdeps/linux/nios2/vfork.S
+++ b/libc/sysdeps/linux/nios2/vfork.S
@@ -1,50 +1,54 @@
-/*
- * libc/sysdeps/linux/nios2/vfork.S -- `vfork' syscall for linux/nios2
- *
- *  Copyright (C) 2004  Microtronix Datacom Ltd
- *
- * This file is subject to the terms and conditions of the GNU Lesser
- * General Public License.  See the file COPYING.LIB in the main
- * directory of this archive for more details.
- * 
- * Written by Wentao Xu <wentao@microtronix.com>
- */
-
-#include <sys/syscall.h>
-
-#define __NR_vfork 1071
-
-.text
-.global	__vfork
-.hidden	__vfork
-.type	__vfork,%function
-.align 4
-__vfork:
-    movui   r2, TRAP_ID_SYSCALL
-    movui   r3, __NR_vfork
-    trap
-    movi    r8, -4096
-    bltu    r8, r2, fix_errno
-    ret
-fix_errno:
-    sub     r8, r0, r2
-    
-    addi    sp, sp, -8
-    stw     ra, 4(sp)
-    stw     r8, 0(sp)
-#ifndef __PIC__
-    call    __errno_location
-#else
-    
+/* vfork for Nios II Linux.
+   Copyright (C) 2005-2016 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <sysdep.h>
+
+#ifdef __UCLIBC_HAS_THREADS_NATIVE__
+#include <tcb-offsets.h>
+#endif
+
+ENTRY(__vfork)
+
+#ifdef RESET_PID
+	ldw	r6, PID_OFFSET(r23)
+	sub	r7, zero, r6
+	bne	r7, zero, 2f
+	movhi	r7, %hi(0x80000000)
+2:
+	stw	r7, PID_OFFSET(r23)
 #endif
-    ldw     ra, 4(sp)
-    ldw     r8, 0(sp)
-    stw     r8, 0(r2)
-    
-    addi    r2, r0, -1
-    addi  sp, sp, 8
-    ret
-
-.size __vfork,.-__vfork
-weak_alias(__vfork,vfork)
+
+	movi	r4, 0x4111 /* (CLONE_VM | CLONE_VFORK | SIGCHLD) */
+	mov	r5, zero
+
+	/* Do the system call.  */
+    	movi 	r2, SYS_ify(clone)
+
+    	trap
+
+	beq	r2, zero, 1f
+#ifdef RESET_PID
+	stw	r6, PID_OFFSET(r23)
+#endif
+1:
+	ret
+
+END(__vfork)
+
+weak_alias(__vfork, vfork)
 libc_hidden_def(vfork)
diff --git a/libpthread/nptl/pthread_create.c b/libpthread/nptl/pthread_create.c
index d42a6e7..49497fe 100644
--- a/libpthread/nptl/pthread_create.c
+++ b/libpthread/nptl/pthread_create.c
@@ -454,7 +454,7 @@ __pthread_create_2_1 (
      performed in 'get_cached_stack'.  This way we avoid doing this if
      the stack freshly allocated with 'mmap'.  */
 
-#ifdef TLS_TCB_AT_TP
+#if TLS_TCB_AT_TP
   /* Reference to the TCB itself.  */
   pd->header.self = pd;
 
diff --git a/libpthread/nptl/sysdeps/powerpc/Makefile.arch b/libpthread/nptl/sysdeps/nios2/Makefile.arch
similarity index 58%
copy from libpthread/nptl/sysdeps/powerpc/Makefile.arch
copy to libpthread/nptl/sysdeps/nios2/Makefile.arch
index 18ddc28..fbb560b 100644
--- a/libpthread/nptl/sysdeps/powerpc/Makefile.arch
+++ b/libpthread/nptl/sysdeps/nios2/Makefile.arch
@@ -1,7 +1,4 @@
 # Makefile for uClibc NPTL
-#
-# Copyright (C) 2009 Bernhard Reutner-Fischer <uclibc@uclibc.org>
-#
 # Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
-#
 
+libc_arch_a_CSRC = libc-tls.c
diff --git a/libpthread/nptl/sysdeps/mips/dl-tls.h b/libpthread/nptl/sysdeps/nios2/dl-tls.h
similarity index 73%
copy from libpthread/nptl/sysdeps/mips/dl-tls.h
copy to libpthread/nptl/sysdeps/nios2/dl-tls.h
index e26aa38..cd79461 100644
--- a/libpthread/nptl/sysdeps/mips/dl-tls.h
+++ b/libpthread/nptl/sysdeps/nios2/dl-tls.h
@@ -1,5 +1,5 @@
-/* Thread-local storage handling in the ELF dynamic linker.  MIPS version.
-   Copyright (C) 2005 Free Software Foundation, Inc.
+/* Thread-local storage handling in the ELF dynamic linker.  Nios II version.
+   Copyright (C) 2012-2016 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
@@ -13,7 +13,7 @@
    Lesser General Public License for more details.
 
    You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
+   License along with the GNU C Library.  If not, see
    <http://www.gnu.org/licenses/>.  */
 
 
@@ -32,14 +32,17 @@ typedef struct
 #define TLS_DTV_OFFSET		0x8000
 
 /* Compute the value for a GOTTPREL reloc.  */
-#define TLS_TPREL_VALUE(sym_map, sym_val) \
-  ((sym_map)->l_tls_offset + sym_val - TLS_TP_OFFSET)
+#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_val) \
-  (sym_val - TLS_DTV_OFFSET)
+#define TLS_DTPREL_VALUE(sym) \
+  ((sym)->st_value - TLS_DTV_OFFSET)
 
 extern void *__tls_get_addr (tls_index *ti);
 
 # define GET_ADDR_OFFSET	(ti->ti_offset + TLS_DTV_OFFSET)
 # define __TLS_GET_ADDR(__ti)	(__tls_get_addr (__ti) - TLS_DTV_OFFSET)
+
+/* Value used for dtv entries for which the allocation is delayed.  */
+#define TLS_DTV_UNALLOCATED	((void *) -1l)
diff --git a/libpthread/nptl/sysdeps/mips/libc-tls.c b/libpthread/nptl/sysdeps/nios2/libc-tls.c
similarity index 79%
copy from libpthread/nptl/sysdeps/mips/libc-tls.c
copy to libpthread/nptl/sysdeps/nios2/libc-tls.c
index d6ac875..d677979 100644
--- a/libpthread/nptl/sysdeps/mips/libc-tls.c
+++ b/libpthread/nptl/sysdeps/nios2/libc-tls.c
@@ -1,5 +1,5 @@
-/* Thread-local storage handling in the ELF dynamic linker.  MIPS version.
-   Copyright (C) 2005 Free Software Foundation, Inc.
+/* Thread-local storage handling in the ELF dynamic linker.  Nios II version.
+   Copyright (C) 2005-2016 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
@@ -13,15 +13,13 @@
    Lesser General Public License for more details.
 
    You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
+   License along with the GNU C Library.  If not, see
    <http://www.gnu.org/licenses/>.  */
 
 #include <sysdeps/generic/libc-tls.c>
 #include <dl-tls.h>
 
-#if USE_TLS
-
-/* On MIPS, linker optimizations are not required, so __tls_get_addr
+/* On Nios II, linker optimizations are not required, so __tls_get_addr
    can be called even in statically linked binaries.  In this case module
    must be always 1 and PT_TLS segment exist in the binary, otherwise it
    would not link.  */
@@ -32,5 +30,3 @@ __tls_get_addr (tls_index *ti)
   dtv_t *dtv = THREAD_DTV ();
   return (char *) dtv[1].pointer.val + GET_ADDR_OFFSET;
 }
-
-#endif
diff --git a/libpthread/nptl/sysdeps/arm/pthread_spin_lock.c b/libpthread/nptl/sysdeps/nios2/pthread_spin_lock.c
similarity index 100%
copy from libpthread/nptl/sysdeps/arm/pthread_spin_lock.c
copy to libpthread/nptl/sysdeps/nios2/pthread_spin_lock.c
diff --git a/libpthread/nptl/sysdeps/microblaze/pthread_spin_trylock.c b/libpthread/nptl/sysdeps/nios2/pthread_spin_trylock.c
similarity index 100%
copy from libpthread/nptl/sysdeps/microblaze/pthread_spin_trylock.c
copy to libpthread/nptl/sysdeps/nios2/pthread_spin_trylock.c
diff --git a/libpthread/nptl/sysdeps/mips/pthreaddef.h b/libpthread/nptl/sysdeps/nios2/pthreaddef.h
similarity index 84%
copy from libpthread/nptl/sysdeps/mips/pthreaddef.h
copy to libpthread/nptl/sysdeps/nios2/pthreaddef.h
index 6929882..4268252 100644
--- a/libpthread/nptl/sysdeps/mips/pthreaddef.h
+++ b/libpthread/nptl/sysdeps/nios2/pthreaddef.h
@@ -1,4 +1,5 @@
-/* Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc.
+/* pthread machine parameter definitions, Nios II version.
+   Copyright (C) 2002-2016 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
@@ -12,27 +13,24 @@
    Lesser General Public License for more details.
 
    You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
+   License along with the GNU C Library.  If not, see
    <http://www.gnu.org/licenses/>.  */
 
 /* Default stack size.  */
 #define ARCH_STACK_DEFAULT_SIZE	(2 * 1024 * 1024)
 
 /* Required stack pointer alignment at beginning.  */
-#define STACK_ALIGN		16
+#define STACK_ALIGN		4
 
 /* Minimal stack size after allocating thread descriptor and guard size.  */
 #define MINIMAL_REST_STACK	2048
 
 /* Alignment requirement for TCB.  */
-#define TCB_ALIGNMENT		16
-
+#define TCB_ALIGNMENT		4
 
 /* 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 --git a/libpthread/nptl/sysdeps/mips/tcb-offsets.sym b/libpthread/nptl/sysdeps/nios2/tcb-offsets.sym
similarity index 50%
copy from libpthread/nptl/sysdeps/mips/tcb-offsets.sym
copy to libpthread/nptl/sysdeps/nios2/tcb-offsets.sym
index e0e71dc..d9ae952 100644
--- a/libpthread/nptl/sysdeps/mips/tcb-offsets.sym
+++ b/libpthread/nptl/sysdeps/nios2/tcb-offsets.sym
@@ -4,8 +4,11 @@
 --
 
 -- 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)
+# undef __thread_self
+# define __thread_self          ((void *) 0)
+# define thread_offsetof(mem)   ((ptrdiff_t) THREAD_SELF + offsetof (struct pthread, mem))
 
 MULTIPLE_THREADS_OFFSET		thread_offsetof (header.multiple_threads)
 PID_OFFSET			thread_offsetof (pid)
 TID_OFFSET			thread_offsetof (tid)
+POINTER_GUARD			(offsetof (tcbhead_t, pointer_guard) - TLS_TCB_OFFSET - sizeof (tcbhead_t))
diff --git a/libpthread/nptl/sysdeps/mips/tls.h b/libpthread/nptl/sysdeps/nios2/tls.h
similarity index 73%
copy from libpthread/nptl/sysdeps/mips/tls.h
copy to libpthread/nptl/sysdeps/nios2/tls.h
index 09baf12..9785670 100644
--- a/libpthread/nptl/sysdeps/mips/tls.h
+++ b/libpthread/nptl/sysdeps/nios2/tls.h
@@ -1,5 +1,5 @@
-/* Definition for thread-local data handling.  NPTL/MIPS version.
-   Copyright (C) 2005, 2007 Free Software Foundation, Inc.
+/* Definition for thread-local data handling.  NPTL/Nios II version.
+   Copyright (C) 2012-2016 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
@@ -13,7 +13,7 @@
    Lesser General Public License for more details.
 
    You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
+   License along with the GNU C Library.  If not, see
    <http://www.gnu.org/licenses/>.  */
 
 #ifndef _TLS_H
@@ -35,28 +35,14 @@ typedef union dtv
   } pointer;
 } dtv_t;
 
-/* Note: rd must be $v1 to be ABI-conformant.  */
-# define READ_THREAD_POINTER() \
-    ({ void *__result;							      \
-       __asm__ __volatile__ (".set\tpush\n\t.set\tmips32r2\n\t"		      \
-		     "rdhwr\t%0, $29\n\t.set\tpop" : "=v" (__result));	      \
-       __result; })
-
 #else /* __ASSEMBLER__ */
 # include <tcb-offsets.h>
-
-# define READ_THREAD_POINTER(rd) \
-	.set	push;							      \
-	.set	mips32r2;						      \
-	rdhwr	rd, $29;						      \
-	.set	pop
 #endif /* __ASSEMBLER__ */
 
-
 /* We require TLS support in the tools.  */
-#define HAVE_TLS_SUPPORT		1
-#define HAVE_TLS_MODEL_ATTRIBUTE	1
-#define HAVE___THREAD			1
+#define HAVE_TLS_SUPPORT                1
+#define HAVE_TLS_MODEL_ATTRIBUTE        1
+#define HAVE___THREAD                   1
 
 /* Signal that TLS support is available.  */
 #define USE_TLS	1
@@ -70,14 +56,19 @@ typedef union dtv
 # define TLS_DTV_AT_TP	1
 
 /* Get the thread descriptor definition.  */
-#include <../../descr.h>
+# include <../../descr.h>
 
 typedef struct
 {
   dtv_t *dtv;
-  void *private;
+  uintptr_t pointer_guard;
+  unsigned spare[6];
 } tcbhead_t;
 
+register struct pthread *__thread_self __asm__("r23");
+
+#define READ_THREAD_POINTER() ((void *) __thread_self)
+
 /* This is the size of the initial TCB.  Because our TCB is before the thread
    pointer, we don't need this.  */
 # define TLS_INIT_TCB_SIZE	0
@@ -97,10 +88,9 @@ typedef struct
   (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
+/* The thread pointer (in hardware register r23) points to the end of
+   the TCB + 0x7000, as for PowerPC and MIPS.  */
+# define TLS_TCB_OFFSET 0x7000
 
 /* Install the dtv pointer.  The pointer passed is to the element with
    index -1 which contain the length.  */
@@ -115,16 +105,13 @@ typedef struct
 # define GET_DTV(tcbp) \
   (((tcbhead_t *) (tcbp))[-1].dtv)
 
-/* Code to initially initialize the thread pointer.  This might need
-   special attention since 'errno' is not yet available and if the
-   operation can cause a failure 'errno' must not be touched.  */
+/* Code to initially initialize the thread pointer.  */
 # define TLS_INIT_TP(tcbp, secondcall) \
-  ({ INTERNAL_SYSCALL_DECL (err);					\
-     long result_var attribute_unused;					\
-     result_var = INTERNAL_SYSCALL (set_thread_area, err, 1,		\
-				    (char *) (tcbp) + TLS_TCB_OFFSET);	\
-     INTERNAL_SYSCALL_ERROR_P (result_var, err)				\
-       ? "unknown error" : NULL; })
+  (__thread_self = (struct pthread *) ((char *) tcbp + TLS_TCB_OFFSET), NULL)
+
+/* Value passed to 'clone' for initialization of the thread register.  */
+# define TLS_DEFINE_INIT_TP(tp, pd) \
+  void *tp = (void *) (pd) + TLS_TCB_OFFSET + TLS_PRE_TCB_SIZE
 
 /* Return the address of the dtv for the current thread.  */
 # define THREAD_DTV() \
@@ -137,7 +124,7 @@ typedef struct
 
 /* 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)
+  REGISTER (32, 32, 23 * 4, -TLS_PRE_TCB_SIZE - TLS_TCB_OFFSET)
 
 /* Access to data in the thread descriptor is easy.  */
 # define THREAD_GETMEM(descr, member) \
@@ -149,9 +136,20 @@ typedef struct
 # 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
+# define THREAD_GET_POINTER_GUARD()				\
+  (((tcbhead_t *) (READ_THREAD_POINTER ()			\
+		   - TLS_TCB_OFFSET))[-1].pointer_guard)
+# define THREAD_SET_POINTER_GUARD(value)	\
+  (THREAD_GET_POINTER_GUARD () = (value))
+# define THREAD_COPY_POINTER_GUARD(descr)				\
+  (((tcbhead_t *) ((void *) (descr)					\
+		   + TLS_PRE_TCB_SIZE))[-1].pointer_guard		\
+   = THREAD_GET_POINTER_GUARD())
+
+/* l_tls_offset == 0 is perfectly valid on Nios II, so we have to use some
    different value to mean unset l_tls_offset.  */
 # define NO_TLS_OFFSET		-1
+
 /* Get and set the global scope generation counter in struct pthread.  */
 #define THREAD_GSCOPE_FLAG_UNUSED 0
 #define THREAD_GSCOPE_FLAG_USED   1
diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/mips/Makefile b/libpthread/nptl/sysdeps/unix/sysv/linux/nios2/Makefile
similarity index 81%
copy from libpthread/nptl/sysdeps/unix/sysv/linux/mips/Makefile
copy to libpthread/nptl/sysdeps/unix/sysv/linux/nios2/Makefile
index 43a6fad..8415283 100644
--- a/libpthread/nptl/sysdeps/unix/sysv/linux/mips/Makefile
+++ b/libpthread/nptl/sysdeps/unix/sysv/linux/nios2/Makefile
@@ -1,9 +1,5 @@
 # Makefile for uClibc NPTL
-#
-# Copyright (C) 2005 Steven J. Hill <sjhill@uclibc.org>
-#
 # Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
-#
 
 top_srcdir=../../../../../../../
 top_builddir=../../../../../../../
diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/powerpc/Makefile.arch b/libpthread/nptl/sysdeps/unix/sysv/linux/nios2/Makefile.arch
similarity index 71%
copy from libpthread/nptl/sysdeps/unix/sysv/linux/powerpc/Makefile.arch
copy to libpthread/nptl/sysdeps/unix/sysv/linux/nios2/Makefile.arch
index 2abb1d2..26f51fb 100644
--- a/libpthread/nptl/sysdeps/unix/sysv/linux/powerpc/Makefile.arch
+++ b/libpthread/nptl/sysdeps/unix/sysv/linux/nios2/Makefile.arch
@@ -1,15 +1,9 @@
 # Makefile for uClibc NPTL
-#
-# Copyright (C) 2009 Bernhard Reutner-Fischer <uclibc@uclibc.org>
-#
 # Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
-#
 
 libpthread_linux_arch_SSRC =
 libpthread_linux_arch_CSRC = pthread_once.c
 
 libc_linux_arch_CSRC = fork.c
 libc_linux_arch_SSRC = clone.S vfork.S
-
-ASFLAGS += -DUSE___THREAD
-
+libc_linux_arch_SSRC-OMIT = waitpid.S
diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/bits/pthreadtypes.h b/libpthread/nptl/sysdeps/unix/sysv/linux/nios2/bits/pthreadtypes.h
similarity index 89%
copy from libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/bits/pthreadtypes.h
copy to libpthread/nptl/sysdeps/unix/sysv/linux/nios2/bits/pthreadtypes.h
index 5e44020..76076d0 100644
--- a/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/bits/pthreadtypes.h
+++ b/libpthread/nptl/sysdeps/unix/sysv/linux/nios2/bits/pthreadtypes.h
@@ -1,4 +1,5 @@
-/* Copyright (C) 2002-2012 Free Software Foundation, Inc.
+/* Machine-specific pthread type layouts.  Nios II version.
+   Copyright (C) 2012-2016 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
@@ -24,7 +25,6 @@
 #define __SIZEOF_PTHREAD_MUTEX_T 24
 #define __SIZEOF_PTHREAD_MUTEXATTR_T 4
 #define __SIZEOF_PTHREAD_COND_T 48
-#define __SIZEOF_PTHREAD_COND_COMPAT_T 12
 #define __SIZEOF_PTHREAD_CONDATTR_T 4
 #define __SIZEOF_PTHREAD_RWLOCK_T 32
 #define __SIZEOF_PTHREAD_RWLOCKATTR_T 8
@@ -32,8 +32,8 @@
 #define __SIZEOF_PTHREAD_BARRIERATTR_T 4
 
 
-/* Thread identifiers.  The structure of the attribute type is not
-   exposed on purpose.  */
+/* Thread identifiers.  The structure of the attribute type is
+   deliberately not exposed.  */
 typedef unsigned long int pthread_t;
 
 
@@ -55,7 +55,7 @@ typedef struct __pthread_internal_slist
 
 
 /* Data structures for mutex handling.  The structure of the attribute
-   type is not exposed on purpose.  */
+   type is deliberately not exposed.  */
 typedef union
 {
   struct __pthread_mutex_s
@@ -83,9 +83,12 @@ typedef union
   long int __align;
 } pthread_mutexattr_t;
 
+/* Mutex __spins initializer used by PTHREAD_MUTEX_INITIALIZER.  */
+#define __PTHREAD_SPINS 0
+
 
 /* Data structure for conditional variable handling.  The structure of
-   the attribute type is not exposed on purpose.  */
+   the attribute type is deliberately not exposed.  */
 typedef union
 {
   struct
@@ -120,7 +123,7 @@ 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 not exposed on purpose.  */
+   structure of the attribute type is deliberately not exposed.  */
 typedef union
 {
   struct
@@ -152,6 +155,8 @@ typedef union
   long int __align;
 } pthread_rwlock_t;
 
+#define __PTHREAD_RWLOCK_ELISION_EXTRA 0
+
 typedef union
 {
   char __size[__SIZEOF_PTHREAD_RWLOCKATTR_T];
diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/bits/semaphore.h b/libpthread/nptl/sysdeps/unix/sysv/linux/nios2/bits/semaphore.h
similarity index 89%
copy from libpthread/nptl/sysdeps/unix/sysv/linux/sh/bits/semaphore.h
copy to libpthread/nptl/sysdeps/unix/sysv/linux/nios2/bits/semaphore.h
index 9da293a..d877316 100644
--- a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/bits/semaphore.h
+++ b/libpthread/nptl/sysdeps/unix/sysv/linux/nios2/bits/semaphore.h
@@ -1,6 +1,6 @@
-/* Copyright (C) 2002 Free Software Foundation, Inc.
+/* Machine-specific POSIX semaphore type layouts.  Nios II version.
+   Copyright (C) 2002-2016 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@redhat.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
@@ -20,14 +20,11 @@
 # error "Never use <bits/semaphore.h> directly; include <semaphore.h> instead."
 #endif
 
-
 #define __SIZEOF_SEM_T	16
 
-
 /* Value returned if `sem_open' failed.  */
 #define SEM_FAILED      ((sem_t *) 0)
 
-
 typedef union
 {
   char __size[__SIZEOF_SEM_T];
diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/nios2/clone.S b/libpthread/nptl/sysdeps/unix/sysv/linux/nios2/clone.S
new file mode 100644
index 0000000..544974f
--- /dev/null
+++ b/libpthread/nptl/sysdeps/unix/sysv/linux/nios2/clone.S
@@ -0,0 +1,3 @@
+#define RESET_PID
+#include <tcb-offsets.h>
+#include "../../../../../../../libc/sysdeps/linux/nios2/clone.S"
diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/microblaze/createthread.c b/libpthread/nptl/sysdeps/unix/sysv/linux/nios2/createthread.c
similarity index 100%
copy from libpthread/nptl/sysdeps/unix/sysv/linux/microblaze/createthread.c
copy to libpthread/nptl/sysdeps/unix/sysv/linux/nios2/createthread.c
diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/arm/fork.c b/libpthread/nptl/sysdeps/unix/sysv/linux/nios2/fork.c
similarity index 100%
copy from libpthread/nptl/sysdeps/unix/sysv/linux/arm/fork.c
copy to libpthread/nptl/sysdeps/unix/sysv/linux/nios2/fork.c
diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/arm/lowlevellock.h b/libpthread/nptl/sysdeps/unix/sysv/linux/nios2/lowlevellock.h
similarity index 100%
copy from libpthread/nptl/sysdeps/unix/sysv/linux/arm/lowlevellock.h
copy to libpthread/nptl/sysdeps/unix/sysv/linux/nios2/lowlevellock.h
diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/arm/pt-gettimeofday.c b/libpthread/nptl/sysdeps/unix/sysv/linux/nios2/pt-gettimeofday.c
similarity index 100%
copy from libpthread/nptl/sysdeps/unix/sysv/linux/arm/pt-gettimeofday.c
copy to libpthread/nptl/sysdeps/unix/sysv/linux/nios2/pt-gettimeofday.c
diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/arm/pthread_once.c b/libpthread/nptl/sysdeps/unix/sysv/linux/nios2/pthread_once.c
similarity index 100%
copy from libpthread/nptl/sysdeps/unix/sysv/linux/arm/pthread_once.c
copy to libpthread/nptl/sysdeps/unix/sysv/linux/nios2/pthread_once.c
diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/nios2/sysdep-cancel.h b/libpthread/nptl/sysdeps/unix/sysv/linux/nios2/sysdep-cancel.h
new file mode 100644
index 0000000..25382dd
--- /dev/null
+++ b/libpthread/nptl/sysdeps/unix/sysv/linux/nios2/sysdep-cancel.h
@@ -0,0 +1,140 @@
+/* Assembler macros with cancellation support, Nios II version.
+   Copyright (C) 2003-2016 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <sysdep.h>
+#include <tls.h>
+#ifndef __ASSEMBLER__
+# include <pthreadP.h>
+#endif
+
+#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
+
+#ifdef __ASSEMBLER__
+# undef PSEUDO
+# define PSEUDO(name, syscall_name, args)				      \
+  .type __##syscall_name##_nocancel, @function;				      \
+  .globl __##syscall_name##_nocancel;					      \
+  __##syscall_name##_nocancel:						      \
+    cfi_startproc;                                                            \
+    DO_CALL (syscall_name, args);                                             \
+    ret;                                                                      \
+    cfi_endproc;                                                              \
+  .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel;	      \
+  ENTRY (name)								      \
+    SINGLE_THREAD_P(r2);						      \
+    bne r2, zero, pseudo_cancel;					      \
+    DO_CALL (syscall_name, args);					      \
+    ret;								      \
+  pseudo_cancel:							      \
+    SAVESTK_##args;                 /* save syscall args and adjust stack */  \
+    SAVEREG(ra, 0);                     /* save return address */             \
+    SAVEREG(r22, 4);                    /* save GOT pointer */                \
+    nextpc r22;                                                               \
+1:  movhi r2, %hiadj(_gp_got - 1b);					      \
+    addi r2, r2, %lo(_gp_got - 1b);					      \
+    add r22, r22, r2;                                                         \
+    CENABLE;                                                                  \
+    callr r3;                                                                 \
+    stw r2, 8(sp);                      /* save mask */                       \
+    LOADARGS_##args;                                                          \
+    movi r2, SYS_ify(syscall_name);                                           \
+    trap;                                                                     \
+    stw r2, 12(sp);                     /* save syscall result */             \
+    stw r7, 16(sp);                     /* save syscall error flag */         \
+    ldw r4, 8(sp);                      /* pass mask as argument 1 */         \
+    CDISABLE;                                                                 \
+    callr r3;                                                                 \
+    ldw r7, 16(sp);                     /* restore syscall error flag */      \
+    ldw r2, 12(sp);                     /* restore syscall result */          \
+    ldw ra, 0(sp);                      /* restore return address */          \
+    ldw r22, 4(sp);                     /* restore GOT pointer */             \
+    RESTORESTK_##args;                                                        \
+
+
+# undef PSEUDO_END
+# define PSEUDO_END(sym) \
+  END (sym)
+
+#define SAVEREG(REG, LOC) stw REG, LOC(sp); cfi_rel_offset (REG, LOC)
+#define SAVESTK(X) subi sp, sp, X; cfi_adjust_cfa_offset(X)
+#define SAVESTK_0 SAVESTK(20)
+#define SAVEARG_1 SAVEREG(r4, 20)
+#define SAVESTK_1 SAVESTK(24); SAVEARG_1
+#define SAVEARG_2 SAVEREG(r5, 24); SAVEARG_1
+#define SAVESTK_2 SAVESTK(28); SAVEARG_2
+#define SAVEARG_3 SAVEREG(r6, 28); SAVEARG_2
+#define SAVESTK_3 SAVESTK(32); SAVEARG_3
+#define SAVEARG_4 SAVEREG(r7, 32); SAVEARG_3
+#define SAVESTK_4 SAVESTK(36); SAVEARG_4
+#define SAVESTK_5 SAVESTK_4
+#define SAVESTK_6 SAVESTK_5
+
+#define LOADARGS_0
+#define LOADARGS_1 ldw r4, 20(sp)
+#define LOADARGS_2 LOADARGS_1; ldw r5, 24(sp)
+#define LOADARGS_3 LOADARGS_2; ldw r6, 28(sp)
+#define LOADARGS_4 LOADARGS_3; ldw r7, 32(sp)
+#define LOADARGS_5 LOADARGS_4; ldw r8, 36(sp)
+#define LOADARGS_6 LOADARGS_5; ldw r9, 40(sp)
+
+#define RESTORESTK(X) addi sp, sp, X; cfi_adjust_cfa_offset(-X)
+#define RESTORESTK_0 RESTORESTK(20)
+#define RESTORESTK_1 RESTORESTK(24)
+#define RESTORESTK_2 RESTORESTK(28)
+#define RESTORESTK_3 RESTORESTK(32)
+#define RESTORESTK_4 RESTORESTK(36)
+#define RESTORESTK_5 RESTORESTK(36)
+#define RESTORESTK_6 RESTORESTK(36)
+
+# endif
+
+# ifdef IS_IN_libpthread
+#  define CENABLE	ldw r3, %call(__pthread_enable_asynccancel)(r22)
+#  define CDISABLE	ldw r3, %call(__pthread_disable_asynccancel)(r22)
+# elif defined IS_IN_librt
+#  define CENABLE	ldw r3, %call(__librt_enable_asynccancel)(r22)
+#  define CDISABLE	ldw r3, %call(__librt_disable_asynccancel)(r22)
+# elif !defined NOT_IN_libc
+#  define CENABLE	ldw r3, %call(__libc_enable_asynccancel)(r22)
+#  define CDISABLE	ldw r3, %call(__libc_disable_asynccancel)(r22)
+# else
+#  error Unsupported library
+# endif
+
+# ifndef __ASSEMBLER__
+#  define SINGLE_THREAD_P						\
+	__builtin_expect (THREAD_GETMEM (THREAD_SELF,			\
+					 header.multiple_threads)	\
+			  == 0, 1)
+# else
+#  define SINGLE_THREAD_P(reg)						\
+	ldw reg, MULTIPLE_THREADS_OFFSET(r23)
+# endif
+
+#elif !defined __ASSEMBLER__
+
+# define SINGLE_THREAD_P 1
+# define NO_CANCELLATION 1
+
+#endif
+
+#ifndef __ASSEMBLER__
+# define RTLD_SINGLE_THREAD_P \
+  __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
+				   header.multiple_threads) == 0, 1)
+#endif
diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/arm/vfork.S b/libpthread/nptl/sysdeps/unix/sysv/linux/nios2/vfork.S
similarity index 95%
copy from libpthread/nptl/sysdeps/unix/sysv/linux/arm/vfork.S
copy to libpthread/nptl/sysdeps/unix/sysv/linux/nios2/vfork.S
index b9e8cf8..6ee414c 100644
--- a/libpthread/nptl/sysdeps/unix/sysv/linux/arm/vfork.S
+++ b/libpthread/nptl/sysdeps/unix/sysv/linux/nios2/vfork.S
@@ -35,4 +35,4 @@
 	cmp	r0, #0;			/* If we are the parent... */	\
 	strne	r3, [r2, #PID_OFFSET]	/* ... restore the saved PID.  */
 
-#include "../../../../../../../libc/sysdeps/linux/arm/vfork.S"
+#include "../../../../../../../libc/sysdeps/linux/nios2/vfork.S"
diff --git a/utils/ldd.c b/utils/ldd.c
index 5b41e2e..e7430fc 100644
--- a/utils/ldd.c
+++ b/utils/ldd.c
@@ -103,6 +103,11 @@
 #define ELFCLASSM	ELFCLASS32
 #endif
 
+#if defined(__nios2__)
+#define MATCH_MACHINE(x) (x == EM_NIOS32)
+#define ELFCLASSM	ELFCLASS32
+#endif
+
 #if defined(__powerpc__)
 #define MATCH_MACHINE(x) (x == EM_PPC)
 #define ELFCLASSM	ELFCLASS32
