[1/3] Initial PRU port

Message ID 20180613195934.11945-1-dimitar@dinux.eu
State New
Headers show
Series
  • [1/3] Initial PRU port
Related show

Commit Message

Dimitar Dimitrov June 13, 2018, 7:59 p.m.
Hi,

I would like to contribute newlib port for the TI PRU I/O processor [1] [2].

Binutils port has already been merged. I've sent patches for gcc.

The following files need to be regenerated. Let me know if I should post a separate patch for them:
 configure
 libgloss/configure
 libgloss/pru/aclocal.m4
 libgloss/pru/configure
 newlib/libc/machine/configure
 newlib/libc/machine/pru/Makefile.in
 newlib/libc/machine/pru/aclocal.m4
 newlib/libc/machine/pru/configure
 newlib/libm/machine/configure
 newlib/libm/machine/pru/Makefile.in
 newlib/libm/machine/pru/aclocal.m4
 newlib/libm/machine/pru/configure

Regards,
Dimitar

[1] http://processors.wiki.ti.com/index.php/PRU-ICSS
[2] http://beagleboard.org/pru

Signed-off-by: Dimitar Dimitrov <dimitar@dinux.eu>

---
 configure.ac                                      |   4 +
 libgloss/configure.in                             |   2 +
 libgloss/pru/Makefile.in                          | 147 ++++
 libgloss/pru/close.c                              |  24 +
 libgloss/pru/configure.in                         |  66 ++
 libgloss/pru/crt0.S                               |  84 +++
 libgloss/pru/device-specs/am335x.pru0             |   5 +
 libgloss/pru/device-specs/am335x.pru1             |   5 +
 libgloss/pru/device-specs/am437x.icss0.pru0       |   5 +
 libgloss/pru/device-specs/am437x.icss0.pru1       |   5 +
 libgloss/pru/device-specs/am437x.icss1.pru0       |   5 +
 libgloss/pru/device-specs/am437x.icss1.pru1       |   5 +
 libgloss/pru/device-specs/sim                     |   5 +
 libgloss/pru/do_global_dtors.c                    |  40 ++
 libgloss/pru/fstat.c                              |  28 +
 libgloss/pru/getpid.c                             |  24 +
 libgloss/pru/gettimeofday.c                       |  31 +
 libgloss/pru/inbyte.c                             |  38 ++
 libgloss/pru/include/pru/am335x.h                 | 772 ++++++++++++++++++++++
 libgloss/pru/include/pru/io.h                     | 124 ++++
 libgloss/pru/isatty.c                             |  26 +
 libgloss/pru/kill.c                               |  28 +
 libgloss/pru/ldscripts/gen-ld-scripts.sh          |  61 ++
 libgloss/pru/ldscripts/pruelf-am335x.pru0.x       | 201 ++++++
 libgloss/pru/ldscripts/pruelf-am335x.pru1.x       | 201 ++++++
 libgloss/pru/ldscripts/pruelf-am437x.icss0.pru0.x | 201 ++++++
 libgloss/pru/ldscripts/pruelf-am437x.icss0.pru1.x | 201 ++++++
 libgloss/pru/ldscripts/pruelf-am437x.icss1.pru0.x | 201 ++++++
 libgloss/pru/ldscripts/pruelf-am437x.icss1.pru1.x | 201 ++++++
 libgloss/pru/ldscripts/pruelf-sim.x               | 201 ++++++
 libgloss/pru/lseek.c                              |  31 +
 libgloss/pru/open.c                               |  30 +
 libgloss/pru/outbyte.c                            |  24 +
 libgloss/pru/print.c                              |  25 +
 libgloss/pru/putnum.c                             |  42 ++
 libgloss/pru/raise.c                              |  24 +
 libgloss/pru/sbrk.c                               |  46 ++
 libgloss/pru/stat.c                               |  31 +
 libgloss/pru/syscalls.S                           |  32 +
 libgloss/pru/unlink.c                             |  30 +
 newlib/configure.host                             |  14 +-
 newlib/libc/include/machine/ieeefp.h              |   4 +
 newlib/libc/include/machine/setjmp.h              |   5 +
 newlib/libc/machine/configure.in                  |   1 +
 newlib/libc/machine/pru/Makefile.am               |  16 +
 newlib/libc/machine/pru/configure.in              |  14 +
 newlib/libc/machine/pru/setjmp.s                  |  46 ++
 47 files changed, 3355 insertions(+), 1 deletion(-)
 create mode 100644 libgloss/pru/Makefile.in
 create mode 100644 libgloss/pru/close.c
 create mode 100644 libgloss/pru/configure.in
 create mode 100644 libgloss/pru/crt0.S
 create mode 100644 libgloss/pru/device-specs/am335x.pru0
 create mode 100644 libgloss/pru/device-specs/am335x.pru1
 create mode 100644 libgloss/pru/device-specs/am437x.icss0.pru0
 create mode 100644 libgloss/pru/device-specs/am437x.icss0.pru1
 create mode 100644 libgloss/pru/device-specs/am437x.icss1.pru0
 create mode 100644 libgloss/pru/device-specs/am437x.icss1.pru1
 create mode 100644 libgloss/pru/device-specs/sim
 create mode 100644 libgloss/pru/do_global_dtors.c
 create mode 100644 libgloss/pru/fstat.c
 create mode 100644 libgloss/pru/getpid.c
 create mode 100644 libgloss/pru/gettimeofday.c
 create mode 100644 libgloss/pru/inbyte.c
 create mode 100644 libgloss/pru/include/pru/am335x.h
 create mode 100644 libgloss/pru/include/pru/io.h
 create mode 100644 libgloss/pru/isatty.c
 create mode 100644 libgloss/pru/kill.c
 create mode 100755 libgloss/pru/ldscripts/gen-ld-scripts.sh
 create mode 100644 libgloss/pru/ldscripts/pruelf-am335x.pru0.x
 create mode 100644 libgloss/pru/ldscripts/pruelf-am335x.pru1.x
 create mode 100644 libgloss/pru/ldscripts/pruelf-am437x.icss0.pru0.x
 create mode 100644 libgloss/pru/ldscripts/pruelf-am437x.icss0.pru1.x
 create mode 100644 libgloss/pru/ldscripts/pruelf-am437x.icss1.pru0.x
 create mode 100644 libgloss/pru/ldscripts/pruelf-am437x.icss1.pru1.x
 create mode 100644 libgloss/pru/ldscripts/pruelf-sim.x
 create mode 100644 libgloss/pru/lseek.c
 create mode 100644 libgloss/pru/open.c
 create mode 100644 libgloss/pru/outbyte.c
 create mode 100644 libgloss/pru/print.c
 create mode 100644 libgloss/pru/putnum.c
 create mode 100644 libgloss/pru/raise.c
 create mode 100644 libgloss/pru/sbrk.c
 create mode 100644 libgloss/pru/stat.c
 create mode 100644 libgloss/pru/syscalls.S
 create mode 100644 libgloss/pru/unlink.c
 create mode 100644 newlib/libc/machine/pru/Makefile.am
 create mode 100644 newlib/libc/machine/pru/configure.in
 create mode 100644 newlib/libc/machine/pru/setjmp.s

-- 
2.11.0

Patch

diff --git a/configure.ac b/configure.ac
index 3cb95d69d..021d3645a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -697,6 +697,10 @@  case "${target}" in
   powerpc-*-aix* | rs6000-*-aix*)
     noconfigdirs="$noconfigdirs target-libssp"
     ;;
+  pru-*-*)
+    # No hosted I/O support.
+    noconfigdirs="$noconfigdirs target-libssp"
+    ;;
   rl78-*-*)
     # libssp uses a misaligned load to trigger a fault, but the RL78
     # doesn't fault for those - instead, it gives a build-time error
diff --git a/libgloss/configure.in b/libgloss/configure.in
index 6da164352..9f39e0517 100644
--- a/libgloss/configure.in
+++ b/libgloss/configure.in
@@ -175,6 +175,8 @@  case "${target}" in
 	;;
   or1k-*-* | or1knd-*-* )
 	AC_CONFIG_SUBDIRS([or1k])
+  pru-*-*)
+	AC_CONFIG_SUBDIRS([pru])
 	;;
 esac
 
diff --git a/libgloss/pru/Makefile.in b/libgloss/pru/Makefile.in
new file mode 100644
index 000000000..4baa5c387
--- /dev/null
+++ b/libgloss/pru/Makefile.in
@@ -0,0 +1,147 @@ 
+# Copyright (c) 2014-2018 Dimitar Dimitrov <dimitar@dinux.eu>
+#
+# The authors hereby grant permission to use, copy, modify, distribute,
+# and license this software and its documentation for any purpose, provided
+# that existing copyright notices are retained in all copies and that this
+# notice is included verbatim in any distributions. No written agreement,
+# license, or royalty fee is required for any of the authorized uses.
+# Modifications to this software may be copyrighted by their authors
+# and need not follow the licensing terms described here, provided that
+# the new terms are clearly indicated on the first page of each file where
+# they apply.
+
+VPATH = @srcdir@ @srcdir@/..
+
+srcdir = @srcdir@
+objdir = .
+srcroot = $(srcdir)/../..
+objroot = $(objdir)/../..
+top_srcdir = @top_srcdir@
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+host_alias = @host_alias@
+target_alias = @target_alias@
+
+bindir = @bindir@
+libdir = @libdir@
+includedir = @includedir@
+tooldir = $(exec_prefix)/$(target_alias)
+
+# Multilib support variables.
+# TOP is used instead of MULTI{BUILD,SRC}TOP.
+MULTIDIRS =
+MULTISUBDIR =
+
+SHELL =	/bin/sh
+
+mkinstalldirs = $(SHELL) $(top_srcdir)/../../mkinstalldirs
+
+CC = @CC@
+
+AS = @AS@
+
+AR = @AR@
+
+LD = @LD@
+
+RANLIB = @RANLIB@
+
+OBJDUMP = `t='$(program_transform_name)'; echo objdump | sed -e $$t`
+OBJCOPY = `t='$(program_transform_name)'; echo objcopy | sed -e $$t`
+
+# linker scripts
+SCRIPTS = `ls ${srcdir}/ldscripts/*.x`
+
+# object files needed
+OBJS = \
+	close.o do_global_dtors.o fstat.o getpid.o gettimeofday.o \
+	isatty.o kill.o lseek.o open.o putnum.o raise.o \
+	inbyte.o outbyte.o sbrk.o stat.o syscalls.o unlink.o \
+	do_global_dtors.o
+
+# Object files specific to particular targets.
+EVALOBJS = ${OBJS}
+
+CRTOBJS = crt0.o crt0-minrt.o
+OUTPUTS = libgloss.a $(CRTOBJS)
+
+INCLUDES = -I$(srcdir)/..
+
+# Note that when building the library, ${MULTILIB} is not the way multilib
+# options are passed; they're passed in $(CFLAGS).
+CFLAGS_FOR_TARGET = ${MULTILIB} ${INCLUDES}
+LDFLAGS_FOR_TARGET = ${MULTILIB}
+
+.c.o:
+	$(CC) $(CFLAGS_FOR_TARGET) -Os $(INCLUDES) -c $(CFLAGS) $<
+
+.C.o:
+	$(CC) $(CFLAGS_FOR_TARGET) -Os $(INCLUDES) -c $(CFLAGS) $<
+.s.o:
+	$(AS) $(ASFLAGS_FOR_TARGET) $(INCLUDES) $(ASFLAGS) -o $*.o $<
+
+#
+# GCC knows to run the preprocessor on .S files before it assembles them.
+#
+.S.o:
+	$(CC) $(CFLAGS_FOR_TARGET) $(INCLUDES) $(CFLAGS) -c $<
+
+all: ${OUTPUTS} copy_scripts_to_objdir
+
+copy_scripts_to_objdir: $(srcdir)/ldscripts/gen-ld-scripts.sh
+	cp $(SCRIPTS) $(objdir)
+
+#
+# here's where we build the library for each target
+#
+
+libgloss.a: $(EVALOBJS)
+	${AR} ${ARFLAGS} $@ $(EVALOBJS)
+	${RANLIB} $@
+
+# C Runtime Library startup code.
+crt0.o: $(srcdir)/crt0.S
+	$(CC) $(CFLAGS_FOR_TARGET) $(INCLUDES) $(CFLAGS) $< -c -o $@
+
+crt0-minrt.o: $(srcdir)/crt0.S
+	$(CC) $(CFLAGS_FOR_TARGET) $(INCLUDES) $(CFLAGS) -DMINRT $< -c -o $@
+
+doc:	
+
+clean mostlyclean:
+	rm -f $(OUTPUTS) *.i *~ *.o *-test *.srec *.dis *.map *.x
+
+distclean maintainer-clean realclean: clean
+	rm -f Makefile config.status $(OUTPUTS)
+
+.PHONY: install info install-info clean-info
+install: $(OUTPUTS) $(srcdir)/ldscripts/gen-ld-scripts.sh
+	for outputs in ${OUTPUTS}; do\
+	 ${INSTALL_DATA} $${outputs} ${DESTDIR}${tooldir}/lib${MULTISUBDIR}/$${outputs}; \
+	done
+	for s in $(SCRIPTS); do \
+	  b=`basename $$s`; \
+	  ${INSTALL_DATA} $$s ${DESTDIR}${tooldir}/lib${MULTISUBDIR}/$$b ;\
+	done
+	${mkinstalldirs} ${DESTDIR}${tooldir}/include/pru; \
+	for i in ${srcdir}/include/pru/*.h; do \
+	  b=`basename $$i`; \
+	  $(INSTALL_DATA) $$i $(DESTDIR)$(tooldir)/include/pru/$$b ;\
+	done
+	${mkinstalldirs} ${DESTDIR}${tooldir}/lib${MULTISUBDIR}/device-specs; \
+	for s in ${srcdir}/device-specs/*; do \
+	  b=`basename $$s`; \
+	  $(INSTALL_DATA) $$s $(DESTDIR)$(tooldir)/lib${MULTISUBDIR}/device-specs/$$b ;\
+	done
+
+info:
+install-info:
+clean-info:
+
+Makefile: $(srcdir)/Makefile.in config.status @host_makefile_frag_path@
+	$(SHELL) config.status
+
+config.status: $(srcdir)/configure
+	$(SHELL) config.status --recheck
diff --git a/libgloss/pru/close.c b/libgloss/pru/close.c
new file mode 100644
index 000000000..c1a14fbcb
--- /dev/null
+++ b/libgloss/pru/close.c
@@ -0,0 +1,24 @@ 
+/* close.c -- close a file descriptor.
+ *
+ * Copyright (c) 1995, 1999 Cygnus Support
+ *
+ * The authors hereby grant permission to use, copy, modify, distribute,
+ * and license this software and its documentation for any purpose, provided
+ * that existing copyright notices are retained in all copies and that this
+ * notice is included verbatim in any distributions. No written agreement,
+ * license, or royalty fee is required for any of the authorized uses.
+ * Modifications to this software may be copyrighted by their authors
+ * and need not follow the licensing terms described here, provided that
+ * the new terms are clearly indicated on the first page of each file where
+ * they apply.
+ */
+#include "glue.h"
+
+/*
+ * close -- We don't need to do anything, but pretend we did.
+ */
+int
+_close (int fd)
+{
+  return (0);
+}
diff --git a/libgloss/pru/configure.in b/libgloss/pru/configure.in
new file mode 100644
index 000000000..2a4c946e8
--- /dev/null
+++ b/libgloss/pru/configure.in
@@ -0,0 +1,66 @@ 
+# Copyright (c) 2008, 2009, 2011, 2013 Red Hat, Inc. All rights reserved.
+#
+# This copyrighted material is made available to anyone wishing to use, modify,
+# copy, or redistribute it subject to the terms and conditions of the BSD
+# License.   This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY expressed or implied, including the implied warranties
+# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  A copy of this license
+# is available at http://www.opensource.org/licenses. Any Red Hat trademarks that
+# are incorporated in the source code or documentation are not subject to the BSD
+# License and may only be used or replicated with the express permission of
+# Red Hat, Inc.
+
+dnl Process this file with autoconf to produce a configure script.
+AC_PREREQ(2.59)
+AC_INIT(crt0.S)
+
+if test "${enable_shared}" = "yes" ; then
+    echo "Shared libraries not supported for cross compiling, ignored"
+fi
+
+if test "$srcdir" = "." ; then
+  if test "${with_target_subdir}" != "." ; then
+    libgloss_topdir="${srcdir}/${with_multisrctop}../../.."
+  else
+    libgloss_topdir="${srcdir}/${with_multisrctop}../.."
+  fi
+else
+  libgloss_topdir="${srcdir}/../.."
+fi
+AC_CONFIG_AUX_DIR($libgloss_topdir)
+
+AC_CANONICAL_SYSTEM
+AC_ARG_PROGRAM
+
+AC_PROG_INSTALL
+
+LIB_AC_PROG_CC
+AS=${AS-as}
+AC_SUBST(AS)
+AR=${AR-ar}
+AC_SUBST(AR)
+LD=${LD-ld}
+AC_SUBST(LD)
+AC_PROG_RANLIB
+LIB_AM_PROG_AS
+
+host_makefile_frag=${srcdir}/../config/default.mh
+
+dnl We have to assign the same value to other variables because autoconf
+dnl doesn't provide a mechanism to substitute a replacement keyword with
+dnl arbitrary data or pathnames.
+dnl
+host_makefile_frag_path=$host_makefile_frag
+AC_SUBST(host_makefile_frag_path)
+AC_SUBST_FILE(host_makefile_frag)
+
+AC_CONFIG_FILES(Makefile,
+. ${libgloss_topdir}/config-ml.in,
+srcdir=${srcdir}
+target=${target}
+with_multisubdir=${with_multisubdir}
+ac_configure_args="${ac_configure_args} --enable-multilib"
+CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+libgloss_topdir=${libgloss_topdir}
+)
+AC_OUTPUT
diff --git a/libgloss/pru/crt0.S b/libgloss/pru/crt0.S
new file mode 100644
index 000000000..dc4def820
--- /dev/null
+++ b/libgloss/pru/crt0.S
@@ -0,0 +1,84 @@ 
+/* crt0.S -- PRU startup code
+ *
+ * Copyright (c) 2014-2018 Dimitar Dimitrov <dimitar@dinux.eu>
+ *
+ * The authors hereby grant permission to use, copy, modify, distribute,
+ * and license this software and its documentation for any purpose, provided
+ * that existing copyright notices are retained in all copies and that this
+ * notice is included verbatim in any distributions. No written agreement,
+ * license, or royalty fee is required for any of the authorized uses.
+ * Modifications to this software may be copyrighted by their authors
+ * and need not follow the licensing terms described here, provided that
+ * the new terms are clearly indicated on the first page of each file where
+ * they apply.
+ */
+#include "newlib.h"
+
+	.extern	main
+	.extern	exit
+
+	.text
+	.section .init0, "x"
+	.global	_start
+_start:
+	/* Initialize stack pointer. */
+	ldi32	sp, _stack_top
+
+	/* DATA and BSS are handled by the loader, so nothing to do here. */
+
+#if !defined(MINRT)
+	.extern _do_global_dtors
+	/* Ensure destructors get called.  Call is per GNU ABI (i.e. 32-bit
+	   function pointers).  But it is also compatible with the TI ABI
+	   since GCC supports only little endian PRU.
+
+	   WARNING:  Keep this compatible with both ABIs!  */
+	ldi	r14, %pmem(_do_global_dtors)
+	call	atexit
+
+	/* Call constructors. Use non-call-clobbered registers. */
+	ldi	r5, __init_array_begin
+	ldi	r6, __init_array_end
+ctors_loop:
+	qbeq	ctors_done, r5, r6
+	/* ABI dictates 16-bit IMEM pointers. */
+	lbbo	r7, r5, 0, 2
+	call	r7.w0
+	add	r5, r5, 2
+	jmp	ctors_loop
+ctors_done:
+#endif
+
+	/* Just in case main() tries to access argc, argv[] and envp. */
+	zero	r14, 3 * 4
+
+#if !defined(MINRT)
+	.weak __c_args__
+	ldi32	r5, __c_args__
+	qbeq	__skip_c_args, r5, 0
+	lbbo	r14, r5, 0, 4	/* argc */
+	add	r15, r5, 4	/* argv */
+__skip_c_args:
+#endif
+
+	/* Call main */
+	call	main
+
+#if !defined(MINRT)
+	/* Call exit */
+	call	exit
+#endif
+
+	/* We should never reach here. */
+_crt_exit:
+	halt
+	jmp	_crt_exit
+
+	/* PRU obviously has no shared libraries, but dso_handle
+	   helps to achieve better GCC test coverage. Besides,
+	   it should be free with minrt. */
+	.section .data
+	.global __dso_handle
+	.weak __dso_handle
+__dso_handle:
+	.long	0
diff --git a/libgloss/pru/device-specs/am335x.pru0 b/libgloss/pru/device-specs/am335x.pru0
new file mode 100644
index 000000000..0594be488
--- /dev/null
+++ b/libgloss/pru/device-specs/am335x.pru0
@@ -0,0 +1,5 @@ 
+*cpp_device:
+-D__AM335X_PRU0__ -D__AM335X_
+
+*link_device:
+%{!r:-Tpruelf-am335x.pru0.x}
diff --git a/libgloss/pru/device-specs/am335x.pru1 b/libgloss/pru/device-specs/am335x.pru1
new file mode 100644
index 000000000..d5cdb34fd
--- /dev/null
+++ b/libgloss/pru/device-specs/am335x.pru1
@@ -0,0 +1,5 @@ 
+*cpp_device:
+-D__AM335X_PRU1__ -D__AM335X_
+
+*link_device:
+%{!r:-Tpruelf-am335x.pru1.x}
diff --git a/libgloss/pru/device-specs/am437x.icss0.pru0 b/libgloss/pru/device-specs/am437x.icss0.pru0
new file mode 100644
index 000000000..67f244372
--- /dev/null
+++ b/libgloss/pru/device-specs/am437x.icss0.pru0
@@ -0,0 +1,5 @@ 
+*cpp_device:
+-D__AM437X_ICSS0_PRU0__ -D__AM437X_ICSS0__ -D__AM437X__
+
+*link_device:
+%{!r:-Tpruelf-am437x.icss0.pru0.x}
diff --git a/libgloss/pru/device-specs/am437x.icss0.pru1 b/libgloss/pru/device-specs/am437x.icss0.pru1
new file mode 100644
index 000000000..5ff978c7e
--- /dev/null
+++ b/libgloss/pru/device-specs/am437x.icss0.pru1
@@ -0,0 +1,5 @@ 
+*cpp_device:
+-D__AM437X_ICSS0_PRU1__ -D__AM437X_ICSS0__ -D__AM437X__
+
+*link_device:
+%{!r:-Tpruelf-am437x.icss0.pru1.x}
diff --git a/libgloss/pru/device-specs/am437x.icss1.pru0 b/libgloss/pru/device-specs/am437x.icss1.pru0
new file mode 100644
index 000000000..eb0f7f450
--- /dev/null
+++ b/libgloss/pru/device-specs/am437x.icss1.pru0
@@ -0,0 +1,5 @@ 
+*cpp_device:
+-D__AM437X_ICSS1_PRU0__ -D__AM437X_ICSS1__ -D__AM437X__
+
+*link_device:
+%{!r:-Tpruelf-am437x.icss1.pru0.x}
diff --git a/libgloss/pru/device-specs/am437x.icss1.pru1 b/libgloss/pru/device-specs/am437x.icss1.pru1
new file mode 100644
index 000000000..692f8f689
--- /dev/null
+++ b/libgloss/pru/device-specs/am437x.icss1.pru1
@@ -0,0 +1,5 @@ 
+*cpp_device:
+-D__AM437X_ICSS1_PRU1__ -D__AM437X_ICSS1__ -D__AM437X__
+
+*link_device:
+%{!r:-Tpruelf-am437x.icss1.pru1.x}
diff --git a/libgloss/pru/device-specs/sim b/libgloss/pru/device-specs/sim
new file mode 100644
index 000000000..50d4689e0
--- /dev/null
+++ b/libgloss/pru/device-specs/sim
@@ -0,0 +1,5 @@ 
+*cpp_device:
+-D__SIM__
+
+*link_device:
+%{!r:-Tpruelf-sim.x}
diff --git a/libgloss/pru/do_global_dtors.c b/libgloss/pru/do_global_dtors.c
new file mode 100644
index 000000000..4d1621147
--- /dev/null
+++ b/libgloss/pru/do_global_dtors.c
@@ -0,0 +1,40 @@ 
+/* do_global_dtors - invoke global destructors
+ *
+ * Copyright (c) 2015-2018 Dimitar Dimitrov <dimitar@dinux.eu>
+ *
+ * The authors hereby grant permission to use, copy, modify, distribute,
+ * and license this software and its documentation for any purpose, provided
+ * that existing copyright notices are retained in all copies and that this
+ * notice is included verbatim in any distributions. No written agreement,
+ * license, or royalty fee is required for any of the authorized uses.
+ * Modifications to this software may be copyrighted by their authors
+ * and need not follow the licensing terms described here, provided that
+ * the new terms are clearly indicated on the first page of each file where
+ * they apply.
+ */
+#include <stdint.h>
+#include <_ansi.h>
+#include "syscall.h"
+
+extern void *__fini_array_begin;
+extern void *__fini_array_end;
+
+/*
+ * _do_global_dtors
+ */
+void
+_do_global_dtors (void)
+{
+    /* ABI dictates pointers in init/fini arrays are 16-bit.  */
+    const uint16_t *end = (uint16_t *)&__fini_array_end;
+    const uint16_t *begin = (uint16_t *)&__fini_array_begin;
+    const uint16_t *p;
+    void (**dtor) (void);
+
+    /* call destructors in reverse order */
+    for (p = end; p > begin; ) {
+	p--;
+	dtor = (void *)p;
+	(*dtor) ();
+    }
+}
diff --git a/libgloss/pru/fstat.c b/libgloss/pru/fstat.c
new file mode 100644
index 000000000..7e562c3f6
--- /dev/null
+++ b/libgloss/pru/fstat.c
@@ -0,0 +1,28 @@ 
+/* fstat.c -- get status of a file.
+ *
+ * Copyright (c) 1995, 1999 Cygnus Support
+ *
+ * The authors hereby grant permission to use, copy, modify, distribute,
+ * and license this software and its documentation for any purpose, provided
+ * that existing copyright notices are retained in all copies and that this
+ * notice is included verbatim in any distributions. No written agreement,
+ * license, or royalty fee is required for any of the authorized uses.
+ * Modifications to this software may be copyrighted by their authors
+ * and need not follow the licensing terms described here, provided that
+ * the new terms are clearly indicated on the first page of each file where
+ * they apply.
+ */
+#include <sys/stat.h>
+#include "glue.h"
+
+/*
+ * fstat -- Since we have no file system, we just return an error.
+ */
+int
+_fstat (int fd, struct stat *buf)
+{
+  buf->st_mode = S_IFCHR;	/* Always pretend to be a tty */
+  buf->st_blksize = 0;
+
+  return (0);
+}
diff --git a/libgloss/pru/getpid.c b/libgloss/pru/getpid.c
new file mode 100644
index 000000000..cc9e85749
--- /dev/null
+++ b/libgloss/pru/getpid.c
@@ -0,0 +1,24 @@ 
+/* getpid.c -- get the current process id.
+ *
+ * Copyright (c) 1995, 1999 Cygnus Support
+ *
+ * The authors hereby grant permission to use, copy, modify, distribute,
+ * and license this software and its documentation for any purpose, provided
+ * that existing copyright notices are retained in all copies and that this
+ * notice is included verbatim in any distributions. No written agreement,
+ * license, or royalty fee is required for any of the authorized uses.
+ * Modifications to this software may be copyrighted by their authors
+ * and need not follow the licensing terms described here, provided that
+ * the new terms are clearly indicated on the first page of each file where
+ * they apply.
+ */
+#include "glue.h"
+
+/*
+ * getpid -- only one process, so just return 1.
+ */
+int
+_getpid (void)
+{
+  return __MYPID;
+}
diff --git a/libgloss/pru/gettimeofday.c b/libgloss/pru/gettimeofday.c
new file mode 100644
index 000000000..b4b7cb078
--- /dev/null
+++ b/libgloss/pru/gettimeofday.c
@@ -0,0 +1,31 @@ 
+/* gettimeofday.c -- get the current time of day
+ *
+ * Copyright (c) 1995, 1999 Cygnus Support
+ *
+ * The authors hereby grant permission to use, copy, modify, distribute,
+ * and license this software and its documentation for any purpose, provided
+ * that existing copyright notices are retained in all copies and that this
+ * notice is included verbatim in any distributions. No written agreement,
+ * license, or royalty fee is required for any of the authorized uses.
+ * Modifications to this software may be copyrighted by their authors
+ * and need not follow the licensing terms described here, provided that
+ * the new terms are clearly indicated on the first page of each file where
+ * they apply.
+ */
+#include <errno.h>
+#include "glue.h"
+
+#undef errno
+extern int errno;
+struct timeval;
+
+/*
+ * gettimeofday -- no clock
+ * struct timeval * tp, void * tzvp
+ */
+int
+_gettimeofday (struct timeval * tp, void * tzvp)
+{
+    errno = ENOSYS;
+    return -1;
+}
diff --git a/libgloss/pru/inbyte.c b/libgloss/pru/inbyte.c
new file mode 100644
index 000000000..2ea885216
--- /dev/null
+++ b/libgloss/pru/inbyte.c
@@ -0,0 +1,38 @@ 
+/* inbyte.c -- inbyte function for remoteproc
+ *
+ * Copyright (c) 2014-2018 Dimitar Dimitrov <dimitar@dinux.eu>
+ *
+ * The authors hereby grant permission to use, copy, modify, distribute,
+ * and license this software and its documentation for any purpose, provided
+ * that existing copyright notices are retained in all copies and that this
+ * notice is included verbatim in any distributions. No written agreement,
+ * license, or royalty fee is required for any of the authorized uses.
+ * Modifications to this software may be copyrighted by their authors
+ * and need not follow the licensing terms described here, provided that
+ * the new terms are clearly indicated on the first page of each file where
+ * they apply.
+ */
+#include <errno.h>
+#include <_ansi.h>
+#include <stdio.h>
+#include <unistd.h>
+#include "glue.h"
+
+extern ssize_t _read(int fd, void *b, size_t count);
+
+int
+inbyte (void)
+{
+  ssize_t n;
+  char c;
+
+  /* PRU has no interrupts, so it is inherently thread-safe. */
+  n = _read(STDIN_FILENO, &c, 1);
+  if (n < 0)
+    return n;
+  else if (n == 0)
+    return -ENODATA;
+  else
+    return 1;
+}
+
diff --git a/libgloss/pru/include/pru/am335x.h b/libgloss/pru/include/pru/am335x.h
new file mode 100644
index 000000000..a594f359e
--- /dev/null
+++ b/libgloss/pru/include/pru/am335x.h
@@ -0,0 +1,772 @@ 
+/* pru/am335x.h -- PRU I/O registers definitions for PRU inside AM335x SoCs
+
+   Copyright (c) 2015-2018 Dimitar Dimitrov <dimitar@dinux.eu>
+   All rights reserved.
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following condition
+   is met:
+
+   1. Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+   FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+   COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+   INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+   SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+   STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+   OF THE POSSIBILITY OF SUCH DAMAGE.
+   */
+
+#ifndef __PRU_AM335X_H__
+#define __PRU_AM335X_H__
+
+
+/* Local memory map (TRM section 4.3.2.1) */
+#define __LOCAL_DATA_RAM_BASE		0x00000000
+#define __PEER_DATA_RAM_BASE		0x00002000
+#define __SHARED_DATA_RAM_BASE		0x00010000
+#define __INTC_BASE			0x00020000
+#define __PRU0_CTRL_REGS_BASE		0x00022000
+#define __PRU1_CTRL_REGS_BASE		0x00024000
+#define __CFG_BASE			0x00026000
+#define __UART0_BASE			0x00028000
+#define __IEP_BASE			0x0002E000
+#define __ECAP0_BASE			0x00030000
+#define __MII_RT_CFG_BASE		0x00032000
+#define __MII_MDIO_BASE			0x00034000
+#define __SYS_OCP_HP0_BASE		0x00080000
+
+/* ====================== CTABLE base addresses ====================== */
+#pragma ctable_entry 0 0x00020000
+#pragma ctable_entry 1 0x48040000
+#pragma ctable_entry 2 0x4802a000
+#pragma ctable_entry 3 0x00030000
+#pragma ctable_entry 4 0x00026000
+#pragma ctable_entry 5 0x48060000
+#pragma ctable_entry 6 0x48030000
+#pragma ctable_entry 7 0x00028000
+#pragma ctable_entry 8 0x46000000
+#pragma ctable_entry 9 0x4a100000
+#pragma ctable_entry 10 0x48318000
+#pragma ctable_entry 11 0x48022000
+#pragma ctable_entry 12 0x48024000
+#pragma ctable_entry 13 0x48318000
+#pragma ctable_entry 14 0x481cc000
+#pragma ctable_entry 15 0x481d0000
+#pragma ctable_entry 16 0x481a0000
+#pragma ctable_entry 17 0x4819c000
+#pragma ctable_entry 18 0x48300000
+#pragma ctable_entry 19 0x48302000
+#pragma ctable_entry 20 0x48304000
+#pragma ctable_entry 21 0x00032400
+#pragma ctable_entry 22 0x480c8000
+#pragma ctable_entry 23 0x480ca000
+/* 24-31 are user-defined base addresses. */
+
+/* ====================== PRU CTRL module ====================== */
+#define PRU_CTRL_CONTROL_OFFS		0x00
+#define PRU_CTRL_STATUS_OFFS		0x04
+#define PRU_CTRL_WAKEUP_EN_OFFS		0x08
+#define PRU_CTRL_CYCLE_OFFS		0x0c
+#define PRU_CTRL_STALL_OFFS		0x10
+#define PRU_CTRL_CTBIR0_OFFS		0x20
+#define PRU_CTRL_CTBIR1_OFFS		0x24
+#define PRU_CTRL_CPPR0_OFFS		0x28
+#define PRU_CTRL_CPPR1_OFFS		0x2c
+
+struct __PRU_CONTROL_S {
+	const volatile unsigned int SOFT_RST_N		: 1;
+	volatile unsigned int ENABLE			: 1;
+	volatile unsigned int SLEEPING			: 1;
+	volatile unsigned int COUNTER_ENABLE		: 1;
+	volatile unsigned int __reserved_1		: 4;
+	volatile unsigned int SINGLE_STEP		: 1;
+	volatile unsigned int __reserved_2		: 5;
+	const volatile unsigned int __reserved_3	: 1;
+	const volatile unsigned int RUNSTATE		: 1;
+	volatile unsigned int PCOUNTER_RST_VAL		: 16;
+};
+
+struct __PRU_STATUS_S {
+	volatile unsigned int PCOUNTER			: 16;
+	volatile unsigned int __reserved_1		: 16;
+};
+
+struct __PRU_CTBIR0_S {
+	volatile unsigned int C24_BLK_INDEX		: 8;
+	volatile unsigned int __reserved_1		: 8;
+	volatile unsigned int C25_BLK_INDEX		: 8;
+	volatile unsigned int __reserved_2		: 8;
+};
+
+struct __PRU_CTBIR1_S {
+	volatile unsigned int C26_BLK_INDEX		: 8;
+	volatile unsigned int __reserved_1		: 8;
+	volatile unsigned int C27_BLK_INDEX		: 8;
+	volatile unsigned int __reserved_2		: 8;
+};
+
+struct __PRU_CTPPR0_S {
+	volatile unsigned int C28_POINTER		: 16;
+	volatile unsigned int C29_POINTER		: 16;
+};
+
+struct __PRU_CTPPR1_S {
+	volatile unsigned int C30_POINTER		: 16;
+	volatile unsigned int C31_POINTER		: 16;
+};
+
+struct __PRU_CTRL {
+	union {
+		volatile unsigned int CONTROL;
+		struct __PRU_CONTROL_S CONTROL_bit;
+	};
+	union {
+		volatile unsigned int STATUS;
+		struct __PRU_STATUS_S STATUS_bit;
+	};
+	volatile unsigned int WAKEUP_EN;
+	volatile unsigned int CYCLE;
+	volatile unsigned int STALL;
+	volatile unsigned int __gap1[3];
+	union {
+		volatile unsigned int CTBIR0;
+		struct __PRU_CTBIR0_S CTBIR0_bit;
+	};
+	union {
+		volatile unsigned int CTBIR1;
+		struct __PRU_CTBIR1_S CTBIR1_bit;
+	};
+	union {
+		volatile unsigned int CTPPR0;
+		struct __PRU_CTPPR0_S CTPPR0_bit;
+	};
+	union {
+		volatile unsigned int CTPPR1;
+		struct __PRU_CTPPR1_S CTPPR1_bit;
+	};
+};
+
+#define PRU0_CTRL	(*((struct __PRU_CTRL *)__PRU0_CTRL_REGS_BASE))
+#define PRU1_CTRL	(*((struct __PRU_CTRL *)__PRU1_CTRL_REGS_BASE))
+
+#if defined(__AM335X_PRU0__)
+  #define PRU_CTRL	PRU0_CTRL
+#elif defined(__AM335X_PRU1__)
+  #define PRU_CTRL	PRU1_CTRL
+#else
+  #error "Unrecognized AM335x PRU core - check your -mmcu option"
+#endif
+
+
+
+/* ====================== PRU INTC module ====================== */
+#define PRU_INTC_REVID_OFFS		0x00
+#define PRU_INTC_CR_OFFS		0x04
+#define PRU_INTC_GER_OFFS		0x10
+#define PRU_INTC_GNLR_OFFS		0x1C
+#define PRU_INTC_SISR_OFFS		0x20
+#define PRU_INTC_SICR_OFFS		0x24
+#define PRU_INTC_EISR_OFFS		0x28
+#define PRU_INTC_EICR_OFFS		0x2c
+#define PRU_INTC_HIEISR_OFFS		0x34
+#define PRU_INTC_HIDISR_OFFS		0x38
+#define PRU_INTC_GPIR_OFFS		0x80
+#define PRU_INTC_SRSR0_OFFS		0x200
+#define PRU_INTC_SRSR1_OFFS		0x204
+#define PRU_INTC_SECR0_OFFS		0x280
+#define PRU_INTC_SECR1_OFFS		0x284
+#define PRU_INTC_ESR0_OFFS		0x300
+#define PRU_INTC_ESR1_OFFS		0x304
+#define PRU_INTC_ECR0_OFFS		0x380
+#define PRU_INTC_ECR1_OFFS		0x384
+#define PRU_INTC_CMR0_OFFS		0x400
+#define PRU_INTC_CMR1_OFFS		0x404
+#define PRU_INTC_CMR2_OFFS		0x408
+#define PRU_INTC_CMR3_OFFS		0x40c
+#define PRU_INTC_CMR4_OFFS		0x410
+#define PRU_INTC_CMR5_OFFS		0x414
+#define PRU_INTC_CMR6_OFFS		0x418
+#define PRU_INTC_CMR7_OFFS		0x41c
+#define PRU_INTC_CMR8_OFFS		0x420
+#define PRU_INTC_CMR9_OFFS		0x424
+#define PRU_INTC_CMR10_OFFS		0x428
+#define PRU_INTC_CMR11_OFFS		0x42c
+#define PRU_INTC_CMR12_OFFS		0x430
+#define PRU_INTC_CMR13_OFFS		0x434
+#define PRU_INTC_CMR14_OFFS		0x438
+#define PRU_INTC_CMR15_OFFS		0x43c
+#define PRU_INTC_HMR0_OFFS		0x800
+#define PRU_INTC_HMR1_OFFS		0x804
+#define PRU_INTC_HMR2_OFFS		0x808
+#define PRU_INTC_HIPIR0_OFFS		0x900
+#define PRU_INTC_HIPIR1_OFFS		0x904
+#define PRU_INTC_HIPIR2_OFFS		0x908
+#define PRU_INTC_HIPIR3_OFFS		0x90c
+#define PRU_INTC_HIPIR4_OFFS		0x910
+#define PRU_INTC_HIPIR5_OFFS		0x914
+#define PRU_INTC_HIPIR6_OFFS		0x918
+#define PRU_INTC_HIPIR7_OFFS		0x91c
+#define PRU_INTC_HIPIR8_OFFS		0x920
+#define PRU_INTC_HIPIR9_OFFS		0x924
+#define PRU_INTC_SIPR0_OFFS		0xd00
+#define PRU_INTC_SIPR1_OFFS		0xd04
+#define PRU_INTC_SITR0_OFFS		0xd80
+#define PRU_INTC_SITR1_OFFS		0xd84
+#define PRU_INTC_HINLR0_OFFS		0x1100
+#define PRU_INTC_HINLR1_OFFS		0x1104
+#define PRU_INTC_HINLR2_OFFS		0x1108
+#define PRU_INTC_HINLR3_OFFS		0x110c
+#define PRU_INTC_HINLR4_OFFS		0x1110
+#define PRU_INTC_HINLR5_OFFS		0x1114
+#define PRU_INTC_HINLR6_OFFS		0x1118
+#define PRU_INTC_HINLR7_OFFS		0x111c
+#define PRU_INTC_HINLR8_OFFS		0x1120
+#define PRU_INTC_HINLR9_OFFS		0x1124
+#define PRU_INTC_HIER_OFFS		0x1500
+
+
+struct __PRU_INTC_REVID_S {
+	const volatile unsigned int REV_MINOR		: 6;
+	const volatile unsigned int REV_CUSTOM		: 2;
+	const volatile unsigned int REV_MAJOR		: 3;
+	const volatile unsigned int REV_RTL		: 5;
+	const volatile unsigned int REV_MODULE		: 12;
+	const volatile unsigned int __reserved_1	: 2;
+	const volatile unsigned int REV_SCHEME		: 2;
+};
+
+
+struct __PRU_INTC_CR_S {
+	volatile unsigned int __reserved_1		: 2;
+	volatile unsigned int NEST_MODE			: 2;
+	volatile unsigned int __reserved_2		: 28;
+};
+
+
+struct __PRU_INTC_GER_S {
+	volatile unsigned int ENABLE_HINT_ANY		: 1;
+	volatile unsigned int __reserved_2		: 30;
+};
+
+
+struct __PRU_INTC_GNLR_S {
+	volatile unsigned int GLB_NEST_LEVEL		: 9;
+	volatile unsigned int __reserved_1		: 22;
+	volatile unsigned int AUTO_OVERRIDE		: 1;
+};
+
+
+struct __PRU_INTC_SISR_S {
+	volatile unsigned int STATUS_SET_INDEX		: 10;
+	volatile unsigned int __reserved_1		: 22;
+};
+
+
+struct __PRU_INTC_SICR_S {
+	volatile unsigned int STATUS_CLR_INDEX		: 10;
+	volatile unsigned int __reserved_1		: 22;
+};
+
+
+struct __PRU_INTC_EISR_S {
+	volatile unsigned int STATUS_SET_INDEX		: 10;
+	volatile unsigned int __reserved_1		: 22;
+};
+
+
+struct __PRU_INTC_EICR_S {
+	volatile unsigned int STATUS_CLR_INDEX		: 10;
+	volatile unsigned int __reserved_1		: 22;
+};
+
+
+struct __PRU_INTC_HIEISR_S {
+	volatile unsigned int HINT_ENABLE_SET_INDEX	: 10;
+	volatile unsigned int __reserved_1		: 22;
+};
+
+
+struct __PRU_INTC_HIDISR_S {
+	volatile unsigned int HINT_ENABLE_CLR_INDEX	: 10;
+	volatile unsigned int __reserved_1		: 22;
+};
+
+struct __PRU_INTC_GPIR_S {
+	volatile unsigned int GLB_PRI_INTR		: 10;
+	volatile unsigned int __reserved_1		: 21;
+	volatile unsigned int GLB_NONE			: 1;
+};
+
+
+
+struct __PRU_INTC_CMR_S {
+	volatile unsigned int CH_MAP			: 4;
+	volatile unsigned int __reserved_1		: 4;
+} __attribute__((packed));
+
+
+struct __PRU_INTC_HMR_S {
+	volatile unsigned int HINT_MAP			: 4;
+	volatile unsigned int __reserved_1		: 4;
+} __attribute__((packed));
+
+
+struct __PRU_INTC_HIPIR_S {
+	volatile unsigned int PRI_HINT			: 10;
+	volatile unsigned int __reserved_1		: 21;
+	volatile unsigned int NONE_HINT			: 1;
+};
+
+
+struct __PRU_INTC_HINLR_S {
+	volatile unsigned int AUTO_OVERRIDE		: 10;
+	volatile unsigned int __reserved_1		: 21;
+	volatile unsigned int NEST_HINT			: 1;
+};
+
+struct __PRU_INTC_HIER_S {
+	volatile unsigned int ENABLE_HINT		: 10;
+	volatile unsigned int __reserved_1		: 22;
+};
+
+struct __PRU_INTC {
+	union {
+		const volatile unsigned int REVID;
+		struct __PRU_INTC_REVID_S REVID_bit;
+	};
+	union {
+		volatile unsigned int CR;
+		struct __PRU_INTC_CR_S CR_bit;
+	};
+	unsigned int __gap1[2];
+	union {
+		volatile unsigned int GER;
+		struct __PRU_INTC_GER_S GER_bit;
+	};
+	unsigned int __gap2[2];
+	union {
+		volatile unsigned int GNLR;
+		struct __PRU_INTC_GNLR_S GNLR_bit;
+	};
+	union {
+		volatile unsigned int SISR;
+		struct __PRU_INTC_SISR_S SISR_bit;
+	};
+	union {
+		volatile unsigned int SICR;
+		struct __PRU_INTC_SICR_S SICR_bit;
+	};
+	union {
+		volatile unsigned int EISR;
+		struct __PRU_INTC_EISR_S EISR_bit;
+	};
+	union {
+		volatile unsigned int EICR;
+		struct __PRU_INTC_EICR_S EICR_bit;
+	};
+	unsigned int __gap3[1];
+	union {
+		volatile unsigned int HIEISR;
+		struct __PRU_INTC_HIEISR_S HIEISR_bit;
+	};
+	union {
+		volatile unsigned int HIDISR;
+		struct __PRU_INTC_HIEISR_S HIDISR_bit;
+	};
+	unsigned int __gap4[17];
+	union {
+		volatile unsigned int GPIR;
+		struct __PRU_INTC_GPIR_S GPIR_bit;
+	};
+	unsigned int __gap5[95];
+	volatile unsigned int SPSR0;
+	volatile unsigned int SPSR1;
+	unsigned int __gap6[30];
+	volatile unsigned int SECR0;
+	volatile unsigned int SECR1;
+	unsigned int __gap7[30];
+	volatile unsigned int ESR0;
+	volatile unsigned int ESR1;
+	unsigned int __gap8[30];
+	volatile unsigned int ECR0;
+	volatile unsigned int ECR1;
+	unsigned int __gap9[30];
+	union {
+		volatile unsigned int CMR0;
+		struct __PRU_INTC_CMR_S CMR0_bit;
+	};
+	union {
+		volatile unsigned int CMR1;
+		struct __PRU_INTC_CMR_S CMR1_bit;
+	};
+	union {
+		volatile unsigned int CMR2;
+		struct __PRU_INTC_CMR_S CMR2_bit;
+	};
+	union {
+		volatile unsigned int CMR3;
+		struct __PRU_INTC_CMR_S CMR3_bit;
+	};
+	union {
+		volatile unsigned int CMR4;
+		struct __PRU_INTC_CMR_S CMR4_bit;
+	};
+	union {
+		volatile unsigned int CMR5;
+		struct __PRU_INTC_CMR_S CMR5_bit;
+	};
+	union {
+		volatile unsigned int CMR6;
+		struct __PRU_INTC_CMR_S CMR6_bit;
+	};
+	union {
+		volatile unsigned int CMR7;
+		struct __PRU_INTC_CMR_S CMR7_bit;
+	};
+	union {
+		volatile unsigned int CMR8;
+		struct __PRU_INTC_CMR_S CMR8_bit;
+	};
+	union {
+		volatile unsigned int CMR9;
+		struct __PRU_INTC_CMR_S CMR9_bit;
+	};
+	union {
+		volatile unsigned int CMR10;
+		struct __PRU_INTC_CMR_S CMR10_bit;
+	};
+	union {
+		volatile unsigned int CMR11;
+		struct __PRU_INTC_CMR_S CMR11_bit;
+	};
+	union {
+		volatile unsigned int CMR12;
+		struct __PRU_INTC_CMR_S CMR12_bit;
+	};
+	union {
+		volatile unsigned int CMR13;
+		struct __PRU_INTC_CMR_S CMR13_bit;
+	};
+	union {
+		volatile unsigned int CMR14;
+		struct __PRU_INTC_CMR_S CMR14_bit;
+	};
+	union {
+		volatile unsigned int CMR15;
+		struct __PRU_INTC_CMR_S CMR15_bit;
+	};
+	unsigned int __gap10[240];
+	union {
+		volatile unsigned int HMR0;
+		struct __PRU_INTC_HMR_S HMR0_bit;
+	};
+	union {
+		volatile unsigned int HMR1;
+		struct __PRU_INTC_HMR_S HMR1_bit;
+	};
+	union {
+		volatile unsigned int HMR2;
+		struct __PRU_INTC_HMR_S HMR2_bit;
+	};
+	unsigned int __gap11[61];
+	union {
+		volatile unsigned int HIPIR0;
+		struct __PRU_INTC_HIPIR_S HIPIR0_bit;
+	};
+	union {
+		volatile unsigned int HIPIR1;
+		struct __PRU_INTC_HIPIR_S HIPIR1_bit;
+	};
+	union {
+		volatile unsigned int HIPIR2;
+		struct __PRU_INTC_HIPIR_S HIPIR2_bit;
+	};
+	union {
+		volatile unsigned int HIPIR3;
+		struct __PRU_INTC_HIPIR_S HIPIR3_bit;
+	};
+	union {
+		volatile unsigned int HIPIR4;
+		struct __PRU_INTC_HIPIR_S HIPIR4_bit;
+	};
+	union {
+		volatile unsigned int HIPIR5;
+		struct __PRU_INTC_HIPIR_S HIPIR5_bit;
+	};
+	union {
+		volatile unsigned int HIPIR6;
+		struct __PRU_INTC_HIPIR_S HIPIR6_bit;
+	};
+	union {
+		volatile unsigned int HIPIR7;
+		struct __PRU_INTC_HIPIR_S HIPIR7_bit;
+	};
+	union {
+		volatile unsigned int HIPIR8;
+		struct __PRU_INTC_HIPIR_S HIPIR8_bit;
+	};
+	union {
+		volatile unsigned int HIPIR9;
+		struct __PRU_INTC_HIPIR_S HIPIR9_bit;
+	};
+	unsigned int __gap12[246];
+	volatile unsigned int SIPR0;
+	volatile unsigned int SIPR1;
+	unsigned int __gap13[30];
+	volatile unsigned int SITR0;
+	volatile unsigned int SITR1;
+	unsigned int __gap14[222];
+	union {
+		volatile unsigned int HINLR0;
+		struct __PRU_INTC_HINLR_S HINLR0_bit;
+	};
+	union {
+		volatile unsigned int HINLR1;
+		struct __PRU_INTC_HINLR_S HINLR1_bit;
+	};
+	union {
+		volatile unsigned int HINLR2;
+		struct __PRU_INTC_HINLR_S HINLR2_bit;
+	};
+	union {
+		volatile unsigned int HINLR3;
+		struct __PRU_INTC_HINLR_S HINLR3_bit;
+	};
+	union {
+		volatile unsigned int HINLR4;
+		struct __PRU_INTC_HINLR_S HINLR4_bit;
+	};
+	union {
+		volatile unsigned int HINLR5;
+		struct __PRU_INTC_HINLR_S HINLR5_bit;
+	};
+	union {
+		volatile unsigned int HINLR6;
+		struct __PRU_INTC_HINLR_S HINLR6_bit;
+	};
+	union {
+		volatile unsigned int HINLR7;
+		struct __PRU_INTC_HINLR_S HINLR7_bit;
+	};
+	union {
+		volatile unsigned int HINLR8;
+		struct __PRU_INTC_HINLR_S HINLR8_bit;
+	};
+	union {
+		volatile unsigned int HINLR9;
+		struct __PRU_INTC_HINLR_S HINLR9_bit;
+	};
+	unsigned int __gap15[246];
+	union {
+		volatile unsigned int HIER;
+		struct __PRU_INTC_HIER_S HIER_bit;
+	};
+};
+#define PRU_INTC	(*((struct __PRU_INTC *)__INTC_BASE))
+
+/* ====================== PRU UART module ====================== */
+/* TODO */
+
+/* ====================== PRU eCAP module ====================== */
+/* TODO */
+
+/* ====================== PRU CFG module ====================== */
+#define PRU_CFG_REVID_OFFS		0x00
+#define PRU_CFG_SYSCFG_OFFS		0x04
+#define PRU_CFG_GPCFG0_OFFS		0x08
+#define PRU_CFG_GPCFG1_OFFS		0x0c
+#define PRU_CFG_CGR_OFFS		0x10
+#define PRU_CFG_ISRP_OFFS		0x14
+#define PRU_CFG_ISP_OFFS		0x18
+#define PRU_CFG_IESP_OFFS		0x1c
+#define PRU_CFG_IECP_OFFS		0x20
+#define PRU_CFG_SCRP_OFFS		0x24
+#define PRU_CFG_PMAO_OFFS		0x28
+#define PRU_CFG_MII_RT_OFFS		0x2c
+#define PRU_CFG_IEPCLK_OFFS		0x30
+#define PRU_CFG_SPP_OFFS		0x34
+#define PRU_CFG_PIN_MIX_OFFS		0x40
+
+struct __PRU_CFG_SYSCFG_S {
+	volatile unsigned int IDLE_MODE			: 2;
+	volatile unsigned int STANDBY_MODE		: 2;
+	volatile unsigned int STANDBY_INIT		: 1;
+	const volatile unsigned int SUB_MWAIT		: 1;
+	volatile unsigned int __reserved_1		: 24;
+};
+
+struct __PRU_CFG_GPCFG_S {
+	volatile unsigned int GPI_MODE			: 2;
+	volatile unsigned int GPI_CLK_MODE		: 1;
+	volatile unsigned int GPI_DIV0			: 5;
+	volatile unsigned int GPI_DIV1			: 5;
+	volatile unsigned int GPI_SB			: 1;
+	volatile unsigned int GPO_MODE			: 1;
+	volatile unsigned int GPO_DIV0			: 5;
+	volatile unsigned int GPO_DIV1			: 5;
+	volatile unsigned int GPO_SH_SEL		: 1;
+	volatile unsigned int __reserved_1		: 6;
+};
+
+struct __PRU_CFG_CGR_S {
+	volatile unsigned int PRU0_CLK_STOP_REQ		: 1;
+	const volatile unsigned int PRU0_CLK_STOP_ACK	: 1;
+	volatile unsigned int PRU0_CLK_EN		: 1;
+	volatile unsigned int PRU1_CLK_STOP_REQ		: 1;
+	const volatile unsigned int PRU1_CLK_STOP_ACK	: 1;
+	volatile unsigned int PRU1_CLK_EN		: 1;
+	volatile unsigned int INTC_CLK_STOP_REQ		: 1;
+	const volatile unsigned int INTC_CLK_STOP_ACK	: 1;
+	volatile unsigned int INTC_CLK_EN		: 1;
+	volatile unsigned int UART_CLK_STOP_REQ		: 1;
+	const volatile unsigned int UART_CLK_STOP_ACK	: 1;
+	volatile unsigned int UART_CLK_EN		: 1;
+	volatile unsigned int ECAP_CLK_STOP_REQ		: 1;
+	const volatile unsigned int ECAP_CLK_STOP_ACK	: 1;
+	volatile unsigned int ECAP_CLK_EN		: 1;
+	volatile unsigned int IEP_CLK_STOP_REQ		: 1;
+	const volatile unsigned int IEP_CLK_STOP_ACK	: 1;
+	volatile unsigned int IEP_CLK_EN		: 1;
+	volatile unsigned int __reserved_1		: 14;
+};
+
+struct __PRU_CFG_ISPx_S {
+	volatile unsigned int PRU0_IMEM_PE		: 4;
+	volatile unsigned int PRU0_DMEM_PE		: 4;
+	volatile unsigned int PRU1_IMEM_PE		: 4;
+	volatile unsigned int PRU1_DMEM_PE		: 4;
+	volatile unsigned int RAM_PE			: 4;
+	volatile unsigned int __reserved_1		: 12;
+};
+
+struct __PRU_CFG_SCRP_S {
+	volatile unsigned int SCRP_1			: 2;
+	volatile unsigned int SCRP_2			: 2;
+	volatile unsigned int SCRP_3			: 2;
+	volatile unsigned int SCRP_4			: 2;
+	volatile unsigned int SCRP_5			: 1;
+	volatile unsigned int SCRP_6			: 1;
+	volatile unsigned int SCRP_7			: 1;
+	volatile unsigned int SCRP_8			: 1;
+	volatile unsigned int SCRP_9			: 1;
+	volatile unsigned int SCRP_10			: 1;
+	volatile unsigned int SCRP_11			: 1;
+	volatile unsigned int SCRP_12			: 1;
+	volatile unsigned int SCRP_13			: 1;
+	volatile unsigned int SCRP_14			: 1;
+	volatile unsigned int SCRP_15			: 1;
+	volatile unsigned int SCRP_16			: 1;
+	volatile unsigned int SCRP_17			: 1;
+	volatile unsigned int SCRP_18			: 1;
+	volatile unsigned int __reserved_1		: 10;
+};
+
+struct __PRU_CFG_PMAO_S {
+	volatile unsigned int PMAO_PRU0			: 1;
+	volatile unsigned int PMAO_PRU1			: 1;
+	volatile unsigned int __reserved_1		: 30;
+};
+
+struct __PRU_CFG_MII_RT_S {
+	volatile unsigned int MII_RT_EVENT_EN		: 1;
+	volatile unsigned int __reserved_1		: 31;
+};
+
+
+struct __PRU_CFG_IEPCLK_S {
+	volatile unsigned int OCP_EN			: 1;
+	volatile unsigned int __reserved_1		: 31;
+};
+
+struct __PRU_CFG_SPP_S {
+	volatile unsigned int PRU1_PAD_HP_EN		: 1;
+	volatile unsigned int XFR_SHIFT_EN		: 1;
+	volatile unsigned int __reserved_1		: 30;
+};
+
+
+struct __PRU_CFG_PIN_MX_S {
+	volatile unsigned int PIN_MUX_SEL		: 8;
+	volatile unsigned int __reserved_1		: 24;
+};
+
+struct __PRU_CFG {
+	volatile unsigned int REVID;
+	union {
+		volatile unsigned int SYSCFG;
+		struct __PRU_CFG_SYSCFG_S SYSCFG_bit;
+	};
+	union {
+		volatile unsigned int GPCFG0;
+		struct __PRU_CFG_GPCFG_S GPCFG0_bit;
+#if defined(__AM335X_PRU0__)
+		volatile unsigned int GPCFG;
+		struct __PRU_CFG_GPCFG_S GPCFG_bit;
+#endif
+	};
+	union {
+		volatile unsigned int GPCFG1;
+		struct __PRU_CFG_GPCFG_S GPCFG1_bit;
+#if defined(__AM335X_PRU1__)
+		volatile unsigned int GPCFG;
+		struct __PRU_CFG_GPCFG_S GPCFG_bit;
+#endif
+	};
+	union {
+		volatile unsigned int CGR;
+		struct __PRU_CFG_CGR_S CGR_bit;
+	};
+	union {
+		volatile unsigned int ISRP;
+		struct __PRU_CFG_ISPx_S ISRP_bit;
+	};
+	union {
+		volatile unsigned int ISP;
+		struct __PRU_CFG_ISPx_S ISP_bit;
+	};
+	union {
+		volatile unsigned int IESP;
+		struct __PRU_CFG_ISPx_S IESP_bit;
+	};
+	union {
+		volatile unsigned int IECP;
+		struct __PRU_CFG_ISPx_S IECP_bit;
+	};
+	union {
+		volatile unsigned int SCRP;
+		struct __PRU_CFG_SCRP_S SCRP_bit;
+	};
+	union {
+		volatile unsigned int PMAO;
+		struct __PRU_CFG_PMAO_S PMAO_bit;
+	};
+	union {
+		volatile unsigned int MII_RT;
+		struct __PRU_CFG_MII_RT_S MII_RT_bit;
+	};
+	union {
+		volatile unsigned int IEPCLK;
+		struct __PRU_CFG_IEPCLK_S IEPCLK_bit;
+	};
+	union {
+		volatile unsigned int SPP;
+		struct __PRU_CFG_SPP_S SPP_bit;
+	};
+	volatile unsigned int __gap1[2];
+	union {
+		volatile unsigned int PIN_MX;
+		struct __PRU_CFG_PIN_MX_S PIN_MX_bit;
+	};
+};
+#define PRU_CFG	(*((struct __PRU_CFG *)__CFG_BASE))
+
+
+#endif
diff --git a/libgloss/pru/include/pru/io.h b/libgloss/pru/include/pru/io.h
new file mode 100644
index 000000000..b8a70aa78
--- /dev/null
+++ b/libgloss/pru/include/pru/io.h
@@ -0,0 +1,124 @@ 
+/* pru/io.h -- PRU I/O registers definitions
+
+   Copyright (c) 2015-2018 Dimitar Dimitrov <dimitar@dinux.eu>
+   All rights reserved.
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following condition
+   is met:
+
+   1. Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+   FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+   COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+   INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+   SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+   STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+   OF THE POSSIBILITY OF SUCH DAMAGE.
+   */
+
+#ifndef __PRU_IO_H__
+#define __PRU_IO_H__
+
+
+static inline void write_r30(unsigned int val)
+{
+	asm volatile ("mov\tr30, %0" : : "r"(val));
+}
+
+static inline unsigned int read_r30(void)
+{
+	unsigned int val;
+	asm volatile ("mov\t%0, r30" : "=r"(val) :);
+	return val;
+}
+
+static inline void write_r31(unsigned int val)
+{
+	asm volatile ("mov\tr31, %0" : : "r"(val));
+}
+
+static inline unsigned int read_r31(void)
+{
+	unsigned int val;
+	asm volatile ("mov\t%0, r31" : "=r"(val) :);
+	return val;
+}
+
+#ifdef __cplusplus
+
+/*
+ * Elegant accessors for C++ users. Use __R30 and __R31 as normal
+ * LHS and RHS variables to respectively read and write to R30/R31.
+ */
+class __R30_type {
+public:
+	void operator= (unsigned int rhs) const {
+		write_r30(rhs);
+	}
+	operator unsigned int() const {
+		return read_r30();
+	}
+};
+
+class __R31_type {
+public:
+	void operator= (unsigned int rhs) const {
+		write_r31(rhs);
+	}
+	operator unsigned int() const {
+		return read_r31();
+	}
+};
+
+__R30_type __R30 __attribute__((weak));
+__R31_type __R31 __attribute__((weak));
+
+#endif	/* __cplusplus */
+
+static inline void __halt(void)
+{
+	asm volatile ("halt" : : : "memory");
+}
+
+#define PRU_R31_INTR_IN1_BIT		31
+#define PRU_R31_INTR_IN1_MASK		(1u << 31)
+#define PRU_R31_INTR_IN0_BIT		30
+#define PRU_R31_INTR_IN0_MASK		(1u << 30)
+
+#define PRU_R31_STATUS_BIT		0
+#define PRU_R31_STATUS_MASK		(0x3fffffffu << 0)
+
+#define PRU_R31_VEC_VALID_BIT		5
+#define PRU_R31_VEC_VALID_MASK		(1u << 5)
+#define PRU_R31_VEC_BIT			0
+#define PRU_R31_VEC_MASK		(0xfu << 0)
+
+#define PRU_R25_ACC_CARRY_BIT		1
+#define PRU_R25_ACC_CARRY_MASK		(1u << 1)
+#define PRU_R25_MAC_EN_BIT		0
+#define PRU_R25_MAC_EN_MASK		(1u << 0)
+
+/* XFR Device ID numbers */
+#define XFR_ID_MAC			0
+#define XFR_ID_BANK0			10
+#define XFR_ID_BANK1			11
+#define XFR_ID_BANK2			12
+#define XFR_ID_PEER_CORE		14
+
+#if defined(__AM335X_PRU0__) || defined(__AM335X_PRU1__)
+#  include <pru/am335x.h>
+#elif defined(__SIM__)
+   /* perhaps warn? */
+#else
+#  warning "No matching PRU instance variant found for <pru/io.h>"
+#endif
+
+#endif
diff --git a/libgloss/pru/isatty.c b/libgloss/pru/isatty.c
new file mode 100644
index 000000000..bb160edf2
--- /dev/null
+++ b/libgloss/pru/isatty.c
@@ -0,0 +1,26 @@ 
+/* isatty.c -- chek the terminal device.
+ * 
+ * Copyright (c) 1995 Cygnus Support
+ *
+ * The authors hereby grant permission to use, copy, modify, distribute,
+ * and license this software and its documentation for any purpose, provided
+ * that existing copyright notices are retained in all copies and that this
+ * notice is included verbatim in any distributions. No written agreement,
+ * license, or royalty fee is required for any of the authorized uses.
+ * Modifications to this software may be copyrighted by their authors
+ * and need not follow the licensing terms described here, provided that
+ * the new terms are clearly indicated on the first page of each file where
+ * they apply.
+ */
+#include "glue.h"
+
+/*
+ * isatty -- returns 1 if connected to a terminal device,
+ *           returns 0 if not. Since we're hooked up to a
+ *           serial port, we'll say yes _AND return a 1.
+ */
+int
+_isatty (int fd)
+{
+  return (1);
+}
diff --git a/libgloss/pru/kill.c b/libgloss/pru/kill.c
new file mode 100644
index 000000000..5bf7c4110
--- /dev/null
+++ b/libgloss/pru/kill.c
@@ -0,0 +1,28 @@ 
+/* kill.c -- remove a process.
+ *
+ * Copyright (c) 1995, 1999 Cygnus Support
+ *
+ * The authors hereby grant permission to use, copy, modify, distribute,
+ * and license this software and its documentation for any purpose, provided
+ * that existing copyright notices are retained in all copies and that this
+ * notice is included verbatim in any distributions. No written agreement,
+ * license, or royalty fee is required for any of the authorized uses.
+ * Modifications to this software may be copyrighted by their authors
+ * and need not follow the licensing terms described here, provided that
+ * the new terms are clearly indicated on the first page of each file where
+ * they apply.
+ */
+#include "glue.h"
+
+extern void _exit (int) __attribute__((__noreturn__));
+
+/*
+ * kill -- go out via exit...
+ */
+int
+_kill (int pid, int sig)
+{
+  if(pid == __MYPID)
+    _exit(sig);
+  return 0;
+}
diff --git a/libgloss/pru/ldscripts/gen-ld-scripts.sh b/libgloss/pru/ldscripts/gen-ld-scripts.sh
new file mode 100755
index 000000000..575a30970
--- /dev/null
+++ b/libgloss/pru/ldscripts/gen-ld-scripts.sh
@@ -0,0 +1,61 @@ 
+#!/bin/bash
+
+# Generate additional MCU-specific linker scripts by using the
+# default PRU-LD linker script.
+#
+# We do it automatically so that:
+#  1. We only change the default linker script in binutils.
+#  2. All the default script complexity stays in binutils.
+#  3. Here in libgloss we care only to enumerate all PRU variants with
+#     their default memory sizes.
+
+dump_modified()
+{
+  IMEM_SIZE=$1
+  DMEM_SIZE=$2
+  HEAP_SIZE=$3
+  STACK_SIZE=$4
+
+  echo "/* WARNING: automatically generated from the default pru-ld script! */"
+  echo -e "\n\n"
+  pru-ld --verbose | awk "
+BEGIN { LDV_MARKER = 0; }
+{
+  if (\$0 == \"==================================================\" )
+    {
+      LDV_MARKER++;
+    }
+  else if (LDV_MARKER != 1)
+    {
+    }
+  else if (\$0 ~ /^  imem.*ORIGIN =.*LENGTH =/)
+    {
+      print \"  imem   (x)   : ORIGIN = 0x20000000, LENGTH = $IMEM_SIZE\"
+    }
+  else if (\$0 ~ /^  dmem.*ORIGIN =.*LENGTH =/)
+    {
+      print \"  dmem   (rw!x) : ORIGIN = 0x0, LENGTH = $DMEM_SIZE\"
+    }
+  else if (\$0 ~ /^__HEAP_SIZE = DEFINED/)
+    {
+      print \"__HEAP_SIZE = DEFINED(__HEAP_SIZE) ? __HEAP_SIZE : $HEAP_SIZE ;\";
+    }
+  else if (\$0 ~ /^__STACK_SIZE = DEFINED/)
+    {
+      print \"__STACK_SIZE = DEFINED(__STACK_SIZE) ? __STACK_SIZE : $STACK_SIZE ;\";
+    }
+  else
+    {
+      print \$0;
+    }
+}"
+}
+
+#             IMEM DMEM   HEAP_SIZE    STACK_SIZE
+dump_modified 256K 65536K "32 * 1024 * 1024" "1024 * 1024" | tee pruelf-sim.x
+dump_modified 8K   8K     "32"         "512"       | tee pruelf-am335x.pru0.x
+dump_modified 8K   8K     "32"         "512"       | tee pruelf-am335x.pru1.x
+dump_modified 4K   4K     "32"         "256"       | tee pruelf-am437x.icss0.pru0.x
+dump_modified 4K   4K     "32"         "256"       | tee pruelf-am437x.icss0.pru1.x
+dump_modified 8K   8K     "32"         "512"       | tee pruelf-am437x.icss1.pru0.x
+dump_modified 8K   8K     "32"         "512"       | tee pruelf-am437x.icss1.pru1.x
diff --git a/libgloss/pru/ldscripts/pruelf-am335x.pru0.x b/libgloss/pru/ldscripts/pruelf-am335x.pru0.x
new file mode 100644
index 000000000..feae65881
--- /dev/null
+++ b/libgloss/pru/ldscripts/pruelf-am335x.pru0.x
@@ -0,0 +1,201 @@ 
+/* WARNING: automatically generated from the default pru-ld script! */
+
+
+
+/* Default linker script, for normal executables */
+OUTPUT_FORMAT("elf32-pru","elf32-pru","elf32-pru")
+OUTPUT_ARCH(pru)
+MEMORY
+{
+  imem   (x)   : ORIGIN = 0x20000000, LENGTH = 8K
+  dmem   (rw!x) : ORIGIN = 0x0, LENGTH = 8K
+}
+__HEAP_SIZE = DEFINED(__HEAP_SIZE) ? __HEAP_SIZE : 32 ;
+__STACK_SIZE = DEFINED(__STACK_SIZE) ? __STACK_SIZE : 512 ;
+ PROVIDE (_stack_top = ORIGIN(dmem) + LENGTH(dmem)) ;
+ENTRY (_start)
+SECTIONS
+{
+  /* Read-only sections, merged into text segment: */
+  .hash          : { *(.hash)		}
+  .dynsym        : { *(.dynsym)		}
+  .dynstr        : { *(.dynstr)		}
+  .gnu.version   : { *(.gnu.version)	}
+  .gnu.version_d   : { *(.gnu.version_d)	}
+  .gnu.version_r   : { *(.gnu.version_r)	}
+  .rel.init      : { *(.rel.init)		}
+  .rela.init     : { *(.rela.init)	}
+  .rel.text      :
+    {
+      *(.rel.text)
+      *(.rel.text.*)
+      *(.rel.text:*)
+      *(.rel.gnu.linkonce.t*)
+    }
+  .rela.text     :
+    {
+      *(.rela.text)
+      *(.rela.text.*)
+      *(.rela.text:*)
+      *(.rela.gnu.linkonce.t*)
+    }
+  .rel.fini      : { *(.rel.fini)		}
+  .rela.fini     : { *(.rela.fini)	}
+  .rel.rodata    :
+    {
+      *(.rel.rodata)
+      *(.rel.rodata.*)
+      *(.rel.rodata:*)
+      *(.rel.gnu.linkonce.r*)
+    }
+  .rela.rodata   :
+    {
+      *(.rela.rodata)
+      *(.rela.rodata.*)
+      *(.rela.rodata:*)
+      *(.rela.gnu.linkonce.r*)
+    }
+  .rel.data      :
+    {
+      *(.rel.data)
+      *(.rel.data.*)
+      *(.rel.data:*)
+      *(.rel.gnu.linkonce.d*)
+    }
+  .rela.data     :
+    {
+      *(.rela.data)
+      *(.rela.data.*)
+      *(.rela.data:*)
+      *(.rela.gnu.linkonce.d*)
+    }
+  .rel.init_array   	  : { *(.rel.init_array)	}
+  .rela.init_array  	  : { *(.rela.init_array)	}
+  .rel.fini_array   	  : { *(.rel.fini_array)	}
+  .rela.fini_array  	  : { *(.rela.fini_array)	}
+  .rel.got     		  : { *(.rel.got)		}
+  .rela.got    		  : { *(.rela.got)	}
+  .rel.bss     		  : { *(.rel.bss)		}
+  .rela.bss    		  : { *(.rela.bss)	}
+  .rel.plt     		  : { *(.rel.plt)		}
+  .rela.plt    		  : { *(.rela.plt)	}
+  /* Internal text space.  */
+  .text   :
+  {
+     _text_start = . ;
+    . = ALIGN(4);
+    *(.init0)  /* Start here after reset.  */
+    KEEP (*(.init0))
+    . = ALIGN(4);
+    *(.text)
+    . = ALIGN(4);
+    *(.text.*)
+    . = ALIGN(4);
+    *(.text:*)
+    . = ALIGN(4);
+    *(.gnu.linkonce.t*)
+    . = ALIGN(4);
+     _text_end = . ;
+  }  > imem
+  .data          :
+  {
+    /* Optional variable that user is prepared to have NULL address.  */
+     *(.data.atzero*)
+    /* CRT is prepared for constructor/destructor table to have
+       a "valid" NULL address.  */
+     __init_array_begin = . ;
+     KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*)))
+     KEEP (*(.init_array))
+     __init_array_end = . ;
+     __fini_array_begin = . ;
+     KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*)))
+     KEEP (*(.fini_array))
+     __fini_array_end = . ;
+    /* DATA memory starts at address 0.  So to avoid placing a valid static
+       variable at the invalid NULL address, we introduce the .data.atzero
+       section.  If CRT can make some use of it - great.  Otherwise skip a
+       word.  In all cases .data/.bss sections must start at non-zero.  */
+    . += (. == 0 ? 4 : 0);
+     PROVIDE (_data_start = .) ;
+    *(.data)
+     *(.data*)
+     *(.data:*)
+     *(.rodata)  /* We need to include .rodata here if gcc is used.  */
+     *(.rodata.*) /* with -fdata-sections.  */
+     *(.rodata:*)
+    *(.gnu.linkonce.d*)
+    *(.gnu.linkonce.r*)
+    . = ALIGN(4);
+     PROVIDE (_data_end = .) ;
+  }  > dmem
+  .resource_table   :
+  {
+    *(.resource_table)
+    KEEP (*(.resource_table))
+  }  > dmem
+  .bss   :
+  {
+     PROVIDE (_bss_start = .) ;
+    *(.bss)
+     *(.bss.*)
+     *(.bss:*)
+    *(.gnu.linkonce.b*)
+    *(COMMON)
+     PROVIDE (_bss_end = .) ;
+  }  > dmem
+  /* Global data not cleared after reset.  */
+  .noinit  :
+  {
+     PROVIDE (_noinit_start = .) ;
+    *(.noinit)
+     PROVIDE (_noinit_end = .) ;
+     PROVIDE (_heap_start = .) ;
+     . += __HEAP_SIZE ;
+    /* Stack is not here really.  It will be put at the end of DMEM.
+       But we take into account its size here, in order to allow
+       for MEMORY overflow checking during link time.  */
+     . += __STACK_SIZE ;
+  }  > dmem
+  /* Stabs debugging sections.  */
+  .stab 0 : { *(.stab) }
+  .stabstr 0 : { *(.stabstr) }
+  .stab.excl 0 : { *(.stab.excl) }
+  .stab.exclstr 0 : { *(.stab.exclstr) }
+  .stab.index 0 : { *(.stab.index) }
+  .stab.indexstr 0 : { *(.stab.indexstr) }
+  .comment 0 : { *(.comment) }
+  .note.gnu.build-id : { *(.note.gnu.build-id) }
+  /* DWARF debug sections.
+     Symbols in the DWARF debugging sections are relative to the beginning
+     of the section so we begin them at 0.  */
+  /* DWARF 1 */
+  .debug          0 : { *(.debug) }
+  .line           0 : { *(.line) }
+  /* GNU DWARF 1 extensions */
+  .debug_srcinfo  0 : { *(.debug_srcinfo) }
+  .debug_sfnames  0 : { *(.debug_sfnames) }
+  /* DWARF 1.1 and DWARF 2 */
+  .debug_aranges  0 : { *(.debug_aranges) }
+  .debug_pubnames 0 : { *(.debug_pubnames) }
+  /* DWARF 2 */
+  .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
+  .debug_abbrev   0 : { *(.debug_abbrev) }
+  .debug_line     0 : { *(.debug_line .debug_line.* .debug_line_end ) }
+  .debug_frame    0 : { *(.debug_frame) }
+  .debug_str      0 : { *(.debug_str) }
+  .debug_loc      0 : { *(.debug_loc) }
+  .debug_macinfo  0 : { *(.debug_macinfo) }
+  /* SGI/MIPS DWARF 2 extensions */
+  .debug_weaknames 0 : { *(.debug_weaknames) }
+  .debug_funcnames 0 : { *(.debug_funcnames) }
+  .debug_typenames 0 : { *(.debug_typenames) }
+  .debug_varnames  0 : { *(.debug_varnames) }
+  /* DWARF 3 */
+  .debug_pubtypes 0 : { *(.debug_pubtypes) }
+  .debug_ranges   0 : { *(.debug_ranges) }
+  /* DWARF Extension.  */
+  .debug_macro    0 : { *(.debug_macro) }
+  .debug_addr     0 : { *(.debug_addr) }
+}
+
+
diff --git a/libgloss/pru/ldscripts/pruelf-am335x.pru1.x b/libgloss/pru/ldscripts/pruelf-am335x.pru1.x
new file mode 100644
index 000000000..feae65881
--- /dev/null
+++ b/libgloss/pru/ldscripts/pruelf-am335x.pru1.x
@@ -0,0 +1,201 @@ 
+/* WARNING: automatically generated from the default pru-ld script! */
+
+
+
+/* Default linker script, for normal executables */
+OUTPUT_FORMAT("elf32-pru","elf32-pru","elf32-pru")
+OUTPUT_ARCH(pru)
+MEMORY
+{
+  imem   (x)   : ORIGIN = 0x20000000, LENGTH = 8K
+  dmem   (rw!x) : ORIGIN = 0x0, LENGTH = 8K
+}
+__HEAP_SIZE = DEFINED(__HEAP_SIZE) ? __HEAP_SIZE : 32 ;
+__STACK_SIZE = DEFINED(__STACK_SIZE) ? __STACK_SIZE : 512 ;
+ PROVIDE (_stack_top = ORIGIN(dmem) + LENGTH(dmem)) ;
+ENTRY (_start)
+SECTIONS
+{
+  /* Read-only sections, merged into text segment: */
+  .hash          : { *(.hash)		}
+  .dynsym        : { *(.dynsym)		}
+  .dynstr        : { *(.dynstr)		}
+  .gnu.version   : { *(.gnu.version)	}
+  .gnu.version_d   : { *(.gnu.version_d)	}
+  .gnu.version_r   : { *(.gnu.version_r)	}
+  .rel.init      : { *(.rel.init)		}
+  .rela.init     : { *(.rela.init)	}
+  .rel.text      :
+    {
+      *(.rel.text)
+      *(.rel.text.*)
+      *(.rel.text:*)
+      *(.rel.gnu.linkonce.t*)
+    }
+  .rela.text     :
+    {
+      *(.rela.text)
+      *(.rela.text.*)
+      *(.rela.text:*)
+      *(.rela.gnu.linkonce.t*)
+    }
+  .rel.fini      : { *(.rel.fini)		}
+  .rela.fini     : { *(.rela.fini)	}
+  .rel.rodata    :
+    {
+      *(.rel.rodata)
+      *(.rel.rodata.*)
+      *(.rel.rodata:*)
+      *(.rel.gnu.linkonce.r*)
+    }
+  .rela.rodata   :
+    {
+      *(.rela.rodata)
+      *(.rela.rodata.*)
+      *(.rela.rodata:*)
+      *(.rela.gnu.linkonce.r*)
+    }
+  .rel.data      :
+    {
+      *(.rel.data)
+      *(.rel.data.*)
+      *(.rel.data:*)
+      *(.rel.gnu.linkonce.d*)
+    }
+  .rela.data     :
+    {
+      *(.rela.data)
+      *(.rela.data.*)
+      *(.rela.data:*)
+      *(.rela.gnu.linkonce.d*)
+    }
+  .rel.init_array   	  : { *(.rel.init_array)	}
+  .rela.init_array  	  : { *(.rela.init_array)	}
+  .rel.fini_array   	  : { *(.rel.fini_array)	}
+  .rela.fini_array  	  : { *(.rela.fini_array)	}
+  .rel.got     		  : { *(.rel.got)		}
+  .rela.got    		  : { *(.rela.got)	}
+  .rel.bss     		  : { *(.rel.bss)		}
+  .rela.bss    		  : { *(.rela.bss)	}
+  .rel.plt     		  : { *(.rel.plt)		}
+  .rela.plt    		  : { *(.rela.plt)	}
+  /* Internal text space.  */
+  .text   :
+  {
+     _text_start = . ;
+    . = ALIGN(4);
+    *(.init0)  /* Start here after reset.  */
+    KEEP (*(.init0))
+    . = ALIGN(4);
+    *(.text)
+    . = ALIGN(4);
+    *(.text.*)
+    . = ALIGN(4);
+    *(.text:*)
+    . = ALIGN(4);
+    *(.gnu.linkonce.t*)
+    . = ALIGN(4);
+     _text_end = . ;
+  }  > imem
+  .data          :
+  {
+    /* Optional variable that user is prepared to have NULL address.  */
+     *(.data.atzero*)
+    /* CRT is prepared for constructor/destructor table to have
+       a "valid" NULL address.  */
+     __init_array_begin = . ;
+     KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*)))
+     KEEP (*(.init_array))
+     __init_array_end = . ;
+     __fini_array_begin = . ;
+     KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*)))
+     KEEP (*(.fini_array))
+     __fini_array_end = . ;
+    /* DATA memory starts at address 0.  So to avoid placing a valid static
+       variable at the invalid NULL address, we introduce the .data.atzero
+       section.  If CRT can make some use of it - great.  Otherwise skip a
+       word.  In all cases .data/.bss sections must start at non-zero.  */
+    . += (. == 0 ? 4 : 0);
+     PROVIDE (_data_start = .) ;
+    *(.data)
+     *(.data*)
+     *(.data:*)
+     *(.rodata)  /* We need to include .rodata here if gcc is used.  */
+     *(.rodata.*) /* with -fdata-sections.  */
+     *(.rodata:*)
+    *(.gnu.linkonce.d*)
+    *(.gnu.linkonce.r*)
+    . = ALIGN(4);
+     PROVIDE (_data_end = .) ;
+  }  > dmem
+  .resource_table   :
+  {
+    *(.resource_table)
+    KEEP (*(.resource_table))
+  }  > dmem
+  .bss   :
+  {
+     PROVIDE (_bss_start = .) ;
+    *(.bss)
+     *(.bss.*)
+     *(.bss:*)
+    *(.gnu.linkonce.b*)
+    *(COMMON)
+     PROVIDE (_bss_end = .) ;
+  }  > dmem
+  /* Global data not cleared after reset.  */
+  .noinit  :
+  {
+     PROVIDE (_noinit_start = .) ;
+    *(.noinit)
+     PROVIDE (_noinit_end = .) ;
+     PROVIDE (_heap_start = .) ;
+     . += __HEAP_SIZE ;
+    /* Stack is not here really.  It will be put at the end of DMEM.
+       But we take into account its size here, in order to allow
+       for MEMORY overflow checking during link time.  */
+     . += __STACK_SIZE ;
+  }  > dmem
+  /* Stabs debugging sections.  */
+  .stab 0 : { *(.stab) }
+  .stabstr 0 : { *(.stabstr) }
+  .stab.excl 0 : { *(.stab.excl) }
+  .stab.exclstr 0 : { *(.stab.exclstr) }
+  .stab.index 0 : { *(.stab.index) }
+  .stab.indexstr 0 : { *(.stab.indexstr) }
+  .comment 0 : { *(.comment) }
+  .note.gnu.build-id : { *(.note.gnu.build-id) }
+  /* DWARF debug sections.
+     Symbols in the DWARF debugging sections are relative to the beginning
+     of the section so we begin them at 0.  */
+  /* DWARF 1 */
+  .debug          0 : { *(.debug) }
+  .line           0 : { *(.line) }
+  /* GNU DWARF 1 extensions */
+  .debug_srcinfo  0 : { *(.debug_srcinfo) }
+  .debug_sfnames  0 : { *(.debug_sfnames) }
+  /* DWARF 1.1 and DWARF 2 */
+  .debug_aranges  0 : { *(.debug_aranges) }
+  .debug_pubnames 0 : { *(.debug_pubnames) }
+  /* DWARF 2 */
+  .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
+  .debug_abbrev   0 : { *(.debug_abbrev) }
+  .debug_line     0 : { *(.debug_line .debug_line.* .debug_line_end ) }
+  .debug_frame    0 : { *(.debug_frame) }
+  .debug_str      0 : { *(.debug_str) }
+  .debug_loc      0 : { *(.debug_loc) }
+  .debug_macinfo  0 : { *(.debug_macinfo) }
+  /* SGI/MIPS DWARF 2 extensions */
+  .debug_weaknames 0 : { *(.debug_weaknames) }
+  .debug_funcnames 0 : { *(.debug_funcnames) }
+  .debug_typenames 0 : { *(.debug_typenames) }
+  .debug_varnames  0 : { *(.debug_varnames) }
+  /* DWARF 3 */
+  .debug_pubtypes 0 : { *(.debug_pubtypes) }
+  .debug_ranges   0 : { *(.debug_ranges) }
+  /* DWARF Extension.  */
+  .debug_macro    0 : { *(.debug_macro) }
+  .debug_addr     0 : { *(.debug_addr) }
+}
+
+
diff --git a/libgloss/pru/ldscripts/pruelf-am437x.icss0.pru0.x b/libgloss/pru/ldscripts/pruelf-am437x.icss0.pru0.x
new file mode 100644
index 000000000..42489f623
--- /dev/null
+++ b/libgloss/pru/ldscripts/pruelf-am437x.icss0.pru0.x
@@ -0,0 +1,201 @@ 
+/* WARNING: automatically generated from the default pru-ld script! */
+
+
+
+/* Default linker script, for normal executables */
+OUTPUT_FORMAT("elf32-pru","elf32-pru","elf32-pru")
+OUTPUT_ARCH(pru)
+MEMORY
+{
+  imem   (x)   : ORIGIN = 0x20000000, LENGTH = 4K
+  dmem   (rw!x) : ORIGIN = 0x0, LENGTH = 4K
+}
+__HEAP_SIZE = DEFINED(__HEAP_SIZE) ? __HEAP_SIZE : 32 ;
+__STACK_SIZE = DEFINED(__STACK_SIZE) ? __STACK_SIZE : 256 ;
+ PROVIDE (_stack_top = ORIGIN(dmem) + LENGTH(dmem)) ;
+ENTRY (_start)
+SECTIONS
+{
+  /* Read-only sections, merged into text segment: */
+  .hash          : { *(.hash)		}
+  .dynsym        : { *(.dynsym)		}
+  .dynstr        : { *(.dynstr)		}
+  .gnu.version   : { *(.gnu.version)	}
+  .gnu.version_d   : { *(.gnu.version_d)	}
+  .gnu.version_r   : { *(.gnu.version_r)	}
+  .rel.init      : { *(.rel.init)		}
+  .rela.init     : { *(.rela.init)	}
+  .rel.text      :
+    {
+      *(.rel.text)
+      *(.rel.text.*)
+      *(.rel.text:*)
+      *(.rel.gnu.linkonce.t*)
+    }
+  .rela.text     :
+    {
+      *(.rela.text)
+      *(.rela.text.*)
+      *(.rela.text:*)
+      *(.rela.gnu.linkonce.t*)
+    }
+  .rel.fini      : { *(.rel.fini)		}
+  .rela.fini     : { *(.rela.fini)	}
+  .rel.rodata    :
+    {
+      *(.rel.rodata)
+      *(.rel.rodata.*)
+      *(.rel.rodata:*)
+      *(.rel.gnu.linkonce.r*)
+    }
+  .rela.rodata   :
+    {
+      *(.rela.rodata)
+      *(.rela.rodata.*)
+      *(.rela.rodata:*)
+      *(.rela.gnu.linkonce.r*)
+    }
+  .rel.data      :
+    {
+      *(.rel.data)
+      *(.rel.data.*)
+      *(.rel.data:*)
+      *(.rel.gnu.linkonce.d*)
+    }
+  .rela.data     :
+    {
+      *(.rela.data)
+      *(.rela.data.*)
+      *(.rela.data:*)
+      *(.rela.gnu.linkonce.d*)
+    }
+  .rel.init_array   	  : { *(.rel.init_array)	}
+  .rela.init_array  	  : { *(.rela.init_array)	}
+  .rel.fini_array   	  : { *(.rel.fini_array)	}
+  .rela.fini_array  	  : { *(.rela.fini_array)	}
+  .rel.got     		  : { *(.rel.got)		}
+  .rela.got    		  : { *(.rela.got)	}
+  .rel.bss     		  : { *(.rel.bss)		}
+  .rela.bss    		  : { *(.rela.bss)	}
+  .rel.plt     		  : { *(.rel.plt)		}
+  .rela.plt    		  : { *(.rela.plt)	}
+  /* Internal text space.  */
+  .text   :
+  {
+     _text_start = . ;
+    . = ALIGN(4);
+    *(.init0)  /* Start here after reset.  */
+    KEEP (*(.init0))
+    . = ALIGN(4);
+    *(.text)
+    . = ALIGN(4);
+    *(.text.*)
+    . = ALIGN(4);
+    *(.text:*)
+    . = ALIGN(4);
+    *(.gnu.linkonce.t*)
+    . = ALIGN(4);
+     _text_end = . ;
+  }  > imem
+  .data          :
+  {
+    /* Optional variable that user is prepared to have NULL address.  */
+     *(.data.atzero*)
+    /* CRT is prepared for constructor/destructor table to have
+       a "valid" NULL address.  */
+     __init_array_begin = . ;
+     KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*)))
+     KEEP (*(.init_array))
+     __init_array_end = . ;
+     __fini_array_begin = . ;
+     KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*)))
+     KEEP (*(.fini_array))
+     __fini_array_end = . ;
+    /* DATA memory starts at address 0.  So to avoid placing a valid static
+       variable at the invalid NULL address, we introduce the .data.atzero
+       section.  If CRT can make some use of it - great.  Otherwise skip a
+       word.  In all cases .data/.bss sections must start at non-zero.  */
+    . += (. == 0 ? 4 : 0);
+     PROVIDE (_data_start = .) ;
+    *(.data)
+     *(.data*)
+     *(.data:*)
+     *(.rodata)  /* We need to include .rodata here if gcc is used.  */
+     *(.rodata.*) /* with -fdata-sections.  */
+     *(.rodata:*)
+    *(.gnu.linkonce.d*)
+    *(.gnu.linkonce.r*)
+    . = ALIGN(4);
+     PROVIDE (_data_end = .) ;
+  }  > dmem
+  .resource_table   :
+  {
+    *(.resource_table)
+    KEEP (*(.resource_table))
+  }  > dmem
+  .bss   :
+  {
+     PROVIDE (_bss_start = .) ;
+    *(.bss)
+     *(.bss.*)
+     *(.bss:*)
+    *(.gnu.linkonce.b*)
+    *(COMMON)
+     PROVIDE (_bss_end = .) ;
+  }  > dmem
+  /* Global data not cleared after reset.  */
+  .noinit  :
+  {
+     PROVIDE (_noinit_start = .) ;
+    *(.noinit)
+     PROVIDE (_noinit_end = .) ;
+     PROVIDE (_heap_start = .) ;
+     . += __HEAP_SIZE ;
+    /* Stack is not here really.  It will be put at the end of DMEM.
+       But we take into account its size here, in order to allow
+       for MEMORY overflow checking during link time.  */
+     . += __STACK_SIZE ;
+  }  > dmem
+  /* Stabs debugging sections.  */
+  .stab 0 : { *(.stab) }
+  .stabstr 0 : { *(.stabstr) }
+  .stab.excl 0 : { *(.stab.excl) }
+  .stab.exclstr 0 : { *(.stab.exclstr) }
+  .stab.index 0 : { *(.stab.index) }
+  .stab.indexstr 0 : { *(.stab.indexstr) }
+  .comment 0 : { *(.comment) }
+  .note.gnu.build-id : { *(.note.gnu.build-id) }
+  /* DWARF debug sections.
+     Symbols in the DWARF debugging sections are relative to the beginning
+     of the section so we begin them at 0.  */
+  /* DWARF 1 */
+  .debug          0 : { *(.debug) }
+  .line           0 : { *(.line) }
+  /* GNU DWARF 1 extensions */
+  .debug_srcinfo  0 : { *(.debug_srcinfo) }
+  .debug_sfnames  0 : { *(.debug_sfnames) }
+  /* DWARF 1.1 and DWARF 2 */
+  .debug_aranges  0 : { *(.debug_aranges) }
+  .debug_pubnames 0 : { *(.debug_pubnames) }
+  /* DWARF 2 */
+  .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
+  .debug_abbrev   0 : { *(.debug_abbrev) }
+  .debug_line     0 : { *(.debug_line .debug_line.* .debug_line_end ) }
+  .debug_frame    0 : { *(.debug_frame) }
+  .debug_str      0 : { *(.debug_str) }
+  .debug_loc      0 : { *(.debug_loc) }
+  .debug_macinfo  0 : { *(.debug_macinfo) }
+  /* SGI/MIPS DWARF 2 extensions */
+  .debug_weaknames 0 : { *(.debug_weaknames) }
+  .debug_funcnames 0 : { *(.debug_funcnames) }
+  .debug_typenames 0 : { *(.debug_typenames) }
+  .debug_varnames  0 : { *(.debug_varnames) }
+  /* DWARF 3 */
+  .debug_pubtypes 0 : { *(.debug_pubtypes) }
+  .debug_ranges   0 : { *(.debug_ranges) }
+  /* DWARF Extension.  */
+  .debug_macro    0 : { *(.debug_macro) }
+  .debug_addr     0 : { *(.debug_addr) }
+}
+
+
diff --git a/libgloss/pru/ldscripts/pruelf-am437x.icss0.pru1.x b/libgloss/pru/ldscripts/pruelf-am437x.icss0.pru1.x
new file mode 100644
index 000000000..42489f623
--- /dev/null
+++ b/libgloss/pru/ldscripts/pruelf-am437x.icss0.pru1.x
@@ -0,0 +1,201 @@ 
+/* WARNING: automatically generated from the default pru-ld script! */
+
+
+
+/* Default linker script, for normal executables */
+OUTPUT_FORMAT("elf32-pru","elf32-pru","elf32-pru")
+OUTPUT_ARCH(pru)
+MEMORY
+{
+  imem   (x)   : ORIGIN = 0x20000000, LENGTH = 4K
+  dmem   (rw!x) : ORIGIN = 0x0, LENGTH = 4K
+}
+__HEAP_SIZE = DEFINED(__HEAP_SIZE) ? __HEAP_SIZE : 32 ;
+__STACK_SIZE = DEFINED(__STACK_SIZE) ? __STACK_SIZE : 256 ;
+ PROVIDE (_stack_top = ORIGIN(dmem) + LENGTH(dmem)) ;
+ENTRY (_start)
+SECTIONS
+{
+  /* Read-only sections, merged into text segment: */
+  .hash          : { *(.hash)		}
+  .dynsym        : { *(.dynsym)		}
+  .dynstr        : { *(.dynstr)		}
+  .gnu.version   : { *(.gnu.version)	}
+  .gnu.version_d   : { *(.gnu.version_d)	}
+  .gnu.version_r   : { *(.gnu.version_r)	}
+  .rel.init      : { *(.rel.init)		}
+  .rela.init     : { *(.rela.init)	}
+  .rel.text      :
+    {
+      *(.rel.text)
+      *(.rel.text.*)
+      *(.rel.text:*)
+      *(.rel.gnu.linkonce.t*)
+    }
+  .rela.text     :
+    {
+      *(.rela.text)
+      *(.rela.text.*)
+      *(.rela.text:*)
+      *(.rela.gnu.linkonce.t*)
+    }
+  .rel.fini      : { *(.rel.fini)		}
+  .rela.fini     : { *(.rela.fini)	}
+  .rel.rodata    :
+    {
+      *(.rel.rodata)
+      *(.rel.rodata.*)
+      *(.rel.rodata:*)
+      *(.rel.gnu.linkonce.r*)
+    }
+  .rela.rodata   :
+    {
+      *(.rela.rodata)
+      *(.rela.rodata.*)
+      *(.rela.rodata:*)
+      *(.rela.gnu.linkonce.r*)
+    }
+  .rel.data      :
+    {
+      *(.rel.data)
+      *(.rel.data.*)
+      *(.rel.data:*)
+      *(.rel.gnu.linkonce.d*)
+    }
+  .rela.data     :
+    {
+      *(.rela.data)
+      *(.rela.data.*)
+      *(.rela.data:*)
+      *(.rela.gnu.linkonce.d*)
+    }
+  .rel.init_array   	  : { *(.rel.init_array)	}
+  .rela.init_array  	  : { *(.rela.init_array)	}
+  .rel.fini_array   	  : { *(.rel.fini_array)	}
+  .rela.fini_array  	  : { *(.rela.fini_array)	}
+  .rel.got     		  : { *(.rel.got)		}
+  .rela.got    		  : { *(.rela.got)	}
+  .rel.bss     		  : { *(.rel.bss)		}
+  .rela.bss    		  : { *(.rela.bss)	}
+  .rel.plt     		  : { *(.rel.plt)		}
+  .rela.plt    		  : { *(.rela.plt)	}
+  /* Internal text space.  */
+  .text   :
+  {
+     _text_start = . ;
+    . = ALIGN(4);
+    *(.init0)  /* Start here after reset.  */
+    KEEP (*(.init0))
+    . = ALIGN(4);
+    *(.text)
+    . = ALIGN(4);
+    *(.text.*)
+    . = ALIGN(4);
+    *(.text:*)
+    . = ALIGN(4);
+    *(.gnu.linkonce.t*)
+    . = ALIGN(4);
+     _text_end = . ;
+  }  > imem
+  .data          :
+  {
+    /* Optional variable that user is prepared to have NULL address.  */
+     *(.data.atzero*)
+    /* CRT is prepared for constructor/destructor table to have
+       a "valid" NULL address.  */
+     __init_array_begin = . ;
+     KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*)))
+     KEEP (*(.init_array))
+     __init_array_end = . ;
+     __fini_array_begin = . ;
+     KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*)))
+     KEEP (*(.fini_array))
+     __fini_array_end = . ;
+    /* DATA memory starts at address 0.  So to avoid placing a valid static
+       variable at the invalid NULL address, we introduce the .data.atzero
+       section.  If CRT can make some use of it - great.  Otherwise skip a
+       word.  In all cases .data/.bss sections must start at non-zero.  */
+    . += (. == 0 ? 4 : 0);
+     PROVIDE (_data_start = .) ;
+    *(.data)
+     *(.data*)
+     *(.data:*)
+     *(.rodata)  /* We need to include .rodata here if gcc is used.  */
+     *(.rodata.*) /* with -fdata-sections.  */
+     *(.rodata:*)
+    *(.gnu.linkonce.d*)
+    *(.gnu.linkonce.r*)
+    . = ALIGN(4);
+     PROVIDE (_data_end = .) ;
+  }  > dmem
+  .resource_table   :
+  {
+    *(.resource_table)
+    KEEP (*(.resource_table))
+  }  > dmem
+  .bss   :
+  {
+     PROVIDE (_bss_start = .) ;
+    *(.bss)
+     *(.bss.*)
+     *(.bss:*)
+    *(.gnu.linkonce.b*)
+    *(COMMON)
+     PROVIDE (_bss_end = .) ;
+  }  > dmem
+  /* Global data not cleared after reset.  */
+  .noinit  :
+  {
+     PROVIDE (_noinit_start = .) ;
+    *(.noinit)
+     PROVIDE (_noinit_end = .) ;
+     PROVIDE (_heap_start = .) ;
+     . += __HEAP_SIZE ;
+    /* Stack is not here really.  It will be put at the end of DMEM.
+       But we take into account its size here, in order to allow
+       for MEMORY overflow checking during link time.  */
+     . += __STACK_SIZE ;
+  }  > dmem
+  /* Stabs debugging sections.  */
+  .stab 0 : { *(.stab) }
+  .stabstr 0 : { *(.stabstr) }
+  .stab.excl 0 : { *(.stab.excl) }
+  .stab.exclstr 0 : { *(.stab.exclstr) }
+  .stab.index 0 : { *(.stab.index) }
+  .stab.indexstr 0 : { *(.stab.indexstr) }
+  .comment 0 : { *(.comment) }
+  .note.gnu.build-id : { *(.note.gnu.build-id) }
+  /* DWARF debug sections.
+     Symbols in the DWARF debugging sections are relative to the beginning
+     of the section so we begin them at 0.  */
+  /* DWARF 1 */
+  .debug          0 : { *(.debug) }
+  .line           0 : { *(.line) }
+  /* GNU DWARF 1 extensions */
+  .debug_srcinfo  0 : { *(.debug_srcinfo) }
+  .debug_sfnames  0 : { *(.debug_sfnames) }
+  /* DWARF 1.1 and DWARF 2 */
+  .debug_aranges  0 : { *(.debug_aranges) }
+  .debug_pubnames 0 : { *(.debug_pubnames) }
+  /* DWARF 2 */
+  .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
+  .debug_abbrev   0 : { *(.debug_abbrev) }
+  .debug_line     0 : { *(.debug_line .debug_line.* .debug_line_end ) }
+  .debug_frame    0 : { *(.debug_frame) }
+  .debug_str      0 : { *(.debug_str) }
+  .debug_loc      0 : { *(.debug_loc) }
+  .debug_macinfo  0 : { *(.debug_macinfo) }
+  /* SGI/MIPS DWARF 2 extensions */
+  .debug_weaknames 0 : { *(.debug_weaknames) }
+  .debug_funcnames 0 : { *(.debug_funcnames) }
+  .debug_typenames 0 : { *(.debug_typenames) }
+  .debug_varnames  0 : { *(.debug_varnames) }
+  /* DWARF 3 */
+  .debug_pubtypes 0 : { *(.debug_pubtypes) }
+  .debug_ranges   0 : { *(.debug_ranges) }
+  /* DWARF Extension.  */
+  .debug_macro    0 : { *(.debug_macro) }
+  .debug_addr     0 : { *(.debug_addr) }
+}
+
+
diff --git a/libgloss/pru/ldscripts/pruelf-am437x.icss1.pru0.x b/libgloss/pru/ldscripts/pruelf-am437x.icss1.pru0.x
new file mode 100644
index 000000000..feae65881
--- /dev/null
+++ b/libgloss/pru/ldscripts/pruelf-am437x.icss1.pru0.x
@@ -0,0 +1,201 @@ 
+/* WARNING: automatically generated from the default pru-ld script! */
+
+
+
+/* Default linker script, for normal executables */
+OUTPUT_FORMAT("elf32-pru","elf32-pru","elf32-pru")
+OUTPUT_ARCH(pru)
+MEMORY
+{
+  imem   (x)   : ORIGIN = 0x20000000, LENGTH = 8K
+  dmem   (rw!x) : ORIGIN = 0x0, LENGTH = 8K
+}
+__HEAP_SIZE = DEFINED(__HEAP_SIZE) ? __HEAP_SIZE : 32 ;
+__STACK_SIZE = DEFINED(__STACK_SIZE) ? __STACK_SIZE : 512 ;
+ PROVIDE (_stack_top = ORIGIN(dmem) + LENGTH(dmem)) ;
+ENTRY (_start)
+SECTIONS
+{
+  /* Read-only sections, merged into text segment: */
+  .hash          : { *(.hash)		}
+  .dynsym        : { *(.dynsym)		}
+  .dynstr        : { *(.dynstr)		}
+  .gnu.version   : { *(.gnu.version)	}
+  .gnu.version_d   : { *(.gnu.version_d)	}
+  .gnu.version_r   : { *(.gnu.version_r)	}
+  .rel.init      : { *(.rel.init)		}
+  .rela.init     : { *(.rela.init)	}
+  .rel.text      :
+    {
+      *(.rel.text)
+      *(.rel.text.*)
+      *(.rel.text:*)
+      *(.rel.gnu.linkonce.t*)
+    }
+  .rela.text     :
+    {
+      *(.rela.text)
+      *(.rela.text.*)
+      *(.rela.text:*)
+      *(.rela.gnu.linkonce.t*)
+    }
+  .rel.fini      : { *(.rel.fini)		}
+  .rela.fini     : { *(.rela.fini)	}
+  .rel.rodata    :
+    {
+      *(.rel.rodata)
+      *(.rel.rodata.*)
+      *(.rel.rodata:*)
+      *(.rel.gnu.linkonce.r*)
+    }
+  .rela.rodata   :
+    {
+      *(.rela.rodata)
+      *(.rela.rodata.*)
+      *(.rela.rodata:*)
+      *(.rela.gnu.linkonce.r*)
+    }
+  .rel.data      :
+    {
+      *(.rel.data)
+      *(.rel.data.*)
+      *(.rel.data:*)
+      *(.rel.gnu.linkonce.d*)
+    }
+  .rela.data     :
+    {
+      *(.rela.data)
+      *(.rela.data.*)
+      *(.rela.data:*)
+      *(.rela.gnu.linkonce.d*)
+    }
+  .rel.init_array   	  : { *(.rel.init_array)	}
+  .rela.init_array  	  : { *(.rela.init_array)	}
+  .rel.fini_array   	  : { *(.rel.fini_array)	}
+  .rela.fini_array  	  : { *(.rela.fini_array)	}
+  .rel.got     		  : { *(.rel.got)		}
+  .rela.got    		  : { *(.rela.got)	}
+  .rel.bss     		  : { *(.rel.bss)		}
+  .rela.bss    		  : { *(.rela.bss)	}
+  .rel.plt     		  : { *(.rel.plt)		}
+  .rela.plt    		  : { *(.rela.plt)	}
+  /* Internal text space.  */
+  .text   :
+  {
+     _text_start = . ;
+    . = ALIGN(4);
+    *(.init0)  /* Start here after reset.  */
+    KEEP (*(.init0))
+    . = ALIGN(4);
+    *(.text)
+    . = ALIGN(4);
+    *(.text.*)
+    . = ALIGN(4);
+    *(.text:*)
+    . = ALIGN(4);
+    *(.gnu.linkonce.t*)
+    . = ALIGN(4);
+     _text_end = . ;
+  }  > imem
+  .data          :
+  {
+    /* Optional variable that user is prepared to have NULL address.  */
+     *(.data.atzero*)
+    /* CRT is prepared for constructor/destructor table to have
+       a "valid" NULL address.  */
+     __init_array_begin = . ;
+     KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*)))
+     KEEP (*(.init_array))
+     __init_array_end = . ;
+     __fini_array_begin = . ;
+     KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*)))
+     KEEP (*(.fini_array))
+     __fini_array_end = . ;
+    /* DATA memory starts at address 0.  So to avoid placing a valid static
+       variable at the invalid NULL address, we introduce the .data.atzero
+       section.  If CRT can make some use of it - great.  Otherwise skip a
+       word.  In all cases .data/.bss sections must start at non-zero.  */
+    . += (. == 0 ? 4 : 0);
+     PROVIDE (_data_start = .) ;
+    *(.data)
+     *(.data*)
+     *(.data:*)
+     *(.rodata)  /* We need to include .rodata here if gcc is used.  */
+     *(.rodata.*) /* with -fdata-sections.  */
+     *(.rodata:*)
+    *(.gnu.linkonce.d*)
+    *(.gnu.linkonce.r*)
+    . = ALIGN(4);
+     PROVIDE (_data_end = .) ;
+  }  > dmem
+  .resource_table   :
+  {
+    *(.resource_table)
+    KEEP (*(.resource_table))
+  }  > dmem
+  .bss   :
+  {
+     PROVIDE (_bss_start = .) ;
+    *(.bss)
+     *(.bss.*)
+     *(.bss:*)
+    *(.gnu.linkonce.b*)
+    *(COMMON)
+     PROVIDE (_bss_end = .) ;
+  }  > dmem
+  /* Global data not cleared after reset.  */
+  .noinit  :
+  {
+     PROVIDE (_noinit_start = .) ;
+    *(.noinit)
+     PROVIDE (_noinit_end = .) ;
+     PROVIDE (_heap_start = .) ;
+     . += __HEAP_SIZE ;
+    /* Stack is not here really.  It will be put at the end of DMEM.
+       But we take into account its size here, in order to allow
+       for MEMORY overflow checking during link time.  */
+     . += __STACK_SIZE ;
+  }  > dmem
+  /* Stabs debugging sections.  */
+  .stab 0 : { *(.stab) }
+  .stabstr 0 : { *(.stabstr) }
+  .stab.excl 0 : { *(.stab.excl) }
+  .stab.exclstr 0 : { *(.stab.exclstr) }
+  .stab.index 0 : { *(.stab.index) }
+  .stab.indexstr 0 : { *(.stab.indexstr) }
+  .comment 0 : { *(.comment) }
+  .note.gnu.build-id : { *(.note.gnu.build-id) }
+  /* DWARF debug sections.
+     Symbols in the DWARF debugging sections are relative to the beginning
+     of the section so we begin them at 0.  */
+  /* DWARF 1 */
+  .debug          0 : { *(.debug) }
+  .line           0 : { *(.line) }
+  /* GNU DWARF 1 extensions */
+  .debug_srcinfo  0 : { *(.debug_srcinfo) }
+  .debug_sfnames  0 : { *(.debug_sfnames) }
+  /* DWARF 1.1 and DWARF 2 */
+  .debug_aranges  0 : { *(.debug_aranges) }
+  .debug_pubnames 0 : { *(.debug_pubnames) }
+  /* DWARF 2 */
+  .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
+  .debug_abbrev   0 : { *(.debug_abbrev) }
+  .debug_line     0 : { *(.debug_line .debug_line.* .debug_line_end ) }
+  .debug_frame    0 : { *(.debug_frame) }
+  .debug_str      0 : { *(.debug_str) }
+  .debug_loc      0 : { *(.debug_loc) }
+  .debug_macinfo  0 : { *(.debug_macinfo) }
+  /* SGI/MIPS DWARF 2 extensions */
+  .debug_weaknames 0 : { *(.debug_weaknames) }
+  .debug_funcnames 0 : { *(.debug_funcnames) }
+  .debug_typenames 0 : { *(.debug_typenames) }
+  .debug_varnames  0 : { *(.debug_varnames) }
+  /* DWARF 3 */
+  .debug_pubtypes 0 : { *(.debug_pubtypes) }
+  .debug_ranges   0 : { *(.debug_ranges) }
+  /* DWARF Extension.  */
+  .debug_macro    0 : { *(.debug_macro) }
+  .debug_addr     0 : { *(.debug_addr) }
+}
+
+
diff --git a/libgloss/pru/ldscripts/pruelf-am437x.icss1.pru1.x b/libgloss/pru/ldscripts/pruelf-am437x.icss1.pru1.x
new file mode 100644
index 000000000..feae65881
--- /dev/null
+++ b/libgloss/pru/ldscripts/pruelf-am437x.icss1.pru1.x
@@ -0,0 +1,201 @@ 
+/* WARNING: automatically generated from the default pru-ld script! */
+
+
+
+/* Default linker script, for normal executables */
+OUTPUT_FORMAT("elf32-pru","elf32-pru","elf32-pru")
+OUTPUT_ARCH(pru)
+MEMORY
+{
+  imem   (x)   : ORIGIN = 0x20000000, LENGTH = 8K
+  dmem   (rw!x) : ORIGIN = 0x0, LENGTH = 8K
+}
+__HEAP_SIZE = DEFINED(__HEAP_SIZE) ? __HEAP_SIZE : 32 ;
+__STACK_SIZE = DEFINED(__STACK_SIZE) ? __STACK_SIZE : 512 ;
+ PROVIDE (_stack_top = ORIGIN(dmem) + LENGTH(dmem)) ;
+ENTRY (_start)
+SECTIONS
+{
+  /* Read-only sections, merged into text segment: */
+  .hash          : { *(.hash)		}
+  .dynsym        : { *(.dynsym)		}
+  .dynstr        : { *(.dynstr)		}
+  .gnu.version   : { *(.gnu.version)	}
+  .gnu.version_d   : { *(.gnu.version_d)	}
+  .gnu.version_r   : { *(.gnu.version_r)	}
+  .rel.init      : { *(.rel.init)		}
+  .rela.init     : { *(.rela.init)	}
+  .rel.text      :
+    {
+      *(.rel.text)
+      *(.rel.text.*)
+      *(.rel.text:*)
+      *(.rel.gnu.linkonce.t*)
+    }
+  .rela.text     :
+    {
+      *(.rela.text)
+      *(.rela.text.*)
+      *(.rela.text:*)
+      *(.rela.gnu.linkonce.t*)
+    }
+  .rel.fini      : { *(.rel.fini)		}
+  .rela.fini     : { *(.rela.fini)	}
+  .rel.rodata    :
+    {
+      *(.rel.rodata)
+      *(.rel.rodata.*)
+      *(.rel.rodata:*)
+      *(.rel.gnu.linkonce.r*)
+    }
+  .rela.rodata   :
+    {
+      *(.rela.rodata)
+      *(.rela.rodata.*)
+      *(.rela.rodata:*)
+      *(.rela.gnu.linkonce.r*)
+    }
+  .rel.data      :
+    {
+      *(.rel.data)
+      *(.rel.data.*)
+      *(.rel.data:*)
+      *(.rel.gnu.linkonce.d*)
+    }
+  .rela.data     :
+    {
+      *(.rela.data)
+      *(.rela.data.*)
+      *(.rela.data:*)
+      *(.rela.gnu.linkonce.d*)
+    }
+  .rel.init_array   	  : { *(.rel.init_array)	}
+  .rela.init_array  	  : { *(.rela.init_array)	}
+  .rel.fini_array   	  : { *(.rel.fini_array)	}
+  .rela.fini_array  	  : { *(.rela.fini_array)	}
+  .rel.got     		  : { *(.rel.got)		}
+  .rela.got    		  : { *(.rela.got)	}
+  .rel.bss     		  : { *(.rel.bss)		}
+  .rela.bss    		  : { *(.rela.bss)	}
+  .rel.plt     		  : { *(.rel.plt)		}
+  .rela.plt    		  : { *(.rela.plt)	}
+  /* Internal text space.  */
+  .text   :
+  {
+     _text_start = . ;
+    . = ALIGN(4);
+    *(.init0)  /* Start here after reset.  */
+    KEEP (*(.init0))
+    . = ALIGN(4);
+    *(.text)
+    . = ALIGN(4);
+    *(.text.*)
+    . = ALIGN(4);
+    *(.text:*)
+    . = ALIGN(4);
+    *(.gnu.linkonce.t*)
+    . = ALIGN(4);
+     _text_end = . ;
+  }  > imem
+  .data          :
+  {
+    /* Optional variable that user is prepared to have NULL address.  */
+     *(.data.atzero*)
+    /* CRT is prepared for constructor/destructor table to have
+       a "valid" NULL address.  */
+     __init_array_begin = . ;
+     KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*)))
+     KEEP (*(.init_array))
+     __init_array_end = . ;
+     __fini_array_begin = . ;
+     KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*)))
+     KEEP (*(.fini_array))
+     __fini_array_end = . ;
+    /* DATA memory starts at address 0.  So to avoid placing a valid static
+       variable at the invalid NULL address, we introduce the .data.atzero
+       section.  If CRT can make some use of it - great.  Otherwise skip a
+       word.  In all cases .data/.bss sections must start at non-zero.  */
+    . += (. == 0 ? 4 : 0);
+     PROVIDE (_data_start = .) ;
+    *(.data)
+     *(.data*)
+     *(.data:*)
+     *(.rodata)  /* We need to include .rodata here if gcc is used.  */
+     *(.rodata.*) /* with -fdata-sections.  */
+     *(.rodata:*)
+    *(.gnu.linkonce.d*)
+    *(.gnu.linkonce.r*)
+    . = ALIGN(4);
+     PROVIDE (_data_end = .) ;
+  }  > dmem
+  .resource_table   :
+  {
+    *(.resource_table)
+    KEEP (*(.resource_table))
+  }  > dmem
+  .bss   :
+  {
+     PROVIDE (_bss_start = .) ;
+    *(.bss)
+     *(.bss.*)
+     *(.bss:*)
+    *(.gnu.linkonce.b*)
+    *(COMMON)
+     PROVIDE (_bss_end = .) ;
+  }  > dmem
+  /* Global data not cleared after reset.  */
+  .noinit  :
+  {
+     PROVIDE (_noinit_start = .) ;
+    *(.noinit)
+     PROVIDE (_noinit_end = .) ;
+     PROVIDE (_heap_start = .) ;
+     . += __HEAP_SIZE ;
+    /* Stack is not here really.  It will be put at the end of DMEM.
+       But we take into account its size here, in order to allow
+       for MEMORY overflow checking during link time.  */
+     . += __STACK_SIZE ;
+  }  > dmem
+  /* Stabs debugging sections.  */
+  .stab 0 : { *(.stab) }
+  .stabstr 0 : { *(.stabstr) }
+  .stab.excl 0 : { *(.stab.excl) }
+  .stab.exclstr 0 : { *(.stab.exclstr) }
+  .stab.index 0 : { *(.stab.index) }
+  .stab.indexstr 0 : { *(.stab.indexstr) }
+  .comment 0 : { *(.comment) }
+  .note.gnu.build-id : { *(.note.gnu.build-id) }
+  /* DWARF debug sections.
+     Symbols in the DWARF debugging sections are relative to the beginning
+     of the section so we begin them at 0.  */
+  /* DWARF 1 */
+  .debug          0 : { *(.debug) }
+  .line           0 : { *(.line) }
+  /* GNU DWARF 1 extensions */
+  .debug_srcinfo  0 : { *(.debug_srcinfo) }
+  .debug_sfnames  0 : { *(.debug_sfnames) }
+  /* DWARF 1.1 and DWARF 2 */
+  .debug_aranges  0 : { *(.debug_aranges) }
+  .debug_pubnames 0 : { *(.debug_pubnames) }
+  /* DWARF 2 */
+  .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
+  .debug_abbrev   0 : { *(.debug_abbrev) }
+  .debug_line     0 : { *(.debug_line .debug_line.* .debug_line_end ) }
+  .debug_frame    0 : { *(.debug_frame) }
+  .debug_str      0 : { *(.debug_str) }
+  .debug_loc      0 : { *(.debug_loc) }
+  .debug_macinfo  0 : { *(.debug_macinfo) }
+  /* SGI/MIPS DWARF 2 extensions */
+  .debug_weaknames 0 : { *(.debug_weaknames) }
+  .debug_funcnames 0 : { *(.debug_funcnames) }
+  .debug_typenames 0 : { *(.debug_typenames) }
+  .debug_varnames  0 : { *(.debug_varnames) }
+  /* DWARF 3 */
+  .debug_pubtypes 0 : { *(.debug_pubtypes) }
+  .debug_ranges   0 : { *(.debug_ranges) }
+  /* DWARF Extension.  */
+  .debug_macro    0 : { *(.debug_macro) }
+  .debug_addr     0 : { *(.debug_addr) }
+}
+
+
diff --git a/libgloss/pru/ldscripts/pruelf-sim.x b/libgloss/pru/ldscripts/pruelf-sim.x
new file mode 100644
index 000000000..c7d0c59c5
--- /dev/null
+++ b/libgloss/pru/ldscripts/pruelf-sim.x
@@ -0,0 +1,201 @@ 
+/* WARNING: automatically generated from the default pru-ld script! */
+
+
+
+/* Default linker script, for normal executables */
+OUTPUT_FORMAT("elf32-pru","elf32-pru","elf32-pru")
+OUTPUT_ARCH(pru)
+MEMORY
+{
+  imem   (x)   : ORIGIN = 0x20000000, LENGTH = 256K
+  dmem   (rw!x) : ORIGIN = 0x0, LENGTH = 65536K
+}
+__HEAP_SIZE = DEFINED(__HEAP_SIZE) ? __HEAP_SIZE : 32 * 1024 * 1024 ;
+__STACK_SIZE = DEFINED(__STACK_SIZE) ? __STACK_SIZE : 1024 * 1024 ;
+ PROVIDE (_stack_top = ORIGIN(dmem) + LENGTH(dmem)) ;
+ENTRY (_start)
+SECTIONS
+{
+  /* Read-only sections, merged into text segment: */
+  .hash          : { *(.hash)		}
+  .dynsym        : { *(.dynsym)		}
+  .dynstr        : { *(.dynstr)		}
+  .gnu.version   : { *(.gnu.version)	}
+  .gnu.version_d   : { *(.gnu.version_d)	}
+  .gnu.version_r   : { *(.gnu.version_r)	}
+  .rel.init      : { *(.rel.init)		}
+  .rela.init     : { *(.rela.init)	}
+  .rel.text      :
+    {
+      *(.rel.text)
+      *(.rel.text.*)
+      *(.rel.text:*)
+      *(.rel.gnu.linkonce.t*)
+    }
+  .rela.text     :
+    {
+      *(.rela.text)
+      *(.rela.text.*)
+      *(.rela.text:*)
+      *(.rela.gnu.linkonce.t*)
+    }
+  .rel.fini      : { *(.rel.fini)		}
+  .rela.fini     : { *(.rela.fini)	}
+  .rel.rodata    :
+    {
+      *(.rel.rodata)
+      *(.rel.rodata.*)
+      *(.rel.rodata:*)
+      *(.rel.gnu.linkonce.r*)
+    }
+  .rela.rodata   :
+    {
+      *(.rela.rodata)
+      *(.rela.rodata.*)
+      *(.rela.rodata:*)
+      *(.rela.gnu.linkonce.r*)
+    }
+  .rel.data      :
+    {
+      *(.rel.data)
+      *(.rel.data.*)
+      *(.rel.data:*)
+      *(.rel.gnu.linkonce.d*)
+    }
+  .rela.data     :
+    {
+      *(.rela.data)
+      *(.rela.data.*)
+      *(.rela.data:*)
+      *(.rela.gnu.linkonce.d*)
+    }
+  .rel.init_array   	  : { *(.rel.init_array)	}
+  .rela.init_array  	  : { *(.rela.init_array)	}
+  .rel.fini_array   	  : { *(.rel.fini_array)	}
+  .rela.fini_array  	  : { *(.rela.fini_array)	}
+  .rel.got     		  : { *(.rel.got)		}
+  .rela.got    		  : { *(.rela.got)	}
+  .rel.bss     		  : { *(.rel.bss)		}
+  .rela.bss    		  : { *(.rela.bss)	}
+  .rel.plt     		  : { *(.rel.plt)		}
+  .rela.plt    		  : { *(.rela.plt)	}
+  /* Internal text space.  */
+  .text   :
+  {
+     _text_start = . ;
+    . = ALIGN(4);
+    *(.init0)  /* Start here after reset.  */
+    KEEP (*(.init0))
+    . = ALIGN(4);
+    *(.text)
+    . = ALIGN(4);
+    *(.text.*)
+    . = ALIGN(4);
+    *(.text:*)
+    . = ALIGN(4);
+    *(.gnu.linkonce.t*)
+    . = ALIGN(4);
+     _text_end = . ;
+  }  > imem
+  .data          :
+  {
+    /* Optional variable that user is prepared to have NULL address.  */
+     *(.data.atzero*)
+    /* CRT is prepared for constructor/destructor table to have
+       a "valid" NULL address.  */
+     __init_array_begin = . ;
+     KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*)))
+     KEEP (*(.init_array))
+     __init_array_end = . ;
+     __fini_array_begin = . ;
+     KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*)))
+     KEEP (*(.fini_array))
+     __fini_array_end = . ;
+    /* DATA memory starts at address 0.  So to avoid placing a valid static
+       variable at the invalid NULL address, we introduce the .data.atzero
+       section.  If CRT can make some use of it - great.  Otherwise skip a
+       word.  In all cases .data/.bss sections must start at non-zero.  */
+    . += (. == 0 ? 4 : 0);
+     PROVIDE (_data_start = .) ;
+    *(.data)
+     *(.data*)
+     *(.data:*)
+     *(.rodata)  /* We need to include .rodata here if gcc is used.  */
+     *(.rodata.*) /* with -fdata-sections.  */
+     *(.rodata:*)
+    *(.gnu.linkonce.d*)
+    *(.gnu.linkonce.r*)
+    . = ALIGN(4);
+     PROVIDE (_data_end = .) ;
+  }  > dmem
+  .resource_table   :
+  {
+    *(.resource_table)
+    KEEP (*(.resource_table))
+  }  > dmem
+  .bss   :
+  {
+     PROVIDE (_bss_start = .) ;
+    *(.bss)
+     *(.bss.*)
+     *(.bss:*)
+    *(.gnu.linkonce.b*)
+    *(COMMON)
+     PROVIDE (_bss_end = .) ;
+  }  > dmem
+  /* Global data not cleared after reset.  */
+  .noinit  :
+  {
+     PROVIDE (_noinit_start = .) ;
+    *(.noinit)
+     PROVIDE (_noinit_end = .) ;
+     PROVIDE (_heap_start = .) ;
+     . += __HEAP_SIZE ;
+    /* Stack is not here really.  It will be put at the end of DMEM.
+       But we take into account its size here, in order to allow
+       for MEMORY overflow checking during link time.  */
+     . += __STACK_SIZE ;
+  }  > dmem
+  /* Stabs debugging sections.  */
+  .stab 0 : { *(.stab) }
+  .stabstr 0 : { *(.stabstr) }
+  .stab.excl 0 : { *(.stab.excl) }
+  .stab.exclstr 0 : { *(.stab.exclstr) }
+  .stab.index 0 : { *(.stab.index) }
+  .stab.indexstr 0 : { *(.stab.indexstr) }
+  .comment 0 : { *(.comment) }
+  .note.gnu.build-id : { *(.note.gnu.build-id) }
+  /* DWARF debug sections.
+     Symbols in the DWARF debugging sections are relative to the beginning
+     of the section so we begin them at 0.  */
+  /* DWARF 1 */
+  .debug          0 : { *(.debug) }
+  .line           0 : { *(.line) }
+  /* GNU DWARF 1 extensions */
+  .debug_srcinfo  0 : { *(.debug_srcinfo) }
+  .debug_sfnames  0 : { *(.debug_sfnames) }
+  /* DWARF 1.1 and DWARF 2 */
+  .debug_aranges  0 : { *(.debug_aranges) }
+  .debug_pubnames 0 : { *(.debug_pubnames) }
+  /* DWARF 2 */
+  .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
+  .debug_abbrev   0 : { *(.debug_abbrev) }
+  .debug_line     0 : { *(.debug_line .debug_line.* .debug_line_end ) }
+  .debug_frame    0 : { *(.debug_frame) }
+  .debug_str      0 : { *(.debug_str) }
+  .debug_loc      0 : { *(.debug_loc) }
+  .debug_macinfo  0 : { *(.debug_macinfo) }
+  /* SGI/MIPS DWARF 2 extensions */
+  .debug_weaknames 0 : { *(.debug_weaknames) }
+  .debug_funcnames 0 : { *(.debug_funcnames) }
+  .debug_typenames 0 : { *(.debug_typenames) }
+  .debug_varnames  0 : { *(.debug_varnames) }
+  /* DWARF 3 */
+  .debug_pubtypes 0 : { *(.debug_pubtypes) }
+  .debug_ranges   0 : { *(.debug_ranges) }
+  /* DWARF Extension.  */
+  .debug_macro    0 : { *(.debug_macro) }
+  .debug_addr     0 : { *(.debug_addr) }
+}
+
+
diff --git a/libgloss/pru/lseek.c b/libgloss/pru/lseek.c
new file mode 100644
index 000000000..966b2b8a3
--- /dev/null
+++ b/libgloss/pru/lseek.c
@@ -0,0 +1,31 @@ 
+/* lseek.c -- move read/write pointer.
+ *
+ * Copyright (c) 1995, 1999 Cygnus Support
+ *
+ * The authors hereby grant permission to use, copy, modify, distribute,
+ * and license this software and its documentation for any purpose, provided
+ * that existing copyright notices are retained in all copies and that this
+ * notice is included verbatim in any distributions. No written agreement,
+ * license, or royalty fee is required for any of the authorized uses.
+ * Modifications to this software may be copyrighted by their authors
+ * and need not follow the licensing terms described here, provided that
+ * the new terms are clearly indicated on the first page of each file where
+ * they apply.
+ */
+#include <sys/types.h>
+#include <errno.h>
+#include "glue.h"
+
+#undef errno
+extern int errno;
+
+/*
+ * lseek --  we return an error.
+ */
+off_t
+_lseek (int fd, off_t offset, int whence)
+{
+  errno = ESPIPE;
+  return ((off_t)-1);
+}
+
diff --git a/libgloss/pru/open.c b/libgloss/pru/open.c
new file mode 100644
index 000000000..7140eefc4
--- /dev/null
+++ b/libgloss/pru/open.c
@@ -0,0 +1,30 @@ 
+/* open.c -- open a file.
+ * 
+ * Copyright (c) 1995, 1999 Cygnus Support
+ *
+ * The authors hereby grant permission to use, copy, modify, distribute,
+ * and license this software and its documentation for any purpose, provided
+ * that existing copyright notices are retained in all copies and that this
+ * notice is included verbatim in any distributions. No written agreement,
+ * license, or royalty fee is required for any of the authorized uses.
+ * Modifications to this software may be copyrighted by their authors
+ * and need not follow the licensing terms described here, provided that
+ * the new terms are clearly indicated on the first page of each file where
+ * they apply.
+ */
+#include <errno.h>
+#include "glue.h"
+
+#undef errno
+extern int errno;
+
+/*
+ * open -- open a file descriptor. We don't have a filesystem, so
+ *         we return an error.
+ */
+int
+_open (const char *buf, int flags, int mode)
+{
+  errno = EIO;
+  return (-1);
+}
diff --git a/libgloss/pru/outbyte.c b/libgloss/pru/outbyte.c
new file mode 100644
index 000000000..13e4277ea
--- /dev/null
+++ b/libgloss/pru/outbyte.c
@@ -0,0 +1,24 @@ 
+/* outbyte.c -- outbyte function for simulator
+ *
+ * Copyright (c) 2014-2018 Dimitar Dimitrov <dimitar@dinux.eu>
+ *
+ * The authors hereby grant permission to use, copy, modify, distribute,
+ * and license this software and its documentation for any purpose, provided
+ * that existing copyright notices are retained in all copies and that this
+ * notice is included verbatim in any distributions. No written agreement,
+ * license, or royalty fee is required for any of the authorized uses.
+ * Modifications to this software may be copyrighted by their authors
+ * and need not follow the licensing terms described here, provided that
+ * the new terms are clearly indicated on the first page of each file where
+ * they apply.
+ */
+#include <unistd.h>
+#include <_ansi.h>
+
+extern ssize_t _write(int fd, const void *b, size_t count);
+
+void
+outbyte (char ch)
+{
+  _write(STDOUT_FILENO, &ch, 1);
+}
diff --git a/libgloss/pru/print.c b/libgloss/pru/print.c
new file mode 100644
index 000000000..00a40b387
--- /dev/null
+++ b/libgloss/pru/print.c
@@ -0,0 +1,25 @@ 
+/* print.c -- print a string on the output device.
+ *
+ * Copyright (c) 1995, 1999 Cygnus Support
+ *
+ * The authors hereby grant permission to use, copy, modify, distribute,
+ * and license this software and its documentation for any purpose, provided
+ * that existing copyright notices are retained in all copies and that this
+ * notice is included verbatim in any distributions. No written agreement,
+ * license, or royalty fee is required for any of the authorized uses.
+ * Modifications to this software may be copyrighted by their authors
+ * and need not follow the licensing terms described here, provided that
+ * the new terms are clearly indicated on the first page of each file where
+ * they apply.
+ */
+#include <unistd.h>
+#include "glue.h"
+
+/*
+ * print -- do a raw print of a string
+ */
+void
+_print (char *ptr)
+{
+  _write(STDOUT_FILENO, ptr, strlen(ptr));
+}
diff --git a/libgloss/pru/putnum.c b/libgloss/pru/putnum.c
new file mode 100644
index 000000000..127e1c3dd
--- /dev/null
+++ b/libgloss/pru/putnum.c
@@ -0,0 +1,42 @@ 
+/* putnum.c -- put a hex number on the output device.
+ * 
+ * Copyright (c) 1995, 1999 Cygnus Support
+ *
+ * The authors hereby grant permission to use, copy, modify, distribute,
+ * and license this software and its documentation for any purpose, provided
+ * that existing copyright notices are retained in all copies and that this
+ * notice is included verbatim in any distributions. No written agreement,
+ * license, or royalty fee is required for any of the authorized uses.
+ * Modifications to this software may be copyrighted by their authors
+ * and need not follow the licensing terms described here, provided that
+ * the new terms are clearly indicated on the first page of each file where
+ * they apply.
+ */
+#include "glue.h"
+
+extern void print (char *ptr);
+
+/*
+ * putnum -- print a 32 bit number in hex
+ */
+void
+_putnum (unsigned int num)
+{
+  char  buf[9];
+  int   cnt;
+  char  *ptr;
+  int   digit;
+
+  ptr = buf;
+  for (cnt = 7 ; cnt >= 0 ; cnt--) {
+    digit = (num >> (cnt * 4)) & 0xf;
+
+    if (digit <= 9)
+      *ptr++ = (char) ('0' + digit);
+    else
+      *ptr++ = (char) ('a' - 10 + digit);
+  }
+
+  *ptr = (char) 0;
+  print (buf);
+}
diff --git a/libgloss/pru/raise.c b/libgloss/pru/raise.c
new file mode 100644
index 000000000..d8e902605
--- /dev/null
+++ b/libgloss/pru/raise.c
@@ -0,0 +1,24 @@ 
+/* raise.c -- raise a signal for current process.
+ *
+ * Copyright (c) 1999 Cygnus Support
+ *
+ * The authors hereby grant permission to use, copy, modify, distribute,
+ * and license this software and its documentation for any purpose, provided
+ * that existing copyright notices are retained in all copies and that this
+ * notice is included verbatim in any distributions. No written agreement,
+ * license, or royalty fee is required for any of the authorized uses.
+ * Modifications to this software may be copyrighted by their authors
+ * and need not follow the licensing terms described here, provided that
+ * the new terms are clearly indicated on the first page of each file where
+ * they apply.
+ */
+#include "glue.h"
+
+extern int _kill (int, int);
+extern int _getpid(void);
+
+int
+_raise (int sig)
+{
+  return _kill (_getpid (), sig);
+}
diff --git a/libgloss/pru/sbrk.c b/libgloss/pru/sbrk.c
new file mode 100644
index 000000000..f14e4ec34
--- /dev/null
+++ b/libgloss/pru/sbrk.c
@@ -0,0 +1,46 @@ 
+/* sbrk.c -- allocate memory dynamically.
+ * 
+ * Copyright (c) 1995,1996,1999 Cygnus Support
+ *
+ * The authors hereby grant permission to use, copy, modify, distribute,
+ * and license this software and its documentation for any purpose, provided
+ * that existing copyright notices are retained in all copies and that this
+ * notice is included verbatim in any distributions. No written agreement,
+ * license, or royalty fee is required for any of the authorized uses.
+ * Modifications to this software may be copyrighted by their authors
+ * and need not follow the licensing terms described here, provided that
+ * the new terms are clearly indicated on the first page of each file where
+ * they apply.
+ */
+#include <sys/types.h>
+#include <sys/stat.h>
+#include "glue.h"
+
+extern char _heap_start[];
+extern void exit (int) __attribute ((__noreturn__));
+extern int _write (int, char *, int);
+
+caddr_t
+_sbrk (size_t incr)
+{
+  static char *heap_end;
+  char *prev_heap_end;
+  char *sp = (char *)&sp;
+
+  if (heap_end == 0)
+    {
+      heap_end = _heap_start;
+    }
+  prev_heap_end = heap_end;
+  if (heap_end > sp)
+    {
+      _write (1, "Heap and stack collision\n", 25);
+#if 0 /* Calling abort brings in the signal handling code.  */
+      abort ();
+#else
+      exit (1);
+#endif
+    }
+  heap_end += incr;
+  return (caddr_t) prev_heap_end;
+}
diff --git a/libgloss/pru/stat.c b/libgloss/pru/stat.c
new file mode 100644
index 000000000..64cb27253
--- /dev/null
+++ b/libgloss/pru/stat.c
@@ -0,0 +1,31 @@ 
+/* stat.c -- Get the status of a file.
+ *
+ * Copyright (c) 1995, 1999 Cygnus Support
+ *
+ * The authors hereby grant permission to use, copy, modify, distribute,
+ * and license this software and its documentation for any purpose, provided
+ * that existing copyright notices are retained in all copies and that this
+ * notice is included verbatim in any distributions. No written agreement,
+ * license, or royalty fee is required for any of the authorized uses.
+ * Modifications to this software may be copyrighted by their authors
+ * and need not follow the licensing terms described here, provided that
+ * the new terms are clearly indicated on the first page of each file where
+ * they apply.
+ */
+#include <sys/stat.h>
+#include <errno.h>
+#include "glue.h"
+
+#undef errno
+extern int errno;
+
+/*
+ * stat -- Since we have no file system, we just return an error.
+ */
+int
+_stat (const char *path, struct stat *buf)
+{
+  errno = EIO;
+  return (-1);
+}
+
diff --git a/libgloss/pru/syscalls.S b/libgloss/pru/syscalls.S
new file mode 100644
index 000000000..eb074690a
--- /dev/null
+++ b/libgloss/pru/syscalls.S
@@ -0,0 +1,32 @@ 
+/* syscalls.S -- PRU system calls code
+ *
+ * Copyright (c) 2014-2018 Dimitar Dimitrov <dimitar@dinux.eu>
+ *
+ * The authors hereby grant permission to use, copy, modify, distribute,
+ * and license this software and its documentation for any purpose, provided
+ * that existing copyright notices are retained in all copies and that this
+ * notice is included verbatim in any distributions. No written agreement,
+ * license, or royalty fee is required for any of the authorized uses.
+ * Modifications to this software may be copyrighted by their authors
+ * and need not follow the licensing terms described here, provided that
+ * the new terms are clearly indicated on the first page of each file where
+ * they apply.
+ */
+#include "newlib.h"
+
+#include "syscall.h"
+
+.macro	SC	fname, id
+	.global	\fname
+        .type        \fname,@function
+\fname:
+	ldi	r1, \id
+	halt
+	ret
+.endm
+
+	.text
+
+	SC	_exit, SYS_exit
+	SC	_write, SYS_write
+	SC	_read, SYS_read
diff --git a/libgloss/pru/unlink.c b/libgloss/pru/unlink.c
new file mode 100644
index 000000000..a5e490404
--- /dev/null
+++ b/libgloss/pru/unlink.c
@@ -0,0 +1,30 @@ 
+/* unlink.c -- remove a file.
+ * 
+ * Copyright (c) 1995, 1999 Cygnus Support
+ *
+ * The authors hereby grant permission to use, copy, modify, distribute,
+ * and license this software and its documentation for any purpose, provided
+ * that existing copyright notices are retained in all copies and that this
+ * notice is included verbatim in any distributions. No written agreement,
+ * license, or royalty fee is required for any of the authorized uses.
+ * Modifications to this software may be copyrighted by their authors
+ * and need not follow the licensing terms described here, provided that
+ * the new terms are clearly indicated on the first page of each file where
+ * they apply.
+ */
+#include <errno.h>
+#include "glue.h"
+
+#undef errno
+extern int errno;
+
+/*
+ * unlink -- since we have no file system,
+ *           we just return an error.
+ */
+int
+_unlink (char * path)
+{
+  errno = EIO;
+  return (-1);
+}
diff --git a/newlib/configure.host b/newlib/configure.host
index 4eebf6d95..10115c613 100644
--- a/newlib/configure.host
+++ b/newlib/configure.host
@@ -82,7 +82,7 @@  case "${target_optspace}:${host}" in
   yes:*)
     newlib_cflags="${newlib_cflags} -Os"
     ;;
-  :m32r-* | :d10v-* | :d30v-* | :avr-* | :m32c-* | :msp430*-* | :nds32* | :rl78-* )
+  :m32r-* | :d10v-* | :d30v-* | :avr-* | :m32c-* | :msp430*-* | :nds32* | :pru-* | :rl78-* )
     newlib_cflags="${newlib_cflags} -Os"
     ;;
   no:* | :*)
@@ -261,6 +261,14 @@  case "${host_cpu}" in
   powerpc*)
 	machine_dir=powerpc
 	;;
+  pru*)
+	newlib_cflags="${newlib_cflags} -DPREFER_SIZE_OVER_SPEED"
+	newlib_cflags="${newlib_cflags} -DNO_EXEC"
+	newlib_cflags="${newlib_cflags} -DSMALL_MEMORY"
+	default_newlib_nano_malloc="yes"
+	default_newlib_atexit_dynamic_alloc="no"
+	machine_dir=pru
+	;;
   riscv*)
 	libm_machine_dir=riscv
 	machine_dir=riscv
@@ -817,6 +825,10 @@  newlib_cflags="${newlib_cflags} -DCLOCK_PROVIDED -DMALLOC_PROVIDED -DEXIT_PROVID
 	newlib_cflags="${newlib_cflags} -DHAVE_OPENDIR -DHAVE_RENAME -DHAVE_FCNTL -D_NO_POSIX_SPAWN"
 	syscall_dir=syscalls
 	;;
+  pru*)
+	syscall_dir=syscalls
+	newlib_cflags="${newlib_cflags} -DSMALL_MEMORY -D_REENT_SMALL"
+	;;
   riscv*-*-*)
 	syscall_dir=syscalls
 	;;
diff --git a/newlib/libc/include/machine/ieeefp.h b/newlib/libc/include/machine/ieeefp.h
index 2fb2268ce..a81a85cee 100644
--- a/newlib/libc/include/machine/ieeefp.h
+++ b/newlib/libc/include/machine/ieeefp.h
@@ -409,6 +409,10 @@ 
 #define __SMALL_BITFIELDS	/* 16 Bit INT */
 #endif
 
+#ifdef __PRU__
+#define __IEEE_LITTLE_ENDIAN
+#endif
+
 #ifdef __RL78__
 #define __IEEE_LITTLE_ENDIAN
 #define __SMALL_BITFIELDS	/* 16 Bit INT */
diff --git a/newlib/libc/include/machine/setjmp.h b/newlib/libc/include/machine/setjmp.h
index 9212f840b..a3b33e372 100644
--- a/newlib/libc/include/machine/setjmp.h
+++ b/newlib/libc/include/machine/setjmp.h
@@ -349,6 +349,11 @@  _BEGIN_STD_C
 #define _JBTYPE unsigned long
 #endif
 
+#ifdef __PRU__
+#define _JBLEN 48
+#define _JBTYPE unsigned int
+#endif
+
 #ifdef __RX__
 #define _JBLEN 0x44
 #endif
diff --git a/newlib/libc/machine/configure.in b/newlib/libc/machine/configure.in
index 8ebe68bdb..88e728b02 100644
--- a/newlib/libc/machine/configure.in
+++ b/newlib/libc/machine/configure.in
@@ -64,6 +64,7 @@  if test -n "${machine_dir}"; then
 	nvptx) AC_CONFIG_SUBDIRS(nvptx) ;;
 	or1k) AC_CONFIG_SUBDIRS(or1k) ;;
 	powerpc) AC_CONFIG_SUBDIRS(powerpc) ;;
+	pru) AC_CONFIG_SUBDIRS(pru) ;;
 	rl78) AC_CONFIG_SUBDIRS(rl78) ;;
 	rx) AC_CONFIG_SUBDIRS(rx) ;;
 	sh) AC_CONFIG_SUBDIRS(sh) ;;
diff --git a/newlib/libc/machine/pru/Makefile.am b/newlib/libc/machine/pru/Makefile.am
new file mode 100644
index 000000000..60885128d
--- /dev/null
+++ b/newlib/libc/machine/pru/Makefile.am
@@ -0,0 +1,16 @@ 
+## Process this file with automake to generate Makefile.in
+
+AUTOMAKE_OPTIONS = cygnus
+
+INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS)
+
+AM_CCASFLAGS = $(INCLUDES)
+
+noinst_LIBRARIES = lib.a
+
+lib_a_SOURCES = setjmp.s
+lib_a_CCASFLAGS=$(AM_CCASFLAGS)
+lib_a_CFLAGS=$(AM_CFLAGS)
+
+ACLOCAL_AMFLAGS = -I ../../.. -I ../../../..
+CONFIG_STATUS_DEPENDENCIES = $(newlib_basedir)/configure.host
diff --git a/newlib/libc/machine/pru/configure.in b/newlib/libc/machine/pru/configure.in
new file mode 100644
index 000000000..d6eea0e9c
--- /dev/null
+++ b/newlib/libc/machine/pru/configure.in
@@ -0,0 +1,14 @@ 
+dnl This is the newlib/libc/machine/pru configure.in file.
+dnl Process this file with autoconf to produce a configure script.
+
+AC_PREREQ(2.59)
+AC_INIT([newlib],[NEWLIB_VERSION])
+AC_CONFIG_SRCDIR([setjmp.s])
+
+dnl Can't be done in NEWLIB_CONFIGURE because that confuses automake.
+AC_CONFIG_AUX_DIR(../../../..)
+
+NEWLIB_CONFIGURE(../../..)
+
+AC_CONFIG_FILES([Makefile])
+AC_OUTPUT
diff --git a/newlib/libc/machine/pru/setjmp.s b/newlib/libc/machine/pru/setjmp.s
new file mode 100644
index 000000000..f13f66b65
--- /dev/null
+++ b/newlib/libc/machine/pru/setjmp.s
@@ -0,0 +1,46 @@ 
+/*
+ * Copyright (c) 2014-2018 Dimitar Dimitrov <dimitar@dinux.eu>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+	.section	.text
+	.align	3
+	.globl	setjmp
+	.type	setjmp,@function
+	.globl	longjmp
+	.type	longjmp,@function
+
+
+setjmp:
+	sbbo	r2, r14, 0, 4*12	/* SP, RA, FP, r5-r13 */
+	ldi	r14, 0
+	ret
+
+longjmp:
+	lbbo	r2, r14, 0, 4*12	/* SP, RA, FP, r5-r13 */
+	mov	r14, r15		/* copy second arg to return location */
+	qbne	1f, r14, 0		/* per stdC, we cannot return 0 */
+	ldi	r14, 1
+1:
+	ret