Blob Blame History Raw
diff --git a/frysk-imports/Makefile.am b/frysk-imports/Makefile.am
index 3066eeb..94c68d0 100644
--- a/frysk-imports/Makefile.am
+++ b/frysk-imports/Makefile.am
@@ -49,7 +49,7 @@ if CHECK_LIBUNWIND
 else
   LIBUNWIND_DIR = 
 endif # CHECK_LIBUNWIND
-LIBUNWIND_ARCH_DIRS = libunwind-i386 libunwind-x86_64 libunwind-ppc32 libunwind-ppc64
+LIBUNWIND_ARCH_DIRS = libunwind-i386 libunwind-x86_64
 
 # List of directories that should both be included in the distro and
 # included in a recursive "make check".  Only the native architecture
diff --git a/frysk-imports/configure.ac b/frysk-imports/configure.ac
index 4c4f209..9e9f960 100644
--- a/frysk-imports/configure.ac
+++ b/frysk-imports/configure.ac
@@ -57,6 +57,6 @@ AC_CONFIG_FILES([
 # list of configured subdirectories so that it can be included in
 # "make dist" (or the recursive "make distdir").
 
-AC_CONFIG_SUBDIRS([libunwind libunwind-i386 libunwind-x86_64 libunwind-ppc32 libunwind-ppc64])
+AC_CONFIG_SUBDIRS([libunwind libunwind-i386 libunwind-x86_64])
 
 AC_OUTPUT
diff --git a/frysk-imports/libunwind/.gitignore b/frysk-imports/libunwind/.gitignore
deleted file mode 100644
index f0f3aa0..0000000
--- a/frysk-imports/libunwind/.gitignore
+++ /dev/null
@@ -1,5 +0,0 @@
-autom4te.cache
-configure
-aclocal.m4
-Makefile.in
-config
diff --git a/frysk-imports/libunwind/ChangeLog b/frysk-imports/libunwind/ChangeLog
index 3bf7ff9..dfa24b9 100644
--- a/frysk-imports/libunwind/ChangeLog
+++ b/frysk-imports/libunwind/ChangeLog
@@ -1,775 +1,3 @@
-2008-05-24  Andrew Cagney  <cagney@redhat.com>
-
-	* src/dwarf/Gparser.c (put_unwind_info): Call the eh-frame's
-	put_unwind_info method if present.
-
-2007-03-19  Mark Wielaard  <mwielaard@redhat.com>
-
-	* src/x86_64/Gstep.c (is_call_instr_at): New function.
-	(init_stack_based_ret): New function.
-	(unw_step): Try stack based unwind with call instr, before
-	fallback to frame pointer.
-	
-2007-03-12  Mark Wielaard  <mwielaard@redhat.com>
-
-	* src/x86/Gstep.c (is_call_instr_at): New function.
-	(init_stack_based_ret): New function.
-	(unw_step): Try stack based unwind with call instr, before
-	fallback to frame pointer.
-
-2007-01-31  Mark Wielaard  <mwielaard@redhat.com>
-
-	Fixup libunwind merge.
-	* src/Makefile.am (libunwind_la_SOURCES_x86_64): Add
-	x86_64/setcontext.S.
-	* src/x86_64/Gresume.c (x86_64_local_resume): Call
-	_x86_64_setcontext.
-	* src/x86_64/setcontext.S: Added.
-
-2007-01-25  Mark Wielaard  <mwielaard@redhat.com>
-
-	Revert:
-	2006-09-20  Alexandre Oliva  <aoliva@redhat.com>
-	
-	* src/os-linux.h (maps_next): Don't error out just because
-	path is missing.
-	* include/tdep-hppa/libunwind_i.h (tdep_get_elf_image): Add as
-	and arg to the parameter list.
-	* include/tdep-ia64/libunwind_i.h (tdep_get_elf_image): Ditto.
-	* include/tdep-ppc64/libunwind_i.h (tdep_get_elf_image): Ditto.
-	* include/tdep-x86/libunwind_i.h (tdep_get_elf_image): Ditto.
-	* include/tdep-x86_64/libunwind_i.h (tdep_get_elf_image): Ditto.
-	* src/elfxx.h (get_proc_name): Ditto.
-	* src/elfxx.c (get_proc_name): Ditto.  Adjust.
-	* src/hppa/Ginit.c (get_static_proc_name): Adjust.
-	* src/ia64/Ginit.c (get_static_proc_name): Ditto.
-	* src/ppc64/Ginit.c (get_static_proc_name): Ditto.
-	* src/x86/Ginit.c (get_static_proc_name): Ditto.
-	* src/x86_64/Ginit.c (get_static_proc_name): Ditto.
-	* src/ptrace/_UPT_find_proc_info.c (get_unwind_info): Ditto.
-	* src/ptrace/_UPT_get_proc_name.c (_UPT_get_proc_name): Ditto.
-	* src/os-hpux.c (tdep_get_elf_image): Ditto.
-	* src/os-linux.c (tdep_get_elf_image): Ditto.  Read in 1-page
-	segments that start with the ELF magic.
-	(MAX_VDSO_SIZE): New.
-
-	2007-04-25  Nurdin Premji  <npremji@redhat.com>
-
-	* src/elfxx.h (elf_map_image): map image using MAP_32BIT to
-	avoid address truncation issues in cross-platform unwinding.
-	* src/os-linux.h: (tdep_get_elf_image) Ditto for VDSO section.
-	* src/ptrace/_UPT_find_proc_info.c (_UPTi_find_unwind_table): 
-	Added dummy local address space for cross-platform unwinding.
-
-2008-01-18  Mark Wielaard  <mwielaard@redhat.com>
-
-	* include/dwarf.h (dwarf_cie_info): Add as and as_arg members.
-	* src/dwarf/Gfde.c (dwarf_extract_proc_info_from_fde): Set dci
-	as and as_arg when not local only.
-	* src/dwarf/Gparser.c (run_cfi_program): Use dci as and as_arg
-	when not local only.
-
-2008-01-17  Mark Wielaard  <mwielaard@redhat.com>
-
-	* include/dwarf.h (dwarf_extract_proc_info_from_fde): Pass
-	table_start.
-	* src/dwarf/Gfde.c (is_cie_id): Removed.
-	(parse_cie): Accept debug and eh cie ids.
-	(dwarf_extract_proc_info_from_fde): Accept table_start. Calculate
-	correct cie_addr. Fix error reporting.
-	* src/dwarf/Gfind_proc_info-lsb.c (linear_search): Don't depend
-	on local address space. Pass table start for fde parsing.
-	(dwarf_search_unwind_table): Handle debug_frame by linear search.
-	* src/mi/Gget_unwind_table.c (get_frame_table, get_debug_table):
-	new functions.
-	(unw_get_unwind_table): Call either get_frame_table or
-	get_debug_table depending on format.
-	
-2007-12-22  Mark Wielaard  <mwielaard@redhat.com>
-
-	* include/libunwind-common.h.in (unw_get_unwind_table):
-	Remove as, arg and peh_vaddr arguments.
-	* src/mi/Gget_unwind_table.c (unw_get_unwind_table): Likewise.
-	Create address space from eh_frame_accessors. Set rti.table_data
-	and rti.segbase from eh_frame_hdr_address. Pass eh_frame_arg
-	to tdep_search_unwind_table.
-	* src/dwarf/Gfde.c (parse_cie): Add FRYSK LOCAL hack to not
-	read personality routine address.
-
-2007-12-20  Mark Wielaard  <mwielaard@redhat.com>
-
-	* configure.in (is_local_frysk_build): New function.
-	(frysk_local_target_cpu): New function.
-	Define target_cpu, target_alias and UNW_REMOTE_ONLY based on new
-	functions.
-
-2007-12-11  Andrew Cagney  <cagney@redhat.com>
-
-	* src/x86/Gregs.c (linux_scratch_loc): Add XMM registers.
-	(tdep_access_fpreg): Ditto.
-	* src/x86/regname.c: Add XMM registers.
-	* src/x86/is_fpreg.c: Include XMM0 .. XMM7 in floating point
-	registers.
-	* include/libunwind-x86.h (x86_regnum_t): Add UNW_X86_XMM0,
-	UNW_X86_XMM1, UNW_X86_XMM2, UNW_X86_XMM3, UNW_X86_XMM4,
-	UNW_X86_XMM5, UNW_X86_XMM7, UNW_X86_XMM7.
-	(unw_tdep_fpreg_t): Change to a union of possible values.
-
-2007-12-11  Mark Wielaard  <mwielaard@redhat.com>
-
-	* include/libunwind-common.h.in (unw_get_unwind_table): Add
-	unw_accessor_t, remove elf image arguments.
-	* src/mi/Gget_unwind_table.c (unw_get_unwind_table): Likewise.
-	Rewrite to use unw_accessor_t for reading all data.
-	
-2007-11-28  Mark Wielaard  <mwielaard@redhat.com>
-
-	* src/mi/Gget_unwind_table.c (unw_get_unwind_table): Make addr a
-	char *, pass addr as arg to dwarf_read functions, make
-	local_access_mem use arg as base address for start indexed reads.
-	
-2007-11-28  Mark Wielaard  <mwielaard@redhat.com>
-
-	Revert:
-	2006-12-10  Jan Kratochvil  <jan.kratochvil@redhat.com>
-
-	* src/elfxx.c (lookup_symbol): Avoid returning irrelevant symbols
-	defined as the last ones before the address in different
-	section.
-
-	2006-12-10  Jan Kratochvil  <jan.kratochvil@redhat.com>
-
-	* src/elfxx.c (lookup_symbol): Fixed excessive buffer
-	size requirement.
-
-2007-11-28  Mark Wielaard  <mwielaard@redhat.com>
-
-	* .cvsignore, config/.cvsignore, doc/.cvsignore,
-	include/.cvsignore, src/.cvsignore, tests/.cvsignore: Removed.
-
-2007-11-23  Mark Wielaard  <mwielaard@redhat.com>
-
-	Revert:
-	2006-09-16  Alexandre Oliva  <aoliva@redhat.com>
-
-	* src/x86/Gget_proc_info.c (unw_get_proc_info): Use
-	unw_get_proc_name to build a proper proc_info_t.
-	* src/x86_64/Gget_proc_info.c (unw_get_proc_info): Likewise.
-	* src/hppa/Gget_proc_info.c (unw_get_proc_info): Likewise.
-
-	2006-09-27  Alexandre Oliva  <aoliva@redhat.com>
-
-	* src/elfxx.c (lookup_symbol): Cope with NULL buf and zero buf_len.
-	* src/mi/Gget_proc_name.c (intern_string, get_proc_name): Likewise.
-	* src/hppa/Gget_proc_info.c (unw_get_proc_info): Use it.
-	* src/x86/Gget_proc_info.c (unw_get_proc_info): Likewise.
-	* src/x86_64/Gget_proc_info.c (unw_get_proc_info): Likewise.
-	* doc/unw_get_proc_name.tex: Document NULL buf and zero buf_len.
-	* doc/unw_create_addr_space.tex (get_proc_name): Likewise.
-	* doc/unw_get_proc_name.man: Rebuilt.
-	* doc/unw_create_addr_space.man: Likewise.
-
-2007-11-19  Mark Wielaard  <mwielaard@redhat.com>
-
-	* src/mi/Gget_reg.c (unw_get_reg): Use cached value from cursor
-	when looking for UNW_REG_IP.
-	
-2007-10-13  Mark Wielaard  <mwielaard@redhat.com>
-
-	* config/.cvsignore: New. Ignore generated files.
-
-2007-10-12  Mark Wielaard  <mwielaard@redhat.com>
-
-	* src/ppc32/ucontext_i.h: Use locally defined reg structs.
-
-2007-10-12  Jose Flavio Aguilar Paulino  <jflavio@br.ibm.com>
-
-	* include/tdep-ppc32/libunwind_i.h: Define tdep_fetch_proc_info_post.
-	(tdep_get_elf_image): Add void *arg argument.
-	* include/tdep-ppc64/libunwind_i.h: Likewise.
-	* src/Makefile.am (libunwind_la_SOURCES_ppc): Add
-	ppc/Lfetch_proc_info_post.c.
-	(libunwind_ppc_la_SOURCES_ppc_generic): Add
-	ppc/Gfetch_proc_info_post.c.
-	* src/ppc/Gfetch_proc_info_post.c: New file.
-	* src/ppc/Lfetch_proc_info_post.c: New file.
-	* src/ppc32/Ginit.c (get_static_proc_name): Pass through arg.
-	* src/ppc64/Ginit.c (get_static_proc_name): Likewise.
-
-2007-10-11  Mark Wielaard  <mwielaard@redhat.com>
-
-	* Imported and merged with libunwind 20071010.
-
-2007-10-10  Andrew Cagney  <cagney@redhat.com>
-
-	* src/x86/init.h (common_init): Use UNW_X86_ESI for dwarf.loc[ESI].
-
-2007-10-03  Mark Wielaard  <mwielaard@redhat.com>
-
-	* tests/test-async-sig.c: Remove duplicate nerrors_max (merge error).
-	* tests/test-ptrace.c: Remove duplicate
-	and target_pid_kill definitions (merge error).
-
-2007-10-03  Mark Wielaard  <mwielaard@redhat.com>
-
-	* src/Makefile.am: Don't special case libunwind-ptrace. Use upstream
-	.a archive rules.
-	* tests/Makefile.am: Likewise.
-
-2007-09-11  Mark Wielaard  <mwielaard@redhat.com>
-
-	* Makefile.am (SUBDIRS): Exclude docs.
-
-2007-09-10  Mark Wielaard  <mwielaard@redhat.com>
-
-	* aux/config.guess: Remove generated file.
-	* aux/config.sub: Likewise.
-	* aux/ltmain.sh: Likewise.
-	* src/ppc64/Make-arch.in: Likewise.
-
-2007-09-10  Mark Wielaard  <mwielaard@redhat.com>
-
-	* Imported and merged with libunwind 20070829.
-
-2007-06-19  Andrew Cagney  <cagney@redhat.com>
-
-	* Makefile.am (EXTRA_DIST): Add include/tdep-ppc64/jmpbuf.h,
-	include/tdep-ppc64/libunwind_i.h, and include/tdep-ppc64/README.
-	
-	* Makefile.am (include_HEADERS_tdep): Add
-	include/libunwind-ppc64.h.
-
-	* src/Makefile.am (libunwind_la_SOURCES_x86_64_common): Remove
-	stray '\'.
-
-2007-06-14  Nurdin Premji <npremji@redhat.com>
-
-	* src/Makefile.am: Removed src/x86_64/setcontext.S.
-	* src/x86_64/setcontext.S: Removed.
-
-2007-05-10  Nurdin Premji  <npremji@redhat.com>
-
-	* src/mi/Gget_unwind_table.c (unw_get_unwind_table): Don't abort, just
-	return an error.
-	Cleaned up logging.
-
-2007-04-30  Nurdin Premji  <npremji@redhat.com>
-
-	* src/mi/Gget_unwind_table.c (unw_get_unwind_table): Changed to return
-	UNW_ENOINFO instead of -1. Allows stepping to continue.
-
-2007-04-25  Nurdin Premji  <npremji@redhat.com>
-
-	* src/mi/Gget_unwind_table.c (unw_get_unwind_table): Cleaned up logging.
-
-	* include/libunwind-common.h.in (unw_get_unwind_table): Added.
-	* src/elfxx.h (elf_map_image): map image using MAP_32BIT to avoid address
-	truncation issues in cross-platform unwinding.
-	* src/os-linux.h: (tdep_get_elf_image) Ditto for VDSO section.
-	* src/Makefile.am (libunwind_la_SOURCES_generic): Added Gget_unwind_table.c.
-	* src/mi/Gget_unwind_table.c: Added.
-	* src/ptrace/_UPT_find_proc_info.c (_UPTi_find_unwind_table): 
-	Added dummy local address space for cross-platform unwinding.
-
-2007-04-05  Jan Kratochvil  <jan.kratochvil@redhat.com>
-
-	* src/hppa/getcontext.S, src/hppa/setcontext.S, src/hppa/siglongjmp.S,
-	src/ia64/Ginstall_cursor.S, src/ia64/Linstall_cursor.S,
-	src/ia64/dyn_info_list.S, src/ia64/getcontext.S, src/ia64/longjmp.S,
-	src/ia64/setjmp.S, src/ia64/siglongjmp.S, src/ia64/sigsetjmp.S,
-	src/ppc64/longjmp.S, src/ppc64/siglongjmp.S, src/x86/longjmp.S,
-	src/x86/siglongjmp.S, src/x86_64/longjmp.S, src/x86_64/setcontext.S,
-	src/x86_64/siglongjmp.S: Stack should be non-executable, for SELinux.
-
-	* tests/test-ptrace.c (target_pid_kill): New function.
-	(target_pid, main): TARGET_PID made static, for target_pid_kill ().
-	(main): Register target_pid_kill () for atexit(3).
-
-	* tests/ia64-test-setjmp.c (doit): New forward declaration.
-	(doit_pointer): New function pointer variable initialized to DOIT.
-	(doit): Self-call made by an unoptimizable volatile indirect call.
-
-	* src/Makefile.am (LIBRARIES_cdep, lib_LTLIBRARIES_cdep_setjmp):
-	Removed, moved into ...
-	(lib_LTLIBRARIES_cdep) ... here to fix libtool --disable-static.
-	(libunwind_ptrace_a_SOURCES): Renamed to ...
-	(libunwind_ptrace_la_SOURCES) ... here to fix libtool --disable-static.
-	(install-exec-hook): Fixed for conditional compilations.
-	(lib_LIBRARIES): Removed.
-	(lib_LTLIBRARIES): Updated for removed `lib_LTLIBRARIES_cdep_setjmp'.
-	(EXTRA_DIST): Updated for new renamed `libunwind_ptrace_la_SOURCES'.
-        * tests/Makefile.am (test_ptrace_LDADD): Updated for libtool.
-
-2007-04-04  Jan Kratochvil  <jan.kratochvil@redhat.com>
-
-	* acinclude.m4, config/compile, config/config.guess, config/config.sub,
-	config/depcomp, config/install-sh, config/ltmain.sh, config/missing,
-	config/mkinstalldirs: Removed the autotools generated files.
-	* .cvsignore: `config' is no longer a repository stored directory.
-
-	* include/libunwind-ppc64.h (UNW_TDEP_CURSOR_LEN): Fixed for assert()s.
-	* include/tdep-ppc64/libunwind_i.h (mempool.h): Version update even for
-	the ppc64 architecture.
-	* src/Makefile.am (ppc64): Version forward-ported the ppc64 port.
-	* src/ppc64/Ginit.c (ppc64_local_addr_space_init): Removed VALIDATE
-	initialization as it is no longer a cross-architecture field.
-	* src/ppc64/Lcreate_addr_space.c, src/ppc64/Lget_proc_info.c,
-	src/ppc64/Lget_save_loc.c, src/ppc64/Lglobal.c, src/ppc64/Linit.c,
-	src/ppc64/Linit_local.c, src/ppc64/Linit_remote.c,
-	src/ppc64/Lis_signal_frame.c, src/ppc64/Lregs.c, src/ppc64/Lresume.c,
-	src/ppc64/Lstep.c: New files.
-	* src/ppc64/setcontext.S: Removed file as it had invalid unused content.
-	* src/ppc64/siglongjmp.S (_UI_siglongjmp_cont): New stub function.
-	* tests/flush-cache.S (flush_cache): New stub function for ppc64.
-	* tests/test-ptrace-stepper.c (lockup): New ppc64 and crossplatform
-	implementations.
-
-	* tests/Gtest-dyn1.c, tests/Gtest-resume-sig.c, tests/test-async-sig.c,
-	tests/test-ptrace.c: Fixed lockups on broken libunwind (as ppc64 is).
-
-2007-03-31  Andrew Cagney  <cagney@redhat.com>
-
-	* configure.in (AM_MAINTAINER_MODE): Delete.
-	(get_arch): Map powerpc64 onto ppc64.
-	(pkg_extra): Append -frysk.
-	(pkg_maintainer): Change to frysk@sourceware.org.
-	
-2007-03-20  Nurdin Premji  <npremji@redhat.com>
-
-	* tests/mapper.c: Change alarm timeout to 80.
-
-2007-03-19  Nurdin Premji  <npremji@redhat.com>
-
-	* tests/Makefile.am: Added test_ptrace_stepper, and test_ptrace_signull
-	to list of tests to run.
-	(XFAIL): Added test_ptrace_signull.
-	* .cvsignore: Added Makefile.in.
-	* doc/.cvsignore: Ditto.
-	* src/.cvsignore: Ditto.
-	* tests/.cvsignore: Ditto.
-
-2007-03-07  Jan Kratochvil  <jan.kratochvil@redhat.com>
-
-	* include/tdep-hppa/libunwind_i.h, include/tdep-ppc64/libunwind_i.h,
-	include/tdep-x86/libunwind_i.h, include/tdep-x86_64/libunwind_i.h
-	(tdep_fetch_proc_info_post): Fixed its UNW_OBJ()-duality.
-	* src/Makefile.am (libunwind_la_SOURCES_x86_common)
-	(libunwind_la_SOURCES_x86, libunwind_x86_la_SOURCES_x86): Fixed
-	x86/Gfetch_proc_info_post.c and x86/Lfetch_proc_info_post.c duality.
-	(libunwind_la_SOURCES_x86_64_common, libunwind_la_SOURCES_x86_64)
-	(libunwind_x86_64_la_SOURCES_x86_64): Fixed
-	x86_64/Gfetch_proc_info_post.c and x86_64/Lfetch_proc_info_post.c
-	duality.
-	* src/x86/Lfetch_proc_info_post.c, src/x86_64/Lfetch_proc_info_post.c:
-	New files.
-
-2007-03-14  Nurdin Premji  <npremji@redhat.com>
-
-	* tests/check-namespace.sh.in: Reverted so lib search to libunwind version.
-
-	* Makefile.am: Added.
-	* configure.in: Added.
-	* config/ltmain.sh: Added.
-	* doc/Makefile.am: Added.
-	* src/Makefile.am: Added.
-	* tests/Makefile.am: Added.
-	* src/dwarf/Lexpr.c: Added.
-	* src/dwarf/Lfde.c: Added
-	* src/dwarf/Lfind_proc_info-lsb.c: Added
-	* src/dwarf/Lparser.c: Added
-	* src/dwarf/Lpe.c: Added
-	* src/dwarf/Lstep.c: Added
-	* src/hppa/Lcreate_addr_space.c: Added
-	* src/hppa/Lget_proc_info.c: Added
-	* src/hppa/Lget_save_loc.c: Added
-	* src/hppa/Lglobal.c: Added
-	* src/hppa/Linit.c: Added
-	* src/hppa/Linit_local.c: Added
-	* src/hppa/Linit_remote.c: Added
-	* src/hppa/Lis_signal_frame.c: Added
-	* src/hppa/Lregs.c: Added
-	* src/hppa/Lresume.c: Added
-	* src/hppa/Lstep.c: Added
-	* src/ia64/Lcreate_addr_space.c: Added
-	* src/ia64/Lget_proc_info.c: Added
-	* src/ia64/Lget_save_loc.c: Added
-	* src/ia64/Lglobal.c: Added
-	* src/ia64/Linit.c: Added
-	* src/ia64/Linit_local.c: Added
-	* src/ia64/Linit_remote.c: Added
-	* src/ia64/Linstall_cursor.S: Added
-	* src/ia64/Lis_signal_frame.c: Added
-	* src/ia64/Lparser.c: Added
-	* src/ia64/Lrbs.c: Added
-	* src/ia64/Lregs.c: Added
-	* src/ia64/Lresume.c: Added
-	* src/ia64/Lscript.c: Added
-	* src/ia64/Lstep.c: Added
-	* src/ia64/Ltables.c: Added
-	* src/mi/Ldestroy_addr_space.c: Added
-	* src/mi/Ldyn-extract.c: Added
-	* src/mi/Lfind_dynamic_proc_info.c: Added
-	* src/mi/Lget_accessors.c: Added
-	* src/mi/Lget_fpreg.c: Added
-	* src/mi/Lget_proc_info_by_ip.c: Added
-	* src/mi/Lget_proc_name.c: Added
-	* src/mi/Lget_reg.c: Added
-	* src/mi/Lput_dynamic_unwind_info.c: Added
-	* src/mi/Lset_caching_policy.c: Added
-	* src/mi/Lset_fpreg.c: Added
-	* src/mi/Lset_reg.c: Added
-	* src/x86/Lcreate_addr_space.c: Added
-	* src/x86/Lget_proc_info.c: Added
-	* src/x86/Lget_save_loc.c: Added
-	* src/x86/Lglobal.c: Added
-	* src/x86/Linit.c: Added
-	* src/x86/Linit_local.c: Added
-	* src/x86/Linit_remote.c: Added
-	* src/x86/Lis_signal_frame.c: Added
-	* src/x86/Lregs.c: Added
-	* src/x86/Lresume.c: Added
-	* src/x86/Lstep.c: Added
-	* src/x86_64/Lcreate_addr_space.c: Added
-	* src/x86_64/Lget_proc_info.c: Added
-	* src/x86_64/Lget_save_loc.c: Added
-	* src/x86_64/Lglobal.c: Added
-	* src/x86_64/Linit.c: Added
-	* src/x86_64/Linit_local.c: Added
-	* src/x86_64/Linit_remote.c: Added
-	* src/x86_64/Lis_signal_frame.c: Added
-	* src/x86_64/Lregs.c: Added
-	* src/x86_64/Lresume.c: Added
-	* src/x86_64/Lstep.c: Added
-	* tests/Lia64-test-nat.c: Added
-	* tests/Lia64-test-rbs.c: Added
-	* tests/Lia64-test-readonly.c: Added
-	* tests/Lia64-test-stack.c: Added
-	* tests/Lperf-simple.c: Added
-	* tests/Ltest-bt.c: Added
-	* tests/Ltest-concurrent.c: Added
-	* tests/Ltest-dyn1.c: Added
-	* tests/Ltest-exc.c: Added
-	* tests/Ltest-init.cxx: Added
-	* tests/Ltest-resume-sig.c: Added
-	* Makefile.in: Removed.
-	* doc/Makefile.in: Removed.
-	* src/Makefile.in: Removed.
-	* tests/Makefile.in: Removed.
-	* configure.ac: Removed.
-	* scripts/kernel-diff.sh: Removed.
-	* scripts/kernel-files.txt: Removed.
-	* scripts/make-L-files: Removed.
-	* src/Make-hpux.in: Removed.
-	* src/Make-linux.in: Removed.
-	* src/hppa/Make-arch.in: Removed.
-	* src/hppa/get_accessors.c: Removed.
-	* src/hppa/tables.c: Removed.
-	* src/ia64/Make-arch.in: Removed.
-	* src/ia64/NOTES: Removed.
-	* src/setjmp/setjmp.c: Removed.
-	* src/setjmp/sigsetjmp.c: Removed.
-	* src/x86/Make-arch.in: Removed.
-	* src/x86_64/Make-arch.in: Removed.
-	* tests/perf-startup: Removed.
-	* include/dwarf.h: Modified.
-	* include/dwarf_i.h: Modified.
-	* include/libunwind-common.h.in: Modified.
-	* include/tdep-x86/libunwind_i.h: Modified.
-	* include/tdep-x86_64/libunwind_i.h: Modified.
-	* src/os-linux.h: Modified.
-	* src/dwarf/Gparser.c: Modified.
-	* src/hppa/init.h: Modified.
-	* src/ia64/setjmp.S: Modified.
-	* src/ia64/sigsetjmp.S: Modified.
-	* src/mi/mempool.c: Modified.
-	* src/ptrace/_UPT_find_proc_info.c: Modified.
-	* src/setjmp/longjmp.c: Modified.
-	* src/setjmp/siglongjmp.c: Modified.
-	* src/x86_64/Ginit.c: Modified.
-	* src/x86_64/Gis_signal_frame.c: Modified.
-	* tests/Gia64-test-readonly.c: Modified.
-	* tests/ia64-test-readonly-asm.S: Modified.
-
-2007-03-07  Jan Kratochvil  <jan.kratochvil@redhat.com>
-
-	* tests/test-async-sig.c (do_backtrace): Limit maximum backtrace depth
-	to 100 iterations; it workarounds FC6 DWARF-broken glibc.
-
-2007-03-02  Nurdin Premji  <npremji@redhat.com>
-
-	* src/elfxx.c (lookup_symbol): Undo previous correction, buf_len is decremented previously.
-
-2007-02-28  Nurdin Premji  <npremji@redhat.com>
-
-	* src/elfxx.c (lookup_symbol): Fix stack smashing buf memcpy.
-
-2007-02-28  Jan Kratochvil  <jan.kratochvil@redhat.com>
-
-	* tests/Makefile.in (clean): No longer remove some source scripts.
-
-2007-02-28  Jan Kratochvil  <jan.kratochvil@redhat.com>
-
-	* tests/check-namespace.sh.in: Backward compatible $(top_builddir) fix
-	for the autoconf-2.59c compatibility.
-
-2007-01-24  Jan Kratochvil  <jan.kratochvil@redhat.com>
-
-	* src/elfxx.c (lookup_symbol): Fix false preceding zero-sized function
-	resolving (printed `_start' symbols for stripped binaries).
-
-2006-12-18  Jan Kratochvil  <jan.kratochvil@redhat.com>
-
-	* src/elfxx.c (lookup_symbol): Fix regression in the 2006-12-10 bugfix;
-	on already prelink(8)ed libraries loaded at a different address.
-	No testcase provided as prelink(8) need `root' privileges.
-
-2006-12-17  Jan Kratochvil  <jan.kratochvil@redhat.com>
-
-	* tests/check-namespace.sh.in (check_local_unw_abi): Restrict the
-	checking of `unw_tdep_getcontext' only for platforms it is built on.
-
-2006-12-16  Jan Kratochvil  <jan.kratochvil@redhat.com>
-
-	* tests/Gtest-resume-sig.c (main): Return SKIP instead of FAIL on ia64
-	as the libunwind functionality is still not implemented for non-ia64.
-
-2006-12-11  Jan Kratochvil  <jan.kratochvil@redhat.com>
-
-	* tests/Makefile.in (XFAIL_TESTS): `run-ptrace-signull' is now XFAIL
-	until the clone() CFI unwind stopping gets resolved in glibc.
-
-2006-12-10  Jan Kratochvil  <jan.kratochvil@redhat.com>
-
-	* src/x86/Gstep.c (code_descriptor_trap): Handle the cases of signal
-	frame leaving stale address due to page fault on an instruction fetch.
-	(unw_step): Call `code_descriptor_trap' above.
-	Debug dump the content of signal frame set from CFI.
-	Fixed non-CFI signal frame detection regarding its false positives.
-	Debug dump whether non-CFI unwinding as signal frame or not.
-	* src/x86/offsets.h: New signal frame value `LINUX_SC_TRAPNO_PF'.
-
-2006-12-10  Jan Kratochvil  <jan.kratochvil@redhat.com>
-
-	* src/x86/Gfetch_proc_info_post.c: Set `cursor->sigcontext_addr'
-	even for CFI-unwinded signal frames.
-	* src/x86/Make-arch.in: Include `Gfetch_proc_info_post.o'.
-	* include/tdep-x86/libunwind_i.h (tdep_fetch_proc_info_post): Now
-	declaration.
-
-2006-12-10  Jan Kratochvil  <jan.kratochvil@redhat.com>
-
-	* src/x86_64/Gstep.c (unw_step): Fixed debug message exhanged values.
-
-2006-12-10  Jan Kratochvil  <jan.kratochvil@redhat.com>
-
-        * src/x86/Gstep.c (unw_step): Handle the case of `c->dwarf.ip == 0'.
-	* src/x86_64/Gstep.c (code_descriptor_trap): Handle the cases of signal
-	frame leaving stale address due to page fault on an instruction fetch.
-	(unw_step): Call `code_descriptor_trap' above.
-	Debug dump the content of signal frame set from CFI.
-	Handle the case of `c->dwarf.ip == 0'.
-        * src/x86_64/ucontext_i.h: New signal frames fields `err' and `trapno'.
-        * tests/Makefile.in: New `run-ptrace-signull'.
-	* tests/run-ptrace-signull: New (NULL handling: gdb `signull' testcase).
-	* tests/test-ptrace-signull.c: Likewise.
-
-2006-12-10  Jan Kratochvil  <jan.kratochvil@redhat.com>
-
-	* src/x86_64/Gfetch_proc_info_post.c: Set `cursor->sigcontext_addr'
-	even for CFI-unwinded signal frames.
-	* src/dwarf/Gparser.c (fetch_proc_info): Call it.
-	* src/x86_64/Make-arch.in: Include `Gfetch_proc_info_post.o'.
-	* include/tdep-x86_64/libunwind_i.h (tdep_fetch_proc_info_post): New
-	(declaration).
-	* include/tdep-hppa/libunwind_i.h (tdep_fetch_proc_info_post): New
-	(empty definition).
-	* include/tdep-ia64/libunwind_i.h (tdep_fetch_proc_info_post):
-	Likewise.
-	* include/tdep-ppc64/libunwind_i.h (tdep_fetch_proc_info_post):
-	Likewise.
-	* include/tdep-x86/libunwind_i.h (tdep_fetch_proc_info_post):
-	Likewise.
-
-2006-12-10  Jan Kratochvil  <jan.kratochvil@redhat.com>
-
-	* src/elfxx.c (lookup_symbol): Avoid returning irrelevant symbols
-	defined as the last ones before the address in different section.
-
-2006-12-10  Jan Kratochvil  <jan.kratochvil@redhat.com>
-
-	* src/elfxx.c (lookup_symbol): Fixed excessive buffer size requirement.
-
-2006-12-10  Jan Kratochvil  <jan.kratochvil@redhat.com>
-
-	* tests/test-ptrace.c (main): Check for too many unexpected child
-	signals, such as the common `SIGSEGV'.
-
-2006-12-10  Jan Kratochvil  <jan.kratochvil@redhat.com>
-
-	* tests/Gtest-resume-sig.c (handler): Fixed false PASS on non-ia64.
-	Be adaptive to the number of unwinding steps from `SIGUSR1'.
-
-2006-12-10  Jan Kratochvil  <jan.kratochvil@redhat.com>
-
-	* src/dwarf/Gparser.c (apply_reg_state): Handle undefined PC by
-	`c->ip = 0' as in the case of the outermost frame of clone(3).
-
-2006-12-01  Jan Kratochvil  <jan.kratochvil@redhat.com>
-
-	* tests/test-ptrace.c: Fixed `-b' to report missed target function.
-
-2006-11-25  Jan Kratochvil  <jan.kratochvil@redhat.com>
-
-	* tests/test-ptrace.c: Fixed `-b' to never leave a stale child process.
-
-2006-11-24  Jan Kratochvil  <jan.kratochvil@redhat.com>
-
-	* tests/run-ptrace-stepper: Fixed signal frame name for x86_64.
-
-2006-11-24  Jan Kratochvil  <jan.kratochvil@redhat.com>
-
-	* src/Makefile.in (INCFLAGS): Backward compatible $(top_builddir) fix
-	for the autoconf-2.59c compatibility.
-	* tests/Makefile.in (INCFLAGS, LDFLAGS): Likewise.
-
-2006-11-24  Jan Kratochvil  <jan.kratochvil@redhat.com>
-
-	* include/dwarf.h (dwarf_cie_info): New `signal_frame' marker.
-	(dwarf_cursor): New `decrease_ip' marker.
-	* src/dwarf/Gfde.c (parse_cie): Set the `signal_frame' marker.
-	* src/dwarf/Gparser.c (run_cfi_program): Fixed occassionally offbyone
-	`ip' missed CFI instructions, related to `fetch_proc_info'.
-	(fetch_proc_info): Decrease parent `ip' only by `decrease_ip' marker.
-	(is_signal_frame): Detect signal frames by the `signal_frame' marker.
-	(uncached_dwarf_find_save_locs): Update the `decrease_ip' marker.
-	(dwarf_find_save_locs): Likewise.
-	* src/hppa/init.h (common_init): Initialize the `decrease_ip' marker.
-	* src/ppc64/init.h (common_init): Likewise.
-	* src/x86/init.h (common_init): Likewise.
-	* src/x86_64/init.h (common_init): Likewise.
-	* tests/Makefile.in: New `run-ptrace-stepper' and `test-ptrace-stepper'.
-	* tests/test-ptrace.c (backtrace_check): New for `-b'.
-	(do_exit): Variable to support breaking of the `main' mainloop.
-	(do_backtrace): Implemented `-b' based on `backtrace_check'.
-	Fixed compile warning for 32-bit platforms
-	(main): Fixed segfault for some `argv's.
-	Support backtrace option `-b' - `,'-delimited backtrace list to check.
-	Support `do_exit'.
-	* test-ptrace-stepper.c: New, test corner backtrace conditions.
-	* run-ptrace-stepper: New, test `test-ptrace' on `test-ptrace-stepper'.
-
-2006-09-27  Alexandre Oliva  <aoliva@redhat.com>
-
-	* src/elfxx.c (lookup_symbol): Cope with NULL buf and zero buf_len.
-	* src/mi/Gget_proc_name.c (intern_string, get_proc_name): Likewise.
-	* src/hppa/Gget_proc_info.c (unw_get_proc_info): Use it.
-	* src/x86/Gget_proc_info.c (unw_get_proc_info): Likewise.
-	* src/x86_64/Gget_proc_info.c (unw_get_proc_info): Likewise.
-	* doc/unw_get_proc_name.tex: Document NULL buf and zero buf_len.
-	* doc/unw_create_addr_space.tex (get_proc_name): Likewise.
-	* doc/unw_get_proc_name.man: Rebuilt.
-	* doc/unw_create_addr_space.man: Likewise.
-
-2006-09-20	Arun Sharma	<arun.sharma@google.com>
-
-	* src/dwarf/Gparser.c (hash): Fixes the compiler warning on x86-32.
-
-2006-09-20  Alexandre Oliva  <aoliva@redhat.com>
-
-	* src/os-linux.h (maps_next): Don't error out just because
-	path is missing.
-	* include/tdep-hppa/libunwind_i.h (tdep_get_elf_image): Add as
-	and arg to the parameter list.
-	* include/tdep-ia64/libunwind_i.h (tdep_get_elf_image): Ditto.
-	* include/tdep-ppc64/libunwind_i.h (tdep_get_elf_image): Ditto.
-	* include/tdep-x86/libunwind_i.h (tdep_get_elf_image): Ditto.
-	* include/tdep-x86_64/libunwind_i.h (tdep_get_elf_image): Ditto.
-	* src/elfxx.h (get_proc_name): Ditto.
-	* src/elfxx.c (get_proc_name): Ditto.  Adjust.
-	* src/hppa/Ginit.c (get_static_proc_name): Adjust.
-	* src/ia64/Ginit.c (get_static_proc_name): Ditto.
-	* src/ppc64/Ginit.c (get_static_proc_name): Ditto.
-	* src/x86/Ginit.c (get_static_proc_name): Ditto.
-	* src/x86_64/Ginit.c (get_static_proc_name): Ditto.
-	* src/ptrace/_UPT_find_proc_info.c (get_unwind_info): Ditto.
-	* src/ptrace/_UPT_get_proc_name.c (_UPT_get_proc_name): Ditto.
-	* src/os-hpux.c (tdep_get_elf_image): Ditto.
-	* src/os-linux.c (tdep_get_elf_image): Ditto.  Read in 1-page
-	segments that start with the ELF magic.
-	(MAX_VDSO_SIZE): New.
-
-2006-09-16  Alexandre Oliva  <aoliva@redhat.com>
-
-	* src/x86/Gget_proc_info.c (unw_get_proc_info): Use
-	unw_get_proc_name to build a proper proc_info_t.
-	* src/x86_64/Gget_proc_info.c (unw_get_proc_info): Likewise.
-	* src/hppa/Gget_proc_info.c (unw_get_proc_info): Likewise.
-
-2006-09-16  Alexandre Oliva  <aoliva@redhat.com>
-
-	* configure.ac: Don't define UNW_REMOTE_ONLY.
-	* src/os-linux.c: Restore #ifndef removed it previous patch.
-
-2006-09-12  Yao Qi  <qiyaoltc@cn.ibm.com>
-
-	* src/ptrace/_UPT_find_proc_info.c: Add UNW_TARGET_PPC64 in #elif.
-
-2006-09-08	Alexandre Oliva  <aoliva@redhat.com>
-
-	* src/os-linux.c (tdep_get_elf_image): Define for remote only too.
-
-2006-08-29  Wu Zhou  <woodzltc@cn.ibm.com>
-
-	* include/libunwind-ppc64.h: New header file for ppc64 stubs.
-	* include/tdep-ppc64/dwarf-config.h: Ditto.
-	* include/tdep-ppc64/jmpbuf.h: Ditto.
-	* include/tdep-ppc64/libunwind_i.h: Ditto.
-	* include/tdep-ppc64/README: Readme file for this directory.
-	* src/ppc64/Gcreate_addr_space.c: New file for ppc64 stubs.
-	* src/ppc64/Gget_proc_info.c: Ditto.
-	* src/ppc64/Gget_save_loc.c: Ditto.
-	* src/ppc64/Gglobal.c: Ditto.
-	* src/ppc64/Ginit.c: Ditto.
-	* src/ppc64/Ginit_local.c: Ditto.
-	* src/ppc64/Ginit_remote.c: Ditto.
-	* src/ppc64/Gis_signal_frame.c: Ditto.
-	* src/ppc64/Gregs.c: Ditto.
-	* src/ppc64/Gresume.c: Ditto.
-	* src/ppc64/Gstep.c: Ditto.
-	* src/ppc64/init.h: Ditto.
-	* src/ppc64/is_fpreg.c: Ditto.
-	* src/ppc64/longjmp.S: Ditto.
-	* src/ppc64/Make-arch.in: Ditto.
-	* src/ppc64/README: Readme file for directory src/ppc64.
-	* src/ppc64/regname.c: New file for ppc64 stubs.
-	* src/ppc64/setcontext.S: Ditto.
-	* src/ppc64/siglongjmp.S: Ditto.
-	* src/ppc64/ucontext_i.h: Ditto.
-	* src/ppc64/unwind_i.h: Ditto.
-	* src/ptrace/_UPT_reg_offset.c (_UPT_reg_offset): Define empty
-	register offset for target PPC64.
-
-2006-08-17  Stepan Kasal  <kasal@ucw.cz>
-
-	* Makefile.in (installcheck): Another stub target.
-
-2006-08-16  Andrew Cagney  <cagney@redhat.com>
-
-	* Makefile.in (dvi): Add phony target.
-
-2006-08-10  Rick Moseley  <rmoseley@redhat.com>
-
-	* configure.ac: Turn on UNW_REMOTE_ONLY always for Frysk.
-
-2006-07-14  Stepan Kasal  <kasal@ucw.cz>
-
-	* Makefile.in: Do not install for frysk.
-
-2006-07-12  Stepan Kasal  <kasal@ucw.cz>
-
-	* Makefile.in: Add a dangerous temporary implementtation of the
-	``distdir'' target.
-
 ***********************************************************
 
  Discontinued.  See git log instead at
diff --git a/frysk-imports/libunwind/INSTALL b/frysk-imports/libunwind/INSTALL
deleted file mode 100644
index b42a17a..0000000
--- a/frysk-imports/libunwind/INSTALL
+++ /dev/null
@@ -1,182 +0,0 @@
-Basic Installation
-==================
-
-   These are generic installation instructions.
-
-   The `configure' shell script attempts to guess correct values for
-various system-dependent variables used during compilation.  It uses
-those values to create a `Makefile' in each directory of the package.
-It may also create one or more `.h' files containing system-dependent
-definitions.  Finally, it creates a shell script `config.status' that
-you can run in the future to recreate the current configuration, a file
-`config.cache' that saves the results of its tests to speed up
-reconfiguring, and a file `config.log' containing compiler output
-(useful mainly for debugging `configure').
-
-   If you need to do unusual things to compile the package, please try
-to figure out how `configure' could check whether to do them, and mail
-diffs or instructions to the address given in the `README' so they can
-be considered for the next release.  If at some point `config.cache'
-contains results you don't want to keep, you may remove or edit it.
-
-   The file `configure.in' is used to create `configure' by a program
-called `autoconf'.  You only need `configure.in' if you want to change
-it or regenerate `configure' using a newer version of `autoconf'.
-
-The simplest way to compile this package is:
-
-  1. `cd' to the directory containing the package's source code and type
-     `./configure' to configure the package for your system.  If you're
-     using `csh' on an old version of System V, you might need to type
-     `sh ./configure' instead to prevent `csh' from trying to execute
-     `configure' itself.
-
-     Running `configure' takes awhile.  While running, it prints some
-     messages telling which features it is checking for.
-
-  2. Type `make' to compile the package.
-
-  3. Optionally, type `make check' to run any self-tests that come with
-     the package.
-
-  4. Type `make install' to install the programs and any data files and
-     documentation.
-
-  5. You can remove the program binaries and object files from the
-     source code directory by typing `make clean'.  To also remove the
-     files that `configure' created (so you can compile the package for
-     a different kind of computer), type `make distclean'.  There is
-     also a `make maintainer-clean' target, but that is intended mainly
-     for the package's developers.  If you use it, you may have to get
-     all sorts of other programs in order to regenerate files that came
-     with the distribution.
-
-Compilers and Options
-=====================
-
-   Some systems require unusual options for compilation or linking that
-the `configure' script does not know about.  You can give `configure'
-initial values for variables by setting them in the environment.  Using
-a Bourne-compatible shell, you can do that on the command line like
-this:
-     CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
-
-Or on systems that have the `env' program, you can do it like this:
-     env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
-
-Compiling For Multiple Architectures
-====================================
-
-   You can compile the package for more than one kind of computer at the
-same time, by placing the object files for each architecture in their
-own directory.  To do this, you must use a version of `make' that
-supports the `VPATH' variable, such as GNU `make'.  `cd' to the
-directory where you want the object files and executables to go and run
-the `configure' script.  `configure' automatically checks for the
-source code in the directory that `configure' is in and in `..'.
-
-   If you have to use a `make' that does not supports the `VPATH'
-variable, you have to compile the package for one architecture at a time
-in the source code directory.  After you have installed the package for
-one architecture, use `make distclean' before reconfiguring for another
-architecture.
-
-Installation Names
-==================
-
-   By default, `make install' will install the package's files in
-`/usr/local/bin', `/usr/local/man', etc.  You can specify an
-installation prefix other than `/usr/local' by giving `configure' the
-option `--prefix=PATH'.
-
-   You can specify separate installation prefixes for
-architecture-specific files and architecture-independent files.  If you
-give `configure' the option `--exec-prefix=PATH', the package will use
-PATH as the prefix for installing programs and libraries.
-Documentation and other data files will still use the regular prefix.
-
-   In addition, if you use an unusual directory layout you can give
-options like `--bindir=PATH' to specify different values for particular
-kinds of files.  Run `configure --help' for a list of the directories
-you can set and what kinds of files go in them.
-
-   If the package supports it, you can cause programs to be installed
-with an extra prefix or suffix on their names by giving `configure' the
-option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
-
-Optional Features
-=================
-
-   Some packages pay attention to `--enable-FEATURE' options to
-`configure', where FEATURE indicates an optional part of the package.
-They may also pay attention to `--with-PACKAGE' options, where PACKAGE
-is something like `gnu-as' or `x' (for the X Window System).  The
-`README' should mention any `--enable-' and `--with-' options that the
-package recognizes.
-
-   For packages that use the X Window System, `configure' can usually
-find the X include and library files automatically, but if it doesn't,
-you can use the `configure' options `--x-includes=DIR' and
-`--x-libraries=DIR' to specify their locations.
-
-Specifying the System Type
-==========================
-
-   There may be some features `configure' can not figure out
-automatically, but needs to determine by the type of host the package
-will run on.  Usually `configure' can figure that out, but if it prints
-a message saying it can not guess the host type, give it the
-`--host=TYPE' option.  TYPE can either be a short name for the system
-type, such as `sun4', or a canonical name with three fields:
-     CPU-COMPANY-SYSTEM
-
-See the file `config.sub' for the possible values of each field.  If
-`config.sub' isn't included in this package, then this package doesn't
-need to know the host type.
-
-   If you are building compiler tools for cross-compiling, you can also
-use the `--target=TYPE' option to select the type of system they will
-produce code for and the `--build=TYPE' option to select the type of
-system on which you are compiling the package.
-
-Sharing Defaults
-================
-
-   If you want to set default values for `configure' scripts to share,
-you can create a site shell script called `config.site' that gives
-default values for variables like `CC', `cache_file', and `prefix'.
-`configure' looks for `PREFIX/share/config.site' if it exists, then
-`PREFIX/etc/config.site' if it exists.  Or, you can set the
-`CONFIG_SITE' environment variable to the location of the site script.
-A warning: not all `configure' scripts look for a site script.
-
-Operation Controls
-==================
-
-   `configure' recognizes the following options to control how it
-operates.
-
-`--cache-file=FILE'
-     Use and save the results of the tests in FILE instead of
-     `./config.cache'.  Set FILE to `/dev/null' to disable caching, for
-     debugging `configure'.
-
-`--help'
-     Print a summary of the options to `configure', and exit.
-
-`--quiet'
-`--silent'
-`-q'
-     Do not print messages saying which checks are being made.  To
-     suppress all normal output, redirect it to `/dev/null' (any error
-     messages will still be shown).
-
-`--srcdir=DIR'
-     Look for the package's source code in directory DIR.  Usually
-     `configure' can determine that directory automatically.
-
-`--version'
-     Print the version of Autoconf used to generate the `configure'
-     script, and exit.
-
-`configure' also accepts some other, not widely useful, options.
diff --git a/frysk-imports/libunwind/Makefile.am b/frysk-imports/libunwind/Makefile.am
index e31e23e..6a3ed9e 100644
--- a/frysk-imports/libunwind/Makefile.am
+++ b/frysk-imports/libunwind/Makefile.am
@@ -1,67 +1,96 @@
+include_HEADERS = include/libunwind-dynamic.h \
+    include/libunwind-ptrace.h \
+    include/libunwind-coredump.h
+
+if ARCH_AARCH64
+include_HEADERS += include/libunwind-aarch64.h
+endif
 if ARCH_ARM
-include_HEADERS_tdep = include/libunwind-arm.h
-else
+include_HEADERS += include/libunwind-arm.h
+endif
 if ARCH_IA64
-include_HEADERS_tdep = include/libunwind-ia64.h
-else
+include_HEADERS += include/libunwind-ia64.h
+endif
 if ARCH_HPPA
-include_HEADERS_tdep = include/libunwind-hppa.h
-else
+include_HEADERS += include/libunwind-hppa.h
+endif
 if ARCH_MIPS
-include_HEADERS_tdep = include/libunwind-mips.h
-else
+include_HEADERS += include/libunwind-mips.h
+endif
+if ARCH_TILEGX
+include_HEADERS += include/libunwind-tilegx.h
+endif
 if ARCH_X86
-include_HEADERS_tdep = include/libunwind-x86.h
-else
+include_HEADERS += include/libunwind-x86.h
+endif
 if ARCH_X86_64
-include_HEADERS_tdep = include/libunwind-x86_64.h
-else
+include_HEADERS += include/libunwind-x86_64.h
+endif
 if ARCH_PPC32
-include_HEADERS_tdep = include/libunwind-ppc32.h
-else
+include_HEADERS += include/libunwind-ppc32.h
+endif
 if ARCH_PPC64
-include_HEADERS_tdep = include/libunwind-ppc64.h
-endif # ARCH_PPC64
-endif # ARCH_PPC32
-endif # ARCH_X86_64
-endif # ARCH_X86
-endif # ARCH_MIPS
-endif # ARCH_HPPA
-endif # ARCH_IA64
-endif # ARCH_ARM
-
-include_HEADERS_common = $(include_HEADERS_tdep)		\
-	include/libunwind-dynamic.h include/libunwind-ptrace.h
+include_HEADERS += include/libunwind-ppc64.h
+endif
+if ARCH_SH
+include_HEADERS += include/libunwind-sh.h
+endif
 
-if REMOTE_ONLY
-  include_HEADERS = $(include_HEADERS_common)
-else
-  include_HEADERS = $(include_HEADERS_common) include/libunwind.h \
-		    include/unwind.h
+if !REMOTE_ONLY
+include_HEADERS += include/libunwind.h include/unwind.h
 endif
 
 nodist_include_HEADERS = include/libunwind-common.h
 
-# FRYSK LOCAL
-# Exclude the docs since we don't want to build or install them.
 SUBDIRS = src tests
-# END FRYSK LOCAL
 
-EXTRA_DIST = include/dwarf.h include/dwarf_i.h include/dwarf-eh.h	\
-	include/libunwind_i.h include/mempool.h				\
+if CONFIG_DOCS
+SUBDIRS += doc
+endif
+
+noinst_HEADERS = include/dwarf.h include/dwarf_i.h include/dwarf-eh.h	\
+	include/compiler.h include/libunwind_i.h include/mempool.h	\
 	include/remote.h						\
-	include/libunwind-common.h.in					\
-	include/libunwind-ia64.h include/tdep-ia64/libunwind_i.h	\
+	include/tdep-aarch64/dwarf-config.h				\
+	include/tdep-aarch64/jmpbuf.h					\
+	include/tdep-aarch64/libunwind_i.h				\
+	include/tdep-arm/dwarf-config.h	include/tdep-arm/ex_tables.h	\
+	include/tdep-arm/jmpbuf.h include/tdep-arm/libunwind_i.h	\
 	include/tdep-ia64/jmpbuf.h include/tdep-ia64/rse.h 		\
-	include/tdep-ia64/script.h					\
-	include/libunwind-hppa.h include/tdep-hppa/libunwind_i.h	\
+	include/tdep-ia64/libunwind_i.h	include/tdep-ia64/script.h	\
+	include/tdep-hppa/libunwind_i.h					\
 	include/tdep-hppa/jmpbuf.h include/tdep-hppa/dwarf-config.h	\
-	include/libunwind-x86.h include/tdep-x86/libunwind_i.h		\
+	include/tdep-mips/libunwind_i.h					\
+	include/tdep-mips/jmpbuf.h include/tdep-mips/dwarf-config.h	\
+	include/tdep-tilegx/libunwind_i.h				\
+	include/tdep-tilegx/jmpbuf.h include/tdep-tilegx/dwarf-config.h	\
+	include/tdep-x86/libunwind_i.h					\
 	include/tdep-x86/jmpbuf.h include/tdep-x86/dwarf-config.h	\
-	include/libunwind-x86_64.h include/tdep-x86_64/libunwind_i.h	\
+	include/tdep-x86_64/libunwind_i.h				\
 	include/tdep-x86_64/jmpbuf.h include/tdep-x86_64/dwarf-config.h \
-	include/libunwind-ppc64.h include/tdep-ppc64/dwarf-config.h     \
+	include/tdep-ppc32/dwarf-config.h				\
 	include/tdep-ppc32/jmpbuf.h include/tdep-ppc32/libunwind_i.h	\
-	include/tdep-ppc64/jmpbuf.h include/tdep-ppc64/libunwind_i.h
+	include/tdep-ppc64/dwarf-config.h				\
+	include/tdep-ppc64/jmpbuf.h include/tdep-ppc64/libunwind_i.h	\
+	include/tdep-sh/dwarf-config.h					\
+	include/tdep-sh/jmpbuf.h include/tdep-sh/libunwind_i.h		\
+	include/tdep/libunwind_i.h					\
+	include/tdep/jmpbuf.h include/tdep/dwarf-config.h
+
+EXTRA_DIST = include/libunwind-common.h.in
+
+MAINTAINERCLEANFILES = \
+	Makefile.in \
+	INSTALL \
+	aclocal.m4 \
+	configure \
+	config/compile \
+	config/config.guess \
+	config/config.sub \
+	config/depcomp \
+	config/install-sh \
+	config/ltmain.sh \
+	config/missing \
+	include/config.h.in \
+	include/config.h.in~
 
-DISTCLEANFILES = include/libunwind.h include/tdep
diff --git a/frysk-imports/libunwind/NEWS b/frysk-imports/libunwind/NEWS
index 83ac810..e26d1c9 100644
--- a/frysk-imports/libunwind/NEWS
+++ b/frysk-imports/libunwind/NEWS
@@ -1,5 +1,23 @@
 -*-Mode: outline-*-
 
+* News for v1.1:
+
+** coredump unwind support
+** New arch: SuperH
+** Improved support for PowerPC, ARM
+** Lots of cleanups, perf tweaks
+** pkg-config support
+
+* News for v1.0:
+
+** Fast unwind (rbp, rsp, rip only) on x86_64 with a fallback to 
+   slow code path (Lassi Tuura)
+** Improved local and remote unwinding on ARM (Ken Werner)
+** Testing, stability and many fixes on x86 (Paul Pluzhnikov)
+** FreeBSD port and clean separation of OS specific bits 
+   (Konstantin Belousov)
+** Thanks for all the bug reports, contributions and testing!
+
 * News for v0.99:
 
 ** Greatly improved x86-64 support thanks to Arun Sharma.
diff --git a/frysk-imports/libunwind/README b/frysk-imports/libunwind/README
index 180edd2..cadffc1 100644
--- a/frysk-imports/libunwind/README
+++ b/frysk-imports/libunwind/README
@@ -1,21 +1,27 @@
 -*- mode: Outline -*-
 
-This is version 0.99 of the unwind library.  This library supports
+This is version 1.0 of the unwind library.  This library supports
 several architecture/operating-system combinations:
 
- Linux/IA-64:	Fully tested and supported.
  Linux/x86-64:	Works well.
- Linux/x86:	Works well, but C library is missing some unwind-info.
+ Linux/x86:	Works well.
+ Linux/ARM:	Works well.
+ Linux/IA-64:	Fully tested and supported.
  Linux/PARISC:	Works well, but C library missing unwind-info.
  HP-UX/IA-64:	Mostly works but known to have some serious limitations.
+ Linux/AArch64:	Newly added.
  Linux/PPC64:	Newly added.
-
+ Linux/SuperH:	Newly added.
+ FreeBSD/i386:	Newly added.
+ FreeBSD/x86-64: Newly added (FreeBSD architecture is known as amd64).
+ Linux/Tilegx:  Newly added (64-bit mode only).
 
 * General Build Instructions
 
 In general, this library can be built and installed with the following
 commands:
 
+	$ ./autogen.sh # Needed only for building from git. Depends on libtool.
 	$ ./configure
 	$ make
 	$ make install prefix=PREFIX
@@ -79,6 +85,14 @@ If libunwind seems to not work (backtracing failing), try to compile
 it with -O0, without optimizations. There are some compiler problems
 depending on the version of your gcc.
 
+* Building on FreeBSD
+
+General building instructions apply. To build and execute several tests,
+you need libexecinfo library available in ports as devel/libexecinfo.
+
+Development of the port was done of FreeBSD 8.0-STABLE. The library
+was build with the system compiler that is modified version of gcc 4.2.1,
+as well as the gcc 4.4.3.
 
 * Regression Testing
 
diff --git a/frysk-imports/libunwind/README.frysk b/frysk-imports/libunwind/README.frysk
deleted file mode 100644
index a643b10..0000000
--- a/frysk-imports/libunwind/README.frysk
+++ /dev/null
@@ -1,2 +0,0 @@
-This is a modified version of libunwind.  The official version is
-hosted at http://www.nongnu.org/libunwind/
diff --git a/frysk-imports/libunwind/autogen.sh b/frysk-imports/libunwind/autogen.sh
new file mode 100755
index 0000000..b08bc83
--- /dev/null
+++ b/frysk-imports/libunwind/autogen.sh
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+test -n "$srcdir" || srcdir=`dirname "$0"`
+test -n "$srcdir" || srcdir=.
+(
+  cd "$srcdir" &&
+  autoreconf --force -v --install
+) || exit
+test -n "$NOCONFIGURE" || "$srcdir/configure" "$@"
diff --git a/frysk-imports/libunwind/aux/ltmain.sh b/frysk-imports/libunwind/aux/ltmain.sh
new file mode 100644
index 0000000..6fc6900
--- /dev/null
+++ b/frysk-imports/libunwind/aux/ltmain.sh
@@ -0,0 +1,5107 @@
+# ltmain.sh - Provide generalized library-building support services.
+# NOTE: Changing this file will not affect anything until you rerun configure.
+#
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
+# Free Software Foundation, Inc.
+# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Check that we have a working $echo.
+if test "X$1" = X--no-reexec; then
+  # Discard the --no-reexec flag, and continue.
+  shift
+elif test "X$1" = X--fallback-echo; then
+  # Avoid inline document here, it may be left over
+  :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then
+  # Yippee, $echo works!
+  :
+else
+  # Restart under the correct shell, and then maybe $echo will work.
+  exec $SHELL "$0" --no-reexec ${1+"$@"}
+fi
+
+if test "X$1" = X--fallback-echo; then
+  # used as fallback echo
+  shift
+  cat <<EOF
+$*
+EOF
+  exit 0
+fi
+
+# The name of this program.
+progname=`$echo "$0" | ${SED} 's%^.*/%%'`
+modename="$progname"
+
+# Constants.
+PROGRAM=ltmain.sh
+PACKAGE=libtool
+VERSION=1.4.3
+TIMESTAMP=" (1.922.2.111 2002/10/23 02:54:36)"
+
+default_mode=
+help="Try \`$progname --help' for more information."
+magic="%%%MAGIC variable%%%"
+mkdir="mkdir"
+mv="mv -f"
+rm="rm -f"
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed="${SED}"' -e 1s/^X//'
+sed_quote_subst='s/\([\\`\\"$\\\\]\)/\\\1/g'
+# test EBCDIC or ASCII                                                         
+case `echo A|od -x` in                                                         
+ *[Cc]1*) # EBCDIC based system                                                
+  SP2NL="tr '\100' '\n'"                                                       
+  NL2SP="tr '\r\n' '\100\100'"                                                 
+  ;;                                                                           
+ *) # Assume ASCII based system                                                
+  SP2NL="tr '\040' '\012'"                                                     
+  NL2SP="tr '\015\012' '\040\040'"                                             
+  ;;                                                                           
+esac                                                                           
+
+# NLS nuisances.
+# Only set LANG and LC_ALL to C if already set.
+# These must not be set unconditionally because not all systems understand
+# e.g. LANG=C (notably SCO).
+# We save the old values to restore during execute mode.
+if test "${LC_ALL+set}" = set; then
+  save_LC_ALL="$LC_ALL"; LC_ALL=C; export LC_ALL
+fi
+if test "${LANG+set}" = set; then
+  save_LANG="$LANG"; LANG=C; export LANG
+fi
+
+# Make sure IFS has a sensible default
+: ${IFS=" 	"}
+
+if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
+  echo "$modename: not configured to build any kind of library" 1>&2
+  echo "Fatal configuration error.  See the $PACKAGE docs for more information." 1>&2
+  exit 1
+fi
+
+# Global variables.
+mode=$default_mode
+nonopt=
+prev=
+prevopt=
+run=
+show="$echo"
+show_help=
+execute_dlfiles=
+lo2o="s/\\.lo\$/.${objext}/"
+o2lo="s/\\.${objext}\$/.lo/"
+
+# Parse our command line options once, thoroughly.
+while test $# -gt 0
+do
+  arg="$1"
+  shift
+
+  case $arg in
+  -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;;
+  *) optarg= ;;
+  esac
+
+  # If the previous option needs an argument, assign it.
+  if test -n "$prev"; then
+    case $prev in
+    execute_dlfiles)
+      execute_dlfiles="$execute_dlfiles $arg"
+      ;;
+    *)
+      eval "$prev=\$arg"
+      ;;
+    esac
+
+    prev=
+    prevopt=
+    continue
+  fi
+
+  # Have we seen a non-optional argument yet?
+  case $arg in
+  --help)
+    show_help=yes
+    ;;
+
+  --version)
+    echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP"
+    exit 0
+    ;;
+
+  --config)
+    ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $0
+    exit 0
+    ;;
+
+  --debug)
+    echo "$progname: enabling shell trace mode"
+    set -x
+    ;;
+
+  --dry-run | -n)
+    run=:
+    ;;
+
+  --features)
+    echo "host: $host"
+    if test "$build_libtool_libs" = yes; then
+      echo "enable shared libraries"
+    else
+      echo "disable shared libraries"
+    fi
+    if test "$build_old_libs" = yes; then
+      echo "enable static libraries"
+    else
+      echo "disable static libraries"
+    fi
+    exit 0
+    ;;
+
+  --finish) mode="finish" ;;
+
+  --mode) prevopt="--mode" prev=mode ;;
+  --mode=*) mode="$optarg" ;;
+
+  --preserve-dup-deps) duplicate_deps="yes" ;;
+
+  --quiet | --silent)
+    show=:
+    ;;
+
+  -dlopen)
+    prevopt="-dlopen"
+    prev=execute_dlfiles
+    ;;
+
+  -*)
+    $echo "$modename: unrecognized option \`$arg'" 1>&2
+    $echo "$help" 1>&2
+    exit 1
+    ;;
+
+  *)
+    nonopt="$arg"
+    break
+    ;;
+  esac
+done
+
+if test -n "$prevopt"; then
+  $echo "$modename: option \`$prevopt' requires an argument" 1>&2
+  $echo "$help" 1>&2
+  exit 1
+fi
+
+# If this variable is set in any of the actions, the command in it
+# will be execed at the end.  This prevents here-documents from being
+# left over by shells.
+exec_cmd=
+
+if test -z "$show_help"; then
+
+  # Infer the operation mode.
+  if test -z "$mode"; then
+    case $nonopt in
+    *cc | *++ | gcc* | *-gcc* | g++* | xlc*)
+      mode=link
+      for arg
+      do
+	case $arg in
+	-c)
+	   mode=compile
+	   break
+	   ;;
+	esac
+      done
+      ;;
+    *db | *dbx | *strace | *truss)
+      mode=execute
+      ;;
+    *install*|cp|mv)
+      mode=install
+      ;;
+    *rm)
+      mode=uninstall
+      ;;
+    *)
+      # If we have no mode, but dlfiles were specified, then do execute mode.
+      test -n "$execute_dlfiles" && mode=execute
+
+      # Just use the default operation mode.
+      if test -z "$mode"; then
+	if test -n "$nonopt"; then
+	  $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2
+	else
+	  $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2
+	fi
+      fi
+      ;;
+    esac
+  fi
+
+  # Only execute mode is allowed to have -dlopen flags.
+  if test -n "$execute_dlfiles" && test "$mode" != execute; then
+    $echo "$modename: unrecognized option \`-dlopen'" 1>&2
+    $echo "$help" 1>&2
+    exit 1
+  fi
+
+  # Change the help message to a mode-specific one.
+  generic_help="$help"
+  help="Try \`$modename --help --mode=$mode' for more information."
+
+  # These modes are in order of execution frequency so that they run quickly.
+  case $mode in
+  # libtool compile mode
+  compile)
+    modename="$modename: compile"
+    # Get the compilation command and the source file.
+    base_compile=
+    prev=
+    lastarg=
+    srcfile="$nonopt"
+    suppress_output=
+
+    user_target=no
+    for arg
+    do
+      case $prev in
+      "") ;;
+      xcompiler)
+	# Aesthetically quote the previous argument.
+	prev=
+	lastarg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+
+	case $arg in
+	# Double-quote args containing other shell metacharacters.
+	# Many Bourne shells cannot handle close brackets correctly
+	# in scan sets, so we specify it separately.
+	*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	  arg="\"$arg\""
+	  ;;
+	esac
+
+	# Add the previous argument to base_compile.
+	if test -z "$base_compile"; then
+	  base_compile="$lastarg"
+	else
+	  base_compile="$base_compile $lastarg"
+	fi
+	continue
+	;;
+      esac
+
+      # Accept any command-line options.
+      case $arg in
+      -o)
+	if test "$user_target" != "no"; then
+	  $echo "$modename: you cannot specify \`-o' more than once" 1>&2
+	  exit 1
+	fi
+	user_target=next
+	;;
+
+      -static)
+	build_old_libs=yes
+	continue
+	;;
+
+      -prefer-pic)
+	pic_mode=yes
+	continue
+	;;
+
+      -prefer-non-pic)
+	pic_mode=no
+	continue
+	;;
+
+      -Xcompiler)
+	prev=xcompiler
+	continue
+	;;
+
+      -Wc,*)
+	args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"`
+	lastarg=
+	save_ifs="$IFS"; IFS=','
+	for arg in $args; do
+	  IFS="$save_ifs"
+
+	  # Double-quote args containing other shell metacharacters.
+	  # Many Bourne shells cannot handle close brackets correctly
+	  # in scan sets, so we specify it separately.
+	  case $arg in
+	    *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	    arg="\"$arg\""
+	    ;;
+	  esac
+	  lastarg="$lastarg $arg"
+	done
+	IFS="$save_ifs"
+	lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"`
+
+	# Add the arguments to base_compile.
+	if test -z "$base_compile"; then
+	  base_compile="$lastarg"
+	else
+	  base_compile="$base_compile $lastarg"
+	fi
+	continue
+	;;
+      esac
+
+      case $user_target in
+      next)
+	# The next one is the -o target name
+	user_target=yes
+	continue
+	;;
+      yes)
+	# We got the output file
+	user_target=set
+	libobj="$arg"
+	continue
+	;;
+      esac
+
+      # Accept the current argument as the source file.
+      lastarg="$srcfile"
+      srcfile="$arg"
+
+      # Aesthetically quote the previous argument.
+
+      # Backslashify any backslashes, double quotes, and dollar signs.
+      # These are the only characters that are still specially
+      # interpreted inside of double-quoted scrings.
+      lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"`
+
+      # Double-quote args containing other shell metacharacters.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, so we specify it separately.
+      case $lastarg in
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	lastarg="\"$lastarg\""
+	;;
+      esac
+
+      # Add the previous argument to base_compile.
+      if test -z "$base_compile"; then
+	base_compile="$lastarg"
+      else
+	base_compile="$base_compile $lastarg"
+      fi
+    done
+
+    case $user_target in
+    set)
+      ;;
+    no)
+      # Get the name of the library object.
+      libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'`
+      ;;
+    *)
+      $echo "$modename: you must specify a target with \`-o'" 1>&2
+      exit 1
+      ;;
+    esac
+
+    # Recognize several different file suffixes.
+    # If the user specifies -o file.o, it is replaced with file.lo
+    xform='[cCFSfmso]'
+    case $libobj in
+    *.ada) xform=ada ;;
+    *.adb) xform=adb ;;
+    *.ads) xform=ads ;;
+    *.asm) xform=asm ;;
+    *.c++) xform=c++ ;;
+    *.cc) xform=cc ;;
+    *.cpp) xform=cpp ;;
+    *.cxx) xform=cxx ;;
+    *.f90) xform=f90 ;;
+    *.for) xform=for ;;
+    esac
+
+    libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"`
+
+    case $libobj in
+    *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;;
+    *)
+      $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2
+      exit 1
+      ;;
+    esac
+
+    if test -z "$base_compile"; then
+      $echo "$modename: you must specify a compilation command" 1>&2
+      $echo "$help" 1>&2
+      exit 1
+    fi
+
+    # Delete any leftover library objects.
+    if test "$build_old_libs" = yes; then
+      removelist="$obj $libobj"
+    else
+      removelist="$libobj"
+    fi
+
+    $run $rm $removelist
+    trap "$run $rm $removelist; exit 1" 1 2 15
+
+    # On Cygwin there's no "real" PIC flag so we must build both object types
+    case $host_os in
+    cygwin* | mingw* | pw32* | os2*)
+      pic_mode=default
+      ;;
+    esac
+    if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
+      # non-PIC code in shared libraries is not supported
+      pic_mode=default
+    fi
+
+    # Calculate the filename of the output object if compiler does
+    # not support -o with -c
+    if test "$compiler_c_o" = no; then
+      output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext}
+      lockfile="$output_obj.lock"
+      removelist="$removelist $output_obj $lockfile"
+      trap "$run $rm $removelist; exit 1" 1 2 15
+    else
+      need_locks=no
+      lockfile=
+    fi
+
+    # Lock this critical section if it is needed
+    # We use this script file to make the link, it avoids creating a new file
+    if test "$need_locks" = yes; then
+      until $run ln "$0" "$lockfile" 2>/dev/null; do
+	$show "Waiting for $lockfile to be removed"
+	sleep 2
+      done
+    elif test "$need_locks" = warn; then
+      if test -f "$lockfile"; then
+	echo "\
+*** ERROR, $lockfile exists and contains:
+`cat $lockfile 2>/dev/null`
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$run $rm $removelist
+	exit 1
+      fi
+      echo $srcfile > "$lockfile"
+    fi
+
+    if test -n "$fix_srcfile_path"; then
+      eval srcfile=\"$fix_srcfile_path\"
+    fi
+
+    # Only build a PIC object if we are building libtool libraries.
+    if test "$build_libtool_libs" = yes; then
+      # Without this assignment, base_compile gets emptied.
+      fbsd_hideous_sh_bug=$base_compile
+
+      if test "$pic_mode" != no; then
+	# All platforms use -DPIC, to notify preprocessed assembler code.
+	command="$base_compile $srcfile $pic_flag -DPIC"
+      else
+	# Don't build PIC code
+	command="$base_compile $srcfile"
+      fi
+      if test "$build_old_libs" = yes; then
+	lo_libobj="$libobj"
+	dir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'`
+	if test "X$dir" = "X$libobj"; then
+	  dir="$objdir"
+	else
+	  dir="$dir/$objdir"
+	fi
+	libobj="$dir/"`$echo "X$libobj" | $Xsed -e 's%^.*/%%'`
+
+	if test -d "$dir"; then
+	  $show "$rm $libobj"
+	  $run $rm $libobj
+	else
+	  $show "$mkdir $dir"
+	  $run $mkdir $dir
+	  status=$?
+	  if test $status -ne 0 && test ! -d $dir; then
+	    exit $status
+	  fi
+	fi
+      fi
+      if test "$compiler_o_lo" = yes; then
+	output_obj="$libobj"
+	command="$command -o $output_obj"
+      elif test "$compiler_c_o" = yes; then
+	output_obj="$obj"
+	command="$command -o $output_obj"
+      fi
+
+      $run $rm "$output_obj"
+      $show "$command"
+      if $run eval "$command"; then :
+      else
+	test -n "$output_obj" && $run $rm $removelist
+	exit 1
+      fi
+
+      if test "$need_locks" = warn &&
+	 test x"`cat $lockfile 2>/dev/null`" != x"$srcfile"; then
+	echo "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$run $rm $removelist
+	exit 1
+      fi
+
+      # Just move the object if needed, then go on to compile the next one
+      if test x"$output_obj" != x"$libobj"; then
+	$show "$mv $output_obj $libobj"
+	if $run $mv $output_obj $libobj; then :
+	else
+	  error=$?
+	  $run $rm $removelist
+	  exit $error
+	fi
+      fi
+
+      # If we have no pic_flag, then copy the object into place and finish.
+      if (test -z "$pic_flag" || test "$pic_mode" != default) &&
+	 test "$build_old_libs" = yes; then
+	# Rename the .lo from within objdir to obj
+	if test -f $obj; then
+	  $show $rm $obj
+	  $run $rm $obj
+	fi
+
+	$show "$mv $libobj $obj"
+	if $run $mv $libobj $obj; then :
+	else
+	  error=$?
+	  $run $rm $removelist
+	  exit $error
+	fi
+
+	xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'`
+	if test "X$xdir" = "X$obj"; then
+	  xdir="."
+	else
+	  xdir="$xdir"
+	fi
+	baseobj=`$echo "X$obj" | $Xsed -e "s%.*/%%"`
+	libobj=`$echo "X$baseobj" | $Xsed -e "$o2lo"`
+	# Now arrange that obj and lo_libobj become the same file
+	$show "(cd $xdir && $LN_S $baseobj $libobj)"
+	if $run eval '(cd $xdir && $LN_S $baseobj $libobj)'; then
+	  # Unlock the critical section if it was locked
+	  if test "$need_locks" != no; then
+	    $run $rm "$lockfile"
+	  fi
+	  exit 0
+	else
+	  error=$?
+	  $run $rm $removelist
+	  exit $error
+	fi
+      fi
+
+      # Allow error messages only from the first compilation.
+      suppress_output=' >/dev/null 2>&1'
+    fi
+
+    # Only build a position-dependent object if we build old libraries.
+    if test "$build_old_libs" = yes; then
+      if test "$pic_mode" != yes; then
+	# Don't build PIC code
+	command="$base_compile $srcfile"
+      else
+	# All platforms use -DPIC, to notify preprocessed assembler code.
+	command="$base_compile $srcfile $pic_flag -DPIC"
+      fi
+      if test "$compiler_c_o" = yes; then
+	command="$command -o $obj"
+	output_obj="$obj"
+      fi
+
+      # Suppress compiler output if we already did a PIC compilation.
+      command="$command$suppress_output"
+      $run $rm "$output_obj"
+      $show "$command"
+      if $run eval "$command"; then :
+      else
+	$run $rm $removelist
+	exit 1
+      fi
+
+      if test "$need_locks" = warn &&
+	 test x"`cat $lockfile 2>/dev/null`" != x"$srcfile"; then
+	echo "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$run $rm $removelist
+	exit 1
+      fi
+
+      # Just move the object if needed
+      if test x"$output_obj" != x"$obj"; then
+	$show "$mv $output_obj $obj"
+	if $run $mv $output_obj $obj; then :
+	else
+	  error=$?
+	  $run $rm $removelist
+	  exit $error
+	fi
+      fi
+
+      # Create an invalid libtool object if no PIC, so that we do not
+      # accidentally link it into a program.
+      if test "$build_libtool_libs" != yes; then
+	$show "echo timestamp > $libobj"
+	$run eval "echo timestamp > \$libobj" || exit $?
+      else
+	# Move the .lo from within objdir
+	$show "$mv $libobj $lo_libobj"
+	if $run $mv $libobj $lo_libobj; then :
+	else
+	  error=$?
+	  $run $rm $removelist
+	  exit $error
+	fi
+      fi
+    fi
+
+    # Unlock the critical section if it was locked
+    if test "$need_locks" != no; then
+      $run $rm "$lockfile"
+    fi
+
+    exit 0
+    ;;
+
+  # libtool link mode
+  link | relink)
+    modename="$modename: link"
+    case $host in
+    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+      # It is impossible to link a dll without this setting, and
+      # we shouldn't force the makefile maintainer to figure out
+      # which system we are compiling for in order to pass an extra
+      # flag for every libtool invokation.
+      # allow_undefined=no
+
+      # FIXME: Unfortunately, there are problems with the above when trying
+      # to make a dll which has undefined symbols, in which case not
+      # even a static library is built.  For now, we need to specify
+      # -no-undefined on the libtool link line when we can be certain
+      # that all symbols are satisfied, otherwise we get a static library.
+      allow_undefined=yes
+      ;;
+    *)
+      allow_undefined=yes
+      ;;
+    esac
+    libtool_args="$nonopt"
+    compile_command="$nonopt"
+    finalize_command="$nonopt"
+
+    compile_rpath=
+    finalize_rpath=
+    compile_shlibpath=
+    finalize_shlibpath=
+    convenience=
+    old_convenience=
+    deplibs=
+    old_deplibs=
+    compiler_flags=
+    linker_flags=
+    dllsearchpath=
+    lib_search_path=`pwd`
+    inst_prefix_dir=
+
+    avoid_version=no
+    dlfiles=
+    dlprefiles=
+    dlself=no
+    export_dynamic=no
+    export_symbols=
+    export_symbols_regex=
+    generated=
+    libobjs=
+    ltlibs=
+    module=no
+    no_install=no
+    objs=
+    prefer_static_libs=no
+    preload=no
+    prev=
+    prevarg=
+    release=
+    rpath=
+    xrpath=
+    perm_rpath=
+    temp_rpath=
+    thread_safe=no
+    vinfo=
+
+    # We need to know -static, to get the right output filenames.
+    for arg
+    do
+      case $arg in
+      -all-static | -static)
+	if test "X$arg" = "X-all-static"; then
+	  if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
+	    $echo "$modename: warning: complete static linking is impossible in this configuration" 1>&2
+	  fi
+	  if test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	else
+	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	fi
+	build_libtool_libs=no
+	build_old_libs=yes
+	prefer_static_libs=yes
+	break
+	;;
+      esac
+    done
+
+    # See if our shared archives depend on static archives.
+    test -n "$old_archive_from_new_cmds" && build_old_libs=yes
+
+    # Go through the arguments, transforming them on the way.
+    while test $# -gt 0; do
+      arg="$1"
+      shift
+      case $arg in
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test
+	;;
+      *) qarg=$arg ;;
+      esac
+      libtool_args="$libtool_args $qarg"
+
+      # If the previous option needs an argument, assign it.
+      if test -n "$prev"; then
+	case $prev in
+	output)
+	  compile_command="$compile_command @OUTPUT@"
+	  finalize_command="$finalize_command @OUTPUT@"
+	  ;;
+	esac
+
+	case $prev in
+	dlfiles|dlprefiles)
+	  if test "$preload" = no; then
+	    # Add the symbol object into the linking commands.
+	    compile_command="$compile_command @SYMFILE@"
+	    finalize_command="$finalize_command @SYMFILE@"
+	    preload=yes
+	  fi
+	  case $arg in
+	  *.la | *.lo) ;;  # We handle these cases below.
+	  force)
+	    if test "$dlself" = no; then
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  self)
+	    if test "$prev" = dlprefiles; then
+	      dlself=yes
+	    elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
+	      dlself=yes
+	    else
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  *)
+	    if test "$prev" = dlfiles; then
+	      dlfiles="$dlfiles $arg"
+	    else
+	      dlprefiles="$dlprefiles $arg"
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  esac
+	  ;;
+	expsyms)
+	  export_symbols="$arg"
+	  if test ! -f "$arg"; then
+	    $echo "$modename: symbol file \`$arg' does not exist"
+	    exit 1
+	  fi
+	  prev=
+	  continue
+	  ;;
+	expsyms_regex)
+	  export_symbols_regex="$arg"
+	  prev=
+	  continue
+	  ;;
+	inst_prefix)
+	  inst_prefix_dir="$arg"
+	  prev=
+	  continue
+	  ;;
+	release)
+	  release="-$arg"
+	  prev=
+	  continue
+	  ;;
+	rpath | xrpath)
+	  # We need an absolute path.
+	  case $arg in
+	  [\\/]* | [A-Za-z]:[\\/]*) ;;
+	  *)
+	    $echo "$modename: only absolute run-paths are allowed" 1>&2
+	    exit 1
+	    ;;
+	  esac
+	  if test "$prev" = rpath; then
+	    case "$rpath " in
+	    *" $arg "*) ;;
+	    *) rpath="$rpath $arg" ;;
+	    esac
+	  else
+	    case "$xrpath " in
+	    *" $arg "*) ;;
+	    *) xrpath="$xrpath $arg" ;;
+	    esac
+	  fi
+	  prev=
+	  continue
+	  ;;
+	xcompiler)
+	  compiler_flags="$compiler_flags $qarg"
+	  prev=
+	  compile_command="$compile_command $qarg"
+	  finalize_command="$finalize_command $qarg"
+	  continue
+	  ;;
+	xlinker)
+	  linker_flags="$linker_flags $qarg"
+	  compiler_flags="$compiler_flags $wl$qarg"
+	  prev=
+	  compile_command="$compile_command $wl$qarg"
+	  finalize_command="$finalize_command $wl$qarg"
+	  continue
+	  ;;
+	*)
+	  eval "$prev=\"\$arg\""
+	  prev=
+	  continue
+	  ;;
+	esac
+      fi # test -n $prev
+
+      prevarg="$arg"
+
+      case $arg in
+      -all-static)
+	if test -n "$link_static_flag"; then
+	  compile_command="$compile_command $link_static_flag"
+	  finalize_command="$finalize_command $link_static_flag"
+	fi
+	continue
+	;;
+
+      -allow-undefined)
+	# FIXME: remove this flag sometime in the future.
+	$echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2
+	continue
+	;;
+
+      -avoid-version)
+	avoid_version=yes
+	continue
+	;;
+
+      -dlopen)
+	prev=dlfiles
+	continue
+	;;
+
+      -dlpreopen)
+	prev=dlprefiles
+	continue
+	;;
+
+      -export-dynamic)
+	export_dynamic=yes
+	continue
+	;;
+
+      -export-symbols | -export-symbols-regex)
+	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+	  $echo "$modename: more than one -exported-symbols argument is not allowed"
+	  exit 1
+	fi
+	if test "X$arg" = "X-export-symbols"; then
+	  prev=expsyms
+	else
+	  prev=expsyms_regex
+	fi
+	continue
+	;;
+
+      -inst-prefix-dir)
+       prev=inst_prefix
+       continue
+       ;;
+
+      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
+      # so, if we see these flags be careful not to treat them like -L
+      -L[A-Z][A-Z]*:*)
+	case $with_gcc/$host in
+	no/*-*-irix* | no/*-*-nonstopux*)
+	  compile_command="$compile_command $arg"
+	  finalize_command="$finalize_command $arg"
+	  ;;
+	esac
+	continue
+	;;
+
+      -L*)
+	dir=`$echo "X$arg" | $Xsed -e 's/^-L//'`
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	*)
+	  absdir=`cd "$dir" && pwd`
+	  if test -z "$absdir"; then
+	    $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2
+	    exit 1
+	  fi
+	  dir="$absdir"
+	  ;;
+	esac
+	case "$deplibs " in
+	*" -L$dir "*) ;;
+	*)
+	  deplibs="$deplibs -L$dir"
+	  lib_search_path="$lib_search_path $dir"
+	  ;;
+	esac
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+	  case :$dllsearchpath: in
+	  *":$dir:"*) ;;
+	  *) dllsearchpath="$dllsearchpath:$dir";;
+	  esac
+	  ;;
+	esac
+	continue
+	;;
+
+      -l*)
+	if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
+	  case $host in
+	  *-*-cygwin* | *-*-pw32* | *-*-beos*)
+	    # These systems don't actually have a C or math library (as such)
+	    continue
+	    ;;
+	  *-*-mingw* | *-*-os2*)
+	    # These systems don't actually have a C library (as such)
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-openbsd* | *-*-freebsd*)
+	    # Do not include libc due to us having libc/libc_r.
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  esac
+	 elif test "X$arg" = "X-lc_r"; then
+	  case $host in
+	 *-*-openbsd* | *-*-freebsd*)
+	    # Do not include libc_r directly, use -pthread flag.
+	    continue
+	    ;;
+	  esac
+	fi
+	deplibs="$deplibs $arg"
+	continue
+	;;
+
+      -module)
+	module=yes
+	continue
+	;;
+
+      -no-fast-install)
+	fast_install=no
+	continue
+	;;
+
+      -no-install)
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+	  # The PATH hackery in wrapper scripts is required on Windows
+	  # in order for the loader to find any dlls it needs.
+	  $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2
+	  $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2
+	  fast_install=no
+	  ;;
+	*) no_install=yes ;;
+	esac
+	continue
+	;;
+
+      -no-undefined)
+	allow_undefined=no
+	continue
+	;;
+
+      -o) prev=output ;;
+
+      -release)
+	prev=release
+	continue
+	;;
+
+      -rpath)
+	prev=rpath
+	continue
+	;;
+
+      -R)
+	prev=xrpath
+	continue
+	;;
+
+      -R*)
+	dir=`$echo "X$arg" | $Xsed -e 's/^-R//'`
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	*)
+	  $echo "$modename: only absolute run-paths are allowed" 1>&2
+	  exit 1
+	  ;;
+	esac
+	case "$xrpath " in
+	*" $dir "*) ;;
+	*) xrpath="$xrpath $dir" ;;
+	esac
+	continue
+	;;
+
+      -static)
+	# The effects of -static are defined in a previous loop.
+	# We used to do the same as -all-static on platforms that
+	# didn't have a PIC flag, but the assumption that the effects
+	# would be equivalent was wrong.  It would break on at least
+	# Digital Unix and AIX.
+	continue
+	;;
+
+      -thread-safe)
+	thread_safe=yes
+	continue
+	;;
+
+      -version-info)
+	prev=vinfo
+	continue
+	;;
+
+      -Wc,*)
+	args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'`
+	arg=
+	save_ifs="$IFS"; IFS=','
+	for flag in $args; do
+	  IFS="$save_ifs"
+	  case $flag in
+	    *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	    flag="\"$flag\""
+	    ;;
+	  esac
+	  arg="$arg $wl$flag"
+	  compiler_flags="$compiler_flags $flag"
+	done
+	IFS="$save_ifs"
+	arg=`$echo "X$arg" | $Xsed -e "s/^ //"`
+	;;
+
+      -Wl,*)
+	args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'`
+	arg=
+	save_ifs="$IFS"; IFS=','
+	for flag in $args; do
+	  IFS="$save_ifs"
+	  case $flag in
+	    *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	    flag="\"$flag\""
+	    ;;
+	  esac
+	  arg="$arg $wl$flag"
+	  compiler_flags="$compiler_flags $wl$flag"
+	  linker_flags="$linker_flags $flag"
+	done
+	IFS="$save_ifs"
+	arg=`$echo "X$arg" | $Xsed -e "s/^ //"`
+	;;
+
+      -Xcompiler)
+	prev=xcompiler
+	continue
+	;;
+
+      -Xlinker)
+	prev=xlinker
+	continue
+	;;
+
+      # Some other compiler flag.
+      -* | +*)
+	# Unknown arguments in both finalize_command and compile_command need
+	# to be aesthetically quoted because they are evaled later.
+	arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+	case $arg in
+	*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	  arg="\"$arg\""
+	  ;;
+	esac
+	;;
+
+      *.lo | *.$objext)
+	# A library or standard object.
+	if test "$prev" = dlfiles; then
+	  # This file was specified with -dlopen.
+	  if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+	    dlfiles="$dlfiles $arg"
+	    prev=
+	    continue
+	  else
+	    # If libtool objects are unsupported, then we need to preload.
+	    prev=dlprefiles
+	  fi
+	fi
+
+	if test "$prev" = dlprefiles; then
+	  # Preload the old-style object.
+	  dlprefiles="$dlprefiles "`$echo "X$arg" | $Xsed -e "$lo2o"`
+	  prev=
+	else
+	  case $arg in
+	  *.lo) libobjs="$libobjs $arg" ;;
+	  *) objs="$objs $arg" ;;
+	  esac
+	fi
+	;;
+
+      *.$libext)
+	# An archive.
+	deplibs="$deplibs $arg"
+	old_deplibs="$old_deplibs $arg"
+	continue
+	;;
+
+      *.la)
+	# A libtool-controlled library.
+
+	if test "$prev" = dlfiles; then
+	  # This library was specified with -dlopen.
+	  dlfiles="$dlfiles $arg"
+	  prev=
+	elif test "$prev" = dlprefiles; then
+	  # The library was specified with -dlpreopen.
+	  dlprefiles="$dlprefiles $arg"
+	  prev=
+	else
+	  deplibs="$deplibs $arg"
+	fi
+	continue
+	;;
+
+      # Some other compiler argument.
+      *)
+	# Unknown arguments in both finalize_command and compile_command need
+	# to be aesthetically quoted because they are evaled later.
+	arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+	case $arg in
+	*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	  arg="\"$arg\""
+	  ;;
+	esac
+	;;
+      esac # arg
+
+      # Now actually substitute the argument into the commands.
+      if test -n "$arg"; then
+	compile_command="$compile_command $arg"
+	finalize_command="$finalize_command $arg"
+      fi
+    done # argument parsing loop
+
+    if test -n "$prev"; then
+      $echo "$modename: the \`$prevarg' option requires an argument" 1>&2
+      $echo "$help" 1>&2
+      exit 1
+    fi
+
+    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
+      eval arg=\"$export_dynamic_flag_spec\"
+      compile_command="$compile_command $arg"
+      finalize_command="$finalize_command $arg"
+    fi
+
+    # calculate the name of the file, without its directory
+    outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'`
+    libobjs_save="$libobjs"
+
+    if test -n "$shlibpath_var"; then
+      # get the directories listed in $shlibpath_var
+      eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\`
+    else
+      shlib_search_path=
+    fi
+    eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
+    eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
+
+    output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'`
+    if test "X$output_objdir" = "X$output"; then
+      output_objdir="$objdir"
+    else
+      output_objdir="$output_objdir/$objdir"
+    fi
+    # Create the object directory.
+    if test ! -d $output_objdir; then
+      $show "$mkdir $output_objdir"
+      $run $mkdir $output_objdir
+      status=$?
+      if test $status -ne 0 && test ! -d $output_objdir; then
+	exit $status
+      fi
+    fi
+
+    # Determine the type of output
+    case $output in
+    "")
+      $echo "$modename: you must specify an output file" 1>&2
+      $echo "$help" 1>&2
+      exit 1
+      ;;
+    *.$libext) linkmode=oldlib ;;
+    *.lo | *.$objext) linkmode=obj ;;
+    *.la) linkmode=lib ;;
+    *) linkmode=prog ;; # Anything else should be a program.
+    esac
+
+    specialdeplibs=
+    libs=
+    # Find all interdependent deplibs by searching for libraries
+    # that are linked more than once (e.g. -la -lb -la)
+    for deplib in $deplibs; do
+      if test "X$duplicate_deps" = "Xyes" ; then
+	case "$libs " in
+	*" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	esac
+      fi
+      libs="$libs $deplib"
+    done
+    deplibs=
+    newdependency_libs=
+    newlib_search_path=
+    need_relink=no # whether we're linking any uninstalled libtool libraries
+    notinst_deplibs= # not-installed libtool libraries
+    notinst_path= # paths that contain not-installed libtool libraries
+    case $linkmode in
+    lib)
+	passes="conv link"
+	for file in $dlfiles $dlprefiles; do
+	  case $file in
+	  *.la) ;;
+	  *)
+	    $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2
+	    exit 1
+	    ;;
+	  esac
+	done
+	;;
+    prog)
+	compile_deplibs=
+	finalize_deplibs=
+	alldeplibs=no
+	newdlfiles=
+	newdlprefiles=
+	passes="conv scan dlopen dlpreopen link"
+	;;
+    *)  passes="conv"
+	;;
+    esac
+    for pass in $passes; do
+      if test $linkmode = prog; then
+	# Determine which files to process
+	case $pass in
+	dlopen)
+	  libs="$dlfiles"
+	  save_deplibs="$deplibs" # Collect dlpreopened libraries
+	  deplibs=
+	  ;;
+	dlpreopen) libs="$dlprefiles" ;;
+	link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
+	esac
+      fi
+      for deplib in $libs; do
+	lib=
+	found=no
+	case $deplib in
+	-l*)
+	  if test $linkmode = oldlib && test $linkmode = obj; then
+	    $echo "$modename: warning: \`-l' is ignored for archives/objects: $deplib" 1>&2
+	    continue
+	  fi
+	  if test $pass = conv; then
+	    deplibs="$deplib $deplibs"
+	    continue
+	  fi
+	  name=`$echo "X$deplib" | $Xsed -e 's/^-l//'`
+	  for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; do
+	    # Search the libtool library
+	    lib="$searchdir/lib${name}.la"
+	    if test -f "$lib"; then
+	      found=yes
+	      break
+	    fi
+	  done
+	  if test "$found" != yes; then
+	    # deplib doesn't seem to be a libtool library
+	    if test "$linkmode,$pass" = "prog,link"; then
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      deplibs="$deplib $deplibs"
+	      test $linkmode = lib && newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    continue
+	  fi
+	  ;; # -l
+	-L*)
+	  case $linkmode in
+	  lib)
+	    deplibs="$deplib $deplibs"
+	    test $pass = conv && continue
+	    newdependency_libs="$deplib $newdependency_libs"
+	    newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`
+	    ;;
+	  prog)
+	    if test $pass = conv; then
+	      deplibs="$deplib $deplibs"
+	      continue
+	    fi
+	    if test $pass = scan; then
+	      deplibs="$deplib $deplibs"
+	      newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    ;;
+	  *)
+	    $echo "$modename: warning: \`-L' is ignored for archives/objects: $deplib" 1>&2
+	    ;;
+	  esac # linkmode
+	  continue
+	  ;; # -L
+	-R*)
+	  if test $pass = link; then
+	    dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'`
+	    # Make sure the xrpath contains only unique directories.
+	    case "$xrpath " in
+	    *" $dir "*) ;;
+	    *) xrpath="$xrpath $dir" ;;
+	    esac
+	  fi
+	  deplibs="$deplib $deplibs"
+	  continue
+	  ;;
+	*.la) lib="$deplib" ;;
+	*.$libext)
+	  if test $pass = conv; then
+	    deplibs="$deplib $deplibs"
+	    continue
+	  fi
+	  case $linkmode in
+	  lib)
+	    if test "$deplibs_check_method" != pass_all; then
+	      echo
+	      echo "*** Warning: Trying to link with static lib archive $deplib."
+	      echo "*** I have the capability to make that library automatically link in when"
+	      echo "*** you link to this library.  But I can only do this if you have a"
+	      echo "*** shared version of the library, which you do not appear to have"
+	      echo "*** because the file extensions .$libext of this argument makes me believe"
+	      echo "*** that it is just a static archive that I should not used here."
+	    else
+	      echo
+	      echo "*** Warning: Linking the shared library $output against the"
+	      echo "*** static library $deplib is not portable!"
+	      deplibs="$deplib $deplibs"
+	    fi
+	    continue
+	    ;;
+	  prog)
+	    if test $pass != link; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    continue
+	    ;;
+	  esac # linkmode
+	  ;; # *.$libext
+	*.lo | *.$objext)
+	  if test $pass = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
+	    # If there is no dlopen support or we're linking statically,
+	    # we need to preload.
+	    newdlprefiles="$newdlprefiles $deplib"
+	    compile_deplibs="$deplib $compile_deplibs"
+	    finalize_deplibs="$deplib $finalize_deplibs"
+	  else
+	    newdlfiles="$newdlfiles $deplib"
+	  fi
+	  continue
+	  ;;
+	%DEPLIBS%)
+	  alldeplibs=yes
+	  continue
+	  ;;
+	esac # case $deplib
+	if test $found = yes || test -f "$lib"; then :
+	else
+	  $echo "$modename: cannot find the library \`$lib'" 1>&2
+	  exit 1
+	fi
+
+	# Check to see that this really is a libtool archive.
+	if (${SED} -e '2q' $lib | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+	else
+	  $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+	  exit 1
+	fi
+
+	ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'`
+	test "X$ladir" = "X$lib" && ladir="."
+
+	dlname=
+	dlopen=
+	dlpreopen=
+	libdir=
+	library_names=
+	old_library=
+	# If the library was installed with an old release of libtool,
+	# it will not redefine variable installed.
+	installed=yes
+
+	# Read the .la file
+	case $lib in
+	*/* | *\\*) . $lib ;;
+	*) . ./$lib ;;
+	esac
+
+	if test "$linkmode,$pass" = "lib,link" ||
+	   test "$linkmode,$pass" = "prog,scan" ||
+	   { test $linkmode = oldlib && test $linkmode = obj; }; then
+	   # Add dl[pre]opened files of deplib
+	  test -n "$dlopen" && dlfiles="$dlfiles $dlopen"
+	  test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen"
+	fi
+
+	if test $pass = conv; then
+	  # Only check for convenience libraries
+	  deplibs="$lib $deplibs"
+	  if test -z "$libdir"; then
+	    if test -z "$old_library"; then
+	      $echo "$modename: cannot find name of link library for \`$lib'" 1>&2
+	      exit 1
+	    fi
+	    # It is a libtool convenience library, so add in its objects.
+	    convenience="$convenience $ladir/$objdir/$old_library"
+	    old_convenience="$old_convenience $ladir/$objdir/$old_library"
+	    tmp_libs=
+	    for deplib in $dependency_libs; do
+	      deplibs="$deplib $deplibs"
+              if test "X$duplicate_deps" = "Xyes" ; then
+	        case "$tmp_libs " in
+	        *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	        esac
+              fi
+	      tmp_libs="$tmp_libs $deplib"
+	    done
+	  elif test $linkmode != prog && test $linkmode != lib; then
+	    $echo "$modename: \`$lib' is not a convenience library" 1>&2
+	    exit 1
+	  fi
+	  continue
+	fi # $pass = conv
+
+	# Get the name of the library we link against.
+	linklib=
+	for l in $old_library $library_names; do
+	  linklib="$l"
+	done
+	if test -z "$linklib"; then
+	  $echo "$modename: cannot find name of link library for \`$lib'" 1>&2
+	  exit 1
+	fi
+
+	# This library was specified with -dlopen.
+	if test $pass = dlopen; then
+	  if test -z "$libdir"; then
+	    $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2
+	    exit 1
+	  fi
+	  if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
+	    # If there is no dlname, no dlopen support or we're linking
+	    # statically, we need to preload.
+	    dlprefiles="$dlprefiles $lib"
+	  else
+	    newdlfiles="$newdlfiles $lib"
+	  fi
+	  continue
+	fi # $pass = dlopen
+
+	# We need an absolute path.
+	case $ladir in
+	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
+	*)
+	  abs_ladir=`cd "$ladir" && pwd`
+	  if test -z "$abs_ladir"; then
+	    $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2
+	    $echo "$modename: passing it literally to the linker, although it might fail" 1>&2
+	    abs_ladir="$ladir"
+	  fi
+	  ;;
+	esac
+	laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+
+	# Find the relevant object directory and library name.
+	if test "X$installed" = Xyes; then
+	  if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    $echo "$modename: warning: library \`$lib' was moved." 1>&2
+	    dir="$ladir"
+	    absdir="$abs_ladir"
+	    libdir="$abs_ladir"
+	  else
+	    dir="$libdir"
+	    absdir="$libdir"
+	  fi
+	else
+	  dir="$ladir/$objdir"
+	  absdir="$abs_ladir/$objdir"
+	  # Remove this search path later
+	  notinst_path="$notinst_path $abs_ladir"
+	fi # $installed = yes
+	name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
+
+	# This library was specified with -dlpreopen.
+	if test $pass = dlpreopen; then
+	  if test -z "$libdir"; then
+	    $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2
+	    exit 1
+	  fi
+	  # Prefer using a static library (so that no silly _DYNAMIC symbols
+	  # are required to link).
+	  if test -n "$old_library"; then
+	    newdlprefiles="$newdlprefiles $dir/$old_library"
+	  # Otherwise, use the dlname, so that lt_dlopen finds it.
+	  elif test -n "$dlname"; then
+	    newdlprefiles="$newdlprefiles $dir/$dlname"
+	  else
+	    newdlprefiles="$newdlprefiles $dir/$linklib"
+	  fi
+	fi # $pass = dlpreopen
+
+	if test -z "$libdir"; then
+	  # Link the convenience library
+	  if test $linkmode = lib; then
+	    deplibs="$dir/$old_library $deplibs"
+	  elif test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$dir/$old_library $compile_deplibs"
+	    finalize_deplibs="$dir/$old_library $finalize_deplibs"
+	  else
+	    deplibs="$lib $deplibs"
+	  fi
+	  continue
+	fi
+
+	if test $linkmode = prog && test $pass != link; then
+	  newlib_search_path="$newlib_search_path $ladir"
+	  deplibs="$lib $deplibs"
+
+	  linkalldeplibs=no
+	  if test "$link_all_deplibs" != no || test -z "$library_names" ||
+	     test "$build_libtool_libs" = no; then
+	    linkalldeplibs=yes
+	  fi
+
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    case $deplib in
+	    -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test
+	    esac
+	    # Need to link against all dependency_libs?
+	    if test $linkalldeplibs = yes; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      # Need to hardcode shared library paths
+	      # or/and link against static libraries
+	      newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    if test "X$duplicate_deps" = "Xyes" ; then
+	      case "$tmp_libs " in
+	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	      esac
+	    fi
+	    tmp_libs="$tmp_libs $deplib"
+	  done # for deplib
+	  continue
+	fi # $linkmode = prog...
+
+	link_static=no # Whether the deplib will be linked statically
+	if test -n "$library_names" &&
+	   { test "$prefer_static_libs" = no || test -z "$old_library"; }; then
+	  # Link against this shared library
+
+	  if test "$linkmode,$pass" = "prog,link" ||
+	   { test $linkmode = lib && test $hardcode_into_libs = yes; }; then
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) compile_rpath="$compile_rpath $absdir"
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) finalize_rpath="$finalize_rpath $libdir"
+	      esac
+	      ;;
+	    esac
+	    if test $linkmode = prog; then
+	      # We need to hardcode the library path
+	      if test -n "$shlibpath_var"; then
+		# Make sure the rpath contains only unique directories.
+		case "$temp_rpath " in
+		*" $dir "*) ;;
+		*" $absdir "*) ;;
+		*) temp_rpath="$temp_rpath $dir" ;;
+		esac
+	      fi
+	    fi
+	  fi # $linkmode,$pass = prog,link...
+
+	  if test "$alldeplibs" = yes &&
+	     { test "$deplibs_check_method" = pass_all ||
+	       { test "$build_libtool_libs" = yes &&
+		 test -n "$library_names"; }; }; then
+	    # We only need to search for static libraries
+	    continue
+	  fi
+
+	  if test "$installed" = no; then
+	    notinst_deplibs="$notinst_deplibs $lib"
+	    need_relink=yes
+	  fi
+
+	  if test -n "$old_archive_from_expsyms_cmds"; then
+	    # figure out the soname
+	    set dummy $library_names
+	    realname="$2"
+	    shift; shift
+	    libname=`eval \\$echo \"$libname_spec\"`
+	    # use dlname if we got it. it's perfectly good, no?
+	    if test -n "$dlname"; then
+	      soname="$dlname"
+	    elif test -n "$soname_spec"; then
+	      # bleh windows
+	      case $host in
+	      *cygwin*)
+		major=`expr $current - $age`
+		versuffix="-$major"
+		;;
+	      esac
+	      eval soname=\"$soname_spec\"
+	    else
+	      soname="$realname"
+	    fi
+
+	    # Make a new name for the extract_expsyms_cmds to use
+	    soroot="$soname"
+	    soname=`echo $soroot | ${SED} -e 's/^.*\///'`
+	    newlib="libimp-`echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a"
+
+	    # If the library has no export list, then create one now
+	    if test -f "$output_objdir/$soname-def"; then :
+	    else
+	      $show "extracting exported symbol list from \`$soname'"
+	      save_ifs="$IFS"; IFS='~'
+	      eval cmds=\"$extract_expsyms_cmds\"
+	      for cmd in $cmds; do
+		IFS="$save_ifs"
+		$show "$cmd"
+		$run eval "$cmd" || exit $?
+	      done
+	      IFS="$save_ifs"
+	    fi
+
+	    # Create $newlib
+	    if test -f "$output_objdir/$newlib"; then :; else
+	      $show "generating import library for \`$soname'"
+	      save_ifs="$IFS"; IFS='~'
+	      eval cmds=\"$old_archive_from_expsyms_cmds\"
+	      for cmd in $cmds; do
+		IFS="$save_ifs"
+		$show "$cmd"
+		$run eval "$cmd" || exit $?
+	      done
+	      IFS="$save_ifs"
+	    fi
+	    # make sure the library variables are pointing to the new library
+	    dir=$output_objdir
+	    linklib=$newlib
+	  fi # test -n $old_archive_from_expsyms_cmds
+
+	  if test $linkmode = prog || test "$mode" != relink; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    lib_linked=yes
+	    case $hardcode_action in
+	    immediate | unsupported)
+	      if test "$hardcode_direct" = no; then
+		add="$dir/$linklib"
+	      elif test "$hardcode_minus_L" = no; then
+		case $host in
+		*-*-sunos*) add_shlibpath="$dir" ;;
+		esac
+		add_dir="-L$dir"
+		add="-l$name"
+	      elif test "$hardcode_shlibpath_var" = no; then
+		add_shlibpath="$dir"
+		add="-l$name"
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    relink)
+	      if test "$hardcode_direct" = yes; then
+		add="$dir/$linklib"
+	      elif test "$hardcode_minus_L" = yes; then
+		add_dir="-L$dir"
+		# Try looking first in the location we're being installed to.
+		if test -n "$inst_prefix_dir"; then
+		  case "$libdir" in
+		  [\/]*)
+		    add_dir="-L$inst_prefix_dir$libdir $add_dir"
+		    ;;
+		  esac
+		fi
+		add="-l$name"
+	      elif test "$hardcode_shlibpath_var" = yes; then
+		add_shlibpath="$dir"
+		add="-l$name"
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    *) lib_linked=no ;;
+	    esac
+
+	    if test "$lib_linked" != yes; then
+	      $echo "$modename: configuration error: unsupported hardcode properties"
+	      exit 1
+	    fi
+
+	    if test -n "$add_shlibpath"; then
+	      case :$compile_shlibpath: in
+	      *":$add_shlibpath:"*) ;;
+	      *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;;
+	      esac
+	    fi
+	    if test $linkmode = prog; then
+	      test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
+	      test -n "$add" && compile_deplibs="$add $compile_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	      if test "$hardcode_direct" != yes && \
+		 test "$hardcode_minus_L" != yes && \
+		 test "$hardcode_shlibpath_var" = yes; then
+		case :$finalize_shlibpath: in
+		*":$libdir:"*) ;;
+		*) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+		esac
+	      fi
+	    fi
+	  fi
+
+	  if test $linkmode = prog || test "$mode" = relink; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    # Finalize command for both is simple: just hardcode it.
+	    if test "$hardcode_direct" = yes; then
+	      add="$libdir/$linklib"
+	    elif test "$hardcode_minus_L" = yes; then
+	      add_dir="-L$libdir"
+	      add="-l$name"
+	    elif test "$hardcode_shlibpath_var" = yes; then
+	      case :$finalize_shlibpath: in
+	      *":$libdir:"*) ;;
+	      *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+	      esac
+	      add="-l$name"
+	    else
+	      # We cannot seem to hardcode it, guess we'll fake it.
+	      add_dir="-L$libdir"
+	      # Try looking first in the location we're being installed to.
+	      if test -n "$inst_prefix_dir"; then
+		case "$libdir" in
+		[\/]*)
+		  add_dir="-L$inst_prefix_dir$libdir $add_dir"
+		  ;;
+		esac
+	      fi
+	      add="-l$name"
+	    fi
+
+	    if test $linkmode = prog; then
+	      test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
+	      test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	    fi
+	  fi
+	elif test $linkmode = prog; then
+	  if test "$alldeplibs" = yes &&
+	     { test "$deplibs_check_method" = pass_all ||
+	       { test "$build_libtool_libs" = yes &&
+		 test -n "$library_names"; }; }; then
+	    # We only need to search for static libraries
+	    continue
+	  fi
+
+	  # Try to link the static library
+	  # Here we assume that one of hardcode_direct or hardcode_minus_L
+	  # is not unsupported.  This is valid on all known static and
+	  # shared platforms.
+	  if test "$hardcode_direct" != unsupported; then
+	    test -n "$old_library" && linklib="$old_library"
+	    compile_deplibs="$dir/$linklib $compile_deplibs"
+	    finalize_deplibs="$dir/$linklib $finalize_deplibs"
+	  else
+	    compile_deplibs="-l$name -L$dir $compile_deplibs"
+	    finalize_deplibs="-l$name -L$dir $finalize_deplibs"
+	  fi
+	elif test "$build_libtool_libs" = yes; then
+	  # Not a shared library
+	  if test "$deplibs_check_method" != pass_all; then
+	    # We're trying link a shared library against a static one
+	    # but the system doesn't support it.
+
+	    # Just print a warning and add the library to dependency_libs so
+	    # that the program can be linked against the static library.
+	    echo
+	    echo "*** Warning: This system can not link to static lib archive $lib."
+	    echo "*** I have the capability to make that library automatically link in when"
+	    echo "*** you link to this library.  But I can only do this if you have a"
+	    echo "*** shared version of the library, which you do not appear to have."
+	    if test "$module" = yes; then
+	      echo "*** But as you try to build a module library, libtool will still create "
+	      echo "*** a static module, that should work as long as the dlopening application"
+	      echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
+	      if test -z "$global_symbol_pipe"; then
+		echo
+		echo "*** However, this would only work if libtool was able to extract symbol"
+		echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+		echo "*** not find such a program.  So, this module is probably useless."
+		echo "*** \`nm' from GNU binutils and a full rebuild may help."
+	      fi
+	      if test "$build_old_libs" = no; then
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  else
+	    convenience="$convenience $dir/$old_library"
+	    old_convenience="$old_convenience $dir/$old_library"
+	    deplibs="$dir/$old_library $deplibs"
+	    link_static=yes
+	  fi
+	fi # link shared/static library?
+
+	if test $linkmode = lib; then
+	  if test -n "$dependency_libs" &&
+	     { test $hardcode_into_libs != yes || test $build_old_libs = yes ||
+	       test $link_static = yes; }; then
+	    # Extract -R from dependency_libs
+	    temp_deplibs=
+	    for libdir in $dependency_libs; do
+	      case $libdir in
+	      -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'`
+		   case " $xrpath " in
+		   *" $temp_xrpath "*) ;;
+		   *) xrpath="$xrpath $temp_xrpath";;
+		   esac;;
+	      *) temp_deplibs="$temp_deplibs $libdir";;
+	      esac
+	    done
+	    dependency_libs="$temp_deplibs"
+	  fi
+
+	  newlib_search_path="$newlib_search_path $absdir"
+	  # Link against this library
+	  test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
+	  # ... and its dependency_libs
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    newdependency_libs="$deplib $newdependency_libs"
+	    if test "X$duplicate_deps" = "Xyes" ; then
+	      case "$tmp_libs " in
+	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	      esac
+	    fi
+	    tmp_libs="$tmp_libs $deplib"
+	  done
+
+	  if test $link_all_deplibs != no; then
+	    # Add the search paths of all dependency libraries
+	    for deplib in $dependency_libs; do
+	      case $deplib in
+	      -L*) path="$deplib" ;;
+	      *.la)
+		dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'`
+		test "X$dir" = "X$deplib" && dir="."
+		# We need an absolute path.
+		case $dir in
+		[\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
+		*)
+		  absdir=`cd "$dir" && pwd`
+		  if test -z "$absdir"; then
+		    $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2
+		    absdir="$dir"
+		  fi
+		  ;;
+		esac
+		if grep "^installed=no" $deplib > /dev/null; then
+		  path="-L$absdir/$objdir"
+		else
+		  eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+		  if test -z "$libdir"; then
+		    $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2
+		    exit 1
+		  fi
+		  if test "$absdir" != "$libdir"; then
+		    $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2
+		  fi
+		  path="-L$absdir"
+		fi
+		;;
+	      *) continue ;;
+	      esac
+	      case " $deplibs " in
+	      *" $path "*) ;;
+	      *) deplibs="$deplibs $path" ;;
+	      esac
+	    done
+	  fi # link_all_deplibs != no
+	fi # linkmode = lib
+      done # for deplib in $libs
+      if test $pass = dlpreopen; then
+	# Link the dlpreopened libraries before other libraries
+	for deplib in $save_deplibs; do
+	  deplibs="$deplib $deplibs"
+	done
+      fi
+      if test $pass != dlopen; then
+	test $pass != scan && dependency_libs="$newdependency_libs"
+	if test $pass != conv; then
+	  # Make sure lib_search_path contains only unique directories.
+	  lib_search_path=
+	  for dir in $newlib_search_path; do
+	    case "$lib_search_path " in
+	    *" $dir "*) ;;
+	    *) lib_search_path="$lib_search_path $dir" ;;
+	    esac
+	  done
+	  newlib_search_path=
+	fi
+
+	if test "$linkmode,$pass" != "prog,link"; then
+	  vars="deplibs"
+	else
+	  vars="compile_deplibs finalize_deplibs"
+	fi
+	for var in $vars dependency_libs; do
+	  # Add libraries to $var in reverse order
+	  eval tmp_libs=\"\$$var\"
+	  new_libs=
+	  for deplib in $tmp_libs; do
+	    case $deplib in
+	    -L*) new_libs="$deplib $new_libs" ;;
+	    *)
+	      case " $specialdeplibs " in
+	      *" $deplib "*) new_libs="$deplib $new_libs" ;;
+	      *)
+		case " $new_libs " in
+		*" $deplib "*) ;;
+		*) new_libs="$deplib $new_libs" ;;
+		esac
+		;;
+	      esac
+	      ;;
+	    esac
+	  done
+	  tmp_libs=
+	  for deplib in $new_libs; do
+	    case $deplib in
+	    -L*)
+	      case " $tmp_libs " in
+	      *" $deplib "*) ;;
+	      *) tmp_libs="$tmp_libs $deplib" ;;
+	      esac
+	      ;;
+	    *) tmp_libs="$tmp_libs $deplib" ;;
+	    esac
+	  done
+	  eval $var=\"$tmp_libs\"
+	done # for var
+      fi
+      if test "$pass" = "conv" &&
+       { test "$linkmode" = "lib" || test "$linkmode" = "prog"; }; then
+	libs="$deplibs" # reset libs
+	deplibs=
+      fi
+    done # for pass
+    if test $linkmode = prog; then
+      dlfiles="$newdlfiles"
+      dlprefiles="$newdlprefiles"
+    fi
+
+    case $linkmode in
+    oldlib)
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	$echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$rpath"; then
+	$echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$xrpath"; then
+	$echo "$modename: warning: \`-R' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$vinfo"; then
+	$echo "$modename: warning: \`-version-info' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$release"; then
+	$echo "$modename: warning: \`-release' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+	$echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2
+      fi
+
+      # Now set the variables for building old libraries.
+      build_libtool_libs=no
+      oldlibs="$output"
+      objs="$objs$old_deplibs"
+      ;;
+
+    lib)
+      # Make sure we only generate libraries of the form `libNAME.la'.
+      case $outputname in
+      lib*)
+	name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
+	eval libname=\"$libname_spec\"
+	;;
+      *)
+	if test "$module" = no; then
+	  $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2
+	  $echo "$help" 1>&2
+	  exit 1
+	fi
+	if test "$need_lib_prefix" != no; then
+	  # Add the "lib" prefix for modules if required
+	  name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
+	  eval libname=\"$libname_spec\"
+	else
+	  libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
+	fi
+	;;
+      esac
+
+      if test -n "$objs"; then
+	if test "$deplibs_check_method" != pass_all; then
+	  $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1
+	  exit 1
+	else
+	  echo
+	  echo "*** Warning: Linking the shared library $output against the non-libtool"
+	  echo "*** objects $objs is not portable!"
+	  libobjs="$libobjs $objs"
+	fi
+      fi
+
+      if test "$dlself" != no; then
+	$echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2
+      fi
+
+      set dummy $rpath
+      if test $# -gt 2; then
+	$echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2
+      fi
+      install_libdir="$2"
+
+      oldlibs=
+      if test -z "$rpath"; then
+	if test "$build_libtool_libs" = yes; then
+	  # Building a libtool convenience library.
+	  libext=al
+	  oldlibs="$output_objdir/$libname.$libext $oldlibs"
+	  build_libtool_libs=convenience
+	  build_old_libs=yes
+	fi
+
+	if test -n "$vinfo"; then
+	  $echo "$modename: warning: \`-version-info' is ignored for convenience libraries" 1>&2
+	fi
+
+	if test -n "$release"; then
+	  $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2
+	fi
+      else
+
+	# Parse the version information argument.
+	save_ifs="$IFS"; IFS=':'
+	set dummy $vinfo 0 0 0
+	IFS="$save_ifs"
+
+	if test -n "$8"; then
+	  $echo "$modename: too many parameters to \`-version-info'" 1>&2
+	  $echo "$help" 1>&2
+	  exit 1
+	fi
+
+	current="$2"
+	revision="$3"
+	age="$4"
+
+	# Check that each of the things are valid numbers.
+	case $current in
+	0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;;
+	*)
+	  $echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2
+	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+	  exit 1
+	  ;;
+	esac
+
+	case $revision in
+	0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;;
+	*)
+	  $echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2
+	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+	  exit 1
+	  ;;
+	esac
+
+	case $age in
+	0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;;
+	*)
+	  $echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2
+	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+	  exit 1
+	  ;;
+	esac
+
+	if test $age -gt $current; then
+	  $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2
+	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+	  exit 1
+	fi
+
+	# Calculate the version variables.
+	major=
+	versuffix=
+	verstring=
+	case $version_type in
+	none) ;;
+
+	darwin)
+	  # Like Linux, but with the current version available in
+	  # verstring for coding it into the library header
+	  major=.`expr $current - $age`
+	  versuffix="$major.$age.$revision"
+	  # Darwin ld doesn't like 0 for these options...
+	  minor_current=`expr $current + 1`
+	  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+	  ;;
+
+	freebsd-aout)
+	  major=".$current"
+	  versuffix=".$current.$revision";
+	  ;;
+
+	freebsd-elf)
+	  major=".$current"
+	  versuffix=".$current";
+	  ;;
+
+	irix | nonstopux)
+	  major=`expr $current - $age + 1`
+
+	  case $version_type in
+	    nonstopux) verstring_prefix=nonstopux ;;
+	    *)         verstring_prefix=sgi ;;
+	  esac
+	  verstring="$verstring_prefix$major.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$revision
+	  while test $loop != 0; do
+	    iface=`expr $revision - $loop`
+	    loop=`expr $loop - 1`
+	    verstring="$verstring_prefix$major.$iface:$verstring"
+	  done
+
+	  # Before this point, $major must not contain `.'.
+	  major=.$major
+	  versuffix="$major.$revision"
+	  ;;
+
+	linux)
+	  major=.`expr $current - $age`
+	  versuffix="$major.$age.$revision"
+	  ;;
+
+	osf)
+	  major=.`expr $current - $age`
+	  versuffix=".$current.$age.$revision"
+	  verstring="$current.$age.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$age
+	  while test $loop != 0; do
+	    iface=`expr $current - $loop`
+	    loop=`expr $loop - 1`
+	    verstring="$verstring:${iface}.0"
+	  done
+
+	  # Make executables depend on our current version.
+	  verstring="$verstring:${current}.0"
+	  ;;
+
+	sunos)
+	  major=".$current"
+	  versuffix=".$current.$revision"
+	  ;;
+
+	windows)
+	  # Use '-' rather than '.', since we only want one
+	  # extension on DOS 8.3 filesystems.
+	  major=`expr $current - $age`
+	  versuffix="-$major"
+	  ;;
+
+	*)
+	  $echo "$modename: unknown library version type \`$version_type'" 1>&2
+	  echo "Fatal configuration error.  See the $PACKAGE docs for more information." 1>&2
+	  exit 1
+	  ;;
+	esac
+
+	# Clear the version info if we defaulted, and they specified a release.
+	if test -z "$vinfo" && test -n "$release"; then
+	  major=
+	  verstring="0.0"
+	  case $version_type in
+	  darwin)
+	    # we can't check for "0.0" in archive_cmds due to quoting
+	    # problems, so we reset it completely
+	    verstring=""
+	    ;;
+	  *)
+	    verstring="0.0"
+	    ;;
+	  esac
+	  if test "$need_version" = no; then
+	    versuffix=
+	  else
+	    versuffix=".0.0"
+	  fi
+	fi
+
+	# Remove version info from name if versioning should be avoided
+	if test "$avoid_version" = yes && test "$need_version" = no; then
+	  major=
+	  versuffix=
+	  verstring=""
+	fi
+
+	# Check to see if the archive will have undefined symbols.
+	if test "$allow_undefined" = yes; then
+	  if test "$allow_undefined_flag" = unsupported; then
+	    $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2
+	    build_libtool_libs=no
+	    build_old_libs=yes
+	  fi
+	else
+	  # Don't allow undefined symbols.
+	  allow_undefined_flag="$no_undefined_flag"
+	fi
+      fi
+
+      if test "$mode" != relink; then
+	# Remove our outputs.
+	$show "${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.*"
+	$run ${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.*
+      fi
+
+      # Now set the variables for building old libraries.
+      if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
+	oldlibs="$oldlibs $output_objdir/$libname.$libext"
+
+	# Transform .lo files to .o files.
+	oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP`
+      fi
+
+      # Eliminate all temporary directories.
+      for path in $notinst_path; do
+	lib_search_path=`echo "$lib_search_path " | ${SED} -e 's% $path % %g'`
+	deplibs=`echo "$deplibs " | ${SED} -e 's% -L$path % %g'`
+	dependency_libs=`echo "$dependency_libs " | ${SED} -e 's% -L$path % %g'`
+      done
+
+      if test -n "$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	temp_xrpath=
+	for libdir in $xrpath; do
+	  temp_xrpath="$temp_xrpath -R$libdir"
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) finalize_rpath="$finalize_rpath $libdir" ;;
+	  esac
+	done
+	if test $hardcode_into_libs != yes || test $build_old_libs = yes; then
+	  dependency_libs="$temp_xrpath $dependency_libs"
+	fi
+      fi
+
+      # Make sure dlfiles contains only unique files that won't be dlpreopened
+      old_dlfiles="$dlfiles"
+      dlfiles=
+      for lib in $old_dlfiles; do
+	case " $dlprefiles $dlfiles " in
+	*" $lib "*) ;;
+	*) dlfiles="$dlfiles $lib" ;;
+	esac
+      done
+
+      # Make sure dlprefiles contains only unique files
+      old_dlprefiles="$dlprefiles"
+      dlprefiles=
+      for lib in $old_dlprefiles; do
+	case "$dlprefiles " in
+	*" $lib "*) ;;
+	*) dlprefiles="$dlprefiles $lib" ;;
+	esac
+      done
+
+      if test "$build_libtool_libs" = yes; then
+	if test -n "$rpath"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*)
+	    # these systems don't actually have a c library (as such)!
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C library is in the System framework
+	    deplibs="$deplibs -framework System"
+	    ;;
+	  *-*-netbsd*)
+	    # Don't link with libc until the a.out ld.so is fixed.
+	    ;;
+	  *-*-openbsd* | *-*-freebsd*)
+	    # Do not include libc due to us having libc/libc_r.
+	    ;;
+	  *)
+	    # Add libc to deplibs on all other systems if necessary.
+	    if test $build_libtool_need_lc = "yes"; then
+	      deplibs="$deplibs -lc"
+	    fi
+	    ;;
+	  esac
+	fi
+
+	# Transform deplibs into only deplibs that can be linked in shared.
+	name_save=$name
+	libname_save=$libname
+	release_save=$release
+	versuffix_save=$versuffix
+	major_save=$major
+	# I'm not sure if I'm treating the release correctly.  I think
+	# release should show up in the -l (ie -lgmp5) so we don't want to
+	# add it in twice.  Is that correct?
+	release=""
+	versuffix=""
+	major=""
+	newdeplibs=
+	droppeddeps=no
+	case $deplibs_check_method in
+	pass_all)
+	  # Don't check for shared/static.  Everything works.
+	  # This might be a little naive.  We might want to check
+	  # whether the library exists or not.  But this is on
+	  # osf3 & osf4 and I'm not really sure... Just
+	  # implementing what was already the behaviour.
+	  newdeplibs=$deplibs
+	  ;;
+	test_compile)
+	  # This code stresses the "libraries are programs" paradigm to its
+	  # limits. Maybe even breaks it.  We compile a program, linking it
+	  # against the deplibs as a proxy for the library.  Then we can check
+	  # whether they linked in statically or dynamically with ldd.
+	  $rm conftest.c
+	  cat > conftest.c <<EOF
+	  int main() { return 0; }
+EOF
+	  $rm conftest
+	  $CC -o conftest conftest.c $deplibs
+	  if test $? -eq 0 ; then
+	    ldd_output=`ldd conftest`
+	    for i in $deplibs; do
+	      name="`expr $i : '-l\(.*\)'`"
+	      # If $name is empty we are operating on a -L argument.
+	      if test -n "$name" && test "$name" != "0"; then
+		libname=`eval \\$echo \"$libname_spec\"`
+		deplib_matches=`eval \\$echo \"$library_names_spec\"`
+		set dummy $deplib_matches
+		deplib_match=$2
+		if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		  newdeplibs="$newdeplibs $i"
+		else
+		  droppeddeps=yes
+		  echo
+		  echo "*** Warning: dynamic linker does not accept needed library $i."
+		  echo "*** I have the capability to make that library automatically link in when"
+		  echo "*** you link to this library.  But I can only do this if you have a"
+		  echo "*** shared version of the library, which I believe you do not have"
+		  echo "*** because a test_compile did reveal that the linker did not use it for"
+		  echo "*** its dynamic dependency list that programs get resolved with at runtime."
+		fi
+	      else
+		newdeplibs="$newdeplibs $i"
+	      fi
+	    done
+	  else
+	    # Error occured in the first compile.  Let's try to salvage
+	    # the situation: Compile a separate program for each library.
+	    for i in $deplibs; do
+	      name="`expr $i : '-l\(.*\)'`"
+	     # If $name is empty we are operating on a -L argument.
+	      if test -n "$name" && test "$name" != "0"; then
+		$rm conftest
+		$CC -o conftest conftest.c $i
+		# Did it work?
+		if test $? -eq 0 ; then
+		  ldd_output=`ldd conftest`
+		  libname=`eval \\$echo \"$libname_spec\"`
+		  deplib_matches=`eval \\$echo \"$library_names_spec\"`
+		  set dummy $deplib_matches
+		  deplib_match=$2
+		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		    newdeplibs="$newdeplibs $i"
+		  else
+		    droppeddeps=yes
+		    echo
+		    echo "*** Warning: dynamic linker does not accept needed library $i."
+		    echo "*** I have the capability to make that library automatically link in when"
+		    echo "*** you link to this library.  But I can only do this if you have a"
+		    echo "*** shared version of the library, which you do not appear to have"
+		    echo "*** because a test_compile did reveal that the linker did not use this one"
+		    echo "*** as a dynamic dependency that programs can get resolved with at runtime."
+		  fi
+		else
+		  droppeddeps=yes
+		  echo
+		  echo "*** Warning!  Library $i is needed by this library but I was not able to"
+		  echo "***  make it link in!  You will probably need to install it or some"
+		  echo "*** library that it depends on before this library will be fully"
+		  echo "*** functional.  Installing it before continuing would be even better."
+		fi
+	      else
+		newdeplibs="$newdeplibs $i"
+	      fi
+	    done
+	  fi
+	  ;;
+	file_magic*)
+	  set dummy $deplibs_check_method
+	  file_magic_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    name="`expr $a_deplib : '-l\(.*\)'`"
+	    # If $name is empty we are operating on a -L argument.
+	    if test -n "$name" && test "$name" != "0"; then
+	      libname=`eval \\$echo \"$libname_spec\"`
+	      for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		    potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+		    for potent_lib in $potential_libs; do
+		      # Follow soft links.
+		      if ls -lLd "$potent_lib" 2>/dev/null \
+			 | grep " -> " >/dev/null; then
+			continue
+		      fi
+		      # The statement above tries to avoid entering an
+		      # endless loop below, in case of cyclic links.
+		      # We might still enter an endless loop, since a link
+		      # loop can be closed while we follow links,
+		      # but so what?
+		      potlib="$potent_lib"
+		      while test -h "$potlib" 2>/dev/null; do
+			potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
+			case $potliblink in
+			[\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
+			*) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";;
+			esac
+		      done
+		      if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \
+			 | ${SED} 10q \
+			 | egrep "$file_magic_regex" > /dev/null; then
+			newdeplibs="$newdeplibs $a_deplib"
+			a_deplib=""
+			break 2
+		      fi
+		    done
+	      done
+	      if test -n "$a_deplib" ; then
+		droppeddeps=yes
+		echo
+		echo "*** Warning: linker path does not have real file for library $a_deplib."
+		echo "*** I have the capability to make that library automatically link in when"
+		echo "*** you link to this library.  But I can only do this if you have a"
+		echo "*** shared version of the library, which you do not appear to have"
+		echo "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib" ; then
+		  echo "*** with $libname but no candidates were found. (...for file magic test)"
+		else
+		  echo "*** with $libname and none of the candidates passed a file format test"
+		  echo "*** using a file magic. Last file checked: $potlib"
+		fi
+	      fi
+	    else
+	      # Add a -L argument.
+	      newdeplibs="$newdeplibs $a_deplib"
+	    fi
+	  done # Gone through all deplibs.
+	  ;;
+	match_pattern*)
+	  set dummy $deplibs_check_method
+	  match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    name="`expr $a_deplib : '-l\(.*\)'`"
+	    # If $name is empty we are operating on a -L argument.
+	    if test -n "$name" && test "$name" != "0"; then
+	      libname=`eval \\$echo \"$libname_spec\"`
+	      for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+		for potent_lib in $potential_libs; do
+		  potlib="$potent_lib" # see symlink-check below in file_magic test
+		  if eval echo \"$potent_lib\" 2>/dev/null \
+		      | ${SED} 10q \
+		      | egrep "$match_pattern_regex" > /dev/null; then
+		    newdeplibs="$newdeplibs $a_deplib"
+		    a_deplib=""
+		    break 2
+		  fi
+		done
+	      done
+	      if test -n "$a_deplib" ; then
+		droppeddeps=yes
+		echo
+		echo "*** Warning: linker path does not have real file for library $a_deplib."
+		echo "*** I have the capability to make that library automatically link in when"
+		echo "*** you link to this library.  But I can only do this if you have a"
+		echo "*** shared version of the library, which you do not appear to have"
+		echo "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib" ; then
+		  echo "*** with $libname but no candidates were found. (...for regex pattern test)"
+		else
+		  echo "*** with $libname and none of the candidates passed a file format test"
+		  echo "*** using a regex pattern. Last file checked: $potlib"
+		fi
+	      fi
+	    else
+	      # Add a -L argument.
+	      newdeplibs="$newdeplibs $a_deplib"
+	    fi
+	  done # Gone through all deplibs.
+	  ;;
+	none | unknown | *)
+	  newdeplibs=""
+	  if $echo "X $deplibs" | $Xsed -e 's/ -lc$//' \
+	       -e 's/ -[LR][^ ]*//g' -e 's/[ 	]//g' |
+	     grep . >/dev/null; then
+	    echo
+	    if test "X$deplibs_check_method" = "Xnone"; then
+	      echo "*** Warning: inter-library dependencies are not supported in this platform."
+	    else
+	      echo "*** Warning: inter-library dependencies are not known to be supported."
+	    fi
+	    echo "*** All declared inter-library dependencies are being dropped."
+	    droppeddeps=yes
+	  fi
+	  ;;
+	esac
+	versuffix=$versuffix_save
+	major=$major_save
+	release=$release_save
+	libname=$libname_save
+	name=$name_save
+
+	case $host in
+	*-*-rhapsody* | *-*-darwin1.[012])
+	  # On Rhapsody replace the C library is the System framework
+	  newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'`
+	  ;;
+	esac
+
+	if test "$droppeddeps" = yes; then
+	  if test "$module" = yes; then
+	    echo
+	    echo "*** Warning: libtool could not satisfy all declared inter-library"
+	    echo "*** dependencies of module $libname.  Therefore, libtool will create"
+	    echo "*** a static module, that should work as long as the dlopening"
+	    echo "*** application is linked with the -dlopen flag."
+	    if test -z "$global_symbol_pipe"; then
+	      echo
+	      echo "*** However, this would only work if libtool was able to extract symbol"
+	      echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+	      echo "*** not find such a program.  So, this module is probably useless."
+	      echo "*** \`nm' from GNU binutils and a full rebuild may help."
+	    fi
+	    if test "$build_old_libs" = no; then
+	      oldlibs="$output_objdir/$libname.$libext"
+	      build_libtool_libs=module
+	      build_old_libs=yes
+	    else
+	      build_libtool_libs=no
+	    fi
+	  else
+	    echo "*** The inter-library dependencies that have been dropped here will be"
+	    echo "*** automatically added whenever a program is linked with this library"
+	    echo "*** or is declared to -dlopen it."
+
+	    if test $allow_undefined = no; then
+	      echo
+	      echo "*** Since this library must not contain undefined symbols,"
+	      echo "*** because either the platform does not support them or"
+	      echo "*** it was explicitly requested with -no-undefined,"
+	      echo "*** libtool will only create a static version of it."
+	      if test "$build_old_libs" = no; then
+		oldlibs="$output_objdir/$libname.$libext"
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  fi
+	fi
+	# Done checking deplibs!
+	deplibs=$newdeplibs
+      fi
+
+      # All the library-specific variables (install_libdir is set above).
+      library_names=
+      old_library=
+      dlname=
+
+      # Test again, we may have decided not to build it any more
+      if test "$build_libtool_libs" = yes; then
+	if test $hardcode_into_libs = yes; then
+	  # Hardcode the library paths
+	  hardcode_libdirs=
+	  dep_rpath=
+	  rpath="$finalize_rpath"
+	  test "$mode" != relink && rpath="$compile_rpath$rpath"
+	  for libdir in $rpath; do
+	    if test -n "$hardcode_libdir_flag_spec"; then
+	      if test -n "$hardcode_libdir_separator"; then
+		if test -z "$hardcode_libdirs"; then
+		  hardcode_libdirs="$libdir"
+		else
+		  # Just accumulate the unique libdirs.
+		  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+		  *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		    ;;
+		  *)
+		    hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+		    ;;
+		  esac
+		fi
+	      else
+		eval flag=\"$hardcode_libdir_flag_spec\"
+		dep_rpath="$dep_rpath $flag"
+	      fi
+	    elif test -n "$runpath_var"; then
+	      case "$perm_rpath " in
+	      *" $libdir "*) ;;
+	      *) perm_rpath="$perm_rpath $libdir" ;;
+	      esac
+	    fi
+	  done
+	  # Substitute the hardcoded libdirs into the rpath.
+	  if test -n "$hardcode_libdir_separator" &&
+	     test -n "$hardcode_libdirs"; then
+	    libdir="$hardcode_libdirs"
+	    eval dep_rpath=\"$hardcode_libdir_flag_spec\"
+	  fi
+	  if test -n "$runpath_var" && test -n "$perm_rpath"; then
+	    # We should set the runpath_var.
+	    rpath=
+	    for dir in $perm_rpath; do
+	      rpath="$rpath$dir:"
+	    done
+	    eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
+	  fi
+	  test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
+	fi
+
+	shlibpath="$finalize_shlibpath"
+	test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
+	if test -n "$shlibpath"; then
+	  eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
+	fi
+
+	# Get the real and link names of the library.
+	eval library_names=\"$library_names_spec\"
+	set dummy $library_names
+	realname="$2"
+	shift; shift
+
+	if test -n "$soname_spec"; then
+	  eval soname=\"$soname_spec\"
+	else
+	  soname="$realname"
+	fi
+	test -z "$dlname" && dlname=$soname
+
+	lib="$output_objdir/$realname"
+	for link
+	do
+	  linknames="$linknames $link"
+	done
+
+	# Ensure that we have .o objects for linkers which dislike .lo
+	# (e.g. aix) in case we are running --disable-static
+	for obj in $libobjs; do
+	  xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'`
+	  if test "X$xdir" = "X$obj"; then
+	    xdir="."
+	  else
+	    xdir="$xdir"
+	  fi
+	  baseobj=`$echo "X$obj" | $Xsed -e 's%^.*/%%'`
+	  oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"`
+	  if test ! -f $xdir/$oldobj; then
+	    $show "(cd $xdir && ${LN_S} $baseobj $oldobj)"
+	    $run eval '(cd $xdir && ${LN_S} $baseobj $oldobj)' || exit $?
+	  fi
+	done
+
+	# Use standard objects if they are pic
+	test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+
+	# Prepare the list of exported symbols
+	if test -z "$export_symbols"; then
+	  if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
+	    $show "generating symbol list for \`$libname.la'"
+	    export_symbols="$output_objdir/$libname.exp"
+	    $run $rm $export_symbols
+	    eval cmds=\"$export_symbols_cmds\"
+	    save_ifs="$IFS"; IFS='~'
+	    for cmd in $cmds; do
+	      IFS="$save_ifs"
+	      $show "$cmd"
+	      $run eval "$cmd" || exit $?
+	    done
+	    IFS="$save_ifs"
+	    if test -n "$export_symbols_regex"; then
+	      $show "egrep -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\""
+	      $run eval 'egrep -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+	      $show "$mv \"${export_symbols}T\" \"$export_symbols\""
+	      $run eval '$mv "${export_symbols}T" "$export_symbols"'
+	    fi
+	  fi
+	fi
+
+	if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	  $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"'
+	fi
+
+	if test -n "$convenience"; then
+	  if test -n "$whole_archive_flag_spec"; then
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	  else
+	    gentop="$output_objdir/${outputname}x"
+	    $show "${rm}r $gentop"
+	    $run ${rm}r "$gentop"
+	    $show "mkdir $gentop"
+	    $run mkdir "$gentop"
+	    status=$?
+	    if test $status -ne 0 && test ! -d "$gentop"; then
+	      exit $status
+	    fi
+	    generated="$generated $gentop"
+
+	    for xlib in $convenience; do
+	      # Extract the objects.
+	      case $xlib in
+	      [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;;
+	      *) xabs=`pwd`"/$xlib" ;;
+	      esac
+	      xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'`
+	      xdir="$gentop/$xlib"
+
+	      $show "${rm}r $xdir"
+	      $run ${rm}r "$xdir"
+	      $show "mkdir $xdir"
+	      $run mkdir "$xdir"
+	      status=$?
+	      if test $status -ne 0 && test ! -d "$xdir"; then
+		exit $status
+	      fi
+	      $show "(cd $xdir && $AR x $xabs)"
+	      $run eval "(cd \$xdir && $AR x \$xabs)" || exit $?
+
+	      libobjs="$libobjs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP`
+	    done
+	  fi
+	fi
+
+	if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
+	  eval flag=\"$thread_safe_flag_spec\"
+	  linker_flags="$linker_flags $flag"
+	fi
+
+	# Make a backup of the uninstalled library when relinking
+	if test "$mode" = relink; then
+	  $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $?
+	fi
+
+	# Do each of the archive commands.
+	if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	  eval cmds=\"$archive_expsym_cmds\"
+	else
+	  save_deplibs="$deplibs"
+	  for conv in $convenience; do
+	    tmp_deplibs=
+	    for test_deplib in $deplibs; do
+	      if test "$test_deplib" != "$conv"; then
+		tmp_deplibs="$tmp_deplibs $test_deplib"
+	      fi
+	    done
+	    deplibs="$tmp_deplibs"
+	  done
+	  eval cmds=\"$archive_cmds\"
+	  deplibs="$save_deplibs"
+	fi
+	save_ifs="$IFS"; IFS='~'
+	for cmd in $cmds; do
+	  IFS="$save_ifs"
+	  $show "$cmd"
+	  $run eval "$cmd" || exit $?
+	done
+	IFS="$save_ifs"
+
+	# Restore the uninstalled library and exit
+	if test "$mode" = relink; then
+	  $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $?
+	  exit 0
+	fi
+
+	# Create links to the real library.
+	for linkname in $linknames; do
+	  if test "$realname" != "$linkname"; then
+	    $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)"
+	    $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $?
+	  fi
+	done
+
+	# If -module or -export-dynamic was specified, set the dlname.
+	if test "$module" = yes || test "$export_dynamic" = yes; then
+	  # On all known operating systems, these are identical.
+	  dlname="$soname"
+	fi
+      fi
+      ;;
+
+    obj)
+      if test -n "$deplibs"; then
+	$echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2
+      fi
+
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	$echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2
+      fi
+
+      if test -n "$rpath"; then
+	$echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2
+      fi
+
+      if test -n "$xrpath"; then
+	$echo "$modename: warning: \`-R' is ignored for objects" 1>&2
+      fi
+
+      if test -n "$vinfo"; then
+	$echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2
+      fi
+
+      if test -n "$release"; then
+	$echo "$modename: warning: \`-release' is ignored for objects" 1>&2
+      fi
+
+      case $output in
+      *.lo)
+	if test -n "$objs$old_deplibs"; then
+	  $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2
+	  exit 1
+	fi
+	libobj="$output"
+	obj=`$echo "X$output" | $Xsed -e "$lo2o"`
+	;;
+      *)
+	libobj=
+	obj="$output"
+	;;
+      esac
+
+      # Delete the old objects.
+      $run $rm $obj $libobj
+
+      # Objects from convenience libraries.  This assumes
+      # single-version convenience libraries.  Whenever we create
+      # different ones for PIC/non-PIC, this we'll have to duplicate
+      # the extraction.
+      reload_conv_objs=
+      gentop=
+      # reload_cmds runs $LD directly, so let us get rid of
+      # -Wl from whole_archive_flag_spec
+      wl=
+
+      if test -n "$convenience"; then
+	if test -n "$whole_archive_flag_spec"; then
+	  eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\"
+	else
+	  gentop="$output_objdir/${obj}x"
+	  $show "${rm}r $gentop"
+	  $run ${rm}r "$gentop"
+	  $show "mkdir $gentop"
+	  $run mkdir "$gentop"
+	  status=$?
+	  if test $status -ne 0 && test ! -d "$gentop"; then
+	    exit $status
+	  fi
+	  generated="$generated $gentop"
+
+	  for xlib in $convenience; do
+	    # Extract the objects.
+	    case $xlib in
+	    [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;;
+	    *) xabs=`pwd`"/$xlib" ;;
+	    esac
+	    xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'`
+	    xdir="$gentop/$xlib"
+
+	    $show "${rm}r $xdir"
+	    $run ${rm}r "$xdir"
+	    $show "mkdir $xdir"
+	    $run mkdir "$xdir"
+	    status=$?
+	    if test $status -ne 0 && test ! -d "$xdir"; then
+	      exit $status
+	    fi
+	    $show "(cd $xdir && $AR x $xabs)"
+	    $run eval "(cd \$xdir && $AR x \$xabs)" || exit $?
+
+	    reload_conv_objs="$reload_objs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP`
+	  done
+	fi
+      fi
+
+      # Create the old-style object.
+      reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
+
+      output="$obj"
+      eval cmds=\"$reload_cmds\"
+      save_ifs="$IFS"; IFS='~'
+      for cmd in $cmds; do
+	IFS="$save_ifs"
+	$show "$cmd"
+	$run eval "$cmd" || exit $?
+      done
+      IFS="$save_ifs"
+
+      # Exit if we aren't doing a library object file.
+      if test -z "$libobj"; then
+	if test -n "$gentop"; then
+	  $show "${rm}r $gentop"
+	  $run ${rm}r $gentop
+	fi
+
+	exit 0
+      fi
+
+      if test "$build_libtool_libs" != yes; then
+	if test -n "$gentop"; then
+	  $show "${rm}r $gentop"
+	  $run ${rm}r $gentop
+	fi
+
+	# Create an invalid libtool object if no PIC, so that we don't
+	# accidentally link it into a program.
+	$show "echo timestamp > $libobj"
+	$run eval "echo timestamp > $libobj" || exit $?
+	exit 0
+      fi
+
+      if test -n "$pic_flag" || test "$pic_mode" != default; then
+	# Only do commands if we really have different PIC objects.
+	reload_objs="$libobjs $reload_conv_objs"
+	output="$libobj"
+	eval cmds=\"$reload_cmds\"
+	save_ifs="$IFS"; IFS='~'
+	for cmd in $cmds; do
+	  IFS="$save_ifs"
+	  $show "$cmd"
+	  $run eval "$cmd" || exit $?
+	done
+	IFS="$save_ifs"
+      else
+	# Just create a symlink.
+	$show $rm $libobj
+	$run $rm $libobj
+	xdir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'`
+	if test "X$xdir" = "X$libobj"; then
+	  xdir="."
+	else
+	  xdir="$xdir"
+	fi
+	baseobj=`$echo "X$libobj" | $Xsed -e 's%^.*/%%'`
+	oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"`
+	$show "(cd $xdir && $LN_S $oldobj $baseobj)"
+	$run eval '(cd $xdir && $LN_S $oldobj $baseobj)' || exit $?
+      fi
+
+      if test -n "$gentop"; then
+	$show "${rm}r $gentop"
+	$run ${rm}r $gentop
+      fi
+
+      exit 0
+      ;;
+
+    prog)
+      case $host in
+	*cygwin*) output=`echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;;
+      esac
+      if test -n "$vinfo"; then
+	$echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2
+      fi
+
+      if test -n "$release"; then
+	$echo "$modename: warning: \`-release' is ignored for programs" 1>&2
+      fi
+
+      if test "$preload" = yes; then
+	if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown &&
+	   test "$dlopen_self_static" = unknown; then
+	  $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support."
+	fi
+      fi
+
+      case $host in
+      *-*-rhapsody* | *-*-darwin1.[012])
+	# On Rhapsody replace the C library is the System framework
+	compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'`
+	finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'`
+	case $host in
+	*darwin*)
+	  # Don't allow lazy linking, it breaks C++ global constructors
+	  compile_command="$compile_command ${wl}-bind_at_load"
+	  finalize_command="$finalize_command ${wl}-bind_at_load"
+	  ;;
+	esac
+	;;
+      esac
+
+      compile_command="$compile_command $compile_deplibs"
+      finalize_command="$finalize_command $finalize_deplibs"
+
+      if test -n "$rpath$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	for libdir in $rpath $xrpath; do
+	  # This is the magic to use -rpath.
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) finalize_rpath="$finalize_rpath $libdir" ;;
+	  esac
+	done
+      fi
+
+      # Now hardcode the library paths
+      rpath=
+      hardcode_libdirs=
+      for libdir in $compile_rpath $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    rpath="$rpath $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) perm_rpath="$perm_rpath $libdir" ;;
+	  esac
+	fi
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+	  case :$dllsearchpath: in
+	  *":$libdir:"*) ;;
+	  *) dllsearchpath="$dllsearchpath:$libdir";;
+	  esac
+	  ;;
+	esac
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      compile_rpath="$rpath"
+
+      rpath=
+      hardcode_libdirs=
+      for libdir in $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    rpath="$rpath $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$finalize_perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;;
+	  esac
+	fi
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      finalize_rpath="$rpath"
+
+      if test -n "$libobjs" && test "$build_old_libs" = yes; then
+	# Transform all the library objects into standard objects.
+	compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+	finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+      fi
+
+      dlsyms=
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	if test -n "$NM" && test -n "$global_symbol_pipe"; then
+	  dlsyms="${outputname}S.c"
+	else
+	  $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2
+	fi
+      fi
+
+      if test -n "$dlsyms"; then
+	case $dlsyms in
+	"") ;;
+	*.c)
+	  # Discover the nlist of each of the dlfiles.
+	  nlist="$output_objdir/${outputname}.nm"
+
+	  $show "$rm $nlist ${nlist}S ${nlist}T"
+	  $run $rm "$nlist" "${nlist}S" "${nlist}T"
+
+	  # Parse the name list into a source file.
+	  $show "creating $output_objdir/$dlsyms"
+
+	  test -z "$run" && $echo > "$output_objdir/$dlsyms" "\
+/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */
+/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */
+
+#ifdef __cplusplus
+extern \"C\" {
+#endif
+
+/* Prevent the only kind of declaration conflicts we can make. */
+#define lt_preloaded_symbols some_other_symbol
+
+/* External symbol declarations for the compiler. */\
+"
+
+	  if test "$dlself" = yes; then
+	    $show "generating symbol list for \`$output'"
+
+	    test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist"
+
+	    # Add our own program objects to the symbol list.
+	    progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+	    for arg in $progfiles; do
+	      $show "extracting global C symbols from \`$arg'"
+	      $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
+	    done
+
+	    if test -n "$exclude_expsyms"; then
+	      $run eval 'egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
+	      $run eval '$mv "$nlist"T "$nlist"'
+	    fi
+
+	    if test -n "$export_symbols_regex"; then
+	      $run eval 'egrep -e "$export_symbols_regex" "$nlist" > "$nlist"T'
+	      $run eval '$mv "$nlist"T "$nlist"'
+	    fi
+
+	    # Prepare the list of exported symbols
+	    if test -z "$export_symbols"; then
+	      export_symbols="$output_objdir/$output.exp"
+	      $run $rm $export_symbols
+	      $run eval "${SED} -n -e '/^: @PROGRAM@$/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
+	    else
+	      $run eval "${SED} -e 's/\([][.*^$]\)/\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$output.exp"'
+	      $run eval 'grep -f "$output_objdir/$output.exp" < "$nlist" > "$nlist"T'
+	      $run eval 'mv "$nlist"T "$nlist"'
+	    fi
+	  fi
+
+	  for arg in $dlprefiles; do
+	    $show "extracting global C symbols from \`$arg'"
+	    name=`echo "$arg" | ${SED} -e 's%^.*/%%'`
+	    $run eval 'echo ": $name " >> "$nlist"'
+	    $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
+	  done
+
+	  if test -z "$run"; then
+	    # Make sure we have at least an empty file.
+	    test -f "$nlist" || : > "$nlist"
+
+	    if test -n "$exclude_expsyms"; then
+	      egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
+	      $mv "$nlist"T "$nlist"
+	    fi
+
+	    # Try sorting and uniquifying the output.
+	    if grep -v "^: " < "$nlist" |
+		if sort -k 3 </dev/null >/dev/null 2>&1; then
+		  sort -k 3
+		else
+		  sort +2
+		fi |
+		uniq > "$nlist"S; then
+	      :
+	    else
+	      grep -v "^: " < "$nlist" > "$nlist"S
+	    fi
+
+	    if test -f "$nlist"S; then
+	      eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"'
+	    else
+	      echo '/* NONE */' >> "$output_objdir/$dlsyms"
+	    fi
+
+	    $echo >> "$output_objdir/$dlsyms" "\
+
+#undef lt_preloaded_symbols
+
+#if defined (__STDC__) && __STDC__
+# define lt_ptr void *
+#else
+# define lt_ptr char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+const struct {
+  const char *name;
+  lt_ptr address;
+}
+lt_preloaded_symbols[] =
+{\
+"
+
+	    eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms"
+
+	    $echo >> "$output_objdir/$dlsyms" "\
+  {0, (lt_ptr) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif\
+"
+	  fi
+
+	  pic_flag_for_symtable=
+	  case $host in
+	  # compiling the symbol table file with pic_flag works around
+	  # a FreeBSD bug that causes programs to crash when -lm is
+	  # linked before any other PIC object.  But we must not use
+	  # pic_flag when linking with -static.  The problem exists in
+	  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
+	  *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
+	    case "$compile_command " in
+	    *" -static "*) ;;
+	    *) pic_flag_for_symtable=" $pic_flag -DPIC -DFREEBSD_WORKAROUND";;
+	    esac;;
+	  *-*-hpux*)
+	    case "$compile_command " in
+	    *" -static "*) ;;
+	    *) pic_flag_for_symtable=" $pic_flag -DPIC";;
+	    esac
+	  esac
+
+	  # Now compile the dynamic symbol file.
+	  $show "(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")"
+	  $run eval '(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $?
+
+	  # Clean up the generated files.
+	  $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T"
+	  $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T"
+
+	  # Transform the symbol file into the correct name.
+	  compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
+	  finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
+	  ;;
+	*)
+	  $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2
+	  exit 1
+	  ;;
+	esac
+      else
+	# We keep going just in case the user didn't refer to
+	# lt_preloaded_symbols.  The linker will fail if global_symbol_pipe
+	# really was required.
+
+	# Nullify the symbol file.
+	compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"`
+	finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"`
+      fi
+
+      if test $need_relink = no || test "$build_libtool_libs" != yes; then
+	# Replace the output file specification.
+	compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+	link_command="$compile_command$compile_rpath"
+
+	# We have no uninstalled library dependencies, so finalize right now.
+	$show "$link_command"
+	$run eval "$link_command"
+	status=$?
+
+	# Delete the generated files.
+	if test -n "$dlsyms"; then
+	  $show "$rm $output_objdir/${outputname}S.${objext}"
+	  $run $rm "$output_objdir/${outputname}S.${objext}"
+	fi
+
+	exit $status
+      fi
+
+      if test -n "$shlibpath_var"; then
+	# We should set the shlibpath_var
+	rpath=
+	for dir in $temp_rpath; do
+	  case $dir in
+	  [\\/]* | [A-Za-z]:[\\/]*)
+	    # Absolute path.
+	    rpath="$rpath$dir:"
+	    ;;
+	  *)
+	    # Relative path: add a thisdir entry.
+	    rpath="$rpath\$thisdir/$dir:"
+	    ;;
+	  esac
+	done
+	temp_rpath="$rpath"
+      fi
+
+      if test -n "$compile_shlibpath$finalize_shlibpath"; then
+	compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
+      fi
+      if test -n "$finalize_shlibpath"; then
+	finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
+      fi
+
+      compile_var=
+      finalize_var=
+      if test -n "$runpath_var"; then
+	if test -n "$perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $perm_rpath; do
+	    rpath="$rpath$dir:"
+	  done
+	  compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+	if test -n "$finalize_perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $finalize_perm_rpath; do
+	    rpath="$rpath$dir:"
+	  done
+	  finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+      fi
+
+      if test "$no_install" = yes; then
+	# We don't need to create a wrapper script.
+	link_command="$compile_var$compile_command$compile_rpath"
+	# Replace the output file specification.
+	link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+	# Delete the old output file.
+	$run $rm $output
+	# Link the executable and exit
+	$show "$link_command"
+	$run eval "$link_command" || exit $?
+	exit 0
+      fi
+
+      if test "$hardcode_action" = relink; then
+	# Fast installation is not supported
+	link_command="$compile_var$compile_command$compile_rpath"
+	relink_command="$finalize_var$finalize_command$finalize_rpath"
+
+	$echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2
+	$echo "$modename: \`$output' will be relinked during installation" 1>&2
+      else
+	if test "$fast_install" != no; then
+	  link_command="$finalize_var$compile_command$finalize_rpath"
+	  if test "$fast_install" = yes; then
+	    relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'`
+	  else
+	    # fast_install is set to needless
+	    relink_command=
+	  fi
+	else
+	  link_command="$compile_var$compile_command$compile_rpath"
+	  relink_command="$finalize_var$finalize_command$finalize_rpath"
+	fi
+      fi
+
+      # Replace the output file specification.
+      link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
+
+      # Delete the old output files.
+      $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname
+
+      $show "$link_command"
+      $run eval "$link_command" || exit $?
+
+      # Now create the wrapper script.
+      $show "creating $output"
+
+      # Quote the relink command for shipping.
+      if test -n "$relink_command"; then
+	# Preserve any variables that may affect compiler behavior
+	for var in $variables_saved_for_relink; do
+	  if eval test -z \"\${$var+set}\"; then
+	    relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command"
+	  elif eval var_value=\$$var; test -z "$var_value"; then
+	    relink_command="$var=; export $var; $relink_command"
+	  else
+	    var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"`
+	    relink_command="$var=\"$var_value\"; export $var; $relink_command"
+	  fi
+	done
+	relink_command="(cd `pwd`; $relink_command)"
+	relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"`
+      fi
+
+      # Quote $echo for shipping.
+      if test "X$echo" = "X$SHELL $0 --fallback-echo"; then
+	case $0 in
+	[\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $0 --fallback-echo";;
+	*) qecho="$SHELL `pwd`/$0 --fallback-echo";;
+	esac
+	qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"`
+      else
+	qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"`
+      fi
+
+      # Only actually do things if our run command is non-null.
+      if test -z "$run"; then
+	# win32 will think the script is a binary if it has
+	# a .exe suffix, so we strip it off here.
+	case $output in
+	  *.exe) output=`echo $output|${SED} 's,.exe$,,'` ;;
+	esac
+	# test for cygwin because mv fails w/o .exe extensions
+	case $host in
+	  *cygwin*) exeext=.exe ;;
+	  *) exeext= ;;
+	esac
+	$rm $output
+	trap "$rm $output; exit 1" 1 2 15
+
+	$echo > $output "\
+#! $SHELL
+
+# $output - temporary wrapper script for $objdir/$outputname
+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+#
+# The $output program cannot be directly executed until all the libtool
+# libraries that it depends on are installed.
+#
+# This wrapper script should never be moved out of the build directory.
+# If it is, it will not operate correctly.
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed="${SED}"' -e 1s/^X//'
+sed_quote_subst='$sed_quote_subst'
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+if test \"\${CDPATH+set}\" = set; then CDPATH=:; export CDPATH; fi
+
+relink_command=\"$relink_command\"
+
+# This environment variable determines our operation mode.
+if test \"\$libtool_install_magic\" = \"$magic\"; then
+  # install mode needs the following variable:
+  notinst_deplibs='$notinst_deplibs'
+else
+  # When we are sourced in execute mode, \$file and \$echo are already set.
+  if test \"\$libtool_execute_magic\" != \"$magic\"; then
+    echo=\"$qecho\"
+    file=\"\$0\"
+    # Make sure echo works.
+    if test \"X\$1\" = X--no-reexec; then
+      # Discard the --no-reexec flag, and continue.
+      shift
+    elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then
+      # Yippee, \$echo works!
+      :
+    else
+      # Restart under the correct shell, and then maybe \$echo will work.
+      exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"}
+    fi
+  fi\
+"
+	$echo >> $output "\
+
+  # Find the directory that this script lives in.
+  thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\`
+  test \"x\$thisdir\" = \"x\$file\" && thisdir=.
+
+  # Follow symbolic links until we get to the real thisdir.
+  file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\`
+  while test -n \"\$file\"; do
+    destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\`
+
+    # If there was a directory component, then change thisdir.
+    if test \"x\$destdir\" != \"x\$file\"; then
+      case \"\$destdir\" in
+      [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
+      *) thisdir=\"\$thisdir/\$destdir\" ;;
+      esac
+    fi
+
+    file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\`
+    file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\`
+  done
+
+  # Try to get the absolute directory name.
+  absdir=\`cd \"\$thisdir\" && pwd\`
+  test -n \"\$absdir\" && thisdir=\"\$absdir\"
+"
+
+	if test "$fast_install" = yes; then
+	  echo >> $output "\
+  program=lt-'$outputname'$exeext
+  progdir=\"\$thisdir/$objdir\"
+
+  if test ! -f \"\$progdir/\$program\" || \\
+     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
+       test \"X\$file\" != \"X\$progdir/\$program\"; }; then
+
+    file=\"\$\$-\$program\"
+
+    if test ! -d \"\$progdir\"; then
+      $mkdir \"\$progdir\"
+    else
+      $rm \"\$progdir/\$file\"
+    fi"
+
+	  echo >> $output "\
+
+    # relink executable if necessary
+    if test -n \"\$relink_command\"; then
+      if relink_command_output=\`eval \$relink_command 2>&1\`; then :
+      else
+	$echo \"\$relink_command_output\" >&2
+	$rm \"\$progdir/\$file\"
+	exit 1
+      fi
+    fi
+
+    $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
+    { $rm \"\$progdir/\$program\";
+      $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; }
+    $rm \"\$progdir/\$file\"
+  fi"
+	else
+	  echo >> $output "\
+  program='$outputname'
+  progdir=\"\$thisdir/$objdir\"
+"
+	fi
+
+	echo >> $output "\
+
+  if test -f \"\$progdir/\$program\"; then"
+
+	# Export our shlibpath_var if we have one.
+	if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+	  $echo >> $output "\
+    # Add our own library path to $shlibpath_var
+    $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
+
+    # Some systems cannot cope with colon-terminated $shlibpath_var
+    # The second colon is a workaround for a bug in BeOS R4 ${SED}
+    $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\`
+
+    export $shlibpath_var
+"
+	fi
+
+	# fixup the dll searchpath if we need to.
+	if test -n "$dllsearchpath"; then
+	  $echo >> $output "\
+    # Add the dll search path components to the executable PATH
+    PATH=$dllsearchpath:\$PATH
+"
+	fi
+
+	$echo >> $output "\
+    if test \"\$libtool_execute_magic\" != \"$magic\"; then
+      # Run the actual program with our arguments.
+"
+	case $host in
+	# win32 systems need to use the prog path for dll
+	# lookup to work
+	*-*-cygwin* | *-*-pw32*)
+	  $echo >> $output "\
+      exec \$progdir/\$program \${1+\"\$@\"}
+"
+	  ;;
+
+	# Backslashes separate directories on plain windows
+	*-*-mingw | *-*-os2*)
+	  $echo >> $output "\
+      exec \$progdir\\\\\$program \${1+\"\$@\"}
+"
+	  ;;
+
+	*)
+	  $echo >> $output "\
+      # Export the path to the program.
+      PATH=\"\$progdir:\$PATH\"
+      export PATH
+
+      exec \$program \${1+\"\$@\"}
+"
+	  ;;
+	esac
+	$echo >> $output "\
+      \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\"
+      exit 1
+    fi
+  else
+    # The program doesn't exist.
+    \$echo \"\$0: error: \$progdir/\$program does not exist\" 1>&2
+    \$echo \"This script is just a wrapper for \$program.\" 1>&2
+    echo \"See the $PACKAGE documentation for more information.\" 1>&2
+    exit 1
+  fi
+fi\
+"
+	chmod +x $output
+      fi
+      exit 0
+      ;;
+    esac
+
+    # See if we need to build an old-fashioned archive.
+    for oldlib in $oldlibs; do
+
+      if test "$build_libtool_libs" = convenience; then
+	oldobjs="$libobjs_save"
+	addlibs="$convenience"
+	build_libtool_libs=no
+      else
+	if test "$build_libtool_libs" = module; then
+	  oldobjs="$libobjs_save"
+	  build_libtool_libs=no
+	else
+	  oldobjs="$objs$old_deplibs "`$echo "X$libobjs_save" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`
+	fi
+	addlibs="$old_convenience"
+      fi
+
+      if test -n "$addlibs"; then
+	gentop="$output_objdir/${outputname}x"
+	$show "${rm}r $gentop"
+	$run ${rm}r "$gentop"
+	$show "mkdir $gentop"
+	$run mkdir "$gentop"
+	status=$?
+	if test $status -ne 0 && test ! -d "$gentop"; then
+	  exit $status
+	fi
+	generated="$generated $gentop"
+
+	# Add in members from convenience archives.
+	for xlib in $addlibs; do
+	  # Extract the objects.
+	  case $xlib in
+	  [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;;
+	  *) xabs=`pwd`"/$xlib" ;;
+	  esac
+	  xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'`
+	  xdir="$gentop/$xlib"
+
+	  $show "${rm}r $xdir"
+	  $run ${rm}r "$xdir"
+	  $show "mkdir $xdir"
+	  $run mkdir "$xdir"
+	  status=$?
+	  if test $status -ne 0 && test ! -d "$xdir"; then
+	    exit $status
+	  fi
+	  $show "(cd $xdir && $AR x $xabs)"
+	  $run eval "(cd \$xdir && $AR x \$xabs)" || exit $?
+
+	  oldobjs="$oldobjs "`find $xdir -name \*.${objext} -print -o -name \*.lo -print | $NL2SP`
+	done
+      fi
+
+      # Do each command in the archive commands.
+      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
+	eval cmds=\"$old_archive_from_new_cmds\"
+      else
+	# Ensure that we have .o objects in place in case we decided
+	# not to build a shared library, and have fallen back to building
+	# static libs even though --disable-static was passed!
+	for oldobj in $oldobjs; do
+	  if test ! -f $oldobj; then
+	    xdir=`$echo "X$oldobj" | $Xsed -e 's%/[^/]*$%%'`
+	    if test "X$xdir" = "X$oldobj"; then
+	      xdir="."
+	    else
+	      xdir="$xdir"
+	    fi
+	    baseobj=`$echo "X$oldobj" | $Xsed -e 's%^.*/%%'`
+	    obj=`$echo "X$baseobj" | $Xsed -e "$o2lo"`
+	    $show "(cd $xdir && ${LN_S} $obj $baseobj)"
+	    $run eval '(cd $xdir && ${LN_S} $obj $baseobj)' || exit $?
+	  fi
+	done
+
+	eval cmds=\"$old_archive_cmds\"
+      fi
+      save_ifs="$IFS"; IFS='~'
+      for cmd in $cmds; do
+	IFS="$save_ifs"
+	$show "$cmd"
+	$run eval "$cmd" || exit $?
+      done
+      IFS="$save_ifs"
+    done
+
+    if test -n "$generated"; then
+      $show "${rm}r$generated"
+      $run ${rm}r$generated
+    fi
+
+    # Now create the libtool archive.
+    case $output in
+    *.la)
+      old_library=
+      test "$build_old_libs" = yes && old_library="$libname.$libext"
+      $show "creating $output"
+
+      # Preserve any variables that may affect compiler behavior
+      for var in $variables_saved_for_relink; do
+	if eval test -z \"\${$var+set}\"; then
+	  relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command"
+	elif eval var_value=\$$var; test -z "$var_value"; then
+	  relink_command="$var=; export $var; $relink_command"
+	else
+	  var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"`
+	  relink_command="$var=\"$var_value\"; export $var; $relink_command"
+	fi
+      done
+      # Quote the link command for shipping.
+      relink_command="(cd `pwd`; $SHELL $0 --mode=relink $libtool_args @inst_prefix_dir@)"
+      relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"`
+
+      # Only create the output if not a dry run.
+      if test -z "$run"; then
+	for installed in no yes; do
+	  if test "$installed" = yes; then
+	    if test -z "$install_libdir"; then
+	      break
+	    fi
+	    output="$output_objdir/$outputname"i
+	    # Replace all uninstalled libtool libraries with the installed ones
+	    newdependency_libs=
+	    for deplib in $dependency_libs; do
+	      case $deplib in
+	      *.la)
+		name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'`
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+		if test -z "$libdir"; then
+		  $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2
+		  exit 1
+		fi
+		newdependency_libs="$newdependency_libs $libdir/$name"
+		;;
+	      *) newdependency_libs="$newdependency_libs $deplib" ;;
+	      esac
+	    done
+	    dependency_libs="$newdependency_libs"
+	    newdlfiles=
+	    for lib in $dlfiles; do
+	      name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+	      eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+	      if test -z "$libdir"; then
+		$echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+		exit 1
+	      fi
+	      newdlfiles="$newdlfiles $libdir/$name"
+	    done
+	    dlfiles="$newdlfiles"
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+	      eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+	      if test -z "$libdir"; then
+		$echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+		exit 1
+	      fi
+	      newdlprefiles="$newdlprefiles $libdir/$name"
+	    done
+	    dlprefiles="$newdlprefiles"
+	  fi
+	  $rm $output
+	  # place dlname in correct position for cygwin
+	  tdlname=$dlname
+	  case $host,$output,$installed,$module,$dlname in
+	    *cygwin*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;;
+	  esac
+	  $echo > $output "\
+# $outputname - a libtool library file
+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='$tdlname'
+
+# Names of this library.
+library_names='$library_names'
+
+# The name of the static archive.
+old_library='$old_library'
+
+# Libraries that this one depends upon.
+dependency_libs='$dependency_libs'
+
+# Version information for $libname.
+current=$current
+age=$age
+revision=$revision
+
+# Is this an already installed library?
+installed=$installed
+
+# Files to dlopen/dlpreopen
+dlopen='$dlfiles'
+dlpreopen='$dlprefiles'
+
+# Directory that this library needs to be installed in:
+libdir='$install_libdir'"
+	  if test "$installed" = no && test $need_relink = yes; then
+	    $echo >> $output "\
+relink_command=\"$relink_command\""
+	  fi
+	done
+      fi
+
+      # Do a symbolic link so that the libtool archive can be found in
+      # LD_LIBRARY_PATH before the program is installed.
+      $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)"
+      $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $?
+      ;;
+    esac
+    exit 0
+    ;;
+
+  # libtool install mode
+  install)
+    modename="$modename: install"
+
+    # There may be an optional sh(1) argument at the beginning of
+    # install_prog (especially on Windows NT).
+    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
+       # Allow the use of GNU shtool's install command.
+       $echo "X$nonopt" | $Xsed | grep shtool > /dev/null; then
+      # Aesthetically quote it.
+      arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"`
+      case $arg in
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*)
+	arg="\"$arg\""
+	;;
+      esac
+      install_prog="$arg "
+      arg="$1"
+      shift
+    else
+      install_prog=
+      arg="$nonopt"
+    fi
+
+    # The real first argument should be the name of the installation program.
+    # Aesthetically quote it.
+    arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+    case $arg in
+    *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*)
+      arg="\"$arg\""
+      ;;
+    esac
+    install_prog="$install_prog$arg"
+
+    # We need to accept at least all the BSD install flags.
+    dest=
+    files=
+    opts=
+    prev=
+    install_type=
+    isdir=no
+    stripme=
+    for arg
+    do
+      if test -n "$dest"; then
+	files="$files $dest"
+	dest="$arg"
+	continue
+      fi
+
+      case $arg in
+      -d) isdir=yes ;;
+      -f) prev="-f" ;;
+      -g) prev="-g" ;;
+      -m) prev="-m" ;;
+      -o) prev="-o" ;;
+      -s)
+	stripme=" -s"
+	continue
+	;;
+      -*) ;;
+
+      *)
+	# If the previous option needed an argument, then skip it.
+	if test -n "$prev"; then
+	  prev=
+	else
+	  dest="$arg"
+	  continue
+	fi
+	;;
+      esac
+
+      # Aesthetically quote the argument.
+      arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+      case $arg in
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*)
+	arg="\"$arg\""
+	;;
+      esac
+      install_prog="$install_prog $arg"
+    done
+
+    if test -z "$install_prog"; then
+      $echo "$modename: you must specify an install program" 1>&2
+      $echo "$help" 1>&2
+      exit 1
+    fi
+
+    if test -n "$prev"; then
+      $echo "$modename: the \`$prev' option requires an argument" 1>&2
+      $echo "$help" 1>&2
+      exit 1
+    fi
+
+    if test -z "$files"; then
+      if test -z "$dest"; then
+	$echo "$modename: no file or destination specified" 1>&2
+      else
+	$echo "$modename: you must specify a destination" 1>&2
+      fi
+      $echo "$help" 1>&2
+      exit 1
+    fi
+
+    # Strip any trailing slash from the destination.
+    dest=`$echo "X$dest" | $Xsed -e 's%/$%%'`
+
+    # Check to see that the destination is a directory.
+    test -d "$dest" && isdir=yes
+    if test "$isdir" = yes; then
+      destdir="$dest"
+      destname=
+    else
+      destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'`
+      test "X$destdir" = "X$dest" && destdir=.
+      destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'`
+
+      # Not a directory, so check to see that there is only one file specified.
+      set dummy $files
+      if test $# -gt 2; then
+	$echo "$modename: \`$dest' is not a directory" 1>&2
+	$echo "$help" 1>&2
+	exit 1
+      fi
+    fi
+    case $destdir in
+    [\\/]* | [A-Za-z]:[\\/]*) ;;
+    *)
+      for file in $files; do
+	case $file in
+	*.lo) ;;
+	*)
+	  $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2
+	  $echo "$help" 1>&2
+	  exit 1
+	  ;;
+	esac
+      done
+      ;;
+    esac
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    staticlibs=
+    future_libdirs=
+    current_libdirs=
+    for file in $files; do
+
+      # Do each installation.
+      case $file in
+      *.$libext)
+	# Do the static libraries later.
+	staticlibs="$staticlibs $file"
+	;;
+
+      *.la)
+	# Check to see that this really is a libtool archive.
+	if (${SED} -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+	else
+	  $echo "$modename: \`$file' is not a valid libtool archive" 1>&2
+	  $echo "$help" 1>&2
+	  exit 1
+	fi
+
+	library_names=
+	old_library=
+	relink_command=
+	# If there is no directory component, then add one.
+	case $file in
+	*/* | *\\*) . $file ;;
+	*) . ./$file ;;
+	esac
+
+	# Add the libdir to current_libdirs if it is the destination.
+	if test "X$destdir" = "X$libdir"; then
+	  case "$current_libdirs " in
+	  *" $libdir "*) ;;
+	  *) current_libdirs="$current_libdirs $libdir" ;;
+	  esac
+	else
+	  # Note the libdir as a future libdir.
+	  case "$future_libdirs " in
+	  *" $libdir "*) ;;
+	  *) future_libdirs="$future_libdirs $libdir" ;;
+	  esac
+	fi
+
+	dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/
+	test "X$dir" = "X$file/" && dir=
+	dir="$dir$objdir"
+
+	if test -n "$relink_command"; then
+          # Determine the prefix the user has applied to our future dir.
+          inst_prefix_dir=`$echo "$destdir" | sed "s%$libdir\$%%"`
+ 
+          # Don't allow the user to place us outside of our expected
+          # location b/c this prevents finding dependent libraries that
+          # are installed to the same prefix.
+          if test "$inst_prefix_dir" = "$destdir"; then
+            $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2
+            exit 1
+          fi
+ 
+          if test -n "$inst_prefix_dir"; then
+            # Stick the inst_prefix_dir data into the link command.
+            relink_command=`$echo "$relink_command" | sed "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
+          else
+            relink_command=`$echo "$relink_command" | sed "s%@inst_prefix_dir@%%"`
+          fi
+
+	  $echo "$modename: warning: relinking \`$file'" 1>&2
+	  $show "$relink_command"
+	  if $run eval "$relink_command"; then :
+	  else
+	    $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
+	    exit 1
+	  fi
+	fi
+
+	# See the names of the shared library.
+	set dummy $library_names
+	if test -n "$2"; then
+	  realname="$2"
+	  shift
+	  shift
+
+	  srcname="$realname"
+	  test -n "$relink_command" && srcname="$realname"T
+
+	  # Install the shared library and build the symlinks.
+	  $show "$install_prog $dir/$srcname $destdir/$realname"
+	  $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $?
+	  if test -n "$stripme" && test -n "$striplib"; then
+	    $show "$striplib $destdir/$realname"
+	    $run eval "$striplib $destdir/$realname" || exit $?
+	  fi
+
+	  if test $# -gt 0; then
+	    # Delete the old symlinks, and create new ones.
+	    for linkname
+	    do
+	      if test "$linkname" != "$realname"; then
+		$show "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)"
+		$run eval "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)"
+	      fi
+	    done
+	  fi
+
+	  # Do each command in the postinstall commands.
+	  lib="$destdir/$realname"
+	  eval cmds=\"$postinstall_cmds\"
+	  save_ifs="$IFS"; IFS='~'
+	  for cmd in $cmds; do
+	    IFS="$save_ifs"
+	    $show "$cmd"
+	    $run eval "$cmd" || exit $?
+	  done
+	  IFS="$save_ifs"
+	fi
+
+	# Install the pseudo-library for information purposes.
+	name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+	instname="$dir/$name"i
+	$show "$install_prog $instname $destdir/$name"
+	$run eval "$install_prog $instname $destdir/$name" || exit $?
+
+	# Maybe install the static library, too.
+	test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library"
+	;;
+
+      *.lo)
+	# Install (i.e. copy) a libtool object.
+
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+	  destfile="$destdir/$destfile"
+	fi
+
+	# Deduce the name of the destination old-style object file.
+	case $destfile in
+	*.lo)
+	  staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"`
+	  ;;
+	*.$objext)
+	  staticdest="$destfile"
+	  destfile=
+	  ;;
+	*)
+	  $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2
+	  $echo "$help" 1>&2
+	  exit 1
+	  ;;
+	esac
+
+	# Install the libtool object if requested.
+	if test -n "$destfile"; then
+	  $show "$install_prog $file $destfile"
+	  $run eval "$install_prog $file $destfile" || exit $?
+	fi
+
+	# Install the old object if enabled.
+	if test "$build_old_libs" = yes; then
+	  # Deduce the name of the old-style object file.
+	  staticobj=`$echo "X$file" | $Xsed -e "$lo2o"`
+
+	  $show "$install_prog $staticobj $staticdest"
+	  $run eval "$install_prog \$staticobj \$staticdest" || exit $?
+	fi
+	exit 0
+	;;
+
+      *)
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+	  destfile="$destdir/$destfile"
+	fi
+
+	# Do a test to see if this is really a libtool program.
+	case $host in
+	*cygwin*|*mingw*)
+	    wrapper=`echo $file | ${SED} -e 's,.exe$,,'`
+	    ;;
+	*)
+	    wrapper=$file
+	    ;;
+	esac
+	if (${SED} -e '4q' $wrapper | egrep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then
+	  notinst_deplibs=
+	  relink_command=
+
+	  # If there is no directory component, then add one.
+	  case $file in
+	  */* | *\\*) . $wrapper ;;
+	  *) . ./$wrapper ;;
+	  esac
+
+	  # Check the variables that should have been set.
+	  if test -z "$notinst_deplibs"; then
+	    $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2
+	    exit 1
+	  fi
+
+	  finalize=yes
+	  for lib in $notinst_deplibs; do
+	    # Check to see that each library is installed.
+	    libdir=
+	    if test -f "$lib"; then
+	      # If there is no directory component, then add one.
+	      case $lib in
+	      */* | *\\*) . $lib ;;
+	      *) . ./$lib ;;
+	      esac
+	    fi
+	    libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test
+	    if test -n "$libdir" && test ! -f "$libfile"; then
+	      $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2
+	      finalize=no
+	    fi
+	  done
+
+	  relink_command=
+	  # If there is no directory component, then add one.
+	  case $file in
+	  */* | *\\*) . $wrapper ;;
+	  *) . ./$wrapper ;;
+	  esac
+
+	  outputname=
+	  if test "$fast_install" = no && test -n "$relink_command"; then
+	    if test "$finalize" = yes && test -z "$run"; then
+	      tmpdir="/tmp"
+	      test -n "$TMPDIR" && tmpdir="$TMPDIR"
+	      tmpdir="$tmpdir/libtool-$$"
+	      if $mkdir -p "$tmpdir" && chmod 700 "$tmpdir"; then :
+	      else
+		$echo "$modename: error: cannot create temporary directory \`$tmpdir'" 1>&2
+		continue
+	      fi
+	      file=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+	      outputname="$tmpdir/$file"
+	      # Replace the output file specification.
+	      relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'`
+
+	      $show "$relink_command"
+	      if $run eval "$relink_command"; then :
+	      else
+		$echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
+		${rm}r "$tmpdir"
+		continue
+	      fi
+	      file="$outputname"
+	    else
+	      $echo "$modename: warning: cannot relink \`$file'" 1>&2
+	    fi
+	  else
+	    # Install the binary that we compiled earlier.
+	    file=`$echo "X$file" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"`
+	  fi
+	fi
+
+	# remove .exe since cygwin /usr/bin/install will append another
+	# one anyways
+	case $install_prog,$host in
+	/usr/bin/install*,*cygwin*)
+	  case $file:$destfile in
+	  *.exe:*.exe)
+	    # this is ok
+	    ;;
+	  *.exe:*)
+	    destfile=$destfile.exe
+	    ;;
+	  *:*.exe)
+	    destfile=`echo $destfile | ${SED} -e 's,.exe$,,'`
+	    ;;
+	  esac
+	  ;;
+	esac
+	$show "$install_prog$stripme $file $destfile"
+	$run eval "$install_prog\$stripme \$file \$destfile" || exit $?
+	test -n "$outputname" && ${rm}r "$tmpdir"
+	;;
+      esac
+    done
+
+    for file in $staticlibs; do
+      name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+
+      # Set up the ranlib parameters.
+      oldlib="$destdir/$name"
+
+      $show "$install_prog $file $oldlib"
+      $run eval "$install_prog \$file \$oldlib" || exit $?
+
+      if test -n "$stripme" && test -n "$striplib"; then
+	$show "$old_striplib $oldlib"
+	$run eval "$old_striplib $oldlib" || exit $?
+      fi
+
+      # Do each command in the postinstall commands.
+      eval cmds=\"$old_postinstall_cmds\"
+      save_ifs="$IFS"; IFS='~'
+      for cmd in $cmds; do
+	IFS="$save_ifs"
+	$show "$cmd"
+	$run eval "$cmd" || exit $?
+      done
+      IFS="$save_ifs"
+    done
+
+    if test -n "$future_libdirs"; then
+      $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2
+    fi
+
+    if test -n "$current_libdirs"; then
+      # Maybe just do a dry run.
+      test -n "$run" && current_libdirs=" -n$current_libdirs"
+      exec_cmd='$SHELL $0 --finish$current_libdirs'
+    else
+      exit 0
+    fi
+    ;;
+
+  # libtool finish mode
+  finish)
+    modename="$modename: finish"
+    libdirs="$nonopt"
+    admincmds=
+
+    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+      for dir
+      do
+	libdirs="$libdirs $dir"
+      done
+
+      for libdir in $libdirs; do
+	if test -n "$finish_cmds"; then
+	  # Do each command in the finish commands.
+	  eval cmds=\"$finish_cmds\"
+	  save_ifs="$IFS"; IFS='~'
+	  for cmd in $cmds; do
+	    IFS="$save_ifs"
+	    $show "$cmd"
+	    $run eval "$cmd" || admincmds="$admincmds
+       $cmd"
+	  done
+	  IFS="$save_ifs"
+	fi
+	if test -n "$finish_eval"; then
+	  # Do the single finish_eval.
+	  eval cmds=\"$finish_eval\"
+	  $run eval "$cmds" || admincmds="$admincmds
+       $cmds"
+	fi
+      done
+    fi
+
+    # Exit here if they wanted silent mode.
+    test "$show" = ":" && exit 0
+
+    echo "----------------------------------------------------------------------"
+    echo "Libraries have been installed in:"
+    for libdir in $libdirs; do
+      echo "   $libdir"
+    done
+    echo
+    echo "If you ever happen to want to link against installed libraries"
+    echo "in a given directory, LIBDIR, you must either use libtool, and"
+    echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
+    echo "flag during linking and do at least one of the following:"
+    if test -n "$shlibpath_var"; then
+      echo "   - add LIBDIR to the \`$shlibpath_var' environment variable"
+      echo "     during execution"
+    fi
+    if test -n "$runpath_var"; then
+      echo "   - add LIBDIR to the \`$runpath_var' environment variable"
+      echo "     during linking"
+    fi
+    if test -n "$hardcode_libdir_flag_spec"; then
+      libdir=LIBDIR
+      eval flag=\"$hardcode_libdir_flag_spec\"
+
+      echo "   - use the \`$flag' linker flag"
+    fi
+    if test -n "$admincmds"; then
+      echo "   - have your system administrator run these commands:$admincmds"
+    fi
+    if test -f /etc/ld.so.conf; then
+      echo "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
+    fi
+    echo
+    echo "See any operating system documentation about shared libraries for"
+    echo "more information, such as the ld(1) and ld.so(8) manual pages."
+    echo "----------------------------------------------------------------------"
+    exit 0
+    ;;
+
+  # libtool execute mode
+  execute)
+    modename="$modename: execute"
+
+    # The first argument is the command name.
+    cmd="$nonopt"
+    if test -z "$cmd"; then
+      $echo "$modename: you must specify a COMMAND" 1>&2
+      $echo "$help"
+      exit 1
+    fi
+
+    # Handle -dlopen flags immediately.
+    for file in $execute_dlfiles; do
+      if test ! -f "$file"; then
+	$echo "$modename: \`$file' is not a file" 1>&2
+	$echo "$help" 1>&2
+	exit 1
+      fi
+
+      dir=
+      case $file in
+      *.la)
+	# Check to see that this really is a libtool archive.
+	if (${SED} -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+	else
+	  $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+	  $echo "$help" 1>&2
+	  exit 1
+	fi
+
+	# Read the libtool library.
+	dlname=
+	library_names=
+
+	# If there is no directory component, then add one.
+	case $file in
+	*/* | *\\*) . $file ;;
+	*) . ./$file ;;
+	esac
+
+	# Skip this library if it cannot be dlopened.
+	if test -z "$dlname"; then
+	  # Warn if it was a shared library.
+	  test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'"
+	  continue
+	fi
+
+	dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+	test "X$dir" = "X$file" && dir=.
+
+	if test -f "$dir/$objdir/$dlname"; then
+	  dir="$dir/$objdir"
+	else
+	  $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2
+	  exit 1
+	fi
+	;;
+
+      *.lo)
+	# Just add the directory containing the .lo file.
+	dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+	test "X$dir" = "X$file" && dir=.
+	;;
+
+      *)
+	$echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2
+	continue
+	;;
+      esac
+
+      # Get the absolute pathname.
+      absdir=`cd "$dir" && pwd`
+      test -n "$absdir" && dir="$absdir"
+
+      # Now add the directory to shlibpath_var.
+      if eval "test -z \"\$$shlibpath_var\""; then
+	eval "$shlibpath_var=\"\$dir\""
+      else
+	eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
+      fi
+    done
+
+    # This variable tells wrapper scripts just to set shlibpath_var
+    # rather than running their programs.
+    libtool_execute_magic="$magic"
+
+    # Check if any of the arguments is a wrapper script.
+    args=
+    for file
+    do
+      case $file in
+      -*) ;;
+      *)
+	# Do a test to see if this is really a libtool program.
+	if (${SED} -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+	  # If there is no directory component, then add one.
+	  case $file in
+	  */* | *\\*) . $file ;;
+	  *) . ./$file ;;
+	  esac
+
+	  # Transform arg to wrapped name.
+	  file="$progdir/$program"
+	fi
+	;;
+      esac
+      # Quote arguments (to preserve shell metacharacters).
+      file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"`
+      args="$args \"$file\""
+    done
+
+    if test -z "$run"; then
+      if test -n "$shlibpath_var"; then
+	# Export the shlibpath_var.
+	eval "export $shlibpath_var"
+      fi
+
+      # Restore saved enviroment variables
+      if test "${save_LC_ALL+set}" = set; then
+	LC_ALL="$save_LC_ALL"; export LC_ALL
+      fi
+      if test "${save_LANG+set}" = set; then
+	LANG="$save_LANG"; export LANG
+      fi
+
+      # Now prepare to actually exec the command.
+      exec_cmd="\$cmd$args"
+    else
+      # Display what would be done.
+      if test -n "$shlibpath_var"; then
+	eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\""
+	$echo "export $shlibpath_var"
+      fi
+      $echo "$cmd$args"
+      exit 0
+    fi
+    ;;
+
+  # libtool clean and uninstall mode
+  clean | uninstall)
+    modename="$modename: $mode"
+    rm="$nonopt"
+    files=
+    rmforce=
+    exit_status=0
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    for arg
+    do
+      case $arg in
+      -f) rm="$rm $arg"; rmforce=yes ;;
+      -*) rm="$rm $arg" ;;
+      *) files="$files $arg" ;;
+      esac
+    done
+
+    if test -z "$rm"; then
+      $echo "$modename: you must specify an RM program" 1>&2
+      $echo "$help" 1>&2
+      exit 1
+    fi
+
+    rmdirs=
+
+    for file in $files; do
+      dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+      if test "X$dir" = "X$file"; then
+	dir=.
+	objdir="$objdir"
+      else
+	objdir="$dir/$objdir"
+      fi
+      name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+      test $mode = uninstall && objdir="$dir"
+
+      # Remember objdir for removal later, being careful to avoid duplicates
+      if test $mode = clean; then
+	case " $rmdirs " in
+	  *" $objdir "*) ;;
+	  *) rmdirs="$rmdirs $objdir" ;;
+	esac
+      fi
+
+      # Don't error if the file doesn't exist and rm -f was used.
+      if (test -L "$file") >/dev/null 2>&1 \
+	|| (test -h "$file") >/dev/null 2>&1 \
+	|| test -f "$file"; then
+	:
+      elif test -d "$file"; then
+	exit_status=1
+	continue
+      elif test "$rmforce" = yes; then
+	continue
+      fi
+
+      rmfiles="$file"
+
+      case $name in
+      *.la)
+	# Possibly a libtool archive, so verify it.
+	if (${SED} -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+	  . $dir/$name
+
+	  # Delete the libtool libraries and symlinks.
+	  for n in $library_names; do
+	    rmfiles="$rmfiles $objdir/$n"
+	  done
+	  test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library"
+	  test $mode = clean && rmfiles="$rmfiles $objdir/$name $objdir/${name}i"
+
+	  if test $mode = uninstall; then
+	    if test -n "$library_names"; then
+	      # Do each command in the postuninstall commands.
+	      eval cmds=\"$postuninstall_cmds\"
+	      save_ifs="$IFS"; IFS='~'
+	      for cmd in $cmds; do
+		IFS="$save_ifs"
+		$show "$cmd"
+		$run eval "$cmd"
+		if test $? != 0 && test "$rmforce" != yes; then
+		  exit_status=1
+		fi
+	      done
+	      IFS="$save_ifs"
+	    fi
+
+	    if test -n "$old_library"; then
+	      # Do each command in the old_postuninstall commands.
+	      eval cmds=\"$old_postuninstall_cmds\"
+	      save_ifs="$IFS"; IFS='~'
+	      for cmd in $cmds; do
+		IFS="$save_ifs"
+		$show "$cmd"
+		$run eval "$cmd"
+		if test $? != 0 && test "$rmforce" != yes; then
+		  exit_status=1
+		fi
+	      done
+	      IFS="$save_ifs"
+	    fi
+	    # FIXME: should reinstall the best remaining shared library.
+	  fi
+	fi
+	;;
+
+      *.lo)
+	if test "$build_old_libs" = yes; then
+	  oldobj=`$echo "X$name" | $Xsed -e "$lo2o"`
+	  rmfiles="$rmfiles $dir/$oldobj"
+	fi
+	;;
+
+      *)
+	# Do a test to see if this is a libtool program.
+	if test $mode = clean &&
+	   (${SED} -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+	  relink_command=
+	  . $dir/$file
+
+	  rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}"
+	  if test "$fast_install" = yes && test -n "$relink_command"; then
+	    rmfiles="$rmfiles $objdir/lt-$name"
+	  fi
+	fi
+	;;
+      esac
+      $show "$rm $rmfiles"
+      $run $rm $rmfiles || exit_status=1
+    done
+
+    # Try to remove the ${objdir}s in the directories where we deleted files
+    for dir in $rmdirs; do
+      if test -d "$dir"; then
+	$show "rmdir $dir"
+	$run rmdir $dir >/dev/null 2>&1
+      fi
+    done
+
+    exit $exit_status
+    ;;
+
+  "")
+    $echo "$modename: you must specify a MODE" 1>&2
+    $echo "$generic_help" 1>&2
+    exit 1
+    ;;
+  esac
+
+  if test -z "$exec_cmd"; then
+    $echo "$modename: invalid operation mode \`$mode'" 1>&2
+    $echo "$generic_help" 1>&2
+    exit 1
+  fi
+fi # test -z "$show_help"
+
+if test -n "$exec_cmd"; then
+  eval exec $exec_cmd
+  exit 1
+fi
+
+# We need to display help for each of the modes.
+case $mode in
+"") $echo \
+"Usage: $modename [OPTION]... [MODE-ARG]...
+
+Provide generalized library-building support services.
+
+    --config          show all configuration variables
+    --debug           enable verbose shell tracing
+-n, --dry-run         display commands without modifying any files
+    --features        display basic configuration information and exit
+    --finish          same as \`--mode=finish'
+    --help            display this help message and exit
+    --mode=MODE       use operation mode MODE [default=inferred from MODE-ARGS]
+    --quiet           same as \`--silent'
+    --silent          don't print informational messages
+    --version         print version information
+
+MODE must be one of the following:
+
+      clean           remove files from the build directory
+      compile         compile a source file into a libtool object
+      execute         automatically set library path, then run a program
+      finish          complete the installation of libtool libraries
+      install         install libraries or executables
+      link            create a library or an executable
+      uninstall       remove libraries from an installed directory
+
+MODE-ARGS vary depending on the MODE.  Try \`$modename --help --mode=MODE' for
+a more detailed description of MODE."
+  exit 0
+  ;;
+
+clean)
+  $echo \
+"Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
+
+Remove files from the build directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, object or program, all the files associated
+with it are deleted. Otherwise, only FILE itself is deleted using RM."
+  ;;
+
+compile)
+  $echo \
+"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
+
+Compile a source file into a libtool library object.
+
+This mode accepts the following additional options:
+
+  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
+  -prefer-pic       try to building PIC objects only
+  -prefer-non-pic   try to building non-PIC objects only
+  -static           always build a \`.o' file suitable for static linking
+
+COMPILE-COMMAND is a command to be used in creating a \`standard' object file
+from the given SOURCEFILE.
+
+The output file name is determined by removing the directory component from
+SOURCEFILE, then substituting the C source code suffix \`.c' with the
+library object suffix, \`.lo'."
+  ;;
+
+execute)
+  $echo \
+"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]...
+
+Automatically set library path, then run a program.
+
+This mode accepts the following additional options:
+
+  -dlopen FILE      add the directory containing FILE to the library path
+
+This mode sets the library path environment variable according to \`-dlopen'
+flags.
+
+If any of the ARGS are libtool executable wrappers, then they are translated
+into their corresponding uninstalled binary, and any of their required library
+directories are added to the library path.
+
+Then, COMMAND is executed, with ARGS as arguments."
+  ;;
+
+finish)
+  $echo \
+"Usage: $modename [OPTION]... --mode=finish [LIBDIR]...
+
+Complete the installation of libtool libraries.
+
+Each LIBDIR is a directory that contains libtool libraries.
+
+The commands that this mode executes may require superuser privileges.  Use
+the \`--dry-run' option if you just want to see what would be executed."
+  ;;
+
+install)
+  $echo \
+"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND...
+
+Install executables or libraries.
+
+INSTALL-COMMAND is the installation command.  The first component should be
+either the \`install' or \`cp' program.
+
+The rest of the components are interpreted as arguments to that command (only
+BSD-compatible install options are recognized)."
+  ;;
+
+link)
+  $echo \
+"Usage: $modename [OPTION]... --mode=link LINK-COMMAND...
+
+Link object files or libraries together to form another library, or to
+create an executable program.
+
+LINK-COMMAND is a command using the C compiler that you would use to create
+a program from several object files.
+
+The following components of LINK-COMMAND are treated specially:
+
+  -all-static       do not do any dynamic linking at all
+  -avoid-version    do not add a version suffix if possible
+  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
+  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
+  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
+  -export-symbols SYMFILE
+		    try to export only the symbols listed in SYMFILE
+  -export-symbols-regex REGEX
+		    try to export only the symbols matching REGEX
+  -LLIBDIR          search LIBDIR for required installed libraries
+  -lNAME            OUTPUT-FILE requires the installed library libNAME
+  -module           build a library that can dlopened
+  -no-fast-install  disable the fast-install mode
+  -no-install       link a not-installable executable
+  -no-undefined     declare that a library does not refer to external symbols
+  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
+  -release RELEASE  specify package release information
+  -rpath LIBDIR     the created library will eventually be installed in LIBDIR
+  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries
+  -static           do not do any dynamic linking of libtool libraries
+  -version-info CURRENT[:REVISION[:AGE]]
+		    specify library version info [each variable defaults to 0]
+
+All other options (arguments beginning with \`-') are ignored.
+
+Every other argument is treated as a filename.  Files ending in \`.la' are
+treated as uninstalled libtool libraries, other files are standard or library
+object files.
+
+If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
+only library objects (\`.lo' files) may be specified, and \`-rpath' is
+required, except when creating a convenience library.
+
+If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
+using \`ar' and \`ranlib', or on Windows using \`lib'.
+
+If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
+is created, otherwise an executable program is created."
+  ;;
+
+uninstall)
+  $echo \
+"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
+
+Remove libraries from an installation directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, all the files associated with it are deleted.
+Otherwise, only FILE itself is deleted using RM."
+  ;;
+
+*)
+  $echo "$modename: invalid operation mode \`$mode'" 1>&2
+  $echo "$help" 1>&2
+  exit 1
+  ;;
+esac
+
+echo
+$echo "Try \`$modename --help' for more information about other modes."
+
+exit 0
+
+# Local Variables:
+# mode:shell-script
+# sh-indentation:2
+# End:
diff --git a/frysk-imports/libunwind/configure.ac b/frysk-imports/libunwind/configure.ac
index 26e256d..7fa2e4b 100644
--- a/frysk-imports/libunwind/configure.ac
+++ b/frysk-imports/libunwind/configure.ac
@@ -1,10 +1,10 @@
-define(pkg_major, 0)
-define(pkg_minor, 99)
-define(pkg_extra, -alpha-frysk)
-define(pkg_maintainer, frysk@sourceware.org)
+define(pkg_major, 1)
+define(pkg_minor, 1)
+define(pkg_extra, -frysk)
+define(pkg_maintainer, frysk@nongnu.org)
 define(mkvers, $1.$2$3)
 dnl Process this file with autoconf to produce a configure script.
-AC_INIT(libunwind, mkvers(pkg_major, pkg_minor, pkg_extra), pkg_maintainer)
+AC_INIT([libunwind],[mkvers(pkg_major, pkg_minor, pkg_extra)],[pkg_maintainer])
 AC_CONFIG_SRCDIR(src/mi/backtrace.c)
 AC_CONFIG_AUX_DIR(config)
 
@@ -31,87 +31,144 @@ if test x$frysk_local = xyes; then
 	target_alias=${target_cpu}-unknown-linux-gnu
 fi
 
-AC_CANONICAL_SYSTEM
+AC_CANONICAL_TARGET
 AM_INIT_AUTOMAKE([1.6 subdir-objects])
-AM_CONFIG_HEADER(include/config.h)
+AC_CONFIG_HEADERS([include/config.h])
 
 dnl Checks for programs.
 AC_PROG_CC
 AC_PROG_CXX
 AC_PROG_INSTALL
 AC_PROG_MAKE_SET
-AM_PROG_LIBTOOL
+LT_INIT
 AM_PROG_AS
 AM_PROG_CC_C_O
 
 dnl Checks for libraries.
 AC_CHECK_LIB(uca, __uc_get_grs)
+OLD_LIBS=${LIBS}
+AC_SEARCH_LIBS(dlopen, dl)
+LIBS=${OLD_LIBS}
+case "$ac_cv_search_dlopen" in
+  -l*) DLLIB=$ac_cv_search_dlopen;;
+  *) DLLIB="";;
+esac
+
 CHECK_ATOMIC_OPS
 
 dnl Checks for header files.
 AC_HEADER_STDC
-AC_CHECK_HEADERS(asm/ptrace_offsets.h endian.h execinfo.h ia64intrin.h \
-		 sys/uc_access.h unistd.h signal.h)
+AC_CHECK_HEADERS(asm/ptrace_offsets.h endian.h sys/endian.h execinfo.h \
+		ia64intrin.h sys/uc_access.h unistd.h signal.h sys/types.h \
+		sys/procfs.h sys/ptrace.h byteswap.h elf.h sys/elf.h link.h sys/link.h)
 
 dnl Checks for typedefs, structures, and compiler characteristics.
 AC_C_CONST
 AC_C_INLINE
-AC_TYPE_SIGNAL
 AC_TYPE_SIZE_T
+AC_CHECK_SIZEOF(off_t)
 
 CPPFLAGS="${CPPFLAGS} -D_GNU_SOURCE"
-if test x$enable_debug = xyes; then
-  CPPFLAGS="${CPPFLAGS} -DDEBUG"
-else
-  CPPFLAGS="${CPPFLAGS} -DNDEBUG"
-fi
 
 AC_CHECK_MEMBERS([struct dl_phdr_info.dlpi_subs],,,[#include <link.h>])
-AC_CHECK_TYPES([sighandler_t], [], [],
+AC_CHECK_TYPES([struct elf_prstatus, struct prstatus], [], [],
 [$ac_includes_default
-#if HAVE_SIGNAL_H
-# include <signal.h>
+#if HAVE_SYS_PROCFS_H
+# include <sys/procfs.h>
 #endif
 ])
 
+AC_CHECK_DECLS([PTRACE_POKEUSER, PTRACE_POKEDATA,
+PTRACE_TRACEME, PTRACE_CONT, PTRACE_SINGLESTEP,
+PTRACE_SYSCALL, PT_IO, PT_GETREGS,
+PT_GETFPREGS, PT_CONTINUE, PT_TRACE_ME,
+PT_STEP, PT_SYSCALL], [], [],
+[$ac_includes_default
+#if HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#include <sys/ptrace.h>
+])
+
 dnl Checks for library functions.
-AC_FUNC_MEMCMP
-AC_TYPE_SIGNAL
 AC_CHECK_FUNCS(dl_iterate_phdr dl_phdr_removals_counter dlmodinfo getunwind \
-		ttrace)
-is_gcc_m64() {
- if test `echo $CFLAGS | grep "\-m64" -c` -eq 1 ; then echo ppc64;
- else
-  if test `echo $CC | grep "\-m64" -c` -eq 1 ; then echo ppc64; else echo ppc32; fi;
- fi;
-}
+		ttrace mincore)
 
-is_gcc_altivec() {
- if test `echo $CFLAGS | grep "\-maltivec" -c` -eq 1 ; then echo has_altivec;
- else
-  if test `echo $CC | grep "\-maltivec" -c` -eq 1 ; then echo has_altivec; else echo no_altivec; fi;
- fi;
-}
+AC_MSG_CHECKING([if building with AltiVec])
+AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+#ifndef __ALTIVEC__
+# error choke
+#endif
+]])], [use_altivec=yes],[use_altivec=no])
+AM_CONDITIONAL(USE_ALTIVEC, [test x$use_altivec = xyes])
+AC_MSG_RESULT([$use_altivec])
 
-use_altivec=`is_gcc_altivec`
-AM_CONDITIONAL(USE_ALTIVEC, test x$use_altivec = xhas_altivec)
-
-get_arch() {
- case "$1" in
-  arm*) echo arm;;
-  i?86) echo x86;;
-  hppa*) echo hppa;;
-  mips*) echo mips;;
-  powerpc64) echo "ppc64";;
-  *) echo $1;;
- esac
-}
+AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+#ifndef __powerpc64__
+# error choke
+#endif
+]])], [ppc_bits=64], [ppc_bits=32])
+
+AC_DEFUN([SET_ARCH],[
+    AS_CASE([$1],
+        [aarch64*],[$2=aarch64],
+        [arm*],[$2=arm],
+        [i?86],[$2=x86],
+        [hppa*],[$2=hppa],
+        [mips*],[$2=mips],
+        [powerpc*],[$2=ppc$ppc_bits],
+        [sh*],[$2=sh],
+        [amd64],[$2=x86_64],
+        [tile*],[$2=tilegx],
+        [$2=$1])
+]) dnl SET_ARCH
+
+SET_ARCH([$build_cpu],[build_arch])
+SET_ARCH([$host_cpu],[host_arch])
+SET_ARCH([$target_cpu],[target_arch])
 
-build_arch=`get_arch $build_cpu`
-host_arch=`get_arch $host_cpu`
-target_arch=`get_arch $target_cpu`
+AC_ARG_ENABLE(coredump,
+	AS_HELP_STRING([--enable-coredump],[building libunwind-coredump library]),,
+        [AS_CASE([$host_arch], [aarch64*|arm*|mips*|sh*|x86*|tile*], [enable_coredump=yes], [enable_coredump=no])]
+)
 
-AM_CONDITIONAL(REMOTE_ONLY, test x$frysk_local = xyes)
+AC_MSG_CHECKING([if we should build libunwind-coredump])
+AC_MSG_RESULT([$enable_coredump])
+
+AC_ARG_ENABLE(ptrace,
+	AS_HELP_STRING([--enable-ptrace],[building libunwind-ptrace library]),,
+        [AC_CHECK_HEADER([sys/ptrace.h], [enable_ptrace=yes], [enable_ptrace=no])]
+)
+
+AC_MSG_CHECKING([if we should build libunwind-ptrace])
+AC_MSG_RESULT([$enable_ptrace])
+
+AC_ARG_ENABLE(setjmp,
+	AS_HELP_STRING([--enable-setjmp],[building libunwind-setjmp library]),,
+        [AS_IF([test x$target_arch == x$host_arch], [enable_setjmp=yes], [enable_setjmp=no])]
+)
+
+AC_ARG_ENABLE(documentation,
+	AS_HELP_STRING([--disable-documentation],[Disable generating the man pages]),,
+	[enable_documentation=yes])
+
+AC_MSG_CHECKING([if we should build libunwind-setjmp])
+AC_MSG_RESULT([$enable_setjmp])
+
+AC_MSG_CHECKING([for build architecture])
+AC_MSG_RESULT([$build_arch])
+AC_MSG_CHECKING([for host architecture])
+AC_MSG_RESULT([$host_arch])
+AC_MSG_CHECKING([for target architecture])
+AC_MSG_RESULT([$target_arch])
+AC_MSG_CHECKING([for target operating system])
+AC_MSG_RESULT([$target_os])
+
+AM_CONDITIONAL(BUILD_COREDUMP, test x$enable_coredump = xyes)
+AM_CONDITIONAL(BUILD_PTRACE, test x$enable_ptrace = xyes)
+AM_CONDITIONAL(BUILD_SETJMP, test x$enable_setjmp = xyes)
+AM_CONDITIONAL(REMOTE_ONLY, test x$target_arch != x$host_arch)
+AM_CONDITIONAL(ARCH_AARCH64, test x$target_arch = xaarch64)
 AM_CONDITIONAL(ARCH_ARM, test x$target_arch = xarm)
 AM_CONDITIONAL(ARCH_IA64, test x$target_arch = xia64)
 AM_CONDITIONAL(ARCH_HPPA, test x$target_arch = xhppa)
@@ -120,8 +177,32 @@ AM_CONDITIONAL(ARCH_X86, test x$target_arch = xx86)
 AM_CONDITIONAL(ARCH_X86_64, test x$target_arch = xx86_64)
 AM_CONDITIONAL(ARCH_PPC32, test x$target_arch = xppc32)
 AM_CONDITIONAL(ARCH_PPC64, test x$target_arch = xppc64)
+AM_CONDITIONAL(ARCH_SH, test x$target_arch = xsh)
+AM_CONDITIONAL(ARCH_TILEGX, test x$target_arch = xtilegx)
 AM_CONDITIONAL(OS_LINUX, expr x$target_os : xlinux >/dev/null)
 AM_CONDITIONAL(OS_HPUX, expr x$target_os : xhpux >/dev/null)
+AM_CONDITIONAL(OS_FREEBSD, expr x$target_os : xfreebsd >/dev/null)
+AM_CONDITIONAL(OS_QNX, expr x$target_os : xnto-qnx >/dev/null)
+
+AC_MSG_CHECKING([for ELF helper width])
+case "${target_arch}" in
+(arm|hppa|ppc32|x86|sh) use_elf32=yes; AC_MSG_RESULT([32]);;
+(aarch64|ia64|ppc64|x86_64|tilegx)  use_elf64=yes; AC_MSG_RESULT([64]);;
+(mips)                 use_elfxx=yes; AC_MSG_RESULT([xx]);;
+*)                     AC_MSG_ERROR([Unknown ELF target: ${target_arch}])
+esac
+AM_CONDITIONAL(USE_ELF32, [test x$use_elf32 = xyes])
+AM_CONDITIONAL(USE_ELF64, [test x$use_elf64 = xyes])
+AM_CONDITIONAL(USE_ELFXX, [test x$use_elfxx = xyes])
+
+AC_MSG_CHECKING([whether to include DWARF support])
+if test x$target_arch != xia64; then
+  use_dwarf=yes
+else
+  use_dwarf=no
+fi
+AM_CONDITIONAL(USE_DWARF, [test x$use_dwarf = xyes])
+AC_MSG_RESULT([$use_dwarf])
 
 if test x$target_arch = xppc64; then
         libdir='${exec_prefix}/lib64'
@@ -129,35 +210,174 @@ if test x$target_arch = xppc64; then
         AC_SUBST([libdir])
 fi
 
-if test x$frysk_local = xyes; then
+AC_MSG_CHECKING([whether to restrict build to remote support])
+if test x$target_arch != x$host_arch; then
   CPPFLAGS="${CPPFLAGS} -DUNW_REMOTE_ONLY"
+  remote_only=yes
+else
+  remote_only=no
 fi
-AC_CONFIG_LINKS(include/libunwind.h:include/libunwind-$target_arch.h
-		include/tdep:include/tdep-$target_arch)
+AC_MSG_RESULT([$remote_only])
 
+AC_MSG_CHECKING([whether to enable debug support])
 AC_ARG_ENABLE(debug,
-[  --enable-debug          turn on debug support (slows down execution)],
-[enable_debug=yes], [])
+AS_HELP_STRING([--enable-debug],[turn on debug support (slows down execution)]),[],
+              [enable_debug=yes])
+if test x$enable_debug = xyes; then
+  CPPFLAGS="${CPPFLAGS} -DDEBUG"
+else
+  CPPFLAGS="${CPPFLAGS} -DNDEBUG"
+fi
+AC_MSG_RESULT([$enable_debug])
 
-LIBUNWIND___THREAD
+AC_MSG_CHECKING([whether to enable C++ exception support])
+AC_ARG_ENABLE(cxx_exceptions,
+AS_HELP_STRING([--enable-cxx-exceptions],[use libunwind to handle C++ exceptions]),,
+[
+# C++ exception handling doesn't work too well on x86
+case $target_arch in
+  x86*) enable_cxx_exceptions=no;;
+  aarch64*) enable_cxx_exceptions=no;;
+  arm*) enable_cxx_exceptions=no;;
+  mips*) enable_cxx_exceptions=no;;
+  tile*) enable_cxx_exceptions=no;;
+  *) enable_cxx_exceptions=yes;;
+esac
+])
 
-save_LDFLAGS="$LDFLAGS"
-LDFLAGS="$LDFLAGS -static-libcxa"
-AC_TRY_LINK([], [], [have_static_libcxa=yes])
-LDFLAGS="$save_LDFLAGS"
-if test "x$have_static_libcxa" = xyes; then
-  LDFLAGS_STATIC_LIBCXA="-XCClinker -static-libcxa"
+AM_CONDITIONAL([SUPPORT_CXX_EXCEPTIONS], [test x$enable_cxx_exceptions = xyes])
+AC_MSG_RESULT([$enable_cxx_exceptions])
+
+AC_MSG_CHECKING([whether to load .debug_frame sections])
+AC_ARG_ENABLE(debug_frame,
+AS_HELP_STRING([--enable-debug-frame],[Load the ".debug_frame" section if available]),, [
+case "${target_arch}" in
+  (arm) enable_debug_frame=yes;;
+  (*)   enable_debug_frame=no;;
+esac])
+if test x$enable_debug_frame = xyes; then
+  AC_DEFINE([CONFIG_DEBUG_FRAME], [], [Enable Debug Frame])
 fi
+AC_MSG_RESULT([$enable_debug_frame])
 
-AC_TRY_COMPILE([], [#ifndef __INTEL_COMPILER
+AC_MSG_CHECKING([whether to block signals during mutex ops])
+AC_ARG_ENABLE(block_signals,
+AS_HELP_STRING([--enable-block-signals],[Block signals before performing mutex operations]),,
+[enable_block_signals=yes])
+if test x$enable_block_signals = xyes; then
+  AC_DEFINE([CONFIG_BLOCK_SIGNALS], [], [Block signals before mutex operations])
+fi
+AC_MSG_RESULT([$enable_block_signals])
+
+AC_MSG_CHECKING([whether to validate memory addresses before use])
+AC_ARG_ENABLE(conservative_checks,
+AS_HELP_STRING([--enable-conservative-checks],[Validate all memory addresses before use]),,
+[enable_conservative_checks=yes])
+if test x$enable_conservative_checks = xyes; then
+  AC_DEFINE(CONSERVATIVE_CHECKS, 1,
+	[Define to 1 if you want every memory access validated])
+fi
+AC_MSG_RESULT([$enable_conservative_checks])
+
+AC_MSG_CHECKING([whether to enable msabi support])
+AC_ARG_ENABLE(msabi_support,
+AS_HELP_STRING([--enable-msabi-support],[Enables support for Microsoft ABI extensions]))
+if test x$enable_msabi_support = xyes; then
+  AC_DEFINE([CONFIG_MSABI_SUPPORT], [], [Support for Microsoft ABI extensions])
+fi
+AC_MSG_RESULT([$enable_msabi_support])
+
+LIBLZMA=
+AC_MSG_CHECKING([whether to support LZMA-compressed symbol tables])
+AC_ARG_ENABLE(minidebuginfo,
+AS_HELP_STRING([--enable-minidebuginfo], [Enables support for LZMA-compressed symbol tables]),, [enable_minidebuginfo=auto])
+AC_MSG_RESULT([$enable_minidebuginfo])
+if test x$enable_minidebuginfo != xno; then
+   AC_CHECK_LIB([lzma], [lzma_mf_is_supported],
+   [LIBLZMA=-llzma
+    AC_DEFINE([HAVE_LZMA], [1], [Define if you have liblzma])
+    enable_minidebuginfo=yes],
+   [if test x$enable_minidebuginfo = xyes; then
+      AC_MSG_FAILURE([liblzma not found])
+    fi])
+fi
+AC_SUBST([LIBLZMA])
+AM_CONDITIONAL(HAVE_LZMA, test x$enable_minidebuginfo = xyes)
+
+LIBUNWIND___THREAD
+
+AC_MSG_CHECKING([for Intel compiler])
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[#ifndef __INTEL_COMPILER
 #error choke me
-#endif], [intel_compiler=yes])
+#endif]])],[intel_compiler=yes],[intel_compiler=no])
 
 if test x$GCC = xyes -a x$intel_compiler != xyes; then
   CFLAGS="${CFLAGS} -fexceptions -Wall -Wsign-compare"
-  LIBCRTS="-lgcc"
+fi
+AC_MSG_RESULT([$intel_compiler])
+
+AC_MSG_CHECKING([for QCC compiler])
+AS_CASE([$CC], [qcc*|QCC*], [qcc_compiler=yes], [qcc_compiler=no])
+AC_MSG_RESULT([$qcc_compiler])
+
+if test x$intel_compiler = xyes; then
+  AC_MSG_CHECKING([if linker supports -static-libcxa])
+  save_LDFLAGS="$LDFLAGS"
+  LDFLAGS="$LDFLAGS -static-libcxa"
+  AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])],[have_static_libcxa=yes],[have_static_libcxa=no])
+  LDFLAGS="$save_LDFLAGS"
+  if test "x$have_static_libcxa" = xyes; then
+    LDFLAGS_STATIC_LIBCXA="-XCClinker -static-libcxa"
+  fi
+  AC_MSG_RESULT([$have_static_libcxa])
 fi
 
+if test x$qcc_compiler = xyes; then
+    LDFLAGS_NOSTARTFILES="-XCClinker -Wc,-nostartfiles"
+else
+    LDFLAGS_NOSTARTFILES="-XCClinker -nostartfiles"
+fi
+
+if test x$GCC = xyes -a x$intel_compiler != xyes -a x$qcc_compiler != xyes; then
+  LIBCRTS="-lgcc_s"
+fi
+
+AC_MSG_CHECKING([for __builtin___clear_cache])
+AC_LINK_IFELSE(
+  [AC_LANG_PROGRAM([[]], [[__builtin___clear_cache(0, 0)]])],
+  [have__builtin___clear_cache=yes],
+  [have__builtin___clear_cache=no])
+if test x$have__builtin___clear_cache = xyes; then
+  AC_DEFINE([HAVE__BUILTIN___CLEAR_CACHE], [1],
+            [Defined if __builtin___clear_cache() is available])
+fi
+AC_MSG_RESULT([$have__builtin___clear_cache])
+
+AC_MSG_CHECKING([for __builtin_unreachable])
+AC_LINK_IFELSE(
+  [AC_LANG_PROGRAM([[]], [[__builtin_unreachable()]])],
+  [have__builtin_unreachable=yes],
+  [have__builtin_unreachable=no])
+if test x$have__builtin_unreachable = xyes; then
+  AC_DEFINE([HAVE__BUILTIN_UNREACHABLE], [1],
+            [Defined if __builtin_unreachable() is available])
+fi
+AC_MSG_RESULT([$have__builtin_unreachable])
+
+AC_MSG_CHECKING([for __sync atomics])
+AC_LINK_IFELSE(
+  [AC_LANG_PROGRAM([[]], [[
+    __sync_bool_compare_and_swap((int *)0, 0, 1);
+    __sync_fetch_and_add((int *)0, 1);
+    ]])],
+  [have_sync_atomics=yes],
+  [have_sync_atomics=no])
+if test x$have_sync_atomics = xyes; then
+  AC_DEFINE([HAVE_SYNC_ATOMICS], [1],
+            [Defined if __sync atomics are available])
+fi
+AC_MSG_RESULT([$have_sync_atomics])
+
 CCASFLAGS="${CCASFLAGS} ${CPPFLAGS}"
 
 arch="$target_arch"
@@ -169,17 +389,41 @@ PKG_MINOR=pkg_minor
 PKG_EXTRA=pkg_extra
 PKG_MAINTAINER=pkg_maintainer
 
+old_LIBS="$LIBS"
+LIBS=""
+AC_SEARCH_LIBS(backtrace, execinfo)
+LIBS="$old_LIBS"
+
 AC_SUBST(build_arch)
 AC_SUBST(target_os)
 AC_SUBST(arch)
 AC_SUBST(ARCH)
 AC_SUBST(LDFLAGS_STATIC_LIBCXA)
+AC_SUBST(LDFLAGS_NOSTARTFILES)
 AC_SUBST(LIBCRTS)
 AC_SUBST(PKG_MAJOR)
 AC_SUBST(PKG_MINOR)
 AC_SUBST(PKG_EXTRA)
 AC_SUBST(PKG_MAINTAINER)
+AC_SUBST(enable_cxx_exceptions)
+AC_SUBST(enable_debug_frame)
+AC_SUBST(DLLIB)
+
+AC_PATH_PROG([LATEX2MAN],[latex2man])
+if test "x$LATEX2MAN" = "x"; then
+  AC_MSG_WARN([latex2man not found. Install latex2man. Disabling docs.])
+  enable_documentation="no";
+fi
+
+AM_CONDITIONAL([CONFIG_DOCS], [test x$enable_documentation = xyes])
+if test "x$enable_documentation" = "xyes"; then
+  AC_CONFIG_FILES(doc/Makefile doc/common.tex)
+fi
 
 AC_CONFIG_FILES(Makefile src/Makefile tests/Makefile tests/check-namespace.sh
-		doc/Makefile doc/common.tex include/libunwind-common.h)
+		include/libunwind-common.h
+                include/libunwind.h include/tdep/libunwind_i.h)
+AC_CONFIG_FILES(src/unwind/libunwind.pc src/coredump/libunwind-coredump.pc
+                src/ptrace/libunwind-ptrace.pc src/setjmp/libunwind-setjmp.pc
+                src/libunwind-generic.pc)
 AC_OUTPUT
diff --git a/frysk-imports/libunwind/doc/.gitignore b/frysk-imports/libunwind/doc/.gitignore
deleted file mode 100644
index 70845e0..0000000
--- a/frysk-imports/libunwind/doc/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-Makefile.in
diff --git a/frysk-imports/libunwind/doc/Makefile.am b/frysk-imports/libunwind/doc/Makefile.am
index b414568..2534066 100644
--- a/frysk-imports/libunwind/doc/Makefile.am
+++ b/frysk-imports/libunwind/doc/Makefile.am
@@ -1,6 +1,7 @@
 # man pages that go into section 3:
 man3_MANS = libunwind.man libunwind-dynamic.man libunwind-ia64.man	\
 	libunwind-ptrace.man libunwind-setjmp.man			\
+	unw_backtrace.man						\
 	unw_flush_cache.man						\
 	unw_get_accessors.man						\
 	unw_get_proc_info.man						\
@@ -26,6 +27,7 @@ man3_MANS = libunwind.man libunwind-dynamic.man libunwind-ia64.man	\
 EXTRA_DIST = NOTES libunwind.trans					\
 	libunwind.tex libunwind-dynamic.tex libunwind-ia64.tex		\
 	libunwind-ptrace.tex libunwind-setjmp.tex			\
+	unw_backtrace.tex						\
 	unw_flush_cache.tex						\
 	unw_get_accessors.tex						\
 	unw_get_proc_info.tex						\
@@ -67,3 +69,5 @@ pdf:
 		page=`basename $$n .man`;				\
 		$(L2P) $(srcdir)/$$page.tex "$$page(3).pdf";		\
 	done
+
+MAINTAINERCLEANFILES = Makefile.in
diff --git a/frysk-imports/libunwind/doc/libunwind-setjmp.man b/frysk-imports/libunwind/doc/libunwind-setjmp.man
index e8b9de8..1faa38e 100644
--- a/frysk-imports/libunwind/doc/libunwind-setjmp.man
+++ b/frysk-imports/libunwind/doc/libunwind-setjmp.man
@@ -36,7 +36,7 @@ _longjmp(jmp_buf env,
 int val);
 .br
 int
-setjmp(sigjmp_buf env,
+sigsetjmp(sigjmp_buf env,
 int savemask);
 .br
 void
diff --git a/frysk-imports/libunwind/doc/libunwind-setjmp.tex b/frysk-imports/libunwind/doc/libunwind-setjmp.tex
index b31ee9e..17ce073 100644
--- a/frysk-imports/libunwind/doc/libunwind-setjmp.tex
+++ b/frysk-imports/libunwind/doc/libunwind-setjmp.tex
@@ -17,7 +17,7 @@
 \Type{void} \Func{longjmp}(\Type{jmp\_buf}~\Var{env}, \Type{int}~\Var{val});\\
 \Type{int} \Func{\_setjmp}(\Type{jmp\_buf}~\Var{env});\\
 \Type{void} \Func{\_longjmp}(\Type{jmp\_buf}~\Var{env}, \Type{int}~\Var{val});\\
-\Type{int} \Func{setjmp}(\Type{sigjmp\_buf}~\Var{env}, \Type{int}~\Var{savemask});\\
+\Type{int} \Func{sigsetjmp}(\Type{sigjmp\_buf}~\Var{env}, \Type{int}~\Var{savemask});\\
 \Type{void} \Func{siglongjmp}(\Type{sigjmp\_buf}~\Var{env}, \Type{int}~\Var{val});\\
 
 \section{Description}
diff --git a/frysk-imports/libunwind/doc/unw_backtrace.man b/frysk-imports/libunwind/doc/unw_backtrace.man
new file mode 100644
index 0000000..5699bbf
--- /dev/null
+++ b/frysk-imports/libunwind/doc/unw_backtrace.man
@@ -0,0 +1,86 @@
+'\" t
+.\" Manual page created with latex2man on Fri Aug 31 13:39:04 EEST 2012
+.\" NOTE: This file is generated, DO NOT EDIT.
+.de Vb
+.ft CW
+.nf
+..
+.de Ve
+.ft R
+
+.fi
+..
+.TH "UNW\\_BACKTRACE" "3" "31 August 2012" "Programming Library " "Programming Library "
+.SH NAME
+unw_backtrace
+\-\- return backtrace for the calling program 
+.PP
+.SH SYNOPSIS
+
+.PP
+#include <libunwind.h>
+.br
+.PP
+int
+unw_backtrace(void **buffer,
+int size);
+.br
+.PP
+#include <execinfo.h>
+.br
+.PP
+int
+backtrace(void **buffer,
+int size);
+.br
+.PP
+.SH DESCRIPTION
+
+.PP
+unw_backtrace()
+is a convenient routine for obtaining the backtrace for 
+the calling program. The routine fills up to size
+addresses in the array 
+pointed by buffer\&.
+The routine is only available for local unwinding. 
+.PP
+Note that many (but not all) systems provide practically identical function 
+called backtrace().
+The prototype for this function is usually obtained 
+by including the <execinfo.h>
+header file \-\- a prototype for 
+backtrace()
+is not provided by libunwind\&.
+libunwind
+weakly 
+aliases backtrace()
+to unw_backtrace(),
+so when a program 
+calling backtrace()
+is linked against libunwind,
+it may end up 
+calling unw_backtrace().
+.PP
+.SH RETURN VALUE
+
+.PP
+The routine returns the number of addresses stored in the array pointed by 
+buffer\&.
+The return value may be zero to indicate that no addresses were 
+stored. 
+.PP
+.SH SEE ALSO
+
+.PP
+libunwind(3),
+unw_step(3)
+.PP
+.SH AUTHOR
+
+.PP
+David Mosberger\-Tang
+.br
+Email: \fBdmosberger@gmail.com\fP
+.br
+WWW: \fBhttp://www.nongnu.org/libunwind/\fP\&.
+.\" NOTE: This file is generated, DO NOT EDIT.
diff --git a/frysk-imports/libunwind/doc/unw_backtrace.tex b/frysk-imports/libunwind/doc/unw_backtrace.tex
new file mode 100644
index 0000000..c383eeb
--- /dev/null
+++ b/frysk-imports/libunwind/doc/unw_backtrace.tex
@@ -0,0 +1,54 @@
+\documentclass{article}
+\usepackage[fancyhdr,pdf]{latex2man}
+
+\input{common.tex}
+
+\begin{document}
+
+\begin{Name}{3}{unw\_backtrace}{David Mosberger-Tang}{Programming Library}{unw\_backtrace}unw\_backtrace -- return backtrace for the calling program
+\end{Name}
+
+\section{Synopsis}
+
+\File{\#include $<$libunwind.h$>$}\\
+
+\Type{int} \Func{unw\_backtrace}(\Type{void~**}\Var{buffer}, \Type{int}~\Var{size});\\
+
+\File{\#include $<$execinfo.h$>$}\\
+
+\Type{int} \Func{backtrace}(\Type{void~**}\Var{buffer}, \Type{int}~\Var{size});\\
+
+\section{Description}
+
+\Func{unw\_backtrace}() is a convenient routine for obtaining the backtrace for
+the calling program. The routine fills up to \Var{size} addresses in the array
+pointed by \Var{buffer}. The routine is only available for local unwinding.
+
+Note that many (but not all) systems provide practically identical function
+called \Func{backtrace}(). The prototype for this function is usually obtained
+by including the \File{$<$execinfo.h$>$} header file -- a prototype for
+\Func{backtrace}() is not provided by \Prog{libunwind}. \Prog{libunwind} weakly
+aliases \Func{backtrace}() to \Func{unw\_backtrace}(), so when a program
+calling \Func{backtrace}() is linked against \Prog{libunwind}, it may end up
+calling \Func{unw\_backtrace}().
+
+\section{Return Value}
+
+The routine returns the number of addresses stored in the array pointed by
+\Var{buffer}. The return value may be zero to indicate that no addresses were
+stored.
+
+\section{See Also}
+
+\SeeAlso{libunwind(3)},
+\SeeAlso{unw\_step(3)}
+
+\section{Author}
+
+\noindent
+David Mosberger-Tang\\
+Email: \Email{dmosberger@gmail.com}\\
+WWW: \URL{http://www.nongnu.org/libunwind/}.
+\LatexManEnd
+
+\end{document}
diff --git a/frysk-imports/libunwind/doc/unw_get_proc_name.man b/frysk-imports/libunwind/doc/unw_get_proc_name.man
index bbf350f..8b2bd06 100644
--- a/frysk-imports/libunwind/doc/unw_get_proc_name.man
+++ b/frysk-imports/libunwind/doc/unw_get_proc_name.man
@@ -95,7 +95,7 @@ UNW_ENOINFO
 was unable to determine 
 the name of the procedure. 
 .TP
-UNW_ENOMME
+UNW_ENOMEM
  The procedure name is too long to fit 
 in the buffer provided. A truncated version of the name has been 
 returned. 
diff --git a/frysk-imports/libunwind/doc/unw_get_proc_name.tex b/frysk-imports/libunwind/doc/unw_get_proc_name.tex
index 4a9b585..c413990 100644
--- a/frysk-imports/libunwind/doc/unw_get_proc_name.tex
+++ b/frysk-imports/libunwind/doc/unw_get_proc_name.tex
@@ -58,7 +58,7 @@ signal handler.
 \item[\Const{UNW\_EUNSPEC}] An unspecified error occurred.
 \item[\Const{UNW\_ENOINFO}] \Prog{Libunwind} was unable to determine
   the name of the procedure.
-\item[\Const{UNW\_ENOMME}] The procedure name is too long to fit
+\item[\Const{UNW\_ENOMEM}] The procedure name is too long to fit
   in the buffer provided.  A truncated version of the name has been
   returned.
 \end{Description}
diff --git a/frysk-imports/libunwind/include/.gitignore b/frysk-imports/libunwind/include/.gitignore
deleted file mode 100644
index 2a9005d..0000000
--- a/frysk-imports/libunwind/include/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-config.h.in
diff --git a/frysk-imports/libunwind/include/compiler.h b/frysk-imports/libunwind/include/compiler.h
new file mode 100644
index 0000000..abd424d
--- /dev/null
+++ b/frysk-imports/libunwind/include/compiler.h
@@ -0,0 +1,74 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2001-2005 Hewlett-Packard Co
+   Copyright (C) 2007 David Mosberger-Tang
+        Contributed by David Mosberger-Tang <dmosberger@gmail.com>
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+/* Compiler specific useful bits that are used in libunwind, and also in the
+ * tests. */
+
+#ifndef COMPILER_H
+#define COMPILER_H
+
+#ifdef __GNUC__
+# define ALIGNED(x)     __attribute__((aligned(x)))
+# define CONST_ATTR     __attribute__((__const__))
+# define UNUSED         __attribute__((unused))
+# define NOINLINE       __attribute__((noinline))
+# define NORETURN       __attribute__((noreturn))
+# define ALIAS(name)    __attribute__((alias (#name)))
+# if (__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR__ > 2)
+#  define ALWAYS_INLINE inline __attribute__((always_inline))
+#  define HIDDEN        __attribute__((visibility ("hidden")))
+#  define PROTECTED     __attribute__((visibility ("protected")))
+# else
+#  define ALWAYS_INLINE
+#  define HIDDEN
+#  define PROTECTED
+# endif
+# define WEAK           __attribute__((weak))
+# if (__GNUC__ >= 3)
+#  define likely(x)     __builtin_expect ((x), 1)
+#  define unlikely(x)   __builtin_expect ((x), 0)
+# else
+#  define likely(x)     (x)
+#  define unlikely(x)   (x)
+# endif
+#else
+# define ALIGNED(x)
+# define ALWAYS_INLINE
+# define CONST_ATTR
+# define UNUSED
+# define NOINLINE
+# define NORETURN
+# define ALIAS(name)
+# define HIDDEN
+# define PROTECTED
+# define WEAK
+# define likely(x)      (x)
+# define unlikely(x)    (x)
+#endif
+
+#define ARRAY_SIZE(a)   (sizeof (a) / sizeof ((a)[0]))
+
+#endif /* COMPILER_H */
diff --git a/frysk-imports/libunwind/include/dwarf-eh.h b/frysk-imports/libunwind/include/dwarf-eh.h
index 405e394..e81aaef 100644
--- a/frysk-imports/libunwind/include/dwarf-eh.h
+++ b/frysk-imports/libunwind/include/dwarf-eh.h
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (c) 2003 Hewlett-Packard Development Company, L.P.
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -58,9 +58,9 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
     string:
 
      'z': The operand for this character is a uleb128 value that gives the
-	  length of the CIE augmentation body, not counting the length
-	  of the uleb128 operand itself.  If present, this code must
-	  appear as the first character in the augmentation body.
+          length of the CIE augmentation body, not counting the length
+          of the uleb128 operand itself.  If present, this code must
+          appear as the first character in the augmentation body.
 
      'L': Indicates that the FDE's augmentation body contains an LSDA
           pointer.  The operand for this character is a single byte
@@ -73,13 +73,13 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
           operand for this character is a single byte that specifies
           the pointer-encoding (PE) that is used for the
           code-pointers.  Note: the "address_range" member is always
-	  encoded as an absolute value.  Apart from that, the specified
-	  FDE pointer-encoding applies.
+          encoded as an absolute value.  Apart from that, the specified
+          FDE pointer-encoding applies.
 
      'P': Indicates the presence of a personality routine (handler).
           The first operand for this character specifies the
-	  pointer-encoding (PE) that is used for the second operand,
-	  which specifies the address of the personality routine.
+          pointer-encoding (PE) that is used for the second operand,
+          which specifies the address of the personality routine.
 
     If the augmentation string contains any other characters, the
     remainder of the augmentation string should be ignored.
@@ -104,7 +104,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 */
 
-#define DW_EH_VERSION		1	/* The version we're implementing */
+#define DW_EH_VERSION           1       /* The version we're implementing */
 
 struct dwarf_eh_frame_hdr
   {
@@ -115,14 +115,14 @@ struct dwarf_eh_frame_hdr
     /* The rest of the header is variable-length and consists of the
        following members:
 
-	encoded_t eh_frame_ptr;
-	encoded_t fde_count;
-	struct
-	  {
-	    encoded_t start_ip;	// first address covered by this FDE
-	    encoded_t fde_addr;	// address of the FDE
-	  }
-	binary_search_table[fde_count];  */
+        encoded_t eh_frame_ptr;
+        encoded_t fde_count;
+        struct
+          {
+            encoded_t start_ip; // first address covered by this FDE
+            encoded_t fde_addr; // address of the FDE
+          }
+        binary_search_table[fde_count];  */
   };
 
 #endif /* dwarf_eh_h */
diff --git a/frysk-imports/libunwind/include/dwarf.h b/frysk-imports/libunwind/include/dwarf.h
index 61e5823..19795ff 100644
--- a/frysk-imports/libunwind/include/dwarf.h
+++ b/frysk-imports/libunwind/include/dwarf.h
@@ -1,6 +1,7 @@
 /* libunwind - a platform-independent unwind library
    Copyright (c) 2003-2005 Hewlett-Packard Development Company, L.P.
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+   Copyright (C) 2007-2008, Red Hat Inc.
 
 This file is part of libunwind.
 
@@ -26,67 +27,83 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #ifndef dwarf_h
 #define dwarf_h
 
+#include <libunwind.h>
+
+struct dwarf_cursor;    /* forward-declaration */
+struct elf_dyn_info;
+
+#include "dwarf-config.h"
+
 #ifdef HAVE_CONFIG_H
-#include <config.h>
+# include "config.h"
 #endif
 
-#ifdef HAVE_ATOMIC_OPS_H
-# include <atomic_ops.h>
+#ifdef HAVE___THREAD
+  /* For now, turn off per-thread caching.  It uses up too much TLS
+     memory per thread even when the thread never uses libunwind at
+     all.  */
+# undef HAVE___THREAD
 #endif
 
-#include <libunwind.h>
-
-struct dwarf_cursor;	/* forward-declaration */
+#ifndef UNW_REMOTE_ONLY
+  #if defined(HAVE_LINK_H)
+    #include <link.h>
+  #elif defined(HAVE_SYS_LINK_H)
+    #include <sys/link.h>
+  #else
+    #error Could not find <link.h>
+  #endif
+#endif
 
-#include "dwarf-config.h"
+#include <pthread.h>
 
 /* DWARF expression opcodes.  */
 
 typedef enum
   {
-    DW_OP_addr			= 0x03,
-    DW_OP_deref			= 0x06,
-    DW_OP_const1u		= 0x08,
-    DW_OP_const1s		= 0x09,
-    DW_OP_const2u		= 0x0a,
-    DW_OP_const2s		= 0x0b,
-    DW_OP_const4u		= 0x0c,
-    DW_OP_const4s		= 0x0d,
-    DW_OP_const8u		= 0x0e,
-    DW_OP_const8s		= 0x0f,
-    DW_OP_constu		= 0x10,
-    DW_OP_consts		= 0x11,
-    DW_OP_dup			= 0x12,
-    DW_OP_drop			= 0x13,
-    DW_OP_over			= 0x14,
-    DW_OP_pick			= 0x15,
-    DW_OP_swap			= 0x16,
-    DW_OP_rot			= 0x17,
-    DW_OP_xderef		= 0x18,
-    DW_OP_abs			= 0x19,
-    DW_OP_and			= 0x1a,
-    DW_OP_div			= 0x1b,
-    DW_OP_minus			= 0x1c,
-    DW_OP_mod			= 0x1d,
-    DW_OP_mul			= 0x1e,
-    DW_OP_neg			= 0x1f,
-    DW_OP_not			= 0x20,
-    DW_OP_or			= 0x21,
-    DW_OP_plus			= 0x22,
-    DW_OP_plus_uconst		= 0x23,
-    DW_OP_shl			= 0x24,
-    DW_OP_shr			= 0x25,
-    DW_OP_shra			= 0x26,
-    DW_OP_xor			= 0x27,
-    DW_OP_skip			= 0x2f,
-    DW_OP_bra			= 0x28,
-    DW_OP_eq			= 0x29,
-    DW_OP_ge			= 0x2a,
-    DW_OP_gt			= 0x2b,
-    DW_OP_le			= 0x2c,
-    DW_OP_lt			= 0x2d,
-    DW_OP_ne			= 0x2e,
-    DW_OP_lit0			= 0x30,
+    DW_OP_addr                  = 0x03,
+    DW_OP_deref                 = 0x06,
+    DW_OP_const1u               = 0x08,
+    DW_OP_const1s               = 0x09,
+    DW_OP_const2u               = 0x0a,
+    DW_OP_const2s               = 0x0b,
+    DW_OP_const4u               = 0x0c,
+    DW_OP_const4s               = 0x0d,
+    DW_OP_const8u               = 0x0e,
+    DW_OP_const8s               = 0x0f,
+    DW_OP_constu                = 0x10,
+    DW_OP_consts                = 0x11,
+    DW_OP_dup                   = 0x12,
+    DW_OP_drop                  = 0x13,
+    DW_OP_over                  = 0x14,
+    DW_OP_pick                  = 0x15,
+    DW_OP_swap                  = 0x16,
+    DW_OP_rot                   = 0x17,
+    DW_OP_xderef                = 0x18,
+    DW_OP_abs                   = 0x19,
+    DW_OP_and                   = 0x1a,
+    DW_OP_div                   = 0x1b,
+    DW_OP_minus                 = 0x1c,
+    DW_OP_mod                   = 0x1d,
+    DW_OP_mul                   = 0x1e,
+    DW_OP_neg                   = 0x1f,
+    DW_OP_not                   = 0x20,
+    DW_OP_or                    = 0x21,
+    DW_OP_plus                  = 0x22,
+    DW_OP_plus_uconst           = 0x23,
+    DW_OP_shl                   = 0x24,
+    DW_OP_shr                   = 0x25,
+    DW_OP_shra                  = 0x26,
+    DW_OP_xor                   = 0x27,
+    DW_OP_skip                  = 0x2f,
+    DW_OP_bra                   = 0x28,
+    DW_OP_eq                    = 0x29,
+    DW_OP_ge                    = 0x2a,
+    DW_OP_gt                    = 0x2b,
+    DW_OP_le                    = 0x2c,
+    DW_OP_lt                    = 0x2d,
+    DW_OP_ne                    = 0x2e,
+    DW_OP_lit0                  = 0x30,
     DW_OP_lit1,  DW_OP_lit2,  DW_OP_lit3,  DW_OP_lit4,  DW_OP_lit5,
     DW_OP_lit6,  DW_OP_lit7,  DW_OP_lit8,  DW_OP_lit9,  DW_OP_lit10,
     DW_OP_lit11, DW_OP_lit12, DW_OP_lit13, DW_OP_lit14, DW_OP_lit15,
@@ -94,7 +111,7 @@ typedef enum
     DW_OP_lit21, DW_OP_lit22, DW_OP_lit23, DW_OP_lit24, DW_OP_lit25,
     DW_OP_lit26, DW_OP_lit27, DW_OP_lit28, DW_OP_lit29, DW_OP_lit30,
     DW_OP_lit31,
-    DW_OP_reg0			= 0x50,
+    DW_OP_reg0                  = 0x50,
     DW_OP_reg1,  DW_OP_reg2,  DW_OP_reg3,  DW_OP_reg4,  DW_OP_reg5,
     DW_OP_reg6,  DW_OP_reg7,  DW_OP_reg8,  DW_OP_reg9,  DW_OP_reg10,
     DW_OP_reg11, DW_OP_reg12, DW_OP_reg13, DW_OP_reg14, DW_OP_reg15,
@@ -102,7 +119,7 @@ typedef enum
     DW_OP_reg21, DW_OP_reg22, DW_OP_reg23, DW_OP_reg24, DW_OP_reg25,
     DW_OP_reg26, DW_OP_reg27, DW_OP_reg28, DW_OP_reg29, DW_OP_reg30,
     DW_OP_reg31,
-    DW_OP_breg0			= 0x70,
+    DW_OP_breg0                 = 0x70,
     DW_OP_breg1,  DW_OP_breg2,  DW_OP_breg3,  DW_OP_breg4,  DW_OP_breg5,
     DW_OP_breg6,  DW_OP_breg7,  DW_OP_breg8,  DW_OP_breg9,  DW_OP_breg10,
     DW_OP_breg11, DW_OP_breg12, DW_OP_breg13, DW_OP_breg14, DW_OP_breg15,
@@ -110,58 +127,59 @@ typedef enum
     DW_OP_breg21, DW_OP_breg22, DW_OP_breg23, DW_OP_breg24, DW_OP_breg25,
     DW_OP_breg26, DW_OP_breg27, DW_OP_breg28, DW_OP_breg29, DW_OP_breg30,
     DW_OP_breg31,
-    DW_OP_regx			= 0x90,
-    DW_OP_fbreg			= 0x91,
-    DW_OP_bregx			= 0x92,
-    DW_OP_piece			= 0x93,
-    DW_OP_deref_size		= 0x94,
-    DW_OP_xderef_size		= 0x95,
-    DW_OP_nop			= 0x96,
-    DW_OP_push_object_address	= 0x97,
-    DW_OP_call2			= 0x98,
-    DW_OP_call4			= 0x99,
-    DW_OP_call_ref		= 0x9a,
-    DW_OP_lo_user		= 0xe0,
-    DW_OP_hi_user		= 0xff
+    DW_OP_regx                  = 0x90,
+    DW_OP_fbreg                 = 0x91,
+    DW_OP_bregx                 = 0x92,
+    DW_OP_piece                 = 0x93,
+    DW_OP_deref_size            = 0x94,
+    DW_OP_xderef_size           = 0x95,
+    DW_OP_nop                   = 0x96,
+    DW_OP_push_object_address   = 0x97,
+    DW_OP_call2                 = 0x98,
+    DW_OP_call4                 = 0x99,
+    DW_OP_call_ref              = 0x9a,
+    DW_OP_lo_user               = 0xe0,
+    DW_OP_hi_user               = 0xff
   }
 dwarf_expr_op_t;
 
-#define DWARF_CIE_VERSION	3	/* GCC emits version 1??? */
+#define DWARF_CIE_VERSION       3       /* GCC emits version 1??? */
 
-#define DWARF_CFA_OPCODE_MASK	0xc0
-#define DWARF_CFA_OPERAND_MASK	0x3f
+#define DWARF_CFA_OPCODE_MASK   0xc0
+#define DWARF_CFA_OPERAND_MASK  0x3f
 
 typedef enum
   {
-    DW_CFA_advance_loc		= 0x40,
-    DW_CFA_offset		= 0x80,
-    DW_CFA_restore		= 0xc0,
-    DW_CFA_nop			= 0x00,
-    DW_CFA_set_loc		= 0x01,
-    DW_CFA_advance_loc1		= 0x02,
-    DW_CFA_advance_loc2		= 0x03,
-    DW_CFA_advance_loc4		= 0x04,
-    DW_CFA_offset_extended	= 0x05,
-    DW_CFA_restore_extended	= 0x06,
-    DW_CFA_undefined		= 0x07,
-    DW_CFA_same_value		= 0x08,
-    DW_CFA_register		= 0x09,
-    DW_CFA_remember_state	= 0x0a,
-    DW_CFA_restore_state	= 0x0b,
-    DW_CFA_def_cfa		= 0x0c,
-    DW_CFA_def_cfa_register	= 0x0d,
-    DW_CFA_def_cfa_offset	= 0x0e,
-    DW_CFA_def_cfa_expression	= 0x0f,
-    DW_CFA_expression		= 0x10,
-    DW_CFA_offset_extended_sf	= 0x11,
-    DW_CFA_def_cfa_sf		= 0x12,
-    DW_CFA_def_cfa_offset_sf	= 0x13,
-    DW_CFA_lo_user		= 0x1c,
-    DW_CFA_MIPS_advance_loc8	= 0x1d,
-    DW_CFA_GNU_window_save	= 0x2d,
-    DW_CFA_GNU_args_size	= 0x2e,
-    DW_CFA_GNU_negative_offset_extended	= 0x2f,
-    DW_CFA_hi_user		= 0x3c
+    DW_CFA_advance_loc          = 0x40,
+    DW_CFA_offset               = 0x80,
+    DW_CFA_restore              = 0xc0,
+    DW_CFA_nop                  = 0x00,
+    DW_CFA_set_loc              = 0x01,
+    DW_CFA_advance_loc1         = 0x02,
+    DW_CFA_advance_loc2         = 0x03,
+    DW_CFA_advance_loc4         = 0x04,
+    DW_CFA_offset_extended      = 0x05,
+    DW_CFA_restore_extended     = 0x06,
+    DW_CFA_undefined            = 0x07,
+    DW_CFA_same_value           = 0x08,
+    DW_CFA_register             = 0x09,
+    DW_CFA_remember_state       = 0x0a,
+    DW_CFA_restore_state        = 0x0b,
+    DW_CFA_def_cfa              = 0x0c,
+    DW_CFA_def_cfa_register     = 0x0d,
+    DW_CFA_def_cfa_offset       = 0x0e,
+    DW_CFA_def_cfa_expression   = 0x0f,
+    DW_CFA_expression           = 0x10,
+    DW_CFA_offset_extended_sf   = 0x11,
+    DW_CFA_def_cfa_sf           = 0x12,
+    DW_CFA_def_cfa_offset_sf    = 0x13,
+    DW_CFA_val_expression       = 0x16,
+    DW_CFA_lo_user              = 0x1c,
+    DW_CFA_MIPS_advance_loc8    = 0x1d,
+    DW_CFA_GNU_window_save      = 0x2d,
+    DW_CFA_GNU_args_size        = 0x2e,
+    DW_CFA_GNU_negative_offset_extended = 0x2f,
+    DW_CFA_hi_user              = 0x3c
   }
 dwarf_cfa_t;
 
@@ -176,52 +194,53 @@ dwarf_cfa_t;
    engineered from GCC.
 
 */
-#define DW_EH_PE_FORMAT_MASK	0x0f	/* format of the encoded value */
-#define DW_EH_PE_APPL_MASK	0x70	/* how the value is to be applied */
+#define DW_EH_PE_FORMAT_MASK    0x0f    /* format of the encoded value */
+#define DW_EH_PE_APPL_MASK      0x70    /* how the value is to be applied */
 /* Flag bit.  If set, the resulting pointer is the address of the word
    that contains the final address.  */
-#define DW_EH_PE_indirect	0x80
+#define DW_EH_PE_indirect       0x80
 
 /* Pointer-encoding formats: */
-#define DW_EH_PE_omit		0xff
-#define DW_EH_PE_ptr		0x00	/* pointer-sized unsigned value */
-#define DW_EH_PE_uleb128	0x01	/* unsigned LE base-128 value */
-#define DW_EH_PE_udata2		0x02	/* unsigned 16-bit value */
-#define DW_EH_PE_udata4		0x03	/* unsigned 32-bit value */
-#define DW_EH_PE_udata8		0x04	/* unsigned 64-bit value */
-#define DW_EH_PE_sleb128	0x09	/* signed LE base-128 value */
-#define DW_EH_PE_sdata2		0x0a	/* signed 16-bit value */
-#define DW_EH_PE_sdata4		0x0b	/* signed 32-bit value */
-#define DW_EH_PE_sdata8		0x0c	/* signed 64-bit value */
+#define DW_EH_PE_omit           0xff
+#define DW_EH_PE_ptr            0x00    /* pointer-sized unsigned value */
+#define DW_EH_PE_uleb128        0x01    /* unsigned LE base-128 value */
+#define DW_EH_PE_udata2         0x02    /* unsigned 16-bit value */
+#define DW_EH_PE_udata4         0x03    /* unsigned 32-bit value */
+#define DW_EH_PE_udata8         0x04    /* unsigned 64-bit value */
+#define DW_EH_PE_sleb128        0x09    /* signed LE base-128 value */
+#define DW_EH_PE_sdata2         0x0a    /* signed 16-bit value */
+#define DW_EH_PE_sdata4         0x0b    /* signed 32-bit value */
+#define DW_EH_PE_sdata8         0x0c    /* signed 64-bit value */
 
 /* Pointer-encoding application: */
-#define DW_EH_PE_absptr		0x00	/* absolute value */
-#define DW_EH_PE_pcrel		0x10	/* rel. to addr. of encoded value */
-#define DW_EH_PE_textrel	0x20	/* text-relative (GCC-specific???) */
-#define DW_EH_PE_datarel	0x30	/* data-relative */
+#define DW_EH_PE_absptr         0x00    /* absolute value */
+#define DW_EH_PE_pcrel          0x10    /* rel. to addr. of encoded value */
+#define DW_EH_PE_textrel        0x20    /* text-relative (GCC-specific???) */
+#define DW_EH_PE_datarel        0x30    /* data-relative */
 /* The following are not documented by LSB v1.3, yet they are used by
    GCC, presumably they aren't documented by LSB since they aren't
    used on Linux:  */
-#define DW_EH_PE_funcrel	0x40	/* start-of-procedure-relative */
-#define DW_EH_PE_aligned	0x50	/* aligned pointer */
+#define DW_EH_PE_funcrel        0x40    /* start-of-procedure-relative */
+#define DW_EH_PE_aligned        0x50    /* aligned pointer */
 
 extern struct mempool dwarf_reg_state_pool;
 extern struct mempool dwarf_cie_info_pool;
 
 typedef enum
   {
-    DWARF_WHERE_UNDEF,		/* register isn't saved at all */
-    DWARF_WHERE_SAME,		/* register has same value as in prev. frame */
-    DWARF_WHERE_CFAREL,		/* register saved at CFA-relative address */
-    DWARF_WHERE_REG,		/* register saved in another register */
-    DWARF_WHERE_EXPR,		/* register saved */
+    DWARF_WHERE_UNDEF,          /* register isn't saved at all */
+    DWARF_WHERE_SAME,           /* register has same value as in prev. frame */
+    DWARF_WHERE_CFAREL,         /* register saved at CFA-relative address */
+    DWARF_WHERE_REG,            /* register saved in another register */
+    DWARF_WHERE_EXPR,           /* register saved */
+    DWARF_WHERE_VAL_EXPR,       /* register has computed value */
   }
 dwarf_where_t;
 
 typedef struct
   {
-    dwarf_where_t where;	/* how is the register saved? */
-    unw_word_t val;		/* where it's saved */
+    dwarf_where_t where;        /* how is the register saved? */
+    unw_word_t val;             /* where it's saved */
   }
 dwarf_save_loc_t;
 
@@ -235,18 +254,20 @@ dwarf_save_loc_t;
    case of DWARF_WHERE_REG, member "val" gives the number of the
    base-register and the "val" member of DWARF_CFA_OFF_COLUMN gives
    the offset value.  */
-#define DWARF_CFA_REG_COLUMN	DWARF_NUM_PRESERVED_REGS
-#define DWARF_CFA_OFF_COLUMN	(DWARF_NUM_PRESERVED_REGS + 1)
+#define DWARF_CFA_REG_COLUMN    DWARF_NUM_PRESERVED_REGS
+#define DWARF_CFA_OFF_COLUMN    (DWARF_NUM_PRESERVED_REGS + 1)
 
 typedef struct dwarf_reg_state
   {
-    struct dwarf_reg_state *next;	/* for rs_stack */
+    struct dwarf_reg_state *next;       /* for rs_stack */
     dwarf_save_loc_t reg[DWARF_NUM_PRESERVED_REGS + 2];
-    unw_word_t ip;		          /* ip this rs is for */
+    unw_word_t ip;                        /* ip this rs is for */
     unw_word_t ret_addr_column;           /* indicates which column in the rule table represents return address */
-    unsigned short lru_chain;	  /* used for least-recently-used chain */
-    unsigned short coll_chain;	/* used for hash collisions */
-    unsigned short hint;	      /* hint for next rs to try (or -1) */
+    unsigned short lru_chain;     /* used for least-recently-used chain */
+    unsigned short coll_chain;  /* used for hash collisions */
+    unsigned short hint;              /* hint for next rs to try (or -1) */
+    unsigned short valid : 1;         /* optional machine-dependent signal info */
+    unsigned short signal_frame : 1;  /* optional machine-dependent signal info */
   }
 dwarf_reg_state_t;
 
@@ -256,14 +277,14 @@ typedef struct dwarf_cie_info
     unw_addr_space_t as;        /* reference to frame address-space */
     void *as_arg;               /* argument to address-space callbacks */
 #endif
-    unw_word_t cie_instr_start;	/* start addr. of CIE "initial_instructions" */
-    unw_word_t cie_instr_end;	/* end addr. of CIE "initial_instructions" */
-    unw_word_t fde_instr_start;	/* start addr. of FDE "instructions" */
-    unw_word_t fde_instr_end;	/* end addr. of FDE "instructions" */
-    unw_word_t code_align;	/* code-alignment factor */
-    unw_word_t data_align;	/* data-alignment factor */
-    unw_word_t ret_addr_column;	/* column of return-address register */
-    unw_word_t handler;		/* address of personality-routine */
+    unw_word_t cie_instr_start; /* start addr. of CIE "initial_instructions" */
+    unw_word_t cie_instr_end;   /* end addr. of CIE "initial_instructions" */
+    unw_word_t fde_instr_start; /* start addr. of FDE "instructions" */
+    unw_word_t fde_instr_end;   /* end addr. of FDE "instructions" */
+    unw_word_t code_align;      /* code-alignment factor */
+    unw_word_t data_align;      /* data-alignment factor */
+    unw_word_t ret_addr_column; /* column of return-address register */
+    unw_word_t handler;         /* address of personality-routine */
     uint16_t abi;
     uint16_t tag;
     uint8_t fde_encoding;
@@ -279,57 +300,54 @@ typedef struct dwarf_state_record
     unsigned char fde_encoding;
     unw_word_t args_size;
 
-    dwarf_reg_state_t rs_initial;	/* reg-state after CIE instructions */
-    dwarf_reg_state_t rs_current;	/* current reg-state */
+    dwarf_reg_state_t rs_initial;       /* reg-state after CIE instructions */
+    dwarf_reg_state_t rs_current;       /* current reg-state */
   }
 dwarf_state_record_t;
 
 typedef struct dwarf_cursor
   {
-    void *as_arg;		/* argument to address-space callbacks */
-    unw_addr_space_t as;	/* reference to per-address-space info */
+    void *as_arg;               /* argument to address-space callbacks */
+    unw_addr_space_t as;        /* reference to per-address-space info */
 
-    unw_word_t cfa;	/* canonical frame address; aka frame-/stack-pointer */
-    unw_word_t ip;		/* instruction pointer */
-    unw_word_t args_size;	/* size of arguments */
-    unw_word_t ret_addr_column;	/* column for return-address */
+    unw_word_t cfa;     /* canonical frame address; aka frame-/stack-pointer */
+    unw_word_t ip;              /* instruction pointer */
+    unw_word_t args_size;       /* size of arguments */
+    unw_word_t ret_addr_column; /* column for return-address */
     unw_word_t eh_args[UNW_TDEP_NUM_EH_REGS];
     unsigned int eh_valid_mask;
 
     dwarf_loc_t loc[DWARF_NUM_PRESERVED_REGS];
 
-    unsigned int decrease_ip :1; /* decrease `ip' back into the `call' instr */
-    unsigned int pi_valid :1;	/* is proc_info valid? */
+    unsigned int stash_frames :1; /* stash frames for fast lookup */
+    unsigned int use_prev_instr :1; /* use previous (= call) or current (= signal) instruction? */
+    unsigned int pi_valid :1;   /* is proc_info valid? */
     unsigned int pi_is_dynamic :1; /* proc_info found via dynamic proc info? */
-    unw_proc_info_t pi;		/* info about current procedure */
+    unw_proc_info_t pi;         /* info about current procedure */
 
     short hint; /* faster lookup of the rs cache */
     short prev_rs;
   }
 dwarf_cursor_t;
 
-#define DWARF_LOG_UNW_CACHE_SIZE	7
-#define DWARF_UNW_CACHE_SIZE	(1 << DWARF_LOG_UNW_CACHE_SIZE)
+#define DWARF_LOG_UNW_CACHE_SIZE        7
+#define DWARF_UNW_CACHE_SIZE    (1 << DWARF_LOG_UNW_CACHE_SIZE)
 
-#define DWARF_LOG_UNW_HASH_SIZE	(DWARF_LOG_UNW_CACHE_SIZE + 1)
-#define DWARF_UNW_HASH_SIZE	(1 << DWARF_LOG_UNW_HASH_SIZE)
+#define DWARF_LOG_UNW_HASH_SIZE (DWARF_LOG_UNW_CACHE_SIZE + 1)
+#define DWARF_UNW_HASH_SIZE     (1 << DWARF_LOG_UNW_HASH_SIZE)
 
 typedef unsigned char unw_hash_index_t;
 
 struct dwarf_rs_cache
   {
-#ifdef HAVE_ATOMIC_OPS_H
-    AO_TS_t busy;		/* is the rs-cache busy? */
-#else
     pthread_mutex_t lock;
-#endif
-    unsigned short lru_head;	/* index of lead-recently used rs */
-    unsigned short lru_tail;	/* index of most-recently used rs */
+    unsigned short lru_head;    /* index of lead-recently used rs */
+    unsigned short lru_tail;    /* index of most-recently used rs */
 
     /* hash table that maps instruction pointer to rs index: */
     unsigned short hash[DWARF_UNW_HASH_SIZE];
 
-    uint32_t generation;	/* generation number */
+    uint32_t generation;        /* generation number */
 
     /* rs cache: */
     dwarf_reg_state_t buckets[DWARF_UNW_CACHE_SIZE];
@@ -352,52 +370,78 @@ struct unw_debug_frame_list
     struct unw_debug_frame_list *next;
   };
 
+struct dwarf_callback_data
+  {
+    /* in: */
+    unw_word_t ip;              /* instruction-pointer we're looking for */
+    unw_proc_info_t *pi;        /* proc-info pointer */
+    int need_unwind_info;
+    /* out: */
+    int single_fde;             /* did we find a single FDE? (vs. a table) */
+    unw_dyn_info_t di;          /* table info (if single_fde is false) */
+    unw_dyn_info_t di_debug;    /* additional table info for .debug_frame */
+  };
+
 /* Convenience macros: */
-#define dwarf_init			UNW_ARCH_OBJ (dwarf_init)
-#define dwarf_find_proc_info		UNW_OBJ (dwarf_find_proc_info)
-#define dwarf_search_unwind_table	UNW_OBJ (dwarf_search_unwind_table)
-#define dwarf_put_unwind_info		UNW_OBJ (dwarf_put_unwind_info)
-#define dwarf_put_unwind_info		UNW_OBJ (dwarf_put_unwind_info)
-#define dwarf_eval_expr			UNW_OBJ (dwarf_eval_expr)
+#define dwarf_init                      UNW_ARCH_OBJ (dwarf_init)
+#define dwarf_callback                  UNW_OBJ (dwarf_callback)
+#define dwarf_find_proc_info            UNW_OBJ (dwarf_find_proc_info)
+#define dwarf_find_debug_frame          UNW_OBJ (dwarf_find_debug_frame)
+#define dwarf_search_unwind_table       UNW_OBJ (dwarf_search_unwind_table)
+#define dwarf_find_unwind_table         UNW_OBJ (dwarf_find_unwind_table)
+#define dwarf_put_unwind_info           UNW_OBJ (dwarf_put_unwind_info)
+#define dwarf_put_unwind_info           UNW_OBJ (dwarf_put_unwind_info)
+#define dwarf_eval_expr                 UNW_OBJ (dwarf_eval_expr)
 #define dwarf_extract_proc_info_from_fde \
-		UNW_OBJ (dwarf_extract_proc_info_from_fde)
-#define dwarf_find_save_locs		UNW_OBJ (dwarf_find_save_locs)
-#define dwarf_create_state_record	UNW_OBJ (dwarf_create_state_record)
-#define dwarf_make_proc_info		UNW_OBJ (dwarf_make_proc_info)
-#define dwarf_read_encoded_pointer	UNW_OBJ (dwarf_read_encoded_pointer)
-#define dwarf_step			UNW_OBJ (dwarf_step)
+                UNW_OBJ (dwarf_extract_proc_info_from_fde)
+#define dwarf_find_save_locs            UNW_OBJ (dwarf_find_save_locs)
+#define dwarf_create_state_record       UNW_OBJ (dwarf_create_state_record)
+#define dwarf_make_proc_info            UNW_OBJ (dwarf_make_proc_info)
+#define dwarf_read_encoded_pointer      UNW_OBJ (dwarf_read_encoded_pointer)
+#define dwarf_step                      UNW_OBJ (dwarf_step)
 
 extern int dwarf_init (void);
+#ifndef UNW_REMOTE_ONLY
+extern int dwarf_callback (struct dl_phdr_info *info, size_t size, void *ptr);
 extern int dwarf_find_proc_info (unw_addr_space_t as, unw_word_t ip,
-				 unw_proc_info_t *pi,
-				 int need_unwind_info, void *arg);
+                                 unw_proc_info_t *pi,
+                                 int need_unwind_info, void *arg);
+#endif /* !UNW_REMOTE_ONLY */
+extern int dwarf_find_debug_frame (int found, unw_dyn_info_t *di_debug,
+                                   unw_word_t ip, unw_word_t segbase,
+                                   const char* obj_name, unw_word_t start,
+                                   unw_word_t end);
 extern int dwarf_search_unwind_table (unw_addr_space_t as,
-				      unw_word_t ip,
-				      unw_dyn_info_t *di,
-				      unw_proc_info_t *pi,
-				      int need_unwind_info, void *arg);
+                                      unw_word_t ip,
+                                      unw_dyn_info_t *di,
+                                      unw_proc_info_t *pi,
+                                      int need_unwind_info, void *arg);
+extern int dwarf_find_unwind_table (struct elf_dyn_info *edi, unw_addr_space_t as,
+                                    char *path, unw_word_t segbase, unw_word_t mapoff,
+                                    unw_word_t ip);
 extern void dwarf_put_unwind_info (unw_addr_space_t as,
-				   unw_proc_info_t *pi, void *arg);
+                                   unw_proc_info_t *pi, void *arg);
 extern int dwarf_eval_expr (struct dwarf_cursor *c, unw_word_t *addr,
-			    unw_word_t len, unw_word_t *valp,
-			    int *is_register);
+                            unw_word_t len, unw_word_t *valp,
+                            int *is_register);
 extern int dwarf_extract_proc_info_from_fde (unw_addr_space_t as,
-					     unw_accessors_t *a,
-					     unw_word_t *fde_addr,
-					     unw_proc_info_t *pi,
-					     int need_unwind_info,
-					     unw_word_t base,
-					     void *arg);
+                                             unw_accessors_t *a,
+                                             unw_word_t *fde_addr,
+                                             unw_proc_info_t *pi,
+                                             unw_word_t base,
+                                             int need_unwind_info,
+                                             int is_debug_frame,
+                                             void *arg);
 extern int dwarf_find_save_locs (struct dwarf_cursor *c);
 extern int dwarf_create_state_record (struct dwarf_cursor *c,
-				      dwarf_state_record_t *sr);
+                                      dwarf_state_record_t *sr);
 extern int dwarf_make_proc_info (struct dwarf_cursor *c);
 extern int dwarf_read_encoded_pointer (unw_addr_space_t as,
-				       unw_accessors_t *a,
-				       unw_word_t *addr,
-				       unsigned char encoding,
-				       const unw_proc_info_t *pi,
-				       unw_word_t *valp, void *arg);
+                                       unw_accessors_t *a,
+                                       unw_word_t *addr,
+                                       unsigned char encoding,
+                                       const unw_proc_info_t *pi,
+                                       unw_word_t *valp, void *arg);
 extern int dwarf_step (struct dwarf_cursor *c);
 
 #endif /* dwarf_h */
diff --git a/frysk-imports/libunwind/include/dwarf_i.h b/frysk-imports/libunwind/include/dwarf_i.h
index d01eab8..4a02a7d 100644
--- a/frysk-imports/libunwind/include/dwarf_i.h
+++ b/frysk-imports/libunwind/include/dwarf_i.h
@@ -15,13 +15,13 @@
 # define dwarf_addr_size(as) (sizeof (unw_word_t))
 #endif
 
-#define dwarf_to_unw_regnum_map		UNW_OBJ (dwarf_to_unw_regnum_map)
-
-extern uint8_t dwarf_to_unw_regnum_map[DWARF_REGNUM_MAP_LENGTH];
-
+#ifndef dwarf_to_unw_regnum
+# define dwarf_to_unw_regnum_map                UNW_OBJ (dwarf_to_unw_regnum_map)
+extern const uint8_t dwarf_to_unw_regnum_map[DWARF_REGNUM_MAP_LENGTH];
 /* REG is evaluated multiple times; it better be side-effects free!  */
-#define dwarf_to_unw_regnum(reg)					  \
-  (((reg) <= DWARF_REGNUM_MAP_LENGTH) ? dwarf_to_unw_regnum_map[reg] : 0)
+# define dwarf_to_unw_regnum(reg)                                         \
+  (((reg) < DWARF_REGNUM_MAP_LENGTH) ? dwarf_to_unw_regnum_map[reg] : 0)
+#endif
 
 #ifdef UNW_LOCAL_ONLY
 
@@ -44,7 +44,7 @@ dwarf_misaligned_value_t;
 
 static inline int
 dwarf_reads8 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
-	      int8_t *val, void *arg)
+              int8_t *val, void *arg)
 {
   dwarf_misaligned_value_t *mvp = (void *) (uintptr_t) *addr;
 
@@ -55,7 +55,7 @@ dwarf_reads8 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
 
 static inline int
 dwarf_reads16 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
-	       int16_t *val, void *arg)
+               int16_t *val, void *arg)
 {
   dwarf_misaligned_value_t *mvp = (void *) (uintptr_t) *addr;
 
@@ -66,7 +66,7 @@ dwarf_reads16 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
 
 static inline int
 dwarf_reads32 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
-	       int32_t *val, void *arg)
+               int32_t *val, void *arg)
 {
   dwarf_misaligned_value_t *mvp = (void *) (uintptr_t) *addr;
 
@@ -77,7 +77,7 @@ dwarf_reads32 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
 
 static inline int
 dwarf_reads64 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
-	       int64_t *val, void *arg)
+               int64_t *val, void *arg)
 {
   dwarf_misaligned_value_t *mvp = (void *) (uintptr_t) *addr;
 
@@ -88,7 +88,7 @@ dwarf_reads64 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
 
 static inline int
 dwarf_readu8 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
-	      uint8_t *val, void *arg)
+              uint8_t *val, void *arg)
 {
   dwarf_misaligned_value_t *mvp = (void *) (uintptr_t) *addr;
 
@@ -99,7 +99,7 @@ dwarf_readu8 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
 
 static inline int
 dwarf_readu16 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
-	       uint16_t *val, void *arg)
+               uint16_t *val, void *arg)
 {
   dwarf_misaligned_value_t *mvp = (void *) (uintptr_t) *addr;
 
@@ -110,7 +110,7 @@ dwarf_readu16 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
 
 static inline int
 dwarf_readu32 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
-	       uint32_t *val, void *arg)
+               uint32_t *val, void *arg)
 {
   dwarf_misaligned_value_t *mvp = (void *) (uintptr_t) *addr;
 
@@ -121,7 +121,7 @@ dwarf_readu32 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
 
 static inline int
 dwarf_readu64 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
-	       uint64_t *val, void *arg)
+               uint64_t *val, void *arg)
 {
   dwarf_misaligned_value_t *mvp = (void *) (uintptr_t) *addr;
 
@@ -134,7 +134,7 @@ dwarf_readu64 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
 
 static inline int
 dwarf_readu8 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
-	      uint8_t *valp, void *arg)
+              uint8_t *valp, void *arg)
 {
   unw_word_t val, aligned_addr = *addr & -sizeof (unw_word_t);
   unw_word_t off = *addr - aligned_addr;
@@ -153,7 +153,7 @@ dwarf_readu8 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
 
 static inline int
 dwarf_readu16 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
-	       uint16_t *val, void *arg)
+               uint16_t *val, void *arg)
 {
   uint8_t v0, v1;
   int ret;
@@ -171,7 +171,7 @@ dwarf_readu16 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
 
 static inline int
 dwarf_readu32 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
-	       uint32_t *val, void *arg)
+               uint32_t *val, void *arg)
 {
   uint16_t v0, v1;
   int ret;
@@ -189,7 +189,7 @@ dwarf_readu32 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
 
 static inline int
 dwarf_readu64 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
-	       uint64_t *val, void *arg)
+               uint64_t *val, void *arg)
 {
   uint32_t v0, v1;
   int ret;
@@ -207,7 +207,7 @@ dwarf_readu64 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
 
 static inline int
 dwarf_reads8 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
-	      int8_t *val, void *arg)
+              int8_t *val, void *arg)
 {
   uint8_t uval;
   int ret;
@@ -220,7 +220,7 @@ dwarf_reads8 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
 
 static inline int
 dwarf_reads16 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
-	       int16_t *val, void *arg)
+               int16_t *val, void *arg)
 {
   uint16_t uval;
   int ret;
@@ -233,7 +233,7 @@ dwarf_reads16 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
 
 static inline int
 dwarf_reads32 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
-	       int32_t *val, void *arg)
+               int32_t *val, void *arg)
 {
   uint32_t uval;
   int ret;
@@ -246,7 +246,7 @@ dwarf_reads32 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
 
 static inline int
 dwarf_reads64 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
-	       int64_t *val, void *arg)
+               int64_t *val, void *arg)
 {
   uint64_t uval;
   int ret;
@@ -261,7 +261,7 @@ dwarf_reads64 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
 
 static inline int
 dwarf_readw (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
-	     unw_word_t *val, void *arg)
+             unw_word_t *val, void *arg)
 {
   uint32_t u32;
   uint64_t u64;
@@ -272,14 +272,14 @@ dwarf_readw (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
     case 4:
       ret = dwarf_readu32 (as, a, addr, &u32, arg);
       if (ret < 0)
-	return ret;
+        return ret;
       *val = u32;
       return ret;
 
     case 8:
       ret = dwarf_readu64 (as, a, addr, &u64, arg);
       if (ret < 0)
-	return ret;
+        return ret;
       *val = u64;
       return ret;
 
@@ -293,7 +293,7 @@ dwarf_readw (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
 
 static inline int
 dwarf_read_uleb128 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
-		    unw_word_t *valp, void *arg)
+                    unw_word_t *valp, void *arg)
 {
   unw_word_t val = 0, shift = 0;
   unsigned char byte;
@@ -302,7 +302,7 @@ dwarf_read_uleb128 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
   do
     {
       if ((ret = dwarf_readu8 (as, a, addr, &byte, arg)) < 0)
-	return ret;
+        return ret;
 
       val |= ((unw_word_t) byte & 0x7f) << shift;
       shift += 7;
@@ -318,7 +318,7 @@ dwarf_read_uleb128 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
 
 static inline int
 dwarf_read_sleb128 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
-		    unw_word_t *valp, void *arg)
+                    unw_word_t *valp, void *arg)
 {
   unw_word_t val = 0, shift = 0;
   unsigned char byte;
@@ -327,7 +327,7 @@ dwarf_read_sleb128 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
   do
     {
       if ((ret = dwarf_readu8 (as, a, addr, &byte, arg)) < 0)
-	return ret;
+        return ret;
 
       val |= ((unw_word_t) byte & 0x7f) << shift;
       shift += 7;
@@ -344,9 +344,9 @@ dwarf_read_sleb128 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
 
 static ALWAYS_INLINE int
 dwarf_read_encoded_pointer_inlined (unw_addr_space_t as, unw_accessors_t *a,
-				    unw_word_t *addr, unsigned char encoding,
-				    const unw_proc_info_t *pi,
-				    unw_word_t *valp, void *arg)
+                                    unw_word_t *addr, unsigned char encoding,
+                                    const unw_proc_info_t *pi,
+                                    unw_word_t *valp, void *arg)
 {
   unw_word_t val, initial_addr = *addr;
   uint16_t uval16;
@@ -375,58 +375,58 @@ dwarf_read_encoded_pointer_inlined (unw_addr_space_t as, unw_accessors_t *a,
     {
     case DW_EH_PE_ptr:
       if ((ret = dwarf_readw (as, a, addr, &val, arg)) < 0)
-	return ret;
+        return ret;
       break;
 
     case DW_EH_PE_uleb128:
       if ((ret = dwarf_read_uleb128 (as, a, addr, &val, arg)) < 0)
-	return ret;
+        return ret;
       break;
 
     case DW_EH_PE_udata2:
       if ((ret = dwarf_readu16 (as, a, addr, &uval16, arg)) < 0)
-	return ret;
+        return ret;
       val = uval16;
       break;
 
     case DW_EH_PE_udata4:
       if ((ret = dwarf_readu32 (as, a, addr, &uval32, arg)) < 0)
-	return ret;
+        return ret;
       val = uval32;
       break;
 
     case DW_EH_PE_udata8:
       if ((ret = dwarf_readu64 (as, a, addr, &uval64, arg)) < 0)
-	return ret;
+        return ret;
       val = uval64;
       break;
 
     case DW_EH_PE_sleb128:
       if ((ret = dwarf_read_uleb128 (as, a, addr, &val, arg)) < 0)
-	return ret;
+        return ret;
       break;
 
     case DW_EH_PE_sdata2:
       if ((ret = dwarf_reads16 (as, a, addr, &sval16, arg)) < 0)
-	return ret;
+        return ret;
       val = sval16;
       break;
 
     case DW_EH_PE_sdata4:
       if ((ret = dwarf_reads32 (as, a, addr, &sval32, arg)) < 0)
-	return ret;
+        return ret;
       val = sval32;
       break;
 
     case DW_EH_PE_sdata8:
       if ((ret = dwarf_reads64 (as, a, addr, &sval64, arg)) < 0)
-	return ret;
+        return ret;
       val = sval64;
       break;
 
     default:
       Debug (1, "unexpected encoding format 0x%x\n",
-	     encoding & DW_EH_PE_FORMAT_MASK);
+             encoding & DW_EH_PE_FORMAT_MASK);
       return -UNW_EINVAL;
     }
 
@@ -462,7 +462,7 @@ dwarf_read_encoded_pointer_inlined (unw_addr_space_t as, unw_accessors_t *a,
          "segbase" member to unw_proc_info_t.  */
     default:
       Debug (1, "unexpected application type 0x%x\n",
-	     encoding & DW_EH_PE_APPL_MASK);
+             encoding & DW_EH_PE_APPL_MASK);
       return -UNW_EINVAL;
     }
 
@@ -480,7 +480,7 @@ dwarf_read_encoded_pointer_inlined (unw_addr_space_t as, unw_accessors_t *a,
       unw_word_t indirect_addr = val;
 
       if ((ret = dwarf_readw (as, a, &indirect_addr, &val, arg)) < 0)
-	return ret;
+        return ret;
     }
 
   *valp = val;
diff --git a/frysk-imports/libunwind/include/libunwind-aarch64.h b/frysk-imports/libunwind/include/libunwind-aarch64.h
new file mode 100644
index 0000000..cd01e57
--- /dev/null
+++ b/frysk-imports/libunwind/include/libunwind-aarch64.h
@@ -0,0 +1,187 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2001-2004 Hewlett-Packard Co
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+   Copyright (C) 2013 Linaro Limited
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#ifndef LIBUNWIND_H
+#define LIBUNWIND_H
+
+#if defined(__cplusplus) || defined(c_plusplus)
+extern "C" {
+#endif
+
+#include <inttypes.h>
+#include <stddef.h>
+#include <ucontext.h>
+
+#define UNW_TARGET      aarch64
+#define UNW_TARGET_AARCH64      1
+
+#define _U_TDEP_QP_TRUE 0       /* see libunwind-dynamic.h  */
+
+/* This needs to be big enough to accommodate "struct cursor", while
+   leaving some slack for future expansion.  Changing this value will
+   require recompiling all users of this library.  Stack allocation is
+   relatively cheap and unwind-state copying is relatively rare, so we
+   want to err on making it rather too big than too small.  */
+
+#define UNW_TDEP_CURSOR_LEN     4096
+
+typedef uint64_t unw_word_t;
+typedef int64_t unw_sword_t;
+
+typedef long double unw_tdep_fpreg_t;
+
+typedef struct
+  {
+    /* no aarch64-specific auxiliary proc-info */
+  }
+unw_tdep_proc_info_t;
+
+typedef enum
+  {
+    /* 64-bit general registers.  */
+    UNW_AARCH64_X0,
+    UNW_AARCH64_X1,
+    UNW_AARCH64_X2,
+    UNW_AARCH64_X3,
+    UNW_AARCH64_X4,
+    UNW_AARCH64_X5,
+    UNW_AARCH64_X6,
+    UNW_AARCH64_X7,
+    UNW_AARCH64_X8,
+
+    /* Temporary registers.  */
+    UNW_AARCH64_X9,
+    UNW_AARCH64_X10,
+    UNW_AARCH64_X11,
+    UNW_AARCH64_X12,
+    UNW_AARCH64_X13,
+    UNW_AARCH64_X14,
+    UNW_AARCH64_X15,
+
+    /* Intra-procedure-call temporary registers.  */
+    UNW_AARCH64_X16,
+    UNW_AARCH64_X17,
+
+    /* Callee-saved registers.  */
+    UNW_AARCH64_X18,
+    UNW_AARCH64_X19,
+    UNW_AARCH64_X20,
+    UNW_AARCH64_X21,
+    UNW_AARCH64_X22,
+    UNW_AARCH64_X23,
+    UNW_AARCH64_X24,
+    UNW_AARCH64_X25,
+    UNW_AARCH64_X26,
+    UNW_AARCH64_X27,
+    UNW_AARCH64_X28,
+
+    /* 64-bit frame pointer.  */
+    UNW_AARCH64_X29,
+
+    /* 64-bit link register.  */
+    UNW_AARCH64_X30,
+
+    /* 64-bit stack pointer.  */
+    UNW_AARCH64_SP =  31,
+    UNW_AARCH64_PC,
+    UNW_AARCH64_PSTATE,
+
+    /* 128-bit FP/Advanced SIMD registers.  */
+    UNW_AARCH64_V0 = 64,
+    UNW_AARCH64_V1,
+    UNW_AARCH64_V2,
+    UNW_AARCH64_V3,
+    UNW_AARCH64_V4,
+    UNW_AARCH64_V5,
+    UNW_AARCH64_V6,
+    UNW_AARCH64_V7,
+    UNW_AARCH64_V8,
+    UNW_AARCH64_V9,
+    UNW_AARCH64_V10,
+    UNW_AARCH64_V11,
+    UNW_AARCH64_V12,
+    UNW_AARCH64_V13,
+    UNW_AARCH64_V14,
+    UNW_AARCH64_V15,
+    UNW_AARCH64_V16,
+    UNW_AARCH64_V17,
+    UNW_AARCH64_V18,
+    UNW_AARCH64_V19,
+    UNW_AARCH64_V20,
+    UNW_AARCH64_V21,
+    UNW_AARCH64_V22,
+    UNW_AARCH64_V23,
+    UNW_AARCH64_V24,
+    UNW_AARCH64_V25,
+    UNW_AARCH64_V26,
+    UNW_AARCH64_V27,
+    UNW_AARCH64_V28,
+    UNW_AARCH64_V29,
+    UNW_AARCH64_V30,
+    UNW_AARCH64_V31,
+
+    UNW_AARCH64_FPSR,
+    UNW_AARCH64_FPCR,
+
+    /* For AArch64, the CFA is the value of SP (x31) at the call site of the
+       previous frame.  */
+    UNW_AARCH64_CFA = UNW_AARCH64_SP,
+
+    UNW_TDEP_LAST_REG = UNW_AARCH64_FPCR,
+
+    UNW_TDEP_IP = UNW_AARCH64_X30,
+    UNW_TDEP_SP = UNW_AARCH64_SP,
+    UNW_TDEP_EH = UNW_AARCH64_X0,
+
+  }
+aarch64_regnum_t;
+
+/* Use R0 through R3 to pass exception handling information.  */
+#define UNW_TDEP_NUM_EH_REGS    4
+
+typedef struct unw_tdep_save_loc
+  {
+    /* Additional target-dependent info on a save location.  */
+  }
+unw_tdep_save_loc_t;
+
+
+/* On AArch64, we can directly use ucontext_t as the unwind context.  */
+typedef ucontext_t unw_tdep_context_t;
+
+#include "libunwind-common.h"
+#include "libunwind-dynamic.h"
+
+#define unw_tdep_getcontext(uc)         (getcontext (uc), 0)
+#define unw_tdep_is_fpreg               UNW_ARCH_OBJ(is_fpreg)
+
+extern int unw_tdep_is_fpreg (int);
+
+#if defined(__cplusplus) || defined(c_plusplus)
+}
+#endif
+
+#endif /* LIBUNWIND_H */
diff --git a/frysk-imports/libunwind/include/libunwind-arm.h b/frysk-imports/libunwind/include/libunwind-arm.h
index 492331e..f208487 100644
--- a/frysk-imports/libunwind/include/libunwind-arm.h
+++ b/frysk-imports/libunwind/include/libunwind-arm.h
@@ -30,12 +30,12 @@ extern "C" {
 #endif
 
 #include <inttypes.h>
-#include <ucontext.h>
+#include <stddef.h>
 
-#define UNW_TARGET	arm
-#define UNW_TARGET_ARM	1
+#define UNW_TARGET      arm
+#define UNW_TARGET_ARM  1
 
-#define _U_TDEP_QP_TRUE	0	/* see libunwind-dynamic.h  */
+#define _U_TDEP_QP_TRUE 0       /* see libunwind-dynamic.h  */
 
 /* This needs to be big enough to accommodate "struct cursor", while
    leaving some slack for future expansion.  Changing this value will
@@ -44,7 +44,7 @@ extern "C" {
    want to err on making it rather too big than too small.  */
    
 /* FIXME for ARM. Too big?  What do other things use for similar tasks?  */
-#define UNW_TDEP_CURSOR_LEN	4096
+#define UNW_TDEP_CURSOR_LEN     4096
 
 typedef uint32_t unw_word_t;
 typedef int32_t unw_sword_t;
@@ -242,7 +242,7 @@ typedef enum
   }
 arm_regnum_t;
 
-#define UNW_TDEP_NUM_EH_REGS	2	/* FIXME for ARM.  */
+#define UNW_TDEP_NUM_EH_REGS    2       /* FIXME for ARM.  */
 
 typedef struct unw_tdep_save_loc
   {
@@ -250,31 +250,35 @@ typedef struct unw_tdep_save_loc
   }
 unw_tdep_save_loc_t;
 
-/* On ARM, we can directly use ucontext_t as the unwind context.  */
-typedef ucontext_t unw_tdep_context_t;
+/* On ARM, we define our own unw_tdep_context instead of using ucontext_t.
+   This allows us to support systems that don't support getcontext and
+   therefore do not define ucontext_t.  */
+typedef struct unw_tdep_context
+  {
+    unsigned long regs[16];
+  }
+unw_tdep_context_t;
 
 /* There is no getcontext() on ARM.  Use a stub version which only saves GP
    registers.  FIXME: Not ideal, may not be sufficient for all libunwind
    use cases.  Stores pc+8, which is only approximately correct, really.  */
 #ifndef __thumb__
-#define unw_tdep_getcontext(uc) (({					\
-  unw_tdep_context_t *unw_ctx = (uc);					\
-  register int unw_base asm ("r0")					\
-    = (int) (&unw_ctx->uc_mcontext.arm_r0);				\
-  __asm__ __volatile__ (						\
-    "stmia %[base], {r0-r15}"						\
-    : : [base] "r" (unw_base) : "memory");				\
+#define unw_tdep_getcontext(uc) (({                                     \
+  unw_tdep_context_t *unw_ctx = (uc);                                   \
+  register unsigned long *unw_base asm ("r0") = unw_ctx->regs;          \
+  __asm__ __volatile__ (                                                \
+    "stmia %[base], {r0-r15}"                                           \
+    : : [base] "r" (unw_base) : "memory");                              \
   }), 0)
 #else /* __thumb__ */
-#define unw_tdep_getcontext(uc) (({					\
-  unw_tdep_context_t *unw_ctx = (uc);					\
-  register int unw_base asm ("r0")					\
-    = (int) (&unw_ctx->uc_mcontext.arm_r0);				\
-  __asm__ __volatile__ (						\
-    ".align 2\nbx pc\nnop\n.code 32\n"					\
-    "stmia %[base], {r0-r15}\n"						\
-    "orr %[base], pc, #1\nbx %[base]"					\
-    : [base] "+r" (unw_base) : : "memory", "cc");			\
+#define unw_tdep_getcontext(uc) (({                                     \
+  unw_tdep_context_t *unw_ctx = (uc);                                   \
+  register unsigned long *unw_base asm ("r0") = unw_ctx->regs;          \
+  __asm__ __volatile__ (                                                \
+    ".align 2\nbx pc\nnop\n.code 32\n"                                  \
+    "stmia %[base], {r0-r15}\n"                                         \
+    "orr %[base], pc, #1\nbx %[base]"                                   \
+    : [base] "+r" (unw_base) : : "memory", "cc");                       \
   }), 0)
 #endif
 
@@ -288,7 +292,7 @@ unw_tdep_proc_info_t;
 
 #include "libunwind-common.h"
 
-#define unw_tdep_is_fpreg		UNW_ARCH_OBJ(is_fpreg)
+#define unw_tdep_is_fpreg               UNW_ARCH_OBJ(is_fpreg)
 extern int unw_tdep_is_fpreg (int);
 
 #if defined(__cplusplus) || defined(c_plusplus)
diff --git a/frysk-imports/libunwind/include/libunwind-common.h.in b/frysk-imports/libunwind/include/libunwind-common.h.in
index b9e582a..02fac10 100644
--- a/frysk-imports/libunwind/include/libunwind-common.h.in
+++ b/frysk-imports/libunwind/include/libunwind-common.h.in
@@ -2,6 +2,7 @@
    Copyright (C) 2001-2004 Hewlett-Packard Co
 	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
    Copyright Red Hat 2007
+   Copyright (C) 2016, Andrew Cagney
 
 This file is part of libunwind.
 
@@ -120,6 +121,8 @@ typedef struct unw_addr_space *unw_addr_space_t;
 /* Each target may define it's own set of flags, but bits 0-15 are
    reserved for general libunwind-use.  */
 #define UNW_PI_FLAG_FIRST_TDEP_BIT	16
+/* The information comes from a .debug_frame section.  */
+#define UNW_PI_FLAG_DEBUG_FRAME	32
 
 typedef struct unw_proc_info
   {
@@ -221,6 +224,7 @@ unw_save_loc_t;
 #define unw_set_fpreg		UNW_OBJ(set_fpreg)
 #define unw_get_save_loc	UNW_OBJ(get_save_loc)
 #define unw_is_signal_frame	UNW_OBJ(is_signal_frame)
+#define unw_handle_signal_frame	UNW_OBJ(handle_signal_frame)
 #define unw_get_proc_name	UNW_OBJ(get_proc_name)
 #define unw_set_caching_policy	UNW_OBJ(set_caching_policy)
 #define unw_regname		UNW_ARCH_OBJ(regname)
@@ -248,12 +252,14 @@ extern int unw_get_fpreg (unw_cursor_t *, int, unw_fpreg_t *);
 extern int unw_set_fpreg (unw_cursor_t *, int, unw_fpreg_t);
 extern int unw_get_save_loc (unw_cursor_t *, int, unw_save_loc_t *);
 extern int unw_is_signal_frame (unw_cursor_t *);
+extern int unw_handle_signal_frame (unw_cursor_t *);
 extern int unw_get_proc_name (unw_cursor_t *, char *, size_t, unw_word_t *);
 extern const char *unw_strerror (int);
-extern int unw_get_unwind_table(unw_word_t ip, 
-				unw_proc_info_t *pi, int need_unwind_info,
-				unw_accessors_t *eh_frame_accessors,
+extern int unw_backtrace (void **, int);
+extern int unw_get_unwind_table(unw_word_t ip, unw_proc_info_t *pi,
+				int need_unwind_info,
 				unw_word_t eh_frame_hdr_address,
-				void *eh_frame_arg);
+				unw_addr_space_t eh_frame_addr_space,
+				void *eh_frame_addr_space_arg);
 
 extern unw_addr_space_t unw_local_addr_space;
diff --git a/frysk-imports/libunwind/include/libunwind-coredump.h b/frysk-imports/libunwind/include/libunwind-coredump.h
new file mode 100644
index 0000000..3c78141
--- /dev/null
+++ b/frysk-imports/libunwind/include/libunwind-coredump.h
@@ -0,0 +1,73 @@
+/* libunwind - a platform-independent unwind library
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#ifndef libunwind_coredump_h
+#define libunwind_coredump_h
+
+#include <libunwind.h>
+
+#if defined(__cplusplus) || defined(c_plusplus)
+extern "C" {
+#endif
+
+/* Helper routines which make it easy to use libunwind on a coredump.
+   They're available only if UNW_REMOTE_ONLY is _not_ defined and they
+   aren't really part of the libunwind API.  They are implemented in a
+   archive library called libunwind-coredump.a.  */
+
+struct UCD_info;
+
+extern struct UCD_info *_UCD_create(const char *filename);
+extern void _UCD_destroy(struct UCD_info *);
+
+extern int _UCD_get_num_threads(struct UCD_info *);
+extern void _UCD_select_thread(struct UCD_info *, int);
+extern pid_t _UCD_get_pid(struct UCD_info *);
+extern int _UCD_get_cursig(struct UCD_info *);
+extern int _UCD_add_backing_file_at_segment(struct UCD_info *, int phdr_no, const char *filename);
+extern int _UCD_add_backing_file_at_vaddr(struct UCD_info *,
+                                          unsigned long vaddr,
+                                          const char *filename);
+
+extern int _UCD_find_proc_info (unw_addr_space_t, unw_word_t,
+                                unw_proc_info_t *, int, void *);
+extern void _UCD_put_unwind_info (unw_addr_space_t, unw_proc_info_t *, void *);
+extern int _UCD_get_dyn_info_list_addr (unw_addr_space_t, unw_word_t *,
+                                        void *);
+extern int _UCD_access_mem (unw_addr_space_t, unw_word_t, unw_word_t *, int,
+                            void *);
+extern int _UCD_access_reg (unw_addr_space_t, unw_regnum_t, unw_word_t *,
+                            int, void *);
+extern int _UCD_access_fpreg (unw_addr_space_t, unw_regnum_t, unw_fpreg_t *,
+                              int, void *);
+extern int _UCD_get_proc_name (unw_addr_space_t, unw_word_t, char *, size_t,
+                               unw_word_t *, void *);
+extern int _UCD_resume (unw_addr_space_t, unw_cursor_t *, void *);
+extern unw_accessors_t _UCD_accessors;
+
+
+#if defined(__cplusplus) || defined(c_plusplus)
+}
+#endif
+
+#endif /* libunwind_coredump_h */
diff --git a/frysk-imports/libunwind/include/libunwind-dynamic.h b/frysk-imports/libunwind/include/libunwind-dynamic.h
index 8f6041f..edb0bbd 100644
--- a/frysk-imports/libunwind/include/libunwind-dynamic.h
+++ b/frysk-imports/libunwind/include/libunwind-dynamic.h
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2002-2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -59,49 +59,54 @@ the following rules should be followed in declaring these structures:
 
 typedef enum
   {
-    UNW_DYN_STOP = 0,		/* end-of-unwind-info marker */
-    UNW_DYN_SAVE_REG,		/* save register to another register */
-    UNW_DYN_SPILL_FP_REL,	/* frame-pointer-relative register spill */
-    UNW_DYN_SPILL_SP_REL,	/* stack-pointer-relative register spill */
-    UNW_DYN_ADD,		/* add constant value to a register */
-    UNW_DYN_POP_FRAMES,		/* drop one or more stack frames */
-    UNW_DYN_LABEL_STATE,	/* name the current state */
-    UNW_DYN_COPY_STATE,		/* set the region's entry-state */
-    UNW_DYN_ALIAS		/* get unwind info from an alias */
+    UNW_DYN_STOP = 0,           /* end-of-unwind-info marker */
+    UNW_DYN_SAVE_REG,           /* save register to another register */
+    UNW_DYN_SPILL_FP_REL,       /* frame-pointer-relative register spill */
+    UNW_DYN_SPILL_SP_REL,       /* stack-pointer-relative register spill */
+    UNW_DYN_ADD,                /* add constant value to a register */
+    UNW_DYN_POP_FRAMES,         /* drop one or more stack frames */
+    UNW_DYN_LABEL_STATE,        /* name the current state */
+    UNW_DYN_COPY_STATE,         /* set the region's entry-state */
+    UNW_DYN_ALIAS               /* get unwind info from an alias */
   }
 unw_dyn_operation_t;
 
 typedef enum
   {
-    UNW_INFO_FORMAT_DYNAMIC,		/* unw_dyn_proc_info_t */
-    UNW_INFO_FORMAT_TABLE,		/* unw_dyn_table_t */
-    UNW_INFO_FORMAT_REMOTE_TABLE,	/* unw_dyn_remote_table_t */
+    UNW_INFO_FORMAT_DYNAMIC,            /* unw_dyn_proc_info_t */
+    UNW_INFO_FORMAT_TABLE,              /* unw_dyn_table_t */
+    UNW_INFO_FORMAT_REMOTE_TABLE,       /* unw_dyn_remote_table_t */
+    UNW_INFO_FORMAT_ARM_EXIDX,          /* ARM specific unwind info */
+    UNW_INFO_FORMAT_IP_OFFSET,          /* Like UNW_INFO_FORMAT_REMOTE_TABLE, but
+                                           table entries are considered
+                                           relative to di->start_ip, rather
+                                           than di->segbase */
   }
 unw_dyn_info_format_t;
 
 typedef struct unw_dyn_op
   {
-    int8_t tag;				/* what operation? */
-    int8_t qp;				/* qualifying predicate register */
-    int16_t reg;			/* what register */
-    int32_t when;			/* when does it take effect? */
-    unw_word_t val;			/* auxiliary value */
+    int8_t tag;                         /* what operation? */
+    int8_t qp;                          /* qualifying predicate register */
+    int16_t reg;                        /* what register */
+    int32_t when;                       /* when does it take effect? */
+    unw_word_t val;                     /* auxiliary value */
   }
 unw_dyn_op_t;
 
 typedef struct unw_dyn_region_info
   {
-    struct unw_dyn_region_info *next;	/* linked list of regions */
-    int32_t insn_count;			/* region length (# of instructions) */
-    uint32_t op_count;			/* length of op-array */
-    unw_dyn_op_t op[1];			/* variable-length op-array */
+    struct unw_dyn_region_info *next;   /* linked list of regions */
+    int32_t insn_count;                 /* region length (# of instructions) */
+    uint32_t op_count;                  /* length of op-array */
+    unw_dyn_op_t op[1];                 /* variable-length op-array */
   }
 unw_dyn_region_info_t;
 
 typedef struct unw_dyn_proc_info
   {
-    unw_word_t name_ptr;	/* address of human-readable procedure name */
-    unw_word_t handler;		/* address of personality routine */
+    unw_word_t name_ptr;        /* address of human-readable procedure name */
+    unw_word_t handler;         /* address of personality routine */
     uint32_t flags;
     int32_t pad0;
     unw_dyn_region_info_t *regions;
@@ -110,18 +115,18 @@ unw_dyn_proc_info_t;
 
 typedef struct unw_dyn_table_info
   {
-    unw_word_t name_ptr;	/* addr. of table name (e.g., library name) */
-    unw_word_t segbase;		/* segment base */
-    unw_word_t table_len;	/* must be a multiple of sizeof(unw_word_t)! */
+    unw_word_t name_ptr;        /* addr. of table name (e.g., library name) */
+    unw_word_t segbase;         /* segment base */
+    unw_word_t table_len;       /* must be a multiple of sizeof(unw_word_t)! */
     unw_word_t *table_data;
   }
 unw_dyn_table_info_t;
 
 typedef struct unw_dyn_remote_table_info
   {
-    unw_word_t name_ptr;	/* addr. of table name (e.g., library name) */
-    unw_word_t segbase;		/* segment base */
-    unw_word_t table_len;	/* must be a multiple of sizeof(unw_word_t)! */
+    unw_word_t name_ptr;        /* addr. of table name (e.g., library name) */
+    unw_word_t segbase;         /* segment base */
+    unw_word_t table_len;       /* must be a multiple of sizeof(unw_word_t)! */
     unw_word_t table_data;
   }
 unw_dyn_remote_table_info_t;
@@ -131,16 +136,16 @@ typedef struct unw_dyn_info
     /* doubly-linked list of dyn-info structures: */
     struct unw_dyn_info *next;
     struct unw_dyn_info *prev;
-    unw_word_t start_ip;	/* first IP covered by this entry */
-    unw_word_t end_ip;		/* first IP NOT covered by this entry */
-    unw_word_t gp;		/* global-pointer in effect for this entry */
-    int32_t format;		/* real type: unw_dyn_info_format_t */
+    unw_word_t start_ip;        /* first IP covered by this entry */
+    unw_word_t end_ip;          /* first IP NOT covered by this entry */
+    unw_word_t gp;              /* global-pointer in effect for this entry */
+    int32_t format;             /* real type: unw_dyn_info_format_t */
     int32_t pad;
     union
       {
-	unw_dyn_proc_info_t pi;
-	unw_dyn_table_info_t ti;
-	unw_dyn_remote_table_info_t rti;
+        unw_dyn_proc_info_t pi;
+        unw_dyn_table_info_t ti;
+        unw_dyn_remote_table_info_t rti;
       }
     u;
   }
@@ -156,9 +161,9 @@ unw_dyn_info_list_t;
 
 /* Return the size (in bytes) of an unw_dyn_region_info_t structure that can
    hold OP_COUNT ops.  */
-#define _U_dyn_region_info_size(op_count)				\
-	((char *) (((unw_dyn_region_info_t *) NULL)->op + (op_count))	\
-	 - (char *) NULL)
+#define _U_dyn_region_info_size(op_count)                               \
+        ((char *) (((unw_dyn_region_info_t *) NULL)->op + (op_count))   \
+         - (char *) NULL)
 
 /* Register the unwind info for a single procedure.
    This routine is NOT signal-safe.  */
@@ -171,39 +176,39 @@ extern void _U_dyn_cancel (unw_dyn_info_t *);
 
 /* Convenience routines.  */
 
-#define _U_dyn_op(_tag, _qp, _when, _reg, _val)				\
-	((unw_dyn_op_t) { (_tag), (_qp), (_reg), (_when), (_val) })
+#define _U_dyn_op(_tag, _qp, _when, _reg, _val)                         \
+        ((unw_dyn_op_t) { (_tag), (_qp), (_reg), (_when), (_val) })
 
-#define _U_dyn_op_save_reg(op, qp, when, reg, dst)			\
-	(*(op) = _U_dyn_op (UNW_DYN_SAVE_REG, (qp), (when), (reg), (dst)))
+#define _U_dyn_op_save_reg(op, qp, when, reg, dst)                      \
+        (*(op) = _U_dyn_op (UNW_DYN_SAVE_REG, (qp), (when), (reg), (dst)))
 
-#define _U_dyn_op_spill_fp_rel(op, qp, when, reg, offset)		\
-	(*(op) = _U_dyn_op (UNW_DYN_SPILL_FP_REL, (qp), (when), (reg),	\
-			    (offset)))
+#define _U_dyn_op_spill_fp_rel(op, qp, when, reg, offset)               \
+        (*(op) = _U_dyn_op (UNW_DYN_SPILL_FP_REL, (qp), (when), (reg),  \
+                            (offset)))
 
-#define _U_dyn_op_spill_sp_rel(op, qp, when, reg, offset)		\
-	(*(op) = _U_dyn_op (UNW_DYN_SPILL_SP_REL, (qp), (when), (reg),	\
-			    (offset)))
+#define _U_dyn_op_spill_sp_rel(op, qp, when, reg, offset)               \
+        (*(op) = _U_dyn_op (UNW_DYN_SPILL_SP_REL, (qp), (when), (reg),  \
+                            (offset)))
 
-#define _U_dyn_op_add(op, qp, when, reg, value)				\
-	(*(op) = _U_dyn_op (UNW_DYN_ADD, (qp), (when), (reg), (value)))
+#define _U_dyn_op_add(op, qp, when, reg, value)                         \
+        (*(op) = _U_dyn_op (UNW_DYN_ADD, (qp), (when), (reg), (value)))
 
-#define _U_dyn_op_pop_frames(op, qp, when, num_frames)			\
-	(*(op) = _U_dyn_op (UNW_DYN_POP_FRAMES, (qp), (when), 0, (num_frames)))
+#define _U_dyn_op_pop_frames(op, qp, when, num_frames)                  \
+        (*(op) = _U_dyn_op (UNW_DYN_POP_FRAMES, (qp), (when), 0, (num_frames)))
 
-#define _U_dyn_op_label_state(op, label)				\
-	(*(op) = _U_dyn_op (UNW_DYN_LABEL_STATE, _U_QP_TRUE, -1, 0, (label)))
+#define _U_dyn_op_label_state(op, label)                                \
+        (*(op) = _U_dyn_op (UNW_DYN_LABEL_STATE, _U_QP_TRUE, -1, 0, (label)))
 
-#define _U_dyn_op_copy_state(op, label)					\
-	(*(op) = _U_dyn_op (UNW_DYN_COPY_STATE, _U_QP_TRUE, -1, 0, (label)))
+#define _U_dyn_op_copy_state(op, label)                                 \
+        (*(op) = _U_dyn_op (UNW_DYN_COPY_STATE, _U_QP_TRUE, -1, 0, (label)))
 
-#define _U_dyn_op_alias(op, qp, when, addr)				\
-	(*(op) = _U_dyn_op (UNW_DYN_ALIAS, (qp), (when), 0, (addr)))
+#define _U_dyn_op_alias(op, qp, when, addr)                             \
+        (*(op) = _U_dyn_op (UNW_DYN_ALIAS, (qp), (when), 0, (addr)))
 
-#define _U_dyn_op_stop(op)						\
-	(*(op) = _U_dyn_op (UNW_DYN_STOP, _U_QP_TRUE, -1, 0, 0))
+#define _U_dyn_op_stop(op)                                              \
+        (*(op) = _U_dyn_op (UNW_DYN_STOP, _U_QP_TRUE, -1, 0, 0))
 
 /* The target-dependent qualifying predicate which is always TRUE.  On
    IA-64, that's p0 (0), on non-predicated architectures, the value is
    ignored.  */
-#define _U_QP_TRUE	_U_TDEP_QP_TRUE
+#define _U_QP_TRUE      _U_TDEP_QP_TRUE
diff --git a/frysk-imports/libunwind/include/libunwind-hppa.h b/frysk-imports/libunwind/include/libunwind-hppa.h
index 74ea70d..7013aa7 100644
--- a/frysk-imports/libunwind/include/libunwind-hppa.h
+++ b/frysk-imports/libunwind/include/libunwind-hppa.h
@@ -32,17 +32,17 @@ extern "C" {
 #include <inttypes.h>
 #include <ucontext.h>
 
-#define UNW_TARGET	hppa
-#define UNW_TARGET_HPPA	1
+#define UNW_TARGET      hppa
+#define UNW_TARGET_HPPA 1
 
-#define _U_TDEP_QP_TRUE	0	/* see libunwind-dynamic.h  */
+#define _U_TDEP_QP_TRUE 0       /* see libunwind-dynamic.h  */
 
 /* This needs to be big enough to accommodate "struct cursor", while
    leaving some slack for future expansion.  Changing this value will
    require recompiling all users of this library.  Stack allocation is
    relatively cheap and unwind-state copying is relatively rare, so we
    want to err on making it rather too big than too small.  */
-#define UNW_TDEP_CURSOR_LEN	511
+#define UNW_TDEP_CURSOR_LEN     511
 
 typedef uint32_t unw_word_t;
 typedef int32_t unw_sword_t;
@@ -61,13 +61,13 @@ typedef enum
        implementation of the C++ exception handling ABI.  See
        _Unwind_SetGR() and _Unwind_GetGR() for details.  */
     UNW_HPPA_GR = 0,
-     UNW_HPPA_RP = 2,			/* return pointer */
-     UNW_HPPA_FP = 3,			/* frame pointer */
+     UNW_HPPA_RP = 2,                   /* return pointer */
+     UNW_HPPA_FP = 3,                   /* frame pointer */
      UNW_HPPA_SP = UNW_HPPA_GR + 30,
 
     UNW_HPPA_FR = UNW_HPPA_GR + 32,
 
-    UNW_HPPA_IP = UNW_HPPA_FR + 32,	/* instruction pointer */
+    UNW_HPPA_IP = UNW_HPPA_FR + 32,     /* instruction pointer */
 
     /* other "preserved" registers (fpsr etc.)... */
 
@@ -76,10 +76,10 @@ typedef enum
        exception-handling registers which we then alias to the actual
        physical register.  */
 
-    UNW_HPPA_EH0 = UNW_HPPA_IP + 1,	/* alias for UNW_HPPA_GR + 20 */
-    UNW_HPPA_EH1 = UNW_HPPA_EH0 + 1,	/* alias for UNW_HPPA_GR + 21 */
-    UNW_HPPA_EH2 = UNW_HPPA_EH1 + 1,	/* alias for UNW_HPPA_GR + 22 */
-    UNW_HPPA_EH3 = UNW_HPPA_EH2 + 1,	/* alias for UNW_HPPA_GR + 31 */
+    UNW_HPPA_EH0 = UNW_HPPA_IP + 1,     /* alias for UNW_HPPA_GR + 20 */
+    UNW_HPPA_EH1 = UNW_HPPA_EH0 + 1,    /* alias for UNW_HPPA_GR + 21 */
+    UNW_HPPA_EH2 = UNW_HPPA_EH1 + 1,    /* alias for UNW_HPPA_GR + 22 */
+    UNW_HPPA_EH3 = UNW_HPPA_EH2 + 1,    /* alias for UNW_HPPA_GR + 31 */
 
     /* frame info (read-only) */
     UNW_HPPA_CFA,
@@ -92,7 +92,7 @@ typedef enum
   }
 hppa_regnum_t;
 
-#define UNW_TDEP_NUM_EH_REGS	4
+#define UNW_TDEP_NUM_EH_REGS    4
 
 typedef struct unw_tdep_save_loc
   {
@@ -103,7 +103,7 @@ unw_tdep_save_loc_t;
 /* On PA-RISC, we can directly use ucontext_t as the unwind context.  */
 typedef ucontext_t unw_tdep_context_t;
 
-#define unw_tdep_is_fpreg(r)		((unsigned) ((r) - UNW_HPPA_FR) < 32)
+#define unw_tdep_is_fpreg(r)            ((unsigned) ((r) - UNW_HPPA_FR) < 32)
 
 #include "libunwind-dynamic.h"
 
@@ -115,7 +115,7 @@ unw_tdep_proc_info_t;
 
 #include "libunwind-common.h"
 
-#define unw_tdep_getcontext		UNW_ARCH_OBJ (getcontext)
+#define unw_tdep_getcontext             UNW_ARCH_OBJ (getcontext)
 extern int unw_tdep_getcontext (unw_tdep_context_t *);
 
 #if defined(__cplusplus) || defined(c_plusplus)
diff --git a/frysk-imports/libunwind/include/libunwind-ia64.h b/frysk-imports/libunwind/include/libunwind-ia64.h
index fb2fbfe..0cc4f39 100644
--- a/frysk-imports/libunwind/include/libunwind-ia64.h
+++ b/frysk-imports/libunwind/include/libunwind-ia64.h
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2001-2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -47,24 +47,24 @@ extern "C" {
 # define UNW_GENERIC_ONLY
 #endif
 
-#define UNW_TARGET	ia64
-#define UNW_TARGET_IA64	1
+#define UNW_TARGET      ia64
+#define UNW_TARGET_IA64 1
 
-#define _U_TDEP_QP_TRUE	0	/* see libunwind-dynamic.h  */
+#define _U_TDEP_QP_TRUE 0       /* see libunwind-dynamic.h  */
 
 /* This needs to be big enough to accommodate "struct cursor", while
    leaving some slack for future expansion.  Changing this value will
    require recompiling all users of this library.  Stack allocation is
    relatively cheap and unwind-state copying is relatively rare, so we
    want to err on making it rather too big than too small.  */
-#define UNW_TDEP_CURSOR_LEN	511
+#define UNW_TDEP_CURSOR_LEN     511
 
 /* If this bit is it indicates that the procedure saved all of ar.bsp,
    ar.bspstore, and ar.rnat.  If, additionally, ar.bsp != saved ar.bsp,
    then this procedure has performed a register-backing-store switch.  */
-#define UNW_PI_FLAG_IA64_RBS_SWITCH_BIT	(UNW_PI_FLAG_FIRST_TDEP_BIT + 0)
+#define UNW_PI_FLAG_IA64_RBS_SWITCH_BIT (UNW_PI_FLAG_FIRST_TDEP_BIT + 0)
 
-#define UNW_PI_FLAG_IA64_RBS_SWITCH	(1 << UNW_PI_FLAG_IA64_RBS_SWITCH_BIT)
+#define UNW_PI_FLAG_IA64_RBS_SWITCH     (1 << UNW_PI_FLAG_IA64_RBS_SWITCH_BIT)
 
 typedef uint64_t unw_word_t;
 typedef int64_t unw_sword_t;
@@ -76,7 +76,7 @@ typedef int64_t unw_sword_t;
 typedef union
   {
     struct { unw_word_t bits[2]; } raw;
-    long double dummy;	/* dummy to force 16-byte alignment */
+    long double dummy;  /* dummy to force 16-byte alignment */
   }
 unw_tdep_fpreg_t;
 
@@ -92,15 +92,15 @@ typedef enum
        This convention facilitates architecture-independent
        implementation of the C++ exception handling ABI.  See
        _Unwind_SetGR() and _Unwind_GetGR() for details.  */
-    UNW_IA64_GR = 0,			/* general registers (r0..r127) */
+    UNW_IA64_GR = 0,                    /* general registers (r0..r127) */
      UNW_IA64_GP = UNW_IA64_GR + 1,
      UNW_IA64_TP = UNW_IA64_GR + 13,
 
-    UNW_IA64_NAT = UNW_IA64_GR + 128,	/* NaT registers (nat0..nat127) */
+    UNW_IA64_NAT = UNW_IA64_GR + 128,   /* NaT registers (nat0..nat127) */
 
-    UNW_IA64_FR = UNW_IA64_NAT + 128,	/* fp registers (f0..f127) */
+    UNW_IA64_FR = UNW_IA64_NAT + 128,   /* fp registers (f0..f127) */
 
-    UNW_IA64_AR = UNW_IA64_FR + 128,	/* application registers (ar0..r127) */
+    UNW_IA64_AR = UNW_IA64_FR + 128,    /* application registers (ar0..r127) */
      UNW_IA64_AR_RSC = UNW_IA64_AR + 16,
      UNW_IA64_AR_BSP = UNW_IA64_AR + 17,
      UNW_IA64_AR_BSPSTORE = UNW_IA64_AR + 18,
@@ -115,9 +115,9 @@ typedef enum
      UNW_IA64_AR_LC = UNW_IA64_AR + 65,
      UNW_IA64_AR_EC = UNW_IA64_AR + 66,
 
-    UNW_IA64_BR = UNW_IA64_AR + 128,	/* branch registers (b0..p7) */
-      UNW_IA64_RP = UNW_IA64_BR + 0,	/* return pointer (rp) */
-    UNW_IA64_PR = UNW_IA64_BR + 8,	/* predicate registers (p0..p63) */
+    UNW_IA64_BR = UNW_IA64_AR + 128,    /* branch registers (b0..p7) */
+      UNW_IA64_RP = UNW_IA64_BR + 0,    /* return pointer (rp) */
+    UNW_IA64_PR = UNW_IA64_BR + 8,      /* predicate registers (p0..p63) */
     UNW_IA64_CFM,
 
     /* frame info: */
@@ -133,7 +133,7 @@ typedef enum
   }
 ia64_regnum_t;
 
-#define UNW_TDEP_NUM_EH_REGS	4	/* r15-r18 are exception args */
+#define UNW_TDEP_NUM_EH_REGS    4       /* r15-r18 are exception args */
 
 typedef struct unw_tdep_save_loc
   {
@@ -150,7 +150,7 @@ unw_tdep_save_loc_t;
 /* On IA-64, we can directly use ucontext_t as the unwind context.  */
 typedef ucontext_t unw_tdep_context_t;
 
-#define unw_tdep_is_fpreg(r)		((unsigned) ((r) - UNW_IA64_FR) < 128)
+#define unw_tdep_is_fpreg(r)            ((unsigned) ((r) - UNW_IA64_FR) < 128)
 
 #include "libunwind-dynamic.h"
 #include "libunwind-common.h"
@@ -159,9 +159,9 @@ typedef ucontext_t unw_tdep_context_t;
   /* In theory, we could use _Uia64_getcontext() on HP-UX as well, but
      the benefit of doing so would be marginal given that it can't
      support UNW_LOCAL_ONLY.  */
-# define unw_tdep_getcontext		getcontext
+# define unw_tdep_getcontext            getcontext
 #else
-# define unw_tdep_getcontext		UNW_ARCH_OBJ (getcontext)
+# define unw_tdep_getcontext            UNW_ARCH_OBJ (getcontext)
   extern int unw_tdep_getcontext (unw_tdep_context_t *);
 #endif
 
@@ -171,17 +171,17 @@ typedef ucontext_t unw_tdep_context_t;
    with malloc(), and should be free()d during the put_unwind_info()
    callback.  This routine is signal-safe for the local-address-space
    case ONLY.  */
-#define unw_search_ia64_unwind_table	UNW_OBJ(search_unwind_table)
+#define unw_search_ia64_unwind_table    UNW_OBJ(search_unwind_table)
 extern int unw_search_ia64_unwind_table (unw_addr_space_t, unw_word_t,
-					 unw_dyn_info_t *, unw_proc_info_t *,
-					 int, void *);
+                                         unw_dyn_info_t *, unw_proc_info_t *,
+                                         int, void *);
 
 /* This is a helper routine which the get_dyn_info_list_addr()
    callback can use to locate the special dynamic-info list entry in
    an IA-64 unwind table.  If the entry exists in the table, the
    list-address is returned.  In all other cases, 0 is returned.  */
 extern unw_word_t _Uia64_find_dyn_list (unw_addr_space_t, unw_dyn_info_t *,
-					void *);
+                                        void *);
 
 /* This is a helper routine to obtain the kernel-unwind info.  It is
    signal-safe.  */
diff --git a/frysk-imports/libunwind/include/libunwind-mips.h b/frysk-imports/libunwind/include/libunwind-mips.h
index 91f7001..4591d06 100644
--- a/frysk-imports/libunwind/include/libunwind-mips.h
+++ b/frysk-imports/libunwind/include/libunwind-mips.h
@@ -36,10 +36,10 @@ extern "C" {
 # undef mips
 #endif
 
-#define UNW_TARGET	mips
-#define UNW_TARGET_MIPS	1
+#define UNW_TARGET      mips
+#define UNW_TARGET_MIPS 1
 
-#define _U_TDEP_QP_TRUE	0	/* see libunwind-dynamic.h  */
+#define _U_TDEP_QP_TRUE 0       /* see libunwind-dynamic.h  */
 
 /* This needs to be big enough to accommodate "struct cursor", while
    leaving some slack for future expansion.  Changing this value will
@@ -48,7 +48,7 @@ extern "C" {
    want to err on making it rather too big than too small.  */
    
 /* FIXME for MIPS. Too big?  What do other things use for similar tasks?  */
-#define UNW_TDEP_CURSOR_LEN	4096
+#define UNW_TDEP_CURSOR_LEN     4096
 
 /* The size of a "word" varies on MIPS.  This type is used for memory
    addresses and register values.  To allow a single library to support
@@ -95,6 +95,8 @@ typedef enum
     UNW_MIPS_R30,
     UNW_MIPS_R31,
 
+    UNW_MIPS_PC = 34,
+
     /* FIXME: Other registers!  */
 
     /* For MIPS, the CFA is the value of SP (r29) at the call site in the
@@ -117,7 +119,7 @@ typedef enum
   }
 mips_abi_t;
 
-#define UNW_TDEP_NUM_EH_REGS	2	/* FIXME for MIPS.  */
+#define UNW_TDEP_NUM_EH_REGS    2       /* FIXME for MIPS.  */
 
 typedef struct unw_tdep_save_loc
   {
@@ -145,7 +147,7 @@ unw_tdep_proc_info_t;
 #define unw_tdep_getcontext UNW_ARCH_OBJ(getcontext)
 extern int unw_tdep_getcontext (ucontext_t *uc);
 
-#define unw_tdep_is_fpreg		UNW_ARCH_OBJ(is_fpreg)
+#define unw_tdep_is_fpreg               UNW_ARCH_OBJ(is_fpreg)
 extern int unw_tdep_is_fpreg (int);
 
 #if defined(__cplusplus) || defined(c_plusplus)
diff --git a/frysk-imports/libunwind/include/libunwind-ppc32.h b/frysk-imports/libunwind/include/libunwind-ppc32.h
index c45a43a..47ebfde 100644
--- a/frysk-imports/libunwind/include/libunwind-ppc32.h
+++ b/frysk-imports/libunwind/include/libunwind-ppc32.h
@@ -39,10 +39,10 @@ extern "C" {
 #include <inttypes.h>
 #include <ucontext.h>
 
-#define UNW_TARGET		ppc32
-#define UNW_TARGET_PPC32	1
+#define UNW_TARGET              ppc32
+#define UNW_TARGET_PPC32        1
 
-#define _U_TDEP_QP_TRUE	0	/* see libunwind-dynamic.h  */
+#define _U_TDEP_QP_TRUE 0       /* see libunwind-dynamic.h  */
 
 /*
  * This needs to be big enough to accommodate "struct cursor", while
@@ -52,7 +52,7 @@ extern "C" {
  * to err on making it rather too big than too small.
  *
  * To simplify this whole process, we are at least initially taking the
- * tack that ppc32 regs map straight across to the .eh_frame column register
+ * tack that UNW_PPC32_* map straight across to the .eh_frame column register
  * numbers.  These register numbers come from gcc's source in
  * gcc/config/rs6000/rs6000.h
  *
@@ -62,7 +62,7 @@ extern "C" {
  * round that up to 280.
  */
 
-#define UNW_TDEP_CURSOR_LEN 200
+#define UNW_TDEP_CURSOR_LEN 280
 
 #if __WORDSIZE==32
 typedef uint32_t unw_word_t;
@@ -170,7 +170,7 @@ ppc32_regnum_t;
  * passing parameters to exception handlers.
  */
 
-#define UNW_TDEP_NUM_EH_REGS	4
+#define UNW_TDEP_NUM_EH_REGS    4
 
 typedef struct unw_tdep_save_loc
   {
@@ -185,7 +185,7 @@ typedef ucontext_t unw_tdep_context_t;
    using the "getcontext" name just because it's using libunwind.  We
    can't just use __getcontext() either, because that isn't exported
    by glibc...  */
-#define unw_tdep_getcontext(uc)		(getcontext (uc), 0)
+#define unw_tdep_getcontext(uc)         (getcontext (uc), 0)
 
 #include "libunwind-dynamic.h"
 
@@ -197,7 +197,7 @@ unw_tdep_proc_info_t;
 
 #include "libunwind-common.h"
 
-#define unw_tdep_is_fpreg		UNW_ARCH_OBJ(is_fpreg)
+#define unw_tdep_is_fpreg               UNW_ARCH_OBJ(is_fpreg)
 extern int unw_tdep_is_fpreg (int);
 
 #if defined(__cplusplus) || defined(c_plusplus)
diff --git a/frysk-imports/libunwind/include/libunwind-ppc64.h b/frysk-imports/libunwind/include/libunwind-ppc64.h
index 1a5e626..9944628 100644
--- a/frysk-imports/libunwind/include/libunwind-ppc64.h
+++ b/frysk-imports/libunwind/include/libunwind-ppc64.h
@@ -39,10 +39,10 @@ extern "C" {
 #include <inttypes.h>
 #include <ucontext.h>
 
-#define UNW_TARGET		ppc64
-#define UNW_TARGET_PPC64	1
+#define UNW_TARGET              ppc64
+#define UNW_TARGET_PPC64        1
 
-#define _U_TDEP_QP_TRUE	0	/* see libunwind-dynamic.h  */
+#define _U_TDEP_QP_TRUE 0       /* see libunwind-dynamic.h  */
 
 /*
  * This needs to be big enough to accommodate "struct cursor", while
@@ -52,7 +52,7 @@ extern "C" {
  * to err on making it rather too big than too small.
  *
  * To simplify this whole process, we are at least initially taking the
- * tack that ppc64 regs map straight across to the .eh_frame column register
+ * tack that UNW_PPC64_* map straight across to the .eh_frame column register
  * numbers.  These register numbers come from gcc's source in
  * gcc/config/rs6000/rs6000.h
  *
@@ -222,12 +222,19 @@ typedef enum
   }
 ppc64_regnum_t;
 
+typedef enum
+  {
+    UNW_PPC64_ABI_ELFv1,
+    UNW_PPC64_ABI_ELFv2
+  }
+ppc64_abi_t;
+
 /*
  * According to David Edelsohn, GNU gcc uses R3, R4, R5, and maybe R6 for
  * passing parameters to exception handlers.
  */
 
-#define UNW_TDEP_NUM_EH_REGS	4
+#define UNW_TDEP_NUM_EH_REGS    4
 
 typedef struct unw_tdep_save_loc
   {
@@ -242,7 +249,7 @@ typedef ucontext_t unw_tdep_context_t;
    using the "getcontext" name just because it's using libunwind.  We
    can't just use __getcontext() either, because that isn't exported
    by glibc...  */
-#define unw_tdep_getcontext(uc)		(getcontext (uc), 0)
+#define unw_tdep_getcontext(uc)         (getcontext (uc), 0)
 
 #include "libunwind-dynamic.h"
 
@@ -254,7 +261,7 @@ unw_tdep_proc_info_t;
 
 #include "libunwind-common.h"
 
-#define unw_tdep_is_fpreg		UNW_ARCH_OBJ(is_fpreg)
+#define unw_tdep_is_fpreg               UNW_ARCH_OBJ(is_fpreg)
 extern int unw_tdep_is_fpreg (int);
 
 #if defined(__cplusplus) || defined(c_plusplus)
diff --git a/frysk-imports/libunwind/include/libunwind-ptrace.h b/frysk-imports/libunwind/include/libunwind-ptrace.h
index 7fca205..801325c 100644
--- a/frysk-imports/libunwind/include/libunwind-ptrace.h
+++ b/frysk-imports/libunwind/include/libunwind-ptrace.h
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -40,18 +40,18 @@ extern "C" {
 extern void *_UPT_create (pid_t);
 extern void _UPT_destroy (void *);
 extern int _UPT_find_proc_info (unw_addr_space_t, unw_word_t,
-				unw_proc_info_t *, int, void *);
+                                unw_proc_info_t *, int, void *);
 extern void _UPT_put_unwind_info (unw_addr_space_t, unw_proc_info_t *, void *);
 extern int _UPT_get_dyn_info_list_addr (unw_addr_space_t, unw_word_t *,
-					void *);
+                                        void *);
 extern int _UPT_access_mem (unw_addr_space_t, unw_word_t, unw_word_t *, int,
-			    void *);
+                            void *);
 extern int _UPT_access_reg (unw_addr_space_t, unw_regnum_t, unw_word_t *,
-			    int, void *);
+                            int, void *);
 extern int _UPT_access_fpreg (unw_addr_space_t, unw_regnum_t, unw_fpreg_t *,
-			      int, void *);
+                              int, void *);
 extern int _UPT_get_proc_name (unw_addr_space_t, unw_word_t, char *, size_t,
-			       unw_word_t *, void *);
+                               unw_word_t *, void *);
 extern int _UPT_resume (unw_addr_space_t, unw_cursor_t *, void *);
 extern unw_accessors_t _UPT_accessors;
 
diff --git a/frysk-imports/libunwind/include/libunwind-sh.h b/frysk-imports/libunwind/include/libunwind-sh.h
new file mode 100644
index 0000000..927f61f
--- /dev/null
+++ b/frysk-imports/libunwind/include/libunwind-sh.h
@@ -0,0 +1,114 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+   Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com>
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#ifndef LIBUNWIND_H
+#define LIBUNWIND_H
+
+#if defined(__cplusplus) || defined(c_plusplus)
+extern "C" {
+#endif
+
+#include <inttypes.h>
+#include <stddef.h>
+#include <ucontext.h>
+
+#define UNW_TARGET      sh
+#define UNW_TARGET_SH   1
+
+#define _U_TDEP_QP_TRUE 0       /* see libunwind-dynamic.h  */
+
+/* This needs to be big enough to accommodate "struct cursor", while
+   leaving some slack for future expansion.  Changing this value will
+   require recompiling all users of this library.  Stack allocation is
+   relatively cheap and unwind-state copying is relatively rare, so we
+   want to err on making it rather too big than too small.  */
+
+#define UNW_TDEP_CURSOR_LEN     4096
+
+typedef uint32_t unw_word_t;
+typedef int32_t unw_sword_t;
+
+typedef long double unw_tdep_fpreg_t;
+
+typedef enum
+  {
+    UNW_SH_R0,
+    UNW_SH_R1,
+    UNW_SH_R2,
+    UNW_SH_R3,
+    UNW_SH_R4,
+    UNW_SH_R5,
+    UNW_SH_R6,
+    UNW_SH_R7,
+    UNW_SH_R8,
+    UNW_SH_R9,
+    UNW_SH_R10,
+    UNW_SH_R11,
+    UNW_SH_R12,
+    UNW_SH_R13,
+    UNW_SH_R14,
+    UNW_SH_R15,
+
+    UNW_SH_PC,
+    UNW_SH_PR,
+
+    UNW_TDEP_LAST_REG = UNW_SH_PR,
+
+    UNW_TDEP_IP = UNW_SH_PR,
+    UNW_TDEP_SP = UNW_SH_R15,
+    UNW_TDEP_EH = UNW_SH_R0
+  }
+sh_regnum_t;
+
+#define UNW_TDEP_NUM_EH_REGS    2
+
+typedef ucontext_t unw_tdep_context_t;
+
+#define unw_tdep_getcontext(uc)         (getcontext (uc), 0)
+
+typedef struct unw_tdep_save_loc
+  {
+    /* Additional target-dependent info on a save location.  */
+  }
+unw_tdep_save_loc_t;
+
+#include "libunwind-dynamic.h"
+
+typedef struct
+  {
+    /* no sh-specific auxiliary proc-info */
+  }
+unw_tdep_proc_info_t;
+
+#include "libunwind-common.h"
+
+#define unw_tdep_is_fpreg               UNW_ARCH_OBJ(is_fpreg)
+extern int unw_tdep_is_fpreg (int);
+
+#if defined(__cplusplus) || defined(c_plusplus)
+}
+#endif
+
+#endif /* LIBUNWIND_H */
diff --git a/frysk-imports/libunwind/include/libunwind-tilegx.h b/frysk-imports/libunwind/include/libunwind-tilegx.h
new file mode 100644
index 0000000..0f84ea6
--- /dev/null
+++ b/frysk-imports/libunwind/include/libunwind-tilegx.h
@@ -0,0 +1,161 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+   Copyright (C) 2014 Tilera Corp.
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#ifndef LIBUNWIND_H
+#define LIBUNWIND_H
+
+#if defined(__cplusplus) || defined(c_plusplus)
+extern "C" {
+#endif
+
+#include <inttypes.h>
+#include <ucontext.h>
+
+#define UNW_TARGET           tilegx
+#define UNW_TARGET_TILEGX    1
+
+#define _U_TDEP_QP_TRUE        0    /* see libunwind-dynamic.h  */
+
+/* This needs to be big enough to accommodate "struct cursor", while
+   leaving some slack for future expansion.  Changing this value will
+   require recompiling all users of this library.  Stack allocation is
+   relatively cheap and unwind-state copying is relatively rare, so we
+   want to err on making it rather too big than too small.  */
+
+#define UNW_TDEP_CURSOR_LEN   4096
+
+/* The size of a "word" varies on TILEGX.  This type is used for memory
+   addresses and register values. */
+typedef uint64_t unw_word_t;
+typedef int64_t unw_sword_t;
+
+typedef long double unw_tdep_fpreg_t;
+
+typedef enum
+{
+  UNW_TILEGX_R0,
+  UNW_TILEGX_R1,
+  UNW_TILEGX_R2,
+  UNW_TILEGX_R3,
+  UNW_TILEGX_R4,
+  UNW_TILEGX_R5,
+  UNW_TILEGX_R6,
+  UNW_TILEGX_R7,
+  UNW_TILEGX_R8,
+  UNW_TILEGX_R9,
+  UNW_TILEGX_R10,
+  UNW_TILEGX_R11,
+  UNW_TILEGX_R12,
+  UNW_TILEGX_R13,
+  UNW_TILEGX_R14,
+  UNW_TILEGX_R15,
+  UNW_TILEGX_R16,
+  UNW_TILEGX_R17,
+  UNW_TILEGX_R18,
+  UNW_TILEGX_R19,
+  UNW_TILEGX_R20,
+  UNW_TILEGX_R21,
+  UNW_TILEGX_R22,
+  UNW_TILEGX_R23,
+  UNW_TILEGX_R24,
+  UNW_TILEGX_R25,
+  UNW_TILEGX_R26,
+  UNW_TILEGX_R27,
+  UNW_TILEGX_R28,
+  UNW_TILEGX_R29,
+  UNW_TILEGX_R30,
+  UNW_TILEGX_R31,
+  UNW_TILEGX_R32,
+  UNW_TILEGX_R33,
+  UNW_TILEGX_R34,
+  UNW_TILEGX_R35,
+  UNW_TILEGX_R36,
+  UNW_TILEGX_R37,
+  UNW_TILEGX_R38,
+  UNW_TILEGX_R39,
+  UNW_TILEGX_R40,
+  UNW_TILEGX_R41,
+  UNW_TILEGX_R42,
+  UNW_TILEGX_R43,
+  UNW_TILEGX_R44,
+  UNW_TILEGX_R45,
+  UNW_TILEGX_R46,
+  UNW_TILEGX_R47,
+  UNW_TILEGX_R48,
+  UNW_TILEGX_R49,
+  UNW_TILEGX_R50,
+  UNW_TILEGX_R51,
+  UNW_TILEGX_R52,
+  UNW_TILEGX_R53,
+  UNW_TILEGX_R54,
+  UNW_TILEGX_R55,
+
+  /* FIXME: Other registers!  */
+
+  UNW_TILEGX_PC,
+  /* For TILEGX, the CFA is the value of SP (r54) at the call site in the
+     previous frame.  */
+  UNW_TILEGX_CFA,
+
+  UNW_TDEP_LAST_REG = UNW_TILEGX_PC,
+
+  UNW_TDEP_IP = UNW_TILEGX_R55,  /* R55 is link register for Tilegx */
+  UNW_TDEP_SP = UNW_TILEGX_R54,
+  UNW_TDEP_EH = UNW_TILEGX_R0   /* FIXME.  */
+} tilegx_regnum_t;
+
+typedef enum
+{
+  UNW_TILEGX_ABI_N64 = 2
+} tilegx_abi_t;
+
+#define UNW_TDEP_NUM_EH_REGS    2   /* FIXME for TILEGX.  */
+
+typedef struct unw_tdep_save_loc
+{
+  /* Additional target-dependent info on a save location.  */
+} unw_tdep_save_loc_t;
+
+typedef ucontext_t unw_tdep_context_t;
+
+#include "libunwind-dynamic.h"
+
+typedef struct
+{
+    /* no tilegx-specific auxiliary proc-info */
+} unw_tdep_proc_info_t;
+
+#include "libunwind-common.h"
+
+#define unw_tdep_getcontext  getcontext
+
+#define unw_tdep_is_fpreg    UNW_ARCH_OBJ(is_fpreg)
+extern int unw_tdep_is_fpreg (int);
+
+#if defined(__cplusplus) || defined(c_plusplus)
+}
+#endif
+
+#endif /* LIBUNWIND_H */
diff --git a/frysk-imports/libunwind/include/libunwind-x86.h b/frysk-imports/libunwind/include/libunwind-x86.h
index 1e321db..40fe046 100644
--- a/frysk-imports/libunwind/include/libunwind-x86.h
+++ b/frysk-imports/libunwind/include/libunwind-x86.h
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2002-2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -30,20 +30,21 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 extern "C" {
 #endif
 
+#include <sys/types.h>
 #include <inttypes.h>
 #include <ucontext.h>
 
-#define UNW_TARGET	x86
-#define UNW_TARGET_X86	1
+#define UNW_TARGET      x86
+#define UNW_TARGET_X86  1
 
-#define _U_TDEP_QP_TRUE	0	/* see libunwind-dynamic.h  */
+#define _U_TDEP_QP_TRUE 0       /* see libunwind-dynamic.h  */
 
 /* This needs to be big enough to accommodate "struct cursor", while
    leaving some slack for future expansion.  Changing this value will
    require recompiling all users of this library.  Stack allocation is
    relatively cheap and unwind-state copying is relatively rare, so we
    want to err on making it rather too big than too small.  */
-#define UNW_TDEP_CURSOR_LEN	127
+#define UNW_TDEP_CURSOR_LEN     127
 
 typedef uint32_t unw_word_t;
 typedef int32_t unw_sword_t;
@@ -71,88 +72,88 @@ typedef enum
        DWARF, but that doesn't work because the libunwind requires
        that the exception argument registers be consecutive, which the
        wouldn't be with the DWARF numbering.  */
-    UNW_X86_EAX,	/* scratch (exception argument 1) */
-    UNW_X86_EDX,	/* scratch (exception argument 2) */
-    UNW_X86_ECX,	/* scratch */
-    UNW_X86_EBX,	/* preserved */
-    UNW_X86_ESI,	/* preserved */
-    UNW_X86_EDI,	/* preserved */
-    UNW_X86_EBP,	/* (optional) frame-register */
-    UNW_X86_ESP,	/* (optional) frame-register */
-    UNW_X86_EIP,	/* frame-register */
-    UNW_X86_EFLAGS,	/* scratch (except for "direction", which is fixed */
-    UNW_X86_TRAPNO,	/* scratch */
+    UNW_X86_EAX,        /* scratch (exception argument 1) */
+    UNW_X86_EDX,        /* scratch (exception argument 2) */
+    UNW_X86_ECX,        /* scratch */
+    UNW_X86_EBX,        /* preserved */
+    UNW_X86_ESI,        /* preserved */
+    UNW_X86_EDI,        /* preserved */
+    UNW_X86_EBP,        /* (optional) frame-register */
+    UNW_X86_ESP,        /* (optional) frame-register */
+    UNW_X86_EIP,        /* frame-register */
+    UNW_X86_EFLAGS,     /* scratch (except for "direction", which is fixed */
+    UNW_X86_TRAPNO,     /* scratch */
 
     /* MMX/stacked-fp registers */
-    UNW_X86_ST0,	/* fp return value */
-    UNW_X86_ST1,	/* scratch */
-    UNW_X86_ST2,	/* scratch */
-    UNW_X86_ST3,	/* scratch */
-    UNW_X86_ST4,	/* scratch */
-    UNW_X86_ST5,	/* scratch */
-    UNW_X86_ST6,	/* scratch */
-    UNW_X86_ST7,	/* scratch */
-
-    UNW_X86_FCW,	/* scratch */
-    UNW_X86_FSW,	/* scratch */
-    UNW_X86_FTW,	/* scratch */
-    UNW_X86_FOP,	/* scratch */
-    UNW_X86_FCS,	/* scratch */
-    UNW_X86_FIP,	/* scratch */
-    UNW_X86_FEA,	/* scratch */
-    UNW_X86_FDS,	/* scratch */
+    UNW_X86_ST0,        /* fp return value */
+    UNW_X86_ST1,        /* scratch */
+    UNW_X86_ST2,        /* scratch */
+    UNW_X86_ST3,        /* scratch */
+    UNW_X86_ST4,        /* scratch */
+    UNW_X86_ST5,        /* scratch */
+    UNW_X86_ST6,        /* scratch */
+    UNW_X86_ST7,        /* scratch */
+
+    UNW_X86_FCW,        /* scratch */
+    UNW_X86_FSW,        /* scratch */
+    UNW_X86_FTW,        /* scratch */
+    UNW_X86_FOP,        /* scratch */
+    UNW_X86_FCS,        /* scratch */
+    UNW_X86_FIP,        /* scratch */
+    UNW_X86_FEA,        /* scratch */
+    UNW_X86_FDS,        /* scratch */
 
     /* SSE registers */
-    UNW_X86_XMM0_lo,	/* scratch */
-    UNW_X86_XMM0_hi,	/* scratch */
-    UNW_X86_XMM1_lo,	/* scratch */
-    UNW_X86_XMM1_hi,	/* scratch */
-    UNW_X86_XMM2_lo,	/* scratch */
-    UNW_X86_XMM2_hi,	/* scratch */
-    UNW_X86_XMM3_lo,	/* scratch */
-    UNW_X86_XMM3_hi,	/* scratch */
-    UNW_X86_XMM4_lo,	/* scratch */
-    UNW_X86_XMM4_hi,	/* scratch */
-    UNW_X86_XMM5_lo,	/* scratch */
-    UNW_X86_XMM5_hi,	/* scratch */
-    UNW_X86_XMM6_lo,	/* scratch */
-    UNW_X86_XMM6_hi,	/* scratch */
-    UNW_X86_XMM7_lo,	/* scratch */
-    UNW_X86_XMM7_hi,	/* scratch */
-
-    UNW_X86_MXCSR,	/* scratch */
+    UNW_X86_XMM0_lo,    /* scratch */
+    UNW_X86_XMM0_hi,    /* scratch */
+    UNW_X86_XMM1_lo,    /* scratch */
+    UNW_X86_XMM1_hi,    /* scratch */
+    UNW_X86_XMM2_lo,    /* scratch */
+    UNW_X86_XMM2_hi,    /* scratch */
+    UNW_X86_XMM3_lo,    /* scratch */
+    UNW_X86_XMM3_hi,    /* scratch */
+    UNW_X86_XMM4_lo,    /* scratch */
+    UNW_X86_XMM4_hi,    /* scratch */
+    UNW_X86_XMM5_lo,    /* scratch */
+    UNW_X86_XMM5_hi,    /* scratch */
+    UNW_X86_XMM6_lo,    /* scratch */
+    UNW_X86_XMM6_hi,    /* scratch */
+    UNW_X86_XMM7_lo,    /* scratch */
+    UNW_X86_XMM7_hi,    /* scratch */
+
+    UNW_X86_MXCSR,      /* scratch */
 
     /* segment registers */
-    UNW_X86_GS,		/* special */
-    UNW_X86_FS,		/* special */
-    UNW_X86_ES,		/* special */
-    UNW_X86_DS,		/* special */
-    UNW_X86_SS,		/* special */
-    UNW_X86_CS,		/* special */
-    UNW_X86_TSS,	/* special */
-    UNW_X86_LDT,	/* special */
+    UNW_X86_GS,         /* special */
+    UNW_X86_FS,         /* special */
+    UNW_X86_ES,         /* special */
+    UNW_X86_DS,         /* special */
+    UNW_X86_SS,         /* special */
+    UNW_X86_CS,         /* special */
+    UNW_X86_TSS,        /* special */
+    UNW_X86_LDT,        /* special */
 
     /* frame info (read-only) */
     UNW_X86_CFA,
 
-    UNW_X86_XMM0,	/* scratch */
-    UNW_X86_XMM1,	/* scratch */
-    UNW_X86_XMM2,	/* scratch */
-    UNW_X86_XMM3,	/* scratch */
-    UNW_X86_XMM4,	/* scratch */
-    UNW_X86_XMM5,	/* scratch */
-    UNW_X86_XMM6,	/* scratch */
-    UNW_X86_XMM7,	/* scratch */
+    UNW_X86_XMM0,       /* scratch */
+    UNW_X86_XMM1,       /* scratch */
+    UNW_X86_XMM2,       /* scratch */
+    UNW_X86_XMM3,       /* scratch */
+    UNW_X86_XMM4,       /* scratch */
+    UNW_X86_XMM5,       /* scratch */
+    UNW_X86_XMM6,       /* scratch */
+    UNW_X86_XMM7,       /* scratch */
 
     UNW_TDEP_LAST_REG = UNW_X86_XMM7,
 
     UNW_TDEP_IP = UNW_X86_EIP,
-    UNW_TDEP_SP = UNW_X86_CFA,
+    UNW_TDEP_SP = UNW_X86_ESP,
     UNW_TDEP_EH = UNW_X86_EAX
   }
 x86_regnum_t;
 
-#define UNW_TDEP_NUM_EH_REGS	2	/* eax and edx are exception args */
+#define UNW_TDEP_NUM_EH_REGS    2       /* eax and edx are exception args */
 
 typedef struct unw_tdep_save_loc
   {
@@ -163,12 +164,6 @@ unw_tdep_save_loc_t;
 /* On x86, we can directly use ucontext_t as the unwind context.  */
 typedef ucontext_t unw_tdep_context_t;
 
-/* XXX this is not ideal: an application should not be prevented from
-   using the "getcontext" name just because it's using libunwind.  We
-   can't just use __getcontext() either, because that isn't exported
-   by glibc...  */
-#define unw_tdep_getcontext(uc)		(getcontext (uc), 0)
-
 #include "libunwind-dynamic.h"
 
 typedef struct
@@ -179,7 +174,10 @@ unw_tdep_proc_info_t;
 
 #include "libunwind-common.h"
 
-#define unw_tdep_is_fpreg		UNW_ARCH_OBJ(is_fpreg)
+#define unw_tdep_getcontext             UNW_ARCH_OBJ(getcontext)
+extern int unw_tdep_getcontext (unw_tdep_context_t *);
+
+#define unw_tdep_is_fpreg               UNW_ARCH_OBJ(is_fpreg)
 extern int unw_tdep_is_fpreg (int);
 
 #if defined(__cplusplus) || defined(c_plusplus)
diff --git a/frysk-imports/libunwind/include/libunwind-x86_64.h b/frysk-imports/libunwind/include/libunwind-x86_64.h
index a87b57e..78eb541 100644
--- a/frysk-imports/libunwind/include/libunwind-x86_64.h
+++ b/frysk-imports/libunwind/include/libunwind-x86_64.h
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2002-2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
    Modified for x86_64 by Max Asbock <masbock@us.ibm.com>
 
@@ -32,20 +32,21 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 extern "C" {
 #endif
 
+#include <sys/types.h>
 #include <inttypes.h>
 #include <ucontext.h>
 
-#define UNW_TARGET		x86_64
-#define UNW_TARGET_X86_64	1
+#define UNW_TARGET              x86_64
+#define UNW_TARGET_X86_64       1
 
-#define _U_TDEP_QP_TRUE	0	/* see libunwind-dynamic.h  */
+#define _U_TDEP_QP_TRUE 0       /* see libunwind-dynamic.h  */
 
 /* This needs to be big enough to accommodate "struct cursor", while
    leaving some slack for future expansion.  Changing this value will
    require recompiling all users of this library.  Stack allocation is
    relatively cheap and unwind-state copying is relatively rare, so we
    want to err on making it rather too big than too small.  */
-#define UNW_TDEP_CURSOR_LEN	127
+#define UNW_TDEP_CURSOR_LEN     127
 
 typedef uint64_t unw_word_t;
 typedef int64_t unw_sword_t;
@@ -71,14 +72,33 @@ typedef enum
     UNW_X86_64_R14,
     UNW_X86_64_R15,
     UNW_X86_64_RIP,
+#ifdef CONFIG_MSABI_SUPPORT
+    UNW_X86_64_XMM0,
+    UNW_X86_64_XMM1,
+    UNW_X86_64_XMM2,
+    UNW_X86_64_XMM3,
+    UNW_X86_64_XMM4,
+    UNW_X86_64_XMM5,
+    UNW_X86_64_XMM6,
+    UNW_X86_64_XMM7,
+    UNW_X86_64_XMM8,
+    UNW_X86_64_XMM9,
+    UNW_X86_64_XMM10,
+    UNW_X86_64_XMM11,
+    UNW_X86_64_XMM12,
+    UNW_X86_64_XMM13,
+    UNW_X86_64_XMM14,
+    UNW_X86_64_XMM15,
+    UNW_TDEP_LAST_REG = UNW_X86_64_XMM15,
+#else
+    UNW_TDEP_LAST_REG = UNW_X86_64_RIP,
+#endif
 
     /* XXX Add other regs here */
 
     /* frame info (read-only) */
     UNW_X86_64_CFA,
 
-    UNW_TDEP_LAST_REG = UNW_X86_64_RIP,
-
     UNW_TDEP_IP = UNW_X86_64_RIP,
     UNW_TDEP_SP = UNW_X86_64_RSP,
     UNW_TDEP_BP = UNW_X86_64_RBP,
@@ -86,34 +106,32 @@ typedef enum
   }
 x86_64_regnum_t;
 
-#define UNW_TDEP_NUM_EH_REGS	2	/* XXX Not sure what this means */
+#define UNW_TDEP_NUM_EH_REGS    2       /* XXX Not sure what this means */
 
 typedef struct unw_tdep_save_loc
   {
     /* Additional target-dependent info on a save location.  */
+    char unused;
   }
 unw_tdep_save_loc_t;
 
 /* On x86_64, we can directly use ucontext_t as the unwind context.  */
 typedef ucontext_t unw_tdep_context_t;
 
-/* XXX this is not ideal: an application should not be prevented from
-   using the "getcontext" name just because it's using libunwind.  We
-   can't just use __getcontext() either, because that isn't exported
-   by glibc...  */
-#define unw_tdep_getcontext(uc)		(getcontext (uc), 0)
-
-#include "libunwind-dynamic.h"
-
 typedef struct
   {
     /* no x86-64-specific auxiliary proc-info */
+    char unused;
   }
 unw_tdep_proc_info_t;
 
+#include "libunwind-dynamic.h"
 #include "libunwind-common.h"
 
-#define unw_tdep_is_fpreg		UNW_ARCH_OBJ(is_fpreg)
+#define unw_tdep_getcontext             UNW_ARCH_OBJ(getcontext)
+#define unw_tdep_is_fpreg               UNW_ARCH_OBJ(is_fpreg)
+
+extern int unw_tdep_getcontext (unw_tdep_context_t *);
 extern int unw_tdep_is_fpreg (int);
 
 #if defined(__cplusplus) || defined(c_plusplus)
diff --git a/frysk-imports/libunwind/include/libunwind.h.in b/frysk-imports/libunwind/include/libunwind.h.in
new file mode 100644
index 0000000..7a56168
--- /dev/null
+++ b/frysk-imports/libunwind/include/libunwind.h.in
@@ -0,0 +1,36 @@
+/* Provide a real file - not a symlink - as it would cause multiarch conflicts
+   when multiple different arch releases are installed simultaneously.  */
+
+#ifndef UNW_REMOTE_ONLY
+
+#if defined __aarch64__
+#include "libunwind-aarch64.h"
+#elif defined __arm__
+# include "libunwind-arm.h"
+#elif defined __hppa__
+# include "libunwind-hppa.h"
+#elif defined __ia64__
+# include "libunwind-ia64.h"
+#elif defined __mips__
+# include "libunwind-mips.h"
+#elif defined __powerpc__ && !defined __powerpc64__
+# include "libunwind-ppc32.h"
+#elif defined __powerpc64__
+# include "libunwind-ppc64.h"
+#elif defined __sh__
+# include "libunwind-sh.h"
+#elif defined __i386__
+# include "libunwind-x86.h"
+#elif defined __x86_64__
+# include "libunwind-x86_64.h"
+#elif defined __tilegx__
+# include "libunwind-tilegx.h"
+#else
+# error "Unsupported arch"
+#endif
+
+#else /* UNW_REMOTE_ONLY */
+
+# include "libunwind-@arch@.h"
+
+#endif /* UNW_REMOTE_ONLY */
diff --git a/frysk-imports/libunwind/include/libunwind_i.h b/frysk-imports/libunwind/include/libunwind_i.h
index 17b3cf8..ee2ea2f 100644
--- a/frysk-imports/libunwind/include/libunwind_i.h
+++ b/frysk-imports/libunwind/include/libunwind_i.h
@@ -1,7 +1,7 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2001-2005 Hewlett-Packard Co
    Copyright (C) 2007 David Mosberger-Tang
-	Contributed by David Mosberger-Tang <dmosberger@gmail.com>
+        Contributed by David Mosberger-Tang <dmosberger@gmail.com>
 
 This file is part of libunwind.
 
@@ -35,6 +35,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 # include "config.h"
 #endif
 
+#include "compiler.h"
+
 #ifdef HAVE___THREAD
   /* For now, turn off per-thread caching.  It uses up too much TLS
      memory per thread even when the thread never uses libunwind at
@@ -44,7 +46,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 /* Platform-independent libunwind-internal declarations.  */
 
-#include <sys/types.h>	/* HP-UX needs this before include of pthread.h */
+#include <sys/types.h>  /* HP-UX needs this before include of pthread.h */
 
 #include <assert.h>
 #include <libunwind.h>
@@ -53,58 +55,50 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <sys/mman.h>
 
-#ifdef HAVE_ENDIAN_H
+#if defined(HAVE_ELF_H)
+# include <elf.h>
+#elif defined(HAVE_SYS_ELF_H)
+# include <sys/elf.h>
+#else
+# error Could not locate <elf.h>
+#endif
+
+#if defined(HAVE_ENDIAN_H)
 # include <endian.h>
+#elif defined(HAVE_SYS_ENDIAN_H)
+# include <sys/endian.h>
 #else
-# define __LITTLE_ENDIAN	1234
-# define __BIG_ENDIAN		4321
+# define __LITTLE_ENDIAN        1234
+# define __BIG_ENDIAN           4321
 # if defined(__hpux)
 #   define __BYTE_ORDER __BIG_ENDIAN
+# elif defined(__QNX__)
+#   if defined(__BIGENDIAN__)
+#     define __BYTE_ORDER __BIG_ENDIAN
+#   elif defined(__LITTLEENDIAN__)
+#     define __BYTE_ORDER __LITTLE_ENDIAN
+#   else
+#     error Host has unknown byte-order.
+#   endif
 # else
 #   error Host has unknown byte-order.
 # endif
 #endif
 
-#ifdef __GNUC__
-# define UNUSED		__attribute__((unused))
-# define NORETURN	__attribute__((noreturn))
-# define ALIAS(name)	__attribute__((alias (#name)))
-# if (__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR__ > 2)
-#  define ALWAYS_INLINE	inline __attribute__((always_inline))
-#  define HIDDEN	__attribute__((visibility ("hidden")))
-#  define PROTECTED	__attribute__((visibility ("protected")))
-# else
-#  define ALWAYS_INLINE
-#  define HIDDEN
-#  define PROTECTED
-# endif
-# if (__GNUC__ >= 3)
-#  define likely(x)	__builtin_expect ((x), 1)
-#  define unlikely(x)	__builtin_expect ((x), 0)
-# else
-#  define likely(x)	(x)
-#  define unlikely(x)	(x)
-# endif
+#if defined(HAVE__BUILTIN_UNREACHABLE)
+# define unreachable() __builtin_unreachable()
 #else
-# define ALWAYS_INLINE
-# define UNUSED
-# define NORETURN
-# define ALIAS(name)
-# define HIDDEN
-# define PROTECTED
-# define likely(x)	(x)
-# define unlikely(x)	(x)
+# define unreachable() do { } while (1)
 #endif
 
 #ifdef DEBUG
-# define UNW_DEBUG	1
+# define UNW_DEBUG      1
 #else
-# define UNW_DEBUG	0
+# define UNW_DEBUG      0
 #endif
 
-#define ARRAY_SIZE(a)	(sizeof (a) / sizeof ((a)[0]))
-
 /* Make it easy to write thread-safe code which may or may not be
    linked against libpthread.  The macros below can be used
    unconditionally and if -lpthread is around, they'll call the
@@ -114,12 +108,12 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #pragma weak pthread_mutex_lock
 #pragma weak pthread_mutex_unlock
 
-#define mutex_init(l)							\
-	(pthread_mutex_init != 0 ? pthread_mutex_init ((l), 0) : 0)
-#define mutex_lock(l)							\
-	(pthread_mutex_lock != 0 ? pthread_mutex_lock (l) : 0)
-#define mutex_unlock(l)							\
-	(pthread_mutex_unlock != 0 ? pthread_mutex_unlock (l) : 0)
+#define mutex_init(l)                                                   \
+        (pthread_mutex_init != NULL ? pthread_mutex_init ((l), NULL) : 0)
+#define mutex_lock(l)                                                   \
+        (pthread_mutex_lock != NULL ? pthread_mutex_lock (l) : 0)
+#define mutex_unlock(l)                                                 \
+        (pthread_mutex_unlock != NULL ? pthread_mutex_unlock (l) : 0)
 
 #ifdef HAVE_ATOMIC_OPS_H
 # include <atomic_ops.h>
@@ -136,15 +130,17 @@ cmpxchg_ptr (void *addr, void *old, void *new)
   u.vp = addr;
   return AO_compare_and_swap(u.aop, (AO_t) old, (AO_t) new);
 }
-# define fetch_and_add1(_ptr)		AO_fetch_and_add1(_ptr)
+# define fetch_and_add1(_ptr)           AO_fetch_and_add1(_ptr)
+# define fetch_and_add(_ptr, value)     AO_fetch_and_add(_ptr, value)
    /* GCC 3.2.0 on HP-UX crashes on cmpxchg_ptr() */
 #  if !(defined(__hpux) && __GNUC__ == 3 && __GNUC_MINOR__ == 2)
 #   define HAVE_CMPXCHG
 #  endif
-# define HAVE_FETCH_AND_ADD1
-#else
+# define HAVE_FETCH_AND_ADD
+#elif defined(HAVE_SYNC_ATOMICS) || defined(HAVE_IA64INTRIN_H)
 # ifdef HAVE_IA64INTRIN_H
 #  include <ia64intrin.h>
+# endif
 static inline int
 cmpxchg_ptr (void *addr, void *old, void *new)
 {
@@ -158,14 +154,14 @@ cmpxchg_ptr (void *addr, void *old, void *new)
   u.vp = addr;
   return __sync_bool_compare_and_swap(u.vlp, (long) old, (long) new);
 }
-#  define fetch_and_add1(_ptr)		__sync_fetch_and_add(_ptr, 1)
-#  define HAVE_CMPXCHG
-#  define HAVE_FETCH_AND_ADD1
-# endif
+# define fetch_and_add1(_ptr)           __sync_fetch_and_add(_ptr, 1)
+# define fetch_and_add(_ptr, value)     __sync_fetch_and_add(_ptr, value)
+# define HAVE_CMPXCHG
+# define HAVE_FETCH_AND_ADD
 #endif
-#define atomic_read(ptr)	(*(ptr))
+#define atomic_read(ptr)        (*(ptr))
 
-#define UNWI_OBJ(fn)	  UNW_PASTE(UNW_PREFIX,UNW_PASTE(I,fn))
+#define UNWI_OBJ(fn)      UNW_PASTE(UNW_PREFIX,UNW_PASTE(I,fn))
 #define UNWI_ARCH_OBJ(fn) UNW_PASTE(UNW_PASTE(UNW_PASTE(_UI,UNW_TARGET),_), fn)
 
 #define unwi_full_mask    UNWI_ARCH_OBJ(full_mask)
@@ -178,116 +174,184 @@ typedef sigset_t intrmask_t;
 
 extern intrmask_t unwi_full_mask;
 
+/* Silence compiler warnings about variables which are used only if libunwind
+   is configured in a certain way */
+static inline void mark_as_used(void *v UNUSED) {
+}
+
+#if defined(CONFIG_BLOCK_SIGNALS)
+# define SIGPROCMASK(how, new_mask, old_mask) \
+  sigprocmask((how), (new_mask), (old_mask))
+#else
+# define SIGPROCMASK(how, new_mask, old_mask) mark_as_used(old_mask)
+#endif
+
+/* Prefer adaptive mutexes if available */
+#ifdef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP
+#define UNW_PTHREAD_MUTEX_INITIALIZER PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP
+#else
+#define UNW_PTHREAD_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
+#endif
+
 #define define_lock(name) \
-  pthread_mutex_t name = PTHREAD_MUTEX_INITIALIZER
-#define lock_init(l)		mutex_init (l)
-#define lock_acquire(l,m)				\
-do {							\
-  sigprocmask (SIG_SETMASK, &unwi_full_mask, &(m));	\
-  mutex_lock (l);					\
+  pthread_mutex_t name = UNW_PTHREAD_MUTEX_INITIALIZER
+#define lock_init(l)            mutex_init (l)
+#define lock_acquire(l,m)                               \
+do {                                                    \
+  SIGPROCMASK (SIG_SETMASK, &unwi_full_mask, &(m));     \
+  mutex_lock (l);                                       \
 } while (0)
-#define lock_release(l,m)			\
-do {						\
-  mutex_unlock (l);				\
-  sigprocmask (SIG_SETMASK, &(m), NULL);	\
+#define lock_release(l,m)                       \
+do {                                            \
+  mutex_unlock (l);                             \
+  SIGPROCMASK (SIG_SETMASK, &(m), NULL);        \
 } while (0)
 
-#define SOS_MEMORY_SIZE 16384	/* see src/mi/mempool.c */
+#define SOS_MEMORY_SIZE 16384   /* see src/mi/mempool.c */
 
-#define GET_MEMORY(mem, size_in_bytes)				    \
-do {									    \
+#ifndef MAP_ANONYMOUS
+# define MAP_ANONYMOUS MAP_ANON
+#endif
+#define GET_MEMORY(mem, size)                                               \
+do {                                                                        \
   /* Hopefully, mmap() goes straight through to a system call stub...  */   \
-  mem = mmap (0, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, \
-	      -1, 0);							    \
-  if (mem == MAP_FAILED)						    \
-    mem = NULL;								    \
+  mem = mmap (NULL, size, PROT_READ | PROT_WRITE,                           \
+              MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);                          \
+  if (mem == MAP_FAILED)                                                    \
+    mem = NULL;                                                             \
 } while (0)
 
-#define unwi_find_dynamic_proc_info	UNWI_OBJ(find_dynamic_proc_info)
-#define unwi_extract_dynamic_proc_info	UNWI_OBJ(extract_dynamic_proc_info)
-#define unwi_put_dynamic_unwind_info	UNWI_OBJ(put_dynamic_unwind_info)
-#define unwi_dyn_remote_find_proc_info	UNWI_OBJ(dyn_remote_find_proc_info)
-#define unwi_dyn_remote_put_unwind_info	UNWI_OBJ(dyn_remote_put_unwind_info)
-#define unwi_dyn_validate_cache		UNWI_OBJ(dyn_validate_cache)
+#define unwi_find_dynamic_proc_info     UNWI_OBJ(find_dynamic_proc_info)
+#define unwi_extract_dynamic_proc_info  UNWI_OBJ(extract_dynamic_proc_info)
+#define unwi_put_dynamic_unwind_info    UNWI_OBJ(put_dynamic_unwind_info)
+#define unwi_dyn_remote_find_proc_info  UNWI_OBJ(dyn_remote_find_proc_info)
+#define unwi_dyn_remote_put_unwind_info UNWI_OBJ(dyn_remote_put_unwind_info)
+#define unwi_dyn_validate_cache         UNWI_OBJ(dyn_validate_cache)
 
 extern int unwi_find_dynamic_proc_info (unw_addr_space_t as,
-					unw_word_t ip,
-					unw_proc_info_t *pi,
-					int need_unwind_info, void *arg);
+                                        unw_word_t ip,
+                                        unw_proc_info_t *pi,
+                                        int need_unwind_info, void *arg);
 extern int unwi_extract_dynamic_proc_info (unw_addr_space_t as,
-					   unw_word_t ip,
-					   unw_proc_info_t *pi,
-					   unw_dyn_info_t *di,
-					   int need_unwind_info,
-					   void *arg);
+                                           unw_word_t ip,
+                                           unw_proc_info_t *pi,
+                                           unw_dyn_info_t *di,
+                                           int need_unwind_info,
+                                           void *arg);
 extern void unwi_put_dynamic_unwind_info (unw_addr_space_t as,
-					  unw_proc_info_t *pi, void *arg);
+                                          unw_proc_info_t *pi, void *arg);
 
 /* These handle the remote (cross-address-space) case of accessing
    dynamic unwind info. */
 
 extern int unwi_dyn_remote_find_proc_info (unw_addr_space_t as,
-					   unw_word_t ip,
-					   unw_proc_info_t *pi,
-					   int need_unwind_info,
-					   void *arg);
+                                           unw_word_t ip,
+                                           unw_proc_info_t *pi,
+                                           int need_unwind_info,
+                                           void *arg);
 extern void unwi_dyn_remote_put_unwind_info (unw_addr_space_t as,
-					     unw_proc_info_t *pi,
-					     void *arg);
+                                             unw_proc_info_t *pi,
+                                             void *arg);
 extern int unwi_dyn_validate_cache (unw_addr_space_t as, void *arg);
 
 extern unw_dyn_info_list_t _U_dyn_info_list;
 extern pthread_mutex_t _U_dyn_info_list_lock;
 
 #if UNW_DEBUG
-#define unwi_debug_level		UNWI_ARCH_OBJ(debug_level)
+#define unwi_debug_level                UNWI_ARCH_OBJ(debug_level)
 extern long unwi_debug_level;
 
 # include <stdio.h>
-# define Debug(level,format...)						\
-do {									\
-  if (unwi_debug_level >= level)					\
-    {									\
-      int _n = level;							\
-      if (_n > 16)							\
-	_n = 16;							\
-      fprintf (stderr, "%*c>%s: ", _n, ' ', __FUNCTION__);		\
-      fprintf (stderr, format);						\
-    }									\
+# define Debug(level,format...)                                         \
+do {                                                                    \
+  if (unwi_debug_level >= level)                                        \
+    {                                                                   \
+      int _n = level;                                                   \
+      if (_n > 16)                                                      \
+        _n = 16;                                                        \
+      fprintf (stderr, "%*c>%s: ", _n, ' ', __FUNCTION__);              \
+      fprintf (stderr, format);                                         \
+    }                                                                   \
 } while (0)
-# define dprintf(format...) 	    fprintf (stderr, format)
-# ifdef __GNUC__
-#  undef inline
-#  define inline	UNUSED
-# endif
+# define Dprintf(format...)         fprintf (stderr, format)
 #else
 # define Debug(level,format...)
-# define dprintf(format...)
+# define Dprintf(format...)
 #endif
 
-static ALWAYS_INLINE void
+static ALWAYS_INLINE int
 print_error (const char *string)
 {
-  write (2, string, strlen (string));
+  return write (2, string, strlen (string));
 }
 
-#define mi_init		UNWI_ARCH_OBJ(mi_init)
+#define mi_init         UNWI_ARCH_OBJ(mi_init)
 
-extern void mi_init (void);	/* machine-independent initializations */
+extern void mi_init (void);     /* machine-independent initializations */
 extern unw_word_t _U_dyn_info_list_addr (void);
 
 /* This is needed/used by ELF targets only.  */
 
 struct elf_image
   {
-    void *image;		/* pointer to mmap'd image */
-    size_t size;		/* (file-) size of the image */
+    void *image;                /* pointer to mmap'd image */
+    size_t size;                /* (file-) size of the image */
   };
 
+struct elf_dyn_info
+  {
+    struct elf_image ei;
+    unw_dyn_info_t di_cache;
+    unw_dyn_info_t di_debug;    /* additional table info for .debug_frame */
+#if UNW_TARGET_IA64
+    unw_dyn_info_t ktab;
+#endif
+#if UNW_TARGET_ARM
+    unw_dyn_info_t di_arm;      /* additional table info for .ARM.exidx */
+#endif
+  };
+
+static inline void invalidate_edi (struct elf_dyn_info *edi)
+{
+  if (edi->ei.image)
+    munmap (edi->ei.image, edi->ei.size);
+  memset (edi, 0, sizeof (*edi));
+  edi->di_cache.format = -1;
+  edi->di_debug.format = -1;
+#if UNW_TARGET_ARM
+  edi->di_arm.format = -1;
+#endif
+}
+
+
+/* Provide a place holder for architecture to override for fast access
+   to memory when known not to need to validate and know the access
+   will be local to the process. A suitable override will improve
+   unw_tdep_trace() performance in particular. */
+#define ACCESS_MEM_FAST(ret,validate,cur,addr,to) \
+  do { (ret) = dwarf_get ((cur), DWARF_MEM_LOC ((cur), (addr)), &(to)); } \
+  while (0)
+
+/* Define GNU and processor specific values for the Phdr p_type field in case
+   they aren't defined by <elf.h>.  */
+#ifndef PT_GNU_EH_FRAME
+# define PT_GNU_EH_FRAME        0x6474e550
+#endif /* !PT_GNU_EH_FRAME */
+#ifndef PT_ARM_EXIDX
+# define PT_ARM_EXIDX           0x70000001      /* ARM unwind segment */
+#endif /* !PT_ARM_EXIDX */
+
 #include "tdep/libunwind_i.h"
 
 #ifndef tdep_get_func_addr
-# define tdep_get_func_addr(as,addr,v)		(*(v) = addr, 0)
+# define tdep_get_func_addr(as,addr,v)          (*(v) = addr, 0)
+#endif
+
+#ifndef DWARF_VAL_LOC
+# define DWARF_IS_VAL_LOC(l)    0
+# define DWARF_VAL_LOC(c,v)     DWARF_NULL_LOC
 #endif
 
+#define UNW_ALIGN(x,a) (((x)+(a)-1UL)&~((a)-1UL))
+
 #endif /* libunwind_i_h */
diff --git a/frysk-imports/libunwind/include/mempool.h b/frysk-imports/libunwind/include/mempool.h
index 4b55974..1f1c770 100644
--- a/frysk-imports/libunwind/include/mempool.h
+++ b/frysk-imports/libunwind/include/mempool.h
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2002-2003 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -51,23 +51,23 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 #include "libunwind_i.h"
 
-#define sos_alloc(s)		UNWI_ARCH_OBJ(_sos_alloc)(s)
-#define mempool_init(p,s,r)	UNWI_ARCH_OBJ(_mempool_init)(p,s,r)
-#define mempool_alloc(p)	UNWI_ARCH_OBJ(_mempool_alloc)(p)
-#define mempool_free(p,o)	UNWI_ARCH_OBJ(_mempool_free)(p,o)
+#define sos_alloc(s)            UNWI_ARCH_OBJ(_sos_alloc)(s)
+#define mempool_init(p,s,r)     UNWI_ARCH_OBJ(_mempool_init)(p,s,r)
+#define mempool_alloc(p)        UNWI_ARCH_OBJ(_mempool_alloc)(p)
+#define mempool_free(p,o)       UNWI_ARCH_OBJ(_mempool_free)(p,o)
 
 /* The mempool structure should be treated as an opaque object.  It's
    declared here only to enable static allocation of mempools.  */
 struct mempool
   {
     pthread_mutex_t lock;
-    size_t obj_size;		/* object size (rounded up for alignment) */
-    size_t chunk_size;		/* allocation granularity */
-    unsigned int reserve;	/* minimum (desired) size of the free-list */
-    unsigned int num_free;	/* number of objects on the free-list */
+    size_t obj_size;            /* object size (rounded up for alignment) */
+    size_t chunk_size;          /* allocation granularity */
+    unsigned int reserve;       /* minimum (desired) size of the free-list */
+    unsigned int num_free;      /* number of objects on the free-list */
     struct object
       {
-	struct object *next;
+        struct object *next;
       }
     *free_list;
   };
@@ -82,7 +82,7 @@ extern void *sos_alloc (size_t size);
    tight memory situations.  If it is zero, mempool attempts to pick a
    reasonable default value.  */
 extern void mempool_init (struct mempool *pool,
-			  size_t obj_size, size_t reserve);
+                          size_t obj_size, size_t reserve);
 extern void *mempool_alloc (struct mempool *pool);
 extern void mempool_free (struct mempool *pool, void *object);
 
diff --git a/frysk-imports/libunwind/include/remote.h b/frysk-imports/libunwind/include/remote.h
index 9fb90c3..6fdf64c 100644
--- a/frysk-imports/libunwind/include/remote.h
+++ b/frysk-imports/libunwind/include/remote.h
@@ -9,7 +9,7 @@
 
 static inline int
 fetch8 (unw_addr_space_t as, unw_accessors_t *a,
-	unw_word_t *addr, int8_t *valp, void *arg)
+        unw_word_t *addr, int8_t *valp, void *arg)
 {
   *valp = *(int8_t *) (uintptr_t) *addr;
   *addr += 1;
@@ -18,7 +18,7 @@ fetch8 (unw_addr_space_t as, unw_accessors_t *a,
 
 static inline int
 fetch16 (unw_addr_space_t as, unw_accessors_t *a,
-	 unw_word_t *addr, int16_t *valp, void *arg)
+         unw_word_t *addr, int16_t *valp, void *arg)
 {
   *valp = *(int16_t *) (uintptr_t) *addr;
   *addr += 2;
@@ -27,7 +27,7 @@ fetch16 (unw_addr_space_t as, unw_accessors_t *a,
 
 static inline int
 fetch32 (unw_addr_space_t as, unw_accessors_t *a,
-	 unw_word_t *addr, int32_t *valp, void *arg)
+         unw_word_t *addr, int32_t *valp, void *arg)
 {
   *valp = *(int32_t *) (uintptr_t) *addr;
   *addr += 4;
@@ -36,7 +36,7 @@ fetch32 (unw_addr_space_t as, unw_accessors_t *a,
 
 static inline int
 fetchw (unw_addr_space_t as, unw_accessors_t *a,
-	unw_word_t *addr, unw_word_t *valp, void *arg)
+        unw_word_t *addr, unw_word_t *valp, void *arg)
 {
   *valp = *(unw_word_t *) (uintptr_t) *addr;
   *addr += sizeof (unw_word_t);
@@ -45,11 +45,11 @@ fetchw (unw_addr_space_t as, unw_accessors_t *a,
 
 #else /* !UNW_LOCAL_ONLY */
 
-#define WSIZE	(sizeof (unw_word_t))
+#define WSIZE   (sizeof (unw_word_t))
 
 static inline int
 fetch8 (unw_addr_space_t as, unw_accessors_t *a,
-	unw_word_t *addr, int8_t *valp, void *arg)
+        unw_word_t *addr, int8_t *valp, void *arg)
 {
   unw_word_t val, aligned_addr = *addr & -WSIZE, off = *addr - aligned_addr;
   int ret;
@@ -69,7 +69,7 @@ fetch8 (unw_addr_space_t as, unw_accessors_t *a,
 
 static inline int
 fetch16 (unw_addr_space_t as, unw_accessors_t *a,
-	 unw_word_t *addr, int16_t *valp, void *arg)
+         unw_word_t *addr, int16_t *valp, void *arg)
 {
   unw_word_t val, aligned_addr = *addr & -WSIZE, off = *addr - aligned_addr;
   int ret;
@@ -91,7 +91,7 @@ fetch16 (unw_addr_space_t as, unw_accessors_t *a,
 
 static inline int
 fetch32 (unw_addr_space_t as, unw_accessors_t *a,
-	 unw_word_t *addr, int32_t *valp, void *arg)
+         unw_word_t *addr, int32_t *valp, void *arg)
 {
   unw_word_t val, aligned_addr = *addr & -WSIZE, off = *addr - aligned_addr;
   int ret;
@@ -113,7 +113,7 @@ fetch32 (unw_addr_space_t as, unw_accessors_t *a,
 
 static inline int
 fetchw (unw_addr_space_t as, unw_accessors_t *a,
-	unw_word_t *addr, unw_word_t *valp, void *arg)
+        unw_word_t *addr, unw_word_t *valp, void *arg)
 {
   int ret;
 
diff --git a/frysk-imports/libunwind/include/stamp-h.in b/frysk-imports/libunwind/include/stamp-h.in
deleted file mode 100644
index e69de29..0000000
diff --git a/frysk-imports/libunwind/include/tdep-aarch64/dwarf-config.h b/frysk-imports/libunwind/include/tdep-aarch64/dwarf-config.h
new file mode 100644
index 0000000..f65db17
--- /dev/null
+++ b/frysk-imports/libunwind/include/tdep-aarch64/dwarf-config.h
@@ -0,0 +1,52 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+   Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com>
+   Copyright (C) 2013 Linaro Limited
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#ifndef dwarf_config_h
+#define dwarf_config_h
+
+/* This matches the value udes by GCC (see
+   gcc/config/aarch64/aarch64.h:DWARF_FRAME_REGISTERS.  */
+#define DWARF_NUM_PRESERVED_REGS        97
+
+/* Return TRUE if the ADDR_SPACE uses big-endian byte-order.  */
+#define dwarf_is_big_endian(addr_space) 0
+
+#define dwarf_to_unw_regnum(reg) (((reg) <= UNW_AARCH64_V31) ? (reg) : 0)
+
+/* Convert a pointer to a dwarf_cursor structure to a pointer to
+   unw_cursor_t.  */
+#define dwarf_to_cursor(c)      ((unw_cursor_t *) (c))
+
+typedef struct dwarf_loc
+  {
+    unw_word_t val;
+#ifndef UNW_LOCAL_ONLY
+    unw_word_t type;            /* see DWARF_LOC_TYPE_* macros.  */
+#endif
+  }
+dwarf_loc_t;
+
+#endif /* dwarf_config_h */
diff --git a/frysk-imports/libunwind/include/tdep-aarch64/jmpbuf.h b/frysk-imports/libunwind/include/tdep-aarch64/jmpbuf.h
new file mode 100644
index 0000000..3f01a44
--- /dev/null
+++ b/frysk-imports/libunwind/include/tdep-aarch64/jmpbuf.h
@@ -0,0 +1,33 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+   Copyright (C) 2013 Linaro Limited
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+/* Use glibc's jump-buffer indices; NPTL peeks at SP: */
+
+/* FIXME for AArch64  */
+
+#define JB_SP           13
+#define JB_RP           14
+#define JB_MASK_SAVED   15
+#define JB_MASK         16
diff --git a/frysk-imports/libunwind/include/tdep-aarch64/libunwind_i.h b/frysk-imports/libunwind/include/tdep-aarch64/libunwind_i.h
new file mode 100644
index 0000000..ca28155
--- /dev/null
+++ b/frysk-imports/libunwind/include/tdep-aarch64/libunwind_i.h
@@ -0,0 +1,318 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2001-2005 Hewlett-Packard Co
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+   Copyright (C) 2013 Linaro Limited
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#ifndef AARCH64_LIBUNWIND_I_H
+#define AARCH64_LIBUNWIND_I_H
+
+/* Target-dependent definitions that are internal to libunwind but need
+   to be shared with target-independent code.  */
+
+#include <stdlib.h>
+#include <libunwind.h>
+
+#include "elf64.h"
+#include "mempool.h"
+#include "dwarf.h"
+
+typedef enum
+  {
+    UNW_AARCH64_FRAME_STANDARD = -2,     /* regular fp, sp +/- offset */
+    UNW_AARCH64_FRAME_SIGRETURN = -1,    /* special sigreturn frame */
+    UNW_AARCH64_FRAME_OTHER = 0,         /* not cacheable (special or unrecognised) */
+    UNW_AARCH64_FRAME_GUESSED = 1        /* guessed it was regular, but not known */
+  }
+unw_tdep_frame_type_t;
+
+typedef struct
+  {
+    uint64_t virtual_address;
+    int64_t frame_type     : 2;  /* unw_tdep_frame_type_t classification */
+    int64_t last_frame     : 1;  /* non-zero if last frame in chain */
+    int64_t cfa_reg_sp     : 1;  /* cfa dwarf base register is sp vs. fp */
+    int64_t cfa_reg_offset : 30; /* cfa is at this offset from base register value */
+    int64_t fp_cfa_offset  : 30; /* fp saved at this offset from cfa (-1 = not saved) */
+    int64_t lr_cfa_offset  : 30; /* lr saved at this offset from cfa (-1 = not saved) */
+    int64_t sp_cfa_offset  : 30; /* sp saved at this offset from cfa (-1 = not saved) */
+  }
+unw_tdep_frame_t;
+
+#ifdef UNW_LOCAL_ONLY
+
+typedef unw_word_t aarch64_loc_t;
+
+#else /* !UNW_LOCAL_ONLY */
+
+typedef struct aarch64_loc
+  {
+    unw_word_t w0, w1;
+  }
+aarch64_loc_t;
+
+#endif /* !UNW_LOCAL_ONLY */
+
+struct unw_addr_space
+  {
+    struct unw_accessors acc;
+    int big_endian;
+    unw_caching_policy_t caching_policy;
+#ifdef HAVE_ATOMIC_OPS_H
+    AO_t cache_generation;
+#else
+    uint32_t cache_generation;
+#endif
+    unw_word_t dyn_generation;          /* see dyn-common.h */
+    unw_word_t dyn_info_list_addr;      /* (cached) dyn_info_list_addr */
+    struct dwarf_rs_cache global_cache;
+    struct unw_debug_frame_list *debug_frames;
+   };
+
+struct cursor
+  {
+    struct dwarf_cursor dwarf;          /* must be first */
+
+    unw_tdep_frame_t frame_info;        /* quick tracing assist info */
+
+    enum
+      {
+        AARCH64_SCF_NONE,
+        AARCH64_SCF_LINUX_RT_SIGFRAME,
+      }
+    sigcontext_format;
+    unw_word_t sigcontext_addr;
+    unw_word_t sigcontext_sp;
+    unw_word_t sigcontext_pc;
+    int validate;
+  };
+
+#define DWARF_GET_LOC(l)        ((l).val)
+
+#ifdef UNW_LOCAL_ONLY
+# define DWARF_NULL_LOC         DWARF_LOC (0, 0)
+# define DWARF_IS_NULL_LOC(l)   (DWARF_GET_LOC (l) == 0)
+# define DWARF_LOC(r, t)        ((dwarf_loc_t) { .val = (r) })
+# define DWARF_IS_REG_LOC(l)    0
+# define DWARF_REG_LOC(c,r)     (DWARF_LOC((unw_word_t)                      \
+                                 tdep_uc_addr((c)->as_arg, (r)), 0))
+# define DWARF_MEM_LOC(c,m)     DWARF_LOC ((m), 0)
+# define DWARF_FPREG_LOC(c,r)   (DWARF_LOC((unw_word_t)                      \
+                                 tdep_uc_addr((c)->as_arg, (r)), 0))
+
+static inline int
+dwarf_getfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t *val)
+{
+  if (!DWARF_GET_LOC (loc))
+    return -1;
+  *val = *(unw_fpreg_t *) DWARF_GET_LOC (loc);
+  return 0;
+}
+
+static inline int
+dwarf_putfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t val)
+{
+  if (!DWARF_GET_LOC (loc))
+    return -1;
+  *(unw_fpreg_t *) DWARF_GET_LOC (loc) = val;
+  return 0;
+}
+
+static inline int
+dwarf_get (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t *val)
+{
+  if (!DWARF_GET_LOC (loc))
+    return -1;
+  *val = *(unw_word_t *) DWARF_GET_LOC (loc);
+  return 0;
+}
+
+static inline int
+dwarf_put (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t val)
+{
+  if (!DWARF_GET_LOC (loc))
+    return -1;
+  *(unw_word_t *) DWARF_GET_LOC (loc) = val;
+  return 0;
+}
+
+#else /* !UNW_LOCAL_ONLY */
+# define DWARF_LOC_TYPE_FP      (1 << 0)
+# define DWARF_LOC_TYPE_REG     (1 << 1)
+# define DWARF_NULL_LOC         DWARF_LOC (0, 0)
+# define DWARF_IS_NULL_LOC(l)                                           \
+                ({ dwarf_loc_t _l = (l); _l.val == 0 && _l.type == 0; })
+# define DWARF_LOC(r, t)        ((dwarf_loc_t) { .val = (r), .type = (t) })
+# define DWARF_IS_REG_LOC(l)    (((l).type & DWARF_LOC_TYPE_REG) != 0)
+# define DWARF_IS_FP_LOC(l)     (((l).type & DWARF_LOC_TYPE_FP) != 0)
+# define DWARF_REG_LOC(c,r)     DWARF_LOC((r), DWARF_LOC_TYPE_REG)
+# define DWARF_MEM_LOC(c,m)     DWARF_LOC ((m), 0)
+# define DWARF_FPREG_LOC(c,r)   DWARF_LOC((r), (DWARF_LOC_TYPE_REG      \
+                                                | DWARF_LOC_TYPE_FP))
+
+static inline int
+dwarf_getfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t *val)
+{
+  char *valp = (char *) &val;
+  unw_word_t addr;
+  int ret;
+
+  if (DWARF_IS_NULL_LOC (loc))
+    return -UNW_EBADREG;
+
+  if (DWARF_IS_REG_LOC (loc))
+    return (*c->as->acc.access_fpreg) (c->as, DWARF_GET_LOC (loc),
+                                       val, 0, c->as_arg);
+
+  addr = DWARF_GET_LOC (loc);
+  if ((ret = (*c->as->acc.access_mem) (c->as, addr + 0, (unw_word_t *) valp,
+                                       0, c->as_arg)) < 0)
+    return ret;
+
+  return (*c->as->acc.access_mem) (c->as, addr + 4, (unw_word_t *) valp + 1, 0,
+                                   c->as_arg);
+}
+
+static inline int
+dwarf_putfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t val)
+{
+  char *valp = (char *) &val;
+  unw_word_t addr;
+  int ret;
+
+  if (DWARF_IS_NULL_LOC (loc))
+    return -UNW_EBADREG;
+
+  if (DWARF_IS_REG_LOC (loc))
+    return (*c->as->acc.access_fpreg) (c->as, DWARF_GET_LOC (loc),
+                                       &val, 1, c->as_arg);
+
+  addr = DWARF_GET_LOC (loc);
+  if ((ret = (*c->as->acc.access_mem) (c->as, addr + 0, (unw_word_t *) valp,
+                                       1, c->as_arg)) < 0)
+    return ret;
+
+  return (*c->as->acc.access_mem) (c->as, addr + 4, (unw_word_t *) valp + 1,
+                                   1, c->as_arg);
+}
+
+static inline int
+dwarf_get (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t *val)
+{
+  if (DWARF_IS_NULL_LOC (loc))
+    return -UNW_EBADREG;
+
+  /* If a code-generator were to save a value of type unw_word_t in a
+     floating-point register, we would have to support this case.  I
+     suppose it could happen with MMX registers, but does it really
+     happen?  */
+  assert (!DWARF_IS_FP_LOC (loc));
+
+  if (DWARF_IS_REG_LOC (loc))
+    return (*c->as->acc.access_reg) (c->as, DWARF_GET_LOC (loc), val,
+                                     0, c->as_arg);
+  else
+    return (*c->as->acc.access_mem) (c->as, DWARF_GET_LOC (loc), val,
+                                     0, c->as_arg);
+}
+
+static inline int
+dwarf_put (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t val)
+{
+  if (DWARF_IS_NULL_LOC (loc))
+    return -UNW_EBADREG;
+
+  /* If a code-generator were to save a value of type unw_word_t in a
+     floating-point register, we would have to support this case.  I
+     suppose it could happen with MMX registers, but does it really
+     happen?  */
+  assert (!DWARF_IS_FP_LOC (loc));
+
+  if (DWARF_IS_REG_LOC (loc))
+    return (*c->as->acc.access_reg) (c->as, DWARF_GET_LOC (loc), &val,
+                                     1, c->as_arg);
+  else
+    return (*c->as->acc.access_mem) (c->as, DWARF_GET_LOC (loc), &val,
+                                     1, c->as_arg);
+}
+
+#endif /* !UNW_LOCAL_ONLY */
+
+
+
+#define tdep_getcontext_trace           UNW_ARCH_OBJ(getcontext_trace)
+#define tdep_init_done                  UNW_OBJ(init_done)
+#define tdep_init                       UNW_OBJ(init)
+/* Platforms that support UNW_INFO_FORMAT_TABLE need to define
+   tdep_search_unwind_table.  */
+#define tdep_search_unwind_table        dwarf_search_unwind_table
+#define tdep_find_unwind_table          dwarf_find_unwind_table
+#define tdep_uc_addr                    UNW_OBJ(uc_addr)
+#define tdep_get_elf_image              UNW_ARCH_OBJ(get_elf_image)
+#define tdep_access_reg                 UNW_OBJ(access_reg)
+#define tdep_access_fpreg               UNW_OBJ(access_fpreg)
+#define tdep_fetch_frame(c,ip,n)        do {} while(0)
+#define tdep_cache_frame(c,rs)          do {} while(0)
+#define tdep_reuse_frame(c,rs)          do {} while(0)
+#define tdep_stash_frame                UNW_OBJ(tdep_stash_frame)
+#define tdep_trace                      UNW_OBJ(tdep_trace)
+
+#ifdef UNW_LOCAL_ONLY
+# define tdep_find_proc_info(c,ip,n)                            \
+        dwarf_find_proc_info((c)->as, (ip), &(c)->pi, (n),      \
+                                       (c)->as_arg)
+# define tdep_put_unwind_info(as,pi,arg)                \
+        dwarf_put_unwind_info((as), (pi), (arg))
+#else
+# define tdep_find_proc_info(c,ip,n)                                    \
+        (*(c)->as->acc.find_proc_info)((c)->as, (ip), &(c)->pi, (n),    \
+                                       (c)->as_arg)
+# define tdep_put_unwind_info(as,pi,arg)                \
+        (*(as)->acc.put_unwind_info)((as), (pi), (arg))
+#endif
+
+#define tdep_get_as(c)                  ((c)->dwarf.as)
+#define tdep_get_as_arg(c)              ((c)->dwarf.as_arg)
+#define tdep_get_ip(c)                  ((c)->dwarf.ip)
+#define tdep_big_endian(as)             ((as)->big_endian)
+
+extern int tdep_init_done;
+
+extern void tdep_init (void);
+extern int tdep_search_unwind_table (unw_addr_space_t as, unw_word_t ip,
+                                     unw_dyn_info_t *di, unw_proc_info_t *pi,
+                                     int need_unwind_info, void *arg);
+extern void *tdep_uc_addr (unw_tdep_context_t *uc, int reg);
+extern int tdep_get_elf_image (struct elf_image *ei, pid_t pid, unw_word_t ip,
+                               unsigned long *segbase, unsigned long *mapoff,
+                               char *path, size_t pathlen);
+extern int tdep_access_reg (struct cursor *c, unw_regnum_t reg,
+                            unw_word_t *valp, int write);
+extern int tdep_access_fpreg (struct cursor *c, unw_regnum_t reg,
+                              unw_fpreg_t *valp, int write);
+extern int tdep_trace (unw_cursor_t *cursor, void **addresses, int *n);
+extern void tdep_stash_frame (struct dwarf_cursor *c,
+                              struct dwarf_reg_state *rs);
+extern int tdep_getcontext_trace (unw_tdep_context_t *);
+
+#endif /* AARCH64_LIBUNWIND_I_H */
diff --git a/frysk-imports/libunwind/include/tdep-arm/dwarf-config.h b/frysk-imports/libunwind/include/tdep-arm/dwarf-config.h
index 455d15f..f502289 100644
--- a/frysk-imports/libunwind/include/tdep-arm/dwarf-config.h
+++ b/frysk-imports/libunwind/include/tdep-arm/dwarf-config.h
@@ -1,5 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2008 CodeSourcery
+   Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com>
 
 This file is part of libunwind.
 
@@ -27,23 +28,22 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 /* This is FIRST_PSEUDO_REGISTER in GCC, since DWARF_FRAME_REGISTERS is not
    explicitly defined.  */
-#define DWARF_NUM_PRESERVED_REGS	128
+#define DWARF_NUM_PRESERVED_REGS        128
 
-/* FIXME: Probably unnecessary on ARM.  See arm/Gglobal.c.  */
-#define DWARF_REGNUM_MAP_LENGTH		16
+#define dwarf_to_unw_regnum(reg) (((reg) < 16) ? (reg) : 0)
 
 /* Return TRUE if the ADDR_SPACE uses big-endian byte-order.  */
-#define dwarf_is_big_endian(addr_space)	0
+#define dwarf_is_big_endian(addr_space) 0
 
 /* Convert a pointer to a dwarf_cursor structure to a pointer to
    unw_cursor_t.  */
-#define dwarf_to_cursor(c)	((unw_cursor_t *) (c))
+#define dwarf_to_cursor(c)      ((unw_cursor_t *) (c))
 
 typedef struct dwarf_loc
   {
     unw_word_t val;
 #ifndef UNW_LOCAL_ONLY
-    unw_word_t type;		/* see DWARF_LOC_TYPE_* macros.  */
+    unw_word_t type;            /* see DWARF_LOC_TYPE_* macros.  */
 #endif
   }
 dwarf_loc_t;
diff --git a/frysk-imports/libunwind/include/tdep-arm/ex_tables.h b/frysk-imports/libunwind/include/tdep-arm/ex_tables.h
new file mode 100644
index 0000000..9df5e0a
--- /dev/null
+++ b/frysk-imports/libunwind/include/tdep-arm/ex_tables.h
@@ -0,0 +1,55 @@
+/* libunwind - a platform-independent unwind library
+   Copyright 2011 Linaro Limited
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#ifndef ARM_EX_TABLES_H
+#define ARM_EX_TABLES_H
+
+typedef enum arm_exbuf_cmd {
+  ARM_EXIDX_CMD_FINISH,
+  ARM_EXIDX_CMD_DATA_PUSH,
+  ARM_EXIDX_CMD_DATA_POP,
+  ARM_EXIDX_CMD_REG_POP,
+  ARM_EXIDX_CMD_REG_TO_SP,
+  ARM_EXIDX_CMD_VFP_POP,
+  ARM_EXIDX_CMD_WREG_POP,
+  ARM_EXIDX_CMD_WCGR_POP,
+  ARM_EXIDX_CMD_RESERVED,
+  ARM_EXIDX_CMD_REFUSED,
+} arm_exbuf_cmd_t;
+
+struct arm_exbuf_data
+{
+  arm_exbuf_cmd_t cmd;
+  uint32_t data;
+};
+
+#define arm_exidx_extract       UNW_OBJ(arm_exidx_extract)
+#define arm_exidx_decode        UNW_OBJ(arm_exidx_decode)
+#define arm_exidx_apply_cmd     UNW_OBJ(arm_exidx_apply_cmd)
+
+int arm_exidx_extract (struct dwarf_cursor *c, uint8_t *buf);
+int arm_exidx_decode (const uint8_t *buf, uint8_t len, struct dwarf_cursor *c);
+int arm_exidx_apply_cmd (struct arm_exbuf_data *edata, struct dwarf_cursor *c);
+
+#endif // ARM_EX_TABLES_H
diff --git a/frysk-imports/libunwind/include/tdep-arm/jmpbuf.h b/frysk-imports/libunwind/include/tdep-arm/jmpbuf.h
index 499e7de..008e77f 100644
--- a/frysk-imports/libunwind/include/tdep-arm/jmpbuf.h
+++ b/frysk-imports/libunwind/include/tdep-arm/jmpbuf.h
@@ -26,7 +26,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 /* FIXME for ARM!  */
 
-#define JB_SP		4
-#define JB_RP		5
-#define JB_MASK_SAVED	6
-#define JB_MASK		7
+#define JB_SP           4
+#define JB_RP           5
+#define JB_MASK_SAVED   6
+#define JB_MASK         7
diff --git a/frysk-imports/libunwind/include/tdep-arm/libunwind_i.h b/frysk-imports/libunwind/include/tdep-arm/libunwind_i.h
index 3424d86..d3a279c 100644
--- a/frysk-imports/libunwind/include/tdep-arm/libunwind_i.h
+++ b/frysk-imports/libunwind/include/tdep-arm/libunwind_i.h
@@ -34,6 +34,29 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #include "elf32.h"
 #include "mempool.h"
 #include "dwarf.h"
+#include "ex_tables.h"
+
+typedef enum
+  {
+    UNW_ARM_FRAME_STANDARD = -2,     /* regular r7, sp +/- offset */
+    UNW_ARM_FRAME_SIGRETURN = -1,    /* special sigreturn frame */
+    UNW_ARM_FRAME_OTHER = 0,         /* not cacheable (special or unrecognised) */
+    UNW_ARM_FRAME_GUESSED = 1        /* guessed it was regular, but not known */
+  }
+unw_tdep_frame_type_t;
+
+typedef struct
+  {
+    uint32_t virtual_address;
+    int32_t frame_type     : 2;  /* unw_tdep_frame_type_t classification */
+    int32_t last_frame     : 1;  /* non-zero if last frame in chain */
+    int32_t cfa_reg_sp     : 1;  /* cfa dwarf base register is sp vs. r7 */
+    int32_t cfa_reg_offset : 30; /* cfa is at this offset from base register value */
+    int32_t r7_cfa_offset  : 30; /* r7 saved at this offset from cfa (-1 = not saved) */
+    int32_t lr_cfa_offset  : 30; /* lr saved at this offset from cfa (-1 = not saved) */
+    int32_t sp_cfa_offset  : 30; /* sp saved at this offset from cfa (-1 = not saved) */
+  }
+unw_tdep_frame_t;
 
 struct unw_addr_space
   {
@@ -45,30 +68,45 @@ struct unw_addr_space
 #else
     uint32_t cache_generation;
 #endif
-    unw_word_t dyn_generation;		/* see dyn-common.h */
-    unw_word_t dyn_info_list_addr;	/* (cached) dyn_info_list_addr */
+    unw_word_t dyn_generation;          /* see dyn-common.h */
+    unw_word_t dyn_info_list_addr;      /* (cached) dyn_info_list_addr */
     struct dwarf_rs_cache global_cache;
     struct unw_debug_frame_list *debug_frames;
   };
 
 struct cursor
   {
-    struct dwarf_cursor dwarf;		/* must be first */
+    struct dwarf_cursor dwarf;          /* must be first */
+
+    unw_tdep_frame_t frame_info;        /* quick tracing assist info */
+
+    enum
+      {
+        ARM_SCF_NONE,                   /* no signal frame */
+        ARM_SCF_LINUX_SIGFRAME,         /* non-RT signal frame, kernel >=2.6.18 */
+        ARM_SCF_LINUX_RT_SIGFRAME,      /* RT signal frame, kernel >=2.6.18 */
+        ARM_SCF_LINUX_OLD_SIGFRAME,     /* non-RT signal frame, kernel < 2.6.18 */
+        ARM_SCF_LINUX_OLD_RT_SIGFRAME   /* RT signal frame, kernel < 2.6.18 */
+      }
+    sigcontext_format;
     unw_word_t sigcontext_addr;
+    unw_word_t sigcontext_sp;
+    unw_word_t sigcontext_pc;
+    int validate;
   };
 
-#define DWARF_GET_LOC(l)	((l).val)
+#define DWARF_GET_LOC(l)        ((l).val)
 
 #ifdef UNW_LOCAL_ONLY
-# define DWARF_NULL_LOC		DWARF_LOC (0, 0)
-# define DWARF_IS_NULL_LOC(l)	(DWARF_GET_LOC (l) == 0)
-# define DWARF_LOC(r, t)	((dwarf_loc_t) { .val = (r) })
-# define DWARF_IS_REG_LOC(l)	0
-# define DWARF_REG_LOC(c,r)	(DWARF_LOC((unw_word_t)			     \
-				 tdep_uc_addr((c)->as_arg, (r)), 0))
-# define DWARF_MEM_LOC(c,m)	DWARF_LOC ((m), 0)
-# define DWARF_FPREG_LOC(c,r)	(DWARF_LOC((unw_word_t)			     \
-				 tdep_uc_addr((c)->as_arg, (r)), 0))
+# define DWARF_NULL_LOC         DWARF_LOC (0, 0)
+# define DWARF_IS_NULL_LOC(l)   (DWARF_GET_LOC (l) == 0)
+# define DWARF_LOC(r, t)        ((dwarf_loc_t) { .val = (r) })
+# define DWARF_IS_REG_LOC(l)    0
+# define DWARF_REG_LOC(c,r)     (DWARF_LOC((unw_word_t)                      \
+                                 tdep_uc_addr((c)->as_arg, (r)), 0))
+# define DWARF_MEM_LOC(c,m)     DWARF_LOC ((m), 0)
+# define DWARF_FPREG_LOC(c,r)   (DWARF_LOC((unw_word_t)                      \
+                                 tdep_uc_addr((c)->as_arg, (r)), 0))
 
 static inline int
 dwarf_getfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t *val)
@@ -107,18 +145,18 @@ dwarf_put (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t val)
 }
 
 #else /* !UNW_LOCAL_ONLY */
-# define DWARF_LOC_TYPE_FP	(1 << 0)
-# define DWARF_LOC_TYPE_REG	(1 << 1)
-# define DWARF_NULL_LOC		DWARF_LOC (0, 0)
-# define DWARF_IS_NULL_LOC(l)						\
-		({ dwarf_loc_t _l = (l); _l.val == 0 && _l.type == 0; })
-# define DWARF_LOC(r, t)	((dwarf_loc_t) { .val = (r), .type = (t) })
-# define DWARF_IS_REG_LOC(l)	(((l).type & DWARF_LOC_TYPE_REG) != 0)
-# define DWARF_IS_FP_LOC(l)	(((l).type & DWARF_LOC_TYPE_FP) != 0)
-# define DWARF_REG_LOC(c,r)	DWARF_LOC((r), DWARF_LOC_TYPE_REG)
-# define DWARF_MEM_LOC(c,m)	DWARF_LOC ((m), 0)
-# define DWARF_FPREG_LOC(c,r)	DWARF_LOC((r), (DWARF_LOC_TYPE_REG	\
-						| DWARF_LOC_TYPE_FP))
+# define DWARF_LOC_TYPE_FP      (1 << 0)
+# define DWARF_LOC_TYPE_REG     (1 << 1)
+# define DWARF_NULL_LOC         DWARF_LOC (0, 0)
+# define DWARF_IS_NULL_LOC(l)                                           \
+                ({ dwarf_loc_t _l = (l); _l.val == 0 && _l.type == 0; })
+# define DWARF_LOC(r, t)        ((dwarf_loc_t) { .val = (r), .type = (t) })
+# define DWARF_IS_REG_LOC(l)    (((l).type & DWARF_LOC_TYPE_REG) != 0)
+# define DWARF_IS_FP_LOC(l)     (((l).type & DWARF_LOC_TYPE_FP) != 0)
+# define DWARF_REG_LOC(c,r)     DWARF_LOC((r), DWARF_LOC_TYPE_REG)
+# define DWARF_MEM_LOC(c,m)     DWARF_LOC ((m), 0)
+# define DWARF_FPREG_LOC(c,r)   DWARF_LOC((r), (DWARF_LOC_TYPE_REG      \
+                                                | DWARF_LOC_TYPE_FP))
 
 static inline int
 dwarf_getfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t *val)
@@ -132,15 +170,15 @@ dwarf_getfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t *val)
 
   if (DWARF_IS_REG_LOC (loc))
     return (*c->as->acc.access_fpreg) (c->as, DWARF_GET_LOC (loc),
-				       val, 0, c->as_arg);
+                                       val, 0, c->as_arg);
 
   addr = DWARF_GET_LOC (loc);
   if ((ret = (*c->as->acc.access_mem) (c->as, addr + 0, (unw_word_t *) valp,
-				       0, c->as_arg)) < 0)
+                                       0, c->as_arg)) < 0)
     return ret;
 
   return (*c->as->acc.access_mem) (c->as, addr + 4, (unw_word_t *) valp + 1, 0,
-				   c->as_arg);
+                                   c->as_arg);
 }
 
 static inline int
@@ -155,15 +193,15 @@ dwarf_putfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t val)
 
   if (DWARF_IS_REG_LOC (loc))
     return (*c->as->acc.access_fpreg) (c->as, DWARF_GET_LOC (loc),
-				       &val, 1, c->as_arg);
+                                       &val, 1, c->as_arg);
 
   addr = DWARF_GET_LOC (loc);
   if ((ret = (*c->as->acc.access_mem) (c->as, addr + 0, (unw_word_t *) valp,
-				       1, c->as_arg)) < 0)
+                                       1, c->as_arg)) < 0)
     return ret;
 
   return (*c->as->acc.access_mem) (c->as, addr + 4, (unw_word_t *) valp + 1,
-				   1, c->as_arg);
+                                   1, c->as_arg);
 }
 
 static inline int
@@ -180,10 +218,10 @@ dwarf_get (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t *val)
 
   if (DWARF_IS_REG_LOC (loc))
     return (*c->as->acc.access_reg) (c->as, DWARF_GET_LOC (loc), val,
-				     0, c->as_arg);
+                                     0, c->as_arg);
   else
     return (*c->as->acc.access_mem) (c->as, DWARF_GET_LOC (loc), val,
-				     0, c->as_arg);
+                                     0, c->as_arg);
 }
 
 static inline int
@@ -200,55 +238,84 @@ dwarf_put (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t val)
 
   if (DWARF_IS_REG_LOC (loc))
     return (*c->as->acc.access_reg) (c->as, DWARF_GET_LOC (loc), &val,
-				     1, c->as_arg);
+                                     1, c->as_arg);
   else
     return (*c->as->acc.access_mem) (c->as, DWARF_GET_LOC (loc), &val,
-				     1, c->as_arg);
+                                     1, c->as_arg);
 }
 
 #endif /* !UNW_LOCAL_ONLY */
 
-#define tdep_needs_initialization	UNW_OBJ(needs_initialization)
-#define tdep_init			UNW_OBJ(init)
+#define tdep_getcontext_trace           unw_getcontext
+#define tdep_init_done                  UNW_OBJ(init_done)
+#define tdep_init                       UNW_OBJ(init)
+#define arm_find_proc_info              UNW_OBJ(find_proc_info)
+#define arm_put_unwind_info             UNW_OBJ(put_unwind_info)
 /* Platforms that support UNW_INFO_FORMAT_TABLE need to define
    tdep_search_unwind_table.  */
-#define tdep_search_unwind_table	dwarf_search_unwind_table
-#define tdep_uc_addr			UNW_ARCH_OBJ(uc_addr)
-#define tdep_get_elf_image		UNW_ARCH_OBJ(get_elf_image)
-#define tdep_access_reg			UNW_OBJ(access_reg)
-#define tdep_access_fpreg		UNW_OBJ(access_fpreg)
+#define tdep_search_unwind_table        UNW_OBJ(search_unwind_table)
+#define tdep_find_unwind_table          dwarf_find_unwind_table
+#define tdep_uc_addr                    UNW_ARCH_OBJ(uc_addr)
+#define tdep_get_elf_image              UNW_ARCH_OBJ(get_elf_image)
+#define tdep_access_reg                 UNW_OBJ(access_reg)
+#define tdep_access_fpreg               UNW_OBJ(access_fpreg)
+#define tdep_fetch_frame(c,ip,n)        do {} while(0)
+#define tdep_cache_frame(c,rs)          do {} while(0)
+#define tdep_reuse_frame(c,rs)          do {} while(0)
+#define tdep_stash_frame                UNW_OBJ(tdep_stash_frame)
+#define tdep_trace                      UNW_OBJ(tdep_trace)
 
 #ifdef UNW_LOCAL_ONLY
-# define tdep_find_proc_info(c,ip,n)				\
-	dwarf_find_proc_info((c)->as, (ip), &(c)->pi, (n),	\
-				       (c)->as_arg)
-# define tdep_put_unwind_info(as,pi,arg)		\
-	dwarf_put_unwind_info((as), (pi), (arg))
+# define tdep_find_proc_info(c,ip,n)                            \
+        arm_find_proc_info((c)->as, (ip), &(c)->pi, (n),        \
+                                       (c)->as_arg)
+# define tdep_put_unwind_info(as,pi,arg)                \
+        arm_put_unwind_info((as), (pi), (arg))
 #else
-# define tdep_find_proc_info(c,ip,n)					\
-	(*(c)->as->acc.find_proc_info)((c)->as, (ip), &(c)->pi, (n),	\
-				       (c)->as_arg)
-# define tdep_put_unwind_info(as,pi,arg)		\
-	(*(as)->acc.put_unwind_info)((as), (pi), (arg))
+# define tdep_find_proc_info(c,ip,n)                                    \
+        (*(c)->as->acc.find_proc_info)((c)->as, (ip), &(c)->pi, (n),    \
+                                       (c)->as_arg)
+# define tdep_put_unwind_info(as,pi,arg)                \
+        (*(as)->acc.put_unwind_info)((as), (pi), (arg))
 #endif
 
-#define tdep_get_as(c)			((c)->dwarf.as)
-#define tdep_get_as_arg(c)		((c)->dwarf.as_arg)
-#define tdep_get_ip(c)			((c)->dwarf.ip)
-#define tdep_big_endian(as)		((as)->big_endian)
+#define tdep_get_as(c)                  ((c)->dwarf.as)
+#define tdep_get_as_arg(c)              ((c)->dwarf.as_arg)
+#define tdep_get_ip(c)                  ((c)->dwarf.ip)
+#define tdep_big_endian(as)             ((as)->big_endian)
 
-extern int tdep_needs_initialization;
+extern int tdep_init_done;
 
 extern void tdep_init (void);
+extern int arm_find_proc_info (unw_addr_space_t as, unw_word_t ip,
+                               unw_proc_info_t *pi, int need_unwind_info,
+                               void *arg);
+extern void arm_put_unwind_info (unw_addr_space_t as,
+                                  unw_proc_info_t *pi, void *arg);
 extern int tdep_search_unwind_table (unw_addr_space_t as, unw_word_t ip,
-				     unw_dyn_info_t *di, unw_proc_info_t *pi,
-				     int need_unwind_info, void *arg);
-extern void *tdep_uc_addr (ucontext_t *uc, int reg);
+                                     unw_dyn_info_t *di, unw_proc_info_t *pi,
+                                     int need_unwind_info, void *arg);
+extern void *tdep_uc_addr (unw_tdep_context_t *uc, int reg);
 extern int tdep_get_elf_image (struct elf_image *ei, pid_t pid, unw_word_t ip,
-			       unsigned long *segbase, unsigned long *mapoff);
+                               unsigned long *segbase, unsigned long *mapoff,
+                               char *path, size_t pathlen);
 extern int tdep_access_reg (struct cursor *c, unw_regnum_t reg,
-			    unw_word_t *valp, int write);
+                            unw_word_t *valp, int write);
 extern int tdep_access_fpreg (struct cursor *c, unw_regnum_t reg,
-			      unw_fpreg_t *valp, int write);
+                              unw_fpreg_t *valp, int write);
+extern int tdep_trace (unw_cursor_t *cursor, void **addresses, int *n);
+extern void tdep_stash_frame (struct dwarf_cursor *c,
+                              struct dwarf_reg_state *rs);
+
+/* unwinding method selection support */
+#define UNW_ARM_METHOD_ALL          0xFF
+#define UNW_ARM_METHOD_DWARF        0x01
+#define UNW_ARM_METHOD_FRAME        0x02
+#define UNW_ARM_METHOD_EXIDX        0x04
+
+#define unwi_unwind_method   UNW_OBJ(unwind_method)
+extern int unwi_unwind_method;
+
+#define UNW_TRY_METHOD(x)   (unwi_unwind_method & x)
 
 #endif /* ARM_LIBUNWIND_I_H */
diff --git a/frysk-imports/libunwind/include/tdep-hppa/dwarf-config.h b/frysk-imports/libunwind/include/tdep-hppa/dwarf-config.h
index 29f9eee..fb963c7 100644
--- a/frysk-imports/libunwind/include/tdep-hppa/dwarf-config.h
+++ b/frysk-imports/libunwind/include/tdep-hppa/dwarf-config.h
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (c) 2004 Hewlett-Packard Development Company, L.P.
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -27,26 +27,26 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #define dwarf_config_h
 
 /* See DWARF_FRAME_REGNUM() macro in gcc/config/pa/pa32-regs.h: */
-#define dwarf_to_unw_regnum(reg)			\
+#define dwarf_to_unw_regnum(reg)                        \
   (((reg) < DWARF_NUM_PRESERVED_REGS) ? (reg) : 0)
 
 /* This matches the value used by GCC (see
    gcc/config/pa/pa32-regs.h:FIRST_PSEUDO_REGISTER), which leaves
    plenty of room for expansion.  */
-#define DWARF_NUM_PRESERVED_REGS	89
+#define DWARF_NUM_PRESERVED_REGS        89
 
 /* Return TRUE if the ADDR_SPACE uses big-endian byte-order.  */
-#define dwarf_is_big_endian(addr_space)	1
+#define dwarf_is_big_endian(addr_space) 1
 
 /* Convert a pointer to a dwarf_cursor structure to a pointer to
    unw_cursor_t.  */
-#define dwarf_to_cursor(c)	((unw_cursor_t *) (c))
+#define dwarf_to_cursor(c)      ((unw_cursor_t *) (c))
 
 typedef struct dwarf_loc
   {
     unw_word_t val;
 #ifndef UNW_LOCAL_ONLY
-    unw_word_t type;		/* see X86_LOC_TYPE_* macros.  */
+    unw_word_t type;            /* see X86_LOC_TYPE_* macros.  */
 #endif
   }
 dwarf_loc_t;
diff --git a/frysk-imports/libunwind/include/tdep-hppa/jmpbuf.h b/frysk-imports/libunwind/include/tdep-hppa/jmpbuf.h
index 6735b21..91f062f 100644
--- a/frysk-imports/libunwind/include/tdep-hppa/jmpbuf.h
+++ b/frysk-imports/libunwind/include/tdep-hppa/jmpbuf.h
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -26,8 +26,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 /* Use glibc's jump-buffer indices; NPTL peeks at SP: */
 
 #ifndef JB_SP
-# define JB_SP		19
+# define JB_SP          19
 #endif
-#define JB_RP		20
-#define JB_MASK_SAVED	21
-#define JB_MASK		22
+#define JB_RP           20
+#define JB_MASK_SAVED   21
+#define JB_MASK         22
diff --git a/frysk-imports/libunwind/include/tdep-hppa/libunwind_i.h b/frysk-imports/libunwind/include/tdep-hppa/libunwind_i.h
index 6a5ef23..d5cc1b9 100644
--- a/frysk-imports/libunwind/include/tdep-hppa/libunwind_i.h
+++ b/frysk-imports/libunwind/include/tdep-hppa/libunwind_i.h
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003-2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -33,8 +33,15 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #include <libunwind.h>
 
 #include "elf32.h"
+#include "mempool.h"
 #include "dwarf.h"
 
+typedef struct
+  {
+    /* no hppa-specific fast trace */
+  }
+unw_tdep_frame_t;
+
 struct unw_addr_space
   {
     struct unw_accessors acc;
@@ -44,38 +51,39 @@ struct unw_addr_space
 #else
     uint32_t cache_generation;
 #endif
-    unw_word_t dyn_generation;		/* see dyn-common.h */
-    unw_word_t dyn_info_list_addr;	/* (cached) dyn_info_list_addr */
+    unw_word_t dyn_generation;          /* see dyn-common.h */
+    unw_word_t dyn_info_list_addr;      /* (cached) dyn_info_list_addr */
+    struct dwarf_rs_cache global_cache;
     struct unw_debug_frame_list *debug_frames;
    };
 
 struct cursor
   {
-    struct dwarf_cursor dwarf;		/* must be first */
+    struct dwarf_cursor dwarf;          /* must be first */
 
     /* Format of sigcontext structure and address at which it is
        stored: */
     enum
       {
-	HPPA_SCF_NONE,			/* no signal frame encountered */
-	HPPA_SCF_LINUX_RT_SIGFRAME	/* POSIX ucontext_t */
+        HPPA_SCF_NONE,                  /* no signal frame encountered */
+        HPPA_SCF_LINUX_RT_SIGFRAME      /* POSIX ucontext_t */
       }
     sigcontext_format;
     unw_word_t sigcontext_addr;
   };
 
-#define DWARF_GET_LOC(l)	((l).val)
+#define DWARF_GET_LOC(l)        ((l).val)
 
 #ifdef UNW_LOCAL_ONLY
-# define DWARF_NULL_LOC		DWARF_LOC (0, 0)
-# define DWARF_IS_NULL_LOC(l)	(DWARF_GET_LOC (l) == 0)
-# define DWARF_LOC(r, t)	((dwarf_loc_t) { .val = (r) })
-# define DWARF_IS_REG_LOC(l)	0
-# define DWARF_REG_LOC(c,r)	(DWARF_LOC((unw_word_t)			     \
-				 tdep_uc_addr((c)->as_arg, (r)), 0))
-# define DWARF_MEM_LOC(c,m)	DWARF_LOC ((m), 0)
-# define DWARF_FPREG_LOC(c,r)	(DWARF_LOC((unw_word_t)			     \
-				 tdep_uc_addr((c)->as_arg, (r)), 0))
+# define DWARF_NULL_LOC         DWARF_LOC (0, 0)
+# define DWARF_IS_NULL_LOC(l)   (DWARF_GET_LOC (l) == 0)
+# define DWARF_LOC(r, t)        ((dwarf_loc_t) { .val = (r) })
+# define DWARF_IS_REG_LOC(l)    0
+# define DWARF_REG_LOC(c,r)     (DWARF_LOC((unw_word_t)                      \
+                                 tdep_uc_addr((c)->as_arg, (r)), 0))
+# define DWARF_MEM_LOC(c,m)     DWARF_LOC ((m), 0)
+# define DWARF_FPREG_LOC(c,r)   (DWARF_LOC((unw_word_t)                      \
+                                 tdep_uc_addr((c)->as_arg, (r)), 0))
 
 static inline int
 dwarf_getfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t *val)
@@ -114,18 +122,18 @@ dwarf_put (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t val)
 }
 
 #else /* !UNW_LOCAL_ONLY */
-# define DWARF_LOC_TYPE_FP	(1 << 0)
-# define DWARF_LOC_TYPE_REG	(1 << 1)
-# define DWARF_NULL_LOC		DWARF_LOC (0, 0)
-# define DWARF_IS_NULL_LOC(l)						\
-		({ dwarf_loc_t _l = (l); _l.val == 0 && _l.type == 0; })
-# define DWARF_LOC(r, t)	((dwarf_loc_t) { .val = (r), .type = (t) })
-# define DWARF_IS_REG_LOC(l)	(((l).type & DWARF_LOC_TYPE_REG) != 0)
-# define DWARF_IS_FP_LOC(l)	(((l).type & DWARF_LOC_TYPE_FP) != 0)
-# define DWARF_REG_LOC(c,r)	DWARF_LOC((r), DWARF_LOC_TYPE_REG)
-# define DWARF_MEM_LOC(c,m)	DWARF_LOC ((m), 0)
-# define DWARF_FPREG_LOC(c,r)	DWARF_LOC((r), (DWARF_LOC_TYPE_REG	\
-						| DWARF_LOC_TYPE_FP))
+# define DWARF_LOC_TYPE_FP      (1 << 0)
+# define DWARF_LOC_TYPE_REG     (1 << 1)
+# define DWARF_NULL_LOC         DWARF_LOC (0, 0)
+# define DWARF_IS_NULL_LOC(l)                                           \
+                ({ dwarf_loc_t _l = (l); _l.val == 0 && _l.type == 0; })
+# define DWARF_LOC(r, t)        ((dwarf_loc_t) { .val = (r), .type = (t) })
+# define DWARF_IS_REG_LOC(l)    (((l).type & DWARF_LOC_TYPE_REG) != 0)
+# define DWARF_IS_FP_LOC(l)     (((l).type & DWARF_LOC_TYPE_FP) != 0)
+# define DWARF_REG_LOC(c,r)     DWARF_LOC((r), DWARF_LOC_TYPE_REG)
+# define DWARF_MEM_LOC(c,m)     DWARF_LOC ((m), 0)
+# define DWARF_FPREG_LOC(c,r)   DWARF_LOC((r), (DWARF_LOC_TYPE_REG      \
+                                                | DWARF_LOC_TYPE_FP))
 
 static inline int
 dwarf_getfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t *val)
@@ -139,15 +147,15 @@ dwarf_getfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t *val)
 
   if (DWARF_IS_REG_LOC (loc))
     return (*c->as->acc.access_fpreg) (c->as, DWARF_GET_LOC (loc),
-				       val, 0, c->as_arg);
+                                       val, 0, c->as_arg);
 
   addr = DWARF_GET_LOC (loc);
   if ((ret = (*c->as->acc.access_mem) (c->as, addr + 0, (unw_word_t *) valp,
-				       0, c->as_arg)) < 0)
+                                       0, c->as_arg)) < 0)
     return ret;
 
   return (*c->as->acc.access_mem) (c->as, addr + 4, (unw_word_t *) valp + 1, 0,
-				   c->as_arg);
+                                   c->as_arg);
 }
 
 static inline int
@@ -162,15 +170,15 @@ dwarf_putfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t val)
 
   if (DWARF_IS_REG_LOC (loc))
     return (*c->as->acc.access_fpreg) (c->as, DWARF_GET_LOC (loc),
-				       &val, 1, c->as_arg);
+                                       &val, 1, c->as_arg);
 
   addr = DWARF_GET_LOC (loc);
   if ((ret = (*c->as->acc.access_mem) (c->as, addr + 0, (unw_word_t *) valp,
-				       1, c->as_arg)) < 0)
+                                       1, c->as_arg)) < 0)
     return ret;
 
   return (*c->as->acc.access_mem) (c->as, addr + 4, (unw_word_t *) valp + 1,
-				   1, c->as_arg);
+                                   1, c->as_arg);
 }
 
 static inline int
@@ -187,10 +195,10 @@ dwarf_get (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t *val)
 
   if (DWARF_IS_REG_LOC (loc))
     return (*c->as->acc.access_reg) (c->as, DWARF_GET_LOC (loc), val,
-				     0, c->as_arg);
+                                     0, c->as_arg);
   else
     return (*c->as->acc.access_mem) (c->as, DWARF_GET_LOC (loc), val,
-				     0, c->as_arg);
+                                     0, c->as_arg);
 }
 
 static inline int
@@ -207,57 +215,63 @@ dwarf_put (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t val)
 
   if (DWARF_IS_REG_LOC (loc))
     return (*c->as->acc.access_reg) (c->as, DWARF_GET_LOC (loc), &val,
-				     1, c->as_arg);
+                                     1, c->as_arg);
   else
     return (*c->as->acc.access_mem) (c->as, DWARF_GET_LOC (loc), &val,
-				     1, c->as_arg);
+                                     1, c->as_arg);
 }
 
 #endif /* !UNW_LOCAL_ONLY */
 
-#define tdep_needs_initialization	UNW_OBJ(needs_initialization)
-#define tdep_init			UNW_OBJ(init)
+#define tdep_getcontext_trace           unw_getcontext
+#define tdep_init_done                  UNW_OBJ(init_done)
+#define tdep_init                       UNW_OBJ(init)
 /* Platforms that support UNW_INFO_FORMAT_TABLE need to define
    tdep_search_unwind_table.  */
-#define tdep_search_unwind_table	dwarf_search_unwind_table
-#define tdep_uc_addr			UNW_ARCH_OBJ(uc_addr)
-#define tdep_get_elf_image		UNW_ARCH_OBJ(get_elf_image)
-#define tdep_access_reg			UNW_OBJ(access_reg)
-#define tdep_access_fpreg		UNW_OBJ(access_fpreg)
-#define tdep_fetch_proc_info_post	UNW_OBJ(fetch_proc_info_post)
+#define tdep_search_unwind_table        dwarf_search_unwind_table
+#define tdep_find_unwind_table          dwarf_find_unwind_table
+#define tdep_uc_addr                    UNW_ARCH_OBJ(uc_addr)
+#define tdep_get_elf_image              UNW_ARCH_OBJ(get_elf_image)
+#define tdep_access_reg                 UNW_OBJ(access_reg)
+#define tdep_access_fpreg               UNW_OBJ(access_fpreg)
+#define tdep_fetch_frame(c,ip,n)        do {} while(0)
+#define tdep_cache_frame(c,rs)          do {} while(0)
+#define tdep_reuse_frame(c,rs)          do {} while(0)
+#define tdep_stash_frame(c,rs)          do {} while(0)
+#define tdep_trace(cur,addr,n)          (-UNW_ENOINFO)
 
 #ifdef UNW_LOCAL_ONLY
-# define tdep_find_proc_info(c,ip,n)				\
-	dwarf_find_proc_info((c)->as, (ip), &(c)->pi, (n),	\
-				       (c)->as_arg)
-# define tdep_put_unwind_info(c,pi)				\
-	dwarf_put_unwind_info((c)->as, (pi), (c)->as_arg)
+# define tdep_find_proc_info(c,ip,n)                            \
+        dwarf_find_proc_info((c)->as, (ip), &(c)->pi, (n),      \
+                                       (c)->as_arg)
+# define tdep_put_unwind_info(as,pi,arg)                \
+        dwarf_put_unwind_info((as), (pi), (arg))
 #else
-# define tdep_find_proc_info(c,ip,n)					\
-	(*(c)->as->acc.find_proc_info)((c)->as, (ip), &(c)->pi, (n),	\
-				       (c)->as_arg)
-# define tdep_put_unwind_info(c,pi)					\
-	(*(c)->as->acc.put_unwind_info)((c)->as, (pi), (c)->as_arg)
+# define tdep_find_proc_info(c,ip,n)                                    \
+        (*(c)->as->acc.find_proc_info)((c)->as, (ip), &(c)->pi, (n),    \
+                                       (c)->as_arg)
+# define tdep_put_unwind_info(as,pi,arg)                \
+        (*(as)->acc.put_unwind_info)((as), (pi), (arg))
 #endif
-#define tdep_fetch_proc_info_post(c, ip, need_unwind_info) 0
 
-#define tdep_get_as(c)			((c)->dwarf.as)
-#define tdep_get_as_arg(c)		((c)->dwarf.as_arg)
-#define tdep_get_ip(c)			((c)->dwarf.ip)
-#define tdep_big_endian(as)		1
+#define tdep_get_as(c)                  ((c)->dwarf.as)
+#define tdep_get_as_arg(c)              ((c)->dwarf.as_arg)
+#define tdep_get_ip(c)                  ((c)->dwarf.ip)
+#define tdep_big_endian(as)             1
 
-extern int tdep_needs_initialization;
+extern int tdep_init_done;
 
 extern void tdep_init (void);
 extern int tdep_search_unwind_table (unw_addr_space_t as, unw_word_t ip,
-				     unw_dyn_info_t *di, unw_proc_info_t *pi,
-				     int need_unwind_info, void *arg);
+                                     unw_dyn_info_t *di, unw_proc_info_t *pi,
+                                     int need_unwind_info, void *arg);
 extern void *tdep_uc_addr (ucontext_t *uc, int reg);
 extern int tdep_get_elf_image (struct elf_image *ei, pid_t pid, unw_word_t ip,
-			       unsigned long *segbase, unsigned long *mapoff);
+                               unsigned long *segbase, unsigned long *mapoff,
+                               char *path, size_t pathlen);
 extern int tdep_access_reg (struct cursor *c, unw_regnum_t reg,
-			    unw_word_t *valp, int write);
+                            unw_word_t *valp, int write);
 extern int tdep_access_fpreg (struct cursor *c, unw_regnum_t reg,
-			      unw_fpreg_t *valp, int write);
+                              unw_fpreg_t *valp, int write);
 
 #endif /* HPPA_LIBUNWIND_I_H */
diff --git a/frysk-imports/libunwind/include/tdep-ia64/jmpbuf.h b/frysk-imports/libunwind/include/tdep-ia64/jmpbuf.h
index faa1f34..d642af2 100644
--- a/frysk-imports/libunwind/include/tdep-ia64/jmpbuf.h
+++ b/frysk-imports/libunwind/include/tdep-ia64/jmpbuf.h
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -25,8 +25,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 /* Use glibc's jump-buffer indices; NPTL peeks at SP and BSP: */
 
-#define JB_SP		 0
-#define JB_RP		 8
-#define JB_BSP		17
-#define JB_MASK_SAVED	70
-#define JB_MASK		71
+#define JB_SP            0
+#define JB_RP            8
+#define JB_BSP          17
+#define JB_MASK_SAVED   70
+#define JB_MASK         71
diff --git a/frysk-imports/libunwind/include/tdep-ia64/libunwind_i.h b/frysk-imports/libunwind/include/tdep-ia64/libunwind_i.h
index b851a03..7e57c7b 100644
--- a/frysk-imports/libunwind/include/tdep-ia64/libunwind_i.h
+++ b/frysk-imports/libunwind/include/tdep-ia64/libunwind_i.h
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2001-2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -32,6 +32,12 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #include "elf64.h"
 #include "mempool.h"
 
+typedef struct
+  {
+    /* no ia64-specific fast trace */
+  }
+unw_tdep_frame_t;
+
 enum ia64_pregnum
   {
     /* primary unat: */
@@ -39,11 +45,11 @@ enum ia64_pregnum
     IA64_REG_PRI_UNAT_MEM,
 
     /* memory stack (order matters: see build_script() */
-    IA64_REG_PSP,			/* previous memory stack pointer */
+    IA64_REG_PSP,                       /* previous memory stack pointer */
     /* register stack */
-    IA64_REG_BSP,			/* register stack pointer */
+    IA64_REG_BSP,                       /* register stack pointer */
     IA64_REG_BSPSTORE,
-    IA64_REG_PFS,			/* previous function state */
+    IA64_REG_PFS,                       /* previous function state */
     IA64_REG_RNAT,
     /* instruction pointer: */
     IA64_REG_IP,
@@ -77,19 +83,19 @@ ia64_loc_t;
 
 #include "script.h"
 
-#define ABI_UNKNOWN			0
-#define ABI_LINUX			1
-#define ABI_HPUX			2
-#define ABI_FREEBSD			3
-#define ABI_OPENVMS			4
-#define ABI_NSK				5	/* Tandem/HP Non-Stop Kernel */
-#define ABI_WINDOWS			6
+#define ABI_UNKNOWN                     0
+#define ABI_LINUX                       1
+#define ABI_HPUX                        2
+#define ABI_FREEBSD                     3
+#define ABI_OPENVMS                     4
+#define ABI_NSK                         5       /* Tandem/HP Non-Stop Kernel */
+#define ABI_WINDOWS                     6
 
 struct unw_addr_space
   {
     struct unw_accessors acc;
     int big_endian;
-    int abi;	/* abi < 0 => unknown, 0 => SysV, 1 => HP-UX, 2 => Windows */
+    int abi;    /* abi < 0 => unknown, 0 => SysV, 1 => HP-UX, 2 => Windows */
     unw_caching_policy_t caching_policy;
 #ifdef HAVE_ATOMIC_OPS_H
     AO_t cache_generation;
@@ -97,7 +103,7 @@ struct unw_addr_space
     uint32_t cache_generation;
 #endif
     unw_word_t dyn_generation;
-    unw_word_t dyn_info_list_addr;	/* (cached) dyn_info_list_addr */
+    unw_word_t dyn_info_list_addr;      /* (cached) dyn_info_list_addr */
 #ifndef UNW_REMOTE_ONLY
     unsigned long long shared_object_removals;
 #endif
@@ -107,47 +113,47 @@ struct unw_addr_space
 
 /* Note: The ABI numbers in the ABI-markers (.unwabi directive) are
    not the same as the above ABI numbers.  */
-#define ABI_MARKER_OLD_LINUX_SIGTRAMP	((0 << 8) | 's')
-#define ABI_MARKER_OLD_LINUX_INTERRUPT	((0 << 8) | 'i')
-#define ABI_MARKER_HP_UX_SIGTRAMP	((1 << 8) | 1)
-#define ABI_MARKER_LINUX_SIGTRAMP	((3 << 8) | 's')
-#define ABI_MARKER_LINUX_INTERRUPT	((3 << 8) | 'i')
+#define ABI_MARKER_OLD_LINUX_SIGTRAMP   ((0 << 8) | 's')
+#define ABI_MARKER_OLD_LINUX_INTERRUPT  ((0 << 8) | 'i')
+#define ABI_MARKER_HP_UX_SIGTRAMP       ((1 << 8) | 1)
+#define ABI_MARKER_LINUX_SIGTRAMP       ((3 << 8) | 's')
+#define ABI_MARKER_LINUX_INTERRUPT      ((3 << 8) | 'i')
 
 struct cursor
   {
-    void *as_arg;		/* argument to address-space callbacks */
-    unw_addr_space_t as;	/* reference to per-address-space info */
+    void *as_arg;               /* argument to address-space callbacks */
+    unw_addr_space_t as;        /* reference to per-address-space info */
 
     /* IP, CFM, and predicate cache (these are always equal to the
        values stored in ip_loc, cfm_loc, and pr_loc,
        respectively).  */
-    unw_word_t ip;		/* instruction pointer value */
-    unw_word_t cfm;		/* current frame mask */
-    unw_word_t pr;		/* current predicate values */
+    unw_word_t ip;              /* instruction pointer value */
+    unw_word_t cfm;             /* current frame mask */
+    unw_word_t pr;              /* current predicate values */
 
     /* current frame info: */
-    unw_word_t bsp;		/* backing store pointer value */
-    unw_word_t sp;		/* stack pointer value */
-    unw_word_t psp;		/* previous sp value */
-    ia64_loc_t cfm_loc;		/* cfm save location (or NULL) */
-    ia64_loc_t ec_loc;		/* ar.ec save location (usually cfm_loc) */
+    unw_word_t bsp;             /* backing store pointer value */
+    unw_word_t sp;              /* stack pointer value */
+    unw_word_t psp;             /* previous sp value */
+    ia64_loc_t cfm_loc;         /* cfm save location (or NULL) */
+    ia64_loc_t ec_loc;          /* ar.ec save location (usually cfm_loc) */
     ia64_loc_t loc[IA64_NUM_PREGS];
 
-    unw_word_t eh_args[4];	/* exception handler arguments */
-    unw_word_t sigcontext_addr;	/* address of sigcontext or 0 */
-    unw_word_t sigcontext_off;	/* sigcontext-offset relative to signal sp */
+    unw_word_t eh_args[4];      /* exception handler arguments */
+    unw_word_t sigcontext_addr; /* address of sigcontext or 0 */
+    unw_word_t sigcontext_off;  /* sigcontext-offset relative to signal sp */
 
     short hint;
     short prev_script;
 
-    uint8_t nat_bitnr[4];	/* NaT bit numbers for r4-r7 */
-    uint16_t abi_marker;	/* abi_marker for current frame (if any) */
-    uint16_t last_abi_marker;	/* last abi_marker encountered so far */
+    uint8_t nat_bitnr[4];       /* NaT bit numbers for r4-r7 */
+    uint16_t abi_marker;        /* abi_marker for current frame (if any) */
+    uint16_t last_abi_marker;   /* last abi_marker encountered so far */
     uint8_t eh_valid_mask;
 
-    unsigned int pi_valid :1;		/* is proc_info valid? */
+    unsigned int pi_valid :1;           /* is proc_info valid? */
     unsigned int pi_is_dynamic :1; /* proc_info found via dynamic proc info? */
-    unw_proc_info_t pi;		/* info about current procedure */
+    unw_proc_info_t pi;         /* info about current procedure */
 
     /* In case of stack-discontiguities, such as those introduced by
        signal-delivery on an alternate signal-stack (see
@@ -165,22 +171,22 @@ struct cursor
        register may not have gotten spilled until much later, when a
        possibly different rbs-area might have been in effect
        already.  */
-    uint8_t rbs_curr;		/* index of curr. rbs-area (contains c->bsp) */
-    uint8_t rbs_left_edge;	/* index of inner-most valid rbs-area */
+    uint8_t rbs_curr;           /* index of curr. rbs-area (contains c->bsp) */
+    uint8_t rbs_left_edge;      /* index of inner-most valid rbs-area */
     struct rbs_area
       {
-	unw_word_t end;
-	unw_word_t size;
-	ia64_loc_t rnat_loc;
+        unw_word_t end;
+        unw_word_t size;
+        ia64_loc_t rnat_loc;
       }
-    rbs_area[96 + 2];	/* 96 stacked regs + 1 extra stack on each side... */
+    rbs_area[96 + 2];   /* 96 stacked regs + 1 extra stack on each side... */
 };
 
 struct ia64_global_unwind_state
   {
-    pthread_mutex_t lock;		/* global data lock */
+    pthread_mutex_t lock;               /* global data lock */
 
-    volatile char needs_initialization;
+    volatile char init_done;
 
     /* Table of registers that prologues can save (and order in which
        they're saved).  */
@@ -194,9 +200,9 @@ struct ia64_global_unwind_state
      */
     struct
       {
-	unw_word_t  r0;			/* r0 is byte-order neutral */
-	unw_fpreg_t f0;			/* f0 is byte-order neutral */
-	unw_fpreg_t f1_le, f1_be;	/* f1 is byte-order dependent */
+        unw_word_t  r0;                 /* r0 is byte-order neutral */
+        unw_fpreg_t f0;                 /* f0 is byte-order neutral */
+        unw_fpreg_t f1_le, f1_be;       /* f1 is byte-order dependent */
       }
     read_only;
     unw_fpreg_t nat_val_le, nat_val_be;
@@ -210,53 +216,64 @@ struct ia64_global_unwind_state
 # endif
   };
 
-#define tdep_needs_initialization	unw.needs_initialization
-#define tdep_init			UNW_OBJ(init)
+#define tdep_getcontext_trace           unw_getcontext
+#define tdep_init_done                  unw.init_done
+#define tdep_init                       UNW_OBJ(init)
 /* Platforms that support UNW_INFO_FORMAT_TABLE need to define
    tdep_search_unwind_table.  */
-#define tdep_search_unwind_table	unw_search_ia64_unwind_table
-#define tdep_find_proc_info		UNW_OBJ(find_proc_info)
-#define tdep_uc_addr			UNW_OBJ(uc_addr)
-#define tdep_get_elf_image		UNW_ARCH_OBJ(get_elf_image)
-#define tdep_access_reg			UNW_OBJ(access_reg)
-#define tdep_access_fpreg		UNW_OBJ(access_fpreg)
-#define tdep_get_as(c)			((c)->as)
-#define tdep_get_as_arg(c)		((c)->as_arg)
-#define tdep_get_ip(c)			((c)->ip)
-#define tdep_big_endian(as)		((c)->as->big_endian != 0)
+#define tdep_search_unwind_table        unw_search_ia64_unwind_table
+#define tdep_find_unwind_table  ia64_find_unwind_table
+#define tdep_find_proc_info             UNW_OBJ(find_proc_info)
+#define tdep_uc_addr                    UNW_OBJ(uc_addr)
+#define tdep_get_elf_image              UNW_ARCH_OBJ(get_elf_image)
+#define tdep_access_reg                 UNW_OBJ(access_reg)
+#define tdep_access_fpreg               UNW_OBJ(access_fpreg)
+#define tdep_fetch_frame(c,ip,n)        do {} while(0)
+#define tdep_cache_frame(c,rs)          do {} while(0)
+#define tdep_reuse_frame(c,rs)          do {} while(0)
+#define tdep_stash_frame(c,rs)          do {} while(0)
+#define tdep_trace(cur,addr,n)          (-UNW_ENOINFO)
+#define tdep_get_as(c)                  ((c)->as)
+#define tdep_get_as_arg(c)              ((c)->as_arg)
+#define tdep_get_ip(c)                  ((c)->ip)
+#define tdep_big_endian(as)             ((c)->as->big_endian != 0)
 
 #ifndef UNW_LOCAL_ONLY
-# define tdep_put_unwind_info		UNW_OBJ(put_unwind_info)
+# define tdep_put_unwind_info           UNW_OBJ(put_unwind_info)
 #endif
 
 /* This can't be an UNW_ARCH_OBJ() because we need separate
    unw.initialized flags for the local-only and generic versions of
    the library.  Also, if we wanted to have a single, shared global
    data structure, we couldn't declare "unw" as HIDDEN/PROTECTED.  */
-#define unw				UNW_OBJ(data)
+#define unw                             UNW_OBJ(data)
 
 extern void tdep_init (void);
+extern int tdep_find_unwind_table (struct elf_dyn_info *edi,
+                                   unw_addr_space_t as, char *path,
+                                   unw_word_t segbase, unw_word_t mapoff,
+                                   unw_word_t ip);
 extern int tdep_find_proc_info (unw_addr_space_t as, unw_word_t ip,
-				unw_proc_info_t *pi, int need_unwind_info,
-				void *arg);
-#define tdep_fetch_proc_info_post(c, ip, need_unwind_info) 0
+                                unw_proc_info_t *pi, int need_unwind_info,
+                                void *arg);
 extern void tdep_put_unwind_info (unw_addr_space_t as,
-				  unw_proc_info_t *pi, void *arg);
+                                  unw_proc_info_t *pi, void *arg);
 extern void *tdep_uc_addr (ucontext_t *uc, unw_regnum_t regnum,
-			   uint8_t *nat_bitnr);
+                           uint8_t *nat_bitnr);
 extern int tdep_get_elf_image (struct elf_image *ei, pid_t pid, unw_word_t ip,
-			       unsigned long *segbase, unsigned long *mapoff);
+                               unsigned long *segbase, unsigned long *mapoff,
+                               char *path, size_t pathlen);
 extern int tdep_access_reg (struct cursor *c, unw_regnum_t reg,
-			    unw_word_t *valp, int write);
+                            unw_word_t *valp, int write);
 extern int tdep_access_fpreg (struct cursor *c, unw_regnum_t reg,
-			      unw_fpreg_t *valp, int write);
+                              unw_fpreg_t *valp, int write);
 
 extern struct ia64_global_unwind_state unw;
 
 /* In user-level, we have no reasonable way of determining the base of
    an arbitrary backing-store.  We default to half the
    address-space.  */
-#define rbs_get_base(c,bspstore,rbs_basep)				\
-	(*(rbs_basep) = (bspstore) - (((unw_word_t) 1) << 63), 0)
+#define rbs_get_base(c,bspstore,rbs_basep)                              \
+        (*(rbs_basep) = (bspstore) - (((unw_word_t) 1) << 63), 0)
 
 #endif /* IA64_LIBUNWIND_I_H */
diff --git a/frysk-imports/libunwind/include/tdep-ia64/rse.h b/frysk-imports/libunwind/include/tdep-ia64/rse.h
index c5fe4b5..ee521a5 100644
--- a/frysk-imports/libunwind/include/tdep-ia64/rse.h
+++ b/frysk-imports/libunwind/include/tdep-ia64/rse.h
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 1998, 1999, 2002, 2003, 2005 Hewlett-Packard Co
- *	David Mosberger-Tang <davidm@hpl.hp.com>
+ *      David Mosberger-Tang <davidm@hpl.hp.com>
  *
  * Register stack engine related helper functions.  This file may be
  * used in applications, so be careful about the name-space and give
@@ -15,7 +15,7 @@
 static inline uint64_t
 rse_slot_num (uint64_t addr)
 {
-	return (addr >> 3) & 0x3f;
+        return (addr >> 3) & 0x3f;
 }
 
 /*
@@ -24,7 +24,7 @@ rse_slot_num (uint64_t addr)
 static inline uint64_t
 rse_is_rnat_slot (uint64_t addr)
 {
-	return rse_slot_num (addr) == 0x3f;
+        return rse_slot_num (addr) == 0x3f;
 }
 
 /*
@@ -34,7 +34,7 @@ rse_is_rnat_slot (uint64_t addr)
 static inline uint64_t
 rse_rnat_addr (uint64_t slot_addr)
 {
-	return slot_addr | (0x3f << 3);
+        return slot_addr | (0x3f << 3);
 }
 
 /*
@@ -45,9 +45,9 @@ rse_rnat_addr (uint64_t slot_addr)
 static inline uint64_t
 rse_num_regs (uint64_t bspstore, uint64_t bsp)
 {
-	uint64_t slots = (bsp - bspstore) >> 3;
+        uint64_t slots = (bsp - bspstore) >> 3;
 
-	return slots - (rse_slot_num(bspstore) + slots)/0x40;
+        return slots - (rse_slot_num(bspstore) + slots)/0x40;
 }
 
 /*
@@ -57,11 +57,11 @@ rse_num_regs (uint64_t bspstore, uint64_t bsp)
 static inline uint64_t
 rse_skip_regs (uint64_t addr, long num_regs)
 {
-	long delta = rse_slot_num(addr) + num_regs;
+        long delta = rse_slot_num(addr) + num_regs;
 
-	if (num_regs < 0)
-		delta -= 0x3e;
-	return addr + ((num_regs + delta/0x3f) << 3);
+        if (num_regs < 0)
+                delta -= 0x3e;
+        return addr + ((num_regs + delta/0x3f) << 3);
 }
 
 #endif /* RSE_H */
diff --git a/frysk-imports/libunwind/include/tdep-ia64/script.h b/frysk-imports/libunwind/include/tdep-ia64/script.h
index 48a9fe5..fe3360b 100644
--- a/frysk-imports/libunwind/include/tdep-ia64/script.h
+++ b/frysk-imports/libunwind/include/tdep-ia64/script.h
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2001-2002 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -23,17 +23,17 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
-#define IA64_LOG_UNW_CACHE_SIZE	7
-#define IA64_UNW_CACHE_SIZE	(1 << IA64_LOG_UNW_CACHE_SIZE)
+#define IA64_LOG_UNW_CACHE_SIZE 7
+#define IA64_UNW_CACHE_SIZE     (1 << IA64_LOG_UNW_CACHE_SIZE)
 
-#define IA64_LOG_UNW_HASH_SIZE	(IA64_LOG_UNW_CACHE_SIZE + 1)
-#define IA64_UNW_HASH_SIZE	(1 << IA64_LOG_UNW_HASH_SIZE)
+#define IA64_LOG_UNW_HASH_SIZE  (IA64_LOG_UNW_CACHE_SIZE + 1)
+#define IA64_UNW_HASH_SIZE      (1 << IA64_LOG_UNW_HASH_SIZE)
 
 typedef unsigned char unw_hash_index_t;
 
 struct ia64_script_insn
   {
-    unsigned int opc;		/* see enum ia64_script_insn_opcode */
+    unsigned int opc;           /* see enum ia64_script_insn_opcode */
     unsigned int dst;
     unw_word_t val;
   };
@@ -41,18 +41,18 @@ struct ia64_script_insn
 /* Updating each preserved register may result in one script
    instruction each.  At the end of the script, psp gets popped,
    accounting for one more instruction.  */
-#define IA64_MAX_SCRIPT_LEN	(IA64_NUM_PREGS + 1)
+#define IA64_MAX_SCRIPT_LEN     (IA64_NUM_PREGS + 1)
 
 struct ia64_script
   {
-    unw_word_t ip;		/* ip this script is for */
-    unw_word_t pr_mask;		/* mask of predicates script depends on */
-    unw_word_t pr_val;		/* predicate values this script is for */
-    unw_proc_info_t pi;		/* info about underlying procedure */
-    unsigned short lru_chain;	/* used for least-recently-used chain */
-    unsigned short coll_chain;	/* used for hash collisions */
-    unsigned short hint;	/* hint for next script to try (or -1) */
-    unsigned short count;	/* number of instructions in script */
+    unw_word_t ip;              /* ip this script is for */
+    unw_word_t pr_mask;         /* mask of predicates script depends on */
+    unw_word_t pr_val;          /* predicate values this script is for */
+    unw_proc_info_t pi;         /* info about underlying procedure */
+    unsigned short lru_chain;   /* used for least-recently-used chain */
+    unsigned short coll_chain;  /* used for hash collisions */
+    unsigned short hint;        /* hint for next script to try (or -1) */
+    unsigned short count;       /* number of instructions in script */
     unsigned short abi_marker;
     struct ia64_script_insn insn[IA64_MAX_SCRIPT_LEN];
   };
@@ -60,26 +60,26 @@ struct ia64_script
 struct ia64_script_cache
   {
 #ifdef HAVE_ATOMIC_OPS_H
-    AO_TS_t busy;		/* is the script-cache busy? */
+    AO_TS_t busy;               /* is the script-cache busy? */
 #else
     pthread_mutex_t lock;
 #endif
-    unsigned short lru_head;	/* index of lead-recently used script */
-    unsigned short lru_tail;	/* index of most-recently used script */
+    unsigned short lru_head;    /* index of lead-recently used script */
+    unsigned short lru_tail;    /* index of most-recently used script */
 
     /* hash table that maps instruction pointer to script index: */
     unsigned short hash[IA64_UNW_HASH_SIZE];
 
-    uint32_t generation;	/* generation number */
+    uint32_t generation;        /* generation number */
 
     /* script cache: */
     struct ia64_script buckets[IA64_UNW_CACHE_SIZE];
   };
 
-#define ia64_cache_proc_info		UNW_OBJ(cache_proc_info)
-#define ia64_get_cached_proc_info	UNW_OBJ(get_cached_proc_info)
+#define ia64_cache_proc_info            UNW_OBJ(cache_proc_info)
+#define ia64_get_cached_proc_info       UNW_OBJ(get_cached_proc_info)
 
-struct cursor;			/* forward declaration */
+struct cursor;                  /* forward declaration */
 
 extern int ia64_cache_proc_info (struct cursor *c);
 extern int ia64_get_cached_proc_info (struct cursor *c);
diff --git a/frysk-imports/libunwind/include/tdep-mips/dwarf-config.h b/frysk-imports/libunwind/include/tdep-mips/dwarf-config.h
index 250746f..8006d0b 100644
--- a/frysk-imports/libunwind/include/tdep-mips/dwarf-config.h
+++ b/frysk-imports/libunwind/include/tdep-mips/dwarf-config.h
@@ -1,5 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2008 CodeSourcery
+   Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com>
 
 This file is part of libunwind.
 
@@ -27,26 +28,25 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 /* This is FIRST_PSEUDO_REGISTER in GCC, since DWARF_FRAME_REGISTERS is not
    explicitly defined.  */
-#define DWARF_NUM_PRESERVED_REGS	188
+#define DWARF_NUM_PRESERVED_REGS        188
 
-/* FIXME: Probably unnecessary on MIPS.  See mips/Gglobal.c.  */
-#define DWARF_REGNUM_MAP_LENGTH		32
+#define dwarf_to_unw_regnum(reg) (((reg) < 32) ? (reg) : 0)
 
 /* Return TRUE if the ADDR_SPACE uses big-endian byte-order.  */
-#define dwarf_is_big_endian(addr_space)	((addr_space)->big_endian)
+#define dwarf_is_big_endian(addr_space) ((addr_space)->big_endian)
 
 /* Return the size of an address, for DWARF purposes.  */
 #define dwarf_addr_size(addr_space) ((addr_space)->addr_size)
 
 /* Convert a pointer to a dwarf_cursor structure to a pointer to
    unw_cursor_t.  */
-#define dwarf_to_cursor(c)	((unw_cursor_t *) (c))
+#define dwarf_to_cursor(c)      ((unw_cursor_t *) (c))
 
 typedef struct dwarf_loc
   {
     unw_word_t val;
 #ifndef UNW_LOCAL_ONLY
-    unw_word_t type;		/* see DWARF_LOC_TYPE_* macros.  */
+    unw_word_t type;            /* see DWARF_LOC_TYPE_* macros.  */
 #endif
   }
 dwarf_loc_t;
diff --git a/frysk-imports/libunwind/include/tdep-mips/jmpbuf.h b/frysk-imports/libunwind/include/tdep-mips/jmpbuf.h
index 1adb2bc..c099f92 100644
--- a/frysk-imports/libunwind/include/tdep-mips/jmpbuf.h
+++ b/frysk-imports/libunwind/include/tdep-mips/jmpbuf.h
@@ -26,7 +26,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 /* FIXME for MIPS!  */
 
-#define JB_SP		4
-#define JB_RP		5
-#define JB_MASK_SAVED	6
-#define JB_MASK		7
+#define JB_SP           4
+#define JB_RP           5
+#define JB_MASK_SAVED   6
+#define JB_MASK         7
diff --git a/frysk-imports/libunwind/include/tdep-mips/libunwind_i.h b/frysk-imports/libunwind/include/tdep-mips/libunwind_i.h
index c2f756a..d11894d 100644
--- a/frysk-imports/libunwind/include/tdep-mips/libunwind_i.h
+++ b/frysk-imports/libunwind/include/tdep-mips/libunwind_i.h
@@ -39,6 +39,12 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #include "mempool.h"
 #include "dwarf.h"
 
+typedef struct
+  {
+    /* no mips-specific fast trace */
+  }
+unw_tdep_frame_t;
+
 struct unw_addr_space
   {
     struct unw_accessors acc;
@@ -53,21 +59,21 @@ struct unw_addr_space
 #else
     uint32_t cache_generation;
 #endif
-    unw_word_t dyn_generation;		/* see dyn-common.h */
-    unw_word_t dyn_info_list_addr;	/* (cached) dyn_info_list_addr */
+    unw_word_t dyn_generation;          /* see dyn-common.h */
+    unw_word_t dyn_info_list_addr;      /* (cached) dyn_info_list_addr */
     struct dwarf_rs_cache global_cache;
     struct unw_debug_frame_list *debug_frames;
 };
 
-#define tdep_big_endian(as)		((as)->big_endian)
+#define tdep_big_endian(as)             ((as)->big_endian)
 
 struct cursor
   {
-    struct dwarf_cursor dwarf;		/* must be first */
+    struct dwarf_cursor dwarf;          /* must be first */
     unw_word_t sigcontext_addr;
   };
 
-#define DWARF_GET_LOC(l)	((l).val)
+#define DWARF_GET_LOC(l)        ((l).val)
 
 #ifndef UNW_REMOTE_ONLY
 # if _MIPS_SIM == _ABIN32
@@ -78,15 +84,15 @@ typedef long mips_reg_t;
 #endif
 
 #ifdef UNW_LOCAL_ONLY
-# define DWARF_NULL_LOC		DWARF_LOC (0, 0)
-# define DWARF_IS_NULL_LOC(l)	(DWARF_GET_LOC (l) == 0)
-# define DWARF_LOC(r, t)	((dwarf_loc_t) { .val = (r) })
-# define DWARF_IS_REG_LOC(l)	0
-# define DWARF_REG_LOC(c,r)	(DWARF_LOC((unw_word_t) (intptr_t)	     \
-				 tdep_uc_addr((c)->as_arg, (r)), 0))
-# define DWARF_MEM_LOC(c,m)	DWARF_LOC ((m), 0)
-# define DWARF_FPREG_LOC(c,r)	(DWARF_LOC((unw_word_t) (intptr_t)	     \
-				 tdep_uc_addr((c)->as_arg, (r)), 0))
+# define DWARF_NULL_LOC         DWARF_LOC (0, 0)
+# define DWARF_IS_NULL_LOC(l)   (DWARF_GET_LOC (l) == 0)
+# define DWARF_LOC(r, t)        ((dwarf_loc_t) { .val = (r) })
+# define DWARF_IS_REG_LOC(l)    0
+# define DWARF_REG_LOC(c,r)     (DWARF_LOC((unw_word_t) (intptr_t)           \
+                                 tdep_uc_addr((c)->as_arg, (r)), 0))
+# define DWARF_MEM_LOC(c,m)     DWARF_LOC ((m), 0)
+# define DWARF_FPREG_LOC(c,r)   (DWARF_LOC((unw_word_t) (intptr_t)           \
+                                 tdep_uc_addr((c)->as_arg, (r)), 0))
 
 /* FIXME: Implement these for the MIPS FPU.  */
 static inline int
@@ -126,18 +132,18 @@ dwarf_put (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t val)
 }
 
 #else /* !UNW_LOCAL_ONLY */
-# define DWARF_LOC_TYPE_FP	(1 << 0)
-# define DWARF_LOC_TYPE_REG	(1 << 1)
-# define DWARF_NULL_LOC		DWARF_LOC (0, 0)
-# define DWARF_IS_NULL_LOC(l)						\
-		({ dwarf_loc_t _l = (l); _l.val == 0 && _l.type == 0; })
-# define DWARF_LOC(r, t)	((dwarf_loc_t) { .val = (r), .type = (t) })
-# define DWARF_IS_REG_LOC(l)	(((l).type & DWARF_LOC_TYPE_REG) != 0)
-# define DWARF_IS_FP_LOC(l)	(((l).type & DWARF_LOC_TYPE_FP) != 0)
-# define DWARF_REG_LOC(c,r)	DWARF_LOC((r), DWARF_LOC_TYPE_REG)
-# define DWARF_MEM_LOC(c,m)	DWARF_LOC ((m), 0)
-# define DWARF_FPREG_LOC(c,r)	DWARF_LOC((r), (DWARF_LOC_TYPE_REG	\
-						| DWARF_LOC_TYPE_FP))
+# define DWARF_LOC_TYPE_FP      (1 << 0)
+# define DWARF_LOC_TYPE_REG     (1 << 1)
+# define DWARF_NULL_LOC         DWARF_LOC (0, 0)
+# define DWARF_IS_NULL_LOC(l)                                           \
+                ({ dwarf_loc_t _l = (l); _l.val == 0 && _l.type == 0; })
+# define DWARF_LOC(r, t)        ((dwarf_loc_t) { .val = (r), .type = (t) })
+# define DWARF_IS_REG_LOC(l)    (((l).type & DWARF_LOC_TYPE_REG) != 0)
+# define DWARF_IS_FP_LOC(l)     (((l).type & DWARF_LOC_TYPE_FP) != 0)
+# define DWARF_REG_LOC(c,r)     DWARF_LOC((r), DWARF_LOC_TYPE_REG)
+# define DWARF_MEM_LOC(c,m)     DWARF_LOC ((m), 0)
+# define DWARF_FPREG_LOC(c,r)   DWARF_LOC((r), (DWARF_LOC_TYPE_REG      \
+                                                | DWARF_LOC_TYPE_FP))
 
 static inline int
 read_s32 (struct dwarf_cursor *c, unw_word_t addr, unw_word_t *val)
@@ -190,15 +196,15 @@ dwarf_getfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t *val)
 
   if (DWARF_IS_REG_LOC (loc))
     return (*c->as->acc.access_fpreg) (c->as, DWARF_GET_LOC (loc),
-				       val, 0, c->as_arg);
+                                       val, 0, c->as_arg);
 
   addr = DWARF_GET_LOC (loc);
   if ((ret = (*c->as->acc.access_mem) (c->as, addr + 0, (unw_word_t *) valp,
-				       0, c->as_arg)) < 0)
+                                       0, c->as_arg)) < 0)
     return ret;
 
   return (*c->as->acc.access_mem) (c->as, addr + 4, (unw_word_t *) valp + 1, 0,
-				   c->as_arg);
+                                   c->as_arg);
 }
 
 static inline int
@@ -213,15 +219,15 @@ dwarf_putfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t val)
 
   if (DWARF_IS_REG_LOC (loc))
     return (*c->as->acc.access_fpreg) (c->as, DWARF_GET_LOC (loc),
-				       &val, 1, c->as_arg);
+                                       &val, 1, c->as_arg);
 
   addr = DWARF_GET_LOC (loc);
   if ((ret = (*c->as->acc.access_mem) (c->as, addr + 0, (unw_word_t *) valp,
-				       1, c->as_arg)) < 0)
+                                       1, c->as_arg)) < 0)
     return ret;
 
   return (*c->as->acc.access_mem) (c->as, addr + 4, (unw_word_t *) valp + 1,
-				   1, c->as_arg);
+                                   1, c->as_arg);
 }
 
 static inline int
@@ -238,12 +244,12 @@ dwarf_get (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t *val)
 
   if (DWARF_IS_REG_LOC (loc))
     return (*c->as->acc.access_reg) (c->as, DWARF_GET_LOC (loc), val,
-				     0, c->as_arg);
+                                     0, c->as_arg);
   else if (c->as->abi == UNW_MIPS_ABI_O32)
     return read_s32 (c, DWARF_GET_LOC (loc), val);
   else
     return (*c->as->acc.access_mem) (c->as, DWARF_GET_LOC (loc), val,
-				     0, c->as_arg);
+                                     0, c->as_arg);
 }
 
 static inline int
@@ -260,56 +266,64 @@ dwarf_put (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t val)
 
   if (DWARF_IS_REG_LOC (loc))
     return (*c->as->acc.access_reg) (c->as, DWARF_GET_LOC (loc), &val,
-				     1, c->as_arg);
+                                     1, c->as_arg);
   else if (c->as->abi == UNW_MIPS_ABI_O32)
     return write_s32 (c, DWARF_GET_LOC (loc), &val);
   else
     return (*c->as->acc.access_mem) (c->as, DWARF_GET_LOC (loc), &val,
-				     1, c->as_arg);
+                                     1, c->as_arg);
 }
 
 #endif /* !UNW_LOCAL_ONLY */
 
-#define tdep_needs_initialization	UNW_OBJ(needs_initialization)
-#define tdep_init			UNW_OBJ(init)
+#define tdep_getcontext_trace           unw_getcontext
+#define tdep_init_done                  UNW_OBJ(init_done)
+#define tdep_init                       UNW_OBJ(init)
 /* Platforms that support UNW_INFO_FORMAT_TABLE need to define
    tdep_search_unwind_table.  */
-#define tdep_search_unwind_table	dwarf_search_unwind_table
-#define tdep_uc_addr			UNW_ARCH_OBJ(uc_addr)
-#define tdep_get_elf_image		UNW_ARCH_OBJ(get_elf_image)
-#define tdep_access_reg			UNW_OBJ(access_reg)
-#define tdep_access_fpreg		UNW_OBJ(access_fpreg)
+#define tdep_search_unwind_table        dwarf_search_unwind_table
+#define tdep_find_unwind_table          dwarf_find_unwind_table
+#define tdep_uc_addr                    UNW_ARCH_OBJ(uc_addr)
+#define tdep_get_elf_image              UNW_ARCH_OBJ(get_elf_image)
+#define tdep_access_reg                 UNW_OBJ(access_reg)
+#define tdep_access_fpreg               UNW_OBJ(access_fpreg)
+#define tdep_fetch_frame(c,ip,n)        do {} while(0)
+#define tdep_cache_frame(c,rs)          do {} while(0)
+#define tdep_reuse_frame(c,rs)          do {} while(0)
+#define tdep_stash_frame(c,rs)          do {} while(0)
+#define tdep_trace(cur,addr,n)          (-UNW_ENOINFO)
 
 #ifdef UNW_LOCAL_ONLY
-# define tdep_find_proc_info(c,ip,n)				\
-	dwarf_find_proc_info((c)->as, (ip), &(c)->pi, (n),	\
-				       (c)->as_arg)
-# define tdep_put_unwind_info(as,pi,arg)		\
-	dwarf_put_unwind_info((as), (pi), (arg))
+# define tdep_find_proc_info(c,ip,n)                            \
+        dwarf_find_proc_info((c)->as, (ip), &(c)->pi, (n),      \
+                                       (c)->as_arg)
+# define tdep_put_unwind_info(as,pi,arg)                \
+        dwarf_put_unwind_info((as), (pi), (arg))
 #else
-# define tdep_find_proc_info(c,ip,n)					\
-	(*(c)->as->acc.find_proc_info)((c)->as, (ip), &(c)->pi, (n),	\
-				       (c)->as_arg)
-# define tdep_put_unwind_info(as,pi,arg)		\
-	(*(as)->acc.put_unwind_info)((as), (pi), (arg))
+# define tdep_find_proc_info(c,ip,n)                                    \
+        (*(c)->as->acc.find_proc_info)((c)->as, (ip), &(c)->pi, (n),    \
+                                       (c)->as_arg)
+# define tdep_put_unwind_info(as,pi,arg)                \
+        (*(as)->acc.put_unwind_info)((as), (pi), (arg))
 #endif
 
-#define tdep_get_as(c)			((c)->dwarf.as)
-#define tdep_get_as_arg(c)		((c)->dwarf.as_arg)
-#define tdep_get_ip(c)			((c)->dwarf.ip)
+#define tdep_get_as(c)                  ((c)->dwarf.as)
+#define tdep_get_as_arg(c)              ((c)->dwarf.as_arg)
+#define tdep_get_ip(c)                  ((c)->dwarf.ip)
 
-extern int tdep_needs_initialization;
+extern int tdep_init_done;
 
 extern void tdep_init (void);
 extern int tdep_search_unwind_table (unw_addr_space_t as, unw_word_t ip,
-				     unw_dyn_info_t *di, unw_proc_info_t *pi,
-				     int need_unwind_info, void *arg);
+                                     unw_dyn_info_t *di, unw_proc_info_t *pi,
+                                     int need_unwind_info, void *arg);
 extern void *tdep_uc_addr (ucontext_t *uc, int reg);
 extern int tdep_get_elf_image (struct elf_image *ei, pid_t pid, unw_word_t ip,
-			       unsigned long *segbase, unsigned long *mapoff);
+                               unsigned long *segbase, unsigned long *mapoff,
+                               char *path, size_t pathlen);
 extern int tdep_access_reg (struct cursor *c, unw_regnum_t reg,
-			    unw_word_t *valp, int write);
+                            unw_word_t *valp, int write);
 extern int tdep_access_fpreg (struct cursor *c, unw_regnum_t reg,
-			      unw_fpreg_t *valp, int write);
+                              unw_fpreg_t *valp, int write);
 
 #endif /* MIPS_LIBUNWIND_I_H */
diff --git a/frysk-imports/libunwind/include/tdep-ppc32/dwarf-config.h b/frysk-imports/libunwind/include/tdep-ppc32/dwarf-config.h
index e2676a8..bf6886b 100644
--- a/frysk-imports/libunwind/include/tdep-ppc32/dwarf-config.h
+++ b/frysk-imports/libunwind/include/tdep-ppc32/dwarf-config.h
@@ -33,22 +33,22 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #define dwarf_config_h
 
 /* For PPC64, 48 GPRs + 33 FPRs + 33 AltiVec + 1 SPE  */
-#define DWARF_NUM_PRESERVED_REGS	115
+#define DWARF_NUM_PRESERVED_REGS        115
 
-#define DWARF_REGNUM_MAP_LENGTH		115
+#define DWARF_REGNUM_MAP_LENGTH         115
 
 /* Return TRUE if the ADDR_SPACE uses big-endian byte-order.  */
 #define dwarf_is_big_endian(addr_space) 1
 
 /* Convert a pointer to a dwarf_cursor structure to a pointer to
    unw_cursor_t.  */
-#define dwarf_to_cursor(c)	((unw_cursor_t *) (c))
+#define dwarf_to_cursor(c)      ((unw_cursor_t *) (c))
 
 typedef struct dwarf_loc
   {
     unw_word_t val;
 #ifndef UNW_LOCAL_ONLY
-    unw_word_t type;		/* see X86_LOC_TYPE_* macros.  */
+    unw_word_t type;            /* see X86_LOC_TYPE_* macros.  */
 #endif
   }
 dwarf_loc_t;
diff --git a/frysk-imports/libunwind/include/tdep-ppc32/jmpbuf.h b/frysk-imports/libunwind/include/tdep-ppc32/jmpbuf.h
index 3780d5b..861e94d 100644
--- a/frysk-imports/libunwind/include/tdep-ppc32/jmpbuf.h
+++ b/frysk-imports/libunwind/include/tdep-ppc32/jmpbuf.h
@@ -31,7 +31,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 /* Use glibc's jump-buffer indices; NPTL peeks at SP: */
 
-#define JB_SP		6
-#define JB_RP		7
-#define JB_MASK_SAVED	8
-#define JB_MASK		9
+#define JB_SP           6
+#define JB_RP           7
+#define JB_MASK_SAVED   8
+#define JB_MASK         9
diff --git a/frysk-imports/libunwind/include/tdep-ppc32/libunwind_i.h b/frysk-imports/libunwind/include/tdep-ppc32/libunwind_i.h
index d8e500e..cc113c5 100644
--- a/frysk-imports/libunwind/include/tdep-ppc32/libunwind_i.h
+++ b/frysk-imports/libunwind/include/tdep-ppc32/libunwind_i.h
@@ -42,6 +42,12 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #include "mempool.h"
 #include "dwarf.h"
 
+typedef struct
+  {
+    /* no ppc32-specific fast trace */
+  }
+unw_tdep_frame_t;
+
 struct unw_addr_space
 {
   struct unw_accessors acc;
@@ -51,8 +57,8 @@ struct unw_addr_space
 #else
   uint32_t cache_generation;
 #endif
-  unw_word_t dyn_generation;	/* see dyn-common.h */
-  unw_word_t dyn_info_list_addr;	/* (cached) dyn_info_list_addr */
+  unw_word_t dyn_generation;    /* see dyn-common.h */
+  unw_word_t dyn_info_list_addr;        /* (cached) dyn_info_list_addr */
   struct dwarf_rs_cache global_cache;
   struct unw_debug_frame_list *debug_frames;
   int validate;
@@ -60,53 +66,53 @@ struct unw_addr_space
 
 struct cursor
 {
-  struct dwarf_cursor dwarf;	/* must be first */
+  struct dwarf_cursor dwarf;    /* must be first */
 
   /* Format of sigcontext structure and address at which it is
      stored: */
   enum
   {
-    PPC_SCF_NONE,		/* no signal frame encountered */
-    PPC_SCF_LINUX_RT_SIGFRAME	/* POSIX ucontext_t */
+    PPC_SCF_NONE,               /* no signal frame encountered */
+    PPC_SCF_LINUX_RT_SIGFRAME   /* POSIX ucontext_t */
   }
   sigcontext_format;
   unw_word_t sigcontext_addr;
 };
 
-#define DWARF_GET_LOC(l)	((l).val)
+#define DWARF_GET_LOC(l)        ((l).val)
 
 #ifdef UNW_LOCAL_ONLY
-# define DWARF_NULL_LOC		DWARF_LOC (0, 0)
-# define DWARF_IS_NULL_LOC(l)	(DWARF_GET_LOC (l) == 0)
-# define DWARF_LOC(r, t)	((dwarf_loc_t) { .val = (r) })
-# define DWARF_IS_REG_LOC(l)	0
-# define DWARF_IS_FP_LOC(l)	0
-# define DWARF_IS_V_LOC(l)	0
-# define DWARF_MEM_LOC(c,m)	DWARF_LOC ((m), 0)
-# define DWARF_REG_LOC(c,r)	(DWARF_LOC((unw_word_t)			     \
-				 tdep_uc_addr((c)->as_arg, (r)), 0))
-# define DWARF_FPREG_LOC(c,r)	(DWARF_LOC((unw_word_t)			     \
-				 tdep_uc_addr((c)->as_arg, (r)), 0))
-# define DWARF_VREG_LOC(c,r)	(DWARF_LOC((unw_word_t)			     \
-				 tdep_uc_addr((c)->as_arg, (r)), 0))
+# define DWARF_NULL_LOC         DWARF_LOC (0, 0)
+# define DWARF_IS_NULL_LOC(l)   (DWARF_GET_LOC (l) == 0)
+# define DWARF_LOC(r, t)        ((dwarf_loc_t) { .val = (r) })
+# define DWARF_IS_REG_LOC(l)    0
+# define DWARF_IS_FP_LOC(l)     0
+# define DWARF_IS_V_LOC(l)      0
+# define DWARF_MEM_LOC(c,m)     DWARF_LOC ((m), 0)
+# define DWARF_REG_LOC(c,r)     (DWARF_LOC((unw_word_t)                      \
+                                 tdep_uc_addr((c)->as_arg, (r)), 0))
+# define DWARF_FPREG_LOC(c,r)   (DWARF_LOC((unw_word_t)                      \
+                                 tdep_uc_addr((c)->as_arg, (r)), 0))
+# define DWARF_VREG_LOC(c,r)    (DWARF_LOC((unw_word_t)                      \
+                                 tdep_uc_addr((c)->as_arg, (r)), 0))
 #else /* !UNW_LOCAL_ONLY */
 
-# define DWARF_LOC_TYPE_FP	(1 << 0)
-# define DWARF_LOC_TYPE_REG	(1 << 1)
-# define DWARF_LOC_TYPE_V	(1 << 2)
-# define DWARF_NULL_LOC		DWARF_LOC (0, 0)
-# define DWARF_IS_NULL_LOC(l)						\
-		({ dwarf_loc_t _l = (l); _l.val == 0 && _l.type == 0; })
-# define DWARF_LOC(r, t)	((dwarf_loc_t) { .val = (r), .type = (t) })
-# define DWARF_IS_REG_LOC(l)	(((l).type & DWARF_LOC_TYPE_REG) != 0)
-# define DWARF_IS_FP_LOC(l)	(((l).type & DWARF_LOC_TYPE_FP) != 0)
-# define DWARF_IS_V_LOC(l)	(((l).type & DWARF_LOC_TYPE_V) != 0)
-# define DWARF_MEM_LOC(c,m)	DWARF_LOC ((m), 0)
-# define DWARF_REG_LOC(c,r)	DWARF_LOC((r), DWARF_LOC_TYPE_REG)
-# define DWARF_FPREG_LOC(c,r)	DWARF_LOC((r), (DWARF_LOC_TYPE_REG	\
-						| DWARF_LOC_TYPE_FP))
-# define DWARF_VREG_LOC(c,r)	DWARF_LOC((r), (DWARF_LOC_TYPE_REG	\
-						| DWARF_LOC_TYPE_V))
+# define DWARF_LOC_TYPE_FP      (1 << 0)
+# define DWARF_LOC_TYPE_REG     (1 << 1)
+# define DWARF_LOC_TYPE_V       (1 << 2)
+# define DWARF_NULL_LOC         DWARF_LOC (0, 0)
+# define DWARF_IS_NULL_LOC(l)                                           \
+                ({ dwarf_loc_t _l = (l); _l.val == 0 && _l.type == 0; })
+# define DWARF_LOC(r, t)        ((dwarf_loc_t) { .val = (r), .type = (t) })
+# define DWARF_IS_REG_LOC(l)    (((l).type & DWARF_LOC_TYPE_REG) != 0)
+# define DWARF_IS_FP_LOC(l)     (((l).type & DWARF_LOC_TYPE_FP) != 0)
+# define DWARF_IS_V_LOC(l)      (((l).type & DWARF_LOC_TYPE_V) != 0)
+# define DWARF_MEM_LOC(c,m)     DWARF_LOC ((m), 0)
+# define DWARF_REG_LOC(c,r)     DWARF_LOC((r), DWARF_LOC_TYPE_REG)
+# define DWARF_FPREG_LOC(c,r)   DWARF_LOC((r), (DWARF_LOC_TYPE_REG      \
+                                                | DWARF_LOC_TYPE_FP))
+# define DWARF_VREG_LOC(c,r)    DWARF_LOC((r), (DWARF_LOC_TYPE_REG      \
+                                                | DWARF_LOC_TYPE_V))
 
 #endif /* !UNW_LOCAL_ONLY */
 
@@ -125,12 +131,12 @@ dwarf_getvr (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t * val)
 
   if (DWARF_IS_REG_LOC (loc))
     return (*c->as->acc.access_fpreg) (c->as, DWARF_GET_LOC (loc),
-				      val, 0, c->as_arg);
+                                      val, 0, c->as_arg);
 
   addr = DWARF_GET_LOC (loc);
 
   if ((ret = (*c->as->acc.access_mem) (c->as, addr + 0, valp,
-				       0, c->as_arg)) < 0)
+                                       0, c->as_arg)) < 0)
     return ret;
 
   return (*c->as->acc.access_mem) (c->as, addr + 8, valp + 1, 0, c->as_arg);
@@ -151,11 +157,11 @@ dwarf_putvr (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t val)
 
   if (DWARF_IS_REG_LOC (loc))
     return (*c->as->acc.access_fpreg) (c->as, DWARF_GET_LOC (loc),
-				      &val, 1, c->as_arg);
+                                      &val, 1, c->as_arg);
 
   addr = DWARF_GET_LOC (loc);
   if ((ret = (*c->as->acc.access_mem) (c->as, addr + 0, valp,
-				       1, c->as_arg)) < 0)
+                                       1, c->as_arg)) < 0)
     return ret;
 
   return (*c->as->acc.access_mem) (c->as, addr + 8, valp + 1, 1, c->as_arg);
@@ -175,7 +181,7 @@ dwarf_getfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t * val)
 
   if (DWARF_IS_REG_LOC (loc))
     return (*c->as->acc.access_fpreg) (c->as, DWARF_GET_LOC (loc),
-				       val, 0, c->as_arg);
+                                       val, 0, c->as_arg);
 
   addr = DWARF_GET_LOC (loc);
   return (*c->as->acc.access_mem) (c->as, addr + 0, valp, 0, c->as_arg);
@@ -196,7 +202,7 @@ dwarf_putfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t val)
 
   if (DWARF_IS_REG_LOC (loc))
     return (*c->as->acc.access_fpreg) (c->as, DWARF_GET_LOC (loc),
-				       &val, 1, c->as_arg);
+                                       &val, 1, c->as_arg);
 
   addr = DWARF_GET_LOC (loc);
 
@@ -218,10 +224,10 @@ dwarf_get (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t * val)
 
   if (DWARF_IS_REG_LOC (loc))
     return (*c->as->acc.access_reg) (c->as, DWARF_GET_LOC (loc), val,
-				     0, c->as_arg);
+                                     0, c->as_arg);
   else
     return (*c->as->acc.access_mem) (c->as, DWARF_GET_LOC (loc), val,
-				     0, c->as_arg);
+                                     0, c->as_arg);
 }
 
 static inline int
@@ -239,63 +245,68 @@ dwarf_put (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t val)
 
   if (DWARF_IS_REG_LOC (loc))
     return (*c->as->acc.access_reg) (c->as, DWARF_GET_LOC (loc), &val,
-				     1, c->as_arg);
+                                     1, c->as_arg);
   else
     return (*c->as->acc.access_mem) (c->as, DWARF_GET_LOC (loc), &val,
-				     1, c->as_arg);
+                                     1, c->as_arg);
 }
 
-
-
-#define tdep_needs_initialization	UNW_OBJ(needs_initialization)
-#define tdep_init			UNW_OBJ(init)
+#define tdep_getcontext_trace           unw_getcontext
+#define tdep_init_done                  UNW_OBJ(init_done)
+#define tdep_init                       UNW_OBJ(init)
 /* Platforms that support UNW_INFO_FORMAT_TABLE need to define
    tdep_search_unwind_table.  */
-#define tdep_search_unwind_table	dwarf_search_unwind_table
-#define tdep_uc_addr			UNW_ARCH_OBJ(uc_addr)
-#define tdep_get_elf_image		UNW_ARCH_OBJ(get_elf_image)
-#define tdep_access_reg			UNW_OBJ(access_reg)
-#define tdep_access_fpreg		UNW_OBJ(access_fpreg)
-#define tdep_fetch_proc_info_post       UNW_OBJ(fetch_proc_info_post)
-#define tdep_get_func_addr		UNW_OBJ(get_func_addr)
+#define tdep_search_unwind_table        dwarf_search_unwind_table
+#define tdep_find_unwind_table          dwarf_find_unwind_table
+#define tdep_uc_addr                    UNW_ARCH_OBJ(uc_addr)
+#define tdep_get_elf_image              UNW_ARCH_OBJ(get_elf_image)
+#define tdep_access_reg                 UNW_OBJ(access_reg)
+#define tdep_access_fpreg               UNW_OBJ(access_fpreg)
+#define tdep_fetch_frame(c,ip,n)        do {} while(0)
+#define tdep_cache_frame(c,rs)          do {} while(0)
+#define tdep_reuse_frame(c,rs)          do {} while(0)
+#define tdep_stash_frame(c,rs)          do {} while(0)
+#define tdep_trace(cur,addr,n)          (-UNW_ENOINFO)
+#define tdep_get_func_addr              UNW_OBJ(get_func_addr)
 
 #ifdef UNW_LOCAL_ONLY
-# define tdep_find_proc_info(c,ip,n)				\
-	dwarf_find_proc_info((c)->as, (ip), &(c)->pi, (n),	\
-				       (c)->as_arg)
-# define tdep_put_unwind_info(as,pi,arg)		\
-	dwarf_put_unwind_info((as), (pi), (arg))
+# define tdep_find_proc_info(c,ip,n)                            \
+        dwarf_find_proc_info((c)->as, (ip), &(c)->pi, (n),      \
+                                       (c)->as_arg)
+# define tdep_put_unwind_info(as,pi,arg)                \
+        dwarf_put_unwind_info((as), (pi), (arg))
 #else
-# define tdep_find_proc_info(c,ip,n)					\
-	(*(c)->as->acc.find_proc_info)((c)->as, (ip), &(c)->pi, (n),	\
-				       (c)->as_arg)
-# define tdep_put_unwind_info(as,pi,arg)			\
-	(*(as)->acc.put_unwind_info)((as), (pi), (arg))
+# define tdep_find_proc_info(c,ip,n)                                    \
+        (*(c)->as->acc.find_proc_info)((c)->as, (ip), &(c)->pi, (n),    \
+                                       (c)->as_arg)
+# define tdep_put_unwind_info(as,pi,arg)                        \
+        (*(as)->acc.put_unwind_info)((as), (pi), (arg))
 #endif
 
 extern int tdep_fetch_proc_info_post (struct dwarf_cursor *c, unw_word_t ip,
-				      int need_unwind_info);
+                                      int need_unwind_info);
 
-#define tdep_get_as(c)			((c)->dwarf.as)
-#define tdep_get_as_arg(c)		((c)->dwarf.as_arg)
-#define tdep_get_ip(c)			((c)->dwarf.ip)
-#define tdep_big_endian(as)		1
+#define tdep_get_as(c)                  ((c)->dwarf.as)
+#define tdep_get_as_arg(c)              ((c)->dwarf.as_arg)
+#define tdep_get_ip(c)                  ((c)->dwarf.ip)
+#define tdep_big_endian(as)             1
 
-extern int tdep_needs_initialization;
+extern int tdep_init_done;
 
 extern void tdep_init (void);
 extern int tdep_search_unwind_table (unw_addr_space_t as, unw_word_t ip,
-				     unw_dyn_info_t * di,
-				     unw_proc_info_t * pi,
-				     int need_unwind_info, void *arg);
+                                     unw_dyn_info_t * di,
+                                     unw_proc_info_t * pi,
+                                     int need_unwind_info, void *arg);
 extern void *tdep_uc_addr (ucontext_t * uc, int reg);
 extern int tdep_get_elf_image (struct elf_image *ei, pid_t pid, unw_word_t ip,
-			       unsigned long *segbase, unsigned long *mapoff);
+                               unsigned long *segbase, unsigned long *mapoff,
+                               char *path, size_t pathlen);
 extern int tdep_access_reg (struct cursor *c, unw_regnum_t reg,
-			    unw_word_t * valp, int write);
+                            unw_word_t * valp, int write);
 extern int tdep_access_fpreg (struct cursor *c, unw_regnum_t reg,
-			      unw_fpreg_t * valp, int write);
+                              unw_fpreg_t * valp, int write);
 extern int tdep_get_func_addr (unw_addr_space_t as, unw_word_t addr,
-			       unw_word_t *entry_point);
+                               unw_word_t *entry_point);
 
 #endif /* PPC64_LIBUNWIND_I_H */
diff --git a/frysk-imports/libunwind/include/tdep-ppc64/dwarf-config.h b/frysk-imports/libunwind/include/tdep-ppc64/dwarf-config.h
index e2676a8..6d8ef0a 100644
--- a/frysk-imports/libunwind/include/tdep-ppc64/dwarf-config.h
+++ b/frysk-imports/libunwind/include/tdep-ppc64/dwarf-config.h
@@ -33,22 +33,22 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #define dwarf_config_h
 
 /* For PPC64, 48 GPRs + 33 FPRs + 33 AltiVec + 1 SPE  */
-#define DWARF_NUM_PRESERVED_REGS	115
+#define DWARF_NUM_PRESERVED_REGS        115
 
-#define DWARF_REGNUM_MAP_LENGTH		115
+#define DWARF_REGNUM_MAP_LENGTH         115
 
 /* Return TRUE if the ADDR_SPACE uses big-endian byte-order.  */
-#define dwarf_is_big_endian(addr_space) 1
+#define dwarf_is_big_endian(addr_space) ((addr_space)->big_endian)
 
 /* Convert a pointer to a dwarf_cursor structure to a pointer to
    unw_cursor_t.  */
-#define dwarf_to_cursor(c)	((unw_cursor_t *) (c))
+#define dwarf_to_cursor(c)      ((unw_cursor_t *) (c))
 
 typedef struct dwarf_loc
   {
     unw_word_t val;
 #ifndef UNW_LOCAL_ONLY
-    unw_word_t type;		/* see X86_LOC_TYPE_* macros.  */
+    unw_word_t type;            /* see X86_LOC_TYPE_* macros.  */
 #endif
   }
 dwarf_loc_t;
diff --git a/frysk-imports/libunwind/include/tdep-ppc64/jmpbuf.h b/frysk-imports/libunwind/include/tdep-ppc64/jmpbuf.h
index 3780d5b..861e94d 100644
--- a/frysk-imports/libunwind/include/tdep-ppc64/jmpbuf.h
+++ b/frysk-imports/libunwind/include/tdep-ppc64/jmpbuf.h
@@ -31,7 +31,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 /* Use glibc's jump-buffer indices; NPTL peeks at SP: */
 
-#define JB_SP		6
-#define JB_RP		7
-#define JB_MASK_SAVED	8
-#define JB_MASK		9
+#define JB_SP           6
+#define JB_RP           7
+#define JB_MASK_SAVED   8
+#define JB_MASK         9
diff --git a/frysk-imports/libunwind/include/tdep-ppc64/libunwind_i.h b/frysk-imports/libunwind/include/tdep-ppc64/libunwind_i.h
index e19eca3..5a5bddb 100644
--- a/frysk-imports/libunwind/include/tdep-ppc64/libunwind_i.h
+++ b/frysk-imports/libunwind/include/tdep-ppc64/libunwind_i.h
@@ -42,17 +42,25 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #include "mempool.h"
 #include "dwarf.h"
 
+typedef struct
+  {
+    /* no ppc64-specific fast trace */
+  }
+unw_tdep_frame_t;
+
 struct unw_addr_space
 {
   struct unw_accessors acc;
+  int big_endian;
+  ppc64_abi_t abi;
   unw_caching_policy_t caching_policy;
 #ifdef HAVE_ATOMIC_OPS_H
   AO_t cache_generation;
 #else
   uint32_t cache_generation;
 #endif
-  unw_word_t dyn_generation;	/* see dyn-common.h */
-  unw_word_t dyn_info_list_addr;	/* (cached) dyn_info_list_addr */
+  unw_word_t dyn_generation;    /* see dyn-common.h */
+  unw_word_t dyn_info_list_addr;        /* (cached) dyn_info_list_addr */
   struct dwarf_rs_cache global_cache;
   struct unw_debug_frame_list *debug_frames;
   int validate;
@@ -60,55 +68,106 @@ struct unw_addr_space
 
 struct cursor
 {
-  struct dwarf_cursor dwarf;	/* must be first */
+  struct dwarf_cursor dwarf;    /* must be first */
 
   /* Format of sigcontext structure and address at which it is
      stored: */
   enum
   {
-    PPC_SCF_NONE,		/* no signal frame encountered */
-    PPC_SCF_LINUX_RT_SIGFRAME	/* POSIX ucontext_t */
+    PPC_SCF_NONE,               /* no signal frame encountered */
+    PPC_SCF_LINUX_RT_SIGFRAME   /* POSIX ucontext_t */
   }
   sigcontext_format;
   unw_word_t sigcontext_addr;
 };
 
-#define DWARF_GET_LOC(l)	((l).val)
+#define DWARF_GET_LOC(l)        ((l).val)
 
 #ifdef UNW_LOCAL_ONLY
-# define DWARF_NULL_LOC		DWARF_LOC (0, 0)
-# define DWARF_IS_NULL_LOC(l)	(DWARF_GET_LOC (l) == 0)
-# define DWARF_LOC(r, t)	((dwarf_loc_t) { .val = (r) })
-# define DWARF_IS_REG_LOC(l)	0
-# define DWARF_IS_FP_LOC(l)	0
-# define DWARF_IS_V_LOC(l)	0
-# define DWARF_MEM_LOC(c,m)	DWARF_LOC ((m), 0)
-# define DWARF_REG_LOC(c,r)	(DWARF_LOC((unw_word_t)			     \
-				 tdep_uc_addr((c)->as_arg, (r)), 0))
-# define DWARF_FPREG_LOC(c,r)	(DWARF_LOC((unw_word_t)			     \
-				 tdep_uc_addr((c)->as_arg, (r)), 0))
-# define DWARF_VREG_LOC(c,r)	(DWARF_LOC((unw_word_t)			     \
-				 tdep_uc_addr((c)->as_arg, (r)), 0))
-#else /* !UNW_LOCAL_ONLY */
+# define DWARF_NULL_LOC         DWARF_LOC (0, 0)
+# define DWARF_IS_NULL_LOC(l)   (DWARF_GET_LOC (l) == 0)
+# define DWARF_LOC(r, t)        ((dwarf_loc_t) { .val = (r) })
+# define DWARF_IS_REG_LOC(l)    0
+# define DWARF_REG_LOC(c,r)     (DWARF_LOC((unw_word_t)                      \
+                                 tdep_uc_addr((c)->as_arg, (r)), 0))
+# define DWARF_MEM_LOC(c,m)     DWARF_LOC ((m), 0)
+# define DWARF_FPREG_LOC(c,r)   (DWARF_LOC((unw_word_t)                      \
+                                 tdep_uc_addr((c)->as_arg, (r)), 0))
+# define DWARF_VREG_LOC(c,r)    (DWARF_LOC((unw_word_t)                      \
+                                 tdep_uc_addr((c)->as_arg, (r)), 0))
 
-# define DWARF_LOC_TYPE_FP	(1 << 0)
-# define DWARF_LOC_TYPE_REG	(1 << 1)
-# define DWARF_LOC_TYPE_V	(1 << 2)
-# define DWARF_NULL_LOC		DWARF_LOC (0, 0)
-# define DWARF_IS_NULL_LOC(l)						\
-		({ dwarf_loc_t _l = (l); _l.val == 0 && _l.type == 0; })
-# define DWARF_LOC(r, t)	((dwarf_loc_t) { .val = (r), .type = (t) })
-# define DWARF_IS_REG_LOC(l)	(((l).type & DWARF_LOC_TYPE_REG) != 0)
-# define DWARF_IS_FP_LOC(l)	(((l).type & DWARF_LOC_TYPE_FP) != 0)
-# define DWARF_IS_V_LOC(l)	(((l).type & DWARF_LOC_TYPE_V) != 0)
-# define DWARF_MEM_LOC(c,m)	DWARF_LOC ((m), 0)
-# define DWARF_REG_LOC(c,r)	DWARF_LOC((r), DWARF_LOC_TYPE_REG)
-# define DWARF_FPREG_LOC(c,r)	DWARF_LOC((r), (DWARF_LOC_TYPE_REG	\
-						| DWARF_LOC_TYPE_FP))
-# define DWARF_VREG_LOC(c,r)	DWARF_LOC((r), (DWARF_LOC_TYPE_REG	\
-						| DWARF_LOC_TYPE_V))
+static inline int
+dwarf_getvr (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t * val)
+{
+  if (!DWARF_GET_LOC (loc))
+    return -1;
+  *val = *(unw_fpreg_t *) DWARF_GET_LOC (loc);
+  return 0;
+}
 
-#endif /* !UNW_LOCAL_ONLY */
+static inline int
+dwarf_putvr (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t val)
+{
+  if (!DWARF_GET_LOC (loc))
+    return -1;
+  *(unw_fpreg_t *) DWARF_GET_LOC (loc) = val;
+  return 0;
+}
+
+static inline int
+dwarf_getfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t *val)
+{
+  if (!DWARF_GET_LOC (loc))
+    return -1;
+  *val = *(unw_fpreg_t *) DWARF_GET_LOC (loc);
+  return 0;
+}
+
+static inline int
+dwarf_putfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t val)
+{
+  if (!DWARF_GET_LOC (loc))
+    return -1;
+  *(unw_fpreg_t *) DWARF_GET_LOC (loc) = val;
+  return 0;
+}
+
+static inline int
+dwarf_get (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t *val)
+{
+  if (!DWARF_GET_LOC (loc))
+    return -1;
+  *val = *(unw_word_t *) DWARF_GET_LOC (loc);
+  return 0;
+}
+
+static inline int
+dwarf_put (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t val)
+{
+  if (!DWARF_GET_LOC (loc))
+    return -1;
+  *(unw_word_t *) DWARF_GET_LOC (loc) = val;
+  return 0;
+}
+
+#else /* !UNW_LOCAL_ONLY */
+
+# define DWARF_LOC_TYPE_FP      (1 << 0)
+# define DWARF_LOC_TYPE_REG     (1 << 1)
+# define DWARF_LOC_TYPE_V       (1 << 2)
+# define DWARF_NULL_LOC         DWARF_LOC (0, 0)
+# define DWARF_IS_NULL_LOC(l)                                           \
+                ({ dwarf_loc_t _l = (l); _l.val == 0 && _l.type == 0; })
+# define DWARF_LOC(r, t)        ((dwarf_loc_t) { .val = (r), .type = (t) })
+# define DWARF_IS_REG_LOC(l)    (((l).type & DWARF_LOC_TYPE_REG) != 0)
+# define DWARF_IS_FP_LOC(l)     (((l).type & DWARF_LOC_TYPE_FP) != 0)
+# define DWARF_IS_V_LOC(l)      (((l).type & DWARF_LOC_TYPE_V) != 0)
+# define DWARF_MEM_LOC(c,m)     DWARF_LOC ((m), 0)
+# define DWARF_REG_LOC(c,r)     DWARF_LOC((r), DWARF_LOC_TYPE_REG)
+# define DWARF_FPREG_LOC(c,r)   DWARF_LOC((r), (DWARF_LOC_TYPE_REG      \
+                                                | DWARF_LOC_TYPE_FP))
+# define DWARF_VREG_LOC(c,r)    DWARF_LOC((r), (DWARF_LOC_TYPE_REG      \
+                                                | DWARF_LOC_TYPE_V))
 
 static inline int
 dwarf_getvr (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t * val)
@@ -125,12 +184,12 @@ dwarf_getvr (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t * val)
 
   if (DWARF_IS_REG_LOC (loc))
     return (*c->as->acc.access_fpreg) (c->as, DWARF_GET_LOC (loc),
-				      val, 0, c->as_arg);
+                                      val, 0, c->as_arg);
 
   addr = DWARF_GET_LOC (loc);
 
   if ((ret = (*c->as->acc.access_mem) (c->as, addr + 0, valp,
-				       0, c->as_arg)) < 0)
+                                       0, c->as_arg)) < 0)
     return ret;
 
   return (*c->as->acc.access_mem) (c->as, addr + 8, valp + 1, 0, c->as_arg);
@@ -151,11 +210,11 @@ dwarf_putvr (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t val)
 
   if (DWARF_IS_REG_LOC (loc))
     return (*c->as->acc.access_fpreg) (c->as, DWARF_GET_LOC (loc),
-				      &val, 1, c->as_arg);
+                                      &val, 1, c->as_arg);
 
   addr = DWARF_GET_LOC (loc);
   if ((ret = (*c->as->acc.access_mem) (c->as, addr + 0, valp,
-				       1, c->as_arg)) < 0)
+                                       1, c->as_arg)) < 0)
     return ret;
 
   return (*c->as->acc.access_mem) (c->as, addr + 8, valp + 1, 1, c->as_arg);
@@ -175,7 +234,7 @@ dwarf_getfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t * val)
 
   if (DWARF_IS_REG_LOC (loc))
     return (*c->as->acc.access_fpreg) (c->as, DWARF_GET_LOC (loc),
-				       val, 0, c->as_arg);
+                                       val, 0, c->as_arg);
 
   addr = DWARF_GET_LOC (loc);
   return (*c->as->acc.access_mem) (c->as, addr + 0, valp, 0, c->as_arg);
@@ -196,7 +255,7 @@ dwarf_putfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t val)
 
   if (DWARF_IS_REG_LOC (loc))
     return (*c->as->acc.access_fpreg) (c->as, DWARF_GET_LOC (loc),
-				       &val, 1, c->as_arg);
+                                       &val, 1, c->as_arg);
 
   addr = DWARF_GET_LOC (loc);
 
@@ -218,10 +277,10 @@ dwarf_get (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t * val)
 
   if (DWARF_IS_REG_LOC (loc))
     return (*c->as->acc.access_reg) (c->as, DWARF_GET_LOC (loc), val,
-				     0, c->as_arg);
+                                     0, c->as_arg);
   else
     return (*c->as->acc.access_mem) (c->as, DWARF_GET_LOC (loc), val,
-				     0, c->as_arg);
+                                     0, c->as_arg);
 }
 
 static inline int
@@ -239,63 +298,70 @@ dwarf_put (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t val)
 
   if (DWARF_IS_REG_LOC (loc))
     return (*c->as->acc.access_reg) (c->as, DWARF_GET_LOC (loc), &val,
-				     1, c->as_arg);
+                                     1, c->as_arg);
   else
     return (*c->as->acc.access_mem) (c->as, DWARF_GET_LOC (loc), &val,
-				     1, c->as_arg);
+                                     1, c->as_arg);
 }
 
+#endif /* !UNW_LOCAL_ONLY */
 
-
-#define tdep_needs_initialization	UNW_OBJ(needs_initialization)
-#define tdep_init			UNW_OBJ(init)
+#define tdep_getcontext_trace           unw_getcontext
+#define tdep_init_done                  UNW_OBJ(init_done)
+#define tdep_init                       UNW_OBJ(init)
 /* Platforms that support UNW_INFO_FORMAT_TABLE need to define
    tdep_search_unwind_table.  */
-#define tdep_search_unwind_table	dwarf_search_unwind_table
-#define tdep_uc_addr			UNW_ARCH_OBJ(uc_addr)
-#define tdep_get_elf_image		UNW_ARCH_OBJ(get_elf_image)
-#define tdep_access_reg			UNW_OBJ(access_reg)
-#define tdep_access_fpreg		UNW_OBJ(access_fpreg)
-#define tdep_fetch_proc_info_post       UNW_OBJ(fetch_proc_info_post)
-#define tdep_get_func_addr		UNW_OBJ(get_func_addr)
+#define tdep_search_unwind_table        dwarf_search_unwind_table
+#define tdep_find_unwind_table          dwarf_find_unwind_table
+#define tdep_uc_addr                    UNW_ARCH_OBJ(uc_addr)
+#define tdep_get_elf_image              UNW_ARCH_OBJ(get_elf_image)
+#define tdep_access_reg                 UNW_OBJ(access_reg)
+#define tdep_access_fpreg               UNW_OBJ(access_fpreg)
+#define tdep_fetch_frame(c,ip,n)        do {} while(0)
+#define tdep_cache_frame(c,rs)          do {} while(0)
+#define tdep_reuse_frame(c,rs)          do {} while(0)
+#define tdep_stash_frame(c,rs)          do {} while(0)
+#define tdep_trace(cur,addr,n)          (-UNW_ENOINFO)
+#define tdep_get_func_addr              UNW_OBJ(get_func_addr)
 
 #ifdef UNW_LOCAL_ONLY
-# define tdep_find_proc_info(c,ip,n)				\
-	dwarf_find_proc_info((c)->as, (ip), &(c)->pi, (n),	\
-				       (c)->as_arg)
-# define tdep_put_unwind_info(as,pi,arg)		\
-	dwarf_put_unwind_info((as), (pi), (arg))
+# define tdep_find_proc_info(c,ip,n)                            \
+        dwarf_find_proc_info((c)->as, (ip), &(c)->pi, (n),      \
+                                       (c)->as_arg)
+# define tdep_put_unwind_info(as,pi,arg)                \
+        dwarf_put_unwind_info((as), (pi), (arg))
 #else
-# define tdep_find_proc_info(c,ip,n)					\
-	(*(c)->as->acc.find_proc_info)((c)->as, (ip), &(c)->pi, (n),	\
-				       (c)->as_arg)
-# define tdep_put_unwind_info(as,pi,arg)			\
-	(*(as)->acc.put_unwind_info)((as), (pi), (arg))
+# define tdep_find_proc_info(c,ip,n)                                    \
+        (*(c)->as->acc.find_proc_info)((c)->as, (ip), &(c)->pi, (n),    \
+                                       (c)->as_arg)
+# define tdep_put_unwind_info(as,pi,arg)                        \
+        (*(as)->acc.put_unwind_info)((as), (pi), (arg))
 #endif
 
 extern int tdep_fetch_proc_info_post (struct dwarf_cursor *c, unw_word_t ip,
-				      int need_unwind_info);
+                                      int need_unwind_info);
 
-#define tdep_get_as(c)			((c)->dwarf.as)
-#define tdep_get_as_arg(c)		((c)->dwarf.as_arg)
-#define tdep_get_ip(c)			((c)->dwarf.ip)
-#define tdep_big_endian(as)		1
+#define tdep_get_as(c)                  ((c)->dwarf.as)
+#define tdep_get_as_arg(c)              ((c)->dwarf.as_arg)
+#define tdep_get_ip(c)                  ((c)->dwarf.ip)
+#define tdep_big_endian(as)             ((as)->big_endian)
 
-extern int tdep_needs_initialization;
+extern int tdep_init_done;
 
 extern void tdep_init (void);
 extern int tdep_search_unwind_table (unw_addr_space_t as, unw_word_t ip,
-				     unw_dyn_info_t * di,
-				     unw_proc_info_t * pi,
-				     int need_unwind_info, void *arg);
+                                     unw_dyn_info_t * di,
+                                     unw_proc_info_t * pi,
+                                     int need_unwind_info, void *arg);
 extern void *tdep_uc_addr (ucontext_t * uc, int reg);
 extern int tdep_get_elf_image (struct elf_image *ei, pid_t pid, unw_word_t ip,
-			       unsigned long *segbase, unsigned long *mapoff);
+                               unsigned long *segbase, unsigned long *mapoff,
+                               char *path, size_t pathlen);
 extern int tdep_access_reg (struct cursor *c, unw_regnum_t reg,
-			    unw_word_t * valp, int write);
+                            unw_word_t * valp, int write);
 extern int tdep_access_fpreg (struct cursor *c, unw_regnum_t reg,
-			      unw_fpreg_t * valp, int write);
+                              unw_fpreg_t * valp, int write);
 extern int tdep_get_func_addr (unw_addr_space_t as, unw_word_t addr,
-			       unw_word_t *entry_point);
+                               unw_word_t *entry_point);
 
 #endif /* PPC64_LIBUNWIND_I_H */
diff --git a/frysk-imports/libunwind/include/tdep-sh/dwarf-config.h b/frysk-imports/libunwind/include/tdep-sh/dwarf-config.h
new file mode 100644
index 0000000..2f76f5b
--- /dev/null
+++ b/frysk-imports/libunwind/include/tdep-sh/dwarf-config.h
@@ -0,0 +1,49 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+   Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com>
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#ifndef dwarf_config_h
+#define dwarf_config_h
+
+#define DWARF_NUM_PRESERVED_REGS        18
+
+#define dwarf_to_unw_regnum(reg) (((reg) <= UNW_SH_PR) ? (reg) : 0)
+
+/* Return TRUE if the ADDR_SPACE uses big-endian byte-order.  */
+#define dwarf_is_big_endian(addr_space) ((addr_space)->big_endian)
+
+/* Convert a pointer to a dwarf_cursor structure to a pointer to
+   unw_cursor_t.  */
+#define dwarf_to_cursor(c)      ((unw_cursor_t *) (c))
+
+typedef struct dwarf_loc
+  {
+    unw_word_t val;
+#ifndef UNW_LOCAL_ONLY
+    unw_word_t type;            /* see DWARF_LOC_TYPE_* macros.  */
+#endif
+  }
+dwarf_loc_t;
+
+#endif /* dwarf_config_h */
diff --git a/frysk-imports/libunwind/include/tdep-sh/jmpbuf.h b/frysk-imports/libunwind/include/tdep-sh/jmpbuf.h
new file mode 100644
index 0000000..8b44b5b
--- /dev/null
+++ b/frysk-imports/libunwind/include/tdep-sh/jmpbuf.h
@@ -0,0 +1,48 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com>
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+/* Use glibc's jump-buffer indices; NPTL peeks at SP: */
+
+/* SH4 glibc jump buffer contents:
+ *  0. r8
+ *  1. r9
+ *  2. r10
+ *  3. r11
+ *  4. r12
+ *  5. r13
+ *  6. r14
+ *  7. r15
+ *  8. pr/pc
+ *  9. gbr
+ * 10. fpscr
+ * 11. fr12
+ * 12. fr13
+ * 13. fr14
+ * 14. fr15
+ */
+
+#define JB_SP           7
+#define JB_RP           8
+#define JB_MASK_SAVED   15
+#define JB_MASK         16
diff --git a/frysk-imports/libunwind/include/tdep-sh/libunwind_i.h b/frysk-imports/libunwind/include/tdep-sh/libunwind_i.h
new file mode 100644
index 0000000..7bbb29b
--- /dev/null
+++ b/frysk-imports/libunwind/include/tdep-sh/libunwind_i.h
@@ -0,0 +1,278 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+   Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com>
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#ifndef SH_LIBUNWIND_I_H
+#define SH_LIBUNWIND_I_H
+
+/* Target-dependent definitions that are internal to libunwind but need
+   to be shared with target-independent code.  */
+
+#include <stdlib.h>
+#include <libunwind.h>
+
+#include "elf32.h"
+#include "mempool.h"
+#include "dwarf.h"
+
+typedef struct
+  {
+    /* no sh-specific fast trace */
+  }
+unw_tdep_frame_t;
+
+struct unw_addr_space
+  {
+    struct unw_accessors acc;
+    int big_endian;
+    unw_caching_policy_t caching_policy;
+#ifdef HAVE_ATOMIC_OPS_H
+    AO_t cache_generation;
+#else
+    uint32_t cache_generation;
+#endif
+    unw_word_t dyn_generation;          /* see dyn-common.h */
+    unw_word_t dyn_info_list_addr;      /* (cached) dyn_info_list_addr */
+    struct dwarf_rs_cache global_cache;
+    struct unw_debug_frame_list *debug_frames;
+  };
+
+struct cursor
+  {
+    struct dwarf_cursor dwarf;          /* must be first */
+    enum
+      {
+        SH_SCF_NONE,                   /* no signal frame */
+        SH_SCF_LINUX_SIGFRAME,         /* non-RT signal frame */
+        SH_SCF_LINUX_RT_SIGFRAME,      /* RT signal frame */
+      }
+    sigcontext_format;
+    unw_word_t sigcontext_addr;
+    unw_word_t sigcontext_sp;
+    unw_word_t sigcontext_pc;
+  };
+
+#define DWARF_GET_LOC(l)        ((l).val)
+
+#ifdef UNW_LOCAL_ONLY
+# define DWARF_NULL_LOC         DWARF_LOC (0, 0)
+# define DWARF_IS_NULL_LOC(l)   (DWARF_GET_LOC (l) == 0)
+# define DWARF_LOC(r, t)        ((dwarf_loc_t) { .val = (r) })
+# define DWARF_IS_REG_LOC(l)    0
+# define DWARF_REG_LOC(c,r)     (DWARF_LOC((unw_word_t)                      \
+                                 tdep_uc_addr((c)->as_arg, (r)), 0))
+# define DWARF_MEM_LOC(c,m)     DWARF_LOC ((m), 0)
+# define DWARF_FPREG_LOC(c,r)   (DWARF_LOC((unw_word_t)                      \
+                                 tdep_uc_addr((c)->as_arg, (r)), 0))
+
+static inline int
+dwarf_getfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t *val)
+{
+  if (!DWARF_GET_LOC (loc))
+    return -1;
+  *val = *(unw_fpreg_t *) DWARF_GET_LOC (loc);
+  return 0;
+}
+
+static inline int
+dwarf_putfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t val)
+{
+  if (!DWARF_GET_LOC (loc))
+    return -1;
+  *(unw_fpreg_t *) DWARF_GET_LOC (loc) = val;
+  return 0;
+}
+
+static inline int
+dwarf_get (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t *val)
+{
+  if (!DWARF_GET_LOC (loc))
+    return -1;
+  *val = *(unw_word_t *) DWARF_GET_LOC (loc);
+  return 0;
+}
+
+static inline int
+dwarf_put (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t val)
+{
+  if (!DWARF_GET_LOC (loc))
+    return -1;
+  *(unw_word_t *) DWARF_GET_LOC (loc) = val;
+  return 0;
+}
+
+#else /* !UNW_LOCAL_ONLY */
+# define DWARF_LOC_TYPE_FP      (1 << 0)
+# define DWARF_LOC_TYPE_REG     (1 << 1)
+# define DWARF_NULL_LOC         DWARF_LOC (0, 0)
+# define DWARF_IS_NULL_LOC(l)                                           \
+                ({ dwarf_loc_t _l = (l); _l.val == 0 && _l.type == 0; })
+# define DWARF_LOC(r, t)        ((dwarf_loc_t) { .val = (r), .type = (t) })
+# define DWARF_IS_REG_LOC(l)    (((l).type & DWARF_LOC_TYPE_REG) != 0)
+# define DWARF_IS_FP_LOC(l)     (((l).type & DWARF_LOC_TYPE_FP) != 0)
+# define DWARF_REG_LOC(c,r)     DWARF_LOC((r), DWARF_LOC_TYPE_REG)
+# define DWARF_MEM_LOC(c,m)     DWARF_LOC ((m), 0)
+# define DWARF_FPREG_LOC(c,r)   DWARF_LOC((r), (DWARF_LOC_TYPE_REG      \
+                                                | DWARF_LOC_TYPE_FP))
+
+static inline int
+dwarf_getfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t *val)
+{
+  char *valp = (char *) &val;
+  unw_word_t addr;
+  int ret;
+
+  if (DWARF_IS_NULL_LOC (loc))
+    return -UNW_EBADREG;
+
+  if (DWARF_IS_REG_LOC (loc))
+    return (*c->as->acc.access_fpreg) (c->as, DWARF_GET_LOC (loc),
+                                       val, 0, c->as_arg);
+
+  addr = DWARF_GET_LOC (loc);
+  if ((ret = (*c->as->acc.access_mem) (c->as, addr + 0, (unw_word_t *) valp,
+                                       0, c->as_arg)) < 0)
+    return ret;
+
+  return (*c->as->acc.access_mem) (c->as, addr + 4, (unw_word_t *) valp + 1, 0,
+                                   c->as_arg);
+}
+
+static inline int
+dwarf_putfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t val)
+{
+  char *valp = (char *) &val;
+  unw_word_t addr;
+  int ret;
+
+  if (DWARF_IS_NULL_LOC (loc))
+    return -UNW_EBADREG;
+
+  if (DWARF_IS_REG_LOC (loc))
+    return (*c->as->acc.access_fpreg) (c->as, DWARF_GET_LOC (loc),
+                                       &val, 1, c->as_arg);
+
+  addr = DWARF_GET_LOC (loc);
+  if ((ret = (*c->as->acc.access_mem) (c->as, addr + 0, (unw_word_t *) valp,
+                                       1, c->as_arg)) < 0)
+    return ret;
+
+  return (*c->as->acc.access_mem) (c->as, addr + 4, (unw_word_t *) valp + 1,
+                                   1, c->as_arg);
+}
+
+static inline int
+dwarf_get (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t *val)
+{
+  if (DWARF_IS_NULL_LOC (loc))
+    return -UNW_EBADREG;
+
+  /* If a code-generator were to save a value of type unw_word_t in a
+     floating-point register, we would have to support this case.  I
+     suppose it could happen with MMX registers, but does it really
+     happen?  */
+  assert (!DWARF_IS_FP_LOC (loc));
+
+  if (DWARF_IS_REG_LOC (loc))
+    return (*c->as->acc.access_reg) (c->as, DWARF_GET_LOC (loc), val,
+                                     0, c->as_arg);
+  else
+    return (*c->as->acc.access_mem) (c->as, DWARF_GET_LOC (loc), val,
+                                     0, c->as_arg);
+}
+
+static inline int
+dwarf_put (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t val)
+{
+  if (DWARF_IS_NULL_LOC (loc))
+    return -UNW_EBADREG;
+
+  /* If a code-generator were to save a value of type unw_word_t in a
+     floating-point register, we would have to support this case.  I
+     suppose it could happen with MMX registers, but does it really
+     happen?  */
+  assert (!DWARF_IS_FP_LOC (loc));
+
+  if (DWARF_IS_REG_LOC (loc))
+    return (*c->as->acc.access_reg) (c->as, DWARF_GET_LOC (loc), &val,
+                                     1, c->as_arg);
+  else
+    return (*c->as->acc.access_mem) (c->as, DWARF_GET_LOC (loc), &val,
+                                     1, c->as_arg);
+}
+
+#endif /* !UNW_LOCAL_ONLY */
+
+#define tdep_getcontext_trace           unw_getcontext
+#define tdep_init_done                  UNW_OBJ(init_done)
+#define tdep_init                       UNW_OBJ(init)
+/* Platforms that support UNW_INFO_FORMAT_TABLE need to define
+   tdep_search_unwind_table.  */
+#define tdep_search_unwind_table        dwarf_search_unwind_table
+#define tdep_find_unwind_table          dwarf_find_unwind_table
+#define tdep_uc_addr                    UNW_ARCH_OBJ(uc_addr)
+#define tdep_get_elf_image              UNW_ARCH_OBJ(get_elf_image)
+#define tdep_access_reg                 UNW_OBJ(access_reg)
+#define tdep_access_fpreg               UNW_OBJ(access_fpreg)
+#define tdep_fetch_frame(c,ip,n)        do {} while(0)
+#define tdep_cache_frame(c,rs)          do {} while(0)
+#define tdep_reuse_frame(c,rs)          do {} while(0)
+#define tdep_stash_frame(c,rs)          do {} while(0)
+#define tdep_trace(cur,addr,n)          (-UNW_ENOINFO)
+
+#ifdef UNW_LOCAL_ONLY
+# define tdep_find_proc_info(c,ip,n)                            \
+        dwarf_find_proc_info((c)->as, (ip), &(c)->pi, (n),      \
+                                       (c)->as_arg)
+# define tdep_put_unwind_info(as,pi,arg)                \
+        dwarf_put_unwind_info((as), (pi), (arg))
+#else
+# define tdep_find_proc_info(c,ip,n)                                    \
+        (*(c)->as->acc.find_proc_info)((c)->as, (ip), &(c)->pi, (n),    \
+                                       (c)->as_arg)
+# define tdep_put_unwind_info(as,pi,arg)                \
+        (*(as)->acc.put_unwind_info)((as), (pi), (arg))
+#endif
+
+#define tdep_get_as(c)                  ((c)->dwarf.as)
+#define tdep_get_as_arg(c)              ((c)->dwarf.as_arg)
+#define tdep_get_ip(c)                  ((c)->dwarf.ip)
+#define tdep_big_endian(as)             ((as)->big_endian)
+
+extern int tdep_init_done;
+
+extern void tdep_init (void);
+extern int tdep_search_unwind_table (unw_addr_space_t as, unw_word_t ip,
+                                     unw_dyn_info_t *di, unw_proc_info_t *pi,
+                                     int need_unwind_info, void *arg);
+extern void *tdep_uc_addr (unw_tdep_context_t *uc, int reg);
+extern int tdep_get_elf_image (struct elf_image *ei, pid_t pid, unw_word_t ip,
+                               unsigned long *segbase, unsigned long *mapoff,
+                               char *path, size_t pathlen);
+extern int tdep_access_reg (struct cursor *c, unw_regnum_t reg,
+                            unw_word_t *valp, int write);
+extern int tdep_access_fpreg (struct cursor *c, unw_regnum_t reg,
+                              unw_fpreg_t *valp, int write);
+
+#endif /* SH_LIBUNWIND_I_H */
diff --git a/frysk-imports/libunwind/include/tdep-tilegx/dwarf-config.h b/frysk-imports/libunwind/include/tdep-tilegx/dwarf-config.h
new file mode 100644
index 0000000..93bc6aa
--- /dev/null
+++ b/frysk-imports/libunwind/include/tdep-tilegx/dwarf-config.h
@@ -0,0 +1,50 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+   Copyright (C) 2014 Tilera Corp.
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#ifndef dwarf_config_h
+#define dwarf_config_h
+
+/* This is FIRST_PSEUDO_REGISTER in GCC, since DWARF_FRAME_REGISTERS is not
+   explicitly defined.  */
+#define DWARF_NUM_PRESERVED_REGS        188
+
+#define DWARF_REGNUM_MAP_LENGTH         (56 + 2)
+
+/* Return TRUE if the ADDR_SPACE uses big-endian byte-order.  */
+#define dwarf_is_big_endian(addr_space) ((addr_space)->big_endian)
+
+/* Convert a pointer to a dwarf_cursor structure to a pointer to
+   unw_cursor_t.  */
+#define dwarf_to_cursor(c)   ((unw_cursor_t *) (c))
+
+typedef struct dwarf_loc
+{
+  unw_word_t val;
+#ifndef UNW_LOCAL_ONLY
+  unw_word_t type;        /* see DWARF_LOC_TYPE_* macros.  */
+#endif
+} dwarf_loc_t;
+
+#endif /* dwarf_config_h */
diff --git a/frysk-imports/libunwind/include/tdep-tilegx/jmpbuf.h b/frysk-imports/libunwind/include/tdep-tilegx/jmpbuf.h
new file mode 100644
index 0000000..3afe9e4
--- /dev/null
+++ b/frysk-imports/libunwind/include/tdep-tilegx/jmpbuf.h
@@ -0,0 +1,33 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+   Copyright (C) 2014 Tilera Corp.
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+/* Use glibc's jump-buffer indices; NPTL peeks at SP: */
+
+/* FIXME for Tilegx!  */
+
+#define JB_SP            4
+#define JB_RP            5
+#define JB_MASK_SAVED    6
+#define JB_MASK          7
diff --git a/frysk-imports/libunwind/include/tdep-tilegx/libunwind_i.h b/frysk-imports/libunwind/include/tdep-tilegx/libunwind_i.h
new file mode 100644
index 0000000..9a4ec6a
--- /dev/null
+++ b/frysk-imports/libunwind/include/tdep-tilegx/libunwind_i.h
@@ -0,0 +1,265 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+   Copyright (C) 2014 Tilera Corp.
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#ifndef TILEGX_LIBUNWIND_I_H
+#define TILEGX_LIBUNWIND_I_H
+
+/* Target-dependent definitions that are internal to libunwind but need
+   to be shared with target-independent code.  */
+
+#include <stdlib.h>
+#include <libunwind.h>
+
+# include "elf64.h"
+#include "mempool.h"
+#include "dwarf.h"
+
+#ifdef HAVE___THREAD
+# undef HAVE___THREAD
+#endif
+
+typedef struct
+{
+  /* no Tilegx-specific fast trace */
+} unw_tdep_frame_t;
+
+struct unw_addr_space
+{
+  struct unw_accessors acc;
+
+  int big_endian;
+  tilegx_abi_t abi;
+  unsigned int addr_size;
+
+  unw_caching_policy_t caching_policy;
+#ifdef HAVE_ATOMIC_OPS_H
+  AO_t cache_generation;
+#else
+  uint32_t cache_generation;
+#endif
+  unw_word_t dyn_generation;          /* see dyn-common.h */
+  unw_word_t dyn_info_list_addr;      /* (cached) dyn_info_list_addr */
+  struct dwarf_rs_cache global_cache;
+  struct unw_debug_frame_list *debug_frames;
+};
+
+#define tdep_big_endian(as)            ((as)->big_endian)
+
+struct cursor
+{
+  struct dwarf_cursor dwarf;         /* must be first */
+  unw_word_t sigcontext_addr;
+  unw_word_t sigcontext_sp;
+  unw_word_t sigcontext_pc;
+};
+
+#define DWARF_GET_LOC(l)      ((l).val)
+
+#ifndef UNW_REMOTE_ONLY
+typedef long tilegx_reg_t;
+#endif
+
+#ifdef UNW_LOCAL_ONLY
+#define DWARF_NULL_LOC         DWARF_LOC (0, 0)
+#define DWARF_IS_NULL_LOC(l)   (DWARF_GET_LOC (l) == 0)
+#define DWARF_LOC(r, t)        ((dwarf_loc_t) { .val = (r) })
+#define DWARF_IS_REG_LOC(l)    0
+#define DWARF_REG_LOC(c,r)     (DWARF_LOC((unw_word_t) (intptr_t)       \
+                                          tdep_uc_addr((c)->as_arg, (r)), 0))
+#define DWARF_MEM_LOC(c,m)     DWARF_LOC ((m), 0)
+#define DWARF_FPREG_LOC(c,r)   (DWARF_LOC((unw_word_t) (intptr_t)       \
+                                          tdep_uc_addr((c)->as_arg, (r)), 0))
+
+/* Tilegx has no FP. */
+static inline int
+dwarf_getfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t *val)
+{
+  Debug (1, "Tielgx has no fp!\n");
+  abort();
+  return 0;
+}
+
+static inline int
+dwarf_putfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t val)
+{
+  Debug (1, "Tielgx has no fp!\n");
+  abort();
+  return 0;
+}
+
+static inline int
+dwarf_get (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t *val)
+{
+  if (!DWARF_GET_LOC (loc))
+    return -1;
+
+  *val = *(tilegx_reg_t *) (intptr_t) DWARF_GET_LOC (loc);
+  return 0;
+}
+
+static inline int
+dwarf_put (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t val)
+{
+  if (!DWARF_GET_LOC (loc))
+    return -1;
+
+  *(tilegx_reg_t *) (intptr_t) DWARF_GET_LOC (loc) = val;
+  return 0;
+}
+
+#else /* !UNW_LOCAL_ONLY */
+#define DWARF_LOC_TYPE_FP      (1 << 0)
+#define DWARF_LOC_TYPE_REG     (1 << 1)
+#define DWARF_NULL_LOC         DWARF_LOC (0, 0)
+#define DWARF_IS_NULL_LOC(l)                                    \
+  ({ dwarf_loc_t _l = (l); _l.val == 0 && _l.type == 0; })
+#define DWARF_LOC(r, t)        ((dwarf_loc_t) { .val = (r), .type = (t) })
+#define DWARF_IS_REG_LOC(l)    (((l).type & DWARF_LOC_TYPE_REG) != 0)
+#define DWARF_IS_FP_LOC(l)     (((l).type & DWARF_LOC_TYPE_FP) != 0)
+#define DWARF_REG_LOC(c,r)     DWARF_LOC((r), DWARF_LOC_TYPE_REG)
+#define DWARF_MEM_LOC(c,m)     DWARF_LOC ((m), 0)
+#define DWARF_FPREG_LOC(c,r)   DWARF_LOC((r), (DWARF_LOC_TYPE_REG       \
+                                               | DWARF_LOC_TYPE_FP))
+
+/* TILEGX has no fp. */
+static inline int
+dwarf_getfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t *val)
+{
+  Debug (1, "Tielgx has no fp!\n");
+  abort();
+  return 0;
+}
+
+static inline int
+dwarf_putfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t val)
+{
+  Debug (1, "Tielgx has no fp!\n");
+  abort();
+  return 0;
+}
+
+static inline int
+dwarf_get (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t *val)
+{
+  if (DWARF_IS_NULL_LOC (loc))
+    return -UNW_EBADREG;
+
+  /* If a code-generator were to save a value of type unw_word_t in a
+     floating-point register, we would have to support this case.  I
+     suppose it could happen with MMX registers, but does it really
+     happen?  */
+  assert (!DWARF_IS_FP_LOC (loc));
+
+  if (DWARF_IS_REG_LOC (loc))
+    return (*c->as->acc.access_reg) (c->as, DWARF_GET_LOC (loc), val,
+                                     0, c->as_arg);
+
+  return (*c->as->acc.access_mem) (c->as, DWARF_GET_LOC (loc), val,
+                                   0, c->as_arg);
+}
+
+static inline int
+dwarf_put (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t val)
+{
+  if (DWARF_IS_NULL_LOC (loc))
+    return -UNW_EBADREG;
+
+  /* If a code-generator were to save a value of type unw_word_t in a
+     floating-point register, we would have to support this case.  I
+     suppose it could happen with MMX registers, but does it really
+     happen?  */
+  assert (!DWARF_IS_FP_LOC (loc));
+
+  if (DWARF_IS_REG_LOC (loc))
+    return (*c->as->acc.access_reg) (c->as, DWARF_GET_LOC (loc), &val,
+                                     1, c->as_arg);
+
+  return (*c->as->acc.access_mem) (c->as, DWARF_GET_LOC (loc), &val,
+                                   1, c->as_arg);
+}
+
+#endif /* !UNW_LOCAL_ONLY */
+
+#define tdep_getcontext_trace           unw_getcontext
+#define tdep_init_done                  UNW_OBJ(init_done)
+#define tdep_needs_initialization       UNW_OBJ(needs_initialization)
+#define tdep_init                       UNW_OBJ(init)
+/* Platforms that support UNW_INFO_FORMAT_TABLE need to define
+   tdep_search_unwind_table.  */
+#define tdep_search_unwind_table        dwarf_search_unwind_table
+#define tdep_find_unwind_table          dwarf_find_unwind_table
+#define tdep_uc_addr                    UNW_ARCH_OBJ(uc_addr)
+#define tdep_get_elf_image              UNW_ARCH_OBJ(get_elf_image)
+#define tdep_access_reg                 UNW_OBJ(access_reg)
+#define tdep_access_fpreg               UNW_OBJ(access_fpreg)
+#define tdep_fetch_frame(c,ip,n)        do {} while(0)
+#define tdep_cache_frame(c,rs)          do {} while(0)
+#define tdep_reuse_frame(c,rs)          do {} while(0)
+#define tdep_stash_frame(c,rs)          do {} while(0)
+#define tdep_trace(cur,addr,n)          (-UNW_ENOINFO)
+
+#ifdef UNW_LOCAL_ONLY
+#define tdep_find_proc_info(c,ip,n)                            \
+  dwarf_find_proc_info((c)->as, (ip), &(c)->pi, (n),           \
+                       (c)->as_arg)
+#define tdep_put_unwind_info(as,pi,arg)         \
+  dwarf_put_unwind_info((as), (pi), (arg))
+#else
+#define tdep_find_proc_info(c,ip,n)                                     \
+  (*(c)->as->acc.find_proc_info)((c)->as, (ip), &(c)->pi, (n),          \
+                                 (c)->as_arg)
+#define tdep_put_unwind_info(as,pi,arg)                 \
+  (*(as)->acc.put_unwind_info)((as), (pi), (arg))
+#endif
+
+#define tdep_get_as(c)                  ((c)->dwarf.as)
+#define tdep_get_as_arg(c)              ((c)->dwarf.as_arg)
+#define tdep_get_ip(c)                  ((c)->dwarf.ip)
+
+extern int tdep_init_done;
+
+extern void tdep_init (void);
+extern int tdep_search_unwind_table (unw_addr_space_t as,
+                                     unw_word_t ip,
+                                     unw_dyn_info_t *di,
+                                     unw_proc_info_t *pi,
+                                     int need_unwind_info,
+                                     void *arg);
+extern void *tdep_uc_addr (ucontext_t *uc, int reg);
+extern int tdep_get_elf_image (struct elf_image *ei,
+                               pid_t pid, unw_word_t ip,
+                               unsigned long *segbase,
+                               unsigned long *mapoff,
+                               char *path, size_t pathlen);
+extern int tdep_access_reg (struct cursor *c,
+                            unw_regnum_t reg,
+                            unw_word_t *valp,
+                            int write);
+extern int tdep_access_fpreg (struct cursor *c,
+                              unw_regnum_t reg,
+                              unw_fpreg_t *valp,
+                              int write);
+
+#endif /* TILEGX_LIBUNWIND_I_H */
diff --git a/frysk-imports/libunwind/include/tdep-x86/dwarf-config.h b/frysk-imports/libunwind/include/tdep-x86/dwarf-config.h
index 898ab79..f76f9c1 100644
--- a/frysk-imports/libunwind/include/tdep-x86/dwarf-config.h
+++ b/frysk-imports/libunwind/include/tdep-x86/dwarf-config.h
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (c) 2003 Hewlett-Packard Development Company, L.P.
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -29,22 +29,22 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 /* This matches the value used by GCC (see
    gcc/config/i386.h:DWARF_FRAME_REGISTERS), which leaves plenty of
    room for expansion.  */
-#define DWARF_NUM_PRESERVED_REGS	17
+#define DWARF_NUM_PRESERVED_REGS        17
 
-#define DWARF_REGNUM_MAP_LENGTH		19
+#define DWARF_REGNUM_MAP_LENGTH         19
 
 /* Return TRUE if the ADDR_SPACE uses big-endian byte-order.  */
-#define dwarf_is_big_endian(addr_space)	0
+#define dwarf_is_big_endian(addr_space) 0
 
 /* Convert a pointer to a dwarf_cursor structure to a pointer to
    unw_cursor_t.  */
-#define dwarf_to_cursor(c)	((unw_cursor_t *) (c))
+#define dwarf_to_cursor(c)      ((unw_cursor_t *) (c))
 
 typedef struct dwarf_loc
   {
     unw_word_t val;
 #ifndef UNW_LOCAL_ONLY
-    unw_word_t type;		/* see X86_LOC_TYPE_* macros.  */
+    unw_word_t type;            /* see X86_LOC_TYPE_* macros.  */
 #endif
   }
 dwarf_loc_t;
diff --git a/frysk-imports/libunwind/include/tdep-x86/jmpbuf.h b/frysk-imports/libunwind/include/tdep-x86/jmpbuf.h
index a0eb072..521dfa6 100644
--- a/frysk-imports/libunwind/include/tdep-x86/jmpbuf.h
+++ b/frysk-imports/libunwind/include/tdep-x86/jmpbuf.h
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -25,7 +25,18 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 /* Use glibc's jump-buffer indices; NPTL peeks at SP: */
 
-#define JB_SP		4
-#define JB_RP		5
-#define JB_MASK_SAVED	6
-#define JB_MASK		7
+#if defined __linux__
+
+#define JB_SP           4
+#define JB_RP           5
+#define JB_MASK_SAVED   6
+#define JB_MASK         7
+
+#elif defined __FreeBSD__
+
+#define JB_SP           2
+#define JB_RP           0
+#define JB_MASK_SAVED   11
+#define JB_MASK         7
+
+#endif
diff --git a/frysk-imports/libunwind/include/tdep-x86/libunwind_i.h b/frysk-imports/libunwind/include/tdep-x86/libunwind_i.h
index 55cdb84..b1c8b98 100644
--- a/frysk-imports/libunwind/include/tdep-x86/libunwind_i.h
+++ b/frysk-imports/libunwind/include/tdep-x86/libunwind_i.h
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2002-2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -36,6 +36,12 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #include "mempool.h"
 #include "dwarf.h"
 
+typedef struct
+  {
+    /* no x86-specific fast trace */
+  }
+unw_tdep_frame_t;
+
 struct unw_addr_space
   {
     struct unw_accessors acc;
@@ -45,40 +51,53 @@ struct unw_addr_space
 #else
     uint32_t cache_generation;
 #endif
-    unw_word_t dyn_generation;		/* see dyn-common.h */
-    unw_word_t dyn_info_list_addr;	/* (cached) dyn_info_list_addr */
+    unw_word_t dyn_generation;          /* see dyn-common.h */
+    unw_word_t dyn_info_list_addr;      /* (cached) dyn_info_list_addr */
     struct dwarf_rs_cache global_cache;
     struct unw_debug_frame_list *debug_frames;
    };
 
 struct cursor
   {
-    struct dwarf_cursor dwarf;		/* must be first */
+    struct dwarf_cursor dwarf;          /* must be first */
 
     /* Format of sigcontext structure and address at which it is
        stored: */
     enum
       {
-	X86_SCF_NONE,			/* no signal frame encountered */
-	X86_SCF_LINUX_SIGFRAME,		/* classic x86 sigcontext */
-	X86_SCF_LINUX_RT_SIGFRAME	/* POSIX ucontext_t */
+        X86_SCF_NONE,                   /* no signal frame encountered */
+        X86_SCF_LINUX_SIGFRAME,         /* Linux x86 sigcontext */
+        X86_SCF_LINUX_RT_SIGFRAME,      /* POSIX ucontext_t */
+        X86_SCF_FREEBSD_SIGFRAME,       /* FreeBSD x86 sigcontext */
+        X86_SCF_FREEBSD_SIGFRAME4,      /* FreeBSD 4.x x86 sigcontext */
+        X86_SCF_FREEBSD_OSIGFRAME,      /* FreeBSD pre-4.x x86 sigcontext */
+        X86_SCF_FREEBSD_SYSCALL,        /* FreeBSD x86 syscall */
       }
     sigcontext_format;
     unw_word_t sigcontext_addr;
+    int validate;
+    ucontext_t *uc;
   };
 
-#define DWARF_GET_LOC(l)	((l).val)
+static inline ucontext_t *
+dwarf_get_uc(const struct dwarf_cursor *cursor)
+{
+  const struct cursor *c = (struct cursor *) cursor->as_arg;
+  return c->uc;
+}
+
+#define DWARF_GET_LOC(l)        ((l).val)
 
 #ifdef UNW_LOCAL_ONLY
-# define DWARF_NULL_LOC		DWARF_LOC (0, 0)
-# define DWARF_IS_NULL_LOC(l)	(DWARF_GET_LOC (l) == 0)
-# define DWARF_LOC(r, t)	((dwarf_loc_t) { .val = (r) })
-# define DWARF_IS_REG_LOC(l)	0
-# define DWARF_REG_LOC(c,r)	(DWARF_LOC((unw_word_t)			     \
-				 tdep_uc_addr((c)->as_arg, (r)), 0))
-# define DWARF_MEM_LOC(c,m)	DWARF_LOC ((m), 0)
-# define DWARF_FPREG_LOC(c,r)	(DWARF_LOC((unw_word_t)			     \
-				 tdep_uc_addr((c)->as_arg, (r)), 0))
+# define DWARF_NULL_LOC         DWARF_LOC (0, 0)
+# define DWARF_IS_NULL_LOC(l)   (DWARF_GET_LOC (l) == 0)
+# define DWARF_LOC(r, t)        ((dwarf_loc_t) { .val = (r) })
+# define DWARF_IS_REG_LOC(l)    0
+# define DWARF_REG_LOC(c,r)     (DWARF_LOC((unw_word_t)                      \
+                                 tdep_uc_addr(dwarf_get_uc(c), (r)), 0))
+# define DWARF_MEM_LOC(c,m)     DWARF_LOC ((m), 0)
+# define DWARF_FPREG_LOC(c,r)   (DWARF_LOC((unw_word_t)                      \
+                                 tdep_uc_addr(dwarf_get_uc(c), (r)), 0))
 
 static inline int
 dwarf_getfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t *val)
@@ -103,8 +122,8 @@ dwarf_get (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t *val)
 {
   if (!DWARF_GET_LOC (loc))
     return -1;
-  *val = *(unw_word_t *) DWARF_GET_LOC (loc);
-  return 0;
+  return (*c->as->acc.access_mem) (c->as, DWARF_GET_LOC (loc), val,
+                                   0, c->as_arg);
 }
 
 static inline int
@@ -112,23 +131,23 @@ dwarf_put (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t val)
 {
   if (!DWARF_GET_LOC (loc))
     return -1;
-  *(unw_word_t *) DWARF_GET_LOC (loc) = val;
-  return 0;
+  return (*c->as->acc.access_mem) (c->as, DWARF_GET_LOC (loc), &val,
+                                   1, c->as_arg);
 }
 
 #else /* !UNW_LOCAL_ONLY */
-# define DWARF_LOC_TYPE_FP	(1 << 0)
-# define DWARF_LOC_TYPE_REG	(1 << 1)
-# define DWARF_NULL_LOC		DWARF_LOC (0, 0)
-# define DWARF_IS_NULL_LOC(l)						\
-		({ dwarf_loc_t _l = (l); _l.val == 0 && _l.type == 0; })
-# define DWARF_LOC(r, t)	((dwarf_loc_t) { .val = (r), .type = (t) })
-# define DWARF_IS_REG_LOC(l)	(((l).type & DWARF_LOC_TYPE_REG) != 0)
-# define DWARF_IS_FP_LOC(l)	(((l).type & DWARF_LOC_TYPE_FP) != 0)
-# define DWARF_REG_LOC(c,r)	DWARF_LOC((r), DWARF_LOC_TYPE_REG)
-# define DWARF_MEM_LOC(c,m)	DWARF_LOC ((m), 0)
-# define DWARF_FPREG_LOC(c,r)	DWARF_LOC((r), (DWARF_LOC_TYPE_REG	\
-						| DWARF_LOC_TYPE_FP))
+# define DWARF_LOC_TYPE_FP      (1 << 0)
+# define DWARF_LOC_TYPE_REG     (1 << 1)
+# define DWARF_NULL_LOC         DWARF_LOC (0, 0)
+# define DWARF_IS_NULL_LOC(l)                                           \
+                ({ dwarf_loc_t _l = (l); _l.val == 0 && _l.type == 0; })
+# define DWARF_LOC(r, t)        ((dwarf_loc_t) { .val = (r), .type = (t) })
+# define DWARF_IS_REG_LOC(l)    (((l).type & DWARF_LOC_TYPE_REG) != 0)
+# define DWARF_IS_FP_LOC(l)     (((l).type & DWARF_LOC_TYPE_FP) != 0)
+# define DWARF_REG_LOC(c,r)     DWARF_LOC((r), DWARF_LOC_TYPE_REG)
+# define DWARF_MEM_LOC(c,m)     DWARF_LOC ((m), 0)
+# define DWARF_FPREG_LOC(c,r)   DWARF_LOC((r), (DWARF_LOC_TYPE_REG      \
+                                                | DWARF_LOC_TYPE_FP))
 
 static inline int
 dwarf_getfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t *val)
@@ -142,15 +161,15 @@ dwarf_getfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t *val)
 
   if (DWARF_IS_REG_LOC (loc))
     return (*c->as->acc.access_fpreg) (c->as, DWARF_GET_LOC (loc),
-				       val, 0, c->as_arg);
+                                       val, 0, c->as_arg);
 
   addr = DWARF_GET_LOC (loc);
   if ((ret = (*c->as->acc.access_mem) (c->as, addr + 0, (unw_word_t *) valp,
-				       0, c->as_arg)) < 0)
+                                       0, c->as_arg)) < 0)
     return ret;
 
   return (*c->as->acc.access_mem) (c->as, addr + 4, (unw_word_t *) valp + 1, 0,
-				   c->as_arg);
+                                   c->as_arg);
 }
 
 static inline int
@@ -165,15 +184,15 @@ dwarf_putfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t val)
 
   if (DWARF_IS_REG_LOC (loc))
     return (*c->as->acc.access_fpreg) (c->as, DWARF_GET_LOC (loc),
-				       &val, 1, c->as_arg);
+                                       &val, 1, c->as_arg);
 
   addr = DWARF_GET_LOC (loc);
   if ((ret = (*c->as->acc.access_mem) (c->as, addr + 0, (unw_word_t *) valp,
-				       1, c->as_arg)) < 0)
+                                       1, c->as_arg)) < 0)
     return ret;
 
   return (*c->as->acc.access_mem) (c->as, addr + 4, (unw_word_t *) valp + 1,
-				   1, c->as_arg);
+                                   1, c->as_arg);
 }
 
 static inline int
@@ -190,10 +209,10 @@ dwarf_get (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t *val)
 
   if (DWARF_IS_REG_LOC (loc))
     return (*c->as->acc.access_reg) (c->as, DWARF_GET_LOC (loc), val,
-				     0, c->as_arg);
+                                     0, c->as_arg);
   else
     return (*c->as->acc.access_mem) (c->as, DWARF_GET_LOC (loc), val,
-				     0, c->as_arg);
+                                     0, c->as_arg);
 }
 
 static inline int
@@ -210,58 +229,63 @@ dwarf_put (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t val)
 
   if (DWARF_IS_REG_LOC (loc))
     return (*c->as->acc.access_reg) (c->as, DWARF_GET_LOC (loc), &val,
-				     1, c->as_arg);
+                                     1, c->as_arg);
   else
     return (*c->as->acc.access_mem) (c->as, DWARF_GET_LOC (loc), &val,
-				     1, c->as_arg);
+                                     1, c->as_arg);
 }
 
 #endif /* !UNW_LOCAL_ONLY */
 
-#define tdep_needs_initialization	UNW_OBJ(needs_initialization)
-#define tdep_init			UNW_OBJ(init)
+#define tdep_getcontext_trace           unw_getcontext
+#define tdep_init_done                  UNW_OBJ(init_done)
+#define tdep_init                       UNW_OBJ(init)
 /* Platforms that support UNW_INFO_FORMAT_TABLE need to define
    tdep_search_unwind_table.  */
-#define tdep_search_unwind_table	dwarf_search_unwind_table
-#define tdep_uc_addr			UNW_ARCH_OBJ(uc_addr)
-#define tdep_get_elf_image		UNW_ARCH_OBJ(get_elf_image)
-#define tdep_access_reg			UNW_OBJ(access_reg)
-#define tdep_access_fpreg		UNW_OBJ(access_fpreg)
-#define tdep_fetch_proc_info_post	UNW_OBJ(fetch_proc_info_post)
+#define tdep_search_unwind_table        dwarf_search_unwind_table
+#define tdep_find_unwind_table          dwarf_find_unwind_table
+#define tdep_uc_addr                    UNW_ARCH_OBJ(uc_addr)
+#define tdep_get_elf_image              UNW_ARCH_OBJ(get_elf_image)
+#define tdep_access_reg                 UNW_OBJ(access_reg)
+#define tdep_access_fpreg               UNW_OBJ(access_fpreg)
+#define tdep_fetch_frame(c,ip,n)        do {} while(0)
+#define tdep_cache_frame(c,rs)          do {} while(0)
+#define tdep_reuse_frame(c,rs)          do {} while(0)
+#define tdep_stash_frame(c,rs)          do {} while(0)
+#define tdep_trace(cur,addr,n)          (-UNW_ENOINFO)
 
 #ifdef UNW_LOCAL_ONLY
-# define tdep_find_proc_info(c,ip,n)				\
-	dwarf_find_proc_info((c)->as, (ip), &(c)->pi, (n),	\
-				       (c)->as_arg)
-# define tdep_put_unwind_info(as,pi,arg)		\
-	dwarf_put_unwind_info((as), (pi), (arg))
+# define tdep_find_proc_info(c,ip,n)                            \
+        dwarf_find_proc_info((c)->as, (ip), &(c)->pi, (n),      \
+                                       (c)->as_arg)
+# define tdep_put_unwind_info(as,pi,arg)                \
+        dwarf_put_unwind_info((as), (pi), (arg))
 #else
-# define tdep_find_proc_info(c,ip,n)					\
-	(*(c)->as->acc.find_proc_info)((c)->as, (ip), &(c)->pi, (n),	\
-				       (c)->as_arg)
-# define tdep_put_unwind_info(as,pi,arg)		\
-	(*(as)->acc.put_unwind_info)((as), (pi), (arg))
+# define tdep_find_proc_info(c,ip,n)                                    \
+        (*(c)->as->acc.find_proc_info)((c)->as, (ip), &(c)->pi, (n),    \
+                                       (c)->as_arg)
+# define tdep_put_unwind_info(as,pi,arg)                \
+        (*(as)->acc.put_unwind_info)((as), (pi), (arg))
 #endif
-extern int tdep_fetch_proc_info_post (struct dwarf_cursor *c, unw_word_t ip,
-				      int need_unwind_info);
 
-#define tdep_get_as(c)			((c)->dwarf.as)
-#define tdep_get_as_arg(c)		((c)->dwarf.as_arg)
-#define tdep_get_ip(c)			((c)->dwarf.ip)
-#define tdep_big_endian(as)		0
+#define tdep_get_as(c)                  ((c)->dwarf.as)
+#define tdep_get_as_arg(c)              ((c)->dwarf.as_arg)
+#define tdep_get_ip(c)                  ((c)->dwarf.ip)
+#define tdep_big_endian(as)             0
 
-extern int tdep_needs_initialization;
+extern int tdep_init_done;
 
 extern void tdep_init (void);
 extern int tdep_search_unwind_table (unw_addr_space_t as, unw_word_t ip,
-				     unw_dyn_info_t *di, unw_proc_info_t *pi,
-				     int need_unwind_info, void *arg);
+                                     unw_dyn_info_t *di, unw_proc_info_t *pi,
+                                     int need_unwind_info, void *arg);
 extern void *tdep_uc_addr (ucontext_t *uc, int reg);
 extern int tdep_get_elf_image (struct elf_image *ei, pid_t pid, unw_word_t ip,
-			       unsigned long *segbase, unsigned long *mapoff);
+                               unsigned long *segbase, unsigned long *mapoff,
+                               char *path, size_t pathlen);
 extern int tdep_access_reg (struct cursor *c, unw_regnum_t reg,
-			    unw_word_t *valp, int write);
+                            unw_word_t *valp, int write);
 extern int tdep_access_fpreg (struct cursor *c, unw_regnum_t reg,
-			      unw_fpreg_t *valp, int write);
+                              unw_fpreg_t *valp, int write);
 
 #endif /* X86_LIBUNWIND_I_H */
diff --git a/frysk-imports/libunwind/include/tdep-x86_64/dwarf-config.h b/frysk-imports/libunwind/include/tdep-x86_64/dwarf-config.h
index 8023f36..ff77808 100644
--- a/frysk-imports/libunwind/include/tdep-x86_64/dwarf-config.h
+++ b/frysk-imports/libunwind/include/tdep-x86_64/dwarf-config.h
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (c) 2003, 2005 Hewlett-Packard Development Company, L.P.
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
    Modified for x86_64 by Max Asbock <masbock@us.ibm.com>
 
@@ -32,23 +32,25 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #define dwarf_config_h
 
 /* XXX need to verify if this value is correct */
-#define DWARF_NUM_PRESERVED_REGS	17
+#ifdef CONFIG_MSABI_SUPPORT
+#define DWARF_NUM_PRESERVED_REGS        33
+#else
+#define DWARF_NUM_PRESERVED_REGS        17
+#endif 
 
-#define DWARF_REGNUM_MAP_LENGTH		17
+#define DWARF_REGNUM_MAP_LENGTH         DWARF_NUM_PRESERVED_REGS
 
 /* Return TRUE if the ADDR_SPACE uses big-endian byte-order.  */
-#define dwarf_is_big_endian(addr_space)	0
+#define dwarf_is_big_endian(addr_space) 0
 
 /* Convert a pointer to a dwarf_cursor structure to a pointer to
    unw_cursor_t.  */
-#define dwarf_to_cursor(c)	((unw_cursor_t *) (c))
+#define dwarf_to_cursor(c)      ((unw_cursor_t *) (c))
 
 typedef struct dwarf_loc
   {
     unw_word_t val;
-#ifndef UNW_LOCAL_ONLY
-    unw_word_t type;		/* see X86_LOC_TYPE_* macros.  */
-#endif
+    unw_word_t type;            /* see X86_LOC_TYPE_* macros.  */
   }
 dwarf_loc_t;
 
diff --git a/frysk-imports/libunwind/include/tdep-x86_64/jmpbuf.h b/frysk-imports/libunwind/include/tdep-x86_64/jmpbuf.h
index 9220068..d571966 100644
--- a/frysk-imports/libunwind/include/tdep-x86_64/jmpbuf.h
+++ b/frysk-imports/libunwind/include/tdep-x86_64/jmpbuf.h
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -23,9 +23,21 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
+#if defined __linux__
+
 /* Use glibc's jump-buffer indices; NPTL peeks at SP: */
 
-#define JB_SP		6
-#define JB_RP		7
-#define JB_MASK_SAVED	8
-#define JB_MASK		9
+#define JB_SP           6
+#define JB_RP           7
+#define JB_MASK_SAVED   8
+#define JB_MASK         9
+
+#elif defined __FreeBSD__
+
+#define JB_SP           2
+#define JB_RP           0
+/* Pretend the ip cannot be 0 and mask is always saved */
+#define JB_MASK_SAVED   0
+#define JB_MASK         9
+
+#endif
diff --git a/frysk-imports/libunwind/include/tdep-x86_64/libunwind_i.h b/frysk-imports/libunwind/include/tdep-x86_64/libunwind_i.h
index 46bf2b4..d19c705 100644
--- a/frysk-imports/libunwind/include/tdep-x86_64/libunwind_i.h
+++ b/frysk-imports/libunwind/include/tdep-x86_64/libunwind_i.h
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2002-2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
    Modified for x86_64 by Max Asbock <masbock@us.ibm.com>
 
@@ -38,6 +38,27 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #include "mempool.h"
 #include "dwarf.h"
 
+typedef enum
+  {
+    UNW_X86_64_FRAME_STANDARD = -2,     /* regular rbp, rsp +/- offset */
+    UNW_X86_64_FRAME_SIGRETURN = -1,    /* special sigreturn frame */
+    UNW_X86_64_FRAME_OTHER = 0,         /* not cacheable (special or unrecognised) */
+    UNW_X86_64_FRAME_GUESSED = 1        /* guessed it was regular, but not known */
+  }
+unw_tdep_frame_type_t;
+
+typedef struct
+  {
+    uint64_t virtual_address;
+    int64_t frame_type     : 2;  /* unw_tdep_frame_type_t classification */
+    int64_t last_frame     : 1;  /* non-zero if last frame in chain */
+    int64_t cfa_reg_rsp    : 1;  /* cfa dwarf base register is rsp vs. rbp */
+    int64_t cfa_reg_offset : 30; /* cfa is at this offset from base register value */
+    int64_t rbp_cfa_offset : 15; /* rbp saved at this offset from cfa (-1 = not saved) */
+    int64_t rsp_cfa_offset : 15; /* rsp saved at this offset from cfa (-1 = not saved) */
+  }
+unw_tdep_frame_t;
+
 struct unw_addr_space
   {
     struct unw_accessors acc;
@@ -47,54 +68,71 @@ struct unw_addr_space
 #else
     uint32_t cache_generation;
 #endif
-    unw_word_t dyn_generation;		/* see dyn-common.h */
-    unw_word_t dyn_info_list_addr;	/* (cached) dyn_info_list_addr */
+    unw_word_t dyn_generation;          /* see dyn-common.h */
+    unw_word_t dyn_info_list_addr;      /* (cached) dyn_info_list_addr */
     struct dwarf_rs_cache global_cache;
     struct unw_debug_frame_list *debug_frames;
-    int validate;
    };
 
 struct cursor
   {
-    struct dwarf_cursor dwarf;		/* must be first */
+    struct dwarf_cursor dwarf;          /* must be first */
+
+    unw_tdep_frame_t frame_info;        /* quick tracing assist info */
 
     /* Format of sigcontext structure and address at which it is
        stored: */
     enum
       {
-	X86_64_SCF_NONE,		/* no signal frame encountered */
-	X86_64_SCF_LINUX_RT_SIGFRAME	/* POSIX ucontext_t */
+        X86_64_SCF_NONE,                /* no signal frame encountered */
+        X86_64_SCF_LINUX_RT_SIGFRAME,   /* Linux ucontext_t */
+        X86_64_SCF_FREEBSD_SIGFRAME,    /* FreeBSD signal frame */
+        X86_64_SCF_FREEBSD_SYSCALL,     /* FreeBSD syscall */
       }
     sigcontext_format;
     unw_word_t sigcontext_addr;
+    int validate;
+    ucontext_t *uc;
   };
 
-#define DWARF_GET_LOC(l)	((l).val)
+static inline ucontext_t *
+dwarf_get_uc(const struct dwarf_cursor *cursor)
+{
+  const struct cursor *c = (struct cursor *) cursor->as_arg;
+  return c->uc;
+}
+
+#define DWARF_GET_LOC(l)        ((l).val)
+# define DWARF_LOC_TYPE_MEM     (0 << 0)
+# define DWARF_LOC_TYPE_FP      (1 << 0)
+# define DWARF_LOC_TYPE_REG     (1 << 1)
+# define DWARF_LOC_TYPE_VAL     (1 << 2)
+
+# define DWARF_IS_REG_LOC(l)    (((l).type & DWARF_LOC_TYPE_REG) != 0)
+# define DWARF_IS_FP_LOC(l)     (((l).type & DWARF_LOC_TYPE_FP) != 0)
+# define DWARF_IS_MEM_LOC(l)    ((l).type == DWARF_LOC_TYPE_MEM)
+# define DWARF_IS_VAL_LOC(l)    (((l).type & DWARF_LOC_TYPE_VAL) != 0)
+
+# define DWARF_LOC(r, t)        ((dwarf_loc_t) { .val = (r), .type = (t) })
+# define DWARF_VAL_LOC(c,v)     DWARF_LOC ((v), DWARF_LOC_TYPE_VAL)
+# define DWARF_MEM_LOC(c,m)     DWARF_LOC ((m), DWARF_LOC_TYPE_MEM)
 
 #ifdef UNW_LOCAL_ONLY
-# define DWARF_NULL_LOC		DWARF_LOC (0, 0)
-# define DWARF_IS_NULL_LOC(l)	(DWARF_GET_LOC (l) == 0)
-# define DWARF_LOC(r, t)	((dwarf_loc_t) { .val = (r) })
-# define DWARF_IS_REG_LOC(l)	0
-# define DWARF_REG_LOC(c,r)	(DWARF_LOC((unw_word_t)			     \
-				 tdep_uc_addr((c)->as_arg, (r)), 0))
-# define DWARF_MEM_LOC(c,m)	DWARF_LOC ((m), 0)
-# define DWARF_FPREG_LOC(c,r)	(DWARF_LOC((unw_word_t)			     \
-				 tdep_uc_addr((c)->as_arg, (r)), 0))
+# define DWARF_NULL_LOC         DWARF_LOC (0, 0)
+# define DWARF_IS_NULL_LOC(l)   (DWARF_GET_LOC (l) == 0)
+# define DWARF_REG_LOC(c,r)     (DWARF_LOC((unw_word_t)                      \
+                                 x86_64_r_uc_addr(dwarf_get_uc(c), (r)), 0))
+# define DWARF_FPREG_LOC(c,r)   (DWARF_LOC((unw_word_t)                      \
+                                 x86_64_r_uc_addr(dwarf_get_uc(c), (r)), 0))
+
 #else /* !UNW_LOCAL_ONLY */
 
-# define DWARF_LOC_TYPE_FP	(1 << 0)
-# define DWARF_LOC_TYPE_REG	(1 << 1)
-# define DWARF_NULL_LOC		DWARF_LOC (0, 0)
-# define DWARF_IS_NULL_LOC(l)						\
-		({ dwarf_loc_t _l = (l); _l.val == 0 && _l.type == 0; })
-# define DWARF_LOC(r, t)	((dwarf_loc_t) { .val = (r), .type = (t) })
-# define DWARF_IS_REG_LOC(l)	(((l).type & DWARF_LOC_TYPE_REG) != 0)
-# define DWARF_IS_FP_LOC(l)	(((l).type & DWARF_LOC_TYPE_FP) != 0)
-# define DWARF_REG_LOC(c,r)	DWARF_LOC((r), DWARF_LOC_TYPE_REG)
-# define DWARF_MEM_LOC(c,m)	DWARF_LOC ((m), 0)
-# define DWARF_FPREG_LOC(c,r)	DWARF_LOC((r), (DWARF_LOC_TYPE_REG	\
-						| DWARF_LOC_TYPE_FP))
+# define DWARF_NULL_LOC         DWARF_LOC (0, 0)
+# define DWARF_IS_NULL_LOC(l)                                           \
+                ({ dwarf_loc_t _l = (l); _l.val == 0 && _l.type == 0; })
+# define DWARF_REG_LOC(c,r)     DWARF_LOC((r), DWARF_LOC_TYPE_REG)
+# define DWARF_FPREG_LOC(c,r)   DWARF_LOC((r), (DWARF_LOC_TYPE_REG      \
+                                                | DWARF_LOC_TYPE_FP))
 
 #endif /* !UNW_LOCAL_ONLY */
 
@@ -124,70 +162,101 @@ dwarf_get (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t *val)
 
   if (DWARF_IS_REG_LOC (loc))
     return (*c->as->acc.access_reg) (c->as, DWARF_GET_LOC (loc), val,
-				     0, c->as_arg);
-  else
+                                     0, c->as_arg);
+  if (DWARF_IS_MEM_LOC (loc))
     return (*c->as->acc.access_mem) (c->as, DWARF_GET_LOC (loc), val,
-				     0, c->as_arg);
+                                     0, c->as_arg);
+  assert(DWARF_IS_VAL_LOC (loc));
+  *val = DWARF_GET_LOC (loc);
+  return 0;
 }
 
 static inline int
 dwarf_put (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t val)
 {
+  assert(!DWARF_IS_VAL_LOC (loc));
+
   if (DWARF_IS_NULL_LOC (loc))
     return -UNW_EBADREG;
 
   if (DWARF_IS_REG_LOC (loc))
     return (*c->as->acc.access_reg) (c->as, DWARF_GET_LOC (loc), &val,
-				     1, c->as_arg);
+                                     1, c->as_arg);
   else
     return (*c->as->acc.access_mem) (c->as, DWARF_GET_LOC (loc), &val,
-				     1, c->as_arg);
+                                     1, c->as_arg);
 }
 
-#define tdep_needs_initialization	UNW_OBJ(needs_initialization)
-#define tdep_init			UNW_OBJ(init)
+#define tdep_getcontext_trace           UNW_ARCH_OBJ(getcontext_trace)
+#define tdep_init_done                  UNW_OBJ(init_done)
+#define tdep_init_mem_validate          UNW_OBJ(init_mem_validate)
+#define tdep_init                       UNW_OBJ(init)
 /* Platforms that support UNW_INFO_FORMAT_TABLE need to define
    tdep_search_unwind_table.  */
-#define tdep_search_unwind_table	dwarf_search_unwind_table
-#define tdep_uc_addr			UNW_ARCH_OBJ(uc_addr)
-#define tdep_get_elf_image		UNW_ARCH_OBJ(get_elf_image)
-#define tdep_access_reg			UNW_OBJ(access_reg)
-#define tdep_access_fpreg		UNW_OBJ(access_fpreg)
-#define tdep_fetch_proc_info_post	UNW_OBJ(fetch_proc_info_post)
+#define tdep_search_unwind_table        dwarf_search_unwind_table
+#define tdep_find_unwind_table          dwarf_find_unwind_table
+#define tdep_get_elf_image              UNW_ARCH_OBJ(get_elf_image)
+#define tdep_access_reg                 UNW_OBJ(access_reg)
+#define tdep_access_fpreg               UNW_OBJ(access_fpreg)
+#if __linux__
+# define tdep_fetch_frame               UNW_OBJ(fetch_frame)
+# define tdep_cache_frame               UNW_OBJ(cache_frame)
+# define tdep_reuse_frame               UNW_OBJ(reuse_frame)
+#else
+# define tdep_fetch_frame(c,ip,n)       do {} while(0)
+# define tdep_cache_frame(c,rs)         do {} while(0)
+# define tdep_reuse_frame(c,rs)         do {} while(0)
+#endif
+#define tdep_stash_frame                UNW_OBJ(stash_frame)
+#define tdep_trace                      UNW_OBJ(tdep_trace)
+#define x86_64_r_uc_addr                UNW_OBJ(r_uc_addr)
 
 #ifdef UNW_LOCAL_ONLY
-# define tdep_find_proc_info(c,ip,n)				\
-	dwarf_find_proc_info((c)->as, (ip), &(c)->pi, (n),	\
-				       (c)->as_arg)
-# define tdep_put_unwind_info(as,pi,arg)		\
-	dwarf_put_unwind_info((as), (pi), (arg))
+# define tdep_find_proc_info(c,ip,n)                            \
+        dwarf_find_proc_info((c)->as, (ip), &(c)->pi, (n),      \
+                                       (c)->as_arg)
+# define tdep_put_unwind_info(as,pi,arg)                \
+        dwarf_put_unwind_info((as), (pi), (arg))
 #else
-# define tdep_find_proc_info(c,ip,n)					\
-	(*(c)->as->acc.find_proc_info)((c)->as, (ip), &(c)->pi, (n),	\
-				       (c)->as_arg)
-# define tdep_put_unwind_info(as,pi,arg)			\
-	(*(as)->acc.put_unwind_info)((as), (pi), (arg))
+# define tdep_find_proc_info(c,ip,n)                                    \
+        (*(c)->as->acc.find_proc_info)((c)->as, (ip), &(c)->pi, (n),    \
+                                       (c)->as_arg)
+# define tdep_put_unwind_info(as,pi,arg)                        \
+        (*(as)->acc.put_unwind_info)((as), (pi), (arg))
 #endif
-extern int tdep_fetch_proc_info_post (struct dwarf_cursor *c, unw_word_t ip,
-				      int need_unwind_info);
 
-#define tdep_get_as(c)			((c)->dwarf.as)
-#define tdep_get_as_arg(c)		((c)->dwarf.as_arg)
-#define tdep_get_ip(c)			((c)->dwarf.ip)
-#define tdep_big_endian(as)		0
+#define tdep_get_as(c)                  ((c)->dwarf.as)
+#define tdep_get_as_arg(c)              ((c)->dwarf.as_arg)
+#define tdep_get_ip(c)                  ((c)->dwarf.ip)
+#define tdep_big_endian(as)             0
 
-extern int tdep_needs_initialization;
+extern int tdep_init_done;
 
 extern void tdep_init (void);
+extern void tdep_init_mem_validate (void);
 extern int tdep_search_unwind_table (unw_addr_space_t as, unw_word_t ip,
-				     unw_dyn_info_t *di, unw_proc_info_t *pi,
-				     int need_unwind_info, void *arg);
-extern void *tdep_uc_addr (ucontext_t *uc, int reg);
+                                     unw_dyn_info_t *di, unw_proc_info_t *pi,
+                                     int need_unwind_info, void *arg);
+extern void *x86_64_r_uc_addr (ucontext_t *uc, int reg);
 extern int tdep_get_elf_image (struct elf_image *ei, pid_t pid, unw_word_t ip,
-			       unsigned long *segbase, unsigned long *mapoff);
+                               unsigned long *segbase, unsigned long *mapoff,
+                               char *path, size_t pathlen);
 extern int tdep_access_reg (struct cursor *c, unw_regnum_t reg,
-			    unw_word_t *valp, int write);
+                            unw_word_t *valp, int write);
 extern int tdep_access_fpreg (struct cursor *c, unw_regnum_t reg,
-			      unw_fpreg_t *valp, int write);
+                              unw_fpreg_t *valp, int write);
+#if __linux__
+extern void tdep_fetch_frame (struct dwarf_cursor *c, unw_word_t ip,
+                              int need_unwind_info);
+extern void tdep_cache_frame (struct dwarf_cursor *c,
+                              struct dwarf_reg_state *rs);
+extern void tdep_reuse_frame (struct dwarf_cursor *c,
+                              struct dwarf_reg_state *rs);
+extern void tdep_stash_frame (struct dwarf_cursor *c,
+                              struct dwarf_reg_state *rs);
+#endif
+
+extern int tdep_getcontext_trace (unw_tdep_context_t *);
+extern int tdep_trace (unw_cursor_t *cursor, void **addresses, int *n);
 
 #endif /* X86_64_LIBUNWIND_I_H */
diff --git a/frysk-imports/libunwind/include/tdep/dwarf-config.h b/frysk-imports/libunwind/include/tdep/dwarf-config.h
new file mode 100644
index 0000000..c759a46
--- /dev/null
+++ b/frysk-imports/libunwind/include/tdep/dwarf-config.h
@@ -0,0 +1,28 @@
+/* Provide a real file - not a symlink - as it would cause multiarch conflicts
+   when multiple different arch releases are installed simultaneously.  */
+
+#if defined __aarch64__
+# include "tdep-aarch64/dwarf-config.h"
+#elif defined __arm__
+# include "tdep-arm/dwarf-config.h"
+#elif defined __hppa__
+# include "tdep-hppa/dwarf-config.h"
+#elif defined __ia64__
+# include "tdep-ia64/dwarf-config.h"
+#elif defined __mips__
+# include "tdep-mips/dwarf-config.h"
+#elif defined __powerpc__ && !defined __powerpc64__
+# include "tdep-ppc32/dwarf-config.h"
+#elif defined __powerpc64__
+# include "tdep-ppc64/dwarf-config.h"
+#elif defined __sh__
+# include "tdep-sh/dwarf-config.h"
+#elif defined __i386__
+# include "tdep-x86/dwarf-config.h"
+#elif defined __x86_64__ || defined __amd64__
+# include "tdep-x86_64/dwarf-config.h"
+#elif defined __tilegx__
+# include "tdep-tilegx/dwarf-config.h"
+#else
+# error "Unsupported arch"
+#endif
diff --git a/frysk-imports/libunwind/include/tdep/jmpbuf.h b/frysk-imports/libunwind/include/tdep/jmpbuf.h
new file mode 100644
index 0000000..4eae183
--- /dev/null
+++ b/frysk-imports/libunwind/include/tdep/jmpbuf.h
@@ -0,0 +1,30 @@
+/* Provide a real file - not a symlink - as it would cause multiarch conflicts
+   when multiple different arch releases are installed simultaneously.  */
+
+#ifndef UNW_REMOTE_ONLY
+
+#if defined __aarch64__
+# include "tdep-aarch64/jmpbuf.h"
+#if defined __arm__
+# include "tdep-arm/jmpbuf.h"
+#elif defined __hppa__
+# include "tdep-hppa/jmpbuf.h"
+#elif defined __ia64__
+# include "tdep-ia64/jmpbuf.h"
+#elif defined __mips__
+# include "tdep-mips/jmpbuf.h"
+#elif defined __powerpc__ && !defined __powerpc64__
+# include "tdep-ppc32/jmpbuf.h"
+#elif defined __powerpc64__
+# include "tdep-ppc64/jmpbuf.h"
+#elif defined __i386__
+# include "tdep-x86/jmpbuf.h"
+#elif defined __x86_64__
+# include "tdep-x86_64/jmpbuf.h"
+#elif defined __tilegx__
+# include "tdep-tilegx/jmpbuf.h"
+#else
+# error "Unsupported arch"
+#endif
+
+#endif /* !UNW_REMOTE_ONLY */
diff --git a/frysk-imports/libunwind/include/tdep/libunwind_i.h.in b/frysk-imports/libunwind/include/tdep/libunwind_i.h.in
new file mode 100644
index 0000000..af05a7f
--- /dev/null
+++ b/frysk-imports/libunwind/include/tdep/libunwind_i.h.in
@@ -0,0 +1,37 @@
+/* Provide a real file - not a symlink - as it would cause multiarch conflicts
+   when multiple different arch releases are installed simultaneously.  */
+
+#ifndef UNW_REMOTE_ONLY
+
+#if defined __aarch64__
+# include "tdep-aarch64/libunwind_i.h"
+#elif defined __arm__
+# include "tdep-arm/libunwind_i.h"
+#elif defined __hppa__
+# include "tdep-hppa/libunwind_i.h"
+#elif defined __ia64__
+# include "tdep-ia64/libunwind_i.h"
+#elif defined __mips__
+# include "tdep-mips/libunwind_i.h"
+#elif defined __powerpc__ && !defined __powerpc64__
+# include "tdep-ppc32/libunwind_i.h"
+#elif defined __powerpc64__
+# include "tdep-ppc64/libunwind_i.h"
+#elif defined __sh__
+# include "tdep-sh/libunwind_i.h"
+#elif defined __i386__
+# include "tdep-x86/libunwind_i.h"
+#elif defined __x86_64__
+# include "tdep-x86_64/libunwind_i.h"
+#elif defined __tilegx__
+# include "tdep-tilegx/libunwind_i.h"
+#else
+# error "Unsupported arch"
+#endif
+
+
+#else /* UNW_REMOTE_ONLY */
+
+# include "tdep-@arch@/libunwind_i.h"
+
+#endif /* UNW_REMOTE_ONLY */
diff --git a/frysk-imports/libunwind/include/unwind.h b/frysk-imports/libunwind/include/unwind.h
index 1f94a0d..7cf128d 100644
--- a/frysk-imports/libunwind/include/unwind.h
+++ b/frysk-imports/libunwind/include/unwind.h
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -26,13 +26,16 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #ifndef _UNWIND_H
 #define _UNWIND_H
 
+/* For uint64_t */
+#include <stdint.h>
+
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 /* Minimal interface as per C++ ABI draft standard:
 
-	http://www.codesourcery.com/cxx-abi/abi-eh.html */
+        http://www.codesourcery.com/cxx-abi/abi-eh.html */
 
 typedef enum
   {
@@ -50,44 +53,44 @@ _Unwind_Reason_Code;
 
 typedef int _Unwind_Action;
 
-#define _UA_SEARCH_PHASE	1
-#define _UA_CLEANUP_PHASE	2
-#define _UA_HANDLER_FRAME	4
-#define _UA_FORCE_UNWIND	8
+#define _UA_SEARCH_PHASE        1
+#define _UA_CLEANUP_PHASE       2
+#define _UA_HANDLER_FRAME       4
+#define _UA_FORCE_UNWIND        8
 
-struct _Unwind_Context;		/* opaque data-structure */
-struct _Unwind_Exception;	/* forward-declaration */
+struct _Unwind_Context;         /* opaque data-structure */
+struct _Unwind_Exception;       /* forward-declaration */
 
 typedef void (*_Unwind_Exception_Cleanup_Fn) (_Unwind_Reason_Code,
-					      struct _Unwind_Exception *);
+                                              struct _Unwind_Exception *);
 
 typedef _Unwind_Reason_Code (*_Unwind_Stop_Fn) (int, _Unwind_Action,
-						unsigned long,
-						struct _Unwind_Exception *,
-						struct _Unwind_Context *,
-						void *);
+                                                uint64_t,
+                                                struct _Unwind_Exception *,
+                                                struct _Unwind_Context *,
+                                                void *);
 
 /* The C++ ABI requires exception_class, private_1, and private_2 to
    be of type uint64 and the entire structure to be
-   double-word-aligned, but that seems a bit overly IA-64-specific.
-   Using "unsigned long" instead should give us the desired effect on
-   IA-64, while being more general.  */
+   double-word-aligned. Please note that exception_class stays 64-bit 
+   even on 32-bit machines for gcc compatibility.  */
 struct _Unwind_Exception
   {
-    unsigned long exception_class;
+    uint64_t exception_class;
     _Unwind_Exception_Cleanup_Fn exception_cleanup;
     unsigned long private_1;
     unsigned long private_2;
-  };
+  } __attribute__((__aligned__));
 
 extern _Unwind_Reason_Code _Unwind_RaiseException (struct _Unwind_Exception *);
 extern _Unwind_Reason_Code _Unwind_ForcedUnwind (struct _Unwind_Exception *,
-						 _Unwind_Stop_Fn, void *);
+                                                 _Unwind_Stop_Fn, void *);
 extern void _Unwind_Resume (struct _Unwind_Exception *);
 extern void _Unwind_DeleteException (struct _Unwind_Exception *);
 extern unsigned long _Unwind_GetGR (struct _Unwind_Context *, int);
 extern void _Unwind_SetGR (struct _Unwind_Context *, int, unsigned long);
 extern unsigned long _Unwind_GetIP (struct _Unwind_Context *);
+extern unsigned long _Unwind_GetIPInfo (struct _Unwind_Context *, int *);
 extern void _Unwind_SetIP (struct _Unwind_Context *, unsigned long);
 extern unsigned long _Unwind_GetLanguageSpecificData (struct _Unwind_Context*);
 extern unsigned long _Unwind_GetRegionStart (struct _Unwind_Context *);
@@ -97,17 +100,17 @@ extern unsigned long _Unwind_GetRegionStart (struct _Unwind_Context *);
 /* Callback for _Unwind_Backtrace().  The backtrace stops immediately
    if the callback returns any value other than _URC_NO_REASON. */
 typedef _Unwind_Reason_Code (*_Unwind_Trace_Fn) (struct _Unwind_Context *,
-						 void *);
+                                                 void *);
 
 /* See http://gcc.gnu.org/ml/gcc-patches/2001-09/msg00082.html for why
    _UA_END_OF_STACK exists.  */
-# define _UA_END_OF_STACK	16
+# define _UA_END_OF_STACK       16
 
 /* If the unwind was initiated due to a forced unwind, resume that
    operation, else re-raise the exception.  This is used by
    __cxa_rethrow().  */
 extern _Unwind_Reason_Code
-	  _Unwind_Resume_or_Rethrow (struct _Unwind_Exception *);
+          _Unwind_Resume_or_Rethrow (struct _Unwind_Exception *);
 
 /* See http://gcc.gnu.org/ml/gcc-patches/2003-09/msg00154.html for why
    _Unwind_GetBSP() exists.  */
diff --git a/frysk-imports/libunwind/include/x86/jmpbuf.h b/frysk-imports/libunwind/include/x86/jmpbuf.h
index a0eb072..94d5984 100644
--- a/frysk-imports/libunwind/include/x86/jmpbuf.h
+++ b/frysk-imports/libunwind/include/x86/jmpbuf.h
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -25,7 +25,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 /* Use glibc's jump-buffer indices; NPTL peeks at SP: */
 
-#define JB_SP		4
-#define JB_RP		5
-#define JB_MASK_SAVED	6
-#define JB_MASK		7
+#define JB_SP           4
+#define JB_RP           5
+#define JB_MASK_SAVED   6
+#define JB_MASK         7
diff --git a/frysk-imports/libunwind/include/x86_64/jmpbuf.h b/frysk-imports/libunwind/include/x86_64/jmpbuf.h
deleted file mode 100644
index 9220068..0000000
--- a/frysk-imports/libunwind/include/x86_64/jmpbuf.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/* libunwind - a platform-independent unwind library
-   Copyright (C) 2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
-
-This file is part of libunwind.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
-
-/* Use glibc's jump-buffer indices; NPTL peeks at SP: */
-
-#define JB_SP		6
-#define JB_RP		7
-#define JB_MASK_SAVED	8
-#define JB_MASK		9
diff --git a/frysk-imports/libunwind/src/.gitignore b/frysk-imports/libunwind/src/.gitignore
deleted file mode 100644
index 70845e0..0000000
--- a/frysk-imports/libunwind/src/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-Makefile.in
diff --git a/frysk-imports/libunwind/src/Makefile.am b/frysk-imports/libunwind/src/Makefile.am
index 66a0aea..c187a9a 100644
--- a/frysk-imports/libunwind/src/Makefile.am
+++ b/frysk-imports/libunwind/src/Makefile.am
@@ -1,49 +1,99 @@
-SOVERSION=7:0:0		# See comments at end of file.
+SOVERSION=8:1:0		# See comments at end of file.
 SETJMP_SO_VERSION=0:0:0
+COREDUMP_SO_VERSION=0:0:0
 #
 # Don't link with start-files since we don't use any constructors/destructors:
 #
-COMMON_SO_LDFLAGS =	-XCClinker -nostartfiles
+COMMON_SO_LDFLAGS = $(LDFLAGS_NOSTARTFILES)
 
-if REMOTE_ONLY
-LIBRARIES_cdep			=
-lib_LTLIBRARIES_cdep		=
-lib_LTLIBRARIES_cdep_setjmp	=
-else
-LIBRARIES_cdep			= libunwind-ptrace.a
-lib_LTLIBRARIES_cdep		= libunwind.la
-lib_LTLIBRARIES_cdep_setjmp	= libunwind-setjmp.la
+lib_LIBRARIES =
+lib_LTLIBRARIES =
+if !REMOTE_ONLY
+lib_LTLIBRARIES += libunwind.la
+if BUILD_PTRACE
+lib_LTLIBRARIES += libunwind-ptrace.la
+endif
+if BUILD_COREDUMP
+lib_LTLIBRARIES += libunwind-coredump.la
+endif
+endif
+
+noinst_HEADERS =
+noinst_LTLIBRARIES =
+
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = libunwind-generic.pc
+
+if !REMOTE_ONLY
+pkgconfig_DATA += unwind/libunwind.pc
+endif
+
+if BUILD_PTRACE
+pkgconfig_DATA += ptrace/libunwind-ptrace.pc
+endif
+
+if BUILD_SETJMP
+pkgconfig_DATA += setjmp/libunwind-setjmp.pc
+endif
+
+if BUILD_COREDUMP
+pkgconfig_DATA += coredump/libunwind-coredump.pc
 endif
 
 ### libunwind-ptrace:
-libunwind_ptrace_a_SOURCES =						  \
+libunwind_ptrace_la_SOURCES =						  \
 	ptrace/_UPT_elf.c						  \
-	ptrace/_UPT_internal.h						  \
 	ptrace/_UPT_accessors.c ptrace/_UPT_access_fpreg.c		  \
 	ptrace/_UPT_access_mem.c ptrace/_UPT_access_reg.c		  \
 	ptrace/_UPT_create.c ptrace/_UPT_destroy.c			  \
 	ptrace/_UPT_find_proc_info.c ptrace/_UPT_get_dyn_info_list_addr.c \
 	ptrace/_UPT_put_unwind_info.c ptrace/_UPT_get_proc_name.c	  \
 	ptrace/_UPT_reg_offset.c ptrace/_UPT_resume.c
+noinst_HEADERS += ptrace/_UPT_internal.h
+
+### libunwind-coredump:
+libunwind_coredump_la_SOURCES = \
+	coredump/_UCD_accessors.c \
+	coredump/_UCD_create.c \
+	coredump/_UCD_destroy.c \
+	coredump/_UCD_access_mem.c \
+	coredump/_UCD_elf_map_image.c \
+	coredump/_UCD_find_proc_info.c \
+	coredump/_UCD_get_proc_name.c \
+	\
+	coredump/_UPT_elf.c \
+	coredump/_UPT_access_fpreg.c \
+	coredump/_UPT_get_dyn_info_list_addr.c \
+	coredump/_UPT_put_unwind_info.c \
+	coredump/_UPT_resume.c
+libunwind_coredump_la_LDFLAGS = $(COMMON_SO_LDFLAGS) \
+				-version-info $(COREDUMP_SO_VERSION)
+libunwind_coredump_la_LIBADD = $(LIBLZMA)
+noinst_HEADERS += coredump/_UCD_internal.h coredump/_UCD_lib.h
 
 ### libunwind-setjmp:
 libunwind_setjmp_la_LDFLAGS		= $(COMMON_SO_LDFLAGS)		     \
 					  -version-info $(SETJMP_SO_VERSION)
-libunwind_setjmp_la_LIBADD		= libunwind-$(arch).la -lc
-libunwind_setjmp_la_SOURCES_common	= setjmp/setjmp_i.h 	\
-					  setjmp/longjmp.c	\
+
+if USE_ELF32
+LIBUNWIND_ELF = libunwind-elf32.la
+endif
+if USE_ELF64
+LIBUNWIND_ELF = libunwind-elf64.la
+endif
+if USE_ELFXX
+LIBUNWIND_ELF = libunwind-elfxx.la
+endif
+
+libunwind_setjmp_la_LIBADD		= $(LIBUNWIND_ELF)	\
+					  libunwind-$(arch).la	\
+					  libunwind.la -lc
+libunwind_setjmp_la_SOURCES		= setjmp/longjmp.c	\
 					  setjmp/siglongjmp.c
-libunwind_setjmp_la_SOURCES_arm		= arm/siglongjmp.S
-libunwind_setjmp_la_SOURCES_ia64	= ia64/setjmp.S  ia64/sigsetjmp.S  \
-					  ia64/longjmp.S ia64/siglongjmp.S
-libunwind_setjmp_la_SOURCES_hppa	= hppa/siglongjmp.S
-libunwind_setjmp_la_SOURCES_mips	= mips/siglongjmp.S
-libunwind_setjmp_la_SOURCES_x86		= x86/longjmp.S x86/siglongjmp.S
-libunwind_setjmp_la_SOURCES_x86_64	= x86_64/longjmp.S x86_64/siglongjmp.S
-libunwind_setjmp_la_SOURCES_ppc64       = ppc/longjmp.S ppc/siglongjmp.S
-libunwind_setjmp_la_SOURCES_ppc32       = ppc/longjmp.S ppc/siglongjmp.S
+noinst_HEADERS				+= setjmp/setjmp_i.h
 
 ### libunwind:
+libunwind_la_LIBADD =
 
 # List of arch-independent files needed by both local-only and generic
 # libraries:
@@ -59,8 +109,10 @@ libunwind_la_SOURCES_generic =						\
 	mi/Gput_dynamic_unwind_info.c mi/Gdestroy_addr_space.c		\
 	mi/Gget_reg.c mi/Gset_reg.c					\
 	mi/Gget_fpreg.c mi/Gset_fpreg.c					\
-	mi/Gset_caching_policy.c mi/Gget_unwind_table.c
+	mi/Gget_unwind_table.c						\
+	mi/Gset_caching_policy.c
 
+if SUPPORT_CXX_EXCEPTIONS
 libunwind_la_SOURCES_local_unwind =					\
 	unwind/Backtrace.c unwind/DeleteException.c			\
 	unwind/FindEnclosingFunction.c unwind/ForcedUnwind.c		\
@@ -68,7 +120,12 @@ libunwind_la_SOURCES_local_unwind =					\
 	unwind/GetGR.c unwind/GetIP.c unwind/GetLanguageSpecificData.c	\
 	unwind/GetRegionStart.c unwind/GetTextRelBase.c			\
 	unwind/RaiseException.c unwind/Resume.c				\
-	unwind/Resume_or_Rethrow.c unwind/SetGR.c unwind/SetIP.c
+	unwind/Resume_or_Rethrow.c unwind/SetGR.c unwind/SetIP.c	\
+	unwind/GetIPInfo.c
+
+#  _ReadULEB()/_ReadSLEB() are needed for Intel C++ 8.0 compatibility
+libunwind_la_SOURCES_os_linux_local = mi/_ReadULEB.c mi/_ReadSLEB.c
+endif
 
 # List of arch-independent files needed by local-only library (libunwind):
 libunwind_la_SOURCES_local_nounwind =					\
@@ -83,67 +140,101 @@ libunwind_la_SOURCES_local_nounwind =					\
 	mi/Lget_fpreg.c mi/Lset_fpreg.c					\
 	mi/Lset_caching_policy.c
 
-# On some platforms, defining _Unwind replacements really upsets
-# exception-handling.  Turn off those functions for those platforms.
-if ARCH_ARM
-libunwind_la_SOURCES_local =						\
-	$(libunwind_la_SOURCES_local_nounwind)
-else
-if ARCH_MIPS
-libunwind_la_SOURCES_local =						\
-	$(libunwind_la_SOURCES_local_nounwind)
-else
 libunwind_la_SOURCES_local =						\
 	$(libunwind_la_SOURCES_local_nounwind)				\
 	$(libunwind_la_SOURCES_local_unwind)
-endif # ARCH_MIPS
-endif # ARCH_ARM
 
-libunwind_la_SOURCES_os_linux = os-linux.h os-linux.c
+noinst_HEADERS += os-linux.h
+libunwind_la_SOURCES_os_linux = os-linux.c
 
-#  _ReadULEB()/_ReadSLEB() are needed for Intel C++ 8.0 compatibility
-libunwind_la_SOURCES_os_linux_local = mi/_ReadULEB.c mi/_ReadSLEB.c
 libunwind_la_SOURCES_os_hpux = os-hpux.c
 
-dwarf_SOURCES_common =				\
-	dwarf/global.c
+libunwind_la_SOURCES_os_freebsd = os-freebsd.c
+
+libunwind_la_SOURCES_os_qnx = os-qnx.c
+
+libunwind_dwarf_common_la_SOURCES = dwarf/global.c
+
+libunwind_dwarf_local_la_SOURCES = \
+	dwarf/Lexpr.c dwarf/Lfde.c dwarf/Lparser.c dwarf/Lpe.c dwarf/Lstep.c \
+	dwarf/Lfind_proc_info-lsb.c \
+	dwarf/Lfind_unwind_table.c
+libunwind_dwarf_local_la_LIBADD = libunwind-dwarf-common.la
 
-dwarf_SOURCES_local =							     \
-	dwarf/Lexpr.c dwarf/Lfde.c dwarf/Lparser.c dwarf/Lpe.c dwarf/Lstep.c
+libunwind_dwarf_generic_la_SOURCES = \
+	dwarf/Gexpr.c dwarf/Gfde.c dwarf/Gparser.c dwarf/Gpe.c dwarf/Gstep.c \
+	dwarf/Gfind_proc_info-lsb.c \
+	dwarf/Gfind_unwind_table.c
+libunwind_dwarf_generic_la_LIBADD = libunwind-dwarf-common.la
 
-dwarf_SOURCES_generic =							     \
-	dwarf/Gexpr.c dwarf/Gfde.c dwarf/Gparser.c dwarf/Gpe.c dwarf/Gstep.c
+if USE_DWARF
+ noinst_LTLIBRARIES += libunwind-dwarf-common.la libunwind-dwarf-generic.la
+if !REMOTE_ONLY
+ noinst_LTLIBRARIES += libunwind-dwarf-local.la
+endif
+ libunwind_la_LIBADD += libunwind-dwarf-local.la
+endif
+
+noinst_HEADERS += elf32.h elf64.h elfxx.h
+
+libunwind_elf32_la_SOURCES = elf32.c
+libunwind_elf64_la_SOURCES = elf64.c
+libunwind_elfxx_la_SOURCES = elfxx.c
+libunwind_elf32_la_LIBADD  = $(LIBLZMA)
+libunwind_elf64_la_LIBADD  = $(LIBLZMA)
+libunwind_elfxx_la_LIBADD  = $(LIBLZMA)
 
-# The list of files that go info libunwind and libunwind-arm:
+noinst_LTLIBRARIES += $(LIBUNWIND_ELF)
+libunwind_la_LIBADD += $(LIBUNWIND_ELF)
+
+# The list of files that go into libunwind and libunwind-aarch64:
+noinst_HEADERS += aarch64/init.h aarch64/offsets.h aarch64/unwind_i.h
+libunwind_la_SOURCES_aarch64_common = $(libunwind_la_SOURCES_common)	    \
+	aarch64/is_fpreg.c aarch64/regname.c
+
+# The list of files that go into libunwind:
+libunwind_la_SOURCES_aarch64 = $(libunwind_la_SOURCES_aarch64_common)	    \
+	$(libunwind_la_SOURCES_local)					    \
+	aarch64/Lcreate_addr_space.c aarch64/Lget_proc_info.c 		    \
+	aarch64/Lget_save_loc.c aarch64/Lglobal.c aarch64/Linit.c	    \
+	aarch64/Linit_local.c aarch64/Linit_remote.c 			    \
+	aarch64/Lis_signal_frame.c aarch64/Lregs.c aarch64/Lresume.c 	    \
+	aarch64/Lstash_frame.c aarch64/Lstep.c aarch64/Ltrace.c		    \
+	aarch64/getcontext.S
+
+libunwind_aarch64_la_SOURCES_aarch64 = $(libunwind_la_SOURCES_aarch64_common) \
+	$(libunwind_la_SOURCES_generic)					      \
+	aarch64/Gcreate_addr_space.c aarch64/Gget_proc_info.c 		      \
+	aarch64/Gget_save_loc.c aarch64/Gglobal.c aarch64/Ginit.c 	      \
+	aarch64/Ginit_local.c aarch64/Ginit_remote.c			      \
+	aarch64/Gis_signal_frame.c aarch64/Gregs.c aarch64/Gresume.c	      \
+	aarch64/Gstash_frame.c aarch64/Gstep.c aarch64/Gtrace.c
+
+# The list of files that go into libunwind and libunwind-arm:
+noinst_HEADERS += arm/init.h arm/offsets.h arm/unwind_i.h
 libunwind_la_SOURCES_arm_common = $(libunwind_la_SOURCES_common)	    \
-	$(dwarf_SOURCES_common)						    \
-	elf32.c elf32.h							    \
-	arm/init.h arm/offsets.h arm/regs.h				    \
 	arm/is_fpreg.c arm/regname.c
 
 # The list of files that go into libunwind:
 libunwind_la_SOURCES_arm = $(libunwind_la_SOURCES_arm_common)		    \
 	$(libunwind_la_SOURCES_local)					    \
 	arm/getcontext.S						    \
-	$(dwarf_SOURCES_local)						    \
-	dwarf/Lfind_proc_info-lsb.c					    \
 	arm/Lcreate_addr_space.c arm/Lget_proc_info.c arm/Lget_save_loc.c   \
 	arm/Lglobal.c arm/Linit.c arm/Linit_local.c arm/Linit_remote.c	    \
-	arm/Lis_signal_frame.c arm/Lregs.c arm/Lresume.c arm/Lstep.c
+	arm/Lis_signal_frame.c arm/Lregs.c arm/Lresume.c arm/Lstep.c	    \
+	arm/Lex_tables.c arm/Lstash_frame.c arm/Ltrace.c
 
 libunwind_arm_la_SOURCES_arm = $(libunwind_la_SOURCES_arm_common)	    \
 	$(libunwind_la_SOURCES_generic)					    \
-	$(dwarf_SOURCES_generic) 					    \
-	dwarf/Gfind_proc_info-lsb.c					    \
 	arm/Gcreate_addr_space.c arm/Gget_proc_info.c arm/Gget_save_loc.c   \
 	arm/Gglobal.c arm/Ginit.c arm/Ginit_local.c arm/Ginit_remote.c	    \
-	arm/Gis_signal_frame.c arm/Gregs.c arm/Gresume.c arm/Gstep.c
+	arm/Gis_signal_frame.c arm/Gregs.c arm/Gresume.c arm/Gstep.c	    \
+	arm/Gex_tables.c arm/Gstash_frame.c arm/Gtrace.c
 
 # The list of files that go both into libunwind and libunwind-ia64:
+noinst_HEADERS += ia64/init.h ia64/offsets.h ia64/regs.h		    \
+	ia64/ucontext_i.h ia64/unwind_decoder.h ia64/unwind_i.h
 libunwind_la_SOURCES_ia64_common = $(libunwind_la_SOURCES_common)	    \
-	elf64.c elf64.h							    \
-	ia64/init.h ia64/offsets.h ia64/regs.h				    \
-	ia64/ucontext_i.h ia64/unwind_decoder.h ia64/unwind_i.h		    \
 	ia64/regname.c
 
 # The list of files that go into libunwind:
@@ -156,7 +247,7 @@ libunwind_la_SOURCES_ia64 = $(libunwind_la_SOURCES_ia64_common)		     \
 	ia64/Lglobal.c ia64/Linit.c ia64/Linit_local.c ia64/Linit_remote.c   \
 	ia64/Linstall_cursor.S ia64/Lis_signal_frame.c ia64/Lparser.c	     \
 	ia64/Lrbs.c ia64/Lregs.c ia64/Lresume.c ia64/Lscript.c ia64/Lstep.c  \
-	ia64/Ltables.c
+	ia64/Ltables.c ia64/Lfind_unwind_table.c
 
 # The list of files that go into libunwind-ia64:
 libunwind_ia64_la_SOURCES_ia64 = $(libunwind_la_SOURCES_ia64_common)	     \
@@ -165,21 +256,17 @@ libunwind_ia64_la_SOURCES_ia64 = $(libunwind_la_SOURCES_ia64_common)	     \
 	ia64/Gglobal.c ia64/Ginit.c ia64/Ginit_local.c ia64/Ginit_remote.c   \
 	ia64/Ginstall_cursor.S ia64/Gis_signal_frame.c ia64/Gparser.c	     \
 	ia64/Grbs.c ia64/Gregs.c ia64/Gresume.c ia64/Gscript.c ia64/Gstep.c  \
-	ia64/Gtables.c
+	ia64/Gtables.c ia64/Gfind_unwind_table.c
 
 # The list of files that go both into libunwind and libunwind-hppa:
+noinst_HEADERS += hppa/init.h hppa/offsets.h hppa/unwind_i.h
 libunwind_la_SOURCES_hppa_common = $(libunwind_la_SOURCES_common)	\
-	$(dwarf_SOURCES_common)						\
-	elf32.c elf32.h							\
-	hppa/init.h hppa/offsets.h hppa/unwind_i.h			\
 	hppa/regname.c
 
 # The list of files that go into libunwind:
 libunwind_la_SOURCES_hppa = $(libunwind_la_SOURCES_hppa_common)		\
 	$(libunwind_la_SOURCES_local)					\
 	hppa/getcontext.S hppa/setcontext.S				\
-	$(dwarf_SOURCES_local)						\
-	dwarf/Lfind_proc_info-lsb.c					\
 	hppa/Lcreate_addr_space.c hppa/Lget_save_loc.c hppa/Lglobal.c	\
 	hppa/Linit.c hppa/Linit_local.c hppa/Linit_remote.c		\
 	hppa/Lis_signal_frame.c hppa/Lget_proc_info.c hppa/Lregs.c	\
@@ -188,172 +275,195 @@ libunwind_la_SOURCES_hppa = $(libunwind_la_SOURCES_hppa_common)		\
 # The list of files that go into libunwind-hppa:
 libunwind_hppa_la_SOURCES_hppa = $(libunwind_la_SOURCES_hppa_common)	\
 	$(libunwind_la_SOURCES_generic)					\
-	$(dwarf_SOURCES_generic)					\
-	dwarf/Gfind_proc_info-lsb.c					\
 	hppa/Gcreate_addr_space.c hppa/Gget_save_loc.c hppa/Gglobal.c	\
 	hppa/Ginit.c hppa/Ginit_local.c hppa/Ginit_remote.c		\
 	hppa/Gis_signal_frame.c hppa/Gget_proc_info.c hppa/Gregs.c	\
 	hppa/Gresume.c hppa/Gstep.c
 
 # The list of files that go info libunwind and libunwind-mips:
+noinst_HEADERS += mips/init.h mips/offsets.h
 libunwind_la_SOURCES_mips_common = $(libunwind_la_SOURCES_common)	    \
-	$(dwarf_SOURCES_common)						    \
-	elfxx.c								    \
-	mips/init.h mips/offsets.h mips/regs.h				    \
 	mips/is_fpreg.c mips/regname.c
 
 # The list of files that go into libunwind:
 libunwind_la_SOURCES_mips = $(libunwind_la_SOURCES_mips_common)		    \
 	$(libunwind_la_SOURCES_local)					    \
 	mips/getcontext.S						    \
-	$(dwarf_SOURCES_local)						    \
-	dwarf/Lfind_proc_info-lsb.c					    \
 	mips/Lcreate_addr_space.c mips/Lget_proc_info.c mips/Lget_save_loc.c   \
 	mips/Lglobal.c mips/Linit.c mips/Linit_local.c mips/Linit_remote.c  \
 	mips/Lis_signal_frame.c mips/Lregs.c mips/Lresume.c mips/Lstep.c
 
 libunwind_mips_la_SOURCES_mips = $(libunwind_la_SOURCES_mips_common)	    \
 	$(libunwind_la_SOURCES_generic)					    \
-	$(dwarf_SOURCES_generic) 					    \
-	dwarf/Gfind_proc_info-lsb.c					    \
 	mips/Gcreate_addr_space.c mips/Gget_proc_info.c mips/Gget_save_loc.c   \
 	mips/Gglobal.c mips/Ginit.c mips/Ginit_local.c mips/Ginit_remote.c	    \
 	mips/Gis_signal_frame.c mips/Gregs.c mips/Gresume.c mips/Gstep.c
 
+# The list of files that go info libunwind and libunwind-tilegx:
+noinst_HEADERS += tilegx/init.h tilegx/offsets.h
+libunwind_la_SOURCES_tilegx_common = $(libunwind_la_SOURCES_common)	    \
+	tilegx/is_fpreg.c tilegx/regname.c
+
+# The list of files that go into libunwind:
+libunwind_la_SOURCES_tilegx = $(libunwind_la_SOURCES_tilegx_common)		    \
+	$(libunwind_la_SOURCES_local)					    \
+	tilegx/getcontext.S						\
+	tilegx/Lcreate_addr_space.c tilegx/Lget_proc_info.c tilegx/Lget_save_loc.c   \
+	tilegx/Lglobal.c tilegx/Linit.c tilegx/Linit_local.c tilegx/Linit_remote.c  \
+	tilegx/Lis_signal_frame.c tilegx/Lregs.c tilegx/Lresume.c tilegx/Lstep.c
+
+libunwind_tilegx_la_SOURCES_tilegx = $(libunwind_la_SOURCES_tilegx_common)	    \
+	$(libunwind_la_SOURCES_generic)					    \
+	tilegx/Gcreate_addr_space.c tilegx/Gget_proc_info.c tilegx/Gget_save_loc.c   \
+	tilegx/Gglobal.c tilegx/Ginit.c tilegx/Ginit_local.c tilegx/Ginit_remote.c	    \
+	tilegx/Gis_signal_frame.c tilegx/Gregs.c tilegx/Gresume.c tilegx/Gstep.c
+
+
 # The list of files that go both into libunwind and libunwind-x86:
+noinst_HEADERS += x86/init.h x86/offsets.h x86/unwind_i.h
 libunwind_la_SOURCES_x86_common = $(libunwind_la_SOURCES_common)	\
-	$(dwarf_SOURCES_common)						\
-	elf32.c elf32.h							\
-	x86/init.h x86/offsets.h x86/unwind_i.h				\
 	x86/is_fpreg.c x86/regname.c
 
 # The list of files that go into libunwind:
 libunwind_la_SOURCES_x86 = $(libunwind_la_SOURCES_x86_common)		\
+        $(libunwind_la_SOURCES_x86_os_local)				\
 	$(libunwind_la_SOURCES_local)					\
-	$(dwarf_SOURCES_local)						\
-	dwarf/Lfind_proc_info-lsb.c					\
 	x86/Lcreate_addr_space.c x86/Lget_save_loc.c x86/Lglobal.c	\
 	x86/Linit.c x86/Linit_local.c x86/Linit_remote.c		\
-	x86/Lis_signal_frame.c x86/Lget_proc_info.c x86/Lregs.c		\
-	x86/Lresume.c x86/Lstep.c x86/Lfetch_proc_info_post.c
+	x86/Lget_proc_info.c x86/Lregs.c				\
+	x86/Lresume.c x86/Lstep.c
 
 # The list of files that go into libunwind-x86:
 libunwind_x86_la_SOURCES_x86 = $(libunwind_la_SOURCES_x86_common)	\
+        $(libunwind_la_SOURCES_x86_os)					\
 	$(libunwind_la_SOURCES_generic)					\
-	$(dwarf_SOURCES_generic)					\
-	dwarf/Gfind_proc_info-lsb.c					\
 	x86/Gcreate_addr_space.c x86/Gget_save_loc.c x86/Gglobal.c	\
 	x86/Ginit.c x86/Ginit_local.c x86/Ginit_remote.c		\
-	x86/Gis_signal_frame.c x86/Gget_proc_info.c x86/Gregs.c		\
-	x86/Gresume.c x86/Gstep.c x86/Gfetch_proc_info_post.c
+	x86/Gget_proc_info.c x86/Gregs.c				\
+	x86/Gresume.c x86/Gstep.c
 
 # The list of files that go both into libunwind and libunwind-x86_64:
+noinst_HEADERS += x86_64/offsets.h					\
+	x86_64/init.h x86_64/unwind_i.h x86_64/ucontext_i.h
 libunwind_la_SOURCES_x86_64_common = $(libunwind_la_SOURCES_common)	\
-	$(dwarf_SOURCES_common)						\
-	elf64.c elf64.h							\
-	x86_64/init.h x86_64/unwind_i.h x86_64/ucontext_i.h		\
-	x86_64/is_fpreg.c x86_64/regname.c x86_64/offsets.h
+	x86_64/is_fpreg.c x86_64/regname.c
 
 # The list of files that go into libunwind:
 libunwind_la_SOURCES_x86_64 = $(libunwind_la_SOURCES_x86_64_common)	    \
+        $(libunwind_la_SOURCES_x86_64_os_local)			    	    \
 	$(libunwind_la_SOURCES_local)					    \
-	$(dwarf_SOURCES_local)						    \
-	dwarf/Lfind_proc_info-lsb.c					    \
-	x86_64/setcontext.S						\
+	x86_64/setcontext.S						    \
 	x86_64/Lcreate_addr_space.c x86_64/Lget_save_loc.c x86_64/Lglobal.c \
 	x86_64/Linit.c x86_64/Linit_local.c x86_64/Linit_remote.c	    \
-	x86_64/Lis_signal_frame.c x86_64/Lget_proc_info.c x86_64/Lregs.c    \
-	x86_64/Lresume.c x86_64/Lstep.c x86_64/Lfetch_proc_info_post.c
+	x86_64/Lget_proc_info.c x86_64/Lregs.c x86_64/Lresume.c		    \
+	x86_64/Lstash_frame.c x86_64/Lstep.c x86_64/Ltrace.c x86_64/getcontext.S
 
 # The list of files that go into libunwind-x86_64:
 libunwind_x86_64_la_SOURCES_x86_64 = $(libunwind_la_SOURCES_x86_64_common)  \
+        $(libunwind_la_SOURCES_x86_64_os)			    	    \
 	$(libunwind_la_SOURCES_generic)					    \
-	$(dwarf_SOURCES_generic)					    \
-	dwarf/Gfind_proc_info-lsb.c					    \
 	x86_64/Gcreate_addr_space.c x86_64/Gget_save_loc.c x86_64/Gglobal.c \
 	x86_64/Ginit.c x86_64/Ginit_local.c x86_64/Ginit_remote.c	    \
-	x86_64/Gis_signal_frame.c x86_64/Gget_proc_info.c x86_64/Gregs.c    \
-	x86_64/Gresume.c x86_64/Gstep.c x86_64/Gfetch_proc_info_post.c
+	x86_64/Gget_proc_info.c x86_64/Gregs.c x86_64/Gresume.c		    \
+	x86_64/Gstash_frame.c x86_64/Gstep.c x86_64/Gtrace.c
 
 # The list of local files that go to Power 64 and 32:
-libunwind_la_SOURCES_ppc = ppc/Lcreate_addr_space.c 			\
+libunwind_la_SOURCES_ppc = \
 	ppc/Lget_proc_info.c ppc/Lget_save_loc.c ppc/Linit_local.c	\
-	ppc/Linit_remote.c ppc/Lis_signal_frame.c			\
-	ppc/Lfetch_proc_info_post.c
+	ppc/Linit_remote.c ppc/Lis_signal_frame.c
 
 # The list of generic files that go to Power 64 and 32:
-libunwind_ppc_la_SOURCES_ppc_generic = ppc/Gcreate_addr_space.c		\
+libunwind_ppc_la_SOURCES_ppc_generic = \
 	ppc/Gget_proc_info.c ppc/Gget_save_loc.c ppc/Ginit_local.c	\
-	ppc/Ginit_remote.c ppc/Gis_signal_frame.c			\
-	ppc/Gfetch_proc_info_post.c
+	ppc/Ginit_remote.c ppc/Gis_signal_frame.c
 
 # The list of files that go both into libunwind and libunwind-ppc32:
+noinst_HEADERS += ppc32/init.h ppc32/unwind_i.h ppc32/ucontext_i.h
 libunwind_la_SOURCES_ppc32_common = $(libunwind_la_SOURCES_common)      \
-	$(dwarf_SOURCES_common)                                         \
-	elf32.c elf32.h                                                 \
-	ppc32/init.h ppc32/unwind_i.h ppc32/ucontext_i.h		\
 	ppc32/is_fpreg.c ppc32/regname.c ppc32/get_func_addr.c
 
 # The list of files that go into libunwind:
 libunwind_la_SOURCES_ppc32 = $(libunwind_la_SOURCES_ppc32_common)       \
 	$(libunwind_la_SOURCES_local)                                   \
-	$(dwarf_SOURCES_local)                                          \
 	$(libunwind_la_SOURCES_ppc)					\
-	dwarf/Lfind_proc_info-lsb.c                                     \
+	ppc32/Lcreate_addr_space.c					\
 	ppc32/Lglobal.c ppc32/Linit.c					\
 	ppc32/Lregs.c ppc32/Lresume.c ppc32/Lstep.c
 
 # The list of files that go into libunwind-ppc32:
 libunwind_ppc32_la_SOURCES_ppc32 = $(libunwind_la_SOURCES_ppc32_common) \
 	$(libunwind_la_SOURCES_generic)                                 \
-	$(dwarf_SOURCES_generic)                                        \
 	$(libunwind_ppc_la_SOURCES_ppc_generic)				\
-	dwarf/Gfind_proc_info-lsb.c                                     \
+	ppc32/Gcreate_addr_space.c					\
 	ppc32/Gglobal.c ppc32/Ginit.c					\
 	ppc32/Gregs.c ppc32/Gresume.c ppc32/Gstep.c
 
 # The list of files that go both into libunwind and libunwind-ppc64:
+noinst_HEADERS += ppc64/init.h ppc64/unwind_i.h ppc64/ucontext_i.h
 libunwind_la_SOURCES_ppc64_common = $(libunwind_la_SOURCES_common)      \
-        $(dwarf_SOURCES_common)                                         \
-        elf64.c elf64.h                                                 \
-        ppc64/init.h ppc64/unwind_i.h ppc64/ucontext_i.h		\
         ppc64/is_fpreg.c ppc64/regname.c ppc64/get_func_addr.c
 
 # The list of files that go into libunwind:
 libunwind_la_SOURCES_ppc64 = $(libunwind_la_SOURCES_ppc64_common)       \
         $(libunwind_la_SOURCES_local)                                   \
-        $(dwarf_SOURCES_local)                                          \
 	$(libunwind_la_SOURCES_ppc)					\
-        dwarf/Lfind_proc_info-lsb.c                                     \
+	ppc64/Lcreate_addr_space.c					\
 	ppc64/Lglobal.c ppc64/Linit.c					\
 	ppc64/Lregs.c ppc64/Lresume.c ppc64/Lstep.c
 
 # The list of files that go into libunwind-ppc64:
 libunwind_ppc64_la_SOURCES_ppc64 = $(libunwind_la_SOURCES_ppc64_common) \
         $(libunwind_la_SOURCES_generic)                                 \
-        $(dwarf_SOURCES_generic)                                        \
 	$(libunwind_ppc_la_SOURCES_ppc_generic)				\
-        dwarf/Gfind_proc_info-lsb.c                                     \
+	ppc64/Gcreate_addr_space.c					\
 	ppc64/Gglobal.c ppc64/Ginit.c					\
 	ppc64/Gregs.c ppc64/Gresume.c ppc64/Gstep.c
 
+# The list of files that go into libunwind and libunwind-sh:
+noinst_HEADERS += sh/init.h sh/offsets.h sh/unwind_i.h
+libunwind_la_SOURCES_sh_common = $(libunwind_la_SOURCES_common)		\
+	sh/is_fpreg.c sh/regname.c
+
+# The list of files that go into libunwind:
+libunwind_la_SOURCES_sh = $(libunwind_la_SOURCES_sh_common)		\
+	$(libunwind_la_SOURCES_local)					\
+	sh/Lcreate_addr_space.c sh/Lget_proc_info.c sh/Lget_save_loc.c	\
+	sh/Lglobal.c sh/Linit.c sh/Linit_local.c sh/Linit_remote.c	\
+	sh/Lis_signal_frame.c sh/Lregs.c sh/Lresume.c sh/Lstep.c
+
+libunwind_sh_la_SOURCES_sh = $(libunwind_la_SOURCES_sh_common)		\
+	$(libunwind_la_SOURCES_generic)					\
+	sh/Gcreate_addr_space.c sh/Gget_proc_info.c sh/Gget_save_loc.c	\
+	sh/Gglobal.c sh/Ginit.c sh/Ginit_local.c sh/Ginit_remote.c	\
+	sh/Gis_signal_frame.c sh/Gregs.c sh/Gresume.c sh/Gstep.c
+
 if REMOTE_ONLY
 install-exec-hook:
 #	Nothing to do here....
 else
 #
 # This is not ideal, but I know of no other way to install an
-# alias for a library.
+# alias for a library.  For the shared version, we have to do
+# a file check before creating the link, because it isn't going
+# to be there if the user configured with --disable-shared.
 #
 install-exec-hook:
-	$(LN_S) -f libunwind-$(arch).a  $(DESTDIR)$(libdir)/libunwind-generic.a
-	$(LN_S) -f libunwind-$(arch).so \
-		$(DESTDIR)$(libdir)/libunwind-generic.so
+	cd $(DESTDIR)$(libdir) && $(LN_S) -f libunwind-$(arch).a libunwind-generic.a
+	if test -f $(DESTDIR)$(libdir)/libunwind-$(arch).so; then \
+		cd $(DESTDIR)$(libdir) && $(LN_S) -f libunwind-$(arch).so \
+		libunwind-generic.so; \
+	fi
 endif
 
 if OS_LINUX
- libunwind_la_SOURCES_os	= $(libunwind_la_SOURCES_os_linux)
- libunwind_la_SOURCES_os_local	= $(libunwind_la_SOURCES_os_linux_local)
+ libunwind_la_SOURCES_os	      = $(libunwind_la_SOURCES_os_linux)
+ libunwind_la_SOURCES_os_local	      = $(libunwind_la_SOURCES_os_linux_local)
+ libunwind_la_SOURCES_x86_os          = x86/Gos-linux.c
+ libunwind_x86_la_SOURCES_os	      = x86/getcontext-linux.S
+ libunwind_la_SOURCES_x86_os_local    = x86/Los-linux.c
+ libunwind_la_SOURCES_x86_64_os       = x86_64/Gos-linux.c
+ libunwind_la_SOURCES_x86_64_os_local = x86_64/Los-linux.c
+ libunwind_coredump_la_SOURCES += coredump/_UCD_access_reg_linux.c
 endif
 
 if OS_HPUX
@@ -361,110 +471,181 @@ if OS_HPUX
  libunwind_la_SOURCES_os_local	= $(libunwind_la_SOURCES_os_hpux_local)
 endif
 
+if OS_FREEBSD
+ libunwind_la_SOURCES_os	= $(libunwind_la_SOURCES_os_freebsd)
+ libunwind_la_SOURCES_os_local	= $(libunwind_la_SOURCES_os_freebsd_local)
+ libunwind_la_SOURCES_x86_os          = x86/Gos-freebsd.c
+ libunwind_x86_la_SOURCES_os	      = x86/getcontext-freebsd.S
+ libunwind_la_SOURCES_x86_os_local    = x86/Los-freebsd.c
+ libunwind_la_SOURCES_x86_64_os       = x86_64/Gos-freebsd.c
+ libunwind_la_SOURCES_x86_64_os_local = x86_64/Los-freebsd.c
+ libunwind_coredump_la_SOURCES += coredump/_UCD_access_reg_freebsd.c
+endif
+
+if OS_QNX
+ libunwind_la_SOURCES_os	= $(libunwind_la_SOURCES_os_qnx)
+ libunwind_la_SOURCES_os_local	= $(libunwind_la_SOURCES_os_qnx_local)
+endif
+
+if ARCH_AARCH64
+ lib_LTLIBRARIES += libunwind-aarch64.la
+ libunwind_la_SOURCES = $(libunwind_la_SOURCES_aarch64)
+ libunwind_aarch64_la_SOURCES = $(libunwind_aarch64_la_SOURCES_aarch64)
+ libunwind_aarch64_la_LDFLAGS = $(COMMON_SO_LDFLAGS) -version-info $(SOVERSION)
+ libunwind_aarch64_la_LIBADD = libunwind-dwarf-generic.la
+ libunwind_aarch64_la_LIBADD += libunwind-elf64.la
+if !REMOTE_ONLY
+ libunwind_aarch64_la_LIBADD += libunwind.la -lc
+endif
+ libunwind_setjmp_la_SOURCES += aarch64/siglongjmp.S
+else
 if ARCH_ARM
- lib_LTLIBRARIES_arch = libunwind-arm.la
+ lib_LTLIBRARIES += libunwind-arm.la
  libunwind_la_SOURCES = $(libunwind_la_SOURCES_arm)
  libunwind_arm_la_SOURCES = $(libunwind_arm_la_SOURCES_arm)
  libunwind_arm_la_LDFLAGS = $(COMMON_SO_LDFLAGS) -version-info $(SOVERSION)
+ libunwind_arm_la_LIBADD = libunwind-dwarf-generic.la
+ libunwind_arm_la_LIBADD += libunwind-elf32.la
 if !REMOTE_ONLY
- libunwind_arm_la_LIBADD = libunwind.la -lc
+ libunwind_arm_la_LIBADD += libunwind.la -lc
 endif
- libunwind_setjmp_la_SOURCES	= $(libunwind_setjmp_la_SOURCES_common) \
-				  $(libunwind_setjmp_la_SOURCES_arm)
+ libunwind_setjmp_la_SOURCES += arm/siglongjmp.S
 else
 if ARCH_IA64
- ia64_mk_Gcursor_i_SOURCES = ia64/mk_Gcursor_i.c
- ia64_mk_Lcursor_i_SOURCES = ia64/mk_Lcursor_i.c
- noinst_PROGRAMS = ia64/mk_Gcursor_i ia64/mk_Lcursor_i
  BUILT_SOURCES = Gcursor_i.h Lcursor_i.h
-Gcursor_i.h: ia64/mk_Gcursor_i
-	ia64/mk_Gcursor_i > $@
-Lcursor_i.h: ia64/mk_Lcursor_i
-	ia64/mk_Lcursor_i > $@
- lib_LTLIBRARIES_arch = libunwind-ia64.la
+mk_Gcursor_i.s: $(srcdir)/ia64/mk_Gcursor_i.c
+	$(COMPILE) -S "$(srcdir)/ia64/mk_Gcursor_i.c" -o mk_Gcursor_i.s
+mk_Lcursor_i.s: $(srcdir)/ia64/mk_Lcursor_i.c
+	$(COMPILE) -S "$(srcdir)/ia64/mk_Lcursor_i.c" -o mk_Lcursor_i.s
+Gcursor_i.h: mk_Gcursor_i.s
+	"$(srcdir)/ia64/mk_cursor_i" mk_Gcursor_i.s > Gcursor_i.h
+Lcursor_i.h: mk_Lcursor_i.s
+	"$(srcdir)/ia64/mk_cursor_i" mk_Lcursor_i.s > Lcursor_i.h
+
+ lib_LTLIBRARIES += libunwind-ia64.la
  libunwind_la_SOURCES = $(libunwind_la_SOURCES_ia64)
  libunwind_ia64_la_SOURCES = $(libunwind_ia64_la_SOURCES_ia64)
  libunwind_ia64_la_LDFLAGS = $(COMMON_SO_LDFLAGS) -version-info $(SOVERSION)
+ libunwind_ia64_la_LIBADD = libunwind-elf64.la
 if !REMOTE_ONLY
- libunwind_ia64_la_LIBADD = libunwind.la -lc
+ libunwind_ia64_la_LIBADD += libunwind.la -lc
 endif
- libunwind_setjmp_la_SOURCES	= $(libunwind_setjmp_la_SOURCES_common) \
-				  $(libunwind_setjmp_la_SOURCES_ia64)
+ libunwind_setjmp_la_SOURCES += ia64/setjmp.S  ia64/sigsetjmp.S  \
+				ia64/longjmp.S ia64/siglongjmp.S
 else
 if ARCH_HPPA
- lib_LTLIBRARIES_arch = libunwind-hppa.la
+ lib_LTLIBRARIES += libunwind-hppa.la
  libunwind_la_SOURCES = $(libunwind_la_SOURCES_hppa)
  libunwind_hppa_la_SOURCES = $(libunwind_hppa_la_SOURCES_hppa)
  libunwind_hppa_la_LDFLAGS = $(COMMON_SO_LDFLAGS) -version-info $(SOVERSION)
+ libunwind_hppa_la_LIBADD = libunwind-dwarf-generic.la
+ libunwind_hppa_la_LIBADD += libunwind-elf32.la
 if !REMOTE_ONLY
- libunwind_hppa_la_LIBADD = libunwind.la -lc
+ libunwind_hppa_la_LIBADD += libunwind.la -lc
 endif
- libunwind_setjmp_la_SOURCES	= $(libunwind_setjmp_la_SOURCES_common) \
-				  $(libunwind_setjmp_la_SOURCES_hppa)
+ libunwind_setjmp_la_SOURCES += hppa/siglongjmp.S
 else
 if ARCH_MIPS
- lib_LTLIBRARIES_arch = libunwind-mips.la
+ lib_LTLIBRARIES += libunwind-mips.la
  libunwind_la_SOURCES = $(libunwind_la_SOURCES_mips)
  libunwind_mips_la_SOURCES = $(libunwind_mips_la_SOURCES_mips)
  libunwind_mips_la_LDFLAGS = $(COMMON_SO_LDFLAGS) -version-info $(SOVERSION)
+ libunwind_mips_la_LIBADD = libunwind-dwarf-generic.la
+ libunwind_mips_la_LIBADD += libunwind-elfxx.la
 if !REMOTE_ONLY
- libunwind_mips_la_LIBADD = libunwind.la -lc
+ libunwind_mips_la_LIBADD += libunwind.la -lc
 endif
- libunwind_setjmp_la_SOURCES	= $(libunwind_setjmp_la_SOURCES_common) \
-				  $(libunwind_setjmp_la_SOURCES_mips)
+ libunwind_setjmp_la_SOURCES += mips/siglongjmp.S
+else
+if ARCH_TILEGX
+ lib_LTLIBRARIES += libunwind-tilegx.la
+ libunwind_la_SOURCES = $(libunwind_la_SOURCES_tilegx)
+ libunwind_tilegx_la_SOURCES = $(libunwind_tilegx_la_SOURCES_tilegx)
+ libunwind_tilegx_la_LDFLAGS = $(COMMON_SO_LDFLAGS) -version-info $(SOVERSION)
+ libunwind_tilegx_la_LIBADD = libunwind-dwarf-generic.la
+ libunwind_tilegx_la_LIBADD += libunwind-elfxx.la
+if !REMOTE_ONLY
+ libunwind_tilegx_la_LIBADD += libunwind.la -lc
+endif
+ libunwind_setjmp_la_SOURCES += tilegx/siglongjmp.S
 else
 if ARCH_X86
- lib_LTLIBRARIES_arch = libunwind-x86.la
- libunwind_la_SOURCES = $(libunwind_la_SOURCES_x86)
+ lib_LTLIBRARIES += libunwind-x86.la
+ libunwind_la_SOURCES = $(libunwind_la_SOURCES_x86) $(libunwind_x86_la_SOURCES_os)
  libunwind_x86_la_SOURCES = $(libunwind_x86_la_SOURCES_x86)
  libunwind_x86_la_LDFLAGS = $(COMMON_SO_LDFLAGS) -version-info $(SOVERSION)
+ libunwind_x86_la_LIBADD = libunwind-dwarf-generic.la
+ libunwind_x86_la_LIBADD += libunwind-elf32.la
 if !REMOTE_ONLY
- libunwind_x86_la_LIBADD = libunwind.la -lc
+ libunwind_x86_la_LIBADD += libunwind.la -lc
 endif
- libunwind_setjmp_la_SOURCES	= $(libunwind_setjmp_la_SOURCES_common) \
-				  $(libunwind_setjmp_la_SOURCES_x86)
+ libunwind_setjmp_la_SOURCES += x86/longjmp.S x86/siglongjmp.S
 else
 if ARCH_X86_64
- lib_LTLIBRARIES_arch = libunwind-x86_64.la
+ lib_LTLIBRARIES += libunwind-x86_64.la
  libunwind_la_SOURCES = $(libunwind_la_SOURCES_x86_64)
  libunwind_x86_64_la_SOURCES = $(libunwind_x86_64_la_SOURCES_x86_64)
  libunwind_x86_64_la_LDFLAGS = $(COMMON_SO_LDFLAGS) -version-info $(SOVERSION)
+ libunwind_x86_64_la_LIBADD = libunwind-dwarf-generic.la
+ libunwind_x86_64_la_LIBADD += libunwind-elf64.la
 if !REMOTE_ONLY
- libunwind_x86_64_la_LIBADD = libunwind.la -lc
+ libunwind_x86_64_la_LIBADD += libunwind.la -lc
 endif
- libunwind_setjmp_la_SOURCES	= $(libunwind_setjmp_la_SOURCES_common) \
-				  $(libunwind_setjmp_la_SOURCES_x86_64)
+ libunwind_setjmp_la_SOURCES += x86_64/longjmp.S x86_64/siglongjmp.S
 else
 if ARCH_PPC32
- lib_LTLIBRARIES_arch = libunwind-ppc32.la
+ lib_LTLIBRARIES += libunwind-ppc32.la
  libunwind_la_SOURCES = $(libunwind_la_SOURCES_ppc32)
  libunwind_ppc32_la_SOURCES = $(libunwind_ppc32_la_SOURCES_ppc32)
  libunwind_ppc32_la_LDFLAGS = $(COMMON_SO_LDFLAGS) -version-info $(SOVERSION)
+ libunwind_ppc32_la_LIBADD = libunwind-dwarf-generic.la
+ libunwind_ppc32_la_LIBADD += libunwind-elf32.la
 if !REMOTE_ONLY
- libunwind_ppc32_la_LIBADD = libunwind.la -lc
+ libunwind_ppc32_la_LIBADD += libunwind.la -lc
 endif
- libunwind_setjmp_la_SOURCES    = $(libunwind_setjmp_la_SOURCES_common) \
-                                  $(libunwind_setjmp_la_SOURCES_ppc32)
+ libunwind_setjmp_la_SOURCES += ppc/longjmp.S ppc/siglongjmp.S
 else
 if ARCH_PPC64
- lib_LTLIBRARIES_arch = libunwind-ppc64.la
+ lib_LTLIBRARIES += libunwind-ppc64.la
  libunwind_la_SOURCES = $(libunwind_la_SOURCES_ppc64)
  libunwind_ppc64_la_SOURCES = $(libunwind_ppc64_la_SOURCES_ppc64)
  libunwind_ppc64_la_LDFLAGS = $(COMMON_SO_LDFLAGS) -version-info $(SOVERSION)
+ libunwind_ppc64_la_LIBADD = libunwind-dwarf-generic.la
+ libunwind_ppc64_la_LIBADD += libunwind-elf64.la
 if !REMOTE_ONLY
- libunwind_ppc64_la_LIBADD = libunwind.la -lc
+ libunwind_ppc64_la_LIBADD += libunwind.la -lc
 endif
- libunwind_setjmp_la_SOURCES    = $(libunwind_setjmp_la_SOURCES_common) \
-                                  $(libunwind_setjmp_la_SOURCES_ppc64)
+ libunwind_setjmp_la_SOURCES += ppc/longjmp.S ppc/siglongjmp.S
+else
+if ARCH_SH
+ lib_LTLIBRARIES += libunwind-sh.la
+ libunwind_la_SOURCES = $(libunwind_la_SOURCES_sh)
+ libunwind_sh_la_SOURCES = $(libunwind_sh_la_SOURCES_sh)
+ libunwind_sh_la_LDFLAGS = $(COMMON_SO_LDFLAGS) -version-info $(SOVERSION)
+ libunwind_sh_la_LIBADD = libunwind-dwarf-generic.la
+ libunwind_sh_la_LIBADD += libunwind-elf32.la
+if !REMOTE_ONLY
+ libunwind_sh_la_LIBADD += libunwind.la -lc
+endif
+ libunwind_setjmp_la_SOURCES += sh/siglongjmp.S
 
+endif # ARCH_SH
 endif # ARCH_PPC64
 endif # ARCH_PPC32
 endif # ARCH_X86_64
 endif # ARCH_X86
+endif # ARCH_TILEGX
 endif # ARCH_MIPS
 endif # ARCH_HPPA
 endif # ARCH_IA64
 endif # ARCH_ARM
+endif # ARCH_AARCH64
+
+# libunwind-setjmp depends on libunwind-$(arch). Therefore must be added
+# at the end.
+if BUILD_SETJMP
+lib_LTLIBRARIES += libunwind-setjmp.la
+endif
 
 #
 # Don't link with standard libraries, because those may mention
@@ -472,43 +653,37 @@ endif # ARCH_ARM
 #
 libunwind_la_LDFLAGS =	$(COMMON_SO_LDFLAGS) -XCClinker -nostdlib \
 			$(LDFLAGS_STATIC_LIBCXA) -version-info $(SOVERSION)
-libunwind_la_LIBADD  = -lc $(LIBCRTS)
-
-lib_LIBRARIES = $(LIBRARIES_cdep)
-lib_LTLIBRARIES = $(lib_LTLIBRARIES_cdep) $(lib_LTLIBRARIES_arch) \
-		  $(lib_LTLIBRARIES_cdep_setjmp)
+libunwind_la_LIBADD  += -lc $(LIBCRTS)
+libunwind_la_LIBADD += $(LIBLZMA)
 
 AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/include/tdep-$(arch) -I.
 AM_CCASFLAGS = $(AM_CPPFLAGS)
+noinst_HEADERS += unwind/unwind-internal.h
 
-EXTRA_DIST =	elfxx.h elfxx.c unwind/unwind-internal.h	\
+EXTRA_DIST =	$(libunwind_la_SOURCES_aarch64)			\
 		$(libunwind_la_SOURCES_arm)			\
 		$(libunwind_la_SOURCES_hppa)			\
 		$(libunwind_la_SOURCES_ia64)			\
 		$(libunwind_la_SOURCES_mips)			\
+		$(libunwind_la_SOURCES_sh)			\
 		$(libunwind_la_SOURCES_x86)			\
+		$(libunwind_la_SOURCES_os_freebsd)		\
 		$(libunwind_la_SOURCES_os_linux)		\
 		$(libunwind_la_SOURCES_os_hpux)			\
+		$(libunwind_la_SOURCES_os_qnx)			\
 		$(libunwind_la_SOURCES_common)			\
 		$(libunwind_la_SOURCES_local)			\
 		$(libunwind_la_SOURCES_generic)			\
+		$(libunwind_aarch64_la_SOURCES_aarch64)		\
 		$(libunwind_arm_la_SOURCES_arm)			\
 		$(libunwind_hppa_la_SOURCES_hppa)		\
 		$(libunwind_ia64_la_SOURCES_ia64)		\
 		$(libunwind_mips_la_SOURCES_mips)		\
+		$(libunwind_sh_la_SOURCES_sh)			\
 		$(libunwind_x86_la_SOURCES_x86)			\
-		$(libunwind_x86_64_la_SOURCES_x86_64)		\
-		$(libunwind_ptrace_a_SOURCES)			\
-		$(libunwind_setjmp_la_SOURCES_common)		\
-		$(libunwind_setjmp_la_SOURCES_arm)		\
-		$(libunwind_setjmp_la_SOURCES_hppa)		\
-		$(libunwind_setjmp_la_SOURCES_ia64)		\
-		$(libunwind_setjmp_la_SOURCES_mips)		\
-		$(libunwind_setjmp_la_SOURCES_x86)		\
-		$(libunwind_setjmp_la_SOURCES_x86_64)		\
-		$(libunwind_setjmp_la_SOURCES_ppc32)		\
-		$(libunwind_setjmp_la_SOURCES_ppc64)
+		$(libunwind_x86_64_la_SOURCES_x86_64)
 
+MAINTAINERCLEANFILES = Makefile.in
 
 # The -version-info flag accepts an argument of the form
 # `current[:revision[:age]]'. So, passing `-version-info 3:12:1' sets
diff --git a/frysk-imports/libunwind/src/aarch64/Gcreate_addr_space.c b/frysk-imports/libunwind/src/aarch64/Gcreate_addr_space.c
new file mode 100644
index 0000000..b0f2b04
--- /dev/null
+++ b/frysk-imports/libunwind/src/aarch64/Gcreate_addr_space.c
@@ -0,0 +1,60 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com>
+   Copyright (C) 2013 Linaro Limited
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include <string.h>
+#include <stdlib.h>
+
+#include "unwind_i.h"
+
+PROTECTED unw_addr_space_t
+unw_create_addr_space (unw_accessors_t *a, int byte_order)
+{
+#ifdef UNW_LOCAL_ONLY
+  return NULL;
+#else
+  unw_addr_space_t as;
+
+  /* AArch64 supports little-endian and big-endian. */
+  if (byte_order != 0 && byte_order != __LITTLE_ENDIAN
+      && byte_order != __BIG_ENDIAN)
+    return NULL;
+
+  as = malloc (sizeof (*as));
+  if (!as)
+    return NULL;
+
+  memset (as, 0, sizeof (*as));
+
+  as->acc = *a;
+
+  /* Default to little-endian for AArch64. */
+  if (byte_order == 0 || byte_order == __LITTLE_ENDIAN)
+    as->big_endian = 0;
+  else
+    as->big_endian = 1;
+
+  return as;
+#endif
+}
diff --git a/frysk-imports/libunwind/src/aarch64/Gget_proc_info.c b/frysk-imports/libunwind/src/aarch64/Gget_proc_info.c
new file mode 100644
index 0000000..de9199f
--- /dev/null
+++ b/frysk-imports/libunwind/src/aarch64/Gget_proc_info.c
@@ -0,0 +1,39 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "unwind_i.h"
+
+PROTECTED int
+unw_get_proc_info (unw_cursor_t *cursor, unw_proc_info_t *pi)
+{
+  struct cursor *c = (struct cursor *) cursor;
+  int ret;
+
+  ret = dwarf_make_proc_info (&c->dwarf);
+  if (ret < 0)
+    return ret;
+
+  *pi = c->dwarf.pi;
+  return 0;
+}
diff --git a/frysk-imports/libunwind/src/aarch64/Gget_save_loc.c b/frysk-imports/libunwind/src/aarch64/Gget_save_loc.c
new file mode 100644
index 0000000..5ccf5cf
--- /dev/null
+++ b/frysk-imports/libunwind/src/aarch64/Gget_save_loc.c
@@ -0,0 +1,100 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+   Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com>
+   Copyright (C) 2013 Linaro Limited
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "unwind_i.h"
+
+PROTECTED int
+unw_get_save_loc (unw_cursor_t *cursor, int reg, unw_save_loc_t *sloc)
+{
+  struct cursor *c = (struct cursor *) cursor;
+  dwarf_loc_t loc;
+
+  switch (reg)
+    {
+    case UNW_AARCH64_X0:
+    case UNW_AARCH64_X1:
+    case UNW_AARCH64_X2:
+    case UNW_AARCH64_X3:
+    case UNW_AARCH64_X4:
+    case UNW_AARCH64_X5:
+    case UNW_AARCH64_X6:
+    case UNW_AARCH64_X7:
+    case UNW_AARCH64_X8:
+    case UNW_AARCH64_X9:
+    case UNW_AARCH64_X10:
+    case UNW_AARCH64_X11:
+    case UNW_AARCH64_X12:
+    case UNW_AARCH64_X13:
+    case UNW_AARCH64_X14:
+    case UNW_AARCH64_X15:
+    case UNW_AARCH64_X16:
+    case UNW_AARCH64_X17:
+    case UNW_AARCH64_X18:
+    case UNW_AARCH64_X19:
+    case UNW_AARCH64_X20:
+    case UNW_AARCH64_X21:
+    case UNW_AARCH64_X22:
+    case UNW_AARCH64_X23:
+    case UNW_AARCH64_X24:
+    case UNW_AARCH64_X25:
+    case UNW_AARCH64_X26:
+    case UNW_AARCH64_X27:
+    case UNW_AARCH64_X28:
+    case UNW_AARCH64_X29:
+    case UNW_AARCH64_X30:
+    case UNW_AARCH64_SP:
+    case UNW_AARCH64_PC:
+    case UNW_AARCH64_PSTATE:
+      loc = c->dwarf.loc[reg];
+      break;
+
+    default:
+      loc = DWARF_NULL_LOC;     /* default to "not saved" */
+      break;
+    }
+
+  memset (sloc, 0, sizeof (*sloc));
+
+  if (DWARF_IS_NULL_LOC (loc))
+    {
+      sloc->type = UNW_SLT_NONE;
+      return 0;
+    }
+
+#if !defined(UNW_LOCAL_ONLY)
+  if (DWARF_IS_REG_LOC (loc))
+    {
+      sloc->type = UNW_SLT_REG;
+      sloc->u.regnum = DWARF_GET_LOC (loc);
+    }
+  else
+#endif
+    {
+      sloc->type = UNW_SLT_MEMORY;
+      sloc->u.addr = DWARF_GET_LOC (loc);
+    }
+  return 0;
+}
diff --git a/frysk-imports/libunwind/src/aarch64/Gglobal.c b/frysk-imports/libunwind/src/aarch64/Gglobal.c
new file mode 100644
index 0000000..72e36b2
--- /dev/null
+++ b/frysk-imports/libunwind/src/aarch64/Gglobal.c
@@ -0,0 +1,57 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+   Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com>
+   Copyright (C) 2013 Linaro Limited
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "unwind_i.h"
+#include "dwarf_i.h"
+
+HIDDEN define_lock (aarch64_lock);
+HIDDEN int tdep_init_done;
+
+HIDDEN void
+tdep_init (void)
+{
+  intrmask_t saved_mask;
+
+  sigfillset (&unwi_full_mask);
+
+  lock_acquire (&aarch64_lock, saved_mask);
+  {
+    if (tdep_init_done)
+      /* another thread else beat us to it... */
+      goto out;
+
+    mi_init ();
+
+    dwarf_init ();
+
+#ifndef UNW_REMOTE_ONLY
+    aarch64_local_addr_space_init ();
+#endif
+    tdep_init_done = 1; /* signal that we're initialized... */
+  }
+ out:
+  lock_release (&aarch64_lock, saved_mask);
+}
diff --git a/frysk-imports/libunwind/src/aarch64/Ginit.c b/frysk-imports/libunwind/src/aarch64/Ginit.c
new file mode 100644
index 0000000..b9181ef
--- /dev/null
+++ b/frysk-imports/libunwind/src/aarch64/Ginit.c
@@ -0,0 +1,188 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+   Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com>
+   Copyright (C) 2013 Linaro Limited
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "unwind_i.h"
+
+#ifdef UNW_REMOTE_ONLY
+
+/* unw_local_addr_space is a NULL pointer in this case.  */
+PROTECTED unw_addr_space_t unw_local_addr_space;
+
+#else /* !UNW_REMOTE_ONLY */
+
+static struct unw_addr_space local_addr_space;
+
+PROTECTED unw_addr_space_t unw_local_addr_space = &local_addr_space;
+
+static inline void *
+uc_addr (ucontext_t *uc, int reg)
+{
+  if (reg >= UNW_AARCH64_X0 && reg <= UNW_AARCH64_V31)
+    return &uc->uc_mcontext.regs[reg];
+  else
+    return NULL;
+}
+
+# ifdef UNW_LOCAL_ONLY
+
+HIDDEN void *
+tdep_uc_addr (ucontext_t *uc, int reg)
+{
+  return uc_addr (uc, reg);
+}
+
+# endif /* UNW_LOCAL_ONLY */
+
+HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
+
+/* XXX fix me: there is currently no way to locate the dyn-info list
+       by a remote unwinder.  On ia64, this is done via a special
+       unwind-table entry.  Perhaps something similar can be done with
+       DWARF2 unwind info.  */
+
+static void
+put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
+{
+  /* it's a no-op */
+}
+
+static int
+get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
+                        void *arg)
+{
+  *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
+  return 0;
+}
+
+static int
+access_mem (unw_addr_space_t as, unw_word_t addr, unw_word_t *val, int write,
+            void *arg)
+{
+  if (write)
+    {
+      Debug (16, "mem[%lx] <- %lx\n", addr, *val);
+      *(unw_word_t *) addr = *val;
+    }
+  else
+    {
+      *val = *(unw_word_t *) addr;
+      Debug (16, "mem[%lx] -> %lx\n", addr, *val);
+    }
+  return 0;
+}
+
+static int
+access_reg (unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val, int write,
+            void *arg)
+{
+  unw_word_t *addr;
+  ucontext_t *uc = arg;
+
+  if (unw_is_fpreg (reg))
+    goto badreg;
+
+  if (!(addr = uc_addr (uc, reg)))
+    goto badreg;
+
+  if (write)
+    {
+      *(unw_word_t *) addr = *val;
+      Debug (12, "%s <- %lx\n", unw_regname (reg), *val);
+    }
+  else
+    {
+      *val = *(unw_word_t *) addr;
+      Debug (12, "%s -> %lx\n", unw_regname (reg), *val);
+    }
+  return 0;
+
+ badreg:
+  Debug (1, "bad register number %u\n", reg);
+  return -UNW_EBADREG;
+}
+
+static int
+access_fpreg (unw_addr_space_t as, unw_regnum_t reg, unw_fpreg_t *val,
+              int write, void *arg)
+{
+  ucontext_t *uc = arg;
+  unw_fpreg_t *addr;
+
+  if (!unw_is_fpreg (reg))
+    goto badreg;
+
+  if (!(addr = uc_addr (uc, reg)))
+    goto badreg;
+
+  if (write)
+    {
+      Debug (12, "%s <- %08lx.%08lx.%08lx\n", unw_regname (reg),
+             ((long *)val)[0], ((long *)val)[1], ((long *)val)[2]);
+      *(unw_fpreg_t *) addr = *val;
+    }
+  else
+    {
+      *val = *(unw_fpreg_t *) addr;
+      Debug (12, "%s -> %08lx.%08lx.%08lx\n", unw_regname (reg),
+             ((long *)val)[0], ((long *)val)[1], ((long *)val)[2]);
+    }
+  return 0;
+
+ badreg:
+  Debug (1, "bad register number %u\n", reg);
+  /* attempt to access a non-preserved register */
+  return -UNW_EBADREG;
+}
+
+static int
+get_static_proc_name (unw_addr_space_t as, unw_word_t ip,
+                      char *buf, size_t buf_len, unw_word_t *offp,
+                      void *arg)
+{
+  return _Uelf64_get_proc_name (as, getpid (), ip, buf, buf_len, offp);
+}
+
+HIDDEN void
+aarch64_local_addr_space_init (void)
+{
+  memset (&local_addr_space, 0, sizeof (local_addr_space));
+  local_addr_space.caching_policy = UNW_CACHE_GLOBAL;
+  local_addr_space.acc.find_proc_info = dwarf_find_proc_info;
+  local_addr_space.acc.put_unwind_info = put_unwind_info;
+  local_addr_space.acc.get_dyn_info_list_addr = get_dyn_info_list_addr;
+  local_addr_space.acc.access_mem = access_mem;
+  local_addr_space.acc.access_reg = access_reg;
+  local_addr_space.acc.access_fpreg = access_fpreg;
+  local_addr_space.acc.resume = aarch64_local_resume;
+  local_addr_space.acc.get_proc_name = get_static_proc_name;
+  local_addr_space.big_endian = (__BYTE_ORDER == __BIG_ENDIAN);
+  unw_flush_cache (&local_addr_space, 0, 0);
+}
+
+#endif /* !UNW_REMOTE_ONLY */
diff --git a/frysk-imports/libunwind/src/aarch64/Ginit_local.c b/frysk-imports/libunwind/src/aarch64/Ginit_local.c
new file mode 100644
index 0000000..dee6fd3
--- /dev/null
+++ b/frysk-imports/libunwind/src/aarch64/Ginit_local.c
@@ -0,0 +1,55 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+   Copyright (C) 2011-2013 Linaro Limited
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "unwind_i.h"
+#include "init.h"
+
+#ifdef UNW_REMOTE_ONLY
+
+PROTECTED int
+unw_init_local (unw_cursor_t *cursor, unw_context_t *uc)
+{
+  return -UNW_EINVAL;
+}
+
+#else /* !UNW_REMOTE_ONLY */
+
+PROTECTED int
+unw_init_local (unw_cursor_t *cursor, unw_context_t *uc)
+{
+  struct cursor *c = (struct cursor *) cursor;
+
+  if (!tdep_init_done)
+    tdep_init ();
+
+  Debug (1, "(cursor=%p)\n", c);
+
+  c->dwarf.as = unw_local_addr_space;
+  c->dwarf.as_arg = uc;
+
+  return common_init (c, 1);
+}
+
+#endif /* !UNW_REMOTE_ONLY */
diff --git a/frysk-imports/libunwind/src/aarch64/Ginit_remote.c b/frysk-imports/libunwind/src/aarch64/Ginit_remote.c
new file mode 100644
index 0000000..f284e99
--- /dev/null
+++ b/frysk-imports/libunwind/src/aarch64/Ginit_remote.c
@@ -0,0 +1,45 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "init.h"
+#include "unwind_i.h"
+
+PROTECTED int
+unw_init_remote (unw_cursor_t *cursor, unw_addr_space_t as, void *as_arg)
+{
+#ifdef UNW_LOCAL_ONLY
+  return -UNW_EINVAL;
+#else /* !UNW_LOCAL_ONLY */
+  struct cursor *c = (struct cursor *) cursor;
+
+  if (!tdep_init_done)
+    tdep_init ();
+
+  Debug (1, "(cursor=%p)\n", c);
+
+  c->dwarf.as = as;
+  c->dwarf.as_arg = as_arg;
+  return common_init (c, 0);
+#endif /* !UNW_LOCAL_ONLY */
+}
diff --git a/frysk-imports/libunwind/src/aarch64/Gis_signal_frame.c b/frysk-imports/libunwind/src/aarch64/Gis_signal_frame.c
new file mode 100644
index 0000000..53e32de
--- /dev/null
+++ b/frysk-imports/libunwind/src/aarch64/Gis_signal_frame.c
@@ -0,0 +1,64 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com>
+   Copyright (C) 2013 Linaro Limited
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "unwind_i.h"
+
+/* The restorer stub will always have the form:
+
+   d2801168        movz    x8, #0x8b
+   d4000001        svc     #0x0
+*/
+
+PROTECTED int
+unw_is_signal_frame (unw_cursor_t *cursor)
+{
+#ifdef __linux__
+  struct cursor *c = (struct cursor *) cursor;
+  unw_word_t w0, ip;
+  unw_addr_space_t as;
+  unw_accessors_t *a;
+  void *arg;
+  int ret;
+
+  as = c->dwarf.as;
+  a = unw_get_accessors (as);
+  arg = c->dwarf.as_arg;
+
+  ip = c->dwarf.ip;
+
+  ret = (*a->access_mem) (as, ip, &w0, 0, arg);
+  if (ret < 0)
+    return ret;
+
+  /* FIXME: distinguish 32bit insn vs 64bit registers.  */
+  if (w0 != 0xd4000001d2801168)
+    return 0;
+
+  return 1;
+
+#else
+  return -UNW_ENOINFO;
+#endif
+}
diff --git a/frysk-imports/libunwind/src/aarch64/Gregs.c b/frysk-imports/libunwind/src/aarch64/Gregs.c
new file mode 100644
index 0000000..6288275
--- /dev/null
+++ b/frysk-imports/libunwind/src/aarch64/Gregs.c
@@ -0,0 +1,113 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+   Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com>
+   Copyright (C) 2013 Linaro Limited
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "unwind_i.h"
+
+HIDDEN int
+tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
+                 int write)
+{
+  dwarf_loc_t loc = DWARF_NULL_LOC;
+  unsigned int mask;
+
+  switch (reg)
+    {
+    case UNW_AARCH64_X0:
+    case UNW_AARCH64_X1:
+    case UNW_AARCH64_X2:
+    case UNW_AARCH64_X3:
+      mask = 1 << reg;
+      if (write)
+        {
+          c->dwarf.eh_args[reg] = *valp;
+          c->dwarf.eh_valid_mask |= mask;
+          return 0;
+        }
+      else if ((c->dwarf.eh_valid_mask & mask) != 0)
+        {
+          *valp = c->dwarf.eh_args[reg];
+          return 0;
+        }
+      else
+        loc = c->dwarf.loc[reg];
+      break;
+
+    case UNW_AARCH64_X4:
+    case UNW_AARCH64_X5:
+    case UNW_AARCH64_X6:
+    case UNW_AARCH64_X7:
+    case UNW_AARCH64_X8:
+    case UNW_AARCH64_X9:
+    case UNW_AARCH64_X10:
+    case UNW_AARCH64_X11:
+    case UNW_AARCH64_X12:
+    case UNW_AARCH64_X13:
+    case UNW_AARCH64_X14:
+    case UNW_AARCH64_X15:
+    case UNW_AARCH64_X16:
+    case UNW_AARCH64_X17:
+    case UNW_AARCH64_X18:
+    case UNW_AARCH64_X19:
+    case UNW_AARCH64_X20:
+    case UNW_AARCH64_X21:
+    case UNW_AARCH64_X22:
+    case UNW_AARCH64_X23:
+    case UNW_AARCH64_X24:
+    case UNW_AARCH64_X25:
+    case UNW_AARCH64_X26:
+    case UNW_AARCH64_X27:
+    case UNW_AARCH64_X28:
+    case UNW_AARCH64_X29:
+    case UNW_AARCH64_X30:
+    case UNW_AARCH64_PC:
+    case UNW_AARCH64_PSTATE:
+      loc = c->dwarf.loc[reg];
+      break;
+
+    case UNW_AARCH64_SP:
+      if (write)
+        return -UNW_EREADONLYREG;
+      *valp = c->dwarf.cfa;
+      return 0;
+
+    default:
+      Debug (1, "bad register number %u\n", reg);
+      return -UNW_EBADREG;
+    }
+
+  if (write)
+    return dwarf_put (&c->dwarf, loc, *valp);
+  else
+    return dwarf_get (&c->dwarf, loc, valp);
+}
+
+HIDDEN int
+tdep_access_fpreg (struct cursor *c, unw_regnum_t reg, unw_fpreg_t *valp,
+                   int write)
+{
+  Debug (1, "bad register number %u\n", reg);
+  return -UNW_EBADREG;
+}
diff --git a/frysk-imports/libunwind/src/aarch64/Gresume.c b/frysk-imports/libunwind/src/aarch64/Gresume.c
new file mode 100644
index 0000000..d9acfa7
--- /dev/null
+++ b/frysk-imports/libunwind/src/aarch64/Gresume.c
@@ -0,0 +1,185 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+   Copyright (C) 2011-2013 Linaro Limited
+   Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com>
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "unwind_i.h"
+#include "offsets.h"
+
+#ifndef UNW_REMOTE_ONLY
+
+HIDDEN inline int
+aarch64_local_resume (unw_addr_space_t as, unw_cursor_t *cursor, void *arg)
+{
+#ifdef __linux__
+  struct cursor *c = (struct cursor *) cursor;
+  unw_tdep_context_t *uc = c->dwarf.as_arg;
+
+  if (c->sigcontext_format == AARCH64_SCF_NONE)
+    {
+      /* Since there are no signals involved here we restore EH and non scratch
+         registers only.  */
+      unsigned long regs[15];
+      regs[0] = uc->uc_mcontext.regs[0];
+      regs[1] = uc->uc_mcontext.regs[1];
+      regs[2] = uc->uc_mcontext.regs[2];
+      regs[3] = uc->uc_mcontext.regs[3];
+      regs[4] = uc->uc_mcontext.regs[19];
+      regs[5] = uc->uc_mcontext.regs[20];
+      regs[6] = uc->uc_mcontext.regs[21];
+      regs[7] = uc->uc_mcontext.regs[22];
+      regs[8] = uc->uc_mcontext.regs[23];
+      regs[9] = uc->uc_mcontext.regs[24];
+      regs[10] = uc->uc_mcontext.regs[25];
+      regs[11] = uc->uc_mcontext.regs[26];
+      regs[12] = uc->uc_mcontext.regs[27];
+      regs[13] = uc->uc_mcontext.regs[28];
+      regs[14] = uc->uc_mcontext.regs[30]; /* LR */
+      unsigned long sp = uc->uc_mcontext.sp;
+
+      struct regs_overlay {
+        char x[sizeof(regs)];
+      };
+
+      asm volatile (
+        "mov x4, %0\n"
+        "mov x5, %1\n"
+        "ldp x0,  x1,  [x4]\n"
+        "ldp x2,  x3,  [x4,16]\n"
+        "ldp x19, x20, [x4,32]\n"
+        "ldp x21, x22, [x4,48]\n"
+        "ldp x23, x24, [x4,64]\n"
+        "ldp x25, x26, [x4,80]\n"
+        "ldp x27, x28, [x4,96]\n"
+        "ldr x30, [x4,112]\n"
+        "mov sp, x5\n"
+        "ret \n"
+        :
+        : "r" (regs),
+          "r" (sp),
+          "m" (*(struct regs_overlay *)regs)
+      );
+    }
+  else
+    {
+      struct sigcontext *sc = (struct sigcontext *) c->sigcontext_addr;
+
+      if (c->dwarf.eh_valid_mask & 0x1) sc->regs[0] = c->dwarf.eh_args[0];
+      if (c->dwarf.eh_valid_mask & 0x2) sc->regs[1] = c->dwarf.eh_args[1];
+      if (c->dwarf.eh_valid_mask & 0x4) sc->regs[2] = c->dwarf.eh_args[2];
+      if (c->dwarf.eh_valid_mask & 0x8) sc->regs[3] = c->dwarf.eh_args[3];
+
+      sc->regs[4] = uc->uc_mcontext.regs[4];
+      sc->regs[5] = uc->uc_mcontext.regs[5];
+      sc->regs[6] = uc->uc_mcontext.regs[6];
+      sc->regs[7] = uc->uc_mcontext.regs[7];
+      sc->regs[8] = uc->uc_mcontext.regs[8];
+      sc->regs[9] = uc->uc_mcontext.regs[9];
+      sc->regs[10] = uc->uc_mcontext.regs[10];
+      sc->regs[11] = uc->uc_mcontext.regs[11];
+      sc->regs[12] = uc->uc_mcontext.regs[12];
+      sc->regs[13] = uc->uc_mcontext.regs[13];
+      sc->regs[14] = uc->uc_mcontext.regs[14];
+      sc->regs[15] = uc->uc_mcontext.regs[15];
+      sc->regs[16] = uc->uc_mcontext.regs[16];
+      sc->regs[17] = uc->uc_mcontext.regs[17];
+      sc->regs[18] = uc->uc_mcontext.regs[18];
+      sc->regs[19] = uc->uc_mcontext.regs[19];
+      sc->regs[20] = uc->uc_mcontext.regs[20];
+      sc->regs[21] = uc->uc_mcontext.regs[21];
+      sc->regs[22] = uc->uc_mcontext.regs[22];
+      sc->regs[23] = uc->uc_mcontext.regs[23];
+      sc->regs[24] = uc->uc_mcontext.regs[24];
+      sc->regs[25] = uc->uc_mcontext.regs[25];
+      sc->regs[26] = uc->uc_mcontext.regs[26];
+      sc->regs[27] = uc->uc_mcontext.regs[27];
+      sc->regs[28] = uc->uc_mcontext.regs[28];
+      sc->regs[29] = uc->uc_mcontext.regs[29];
+      sc->regs[30] = uc->uc_mcontext.regs[30];
+      sc->sp = uc->uc_mcontext.sp;
+      sc->pc = uc->uc_mcontext.pc;
+      sc->pstate = uc->uc_mcontext.pstate;
+
+      asm volatile (
+        "mov sp, %0\n"
+        "ret %1\n"
+        : : "r" (c->sigcontext_sp), "r" (c->sigcontext_pc)
+      );
+   }
+  unreachable();
+#else
+  printf ("%s: implement me\n", __FUNCTION__);
+#endif
+  return -UNW_EINVAL;
+}
+
+#endif /* !UNW_REMOTE_ONLY */
+
+static inline void
+establish_machine_state (struct cursor *c)
+{
+  unw_addr_space_t as = c->dwarf.as;
+  void *arg = c->dwarf.as_arg;
+  unw_fpreg_t fpval;
+  unw_word_t val;
+  int reg;
+
+  Debug (8, "copying out cursor state\n");
+
+  for (reg = 0; reg <= UNW_AARCH64_PSTATE; ++reg)
+    {
+      Debug (16, "copying %s %d\n", unw_regname (reg), reg);
+      if (unw_is_fpreg (reg))
+        {
+          if (tdep_access_fpreg (c, reg, &fpval, 0) >= 0)
+            as->acc.access_fpreg (as, reg, &fpval, 1, arg);
+        }
+      else
+        {
+          if (tdep_access_reg (c, reg, &val, 0) >= 0)
+            as->acc.access_reg (as, reg, &val, 1, arg);
+        }
+    }
+}
+
+PROTECTED int
+unw_resume (unw_cursor_t *cursor)
+{
+  struct cursor *c = (struct cursor *) cursor;
+
+  Debug (1, "(cursor=%p)\n", c);
+
+  if (!c->dwarf.ip)
+    {
+      /* This can happen easily when the frame-chain gets truncated
+         due to bad or missing unwind-info.  */
+      Debug (1, "refusing to resume execution at address 0\n");
+      return -UNW_EINVAL;
+    }
+
+  establish_machine_state (c);
+
+  return (*c->dwarf.as->acc.resume) (c->dwarf.as, (unw_cursor_t *) c,
+                                     c->dwarf.as_arg);
+}
diff --git a/frysk-imports/libunwind/src/aarch64/Gstash_frame.c b/frysk-imports/libunwind/src/aarch64/Gstash_frame.c
new file mode 100644
index 0000000..9c1a54d
--- /dev/null
+++ b/frysk-imports/libunwind/src/aarch64/Gstash_frame.c
@@ -0,0 +1,89 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2010, 2011 by FERMI NATIONAL ACCELERATOR LABORATORY
+   Copyright (C) 2014 CERN and Aalto University
+        Contributed by Filip Nyback
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "unwind_i.h"
+
+HIDDEN void
+tdep_stash_frame (struct dwarf_cursor *d, struct dwarf_reg_state *rs)
+{
+  struct cursor *c = (struct cursor *) dwarf_to_cursor (d);
+  unw_tdep_frame_t *f = &c->frame_info;
+
+  Debug (4, "ip=0x%lx cfa=0x%lx type %d cfa [where=%d val=%ld] cfaoff=%ld"
+         " ra=0x%lx fp [where=%d val=%ld @0x%lx] lr [where=%d val=%ld @0x%lx] "
+         "sp [where=%d val=%ld @0x%lx]\n",
+         d->ip, d->cfa, f->frame_type,
+         rs->reg[DWARF_CFA_REG_COLUMN].where,
+         rs->reg[DWARF_CFA_REG_COLUMN].val,
+         rs->reg[DWARF_CFA_OFF_COLUMN].val,
+         DWARF_GET_LOC(d->loc[d->ret_addr_column]),
+         rs->reg[FP].where, rs->reg[FP].val, DWARF_GET_LOC(d->loc[FP]),
+         rs->reg[LR].where, rs->reg[LR].val, DWARF_GET_LOC(d->loc[LR]),
+         rs->reg[SP].where, rs->reg[SP].val, DWARF_GET_LOC(d->loc[SP]));
+
+  /* A standard frame is defined as:
+      - CFA is register-relative offset off FP or SP;
+      - Return address is saved in LR;
+      - FP is unsaved or saved at CFA+offset, offset != -1;
+      - LR is unsaved or saved at CFA+offset, offset != -1;
+      - SP is unsaved or saved at CFA+offset, offset != -1.  */
+  if (f->frame_type == UNW_AARCH64_FRAME_OTHER
+      && (rs->reg[DWARF_CFA_REG_COLUMN].where == DWARF_WHERE_REG)
+      && (rs->reg[DWARF_CFA_REG_COLUMN].val == FP
+          || rs->reg[DWARF_CFA_REG_COLUMN].val == SP)
+      && labs(rs->reg[DWARF_CFA_OFF_COLUMN].val) < (1 << 29)
+      && d->ret_addr_column == LR
+      && (rs->reg[FP].where == DWARF_WHERE_UNDEF
+          || rs->reg[FP].where == DWARF_WHERE_SAME
+          || (rs->reg[FP].where == DWARF_WHERE_CFAREL
+              && labs(rs->reg[FP].val) < (1 << 29)
+              && rs->reg[FP].val+1 != 0))
+      && (rs->reg[LR].where == DWARF_WHERE_UNDEF
+          || rs->reg[LR].where == DWARF_WHERE_SAME
+          || (rs->reg[LR].where == DWARF_WHERE_CFAREL
+              && labs(rs->reg[LR].val) < (1 << 29)
+              && rs->reg[LR].val+1 != 0))
+      && (rs->reg[SP].where == DWARF_WHERE_UNDEF
+          || rs->reg[SP].where == DWARF_WHERE_SAME
+          || (rs->reg[SP].where == DWARF_WHERE_CFAREL
+              && labs(rs->reg[SP].val) < (1 << 29)
+              && rs->reg[SP].val+1 != 0)))
+  {
+    /* Save information for a standard frame. */
+    f->frame_type = UNW_AARCH64_FRAME_STANDARD;
+    f->cfa_reg_sp = (rs->reg[DWARF_CFA_REG_COLUMN].val == SP);
+    f->cfa_reg_offset = rs->reg[DWARF_CFA_OFF_COLUMN].val;
+    if (rs->reg[FP].where == DWARF_WHERE_CFAREL)
+      f->fp_cfa_offset = rs->reg[FP].val;
+    if (rs->reg[LR].where == DWARF_WHERE_CFAREL)
+      f->lr_cfa_offset = rs->reg[LR].val;
+    if (rs->reg[SP].where == DWARF_WHERE_CFAREL)
+      f->sp_cfa_offset = rs->reg[SP].val;
+    Debug (4, " standard frame\n");
+  }
+  else
+    Debug (4, " unusual frame\n");
+}
diff --git a/frysk-imports/libunwind/src/aarch64/Gstep.c b/frysk-imports/libunwind/src/aarch64/Gstep.c
new file mode 100644
index 0000000..0c35f98
--- /dev/null
+++ b/frysk-imports/libunwind/src/aarch64/Gstep.c
@@ -0,0 +1,131 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+   Copyright (C) 2011-2013 Linaro Limited
+   Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com>
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "unwind_i.h"
+#include "offsets.h"
+
+PROTECTED int
+unw_handle_signal_frame (unw_cursor_t *cursor)
+{
+  struct cursor *c = (struct cursor *) cursor;
+  int ret;
+  unw_word_t sc_addr, sp, sp_addr = c->dwarf.cfa;
+  struct dwarf_loc sp_loc = DWARF_LOC (sp_addr, 0);
+
+  if ((ret = dwarf_get (&c->dwarf, sp_loc, &sp)) < 0)
+    return -UNW_EUNSPEC;
+
+  ret = unw_is_signal_frame (cursor);
+  Debug(1, "unw_is_signal_frame()=%d\n", ret);
+
+  /* Save the SP and PC to be able to return execution at this point
+     later in time (unw_resume).  */
+  c->sigcontext_sp = c->dwarf.cfa;
+  c->sigcontext_pc = c->dwarf.ip;
+
+  if (ret)
+    {
+      c->sigcontext_format = AARCH64_SCF_LINUX_RT_SIGFRAME;
+      sc_addr = sp_addr + sizeof (siginfo_t) + LINUX_UC_MCONTEXT_OFF;
+    }
+  else
+    return -UNW_EUNSPEC;
+
+  c->sigcontext_addr = sc_addr;
+  c->frame_info.frame_type = UNW_AARCH64_FRAME_SIGRETURN;
+  c->frame_info.cfa_reg_offset = sc_addr - sp_addr;
+
+  /* Update the dwarf cursor.
+     Set the location of the registers to the corresponding addresses of the
+     uc_mcontext / sigcontext structure contents.  */
+  c->dwarf.loc[UNW_AARCH64_X0]  = DWARF_LOC (sc_addr + LINUX_SC_X0_OFF, 0);
+  c->dwarf.loc[UNW_AARCH64_X1]  = DWARF_LOC (sc_addr + LINUX_SC_X1_OFF, 0);
+  c->dwarf.loc[UNW_AARCH64_X2]  = DWARF_LOC (sc_addr + LINUX_SC_X2_OFF, 0);
+  c->dwarf.loc[UNW_AARCH64_X3]  = DWARF_LOC (sc_addr + LINUX_SC_X3_OFF, 0);
+  c->dwarf.loc[UNW_AARCH64_X4]  = DWARF_LOC (sc_addr + LINUX_SC_X4_OFF, 0);
+  c->dwarf.loc[UNW_AARCH64_X5]  = DWARF_LOC (sc_addr + LINUX_SC_X5_OFF, 0);
+  c->dwarf.loc[UNW_AARCH64_X6]  = DWARF_LOC (sc_addr + LINUX_SC_X6_OFF, 0);
+  c->dwarf.loc[UNW_AARCH64_X7]  = DWARF_LOC (sc_addr + LINUX_SC_X7_OFF, 0);
+  c->dwarf.loc[UNW_AARCH64_X8]  = DWARF_LOC (sc_addr + LINUX_SC_X8_OFF, 0);
+  c->dwarf.loc[UNW_AARCH64_X9]  = DWARF_LOC (sc_addr + LINUX_SC_X9_OFF, 0);
+  c->dwarf.loc[UNW_AARCH64_X10] = DWARF_LOC (sc_addr + LINUX_SC_X10_OFF, 0);
+  c->dwarf.loc[UNW_AARCH64_X11] = DWARF_LOC (sc_addr + LINUX_SC_X11_OFF, 0);
+  c->dwarf.loc[UNW_AARCH64_X12] = DWARF_LOC (sc_addr + LINUX_SC_X12_OFF, 0);
+  c->dwarf.loc[UNW_AARCH64_X13] = DWARF_LOC (sc_addr + LINUX_SC_X13_OFF, 0);
+  c->dwarf.loc[UNW_AARCH64_X14] = DWARF_LOC (sc_addr + LINUX_SC_X14_OFF, 0);
+  c->dwarf.loc[UNW_AARCH64_X15] = DWARF_LOC (sc_addr + LINUX_SC_X15_OFF, 0);
+  c->dwarf.loc[UNW_AARCH64_X16] = DWARF_LOC (sc_addr + LINUX_SC_X16_OFF, 0);
+  c->dwarf.loc[UNW_AARCH64_X17] = DWARF_LOC (sc_addr + LINUX_SC_X17_OFF, 0);
+  c->dwarf.loc[UNW_AARCH64_X18] = DWARF_LOC (sc_addr + LINUX_SC_X18_OFF, 0);
+  c->dwarf.loc[UNW_AARCH64_X19] = DWARF_LOC (sc_addr + LINUX_SC_X19_OFF, 0);
+  c->dwarf.loc[UNW_AARCH64_X20] = DWARF_LOC (sc_addr + LINUX_SC_X20_OFF, 0);
+  c->dwarf.loc[UNW_AARCH64_X21] = DWARF_LOC (sc_addr + LINUX_SC_X21_OFF, 0);
+  c->dwarf.loc[UNW_AARCH64_X22] = DWARF_LOC (sc_addr + LINUX_SC_X22_OFF, 0);
+  c->dwarf.loc[UNW_AARCH64_X23] = DWARF_LOC (sc_addr + LINUX_SC_X23_OFF, 0);
+  c->dwarf.loc[UNW_AARCH64_X24] = DWARF_LOC (sc_addr + LINUX_SC_X24_OFF, 0);
+  c->dwarf.loc[UNW_AARCH64_X25] = DWARF_LOC (sc_addr + LINUX_SC_X25_OFF, 0);
+  c->dwarf.loc[UNW_AARCH64_X26] = DWARF_LOC (sc_addr + LINUX_SC_X26_OFF, 0);
+  c->dwarf.loc[UNW_AARCH64_X27] = DWARF_LOC (sc_addr + LINUX_SC_X27_OFF, 0);
+  c->dwarf.loc[UNW_AARCH64_X28] = DWARF_LOC (sc_addr + LINUX_SC_X28_OFF, 0);
+  c->dwarf.loc[UNW_AARCH64_X29] = DWARF_LOC (sc_addr + LINUX_SC_X29_OFF, 0);
+  c->dwarf.loc[UNW_AARCH64_X30] = DWARF_LOC (sc_addr + LINUX_SC_X30_OFF, 0);
+  c->dwarf.loc[UNW_AARCH64_SP]  = DWARF_LOC (sc_addr + LINUX_SC_SP_OFF, 0);
+  c->dwarf.loc[UNW_AARCH64_PC]  = DWARF_LOC (sc_addr + LINUX_SC_PC_OFF, 0);
+  c->dwarf.loc[UNW_AARCH64_PSTATE]  = DWARF_LOC (sc_addr + LINUX_SC_PSTATE_OFF, 0);
+
+  /* Set SP/CFA and PC/IP.  */
+  dwarf_get (&c->dwarf, c->dwarf.loc[UNW_AARCH64_SP], &c->dwarf.cfa);
+  dwarf_get (&c->dwarf, c->dwarf.loc[UNW_AARCH64_PC], &c->dwarf.ip);
+
+  c->dwarf.pi_valid = 0;
+
+  return 1;
+}
+
+PROTECTED int
+unw_step (unw_cursor_t *cursor)
+{
+  struct cursor *c = (struct cursor *) cursor;
+  int ret;
+
+  Debug (1, "(cursor=%p, ip=0x%016lx, cfa=0x%016lx))\n",
+         c, c->dwarf.ip, c->dwarf.cfa);
+
+  /* Check if this is a signal frame. */
+  if (unw_is_signal_frame (cursor))
+    return unw_handle_signal_frame (cursor);
+
+  ret = dwarf_step (&c->dwarf);
+  Debug(1, "dwarf_step()=%d\n", ret);
+
+  if (unlikely (ret == -UNW_ESTOPUNWIND))
+    return ret;
+
+  if (unlikely (ret < 0))
+    return 0;
+
+  return (c->dwarf.ip == 0) ? 0 : 1;
+}
diff --git a/frysk-imports/libunwind/src/aarch64/Gtrace.c b/frysk-imports/libunwind/src/aarch64/Gtrace.c
new file mode 100644
index 0000000..c67faf0
--- /dev/null
+++ b/frysk-imports/libunwind/src/aarch64/Gtrace.c
@@ -0,0 +1,548 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2010, 2011 by FERMI NATIONAL ACCELERATOR LABORATORY
+   Copyright (C) 2014 CERN and Aalto University
+        Contributed by Filip Nyback
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "unwind_i.h"
+#include "offsets.h"
+#include <signal.h>
+#include <limits.h>
+
+#pragma weak pthread_once
+#pragma weak pthread_key_create
+#pragma weak pthread_getspecific
+#pragma weak pthread_setspecific
+
+/* Initial hash table size. Table expands by 2 bits (times four). */
+#define HASH_MIN_BITS 14
+
+typedef struct
+{
+  unw_tdep_frame_t *frames;
+  size_t log_size;
+  size_t used;
+  size_t dtor_count;  /* Counts how many times our destructor has already
+                         been called. */
+} unw_trace_cache_t;
+
+static const unw_tdep_frame_t empty_frame = { 0, UNW_AARCH64_FRAME_OTHER, -1, -1, 0, -1, -1, -1 };
+static define_lock (trace_init_lock);
+static pthread_once_t trace_cache_once = PTHREAD_ONCE_INIT;
+static sig_atomic_t trace_cache_once_happen;
+static pthread_key_t trace_cache_key;
+static struct mempool trace_cache_pool;
+static __thread  unw_trace_cache_t *tls_cache;
+static __thread  int tls_cache_destroyed;
+
+/* Free memory for a thread's trace cache. */
+static void
+trace_cache_free (void *arg)
+{
+  unw_trace_cache_t *cache = arg;
+  if (++cache->dtor_count < PTHREAD_DESTRUCTOR_ITERATIONS)
+  {
+    /* Not yet our turn to get destroyed. Re-install ourselves into the key. */
+    pthread_setspecific(trace_cache_key, cache);
+    Debug(5, "delayed freeing cache %p (%zx to go)\n", cache,
+          PTHREAD_DESTRUCTOR_ITERATIONS - cache->dtor_count);
+    return;
+  }
+  tls_cache_destroyed = 1;
+  tls_cache = NULL;
+  munmap (cache->frames, (1u << cache->log_size) * sizeof(unw_tdep_frame_t));
+  mempool_free (&trace_cache_pool, cache);
+  Debug(5, "freed cache %p\n", cache);
+}
+
+/* Initialise frame tracing for threaded use. */
+static void
+trace_cache_init_once (void)
+{
+  pthread_key_create (&trace_cache_key, &trace_cache_free);
+  mempool_init (&trace_cache_pool, sizeof (unw_trace_cache_t), 0);
+  trace_cache_once_happen = 1;
+}
+
+static unw_tdep_frame_t *
+trace_cache_buckets (size_t n)
+{
+  unw_tdep_frame_t *frames;
+  size_t i;
+
+  GET_MEMORY(frames, n * sizeof (unw_tdep_frame_t));
+  if (likely(frames != NULL))
+    for (i = 0; i < n; ++i)
+      frames[i] = empty_frame;
+
+  return frames;
+}
+
+/* Allocate and initialise hash table for frame cache lookups.
+   Returns the cache initialised with (1u << HASH_LOW_BITS) hash
+   buckets, or NULL if there was a memory allocation problem. */
+static unw_trace_cache_t *
+trace_cache_create (void)
+{
+  unw_trace_cache_t *cache;
+
+  if (tls_cache_destroyed)
+  {
+    /* The current thread is in the process of exiting. Don't recreate
+       cache, as we wouldn't have another chance to free it. */
+    Debug(5, "refusing to reallocate cache: "
+             "thread-locals are being deallocated\n");
+    return NULL;
+  }
+
+  if (! (cache = mempool_alloc(&trace_cache_pool)))
+  {
+    Debug(5, "failed to allocate cache\n");
+    return NULL;
+  }
+
+  if (! (cache->frames = trace_cache_buckets(1u << HASH_MIN_BITS)))
+  {
+    Debug(5, "failed to allocate buckets\n");
+    mempool_free(&trace_cache_pool, cache);
+    return NULL;
+  }
+
+  cache->log_size = HASH_MIN_BITS;
+  cache->used = 0;
+  cache->dtor_count = 0;
+  tls_cache_destroyed = 0;  /* Paranoia: should already be 0. */
+  Debug(5, "allocated cache %p\n", cache);
+  return cache;
+}
+
+/* Expand the hash table in the frame cache if possible. This always
+   quadruples the hash size, and clears all previous frame entries. */
+static int
+trace_cache_expand (unw_trace_cache_t *cache)
+{
+  size_t old_size = (1u << cache->log_size);
+  size_t new_log_size = cache->log_size + 2;
+  unw_tdep_frame_t *new_frames = trace_cache_buckets (1u << new_log_size);
+
+  if (unlikely(! new_frames))
+  {
+    Debug(5, "failed to expand cache to 2^%lu buckets\n", new_log_size);
+    return -UNW_ENOMEM;
+  }
+
+  Debug(5, "expanded cache from 2^%lu to 2^%lu buckets\n", cache->log_size, new_log_size);
+  munmap(cache->frames, old_size * sizeof(unw_tdep_frame_t));
+  cache->frames = new_frames;
+  cache->log_size = new_log_size;
+  cache->used = 0;
+  return 0;
+}
+
+static unw_trace_cache_t *
+trace_cache_get_unthreaded (void)
+{
+  unw_trace_cache_t *cache;
+  intrmask_t saved_mask;
+  static unw_trace_cache_t *global_cache = NULL;
+  lock_acquire (&trace_init_lock, saved_mask);
+  if (! global_cache)
+  {
+    mempool_init (&trace_cache_pool, sizeof (unw_trace_cache_t), 0);
+    global_cache = trace_cache_create ();
+  }
+  cache = global_cache;
+  lock_release (&trace_init_lock, saved_mask);
+  Debug(5, "using cache %p\n", cache);
+  return cache;
+}
+
+/* Get the frame cache for the current thread. Create it if there is none. */
+static unw_trace_cache_t *
+trace_cache_get (void)
+{
+  unw_trace_cache_t *cache;
+  if (likely (pthread_once != NULL))
+  {
+    pthread_once(&trace_cache_once, &trace_cache_init_once);
+    if (!trace_cache_once_happen)
+    {
+      return trace_cache_get_unthreaded();
+    }
+    if (! (cache = tls_cache))
+    {
+      cache = trace_cache_create();
+      pthread_setspecific(trace_cache_key, cache);
+      tls_cache = cache;
+    }
+    Debug(5, "using cache %p\n", cache);
+    return cache;
+  }
+  else
+  {
+    return trace_cache_get_unthreaded();
+  }
+}
+
+/* Initialise frame properties for address cache slot F at address
+   PC using current CFA, FP and SP values.  Modifies CURSOR to
+   that location, performs one unw_step(), and fills F with what
+   was discovered about the location.  Returns F.
+
+   FIXME: This probably should tell DWARF handling to never evaluate
+   or use registers other than FP, SP and PC in case there is
+   highly unusual unwind info which uses these creatively. */
+static unw_tdep_frame_t *
+trace_init_addr (unw_tdep_frame_t *f,
+                 unw_cursor_t *cursor,
+                 unw_word_t cfa,
+                 unw_word_t pc,
+                 unw_word_t fp,
+                 unw_word_t sp)
+{
+  struct cursor *c = (struct cursor *) cursor;
+  struct dwarf_cursor *d = &c->dwarf;
+  int ret = -UNW_EINVAL;
+
+  /* Initialise frame properties: unknown, not last. */
+  f->virtual_address = pc;
+  f->frame_type = UNW_AARCH64_FRAME_OTHER;
+  f->last_frame = 0;
+  f->cfa_reg_sp = -1;
+  f->cfa_reg_offset = 0;
+  f->fp_cfa_offset = -1;
+  f->lr_cfa_offset = -1;
+  f->sp_cfa_offset = -1;
+
+  /* Reinitialise cursor to this instruction - but undo next/prev PC
+     adjustment because unw_step will redo it - and force PC, FP and
+     SP into register locations (=~ ucontext we keep), then set
+     their desired values. Then perform the step. */
+  d->ip = pc + d->use_prev_instr;
+  d->cfa = cfa;
+  d->loc[UNW_AARCH64_X29] = DWARF_REG_LOC (d, UNW_AARCH64_X29);
+  d->loc[UNW_AARCH64_SP] = DWARF_REG_LOC (d, UNW_AARCH64_SP);
+  d->loc[UNW_AARCH64_PC] = DWARF_REG_LOC (d, UNW_AARCH64_PC);
+  c->frame_info = *f;
+
+  if (likely(dwarf_put (d, d->loc[UNW_AARCH64_X29], fp) >= 0)
+      && likely(dwarf_put (d, d->loc[UNW_AARCH64_SP], sp) >= 0)
+      && likely(dwarf_put (d, d->loc[UNW_AARCH64_PC], pc) >= 0)
+      && likely((ret = unw_step (cursor)) >= 0))
+    *f = c->frame_info;
+
+  /* If unw_step() stopped voluntarily, remember that, even if it
+     otherwise could not determine anything useful.  This avoids
+     failing trace if we hit frames without unwind info, which is
+     common for the outermost frame (CRT stuff) on many systems.
+     This avoids failing trace in very common circumstances; failing
+     to unw_step() loop wouldn't produce any better result. */
+  if (ret == 0)
+    f->last_frame = -1;
+
+  Debug (3, "frame va %lx type %d last %d cfa %s+%d fp @ cfa%+d lr @ cfa%+d sp @ cfa%+d\n",
+         f->virtual_address, f->frame_type, f->last_frame,
+         f->cfa_reg_sp ? "sp" : "fp", f->cfa_reg_offset,
+         f->fp_cfa_offset, f->lr_cfa_offset, f->sp_cfa_offset);
+
+  return f;
+}
+
+/* Look up and if necessary fill in frame attributes for address PC
+   in CACHE using current CFA, FP and SP values.  Uses CURSOR to
+   perform any unwind steps necessary to fill the cache.  Returns the
+   frame cache slot which describes RIP. */
+static unw_tdep_frame_t *
+trace_lookup (unw_cursor_t *cursor,
+              unw_trace_cache_t *cache,
+              unw_word_t cfa,
+              unw_word_t pc,
+              unw_word_t fp,
+              unw_word_t sp)
+{
+  /* First look up for previously cached information using cache as
+     linear probing hash table with probe step of 1.  Majority of
+     lookups should be completed within few steps, but it is very
+     important the hash table does not fill up, or performance falls
+     off the cliff. */
+  uint64_t i, addr;
+  uint64_t cache_size = 1u << cache->log_size;
+  uint64_t slot = ((pc * 0x9e3779b97f4a7c16) >> 43) & (cache_size-1);
+  unw_tdep_frame_t *frame;
+
+  for (i = 0; i < 16; ++i)
+  {
+    frame = &cache->frames[slot];
+    addr = frame->virtual_address;
+
+    /* Return if we found the address. */
+    if (likely(addr == pc))
+    {
+      Debug (4, "found address after %ld steps\n", i);
+      return frame;
+    }
+
+    /* If slot is empty, reuse it. */
+    if (likely(! addr))
+      break;
+
+    /* Linear probe to next slot candidate, step = 1. */
+    if (++slot >= cache_size)
+      slot -= cache_size;
+  }
+
+  /* If we collided after 16 steps, or if the hash is more than half
+     full, force the hash to expand. Fill the selected slot, whether
+     it's free or collides. Note that hash expansion drops previous
+     contents; further lookups will refill the hash. */
+  Debug (4, "updating slot %lu after %ld steps, replacing 0x%lx\n", slot, i, addr);
+  if (unlikely(addr || cache->used >= cache_size / 2))
+  {
+    if (unlikely(trace_cache_expand (cache) < 0))
+      return NULL;
+
+    cache_size = 1u << cache->log_size;
+    slot = ((pc * 0x9e3779b97f4a7c16) >> 43) & (cache_size-1);
+    frame = &cache->frames[slot];
+    addr = frame->virtual_address;
+  }
+
+  if (! addr)
+    ++cache->used;
+
+  return trace_init_addr (frame, cursor, cfa, pc, fp, sp);
+}
+
+/* Fast stack backtrace for AArch64.
+
+   This is used by backtrace() implementation to accelerate frequent
+   queries for current stack, without any desire to unwind. It fills
+   BUFFER with the call tree from CURSOR upwards for at most SIZE
+   stack levels. The first frame, backtrace itself, is omitted. When
+   called, SIZE should give the maximum number of entries that can be
+   stored into BUFFER. Uses an internal thread-specific cache to
+   accelerate queries.
+
+   The caller should fall back to a unw_step() loop if this function
+   fails by returning -UNW_ESTOPUNWIND, meaning the routine hit a
+   stack frame that is too complex to be traced in the fast path.
+
+   This function is tuned for clients which only need to walk the
+   stack to get the call tree as fast as possible but without any
+   other details, for example profilers sampling the stack thousands
+   to millions of times per second.  The routine handles the most
+   common AArch64 ABI stack layouts: CFA is FP or SP plus/minus
+   constant offset, return address is in LR, and FP, LR and SP are
+   either unchanged or saved on stack at constant offset from the CFA;
+   the signal return frame; and frames without unwind info provided
+   they are at the outermost (final) frame or can conservatively be
+   assumed to be frame-pointer based.
+
+   Any other stack layout will cause the routine to give up. There
+   are only a handful of relatively rarely used functions which do
+   not have a stack in the standard form: vfork, longjmp, setcontext
+   and _dl_runtime_profile on common linux systems for example.
+
+   On success BUFFER and *SIZE reflect the trace progress up to *SIZE
+   stack levels or the outermost frame, which ever is less.  It may
+   stop short of outermost frame if unw_step() loop would also do so,
+   e.g. if there is no more unwind information; this is not reported
+   as an error.
+
+   The function returns a negative value for errors, -UNW_ESTOPUNWIND
+   if tracing stopped because of an unusual frame unwind info.  The
+   BUFFER and *SIZE reflect tracing progress up to the error frame.
+
+   Callers of this function would normally look like this:
+
+     unw_cursor_t     cur;
+     unw_context_t    ctx;
+     void             addrs[128];
+     int              depth = 128;
+     int              ret;
+
+     unw_getcontext(&ctx);
+     unw_init_local(&cur, &ctx);
+     if ((ret = unw_tdep_trace(&cur, addrs, &depth)) < 0)
+     {
+       depth = 0;
+       unw_getcontext(&ctx);
+       unw_init_local(&cur, &ctx);
+       while ((ret = unw_step(&cur)) > 0 && depth < 128)
+       {
+         unw_word_t ip;
+         unw_get_reg(&cur, UNW_REG_IP, &ip);
+         addresses[depth++] = (void *) ip;
+       }
+     }
+*/
+HIDDEN int
+tdep_trace (unw_cursor_t *cursor, void **buffer, int *size)
+{
+  struct cursor *c = (struct cursor *) cursor;
+  struct dwarf_cursor *d = &c->dwarf;
+  unw_trace_cache_t *cache;
+  unw_word_t fp, sp, pc, cfa, lr;
+  int maxdepth = 0;
+  int depth = 0;
+  int ret;
+
+  /* Check input parametres. */
+  if (unlikely(! cursor || ! buffer || ! size || (maxdepth = *size) <= 0))
+    return -UNW_EINVAL;
+
+  Debug (1, "begin ip 0x%lx cfa 0x%lx\n", d->ip, d->cfa);
+
+  /* Tell core dwarf routines to call back to us. */
+  d->stash_frames = 1;
+
+  /* Determine initial register values. These are direct access safe
+     because we know they come from the initial machine context. */
+  pc = d->ip;
+  sp = cfa = d->cfa;
+  ACCESS_MEM_FAST(ret, 0, d, DWARF_GET_LOC(d->loc[UNW_AARCH64_X29]), fp);
+  assert(ret == 0);
+  lr = 0;
+
+  /* Get frame cache. */
+  if (unlikely(! (cache = trace_cache_get())))
+  {
+    Debug (1, "returning %d, cannot get trace cache\n", -UNW_ENOMEM);
+    *size = 0;
+    d->stash_frames = 0;
+    return -UNW_ENOMEM;
+  }
+
+  /* Trace the stack upwards, starting from current RIP.  Adjust
+     the RIP address for previous/next instruction as the main
+     unwinding logic would also do.  We undo this before calling
+     back into unw_step(). */
+  while (depth < maxdepth)
+  {
+    pc -= d->use_prev_instr;
+    Debug (2, "depth %d cfa 0x%lx pc 0x%lx sp 0x%lx fp 0x%lx\n",
+           depth, cfa, pc, sp, fp);
+
+    /* See if we have this address cached.  If not, evaluate enough of
+       the dwarf unwind information to fill the cache line data, or to
+       decide this frame cannot be handled in fast trace mode.  We
+       cache negative results too to prevent unnecessary dwarf parsing
+       for common failures. */
+    unw_tdep_frame_t *f = trace_lookup (cursor, cache, cfa, pc, fp, sp);
+
+    /* If we don't have information for this frame, give up. */
+    if (unlikely(! f))
+    {
+      ret = -UNW_ENOINFO;
+      break;
+    }
+
+    Debug (3, "frame va %lx type %d last %d cfa %s+%d fp @ cfa%+d lr @ cfa%+d sp @ cfa%+d\n",
+           f->virtual_address, f->frame_type, f->last_frame,
+           f->cfa_reg_sp ? "sp" : "fp", f->cfa_reg_offset,
+           f->fp_cfa_offset, f->lr_cfa_offset, f->sp_cfa_offset);
+
+    assert (f->virtual_address == pc);
+
+    /* Stop if this was the last frame.  In particular don't evaluate
+       new register values as it may not be safe - we don't normally
+       run with full validation on, and do not want to - and there's
+       enough bad unwind info floating around that we need to trust
+       what unw_step() previously said, in potentially bogus frames. */
+    if (f->last_frame)
+      break;
+
+    /* Evaluate CFA and registers for the next frame. */
+    switch (f->frame_type)
+    {
+    case UNW_AARCH64_FRAME_GUESSED:
+      /* Fall thru to standard processing after forcing validation. */
+      c->validate = 1;
+
+    case UNW_AARCH64_FRAME_STANDARD:
+      /* Advance standard traceable frame. */
+      cfa = (f->cfa_reg_sp ? sp : fp) + f->cfa_reg_offset;
+      if (likely(f->lr_cfa_offset != -1))
+        ACCESS_MEM_FAST(ret, c->validate, d, cfa + f->lr_cfa_offset, pc);
+      else if (lr != 0)
+      {
+        /* Use the saved link register as the new pc. */
+        pc = lr;
+        lr = 0;
+      }
+      if (likely(ret >= 0) && likely(f->fp_cfa_offset != -1))
+        ACCESS_MEM_FAST(ret, c->validate, d, cfa + f->fp_cfa_offset, fp);
+
+      /* Don't bother reading SP from DWARF, CFA becomes new SP. */
+      sp = cfa;
+
+      /* Next frame needs to back up for unwind info lookup. */
+      d->use_prev_instr = 1;
+      break;
+
+    case UNW_AARCH64_FRAME_SIGRETURN:
+      cfa = cfa + f->cfa_reg_offset; /* cfa now points to ucontext_t.  */
+
+      ACCESS_MEM_FAST(ret, c->validate, d, cfa + LINUX_SC_PC_OFF, pc);
+      if (likely(ret >= 0))
+        ACCESS_MEM_FAST(ret, c->validate, d, cfa + LINUX_SC_X29_OFF, fp);
+      if (likely(ret >= 0))
+        ACCESS_MEM_FAST(ret, c->validate, d, cfa + LINUX_SC_SP_OFF, sp);
+      /* Save the link register here in case we end up in a function that
+         doesn't save the link register in the prologue, e.g. kill. */
+      if (likely(ret >= 0))
+        ACCESS_MEM_FAST(ret, c->validate, d, cfa + LINUX_SC_X30_OFF, lr);
+
+      /* Resume stack at signal restoration point. The stack is not
+         necessarily continuous here, especially with sigaltstack(). */
+      cfa = sp;
+
+      /* Next frame should not back up. */
+      d->use_prev_instr = 0;
+      break;
+
+    default:
+      /* We cannot trace through this frame, give up and tell the
+          caller we had to stop.  Data collected so far may still be
+          useful to the caller, so let it know how far we got.  */
+      ret = -UNW_ESTOPUNWIND;
+      break;
+    }
+
+    Debug (4, "new cfa 0x%lx pc 0x%lx sp 0x%lx fp 0x%lx\n",
+           cfa, pc, sp, fp);
+
+    /* If we failed or ended up somewhere bogus, stop. */
+    if (unlikely(ret < 0 || pc < 0x4000))
+      break;
+
+    /* Record this address in stack trace. We skipped the first address. */
+    buffer[depth++] = (void *) (pc - d->use_prev_instr);
+  }
+
+#if UNW_DEBUG
+  Debug (1, "returning %d, depth %d\n", ret, depth);
+#endif
+  *size = depth;
+  return ret;
+}
diff --git a/frysk-imports/libunwind/src/aarch64/Lcreate_addr_space.c b/frysk-imports/libunwind/src/aarch64/Lcreate_addr_space.c
new file mode 100644
index 0000000..0f2dc6b
--- /dev/null
+++ b/frysk-imports/libunwind/src/aarch64/Lcreate_addr_space.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Gcreate_addr_space.c"
+#endif
diff --git a/frysk-imports/libunwind/src/aarch64/Lget_proc_info.c b/frysk-imports/libunwind/src/aarch64/Lget_proc_info.c
new file mode 100644
index 0000000..69028b0
--- /dev/null
+++ b/frysk-imports/libunwind/src/aarch64/Lget_proc_info.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Gget_proc_info.c"
+#endif
diff --git a/frysk-imports/libunwind/src/aarch64/Lget_save_loc.c b/frysk-imports/libunwind/src/aarch64/Lget_save_loc.c
new file mode 100644
index 0000000..9ea048a
--- /dev/null
+++ b/frysk-imports/libunwind/src/aarch64/Lget_save_loc.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Gget_save_loc.c"
+#endif
diff --git a/frysk-imports/libunwind/src/aarch64/Lglobal.c b/frysk-imports/libunwind/src/aarch64/Lglobal.c
new file mode 100644
index 0000000..6d7b489
--- /dev/null
+++ b/frysk-imports/libunwind/src/aarch64/Lglobal.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Gglobal.c"
+#endif
diff --git a/frysk-imports/libunwind/src/aarch64/Linit.c b/frysk-imports/libunwind/src/aarch64/Linit.c
new file mode 100644
index 0000000..e9abfdd
--- /dev/null
+++ b/frysk-imports/libunwind/src/aarch64/Linit.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Ginit.c"
+#endif
diff --git a/frysk-imports/libunwind/src/aarch64/Linit_local.c b/frysk-imports/libunwind/src/aarch64/Linit_local.c
new file mode 100644
index 0000000..68a1687
--- /dev/null
+++ b/frysk-imports/libunwind/src/aarch64/Linit_local.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Ginit_local.c"
+#endif
diff --git a/frysk-imports/libunwind/src/aarch64/Linit_remote.c b/frysk-imports/libunwind/src/aarch64/Linit_remote.c
new file mode 100644
index 0000000..58cb04a
--- /dev/null
+++ b/frysk-imports/libunwind/src/aarch64/Linit_remote.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Ginit_remote.c"
+#endif
diff --git a/frysk-imports/libunwind/src/aarch64/Lis_signal_frame.c b/frysk-imports/libunwind/src/aarch64/Lis_signal_frame.c
new file mode 100644
index 0000000..b9a7c4f
--- /dev/null
+++ b/frysk-imports/libunwind/src/aarch64/Lis_signal_frame.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Gis_signal_frame.c"
+#endif
diff --git a/frysk-imports/libunwind/src/aarch64/Lregs.c b/frysk-imports/libunwind/src/aarch64/Lregs.c
new file mode 100644
index 0000000..2c9c75c
--- /dev/null
+++ b/frysk-imports/libunwind/src/aarch64/Lregs.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Gregs.c"
+#endif
diff --git a/frysk-imports/libunwind/src/aarch64/Lresume.c b/frysk-imports/libunwind/src/aarch64/Lresume.c
new file mode 100644
index 0000000..41a8cf0
--- /dev/null
+++ b/frysk-imports/libunwind/src/aarch64/Lresume.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Gresume.c"
+#endif
diff --git a/frysk-imports/libunwind/src/aarch64/Lstash_frame.c b/frysk-imports/libunwind/src/aarch64/Lstash_frame.c
new file mode 100644
index 0000000..7758780
--- /dev/null
+++ b/frysk-imports/libunwind/src/aarch64/Lstash_frame.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Gstash_frame.c"
+#endif
diff --git a/frysk-imports/libunwind/src/aarch64/Lstep.c b/frysk-imports/libunwind/src/aarch64/Lstep.c
new file mode 100644
index 0000000..c1ac3c7
--- /dev/null
+++ b/frysk-imports/libunwind/src/aarch64/Lstep.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Gstep.c"
+#endif
diff --git a/frysk-imports/libunwind/src/aarch64/Ltrace.c b/frysk-imports/libunwind/src/aarch64/Ltrace.c
new file mode 100644
index 0000000..fcd3f23
--- /dev/null
+++ b/frysk-imports/libunwind/src/aarch64/Ltrace.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Gtrace.c"
+#endif
diff --git a/frysk-imports/libunwind/src/aarch64/gen-offsets.c b/frysk-imports/libunwind/src/aarch64/gen-offsets.c
new file mode 100644
index 0000000..eadc237
--- /dev/null
+++ b/frysk-imports/libunwind/src/aarch64/gen-offsets.c
@@ -0,0 +1,68 @@
+#include <stdio.h>
+#include <stddef.h>
+#include <ucontext.h>
+#include <asm/sigcontext.h>
+
+#define UC(N,X) \
+  printf ("#define LINUX_UC_" N "_OFF\t0x%X\n", offsetof (ucontext_t, X))
+
+#define SC(N,X) \
+  printf ("#define LINUX_SC_" N "_OFF\t0x%X\n", offsetof (struct sigcontext, X))
+
+int
+main (void)
+{
+  printf (
+"/* Linux-specific definitions: */\n\n"
+
+"/* Define various structure offsets to simplify cross-compilation.  */\n\n"
+
+"/* Offsets for AArch64 Linux \"ucontext_t\":  */\n\n");
+
+  UC ("FLAGS", uc_flags);
+  UC ("LINK", uc_link);
+  UC ("STACK", uc_stack);
+  UC ("MCONTEXT", uc_mcontext);
+  UC ("SIGMASK", uc_sigmask);
+
+  printf ("\n/* Offsets for AArch64 Linux \"struct sigcontext\":  */\n\n");
+
+  SC ("R0",  regs[0]);
+  SC ("R1",  regs[1]);
+  SC ("R2",  regs[2]);
+  SC ("R3",  regs[3]);
+  SC ("R4",  regs[4]);
+  SC ("R5",  regs[5]);
+  SC ("R6",  regs[6]);
+  SC ("R7",  regs[7]);
+  SC ("R8",  regs[8]);
+  SC ("R9",  regs[9]);
+  SC ("R10", regs[10]);
+  SC ("R11", regs[11]);
+  SC ("R12", regs[12]);
+  SC ("R13", regs[13]);
+  SC ("R14", regs[14]);
+  SC ("R15", regs[15]);
+  SC ("R16", regs[16]);
+  SC ("R17", regs[17]);
+  SC ("R18", regs[18]);
+  SC ("R19", regs[19]);
+  SC ("R20", regs[20]);
+  SC ("R21", regs[21]);
+  SC ("R22", regs[22]);
+  SC ("R23", regs[23]);
+  SC ("R24", regs[24]);
+  SC ("R25", regs[25]);
+  SC ("R26", regs[26]);
+  SC ("R27", regs[27]);
+  SC ("R28", regs[28]);
+  SC ("R29", regs[29]);
+  SC ("R30", regs[30]);
+  SC ("R31", regs[31]);
+
+  SC ("PC", pc);
+  SC ("SP", sp);
+  SC ("Fault", fault_address);
+  SC ("state", pstate);
+  return 0;
+}
diff --git a/frysk-imports/libunwind/src/aarch64/getcontext.S b/frysk-imports/libunwind/src/aarch64/getcontext.S
new file mode 100644
index 0000000..25ed5b6
--- /dev/null
+++ b/frysk-imports/libunwind/src/aarch64/getcontext.S
@@ -0,0 +1,52 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 Google, Inc
+	Contributed by Paul Pluzhnikov <ppluzhnikov@google.com>
+   Copyright (C) 2010 Konstantin Belousov <kib@freebsd.org>
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "offsets.h"
+
+/*  int _Uaarch64_getcontext_trace (unw_tdep_context_t *ucp)
+
+  Saves limited machine context in UCP necessary for fast trace. If fast trace
+  fails, caller will have to get the full context.
+*/
+
+	.global _Uaarch64_getcontext_trace
+	.hidden _Uaarch64_getcontext_trace
+	.type _Uaarch64_getcontext_trace, @function
+_Uaarch64_getcontext_trace:
+	.cfi_startproc
+
+	/* Save only FP, SP, PC - exclude this call. */
+	str x29, [x0, #(LINUX_UC_MCONTEXT_OFF + LINUX_SC_X29_OFF)]
+	mov x9, sp
+	str x9, [x0, #(LINUX_UC_MCONTEXT_OFF + LINUX_SC_SP_OFF)]
+	str x30, [x0, #(LINUX_UC_MCONTEXT_OFF + LINUX_SC_PC_OFF)]
+
+	ret
+	.cfi_endproc
+	.size _Uaarch64_getcontext_trace, . - _Uaarch64_getcontext_trace
+
+      /* We do not need executable stack.  */
+      .section        .note.GNU-stack,"",@progbits
diff --git a/frysk-imports/libunwind/src/aarch64/init.h b/frysk-imports/libunwind/src/aarch64/init.h
new file mode 100644
index 0000000..0cedc1a
--- /dev/null
+++ b/frysk-imports/libunwind/src/aarch64/init.h
@@ -0,0 +1,127 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com>
+   Copyright (C) 2013 Linaro Limited
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "unwind_i.h"
+
+static inline int
+common_init (struct cursor *c, unsigned use_prev_instr)
+{
+  int ret, i;
+
+  c->dwarf.loc[UNW_AARCH64_X0]  = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_X0);
+  c->dwarf.loc[UNW_AARCH64_X1]  = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_X1);
+  c->dwarf.loc[UNW_AARCH64_X2]  = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_X2);
+  c->dwarf.loc[UNW_AARCH64_X3]  = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_X3);
+  c->dwarf.loc[UNW_AARCH64_X4]  = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_X4);
+  c->dwarf.loc[UNW_AARCH64_X5]  = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_X5);
+  c->dwarf.loc[UNW_AARCH64_X6]  = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_X6);
+  c->dwarf.loc[UNW_AARCH64_X7]  = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_X7);
+  c->dwarf.loc[UNW_AARCH64_X8]  = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_X8);
+  c->dwarf.loc[UNW_AARCH64_X9]  = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_X9);
+  c->dwarf.loc[UNW_AARCH64_X10] = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_X10);
+  c->dwarf.loc[UNW_AARCH64_X11] = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_X11);
+  c->dwarf.loc[UNW_AARCH64_X12] = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_X12);
+  c->dwarf.loc[UNW_AARCH64_X13] = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_X13);
+  c->dwarf.loc[UNW_AARCH64_X14] = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_X14);
+  c->dwarf.loc[UNW_AARCH64_X15] = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_X15);
+  c->dwarf.loc[UNW_AARCH64_X16] = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_X16);
+  c->dwarf.loc[UNW_AARCH64_X17] = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_X17);
+  c->dwarf.loc[UNW_AARCH64_X18] = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_X18);
+  c->dwarf.loc[UNW_AARCH64_X19] = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_X19);
+  c->dwarf.loc[UNW_AARCH64_X20] = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_X20);
+  c->dwarf.loc[UNW_AARCH64_X21] = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_X21);
+  c->dwarf.loc[UNW_AARCH64_X22] = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_X22);
+  c->dwarf.loc[UNW_AARCH64_X23] = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_X23);
+  c->dwarf.loc[UNW_AARCH64_X24] = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_X24);
+  c->dwarf.loc[UNW_AARCH64_X25] = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_X25);
+  c->dwarf.loc[UNW_AARCH64_X26] = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_X26);
+  c->dwarf.loc[UNW_AARCH64_X27] = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_X27);
+  c->dwarf.loc[UNW_AARCH64_X28] = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_X28);
+  c->dwarf.loc[UNW_AARCH64_X29] = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_X29);
+  c->dwarf.loc[UNW_AARCH64_X30] = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_X30);
+  c->dwarf.loc[UNW_AARCH64_SP]  = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_SP);
+  c->dwarf.loc[UNW_AARCH64_PC]  = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_PC);
+  c->dwarf.loc[UNW_AARCH64_PSTATE] = DWARF_REG_LOC (&c->dwarf,
+                                                    UNW_AARCH64_PSTATE);
+  c->dwarf.loc[UNW_AARCH64_V0]  = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_V0);
+  c->dwarf.loc[UNW_AARCH64_V1]  = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_V1);
+  c->dwarf.loc[UNW_AARCH64_V2]  = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_V2);
+  c->dwarf.loc[UNW_AARCH64_V3]  = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_V3);
+  c->dwarf.loc[UNW_AARCH64_V4]  = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_V4);
+  c->dwarf.loc[UNW_AARCH64_V5]  = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_V5);
+  c->dwarf.loc[UNW_AARCH64_V6]  = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_V6);
+  c->dwarf.loc[UNW_AARCH64_V7]  = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_V7);
+  c->dwarf.loc[UNW_AARCH64_V8]  = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_V8);
+  c->dwarf.loc[UNW_AARCH64_V9]  = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_V9);
+  c->dwarf.loc[UNW_AARCH64_V10] = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_V10);
+  c->dwarf.loc[UNW_AARCH64_V11] = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_V11);
+  c->dwarf.loc[UNW_AARCH64_V12] = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_V12);
+  c->dwarf.loc[UNW_AARCH64_V13] = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_V13);
+  c->dwarf.loc[UNW_AARCH64_V14] = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_V14);
+  c->dwarf.loc[UNW_AARCH64_V15] = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_V15);
+  c->dwarf.loc[UNW_AARCH64_V16] = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_V16);
+  c->dwarf.loc[UNW_AARCH64_V17] = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_V17);
+  c->dwarf.loc[UNW_AARCH64_V18] = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_V18);
+  c->dwarf.loc[UNW_AARCH64_V19] = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_V19);
+  c->dwarf.loc[UNW_AARCH64_V20] = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_V20);
+  c->dwarf.loc[UNW_AARCH64_V21] = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_V21);
+  c->dwarf.loc[UNW_AARCH64_V22] = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_V22);
+  c->dwarf.loc[UNW_AARCH64_V23] = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_V23);
+  c->dwarf.loc[UNW_AARCH64_V24] = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_V24);
+  c->dwarf.loc[UNW_AARCH64_V25] = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_V25);
+  c->dwarf.loc[UNW_AARCH64_V26] = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_V26);
+  c->dwarf.loc[UNW_AARCH64_V27] = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_V27);
+  c->dwarf.loc[UNW_AARCH64_V28] = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_V28);
+  c->dwarf.loc[UNW_AARCH64_V29] = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_V29);
+  c->dwarf.loc[UNW_AARCH64_V30] = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_V30);
+  c->dwarf.loc[UNW_AARCH64_V31] = DWARF_REG_LOC (&c->dwarf, UNW_AARCH64_V31);
+
+  for (i = UNW_AARCH64_PSTATE + 1; i < UNW_AARCH64_V0; ++i)
+    c->dwarf.loc[i] = DWARF_NULL_LOC;
+
+  ret = dwarf_get (&c->dwarf, c->dwarf.loc[UNW_AARCH64_PC], &c->dwarf.ip);
+  if (ret < 0)
+    return ret;
+
+  ret = dwarf_get (&c->dwarf, c->dwarf.loc[UNW_AARCH64_SP], &c->dwarf.cfa);
+  if (ret < 0)
+    return ret;
+
+  c->sigcontext_format = AARCH64_SCF_NONE;
+  c->sigcontext_addr = 0;
+  c->sigcontext_sp = 0;
+  c->sigcontext_pc = 0;
+
+  c->dwarf.args_size = 0;
+  c->dwarf.ret_addr_column = 0;
+  c->dwarf.stash_frames = 0;
+  c->dwarf.use_prev_instr = use_prev_instr;
+  c->dwarf.pi_valid = 0;
+  c->dwarf.pi_is_dynamic = 0;
+  c->dwarf.hint = 0;
+  c->dwarf.prev_rs = 0;
+
+  return 0;
+}
diff --git a/frysk-imports/libunwind/src/aarch64/is_fpreg.c b/frysk-imports/libunwind/src/aarch64/is_fpreg.c
new file mode 100644
index 0000000..7c32693
--- /dev/null
+++ b/frysk-imports/libunwind/src/aarch64/is_fpreg.c
@@ -0,0 +1,32 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+   Copyright (C) 2013 Linaro Limited
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "libunwind_i.h"
+
+PROTECTED int
+unw_is_fpreg (int regnum)
+{
+  return (regnum >= UNW_AARCH64_V0 && regnum <= UNW_AARCH64_V31);
+}
diff --git a/frysk-imports/libunwind/src/aarch64/offsets.h b/frysk-imports/libunwind/src/aarch64/offsets.h
new file mode 100644
index 0000000..e78251d
--- /dev/null
+++ b/frysk-imports/libunwind/src/aarch64/offsets.h
@@ -0,0 +1,49 @@
+/* Linux-specific definitions: */
+
+/* Define various structure offsets to simplify cross-compilation.  */
+
+/* Offsets for AArch64 Linux "ucontext_t":  */
+
+#define LINUX_UC_FLAGS_OFF      0x0
+#define LINUX_UC_LINK_OFF       0x8
+#define LINUX_UC_STACK_OFF      0x10
+#define LINUX_UC_SIGMASK_OFF    0x28
+#define LINUX_UC_MCONTEXT_OFF   0xb0
+
+/* Offsets for AArch64 Linux "struct sigcontext":  */
+
+#define LINUX_SC_FAULTADDRESS_OFF       0x00
+#define LINUX_SC_X0_OFF         0x008
+#define LINUX_SC_X1_OFF         0x010
+#define LINUX_SC_X2_OFF         0x018
+#define LINUX_SC_X3_OFF         0x020
+#define LINUX_SC_X4_OFF         0x028
+#define LINUX_SC_X5_OFF         0x030
+#define LINUX_SC_X6_OFF         0x038
+#define LINUX_SC_X7_OFF         0x040
+#define LINUX_SC_X8_OFF         0x048
+#define LINUX_SC_X9_OFF         0x050
+#define LINUX_SC_X10_OFF        0x058
+#define LINUX_SC_X11_OFF        0x060
+#define LINUX_SC_X12_OFF        0x068
+#define LINUX_SC_X13_OFF        0x070
+#define LINUX_SC_X14_OFF        0x078
+#define LINUX_SC_X15_OFF        0x080
+#define LINUX_SC_X16_OFF        0x088
+#define LINUX_SC_X17_OFF        0x090
+#define LINUX_SC_X18_OFF        0x098
+#define LINUX_SC_X19_OFF        0x0a0
+#define LINUX_SC_X20_OFF        0x0a8
+#define LINUX_SC_X21_OFF        0x0b0
+#define LINUX_SC_X22_OFF        0x0b8
+#define LINUX_SC_X23_OFF        0x0c0
+#define LINUX_SC_X24_OFF        0x0c8
+#define LINUX_SC_X25_OFF        0x0d0
+#define LINUX_SC_X26_OFF        0x0d8
+#define LINUX_SC_X27_OFF        0x0e0
+#define LINUX_SC_X28_OFF        0x0e8
+#define LINUX_SC_X29_OFF        0x0f0
+#define LINUX_SC_X30_OFF        0x0f8
+#define LINUX_SC_SP_OFF         0x100
+#define LINUX_SC_PC_OFF         0x108
+#define LINUX_SC_PSTATE_OFF     0x110
diff --git a/frysk-imports/libunwind/src/aarch64/regname.c b/frysk-imports/libunwind/src/aarch64/regname.c
new file mode 100644
index 0000000..8c97342
--- /dev/null
+++ b/frysk-imports/libunwind/src/aarch64/regname.c
@@ -0,0 +1,106 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com>
+   Copyright (C) 2013 Linaro Limited
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "unwind_i.h"
+
+static const char *const regname[] =
+  {
+    [UNW_AARCH64_X0] = "x0",
+    [UNW_AARCH64_X1] = "x1",
+    [UNW_AARCH64_X2] = "x2",
+    [UNW_AARCH64_X3] = "x3",
+    [UNW_AARCH64_X4] = "x4",
+    [UNW_AARCH64_X5] = "x5",
+    [UNW_AARCH64_X6] = "x6",
+    [UNW_AARCH64_X7] = "x7",
+    [UNW_AARCH64_X8] = "x8",
+    [UNW_AARCH64_X9] = "x9",
+    [UNW_AARCH64_X10] = "x10",
+    [UNW_AARCH64_X11] = "x11",
+    [UNW_AARCH64_X12] = "x12",
+    [UNW_AARCH64_X13] = "x13",
+    [UNW_AARCH64_X14] = "x14",
+    [UNW_AARCH64_X15] = "x15",
+    [UNW_AARCH64_X16] = "ip0",
+    [UNW_AARCH64_X17] = "ip1",
+    [UNW_AARCH64_X18] = "x18",
+    [UNW_AARCH64_X19] = "x19",
+    [UNW_AARCH64_X20] = "x20",
+    [UNW_AARCH64_X21] = "x21",
+    [UNW_AARCH64_X22] = "x22",
+    [UNW_AARCH64_X23] = "x23",
+    [UNW_AARCH64_X24] = "x24",
+    [UNW_AARCH64_X25] = "x25",
+    [UNW_AARCH64_X26] = "x26",
+    [UNW_AARCH64_X27] = "x27",
+    [UNW_AARCH64_X28] = "x28",
+    [UNW_AARCH64_X29] = "fp",
+    [UNW_AARCH64_X30] = "lr",
+    [UNW_AARCH64_SP] = "sp",
+    [UNW_AARCH64_PC] = "pc",
+    [UNW_AARCH64_V0] = "v0",
+    [UNW_AARCH64_V1] = "v1",
+    [UNW_AARCH64_V2] = "v2",
+    [UNW_AARCH64_V3] = "v3",
+    [UNW_AARCH64_V4] = "v4",
+    [UNW_AARCH64_V5] = "v5",
+    [UNW_AARCH64_V6] = "v6",
+    [UNW_AARCH64_V7] = "v7",
+    [UNW_AARCH64_V8] = "v8",
+    [UNW_AARCH64_V9] = "v9",
+    [UNW_AARCH64_V10] = "v10",
+    [UNW_AARCH64_V11] = "v11",
+    [UNW_AARCH64_V12] = "v12",
+    [UNW_AARCH64_V13] = "v13",
+    [UNW_AARCH64_V14] = "v14",
+    [UNW_AARCH64_V15] = "v15",
+    [UNW_AARCH64_V16] = "v16",
+    [UNW_AARCH64_V17] = "v17",
+    [UNW_AARCH64_V18] = "v18",
+    [UNW_AARCH64_V19] = "v19",
+    [UNW_AARCH64_V20] = "v20",
+    [UNW_AARCH64_V21] = "v21",
+    [UNW_AARCH64_V22] = "v22",
+    [UNW_AARCH64_V23] = "v23",
+    [UNW_AARCH64_V24] = "v24",
+    [UNW_AARCH64_V25] = "v25",
+    [UNW_AARCH64_V26] = "v26",
+    [UNW_AARCH64_V27] = "v27",
+    [UNW_AARCH64_V28] = "v28",
+    [UNW_AARCH64_V29] = "v29",
+    [UNW_AARCH64_V30] = "v30",
+    [UNW_AARCH64_V31] = "v31",
+    [UNW_AARCH64_FPSR] = "fpsr",
+    [UNW_AARCH64_FPCR] = "fpcr",
+  };
+
+PROTECTED const char *
+unw_regname (unw_regnum_t reg)
+{
+  if (reg < (unw_regnum_t) ARRAY_SIZE (regname) && regname[reg] != NULL)
+    return regname[reg];
+  else
+    return "???";
+}
diff --git a/frysk-imports/libunwind/src/aarch64/siglongjmp.S b/frysk-imports/libunwind/src/aarch64/siglongjmp.S
new file mode 100644
index 0000000..9985c4b
--- /dev/null
+++ b/frysk-imports/libunwind/src/aarch64/siglongjmp.S
@@ -0,0 +1,12 @@
+	/* Dummy implementation for now.  */
+
+	.global _UI_siglongjmp_cont
+	.global _UI_longjmp_cont
+
+_UI_siglongjmp_cont:
+_UI_longjmp_cont:
+	ret
+#ifdef __linux__
+ /* We do not need executable stack.  */
+ .section  .note.GNU-stack,"",%progbits
+#endif
diff --git a/frysk-imports/libunwind/src/aarch64/unwind_i.h b/frysk-imports/libunwind/src/aarch64/unwind_i.h
new file mode 100644
index 0000000..79b342c
--- /dev/null
+++ b/frysk-imports/libunwind/src/aarch64/unwind_i.h
@@ -0,0 +1,62 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+   Copyright (C) 2013 Linaro Limited
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#ifndef unwind_i_h
+#define unwind_i_h
+
+#include <stdint.h>
+
+#include <libunwind-aarch64.h>
+
+#include "libunwind_i.h"
+
+/* DWARF column numbers for AArch64: */
+#define X29     29
+#define FP      29
+#define X30     30
+#define LR      30
+#define SP      31
+
+#define aarch64_lock                    UNW_OBJ(lock)
+#define aarch64_local_resume            UNW_OBJ(local_resume)
+#define aarch64_local_addr_space_init   UNW_OBJ(local_addr_space_init)
+
+extern void aarch64_local_addr_space_init (void);
+extern int aarch64_local_resume (unw_addr_space_t as, unw_cursor_t *cursor,
+                             void *arg);
+
+/* By-pass calls to access_mem() when known to be safe. */
+#ifdef UNW_LOCAL_ONLY
+# undef ACCESS_MEM_FAST
+# define ACCESS_MEM_FAST(ret,validate,cur,addr,to)                     \
+  do {                                                                 \
+    if (unlikely(validate))                                            \
+      (ret) = dwarf_get ((cur), DWARF_MEM_LOC ((cur), (addr)), &(to)); \
+    else                                                               \
+      (ret) = 0, (to) = *(unw_word_t *)(addr);                         \
+  } while (0)
+#endif
+
+#endif /* unwind_i_h */
diff --git a/frysk-imports/libunwind/src/arm/Gcreate_addr_space.c b/frysk-imports/libunwind/src/arm/Gcreate_addr_space.c
index c3e1360..4d59a20 100644
--- a/frysk-imports/libunwind/src/arm/Gcreate_addr_space.c
+++ b/frysk-imports/libunwind/src/arm/Gcreate_addr_space.c
@@ -32,8 +32,16 @@ unw_create_addr_space (unw_accessors_t *a, int byte_order)
 #ifdef UNW_LOCAL_ONLY
   return NULL;
 #else
-  unw_addr_space_t as = malloc (sizeof (*as));
+  unw_addr_space_t as;
 
+  /*
+   * ARM supports little-endian and big-endian.
+   */
+  if (byte_order != 0 && byte_order != __LITTLE_ENDIAN
+      && byte_order != __BIG_ENDIAN)
+    return NULL;
+
+  as = malloc (sizeof (*as));
   if (!as)
     return NULL;
 
@@ -41,13 +49,6 @@ unw_create_addr_space (unw_accessors_t *a, int byte_order)
 
   as->acc = *a;
 
-  /*
-   * ARM supports little-endian and big-endian.
-   */
-  if (byte_order != 0 && byte_order != __LITTLE_ENDIAN
-      && byte_order != __BIG_ENDIAN)
-    return NULL;
-  
   /* Default to little-endian for ARM.  */
   if (byte_order == 0 || byte_order == __LITTLE_ENDIAN)
     as->big_endian = 0;
diff --git a/frysk-imports/libunwind/src/arm/Gex_tables.c b/frysk-imports/libunwind/src/arm/Gex_tables.c
new file mode 100644
index 0000000..34706cf
--- /dev/null
+++ b/frysk-imports/libunwind/src/arm/Gex_tables.c
@@ -0,0 +1,569 @@
+/* libunwind - a platform-independent unwind library
+   Copyright 2011 Linaro Limited
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+/* This file contains functionality for parsing and interpreting the ARM
+specific unwind information.  Documentation about the exception handling
+ABI for the ARM architecture can be found at:
+http://infocenter.arm.com/help/topic/com.arm.doc.ihi0038a/IHI0038A_ehabi.pdf
+*/ 
+
+#include "libunwind_i.h"
+
+#define ARM_EXBUF_START(x)      (((x) >> 4) & 0x0f)
+#define ARM_EXBUF_COUNT(x)      ((x) & 0x0f)
+#define ARM_EXBUF_END(x)        (ARM_EXBUF_START(x) + ARM_EXBUF_COUNT(x))
+
+#define ARM_EXIDX_CANT_UNWIND   0x00000001
+#define ARM_EXIDX_COMPACT       0x80000000
+
+#define ARM_EXTBL_OP_FINISH     0xb0
+
+enum arm_exbuf_cmd_flags {
+  ARM_EXIDX_VFP_SHIFT_16 = 1 << 16,
+  ARM_EXIDX_VFP_DOUBLE = 1 << 17,
+};
+
+struct arm_cb_data
+  {
+    /* in: */
+    unw_word_t ip;             /* instruction-pointer we're looking for */
+    unw_proc_info_t *pi;       /* proc-info pointer */
+    /* out: */
+    unw_dyn_info_t di;         /* info about the ARM exidx segment */
+  };
+
+static inline uint32_t CONST_ATTR
+prel31_read (uint32_t prel31)
+{
+  return ((int32_t)prel31 << 1) >> 1;
+}
+
+static inline int
+prel31_to_addr (unw_addr_space_t as, void *arg, unw_word_t prel31,
+                unw_word_t *val)
+{
+  unw_word_t offset;
+
+  if ((*as->acc.access_mem)(as, prel31, &offset, 0, arg) < 0)
+    return -UNW_EINVAL;
+
+  offset = ((long)offset << 1) >> 1;
+  *val = prel31 + offset;
+
+  return 0;
+}
+
+/**
+ * Applies the given command onto the new state to the given dwarf_cursor.
+ */
+HIDDEN int
+arm_exidx_apply_cmd (struct arm_exbuf_data *edata, struct dwarf_cursor *c)
+{
+  int ret = 0;
+  unsigned i;
+
+  switch (edata->cmd)
+    {
+    case ARM_EXIDX_CMD_FINISH:
+      /* Set LR to PC if not set already.  */
+      if (DWARF_IS_NULL_LOC (c->loc[UNW_ARM_R15]))
+        c->loc[UNW_ARM_R15] = c->loc[UNW_ARM_R14];
+      /* Set IP.  */
+      dwarf_get (c, c->loc[UNW_ARM_R15], &c->ip);
+      break;
+    case ARM_EXIDX_CMD_DATA_PUSH:
+      Debug (2, "vsp = vsp - %d\n", edata->data);
+      c->cfa -= edata->data;
+      break;
+    case ARM_EXIDX_CMD_DATA_POP:
+      Debug (2, "vsp = vsp + %d\n", edata->data);
+      c->cfa += edata->data;
+      break;
+    case ARM_EXIDX_CMD_REG_POP:
+      for (i = 0; i < 16; i++)
+        if (edata->data & (1 << i))
+          {
+            Debug (2, "pop {r%d}\n", i);
+            c->loc[UNW_ARM_R0 + i] = DWARF_LOC (c->cfa, 0);
+            c->cfa += 4;
+          }
+      /* Set cfa in case the SP got popped. */
+      if (edata->data & (1 << 13))
+        dwarf_get (c, c->loc[UNW_ARM_R13], &c->cfa);
+      break;
+    case ARM_EXIDX_CMD_REG_TO_SP:
+      assert (edata->data < 16);
+      Debug (2, "vsp = r%d\n", edata->data);
+      c->loc[UNW_ARM_R13] = c->loc[UNW_ARM_R0 + edata->data];
+      dwarf_get (c, c->loc[UNW_ARM_R13], &c->cfa);
+      break;
+    case ARM_EXIDX_CMD_VFP_POP:
+      /* Skip VFP registers, but be sure to adjust stack */
+      for (i = ARM_EXBUF_START (edata->data); i <= ARM_EXBUF_END (edata->data);
+           i++)
+        c->cfa += 8;
+      if (!(edata->data & ARM_EXIDX_VFP_DOUBLE))
+        c->cfa += 4;
+      break;
+    case ARM_EXIDX_CMD_WREG_POP:
+      for (i = ARM_EXBUF_START (edata->data); i <= ARM_EXBUF_END (edata->data);
+           i++)
+        c->cfa += 8;
+      break;
+    case ARM_EXIDX_CMD_WCGR_POP:
+      for (i = 0; i < 4; i++)
+        if (edata->data & (1 << i))
+          c->cfa += 4;
+      break;
+    case ARM_EXIDX_CMD_REFUSED:
+    case ARM_EXIDX_CMD_RESERVED:
+      ret = -1;
+      break;
+    }
+  return ret;
+}
+
+/**
+ * Decodes the given unwind instructions into arm_exbuf_data and calls
+ * arm_exidx_apply_cmd that applies the command onto the dwarf_cursor.
+ */
+HIDDEN int
+arm_exidx_decode (const uint8_t *buf, uint8_t len, struct dwarf_cursor *c)
+{
+#define READ_OP() *buf++
+  const uint8_t *end = buf + len;
+  int ret;
+  struct arm_exbuf_data edata;
+
+  assert(buf != NULL);
+  assert(len > 0);
+
+  while (buf < end)
+    {
+      uint8_t op = READ_OP ();
+      if ((op & 0xc0) == 0x00)
+        {
+          edata.cmd = ARM_EXIDX_CMD_DATA_POP;
+          edata.data = (((int)op & 0x3f) << 2) + 4;
+        }
+      else if ((op & 0xc0) == 0x40)
+        {
+          edata.cmd = ARM_EXIDX_CMD_DATA_PUSH;
+          edata.data = (((int)op & 0x3f) << 2) + 4;
+        }
+      else if ((op & 0xf0) == 0x80)
+        {
+          uint8_t op2 = READ_OP ();
+          if (op == 0x80 && op2 == 0x00)
+            edata.cmd = ARM_EXIDX_CMD_REFUSED;
+          else
+            {
+              edata.cmd = ARM_EXIDX_CMD_REG_POP;
+              edata.data = ((op & 0xf) << 8) | op2;
+              edata.data = edata.data << 4;
+            }
+        }
+      else if ((op & 0xf0) == 0x90)
+        {
+          if (op == 0x9d || op == 0x9f)
+            edata.cmd = ARM_EXIDX_CMD_RESERVED;
+          else
+            {
+              edata.cmd = ARM_EXIDX_CMD_REG_TO_SP;
+              edata.data = op & 0x0f;
+            }
+        }
+      else if ((op & 0xf0) == 0xa0)
+        {
+          unsigned end = (op & 0x07);
+          edata.data = (1 << (end + 1)) - 1;
+          edata.data = edata.data << 4;
+          if (op & 0x08)
+            edata.data |= 1 << 14;
+          edata.cmd = ARM_EXIDX_CMD_REG_POP;
+        }
+      else if (op == ARM_EXTBL_OP_FINISH)
+        {
+          edata.cmd = ARM_EXIDX_CMD_FINISH;
+          buf = end;
+        }
+      else if (op == 0xb1)
+        {
+          uint8_t op2 = READ_OP ();
+          if (op2 == 0 || (op2 & 0xf0))
+            edata.cmd = ARM_EXIDX_CMD_RESERVED;
+          else
+            {
+              edata.cmd = ARM_EXIDX_CMD_REG_POP;
+              edata.data = op2 & 0x0f;
+            }
+        }
+      else if (op == 0xb2)
+        {
+          uint32_t offset = 0;
+          uint8_t byte, shift = 0;
+          do
+            {
+              byte = READ_OP ();
+              offset |= (byte & 0x7f) << shift;
+              shift += 7;
+            }
+          while (byte & 0x80);
+          edata.data = offset * 4 + 0x204;
+          edata.cmd = ARM_EXIDX_CMD_DATA_POP;
+        }
+      else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
+        {
+          edata.cmd = ARM_EXIDX_CMD_VFP_POP;
+          edata.data = READ_OP ();
+          if (op == 0xc8)
+            edata.data |= ARM_EXIDX_VFP_SHIFT_16;
+          if (op != 0xb3)
+            edata.data |= ARM_EXIDX_VFP_DOUBLE;
+        }
+      else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
+        {
+          edata.cmd = ARM_EXIDX_CMD_VFP_POP;
+          edata.data = 0x80 | (op & 0x07);
+          if ((op & 0xf8) == 0xd0)
+            edata.data |= ARM_EXIDX_VFP_DOUBLE;
+        }
+      else if (op >= 0xc0 && op <= 0xc5)
+        {
+          edata.cmd = ARM_EXIDX_CMD_WREG_POP;
+          edata.data = 0xa0 | (op & 0x07);
+        }
+      else if (op == 0xc6)
+        {
+          edata.cmd = ARM_EXIDX_CMD_WREG_POP;
+          edata.data = READ_OP ();
+        }
+      else if (op == 0xc7)
+        {
+          uint8_t op2 = READ_OP ();
+          if (op2 == 0 || (op2 & 0xf0))
+            edata.cmd = ARM_EXIDX_CMD_RESERVED;
+          else
+            {
+              edata.cmd = ARM_EXIDX_CMD_WCGR_POP;
+              edata.data = op2 & 0x0f;
+            }
+        }
+      else
+        edata.cmd = ARM_EXIDX_CMD_RESERVED;
+
+      ret = arm_exidx_apply_cmd (&edata, c);
+      if (ret < 0)
+        return ret;
+    }
+  return 0;
+}
+
+/**
+ * Reads the entry from the given cursor and extracts the unwind instructions
+ * into buf.  Returns the number of the extracted unwind insns or 
+ * -UNW_ESTOPUNWIND if the special bit pattern ARM_EXIDX_CANT_UNWIND (0x1) was
+ * found.
+ */
+HIDDEN int
+arm_exidx_extract (struct dwarf_cursor *c, uint8_t *buf)
+{
+  int nbuf = 0;
+  unw_word_t entry = (unw_word_t) c->pi.unwind_info;
+  unw_word_t addr;
+  uint32_t data;
+
+  /* An ARM unwind entry consists of a prel31 offset to the start of a
+     function followed by 31bits of data: 
+       * if set to 0x1: the function cannot be unwound (EXIDX_CANTUNWIND)
+       * if bit 31 is one: this is a table entry itself (ARM_EXIDX_COMPACT)
+       * if bit 31 is zero: this is a prel31 offset of the start of the
+         table entry for this function  */
+  if (prel31_to_addr(c->as, c->as_arg, entry, &addr) < 0)
+    return -UNW_EINVAL;
+
+  if ((*c->as->acc.access_mem)(c->as, entry + 4, &data, 0, c->as_arg) < 0)
+    return -UNW_EINVAL;
+
+  if (data == ARM_EXIDX_CANT_UNWIND)
+    {
+      Debug (2, "0x1 [can't unwind]\n");
+      nbuf = -UNW_ESTOPUNWIND;
+    }
+  else if (data & ARM_EXIDX_COMPACT)
+    {
+      Debug (2, "%p compact model %d [%8.8x]\n", (void *)addr,
+             (data >> 24) & 0x7f, data);
+      buf[nbuf++] = data >> 16;
+      buf[nbuf++] = data >> 8;
+      buf[nbuf++] = data;
+    }
+  else
+    {
+      unw_word_t extbl_data;
+      unsigned int n_table_words = 0;
+
+      if (prel31_to_addr(c->as, c->as_arg, entry + 4, &extbl_data) < 0)
+        return -UNW_EINVAL;
+
+      if ((*c->as->acc.access_mem)(c->as, extbl_data, &data, 0, c->as_arg) < 0)
+        return -UNW_EINVAL;
+
+      if (data & ARM_EXIDX_COMPACT)
+        {
+          int pers = (data >> 24) & 0x0f;
+          Debug (2, "%p compact model %d [%8.8x]\n", (void *)addr, pers, data);
+          if (pers == 1 || pers == 2)
+            {
+              n_table_words = (data >> 16) & 0xff;
+              extbl_data += 4;
+            }
+          else
+            buf[nbuf++] = data >> 16;
+          buf[nbuf++] = data >> 8;
+          buf[nbuf++] = data;
+        }
+      else
+        {
+          unw_word_t pers;
+          if (prel31_to_addr (c->as, c->as_arg, extbl_data, &pers) < 0)
+            return -UNW_EINVAL;
+          Debug (2, "%p Personality routine: %8p\n", (void *)addr,
+                 (void *)pers);
+          if ((*c->as->acc.access_mem)(c->as, extbl_data + 4, &data, 0,
+                                       c->as_arg) < 0)
+            return -UNW_EINVAL;
+          n_table_words = data >> 24;
+          buf[nbuf++] = data >> 16;
+          buf[nbuf++] = data >> 8;
+          buf[nbuf++] = data;
+          extbl_data += 8;
+        }
+      assert (n_table_words <= 5);
+      unsigned j;
+      for (j = 0; j < n_table_words; j++)
+        {
+          if ((*c->as->acc.access_mem)(c->as, extbl_data, &data, 0,
+                                       c->as_arg) < 0)
+            return -UNW_EINVAL;
+          extbl_data += 4;
+          buf[nbuf++] = data >> 24;
+          buf[nbuf++] = data >> 16;
+          buf[nbuf++] = data >> 8;
+          buf[nbuf++] = data >> 0;
+        }
+    }
+
+  if (nbuf > 0 && buf[nbuf - 1] != ARM_EXTBL_OP_FINISH)
+    buf[nbuf++] = ARM_EXTBL_OP_FINISH;
+
+  return nbuf;
+}
+
+PROTECTED int
+tdep_search_unwind_table (unw_addr_space_t as, unw_word_t ip,
+                             unw_dyn_info_t *di, unw_proc_info_t *pi,
+                             int need_unwind_info, void *arg)
+{
+  if (UNW_TRY_METHOD (UNW_ARM_METHOD_EXIDX)
+      && di->format == UNW_INFO_FORMAT_ARM_EXIDX)
+    {
+      /* The .ARM.exidx section contains a sorted list of key-value pairs -
+         the unwind entries.  The 'key' is a prel31 offset to the start of a
+         function.  We binary search this section in order to find the
+         appropriate unwind entry.  */
+      unw_word_t first = di->u.rti.table_data;
+      unw_word_t last = di->u.rti.table_data + di->u.rti.table_len - 8;
+      unw_word_t entry, val;
+
+      if (prel31_to_addr (as, arg, first, &val) < 0 || ip < val)
+        return -UNW_ENOINFO;
+
+      if (prel31_to_addr (as, arg, last, &val) < 0)
+        return -UNW_EINVAL;
+
+      if (ip >= val)
+        {
+          entry = last;
+
+          if (prel31_to_addr (as, arg, last, &pi->start_ip) < 0)
+            return -UNW_EINVAL;
+
+          pi->end_ip = di->end_ip -1;
+        }
+      else
+        {
+          while (first < last - 8)
+            {
+              entry = first + (((last - first) / 8 + 1) >> 1) * 8;
+
+              if (prel31_to_addr (as, arg, entry, &val) < 0)
+                return -UNW_EINVAL;
+
+              if (ip < val)
+                last = entry;
+              else
+                first = entry;
+            }
+
+          entry = first;
+
+          if (prel31_to_addr (as, arg, entry, &pi->start_ip) < 0)
+            return -UNW_EINVAL;
+
+          if (prel31_to_addr (as, arg, entry + 8, &pi->end_ip) < 0)
+            return -UNW_EINVAL;
+
+          pi->end_ip--;
+        }
+
+      if (need_unwind_info)
+        {
+          pi->unwind_info_size = 8;
+          pi->unwind_info = (void *) entry;
+          pi->format = UNW_INFO_FORMAT_ARM_EXIDX;
+        }
+      return 0;
+    }
+  else if (UNW_TRY_METHOD(UNW_ARM_METHOD_DWARF)
+           && di->format != UNW_INFO_FORMAT_ARM_EXIDX)
+    return dwarf_search_unwind_table (as, ip, di, pi, need_unwind_info, arg);
+
+  return -UNW_ENOINFO; 
+}
+
+#ifndef UNW_REMOTE_ONLY
+/**
+ * Callback to dl_iterate_phdr to find infos about the ARM exidx segment.
+ */
+static int
+arm_phdr_cb (struct dl_phdr_info *info, size_t size, void *data)
+{
+  struct arm_cb_data *cb_data = data;
+  const Elf_W(Phdr) *p_text = NULL;
+  const Elf_W(Phdr) *p_arm_exidx = NULL;
+  const Elf_W(Phdr) *phdr = info->dlpi_phdr;
+  long n;
+
+  for (n = info->dlpi_phnum; --n >= 0; phdr++)
+    {
+      switch (phdr->p_type)
+        {
+        case PT_LOAD:
+          if (cb_data->ip >= phdr->p_vaddr + info->dlpi_addr &&
+              cb_data->ip < phdr->p_vaddr + info->dlpi_addr + phdr->p_memsz)
+            p_text = phdr;
+          break;
+
+        case PT_ARM_EXIDX:
+          p_arm_exidx = phdr;
+          break;
+
+        default:
+          break;
+        }
+    }
+
+  if (p_text && p_arm_exidx)
+    {
+      cb_data->di.format = UNW_INFO_FORMAT_ARM_EXIDX;
+      cb_data->di.start_ip = p_text->p_vaddr + info->dlpi_addr;
+      cb_data->di.end_ip = cb_data->di.start_ip + p_text->p_memsz;
+      cb_data->di.u.rti.name_ptr = (unw_word_t) info->dlpi_name;
+      cb_data->di.u.rti.table_data = p_arm_exidx->p_vaddr + info->dlpi_addr;
+      cb_data->di.u.rti.table_len = p_arm_exidx->p_memsz;
+      return 1;
+    }
+
+  return 0;
+}
+
+HIDDEN int
+arm_find_proc_info (unw_addr_space_t as, unw_word_t ip,
+                    unw_proc_info_t *pi, int need_unwind_info, void *arg)
+{
+  int ret = -1;
+  intrmask_t saved_mask;
+
+  Debug (14, "looking for IP=0x%lx\n", (long) ip);
+
+  if (UNW_TRY_METHOD(UNW_ARM_METHOD_DWARF))
+    {
+      struct dwarf_callback_data cb_data;
+
+      memset (&cb_data, 0, sizeof (cb_data));
+      cb_data.ip = ip;
+      cb_data.pi = pi;
+      cb_data.need_unwind_info = need_unwind_info;
+      cb_data.di.format = -1;
+      cb_data.di_debug.format = -1;
+
+      SIGPROCMASK (SIG_SETMASK, &unwi_full_mask, &saved_mask);
+      ret = dl_iterate_phdr (dwarf_callback, &cb_data);
+      SIGPROCMASK (SIG_SETMASK, &saved_mask, NULL);
+
+      if (cb_data.single_fde)
+        /* already got the result in *pi */
+        return 0;
+
+      if (cb_data.di_debug.format != -1)
+        ret = tdep_search_unwind_table (as, ip, &cb_data.di_debug, pi,
+                                        need_unwind_info, arg);
+      else
+        ret = -UNW_ENOINFO;
+    }
+
+  if (ret < 0 && UNW_TRY_METHOD (UNW_ARM_METHOD_EXIDX))
+    {
+      struct arm_cb_data cb_data;
+
+      memset (&cb_data, 0, sizeof (cb_data));
+      cb_data.ip = ip;
+      cb_data.pi = pi;
+      cb_data.di.format = -1;
+
+      SIGPROCMASK (SIG_SETMASK, &unwi_full_mask, &saved_mask);
+      ret = dl_iterate_phdr (arm_phdr_cb, &cb_data);
+      SIGPROCMASK (SIG_SETMASK, &saved_mask, NULL);
+
+      if (cb_data.di.format != -1)
+        ret = tdep_search_unwind_table (as, ip, &cb_data.di, pi,
+                                        need_unwind_info, arg);
+      else
+        ret = -UNW_ENOINFO;
+    }
+
+  if (ret < 0)
+    Debug (14, "IP=0x%lx not found\n", (long) ip);
+
+  return ret;
+}
+
+HIDDEN void
+arm_put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
+{
+  /* it's a no-op */
+}
+#endif /* !UNW_REMOTE_ONLY */
+
diff --git a/frysk-imports/libunwind/src/arm/Gget_save_loc.c b/frysk-imports/libunwind/src/arm/Gget_save_loc.c
index ba7bf17..63b711d 100644
--- a/frysk-imports/libunwind/src/arm/Gget_save_loc.c
+++ b/frysk-imports/libunwind/src/arm/Gget_save_loc.c
@@ -30,7 +30,7 @@ unw_get_save_loc (unw_cursor_t *cursor, int reg, unw_save_loc_t *sloc)
   struct cursor *c = (struct cursor *) cursor;
   dwarf_loc_t loc;
 
-  loc = DWARF_NULL_LOC;		/* default to "not saved" */
+  loc = DWARF_NULL_LOC;         /* default to "not saved" */
 
   switch (reg)
     {
@@ -57,7 +57,7 @@ unw_get_save_loc (unw_cursor_t *cursor, int reg, unw_save_loc_t *sloc)
       break;
     }
 
-  memset (sloc, 0, sizeof (sloc));
+  memset (sloc, 0, sizeof (*sloc));
 
   if (DWARF_IS_NULL_LOC (loc))
     {
diff --git a/frysk-imports/libunwind/src/arm/Gglobal.c b/frysk-imports/libunwind/src/arm/Gglobal.c
index 4037432..7b93fbd 100644
--- a/frysk-imports/libunwind/src/arm/Gglobal.c
+++ b/frysk-imports/libunwind/src/arm/Gglobal.c
@@ -22,20 +22,14 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
-#include <ucontext.h>
 #include "unwind_i.h"
 #include "dwarf_i.h"
 
-HIDDEN pthread_mutex_t arm_lock = PTHREAD_MUTEX_INITIALIZER;
-HIDDEN int tdep_needs_initialization = 1;
+HIDDEN define_lock (arm_lock);
+HIDDEN int tdep_init_done;
 
-/* FIXME: I'm pretty sure we don't need this at all for ARM, but "generic"
-   code (include/dwarf_i.h) seems to expect it to be here at present.  */
-
-HIDDEN uint8_t dwarf_to_unw_regnum_map[16] =
-  {
-    R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R15
-  };
+/* Unwinding methods to use. See UNW_METHOD_ enums */
+HIDDEN int unwi_unwind_method = UNW_ARM_METHOD_ALL;
 
 HIDDEN void
 tdep_init (void)
@@ -44,13 +38,19 @@ tdep_init (void)
 
   sigfillset (&unwi_full_mask);
 
-  sigprocmask (SIG_SETMASK, &unwi_full_mask, &saved_mask);
-  mutex_lock (&arm_lock);
+  lock_acquire (&arm_lock, saved_mask);
   {
-    if (!tdep_needs_initialization)
+    if (tdep_init_done)
       /* another thread else beat us to it... */
       goto out;
 
+    /* read ARM unwind method setting */
+    const char* str = getenv ("UNW_ARM_UNWIND_METHOD");
+    if (str)
+      {
+        unwi_unwind_method = atoi (str);
+      }
+
     mi_init ();
 
     dwarf_init ();
@@ -58,9 +58,8 @@ tdep_init (void)
 #ifndef UNW_REMOTE_ONLY
     arm_local_addr_space_init ();
 #endif
-    tdep_needs_initialization = 0;	/* signal that we're initialized... */
+    tdep_init_done = 1; /* signal that we're initialized... */
   }
  out:
-  mutex_unlock (&arm_lock);
-  sigprocmask (SIG_SETMASK, &saved_mask, NULL);
+  lock_release (&arm_lock, saved_mask);
 }
diff --git a/frysk-imports/libunwind/src/arm/Ginit.c b/frysk-imports/libunwind/src/arm/Ginit.c
index c45a8ef..1ed3dbf 100644
--- a/frysk-imports/libunwind/src/arm/Ginit.c
+++ b/frysk-imports/libunwind/src/arm/Ginit.c
@@ -39,39 +39,18 @@ static struct unw_addr_space local_addr_space;
 PROTECTED unw_addr_space_t unw_local_addr_space = &local_addr_space;
 
 static inline void *
-uc_addr (ucontext_t *uc, int reg)
+uc_addr (unw_tdep_context_t *uc, int reg)
 {
-  void *addr;
-
-  switch (reg)
-    {
-    case UNW_ARM_R0:  addr = &uc->uc_mcontext.arm_r0; break;
-    case UNW_ARM_R1:  addr = &uc->uc_mcontext.arm_r1; break;
-    case UNW_ARM_R2:  addr = &uc->uc_mcontext.arm_r2; break;
-    case UNW_ARM_R3:  addr = &uc->uc_mcontext.arm_r3; break;
-    case UNW_ARM_R4:  addr = &uc->uc_mcontext.arm_r4; break;
-    case UNW_ARM_R5:  addr = &uc->uc_mcontext.arm_r5; break;
-    case UNW_ARM_R6:  addr = &uc->uc_mcontext.arm_r6; break;
-    case UNW_ARM_R7:  addr = &uc->uc_mcontext.arm_r7; break;
-    case UNW_ARM_R8:  addr = &uc->uc_mcontext.arm_r8; break;
-    case UNW_ARM_R9:  addr = &uc->uc_mcontext.arm_r9; break;
-    case UNW_ARM_R10: addr = &uc->uc_mcontext.arm_r10; break;
-    case UNW_ARM_R11: addr = &uc->uc_mcontext.arm_fp; break;
-    case UNW_ARM_R12: addr = &uc->uc_mcontext.arm_ip; break;
-    case UNW_ARM_R13: addr = &uc->uc_mcontext.arm_sp; break;
-    case UNW_ARM_R14: addr = &uc->uc_mcontext.arm_lr; break;
-    case UNW_ARM_R15: addr = &uc->uc_mcontext.arm_pc; break;
-
-    default:
-      addr = NULL;
-    }
-  return addr;
+  if (reg >= UNW_ARM_R0 && reg < UNW_ARM_R0 + 16)
+    return &uc->regs[reg - UNW_ARM_R0];
+  else
+    return NULL;
 }
 
 # ifdef UNW_LOCAL_ONLY
 
 HIDDEN void *
-tdep_uc_addr (ucontext_t *uc, int reg)
+tdep_uc_addr (unw_tdep_context_t *uc, int reg)
 {
   return uc_addr (uc, reg);
 }
@@ -85,23 +64,67 @@ HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
        unwind-table entry.  Perhaps something similar can be done with
        DWARF2 unwind info.  */
 
-static void
-put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
+static int
+get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
+                        void *arg)
 {
-  /* it's a no-op */
+  *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
+  return 0;
 }
 
+#define PAGE_SIZE 4096
+#define PAGE_START(a)	((a) & ~(PAGE_SIZE-1))
+
+/* Cache of already validated addresses */
+#define NLGA 4
+static unw_word_t last_good_addr[NLGA];
+static int lga_victim;
+
 static int
-get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
-			void *arg)
+validate_mem (unw_word_t addr)
 {
-  *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
+  int i, victim;
+  size_t len;
+
+  if (PAGE_START(addr + sizeof (unw_word_t) - 1) == PAGE_START(addr))
+    len = PAGE_SIZE;
+  else
+    len = PAGE_SIZE * 2;
+
+  addr = PAGE_START(addr);
+
+  if (addr == 0)
+    return -1;
+
+  for (i = 0; i < NLGA; i++)
+    {
+      if (last_good_addr[i] && (addr == last_good_addr[i]))
+      return 0;
+    }
+
+  if (msync ((void *) addr, len, MS_ASYNC) == -1)
+    return -1;
+
+  victim = lga_victim;
+  for (i = 0; i < NLGA; i++) {
+    if (!last_good_addr[victim]) {
+      last_good_addr[victim++] = addr;
+      return 0;
+    }
+    victim = (victim + 1) % NLGA;
+  }
+
+  /* All slots full. Evict the victim. */
+  last_good_addr[victim] = addr;
+  victim = (victim + 1) % NLGA;
+  lga_victim = victim;
+
   return 0;
 }
 
 static int
 access_mem (unw_addr_space_t as, unw_word_t addr, unw_word_t *val, int write,
-	    void *arg)
+            void *arg)
 {
   if (write)
     {
@@ -110,6 +133,11 @@ access_mem (unw_addr_space_t as, unw_word_t addr, unw_word_t *val, int write,
     }
   else
     {
+      /* validate address */
+      const struct cursor *c = (const struct cursor *) arg;
+      if (c && validate_mem(addr))
+        return -1;
+
       *val = *(unw_word_t *) addr;
       Debug (16, "mem[%x] -> %x\n", addr, *val);
     }
@@ -118,10 +146,10 @@ access_mem (unw_addr_space_t as, unw_word_t addr, unw_word_t *val, int write,
 
 static int
 access_reg (unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val, int write,
-	    void *arg)
+            void *arg)
 {
   unw_word_t *addr;
-  ucontext_t *uc = arg;
+  unw_tdep_context_t *uc = arg;
 
   if (unw_is_fpreg (reg))
     goto badreg;
@@ -149,9 +177,9 @@ Debug (16, "reg = %s\n", unw_regname (reg));
 
 static int
 access_fpreg (unw_addr_space_t as, unw_regnum_t reg, unw_fpreg_t *val,
-	      int write, void *arg)
+              int write, void *arg)
 {
-  ucontext_t *uc = arg;
+  unw_tdep_context_t *uc = arg;
   unw_fpreg_t *addr;
 
   if (!unw_is_fpreg (reg))
@@ -163,14 +191,14 @@ access_fpreg (unw_addr_space_t as, unw_regnum_t reg, unw_fpreg_t *val,
   if (write)
     {
       Debug (12, "%s <- %08lx.%08lx.%08lx\n", unw_regname (reg),
-	     ((long *)val)[0], ((long *)val)[1], ((long *)val)[2]);
+             ((long *)val)[0], ((long *)val)[1], ((long *)val)[2]);
       *(unw_fpreg_t *) addr = *val;
     }
   else
     {
       *val = *(unw_fpreg_t *) addr;
       Debug (12, "%s -> %08lx.%08lx.%08lx\n", unw_regname (reg),
-	     ((long *)val)[0], ((long *)val)[1], ((long *)val)[2]);
+             ((long *)val)[0], ((long *)val)[1], ((long *)val)[2]);
     }
   return 0;
 
@@ -182,8 +210,8 @@ access_fpreg (unw_addr_space_t as, unw_regnum_t reg, unw_fpreg_t *val,
 
 static int
 get_static_proc_name (unw_addr_space_t as, unw_word_t ip,
-		      char *buf, size_t buf_len, unw_word_t *offp,
-		      void *arg)
+                      char *buf, size_t buf_len, unw_word_t *offp,
+                      void *arg)
 {
   return _Uelf32_get_proc_name (as, getpid (), ip, buf, buf_len, offp);
 }
@@ -193,13 +221,13 @@ arm_local_addr_space_init (void)
 {
   memset (&local_addr_space, 0, sizeof (local_addr_space));
   local_addr_space.caching_policy = UNW_CACHE_GLOBAL;
-  local_addr_space.acc.find_proc_info = dwarf_find_proc_info;
-  local_addr_space.acc.put_unwind_info = put_unwind_info;
+  local_addr_space.acc.find_proc_info = arm_find_proc_info;
+  local_addr_space.acc.put_unwind_info = arm_put_unwind_info;
   local_addr_space.acc.get_dyn_info_list_addr = get_dyn_info_list_addr;
   local_addr_space.acc.access_mem = access_mem;
   local_addr_space.acc.access_reg = access_reg;
   local_addr_space.acc.access_fpreg = access_fpreg;
-  local_addr_space.acc.resume = 0;  /* arm_local_resume?  FIXME!  */
+  local_addr_space.acc.resume = arm_local_resume;
   local_addr_space.acc.get_proc_name = get_static_proc_name;
   unw_flush_cache (&local_addr_space, 0, 0);
 }
diff --git a/frysk-imports/libunwind/src/arm/Ginit_local.c b/frysk-imports/libunwind/src/arm/Ginit_local.c
index 7b2881e..e1cc30c 100644
--- a/frysk-imports/libunwind/src/arm/Ginit_local.c
+++ b/frysk-imports/libunwind/src/arm/Ginit_local.c
@@ -1,5 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2008 CodeSourcery
+   Copyright 2011 Linaro Limited
 
 This file is part of libunwind.
 
@@ -28,7 +29,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #ifdef UNW_REMOTE_ONLY
 
 PROTECTED int
-unw_init_local (unw_cursor_t *cursor, ucontext_t *uc)
+unw_init_local (unw_cursor_t *cursor, unw_context_t *uc)
 {
   return -UNW_EINVAL;
 }
@@ -36,18 +37,19 @@ unw_init_local (unw_cursor_t *cursor, ucontext_t *uc)
 #else /* !UNW_REMOTE_ONLY */
 
 PROTECTED int
-unw_init_local (unw_cursor_t *cursor, ucontext_t *uc)
+unw_init_local (unw_cursor_t *cursor, unw_context_t *uc)
 {
   struct cursor *c = (struct cursor *) cursor;
 
-  if (tdep_needs_initialization)
+  if (!tdep_init_done)
     tdep_init ();
 
   Debug (1, "(cursor=%p)\n", c);
 
   c->dwarf.as = unw_local_addr_space;
   c->dwarf.as_arg = uc;
-  return common_init (c);
+
+  return common_init (c, 1);
 }
 
 #endif /* !UNW_REMOTE_ONLY */
diff --git a/frysk-imports/libunwind/src/arm/Ginit_remote.c b/frysk-imports/libunwind/src/arm/Ginit_remote.c
index 3baf3f6..f284e99 100644
--- a/frysk-imports/libunwind/src/arm/Ginit_remote.c
+++ b/frysk-imports/libunwind/src/arm/Ginit_remote.c
@@ -33,13 +33,13 @@ unw_init_remote (unw_cursor_t *cursor, unw_addr_space_t as, void *as_arg)
 #else /* !UNW_LOCAL_ONLY */
   struct cursor *c = (struct cursor *) cursor;
 
-  if (tdep_needs_initialization)
+  if (!tdep_init_done)
     tdep_init ();
 
   Debug (1, "(cursor=%p)\n", c);
 
   c->dwarf.as = as;
   c->dwarf.as_arg = as_arg;
-  return common_init (c);
+  return common_init (c, 0);
 #endif /* !UNW_LOCAL_ONLY */
 }
diff --git a/frysk-imports/libunwind/src/arm/Gis_signal_frame.c b/frysk-imports/libunwind/src/arm/Gis_signal_frame.c
index 77548d5..e8efe7f 100644
--- a/frysk-imports/libunwind/src/arm/Gis_signal_frame.c
+++ b/frysk-imports/libunwind/src/arm/Gis_signal_frame.c
@@ -1,5 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2008 CodeSourcery
+   Copyright 2011 Linaro Limited
 
 This file is part of libunwind.
 
@@ -25,11 +26,62 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #include <stdio.h>
 #include "unwind_i.h"
 
-/* FIXME for ARM.  */
+#ifdef __linux__
+#define ARM_NR_sigreturn 119
+#define ARM_NR_rt_sigreturn 173
+#define ARM_NR_OABI_SYSCALL_BASE 0x900000
 
+/* ARM EABI sigreturn (the syscall number is loaded into r7) */
+#define MOV_R7_SIGRETURN (0xe3a07000UL | ARM_NR_sigreturn)
+#define MOV_R7_RT_SIGRETURN (0xe3a07000UL | ARM_NR_rt_sigreturn)
+
+/* ARM OABI sigreturn (using SWI) */
+#define ARM_SIGRETURN \
+  (0xef000000UL | ARM_NR_sigreturn | ARM_NR_OABI_SYSCALL_BASE)
+#define ARM_RT_SIGRETURN \
+  (0xef000000UL | ARM_NR_rt_sigreturn | ARM_NR_OABI_SYSCALL_BASE)
+
+/* Thumb sigreturn (two insns, syscall number is loaded into r7) */
+#define THUMB_SIGRETURN (0xdf00UL << 16 | 0x2700 | ARM_NR_sigreturn)
+#define THUMB_RT_SIGRETURN (0xdf00UL << 16 | 0x2700 | ARM_NR_rt_sigreturn)
+#endif /* __linux__ */
+
+/* Returns 1 in case of a non-RT signal frame and 2 in case of a RT signal
+   frame. */
 PROTECTED int
 unw_is_signal_frame (unw_cursor_t *cursor)
 {
+#ifdef __linux__
+  struct cursor *c = (struct cursor *) cursor;
+  unw_word_t w0, ip;
+  unw_addr_space_t as;
+  unw_accessors_t *a;
+  void *arg;
+  int ret;
+
+  as = c->dwarf.as;
+  a = unw_get_accessors (as);
+  arg = c->dwarf.as_arg;
+
+  ip = c->dwarf.ip;
+
+  if ((ret = (*a->access_mem) (as, ip, &w0, 0, arg)) < 0)
+    return ret;
+
+  /* Return 1 if the IP points to a non-RT sigreturn sequence.  */
+  if (w0 == MOV_R7_SIGRETURN || w0 == ARM_SIGRETURN || w0 == THUMB_SIGRETURN)
+    return 1;
+  /* Return 2 if the IP points to a RT sigreturn sequence.  */
+  else if (w0 == MOV_R7_RT_SIGRETURN || w0 == ARM_RT_SIGRETURN
+           || w0 == THUMB_RT_SIGRETURN)
+    return 2;
+
+  return 0;
+#elif defined(__QNX__)
+  /* Not supported yet */
+  return 0;
+#else
   printf ("%s: implement me\n", __FUNCTION__);
   return -UNW_ENOINFO;
+#endif
 }
diff --git a/frysk-imports/libunwind/src/arm/Gregs.c b/frysk-imports/libunwind/src/arm/Gregs.c
index 1546f58..688771f 100644
--- a/frysk-imports/libunwind/src/arm/Gregs.c
+++ b/frysk-imports/libunwind/src/arm/Gregs.c
@@ -26,7 +26,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 HIDDEN int
 tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
-		 int write)
+                 int write)
 {
   dwarf_loc_t loc = DWARF_NULL_LOC;
   
@@ -45,12 +45,12 @@ tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
     case UNW_ARM_R10:
     case UNW_ARM_R11:
     case UNW_ARM_R12:
-    case UNW_ARM_R13:
     case UNW_ARM_R14:
     case UNW_ARM_R15:
       loc = c->dwarf.loc[reg - UNW_ARM_R0];
       break;
 
+    case UNW_ARM_R13:
     case UNW_ARM_CFA:
       if (write)
         return -UNW_EREADONLYREG;
@@ -74,7 +74,7 @@ tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
 
 HIDDEN int
 tdep_access_fpreg (struct cursor *c, unw_regnum_t reg, unw_fpreg_t *valp,
-		   int write)
+                   int write)
 {
   Debug (1, "bad register number %u\n", reg);
   return -UNW_EBADREG;
diff --git a/frysk-imports/libunwind/src/arm/Gresume.c b/frysk-imports/libunwind/src/arm/Gresume.c
index 4db1738..9fe264e 100644
--- a/frysk-imports/libunwind/src/arm/Gresume.c
+++ b/frysk-imports/libunwind/src/arm/Gresume.c
@@ -1,5 +1,7 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2008 CodeSourcery
+   Copyright 2011 Linaro Limited
+   Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com>
 
 This file is part of libunwind.
 
@@ -22,24 +24,131 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
-/* FIXME for ARM.  */
-
-#include <stdlib.h>
-
 #include "unwind_i.h"
+#include "offsets.h"
 
 #ifndef UNW_REMOTE_ONLY
 
 HIDDEN inline int
 arm_local_resume (unw_addr_space_t as, unw_cursor_t *cursor, void *arg)
 {
+#ifdef __linux__
+  struct cursor *c = (struct cursor *) cursor;
+  unw_tdep_context_t *uc = c->dwarf.as_arg;
+
+  if (c->sigcontext_format == ARM_SCF_NONE)
+    {
+      /* Since there are no signals involved here we restore the non scratch
+         registers only.  */
+      unsigned long regs[10];
+      regs[0] = uc->regs[4];
+      regs[1] = uc->regs[5];
+      regs[2] = uc->regs[6];
+      regs[3] = uc->regs[7];
+      regs[4] = uc->regs[8];
+      regs[5] = uc->regs[9];
+      regs[6] = uc->regs[10];
+      regs[7] = uc->regs[11]; /* FP */
+      regs[8] = uc->regs[13]; /* SP */
+      regs[9] = uc->regs[14]; /* LR */
+
+      struct regs_overlay {
+              char x[sizeof(regs)];
+      };
+
+      asm __volatile__ (
+        "ldmia %0, {r4-r12, lr}\n"
+        "mov sp, r12\n"
+        "bx lr\n"
+        : : "r" (regs),
+            "m" (*(struct regs_overlay *)regs)
+      );
+    }
+  else
+    {
+      /* In case a signal frame is involved, we're using its trampoline which
+         calls sigreturn.  */
+      struct sigcontext *sc = (struct sigcontext *) c->sigcontext_addr;
+      sc->arm_r0 = uc->regs[0];
+      sc->arm_r1 = uc->regs[1];
+      sc->arm_r2 = uc->regs[2];
+      sc->arm_r3 = uc->regs[3];
+      sc->arm_r4 = uc->regs[4];
+      sc->arm_r5 = uc->regs[5];
+      sc->arm_r6 = uc->regs[6];
+      sc->arm_r7 = uc->regs[7];
+      sc->arm_r8 = uc->regs[8];
+      sc->arm_r9 = uc->regs[9];
+      sc->arm_r10 = uc->regs[10];
+      sc->arm_fp = uc->regs[11]; /* FP */
+      sc->arm_ip = uc->regs[12]; /* IP */
+      sc->arm_sp = uc->regs[13]; /* SP */
+      sc->arm_lr = uc->regs[14]; /* LR */
+      sc->arm_pc = uc->regs[15]; /* PC */
+      /* clear the ITSTATE bits.  */
+      sc->arm_cpsr &= 0xf9ff03ffUL;
+
+      /* Set the SP and the PC in order to continue execution at the modified
+         trampoline which restores the signal mask and the registers.  */
+      asm __volatile__ (
+        "mov sp, %0\n"
+        "bx %1\n"
+        : : "r" (c->sigcontext_sp), "r" (c->sigcontext_pc)
+      );
+   }
+  unreachable();
+#else
+  printf ("%s: implement me\n", __FUNCTION__);
+#endif
   return -UNW_EINVAL;
 }
 
 #endif /* !UNW_REMOTE_ONLY */
 
+static inline void
+establish_machine_state (struct cursor *c)
+{
+  unw_addr_space_t as = c->dwarf.as;
+  void *arg = c->dwarf.as_arg;
+  unw_fpreg_t fpval;
+  unw_word_t val;
+  int reg;
+
+  Debug (8, "copying out cursor state\n");
+
+  for (reg = 0; reg <= UNW_REG_LAST; ++reg)
+    {
+      Debug (16, "copying %s %d\n", unw_regname (reg), reg);
+      if (unw_is_fpreg (reg))
+        {
+          if (tdep_access_fpreg (c, reg, &fpval, 0) >= 0)
+            as->acc.access_fpreg (as, reg, &fpval, 1, arg);
+        }
+      else
+        {
+          if (tdep_access_reg (c, reg, &val, 0) >= 0)
+            as->acc.access_reg (as, reg, &val, 1, arg);
+        }
+    }
+}
+
 PROTECTED int
 unw_resume (unw_cursor_t *cursor)
 {
-  return -UNW_EINVAL;
+  struct cursor *c = (struct cursor *) cursor;
+
+  Debug (1, "(cursor=%p)\n", c);
+
+  if (!c->dwarf.ip)
+    {
+      /* This can happen easily when the frame-chain gets truncated
+         due to bad or missing unwind-info.  */
+      Debug (1, "refusing to resume execution at address 0\n");
+      return -UNW_EINVAL;
+    }
+
+  establish_machine_state (c);
+
+  return (*c->dwarf.as->acc.resume) (c->dwarf.as, (unw_cursor_t *) c,
+                                     c->dwarf.as_arg);
 }
diff --git a/frysk-imports/libunwind/src/arm/Gstash_frame.c b/frysk-imports/libunwind/src/arm/Gstash_frame.c
new file mode 100644
index 0000000..2cce409
--- /dev/null
+++ b/frysk-imports/libunwind/src/arm/Gstash_frame.c
@@ -0,0 +1,90 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2010, 2011 by FERMI NATIONAL ACCELERATOR LABORATORY
+   Copyright (C) 2014 CERN and Aalto University
+        Contributed by Filip Nyback
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "unwind_i.h"
+
+HIDDEN void
+tdep_stash_frame (struct dwarf_cursor *d, struct dwarf_reg_state *rs)
+{
+  struct cursor *c = (struct cursor *) dwarf_to_cursor (d);
+  unw_tdep_frame_t *f = &c->frame_info;
+
+  Debug (4, "ip=0x%x cfa=0x%x type %d cfa [where=%d val=%d] cfaoff=%d"
+         " ra=0x%x r7 [where=%d val=%d @0x%x] lr [where=%d val=%d @0x%x] "
+         "sp [where=%d val=%d @0x%x]\n",
+         d->ip, d->cfa, f->frame_type,
+         rs->reg[DWARF_CFA_REG_COLUMN].where,
+         rs->reg[DWARF_CFA_REG_COLUMN].val,
+         rs->reg[DWARF_CFA_OFF_COLUMN].val,
+         DWARF_GET_LOC(d->loc[d->ret_addr_column]),
+         rs->reg[R7].where, rs->reg[R7].val, DWARF_GET_LOC(d->loc[R7]),
+         rs->reg[LR].where, rs->reg[LR].val, DWARF_GET_LOC(d->loc[LR]),
+         rs->reg[SP].where, rs->reg[SP].val, DWARF_GET_LOC(d->loc[SP]));
+
+  /* A standard frame is defined as:
+      - CFA is register-relative offset off R7 or SP;
+      - Return address is saved in LR;
+      - R7 is unsaved or saved at CFA+offset, offset != -1;
+      - LR is unsaved or saved at CFA+offset, offset != -1;
+      - SP is unsaved or saved at CFA+offset, offset != -1.  */
+  if (f->frame_type == UNW_ARM_FRAME_OTHER
+      && (rs->reg[DWARF_CFA_REG_COLUMN].where == DWARF_WHERE_REG)
+      && (rs->reg[DWARF_CFA_REG_COLUMN].val == R7
+          || rs->reg[DWARF_CFA_REG_COLUMN].val == SP)
+      && labs(rs->reg[DWARF_CFA_OFF_COLUMN].val) < (1 << 29)
+      && d->ret_addr_column == LR
+      && (rs->reg[R7].where == DWARF_WHERE_UNDEF
+          || rs->reg[R7].where == DWARF_WHERE_SAME
+          || (rs->reg[R7].where == DWARF_WHERE_CFAREL
+              && labs(rs->reg[R7].val) < (1 << 29)
+              && rs->reg[R7].val+1 != 0))
+      && (rs->reg[LR].where == DWARF_WHERE_UNDEF
+          || rs->reg[LR].where == DWARF_WHERE_SAME
+          || (rs->reg[LR].where == DWARF_WHERE_CFAREL
+              && labs(rs->reg[LR].val) < (1 << 29)
+              && rs->reg[LR].val+1 != 0))
+      && (rs->reg[SP].where == DWARF_WHERE_UNDEF
+          || rs->reg[SP].where == DWARF_WHERE_SAME
+          || (rs->reg[SP].where == DWARF_WHERE_CFAREL
+              && labs(rs->reg[SP].val) < (1 << 29)
+              && rs->reg[SP].val+1 != 0)))
+  {
+    /* Save information for a standard frame. */
+    f->frame_type = UNW_ARM_FRAME_STANDARD;
+    f->cfa_reg_sp = (rs->reg[DWARF_CFA_REG_COLUMN].val == SP);
+    f->cfa_reg_offset = rs->reg[DWARF_CFA_OFF_COLUMN].val;
+    if (rs->reg[R7].where == DWARF_WHERE_CFAREL)
+      f->r7_cfa_offset = rs->reg[R7].val;
+    if (rs->reg[LR].where == DWARF_WHERE_CFAREL)
+      f->lr_cfa_offset = rs->reg[LR].val;
+    if (rs->reg[SP].where == DWARF_WHERE_CFAREL)
+      f->sp_cfa_offset = rs->reg[SP].val;
+    Debug (4, " standard frame\n");
+  }
+  else
+    Debug (4, " unusual frame\n");
+}
+
diff --git a/frysk-imports/libunwind/src/arm/Gstep.c b/frysk-imports/libunwind/src/arm/Gstep.c
index eff1fde..79f2dd2 100644
--- a/frysk-imports/libunwind/src/arm/Gstep.c
+++ b/frysk-imports/libunwind/src/arm/Gstep.c
@@ -1,5 +1,7 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2008 CodeSourcery
+   Copyright 2011 Linaro Limited
+   Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com>
 
 This file is part of libunwind.
 
@@ -24,25 +26,247 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 #include "unwind_i.h"
 #include "offsets.h"
+#include "ex_tables.h"
+
+#include <signal.h>
+
+#define arm_exidx_step  UNW_OBJ(arm_exidx_step)
+
+static inline int
+arm_exidx_step (struct cursor *c)
+{
+  unw_word_t old_ip, old_cfa;
+  uint8_t buf[32];
+  int ret;
+
+  old_ip = c->dwarf.ip;
+  old_cfa = c->dwarf.cfa;
+
+  /* mark PC unsaved */
+  c->dwarf.loc[UNW_ARM_R15] = DWARF_NULL_LOC;
+
+  if ((ret = tdep_find_proc_info (&c->dwarf, c->dwarf.ip, 1)) < 0)
+     return ret;
+
+  if (c->dwarf.pi.format != UNW_INFO_FORMAT_ARM_EXIDX)
+    return -UNW_ENOINFO;
+
+  ret = arm_exidx_extract (&c->dwarf, buf);
+  if (ret == -UNW_ESTOPUNWIND)
+    return 0;
+  else if (ret < 0)
+    return ret;
+
+  ret = arm_exidx_decode (buf, ret, &c->dwarf);
+  if (ret < 0)
+    return ret;
+
+  if (c->dwarf.ip == old_ip && c->dwarf.cfa == old_cfa)
+    {
+      Dprintf ("%s: ip and cfa unchanged; stopping here (ip=0x%lx)\n",
+               __FUNCTION__, (long) c->dwarf.ip);
+      return -UNW_EBADFRAME;
+    }
+
+  c->dwarf.pi_valid = 0;
+
+  return (c->dwarf.ip == 0) ? 0 : 1;
+}
 
 PROTECTED int
-unw_step (unw_cursor_t *cursor)
+unw_handle_signal_frame (unw_cursor_t *cursor)
 {
   struct cursor *c = (struct cursor *) cursor;
   int ret;
+  unw_word_t sc_addr, sp, sp_addr = c->dwarf.cfa;
+  struct dwarf_loc sp_loc = DWARF_LOC (sp_addr, 0);
+
+  if ((ret = dwarf_get (&c->dwarf, sp_loc, &sp)) < 0)
+    return -UNW_EUNSPEC;
+
+  /* Obtain signal frame type (non-RT or RT). */
+  ret = unw_is_signal_frame (cursor);
+
+  /* Save the SP and PC to be able to return execution at this point
+     later in time (unw_resume).  */
+  c->sigcontext_sp = c->dwarf.cfa;
+  c->sigcontext_pc = c->dwarf.ip;
+
+  /* Since kernel version 2.6.18 the non-RT signal frame starts with a
+     ucontext while the RT signal frame starts with a siginfo, followed
+     by a sigframe whose first element is an ucontext.
+     Prior 2.6.18 the non-RT signal frame starts with a sigcontext while
+     the RT signal frame starts with two pointers followed by a siginfo
+     and an ucontext. The first pointer points to the start of the siginfo
+     structure and the second one to the ucontext structure.  */
+
+  if (ret == 1)
+    {
+      /* Handle non-RT signal frames. Check if the first word on the stack
+         is the magic number.  */
+      if (sp == 0x5ac3c35a)
+        {
+          c->sigcontext_format = ARM_SCF_LINUX_SIGFRAME;
+          sc_addr = sp_addr + LINUX_UC_MCONTEXT_OFF;
+        }
+      else
+        {
+          c->sigcontext_format = ARM_SCF_LINUX_OLD_SIGFRAME;
+          sc_addr = sp_addr;
+        }
+    }
+  else if (ret == 2)
+    {
+      /* Handle RT signal frames. Check if the first word on the stack is a
+         pointer to the siginfo structure.  */
+      if (sp == sp_addr + 8)
+        {
+          c->sigcontext_format = ARM_SCF_LINUX_OLD_RT_SIGFRAME;
+          sc_addr = sp_addr + 8 + sizeof (siginfo_t) + LINUX_UC_MCONTEXT_OFF;
+        }
+      else
+        {
+          c->sigcontext_format = ARM_SCF_LINUX_RT_SIGFRAME;
+          sc_addr = sp_addr + sizeof (siginfo_t) + LINUX_UC_MCONTEXT_OFF;
+        }
+    }
+  else
+    return -UNW_EUNSPEC;
+
+  c->sigcontext_addr = sc_addr;
+  c->frame_info.frame_type = UNW_ARM_FRAME_SIGRETURN;
+  c->frame_info.cfa_reg_offset = sc_addr - sp_addr;
+
+  /* Update the dwarf cursor.
+     Set the location of the registers to the corresponding addresses of the
+     uc_mcontext / sigcontext structure contents.  */
+  c->dwarf.loc[UNW_ARM_R0] = DWARF_LOC (sc_addr + LINUX_SC_R0_OFF, 0);
+  c->dwarf.loc[UNW_ARM_R1] = DWARF_LOC (sc_addr + LINUX_SC_R1_OFF, 0);
+  c->dwarf.loc[UNW_ARM_R2] = DWARF_LOC (sc_addr + LINUX_SC_R2_OFF, 0);
+  c->dwarf.loc[UNW_ARM_R3] = DWARF_LOC (sc_addr + LINUX_SC_R3_OFF, 0);
+  c->dwarf.loc[UNW_ARM_R4] = DWARF_LOC (sc_addr + LINUX_SC_R4_OFF, 0);
+  c->dwarf.loc[UNW_ARM_R5] = DWARF_LOC (sc_addr + LINUX_SC_R5_OFF, 0);
+  c->dwarf.loc[UNW_ARM_R6] = DWARF_LOC (sc_addr + LINUX_SC_R6_OFF, 0);
+  c->dwarf.loc[UNW_ARM_R7] = DWARF_LOC (sc_addr + LINUX_SC_R7_OFF, 0);
+  c->dwarf.loc[UNW_ARM_R8] = DWARF_LOC (sc_addr + LINUX_SC_R8_OFF, 0);
+  c->dwarf.loc[UNW_ARM_R9] = DWARF_LOC (sc_addr + LINUX_SC_R9_OFF, 0);
+  c->dwarf.loc[UNW_ARM_R10] = DWARF_LOC (sc_addr + LINUX_SC_R10_OFF, 0);
+  c->dwarf.loc[UNW_ARM_R11] = DWARF_LOC (sc_addr + LINUX_SC_FP_OFF, 0);
+  c->dwarf.loc[UNW_ARM_R12] = DWARF_LOC (sc_addr + LINUX_SC_IP_OFF, 0);
+  c->dwarf.loc[UNW_ARM_R13] = DWARF_LOC (sc_addr + LINUX_SC_SP_OFF, 0);
+  c->dwarf.loc[UNW_ARM_R14] = DWARF_LOC (sc_addr + LINUX_SC_LR_OFF, 0);
+  c->dwarf.loc[UNW_ARM_R15] = DWARF_LOC (sc_addr + LINUX_SC_PC_OFF, 0);
+
+  /* Set SP/CFA and PC/IP.  */
+  dwarf_get (&c->dwarf, c->dwarf.loc[UNW_ARM_R13], &c->dwarf.cfa);
+  dwarf_get (&c->dwarf, c->dwarf.loc[UNW_ARM_R15], &c->dwarf.ip);
+
+  c->dwarf.pi_valid = 0;
+
+  return 1;
+}
+
+PROTECTED int
+unw_step (unw_cursor_t *cursor)
+{
+  struct cursor *c = (struct cursor *) cursor;
+  int ret = -UNW_EUNSPEC;
 
   Debug (1, "(cursor=%p)\n", c);
 
-  /* Try DWARF-based unwinding...  this is the only method likely to work for
-     ARM.  */
-  ret = dwarf_step (&c->dwarf);
+  /* Check if this is a signal frame. */
+  if (unw_is_signal_frame (cursor))
+     return unw_handle_signal_frame (cursor);
 
-  if (unlikely (ret == -UNW_ESTOPUNWIND))
-    return ret;
+#ifdef CONFIG_DEBUG_FRAME
+  /* First, try DWARF-based unwinding. */
+  if (UNW_TRY_METHOD(UNW_ARM_METHOD_DWARF))
+    {
+      ret = dwarf_step (&c->dwarf);
+      Debug(1, "dwarf_step()=%d\n", ret);
 
-  /* Dwarf unwinding didn't work, stop.  */
-  if (unlikely (ret < 0))
-    return 0;
+      if (likely (ret > 0))
+        return 1;
+      else if (unlikely (ret == -UNW_ESTOPUNWIND))
+        return ret;
 
-  return (c->dwarf.ip == 0) ? 0 : 1;
+    if (ret < 0 && ret != -UNW_ENOINFO)
+      {
+        Debug (2, "returning %d\n", ret);
+        return ret;
+      }
+    }
+#endif /* CONFIG_DEBUG_FRAME */
+
+  /* Next, try extbl-based unwinding. */
+  if (UNW_TRY_METHOD (UNW_ARM_METHOD_EXIDX))
+    {
+      ret = arm_exidx_step (c);
+      if (ret > 0)
+        return 1;
+      if (ret == -UNW_ESTOPUNWIND || ret == 0)
+        return ret;
+    }
+
+  /* Fall back on APCS frame parsing.
+     Note: This won't work in case the ARM EABI is used. */
+  if (unlikely (ret < 0))
+    {
+      if (UNW_TRY_METHOD(UNW_ARM_METHOD_FRAME))
+        {
+          ret = UNW_ESUCCESS;
+          /* DWARF unwinding failed, try to follow APCS/optimized APCS frame chain */
+          unw_word_t instr, i;
+          Debug (13, "dwarf_step() failed (ret=%d), trying frame-chain\n", ret);
+          dwarf_loc_t ip_loc, fp_loc;
+          unw_word_t frame;
+          /* Mark all registers unsaved, since we don't know where
+             they are saved (if at all), except for the EBP and
+             EIP.  */
+          if (dwarf_get(&c->dwarf, c->dwarf.loc[UNW_ARM_R11], &frame) < 0)
+            {
+              return 0;
+            }
+          for (i = 0; i < DWARF_NUM_PRESERVED_REGS; ++i) {
+            c->dwarf.loc[i] = DWARF_NULL_LOC;
+          }
+          if (frame)
+            {
+              if (dwarf_get(&c->dwarf, DWARF_LOC(frame, 0), &instr) < 0)
+                {
+                  return 0;
+                }
+              instr -= 8;
+              if (dwarf_get(&c->dwarf, DWARF_LOC(instr, 0), &instr) < 0)
+                {
+                  return 0;
+                }
+              if ((instr & 0xFFFFD800) == 0xE92DD800)
+                {
+                  /* Standard APCS frame. */
+                  ip_loc = DWARF_LOC(frame - 4, 0);
+                  fp_loc = DWARF_LOC(frame - 12, 0);
+                }
+              else
+                {
+                  /* Codesourcery optimized normal frame. */
+                  ip_loc = DWARF_LOC(frame, 0);
+                  fp_loc = DWARF_LOC(frame - 4, 0);
+                }
+              if (dwarf_get(&c->dwarf, ip_loc, &c->dwarf.ip) < 0)
+                {
+                  return 0;
+                }
+              c->dwarf.loc[UNW_ARM_R12] = ip_loc;
+              c->dwarf.loc[UNW_ARM_R11] = fp_loc;
+              c->dwarf.pi_valid = 0;
+              Debug(15, "ip=%lx\n", c->dwarf.ip);
+            }
+          else
+            {
+              ret = -UNW_ENOINFO;
+            }
+        }
+    }
+  return ret == -UNW_ENOINFO ? 0 : 1;
 }
diff --git a/frysk-imports/libunwind/src/arm/Gtrace.c b/frysk-imports/libunwind/src/arm/Gtrace.c
new file mode 100644
index 0000000..135563a
--- /dev/null
+++ b/frysk-imports/libunwind/src/arm/Gtrace.c
@@ -0,0 +1,550 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2010, 2011 by FERMI NATIONAL ACCELERATOR LABORATORY
+   Copyright (C) 2014 CERN and Aalto University
+        Contributed by Filip Nyback
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "unwind_i.h"
+#include "offsets.h"
+#include <signal.h>
+#include <limits.h>
+
+#pragma weak pthread_once
+#pragma weak pthread_key_create
+#pragma weak pthread_getspecific
+#pragma weak pthread_setspecific
+
+/* Initial hash table size. Table expands by 2 bits (times four). */
+#define HASH_MIN_BITS 14
+
+typedef struct
+{
+  unw_tdep_frame_t *frames;
+  size_t log_size;
+  size_t used;
+  size_t dtor_count;  /* Counts how many times our destructor has already
+                         been called. */
+} unw_trace_cache_t;
+
+static const unw_tdep_frame_t empty_frame = { 0, UNW_ARM_FRAME_OTHER, -1, -1, 0, -1, -1, -1 };
+static define_lock (trace_init_lock);
+static pthread_once_t trace_cache_once = PTHREAD_ONCE_INIT;
+static sig_atomic_t trace_cache_once_happen;
+static pthread_key_t trace_cache_key;
+static struct mempool trace_cache_pool;
+static __thread  unw_trace_cache_t *tls_cache;
+static __thread  int tls_cache_destroyed;
+
+/* Free memory for a thread's trace cache. */
+static void
+trace_cache_free (void *arg)
+{
+  unw_trace_cache_t *cache = arg;
+  if (++cache->dtor_count < PTHREAD_DESTRUCTOR_ITERATIONS)
+  {
+    /* Not yet our turn to get destroyed. Re-install ourselves into the key. */
+    pthread_setspecific(trace_cache_key, cache);
+    Debug(5, "delayed freeing cache %p (%zx to go)\n", cache,
+          PTHREAD_DESTRUCTOR_ITERATIONS - cache->dtor_count);
+    return;
+  }
+  tls_cache_destroyed = 1;
+  tls_cache = NULL;
+  munmap (cache->frames, (1u << cache->log_size) * sizeof(unw_tdep_frame_t));
+  mempool_free (&trace_cache_pool, cache);
+  Debug(5, "freed cache %p\n", cache);
+}
+
+/* Initialise frame tracing for threaded use. */
+static void
+trace_cache_init_once (void)
+{
+  pthread_key_create (&trace_cache_key, &trace_cache_free);
+  mempool_init (&trace_cache_pool, sizeof (unw_trace_cache_t), 0);
+  trace_cache_once_happen = 1;
+}
+
+static unw_tdep_frame_t *
+trace_cache_buckets (size_t n)
+{
+  unw_tdep_frame_t *frames;
+  size_t i;
+
+  GET_MEMORY(frames, n * sizeof (unw_tdep_frame_t));
+  if (likely(frames != NULL))
+    for (i = 0; i < n; ++i)
+      frames[i] = empty_frame;
+
+  return frames;
+}
+
+/* Allocate and initialise hash table for frame cache lookups.
+   Returns the cache initialised with (1u << HASH_LOW_BITS) hash
+   buckets, or NULL if there was a memory allocation problem. */
+static unw_trace_cache_t *
+trace_cache_create (void)
+{
+  unw_trace_cache_t *cache;
+
+  if (tls_cache_destroyed)
+  {
+    /* The current thread is in the process of exiting. Don't recreate
+       cache, as we wouldn't have another chance to free it. */
+    Debug(5, "refusing to reallocate cache: "
+             "thread-locals are being deallocated\n");
+    return NULL;
+  }
+
+  if (! (cache = mempool_alloc(&trace_cache_pool)))
+  {
+    Debug(5, "failed to allocate cache\n");
+    return NULL;
+  }
+
+  if (! (cache->frames = trace_cache_buckets(1u << HASH_MIN_BITS)))
+  {
+    Debug(5, "failed to allocate buckets\n");
+    mempool_free(&trace_cache_pool, cache);
+    return NULL;
+  }
+
+  cache->log_size = HASH_MIN_BITS;
+  cache->used = 0;
+  cache->dtor_count = 0;
+  tls_cache_destroyed = 0;  /* Paranoia: should already be 0. */
+  Debug(5, "allocated cache %p\n", cache);
+  return cache;
+}
+
+/* Expand the hash table in the frame cache if possible. This always
+   quadruples the hash size, and clears all previous frame entries. */
+static int
+trace_cache_expand (unw_trace_cache_t *cache)
+{
+  size_t old_size = (1u << cache->log_size);
+  size_t new_log_size = cache->log_size + 2;
+  unw_tdep_frame_t *new_frames = trace_cache_buckets (1u << new_log_size);
+
+  if (unlikely(! new_frames))
+  {
+    Debug(5, "failed to expand cache to 2^%u buckets\n", new_log_size);
+    return -UNW_ENOMEM;
+  }
+
+  Debug(5, "expanded cache from 2^%u to 2^%u buckets\n", cache->log_size,
+        new_log_size);
+  munmap(cache->frames, old_size * sizeof(unw_tdep_frame_t));
+  cache->frames = new_frames;
+  cache->log_size = new_log_size;
+  cache->used = 0;
+  return 0;
+}
+
+static unw_trace_cache_t *
+trace_cache_get_unthreaded (void)
+{
+  unw_trace_cache_t *cache;
+  intrmask_t saved_mask;
+  static unw_trace_cache_t *global_cache = NULL;
+  lock_acquire (&trace_init_lock, saved_mask);
+  if (! global_cache)
+  {
+    mempool_init (&trace_cache_pool, sizeof (unw_trace_cache_t), 0);
+    global_cache = trace_cache_create ();
+  }
+  cache = global_cache;
+  lock_release (&trace_init_lock, saved_mask);
+  Debug(5, "using cache %p\n", cache);
+  return cache;
+}
+
+/* Get the frame cache for the current thread. Create it if there is none. */
+static unw_trace_cache_t *
+trace_cache_get (void)
+{
+  unw_trace_cache_t *cache;
+  if (likely (pthread_once != NULL))
+  {
+    pthread_once(&trace_cache_once, &trace_cache_init_once);
+    if (!trace_cache_once_happen)
+    {
+      return trace_cache_get_unthreaded();
+    }
+    if (! (cache = tls_cache))
+    {
+      cache = trace_cache_create();
+      pthread_setspecific(trace_cache_key, cache);
+      tls_cache = cache;
+    }
+    Debug(5, "using cache %p\n", cache);
+    return cache;
+  }
+  else
+  {
+    return trace_cache_get_unthreaded();
+  }
+}
+
+/* Initialise frame properties for address cache slot F at address
+   PC using current CFA, R7 and SP values.  Modifies CURSOR to
+   that location, performs one unw_step(), and fills F with what
+   was discovered about the location.  Returns F.
+
+   FIXME: This probably should tell DWARF handling to never evaluate
+   or use registers other than R7, SP and PC in case there is
+   highly unusual unwind info which uses these creatively. */
+static unw_tdep_frame_t *
+trace_init_addr (unw_tdep_frame_t *f,
+                 unw_cursor_t *cursor,
+                 unw_word_t cfa,
+                 unw_word_t pc,
+                 unw_word_t r7,
+                 unw_word_t sp)
+{
+  struct cursor *c = (struct cursor *) cursor;
+  struct dwarf_cursor *d = &c->dwarf;
+  int ret = -UNW_EINVAL;
+
+  /* Initialise frame properties: unknown, not last. */
+  f->virtual_address = pc;
+  f->frame_type = UNW_ARM_FRAME_OTHER;
+  f->last_frame = 0;
+  f->cfa_reg_sp = -1;
+  f->cfa_reg_offset = 0;
+  f->r7_cfa_offset = -1;
+  f->lr_cfa_offset = -1;
+  f->sp_cfa_offset = -1;
+
+  /* Reinitialise cursor to this instruction - but undo next/prev RIP
+     adjustment because unw_step will redo it - and force PC, R7 and
+     SP into register locations (=~ ucontext we keep), then set
+     their desired values. Then perform the step. */
+  d->ip = pc + d->use_prev_instr;
+  d->cfa = cfa;
+  d->loc[UNW_ARM_R7] = DWARF_REG_LOC (d, UNW_ARM_R7);
+  d->loc[UNW_ARM_R13] = DWARF_REG_LOC (d, UNW_ARM_R13);
+  d->loc[UNW_ARM_R15] = DWARF_REG_LOC (d, UNW_ARM_R15);
+  c->frame_info = *f;
+
+  if (likely(dwarf_put (d, d->loc[UNW_ARM_R7], r7) >= 0)
+      && likely(dwarf_put (d, d->loc[UNW_ARM_R13], sp) >= 0)
+      && likely(dwarf_put (d, d->loc[UNW_ARM_R15], pc) >= 0)
+      && likely((ret = unw_step (cursor)) >= 0))
+    *f = c->frame_info;
+
+  /* If unw_step() stopped voluntarily, remember that, even if it
+     otherwise could not determine anything useful.  This avoids
+     failing trace if we hit frames without unwind info, which is
+     common for the outermost frame (CRT stuff) on many systems.
+     This avoids failing trace in very common circumstances; failing
+     to unw_step() loop wouldn't produce any better result. */
+  if (ret == 0)
+    f->last_frame = -1;
+
+  Debug (3, "frame va %x type %d last %d cfa %s+%d r7 @ cfa%+d lr @ cfa%+d sp @ cfa%+d\n",
+         f->virtual_address, f->frame_type, f->last_frame,
+         f->cfa_reg_sp ? "sp" : "r7", f->cfa_reg_offset,
+         f->r7_cfa_offset, f->lr_cfa_offset, f->sp_cfa_offset);
+
+  return f;
+}
+
+/* Look up and if necessary fill in frame attributes for address PC
+   in CACHE using current CFA, R7 and SP values.  Uses CURSOR to
+   perform any unwind steps necessary to fill the cache.  Returns the
+   frame cache slot which describes RIP. */
+static unw_tdep_frame_t *
+trace_lookup (unw_cursor_t *cursor,
+              unw_trace_cache_t *cache,
+              unw_word_t cfa,
+              unw_word_t pc,
+              unw_word_t r7,
+              unw_word_t sp)
+{
+  /* First look up for previously cached information using cache as
+     linear probing hash table with probe step of 1.  Majority of
+     lookups should be completed within few steps, but it is very
+     important the hash table does not fill up, or performance falls
+     off the cliff. */
+  uint32_t i, addr;
+  uint32_t cache_size = 1u << cache->log_size;
+  uint32_t slot = ((pc * 0x9e3779b9) >> 11) & (cache_size-1);
+  unw_tdep_frame_t *frame;
+
+  for (i = 0; i < 16; ++i)
+  {
+    frame = &cache->frames[slot];
+    addr = frame->virtual_address;
+
+    /* Return if we found the address. */
+    if (likely(addr == pc))
+    {
+      Debug (4, "found address after %d steps\n", i);
+      return frame;
+    }
+
+    /* If slot is empty, reuse it. */
+    if (likely(! addr))
+      break;
+
+    /* Linear probe to next slot candidate, step = 1. */
+    if (++slot >= cache_size)
+      slot -= cache_size;
+  }
+
+  /* If we collided after 16 steps, or if the hash is more than half
+     full, force the hash to expand. Fill the selected slot, whether
+     it's free or collides. Note that hash expansion drops previous
+     contents; further lookups will refill the hash. */
+  Debug (4, "updating slot %u after %d steps, replacing 0x%x\n", slot, i, addr);
+  if (unlikely(addr || cache->used >= cache_size / 2))
+  {
+    if (unlikely(trace_cache_expand (cache) < 0))
+      return NULL;
+
+    cache_size = 1u << cache->log_size;
+    slot = ((pc * 0x9e3779b9) >> 11) & (cache_size-1);
+    frame = &cache->frames[slot];
+    addr = frame->virtual_address;
+  }
+
+  if (! addr)
+    ++cache->used;
+
+  return trace_init_addr (frame, cursor, cfa, pc, r7, sp);
+}
+
+/* Fast stack backtrace for ARM.
+
+   This is used by backtrace() implementation to accelerate frequent
+   queries for current stack, without any desire to unwind. It fills
+   BUFFER with the call tree from CURSOR upwards for at most SIZE
+   stack levels. The first frame, backtrace itself, is omitted. When
+   called, SIZE should give the maximum number of entries that can be
+   stored into BUFFER. Uses an internal thread-specific cache to
+   accelerate queries.
+
+   The caller should fall back to a unw_step() loop if this function
+   fails by returning -UNW_ESTOPUNWIND, meaning the routine hit a
+   stack frame that is too complex to be traced in the fast path.
+
+   This function is tuned for clients which only need to walk the
+   stack to get the call tree as fast as possible but without any
+   other details, for example profilers sampling the stack thousands
+   to millions of times per second.  The routine handles the most
+   common ARM ABI stack layouts: CFA is R7 or SP plus/minus
+   constant offset, return address is in LR, and R7, LR and SP are
+   either unchanged or saved on stack at constant offset from the CFA;
+   the signal return frame; and frames without unwind info provided
+   they are at the outermost (final) frame or can conservatively be
+   assumed to be frame-pointer based.
+
+   Any other stack layout will cause the routine to give up. There
+   are only a handful of relatively rarely used functions which do
+   not have a stack in the standard form: vfork, longjmp, setcontext
+   and _dl_runtime_profile on common linux systems for example.
+
+   On success BUFFER and *SIZE reflect the trace progress up to *SIZE
+   stack levels or the outermost frame, which ever is less.  It may
+   stop short of outermost frame if unw_step() loop would also do so,
+   e.g. if there is no more unwind information; this is not reported
+   as an error.
+
+   The function returns a negative value for errors, -UNW_ESTOPUNWIND
+   if tracing stopped because of an unusual frame unwind info.  The
+   BUFFER and *SIZE reflect tracing progress up to the error frame.
+
+   Callers of this function would normally look like this:
+
+     unw_cursor_t     cur;
+     unw_context_t    ctx;
+     void             addrs[128];
+     int              depth = 128;
+     int              ret;
+
+     unw_getcontext(&ctx);
+     unw_init_local(&cur, &ctx);
+     if ((ret = unw_tdep_trace(&cur, addrs, &depth)) < 0)
+     {
+       depth = 0;
+       unw_getcontext(&ctx);
+       unw_init_local(&cur, &ctx);
+       while ((ret = unw_step(&cur)) > 0 && depth < 128)
+       {
+         unw_word_t ip;
+         unw_get_reg(&cur, UNW_REG_IP, &ip);
+         addresses[depth++] = (void *) ip;
+       }
+     }
+*/
+HIDDEN int
+tdep_trace (unw_cursor_t *cursor, void **buffer, int *size)
+{
+  struct cursor *c = (struct cursor *) cursor;
+  struct dwarf_cursor *d = &c->dwarf;
+  unw_trace_cache_t *cache;
+  unw_word_t sp, pc, cfa, r7, lr;
+  int maxdepth = 0;
+  int depth = 0;
+  int ret;
+
+  /* Check input parametres. */
+  if (unlikely(! cursor || ! buffer || ! size || (maxdepth = *size) <= 0))
+    return -UNW_EINVAL;
+
+  Debug (1, "begin ip 0x%x cfa 0x%x\n", d->ip, d->cfa);
+
+  /* Tell core dwarf routines to call back to us. */
+  d->stash_frames = 1;
+
+  /* Determine initial register values. These are direct access safe
+     because we know they come from the initial machine context. */
+  pc = d->ip;
+  sp = cfa = d->cfa;
+  ACCESS_MEM_FAST(ret, 0, d, DWARF_GET_LOC(d->loc[UNW_ARM_R7]), r7);
+  assert(ret == 0);
+  lr = 0;
+
+  /* Get frame cache. */
+  if (unlikely(! (cache = trace_cache_get())))
+  {
+    Debug (1, "returning %d, cannot get trace cache\n", -UNW_ENOMEM);
+    *size = 0;
+    d->stash_frames = 0;
+    return -UNW_ENOMEM;
+  }
+
+  /* Trace the stack upwards, starting from current PC.  Adjust
+     the PC address for previous/next instruction as the main
+     unwinding logic would also do.  We undo this before calling
+     back into unw_step(). */
+  while (depth < maxdepth)
+  {
+    pc -= d->use_prev_instr;
+    Debug (2, "depth %d cfa 0x%x pc 0x%x sp 0x%x r7 0x%x\n",
+           depth, cfa, pc, sp, r7);
+
+    /* See if we have this address cached.  If not, evaluate enough of
+       the dwarf unwind information to fill the cache line data, or to
+       decide this frame cannot be handled in fast trace mode.  We
+       cache negative results too to prevent unnecessary dwarf parsing
+       for common failures. */
+    unw_tdep_frame_t *f = trace_lookup (cursor, cache, cfa, pc, r7, sp);
+
+    /* If we don't have information for this frame, give up. */
+    if (unlikely(! f))
+    {
+      ret = -UNW_ENOINFO;
+      break;
+    }
+
+    Debug (3, "frame va %x type %d last %d cfa %s+%d r7 @ cfa%+d lr @ cfa%+d sp @ cfa%+d\n",
+           f->virtual_address, f->frame_type, f->last_frame,
+           f->cfa_reg_sp ? "sp" : "r7", f->cfa_reg_offset,
+           f->r7_cfa_offset, f->lr_cfa_offset, f->sp_cfa_offset);
+
+    assert (f->virtual_address == pc);
+
+    /* Stop if this was the last frame.  In particular don't evaluate
+       new register values as it may not be safe - we don't normally
+       run with full validation on, and do not want to - and there's
+       enough bad unwind info floating around that we need to trust
+       what unw_step() previously said, in potentially bogus frames. */
+    if (f->last_frame)
+      break;
+
+    /* Evaluate CFA and registers for the next frame. */
+    switch (f->frame_type)
+    {
+    case UNW_ARM_FRAME_GUESSED:
+      /* Fall thru to standard processing after forcing validation. */
+      c->validate = 1;
+
+    case UNW_ARM_FRAME_STANDARD:
+      /* Advance standard traceable frame. */
+      cfa = (f->cfa_reg_sp ? sp : r7) + f->cfa_reg_offset;
+      if (likely(f->lr_cfa_offset != -1))
+        ACCESS_MEM_FAST(ret, c->validate, d, cfa + f->lr_cfa_offset, pc);
+      else if (lr != 0)
+      {
+        /* Use the saved link register as the new pc. */
+        pc = lr;
+        lr = 0;
+      }
+      if (likely(ret >= 0) && likely(f->r7_cfa_offset != -1))
+        ACCESS_MEM_FAST(ret, c->validate, d, cfa + f->r7_cfa_offset, r7);
+
+      /* Don't bother reading SP from DWARF, CFA becomes new SP. */
+      sp = cfa;
+
+      /* Next frame needs to back up for unwind info lookup. */
+      d->use_prev_instr = 1;
+      break;
+
+    case UNW_ARM_FRAME_SIGRETURN:
+      cfa = cfa + f->cfa_reg_offset; /* cfa now points to ucontext_t.  */
+
+      ACCESS_MEM_FAST(ret, c->validate, d, cfa + LINUX_SC_PC_OFF, pc);
+      if (likely(ret >= 0))
+        ACCESS_MEM_FAST(ret, c->validate, d, cfa + LINUX_SC_R7_OFF, r7);
+      if (likely(ret >= 0))
+        ACCESS_MEM_FAST(ret, c->validate, d, cfa + LINUX_SC_SP_OFF, sp);
+      /* Save the link register here in case we end up in a function that
+         doesn't save the link register in the prologue, e.g. kill. */
+      if (likely(ret >= 0))
+        ACCESS_MEM_FAST(ret, c->validate, d, cfa + LINUX_SC_LR_OFF, lr);
+
+      /* Resume stack at signal restoration point. The stack is not
+         necessarily continuous here, especially with sigaltstack(). */
+      cfa = sp;
+
+      /* Next frame should not back up. */
+      d->use_prev_instr = 0;
+      break;
+
+    default:
+      /* We cannot trace through this frame, give up and tell the
+          caller we had to stop.  Data collected so far may still be
+          useful to the caller, so let it know how far we got.  */
+      ret = -UNW_ESTOPUNWIND;
+      break;
+    }
+
+    Debug (4, "new cfa 0x%x pc 0x%x sp 0x%x r7 0x%x\n",
+           cfa, pc, sp, r7);
+
+    /* If we failed or ended up somewhere bogus, stop. */
+    if (unlikely(ret < 0 || pc < 0x4000))
+      break;
+
+    /* Record this address in stack trace. We skipped the first address. */
+    buffer[depth++] = (void *) (pc - d->use_prev_instr);
+  }
+
+#if UNW_DEBUG
+  Debug (1, "returning %d, depth %d\n", ret, depth);
+#endif
+  *size = depth;
+  return ret;
+}
+
diff --git a/frysk-imports/libunwind/src/arm/Lex_tables.c b/frysk-imports/libunwind/src/arm/Lex_tables.c
new file mode 100644
index 0000000..4a4f925
--- /dev/null
+++ b/frysk-imports/libunwind/src/arm/Lex_tables.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Gex_tables.c"
+#endif
diff --git a/frysk-imports/libunwind/src/arm/Lstash_frame.c b/frysk-imports/libunwind/src/arm/Lstash_frame.c
new file mode 100644
index 0000000..7758780
--- /dev/null
+++ b/frysk-imports/libunwind/src/arm/Lstash_frame.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Gstash_frame.c"
+#endif
diff --git a/frysk-imports/libunwind/src/arm/Ltrace.c b/frysk-imports/libunwind/src/arm/Ltrace.c
new file mode 100644
index 0000000..24b7b3c
--- /dev/null
+++ b/frysk-imports/libunwind/src/arm/Ltrace.c
@@ -0,0 +1,6 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Gtrace.c"
+#endif
+
diff --git a/frysk-imports/libunwind/src/arm/getcontext.S b/frysk-imports/libunwind/src/arm/getcontext.S
index 3b9abda..c52992b 100644
--- a/frysk-imports/libunwind/src/arm/getcontext.S
+++ b/frysk-imports/libunwind/src/arm/getcontext.S
@@ -50,3 +50,7 @@ _Uarm_getcontext:
 	str r1, [r0, #15 * 4]
 	ldmfd sp!, {r0, r1}
 	bx lr
+#ifdef __linux__
+ /* We do not need executable stack.  */
+ .section  .note.GNU-stack,"",%progbits
+#endif
diff --git a/frysk-imports/libunwind/src/arm/init.h b/frysk-imports/libunwind/src/arm/init.h
index 5b3f927..6379d8e 100644
--- a/frysk-imports/libunwind/src/arm/init.h
+++ b/frysk-imports/libunwind/src/arm/init.h
@@ -25,43 +25,50 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #include "unwind_i.h"
 
 static inline int
-common_init (struct cursor *c)
+common_init (struct cursor *c, unsigned use_prev_instr)
 {
   int ret, i;
 
-  c->dwarf.loc[R0] = DWARF_REG_LOC (&c->dwarf, UNW_ARM_R0);
-  c->dwarf.loc[R1] = DWARF_REG_LOC (&c->dwarf, UNW_ARM_R1);
-  c->dwarf.loc[R2] = DWARF_REG_LOC (&c->dwarf, UNW_ARM_R2);
-  c->dwarf.loc[R3] = DWARF_REG_LOC (&c->dwarf, UNW_ARM_R3);
-  c->dwarf.loc[R4] = DWARF_REG_LOC (&c->dwarf, UNW_ARM_R4);
-  c->dwarf.loc[R5] = DWARF_REG_LOC (&c->dwarf, UNW_ARM_R5);
-  c->dwarf.loc[R6] = DWARF_REG_LOC (&c->dwarf, UNW_ARM_R6);
-  c->dwarf.loc[R7] = DWARF_REG_LOC (&c->dwarf, UNW_ARM_R7);
-  c->dwarf.loc[R8] = DWARF_REG_LOC (&c->dwarf, UNW_ARM_R8);
-  c->dwarf.loc[R9] = DWARF_REG_LOC (&c->dwarf, UNW_ARM_R9);
-  c->dwarf.loc[R10] = DWARF_REG_LOC (&c->dwarf, UNW_ARM_R10);
-  c->dwarf.loc[R11] = DWARF_REG_LOC (&c->dwarf, UNW_ARM_R11);
-  c->dwarf.loc[R12] = DWARF_REG_LOC (&c->dwarf, UNW_ARM_R12);
-  c->dwarf.loc[R13] = DWARF_REG_LOC (&c->dwarf, UNW_ARM_R13);
-  c->dwarf.loc[R14] = DWARF_REG_LOC (&c->dwarf, UNW_ARM_R14);
-  c->dwarf.loc[R15] = DWARF_REG_LOC (&c->dwarf, UNW_ARM_R15);
-  for (i = R15 + 1; i < DWARF_NUM_PRESERVED_REGS; ++i)
+  c->dwarf.loc[UNW_ARM_R0] = DWARF_REG_LOC (&c->dwarf, UNW_ARM_R0);
+  c->dwarf.loc[UNW_ARM_R1] = DWARF_REG_LOC (&c->dwarf, UNW_ARM_R1);
+  c->dwarf.loc[UNW_ARM_R2] = DWARF_REG_LOC (&c->dwarf, UNW_ARM_R2);
+  c->dwarf.loc[UNW_ARM_R3] = DWARF_REG_LOC (&c->dwarf, UNW_ARM_R3);
+  c->dwarf.loc[UNW_ARM_R4] = DWARF_REG_LOC (&c->dwarf, UNW_ARM_R4);
+  c->dwarf.loc[UNW_ARM_R5] = DWARF_REG_LOC (&c->dwarf, UNW_ARM_R5);
+  c->dwarf.loc[UNW_ARM_R6] = DWARF_REG_LOC (&c->dwarf, UNW_ARM_R6);
+  c->dwarf.loc[UNW_ARM_R7] = DWARF_REG_LOC (&c->dwarf, UNW_ARM_R7);
+  c->dwarf.loc[UNW_ARM_R8] = DWARF_REG_LOC (&c->dwarf, UNW_ARM_R8);
+  c->dwarf.loc[UNW_ARM_R9] = DWARF_REG_LOC (&c->dwarf, UNW_ARM_R9);
+  c->dwarf.loc[UNW_ARM_R10] = DWARF_REG_LOC (&c->dwarf, UNW_ARM_R10);
+  c->dwarf.loc[UNW_ARM_R11] = DWARF_REG_LOC (&c->dwarf, UNW_ARM_R11);
+  c->dwarf.loc[UNW_ARM_R12] = DWARF_REG_LOC (&c->dwarf, UNW_ARM_R12);
+  c->dwarf.loc[UNW_ARM_R13] = DWARF_REG_LOC (&c->dwarf, UNW_ARM_R13);
+  c->dwarf.loc[UNW_ARM_R14] = DWARF_REG_LOC (&c->dwarf, UNW_ARM_R14);
+  c->dwarf.loc[UNW_ARM_R15] = DWARF_REG_LOC (&c->dwarf, UNW_ARM_R15);
+  for (i = UNW_ARM_R15 + 1; i < DWARF_NUM_PRESERVED_REGS; ++i)
     c->dwarf.loc[i] = DWARF_NULL_LOC;
 
-  ret = dwarf_get (&c->dwarf, c->dwarf.loc[R15], &c->dwarf.ip);
+  ret = dwarf_get (&c->dwarf, c->dwarf.loc[UNW_ARM_R15], &c->dwarf.ip);
   if (ret < 0)
     return ret;
 
   /* FIXME: correct for ARM?  */
   ret = dwarf_get (&c->dwarf, DWARF_REG_LOC (&c->dwarf, UNW_ARM_R13),
-		   &c->dwarf.cfa);
+                   &c->dwarf.cfa);
   if (ret < 0)
     return ret;
 
+  c->sigcontext_format = ARM_SCF_NONE;
+  c->sigcontext_addr = 0;
+  c->sigcontext_sp = 0;
+  c->sigcontext_pc = 0;
+
   /* FIXME: Initialisation for other registers.  */
 
   c->dwarf.args_size = 0;
   c->dwarf.ret_addr_column = 0;
+  c->dwarf.stash_frames = 0;
+  c->dwarf.use_prev_instr = use_prev_instr;
   c->dwarf.pi_valid = 0;
   c->dwarf.pi_is_dynamic = 0;
   c->dwarf.hint = 0;
diff --git a/frysk-imports/libunwind/src/arm/is_fpreg.c b/frysk-imports/libunwind/src/arm/is_fpreg.c
index d8b17ae..3b36a03 100644
--- a/frysk-imports/libunwind/src/arm/is_fpreg.c
+++ b/frysk-imports/libunwind/src/arm/is_fpreg.c
@@ -31,9 +31,9 @@ PROTECTED int
 unw_is_fpreg (int regnum)
 {
   return ((regnum >= UNW_ARM_S0 && regnum <= UNW_ARM_S31)
-	  || (regnum >= UNW_ARM_F0 && regnum <= UNW_ARM_F7)
-	  || (regnum >= UNW_ARM_wCGR0 && regnum <= UNW_ARM_wCGR7)
-	  || (regnum >= UNW_ARM_wR0 && regnum <= UNW_ARM_wR15)
-	  || (regnum >= UNW_ARM_wC0 && regnum <= UNW_ARM_wC7)
-	  || (regnum >= UNW_ARM_D0 && regnum <= UNW_ARM_D31));
+          || (regnum >= UNW_ARM_F0 && regnum <= UNW_ARM_F7)
+          || (regnum >= UNW_ARM_wCGR0 && regnum <= UNW_ARM_wCGR7)
+          || (regnum >= UNW_ARM_wR0 && regnum <= UNW_ARM_wR15)
+          || (regnum >= UNW_ARM_wC0 && regnum <= UNW_ARM_wC7)
+          || (regnum >= UNW_ARM_D0 && regnum <= UNW_ARM_D31));
 }
diff --git a/frysk-imports/libunwind/src/arm/offsets.h b/frysk-imports/libunwind/src/arm/offsets.h
index 0593685..a63847b 100644
--- a/frysk-imports/libunwind/src/arm/offsets.h
+++ b/frysk-imports/libunwind/src/arm/offsets.h
@@ -4,33 +4,33 @@
 
 /* Offsets for ARM Linux "ucontext_t":  */
 
-#define LINUX_UC_FLAGS_OFF	0x00
-#define LINUX_UC_LINK_OFF	0x04
-#define LINUX_UC_STACK_OFF	0x08
-#define LINUX_UC_MCONTEXT_OFF	0x14
-#define LINUX_UC_SIGMASK_OFF	0x68
-#define LINUX_UC_REGSPACE_OFF	0xE8
+#define LINUX_UC_FLAGS_OFF      0x00
+#define LINUX_UC_LINK_OFF       0x04
+#define LINUX_UC_STACK_OFF      0x08
+#define LINUX_UC_MCONTEXT_OFF   0x14
+#define LINUX_UC_SIGMASK_OFF    0x68
+#define LINUX_UC_REGSPACE_OFF   0xE8
 
 /* Offsets for ARM Linux "struct sigcontext":  */
 
-#define LINUX_SC_TRAPNO_OFF	0x00
-#define LINUX_SC_ERRORCODE_OFF	0x04
-#define LINUX_SC_OLDMASK_OFF	0x08
-#define LINUX_SC_R0_OFF		0x0C
-#define LINUX_SC_R1_OFF		0x10
-#define LINUX_SC_R2_OFF		0x14
-#define LINUX_SC_R3_OFF		0x18
-#define LINUX_SC_R4_OFF		0x1C
-#define LINUX_SC_R5_OFF		0x20
-#define LINUX_SC_R6_OFF		0x24
-#define LINUX_SC_R7_OFF		0x28
-#define LINUX_SC_R8_OFF		0x2C
-#define LINUX_SC_R9_OFF		0x30
-#define LINUX_SC_R10_OFF	0x34
-#define LINUX_SC_FP_OFF		0x38
-#define LINUX_SC_IP_OFF		0x3C
-#define LINUX_SC_SP_OFF		0x40
-#define LINUX_SC_LR_OFF		0x44
-#define LINUX_SC_PC_OFF		0x48
-#define LINUX_SC_CPSR_OFF	0x4C
-#define LINUX_SC_FAULTADDR_OFF	0x50
+#define LINUX_SC_TRAPNO_OFF     0x00
+#define LINUX_SC_ERRORCODE_OFF  0x04
+#define LINUX_SC_OLDMASK_OFF    0x08
+#define LINUX_SC_R0_OFF         0x0C
+#define LINUX_SC_R1_OFF         0x10
+#define LINUX_SC_R2_OFF         0x14
+#define LINUX_SC_R3_OFF         0x18
+#define LINUX_SC_R4_OFF         0x1C
+#define LINUX_SC_R5_OFF         0x20
+#define LINUX_SC_R6_OFF         0x24
+#define LINUX_SC_R7_OFF         0x28
+#define LINUX_SC_R8_OFF         0x2C
+#define LINUX_SC_R9_OFF         0x30
+#define LINUX_SC_R10_OFF        0x34
+#define LINUX_SC_FP_OFF         0x38
+#define LINUX_SC_IP_OFF         0x3C
+#define LINUX_SC_SP_OFF         0x40
+#define LINUX_SC_LR_OFF         0x44
+#define LINUX_SC_PC_OFF         0x48
+#define LINUX_SC_CPSR_OFF       0x4C
+#define LINUX_SC_FAULTADDR_OFF  0x50
diff --git a/frysk-imports/libunwind/src/arm/siglongjmp.S b/frysk-imports/libunwind/src/arm/siglongjmp.S
index 87f939e..4df0736 100644
--- a/frysk-imports/libunwind/src/arm/siglongjmp.S
+++ b/frysk-imports/libunwind/src/arm/siglongjmp.S
@@ -6,3 +6,7 @@
 _UI_siglongjmp_cont:
 _UI_longjmp_cont:
 	bx lr
+#ifdef __linux__
+ /* We do not need executable stack.  */
+ .section  .note.GNU-stack,"",%progbits
+#endif
diff --git a/frysk-imports/libunwind/src/arm/unwind_i.h b/frysk-imports/libunwind/src/arm/unwind_i.h
index f0949fa..4dabf21 100644
--- a/frysk-imports/libunwind/src/arm/unwind_i.h
+++ b/frysk-imports/libunwind/src/arm/unwind_i.h
@@ -25,15 +25,35 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #ifndef unwind_i_h
 #define unwind_i_h
 
-#include <memory.h>
 #include <stdint.h>
 
 #include <libunwind-arm.h>
 
 #include "libunwind_i.h"
 
-#define arm_local_addr_space_init	UNW_OBJ(local_addr_space_init)
+/* DWARF column numbers for ARM: */
+#define R7      7
+#define SP      13
+#define LR      14
+#define PC      15
+
+#define arm_lock                        UNW_OBJ(lock)
+#define arm_local_resume                UNW_OBJ(local_resume)
+#define arm_local_addr_space_init       UNW_OBJ(local_addr_space_init)
 
 extern void arm_local_addr_space_init (void);
+extern int arm_local_resume (unw_addr_space_t as, unw_cursor_t *cursor,
+                             void *arg);
+/* By-pass calls to access_mem() when known to be safe. */
+#ifdef UNW_LOCAL_ONLY
+# undef ACCESS_MEM_FAST
+# define ACCESS_MEM_FAST(ret,validate,cur,addr,to)                     \
+  do {                                                                 \
+    if (unlikely(validate))                                            \
+      (ret) = dwarf_get ((cur), DWARF_MEM_LOC ((cur), (addr)), &(to)); \
+    else                                                               \
+      (ret) = 0, (to) = *(unw_word_t *)(addr);                         \
+  } while (0)
+#endif
 
 #endif /* unwind_i_h */
diff --git a/frysk-imports/libunwind/src/coredump/README b/frysk-imports/libunwind/src/coredump/README
new file mode 100644
index 0000000..204493c
--- /dev/null
+++ b/frysk-imports/libunwind/src/coredump/README
@@ -0,0 +1,8 @@
+This code is based on "unwinding via ptrace" code from ptrace/
+directory.
+
+Files with names starting with _UCD_ are substantially changed
+from their ptrace/_UPT_... progenitors.
+
+Files which still have _UPT_... names are either verbiatim copies
+from ptrace/, or unimplemented stubs.
diff --git a/frysk-imports/libunwind/src/coredump/_UCD_access_mem.c b/frysk-imports/libunwind/src/coredump/_UCD_access_mem.c
new file mode 100644
index 0000000..1fdbd12
--- /dev/null
+++ b/frysk-imports/libunwind/src/coredump/_UCD_access_mem.c
@@ -0,0 +1,98 @@
+/* libunwind - a platform-independent unwind library
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "_UCD_lib.h"
+#include "_UCD_internal.h"
+
+int
+_UCD_access_mem(unw_addr_space_t as, unw_word_t addr, unw_word_t *val,
+                 int write, void *arg)
+{
+  if (write)
+    {
+      Debug(0, "write is not supported\n");
+      return -UNW_EINVAL;
+    }
+
+  struct UCD_info *ui = arg;
+
+  unw_word_t addr_last = addr + sizeof(*val)-1;
+  coredump_phdr_t *phdr;
+  unsigned i;
+  for (i = 0; i < ui->phdrs_count; i++)
+    {
+      phdr = &ui->phdrs[i];
+      if (phdr->p_vaddr <= addr && addr_last < phdr->p_vaddr + phdr->p_memsz)
+        {
+          goto found;
+        }
+    }
+  Debug(1, "addr 0x%llx is unmapped\n", (unsigned long long)addr);
+  return -UNW_EINVAL;
+
+ found: ;
+
+  const char *filename UNUSED;
+  off_t fileofs;
+  int fd;
+  if (addr_last >= phdr->p_vaddr + phdr->p_filesz)
+    {
+      /* This part of mapped address space is not present in coredump file */
+      /* Do we have it in the backup file? */
+      if (phdr->backing_fd < 0)
+        {
+          Debug(1, "access to not-present data in phdr[%d]: addr:0x%llx\n",
+                                i, (unsigned long long)addr
+                        );
+          return -UNW_EINVAL;
+        }
+      filename = phdr->backing_filename;
+      fileofs = addr - phdr->p_vaddr;
+      fd = phdr->backing_fd;
+      goto read;
+    }
+
+  filename = ui->coredump_filename;
+  fileofs = phdr->p_offset + (addr - phdr->p_vaddr);
+  fd = ui->coredump_fd;
+ read:
+  if (lseek(fd, fileofs, SEEK_SET) != fileofs)
+    goto read_error;
+  if (read(fd, val, sizeof(*val)) != sizeof(*val))
+    goto read_error;
+
+  Debug(1, "0x%llx <- [addr:0x%llx fileofs:0x%llx]\n",
+        (unsigned long long)(*val),
+        (unsigned long long)addr,
+        (unsigned long long)fileofs
+  );
+  return 0;
+
+ read_error:
+  Debug(1, "access out of file: addr:0x%llx fileofs:%llx file:'%s'\n",
+        (unsigned long long)addr,
+        (unsigned long long)fileofs,
+        filename
+  );
+  return -UNW_EINVAL;
+}
diff --git a/frysk-imports/libunwind/src/coredump/_UCD_access_reg_freebsd.c b/frysk-imports/libunwind/src/coredump/_UCD_access_reg_freebsd.c
new file mode 100644
index 0000000..585b7e2
--- /dev/null
+++ b/frysk-imports/libunwind/src/coredump/_UCD_access_reg_freebsd.c
@@ -0,0 +1,118 @@
+/* libunwind - a platform-independent unwind library
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "_UCD_lib.h"
+
+#include "_UCD_internal.h"
+
+int
+_UCD_access_reg (unw_addr_space_t as,
+                                unw_regnum_t regnum, unw_word_t *valp,
+                                int write, void *arg)
+{
+  if (write)
+    {
+      Debug(0, "write is not supported\n");
+      return -UNW_EINVAL;
+    }
+
+  struct UCD_info *ui = arg;
+
+#if defined(UNW_TARGET_X86)
+  switch (regnum) {
+  case UNW_X86_EAX:
+     *valp = ui->prstatus->pr_reg.r_eax;
+     break;
+  case UNW_X86_EDX:
+     *valp = ui->prstatus->pr_reg.r_edx;
+     break;
+  case UNW_X86_ECX:
+     *valp = ui->prstatus->pr_reg.r_ecx;
+     break;
+  case UNW_X86_EBX:
+     *valp = ui->prstatus->pr_reg.r_ebx;
+     break;
+  case UNW_X86_ESI:
+     *valp = ui->prstatus->pr_reg.r_esi;
+     break;
+  case UNW_X86_EDI:
+     *valp = ui->prstatus->pr_reg.r_edi;
+     break;
+  case UNW_X86_EBP:
+     *valp = ui->prstatus->pr_reg.r_ebp;
+     break;
+  case UNW_X86_ESP:
+     *valp = ui->prstatus->pr_reg.r_esp;
+     break;
+  case UNW_X86_EIP:
+     *valp = ui->prstatus->pr_reg.r_eip;
+     break;
+  case UNW_X86_EFLAGS:
+     *valp = ui->prstatus->pr_reg.r_eflags;
+     break;
+  case UNW_X86_TRAPNO:
+     *valp = ui->prstatus->pr_reg.r_trapno;
+     break;
+  default:
+      Debug(0, "bad regnum:%d\n", regnum);
+      return -UNW_EINVAL;
+  };
+#elif defined(UNW_TARGET_X86_64)
+  switch (regnum) {
+  case UNW_X86_64_RAX:
+     *valp = ui->prstatus->pr_reg.r_rax;
+     break;
+  case UNW_X86_64_RDX:
+     *valp = ui->prstatus->pr_reg.r_rdx;
+     break;
+  case UNW_X86_64_RCX:
+     *valp = ui->prstatus->pr_reg.r_rcx;
+     break;
+  case UNW_X86_64_RBX:
+     *valp = ui->prstatus->pr_reg.r_rbx;
+     break;
+  case UNW_X86_64_RSI:
+     *valp = ui->prstatus->pr_reg.r_rsi;
+     break;
+  case UNW_X86_64_RDI:
+     *valp = ui->prstatus->pr_reg.r_rdi;
+     break;
+  case UNW_X86_64_RBP:
+     *valp = ui->prstatus->pr_reg.r_rbp;
+     break;
+  case UNW_X86_64_RSP:
+     *valp = ui->prstatus->pr_reg.r_rsp;
+     break;
+  case UNW_X86_64_RIP:
+     *valp = ui->prstatus->pr_reg.r_rip;
+     break;
+  default:
+      Debug(0, "bad regnum:%d\n", regnum);
+      return -UNW_EINVAL;
+  };
+#else
+#error Port me
+#endif
+
+  return 0;
+}
diff --git a/frysk-imports/libunwind/src/coredump/_UCD_access_reg_linux.c b/frysk-imports/libunwind/src/coredump/_UCD_access_reg_linux.c
new file mode 100644
index 0000000..4b5994f
--- /dev/null
+++ b/frysk-imports/libunwind/src/coredump/_UCD_access_reg_linux.c
@@ -0,0 +1,143 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com>
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "_UCD_lib.h"
+
+#include "_UCD_internal.h"
+
+int
+_UCD_access_reg (unw_addr_space_t as,
+                                unw_regnum_t regnum, unw_word_t *valp,
+                                int write, void *arg)
+{
+  struct UCD_info *ui = arg;
+
+  if (write)
+    {
+      Debug(0, "write is not supported\n");
+      return -UNW_EINVAL;
+    }
+
+#if defined(UNW_TARGET_AARCH64)
+  if (regnum < 0 || regnum >= UNW_AARCH64_FPCR)
+    goto badreg;
+#elif defined(UNW_TARGET_ARM)
+  if (regnum < 0 || regnum >= 16)
+    goto badreg;
+#elif defined(UNW_TARGET_SH)
+  if (regnum < 0 || regnum > UNW_SH_PR)
+    goto badreg;
+#elif defined(UNW_TARGET_TILEGX)
+  if (regnum < 0 || regnum > UNW_TILEGX_CFA)
+    goto badreg;
+#else
+#if defined(UNW_TARGET_MIPS)
+  static const uint8_t remap_regs[] =
+    {
+      [UNW_MIPS_R0]  = EF_REG0,
+      [UNW_MIPS_R1]  = EF_REG1,
+      [UNW_MIPS_R2]  = EF_REG2,
+      [UNW_MIPS_R3]  = EF_REG3,
+      [UNW_MIPS_R4]  = EF_REG4,
+      [UNW_MIPS_R5]  = EF_REG5,
+      [UNW_MIPS_R6]  = EF_REG6,
+      [UNW_MIPS_R7]  = EF_REG7,
+      [UNW_MIPS_R8]  = EF_REG8,
+      [UNW_MIPS_R9]  = EF_REG9,
+      [UNW_MIPS_R10] = EF_REG10,
+      [UNW_MIPS_R11] = EF_REG11,
+      [UNW_MIPS_R12] = EF_REG12,
+      [UNW_MIPS_R13] = EF_REG13,
+      [UNW_MIPS_R14] = EF_REG14,
+      [UNW_MIPS_R15] = EF_REG15,
+      [UNW_MIPS_R16] = EF_REG16,
+      [UNW_MIPS_R17] = EF_REG17,
+      [UNW_MIPS_R18] = EF_REG18,
+      [UNW_MIPS_R19] = EF_REG19,
+      [UNW_MIPS_R20] = EF_REG20,
+      [UNW_MIPS_R21] = EF_REG21,
+      [UNW_MIPS_R22] = EF_REG22,
+      [UNW_MIPS_R23] = EF_REG23,
+      [UNW_MIPS_R24] = EF_REG24,
+      [UNW_MIPS_R25] = EF_REG25,
+      [UNW_MIPS_R28] = EF_REG28,
+      [UNW_MIPS_R29] = EF_REG29,
+      [UNW_MIPS_R30] = EF_REG30,
+      [UNW_MIPS_R31] = EF_REG31,
+      [UNW_MIPS_PC]  = EF_CP0_EPC,
+    };
+#elif defined(UNW_TARGET_X86)
+  static const uint8_t remap_regs[] =
+    {
+      /* names from libunwind-x86.h */
+      [UNW_X86_EAX]    = offsetof(struct user_regs_struct, eax) / sizeof(long),
+      [UNW_X86_EDX]    = offsetof(struct user_regs_struct, edx) / sizeof(long),
+      [UNW_X86_ECX]    = offsetof(struct user_regs_struct, ecx) / sizeof(long),
+      [UNW_X86_EBX]    = offsetof(struct user_regs_struct, ebx) / sizeof(long),
+      [UNW_X86_ESI]    = offsetof(struct user_regs_struct, esi) / sizeof(long),
+      [UNW_X86_EDI]    = offsetof(struct user_regs_struct, edi) / sizeof(long),
+      [UNW_X86_EBP]    = offsetof(struct user_regs_struct, ebp) / sizeof(long),
+      [UNW_X86_ESP]    = offsetof(struct user_regs_struct, esp) / sizeof(long),
+      [UNW_X86_EIP]    = offsetof(struct user_regs_struct, eip) / sizeof(long),
+      [UNW_X86_EFLAGS] = offsetof(struct user_regs_struct, eflags) / sizeof(long),
+      [UNW_X86_TRAPNO] = offsetof(struct user_regs_struct, orig_eax) / sizeof(long),
+    };
+#elif defined(UNW_TARGET_X86_64)
+  static const int8_t remap_regs[] =
+    {
+      [UNW_X86_64_RAX]    = offsetof(struct user_regs_struct, rax) / sizeof(long),
+      [UNW_X86_64_RDX]    = offsetof(struct user_regs_struct, rdx) / sizeof(long),
+      [UNW_X86_64_RCX]    = offsetof(struct user_regs_struct, rcx) / sizeof(long),
+      [UNW_X86_64_RBX]    = offsetof(struct user_regs_struct, rbx) / sizeof(long),
+      [UNW_X86_64_RSI]    = offsetof(struct user_regs_struct, rsi) / sizeof(long),
+      [UNW_X86_64_RDI]    = offsetof(struct user_regs_struct, rdi) / sizeof(long),
+      [UNW_X86_64_RBP]    = offsetof(struct user_regs_struct, rbp) / sizeof(long),
+      [UNW_X86_64_RSP]    = offsetof(struct user_regs_struct, rsp) / sizeof(long),
+      [UNW_X86_64_RIP]    = offsetof(struct user_regs_struct, rip) / sizeof(long),
+    };
+#else
+#error Port me
+#endif
+
+  if (regnum < 0 || regnum >= (unw_regnum_t)ARRAY_SIZE(remap_regs))
+    goto badreg;
+
+  regnum = remap_regs[regnum];
+#endif
+
+  /* pr_reg is a long[] array, but it contains struct user_regs_struct's
+   * image.
+   */
+  Debug(1, "pr_reg[%d]:%ld (0x%lx)\n", regnum,
+                (long)ui->prstatus->pr_reg[regnum],
+                (long)ui->prstatus->pr_reg[regnum]
+  );
+  *valp = ui->prstatus->pr_reg[regnum];
+
+  return 0;
+
+badreg:
+  Debug(0, "bad regnum:%d\n", regnum);
+  return -UNW_EINVAL;
+}
diff --git a/frysk-imports/libunwind/src/coredump/_UCD_accessors.c b/frysk-imports/libunwind/src/coredump/_UCD_accessors.c
new file mode 100644
index 0000000..f081180
--- /dev/null
+++ b/frysk-imports/libunwind/src/coredump/_UCD_accessors.c
@@ -0,0 +1,36 @@
+/* libunwind - a platform-independent unwind library
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "_UCD_internal.h"
+
+PROTECTED unw_accessors_t _UCD_accessors =
+  {
+    .find_proc_info             = _UCD_find_proc_info,
+    .put_unwind_info            = _UCD_put_unwind_info,
+    .get_dyn_info_list_addr     = _UCD_get_dyn_info_list_addr,
+    .access_mem                 = _UCD_access_mem,
+    .access_reg                 = _UCD_access_reg,
+    .access_fpreg               = _UCD_access_fpreg,
+    .resume                     = _UCD_resume,
+    .get_proc_name              = _UCD_get_proc_name
+  };
diff --git a/frysk-imports/libunwind/src/coredump/_UCD_create.c b/frysk-imports/libunwind/src/coredump/_UCD_create.c
new file mode 100644
index 0000000..f22664b
--- /dev/null
+++ b/frysk-imports/libunwind/src/coredump/_UCD_create.c
@@ -0,0 +1,417 @@
+/* libunwind - a platform-independent unwind library
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+/* Endian detection */
+#include <limits.h>
+#if defined(HAVE_BYTESWAP_H)
+#include <byteswap.h>
+#endif
+#if defined(HAVE_ENDIAN_H)
+# include <endian.h>
+#elif defined(HAVE_SYS_ENDIAN_H)
+# include <sys/endian.h>
+#endif
+#if defined(__BYTE_ORDER) && __BYTE_ORDER == __BIG_ENDIAN
+# define WE_ARE_BIG_ENDIAN    1
+# define WE_ARE_LITTLE_ENDIAN 0
+#elif defined(__BYTE_ORDER) && __BYTE_ORDER == __LITTLE_ENDIAN
+# define WE_ARE_BIG_ENDIAN    0
+# define WE_ARE_LITTLE_ENDIAN 1
+#elif defined(_BYTE_ORDER) && _BYTE_ORDER == _BIG_ENDIAN
+# define WE_ARE_BIG_ENDIAN    1
+# define WE_ARE_LITTLE_ENDIAN 0
+#elif defined(_BYTE_ORDER) && _BYTE_ORDER == _LITTLE_ENDIAN
+# define WE_ARE_BIG_ENDIAN    0
+# define WE_ARE_LITTLE_ENDIAN 1
+#elif defined(BYTE_ORDER) && BYTE_ORDER == BIG_ENDIAN
+# define WE_ARE_BIG_ENDIAN    1
+# define WE_ARE_LITTLE_ENDIAN 0
+#elif defined(BYTE_ORDER) && BYTE_ORDER == LITTLE_ENDIAN
+# define WE_ARE_BIG_ENDIAN    0
+# define WE_ARE_LITTLE_ENDIAN 1
+#elif defined(__386__)
+# define WE_ARE_BIG_ENDIAN    0
+# define WE_ARE_LITTLE_ENDIAN 1
+#else
+# error "Can't determine endianness"
+#endif
+
+#include <elf.h>
+#include <sys/procfs.h> /* struct elf_prstatus */
+
+#include "_UCD_lib.h"
+#include "_UCD_internal.h"
+
+#define NOTE_DATA(_hdr) STRUCT_MEMBER_P((_hdr), sizeof (Elf32_Nhdr) + UNW_ALIGN((_hdr)->n_namesz, 4))
+#define NOTE_SIZE(_hdr) (sizeof (Elf32_Nhdr) + UNW_ALIGN((_hdr)->n_namesz, 4) + (_hdr)->n_descsz)
+#define NOTE_NEXT(_hdr) STRUCT_MEMBER_P((_hdr), NOTE_SIZE(_hdr))
+#define NOTE_FITS_IN(_hdr, _size) ((_size) >= sizeof (Elf32_Nhdr) && (_size) >= NOTE_SIZE (_hdr))
+#define NOTE_FITS(_hdr, _end) NOTE_FITS_IN((_hdr), (unsigned long)((char *)(_end) - (char *)(_hdr)))
+
+struct UCD_info *
+_UCD_create(const char *filename)
+{
+  union
+    {
+      Elf32_Ehdr h32;
+      Elf64_Ehdr h64;
+    } elf_header;
+#define elf_header32 elf_header.h32
+#define elf_header64 elf_header.h64
+  bool _64bits;
+
+  struct UCD_info *ui = memset(malloc(sizeof(*ui)), 0, sizeof(*ui));
+  ui->edi.di_cache.format = -1;
+  ui->edi.di_debug.format = -1;
+#if UNW_TARGET_IA64
+  ui->edi.ktab.format = -1;
+#endif
+
+  int fd = ui->coredump_fd = open(filename, O_RDONLY);
+  if (fd < 0)
+    goto err;
+  ui->coredump_filename = strdup(filename);
+
+  /* No sane ELF32 file is going to be smaller then ELF64 _header_,
+   * so let's just read 64-bit sized one.
+   */
+  if (read(fd, &elf_header64, sizeof(elf_header64)) != sizeof(elf_header64))
+    {
+      Debug(0, "'%s' is not an ELF file\n", filename);
+      goto err;
+    }
+
+  if (memcmp(&elf_header32, ELFMAG, SELFMAG) != 0)
+    {
+      Debug(0, "'%s' is not an ELF file\n", filename);
+      goto err;
+    }
+
+  if (elf_header32.e_ident[EI_CLASS] != ELFCLASS32
+   && elf_header32.e_ident[EI_CLASS] != ELFCLASS64)
+    {
+      Debug(0, "'%s' is not a 32/64 bit ELF file\n", filename);
+      goto err;
+    }
+
+  if (WE_ARE_LITTLE_ENDIAN != (elf_header32.e_ident[EI_DATA] == ELFDATA2LSB))
+    {
+      Debug(0, "'%s' is endian-incompatible\n", filename);
+      goto err;
+    }
+
+  _64bits = (elf_header32.e_ident[EI_CLASS] == ELFCLASS64);
+  if (_64bits && sizeof(elf_header64.e_entry) > sizeof(off_t))
+    {
+      Debug(0, "Can't process '%s': 64-bit file "
+               "while only %ld bits are supported",
+            filename, 8L * sizeof(off_t));
+      goto err;
+    }
+
+  /* paranoia check */
+  if (_64bits
+            ? 0 /* todo: (elf_header64.e_ehsize != NN || elf_header64.e_phentsize != NN) */
+            : (elf_header32.e_ehsize != 52 || elf_header32.e_phentsize != 32)
+  )
+    {
+      Debug(0, "'%s' has wrong e_ehsize or e_phentsize\n", filename);
+      goto err;
+    }
+
+  off_t ofs = (_64bits ? elf_header64.e_phoff : elf_header32.e_phoff);
+  if (lseek(fd, ofs, SEEK_SET) != ofs)
+    {
+      Debug(0, "Can't read phdrs from '%s'\n", filename);
+      goto err;
+    }
+  unsigned size = ui->phdrs_count = (_64bits ? elf_header64.e_phnum : elf_header32.e_phnum);
+  coredump_phdr_t *phdrs = ui->phdrs = memset(malloc(size * sizeof(phdrs[0])), 0, size * sizeof(phdrs[0]));
+  if (_64bits)
+    {
+      coredump_phdr_t *cur = phdrs;
+      unsigned i = 0;
+      while (i < size)
+        {
+          Elf64_Phdr hdr64;
+          if (read(fd, &hdr64, sizeof(hdr64)) != sizeof(hdr64))
+            {
+              Debug(0, "Can't read phdrs from '%s'\n", filename);
+              goto err;
+            }
+          cur->p_type   = hdr64.p_type  ;
+          cur->p_flags  = hdr64.p_flags ;
+          cur->p_offset = hdr64.p_offset;
+          cur->p_vaddr  = hdr64.p_vaddr ;
+          /*cur->p_paddr  = hdr32.p_paddr ; always 0 */
+//TODO: check that and abort if it isn't?
+          cur->p_filesz = hdr64.p_filesz;
+          cur->p_memsz  = hdr64.p_memsz ;
+          cur->p_align  = hdr64.p_align ;
+          /* cur->backing_filename = NULL; - done by memset */
+          cur->backing_fd = -1;
+          cur->backing_filesize = hdr64.p_filesz;
+          i++;
+          cur++;
+        }
+    } else {
+      coredump_phdr_t *cur = phdrs;
+      unsigned i = 0;
+      while (i < size)
+        {
+          Elf32_Phdr hdr32;
+          if (read(fd, &hdr32, sizeof(hdr32)) != sizeof(hdr32))
+            {
+              Debug(0, "Can't read phdrs from '%s'\n", filename);
+              goto err;
+            }
+          cur->p_type   = hdr32.p_type  ;
+          cur->p_flags  = hdr32.p_flags ;
+          cur->p_offset = hdr32.p_offset;
+          cur->p_vaddr  = hdr32.p_vaddr ;
+          /*cur->p_paddr  = hdr32.p_paddr ; always 0 */
+          cur->p_filesz = hdr32.p_filesz;
+          cur->p_memsz  = hdr32.p_memsz ;
+          cur->p_align  = hdr32.p_align ;
+          /* cur->backing_filename = NULL; - done by memset */
+          cur->backing_fd = -1;
+          cur->backing_filesize = hdr32.p_memsz;
+          i++;
+          cur++;
+        }
+    }
+
+    unsigned i = 0;
+    coredump_phdr_t *cur = phdrs;
+    while (i < size)
+      {
+        Debug(2, "phdr[%03d]: type:%d", i, cur->p_type);
+        if (cur->p_type == PT_NOTE)
+          {
+            Elf32_Nhdr *note_hdr, *note_end;
+            unsigned n_threads;
+
+            ui->note_phdr = malloc(cur->p_filesz);
+            if (lseek(fd, cur->p_offset, SEEK_SET) != (off_t)cur->p_offset
+             || (uoff_t)read(fd, ui->note_phdr, cur->p_filesz) != cur->p_filesz)
+              {
+                    Debug(0, "Can't read PT_NOTE from '%s'\n", filename);
+                    goto err;
+              }
+
+            note_end = STRUCT_MEMBER_P (ui->note_phdr, cur->p_filesz);
+
+            /* Count number of threads */
+            n_threads = 0;
+            note_hdr = (Elf32_Nhdr *)ui->note_phdr;
+            while (NOTE_FITS (note_hdr, note_end))
+              {
+                if (note_hdr->n_type == NT_PRSTATUS)
+                  n_threads++;
+
+                note_hdr = NOTE_NEXT (note_hdr);
+              }
+
+            ui->n_threads = n_threads;
+            ui->threads = malloc(sizeof (void *) * n_threads);
+
+            n_threads = 0;
+            note_hdr = (Elf32_Nhdr *)ui->note_phdr;
+            while (NOTE_FITS (note_hdr, note_end))
+              {
+                if (note_hdr->n_type == NT_PRSTATUS)
+                  ui->threads[n_threads++] = NOTE_DATA (note_hdr);
+
+                note_hdr = NOTE_NEXT (note_hdr);
+              }
+          }
+        if (cur->p_type == PT_LOAD)
+          {
+            Debug(2, " ofs:%08llx va:%08llx filesize:%08llx memsize:%08llx flg:%x",
+                                (unsigned long long) cur->p_offset,
+                                (unsigned long long) cur->p_vaddr,
+                                (unsigned long long) cur->p_filesz,
+                                (unsigned long long) cur->p_memsz,
+                                cur->p_flags
+            );
+            if (cur->p_filesz < cur->p_memsz)
+              Debug(2, " partial");
+            if (cur->p_flags & PF_X)
+              Debug(2, " executable");
+          }
+        Debug(2, "\n");
+        i++;
+        cur++;
+      }
+
+    if (ui->n_threads == 0)
+      {
+        Debug(0, "No NT_PRSTATUS note found in '%s'\n", filename);
+        goto err;
+      }
+
+    ui->prstatus = ui->threads[0];
+
+  return ui;
+
+ err:
+  _UCD_destroy(ui);
+  return NULL;
+}
+
+int _UCD_get_num_threads(struct UCD_info *ui)
+{
+  return ui->n_threads;
+}
+
+void _UCD_select_thread(struct UCD_info *ui, int n)
+{
+  if (n >= 0 && n < ui->n_threads)
+    ui->prstatus = ui->threads[n];
+}
+
+pid_t _UCD_get_pid(struct UCD_info *ui)
+{
+  return ui->prstatus->pr_pid;
+}
+
+int _UCD_get_cursig(struct UCD_info *ui)
+{
+  return ui->prstatus->pr_cursig;
+}
+
+int _UCD_add_backing_file_at_segment(struct UCD_info *ui, int phdr_no, const char *filename)
+{
+  if ((unsigned)phdr_no >= ui->phdrs_count)
+    {
+      Debug(0, "There is no segment %d in this coredump\n", phdr_no);
+      return -1;
+    }
+
+  struct coredump_phdr *phdr = &ui->phdrs[phdr_no];
+  if (phdr->backing_filename)
+    {
+      Debug(0, "Backing file already added to segment %d\n", phdr_no);
+      return -1;
+    }
+
+  int fd = open(filename, O_RDONLY);
+  if (fd < 0)
+    {
+      Debug(0, "Can't open '%s'\n", filename);
+      return -1;
+    }
+
+  phdr->backing_fd = fd;
+  phdr->backing_filename = strdup(filename);
+
+  struct stat statbuf;
+  if (fstat(fd, &statbuf) != 0)
+    {
+      Debug(0, "Can't stat '%s'\n", filename);
+      goto err;
+    }
+  phdr->backing_filesize = (uoff_t)statbuf.st_size;
+
+  if (phdr->p_flags != (PF_X | PF_R))
+    Debug(1, "Note: phdr[%u] is not r-x: flags are 0x%x\n", phdr_no, phdr->p_flags);
+
+  if (phdr->backing_filesize > phdr->p_memsz)
+    {
+      /* This is expected */
+      Debug(2, "Note: phdr[%u] is %lld bytes, file is larger: %lld bytes\n",
+                        phdr_no,
+                        (unsigned long long)phdr->p_memsz,
+                        (unsigned long long)phdr->backing_filesize
+      );
+    }
+//TODO: else loudly complain? Maybe even fail?
+
+  if (phdr->p_filesz != 0)
+    {
+//TODO: loop and compare in smaller blocks
+      char *core_buf = malloc(phdr->p_filesz);
+      char *file_buf = malloc(phdr->p_filesz);
+      if (lseek(ui->coredump_fd, phdr->p_offset, SEEK_SET) != (off_t)phdr->p_offset
+       || (uoff_t)read(ui->coredump_fd, core_buf, phdr->p_filesz) != phdr->p_filesz
+      )
+        {
+          Debug(0, "Error reading from coredump file\n");
+ err_read:
+          free(core_buf);
+          free(file_buf);
+          goto err;
+        }
+      if ((uoff_t)read(fd, file_buf, phdr->p_filesz) != phdr->p_filesz)
+        {
+          Debug(0, "Error reading from '%s'\n", filename);
+          goto err_read;
+        }
+      int r = memcmp(core_buf, file_buf, phdr->p_filesz);
+      free(core_buf);
+      free(file_buf);
+      if (r != 0)
+        {
+          Debug(1, "Note: phdr[%u] first %lld bytes in core dump and in file do not match\n",
+                                phdr_no, (unsigned long long)phdr->p_filesz
+          );
+        } else {
+          Debug(1, "Note: phdr[%u] first %lld bytes in core dump and in file match\n",
+                                phdr_no, (unsigned long long)phdr->p_filesz
+          );
+        }
+    }
+
+  /* Success */
+  return 0;
+
+ err:
+  if (phdr->backing_fd >= 0)
+    {
+      close(phdr->backing_fd);
+      phdr->backing_fd = -1;
+    }
+  free(phdr->backing_filename);
+  phdr->backing_filename = NULL;
+  return -1;
+}
+
+int _UCD_add_backing_file_at_vaddr(struct UCD_info *ui,
+                                   unsigned long vaddr,
+                                   const char *filename)
+{
+  unsigned i;
+  for (i = 0; i < ui->phdrs_count; i++)
+    {
+      struct coredump_phdr *phdr = &ui->phdrs[i];
+      if (phdr->p_vaddr != vaddr)
+        continue;
+      /* It seems to match. Add it. */
+      return _UCD_add_backing_file_at_segment(ui, i, filename);
+    }
+  return -1;
+}
diff --git a/frysk-imports/libunwind/src/coredump/_UCD_destroy.c b/frysk-imports/libunwind/src/coredump/_UCD_destroy.c
new file mode 100644
index 0000000..5aff989
--- /dev/null
+++ b/frysk-imports/libunwind/src/coredump/_UCD_destroy.c
@@ -0,0 +1,50 @@
+/* libunwind - a platform-independent unwind library
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "_UCD_internal.h"
+
+void
+_UCD_destroy (struct UCD_info *ui)
+{
+  if (!ui)
+    return;
+
+  if (ui->coredump_fd >= 0)
+    close(ui->coredump_fd);
+  free(ui->coredump_filename);
+
+  invalidate_edi (&ui->edi);
+
+  unsigned i;
+  for (i = 0; i < ui->phdrs_count; i++)
+    {
+      struct coredump_phdr *phdr = &ui->phdrs[i];
+      free(phdr->backing_filename);
+      if (phdr->backing_fd >= 0)
+        close(phdr->backing_fd);
+    }
+
+  free(ui->note_phdr);
+
+  free(ui);
+}
diff --git a/frysk-imports/libunwind/src/coredump/_UCD_elf_map_image.c b/frysk-imports/libunwind/src/coredump/_UCD_elf_map_image.c
new file mode 100644
index 0000000..4b3db0b
--- /dev/null
+++ b/frysk-imports/libunwind/src/coredump/_UCD_elf_map_image.c
@@ -0,0 +1,98 @@
+/* libunwind - a platform-independent unwind library
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include <elf.h>
+
+#include "_UCD_lib.h"
+#include "_UCD_internal.h"
+
+static coredump_phdr_t *
+CD_elf_map_image(struct UCD_info *ui, coredump_phdr_t *phdr)
+{
+  struct elf_image *ei = &ui->edi.ei;
+
+  if (phdr->backing_fd < 0)
+    {
+      /* Note: coredump file contains only phdr->p_filesz bytes.
+       * We want to map bigger area (phdr->p_memsz bytes) to make sure
+       * these pages are allocated, but non-accessible.
+       */
+      /* addr, length, prot, flags, fd, fd_offset */
+      ei->image = mmap(NULL, phdr->p_memsz, PROT_READ, MAP_PRIVATE, ui->coredump_fd, phdr->p_offset);
+      if (ei->image == MAP_FAILED)
+        {
+          ei->image = NULL;
+          return NULL;
+        }
+      ei->size = phdr->p_filesz;
+      size_t remainder_len = phdr->p_memsz - phdr->p_filesz;
+      if (remainder_len > 0)
+        {
+          void *remainder_base = (char*) ei->image + phdr->p_filesz;
+          munmap(remainder_base, remainder_len);
+        }
+    } else {
+      /* We have a backing file for this segment.
+       * This file is always longer than phdr->p_memsz,
+       * and if phdr->p_filesz !=0, first phdr->p_filesz bytes in coredump
+       * are the same as first bytes in the file. (Thus no need to map coredump)
+       * We map the entire file:
+       * unwinding may need data which is past phdr->p_memsz bytes.
+       */
+      /* addr, length, prot, flags, fd, fd_offset */
+      ei->image = mmap(NULL, phdr->backing_filesize, PROT_READ, MAP_PRIVATE, phdr->backing_fd, 0);
+      if (ei->image == MAP_FAILED)
+        {
+          ei->image = NULL;
+          return NULL;
+        }
+      ei->size = phdr->backing_filesize;
+    }
+
+  /* Check ELF header for sanity */
+  if (!elf_w(valid_object)(ei))
+    {
+      munmap(ei->image, ei->size);
+      ei->image = NULL;
+      ei->size = 0;
+      return NULL;
+    }
+
+  return phdr;
+}
+
+HIDDEN coredump_phdr_t *
+_UCD_get_elf_image(struct UCD_info *ui, unw_word_t ip)
+{
+  unsigned i;
+  for (i = 0; i < ui->phdrs_count; i++)
+    {
+      coredump_phdr_t *phdr = &ui->phdrs[i];
+      if (phdr->p_vaddr <= ip && ip < phdr->p_vaddr + phdr->p_memsz)
+        {
+          phdr = CD_elf_map_image(ui, phdr);
+          return phdr;
+        }
+    }
+  return NULL;
+}
diff --git a/frysk-imports/libunwind/src/coredump/_UCD_find_proc_info.c b/frysk-imports/libunwind/src/coredump/_UCD_find_proc_info.c
new file mode 100644
index 0000000..33b66c8
--- /dev/null
+++ b/frysk-imports/libunwind/src/coredump/_UCD_find_proc_info.c
@@ -0,0 +1,163 @@
+/* libunwind - a platform-independent unwind library
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include <elf.h>
+
+#include "_UCD_lib.h"
+#include "_UCD_internal.h"
+
+static int
+get_unwind_info(struct UCD_info *ui, unw_addr_space_t as, unw_word_t ip)
+{
+  unsigned long segbase, mapoff;
+
+#if UNW_TARGET_IA64 && defined(__linux)
+  if (!ui->edi.ktab.start_ip && _Uia64_get_kernel_table (&ui->edi.ktab) < 0)
+    return -UNW_ENOINFO;
+
+  if (ui->edi.ktab.format != -1 && ip >= ui->edi.ktab.start_ip && ip < ui->edi.ktab.end_ip)
+    return 0;
+#endif
+
+  if ((ui->edi.di_cache.format != -1
+       && ip >= ui->edi.di_cache.start_ip && ip < ui->edi.di_cache.end_ip)
+#if UNW_TARGET_ARM
+      || (ui->edi.di_debug.format != -1
+       && ip >= ui->edi.di_arm.start_ip && ip < ui->edi.di_arm.end_ip)
+#endif
+      || (ui->edi.di_debug.format != -1
+       && ip >= ui->edi.di_debug.start_ip && ip < ui->edi.di_debug.end_ip))
+    return 0;
+
+  invalidate_edi (&ui->edi);
+
+  /* Used to be tdep_get_elf_image() in ptrace unwinding code */
+  coredump_phdr_t *phdr = _UCD_get_elf_image(ui, ip);
+  if (!phdr)
+    {
+      Debug(1, "returns error: _UCD_get_elf_image failed\n");
+      return -UNW_ENOINFO;
+    }
+  /* segbase: where it is mapped in virtual memory */
+  /* mapoff: offset in the file */
+  segbase = phdr->p_vaddr;
+  /*mapoff  = phdr->p_offset; WRONG! phdr->p_offset is the offset in COREDUMP file */
+  mapoff  = 0;
+///FIXME. text segment is USUALLY, not always, at offset 0 in the binary/.so file.
+// ensure that at initialization.
+
+  /* Here, SEGBASE is the starting-address of the (mmap'ped) segment
+     which covers the IP we're looking for.  */
+  if (tdep_find_unwind_table(&ui->edi, as, phdr->backing_filename, segbase, mapoff, ip) < 0)
+    {
+      Debug(1, "returns error: tdep_find_unwind_table failed\n");
+      return -UNW_ENOINFO;
+    }
+
+  /* This can happen in corner cases where dynamically generated
+     code falls into the same page that contains the data-segment
+     and the page-offset of the code is within the first page of
+     the executable.  */
+  if (ui->edi.di_cache.format != -1
+      && (ip < ui->edi.di_cache.start_ip || ip >= ui->edi.di_cache.end_ip))
+     ui->edi.di_cache.format = -1;
+
+  if (ui->edi.di_debug.format != -1
+      && (ip < ui->edi.di_debug.start_ip || ip >= ui->edi.di_debug.end_ip))
+     ui->edi.di_debug.format = -1;
+
+  if (ui->edi.di_cache.format == -1
+#if UNW_TARGET_ARM
+      && ui->edi.di_arm.format == -1
+#endif
+      && ui->edi.di_debug.format == -1)
+  {
+    Debug(1, "returns error: all formats are -1\n");
+    return -UNW_ENOINFO;
+  }
+
+  Debug(1, "returns success\n");
+  return 0;
+}
+
+int
+_UCD_find_proc_info (unw_addr_space_t as, unw_word_t ip, unw_proc_info_t *pi,
+                     int need_unwind_info, void *arg)
+{
+  struct UCD_info *ui = arg;
+
+  Debug(1, "entering\n");
+
+  int ret = -UNW_ENOINFO;
+
+  if (get_unwind_info(ui, as, ip) < 0) {
+    Debug(1, "returns error: get_unwind_info failed\n");
+    return -UNW_ENOINFO;
+  }
+
+#if UNW_TARGET_IA64
+  if (ui->edi.ktab.format != -1)
+    {
+      /* The kernel unwind table resides in local memory, so we have
+         to use the local address space to search it.  Since
+         _UCD_put_unwind_info() has no easy way of detecting this
+         case, we simply make a copy of the unwind-info, so
+         _UCD_put_unwind_info() can always free() the unwind-info
+         without ill effects.  */
+      ret = tdep_search_unwind_table (unw_local_addr_space, ip, &ui->edi.ktab, pi,
+                                      need_unwind_info, arg);
+      if (ret >= 0)
+        {
+          if (!need_unwind_info)
+            pi->unwind_info = NULL;
+          else
+            {
+              void *mem = malloc (pi->unwind_info_size);
+
+              if (!mem)
+                return -UNW_ENOMEM;
+              memcpy (mem, pi->unwind_info, pi->unwind_info_size);
+              pi->unwind_info = mem;
+            }
+        }
+    }
+#endif
+
+  if (ret == -UNW_ENOINFO && ui->edi.di_cache.format != -1)
+    ret = tdep_search_unwind_table (as, ip, &ui->edi.di_cache,
+                                    pi, need_unwind_info, arg);
+
+#if UNW_TARGET_ARM
+  if (ret == -UNW_ENOINFO && ui->edi.di_arm.format != -1)
+    ret = tdep_search_unwind_table (as, ip, &ui->edi.di_arm, pi,
+                                    need_unwind_info, arg);
+#endif
+
+  if (ret == -UNW_ENOINFO && ui->edi.di_debug.format != -1)
+    ret = tdep_search_unwind_table (as, ip, &ui->edi.di_debug, pi,
+                                    need_unwind_info, arg);
+
+  Debug(1, "returns %d\n", ret);
+
+  return ret;
+}
diff --git a/frysk-imports/libunwind/src/coredump/_UCD_get_proc_name.c b/frysk-imports/libunwind/src/coredump/_UCD_get_proc_name.c
new file mode 100644
index 0000000..00096c4
--- /dev/null
+++ b/frysk-imports/libunwind/src/coredump/_UCD_get_proc_name.c
@@ -0,0 +1,70 @@
+/* libunwind - a platform-independent unwind library
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "_UCD_lib.h"
+#include "_UCD_internal.h"
+
+
+/* Find the ELF image that contains IP and return the "closest"
+   procedure name, if there is one.  With some caching, this could be
+   sped up greatly, but until an application materializes that's
+   sensitive to the performance of this routine, why bother...  */
+static int
+elf_w (CD_get_proc_name) (struct UCD_info *ui, unw_addr_space_t as, unw_word_t ip,
+                       char *buf, size_t buf_len, unw_word_t *offp)
+{
+  unsigned long segbase, mapoff;
+  int ret;
+
+  /* Used to be tdep_get_elf_image() in ptrace unwinding code */
+  coredump_phdr_t *cphdr = _UCD_get_elf_image(ui, ip);
+  if (!cphdr)
+    {
+      Debug(1, "returns error: _UCD_get_elf_image failed\n");
+      return -UNW_ENOINFO;
+    }
+  /* segbase: where it is mapped in virtual memory */
+  /* mapoff: offset in the file */
+  segbase = cphdr->p_vaddr;
+  /*mapoff  = phdr->p_offset; WRONG! phdr->p_offset is the offset in COREDUMP file */
+  mapoff  = 0;
+
+  ret = elf_w (get_proc_name_in_image) (as, &ui->edi.ei, segbase, mapoff, ip, buf, buf_len, offp);
+
+  return ret;
+}
+
+int
+_UCD_get_proc_name (unw_addr_space_t as, unw_word_t ip,
+                    char *buf, size_t buf_len, unw_word_t *offp, void *arg)
+{
+  struct UCD_info *ui = arg;
+
+#if ELF_CLASS == ELFCLASS64
+  return _Uelf64_CD_get_proc_name (ui, as, ip, buf, buf_len, offp);
+#elif ELF_CLASS == ELFCLASS32
+  return _Uelf32_CD_get_proc_name (ui, as, ip, buf, buf_len, offp);
+#else
+  return -UNW_ENOINFO;
+#endif
+}
diff --git a/frysk-imports/libunwind/src/coredump/_UCD_internal.h b/frysk-imports/libunwind/src/coredump/_UCD_internal.h
new file mode 100644
index 0000000..3c95a2a
--- /dev/null
+++ b/frysk-imports/libunwind/src/coredump/_UCD_internal.h
@@ -0,0 +1,105 @@
+/* libunwind - a platform-independent unwind library
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#ifndef _UCD_internal_h
+#define _UCD_internal_h
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_PROCFS_H
+#include <sys/procfs.h> /* struct elf_prstatus */
+#endif
+#include <errno.h>
+#include <string.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <libunwind-coredump.h>
+
+#include "libunwind_i.h"
+
+
+#if SIZEOF_OFF_T == 4
+typedef uint32_t uoff_t;
+#elif SIZEOF_OFF_T == 8
+typedef uint64_t uoff_t;
+#else
+# error Unknown size of off_t!
+#endif
+
+
+/* Similar to ELF phdrs. p_paddr element is absent,
+ * since it's always 0 in coredumps.
+ */
+struct coredump_phdr
+  {
+    uint32_t p_type;
+    uint32_t p_flags;
+    uoff_t   p_offset;
+    uoff_t   p_vaddr;
+    uoff_t   p_filesz;
+    uoff_t   p_memsz;
+    uoff_t   p_align;
+    /* Data for backing file. If backing_fd < 0, there is no file */
+    uoff_t   backing_filesize;
+    char    *backing_filename; /* for error meesages only */
+    int      backing_fd;
+  };
+
+typedef struct coredump_phdr coredump_phdr_t;
+
+#if defined(HAVE_STRUCT_ELF_PRSTATUS)
+#define PRSTATUS_STRUCT elf_prstatus
+#elif defined(HAVE_STRUCT_PRSTATUS)
+#define PRSTATUS_STRUCT prstatus
+#else
+#define PRSTATUS_STRUCT non_existent
+#endif
+
+struct UCD_info
+  {
+    int big_endian;  /* bool */
+    int coredump_fd;
+    char *coredump_filename; /* for error meesages only */
+    coredump_phdr_t *phdrs; /* array, allocated */
+    unsigned phdrs_count;
+    void *note_phdr; /* allocated or NULL */
+    struct PRSTATUS_STRUCT *prstatus; /* points inside note_phdr */
+    int n_threads;
+    struct PRSTATUS_STRUCT **threads;
+
+    struct elf_dyn_info edi;
+  };
+
+extern coredump_phdr_t * _UCD_get_elf_image(struct UCD_info *ui, unw_word_t ip);
+
+#define STRUCT_MEMBER_P(struct_p, struct_offset) ((void *) ((char*) (struct_p) + (long) (struct_offset)))
+#define STRUCT_MEMBER(member_type, struct_p, struct_offset) (*(member_type*) STRUCT_MEMBER_P ((struct_p), (struct_offset)))
+
+#endif
diff --git a/frysk-imports/libunwind/src/coredump/_UCD_lib.h b/frysk-imports/libunwind/src/coredump/_UCD_lib.h
new file mode 100644
index 0000000..22be32e
--- /dev/null
+++ b/frysk-imports/libunwind/src/coredump/_UCD_lib.h
@@ -0,0 +1,57 @@
+/* libunwind - a platform-independent unwind library
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#ifndef _UCD_lib_h
+#define _UCD_lib_h
+
+#include <assert.h>
+#include <ctype.h>
+#include <dirent.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <inttypes.h>
+#include <setjmp.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <string.h>
+#include <sys/poll.h>
+#include <sys/mman.h>
+#include <sys/socket.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <termios.h>
+#include <time.h>
+#include <unistd.h>
+#include <stdbool.h>
+#include <limits.h>
+#include <sys/param.h>
+#include <pwd.h>
+#include <grp.h>
+#include <syslog.h>
+
+#endif
diff --git a/frysk-imports/libunwind/src/coredump/_UPT_access_fpreg.c b/frysk-imports/libunwind/src/coredump/_UPT_access_fpreg.c
new file mode 100644
index 0000000..0b8b86a
--- /dev/null
+++ b/frysk-imports/libunwind/src/coredump/_UPT_access_fpreg.c
@@ -0,0 +1,34 @@
+/* libunwind - a platform-independent unwind library
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "_UCD_lib.h"
+#include "_UCD_internal.h"
+
+int
+_UCD_access_fpreg (unw_addr_space_t as, unw_regnum_t reg, unw_fpreg_t *val,
+                   int write, void *arg)
+{
+  print_error (__func__);
+  print_error (" not implemented\n");
+  return -UNW_EINVAL;
+}
diff --git a/frysk-imports/libunwind/src/coredump/_UPT_elf.c b/frysk-imports/libunwind/src/coredump/_UPT_elf.c
new file mode 100644
index 0000000..fb7b19a
--- /dev/null
+++ b/frysk-imports/libunwind/src/coredump/_UPT_elf.c
@@ -0,0 +1,5 @@
+/* We need to get a separate copy of the ELF-code into
+   libunwind-coredump since it cannot (and must not) have any ELF
+   dependencies on libunwind.  */
+#include "libunwind_i.h"        /* get ELFCLASS defined */
+#include "../elfxx.c"
diff --git a/frysk-imports/libunwind/src/coredump/_UPT_get_dyn_info_list_addr.c b/frysk-imports/libunwind/src/coredump/_UPT_get_dyn_info_list_addr.c
new file mode 100644
index 0000000..0d11905
--- /dev/null
+++ b/frysk-imports/libunwind/src/coredump/_UPT_get_dyn_info_list_addr.c
@@ -0,0 +1,108 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2003-2005 Hewlett-Packard Co
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "_UCD_lib.h"
+#include "_UCD_internal.h"
+
+#if UNW_TARGET_IA64 && defined(__linux)
+# include "elf64.h"
+# include "os-linux.h"
+
+static inline int
+get_list_addr (unw_addr_space_t as, unw_word_t *dil_addr, void *arg,
+               int *countp)
+{
+  unsigned long lo, hi, off;
+  struct UPT_info *ui = arg;
+  struct map_iterator mi;
+  char path[PATH_MAX];
+  unw_dyn_info_t *di;
+  unw_word_t res;
+  int count = 0;
+
+  maps_init (&mi, ui->pid);
+  while (maps_next (&mi, &lo, &hi, &off))
+    {
+      if (off)
+        continue;
+
+      invalidate_edi (&ui->edi);
+
+      if (elf_map_image (&ui->ei, path) < 0)
+        /* ignore unmappable stuff like "/SYSV00001b58 (deleted)" */
+        continue;
+
+      Debug (16, "checking object %s\n", path);
+
+      di = tdep_find_unwind_table (&ui->edi, as, path, lo, off);
+      if (di)
+        {
+          res = _Uia64_find_dyn_list (as, di, arg);
+          if (res && count++ == 0)
+            {
+              Debug (12, "dyn_info_list_addr = 0x%lx\n", (long) res);
+              *dil_addr = res;
+            }
+        }
+    }
+  maps_close (&mi);
+  *countp = count;
+  return 0;
+}
+
+#else
+
+static inline int
+get_list_addr (unw_addr_space_t as, unw_word_t *dil_addr, void *arg,
+               int *countp)
+{
+# warning Implement get_list_addr(), please.
+  *countp = 0;
+  return 0;
+}
+
+#endif
+
+int
+_UCD_get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dil_addr,
+                             void *arg)
+{
+  int count, ret;
+
+  Debug (12, "looking for dyn_info list\n");
+
+  if ((ret = get_list_addr (as, dil_addr, arg, &count)) < 0)
+    return ret;
+
+  /* If multiple dynamic-info list addresses are found, we would have
+     to determine which was is the one actually in use (since the
+     dynamic name resolution algorithm will pick one "winner").
+     Perhaps we'd have to track them all until we find one that's
+     non-empty.  Hopefully, this case simply will never arise, since
+     only libunwind defines the dynamic info list head. */
+  assert (count <= 1);
+
+  return (count > 0) ? 0 : -UNW_ENOINFO;
+}
diff --git a/frysk-imports/libunwind/src/coredump/_UPT_put_unwind_info.c b/frysk-imports/libunwind/src/coredump/_UPT_put_unwind_info.c
new file mode 100644
index 0000000..462e1d0
--- /dev/null
+++ b/frysk-imports/libunwind/src/coredump/_UPT_put_unwind_info.c
@@ -0,0 +1,36 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2003 Hewlett-Packard Co
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "_UCD_lib.h"
+#include "_UCD_internal.h"
+
+void
+_UCD_put_unwind_info (unw_addr_space_t as, unw_proc_info_t *pi, void *arg)
+{
+  if (!pi->unwind_info)
+    return;
+  free (pi->unwind_info);
+  pi->unwind_info = NULL;
+}
diff --git a/frysk-imports/libunwind/src/coredump/_UPT_resume.c b/frysk-imports/libunwind/src/coredump/_UPT_resume.c
new file mode 100644
index 0000000..a729c90
--- /dev/null
+++ b/frysk-imports/libunwind/src/coredump/_UPT_resume.c
@@ -0,0 +1,35 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2003 Hewlett-Packard Co
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "_UCD_lib.h"
+#include "_UCD_internal.h"
+
+int
+_UCD_resume (unw_addr_space_t as, unw_cursor_t *c, void *arg)
+{
+  print_error (__func__);
+  print_error (" not implemented\n");
+  return -UNW_EINVAL;
+}
diff --git a/frysk-imports/libunwind/src/coredump/libunwind-coredump.pc.in b/frysk-imports/libunwind/src/coredump/libunwind-coredump.pc.in
new file mode 100644
index 0000000..9cb62c0
--- /dev/null
+++ b/frysk-imports/libunwind/src/coredump/libunwind-coredump.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: libunwind-coredump
+Description: libunwind coredump library
+Version: @VERSION@
+Requires: libunwind-generic libunwind
+Libs: -L${libdir} -lunwind-coredump
+Cflags: -I${includedir}
diff --git a/frysk-imports/libunwind/src/dwarf/Gexpr.c b/frysk-imports/libunwind/src/dwarf/Gexpr.c
index 4a01215..b56bb31 100644
--- a/frysk-imports/libunwind/src/dwarf/Gexpr.c
+++ b/frysk-imports/libunwind/src/dwarf/Gexpr.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (c) 2003, 2005 Hewlett-Packard Development Company, L.P.
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -30,81 +30,81 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
    that the stack could at least have a depth of up to 256 elements,
    but the GCC unwinder restricts the depth to 64, which seems
    reasonable so we use the same value here.  */
-#define MAX_EXPR_STACK_SIZE	64
+#define MAX_EXPR_STACK_SIZE     64
 
-#define NUM_OPERANDS(signature)	(((signature) >> 6) & 0x3)
-#define OPND1_TYPE(signature)	(((signature) >> 3) & 0x7)
-#define OPND2_TYPE(signature)	(((signature) >> 0) & 0x7)
+#define NUM_OPERANDS(signature) (((signature) >> 6) & 0x3)
+#define OPND1_TYPE(signature)   (((signature) >> 3) & 0x7)
+#define OPND2_TYPE(signature)   (((signature) >> 0) & 0x7)
 
 #define OPND_SIGNATURE(n, t1, t2) (((n) << 6) | ((t1) << 3) | ((t2) << 0))
-#define OPND1(t1)		OPND_SIGNATURE(1, t1, 0)
-#define OPND2(t1, t2)		OPND_SIGNATURE(2, t1, t2)
-
-#define VAL8	0x0
-#define VAL16	0x1
-#define VAL32	0x2
-#define VAL64	0x3
-#define ULEB128	0x4
-#define SLEB128	0x5
-#define OFFSET	0x6	/* 32-bit offset for 32-bit DWARF, 64-bit otherwise */
-#define ADDR	0x7	/* Machine address.  */
-
-static uint8_t operands[256] =
+#define OPND1(t1)               OPND_SIGNATURE(1, t1, 0)
+#define OPND2(t1, t2)           OPND_SIGNATURE(2, t1, t2)
+
+#define VAL8    0x0
+#define VAL16   0x1
+#define VAL32   0x2
+#define VAL64   0x3
+#define ULEB128 0x4
+#define SLEB128 0x5
+#define OFFSET  0x6     /* 32-bit offset for 32-bit DWARF, 64-bit otherwise */
+#define ADDR    0x7     /* Machine address.  */
+
+static const uint8_t operands[256] =
   {
-    [DW_OP_addr] =		OPND1 (ADDR),
-    [DW_OP_const1u] =		OPND1 (VAL8),
-    [DW_OP_const1s] =		OPND1 (VAL8),
-    [DW_OP_const2u] =		OPND1 (VAL16),
-    [DW_OP_const2s] =		OPND1 (VAL16),
-    [DW_OP_const4u] =		OPND1 (VAL32),
-    [DW_OP_const4s] =		OPND1 (VAL32),
-    [DW_OP_const8u] =		OPND1 (VAL64),
-    [DW_OP_const8s] =		OPND1 (VAL64),
-    [DW_OP_pick] =		OPND1 (VAL8),
-    [DW_OP_plus_uconst] =	OPND1 (ULEB128),
-    [DW_OP_skip] =		OPND1 (VAL16),
-    [DW_OP_bra] =		OPND1 (VAL16),
-    [DW_OP_breg0 +  0] =	OPND1 (SLEB128),
-    [DW_OP_breg0 +  1] =	OPND1 (SLEB128),
-    [DW_OP_breg0 +  2] =	OPND1 (SLEB128),
-    [DW_OP_breg0 +  3] =	OPND1 (SLEB128),
-    [DW_OP_breg0 +  4] =	OPND1 (SLEB128),
-    [DW_OP_breg0 +  5] =	OPND1 (SLEB128),
-    [DW_OP_breg0 +  6] =	OPND1 (SLEB128),
-    [DW_OP_breg0 +  7] =	OPND1 (SLEB128),
-    [DW_OP_breg0 +  8] =	OPND1 (SLEB128),
-    [DW_OP_breg0 +  9] =	OPND1 (SLEB128),
-    [DW_OP_breg0 + 10] =	OPND1 (SLEB128),
-    [DW_OP_breg0 + 11] =	OPND1 (SLEB128),
-    [DW_OP_breg0 + 12] =	OPND1 (SLEB128),
-    [DW_OP_breg0 + 13] =	OPND1 (SLEB128),
-    [DW_OP_breg0 + 14] =	OPND1 (SLEB128),
-    [DW_OP_breg0 + 15] =	OPND1 (SLEB128),
-    [DW_OP_breg0 + 16] =	OPND1 (SLEB128),
-    [DW_OP_breg0 + 17] =	OPND1 (SLEB128),
-    [DW_OP_breg0 + 18] =	OPND1 (SLEB128),
-    [DW_OP_breg0 + 19] =	OPND1 (SLEB128),
-    [DW_OP_breg0 + 20] =	OPND1 (SLEB128),
-    [DW_OP_breg0 + 21] =	OPND1 (SLEB128),
-    [DW_OP_breg0 + 22] =	OPND1 (SLEB128),
-    [DW_OP_breg0 + 23] =	OPND1 (SLEB128),
-    [DW_OP_breg0 + 24] =	OPND1 (SLEB128),
-    [DW_OP_breg0 + 25] =	OPND1 (SLEB128),
-    [DW_OP_breg0 + 26] =	OPND1 (SLEB128),
-    [DW_OP_breg0 + 27] =	OPND1 (SLEB128),
-    [DW_OP_breg0 + 28] =	OPND1 (SLEB128),
-    [DW_OP_breg0 + 29] =	OPND1 (SLEB128),
-    [DW_OP_breg0 + 30] =	OPND1 (SLEB128),
-    [DW_OP_breg0 + 31] =	OPND1 (SLEB128),
-    [DW_OP_regx] =		OPND1 (ULEB128),
-    [DW_OP_fbreg] =		OPND1 (SLEB128),
-    [DW_OP_bregx] =		OPND2 (ULEB128, SLEB128),
-    [DW_OP_piece] =		OPND1 (ULEB128),
-    [DW_OP_deref_size] =	OPND1 (VAL8),
-    [DW_OP_xderef_size] =	OPND1 (VAL8),
-    [DW_OP_call2] =		OPND1 (VAL16),
-    [DW_OP_call4] =		OPND1 (VAL32),
-    [DW_OP_call_ref] =		OPND1 (OFFSET)
+    [DW_OP_addr] =              OPND1 (ADDR),
+    [DW_OP_const1u] =           OPND1 (VAL8),
+    [DW_OP_const1s] =           OPND1 (VAL8),
+    [DW_OP_const2u] =           OPND1 (VAL16),
+    [DW_OP_const2s] =           OPND1 (VAL16),
+    [DW_OP_const4u] =           OPND1 (VAL32),
+    [DW_OP_const4s] =           OPND1 (VAL32),
+    [DW_OP_const8u] =           OPND1 (VAL64),
+    [DW_OP_const8s] =           OPND1 (VAL64),
+    [DW_OP_pick] =              OPND1 (VAL8),
+    [DW_OP_plus_uconst] =       OPND1 (ULEB128),
+    [DW_OP_skip] =              OPND1 (VAL16),
+    [DW_OP_bra] =               OPND1 (VAL16),
+    [DW_OP_breg0 +  0] =        OPND1 (SLEB128),
+    [DW_OP_breg0 +  1] =        OPND1 (SLEB128),
+    [DW_OP_breg0 +  2] =        OPND1 (SLEB128),
+    [DW_OP_breg0 +  3] =        OPND1 (SLEB128),
+    [DW_OP_breg0 +  4] =        OPND1 (SLEB128),
+    [DW_OP_breg0 +  5] =        OPND1 (SLEB128),
+    [DW_OP_breg0 +  6] =        OPND1 (SLEB128),
+    [DW_OP_breg0 +  7] =        OPND1 (SLEB128),
+    [DW_OP_breg0 +  8] =        OPND1 (SLEB128),
+    [DW_OP_breg0 +  9] =        OPND1 (SLEB128),
+    [DW_OP_breg0 + 10] =        OPND1 (SLEB128),
+    [DW_OP_breg0 + 11] =        OPND1 (SLEB128),
+    [DW_OP_breg0 + 12] =        OPND1 (SLEB128),
+    [DW_OP_breg0 + 13] =        OPND1 (SLEB128),
+    [DW_OP_breg0 + 14] =        OPND1 (SLEB128),
+    [DW_OP_breg0 + 15] =        OPND1 (SLEB128),
+    [DW_OP_breg0 + 16] =        OPND1 (SLEB128),
+    [DW_OP_breg0 + 17] =        OPND1 (SLEB128),
+    [DW_OP_breg0 + 18] =        OPND1 (SLEB128),
+    [DW_OP_breg0 + 19] =        OPND1 (SLEB128),
+    [DW_OP_breg0 + 20] =        OPND1 (SLEB128),
+    [DW_OP_breg0 + 21] =        OPND1 (SLEB128),
+    [DW_OP_breg0 + 22] =        OPND1 (SLEB128),
+    [DW_OP_breg0 + 23] =        OPND1 (SLEB128),
+    [DW_OP_breg0 + 24] =        OPND1 (SLEB128),
+    [DW_OP_breg0 + 25] =        OPND1 (SLEB128),
+    [DW_OP_breg0 + 26] =        OPND1 (SLEB128),
+    [DW_OP_breg0 + 27] =        OPND1 (SLEB128),
+    [DW_OP_breg0 + 28] =        OPND1 (SLEB128),
+    [DW_OP_breg0 + 29] =        OPND1 (SLEB128),
+    [DW_OP_breg0 + 30] =        OPND1 (SLEB128),
+    [DW_OP_breg0 + 31] =        OPND1 (SLEB128),
+    [DW_OP_regx] =              OPND1 (ULEB128),
+    [DW_OP_fbreg] =             OPND1 (SLEB128),
+    [DW_OP_bregx] =             OPND2 (ULEB128, SLEB128),
+    [DW_OP_piece] =             OPND1 (ULEB128),
+    [DW_OP_deref_size] =        OPND1 (VAL8),
+    [DW_OP_xderef_size] =       OPND1 (VAL8),
+    [DW_OP_call2] =             OPND1 (VAL16),
+    [DW_OP_call4] =             OPND1 (VAL32),
+    [DW_OP_call_ref] =          OPND1 (OFFSET)
   };
 
 static inline unw_sword_t
@@ -122,7 +122,7 @@ sword (unw_addr_space_t as, unw_word_t val)
 
 static inline unw_word_t
 read_operand (unw_addr_space_t as, unw_accessors_t *a,
-	      unw_word_t *addr, int operand_type, unw_word_t *val, void *arg)
+              unw_word_t *addr, int operand_type, unw_word_t *val, void *arg)
 {
   uint8_t u8;
   uint16_t u16;
@@ -145,28 +145,28 @@ read_operand (unw_addr_space_t as, unw_accessors_t *a,
     case VAL8:
       ret = dwarf_readu8 (as, a, addr, &u8, arg);
       if (ret < 0)
-	return ret;
+        return ret;
       *val = u8;
       break;
 
     case VAL16:
       ret = dwarf_readu16 (as, a, addr, &u16, arg);
       if (ret < 0)
-	return ret;
+        return ret;
       *val = u16;
       break;
 
     case VAL32:
       ret = dwarf_readu32 (as, a, addr, &u32, arg);
       if (ret < 0)
-	return ret;
+        return ret;
       *val = u32;
       break;
 
     case VAL64:
       ret = dwarf_readu64 (as, a, addr, &u64, arg);
       if (ret < 0)
-	return ret;
+        return ret;
       *val = u64;
       break;
 
@@ -188,7 +188,7 @@ read_operand (unw_addr_space_t as, unw_accessors_t *a,
 
 HIDDEN int
 dwarf_eval_expr (struct dwarf_cursor *c, unw_word_t *addr, unw_word_t len,
-		 unw_word_t *valp, int *is_register)
+                 unw_word_t *valp, int *is_register)
 {
   unw_word_t operand1 = 0, operand2 = 0, tmp1, tmp2, tmp3, end_addr;
   uint8_t opcode, operands_signature, u8;
@@ -201,33 +201,34 @@ dwarf_eval_expr (struct dwarf_cursor *c, unw_word_t *addr, unw_word_t len,
   uint32_t u32;
   uint64_t u64;
   int ret;
-# define pop()					\
-({						\
-  if ((tos - 1) >= MAX_EXPR_STACK_SIZE)		\
-    {						\
-      Debug (1, "Stack underflow\n");		\
-      return -UNW_EINVAL;			\
-    }						\
-  stack[--tos];					\
+# define pop()                                  \
+({                                              \
+  if ((tos - 1) >= MAX_EXPR_STACK_SIZE)         \
+    {                                           \
+      Debug (1, "Stack underflow\n");           \
+      return -UNW_EINVAL;                       \
+    }                                           \
+  stack[--tos];                                 \
 })
-# define push(x)				\
-do {						\
-  if (tos >= MAX_EXPR_STACK_SIZE)		\
-    {						\
-      Debug (1, "Stack overflow\n");		\
-      return -UNW_EINVAL;			\
-    }						\
-  stack[tos++] = (x);				\
+# define push(x)                                \
+do {                                            \
+  unw_word_t _x = (x);                          \
+  if (tos >= MAX_EXPR_STACK_SIZE)               \
+    {                                           \
+      Debug (1, "Stack overflow\n");            \
+      return -UNW_EINVAL;                       \
+    }                                           \
+  stack[tos++] = _x;                            \
 } while (0)
-# define pick(n)				\
-({						\
-  unsigned int _index = tos - 1 - (n);		\
-  if (_index >= MAX_EXPR_STACK_SIZE)		\
-    {						\
-      Debug (1, "Out-of-stack pick\n");		\
-      return -UNW_EINVAL;			\
-    }						\
-  stack[_index];				\
+# define pick(n)                                \
+({                                              \
+  unsigned int _index = tos - 1 - (n);          \
+  if (_index >= MAX_EXPR_STACK_SIZE)            \
+    {                                           \
+      Debug (1, "Out-of-stack pick\n");         \
+      return -UNW_EINVAL;                       \
+    }                                           \
+  stack[_index];                                \
 })
 
   as = c->as;
@@ -237,409 +238,409 @@ do {						\
   *is_register = 0;
 
   Debug (14, "len=%lu, pushing cfa=0x%lx\n",
-	 (unsigned long) len, (unsigned long) c->cfa);
+         (unsigned long) len, (unsigned long) c->cfa);
 
-  push (c->cfa);	/* push current CFA as required by DWARF spec */
+  push (c->cfa);        /* push current CFA as required by DWARF spec */
 
   while (*addr < end_addr)
     {
       if ((ret = dwarf_readu8 (as, a, addr, &opcode, arg)) < 0)
-	return ret;
+        return ret;
 
       operands_signature = operands[opcode];
 
       if (unlikely (NUM_OPERANDS (operands_signature) > 0))
-	{
-	  if ((ret = read_operand (as, a, addr,
-				   OPND1_TYPE (operands_signature),
-				   &operand1, arg)) < 0)
-	    return ret;
-	  if (NUM_OPERANDS (operands_signature > 1))
-	    if ((ret = read_operand (as, a, addr,
-				     OPND2_TYPE (operands_signature),
-				     &operand2, arg)) < 0)
-	      return ret;
-	}
+        {
+          if ((ret = read_operand (as, a, addr,
+                                   OPND1_TYPE (operands_signature),
+                                   &operand1, arg)) < 0)
+            return ret;
+          if (NUM_OPERANDS (operands_signature) > 1)
+            if ((ret = read_operand (as, a, addr,
+                                     OPND2_TYPE (operands_signature),
+                                     &operand2, arg)) < 0)
+              return ret;
+        }
 
       switch ((dwarf_expr_op_t) opcode)
-	{
-	case DW_OP_lit0:  case DW_OP_lit1:  case DW_OP_lit2:
-	case DW_OP_lit3:  case DW_OP_lit4:  case DW_OP_lit5:
-	case DW_OP_lit6:  case DW_OP_lit7:  case DW_OP_lit8:
-	case DW_OP_lit9:  case DW_OP_lit10: case DW_OP_lit11:
-	case DW_OP_lit12: case DW_OP_lit13: case DW_OP_lit14:
-	case DW_OP_lit15: case DW_OP_lit16: case DW_OP_lit17:
-	case DW_OP_lit18: case DW_OP_lit19: case DW_OP_lit20:
-	case DW_OP_lit21: case DW_OP_lit22: case DW_OP_lit23:
-	case DW_OP_lit24: case DW_OP_lit25: case DW_OP_lit26:
-	case DW_OP_lit27: case DW_OP_lit28: case DW_OP_lit29:
-	case DW_OP_lit30: case DW_OP_lit31:
-	  Debug (15, "OP_lit(%d)\n", (int) opcode - DW_OP_lit0);
-	  push (opcode - DW_OP_lit0);
-	  break;
-
-	case DW_OP_breg0:  case DW_OP_breg1:  case DW_OP_breg2:
-	case DW_OP_breg3:  case DW_OP_breg4:  case DW_OP_breg5:
-	case DW_OP_breg6:  case DW_OP_breg7:  case DW_OP_breg8:
-	case DW_OP_breg9:  case DW_OP_breg10: case DW_OP_breg11:
-	case DW_OP_breg12: case DW_OP_breg13: case DW_OP_breg14:
-	case DW_OP_breg15: case DW_OP_breg16: case DW_OP_breg17:
-	case DW_OP_breg18: case DW_OP_breg19: case DW_OP_breg20:
-	case DW_OP_breg21: case DW_OP_breg22: case DW_OP_breg23:
-	case DW_OP_breg24: case DW_OP_breg25: case DW_OP_breg26:
-	case DW_OP_breg27: case DW_OP_breg28: case DW_OP_breg29:
-	case DW_OP_breg30: case DW_OP_breg31:
-	  Debug (15, "OP_breg(r%d,0x%lx)\n",
-		 (int) opcode - DW_OP_breg0, (unsigned long) operand1);
-	  if ((ret = unw_get_reg (dwarf_to_cursor (c),
-				  dwarf_to_unw_regnum (opcode - DW_OP_breg0),
-				  &tmp1)) < 0)
-	    return ret;
-	  push (tmp1 + operand1);
-	  break;
-
-	case DW_OP_bregx:
-	  Debug (15, "OP_bregx(r%d,0x%lx)\n",
-		 (int) operand1, (unsigned long) operand2);
-	  if ((ret = unw_get_reg (dwarf_to_cursor (c),
-				  dwarf_to_unw_regnum (operand1), &tmp1)) < 0)
-	    return ret;
-	  push (tmp1 + operand2);
-	  break;
-
-	case DW_OP_reg0:  case DW_OP_reg1:  case DW_OP_reg2:
-	case DW_OP_reg3:  case DW_OP_reg4:  case DW_OP_reg5:
-	case DW_OP_reg6:  case DW_OP_reg7:  case DW_OP_reg8:
-	case DW_OP_reg9:  case DW_OP_reg10: case DW_OP_reg11:
-	case DW_OP_reg12: case DW_OP_reg13: case DW_OP_reg14:
-	case DW_OP_reg15: case DW_OP_reg16: case DW_OP_reg17:
-	case DW_OP_reg18: case DW_OP_reg19: case DW_OP_reg20:
-	case DW_OP_reg21: case DW_OP_reg22: case DW_OP_reg23:
-	case DW_OP_reg24: case DW_OP_reg25: case DW_OP_reg26:
-	case DW_OP_reg27: case DW_OP_reg28: case DW_OP_reg29:
-	case DW_OP_reg30: case DW_OP_reg31:
-	  Debug (15, "OP_reg(r%d)\n", (int) opcode - DW_OP_reg0);
-	  *valp = dwarf_to_unw_regnum (opcode - DW_OP_reg0);
-	  *is_register = 1;
-	  return 0;
-
-	case DW_OP_regx:
-	  Debug (15, "OP_regx(r%d)\n", (int) operand1);
-	  *valp = dwarf_to_unw_regnum (operand1);
-	  *is_register = 1;
-	  return 0;
-
-	case DW_OP_addr:
-	case DW_OP_const1u:
-	case DW_OP_const2u:
-	case DW_OP_const4u:
-	case DW_OP_const8u:
-	case DW_OP_constu:
-	case DW_OP_const8s:
-	case DW_OP_consts:
-	  Debug (15, "OP_const(0x%lx)\n", (unsigned long) operand1);
-	  push (operand1);
-	  break;
-
-	case DW_OP_const1s:
-	  if (operand1 & 0x80)
-	    operand1 |= ((unw_word_t) -1) << 8;
-	  Debug (15, "OP_const1s(%ld)\n", (long) operand1);
-	  push (operand1);
-	  break;
-
-	case DW_OP_const2s:
-	  if (operand1 & 0x8000)
-	    operand1 |= ((unw_word_t) -1) << 16;
-	  Debug (15, "OP_const2s(%ld)\n", (long) operand1);
-	  push (operand1);
-	  break;
-
-	case DW_OP_const4s:
-	  if (operand1 & 0x80000000)
-	    operand1 |= (((unw_word_t) -1) << 16) << 16;
-	  Debug (15, "OP_const4s(%ld)\n", (long) operand1);
-	  push (operand1);
-	  break;
-
-	case DW_OP_deref:
-	  Debug (15, "OP_deref\n");
-	  tmp1 = pop ();
-	  if ((ret = dwarf_readw (as, a, &tmp1, &tmp2, arg)) < 0)
-	    return ret;
-	  push (tmp2);
-	  break;
-
-	case DW_OP_deref_size:
-	  Debug (15, "OP_deref_size(%d)\n", (int) operand1);
-	  tmp1 = pop ();
-	  switch (operand1)
-	    {
-	    default:
-	      Debug (1, "Unexpected DW_OP_deref_size size %d\n",
-		     (int) operand1);
-	      return -UNW_EINVAL;
-
-	    case 1:
-	      if ((ret = dwarf_readu8 (as, a, &tmp1, &u8, arg)) < 0)
-		return ret;
-	      tmp2 = u8;
-	      break;
-
-	    case 2:
-	      if ((ret = dwarf_readu16 (as, a, &tmp1, &u16, arg)) < 0)
-		return ret;
-	      tmp2 = u16;
-	      break;
-
-	    case 3:
-	    case 4:
-	      if ((ret = dwarf_readu32 (as, a, &tmp1, &u32, arg)) < 0)
-		return ret;
-	      tmp2 = u32;
-	      if (operand1 == 3)
-		{
-		  if (dwarf_is_big_endian (as))
-		    tmp2 >>= 8;
-		  else
-		    tmp2 &= 0xffffff;
-		}
-	      break;
-	    case 5:
-	    case 6:
-	    case 7:
-	    case 8:
-	      if ((ret = dwarf_readu64 (as, a, &tmp1, &u64, arg)) < 0)
-		return ret;
-	      tmp2 = u64;
-	      if (operand1 != 8)
-		{
-		  if (dwarf_is_big_endian (as))
-		    tmp2 >>= 64 - 8 * operand1;
-		  else
-		    tmp2 &= (~ (unw_word_t) 0) << (8 * operand1);
-		}
-	      break;
-	    }
-	  push (tmp2);
-	  break;
-
-	case DW_OP_dup:
-	  Debug (15, "OP_dup\n");
-	  push (pick (0));
-	  break;
-
-	case DW_OP_drop:
-	  Debug (15, "OP_drop\n");
-	  pop ();
-	  break;
-
-	case DW_OP_pick:
-	  Debug (15, "OP_pick(%d)\n", (int) operand1);
-	  push (pick (operand1));
-	  break;
-
-	case DW_OP_over:
-	  Debug (15, "OP_over\n");
-	  push (pick (1));
-	  break;
-
-	case DW_OP_swap:
-	  Debug (15, "OP_swap\n");
-	  tmp1 = pop ();
-	  tmp2 = pop ();
-	  push (tmp1);
-	  push (tmp2);
-	  break;
-
-	case DW_OP_rot:
-	  Debug (15, "OP_rot\n");
-	  tmp1 = pop ();
-	  tmp2 = pop ();
-	  tmp3 = pop ();
-	  push (tmp1);
-	  push (tmp3);
-	  push (tmp2);
-	  break;
-
-	case DW_OP_abs:
-	  Debug (15, "OP_abs\n");
-	  tmp1 = pop ();
-	  if (tmp1 & ((unw_word_t) 1 << (8 * dwarf_addr_size (as) - 1)))
-	    tmp1 = -tmp1;
-	  push (tmp1);
-	  break;
-
-	case DW_OP_and:
-	  Debug (15, "OP_and\n");
-	  tmp1 = pop ();
-	  tmp2 = pop ();
-	  push (tmp1 & tmp2);
-	  break;
-
-	case DW_OP_div:
-	  Debug (15, "OP_div\n");
-	  tmp1 = pop ();
-	  tmp2 = pop ();
-	  if (tmp1)
-	    tmp1 = sword (as, tmp2) / sword (as, tmp1);
-	  push (tmp1);
-	  break;
-
-	case DW_OP_minus:
-	  Debug (15, "OP_minus\n");
-	  tmp1 = pop ();
-	  tmp2 = pop ();
-	  tmp1 = tmp2 - tmp1;
-	  push (tmp1);
-	  break;
-
-	case DW_OP_mod:
-	  Debug (15, "OP_mod\n");
-	  tmp1 = pop ();
-	  tmp2 = pop ();
-	  if (tmp1)
-	    tmp1 = tmp2 % tmp1;
-	  push (tmp1);
-	  break;
-
-	case DW_OP_mul:
-	  Debug (15, "OP_mul\n");
-	  tmp1 = pop ();
-	  tmp2 = pop ();
-	  if (tmp1)
-	    tmp1 = tmp2 * tmp1;
-	  push (tmp1);
-	  break;
-
-	case DW_OP_neg:
-	  Debug (15, "OP_neg\n");
-	  push (-pop ());
-	  break;
-
-	case DW_OP_not:
-	  Debug (15, "OP_not\n");
-	  push (~pop ());
-	  break;
-
-	case DW_OP_or:
-	  Debug (15, "OP_or\n");
-	  tmp1 = pop ();
-	  tmp2 = pop ();
-	  push (tmp1 | tmp2);
-	  break;
-
-	case DW_OP_plus:
-	  Debug (15, "OP_plus\n");
-	  tmp1 = pop ();
-	  tmp2 = pop ();
-	  push (tmp1 + tmp2);
-	  break;
-
-	case DW_OP_plus_uconst:
-	  Debug (15, "OP_plus_uconst(%lu)\n", (unsigned long) operand1);
-	  tmp1 = pop ();
-	  push (tmp1 + operand1);
-	  break;
-
-	case DW_OP_shl:
-	  Debug (15, "OP_shl\n");
-	  tmp1 = pop ();
-	  tmp2 = pop ();
-	  push (tmp2 << tmp1);
-	  break;
-
-	case DW_OP_shr:
-	  Debug (15, "OP_shr\n");
-	  tmp1 = pop ();
-	  tmp2 = pop ();
-	  push (tmp2 >> tmp1);
-	  break;
-
-	case DW_OP_shra:
-	  Debug (15, "OP_shra\n");
-	  tmp1 = pop ();
-	  tmp2 = pop ();
-	  push (sword (as, tmp2) >> tmp1);
-	  break;
-
-	case DW_OP_xor:
-	  Debug (15, "OP_xor\n");
-	  tmp1 = pop ();
-	  tmp2 = pop ();
-	  push (tmp1 ^ tmp2);
-	  break;
-
-	case DW_OP_le:
-	  Debug (15, "OP_le\n");
-	  tmp1 = pop ();
-	  tmp2 = pop ();
-	  push (sword (as, tmp1) <= sword (as, tmp2));
-	  break;
-
-	case DW_OP_ge:
-	  Debug (15, "OP_ge\n");
-	  tmp1 = pop ();
-	  tmp2 = pop ();
-	  push (sword (as, tmp1) >= sword (as, tmp2));
-	  break;
-
-	case DW_OP_eq:
-	  Debug (15, "OP_eq\n");
-	  tmp1 = pop ();
-	  tmp2 = pop ();
-	  push (sword (as, tmp1) == sword (as, tmp2));
-	  break;
-
-	case DW_OP_lt:
-	  Debug (15, "OP_lt\n");
-	  tmp1 = pop ();
-	  tmp2 = pop ();
-	  push (sword (as, tmp1) < sword (as, tmp2));
-	  break;
-
-	case DW_OP_gt:
-	  Debug (15, "OP_gt\n");
-	  tmp1 = pop ();
-	  tmp2 = pop ();
-	  push (sword (as, tmp1) > sword (as, tmp2));
-	  break;
-
-	case DW_OP_ne:
-	  Debug (15, "OP_ne\n");
-	  tmp1 = pop ();
-	  tmp2 = pop ();
-	  push (sword (as, tmp1) != sword (as, tmp2));
-	  break;
-
-	case DW_OP_skip:
-	  Debug (15, "OP_skip(%d)\n", (int16_t) operand1);
-	  *addr += (int16_t) operand1;
-	  break;
-
-	case DW_OP_bra:
-	  Debug (15, "OP_skip(%d)\n", (int16_t) operand1);
-	  tmp1 = pop ();
-	  if (tmp1)
-	    *addr += (int16_t) operand1;
-	  break;
-
-	case DW_OP_nop:
-	  Debug (15, "OP_nop\n");
-	  break;
-
-	case DW_OP_call2:
-	case DW_OP_call4:
-	case DW_OP_call_ref:
-	case DW_OP_fbreg:
-	case DW_OP_piece:
-	case DW_OP_push_object_address:
-	case DW_OP_xderef:
-	case DW_OP_xderef_size:
-	default:
-	  Debug (1, "Unexpected opcode 0x%x\n", opcode);
-	  return -UNW_EINVAL;
-	}
+        {
+        case DW_OP_lit0:  case DW_OP_lit1:  case DW_OP_lit2:
+        case DW_OP_lit3:  case DW_OP_lit4:  case DW_OP_lit5:
+        case DW_OP_lit6:  case DW_OP_lit7:  case DW_OP_lit8:
+        case DW_OP_lit9:  case DW_OP_lit10: case DW_OP_lit11:
+        case DW_OP_lit12: case DW_OP_lit13: case DW_OP_lit14:
+        case DW_OP_lit15: case DW_OP_lit16: case DW_OP_lit17:
+        case DW_OP_lit18: case DW_OP_lit19: case DW_OP_lit20:
+        case DW_OP_lit21: case DW_OP_lit22: case DW_OP_lit23:
+        case DW_OP_lit24: case DW_OP_lit25: case DW_OP_lit26:
+        case DW_OP_lit27: case DW_OP_lit28: case DW_OP_lit29:
+        case DW_OP_lit30: case DW_OP_lit31:
+          Debug (15, "OP_lit(%d)\n", (int) opcode - DW_OP_lit0);
+          push (opcode - DW_OP_lit0);
+          break;
+
+        case DW_OP_breg0:  case DW_OP_breg1:  case DW_OP_breg2:
+        case DW_OP_breg3:  case DW_OP_breg4:  case DW_OP_breg5:
+        case DW_OP_breg6:  case DW_OP_breg7:  case DW_OP_breg8:
+        case DW_OP_breg9:  case DW_OP_breg10: case DW_OP_breg11:
+        case DW_OP_breg12: case DW_OP_breg13: case DW_OP_breg14:
+        case DW_OP_breg15: case DW_OP_breg16: case DW_OP_breg17:
+        case DW_OP_breg18: case DW_OP_breg19: case DW_OP_breg20:
+        case DW_OP_breg21: case DW_OP_breg22: case DW_OP_breg23:
+        case DW_OP_breg24: case DW_OP_breg25: case DW_OP_breg26:
+        case DW_OP_breg27: case DW_OP_breg28: case DW_OP_breg29:
+        case DW_OP_breg30: case DW_OP_breg31:
+          Debug (15, "OP_breg(r%d,0x%lx)\n",
+                 (int) opcode - DW_OP_breg0, (unsigned long) operand1);
+          if ((ret = unw_get_reg (dwarf_to_cursor (c),
+                                  dwarf_to_unw_regnum (opcode - DW_OP_breg0),
+                                  &tmp1)) < 0)
+            return ret;
+          push (tmp1 + operand1);
+          break;
+
+        case DW_OP_bregx:
+          Debug (15, "OP_bregx(r%d,0x%lx)\n",
+                 (int) operand1, (unsigned long) operand2);
+          if ((ret = unw_get_reg (dwarf_to_cursor (c),
+                                  dwarf_to_unw_regnum (operand1), &tmp1)) < 0)
+            return ret;
+          push (tmp1 + operand2);
+          break;
+
+        case DW_OP_reg0:  case DW_OP_reg1:  case DW_OP_reg2:
+        case DW_OP_reg3:  case DW_OP_reg4:  case DW_OP_reg5:
+        case DW_OP_reg6:  case DW_OP_reg7:  case DW_OP_reg8:
+        case DW_OP_reg9:  case DW_OP_reg10: case DW_OP_reg11:
+        case DW_OP_reg12: case DW_OP_reg13: case DW_OP_reg14:
+        case DW_OP_reg15: case DW_OP_reg16: case DW_OP_reg17:
+        case DW_OP_reg18: case DW_OP_reg19: case DW_OP_reg20:
+        case DW_OP_reg21: case DW_OP_reg22: case DW_OP_reg23:
+        case DW_OP_reg24: case DW_OP_reg25: case DW_OP_reg26:
+        case DW_OP_reg27: case DW_OP_reg28: case DW_OP_reg29:
+        case DW_OP_reg30: case DW_OP_reg31:
+          Debug (15, "OP_reg(r%d)\n", (int) opcode - DW_OP_reg0);
+          *valp = dwarf_to_unw_regnum (opcode - DW_OP_reg0);
+          *is_register = 1;
+          return 0;
+
+        case DW_OP_regx:
+          Debug (15, "OP_regx(r%d)\n", (int) operand1);
+          *valp = dwarf_to_unw_regnum (operand1);
+          *is_register = 1;
+          return 0;
+
+        case DW_OP_addr:
+        case DW_OP_const1u:
+        case DW_OP_const2u:
+        case DW_OP_const4u:
+        case DW_OP_const8u:
+        case DW_OP_constu:
+        case DW_OP_const8s:
+        case DW_OP_consts:
+          Debug (15, "OP_const(0x%lx)\n", (unsigned long) operand1);
+          push (operand1);
+          break;
+
+        case DW_OP_const1s:
+          if (operand1 & 0x80)
+            operand1 |= ((unw_word_t) -1) << 8;
+          Debug (15, "OP_const1s(%ld)\n", (long) operand1);
+          push (operand1);
+          break;
+
+        case DW_OP_const2s:
+          if (operand1 & 0x8000)
+            operand1 |= ((unw_word_t) -1) << 16;
+          Debug (15, "OP_const2s(%ld)\n", (long) operand1);
+          push (operand1);
+          break;
+
+        case DW_OP_const4s:
+          if (operand1 & 0x80000000)
+            operand1 |= (((unw_word_t) -1) << 16) << 16;
+          Debug (15, "OP_const4s(%ld)\n", (long) operand1);
+          push (operand1);
+          break;
+
+        case DW_OP_deref:
+          Debug (15, "OP_deref\n");
+          tmp1 = pop ();
+          if ((ret = dwarf_readw (as, a, &tmp1, &tmp2, arg)) < 0)
+            return ret;
+          push (tmp2);
+          break;
+
+        case DW_OP_deref_size:
+          Debug (15, "OP_deref_size(%d)\n", (int) operand1);
+          tmp1 = pop ();
+          switch (operand1)
+            {
+            default:
+              Debug (1, "Unexpected DW_OP_deref_size size %d\n",
+                     (int) operand1);
+              return -UNW_EINVAL;
+
+            case 1:
+              if ((ret = dwarf_readu8 (as, a, &tmp1, &u8, arg)) < 0)
+                return ret;
+              tmp2 = u8;
+              break;
+
+            case 2:
+              if ((ret = dwarf_readu16 (as, a, &tmp1, &u16, arg)) < 0)
+                return ret;
+              tmp2 = u16;
+              break;
+
+            case 3:
+            case 4:
+              if ((ret = dwarf_readu32 (as, a, &tmp1, &u32, arg)) < 0)
+                return ret;
+              tmp2 = u32;
+              if (operand1 == 3)
+                {
+                  if (dwarf_is_big_endian (as))
+                    tmp2 >>= 8;
+                  else
+                    tmp2 &= 0xffffff;
+                }
+              break;
+            case 5:
+            case 6:
+            case 7:
+            case 8:
+              if ((ret = dwarf_readu64 (as, a, &tmp1, &u64, arg)) < 0)
+                return ret;
+              tmp2 = u64;
+              if (operand1 != 8)
+                {
+                  if (dwarf_is_big_endian (as))
+                    tmp2 >>= 64 - 8 * operand1;
+                  else
+                    tmp2 &= (~ (unw_word_t) 0) << (8 * operand1);
+                }
+              break;
+            }
+          push (tmp2);
+          break;
+
+        case DW_OP_dup:
+          Debug (15, "OP_dup\n");
+          push (pick (0));
+          break;
+
+        case DW_OP_drop:
+          Debug (15, "OP_drop\n");
+          (void) pop ();
+          break;
+
+        case DW_OP_pick:
+          Debug (15, "OP_pick(%d)\n", (int) operand1);
+          push (pick (operand1));
+          break;
+
+        case DW_OP_over:
+          Debug (15, "OP_over\n");
+          push (pick (1));
+          break;
+
+        case DW_OP_swap:
+          Debug (15, "OP_swap\n");
+          tmp1 = pop ();
+          tmp2 = pop ();
+          push (tmp1);
+          push (tmp2);
+          break;
+
+        case DW_OP_rot:
+          Debug (15, "OP_rot\n");
+          tmp1 = pop ();
+          tmp2 = pop ();
+          tmp3 = pop ();
+          push (tmp1);
+          push (tmp3);
+          push (tmp2);
+          break;
+
+        case DW_OP_abs:
+          Debug (15, "OP_abs\n");
+          tmp1 = pop ();
+          if (tmp1 & ((unw_word_t) 1 << (8 * dwarf_addr_size (as) - 1)))
+            tmp1 = -tmp1;
+          push (tmp1);
+          break;
+
+        case DW_OP_and:
+          Debug (15, "OP_and\n");
+          tmp1 = pop ();
+          tmp2 = pop ();
+          push (tmp1 & tmp2);
+          break;
+
+        case DW_OP_div:
+          Debug (15, "OP_div\n");
+          tmp1 = pop ();
+          tmp2 = pop ();
+          if (tmp1)
+            tmp1 = sword (as, tmp2) / sword (as, tmp1);
+          push (tmp1);
+          break;
+
+        case DW_OP_minus:
+          Debug (15, "OP_minus\n");
+          tmp1 = pop ();
+          tmp2 = pop ();
+          tmp1 = tmp2 - tmp1;
+          push (tmp1);
+          break;
+
+        case DW_OP_mod:
+          Debug (15, "OP_mod\n");
+          tmp1 = pop ();
+          tmp2 = pop ();
+          if (tmp1)
+            tmp1 = tmp2 % tmp1;
+          push (tmp1);
+          break;
+
+        case DW_OP_mul:
+          Debug (15, "OP_mul\n");
+          tmp1 = pop ();
+          tmp2 = pop ();
+          if (tmp1)
+            tmp1 = tmp2 * tmp1;
+          push (tmp1);
+          break;
+
+        case DW_OP_neg:
+          Debug (15, "OP_neg\n");
+          push (-pop ());
+          break;
+
+        case DW_OP_not:
+          Debug (15, "OP_not\n");
+          push (~pop ());
+          break;
+
+        case DW_OP_or:
+          Debug (15, "OP_or\n");
+          tmp1 = pop ();
+          tmp2 = pop ();
+          push (tmp1 | tmp2);
+          break;
+
+        case DW_OP_plus:
+          Debug (15, "OP_plus\n");
+          tmp1 = pop ();
+          tmp2 = pop ();
+          push (tmp1 + tmp2);
+          break;
+
+        case DW_OP_plus_uconst:
+          Debug (15, "OP_plus_uconst(%lu)\n", (unsigned long) operand1);
+          tmp1 = pop ();
+          push (tmp1 + operand1);
+          break;
+
+        case DW_OP_shl:
+          Debug (15, "OP_shl\n");
+          tmp1 = pop ();
+          tmp2 = pop ();
+          push (tmp2 << tmp1);
+          break;
+
+        case DW_OP_shr:
+          Debug (15, "OP_shr\n");
+          tmp1 = pop ();
+          tmp2 = pop ();
+          push (tmp2 >> tmp1);
+          break;
+
+        case DW_OP_shra:
+          Debug (15, "OP_shra\n");
+          tmp1 = pop ();
+          tmp2 = pop ();
+          push (sword (as, tmp2) >> tmp1);
+          break;
+
+        case DW_OP_xor:
+          Debug (15, "OP_xor\n");
+          tmp1 = pop ();
+          tmp2 = pop ();
+          push (tmp1 ^ tmp2);
+          break;
+
+        case DW_OP_le:
+          Debug (15, "OP_le\n");
+          tmp1 = pop ();
+          tmp2 = pop ();
+          push (sword (as, tmp2) <= sword (as, tmp1));
+          break;
+
+        case DW_OP_ge:
+          Debug (15, "OP_ge\n");
+          tmp1 = pop ();
+          tmp2 = pop ();
+          push (sword (as, tmp2) >= sword (as, tmp1));
+          break;
+
+        case DW_OP_eq:
+          Debug (15, "OP_eq\n");
+          tmp1 = pop ();
+          tmp2 = pop ();
+          push (sword (as, tmp2) == sword (as, tmp1));
+          break;
+
+        case DW_OP_lt:
+          Debug (15, "OP_lt\n");
+          tmp1 = pop ();
+          tmp2 = pop ();
+          push (sword (as, tmp2) < sword (as, tmp1));
+          break;
+
+        case DW_OP_gt:
+          Debug (15, "OP_gt\n");
+          tmp1 = pop ();
+          tmp2 = pop ();
+          push (sword (as, tmp2) > sword (as, tmp1));
+          break;
+
+        case DW_OP_ne:
+          Debug (15, "OP_ne\n");
+          tmp1 = pop ();
+          tmp2 = pop ();
+          push (sword (as, tmp2) != sword (as, tmp1));
+          break;
+
+        case DW_OP_skip:
+          Debug (15, "OP_skip(%d)\n", (int16_t) operand1);
+          *addr += (int16_t) operand1;
+          break;
+
+        case DW_OP_bra:
+          Debug (15, "OP_skip(%d)\n", (int16_t) operand1);
+          tmp1 = pop ();
+          if (tmp1)
+            *addr += (int16_t) operand1;
+          break;
+
+        case DW_OP_nop:
+          Debug (15, "OP_nop\n");
+          break;
+
+        case DW_OP_call2:
+        case DW_OP_call4:
+        case DW_OP_call_ref:
+        case DW_OP_fbreg:
+        case DW_OP_piece:
+        case DW_OP_push_object_address:
+        case DW_OP_xderef:
+        case DW_OP_xderef_size:
+        default:
+          Debug (1, "Unexpected opcode 0x%x\n", opcode);
+          return -UNW_EINVAL;
+        }
     }
   *valp = pop ();
   Debug (14, "final value = 0x%lx\n", (unsigned long) *valp);
diff --git a/frysk-imports/libunwind/src/dwarf/Gfde.c b/frysk-imports/libunwind/src/dwarf/Gfde.c
index 28b5fea..6cd4a64 100644
--- a/frysk-imports/libunwind/src/dwarf/Gfde.c
+++ b/frysk-imports/libunwind/src/dwarf/Gfde.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (c) 2003-2005 Hewlett-Packard Development Company, L.P.
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
    Copyright (c) 2008 Red Hat, Inc.
 	Contributed by Mark Wielaard <mwielaard@redhat.com>
 
@@ -34,8 +34,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
    repeated.  */
 static inline int
 parse_cie (unw_addr_space_t as, unw_accessors_t *a, unw_word_t addr,
-	   const unw_proc_info_t *pi, struct dwarf_cie_info *dci,
-	   unw_word_t base, void *arg)
+           const unw_proc_info_t *pi, struct dwarf_cie_info *dci,
+           int is_debug_frame, void *arg)
 {
   uint8_t version, ch, augstr[5], fde_encoding, handler_encoding;
   unw_word_t len, cie_end_addr, aug_size;
@@ -43,14 +43,8 @@ parse_cie (unw_addr_space_t as, unw_accessors_t *a, unw_word_t addr,
   uint64_t u64val;
   size_t i;
   int ret;
-
-  // FRYSK LOCAL. Upstream uses (base != 0) which doesn't work for
-  // frysk since there is no reason the given address space wouldn't
-  // be based on zero (in general it is for debug_frame).
-  int debug_frame = (pi->format == UNW_INFO_FORMAT_TABLE);
-  
-# define STR2(x)	#x
-# define STR(x)		STR2(x)
+# define STR2(x)        #x
+# define STR(x)         STR2(x)
 
   /* Pick appropriate default for FDE-encoding.  DWARF spec says
      start-IP (initial_location) and the code-size (address_range) are
@@ -59,9 +53,9 @@ parse_cie (unw_addr_space_t as, unw_accessors_t *a, unw_word_t addr,
      for fde_encoding.  */
   switch (dwarf_addr_size (as))
     {
-    case 4:	fde_encoding = DW_EH_PE_udata4; break;
-    case 8:	fde_encoding = DW_EH_PE_udata8; break;
-    default:	fde_encoding = DW_EH_PE_omit; break;
+    case 4:     fde_encoding = DW_EH_PE_udata4; break;
+    case 8:     fde_encoding = DW_EH_PE_udata8; break;
+    default:    fde_encoding = DW_EH_PE_omit; break;
     }
 
   dci->lsda_encoding = DW_EH_PE_omit;
@@ -75,37 +69,37 @@ parse_cie (unw_addr_space_t as, unw_accessors_t *a, unw_word_t addr,
       /* the CIE is in the 32-bit DWARF format */
       uint32_t cie_id;
       /* DWARF says CIE id should be 0xffffffff, but in .eh_frame, it's 0 */
-      const uint32_t expected_id = (debug_frame) ? 0xffffffff : 0;
+      const uint32_t expected_id = (is_debug_frame) ? 0xffffffff : 0;
 
       len = u32val;
       cie_end_addr = addr + len;
       if ((ret = dwarf_readu32 (as, a, &addr, &cie_id, arg)) < 0)
-	return ret;
+        return ret;
       if (cie_id != expected_id)
-	{
-	  Debug (1, "Unexpected CIE id %x\n", cie_id);
-	  return -UNW_EINVAL;
-	}
+        {
+          Debug (1, "Unexpected CIE id %x\n", cie_id);
+          return -UNW_EINVAL;
+        }
     }
   else
     {
       /* the CIE is in the 64-bit DWARF format */
       uint64_t cie_id;
       /* DWARF says CIE id should be 0xffffffffffffffff, but in
-	 .eh_frame, it's 0 */
-      const uint64_t expected_id = (debug_frame) ? 0xffffffffffffffffull : 0;
+         .eh_frame, it's 0 */
+      const uint64_t expected_id = (is_debug_frame) ? 0xffffffffffffffffull : 0;
 
       if ((ret = dwarf_readu64 (as, a, &addr, &u64val, arg)) < 0)
-	return ret;
+        return ret;
       len = u64val;
       cie_end_addr = addr + len;
       if ((ret = dwarf_readu64 (as, a, &addr, &cie_id, arg)) < 0)
-	return ret;
+        return ret;
       if (cie_id != expected_id)
-	{
-	  Debug (1, "Unexpected CIE id %llx\n", (long long) cie_id);
-	  return -UNW_EINVAL;
-	}
+        {
+          Debug (1, "Unexpected CIE id %llx\n", (long long) cie_id);
+          return -UNW_EINVAL;
+        }
     }
   dci->cie_instr_end = cie_end_addr;
 
@@ -115,7 +109,7 @@ parse_cie (unw_addr_space_t as, unw_accessors_t *a, unw_word_t addr,
   if (version != 1 && version != DWARF_CIE_VERSION)
     {
       Debug (1, "Got CIE version %u, expected version 1 or "
-	     STR (DWARF_CIE_VERSION) "\n", version);
+             STR (DWARF_CIE_VERSION) "\n", version);
       return -UNW_EBADVERSION;
     }
 
@@ -124,13 +118,13 @@ parse_cie (unw_addr_space_t as, unw_accessors_t *a, unw_word_t addr,
   for (i = 0;;)
     {
       if ((ret = dwarf_readu8 (as, a, &addr, &ch, arg)) < 0)
-	return ret;
+        return ret;
 
       if (!ch)
-	break;	/* end of augmentation string */
+        break;  /* end of augmentation string */
 
       if (i < sizeof (augstr) - 1)
-	augstr[i++] = ch;
+        augstr[i++] = ch;
     }
 
   if ((ret = dwarf_read_uleb128 (as, a, &addr, &dci->code_align, arg)) < 0
@@ -141,11 +135,11 @@ parse_cie (unw_addr_space_t as, unw_accessors_t *a, unw_word_t addr,
   if (version == 1)
     {
       if ((ret = dwarf_readu8 (as, a, &addr, &ch, arg)) < 0)
-	return ret;
+        return ret;
       dci->ret_addr_column = ch;
     }
   else if ((ret = dwarf_read_uleb128 (as, a, &addr, &dci->ret_addr_column,
-				      arg)) < 0)
+                                      arg)) < 0)
     return ret;
 
   i = 0;
@@ -153,7 +147,7 @@ parse_cie (unw_addr_space_t as, unw_accessors_t *a, unw_word_t addr,
     {
       dci->sized_augmentation = 1;
       if ((ret = dwarf_read_uleb128 (as, a, &addr, &aug_size, arg)) < 0)
-	return ret;
+        return ret;
       i++;
     }
 
@@ -161,22 +155,22 @@ parse_cie (unw_addr_space_t as, unw_accessors_t *a, unw_word_t addr,
     switch (augstr[i])
       {
       case 'L':
-	/* read the LSDA pointer-encoding format.  */
-	if ((ret = dwarf_readu8 (as, a, &addr, &ch, arg)) < 0)
-	  return ret;
-	dci->lsda_encoding = ch;
-	break;
+        /* read the LSDA pointer-encoding format.  */
+        if ((ret = dwarf_readu8 (as, a, &addr, &ch, arg)) < 0)
+          return ret;
+        dci->lsda_encoding = ch;
+        break;
 
       case 'R':
-	/* read the FDE pointer-encoding format.  */
-	if ((ret = dwarf_readu8 (as, a, &addr, &fde_encoding, arg)) < 0)
-	  return ret;
-	break;
+        /* read the FDE pointer-encoding format.  */
+        if ((ret = dwarf_readu8 (as, a, &addr, &fde_encoding, arg)) < 0)
+          return ret;
+        break;
 
       case 'P':
-	/* read the personality-routine pointer-encoding format.  */
-	if ((ret = dwarf_readu8 (as, a, &addr, &handler_encoding, arg)) < 0)
-	  return ret;
+        /* read the personality-routine pointer-encoding format.  */
+        if ((ret = dwarf_readu8 (as, a, &addr, &handler_encoding, arg)) < 0)
+          return ret;
 	// FRYSK LOCAL
 	// We never want to actually read the personality routine address
 	// since it can be stored anywhere and currently we are just
@@ -186,33 +180,34 @@ parse_cie (unw_addr_space_t as, unw_accessors_t *a, unw_word_t addr,
 	// main address space.
 	handler_encoding &= ~DW_EH_PE_indirect;
 	// END FRYSK LOCAL
-	if ((ret = dwarf_read_encoded_pointer (as, a, &addr, handler_encoding,
-					       pi, &dci->handler, arg)) < 0)
-	  return ret;
-	break;
+        if ((ret = dwarf_read_encoded_pointer (as, a, &addr, handler_encoding,
+                                               pi, &dci->handler, arg)) < 0)
+          return ret;
+        break;
 
       case 'S':
-	/* Original meaning of this augmentation marker.  */
-	dci->signal_frame = 1;
-	/* Temporarily set it to one so dwarf_parse_fde() knows that
-	   it should fetch the actual ABI/TAG pair from the FDE.  */
-	dci->have_abi_marker = 1;
-	break;
+        /* This is a signal frame. */
+        dci->signal_frame = 1;
+
+        /* Temporarily set it to one so dwarf_parse_fde() knows that
+           it should fetch the actual ABI/TAG pair from the FDE.  */
+        dci->have_abi_marker = 1;
+        break;
 
       default:
-	Debug (1, "Unexpected augmentation string `%s'\n", augstr);
-	if (dci->sized_augmentation)
-	  /* If we have the size of the augmentation body, we can skip
-	     over the parts that we don't understand, so we're OK. */
-	  goto done;
-	else
-	  return -UNW_EINVAL;
+        Debug (1, "Unexpected augmentation string `%s'\n", augstr);
+        if (dci->sized_augmentation)
+          /* If we have the size of the augmentation body, we can skip
+             over the parts that we don't understand, so we're OK. */
+          goto done;
+        else
+          return -UNW_EINVAL;
       }
  done:
   dci->fde_encoding = fde_encoding;
   dci->cie_instr_start = addr;
   Debug (15, "CIE parsed OK, augmentation = \"%s\", handler=0x%lx\n",
-	 augstr, (long) dci->handler);
+         augstr, (long) dci->handler);
   return 0;
 }
 
@@ -223,9 +218,10 @@ parse_cie (unw_addr_space_t as, unw_accessors_t *a, unw_word_t addr,
 
 HIDDEN int
 dwarf_extract_proc_info_from_fde (unw_addr_space_t as, unw_accessors_t *a,
-				  unw_word_t *addrp, unw_proc_info_t *pi,
-				  int need_unwind_info, unw_word_t base,
-				  void *arg)
+                                  unw_word_t *addrp, unw_proc_info_t *pi,
+                                  unw_word_t base,
+                                  int need_unwind_info, int is_debug_frame,
+                                  void *arg)
 {
   unw_word_t fde_end_addr, cie_addr, cie_offset_addr, aug_end_addr = 0;
   unw_word_t start_ip, ip_range, aug_size, addr = *addrp;
@@ -234,11 +230,6 @@ dwarf_extract_proc_info_from_fde (unw_addr_space_t as, unw_accessors_t *a,
   uint64_t u64val;
   uint32_t u32val;
 
-  // FRYSK LOCAL. Upstream uses (base != 0) which doesn't work for
-  // frysk since there is no reason the given address space wouldn't
-  // be based on zero (in general it is for debug_frame).
-  int debug_frame = (pi->format == UNW_INFO_FORMAT_TABLE);
-
   Debug (12, "FDE @ 0x%lx\n", (long) addr);
 
   memset (&dci, 0, sizeof (dci));
@@ -248,12 +239,12 @@ dwarf_extract_proc_info_from_fde (unw_addr_space_t as, unw_accessors_t *a,
 
   if (u32val != 0xffffffff)
     {
-      uint32_t cie_offset;
+      int32_t cie_offset;
 
       /* In some configurations, an FDE with a 0 length indicates the
-	 end of the FDE-table.  */
+         end of the FDE-table.  */
       if (u32val == 0)
-	return -UNW_ENOINFO;
+        return -UNW_ENOINFO;
 
       /* the FDE is in the 32-bit DWARF format */
 
@@ -261,61 +252,61 @@ dwarf_extract_proc_info_from_fde (unw_addr_space_t as, unw_accessors_t *a,
       cie_offset_addr = addr;
 
       if ((ret = dwarf_reads32 (as, a, &addr, &cie_offset, arg)) < 0)
-	return ret;
+        return ret;
 
       /* DWARF spec says CIE_id is 0xffffffff (for 32-bit ELF) or
 	 0xffffffffffffffff (for 64-bit ELF).  However, the GNU toolchain
 	 uses 0.  */
-      if ((debug_frame && cie_offset == 0xffffffff)
-	  || (! debug_frame && cie_offset == 0))
-	/* ignore CIEs (happens during linear searches) */
-	return 0;
-
-      /* DWARF says that the CIE_pointer in the FDE is a
-	 .debug_frame-relative offset, but the GCC-generated .eh_frame
-	 sections instead store a "pcrelative" offset, which is just
-	 as fine as it's self-contained.  */
-      if (debug_frame)
-	cie_addr = base + cie_offset;
+      if ((is_debug_frame && cie_offset == 0xffffffffL)
+	  || (! is_debug_frame && cie_offset == 0))
+        /* ignore CIEs (happens during linear searches) */
+        return 0;
+
+      if (is_debug_frame)
+        cie_addr = base + cie_offset;
       else
-	cie_addr = cie_offset_addr - cie_offset;
+        /* DWARF says that the CIE_pointer in the FDE is a
+           .debug_frame-relative offset, but the GCC-generated .eh_frame
+           sections instead store a "pcrelative" offset, which is just
+           as fine as it's self-contained.  */
+        cie_addr = cie_offset_addr - cie_offset;
     }
   else
     {
-      uint64_t cie_offset;
+      int64_t cie_offset;
 
       /* the FDE is in the 64-bit DWARF format */
 
       if ((ret = dwarf_readu64 (as, a, &addr, &u64val, arg)) < 0)
-	return ret;
+        return ret;
 
       *addrp = fde_end_addr = addr + u64val;
       cie_offset_addr = addr;
 
       if ((ret = dwarf_reads64 (as, a, &addr, &cie_offset, arg)) < 0)
-	return ret;
+        return ret;
 
       /* DWARF spec says CIE_id is 0xffffffff (for 32-bit ELF) or
 	 0xffffffffffffffff (for 64-bit ELF).  However, the GNU toolchain
 	 uses 0.  */
-      if ((debug_frame && cie_offset == 0xffffffffffffffffull)
-	  || (! debug_frame && cie_offset == 0))
-	/* ignore CIEs (happens during linear searches) */
-	return 0;
-
-      /* DWARF says that the CIE_pointer in the FDE is a
-	 .debug_frame-relative offset, but the GCC-generated .eh_frame
-	 sections instead store a "pcrelative" offset, which is just
-	 as fine as it's self-contained.  */
-      if (debug_frame)
-	cie_addr = base + cie_offset;
+      if ((is_debug_frame && cie_offset == 0xffffffffffffffffLL)
+	  || (! is_debug_frame && cie_offset == 0))
+        /* ignore CIEs (happens during linear searches) */
+        return 0;
+
+      if (is_debug_frame)
+        cie_addr = base + cie_offset;
       else
-	cie_addr = (unw_word_t) ((uint64_t) cie_offset_addr - cie_offset);
+        /* DWARF says that the CIE_pointer in the FDE is a
+           .debug_frame-relative offset, but the GCC-generated .eh_frame
+           sections instead store a "pcrelative" offset, which is just
+           as fine as it's self-contained.  */
+        cie_addr = (unw_word_t) ((uint64_t) cie_offset_addr - cie_offset);
     }
 
-  Debug (15, "looking for CIE at address %x\n", (int) cie_addr);
+  Debug (15, "looking for CIE at address %lx\n", (long) cie_addr);
 
-  if ((ret = parse_cie (as, a, cie_addr, pi, &dci, base, arg)) < 0)
+  if ((ret = parse_cie (as, a, cie_addr, pi, &dci, is_debug_frame, arg)) < 0)
     return ret;
 
   /* IP-range has same encoding as FDE pointers, except that it's
@@ -323,9 +314,9 @@ dwarf_extract_proc_info_from_fde (unw_addr_space_t as, unw_accessors_t *a,
   ip_range_encoding = dci.fde_encoding & DW_EH_PE_FORMAT_MASK;
 
   if ((ret = dwarf_read_encoded_pointer (as, a, &addr, dci.fde_encoding,
-					 pi, &start_ip, arg)) < 0
+                                         pi, &start_ip, arg)) < 0
       || (ret = dwarf_read_encoded_pointer (as, a, &addr, ip_range_encoding,
-					    pi, &ip_range, arg)) < 0)
+                                            pi, &ip_range, arg)) < 0)
     return ret;
   pi->start_ip = start_ip;
   pi->end_ip = start_ip + ip_range;
@@ -334,16 +325,16 @@ dwarf_extract_proc_info_from_fde (unw_addr_space_t as, unw_accessors_t *a,
   if (dci.sized_augmentation)
     {
       if ((ret = dwarf_read_uleb128 (as, a, &addr, &aug_size, arg)) < 0)
-	return ret;
+        return ret;
       aug_end_addr = addr + aug_size;
     }
 
   if ((ret = dwarf_read_encoded_pointer (as, a, &addr, dci.lsda_encoding,
-					 pi, &pi->lsda, arg)) < 0)
+                                         pi, &pi->lsda, arg)) < 0)
     return ret;
 
   Debug (15, "FDE covers IP 0x%lx-0x%lx, LSDA=0x%lx\n",
-	 (long) pi->start_ip, (long) pi->end_ip, (long) pi->lsda);
+         (long) pi->start_ip, (long) pi->end_ip, (long) pi->lsda);
 
   if (need_unwind_info)
     {
@@ -352,21 +343,21 @@ dwarf_extract_proc_info_from_fde (unw_addr_space_t as, unw_accessors_t *a,
       pi->unwind_info_size = sizeof (dci);
       pi->unwind_info = mempool_alloc (&dwarf_cie_info_pool);
       if (!pi->unwind_info)
-	return -UNW_ENOMEM;
+        return -UNW_ENOMEM;
 
       if (dci.have_abi_marker)
-	{
-	  if ((ret = dwarf_readu16 (as, a, &addr, &dci.abi, arg)) < 0
-	      || (ret = dwarf_readu16 (as, a, &addr, &dci.tag, arg)) < 0)
-	    return ret;
-	  Debug (13, "Found ABI marker = (abi=%u, tag=%u)\n",
-		 dci.abi, dci.tag);
-	}
+        {
+          if ((ret = dwarf_readu16 (as, a, &addr, &dci.abi, arg)) < 0
+              || (ret = dwarf_readu16 (as, a, &addr, &dci.tag, arg)) < 0)
+            return ret;
+          Debug (13, "Found ABI marker = (abi=%u, tag=%u)\n",
+                 dci.abi, dci.tag);
+        }
 
       if (dci.sized_augmentation)
-	dci.fde_instr_start = aug_end_addr;
+        dci.fde_instr_start = aug_end_addr;
       else
-	dci.fde_instr_start = addr;
+        dci.fde_instr_start = addr;
       dci.fde_instr_end = fde_end_addr;
 #ifndef UNW_LOCAL_ONLY
       dci.as = as;
diff --git a/frysk-imports/libunwind/src/dwarf/Gfind_proc_info-lsb.c b/frysk-imports/libunwind/src/dwarf/Gfind_proc_info-lsb.c
index 86d3454..6e1f4c3 100644
--- a/frysk-imports/libunwind/src/dwarf/Gfind_proc_info-lsb.c
+++ b/frysk-imports/libunwind/src/dwarf/Gfind_proc_info-lsb.c
@@ -1,8 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (c) 2003-2005 Hewlett-Packard Development Company, L.P.
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
-   Copyright (c) 2008, Red Hat, Inc.
-	Contributed by Mark Wielaard <mwielaard@redhat.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -28,7 +26,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 /* Locate an FDE via the ELF data-structures defined by LSB v1.3
    (http://www.linuxbase.org/spec/).  */
 
-#include <link.h>
 #include <stddef.h>
 #include <stdio.h>
 #include <limits.h>
@@ -49,27 +46,13 @@ struct table_entry
 #include "os-linux.h"
 #endif
 
-struct callback_data
-  {
-    /* in: */
-    unw_word_t ip;		/* instruction-pointer we're looking for */
-    unw_proc_info_t *pi;	/* proc-info pointer */
-    int need_unwind_info;
-    /* out: */
-    int single_fde;		/* did we find a single FDE? (vs. a table) */
-    unw_dyn_info_t di;		/* table info (if single_fde is false) */
-    unw_dyn_info_t di_debug;	/* additional table info for .debug_frame */
-  };
-
-#endif /* !UNW_REMOTE_ONLY */
-
 static int
 linear_search (unw_addr_space_t as, unw_word_t ip,
-	       unw_word_t eh_frame_start, unw_word_t eh_frame_end,
-	       unw_word_t fde_count,
-	       unw_proc_info_t *pi, int need_unwind_info, void *arg)
+               unw_word_t eh_frame_start, unw_word_t eh_frame_end,
+               unw_word_t fde_count,
+               unw_proc_info_t *pi, int need_unwind_info, void *arg)
 {
-  unw_accessors_t *a = unw_get_accessors (as);
+  unw_accessors_t *a = unw_get_accessors (unw_local_addr_space);
   unw_word_t i = 0, fde_addr, addr = eh_frame_start;
   int ret;
 
@@ -77,28 +60,29 @@ linear_search (unw_addr_space_t as, unw_word_t ip,
     {
       fde_addr = addr;
       if ((ret = dwarf_extract_proc_info_from_fde (as, a, &addr, pi,
-						   need_unwind_info,
-						   eh_frame_start, arg))
-	  < 0)
-	return ret;
+                                                   eh_frame_start,
+                                                   0, 0, arg)) < 0)
+        return ret;
 
       if (ip >= pi->start_ip && ip < pi->end_ip)
-	{
-	  if (!need_unwind_info)
-	    return 1;
-	  addr = fde_addr;
-	  if ((ret = dwarf_extract_proc_info_from_fde (as, a, &addr, pi,
-						       need_unwind_info,
-						       eh_frame_start, arg))
-	      < 0)
-	    return ret;
-	  return 1;
-	}
+        {
+          if (!need_unwind_info)
+            return 1;
+          addr = fde_addr;
+          if ((ret = dwarf_extract_proc_info_from_fde (as, a, &addr, pi,
+                                                       eh_frame_start,
+                                                       need_unwind_info, 0,
+                                                       arg))
+              < 0)
+            return ret;
+          return 1;
+        }
     }
   return -UNW_ENOINFO;
 }
+#endif /* !UNW_REMOTE_ONLY */
 
-#ifndef UNW_REMOTE_ONLY
+#ifdef CONFIG_DEBUG_FRAME
 /* Load .debug_frame section from FILE.  Allocates and returns space
    in *BUF, and sets *BUFSIZE to its size.  IS_LOCAL is 1 if using the
    local process, in which case we can search the system debug file
@@ -114,8 +98,8 @@ load_debug_frame (const char *file, char **buf, size_t *bufsize, int is_local)
   FILE *f;
   Elf_W (Ehdr) ehdr;
   Elf_W (Half) shstrndx;
-  Elf_W (Shdr) *sec_hdrs;
-  char *stringtab;
+  Elf_W (Shdr) *sec_hdrs = NULL;
+  char *stringtab = NULL;
   unsigned int i;
   size_t linksize = 0;
   char *linkbuf = NULL;
@@ -128,7 +112,8 @@ load_debug_frame (const char *file, char **buf, size_t *bufsize, int is_local)
   if (!f)
     return 1;
   
-  fread (&ehdr, sizeof (Elf_W (Ehdr)), 1, f);
+  if (fread (&ehdr, sizeof (Elf_W (Ehdr)), 1, f) != 1)
+    goto file_error;
   
   shstrndx = ehdr.e_shstrndx;
   
@@ -137,13 +122,15 @@ load_debug_frame (const char *file, char **buf, size_t *bufsize, int is_local)
 
   fseek (f, ehdr.e_shoff, SEEK_SET);
   sec_hdrs = calloc (ehdr.e_shnum, sizeof (Elf_W (Shdr)));
-  fread (sec_hdrs, sizeof (Elf_W (Shdr)), ehdr.e_shnum, f);
+  if (fread (sec_hdrs, sizeof (Elf_W (Shdr)), ehdr.e_shnum, f) != ehdr.e_shnum)
+    goto file_error;
   
-  Debug (4, "loading string table of size %d\n",
-	   sec_hdrs[shstrndx].sh_size);
+  Debug (4, "loading string table of size %zd\n",
+           sec_hdrs[shstrndx].sh_size);
   stringtab = malloc (sec_hdrs[shstrndx].sh_size);
   fseek (f, sec_hdrs[shstrndx].sh_offset, SEEK_SET);
-  fread (stringtab, 1, sec_hdrs[shstrndx].sh_size, f);
+  if (fread (stringtab, 1, sec_hdrs[shstrndx].sh_size, f) != sec_hdrs[shstrndx].sh_size)
+    goto file_error;
   
   for (i = 1; i < ehdr.e_shnum && *buf == NULL; i++)
     {
@@ -151,26 +138,28 @@ load_debug_frame (const char *file, char **buf, size_t *bufsize, int is_local)
 
       if (strcmp (secname, ".debug_frame") == 0)
         {
-	  *bufsize = sec_hdrs[i].sh_size;
-	  *buf = malloc (*bufsize);
-
-	  fseek (f, sec_hdrs[i].sh_offset, SEEK_SET);
-	  fread (*buf, 1, *bufsize, f);
-
-	  Debug (4, "read %d bytes of .debug_frame from offset %d\n",
-		 *bufsize, sec_hdrs[i].sh_offset);
-	}
-      else if (is_local >= 0 && strcmp (secname, ".gnu_debuglink") == 0)
-	{
-	  linksize = sec_hdrs[i].sh_size;
-	  linkbuf = malloc (linksize);
-
-	  fseek (f, sec_hdrs[i].sh_offset, SEEK_SET);
-	  fread (linkbuf, 1, linksize, f);
-
-	  Debug (4, "read %d bytes of .gnu_debuglink from offset %d\n",
-		 *bufsize, sec_hdrs[i].sh_offset);
-	}
+          *bufsize = sec_hdrs[i].sh_size;
+          *buf = malloc (*bufsize);
+
+          fseek (f, sec_hdrs[i].sh_offset, SEEK_SET);
+          if (fread (*buf, 1, *bufsize, f) != *bufsize)
+            goto file_error;
+
+          Debug (4, "read %zd bytes of .debug_frame from offset %zd\n",
+                 *bufsize, sec_hdrs[i].sh_offset);
+        }
+      else if (strcmp (secname, ".gnu_debuglink") == 0)
+        {
+          linksize = sec_hdrs[i].sh_size;
+          linkbuf = malloc (linksize);
+
+          fseek (f, sec_hdrs[i].sh_offset, SEEK_SET);
+          if (fread (linkbuf, 1, linksize, f) != linksize)
+            goto file_error;
+
+          Debug (4, "read %zd bytes of .gnu_debuglink from offset %zd\n",
+                 linksize, sec_hdrs[i].sh_offset);
+        }
     }
 
   free (stringtab);
@@ -178,6 +167,13 @@ load_debug_frame (const char *file, char **buf, size_t *bufsize, int is_local)
 
   fclose (f);
 
+  /* Ignore separate debug files which contain a .gnu_debuglink section. */
+  if (linkbuf && is_local == -1)
+    {
+      free (linkbuf);
+      return 1;
+    }
+
   if (*buf == NULL && linkbuf != NULL && memchr (linkbuf, 0, linksize) != NULL)
     {
       char *newname, *basedir, *p;
@@ -187,16 +183,16 @@ load_debug_frame (const char *file, char **buf, size_t *bufsize, int is_local)
       /* XXX: Don't bother with the checksum; just search for the file.  */
       basedir = malloc (strlen (file) + 1);
       newname = malloc (strlen (linkbuf) + strlen (debugdir)
-			+ strlen (file) + 9);
+                        + strlen (file) + 9);
 
       p = strrchr (file, '/');
       if (p != NULL)
-	{
-	  memcpy (basedir, file, p - file);
-	  basedir[p - file] = '\0';
-	}
+        {
+          memcpy (basedir, file, p - file);
+          basedir[p - file] = '\0';
+        }
       else
-	basedir[0] = 0;
+        basedir[0] = 0;
 
       strcpy (newname, basedir);
       strcat (newname, "/");
@@ -204,21 +200,21 @@ load_debug_frame (const char *file, char **buf, size_t *bufsize, int is_local)
       ret = load_debug_frame (newname, buf, bufsize, -1);
 
       if (ret == 1)
-	{
-	  strcpy (newname, basedir);
-	  strcat (newname, "/.debug/");
-	  strcat (newname, linkbuf);
-	  ret = load_debug_frame (newname, buf, bufsize, -1);
-	}
+        {
+          strcpy (newname, basedir);
+          strcat (newname, "/.debug/");
+          strcat (newname, linkbuf);
+          ret = load_debug_frame (newname, buf, bufsize, -1);
+        }
 
       if (ret == 1 && is_local == 1)
-	{
-	  strcpy (newname, debugdir);
-	  strcat (newname, basedir);
-	  strcat (newname, "/");
-	  strcat (newname, linkbuf);
-	  ret = load_debug_frame (newname, buf, bufsize, -1);
-	}
+        {
+          strcpy (newname, debugdir);
+          strcat (newname, basedir);
+          strcat (newname, "/");
+          strcat (newname, linkbuf);
+          ret = load_debug_frame (newname, buf, bufsize, -1);
+        }
 
       free (basedir);
       free (newname);
@@ -226,37 +222,45 @@ load_debug_frame (const char *file, char **buf, size_t *bufsize, int is_local)
   free (linkbuf);
 
   return 0;
+
+/* An error reading image file. Release resources and return error code */
+file_error:
+  free(stringtab);
+  free(sec_hdrs);
+  free(linkbuf);
+  fclose(f);
+
+  return 1;
 }
 
 /* Locate the binary which originated the contents of address ADDR. Return
-   the name of the binary in *name (which is allocated on the heap, and must
-   be freed by the caller).  Returns 0 if a binary is successfully found, or 1
-   if an error occurs.  */
+   the name of the binary in *name (space is allocated by the caller)
+   Returns 0 if a binary is successfully found, or 1 if an error occurs.  */
 
 static int
-find_binary_for_address (unw_word_t ip, char **name)
+find_binary_for_address (unw_word_t ip, char *name, size_t name_size)
 {
-#ifdef __linux
+#if defined(__linux) && (!UNW_REMOTE_ONLY)
   struct map_iterator mi;
-  char path[PATH_MAX];
   int found = 0;
   int pid = getpid ();
   unsigned long segbase, mapoff, hi;
 
   maps_init (&mi, pid);
-  while (maps_next (&mi, &segbase, &hi, &mapoff, path, sizeof (path)))
+  while (maps_next (&mi, &segbase, &hi, &mapoff))
     if (ip >= segbase && ip < hi)
       {
-	found = 1;
-	break;
+        size_t len = strlen (mi.path);
+
+        if (len + 1 <= name_size)
+          {
+            memcpy (name, mi.path, len + 1);
+            found = 1;
+          }
+        break;
       }
   maps_close (&mi);
-
-  if (found)
-    {
-      *name = strdup (path);
-      return 0;
-    }
+  return !found;
 #endif
 
   return 1;
@@ -266,24 +270,23 @@ find_binary_for_address (unw_word_t ip, char **name)
    pointer to debug frame descriptor, or zero if not found.  */
 
 static struct unw_debug_frame_list *
-locate_debug_info (unw_addr_space_t as, struct dl_phdr_info *info,
-		   unw_word_t addr, const char *dlname)
+locate_debug_info (unw_addr_space_t as, unw_word_t addr, const char *dlname,
+                   unw_word_t start, unw_word_t end)
 {
   struct unw_debug_frame_list *w, *fdesc = 0;
-  char *name = 0;
+  char path[PATH_MAX];
+  char *name = path;
   int err;
-  uint64_t start = 0, end = 0;
   char *buf;
   size_t bufsize;
-  unsigned int i;
 
   /* First, see if we loaded this frame already.  */
 
   for (w = as->debug_frames; w; w = w->next)
     {
-      Debug (4, "checking %p: %x-%x\n", w, (int)w->start, (int)w->end);
+      Debug (4, "checking %p: %lx-%lx\n", w, (long)w->start, (long)w->end);
       if (addr >= w->start && addr < w->end)
-	return w;
+        return w;
     }
 
   /* If the object name we receive is blank, there's still a chance of locating
@@ -291,40 +294,17 @@ locate_debug_info (unw_addr_space_t as, struct dl_phdr_info *info,
 
   if (strcmp (dlname, "") == 0)
     {
-      err = find_binary_for_address (addr, &name);
+      err = find_binary_for_address (addr, name, sizeof(path));
       if (err)
         {
-	  Debug (15, "tried to locate binary for 0x%" PRIx64 ", but no luck\n",
-		 (uint64_t) addr);
+          Debug (15, "tried to locate binary for 0x%" PRIx64 ", but no luck\n",
+                 (uint64_t) addr);
           return 0;
-	}
+        }
     }
   else
     name = (char*) dlname;
 
-  /* Find the start/end of the described region by parsing the
-     dl_phdr_info structure.  */
-
-  start = info->dlpi_addr + info->dlpi_phdr[0].p_vaddr;
-  end = start;
-
-  for (i = 0; i < info->dlpi_phnum; i++)
-    {
-      Elf_W (Addr) hdrbase = info->dlpi_addr + info->dlpi_phdr[i].p_vaddr;
-      Elf_W (Addr) hdrlimit = hdrbase + info->dlpi_phdr[i].p_memsz;
-
-      if (info->dlpi_phdr[i].p_type != PT_LOAD)
-	continue;
-
-      if (hdrbase < start)
-	start = hdrbase;
-      if (hdrlimit > end)
-	end = hdrlimit;
-    }
-
-  Debug (4, "calculated bounds of %x-%x for '%s'\n", (int)start, (int)end,
-	 name);
-  
   err = load_debug_frame (name, &buf, &bufsize, as == unw_local_addr_space);
   
   if (!err)
@@ -341,9 +321,6 @@ locate_debug_info (unw_addr_space_t as, struct dl_phdr_info *info,
       as->debug_frames = fdesc;
     }
   
-  if (name && name != dlname)
-    free (name);
-  
   return fdesc;
 }
 
@@ -354,21 +331,9 @@ struct debug_frame_tab
     uint32_t size;
   };
 
-static struct debug_frame_tab *
-debug_frame_tab_new (unsigned int base_size)
-{
-  struct debug_frame_tab *tab = malloc (sizeof (struct debug_frame_tab));
-
-  tab->tab = calloc (base_size, sizeof (struct table_entry));
-  tab->length = 0;
-  tab->size = base_size;
-  
-  return tab;
-}
-
 static void
 debug_frame_tab_append (struct debug_frame_tab *tab,
-			unw_word_t fde_offset, unw_word_t start_ip)
+                        unw_word_t fde_offset, unw_word_t start_ip)
 {
   unsigned int length = tab->length;
 
@@ -407,34 +372,187 @@ debug_frame_tab_compare (const void *a, const void *b)
     return 0;
 }
 
-/* Info is a pointer to a unw_dyn_info_t structure and, on entry,
-   member u.rti.segbase contains the instruction-pointer we're looking
+PROTECTED int
+dwarf_find_debug_frame (int found, unw_dyn_info_t *di_debug, unw_word_t ip,
+                        unw_word_t segbase, const char* obj_name,
+                        unw_word_t start, unw_word_t end)
+{
+  unw_dyn_info_t *di;
+  struct unw_debug_frame_list *fdesc = 0;
+  unw_accessors_t *a;
+  unw_word_t addr;
+
+  Debug (15, "Trying to find .debug_frame for %s\n", obj_name);
+  di = di_debug;
+
+  fdesc = locate_debug_info (unw_local_addr_space, ip, obj_name, start, end);
+
+  if (!fdesc)
+    {
+      Debug (15, "couldn't load .debug_frame\n");
+      return found;
+    }
+  else
+    {
+      char *buf;
+      size_t bufsize;
+      unw_word_t item_start, item_end = 0;
+      uint32_t u32val = 0;
+      uint64_t cie_id = 0;
+      struct debug_frame_tab tab;
+
+      Debug (15, "loaded .debug_frame\n");
+
+      buf = fdesc->debug_frame;
+      bufsize = fdesc->debug_frame_size;
+
+      if (bufsize == 0)
+       {
+         Debug (15, "zero-length .debug_frame\n");
+         return found;
+       }
+
+      /* Now create a binary-search table, if it does not already exist.  */
+      if (!fdesc->index)
+       {
+         addr = (unw_word_t) (uintptr_t) buf;
+
+         a = unw_get_accessors (unw_local_addr_space);
+
+         /* Find all FDE entries in debug_frame, and make into a sorted
+            index.  */
+
+         tab.length = 0;
+         tab.size = 16;
+         tab.tab = calloc (tab.size, sizeof (struct table_entry));
+
+         while (addr < (unw_word_t) (uintptr_t) (buf + bufsize))
+           {
+             uint64_t id_for_cie;
+             item_start = addr;
+
+             dwarf_readu32 (unw_local_addr_space, a, &addr, &u32val, NULL);
+
+             if (u32val == 0)
+               break;
+             else if (u32val != 0xffffffff)
+               {
+                 uint32_t cie_id32 = 0;
+                 item_end = addr + u32val;
+                 dwarf_readu32 (unw_local_addr_space, a, &addr, &cie_id32,
+                                NULL);
+                 cie_id = cie_id32;
+                 id_for_cie = 0xffffffff;
+               }
+             else
+               {
+                 uint64_t u64val = 0;
+                 /* Extended length.  */
+                 dwarf_readu64 (unw_local_addr_space, a, &addr, &u64val, NULL);
+                 item_end = addr + u64val;
+
+                 dwarf_readu64 (unw_local_addr_space, a, &addr, &cie_id, NULL);
+                 id_for_cie = 0xffffffffffffffffull;
+               }
+
+             /*Debug (1, "CIE/FDE id = %.8x\n", (int) cie_id);*/
+
+             if (cie_id == id_for_cie)
+               ;
+             /*Debug (1, "Found CIE at %.8x.\n", item_start);*/
+             else
+               {
+                 unw_word_t fde_addr = item_start;
+                 unw_proc_info_t this_pi;
+                 int err;
+
+                 /*Debug (1, "Found FDE at %.8x\n", item_start);*/
+
+                 err = dwarf_extract_proc_info_from_fde (unw_local_addr_space,
+                                                         a, &fde_addr,
+                                                         &this_pi,
+                                                         (uintptr_t) buf, 0, 1,
+                                                         NULL);
+                 if (err == 0)
+                   {
+                     Debug (15, "start_ip = %lx, end_ip = %lx\n",
+                            (long) this_pi.start_ip, (long) this_pi.end_ip);
+                     debug_frame_tab_append (&tab,
+                                             item_start - (unw_word_t) (uintptr_t) buf,
+                                             this_pi.start_ip);
+                   }
+                 /*else
+                   Debug (1, "FDE parse failed\n");*/
+               }
+
+             addr = item_end;
+           }
+
+         debug_frame_tab_shrink (&tab);
+         qsort (tab.tab, tab.length, sizeof (struct table_entry),
+                debug_frame_tab_compare);
+         /* for (i = 0; i < tab.length; i++)
+            {
+            fprintf (stderr, "ip %x, fde offset %x\n",
+            (int) tab.tab[i].start_ip_offset,
+            (int) tab.tab[i].fde_offset);
+            }*/
+         fdesc->index = tab.tab;
+         fdesc->index_size = tab.length;
+       }
+
+      di->format = UNW_INFO_FORMAT_TABLE;
+      di->start_ip = fdesc->start;
+      di->end_ip = fdesc->end;
+      di->u.ti.name_ptr = (unw_word_t) (uintptr_t) obj_name;
+      di->u.ti.table_data = (unw_word_t *) fdesc;
+      di->u.ti.table_len = sizeof (*fdesc) / sizeof (unw_word_t);
+      di->u.ti.segbase = segbase;
+
+      found = 1;
+      Debug (15, "found debug_frame table `%s': segbase=0x%lx, len=%lu, "
+            "gp=0x%lx, table_data=0x%lx\n",
+            (char *) (uintptr_t) di->u.ti.name_ptr,
+            (long) di->u.ti.segbase, (long) di->u.ti.table_len,
+            (long) di->gp, (long) di->u.ti.table_data);
+    }
+  return found;
+}
+
+#endif /* CONFIG_DEBUG_FRAME */
+
+#ifndef UNW_REMOTE_ONLY
+
+/* ptr is a pointer to a dwarf_callback_data structure and, on entry,
+   member ip contains the instruction-pointer we're looking
    for.  */
-static int
-callback (struct dl_phdr_info *info, size_t size, void *ptr)
+HIDDEN int
+dwarf_callback (struct dl_phdr_info *info, size_t size, void *ptr)
 {
-  struct callback_data *cb_data = ptr;
+  struct dwarf_callback_data *cb_data = ptr;
   unw_dyn_info_t *di = &cb_data->di;
   const Elf_W(Phdr) *phdr, *p_eh_hdr, *p_dynamic, *p_text;
   unw_word_t addr, eh_frame_start, eh_frame_end, fde_count, ip;
-  Elf_W(Addr) load_base, segbase = 0, max_load_addr = 0;
+  Elf_W(Addr) load_base, max_load_addr = 0;
   int ret, need_unwind_info = cb_data->need_unwind_info;
   unw_proc_info_t *pi = cb_data->pi;
   struct dwarf_eh_frame_hdr *hdr;
   unw_accessors_t *a;
   long n;
-  struct unw_debug_frame_list *fdesc = 0;
   int found = 0;
+#ifdef CONFIG_DEBUG_FRAME
+  unw_word_t start, end;
+#endif /* CONFIG_DEBUG_FRAME*/
 
   ip = cb_data->ip;
 
   /* Make sure struct dl_phdr_info is at least as big as we need.  */
   if (size < offsetof (struct dl_phdr_info, dlpi_phnum)
-	     + sizeof (info->dlpi_phnum))
+             + sizeof (info->dlpi_phnum))
     return -1;
 
   Debug (15, "checking %s, base=0x%lx)\n",
-	 info->dlpi_name, (long) info->dlpi_addr);
+         info->dlpi_name, (long) info->dlpi_addr);
 
   phdr = info->dlpi_phdr;
   load_base = info->dlpi_addr;
@@ -447,19 +565,19 @@ callback (struct dl_phdr_info *info, size_t size, void *ptr)
   for (n = info->dlpi_phnum; --n >= 0; phdr++)
     {
       if (phdr->p_type == PT_LOAD)
-	{
-	  Elf_W(Addr) vaddr = phdr->p_vaddr + load_base;
+        {
+          Elf_W(Addr) vaddr = phdr->p_vaddr + load_base;
 
-	  if (ip >= vaddr && ip < vaddr + phdr->p_memsz)
-	    p_text = phdr;
+          if (ip >= vaddr && ip < vaddr + phdr->p_memsz)
+            p_text = phdr;
 
-	  if (vaddr + phdr->p_filesz > max_load_addr)
-	    max_load_addr = vaddr + phdr->p_filesz;
-	}
+          if (vaddr + phdr->p_filesz > max_load_addr)
+            max_load_addr = vaddr + phdr->p_filesz;
+        }
       else if (phdr->p_type == PT_GNU_EH_FRAME)
-	p_eh_hdr = phdr;
+        p_eh_hdr = phdr;
       else if (phdr->p_type == PT_DYNAMIC)
-	p_dynamic = phdr;
+        p_dynamic = phdr;
     }
   
   if (!p_text)
@@ -467,262 +585,134 @@ callback (struct dl_phdr_info *info, size_t size, void *ptr)
 
   if (p_eh_hdr)
     {
-      if (likely (p_eh_hdr->p_vaddr >= p_text->p_vaddr
-		  && p_eh_hdr->p_vaddr < p_text->p_vaddr + p_text->p_memsz))
-	/* normal case: eh-hdr is inside text segment */
-	segbase = p_text->p_vaddr + load_base;
-      else
-	{
-	  /* Special case: eh-hdr is in some other segment; this may
-	     happen, e.g., for the Linux kernel's gate DSO, for
-	     example.  */
-	  phdr = info->dlpi_phdr;
-	  for (n = info->dlpi_phnum; --n >= 0; phdr++)
-	    {
-	      if (phdr->p_type == PT_LOAD && p_eh_hdr->p_vaddr >= phdr->p_vaddr
-		  && p_eh_hdr->p_vaddr < phdr->p_vaddr + phdr->p_memsz)
-		{
-		  segbase = phdr->p_vaddr + load_base;
-		  break;
-		}
-	    }
-	}
-
       if (p_dynamic)
-	{
-	  /* For dynamicly linked executables and shared libraries,
-	     DT_PLTGOT is the value that data-relative addresses are
-	     relative to for that object.  We call this the "gp".  */
-	  Elf_W(Dyn) *dyn = (Elf_W(Dyn) *)(p_dynamic->p_vaddr + load_base);
-	  for (; dyn->d_tag != DT_NULL; ++dyn)
-	    if (dyn->d_tag == DT_PLTGOT)
-	      {
-		/* Assume that _DYNAMIC is writable and GLIBC has
-		   relocated it (true for x86 at least).  */
-		di->gp = dyn->d_un.d_ptr;
-		break;
-	      }
-	}
+        {
+          /* For dynamicly linked executables and shared libraries,
+             DT_PLTGOT is the value that data-relative addresses are
+             relative to for that object.  We call this the "gp".  */
+          Elf_W(Dyn) *dyn = (Elf_W(Dyn) *)(p_dynamic->p_vaddr + load_base);
+          for (; dyn->d_tag != DT_NULL; ++dyn)
+            if (dyn->d_tag == DT_PLTGOT)
+              {
+                /* Assume that _DYNAMIC is writable and GLIBC has
+                   relocated it (true for x86 at least).  */
+                di->gp = dyn->d_un.d_ptr;
+                break;
+              }
+        }
       else
-	/* Otherwise this is a static executable with no _DYNAMIC.  Assume
-	   that data-relative addresses are relative to 0, i.e.,
-	   absolute.  */
-	di->gp = 0;
+        /* Otherwise this is a static executable with no _DYNAMIC.  Assume
+           that data-relative addresses are relative to 0, i.e.,
+           absolute.  */
+        di->gp = 0;
       pi->gp = di->gp;
 
       hdr = (struct dwarf_eh_frame_hdr *) (p_eh_hdr->p_vaddr + load_base);
       if (hdr->version != DW_EH_VERSION)
-	{
-	  Debug (1, "table `%s' has unexpected version %d\n",
-		 info->dlpi_name, hdr->version);
-	  return 0;
-	}
+        {
+          Debug (1, "table `%s' has unexpected version %d\n",
+                 info->dlpi_name, hdr->version);
+          return 0;
+        }
 
       a = unw_get_accessors (unw_local_addr_space);
       addr = (unw_word_t) (uintptr_t) (hdr + 1);
 
       /* (Optionally) read eh_frame_ptr: */
       if ((ret = dwarf_read_encoded_pointer (unw_local_addr_space, a,
-					     &addr, hdr->eh_frame_ptr_enc, pi,
-					     &eh_frame_start, NULL)) < 0)
-	return ret;
+                                             &addr, hdr->eh_frame_ptr_enc, pi,
+                                             &eh_frame_start, NULL)) < 0)
+        return ret;
 
       /* (Optionally) read fde_count: */
       if ((ret = dwarf_read_encoded_pointer (unw_local_addr_space, a,
-					     &addr, hdr->fde_count_enc, pi,
-					     &fde_count, NULL)) < 0)
-	return ret;
+                                             &addr, hdr->fde_count_enc, pi,
+                                             &fde_count, NULL)) < 0)
+        return ret;
 
       if (hdr->table_enc != (DW_EH_PE_datarel | DW_EH_PE_sdata4))
-	{
-	  /* If there is no search table or it has an unsupported
-	     encoding, fall back on linear search.  */
-	  if (hdr->table_enc == DW_EH_PE_omit)
-	    Debug (4, "table `%s' lacks search table; doing linear search\n",
-		   info->dlpi_name);
-	  else
-	    Debug (4, "table `%s' has encoding 0x%x; doing linear search\n",
-		   info->dlpi_name, hdr->table_enc);
-
-	  eh_frame_end = max_load_addr;	/* XXX can we do better? */
-
-	  if (hdr->fde_count_enc == DW_EH_PE_omit)
-	    fde_count = ~0UL;
-	  if (hdr->eh_frame_ptr_enc == DW_EH_PE_omit)
-	    abort ();
-
-	  /* XXX we know how to build a local binary search table for
-	     .debug_frame, so we could do that here too.  */
-	  cb_data->single_fde = 1;
-	  found = linear_search (unw_local_addr_space, ip,
-				 eh_frame_start, eh_frame_end, fde_count,
-				 pi, need_unwind_info, NULL);
-	  if (found != 1)
-	    found = 0;
-	}
+        {
+          /* If there is no search table or it has an unsupported
+             encoding, fall back on linear search.  */
+          if (hdr->table_enc == DW_EH_PE_omit)
+            Debug (4, "table `%s' lacks search table; doing linear search\n",
+                   info->dlpi_name);
+          else
+            Debug (4, "table `%s' has encoding 0x%x; doing linear search\n",
+                   info->dlpi_name, hdr->table_enc);
+
+          eh_frame_end = max_load_addr; /* XXX can we do better? */
+
+          if (hdr->fde_count_enc == DW_EH_PE_omit)
+            fde_count = ~0UL;
+          if (hdr->eh_frame_ptr_enc == DW_EH_PE_omit)
+            abort ();
+
+          /* XXX we know how to build a local binary search table for
+             .debug_frame, so we could do that here too.  */
+          cb_data->single_fde = 1;
+          found = linear_search (unw_local_addr_space, ip,
+                                 eh_frame_start, eh_frame_end, fde_count,
+                                 pi, need_unwind_info, NULL);
+          if (found != 1)
+            found = 0;
+        }
       else
-	{
-	  di->format = UNW_INFO_FORMAT_REMOTE_TABLE;
-	  di->start_ip = p_text->p_vaddr + load_base;
-	  di->end_ip = p_text->p_vaddr + load_base + p_text->p_memsz;
-	  di->u.rti.name_ptr = (unw_word_t) (uintptr_t) info->dlpi_name;
-	  di->u.rti.table_data = addr;
-	  assert (sizeof (struct table_entry) % sizeof (unw_word_t) == 0);
-	  di->u.rti.table_len = (fde_count * sizeof (struct table_entry)
-				 / sizeof (unw_word_t));
-	  /* For the binary-search table in the eh_frame_hdr, data-relative
-	     means relative to the start of that section... */
-	  di->u.rti.segbase = (unw_word_t) (uintptr_t) hdr;
-
-	  found = 1;
-	  Debug (15, "found table `%s': segbase=0x%lx, len=%lu, gp=0x%lx, "
-		 "table_data=0x%lx\n", (char *) (uintptr_t) di->u.rti.name_ptr,
-		 (long) di->u.rti.segbase, (long) di->u.rti.table_len,
-		 (long) di->gp, (long) di->u.rti.table_data);
-	}
+        {
+          di->format = UNW_INFO_FORMAT_REMOTE_TABLE;
+          di->start_ip = p_text->p_vaddr + load_base;
+          di->end_ip = p_text->p_vaddr + load_base + p_text->p_memsz;
+          di->u.rti.name_ptr = (unw_word_t) (uintptr_t) info->dlpi_name;
+          di->u.rti.table_data = addr;
+          assert (sizeof (struct table_entry) % sizeof (unw_word_t) == 0);
+          di->u.rti.table_len = (fde_count * sizeof (struct table_entry)
+                                 / sizeof (unw_word_t));
+          /* For the binary-search table in the eh_frame_hdr, data-relative
+             means relative to the start of that section... */
+          di->u.rti.segbase = (unw_word_t) (uintptr_t) hdr;
+
+          found = 1;
+          Debug (15, "found table `%s': segbase=0x%lx, len=%lu, gp=0x%lx, "
+                 "table_data=0x%lx\n", (char *) (uintptr_t) di->u.rti.name_ptr,
+                 (long) di->u.rti.segbase, (long) di->u.rti.table_len,
+                 (long) di->gp, (long) di->u.rti.table_data);
+        }
     }
 
-  Debug (15, "Trying to find .debug_frame\n");
-  di = &cb_data->di_debug;
-  fdesc = locate_debug_info (unw_local_addr_space, info, ip, info->dlpi_name);
+#ifdef CONFIG_DEBUG_FRAME
+  /* Find the start/end of the described region by parsing the phdr_info
+     structure.  */
+  start = (unw_word_t) -1;
+  end = 0;
 
-  if (!fdesc)
+  for (n = 0; n < info->dlpi_phnum; n++)
     {
-      Debug (15, "couldn't load .debug_frame\n");
-      return found;
-    }
-  else
-    {
-      char *buf;
-      size_t bufsize;
-      unw_word_t item_start, item_end = 0;
-      uint32_t u32val = 0;
-      uint64_t cie_id = 0;
-      struct debug_frame_tab *tab;
-
-      Debug (15, "loaded .debug_frame\n");
-
-      buf = fdesc->debug_frame;
-      bufsize = fdesc->debug_frame_size;
-
-      if (bufsize == 0)
-	{
-	  Debug (15, "zero-length .debug_frame\n");
-	  return found;
-	}
+      if (info->dlpi_phdr[n].p_type == PT_LOAD)
+        {
+          unw_word_t seg_start = info->dlpi_addr + info->dlpi_phdr[n].p_vaddr;
+          unw_word_t seg_end = seg_start + info->dlpi_phdr[n].p_memsz;
 
-      /* Now create a binary-search table, if it does not already exist.  */
-      if (!fdesc->index)
-	{
-	  addr = (unw_word_t) (uintptr_t) buf;
-
-	  a = unw_get_accessors (unw_local_addr_space);
-
-	  /* Find all FDE entries in debug_frame, and make into a sorted
-	     index.  */
-
-	  tab = debug_frame_tab_new (16);
-
-	  while (addr < (unw_word_t) (uintptr_t) (buf + bufsize))
-	    {
-	      uint64_t id_for_cie;
-	      item_start = addr;
-
-	      dwarf_readu32 (unw_local_addr_space, a, &addr, &u32val, NULL);
-
-	      if (u32val == 0)
-		break;
-	      else if (u32val != 0xffffffff)
-		{
-		  uint32_t cie_id32 = 0;
-		  item_end = addr + u32val;
-		  dwarf_readu32 (unw_local_addr_space, a, &addr, &cie_id32,
-				 NULL);
-		  cie_id = cie_id32;
-		  id_for_cie = 0xffffffff;
-		}
-	      else
-		{
-		  uint64_t u64val = 0;
-		  /* Extended length.  */
-		  dwarf_readu64 (unw_local_addr_space, a, &addr, &u64val, NULL);
-		  item_end = addr + u64val;
-
-		  dwarf_readu64 (unw_local_addr_space, a, &addr, &cie_id, NULL);
-		  id_for_cie = 0xffffffffffffffffull;
-		}
-
-	      /*Debug (1, "CIE/FDE id = %.8x\n", (int) cie_id);*/
-
-	      if (cie_id == id_for_cie)
-		;
-	      /*Debug (1, "Found CIE at %.8x.\n", item_start);*/
-	      else
-		{
-		  unw_word_t fde_addr = item_start;
-		  unw_proc_info_t this_pi;
-		  int err;
-
-		  /*Debug (1, "Found FDE at %.8x\n", item_start);*/
-
-		  err = dwarf_extract_proc_info_from_fde (unw_local_addr_space,
-							  a, &fde_addr,
-							  &this_pi, 0,
-							  (uintptr_t) buf,
-							  NULL);
-		  if (err == 0)
-		    {
-		      Debug (15, "start_ip = %x, end_ip = %x\n",
-			     (int) this_pi.start_ip, (int) this_pi.end_ip);
-		      debug_frame_tab_append (tab,
-					      item_start - (unw_word_t) (uintptr_t) buf,
-					      this_pi.start_ip);
-		    }
-		  /*else
-		    Debug (1, "FDE parse failed\n");*/
-		}
-
-	      addr = item_end;
-	    }
-
-	  debug_frame_tab_shrink (tab);
-	  qsort (tab->tab, tab->length, sizeof (struct table_entry),
-		 debug_frame_tab_compare);
-	  /* for (i = 0; i < tab->length; i++)
-	     {
-	     fprintf (stderr, "ip %x, fde offset %x\n",
-	     (int) tab->tab[i].start_ip_offset,
-	     (int) tab->tab[i].fde_offset);
-	     }*/
-	  fdesc->index = tab->tab;
-	  fdesc->index_size = tab->length;
-	  free (tab);
-	}
+          if (seg_start < start)
+            start = seg_start;
 
-      di->format = UNW_INFO_FORMAT_TABLE;
-      di->start_ip = fdesc->start;
-      di->end_ip = fdesc->end;
-      di->u.ti.name_ptr = (unw_word_t) (uintptr_t) info->dlpi_name;
-      di->u.ti.table_data = (unw_word_t *) fdesc;
-      di->u.ti.table_len = sizeof (*fdesc) / sizeof (unw_word_t);
-      di->u.ti.segbase = (unw_word_t) (uintptr_t) info->dlpi_addr;
-
-      found = 1;
-      Debug (15, "found debug_frame table `%s': segbase=0x%lx, len=%lu, "
-	     "gp=0x%lx, table_data=0x%lx\n",
-	     (char *) (uintptr_t) di->u.ti.name_ptr,
-	     (long) di->u.ti.segbase, (long) di->u.ti.table_len,
-	     (long) di->gp, (long) di->u.ti.table_data);
+          if (seg_end > end)
+            end = seg_end;
+        }
     }
 
+  found = dwarf_find_debug_frame (found, &cb_data->di_debug, ip,
+                                  info->dlpi_addr, info->dlpi_name, start,
+                                  end);
+#endif  /* CONFIG_DEBUG_FRAME */
+
   return found;
 }
 
 HIDDEN int
 dwarf_find_proc_info (unw_addr_space_t as, unw_word_t ip,
-		      unw_proc_info_t *pi, int need_unwind_info, void *arg)
+                      unw_proc_info_t *pi, int need_unwind_info, void *arg)
 {
-  struct callback_data cb_data;
+  struct dwarf_callback_data cb_data;
   intrmask_t saved_mask;
   int ret;
 
@@ -735,9 +725,9 @@ dwarf_find_proc_info (unw_addr_space_t as, unw_word_t ip,
   cb_data.di.format = -1;
   cb_data.di_debug.format = -1;
 
-  sigprocmask (SIG_SETMASK, &unwi_full_mask, &saved_mask);
-  ret = dl_iterate_phdr (callback, &cb_data);
-  sigprocmask (SIG_SETMASK, &saved_mask, NULL);
+  SIGPROCMASK (SIG_SETMASK, &unwi_full_mask, &saved_mask);
+  ret = dl_iterate_phdr (dwarf_callback, &cb_data);
+  SIGPROCMASK (SIG_SETMASK, &saved_mask, NULL);
 
   if (ret <= 0)
     {
@@ -752,13 +742,13 @@ dwarf_find_proc_info (unw_addr_space_t as, unw_word_t ip,
   /* search the table: */
   if (cb_data.di.format != -1)
     ret = dwarf_search_unwind_table (as, ip, &cb_data.di,
-				      pi, need_unwind_info, arg);
+                                      pi, need_unwind_info, arg);
   else
     ret = -UNW_ENOINFO;
 
   if (ret == -UNW_ENOINFO && cb_data.di_debug.format != -1)
     ret = dwarf_search_unwind_table (as, ip, &cb_data.di_debug, pi,
-				     need_unwind_info, arg);
+                                     need_unwind_info, arg);
   return ret;
 }
 
@@ -766,7 +756,7 @@ static inline const struct table_entry *
 lookup (const struct table_entry *table, size_t table_size, int32_t rel_ip)
 {
   unsigned long table_len = table_size / sizeof (struct table_entry);
-  const struct table_entry *e = 0;
+  const struct table_entry *e = NULL;
   unsigned long lo, hi, mid;
 
   /* do a binary search for right entry: */
@@ -774,14 +764,14 @@ lookup (const struct table_entry *table, size_t table_size, int32_t rel_ip)
     {
       mid = (lo + hi) / 2;
       e = table + mid;
-      Debug (1, "e->start_ip_offset = %x\n", (int) e->start_ip_offset);
+      Debug (15, "e->start_ip_offset = %lx\n", (long) e->start_ip_offset);
       if (rel_ip < e->start_ip_offset)
-	hi = mid;
+        hi = mid;
       else
-	lo = mid + 1;
+        lo = mid + 1;
     }
   if (hi <= 0)
-	return NULL;
+        return NULL;
   e = table + hi - 1;
   return e;
 }
@@ -795,8 +785,8 @@ lookup (const struct table_entry *table, size_t table_size, int32_t rel_ip)
    occurred reading remote memory.  */
 static int
 remote_lookup (unw_addr_space_t as,
-	       unw_word_t table, size_t table_size, int32_t rel_ip,
-	       struct table_entry *e, void *arg)
+               unw_word_t table, size_t table_size, int32_t rel_ip,
+               struct table_entry *e, void *arg)
 {
   unsigned long table_len = table_size / sizeof (struct table_entry);
   unw_accessors_t *a = unw_get_accessors (as);
@@ -811,12 +801,12 @@ remote_lookup (unw_addr_space_t as,
       mid = (lo + hi) / 2;
       e_addr = table + mid * sizeof (struct table_entry);
       if ((ret = dwarf_reads32 (as, a, &e_addr, &start, arg)) < 0)
-	return ret;
+        return ret;
 
       if (rel_ip < start)
-	hi = mid;
+        hi = mid;
       else
-	lo = mid + 1;
+        lo = mid + 1;
     }
   if (hi <= 0)
     return 0;
@@ -829,13 +819,19 @@ remote_lookup (unw_addr_space_t as,
 
 #endif /* !UNW_LOCAL_ONLY */
 
+static int is_remote_table(int format)
+{
+  return (format == UNW_INFO_FORMAT_REMOTE_TABLE ||
+          format == UNW_INFO_FORMAT_IP_OFFSET);
+}
+
 PROTECTED int
 dwarf_search_unwind_table (unw_addr_space_t as, unw_word_t ip,
-			   unw_dyn_info_t *di, unw_proc_info_t *pi,
-			   int need_unwind_info, void *arg)
+                           unw_dyn_info_t *di, unw_proc_info_t *pi,
+                           int need_unwind_info, void *arg)
 {
   const struct table_entry *e = NULL, *table;
-  unw_word_t segbase = 0, fde_addr;
+  unw_word_t ip_base = 0, segbase = 0, fde_addr;
   unw_accessors_t *a;
 #ifndef UNW_LOCAL_ONLY
   struct table_entry ent;
@@ -844,21 +840,15 @@ dwarf_search_unwind_table (unw_addr_space_t as, unw_word_t ip,
   unw_word_t debug_frame_base;
   size_t table_len;
 
-  assert (di->format == UNW_INFO_FORMAT_REMOTE_TABLE
-	  || di->format == UNW_INFO_FORMAT_TABLE);
-
-  // FRYSK LOCAL WAY to handle debug_frame.
-  if (di->format == UNW_INFO_FORMAT_TABLE)
-    {
-      ret = linear_search (as, ip, di->u.rti.table_data,
-			   di->u.rti.table_data
-			   + di->u.rti.table_len * sizeof (unw_word_t),
-			   ~0UL, pi, need_unwind_info, arg);
-      return ret;
-    }
-
+#ifdef UNW_REMOTE_ONLY
+  assert (is_remote_table(di->format));
+#else
+  assert (is_remote_table(di->format)
+          || di->format == UNW_INFO_FORMAT_TABLE);
+#endif
   assert (ip >= di->start_ip && ip < di->end_ip);
-  if (di->format == UNW_INFO_FORMAT_REMOTE_TABLE)
+
+  if (is_remote_table(di->format))
     {
       table = (const struct table_entry *) (uintptr_t) di->u.rti.table_data;
       table_len = di->u.rti.table_len * sizeof (unw_word_t);
@@ -866,16 +856,15 @@ dwarf_search_unwind_table (unw_addr_space_t as, unw_word_t ip,
     }
   else
     {
+      assert(di->format == UNW_INFO_FORMAT_TABLE);
 #ifndef UNW_REMOTE_ONLY
       struct unw_debug_frame_list *fdesc = (void *) di->u.ti.table_data;
 
-      /* UNW_INFO_FORMAT_TABLE (i.e. .debug_frame) is currently only
-	 supported for the local address space.  Both the index and
-	 the unwind tables live in local memory, but the address space
-	 to check for properties like the address size and endianness
-	 is the target one.  When the ptrace code adds support for
-	 .debug_frame something will have to change.  */
-      assert (as == unw_local_addr_space);
+      /* UNW_INFO_FORMAT_TABLE (i.e. .debug_frame) is read from local address
+         space.  Both the index and the unwind tables live in local memory, but
+         the address space to check for properties like the address size and
+         endianness is the target one.  */
+      as = unw_local_addr_space;
       table = fdesc->index;
       table_len = fdesc->index_size * sizeof (struct table_entry);
       debug_frame_base = (uintptr_t) fdesc->debug_frame;
@@ -884,11 +873,17 @@ dwarf_search_unwind_table (unw_addr_space_t as, unw_word_t ip,
 
   a = unw_get_accessors (as);
 
+  segbase = di->u.rti.segbase;
+  if (di->format == UNW_INFO_FORMAT_IP_OFFSET) {
+    ip_base = di->start_ip;
+  } else {
+    ip_base = segbase;
+  }
+
 #ifndef UNW_REMOTE_ONLY
   if (as == unw_local_addr_space)
     {
-      segbase = di->u.rti.segbase;
-      e = lookup (table, table_len, ip - segbase);
+      e = lookup (table, table_len, ip - ip_base);
     }
   else
 #endif
@@ -896,34 +891,36 @@ dwarf_search_unwind_table (unw_addr_space_t as, unw_word_t ip,
 #ifndef UNW_LOCAL_ONLY
       segbase = di->u.rti.segbase;
       if ((ret = remote_lookup (as, (uintptr_t) table, table_len,
-				ip - segbase, &ent, arg)) < 0)
-	return ret;
+                                ip - ip_base, &ent, arg)) < 0)
+        return ret;
       if (ret)
-	e = &ent;
+        e = &ent;
       else
-	e = NULL;	/* no info found */
+        e = NULL;       /* no info found */
 #endif
     }
   if (!e)
     {
-      Debug (1, "IP %x inside range %x-%x, but no explicit unwind info found\n",
-	     (int) ip, (int) di->start_ip, (int) di->end_ip);
+      Debug (1, "IP %lx inside range %lx-%lx, but no explicit unwind info found\n",
+             (long) ip, (long) di->start_ip, (long) di->end_ip);
       /* IP is inside this table's range, but there is no explicit
-	 unwind info.  */
+         unwind info.  */
       return -UNW_ENOINFO;
     }
   Debug (15, "ip=0x%lx, start_ip=0x%lx\n",
-	 (long) ip, (long) (e->start_ip_offset));
+         (long) ip, (long) (e->start_ip_offset));
   if (debug_frame_base)
     fde_addr = e->fde_offset + debug_frame_base;
   else
     fde_addr = e->fde_offset + segbase;
-  Debug (1, "e->fde_offset = %x, segbase = %x, debug_frame_base = %x, "
-	    "fde_addr = %x\n", (int) e->fde_offset, (int) segbase,
-	    (int) debug_frame_base, (int) fde_addr);
+  Debug (1, "e->fde_offset = %lx, segbase = %lx, debug_frame_base = %lx, "
+            "fde_addr = %lx\n", (long) e->fde_offset, (long) segbase,
+            (long) debug_frame_base, (long) fde_addr);
   if ((ret = dwarf_extract_proc_info_from_fde (as, a, &fde_addr, pi,
-					       need_unwind_info,
-					       debug_frame_base, arg)) < 0)
+                                               debug_frame_base ?
+                                               debug_frame_base : segbase,
+                                               need_unwind_info,
+                                               debug_frame_base != 0, arg)) < 0)
     return ret;
 
   /* .debug_frame uses an absolute encoding that does not know about any
@@ -932,6 +929,7 @@ dwarf_search_unwind_table (unw_addr_space_t as, unw_word_t ip,
     {
       pi->start_ip += segbase;
       pi->end_ip += segbase;
+      pi->flags = UNW_PI_FLAG_DEBUG_FRAME;
     }
 
   if (ip < pi->start_ip || ip >= pi->end_ip)
@@ -943,5 +941,5 @@ dwarf_search_unwind_table (unw_addr_space_t as, unw_word_t ip,
 HIDDEN void
 dwarf_put_unwind_info (unw_addr_space_t as, unw_proc_info_t *pi, void *arg)
 {
-  return;	/* always a nop */
+  return;       /* always a nop */
 }
diff --git a/frysk-imports/libunwind/src/dwarf/Gfind_unwind_table.c b/frysk-imports/libunwind/src/dwarf/Gfind_unwind_table.c
new file mode 100644
index 0000000..a51c611
--- /dev/null
+++ b/frysk-imports/libunwind/src/dwarf/Gfind_unwind_table.c
@@ -0,0 +1,227 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2003-2004 Hewlett-Packard Co
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include <fcntl.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <sys/mman.h>
+
+#include "libunwind_i.h"
+#include "dwarf-eh.h"
+#include "dwarf_i.h"
+
+int
+dwarf_find_unwind_table (struct elf_dyn_info *edi, unw_addr_space_t as,
+                         char *path, unw_word_t segbase, unw_word_t mapoff,
+                         unw_word_t ip)
+{
+  Elf_W(Phdr) *phdr, *ptxt = NULL, *peh_hdr = NULL, *pdyn = NULL;
+  unw_word_t addr, eh_frame_start, fde_count, load_base;
+  unw_word_t max_load_addr = 0;
+  unw_word_t start_ip = (unw_word_t) -1;
+  unw_word_t end_ip = 0;
+  struct dwarf_eh_frame_hdr *hdr;
+  unw_proc_info_t pi;
+  unw_accessors_t *a;
+  Elf_W(Ehdr) *ehdr;
+#if UNW_TARGET_ARM
+  const Elf_W(Phdr) *parm_exidx = NULL;
+#endif
+  int i, ret, found = 0;
+
+  /* XXX: Much of this code is Linux/LSB-specific.  */
+
+  if (!elf_w(valid_object) (&edi->ei))
+    return -UNW_ENOINFO;
+
+  ehdr = edi->ei.image;
+  phdr = (Elf_W(Phdr) *) ((char *) edi->ei.image + ehdr->e_phoff);
+
+  for (i = 0; i < ehdr->e_phnum; ++i)
+    {
+      switch (phdr[i].p_type)
+        {
+        case PT_LOAD:
+          if (phdr[i].p_vaddr < start_ip)
+            start_ip = phdr[i].p_vaddr;
+
+          if (phdr[i].p_vaddr + phdr[i].p_memsz > end_ip)
+            end_ip = phdr[i].p_vaddr + phdr[i].p_memsz;
+
+          if (phdr[i].p_offset == mapoff)
+            ptxt = phdr + i;
+          if ((uintptr_t) edi->ei.image + phdr->p_filesz > max_load_addr)
+            max_load_addr = (uintptr_t) edi->ei.image + phdr->p_filesz;
+          break;
+
+        case PT_GNU_EH_FRAME:
+          peh_hdr = phdr + i;
+          break;
+
+        case PT_DYNAMIC:
+          pdyn = phdr + i;
+          break;
+
+#if UNW_TARGET_ARM
+        case PT_ARM_EXIDX:
+          parm_exidx = phdr + i;
+          break;
+#endif
+
+        default:
+          break;
+        }
+    }
+
+  if (!ptxt)
+    return 0;
+
+  load_base = segbase - ptxt->p_vaddr;
+  start_ip += load_base;
+  end_ip += load_base;
+
+  if (peh_hdr)
+    {
+      if (pdyn)
+        {
+          /* For dynamicly linked executables and shared libraries,
+             DT_PLTGOT is the value that data-relative addresses are
+             relative to for that object.  We call this the "gp".  */
+                Elf_W(Dyn) *dyn = (Elf_W(Dyn) *)(pdyn->p_offset
+                                                 + (char *) edi->ei.image);
+          for (; dyn->d_tag != DT_NULL; ++dyn)
+            if (dyn->d_tag == DT_PLTGOT)
+              {
+                /* Assume that _DYNAMIC is writable and GLIBC has
+                   relocated it (true for x86 at least).  */
+                edi->di_cache.gp = dyn->d_un.d_ptr;
+                break;
+              }
+        }
+      else
+        /* Otherwise this is a static executable with no _DYNAMIC.  Assume
+           that data-relative addresses are relative to 0, i.e.,
+           absolute.  */
+        edi->di_cache.gp = 0;
+
+      hdr = (struct dwarf_eh_frame_hdr *) (peh_hdr->p_offset
+                                           + (char *) edi->ei.image);
+      if (hdr->version != DW_EH_VERSION)
+        {
+          Debug (1, "table `%s' has unexpected version %d\n",
+                 path, hdr->version);
+          return -UNW_ENOINFO;
+        }
+
+      a = unw_get_accessors (unw_local_addr_space);
+      addr = (unw_word_t) (hdr + 1);
+
+      /* Fill in a dummy proc_info structure.  We just need to fill in
+         enough to ensure that dwarf_read_encoded_pointer() can do it's
+         job.  Since we don't have a procedure-context at this point, all
+         we have to do is fill in the global-pointer.  */
+      memset (&pi, 0, sizeof (pi));
+      pi.gp = edi->di_cache.gp;
+
+      /* (Optionally) read eh_frame_ptr: */
+      if ((ret = dwarf_read_encoded_pointer (unw_local_addr_space, a,
+                                             &addr, hdr->eh_frame_ptr_enc, &pi,
+                                             &eh_frame_start, NULL)) < 0)
+        return -UNW_ENOINFO;
+
+      /* (Optionally) read fde_count: */
+      if ((ret = dwarf_read_encoded_pointer (unw_local_addr_space, a,
+                                             &addr, hdr->fde_count_enc, &pi,
+                                             &fde_count, NULL)) < 0)
+        return -UNW_ENOINFO;
+
+      if (hdr->table_enc != (DW_EH_PE_datarel | DW_EH_PE_sdata4))
+        {
+    #if 1
+          abort ();
+    #else
+          unw_word_t eh_frame_end;
+
+          /* If there is no search table or it has an unsupported
+             encoding, fall back on linear search.  */
+          if (hdr->table_enc == DW_EH_PE_omit)
+            Debug (4, "EH lacks search table; doing linear search\n");
+          else
+            Debug (4, "EH table has encoding 0x%x; doing linear search\n",
+                   hdr->table_enc);
+
+          eh_frame_end = max_load_addr; /* XXX can we do better? */
+
+          if (hdr->fde_count_enc == DW_EH_PE_omit)
+            fde_count = ~0UL;
+          if (hdr->eh_frame_ptr_enc == DW_EH_PE_omit)
+            abort ();
+
+          return linear_search (unw_local_addr_space, ip,
+                                eh_frame_start, eh_frame_end, fde_count,
+                                pi, need_unwind_info, NULL);
+    #endif
+        }
+
+      edi->di_cache.start_ip = start_ip;
+      edi->di_cache.end_ip = end_ip;
+      edi->di_cache.format = UNW_INFO_FORMAT_REMOTE_TABLE;
+      edi->di_cache.u.rti.name_ptr = 0;
+      /* two 32-bit values (ip_offset/fde_offset) per table-entry: */
+      edi->di_cache.u.rti.table_len = (fde_count * 8) / sizeof (unw_word_t);
+      edi->di_cache.u.rti.table_data = ((load_base + peh_hdr->p_vaddr)
+                                       + (addr - (unw_word_t) edi->ei.image
+                                          - peh_hdr->p_offset));
+
+      /* For the binary-search table in the eh_frame_hdr, data-relative
+         means relative to the start of that section... */
+      edi->di_cache.u.rti.segbase = ((load_base + peh_hdr->p_vaddr)
+                                    + ((unw_word_t) hdr - (unw_word_t) edi->ei.image
+                                       - peh_hdr->p_offset));
+      found = 1;
+    }
+
+#if UNW_TARGET_ARM
+  if (parm_exidx)
+    {
+      edi->di_arm.format = UNW_INFO_FORMAT_ARM_EXIDX;
+      edi->di_arm.start_ip = start_ip;
+      edi->di_arm.end_ip = end_ip;
+      edi->di_arm.u.rti.name_ptr = (unw_word_t) path;
+      edi->di_arm.u.rti.table_data = load_base + parm_exidx->p_vaddr;
+      edi->di_arm.u.rti.table_len = parm_exidx->p_memsz;
+      found = 1;
+    }
+#endif
+
+#ifdef CONFIG_DEBUG_FRAME
+  /* Try .debug_frame. */
+  found = dwarf_find_debug_frame (found, &edi->di_debug, ip, load_base, path,
+                                  start_ip, end_ip);
+#endif
+
+  return found;
+}
diff --git a/frysk-imports/libunwind/src/dwarf/Gparser.c b/frysk-imports/libunwind/src/dwarf/Gparser.c
index ea7c4c9..c80b352 100644
--- a/frysk-imports/libunwind/src/dwarf/Gparser.c
+++ b/frysk-imports/libunwind/src/dwarf/Gparser.c
@@ -1,6 +1,8 @@
 /* libunwind - a platform-independent unwind library
    Copyright (c) 2003, 2005 Hewlett-Packard Development Company, L.P.
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+   Copyright (C) 2007-2008, Red Hat Inc.
+   Copyright (C) 2016, Andrew Cagney
 
 This file is part of libunwind.
 
@@ -27,12 +29,12 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #include "dwarf_i.h"
 #include "libunwind_i.h"
 
-#define alloc_reg_state()	(mempool_alloc (&dwarf_reg_state_pool))
-#define free_reg_state(rs)	(mempool_free (&dwarf_reg_state_pool, rs))
+#define alloc_reg_state()       (mempool_alloc (&dwarf_reg_state_pool))
+#define free_reg_state(rs)      (mempool_free (&dwarf_reg_state_pool, rs))
 
 static inline int
 read_regnum (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
-	     unw_word_t *valp, void *arg)
+             unw_word_t *valp, void *arg)
 {
   int ret;
 
@@ -49,7 +51,7 @@ read_regnum (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
 
 static inline void
 set_reg (dwarf_state_record_t *sr, unw_word_t regnum, dwarf_where_t where,
-	 unw_word_t val)
+         unw_word_t val)
 {
   sr->rs_current.reg[regnum].where = where;
   sr->rs_current.reg[regnum].val = val;
@@ -58,318 +60,343 @@ set_reg (dwarf_state_record_t *sr, unw_word_t regnum, dwarf_where_t where,
 /* Run a CFI program to update the register state.  */
 static int
 run_cfi_program (struct dwarf_cursor *c, dwarf_state_record_t *sr,
-		 unw_word_t ip, unw_word_t *addr, unw_word_t end_addr,
-		 struct dwarf_cie_info *dci)
+                 unw_word_t ip, unw_word_t *addr, unw_word_t end_addr,
+                 struct dwarf_cie_info *dci)
 {
   unw_word_t curr_ip, operand = 0, regnum, val, len, fde_encoding;
   dwarf_reg_state_t *rs_stack = NULL, *new_rs, *old_rs;
-  unw_addr_space_t as;
-  unw_accessors_t *a;
   uint8_t u8, op;
   uint16_t u16;
   uint32_t u32;
-  void *arg;
   int ret;
 
+  unw_addr_space_t cfi_as;
+  void *cfi_arg;
 #ifndef UNW_LOCAL_ONLY
-  as = dci->as;
-  arg = dci->as_arg;
+  cfi_as = dci->as;
+  cfi_arg = dci->as_arg;
 #else
-  as = c->as;
-  arg = c->as_arg;
+  cfi_as = c->as;
+  cfi_arg = c->as_arg;
 #endif
-  a = unw_get_accessors (as);
+  if (c->pi.flags & UNW_PI_FLAG_DEBUG_FRAME)
+    {
+      /* .debug_frame CFI is stored in local address space.  */
+      cfi_as = unw_local_addr_space;
+      cfi_arg = NULL;
+    }
+  unw_accessors_t *cfi_a = unw_get_accessors (cfi_as);
+
+  unw_addr_space_t t_as = c->as;
+  void *t_arg = c->as_arg;
+  unw_accessors_t *t_a = unw_get_accessors (t_as);
+
   curr_ip = c->pi.start_ip;
 
-  /* Process all the instructions including the ones after `DW_CFA_advance_loc'
-     up to the next advance higher than the current `ip' (therefore `<=').
-     See also the `c->decrease_ip' handling in `fetch_proc_info'.  */
+  /* Process everything up to and including the current 'ip',
+     including all the DW_CFA_advance_loc instructions.  See
+     'c->use_prev_instr' use in 'fetch_proc_info' for details. */
   while (curr_ip <= ip && *addr < end_addr)
     {
-      if ((ret = dwarf_readu8 (as, a, addr, &op, arg)) < 0)
-	return ret;
+      if ((ret = dwarf_readu8 (cfi_as, cfi_a, addr, &op, cfi_arg)) < 0)
+        return ret;
 
       if (op & DWARF_CFA_OPCODE_MASK)
-	{
-	  operand = op & DWARF_CFA_OPERAND_MASK;
-	  op &= ~DWARF_CFA_OPERAND_MASK;
-	}
+        {
+          operand = op & DWARF_CFA_OPERAND_MASK;
+          op &= ~DWARF_CFA_OPERAND_MASK;
+        }
       switch ((dwarf_cfa_t) op)
-	{
-	case DW_CFA_advance_loc:
-	  curr_ip += operand * dci->code_align;
-	  Debug (15, "CFA_advance_loc to 0x%lx\n", (long) curr_ip);
-	  break;
-
-	case DW_CFA_advance_loc1:
-	  if ((ret = dwarf_readu8 (as, a, addr, &u8, arg)) < 0)
-	    goto fail;
-	  curr_ip += u8 * dci->code_align;
-	  Debug (15, "CFA_advance_loc1 to 0x%lx\n", (long) curr_ip);
-	  break;
-
-	case DW_CFA_advance_loc2:
-	  if ((ret = dwarf_readu16 (as, a, addr, &u16, arg)) < 0)
-	    goto fail;
-	  curr_ip += u16 * dci->code_align;
-	  Debug (15, "CFA_advance_loc2 to 0x%lx\n", (long) curr_ip);
-	  break;
-
-	case DW_CFA_advance_loc4:
-	  if ((ret = dwarf_readu32 (as, a, addr, &u32, arg)) < 0)
-	    goto fail;
-	  curr_ip += u32 * dci->code_align;
-	  Debug (15, "CFA_advance_loc4 to 0x%lx\n", (long) curr_ip);
-	  break;
-
-	case DW_CFA_MIPS_advance_loc8:
+        {
+        case DW_CFA_advance_loc:
+          curr_ip += operand * dci->code_align;
+          Debug (15, "CFA_advance_loc to 0x%lx\n", (long) curr_ip);
+          break;
+
+        case DW_CFA_advance_loc1:
+          if ((ret = dwarf_readu8 (cfi_as, cfi_a, addr, &u8, cfi_arg)) < 0)
+            goto fail;
+          curr_ip += u8 * dci->code_align;
+          Debug (15, "CFA_advance_loc1 to 0x%lx\n", (long) curr_ip);
+          break;
+
+        case DW_CFA_advance_loc2:
+          if ((ret = dwarf_readu16 (cfi_as, cfi_a, addr, &u16, cfi_arg)) < 0)
+            goto fail;
+          curr_ip += u16 * dci->code_align;
+          Debug (15, "CFA_advance_loc2 to 0x%lx\n", (long) curr_ip);
+          break;
+
+        case DW_CFA_advance_loc4:
+          if ((ret = dwarf_readu32 (cfi_as, cfi_a, addr, &u32, cfi_arg)) < 0)
+            goto fail;
+          curr_ip += u32 * dci->code_align;
+          Debug (15, "CFA_advance_loc4 to 0x%lx\n", (long) curr_ip);
+          break;
+
+        case DW_CFA_MIPS_advance_loc8:
 #ifdef UNW_TARGET_MIPS
-	  {
-	    uint64_t u64;
-
-	    if ((ret = dwarf_readu64 (as, a, addr, &u64, arg)) < 0)
-	      goto fail;
-	    curr_ip += u64 * dci->code_align;
-	    Debug (15, "CFA_MIPS_advance_loc8\n");
-	    break;
-	  }
+          {
+            uint64_t u64;
+
+            if ((ret = dwarf_readu64 (cfi_as, cfi_a, addr, &u64, cfi_arg)) < 0)
+              goto fail;
+            curr_ip += u64 * dci->code_align;
+            Debug (15, "CFA_MIPS_advance_loc8\n");
+            break;
+          }
 #else
-	  Debug (1, "DW_CFA_MIPS_advance_loc8 on non-MIPS target\n");
-	  ret = -UNW_EINVAL;
-	  goto fail;
+          Debug (1, "DW_CFA_MIPS_advance_loc8 on non-MIPS target\n");
+          ret = -UNW_EINVAL;
+          goto fail;
 #endif
 
-	case DW_CFA_offset:
-	  regnum = operand;
-	  if (regnum >= DWARF_NUM_PRESERVED_REGS)
-	    {
-	      Debug (1, "Invalid register number %u in DW_cfa_OFFSET\n",
-		     (unsigned int) regnum);
-	      ret = -UNW_EBADREG;
-	      goto fail;
-	    }
-	  if ((ret = dwarf_read_uleb128 (as, a, addr, &val, arg)) < 0)
-	    goto fail;
-	  set_reg (sr, regnum, DWARF_WHERE_CFAREL, val * dci->data_align);
-	  Debug (15, "CFA_offset r%lu at cfa+0x%lx\n",
-		 (long) regnum, (long) (val * dci->data_align));
-	  break;
-
-	case DW_CFA_offset_extended:
-	  if (((ret = read_regnum (as, a, addr, &regnum, arg)) < 0)
-	      || ((ret = dwarf_read_uleb128 (as, a, addr, &val, arg)) < 0))
-	    goto fail;
-	  set_reg (sr, regnum, DWARF_WHERE_CFAREL, val * dci->data_align);
-	  Debug (15, "CFA_offset_extended r%lu at cf+0x%lx\n",
-		 (long) regnum, (long) (val * dci->data_align));
-	  break;
-
-	case DW_CFA_offset_extended_sf:
-	  if (((ret = read_regnum (as, a, addr, &regnum, arg)) < 0)
-	      || ((ret = dwarf_read_sleb128 (as, a, addr, &val, arg)) < 0))
-	    goto fail;
-	  set_reg (sr, regnum, DWARF_WHERE_CFAREL, val * dci->data_align);
-	  Debug (15, "CFA_offset_extended_sf r%lu at cf+0x%lx\n",
-		 (long) regnum, (long) (val * dci->data_align));
-	  break;
-
-	case DW_CFA_restore:
-	  regnum = operand;
-	  if (regnum >= DWARF_NUM_PRESERVED_REGS)
-	    {
-	      Debug (1, "Invalid register number %u in DW_CFA_restore\n",
-		     (unsigned int) regnum);
-	      ret = -UNW_EINVAL;
-	      goto fail;
-	    }
-	  sr->rs_current.reg[regnum] = sr->rs_initial.reg[regnum];
-	  Debug (15, "CFA_restore r%lu\n", (long) regnum);
-	  break;
-
-	case DW_CFA_restore_extended:
-	  if ((ret = dwarf_read_uleb128 (as, a, addr, &regnum, arg)) < 0)
-	    goto fail;
-	  if (regnum >= DWARF_NUM_PRESERVED_REGS)
-	    {
-	      Debug (1, "Invalid register number %u in "
-		     "DW_CFA_restore_extended\n", (unsigned int) regnum);
-	      ret = -UNW_EINVAL;
-	      goto fail;
-	    }
-	  sr->rs_current.reg[regnum] = sr->rs_initial.reg[regnum];
-	  Debug (15, "CFA_restore_extended r%lu\n", (long) regnum);
-	  break;
-
-	case DW_CFA_nop:
-	  break;
-
-	case DW_CFA_set_loc:
-	  fde_encoding = dci->fde_encoding;
-	  if ((ret = dwarf_read_encoded_pointer (as, a, addr, fde_encoding,
-						 &c->pi, &curr_ip,
-						 arg)) < 0)
-	    goto fail;
-	  Debug (15, "CFA_set_loc to 0x%lx\n", (long) curr_ip);
-	  break;
-
-	case DW_CFA_undefined:
-	  if ((ret = read_regnum (as, a, addr, &regnum, arg)) < 0)
-	    goto fail;
-	  set_reg (sr, regnum, DWARF_WHERE_UNDEF, 0);
-	  Debug (15, "CFA_undefined r%lu\n", (long) regnum);
-	  break;
-
-	case DW_CFA_same_value:
-	  if ((ret = read_regnum (as, a, addr, &regnum, arg)) < 0)
-	    goto fail;
-	  set_reg (sr, regnum, DWARF_WHERE_SAME, 0);
-	  Debug (15, "CFA_same_value r%lu\n", (long) regnum);
-	  break;
-
-	case DW_CFA_register:
-	  if (((ret = read_regnum (as, a, addr, &regnum, arg)) < 0)
-	      || ((ret = dwarf_read_uleb128 (as, a, addr, &val, arg)) < 0))
-	    goto fail;
-	  set_reg (sr, regnum, DWARF_WHERE_REG, val);
-	  Debug (15, "CFA_register r%lu to r%lu\n", (long) regnum, (long) val);
-	  break;
-
-	case DW_CFA_remember_state:
-	  new_rs = alloc_reg_state ();
-	  if (!new_rs)
-	    {
-	      Debug (1, "Out of memory in DW_CFA_remember_state\n");
-	      ret = -UNW_ENOMEM;
-	      goto fail;
-	    }
-
-	  memcpy (new_rs->reg, sr->rs_current.reg, sizeof (new_rs->reg));
-	  new_rs->next = rs_stack;
-	  rs_stack = new_rs;
-	  Debug (15, "CFA_remember_state\n");
-	  break;
-
-	case DW_CFA_restore_state:
-	  if (!rs_stack)
-	    {
-	      Debug (1, "register-state stack underflow\n");
-	      ret = -UNW_EINVAL;
-	      goto fail;
-	    }
-	  memcpy (&sr->rs_current.reg, &rs_stack->reg, sizeof (rs_stack->reg));
-	  old_rs = rs_stack;
-	  rs_stack = rs_stack->next;
-	  free_reg_state (old_rs);
-	  Debug (15, "CFA_restore_state\n");
-	  break;
-
-	case DW_CFA_def_cfa:
-	  if (((ret = read_regnum (as, a, addr, &regnum, arg)) < 0)
-	      || ((ret = dwarf_read_uleb128 (as, a, addr, &val, arg)) < 0))
-	    goto fail;
-	  set_reg (sr, DWARF_CFA_REG_COLUMN, DWARF_WHERE_REG, regnum);
-	  set_reg (sr, DWARF_CFA_OFF_COLUMN, 0, val);	/* NOT factored! */
-	  Debug (15, "CFA_def_cfa r%lu+0x%lx\n", (long) regnum, (long) val);
-	  break;
-
-	case DW_CFA_def_cfa_sf:
-	  if (((ret = read_regnum (as, a, addr, &regnum, arg)) < 0)
-	      || ((ret = dwarf_read_sleb128 (as, a, addr, &val, arg)) < 0))
-	    goto fail;
-	  set_reg (sr, DWARF_CFA_REG_COLUMN, DWARF_WHERE_REG, regnum);
-	  set_reg (sr, DWARF_CFA_OFF_COLUMN, 0,
-		   val * dci->data_align);		/* factored! */
-	  Debug (15, "CFA_def_cfa_sf r%lu+0x%lx\n",
-		 (long) regnum, (long) (val * dci->data_align));
-	  break;
-
-	case DW_CFA_def_cfa_register:
-	  if ((ret = read_regnum (as, a, addr, &regnum, arg)) < 0)
-	    goto fail;
-	  set_reg (sr, DWARF_CFA_REG_COLUMN, DWARF_WHERE_REG, regnum);
-	  Debug (15, "CFA_def_cfa_register r%lu\n", (long) regnum);
-	  break;
-
-	case DW_CFA_def_cfa_offset:
-	  if ((ret = dwarf_read_uleb128 (as, a, addr, &val, arg)) < 0)
-	    goto fail;
-	  set_reg (sr, DWARF_CFA_OFF_COLUMN, 0, val);	/* NOT factored! */
-	  Debug (15, "CFA_def_cfa_offset 0x%lx\n", (long) val);
-	  break;
-
-	case DW_CFA_def_cfa_offset_sf:
-	  if ((ret = dwarf_read_sleb128 (as, a, addr, &val, arg)) < 0)
-	    goto fail;
-	  set_reg (sr, DWARF_CFA_OFF_COLUMN, 0,
-		   val * dci->data_align);	/* factored! */
-	  Debug (15, "CFA_def_cfa_offset_sf 0x%lx\n",
-		 (long) (val * dci->data_align));
-	  break;
-
-	case DW_CFA_def_cfa_expression:
-	  /* Save the address of the DW_FORM_block for later evaluation. */
-	  set_reg (sr, DWARF_CFA_REG_COLUMN, DWARF_WHERE_EXPR, *addr);
-
-	  if ((ret = dwarf_read_uleb128 (as, a, addr, &len, arg)) < 0)
-	    goto fail;
-
-	  Debug (15, "CFA_def_cfa_expr @ 0x%lx [%lu bytes]\n",
-		 (long) *addr, (long) len);
-	  *addr += len;
-	  break;
-
-	case DW_CFA_expression:
-	  if ((ret = read_regnum (as, a, addr, &regnum, arg)) < 0)
-	    goto fail;
-
-	  /* Save the address of the DW_FORM_block for later evaluation. */
-	  set_reg (sr, regnum, DWARF_WHERE_EXPR, *addr);
-
-	  if ((ret = dwarf_read_uleb128 (as, a, addr, &len, arg)) < 0)
-	    goto fail;
-
-	  Debug (15, "CFA_expression r%lu @ 0x%lx [%lu bytes]\n",
-		 (long) regnum, (long) addr, (long) len);
-	  *addr += len;
-	  break;
-
-	case DW_CFA_GNU_args_size:
-	  if ((ret = dwarf_read_uleb128 (as, a, addr, &val, arg)) < 0)
-	    goto fail;
-	  sr->args_size = val;
-	  Debug (15, "CFA_GNU_args_size %lu\n", (long) val);
-	  break;
-
-	case DW_CFA_GNU_negative_offset_extended:
-	  /* A comment in GCC says that this is obsoleted by
-	     DW_CFA_offset_extended_sf, but that it's used by older
-	     PowerPC code.  */
-	  if (((ret = read_regnum (as, a, addr, &regnum, arg)) < 0)
-	      || ((ret = dwarf_read_uleb128 (as, a, addr, &val, arg)) < 0))
-	    goto fail;
-	  set_reg (sr, regnum, DWARF_WHERE_CFAREL, -(val * dci->data_align));
-	  Debug (15, "CFA_GNU_negative_offset_extended cfa+0x%lx\n",
-		 (long) -(val * dci->data_align));
-	  break;
-
-	case DW_CFA_GNU_window_save:
+        case DW_CFA_offset:
+          regnum = operand;
+          if (regnum >= DWARF_NUM_PRESERVED_REGS)
+            {
+              Debug (1, "Invalid register number %u in DW_cfa_OFFSET\n",
+                     (unsigned int) regnum);
+              ret = -UNW_EBADREG;
+              goto fail;
+            }
+          if ((ret = dwarf_read_uleb128 (cfi_as, cfi_a, addr, &val, cfi_arg)) < 0)
+            goto fail;
+          set_reg (sr, regnum, DWARF_WHERE_CFAREL, val * dci->data_align);
+          Debug (15, "CFA_offset r%lu at cfa+0x%lx\n",
+                 (long) regnum, (long) (val * dci->data_align));
+          break;
+
+        case DW_CFA_offset_extended:
+          if (((ret = read_regnum (t_as, t_a, addr, &regnum, t_arg)) < 0)
+              || ((ret = dwarf_read_uleb128 (cfi_as, cfi_a, addr, &val, cfi_arg)) < 0))
+            goto fail;
+          set_reg (sr, regnum, DWARF_WHERE_CFAREL, val * dci->data_align);
+          Debug (15, "CFA_offset_extended r%lu at cf+0x%lx\n",
+                 (long) regnum, (long) (val * dci->data_align));
+          break;
+
+        case DW_CFA_offset_extended_sf:
+          if (((ret = read_regnum (t_as, t_a, addr, &regnum, t_arg)) < 0)
+              || ((ret = dwarf_read_sleb128 (cfi_as, cfi_a, addr, &val, cfi_arg)) < 0))
+            goto fail;
+          set_reg (sr, regnum, DWARF_WHERE_CFAREL, val * dci->data_align);
+          Debug (15, "CFA_offset_extended_sf r%lu at cf+0x%lx\n",
+                 (long) regnum, (long) (val * dci->data_align));
+          break;
+
+        case DW_CFA_restore:
+          regnum = operand;
+          if (regnum >= DWARF_NUM_PRESERVED_REGS)
+            {
+              Debug (1, "Invalid register number %u in DW_CFA_restore\n",
+                     (unsigned int) regnum);
+              ret = -UNW_EINVAL;
+              goto fail;
+            }
+          sr->rs_current.reg[regnum] = sr->rs_initial.reg[regnum];
+          Debug (15, "CFA_restore r%lu\n", (long) regnum);
+          break;
+
+        case DW_CFA_restore_extended:
+          if ((ret = dwarf_read_uleb128 (cfi_as, cfi_a, addr, &regnum, cfi_arg)) < 0)
+            goto fail;
+          if (regnum >= DWARF_NUM_PRESERVED_REGS)
+            {
+              Debug (1, "Invalid register number %u in "
+                     "DW_CFA_restore_extended\n", (unsigned int) regnum);
+              ret = -UNW_EINVAL;
+              goto fail;
+            }
+          sr->rs_current.reg[regnum] = sr->rs_initial.reg[regnum];
+          Debug (15, "CFA_restore_extended r%lu\n", (long) regnum);
+          break;
+
+        case DW_CFA_nop:
+          break;
+
+        case DW_CFA_set_loc:
+          fde_encoding = dci->fde_encoding;
+          if ((ret = dwarf_read_encoded_pointer (cfi_as, cfi_a, addr, fde_encoding,
+                                                 &c->pi, &curr_ip,
+                                                 cfi_arg)) < 0)
+            goto fail;
+          Debug (15, "CFA_set_loc to 0x%lx\n", (long) curr_ip);
+          break;
+
+        case DW_CFA_undefined:
+          if ((ret = read_regnum (t_as, t_a, addr, &regnum, t_arg)) < 0)
+            goto fail;
+          set_reg (sr, regnum, DWARF_WHERE_UNDEF, 0);
+          Debug (15, "CFA_undefined r%lu\n", (long) regnum);
+          break;
+
+        case DW_CFA_same_value:
+          if ((ret = read_regnum (t_as, t_a, addr, &regnum, t_arg)) < 0)
+            goto fail;
+          set_reg (sr, regnum, DWARF_WHERE_SAME, 0);
+          Debug (15, "CFA_same_value r%lu\n", (long) regnum);
+          break;
+
+        case DW_CFA_register:
+          if (((ret = read_regnum (t_as, t_a, addr, &regnum, t_arg)) < 0)
+              || ((ret = dwarf_read_uleb128 (cfi_as, cfi_a, addr, &val, cfi_arg)) < 0))
+            goto fail;
+          set_reg (sr, regnum, DWARF_WHERE_REG, val);
+          Debug (15, "CFA_register r%lu to r%lu\n", (long) regnum, (long) val);
+          break;
+
+        case DW_CFA_remember_state:
+          new_rs = alloc_reg_state ();
+          if (!new_rs)
+            {
+              Debug (1, "Out of memory in DW_CFA_remember_state\n");
+              ret = -UNW_ENOMEM;
+              goto fail;
+            }
+
+          memcpy (new_rs->reg, sr->rs_current.reg, sizeof (new_rs->reg));
+          new_rs->next = rs_stack;
+          rs_stack = new_rs;
+          Debug (15, "CFA_remember_state\n");
+          break;
+
+        case DW_CFA_restore_state:
+          if (!rs_stack)
+            {
+              Debug (1, "register-state stack underflow\n");
+              ret = -UNW_EINVAL;
+              goto fail;
+            }
+          memcpy (&sr->rs_current.reg, &rs_stack->reg, sizeof (rs_stack->reg));
+          old_rs = rs_stack;
+          rs_stack = rs_stack->next;
+          free_reg_state (old_rs);
+          Debug (15, "CFA_restore_state\n");
+          break;
+
+        case DW_CFA_def_cfa:
+          if (((ret = read_regnum (t_as, t_a, addr, &regnum, t_arg)) < 0)
+              || ((ret = dwarf_read_uleb128 (cfi_as, cfi_a, addr, &val, cfi_arg)) < 0))
+            goto fail;
+          set_reg (sr, DWARF_CFA_REG_COLUMN, DWARF_WHERE_REG, regnum);
+          set_reg (sr, DWARF_CFA_OFF_COLUMN, 0, val);   /* NOT factored! */
+          Debug (15, "CFA_def_cfa r%lu+0x%lx\n", (long) regnum, (long) val);
+          break;
+
+        case DW_CFA_def_cfa_sf:
+          if (((ret = read_regnum (t_as, t_a, addr, &regnum, t_arg)) < 0)
+              || ((ret = dwarf_read_sleb128 (cfi_as, cfi_a, addr, &val, cfi_arg)) < 0))
+            goto fail;
+          set_reg (sr, DWARF_CFA_REG_COLUMN, DWARF_WHERE_REG, regnum);
+          set_reg (sr, DWARF_CFA_OFF_COLUMN, 0,
+                   val * dci->data_align);              /* factored! */
+          Debug (15, "CFA_def_cfa_sf r%lu+0x%lx\n",
+                 (long) regnum, (long) (val * dci->data_align));
+          break;
+
+        case DW_CFA_def_cfa_register:
+          if ((ret = read_regnum (t_as, t_a, addr, &regnum, t_arg)) < 0)
+            goto fail;
+          set_reg (sr, DWARF_CFA_REG_COLUMN, DWARF_WHERE_REG, regnum);
+          Debug (15, "CFA_def_cfa_register r%lu\n", (long) regnum);
+          break;
+
+        case DW_CFA_def_cfa_offset:
+          if ((ret = dwarf_read_uleb128 (cfi_as, cfi_a, addr, &val, cfi_arg)) < 0)
+            goto fail;
+          set_reg (sr, DWARF_CFA_OFF_COLUMN, 0, val);   /* NOT factored! */
+          Debug (15, "CFA_def_cfa_offset 0x%lx\n", (long) val);
+          break;
+
+        case DW_CFA_def_cfa_offset_sf:
+          if ((ret = dwarf_read_sleb128 (cfi_as, cfi_a, addr, &val, cfi_arg)) < 0)
+            goto fail;
+          set_reg (sr, DWARF_CFA_OFF_COLUMN, 0,
+                   val * dci->data_align);      /* factored! */
+          Debug (15, "CFA_def_cfa_offset_sf 0x%lx\n",
+                 (long) (val * dci->data_align));
+          break;
+
+        case DW_CFA_def_cfa_expression:
+          /* Save the address of the DW_FORM_block for later evaluation. */
+          set_reg (sr, DWARF_CFA_REG_COLUMN, DWARF_WHERE_EXPR, *addr);
+
+          if ((ret = dwarf_read_uleb128 (cfi_as, cfi_a, addr, &len, cfi_arg)) < 0)
+            goto fail;
+
+          Debug (15, "CFA_def_cfa_expr @ 0x%lx [%lu bytes]\n",
+                 (long) *addr, (long) len);
+          *addr += len;
+          break;
+
+        case DW_CFA_expression:
+          if ((ret = read_regnum (t_as, t_a, addr, &regnum, t_arg)) < 0)
+            goto fail;
+
+          /* Save the address of the DW_FORM_block for later evaluation. */
+          set_reg (sr, regnum, DWARF_WHERE_EXPR, *addr);
+
+          if ((ret = dwarf_read_uleb128 (cfi_as, cfi_a, addr, &len, cfi_arg)) < 0)
+            goto fail;
+
+          Debug (15, "CFA_expression r%lu @ 0x%lx [%lu bytes]\n",
+                 (long) regnum, (long) addr, (long) len);
+          *addr += len;
+          break;
+
+        case DW_CFA_val_expression:
+          if ((ret = read_regnum (t_as, t_a, addr, &regnum, t_arg)) < 0)
+            goto fail;
+
+          /* Save the address of the DW_FORM_block for later evaluation. */
+          set_reg (sr, regnum, DWARF_WHERE_VAL_EXPR, *addr);
+
+          if ((ret = dwarf_read_uleb128 (cfi_as, cfi_a, addr, &len, cfi_arg)) < 0)
+            goto fail;
+
+          Debug (15, "CFA_val_expression r%lu @ 0x%lx [%lu bytes]\n",
+                 (long) regnum, (long) addr, (long) len);
+          *addr += len;
+          break;
+
+        case DW_CFA_GNU_args_size:
+          if ((ret = dwarf_read_uleb128 (cfi_as, cfi_a, addr, &val, cfi_arg)) < 0)
+            goto fail;
+          sr->args_size = val;
+          Debug (15, "CFA_GNU_args_size %lu\n", (long) val);
+          break;
+
+        case DW_CFA_GNU_negative_offset_extended:
+          /* A comment in GCC says that this is obsoleted by
+             DW_CFA_offset_extended_sf, but that it's used by older
+             PowerPC code.  */
+          if (((ret = read_regnum (t_as, t_a, addr, &regnum, t_arg)) < 0)
+              || ((ret = dwarf_read_uleb128 (cfi_as, cfi_a, addr, &val, cfi_arg)) < 0))
+            goto fail;
+          set_reg (sr, regnum, DWARF_WHERE_CFAREL, -(val * dci->data_align));
+          Debug (15, "CFA_GNU_negative_offset_extended cfa+0x%lx\n",
+                 (long) -(val * dci->data_align));
+          break;
+
+        case DW_CFA_GNU_window_save:
 #ifdef UNW_TARGET_SPARC
-	  /* This is a special CFA to handle all 16 windowed registers
-	     on SPARC.  */
-	  for (regnum = 16; regnum < 32; ++regnum)
-	    set_reg (sr, regnum, DWARF_WHERE_CFAREL,
-		     (regnum - 16) * sizeof (unw_word_t));
-	  Debug (15, "CFA_GNU_window_save\n");
-	  break;
+          /* This is a special CFA to handle all 16 windowed registers
+             on SPARC.  */
+          for (regnum = 16; regnum < 32; ++regnum)
+            set_reg (sr, regnum, DWARF_WHERE_CFAREL,
+                     (regnum - 16) * sizeof (unw_word_t));
+          Debug (15, "CFA_GNU_window_save\n");
+          break;
 #else
-	  /* FALL THROUGH */
+          /* FALL THROUGH */
 #endif
-	case DW_CFA_lo_user:
-	case DW_CFA_hi_user:
-	  Debug (1, "Unexpected CFA opcode 0x%x\n", op);
-	  ret = -UNW_EINVAL;
-	  goto fail;
-	}
+        case DW_CFA_lo_user:
+        case DW_CFA_hi_user:
+          Debug (1, "Unexpected CFA opcode 0x%x\n", op);
+          ret = -UNW_EINVAL;
+          goto fail;
+        }
     }
   ret = 0;
 
@@ -389,13 +416,22 @@ fetch_proc_info (struct dwarf_cursor *c, unw_word_t ip, int need_unwind_info)
 {
   int ret, dynamic = 1;
 
-  /* In the current (lowest) frame we must not touch `ip' as the current
-     address is where we stand.  On the other hand any upper frames will stand
-     on the next instruction behind our call which may have a different stack
-     DWARF information (for `stdcall' called functions) or the next instruction
-     even may belong already to a different continuing function.
-     Also signal frames got invoked from the instruction we want to analyze.  */
-  if (c->decrease_ip)
+  /* The 'ip' can point either to the previous or next instruction
+     depending on what type of frame we have: normal call or a place
+     to resume execution (e.g. after signal frame).
+
+     For a normal call frame we need to back up so we point within the
+     call itself; this is important because a) the call might be the
+     very last instruction of the function and the edge of the FDE,
+     and b) so that run_cfi_program() runs locations up to the call
+     but not more.
+
+     For execution resume, we need to do the exact opposite and look
+     up using the current 'ip' value.  That is where execution will
+     continue, and it's important we get this right, as 'ip' could be
+     right at the function entry and hence FDE edge, or at instruction
+     that manipulates CFA (push/pop). */
+  if (c->use_prev_instr)
     --ip;
 
   if (c->pi_valid && !need_unwind_info)
@@ -405,19 +441,33 @@ fetch_proc_info (struct dwarf_cursor *c, unw_word_t ip, int need_unwind_info)
 
   /* check dynamic info first --- it overrides everything else */
   ret = unwi_find_dynamic_proc_info (c->as, ip, &c->pi, need_unwind_info,
-				     c->as_arg);
+                                     c->as_arg);
   if (ret == -UNW_ENOINFO)
     {
       dynamic = 0;
       if ((ret = tdep_find_proc_info (c, ip, need_unwind_info)) < 0)
-	return ret;
+        return ret;
     }
 
+  if (c->pi.format != UNW_INFO_FORMAT_DYNAMIC
+      && c->pi.format != UNW_INFO_FORMAT_TABLE
+      && c->pi.format != UNW_INFO_FORMAT_REMOTE_TABLE)
+    return -UNW_ENOINFO;
+
   c->pi_valid = 1;
   c->pi_is_dynamic = dynamic;
 
+  /* Let system/machine-dependent code determine frame-specific attributes. */
   if (ret >= 0)
-    tdep_fetch_proc_info_post (c, ip, need_unwind_info);
+    tdep_fetch_frame (c, ip, need_unwind_info);
+
+  /* Update use_prev_instr for the next frame. */
+  if (need_unwind_info)
+  {
+    assert(c->pi.unwind_info);
+    struct dwarf_cie_info *dci = c->pi.unwind_info;
+    c->use_prev_instr = ! dci->signal_frame;
+  }
 
   return ret;
 }
@@ -436,39 +486,34 @@ parse_dynamic (struct dwarf_cursor *c, unw_word_t ip, dwarf_state_record_t *sr)
 static inline void
 put_unwind_info (struct dwarf_cursor *c, unw_proc_info_t *pi)
 {
-  if (!c->pi_valid)
-    return;
-
-  if (c->pi_is_dynamic) {
+  if (c->pi_is_dynamic)
     unwi_put_dynamic_unwind_info (c->as, pi, c->as_arg);
-    return;
-  }
-
-  if (pi->unwind_info); {
-    // Find the eh-frame's address space and arguments.
-    unw_addr_space_t frame_as;
-    void *frame_arg;
+  else if (pi->unwind_info && pi->format == UNW_INFO_FORMAT_TABLE)
+    {
+      mempool_free (&dwarf_cie_info_pool, pi->unwind_info);
+      pi->unwind_info = NULL;
+    }
 #ifndef UNW_LOCAL_ONLY
-    struct dwarf_cie_info *dci = pi->unwind_info;
-    frame_as = dci->as;
-    frame_arg = dci->as_arg;
-#else
-    frame_as = c->as;
-    frame_arg = c->as_arg;
-#endif
-    if (frame_as) {
-      // notify the eh-frame accessors that the info is being
-      // released so it can also release its local data (for instance
-      // the frame_arg pointer).
-      unw_accessors_t *a = unw_get_accessors (frame_as);
-      if (a->put_unwind_info != NULL) {
-	a->put_unwind_info(frame_as, pi, frame_arg);
-      }
+  else if (pi->unwind_info && pi->format == UNW_INFO_FORMAT_REMOTE_TABLE)
+    {
+      // Find the eh-frame's address space and arguments.
+      struct dwarf_cie_info *dci = pi->unwind_info;
+      unw_addr_space_t frame_as = dci->as;
+      void *frame_arg = dci->as_arg;
+      if (frame_as)
+	{
+	  // notify the eh-frame accessors that the info is being
+	  // released so it can also release its local data (for
+	  // instance the frame_arg pointer).
+	  unw_accessors_t *a = unw_get_accessors (frame_as);
+	  if (a->put_unwind_info != NULL)
+	    a->put_unwind_info(frame_as, pi, frame_arg);
+	}
+      // Free this data.
+      mempool_free (&dwarf_cie_info_pool, pi->unwind_info);
+      pi->unwind_info = NULL;
     }
-    // Free this data.
-    mempool_free (&dwarf_cie_info_pool, pi->unwind_info);
-    pi->unwind_info = NULL;
-  }
+#endif
 }
 
 static inline int
@@ -483,7 +528,7 @@ parse_fde (struct dwarf_cursor *c, unw_word_t ip, dwarf_state_record_t *sr)
 
   addr = dci->cie_instr_start;
   if ((ret = run_cfi_program (c, sr, ~(unw_word_t) 0, &addr,
-			      dci->cie_instr_end, dci)) < 0)
+                              dci->cie_instr_end, dci)) < 0)
     return ret;
 
   memcpy (&sr->rs_initial, &sr->rs_current, sizeof (sr->rs_initial));
@@ -506,9 +551,10 @@ flush_rs_cache (struct dwarf_rs_cache *cache)
   for (i = 0; i < DWARF_UNW_CACHE_SIZE; ++i)
     {
       if (i > 0)
-	cache->buckets[i].lru_chain = (i - 1);
+        cache->buckets[i].lru_chain = (i - 1);
       cache->buckets[i].coll_chain = -1;
       cache->buckets[i].ip = 0;
+      cache->buckets[i].valid = 0;
     }
   for (i = 0; i<DWARF_UNW_HASH_SIZE; ++i)
     cache->hash[i] = -1;
@@ -523,22 +569,11 @@ get_rs_cache (unw_addr_space_t as, intrmask_t *saved_maskp)
   if (caching == UNW_CACHE_NONE)
     return NULL;
 
-#ifdef HAVE_ATOMIC_H
-  if (!spin_trylock_irqsave (&cache->busy, *saved_maskp))
-    return NULL;
-#else
-# ifdef HAVE_ATOMIC_OPS_H
-  if (AO_test_and_set (&cache->busy) == AO_TS_SET)
-    return NULL;
-# else
-  sigprocmask (SIG_SETMASK, &unwi_full_mask, saved_maskp);
   if (likely (caching == UNW_CACHE_GLOBAL))
     {
-      Debug (16, "%s: acquiring lock\n", __FUNCTION__);
-      mutex_lock (&cache->lock);
+      Debug (16, "acquiring lock\n");
+      lock_acquire (&cache->lock, *saved_maskp);
     }
-# endif
-#endif
 
   if (atomic_read (&as->cache_generation) != atomic_read (&cache->generation))
     {
@@ -551,37 +586,28 @@ get_rs_cache (unw_addr_space_t as, intrmask_t *saved_maskp)
 
 static inline void
 put_rs_cache (unw_addr_space_t as, struct dwarf_rs_cache *cache,
-		  intrmask_t *saved_maskp)
+                  intrmask_t *saved_maskp)
 {
   assert (as->caching_policy != UNW_CACHE_NONE);
 
   Debug (16, "unmasking signals/interrupts and releasing lock\n");
-#ifdef HAVE_ATOMIC_H
-  spin_unlock_irqrestore (&cache->busy, *saved_maskp);
-#else
-# ifdef HAVE_ATOMIC_OPS_H
-  AO_CLEAR (&cache->busy);
-# else
   if (likely (as->caching_policy == UNW_CACHE_GLOBAL))
-    mutex_unlock (&cache->lock);
-  sigprocmask (SIG_SETMASK, saved_maskp, NULL);
-# endif
-#endif
+    lock_release (&cache->lock, *saved_maskp);
 }
 
-static inline unw_hash_index_t
+static inline unw_hash_index_t CONST_ATTR
 hash (unw_word_t ip)
 {
   /* based on (sqrt(5)/2-1)*2^64 */
-# define magic	((unw_word_t) 0x9e3779b97f4a7c16ULL)
+# define magic  ((unw_word_t) 0x9e3779b97f4a7c16ULL)
 
-  return (ip) * magic >> ((sizeof(unw_word_t) * 8) - DWARF_LOG_UNW_HASH_SIZE);
+  return ip * magic >> ((sizeof(unw_word_t) * 8) - DWARF_LOG_UNW_HASH_SIZE);
 }
 
 static inline long
 cache_match (dwarf_reg_state_t *rs, unw_word_t ip)
 {
-  if (ip == rs->ip)
+  if (rs->valid && (ip == rs->ip))
     return 1;
   return 0;
 }
@@ -600,7 +626,7 @@ rs_lookup (struct dwarf_rs_cache *cache, struct dwarf_cursor *c)
 
   index = cache->hash[hash (ip)];
   if (index >= DWARF_UNW_CACHE_SIZE)
-    return 0;
+    return NULL;
 
   rs = cache->buckets + index;
   while (1)
@@ -613,7 +639,7 @@ rs_lookup (struct dwarf_rs_cache *cache, struct dwarf_cursor *c)
           return rs;
         }
       if (rs->coll_chain >= DWARF_UNW_HASH_SIZE)
-        return 0;
+        return NULL;
       rs = cache->buckets + rs->coll_chain;
     }
 }
@@ -638,24 +664,24 @@ rs_new (struct dwarf_rs_cache *cache, struct dwarf_cursor * c)
     {
       index = hash (rs->ip);
       tmp = cache->buckets + cache->hash[index];
-      prev = 0;
+      prev = NULL;
       while (1)
-	{
-	  if (tmp == rs)
-	    {
-	      if (prev)
-		prev->coll_chain = tmp->coll_chain;
-	      else
-		cache->hash[index] = tmp->coll_chain;
-	      break;
-	    }
-	  else
-	    prev = tmp;
-	  if (tmp->coll_chain >= DWARF_UNW_CACHE_SIZE)
-	    /* old rs wasn't in the hash-table */
-	    break;
-	  tmp = cache->buckets + tmp->coll_chain;
-	}
+        {
+          if (tmp == rs)
+            {
+              if (prev)
+                prev->coll_chain = tmp->coll_chain;
+              else
+                cache->hash[index] = tmp->coll_chain;
+              break;
+            }
+          else
+            prev = tmp;
+          if (tmp->coll_chain >= DWARF_UNW_CACHE_SIZE)
+            /* old rs wasn't in the hash-table */
+            break;
+          tmp = cache->buckets + tmp->coll_chain;
+        }
     }
 
   /* enter new rs in the hash table */
@@ -665,14 +691,17 @@ rs_new (struct dwarf_rs_cache *cache, struct dwarf_cursor * c)
 
   rs->hint = 0;
   rs->ip = c->ip;
+  rs->valid = 1;
   rs->ret_addr_column = c->ret_addr_column;
+  rs->signal_frame = 0;
+  tdep_cache_frame (c, rs);
 
   return rs;
 }
 
 static int
 create_state_record_for (struct dwarf_cursor *c, dwarf_state_record_t *sr,
-			 unw_word_t ip)
+                         unw_word_t ip)
 {
   int i, ret;
 
@@ -702,8 +731,8 @@ create_state_record_for (struct dwarf_cursor *c, dwarf_state_record_t *sr,
 
 static inline int
 eval_location_expr (struct dwarf_cursor *c, unw_addr_space_t as,
-		    unw_accessors_t *a, unw_word_t addr,
-		    dwarf_loc_t *locp, void *arg)
+                    unw_accessors_t *a, unw_word_t addr,
+                    dwarf_loc_t *locp, void *arg)
 {
   int ret, is_register;
   unw_word_t len, val;
@@ -750,17 +779,18 @@ apply_reg_state (struct dwarf_cursor *c, struct dwarf_reg_state *rs)
       /* CFA is equal to [reg] + offset: */
 
       /* As a special-case, if the stack-pointer is the CFA and the
-	 stack-pointer wasn't saved, popping the CFA implicitly pops
-	 the stack-pointer as well.  */
+         stack-pointer wasn't saved, popping the CFA implicitly pops
+         the stack-pointer as well.  */
       if ((rs->reg[DWARF_CFA_REG_COLUMN].val == UNW_TDEP_SP)
-	  && (rs->reg[UNW_TDEP_SP].where == DWARF_WHERE_SAME))
-	  cfa = c->cfa;
+          && (UNW_TDEP_SP < ARRAY_SIZE(rs->reg))
+          && (rs->reg[UNW_TDEP_SP].where == DWARF_WHERE_SAME))
+          cfa = c->cfa;
       else
-	{
-	  regnum = dwarf_to_unw_regnum (rs->reg[DWARF_CFA_REG_COLUMN].val);
-	  if ((ret = unw_get_reg ((unw_cursor_t *) c, regnum, &cfa)) < 0)
-	    return ret;
-	}
+        {
+          regnum = dwarf_to_unw_regnum (rs->reg[DWARF_CFA_REG_COLUMN].val);
+          if ((ret = unw_get_reg ((unw_cursor_t *) c, regnum, &cfa)) < 0)
+            return ret;
+        }
       cfa += rs->reg[DWARF_CFA_OFF_COLUMN].val;
     }
   else
@@ -771,72 +801,71 @@ apply_reg_state (struct dwarf_cursor *c, struct dwarf_reg_state *rs)
 
       addr = rs->reg[DWARF_CFA_REG_COLUMN].val;
       if ((ret = eval_location_expr (c, as, a, addr, &cfa_loc, arg)) < 0)
-	return ret;
+        return ret;
       /* the returned location better be a memory location... */
       if (DWARF_IS_REG_LOC (cfa_loc))
-	return -UNW_EBADFRAME;
+        return -UNW_EBADFRAME;
       cfa = DWARF_GET_LOC (cfa_loc);
     }
 
   for (i = 0; i < DWARF_NUM_PRESERVED_REGS; ++i)
     {
       switch ((dwarf_where_t) rs->reg[i].where)
-	{
-	case DWARF_WHERE_UNDEF:
-	  c->loc[i] = DWARF_NULL_LOC;
-	  break;
-
-	case DWARF_WHERE_SAME:
-	  break;
-
-	case DWARF_WHERE_CFAREL:
-	  c->loc[i] = DWARF_MEM_LOC (c, cfa + rs->reg[i].val);
-	  break;
-
-	case DWARF_WHERE_REG:
-	  c->loc[i] = DWARF_REG_LOC (c, dwarf_to_unw_regnum (rs->reg[i].val));
-	  break;
-
-	case DWARF_WHERE_EXPR:
-	  addr = rs->reg[i].val;
-	  if ((ret = eval_location_expr (c, as, a, addr, c->loc + i, arg)) , 0)
-	    return ret;
-	  break;
-	}
+        {
+        case DWARF_WHERE_UNDEF:
+          c->loc[i] = DWARF_NULL_LOC;
+          break;
+
+        case DWARF_WHERE_SAME:
+          break;
+
+        case DWARF_WHERE_CFAREL:
+          c->loc[i] = DWARF_MEM_LOC (c, cfa + rs->reg[i].val);
+          break;
+
+        case DWARF_WHERE_REG:
+          c->loc[i] = DWARF_REG_LOC (c, dwarf_to_unw_regnum (rs->reg[i].val));
+          break;
+
+        case DWARF_WHERE_EXPR:
+          addr = rs->reg[i].val;
+          if ((ret = eval_location_expr (c, as, a, addr, c->loc + i, arg)) < 0)
+            return ret;
+          break;
+
+        case DWARF_WHERE_VAL_EXPR:
+          addr = rs->reg[i].val;
+          if ((ret = eval_location_expr (c, as, a, addr, c->loc + i, arg)) < 0)
+            return ret;
+          c->loc[i] = DWARF_VAL_LOC (c, DWARF_GET_LOC (c->loc[i]));
+          break;
+        }
     }
+
   c->cfa = cfa;
-  /* After fixing glibc's `__restore_rt' unwinding by CFI in:
-     	http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/x86_64/sigaction.c.diff?cvsroot=glibc&r1=text&tr1=1.10&r2=text&tr2=1.12&f=u
-     we need to check for the frame stop (indicated by `ip == 0').  */
+  /* DWARF spec says undefined return address location means end of stack. */
   if (DWARF_IS_NULL_LOC (c->loc[c->ret_addr_column]))
     c->ip = 0;
   else
-    {
-      ret = dwarf_get (c, c->loc[c->ret_addr_column], &ip);
-      if (ret < 0)
-	return ret;
-      c->ip = ip;
-    }
-  /* XXX: check for ip to be code_aligned */
+  {
+    ret = dwarf_get (c, c->loc[c->ret_addr_column], &ip);
+    if (ret < 0)
+      return ret;
+    c->ip = ip;
+  }
 
+  /* XXX: check for ip to be code_aligned */
   if (c->ip == prev_ip && c->cfa == prev_cfa)
     {
-      dprintf ("%s: ip and cfa unchanged; stopping here (ip=0x%lx)\n",
-	       __FUNCTION__, (long) c->ip);
+      Dprintf ("%s: ip and cfa unchanged; stopping here (ip=0x%lx)\n",
+               __FUNCTION__, (long) c->ip);
       return -UNW_EBADFRAME;
     }
-  return 0;
-}
 
-static int
-is_signal_frame (struct dwarf_cursor *c)
-{
-  struct dwarf_cie_info *dci;
-
-  assert (c->pi_valid);
+  if (c->stash_frames)
+    tdep_stash_frame (c, rs);
 
-  dci = c->pi.unwind_info;
-  return dci->signal_frame;
+  return 0;
 }
 
 static int
@@ -846,9 +875,10 @@ uncached_dwarf_find_save_locs (struct dwarf_cursor *c)
   int ret;
 
   if ((ret = fetch_proc_info (c, c->ip, 1)) < 0)
-    return ret;
-
-  c->decrease_ip = !is_signal_frame (c);
+    {
+      put_unwind_info (c, &c->pi);
+      return ret;
+    }
 
   if ((ret = create_state_record_for (c, &sr, c->ip)) < 0)
     return ret;
@@ -866,7 +896,7 @@ HIDDEN int
 dwarf_find_save_locs (struct dwarf_cursor *c)
 {
   dwarf_state_record_t sr;
-  dwarf_reg_state_t *rs, *rs1;
+  dwarf_reg_state_t *rs, rs_copy;
   struct dwarf_rs_cache *cache;
   int ret = 0;
   intrmask_t saved_mask;
@@ -875,51 +905,38 @@ dwarf_find_save_locs (struct dwarf_cursor *c)
     return uncached_dwarf_find_save_locs (c);
 
   cache = get_rs_cache(c->as, &saved_mask);
-  if (!cache)
-    return -UNW_ENOINFO;	/* cache is busy */
   rs = rs_lookup(cache, c);
 
   if (rs)
     {
       c->ret_addr_column = rs->ret_addr_column;
-      goto apply;
+      c->use_prev_instr = ! rs->signal_frame;
     }
-
-  if ((ret = fetch_proc_info (c, c->ip, 1)) < 0)
-    goto out;
-
-  c->decrease_ip = !is_signal_frame (c);
-
-  if ((ret = create_state_record_for (c, &sr, c->ip)) < 0)
-    goto out;
-
-  rs1 = &sr.rs_current;
-  if (rs1)
+  else
     {
-      rs = rs_new (cache, c);
-      memcpy(rs, rs1, offsetof(struct dwarf_reg_state, ip));
-      if (!rs)
+      if ((ret = fetch_proc_info (c, c->ip, 1)) < 0 ||
+          (ret = create_state_record_for (c, &sr, c->ip)) < 0)
         {
-          dprintf ("%s: failed to create unwind rs\n", __FUNCTION__);
-          ret = -UNW_EUNSPEC;
-	  goto out;
+          put_rs_cache (c->as, cache, &saved_mask);
+          put_unwind_info (c, &c->pi);
+          return ret;
         }
-    }
-  cache->buckets[c->prev_rs].hint = rs - cache->buckets;
 
-  c->hint = rs->hint;
-  c->prev_rs = rs - cache->buckets;
+      rs = rs_new (cache, c);
+      memcpy(rs, &sr.rs_current, offsetof(struct dwarf_reg_state, ip));
+      cache->buckets[c->prev_rs].hint = rs - cache->buckets;
+
+      c->hint = rs->hint;
+      c->prev_rs = rs - cache->buckets;
 
-  put_unwind_info (c, &c->pi);
-  ret = apply_reg_state (c, rs);
+      put_unwind_info (c, &c->pi);
+    }
 
-out:
+  memcpy (&rs_copy, rs, sizeof (rs_copy));
   put_rs_cache (c->as, cache, &saved_mask);
-  return ret;
 
-apply:
-  put_rs_cache (c->as, cache, &saved_mask);
-  if ((ret = apply_reg_state (c, rs)) < 0)
+  tdep_reuse_frame (c, &rs_copy);
+  if ((ret = apply_reg_state (c, &rs_copy)) < 0)
     return ret;
 
   return 0;
diff --git a/frysk-imports/libunwind/src/dwarf/Gpe.c b/frysk-imports/libunwind/src/dwarf/Gpe.c
index c271d76..a0e37ba 100644
--- a/frysk-imports/libunwind/src/dwarf/Gpe.c
+++ b/frysk-imports/libunwind/src/dwarf/Gpe.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (c) 2003, 2005 Hewlett-Packard Development Company, L.P.
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -30,10 +30,10 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 HIDDEN int
 dwarf_read_encoded_pointer (unw_addr_space_t as, unw_accessors_t *a,
-			    unw_word_t *addr, unsigned char encoding,
-			    const unw_proc_info_t *pi,
-			    unw_word_t *valp, void *arg)
+                            unw_word_t *addr, unsigned char encoding,
+                            const unw_proc_info_t *pi,
+                            unw_word_t *valp, void *arg)
 {
   return dwarf_read_encoded_pointer_inlined (as, a, addr, encoding,
-					     pi, valp, arg);
+                                             pi, valp, arg);
 }
diff --git a/frysk-imports/libunwind/src/dwarf/Gstep.c b/frysk-imports/libunwind/src/dwarf/Gstep.c
index a9b789c..d251af9 100644
--- a/frysk-imports/libunwind/src/dwarf/Gstep.c
+++ b/frysk-imports/libunwind/src/dwarf/Gstep.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (c) 2003-2005 Hewlett-Packard Development Company, L.P.
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -29,12 +29,11 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 HIDDEN int
 dwarf_step (struct dwarf_cursor *c)
 {
-  unw_word_t prev_cfa = c->cfa;
   int ret;
 
   if ((ret = dwarf_find_save_locs (c)) >= 0) {
     c->pi_valid = 0;
-    ret = (c->ip == 0) ? 0 : 1;
+    ret = 1;
   }
 
   Debug (15, "returning %d\n", ret);
diff --git a/frysk-imports/libunwind/src/dwarf/Lfind_unwind_table.c b/frysk-imports/libunwind/src/dwarf/Lfind_unwind_table.c
new file mode 100644
index 0000000..68e269f
--- /dev/null
+++ b/frysk-imports/libunwind/src/dwarf/Lfind_unwind_table.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Gfind_unwind_table.c"
+#endif
diff --git a/frysk-imports/libunwind/src/dwarf/global.c b/frysk-imports/libunwind/src/dwarf/global.c
index 4658ccf..8d0957d 100644
--- a/frysk-imports/libunwind/src/dwarf/global.c
+++ b/frysk-imports/libunwind/src/dwarf/global.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (c) 2003-2004 Hewlett-Packard Development Company, L.P.
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
diff --git a/frysk-imports/libunwind/src/elf32.h b/frysk-imports/libunwind/src/elf32.h
index d27646c..2c7bca4 100644
--- a/frysk-imports/libunwind/src/elf32.h
+++ b/frysk-imports/libunwind/src/elf32.h
@@ -1,7 +1,9 @@
 #ifndef elf32_h
 #define elf32_h
 
-#define ELF_CLASS	ELFCLASS32
+#ifndef ELF_CLASS
+#define ELF_CLASS       ELFCLASS32
+#endif
 #include "elfxx.h"
 
 #endif /* elf32_h */
diff --git a/frysk-imports/libunwind/src/elf64.h b/frysk-imports/libunwind/src/elf64.h
index 8f22384..091fba8 100644
--- a/frysk-imports/libunwind/src/elf64.h
+++ b/frysk-imports/libunwind/src/elf64.h
@@ -1,7 +1,9 @@
 #ifndef elf64_h
 #define elf64_h
 
-#define ELF_CLASS	ELFCLASS64
+#ifndef ELF_CLASS
+#define ELF_CLASS       ELFCLASS64
+#endif
 #include "elfxx.h"
 
 #endif /* elf64_h */
diff --git a/frysk-imports/libunwind/src/elfxx.c b/frysk-imports/libunwind/src/elfxx.c
index 05b9943..33fccba 100644
--- a/frysk-imports/libunwind/src/elfxx.c
+++ b/frysk-imports/libunwind/src/elfxx.c
@@ -1,7 +1,7 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003-2005 Hewlett-Packard Co
    Copyright (C) 2007 David Mosberger-Tang
-	Contributed by David Mosberger-Tang <dmosberger@gmail.com>
+        Contributed by David Mosberger-Tang <dmosberger@gmail.com>
 
 This file is part of libunwind.
 
@@ -24,112 +24,276 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
+#include "libunwind_i.h"
+
 #include <stdio.h>
+#include <sys/param.h>
 
-#include "libunwind_i.h"
+#ifdef HAVE_LZMA
+#include <lzma.h>
+#endif /* HAVE_LZMA */
 
-HIDDEN int
-elf_w (valid_object) (struct elf_image *ei)
+static Elf_W (Shdr)*
+elf_w (section_table) (struct elf_image *ei)
 {
-  if (ei->size <= EI_CLASS)
-    return 0;
+  Elf_W (Ehdr) *ehdr = ei->image;
+  Elf_W (Off) soff;
+
+  soff = ehdr->e_shoff;
+  if (soff + ehdr->e_shnum * ehdr->e_shentsize > ei->size)
+    {
+      Debug (1, "section table outside of image? (%lu > %lu)\n",
+             (unsigned long) (soff + ehdr->e_shnum * ehdr->e_shentsize),
+             (unsigned long) ei->size);
+      return NULL;
+    }
 
-  return (memcmp (ei->image, ELFMAG, SELFMAG) == 0
-	  && ((uint8_t *) ei->image)[EI_CLASS] == ELF_CLASS);
+  return (Elf_W (Shdr) *) ((char *) ei->image + soff);
 }
 
+static char*
+elf_w (string_table) (struct elf_image *ei, int section)
+{
+  Elf_W (Ehdr) *ehdr = ei->image;
+  Elf_W (Off) soff, str_soff;
+  Elf_W (Shdr) *str_shdr;
+
+  /* this offset is assumed to be OK */
+  soff = ehdr->e_shoff;
+
+  str_soff = soff + (section * ehdr->e_shentsize);
+  if (str_soff + ehdr->e_shentsize > ei->size)
+    {
+      Debug (1, "string shdr table outside of image? (%lu > %lu)\n",
+             (unsigned long) (str_soff + ehdr->e_shentsize),
+             (unsigned long) ei->size);
+      return NULL;
+    }
+  str_shdr = (Elf_W (Shdr) *) ((char *) ei->image + str_soff);
+
+  if (str_shdr->sh_offset + str_shdr->sh_size > ei->size)
+    {
+      Debug (1, "string table outside of image? (%lu > %lu)\n",
+             (unsigned long) (str_shdr->sh_offset + str_shdr->sh_size),
+             (unsigned long) ei->size);
+      return NULL;
+    }
+
+  Debug (16, "strtab=0x%lx\n", (long) str_shdr->sh_offset);
+  return ei->image + str_shdr->sh_offset;
+}
 
 static int
 elf_w (lookup_symbol) (unw_addr_space_t as,
-		       unw_word_t ip, struct elf_image *ei,
-		       Elf_W (Addr) load_offset,
-		       char *buf, size_t buf_len, unw_word_t *offp)
+                       unw_word_t ip, struct elf_image *ei,
+                       Elf_W (Addr) load_offset,
+                       char *buf, size_t buf_len, Elf_W (Addr) *min_dist)
 {
   size_t syment_size;
   Elf_W (Ehdr) *ehdr = ei->image;
   Elf_W (Sym) *sym, *symtab, *symtab_end;
-  Elf_W (Off) soff, str_soff;
-  Elf_W (Shdr) *shdr, *str_shdr;
-  Elf_W (Addr) val, min_dist = ~(Elf_W (Addr))0;
-  int i, ret = 0;
+  Elf_W (Shdr) *shdr;
+  Elf_W (Addr) val;
+  int i, ret = -UNW_ENOINFO;
   char *strtab;
 
   if (!elf_w (valid_object) (ei))
     return -UNW_ENOINFO;
 
-  soff = ehdr->e_shoff;
-  if (soff + ehdr->e_shnum * ehdr->e_shentsize > ei->size)
+  shdr = elf_w (section_table) (ei);
+  if (!shdr)
+    return -UNW_ENOINFO;
+
+  for (i = 0; i < ehdr->e_shnum; ++i)
     {
-      Debug (1, "section table outside of image? (%lu > %lu)\n",
-	     (unsigned long) (soff + ehdr->e_shnum * ehdr->e_shentsize),
-	     (unsigned long) ei->size);
-      return -UNW_ENOINFO;
+      switch (shdr->sh_type)
+        {
+        case SHT_SYMTAB:
+        case SHT_DYNSYM:
+          symtab = (Elf_W (Sym) *) ((char *) ei->image + shdr->sh_offset);
+          symtab_end = (Elf_W (Sym) *) ((char *) symtab + shdr->sh_size);
+          syment_size = shdr->sh_entsize;
+
+          strtab = elf_w (string_table) (ei, shdr->sh_link);
+          if (!strtab)
+            break;
+
+          Debug (16, "symtab=0x%lx[%d]\n",
+                 (long) shdr->sh_offset, shdr->sh_type);
+
+          for (sym = symtab;
+               sym < symtab_end;
+               sym = (Elf_W (Sym) *) ((char *) sym + syment_size))
+            {
+              if (ELF_W (ST_TYPE) (sym->st_info) == STT_FUNC
+                  && sym->st_shndx != SHN_UNDEF)
+                {
+                  val = sym->st_value;
+                  if (sym->st_shndx != SHN_ABS)
+                    val += load_offset;
+                  if (tdep_get_func_addr (as, val, &val) < 0)
+                    continue;
+                  Debug (16, "0x%016lx info=0x%02x %s\n",
+                         (long) val, sym->st_info, strtab + sym->st_name);
+
+                  if ((Elf_W (Addr)) (ip - val) < *min_dist)
+                    {
+                      *min_dist = (Elf_W (Addr)) (ip - val);
+                      strncpy (buf, strtab + sym->st_name, buf_len);
+                      buf[buf_len - 1] = '\0';
+                      ret = (strlen (strtab + sym->st_name) >= buf_len
+                             ? -UNW_ENOMEM : 0);
+                    }
+                }
+            }
+          break;
+
+        default:
+          break;
+        }
+      shdr = (Elf_W (Shdr) *) (((char *) shdr) + ehdr->e_shentsize);
     }
+  return ret;
+}
+
+static Elf_W (Addr)
+elf_w (get_load_offset) (struct elf_image *ei, unsigned long segbase,
+                         unsigned long mapoff)
+{
+  Elf_W (Addr) offset = 0;
+  Elf_W (Ehdr) *ehdr;
+  Elf_W (Phdr) *phdr;
+  int i;
 
-  shdr = (Elf_W (Shdr) *) ((char *) ei->image + soff);
+  ehdr = ei->image;
+  phdr = (Elf_W (Phdr) *) ((char *) ei->image + ehdr->e_phoff);
+
+  for (i = 0; i < ehdr->e_phnum; ++i)
+    if (phdr[i].p_type == PT_LOAD && phdr[i].p_offset == mapoff)
+      {
+        offset = segbase - phdr[i].p_vaddr;
+        break;
+      }
+
+  return offset;
+}
+
+#if HAVE_LZMA
+static size_t
+xz_uncompressed_size (uint8_t *compressed, size_t length)
+{
+  uint64_t memlimit = UINT64_MAX;
+  size_t ret = 0, pos = 0;
+  lzma_stream_flags options;
+  lzma_index *index;
+
+  if (length < LZMA_STREAM_HEADER_SIZE)
+    return 0;
+
+  uint8_t *footer = compressed + length - LZMA_STREAM_HEADER_SIZE;
+  if (lzma_stream_footer_decode (&options, footer) != LZMA_OK)
+    return 0;
+
+  if (length < LZMA_STREAM_HEADER_SIZE + options.backward_size)
+    return 0;
+
+  uint8_t *indexdata = footer - options.backward_size;
+  if (lzma_index_buffer_decode (&index, &memlimit, NULL, indexdata,
+                                &pos, options.backward_size) != LZMA_OK)
+    return 0;
+
+  if (lzma_index_size (index) == options.backward_size)
+    {
+      ret = lzma_index_uncompressed_size (index);
+    }
+
+  lzma_index_end (index, NULL);
+  return ret;
+}
+
+static int
+elf_w (extract_minidebuginfo) (struct elf_image *ei, struct elf_image *mdi)
+{
+  Elf_W (Ehdr) *ehdr = ei->image;
+  Elf_W (Shdr) *shdr;
+  char *strtab;
+  int i;
+  uint8_t *compressed = NULL;
+  uint64_t memlimit = UINT64_MAX; /* no memory limit */
+  size_t compressed_len, uncompressed_len;
+
+  if (!elf_w (valid_object) (ei))
+    return 0;
+
+  shdr = elf_w (section_table) (ei);
+  if (!shdr)
+    return 0;
+
+  strtab = elf_w (string_table) (ei, ehdr->e_shstrndx);
+  if (!strtab)
+    return 0;
 
   for (i = 0; i < ehdr->e_shnum; ++i)
     {
-      switch (shdr->sh_type)
-	{
-	case SHT_SYMTAB:
-	case SHT_DYNSYM:
-	  symtab = (Elf_W (Sym) *) ((char *) ei->image + shdr->sh_offset);
-	  symtab_end = (Elf_W (Sym) *) ((char *) symtab + shdr->sh_size);
-	  syment_size = shdr->sh_entsize;
-
-	  str_soff = soff + (shdr->sh_link * ehdr->e_shentsize);
-	  if (str_soff + ehdr->e_shentsize >= ei->size)
-	    {
-	      Debug (1, "string table outside of image? (%lu >= %lu)\n",
-		     (unsigned long) (str_soff + ehdr->e_shentsize),
-		     (unsigned long) ei->size);
-	      break;
-	    }
-	  str_shdr = (Elf_W (Shdr) *) ((char *) ei->image + str_soff);
-	  strtab = (char *) ei->image + str_shdr->sh_offset;
-
-	  Debug (16, "symtab=0x%lx[%d], strtab=0x%lx\n",
-		 (long) shdr->sh_offset, shdr->sh_type,
-		 (long) str_shdr->sh_offset);
-
-	  for (sym = symtab;
-	       sym < symtab_end;
-	       sym = (Elf_W (Sym) *) ((char *) sym + syment_size))
-	    {
-	      if (ELF_W (ST_TYPE) (sym->st_info) == STT_FUNC
-		  && sym->st_shndx != SHN_UNDEF)
-		{
-		  if (tdep_get_func_addr (as, sym->st_value, &val) < 0)
-		    continue;
-		  if (sym->st_shndx != SHN_ABS)
-		    val += load_offset;
-		  Debug (16, "0x%016lx info=0x%02x %s\n",
-			 (long) val, sym->st_info, strtab + sym->st_name);
-
-		  if ((Elf_W (Addr)) (ip - val) < min_dist)
-		    {
-		      min_dist = (Elf_W (Addr)) (ip - val);
-		      strncpy (buf, strtab + sym->st_name, buf_len);
-		      buf[buf_len - 1] = '\0';
-		      if (strlen (strtab + sym->st_name) >= buf_len)
-			ret = -UNW_ENOMEM;
-		    }
-		}
-	    }
-	  break;
-
-	default:
-	  break;
-	}
+      if (strcmp (strtab + shdr->sh_name, ".gnu_debugdata") == 0)
+        {
+          if (shdr->sh_offset + shdr->sh_size > ei->size)
+            {
+              Debug (1, ".gnu_debugdata outside image? (0x%lu > 0x%lu)\n",
+                     (unsigned long) shdr->sh_offset + shdr->sh_size,
+                     (unsigned long) ei->size);
+              return 0;
+            }
+
+          Debug (16, "found .gnu_debugdata at 0x%lx\n",
+                 (unsigned long) shdr->sh_offset);
+          compressed = ((uint8_t *) ei->image) + shdr->sh_offset;
+          compressed_len = shdr->sh_size;
+          break;
+        }
+
       shdr = (Elf_W (Shdr) *) (((char *) shdr) + ehdr->e_shentsize);
     }
-  if (min_dist >= ei->size)
-    return -UNW_ENOINFO;		/* not found */
-  if (offp)
-    *offp = min_dist;
-  return ret;
+
+  /* not found */
+  if (!compressed)
+    return 0;
+
+  uncompressed_len = xz_uncompressed_size (compressed, compressed_len);
+  if (uncompressed_len == 0)
+    {
+      Debug (1, "invalid .gnu_debugdata contents\n");
+      return 0;
+    }
+
+  mdi->size = uncompressed_len;
+  mdi->image = mmap (NULL, uncompressed_len, PROT_READ|PROT_WRITE,
+                     MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
+
+  if (mdi->image == MAP_FAILED)
+    return 0;
+
+  size_t in_pos = 0, out_pos = 0;
+  lzma_ret lret;
+  lret = lzma_stream_buffer_decode (&memlimit, 0, NULL,
+                                    compressed, &in_pos, compressed_len,
+                                    mdi->image, &out_pos, mdi->size);
+  if (lret != LZMA_OK)
+    {
+      Debug (1, "LZMA decompression failed: %d\n", lret);
+      munmap (mdi->image, mdi->size);
+      return 0;
+    }
+
+  return 1;
+}
+#else
+static int
+elf_w (extract_minidebuginfo) (struct elf_image *ei, struct elf_image *mdi)
+{
+  return 0;
 }
+#endif /* !HAVE_LZMA */
 
 /* Find the ELF image that contains IP and return the "closest"
    procedure name, if there is one.  With some caching, this could be
@@ -137,31 +301,56 @@ elf_w (lookup_symbol) (unw_addr_space_t as,
    sensitive to the performance of this routine, why bother...  */
 
 HIDDEN int
+elf_w (get_proc_name_in_image) (unw_addr_space_t as, struct elf_image *ei,
+                       unsigned long segbase,
+                       unsigned long mapoff,
+                       unw_word_t ip,
+                       char *buf, size_t buf_len, unw_word_t *offp)
+{
+  Elf_W (Addr) load_offset;
+  Elf_W (Addr) min_dist = ~(Elf_W (Addr))0;
+  int ret;
+
+  load_offset = elf_w (get_load_offset) (ei, segbase, mapoff);
+  ret = elf_w (lookup_symbol) (as, ip, ei, load_offset, buf, buf_len, &min_dist);
+
+  /* If the ELF image has MiniDebugInfo embedded in it, look up the symbol in
+     there as well and replace the previously found if it is closer. */
+  struct elf_image mdi;
+  if (elf_w (extract_minidebuginfo) (ei, &mdi))
+    {
+      int ret_mdi = elf_w (lookup_symbol) (as, ip, &mdi, load_offset, buf,
+                                           buf_len, &min_dist);
+
+      /* Closer symbol was found (possibly truncated). */
+      if (ret_mdi == 0 || ret_mdi == -UNW_ENOMEM)
+        {
+          ret = ret_mdi;
+        }
+
+      munmap (mdi.image, mdi.size);
+    }
+
+  if (min_dist >= ei->size)
+    return -UNW_ENOINFO;                /* not found */
+  if (offp)
+    *offp = min_dist;
+  return ret;
+}
+
+HIDDEN int
 elf_w (get_proc_name) (unw_addr_space_t as, pid_t pid, unw_word_t ip,
-		       char *buf, size_t buf_len, unw_word_t *offp)
+                       char *buf, size_t buf_len, unw_word_t *offp)
 {
   unsigned long segbase, mapoff;
-  Elf_W (Addr) load_offset = 0;
   struct elf_image ei;
-  Elf_W (Ehdr) *ehdr;
-  Elf_W (Phdr) *phdr;
-  int i, ret;
+  int ret;
 
-  ret = tdep_get_elf_image (&ei, pid, ip, &segbase, &mapoff);
+  ret = tdep_get_elf_image (&ei, pid, ip, &segbase, &mapoff, NULL, 0);
   if (ret < 0)
     return ret;
 
-  ehdr = ei.image;
-  phdr = (Elf_W (Phdr) *) ((char *) ei.image + ehdr->e_phoff);
-
-  for (i = 0; i < ehdr->e_phnum; ++i)
-    if (phdr[i].p_type == PT_LOAD && phdr[i].p_offset == mapoff)
-      {
-	load_offset = segbase - phdr[i].p_vaddr;
-	break;
-      }
-
-  ret = elf_w (lookup_symbol) (as, ip, &ei, load_offset, buf, buf_len, offp);
+  ret = elf_w (get_proc_name_in_image) (as, &ei, segbase, mapoff, ip, buf, buf_len, offp);
 
   munmap (ei.image, ei.size);
   ei.image = NULL;
diff --git a/frysk-imports/libunwind/src/elfxx.h b/frysk-imports/libunwind/src/elfxx.h
index 7742806..cef6647 100644
--- a/frysk-imports/libunwind/src/elfxx.h
+++ b/frysk-imports/libunwind/src/elfxx.h
@@ -1,7 +1,7 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003, 2005 Hewlett-Packard Co
    Copyright (C) 2007 David Mosberger-Tang
-	Contributed by David Mosberger-Tang <dmosberger@gmail.com>
+        Contributed by David Mosberger-Tang <dmosberger@gmail.com>
 
 This file is part of libunwind.
 
@@ -24,7 +24,6 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
-#include <elf.h>
 #include <fcntl.h>
 #include <unistd.h>
 
@@ -34,15 +33,39 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #include "libunwind_i.h"
 
 #if ELF_CLASS == ELFCLASS32
-# define ELF_W(x)	ELF32_##x
-# define Elf_W(x)	Elf32_##x
-# define elf_w(x)	_Uelf32_##x
+# define ELF_W(x)       ELF32_##x
+# define Elf_W(x)       Elf32_##x
+# define elf_w(x)       _Uelf32_##x
 #else
-# define ELF_W(x)	ELF64_##x
-# define Elf_W(x)	Elf64_##x
-# define elf_w(x)	_Uelf64_##x
+# define ELF_W(x)       ELF64_##x
+# define Elf_W(x)       Elf64_##x
+# define elf_w(x)       _Uelf64_##x
 #endif
 
+extern int elf_w (get_proc_name) (unw_addr_space_t as,
+                                  pid_t pid, unw_word_t ip,
+                                  char *buf, size_t len,
+                                  unw_word_t *offp);
+
+extern int elf_w (get_proc_name_in_image) (unw_addr_space_t as,
+                                           struct elf_image *ei,
+                                           unsigned long segbase,
+                                           unsigned long mapoff,
+                                           unw_word_t ip,
+                                           char *buf, size_t buf_len, unw_word_t *offp);
+
+static inline int
+elf_w (valid_object) (struct elf_image *ei)
+{
+  if (ei->size <= EI_VERSION)
+    return 0;
+
+  return (memcmp (ei->image, ELFMAG, SELFMAG) == 0
+          && ((uint8_t *) ei->image)[EI_CLASS] == ELF_CLASS
+          && ((uint8_t *) ei->image)[EI_VERSION] != EV_NONE
+          && ((uint8_t *) ei->image)[EI_VERSION] <= EV_CURRENT);
+}
+
 static inline int
 elf_map_image (struct elf_image *ei, const char *path)
 {
@@ -65,11 +88,11 @@ elf_map_image (struct elf_image *ei, const char *path)
   if (ei->image == MAP_FAILED)
     return -1;
 
+  if (!elf_w (valid_object) (ei))
+  {
+    munmap(ei->image, ei->size);
+    return -1;
+  }
+
   return 0;
 }
-
-extern int elf_w (valid_object) (struct elf_image *ei);
-extern int elf_w (get_proc_name) (unw_addr_space_t as,
-				  pid_t pid, unw_word_t ip,
-				  char *buf, size_t len,
-				  unw_word_t *offp);
diff --git a/frysk-imports/libunwind/src/hppa/Gcreate_addr_space.c b/frysk-imports/libunwind/src/hppa/Gcreate_addr_space.c
index 8f4301f..71186e0 100644
--- a/frysk-imports/libunwind/src/hppa/Gcreate_addr_space.c
+++ b/frysk-imports/libunwind/src/hppa/Gcreate_addr_space.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -33,8 +33,15 @@ unw_create_addr_space (unw_accessors_t *a, int byte_order)
 #ifdef UNW_LOCAL_ONLY
   return NULL;
 #else
-  unw_addr_space_t as = malloc (sizeof (*as));
+  unw_addr_space_t as;
 
+  /*
+   * hppa supports only big-endian.
+   */
+  if (byte_order != 0 && byte_order != __BIG_ENDIAN)
+    return NULL;
+
+  as = malloc (sizeof (*as));
   if (!as)
     return NULL;
 
@@ -42,11 +49,6 @@ unw_create_addr_space (unw_accessors_t *a, int byte_order)
 
   as->acc = *a;
 
-  /*
-   * hppa supports only big-endian.
-   */
-  if (byte_order != 0 && byte_order != __BIG_ENDIAN)
-    return NULL;
   return as;
 #endif
 }
diff --git a/frysk-imports/libunwind/src/hppa/Gget_proc_info.c b/frysk-imports/libunwind/src/hppa/Gget_proc_info.c
index 8d2c1fd..ce7a950 100644
--- a/frysk-imports/libunwind/src/hppa/Gget_proc_info.c
+++ b/frysk-imports/libunwind/src/hppa/Gget_proc_info.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -33,9 +33,9 @@ unw_get_proc_info (unw_cursor_t *cursor, unw_proc_info_t *pi)
   if (dwarf_make_proc_info (&c->dwarf) < 0)
     {
       /* On hppa, some key routines such as _start() and _dl_start()
-	 are missing DWARF unwind info.  We don't want to fail in that
-	 case, because those frames are uninteresting and just mark
-	 the end of the frame-chain anyhow.  */
+         are missing DWARF unwind info.  We don't want to fail in that
+         case, because those frames are uninteresting and just mark
+         the end of the frame-chain anyhow.  */
       memset (pi, 0, sizeof (*pi));
       pi->start_ip = c->dwarf.ip;
       pi->end_ip = c->dwarf.ip + 4;
diff --git a/frysk-imports/libunwind/src/hppa/Gget_save_loc.c b/frysk-imports/libunwind/src/hppa/Gget_save_loc.c
index 7aa6f31..549366a 100644
--- a/frysk-imports/libunwind/src/hppa/Gget_save_loc.c
+++ b/frysk-imports/libunwind/src/hppa/Gget_save_loc.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -28,14 +28,14 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 PROTECTED int
 unw_get_save_loc (unw_cursor_t *cursor, int reg, unw_save_loc_t *sloc)
 {
-  struct cursor *c = (struct cursor *) cursor;
+  /* struct cursor *c = (struct cursor *) cursor; */
   dwarf_loc_t loc;
 
-  loc = DWARF_NULL_LOC;		/* default to "not saved" */
+  loc = DWARF_NULL_LOC;         /* default to "not saved" */
 
 #warning FIX ME!
 
-  memset (sloc, 0, sizeof (sloc));
+  memset (sloc, 0, sizeof (*sloc));
 
   if (DWARF_IS_NULL_LOC (loc))
     {
diff --git a/frysk-imports/libunwind/src/hppa/Gglobal.c b/frysk-imports/libunwind/src/hppa/Gglobal.c
index a56426d..351a501 100644
--- a/frysk-imports/libunwind/src/hppa/Gglobal.c
+++ b/frysk-imports/libunwind/src/hppa/Gglobal.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (c) 2004-2005 Hewlett-Packard Development Company, L.P.
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -25,8 +25,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 #include "unwind_i.h"
 
-HIDDEN pthread_mutex_t hppa_lock = PTHREAD_MUTEX_INITIALIZER;
-HIDDEN int tdep_needs_initialization = 1;
+HIDDEN define_lock (hppa_lock);
+HIDDEN int tdep_init_done;
 
 HIDDEN void
 tdep_init (void)
@@ -35,10 +35,9 @@ tdep_init (void)
 
   sigfillset (&unwi_full_mask);
 
-  sigprocmask (SIG_SETMASK, &unwi_full_mask, &saved_mask);
-  mutex_lock (&hppa_lock);
+  lock_acquire (&hppa_lock, saved_mask);
   {
-    if (!tdep_needs_initialization)
+    if (tdep_init_done)
       /* another thread else beat us to it... */
       goto out;
 
@@ -49,9 +48,8 @@ tdep_init (void)
 #ifndef UNW_REMOTE_ONLY
     hppa_local_addr_space_init ();
 #endif
-    tdep_needs_initialization = 0;	/* signal that we're initialized... */
+    tdep_init_done = 1; /* signal that we're initialized... */
   }
  out:
-  mutex_unlock (&hppa_lock);
-  sigprocmask (SIG_SETMASK, &saved_mask, NULL);
+  lock_release (&hppa_lock, saved_mask);
 }
diff --git a/frysk-imports/libunwind/src/hppa/Ginit.c b/frysk-imports/libunwind/src/hppa/Ginit.c
index 5326b82..89ad51c 100644
--- a/frysk-imports/libunwind/src/hppa/Ginit.c
+++ b/frysk-imports/libunwind/src/hppa/Ginit.c
@@ -1,7 +1,7 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2002, 2004 Hewlett-Packard Co
    Copyright (C) 2007 David Mosberger-Tang
-	Contributed by David Mosberger-Tang <dmosberger@gmail.com>
+        Contributed by David Mosberger-Tang <dmosberger@gmail.com>
 
 This file is part of libunwind.
 
@@ -79,7 +79,7 @@ put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
 
 static int
 get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
-			void *arg)
+                        void *arg)
 {
   *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
   return 0;
@@ -87,7 +87,7 @@ get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
 
 static int
 access_mem (unw_addr_space_t as, unw_word_t addr, unw_word_t *val, int write,
-	    void *arg)
+            void *arg)
 {
   if (write)
     {
@@ -104,7 +104,7 @@ access_mem (unw_addr_space_t as, unw_word_t addr, unw_word_t *val, int write,
 
 static int
 access_reg (unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val, int write,
-	    void *arg)
+            void *arg)
 {
   unw_word_t *addr;
   ucontext_t *uc = arg;
@@ -135,7 +135,7 @@ access_reg (unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val, int write,
 
 static int
 access_fpreg (unw_addr_space_t as, unw_regnum_t reg, unw_fpreg_t *val,
-	      int write, void *arg)
+              int write, void *arg)
 {
   ucontext_t *uc = arg;
   unw_fpreg_t *addr;
@@ -150,14 +150,14 @@ access_fpreg (unw_addr_space_t as, unw_regnum_t reg, unw_fpreg_t *val,
   if (write)
     {
       Debug (12, "%s <- %08x.%08x\n",
-	     unw_regname (reg), val->raw.bits[1], val->raw.bits[0]);
+             unw_regname (reg), val->raw.bits[1], val->raw.bits[0]);
       *(unw_fpreg_t *) addr = *val;
     }
   else
     {
       *val = *(unw_fpreg_t *) addr;
       Debug (12, "%s -> %08x.%08x\n",
-	     unw_regname (reg), val->raw.bits[1], val->raw.bits[0]);
+             unw_regname (reg), val->raw.bits[1], val->raw.bits[0]);
     }
   return 0;
 
@@ -169,8 +169,8 @@ access_fpreg (unw_addr_space_t as, unw_regnum_t reg, unw_fpreg_t *val,
 
 static int
 get_static_proc_name (unw_addr_space_t as, unw_word_t ip,
-		      char *buf, size_t buf_len, unw_word_t *offp,
-		      void *arg)
+                      char *buf, size_t buf_len, unw_word_t *offp,
+                      void *arg)
 {
   return _Uelf32_get_proc_name (as, getpid (), ip, buf, buf_len, offp);
 }
diff --git a/frysk-imports/libunwind/src/hppa/Ginit_local.c b/frysk-imports/libunwind/src/hppa/Ginit_local.c
index 243ffd4..0ad2f88 100644
--- a/frysk-imports/libunwind/src/hppa/Ginit_local.c
+++ b/frysk-imports/libunwind/src/hppa/Ginit_local.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003 Hewlett-Packard Co
-	Contributed by ...
+        Contributed by ...
 
 This file is part of libunwind.
 
@@ -41,14 +41,14 @@ unw_init_local (unw_cursor_t *cursor, ucontext_t *uc)
 {
   struct cursor *c = (struct cursor *) cursor;
 
-  if (tdep_needs_initialization)
+  if (!tdep_init_done)
     tdep_init ();
 
   Debug (1, "(cursor=%p)\n", c);
 
   c->dwarf.as = unw_local_addr_space;
   c->dwarf.as_arg = uc;
-  return common_init (c);
+  return common_init (c, 1);
 }
 
 #endif /* !UNW_REMOTE_ONLY */
diff --git a/frysk-imports/libunwind/src/hppa/Ginit_remote.c b/frysk-imports/libunwind/src/hppa/Ginit_remote.c
index 3d6606d..a4160fd 100644
--- a/frysk-imports/libunwind/src/hppa/Ginit_remote.c
+++ b/frysk-imports/libunwind/src/hppa/Ginit_remote.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (c) 2004 Hewlett-Packard Development Company, L.P.
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -34,13 +34,13 @@ unw_init_remote (unw_cursor_t *cursor, unw_addr_space_t as, void *as_arg)
 #else /* !UNW_LOCAL_ONLY */
   struct cursor *c = (struct cursor *) cursor;
 
-  if (tdep_needs_initialization)
+  if (!tdep_init_done)
     tdep_init ();
 
   Debug (1, "(cursor=%p)\n", c);
 
   c->dwarf.as = as;
   c->dwarf.as_arg = as_arg;
-  return common_init (c);
+  return common_init (c, 0);
 #endif /* !UNW_LOCAL_ONLY */
 }
diff --git a/frysk-imports/libunwind/src/hppa/Gis_signal_frame.c b/frysk-imports/libunwind/src/hppa/Gis_signal_frame.c
index 202b570..00e40c6 100644
--- a/frysk-imports/libunwind/src/hppa/Gis_signal_frame.c
+++ b/frysk-imports/libunwind/src/hppa/Gis_signal_frame.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -64,7 +64,7 @@ unw_is_signal_frame (unw_cursor_t *cursor)
       return ret;
     }
   ret = ((w0 == 0x34190000 || w0 == 0x34190002)
-	 && w1 == 0x3414015a && w2 == 0xe4008200 && w3 == 0x08000240);
+         && w1 == 0x3414015a && w2 == 0xe4008200 && w3 == 0x08000240);
   Debug (1, "(cursor=%p, ip=0x%08lx) -> %d\n", c, (unsigned) ip, ret);
   return ret;
 #else
diff --git a/frysk-imports/libunwind/src/hppa/Gregs.c b/frysk-imports/libunwind/src/hppa/Gregs.c
index e6d84e3..da0542c 100644
--- a/frysk-imports/libunwind/src/hppa/Gregs.c
+++ b/frysk-imports/libunwind/src/hppa/Gregs.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -27,7 +27,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 HIDDEN int
 tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
-		 int write)
+                 int write)
 {
   struct dwarf_loc loc;
 
@@ -35,16 +35,16 @@ tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
     {
     case UNW_HPPA_IP:
       if (write)
-	c->dwarf.ip = *valp;		/* update the IP cache */
+        c->dwarf.ip = *valp;            /* update the IP cache */
       if (c->dwarf.pi_valid && (*valp < c->dwarf.pi.start_ip
-				|| *valp >= c->dwarf.pi.end_ip))
-	c->dwarf.pi_valid = 0;		/* new IP outside of current proc */
+                                || *valp >= c->dwarf.pi.end_ip))
+        c->dwarf.pi_valid = 0;          /* new IP outside of current proc */
       break;
 
     case UNW_HPPA_CFA:
     case UNW_HPPA_SP:
       if (write)
-	return -UNW_EREADONLYREG;
+        return -UNW_EREADONLYREG;
       *valp = c->dwarf.cfa;
       return 0;
 
@@ -71,7 +71,7 @@ tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
 
 HIDDEN int
 tdep_access_fpreg (struct cursor *c, unw_regnum_t reg, unw_fpreg_t *valp,
-		   int write)
+                   int write)
 {
   struct dwarf_loc loc;
 
diff --git a/frysk-imports/libunwind/src/hppa/Gresume.c b/frysk-imports/libunwind/src/hppa/Gresume.c
index 92d506d..f6bc023 100644
--- a/frysk-imports/libunwind/src/hppa/Gresume.c
+++ b/frysk-imports/libunwind/src/hppa/Gresume.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (c) 2004 Hewlett-Packard Development Company, L.P.
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -40,11 +40,11 @@ my_rt_sigreturn (void *new_sp, int in_syscall)
   register unsigned long r20 __asm__ ("r20") = SYS_rt_sigreturn;
 
   __asm__ __volatile__ ("copy %0, %%sp\n"
-			"be,l 0x100(%%sr2,%%r0),%%sr0,%%r31\n"
-			"nop"
-			:
-			: "r"(new_sp), "r"(r20), "r"(r25)
-			: "memory");
+                        "be,l 0x100(%%sr2,%%r0),%%sr0,%%r31\n"
+                        "nop"
+                        :
+                        : "r"(new_sp), "r"(r20), "r"(r25)
+                        : "memory");
   abort ();
 }
 
@@ -90,9 +90,9 @@ static inline int
 establish_machine_state (struct cursor *c)
 {
   int (*access_reg) (unw_addr_space_t, unw_regnum_t, unw_word_t *,
-		     int write, void *);
+                     int write, void *);
   int (*access_fpreg) (unw_addr_space_t, unw_regnum_t, unw_fpreg_t *,
-		       int write, void *);
+                       int write, void *);
   unw_addr_space_t as = c->dwarf.as;
   void *arg = c->dwarf.as_arg;
   unw_fpreg_t fpval;
@@ -108,15 +108,15 @@ establish_machine_state (struct cursor *c)
     {
       Debug (16, "copying %s %d\n", unw_regname (reg), reg);
       if (unw_is_fpreg (reg))
-	{
-	  if (tdep_access_fpreg (c, reg, &fpval, 0) >= 0)
-	    (*access_fpreg) (as, reg, &fpval, 1, arg);
-	}
+        {
+          if (tdep_access_fpreg (c, reg, &fpval, 0) >= 0)
+            (*access_fpreg) (as, reg, &fpval, 1, arg);
+        }
       else
-	{
-	  if (tdep_access_reg (c, reg, &val, 0) >= 0)
-	    (*access_reg) (as, reg, &val, 1, arg);
-	}
+        {
+          if (tdep_access_reg (c, reg, &val, 0) >= 0)
+            (*access_reg) (as, reg, &val, 1, arg);
+        }
     }
   return 0;
 }
@@ -141,5 +141,5 @@ unw_resume (unw_cursor_t *cursor)
     return ret;
 
   return (*c->dwarf.as->acc.resume) (c->dwarf.as, (unw_cursor_t *) c,
-				     c->dwarf.as_arg);
+                                     c->dwarf.as_arg);
 }
diff --git a/frysk-imports/libunwind/src/hppa/Gstep.c b/frysk-imports/libunwind/src/hppa/Gstep.c
index abff456..078ff43 100644
--- a/frysk-imports/libunwind/src/hppa/Gstep.c
+++ b/frysk-imports/libunwind/src/hppa/Gstep.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003-2004 Hewlett-Packard Co
-	Contributed by David Mosberger
+        Contributed by David Mosberger
 
 This file is part of libunwind.
 
@@ -46,49 +46,49 @@ unw_step (unw_cursor_t *cursor)
   if (unlikely (ret < 0))
     {
       /* DWARF failed, let's see if we can follow the frame-chain
-	 or skip over the signal trampoline.  */
+         or skip over the signal trampoline.  */
 
       Debug (13, "dwarf_step() failed (ret=%d), trying fallback\n", ret);
 
       if (unw_is_signal_frame (cursor))
-	{
+        {
 #ifdef __linux__
-	  /* Assume that the trampoline is at the beginning of the
-	     sigframe.  */
-	  unw_word_t ip, sc_addr = c->dwarf.ip + LINUX_RT_SIGFRAME_UC_OFF;
-	  dwarf_loc_t iaoq_loc = DWARF_LOC (sc_addr + LINUX_SC_IAOQ_OFF, 0);
-
-	  c->sigcontext_format = HPPA_SCF_LINUX_RT_SIGFRAME;
-	  c->sigcontext_addr = sc_addr;
-	  c->dwarf.ret_addr_column = UNW_HPPA_RP;
-
-	  if ((ret = dwarf_get (&c->dwarf, iaoq_loc, &ip)) , 0)
-	    {
-	      Debug (2, "failed to read IAOQ[1] (ret=%d)\n", ret);
-	      return ret;
-	    }
-	  c->dwarf.ip = ip & ~0x3;	/* mask out the privilege level */
-
-	  for (i = 0; i < 32; ++i)
-	    {
-	      c->dwarf.loc[UNW_HPPA_GR + i]
-		= DWARF_LOC (sc_addr + LINUX_SC_GR_OFF + 4*i, 0);
-	      c->dwarf.loc[UNW_HPPA_FR + i]
-		= DWARF_LOC (sc_addr + LINUX_SC_FR_OFF + 4*i, 0);
-	    }
-
-	  if ((ret = dwarf_get (&c->dwarf, c->dwarf.loc[UNW_HPPA_SP],
-				&c->dwarf.cfa)) < 0)
-	    {
-	      Debug (2, "failed to read SP (ret=%d)\n", ret);
-	      return ret;
-	    }
+          /* Assume that the trampoline is at the beginning of the
+             sigframe.  */
+          unw_word_t ip, sc_addr = c->dwarf.ip + LINUX_RT_SIGFRAME_UC_OFF;
+          dwarf_loc_t iaoq_loc = DWARF_LOC (sc_addr + LINUX_SC_IAOQ_OFF, 0);
+
+          c->sigcontext_format = HPPA_SCF_LINUX_RT_SIGFRAME;
+          c->sigcontext_addr = sc_addr;
+          c->dwarf.ret_addr_column = UNW_HPPA_RP;
+
+          if ((ret = dwarf_get (&c->dwarf, iaoq_loc, &ip)) < 0)
+            {
+              Debug (2, "failed to read IAOQ[1] (ret=%d)\n", ret);
+              return ret;
+            }
+          c->dwarf.ip = ip & ~0x3;      /* mask out the privilege level */
+
+          for (i = 0; i < 32; ++i)
+            {
+              c->dwarf.loc[UNW_HPPA_GR + i]
+                = DWARF_LOC (sc_addr + LINUX_SC_GR_OFF + 4*i, 0);
+              c->dwarf.loc[UNW_HPPA_FR + i]
+                = DWARF_LOC (sc_addr + LINUX_SC_FR_OFF + 4*i, 0);
+            }
+
+          if ((ret = dwarf_get (&c->dwarf, c->dwarf.loc[UNW_HPPA_SP],
+                                &c->dwarf.cfa)) < 0)
+            {
+              Debug (2, "failed to read SP (ret=%d)\n", ret);
+              return ret;
+            }
 #else
 # error Implement me!
 #endif
-	}
+        }
       else
-	c->dwarf.ip = 0;
+        c->dwarf.ip = 0;
     }
   ret = (c->dwarf.ip == 0) ? 0 : 1;
   Debug (2, "returning %d\n", ret);
diff --git a/frysk-imports/libunwind/src/hppa/get_accessors.c b/frysk-imports/libunwind/src/hppa/get_accessors.c
index b6bd49a..873a38c 100644
--- a/frysk-imports/libunwind/src/hppa/get_accessors.c
+++ b/frysk-imports/libunwind/src/hppa/get_accessors.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003 Hewlett-Packard Co
-	Contributed by ...
+        Contributed by ...
 
 This file is part of libunwind.
 
@@ -28,10 +28,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 PROTECTED unw_accessors_t *
 unw_get_accessors (unw_addr_space_t as)
 {
-  if (hppa_needs_initialization)
-    {
-      hppa_needs_initialization = 0;
-      hppa_init ();
-    }
+  if (!tdep_init_done)
+    tdep_init ();
+
   return &as->acc;
 }
diff --git a/frysk-imports/libunwind/src/hppa/init.h b/frysk-imports/libunwind/src/hppa/init.h
index 18610ef..4e23b86 100644
--- a/frysk-imports/libunwind/src/hppa/init.h
+++ b/frysk-imports/libunwind/src/hppa/init.h
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003 Hewlett-Packard Co
-	Contributed by ...
+        Contributed by ...
 
 This file is part of libunwind.
 
@@ -26,28 +26,22 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #include "unwind_i.h"
 
 static inline int
-common_init (struct cursor *c)
+common_init (struct cursor *c, unsigned use_prev_instr)
 {
   int ret;
 
-  c->ip_loc = HPPA_REG_LOC (c, UNW_HPPA_IP);
-  c->sp_loc = HPPA_REG_LOC (c, UNW_HPPA_SP);
+  c->dwarf.loc[UNW_HPPA_IP] = DWARF_REG_LOC (&c->dwarf, UNW_HPPA_IP);
+  c->dwarf.loc[UNW_HPPA_SP] = DWARF_REG_LOC (&c->dwarf, UNW_HPPA_SP);
 
-  ret = hppa_get (c, c->ip_loc, &c->ip);
+  ret = dwarf_get (&c->dwarf, c->dwarf.loc[UNW_HPPA_IP], &c->dwarf.ip);
   if (ret < 0)
     return ret;
 
-  ret = hppa_get (c, HPPA_REG_LOC (c, UNW_HPPA_SP), &c->sp);
+  ret = dwarf_get (&c->dwarf, c->dwarf.loc[UNW_HPPA_SP], &c->dwarf.cfa);
   if (ret < 0)
     return ret;
 
-  c->sigcontext_format = HPPA_SCF_NONE;
-  c->sigcontext_addr = 0;
-
-  c->dwarf.decrease_ip = 0;
-  c->dwarf.args_size = 0;
-  c->dwarf.ret_addr_column = 0;
-  c->dwarf.pi_valid = 0;
-  c->dwarf.pi_is_dynamic = 0;
+  c->dwarf.stash_frames = 0;
+  c->dwarf.use_prev_instr = use_prev_instr;
   return 0;
 }
diff --git a/frysk-imports/libunwind/src/hppa/offsets.h b/frysk-imports/libunwind/src/hppa/offsets.h
index d824770..24e6453 100644
--- a/frysk-imports/libunwind/src/hppa/offsets.h
+++ b/frysk-imports/libunwind/src/hppa/offsets.h
@@ -1,17 +1,17 @@
-#define LINUX_UC_FLAGS_OFF	0x000
-#define LINUX_UC_LINK_OFF	0x004
-#define LINUX_UC_STACK_OFF	0x008
-#define LINUX_UC_MCONTEXT_OFF	0x018
-#define LINUX_UC_SIGMASK_OFF	0x1b8
+#define LINUX_UC_FLAGS_OFF      0x000
+#define LINUX_UC_LINK_OFF       0x004
+#define LINUX_UC_STACK_OFF      0x008
+#define LINUX_UC_MCONTEXT_OFF   0x018
+#define LINUX_UC_SIGMASK_OFF    0x1b8
 
-#define LINUX_SC_FLAGS_OFF	0x000
-#define LINUX_SC_GR_OFF		0x004
-#define LINUX_SC_FR_OFF		0x088
-#define LINUX_SC_IASQ_OFF	0x188
-#define LINUX_SC_IAOQ_OFF	0x190
-#define LINUX_SC_SAR_OFF	0x198
+#define LINUX_SC_FLAGS_OFF      0x000
+#define LINUX_SC_GR_OFF         0x004
+#define LINUX_SC_FR_OFF         0x088
+#define LINUX_SC_IASQ_OFF       0x188
+#define LINUX_SC_IAOQ_OFF       0x190
+#define LINUX_SC_SAR_OFF        0x198
 
 /* The signal frame contains 4 words of space for the sigreturn
    trampoline, the siginfo structure, and then the sigcontext
    structure.  See include/asm-parisc/compat_rt_sigframe.h.  */
-#define LINUX_RT_SIGFRAME_UC_OFF	0xac
+#define LINUX_RT_SIGFRAME_UC_OFF        0xac
diff --git a/frysk-imports/libunwind/src/hppa/regname.c b/frysk-imports/libunwind/src/hppa/regname.c
index 07cae8e..06dfae7 100644
--- a/frysk-imports/libunwind/src/hppa/regname.c
+++ b/frysk-imports/libunwind/src/hppa/regname.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (c) 2004-2005 Hewlett-Packard Development Company, L.P.
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
diff --git a/frysk-imports/libunwind/src/hppa/tables.c b/frysk-imports/libunwind/src/hppa/tables.c
index 383b449..5104d4d 100644
--- a/frysk-imports/libunwind/src/hppa/tables.c
+++ b/frysk-imports/libunwind/src/hppa/tables.c
@@ -7,14 +7,14 @@ is_local_addr_space (unw_addr_space_t as)
 
   return (as == _Uhppa_local_addr_space
 #ifndef UNW_REMOTE_ONLY
-	  || as == _ULhppa_local_addr_space
+          || as == _ULhppa_local_addr_space
 #endif
-	  );
+          );
 }
 
 HIDDEN int
 tdep_find_proc_info (unw_addr_space_t as, unw_word_t ip,
-		     unw_proc_info_t *pi, int need_unwind_info, void *arg)
+                     unw_proc_info_t *pi, int need_unwind_info, void *arg)
 {
   printf ("%s: begging to get implemented...\n", __FUNCTION__);
   return 0;
@@ -22,8 +22,8 @@ tdep_find_proc_info (unw_addr_space_t as, unw_word_t ip,
 
 HIDDEN int
 tdep_search_unwind_table (unw_addr_space_t as, unw_word_t ip,
-			  unw_dyn_info_t *di,
-			  unw_proc_info_t *pi, int need_unwind_info, void *arg)
+                          unw_dyn_info_t *di,
+                          unw_proc_info_t *pi, int need_unwind_info, void *arg)
 {
   printf ("%s: the biggest beggar of them all...\n", __FUNCTION__);
   return 0;
diff --git a/frysk-imports/libunwind/src/hppa/unwind_i.h b/frysk-imports/libunwind/src/hppa/unwind_i.h
index d3c11be..cafeab5 100644
--- a/frysk-imports/libunwind/src/hppa/unwind_i.h
+++ b/frysk-imports/libunwind/src/hppa/unwind_i.h
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2004-2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -26,22 +26,21 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #ifndef unwind_i_h
 #define unwind_i_h
 
-#include <memory.h>
 #include <stdint.h>
 
 #include <libunwind-hppa.h>
 
 #include "libunwind_i.h"
 
-#define hppa_lock			UNW_OBJ(lock)
-#define hppa_local_resume		UNW_OBJ(local_resume)
-#define hppa_local_addr_space_init	UNW_OBJ(local_addr_space_init)
-#define hppa_scratch_loc		UNW_OBJ(scratch_loc)
-#define setcontext			UNW_ARCH_OBJ (setcontext)
+#define hppa_lock                       UNW_OBJ(lock)
+#define hppa_local_resume               UNW_OBJ(local_resume)
+#define hppa_local_addr_space_init      UNW_OBJ(local_addr_space_init)
+#define hppa_scratch_loc                UNW_OBJ(scratch_loc)
+#define setcontext                      UNW_ARCH_OBJ (setcontext)
 
 extern void hppa_local_addr_space_init (void);
 extern int hppa_local_resume (unw_addr_space_t as, unw_cursor_t *cursor,
-			      void *arg);
+                              void *arg);
 extern dwarf_loc_t hppa_scratch_loc (struct cursor *c, unw_regnum_t reg);
 extern int setcontext (const ucontext_t *ucp);
 
diff --git a/frysk-imports/libunwind/src/ia64/Gcreate_addr_space.c b/frysk-imports/libunwind/src/ia64/Gcreate_addr_space.c
index a3524a0..20cf5d8 100644
--- a/frysk-imports/libunwind/src/ia64/Gcreate_addr_space.c
+++ b/frysk-imports/libunwind/src/ia64/Gcreate_addr_space.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2002 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
diff --git a/frysk-imports/libunwind/src/ia64/Gfind_unwind_table.c b/frysk-imports/libunwind/src/ia64/Gfind_unwind_table.c
new file mode 100644
index 0000000..9fd2707
--- /dev/null
+++ b/frysk-imports/libunwind/src/ia64/Gfind_unwind_table.c
@@ -0,0 +1,143 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2003-2004 Hewlett-Packard Co
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+#include <elf.h>
+#include <fcntl.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <sys/mman.h>
+
+#include "libunwind_i.h"
+#include "elf64.h"
+
+static unw_word_t
+find_gp (struct elf_dyn_info *edi, Elf64_Phdr *pdyn, Elf64_Addr load_base)
+{
+  Elf64_Off soff, str_soff;
+  Elf64_Ehdr *ehdr = edi->ei.image;
+  Elf64_Shdr *shdr;
+  Elf64_Shdr *str_shdr;
+  Elf64_Addr gp = 0;
+  char *strtab;
+  int i;
+
+  if (pdyn)
+    {
+      /* If we have a PT_DYNAMIC program header, fetch the gp-value
+         from the DT_PLTGOT entry.  */
+      Elf64_Dyn *dyn = (Elf64_Dyn *) (pdyn->p_offset + (char *) edi->ei.image);
+      for (; dyn->d_tag != DT_NULL; ++dyn)
+        if (dyn->d_tag == DT_PLTGOT)
+          {
+            gp = (Elf64_Addr) dyn->d_un.d_ptr + load_base;
+            goto done;
+          }
+    }
+
+  /* Without a PT_DYAMIC header, lets try to look for a non-empty .opd
+     section.  If there is such a section, we know it's full of
+     function descriptors, and we can simply pick up the gp from the
+     second word of the first entry in this table.  */
+
+  soff = ehdr->e_shoff;
+  str_soff = soff + (ehdr->e_shstrndx * ehdr->e_shentsize);
+
+  if (soff + ehdr->e_shnum * ehdr->e_shentsize > edi->ei.size)
+    {
+      Debug (1, "section table outside of image? (%lu > %lu)",
+             soff + ehdr->e_shnum * ehdr->e_shentsize,
+             edi->ei.size);
+      goto done;
+    }
+
+  shdr = (Elf64_Shdr *) ((char *) edi->ei.image + soff);
+  str_shdr = (Elf64_Shdr *) ((char *) edi->ei.image + str_soff);
+  strtab = (char *) edi->ei.image + str_shdr->sh_offset;
+  for (i = 0; i < ehdr->e_shnum; ++i)
+    {
+      if (strcmp (strtab + shdr->sh_name, ".opd") == 0
+          && shdr->sh_size >= 16)
+        {
+          gp = ((Elf64_Addr *) ((char *) edi->ei.image + shdr->sh_offset))[1];
+          goto done;
+        }
+      shdr = (Elf64_Shdr *) (((char *) shdr) + ehdr->e_shentsize);
+    }
+
+ done:
+  Debug (16, "image at %p, gp = %lx\n", edi->ei.image, gp);
+  return gp;
+}
+
+int
+ia64_find_unwind_table (struct elf_dyn_info *edi, unw_addr_space_t as,
+                         char *path, unw_word_t segbase, unw_word_t mapoff,
+                         unw_word_t ip)
+{
+  Elf64_Phdr *phdr, *ptxt = NULL, *punw = NULL, *pdyn = NULL;
+  Elf64_Ehdr *ehdr;
+  int i;
+
+  if (!_Uelf64_valid_object (&edi->ei))
+    return -UNW_ENOINFO;
+
+  ehdr = edi->ei.image;
+  phdr = (Elf64_Phdr *) ((char *) edi->ei.image + ehdr->e_phoff);
+
+  for (i = 0; i < ehdr->e_phnum; ++i)
+    {
+      switch (phdr[i].p_type)
+        {
+        case PT_LOAD:
+          if (phdr[i].p_offset == mapoff)
+            ptxt = phdr + i;
+          break;
+
+        case PT_IA_64_UNWIND:
+          punw = phdr + i;
+          break;
+
+        case PT_DYNAMIC:
+          pdyn = phdr + i;
+          break;
+
+        default:
+          break;
+        }
+    }
+  if (!ptxt || !punw)
+    return 0;
+
+  edi->di_cache.start_ip = segbase;
+  edi->di_cache.end_ip = edi->di_cache.start_ip + ptxt->p_memsz;
+  edi->di_cache.gp = find_gp (edi, pdyn, segbase - ptxt->p_vaddr);
+  edi->di_cache.format = UNW_INFO_FORMAT_TABLE;
+  edi->di_cache.u.ti.name_ptr = 0;
+  edi->di_cache.u.ti.segbase = segbase;
+  edi->di_cache.u.ti.table_len = punw->p_memsz / sizeof (unw_word_t);
+  edi->di_cache.u.ti.table_data = (unw_word_t *)
+    ((char *) edi->ei.image + (punw->p_vaddr - ptxt->p_vaddr));
+  return 1;
+}
diff --git a/frysk-imports/libunwind/src/ia64/Gget_proc_info.c b/frysk-imports/libunwind/src/ia64/Gget_proc_info.c
index 21015d4..6b4722d 100644
--- a/frysk-imports/libunwind/src/ia64/Gget_proc_info.c
+++ b/frysk-imports/libunwind/src/ia64/Gget_proc_info.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2002 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
diff --git a/frysk-imports/libunwind/src/ia64/Gget_save_loc.c b/frysk-imports/libunwind/src/ia64/Gget_save_loc.c
index 7bc2b19..fc37ad9 100644
--- a/frysk-imports/libunwind/src/ia64/Gget_save_loc.c
+++ b/frysk-imports/libunwind/src/ia64/Gget_save_loc.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2002-2003, 2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -38,7 +38,7 @@ unw_get_save_loc (unw_cursor_t *cursor, int reg, unw_save_loc_t *sloc)
   uint8_t nat_bitnr;
   int ret;
 
-  loc = IA64_NULL_LOC;		/* default to "not saved" */
+  loc = IA64_NULL_LOC;          /* default to "not saved" */
 
   switch (reg)
     {
@@ -62,8 +62,8 @@ unw_get_save_loc (unw_cursor_t *cursor, int reg, unw_save_loc_t *sloc)
       reg_loc = c->loc[IA64_REG_R4 + (reg - (UNW_IA64_NAT + 4))];
       nat_bitnr = c->nat_bitnr[reg - (UNW_IA64_NAT + 4)];
       if (IA64_IS_FP_LOC (reg_loc))
-	/* NaT bit saved as a NaTVal.  */
-	loc = reg_loc;
+        /* NaT bit saved as a NaTVal.  */
+        loc = reg_loc;
       break;
 
     case UNW_IA64_FR + 2: loc = c->loc[IA64_REG_F2]; break;
@@ -74,29 +74,29 @@ unw_get_save_loc (unw_cursor_t *cursor, int reg, unw_save_loc_t *sloc)
       loc = c->loc[IA64_REG_F16 + (reg - (UNW_IA64_FR + 16))];
       break;
 
-    case UNW_IA64_AR_BSP:	loc = c->loc[IA64_REG_BSP]; break;
-    case UNW_IA64_AR_BSPSTORE:	loc = c->loc[IA64_REG_BSPSTORE]; break;
-    case UNW_IA64_AR_PFS:	loc = c->loc[IA64_REG_PFS]; break;
-    case UNW_IA64_AR_RNAT:	loc = c->loc[IA64_REG_RNAT]; break;
-    case UNW_IA64_AR_UNAT:	loc = c->loc[IA64_REG_UNAT]; break;
-    case UNW_IA64_AR_LC:	loc = c->loc[IA64_REG_LC]; break;
-    case UNW_IA64_AR_FPSR:	loc = c->loc[IA64_REG_FPSR]; break;
-    case UNW_IA64_BR + 1:	loc = c->loc[IA64_REG_B1]; break;
-    case UNW_IA64_BR + 2:	loc = c->loc[IA64_REG_B2]; break;
-    case UNW_IA64_BR + 3:	loc = c->loc[IA64_REG_B3]; break;
-    case UNW_IA64_BR + 4:	loc = c->loc[IA64_REG_B4]; break;
-    case UNW_IA64_BR + 5:	loc = c->loc[IA64_REG_B5]; break;
-    case UNW_IA64_CFM:		loc = c->cfm_loc; break;
-    case UNW_IA64_PR:		loc = c->loc[IA64_REG_PR]; break;
-
-    case UNW_IA64_GR + 32 ... UNW_IA64_GR + 127:	/* stacked reg */
+    case UNW_IA64_AR_BSP:       loc = c->loc[IA64_REG_BSP]; break;
+    case UNW_IA64_AR_BSPSTORE:  loc = c->loc[IA64_REG_BSPSTORE]; break;
+    case UNW_IA64_AR_PFS:       loc = c->loc[IA64_REG_PFS]; break;
+    case UNW_IA64_AR_RNAT:      loc = c->loc[IA64_REG_RNAT]; break;
+    case UNW_IA64_AR_UNAT:      loc = c->loc[IA64_REG_UNAT]; break;
+    case UNW_IA64_AR_LC:        loc = c->loc[IA64_REG_LC]; break;
+    case UNW_IA64_AR_FPSR:      loc = c->loc[IA64_REG_FPSR]; break;
+    case UNW_IA64_BR + 1:       loc = c->loc[IA64_REG_B1]; break;
+    case UNW_IA64_BR + 2:       loc = c->loc[IA64_REG_B2]; break;
+    case UNW_IA64_BR + 3:       loc = c->loc[IA64_REG_B3]; break;
+    case UNW_IA64_BR + 4:       loc = c->loc[IA64_REG_B4]; break;
+    case UNW_IA64_BR + 5:       loc = c->loc[IA64_REG_B5]; break;
+    case UNW_IA64_CFM:          loc = c->cfm_loc; break;
+    case UNW_IA64_PR:           loc = c->loc[IA64_REG_PR]; break;
+
+    case UNW_IA64_GR + 32 ... UNW_IA64_GR + 127:        /* stacked reg */
       reg = rotate_gr (c, reg - UNW_IA64_GR);
       ret = ia64_get_stacked (c, reg, &loc, NULL);
       if (ret < 0)
-	return ret;
+        return ret;
       break;
 
-    case UNW_IA64_NAT + 32 ... UNW_IA64_NAT + 127:	/* stacked reg */
+    case UNW_IA64_NAT + 32 ... UNW_IA64_NAT + 127:      /* stacked reg */
       reg = rotate_gr (c, reg - UNW_IA64_NAT);
       ret = ia64_get_stacked (c, reg, NULL, &loc);
       break;
@@ -108,9 +108,9 @@ unw_get_save_loc (unw_cursor_t *cursor, int reg, unw_save_loc_t *sloc)
       /* scratch & special registers: */
 
     case UNW_IA64_GR + 0:
-    case UNW_IA64_GR + 1:				/* global pointer */
+    case UNW_IA64_GR + 1:                               /* global pointer */
     case UNW_IA64_NAT + 0:
-    case UNW_IA64_NAT + 1:				/* global pointer */
+    case UNW_IA64_NAT + 1:                              /* global pointer */
     case UNW_IA64_FR + 0:
     case UNW_IA64_FR + 1:
       break;
@@ -142,7 +142,7 @@ unw_get_save_loc (unw_cursor_t *cursor, int reg, unw_save_loc_t *sloc)
       break;
     }
 
-  memset (sloc, 0, sizeof (sloc));
+  memset (sloc, 0, sizeof (*sloc));
 
   if (IA64_IS_NULL_LOC (loc))
     {
diff --git a/frysk-imports/libunwind/src/ia64/Gglobal.c b/frysk-imports/libunwind/src/ia64/Gglobal.c
index 9525f8c..5c6156f 100644
--- a/frysk-imports/libunwind/src/ia64/Gglobal.c
+++ b/frysk-imports/libunwind/src/ia64/Gglobal.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2002-2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -29,7 +29,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 HIDDEN struct ia64_global_unwind_state unw =
   {
-    .needs_initialization = 1,
     .lock = PTHREAD_MUTEX_INITIALIZER,
     .save_order = {
       IA64_REG_IP, IA64_REG_PFS, IA64_REG_PSP, IA64_REG_PR,
@@ -53,15 +52,15 @@ HIDDEN struct ia64_global_unwind_state unw =
 HIDDEN void
 tdep_init (void)
 {
-  uint8_t f1_bytes[16] = {
+  const uint8_t f1_bytes[16] = {
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
     0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
   };
-  uint8_t nat_val_bytes[16] = {
+  const uint8_t nat_val_bytes[16] = {
     0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfe,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
   };
-  uint8_t int_val_bytes[16] = {
+  const uint8_t int_val_bytes[16] = {
     0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3e,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
   };
@@ -71,10 +70,9 @@ tdep_init (void)
 
   sigfillset (&unwi_full_mask);
 
-  sigprocmask (SIG_SETMASK, &unwi_full_mask, &saved_mask);
-  mutex_lock (&unw.lock);
+  lock_acquire (&unw.lock, saved_mask);
   {
-    if (!tdep_needs_initialization)
+    if (tdep_init_done)
       /* another thread else beat us to it... */
       goto out;
 
@@ -82,7 +80,7 @@ tdep_init (void)
 
     mempool_init (&unw.reg_state_pool, sizeof (struct ia64_reg_state), 0);
     mempool_init (&unw.labeled_state_pool,
-		  sizeof (struct ia64_labeled_state), 0);
+                  sizeof (struct ia64_labeled_state), 0);
 
     unw.read_only.r0 = 0;
     unw.read_only.f0.raw.bits[0] = 0;
@@ -92,24 +90,24 @@ tdep_init (void)
     bep = (uint8_t *) &unw.read_only.f1_be;
     for (i = 0; i < 16; ++i)
       {
-	*--lep = f1_bytes[i];
-	*bep++ = f1_bytes[i];
+        *--lep = f1_bytes[i];
+        *bep++ = f1_bytes[i];
       }
 
     lep = (uint8_t *) &unw.nat_val_le + 16;
     bep = (uint8_t *) &unw.nat_val_be;
     for (i = 0; i < 16; ++i)
       {
-	*--lep = nat_val_bytes[i];
-	*bep++ = nat_val_bytes[i];
+        *--lep = nat_val_bytes[i];
+        *bep++ = nat_val_bytes[i];
       }
 
     lep = (uint8_t *) &unw.int_val_le + 16;
     bep = (uint8_t *) &unw.int_val_be;
     for (i = 0; i < 16; ++i)
       {
-	*--lep = int_val_bytes[i];
-	*bep++ = int_val_bytes[i];
+        *--lep = int_val_bytes[i];
+        *bep++ = int_val_bytes[i];
       }
 
     assert (8*sizeof(unw_hash_index_t) >= IA64_LOG_UNW_HASH_SIZE);
@@ -117,9 +115,8 @@ tdep_init (void)
 #ifndef UNW_REMOTE_ONLY
     ia64_local_addr_space_init ();
 #endif
-    tdep_needs_initialization = 0;	/* signal that we're initialized... */
+    tdep_init_done = 1; /* signal that we're initialized... */
   }
  out:
-  mutex_unlock (&unw.lock);
-  sigprocmask (SIG_SETMASK, &saved_mask, NULL);
+  lock_release (&unw.lock, saved_mask);
 }
diff --git a/frysk-imports/libunwind/src/ia64/Ginit.c b/frysk-imports/libunwind/src/ia64/Ginit.c
index 5afa9ab..7b64f0c 100644
--- a/frysk-imports/libunwind/src/ia64/Ginit.c
+++ b/frysk-imports/libunwind/src/ia64/Ginit.c
@@ -1,7 +1,7 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2001-2005 Hewlett-Packard Co
    Copyright (C) 2007 David Mosberger-Tang
-	Contributed by David Mosberger-Tang <dmosberger@gmail.com>
+        Contributed by David Mosberger-Tang <dmosberger@gmail.com>
 
 This file is part of libunwind.
 
@@ -61,7 +61,7 @@ put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
 
 static int
 get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
-			void *arg)
+                        void *arg)
 {
 #ifndef UNW_LOCAL_ONLY
 # pragma weak _U_dyn_info_list_addr
@@ -74,7 +74,7 @@ get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
 
 static int
 access_mem (unw_addr_space_t as, unw_word_t addr, unw_word_t *val, int write,
-	    void *arg)
+            void *arg)
 {
   if (write)
     {
@@ -91,12 +91,12 @@ access_mem (unw_addr_space_t as, unw_word_t addr, unw_word_t *val, int write,
 
 #ifdef HAVE_SYS_UC_ACCESS_H
 
-#define SYSCALL_CFM_SAVE_REG	11 /* on a syscall, ar.pfs is saved in r11 */
-#define REASON_SYSCALL		0
+#define SYSCALL_CFM_SAVE_REG    11 /* on a syscall, ar.pfs is saved in r11 */
+#define REASON_SYSCALL          0
 
 static int
 access_reg (unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val, int write,
-	    void *arg)
+            void *arg)
 {
   ucontext_t *uc = arg;
   unsigned int nat, mask;
@@ -110,88 +110,88 @@ access_reg (unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val, int write,
     {
     case UNW_IA64_GR  ... UNW_IA64_GR + 31:
       if ((ret = __uc_get_grs (uc, (reg - UNW_IA64_GR), 1, &value, &nat)))
-	break;
+        break;
 
       if (write)
-	ret = __uc_set_grs (uc, (reg - UNW_IA64_GR), 1, val, nat);
+        ret = __uc_set_grs (uc, (reg - UNW_IA64_GR), 1, val, nat);
       else
-	*val = value;
+        *val = value;
       break;
 
     case UNW_IA64_NAT ... UNW_IA64_NAT + 31:
       if ((ret = __uc_get_grs (uc, (reg - UNW_IA64_GR), 1, &value, &nat)))
-	break;
+        break;
 
       mask = 1 << (reg - UNW_IA64_GR);
 
       if (write)
-	{
-	  if (*val)
-	    nat |= mask;
-	  else
-	    nat &= ~mask;
-	  ret = __uc_set_grs (uc, (reg - UNW_IA64_GR), 1, &value, nat);
-	}
+        {
+          if (*val)
+            nat |= mask;
+          else
+            nat &= ~mask;
+          ret = __uc_set_grs (uc, (reg - UNW_IA64_GR), 1, &value, nat);
+        }
       else
-	*val = (nat & mask) != 0;
+        *val = (nat & mask) != 0;
       break;
 
     case UNW_IA64_AR  ... UNW_IA64_AR + 127:
       if (reg == UNW_IA64_AR_BSP)
-	{
-  	  if (write)
-	    ret = __uc_set_ar (uc, (reg - UNW_IA64_AR), *val);
- 	  else
- 	    ret = __uc_get_ar (uc, (reg - UNW_IA64_AR), val);
-	}
+        {
+          if (write)
+            ret = __uc_set_ar (uc, (reg - UNW_IA64_AR), *val);
+          else
+            ret = __uc_get_ar (uc, (reg - UNW_IA64_AR), val);
+        }
       else if (reg == UNW_IA64_AR_PFS && reason == REASON_SYSCALL)
- 	{
-	  /* As of HP-UX 11.22, getcontext() does not have unwind info
-	     and because of that, we need to hack thins manually here.
-	     Hopefully, this is OK because the HP-UX kernel also needs
-	     to know where AR.PFS has been saved, so the use of
-	     register r11 for this purpose is pretty much nailed
-	     down.  */
- 	  if (write)
- 	    ret = __uc_set_grs (uc, SYSCALL_CFM_SAVE_REG, 1, val, 0);
- 	  else
- 	    ret = __uc_get_grs (uc, SYSCALL_CFM_SAVE_REG, 1, val, &nat);
- 	}
+        {
+          /* As of HP-UX 11.22, getcontext() does not have unwind info
+             and because of that, we need to hack thins manually here.
+             Hopefully, this is OK because the HP-UX kernel also needs
+             to know where AR.PFS has been saved, so the use of
+             register r11 for this purpose is pretty much nailed
+             down.  */
+          if (write)
+            ret = __uc_set_grs (uc, SYSCALL_CFM_SAVE_REG, 1, val, 0);
+          else
+            ret = __uc_get_grs (uc, SYSCALL_CFM_SAVE_REG, 1, val, &nat);
+        }
       else
-	{
-	  if (write)
-	    ret = __uc_set_ar (uc, (reg - UNW_IA64_AR), *val);
-	  else
-	    ret = __uc_get_ar (uc, (reg - UNW_IA64_AR), val);
-	}
+        {
+          if (write)
+            ret = __uc_set_ar (uc, (reg - UNW_IA64_AR), *val);
+          else
+            ret = __uc_get_ar (uc, (reg - UNW_IA64_AR), val);
+        }
       break;
 
     case UNW_IA64_BR  ... UNW_IA64_BR + 7:
       if (write)
-	ret = __uc_set_brs (uc, (reg - UNW_IA64_BR), 1, val);
+        ret = __uc_set_brs (uc, (reg - UNW_IA64_BR), 1, val);
       else
-	ret = __uc_get_brs (uc, (reg - UNW_IA64_BR), 1, val);
+        ret = __uc_get_brs (uc, (reg - UNW_IA64_BR), 1, val);
       break;
 
     case UNW_IA64_PR:
       if (write)
-	ret = __uc_set_prs (uc, *val);
+        ret = __uc_set_prs (uc, *val);
       else
-	ret = __uc_get_prs (uc, val);
+        ret = __uc_get_prs (uc, val);
       break;
 
     case UNW_IA64_IP:
       if (write)
-	ret = __uc_set_ip (uc, *val);
+        ret = __uc_set_ip (uc, *val);
       else
-	ret = __uc_get_ip (uc, val);
+        ret = __uc_get_ip (uc, val);
       break;
 
     case UNW_IA64_CFM:
       if (write)
-	ret = __uc_set_cfm (uc, *val);
+        ret = __uc_set_cfm (uc, *val);
       else
-	ret = __uc_get_cfm (uc, val);
+        ret = __uc_get_cfm (uc, val);
       break;
 
     case UNW_IA64_FR  ... UNW_IA64_FR + 127:
@@ -203,7 +203,7 @@ access_reg (unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val, int write,
   if (ret != 0)
     {
       Debug (1, "failed to %s %s (ret = %d)\n",
-	     write ? "write" : "read", unw_regname (reg), ret);
+             write ? "write" : "read", unw_regname (reg), ret);
       return -UNW_EBADREG;
     }
 
@@ -216,7 +216,7 @@ access_reg (unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val, int write,
 
 static int
 access_fpreg (unw_addr_space_t as, unw_regnum_t reg, unw_fpreg_t *val,
-	      int write, void *arg)
+              int write, void *arg)
 {
   ucontext_t *uc = arg;
   fp_regval_t fp_regval;
@@ -226,15 +226,15 @@ access_fpreg (unw_addr_space_t as, unw_regnum_t reg, unw_fpreg_t *val,
     {
     case UNW_IA64_FR  ... UNW_IA64_FR + 127:
       if (write)
-	{
-	  memcpy (&fp_regval, val, sizeof (fp_regval));
-	  ret = __uc_set_frs (uc, (reg - UNW_IA64_FR), 1, &fp_regval);
-	}
+        {
+          memcpy (&fp_regval, val, sizeof (fp_regval));
+          ret = __uc_set_frs (uc, (reg - UNW_IA64_FR), 1, &fp_regval);
+        }
       else
-	{
-	  ret = __uc_get_frs (uc, (reg - UNW_IA64_FR), 1, &fp_regval);
-	  memcpy (val, &fp_regval, sizeof (*val));
-	}
+        {
+          ret = __uc_get_frs (uc, (reg - UNW_IA64_FR), 1, &fp_regval);
+          memcpy (val, &fp_regval, sizeof (*val));
+        }
       break;
 
     default:
@@ -251,7 +251,7 @@ access_fpreg (unw_addr_space_t as, unw_regnum_t reg, unw_fpreg_t *val,
 
 static int
 access_reg (unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val, int write,
-	    void *arg)
+            void *arg)
 {
   unw_word_t *addr, mask;
   ucontext_t *uc = arg;
@@ -260,19 +260,19 @@ access_reg (unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val, int write,
     {
       mask = ((unw_word_t) 1) << (reg - UNW_IA64_NAT);
       if (write)
-	{
-	  if (*val)
-	    uc->uc_mcontext.sc_nat |= mask;
-	  else
-	    uc->uc_mcontext.sc_nat &= ~mask;
-	}
+        {
+          if (*val)
+            uc->uc_mcontext.sc_nat |= mask;
+          else
+            uc->uc_mcontext.sc_nat &= ~mask;
+        }
       else
-	*val = (uc->uc_mcontext.sc_nat & mask) != 0;
+        *val = (uc->uc_mcontext.sc_nat & mask) != 0;
 
       if (write)
-	Debug (12, "%s <- %lx\n", unw_regname (reg), *val);
+        Debug (12, "%s <- %lx\n", unw_regname (reg), *val);
       else
-	Debug (12, "%s -> %lx\n", unw_regname (reg), *val);
+        Debug (12, "%s -> %lx\n", unw_regname (reg), *val);
       return 0;
     }
 
@@ -283,10 +283,10 @@ access_reg (unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val, int write,
   if (write)
     {
       if (ia64_read_only_reg (addr))
-	{
-	  Debug (16, "attempt to write read-only register\n");
-	  return -UNW_EREADONLYREG;
-	}
+        {
+          Debug (16, "attempt to write read-only register\n");
+          return -UNW_EREADONLYREG;
+        }
       *addr = *val;
       Debug (12, "%s <- %lx\n", unw_regname (reg), *val);
     }
@@ -304,7 +304,7 @@ access_reg (unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val, int write,
 
 static int
 access_fpreg (unw_addr_space_t as, unw_regnum_t reg, unw_fpreg_t *val,
-	      int write, void *arg)
+              int write, void *arg)
 {
   ucontext_t *uc = arg;
   unw_fpreg_t *addr;
@@ -319,19 +319,19 @@ access_fpreg (unw_addr_space_t as, unw_regnum_t reg, unw_fpreg_t *val,
   if (write)
     {
       if (ia64_read_only_reg (addr))
-	{
-	  Debug (16, "attempt to write read-only register\n");
-	  return -UNW_EREADONLYREG;
-	}
+        {
+          Debug (16, "attempt to write read-only register\n");
+          return -UNW_EREADONLYREG;
+        }
       *addr = *val;
       Debug (12, "%s <- %016lx.%016lx\n",
-	     unw_regname (reg), val->raw.bits[1], val->raw.bits[0]);
+             unw_regname (reg), val->raw.bits[1], val->raw.bits[0]);
     }
   else
     {
       *val = *(unw_fpreg_t *) addr;
       Debug (12, "%s -> %016lx.%016lx\n",
-	     unw_regname (reg), val->raw.bits[1], val->raw.bits[0]);
+             unw_regname (reg), val->raw.bits[1], val->raw.bits[0]);
     }
   return 0;
 
@@ -345,8 +345,8 @@ access_fpreg (unw_addr_space_t as, unw_regnum_t reg, unw_fpreg_t *val,
 
 static int
 get_static_proc_name (unw_addr_space_t as, unw_word_t ip,
-		      char *buf, size_t buf_len, unw_word_t *offp,
-		      void *arg)
+                      char *buf, size_t buf_len, unw_word_t *offp,
+                      void *arg)
 {
   return _Uelf64_get_proc_name (as, getpid (), ip, buf, buf_len, offp);
 }
@@ -379,7 +379,7 @@ ia64_local_addr_space_init (void)
 
 HIDDEN int
 ia64_uc_access_reg (struct cursor *c, ia64_loc_t loc, unw_word_t *valp,
-		    int write)
+                    int write)
 {
 #ifdef HAVE_SYS_UC_ACCESS_H
   unw_word_t uc_addr = IA64_GET_AUX_ADDR (loc);
@@ -387,7 +387,7 @@ ia64_uc_access_reg (struct cursor *c, ia64_loc_t loc, unw_word_t *valp,
   int ret;
 
   Debug (16, "%s location %s\n",
-	 write ? "writing" : "reading", ia64_strloc (loc));
+         write ? "writing" : "reading", ia64_strloc (loc));
 
   if (c->as == unw_local_addr_space)
     ucp = (ucontext_t *) uc_addr;
@@ -398,7 +398,7 @@ ia64_uc_access_reg (struct cursor *c, ia64_loc_t loc, unw_word_t *valp,
       /* Need to copy-in ucontext_t first.  */
       ucp = alloca (sizeof (ucontext_t));
       if (!ucp)
-	return -UNW_ENOMEM;
+        return -UNW_ENOMEM;
 
       /* For now, there is no non-HP-UX implementation of the
          uc_access(3) interface.  Because of that, we cannot, e.g.,
@@ -410,25 +410,25 @@ ia64_uc_access_reg (struct cursor *c, ia64_loc_t loc, unw_word_t *valp,
 
       dst = (unw_word_t *) ucp;
       for (src = uc_addr; src < uc_addr + sizeof (ucontext_t); src += 8)
-	if ((ret = (*c->as->acc.access_mem) (c->as, src, dst++, 0, c->as_arg))
-	    < 0)
-	  return ret;
+        if ((ret = (*c->as->acc.access_mem) (c->as, src, dst++, 0, c->as_arg))
+            < 0)
+          return ret;
     }
 
   if (IA64_IS_REG_LOC (loc))
     ret = access_reg (unw_local_addr_space, IA64_GET_REG (loc), valp, write,
-		      ucp);
+                      ucp);
   else
     {
       /* Must be an access to the RSE backing store in ucontext_t.  */
       unw_word_t addr = IA64_GET_ADDR (loc);
 
       if (write)
-	ret = __uc_set_rsebs (ucp, (uint64_t *) addr, 1, valp);
+        ret = __uc_set_rsebs (ucp, (uint64_t *) addr, 1, valp);
       else
-	ret = __uc_get_rsebs (ucp, (uint64_t *) addr, 1, valp);
+        ret = __uc_get_rsebs (ucp, (uint64_t *) addr, 1, valp);
       if (ret != 0)
-	ret = -UNW_EBADREG;
+        ret = -UNW_EBADREG;
     }
   if (ret < 0)
     return ret;
@@ -438,9 +438,9 @@ ia64_uc_access_reg (struct cursor *c, ia64_loc_t loc, unw_word_t *valp,
       /* need to copy-out ucontext_t: */
       unw_word_t dst, *src = (unw_word_t *) ucp;
       for (dst = uc_addr; dst < uc_addr + sizeof (ucontext_t); dst += 8)
-	if ((ret = (*c->as->acc.access_mem) (c->as, dst, src++, 1, c->as_arg))
-	    < 0)
-	  return ret;
+        if ((ret = (*c->as->acc.access_mem) (c->as, dst, src++, 1, c->as_arg))
+            < 0)
+          return ret;
     }
   return 0;
 #else /* !HAVE_SYS_UC_ACCESS_H */
@@ -450,7 +450,7 @@ ia64_uc_access_reg (struct cursor *c, ia64_loc_t loc, unw_word_t *valp,
 
 HIDDEN int
 ia64_uc_access_fpreg (struct cursor *c, ia64_loc_t loc, unw_fpreg_t *valp,
-		      int write)
+                      int write)
 {
 #ifdef HAVE_SYS_UC_ACCESS_H
   unw_word_t uc_addr = IA64_GET_AUX_ADDR (loc);
@@ -466,7 +466,7 @@ ia64_uc_access_fpreg (struct cursor *c, ia64_loc_t loc, unw_fpreg_t *valp,
       /* Need to copy-in ucontext_t first.  */
       ucp = alloca (sizeof (ucontext_t));
       if (!ucp)
-	return -UNW_ENOMEM;
+        return -UNW_ENOMEM;
 
       /* For now, there is no non-HP-UX implementation of the
          uc_access(3) interface.  Because of that, we cannot, e.g.,
@@ -478,13 +478,13 @@ ia64_uc_access_fpreg (struct cursor *c, ia64_loc_t loc, unw_fpreg_t *valp,
 
       dst = (unw_word_t *) ucp;
       for (src = uc_addr; src < uc_addr + sizeof (ucontext_t); src += 8)
-	if ((ret = (*c->as->acc.access_mem) (c->as, src, dst++, 0, c->as_arg))
-	    < 0)
-	  return ret;
+        if ((ret = (*c->as->acc.access_mem) (c->as, src, dst++, 0, c->as_arg))
+            < 0)
+          return ret;
     }
 
   if ((ret = access_fpreg (unw_local_addr_space, IA64_GET_REG (loc), valp,
-			   write, ucp)) < 0)
+                           write, ucp)) < 0)
     return ret;
 
   if (write && c->as != unw_local_addr_space)
@@ -492,9 +492,9 @@ ia64_uc_access_fpreg (struct cursor *c, ia64_loc_t loc, unw_fpreg_t *valp,
       /* need to copy-out ucontext_t: */
       unw_word_t dst, *src = (unw_word_t *) ucp;
       for (dst = uc_addr; dst < uc_addr + sizeof (ucontext_t); dst += 8)
-	if ((ret = (*c->as->acc.access_mem) (c->as, dst, src++, 1, c->as_arg))
-	    < 0)
-	  return ret;
+        if ((ret = (*c->as->acc.access_mem) (c->as, dst, src++, 1, c->as_arg))
+            < 0)
+          return ret;
     }
   return 0;
 #else /* !HAVE_SYS_UC_ACCESS_H */
diff --git a/frysk-imports/libunwind/src/ia64/Ginit_local.c b/frysk-imports/libunwind/src/ia64/Ginit_local.c
index 42f8b1f..8c727e1 100644
--- a/frysk-imports/libunwind/src/ia64/Ginit_local.c
+++ b/frysk-imports/libunwind/src/ia64/Ginit_local.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2001-2003, 2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -49,7 +49,7 @@ set_as_arg (struct cursor *c, unw_context_t *uc)
 
 static inline int
 get_initial_stack_pointers (struct cursor *c, unw_context_t *uc,
-			    unw_word_t *sp, unw_word_t *bsp)
+                            unw_word_t *sp, unw_word_t *bsp)
 {
 #if defined(__linux)
   unw_word_t sol, bspstore;
@@ -83,7 +83,7 @@ unw_init_local (unw_cursor_t *cursor, unw_context_t *uc)
   unw_word_t sp, bsp;
   int ret;
 
-  if (tdep_needs_initialization)
+  if (!tdep_init_done)
     tdep_init ();
 
   Debug (1, "(cursor=%p)\n", c);
diff --git a/frysk-imports/libunwind/src/ia64/Ginit_remote.c b/frysk-imports/libunwind/src/ia64/Ginit_remote.c
index ae0b718..e26a4e4 100644
--- a/frysk-imports/libunwind/src/ia64/Ginit_remote.c
+++ b/frysk-imports/libunwind/src/ia64/Ginit_remote.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2001-2002, 2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -36,7 +36,7 @@ unw_init_remote (unw_cursor_t *cursor, unw_addr_space_t as, void *as_arg)
   unw_word_t sp, bsp;
   int ret;
 
-  if (tdep_needs_initialization)
+  if (!tdep_init_done)
     tdep_init ();
 
   Debug (1, "(cursor=%p)\n", c);
diff --git a/frysk-imports/libunwind/src/ia64/Gis_signal_frame.c b/frysk-imports/libunwind/src/ia64/Gis_signal_frame.c
index cc69bd6..0b7e19c 100644
--- a/frysk-imports/libunwind/src/ia64/Gis_signal_frame.c
+++ b/frysk-imports/libunwind/src/ia64/Gis_signal_frame.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2001-2002 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
diff --git a/frysk-imports/libunwind/src/ia64/Gparser.c b/frysk-imports/libunwind/src/ia64/Gparser.c
index 001581d..b1f0f4a 100644
--- a/frysk-imports/libunwind/src/ia64/Gparser.c
+++ b/frysk-imports/libunwind/src/ia64/Gparser.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2001-2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -27,15 +27,15 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 /* forward declaration: */
 static int create_state_record_for (struct cursor *c,
-				    struct ia64_state_record *sr,
-				    unw_word_t ip);
+                                    struct ia64_state_record *sr,
+                                    unw_word_t ip);
 
 typedef unsigned long unw_word;
 
-#define alloc_reg_state()	(mempool_alloc (&unw.reg_state_pool))
-#define free_reg_state(rs)	(mempool_free (&unw.reg_state_pool, rs))
-#define alloc_labeled_state()	(mempool_alloc (&unw.labeled_state_pool))
-#define free_labeled_state(s)	(mempool_free (&unw.labeled_state_pool, s))
+#define alloc_reg_state()       (mempool_alloc (&unw.reg_state_pool))
+#define free_reg_state(rs)      (mempool_free (&unw.reg_state_pool, rs))
+#define alloc_labeled_state()   (mempool_alloc (&unw.labeled_state_pool))
+#define free_labeled_state(s)   (mempool_free (&unw.labeled_state_pool, s))
 
 /* Routines to manipulate the state stack.  */
 
@@ -78,15 +78,15 @@ dup_state_stack (struct ia64_reg_state *rs)
     {
       copy = alloc_reg_state ();
       if (!copy)
-	{
-	  print_error ("unwind.dup_state_stack: out of memory\n");
-	  return NULL;
-	}
+        {
+          print_error ("unwind.dup_state_stack: out of memory\n");
+          return NULL;
+        }
       memcpy (copy, rs, sizeof (*copy));
       if (first)
-	prev->next = copy;
+        prev->next = copy;
       else
-	first = copy;
+        first = copy;
       rs = rs->next;
       prev = copy;
     }
@@ -109,7 +109,7 @@ free_state_stack (struct ia64_reg_state *rs)
 
 /* Unwind decoder routines */
 
-static enum ia64_pregnum __attribute__ ((const))
+static enum ia64_pregnum CONST_ATTR
 decode_abreg (unsigned char abreg, int memory)
 {
   switch (abreg)
@@ -147,13 +147,13 @@ decode_abreg (unsigned char abreg, int memory)
     default:
       break;
     }
-  dprintf ("libunwind: bad abreg=0x%x\n", abreg);
+  Dprintf ("libunwind: bad abreg=0x%x\n", abreg);
   return IA64_REG_LC;
 }
 
 static void
 set_reg (struct ia64_reg_info *reg, enum ia64_where where, int when,
-	 unsigned long val)
+         unsigned long val)
 {
   reg->val = val;
   reg->where = where;
@@ -163,37 +163,37 @@ set_reg (struct ia64_reg_info *reg, enum ia64_where where, int when,
 
 static void
 alloc_spill_area (unsigned long *offp, unsigned long regsize,
-		  struct ia64_reg_info *lo, struct ia64_reg_info *hi)
+                  struct ia64_reg_info *lo, struct ia64_reg_info *hi)
 {
   struct ia64_reg_info *reg;
 
   for (reg = hi; reg >= lo; --reg)
     {
       if (reg->where == IA64_WHERE_SPILL_HOME)
-	{
-	  reg->where = IA64_WHERE_PSPREL;
-	  *offp -= regsize;
-	  reg->val = *offp;
-	}
+        {
+          reg->where = IA64_WHERE_PSPREL;
+          *offp -= regsize;
+          reg->val = *offp;
+        }
     }
 }
 
 static inline void
 spill_next_when (struct ia64_reg_info **regp, struct ia64_reg_info *lim,
-		 unw_word t)
+                 unw_word t)
 {
   struct ia64_reg_info *reg;
 
   for (reg = *regp; reg <= lim; ++reg)
     {
       if (reg->where == IA64_WHERE_SPILL_HOME)
-	{
-	  reg->when = t;
-	  *regp = reg + 1;
-	  return;
-	}
+        {
+          reg->when = t;
+          *regp = reg + 1;
+          return;
+        }
     }
-  dprintf ("libunwind: excess spill!\n");
+  Dprintf ("libunwind: excess spill!\n");
 }
 
 static inline void
@@ -209,10 +209,10 @@ finish_prologue (struct ia64_state_record *sr)
     {
       reg = sr->curr.reg + unw.save_order[i];
       if (reg->where == IA64_WHERE_GR_SAVE)
-	{
-	  reg->where = IA64_WHERE_GR;
-	  reg->val = sr->gr_save_loc++;
-	}
+        {
+          reg->where = IA64_WHERE_GR;
+          reg->val = sr->gr_save_loc++;
+        }
     }
 
   /* Next, compute when the fp, general, and branch registers get
@@ -225,8 +225,8 @@ finish_prologue (struct ia64_state_record *sr)
       unsigned long t;
       static const unsigned char limit[3] =
         {
-	  IA64_REG_F31, IA64_REG_R7, IA64_REG_B5
-	};
+          IA64_REG_F31, IA64_REG_R7, IA64_REG_B5
+        };
       struct ia64_reg_info *(regs[3]);
 
       regs[0] = sr->curr.reg + IA64_REG_F2;
@@ -234,14 +234,14 @@ finish_prologue (struct ia64_state_record *sr)
       regs[2] = sr->curr.reg + IA64_REG_B1;
 
       for (t = 0; (int) t < sr->region_len; ++t)
-	{
-	  if ((t & 3) == 0)
-	    mask = *cp++;
-	  kind = (mask >> 2 * (3 - (t & 3))) & 3;
-	  if (kind > 0)
-	    spill_next_when (&regs[kind - 1], sr->curr.reg + limit[kind - 1],
-			     sr->region_start + t);
-	}
+        {
+          if ((t & 3) == 0)
+            mask = *cp++;
+          kind = (mask >> 2 * (3 - (t & 3))) & 3;
+          if (kind > 0)
+            spill_next_when (&regs[kind - 1], sr->curr.reg + limit[kind - 1],
+                             sr->region_start + t);
+        }
     }
 
   /* Next, lay out the memory stack spill area.  */
@@ -250,11 +250,11 @@ finish_prologue (struct ia64_state_record *sr)
     {
       off = sr->spill_offset;
       alloc_spill_area (&off, 16, sr->curr.reg + IA64_REG_F2,
-			sr->curr.reg + IA64_REG_F31);
+                        sr->curr.reg + IA64_REG_F31);
       alloc_spill_area (&off, 8, sr->curr.reg + IA64_REG_B1,
-			sr->curr.reg + IA64_REG_B5);
+                        sr->curr.reg + IA64_REG_B5);
       alloc_spill_area (&off, 8, sr->curr.reg + IA64_REG_R4,
-			sr->curr.reg + IA64_REG_R7);
+                        sr->curr.reg + IA64_REG_R7);
     }
 }
 
@@ -262,7 +262,7 @@ finish_prologue (struct ia64_state_record *sr)
 
 static void
 desc_prologue (int body, unw_word rlen, unsigned char mask,
-	       unsigned char grsave, struct ia64_state_record *sr)
+               unsigned char grsave, struct ia64_state_record *sr)
 {
   int i, region_start;
 
@@ -293,17 +293,17 @@ desc_prologue (int body, unw_word rlen, unsigned char mask,
       push (sr);
 
       if (mask)
-	for (i = 0; i < 4; ++i)
-	  {
-	    if (mask & 0x8)
-	      set_reg (sr->curr.reg + unw.save_order[i], IA64_WHERE_GR,
-		       sr->region_start + sr->region_len - 1, grsave++);
-	    mask <<= 1;
-	  }
+        for (i = 0; i < 4; ++i)
+          {
+            if (mask & 0x8)
+              set_reg (sr->curr.reg + unw.save_order[i], IA64_WHERE_GR,
+                       sr->region_start + sr->region_len - 1, grsave++);
+            mask <<= 1;
+          }
       sr->gr_save_loc = grsave;
       sr->any_spills = 0;
       sr->imask = 0;
-      sr->spill_offset = 0x10;	/* default to psp+16 */
+      sr->spill_offset = 0x10;  /* default to psp+16 */
     }
 }
 
@@ -311,22 +311,22 @@ desc_prologue (int body, unw_word rlen, unsigned char mask,
 
 static inline void
 desc_abi (unsigned char abi, unsigned char context,
-	  struct ia64_state_record *sr)
+          struct ia64_state_record *sr)
 {
   sr->abi_marker = (abi << 8) | context;
 }
 
 static inline void
 desc_br_gr (unsigned char brmask, unsigned char gr,
-	    struct ia64_state_record *sr)
+            struct ia64_state_record *sr)
 {
   int i;
 
   for (i = 0; i < 5; ++i)
     {
       if (brmask & 1)
-	set_reg (sr->curr.reg + IA64_REG_B1 + i, IA64_WHERE_GR,
-		 sr->region_start + sr->region_len - 1, gr++);
+        set_reg (sr->curr.reg + IA64_REG_B1 + i, IA64_WHERE_GR,
+                 sr->region_start + sr->region_len - 1, gr++);
       brmask >>= 1;
     }
 }
@@ -339,40 +339,40 @@ desc_br_mem (unsigned char brmask, struct ia64_state_record *sr)
   for (i = 0; i < 5; ++i)
     {
       if (brmask & 1)
-	{
-	  set_reg (sr->curr.reg + IA64_REG_B1 + i, IA64_WHERE_SPILL_HOME,
-		   sr->region_start + sr->region_len - 1, 0);
-	  sr->any_spills = 1;
-	}
+        {
+          set_reg (sr->curr.reg + IA64_REG_B1 + i, IA64_WHERE_SPILL_HOME,
+                   sr->region_start + sr->region_len - 1, 0);
+          sr->any_spills = 1;
+        }
       brmask >>= 1;
     }
 }
 
 static inline void
 desc_frgr_mem (unsigned char grmask, unw_word frmask,
-	       struct ia64_state_record *sr)
+               struct ia64_state_record *sr)
 {
   int i;
 
   for (i = 0; i < 4; ++i)
     {
       if ((grmask & 1) != 0)
-	{
-	  set_reg (sr->curr.reg + IA64_REG_R4 + i, IA64_WHERE_SPILL_HOME,
-		   sr->region_start + sr->region_len - 1, 0);
-	  sr->any_spills = 1;
-	}
+        {
+          set_reg (sr->curr.reg + IA64_REG_R4 + i, IA64_WHERE_SPILL_HOME,
+                   sr->region_start + sr->region_len - 1, 0);
+          sr->any_spills = 1;
+        }
       grmask >>= 1;
     }
   for (i = 0; i < 20; ++i)
     {
       if ((frmask & 1) != 0)
-	{
-	  int base = (i < 4) ? IA64_REG_F2 : IA64_REG_F16 - 4;
-	  set_reg (sr->curr.reg + base + i, IA64_WHERE_SPILL_HOME,
-		   sr->region_start + sr->region_len - 1, 0);
-	  sr->any_spills = 1;
-	}
+        {
+          int base = (i < 4) ? IA64_REG_F2 : IA64_REG_F16 - 4;
+          set_reg (sr->curr.reg + base + i, IA64_WHERE_SPILL_HOME,
+                   sr->region_start + sr->region_len - 1, 0);
+          sr->any_spills = 1;
+        }
       frmask >>= 1;
     }
 }
@@ -385,26 +385,26 @@ desc_fr_mem (unsigned char frmask, struct ia64_state_record *sr)
   for (i = 0; i < 4; ++i)
     {
       if ((frmask & 1) != 0)
-	{
-	  set_reg (sr->curr.reg + IA64_REG_F2 + i, IA64_WHERE_SPILL_HOME,
-		   sr->region_start + sr->region_len - 1, 0);
-	  sr->any_spills = 1;
-	}
+        {
+          set_reg (sr->curr.reg + IA64_REG_F2 + i, IA64_WHERE_SPILL_HOME,
+                   sr->region_start + sr->region_len - 1, 0);
+          sr->any_spills = 1;
+        }
       frmask >>= 1;
     }
 }
 
 static inline void
 desc_gr_gr (unsigned char grmask, unsigned char gr,
-	    struct ia64_state_record *sr)
+            struct ia64_state_record *sr)
 {
   int i;
 
   for (i = 0; i < 4; ++i)
     {
       if ((grmask & 1) != 0)
-	set_reg (sr->curr.reg + IA64_REG_R4 + i, IA64_WHERE_GR,
-		 sr->region_start + sr->region_len - 1, gr++);
+        set_reg (sr->curr.reg + IA64_REG_R4 + i, IA64_WHERE_GR,
+                 sr->region_start + sr->region_len - 1, gr++);
       grmask >>= 1;
     }
 }
@@ -417,11 +417,11 @@ desc_gr_mem (unsigned char grmask, struct ia64_state_record *sr)
   for (i = 0; i < 4; ++i)
     {
       if ((grmask & 1) != 0)
-	{
-	  set_reg (sr->curr.reg + IA64_REG_R4 + i, IA64_WHERE_SPILL_HOME,
-		   sr->region_start + sr->region_len - 1, 0);
-	  sr->any_spills = 1;
-	}
+        {
+          set_reg (sr->curr.reg + IA64_REG_R4 + i, IA64_WHERE_SPILL_HOME,
+                   sr->region_start + sr->region_len - 1, 0);
+          sr->any_spills = 1;
+        }
       grmask >>= 1;
     }
 }
@@ -430,7 +430,7 @@ static inline void
 desc_mem_stack_f (unw_word t, unw_word size, struct ia64_state_record *sr)
 {
   set_reg (sr->curr.reg + IA64_REG_PSP, IA64_WHERE_NONE,
-	   sr->region_start + MIN ((int) t, sr->region_len - 1), 16 * size);
+           sr->region_start + MIN ((int) t, sr->region_len - 1), 16 * size);
 }
 
 static inline void
@@ -442,26 +442,26 @@ desc_mem_stack_v (unw_word t, struct ia64_state_record *sr)
 
 static inline void
 desc_reg_gr (unsigned char reg, unsigned char dst,
-	     struct ia64_state_record *sr)
+             struct ia64_state_record *sr)
 {
   set_reg (sr->curr.reg + reg, IA64_WHERE_GR,
-	   sr->region_start + sr->region_len - 1, dst);
+           sr->region_start + sr->region_len - 1, dst);
 }
 
 static inline void
 desc_reg_psprel (unsigned char reg, unw_word pspoff,
-		 struct ia64_state_record *sr)
+                 struct ia64_state_record *sr)
 {
   set_reg (sr->curr.reg + reg, IA64_WHERE_PSPREL,
-	   sr->region_start + sr->region_len - 1, 0x10 - 4 * pspoff);
+           sr->region_start + sr->region_len - 1, 0x10 - 4 * pspoff);
 }
 
 static inline void
 desc_reg_sprel (unsigned char reg, unw_word spoff,
-		struct ia64_state_record *sr)
+                struct ia64_state_record *sr)
 {
   set_reg (sr->curr.reg + reg, IA64_WHERE_SPREL,
-	   sr->region_start + sr->region_len - 1, 4 * spoff);
+           sr->region_start + sr->region_len - 1, 4 * spoff);
 }
 
 static inline void
@@ -510,12 +510,12 @@ desc_copy_state (unw_word label, struct ia64_state_record *sr)
   for (ls = sr->labeled_states; ls; ls = ls->next)
     {
       if (ls->label == label)
-	{
-	  free_state_stack (&sr->curr);
-	  memcpy (&sr->curr, &ls->saved_state, sizeof (sr->curr));
-	  sr->curr.next = dup_state_stack (ls->saved_state.next);
-	  return;
-	}
+        {
+          free_state_stack (&sr->curr);
+          memcpy (&sr->curr, &ls->saved_state, sizeof (sr->curr));
+          sr->curr.next = dup_state_stack (ls->saved_state.next);
+          return;
+        }
     }
   print_error ("libunwind: failed to find labeled state\n");
 }
@@ -550,7 +550,7 @@ desc_is_active (unsigned char qp, unw_word t, struct ia64_state_record *sr)
   if (qp > 0)
     {
       if ((sr->pr_val & ((unw_word_t) 1 << qp)) == 0)
-	return 0;
+        return 0;
       sr->pr_mask |= ((unw_word_t) 1 << qp);
     }
   return 1;
@@ -558,7 +558,7 @@ desc_is_active (unsigned char qp, unw_word t, struct ia64_state_record *sr)
 
 static inline void
 desc_restore_p (unsigned char qp, unw_word t, unsigned char abreg,
-		struct ia64_state_record *sr)
+                struct ia64_state_record *sr)
 {
   struct ia64_reg_info *r;
 
@@ -573,8 +573,8 @@ desc_restore_p (unsigned char qp, unw_word t, unsigned char abreg,
 
 static inline void
 desc_spill_reg_p (unsigned char qp, unw_word t, unsigned char abreg,
-		  unsigned char x, unsigned char ytreg,
-		  struct ia64_state_record *sr)
+                  unsigned char x, unsigned char ytreg,
+                  struct ia64_state_record *sr)
 {
   enum ia64_where where = IA64_WHERE_GR;
   struct ia64_reg_info *r;
@@ -595,7 +595,7 @@ desc_spill_reg_p (unsigned char qp, unw_word t, unsigned char abreg,
 
 static inline void
 desc_spill_psprel_p (unsigned char qp, unw_word t, unsigned char abreg,
-		     unw_word pspoff, struct ia64_state_record *sr)
+                     unw_word pspoff, struct ia64_state_record *sr)
 {
   struct ia64_reg_info *r;
 
@@ -610,7 +610,7 @@ desc_spill_psprel_p (unsigned char qp, unw_word t, unsigned char abreg,
 
 static inline void
 desc_spill_sprel_p (unsigned char qp, unw_word t, unsigned char abreg,
-		    unw_word spoff, struct ia64_state_record *sr)
+                    unw_word spoff, struct ia64_state_record *sr)
 {
   struct ia64_reg_info *r;
 
@@ -623,69 +623,69 @@ desc_spill_sprel_p (unsigned char qp, unw_word t, unsigned char abreg,
   r->val = 4 * spoff;
 }
 
-#define UNW_DEC_BAD_CODE(code)						\
-	print_error ("libunwind: unknown code encountered\n")
+#define UNW_DEC_BAD_CODE(code)                                          \
+        print_error ("libunwind: unknown code encountered\n")
 
 /* Register names.  */
-#define UNW_REG_BSP		IA64_REG_BSP
-#define UNW_REG_BSPSTORE	IA64_REG_BSPSTORE
-#define UNW_REG_FPSR		IA64_REG_FPSR
-#define UNW_REG_LC		IA64_REG_LC
-#define UNW_REG_PFS		IA64_REG_PFS
-#define UNW_REG_PR		IA64_REG_PR
-#define UNW_REG_RNAT		IA64_REG_RNAT
-#define UNW_REG_PSP		IA64_REG_PSP
-#define UNW_REG_RP		IA64_REG_IP
-#define UNW_REG_UNAT		IA64_REG_UNAT
+#define UNW_REG_BSP             IA64_REG_BSP
+#define UNW_REG_BSPSTORE        IA64_REG_BSPSTORE
+#define UNW_REG_FPSR            IA64_REG_FPSR
+#define UNW_REG_LC              IA64_REG_LC
+#define UNW_REG_PFS             IA64_REG_PFS
+#define UNW_REG_PR              IA64_REG_PR
+#define UNW_REG_RNAT            IA64_REG_RNAT
+#define UNW_REG_PSP             IA64_REG_PSP
+#define UNW_REG_RP              IA64_REG_IP
+#define UNW_REG_UNAT            IA64_REG_UNAT
 
 /* Region headers.  */
-#define UNW_DEC_PROLOGUE_GR(fmt,r,m,gr,arg)	desc_prologue(0,r,m,gr,arg)
-#define UNW_DEC_PROLOGUE(fmt,b,r,arg)		desc_prologue(b,r,0,32,arg)
+#define UNW_DEC_PROLOGUE_GR(fmt,r,m,gr,arg)     desc_prologue(0,r,m,gr,arg)
+#define UNW_DEC_PROLOGUE(fmt,b,r,arg)           desc_prologue(b,r,0,32,arg)
 
 /* Prologue descriptors.  */
-#define UNW_DEC_ABI(fmt,a,c,arg)		desc_abi(a,c,arg)
-#define UNW_DEC_BR_GR(fmt,b,g,arg)		desc_br_gr(b,g,arg)
-#define UNW_DEC_BR_MEM(fmt,b,arg)		desc_br_mem(b,arg)
-#define UNW_DEC_FRGR_MEM(fmt,g,f,arg)		desc_frgr_mem(g,f,arg)
-#define UNW_DEC_FR_MEM(fmt,f,arg)		desc_fr_mem(f,arg)
-#define UNW_DEC_GR_GR(fmt,m,g,arg)		desc_gr_gr(m,g,arg)
-#define UNW_DEC_GR_MEM(fmt,m,arg)		desc_gr_mem(m,arg)
-#define UNW_DEC_MEM_STACK_F(fmt,t,s,arg)	desc_mem_stack_f(t,s,arg)
-#define UNW_DEC_MEM_STACK_V(fmt,t,arg)		desc_mem_stack_v(t,arg)
-#define UNW_DEC_REG_GR(fmt,r,d,arg)		desc_reg_gr(r,d,arg)
-#define UNW_DEC_REG_PSPREL(fmt,r,o,arg)		desc_reg_psprel(r,o,arg)
-#define UNW_DEC_REG_SPREL(fmt,r,o,arg)		desc_reg_sprel(r,o,arg)
-#define UNW_DEC_REG_WHEN(fmt,r,t,arg)		desc_reg_when(r,t,arg)
+#define UNW_DEC_ABI(fmt,a,c,arg)                desc_abi(a,c,arg)
+#define UNW_DEC_BR_GR(fmt,b,g,arg)              desc_br_gr(b,g,arg)
+#define UNW_DEC_BR_MEM(fmt,b,arg)               desc_br_mem(b,arg)
+#define UNW_DEC_FRGR_MEM(fmt,g,f,arg)           desc_frgr_mem(g,f,arg)
+#define UNW_DEC_FR_MEM(fmt,f,arg)               desc_fr_mem(f,arg)
+#define UNW_DEC_GR_GR(fmt,m,g,arg)              desc_gr_gr(m,g,arg)
+#define UNW_DEC_GR_MEM(fmt,m,arg)               desc_gr_mem(m,arg)
+#define UNW_DEC_MEM_STACK_F(fmt,t,s,arg)        desc_mem_stack_f(t,s,arg)
+#define UNW_DEC_MEM_STACK_V(fmt,t,arg)          desc_mem_stack_v(t,arg)
+#define UNW_DEC_REG_GR(fmt,r,d,arg)             desc_reg_gr(r,d,arg)
+#define UNW_DEC_REG_PSPREL(fmt,r,o,arg)         desc_reg_psprel(r,o,arg)
+#define UNW_DEC_REG_SPREL(fmt,r,o,arg)          desc_reg_sprel(r,o,arg)
+#define UNW_DEC_REG_WHEN(fmt,r,t,arg)           desc_reg_when(r,t,arg)
 #define UNW_DEC_PRIUNAT_WHEN_GR(fmt,t,arg) \
-	desc_reg_when(IA64_REG_PRI_UNAT_GR,t,arg)
+        desc_reg_when(IA64_REG_PRI_UNAT_GR,t,arg)
 #define UNW_DEC_PRIUNAT_WHEN_MEM(fmt,t,arg) \
-	desc_reg_when(IA64_REG_PRI_UNAT_MEM,t,arg)
+        desc_reg_when(IA64_REG_PRI_UNAT_MEM,t,arg)
 #define UNW_DEC_PRIUNAT_GR(fmt,r,arg) \
-	desc_reg_gr(IA64_REG_PRI_UNAT_GR,r,arg)
+        desc_reg_gr(IA64_REG_PRI_UNAT_GR,r,arg)
 #define UNW_DEC_PRIUNAT_PSPREL(fmt,o,arg) \
-	desc_reg_psprel(IA64_REG_PRI_UNAT_MEM,o,arg)
+        desc_reg_psprel(IA64_REG_PRI_UNAT_MEM,o,arg)
 #define UNW_DEC_PRIUNAT_SPREL(fmt,o,arg) \
-	desc_reg_sprel(IA64_REG_PRI_UNAT_MEM,o,arg)
-#define UNW_DEC_RP_BR(fmt,d,arg)		desc_rp_br(d,arg)
-#define UNW_DEC_SPILL_BASE(fmt,o,arg)		desc_spill_base(o,arg)
-#define UNW_DEC_SPILL_MASK(fmt,m,arg)		(m = desc_spill_mask(m,arg))
+        desc_reg_sprel(IA64_REG_PRI_UNAT_MEM,o,arg)
+#define UNW_DEC_RP_BR(fmt,d,arg)                desc_rp_br(d,arg)
+#define UNW_DEC_SPILL_BASE(fmt,o,arg)           desc_spill_base(o,arg)
+#define UNW_DEC_SPILL_MASK(fmt,m,arg)           (m = desc_spill_mask(m,arg))
 
 /* Body descriptors.  */
-#define UNW_DEC_EPILOGUE(fmt,t,c,arg)		desc_epilogue(t,c,arg)
-#define UNW_DEC_COPY_STATE(fmt,l,arg)		desc_copy_state(l,arg)
-#define UNW_DEC_LABEL_STATE(fmt,l,arg)		desc_label_state(l,arg)
+#define UNW_DEC_EPILOGUE(fmt,t,c,arg)           desc_epilogue(t,c,arg)
+#define UNW_DEC_COPY_STATE(fmt,l,arg)           desc_copy_state(l,arg)
+#define UNW_DEC_LABEL_STATE(fmt,l,arg)          desc_label_state(l,arg)
 
 /* General unwind descriptors.  */
-#define UNW_DEC_SPILL_REG_P(f,p,t,a,x,y,arg)	desc_spill_reg_p(p,t,a,x,y,arg)
-#define UNW_DEC_SPILL_REG(f,t,a,x,y,arg)	desc_spill_reg_p(0,t,a,x,y,arg)
+#define UNW_DEC_SPILL_REG_P(f,p,t,a,x,y,arg)    desc_spill_reg_p(p,t,a,x,y,arg)
+#define UNW_DEC_SPILL_REG(f,t,a,x,y,arg)        desc_spill_reg_p(0,t,a,x,y,arg)
 #define UNW_DEC_SPILL_PSPREL_P(f,p,t,a,o,arg) \
-	desc_spill_psprel_p(p,t,a,o,arg)
+        desc_spill_psprel_p(p,t,a,o,arg)
 #define UNW_DEC_SPILL_PSPREL(f,t,a,o,arg) \
-	desc_spill_psprel_p(0,t,a,o,arg)
-#define UNW_DEC_SPILL_SPREL_P(f,p,t,a,o,arg)	desc_spill_sprel_p(p,t,a,o,arg)
-#define UNW_DEC_SPILL_SPREL(f,t,a,o,arg)	desc_spill_sprel_p(0,t,a,o,arg)
-#define UNW_DEC_RESTORE_P(f,p,t,a,arg)		desc_restore_p(p,t,a,arg)
-#define UNW_DEC_RESTORE(f,t,a,arg)		desc_restore_p(0,t,a,arg)
+        desc_spill_psprel_p(0,t,a,o,arg)
+#define UNW_DEC_SPILL_SPREL_P(f,p,t,a,o,arg)    desc_spill_sprel_p(p,t,a,o,arg)
+#define UNW_DEC_SPILL_SPREL(f,t,a,o,arg)        desc_spill_sprel_p(0,t,a,o,arg)
+#define UNW_DEC_RESTORE_P(f,p,t,a,arg)          desc_restore_p(p,t,a,arg)
+#define UNW_DEC_RESTORE(f,t,a,arg)              desc_restore_p(0,t,a,arg)
 
 #include "unwind_decoder.h"
 
@@ -700,22 +700,22 @@ lookup_preg (int regnum, int memory, struct ia64_state_record *sr)
 
   switch (regnum)
     {
-    case UNW_IA64_AR_BSP:		preg = IA64_REG_BSP; break;
-    case UNW_IA64_AR_BSPSTORE:		preg = IA64_REG_BSPSTORE; break;
-    case UNW_IA64_AR_FPSR:		preg = IA64_REG_FPSR; break;
-    case UNW_IA64_AR_LC:		preg = IA64_REG_LC; break;
-    case UNW_IA64_AR_PFS:		preg = IA64_REG_PFS; break;
-    case UNW_IA64_AR_RNAT:		preg = IA64_REG_RNAT; break;
-    case UNW_IA64_AR_UNAT:		preg = IA64_REG_UNAT; break;
-    case UNW_IA64_BR + 0:		preg = IA64_REG_IP; break;
-    case UNW_IA64_PR:			preg = IA64_REG_PR; break;
-    case UNW_IA64_SP:			preg = IA64_REG_PSP; break;
+    case UNW_IA64_AR_BSP:               preg = IA64_REG_BSP; break;
+    case UNW_IA64_AR_BSPSTORE:          preg = IA64_REG_BSPSTORE; break;
+    case UNW_IA64_AR_FPSR:              preg = IA64_REG_FPSR; break;
+    case UNW_IA64_AR_LC:                preg = IA64_REG_LC; break;
+    case UNW_IA64_AR_PFS:               preg = IA64_REG_PFS; break;
+    case UNW_IA64_AR_RNAT:              preg = IA64_REG_RNAT; break;
+    case UNW_IA64_AR_UNAT:              preg = IA64_REG_UNAT; break;
+    case UNW_IA64_BR + 0:               preg = IA64_REG_IP; break;
+    case UNW_IA64_PR:                   preg = IA64_REG_PR; break;
+    case UNW_IA64_SP:                   preg = IA64_REG_PSP; break;
 
     case UNW_IA64_NAT:
       if (memory)
-	preg = IA64_REG_PRI_UNAT_MEM;
+        preg = IA64_REG_PRI_UNAT_MEM;
       else
-	preg = IA64_REG_PRI_UNAT_GR;
+        preg = IA64_REG_PRI_UNAT_GR;
       break;
 
     case UNW_IA64_GR + 4 ... UNW_IA64_GR + 7:
@@ -735,7 +735,7 @@ lookup_preg (int regnum, int memory, struct ia64_state_record *sr)
       break;
 
     default:
-      dprintf ("%s: invalid register number %d\n", __FUNCTION__, regnum);
+      Dprintf ("%s: invalid register number %d\n", __FUNCTION__, regnum);
       return NULL;
     }
   return sr->curr.reg + preg;
@@ -802,119 +802,119 @@ parse_dynamic (struct cursor *c, struct ia64_state_record *sr)
     {
       len = r->insn_count;
       if (len < 0)
-	{
-	  if (r->next)
-	    {
-	      Debug (1, "negative region length allowed in last region only!");
-	      return -UNW_EINVAL;
-	    }
-	  len = -len;
-	  /* hack old region info to set the start where we need it: */
-	  sr->region_start = (di->end_ip - di->start_ip) / 0x10 * 3 - len;
-	  sr->region_len = 0;
-	}
+        {
+          if (r->next)
+            {
+              Debug (1, "negative region length allowed in last region only!");
+              return -UNW_EINVAL;
+            }
+          len = -len;
+          /* hack old region info to set the start where we need it: */
+          sr->region_start = (di->end_ip - di->start_ip) / 0x10 * 3 - len;
+          sr->region_len = 0;
+        }
       /* all regions are treated as prologue regions: */
       desc_prologue (0, len, 0, 0, sr);
 
       if (sr->done)
-	return 0;
+        return 0;
 
       for (op = r->op; op < r->op + r->op_count; ++op)
-	{
-	  when = op->when;
-	  val = op->val;
-	  qp = op->qp;
-
-	  if (!desc_is_active (qp, when, sr))
-	    continue;
-
-	  when = sr->region_start + MIN ((int) when, sr->region_len - 1);
-
-	  switch (op->tag)
-	    {
-	    case UNW_DYN_SAVE_REG:
-	      memory = 0;
-	      if ((unsigned) (val - UNW_IA64_GR) < 128)
-		where = IA64_WHERE_GR;
-	      else if ((unsigned) (val - UNW_IA64_FR) < 128)
-		where = IA64_WHERE_FR;
-	      else if ((unsigned) (val - UNW_IA64_BR) < 8)
-		where = IA64_WHERE_BR;
-	      else
-		{
-		  dprintf ("%s: can't save to register number %d\n",
-			   __FUNCTION__, (int) op->reg);
-		  return -UNW_EBADREG;
-		}
-	      /* fall through */
-	    update_reg_info:
-	      ri = lookup_preg (op->reg, memory, sr);
-	      if (!ri)
-		return -UNW_EBADREG;
-	      ri->where = where;
-	      ri->when = when;
-	      ri->val = val;
-	      break;
-
-	    case UNW_DYN_SPILL_FP_REL:
-	      memory = 1;
-	      where = IA64_WHERE_PSPREL;
-	      val = 0x10 - val;
-	      goto update_reg_info;
-
-	    case UNW_DYN_SPILL_SP_REL:
-	      memory = 1;
-	      where = IA64_WHERE_SPREL;
-	      goto update_reg_info;
-
-	    case UNW_DYN_ADD:
-	      if (op->reg == UNW_IA64_SP)
-		{
-		  if (val & 0xf)
-		    {
-		      dprintf ("%s: frame-size %ld not an integer "
-			       "multiple of 16\n",
-			       __FUNCTION__, (long) op->val);
-		      return -UNW_EINVAL;
-		    }
-		  desc_mem_stack_f (when, -((int64_t) val / 16), sr);
-		}
-	      else
-		{
-		  dprintf ("%s: can only ADD to stack-pointer\n",
-			   __FUNCTION__);
-		  return -UNW_EBADREG;
-		}
-	      break;
-
-	    case UNW_DYN_POP_FRAMES:
-	      sr->when_sp_restored = when;
-	      sr->epilogue_count = op->val;
-	      break;
-
-	    case UNW_DYN_LABEL_STATE:
-	      desc_label_state (op->val, sr);
-	      break;
-
-	    case UNW_DYN_COPY_STATE:
-	      desc_copy_state (op->val, sr);
-	      break;
-
-	    case UNW_DYN_ALIAS:
-	      if ((ret = desc_alias (op, c, sr)) < 0)
-		return ret;
-
-	    case UNW_DYN_STOP:
-	      goto end_of_ops;
-	    }
-	}
+        {
+          when = op->when;
+          val = op->val;
+          qp = op->qp;
+
+          if (!desc_is_active (qp, when, sr))
+            continue;
+
+          when = sr->region_start + MIN ((int) when, sr->region_len - 1);
+
+          switch (op->tag)
+            {
+            case UNW_DYN_SAVE_REG:
+              memory = 0;
+              if ((unsigned) (val - UNW_IA64_GR) < 128)
+                where = IA64_WHERE_GR;
+              else if ((unsigned) (val - UNW_IA64_FR) < 128)
+                where = IA64_WHERE_FR;
+              else if ((unsigned) (val - UNW_IA64_BR) < 8)
+                where = IA64_WHERE_BR;
+              else
+                {
+                  Dprintf ("%s: can't save to register number %d\n",
+                           __FUNCTION__, (int) op->reg);
+                  return -UNW_EBADREG;
+                }
+              /* fall through */
+            update_reg_info:
+              ri = lookup_preg (op->reg, memory, sr);
+              if (!ri)
+                return -UNW_EBADREG;
+              ri->where = where;
+              ri->when = when;
+              ri->val = val;
+              break;
+
+            case UNW_DYN_SPILL_FP_REL:
+              memory = 1;
+              where = IA64_WHERE_PSPREL;
+              val = 0x10 - val;
+              goto update_reg_info;
+
+            case UNW_DYN_SPILL_SP_REL:
+              memory = 1;
+              where = IA64_WHERE_SPREL;
+              goto update_reg_info;
+
+            case UNW_DYN_ADD:
+              if (op->reg == UNW_IA64_SP)
+                {
+                  if (val & 0xf)
+                    {
+                      Dprintf ("%s: frame-size %ld not an integer "
+                               "multiple of 16\n",
+                               __FUNCTION__, (long) op->val);
+                      return -UNW_EINVAL;
+                    }
+                  desc_mem_stack_f (when, -((int64_t) val / 16), sr);
+                }
+              else
+                {
+                  Dprintf ("%s: can only ADD to stack-pointer\n",
+                           __FUNCTION__);
+                  return -UNW_EBADREG;
+                }
+              break;
+
+            case UNW_DYN_POP_FRAMES:
+              sr->when_sp_restored = when;
+              sr->epilogue_count = op->val;
+              break;
+
+            case UNW_DYN_LABEL_STATE:
+              desc_label_state (op->val, sr);
+              break;
+
+            case UNW_DYN_COPY_STATE:
+              desc_copy_state (op->val, sr);
+              break;
+
+            case UNW_DYN_ALIAS:
+              if ((ret = desc_alias (op, c, sr)) < 0)
+                return ret;
+
+            case UNW_DYN_STOP:
+              goto end_of_ops;
+            }
+        }
     end_of_ops:
       ;
     }
   return 0;
 }
 #else
-# define parse_dynamic(c,sr)	(-UNW_EINVAL)
+# define parse_dynamic(c,sr)    (-UNW_EINVAL)
 #endif /* _U_dyn_op */
 
 
@@ -928,7 +928,7 @@ ia64_fetch_proc_info (struct cursor *c, unw_word_t ip, int need_unwind_info)
 
   /* check dynamic info first --- it overrides everything else */
   ret = unwi_find_dynamic_proc_info (c->as, ip, &c->pi, need_unwind_info,
-				     c->as_arg);
+                                     c->as_arg);
   if (ret == -UNW_ENOINFO)
     {
       dynamic = 0;
@@ -954,7 +954,7 @@ put_unwind_info (struct cursor *c, unw_proc_info_t *pi)
 
 static int
 create_state_record_for (struct cursor *c, struct ia64_state_record *sr,
-			 unw_word_t ip)
+                         unw_word_t ip)
 {
   unw_word_t predicates = c->pr;
   struct ia64_reg_info *r;
@@ -975,7 +975,7 @@ create_state_record_for (struct cursor *c, struct ia64_state_record *sr,
       /* No info, return default unwinder (leaf proc, no mem stack, no
          saved regs), rp in b0, pfs in ar.pfs.  */
       Debug (1, "no unwind info for ip=0x%lx (gp=%lx)\n",
-	     (long) ip, (long) c->pi.gp);
+             (long) ip, (long) c->pi.gp);
       sr->curr.reg[IA64_REG_IP].where = IA64_WHERE_BR;
       sr->curr.reg[IA64_REG_IP].when = -1;
       sr->curr.reg[IA64_REG_IP].val = 0;
@@ -983,7 +983,7 @@ create_state_record_for (struct cursor *c, struct ia64_state_record *sr,
     }
 
   sr->when_target = (3 * ((ip & ~(unw_word_t) 0xf) - c->pi.start_ip) / 16
-		     + (ip & 0xf));
+                     + (ip & 0xf));
 
   switch (c->pi.format)
     {
@@ -992,7 +992,7 @@ create_state_record_for (struct cursor *c, struct ia64_state_record *sr,
       dp = c->pi.unwind_info;
       desc_end = dp + c->pi.unwind_info_size;
       while (!sr->done && dp < desc_end)
-	dp = unw_decode (dp, sr->in_body, sr);
+        dp = unw_decode (dp, sr->in_body, sr);
       ret = 0;
       break;
 
@@ -1012,18 +1012,18 @@ create_state_record_for (struct cursor *c, struct ia64_state_record *sr,
   if (sr->when_target > sr->when_sp_restored)
     {
       /* sp has been restored and all values on the memory stack below
-	 psp also have been restored.  */
+         psp also have been restored.  */
       sr->curr.reg[IA64_REG_PSP].val = 0;
       sr->curr.reg[IA64_REG_PSP].where = IA64_WHERE_NONE;
       sr->curr.reg[IA64_REG_PSP].when = IA64_WHEN_NEVER;
       for (r = sr->curr.reg; r < sr->curr.reg + IA64_NUM_PREGS; ++r)
-	if ((r->where == IA64_WHERE_PSPREL && r->val <= 0x10)
-	    || r->where == IA64_WHERE_SPREL)
-	  {
-	    r->val = 0;
-	    r->where = IA64_WHERE_NONE;
-	    r->when = IA64_WHEN_NEVER;
-	  }
+        if ((r->where == IA64_WHERE_PSPREL && r->val <= 0x10)
+            || r->where == IA64_WHERE_SPREL)
+          {
+            r->val = 0;
+            r->where = IA64_WHERE_NONE;
+            r->when = IA64_WHEN_NEVER;
+          }
     }
 
   /* If RP did't get saved, generate entry for the return link
@@ -1040,49 +1040,49 @@ create_state_record_for (struct cursor *c, struct ia64_state_record *sr,
       && sr->when_target > sr->curr.reg[IA64_REG_RNAT].when)
     {
       Debug (8, "func 0x%lx may switch the register-backing-store\n",
-	     c->pi.start_ip);
+             c->pi.start_ip);
       c->pi.flags |= UNW_PI_FLAG_IA64_RBS_SWITCH;
     }
  out:
 #if UNW_DEBUG
   if (unwi_debug_level > 2)
     {
-      dprintf ("%s: state record for func 0x%lx, t=%u (flags=0x%lx):\n",
-	       __FUNCTION__,
-	       (long) c->pi.start_ip, sr->when_target, (long) c->pi.flags);
+      Dprintf ("%s: state record for func 0x%lx, t=%u (flags=0x%lx):\n",
+               __FUNCTION__,
+               (long) c->pi.start_ip, sr->when_target, (long) c->pi.flags);
       for (r = sr->curr.reg; r < sr->curr.reg + IA64_NUM_PREGS; ++r)
-	{
-	  if (r->where != IA64_WHERE_NONE || r->when != IA64_WHEN_NEVER)
-	    {
-	      dprintf ("  %s <- ", unw.preg_name[r - sr->curr.reg]);
-	      switch (r->where)
-		{
-		case IA64_WHERE_GR:
-		  dprintf ("r%lu", (long) r->val);
-		  break;
-		case IA64_WHERE_FR:
-		  dprintf ("f%lu", (long) r->val);
-		  break;
-		case IA64_WHERE_BR:
-		  dprintf ("b%lu", (long) r->val);
-		  break;
-		case IA64_WHERE_SPREL:
-		  dprintf ("[sp+0x%lx]", (long) r->val);
-		  break;
-		case IA64_WHERE_PSPREL:
-		  dprintf ("[psp+0x%lx]", (long) r->val);
-		  break;
-		case IA64_WHERE_NONE:
-		  dprintf ("%s+0x%lx",
-			   unw.preg_name[r - sr->curr.reg], (long) r->val);
-		  break;
-		default:
-		  dprintf ("BADWHERE(%d)", r->where);
-		  break;
-		}
-	      dprintf ("\t\t%d\n", r->when);
-	    }
-	}
+        {
+          if (r->where != IA64_WHERE_NONE || r->when != IA64_WHEN_NEVER)
+            {
+              Dprintf ("  %s <- ", unw.preg_name[r - sr->curr.reg]);
+              switch (r->where)
+                {
+                case IA64_WHERE_GR:
+                  Dprintf ("r%lu", (long) r->val);
+                  break;
+                case IA64_WHERE_FR:
+                  Dprintf ("f%lu", (long) r->val);
+                  break;
+                case IA64_WHERE_BR:
+                  Dprintf ("b%lu", (long) r->val);
+                  break;
+                case IA64_WHERE_SPREL:
+                  Dprintf ("[sp+0x%lx]", (long) r->val);
+                  break;
+                case IA64_WHERE_PSPREL:
+                  Dprintf ("[psp+0x%lx]", (long) r->val);
+                  break;
+                case IA64_WHERE_NONE:
+                  Dprintf ("%s+0x%lx",
+                           unw.preg_name[r - sr->curr.reg], (long) r->val);
+                  break;
+                default:
+                  Dprintf ("BADWHERE(%d)", r->where);
+                  break;
+                }
+              Dprintf ("\t\t%d\n", r->when);
+            }
+        }
     }
 #endif
   return 0;
@@ -1123,9 +1123,9 @@ ia64_make_proc_info (struct cursor *c)
     {
       /* Lookup it up the slow way... */
       if ((ret = ia64_fetch_proc_info (c, c->ip, 0)) < 0)
-	return ret;
+        return ret;
       if (caching)
-	ia64_cache_proc_info (c);
+        ia64_cache_proc_info (c);
     }
   return 0;
 }
diff --git a/frysk-imports/libunwind/src/ia64/Grbs.c b/frysk-imports/libunwind/src/ia64/Grbs.c
index 4230cf3..e7c01fe 100644
--- a/frysk-imports/libunwind/src/ia64/Grbs.c
+++ b/frysk-imports/libunwind/src/ia64/Grbs.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003-2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -62,7 +62,7 @@ ia64_strloc (ia64_loc_t loc)
     sprintf (buf + strlen (buf), "%s", unw_regname (IA64_GET_REG (loc)));
   else
     sprintf (buf + strlen (buf), "0x%llx",
-	     (unsigned long long) IA64_GET_ADDR (loc));
+             (unsigned long long) IA64_GET_ADDR (loc));
 
   if (IA64_IS_FP_LOC (loc))
     strcat (buf, ")");
@@ -78,8 +78,8 @@ ia64_strloc (ia64_loc_t loc)
 
 HIDDEN int
 rbs_switch (struct cursor *c,
-	    unw_word_t saved_bsp, unw_word_t saved_bspstore,
-	    ia64_loc_t saved_rnat_loc)
+            unw_word_t saved_bsp, unw_word_t saved_bspstore,
+            ia64_loc_t saved_rnat_loc)
 {
   struct rbs_area *rbs = &c->rbs_area[c->rbs_curr];
   unw_word_t lo, ndirty, rbs_base;
@@ -98,13 +98,13 @@ rbs_switch (struct cursor *c,
   if (rbs->size)
     {
       Debug (10, "inner=[0x%lx-0x%lx)\n",
-	     (long) (rbs->end - rbs->size), (long) rbs->end);
+             (long) (rbs->end - rbs->size), (long) rbs->end);
 
       c->rbs_curr = (c->rbs_curr + 1) % ARRAY_SIZE (c->rbs_area);
       rbs = c->rbs_area + c->rbs_curr;
 
       if (c->rbs_curr == c->rbs_left_edge)
-	c->rbs_left_edge = (c->rbs_left_edge + 1) % ARRAY_SIZE (c->rbs_area);
+        c->rbs_left_edge = (c->rbs_left_edge + 1) % ARRAY_SIZE (c->rbs_area);
     }
 
   if ((ret = rbs_get_base (c, saved_bspstore, &rbs_base)) < 0)
@@ -117,13 +117,13 @@ rbs_switch (struct cursor *c,
   c->bsp = saved_bsp;
 
   Debug (10, "outer=[0x%llx-0x%llx), rnat@%s\n", (long long) rbs_base,
-	 (long long) rbs->end, ia64_strloc (rbs->rnat_loc));
+         (long long) rbs->end, ia64_strloc (rbs->rnat_loc));
   return 0;
 }
 
 HIDDEN int
 rbs_find_stacked (struct cursor *c, unw_word_t regs_to_skip,
-		  ia64_loc_t *locp, ia64_loc_t *rnat_locp)
+                  ia64_loc_t *locp, ia64_loc_t *rnat_locp)
 {
   unw_word_t nregs, bsp = c->bsp, curr = c->rbs_curr, n;
   unw_word_t left_edge = c->rbs_left_edge;
@@ -134,10 +134,10 @@ rbs_find_stacked (struct cursor *c, unw_word_t regs_to_skip,
   while (!rbs_contains (&c->rbs_area[curr], bsp))
     {
       if (curr == left_edge)
-	{
-	  Debug (1, "could not find register r%d!\n", reg);
-	  return -UNW_EBADREG;
-	}
+        {
+          Debug (1, "could not find register r%d!\n", reg);
+          return -UNW_EBADREG;
+        }
 
       n = rse_num_regs (c->rbs_area[curr].end, bsp);
       curr = (curr + ARRAY_SIZE (c->rbs_area) - 1) % ARRAY_SIZE (c->rbs_area);
@@ -149,23 +149,23 @@ rbs_find_stacked (struct cursor *c, unw_word_t regs_to_skip,
       nregs = rse_num_regs (bsp, c->rbs_area[curr].end);
 
       if (regs_to_skip < nregs)
-	{
-	  /* found it: */
-	  unw_word_t addr;
-
-	  addr = rse_skip_regs (bsp, regs_to_skip);
-	  if (locp)
-	    *locp = rbs_loc (c->rbs_area + curr, addr);
-	  if (rnat_locp)
-	    *rnat_locp = rbs_get_rnat_loc (c->rbs_area + curr, addr);
-	  return 0;
-	}
+        {
+          /* found it: */
+          unw_word_t addr;
+
+          addr = rse_skip_regs (bsp, regs_to_skip);
+          if (locp)
+            *locp = rbs_loc (c->rbs_area + curr, addr);
+          if (rnat_locp)
+            *rnat_locp = rbs_get_rnat_loc (c->rbs_area + curr, addr);
+          return 0;
+        }
 
       if (curr == left_edge)
-	{
-	  Debug (1, "could not find register r%d!\n", reg);
-	  return -UNW_EBADREG;
-	}
+        {
+          Debug (1, "could not find register r%d!\n", reg);
+          return -UNW_EBADREG;
+        }
 
       regs_to_skip -= nregs;
 
@@ -178,7 +178,7 @@ rbs_find_stacked (struct cursor *c, unw_word_t regs_to_skip,
 
 static inline int
 get_rnat (struct cursor *c, struct rbs_area *rbs, unw_word_t bsp,
-	  unw_word_t *__restrict rnatp)
+          unw_word_t *__restrict rnatp)
 {
   ia64_loc_t rnat_locp = rbs_get_rnat_loc (rbs, bsp);
 
@@ -197,8 +197,8 @@ get_rnat (struct cursor *c, struct rbs_area *rbs, unw_word_t bsp,
    Note: This does not modify the rbs_area[] structure in any way.  */
 HIDDEN int
 rbs_cover_and_flush (struct cursor *c, unw_word_t nregs,
-		     unw_word_t *dirty_partition, unw_word_t *dirty_rnat,
-		     unw_word_t *bspstore)
+                     unw_word_t *dirty_partition, unw_word_t *dirty_rnat,
+                     unw_word_t *bspstore)
 {
   unw_word_t n, src_mask, dst_mask, bsp, *dst, src_rnat, dst_rnat = 0;
   unw_word_t curr = c->rbs_curr, left_edge = c->rbs_left_edge;
@@ -213,23 +213,23 @@ rbs_cover_and_flush (struct cursor *c, unw_word_t nregs,
       /* at least _some_ registers are on rbs... */
       n = rse_num_regs (bsp, rbs->end);
       if (likely (n >= nregs))
-	{
-	  /* common case #1: all registers are on current rbs... */
-	  /* got lucky: _all_ registers are on rbs... */
-	  ia64_loc_t rnat_loc = rbs_get_rnat_loc (rbs, c->bsp);
-
-	  *bspstore = c->bsp;
-
-	  if (IA64_IS_REG_LOC (rnat_loc))
-	    {
-	      unw_word_t rnat_addr = (unw_word_t)
-		tdep_uc_addr (c->as_arg, UNW_IA64_AR_RNAT, NULL);
-	      rnat_loc = IA64_LOC_ADDR (rnat_addr, 0);
-	    }
-	  c->loc[IA64_REG_RNAT] = rnat_loc;
-	  return 0;	/* all done */
-	}
-      nregs -= n;	/* account for registers already on the rbs */
+        {
+          /* common case #1: all registers are on current rbs... */
+          /* got lucky: _all_ registers are on rbs... */
+          ia64_loc_t rnat_loc = rbs_get_rnat_loc (rbs, c->bsp);
+
+          *bspstore = c->bsp;
+
+          if (IA64_IS_REG_LOC (rnat_loc))
+            {
+              unw_word_t rnat_addr = (unw_word_t)
+                tdep_uc_addr (c->as_arg, UNW_IA64_AR_RNAT, NULL);
+              rnat_loc = IA64_LOC_ADDR (rnat_addr, 0);
+            }
+          c->loc[IA64_REG_RNAT] = rnat_loc;
+          return 0;     /* all done */
+        }
+      nregs -= n;       /* account for registers already on the rbs */
 
       assert (rse_skip_regs (c->bsp, -nregs) == rse_skip_regs (rbs->end, 0));
     }
@@ -249,54 +249,54 @@ rbs_cover_and_flush (struct cursor *c, unw_word_t nregs,
   while (nregs > 0)
     {
       if (unlikely (!rbs_contains (rbs, bsp)))
-	{
-	  /* switch to next non-empty rbs-area: */
-	  do
-	    {
-	      if (curr == left_edge)
-		{
-		  Debug (0, "rbs-underflow while flushing %lu regs, "
-			 "bsp=0x%lx, dst=0x%p\n", (unsigned long) nregs,
-			 (unsigned long) bsp, dst);
-		  return -UNW_EBADREG;
-		}
-
-	      assert (rse_num_regs (rbs->end, bsp) == 0);
-
-	      curr = (curr + ARRAY_SIZE (c->rbs_area) - 1)
-		      % ARRAY_SIZE (c->rbs_area);
-	      rbs = c->rbs_area + curr;
-	      bsp = rbs->end - rbs->size;
-	    }
-	  while (rbs->size == 0);
-
-	  if ((ret = get_rnat (c, rbs, bsp, &src_rnat)) < 0)
-	    return ret;
-	}
+        {
+          /* switch to next non-empty rbs-area: */
+          do
+            {
+              if (curr == left_edge)
+                {
+                  Debug (0, "rbs-underflow while flushing %lu regs, "
+                         "bsp=0x%lx, dst=0x%p\n", (unsigned long) nregs,
+                         (unsigned long) bsp, dst);
+                  return -UNW_EBADREG;
+                }
+
+              assert (rse_num_regs (rbs->end, bsp) == 0);
+
+              curr = (curr + ARRAY_SIZE (c->rbs_area) - 1)
+                      % ARRAY_SIZE (c->rbs_area);
+              rbs = c->rbs_area + curr;
+              bsp = rbs->end - rbs->size;
+            }
+          while (rbs->size == 0);
+
+          if ((ret = get_rnat (c, rbs, bsp, &src_rnat)) < 0)
+            return ret;
+        }
 
       if (unlikely (rse_is_rnat_slot (bsp)))
-	{
-	  bsp += 8;
-	  if ((ret = get_rnat (c, rbs, bsp, &src_rnat)) < 0)
-	    return ret;
-	}
+        {
+          bsp += 8;
+          if ((ret = get_rnat (c, rbs, bsp, &src_rnat)) < 0)
+            return ret;
+        }
       if (unlikely (rse_is_rnat_slot ((unw_word_t) dst)))
-	{
-	  *dst++ = dst_rnat;
-	  dst_rnat = 0;
-	}
+        {
+          *dst++ = dst_rnat;
+          dst_rnat = 0;
+        }
 
       src_mask = ((unw_word_t) 1) << rse_slot_num (bsp);
       dst_mask = ((unw_word_t) 1) << rse_slot_num ((unw_word_t) dst);
 
       if (src_rnat & src_mask)
-	dst_rnat |= dst_mask;
+        dst_rnat |= dst_mask;
       else
-	dst_rnat &= ~dst_mask;
+        dst_rnat &= ~dst_mask;
 
       /* copy one slot: */
       if ((ret = ia64_get (c, rbs_loc (rbs, bsp), dst)) < 0)
-	return ret;
+        return ret;
 
       /* advance to next slot: */
       --nregs;
@@ -306,9 +306,9 @@ rbs_cover_and_flush (struct cursor *c, unw_word_t nregs,
   if (unlikely (rse_is_rnat_slot ((unw_word_t) dst)))
     {
       /* The LOADRS instruction loads "the N bytes below the current
-	 BSP" but BSP can never point to an RNaT slot so if the last
-	 destination word happens to be an RNaT slot, we need to write
-	 that slot now. */
+         BSP" but BSP can never point to an RNaT slot so if the last
+         destination word happens to be an RNaT slot, we need to write
+         that slot now. */
       *dst++ = dst_rnat;
       dst_rnat = 0;
     }
diff --git a/frysk-imports/libunwind/src/ia64/Gregs.c b/frysk-imports/libunwind/src/ia64/Gregs.c
index f3e4075..ac6f738 100644
--- a/frysk-imports/libunwind/src/ia64/Gregs.c
+++ b/frysk-imports/libunwind/src/ia64/Gregs.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2001-2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -38,60 +38,60 @@ linux_scratch_loc (struct cursor *c, unw_regnum_t reg, uint8_t *nat_bitnr)
       || ia64_get_abi_marker (c) == ABI_MARKER_OLD_LINUX_SIGTRAMP)
     {
       switch (reg)
-	{
-	case UNW_IA64_NAT + 2 ... UNW_IA64_NAT + 3:
-	case UNW_IA64_NAT + 8 ... UNW_IA64_NAT + 31:
-	  /* Linux sigcontext contains the NaT bit of scratch register
-	     N in bit position N of the sc_nat member. */
-	  *nat_bitnr = (reg - UNW_IA64_NAT);
-	  addr += LINUX_SC_NAT_OFF;
-	  break;
-
-	case UNW_IA64_GR +  2 ... UNW_IA64_GR + 3:
-	case UNW_IA64_GR +  8 ... UNW_IA64_GR + 31:
-	  addr += LINUX_SC_GR_OFF + 8 * (reg - UNW_IA64_GR);
-	  break;
-
-	case UNW_IA64_FR + 6 ... UNW_IA64_FR + 15:
-	  addr += LINUX_SC_FR_OFF + 16 * (reg - UNW_IA64_FR);
-	  return IA64_LOC_ADDR (addr, IA64_LOC_TYPE_FP);
-
-	case UNW_IA64_FR + 32 ... UNW_IA64_FR + 127:
-	  if (ia64_get (c, IA64_LOC_ADDR (addr + LINUX_SC_FLAGS_OFF, 0),
-			&flags) < 0)
-	    return IA64_NULL_LOC;
-
-	  if (!(flags & IA64_SC_FLAG_FPH_VALID))
-	    {
-	      /* initialize fph partition: */
-	      tmp_addr = addr + LINUX_SC_FR_OFF + 32*16;
-	      for (i = 32; i < 128; ++i, tmp_addr += 16)
-		if (ia64_putfp (c, IA64_LOC_ADDR (tmp_addr, 0),
-				unw.read_only.f0) < 0)
-		  return IA64_NULL_LOC;
-	      /* mark fph partition as valid: */
-	      if (ia64_put (c, IA64_LOC_ADDR (addr + LINUX_SC_FLAGS_OFF, 0),
-			    flags | IA64_SC_FLAG_FPH_VALID) < 0)
-		return IA64_NULL_LOC;
-	    }
-
-	  addr += LINUX_SC_FR_OFF + 16 * (reg - UNW_IA64_FR);
-	  return IA64_LOC_ADDR (addr, IA64_LOC_TYPE_FP);
-
-	case UNW_IA64_BR + 0: addr += LINUX_SC_BR_OFF + 0; break;
-	case UNW_IA64_BR + 6: addr += LINUX_SC_BR_OFF + 6*8; break;
-	case UNW_IA64_BR + 7: addr += LINUX_SC_BR_OFF + 7*8; break;
-	case UNW_IA64_AR_RSC: addr += LINUX_SC_AR_RSC_OFF; break;
-	case UNW_IA64_AR_CSD: addr += LINUX_SC_AR_CSD_OFF; break;
-	case UNW_IA64_AR_SSD: addr += LINUX_SC_AR_SSD_OFF; break;
-	case UNW_IA64_AR_CCV: addr += LINUX_SC_AR_CCV; break;
-
-	default:
-	  if (unw_is_fpreg (reg))
-	    return IA64_FPREG_LOC (c, reg);
-	  else
-	    return IA64_REG_LOC (c, reg);
-	}
+        {
+        case UNW_IA64_NAT + 2 ... UNW_IA64_NAT + 3:
+        case UNW_IA64_NAT + 8 ... UNW_IA64_NAT + 31:
+          /* Linux sigcontext contains the NaT bit of scratch register
+             N in bit position N of the sc_nat member. */
+          *nat_bitnr = (reg - UNW_IA64_NAT);
+          addr += LINUX_SC_NAT_OFF;
+          break;
+
+        case UNW_IA64_GR +  2 ... UNW_IA64_GR + 3:
+        case UNW_IA64_GR +  8 ... UNW_IA64_GR + 31:
+          addr += LINUX_SC_GR_OFF + 8 * (reg - UNW_IA64_GR);
+          break;
+
+        case UNW_IA64_FR + 6 ... UNW_IA64_FR + 15:
+          addr += LINUX_SC_FR_OFF + 16 * (reg - UNW_IA64_FR);
+          return IA64_LOC_ADDR (addr, IA64_LOC_TYPE_FP);
+
+        case UNW_IA64_FR + 32 ... UNW_IA64_FR + 127:
+          if (ia64_get (c, IA64_LOC_ADDR (addr + LINUX_SC_FLAGS_OFF, 0),
+                        &flags) < 0)
+            return IA64_NULL_LOC;
+
+          if (!(flags & IA64_SC_FLAG_FPH_VALID))
+            {
+              /* initialize fph partition: */
+              tmp_addr = addr + LINUX_SC_FR_OFF + 32*16;
+              for (i = 32; i < 128; ++i, tmp_addr += 16)
+                if (ia64_putfp (c, IA64_LOC_ADDR (tmp_addr, 0),
+                                unw.read_only.f0) < 0)
+                  return IA64_NULL_LOC;
+              /* mark fph partition as valid: */
+              if (ia64_put (c, IA64_LOC_ADDR (addr + LINUX_SC_FLAGS_OFF, 0),
+                            flags | IA64_SC_FLAG_FPH_VALID) < 0)
+                return IA64_NULL_LOC;
+            }
+
+          addr += LINUX_SC_FR_OFF + 16 * (reg - UNW_IA64_FR);
+          return IA64_LOC_ADDR (addr, IA64_LOC_TYPE_FP);
+
+        case UNW_IA64_BR + 0: addr += LINUX_SC_BR_OFF + 0; break;
+        case UNW_IA64_BR + 6: addr += LINUX_SC_BR_OFF + 6*8; break;
+        case UNW_IA64_BR + 7: addr += LINUX_SC_BR_OFF + 7*8; break;
+        case UNW_IA64_AR_RSC: addr += LINUX_SC_AR_RSC_OFF; break;
+        case UNW_IA64_AR_CSD: addr += LINUX_SC_AR_CSD_OFF; break;
+        case UNW_IA64_AR_SSD: addr += LINUX_SC_AR_SSD_OFF; break;
+        case UNW_IA64_AR_CCV: addr += LINUX_SC_AR_CCV; break;
+
+        default:
+          if (unw_is_fpreg (reg))
+            return IA64_FPREG_LOC (c, reg);
+          else
+            return IA64_REG_LOC (c, reg);
+        }
       return IA64_LOC_ADDR (addr, 0);
     }
   else
@@ -99,120 +99,120 @@ linux_scratch_loc (struct cursor *c, unw_regnum_t reg, uint8_t *nat_bitnr)
       int is_nat = 0;
 
       if ((unsigned) (reg - UNW_IA64_NAT) < 128)
-	{
-	  is_nat = 1;
-	  reg -= (UNW_IA64_NAT - UNW_IA64_GR);
-	}
+        {
+          is_nat = 1;
+          reg -= (UNW_IA64_NAT - UNW_IA64_GR);
+        }
       if (ia64_get_abi_marker (c) == ABI_MARKER_LINUX_INTERRUPT)
-	{
-	  switch (reg)
-	    {
-	    case UNW_IA64_BR + 6 ... UNW_IA64_BR + 7:
-	      addr += LINUX_PT_B6_OFF + 8 * (reg - (UNW_IA64_BR + 6));
-	      break;
-
-	    case UNW_IA64_AR_CSD: addr += LINUX_PT_CSD_OFF; break;
-	    case UNW_IA64_AR_SSD: addr += LINUX_PT_SSD_OFF; break;
-
-	    case UNW_IA64_GR +  8 ... UNW_IA64_GR + 11:
-	      addr += LINUX_PT_R8_OFF + 8 * (reg - (UNW_IA64_GR + 8));
-	      break;
-
-	    case UNW_IA64_IP: addr += LINUX_PT_IIP_OFF; break;
-	    case UNW_IA64_CFM: addr += LINUX_PT_IFS_OFF; break;
-	    case UNW_IA64_AR_UNAT: addr += LINUX_PT_UNAT_OFF; break;
-	    case UNW_IA64_AR_PFS: addr += LINUX_PT_PFS_OFF; break;
-	    case UNW_IA64_AR_RSC: addr += LINUX_PT_RSC_OFF; break;
-	    case UNW_IA64_AR_RNAT: addr += LINUX_PT_RNAT_OFF; break;
-	    case UNW_IA64_AR_BSPSTORE: addr += LINUX_PT_BSPSTORE_OFF; break;
-	    case UNW_IA64_PR: addr += LINUX_PT_PR_OFF; break;
-	    case UNW_IA64_BR + 0: addr += LINUX_PT_B0_OFF; break;
-
-	    case UNW_IA64_GR + 1:
-	      /* The saved r1 value is valid only in the frame in which
-		 it was saved; for everything else we need to look up
-		 the appropriate gp value.  */
-	      if (c->sigcontext_addr != c->sp + 0x10)
-		return IA64_NULL_LOC;
-	      addr += LINUX_PT_R1_OFF;
-	      break;
-
-	    case UNW_IA64_GR + 12: addr += LINUX_PT_R12_OFF; break;
-	    case UNW_IA64_GR + 13: addr += LINUX_PT_R13_OFF; break;
-	    case UNW_IA64_AR_FPSR: addr += LINUX_PT_FPSR_OFF; break;
-	    case UNW_IA64_GR + 15: addr += LINUX_PT_R15_OFF; break;
-	    case UNW_IA64_GR + 14: addr += LINUX_PT_R14_OFF; break;
-	    case UNW_IA64_GR + 2: addr += LINUX_PT_R2_OFF; break;
-	    case UNW_IA64_GR + 3: addr += LINUX_PT_R3_OFF; break;
-
-	    case UNW_IA64_GR + 16 ... UNW_IA64_GR + 31:
-	      addr += LINUX_PT_R16_OFF + 8 * (reg - (UNW_IA64_GR + 16));
-	      break;
-
-	    case UNW_IA64_AR_CCV: addr += LINUX_PT_CCV_OFF; break;
-
-	    case UNW_IA64_FR + 6 ... UNW_IA64_FR + 11:
-	      addr += LINUX_PT_F6_OFF + 16 * (reg - (UNW_IA64_FR + 6));
-	      return IA64_LOC_ADDR (addr, IA64_LOC_TYPE_FP);
-
-	    default:
-	      if (unw_is_fpreg (reg))
-		return IA64_FPREG_LOC (c, reg);
-	      else
-		return IA64_REG_LOC (c, reg);
-	    }
-	}
+        {
+          switch (reg)
+            {
+            case UNW_IA64_BR + 6 ... UNW_IA64_BR + 7:
+              addr += LINUX_PT_B6_OFF + 8 * (reg - (UNW_IA64_BR + 6));
+              break;
+
+            case UNW_IA64_AR_CSD: addr += LINUX_PT_CSD_OFF; break;
+            case UNW_IA64_AR_SSD: addr += LINUX_PT_SSD_OFF; break;
+
+            case UNW_IA64_GR +  8 ... UNW_IA64_GR + 11:
+              addr += LINUX_PT_R8_OFF + 8 * (reg - (UNW_IA64_GR + 8));
+              break;
+
+            case UNW_IA64_IP: addr += LINUX_PT_IIP_OFF; break;
+            case UNW_IA64_CFM: addr += LINUX_PT_IFS_OFF; break;
+            case UNW_IA64_AR_UNAT: addr += LINUX_PT_UNAT_OFF; break;
+            case UNW_IA64_AR_PFS: addr += LINUX_PT_PFS_OFF; break;
+            case UNW_IA64_AR_RSC: addr += LINUX_PT_RSC_OFF; break;
+            case UNW_IA64_AR_RNAT: addr += LINUX_PT_RNAT_OFF; break;
+            case UNW_IA64_AR_BSPSTORE: addr += LINUX_PT_BSPSTORE_OFF; break;
+            case UNW_IA64_PR: addr += LINUX_PT_PR_OFF; break;
+            case UNW_IA64_BR + 0: addr += LINUX_PT_B0_OFF; break;
+
+            case UNW_IA64_GR + 1:
+              /* The saved r1 value is valid only in the frame in which
+                 it was saved; for everything else we need to look up
+                 the appropriate gp value.  */
+              if (c->sigcontext_addr != c->sp + 0x10)
+                return IA64_NULL_LOC;
+              addr += LINUX_PT_R1_OFF;
+              break;
+
+            case UNW_IA64_GR + 12: addr += LINUX_PT_R12_OFF; break;
+            case UNW_IA64_GR + 13: addr += LINUX_PT_R13_OFF; break;
+            case UNW_IA64_AR_FPSR: addr += LINUX_PT_FPSR_OFF; break;
+            case UNW_IA64_GR + 15: addr += LINUX_PT_R15_OFF; break;
+            case UNW_IA64_GR + 14: addr += LINUX_PT_R14_OFF; break;
+            case UNW_IA64_GR + 2: addr += LINUX_PT_R2_OFF; break;
+            case UNW_IA64_GR + 3: addr += LINUX_PT_R3_OFF; break;
+
+            case UNW_IA64_GR + 16 ... UNW_IA64_GR + 31:
+              addr += LINUX_PT_R16_OFF + 8 * (reg - (UNW_IA64_GR + 16));
+              break;
+
+            case UNW_IA64_AR_CCV: addr += LINUX_PT_CCV_OFF; break;
+
+            case UNW_IA64_FR + 6 ... UNW_IA64_FR + 11:
+              addr += LINUX_PT_F6_OFF + 16 * (reg - (UNW_IA64_FR + 6));
+              return IA64_LOC_ADDR (addr, IA64_LOC_TYPE_FP);
+
+            default:
+              if (unw_is_fpreg (reg))
+                return IA64_FPREG_LOC (c, reg);
+              else
+                return IA64_REG_LOC (c, reg);
+            }
+        }
       else if (ia64_get_abi_marker (c) == ABI_MARKER_OLD_LINUX_INTERRUPT)
-	{
-	  switch (reg)
-	    {
-	    case UNW_IA64_GR +  1:
-	      /* The saved r1 value is valid only in the frame in which
-		 it was saved; for everything else we need to look up
-		 the appropriate gp value.  */
-	      if (c->sigcontext_addr != c->sp + 0x10)
-		return IA64_NULL_LOC;
-	      addr += LINUX_OLD_PT_R1_OFF;
-	      break;
-
-	    case UNW_IA64_GR +  2 ... UNW_IA64_GR + 3:
-	      addr += LINUX_OLD_PT_R2_OFF + 8 * (reg - (UNW_IA64_GR + 2));
-	      break;
-
-	    case UNW_IA64_GR +  8 ... UNW_IA64_GR + 11:
-	      addr += LINUX_OLD_PT_R8_OFF + 8 * (reg - (UNW_IA64_GR + 8));
-	      break;
-
-	    case UNW_IA64_GR + 16 ... UNW_IA64_GR + 31:
-	      addr += LINUX_OLD_PT_R16_OFF + 8 * (reg - (UNW_IA64_GR + 16));
-	      break;
-
-	    case UNW_IA64_FR + 6 ... UNW_IA64_FR + 9:
-	      addr += LINUX_OLD_PT_F6_OFF + 16 * (reg - (UNW_IA64_FR + 6));
-	      return IA64_LOC_ADDR (addr, IA64_LOC_TYPE_FP);
-
-	    case UNW_IA64_BR + 0: addr += LINUX_OLD_PT_B0_OFF; break;
-	    case UNW_IA64_BR + 6: addr += LINUX_OLD_PT_B6_OFF; break;
-	    case UNW_IA64_BR + 7: addr += LINUX_OLD_PT_B7_OFF; break;
-
-	    case UNW_IA64_AR_RSC: addr += LINUX_OLD_PT_RSC_OFF; break;
-	    case UNW_IA64_AR_CCV: addr += LINUX_OLD_PT_CCV_OFF; break;
-
-	    default:
-	      if (unw_is_fpreg (reg))
-		return IA64_FPREG_LOC (c, reg);
-	      else
-		return IA64_REG_LOC (c, reg);
-	    }
-	}
+        {
+          switch (reg)
+            {
+            case UNW_IA64_GR +  1:
+              /* The saved r1 value is valid only in the frame in which
+                 it was saved; for everything else we need to look up
+                 the appropriate gp value.  */
+              if (c->sigcontext_addr != c->sp + 0x10)
+                return IA64_NULL_LOC;
+              addr += LINUX_OLD_PT_R1_OFF;
+              break;
+
+            case UNW_IA64_GR +  2 ... UNW_IA64_GR + 3:
+              addr += LINUX_OLD_PT_R2_OFF + 8 * (reg - (UNW_IA64_GR + 2));
+              break;
+
+            case UNW_IA64_GR +  8 ... UNW_IA64_GR + 11:
+              addr += LINUX_OLD_PT_R8_OFF + 8 * (reg - (UNW_IA64_GR + 8));
+              break;
+
+            case UNW_IA64_GR + 16 ... UNW_IA64_GR + 31:
+              addr += LINUX_OLD_PT_R16_OFF + 8 * (reg - (UNW_IA64_GR + 16));
+              break;
+
+            case UNW_IA64_FR + 6 ... UNW_IA64_FR + 9:
+              addr += LINUX_OLD_PT_F6_OFF + 16 * (reg - (UNW_IA64_FR + 6));
+              return IA64_LOC_ADDR (addr, IA64_LOC_TYPE_FP);
+
+            case UNW_IA64_BR + 0: addr += LINUX_OLD_PT_B0_OFF; break;
+            case UNW_IA64_BR + 6: addr += LINUX_OLD_PT_B6_OFF; break;
+            case UNW_IA64_BR + 7: addr += LINUX_OLD_PT_B7_OFF; break;
+
+            case UNW_IA64_AR_RSC: addr += LINUX_OLD_PT_RSC_OFF; break;
+            case UNW_IA64_AR_CCV: addr += LINUX_OLD_PT_CCV_OFF; break;
+
+            default:
+              if (unw_is_fpreg (reg))
+                return IA64_FPREG_LOC (c, reg);
+              else
+                return IA64_REG_LOC (c, reg);
+            }
+        }
       if (is_nat)
-	{
-	  /* For Linux pt-regs structure, bit number is determined by
-	     the UNaT slot number (as determined by st8.spill) and the
-	     bits are saved wherever the (primary) UNaT was saved.  */
-	  *nat_bitnr = ia64_unat_slot_num (addr);
-	  return c->loc[IA64_REG_PRI_UNAT_MEM];
-	}
+        {
+          /* For Linux pt-regs structure, bit number is determined by
+             the UNaT slot number (as determined by st8.spill) and the
+             bits are saved wherever the (primary) UNaT was saved.  */
+          *nat_bitnr = ia64_unat_slot_num (addr);
+          return c->loc[IA64_REG_PRI_UNAT_MEM];
+        }
       return IA64_LOC_ADDR (addr, 0);
     }
 #endif
@@ -235,11 +235,11 @@ ia64_scratch_loc (struct cursor *c, unw_regnum_t reg, uint8_t *nat_bitnr)
   if (c->sigcontext_addr)
     {
       if (ia64_get_abi (c) == ABI_LINUX)
-	return linux_scratch_loc (c, reg, nat_bitnr);
+        return linux_scratch_loc (c, reg, nat_bitnr);
       else if (ia64_get_abi (c) ==  ABI_HPUX)
-	return hpux_scratch_loc (c, reg, nat_bitnr);
+        return hpux_scratch_loc (c, reg, nat_bitnr);
       else
-	return IA64_NULL_LOC;
+        return IA64_NULL_LOC;
     }
   else
     return IA64_REG_LOC (c, reg);
@@ -247,7 +247,7 @@ ia64_scratch_loc (struct cursor *c, unw_regnum_t reg, uint8_t *nat_bitnr)
 
 static inline int
 update_nat (struct cursor *c, ia64_loc_t nat_loc, unw_word_t mask,
-	    unw_word_t *valp, int write)
+            unw_word_t *valp, int write)
 {
   unw_word_t nat_word;
   int ret;
@@ -259,9 +259,9 @@ update_nat (struct cursor *c, ia64_loc_t nat_loc, unw_word_t mask,
   if (write)
     {
       if (*valp)
-	nat_word |= mask;
+        nat_word |= mask;
       else
-	nat_word &= ~mask;
+        nat_word &= ~mask;
       ret = ia64_put (c, nat_loc, nat_word);
     }
   else
@@ -271,8 +271,8 @@ update_nat (struct cursor *c, ia64_loc_t nat_loc, unw_word_t mask,
 
 static int
 access_nat (struct cursor *c,
-	    ia64_loc_t nat_loc, ia64_loc_t reg_loc, uint8_t nat_bitnr,
-	    unw_word_t *valp, int write)
+            ia64_loc_t nat_loc, ia64_loc_t reg_loc, uint8_t nat_bitnr,
+            unw_word_t *valp, int write)
 {
   unw_word_t mask = 0;
   unw_fpreg_t tmp;
@@ -281,47 +281,47 @@ access_nat (struct cursor *c,
   if (IA64_IS_FP_LOC (reg_loc))
     {
       /* NaT bit is saved as a NaTVal.  This happens when a general
-	 register is saved to a floating-point register.  */
+         register is saved to a floating-point register.  */
       if (write)
-	{
-	  if (*valp)
-	    {
-	      if (ia64_is_big_endian (c))
-		ret = ia64_putfp (c, reg_loc, unw.nat_val_be);
-	      else
-		ret = ia64_putfp (c, reg_loc, unw.nat_val_le);
-	    }
-	  else
-	    {
-	      unw_word_t *src, *dst;
-	      unw_fpreg_t tmp;
-
-	      ret = ia64_getfp (c, reg_loc, &tmp);
-	      if (ret < 0)
-		return ret;
-
-	      /* Reset the exponent to 0x1003e so that the significand
-		 will be interpreted as an integer value.  */
-	      src = (unw_word_t *) &unw.int_val_be;
-	      dst = (unw_word_t *) &tmp;
-	      if (!ia64_is_big_endian (c))
-		++src, ++dst;
-	      *dst = *src;
-
-	      ret = ia64_putfp (c, reg_loc, tmp);
-	    }
-	}
+        {
+          if (*valp)
+            {
+              if (ia64_is_big_endian (c))
+                ret = ia64_putfp (c, reg_loc, unw.nat_val_be);
+              else
+                ret = ia64_putfp (c, reg_loc, unw.nat_val_le);
+            }
+          else
+            {
+              unw_word_t *src, *dst;
+              unw_fpreg_t tmp;
+
+              ret = ia64_getfp (c, reg_loc, &tmp);
+              if (ret < 0)
+                return ret;
+
+              /* Reset the exponent to 0x1003e so that the significand
+                 will be interpreted as an integer value.  */
+              src = (unw_word_t *) &unw.int_val_be;
+              dst = (unw_word_t *) &tmp;
+              if (!ia64_is_big_endian (c))
+                ++src, ++dst;
+              *dst = *src;
+
+              ret = ia64_putfp (c, reg_loc, tmp);
+            }
+        }
       else
-	{
-	  ret = ia64_getfp (c, reg_loc, &tmp);
-	  if (ret < 0)
-	    return ret;
-
-	  if (ia64_is_big_endian (c))
-	    *valp = (memcmp (&tmp, &unw.nat_val_be, sizeof (tmp)) == 0);
-	  else
-	    *valp = (memcmp (&tmp, &unw.nat_val_le, sizeof (tmp)) == 0);
-	}
+        {
+          ret = ia64_getfp (c, reg_loc, &tmp);
+          if (ret < 0)
+            return ret;
+
+          if (ia64_is_big_endian (c))
+            *valp = (memcmp (&tmp, &unw.nat_val_be, sizeof (tmp)) == 0);
+          else
+            *valp = (memcmp (&tmp, &unw.nat_val_le, sizeof (tmp)) == 0);
+        }
       return ret;
     }
 
@@ -330,25 +330,25 @@ access_nat (struct cursor *c,
       || IA64_IS_UC_LOC (reg_loc))
     {
       if (write)
-	return ia64_put (c, nat_loc, *valp);
+        return ia64_put (c, nat_loc, *valp);
       else
-	return ia64_get (c, nat_loc, valp);
+        return ia64_get (c, nat_loc, valp);
     }
 
   if (IA64_IS_NULL_LOC (nat_loc))
     {
       /* NaT bit is not saved. This happens if a general register is
-	 saved to a branch register.  Since the NaT bit gets lost, we
-	 need to drop it here, too.  Note that if the NaT bit had been
-	 set when the save occurred, it would have caused a NaT
-	 consumption fault.  */
+         saved to a branch register.  Since the NaT bit gets lost, we
+         need to drop it here, too.  Note that if the NaT bit had been
+         set when the save occurred, it would have caused a NaT
+         consumption fault.  */
       if (write)
-	{
-	  if (*valp)
-	    return -UNW_EBADREG;	/* can't set NaT bit */
-	}
+        {
+          if (*valp)
+            return -UNW_EBADREG;        /* can't set NaT bit */
+        }
       else
-	*valp = 0;
+        *valp = 0;
       return 0;
     }
 
@@ -358,7 +358,7 @@ access_nat (struct cursor *c,
 
 HIDDEN int
 tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
-		 int write)
+                 int write)
 {
   ia64_loc_t loc, reg_loc, nat_loc;
   unw_word_t mask, val;
@@ -371,25 +371,25 @@ tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
 
     case UNW_IA64_BSP:
       if (write)
-	c->bsp = *valp;
+        c->bsp = *valp;
       else
-	*valp = c->bsp;
+        *valp = c->bsp;
       return 0;
 
     case UNW_REG_SP:
       if (write)
-	c->sp = *valp;
+        c->sp = *valp;
       else
-	*valp = c->sp;
+        *valp = c->sp;
       return 0;
 
     case UNW_REG_IP:
       if (write)
-	{
-	  c->ip = *valp;	/* also update the IP cache */
-	  if (c->pi_valid && (*valp < c->pi.start_ip || *valp >= c->pi.end_ip))
-	    c->pi_valid = 0;	/* new IP outside of current proc */
-	}
+        {
+          c->ip = *valp;        /* also update the IP cache */
+          if (c->pi_valid && (*valp < c->pi.start_ip || *valp >= c->pi.end_ip))
+            c->pi_valid = 0;    /* new IP outside of current proc */
+        }
       loc = c->loc[IA64_REG_IP];
       break;
 
@@ -405,22 +405,22 @@ tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
       nat_bitnr = c->nat_bitnr[reg - (UNW_IA64_NAT + 4)];
       return access_nat (c, loc, reg_loc, nat_bitnr, valp, write);
 
-    case UNW_IA64_AR_BSP:	loc = c->loc[IA64_REG_BSP]; break;
-    case UNW_IA64_AR_BSPSTORE:	loc = c->loc[IA64_REG_BSPSTORE]; break;
-    case UNW_IA64_AR_PFS:	loc = c->loc[IA64_REG_PFS]; break;
-    case UNW_IA64_AR_RNAT:	loc = c->loc[IA64_REG_RNAT]; break;
-    case UNW_IA64_AR_UNAT:	loc = c->loc[IA64_REG_UNAT]; break;
-    case UNW_IA64_AR_LC:	loc = c->loc[IA64_REG_LC]; break;
-    case UNW_IA64_AR_FPSR:	loc = c->loc[IA64_REG_FPSR]; break;
-    case UNW_IA64_BR + 1:	loc = c->loc[IA64_REG_B1]; break;
-    case UNW_IA64_BR + 2:	loc = c->loc[IA64_REG_B2]; break;
-    case UNW_IA64_BR + 3:	loc = c->loc[IA64_REG_B3]; break;
-    case UNW_IA64_BR + 4:	loc = c->loc[IA64_REG_B4]; break;
-    case UNW_IA64_BR + 5:	loc = c->loc[IA64_REG_B5]; break;
+    case UNW_IA64_AR_BSP:       loc = c->loc[IA64_REG_BSP]; break;
+    case UNW_IA64_AR_BSPSTORE:  loc = c->loc[IA64_REG_BSPSTORE]; break;
+    case UNW_IA64_AR_PFS:       loc = c->loc[IA64_REG_PFS]; break;
+    case UNW_IA64_AR_RNAT:      loc = c->loc[IA64_REG_RNAT]; break;
+    case UNW_IA64_AR_UNAT:      loc = c->loc[IA64_REG_UNAT]; break;
+    case UNW_IA64_AR_LC:        loc = c->loc[IA64_REG_LC]; break;
+    case UNW_IA64_AR_FPSR:      loc = c->loc[IA64_REG_FPSR]; break;
+    case UNW_IA64_BR + 1:       loc = c->loc[IA64_REG_B1]; break;
+    case UNW_IA64_BR + 2:       loc = c->loc[IA64_REG_B2]; break;
+    case UNW_IA64_BR + 3:       loc = c->loc[IA64_REG_B3]; break;
+    case UNW_IA64_BR + 4:       loc = c->loc[IA64_REG_B4]; break;
+    case UNW_IA64_BR + 5:       loc = c->loc[IA64_REG_B5]; break;
 
     case UNW_IA64_CFM:
       if (write)
-	c->cfm = *valp;	/* also update the CFM cache */
+        c->cfm = *valp; /* also update the CFM cache */
       loc = c->cfm_loc;
       break;
 
@@ -430,59 +430,59 @@ tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
        * (i.e., it is done as if CFM.rrb.pr == 0.
        */
       if (write)
-	{
-	  c->pr = *valp;		/* update the predicate cache */
-	  return ia64_put (c, c->loc[IA64_REG_PR], *valp);
-	}
+        {
+          c->pr = *valp;                /* update the predicate cache */
+          return ia64_put (c, c->loc[IA64_REG_PR], *valp);
+        }
       else
-	return ia64_get (c, c->loc[IA64_REG_PR], valp);
+        return ia64_get (c, c->loc[IA64_REG_PR], valp);
 
-    case UNW_IA64_GR + 32 ... UNW_IA64_GR + 127:	/* stacked reg */
+    case UNW_IA64_GR + 32 ... UNW_IA64_GR + 127:        /* stacked reg */
       reg = rotate_gr (c, reg - UNW_IA64_GR);
       if (reg < 0)
-	return -UNW_EBADREG;
+        return -UNW_EBADREG;
       ret = ia64_get_stacked (c, reg, &loc, NULL);
       if (ret < 0)
-	return ret;
+        return ret;
       break;
 
-    case UNW_IA64_NAT + 32 ... UNW_IA64_NAT + 127:	/* stacked reg */
+    case UNW_IA64_NAT + 32 ... UNW_IA64_NAT + 127:      /* stacked reg */
       reg = rotate_gr (c, reg - UNW_IA64_NAT);
       if (reg < 0)
-	return -UNW_EBADREG;
+        return -UNW_EBADREG;
       ret = ia64_get_stacked (c, reg, &loc, &nat_loc);
       if (ret < 0)
-	return ret;
+        return ret;
       assert (!IA64_IS_REG_LOC (loc));
       mask = (unw_word_t) 1 << rse_slot_num (IA64_GET_ADDR (loc));
       return update_nat (c, nat_loc, mask, valp, write);
 
     case UNW_IA64_AR_EC:
       if ((ret = ia64_get (c, c->ec_loc, &val)) < 0)
-	return ret;
+        return ret;
 
       if (write)
-	{
-	  val = ((val & ~((unw_word_t) 0x3f << 52)) | ((*valp & 0x3f) << 52));
-	  return ia64_put (c, c->ec_loc, val);
-	}
+        {
+          val = ((val & ~((unw_word_t) 0x3f << 52)) | ((*valp & 0x3f) << 52));
+          return ia64_put (c, c->ec_loc, val);
+        }
       else
-	{
-	  *valp = (val >> 52) & 0x3f;
-	  return 0;
-	}
+        {
+          *valp = (val >> 52) & 0x3f;
+          return 0;
+        }
 
       /* scratch & special registers: */
 
     case UNW_IA64_GR + 0:
       if (write)
-	return -UNW_EREADONLYREG;
+        return -UNW_EREADONLYREG;
       *valp = 0;
       return 0;
 
     case UNW_IA64_NAT + 0:
       if (write)
-	return -UNW_EREADONLYREG;
+        return -UNW_EREADONLYREG;
       *valp = 0;
       return 0;
 
@@ -491,37 +491,37 @@ tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
     case UNW_IA64_NAT + 8 ... UNW_IA64_NAT + 31:
       loc = ia64_scratch_loc (c, reg, &nat_bitnr);
       if (IA64_IS_NULL_LOC (loc) && reg == UNW_IA64_NAT + 1)
-	{
-	  /* access to GP */
-	  if (write)
-	    return -UNW_EREADONLYREG;
-	  *valp = 0;
-	  return 0;
-	}
+        {
+          /* access to GP */
+          if (write)
+            return -UNW_EREADONLYREG;
+          *valp = 0;
+          return 0;
+        }
       if (!(IA64_IS_REG_LOC (loc) || IA64_IS_UC_LOC (loc)
-	    || IA64_IS_FP_LOC (loc)))
-	/* We're dealing with a NaT bit stored in memory.  */
-	return update_nat(c, loc, (unw_word_t) 1 << nat_bitnr, valp, write);
+            || IA64_IS_FP_LOC (loc)))
+        /* We're dealing with a NaT bit stored in memory.  */
+        return update_nat(c, loc, (unw_word_t) 1 << nat_bitnr, valp, write);
       break;
 
     case UNW_IA64_GR + 15 ... UNW_IA64_GR + 18:
       mask = 1 << (reg - (UNW_IA64_GR + 15));
       if (write)
-	{
-	  c->eh_args[reg - (UNW_IA64_GR + 15)] = *valp;
-	  c->eh_valid_mask |= mask;
-	  return 0;
-	}
+        {
+          c->eh_args[reg - (UNW_IA64_GR + 15)] = *valp;
+          c->eh_valid_mask |= mask;
+          return 0;
+        }
       else if ((c->eh_valid_mask & mask) != 0)
-	{
-	  *valp = c->eh_args[reg - (UNW_IA64_GR + 15)];
-	  return 0;
-	}
+        {
+          *valp = c->eh_args[reg - (UNW_IA64_GR + 15)];
+          return 0;
+        }
       else
-	loc = ia64_scratch_loc (c, reg, NULL);
+        loc = ia64_scratch_loc (c, reg, NULL);
       break;
 
-    case UNW_IA64_GR +  1:				/* global pointer */
+    case UNW_IA64_GR +  1:                              /* global pointer */
     case UNW_IA64_GR +  2 ... UNW_IA64_GR + 3:
     case UNW_IA64_GR +  8 ... UNW_IA64_GR + 14:
     case UNW_IA64_GR + 19 ... UNW_IA64_GR + 31:
@@ -534,17 +534,17 @@ tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
     case UNW_IA64_AR_CCV:
       loc = ia64_scratch_loc (c, reg, NULL);
       if (IA64_IS_NULL_LOC (loc) && reg == UNW_IA64_GR + 1)
-	{
-	  /* access to GP */
-	  if (write)
-	    return -UNW_EREADONLYREG;
-
-	  /* ensure c->pi is up-to-date: */
-	  if ((ret = ia64_make_proc_info (c)) < 0)
-	    return ret;
-	  *valp = c->pi.gp;
-	  return 0;
-	}
+        {
+          /* access to GP */
+          if (write)
+            return -UNW_EREADONLYREG;
+
+          /* ensure c->pi is up-to-date: */
+          if ((ret = ia64_make_proc_info (c)) < 0)
+            return ret;
+          *valp = c->pi.gp;
+          return 0;
+        }
       break;
 
     default:
@@ -560,7 +560,7 @@ tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
 
 HIDDEN int
 tdep_access_fpreg (struct cursor *c, int reg, unw_fpreg_t *valp,
-		   int write)
+                   int write)
 {
   ia64_loc_t loc;
 
@@ -568,18 +568,18 @@ tdep_access_fpreg (struct cursor *c, int reg, unw_fpreg_t *valp,
     {
     case UNW_IA64_FR + 0:
       if (write)
-	return -UNW_EREADONLYREG;
+        return -UNW_EREADONLYREG;
       *valp = unw.read_only.f0;
       return 0;
 
     case UNW_IA64_FR + 1:
       if (write)
-	return -UNW_EREADONLYREG;
+        return -UNW_EREADONLYREG;
 
       if (ia64_is_big_endian (c))
-	*valp = unw.read_only.f1_be;
+        *valp = unw.read_only.f1_be;
       else
-	*valp = unw.read_only.f1_le;
+        *valp = unw.read_only.f1_le;
       return 0;
 
     case UNW_IA64_FR + 2: loc = c->loc[IA64_REG_F2]; break;
diff --git a/frysk-imports/libunwind/src/ia64/Gresume.c b/frysk-imports/libunwind/src/ia64/Gresume.c
index fe23f76..aa395b6 100644
--- a/frysk-imports/libunwind/src/ia64/Gresume.c
+++ b/frysk-imports/libunwind/src/ia64/Gresume.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2001-2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -51,15 +51,15 @@ local_resume (unw_addr_space_t as, unw_cursor_t *cursor, void *arg)
     }
   extra;
   int ret, dirty_size;
-# define GET_NAT(n)						\
-  do								\
-    {								\
-      ret = tdep_access_reg (c, UNW_IA64_NAT + (n), &val, 0);	\
-      if (ret < 0)						\
-	return ret;						\
-      if (val)							\
-	pri_unat |= (unw_word_t) 1 << n;			\
-    }								\
+# define GET_NAT(n)                                             \
+  do                                                            \
+    {                                                           \
+      ret = tdep_access_reg (c, UNW_IA64_NAT + (n), &val, 0);   \
+      if (ret < 0)                                              \
+        return ret;                                             \
+      if (val)                                                  \
+        pri_unat |= (unw_word_t) 1 << n;                        \
+    }                                                           \
   while (0)
 
   /* ensure c->pi is up-to-date: */
@@ -84,43 +84,43 @@ local_resume (unw_addr_space_t as, unw_cursor_t *cursor, void *arg)
   if (unlikely (c->sigcontext_addr))
     {
       struct sigcontext *sc = (struct sigcontext *) c->sigcontext_addr;
-#     define PR_SCRATCH		0xffc0	/* p6-p15 are scratch */
-#     define PR_PRESERVED	(~(PR_SCRATCH | 1))
+#     define PR_SCRATCH         0xffc0  /* p6-p15 are scratch */
+#     define PR_PRESERVED       (~(PR_SCRATCH | 1))
 
       /* We're returning to a frame that was (either directly or
-	 indirectly) interrupted by a signal.  We have to restore
-	 _both_ "preserved" and "scratch" registers.  That doesn't
-	 leave us any registers to work with, and the only way we can
-	 achieve this is by doing a sigreturn().
+         indirectly) interrupted by a signal.  We have to restore
+         _both_ "preserved" and "scratch" registers.  That doesn't
+         leave us any registers to work with, and the only way we can
+         achieve this is by doing a sigreturn().
 
-	 Note: it might be tempting to think that we don't have to
-	 restore the scratch registers when returning to a frame that
-	 was indirectly interrupted by a signal.  However, that is not
-	 safe because that frame and its descendants could have been
-	 using a special convention that stores "preserved" state in
-	 scratch registers.  For example, the Linux fsyscall
-	 convention does this with r11 (to save ar.pfs) and b6 (to
-	 save "rp"). */
+         Note: it might be tempting to think that we don't have to
+         restore the scratch registers when returning to a frame that
+         was indirectly interrupted by a signal.  However, that is not
+         safe because that frame and its descendants could have been
+         using a special convention that stores "preserved" state in
+         scratch registers.  For example, the Linux fsyscall
+         convention does this with r11 (to save ar.pfs) and b6 (to
+         save "rp"). */
 
       sc->sc_gr[12] = c->psp;
       c->psp = c->sigcontext_addr - c->sigcontext_off;
 
       sof = (c->cfm & 0x7f);
       if ((dirty_size = rbs_cover_and_flush (c, sof, dirty_partition,
-					     &dirty_rnat, &bspstore)) < 0)
-	return dirty_size;
+                                             &dirty_rnat, &bspstore)) < 0)
+        return dirty_size;
 
       /* Clear the "in-syscall" flag, because in general we won't be
-	 returning to the interruption-point and we need all registers
-	 restored.  */
+         returning to the interruption-point and we need all registers
+         restored.  */
       sc->sc_flags &= ~IA64_SC_FLAG_IN_SYSCALL;
       sc->sc_ip = c->ip;
       sc->sc_cfm = c->cfm & (((unw_word_t) 1 << 38) - 1);
       sc->sc_pr = (c->pr & ~PR_SCRATCH) | (sc->sc_pr & ~PR_PRESERVED);
       if ((ret = ia64_get (c, c->loc[IA64_REG_PFS], &sc->sc_ar_pfs)) < 0
-	  || (ret = ia64_get (c, c->loc[IA64_REG_FPSR], &sc->sc_ar_fpsr)) < 0
-	  || (ret = ia64_get (c, c->loc[IA64_REG_UNAT], &sc->sc_ar_unat)) < 0)
-	return ret;
+          || (ret = ia64_get (c, c->loc[IA64_REG_FPSR], &sc->sc_ar_fpsr)) < 0
+          || (ret = ia64_get (c, c->loc[IA64_REG_UNAT], &sc->sc_ar_unat)) < 0)
+        return ret;
 
       sc->sc_gr[1] = c->pi.gp;
       if (c->eh_valid_mask & 0x1) sc->sc_gr[15] = c->eh_args[0];
@@ -128,19 +128,19 @@ local_resume (unw_addr_space_t as, unw_cursor_t *cursor, void *arg)
       if (c->eh_valid_mask & 0x4) sc->sc_gr[17] = c->eh_args[2];
       if (c->eh_valid_mask & 0x8) sc->sc_gr[18] = c->eh_args[3];
       Debug (9, "sc: r15=%lx,r16=%lx,r17=%lx,r18=%lx\n",
-	     (long) sc->sc_gr[15], (long) sc->sc_gr[16],
-	     (long) sc->sc_gr[17], (long) sc->sc_gr[18]);
+             (long) sc->sc_gr[15], (long) sc->sc_gr[16],
+             (long) sc->sc_gr[17], (long) sc->sc_gr[18]);
     }
   else
     {
       /* Account for the fact that _Uia64_install_context() will
-	 return via br.ret, which will decrement bsp by size-of-locals.  */
+         return via br.ret, which will decrement bsp by size-of-locals.  */
       if ((ret = ia64_get (c, c->loc[IA64_REG_PFS], &pfs)) < 0)
-	return ret;
+        return ret;
       sol = (pfs >> 7) & 0x7f;
       if ((dirty_size = rbs_cover_and_flush (c, sol, dirty_partition,
-					     &dirty_rnat, &bspstore)) < 0)
-	return dirty_size;
+                                             &dirty_rnat, &bspstore)) < 0)
+        return dirty_size;
 
       extra.r1 = c->pi.gp;
       extra.r15 = c->eh_args[0];
@@ -148,17 +148,17 @@ local_resume (unw_addr_space_t as, unw_cursor_t *cursor, void *arg)
       extra.r17 = c->eh_args[2];
       extra.r18 = c->eh_args[3];
       Debug (9, "extra: r15=%lx,r16=%lx,r17=%lx,r18=%lx\n",
-	     (long) extra.r15, (long) extra.r16,
-	     (long) extra.r17, (long) extra.r18);
+             (long) extra.r15, (long) extra.r16,
+             (long) extra.r17, (long) extra.r18);
     }
   Debug (8, "resuming at ip=%lx\n", (long) c->ip);
   ia64_install_cursor (c, pri_unat, (unw_word_t *) &extra,
-		       bspstore, dirty_size, dirty_partition + dirty_size/8,
-		       dirty_rnat);
+                       bspstore, dirty_size, dirty_partition + dirty_size/8,
+                       dirty_rnat);
 #elif defined(__hpux)
   struct cursor *c = (struct cursor *) cursor;
 
-  setcontext (c->as_arg);	/* should not return */
+  setcontext (c->as_arg);       /* should not return */
 #endif
   return -UNW_EINVAL;
 }
@@ -177,9 +177,9 @@ static inline int
 remote_install_cursor (struct cursor *c)
 {
   int (*access_reg) (unw_addr_space_t, unw_regnum_t, unw_word_t *,
-		     int write, void *);
+                     int write, void *);
   int (*access_fpreg) (unw_addr_space_t, unw_regnum_t, unw_fpreg_t *,
-		       int write, void *);
+                       int write, void *);
   unw_fpreg_t fpval;
   unw_word_t val;
   int reg;
@@ -188,49 +188,49 @@ remote_install_cursor (struct cursor *c)
   if (c->as == unw_local_addr_space)
     {
       /* Take a short-cut: we directly resume out of the cursor and
-	 all we need to do is make sure that all locations point to
-	 memory, not registers.  Furthermore, R4-R7 and NAT4-NAT7 are
-	 taken care of by ia64_local_resume() so they don't need to be
-	 handled here.  */
-#     define MEMIFY(preg, reg)						 \
-      do {								 \
-	if (IA64_IS_REG_LOC (c->loc[(preg)]))				 \
-	  c->loc[(preg)] = IA64_LOC_ADDR ((unw_word_t)			 \
-					  tdep_uc_addr(c->as_arg, (reg), \
-						       NULL), 0);	 \
+         all we need to do is make sure that all locations point to
+         memory, not registers.  Furthermore, R4-R7 and NAT4-NAT7 are
+         taken care of by ia64_local_resume() so they don't need to be
+         handled here.  */
+#     define MEMIFY(preg, reg)                                           \
+      do {                                                               \
+        if (IA64_IS_REG_LOC (c->loc[(preg)]))                            \
+          c->loc[(preg)] = IA64_LOC_ADDR ((unw_word_t)                   \
+                                          tdep_uc_addr(c->as_arg, (reg), \
+                                                       NULL), 0);        \
       } while (0)
-      MEMIFY (IA64_REG_PR,	UNW_IA64_PR);
-      MEMIFY (IA64_REG_PFS,	UNW_IA64_AR_PFS);
-      MEMIFY (IA64_REG_RNAT,	UNW_IA64_AR_RNAT);
-      MEMIFY (IA64_REG_UNAT,	UNW_IA64_AR_UNAT);
-      MEMIFY (IA64_REG_LC,	UNW_IA64_AR_LC);
-      MEMIFY (IA64_REG_FPSR,	UNW_IA64_AR_FPSR);
-      MEMIFY (IA64_REG_IP,	UNW_IA64_BR + 0);
-      MEMIFY (IA64_REG_B1,	UNW_IA64_BR + 1);
-      MEMIFY (IA64_REG_B2,	UNW_IA64_BR + 2);
-      MEMIFY (IA64_REG_B3,	UNW_IA64_BR + 3);
-      MEMIFY (IA64_REG_B4,	UNW_IA64_BR + 4);
-      MEMIFY (IA64_REG_B5,	UNW_IA64_BR + 5);
-      MEMIFY (IA64_REG_F2,	UNW_IA64_FR + 2);
-      MEMIFY (IA64_REG_F3,	UNW_IA64_FR + 3);
-      MEMIFY (IA64_REG_F4,	UNW_IA64_FR + 4);
-      MEMIFY (IA64_REG_F5,	UNW_IA64_FR + 5);
-      MEMIFY (IA64_REG_F16,	UNW_IA64_FR + 16);
-      MEMIFY (IA64_REG_F17,	UNW_IA64_FR + 17);
-      MEMIFY (IA64_REG_F18,	UNW_IA64_FR + 18);
-      MEMIFY (IA64_REG_F19,	UNW_IA64_FR + 19);
-      MEMIFY (IA64_REG_F20,	UNW_IA64_FR + 20);
-      MEMIFY (IA64_REG_F21,	UNW_IA64_FR + 21);
-      MEMIFY (IA64_REG_F22,	UNW_IA64_FR + 22);
-      MEMIFY (IA64_REG_F23,	UNW_IA64_FR + 23);
-      MEMIFY (IA64_REG_F24,	UNW_IA64_FR + 24);
-      MEMIFY (IA64_REG_F25,	UNW_IA64_FR + 25);
-      MEMIFY (IA64_REG_F26,	UNW_IA64_FR + 26);
-      MEMIFY (IA64_REG_F27,	UNW_IA64_FR + 27);
-      MEMIFY (IA64_REG_F28,	UNW_IA64_FR + 28);
-      MEMIFY (IA64_REG_F29,	UNW_IA64_FR + 29);
-      MEMIFY (IA64_REG_F30,	UNW_IA64_FR + 30);
-      MEMIFY (IA64_REG_F31,	UNW_IA64_FR + 31);
+      MEMIFY (IA64_REG_PR,      UNW_IA64_PR);
+      MEMIFY (IA64_REG_PFS,     UNW_IA64_AR_PFS);
+      MEMIFY (IA64_REG_RNAT,    UNW_IA64_AR_RNAT);
+      MEMIFY (IA64_REG_UNAT,    UNW_IA64_AR_UNAT);
+      MEMIFY (IA64_REG_LC,      UNW_IA64_AR_LC);
+      MEMIFY (IA64_REG_FPSR,    UNW_IA64_AR_FPSR);
+      MEMIFY (IA64_REG_IP,      UNW_IA64_BR + 0);
+      MEMIFY (IA64_REG_B1,      UNW_IA64_BR + 1);
+      MEMIFY (IA64_REG_B2,      UNW_IA64_BR + 2);
+      MEMIFY (IA64_REG_B3,      UNW_IA64_BR + 3);
+      MEMIFY (IA64_REG_B4,      UNW_IA64_BR + 4);
+      MEMIFY (IA64_REG_B5,      UNW_IA64_BR + 5);
+      MEMIFY (IA64_REG_F2,      UNW_IA64_FR + 2);
+      MEMIFY (IA64_REG_F3,      UNW_IA64_FR + 3);
+      MEMIFY (IA64_REG_F4,      UNW_IA64_FR + 4);
+      MEMIFY (IA64_REG_F5,      UNW_IA64_FR + 5);
+      MEMIFY (IA64_REG_F16,     UNW_IA64_FR + 16);
+      MEMIFY (IA64_REG_F17,     UNW_IA64_FR + 17);
+      MEMIFY (IA64_REG_F18,     UNW_IA64_FR + 18);
+      MEMIFY (IA64_REG_F19,     UNW_IA64_FR + 19);
+      MEMIFY (IA64_REG_F20,     UNW_IA64_FR + 20);
+      MEMIFY (IA64_REG_F21,     UNW_IA64_FR + 21);
+      MEMIFY (IA64_REG_F22,     UNW_IA64_FR + 22);
+      MEMIFY (IA64_REG_F23,     UNW_IA64_FR + 23);
+      MEMIFY (IA64_REG_F24,     UNW_IA64_FR + 24);
+      MEMIFY (IA64_REG_F25,     UNW_IA64_FR + 25);
+      MEMIFY (IA64_REG_F26,     UNW_IA64_FR + 26);
+      MEMIFY (IA64_REG_F27,     UNW_IA64_FR + 27);
+      MEMIFY (IA64_REG_F28,     UNW_IA64_FR + 28);
+      MEMIFY (IA64_REG_F29,     UNW_IA64_FR + 29);
+      MEMIFY (IA64_REG_F30,     UNW_IA64_FR + 30);
+      MEMIFY (IA64_REG_F31,     UNW_IA64_FR + 31);
     }
   else
 #endif /* __linux && !UNW_REMOTE_ONLY */
@@ -241,18 +241,18 @@ remote_install_cursor (struct cursor *c)
       Debug (8, "copying out cursor state\n");
 
       for (reg = 0; reg <= UNW_REG_LAST; ++reg)
-	{
-	  if (unw_is_fpreg (reg))
-	    {
-	      if (tdep_access_fpreg (c, reg, &fpval, 0) >= 0)
-		(*access_fpreg) (c->as, reg, &fpval, 1, c->as_arg);
-	    }
-	  else
-	    {
-	      if (tdep_access_reg (c, reg, &val, 0) >= 0)
-		(*access_reg) (c->as, reg, &val, 1, c->as_arg);
-	    }
-	}
+        {
+          if (unw_is_fpreg (reg))
+            {
+              if (tdep_access_fpreg (c, reg, &fpval, 0) >= 0)
+                (*access_fpreg) (c->as, reg, &fpval, 1, c->as_arg);
+            }
+          else
+            {
+              if (tdep_access_reg (c, reg, &val, 0) >= 0)
+                (*access_reg) (c->as, reg, &val, 1, c->as_arg);
+            }
+        }
     }
   return (*c->as->acc.resume) (c->as, (unw_cursor_t *) c, c->as_arg);
 }
diff --git a/frysk-imports/libunwind/src/ia64/Gscript.c b/frysk-imports/libunwind/src/ia64/Gscript.c
index bf9ca02..e96e89e 100644
--- a/frysk-imports/libunwind/src/ia64/Gscript.c
+++ b/frysk-imports/libunwind/src/ia64/Gscript.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2001-2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -29,19 +29,19 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 enum ia64_script_insn_opcode
   {
-    IA64_INSN_INC_PSP,		/* psp += val */
-    IA64_INSN_LOAD_PSP,		/* psp = *psp_loc */
-    IA64_INSN_ADD_PSP,		/* s[dst] = (s.psp + val) */
-    IA64_INSN_ADD_PSP_NAT,	/* like above, but with NaT info */
-    IA64_INSN_ADD_SP,		/* s[dst] = (s.sp + val) */
-    IA64_INSN_ADD_SP_NAT,	/* like above, but with NaT info */
-    IA64_INSN_MOVE,		/* s[dst] = s[val] */
-    IA64_INSN_MOVE_NAT,		/* like above, but with NaT info */
-    IA64_INSN_MOVE_NO_NAT,	/* like above, but clear NaT info */
-    IA64_INSN_MOVE_STACKED,	/* s[dst] = rse_skip(*s.bsp_loc, val) */
-    IA64_INSN_MOVE_STACKED_NAT,	/* like above, but with NaT info */
-    IA64_INSN_MOVE_SCRATCH,	/* s[dst] = scratch reg "val" */
-    IA64_INSN_MOVE_SCRATCH_NAT,	/* like above, but with NaT info */
+    IA64_INSN_INC_PSP,          /* psp += val */
+    IA64_INSN_LOAD_PSP,         /* psp = *psp_loc */
+    IA64_INSN_ADD_PSP,          /* s[dst] = (s.psp + val) */
+    IA64_INSN_ADD_PSP_NAT,      /* like above, but with NaT info */
+    IA64_INSN_ADD_SP,           /* s[dst] = (s.sp + val) */
+    IA64_INSN_ADD_SP_NAT,       /* like above, but with NaT info */
+    IA64_INSN_MOVE,             /* s[dst] = s[val] */
+    IA64_INSN_MOVE_NAT,         /* like above, but with NaT info */
+    IA64_INSN_MOVE_NO_NAT,      /* like above, but clear NaT info */
+    IA64_INSN_MOVE_STACKED,     /* s[dst] = rse_skip(*s.bsp_loc, val) */
+    IA64_INSN_MOVE_STACKED_NAT, /* like above, but with NaT info */
+    IA64_INSN_MOVE_SCRATCH,     /* s[dst] = scratch reg "val" */
+    IA64_INSN_MOVE_SCRATCH_NAT, /* like above, but with NaT info */
     IA64_INSN_MOVE_SCRATCH_NO_NAT /* like above, but clear NaT info */
   };
 
@@ -56,11 +56,11 @@ static __thread struct ia64_script_cache ia64_per_thread_cache =
   };
 #endif
 
-static inline unw_hash_index_t
+static inline unw_hash_index_t CONST_ATTR
 hash (unw_word_t ip)
 {
   /* based on (sqrt(5)/2-1)*2^64 */
-# define magic	((unw_word_t) 0x9e3779b97f4a7c16ULL)
+# define magic  ((unw_word_t) 0x9e3779b97f4a7c16ULL)
 
   return (ip >> 4) * magic >> (64 - IA64_LOG_UNW_HASH_SIZE);
 }
@@ -84,7 +84,7 @@ flush_script_cache (struct ia64_script_cache *cache)
   for (i = 0; i < IA64_UNW_CACHE_SIZE; ++i)
     {
       if (i > 0)
-	cache->buckets[i].lru_chain = (i - 1);
+        cache->buckets[i].lru_chain = (i - 1);
       cache->buckets[i].coll_chain = -1;
       cache->buckets[i].ip = 0;
     }
@@ -113,11 +113,10 @@ get_script_cache (unw_addr_space_t as, intrmask_t *saved_maskp)
   if (AO_test_and_set (&cache->busy) == AO_TS_SET)
     return NULL;
 # else
-  sigprocmask (SIG_SETMASK, &unwi_full_mask, saved_maskp);
   if (likely (caching == UNW_CACHE_GLOBAL))
     {
-      Debug (16, "%s: acquiring lock\n", __FUNCTION__);
-      mutex_lock (&cache->lock);
+      Debug (16, "acquiring lock\n");
+      lock_acquire (&cache->lock, *saved_maskp);
     }
 # endif
 #endif
@@ -132,7 +131,7 @@ get_script_cache (unw_addr_space_t as, intrmask_t *saved_maskp)
 
 static inline void
 put_script_cache (unw_addr_space_t as, struct ia64_script_cache *cache,
-		  intrmask_t *saved_maskp)
+                  intrmask_t *saved_maskp)
 {
   assert (as->caching_policy != UNW_CACHE_NONE);
 
@@ -144,8 +143,7 @@ put_script_cache (unw_addr_space_t as, struct ia64_script_cache *cache,
   AO_CLEAR (&cache->busy);
 # else
   if (likely (as->caching_policy == UNW_CACHE_GLOBAL))
-    mutex_unlock (&cache->lock);
-  sigprocmask (SIG_SETMASK, saved_maskp, NULL);
+    lock_release (&cache->lock, *saved_maskp);
 # endif
 #endif
 }
@@ -171,14 +169,14 @@ script_lookup (struct ia64_script_cache *cache, struct cursor *c)
   while (1)
     {
       if (cache_match (script, ip, pr))
-	{
-	  /* update hint; no locking needed: single-word writes are atomic */
-	  c->hint = cache->buckets[c->prev_script].hint =
-	    (script - cache->buckets);
-	  return script;
-	}
+        {
+          /* update hint; no locking needed: single-word writes are atomic */
+          c->hint = cache->buckets[c->prev_script].hint =
+            (script - cache->buckets);
+          return script;
+        }
       if (script->coll_chain >= IA64_UNW_HASH_SIZE)
-	return 0;
+        return 0;
       script = cache->buckets + script->coll_chain;
     }
 }
@@ -214,22 +212,22 @@ script_new (struct ia64_script_cache *cache, unw_word_t ip)
       tmp = cache->buckets + cache->hash[index];
       prev = 0;
       while (1)
-	{
-	  if (tmp == script)
-	    {
-	      if (prev)
-		prev->coll_chain = tmp->coll_chain;
-	      else
-		cache->hash[index] = tmp->coll_chain;
-	      break;
-	    }
-	  else
-	    prev = tmp;
-	  if (tmp->coll_chain >= IA64_UNW_CACHE_SIZE)
-	    /* old script wasn't in the hash-table */
-	    break;
-	  tmp = cache->buckets + tmp->coll_chain;
-	}
+        {
+          if (tmp == script)
+            {
+              if (prev)
+                prev->coll_chain = tmp->coll_chain;
+              else
+                cache->hash[index] = tmp->coll_chain;
+              break;
+            }
+          else
+            prev = tmp;
+          if (tmp->coll_chain >= IA64_UNW_CACHE_SIZE)
+            /* old script wasn't in the hash-table */
+            break;
+          tmp = cache->buckets + tmp->coll_chain;
+        }
     }
 
   /* enter new script in the hash table */
@@ -243,7 +241,7 @@ script_new (struct ia64_script_cache *cache, unw_word_t ip)
 
 static inline void
 script_finalize (struct ia64_script *script, struct cursor *c,
-		 struct ia64_state_record *sr)
+                 struct ia64_state_record *sr)
 {
   script->pr_mask = sr->pr_mask;
   script->pr_val = sr->pr_val;
@@ -255,8 +253,8 @@ script_emit (struct ia64_script *script, struct ia64_script_insn insn)
 {
   if (script->count >= IA64_MAX_SCRIPT_LEN)
     {
-      dprintf ("%s: script exceeds maximum size of %u instructions!\n",
-	       __FUNCTION__, IA64_MAX_SCRIPT_LEN);
+      Dprintf ("%s: script exceeds maximum size of %u instructions!\n",
+               __FUNCTION__, IA64_MAX_SCRIPT_LEN);
       return;
     }
   script->insn[script->count++] = insn;
@@ -264,7 +262,7 @@ script_emit (struct ia64_script *script, struct ia64_script_insn insn)
 
 static void
 compile_reg (struct ia64_state_record *sr, int i, struct ia64_reg_info *r,
-	     struct ia64_script *script)
+             struct ia64_script *script)
 {
   enum ia64_script_insn_opcode opc;
   unsigned long val, rval;
@@ -282,94 +280,94 @@ compile_reg (struct ia64_state_record *sr, int i, struct ia64_reg_info *r,
     {
       /* Handle most common case first... */
       if (rval >= 32)
-	{
-	  /* register got spilled to a stacked register */
-	  if (is_preserved_gr)
-	    opc = IA64_INSN_MOVE_STACKED_NAT;
-	  else
-	    opc = IA64_INSN_MOVE_STACKED;
-	  val = rval;
-	}
+        {
+          /* register got spilled to a stacked register */
+          if (is_preserved_gr)
+            opc = IA64_INSN_MOVE_STACKED_NAT;
+          else
+            opc = IA64_INSN_MOVE_STACKED;
+          val = rval;
+        }
       else if (rval >= 4 && rval <= 7)
-	{
-	  /* register got spilled to a preserved register */
-	  val = IA64_REG_R4 + (rval - 4);
-	  if (is_preserved_gr)
-	    opc = IA64_INSN_MOVE_NAT;
-	}
+        {
+          /* register got spilled to a preserved register */
+          val = IA64_REG_R4 + (rval - 4);
+          if (is_preserved_gr)
+            opc = IA64_INSN_MOVE_NAT;
+        }
       else
-	{
-	  /* register got spilled to a scratch register */
-	  if (is_preserved_gr)
-	    opc = IA64_INSN_MOVE_SCRATCH_NAT;
-	  else
-	    opc = IA64_INSN_MOVE_SCRATCH;
-	  val = UNW_IA64_GR + rval;
-	}
+        {
+          /* register got spilled to a scratch register */
+          if (is_preserved_gr)
+            opc = IA64_INSN_MOVE_SCRATCH_NAT;
+          else
+            opc = IA64_INSN_MOVE_SCRATCH;
+          val = UNW_IA64_GR + rval;
+        }
     }
   else
     {
       switch (r->where)
-	{
-	case IA64_WHERE_FR:
-	  /* Note: There is no need to handle NaT-bit info here
-	     (indepent of is_preserved_gr), because for floating-point
-	     NaTs are represented as NaTVal, so the NaT-info never
-	     needs to be consulated.  */
-	  if (rval >= 2 && rval <= 5)
-	    val = IA64_REG_F2 + (rval - 2);
-	  else if (rval >= 16 && rval <= 31)
-	    val = IA64_REG_F16 + (rval - 16);
-	  else
-	    {
-	      opc = IA64_INSN_MOVE_SCRATCH;
-	      val = UNW_IA64_FR + rval;
-	    }
-	  break;
-
-	case IA64_WHERE_BR:
-	  if (rval >= 1 && rval <= 5)
-	    {
-	      val = IA64_REG_B1 + (rval - 1);
-	      if (is_preserved_gr)
-		opc = IA64_INSN_MOVE_NO_NAT;
-	    }
-	  else
-	    {
-	      opc = IA64_INSN_MOVE_SCRATCH;
-	      if (is_preserved_gr)
-		opc = IA64_INSN_MOVE_SCRATCH_NO_NAT;
-	      val = UNW_IA64_BR + rval;
-	    }
-	  break;
-
-	case IA64_WHERE_SPREL:
-	  if (is_preserved_gr)
-	    opc = IA64_INSN_ADD_SP_NAT;
-	  else
-	    {
-	      opc = IA64_INSN_ADD_SP;
-	      if (i >= IA64_REG_F2 && i <= IA64_REG_F31)
-		val |= IA64_LOC_TYPE_FP;
-	    }
-	  break;
-
-	case IA64_WHERE_PSPREL:
-	  if (is_preserved_gr)
-	    opc = IA64_INSN_ADD_PSP_NAT;
-	  else
-	    {
-	      opc = IA64_INSN_ADD_PSP;
-	      if (i >= IA64_REG_F2 && i <= IA64_REG_F31)
-		val |= IA64_LOC_TYPE_FP;
-	    }
-	  break;
-
-	default:
-	  dprintf ("%s: register %u has unexpected `where' value of %u\n",
-		   __FUNCTION__, i, r->where);
-	  break;
-	}
+        {
+        case IA64_WHERE_FR:
+          /* Note: There is no need to handle NaT-bit info here
+             (indepent of is_preserved_gr), because for floating-point
+             NaTs are represented as NaTVal, so the NaT-info never
+             needs to be consulated.  */
+          if (rval >= 2 && rval <= 5)
+            val = IA64_REG_F2 + (rval - 2);
+          else if (rval >= 16 && rval <= 31)
+            val = IA64_REG_F16 + (rval - 16);
+          else
+            {
+              opc = IA64_INSN_MOVE_SCRATCH;
+              val = UNW_IA64_FR + rval;
+            }
+          break;
+
+        case IA64_WHERE_BR:
+          if (rval >= 1 && rval <= 5)
+            {
+              val = IA64_REG_B1 + (rval - 1);
+              if (is_preserved_gr)
+                opc = IA64_INSN_MOVE_NO_NAT;
+            }
+          else
+            {
+              opc = IA64_INSN_MOVE_SCRATCH;
+              if (is_preserved_gr)
+                opc = IA64_INSN_MOVE_SCRATCH_NO_NAT;
+              val = UNW_IA64_BR + rval;
+            }
+          break;
+
+        case IA64_WHERE_SPREL:
+          if (is_preserved_gr)
+            opc = IA64_INSN_ADD_SP_NAT;
+          else
+            {
+              opc = IA64_INSN_ADD_SP;
+              if (i >= IA64_REG_F2 && i <= IA64_REG_F31)
+                val |= IA64_LOC_TYPE_FP;
+            }
+          break;
+
+        case IA64_WHERE_PSPREL:
+          if (is_preserved_gr)
+            opc = IA64_INSN_ADD_PSP_NAT;
+          else
+            {
+              opc = IA64_INSN_ADD_PSP;
+              if (i >= IA64_REG_F2 && i <= IA64_REG_F31)
+                val |= IA64_LOC_TYPE_FP;
+            }
+          break;
+
+        default:
+          Dprintf ("%s: register %u has unexpected `where' value of %u\n",
+                   __FUNCTION__, i, r->where);
+          break;
+        }
     }
   insn.opc = opc;
   insn.dst = i;
@@ -379,8 +377,8 @@ compile_reg (struct ia64_state_record *sr, int i, struct ia64_reg_info *r,
   if (i == IA64_REG_PSP)
     {
       /* c->psp must contain the _value_ of the previous sp, not it's
-	 save-location.  We get this by dereferencing the value we
-	 just stored in loc[IA64_REG_PSP]: */
+         save-location.  We get this by dereferencing the value we
+         just stored in loc[IA64_REG_PSP]: */
       insn.opc = IA64_INSN_LOAD_PSP;
       script_emit (script, insn);
     }
@@ -402,8 +400,8 @@ sort_regs (struct ia64_state_record *sr, int regorder[])
   for (r = IA64_REG_BSP; r < IA64_NUM_PREGS; ++r)
     {
       if (sr->curr.reg[r].where == IA64_WHERE_NONE
-	  || sr->curr.reg[r].when >= sr->when_target)
-	continue;
+          || sr->curr.reg[r].when >= sr->when_target)
+        continue;
 
       regorder[num_regs++] = r;
     }
@@ -418,17 +416,17 @@ sort_regs (struct ia64_state_record *sr, int regorder[])
       max_when = sr->curr.reg[max_reg].when;
 
       for (j = i + 1; j < num_regs; ++j)
-	if (sr->curr.reg[regorder[j]].when > max_when)
-	  {
-	    max = j;
-	    max_reg = regorder[j];
-	    max_when = sr->curr.reg[max_reg].when;
-	  }
+        if (sr->curr.reg[regorder[j]].when > max_when)
+          {
+            max = j;
+            max_reg = regorder[j];
+            max_when = sr->curr.reg[max_reg].when;
+          }
       if (i != max)
-	{
-	  regorder[max] = regorder[i];
-	  regorder[i] = max_reg;
-	}
+        {
+          regorder[max] = regorder[i];
+          regorder[i] = max_reg;
+        }
     }
   return num_regs;
 }
@@ -459,7 +457,7 @@ build_script (struct cursor *c, struct ia64_script *script)
     {
       /* new psp is psp plus frame size */
       insn.opc = IA64_INSN_INC_PSP;
-      insn.val = sr.curr.reg[IA64_REG_PSP].val;	/* frame size */
+      insn.val = sr.curr.reg[IA64_REG_PSP].val; /* frame size */
       script_emit (script, insn);
     }
   else
@@ -471,18 +469,18 @@ build_script (struct cursor *c, struct ia64_script *script)
       || sr.when_target >= sr.curr.reg[IA64_REG_PRI_UNAT_MEM].when)
     {
       if (sr.when_target < sr.curr.reg[IA64_REG_PRI_UNAT_GR].when)
-	/* (primary) NaT bits were saved to memory only */
-	pri_unat = sr.curr.reg + IA64_REG_PRI_UNAT_MEM;
+        /* (primary) NaT bits were saved to memory only */
+        pri_unat = sr.curr.reg + IA64_REG_PRI_UNAT_MEM;
       else if (sr.when_target < sr.curr.reg[IA64_REG_PRI_UNAT_MEM].when)
-	/* (primary) NaT bits were saved to a register only */
-	pri_unat = sr.curr.reg + IA64_REG_PRI_UNAT_GR;
+        /* (primary) NaT bits were saved to a register only */
+        pri_unat = sr.curr.reg + IA64_REG_PRI_UNAT_GR;
       else if (sr.curr.reg[IA64_REG_PRI_UNAT_MEM].when >
-	       sr.curr.reg[IA64_REG_PRI_UNAT_GR].when)
-	/* (primary) NaT bits were last saved to memory */
-	pri_unat = sr.curr.reg + IA64_REG_PRI_UNAT_MEM;
+               sr.curr.reg[IA64_REG_PRI_UNAT_GR].when)
+        /* (primary) NaT bits were last saved to memory */
+        pri_unat = sr.curr.reg + IA64_REG_PRI_UNAT_MEM;
       else
-	/* (primary) NaT bits were last saved to a register */
-	pri_unat = sr.curr.reg + IA64_REG_PRI_UNAT_GR;
+        /* (primary) NaT bits were last saved to a register */
+        pri_unat = sr.curr.reg + IA64_REG_PRI_UNAT_GR;
 
       /* Note: we always store the final primary-UNaT location in UNAT_MEM.  */
       compile_reg (&sr, IA64_REG_PRI_UNAT_MEM, pri_unat, script);
@@ -503,7 +501,7 @@ build_script (struct cursor *c, struct ia64_script *script)
 
 static inline void
 set_nat_info (struct cursor *c, unsigned long dst,
-	      ia64_loc_t nat_loc, uint8_t bitnr)
+              ia64_loc_t nat_loc, uint8_t bitnr)
 {
   assert (dst >= IA64_REG_R4 && dst <= IA64_REG_R7);
 
@@ -540,79 +538,79 @@ run_script (struct ia64_script *script, struct cursor *c)
 
       /* This is by far the most common operation: */
       if (likely (opc == IA64_INSN_MOVE_STACKED))
-	{
-	  if ((ret = ia64_get_stacked (c, val, &loc, NULL)) < 0)
-	    return ret;
-	}
+        {
+          if ((ret = ia64_get_stacked (c, val, &loc, NULL)) < 0)
+            return ret;
+        }
       else
-	switch (opc)
-	  {
-	  case IA64_INSN_INC_PSP:
-	    c->psp += val;
-	    continue;
-
-	  case IA64_INSN_LOAD_PSP:
-	    if ((ret = ia64_get (c, c->loc[IA64_REG_PSP], &c->psp)) < 0)
-	      return ret;
-	    continue;
-
-	  case IA64_INSN_ADD_PSP:
-	    loc = IA64_LOC_ADDR (c->psp + val, (val & IA64_LOC_TYPE_FP));
-	    break;
-
-	  case IA64_INSN_ADD_SP:
-	    loc = IA64_LOC_ADDR (c->sp + val, (val & IA64_LOC_TYPE_FP));
-	    break;
-
-	  case IA64_INSN_MOVE_NO_NAT:
-	    set_nat_info (c, dst, IA64_NULL_LOC, 0);
-	  case IA64_INSN_MOVE:
-	    loc = c->loc[val];
-	    break;
-
-	  case IA64_INSN_MOVE_SCRATCH_NO_NAT:
-	    set_nat_info (c, dst, IA64_NULL_LOC, 0);
-	  case IA64_INSN_MOVE_SCRATCH:
-	    loc = ia64_scratch_loc (c, val, NULL);
-	    break;
-
-	  case IA64_INSN_ADD_PSP_NAT:
-	    loc = IA64_LOC_ADDR (c->psp + val, 0);
-	    assert (!IA64_IS_REG_LOC (loc));
-	    set_nat_info (c, dst,
-			  c->loc[IA64_REG_PRI_UNAT_MEM],
-			  ia64_unat_slot_num (IA64_GET_ADDR (loc)));
-	    break;
-
-	  case IA64_INSN_ADD_SP_NAT:
-	    loc = IA64_LOC_ADDR (c->sp + val, 0);
-	    assert (!IA64_IS_REG_LOC (loc));
-	    set_nat_info (c, dst,
-			  c->loc[IA64_REG_PRI_UNAT_MEM],
-			  ia64_unat_slot_num (IA64_GET_ADDR (loc)));
-	    break;
-
-	  case IA64_INSN_MOVE_NAT:
-	    loc = c->loc[val];
-	    set_nat_info (c, dst,
-			  c->loc[val - IA64_REG_R4 + IA64_REG_NAT4],
-			  c->nat_bitnr[val - IA64_REG_R4]);
-	    break;
-
-	  case IA64_INSN_MOVE_STACKED_NAT:
-	    if ((ret = ia64_get_stacked (c, val, &loc, &nat_loc)) < 0)
-	      return ret;
-	    assert (!IA64_IS_REG_LOC (loc));
-	    set_nat_info (c, dst, nat_loc, rse_slot_num (IA64_GET_ADDR (loc)));
-	    break;
-
-	  case IA64_INSN_MOVE_SCRATCH_NAT:
-	    loc = ia64_scratch_loc (c, val, NULL);
-	    nat_loc = ia64_scratch_loc (c, val + (UNW_IA64_NAT - UNW_IA64_GR),
-					&nat_bitnr);
-	    set_nat_info (c, dst, nat_loc, nat_bitnr);
-	    break;
-	  }
+        switch (opc)
+          {
+          case IA64_INSN_INC_PSP:
+            c->psp += val;
+            continue;
+
+          case IA64_INSN_LOAD_PSP:
+            if ((ret = ia64_get (c, c->loc[IA64_REG_PSP], &c->psp)) < 0)
+              return ret;
+            continue;
+
+          case IA64_INSN_ADD_PSP:
+            loc = IA64_LOC_ADDR (c->psp + val, (val & IA64_LOC_TYPE_FP));
+            break;
+
+          case IA64_INSN_ADD_SP:
+            loc = IA64_LOC_ADDR (c->sp + val, (val & IA64_LOC_TYPE_FP));
+            break;
+
+          case IA64_INSN_MOVE_NO_NAT:
+            set_nat_info (c, dst, IA64_NULL_LOC, 0);
+          case IA64_INSN_MOVE:
+            loc = c->loc[val];
+            break;
+
+          case IA64_INSN_MOVE_SCRATCH_NO_NAT:
+            set_nat_info (c, dst, IA64_NULL_LOC, 0);
+          case IA64_INSN_MOVE_SCRATCH:
+            loc = ia64_scratch_loc (c, val, NULL);
+            break;
+
+          case IA64_INSN_ADD_PSP_NAT:
+            loc = IA64_LOC_ADDR (c->psp + val, 0);
+            assert (!IA64_IS_REG_LOC (loc));
+            set_nat_info (c, dst,
+                          c->loc[IA64_REG_PRI_UNAT_MEM],
+                          ia64_unat_slot_num (IA64_GET_ADDR (loc)));
+            break;
+
+          case IA64_INSN_ADD_SP_NAT:
+            loc = IA64_LOC_ADDR (c->sp + val, 0);
+            assert (!IA64_IS_REG_LOC (loc));
+            set_nat_info (c, dst,
+                          c->loc[IA64_REG_PRI_UNAT_MEM],
+                          ia64_unat_slot_num (IA64_GET_ADDR (loc)));
+            break;
+
+          case IA64_INSN_MOVE_NAT:
+            loc = c->loc[val];
+            set_nat_info (c, dst,
+                          c->loc[val - IA64_REG_R4 + IA64_REG_NAT4],
+                          c->nat_bitnr[val - IA64_REG_R4]);
+            break;
+
+          case IA64_INSN_MOVE_STACKED_NAT:
+            if ((ret = ia64_get_stacked (c, val, &loc, &nat_loc)) < 0)
+              return ret;
+            assert (!IA64_IS_REG_LOC (loc));
+            set_nat_info (c, dst, nat_loc, rse_slot_num (IA64_GET_ADDR (loc)));
+            break;
+
+          case IA64_INSN_MOVE_SCRATCH_NAT:
+            loc = ia64_scratch_loc (c, val, NULL);
+            nat_loc = ia64_scratch_loc (c, val + (UNW_IA64_NAT - UNW_IA64_GR),
+                                        &nat_bitnr);
+            set_nat_info (c, dst, nat_loc, nat_bitnr);
+            break;
+          }
       c->loc[dst] = loc;
     }
   return 0;
@@ -631,8 +629,8 @@ uncached_find_save_locs (struct cursor *c)
   if ((ret = build_script (c, &script)) < 0)
     {
       if (ret != -UNW_ESTOPUNWIND)
-	dprintf ("%s: failed to build unwind script for ip %lx\n",
-		 __FUNCTION__, (long) c->ip);
+        Dprintf ("%s: failed to build unwind script for ip %lx\n",
+                 __FUNCTION__, (long) c->ip);
       return ret;
     }
   return run_script (&script, c);
@@ -658,23 +656,23 @@ ia64_find_save_locs (struct cursor *c)
   {
     script = script_lookup (cache, c);
     Debug (8, "ip %lx %s in script cache\n", (long) c->ip,
-	   script ? "hit" : "missed");
+           script ? "hit" : "missed");
 
     if (!script || (script->count == 0 && !script->pi.unwind_info))
       {
-	if ((ret = ia64_fetch_proc_info (c, c->ip, 1)) < 0)
-	  goto out;
+        if ((ret = ia64_fetch_proc_info (c, c->ip, 1)) < 0)
+          goto out;
       }
 
     if (!script)
       {
-	script = script_new (cache, c->ip);
-	if (!script)
-	  {
-	    dprintf ("%s: failed to create unwind script\n", __FUNCTION__);
-	    ret = -UNW_EUNSPEC;
-	    goto out;
-	  }
+        script = script_new (cache, c->ip);
+        if (!script)
+          {
+            Dprintf ("%s: failed to create unwind script\n", __FUNCTION__);
+            ret = -UNW_EUNSPEC;
+            goto out;
+          }
       }
     cache->buckets[c->prev_script].hint = script - cache->buckets;
 
@@ -688,10 +686,10 @@ ia64_find_save_locs (struct cursor *c)
 
     if (ret < 0)
       {
-	if (ret != -UNW_ESTOPUNWIND)
-	  dprintf ("%s: failed to locate/build unwind script for ip %lx\n",
-		   __FUNCTION__, (long) c->ip);
-	goto out;
+        if (ret != -UNW_ESTOPUNWIND)
+          Dprintf ("%s: failed to locate/build unwind script for ip %lx\n",
+                   __FUNCTION__, (long) c->ip);
+        goto out;
       }
 
     ret = run_script (script, c);
@@ -725,7 +723,7 @@ ia64_cache_proc_info (struct cursor *c)
 
   cache = get_script_cache (c->as, &saved_mask);
   if (!cache)
-    return ret;	/* cache is busy */
+    return ret; /* cache is busy */
 
   /* Re-check to see if a cache entry has been added in the meantime: */
   script = script_lookup (cache, c);
@@ -735,7 +733,7 @@ ia64_cache_proc_info (struct cursor *c)
   script = script_new (cache, c->ip);
   if (!script)
     {
-      dprintf ("%s: failed to create unwind script\n", __FUNCTION__);
+      Dprintf ("%s: failed to create unwind script\n", __FUNCTION__);
       ret = -UNW_EUNSPEC;
       goto out;
     }
@@ -756,7 +754,7 @@ ia64_get_cached_proc_info (struct cursor *c)
 
   cache = get_script_cache (c->as, &saved_mask);
   if (!cache)
-    return -UNW_ENOINFO;	/* cache is busy */
+    return -UNW_ENOINFO;        /* cache is busy */
   {
     script = script_lookup (cache, c);
     if (script)
diff --git a/frysk-imports/libunwind/src/ia64/Gstep.c b/frysk-imports/libunwind/src/ia64/Gstep.c
index 4390d26..0191f64 100644
--- a/frysk-imports/libunwind/src/ia64/Gstep.c
+++ b/frysk-imports/libunwind/src/ia64/Gstep.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2001-2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -28,7 +28,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 static inline int
 linux_sigtramp (struct cursor *c, ia64_loc_t prev_cfm_loc,
-		unw_word_t *num_regsp)
+                unw_word_t *num_regsp)
 {
 #if defined(UNW_LOCAL_ONLY) && !defined(__linux)
   return -UNW_EINVAL;
@@ -37,8 +37,8 @@ linux_sigtramp (struct cursor *c, ia64_loc_t prev_cfm_loc,
   int ret;
 
   if ((ret = ia64_get (c, IA64_LOC_ADDR (c->sp + 0x10
-					 + LINUX_SIGFRAME_ARG2_OFF, 0),
-		       &sc_addr)) < 0)
+                                         + LINUX_SIGFRAME_ARG2_OFF, 0),
+                       &sc_addr)) < 0)
     return ret;
 
   c->sigcontext_addr = sc_addr;
@@ -47,7 +47,7 @@ linux_sigtramp (struct cursor *c, ia64_loc_t prev_cfm_loc,
       && IA64_GET_ADDR (c->loc[IA64_REG_IP]) == sc_addr + LINUX_SC_BR_OFF + 8)
     {
       /* Linux kernels before 2.4.19 and 2.5.10 had buggy
-	 unwind info for sigtramp.  Fix it up here.  */
+         unwind info for sigtramp.  Fix it up here.  */
       c->loc[IA64_REG_IP]  = IA64_LOC_ADDR (sc_addr + LINUX_SC_IP_OFF, 0);
       c->cfm_loc = IA64_LOC_ADDR (sc_addr + LINUX_SC_CFM_OFF, 0);
     }
@@ -55,14 +55,14 @@ linux_sigtramp (struct cursor *c, ia64_loc_t prev_cfm_loc,
   /* do what can't be described by unwind directives: */
   c->loc[IA64_REG_PFS] = IA64_LOC_ADDR (sc_addr + LINUX_SC_AR_PFS_OFF, 0);
   c->ec_loc = prev_cfm_loc;
-  *num_regsp = c->cfm & 0x7f;		/* size of frame */
+  *num_regsp = c->cfm & 0x7f;           /* size of frame */
   return 0;
 #endif
 }
 
 static inline int
 linux_interrupt (struct cursor *c, ia64_loc_t prev_cfm_loc,
-		 unw_word_t *num_regsp, int marker)
+                 unw_word_t *num_regsp, int marker)
 {
 #if defined(UNW_LOCAL_ONLY) && !(defined(__linux) && defined(__KERNEL__))
   return -UNW_EINVAL;
@@ -79,19 +79,19 @@ linux_interrupt (struct cursor *c, ia64_loc_t prev_cfm_loc,
 
   /* do what can't be described by unwind directives: */
   if (marker == ABI_MARKER_OLD_LINUX_INTERRUPT)
-	  pfs_loc = IA64_LOC_ADDR (sc_addr + LINUX_OLD_PT_PFS_OFF, 0);
+          pfs_loc = IA64_LOC_ADDR (sc_addr + LINUX_OLD_PT_PFS_OFF, 0);
   else
-	  pfs_loc = IA64_LOC_ADDR (sc_addr + LINUX_PT_PFS_OFF, 0);
+          pfs_loc = IA64_LOC_ADDR (sc_addr + LINUX_PT_PFS_OFF, 0);
   c->loc[IA64_REG_PFS] = pfs_loc;
   c->ec_loc = prev_cfm_loc;
-  *num_regsp = num_regs;		/* size of frame */
+  *num_regsp = num_regs;                /* size of frame */
   return 0;
 #endif
 }
 
 static inline int
 hpux_sigtramp (struct cursor *c, ia64_loc_t prev_cfm_loc,
-	       unw_word_t *num_regsp)
+               unw_word_t *num_regsp)
 {
 #if defined(UNW_LOCAL_ONLY) && !defined(__hpux)
   return -UNW_EINVAL;
@@ -177,36 +177,36 @@ check_rbs_switch (struct cursor *c)
   if (c->pi.flags & UNW_PI_FLAG_IA64_RBS_SWITCH)
     {
       /* Got ourselves a frame that has saved ar.bspstore, ar.bsp,
-	 and ar.rnat, so we're all set for rbs-switching:  */
+         and ar.rnat, so we're all set for rbs-switching:  */
       if ((ret = ia64_get (c, c->loc[IA64_REG_BSP], &saved_bsp)) < 0
-	  || (ret = ia64_get (c, c->loc[IA64_REG_BSPSTORE], &saved_bspstore)))
-	return ret;
+          || (ret = ia64_get (c, c->loc[IA64_REG_BSPSTORE], &saved_bspstore)))
+        return ret;
     }
   else if ((c->abi_marker == ABI_MARKER_LINUX_SIGTRAMP
-	    || c->abi_marker == ABI_MARKER_OLD_LINUX_SIGTRAMP)
-	   && !IA64_IS_REG_LOC (c->loc[IA64_REG_BSP])
-	   && (IA64_GET_ADDR (c->loc[IA64_REG_BSP])
-	       == c->sigcontext_addr + LINUX_SC_AR_BSP_OFF))
+            || c->abi_marker == ABI_MARKER_OLD_LINUX_SIGTRAMP)
+           && !IA64_IS_REG_LOC (c->loc[IA64_REG_BSP])
+           && (IA64_GET_ADDR (c->loc[IA64_REG_BSP])
+               == c->sigcontext_addr + LINUX_SC_AR_BSP_OFF))
     {
       /* When Linux delivers a signal on an alternate stack, it
-	 does things a bit differently from what the unwind
-	 conventions allow us to describe: instead of saving
-	 ar.rnat, ar.bsp, and ar.bspstore, it saves the former two
-	 plus the "loadrs" value.  Because of this, we need to
-	 detect & record a potential rbs-area switch
-	 manually... */
+         does things a bit differently from what the unwind
+         conventions allow us to describe: instead of saving
+         ar.rnat, ar.bsp, and ar.bspstore, it saves the former two
+         plus the "loadrs" value.  Because of this, we need to
+         detect & record a potential rbs-area switch
+         manually... */
 
       /* If ar.bsp has been saved already AND the current bsp is
-	 not equal to the saved value, then we know for sure that
-	 we're past the point where the backing store has been
-	 switched (and before the point where it's restored).  */
+         not equal to the saved value, then we know for sure that
+         we're past the point where the backing store has been
+         switched (and before the point where it's restored).  */
       if ((ret = ia64_get (c, IA64_LOC_ADDR (c->sigcontext_addr
-					     + LINUX_SC_AR_BSP_OFF, 0),
-			   &saved_bsp) < 0)
-	  || (ret = ia64_get (c, IA64_LOC_ADDR (c->sigcontext_addr
-						+ LINUX_SC_LOADRS_OFF, 0),
-			      &loadrs) < 0))
-	return ret;
+                                             + LINUX_SC_AR_BSP_OFF, 0),
+                           &saved_bsp) < 0)
+          || (ret = ia64_get (c, IA64_LOC_ADDR (c->sigcontext_addr
+                                                + LINUX_SC_LOADRS_OFF, 0),
+                              &loadrs) < 0))
+        return ret;
       loadrs >>= 16;
       ndirty = rse_num_regs (c->bsp - loadrs, c->bsp);
       saved_bspstore = rse_skip_regs (saved_bsp, -ndirty);
@@ -267,54 +267,54 @@ update_frame_state (struct cursor *c)
     {
       c->last_abi_marker = c->abi_marker;
       switch (ia64_get_abi_marker (c))
-	{
-	case ABI_MARKER_LINUX_SIGTRAMP:
-	case ABI_MARKER_OLD_LINUX_SIGTRAMP:
-	  ia64_set_abi (c, ABI_LINUX);
-	  if ((ret = linux_sigtramp (c, prev_cfm_loc, &num_regs)) < 0)
-	    return ret;
-	  break;
-
-	case ABI_MARKER_OLD_LINUX_INTERRUPT:
-	case ABI_MARKER_LINUX_INTERRUPT:
-	  ia64_set_abi (c, ABI_LINUX);
-	  if ((ret = linux_interrupt (c, prev_cfm_loc, &num_regs,
-				      c->abi_marker)) < 0)
-	    return ret;
-	  break;
-
-	case ABI_MARKER_HP_UX_SIGTRAMP:
-	  ia64_set_abi (c, ABI_HPUX);
-	  if ((ret = hpux_sigtramp (c, prev_cfm_loc, &num_regs)) < 0)
-	    return ret;
-	  break;
-
-	default:
-	  Debug (1, "unknown ABI marker: ABI=%u, context=%u\n",
-		 c->abi_marker >> 8, c->abi_marker & 0xff);
-	  return -UNW_EINVAL;
-	}
+        {
+        case ABI_MARKER_LINUX_SIGTRAMP:
+        case ABI_MARKER_OLD_LINUX_SIGTRAMP:
+          ia64_set_abi (c, ABI_LINUX);
+          if ((ret = linux_sigtramp (c, prev_cfm_loc, &num_regs)) < 0)
+            return ret;
+          break;
+
+        case ABI_MARKER_OLD_LINUX_INTERRUPT:
+        case ABI_MARKER_LINUX_INTERRUPT:
+          ia64_set_abi (c, ABI_LINUX);
+          if ((ret = linux_interrupt (c, prev_cfm_loc, &num_regs,
+                                      c->abi_marker)) < 0)
+            return ret;
+          break;
+
+        case ABI_MARKER_HP_UX_SIGTRAMP:
+          ia64_set_abi (c, ABI_HPUX);
+          if ((ret = hpux_sigtramp (c, prev_cfm_loc, &num_regs)) < 0)
+            return ret;
+          break;
+
+        default:
+          Debug (1, "unknown ABI marker: ABI=%u, context=%u\n",
+                 c->abi_marker >> 8, c->abi_marker & 0xff);
+          return -UNW_EINVAL;
+        }
       Debug (12, "sigcontext_addr=%lx (ret=%d)\n",
-	     (unsigned long) c->sigcontext_addr, ret);
+             (unsigned long) c->sigcontext_addr, ret);
 
       c->sigcontext_off = c->sigcontext_addr - c->sp;
 
       /* update the IP cache: */
       if ((ret = ia64_get (c, c->loc[IA64_REG_IP], &ip)) < 0)
- 	return ret;
+        return ret;
       c->ip = ip;
       if (ip == 0)
-	/* end of frame-chain reached */
-	return 0;
+        /* end of frame-chain reached */
+        return 0;
     }
   else
-    num_regs = (c->cfm >> 7) & 0x7f;	/* size of locals */
+    num_regs = (c->cfm >> 7) & 0x7f;    /* size of locals */
 
   if (!IA64_IS_NULL_LOC (c->loc[IA64_REG_BSP]))
     {
       ret = check_rbs_switch (c);
       if (ret < 0)
-	return ret;
+        return ret;
     }
 
   c->bsp = rse_skip_regs (c->bsp, -num_regs);
@@ -324,8 +324,8 @@ update_frame_state (struct cursor *c)
 
   if (c->ip == prev_ip && c->sp == prev_sp && c->bsp == prev_bsp)
     {
-      dprintf ("%s: ip, sp, and bsp unchanged; stopping here (ip=0x%lx)\n",
-	       __FUNCTION__, (long) ip);
+      Dprintf ("%s: ip, sp, and bsp unchanged; stopping here (ip=0x%lx)\n",
+               __FUNCTION__, (long) ip);
       return -UNW_EBADFRAME;
     }
 
diff --git a/frysk-imports/libunwind/src/ia64/Gtables.c b/frysk-imports/libunwind/src/ia64/Gtables.c
index c3448c8..6959cae 100644
--- a/frysk-imports/libunwind/src/ia64/Gtables.c
+++ b/frysk-imports/libunwind/src/ia64/Gtables.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (c) 2001-2005 Hewlett-Packard Development Company, L.P.
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -74,17 +74,17 @@ read_mem (unw_addr_space_t as, unw_word_t addr, unw_word_t *valp, void *arg)
 }
 
 /* Helper macro for reading an ia64_table_entry from remote memory.  */
-#define remote_read(addr, member)					     \
-	(*a->access_mem) (as, (addr) + offsetof (struct ia64_table_entry,    \
-						 member), &member, 0, arg)
+#define remote_read(addr, member)                                            \
+        (*a->access_mem) (as, (addr) + offsetof (struct ia64_table_entry,    \
+                                                 member), &member, 0, arg)
 
 /* Lookup an unwind-table entry in remote memory.  Returns 1 if an
    entry is found, 0 if no entry is found, negative if an error
    occurred reading remote memory.  */
 static int
 remote_lookup (unw_addr_space_t as,
-	       unw_word_t table, size_t table_size, unw_word_t rel_ip,
-	       struct ia64_table_entry *e, void *arg)
+               unw_word_t table, size_t table_size, unw_word_t rel_ip,
+               struct ia64_table_entry *e, void *arg)
 {
   unw_word_t e_addr = 0, start_offset, end_offset, info_offset;
   unw_accessors_t *a = unw_get_accessors (as);
@@ -97,20 +97,20 @@ remote_lookup (unw_addr_space_t as,
       mid = (lo + hi) / 2;
       e_addr = table + mid * sizeof (struct ia64_table_entry);
       if ((ret = remote_read (e_addr, start_offset)) < 0)
-	return ret;
+        return ret;
 
       if (rel_ip < start_offset)
-	hi = mid;
+        hi = mid;
       else
-	{
-	  if ((ret = remote_read (e_addr, end_offset)) < 0)
-	    return ret;
-
-	  if (rel_ip >= end_offset)
-	    lo = mid + 1;
-	  else
-	    break;
-	}
+        {
+          if ((ret = remote_read (e_addr, end_offset)) < 0)
+            return ret;
+
+          if (rel_ip >= end_offset)
+            lo = mid + 1;
+          else
+            break;
+        }
     }
   if (rel_ip < start_offset || rel_ip >= end_offset)
     return 0;
@@ -157,7 +157,7 @@ _Uia64_find_dyn_list (unw_addr_space_t as, unw_dyn_info_t *di, void *arg)
       table_size = di->u.ti.table_len * sizeof (di->u.ti.table_data[0]);
       segbase = di->u.ti.segbase;
       if (table_size < sizeof (struct ia64_table_entry))
-	return 0;
+        return 0;
       start_offset = e[0].start_offset;
       end_offset = e[0].end_offset;
       info_offset = e[0].info_offset;
@@ -165,18 +165,18 @@ _Uia64_find_dyn_list (unw_addr_space_t as, unw_dyn_info_t *di, void *arg)
 
     case UNW_INFO_FORMAT_REMOTE_TABLE:
       {
-	unw_accessors_t *a = unw_get_accessors (as);
-	unw_word_t e_addr = di->u.rti.table_data;
-
-	table_size = di->u.rti.table_len * sizeof (unw_word_t);
-	segbase = di->u.rti.segbase;
-	if (table_size < sizeof (struct ia64_table_entry))
-	  return 0;
-
-	if (   (ret = remote_read (e_addr, start_offset) < 0)
-	    || (ret = remote_read (e_addr, end_offset) < 0)
-	    || (ret = remote_read (e_addr, info_offset) < 0))
-	  return ret;
+        unw_accessors_t *a = unw_get_accessors (as);
+        unw_word_t e_addr = di->u.rti.table_data;
+
+        table_size = di->u.rti.table_len * sizeof (unw_word_t);
+        segbase = di->u.rti.segbase;
+        if (table_size < sizeof (struct ia64_table_entry))
+          return 0;
+
+        if (   (ret = remote_read (e_addr, start_offset) < 0)
+            || (ret = remote_read (e_addr, end_offset) < 0)
+            || (ret = remote_read (e_addr, info_offset) < 0))
+          return ret;
       }
       break;
     }
@@ -236,11 +236,11 @@ lookup (struct ia64_table_entry *table, size_t table_size, unw_word_t rel_ip)
       mid = (lo + hi) / 2;
       e = table + mid;
       if (rel_ip < e->start_offset)
-	hi = mid;
+        hi = mid;
       else if (rel_ip >= e->end_offset)
-	lo = mid + 1;
+        lo = mid + 1;
       else
-	break;
+        break;
     }
   if (rel_ip < e->start_offset || rel_ip >= e->end_offset)
     return NULL;
@@ -249,17 +249,20 @@ lookup (struct ia64_table_entry *table, size_t table_size, unw_word_t rel_ip)
 
 PROTECTED int
 unw_search_ia64_unwind_table (unw_addr_space_t as, unw_word_t ip,
-			      unw_dyn_info_t *di, unw_proc_info_t *pi,
-			      int need_unwind_info, void *arg)
+                              unw_dyn_info_t *di, unw_proc_info_t *pi,
+                              int need_unwind_info, void *arg)
 {
   unw_word_t addr, hdr_addr, info_addr, info_end_addr, hdr, *wp;
   const struct ia64_table_entry *e = NULL;
   unw_word_t handler_offset, segbase = 0;
   int ret, is_local;
+#ifndef UNW_LOCAL_ONLY
+  struct ia64_table_entry ent;
+#endif
 
   assert ((di->format == UNW_INFO_FORMAT_TABLE
-	   || di->format == UNW_INFO_FORMAT_REMOTE_TABLE)
-	  && (ip >= di->start_ip && ip < di->end_ip));
+           || di->format == UNW_INFO_FORMAT_REMOTE_TABLE)
+          && (ip >= di->start_ip && ip < di->end_ip));
 
   pi->flags = 0;
   pi->unwind_info = 0;
@@ -269,28 +272,26 @@ unw_search_ia64_unwind_table (unw_addr_space_t as, unw_word_t ip,
     {
       segbase = di->u.ti.segbase;
       e = lookup ((struct ia64_table_entry *) di->u.ti.table_data,
-		  di->u.ti.table_len * sizeof (unw_word_t),
-		  ip - segbase);
+                  di->u.ti.table_len * sizeof (unw_word_t),
+                  ip - segbase);
     }
 #ifndef UNW_LOCAL_ONLY
   else
     {
-      struct ia64_table_entry ent;
-
       segbase = di->u.rti.segbase;
       if ((ret = remote_lookup (as, di->u.rti.table_data,
-				di->u.rti.table_len * sizeof (unw_word_t),
-				ip - segbase, &ent, arg)) < 0)
-	return ret;
+                                di->u.rti.table_len * sizeof (unw_word_t),
+                                ip - segbase, &ent, arg)) < 0)
+        return ret;
       if (ret)
-	e = &ent;
+        e = &ent;
     }
 #endif
   if (!e)
     {
       /* IP is inside this table's range, but there is no explicit
-	 unwind info => use default conventions (i.e., this is NOT an
-	 error).  */
+         unwind info => use default conventions (i.e., this is NOT an
+         error).  */
       memset (pi, 0, sizeof (*pi));
       pi->start_ip = 0;
       pi->end_ip = 0;
@@ -315,8 +316,8 @@ unw_search_ia64_unwind_table (unw_addr_space_t as, unw_word_t ip,
   if (IA64_UNW_VER (hdr) != 1)
     {
       Debug (1, "Unknown header version %ld (hdr word=0x%lx @ 0x%lx)\n",
-	     IA64_UNW_VER (hdr), (unsigned long) hdr,
-	     (unsigned long) hdr_addr);
+             IA64_UNW_VER (hdr), (unsigned long) hdr,
+             (unsigned long) hdr_addr);
       return -UNW_EBADVERSION;
     }
 
@@ -332,36 +333,36 @@ unw_search_ia64_unwind_table (unw_addr_space_t as, unw_word_t ip,
       pi->unwind_info_size = 8 * IA64_UNW_LENGTH (hdr);
 
       if (is_local)
-	pi->unwind_info = (void *) (uintptr_t) info_addr;
+        pi->unwind_info = (void *) (uintptr_t) info_addr;
       else
-	{
-	  /* Internalize unwind info.  Note: since we're doing this
-	     only for non-local address spaces, there is no
-	     signal-safety issue and it is OK to use malloc()/free().  */
-	  pi->unwind_info = malloc (8 * IA64_UNW_LENGTH (hdr));
-	  if (!pi->unwind_info)
-	    return -UNW_ENOMEM;
-
-	  wp = (unw_word_t *) pi->unwind_info;
-	  for (addr = info_addr; addr < info_end_addr; addr += 8, ++wp)
-	    {
-	      if ((ret = read_mem (as, addr, wp, arg)) < 0)
-		{
-		  free (pi->unwind_info);
-		  return ret;
-		}
-	    }
-	}
+        {
+          /* Internalize unwind info.  Note: since we're doing this
+             only for non-local address spaces, there is no
+             signal-safety issue and it is OK to use malloc()/free().  */
+          pi->unwind_info = malloc (8 * IA64_UNW_LENGTH (hdr));
+          if (!pi->unwind_info)
+            return -UNW_ENOMEM;
+
+          wp = (unw_word_t *) pi->unwind_info;
+          for (addr = info_addr; addr < info_end_addr; addr += 8, ++wp)
+            {
+              if ((ret = read_mem (as, addr, wp, arg)) < 0)
+                {
+                  free (pi->unwind_info);
+                  return ret;
+                }
+            }
+        }
     }
 
   if (IA64_UNW_FLAG_EHANDLER (hdr) || IA64_UNW_FLAG_UHANDLER (hdr))
     {
       /* read the personality routine address (address is gp-relative): */
       if ((ret = read_mem (as, info_end_addr, &handler_offset, arg)) < 0)
-	return ret;
+        return ret;
       Debug (4, "handler ptr @ offset=%lx, gp=%lx\n", handler_offset, di->gp);
       if ((read_mem (as, handler_offset + di->gp, &pi->handler, arg)) < 0)
-	return ret;
+        return ret;
     }
   pi->lsda = info_end_addr + 8;
   pi->gp = di->gp;
@@ -386,7 +387,7 @@ unw_search_ia64_unwind_table (unw_addr_space_t as, unw_word_t ip,
 #   include <unistd.h>
 #   include <sys/syscall.h>
 #   ifndef __NR_getunwind
-#     define __NR_getunwind	1215
+#     define __NR_getunwind     1215
 #   endif
 
 static unsigned long
@@ -411,8 +412,8 @@ get_kernel_table (unw_dyn_info_t *di)
   ktab = sos_alloc (size);
   if (!ktab)
     {
-      dprintf (__FILE__".%s: failed to allocate %zu bytes",
-	       __FUNCTION__, size);
+      Dprintf (__FILE__".%s: failed to allocate %zu bytes",
+               __FUNCTION__, size);
       return -UNW_ENOMEM;
     }
   getunwind (ktab, size);
@@ -431,8 +432,8 @@ get_kernel_table (unw_dyn_info_t *di)
   di->u.ti.table_data = (unw_word_t *) ktab;
 
   Debug (16, "found table `%s': [%lx-%lx) segbase=%lx len=%lu\n",
-	 (char *) di->u.ti.name_ptr, di->start_ip, di->end_ip,
-	 di->u.ti.segbase, di->u.ti.table_len);
+         (char *) di->u.ti.name_ptr, di->start_ip, di->end_ip,
+         di->u.ti.segbase, di->u.ti.table_len);
   return 0;
 }
 
@@ -477,11 +478,11 @@ callback (struct dl_phdr_info *info, size_t size, void *ptr)
 
   /* Make sure struct dl_phdr_info is at least as big as we need.  */
   if (size < offsetof (struct dl_phdr_info, dlpi_phnum)
-	     + sizeof (info->dlpi_phnum))
+             + sizeof (info->dlpi_phnum))
     return -1;
 
   Debug (16, "checking `%s' (load_base=%lx)\n",
-	 info->dlpi_name, info->dlpi_addr);
+         info->dlpi_name, info->dlpi_addr);
 
   phdr = info->dlpi_phdr;
   load_base = info->dlpi_addr;
@@ -494,52 +495,52 @@ callback (struct dl_phdr_info *info, size_t size, void *ptr)
   for (n = info->dlpi_phnum; --n >= 0; phdr++)
     {
       if (phdr->p_type == PT_LOAD)
-	{
-	  Elf64_Addr vaddr = phdr->p_vaddr + load_base;
-	  if (di->u.ti.segbase >= vaddr
-	      && di->u.ti.segbase < vaddr + phdr->p_memsz)
-	    p_text = phdr;
-	}
+        {
+          Elf64_Addr vaddr = phdr->p_vaddr + load_base;
+          if (di->u.ti.segbase >= vaddr
+              && di->u.ti.segbase < vaddr + phdr->p_memsz)
+            p_text = phdr;
+        }
       else if (phdr->p_type == PT_IA_64_UNWIND)
-	p_unwind = phdr;
+        p_unwind = phdr;
       else if (phdr->p_type == PT_DYNAMIC)
-	p_dynamic = phdr;
+        p_dynamic = phdr;
     }
   if (!p_text || !p_unwind)
     return 0;
 
   if (likely (p_unwind->p_vaddr >= p_text->p_vaddr
-	      && p_unwind->p_vaddr < p_text->p_vaddr + p_text->p_memsz))
+              && p_unwind->p_vaddr < p_text->p_vaddr + p_text->p_memsz))
     /* normal case: unwind table is inside text segment */
     segbase = p_text->p_vaddr + load_base;
   else
     {
       /* Special case: unwind table is in some other segment; this
-	 happens for the Linux kernel's gate DSO, for example.  */
+         happens for the Linux kernel's gate DSO, for example.  */
       phdr = info->dlpi_phdr;
       for (n = info->dlpi_phnum; --n >= 0; phdr++)
-	{
-	  if (phdr->p_type == PT_LOAD && p_unwind->p_vaddr >= phdr->p_vaddr
-	      && p_unwind->p_vaddr < phdr->p_vaddr + phdr->p_memsz)
-	    {
-	      segbase = phdr->p_vaddr + load_base;
-	      break;
-	    }
-	}
+        {
+          if (phdr->p_type == PT_LOAD && p_unwind->p_vaddr >= phdr->p_vaddr
+              && p_unwind->p_vaddr < phdr->p_vaddr + phdr->p_memsz)
+            {
+              segbase = phdr->p_vaddr + load_base;
+              break;
+            }
+        }
     }
 
   if (p_dynamic)
     {
       /* For dynamicly linked executables and shared libraries,
-	 DT_PLTGOT is the gp value for that object.  */
+         DT_PLTGOT is the gp value for that object.  */
       Elf64_Dyn *dyn = (Elf64_Dyn *)(p_dynamic->p_vaddr + load_base);
       for (; dyn->d_tag != DT_NULL; ++dyn)
-	if (dyn->d_tag == DT_PLTGOT)
-	  {
-	    /* On IA-64, _DYNAMIC is writable and GLIBC has relocated it.  */
-	    di->gp = dyn->d_un.d_ptr;
-	    break;
-	  }
+        if (dyn->d_tag == DT_PLTGOT)
+          {
+            /* On IA-64, _DYNAMIC is writable and GLIBC has relocated it.  */
+            di->gp = dyn->d_un.d_ptr;
+            break;
+          }
     }
   else
     /* Otherwise this is a static executable with no _DYNAMIC.
@@ -554,8 +555,8 @@ callback (struct dl_phdr_info *info, size_t size, void *ptr)
   di->u.ti.segbase = segbase;
 
   Debug (16, "found table `%s': segbase=%lx, len=%lu, gp=%lx, "
-	 "table_data=%p\n", (char *) di->u.ti.name_ptr, di->u.ti.segbase,
-	 di->u.ti.table_len, di->gp, di->u.ti.table_data);
+         "table_data=%p\n", (char *) di->u.ti.name_ptr, di->u.ti.segbase,
+         di->u.ti.table_len, di->gp, di->u.ti.table_data);
   return 1;
 }
 
@@ -610,7 +611,7 @@ check_callback (struct dl_phdr_info *info, size_t size, void *ptr)
 
   as->shared_object_removals = info->dlpi_subs;
   unw_flush_cache (as, 0, 0);
-  return -1;		/* indicate that there were removals */
+  return -1;            /* indicate that there were removals */
 #   else
   return 1;
 #   endif
@@ -622,9 +623,9 @@ validate_cache (unw_addr_space_t as)
   intrmask_t saved_mask;
   int ret;
 
-  sigprocmask (SIG_SETMASK, &unwi_full_mask, &saved_mask);
+  SIGPROCMASK (SIG_SETMASK, &unwi_full_mask, &saved_mask);
   ret = dl_iterate_phdr (check_callback, as);
-  sigprocmask (SIG_SETMASK, &saved_mask, NULL);
+  SIGPROCMASK (SIG_SETMASK, &saved_mask, NULL);
   return ret;
 }
 
@@ -644,32 +645,32 @@ validate_cache (unw_addr_space_t as)
 
 HIDDEN int
 tdep_find_proc_info (unw_addr_space_t as, unw_word_t ip,
-		     unw_proc_info_t *pi, int need_unwind_info, void *arg)
+                     unw_proc_info_t *pi, int need_unwind_info, void *arg)
 {
 # if defined(HAVE_DL_ITERATE_PHDR)
   unw_dyn_info_t di, *dip = &di;
   intrmask_t saved_mask;
   int ret;
 
-  di.u.ti.segbase = ip;	/* this is cheap... */
+  di.u.ti.segbase = ip; /* this is cheap... */
 
-  sigprocmask (SIG_SETMASK, &unwi_full_mask, &saved_mask);
+  SIGPROCMASK (SIG_SETMASK, &unwi_full_mask, &saved_mask);
   ret = dl_iterate_phdr (callback, &di);
-  sigprocmask (SIG_SETMASK, &saved_mask, NULL);
+  SIGPROCMASK (SIG_SETMASK, &saved_mask, NULL);
 
   if (ret <= 0)
     {
       if (!kernel_table.u.ti.table_data)
-	{
-	  if ((ret = get_kernel_table (&kernel_table)) < 0)
-	    return ret;
-	}
+        {
+          if ((ret = get_kernel_table (&kernel_table)) < 0)
+            return ret;
+        }
       if (ip < kernel_table.start_ip || ip >= kernel_table.end_ip)
-	return -UNW_ENOINFO;
+        return -UNW_ENOINFO;
       dip = &kernel_table;
     }
 # elif defined(HAVE_DLMODINFO)
-# define UNWIND_TBL_32BIT	0x8000000000000000
+# define UNWIND_TBL_32BIT       0x8000000000000000
   struct load_module_desc lmd;
   unw_dyn_info_t di, *dip = &di;
   struct unwind_header
@@ -687,7 +688,7 @@ tdep_find_proc_info (unw_addr_space_t as, unw_word_t ip,
   di.start_ip = lmd.text_base;
   di.end_ip = lmd.text_base + lmd.text_size;
   di.gp = lmd.linkage_ptr;
-  di.u.ti.name_ptr = 0;	/* no obvious table-name available */
+  di.u.ti.name_ptr = 0; /* no obvious table-name available */
   di.u.ti.segbase = lmd.text_base;
 
   uhdr = (struct unwind_header *) lmd.unwind_base;
@@ -696,7 +697,7 @@ tdep_find_proc_info (unw_addr_space_t as, unw_word_t ip,
       && (uhdr->header_version & ~UNWIND_TBL_32BIT) != 2)
     {
       Debug (1, "encountered unknown unwind header version %ld\n",
- 	     (long) (uhdr->header_version & ~UNWIND_TBL_32BIT));
+             (long) (uhdr->header_version & ~UNWIND_TBL_32BIT));
       return -UNW_EBADVERSION;
     }
   if (uhdr->header_version & UNWIND_TBL_32BIT)
@@ -707,11 +708,11 @@ tdep_find_proc_info (unw_addr_space_t as, unw_word_t ip,
 
   di.u.ti.table_data = (unw_word_t *) (di.u.ti.segbase + uhdr->start_offset);
   di.u.ti.table_len = ((uhdr->end_offset - uhdr->start_offset)
-		       / sizeof (unw_word_t));
+                       / sizeof (unw_word_t));
 
   Debug (16, "found table `%s': segbase=%lx, len=%lu, gp=%lx, "
- 	 "table_data=%p\n", (char *) di.u.ti.name_ptr, di.u.ti.segbase,
- 	 di.u.ti.table_len, di.gp, di.u.ti.table_data);
+         "table_data=%p\n", (char *) di.u.ti.name_ptr, di.u.ti.segbase,
+         di.u.ti.table_len, di.gp, di.u.ti.table_data);
 # endif
 
   /* now search the table: */
diff --git a/frysk-imports/libunwind/src/ia64/Lfind_unwind_table.c b/frysk-imports/libunwind/src/ia64/Lfind_unwind_table.c
new file mode 100644
index 0000000..68e269f
--- /dev/null
+++ b/frysk-imports/libunwind/src/ia64/Lfind_unwind_table.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Gfind_unwind_table.c"
+#endif
diff --git a/frysk-imports/libunwind/src/ia64/init.h b/frysk-imports/libunwind/src/ia64/init.h
index d6a1b22..6628a1d 100644
--- a/frysk-imports/libunwind/src/ia64/init.h
+++ b/frysk-imports/libunwind/src/ia64/init.h
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2002-2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -29,35 +29,33 @@ static ALWAYS_INLINE int
 common_init (struct cursor *c, unw_word_t sp, unw_word_t bsp)
 {
   unw_word_t bspstore, rbs_base;
-  uint8_t *natp;
   int ret;
 
   if (c->as->caching_policy != UNW_CACHE_NONE)
     /* ensure cache doesn't have any stale contents: */
     ia64_validate_cache (c->as, c->as_arg);
 
-  c->cfm_loc =			IA64_REG_LOC (c, UNW_IA64_CFM);
-  c->loc[IA64_REG_BSP] =	IA64_NULL_LOC;
-  c->loc[IA64_REG_BSPSTORE] =	IA64_REG_LOC (c, UNW_IA64_AR_BSPSTORE);
-  c->loc[IA64_REG_PFS] =	IA64_REG_LOC (c, UNW_IA64_AR_PFS);
-  c->loc[IA64_REG_RNAT] =	IA64_REG_LOC (c, UNW_IA64_AR_RNAT);
-  c->loc[IA64_REG_IP] =		IA64_REG_LOC (c, UNW_IA64_IP);
+  c->cfm_loc =                  IA64_REG_LOC (c, UNW_IA64_CFM);
+  c->loc[IA64_REG_BSP] =        IA64_NULL_LOC;
+  c->loc[IA64_REG_BSPSTORE] =   IA64_REG_LOC (c, UNW_IA64_AR_BSPSTORE);
+  c->loc[IA64_REG_PFS] =        IA64_REG_LOC (c, UNW_IA64_AR_PFS);
+  c->loc[IA64_REG_RNAT] =       IA64_REG_LOC (c, UNW_IA64_AR_RNAT);
+  c->loc[IA64_REG_IP] =         IA64_REG_LOC (c, UNW_IA64_IP);
   c->loc[IA64_REG_PRI_UNAT_MEM] = IA64_NULL_LOC; /* no primary UNaT location */
-  c->loc[IA64_REG_UNAT] =	IA64_REG_LOC (c, UNW_IA64_AR_UNAT);
-  c->loc[IA64_REG_PR] =		IA64_REG_LOC (c, UNW_IA64_PR);
-  c->loc[IA64_REG_LC] =		IA64_REG_LOC (c, UNW_IA64_AR_LC);
-  c->loc[IA64_REG_FPSR] =	IA64_REG_LOC (c, UNW_IA64_AR_FPSR);
+  c->loc[IA64_REG_UNAT] =       IA64_REG_LOC (c, UNW_IA64_AR_UNAT);
+  c->loc[IA64_REG_PR] =         IA64_REG_LOC (c, UNW_IA64_PR);
+  c->loc[IA64_REG_LC] =         IA64_REG_LOC (c, UNW_IA64_AR_LC);
+  c->loc[IA64_REG_FPSR] =       IA64_REG_LOC (c, UNW_IA64_AR_FPSR);
 
   c->loc[IA64_REG_R4] = IA64_REG_LOC (c, UNW_IA64_GR + 4);
   c->loc[IA64_REG_R5] = IA64_REG_LOC (c, UNW_IA64_GR + 5);
   c->loc[IA64_REG_R6] = IA64_REG_LOC (c, UNW_IA64_GR + 6);
   c->loc[IA64_REG_R7] = IA64_REG_LOC (c, UNW_IA64_GR + 7);
 
-  natp = c->nat_bitnr;
-  c->loc[IA64_REG_NAT4] = IA64_REG_NAT_LOC (c, UNW_IA64_NAT + 4, &natp[0]);
-  c->loc[IA64_REG_NAT5] = IA64_REG_NAT_LOC (c, UNW_IA64_NAT + 5, &natp[1]);
-  c->loc[IA64_REG_NAT6] = IA64_REG_NAT_LOC (c, UNW_IA64_NAT + 6, &natp[2]);
-  c->loc[IA64_REG_NAT7] = IA64_REG_NAT_LOC (c, UNW_IA64_NAT + 7, &natp[3]);
+  c->loc[IA64_REG_NAT4] = IA64_REG_NAT_LOC (c, UNW_IA64_NAT + 4, &c->nat_bitnr[0]);
+  c->loc[IA64_REG_NAT5] = IA64_REG_NAT_LOC (c, UNW_IA64_NAT + 5, &c->nat_bitnr[1]);
+  c->loc[IA64_REG_NAT6] = IA64_REG_NAT_LOC (c, UNW_IA64_NAT + 6, &c->nat_bitnr[2]);
+  c->loc[IA64_REG_NAT7] = IA64_REG_NAT_LOC (c, UNW_IA64_NAT + 7, &c->nat_bitnr[3]);
 
   c->loc[IA64_REG_B1] = IA64_REG_LOC (c, UNW_IA64_BR + 1);
   c->loc[IA64_REG_B2] = IA64_REG_LOC (c, UNW_IA64_BR + 2);
@@ -117,8 +115,8 @@ common_init (struct cursor *c, unw_word_t sp, unw_word_t bsp)
   c->rbs_area[0].size = bspstore - rbs_base;
   c->rbs_area[0].rnat_loc = IA64_REG_LOC (c, UNW_IA64_AR_RNAT);
   Debug (10, "initial rbs-area: [0x%llx-0x%llx), rnat@%s\n",
-	 (long long) rbs_base, (long long) c->rbs_area[0].end,
-	 ia64_strloc (c->rbs_area[0].rnat_loc));
+         (long long) rbs_base, (long long) c->rbs_area[0].end,
+         ia64_strloc (c->rbs_area[0].rnat_loc));
 
   c->pi.flags = 0;
 
diff --git a/frysk-imports/libunwind/src/ia64/mk_Gcursor_i.c b/frysk-imports/libunwind/src/ia64/mk_Gcursor_i.c
index 51cb0f4..67b14d5 100644
--- a/frysk-imports/libunwind/src/ia64/mk_Gcursor_i.c
+++ b/frysk-imports/libunwind/src/ia64/mk_Gcursor_i.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -25,82 +25,41 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 /* Utility to generate cursor_i.h.  */
 
-#include <stdio.h>
-
 #include "libunwind_i.h"
 
 #ifdef offsetof
 # undef offsetof
 #endif
 
-#define offsetof(type,field)	((char *) &((type *) 0)->field - (char *) 0)
-
-static struct
-  {
-    const char name[256];
-    unsigned long value;
-  }
-tab[] =
-  {
-    { "IP_OFF",		offsetof (struct cursor, ip) },
-    { "PR_OFF",		offsetof (struct cursor, pr) },
-    { "BSP_OFF",	offsetof (struct cursor, bsp) },
-    { "PSP_OFF",	offsetof (struct cursor, psp) },
-    { "PFS_LOC_OFF",	offsetof (struct cursor, loc[IA64_REG_PFS]) },
-    { "RNAT_LOC_OFF",	offsetof (struct cursor, loc[IA64_REG_RNAT]) },
-    { "UNAT_LOC_OFF",	offsetof (struct cursor, loc[IA64_REG_UNAT]) },
-    { "LC_LOC_OFF",	offsetof (struct cursor, loc[IA64_REG_LC]) },
-    { "FPSR_LOC_OFF",	offsetof (struct cursor, loc[IA64_REG_FPSR]) },
-    { "B1_LOC_OFF",	offsetof (struct cursor, loc[IA64_REG_B1]) },
-    { "B2_LOC_OFF",	offsetof (struct cursor, loc[IA64_REG_B2]) },
-    { "B3_LOC_OFF",	offsetof (struct cursor, loc[IA64_REG_B3]) },
-    { "B4_LOC_OFF",	offsetof (struct cursor, loc[IA64_REG_B4]) },
-    { "B5_LOC_OFF",	offsetof (struct cursor, loc[IA64_REG_B5]) },
-    { "F2_LOC_OFF",	offsetof (struct cursor, loc[IA64_REG_F2]) },
-    { "F3_LOC_OFF",	offsetof (struct cursor, loc[IA64_REG_F3]) },
-    { "F4_LOC_OFF",	offsetof (struct cursor, loc[IA64_REG_F4]) },
-    { "F5_LOC_OFF",	offsetof (struct cursor, loc[IA64_REG_F5]) },
-    { "FR_LOC_OFF",	offsetof (struct cursor, loc[IA64_REG_F16]) },
-    { "LOC_SIZE",
-      (offsetof (struct cursor, loc[1]) - offsetof (struct cursor, loc[0]))
-    },
-    { "SIGCONTEXT_ADDR_OFF",	offsetof (struct cursor, sigcontext_addr) },
-};
+#define offsetof(type,field)    ((char *) &((type *) 0)->field - (char *) 0)
 
-static const char *tabs = "\t\t\t\t\t\t\t\t\t\t";
+#define OFFSET(sym, offset) \
+        asm volatile("\n->" #sym " %0" : : "i" (offset))
 
 int
-main (int argc, char **argv)
+main (void)
 {
-  const char *space;
-  int i, num_tabs;
-  size_t len;
-
-  printf ("#ifndef cursor_i_h\n");
-  printf ("#define cursor_i_h\n\n");
-
-  printf ("/*\n * DO NOT MODIFY\n *\n * This file was generated by "
-	  "%s.\n *\n */\n\n", argv[0]);
-
-  for (i = 0; i < (int) (sizeof (tab) / sizeof (tab[0])); ++i)
-    {
-      if (tab[i].name[0] == '\0')
-	printf ("\n");
-      else
-	{
-	  len = strlen (tab[i].name);
-
-	  num_tabs = (40 - len) / 8;
-	  if (num_tabs <= 0)
-	    space = " ";
-	  else
-	    space = strchr(tabs, '\0') - (40 - len) / 8;
-
-	  printf ("#define %s%s%lu\t/* 0x%lx */\n",
-		  tab[i].name, space, tab[i].value, tab[i].value);
-	}
-    }
-
-  printf ("\n#endif /* cursor_i_h */\n");
+  OFFSET("IP_OFF",       offsetof (struct cursor, ip));
+  OFFSET("PR_OFF",       offsetof (struct cursor, pr));
+  OFFSET("BSP_OFF",      offsetof (struct cursor, bsp));
+  OFFSET("PSP_OFF",      offsetof (struct cursor, psp));
+  OFFSET("PFS_LOC_OFF",  offsetof (struct cursor, loc[IA64_REG_PFS]));
+  OFFSET("RNAT_LOC_OFF", offsetof (struct cursor, loc[IA64_REG_RNAT]));
+  OFFSET("UNAT_LOC_OFF", offsetof (struct cursor, loc[IA64_REG_UNAT]));
+  OFFSET("LC_LOC_OFF",   offsetof (struct cursor, loc[IA64_REG_LC]));
+  OFFSET("FPSR_LOC_OFF", offsetof (struct cursor, loc[IA64_REG_FPSR]));
+  OFFSET("B1_LOC_OFF",   offsetof (struct cursor, loc[IA64_REG_B1]));
+  OFFSET("B2_LOC_OFF",   offsetof (struct cursor, loc[IA64_REG_B2]));
+  OFFSET("B3_LOC_OFF",   offsetof (struct cursor, loc[IA64_REG_B3]));
+  OFFSET("B4_LOC_OFF",   offsetof (struct cursor, loc[IA64_REG_B4]));
+  OFFSET("B5_LOC_OFF",   offsetof (struct cursor, loc[IA64_REG_B5]));
+  OFFSET("F2_LOC_OFF",   offsetof (struct cursor, loc[IA64_REG_F2]));
+  OFFSET("F3_LOC_OFF",   offsetof (struct cursor, loc[IA64_REG_F3]));
+  OFFSET("F4_LOC_OFF",   offsetof (struct cursor, loc[IA64_REG_F4]));
+  OFFSET("F5_LOC_OFF",   offsetof (struct cursor, loc[IA64_REG_F5]));
+  OFFSET("FR_LOC_OFF",   offsetof (struct cursor, loc[IA64_REG_F16]));
+  OFFSET("LOC_SIZE",
+      (offsetof (struct cursor, loc[1]) - offsetof (struct cursor, loc[0])));
+  OFFSET("SIGCONTEXT_ADDR_OFF", offsetof (struct cursor, sigcontext_addr));
   return 0;
 }
diff --git a/frysk-imports/libunwind/src/ia64/mk_cursor_i b/frysk-imports/libunwind/src/ia64/mk_cursor_i
new file mode 100755
index 0000000..9211f91
--- /dev/null
+++ b/frysk-imports/libunwind/src/ia64/mk_cursor_i
@@ -0,0 +1,7 @@
+#!/bin/sh
+test -z "$1" && exit 1
+echo "/* GENERATED */"
+echo "#ifndef cursor_i_h"
+echo "#define cursor_i_h"
+sed -ne 's/^->"\(\S*\)" \(\d*\)/#define \1 \2/p' < $1 || exit $?
+echo "#endif"
diff --git a/frysk-imports/libunwind/src/ia64/offsets.h b/frysk-imports/libunwind/src/ia64/offsets.h
index b169933..5ab7f8b 100644
--- a/frysk-imports/libunwind/src/ia64/offsets.h
+++ b/frysk-imports/libunwind/src/ia64/offsets.h
@@ -6,132 +6,132 @@
    number, siginfo pointer, and sigcontext pointer passed to the
    signal handler.  We use this to locate the sigcontext pointer.  */
 
-#define LINUX_SIGFRAME_ARG2_OFF	0x10
+#define LINUX_SIGFRAME_ARG2_OFF 0x10
 
-#define LINUX_SC_FLAGS_OFF	0x000
-#define LINUX_SC_NAT_OFF	0x008
-#define LINUX_SC_STACK_OFF	0x010
-#define LINUX_SC_IP_OFF		0x028
-#define LINUX_SC_CFM_OFF	0x030
-#define LINUX_SC_UM_OFF		0x038
-#define LINUX_SC_AR_RSC_OFF	0x040
-#define LINUX_SC_AR_BSP_OFF	0x048
-#define LINUX_SC_AR_RNAT_OFF	0x050
-#define LINUX_SC_AR_CCV		0x058
-#define LINUX_SC_AR_UNAT_OFF	0x060
-#define LINUX_SC_AR_FPSR_OFF	0x068
-#define LINUX_SC_AR_PFS_OFF	0x070
-#define LINUX_SC_AR_LC_OFF	0x078
-#define LINUX_SC_PR_OFF		0x080
-#define LINUX_SC_BR_OFF		0x088
-#define LINUX_SC_GR_OFF		0x0c8
-#define LINUX_SC_FR_OFF		0x1d0
-#define LINUX_SC_RBS_BASE_OFF	0x9d0
-#define LINUX_SC_LOADRS_OFF	0x9d8
-#define LINUX_SC_AR_CSD_OFF	0x9e0
-#define LINUX_SC_AR_SSD_OFF	0x9e8
-#define LINUX_SC_MASK		0xa50
+#define LINUX_SC_FLAGS_OFF      0x000
+#define LINUX_SC_NAT_OFF        0x008
+#define LINUX_SC_STACK_OFF      0x010
+#define LINUX_SC_IP_OFF         0x028
+#define LINUX_SC_CFM_OFF        0x030
+#define LINUX_SC_UM_OFF         0x038
+#define LINUX_SC_AR_RSC_OFF     0x040
+#define LINUX_SC_AR_BSP_OFF     0x048
+#define LINUX_SC_AR_RNAT_OFF    0x050
+#define LINUX_SC_AR_CCV         0x058
+#define LINUX_SC_AR_UNAT_OFF    0x060
+#define LINUX_SC_AR_FPSR_OFF    0x068
+#define LINUX_SC_AR_PFS_OFF     0x070
+#define LINUX_SC_AR_LC_OFF      0x078
+#define LINUX_SC_PR_OFF         0x080
+#define LINUX_SC_BR_OFF         0x088
+#define LINUX_SC_GR_OFF         0x0c8
+#define LINUX_SC_FR_OFF         0x1d0
+#define LINUX_SC_RBS_BASE_OFF   0x9d0
+#define LINUX_SC_LOADRS_OFF     0x9d8
+#define LINUX_SC_AR_CSD_OFF     0x9e0
+#define LINUX_SC_AR_SSD_OFF     0x9e8
+#define LINUX_SC_MASK           0xa50
 
 /* Layout of old Linux kernel interrupt frame (struct pt_regs).  */
 
-#define LINUX_OLD_PT_IPSR_OFF	0x000
-#define LINUX_OLD_PT_IIP_OFF	0x008
-#define LINUX_OLD_PT_IFS_OFF	0x010
-#define LINUX_OLD_PT_UNAT_OFF	0x018
-#define LINUX_OLD_PT_PFS_OFF	0x020
-#define LINUX_OLD_PT_RSC_OFF	0x028
-#define LINUX_OLD_PT_RNAT_OFF	0x030
+#define LINUX_OLD_PT_IPSR_OFF   0x000
+#define LINUX_OLD_PT_IIP_OFF    0x008
+#define LINUX_OLD_PT_IFS_OFF    0x010
+#define LINUX_OLD_PT_UNAT_OFF   0x018
+#define LINUX_OLD_PT_PFS_OFF    0x020
+#define LINUX_OLD_PT_RSC_OFF    0x028
+#define LINUX_OLD_PT_RNAT_OFF   0x030
 #define LINUX_OLD_PT_BSPSTORE_OFF 0x038
-#define LINUX_OLD_PT_PR_OFF	0x040
-#define LINUX_OLD_PT_B6_OFF	0x048
-#define LINUX_OLD_PT_LOADRS_OFF	0x050
-#define LINUX_OLD_PT_R1_OFF	0x058
-#define LINUX_OLD_PT_R2_OFF	0x060
-#define LINUX_OLD_PT_R3_OFF	0x068
-#define LINUX_OLD_PT_R12_OFF	0x070
-#define LINUX_OLD_PT_R13_OFF	0x078
-#define LINUX_OLD_PT_R14_OFF	0x080
-#define LINUX_OLD_PT_R15_OFF	0x088
-#define LINUX_OLD_PT_R8_OFF	0x090
-#define LINUX_OLD_PT_R9_OFF	0x098
-#define LINUX_OLD_PT_R10_OFF	0x0a0
-#define LINUX_OLD_PT_R11_OFF	0x0a8
-#define LINUX_OLD_PT_R16_OFF	0x0b0
-#define LINUX_OLD_PT_R17_OFF	0x0b8
-#define LINUX_OLD_PT_R18_OFF	0x0c0
-#define LINUX_OLD_PT_R19_OFF	0x0c8
-#define LINUX_OLD_PT_R20_OFF	0x0d0
-#define LINUX_OLD_PT_R21_OFF	0x0d8
-#define LINUX_OLD_PT_R22_OFF	0x0e0
-#define LINUX_OLD_PT_R23_OFF	0x0e8
-#define LINUX_OLD_PT_R24_OFF	0x0f0
-#define LINUX_OLD_PT_R25_OFF	0x0f8
-#define LINUX_OLD_PT_R26_OFF	0x100
-#define LINUX_OLD_PT_R27_OFF	0x108
-#define LINUX_OLD_PT_R28_OFF	0x110
-#define LINUX_OLD_PT_R29_OFF	0x118
-#define LINUX_OLD_PT_R30_OFF	0x120
-#define LINUX_OLD_PT_R31_OFF	0x128
-#define LINUX_OLD_PT_CCV_OFF	0x130
-#define LINUX_OLD_PT_FPSR_OFF	0x138
-#define LINUX_OLD_PT_B0_OFF	0x140
-#define LINUX_OLD_PT_B7_OFF	0x148
-#define LINUX_OLD_PT_F6_OFF	0x150
-#define LINUX_OLD_PT_F7_OFF	0x160
-#define LINUX_OLD_PT_F8_OFF	0x170
-#define LINUX_OLD_PT_F9_OFF	0x180
+#define LINUX_OLD_PT_PR_OFF     0x040
+#define LINUX_OLD_PT_B6_OFF     0x048
+#define LINUX_OLD_PT_LOADRS_OFF 0x050
+#define LINUX_OLD_PT_R1_OFF     0x058
+#define LINUX_OLD_PT_R2_OFF     0x060
+#define LINUX_OLD_PT_R3_OFF     0x068
+#define LINUX_OLD_PT_R12_OFF    0x070
+#define LINUX_OLD_PT_R13_OFF    0x078
+#define LINUX_OLD_PT_R14_OFF    0x080
+#define LINUX_OLD_PT_R15_OFF    0x088
+#define LINUX_OLD_PT_R8_OFF     0x090
+#define LINUX_OLD_PT_R9_OFF     0x098
+#define LINUX_OLD_PT_R10_OFF    0x0a0
+#define LINUX_OLD_PT_R11_OFF    0x0a8
+#define LINUX_OLD_PT_R16_OFF    0x0b0
+#define LINUX_OLD_PT_R17_OFF    0x0b8
+#define LINUX_OLD_PT_R18_OFF    0x0c0
+#define LINUX_OLD_PT_R19_OFF    0x0c8
+#define LINUX_OLD_PT_R20_OFF    0x0d0
+#define LINUX_OLD_PT_R21_OFF    0x0d8
+#define LINUX_OLD_PT_R22_OFF    0x0e0
+#define LINUX_OLD_PT_R23_OFF    0x0e8
+#define LINUX_OLD_PT_R24_OFF    0x0f0
+#define LINUX_OLD_PT_R25_OFF    0x0f8
+#define LINUX_OLD_PT_R26_OFF    0x100
+#define LINUX_OLD_PT_R27_OFF    0x108
+#define LINUX_OLD_PT_R28_OFF    0x110
+#define LINUX_OLD_PT_R29_OFF    0x118
+#define LINUX_OLD_PT_R30_OFF    0x120
+#define LINUX_OLD_PT_R31_OFF    0x128
+#define LINUX_OLD_PT_CCV_OFF    0x130
+#define LINUX_OLD_PT_FPSR_OFF   0x138
+#define LINUX_OLD_PT_B0_OFF     0x140
+#define LINUX_OLD_PT_B7_OFF     0x148
+#define LINUX_OLD_PT_F6_OFF     0x150
+#define LINUX_OLD_PT_F7_OFF     0x160
+#define LINUX_OLD_PT_F8_OFF     0x170
+#define LINUX_OLD_PT_F9_OFF     0x180
 
 /* Layout of new Linux kernel interrupt frame (struct pt_regs).  */
 
-#define LINUX_PT_B6_OFF		0
-#define LINUX_PT_B7_OFF		8
-#define LINUX_PT_CSD_OFF	16
-#define LINUX_PT_SSD_OFF	24
-#define LINUX_PT_R8_OFF		32
-#define LINUX_PT_R9_OFF		40
-#define LINUX_PT_R10_OFF	48
-#define LINUX_PT_R11_OFF	56
-#define LINUX_PT_IPSR_OFF	64
-#define LINUX_PT_IIP_OFF	72
-#define LINUX_PT_IFS_OFF	80
-#define LINUX_PT_UNAT_OFF	88
-#define LINUX_PT_PFS_OFF	96
-#define LINUX_PT_RSC_OFF	104
-#define LINUX_PT_RNAT_OFF	112
-#define LINUX_PT_BSPSTORE_OFF	120
-#define LINUX_PT_PR_OFF		128
-#define LINUX_PT_B0_OFF		136
-#define LINUX_PT_LOADRS_OFF	144
-#define LINUX_PT_R1_OFF		152
-#define LINUX_PT_R12_OFF	160
-#define LINUX_PT_R13_OFF	168
-#define LINUX_PT_FPSR_OFF	176
-#define LINUX_PT_R15_OFF	184
-#define LINUX_PT_R14_OFF	192
-#define LINUX_PT_R2_OFF		200
-#define LINUX_PT_R3_OFF		208
-#define LINUX_PT_R16_OFF	216
-#define LINUX_PT_R17_OFF	224
-#define LINUX_PT_R18_OFF	232
-#define LINUX_PT_R19_OFF	240
-#define LINUX_PT_R20_OFF	248
-#define LINUX_PT_R21_OFF	256
-#define LINUX_PT_R22_OFF	264
-#define LINUX_PT_R23_OFF	272
-#define LINUX_PT_R24_OFF	280
-#define LINUX_PT_R25_OFF	288
-#define LINUX_PT_R26_OFF	296
-#define LINUX_PT_R27_OFF	304
-#define LINUX_PT_R28_OFF	312
-#define LINUX_PT_R29_OFF	320
-#define LINUX_PT_R30_OFF	328
-#define LINUX_PT_R31_OFF	336
-#define LINUX_PT_CCV_OFF	344
-#define LINUX_PT_F6_OFF		352
-#define LINUX_PT_F7_OFF		368
-#define LINUX_PT_F8_OFF		384
-#define LINUX_PT_F9_OFF		400
-#define LINUX_PT_F10_OFF	416
-#define LINUX_PT_F11_OFF	432
+#define LINUX_PT_B6_OFF         0
+#define LINUX_PT_B7_OFF         8
+#define LINUX_PT_CSD_OFF        16
+#define LINUX_PT_SSD_OFF        24
+#define LINUX_PT_R8_OFF         32
+#define LINUX_PT_R9_OFF         40
+#define LINUX_PT_R10_OFF        48
+#define LINUX_PT_R11_OFF        56
+#define LINUX_PT_IPSR_OFF       64
+#define LINUX_PT_IIP_OFF        72
+#define LINUX_PT_IFS_OFF        80
+#define LINUX_PT_UNAT_OFF       88
+#define LINUX_PT_PFS_OFF        96
+#define LINUX_PT_RSC_OFF        104
+#define LINUX_PT_RNAT_OFF       112
+#define LINUX_PT_BSPSTORE_OFF   120
+#define LINUX_PT_PR_OFF         128
+#define LINUX_PT_B0_OFF         136
+#define LINUX_PT_LOADRS_OFF     144
+#define LINUX_PT_R1_OFF         152
+#define LINUX_PT_R12_OFF        160
+#define LINUX_PT_R13_OFF        168
+#define LINUX_PT_FPSR_OFF       176
+#define LINUX_PT_R15_OFF        184
+#define LINUX_PT_R14_OFF        192
+#define LINUX_PT_R2_OFF         200
+#define LINUX_PT_R3_OFF         208
+#define LINUX_PT_R16_OFF        216
+#define LINUX_PT_R17_OFF        224
+#define LINUX_PT_R18_OFF        232
+#define LINUX_PT_R19_OFF        240
+#define LINUX_PT_R20_OFF        248
+#define LINUX_PT_R21_OFF        256
+#define LINUX_PT_R22_OFF        264
+#define LINUX_PT_R23_OFF        272
+#define LINUX_PT_R24_OFF        280
+#define LINUX_PT_R25_OFF        288
+#define LINUX_PT_R26_OFF        296
+#define LINUX_PT_R27_OFF        304
+#define LINUX_PT_R28_OFF        312
+#define LINUX_PT_R29_OFF        320
+#define LINUX_PT_R30_OFF        328
+#define LINUX_PT_R31_OFF        336
+#define LINUX_PT_CCV_OFF        344
+#define LINUX_PT_F6_OFF         352
+#define LINUX_PT_F7_OFF         368
+#define LINUX_PT_F8_OFF         384
+#define LINUX_PT_F9_OFF         400
+#define LINUX_PT_F10_OFF        416
+#define LINUX_PT_F11_OFF        432
 
-#define LINUX_PT_P_NONSYS	5	/* must match pNonSys in entry.h */
+#define LINUX_PT_P_NONSYS       5       /* must match pNonSys in entry.h */
diff --git a/frysk-imports/libunwind/src/ia64/regname.c b/frysk-imports/libunwind/src/ia64/regname.c
index 4936a3d..8753e52 100644
--- a/frysk-imports/libunwind/src/ia64/regname.c
+++ b/frysk-imports/libunwind/src/ia64/regname.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2002-2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -42,142 +42,142 @@ purpose.  */
 /* Maintain the register names as a single string to keep the number
    of dynamic relocations in the shared object to a minimum.  */
 
-#define regname_len	9
-#define regname_str							\
-  "r0\0\0\0\0\0\0\0r1\0\0\0\0\0\0\0r2\0\0\0\0\0\0\0r3\0\0\0\0\0\0\0"	\
-  "r4\0\0\0\0\0\0\0r5\0\0\0\0\0\0\0r6\0\0\0\0\0\0\0r7\0\0\0\0\0\0\0"	\
-  "r8\0\0\0\0\0\0\0r9\0\0\0\0\0\0\0r10\0\0\0\0\0\0r11\0\0\0\0\0\0"	\
-  "r12\0\0\0\0\0\0r13\0\0\0\0\0\0r14\0\0\0\0\0\0r15\0\0\0\0\0\0"	\
-  "r16\0\0\0\0\0\0r17\0\0\0\0\0\0r18\0\0\0\0\0\0r19\0\0\0\0\0\0"	\
-  "r20\0\0\0\0\0\0r21\0\0\0\0\0\0r22\0\0\0\0\0\0r23\0\0\0\0\0\0"	\
-  "r24\0\0\0\0\0\0r25\0\0\0\0\0\0r26\0\0\0\0\0\0r27\0\0\0\0\0\0"	\
-  "r28\0\0\0\0\0\0r29\0\0\0\0\0\0r30\0\0\0\0\0\0r31\0\0\0\0\0\0"	\
-  "r32\0\0\0\0\0\0r33\0\0\0\0\0\0r34\0\0\0\0\0\0r35\0\0\0\0\0\0"	\
-  "r36\0\0\0\0\0\0r37\0\0\0\0\0\0r38\0\0\0\0\0\0r39\0\0\0\0\0\0"	\
-  "r40\0\0\0\0\0\0r41\0\0\0\0\0\0r42\0\0\0\0\0\0r43\0\0\0\0\0\0"	\
-  "r44\0\0\0\0\0\0r45\0\0\0\0\0\0r46\0\0\0\0\0\0r47\0\0\0\0\0\0"	\
-  "r48\0\0\0\0\0\0r49\0\0\0\0\0\0r50\0\0\0\0\0\0r51\0\0\0\0\0\0"	\
-  "r52\0\0\0\0\0\0r53\0\0\0\0\0\0r54\0\0\0\0\0\0r55\0\0\0\0\0\0"	\
-  "r56\0\0\0\0\0\0r57\0\0\0\0\0\0r58\0\0\0\0\0\0r59\0\0\0\0\0\0"	\
-  "r60\0\0\0\0\0\0r61\0\0\0\0\0\0r62\0\0\0\0\0\0r63\0\0\0\0\0\0"	\
-  "r64\0\0\0\0\0\0r65\0\0\0\0\0\0r66\0\0\0\0\0\0r67\0\0\0\0\0\0"	\
-  "r68\0\0\0\0\0\0r69\0\0\0\0\0\0r70\0\0\0\0\0\0r71\0\0\0\0\0\0"	\
-  "r72\0\0\0\0\0\0r73\0\0\0\0\0\0r74\0\0\0\0\0\0r75\0\0\0\0\0\0"	\
-  "r76\0\0\0\0\0\0r77\0\0\0\0\0\0r78\0\0\0\0\0\0r79\0\0\0\0\0\0"	\
-  "r80\0\0\0\0\0\0r81\0\0\0\0\0\0r82\0\0\0\0\0\0r83\0\0\0\0\0\0"	\
-  "r84\0\0\0\0\0\0r85\0\0\0\0\0\0r86\0\0\0\0\0\0r87\0\0\0\0\0\0"	\
-  "r88\0\0\0\0\0\0r89\0\0\0\0\0\0r90\0\0\0\0\0\0r91\0\0\0\0\0\0"	\
-  "r92\0\0\0\0\0\0r93\0\0\0\0\0\0r94\0\0\0\0\0\0r95\0\0\0\0\0\0"	\
-  "r96\0\0\0\0\0\0r97\0\0\0\0\0\0r98\0\0\0\0\0\0r99\0\0\0\0\0\0"	\
-  "r100\0\0\0\0\0r101\0\0\0\0\0r102\0\0\0\0\0r103\0\0\0\0\0"		\
-  "r104\0\0\0\0\0r105\0\0\0\0\0r106\0\0\0\0\0r107\0\0\0\0\0"		\
-  "r108\0\0\0\0\0r109\0\0\0\0\0r110\0\0\0\0\0r111\0\0\0\0\0"		\
-  "r112\0\0\0\0\0r113\0\0\0\0\0r114\0\0\0\0\0r115\0\0\0\0\0"		\
-  "r116\0\0\0\0\0r117\0\0\0\0\0r118\0\0\0\0\0r119\0\0\0\0\0"		\
-  "r120\0\0\0\0\0r121\0\0\0\0\0r122\0\0\0\0\0r123\0\0\0\0\0"		\
-  "r124\0\0\0\0\0r125\0\0\0\0\0r126\0\0\0\0\0r127\0\0\0\0\0"		\
-  "nat0\0\0\0\0\0nat1\0\0\0\0\0nat2\0\0\0\0\0nat3\0\0\0\0\0"		\
-  "nat4\0\0\0\0\0nat5\0\0\0\0\0nat6\0\0\0\0\0nat7\0\0\0\0\0"		\
-  "nat8\0\0\0\0\0nat9\0\0\0\0\0nat10\0\0\0\0nat11\0\0\0\0"		\
-  "nat12\0\0\0\0nat13\0\0\0\0nat14\0\0\0\0nat15\0\0\0\0"		\
-  "nat16\0\0\0\0nat17\0\0\0\0nat18\0\0\0\0nat19\0\0\0\0"		\
-  "nat20\0\0\0\0nat21\0\0\0\0nat22\0\0\0\0nat23\0\0\0\0"		\
-  "nat24\0\0\0\0nat25\0\0\0\0nat26\0\0\0\0nat27\0\0\0\0"		\
-  "nat28\0\0\0\0nat29\0\0\0\0nat30\0\0\0\0nat31\0\0\0\0"		\
-  "nat32\0\0\0\0nat33\0\0\0\0nat34\0\0\0\0nat35\0\0\0\0"		\
-  "nat36\0\0\0\0nat37\0\0\0\0nat38\0\0\0\0nat39\0\0\0\0"		\
-  "nat40\0\0\0\0nat41\0\0\0\0nat42\0\0\0\0nat43\0\0\0\0"		\
-  "nat44\0\0\0\0nat45\0\0\0\0nat46\0\0\0\0nat47\0\0\0\0"		\
-  "nat48\0\0\0\0nat49\0\0\0\0nat50\0\0\0\0nat51\0\0\0\0"		\
-  "nat52\0\0\0\0nat53\0\0\0\0nat54\0\0\0\0nat55\0\0\0\0"		\
-  "nat56\0\0\0\0nat57\0\0\0\0nat58\0\0\0\0nat59\0\0\0\0"		\
-  "nat60\0\0\0\0nat61\0\0\0\0nat62\0\0\0\0nat63\0\0\0\0"		\
-  "nat64\0\0\0\0nat65\0\0\0\0nat66\0\0\0\0nat67\0\0\0\0"		\
-  "nat68\0\0\0\0nat69\0\0\0\0nat70\0\0\0\0nat71\0\0\0\0"		\
-  "nat72\0\0\0\0nat73\0\0\0\0nat74\0\0\0\0nat75\0\0\0\0"		\
-  "nat76\0\0\0\0nat77\0\0\0\0nat78\0\0\0\0nat79\0\0\0\0"		\
-  "nat80\0\0\0\0nat81\0\0\0\0nat82\0\0\0\0nat83\0\0\0\0"		\
-  "nat84\0\0\0\0nat85\0\0\0\0nat86\0\0\0\0nat87\0\0\0\0"		\
-  "nat88\0\0\0\0nat89\0\0\0\0nat90\0\0\0\0nat91\0\0\0\0"		\
-  "nat92\0\0\0\0nat93\0\0\0\0nat94\0\0\0\0nat95\0\0\0\0"		\
-  "nat96\0\0\0\0nat97\0\0\0\0nat98\0\0\0\0nat99\0\0\0\0"		\
-  "nat100\0\0\0nat101\0\0\0nat102\0\0\0nat103\0\0\0"			\
-  "nat104\0\0\0nat105\0\0\0nat106\0\0\0nat107\0\0\0"			\
-  "nat108\0\0\0nat109\0\0\0nat110\0\0\0nat111\0\0\0"			\
-  "nat112\0\0\0nat113\0\0\0nat114\0\0\0nat115\0\0\0"			\
-  "nat116\0\0\0nat117\0\0\0nat118\0\0\0nat119\0\0\0"			\
-  "nat120\0\0\0nat121\0\0\0nat122\0\0\0nat123\0\0\0"			\
-  "nat124\0\0\0nat125\0\0\0nat126\0\0\0nat127\0\0\0"			\
-  "f0\0\0\0\0\0\0\0f1\0\0\0\0\0\0\0f2\0\0\0\0\0\0\0f3\0\0\0\0\0\0\0"	\
-  "f4\0\0\0\0\0\0\0f5\0\0\0\0\0\0\0f6\0\0\0\0\0\0\0f7\0\0\0\0\0\0\0"	\
-  "f8\0\0\0\0\0\0\0f9\0\0\0\0\0\0\0f10\0\0\0\0\0\0f11\0\0\0\0\0\0"	\
-  "f12\0\0\0\0\0\0f13\0\0\0\0\0\0f14\0\0\0\0\0\0f15\0\0\0\0\0\0"	\
-  "f16\0\0\0\0\0\0f17\0\0\0\0\0\0f18\0\0\0\0\0\0f19\0\0\0\0\0\0"	\
-  "f20\0\0\0\0\0\0f21\0\0\0\0\0\0f22\0\0\0\0\0\0f23\0\0\0\0\0\0"	\
-  "f24\0\0\0\0\0\0f25\0\0\0\0\0\0f26\0\0\0\0\0\0f27\0\0\0\0\0\0"	\
-  "f28\0\0\0\0\0\0f29\0\0\0\0\0\0f30\0\0\0\0\0\0f31\0\0\0\0\0\0"	\
-  "f32\0\0\0\0\0\0f33\0\0\0\0\0\0f34\0\0\0\0\0\0f35\0\0\0\0\0\0"	\
-  "f36\0\0\0\0\0\0f37\0\0\0\0\0\0f38\0\0\0\0\0\0f39\0\0\0\0\0\0"	\
-  "f40\0\0\0\0\0\0f41\0\0\0\0\0\0f42\0\0\0\0\0\0f43\0\0\0\0\0\0"	\
-  "f44\0\0\0\0\0\0f45\0\0\0\0\0\0f46\0\0\0\0\0\0f47\0\0\0\0\0\0"	\
-  "f48\0\0\0\0\0\0f49\0\0\0\0\0\0f50\0\0\0\0\0\0f51\0\0\0\0\0\0"	\
-  "f52\0\0\0\0\0\0f53\0\0\0\0\0\0f54\0\0\0\0\0\0f55\0\0\0\0\0\0"	\
-  "f56\0\0\0\0\0\0f57\0\0\0\0\0\0f58\0\0\0\0\0\0f59\0\0\0\0\0\0"	\
-  "f60\0\0\0\0\0\0f61\0\0\0\0\0\0f62\0\0\0\0\0\0f63\0\0\0\0\0\0"	\
-  "f64\0\0\0\0\0\0f65\0\0\0\0\0\0f66\0\0\0\0\0\0f67\0\0\0\0\0\0"	\
-  "f68\0\0\0\0\0\0f69\0\0\0\0\0\0f70\0\0\0\0\0\0f71\0\0\0\0\0\0"	\
-  "f72\0\0\0\0\0\0f73\0\0\0\0\0\0f74\0\0\0\0\0\0f75\0\0\0\0\0\0"	\
-  "f76\0\0\0\0\0\0f77\0\0\0\0\0\0f78\0\0\0\0\0\0f79\0\0\0\0\0\0"	\
-  "f80\0\0\0\0\0\0f81\0\0\0\0\0\0f82\0\0\0\0\0\0f83\0\0\0\0\0\0"	\
-  "f84\0\0\0\0\0\0f85\0\0\0\0\0\0f86\0\0\0\0\0\0f87\0\0\0\0\0\0"	\
-  "f88\0\0\0\0\0\0f89\0\0\0\0\0\0f90\0\0\0\0\0\0f91\0\0\0\0\0\0"	\
-  "f92\0\0\0\0\0\0f93\0\0\0\0\0\0f94\0\0\0\0\0\0f95\0\0\0\0\0\0"	\
-  "f96\0\0\0\0\0\0f97\0\0\0\0\0\0f98\0\0\0\0\0\0f99\0\0\0\0\0\0"	\
-  "f100\0\0\0\0\0f101\0\0\0\0\0f102\0\0\0\0\0f103\0\0\0\0\0"		\
-  "f104\0\0\0\0\0f105\0\0\0\0\0f106\0\0\0\0\0f107\0\0\0\0\0"		\
-  "f108\0\0\0\0\0f109\0\0\0\0\0f110\0\0\0\0\0f111\0\0\0\0\0"		\
-  "f112\0\0\0\0\0f113\0\0\0\0\0f114\0\0\0\0\0f115\0\0\0\0\0"		\
-  "f116\0\0\0\0\0f117\0\0\0\0\0f118\0\0\0\0\0f119\0\0\0\0\0"		\
-  "f120\0\0\0\0\0f121\0\0\0\0\0f122\0\0\0\0\0f123\0\0\0\0\0"		\
-  "f124\0\0\0\0\0f125\0\0\0\0\0f126\0\0\0\0\0f127\0\0\0\0\0"		\
-  "ar0\0\0\0\0\0\0ar1\0\0\0\0\0\0ar2\0\0\0\0\0\0ar3\0\0\0\0\0\0"	\
-  "ar4\0\0\0\0\0\0ar5\0\0\0\0\0\0ar6\0\0\0\0\0\0ar7\0\0\0\0\0\0"	\
-  "ar8\0\0\0\0\0\0ar9\0\0\0\0\0\0ar10\0\0\0\0\0ar11\0\0\0\0\0"		\
-  "ar12\0\0\0\0\0ar13\0\0\0\0\0ar14\0\0\0\0\0ar15\0\0\0\0\0"		\
-  "rsc\0\0\0\0\0\0bsp\0\0\0\0\0\0bspstore\0rnat\0\0\0\0\0"		\
-  "ar20\0\0\0\0\0ar21\0\0\0\0\0ar22\0\0\0\0\0ar23\0\0\0\0\0"		\
-  "ar24\0\0\0\0\0ar25\0\0\0\0\0ar26\0\0\0\0\0ar27\0\0\0\0\0"		\
-  "ar28\0\0\0\0\0ar29\0\0\0\0\0ar30\0\0\0\0\0ar31\0\0\0\0\0"		\
-  "ccv\0\0\0\0\0\0ar33\0\0\0\0\0ar34\0\0\0\0\0ar35\0\0\0\0\0"		\
-  "unat\0\0\0\0\0ar37\0\0\0\0\0ar38\0\0\0\0\0ar39\0\0\0\0\0"		\
-  "fpsr\0\0\0\0\0ar41\0\0\0\0\0ar42\0\0\0\0\0ar43\0\0\0\0\0"		\
-  "ar44\0\0\0\0\0ar45\0\0\0\0\0ar46\0\0\0\0\0ar47\0\0\0\0\0"		\
-  "ar48\0\0\0\0\0ar49\0\0\0\0\0ar50\0\0\0\0\0ar51\0\0\0\0\0"		\
-  "ar52\0\0\0\0\0ar53\0\0\0\0\0ar54\0\0\0\0\0ar55\0\0\0\0\0"		\
-  "ar56\0\0\0\0\0ar57\0\0\0\0\0ar58\0\0\0\0\0ar59\0\0\0\0\0"		\
-  "ar60\0\0\0\0\0ar61\0\0\0\0\0ar62\0\0\0\0\0ar63\0\0\0\0\0"		\
-  "pfs\0\0\0\0\0\0lc\0\0\0\0\0\0\0ec\0\0\0\0\0\0\0ar67\0\0\0\0\0"	\
-  "ar68\0\0\0\0\0ar69\0\0\0\0\0ar70\0\0\0\0\0ar71\0\0\0\0\0"		\
-  "ar72\0\0\0\0\0ar73\0\0\0\0\0ar74\0\0\0\0\0ar75\0\0\0\0\0"		\
-  "ar76\0\0\0\0\0ar77\0\0\0\0\0ar78\0\0\0\0\0ar79\0\0\0\0\0"		\
-  "ar80\0\0\0\0\0ar81\0\0\0\0\0ar82\0\0\0\0\0ar83\0\0\0\0\0"		\
-  "ar84\0\0\0\0\0ar85\0\0\0\0\0ar86\0\0\0\0\0ar87\0\0\0\0\0"		\
-  "ar88\0\0\0\0\0ar89\0\0\0\0\0ar90\0\0\0\0\0ar91\0\0\0\0\0"		\
-  "ar92\0\0\0\0\0ar93\0\0\0\0\0ar94\0\0\0\0\0ar95\0\0\0\0\0"		\
-  "ar96\0\0\0\0\0ar97\0\0\0\0\0ar98\0\0\0\0\0ar99\0\0\0\0\0"		\
-  "ar100\0\0\0\0ar101\0\0\0\0ar102\0\0\0\0ar103\0\0\0\0"		\
-  "ar104\0\0\0\0ar105\0\0\0\0ar106\0\0\0\0ar107\0\0\0\0"		\
-  "ar108\0\0\0\0ar109\0\0\0\0ar110\0\0\0\0ar111\0\0\0\0"		\
-  "ar112\0\0\0\0ar113\0\0\0\0ar114\0\0\0\0ar115\0\0\0\0"		\
-  "ar116\0\0\0\0ar117\0\0\0\0ar118\0\0\0\0ar119\0\0\0\0"		\
-  "ar120\0\0\0\0ar121\0\0\0\0ar122\0\0\0\0ar123\0\0\0\0"		\
-  "ar124\0\0\0\0ar125\0\0\0\0ar126\0\0\0\0ar127\0\0\0\0"		\
-  "rp\0\0\0\0\0\0\0b1\0\0\0\0\0\0\0b2\0\0\0\0\0\0\0b3\0\0\0\0\0\0\0"	\
-  "b4\0\0\0\0\0\0\0b5\0\0\0\0\0\0\0b6\0\0\0\0\0\0\0b7\0\0\0\0\0\0\0"	\
-  "pr\0\0\0\0\0\0\0cfm\0\0\0\0\0\0bsp\0\0\0\0\0\0ip\0\0\0\0\0\0\0"	\
+#define regname_len     9
+#define regname_str                                                     \
+  "r0\0\0\0\0\0\0\0r1\0\0\0\0\0\0\0r2\0\0\0\0\0\0\0r3\0\0\0\0\0\0\0"    \
+  "r4\0\0\0\0\0\0\0r5\0\0\0\0\0\0\0r6\0\0\0\0\0\0\0r7\0\0\0\0\0\0\0"    \
+  "r8\0\0\0\0\0\0\0r9\0\0\0\0\0\0\0r10\0\0\0\0\0\0r11\0\0\0\0\0\0"      \
+  "r12\0\0\0\0\0\0r13\0\0\0\0\0\0r14\0\0\0\0\0\0r15\0\0\0\0\0\0"        \
+  "r16\0\0\0\0\0\0r17\0\0\0\0\0\0r18\0\0\0\0\0\0r19\0\0\0\0\0\0"        \
+  "r20\0\0\0\0\0\0r21\0\0\0\0\0\0r22\0\0\0\0\0\0r23\0\0\0\0\0\0"        \
+  "r24\0\0\0\0\0\0r25\0\0\0\0\0\0r26\0\0\0\0\0\0r27\0\0\0\0\0\0"        \
+  "r28\0\0\0\0\0\0r29\0\0\0\0\0\0r30\0\0\0\0\0\0r31\0\0\0\0\0\0"        \
+  "r32\0\0\0\0\0\0r33\0\0\0\0\0\0r34\0\0\0\0\0\0r35\0\0\0\0\0\0"        \
+  "r36\0\0\0\0\0\0r37\0\0\0\0\0\0r38\0\0\0\0\0\0r39\0\0\0\0\0\0"        \
+  "r40\0\0\0\0\0\0r41\0\0\0\0\0\0r42\0\0\0\0\0\0r43\0\0\0\0\0\0"        \
+  "r44\0\0\0\0\0\0r45\0\0\0\0\0\0r46\0\0\0\0\0\0r47\0\0\0\0\0\0"        \
+  "r48\0\0\0\0\0\0r49\0\0\0\0\0\0r50\0\0\0\0\0\0r51\0\0\0\0\0\0"        \
+  "r52\0\0\0\0\0\0r53\0\0\0\0\0\0r54\0\0\0\0\0\0r55\0\0\0\0\0\0"        \
+  "r56\0\0\0\0\0\0r57\0\0\0\0\0\0r58\0\0\0\0\0\0r59\0\0\0\0\0\0"        \
+  "r60\0\0\0\0\0\0r61\0\0\0\0\0\0r62\0\0\0\0\0\0r63\0\0\0\0\0\0"        \
+  "r64\0\0\0\0\0\0r65\0\0\0\0\0\0r66\0\0\0\0\0\0r67\0\0\0\0\0\0"        \
+  "r68\0\0\0\0\0\0r69\0\0\0\0\0\0r70\0\0\0\0\0\0r71\0\0\0\0\0\0"        \
+  "r72\0\0\0\0\0\0r73\0\0\0\0\0\0r74\0\0\0\0\0\0r75\0\0\0\0\0\0"        \
+  "r76\0\0\0\0\0\0r77\0\0\0\0\0\0r78\0\0\0\0\0\0r79\0\0\0\0\0\0"        \
+  "r80\0\0\0\0\0\0r81\0\0\0\0\0\0r82\0\0\0\0\0\0r83\0\0\0\0\0\0"        \
+  "r84\0\0\0\0\0\0r85\0\0\0\0\0\0r86\0\0\0\0\0\0r87\0\0\0\0\0\0"        \
+  "r88\0\0\0\0\0\0r89\0\0\0\0\0\0r90\0\0\0\0\0\0r91\0\0\0\0\0\0"        \
+  "r92\0\0\0\0\0\0r93\0\0\0\0\0\0r94\0\0\0\0\0\0r95\0\0\0\0\0\0"        \
+  "r96\0\0\0\0\0\0r97\0\0\0\0\0\0r98\0\0\0\0\0\0r99\0\0\0\0\0\0"        \
+  "r100\0\0\0\0\0r101\0\0\0\0\0r102\0\0\0\0\0r103\0\0\0\0\0"            \
+  "r104\0\0\0\0\0r105\0\0\0\0\0r106\0\0\0\0\0r107\0\0\0\0\0"            \
+  "r108\0\0\0\0\0r109\0\0\0\0\0r110\0\0\0\0\0r111\0\0\0\0\0"            \
+  "r112\0\0\0\0\0r113\0\0\0\0\0r114\0\0\0\0\0r115\0\0\0\0\0"            \
+  "r116\0\0\0\0\0r117\0\0\0\0\0r118\0\0\0\0\0r119\0\0\0\0\0"            \
+  "r120\0\0\0\0\0r121\0\0\0\0\0r122\0\0\0\0\0r123\0\0\0\0\0"            \
+  "r124\0\0\0\0\0r125\0\0\0\0\0r126\0\0\0\0\0r127\0\0\0\0\0"            \
+  "nat0\0\0\0\0\0nat1\0\0\0\0\0nat2\0\0\0\0\0nat3\0\0\0\0\0"            \
+  "nat4\0\0\0\0\0nat5\0\0\0\0\0nat6\0\0\0\0\0nat7\0\0\0\0\0"            \
+  "nat8\0\0\0\0\0nat9\0\0\0\0\0nat10\0\0\0\0nat11\0\0\0\0"              \
+  "nat12\0\0\0\0nat13\0\0\0\0nat14\0\0\0\0nat15\0\0\0\0"                \
+  "nat16\0\0\0\0nat17\0\0\0\0nat18\0\0\0\0nat19\0\0\0\0"                \
+  "nat20\0\0\0\0nat21\0\0\0\0nat22\0\0\0\0nat23\0\0\0\0"                \
+  "nat24\0\0\0\0nat25\0\0\0\0nat26\0\0\0\0nat27\0\0\0\0"                \
+  "nat28\0\0\0\0nat29\0\0\0\0nat30\0\0\0\0nat31\0\0\0\0"                \
+  "nat32\0\0\0\0nat33\0\0\0\0nat34\0\0\0\0nat35\0\0\0\0"                \
+  "nat36\0\0\0\0nat37\0\0\0\0nat38\0\0\0\0nat39\0\0\0\0"                \
+  "nat40\0\0\0\0nat41\0\0\0\0nat42\0\0\0\0nat43\0\0\0\0"                \
+  "nat44\0\0\0\0nat45\0\0\0\0nat46\0\0\0\0nat47\0\0\0\0"                \
+  "nat48\0\0\0\0nat49\0\0\0\0nat50\0\0\0\0nat51\0\0\0\0"                \
+  "nat52\0\0\0\0nat53\0\0\0\0nat54\0\0\0\0nat55\0\0\0\0"                \
+  "nat56\0\0\0\0nat57\0\0\0\0nat58\0\0\0\0nat59\0\0\0\0"                \
+  "nat60\0\0\0\0nat61\0\0\0\0nat62\0\0\0\0nat63\0\0\0\0"                \
+  "nat64\0\0\0\0nat65\0\0\0\0nat66\0\0\0\0nat67\0\0\0\0"                \
+  "nat68\0\0\0\0nat69\0\0\0\0nat70\0\0\0\0nat71\0\0\0\0"                \
+  "nat72\0\0\0\0nat73\0\0\0\0nat74\0\0\0\0nat75\0\0\0\0"                \
+  "nat76\0\0\0\0nat77\0\0\0\0nat78\0\0\0\0nat79\0\0\0\0"                \
+  "nat80\0\0\0\0nat81\0\0\0\0nat82\0\0\0\0nat83\0\0\0\0"                \
+  "nat84\0\0\0\0nat85\0\0\0\0nat86\0\0\0\0nat87\0\0\0\0"                \
+  "nat88\0\0\0\0nat89\0\0\0\0nat90\0\0\0\0nat91\0\0\0\0"                \
+  "nat92\0\0\0\0nat93\0\0\0\0nat94\0\0\0\0nat95\0\0\0\0"                \
+  "nat96\0\0\0\0nat97\0\0\0\0nat98\0\0\0\0nat99\0\0\0\0"                \
+  "nat100\0\0\0nat101\0\0\0nat102\0\0\0nat103\0\0\0"                    \
+  "nat104\0\0\0nat105\0\0\0nat106\0\0\0nat107\0\0\0"                    \
+  "nat108\0\0\0nat109\0\0\0nat110\0\0\0nat111\0\0\0"                    \
+  "nat112\0\0\0nat113\0\0\0nat114\0\0\0nat115\0\0\0"                    \
+  "nat116\0\0\0nat117\0\0\0nat118\0\0\0nat119\0\0\0"                    \
+  "nat120\0\0\0nat121\0\0\0nat122\0\0\0nat123\0\0\0"                    \
+  "nat124\0\0\0nat125\0\0\0nat126\0\0\0nat127\0\0\0"                    \
+  "f0\0\0\0\0\0\0\0f1\0\0\0\0\0\0\0f2\0\0\0\0\0\0\0f3\0\0\0\0\0\0\0"    \
+  "f4\0\0\0\0\0\0\0f5\0\0\0\0\0\0\0f6\0\0\0\0\0\0\0f7\0\0\0\0\0\0\0"    \
+  "f8\0\0\0\0\0\0\0f9\0\0\0\0\0\0\0f10\0\0\0\0\0\0f11\0\0\0\0\0\0"      \
+  "f12\0\0\0\0\0\0f13\0\0\0\0\0\0f14\0\0\0\0\0\0f15\0\0\0\0\0\0"        \
+  "f16\0\0\0\0\0\0f17\0\0\0\0\0\0f18\0\0\0\0\0\0f19\0\0\0\0\0\0"        \
+  "f20\0\0\0\0\0\0f21\0\0\0\0\0\0f22\0\0\0\0\0\0f23\0\0\0\0\0\0"        \
+  "f24\0\0\0\0\0\0f25\0\0\0\0\0\0f26\0\0\0\0\0\0f27\0\0\0\0\0\0"        \
+  "f28\0\0\0\0\0\0f29\0\0\0\0\0\0f30\0\0\0\0\0\0f31\0\0\0\0\0\0"        \
+  "f32\0\0\0\0\0\0f33\0\0\0\0\0\0f34\0\0\0\0\0\0f35\0\0\0\0\0\0"        \
+  "f36\0\0\0\0\0\0f37\0\0\0\0\0\0f38\0\0\0\0\0\0f39\0\0\0\0\0\0"        \
+  "f40\0\0\0\0\0\0f41\0\0\0\0\0\0f42\0\0\0\0\0\0f43\0\0\0\0\0\0"        \
+  "f44\0\0\0\0\0\0f45\0\0\0\0\0\0f46\0\0\0\0\0\0f47\0\0\0\0\0\0"        \
+  "f48\0\0\0\0\0\0f49\0\0\0\0\0\0f50\0\0\0\0\0\0f51\0\0\0\0\0\0"        \
+  "f52\0\0\0\0\0\0f53\0\0\0\0\0\0f54\0\0\0\0\0\0f55\0\0\0\0\0\0"        \
+  "f56\0\0\0\0\0\0f57\0\0\0\0\0\0f58\0\0\0\0\0\0f59\0\0\0\0\0\0"        \
+  "f60\0\0\0\0\0\0f61\0\0\0\0\0\0f62\0\0\0\0\0\0f63\0\0\0\0\0\0"        \
+  "f64\0\0\0\0\0\0f65\0\0\0\0\0\0f66\0\0\0\0\0\0f67\0\0\0\0\0\0"        \
+  "f68\0\0\0\0\0\0f69\0\0\0\0\0\0f70\0\0\0\0\0\0f71\0\0\0\0\0\0"        \
+  "f72\0\0\0\0\0\0f73\0\0\0\0\0\0f74\0\0\0\0\0\0f75\0\0\0\0\0\0"        \
+  "f76\0\0\0\0\0\0f77\0\0\0\0\0\0f78\0\0\0\0\0\0f79\0\0\0\0\0\0"        \
+  "f80\0\0\0\0\0\0f81\0\0\0\0\0\0f82\0\0\0\0\0\0f83\0\0\0\0\0\0"        \
+  "f84\0\0\0\0\0\0f85\0\0\0\0\0\0f86\0\0\0\0\0\0f87\0\0\0\0\0\0"        \
+  "f88\0\0\0\0\0\0f89\0\0\0\0\0\0f90\0\0\0\0\0\0f91\0\0\0\0\0\0"        \
+  "f92\0\0\0\0\0\0f93\0\0\0\0\0\0f94\0\0\0\0\0\0f95\0\0\0\0\0\0"        \
+  "f96\0\0\0\0\0\0f97\0\0\0\0\0\0f98\0\0\0\0\0\0f99\0\0\0\0\0\0"        \
+  "f100\0\0\0\0\0f101\0\0\0\0\0f102\0\0\0\0\0f103\0\0\0\0\0"            \
+  "f104\0\0\0\0\0f105\0\0\0\0\0f106\0\0\0\0\0f107\0\0\0\0\0"            \
+  "f108\0\0\0\0\0f109\0\0\0\0\0f110\0\0\0\0\0f111\0\0\0\0\0"            \
+  "f112\0\0\0\0\0f113\0\0\0\0\0f114\0\0\0\0\0f115\0\0\0\0\0"            \
+  "f116\0\0\0\0\0f117\0\0\0\0\0f118\0\0\0\0\0f119\0\0\0\0\0"            \
+  "f120\0\0\0\0\0f121\0\0\0\0\0f122\0\0\0\0\0f123\0\0\0\0\0"            \
+  "f124\0\0\0\0\0f125\0\0\0\0\0f126\0\0\0\0\0f127\0\0\0\0\0"            \
+  "ar0\0\0\0\0\0\0ar1\0\0\0\0\0\0ar2\0\0\0\0\0\0ar3\0\0\0\0\0\0"        \
+  "ar4\0\0\0\0\0\0ar5\0\0\0\0\0\0ar6\0\0\0\0\0\0ar7\0\0\0\0\0\0"        \
+  "ar8\0\0\0\0\0\0ar9\0\0\0\0\0\0ar10\0\0\0\0\0ar11\0\0\0\0\0"          \
+  "ar12\0\0\0\0\0ar13\0\0\0\0\0ar14\0\0\0\0\0ar15\0\0\0\0\0"            \
+  "rsc\0\0\0\0\0\0bsp\0\0\0\0\0\0bspstore\0rnat\0\0\0\0\0"              \
+  "ar20\0\0\0\0\0ar21\0\0\0\0\0ar22\0\0\0\0\0ar23\0\0\0\0\0"            \
+  "ar24\0\0\0\0\0ar25\0\0\0\0\0ar26\0\0\0\0\0ar27\0\0\0\0\0"            \
+  "ar28\0\0\0\0\0ar29\0\0\0\0\0ar30\0\0\0\0\0ar31\0\0\0\0\0"            \
+  "ccv\0\0\0\0\0\0ar33\0\0\0\0\0ar34\0\0\0\0\0ar35\0\0\0\0\0"           \
+  "unat\0\0\0\0\0ar37\0\0\0\0\0ar38\0\0\0\0\0ar39\0\0\0\0\0"            \
+  "fpsr\0\0\0\0\0ar41\0\0\0\0\0ar42\0\0\0\0\0ar43\0\0\0\0\0"            \
+  "ar44\0\0\0\0\0ar45\0\0\0\0\0ar46\0\0\0\0\0ar47\0\0\0\0\0"            \
+  "ar48\0\0\0\0\0ar49\0\0\0\0\0ar50\0\0\0\0\0ar51\0\0\0\0\0"            \
+  "ar52\0\0\0\0\0ar53\0\0\0\0\0ar54\0\0\0\0\0ar55\0\0\0\0\0"            \
+  "ar56\0\0\0\0\0ar57\0\0\0\0\0ar58\0\0\0\0\0ar59\0\0\0\0\0"            \
+  "ar60\0\0\0\0\0ar61\0\0\0\0\0ar62\0\0\0\0\0ar63\0\0\0\0\0"            \
+  "pfs\0\0\0\0\0\0lc\0\0\0\0\0\0\0ec\0\0\0\0\0\0\0ar67\0\0\0\0\0"       \
+  "ar68\0\0\0\0\0ar69\0\0\0\0\0ar70\0\0\0\0\0ar71\0\0\0\0\0"            \
+  "ar72\0\0\0\0\0ar73\0\0\0\0\0ar74\0\0\0\0\0ar75\0\0\0\0\0"            \
+  "ar76\0\0\0\0\0ar77\0\0\0\0\0ar78\0\0\0\0\0ar79\0\0\0\0\0"            \
+  "ar80\0\0\0\0\0ar81\0\0\0\0\0ar82\0\0\0\0\0ar83\0\0\0\0\0"            \
+  "ar84\0\0\0\0\0ar85\0\0\0\0\0ar86\0\0\0\0\0ar87\0\0\0\0\0"            \
+  "ar88\0\0\0\0\0ar89\0\0\0\0\0ar90\0\0\0\0\0ar91\0\0\0\0\0"            \
+  "ar92\0\0\0\0\0ar93\0\0\0\0\0ar94\0\0\0\0\0ar95\0\0\0\0\0"            \
+  "ar96\0\0\0\0\0ar97\0\0\0\0\0ar98\0\0\0\0\0ar99\0\0\0\0\0"            \
+  "ar100\0\0\0\0ar101\0\0\0\0ar102\0\0\0\0ar103\0\0\0\0"                \
+  "ar104\0\0\0\0ar105\0\0\0\0ar106\0\0\0\0ar107\0\0\0\0"                \
+  "ar108\0\0\0\0ar109\0\0\0\0ar110\0\0\0\0ar111\0\0\0\0"                \
+  "ar112\0\0\0\0ar113\0\0\0\0ar114\0\0\0\0ar115\0\0\0\0"                \
+  "ar116\0\0\0\0ar117\0\0\0\0ar118\0\0\0\0ar119\0\0\0\0"                \
+  "ar120\0\0\0\0ar121\0\0\0\0ar122\0\0\0\0ar123\0\0\0\0"                \
+  "ar124\0\0\0\0ar125\0\0\0\0ar126\0\0\0\0ar127\0\0\0\0"                \
+  "rp\0\0\0\0\0\0\0b1\0\0\0\0\0\0\0b2\0\0\0\0\0\0\0b3\0\0\0\0\0\0\0"    \
+  "b4\0\0\0\0\0\0\0b5\0\0\0\0\0\0\0b6\0\0\0\0\0\0\0b7\0\0\0\0\0\0\0"    \
+  "pr\0\0\0\0\0\0\0cfm\0\0\0\0\0\0bsp\0\0\0\0\0\0ip\0\0\0\0\0\0\0"      \
   "sp\0\0\0\0\0\0\0"
 
-#define NREGS	((int) (sizeof (regname_str) - 1) / regname_len)
+#define NREGS   ((int) (sizeof (regname_str) - 1) / regname_len)
 
 PROTECTED const char *
 unw_regname (unw_regnum_t reg)
diff --git a/frysk-imports/libunwind/src/ia64/regs.h b/frysk-imports/libunwind/src/ia64/regs.h
index 1e748bb..a22a818 100644
--- a/frysk-imports/libunwind/src/ia64/regs.h
+++ b/frysk-imports/libunwind/src/ia64/regs.h
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2002-2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -40,9 +40,9 @@ rotate_gr (struct cursor *c, int reg)
     preg = reg;
   else
     {
-      preg = reg + rrb_gr;	/* apply rotation */
+      preg = reg + rrb_gr;      /* apply rotation */
       if ((unsigned) (preg - 32) >= sor)
-	preg -= sor;		/* wrap around */
+        preg -= sor;            /* wrap around */
     }
   if (sor)
     Debug (15, "sor=%u rrb.gr=%u, r%d -> r%d\n", sor, rrb_gr, reg, preg);
@@ -60,12 +60,12 @@ rotate_fr (struct cursor *c, int reg)
 
   rrb_fr = (c->cfm >> 25) & 0x7f;
   if (reg < 32)
-    preg = reg;		/* register not part of the rotating partition */
+    preg = reg;         /* register not part of the rotating partition */
   else
     {
-      preg = reg + rrb_fr;	/* apply rotation */
+      preg = reg + rrb_fr;      /* apply rotation */
       if (preg > 127)
-	preg -= 96;		/* wrap around */
+        preg -= 96;             /* wrap around */
     }
   if (rrb_fr)
     Debug (15, "rrb.fr=%u, f%d -> f%d\n", rrb_fr, reg, preg);
diff --git a/frysk-imports/libunwind/src/ia64/ucontext_i.h b/frysk-imports/libunwind/src/ia64/ucontext_i.h
index 34171fd..ea32c8a 100644
--- a/frysk-imports/libunwind/src/ia64/ucontext_i.h
+++ b/frysk-imports/libunwind/src/ia64/ucontext_i.h
@@ -25,44 +25,44 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 /* Constants shared between setcontext() and getcontext().  Don't
    install this header file.  */
 
-#define SIG_BLOCK	0
-#define SIG_UNBLOCK	1
-#define SIG_SETMASK	2
+#define SIG_BLOCK       0
+#define SIG_UNBLOCK     1
+#define SIG_SETMASK     2
 
-#define IA64_SC_FLAG_SYNCHRONOUS_BIT	63
+#define IA64_SC_FLAG_SYNCHRONOUS_BIT    63
 
 #define SC_FLAGS 0x000
-#define SC_NAT	0x008
-#define SC_BSP	0x048
-#define SC_RNAT	0x050
-#define SC_UNAT	0x060
-#define SC_FPSR	0x068
-#define SC_PFS	0x070
-#define SC_LC	0x078
-#define SC_PR	0x080
-#define SC_BR	0x088
-#define SC_GR	0x0c8
-#define SC_FR	0x1d0
-#define SC_MASK	0x9d0
+#define SC_NAT  0x008
+#define SC_BSP  0x048
+#define SC_RNAT 0x050
+#define SC_UNAT 0x060
+#define SC_FPSR 0x068
+#define SC_PFS  0x070
+#define SC_LC   0x078
+#define SC_PR   0x080
+#define SC_BR   0x088
+#define SC_GR   0x0c8
+#define SC_FR   0x1d0
+#define SC_MASK 0x9d0
 
 
-#define rTMP	r10
-#define rPOS	r11
-#define rCPOS	r14
-#define rNAT	r15
-#define rFLAGS	r16
+#define rTMP    r10
+#define rPOS    r11
+#define rCPOS   r14
+#define rNAT    r15
+#define rFLAGS  r16
 
-#define rB5	r18
-#define rB4	r19
-#define rB3	r20
-#define rB2	r21
-#define rB1	r22
-#define rB0	r23
-#define rRSC	r24
-#define rBSP	r25
-#define rRNAT	r26
-#define rUNAT	r27
-#define rFPSR	r28
-#define rPFS	r29
-#define rLC	r30
-#define rPR	r31
+#define rB5     r18
+#define rB4     r19
+#define rB3     r20
+#define rB2     r21
+#define rB1     r22
+#define rB0     r23
+#define rRSC    r24
+#define rBSP    r25
+#define rRNAT   r26
+#define rUNAT   r27
+#define rFPSR   r28
+#define rPFS    r29
+#define rLC     r30
+#define rPR     r31
diff --git a/frysk-imports/libunwind/src/ia64/unwind_decoder.h b/frysk-imports/libunwind/src/ia64/unwind_decoder.h
index f12c21d..7fd4174 100644
--- a/frysk-imports/libunwind/src/ia64/unwind_decoder.h
+++ b/frysk-imports/libunwind/src/ia64/unwind_decoder.h
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2001-2002 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -33,55 +33,55 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
  * macros/constants before including this file:
  *
  *  Types:
- *	unw_word	Unsigned integer type with at least 64 bits
+ *      unw_word        Unsigned integer type with at least 64 bits
  *
  *  Register names:
- *	UNW_REG_BSP
- *	UNW_REG_BSPSTORE
- *	UNW_REG_FPSR
- *	UNW_REG_LC
- *	UNW_REG_PFS
- *	UNW_REG_PR
- *	UNW_REG_RNAT
- *	UNW_REG_PSP
- *	UNW_REG_RP
- *	UNW_REG_UNAT
+ *      UNW_REG_BSP
+ *      UNW_REG_BSPSTORE
+ *      UNW_REG_FPSR
+ *      UNW_REG_LC
+ *      UNW_REG_PFS
+ *      UNW_REG_PR
+ *      UNW_REG_RNAT
+ *      UNW_REG_PSP
+ *      UNW_REG_RP
+ *      UNW_REG_UNAT
  *
  *  Decoder action macros:
- *	UNW_DEC_BAD_CODE(code)
- *	UNW_DEC_ABI(fmt,abi,context,arg)
- *	UNW_DEC_BR_GR(fmt,brmask,gr,arg)
- *	UNW_DEC_BR_MEM(fmt,brmask,arg)
- *	UNW_DEC_COPY_STATE(fmt,label,arg)
- *	UNW_DEC_EPILOGUE(fmt,t,ecount,arg)
- *	UNW_DEC_FRGR_MEM(fmt,grmask,frmask,arg)
- *	UNW_DEC_FR_MEM(fmt,frmask,arg)
- *	UNW_DEC_GR_GR(fmt,grmask,gr,arg)
- *	UNW_DEC_GR_MEM(fmt,grmask,arg)
- *	UNW_DEC_LABEL_STATE(fmt,label,arg)
- *	UNW_DEC_MEM_STACK_F(fmt,t,size,arg)
- *	UNW_DEC_MEM_STACK_V(fmt,t,arg)
- *	UNW_DEC_PRIUNAT_GR(fmt,r,arg)
- *	UNW_DEC_PRIUNAT_WHEN_GR(fmt,t,arg)
- *	UNW_DEC_PRIUNAT_WHEN_MEM(fmt,t,arg)
- *	UNW_DEC_PRIUNAT_WHEN_PSPREL(fmt,pspoff,arg)
- *	UNW_DEC_PRIUNAT_WHEN_SPREL(fmt,spoff,arg)
- *	UNW_DEC_PROLOGUE(fmt,body,rlen,arg)
- *	UNW_DEC_PROLOGUE_GR(fmt,rlen,mask,grsave,arg)
- *	UNW_DEC_REG_PSPREL(fmt,reg,pspoff,arg)
- *	UNW_DEC_REG_REG(fmt,src,dst,arg)
- *	UNW_DEC_REG_SPREL(fmt,reg,spoff,arg)
- *	UNW_DEC_REG_WHEN(fmt,reg,t,arg)
- *	UNW_DEC_RESTORE(fmt,t,abreg,arg)
- *	UNW_DEC_RESTORE_P(fmt,qp,t,abreg,arg)
- *	UNW_DEC_SPILL_BASE(fmt,pspoff,arg)
- *	UNW_DEC_SPILL_MASK(fmt,imaskp,arg)
- *	UNW_DEC_SPILL_PSPREL(fmt,t,abreg,pspoff,arg)
- *	UNW_DEC_SPILL_PSPREL_P(fmt,qp,t,abreg,pspoff,arg)
- *	UNW_DEC_SPILL_REG(fmt,t,abreg,x,ytreg,arg)
- *	UNW_DEC_SPILL_REG_P(fmt,qp,t,abreg,x,ytreg,arg)
- *	UNW_DEC_SPILL_SPREL(fmt,t,abreg,spoff,arg)
- *	UNW_DEC_SPILL_SPREL_P(fmt,qp,t,abreg,pspoff,arg)
+ *      UNW_DEC_BAD_CODE(code)
+ *      UNW_DEC_ABI(fmt,abi,context,arg)
+ *      UNW_DEC_BR_GR(fmt,brmask,gr,arg)
+ *      UNW_DEC_BR_MEM(fmt,brmask,arg)
+ *      UNW_DEC_COPY_STATE(fmt,label,arg)
+ *      UNW_DEC_EPILOGUE(fmt,t,ecount,arg)
+ *      UNW_DEC_FRGR_MEM(fmt,grmask,frmask,arg)
+ *      UNW_DEC_FR_MEM(fmt,frmask,arg)
+ *      UNW_DEC_GR_GR(fmt,grmask,gr,arg)
+ *      UNW_DEC_GR_MEM(fmt,grmask,arg)
+ *      UNW_DEC_LABEL_STATE(fmt,label,arg)
+ *      UNW_DEC_MEM_STACK_F(fmt,t,size,arg)
+ *      UNW_DEC_MEM_STACK_V(fmt,t,arg)
+ *      UNW_DEC_PRIUNAT_GR(fmt,r,arg)
+ *      UNW_DEC_PRIUNAT_WHEN_GR(fmt,t,arg)
+ *      UNW_DEC_PRIUNAT_WHEN_MEM(fmt,t,arg)
+ *      UNW_DEC_PRIUNAT_WHEN_PSPREL(fmt,pspoff,arg)
+ *      UNW_DEC_PRIUNAT_WHEN_SPREL(fmt,spoff,arg)
+ *      UNW_DEC_PROLOGUE(fmt,body,rlen,arg)
+ *      UNW_DEC_PROLOGUE_GR(fmt,rlen,mask,grsave,arg)
+ *      UNW_DEC_REG_PSPREL(fmt,reg,pspoff,arg)
+ *      UNW_DEC_REG_REG(fmt,src,dst,arg)
+ *      UNW_DEC_REG_SPREL(fmt,reg,spoff,arg)
+ *      UNW_DEC_REG_WHEN(fmt,reg,t,arg)
+ *      UNW_DEC_RESTORE(fmt,t,abreg,arg)
+ *      UNW_DEC_RESTORE_P(fmt,qp,t,abreg,arg)
+ *      UNW_DEC_SPILL_BASE(fmt,pspoff,arg)
+ *      UNW_DEC_SPILL_MASK(fmt,imaskp,arg)
+ *      UNW_DEC_SPILL_PSPREL(fmt,t,abreg,pspoff,arg)
+ *      UNW_DEC_SPILL_PSPREL_P(fmt,qp,t,abreg,pspoff,arg)
+ *      UNW_DEC_SPILL_REG(fmt,t,abreg,x,ytreg,arg)
+ *      UNW_DEC_SPILL_REG_P(fmt,qp,t,abreg,x,ytreg,arg)
+ *      UNW_DEC_SPILL_SPREL(fmt,t,abreg,spoff,arg)
+ *      UNW_DEC_SPILL_SPREL_P(fmt,qp,t,abreg,pspoff,arg)
  */
 
 static unw_word
@@ -96,7 +96,7 @@ unw_decode_uleb128 (unsigned char **dpp)
       byte = *bp++;
       result |= (byte & 0x7f) << shift;
       if ((byte & 0x80) == 0)
-	break;
+        break;
       shift += 7;
     }
   *dpp = bp;
@@ -114,9 +114,9 @@ unw_decode_x1 (unsigned char *dp, unsigned char code, void *arg)
   off = unw_decode_uleb128 (&dp);
   abreg = (byte1 & 0x7f);
   if (byte1 & 0x80)
-	  UNW_DEC_SPILL_SPREL(X1, t, abreg, off, arg);
+          UNW_DEC_SPILL_SPREL(X1, t, abreg, off, arg);
   else
-	  UNW_DEC_SPILL_PSPREL(X1, t, abreg, off, arg);
+          UNW_DEC_SPILL_PSPREL(X1, t, abreg, off, arg);
   return dp;
 }
 
@@ -232,7 +232,7 @@ unw_decode_p2_p5 (unsigned char *dp, unsigned char code, void *arg)
       unsigned char byte1 = *dp++;
 
       UNW_DEC_BR_GR(P2, ((code & 0xf) << 1) | ((byte1 >> 7) & 1),
-		    (byte1 & 0x7f), arg);
+                    (byte1 & 0x7f), arg);
     }
   else if ((code & 0x08) == 0)
     {
@@ -241,21 +241,21 @@ unw_decode_p2_p5 (unsigned char *dp, unsigned char code, void *arg)
       r = ((code & 0x7) << 1) | ((byte1 >> 7) & 1);
       dst = (byte1 & 0x7f);
       switch (r)
-	{
-	case 0: UNW_DEC_REG_GR(P3, UNW_REG_PSP, dst, arg); break;
-	case 1: UNW_DEC_REG_GR(P3, UNW_REG_RP, dst, arg); break;
-	case 2: UNW_DEC_REG_GR(P3, UNW_REG_PFS, dst, arg); break;
-	case 3: UNW_DEC_REG_GR(P3, UNW_REG_PR, dst, arg); break;
-	case 4: UNW_DEC_REG_GR(P3, UNW_REG_UNAT, dst, arg); break;
-	case 5: UNW_DEC_REG_GR(P3, UNW_REG_LC, dst, arg); break;
-	case 6: UNW_DEC_RP_BR(P3, dst, arg); break;
-	case 7: UNW_DEC_REG_GR(P3, UNW_REG_RNAT, dst, arg); break;
-	case 8: UNW_DEC_REG_GR(P3, UNW_REG_BSP, dst, arg); break;
-	case 9: UNW_DEC_REG_GR(P3, UNW_REG_BSPSTORE, dst, arg); break;
-	case 10: UNW_DEC_REG_GR(P3, UNW_REG_FPSR, dst, arg); break;
-	case 11: UNW_DEC_PRIUNAT_GR(P3, dst, arg); break;
-	default: UNW_DEC_BAD_CODE(r); break;
-	}
+        {
+        case 0: UNW_DEC_REG_GR(P3, UNW_REG_PSP, dst, arg); break;
+        case 1: UNW_DEC_REG_GR(P3, UNW_REG_RP, dst, arg); break;
+        case 2: UNW_DEC_REG_GR(P3, UNW_REG_PFS, dst, arg); break;
+        case 3: UNW_DEC_REG_GR(P3, UNW_REG_PR, dst, arg); break;
+        case 4: UNW_DEC_REG_GR(P3, UNW_REG_UNAT, dst, arg); break;
+        case 5: UNW_DEC_REG_GR(P3, UNW_REG_LC, dst, arg); break;
+        case 6: UNW_DEC_RP_BR(P3, dst, arg); break;
+        case 7: UNW_DEC_REG_GR(P3, UNW_REG_RNAT, dst, arg); break;
+        case 8: UNW_DEC_REG_GR(P3, UNW_REG_BSP, dst, arg); break;
+        case 9: UNW_DEC_REG_GR(P3, UNW_REG_BSPSTORE, dst, arg); break;
+        case 10: UNW_DEC_REG_GR(P3, UNW_REG_FPSR, dst, arg); break;
+        case 11: UNW_DEC_PRIUNAT_GR(P3, dst, arg); break;
+        default: UNW_DEC_BAD_CODE(r); break;
+        }
     }
   else if ((code & 0x7) == 0)
     UNW_DEC_SPILL_MASK(P4, dp, arg);
@@ -297,90 +297,90 @@ unw_decode_p7_p10 (unsigned char *dp, unsigned char code, void *arg)
       r = (code & 0xf);
       t = unw_decode_uleb128 (&dp);
       switch (r)
-	{
-	case 0:
-	  size = unw_decode_uleb128 (&dp);
-	  UNW_DEC_MEM_STACK_F(P7, t, size, arg);
-	  break;
-
-	case 1: UNW_DEC_MEM_STACK_V(P7, t, arg); break;
-	case 2: UNW_DEC_SPILL_BASE(P7, t, arg); break;
-	case 3: UNW_DEC_REG_SPREL(P7, UNW_REG_PSP, t, arg); break;
-	case 4: UNW_DEC_REG_WHEN(P7, UNW_REG_RP, t, arg); break;
-	case 5: UNW_DEC_REG_PSPREL(P7, UNW_REG_RP, t, arg); break;
-	case 6: UNW_DEC_REG_WHEN(P7, UNW_REG_PFS, t, arg); break;
-	case 7: UNW_DEC_REG_PSPREL(P7, UNW_REG_PFS, t, arg); break;
-	case 8: UNW_DEC_REG_WHEN(P7, UNW_REG_PR, t, arg); break;
-	case 9: UNW_DEC_REG_PSPREL(P7, UNW_REG_PR, t, arg); break;
-	case 10: UNW_DEC_REG_WHEN(P7, UNW_REG_LC, t, arg); break;
-	case 11: UNW_DEC_REG_PSPREL(P7, UNW_REG_LC, t, arg); break;
-	case 12: UNW_DEC_REG_WHEN(P7, UNW_REG_UNAT, t, arg); break;
-	case 13: UNW_DEC_REG_PSPREL(P7, UNW_REG_UNAT, t, arg); break;
-	case 14: UNW_DEC_REG_WHEN(P7, UNW_REG_FPSR, t, arg); break;
-	case 15: UNW_DEC_REG_PSPREL(P7, UNW_REG_FPSR, t, arg); break;
-	default: UNW_DEC_BAD_CODE(r); break;
-	}
+        {
+        case 0:
+          size = unw_decode_uleb128 (&dp);
+          UNW_DEC_MEM_STACK_F(P7, t, size, arg);
+          break;
+
+        case 1: UNW_DEC_MEM_STACK_V(P7, t, arg); break;
+        case 2: UNW_DEC_SPILL_BASE(P7, t, arg); break;
+        case 3: UNW_DEC_REG_SPREL(P7, UNW_REG_PSP, t, arg); break;
+        case 4: UNW_DEC_REG_WHEN(P7, UNW_REG_RP, t, arg); break;
+        case 5: UNW_DEC_REG_PSPREL(P7, UNW_REG_RP, t, arg); break;
+        case 6: UNW_DEC_REG_WHEN(P7, UNW_REG_PFS, t, arg); break;
+        case 7: UNW_DEC_REG_PSPREL(P7, UNW_REG_PFS, t, arg); break;
+        case 8: UNW_DEC_REG_WHEN(P7, UNW_REG_PR, t, arg); break;
+        case 9: UNW_DEC_REG_PSPREL(P7, UNW_REG_PR, t, arg); break;
+        case 10: UNW_DEC_REG_WHEN(P7, UNW_REG_LC, t, arg); break;
+        case 11: UNW_DEC_REG_PSPREL(P7, UNW_REG_LC, t, arg); break;
+        case 12: UNW_DEC_REG_WHEN(P7, UNW_REG_UNAT, t, arg); break;
+        case 13: UNW_DEC_REG_PSPREL(P7, UNW_REG_UNAT, t, arg); break;
+        case 14: UNW_DEC_REG_WHEN(P7, UNW_REG_FPSR, t, arg); break;
+        case 15: UNW_DEC_REG_PSPREL(P7, UNW_REG_FPSR, t, arg); break;
+        default: UNW_DEC_BAD_CODE(r); break;
+        }
     }
   else
     {
       switch (code & 0xf)
-	{
-	case 0x0: /* p8 */
-	  {
-	    r = *dp++;
-	    t = unw_decode_uleb128 (&dp);
-	    switch (r)
-	      {
-	      case  1: UNW_DEC_REG_SPREL(P8, UNW_REG_RP, t, arg); break;
-	      case  2: UNW_DEC_REG_SPREL(P8, UNW_REG_PFS, t, arg); break;
-	      case  3: UNW_DEC_REG_SPREL(P8, UNW_REG_PR, t, arg); break;
-	      case  4: UNW_DEC_REG_SPREL(P8, UNW_REG_LC, t, arg); break;
-	      case  5: UNW_DEC_REG_SPREL(P8, UNW_REG_UNAT, t, arg); break;
-	      case  6: UNW_DEC_REG_SPREL(P8, UNW_REG_FPSR, t, arg); break;
-	      case  7: UNW_DEC_REG_WHEN(P8, UNW_REG_BSP, t, arg); break;
-	      case  8: UNW_DEC_REG_PSPREL(P8, UNW_REG_BSP, t, arg); break;
-	      case  9: UNW_DEC_REG_SPREL(P8, UNW_REG_BSP, t, arg); break;
-	      case 10: UNW_DEC_REG_WHEN(P8, UNW_REG_BSPSTORE, t, arg); break;
-	      case 11: UNW_DEC_REG_PSPREL(P8, UNW_REG_BSPSTORE, t, arg); break;
-	      case 12: UNW_DEC_REG_SPREL(P8, UNW_REG_BSPSTORE, t, arg); break;
-	      case 13: UNW_DEC_REG_WHEN(P8, UNW_REG_RNAT, t, arg); break;
-	      case 14: UNW_DEC_REG_PSPREL(P8, UNW_REG_RNAT, t, arg); break;
-	      case 15: UNW_DEC_REG_SPREL(P8, UNW_REG_RNAT, t, arg); break;
-	      case 16: UNW_DEC_PRIUNAT_WHEN_GR(P8, t, arg); break;
-	      case 17: UNW_DEC_PRIUNAT_PSPREL(P8, t, arg); break;
-	      case 18: UNW_DEC_PRIUNAT_SPREL(P8, t, arg); break;
-	      case 19: UNW_DEC_PRIUNAT_WHEN_MEM(P8, t, arg); break;
-	      default: UNW_DEC_BAD_CODE(r); break;
-	    }
-	  }
-	  break;
-
-	case 0x1:
-	  byte1 = *dp++; byte2 = *dp++;
-	  UNW_DEC_GR_GR(P9, (byte1 & 0xf), (byte2 & 0x7f), arg);
-	  break;
-
-	case 0xf: /* p10 */
-	  byte1 = *dp++; byte2 = *dp++;
-	  UNW_DEC_ABI(P10, byte1, byte2, arg);
-	  break;
-
-	case 0x9:
-	  return unw_decode_x1 (dp, code, arg);
-
-	case 0xa:
-	  return unw_decode_x2 (dp, code, arg);
-
-	case 0xb:
-	  return unw_decode_x3 (dp, code, arg);
-
-	case 0xc:
-	  return unw_decode_x4 (dp, code, arg);
-
-	default:
-	  UNW_DEC_BAD_CODE(code);
-	  break;
-	}
+        {
+        case 0x0: /* p8 */
+          {
+            r = *dp++;
+            t = unw_decode_uleb128 (&dp);
+            switch (r)
+              {
+              case  1: UNW_DEC_REG_SPREL(P8, UNW_REG_RP, t, arg); break;
+              case  2: UNW_DEC_REG_SPREL(P8, UNW_REG_PFS, t, arg); break;
+              case  3: UNW_DEC_REG_SPREL(P8, UNW_REG_PR, t, arg); break;
+              case  4: UNW_DEC_REG_SPREL(P8, UNW_REG_LC, t, arg); break;
+              case  5: UNW_DEC_REG_SPREL(P8, UNW_REG_UNAT, t, arg); break;
+              case  6: UNW_DEC_REG_SPREL(P8, UNW_REG_FPSR, t, arg); break;
+              case  7: UNW_DEC_REG_WHEN(P8, UNW_REG_BSP, t, arg); break;
+              case  8: UNW_DEC_REG_PSPREL(P8, UNW_REG_BSP, t, arg); break;
+              case  9: UNW_DEC_REG_SPREL(P8, UNW_REG_BSP, t, arg); break;
+              case 10: UNW_DEC_REG_WHEN(P8, UNW_REG_BSPSTORE, t, arg); break;
+              case 11: UNW_DEC_REG_PSPREL(P8, UNW_REG_BSPSTORE, t, arg); break;
+              case 12: UNW_DEC_REG_SPREL(P8, UNW_REG_BSPSTORE, t, arg); break;
+              case 13: UNW_DEC_REG_WHEN(P8, UNW_REG_RNAT, t, arg); break;
+              case 14: UNW_DEC_REG_PSPREL(P8, UNW_REG_RNAT, t, arg); break;
+              case 15: UNW_DEC_REG_SPREL(P8, UNW_REG_RNAT, t, arg); break;
+              case 16: UNW_DEC_PRIUNAT_WHEN_GR(P8, t, arg); break;
+              case 17: UNW_DEC_PRIUNAT_PSPREL(P8, t, arg); break;
+              case 18: UNW_DEC_PRIUNAT_SPREL(P8, t, arg); break;
+              case 19: UNW_DEC_PRIUNAT_WHEN_MEM(P8, t, arg); break;
+              default: UNW_DEC_BAD_CODE(r); break;
+            }
+          }
+          break;
+
+        case 0x1:
+          byte1 = *dp++; byte2 = *dp++;
+          UNW_DEC_GR_GR(P9, (byte1 & 0xf), (byte2 & 0x7f), arg);
+          break;
+
+        case 0xf: /* p10 */
+          byte1 = *dp++; byte2 = *dp++;
+          UNW_DEC_ABI(P10, byte1, byte2, arg);
+          break;
+
+        case 0x9:
+          return unw_decode_x1 (dp, code, arg);
+
+        case 0xa:
+          return unw_decode_x2 (dp, code, arg);
+
+        case 0xb:
+          return unw_decode_x3 (dp, code, arg);
+
+        case 0xc:
+          return unw_decode_x4 (dp, code, arg);
+
+        default:
+          UNW_DEC_BAD_CODE(code);
+          break;
+        }
     }
   return dp;
 }
@@ -422,9 +422,9 @@ unw_decode_b3_x4 (unsigned char *dp, unsigned char code, void *arg)
     {
       label = unw_decode_uleb128 (&dp);
       if ((code & 0x08) != 0)
-	UNW_DEC_COPY_STATE(B4, label, arg);
+        UNW_DEC_COPY_STATE(B4, label, arg);
       else
-	UNW_DEC_LABEL_STATE(B4, label, arg);
+        UNW_DEC_LABEL_STATE(B4, label, arg);
     }
   else
     switch (code & 0x7)
diff --git a/frysk-imports/libunwind/src/ia64/unwind_i.h b/frysk-imports/libunwind/src/ia64/unwind_i.h
index 4643975..8ccbb46 100644
--- a/frysk-imports/libunwind/src/ia64/unwind_i.h
+++ b/frysk-imports/libunwind/src/ia64/unwind_i.h
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2001-2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -26,7 +26,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #ifndef unwind_i_h
 #define unwind_i_h
 
-#include <memory.h>
+#include <string.h>
 #include <inttypes.h>
 
 #include <libunwind-ia64.h>
@@ -35,17 +35,17 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 #include "libunwind_i.h"
 
-#define IA64_UNW_VER(x)		    ((x) >> 48)
-#define IA64_UNW_FLAG_MASK	    ((unw_word_t) 0x0000ffff00000000ULL)
-#define IA64_UNW_FLAG_OSMASK	    ((unw_word_t) 0x0000f00000000000ULL)
+#define IA64_UNW_VER(x)             ((x) >> 48)
+#define IA64_UNW_FLAG_MASK          ((unw_word_t) 0x0000ffff00000000ULL)
+#define IA64_UNW_FLAG_OSMASK        ((unw_word_t) 0x0000f00000000000ULL)
 #define IA64_UNW_FLAG_EHANDLER(x)   ((x) & (unw_word_t) 0x0000000100000000ULL)
 #define IA64_UNW_FLAG_UHANDLER(x)   ((x) & (unw_word_t) 0x0000000200000000ULL)
-#define IA64_UNW_LENGTH(x)	    ((x) & (unw_word_t) 0x00000000ffffffffULL)
+#define IA64_UNW_LENGTH(x)          ((x) & (unw_word_t) 0x00000000ffffffffULL)
 
 #ifdef MIN
 # undef MIN
 #endif
-#define MIN(a,b)	((a) < (b) ? (a) : (b))
+#define MIN(a,b)        ((a) < (b) ? (a) : (b))
 
 #if !defined(HAVE_SYS_UC_ACCESS_H) && !defined(UNW_REMOTE_ONLY)
 
@@ -57,23 +57,23 @@ inlined_uc_addr (ucontext_t *uc, int reg, uint8_t *nat_bitnr)
 
   switch (reg)
     {
-    case UNW_IA64_GR + 0:	addr = &unw.read_only.r0; break;
-    case UNW_IA64_NAT + 0:	addr = &unw.read_only.r0; break;
-    case UNW_IA64_FR + 0:	addr = &unw.read_only.f0; break;
+    case UNW_IA64_GR + 0:       addr = &unw.read_only.r0; break;
+    case UNW_IA64_NAT + 0:      addr = &unw.read_only.r0; break;
+    case UNW_IA64_FR + 0:       addr = &unw.read_only.f0; break;
     case UNW_IA64_FR + 1:
       if (__BYTE_ORDER == __BIG_ENDIAN)
-	addr = &unw.read_only.f1_be;
+        addr = &unw.read_only.f1_be;
       else
-	addr = &unw.read_only.f1_le;
+        addr = &unw.read_only.f1_le;
       break;
-    case UNW_IA64_IP:		addr = &uc->uc_mcontext.sc_br[0]; break;
-    case UNW_IA64_CFM:		addr = &uc->uc_mcontext.sc_ar_pfs; break;
-    case UNW_IA64_AR_RNAT:	addr = &uc->uc_mcontext.sc_ar_rnat; break;
-    case UNW_IA64_AR_UNAT:	addr = &uc->uc_mcontext.sc_ar_unat; break;
-    case UNW_IA64_AR_LC:	addr = &uc->uc_mcontext.sc_ar_lc; break;
-    case UNW_IA64_AR_FPSR:	addr = &uc->uc_mcontext.sc_ar_fpsr; break;
-    case UNW_IA64_PR:		addr = &uc->uc_mcontext.sc_pr; break;
-    case UNW_IA64_AR_BSPSTORE:	addr = &uc->uc_mcontext.sc_ar_bsp; break;
+    case UNW_IA64_IP:           addr = &uc->uc_mcontext.sc_br[0]; break;
+    case UNW_IA64_CFM:          addr = &uc->uc_mcontext.sc_ar_pfs; break;
+    case UNW_IA64_AR_RNAT:      addr = &uc->uc_mcontext.sc_ar_rnat; break;
+    case UNW_IA64_AR_UNAT:      addr = &uc->uc_mcontext.sc_ar_unat; break;
+    case UNW_IA64_AR_LC:        addr = &uc->uc_mcontext.sc_ar_lc; break;
+    case UNW_IA64_AR_FPSR:      addr = &uc->uc_mcontext.sc_ar_fpsr; break;
+    case UNW_IA64_PR:           addr = &uc->uc_mcontext.sc_pr; break;
+    case UNW_IA64_AR_BSPSTORE:  addr = &uc->uc_mcontext.sc_ar_bsp; break;
 
     case UNW_IA64_GR + 4 ... UNW_IA64_GR + 7:
     case UNW_IA64_GR + 12:
@@ -117,41 +117,41 @@ static inline long
 ia64_read_only_reg (void *addr)
 {
   return ((unsigned long) ((char *) addr - (char *) &unw.read_only)
-	  < sizeof (unw.read_only));
+          < sizeof (unw.read_only));
 }
 
 #endif /* !defined(HAVE_SYS_UC_ACCESS_H) && !defined(UNW_REMOTE_ONLY) */
 
 /* Bits 0 and 1 of a location are used to encode its type:
-	bit 0: set if location uses floating-point format.
-	bit 1: set if location is a NaT bit on memory stack.  */
+        bit 0: set if location uses floating-point format.
+        bit 1: set if location is a NaT bit on memory stack.  */
 
-#define IA64_LOC_TYPE_FP		(1 << 0)
-#define IA64_LOC_TYPE_MEMSTK_NAT	(1 << 1)
+#define IA64_LOC_TYPE_FP                (1 << 0)
+#define IA64_LOC_TYPE_MEMSTK_NAT        (1 << 1)
 
 #ifdef UNW_LOCAL_ONLY
-#define IA64_LOC_REG(r,t)	(((r) << 2) | (t))
-#define IA64_LOC_ADDR(a,t)	(((a) & ~0x3) | (t))
-#define IA64_LOC_UC_ADDR(a,t)	IA64_LOC_ADDR(a, t)
-#define IA64_NULL_LOC		(0)
-
-#define IA64_GET_REG(l)		((l) >> 2)
-#define IA64_GET_ADDR(l)	((l) & ~0x3)
-#define IA64_IS_NULL_LOC(l)	((l) == 0)
-#define IA64_IS_FP_LOC(l)	(((l) & IA64_LOC_TYPE_FP) != 0)
-#define IA64_IS_MEMSTK_NAT(l)	(((l) & IA64_LOC_TYPE_MEMSTK_NAT) != 0)
-#define IA64_IS_REG_LOC(l)	0
-#define IA64_IS_UC_LOC(l)	0
-
-#define IA64_REG_LOC(c,r)	((unw_word_t) uc_addr((c)->as_arg, r, NULL))
-#define IA64_REG_NAT_LOC(c,r,n)	((unw_word_t) uc_addr((c)->as_arg, r, n))
-#define IA64_FPREG_LOC(c,r)						 \
-	((unw_word_t) uc_addr((c)->as_arg, (r), NULL) | IA64_LOC_TYPE_FP)
-
-# define ia64_find_proc_info(c,ip,n)					\
-	tdep_find_proc_info(unw_local_addr_space, (ip), &(c)->pi, (n),	\
-			    (c)->as_arg)
-# define ia64_put_unwind_info(c, pi)	do { ; } while (0)
+#define IA64_LOC_REG(r,t)       (((r) << 2) | (t))
+#define IA64_LOC_ADDR(a,t)      (((a) & ~0x3) | (t))
+#define IA64_LOC_UC_ADDR(a,t)   IA64_LOC_ADDR(a, t)
+#define IA64_NULL_LOC           (0)
+
+#define IA64_GET_REG(l)         ((l) >> 2)
+#define IA64_GET_ADDR(l)        ((l) & ~0x3)
+#define IA64_IS_NULL_LOC(l)     ((l) == 0)
+#define IA64_IS_FP_LOC(l)       (((l) & IA64_LOC_TYPE_FP) != 0)
+#define IA64_IS_MEMSTK_NAT(l)   (((l) & IA64_LOC_TYPE_MEMSTK_NAT) != 0)
+#define IA64_IS_REG_LOC(l)      0
+#define IA64_IS_UC_LOC(l)       0
+
+#define IA64_REG_LOC(c,r)       ((unw_word_t) uc_addr((c)->as_arg, r, NULL))
+#define IA64_REG_NAT_LOC(c,r,n) ((unw_word_t) uc_addr((c)->as_arg, r, n))
+#define IA64_FPREG_LOC(c,r)                                              \
+        ((unw_word_t) uc_addr((c)->as_arg, (r), NULL) | IA64_LOC_TYPE_FP)
+
+# define ia64_find_proc_info(c,ip,n)                                    \
+        tdep_find_proc_info(unw_local_addr_space, (ip), &(c)->pi, (n),  \
+                            (c)->as_arg)
+# define ia64_put_unwind_info(c, pi)    do { ; } while (0)
 
 /* Note: the register accessors (ia64_{get,set}{,fp}()) must check for
    NULL locations because uc_addr() returns NULL for unsaved
@@ -224,47 +224,47 @@ ia64_put (struct cursor *c, unw_word_t loc, unw_word_t val)
 /* Bits 0 and 1 of the second word (w1) of a location are used
    to further distinguish what location we're dealing with:
 
-   	bit 0: set if the location is a register
-	bit 1: set of the location is accessed via uc_access(3)  */
-#define IA64_LOC_TYPE_REG	(1 << 0)
-#define IA64_LOC_TYPE_UC	(1 << 1)
-
-#define IA64_LOC_REG(r,t)	((ia64_loc_t) { ((r) << 2) | (t),	\
-						IA64_LOC_TYPE_REG })
-#define IA64_LOC_ADDR(a,t)	((ia64_loc_t) { ((a) & ~0x3) | (t), 0 })
-#define IA64_LOC_UC_ADDR(a,t)	((ia64_loc_t) { ((a) & ~0x3) | (t),	\
-						IA64_LOC_TYPE_UC })
-#define IA64_LOC_UC_REG(r,a)	((ia64_loc_t) { ((r) << 2),		 \
-						((a) | IA64_LOC_TYPE_REG \
-					         | IA64_LOC_TYPE_UC) })
-#define IA64_NULL_LOC		((ia64_loc_t) { 0, 0 })
-
-#define IA64_GET_REG(l)		((l).w0 >> 2)
-#define IA64_GET_ADDR(l)	((l).w0 & ~0x3)
-#define IA64_GET_AUX_ADDR(l)	((l).w1 & ~0x3)
-#define IA64_IS_NULL_LOC(l)	(((l).w0 | (l).w1) == 0)
-#define IA64_IS_FP_LOC(l)	(((l).w0 & IA64_LOC_TYPE_FP) != 0)
-#define IA64_IS_MEMSTK_NAT(l)	(((l).w0 & IA64_LOC_TYPE_MEMSTK_NAT) != 0)
-#define IA64_IS_REG_LOC(l)	(((l).w1 & IA64_LOC_TYPE_REG) != 0)
-#define IA64_IS_UC_LOC(l)	(((l).w1 & IA64_LOC_TYPE_UC) != 0)
-
-#define IA64_REG_LOC(c,r)	IA64_LOC_REG ((r), 0)
-#define IA64_REG_NAT_LOC(c,r,n)	IA64_LOC_REG ((r), 0)
-#define IA64_FPREG_LOC(c,r)	IA64_LOC_REG ((r), IA64_LOC_TYPE_FP)
-
-# define ia64_find_proc_info(c,ip,n)					\
-	(*(c)->as->acc.find_proc_info)((c)->as, (ip), &(c)->pi, (n),	\
-				       (c)->as_arg)
-# define ia64_put_unwind_info(c,pi)					\
-	(*(c)->as->acc.put_unwind_info)((c)->as, (pi), (c)->as_arg)
-
-#define ia64_uc_access_reg	UNW_OBJ(uc_access_reg)
-#define ia64_uc_access_fpreg	UNW_OBJ(uc_access_fpreg)
+        bit 0: set if the location is a register
+        bit 1: set of the location is accessed via uc_access(3)  */
+#define IA64_LOC_TYPE_REG       (1 << 0)
+#define IA64_LOC_TYPE_UC        (1 << 1)
+
+#define IA64_LOC_REG(r,t)       ((ia64_loc_t) { ((r) << 2) | (t),       \
+                                                IA64_LOC_TYPE_REG })
+#define IA64_LOC_ADDR(a,t)      ((ia64_loc_t) { ((a) & ~0x3) | (t), 0 })
+#define IA64_LOC_UC_ADDR(a,t)   ((ia64_loc_t) { ((a) & ~0x3) | (t),     \
+                                                IA64_LOC_TYPE_UC })
+#define IA64_LOC_UC_REG(r,a)    ((ia64_loc_t) { ((r) << 2),              \
+                                                ((a) | IA64_LOC_TYPE_REG \
+                                                 | IA64_LOC_TYPE_UC) })
+#define IA64_NULL_LOC           ((ia64_loc_t) { 0, 0 })
+
+#define IA64_GET_REG(l)         ((l).w0 >> 2)
+#define IA64_GET_ADDR(l)        ((l).w0 & ~0x3)
+#define IA64_GET_AUX_ADDR(l)    ((l).w1 & ~0x3)
+#define IA64_IS_NULL_LOC(l)     (((l).w0 | (l).w1) == 0)
+#define IA64_IS_FP_LOC(l)       (((l).w0 & IA64_LOC_TYPE_FP) != 0)
+#define IA64_IS_MEMSTK_NAT(l)   (((l).w0 & IA64_LOC_TYPE_MEMSTK_NAT) != 0)
+#define IA64_IS_REG_LOC(l)      (((l).w1 & IA64_LOC_TYPE_REG) != 0)
+#define IA64_IS_UC_LOC(l)       (((l).w1 & IA64_LOC_TYPE_UC) != 0)
+
+#define IA64_REG_LOC(c,r)       IA64_LOC_REG ((r), 0)
+#define IA64_REG_NAT_LOC(c,r,n) IA64_LOC_REG ((r), 0)
+#define IA64_FPREG_LOC(c,r)     IA64_LOC_REG ((r), IA64_LOC_TYPE_FP)
+
+# define ia64_find_proc_info(c,ip,n)                                    \
+        (*(c)->as->acc.find_proc_info)((c)->as, (ip), &(c)->pi, (n),    \
+                                       (c)->as_arg)
+# define ia64_put_unwind_info(c,pi)                                     \
+        (*(c)->as->acc.put_unwind_info)((c)->as, (pi), (c)->as_arg)
+
+#define ia64_uc_access_reg      UNW_OBJ(uc_access_reg)
+#define ia64_uc_access_fpreg    UNW_OBJ(uc_access_fpreg)
 
 extern int ia64_uc_access_reg (struct cursor *c, ia64_loc_t loc,
-			       unw_word_t *valp, int write);
+                               unw_word_t *valp, int write);
 extern int ia64_uc_access_fpreg (struct cursor *c, ia64_loc_t loc,
-				 unw_fpreg_t *valp, int write);
+                                 unw_fpreg_t *valp, int write);
 
 static inline int
 ia64_getfp (struct cursor *c, ia64_loc_t loc, unw_fpreg_t *val)
@@ -283,16 +283,16 @@ ia64_getfp (struct cursor *c, ia64_loc_t loc, unw_fpreg_t *val)
 
   if (IA64_IS_REG_LOC (loc))
     return (*c->as->acc.access_fpreg) (c->as, IA64_GET_REG (loc),
-				       val, 0, c->as_arg);
+                                       val, 0, c->as_arg);
 
   addr = IA64_GET_ADDR (loc);
   ret = (*c->as->acc.access_mem) (c->as, addr + 0, &val->raw.bits[0], 0,
-				  c->as_arg);
+                                  c->as_arg);
   if (ret < 0)
     return ret;
 
   return (*c->as->acc.access_mem) (c->as, addr + 8, &val->raw.bits[1], 0,
-				   c->as_arg);
+                                   c->as_arg);
 }
 
 static inline int
@@ -312,16 +312,16 @@ ia64_putfp (struct cursor *c, ia64_loc_t loc, unw_fpreg_t val)
 
   if (IA64_IS_REG_LOC (loc))
     return (*c->as->acc.access_fpreg) (c->as, IA64_GET_REG (loc), &val, 1,
-				       c->as_arg);
+                                       c->as_arg);
 
   addr = IA64_GET_ADDR (loc);
   ret = (*c->as->acc.access_mem) (c->as, addr + 0, &val.raw.bits[0], 1,
-				  c->as_arg);
+                                  c->as_arg);
   if (ret < 0)
     return ret;
 
   return (*c->as->acc.access_mem) (c->as, addr + 8, &val.raw.bits[1], 1,
-				   c->as_arg);
+                                   c->as_arg);
 }
 
 /* Get the 64 data bits from location LOC.  If bit 0 is cleared, LOC
@@ -345,12 +345,12 @@ ia64_get (struct cursor *c, ia64_loc_t loc, unw_word_t *val)
 
       ret = ia64_getfp (c, loc, &tmp);
       if (ret < 0)
-	return ret;
+        return ret;
 
       if (c->as->big_endian)
-	*val = tmp.raw.bits[1];
+        *val = tmp.raw.bits[1];
       else
-	*val = tmp.raw.bits[0];
+        *val = tmp.raw.bits[0];
       return 0;
     }
 
@@ -359,10 +359,10 @@ ia64_get (struct cursor *c, ia64_loc_t loc, unw_word_t *val)
 
   if (IA64_IS_REG_LOC (loc))
     return (*c->as->acc.access_reg)(c->as, IA64_GET_REG (loc), val, 0,
-				    c->as_arg);
+                                    c->as_arg);
   else
     return (*c->as->acc.access_mem)(c->as, IA64_GET_ADDR (loc), val, 0,
-				    c->as_arg);
+                                    c->as_arg);
 }
 
 static inline int
@@ -380,9 +380,9 @@ ia64_put (struct cursor *c, ia64_loc_t loc, unw_word_t val)
 
       memset (&tmp, 0, sizeof (tmp));
       if (c->as->big_endian)
-	tmp.raw.bits[1] = val;
+        tmp.raw.bits[1] = val;
       else
-	tmp.raw.bits[0] = val;
+        tmp.raw.bits[0] = val;
       return ia64_putfp (c, loc, tmp);
     }
 
@@ -391,10 +391,10 @@ ia64_put (struct cursor *c, ia64_loc_t loc, unw_word_t val)
 
   if (IA64_IS_REG_LOC (loc))
     return (*c->as->acc.access_reg)(c->as, IA64_GET_REG (loc), &val, 1,
-				    c->as_arg);
+                                    c->as_arg);
   else
     return (*c->as->acc.access_mem)(c->as, IA64_GET_ADDR (loc), &val, 1,
-				    c->as_arg);
+                                    c->as_arg);
 }
 
 #endif /* !UNW_LOCAL_ONLY */
@@ -402,7 +402,7 @@ ia64_put (struct cursor *c, ia64_loc_t loc, unw_word_t val)
 struct ia64_unwind_block
   {
     unw_word_t header;
-    unw_word_t desc[0];			/* unwind descriptors */
+    unw_word_t desc[0];                 /* unwind descriptors */
 
     /* Personality routine and language-specific data follow behind
        descriptors.  */
@@ -410,58 +410,58 @@ struct ia64_unwind_block
 
 enum ia64_where
   {
-    IA64_WHERE_NONE,	/* register isn't saved at all */
-    IA64_WHERE_GR,	/* register is saved in a general register */
-    IA64_WHERE_FR,	/* register is saved in a floating-point register */
-    IA64_WHERE_BR,	/* register is saved in a branch register */
-    IA64_WHERE_SPREL,	/* register is saved on memstack (sp-relative) */
-    IA64_WHERE_PSPREL,	/* register is saved on memstack (psp-relative) */
+    IA64_WHERE_NONE,    /* register isn't saved at all */
+    IA64_WHERE_GR,      /* register is saved in a general register */
+    IA64_WHERE_FR,      /* register is saved in a floating-point register */
+    IA64_WHERE_BR,      /* register is saved in a branch register */
+    IA64_WHERE_SPREL,   /* register is saved on memstack (sp-relative) */
+    IA64_WHERE_PSPREL,  /* register is saved on memstack (psp-relative) */
 
     /* At the end of each prologue these locations get resolved to
        IA64_WHERE_PSPREL and IA64_WHERE_GR, respectively:  */
 
     IA64_WHERE_SPILL_HOME, /* register is saved in its spill home */
-    IA64_WHERE_GR_SAVE	/* register is saved in next general register */
+    IA64_WHERE_GR_SAVE  /* register is saved in next general register */
   };
 
-#define IA64_WHEN_NEVER	0x7fffffff
+#define IA64_WHEN_NEVER 0x7fffffff
 
 struct ia64_reg_info
   {
-    unw_word_t val;		/* save location: register number or offset */
-    enum ia64_where where;	/* where the register gets saved */
-    int when;			/* when the register gets saved */
+    unw_word_t val;             /* save location: register number or offset */
+    enum ia64_where where;      /* where the register gets saved */
+    int when;                   /* when the register gets saved */
   };
 
-struct ia64_labeled_state;	/* opaque structure */
+struct ia64_labeled_state;      /* opaque structure */
 
 struct ia64_reg_state
   {
     struct ia64_reg_state *next;    /* next (outer) element on state stack */
-    struct ia64_reg_info reg[IA64_NUM_PREGS];	/* register save locations */
+    struct ia64_reg_info reg[IA64_NUM_PREGS];   /* register save locations */
   };
 
 struct ia64_state_record
   {
-    unsigned int first_region : 1;	/* is this the first region? */
-    unsigned int done : 1;		/* are we done scanning descriptors? */
-    unsigned int any_spills : 1;	/* got any register spills? */
-    unsigned int in_body : 1;		/* are we inside prologue or body? */
-    uint8_t *imask;		/* imask of spill_mask record or NULL */
+    unsigned int first_region : 1;      /* is this the first region? */
+    unsigned int done : 1;              /* are we done scanning descriptors? */
+    unsigned int any_spills : 1;        /* got any register spills? */
+    unsigned int in_body : 1;           /* are we inside prologue or body? */
+    uint8_t *imask;             /* imask of spill_mask record or NULL */
     uint16_t abi_marker;
 
-    unw_word_t pr_val;		/* predicate values */
-    unw_word_t pr_mask;		/* predicate mask */
+    unw_word_t pr_val;          /* predicate values */
+    unw_word_t pr_mask;         /* predicate mask */
 
-    long spill_offset;		/* psp-relative offset for spill base */
+    long spill_offset;          /* psp-relative offset for spill base */
     int region_start;
     int region_len;
     int when_sp_restored;
     int epilogue_count;
     int when_target;
 
-    uint8_t gr_save_loc;	/* next save register */
-    uint8_t return_link_reg;	/* branch register used as return pointer */
+    uint8_t gr_save_loc;        /* next save register */
+    uint8_t return_link_reg;    /* branch register used as return pointer */
 
     struct ia64_labeled_state *labeled_states;
     struct ia64_reg_state curr;
@@ -469,65 +469,65 @@ struct ia64_state_record
 
 struct ia64_labeled_state
   {
-    struct ia64_labeled_state *next;	/* next label (or NULL) */
-    unsigned long label;			/* label for this state */
+    struct ia64_labeled_state *next;    /* next label (or NULL) */
+    unsigned long label;                        /* label for this state */
     struct ia64_reg_state saved_state;
   };
 
 /* Convenience macros: */
-#define ia64_make_proc_info		UNW_OBJ(make_proc_info)
-#define ia64_fetch_proc_info		UNW_OBJ(fetch_proc_info)
-#define ia64_create_state_record	UNW_OBJ(create_state_record)
-#define ia64_free_state_record		UNW_OBJ(free_state_record)
-#define ia64_find_save_locs		UNW_OBJ(find_save_locs)
-#define ia64_validate_cache		UNW_OBJ(ia64_validate_cache)
-#define ia64_local_validate_cache	UNW_OBJ(ia64_local_validate_cache)
-#define ia64_per_thread_cache		UNW_OBJ(per_thread_cache)
-#define ia64_scratch_loc		UNW_OBJ(scratch_loc)
-#define ia64_local_resume		UNW_OBJ(local_resume)
-#define ia64_local_addr_space_init	UNW_OBJ(local_addr_space_init)
-#define ia64_strloc			UNW_OBJ(strloc)
-#define ia64_install_cursor		UNW_OBJ(install_cursor)
-#define rbs_switch			UNW_OBJ(rbs_switch)
-#define rbs_find_stacked		UNW_OBJ(rbs_find_stacked)
+#define ia64_make_proc_info             UNW_OBJ(make_proc_info)
+#define ia64_fetch_proc_info            UNW_OBJ(fetch_proc_info)
+#define ia64_create_state_record        UNW_OBJ(create_state_record)
+#define ia64_free_state_record          UNW_OBJ(free_state_record)
+#define ia64_find_save_locs             UNW_OBJ(find_save_locs)
+#define ia64_validate_cache             UNW_OBJ(ia64_validate_cache)
+#define ia64_local_validate_cache       UNW_OBJ(ia64_local_validate_cache)
+#define ia64_per_thread_cache           UNW_OBJ(per_thread_cache)
+#define ia64_scratch_loc                UNW_OBJ(scratch_loc)
+#define ia64_local_resume               UNW_OBJ(local_resume)
+#define ia64_local_addr_space_init      UNW_OBJ(local_addr_space_init)
+#define ia64_strloc                     UNW_OBJ(strloc)
+#define ia64_install_cursor             UNW_OBJ(install_cursor)
+#define rbs_switch                      UNW_OBJ(rbs_switch)
+#define rbs_find_stacked                UNW_OBJ(rbs_find_stacked)
 
 extern int ia64_make_proc_info (struct cursor *c);
 extern int ia64_fetch_proc_info (struct cursor *c, unw_word_t ip,
-				 int need_unwind_info);
+                                 int need_unwind_info);
 /* The proc-info must be valid for IP before this routine can be
    called:  */
 extern int ia64_create_state_record (struct cursor *c,
-				     struct ia64_state_record *sr);
+                                     struct ia64_state_record *sr);
 extern int ia64_free_state_record (struct ia64_state_record *sr);
 extern int ia64_find_save_locs (struct cursor *c);
 extern void ia64_validate_cache (unw_addr_space_t as, void *arg);
 extern int ia64_local_validate_cache (unw_addr_space_t as, void *arg);
 extern void ia64_local_addr_space_init (void);
 extern ia64_loc_t ia64_scratch_loc (struct cursor *c, unw_regnum_t reg,
-				    uint8_t *nat_bitnr);
+                                    uint8_t *nat_bitnr);
 
 extern NORETURN void ia64_install_cursor (struct cursor *c,
-					  unw_word_t pri_unat,
-					  unw_word_t *extra,
-					  unw_word_t bspstore,
-					  unw_word_t dirty_size,
-					  unw_word_t *dirty_partition,
-					  unw_word_t dirty_rnat);
+                                          unw_word_t pri_unat,
+                                          unw_word_t *extra,
+                                          unw_word_t bspstore,
+                                          unw_word_t dirty_size,
+                                          unw_word_t *dirty_partition,
+                                          unw_word_t dirty_rnat);
 extern int ia64_local_resume (unw_addr_space_t as, unw_cursor_t *cursor,
-			      void *arg);
+                              void *arg);
 extern int rbs_switch (struct cursor *c,
-		       unw_word_t saved_bsp, unw_word_t saved_bspstore,
-		       ia64_loc_t saved_rnat_loc);
+                       unw_word_t saved_bsp, unw_word_t saved_bspstore,
+                       ia64_loc_t saved_rnat_loc);
 extern int rbs_find_stacked (struct cursor *c, unw_word_t regs_to_skip,
-			     ia64_loc_t *locp, ia64_loc_t *rnat_locp);
+                             ia64_loc_t *locp, ia64_loc_t *rnat_locp);
 
 #ifndef UNW_REMOTE_ONLY
 # define NEED_RBS_COVER_AND_FLUSH
-# define rbs_cover_and_flush	UNW_OBJ(rbs_cover_and_flush)
+# define rbs_cover_and_flush    UNW_OBJ(rbs_cover_and_flush)
   extern int rbs_cover_and_flush (struct cursor *c, unw_word_t nregs,
-				  unw_word_t *dirty_partition,
-				  unw_word_t *dirty_rnat,
-				  unw_word_t *bspstore);
+                                  unw_word_t *dirty_partition,
+                                  unw_word_t *dirty_rnat,
+                                  unw_word_t *bspstore);
 #endif
 
 /* Warning: ia64_strloc() is for debugging only and it is NOT re-entrant! */
@@ -554,7 +554,7 @@ rbs_contains (struct rbs_area *rbs, unw_word_t bsp)
      take advantage of the fact that -n == ~n + 1.  */
   result = bsp - rbs->end > ~rbs->size;
   Debug (16, "0x%lx in [0x%lx-0x%lx) => %d\n",
-	 (long) bsp, (long) (rbs->end - rbs->size), (long) rbs->end, result);
+         (long) bsp, (long) (rbs->end - rbs->size), (long) rbs->end, result);
   return result;
 }
 
@@ -567,9 +567,9 @@ rbs_get_rnat_loc (struct rbs_area *rbs, unw_word_t bsp)
   if (rbs_contains (rbs, rnat_addr))
     {
       if (rbs_on_uc (rbs))
-	rnat_loc = IA64_LOC_UC_ADDR (rnat_addr, 0);
+        rnat_loc = IA64_LOC_UC_ADDR (rnat_addr, 0);
       else
-	rnat_loc = IA64_LOC_ADDR (rnat_addr, 0);
+        rnat_loc = IA64_LOC_ADDR (rnat_addr, 0);
     }
   else
     rnat_loc = rbs->rnat_loc;
@@ -587,7 +587,7 @@ rbs_loc (struct rbs_area *rbs, unw_word_t bsp)
 
 static inline int
 ia64_get_stacked (struct cursor *c, unw_word_t reg,
-		  ia64_loc_t *locp, ia64_loc_t *rnat_locp)
+                  ia64_loc_t *locp, ia64_loc_t *rnat_locp)
 {
   struct rbs_area *rbs = c->rbs_area + c->rbs_curr;
   unw_word_t addr, regs_to_skip = reg - 32;
@@ -609,15 +609,15 @@ ia64_get_stacked (struct cursor *c, unw_word_t reg,
 /* The UNaT slot # calculation is identical to the one for RNaT slots,
    but for readability/clarity, we don't want to use
    ia64_rnat_slot_num() directly.  */
-#define ia64_unat_slot_num(addr)	rse_slot_num(addr)
+#define ia64_unat_slot_num(addr)        rse_slot_num(addr)
 
 /* The following are helper macros which makes it easier for libunwind
    to be used in the kernel.  They allow the kernel to optimize away
    any unused code without littering everything with #ifdefs.  */
-#define ia64_is_big_endian(c)	((c)->as->big_endian)
-#define ia64_get_abi(c)		((c)->as->abi)
-#define ia64_set_abi(c, v)	((c)->as->abi = (v))
-#define ia64_get_abi_marker(c)	((c)->last_abi_marker)
+#define ia64_is_big_endian(c)   ((c)->as->big_endian)
+#define ia64_get_abi(c)         ((c)->as->abi)
+#define ia64_set_abi(c, v)      ((c)->as->abi = (v))
+#define ia64_get_abi_marker(c)  ((c)->last_abi_marker)
 
 /* XXX should be in glibc: */
 #ifndef IA64_SC_FLAG_ONSTACK
@@ -625,9 +625,9 @@ ia64_get_stacked (struct cursor *c, unw_word_t reg,
 # define IA64_SC_FLAG_IN_SYSCALL_BIT 1 /* did signal interrupt a syscall? */
 # define IA64_SC_FLAG_FPH_VALID_BIT  2 /* is state in f[32]-f[127] valid? */
 
-# define IA64_SC_FLAG_ONSTACK		(1 << IA64_SC_FLAG_ONSTACK_BIT)
-# define IA64_SC_FLAG_IN_SYSCALL	(1 << IA64_SC_FLAG_IN_SYSCALL_BIT)
-# define IA64_SC_FLAG_FPH_VALID		(1 << IA64_SC_FLAG_FPH_VALID_BIT)
+# define IA64_SC_FLAG_ONSTACK           (1 << IA64_SC_FLAG_ONSTACK_BIT)
+# define IA64_SC_FLAG_IN_SYSCALL        (1 << IA64_SC_FLAG_IN_SYSCALL_BIT)
+# define IA64_SC_FLAG_FPH_VALID         (1 << IA64_SC_FLAG_FPH_VALID_BIT)
 #endif
 
 #endif /* unwind_i_h */
diff --git a/frysk-imports/libunwind/src/libunwind-generic.pc.in b/frysk-imports/libunwind/src/libunwind-generic.pc.in
new file mode 100644
index 0000000..1f3baff
--- /dev/null
+++ b/frysk-imports/libunwind/src/libunwind-generic.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: libunwind-generic
+Description: libunwind generic library
+Version: @VERSION@
+Requires: libunwind
+Libs: -L${libdir} -lunwind-generic
+Cflags: -I${includedir}
diff --git a/frysk-imports/libunwind/src/mi/Gdestroy_addr_space.c b/frysk-imports/libunwind/src/mi/Gdestroy_addr_space.c
index 83a01b9..719c051 100644
--- a/frysk-imports/libunwind/src/mi/Gdestroy_addr_space.c
+++ b/frysk-imports/libunwind/src/mi/Gdestroy_addr_space.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2002, 2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
diff --git a/frysk-imports/libunwind/src/mi/Gdyn-extract.c b/frysk-imports/libunwind/src/mi/Gdyn-extract.c
index 5258839..c8ae7a0 100644
--- a/frysk-imports/libunwind/src/mi/Gdyn-extract.c
+++ b/frysk-imports/libunwind/src/mi/Gdyn-extract.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2001-2002, 2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -27,8 +27,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 HIDDEN int
 unwi_extract_dynamic_proc_info (unw_addr_space_t as, unw_word_t ip,
-				unw_proc_info_t *pi, unw_dyn_info_t *di,
-				int need_unwind_info, void *arg)
+                                unw_proc_info_t *pi, unw_dyn_info_t *di,
+                                int need_unwind_info, void *arg)
 {
   pi->start_ip = di->start_ip;
   pi->end_ip = di->end_ip;
@@ -42,13 +42,14 @@ unwi_extract_dynamic_proc_info (unw_addr_space_t as, unw_word_t ip,
       pi->flags = di->u.pi.flags;
       pi->unwind_info_size = 0;
       if (need_unwind_info)
-	pi->unwind_info = di;
+        pi->unwind_info = di;
       else
-	pi->unwind_info = NULL;
+        pi->unwind_info = NULL;
       return 0;
 
     case UNW_INFO_FORMAT_TABLE:
     case UNW_INFO_FORMAT_REMOTE_TABLE:
+    case UNW_INFO_FORMAT_IP_OFFSET:
 #ifdef tdep_search_unwind_table
       /* call platform-specific search routine: */
       return tdep_search_unwind_table (as, ip, di, pi, need_unwind_info, arg);
diff --git a/frysk-imports/libunwind/src/mi/Gdyn-remote.c b/frysk-imports/libunwind/src/mi/Gdyn-remote.c
index 917a11d..1f029b4 100644
--- a/frysk-imports/libunwind/src/mi/Gdyn-remote.c
+++ b/frysk-imports/libunwind/src/mi/Gdyn-remote.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2001-2002, 2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -38,7 +38,7 @@ free_regions (unw_dyn_region_info_t *region)
 
 static int
 intern_op (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
-	   unw_dyn_op_t *op, void *arg)
+           unw_dyn_op_t *op, void *arg)
 {
   int ret;
 
@@ -53,7 +53,7 @@ intern_op (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
 
 static int
 intern_regions (unw_addr_space_t as, unw_accessors_t *a,
-		unw_word_t *addr, unw_dyn_region_info_t **regionp, void *arg)
+                unw_word_t *addr, unw_dyn_region_info_t **regionp, void *arg)
 {
   uint32_t insn_count, op_count, i;
   unw_dyn_region_info_t *region;
@@ -63,7 +63,7 @@ intern_regions (unw_addr_space_t as, unw_accessors_t *a,
   *regionp = NULL;
 
   if (!*addr)
-    return 0;	/* NULL region-list */
+    return 0;   /* NULL region-list */
 
   if ((ret = fetchw (as, a, addr, &next_addr, arg)) < 0
       || (ret = fetch32 (as, a, addr, (int32_t *) &insn_count, arg)) < 0
@@ -98,8 +98,8 @@ intern_regions (unw_addr_space_t as, unw_accessors_t *a,
 
 static int
 intern_array (unw_addr_space_t as, unw_accessors_t *a,
-	      unw_word_t *addr, unw_word_t table_len, unw_word_t **table_data,
-	      void *arg)
+              unw_word_t *addr, unw_word_t table_len, unw_word_t **table_data,
+              void *arg)
 {
   unw_word_t i, *data = calloc (table_len, WSIZE);
   int ret = 0;
@@ -130,18 +130,18 @@ free_dyn_info (unw_dyn_info_t *di)
     {
     case UNW_INFO_FORMAT_DYNAMIC:
       if (di->u.pi.regions)
-	{
-	  free_regions (di->u.pi.regions);
-	  di->u.pi.regions = NULL;
-	}
+        {
+          free_regions (di->u.pi.regions);
+          di->u.pi.regions = NULL;
+        }
       break;
 
     case UNW_INFO_FORMAT_TABLE:
       if (di->u.ti.table_data)
-	{
-	  free (di->u.ti.table_data);
-	  di->u.ti.table_data = NULL;
-	}
+        {
+          free (di->u.ti.table_data);
+          di->u.ti.table_data = NULL;
+        }
       break;
 
     case UNW_INFO_FORMAT_REMOTE_TABLE:
@@ -152,7 +152,7 @@ free_dyn_info (unw_dyn_info_t *di)
 
 static int
 intern_dyn_info (unw_addr_space_t as, unw_accessors_t *a,
-		 unw_word_t *addr, unw_dyn_info_t *di, void *arg)
+                 unw_word_t *addr, unw_dyn_info_t *di, void *arg)
 {
   unw_word_t first_region;
   int ret;
@@ -161,32 +161,32 @@ intern_dyn_info (unw_addr_space_t as, unw_accessors_t *a,
     {
     case UNW_INFO_FORMAT_DYNAMIC:
       if ((ret = fetchw (as, a, addr, &di->u.pi.name_ptr, arg)) < 0
-	  || (ret = fetchw (as, a, addr, &di->u.pi.handler, arg)) < 0
-	  || (ret = fetch32 (as, a, addr,
-			     (int32_t *) &di->u.pi.flags, arg)) < 0)
-	goto out;
-      *addr += 4;	/* skip over pad0 */
+          || (ret = fetchw (as, a, addr, &di->u.pi.handler, arg)) < 0
+          || (ret = fetch32 (as, a, addr,
+                             (int32_t *) &di->u.pi.flags, arg)) < 0)
+        goto out;
+      *addr += 4;       /* skip over pad0 */
       if ((ret = fetchw (as, a, addr, &first_region, arg)) < 0
-	  || (ret = intern_regions (as, a, &first_region, &di->u.pi.regions,
-				    arg)) < 0)
-	goto out;
+          || (ret = intern_regions (as, a, &first_region, &di->u.pi.regions,
+                                    arg)) < 0)
+        goto out;
       break;
 
     case UNW_INFO_FORMAT_TABLE:
       if ((ret = fetchw (as, a, addr, &di->u.ti.name_ptr, arg)) < 0
-	  || (ret = fetchw (as, a, addr, &di->u.ti.segbase, arg)) < 0
-	  || (ret = fetchw (as, a, addr, &di->u.ti.table_len, arg)) < 0
-	  || (ret = intern_array (as, a, addr, di->u.ti.table_len,
-				  &di->u.ti.table_data, arg)) < 0)
-	goto out;
+          || (ret = fetchw (as, a, addr, &di->u.ti.segbase, arg)) < 0
+          || (ret = fetchw (as, a, addr, &di->u.ti.table_len, arg)) < 0
+          || (ret = intern_array (as, a, addr, di->u.ti.table_len,
+                                  &di->u.ti.table_data, arg)) < 0)
+        goto out;
       break;
 
     case UNW_INFO_FORMAT_REMOTE_TABLE:
       if ((ret = fetchw (as, a, addr, &di->u.rti.name_ptr, arg)) < 0
-	  || (ret = fetchw (as, a, addr, &di->u.rti.segbase, arg)) < 0
-	  || (ret = fetchw (as, a, addr, &di->u.rti.table_len, arg)) < 0
-	  || (ret = fetchw (as, a, addr, &di->u.rti.table_data, arg)) < 0)
-	goto out;
+          || (ret = fetchw (as, a, addr, &di->u.rti.segbase, arg)) < 0
+          || (ret = fetchw (as, a, addr, &di->u.rti.table_len, arg)) < 0
+          || (ret = fetchw (as, a, addr, &di->u.rti.table_data, arg)) < 0)
+        goto out;
       break;
 
     default:
@@ -202,8 +202,8 @@ intern_dyn_info (unw_addr_space_t as, unw_accessors_t *a,
 
 HIDDEN int
 unwi_dyn_remote_find_proc_info (unw_addr_space_t as, unw_word_t ip,
-				unw_proc_info_t *pi,
-				int need_unwind_info, void *arg)
+                                unw_proc_info_t *pi,
+                                int need_unwind_info, void *arg)
 {
   unw_accessors_t *a = unw_get_accessors (as);
   unw_word_t dyn_list_addr, addr, next_addr, gen1, gen2, start_ip, end_ip;
@@ -215,9 +215,9 @@ unwi_dyn_remote_find_proc_info (unw_addr_space_t as, unw_word_t ip,
   else
     {
       if ((*a->get_dyn_info_list_addr) (as, &dyn_list_addr, arg) < 0)
-	return -UNW_ENOINFO;
+        return -UNW_ENOINFO;
       if (as->caching_policy != UNW_CACHE_NONE)
-	as->dyn_info_list_addr = dyn_list_addr;
+        as->dyn_info_list_addr = dyn_list_addr;
     }
 
   do
@@ -227,55 +227,55 @@ unwi_dyn_remote_find_proc_info (unw_addr_space_t as, unw_word_t ip,
       ret = -UNW_ENOINFO;
 
       if (fetchw (as, a, &addr, &gen1, arg) < 0
-	  || fetchw (as, a, &addr, &next_addr, arg) < 0)
-	return ret;
+          || fetchw (as, a, &addr, &next_addr, arg) < 0)
+        return ret;
 
       for (addr = next_addr; addr != 0; addr = next_addr)
-	{
-	  if (fetchw (as, a, &addr, &next_addr, arg) < 0)
-	    goto recheck;	/* only fail if generation # didn't change */
+        {
+          if (fetchw (as, a, &addr, &next_addr, arg) < 0)
+            goto recheck;       /* only fail if generation # didn't change */
 
-	  addr += WSIZE;	/* skip over prev_addr */
+          addr += WSIZE;        /* skip over prev_addr */
 
-	  if (fetchw (as, a, &addr, &start_ip, arg) < 0
-	      || fetchw (as, a, &addr, &end_ip, arg) < 0)
-	    goto recheck;	/* only fail if generation # didn't change */
+          if (fetchw (as, a, &addr, &start_ip, arg) < 0
+              || fetchw (as, a, &addr, &end_ip, arg) < 0)
+            goto recheck;       /* only fail if generation # didn't change */
 
-	  if (ip >= start_ip && ip < end_ip)
-	    {
-	      if (!di)
-		di = calloc (1, sizeof (*di));
+          if (ip >= start_ip && ip < end_ip)
+            {
+              if (!di)
+                di = calloc (1, sizeof (*di));
 
-	      di->start_ip = start_ip;
-	      di->end_ip = end_ip;
+              di->start_ip = start_ip;
+              di->end_ip = end_ip;
 
-	      if (fetchw (as, a, &addr, &di->gp, arg) < 0
-		  || fetch32 (as, a, &addr, &di->format, arg) < 0)
-		goto recheck;	/* only fail if generation # didn't change */
+              if (fetchw (as, a, &addr, &di->gp, arg) < 0
+                  || fetch32 (as, a, &addr, &di->format, arg) < 0)
+                goto recheck;   /* only fail if generation # didn't change */
 
-	      addr += 4;	/* skip over padding */
+              addr += 4;        /* skip over padding */
 
-	      if (need_unwind_info
-		  && intern_dyn_info (as, a, &addr, di, arg) < 0)
-		goto recheck;	/* only fail if generation # didn't change */
+              if (need_unwind_info
+                  && intern_dyn_info (as, a, &addr, di, arg) < 0)
+                goto recheck;   /* only fail if generation # didn't change */
 
-	      if (unwi_extract_dynamic_proc_info (as, ip, pi, di,
-						  need_unwind_info, arg) < 0)
-		{
-		  free_dyn_info (di);
-		  goto recheck;	/* only fail if generation # didn't change */
-		}
-	      ret = 0;	/* OK, found it */
-	      break;
-	    }
-	}
+              if (unwi_extract_dynamic_proc_info (as, ip, pi, di,
+                                                  need_unwind_info, arg) < 0)
+                {
+                  free_dyn_info (di);
+                  goto recheck; /* only fail if generation # didn't change */
+                }
+              ret = 0;  /* OK, found it */
+              break;
+            }
+        }
 
       /* Re-check generation number to ensure the data we have is
-	 consistent.  */
+         consistent.  */
     recheck:
       addr = dyn_list_addr;
       if (fetchw (as, a, &addr, &gen2, arg) < 0)
-	return ret;
+        return ret;
     }
   while (gen1 != gen2);
 
@@ -287,7 +287,7 @@ unwi_dyn_remote_find_proc_info (unw_addr_space_t as, unw_word_t ip,
 
 HIDDEN void
 unwi_dyn_remote_put_unwind_info (unw_addr_space_t as, unw_proc_info_t *pi,
-				 void *arg)
+                                 void *arg)
 {
   if (!pi->unwind_info)
     return;
diff --git a/frysk-imports/libunwind/src/mi/Gfind_dynamic_proc_info.c b/frysk-imports/libunwind/src/mi/Gfind_dynamic_proc_info.c
index 6cf3b42..98d3501 100644
--- a/frysk-imports/libunwind/src/mi/Gfind_dynamic_proc_info.c
+++ b/frysk-imports/libunwind/src/mi/Gfind_dynamic_proc_info.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2001-2002, 2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -29,7 +29,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 static inline int
 local_find_proc_info (unw_addr_space_t as, unw_word_t ip, unw_proc_info_t *pi,
-		      int need_unwind_info, void *arg)
+                      int need_unwind_info, void *arg)
 {
   return -UNW_ENOINFO;
 }
@@ -38,7 +38,7 @@ local_find_proc_info (unw_addr_space_t as, unw_word_t ip, unw_proc_info_t *pi,
 
 static inline int
 local_find_proc_info (unw_addr_space_t as, unw_word_t ip, unw_proc_info_t *pi,
-		      int need_unwind_info, void *arg)
+                      int need_unwind_info, void *arg)
 {
   unw_dyn_info_list_t *list;
   unw_dyn_info_t *di;
@@ -53,7 +53,7 @@ local_find_proc_info (unw_addr_space_t as, unw_word_t ip, unw_proc_info_t *pi,
   for (di = list->first; di; di = di->next)
     if (ip >= di->start_ip && ip < di->end_ip)
       return unwi_extract_dynamic_proc_info (as, ip, pi, di, need_unwind_info,
-					     arg);
+                                             arg);
   return -UNW_ENOINFO;
 }
 
@@ -63,7 +63,7 @@ local_find_proc_info (unw_addr_space_t as, unw_word_t ip, unw_proc_info_t *pi,
 
 static inline int
 remote_find_proc_info (unw_addr_space_t as, unw_word_t ip, unw_proc_info_t *pi,
-		       int need_unwind_info, void *arg)
+                       int need_unwind_info, void *arg)
 {
   return -UNW_ENOINFO;
 }
@@ -72,7 +72,7 @@ remote_find_proc_info (unw_addr_space_t as, unw_word_t ip, unw_proc_info_t *pi,
 
 static inline int
 remote_find_proc_info (unw_addr_space_t as, unw_word_t ip, unw_proc_info_t *pi,
-		       int need_unwind_info, void *arg)
+                       int need_unwind_info, void *arg)
 {
   return unwi_dyn_remote_find_proc_info (as, ip, pi, need_unwind_info, arg);
 }
@@ -81,8 +81,8 @@ remote_find_proc_info (unw_addr_space_t as, unw_word_t ip, unw_proc_info_t *pi,
 
 HIDDEN int
 unwi_find_dynamic_proc_info (unw_addr_space_t as, unw_word_t ip,
-			     unw_proc_info_t *pi, int need_unwind_info,
-			     void *arg)
+                             unw_proc_info_t *pi, int need_unwind_info,
+                             void *arg)
 {
   if (as == unw_local_addr_space)
     return local_find_proc_info (as, ip, pi, need_unwind_info, arg);
diff --git a/frysk-imports/libunwind/src/mi/Gget_accessors.c b/frysk-imports/libunwind/src/mi/Gget_accessors.c
index fb256d7..548c763 100644
--- a/frysk-imports/libunwind/src/mi/Gget_accessors.c
+++ b/frysk-imports/libunwind/src/mi/Gget_accessors.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2002, 2004-2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -28,7 +28,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 PROTECTED unw_accessors_t *
 unw_get_accessors (unw_addr_space_t as)
 {
-  if (tdep_needs_initialization)
+  if (!tdep_init_done)
     tdep_init ();
   return &as->acc;
 }
diff --git a/frysk-imports/libunwind/src/mi/Gget_fpreg.c b/frysk-imports/libunwind/src/mi/Gget_fpreg.c
index a9ae9bf..f2f7405 100644
--- a/frysk-imports/libunwind/src/mi/Gget_fpreg.c
+++ b/frysk-imports/libunwind/src/mi/Gget_fpreg.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2004-2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
diff --git a/frysk-imports/libunwind/src/mi/Gget_proc_info_by_ip.c b/frysk-imports/libunwind/src/mi/Gget_proc_info_by_ip.c
index 4c9de77..c39312d 100644
--- a/frysk-imports/libunwind/src/mi/Gget_proc_info_by_ip.c
+++ b/frysk-imports/libunwind/src/mi/Gget_proc_info_by_ip.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003, 2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -27,7 +27,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 PROTECTED int
 unw_get_proc_info_by_ip (unw_addr_space_t as, unw_word_t ip,
-			 unw_proc_info_t *pi, void *as_arg)
+                         unw_proc_info_t *pi, void *as_arg)
 {
   unw_accessors_t *a = unw_get_accessors (as);
   int ret;
diff --git a/frysk-imports/libunwind/src/mi/Gget_proc_name.c b/frysk-imports/libunwind/src/mi/Gget_proc_name.c
index 7251c59..5376f82 100644
--- a/frysk-imports/libunwind/src/mi/Gget_proc_name.c
+++ b/frysk-imports/libunwind/src/mi/Gget_proc_name.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2001-2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -28,7 +28,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 static inline int
 intern_string (unw_addr_space_t as, unw_accessors_t *a,
-	       unw_word_t addr, char *buf, size_t buf_len, void *arg)
+               unw_word_t addr, char *buf, size_t buf_len, void *arg)
 {
   size_t i;
   int ret;
@@ -36,24 +36,24 @@ intern_string (unw_addr_space_t as, unw_accessors_t *a,
   for (i = 0; i < buf_len; ++i)
     {
       if ((ret = fetch8 (as, a, &addr, (int8_t *) buf + i, arg)) < 0)
-	return ret;
+        return ret;
 
       if (buf[i] == '\0')
-	return 0;		/* copied full string; return success */
+        return 0;               /* copied full string; return success */
     }
-  buf[buf_len - 1] = '\0';	/* ensure string is NUL terminated */
+  buf[buf_len - 1] = '\0';      /* ensure string is NUL terminated */
   return -UNW_ENOMEM;
 }
 
 static inline int
 get_proc_name (unw_addr_space_t as, unw_word_t ip,
-	       char *buf, size_t buf_len, unw_word_t *offp, void *arg)
+               char *buf, size_t buf_len, unw_word_t *offp, void *arg)
 {
   unw_accessors_t *a = unw_get_accessors (as);
   unw_proc_info_t pi;
   int ret;
 
-  buf[0] = '\0';	/* always return a valid string, even if it's empty */
+  buf[0] = '\0';        /* always return a valid string, even if it's empty */
 
   ret = unwi_find_dynamic_proc_info (as, ip, &pi, 1, arg);
   if (ret == 0)
@@ -61,25 +61,25 @@ get_proc_name (unw_addr_space_t as, unw_word_t ip,
       unw_dyn_info_t *di = pi.unwind_info;
 
       if (offp)
-	*offp = ip - pi.start_ip;
+        *offp = ip - pi.start_ip;
 
       switch (di->format)
-	{
-	case UNW_INFO_FORMAT_DYNAMIC:
-	  ret = intern_string (as, a, di->u.pi.name_ptr, buf, buf_len, arg);
-	  break;
-
-	case UNW_INFO_FORMAT_TABLE:
-	case UNW_INFO_FORMAT_REMOTE_TABLE:
-	  /* XXX should we create a fake name, e.g.: "tablenameN",
-	     where N is the index of the function in the table??? */
-	  ret = -UNW_ENOINFO;
-	  break;
-
-	default:
-	  ret = -UNW_EINVAL;
-	  break;
-	}
+        {
+        case UNW_INFO_FORMAT_DYNAMIC:
+          ret = intern_string (as, a, di->u.pi.name_ptr, buf, buf_len, arg);
+          break;
+
+        case UNW_INFO_FORMAT_TABLE:
+        case UNW_INFO_FORMAT_REMOTE_TABLE:
+          /* XXX should we create a fake name, e.g.: "tablenameN",
+             where N is the index of the function in the table??? */
+          ret = -UNW_ENOINFO;
+          break;
+
+        default:
+          ret = -UNW_EINVAL;
+          break;
+        }
       unwi_put_dynamic_unwind_info (as, &pi, arg);
       return ret;
     }
@@ -97,10 +97,18 @@ get_proc_name (unw_addr_space_t as, unw_word_t ip,
 
 PROTECTED int
 unw_get_proc_name (unw_cursor_t *cursor, char *buf, size_t buf_len,
-		   unw_word_t *offp)
+                   unw_word_t *offp)
 {
   struct cursor *c = (struct cursor *) cursor;
-
-  return get_proc_name (tdep_get_as (c), tdep_get_ip (c), buf, buf_len, offp,
-			tdep_get_as_arg (c));
+  unw_word_t ip;
+  int error;
+
+  ip = tdep_get_ip (c);
+  if (c->dwarf.use_prev_instr)
+    --ip;
+  error = get_proc_name (tdep_get_as (c), ip, buf, buf_len, offp,
+                         tdep_get_as_arg (c));
+  if (c->dwarf.use_prev_instr && offp != NULL && error == 0)
+    *offp += 1;
+  return error;
 }
diff --git a/frysk-imports/libunwind/src/mi/Gget_reg.c b/frysk-imports/libunwind/src/mi/Gget_reg.c
index 021d913..7c0a5a9 100644
--- a/frysk-imports/libunwind/src/mi/Gget_reg.c
+++ b/frysk-imports/libunwind/src/mi/Gget_reg.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2002, 2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
diff --git a/frysk-imports/libunwind/src/mi/Gget_unwind_table.c b/frysk-imports/libunwind/src/mi/Gget_unwind_table.c
index 0223013..102fe83 100644
--- a/frysk-imports/libunwind/src/mi/Gget_unwind_table.c
+++ b/frysk-imports/libunwind/src/mi/Gget_unwind_table.c
@@ -1,4 +1,5 @@
 // Copyright 2007, 2008, Red Hat Inc.
+// Copyright 2016, Andrew Cagney
 
 /* This file is part of libunwind.
 
@@ -28,14 +29,13 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #include <stdio.h>
 
 static int
-get_frame_table(unw_word_t ip, unw_proc_info_t *pi, int need_unwind_info,
-		unw_accessors_t *eh_frame_accessors,
-		unw_word_t eh_frame_hdr_address,
-		void *eh_frame_arg)
+get_eh_frame_table(unw_word_t ip, unw_proc_info_t *pi,
+		   int need_unwind_info, unw_word_t eh_frame_hdr_address,
+		   unw_addr_space_t as, void *eh_frame_arg)
 {
   int ret;
-  unw_addr_space_t as = unw_create_addr_space (eh_frame_accessors, 0);
   unw_word_t start = eh_frame_hdr_address;
+  unw_accessors_t *eh_frame_accessors = unw_get_accessors (as);
 
   // Version
   unsigned char version;
@@ -85,32 +85,32 @@ get_frame_table(unw_word_t ip, unw_proc_info_t *pi, int need_unwind_info,
   /* two 32-bit values (ip_offset/fde_offset) per table-entry:
      For the binary-search table in the eh_frame_hdr, data-relative
      means relative to the start of that section... */
-  di.u.rti.table_len = (fde_count * 8) / sizeof (unw_word_t);
+  di.u.rti.table_len = (fde_count * 8) / 4;
   di.u.rti.table_data = eh_frame_hdr_address + 12;
   di.u.rti.segbase = eh_frame_hdr_address;
 
   pi->start_ip = 0;
   pi->end_ip = 0;
+
   ret = tdep_search_unwind_table (as, ip, &di, pi, need_unwind_info,
 				  eh_frame_arg);
   return ret;
 }
 
 static int
-get_debug_table(unw_word_t ip, unw_proc_info_t *pi, int need_unwind_info,
-                unw_accessors_t *accessors,
-                unw_word_t address,
-                void *arg)
+get_debug_frame_table(unw_word_t ip, unw_proc_info_t *pi,
+		      int need_unwind_info, unw_word_t address,
+		      unw_addr_space_t as, void *arg)
 {
-  unw_addr_space_t as = unw_create_addr_space (accessors, 0);
-
+  fprintf(stderr, "%s: not implemented\n", __func__);
+#if 0
   unw_dyn_info_t di;
   di.start_ip = pi->start_ip;
   di.end_ip = pi->end_ip;
-  di.format = UNW_INFO_FORMAT_TABLE;
+  di.format = UNW_INFO_FORMAT_REMOTE_TABLE;
   di.gp = pi->gp;
 
-  // XXX Should we use the ti struct of the union?
+  // this is wrong
   di.u.rti.name_ptr = 0;
   di.u.rti.segbase = address;
   di.u.rti.table_data = address;
@@ -118,22 +118,27 @@ get_debug_table(unw_word_t ip, unw_proc_info_t *pi, int need_unwind_info,
   
   pi->start_ip = 0;
   pi->end_ip = 0;
+
   return tdep_search_unwind_table (as, ip, &di, pi, need_unwind_info, arg);
+#else
+  return -UNW_ENOINFO;
+#endif
 }
 
 int
-unw_get_unwind_table(unw_word_t ip, unw_proc_info_t *pi, int need_unwind_info,
-		     unw_accessors_t *accessors,
-		     unw_word_t address,
-		     void *arg)
+unw_get_unwind_table(unw_word_t ip, unw_proc_info_t *pi,
+		     int need_unwind_info, unw_word_t address,
+		     unw_addr_space_t as, void *arg)
 {
-  if (pi->format == UNW_INFO_FORMAT_TABLE)
-    return get_debug_table(ip, pi, need_unwind_info, accessors,
-			   address, arg);
-
   if (pi->format == UNW_INFO_FORMAT_REMOTE_TABLE)
-    return get_frame_table(ip, pi, need_unwind_info, accessors,
-			   address, arg);
+    {
+      if (pi->flags & UNW_PI_FLAG_DEBUG_FRAME)
+	return get_debug_frame_table(ip, pi, need_unwind_info, address,
+				     as, arg);
+      else
+	return get_eh_frame_table(ip, pi, need_unwind_info, address,
+				  as, arg);
+    }
 
   return -UNW_EINVAL;
 }
diff --git a/frysk-imports/libunwind/src/mi/Gput_dynamic_unwind_info.c b/frysk-imports/libunwind/src/mi/Gput_dynamic_unwind_info.c
index 13a9c1a..ca377c9 100644
--- a/frysk-imports/libunwind/src/mi/Gput_dynamic_unwind_info.c
+++ b/frysk-imports/libunwind/src/mi/Gput_dynamic_unwind_info.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2001-2002, 2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -27,7 +27,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 HIDDEN void
 unwi_put_dynamic_unwind_info (unw_addr_space_t as, unw_proc_info_t *pi,
-			      void *arg)
+                              void *arg)
 {
   switch (pi->format)
     {
@@ -37,7 +37,7 @@ unwi_put_dynamic_unwind_info (unw_addr_space_t as, unw_proc_info_t *pi,
       unwi_dyn_remote_put_unwind_info (as, pi, arg);
 # else
       if (as != unw_local_addr_space)
-	unwi_dyn_remote_put_unwind_info (as, pi, arg);
+        unwi_dyn_remote_put_unwind_info (as, pi, arg);
 # endif
 #endif
       break;
diff --git a/frysk-imports/libunwind/src/mi/Gset_caching_policy.c b/frysk-imports/libunwind/src/mi/Gset_caching_policy.c
index 52fc7e5..45ba100 100644
--- a/frysk-imports/libunwind/src/mi/Gset_caching_policy.c
+++ b/frysk-imports/libunwind/src/mi/Gset_caching_policy.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2002, 2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -28,7 +28,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 PROTECTED int
 unw_set_caching_policy (unw_addr_space_t as, unw_caching_policy_t policy)
 {
-  if (tdep_needs_initialization)
+  if (!tdep_init_done)
     tdep_init ();
 
 #ifndef HAVE___THREAD
@@ -37,7 +37,7 @@ unw_set_caching_policy (unw_addr_space_t as, unw_caching_policy_t policy)
 #endif
 
   if (policy == as->caching_policy)
-    return 0;	/* no change */
+    return 0;   /* no change */
 
   as->caching_policy = policy;
   /* Ensure caches are empty (and initialized).  */
diff --git a/frysk-imports/libunwind/src/mi/Gset_fpreg.c b/frysk-imports/libunwind/src/mi/Gset_fpreg.c
index d3b202d..4f2fa7b 100644
--- a/frysk-imports/libunwind/src/mi/Gset_fpreg.c
+++ b/frysk-imports/libunwind/src/mi/Gset_fpreg.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2004-2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
diff --git a/frysk-imports/libunwind/src/mi/Gset_reg.c b/frysk-imports/libunwind/src/mi/Gset_reg.c
index 09fa09a..c9b6e6a 100644
--- a/frysk-imports/libunwind/src/mi/Gset_reg.c
+++ b/frysk-imports/libunwind/src/mi/Gset_reg.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2002, 2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
diff --git a/frysk-imports/libunwind/src/mi/_ReadSLEB.c b/frysk-imports/libunwind/src/mi/_ReadSLEB.c
index ce08f33..c041e37 100644
--- a/frysk-imports/libunwind/src/mi/_ReadSLEB.c
+++ b/frysk-imports/libunwind/src/mi/_ReadSLEB.c
@@ -13,7 +13,7 @@ _ReadSLEB (unsigned char **dpp)
       result |= (byte & 0x7f) << shift;
       shift += 7;
       if ((byte & 0x80) == 0)
-	break;
+        break;
     }
 
   if (shift < 8 * sizeof (unw_word_t) && (byte & 0x40) != 0)
diff --git a/frysk-imports/libunwind/src/mi/_ReadULEB.c b/frysk-imports/libunwind/src/mi/_ReadULEB.c
index 8952e63..116f3e1 100644
--- a/frysk-imports/libunwind/src/mi/_ReadULEB.c
+++ b/frysk-imports/libunwind/src/mi/_ReadULEB.c
@@ -12,7 +12,7 @@ _ReadULEB (unsigned char **dpp)
       byte = *bp++;
       result |= (byte & 0x7f) << shift;
       if ((byte & 0x80) == 0)
-	break;
+        break;
       shift += 7;
     }
   *dpp = bp;
diff --git a/frysk-imports/libunwind/src/mi/backtrace.c b/frysk-imports/libunwind/src/mi/backtrace.c
index 46d6c97..c7aa2bd 100644
--- a/frysk-imports/libunwind/src/mi/backtrace.c
+++ b/frysk-imports/libunwind/src/mi/backtrace.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2001-2002 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -27,31 +27,55 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 #define UNW_LOCAL_ONLY
 #include <libunwind.h>
+#include <libunwind_i.h>
+#include <string.h>
 
 /* See glibc manual for a description of this function.  */
 
-int
-backtrace (void **buffer, int size)
+static ALWAYS_INLINE int
+slow_backtrace (void **buffer, int size, unw_context_t *uc)
 {
   unw_cursor_t cursor;
-  unw_context_t uc;
   unw_word_t ip;
   int n = 0;
 
-  unw_getcontext (&uc);
-  if (unw_init_local (&cursor, &uc) < 0)
+  if (unlikely (unw_init_local (&cursor, uc) < 0))
     return 0;
 
   while (unw_step (&cursor) > 0)
     {
       if (n >= size)
-	return n;
+        return n;
 
       if (unw_get_reg (&cursor, UNW_REG_IP, &ip) < 0)
-	return n;
+        return n;
       buffer[n++] = (void *) (uintptr_t) ip;
     }
   return n;
 }
 
+int
+unw_backtrace (void **buffer, int size)
+{
+  unw_cursor_t cursor;
+  unw_context_t uc;
+  int n = size;
+
+  tdep_getcontext_trace (&uc);
+
+  if (unlikely (unw_init_local (&cursor, &uc) < 0))
+    return 0;
+
+  if (unlikely (tdep_trace (&cursor, buffer, &n) < 0))
+    {
+      unw_getcontext (&uc);
+      return slow_backtrace (buffer, size, &uc);
+    }
+
+  return n;
+}
+
+extern int backtrace (void **buffer, int size)
+  WEAK ALIAS(unw_backtrace);
+
 #endif /* !UNW_REMOTE_ONLY */
diff --git a/frysk-imports/libunwind/src/mi/dyn-cancel.c b/frysk-imports/libunwind/src/mi/dyn-cancel.c
index e784317..9d7472d 100644
--- a/frysk-imports/libunwind/src/mi/dyn-cancel.c
+++ b/frysk-imports/libunwind/src/mi/dyn-cancel.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2001-2002, 2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
diff --git a/frysk-imports/libunwind/src/mi/dyn-info-list.c b/frysk-imports/libunwind/src/mi/dyn-info-list.c
index 5a5e30e..1a0790d 100644
--- a/frysk-imports/libunwind/src/mi/dyn-info-list.c
+++ b/frysk-imports/libunwind/src/mi/dyn-info-list.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2001-2002, 2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
diff --git a/frysk-imports/libunwind/src/mi/dyn-register.c b/frysk-imports/libunwind/src/mi/dyn-register.c
index a62d696..efdad3d 100644
--- a/frysk-imports/libunwind/src/mi/dyn-register.c
+++ b/frysk-imports/libunwind/src/mi/dyn-register.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2001-2002, 2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -25,7 +25,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 #include "libunwind_i.h"
 
-HIDDEN pthread_mutex_t _U_dyn_info_list_lock = PTHREAD_MUTEX_INITIALIZER;
+HIDDEN define_lock (_U_dyn_info_list_lock);
 
 void
 _U_dyn_register (unw_dyn_info_t *di)
@@ -37,7 +37,7 @@ _U_dyn_register (unw_dyn_info_t *di)
     di->next = _U_dyn_info_list.first;
     di->prev = NULL;
     if (di->next)
-	    di->next->prev = di;
+            di->next->prev = di;
     _U_dyn_info_list.first = di;
   }
   mutex_unlock (&_U_dyn_info_list_lock);
diff --git a/frysk-imports/libunwind/src/mi/flush_cache.c b/frysk-imports/libunwind/src/mi/flush_cache.c
index c5650ba..513d135 100644
--- a/frysk-imports/libunwind/src/mi/flush_cache.c
+++ b/frysk-imports/libunwind/src/mi/flush_cache.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2002-2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -50,7 +50,7 @@ unw_flush_cache (unw_addr_space_t as, unw_word_t lo, unw_word_t hi)
      unw_flush_cache() is allowed to flush more than the requested
      range. */
 
-#ifdef HAVE_FETCH_AND_ADD1
+#ifdef HAVE_FETCH_AND_ADD
   fetch_and_add1 (&as->cache_generation);
 #else
 # warning unw_flush_cache(): need a way to atomically increment an integer.
diff --git a/frysk-imports/libunwind/src/mi/init.c b/frysk-imports/libunwind/src/mi/init.c
index 4bf97c4..057027e 100644
--- a/frysk-imports/libunwind/src/mi/init.c
+++ b/frysk-imports/libunwind/src/mi/init.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2002-2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
diff --git a/frysk-imports/libunwind/src/mi/mempool.c b/frysk-imports/libunwind/src/mi/mempool.c
index ef891bf..536b64e 100644
--- a/frysk-imports/libunwind/src/mi/mempool.c
+++ b/frysk-imports/libunwind/src/mi/mempool.c
@@ -1,6 +1,7 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2002-2003, 2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+   Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com>
 
 This file is part of libunwind.
 
@@ -25,51 +26,58 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 #include "libunwind_i.h"
 
-#define MAX_ALIGN	(sizeof (long double))
+/* From GCC docs: ``Gcc also provides a target specific macro
+ * __BIGGEST_ALIGNMENT__, which is the largest alignment ever used for any data
+ * type on the target machine you are compiling for.'' */
+#ifdef __BIGGEST_ALIGNMENT__
+# define MAX_ALIGN      __BIGGEST_ALIGNMENT__
+#else
+/* Crude hack to check that MAX_ALIGN is power-of-two.
+ * sizeof(long double) = 12 on i386. */
+# define MAX_ALIGN_(n)  (n < 8 ? 8 : \
+                         n < 16 ? 16 : n)
+# define MAX_ALIGN      MAX_ALIGN_(sizeof (long double))
+#endif
 
-static char sos_memory[SOS_MEMORY_SIZE];
-static char *sos_memp;
+static char sos_memory[SOS_MEMORY_SIZE] ALIGNED(MAX_ALIGN);
+static size_t sos_memory_freepos;
 static size_t pg_size;
 
 HIDDEN void *
 sos_alloc (size_t size)
 {
-  char *mem;
+  size_t pos;
 
-#ifdef HAVE_CMPXCHG
-  char *old_mem;
+  size = UNW_ALIGN(size, MAX_ALIGN);
 
-  size = (size + MAX_ALIGN - 1) & -MAX_ALIGN;
-  if (!sos_memp)
-    cmpxchg_ptr (&sos_memp, 0, sos_memory);
-  do
-    {
-      old_mem = sos_memp;
+#if defined(__GNUC__) && defined(HAVE_FETCH_AND_ADD)
+  /* Assume `sos_memory' is suitably aligned. */
+  assert(((uintptr_t) &sos_memory[0] & (MAX_ALIGN-1)) == 0);
 
-      mem = (char *) (((unsigned long) old_mem + MAX_ALIGN - 1) & -MAX_ALIGN);
-      mem += size;
-      assert (mem < sos_memory + sizeof (sos_memory));
-    }
-  while (!cmpxchg_ptr (&sos_memp, old_mem, mem));
+  pos = fetch_and_add (&sos_memory_freepos, size);
 #else
   static define_lock (sos_lock);
   intrmask_t saved_mask;
 
-  size = (size + MAX_ALIGN - 1) & -MAX_ALIGN;
-
   lock_acquire (&sos_lock, saved_mask);
   {
-    if (!sos_memp)
-      sos_memp = sos_memory;
-
-    mem = (char *) (((unsigned long) sos_memp + MAX_ALIGN - 1) & -MAX_ALIGN);
-    mem += size;
-    assert (mem < sos_memory + sizeof (sos_memory));
-    sos_memp = mem;
+    /* No assumptions about `sos_memory' alignment. */
+    if (sos_memory_freepos == 0)
+      {
+        unsigned align = UNW_ALIGN((uintptr_t) &sos_memory[0], MAX_ALIGN)
+                                - (uintptr_t) &sos_memory[0];
+        sos_memory_freepos = align;
+      }
+    pos = sos_memory_freepos;
+    sos_memory_freepos += size;
   }
   lock_release (&sos_lock, saved_mask);
 #endif
-  return mem;
+
+  assert (((uintptr_t) &sos_memory[pos] & (MAX_ALIGN-1)) == 0);
+  assert ((pos+size) <= SOS_MEMORY_SIZE);
+
+  return &sos_memory[pos];
 }
 
 /* Must be called while holding the mempool lock. */
@@ -103,14 +111,14 @@ expand (struct mempool *pool)
   GET_MEMORY (mem, size);
   if (!mem)
     {
-      size = (pool->obj_size + pg_size - 1) & -pg_size;
+      size = UNW_ALIGN(pool->obj_size, pg_size);
       GET_MEMORY (mem, size);
       if (!mem)
-	{
-	  /* last chance: try to allocate one object from the SOS memory */
-	  size = pool->obj_size;
-	  mem = sos_alloc (size);
-	}
+        {
+          /* last chance: try to allocate one object from the SOS memory */
+          size = pool->obj_size;
+          mem = sos_alloc (size);
+        }
     }
   add_memory (pool, mem, size, pool->obj_size);
 }
@@ -126,18 +134,18 @@ mempool_init (struct mempool *pool, size_t obj_size, size_t reserve)
   lock_init (&pool->lock);
 
   /* round object-size up to integer multiple of MAX_ALIGN */
-  obj_size = (obj_size + MAX_ALIGN - 1) & -MAX_ALIGN;
+  obj_size = UNW_ALIGN(obj_size, MAX_ALIGN);
 
   if (!reserve)
     {
       reserve = pg_size / obj_size / 4;
       if (!reserve)
-	reserve = 16;
+        reserve = 16;
     }
 
   pool->obj_size = obj_size;
   pool->reserve = reserve;
-  pool->chunk_size = (2*reserve*obj_size + pg_size - 1) & -pg_size;
+  pool->chunk_size = UNW_ALIGN(2*reserve*obj_size, pg_size);
 
   expand (pool);
 }
diff --git a/frysk-imports/libunwind/src/mi/strerror.c b/frysk-imports/libunwind/src/mi/strerror.c
index ef64716..2cec73d 100644
--- a/frysk-imports/libunwind/src/mi/strerror.c
+++ b/frysk-imports/libunwind/src/mi/strerror.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2004 BEA Systems
-	Contributed by Thomas Hallgren <thallgre@bea.com>
+        Contributed by Thomas Hallgren <thallgre@bea.com>
 
 This file is part of libunwind.
 
@@ -34,18 +34,18 @@ unw_strerror (int err_code)
   unw_error_t error = (unw_error_t)-err_code;
   switch (error)
     {
-    case UNW_ESUCCESS:	   cp = "no error"; break;
-    case UNW_EUNSPEC:	   cp = "unspecified (general) error"; break;
-    case UNW_ENOMEM:	   cp = "out of memory"; break;
-    case UNW_EBADREG:	   cp = "bad register number"; break;
+    case UNW_ESUCCESS:     cp = "no error"; break;
+    case UNW_EUNSPEC:      cp = "unspecified (general) error"; break;
+    case UNW_ENOMEM:       cp = "out of memory"; break;
+    case UNW_EBADREG:      cp = "bad register number"; break;
     case UNW_EREADONLYREG: cp = "attempt to write read-only register"; break;
     case UNW_ESTOPUNWIND:  cp = "stop unwinding"; break;
     case UNW_EINVALIDIP:   cp = "invalid IP"; break;
-    case UNW_EBADFRAME:	   cp = "bad frame"; break;
-    case UNW_EINVAL:	   cp = "unsupported operation or bad value"; break;
+    case UNW_EBADFRAME:    cp = "bad frame"; break;
+    case UNW_EINVAL:       cp = "unsupported operation or bad value"; break;
     case UNW_EBADVERSION:  cp = "unwind info has unsupported version"; break;
-    case UNW_ENOINFO:	   cp = "no unwind info found"; break;
-    default:		   cp = "invalid error code";
+    case UNW_ENOINFO:      cp = "no unwind info found"; break;
+    default:               cp = "invalid error code";
     }
   return cp;
 }
diff --git a/frysk-imports/libunwind/src/mips/Gcreate_addr_space.c b/frysk-imports/libunwind/src/mips/Gcreate_addr_space.c
index af084ef..371841d 100644
--- a/frysk-imports/libunwind/src/mips/Gcreate_addr_space.c
+++ b/frysk-imports/libunwind/src/mips/Gcreate_addr_space.c
@@ -32,14 +32,7 @@ unw_create_addr_space (unw_accessors_t *a, int byte_order)
 #ifdef UNW_LOCAL_ONLY
   return NULL;
 #else
-  unw_addr_space_t as = malloc (sizeof (*as));
-
-  if (!as)
-    return NULL;
-
-  memset (as, 0, sizeof (*as));
-
-  as->acc = *a;
+  unw_addr_space_t as;
 
   /*
    * MIPS supports only big or little-endian, not weird stuff like
@@ -50,6 +43,14 @@ unw_create_addr_space (unw_accessors_t *a, int byte_order)
       && byte_order != __BIG_ENDIAN)
     return NULL;
 
+  as = malloc (sizeof (*as));
+  if (!as)
+    return NULL;
+
+  memset (as, 0, sizeof (*as));
+
+  as->acc = *a;
+
   if (byte_order == 0)
     /* use host default: */
     as->big_endian = (__BYTE_ORDER == __BIG_ENDIAN);
diff --git a/frysk-imports/libunwind/src/mips/Gget_save_loc.c b/frysk-imports/libunwind/src/mips/Gget_save_loc.c
index dbccea8..d6075b7 100644
--- a/frysk-imports/libunwind/src/mips/Gget_save_loc.c
+++ b/frysk-imports/libunwind/src/mips/Gget_save_loc.c
@@ -32,7 +32,7 @@ unw_get_save_loc (unw_cursor_t *cursor, int reg, unw_save_loc_t *sloc)
   struct cursor *c = (struct cursor *) cursor;
   dwarf_loc_t loc;
 
-  loc = DWARF_NULL_LOC;		/* default to "not saved" */
+  loc = DWARF_NULL_LOC;         /* default to "not saved" */
 
   switch (reg)
     {
@@ -68,6 +68,7 @@ unw_get_save_loc (unw_cursor_t *cursor, int reg, unw_save_loc_t *sloc)
     case UNW_MIPS_R29:
     case UNW_MIPS_R30:
     case UNW_MIPS_R31:
+    case UNW_MIPS_PC:
       loc = c->dwarf.loc[reg - UNW_MIPS_R0];
       break;
 
@@ -75,7 +76,7 @@ unw_get_save_loc (unw_cursor_t *cursor, int reg, unw_save_loc_t *sloc)
       break;
     }
 
-  memset (sloc, 0, sizeof (sloc));
+  memset (sloc, 0, sizeof (*sloc));
 
   if (DWARF_IS_NULL_LOC (loc))
     {
diff --git a/frysk-imports/libunwind/src/mips/Gglobal.c b/frysk-imports/libunwind/src/mips/Gglobal.c
index 1874a5b..fa9478e 100644
--- a/frysk-imports/libunwind/src/mips/Gglobal.c
+++ b/frysk-imports/libunwind/src/mips/Gglobal.c
@@ -25,17 +25,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #include "unwind_i.h"
 #include "dwarf_i.h"
 
-HIDDEN pthread_mutex_t mips_lock = PTHREAD_MUTEX_INITIALIZER;
-HIDDEN int tdep_needs_initialization = 1;
-
-/* FIXME: I'm pretty sure we don't need this at all for MIPS, but "generic"
-   code (include/dwarf_i.h) seems to expect it to be here at present.  */
-
-HIDDEN uint8_t dwarf_to_unw_regnum_map[] =
-  {
-    0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
-    16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31
-  };
+HIDDEN define_lock (mips_lock);
+HIDDEN int tdep_init_done;
 
 HIDDEN void
 tdep_init (void)
@@ -44,10 +35,9 @@ tdep_init (void)
 
   sigfillset (&unwi_full_mask);
 
-  sigprocmask (SIG_SETMASK, &unwi_full_mask, &saved_mask);
-  mutex_lock (&mips_lock);
+  lock_acquire (&mips_lock, saved_mask);
   {
-    if (!tdep_needs_initialization)
+    if (tdep_init_done)
       /* another thread else beat us to it... */
       goto out;
 
@@ -58,9 +48,8 @@ tdep_init (void)
 #ifndef UNW_REMOTE_ONLY
     mips_local_addr_space_init ();
 #endif
-    tdep_needs_initialization = 0;	/* signal that we're initialized... */
+    tdep_init_done = 1; /* signal that we're initialized... */
   }
  out:
-  mutex_unlock (&mips_lock);
-  sigprocmask (SIG_SETMASK, &saved_mask, NULL);
+  lock_release (&mips_lock, saved_mask);
 }
diff --git a/frysk-imports/libunwind/src/mips/Ginit.c b/frysk-imports/libunwind/src/mips/Ginit.c
index 6ffeabf..8290c40 100644
--- a/frysk-imports/libunwind/src/mips/Ginit.c
+++ b/frysk-imports/libunwind/src/mips/Ginit.c
@@ -46,6 +46,8 @@ uc_addr (ucontext_t *uc, int reg)
 {
   if (reg >= UNW_MIPS_R0 && reg < UNW_MIPS_R0 + 32)
     return &uc->uc_mcontext.gregs[reg - UNW_MIPS_R0];
+  else if (reg == UNW_MIPS_PC)
+    return &uc->uc_mcontext.pc;
   else
     return NULL;
 }
@@ -82,7 +84,7 @@ put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
 
 static int
 get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
-			void *arg)
+                        void *arg)
 {
   *dyn_info_list_addr = (unw_word_t) (intptr_t) &_U_dyn_info_list;
   return 0;
@@ -90,7 +92,7 @@ get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
 
 static int
 access_mem (unw_addr_space_t as, unw_word_t addr, unw_word_t *val, int write,
-	    void *arg)
+            void *arg)
 {
   if (write)
     {
@@ -107,7 +109,7 @@ access_mem (unw_addr_space_t as, unw_word_t addr, unw_word_t *val, int write,
 
 static int
 access_reg (unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val, int write,
-	    void *arg)
+            void *arg)
 {
   unw_word_t *addr;
   ucontext_t *uc = arg;
@@ -138,7 +140,7 @@ access_reg (unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val, int write,
 
 static int
 access_fpreg (unw_addr_space_t as, unw_regnum_t reg, unw_fpreg_t *val,
-	      int write, void *arg)
+              int write, void *arg)
 {
   ucontext_t *uc = arg;
   unw_fpreg_t *addr;
@@ -152,14 +154,14 @@ access_fpreg (unw_addr_space_t as, unw_regnum_t reg, unw_fpreg_t *val,
   if (write)
     {
       Debug (12, "%s <- %08lx.%08lx.%08lx\n", unw_regname (reg),
-	     ((long *)val)[0], ((long *)val)[1], ((long *)val)[2]);
+             ((long *)val)[0], ((long *)val)[1], ((long *)val)[2]);
       *(unw_fpreg_t *) (intptr_t) addr = *val;
     }
   else
     {
       *val = *(unw_fpreg_t *) (intptr_t) addr;
       Debug (12, "%s -> %08lx.%08lx.%08lx\n", unw_regname (reg),
-	     ((long *)val)[0], ((long *)val)[1], ((long *)val)[2]);
+             ((long *)val)[0], ((long *)val)[1], ((long *)val)[2]);
     }
   return 0;
 
@@ -171,8 +173,8 @@ access_fpreg (unw_addr_space_t as, unw_regnum_t reg, unw_fpreg_t *val,
 
 static int
 get_static_proc_name (unw_addr_space_t as, unw_word_t ip,
-		      char *buf, size_t buf_len, unw_word_t *offp,
-		      void *arg)
+                      char *buf, size_t buf_len, unw_word_t *offp,
+                      void *arg)
 {
 
   return elf_w (get_proc_name) (as, getpid (), ip, buf, buf_len, offp);
@@ -200,7 +202,7 @@ mips_local_addr_space_init (void)
   local_addr_space.acc.access_mem = access_mem;
   local_addr_space.acc.access_reg = access_reg;
   local_addr_space.acc.access_fpreg = access_fpreg;
-  local_addr_space.acc.resume = 0;  /* mips_local_resume?  FIXME!  */
+  local_addr_space.acc.resume = NULL;  /* mips_local_resume?  FIXME!  */
   local_addr_space.acc.get_proc_name = get_static_proc_name;
   unw_flush_cache (&local_addr_space, 0, 0);
 }
diff --git a/frysk-imports/libunwind/src/mips/Ginit_local.c b/frysk-imports/libunwind/src/mips/Ginit_local.c
index 7b2881e..e5e1c5a 100644
--- a/frysk-imports/libunwind/src/mips/Ginit_local.c
+++ b/frysk-imports/libunwind/src/mips/Ginit_local.c
@@ -40,14 +40,14 @@ unw_init_local (unw_cursor_t *cursor, ucontext_t *uc)
 {
   struct cursor *c = (struct cursor *) cursor;
 
-  if (tdep_needs_initialization)
+  if (!tdep_init_done)
     tdep_init ();
 
   Debug (1, "(cursor=%p)\n", c);
 
   c->dwarf.as = unw_local_addr_space;
   c->dwarf.as_arg = uc;
-  return common_init (c);
+  return common_init (c, 1);
 }
 
 #endif /* !UNW_REMOTE_ONLY */
diff --git a/frysk-imports/libunwind/src/mips/Ginit_remote.c b/frysk-imports/libunwind/src/mips/Ginit_remote.c
index 3baf3f6..f284e99 100644
--- a/frysk-imports/libunwind/src/mips/Ginit_remote.c
+++ b/frysk-imports/libunwind/src/mips/Ginit_remote.c
@@ -33,13 +33,13 @@ unw_init_remote (unw_cursor_t *cursor, unw_addr_space_t as, void *as_arg)
 #else /* !UNW_LOCAL_ONLY */
   struct cursor *c = (struct cursor *) cursor;
 
-  if (tdep_needs_initialization)
+  if (!tdep_init_done)
     tdep_init ();
 
   Debug (1, "(cursor=%p)\n", c);
 
   c->dwarf.as = as;
   c->dwarf.as_arg = as_arg;
-  return common_init (c);
+  return common_init (c, 0);
 #endif /* !UNW_LOCAL_ONLY */
 }
diff --git a/frysk-imports/libunwind/src/mips/Gis_signal_frame.c b/frysk-imports/libunwind/src/mips/Gis_signal_frame.c
index fef542b..2c9627f 100644
--- a/frysk-imports/libunwind/src/mips/Gis_signal_frame.c
+++ b/frysk-imports/libunwind/src/mips/Gis_signal_frame.c
@@ -1,4 +1,5 @@
 /* libunwind - a platform-independent unwind library
+   Copyright (C) 2015 Imagination Technologies Limited
    Copyright (C) 2008 CodeSourcery
 
 This file is part of libunwind.
@@ -25,11 +26,53 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #include "unwind_i.h"
 #include <stdio.h>
 
-/* FIXME for MIPS.  */
-
 PROTECTED int
 unw_is_signal_frame (unw_cursor_t *cursor)
 {
-  printf ("%s: implement me\n", __FUNCTION__);
-  return -UNW_ENOINFO;
+  struct cursor *c = (struct cursor *) cursor;
+  unw_word_t w0, w1, ip;
+  unw_addr_space_t as;
+  unw_accessors_t *a;
+  void *arg;
+  int ret;
+
+  as = c->dwarf.as;
+  a = unw_get_accessors (as);
+  arg = c->dwarf.as_arg;
+
+  ip = c->dwarf.ip;
+
+  /* syscall */
+  if ((ret = (*a->access_mem) (as, ip + 4, &w1, 0, arg)) < 0)
+    return 0;
+  if ((w1 & 0xffffffff) != 0x0c)
+    return 0;
+
+  /* li v0, 0x1061 (rt) or li v0, 0x1017 */
+  if ((ret = (*a->access_mem) (as, ip, &w0, 0, arg)) < 0)
+    return 0;
+
+  switch (c->dwarf.as->abi)
+    {
+    case UNW_MIPS_ABI_O32:
+      switch (w0 & 0xffffffff)
+        {
+        case 0x24021061:
+          return 1;
+        case 0x24021017:
+          return 2;
+        default:
+          return 0;
+        }
+    case UNW_MIPS_ABI_N64:
+      switch (w0 & 0xffffffff)
+        {
+        case 0x2402145b:
+          return 1;
+        default:
+          return 0;
+        }
+    default:
+      return 0;
+    }
 }
diff --git a/frysk-imports/libunwind/src/mips/Gregs.c b/frysk-imports/libunwind/src/mips/Gregs.c
index 9f37299..2697776 100644
--- a/frysk-imports/libunwind/src/mips/Gregs.c
+++ b/frysk-imports/libunwind/src/mips/Gregs.c
@@ -28,7 +28,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 HIDDEN int
 tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
-		 int write)
+                 int write)
 {
   dwarf_loc_t loc = DWARF_NULL_LOC;
   
@@ -69,6 +69,10 @@ tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
       loc = c->dwarf.loc[reg - UNW_MIPS_R0];
       break;
 
+    case UNW_MIPS_PC:
+      loc = c->dwarf.loc[reg];
+      break;
+
     case UNW_MIPS_CFA:
       if (write)
         return -UNW_EREADONLYREG;
@@ -92,7 +96,7 @@ tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
 
 HIDDEN int
 tdep_access_fpreg (struct cursor *c, unw_regnum_t reg, unw_fpreg_t *valp,
-		   int write)
+                   int write)
 {
   Debug (1, "bad register number %u\n", reg);
   return -UNW_EBADREG;
diff --git a/frysk-imports/libunwind/src/mips/Gstep.c b/frysk-imports/libunwind/src/mips/Gstep.c
index bafeef1..0a0b9c2 100644
--- a/frysk-imports/libunwind/src/mips/Gstep.c
+++ b/frysk-imports/libunwind/src/mips/Gstep.c
@@ -1,4 +1,5 @@
 /* libunwind - a platform-independent unwind library
+   Copyright (C) 2015 Imagination Technologies Limited
    Copyright (C) 2008 CodeSourcery
 
 This file is part of libunwind.
@@ -26,16 +27,99 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #include "offsets.h"
 
 PROTECTED int
-unw_step (unw_cursor_t *cursor)
+unw_handle_signal_frame (unw_cursor_t *cursor)
 {
   struct cursor *c = (struct cursor *) cursor;
+  unw_word_t sc_addr, sp, sp_addr = c->dwarf.cfa;
+  unw_word_t ra, fp;
   int ret;
 
-  Debug (1, "(cursor=%p)\n", c);
+  switch (unw_is_signal_frame (cursor)) {
+  case 1:
+    sc_addr = sp_addr + LINUX_SF_TRAMP_SIZE + sizeof (siginfo_t) +
+              LINUX_UC_MCONTEXT_OFF;
+    break;
+  case 2:
+    sc_addr = sp_addr + LINUX_UC_MCONTEXT_OFF;
+    break;
+  default:
+    return -UNW_EUNSPEC;
+  }
+
+  if (tdep_big_endian(c->dwarf.as))
+    sc_addr += 4;
+
+  c->sigcontext_addr = sc_addr;
+
+  /* Update the dwarf cursor. */
+  c->dwarf.loc[UNW_MIPS_R0]  = DWARF_LOC (sc_addr + LINUX_SC_R0_OFF, 0);
+  c->dwarf.loc[UNW_MIPS_R1]  = DWARF_LOC (sc_addr + LINUX_SC_R1_OFF, 0);
+  c->dwarf.loc[UNW_MIPS_R2]  = DWARF_LOC (sc_addr + LINUX_SC_R2_OFF, 0);
+  c->dwarf.loc[UNW_MIPS_R3]  = DWARF_LOC (sc_addr + LINUX_SC_R3_OFF, 0);
+  c->dwarf.loc[UNW_MIPS_R4]  = DWARF_LOC (sc_addr + LINUX_SC_R4_OFF, 0);
+  c->dwarf.loc[UNW_MIPS_R5]  = DWARF_LOC (sc_addr + LINUX_SC_R5_OFF, 0);
+  c->dwarf.loc[UNW_MIPS_R6]  = DWARF_LOC (sc_addr + LINUX_SC_R6_OFF, 0);
+  c->dwarf.loc[UNW_MIPS_R7]  = DWARF_LOC (sc_addr + LINUX_SC_R7_OFF, 0);
+  c->dwarf.loc[UNW_MIPS_R8]  = DWARF_LOC (sc_addr + LINUX_SC_R8_OFF, 0);
+  c->dwarf.loc[UNW_MIPS_R9]  = DWARF_LOC (sc_addr + LINUX_SC_R9_OFF, 0);
+  c->dwarf.loc[UNW_MIPS_R10] = DWARF_LOC (sc_addr + LINUX_SC_R10_OFF, 0);
+  c->dwarf.loc[UNW_MIPS_R11] = DWARF_LOC (sc_addr + LINUX_SC_R11_OFF, 0);
+  c->dwarf.loc[UNW_MIPS_R12] = DWARF_LOC (sc_addr + LINUX_SC_R12_OFF, 0);
+  c->dwarf.loc[UNW_MIPS_R13] = DWARF_LOC (sc_addr + LINUX_SC_R13_OFF, 0);
+  c->dwarf.loc[UNW_MIPS_R14] = DWARF_LOC (sc_addr + LINUX_SC_R14_OFF, 0);
+  c->dwarf.loc[UNW_MIPS_R15] = DWARF_LOC (sc_addr + LINUX_SC_R15_OFF, 0);
+  c->dwarf.loc[UNW_MIPS_R16] = DWARF_LOC (sc_addr + LINUX_SC_R16_OFF, 0);
+  c->dwarf.loc[UNW_MIPS_R17] = DWARF_LOC (sc_addr + LINUX_SC_R17_OFF, 0);
+  c->dwarf.loc[UNW_MIPS_R18] = DWARF_LOC (sc_addr + LINUX_SC_R18_OFF, 0);
+  c->dwarf.loc[UNW_MIPS_R19] = DWARF_LOC (sc_addr + LINUX_SC_R19_OFF, 0);
+  c->dwarf.loc[UNW_MIPS_R20] = DWARF_LOC (sc_addr + LINUX_SC_R20_OFF, 0);
+  c->dwarf.loc[UNW_MIPS_R21] = DWARF_LOC (sc_addr + LINUX_SC_R21_OFF, 0);
+  c->dwarf.loc[UNW_MIPS_R22] = DWARF_LOC (sc_addr + LINUX_SC_R22_OFF, 0);
+  c->dwarf.loc[UNW_MIPS_R23] = DWARF_LOC (sc_addr + LINUX_SC_R23_OFF, 0);
+  c->dwarf.loc[UNW_MIPS_R24] = DWARF_LOC (sc_addr + LINUX_SC_R24_OFF, 0);
+  c->dwarf.loc[UNW_MIPS_R25] = DWARF_LOC (sc_addr + LINUX_SC_R25_OFF, 0);
+  c->dwarf.loc[UNW_MIPS_R26] = DWARF_LOC (sc_addr + LINUX_SC_R26_OFF, 0);
+  c->dwarf.loc[UNW_MIPS_R27] = DWARF_LOC (sc_addr + LINUX_SC_R27_OFF, 0);
+  c->dwarf.loc[UNW_MIPS_R28] = DWARF_LOC (sc_addr + LINUX_SC_R28_OFF, 0);
+  c->dwarf.loc[UNW_MIPS_R29] = DWARF_LOC (sc_addr + LINUX_SC_R29_OFF, 0);
+  c->dwarf.loc[UNW_MIPS_R30] = DWARF_LOC (sc_addr + LINUX_SC_R30_OFF, 0);
+  c->dwarf.loc[UNW_MIPS_R31] = DWARF_LOC (sc_addr + LINUX_SC_R31_OFF, 0);
+  c->dwarf.loc[UNW_MIPS_PC] = DWARF_LOC (sc_addr + LINUX_SC_PC_OFF, 0);
+
+  /* Set SP/CFA and PC/IP. */
+  dwarf_get (&c->dwarf, c->dwarf.loc[UNW_MIPS_R29], &c->dwarf.cfa);
+
+  if ((ret = dwarf_get(&c->dwarf, DWARF_LOC(sc_addr + LINUX_SC_PC_OFF, 0),
+                       &c->dwarf.ip)) < 0)
+    return ret;
+
+  if ((ret = dwarf_get(&c->dwarf, DWARF_LOC(sc_addr + LINUX_SC_R31_OFF, 0),
+                       &ra)) < 0)
+    return ret;
+  if ((ret = dwarf_get(&c->dwarf, DWARF_LOC(sc_addr + LINUX_SC_R30_OFF, 0),
+                       &fp)) < 0)
+    return ret;
+
+  Debug (2, "SH (ip=0x%016llx, ra=0x%016llx, sp=0x%016llx, fp=0x%016llx)\n",
+         (unsigned long long)c->dwarf.ip, (unsigned long long)ra,
+         (unsigned long long)c->dwarf.cfa, (unsigned long long)fp);
+
+  c->dwarf.pi_valid = 0;
+  c->dwarf.use_prev_instr = 0;
+
+  return 1;
+}
+
+PROTECTED int
+unw_step (unw_cursor_t *cursor)
+{
+  struct cursor *c = (struct cursor *) cursor;
+  int ret;
 
-  /* Try DWARF-based unwinding...  this is the only method likely to work for
-     MIPS.  */
-  ret = dwarf_step (&c->dwarf);
+  ret = unw_handle_signal_frame (cursor);
+  if (ret < 0)
+    /* Not a signal frame, try DWARF-based unwinding. */
+    ret = dwarf_step (&c->dwarf);
 
   if (unlikely (ret == -UNW_ESTOPUNWIND))
     return ret;
diff --git a/frysk-imports/libunwind/src/mips/getcontext.S b/frysk-imports/libunwind/src/mips/getcontext.S
index ad9e1f0..d1dbd57 100644
--- a/frysk-imports/libunwind/src/mips/getcontext.S
+++ b/frysk-imports/libunwind/src/mips/getcontext.S
@@ -1,5 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2008 CodeSourcery
+   Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com>
 
 This file is part of libunwind.
 
@@ -37,8 +38,14 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
  sw $X, (LINUX_UC_MCONTEXT_GREGS + 8 * X + OFFSET) ($4); \
  sra $1, $X, 31; \
  sw $1, (LINUX_UC_MCONTEXT_GREGS + 8 * X + 4 - OFFSET) ($4)
+/* Yes, we save the return address to PC. */
+# define SPC \
+ sw $31, (LINUX_UC_MCONTEXT_PC + OFFSET) ($4); \
+ sra $1, $31, 31; \
+ sw $1, (LINUX_UC_MCONTEXT_PC + 4 - OFFSET) ($4)
 #else
 # define SREG(X) sd $X, (LINUX_UC_MCONTEXT_GREGS + 8 * X) ($4)
+# define SPC sd $31, (LINUX_UC_MCONTEXT_PC) ($4)
 #endif
 
 	.global _Umips_getcontext
@@ -79,6 +86,7 @@ _Umips_getcontext:
 	SREG (29)
 	SREG (30)
 	SREG (31)
+	SPC
 	li	$2, 0
 	j $31
 
diff --git a/frysk-imports/libunwind/src/mips/init.h b/frysk-imports/libunwind/src/mips/init.h
index 98956d4..74c3ab9 100644
--- a/frysk-imports/libunwind/src/mips/init.h
+++ b/frysk-imports/libunwind/src/mips/init.h
@@ -25,7 +25,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #include "unwind_i.h"
 
 static inline int
-common_init (struct cursor *c)
+common_init (struct cursor *c, unsigned use_prev_instr)
 {
   int ret, i;
 
@@ -34,12 +34,14 @@ common_init (struct cursor *c)
   for (i = 32; i < DWARF_NUM_PRESERVED_REGS; ++i)
     c->dwarf.loc[i] = DWARF_NULL_LOC;
 
-  ret = dwarf_get (&c->dwarf, c->dwarf.loc[31], &c->dwarf.ip);
+  c->dwarf.loc[UNW_MIPS_PC] = DWARF_REG_LOC (&c->dwarf, UNW_MIPS_PC);
+
+  ret = dwarf_get (&c->dwarf, c->dwarf.loc[UNW_MIPS_PC], &c->dwarf.ip);
   if (ret < 0)
     return ret;
 
   ret = dwarf_get (&c->dwarf, DWARF_REG_LOC (&c->dwarf, UNW_MIPS_R29),
-		   &c->dwarf.cfa);
+                   &c->dwarf.cfa);
   if (ret < 0)
     return ret;
 
@@ -47,6 +49,8 @@ common_init (struct cursor *c)
 
   c->dwarf.args_size = 0;
   c->dwarf.ret_addr_column = 0;
+  c->dwarf.stash_frames = 0;
+  c->dwarf.use_prev_instr = use_prev_instr;
   c->dwarf.pi_valid = 0;
   c->dwarf.pi_is_dynamic = 0;
   c->dwarf.hint = 0;
diff --git a/frysk-imports/libunwind/src/mips/offsets.h b/frysk-imports/libunwind/src/mips/offsets.h
index 8040f6a..b506051 100644
--- a/frysk-imports/libunwind/src/mips/offsets.h
+++ b/frysk-imports/libunwind/src/mips/offsets.h
@@ -9,31 +9,78 @@
 
 /* Offsets for MIPS Linux "ucontext_t":  */
 
+/* First 24 bytes in sigframe are argument save space and padding for
+what used to be signal trampolines. Ref: arch/mips/kernel/signal.c */
+#define LINUX_SF_TRAMP_SIZE 0x18
+
 #if _MIPS_SIM == _ABIO32
 
-# define LINUX_UC_FLAGS_OFF	0x0
-# define LINUX_UC_LINK_OFF	0x4
-# define LINUX_UC_STACK_OFF	0x8
-# define LINUX_UC_MCONTEXT_OFF	0x18
-# define LINUX_UC_SIGMASK_OFF	0x268
-# define LINUX_UC_MCONTEXT_GREGS	0x28
+# define LINUX_UC_FLAGS_OFF     0x0
+# define LINUX_UC_LINK_OFF      0x4
+# define LINUX_UC_STACK_OFF     0x8
+# define LINUX_UC_MCONTEXT_OFF  0x18
+# define LINUX_UC_SIGMASK_OFF   0x268
+# define LINUX_UC_MCONTEXT_PC   0x20
+# define LINUX_UC_MCONTEXT_GREGS        0x28
 
 #elif _MIPS_SIM == _ABIN32
 
-# define LINUX_UC_FLAGS_OFF	0x0
-# define LINUX_UC_LINK_OFF	0x4
-# define LINUX_UC_STACK_OFF	0x8
-# define LINUX_UC_MCONTEXT_OFF	0x18
-# define LINUX_UC_SIGMASK_OFF	0x270
-# define LINUX_UC_MCONTEXT_GREGS	0x18
+# define LINUX_UC_FLAGS_OFF     0x0
+# define LINUX_UC_LINK_OFF      0x4
+# define LINUX_UC_STACK_OFF     0x8
+# define LINUX_UC_MCONTEXT_OFF  0x18
+# define LINUX_UC_SIGMASK_OFF   0x270
+# define LINUX_UC_MCONTEXT_PC   0x258
+# define LINUX_UC_MCONTEXT_GREGS        0x18
 
 #elif _MIPS_SIM == _ABI64
 
-# define LINUX_UC_FLAGS_OFF	0x0
-# define LINUX_UC_LINK_OFF	0x8
-# define LINUX_UC_STACK_OFF	0x10
-# define LINUX_UC_MCONTEXT_OFF	0x28
-# define LINUX_UC_SIGMASK_OFF	0x280
-# define LINUX_UC_MCONTEXT_GREGS	0x28
+# define LINUX_UC_FLAGS_OFF     0x0
+# define LINUX_UC_LINK_OFF      0x8
+# define LINUX_UC_STACK_OFF     0x10
+# define LINUX_UC_MCONTEXT_OFF  0x28
+# define LINUX_UC_SIGMASK_OFF   0x280
+# define LINUX_UC_MCONTEXT_PC   0x268
+# define LINUX_UC_MCONTEXT_GREGS        0x28
+
+#else
+
+#error Unsupported ABI
 
 #endif
+
+#define LINUX_SC_R0_OFF   (LINUX_UC_MCONTEXT_GREGS - LINUX_UC_MCONTEXT_OFF)
+#define LINUX_SC_R1_OFF   (LINUX_SC_R0_OFF + 1*8)
+#define LINUX_SC_R2_OFF   (LINUX_SC_R0_OFF + 2*8)
+#define LINUX_SC_R3_OFF   (LINUX_SC_R0_OFF + 3*8)
+#define LINUX_SC_R4_OFF   (LINUX_SC_R0_OFF + 4*8)
+#define LINUX_SC_R5_OFF   (LINUX_SC_R0_OFF + 5*8)
+#define LINUX_SC_R6_OFF   (LINUX_SC_R0_OFF + 6*8)
+#define LINUX_SC_R7_OFF   (LINUX_SC_R0_OFF + 7*8)
+#define LINUX_SC_R8_OFF   (LINUX_SC_R0_OFF + 8*8)
+#define LINUX_SC_R9_OFF   (LINUX_SC_R0_OFF + 9*8)
+#define LINUX_SC_R10_OFF  (LINUX_SC_R0_OFF + 10*8)
+#define LINUX_SC_R11_OFF  (LINUX_SC_R0_OFF + 11*8)
+#define LINUX_SC_R12_OFF  (LINUX_SC_R0_OFF + 12*8)
+#define LINUX_SC_R13_OFF  (LINUX_SC_R0_OFF + 13*8)
+#define LINUX_SC_R14_OFF  (LINUX_SC_R0_OFF + 14*8)
+#define LINUX_SC_R15_OFF  (LINUX_SC_R0_OFF + 15*8)
+#define LINUX_SC_R16_OFF  (LINUX_SC_R0_OFF + 16*8)
+#define LINUX_SC_R17_OFF  (LINUX_SC_R0_OFF + 17*8)
+#define LINUX_SC_R18_OFF  (LINUX_SC_R0_OFF + 18*8)
+#define LINUX_SC_R19_OFF  (LINUX_SC_R0_OFF + 19*8)
+#define LINUX_SC_R20_OFF  (LINUX_SC_R0_OFF + 20*8)
+#define LINUX_SC_R21_OFF  (LINUX_SC_R0_OFF + 21*8)
+#define LINUX_SC_R22_OFF  (LINUX_SC_R0_OFF + 22*8)
+#define LINUX_SC_R23_OFF  (LINUX_SC_R0_OFF + 23*8)
+#define LINUX_SC_R24_OFF  (LINUX_SC_R0_OFF + 24*8)
+#define LINUX_SC_R25_OFF  (LINUX_SC_R0_OFF + 25*8)
+#define LINUX_SC_R26_OFF  (LINUX_SC_R0_OFF + 26*8)
+#define LINUX_SC_R27_OFF  (LINUX_SC_R0_OFF + 27*8)
+#define LINUX_SC_R28_OFF  (LINUX_SC_R0_OFF + 28*8)
+#define LINUX_SC_R29_OFF  (LINUX_SC_R0_OFF + 29*8)
+#define LINUX_SC_R30_OFF  (LINUX_SC_R0_OFF + 30*8)
+#define LINUX_SC_R31_OFF  (LINUX_SC_R0_OFF + 31*8)
+
+#define LINUX_SC_SP_OFF   LINUX_SC_R29_OFF
+#define LINUX_SC_PC_OFF   (LINUX_UC_MCONTEXT_PC - LINUX_UC_MCONTEXT_OFF)
diff --git a/frysk-imports/libunwind/src/mips/regname.c b/frysk-imports/libunwind/src/mips/regname.c
index 94000d4..a4a6334 100644
--- a/frysk-imports/libunwind/src/mips/regname.c
+++ b/frysk-imports/libunwind/src/mips/regname.c
@@ -41,6 +41,8 @@ unw_regname (unw_regnum_t reg)
 {
   if (reg < (unw_regnum_t) ARRAY_SIZE (regname))
     return regname[reg];
+  else if (reg == UNW_MIPS_PC)
+    return "pc";
   else
     return "???";
 }
diff --git a/frysk-imports/libunwind/src/mips/unwind_i.h b/frysk-imports/libunwind/src/mips/unwind_i.h
index faf3237..3382dcf 100644
--- a/frysk-imports/libunwind/src/mips/unwind_i.h
+++ b/frysk-imports/libunwind/src/mips/unwind_i.h
@@ -25,23 +25,18 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #ifndef unwind_i_h
 #define unwind_i_h
 
-#include <memory.h>
 #include <stdint.h>
 
 #include <libunwind-mips.h>
 
 #include "libunwind_i.h"
 
-/*
-#define x86_lock			UNW_OBJ(lock)
-#define x86_local_resume		UNW_OBJ(local_resume)
-#define x86_local_addr_space_init	UNW_OBJ(local_addr_space_init)
-#define x86_scratch_loc			UNW_OBJ(scratch_loc)
+#define mips_lock                       UNW_OBJ(lock)
+#define mips_local_resume               UNW_OBJ(local_resume)
+#define mips_local_addr_space_init      UNW_OBJ(local_addr_space_init)
 
-extern int x86_local_resume (unw_addr_space_t as, unw_cursor_t *cursor,
-			     void *arg);
-extern dwarf_loc_t x86_scratch_loc (struct cursor *c, unw_regnum_t reg);
-*/
+extern int mips_local_resume (unw_addr_space_t as, unw_cursor_t *cursor,
+                             void *arg);
 
 extern void mips_local_addr_space_init (void);
 
diff --git a/frysk-imports/libunwind/src/os-freebsd.c b/frysk-imports/libunwind/src/os-freebsd.c
new file mode 100644
index 0000000..1aa1e07
--- /dev/null
+++ b/frysk-imports/libunwind/src/os-freebsd.c
@@ -0,0 +1,145 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2010 Konstantin Belousov <kib@freebsd.org>
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include <sys/param.h>
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <sys/sysctl.h>
+#include <sys/user.h>
+#include <stdio.h>
+#include <errno.h>
+
+#include "libunwind_i.h"
+
+static void *
+get_mem(size_t sz)
+{
+  void *res;
+
+  res = mmap(NULL, sz, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0);
+  if (res == MAP_FAILED)
+    return (NULL);
+  return (res);
+}
+
+static void
+free_mem(void *ptr, size_t sz)
+{
+  munmap(ptr, sz);
+}
+
+static int
+get_pid_by_tid(int tid)
+{
+  int mib[3], error;
+  size_t len, len1;
+  char *buf;
+  struct kinfo_proc *kv;
+  int i, pid;
+
+  len = 0;
+  mib[0] = CTL_KERN;
+  mib[1] = KERN_PROC;
+  mib[2] = KERN_PROC_ALL;
+
+  error = sysctl(mib, 3, NULL, &len, NULL, 0);
+  if (error == -1)
+    return (-1);
+  len1 = len * 4 / 3;
+  buf = get_mem(len1);
+  if (buf == NULL)
+    return (-1);
+  len = len1;
+  error = sysctl(mib, 3, buf, &len, NULL, 0);
+  if (error == -1) {
+    free_mem(buf, len1);
+    return (-1);
+  }
+  pid = -1;
+  for (i = 0, kv = (struct kinfo_proc *)buf; i < len / sizeof(*kv);
+   i++, kv++) {
+    if (kv->ki_tid == tid) {
+      pid = kv->ki_pid;
+      break;
+    }
+  }
+  free_mem(buf, len1);
+  return (pid);
+}
+
+PROTECTED int
+tdep_get_elf_image (struct elf_image *ei, pid_t pid, unw_word_t ip,
+                    unsigned long *segbase, unsigned long *mapoff, char *path, size_t pathlen)
+{
+  int mib[4], error, ret;
+  size_t len, len1;
+  char *buf, *bp, *eb;
+  struct kinfo_vmentry *kv;
+
+  len = 0;
+  mib[0] = CTL_KERN;
+  mib[1] = KERN_PROC;
+  mib[2] = KERN_PROC_VMMAP;
+  mib[3] = pid;
+
+  error = sysctl(mib, 4, NULL, &len, NULL, 0);
+  if (error == -1) {
+    if (errno == ESRCH) {
+      mib[3] = get_pid_by_tid(pid);
+      if (mib[3] != -1)
+        error = sysctl(mib, 4, NULL, &len, NULL, 0);
+      if (error == -1)
+        return (-UNW_EUNSPEC);
+    } else
+      return (-UNW_EUNSPEC);
+  }
+  len1 = len * 4 / 3;
+  buf = get_mem(len1);
+  if (buf == NULL)
+    return (-UNW_EUNSPEC);
+  len = len1;
+  error = sysctl(mib, 4, buf, &len, NULL, 0);
+  if (error == -1) {
+    free_mem(buf, len1);
+    return (-UNW_EUNSPEC);
+  }
+  ret = -UNW_EUNSPEC;
+  for (bp = buf, eb = buf + len; bp < eb; bp += kv->kve_structsize) {
+     kv = (struct kinfo_vmentry *)(uintptr_t)bp;
+     if (ip < kv->kve_start || ip >= kv->kve_end)
+       continue;
+     if (kv->kve_type != KVME_TYPE_VNODE)
+       continue;
+     *segbase = kv->kve_start;
+     *mapoff = kv->kve_offset;
+     if (path)
+       {
+         strncpy(path, kv->kve_path, pathlen);
+       }
+     ret = elf_map_image (ei, kv->kve_path);
+     break;
+  }
+  free_mem(buf, len1);
+  return (ret);
+}
diff --git a/frysk-imports/libunwind/src/os-hpux.c b/frysk-imports/libunwind/src/os-hpux.c
index 586ace2..2ee6fa7 100644
--- a/frysk-imports/libunwind/src/os-hpux.c
+++ b/frysk-imports/libunwind/src/os-hpux.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003-2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -23,9 +23,8 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
-#ifndef UNW_REMOTE_ONLY
-
 #include <dlfcn.h>
+#include <string.h>
 #include <unistd.h>
 
 #include "libunwind_i.h"
@@ -34,10 +33,11 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 HIDDEN int
 tdep_get_elf_image (struct elf_image *ei, pid_t pid, unw_word_t ip,
-		    unsigned long *segbase, unsigned long *mapoff)
+                    unsigned long *segbase, unsigned long *mapoff,
+                    char *path, size_t pathlen)
 {
   struct load_module_desc lmd;
-  const char *path;
+  const char *path2;
 
   if (pid != getpid ())
     {
@@ -49,15 +49,19 @@ tdep_get_elf_image (struct elf_image *ei, pid_t pid, unw_word_t ip,
     return -UNW_ENOINFO;
 
   *segbase = lmd.text_base;
-  *mapoff = 0;			/* XXX fix me? */
+  *mapoff = 0;                  /* XXX fix me? */
 
-  path = dlgetname (&lmd, sizeof (lmd), NULL, 0, 0);
-  if (!path)
+  path2 = dlgetname (&lmd, sizeof (lmd), NULL, 0, 0);
+  if (!path2)
     return -UNW_ENOINFO;
-
+  if (path)
+    {
+      strncpy(path, path2, pathlen);
+      path[pathlen - 1] = '\0';
+      if (strcmp(path, path2) != 0)
+        Debug(1, "buffer size (%d) not big enough to hold path\n", pathlen);
+    }
   Debug(1, "segbase=%lx, mapoff=%lx, path=%s\n", *segbase, *mapoff, path);
 
   return elf_map_image (ei, path);
 }
-
-#endif /* UNW_REMOTE_ONLY */
diff --git a/frysk-imports/libunwind/src/os-linux.c b/frysk-imports/libunwind/src/os-linux.c
index ae37d8f..1cc9ba5 100644
--- a/frysk-imports/libunwind/src/os-linux.c
+++ b/frysk-imports/libunwind/src/os-linux.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003-2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -23,8 +23,6 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
-#ifndef UNW_REMOTE_ONLY
-
 #include <limits.h>
 #include <stdio.h>
 
@@ -33,26 +31,33 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 PROTECTED int
 tdep_get_elf_image (struct elf_image *ei, pid_t pid, unw_word_t ip,
-		    unsigned long *segbase, unsigned long *mapoff)
+                    unsigned long *segbase, unsigned long *mapoff,
+                    char *path, size_t pathlen)
 {
   struct map_iterator mi;
-  char path[PATH_MAX];
-  int found = 0;
+  int found = 0, rc;
   unsigned long hi;
 
-  maps_init (&mi, pid);
-  while (maps_next (&mi, segbase, &hi, mapoff, path, sizeof (path)))
+  if (maps_init (&mi, pid) < 0)
+    return -1;
+
+  while (maps_next (&mi, segbase, &hi, mapoff))
     if (ip >= *segbase && ip < hi)
       {
-	found = 1;
-	break;
+        found = 1;
+        break;
       }
-  maps_close (&mi);
 
   if (!found)
-    return -1;
-
-  return elf_map_image (ei, path);
+    {
+      maps_close (&mi);
+      return -1;
+    }
+  if (path)
+    {
+      strncpy(path, mi.path, pathlen);
+    }
+  rc = elf_map_image (ei, mi.path);
+  maps_close (&mi);
+  return rc;
 }
-
-#endif /* UNW_REMOTE_ONLY */
diff --git a/frysk-imports/libunwind/src/os-linux.h b/frysk-imports/libunwind/src/os-linux.h
index b2c9a8b..3976b38 100644
--- a/frysk-imports/libunwind/src/os-linux.h
+++ b/frysk-imports/libunwind/src/os-linux.h
@@ -1,7 +1,7 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003-2004 Hewlett-Packard Co
    Copyright (C) 2007 David Mosberger-Tang
-	Contributed by David Mosberger-Tang <dmosberger@gmail.com>
+        Contributed by David Mosberger-Tang <dmosberger@gmail.com>
 
 This file is part of libunwind.
 
@@ -34,6 +34,7 @@ struct map_iterator
     size_t buf_size;
     char *buf;
     char *buf_end;
+    char *path;
   };
 
 static inline char *
@@ -61,33 +62,37 @@ ltoa (char *buf, long val)
   return buf + len;
 }
 
-static inline void
+static inline int
 maps_init (struct map_iterator *mi, pid_t pid)
 {
-  char path[PATH_MAX], *cp;
+  char path[sizeof ("/proc/0123456789/maps")], *cp;
 
   memcpy (path, "/proc/", 6);
   cp = ltoa (path + 6, pid);
+  assert (cp + 6 < path + sizeof (path));
   memcpy (cp, "/maps", 6);
 
   mi->fd = open (path, O_RDONLY);
-  mi->offset = 0;
-  mi->buf_size = 0;
-
-  cp = NULL;
   if (mi->fd >= 0)
     {
-      /* Try to allocate a page-sized buffer.  If that fails, we'll
-	 fall back on reading one line at a time.  */
+      /* Try to allocate a page-sized buffer.  */
       mi->buf_size = getpagesize ();
-      cp = mmap (0, mi->buf_size, PROT_READ | PROT_WRITE,
-		 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+      cp = mmap (NULL, mi->buf_size, PROT_READ | PROT_WRITE,
+                 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
       if (cp == MAP_FAILED)
-	cp = NULL;
+        {
+          close(mi->fd);
+          mi->fd = -1;
+          return -1;
+        }
       else
-	cp += mi->buf_size;
+        {
+          mi->offset = 0;
+          mi->buf = mi->buf_end = cp + mi->buf_size;
+          return 0;
+        }
     }
-  mi->buf = mi->buf_end = cp;
+  return -1;
 }
 
 static inline char *
@@ -114,13 +119,13 @@ scan_hex (char *cp, unsigned long *valp)
     {
       digit = *cp;
       if ((digit - '0') <= 9)
-	digit -= '0';
+        digit -= '0';
       else if ((digit - 'a') < 6)
-	digit -= 'a' - 10;
+        digit -= 'a' - 10;
       else if ((digit - 'A') < 6)
-	digit -= 'A' - 10;
+        digit -= 'A' - 10;
       else
-	break;
+        break;
       val = (val << 4) | digit;
       ++num_digits;
       ++cp;
@@ -143,12 +148,12 @@ scan_dec (char *cp, unsigned long *valp)
     {
       digit = *cp;
       if ((digit - '0') <= 9)
-	{
-	  digit -= '0';
-	  ++cp;
-	}
+        {
+          digit -= '0';
+          ++cp;
+        }
       else
-	break;
+        break;
       val = (10 * val) + digit;
       ++num_digits;
     }
@@ -184,8 +189,8 @@ scan_string (char *cp, char *valp, size_t buf_size)
 
   while (*cp != ' ' && *cp != '\t' && *cp != '\0')
     {
-      if (i < buf_size - 1)
-	valp[i++] = *cp;
+      if ((valp != NULL) && (i < buf_size - 1))
+        valp[i++] = *cp;
       ++cp;
     }
   if (i == 0 || i >= buf_size)
@@ -196,12 +201,10 @@ scan_string (char *cp, char *valp, size_t buf_size)
 
 static inline int
 maps_next (struct map_iterator *mi,
-	   unsigned long *low, unsigned long *high, unsigned long *offset,
-	   char *path, size_t path_size)
+           unsigned long *low, unsigned long *high, unsigned long *offset)
 {
-  char line[256 + PATH_MAX], perm[16], dash, colon, *cp;
+  char perm[16], dash = 0, colon = 0, *cp;
   unsigned long major, minor, inum;
-  size_t to_read = 256;	/* most lines fit in 256 characters easy */
   ssize_t i, nread;
 
   if (mi->fd < 0)
@@ -209,80 +212,52 @@ maps_next (struct map_iterator *mi,
 
   while (1)
     {
-      if (mi->buf)
-	{
-	  ssize_t bytes_left = mi->buf_end - mi->buf;
-	  char *eol = NULL;
-
-	  for (i = 0; i < bytes_left; ++i)
-	    {
-	      if (mi->buf[i] == '\n')
-		{
-		  eol = mi->buf + i;
-		  break;
-		}
-	      else if (mi->buf[i] == '\0')
-		break;
-	    }
-	  if (!eol)
-	    {
-	      /* copy down the remaining bytes, if any */
-	      if (bytes_left > 0)
-		memmove (mi->buf_end - mi->buf_size, mi->buf, bytes_left);
-
-	      mi->buf = mi->buf_end - mi->buf_size;
-	      nread = read (mi->fd, mi->buf + bytes_left,
-			    mi->buf_size - bytes_left);
-	      if (nread <= 0)
-		return 0;
-	      else if ((size_t) (nread + bytes_left) < mi->buf_size)
-		{
-		  /* Move contents to the end of the buffer so we
-		     maintain the invariant that all bytes between
-		     mi->buf and mi->buf_end are valid.  */
-		  memmove (mi->buf_end - nread - bytes_left, mi->buf,
-			  nread + bytes_left);
-		  mi->buf = mi->buf_end - nread - bytes_left;
-		}
-
-	      eol = mi->buf + bytes_left + nread - 1;
-
-	      for (i = bytes_left; i < bytes_left + nread; ++i)
-		if (mi->buf[i] == '\n')
-		  {
-		    eol = mi->buf + i;
-		    break;
-		  }
-	    }
-	  cp = mi->buf;
-	  mi->buf = eol + 1;
-	  *eol = '\0';
-	}
-      else
-	{
-	  /* maps_init() wasn't able to allocate a buffer; do it the
-	     slow way.  */
-	  lseek (mi->fd, mi->offset, SEEK_SET);
-
-	  if ((nread = read (mi->fd, line, to_read)) <= 0)
-	    return 0;
-	  for (i = 0; i < nread && line[i] != '\n'; ++i)
-	    /* skip */;
-	  if (i < nread)
-	    {
-	      line[i] = '\0';
-	      mi->offset += i + 1;
-	    }
-	  else
-	    {
-	      if (to_read < sizeof (line))
-		to_read = sizeof (line) - 1;
-	      else
-		mi->offset += nread;	/* not supposed to happen... */
-	      continue;	/* duh, no newline found */
-	    }
-	  cp = line;
-	}
+      ssize_t bytes_left = mi->buf_end - mi->buf;
+      char *eol = NULL;
+
+      for (i = 0; i < bytes_left; ++i)
+        {
+          if (mi->buf[i] == '\n')
+            {
+              eol = mi->buf + i;
+              break;
+            }
+          else if (mi->buf[i] == '\0')
+            break;
+        }
+      if (!eol)
+        {
+          /* copy down the remaining bytes, if any */
+          if (bytes_left > 0)
+            memmove (mi->buf_end - mi->buf_size, mi->buf, bytes_left);
+
+          mi->buf = mi->buf_end - mi->buf_size;
+          nread = read (mi->fd, mi->buf + bytes_left,
+                        mi->buf_size - bytes_left);
+          if (nread <= 0)
+            return 0;
+          else if ((size_t) (nread + bytes_left) < mi->buf_size)
+            {
+              /* Move contents to the end of the buffer so we
+                 maintain the invariant that all bytes between
+                 mi->buf and mi->buf_end are valid.  */
+              memmove (mi->buf_end - nread - bytes_left, mi->buf,
+                       nread + bytes_left);
+              mi->buf = mi->buf_end - nread - bytes_left;
+            }
+
+          eol = mi->buf + bytes_left + nread - 1;
+
+          for (i = bytes_left; i < bytes_left + nread; ++i)
+            if (mi->buf[i] == '\n')
+              {
+                eol = mi->buf + i;
+                break;
+              }
+        }
+      cp = mi->buf;
+      mi->buf = eol + 1;
+      *eol = '\0';
 
       /* scan: "LOW-HIGH PERM OFFSET MAJOR:MINOR INUM PATH" */
       cp = scan_hex (cp, low);
@@ -294,9 +269,12 @@ maps_next (struct map_iterator *mi,
       cp = scan_char (cp, &colon);
       cp = scan_hex (cp, &minor);
       cp = scan_dec (cp, &inum);
-      cp = scan_string (cp, path, path_size);
-      if (!cp || dash != '-' || colon != ':')
-	continue;	/* skip line with unknown or bad format */
+      cp = mi->path = skip_whitespace (cp);
+      if (!cp)
+        continue;
+      cp = scan_string (cp, NULL, 0);
+      if (dash != '-' || colon != ':')
+        continue;       /* skip line with unknown or bad format */
       return 1;
     }
   return 0;
@@ -312,7 +290,7 @@ maps_close (struct map_iterator *mi)
   if (mi->buf)
     {
       munmap (mi->buf_end - mi->buf_size, mi->buf_size);
-      mi->buf = mi->buf_end = 0;
+      mi->buf = mi->buf_end = NULL;
     }
 }
 
diff --git a/frysk-imports/libunwind/src/os-qnx.c b/frysk-imports/libunwind/src/os-qnx.c
new file mode 100644
index 0000000..97bc766
--- /dev/null
+++ b/frysk-imports/libunwind/src/os-qnx.c
@@ -0,0 +1,107 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2013 Garmin International
+        Contributed by Matt Fischer <matt.fischer@garmin.com>
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include <string.h>
+
+#include "libunwind_i.h"
+
+struct cb_info
+{
+    unw_word_t ip;
+    unsigned long segbase;
+    unsigned long offset;
+    const char *path;
+};
+
+static int callback(const struct dl_phdr_info *info, size_t size, void *data)
+{
+  int i;
+  struct cb_info *cbi = (struct cb_info*)data;
+  for(i=0; i<info->dlpi_phnum; i++) {
+    int segbase = info->dlpi_addr + info->dlpi_phdr[i].p_vaddr;
+    if(cbi->ip >= segbase && cbi->ip < segbase + info->dlpi_phdr[i].p_memsz)
+    {
+      cbi->path = info->dlpi_name;
+      cbi->offset = info->dlpi_phdr[i].p_offset;
+      cbi->segbase = segbase;
+      return 1;
+    }
+  }
+
+  return 0;
+}
+
+PROTECTED int
+tdep_get_elf_image (struct elf_image *ei, pid_t pid, unw_word_t ip,
+                    unsigned long *segbase, unsigned long *mapoff,
+                    char *path, size_t pathlen)
+{
+  struct cb_info cbi;
+  int ret = -1;
+  cbi.ip = ip;
+  cbi.segbase = 0;
+  cbi.offset = 0;
+  cbi.path = NULL;
+
+  /* QNX's support for accessing symbol maps is severely broken.  There is
+     a devctl() call that can be made on a proc node (DCMD_PROC_MAPDEBUG)
+     which returns information similar to Linux's /proc/<pid>/maps
+     node, however the filename that is returned by this call is not an
+     absolute path, and there is no foolproof way to map the filename
+     back to the file that it came from.
+
+     Therefore, the normal approach for implementing this function,
+     which works equally well for both local and remote unwinding,
+     will not work here.  The only type of image lookup which works
+     reliably is locally, using dl_iterate_phdr().  However, the only
+     time that this function is required to look up a remote image is for
+     ptrace support, which doesn't work on QNX anyway.  Local unwinding,
+     which is the main case that makes use of this function, will work
+     fine with dl_iterate_phdr().  Therefore, in lieu of any better
+     platform support for remote image lookup, this function has just
+     been implemented in terms of dl_iterate_phdr().
+  */
+
+  if (pid != getpid())
+  {
+    /* Return an error if an attempt is made to perform remote image lookup */
+    return -1;
+  }
+
+  if (dl_iterate_phdr (callback, &cbi) != 0)
+  {
+    if (path)
+    {
+      strncpy (path, cbi.path, pathlen);
+    }
+
+    *mapoff = cbi.offset;
+    *segbase = cbi.segbase;
+
+    ret = elf_map_image (ei, cbi.path);
+  }
+
+  return ret;
+}
diff --git a/frysk-imports/libunwind/src/ppc/Gcreate_addr_space.c b/frysk-imports/libunwind/src/ppc/Gcreate_addr_space.c
deleted file mode 100644
index 21ec10f..0000000
--- a/frysk-imports/libunwind/src/ppc/Gcreate_addr_space.c
+++ /dev/null
@@ -1,54 +0,0 @@
-/* libunwind - a platform-independent unwind library
-   Copyright (C) 2006-2007 IBM
-   Contributed by
-     Corey Ashford <cjashfor@us.ibm.com>
-     Jose Flavio Aguilar Paulino <jflavio@br.ibm.com> <joseflavio@gmail.com>
-
-This file is part of libunwind.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
-
-#include <stdlib.h>
-
-#include <libunwind_i.h>
-
-PROTECTED unw_addr_space_t
-unw_create_addr_space (unw_accessors_t *a, int byte_order)
-{
-#ifdef UNW_LOCAL_ONLY
-  return NULL;
-#else
-  unw_addr_space_t as = malloc (sizeof (*as));
-
-  if (!as)
-    return NULL;
-
-  memset (as, 0, sizeof (*as));
-
-  as->acc = *a;
-
-  /*
-   * Linux ppc64 supports only big-endian.
-   */
-  if (byte_order != 0 && byte_order != __BIG_ENDIAN)
-    return NULL;
-  return as;
-#endif
-}
diff --git a/frysk-imports/libunwind/src/ppc/Gfetch_proc_info_post.c b/frysk-imports/libunwind/src/ppc/Gfetch_proc_info_post.c
deleted file mode 100644
index 778d9ae..0000000
--- a/frysk-imports/libunwind/src/ppc/Gfetch_proc_info_post.c
+++ /dev/null
@@ -1,51 +0,0 @@
-/* libunwind - a platform-independent unwind library
-   Copyright (c) 2006 Hewlett-Packard Development Company, L.P.
-	Contributed by Jan Kratochvil <jan.kratochvil@redhat.com>
-
-This file is part of libunwind.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
-
-#include "libunwind_i.h"
-
-HIDDEN int
-tdep_fetch_proc_info_post (struct dwarf_cursor *c, unw_word_t ip, int need_unwind_info)
-{
-  struct cursor *cursor = (struct cursor *) c;
-
-  /* Should happen only if `!need_unwind_info'.  */
-  if (!c->pi_valid)
-    return 0;
-  /* Should happen only if `!need_unwind_info'.  */
-  if (!c->pi.unwind_info)
-    return 0;
-
-  /* Reset the value for this frame.  */
-  cursor->sigcontext_format = PPC_SCF_NONE;
-
-  /* Normal non-signal frames case.  */
-  if (!((struct dwarf_cie_info *) c->pi.unwind_info)->signal_frame)
-    return 0;
-
-  cursor->sigcontext_format = PPC_SCF_LINUX_RT_SIGFRAME;
-  cursor->sigcontext_addr = c->cfa + 4;
-
-  return 0;
-}
diff --git a/frysk-imports/libunwind/src/ppc/Gget_proc_info.c b/frysk-imports/libunwind/src/ppc/Gget_proc_info.c
index 21be70c..29f1db5 100644
--- a/frysk-imports/libunwind/src/ppc/Gget_proc_info.c
+++ b/frysk-imports/libunwind/src/ppc/Gget_proc_info.c
@@ -29,6 +29,13 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 PROTECTED int
 unw_get_proc_info (unw_cursor_t *cursor, unw_proc_info_t *pi)
 {
-  /* XXX: empty stub.  */
+  struct cursor *c = (struct cursor *) cursor;
+  int ret;
+
+  ret = dwarf_make_proc_info (&c->dwarf);
+  if (ret < 0)
+    return ret;
+
+  *pi = c->dwarf.pi;
   return 0;
 }
diff --git a/frysk-imports/libunwind/src/ppc/Ginit_local.c b/frysk-imports/libunwind/src/ppc/Ginit_local.c
index 2d9ab2c..4ca2b25 100644
--- a/frysk-imports/libunwind/src/ppc/Ginit_local.c
+++ b/frysk-imports/libunwind/src/ppc/Ginit_local.c
@@ -48,7 +48,7 @@ unw_init_local (unw_cursor_t *cursor, ucontext_t *uc)
 {
   struct cursor *c = (struct cursor *) cursor;
 
-  if (tdep_needs_initialization)
+  if (!tdep_init_done)
     tdep_init ();
 
   Debug (1, "(cursor=%p)\n", c);
@@ -56,9 +56,9 @@ unw_init_local (unw_cursor_t *cursor, ucontext_t *uc)
   c->dwarf.as = unw_local_addr_space;
   c->dwarf.as_arg = uc;
   #ifdef UNW_TARGET_PPC64
-    return common_init_ppc64 (c);
+    return common_init_ppc64 (c, 1);
   #else
-    return common_init_ppc32 (c);
+    return common_init_ppc32 (c, 1);
   #endif
 }
 
diff --git a/frysk-imports/libunwind/src/ppc/Ginit_remote.c b/frysk-imports/libunwind/src/ppc/Ginit_remote.c
index 66269d2..4ee5402 100644
--- a/frysk-imports/libunwind/src/ppc/Ginit_remote.c
+++ b/frysk-imports/libunwind/src/ppc/Ginit_remote.c
@@ -41,7 +41,7 @@ unw_init_remote (unw_cursor_t *cursor, unw_addr_space_t as, void *as_arg)
 #else /* !UNW_LOCAL_ONLY */
   struct cursor *c = (struct cursor *) cursor;
 
-  if (tdep_needs_initialization)
+  if (!tdep_init_done)
     tdep_init ();
 
   Debug (1, "(cursor=%p)\n", c);
@@ -50,9 +50,9 @@ unw_init_remote (unw_cursor_t *cursor, unw_addr_space_t as, void *as_arg)
   c->dwarf.as_arg = as_arg;
 
   #ifdef UNW_TARGET_PPC64
-    return common_init_ppc64(c);
+    return common_init_ppc64 (c, 0);
   #elif UNW_TARGET_PPC32
-    return common_init_ppc32 (c);
+    return common_init_ppc32 (c, 0);
   #else
     #error init_remote :: NO VALID PPC ARCH!
   #endif
diff --git a/frysk-imports/libunwind/src/ppc/Gis_signal_frame.c b/frysk-imports/libunwind/src/ppc/Gis_signal_frame.c
index 4154429..e8b6917 100644
--- a/frysk-imports/libunwind/src/ppc/Gis_signal_frame.c
+++ b/frysk-imports/libunwind/src/ppc/Gis_signal_frame.c
@@ -31,14 +31,14 @@ PROTECTED int
 unw_is_signal_frame (unw_cursor_t * cursor)
 {
   struct cursor *c = (struct cursor *) cursor;
-  unw_word_t w0, w1, ip;
+  unw_word_t w0, w1, i0, i1, i2, ip;
   unw_addr_space_t as;
   unw_accessors_t *a;
   void *arg;
   int ret;
 
   as = c->dwarf.as;
-  as->validate = 1;		/* Don't trust the ip */
+  as->validate = 1;             /* Don't trust the ip */
   arg = c->dwarf.as_arg;
 
   /* Check if return address points at sigreturn sequence.
@@ -60,7 +60,19 @@ unw_is_signal_frame (unw_cursor_t * cursor)
   if ((ret = (*a->access_mem) (as, ip, &w0, 0, arg)) < 0
       || (ret = (*a->access_mem) (as, ip + 8, &w1, 0, arg)) < 0)
     return 0;
-  w1 >>= 32;
-  return (w0 == 0x38210080380000ac && w1 == 0x44000002);
 
+  if (tdep_big_endian (as))
+    {
+      i0 = w0 >> 32;
+      i1 = w0 & 0xffffffffUL;
+      i2 = w1 >> 32;
+    }
+  else
+    {
+      i0 = w0 & 0xffffffffUL;
+      i1 = w0 >> 32;
+      i2 = w1 & 0xffffffffUL;
+    }
+
+  return (i0 == 0x38210080 && i1 == 0x380000ac && i2 == 0x44000002);
 }
diff --git a/frysk-imports/libunwind/src/ppc/Lcreate_addr_space.c b/frysk-imports/libunwind/src/ppc/Lcreate_addr_space.c
deleted file mode 100644
index 0f2dc6b..0000000
--- a/frysk-imports/libunwind/src/ppc/Lcreate_addr_space.c
+++ /dev/null
@@ -1,5 +0,0 @@
-#define UNW_LOCAL_ONLY
-#include <libunwind.h>
-#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
-#include "Gcreate_addr_space.c"
-#endif
diff --git a/frysk-imports/libunwind/src/ppc/Lfetch_proc_info_post.c b/frysk-imports/libunwind/src/ppc/Lfetch_proc_info_post.c
deleted file mode 100644
index c88239c..0000000
--- a/frysk-imports/libunwind/src/ppc/Lfetch_proc_info_post.c
+++ /dev/null
@@ -1,5 +0,0 @@
-#define UNW_LOCAL_ONLY
-#include <libunwind.h>
-#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
-#include "Gfetch_proc_info_post.c"
-#endif
diff --git a/frysk-imports/libunwind/src/ppc32/Gcreate_addr_space.c b/frysk-imports/libunwind/src/ppc32/Gcreate_addr_space.c
new file mode 100644
index 0000000..f5055ec
--- /dev/null
+++ b/frysk-imports/libunwind/src/ppc32/Gcreate_addr_space.c
@@ -0,0 +1,56 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2006-2007 IBM
+   Contributed by
+     Corey Ashford <cjashfor@us.ibm.com>
+     Jose Flavio Aguilar Paulino <jflavio@br.ibm.com> <joseflavio@gmail.com>
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include <stdlib.h>
+
+#include <libunwind_i.h>
+
+PROTECTED unw_addr_space_t
+unw_create_addr_space (unw_accessors_t *a, int byte_order)
+{
+#ifdef UNW_LOCAL_ONLY
+  return NULL;
+#else
+  unw_addr_space_t as;
+
+  /*
+   * We support only big-endian on Linux ppc32.
+   */
+  if (byte_order != 0 && byte_order != __BIG_ENDIAN)
+    return NULL;
+
+  as = malloc (sizeof (*as));
+  if (!as)
+    return NULL;
+
+  memset (as, 0, sizeof (*as));
+
+  as->acc = *a;
+
+  return as;
+#endif
+}
diff --git a/frysk-imports/libunwind/src/ppc32/Gglobal.c b/frysk-imports/libunwind/src/ppc32/Gglobal.c
index c2d4604..a0f80be 100644
--- a/frysk-imports/libunwind/src/ppc32/Gglobal.c
+++ b/frysk-imports/libunwind/src/ppc32/Gglobal.c
@@ -28,84 +28,84 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #include "unwind_i.h"
 #include "dwarf_i.h"
 
-HIDDEN pthread_mutex_t ppc32_lock = PTHREAD_MUTEX_INITIALIZER;
-HIDDEN int tdep_needs_initialization = 1;
+HIDDEN define_lock (ppc32_lock);
+HIDDEN int tdep_init_done;
 
 /* The API register numbers are exactly the same as the .eh_frame
    registers, for now at least.  */
-uint8_t dwarf_to_unw_regnum_map[DWARF_REGNUM_MAP_LENGTH] =
+HIDDEN const uint8_t dwarf_to_unw_regnum_map[DWARF_REGNUM_MAP_LENGTH] =
   {
-	[UNW_PPC32_R0]=UNW_PPC32_R0,
-	[UNW_PPC32_R1]=UNW_PPC32_R1,
-	[UNW_PPC32_R2]=UNW_PPC32_R2,
-	[UNW_PPC32_R3]=UNW_PPC32_R3,
-	[UNW_PPC32_R4]=UNW_PPC32_R4,
-	[UNW_PPC32_R5]=UNW_PPC32_R5,
-	[UNW_PPC32_R6]=UNW_PPC32_R6,
-	[UNW_PPC32_R7]=UNW_PPC32_R7,
-	[UNW_PPC32_R8]=UNW_PPC32_R8,
-	[UNW_PPC32_R9]=UNW_PPC32_R9,
-	[UNW_PPC32_R10]=UNW_PPC32_R10,
-	[UNW_PPC32_R11]=UNW_PPC32_R11,
-	[UNW_PPC32_R12]=UNW_PPC32_R12,
-	[UNW_PPC32_R13]=UNW_PPC32_R13,
-	[UNW_PPC32_R14]=UNW_PPC32_R14,
-	[UNW_PPC32_R15]=UNW_PPC32_R15,
-	[UNW_PPC32_R16]=UNW_PPC32_R16,
-	[UNW_PPC32_R17]=UNW_PPC32_R17,
-	[UNW_PPC32_R18]=UNW_PPC32_R18,
-	[UNW_PPC32_R19]=UNW_PPC32_R19,
-	[UNW_PPC32_R20]=UNW_PPC32_R20,
-	[UNW_PPC32_R21]=UNW_PPC32_R21,
-	[UNW_PPC32_R22]=UNW_PPC32_R22,
-	[UNW_PPC32_R23]=UNW_PPC32_R23,
-	[UNW_PPC32_R24]=UNW_PPC32_R24,
-	[UNW_PPC32_R25]=UNW_PPC32_R25,
-	[UNW_PPC32_R26]=UNW_PPC32_R26,
-	[UNW_PPC32_R27]=UNW_PPC32_R27,
-	[UNW_PPC32_R28]=UNW_PPC32_R28,
-	[UNW_PPC32_R29]=UNW_PPC32_R29,
-	[UNW_PPC32_R30]=UNW_PPC32_R30,
-	[UNW_PPC32_R31]=UNW_PPC32_R31,
+        [UNW_PPC32_R0]=UNW_PPC32_R0,
+        [UNW_PPC32_R1]=UNW_PPC32_R1,
+        [UNW_PPC32_R2]=UNW_PPC32_R2,
+        [UNW_PPC32_R3]=UNW_PPC32_R3,
+        [UNW_PPC32_R4]=UNW_PPC32_R4,
+        [UNW_PPC32_R5]=UNW_PPC32_R5,
+        [UNW_PPC32_R6]=UNW_PPC32_R6,
+        [UNW_PPC32_R7]=UNW_PPC32_R7,
+        [UNW_PPC32_R8]=UNW_PPC32_R8,
+        [UNW_PPC32_R9]=UNW_PPC32_R9,
+        [UNW_PPC32_R10]=UNW_PPC32_R10,
+        [UNW_PPC32_R11]=UNW_PPC32_R11,
+        [UNW_PPC32_R12]=UNW_PPC32_R12,
+        [UNW_PPC32_R13]=UNW_PPC32_R13,
+        [UNW_PPC32_R14]=UNW_PPC32_R14,
+        [UNW_PPC32_R15]=UNW_PPC32_R15,
+        [UNW_PPC32_R16]=UNW_PPC32_R16,
+        [UNW_PPC32_R17]=UNW_PPC32_R17,
+        [UNW_PPC32_R18]=UNW_PPC32_R18,
+        [UNW_PPC32_R19]=UNW_PPC32_R19,
+        [UNW_PPC32_R20]=UNW_PPC32_R20,
+        [UNW_PPC32_R21]=UNW_PPC32_R21,
+        [UNW_PPC32_R22]=UNW_PPC32_R22,
+        [UNW_PPC32_R23]=UNW_PPC32_R23,
+        [UNW_PPC32_R24]=UNW_PPC32_R24,
+        [UNW_PPC32_R25]=UNW_PPC32_R25,
+        [UNW_PPC32_R26]=UNW_PPC32_R26,
+        [UNW_PPC32_R27]=UNW_PPC32_R27,
+        [UNW_PPC32_R28]=UNW_PPC32_R28,
+        [UNW_PPC32_R29]=UNW_PPC32_R29,
+        [UNW_PPC32_R30]=UNW_PPC32_R30,
+        [UNW_PPC32_R31]=UNW_PPC32_R31,
 
-	[UNW_PPC32_CTR]=UNW_PPC32_CTR,
-	[UNW_PPC32_XER]=UNW_PPC32_XER,
-	[UNW_PPC32_CCR]=UNW_PPC32_CCR,
-	[UNW_PPC32_LR]=UNW_PPC32_LR,
-	[UNW_PPC32_FPSCR]=UNW_PPC32_FPSCR,
+        [UNW_PPC32_CTR]=UNW_PPC32_CTR,
+        [UNW_PPC32_XER]=UNW_PPC32_XER,
+        [UNW_PPC32_CCR]=UNW_PPC32_CCR,
+        [UNW_PPC32_LR]=UNW_PPC32_LR,
+        [UNW_PPC32_FPSCR]=UNW_PPC32_FPSCR,
 
-	[UNW_PPC32_F0]=UNW_PPC32_F0,
-	[UNW_PPC32_F1]=UNW_PPC32_F1,
-	[UNW_PPC32_F2]=UNW_PPC32_F2,
-	[UNW_PPC32_F3]=UNW_PPC32_F3,
-	[UNW_PPC32_F4]=UNW_PPC32_F4,
-	[UNW_PPC32_F5]=UNW_PPC32_F5,
-	[UNW_PPC32_F6]=UNW_PPC32_F6,
-	[UNW_PPC32_F7]=UNW_PPC32_F7,
-	[UNW_PPC32_F8]=UNW_PPC32_F8,
-	[UNW_PPC32_F9]=UNW_PPC32_F9,
-	[UNW_PPC32_F10]=UNW_PPC32_F10,
-	[UNW_PPC32_F11]=UNW_PPC32_F11,
-	[UNW_PPC32_F12]=UNW_PPC32_F12,
-	[UNW_PPC32_F13]=UNW_PPC32_F13,
-	[UNW_PPC32_F14]=UNW_PPC32_F14,
-	[UNW_PPC32_F15]=UNW_PPC32_F15,
-	[UNW_PPC32_F16]=UNW_PPC32_F16,
-	[UNW_PPC32_F17]=UNW_PPC32_F17,
-	[UNW_PPC32_F18]=UNW_PPC32_F18,
-	[UNW_PPC32_F19]=UNW_PPC32_F19,
-	[UNW_PPC32_F20]=UNW_PPC32_F20,
-	[UNW_PPC32_F21]=UNW_PPC32_F21,
-	[UNW_PPC32_F22]=UNW_PPC32_F22,
-	[UNW_PPC32_F23]=UNW_PPC32_F23,
-	[UNW_PPC32_F24]=UNW_PPC32_F24,
-	[UNW_PPC32_F25]=UNW_PPC32_F25,
-	[UNW_PPC32_F26]=UNW_PPC32_F26,
-	[UNW_PPC32_F27]=UNW_PPC32_F27,
-	[UNW_PPC32_F28]=UNW_PPC32_F28,
-	[UNW_PPC32_F29]=UNW_PPC32_F29,
-	[UNW_PPC32_F30]=UNW_PPC32_F30,
-	[UNW_PPC32_F31]=UNW_PPC32_F31,
+        [UNW_PPC32_F0]=UNW_PPC32_F0,
+        [UNW_PPC32_F1]=UNW_PPC32_F1,
+        [UNW_PPC32_F2]=UNW_PPC32_F2,
+        [UNW_PPC32_F3]=UNW_PPC32_F3,
+        [UNW_PPC32_F4]=UNW_PPC32_F4,
+        [UNW_PPC32_F5]=UNW_PPC32_F5,
+        [UNW_PPC32_F6]=UNW_PPC32_F6,
+        [UNW_PPC32_F7]=UNW_PPC32_F7,
+        [UNW_PPC32_F8]=UNW_PPC32_F8,
+        [UNW_PPC32_F9]=UNW_PPC32_F9,
+        [UNW_PPC32_F10]=UNW_PPC32_F10,
+        [UNW_PPC32_F11]=UNW_PPC32_F11,
+        [UNW_PPC32_F12]=UNW_PPC32_F12,
+        [UNW_PPC32_F13]=UNW_PPC32_F13,
+        [UNW_PPC32_F14]=UNW_PPC32_F14,
+        [UNW_PPC32_F15]=UNW_PPC32_F15,
+        [UNW_PPC32_F16]=UNW_PPC32_F16,
+        [UNW_PPC32_F17]=UNW_PPC32_F17,
+        [UNW_PPC32_F18]=UNW_PPC32_F18,
+        [UNW_PPC32_F19]=UNW_PPC32_F19,
+        [UNW_PPC32_F20]=UNW_PPC32_F20,
+        [UNW_PPC32_F21]=UNW_PPC32_F21,
+        [UNW_PPC32_F22]=UNW_PPC32_F22,
+        [UNW_PPC32_F23]=UNW_PPC32_F23,
+        [UNW_PPC32_F24]=UNW_PPC32_F24,
+        [UNW_PPC32_F25]=UNW_PPC32_F25,
+        [UNW_PPC32_F26]=UNW_PPC32_F26,
+        [UNW_PPC32_F27]=UNW_PPC32_F27,
+        [UNW_PPC32_F28]=UNW_PPC32_F28,
+        [UNW_PPC32_F29]=UNW_PPC32_F29,
+        [UNW_PPC32_F30]=UNW_PPC32_F30,
+        [UNW_PPC32_F31]=UNW_PPC32_F31,
 };
 
 HIDDEN void
@@ -115,10 +115,9 @@ tdep_init (void)
 
   sigfillset (&unwi_full_mask);
 
-  sigprocmask (SIG_SETMASK, &unwi_full_mask, &saved_mask);
-  mutex_lock (&ppc32_lock);
+  lock_acquire (&ppc32_lock, saved_mask);
   {
-    if (!tdep_needs_initialization)
+    if (tdep_init_done)
       /* another thread else beat us to it... */
       goto out;
 
@@ -129,9 +128,8 @@ tdep_init (void)
 #ifndef UNW_REMOTE_ONLY
     ppc32_local_addr_space_init ();
 #endif
-    tdep_needs_initialization = 0;	/* signal that we're initialized... */
+    tdep_init_done = 1; /* signal that we're initialized... */
   }
  out:
-  mutex_unlock (&ppc32_lock);
-  sigprocmask (SIG_SETMASK, &saved_mask, NULL);
+  lock_release (&ppc32_lock, saved_mask);
 }
diff --git a/frysk-imports/libunwind/src/ppc32/Ginit.c b/frysk-imports/libunwind/src/ppc32/Ginit.c
index 47c66f1..f2e6e82 100644
--- a/frysk-imports/libunwind/src/ppc32/Ginit.c
+++ b/frysk-imports/libunwind/src/ppc32/Ginit.c
@@ -42,11 +42,6 @@ static struct unw_addr_space local_addr_space;
 
 PROTECTED unw_addr_space_t unw_local_addr_space = &local_addr_space;
 
-
-#define PAGE_SIZE 4096
-#define PAGE_START(a)	((a) & ~(PAGE_SIZE-1))
-
-
 static void *
 uc_addr (ucontext_t *uc, int reg)
 {
@@ -65,22 +60,22 @@ uc_addr (ucontext_t *uc, int reg)
       unsigned gregs_idx;
 
       switch (reg)
-	{
-	case UNW_PPC32_CTR:
-	  gregs_idx = CTR_IDX;
-	  break;
-	case UNW_PPC32_LR:
-	  gregs_idx = LINK_IDX;
-	  break;
-	case UNW_PPC32_XER:
-	  gregs_idx = XER_IDX;
-	  break;
-	case UNW_PPC32_CCR:
-	  gregs_idx = CCR_IDX;
-	  break;
-	default:
-	  return NULL;
-	}
+        {
+        case UNW_PPC32_CTR:
+          gregs_idx = CTR_IDX;
+          break;
+        case UNW_PPC32_LR:
+          gregs_idx = LINK_IDX;
+          break;
+        case UNW_PPC32_XER:
+          gregs_idx = XER_IDX;
+          break;
+        case UNW_PPC32_CCR:
+          gregs_idx = CCR_IDX;
+          break;
+        default:
+          return NULL;
+        }
       addr = &uc->uc_mcontext.uc_regs->gregs[gregs_idx];
     }
   return addr;
@@ -94,7 +89,7 @@ tdep_uc_addr (ucontext_t *uc, int reg)
   return uc_addr (uc, reg);
 }
 
-# endif	/* UNW_LOCAL_ONLY */
+# endif /* UNW_LOCAL_ONLY */
 
 HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
 
@@ -107,7 +102,7 @@ put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
 
 static int
 get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
-			void *arg)
+                        void *arg)
 {
   *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
   return 0;
@@ -115,7 +110,7 @@ get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
 
 static int
 access_mem (unw_addr_space_t as, unw_word_t addr, unw_word_t *val, int write,
-	    void *arg)
+            void *arg)
 {
   if (write)
     {
@@ -132,7 +127,7 @@ access_mem (unw_addr_space_t as, unw_word_t addr, unw_word_t *val, int write,
 
 static int
 access_reg (unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val,
-	    int write, void *arg)
+            int write, void *arg)
 {
   unw_word_t *addr;
   ucontext_t *uc = arg;
@@ -164,7 +159,7 @@ badreg:
 
 static int
 access_fpreg (unw_addr_space_t as, unw_regnum_t reg, unw_fpreg_t *val,
-	      int write, void *arg)
+              int write, void *arg)
 {
   ucontext_t *uc = arg;
   unw_fpreg_t *addr;
@@ -196,8 +191,8 @@ badreg:
 
 static int
 get_static_proc_name (unw_addr_space_t as, unw_word_t ip,
-		      char *buf, size_t buf_len, unw_word_t *offp,
-		      void *arg)
+                      char *buf, size_t buf_len, unw_word_t *offp,
+                      void *arg)
 {
   return _Uelf32_get_proc_name (as, getpid (), ip, buf, buf_len, offp);
 }
diff --git a/frysk-imports/libunwind/src/ppc32/Gregs.c b/frysk-imports/libunwind/src/ppc32/Gregs.c
index 92be321..9344455 100644
--- a/frysk-imports/libunwind/src/ppc32/Gregs.c
+++ b/frysk-imports/libunwind/src/ppc32/Gregs.c
@@ -29,7 +29,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 HIDDEN int
 tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
-		 int write)
+                 int write)
 {
   struct dwarf_loc loc;
 
@@ -37,19 +37,19 @@ tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
     {
     case UNW_TDEP_IP:
       if (write)
-	{
-	  c->dwarf.ip = *valp;	/* update the IP cache */
-	  if (c->dwarf.pi_valid && (*valp < c->dwarf.pi.start_ip
-				    || *valp >= c->dwarf.pi.end_ip))
-	    c->dwarf.pi_valid = 0;	/* new IP outside of current proc */
-	}
+        {
+          c->dwarf.ip = *valp;  /* update the IP cache */
+          if (c->dwarf.pi_valid && (*valp < c->dwarf.pi.start_ip
+                                    || *valp >= c->dwarf.pi.end_ip))
+            c->dwarf.pi_valid = 0;      /* new IP outside of current proc */
+        }
       else
-	*valp = c->dwarf.ip;
+        *valp = c->dwarf.ip;
       return 0;
 
     case UNW_TDEP_SP:
       if (write)
-	return -UNW_EREADONLYREG;
+        return -UNW_EREADONLYREG;
       *valp = c->dwarf.cfa;
       return 0;
 
@@ -72,7 +72,7 @@ tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
 
 HIDDEN int
 tdep_access_fpreg (struct cursor *c, unw_regnum_t reg, unw_fpreg_t *valp,
-		   int write)
+                   int write)
 {
   struct dwarf_loc loc;
 
diff --git a/frysk-imports/libunwind/src/ppc32/Gresume.c b/frysk-imports/libunwind/src/ppc32/Gresume.c
index 5446c98..955d061 100644
--- a/frysk-imports/libunwind/src/ppc32/Gresume.c
+++ b/frysk-imports/libunwind/src/ppc32/Gresume.c
@@ -73,5 +73,5 @@ unw_resume (unw_cursor_t *cursor)
     return ret;
 
   return (*c->dwarf.as->acc.resume) (c->dwarf.as, (unw_cursor_t *) c,
-				     c->dwarf.as_arg);
+                                     c->dwarf.as_arg);
 }
diff --git a/frysk-imports/libunwind/src/ppc32/Gstep.c b/frysk-imports/libunwind/src/ppc32/Gstep.c
index d146e82..8506a61 100644
--- a/frysk-imports/libunwind/src/ppc32/Gstep.c
+++ b/frysk-imports/libunwind/src/ppc32/Gstep.c
@@ -80,48 +80,48 @@ unw_step (unw_cursor_t * cursor)
   if (unlikely (ret < 0))
     {
       if (likely (!unw_is_signal_frame (cursor)))
-	{
-	  /* DWARF unwinding failed.  As of 09/26/2006, gcc in 64-bit mode
-	     produces the mandatory level of traceback record in the code, but
-	     I get the impression that this is transitory, that eventually gcc
-	     will not produce any traceback records at all.  So, for now, we
-	     won't bother to try to find and use these records.
-
-	     We can, however, attempt to unwind the frame by using the callback
-	     chain.  This is very crude, however, and won't be able to unwind
-	     any registers besides the IP, SP, and LR . */
-
-	  back_chain_offset = ((void *) &dummy.back_chain - (void *) &dummy);
-	  lr_save_offset = ((void *) &dummy.lr_save - (void *) &dummy);
-
-	  back_chain_loc = DWARF_LOC (c->dwarf.cfa + back_chain_offset, 0);
-
-	  if ((ret =
-	       dwarf_get (&c->dwarf, back_chain_loc, &c->dwarf.cfa)) < 0)
-	    {
-	      Debug
-		("Unable to retrieve CFA from back chain in stack frame - %d\n",
-		 ret);
-	      return ret;
-	    }
-	  if (c->dwarf.cfa == 0)
-	    /* Unless the cursor or stack is corrupt or uninitialized we've most
-	       likely hit the top of the stack */
-	    return 0;
-
-	  lr_save_loc = DWARF_LOC (c->dwarf.cfa + lr_save_offset, 0);
-
-	  if ((ret = dwarf_get (&c->dwarf, lr_save_loc, &c->dwarf.ip)) < 0)
-	    {
-	      Debug
-		("Unable to retrieve IP from lr save in stack frame - %d\n",
-		 ret);
-	      return ret;
-	    }
-	  ret = 1;
-	}
+        {
+          /* DWARF unwinding failed.  As of 09/26/2006, gcc in 64-bit mode
+             produces the mandatory level of traceback record in the code, but
+             I get the impression that this is transitory, that eventually gcc
+             will not produce any traceback records at all.  So, for now, we
+             won't bother to try to find and use these records.
+
+             We can, however, attempt to unwind the frame by using the callback
+             chain.  This is very crude, however, and won't be able to unwind
+             any registers besides the IP, SP, and LR . */
+
+          back_chain_offset = ((void *) &dummy.back_chain - (void *) &dummy);
+          lr_save_offset = ((void *) &dummy.lr_save - (void *) &dummy);
+
+          back_chain_loc = DWARF_LOC (c->dwarf.cfa + back_chain_offset, 0);
+
+          if ((ret =
+               dwarf_get (&c->dwarf, back_chain_loc, &c->dwarf.cfa)) < 0)
+            {
+              Debug (2,
+                 "Unable to retrieve CFA from back chain in stack frame - %d\n",
+                 ret);
+              return ret;
+            }
+          if (c->dwarf.cfa == 0)
+            /* Unless the cursor or stack is corrupt or uninitialized we've most
+               likely hit the top of the stack */
+            return 0;
+
+          lr_save_loc = DWARF_LOC (c->dwarf.cfa + lr_save_offset, 0);
+
+          if ((ret = dwarf_get (&c->dwarf, lr_save_loc, &c->dwarf.ip)) < 0)
+            {
+              Debug (2,
+                 "Unable to retrieve IP from lr save in stack frame - %d\n",
+                 ret);
+              return ret;
+            }
+          ret = 1;
+        }
       else
-	{
+        {
           /* Find the sigcontext record by taking the CFA and adjusting by
              the dummy signal frame size.
 
@@ -132,178 +132,178 @@ unw_step (unw_cursor_t * cursor)
              following code will likely cause a seg fault or other crash
              condition.  */
 
-	  unw_word_t ucontext = c->dwarf.cfa + __SIGNAL_FRAMESIZE;
-
-	  Debug (1, "signal frame, skip over trampoline\n");
-
-	  c->sigcontext_format = PPC_SCF_LINUX_RT_SIGFRAME;
-	  c->sigcontext_addr = ucontext;
-
-	  sp_loc = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R1, 0);
-	  ip_loc = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_LINK, 0);
-
-	  ret = dwarf_get (&c->dwarf, sp_loc, &c->dwarf.cfa);
-	  if (ret < 0)
-	    {
-	      Debug (2, "returning %d\n", ret);
-	      return ret;
-	    }
-	  ret = dwarf_get (&c->dwarf, ip_loc, &c->dwarf.ip);
-	  if (ret < 0)
-	    {
-	      Debug (2, "returning %d\n", ret);
-	      return ret;
-	    }
-
-	  /* Instead of just restoring the non-volatile registers, do all
-	     of the registers for now.  This will incur a performance hit,
-	     but it's rare enough not to cause too much of a problem, and
-	     might be useful in some cases.  */
-	  c->dwarf.loc[UNW_PPC32_R0] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R0, 0);
-	  c->dwarf.loc[UNW_PPC32_R1] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R1, 0);
-	  c->dwarf.loc[UNW_PPC32_R2] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R2, 0);
-	  c->dwarf.loc[UNW_PPC32_R3] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R3, 0);
-	  c->dwarf.loc[UNW_PPC32_R4] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R4, 0);
-	  c->dwarf.loc[UNW_PPC32_R5] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R5, 0);
-	  c->dwarf.loc[UNW_PPC32_R6] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R6, 0);
-	  c->dwarf.loc[UNW_PPC32_R7] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R7, 0);
-	  c->dwarf.loc[UNW_PPC32_R8] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R8, 0);
-	  c->dwarf.loc[UNW_PPC32_R9] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R9, 0);
-	  c->dwarf.loc[UNW_PPC32_R10] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R10, 0);
-	  c->dwarf.loc[UNW_PPC32_R11] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R11, 0);
-	  c->dwarf.loc[UNW_PPC32_R12] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R12, 0);
-	  c->dwarf.loc[UNW_PPC32_R13] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R13, 0);
-	  c->dwarf.loc[UNW_PPC32_R14] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R14, 0);
-	  c->dwarf.loc[UNW_PPC32_R15] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R15, 0);
-	  c->dwarf.loc[UNW_PPC32_R16] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R16, 0);
-	  c->dwarf.loc[UNW_PPC32_R17] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R17, 0);
-	  c->dwarf.loc[UNW_PPC32_R18] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R18, 0);
-	  c->dwarf.loc[UNW_PPC32_R19] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R19, 0);
-	  c->dwarf.loc[UNW_PPC32_R20] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R20, 0);
-	  c->dwarf.loc[UNW_PPC32_R21] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R21, 0);
-	  c->dwarf.loc[UNW_PPC32_R22] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R22, 0);
-	  c->dwarf.loc[UNW_PPC32_R23] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R23, 0);
-	  c->dwarf.loc[UNW_PPC32_R24] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R24, 0);
-	  c->dwarf.loc[UNW_PPC32_R25] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R25, 0);
-	  c->dwarf.loc[UNW_PPC32_R26] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R26, 0);
-	  c->dwarf.loc[UNW_PPC32_R27] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R27, 0);
-	  c->dwarf.loc[UNW_PPC32_R28] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R28, 0);
-	  c->dwarf.loc[UNW_PPC32_R29] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R29, 0);
-	  c->dwarf.loc[UNW_PPC32_R30] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R30, 0);
-	  c->dwarf.loc[UNW_PPC32_R31] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R31, 0);
-
-	  c->dwarf.loc[UNW_PPC32_LR] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_LINK, 0);
-	  c->dwarf.loc[UNW_PPC32_CTR] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_CTR, 0);
-
-	  /* This CR0 assignment is probably wrong.  There are 8 dwarf columns
-	     assigned to the CR registers, but only one CR register in the
-	     mcontext structure */
-	  c->dwarf.loc[UNW_PPC32_CCR] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_CCR, 0);
-	  c->dwarf.loc[UNW_PPC32_XER] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_XER, 0);
-
-	  c->dwarf.loc[UNW_PPC32_F0] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R0, 0);
-	  c->dwarf.loc[UNW_PPC32_F1] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R1, 0);
-	  c->dwarf.loc[UNW_PPC32_F2] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R2, 0);
-	  c->dwarf.loc[UNW_PPC32_F3] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R3, 0);
-	  c->dwarf.loc[UNW_PPC32_F4] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R4, 0);
-	  c->dwarf.loc[UNW_PPC32_F5] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R5, 0);
-	  c->dwarf.loc[UNW_PPC32_F6] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R6, 0);
-	  c->dwarf.loc[UNW_PPC32_F7] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R7, 0);
-	  c->dwarf.loc[UNW_PPC32_F8] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R8, 0);
-	  c->dwarf.loc[UNW_PPC32_F9] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R9, 0);
-	  c->dwarf.loc[UNW_PPC32_F10] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R10, 0);
-	  c->dwarf.loc[UNW_PPC32_F11] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R11, 0);
-	  c->dwarf.loc[UNW_PPC32_F12] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R12, 0);
-	  c->dwarf.loc[UNW_PPC32_F13] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R13, 0);
-	  c->dwarf.loc[UNW_PPC32_F14] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R14, 0);
-	  c->dwarf.loc[UNW_PPC32_F15] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R15, 0);
-	  c->dwarf.loc[UNW_PPC32_F16] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R16, 0);
-	  c->dwarf.loc[UNW_PPC32_F17] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R17, 0);
-	  c->dwarf.loc[UNW_PPC32_F18] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R18, 0);
-	  c->dwarf.loc[UNW_PPC32_F19] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R19, 0);
-	  c->dwarf.loc[UNW_PPC32_F20] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R20, 0);
-	  c->dwarf.loc[UNW_PPC32_F21] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R21, 0);
-	  c->dwarf.loc[UNW_PPC32_F22] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R22, 0);
-	  c->dwarf.loc[UNW_PPC32_F23] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R23, 0);
-	  c->dwarf.loc[UNW_PPC32_F24] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R24, 0);
-	  c->dwarf.loc[UNW_PPC32_F25] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R25, 0);
-	  c->dwarf.loc[UNW_PPC32_F26] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R26, 0);
-	  c->dwarf.loc[UNW_PPC32_F27] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R27, 0);
-	  c->dwarf.loc[UNW_PPC32_F28] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R28, 0);
-	  c->dwarf.loc[UNW_PPC32_F29] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R29, 0);
-	  c->dwarf.loc[UNW_PPC32_F30] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R30, 0);
-	  c->dwarf.loc[UNW_PPC32_F31] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R31, 0);
-
-	  ret = 1;
-	}
+          unw_word_t ucontext = c->dwarf.cfa + __SIGNAL_FRAMESIZE;
+
+          Debug (1, "signal frame, skip over trampoline\n");
+
+          c->sigcontext_format = PPC_SCF_LINUX_RT_SIGFRAME;
+          c->sigcontext_addr = ucontext;
+
+          sp_loc = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R1, 0);
+          ip_loc = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_LINK, 0);
+
+          ret = dwarf_get (&c->dwarf, sp_loc, &c->dwarf.cfa);
+          if (ret < 0)
+            {
+              Debug (2, "returning %d\n", ret);
+              return ret;
+            }
+          ret = dwarf_get (&c->dwarf, ip_loc, &c->dwarf.ip);
+          if (ret < 0)
+            {
+              Debug (2, "returning %d\n", ret);
+              return ret;
+            }
+
+          /* Instead of just restoring the non-volatile registers, do all
+             of the registers for now.  This will incur a performance hit,
+             but it's rare enough not to cause too much of a problem, and
+             might be useful in some cases.  */
+          c->dwarf.loc[UNW_PPC32_R0] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R0, 0);
+          c->dwarf.loc[UNW_PPC32_R1] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R1, 0);
+          c->dwarf.loc[UNW_PPC32_R2] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R2, 0);
+          c->dwarf.loc[UNW_PPC32_R3] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R3, 0);
+          c->dwarf.loc[UNW_PPC32_R4] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R4, 0);
+          c->dwarf.loc[UNW_PPC32_R5] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R5, 0);
+          c->dwarf.loc[UNW_PPC32_R6] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R6, 0);
+          c->dwarf.loc[UNW_PPC32_R7] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R7, 0);
+          c->dwarf.loc[UNW_PPC32_R8] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R8, 0);
+          c->dwarf.loc[UNW_PPC32_R9] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R9, 0);
+          c->dwarf.loc[UNW_PPC32_R10] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R10, 0);
+          c->dwarf.loc[UNW_PPC32_R11] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R11, 0);
+          c->dwarf.loc[UNW_PPC32_R12] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R12, 0);
+          c->dwarf.loc[UNW_PPC32_R13] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R13, 0);
+          c->dwarf.loc[UNW_PPC32_R14] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R14, 0);
+          c->dwarf.loc[UNW_PPC32_R15] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R15, 0);
+          c->dwarf.loc[UNW_PPC32_R16] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R16, 0);
+          c->dwarf.loc[UNW_PPC32_R17] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R17, 0);
+          c->dwarf.loc[UNW_PPC32_R18] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R18, 0);
+          c->dwarf.loc[UNW_PPC32_R19] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R19, 0);
+          c->dwarf.loc[UNW_PPC32_R20] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R20, 0);
+          c->dwarf.loc[UNW_PPC32_R21] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R21, 0);
+          c->dwarf.loc[UNW_PPC32_R22] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R22, 0);
+          c->dwarf.loc[UNW_PPC32_R23] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R23, 0);
+          c->dwarf.loc[UNW_PPC32_R24] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R24, 0);
+          c->dwarf.loc[UNW_PPC32_R25] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R25, 0);
+          c->dwarf.loc[UNW_PPC32_R26] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R26, 0);
+          c->dwarf.loc[UNW_PPC32_R27] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R27, 0);
+          c->dwarf.loc[UNW_PPC32_R28] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R28, 0);
+          c->dwarf.loc[UNW_PPC32_R29] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R29, 0);
+          c->dwarf.loc[UNW_PPC32_R30] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R30, 0);
+          c->dwarf.loc[UNW_PPC32_R31] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R31, 0);
+
+          c->dwarf.loc[UNW_PPC32_LR] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_LINK, 0);
+          c->dwarf.loc[UNW_PPC32_CTR] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_CTR, 0);
+
+          /* This CR0 assignment is probably wrong.  There are 8 dwarf columns
+             assigned to the CR registers, but only one CR register in the
+             mcontext structure */
+          c->dwarf.loc[UNW_PPC32_CCR] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_CCR, 0);
+          c->dwarf.loc[UNW_PPC32_XER] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_XER, 0);
+
+          c->dwarf.loc[UNW_PPC32_F0] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R0, 0);
+          c->dwarf.loc[UNW_PPC32_F1] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R1, 0);
+          c->dwarf.loc[UNW_PPC32_F2] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R2, 0);
+          c->dwarf.loc[UNW_PPC32_F3] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R3, 0);
+          c->dwarf.loc[UNW_PPC32_F4] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R4, 0);
+          c->dwarf.loc[UNW_PPC32_F5] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R5, 0);
+          c->dwarf.loc[UNW_PPC32_F6] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R6, 0);
+          c->dwarf.loc[UNW_PPC32_F7] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R7, 0);
+          c->dwarf.loc[UNW_PPC32_F8] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R8, 0);
+          c->dwarf.loc[UNW_PPC32_F9] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R9, 0);
+          c->dwarf.loc[UNW_PPC32_F10] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R10, 0);
+          c->dwarf.loc[UNW_PPC32_F11] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R11, 0);
+          c->dwarf.loc[UNW_PPC32_F12] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R12, 0);
+          c->dwarf.loc[UNW_PPC32_F13] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R13, 0);
+          c->dwarf.loc[UNW_PPC32_F14] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R14, 0);
+          c->dwarf.loc[UNW_PPC32_F15] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R15, 0);
+          c->dwarf.loc[UNW_PPC32_F16] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R16, 0);
+          c->dwarf.loc[UNW_PPC32_F17] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R17, 0);
+          c->dwarf.loc[UNW_PPC32_F18] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R18, 0);
+          c->dwarf.loc[UNW_PPC32_F19] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R19, 0);
+          c->dwarf.loc[UNW_PPC32_F20] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R20, 0);
+          c->dwarf.loc[UNW_PPC32_F21] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R21, 0);
+          c->dwarf.loc[UNW_PPC32_F22] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R22, 0);
+          c->dwarf.loc[UNW_PPC32_F23] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R23, 0);
+          c->dwarf.loc[UNW_PPC32_F24] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R24, 0);
+          c->dwarf.loc[UNW_PPC32_F25] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R25, 0);
+          c->dwarf.loc[UNW_PPC32_F26] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R26, 0);
+          c->dwarf.loc[UNW_PPC32_F27] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R27, 0);
+          c->dwarf.loc[UNW_PPC32_F28] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R28, 0);
+          c->dwarf.loc[UNW_PPC32_F29] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R29, 0);
+          c->dwarf.loc[UNW_PPC32_F30] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R30, 0);
+          c->dwarf.loc[UNW_PPC32_F31] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R31, 0);
+
+          ret = 1;
+        }
     }
   return ret;
 }
diff --git a/frysk-imports/libunwind/src/ppc32/Lcreate_addr_space.c b/frysk-imports/libunwind/src/ppc32/Lcreate_addr_space.c
new file mode 100644
index 0000000..0f2dc6b
--- /dev/null
+++ b/frysk-imports/libunwind/src/ppc32/Lcreate_addr_space.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Gcreate_addr_space.c"
+#endif
diff --git a/frysk-imports/libunwind/src/ppc32/get_func_addr.c b/frysk-imports/libunwind/src/ppc32/get_func_addr.c
index 14797c9..66ff795 100644
--- a/frysk-imports/libunwind/src/ppc32/get_func_addr.c
+++ b/frysk-imports/libunwind/src/ppc32/get_func_addr.c
@@ -29,7 +29,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 int
 tdep_get_func_addr (unw_addr_space_t as, unw_word_t symbol_val_addr,
-		    unw_word_t *real_func_addr)
+                    unw_word_t *real_func_addr)
 {
   *real_func_addr = symbol_val_addr;
   return 0;
diff --git a/frysk-imports/libunwind/src/ppc32/init.h b/frysk-imports/libunwind/src/ppc32/init.h
index 8badb17..e8bb3ba 100644
--- a/frysk-imports/libunwind/src/ppc32/init.h
+++ b/frysk-imports/libunwind/src/ppc32/init.h
@@ -30,7 +30,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 /* Here is the "common" init, for remote and local debuging" */
 
 static inline int
-common_init_ppc32 (struct cursor *c)
+common_init_ppc32 (struct cursor *c, unsigned use_prev_instr)
 {
   int ret;
   int i;
@@ -53,7 +53,7 @@ common_init_ppc32 (struct cursor *c)
     return ret;
 
   ret = dwarf_get (&c->dwarf, DWARF_REG_LOC (&c->dwarf, UNW_PPC32_R1),
-		   &c->dwarf.cfa);
+                   &c->dwarf.cfa);
   if (ret < 0)
     return ret;
 
@@ -62,6 +62,8 @@ common_init_ppc32 (struct cursor *c)
 
   c->dwarf.args_size = 0;
   c->dwarf.ret_addr_column = 0;
+  c->dwarf.stash_frames = 0;
+  c->dwarf.use_prev_instr = use_prev_instr;
   c->dwarf.pi_valid = 0;
   c->dwarf.pi_is_dynamic = 0;
   c->dwarf.hint = 0;
diff --git a/frysk-imports/libunwind/src/ppc32/ucontext_i.h b/frysk-imports/libunwind/src/ppc32/ucontext_i.h
index b6fb860..c6ba806 100644
--- a/frysk-imports/libunwind/src/ppc32/ucontext_i.h
+++ b/frysk-imports/libunwind/src/ppc32/ucontext_i.h
@@ -26,96 +26,25 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #ifndef ucontext_i_h
 #define ucontext_i_h
 
+#include "compiler.h"
 #include <ucontext.h>
 
-/* FRYSK LOCAL - since we are compiling on different architectures
-   use use local (renamed) definitions from
-http://www.linux-foundation.org/spec/refspecs/LSB_3.0.0/LSB-PPC32/LSB-PPC32.html
-*/
-struct local_pt_regs
-{
-  unsigned long int gpr[32];
-  unsigned long int nip;
-  unsigned long int msr;
-  unsigned long int orig_gpr3;
-  unsigned long int ctr;
-  unsigned long int link;
-  unsigned long int xer;
-  unsigned long int ccr;
-  unsigned long int mq;
-  unsigned long int trap;
-  unsigned long int dar;
-  unsigned long int dsisr;
-  unsigned long int result;
-}
- ;
-typedef struct local_libc_vrstate
-{
-  unsigned int vrregs[128];
-  unsigned int vrsave;
-  unsigned int _pad[2];
-  unsigned int vscr;
-}
-local_vrregset_t __attribute__ ((__aligned__ (16)));
-
-#define NGREG	48
-
-typedef unsigned long int local_gregset_t[48];
-
-typedef struct local_libc_fpstate
-{
-  double fpregs[32];
-  double fpscr;
-  int _pad[2];
-}
-local_fpregset_t;
-
-typedef struct
-{
-  local_gregset_t gregs;
-  local_fpregset_t fpregs;
-  local_vrregset_t vrregs;
-}
-local_mcontext_t;
-
-union local_uc_regs_ptr
-{
-  struct local_pt_regs *regs;
-  local_mcontext_t *uc_regs;
-}
- ;
-
-typedef struct local_ucontext
-{
-  unsigned long int uc_flags;
-  struct ucontext *uc_link;
-  stack_t uc_stack;
-  int uc_pad[7];
-  union local_uc_regs_ptr uc_mcontext;
-  sigset_t uc_sigmask;
-  char uc_reg_space[sizeof (mcontext_t) + 12];
-}
-local_ucontext_t;
-/* END FRYSK LOCAL */
-
-
 /* These values were derived by reading
    /usr/src/linux-2.6.18-1.8/arch/um/include/sysdep-ppc/ptrace.h and
    /usr/src/linux-2.6.18-1.8/arch/powerpc/kernel/ppc32.h
 */
 
-//#define NIP_IDX		32
-#define CTR_IDX		32
-#define XER_IDX		33
-#define CCR_IDX		34
-#define MSR_IDX		35
-//#define MQ_IDX		36
-#define LINK_IDX	36
+//#define NIP_IDX               32
+#define CTR_IDX         32
+#define XER_IDX         33
+#define CCR_IDX         34
+#define MSR_IDX         35
+//#define MQ_IDX                36
+#define LINK_IDX        36
 
 /* These are dummy structures used only for obtaining the offsets of the
    various structure members. */
-static local_ucontext_t dmy_ctxt;
-static local_vrregset_t dmy_vrregset;
+static ucontext_t dmy_ctxt UNUSED;
 
 #define UC_MCONTEXT_GREGS_R0 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[0] - (void *)&dmy_ctxt)
 #define UC_MCONTEXT_GREGS_R1 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[1] - (void *)&dmy_ctxt)
diff --git a/frysk-imports/libunwind/src/ppc32/unwind_i.h b/frysk-imports/libunwind/src/ppc32/unwind_i.h
index c3c3a57..ad32d05 100644
--- a/frysk-imports/libunwind/src/ppc32/unwind_i.h
+++ b/frysk-imports/libunwind/src/ppc32/unwind_i.h
@@ -28,7 +28,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #ifndef unwind_i_h
 #define unwind_i_h
 
-#include <memory.h>
 #include <stdint.h>
 
 #include <libunwind-ppc32.h>
@@ -36,12 +35,12 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #include <libunwind_i.h>
 #include <sys/ucontext.h>
 
-#define ppc32_lock			UNW_OBJ(lock)
-#define ppc32_local_resume		UNW_OBJ(local_resume)
-#define ppc32_local_addr_space_init	UNW_OBJ(local_addr_space_init)
+#define ppc32_lock                      UNW_OBJ(lock)
+#define ppc32_local_resume              UNW_OBJ(local_resume)
+#define ppc32_local_addr_space_init     UNW_OBJ(local_addr_space_init)
 
 extern void ppc32_local_addr_space_init (void);
 extern int ppc32_local_resume (unw_addr_space_t as, unw_cursor_t *cursor,
-			     void *arg);
+                             void *arg);
 
 #endif /* unwind_i_h */
diff --git a/frysk-imports/libunwind/src/ppc64/Gcreate_addr_space.c b/frysk-imports/libunwind/src/ppc64/Gcreate_addr_space.c
index f67c78f..686653a 100644
--- a/frysk-imports/libunwind/src/ppc64/Gcreate_addr_space.c
+++ b/frysk-imports/libunwind/src/ppc64/Gcreate_addr_space.c
@@ -27,7 +27,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 #include <stdlib.h>
 
-#include "unwind_i.h"
+#include <libunwind_i.h>
 
 PROTECTED unw_addr_space_t
 unw_create_addr_space (unw_accessors_t *a, int byte_order)
@@ -35,8 +35,17 @@ unw_create_addr_space (unw_accessors_t *a, int byte_order)
 #ifdef UNW_LOCAL_ONLY
   return NULL;
 #else
-  unw_addr_space_t as = malloc (sizeof (*as));
+  unw_addr_space_t as;
 
+  /*
+   * We support both big- and little-endian on Linux ppc64.
+   */
+  if (byte_order != 0
+      && byte_order != __LITTLE_ENDIAN
+      && byte_order != __BIG_ENDIAN)
+    return NULL;
+
+  as = malloc (sizeof (*as));
   if (!as)
     return NULL;
 
@@ -44,11 +53,19 @@ unw_create_addr_space (unw_accessors_t *a, int byte_order)
 
   as->acc = *a;
 
-  /*
-   * Linux ppc64 supports only big-endian.
-   */
-  if (byte_order != 0 && byte_order != __BIG_ENDIAN)
-    return NULL;
+  if (byte_order == 0)
+    /* use host default: */
+    as->big_endian = (__BYTE_ORDER == __BIG_ENDIAN);
+  else
+    as->big_endian = (byte_order == __BIG_ENDIAN);
+
+  /* FIXME!  There is no way to specify the ABI.
+     Default to ELFv1 on big-endian and ELFv2 on little-endian.  */
+  if (as->big_endian)
+    as->abi = UNW_PPC64_ABI_ELFv1;
+  else
+    as->abi = UNW_PPC64_ABI_ELFv2;
+
   return as;
 #endif
 }
diff --git a/frysk-imports/libunwind/src/ppc64/Gget_proc_info.c b/frysk-imports/libunwind/src/ppc64/Gget_proc_info.c
deleted file mode 100644
index 9bd9af6..0000000
--- a/frysk-imports/libunwind/src/ppc64/Gget_proc_info.c
+++ /dev/null
@@ -1,34 +0,0 @@
-/* libunwind - a platform-independent unwind library
-
-   Copied from src/x86_64/, modified slightly (or made empty stubs) for
-   building frysk successfully on ppc64, by Wu Zhou <woodzltc@cn.ibm.com>
-
-This file is part of libunwind.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
-
-#include "unwind_i.h"
-
-PROTECTED int
-unw_get_proc_info (unw_cursor_t *cursor, unw_proc_info_t *pi)
-{
-  /* XXX: empty stub.  */
-  return 0;
-}
diff --git a/frysk-imports/libunwind/src/ppc64/Gget_save_loc.c b/frysk-imports/libunwind/src/ppc64/Gget_save_loc.c
deleted file mode 100644
index 56d2905..0000000
--- a/frysk-imports/libunwind/src/ppc64/Gget_save_loc.c
+++ /dev/null
@@ -1,34 +0,0 @@
-/* libunwind - a platform-independent unwind library
-
-   Copied from src/x86_64/, modified slightly (or made empty stubs) for
-   building frysk successfully on ppc64, by Wu Zhou <woodzltc@cn.ibm.com>
-
-This file is part of libunwind.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
-
-#include "unwind_i.h"
-
-PROTECTED int
-unw_get_save_loc (unw_cursor_t *cursor, int reg, unw_save_loc_t *sloc)
-{
-  /* XXX: empty stub.  */
-  return 0;
-}
diff --git a/frysk-imports/libunwind/src/ppc64/Gglobal.c b/frysk-imports/libunwind/src/ppc64/Gglobal.c
index 1506b00..9d0b0f5 100644
--- a/frysk-imports/libunwind/src/ppc64/Gglobal.c
+++ b/frysk-imports/libunwind/src/ppc64/Gglobal.c
@@ -28,131 +28,131 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #include "unwind_i.h"
 #include "dwarf_i.h"
 
-HIDDEN pthread_mutex_t ppc64_lock = PTHREAD_MUTEX_INITIALIZER;
-HIDDEN int tdep_needs_initialization = 1;
+HIDDEN define_lock (ppc64_lock);
+HIDDEN int tdep_init_done;
 
 /* The API register numbers are exactly the same as the .eh_frame
    registers, for now at least.  */
-uint8_t dwarf_to_unw_regnum_map[DWARF_REGNUM_MAP_LENGTH] =
+HIDDEN const uint8_t dwarf_to_unw_regnum_map[DWARF_REGNUM_MAP_LENGTH] =
   {
-	[UNW_PPC64_R0]=UNW_PPC64_R0,
-	[UNW_PPC64_R1]=UNW_PPC64_R1,
-	[UNW_PPC64_R2]=UNW_PPC64_R2,
-	[UNW_PPC64_R3]=UNW_PPC64_R3,
-	[UNW_PPC64_R4]=UNW_PPC64_R4,
-	[UNW_PPC64_R5]=UNW_PPC64_R5,
-	[UNW_PPC64_R6]=UNW_PPC64_R6,
-	[UNW_PPC64_R7]=UNW_PPC64_R7,
-	[UNW_PPC64_R8]=UNW_PPC64_R8,
-	[UNW_PPC64_R9]=UNW_PPC64_R9,
-	[UNW_PPC64_R10]=UNW_PPC64_R10,
-	[UNW_PPC64_R11]=UNW_PPC64_R11,
-	[UNW_PPC64_R12]=UNW_PPC64_R12,
-	[UNW_PPC64_R13]=UNW_PPC64_R13,
-	[UNW_PPC64_R14]=UNW_PPC64_R14,
-	[UNW_PPC64_R15]=UNW_PPC64_R15,
-	[UNW_PPC64_R16]=UNW_PPC64_R16,
-	[UNW_PPC64_R17]=UNW_PPC64_R17,
-	[UNW_PPC64_R18]=UNW_PPC64_R18,
-	[UNW_PPC64_R19]=UNW_PPC64_R19,
-	[UNW_PPC64_R20]=UNW_PPC64_R20,
-	[UNW_PPC64_R21]=UNW_PPC64_R21,
-	[UNW_PPC64_R22]=UNW_PPC64_R22,
-	[UNW_PPC64_R23]=UNW_PPC64_R23,
-	[UNW_PPC64_R24]=UNW_PPC64_R24,
-	[UNW_PPC64_R25]=UNW_PPC64_R25,
-	[UNW_PPC64_R26]=UNW_PPC64_R26,
-	[UNW_PPC64_R27]=UNW_PPC64_R27,
-	[UNW_PPC64_R28]=UNW_PPC64_R28,
-	[UNW_PPC64_R29]=UNW_PPC64_R29,
-	[UNW_PPC64_R30]=UNW_PPC64_R30,
-	[UNW_PPC64_R31]=UNW_PPC64_R31,
-
-	[UNW_PPC64_F0]=UNW_PPC64_F0,
-	[UNW_PPC64_F1]=UNW_PPC64_F1,
-	[UNW_PPC64_F2]=UNW_PPC64_F2,
-	[UNW_PPC64_F3]=UNW_PPC64_F3,
-	[UNW_PPC64_F4]=UNW_PPC64_F4,
-	[UNW_PPC64_F5]=UNW_PPC64_F5,
-	[UNW_PPC64_F6]=UNW_PPC64_F6,
-	[UNW_PPC64_F7]=UNW_PPC64_F7,
-	[UNW_PPC64_F8]=UNW_PPC64_F8,
-	[UNW_PPC64_F9]=UNW_PPC64_F9,
-	[UNW_PPC64_F10]=UNW_PPC64_F10,
-	[UNW_PPC64_F11]=UNW_PPC64_F11,
-	[UNW_PPC64_F12]=UNW_PPC64_F12,
-	[UNW_PPC64_F13]=UNW_PPC64_F13,
-	[UNW_PPC64_F14]=UNW_PPC64_F14,
-	[UNW_PPC64_F15]=UNW_PPC64_F15,
-	[UNW_PPC64_F16]=UNW_PPC64_F16,
-	[UNW_PPC64_F17]=UNW_PPC64_F17,
-	[UNW_PPC64_F18]=UNW_PPC64_F18,
-	[UNW_PPC64_F19]=UNW_PPC64_F19,
-	[UNW_PPC64_F20]=UNW_PPC64_F20,
-	[UNW_PPC64_F21]=UNW_PPC64_F21,
-	[UNW_PPC64_F22]=UNW_PPC64_F22,
-	[UNW_PPC64_F23]=UNW_PPC64_F23,
-	[UNW_PPC64_F24]=UNW_PPC64_F24,
-	[UNW_PPC64_F25]=UNW_PPC64_F25,
-	[UNW_PPC64_F26]=UNW_PPC64_F26,
-	[UNW_PPC64_F27]=UNW_PPC64_F27,
-	[UNW_PPC64_F28]=UNW_PPC64_F28,
-	[UNW_PPC64_F29]=UNW_PPC64_F29,
-	[UNW_PPC64_F30]=UNW_PPC64_F30,
-	[UNW_PPC64_F31]=UNW_PPC64_F31,
-
-	[UNW_PPC64_LR]=UNW_PPC64_LR,
-	[UNW_PPC64_CTR]=UNW_PPC64_CTR,
-	[UNW_PPC64_ARG_POINTER]=UNW_PPC64_ARG_POINTER,
-
-	[UNW_PPC64_CR0]=UNW_PPC64_CR0,
-	[UNW_PPC64_CR1]=UNW_PPC64_CR1,
-	[UNW_PPC64_CR2]=UNW_PPC64_CR2,
-	[UNW_PPC64_CR3]=UNW_PPC64_CR3,
-	[UNW_PPC64_CR4]=UNW_PPC64_CR4,
-	[UNW_PPC64_CR5]=UNW_PPC64_CR5,
-	[UNW_PPC64_CR6]=UNW_PPC64_CR6,
-	[UNW_PPC64_CR7]=UNW_PPC64_CR7,
-
-	[UNW_PPC64_XER]=UNW_PPC64_XER,
-
-	[UNW_PPC64_V0]=UNW_PPC64_V0,
-	[UNW_PPC64_V1]=UNW_PPC64_V1,
-	[UNW_PPC64_V2]=UNW_PPC64_V2,
-	[UNW_PPC64_V3]=UNW_PPC64_V3,
-	[UNW_PPC64_V4]=UNW_PPC64_V4,
-	[UNW_PPC64_V5]=UNW_PPC64_V5,
-	[UNW_PPC64_V6]=UNW_PPC64_V6,
-	[UNW_PPC64_V7]=UNW_PPC64_V7,
-	[UNW_PPC64_V8]=UNW_PPC64_V8,
-	[UNW_PPC64_V9]=UNW_PPC64_V9,
-	[UNW_PPC64_V10]=UNW_PPC64_V10,
-	[UNW_PPC64_V11]=UNW_PPC64_V11,
-	[UNW_PPC64_V12]=UNW_PPC64_V12,
-	[UNW_PPC64_V13]=UNW_PPC64_V13,
-	[UNW_PPC64_V14]=UNW_PPC64_V14,
-	[UNW_PPC64_V15]=UNW_PPC64_V15,
-	[UNW_PPC64_V16]=UNW_PPC64_V16,
-	[UNW_PPC64_V17]=UNW_PPC64_V17,
-	[UNW_PPC64_V18]=UNW_PPC64_V18,
-	[UNW_PPC64_V19]=UNW_PPC64_V19,
-	[UNW_PPC64_V20]=UNW_PPC64_V20,
-	[UNW_PPC64_V21]=UNW_PPC64_V21,
-	[UNW_PPC64_V22]=UNW_PPC64_V22,
-	[UNW_PPC64_V23]=UNW_PPC64_V23,
-	[UNW_PPC64_V24]=UNW_PPC64_V24,
-	[UNW_PPC64_V25]=UNW_PPC64_V25,
-	[UNW_PPC64_V26]=UNW_PPC64_V26,
-	[UNW_PPC64_V27]=UNW_PPC64_V27,
-	[UNW_PPC64_V28]=UNW_PPC64_V28,
-	[UNW_PPC64_V29]=UNW_PPC64_V29,
-	[UNW_PPC64_V30]=UNW_PPC64_V30,
-	[UNW_PPC64_V31]=UNW_PPC64_V31,
-
-	[UNW_PPC64_VRSAVE]=UNW_PPC64_VRSAVE,
-	[UNW_PPC64_VSCR]=UNW_PPC64_VSCR,
-	[UNW_PPC64_SPE_ACC]=UNW_PPC64_SPE_ACC,
-	[UNW_PPC64_SPEFSCR]=UNW_PPC64_SPEFSCR,
+        [UNW_PPC64_R0]=UNW_PPC64_R0,
+        [UNW_PPC64_R1]=UNW_PPC64_R1,
+        [UNW_PPC64_R2]=UNW_PPC64_R2,
+        [UNW_PPC64_R3]=UNW_PPC64_R3,
+        [UNW_PPC64_R4]=UNW_PPC64_R4,
+        [UNW_PPC64_R5]=UNW_PPC64_R5,
+        [UNW_PPC64_R6]=UNW_PPC64_R6,
+        [UNW_PPC64_R7]=UNW_PPC64_R7,
+        [UNW_PPC64_R8]=UNW_PPC64_R8,
+        [UNW_PPC64_R9]=UNW_PPC64_R9,
+        [UNW_PPC64_R10]=UNW_PPC64_R10,
+        [UNW_PPC64_R11]=UNW_PPC64_R11,
+        [UNW_PPC64_R12]=UNW_PPC64_R12,
+        [UNW_PPC64_R13]=UNW_PPC64_R13,
+        [UNW_PPC64_R14]=UNW_PPC64_R14,
+        [UNW_PPC64_R15]=UNW_PPC64_R15,
+        [UNW_PPC64_R16]=UNW_PPC64_R16,
+        [UNW_PPC64_R17]=UNW_PPC64_R17,
+        [UNW_PPC64_R18]=UNW_PPC64_R18,
+        [UNW_PPC64_R19]=UNW_PPC64_R19,
+        [UNW_PPC64_R20]=UNW_PPC64_R20,
+        [UNW_PPC64_R21]=UNW_PPC64_R21,
+        [UNW_PPC64_R22]=UNW_PPC64_R22,
+        [UNW_PPC64_R23]=UNW_PPC64_R23,
+        [UNW_PPC64_R24]=UNW_PPC64_R24,
+        [UNW_PPC64_R25]=UNW_PPC64_R25,
+        [UNW_PPC64_R26]=UNW_PPC64_R26,
+        [UNW_PPC64_R27]=UNW_PPC64_R27,
+        [UNW_PPC64_R28]=UNW_PPC64_R28,
+        [UNW_PPC64_R29]=UNW_PPC64_R29,
+        [UNW_PPC64_R30]=UNW_PPC64_R30,
+        [UNW_PPC64_R31]=UNW_PPC64_R31,
+
+        [UNW_PPC64_F0]=UNW_PPC64_F0,
+        [UNW_PPC64_F1]=UNW_PPC64_F1,
+        [UNW_PPC64_F2]=UNW_PPC64_F2,
+        [UNW_PPC64_F3]=UNW_PPC64_F3,
+        [UNW_PPC64_F4]=UNW_PPC64_F4,
+        [UNW_PPC64_F5]=UNW_PPC64_F5,
+        [UNW_PPC64_F6]=UNW_PPC64_F6,
+        [UNW_PPC64_F7]=UNW_PPC64_F7,
+        [UNW_PPC64_F8]=UNW_PPC64_F8,
+        [UNW_PPC64_F9]=UNW_PPC64_F9,
+        [UNW_PPC64_F10]=UNW_PPC64_F10,
+        [UNW_PPC64_F11]=UNW_PPC64_F11,
+        [UNW_PPC64_F12]=UNW_PPC64_F12,
+        [UNW_PPC64_F13]=UNW_PPC64_F13,
+        [UNW_PPC64_F14]=UNW_PPC64_F14,
+        [UNW_PPC64_F15]=UNW_PPC64_F15,
+        [UNW_PPC64_F16]=UNW_PPC64_F16,
+        [UNW_PPC64_F17]=UNW_PPC64_F17,
+        [UNW_PPC64_F18]=UNW_PPC64_F18,
+        [UNW_PPC64_F19]=UNW_PPC64_F19,
+        [UNW_PPC64_F20]=UNW_PPC64_F20,
+        [UNW_PPC64_F21]=UNW_PPC64_F21,
+        [UNW_PPC64_F22]=UNW_PPC64_F22,
+        [UNW_PPC64_F23]=UNW_PPC64_F23,
+        [UNW_PPC64_F24]=UNW_PPC64_F24,
+        [UNW_PPC64_F25]=UNW_PPC64_F25,
+        [UNW_PPC64_F26]=UNW_PPC64_F26,
+        [UNW_PPC64_F27]=UNW_PPC64_F27,
+        [UNW_PPC64_F28]=UNW_PPC64_F28,
+        [UNW_PPC64_F29]=UNW_PPC64_F29,
+        [UNW_PPC64_F30]=UNW_PPC64_F30,
+        [UNW_PPC64_F31]=UNW_PPC64_F31,
+
+        [UNW_PPC64_LR]=UNW_PPC64_LR,
+        [UNW_PPC64_CTR]=UNW_PPC64_CTR,
+        [UNW_PPC64_ARG_POINTER]=UNW_PPC64_ARG_POINTER,
+
+        [UNW_PPC64_CR0]=UNW_PPC64_CR0,
+        [UNW_PPC64_CR1]=UNW_PPC64_CR1,
+        [UNW_PPC64_CR2]=UNW_PPC64_CR2,
+        [UNW_PPC64_CR3]=UNW_PPC64_CR3,
+        [UNW_PPC64_CR4]=UNW_PPC64_CR4,
+        [UNW_PPC64_CR5]=UNW_PPC64_CR5,
+        [UNW_PPC64_CR6]=UNW_PPC64_CR6,
+        [UNW_PPC64_CR7]=UNW_PPC64_CR7,
+
+        [UNW_PPC64_XER]=UNW_PPC64_XER,
+
+        [UNW_PPC64_V0]=UNW_PPC64_V0,
+        [UNW_PPC64_V1]=UNW_PPC64_V1,
+        [UNW_PPC64_V2]=UNW_PPC64_V2,
+        [UNW_PPC64_V3]=UNW_PPC64_V3,
+        [UNW_PPC64_V4]=UNW_PPC64_V4,
+        [UNW_PPC64_V5]=UNW_PPC64_V5,
+        [UNW_PPC64_V6]=UNW_PPC64_V6,
+        [UNW_PPC64_V7]=UNW_PPC64_V7,
+        [UNW_PPC64_V8]=UNW_PPC64_V8,
+        [UNW_PPC64_V9]=UNW_PPC64_V9,
+        [UNW_PPC64_V10]=UNW_PPC64_V10,
+        [UNW_PPC64_V11]=UNW_PPC64_V11,
+        [UNW_PPC64_V12]=UNW_PPC64_V12,
+        [UNW_PPC64_V13]=UNW_PPC64_V13,
+        [UNW_PPC64_V14]=UNW_PPC64_V14,
+        [UNW_PPC64_V15]=UNW_PPC64_V15,
+        [UNW_PPC64_V16]=UNW_PPC64_V16,
+        [UNW_PPC64_V17]=UNW_PPC64_V17,
+        [UNW_PPC64_V18]=UNW_PPC64_V18,
+        [UNW_PPC64_V19]=UNW_PPC64_V19,
+        [UNW_PPC64_V20]=UNW_PPC64_V20,
+        [UNW_PPC64_V21]=UNW_PPC64_V21,
+        [UNW_PPC64_V22]=UNW_PPC64_V22,
+        [UNW_PPC64_V23]=UNW_PPC64_V23,
+        [UNW_PPC64_V24]=UNW_PPC64_V24,
+        [UNW_PPC64_V25]=UNW_PPC64_V25,
+        [UNW_PPC64_V26]=UNW_PPC64_V26,
+        [UNW_PPC64_V27]=UNW_PPC64_V27,
+        [UNW_PPC64_V28]=UNW_PPC64_V28,
+        [UNW_PPC64_V29]=UNW_PPC64_V29,
+        [UNW_PPC64_V30]=UNW_PPC64_V30,
+        [UNW_PPC64_V31]=UNW_PPC64_V31,
+
+        [UNW_PPC64_VRSAVE]=UNW_PPC64_VRSAVE,
+        [UNW_PPC64_VSCR]=UNW_PPC64_VSCR,
+        [UNW_PPC64_SPE_ACC]=UNW_PPC64_SPE_ACC,
+        [UNW_PPC64_SPEFSCR]=UNW_PPC64_SPEFSCR,
   };
 
 HIDDEN void
@@ -162,10 +162,9 @@ tdep_init (void)
 
   sigfillset (&unwi_full_mask);
 
-  sigprocmask (SIG_SETMASK, &unwi_full_mask, &saved_mask);
-  mutex_lock (&ppc64_lock);
+  lock_acquire (&ppc64_lock, saved_mask);
   {
-    if (!tdep_needs_initialization)
+    if (tdep_init_done)
       /* another thread else beat us to it... */
       goto out;
 
@@ -176,9 +175,8 @@ tdep_init (void)
 #ifndef UNW_REMOTE_ONLY
     ppc64_local_addr_space_init ();
 #endif
-    tdep_needs_initialization = 0;	/* signal that we're initialized... */
+    tdep_init_done = 1; /* signal that we're initialized... */
   }
  out:
-  mutex_unlock (&ppc64_lock);
-  sigprocmask (SIG_SETMASK, &saved_mask, NULL);
+  lock_release (&ppc64_lock, saved_mask);
 }
diff --git a/frysk-imports/libunwind/src/ppc64/Ginit.c b/frysk-imports/libunwind/src/ppc64/Ginit.c
index 97c9d78..0740961 100644
--- a/frysk-imports/libunwind/src/ppc64/Ginit.c
+++ b/frysk-imports/libunwind/src/ppc64/Ginit.c
@@ -42,11 +42,6 @@ static struct unw_addr_space local_addr_space;
 
 PROTECTED unw_addr_space_t unw_local_addr_space = &local_addr_space;
 
-
-#define PAGE_SIZE 4096
-#define PAGE_START(a)	((a) & ~(PAGE_SIZE-1))
-
-
 static void *
 uc_addr (ucontext_t *uc, int reg)
 {
@@ -66,25 +61,25 @@ uc_addr (ucontext_t *uc, int reg)
       unsigned gregs_idx;
 
       switch (reg)
-	{
-	case UNW_PPC64_NIP:
-	  gregs_idx = NIP_IDX;
-	  break;
-	case UNW_PPC64_CTR:
-	  gregs_idx = CTR_IDX;
-	  break;
-	case UNW_PPC64_LR:
-	  gregs_idx = LINK_IDX;
-	  break;
-	case UNW_PPC64_XER:
-	  gregs_idx = XER_IDX;
-	  break;
-	case UNW_PPC64_CR0:
-	  gregs_idx = CCR_IDX;
-	  break;
-	default:
-	  return NULL;
-	}
+        {
+        case UNW_PPC64_NIP:
+          gregs_idx = NIP_IDX;
+          break;
+        case UNW_PPC64_CTR:
+          gregs_idx = CTR_IDX;
+          break;
+        case UNW_PPC64_LR:
+          gregs_idx = LINK_IDX;
+          break;
+        case UNW_PPC64_XER:
+          gregs_idx = XER_IDX;
+          break;
+        case UNW_PPC64_CR0:
+          gregs_idx = CCR_IDX;
+          break;
+        default:
+          return NULL;
+        }
       addr = &uc->uc_mcontext.gp_regs[gregs_idx];
     }
   return addr;
@@ -98,7 +93,7 @@ tdep_uc_addr (ucontext_t *uc, int reg)
   return uc_addr (uc, reg);
 }
 
-# endif	/* UNW_LOCAL_ONLY */
+# endif /* UNW_LOCAL_ONLY */
 
 HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
 
@@ -111,7 +106,7 @@ put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
 
 static int
 get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
-			void *arg)
+                        void *arg)
 {
   *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
   return 0;
@@ -119,7 +114,7 @@ get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
 
 static int
 access_mem (unw_addr_space_t as, unw_word_t addr, unw_word_t *val, int write,
-	    void *arg)
+            void *arg)
 {
   if (write)
     {
@@ -136,14 +131,14 @@ access_mem (unw_addr_space_t as, unw_word_t addr, unw_word_t *val, int write,
 
 static int
 access_reg (unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val,
-	    int write, void *arg)
+            int write, void *arg)
 {
   unw_word_t *addr;
   ucontext_t *uc = arg;
 
-  if ((unsigned int) (reg - UNW_PPC64_F0) < 32)
+  if (UNW_PPC64_F0 <= reg && reg <= UNW_PPC64_F31)
     goto badreg;
-  if ((unsigned int) (reg - UNW_PPC64_V0) < 32)
+  if (UNW_PPC64_V0 <= reg && reg <= UNW_PPC64_V31)
     goto badreg;
 
   addr = uc_addr (uc, reg);
@@ -169,12 +164,12 @@ badreg:
 
 static int
 access_fpreg (unw_addr_space_t as, unw_regnum_t reg, unw_fpreg_t *val,
-	      int write, void *arg)
+              int write, void *arg)
 {
   ucontext_t *uc = arg;
   unw_fpreg_t *addr;
 
-  if ((unsigned) (reg - UNW_PPC64_F0) < 0)
+  if ((reg - UNW_PPC64_F0) < 0)
     goto badreg;
 
   if ((unsigned) (reg - UNW_PPC64_V0) >= 32)
@@ -205,8 +200,8 @@ badreg:
 
 static int
 get_static_proc_name (unw_addr_space_t as, unw_word_t ip,
-		      char *buf, size_t buf_len, unw_word_t *offp,
-		      void *arg)
+                      char *buf, size_t buf_len, unw_word_t *offp,
+                      void *arg)
 {
   return _Uelf64_get_proc_name (as, getpid (), ip, buf, buf_len, offp);
 }
@@ -215,6 +210,12 @@ HIDDEN void
 ppc64_local_addr_space_init (void)
 {
   memset (&local_addr_space, 0, sizeof (local_addr_space));
+  local_addr_space.big_endian = (__BYTE_ORDER == __BIG_ENDIAN);
+#if _CALL_ELF == 2
+  local_addr_space.abi = UNW_PPC64_ABI_ELFv2;
+#else
+  local_addr_space.abi = UNW_PPC64_ABI_ELFv1;
+#endif
   local_addr_space.caching_policy = UNW_CACHE_GLOBAL;
   local_addr_space.acc.find_proc_info = dwarf_find_proc_info;
   local_addr_space.acc.put_unwind_info = put_unwind_info;
diff --git a/frysk-imports/libunwind/src/ppc64/Ginit_local.c b/frysk-imports/libunwind/src/ppc64/Ginit_local.c
deleted file mode 100644
index 87cd74d..0000000
--- a/frysk-imports/libunwind/src/ppc64/Ginit_local.c
+++ /dev/null
@@ -1,56 +0,0 @@
-/* libunwind - a platform-independent unwind library
-
-   Copied from src/x86_64/, modified slightly (or made empty stubs) for
-   building frysk successfully on ppc64, by Wu Zhou <woodzltc@cn.ibm.com>
-
-This file is part of libunwind.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
-
-#include "unwind_i.h"
-#include "init.h"
-
-#ifdef UNW_REMOTE_ONLY
-
-PROTECTED int
-unw_init_local (unw_cursor_t *cursor, ucontext_t *uc)
-{
-  /* XXX: empty stub.  */
-  return -UNW_EINVAL;
-}
-
-#else /* !UNW_REMOTE_ONLY */
-
-PROTECTED int
-unw_init_local (unw_cursor_t *cursor, ucontext_t *uc)
-{
-  struct cursor *c = (struct cursor *) cursor;
-
-  if (tdep_needs_initialization)
-    tdep_init ();
-
-  Debug (1, "(cursor=%p)\n", c);
-
-  c->dwarf.as = unw_local_addr_space;
-  c->dwarf.as_arg = uc;
-  return common_init (c);
-}
-
-#endif /* !UNW_REMOTE_ONLY */
diff --git a/frysk-imports/libunwind/src/ppc64/Ginit_remote.c b/frysk-imports/libunwind/src/ppc64/Ginit_remote.c
deleted file mode 100644
index dc98130..0000000
--- a/frysk-imports/libunwind/src/ppc64/Ginit_remote.c
+++ /dev/null
@@ -1,48 +0,0 @@
-/* libunwind - a platform-independent unwind library
-   Copyright (C) 2006-2007 IBM
-   Contributed by
-     Corey Ashford <cjashfor@us.ibm.com>
-     Jose Flavio Aguilar Paulino <jflavio@br.ibm.com> <joseflavio@gmail.com>
-
-This file is part of libunwind.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
-
-#include "init.h"
-#include "unwind_i.h"
-
-PROTECTED int
-unw_init_remote (unw_cursor_t *cursor, unw_addr_space_t as, void *as_arg)
-{
-#ifdef UNW_LOCAL_ONLY
-  return -UNW_EINVAL;
-#else /* !UNW_LOCAL_ONLY */
-  struct cursor *c = (struct cursor *) cursor;
-
-  if (tdep_needs_initialization)
-    tdep_init ();
-
-  Debug (1, "(cursor=%p)\n", c);
-
-  c->dwarf.as = as;
-  c->dwarf.as_arg = as_arg;
-  return common_init (c);
-#endif /* !UNW_LOCAL_ONLY */
-}
diff --git a/frysk-imports/libunwind/src/ppc64/Gis_signal_frame.c b/frysk-imports/libunwind/src/ppc64/Gis_signal_frame.c
deleted file mode 100644
index 2fff7e4..0000000
--- a/frysk-imports/libunwind/src/ppc64/Gis_signal_frame.c
+++ /dev/null
@@ -1,66 +0,0 @@
-/* libunwind - a platform-independent unwind library
-   Copyright (C) 2006-2007 IBM
-   Contributed by
-     Corey Ashford <cjashfor@us.ibm.com>
-     Jose Flavio Aguilar Paulino <jflavio@br.ibm.com> <joseflavio@gmail.com>
-
-This file is part of libunwind.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
-
-#include "unwind_i.h"
-
-PROTECTED int
-unw_is_signal_frame (unw_cursor_t * cursor)
-{
-  struct cursor *c = (struct cursor *) cursor;
-  unw_word_t w0, w1, ip;
-  unw_addr_space_t as;
-  unw_accessors_t *a;
-  void *arg;
-  int ret;
-
-  as = c->dwarf.as;
-  as->validate = 1;		/* Don't trust the ip */
-  arg = c->dwarf.as_arg;
-
-  /* Check if return address points at sigreturn sequence.
-     on ppc64 Linux that is (see libc.so):
-     0x38210080  addi r1, r1, 128  // pop the stack
-     0x380000ac  li r0, 172        // invoke system service 172
-     0x44000002  sc
-   */
-
-  ip = c->dwarf.ip;
-  if (ip == 0)
-    return 0;
-
-  /* Read up two 8-byte words at the IP.  We are only looking at 3
-     consecutive 32-bit words, so the second 8-byte word needs to be
-     shifted right by 32 bits (think big-endian) */
-
-  a = unw_get_accessors (as);
-  if ((ret = (*a->access_mem) (as, ip, &w0, 0, arg)) < 0
-      || (ret = (*a->access_mem) (as, ip + 8, &w1, 0, arg)) < 0)
-    return 0;
-  w1 >>= 32;
-  return (w0 == 0x38210080380000ac && w1 == 0x44000002);
-
-}
diff --git a/frysk-imports/libunwind/src/ppc64/Gregs.c b/frysk-imports/libunwind/src/ppc64/Gregs.c
index b044504..1cb5d9d 100644
--- a/frysk-imports/libunwind/src/ppc64/Gregs.c
+++ b/frysk-imports/libunwind/src/ppc64/Gregs.c
@@ -29,42 +29,83 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 HIDDEN int
 tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
-		 int write)
+                 int write)
 {
   struct dwarf_loc loc;
 
   switch (reg)
     {
+    case UNW_PPC64_R0:
+    case UNW_PPC64_R2:
+    case UNW_PPC64_R3:
+    case UNW_PPC64_R4:
+    case UNW_PPC64_R5:
+    case UNW_PPC64_R6:
+    case UNW_PPC64_R7:
+    case UNW_PPC64_R8:
+    case UNW_PPC64_R9:
+    case UNW_PPC64_R10:
+    case UNW_PPC64_R11:
+    case UNW_PPC64_R12:
+    case UNW_PPC64_R13:
+    case UNW_PPC64_R14:
+    case UNW_PPC64_R15:
+    case UNW_PPC64_R16:
+    case UNW_PPC64_R17:
+    case UNW_PPC64_R18:
+    case UNW_PPC64_R19:
+    case UNW_PPC64_R20:
+    case UNW_PPC64_R21:
+    case UNW_PPC64_R22:
+    case UNW_PPC64_R23:
+    case UNW_PPC64_R24:
+    case UNW_PPC64_R25:
+    case UNW_PPC64_R26:
+    case UNW_PPC64_R27:
+    case UNW_PPC64_R28:
+    case UNW_PPC64_R29:
+    case UNW_PPC64_R30:
+    case UNW_PPC64_R31:
+    case UNW_PPC64_LR:
+    case UNW_PPC64_CTR:
+    case UNW_PPC64_CR0:
+    case UNW_PPC64_CR1:
+    case UNW_PPC64_CR2:
+    case UNW_PPC64_CR3:
+    case UNW_PPC64_CR4:
+    case UNW_PPC64_CR5:
+    case UNW_PPC64_CR6:
+    case UNW_PPC64_CR7:
+    case UNW_PPC64_VRSAVE:
+    case UNW_PPC64_VSCR:
+    case UNW_PPC64_SPE_ACC:
+    case UNW_PPC64_SPEFSCR:
+      loc = c->dwarf.loc[reg];
+      break;
+
     case UNW_TDEP_IP:
       if (write)
-	{
-	  c->dwarf.ip = *valp;	/* update the IP cache */
-	  if (c->dwarf.pi_valid && (*valp < c->dwarf.pi.start_ip
-				    || *valp >= c->dwarf.pi.end_ip))
-	    c->dwarf.pi_valid = 0;	/* new IP outside of current proc */
-	}
+        {
+          c->dwarf.ip = *valp;  /* update the IP cache */
+          if (c->dwarf.pi_valid && (*valp < c->dwarf.pi.start_ip
+                                    || *valp >= c->dwarf.pi.end_ip))
+            c->dwarf.pi_valid = 0;      /* new IP outside of current proc */
+        }
       else
-	*valp = c->dwarf.ip;
+        *valp = c->dwarf.ip;
       return 0;
 
     case UNW_TDEP_SP:
       if (write)
-	return -UNW_EREADONLYREG;
+        return -UNW_EREADONLYREG;
       *valp = c->dwarf.cfa;
       return 0;
 
-
     default:
+      return -UNW_EBADREG;
       break;
     }
 
-  /* make sure it's not an FP or VR register */
-  if ((((unsigned) (reg - UNW_PPC64_F0)) <= 31) ||
-      (((unsigned) (reg - UNW_PPC64_V0)) <= 31))
-    return -UNW_EBADREG;
-
-  loc = c->dwarf.loc[reg];
-
   if (write)
     return dwarf_put (&c->dwarf, loc, *valp);
   else
@@ -73,7 +114,7 @@ tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
 
 HIDDEN int
 tdep_access_fpreg (struct cursor *c, unw_regnum_t reg, unw_fpreg_t *valp,
-		   int write)
+                   int write)
 {
   struct dwarf_loc loc;
 
diff --git a/frysk-imports/libunwind/src/ppc64/Gresume.c b/frysk-imports/libunwind/src/ppc64/Gresume.c
index 893ea63..3f850e9 100644
--- a/frysk-imports/libunwind/src/ppc64/Gresume.c
+++ b/frysk-imports/libunwind/src/ppc64/Gresume.c
@@ -45,7 +45,20 @@ my_rt_sigreturn (void *new_sp)
 HIDDEN inline int
 ppc64_local_resume (unw_addr_space_t as, unw_cursor_t *cursor, void *arg)
 {
-  /* XXX: empty stub.  */
+  struct cursor *c = (struct cursor *) cursor;
+  ucontext_t *uc = (ucontext_t *)c->dwarf.as_arg;
+
+  if (unlikely (c->sigcontext_format != PPC_SCF_NONE))
+    {
+      my_rt_sigreturn(cursor);
+      abort();
+    }
+  else
+    {
+      Debug (8, "resuming at ip=%llx via setcontext()\n",
+            (unsigned long long) c->dwarf.ip);
+      setcontext (uc);
+    }
   return -UNW_EINVAL;
 }
 
@@ -57,7 +70,28 @@ ppc64_local_resume (unw_addr_space_t as, unw_cursor_t *cursor, void *arg)
 static inline int
 establish_machine_state (struct cursor *c)
 {
-  /* XXX: empty stub.  */
+  unw_addr_space_t as = c->dwarf.as;
+  void *arg = c->dwarf.as_arg;
+  unw_fpreg_t fpval;
+  unw_word_t val;
+  int reg;
+
+  Debug (8, "copying out cursor state\n");
+
+  for (reg = 0; reg <= UNW_REG_LAST; ++reg)
+    {
+      Debug (16, "copying %s %d\n", unw_regname (reg), reg);
+      if (unw_is_fpreg (reg))
+        {
+          if (tdep_access_fpreg (c, reg, &fpval, 0) >= 0)
+            as->acc.access_fpreg (as, reg, &fpval, 1, arg);
+        }
+      else
+        {
+          if (tdep_access_reg (c, reg, &val, 0) >= 0)
+            as->acc.access_reg (as, reg, &val, 1, arg);
+        }
+    }
   return 0;
 }
 
@@ -73,5 +107,5 @@ unw_resume (unw_cursor_t *cursor)
     return ret;
 
   return (*c->dwarf.as->acc.resume) (c->dwarf.as, (unw_cursor_t *) c,
-				     c->dwarf.as_arg);
+                                     c->dwarf.as_arg);
 }
diff --git a/frysk-imports/libunwind/src/ppc64/Gstep.c b/frysk-imports/libunwind/src/ppc64/Gstep.c
index 20b22b5..318beee 100644
--- a/frysk-imports/libunwind/src/ppc64/Gstep.c
+++ b/frysk-imports/libunwind/src/ppc64/Gstep.c
@@ -27,6 +27,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 #include "unwind_i.h"
 #include "ucontext_i.h"
+#include "remote.h"
 #include <signal.h>
 
 /* This definition originates in /usr/include/asm-ppc64/ptrace.h, but is
@@ -57,17 +58,10 @@ unw_step (unw_cursor_t * cursor)
   stack_frame_t dummy;
   unw_word_t back_chain_offset, lr_save_offset, v_regs_ptr;
   struct dwarf_loc back_chain_loc, lr_save_loc, sp_loc, ip_loc, v_regs_loc;
-  int ret;
+  int ret, i;
 
   Debug (1, "(cursor=%p, ip=0x%016lx)\n", c, (unsigned long) c->dwarf.ip);
 
-  if (c->dwarf.ip == 0)
-    {
-      /* Unless the cursor or stack is corrupt or uninitialized,
-         we've most likely hit the top of the stack */
-      return 0;
-    }
-
   /* Try DWARF-based unwinding... */
 
   ret = dwarf_step (&c->dwarf);
@@ -81,48 +75,53 @@ unw_step (unw_cursor_t * cursor)
   if (unlikely (ret < 0))
     {
       if (likely (!unw_is_signal_frame (cursor)))
-	{
-	  /* DWARF unwinding failed.  As of 09/26/2006, gcc in 64-bit mode
-	     produces the mandatory level of traceback record in the code, but
-	     I get the impression that this is transitory, that eventually gcc
-	     will not produce any traceback records at all.  So, for now, we
-	     won't bother to try to find and use these records.
-
-	     We can, however, attempt to unwind the frame by using the callback
-	     chain.  This is very crude, however, and won't be able to unwind
-	     any registers besides the IP, SP, and LR . */
-
-	  back_chain_offset = ((void *) &dummy.back_chain - (void *) &dummy);
-	  lr_save_offset = ((void *) &dummy.lr_save - (void *) &dummy);
-
-	  back_chain_loc = DWARF_LOC (c->dwarf.cfa + back_chain_offset, 0);
-
-	  if ((ret =
-	       dwarf_get (&c->dwarf, back_chain_loc, &c->dwarf.cfa)) < 0)
-	    {
-	      Debug
-		("Unable to retrieve CFA from back chain in stack frame - %d\n",
-		 ret);
-	      return ret;
-	    }
-	  if (c->dwarf.cfa == 0)
-	    /* Unless the cursor or stack is corrupt or uninitialized we've most
-	       likely hit the top of the stack */
-	    return 0;
-
-	  lr_save_loc = DWARF_LOC (c->dwarf.cfa + lr_save_offset, 0);
-
-	  if ((ret = dwarf_get (&c->dwarf, lr_save_loc, &c->dwarf.ip)) < 0)
-	    {
-	      Debug
-		("Unable to retrieve IP from lr save in stack frame - %d\n",
-		 ret);
-	      return ret;
-	    }
-	  ret = 1;
-	}
+        {
+          /* DWARF unwinding failed.  As of 09/26/2006, gcc in 64-bit mode
+             produces the mandatory level of traceback record in the code, but
+             I get the impression that this is transitory, that eventually gcc
+             will not produce any traceback records at all.  So, for now, we
+             won't bother to try to find and use these records.
+
+             We can, however, attempt to unwind the frame by using the callback
+             chain.  This is very crude, however, and won't be able to unwind
+             any registers besides the IP, SP, and LR . */
+
+          back_chain_offset = ((void *) &dummy.back_chain - (void *) &dummy);
+          lr_save_offset = ((void *) &dummy.lr_save - (void *) &dummy);
+
+          back_chain_loc = DWARF_LOC (c->dwarf.cfa + back_chain_offset, 0);
+
+          if ((ret =
+               dwarf_get (&c->dwarf, back_chain_loc, &c->dwarf.cfa)) < 0)
+            {
+              Debug (2,
+                 "Unable to retrieve CFA from back chain in stack frame - %d\n",
+                 ret);
+              return ret;
+            }
+          if (c->dwarf.cfa == 0)
+            /* Unless the cursor or stack is corrupt or uninitialized we've most
+               likely hit the top of the stack */
+            return 0;
+
+          lr_save_loc = DWARF_LOC (c->dwarf.cfa + lr_save_offset, 0);
+
+          if ((ret = dwarf_get (&c->dwarf, lr_save_loc, &c->dwarf.ip)) < 0)
+            {
+              Debug (2,
+                 "Unable to retrieve IP from lr save in stack frame - %d\n",
+                 ret);
+              return ret;
+            }
+
+          /* Mark all registers unsaved */
+          for (i = 0; i < DWARF_NUM_PRESERVED_REGS; ++i)
+            c->dwarf.loc[i] = DWARF_NULL_LOC;
+
+          ret = 1;
+        }
       else
-	{
+        {
           /* Find the sigcontext record by taking the CFA and adjusting by
              the dummy signal frame size.
 
@@ -133,304 +132,335 @@ unw_step (unw_cursor_t * cursor)
              following code will likely cause a seg fault or other crash
              condition.  */
 
-	  unw_word_t ucontext = c->dwarf.cfa + __SIGNAL_FRAMESIZE;
-
-	  Debug (1, "signal frame, skip over trampoline\n");
-
-	  c->sigcontext_format = PPC_SCF_LINUX_RT_SIGFRAME;
-	  c->sigcontext_addr = ucontext;
-
-	  sp_loc = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R1, 0);
-	  ip_loc = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_NIP, 0);
-
-	  ret = dwarf_get (&c->dwarf, sp_loc, &c->dwarf.cfa);
-	  if (ret < 0)
-	    {
-	      Debug (2, "returning %d\n", ret);
-	      return ret;
-	    }
-	  ret = dwarf_get (&c->dwarf, ip_loc, &c->dwarf.ip);
-	  if (ret < 0)
-	    {
-	      Debug (2, "returning %d\n", ret);
-	      return ret;
-	    }
-
-	  /* Instead of just restoring the non-volatile registers, do all
-	     of the registers for now.  This will incur a performance hit,
-	     but it's rare enough not to cause too much of a problem, and
-	     might be useful in some cases.  */
-	  c->dwarf.loc[UNW_PPC64_R0] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R0, 0);
-	  c->dwarf.loc[UNW_PPC64_R1] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R1, 0);
-	  c->dwarf.loc[UNW_PPC64_R2] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R2, 0);
-	  c->dwarf.loc[UNW_PPC64_R3] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R3, 0);
-	  c->dwarf.loc[UNW_PPC64_R4] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R4, 0);
-	  c->dwarf.loc[UNW_PPC64_R5] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R5, 0);
-	  c->dwarf.loc[UNW_PPC64_R6] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R6, 0);
-	  c->dwarf.loc[UNW_PPC64_R7] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R7, 0);
-	  c->dwarf.loc[UNW_PPC64_R8] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R8, 0);
-	  c->dwarf.loc[UNW_PPC64_R9] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R9, 0);
-	  c->dwarf.loc[UNW_PPC64_R10] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R10, 0);
-	  c->dwarf.loc[UNW_PPC64_R11] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R11, 0);
-	  c->dwarf.loc[UNW_PPC64_R12] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R12, 0);
-	  c->dwarf.loc[UNW_PPC64_R13] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R13, 0);
-	  c->dwarf.loc[UNW_PPC64_R14] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R14, 0);
-	  c->dwarf.loc[UNW_PPC64_R15] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R15, 0);
-	  c->dwarf.loc[UNW_PPC64_R16] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R16, 0);
-	  c->dwarf.loc[UNW_PPC64_R17] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R17, 0);
-	  c->dwarf.loc[UNW_PPC64_R18] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R18, 0);
-	  c->dwarf.loc[UNW_PPC64_R19] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R19, 0);
-	  c->dwarf.loc[UNW_PPC64_R20] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R20, 0);
-	  c->dwarf.loc[UNW_PPC64_R21] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R21, 0);
-	  c->dwarf.loc[UNW_PPC64_R22] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R22, 0);
-	  c->dwarf.loc[UNW_PPC64_R23] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R23, 0);
-	  c->dwarf.loc[UNW_PPC64_R24] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R24, 0);
-	  c->dwarf.loc[UNW_PPC64_R25] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R25, 0);
-	  c->dwarf.loc[UNW_PPC64_R26] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R26, 0);
-	  c->dwarf.loc[UNW_PPC64_R27] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R27, 0);
-	  c->dwarf.loc[UNW_PPC64_R28] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R28, 0);
-	  c->dwarf.loc[UNW_PPC64_R29] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R29, 0);
-	  c->dwarf.loc[UNW_PPC64_R30] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R30, 0);
-	  c->dwarf.loc[UNW_PPC64_R31] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R31, 0);
-
-	  c->dwarf.loc[UNW_PPC64_LR] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_LINK, 0);
-	  c->dwarf.loc[UNW_PPC64_CTR] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_CTR, 0);
-	  /* This CR0 assignment is probably wrong.  There are 8 dwarf columns
-	     assigned to the CR registers, but only one CR register in the
-	     mcontext structure */
-	  c->dwarf.loc[UNW_PPC64_CR0] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_CCR, 0);
-	  c->dwarf.loc[UNW_PPC64_XER] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_XER, 0);
-	  c->dwarf.loc[UNW_PPC64_NIP] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_NIP, 0);
-
-	  /* TODO: Is there a way of obtaining the value of the
-	     pseudo frame pointer (which is sp + some fixed offset, I
-	     assume), based on the contents of the ucontext record
-	     structure?  For now, set this loc to null. */
-	  c->dwarf.loc[UNW_PPC64_FRAME_POINTER] = DWARF_NULL_LOC;
-
-	  c->dwarf.loc[UNW_PPC64_F0] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R0, 0);
-	  c->dwarf.loc[UNW_PPC64_F1] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R1, 0);
-	  c->dwarf.loc[UNW_PPC64_F2] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R2, 0);
-	  c->dwarf.loc[UNW_PPC64_F3] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R3, 0);
-	  c->dwarf.loc[UNW_PPC64_F4] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R4, 0);
-	  c->dwarf.loc[UNW_PPC64_F5] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R5, 0);
-	  c->dwarf.loc[UNW_PPC64_F6] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R6, 0);
-	  c->dwarf.loc[UNW_PPC64_F7] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R7, 0);
-	  c->dwarf.loc[UNW_PPC64_F8] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R8, 0);
-	  c->dwarf.loc[UNW_PPC64_F9] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R9, 0);
-	  c->dwarf.loc[UNW_PPC64_F10] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R10, 0);
-	  c->dwarf.loc[UNW_PPC64_F11] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R11, 0);
-	  c->dwarf.loc[UNW_PPC64_F12] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R12, 0);
-	  c->dwarf.loc[UNW_PPC64_F13] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R13, 0);
-	  c->dwarf.loc[UNW_PPC64_F14] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R14, 0);
-	  c->dwarf.loc[UNW_PPC64_F15] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R15, 0);
-	  c->dwarf.loc[UNW_PPC64_F16] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R16, 0);
-	  c->dwarf.loc[UNW_PPC64_F17] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R17, 0);
-	  c->dwarf.loc[UNW_PPC64_F18] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R18, 0);
-	  c->dwarf.loc[UNW_PPC64_F19] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R19, 0);
-	  c->dwarf.loc[UNW_PPC64_F20] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R20, 0);
-	  c->dwarf.loc[UNW_PPC64_F21] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R21, 0);
-	  c->dwarf.loc[UNW_PPC64_F22] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R22, 0);
-	  c->dwarf.loc[UNW_PPC64_F23] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R23, 0);
-	  c->dwarf.loc[UNW_PPC64_F24] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R24, 0);
-	  c->dwarf.loc[UNW_PPC64_F25] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R25, 0);
-	  c->dwarf.loc[UNW_PPC64_F26] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R26, 0);
-	  c->dwarf.loc[UNW_PPC64_F27] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R27, 0);
-	  c->dwarf.loc[UNW_PPC64_F28] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R28, 0);
-	  c->dwarf.loc[UNW_PPC64_F29] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R29, 0);
-	  c->dwarf.loc[UNW_PPC64_F30] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R30, 0);
-	  c->dwarf.loc[UNW_PPC64_F31] =
-	    DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R31, 0);
-	  /* Note that there is no .eh_section register column for the
-	     FPSCR register.  I don't know why this is.  */
-
-	  v_regs_loc = DWARF_LOC (ucontext + UC_MCONTEXT_V_REGS, 0);
-	  ret = dwarf_get (&c->dwarf, v_regs_loc, &v_regs_ptr);
-	  if (ret < 0)
-	    {
-	      Debug (2, "returning %d\n", ret);
-	      return ret;
-	    }
-	  if (v_regs_ptr != 0)
-	    {
-	      /* The v_regs_ptr is not null.  Set all of the AltiVec locs */
-
-	      c->dwarf.loc[UNW_PPC64_V0] =
-		DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R0, 0);
-	      c->dwarf.loc[UNW_PPC64_V1] =
-		DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R1, 0);
-	      c->dwarf.loc[UNW_PPC64_V2] =
-		DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R2, 0);
-	      c->dwarf.loc[UNW_PPC64_V3] =
-		DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R3, 0);
-	      c->dwarf.loc[UNW_PPC64_V4] =
-		DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R4, 0);
-	      c->dwarf.loc[UNW_PPC64_V5] =
-		DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R5, 0);
-	      c->dwarf.loc[UNW_PPC64_V6] =
-		DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R6, 0);
-	      c->dwarf.loc[UNW_PPC64_V7] =
-		DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R7, 0);
-	      c->dwarf.loc[UNW_PPC64_V8] =
-		DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R8, 0);
-	      c->dwarf.loc[UNW_PPC64_V9] =
-		DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R9, 0);
-	      c->dwarf.loc[UNW_PPC64_V10] =
-		DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R10, 0);
-	      c->dwarf.loc[UNW_PPC64_V11] =
-		DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R11, 0);
-	      c->dwarf.loc[UNW_PPC64_V12] =
-		DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R12, 0);
-	      c->dwarf.loc[UNW_PPC64_V13] =
-		DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R13, 0);
-	      c->dwarf.loc[UNW_PPC64_V14] =
-		DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R14, 0);
-	      c->dwarf.loc[UNW_PPC64_V15] =
-		DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R15, 0);
-	      c->dwarf.loc[UNW_PPC64_V16] =
-		DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R16, 0);
-	      c->dwarf.loc[UNW_PPC64_V17] =
-		DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R17, 0);
-	      c->dwarf.loc[UNW_PPC64_V18] =
-		DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R18, 0);
-	      c->dwarf.loc[UNW_PPC64_V19] =
-		DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R19, 0);
-	      c->dwarf.loc[UNW_PPC64_V20] =
-		DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R20, 0);
-	      c->dwarf.loc[UNW_PPC64_V21] =
-		DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R21, 0);
-	      c->dwarf.loc[UNW_PPC64_V22] =
-		DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R22, 0);
-	      c->dwarf.loc[UNW_PPC64_V23] =
-		DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R23, 0);
-	      c->dwarf.loc[UNW_PPC64_V24] =
-		DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R24, 0);
-	      c->dwarf.loc[UNW_PPC64_V25] =
-		DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R25, 0);
-	      c->dwarf.loc[UNW_PPC64_V26] =
-		DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R26, 0);
-	      c->dwarf.loc[UNW_PPC64_V27] =
-		DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R27, 0);
-	      c->dwarf.loc[UNW_PPC64_V28] =
-		DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R28, 0);
-	      c->dwarf.loc[UNW_PPC64_V29] =
-		DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R29, 0);
-	      c->dwarf.loc[UNW_PPC64_V30] =
-		DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R30, 0);
-	      c->dwarf.loc[UNW_PPC64_V31] =
-		DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R31, 0);
-	      c->dwarf.loc[UNW_PPC64_VRSAVE] =
-		DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_VRSAVE, 0);
-	      c->dwarf.loc[UNW_PPC64_VSCR] =
-		DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_VSCR, 0);
-	    }
-	  else
-	    {
-	      c->dwarf.loc[UNW_PPC64_V0] = DWARF_NULL_LOC;
-	      c->dwarf.loc[UNW_PPC64_V1] = DWARF_NULL_LOC;
-	      c->dwarf.loc[UNW_PPC64_V2] = DWARF_NULL_LOC;
-	      c->dwarf.loc[UNW_PPC64_V3] = DWARF_NULL_LOC;
-	      c->dwarf.loc[UNW_PPC64_V4] = DWARF_NULL_LOC;
-	      c->dwarf.loc[UNW_PPC64_V5] = DWARF_NULL_LOC;
-	      c->dwarf.loc[UNW_PPC64_V6] = DWARF_NULL_LOC;
-	      c->dwarf.loc[UNW_PPC64_V7] = DWARF_NULL_LOC;
-	      c->dwarf.loc[UNW_PPC64_V8] = DWARF_NULL_LOC;
-	      c->dwarf.loc[UNW_PPC64_V9] = DWARF_NULL_LOC;
-	      c->dwarf.loc[UNW_PPC64_V10] = DWARF_NULL_LOC;
-	      c->dwarf.loc[UNW_PPC64_V11] = DWARF_NULL_LOC;
-	      c->dwarf.loc[UNW_PPC64_V12] = DWARF_NULL_LOC;
-	      c->dwarf.loc[UNW_PPC64_V13] = DWARF_NULL_LOC;
-	      c->dwarf.loc[UNW_PPC64_V14] = DWARF_NULL_LOC;
-	      c->dwarf.loc[UNW_PPC64_V15] = DWARF_NULL_LOC;
-	      c->dwarf.loc[UNW_PPC64_V16] = DWARF_NULL_LOC;
-	      c->dwarf.loc[UNW_PPC64_V17] = DWARF_NULL_LOC;
-	      c->dwarf.loc[UNW_PPC64_V18] = DWARF_NULL_LOC;
-	      c->dwarf.loc[UNW_PPC64_V19] = DWARF_NULL_LOC;
-	      c->dwarf.loc[UNW_PPC64_V20] = DWARF_NULL_LOC;
-	      c->dwarf.loc[UNW_PPC64_V21] = DWARF_NULL_LOC;
-	      c->dwarf.loc[UNW_PPC64_V22] = DWARF_NULL_LOC;
-	      c->dwarf.loc[UNW_PPC64_V23] = DWARF_NULL_LOC;
-	      c->dwarf.loc[UNW_PPC64_V24] = DWARF_NULL_LOC;
-	      c->dwarf.loc[UNW_PPC64_V25] = DWARF_NULL_LOC;
-	      c->dwarf.loc[UNW_PPC64_V26] = DWARF_NULL_LOC;
-	      c->dwarf.loc[UNW_PPC64_V27] = DWARF_NULL_LOC;
-	      c->dwarf.loc[UNW_PPC64_V28] = DWARF_NULL_LOC;
-	      c->dwarf.loc[UNW_PPC64_V29] = DWARF_NULL_LOC;
-	      c->dwarf.loc[UNW_PPC64_V30] = DWARF_NULL_LOC;
-	      c->dwarf.loc[UNW_PPC64_V31] = DWARF_NULL_LOC;
-	      c->dwarf.loc[UNW_PPC64_VRSAVE] = DWARF_NULL_LOC;
-	      c->dwarf.loc[UNW_PPC64_VSCR] = DWARF_NULL_LOC;
-	    }
-	  ret = 1;
-	}
+          unw_word_t ucontext = c->dwarf.cfa + __SIGNAL_FRAMESIZE;
+
+          Debug (1, "signal frame, skip over trampoline\n");
+
+          c->sigcontext_format = PPC_SCF_LINUX_RT_SIGFRAME;
+          c->sigcontext_addr = ucontext;
+
+          sp_loc = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R1, 0);
+          ip_loc = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_NIP, 0);
+
+          ret = dwarf_get (&c->dwarf, sp_loc, &c->dwarf.cfa);
+          if (ret < 0)
+            {
+              Debug (2, "returning %d\n", ret);
+              return ret;
+            }
+          ret = dwarf_get (&c->dwarf, ip_loc, &c->dwarf.ip);
+          if (ret < 0)
+            {
+              Debug (2, "returning %d\n", ret);
+              return ret;
+            }
+
+          /* Instead of just restoring the non-volatile registers, do all
+             of the registers for now.  This will incur a performance hit,
+             but it's rare enough not to cause too much of a problem, and
+             might be useful in some cases.  */
+          c->dwarf.loc[UNW_PPC64_R0] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R0, 0);
+          c->dwarf.loc[UNW_PPC64_R1] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R1, 0);
+          c->dwarf.loc[UNW_PPC64_R2] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R2, 0);
+          c->dwarf.loc[UNW_PPC64_R3] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R3, 0);
+          c->dwarf.loc[UNW_PPC64_R4] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R4, 0);
+          c->dwarf.loc[UNW_PPC64_R5] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R5, 0);
+          c->dwarf.loc[UNW_PPC64_R6] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R6, 0);
+          c->dwarf.loc[UNW_PPC64_R7] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R7, 0);
+          c->dwarf.loc[UNW_PPC64_R8] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R8, 0);
+          c->dwarf.loc[UNW_PPC64_R9] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R9, 0);
+          c->dwarf.loc[UNW_PPC64_R10] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R10, 0);
+          c->dwarf.loc[UNW_PPC64_R11] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R11, 0);
+          c->dwarf.loc[UNW_PPC64_R12] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R12, 0);
+          c->dwarf.loc[UNW_PPC64_R13] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R13, 0);
+          c->dwarf.loc[UNW_PPC64_R14] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R14, 0);
+          c->dwarf.loc[UNW_PPC64_R15] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R15, 0);
+          c->dwarf.loc[UNW_PPC64_R16] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R16, 0);
+          c->dwarf.loc[UNW_PPC64_R17] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R17, 0);
+          c->dwarf.loc[UNW_PPC64_R18] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R18, 0);
+          c->dwarf.loc[UNW_PPC64_R19] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R19, 0);
+          c->dwarf.loc[UNW_PPC64_R20] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R20, 0);
+          c->dwarf.loc[UNW_PPC64_R21] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R21, 0);
+          c->dwarf.loc[UNW_PPC64_R22] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R22, 0);
+          c->dwarf.loc[UNW_PPC64_R23] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R23, 0);
+          c->dwarf.loc[UNW_PPC64_R24] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R24, 0);
+          c->dwarf.loc[UNW_PPC64_R25] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R25, 0);
+          c->dwarf.loc[UNW_PPC64_R26] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R26, 0);
+          c->dwarf.loc[UNW_PPC64_R27] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R27, 0);
+          c->dwarf.loc[UNW_PPC64_R28] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R28, 0);
+          c->dwarf.loc[UNW_PPC64_R29] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R29, 0);
+          c->dwarf.loc[UNW_PPC64_R30] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R30, 0);
+          c->dwarf.loc[UNW_PPC64_R31] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R31, 0);
+
+          c->dwarf.loc[UNW_PPC64_LR] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_LINK, 0);
+          c->dwarf.loc[UNW_PPC64_CTR] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_CTR, 0);
+          /* This CR0 assignment is probably wrong.  There are 8 dwarf columns
+             assigned to the CR registers, but only one CR register in the
+             mcontext structure */
+          c->dwarf.loc[UNW_PPC64_CR0] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_CCR, 0);
+          c->dwarf.loc[UNW_PPC64_XER] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_XER, 0);
+          c->dwarf.loc[UNW_PPC64_NIP] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_NIP, 0);
+
+          /* TODO: Is there a way of obtaining the value of the
+             pseudo frame pointer (which is sp + some fixed offset, I
+             assume), based on the contents of the ucontext record
+             structure?  For now, set this loc to null. */
+          c->dwarf.loc[UNW_PPC64_FRAME_POINTER] = DWARF_NULL_LOC;
+
+          c->dwarf.loc[UNW_PPC64_F0] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R0, 0);
+          c->dwarf.loc[UNW_PPC64_F1] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R1, 0);
+          c->dwarf.loc[UNW_PPC64_F2] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R2, 0);
+          c->dwarf.loc[UNW_PPC64_F3] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R3, 0);
+          c->dwarf.loc[UNW_PPC64_F4] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R4, 0);
+          c->dwarf.loc[UNW_PPC64_F5] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R5, 0);
+          c->dwarf.loc[UNW_PPC64_F6] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R6, 0);
+          c->dwarf.loc[UNW_PPC64_F7] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R7, 0);
+          c->dwarf.loc[UNW_PPC64_F8] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R8, 0);
+          c->dwarf.loc[UNW_PPC64_F9] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R9, 0);
+          c->dwarf.loc[UNW_PPC64_F10] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R10, 0);
+          c->dwarf.loc[UNW_PPC64_F11] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R11, 0);
+          c->dwarf.loc[UNW_PPC64_F12] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R12, 0);
+          c->dwarf.loc[UNW_PPC64_F13] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R13, 0);
+          c->dwarf.loc[UNW_PPC64_F14] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R14, 0);
+          c->dwarf.loc[UNW_PPC64_F15] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R15, 0);
+          c->dwarf.loc[UNW_PPC64_F16] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R16, 0);
+          c->dwarf.loc[UNW_PPC64_F17] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R17, 0);
+          c->dwarf.loc[UNW_PPC64_F18] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R18, 0);
+          c->dwarf.loc[UNW_PPC64_F19] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R19, 0);
+          c->dwarf.loc[UNW_PPC64_F20] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R20, 0);
+          c->dwarf.loc[UNW_PPC64_F21] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R21, 0);
+          c->dwarf.loc[UNW_PPC64_F22] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R22, 0);
+          c->dwarf.loc[UNW_PPC64_F23] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R23, 0);
+          c->dwarf.loc[UNW_PPC64_F24] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R24, 0);
+          c->dwarf.loc[UNW_PPC64_F25] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R25, 0);
+          c->dwarf.loc[UNW_PPC64_F26] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R26, 0);
+          c->dwarf.loc[UNW_PPC64_F27] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R27, 0);
+          c->dwarf.loc[UNW_PPC64_F28] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R28, 0);
+          c->dwarf.loc[UNW_PPC64_F29] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R29, 0);
+          c->dwarf.loc[UNW_PPC64_F30] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R30, 0);
+          c->dwarf.loc[UNW_PPC64_F31] =
+            DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R31, 0);
+          /* Note that there is no .eh_section register column for the
+             FPSCR register.  I don't know why this is.  */
+
+          v_regs_loc = DWARF_LOC (ucontext + UC_MCONTEXT_V_REGS, 0);
+          ret = dwarf_get (&c->dwarf, v_regs_loc, &v_regs_ptr);
+          if (ret < 0)
+            {
+              Debug (2, "returning %d\n", ret);
+              return ret;
+            }
+          if (v_regs_ptr != 0)
+            {
+              /* The v_regs_ptr is not null.  Set all of the AltiVec locs */
+
+              c->dwarf.loc[UNW_PPC64_V0] =
+                DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R0, 0);
+              c->dwarf.loc[UNW_PPC64_V1] =
+                DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R1, 0);
+              c->dwarf.loc[UNW_PPC64_V2] =
+                DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R2, 0);
+              c->dwarf.loc[UNW_PPC64_V3] =
+                DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R3, 0);
+              c->dwarf.loc[UNW_PPC64_V4] =
+                DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R4, 0);
+              c->dwarf.loc[UNW_PPC64_V5] =
+                DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R5, 0);
+              c->dwarf.loc[UNW_PPC64_V6] =
+                DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R6, 0);
+              c->dwarf.loc[UNW_PPC64_V7] =
+                DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R7, 0);
+              c->dwarf.loc[UNW_PPC64_V8] =
+                DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R8, 0);
+              c->dwarf.loc[UNW_PPC64_V9] =
+                DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R9, 0);
+              c->dwarf.loc[UNW_PPC64_V10] =
+                DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R10, 0);
+              c->dwarf.loc[UNW_PPC64_V11] =
+                DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R11, 0);
+              c->dwarf.loc[UNW_PPC64_V12] =
+                DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R12, 0);
+              c->dwarf.loc[UNW_PPC64_V13] =
+                DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R13, 0);
+              c->dwarf.loc[UNW_PPC64_V14] =
+                DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R14, 0);
+              c->dwarf.loc[UNW_PPC64_V15] =
+                DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R15, 0);
+              c->dwarf.loc[UNW_PPC64_V16] =
+                DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R16, 0);
+              c->dwarf.loc[UNW_PPC64_V17] =
+                DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R17, 0);
+              c->dwarf.loc[UNW_PPC64_V18] =
+                DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R18, 0);
+              c->dwarf.loc[UNW_PPC64_V19] =
+                DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R19, 0);
+              c->dwarf.loc[UNW_PPC64_V20] =
+                DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R20, 0);
+              c->dwarf.loc[UNW_PPC64_V21] =
+                DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R21, 0);
+              c->dwarf.loc[UNW_PPC64_V22] =
+                DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R22, 0);
+              c->dwarf.loc[UNW_PPC64_V23] =
+                DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R23, 0);
+              c->dwarf.loc[UNW_PPC64_V24] =
+                DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R24, 0);
+              c->dwarf.loc[UNW_PPC64_V25] =
+                DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R25, 0);
+              c->dwarf.loc[UNW_PPC64_V26] =
+                DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R26, 0);
+              c->dwarf.loc[UNW_PPC64_V27] =
+                DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R27, 0);
+              c->dwarf.loc[UNW_PPC64_V28] =
+                DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R28, 0);
+              c->dwarf.loc[UNW_PPC64_V29] =
+                DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R29, 0);
+              c->dwarf.loc[UNW_PPC64_V30] =
+                DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R30, 0);
+              c->dwarf.loc[UNW_PPC64_V31] =
+                DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_R31, 0);
+              c->dwarf.loc[UNW_PPC64_VRSAVE] =
+                DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_VRSAVE, 0);
+              c->dwarf.loc[UNW_PPC64_VSCR] =
+                DWARF_LOC (v_regs_ptr + UC_MCONTEXT_VREGS_VSCR, 0);
+            }
+          else
+            {
+              c->dwarf.loc[UNW_PPC64_V0] = DWARF_NULL_LOC;
+              c->dwarf.loc[UNW_PPC64_V1] = DWARF_NULL_LOC;
+              c->dwarf.loc[UNW_PPC64_V2] = DWARF_NULL_LOC;
+              c->dwarf.loc[UNW_PPC64_V3] = DWARF_NULL_LOC;
+              c->dwarf.loc[UNW_PPC64_V4] = DWARF_NULL_LOC;
+              c->dwarf.loc[UNW_PPC64_V5] = DWARF_NULL_LOC;
+              c->dwarf.loc[UNW_PPC64_V6] = DWARF_NULL_LOC;
+              c->dwarf.loc[UNW_PPC64_V7] = DWARF_NULL_LOC;
+              c->dwarf.loc[UNW_PPC64_V8] = DWARF_NULL_LOC;
+              c->dwarf.loc[UNW_PPC64_V9] = DWARF_NULL_LOC;
+              c->dwarf.loc[UNW_PPC64_V10] = DWARF_NULL_LOC;
+              c->dwarf.loc[UNW_PPC64_V11] = DWARF_NULL_LOC;
+              c->dwarf.loc[UNW_PPC64_V12] = DWARF_NULL_LOC;
+              c->dwarf.loc[UNW_PPC64_V13] = DWARF_NULL_LOC;
+              c->dwarf.loc[UNW_PPC64_V14] = DWARF_NULL_LOC;
+              c->dwarf.loc[UNW_PPC64_V15] = DWARF_NULL_LOC;
+              c->dwarf.loc[UNW_PPC64_V16] = DWARF_NULL_LOC;
+              c->dwarf.loc[UNW_PPC64_V17] = DWARF_NULL_LOC;
+              c->dwarf.loc[UNW_PPC64_V18] = DWARF_NULL_LOC;
+              c->dwarf.loc[UNW_PPC64_V19] = DWARF_NULL_LOC;
+              c->dwarf.loc[UNW_PPC64_V20] = DWARF_NULL_LOC;
+              c->dwarf.loc[UNW_PPC64_V21] = DWARF_NULL_LOC;
+              c->dwarf.loc[UNW_PPC64_V22] = DWARF_NULL_LOC;
+              c->dwarf.loc[UNW_PPC64_V23] = DWARF_NULL_LOC;
+              c->dwarf.loc[UNW_PPC64_V24] = DWARF_NULL_LOC;
+              c->dwarf.loc[UNW_PPC64_V25] = DWARF_NULL_LOC;
+              c->dwarf.loc[UNW_PPC64_V26] = DWARF_NULL_LOC;
+              c->dwarf.loc[UNW_PPC64_V27] = DWARF_NULL_LOC;
+              c->dwarf.loc[UNW_PPC64_V28] = DWARF_NULL_LOC;
+              c->dwarf.loc[UNW_PPC64_V29] = DWARF_NULL_LOC;
+              c->dwarf.loc[UNW_PPC64_V30] = DWARF_NULL_LOC;
+              c->dwarf.loc[UNW_PPC64_V31] = DWARF_NULL_LOC;
+              c->dwarf.loc[UNW_PPC64_VRSAVE] = DWARF_NULL_LOC;
+              c->dwarf.loc[UNW_PPC64_VSCR] = DWARF_NULL_LOC;
+            }
+          ret = 1;
+        }
     }
+
+  if (c->dwarf.ip == 0)
+    {
+      /* Unless the cursor or stack is corrupt or uninitialized,
+         we've most likely hit the top of the stack */
+      Debug (2, "returning 0\n");
+      return 0;
+    }
+
+  // on ppc64, R2 register is used as pointer to TOC
+  // section which is used for symbol lookup in PIC code
+  // ppc64 linker generates "ld r2, 40(r1)" (ELFv1) or
+  // "ld r2, 24(r1)" (ELFv2) instruction after each
+  // @plt call. We need restore R2, but only for @plt calls
+  {
+    unw_word_t ip = c->dwarf.ip;
+    unw_addr_space_t as = c->dwarf.as;
+    unw_accessors_t *a = unw_get_accessors (as);
+    void *arg = c->dwarf.as_arg;
+    uint32_t toc_save = (as->abi == UNW_PPC64_ABI_ELFv2)? 24 : 40;
+    int32_t inst;
+
+    if (fetch32 (as, a, &ip, &inst, arg) >= 0
+	&& (uint32_t)inst == (0xE8410000U + toc_save))
+      {
+	// @plt call, restoring R2 from CFA+toc_save
+	c->dwarf.loc[UNW_PPC64_R2] = DWARF_LOC(c->dwarf.cfa + toc_save, 0);
+      }
+  }
+
+  Debug (2, "returning %d with last return statement\n", ret);
   return ret;
 }
diff --git a/frysk-imports/libunwind/src/ppc64/Lget_proc_info.c b/frysk-imports/libunwind/src/ppc64/Lget_proc_info.c
deleted file mode 100644
index 69028b0..0000000
--- a/frysk-imports/libunwind/src/ppc64/Lget_proc_info.c
+++ /dev/null
@@ -1,5 +0,0 @@
-#define UNW_LOCAL_ONLY
-#include <libunwind.h>
-#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
-#include "Gget_proc_info.c"
-#endif
diff --git a/frysk-imports/libunwind/src/ppc64/Lget_save_loc.c b/frysk-imports/libunwind/src/ppc64/Lget_save_loc.c
deleted file mode 100644
index 9ea048a..0000000
--- a/frysk-imports/libunwind/src/ppc64/Lget_save_loc.c
+++ /dev/null
@@ -1,5 +0,0 @@
-#define UNW_LOCAL_ONLY
-#include <libunwind.h>
-#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
-#include "Gget_save_loc.c"
-#endif
diff --git a/frysk-imports/libunwind/src/ppc64/Linit_local.c b/frysk-imports/libunwind/src/ppc64/Linit_local.c
deleted file mode 100644
index 68a1687..0000000
--- a/frysk-imports/libunwind/src/ppc64/Linit_local.c
+++ /dev/null
@@ -1,5 +0,0 @@
-#define UNW_LOCAL_ONLY
-#include <libunwind.h>
-#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
-#include "Ginit_local.c"
-#endif
diff --git a/frysk-imports/libunwind/src/ppc64/Linit_remote.c b/frysk-imports/libunwind/src/ppc64/Linit_remote.c
deleted file mode 100644
index 58cb04a..0000000
--- a/frysk-imports/libunwind/src/ppc64/Linit_remote.c
+++ /dev/null
@@ -1,5 +0,0 @@
-#define UNW_LOCAL_ONLY
-#include <libunwind.h>
-#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
-#include "Ginit_remote.c"
-#endif
diff --git a/frysk-imports/libunwind/src/ppc64/Lis_signal_frame.c b/frysk-imports/libunwind/src/ppc64/Lis_signal_frame.c
deleted file mode 100644
index b9a7c4f..0000000
--- a/frysk-imports/libunwind/src/ppc64/Lis_signal_frame.c
+++ /dev/null
@@ -1,5 +0,0 @@
-#define UNW_LOCAL_ONLY
-#include <libunwind.h>
-#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
-#include "Gis_signal_frame.c"
-#endif
diff --git a/frysk-imports/libunwind/src/ppc64/get_func_addr.c b/frysk-imports/libunwind/src/ppc64/get_func_addr.c
index a9c828d..13abb7d 100644
--- a/frysk-imports/libunwind/src/ppc64/get_func_addr.c
+++ b/frysk-imports/libunwind/src/ppc64/get_func_addr.c
@@ -29,17 +29,23 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 int
 tdep_get_func_addr (unw_addr_space_t as, unw_word_t addr,
-		    unw_word_t *entry_point)
+                    unw_word_t *entry_point)
 {
-  unw_accessors_t *a;
-  int ret;
-
-  a = unw_get_accessors (as);
-  /* Entry-point is stored in the 1st word of the function descriptor.
-     In case that changes in the future, we'd have to update the line
-     below and read the word at addr + offset: */
-  ret = (*a->access_mem) (as, addr, entry_point, 0, NULL);
-  if (ret < 0)
-    return ret;
+  if (as->abi == UNW_PPC64_ABI_ELFv1)
+    {
+      unw_accessors_t *a;
+      int ret;
+
+      a = unw_get_accessors (as);
+      /* Entry-point is stored in the 1st word of the function descriptor.
+         In case that changes in the future, we'd have to update the line
+         below and read the word at addr + offset: */
+      ret = (*a->access_mem) (as, addr, entry_point, 0, NULL);
+      if (ret < 0)
+        return ret;
+    }
+  else
+    *entry_point = addr;
+
   return 0;
 }
diff --git a/frysk-imports/libunwind/src/ppc64/init.h b/frysk-imports/libunwind/src/ppc64/init.h
index 886f14c..22376e7 100644
--- a/frysk-imports/libunwind/src/ppc64/init.h
+++ b/frysk-imports/libunwind/src/ppc64/init.h
@@ -28,7 +28,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #include "unwind_i.h"
 
 static inline int
-common_init_ppc64 (struct cursor *c)
+common_init_ppc64 (struct cursor *c, unsigned use_prev_instr)
 {
   int ret;
   int i;
@@ -63,7 +63,7 @@ common_init_ppc64 (struct cursor *c)
     return ret;
 
   ret = dwarf_get (&c->dwarf, DWARF_REG_LOC (&c->dwarf, UNW_PPC64_R1),
-		   &c->dwarf.cfa);
+                   &c->dwarf.cfa);
   if (ret < 0)
     return ret;
 
@@ -72,6 +72,8 @@ common_init_ppc64 (struct cursor *c)
 
   c->dwarf.args_size = 0;
   c->dwarf.ret_addr_column = 0;
+  c->dwarf.stash_frames = 0;
+  c->dwarf.use_prev_instr = use_prev_instr;
   c->dwarf.pi_valid = 0;
   c->dwarf.pi_is_dynamic = 0;
   c->dwarf.hint = 0;
diff --git a/frysk-imports/libunwind/src/ppc64/longjmp.S b/frysk-imports/libunwind/src/ppc64/longjmp.S
deleted file mode 100644
index 0482ea1..0000000
--- a/frysk-imports/libunwind/src/ppc64/longjmp.S
+++ /dev/null
@@ -1,35 +0,0 @@
-/* libunwind - a platform-independent unwind library
-
-   Copied from src/x86_64/, modified slightly (or made empty stubs) for
-   building frysk successfully on ppc64, by Wu Zhou <woodzltc@cn.ibm.com>
-
-This file is part of libunwind.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
-
-	.globl _UI_longjmp_cont
-
-	.type _UI_longjmp_cont, @function
-_UI_longjmp_cont:
-	.size _UI_longjmp_cont, .-_UI_longjmp_cont
-#ifdef __linux__
-       /* We do not need executable stack.  */
-       .section        .note.GNU-stack,"",@progbits
-#endif
diff --git a/frysk-imports/libunwind/src/ppc64/regname.c b/frysk-imports/libunwind/src/ppc64/regname.c
index 7d64834..3e3a141 100644
--- a/frysk-imports/libunwind/src/ppc64/regname.c
+++ b/frysk-imports/libunwind/src/ppc64/regname.c
@@ -149,6 +149,9 @@ static const char *regname[] =
     [UNW_PPC64_SPE_ACC]="SPE_ACC",
     [UNW_PPC64_SPEFSCR]="SPEFSCR",
 
+    [UNW_PPC64_FRAME_POINTER]="FRAME_POINTER",
+    [UNW_PPC64_NIP]="NIP",
+
    };
 
 PROTECTED const char *
diff --git a/frysk-imports/libunwind/src/ppc64/setcontext.S b/frysk-imports/libunwind/src/ppc64/setcontext.S
index b54378a..ffc2500 100644
--- a/frysk-imports/libunwind/src/ppc64/setcontext.S
+++ b/frysk-imports/libunwind/src/ppc64/setcontext.S
@@ -1,7 +1,7 @@
 	.global _UI_setcontext
 
 _UI_setcontext:
-	retq
+        blr
 
 #ifdef __linux__
         /* We do not need executable stack.  */
diff --git a/frysk-imports/libunwind/src/ppc64/siglongjmp.S b/frysk-imports/libunwind/src/ppc64/siglongjmp.S
deleted file mode 100644
index 701a39a..0000000
--- a/frysk-imports/libunwind/src/ppc64/siglongjmp.S
+++ /dev/null
@@ -1,31 +0,0 @@
-/* libunwind - a platform-independent unwind library
-
-This file is part of libunwind.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
-
-	.globl _UI_siglongjmp_cont
-
-	_UI_siglongjmp_cont:
-
-#ifdef __linux__
-       /* We do not need executable stack.  */
-       .section        .note.GNU-stack,"",@progbits
-#endif
diff --git a/frysk-imports/libunwind/src/ppc64/ucontext_i.h b/frysk-imports/libunwind/src/ppc64/ucontext_i.h
index 5999e9a..2ddfdb8 100644
--- a/frysk-imports/libunwind/src/ppc64/ucontext_i.h
+++ b/frysk-imports/libunwind/src/ppc64/ucontext_i.h
@@ -28,83 +28,31 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 #include <ucontext.h>
 
-/* FRYSK LOCAL - since we are compiling on different architectures
-   use use local (renamed) definitions from
-http://www.linux-foundation.org/spec/refspecs/LSB_3.0.0/LSB-PPC64/LSB-PPC64.html
-*/
-typedef struct local_libc_vscr
-{
-  int __pad[3];
-  int vscr_word;
-}
-local_vscr_t;
-typedef struct local_libc_vrstate
-{
-  unsigned int vrregs[128];
-  local_vscr_t vscr;
-  unsigned int vrsave;
-  unsigned int __pad[3];
-}
-local_vrregset_t __attribute__ ((__aligned__ (16)));
-
-#define NGREG	48
-
-typedef unsigned long int local_gregset_t[48];
-
-typedef double local_fpregset_t[33];
-
-typedef struct
-{
-  unsigned long int __unused[4];
-  int signal;
-  int pad0;
-  unsigned long int handler;
-  unsigned long int oldmask;
-  struct pt_regs *regs;
-  local_gregset_t gp_regs;
-  local_fpregset_t fp_regs;
-  local_vrregset_t *v_regs;
-  long int vmx_reserve[69];
-}
-local_mcontext_t;
-
-typedef struct local_ucontext
-{
-  unsigned long int uc_flags;
-  struct local_ucontext *uc_link;
-  stack_t uc_stack;
-  sigset_t uc_sigmask;
-  local_mcontext_t uc_mcontext;
-}
-local_ucontext_t;
-/* END FRYSK LOCAL */
-
-
 /* These values were derived by reading
    /usr/src/linux-2.6.18-1.8/arch/um/include/sysdep-ppc/ptrace.h and
    /usr/src/linux-2.6.18-1.8/arch/powerpc/kernel/ppc32.h
 */
 
-#define NIP_IDX		32
-#define MSR_IDX		33
-#define ORIG_GPR3_IDX	34
-#define CTR_IDX		35
-#define LINK_IDX	36
-#define XER_IDX		37
-#define CCR_IDX		38
-#define SOFTE_IDX	39
-#define TRAP_IDX	40
-#define DAR_IDX		41
-#define DSISR_IDX	42
-#define RESULT_IDX	43
+#define NIP_IDX         32
+#define MSR_IDX         33
+#define ORIG_GPR3_IDX   34
+#define CTR_IDX         35
+#define LINK_IDX        36
+#define XER_IDX         37
+#define CCR_IDX         38
+#define SOFTE_IDX       39
+#define TRAP_IDX        40
+#define DAR_IDX         41
+#define DSISR_IDX       42
+#define RESULT_IDX      43
 
 #define VSCR_IDX        32
 #define VRSAVE_IDX      33
 
 /* These are dummy structures used only for obtaining the offsets of the
    various structure members. */
-static local_ucontext_t dmy_ctxt;
-static local_vrregset_t dmy_vrregset;
+static ucontext_t dmy_ctxt;
+static vrregset_t dmy_vrregset;
 
 #define UC_MCONTEXT_GREGS_R0 ((void *)&dmy_ctxt.uc_mcontext.gp_regs[0] - (void *)&dmy_ctxt)
 #define UC_MCONTEXT_GREGS_R1 ((void *)&dmy_ctxt.uc_mcontext.gp_regs[1] - (void *)&dmy_ctxt)
diff --git a/frysk-imports/libunwind/src/ppc64/unwind_i.h b/frysk-imports/libunwind/src/ppc64/unwind_i.h
index 056dc16..26bbc2d 100644
--- a/frysk-imports/libunwind/src/ppc64/unwind_i.h
+++ b/frysk-imports/libunwind/src/ppc64/unwind_i.h
@@ -28,7 +28,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #ifndef unwind_i_h
 #define unwind_i_h
 
-#include <memory.h>
 #include <stdint.h>
 
 #include <libunwind-ppc64.h>
@@ -36,16 +35,16 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #include <libunwind_i.h>
 #include <sys/ucontext.h>
 
-#define ppc64_lock			UNW_OBJ(lock)
-#define ppc64_local_resume		UNW_OBJ(local_resume)
-#define ppc64_local_addr_space_init	UNW_OBJ(local_addr_space_init)
+#define ppc64_lock                      UNW_OBJ(lock)
+#define ppc64_local_resume              UNW_OBJ(local_resume)
+#define ppc64_local_addr_space_init     UNW_OBJ(local_addr_space_init)
 #if 0
-#define ppc64_scratch_loc		UNW_OBJ(scratch_loc)
+#define ppc64_scratch_loc               UNW_OBJ(scratch_loc)
 #endif
 
 extern void ppc64_local_addr_space_init (void);
 extern int ppc64_local_resume (unw_addr_space_t as, unw_cursor_t *cursor,
-			     void *arg);
+                             void *arg);
 #if 0
 extern dwarf_loc_t ppc64_scratch_loc (struct cursor *c, unw_regnum_t reg);
 #endif
diff --git a/frysk-imports/libunwind/src/ptrace/_UPT_access_fpreg.c b/frysk-imports/libunwind/src/ptrace/_UPT_access_fpreg.c
index 28e0892..e90ec47 100644
--- a/frysk-imports/libunwind/src/ptrace/_UPT_access_fpreg.c
+++ b/frysk-imports/libunwind/src/ptrace/_UPT_access_fpreg.c
@@ -1,6 +1,7 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+   Copyright (C) 2010 Konstantin Belousov <kib@freebsd.org>
 
 This file is part of libunwind.
 
@@ -25,16 +26,17 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 #include "_UPT_internal.h"
 
+#if HAVE_DECL_PTRACE_POKEUSER || HAVE_TTRACE
 int
 _UPT_access_fpreg (unw_addr_space_t as, unw_regnum_t reg, unw_fpreg_t *val,
-		   int write, void *arg)
+                   int write, void *arg)
 {
   unw_word_t *wp = (unw_word_t *) val;
   struct UPT_info *ui = arg;
   pid_t pid = ui->pid;
   int i;
 
-  if ((unsigned) reg >= sizeof (_UPT_reg_offset) / sizeof (_UPT_reg_offset[0]))
+  if ((unsigned) reg >= ARRAY_SIZE (_UPT_reg_offset))
     return -UNW_EBADREG;
 
   errno = 0;
@@ -42,25 +44,62 @@ _UPT_access_fpreg (unw_addr_space_t as, unw_regnum_t reg, unw_fpreg_t *val,
     for (i = 0; i < (int) (sizeof (*val) / sizeof (wp[i])); ++i)
       {
 #ifdef HAVE_TTRACE
-#	warning No support for ttrace() yet.
+#       warning No support for ttrace() yet.
 #else
-	ptrace (PTRACE_POKEUSER, pid, _UPT_reg_offset[reg] + i * sizeof(wp[i]),
-		wp[i]);
+        ptrace (PTRACE_POKEUSER, pid, _UPT_reg_offset[reg] + i * sizeof(wp[i]),
+                wp[i]);
 #endif
-	if (errno)
-	  return -UNW_EBADREG;
+        if (errno)
+          return -UNW_EBADREG;
       }
   else
     for (i = 0; i < (int) (sizeof (*val) / sizeof (wp[i])); ++i)
       {
 #ifdef HAVE_TTRACE
-#	warning No support for ttrace() yet.
+#       warning No support for ttrace() yet.
 #else
-	wp[i] = ptrace (PTRACE_PEEKUSER, pid,
-			_UPT_reg_offset[reg] + i * sizeof(wp[i]), 0);
+        wp[i] = ptrace (PTRACE_PEEKUSER, pid,
+                        _UPT_reg_offset[reg] + i * sizeof(wp[i]), 0);
 #endif
-	if (errno)
-	  return -UNW_EBADREG;
+        if (errno)
+          return -UNW_EBADREG;
       }
   return 0;
 }
+#elif HAVE_DECL_PT_GETFPREGS
+int
+_UPT_access_fpreg (unw_addr_space_t as, unw_regnum_t reg, unw_fpreg_t *val,
+                   int write, void *arg)
+{
+  struct UPT_info *ui = arg;
+  pid_t pid = ui->pid;
+  fpregset_t fpreg;
+
+  if ((unsigned) reg >= ARRAY_SIZE (_UPT_reg_offset))
+    return -UNW_EBADREG;
+
+  if (ptrace(PT_GETFPREGS, pid, (caddr_t)&fpreg, 0) == -1)
+          return -UNW_EBADREG;
+  if (write) {
+#if defined(__amd64__)
+          memcpy(&fpreg.fpr_xacc[reg], val, sizeof(unw_fpreg_t));
+#elif defined(__i386__)
+          memcpy(&fpreg.fpr_acc[reg], val, sizeof(unw_fpreg_t));
+#else
+#error Fix me
+#endif
+          if (ptrace(PT_SETFPREGS, pid, (caddr_t)&fpreg, 0) == -1)
+                  return -UNW_EBADREG;
+  } else
+#if defined(__amd64__)
+          memcpy(val, &fpreg.fpr_xacc[reg], sizeof(unw_fpreg_t));
+#elif defined(__i386__)
+          memcpy(val, &fpreg.fpr_acc[reg], sizeof(unw_fpreg_t));
+#else
+#error Fix me
+#endif
+  return 0;
+}
+#else
+#error Fix me
+#endif
diff --git a/frysk-imports/libunwind/src/ptrace/_UPT_access_mem.c b/frysk-imports/libunwind/src/ptrace/_UPT_access_mem.c
index 6900c19..ab93ce3 100644
--- a/frysk-imports/libunwind/src/ptrace/_UPT_access_mem.c
+++ b/frysk-imports/libunwind/src/ptrace/_UPT_access_mem.c
@@ -1,6 +1,7 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003-2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+   Copyright (C) 2010 Konstantin Belousov <kib@freebsd.org>
 
 This file is part of libunwind.
 
@@ -25,11 +26,15 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 #include "_UPT_internal.h"
 
+#if HAVE_DECL_PTRACE_POKEDATA || HAVE_TTRACE
 int
 _UPT_access_mem (unw_addr_space_t as, unw_word_t addr, unw_word_t *val,
-		 int write, void *arg)
+                 int write, void *arg)
 {
   struct UPT_info *ui = arg;
+  if (!ui)
+        return -UNW_EINVAL;
+
   pid_t pid = ui->pid;
 
   errno = 0;
@@ -37,23 +42,49 @@ _UPT_access_mem (unw_addr_space_t as, unw_word_t addr, unw_word_t *val,
     {
       Debug (16, "mem[%lx] <- %lx\n", (long) addr, (long) *val);
 #ifdef HAVE_TTRACE
-#	warning No support for ttrace() yet.
+#       warning No support for ttrace() yet.
 #else
       ptrace (PTRACE_POKEDATA, pid, addr, *val);
       if (errno)
-	return -UNW_EINVAL;
+        return -UNW_EINVAL;
 #endif
     }
   else
     {
 #ifdef HAVE_TTRACE
-#	warning No support for ttrace() yet.
+#       warning No support for ttrace() yet.
 #else
       *val = ptrace (PTRACE_PEEKDATA, pid, addr, 0);
       if (errno)
-	return -UNW_EINVAL;
+        return -UNW_EINVAL;
 #endif
       Debug (16, "mem[%lx] -> %lx\n", (long) addr, (long) *val);
     }
   return 0;
 }
+#elif HAVE_DECL_PT_IO
+int
+_UPT_access_mem (unw_addr_space_t as, unw_word_t addr, unw_word_t *val,
+                 int write, void *arg)
+{
+  struct UPT_info *ui = arg;
+  if (!ui)
+        return -UNW_EINVAL;
+  pid_t pid = ui->pid;
+  struct ptrace_io_desc iod;
+
+  iod.piod_offs = (void *)addr;
+  iod.piod_addr = val;
+  iod.piod_len = sizeof(*val);
+  iod.piod_op = write ? PIOD_WRITE_D : PIOD_READ_D;
+  if (write)
+    Debug (16, "mem[%lx] <- %lx\n", (long) addr, (long) *val);
+  if (ptrace(PT_IO, pid, (caddr_t)&iod, 0) == -1)
+    return -UNW_EINVAL;
+  if (!write)
+     Debug (16, "mem[%lx] -> %lx\n", (long) addr, (long) *val);
+  return 0;
+}
+#else
+#error Fix me
+#endif
diff --git a/frysk-imports/libunwind/src/ptrace/_UPT_access_reg.c b/frysk-imports/libunwind/src/ptrace/_UPT_access_reg.c
index 60e006b..ae71608 100644
--- a/frysk-imports/libunwind/src/ptrace/_UPT_access_reg.c
+++ b/frysk-imports/libunwind/src/ptrace/_UPT_access_reg.c
@@ -1,6 +1,7 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003-2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+   Copyright (C) 2010 Konstantin Belousov <kib@freebsd.org>
 
 This file is part of libunwind.
 
@@ -33,14 +34,17 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 # include "tdep-ia64/rse.h"
 #endif
 
+#if HAVE_DECL_PTRACE_POKEUSER || HAVE_TTRACE
 int
 _UPT_access_reg (unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val,
-		 int write, void *arg)
+                 int write, void *arg)
 {
   struct UPT_info *ui = arg;
   pid_t pid = ui->pid;
 
 #if UNW_DEBUG
+  Debug(16, "using pokeuser: reg: %s [%u], val: %lx, write: %d\n", unw_regname(reg), (unsigned) reg, (long) val, write);
+
   if (write)
     Debug (16, "%s <- %lx\n", unw_regname (reg), (long) *val);
 #endif
@@ -54,189 +58,201 @@ _UPT_access_reg (unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val,
       mask = ((unw_word_t) 1) << (reg - UNW_IA64_NAT);
       errno = 0;
 #ifdef HAVE_TTRACE
-#	warning No support for ttrace() yet.
+#       warning No support for ttrace() yet.
 #else
       nat_bits = ptrace (PTRACE_PEEKUSER, pid, PT_NAT_BITS, 0);
       if (errno)
-	goto badreg;
+        goto badreg;
 #endif
 
       if (write)
-	{
-	  if (*val)
-	    nat_bits |= mask;
-	  else
-	    nat_bits &= ~mask;
+        {
+          if (*val)
+            nat_bits |= mask;
+          else
+            nat_bits &= ~mask;
 #ifdef HAVE_TTRACE
-#	warning No support for ttrace() yet.
+#       warning No support for ttrace() yet.
 #else
-	  errno = 0;
-	  ptrace (PTRACE_POKEUSER, pid, PT_NAT_BITS, nat_bits);
-	  if (errno)
-	    goto badreg;
+          errno = 0;
+          ptrace (PTRACE_POKEUSER, pid, PT_NAT_BITS, nat_bits);
+          if (errno)
+            goto badreg;
 #endif
-	}
+        }
       goto out;
     }
   else
     switch (reg)
       {
       case UNW_IA64_GR + 0:
-	if (write)
-	  goto badreg;
-	*val = 0;
-	return 0;
+        if (write)
+          goto badreg;
+        *val = 0;
+        return 0;
 
       case UNW_REG_IP:
-	{
-	  unsigned long ip, psr;
+        {
+          unsigned long ip, psr;
 
-	  /* distribute bundle-addr. & slot-number across PT_IIP & PT_IPSR.  */
+          /* distribute bundle-addr. & slot-number across PT_IIP & PT_IPSR.  */
 #ifdef HAVE_TTRACE
-#	warning No support for ttrace() yet.
+#       warning No support for ttrace() yet.
 #else
-	  errno = 0;
-	  psr = ptrace (PTRACE_PEEKUSER, pid, PT_CR_IPSR, 0);
-	  if (errno)
-	    goto badreg;
-#endif
-	  if (write)
-	    {
-	      ip = *val & ~0xfUL;
-	      psr = (psr & ~0x3UL << 41) | (*val & 0x3);
+          errno = 0;
+          psr = ptrace (PTRACE_PEEKUSER, pid, PT_CR_IPSR, 0);
+          if (errno)
+            goto badreg;
+#endif
+          if (write)
+            {
+              ip = *val & ~0xfUL;
+              psr = (psr & ~0x3UL << 41) | (*val & 0x3);
 #ifdef HAVE_TTRACE
-#	warning No support for ttrace() yet.
+#       warning No support for ttrace() yet.
 #else
-	      errno = 0;
-	      ptrace (PTRACE_POKEUSER, pid, PT_CR_IIP, ip);
-	      ptrace (PTRACE_POKEUSER, pid, PT_CR_IPSR, psr);
-	      if (errno)
-		goto badreg;
-#endif
-	    }
-	  else
-	    {
+              errno = 0;
+              ptrace (PTRACE_POKEUSER, pid, PT_CR_IIP, ip);
+              ptrace (PTRACE_POKEUSER, pid, PT_CR_IPSR, psr);
+              if (errno)
+                goto badreg;
+#endif
+            }
+          else
+            {
 #ifdef HAVE_TTRACE
-#	warning No support for ttrace() yet.
+#       warning No support for ttrace() yet.
 #else
-	      errno = 0;
-	      ip = ptrace (PTRACE_PEEKUSER, pid, PT_CR_IIP, 0);
-	      if (errno)
-		goto badreg;
+              errno = 0;
+              ip = ptrace (PTRACE_PEEKUSER, pid, PT_CR_IIP, 0);
+              if (errno)
+                goto badreg;
 #endif
-	      *val = ip + ((psr >> 41) & 0x3);
-	    }
-	  goto out;
-	}
+              *val = ip + ((psr >> 41) & 0x3);
+            }
+          goto out;
+        }
 
       case UNW_IA64_AR_BSPSTORE:
-	reg = UNW_IA64_AR_BSP;
-	break;
+        reg = UNW_IA64_AR_BSP;
+        break;
 
       case UNW_IA64_AR_BSP:
       case UNW_IA64_BSP:
-	{
-	  unsigned long sof, cfm, bsp;
+        {
+          unsigned long sof, cfm, bsp;
 
 #ifdef HAVE_TTRACE
-#	warning No support for ttrace() yet.
+#       warning No support for ttrace() yet.
 #else
-	  /* Account for the fact that ptrace() expects bsp to point
-	     _after_ the current register frame.  */
-	  errno = 0;
-	  cfm = ptrace (PTRACE_PEEKUSER, pid, PT_CFM, 0);
-	  if (errno)
-	    goto badreg;
-#endif
-	  sof = (cfm & 0x7f);
-
-	  if (write)
-	    {
-	      bsp = rse_skip_regs (*val, sof);
+          /* Account for the fact that ptrace() expects bsp to point
+             _after_ the current register frame.  */
+          errno = 0;
+          cfm = ptrace (PTRACE_PEEKUSER, pid, PT_CFM, 0);
+          if (errno)
+            goto badreg;
+#endif
+          sof = (cfm & 0x7f);
+
+          if (write)
+            {
+              bsp = rse_skip_regs (*val, sof);
 #ifdef HAVE_TTRACE
-#	warning No support for ttrace() yet.
+#       warning No support for ttrace() yet.
 #else
-	      errno = 0;
-	      ptrace (PTRACE_POKEUSER, pid, PT_AR_BSP, bsp);
-	      if (errno)
-		goto badreg;
-#endif
-	    }
-	  else
-	    {
+              errno = 0;
+              ptrace (PTRACE_POKEUSER, pid, PT_AR_BSP, bsp);
+              if (errno)
+                goto badreg;
+#endif
+            }
+          else
+            {
 #ifdef HAVE_TTRACE
-#	warning No support for ttrace() yet.
+#       warning No support for ttrace() yet.
 #else
-	      errno = 0;
-	      bsp = ptrace (PTRACE_PEEKUSER, pid, PT_AR_BSP, 0);
-	      if (errno)
-		goto badreg;
+              errno = 0;
+              bsp = ptrace (PTRACE_PEEKUSER, pid, PT_AR_BSP, 0);
+              if (errno)
+                goto badreg;
 #endif
-	      *val = rse_skip_regs (bsp, -sof);
-	    }
-	  goto out;
-	}
+              *val = rse_skip_regs (bsp, -sof);
+            }
+          goto out;
+        }
 
       case UNW_IA64_CFM:
-	/* If we change CFM, we need to adjust ptrace's notion of bsp
-	   accordingly, so that the real bsp remains unchanged.  */
-	if (write)
-	  {
-	    unsigned long new_sof, old_sof, cfm, bsp;
+        /* If we change CFM, we need to adjust ptrace's notion of bsp
+           accordingly, so that the real bsp remains unchanged.  */
+        if (write)
+          {
+            unsigned long new_sof, old_sof, cfm, bsp;
 
 #ifdef HAVE_TTRACE
-#	warning No support for ttrace() yet.
+#       warning No support for ttrace() yet.
 #else
-	    errno = 0;
-	    bsp = ptrace (PTRACE_PEEKUSER, pid, PT_AR_BSP, 0);
-	    cfm = ptrace (PTRACE_PEEKUSER, pid, PT_CFM, 0);
-#endif
-	    if (errno)
-	      goto badreg;
-	    old_sof = (cfm & 0x7f);
-	    new_sof = (*val & 0x7f);
-	    if (old_sof != new_sof)
-	      {
-		bsp = rse_skip_regs (bsp, -old_sof + new_sof);
+            errno = 0;
+            bsp = ptrace (PTRACE_PEEKUSER, pid, PT_AR_BSP, 0);
+            cfm = ptrace (PTRACE_PEEKUSER, pid, PT_CFM, 0);
+#endif
+            if (errno)
+              goto badreg;
+            old_sof = (cfm & 0x7f);
+            new_sof = (*val & 0x7f);
+            if (old_sof != new_sof)
+              {
+                bsp = rse_skip_regs (bsp, -old_sof + new_sof);
 #ifdef HAVE_TTRACE
-#	warning No support for ttrace() yet.
+#       warning No support for ttrace() yet.
 #else
-		errno = 0;
-		ptrace (PTRACE_POKEUSER, pid, PT_AR_BSP, 0);
-		if (errno)
-		  goto badreg;
+                errno = 0;
+                ptrace (PTRACE_POKEUSER, pid, PT_AR_BSP, 0);
+                if (errno)
+                  goto badreg;
 #endif
-	      }
+              }
 #ifdef HAVE_TTRACE
-#	warning No support for ttrace() yet.
+#       warning No support for ttrace() yet.
 #else
-	    errno = 0;
-	    ptrace (PTRACE_POKEUSER, pid, PT_CFM, *val);
-	    if (errno)
-	      goto badreg;
-#endif
-	    goto out;
-	  }
-	break;
-      }
+            errno = 0;
+            ptrace (PTRACE_POKEUSER, pid, PT_CFM, *val);
+            if (errno)
+              goto badreg;
 #endif
+            goto out;
+          }
+        break;
+      }
+#endif /* End of IA64 */
 
-  if ((unsigned) reg >= sizeof (_UPT_reg_offset) / sizeof (_UPT_reg_offset[0]))
+  if ((unsigned) reg >= ARRAY_SIZE (_UPT_reg_offset))
     {
+#if UNW_DEBUG
+      Debug(2, "register out of range: >= %zu / %zu\n", sizeof(_UPT_reg_offset), sizeof(_UPT_reg_offset[0]));
+#endif
       errno = EINVAL;
       goto badreg;
     }
 
 #ifdef HAVE_TTRACE
-#	warning No support for ttrace() yet.
+#       warning No support for ttrace() yet.
 #else
   errno = 0;
   if (write)
     ptrace (PTRACE_POKEUSER, pid, _UPT_reg_offset[reg], *val);
-  else
+  else {
+#if UNW_DEBUG
+    Debug(16, "ptrace PEEKUSER pid: %lu , reg: %lu , offs: %lu\n", (unsigned long)pid, (unsigned long)reg,
+        (unsigned long)_UPT_reg_offset[reg]);
+#endif
     *val = ptrace (PTRACE_PEEKUSER, pid, _UPT_reg_offset[reg], 0);
-  if (errno)
+  }
+  if (errno) {
+#if UNW_DEBUG
+    Debug(2, "ptrace failure\n");
+#endif
     goto badreg;
+  }
 #endif
 
 #ifdef UNW_TARGET_IA64
@@ -244,11 +260,50 @@ _UPT_access_reg (unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val,
 #endif
 #if UNW_DEBUG
   if (!write)
-    Debug (16, "%s -> %lx\n", unw_regname (reg), (long) *val);
+    Debug (16, "%s[%u] -> %lx\n", unw_regname (reg), (unsigned) reg, (long) *val);
+#endif
+  return 0;
+
+ badreg:
+  Debug (1, "bad register %s [%u] (error: %s)\n", unw_regname(reg), reg, strerror (errno));
+  return -UNW_EBADREG;
+}
+#elif HAVE_DECL_PT_GETREGS
+int
+_UPT_access_reg (unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val,
+                 int write, void *arg)
+{
+  struct UPT_info *ui = arg;
+  pid_t pid = ui->pid;
+  gregset_t regs;
+  char *r;
+
+#if UNW_DEBUG
+  Debug(16, "using getregs: reg: %s [%u], val: %lx, write: %u\n", unw_regname(reg), (unsigned) reg, (long) val, write);
+
+  if (write)
+    Debug (16, "%s [%u] <- %lx\n", unw_regname (reg), (unsigned) reg, (long) *val);
 #endif
+  if ((unsigned) reg >= ARRAY_SIZE (_UPT_reg_offset))
+    {
+      errno = EINVAL;
+      goto badreg;
+    }
+  r = (char *)&regs + _UPT_reg_offset[reg];
+  if (ptrace(PT_GETREGS, pid, (caddr_t)&regs, 0) == -1)
+    goto badreg;
+  if (write) {
+      memcpy(r, val, sizeof(unw_word_t));
+      if (ptrace(PT_SETREGS, pid, (caddr_t)&regs, 0) == -1)
+        goto badreg;
+  } else
+      memcpy(val, r, sizeof(unw_word_t));
   return 0;
 
  badreg:
-  Debug (1, "bad register number %u (error: %s)\n", reg, strerror (errno));
+  Debug (1, "bad register %s [%u] (error: %s)\n", unw_regname(reg), reg, strerror (errno));
   return -UNW_EBADREG;
 }
+#else
+#error Port me
+#endif
diff --git a/frysk-imports/libunwind/src/ptrace/_UPT_accessors.c b/frysk-imports/libunwind/src/ptrace/_UPT_accessors.c
index 3feb60b..3190e78 100644
--- a/frysk-imports/libunwind/src/ptrace/_UPT_accessors.c
+++ b/frysk-imports/libunwind/src/ptrace/_UPT_accessors.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -27,12 +27,12 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 PROTECTED unw_accessors_t _UPT_accessors =
   {
-    .find_proc_info		= _UPT_find_proc_info,
-    .put_unwind_info		= _UPT_put_unwind_info,
-    .get_dyn_info_list_addr	= _UPT_get_dyn_info_list_addr,
-    .access_mem			= _UPT_access_mem,
-    .access_reg			= _UPT_access_reg,
-    .access_fpreg		= _UPT_access_fpreg,
-    .resume			= _UPT_resume,
-    .get_proc_name		= _UPT_get_proc_name
+    .find_proc_info             = _UPT_find_proc_info,
+    .put_unwind_info            = _UPT_put_unwind_info,
+    .get_dyn_info_list_addr     = _UPT_get_dyn_info_list_addr,
+    .access_mem                 = _UPT_access_mem,
+    .access_reg                 = _UPT_access_reg,
+    .access_fpreg               = _UPT_access_fpreg,
+    .resume                     = _UPT_resume,
+    .get_proc_name              = _UPT_get_proc_name
   };
diff --git a/frysk-imports/libunwind/src/ptrace/_UPT_create.c b/frysk-imports/libunwind/src/ptrace/_UPT_create.c
index 2a4427b..dd59e97 100644
--- a/frysk-imports/libunwind/src/ptrace/_UPT_create.c
+++ b/frysk-imports/libunwind/src/ptrace/_UPT_create.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -37,5 +37,10 @@ _UPT_create (pid_t pid)
 
   memset (ui, 0, sizeof (*ui));
   ui->pid = pid;
+  ui->edi.di_cache.format = -1;
+  ui->edi.di_debug.format = -1;
+#if UNW_TARGET_IA64
+  ui->edi.ktab.format = -1;
+#endif
   return ui;
 }
diff --git a/frysk-imports/libunwind/src/ptrace/_UPT_destroy.c b/frysk-imports/libunwind/src/ptrace/_UPT_destroy.c
index 52cf543..edb664c 100644
--- a/frysk-imports/libunwind/src/ptrace/_UPT_destroy.c
+++ b/frysk-imports/libunwind/src/ptrace/_UPT_destroy.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -26,7 +26,9 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #include "_UPT_internal.h"
 
 void
-_UPT_destroy (void *ui)
+_UPT_destroy (void *ptr)
 {
-  free (ui);
+  struct UPT_info *ui = (struct UPT_info *) ptr;
+  invalidate_edi (&ui->edi);
+  free (ptr);
 }
diff --git a/frysk-imports/libunwind/src/ptrace/_UPT_elf.c b/frysk-imports/libunwind/src/ptrace/_UPT_elf.c
index cf0480f..efc43b5 100644
--- a/frysk-imports/libunwind/src/ptrace/_UPT_elf.c
+++ b/frysk-imports/libunwind/src/ptrace/_UPT_elf.c
@@ -1,5 +1,5 @@
 /* We need to get a separate copy of the ELF-code into
    libunwind-ptrace since it cannot (and must not) have any ELF
    dependencies on libunwind.  */
-#include "libunwind_i.h"	/* get ELFCLASS defined */
+#include "libunwind_i.h"        /* get ELFCLASS defined */
 #include "../elfxx.c"
diff --git a/frysk-imports/libunwind/src/ptrace/_UPT_find_proc_info.c b/frysk-imports/libunwind/src/ptrace/_UPT_find_proc_info.c
index 9f4ed38..d2a37ea 100644
--- a/frysk-imports/libunwind/src/ptrace/_UPT_find_proc_info.c
+++ b/frysk-imports/libunwind/src/ptrace/_UPT_find_proc_info.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003-2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -32,367 +32,114 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 #include "_UPT_internal.h"
 
-#if UNW_TARGET_IA64
-
-#include "elf64.h"
-
-static unw_word_t
-find_gp (struct UPT_info *ui, Elf64_Phdr *pdyn, Elf64_Addr load_base)
-{
-  Elf64_Off soff, str_soff;
-  Elf64_Ehdr *ehdr = ui->ei.image;
-  Elf64_Shdr *shdr;
-  Elf64_Shdr *str_shdr;
-  Elf64_Addr gp = 0;
-  char *strtab;
-  int i;
-
-  if (pdyn)
-    {
-      /* If we have a PT_DYNAMIC program header, fetch the gp-value
-	 from the DT_PLTGOT entry.  */
-      Elf64_Dyn *dyn = (Elf64_Dyn *) (pdyn->p_offset + (char *) ui->ei.image);
-      for (; dyn->d_tag != DT_NULL; ++dyn)
-	if (dyn->d_tag == DT_PLTGOT)
-	  {
-	    gp = (Elf64_Addr) dyn->d_un.d_ptr + load_base;
-	    goto done;
-	  }
-    }
-
-  /* Without a PT_DYAMIC header, lets try to look for a non-empty .opd
-     section.  If there is such a section, we know it's full of
-     function descriptors, and we can simply pick up the gp from the
-     second word of the first entry in this table.  */
-
-  soff = ehdr->e_shoff;
-  str_soff = soff + (ehdr->e_shstrndx * ehdr->e_shentsize);
-
-  if (soff + ehdr->e_shnum * ehdr->e_shentsize > ui->ei.size)
-    {
-      Debug (1, "section table outside of image? (%lu > %lu)",
-	     soff + ehdr->e_shnum * ehdr->e_shentsize,
-	     ui->ei.size);
-      goto done;
-    }
-
-  shdr = (Elf64_Shdr *) ((char *) ui->ei.image + soff);
-  str_shdr = (Elf64_Shdr *) ((char *) ui->ei.image + str_soff);
-  strtab = (char *) ui->ei.image + str_shdr->sh_offset;
-  for (i = 0; i < ehdr->e_shnum; ++i)
-    {
-      if (strcmp (strtab + shdr->sh_name, ".opd") == 0
-	  && shdr->sh_size >= 16)
-	{
-	  gp = ((Elf64_Addr *) ((char *) ui->ei.image + shdr->sh_offset))[1];
-	  goto done;
-	}
-      shdr = (Elf64_Shdr *) (((char *) shdr) + ehdr->e_shentsize);
-    }
-
- done:
-  Debug (16, "image at %p, gp = %lx\n", ui->ei.image, gp);
-  return gp;
-}
-
-HIDDEN unw_dyn_info_t *
-_UPTi_find_unwind_table (struct UPT_info *ui, unw_addr_space_t as,
-			 char *path, unw_word_t segbase, unw_word_t mapoff)
-{
-  Elf64_Phdr *phdr, *ptxt = NULL, *punw = NULL, *pdyn = NULL;
-  Elf64_Ehdr *ehdr;
-  int i;
-
-  if (!_Uelf64_valid_object (&ui->ei))
-    return NULL;
-
-  ehdr = ui->ei.image;
-  phdr = (Elf64_Phdr *) ((char *) ui->ei.image + ehdr->e_phoff);
-
-  for (i = 0; i < ehdr->e_phnum; ++i)
-    {
-      switch (phdr[i].p_type)
-	{
-	case PT_LOAD:
-	  if (phdr[i].p_offset == mapoff)
-	    ptxt = phdr + i;
-	  break;
-
-	case PT_IA_64_UNWIND:
-	  punw = phdr + i;
-	  break;
-
-	case PT_DYNAMIC:
-	  pdyn = phdr + i;
-	  break;
-
-	default:
-	  break;
-	}
-    }
-  if (!ptxt || !punw)
-    return NULL;
-
-  ui->di_cache.start_ip = segbase;
-  ui->di_cache.end_ip = ui->di_cache.start_ip + ptxt->p_memsz;
-  ui->di_cache.gp = find_gp (ui, pdyn, segbase - ptxt->p_vaddr);
-  ui->di_cache.format = UNW_INFO_FORMAT_TABLE;
-  ui->di_cache.u.ti.name_ptr = 0;
-  ui->di_cache.u.ti.segbase = segbase;
-  ui->di_cache.u.ti.table_len = punw->p_memsz / sizeof (unw_word_t);
-  ui->di_cache.u.ti.table_data = (unw_word_t *)
-    ((char *) ui->ei.image + (punw->p_vaddr - ptxt->p_vaddr));
-  return &ui->di_cache;
-}
-
-#elif UNW_TARGET_X86 || UNW_TARGET_X86_64 || UNW_TARGET_HPPA || UNW_TARGET_PPC64
-
-#include "dwarf-eh.h"
-#include "dwarf_i.h"
-
-/* We need our own instance of dwarf_read_encoded_pointer() here since
-   the one in dwarf/Gpe.c is not (and should not be) exported.  */
-int
-dwarf_read_encoded_pointer (unw_addr_space_t as, unw_accessors_t *a,
-			    unw_word_t *addr, unsigned char encoding,
-			    const unw_proc_info_t *pi,
-			    unw_word_t *valp, void *arg)
-{
-  return dwarf_read_encoded_pointer_inlined (as, a, addr, encoding,
-					     pi, valp, arg);
-}
-
-HIDDEN unw_dyn_info_t *
-_UPTi_find_unwind_table (struct UPT_info *ui, unw_addr_space_t as,
-			 char *path, unw_word_t segbase, unw_word_t mapoff)
-{
-  Elf_W(Phdr) *phdr, *ptxt = NULL, *peh_hdr = NULL, *pdyn = NULL;
-  unw_word_t addr, eh_frame_start, fde_count, load_base;
-  struct dwarf_eh_frame_hdr *hdr;
-  unw_proc_info_t pi;
-  unw_accessors_t *a;
-  Elf_W(Ehdr) *ehdr;
-  int i, ret;
-
-  /* XXX: Much of this code is Linux/LSB-specific.  */
-
-  if (!elf_w(valid_object) (&ui->ei))
-    return NULL;
-
-  ehdr = ui->ei.image;
-  phdr = (Elf_W(Phdr) *) ((char *) ui->ei.image + ehdr->e_phoff);
-
-  for (i = 0; i < ehdr->e_phnum; ++i)
-    {
-      switch (phdr[i].p_type)
-	{
-	case PT_LOAD:
-	  if (phdr[i].p_offset == mapoff)
-	    ptxt = phdr + i;
-	  break;
-
-	case PT_GNU_EH_FRAME:
-	  peh_hdr = phdr + i;
-	  break;
-
-	case PT_DYNAMIC:
-	  pdyn = phdr + i;
-	  break;
-
-	default:
-	  break;
-	}
-    }
-  if (!ptxt || !peh_hdr)
-    return NULL;
-
-  if (pdyn)
-    {
-      /* For dynamicly linked executables and shared libraries,
-	 DT_PLTGOT is the value that data-relative addresses are
-	 relative to for that object.  We call this the "gp".  */
-	    Elf_W(Dyn) *dyn = (Elf_W(Dyn) *)(pdyn->p_offset
-					     + (char *) ui->ei.image);
-      for (; dyn->d_tag != DT_NULL; ++dyn)
-	if (dyn->d_tag == DT_PLTGOT)
-	  {
-	    /* Assume that _DYNAMIC is writable and GLIBC has
-	       relocated it (true for x86 at least).  */
-	    ui->di_cache.gp = dyn->d_un.d_ptr;
-	    break;
-	  }
-    }
-  else
-    /* Otherwise this is a static executable with no _DYNAMIC.  Assume
-       that data-relative addresses are relative to 0, i.e.,
-       absolute.  */
-    ui->di_cache.gp = 0;
-
-  hdr = (struct dwarf_eh_frame_hdr *) (peh_hdr->p_offset
-				       + (char *) ui->ei.image);
-  if (hdr->version != DW_EH_VERSION)
-    {
-      Debug (1, "table `%s' has unexpected version %d\n",
-	     path, hdr->version);
-      return 0;
-    }
-
-  a = unw_get_accessors (unw_local_addr_space);
-  addr = (unw_word_t) (hdr + 1);
-
-  /* Fill in a dummy proc_info structure.  We just need to fill in
-     enough to ensure that dwarf_read_encoded_pointer() can do it's
-     job.  Since we don't have a procedure-context at this point, all
-     we have to do is fill in the global-pointer.  */
-  memset (&pi, 0, sizeof (pi));
-  pi.gp = ui->di_cache.gp;
-
-  /* (Optionally) read eh_frame_ptr: */
-  if ((ret = dwarf_read_encoded_pointer (unw_local_addr_space, a,
-					 &addr, hdr->eh_frame_ptr_enc, &pi,
-					 &eh_frame_start, NULL)) < 0)
-    return NULL;
-
-  /* (Optionally) read fde_count: */
-  if ((ret = dwarf_read_encoded_pointer (unw_local_addr_space, a,
-					 &addr, hdr->fde_count_enc, &pi,
-					 &fde_count, NULL)) < 0)
-    return NULL;
-
-  if (hdr->table_enc != (DW_EH_PE_datarel | DW_EH_PE_sdata4))
-    {
-      abort ();
-#if 0
-      /* If there is no search table or it has an unsupported
-	 encoding, fall back on linear search.  */
-      if (hdr->table_enc == DW_EH_PE_omit)
-	Debug (4, "table `%s' lacks search table; doing linear search\n",
-	       info->dlpi_name);
-      else
-	Debug (4, "table `%s' has encoding 0x%x; doing linear search\n",
-	       info->dlpi_name, hdr->table_enc);
-
-      eh_frame_end = max_load_addr;	/* XXX can we do better? */
-
-      if (hdr->fde_count_enc == DW_EH_PE_omit)
-	fde_count = ~0UL;
-      if (hdr->eh_frame_ptr_enc == DW_EH_PE_omit)
-	abort ();
-
-      cb_data->single_fde = 1;
-      return linear_search (unw_local_addr_space, ip,
-			    eh_frame_start, eh_frame_end, fde_count,
-			    pi, need_unwind_info, NULL);
-#endif
-    }
-
-  load_base = segbase - ptxt->p_vaddr;
-
-  ui->di_cache.start_ip = segbase;
-  ui->di_cache.end_ip = ui->di_cache.start_ip + ptxt->p_memsz;
-  ui->di_cache.format = UNW_INFO_FORMAT_REMOTE_TABLE;
-  ui->di_cache.u.rti.name_ptr = 0;
-  /* two 32-bit values (ip_offset/fde_offset) per table-entry: */
-  ui->di_cache.u.rti.table_len = (fde_count * 8) / sizeof (unw_word_t);
-  ui->di_cache.u.rti.table_data = ((load_base + peh_hdr->p_vaddr)
-				   + (addr - (unw_word_t) ui->ei.image
-				      - peh_hdr->p_offset));
-
-  /* For the binary-search table in the eh_frame_hdr, data-relative
-     means relative to the start of that section... */
-  ui->di_cache.u.rti.segbase = ((load_base + peh_hdr->p_vaddr)
-				+ ((unw_word_t) hdr - (unw_word_t) ui->ei.image
-				   - peh_hdr->p_offset));
-
-  return &ui->di_cache;
-}
-
-#endif /* UNW_TARGET_X86 || UNW_TARGET_X86_64 || UNW_TARGET_HPPA*/
-
-static unw_dyn_info_t *
-get_unwind_info (struct UPT_info *ui, unw_addr_space_t as, unw_word_t ip)
+static int
+get_unwind_info (struct elf_dyn_info *edi, pid_t pid, unw_addr_space_t as, unw_word_t ip)
 {
   unsigned long segbase, mapoff;
   char path[PATH_MAX];
-  unw_dyn_info_t *di;
 
 #if UNW_TARGET_IA64 && defined(__linux)
-  if (!ui->ktab.start_ip && _Uia64_get_kernel_table (&ui->ktab) < 0)
-    return NULL;
+  if (!edi->ktab.start_ip && _Uia64_get_kernel_table (&edi->ktab) < 0)
+    return -UNW_ENOINFO;
 
-  if (ip >= ui->ktab.start_ip && ip < ui->ktab.end_ip)
-    return &ui->ktab;
+  if (edi->ktab.format != -1 && ip >= edi->ktab.start_ip && ip < edi->ktab.end_ip)
+    return 0;
 #endif
 
-  if (ip >= ui->di_cache.start_ip && ip < ui->di_cache.end_ip)
-    return &ui->di_cache;
+  if ((edi->di_cache.format != -1
+       && ip >= edi->di_cache.start_ip && ip < edi->di_cache.end_ip)
+#if UNW_TARGET_ARM
+      || (edi->di_debug.format != -1
+       && ip >= edi->di_arm.start_ip && ip < edi->di_arm.end_ip)
+#endif
+      || (edi->di_debug.format != -1
+       && ip >= edi->di_debug.start_ip && ip < edi->di_debug.end_ip))
+    return 0;
 
-  if (ui->ei.image)
-    {
-      munmap (ui->ei.image, ui->ei.size);
-      ui->ei.image = NULL;
-      ui->ei.size = 0;
+  invalidate_edi(edi);
 
-      /* invalidate the cache: */
-      ui->di_cache.start_ip = ui->di_cache.end_ip = 0;
-    }
-
-  if (tdep_get_elf_image (&ui->ei, ui->pid, ip, &segbase, &mapoff) < 0)
-    return NULL;
+  if (tdep_get_elf_image (&edi->ei, pid, ip, &segbase, &mapoff, path,
+                          sizeof(path)) < 0)
+    return -UNW_ENOINFO;
 
   /* Here, SEGBASE is the starting-address of the (mmap'ped) segment
      which covers the IP we're looking for.  */
-  di = _UPTi_find_unwind_table (ui, as, path, segbase, mapoff);
-  if (!di
-      /* This can happen in corner cases where dynamically generated
-         code falls into the same page that contains the data-segment
-         and the page-offset of the code is within the first page of
-         the executable.  */
-      || ip < di->start_ip || ip >= di->end_ip)
-    return NULL;
+  if (tdep_find_unwind_table (edi, as, path, segbase, mapoff, ip) < 0)
+    return -UNW_ENOINFO;
 
-  return di;
+  /* This can happen in corner cases where dynamically generated
+     code falls into the same page that contains the data-segment
+     and the page-offset of the code is within the first page of
+     the executable.  */
+  if (edi->di_cache.format != -1
+      && (ip < edi->di_cache.start_ip || ip >= edi->di_cache.end_ip))
+     edi->di_cache.format = -1;
+
+  if (edi->di_debug.format != -1
+      && (ip < edi->di_debug.start_ip || ip >= edi->di_debug.end_ip))
+     edi->di_debug.format = -1;
+
+  if (edi->di_cache.format == -1
+#if UNW_TARGET_ARM
+      && edi->di_arm.format == -1
+#endif
+      && edi->di_debug.format == -1)
+    return -UNW_ENOINFO;
+
+  return 0;
 }
 
 int
 _UPT_find_proc_info (unw_addr_space_t as, unw_word_t ip, unw_proc_info_t *pi,
-		     int need_unwind_info, void *arg)
+                     int need_unwind_info, void *arg)
 {
   struct UPT_info *ui = arg;
-  unw_dyn_info_t *di;
+  int ret = -UNW_ENOINFO;
 
-  di = get_unwind_info (ui, as, ip);
-  if (!di)
+  if (get_unwind_info (&ui->edi, ui->pid, as, ip) < 0)
     return -UNW_ENOINFO;
 
 #if UNW_TARGET_IA64
-  if (di == &ui->ktab)
+  if (ui->edi.ktab.format != -1)
     {
       /* The kernel unwind table resides in local memory, so we have
-	 to use the local address space to search it.  Since
-	 _UPT_put_unwind_info() has no easy way of detecting this
-	 case, we simply make a copy of the unwind-info, so
-	 _UPT_put_unwind_info() can always free() the unwind-info
-	 without ill effects.  */
-      int ret = tdep_search_unwind_table (unw_local_addr_space, ip, di, pi,
-					  need_unwind_info, arg);
+         to use the local address space to search it.  Since
+         _UPT_put_unwind_info() has no easy way of detecting this
+         case, we simply make a copy of the unwind-info, so
+         _UPT_put_unwind_info() can always free() the unwind-info
+         without ill effects.  */
+      ret = tdep_search_unwind_table (unw_local_addr_space, ip, &ui->edi.ktab, pi,
+                                      need_unwind_info, arg);
       if (ret >= 0)
-	{
-	  if (!need_unwind_info)
-	    pi->unwind_info = NULL;
-	  else
-	    {
-	      void *mem = malloc (pi->unwind_info_size);
-
-	      if (!mem)
-		return -UNW_ENOMEM;
-	      memcpy (mem, pi->unwind_info, pi->unwind_info_size);
-	      pi->unwind_info = mem;
-	    }
-	}
-      return ret;
+        {
+          if (!need_unwind_info)
+            pi->unwind_info = NULL;
+          else
+            {
+              void *mem = malloc (pi->unwind_info_size);
+
+              if (!mem)
+                return -UNW_ENOMEM;
+              memcpy (mem, pi->unwind_info, pi->unwind_info_size);
+              pi->unwind_info = mem;
+            }
+        }
     }
-  else
 #endif
-  return tdep_search_unwind_table (as, ip, di, pi, need_unwind_info, arg);
+
+  if (ret == -UNW_ENOINFO && ui->edi.di_cache.format != -1)
+    ret = tdep_search_unwind_table (as, ip, &ui->edi.di_cache,
+                                    pi, need_unwind_info, arg);
+
+#if UNW_TARGET_ARM
+  if (ret == -UNW_ENOINFO && ui->edi.di_arm.format != -1)
+    ret = tdep_search_unwind_table (as, ip, &ui->edi.di_arm, pi,
+                                    need_unwind_info, arg);
+#endif
+
+  if (ret == -UNW_ENOINFO && ui->edi.di_debug.format != -1)
+    ret = tdep_search_unwind_table (as, ip, &ui->edi.di_debug, pi,
+                                    need_unwind_info, arg);
+
+  return ret;
 }
diff --git a/frysk-imports/libunwind/src/ptrace/_UPT_get_dyn_info_list_addr.c b/frysk-imports/libunwind/src/ptrace/_UPT_get_dyn_info_list_addr.c
index e0ea2f4..cc5ed04 100644
--- a/frysk-imports/libunwind/src/ptrace/_UPT_get_dyn_info_list_addr.c
+++ b/frysk-imports/libunwind/src/ptrace/_UPT_get_dyn_info_list_addr.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003-2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -31,47 +31,38 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 static inline int
 get_list_addr (unw_addr_space_t as, unw_word_t *dil_addr, void *arg,
-	       int *countp)
+               int *countp)
 {
   unsigned long lo, hi, off;
   struct UPT_info *ui = arg;
   struct map_iterator mi;
   char path[PATH_MAX];
-  unw_dyn_info_t *di;
   unw_word_t res;
   int count = 0;
 
   maps_init (&mi, ui->pid);
-  while (maps_next (&mi, &lo, &hi, &off, path, sizeof (path)))
+  while (maps_next (&mi, &lo, &hi, &off))
     {
       if (off)
-	continue;
+        continue;
 
-      if (ui->ei.image)
-	{
-	  munmap (ui->ei.image, ui->ei.size);
-	  ui->ei.image = NULL;
-	  ui->ei.size = 0;
-	  /* invalidate the cache: */
-	  ui->di_cache.start_ip = ui->di_cache.end_ip = 0;
-	}
+      invalidate_edi(&ui->edi);
 
-      if (elf_map_image (&ui->ei, path) < 0)
-	/* ignore unmappable stuff like "/SYSV00001b58 (deleted)" */
-	continue;
+      if (elf_map_image (&ui->edi.ei, path) < 0)
+        /* ignore unmappable stuff like "/SYSV00001b58 (deleted)" */
+        continue;
 
       Debug (16, "checking object %s\n", path);
 
-      di = _UPTi_find_unwind_table (ui, as, path, lo, off);
-      if (di)
-	{
-	  res = _Uia64_find_dyn_list (as, di, arg);
-	  if (res && count++ == 0)
-	    {
-	      Debug (12, "dyn_info_list_addr = 0x%lx\n", (long) res);
-	      *dil_addr = res;
-	    }
-	}
+      if (tdep_find_unwind_table (&ui->edi, as, path, lo, off, 0) > 0)
+        {
+          res = _Uia64_find_dyn_list (as, &ui->edi.di_cache, arg);
+          if (res && count++ == 0)
+            {
+              Debug (12, "dyn_info_list_addr = 0x%lx\n", (long) res);
+              *dil_addr = res;
+            }
+        }
     }
   maps_close (&mi);
   *countp = count;
@@ -82,7 +73,7 @@ get_list_addr (unw_addr_space_t as, unw_word_t *dil_addr, void *arg,
 
 static inline int
 get_list_addr (unw_addr_space_t as, unw_word_t *dil_addr, void *arg,
-	       int *countp)
+               int *countp)
 {
 # warning Implement get_list_addr(), please.
   *countp = 0;
@@ -93,7 +84,7 @@ get_list_addr (unw_addr_space_t as, unw_word_t *dil_addr, void *arg,
 
 int
 _UPT_get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dil_addr,
-			     void *arg)
+                             void *arg)
 {
   int count, ret;
 
diff --git a/frysk-imports/libunwind/src/ptrace/_UPT_get_proc_name.c b/frysk-imports/libunwind/src/ptrace/_UPT_get_proc_name.c
index 6ac85a0..79c1f38 100644
--- a/frysk-imports/libunwind/src/ptrace/_UPT_get_proc_name.c
+++ b/frysk-imports/libunwind/src/ptrace/_UPT_get_proc_name.c
@@ -1,7 +1,7 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003 Hewlett-Packard Co
    Copyright (C) 2007 David Mosberger-Tang
-	Contributed by David Mosberger-Tang <dmosberger@gmail.com>
+        Contributed by David Mosberger-Tang <dmosberger@gmail.com>
 
 This file is part of libunwind.
 
@@ -28,7 +28,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 int
 _UPT_get_proc_name (unw_addr_space_t as, unw_word_t ip,
-		    char *buf, size_t buf_len, unw_word_t *offp, void *arg)
+                    char *buf, size_t buf_len, unw_word_t *offp, void *arg)
 {
   struct UPT_info *ui = arg;
 
diff --git a/frysk-imports/libunwind/src/ptrace/_UPT_internal.h b/frysk-imports/libunwind/src/ptrace/_UPT_internal.h
index 0577097..5cef257 100644
--- a/frysk-imports/libunwind/src/ptrace/_UPT_internal.h
+++ b/frysk-imports/libunwind/src/ptrace/_UPT_internal.h
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003, 2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -26,32 +26,34 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #ifndef _UPT_internal_h
 #define _UPT_internal_h
 
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_PTRACE_H
+#include <sys/ptrace.h>
+#endif
+#ifdef HAVE_SYS_PROCFS_H
+#include <sys/procfs.h>
+#endif
+
 #include <errno.h>
 #include <libunwind-ptrace.h>
 #include <limits.h>
 #include <stdio.h>
 #include <stdlib.h>
 
-#include <sys/ptrace.h>
-
 #include "libunwind_i.h"
 
 struct UPT_info
   {
-    pid_t pid;		/* the process-id of the child we're unwinding */
-    struct elf_image ei;
-    unw_dyn_info_t di_cache;
-#if UNW_TARGET_IA64
-    unw_dyn_info_t ktab;
-#endif
+    pid_t pid;          /* the process-id of the child we're unwinding */
+    struct elf_dyn_info edi;
   };
 
-extern int _UPT_reg_offset[UNW_REG_LAST + 1];
-
-extern unw_dyn_info_t *_UPTi_find_unwind_table (struct UPT_info *ui,
-						unw_addr_space_t as,
-						char *path,
-						unw_word_t segbase,
-						unw_word_t mapoff);
+extern const int _UPT_reg_offset[UNW_REG_LAST + 1];
 
 #endif /* _UPT_internal_h */
diff --git a/frysk-imports/libunwind/src/ptrace/_UPT_put_unwind_info.c b/frysk-imports/libunwind/src/ptrace/_UPT_put_unwind_info.c
index 852dd86..d4b8463 100644
--- a/frysk-imports/libunwind/src/ptrace/_UPT_put_unwind_info.c
+++ b/frysk-imports/libunwind/src/ptrace/_UPT_put_unwind_info.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
diff --git a/frysk-imports/libunwind/src/ptrace/_UPT_reg_offset.c b/frysk-imports/libunwind/src/ptrace/_UPT_reg_offset.c
index f586fb7..68461a2 100644
--- a/frysk-imports/libunwind/src/ptrace/_UPT_reg_offset.c
+++ b/frysk-imports/libunwind/src/ptrace/_UPT_reg_offset.c
@@ -1,6 +1,7 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003-2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+   Copyright (C) 2013 Linaro Limited
 
 This file is part of libunwind.
 
@@ -25,271 +26,575 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 #include "_UPT_internal.h"
 
+#include <stddef.h>
+
 #ifdef HAVE_ASM_PTRACE_OFFSETS_H
 # include <asm/ptrace_offsets.h>
 #endif
 
-int _UPT_reg_offset[UNW_REG_LAST + 1] =
+const int _UPT_reg_offset[UNW_REG_LAST + 1] =
   {
 #ifdef HAVE_ASM_PTRACE_OFFSETS_H
 # ifndef PT_AR_CSD
-#  define PT_AR_CSD	-1	/* this was introduced with rev 2.1 of ia64 */
+#  define PT_AR_CSD     -1      /* this was introduced with rev 2.1 of ia64 */
 # endif
 
-    [UNW_IA64_GR +  0]	= -1,		[UNW_IA64_GR +  1]	= PT_R1,
-    [UNW_IA64_GR +  2]	= PT_R2,	[UNW_IA64_GR +  3]	= PT_R3,
-    [UNW_IA64_GR +  4]	= PT_R4,	[UNW_IA64_GR +  5]	= PT_R5,
-    [UNW_IA64_GR +  6]	= PT_R6,	[UNW_IA64_GR +  7]	= PT_R7,
-    [UNW_IA64_GR +  8]	= PT_R8,	[UNW_IA64_GR +  9]	= PT_R9,
-    [UNW_IA64_GR + 10]	= PT_R10,	[UNW_IA64_GR + 11]	= PT_R11,
-    [UNW_IA64_GR + 12]	= PT_R12,	[UNW_IA64_GR + 13]	= PT_R13,
-    [UNW_IA64_GR + 14]	= PT_R14,	[UNW_IA64_GR + 15]	= PT_R15,
-    [UNW_IA64_GR + 16]	= PT_R16,	[UNW_IA64_GR + 17]	= PT_R17,
-    [UNW_IA64_GR + 18]	= PT_R18,	[UNW_IA64_GR + 19]	= PT_R19,
-    [UNW_IA64_GR + 20]	= PT_R20,	[UNW_IA64_GR + 21]	= PT_R21,
-    [UNW_IA64_GR + 22]	= PT_R22,	[UNW_IA64_GR + 23]	= PT_R23,
-    [UNW_IA64_GR + 24]	= PT_R24,	[UNW_IA64_GR + 25]	= PT_R25,
-    [UNW_IA64_GR + 26]	= PT_R26,	[UNW_IA64_GR + 27]	= PT_R27,
-    [UNW_IA64_GR + 28]	= PT_R28,	[UNW_IA64_GR + 29]	= PT_R29,
-    [UNW_IA64_GR + 30]	= PT_R30,	[UNW_IA64_GR + 31]	= PT_R31,
+    [UNW_IA64_GR +  0]  = -1,           [UNW_IA64_GR +  1]      = PT_R1,
+    [UNW_IA64_GR +  2]  = PT_R2,        [UNW_IA64_GR +  3]      = PT_R3,
+    [UNW_IA64_GR +  4]  = PT_R4,        [UNW_IA64_GR +  5]      = PT_R5,
+    [UNW_IA64_GR +  6]  = PT_R6,        [UNW_IA64_GR +  7]      = PT_R7,
+    [UNW_IA64_GR +  8]  = PT_R8,        [UNW_IA64_GR +  9]      = PT_R9,
+    [UNW_IA64_GR + 10]  = PT_R10,       [UNW_IA64_GR + 11]      = PT_R11,
+    [UNW_IA64_GR + 12]  = PT_R12,       [UNW_IA64_GR + 13]      = PT_R13,
+    [UNW_IA64_GR + 14]  = PT_R14,       [UNW_IA64_GR + 15]      = PT_R15,
+    [UNW_IA64_GR + 16]  = PT_R16,       [UNW_IA64_GR + 17]      = PT_R17,
+    [UNW_IA64_GR + 18]  = PT_R18,       [UNW_IA64_GR + 19]      = PT_R19,
+    [UNW_IA64_GR + 20]  = PT_R20,       [UNW_IA64_GR + 21]      = PT_R21,
+    [UNW_IA64_GR + 22]  = PT_R22,       [UNW_IA64_GR + 23]      = PT_R23,
+    [UNW_IA64_GR + 24]  = PT_R24,       [UNW_IA64_GR + 25]      = PT_R25,
+    [UNW_IA64_GR + 26]  = PT_R26,       [UNW_IA64_GR + 27]      = PT_R27,
+    [UNW_IA64_GR + 28]  = PT_R28,       [UNW_IA64_GR + 29]      = PT_R29,
+    [UNW_IA64_GR + 30]  = PT_R30,       [UNW_IA64_GR + 31]      = PT_R31,
 
-    [UNW_IA64_NAT+  0]	= -1,		[UNW_IA64_NAT+  1]	= PT_NAT_BITS,
-    [UNW_IA64_NAT+  2]	= PT_NAT_BITS,	[UNW_IA64_NAT+  3]	= PT_NAT_BITS,
-    [UNW_IA64_NAT+  4]	= PT_NAT_BITS,	[UNW_IA64_NAT+  5]	= PT_NAT_BITS,
-    [UNW_IA64_NAT+  6]	= PT_NAT_BITS,	[UNW_IA64_NAT+  7]	= PT_NAT_BITS,
-    [UNW_IA64_NAT+  8]	= PT_NAT_BITS,	[UNW_IA64_NAT+  9]	= PT_NAT_BITS,
-    [UNW_IA64_NAT+ 10]	= PT_NAT_BITS,	[UNW_IA64_NAT+ 11]	= PT_NAT_BITS,
-    [UNW_IA64_NAT+ 12]	= PT_NAT_BITS,	[UNW_IA64_NAT+ 13]	= PT_NAT_BITS,
-    [UNW_IA64_NAT+ 14]	= PT_NAT_BITS,	[UNW_IA64_NAT+ 15]	= PT_NAT_BITS,
-    [UNW_IA64_NAT+ 16]	= PT_NAT_BITS,	[UNW_IA64_NAT+ 17]	= PT_NAT_BITS,
-    [UNW_IA64_NAT+ 18]	= PT_NAT_BITS,	[UNW_IA64_NAT+ 19]	= PT_NAT_BITS,
-    [UNW_IA64_NAT+ 20]	= PT_NAT_BITS,	[UNW_IA64_NAT+ 21]	= PT_NAT_BITS,
-    [UNW_IA64_NAT+ 22]	= PT_NAT_BITS,	[UNW_IA64_NAT+ 23]	= PT_NAT_BITS,
-    [UNW_IA64_NAT+ 24]	= PT_NAT_BITS,	[UNW_IA64_NAT+ 25]	= PT_NAT_BITS,
-    [UNW_IA64_NAT+ 26]	= PT_NAT_BITS,	[UNW_IA64_NAT+ 27]	= PT_NAT_BITS,
-    [UNW_IA64_NAT+ 28]	= PT_NAT_BITS,	[UNW_IA64_NAT+ 29]	= PT_NAT_BITS,
-    [UNW_IA64_NAT+ 30]	= PT_NAT_BITS,	[UNW_IA64_NAT+ 31]	= PT_NAT_BITS,
+    [UNW_IA64_NAT+  0]  = -1,           [UNW_IA64_NAT+  1]      = PT_NAT_BITS,
+    [UNW_IA64_NAT+  2]  = PT_NAT_BITS,  [UNW_IA64_NAT+  3]      = PT_NAT_BITS,
+    [UNW_IA64_NAT+  4]  = PT_NAT_BITS,  [UNW_IA64_NAT+  5]      = PT_NAT_BITS,
+    [UNW_IA64_NAT+  6]  = PT_NAT_BITS,  [UNW_IA64_NAT+  7]      = PT_NAT_BITS,
+    [UNW_IA64_NAT+  8]  = PT_NAT_BITS,  [UNW_IA64_NAT+  9]      = PT_NAT_BITS,
+    [UNW_IA64_NAT+ 10]  = PT_NAT_BITS,  [UNW_IA64_NAT+ 11]      = PT_NAT_BITS,
+    [UNW_IA64_NAT+ 12]  = PT_NAT_BITS,  [UNW_IA64_NAT+ 13]      = PT_NAT_BITS,
+    [UNW_IA64_NAT+ 14]  = PT_NAT_BITS,  [UNW_IA64_NAT+ 15]      = PT_NAT_BITS,
+    [UNW_IA64_NAT+ 16]  = PT_NAT_BITS,  [UNW_IA64_NAT+ 17]      = PT_NAT_BITS,
+    [UNW_IA64_NAT+ 18]  = PT_NAT_BITS,  [UNW_IA64_NAT+ 19]      = PT_NAT_BITS,
+    [UNW_IA64_NAT+ 20]  = PT_NAT_BITS,  [UNW_IA64_NAT+ 21]      = PT_NAT_BITS,
+    [UNW_IA64_NAT+ 22]  = PT_NAT_BITS,  [UNW_IA64_NAT+ 23]      = PT_NAT_BITS,
+    [UNW_IA64_NAT+ 24]  = PT_NAT_BITS,  [UNW_IA64_NAT+ 25]      = PT_NAT_BITS,
+    [UNW_IA64_NAT+ 26]  = PT_NAT_BITS,  [UNW_IA64_NAT+ 27]      = PT_NAT_BITS,
+    [UNW_IA64_NAT+ 28]  = PT_NAT_BITS,  [UNW_IA64_NAT+ 29]      = PT_NAT_BITS,
+    [UNW_IA64_NAT+ 30]  = PT_NAT_BITS,  [UNW_IA64_NAT+ 31]      = PT_NAT_BITS,
 
-    [UNW_IA64_FR +  0]	= -1,		[UNW_IA64_FR +  1]	= -1,
-    [UNW_IA64_FR +  2]	= PT_F2,	[UNW_IA64_FR +  3]	= PT_F3,
-    [UNW_IA64_FR +  4]	= PT_F4,	[UNW_IA64_FR +  5]	= PT_F5,
-    [UNW_IA64_FR +  6]	= PT_F6,	[UNW_IA64_FR +  7]	= PT_F7,
-    [UNW_IA64_FR +  8]	= PT_F8,	[UNW_IA64_FR +  9]	= PT_F9,
-    [UNW_IA64_FR + 10]	= PT_F10,	[UNW_IA64_FR + 11]	= PT_F11,
-    [UNW_IA64_FR + 12]	= PT_F12,	[UNW_IA64_FR + 13]	= PT_F13,
-    [UNW_IA64_FR + 14]	= PT_F14,	[UNW_IA64_FR + 15]	= PT_F15,
-    [UNW_IA64_FR + 16]	= PT_F16,	[UNW_IA64_FR + 17]	= PT_F17,
-    [UNW_IA64_FR + 18]	= PT_F18,	[UNW_IA64_FR + 19]	= PT_F19,
-    [UNW_IA64_FR + 20]	= PT_F20,	[UNW_IA64_FR + 21]	= PT_F21,
-    [UNW_IA64_FR + 22]	= PT_F22,	[UNW_IA64_FR + 23]	= PT_F23,
-    [UNW_IA64_FR + 24]	= PT_F24,	[UNW_IA64_FR + 25]	= PT_F25,
-    [UNW_IA64_FR + 26]	= PT_F26,	[UNW_IA64_FR + 27]	= PT_F27,
-    [UNW_IA64_FR + 28]	= PT_F28,	[UNW_IA64_FR + 29]	= PT_F29,
-    [UNW_IA64_FR + 30]	= PT_F30,	[UNW_IA64_FR + 31]	= PT_F31,
-    [UNW_IA64_FR + 32]	= PT_F32,	[UNW_IA64_FR + 33]	= PT_F33,
-    [UNW_IA64_FR + 34]	= PT_F34,	[UNW_IA64_FR + 35]	= PT_F35,
-    [UNW_IA64_FR + 36]	= PT_F36,	[UNW_IA64_FR + 37]	= PT_F37,
-    [UNW_IA64_FR + 38]	= PT_F38,	[UNW_IA64_FR + 39]	= PT_F39,
-    [UNW_IA64_FR + 40]	= PT_F40,	[UNW_IA64_FR + 41]	= PT_F41,
-    [UNW_IA64_FR + 42]	= PT_F42,	[UNW_IA64_FR + 43]	= PT_F43,
-    [UNW_IA64_FR + 44]	= PT_F44,	[UNW_IA64_FR + 45]	= PT_F45,
-    [UNW_IA64_FR + 46]	= PT_F46,	[UNW_IA64_FR + 47]	= PT_F47,
-    [UNW_IA64_FR + 48]	= PT_F48,	[UNW_IA64_FR + 49]	= PT_F49,
-    [UNW_IA64_FR + 50]	= PT_F50,	[UNW_IA64_FR + 51]	= PT_F51,
-    [UNW_IA64_FR + 52]	= PT_F52,	[UNW_IA64_FR + 53]	= PT_F53,
-    [UNW_IA64_FR + 54]	= PT_F54,	[UNW_IA64_FR + 55]	= PT_F55,
-    [UNW_IA64_FR + 56]	= PT_F56,	[UNW_IA64_FR + 57]	= PT_F57,
-    [UNW_IA64_FR + 58]	= PT_F58,	[UNW_IA64_FR + 59]	= PT_F59,
-    [UNW_IA64_FR + 60]	= PT_F60,	[UNW_IA64_FR + 61]	= PT_F61,
-    [UNW_IA64_FR + 62]	= PT_F62,	[UNW_IA64_FR + 63]	= PT_F63,
-    [UNW_IA64_FR + 64]	= PT_F64,	[UNW_IA64_FR + 65]	= PT_F65,
-    [UNW_IA64_FR + 66]	= PT_F66,	[UNW_IA64_FR + 67]	= PT_F67,
-    [UNW_IA64_FR + 68]	= PT_F68,	[UNW_IA64_FR + 69]	= PT_F69,
-    [UNW_IA64_FR + 70]	= PT_F70,	[UNW_IA64_FR + 71]	= PT_F71,
-    [UNW_IA64_FR + 72]	= PT_F72,	[UNW_IA64_FR + 73]	= PT_F73,
-    [UNW_IA64_FR + 74]	= PT_F74,	[UNW_IA64_FR + 75]	= PT_F75,
-    [UNW_IA64_FR + 76]	= PT_F76,	[UNW_IA64_FR + 77]	= PT_F77,
-    [UNW_IA64_FR + 78]	= PT_F78,	[UNW_IA64_FR + 79]	= PT_F79,
-    [UNW_IA64_FR + 80]	= PT_F80,	[UNW_IA64_FR + 81]	= PT_F81,
-    [UNW_IA64_FR + 82]	= PT_F82,	[UNW_IA64_FR + 83]	= PT_F83,
-    [UNW_IA64_FR + 84]	= PT_F84,	[UNW_IA64_FR + 85]	= PT_F85,
-    [UNW_IA64_FR + 86]	= PT_F86,	[UNW_IA64_FR + 87]	= PT_F87,
-    [UNW_IA64_FR + 88]	= PT_F88,	[UNW_IA64_FR + 89]	= PT_F89,
-    [UNW_IA64_FR + 90]	= PT_F90,	[UNW_IA64_FR + 91]	= PT_F91,
-    [UNW_IA64_FR + 92]	= PT_F92,	[UNW_IA64_FR + 93]	= PT_F93,
-    [UNW_IA64_FR + 94]	= PT_F94,	[UNW_IA64_FR + 95]	= PT_F95,
-    [UNW_IA64_FR + 96]	= PT_F96,	[UNW_IA64_FR + 97]	= PT_F97,
-    [UNW_IA64_FR + 98]	= PT_F98,	[UNW_IA64_FR + 99]	= PT_F99,
-    [UNW_IA64_FR +100]	= PT_F100,	[UNW_IA64_FR +101]	= PT_F101,
-    [UNW_IA64_FR +102]	= PT_F102,	[UNW_IA64_FR +103]	= PT_F103,
-    [UNW_IA64_FR +104]	= PT_F104,	[UNW_IA64_FR +105]	= PT_F105,
-    [UNW_IA64_FR +106]	= PT_F106,	[UNW_IA64_FR +107]	= PT_F107,
-    [UNW_IA64_FR +108]	= PT_F108,	[UNW_IA64_FR +109]	= PT_F109,
-    [UNW_IA64_FR +110]	= PT_F110,	[UNW_IA64_FR +111]	= PT_F111,
-    [UNW_IA64_FR +112]	= PT_F112,	[UNW_IA64_FR +113]	= PT_F113,
-    [UNW_IA64_FR +114]	= PT_F114,	[UNW_IA64_FR +115]	= PT_F115,
-    [UNW_IA64_FR +116]	= PT_F116,	[UNW_IA64_FR +117]	= PT_F117,
-    [UNW_IA64_FR +118]	= PT_F118,	[UNW_IA64_FR +119]	= PT_F119,
-    [UNW_IA64_FR +120]	= PT_F120,	[UNW_IA64_FR +121]	= PT_F121,
-    [UNW_IA64_FR +122]	= PT_F122,	[UNW_IA64_FR +123]	= PT_F123,
-    [UNW_IA64_FR +124]	= PT_F124,	[UNW_IA64_FR +125]	= PT_F125,
-    [UNW_IA64_FR +126]	= PT_F126,	[UNW_IA64_FR +127]	= PT_F127,
+    [UNW_IA64_FR +  0]  = -1,           [UNW_IA64_FR +  1]      = -1,
+    [UNW_IA64_FR +  2]  = PT_F2,        [UNW_IA64_FR +  3]      = PT_F3,
+    [UNW_IA64_FR +  4]  = PT_F4,        [UNW_IA64_FR +  5]      = PT_F5,
+    [UNW_IA64_FR +  6]  = PT_F6,        [UNW_IA64_FR +  7]      = PT_F7,
+    [UNW_IA64_FR +  8]  = PT_F8,        [UNW_IA64_FR +  9]      = PT_F9,
+    [UNW_IA64_FR + 10]  = PT_F10,       [UNW_IA64_FR + 11]      = PT_F11,
+    [UNW_IA64_FR + 12]  = PT_F12,       [UNW_IA64_FR + 13]      = PT_F13,
+    [UNW_IA64_FR + 14]  = PT_F14,       [UNW_IA64_FR + 15]      = PT_F15,
+    [UNW_IA64_FR + 16]  = PT_F16,       [UNW_IA64_FR + 17]      = PT_F17,
+    [UNW_IA64_FR + 18]  = PT_F18,       [UNW_IA64_FR + 19]      = PT_F19,
+    [UNW_IA64_FR + 20]  = PT_F20,       [UNW_IA64_FR + 21]      = PT_F21,
+    [UNW_IA64_FR + 22]  = PT_F22,       [UNW_IA64_FR + 23]      = PT_F23,
+    [UNW_IA64_FR + 24]  = PT_F24,       [UNW_IA64_FR + 25]      = PT_F25,
+    [UNW_IA64_FR + 26]  = PT_F26,       [UNW_IA64_FR + 27]      = PT_F27,
+    [UNW_IA64_FR + 28]  = PT_F28,       [UNW_IA64_FR + 29]      = PT_F29,
+    [UNW_IA64_FR + 30]  = PT_F30,       [UNW_IA64_FR + 31]      = PT_F31,
+    [UNW_IA64_FR + 32]  = PT_F32,       [UNW_IA64_FR + 33]      = PT_F33,
+    [UNW_IA64_FR + 34]  = PT_F34,       [UNW_IA64_FR + 35]      = PT_F35,
+    [UNW_IA64_FR + 36]  = PT_F36,       [UNW_IA64_FR + 37]      = PT_F37,
+    [UNW_IA64_FR + 38]  = PT_F38,       [UNW_IA64_FR + 39]      = PT_F39,
+    [UNW_IA64_FR + 40]  = PT_F40,       [UNW_IA64_FR + 41]      = PT_F41,
+    [UNW_IA64_FR + 42]  = PT_F42,       [UNW_IA64_FR + 43]      = PT_F43,
+    [UNW_IA64_FR + 44]  = PT_F44,       [UNW_IA64_FR + 45]      = PT_F45,
+    [UNW_IA64_FR + 46]  = PT_F46,       [UNW_IA64_FR + 47]      = PT_F47,
+    [UNW_IA64_FR + 48]  = PT_F48,       [UNW_IA64_FR + 49]      = PT_F49,
+    [UNW_IA64_FR + 50]  = PT_F50,       [UNW_IA64_FR + 51]      = PT_F51,
+    [UNW_IA64_FR + 52]  = PT_F52,       [UNW_IA64_FR + 53]      = PT_F53,
+    [UNW_IA64_FR + 54]  = PT_F54,       [UNW_IA64_FR + 55]      = PT_F55,
+    [UNW_IA64_FR + 56]  = PT_F56,       [UNW_IA64_FR + 57]      = PT_F57,
+    [UNW_IA64_FR + 58]  = PT_F58,       [UNW_IA64_FR + 59]      = PT_F59,
+    [UNW_IA64_FR + 60]  = PT_F60,       [UNW_IA64_FR + 61]      = PT_F61,
+    [UNW_IA64_FR + 62]  = PT_F62,       [UNW_IA64_FR + 63]      = PT_F63,
+    [UNW_IA64_FR + 64]  = PT_F64,       [UNW_IA64_FR + 65]      = PT_F65,
+    [UNW_IA64_FR + 66]  = PT_F66,       [UNW_IA64_FR + 67]      = PT_F67,
+    [UNW_IA64_FR + 68]  = PT_F68,       [UNW_IA64_FR + 69]      = PT_F69,
+    [UNW_IA64_FR + 70]  = PT_F70,       [UNW_IA64_FR + 71]      = PT_F71,
+    [UNW_IA64_FR + 72]  = PT_F72,       [UNW_IA64_FR + 73]      = PT_F73,
+    [UNW_IA64_FR + 74]  = PT_F74,       [UNW_IA64_FR + 75]      = PT_F75,
+    [UNW_IA64_FR + 76]  = PT_F76,       [UNW_IA64_FR + 77]      = PT_F77,
+    [UNW_IA64_FR + 78]  = PT_F78,       [UNW_IA64_FR + 79]      = PT_F79,
+    [UNW_IA64_FR + 80]  = PT_F80,       [UNW_IA64_FR + 81]      = PT_F81,
+    [UNW_IA64_FR + 82]  = PT_F82,       [UNW_IA64_FR + 83]      = PT_F83,
+    [UNW_IA64_FR + 84]  = PT_F84,       [UNW_IA64_FR + 85]      = PT_F85,
+    [UNW_IA64_FR + 86]  = PT_F86,       [UNW_IA64_FR + 87]      = PT_F87,
+    [UNW_IA64_FR + 88]  = PT_F88,       [UNW_IA64_FR + 89]      = PT_F89,
+    [UNW_IA64_FR + 90]  = PT_F90,       [UNW_IA64_FR + 91]      = PT_F91,
+    [UNW_IA64_FR + 92]  = PT_F92,       [UNW_IA64_FR + 93]      = PT_F93,
+    [UNW_IA64_FR + 94]  = PT_F94,       [UNW_IA64_FR + 95]      = PT_F95,
+    [UNW_IA64_FR + 96]  = PT_F96,       [UNW_IA64_FR + 97]      = PT_F97,
+    [UNW_IA64_FR + 98]  = PT_F98,       [UNW_IA64_FR + 99]      = PT_F99,
+    [UNW_IA64_FR +100]  = PT_F100,      [UNW_IA64_FR +101]      = PT_F101,
+    [UNW_IA64_FR +102]  = PT_F102,      [UNW_IA64_FR +103]      = PT_F103,
+    [UNW_IA64_FR +104]  = PT_F104,      [UNW_IA64_FR +105]      = PT_F105,
+    [UNW_IA64_FR +106]  = PT_F106,      [UNW_IA64_FR +107]      = PT_F107,
+    [UNW_IA64_FR +108]  = PT_F108,      [UNW_IA64_FR +109]      = PT_F109,
+    [UNW_IA64_FR +110]  = PT_F110,      [UNW_IA64_FR +111]      = PT_F111,
+    [UNW_IA64_FR +112]  = PT_F112,      [UNW_IA64_FR +113]      = PT_F113,
+    [UNW_IA64_FR +114]  = PT_F114,      [UNW_IA64_FR +115]      = PT_F115,
+    [UNW_IA64_FR +116]  = PT_F116,      [UNW_IA64_FR +117]      = PT_F117,
+    [UNW_IA64_FR +118]  = PT_F118,      [UNW_IA64_FR +119]      = PT_F119,
+    [UNW_IA64_FR +120]  = PT_F120,      [UNW_IA64_FR +121]      = PT_F121,
+    [UNW_IA64_FR +122]  = PT_F122,      [UNW_IA64_FR +123]      = PT_F123,
+    [UNW_IA64_FR +124]  = PT_F124,      [UNW_IA64_FR +125]      = PT_F125,
+    [UNW_IA64_FR +126]  = PT_F126,      [UNW_IA64_FR +127]      = PT_F127,
 
-    [UNW_IA64_AR +  0]	= -1,		[UNW_IA64_AR +  1]	= -1,
-    [UNW_IA64_AR +  2]	= -1,		[UNW_IA64_AR +  3]	= -1,
-    [UNW_IA64_AR +  4]	= -1,		[UNW_IA64_AR +  5]	= -1,
-    [UNW_IA64_AR +  6]	= -1,		[UNW_IA64_AR +  7]	= -1,
-    [UNW_IA64_AR +  8]	= -1,		[UNW_IA64_AR +  9]	= -1,
-    [UNW_IA64_AR + 10]	= -1,		[UNW_IA64_AR + 11]	= -1,
-    [UNW_IA64_AR + 12]	= -1,		[UNW_IA64_AR + 13]	= -1,
-    [UNW_IA64_AR + 14]	= -1,		[UNW_IA64_AR + 15]	= -1,
-    [UNW_IA64_AR + 16]	= PT_AR_RSC,	[UNW_IA64_AR + 17]	= PT_AR_BSP,
-    [UNW_IA64_AR + 18]	= PT_AR_BSPSTORE,[UNW_IA64_AR + 19]	= PT_AR_RNAT,
-    [UNW_IA64_AR + 20]	= -1,		[UNW_IA64_AR + 21]	= -1,
-    [UNW_IA64_AR + 22]	= -1,		[UNW_IA64_AR + 23]	= -1,
-    [UNW_IA64_AR + 24]	= -1,		[UNW_IA64_AR + 25]	= PT_AR_CSD,
-    [UNW_IA64_AR + 26]	= -1,		[UNW_IA64_AR + 27]	= -1,
-    [UNW_IA64_AR + 28]	= -1,		[UNW_IA64_AR + 29]	= -1,
-    [UNW_IA64_AR + 30]	= -1,		[UNW_IA64_AR + 31]	= -1,
-    [UNW_IA64_AR + 32]	= PT_AR_CCV,	[UNW_IA64_AR + 33]	= -1,
-    [UNW_IA64_AR + 34]	= -1,		[UNW_IA64_AR + 35]	= -1,
-    [UNW_IA64_AR + 36]	= PT_AR_UNAT,	[UNW_IA64_AR + 37]	= -1,
-    [UNW_IA64_AR + 38]	= -1,		[UNW_IA64_AR + 39]	= -1,
-    [UNW_IA64_AR + 40]	= PT_AR_FPSR,	[UNW_IA64_AR + 41]	= -1,
-    [UNW_IA64_AR + 42]	= -1,		[UNW_IA64_AR + 43]	= -1,
-    [UNW_IA64_AR + 44]	= -1,		[UNW_IA64_AR + 45]	= -1,
-    [UNW_IA64_AR + 46]	= -1,		[UNW_IA64_AR + 47]	= -1,
-    [UNW_IA64_AR + 48]	= -1,		[UNW_IA64_AR + 49]	= -1,
-    [UNW_IA64_AR + 50]	= -1,		[UNW_IA64_AR + 51]	= -1,
-    [UNW_IA64_AR + 52]	= -1,		[UNW_IA64_AR + 53]	= -1,
-    [UNW_IA64_AR + 54]	= -1,		[UNW_IA64_AR + 55]	= -1,
-    [UNW_IA64_AR + 56]	= -1,		[UNW_IA64_AR + 57]	= -1,
-    [UNW_IA64_AR + 58]	= -1,		[UNW_IA64_AR + 59]	= -1,
-    [UNW_IA64_AR + 60]	= -1,		[UNW_IA64_AR + 61]	= -1,
-    [UNW_IA64_AR + 62]	= -1,		[UNW_IA64_AR + 63]	= -1,
-    [UNW_IA64_AR + 64]	= PT_AR_PFS,	[UNW_IA64_AR + 65]	= PT_AR_LC,
-    [UNW_IA64_AR + 66]	= PT_AR_EC,	[UNW_IA64_AR + 67]	= -1,
-    [UNW_IA64_AR + 68]	= -1,		[UNW_IA64_AR + 69]	= -1,
-    [UNW_IA64_AR + 70]	= -1,		[UNW_IA64_AR + 71]	= -1,
-    [UNW_IA64_AR + 72]	= -1,		[UNW_IA64_AR + 73]	= -1,
-    [UNW_IA64_AR + 74]	= -1,		[UNW_IA64_AR + 75]	= -1,
-    [UNW_IA64_AR + 76]	= -1,		[UNW_IA64_AR + 77]	= -1,
-    [UNW_IA64_AR + 78]	= -1,		[UNW_IA64_AR + 79]	= -1,
-    [UNW_IA64_AR + 80]	= -1,		[UNW_IA64_AR + 81]	= -1,
-    [UNW_IA64_AR + 82]	= -1,		[UNW_IA64_AR + 83]	= -1,
-    [UNW_IA64_AR + 84]	= -1,		[UNW_IA64_AR + 85]	= -1,
-    [UNW_IA64_AR + 86]	= -1,		[UNW_IA64_AR + 87]	= -1,
-    [UNW_IA64_AR + 88]	= -1,		[UNW_IA64_AR + 89]	= -1,
-    [UNW_IA64_AR + 90]	= -1,		[UNW_IA64_AR + 91]	= -1,
-    [UNW_IA64_AR + 92]	= -1,		[UNW_IA64_AR + 93]	= -1,
-    [UNW_IA64_AR + 94]	= -1,		[UNW_IA64_AR + 95]	= -1,
-    [UNW_IA64_AR + 96]	= -1,		[UNW_IA64_AR + 97]	= -1,
-    [UNW_IA64_AR + 98]	= -1,		[UNW_IA64_AR + 99]	= -1,
-    [UNW_IA64_AR +100]	= -1,		[UNW_IA64_AR +101]	= -1,
-    [UNW_IA64_AR +102]	= -1,		[UNW_IA64_AR +103]	= -1,
-    [UNW_IA64_AR +104]	= -1,		[UNW_IA64_AR +105]	= -1,
-    [UNW_IA64_AR +106]	= -1,		[UNW_IA64_AR +107]	= -1,
-    [UNW_IA64_AR +108]	= -1,		[UNW_IA64_AR +109]	= -1,
-    [UNW_IA64_AR +110]	= -1,		[UNW_IA64_AR +111]	= -1,
-    [UNW_IA64_AR +112]	= -1,		[UNW_IA64_AR +113]	= -1,
-    [UNW_IA64_AR +114]	= -1,		[UNW_IA64_AR +115]	= -1,
-    [UNW_IA64_AR +116]	= -1,		[UNW_IA64_AR +117]	= -1,
-    [UNW_IA64_AR +118]	= -1,		[UNW_IA64_AR +119]	= -1,
-    [UNW_IA64_AR +120]	= -1,		[UNW_IA64_AR +121]	= -1,
-    [UNW_IA64_AR +122]	= -1,		[UNW_IA64_AR +123]	= -1,
-    [UNW_IA64_AR +124]	= -1,		[UNW_IA64_AR +125]	= -1,
-    [UNW_IA64_AR +126]	= -1,		[UNW_IA64_AR +127]	= -1,
+    [UNW_IA64_AR +  0]  = -1,           [UNW_IA64_AR +  1]      = -1,
+    [UNW_IA64_AR +  2]  = -1,           [UNW_IA64_AR +  3]      = -1,
+    [UNW_IA64_AR +  4]  = -1,           [UNW_IA64_AR +  5]      = -1,
+    [UNW_IA64_AR +  6]  = -1,           [UNW_IA64_AR +  7]      = -1,
+    [UNW_IA64_AR +  8]  = -1,           [UNW_IA64_AR +  9]      = -1,
+    [UNW_IA64_AR + 10]  = -1,           [UNW_IA64_AR + 11]      = -1,
+    [UNW_IA64_AR + 12]  = -1,           [UNW_IA64_AR + 13]      = -1,
+    [UNW_IA64_AR + 14]  = -1,           [UNW_IA64_AR + 15]      = -1,
+    [UNW_IA64_AR + 16]  = PT_AR_RSC,    [UNW_IA64_AR + 17]      = PT_AR_BSP,
+    [UNW_IA64_AR + 18]  = PT_AR_BSPSTORE,[UNW_IA64_AR + 19]     = PT_AR_RNAT,
+    [UNW_IA64_AR + 20]  = -1,           [UNW_IA64_AR + 21]      = -1,
+    [UNW_IA64_AR + 22]  = -1,           [UNW_IA64_AR + 23]      = -1,
+    [UNW_IA64_AR + 24]  = -1,           [UNW_IA64_AR + 25]      = PT_AR_CSD,
+    [UNW_IA64_AR + 26]  = -1,           [UNW_IA64_AR + 27]      = -1,
+    [UNW_IA64_AR + 28]  = -1,           [UNW_IA64_AR + 29]      = -1,
+    [UNW_IA64_AR + 30]  = -1,           [UNW_IA64_AR + 31]      = -1,
+    [UNW_IA64_AR + 32]  = PT_AR_CCV,    [UNW_IA64_AR + 33]      = -1,
+    [UNW_IA64_AR + 34]  = -1,           [UNW_IA64_AR + 35]      = -1,
+    [UNW_IA64_AR + 36]  = PT_AR_UNAT,   [UNW_IA64_AR + 37]      = -1,
+    [UNW_IA64_AR + 38]  = -1,           [UNW_IA64_AR + 39]      = -1,
+    [UNW_IA64_AR + 40]  = PT_AR_FPSR,   [UNW_IA64_AR + 41]      = -1,
+    [UNW_IA64_AR + 42]  = -1,           [UNW_IA64_AR + 43]      = -1,
+    [UNW_IA64_AR + 44]  = -1,           [UNW_IA64_AR + 45]      = -1,
+    [UNW_IA64_AR + 46]  = -1,           [UNW_IA64_AR + 47]      = -1,
+    [UNW_IA64_AR + 48]  = -1,           [UNW_IA64_AR + 49]      = -1,
+    [UNW_IA64_AR + 50]  = -1,           [UNW_IA64_AR + 51]      = -1,
+    [UNW_IA64_AR + 52]  = -1,           [UNW_IA64_AR + 53]      = -1,
+    [UNW_IA64_AR + 54]  = -1,           [UNW_IA64_AR + 55]      = -1,
+    [UNW_IA64_AR + 56]  = -1,           [UNW_IA64_AR + 57]      = -1,
+    [UNW_IA64_AR + 58]  = -1,           [UNW_IA64_AR + 59]      = -1,
+    [UNW_IA64_AR + 60]  = -1,           [UNW_IA64_AR + 61]      = -1,
+    [UNW_IA64_AR + 62]  = -1,           [UNW_IA64_AR + 63]      = -1,
+    [UNW_IA64_AR + 64]  = PT_AR_PFS,    [UNW_IA64_AR + 65]      = PT_AR_LC,
+    [UNW_IA64_AR + 66]  = PT_AR_EC,     [UNW_IA64_AR + 67]      = -1,
+    [UNW_IA64_AR + 68]  = -1,           [UNW_IA64_AR + 69]      = -1,
+    [UNW_IA64_AR + 70]  = -1,           [UNW_IA64_AR + 71]      = -1,
+    [UNW_IA64_AR + 72]  = -1,           [UNW_IA64_AR + 73]      = -1,
+    [UNW_IA64_AR + 74]  = -1,           [UNW_IA64_AR + 75]      = -1,
+    [UNW_IA64_AR + 76]  = -1,           [UNW_IA64_AR + 77]      = -1,
+    [UNW_IA64_AR + 78]  = -1,           [UNW_IA64_AR + 79]      = -1,
+    [UNW_IA64_AR + 80]  = -1,           [UNW_IA64_AR + 81]      = -1,
+    [UNW_IA64_AR + 82]  = -1,           [UNW_IA64_AR + 83]      = -1,
+    [UNW_IA64_AR + 84]  = -1,           [UNW_IA64_AR + 85]      = -1,
+    [UNW_IA64_AR + 86]  = -1,           [UNW_IA64_AR + 87]      = -1,
+    [UNW_IA64_AR + 88]  = -1,           [UNW_IA64_AR + 89]      = -1,
+    [UNW_IA64_AR + 90]  = -1,           [UNW_IA64_AR + 91]      = -1,
+    [UNW_IA64_AR + 92]  = -1,           [UNW_IA64_AR + 93]      = -1,
+    [UNW_IA64_AR + 94]  = -1,           [UNW_IA64_AR + 95]      = -1,
+    [UNW_IA64_AR + 96]  = -1,           [UNW_IA64_AR + 97]      = -1,
+    [UNW_IA64_AR + 98]  = -1,           [UNW_IA64_AR + 99]      = -1,
+    [UNW_IA64_AR +100]  = -1,           [UNW_IA64_AR +101]      = -1,
+    [UNW_IA64_AR +102]  = -1,           [UNW_IA64_AR +103]      = -1,
+    [UNW_IA64_AR +104]  = -1,           [UNW_IA64_AR +105]      = -1,
+    [UNW_IA64_AR +106]  = -1,           [UNW_IA64_AR +107]      = -1,
+    [UNW_IA64_AR +108]  = -1,           [UNW_IA64_AR +109]      = -1,
+    [UNW_IA64_AR +110]  = -1,           [UNW_IA64_AR +111]      = -1,
+    [UNW_IA64_AR +112]  = -1,           [UNW_IA64_AR +113]      = -1,
+    [UNW_IA64_AR +114]  = -1,           [UNW_IA64_AR +115]      = -1,
+    [UNW_IA64_AR +116]  = -1,           [UNW_IA64_AR +117]      = -1,
+    [UNW_IA64_AR +118]  = -1,           [UNW_IA64_AR +119]      = -1,
+    [UNW_IA64_AR +120]  = -1,           [UNW_IA64_AR +121]      = -1,
+    [UNW_IA64_AR +122]  = -1,           [UNW_IA64_AR +123]      = -1,
+    [UNW_IA64_AR +124]  = -1,           [UNW_IA64_AR +125]      = -1,
+    [UNW_IA64_AR +126]  = -1,           [UNW_IA64_AR +127]      = -1,
 
-    [UNW_IA64_BR +  0]	= PT_B0,	[UNW_IA64_BR +  1]	= PT_B1,
-    [UNW_IA64_BR +  2]	= PT_B2,	[UNW_IA64_BR +  3]	= PT_B3,
-    [UNW_IA64_BR +  4]	= PT_B4,	[UNW_IA64_BR +  5]	= PT_B5,
-    [UNW_IA64_BR +  6]	= PT_B6,	[UNW_IA64_BR +  7]	= PT_B7,
+    [UNW_IA64_BR +  0]  = PT_B0,        [UNW_IA64_BR +  1]      = PT_B1,
+    [UNW_IA64_BR +  2]  = PT_B2,        [UNW_IA64_BR +  3]      = PT_B3,
+    [UNW_IA64_BR +  4]  = PT_B4,        [UNW_IA64_BR +  5]      = PT_B5,
+    [UNW_IA64_BR +  6]  = PT_B6,        [UNW_IA64_BR +  7]      = PT_B7,
 
-    [UNW_IA64_PR]	= PT_PR,
-    [UNW_IA64_CFM]	= PT_CFM,
-    [UNW_IA64_IP]	= PT_CR_IIP
+    [UNW_IA64_PR]       = PT_PR,
+    [UNW_IA64_CFM]      = PT_CFM,
+    [UNW_IA64_IP]       = PT_CR_IIP
 #elif defined(HAVE_TTRACE)
 # warning No support for ttrace() yet.
 #elif defined(UNW_TARGET_HPPA)
-    [UNW_HPPA_GR +  0]	= 0x000,	[UNW_HPPA_GR +  1]	= 0x004,
-    [UNW_HPPA_GR +  2]	= 0x008,	[UNW_HPPA_GR +  3]	= 0x00c,
-    [UNW_HPPA_GR +  4]	= 0x010,	[UNW_HPPA_GR +  5]	= 0x014,
-    [UNW_HPPA_GR +  6]	= 0x018,	[UNW_HPPA_GR +  7]	= 0x01c,
-    [UNW_HPPA_GR +  8]	= 0x020,	[UNW_HPPA_GR +  9]	= 0x024,
-    [UNW_HPPA_GR + 10]	= 0x028,	[UNW_HPPA_GR + 11]	= 0x02c,
-    [UNW_HPPA_GR + 12]	= 0x030,	[UNW_HPPA_GR + 13]	= 0x034,
-    [UNW_HPPA_GR + 14]	= 0x038,	[UNW_HPPA_GR + 15]	= 0x03c,
-    [UNW_HPPA_GR + 16]	= 0x040,	[UNW_HPPA_GR + 17]	= 0x044,
-    [UNW_HPPA_GR + 18]	= 0x048,	[UNW_HPPA_GR + 19]	= 0x04c,
-    [UNW_HPPA_GR + 20]	= 0x050,	[UNW_HPPA_GR + 21]	= 0x054,
-    [UNW_HPPA_GR + 22]	= 0x058,	[UNW_HPPA_GR + 23]	= 0x05c,
-    [UNW_HPPA_GR + 24]	= 0x060,	[UNW_HPPA_GR + 25]	= 0x064,
-    [UNW_HPPA_GR + 26]	= 0x068,	[UNW_HPPA_GR + 27]	= 0x06c,
-    [UNW_HPPA_GR + 28]	= 0x070,	[UNW_HPPA_GR + 29]	= 0x074,
-    [UNW_HPPA_GR + 30]	= 0x078,	[UNW_HPPA_GR + 31]	= 0x07c,
+    [UNW_HPPA_GR +  0]  = 0x000,        [UNW_HPPA_GR +  1]      = 0x004,
+    [UNW_HPPA_GR +  2]  = 0x008,        [UNW_HPPA_GR +  3]      = 0x00c,
+    [UNW_HPPA_GR +  4]  = 0x010,        [UNW_HPPA_GR +  5]      = 0x014,
+    [UNW_HPPA_GR +  6]  = 0x018,        [UNW_HPPA_GR +  7]      = 0x01c,
+    [UNW_HPPA_GR +  8]  = 0x020,        [UNW_HPPA_GR +  9]      = 0x024,
+    [UNW_HPPA_GR + 10]  = 0x028,        [UNW_HPPA_GR + 11]      = 0x02c,
+    [UNW_HPPA_GR + 12]  = 0x030,        [UNW_HPPA_GR + 13]      = 0x034,
+    [UNW_HPPA_GR + 14]  = 0x038,        [UNW_HPPA_GR + 15]      = 0x03c,
+    [UNW_HPPA_GR + 16]  = 0x040,        [UNW_HPPA_GR + 17]      = 0x044,
+    [UNW_HPPA_GR + 18]  = 0x048,        [UNW_HPPA_GR + 19]      = 0x04c,
+    [UNW_HPPA_GR + 20]  = 0x050,        [UNW_HPPA_GR + 21]      = 0x054,
+    [UNW_HPPA_GR + 22]  = 0x058,        [UNW_HPPA_GR + 23]      = 0x05c,
+    [UNW_HPPA_GR + 24]  = 0x060,        [UNW_HPPA_GR + 25]      = 0x064,
+    [UNW_HPPA_GR + 26]  = 0x068,        [UNW_HPPA_GR + 27]      = 0x06c,
+    [UNW_HPPA_GR + 28]  = 0x070,        [UNW_HPPA_GR + 29]      = 0x074,
+    [UNW_HPPA_GR + 30]  = 0x078,        [UNW_HPPA_GR + 31]      = 0x07c,
 
-    [UNW_HPPA_FR +  0]	= 0x080,	[UNW_HPPA_FR +  1]	= 0x088,
-    [UNW_HPPA_FR +  2]	= 0x090,	[UNW_HPPA_FR +  3]	= 0x098,
-    [UNW_HPPA_FR +  4]	= 0x0a0,	[UNW_HPPA_FR +  5]	= 0x0a8,
-    [UNW_HPPA_FR +  6]	= 0x0b0,	[UNW_HPPA_FR +  7]	= 0x0b8,
-    [UNW_HPPA_FR +  8]	= 0x0c0,	[UNW_HPPA_FR +  9]	= 0x0c8,
-    [UNW_HPPA_FR + 10]	= 0x0d0,	[UNW_HPPA_FR + 11]	= 0x0d8,
-    [UNW_HPPA_FR + 12]	= 0x0e0,	[UNW_HPPA_FR + 13]	= 0x0e8,
-    [UNW_HPPA_FR + 14]	= 0x0f0,	[UNW_HPPA_FR + 15]	= 0x0f8,
-    [UNW_HPPA_FR + 16]	= 0x100,	[UNW_HPPA_FR + 17]	= 0x108,
-    [UNW_HPPA_FR + 18]	= 0x110,	[UNW_HPPA_FR + 19]	= 0x118,
-    [UNW_HPPA_FR + 20]	= 0x120,	[UNW_HPPA_FR + 21]	= 0x128,
-    [UNW_HPPA_FR + 22]	= 0x130,	[UNW_HPPA_FR + 23]	= 0x138,
-    [UNW_HPPA_FR + 24]	= 0x140,	[UNW_HPPA_FR + 25]	= 0x148,
-    [UNW_HPPA_FR + 26]	= 0x150,	[UNW_HPPA_FR + 27]	= 0x158,
-    [UNW_HPPA_FR + 28]	= 0x160,	[UNW_HPPA_FR + 29]	= 0x168,
-    [UNW_HPPA_FR + 30]	= 0x170,	[UNW_HPPA_FR + 31]	= 0x178,
+    [UNW_HPPA_FR +  0]  = 0x080,        [UNW_HPPA_FR +  1]      = 0x088,
+    [UNW_HPPA_FR +  2]  = 0x090,        [UNW_HPPA_FR +  3]      = 0x098,
+    [UNW_HPPA_FR +  4]  = 0x0a0,        [UNW_HPPA_FR +  5]      = 0x0a8,
+    [UNW_HPPA_FR +  6]  = 0x0b0,        [UNW_HPPA_FR +  7]      = 0x0b8,
+    [UNW_HPPA_FR +  8]  = 0x0c0,        [UNW_HPPA_FR +  9]      = 0x0c8,
+    [UNW_HPPA_FR + 10]  = 0x0d0,        [UNW_HPPA_FR + 11]      = 0x0d8,
+    [UNW_HPPA_FR + 12]  = 0x0e0,        [UNW_HPPA_FR + 13]      = 0x0e8,
+    [UNW_HPPA_FR + 14]  = 0x0f0,        [UNW_HPPA_FR + 15]      = 0x0f8,
+    [UNW_HPPA_FR + 16]  = 0x100,        [UNW_HPPA_FR + 17]      = 0x108,
+    [UNW_HPPA_FR + 18]  = 0x110,        [UNW_HPPA_FR + 19]      = 0x118,
+    [UNW_HPPA_FR + 20]  = 0x120,        [UNW_HPPA_FR + 21]      = 0x128,
+    [UNW_HPPA_FR + 22]  = 0x130,        [UNW_HPPA_FR + 23]      = 0x138,
+    [UNW_HPPA_FR + 24]  = 0x140,        [UNW_HPPA_FR + 25]      = 0x148,
+    [UNW_HPPA_FR + 26]  = 0x150,        [UNW_HPPA_FR + 27]      = 0x158,
+    [UNW_HPPA_FR + 28]  = 0x160,        [UNW_HPPA_FR + 29]      = 0x168,
+    [UNW_HPPA_FR + 30]  = 0x170,        [UNW_HPPA_FR + 31]      = 0x178,
 
-    [UNW_HPPA_IP]	= 0x1a8		/* IAOQ[0] */
+    [UNW_HPPA_IP]       = 0x1a8         /* IAOQ[0] */
 #elif defined(UNW_TARGET_X86)
-    [UNW_X86_EAX]	= 0x18,
-    [UNW_X86_EBX]	= 0x00,
-    [UNW_X86_ECX]	= 0x04,
-    [UNW_X86_EDX]	= 0x08,
-    [UNW_X86_ESI]	= 0x0c,
-    [UNW_X86_EDI]	= 0x10,
-    [UNW_X86_EBP]	= 0x14,
-    [UNW_X86_EIP]	= 0x30,
-    [UNW_X86_ESP]	= 0x3c
-/*  CS			= 0x34, */
-/*  DS			= 0x1c, */
-/*  ES			= 0x20, */
-/*  FS			= 0x24, */
-/*  GS			= 0x28, */
-/*  ORIG_EAX		= 0x2c, */
-/*  EFLAGS		= 0x38, */
-/*  SS			= 0x40 */
+#if defined __FreeBSD__
+#define UNW_R_OFF(R, r) \
+    [UNW_X86_##R]       = offsetof(gregset_t, r_##r),
+    UNW_R_OFF(EAX, eax)
+    UNW_R_OFF(EDX, edx)
+    UNW_R_OFF(ECX, ecx)
+    UNW_R_OFF(EBX, ebx)
+    UNW_R_OFF(ESI, esi)
+    UNW_R_OFF(EDI, edi)
+    UNW_R_OFF(EBP, ebp)
+    UNW_R_OFF(ESP, esp)
+    UNW_R_OFF(EIP, eip)
+//  UNW_R_OFF(CS, cs)
+//  UNW_R_OFF(EFLAGS, eflags)
+//  UNW_R_OFF(SS, ss)
+#elif defined __linux__
+    [UNW_X86_EAX]       = 0x18,
+    [UNW_X86_EBX]       = 0x00,
+    [UNW_X86_ECX]       = 0x04,
+    [UNW_X86_EDX]       = 0x08,
+    [UNW_X86_ESI]       = 0x0c,
+    [UNW_X86_EDI]       = 0x10,
+    [UNW_X86_EBP]       = 0x14,
+    [UNW_X86_EIP]       = 0x30,
+    [UNW_X86_ESP]       = 0x3c
+/*  CS                  = 0x34, */
+/*  DS                  = 0x1c, */
+/*  ES                  = 0x20, */
+/*  FS                  = 0x24, */
+/*  GS                  = 0x28, */
+/*  ORIG_EAX            = 0x2c, */
+/*  EFLAGS              = 0x38, */
+/*  SS                  = 0x40 */
+#else
+#error Port me
+#endif
 #elif defined(UNW_TARGET_X86_64)
-    [UNW_X86_64_RAX]	= 0x50,
-    [UNW_X86_64_RDX]	= 0x60,
-    [UNW_X86_64_RCX]	= 0x58,
-    [UNW_X86_64_RBX]	= 0x28,
-    [UNW_X86_64_RSI]	= 0x68,
-    [UNW_X86_64_RDI]	= 0x70,
-    [UNW_X86_64_RBP]	= 0x20,
-    [UNW_X86_64_RSP]	= 0x98,
-    [UNW_X86_64_R8]	= 0x48,
-    [UNW_X86_64_R9]	= 0x40,
-    [UNW_X86_64_R10]	= 0x38,
-    [UNW_X86_64_R11]	= 0x30,
-    [UNW_X86_64_R12]	= 0x18,
-    [UNW_X86_64_R13]	= 0x10,
-    [UNW_X86_64_R14]	= 0x08,
-    [UNW_X86_64_R15]	= 0x00,
-    [UNW_X86_64_RIP]	= 0x80
-//  [UNW_X86_64_CS]	= 0x88,
-//  [UNW_X86_64_EFLAGS]	= 0x90,
-//  [UNW_X86_64_RSP]	= 0x98,
-//  [UNW_X86_64_SS]	= 0xa0
-#elif defined(UNW_TARGET_PPC32)
-#elif defined(UNW_TARGET_PPC64)
+#if defined __FreeBSD__
+#define UNW_R_OFF(R, r) \
+    [UNW_X86_64_##R]    = offsetof(gregset_t, r_##r),
+    UNW_R_OFF(RAX, rax)
+    UNW_R_OFF(RDX, rdx)
+    UNW_R_OFF(RCX, rcx)
+    UNW_R_OFF(RBX, rbx)
+    UNW_R_OFF(RSI, rsi)
+    UNW_R_OFF(RDI, rdi)
+    UNW_R_OFF(RBP, rbp)
+    UNW_R_OFF(RSP, rsp)
+    UNW_R_OFF(R8, r8)
+    UNW_R_OFF(R9, r9)
+    UNW_R_OFF(R10, r10)
+    UNW_R_OFF(R11, r11)
+    UNW_R_OFF(R12, r12)
+    UNW_R_OFF(R13, r13)
+    UNW_R_OFF(R14, r14)
+    UNW_R_OFF(R15, r15)
+    UNW_R_OFF(RIP, rip)
+//  UNW_R_OFF(CS, cs)
+//  UNW_R_OFF(EFLAGS, rflags)
+//  UNW_R_OFF(SS, ss)
+#undef UNW_R_OFF
+#elif defined __linux__
+    [UNW_X86_64_RAX]    = 0x50,
+    [UNW_X86_64_RDX]    = 0x60,
+    [UNW_X86_64_RCX]    = 0x58,
+    [UNW_X86_64_RBX]    = 0x28,
+    [UNW_X86_64_RSI]    = 0x68,
+    [UNW_X86_64_RDI]    = 0x70,
+    [UNW_X86_64_RBP]    = 0x20,
+    [UNW_X86_64_RSP]    = 0x98,
+    [UNW_X86_64_R8]     = 0x48,
+    [UNW_X86_64_R9]     = 0x40,
+    [UNW_X86_64_R10]    = 0x38,
+    [UNW_X86_64_R11]    = 0x30,
+    [UNW_X86_64_R12]    = 0x18,
+    [UNW_X86_64_R13]    = 0x10,
+    [UNW_X86_64_R14]    = 0x08,
+    [UNW_X86_64_R15]    = 0x00,
+    [UNW_X86_64_RIP]    = 0x80
+//  [UNW_X86_64_CS]     = 0x88,
+//  [UNW_X86_64_EFLAGS] = 0x90,
+//  [UNW_X86_64_RSP]    = 0x98,
+//  [UNW_X86_64_SS]     = 0xa0
+#else
+#error Port me
+#endif
+#elif defined(UNW_TARGET_PPC32) || defined(UNW_TARGET_PPC64)
+
+#define UNW_REG_SLOT_SIZE sizeof(unsigned long)
+#define UNW_PPC_R(v) ((v) * UNW_REG_SLOT_SIZE)
+#define UNW_PPC_PT(p) UNW_PPC_R(PT_##p)
+
+#define UNW_FP_OFF(b, i)    \
+    [UNW_PPC##b##_F##i] = UNW_PPC_R(PT_FPR0 + i * 8/UNW_REG_SLOT_SIZE)
+
+#define UNW_R_OFF(b, i) \
+    [UNW_PPC##b##_R##i] = UNW_PPC_R(PT_R##i)
+
+#define UNW_PPC_REGS(b) \
+    UNW_R_OFF(b, 0),    \
+    UNW_R_OFF(b, 1),    \
+    UNW_R_OFF(b, 2),    \
+    UNW_R_OFF(b, 3),    \
+    UNW_R_OFF(b, 4),    \
+    UNW_R_OFF(b, 5),    \
+    UNW_R_OFF(b, 6),    \
+    UNW_R_OFF(b, 7),    \
+    UNW_R_OFF(b, 8),    \
+    UNW_R_OFF(b, 9),    \
+    UNW_R_OFF(b, 10),   \
+    UNW_R_OFF(b, 11),   \
+    UNW_R_OFF(b, 12),   \
+    UNW_R_OFF(b, 13),   \
+    UNW_R_OFF(b, 14),   \
+    UNW_R_OFF(b, 15),   \
+    UNW_R_OFF(b, 16),   \
+    UNW_R_OFF(b, 17),   \
+    UNW_R_OFF(b, 18),   \
+    UNW_R_OFF(b, 19),   \
+    UNW_R_OFF(b, 20),   \
+    UNW_R_OFF(b, 21),   \
+    UNW_R_OFF(b, 22),   \
+    UNW_R_OFF(b, 23),   \
+    UNW_R_OFF(b, 24),   \
+    UNW_R_OFF(b, 25),   \
+    UNW_R_OFF(b, 26),   \
+    UNW_R_OFF(b, 27),   \
+    UNW_R_OFF(b, 28),   \
+    UNW_R_OFF(b, 29),   \
+    UNW_R_OFF(b, 30),   \
+    UNW_R_OFF(b, 31),   \
+                               \
+    [UNW_PPC##b##_CTR] = UNW_PPC_PT(CTR), \
+    [UNW_PPC##b##_XER] = UNW_PPC_PT(XER), \
+    [UNW_PPC##b##_LR]  = UNW_PPC_PT(LNK), \
+                               \
+    UNW_FP_OFF(b, 0), \
+    UNW_FP_OFF(b, 1), \
+    UNW_FP_OFF(b, 2), \
+    UNW_FP_OFF(b, 3), \
+    UNW_FP_OFF(b, 4), \
+    UNW_FP_OFF(b, 5), \
+    UNW_FP_OFF(b, 6), \
+    UNW_FP_OFF(b, 7), \
+    UNW_FP_OFF(b, 8), \
+    UNW_FP_OFF(b, 9), \
+    UNW_FP_OFF(b, 10), \
+    UNW_FP_OFF(b, 11), \
+    UNW_FP_OFF(b, 12), \
+    UNW_FP_OFF(b, 13), \
+    UNW_FP_OFF(b, 14), \
+    UNW_FP_OFF(b, 15), \
+    UNW_FP_OFF(b, 16), \
+    UNW_FP_OFF(b, 17), \
+    UNW_FP_OFF(b, 18), \
+    UNW_FP_OFF(b, 19), \
+    UNW_FP_OFF(b, 20), \
+    UNW_FP_OFF(b, 21), \
+    UNW_FP_OFF(b, 22), \
+    UNW_FP_OFF(b, 23), \
+    UNW_FP_OFF(b, 24), \
+    UNW_FP_OFF(b, 25), \
+    UNW_FP_OFF(b, 26), \
+    UNW_FP_OFF(b, 27), \
+    UNW_FP_OFF(b, 28), \
+    UNW_FP_OFF(b, 29), \
+    UNW_FP_OFF(b, 30), \
+    UNW_FP_OFF(b, 31)
+
+#define UNW_PPC32_REGS \
+    [UNW_PPC32_FPSCR] = UNW_PPC_PT(FPSCR), \
+    [UNW_PPC32_CCR] = UNW_PPC_PT(CCR)
+
+#define UNW_VR_OFF(i)   \
+    [UNW_PPC64_V##i] = UNW_PPC_R(PT_VR0 + i * 2)
+
+#define UNW_PPC64_REGS \
+    [UNW_PPC64_NIP] = UNW_PPC_PT(NIP), \
+    [UNW_PPC64_FRAME_POINTER] = -1, \
+    [UNW_PPC64_ARG_POINTER] = -1,   \
+    [UNW_PPC64_CR0] = -1,           \
+    [UNW_PPC64_CR1] = -1,           \
+    [UNW_PPC64_CR2] = -1,           \
+    [UNW_PPC64_CR3] = -1,           \
+    [UNW_PPC64_CR4] = -1,           \
+    [UNW_PPC64_CR5] = -1,           \
+    [UNW_PPC64_CR6] = -1,           \
+    [UNW_PPC64_CR7] = -1,           \
+    [UNW_PPC64_VRSAVE] = UNW_PPC_PT(VRSAVE), \
+    [UNW_PPC64_VSCR] = UNW_PPC_PT(VSCR),     \
+    [UNW_PPC64_SPE_ACC] = -1,       \
+    [UNW_PPC64_SPEFSCR] = -1,       \
+    UNW_VR_OFF(0), \
+    UNW_VR_OFF(1), \
+    UNW_VR_OFF(2), \
+    UNW_VR_OFF(3), \
+    UNW_VR_OFF(4), \
+    UNW_VR_OFF(5), \
+    UNW_VR_OFF(6), \
+    UNW_VR_OFF(7), \
+    UNW_VR_OFF(8), \
+    UNW_VR_OFF(9), \
+    UNW_VR_OFF(10), \
+    UNW_VR_OFF(11), \
+    UNW_VR_OFF(12), \
+    UNW_VR_OFF(13), \
+    UNW_VR_OFF(14), \
+    UNW_VR_OFF(15), \
+    UNW_VR_OFF(16), \
+    UNW_VR_OFF(17), \
+    UNW_VR_OFF(18), \
+    UNW_VR_OFF(19), \
+    UNW_VR_OFF(20), \
+    UNW_VR_OFF(21), \
+    UNW_VR_OFF(22), \
+    UNW_VR_OFF(23), \
+    UNW_VR_OFF(24), \
+    UNW_VR_OFF(25), \
+    UNW_VR_OFF(26), \
+    UNW_VR_OFF(27), \
+    UNW_VR_OFF(28), \
+    UNW_VR_OFF(29), \
+    UNW_VR_OFF(30), \
+    UNW_VR_OFF(31)
+
+#if defined(UNW_TARGET_PPC32)
+    UNW_PPC_REGS(32),
+    UNW_PPC32_REGS,
+#else
+    UNW_PPC_REGS(64),
+    UNW_PPC64_REGS,
+#endif
+
 #elif defined(UNW_TARGET_ARM)
+    [UNW_ARM_R0]       = 0x00,
+    [UNW_ARM_R1]       = 0x04,
+    [UNW_ARM_R2]       = 0x08,
+    [UNW_ARM_R3]       = 0x0c,
+    [UNW_ARM_R4]       = 0x10,
+    [UNW_ARM_R5]       = 0x14,
+    [UNW_ARM_R6]       = 0x18,
+    [UNW_ARM_R7]       = 0x1c,
+    [UNW_ARM_R8]       = 0x20,
+    [UNW_ARM_R9]       = 0x24,
+    [UNW_ARM_R10]      = 0x28,
+    [UNW_ARM_R11]      = 0x2c,
+    [UNW_ARM_R12]      = 0x30,
+    [UNW_ARM_R13]      = 0x34,
+    [UNW_ARM_R14]      = 0x38,
+    [UNW_ARM_R15]      = 0x3c,
 #elif defined(UNW_TARGET_MIPS)
+#elif defined(UNW_TARGET_SH)
+#elif defined(UNW_TARGET_AARCH64)
+    [UNW_AARCH64_X0]       = 0x00,
+    [UNW_AARCH64_X1]       = 0x08,
+    [UNW_AARCH64_X2]       = 0x10,
+    [UNW_AARCH64_X3]       = 0x18,
+    [UNW_AARCH64_X4]       = 0x20,
+    [UNW_AARCH64_X5]       = 0x28,
+    [UNW_AARCH64_X6]       = 0x30,
+    [UNW_AARCH64_X7]       = 0x38,
+    [UNW_AARCH64_X8]       = 0x40,
+    [UNW_AARCH64_X9]       = 0x48,
+    [UNW_AARCH64_X10]      = 0x50,
+    [UNW_AARCH64_X11]      = 0x58,
+    [UNW_AARCH64_X12]      = 0x60,
+    [UNW_AARCH64_X13]      = 0x68,
+    [UNW_AARCH64_X14]      = 0x70,
+    [UNW_AARCH64_X15]      = 0x78,
+    [UNW_AARCH64_X16]      = 0x80,
+    [UNW_AARCH64_X17]      = 0x88,
+    [UNW_AARCH64_X18]      = 0x90,
+    [UNW_AARCH64_X19]      = 0x98,
+    [UNW_AARCH64_X20]      = 0xa0,
+    [UNW_AARCH64_X21]      = 0xa8,
+    [UNW_AARCH64_X22]      = 0xb0,
+    [UNW_AARCH64_X23]      = 0xb8,
+    [UNW_AARCH64_X24]      = 0xc0,
+    [UNW_AARCH64_X25]      = 0xc8,
+    [UNW_AARCH64_X26]      = 0xd0,
+    [UNW_AARCH64_X27]      = 0xd8,
+    [UNW_AARCH64_X28]      = 0xe0,
+    [UNW_AARCH64_X29]      = 0xe8,
+    [UNW_AARCH64_X30]      = 0xf0,
+    [UNW_AARCH64_SP]       = 0xf8,
+    [UNW_AARCH64_PC]       = 0x100,
+    [UNW_AARCH64_PSTATE]   = 0x108
+#elif defined(UNW_TARGET_TILEGX)
+    [UNW_TILEGX_R0]    = 0x00,
+    [UNW_TILEGX_R1]    = 0x08,
+    [UNW_TILEGX_R2]    = 0x10,
+    [UNW_TILEGX_R3]    = 0x08,
+    [UNW_TILEGX_R4]    = 0x20,
+    [UNW_TILEGX_R5]    = 0x28,
+    [UNW_TILEGX_R6]    = 0x30,
+    [UNW_TILEGX_R7]    = 0x38,
+    [UNW_TILEGX_R8]    = 0x40,
+    [UNW_TILEGX_R9]    = 0x48,
+    [UNW_TILEGX_R10]    = 0x50,
+    [UNW_TILEGX_R11]    = 0x58,
+    [UNW_TILEGX_R12]    = 0x60,
+    [UNW_TILEGX_R13]    = 0x68,
+    [UNW_TILEGX_R14]    = 0x70,
+    [UNW_TILEGX_R15]    = 0x78,
+    [UNW_TILEGX_R16]    = 0x80,
+    [UNW_TILEGX_R17]    = 0x88,
+    [UNW_TILEGX_R18]    = 0x90,
+    [UNW_TILEGX_R19]    = 0x98,
+    [UNW_TILEGX_R20]    = 0xa0,
+    [UNW_TILEGX_R21]    = 0xa8,
+    [UNW_TILEGX_R22]    = 0xb0,
+    [UNW_TILEGX_R23]    = 0xb8,
+    [UNW_TILEGX_R24]    = 0xc0,
+    [UNW_TILEGX_R25]    = 0xc8,
+    [UNW_TILEGX_R26]    = 0xd0,
+    [UNW_TILEGX_R27]    = 0xd8,
+    [UNW_TILEGX_R28]    = 0xe0,
+    [UNW_TILEGX_R29]    = 0xe8,
+    [UNW_TILEGX_R30]    = 0xf0,
+    [UNW_TILEGX_R31]    = 0xf8,
+    [UNW_TILEGX_R32]    = 0x100,
+    [UNW_TILEGX_R33]    = 0x108,
+    [UNW_TILEGX_R34]    = 0x110,
+    [UNW_TILEGX_R35]    = 0x118,
+    [UNW_TILEGX_R36]    = 0x120,
+    [UNW_TILEGX_R37]    = 0x128,
+    [UNW_TILEGX_R38]    = 0x130,
+    [UNW_TILEGX_R39]    = 0x138,
+    [UNW_TILEGX_R40]    = 0x140,
+    [UNW_TILEGX_R41]    = 0x148,
+    [UNW_TILEGX_R42]    = 0x150,
+    [UNW_TILEGX_R43]    = 0x158,
+    [UNW_TILEGX_R44]    = 0x160,
+    [UNW_TILEGX_R45]    = 0x168,
+    [UNW_TILEGX_R46]    = 0x170,
+    [UNW_TILEGX_R47]    = 0x178,
+    [UNW_TILEGX_R48]    = 0x180,
+    [UNW_TILEGX_R49]    = 0x188,
+    [UNW_TILEGX_R50]    = 0x190,
+    [UNW_TILEGX_R51]    = 0x198,
+    [UNW_TILEGX_R52]    = 0x1a0,
+    [UNW_TILEGX_R53]    = 0x1a8,
+    [UNW_TILEGX_R54]    = 0x1b0,
+    [UNW_TILEGX_R55]    = 0x1b8,
+    [UNW_TILEGX_PC]     = 0x1a0
 #else
 # error Fix me.
 #endif
diff --git a/frysk-imports/libunwind/src/ptrace/_UPT_resume.c b/frysk-imports/libunwind/src/ptrace/_UPT_resume.c
index 11242e8..d70a0d4 100644
--- a/frysk-imports/libunwind/src/ptrace/_UPT_resume.c
+++ b/frysk-imports/libunwind/src/ptrace/_UPT_resume.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -32,7 +32,9 @@ _UPT_resume (unw_addr_space_t as, unw_cursor_t *c, void *arg)
 
 #ifdef HAVE_TTRACE
 # warning No support for ttrace() yet.
-#else
+#elif HAVE_DECL_PTRACE_CONT
   return ptrace (PTRACE_CONT, ui->pid, 0, 0);
+#elif HAVE_DECL_PT_CONTINUE
+  return ptrace(PT_CONTINUE, ui->pid, (caddr_t)1, 0);
 #endif
 }
diff --git a/frysk-imports/libunwind/src/ptrace/libunwind-ptrace.pc.in b/frysk-imports/libunwind/src/ptrace/libunwind-ptrace.pc.in
new file mode 100644
index 0000000..673004b
--- /dev/null
+++ b/frysk-imports/libunwind/src/ptrace/libunwind-ptrace.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: libunwind-ptrace
+Description: libunwind ptrace library
+Version: @VERSION@
+Requires: libunwind-generic libunwind
+Libs: -L${libdir} -lunwind-ptrace
+Cflags: -I${includedir}
diff --git a/frysk-imports/libunwind/src/setjmp/libunwind-setjmp.pc.in b/frysk-imports/libunwind/src/setjmp/libunwind-setjmp.pc.in
new file mode 100644
index 0000000..7b71126
--- /dev/null
+++ b/frysk-imports/libunwind/src/setjmp/libunwind-setjmp.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: libunwind-setjmp
+Description: libunwind setjmp library
+Version: @VERSION@
+Requires: libunwind
+Libs: -L${libdir} -lunwind-setjmp
+Cflags: -I${includedir}
diff --git a/frysk-imports/libunwind/src/setjmp/longjmp.c b/frysk-imports/libunwind/src/setjmp/longjmp.c
index ca5f1e4..8295a9b 100644
--- a/frysk-imports/libunwind/src/setjmp/longjmp.c
+++ b/frysk-imports/libunwind/src/setjmp/longjmp.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003-2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -25,6 +25,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 #define UNW_LOCAL_ONLY
 
+#undef _FORTIFY_SOURCE
 #include <assert.h>
 #include <libunwind.h>
 #include <setjmp.h>
@@ -34,6 +35,25 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #include "jmpbuf.h"
 #include "setjmp_i.h"
 
+#if defined(__GLIBC__)
+#if __GLIBC_PREREQ(2, 4)
+
+/* Starting with glibc-2.4, {sig,}setjmp in GLIBC obfuscates the
+   register values in jmp_buf by XORing them with a "random"
+   canary value.
+
+   This makes it impossible to implement longjmp, as we
+   can never match wp[JB_SP], unless we decode the canary first.
+
+   Doing so is possible, but doesn't appear to be worth the trouble,
+   so we simply defer to glibc longjmp here.  */
+#define _longjmp __nonworking__longjmp
+#define longjmp __nonworking_longjmp
+static void _longjmp (jmp_buf env, int val);
+static void longjmp (jmp_buf env, int val);
+#endif
+#endif /* __GLIBC__ */
+
 void
 _longjmp (jmp_buf env, int val)
 {
@@ -49,34 +69,41 @@ _longjmp (jmp_buf env, int val)
   do
     {
       if (unw_get_reg (&c, UNW_REG_SP, &sp) < 0)
-	abort ();
+        abort ();
+#ifdef __FreeBSD__
+      if (sp != wp[JB_SP] + sizeof(unw_word_t))
+#else
       if (sp != wp[JB_SP])
-	continue;
+#endif
+        continue;
 
       if (!bsp_match (&c, wp))
-	continue;
+        continue;
 
       /* found the right frame: */
 
       assert (UNW_NUM_EH_REGS >= 2);
 
       if (unw_set_reg (&c, UNW_REG_EH + 0, wp[JB_RP]) < 0
-	  || unw_set_reg (&c, UNW_REG_EH + 1, val) < 0
-	  || unw_set_reg (&c, UNW_REG_IP,
-			  (unw_word_t) (uintptr_t) &_UI_longjmp_cont))
-	abort ();
+          || unw_set_reg (&c, UNW_REG_EH + 1, val) < 0
+          || unw_set_reg (&c, UNW_REG_IP,
+                          (unw_word_t) (uintptr_t) &_UI_longjmp_cont))
+        abort ();
 
       unw_resume (&c);
 
       abort ();
     }
-  while (unw_step (&c) >= 0);
+  while (unw_step (&c) > 0);
 
   abort ();
 }
 
 #ifdef __GNUC__
-void longjmp (jmp_buf env, int val) __attribute__ ((alias ("_longjmp")));
+#define STRINGIFY1(x) #x
+#define STRINGIFY(x) STRINGIFY1(x)
+void longjmp (jmp_buf env, int val) 
+  __attribute__ ((alias (STRINGIFY(_longjmp))));
 #else
 
 void
@@ -85,4 +112,4 @@ longjmp (jmp_buf env, int val)
   _longjmp (env, val);
 }
 
-#endif
+#endif /* __GNUC__ */
diff --git a/frysk-imports/libunwind/src/setjmp/setjmp.c b/frysk-imports/libunwind/src/setjmp/setjmp.c
index feb83f7..bec9fc7 100644
--- a/frysk-imports/libunwind/src/setjmp/setjmp.c
+++ b/frysk-imports/libunwind/src/setjmp/setjmp.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003-2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
diff --git a/frysk-imports/libunwind/src/setjmp/setjmp_i.h b/frysk-imports/libunwind/src/setjmp/setjmp_i.h
index 1d7ca15..4d91396 100644
--- a/frysk-imports/libunwind/src/setjmp/setjmp_i.h
+++ b/frysk-imports/libunwind/src/setjmp/setjmp_i.h
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003-2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -50,20 +50,20 @@ bsp_match (unw_cursor_t *c, unw_word_t *wp)
       unw_cursor_t tmp = *c;
 
       /* The caller of {sig,}setjmp() cannot have a NULL-frame.  If we
-	 see a NULL-frame, we haven't reached the right target yet.
-	 To have a NULL-frame, the number of locals must be zero and
-	 the stack-frame must also be empty.  */
+         see a NULL-frame, we haven't reached the right target yet.
+         To have a NULL-frame, the number of locals must be zero and
+         the stack-frame must also be empty.  */
 
       if (unw_step (&tmp) < 0)
-	abort ();
+        abort ();
 
       if (unw_get_reg (&tmp, UNW_REG_SP, &sp) < 0
-	  || unw_get_reg (&tmp, UNW_REG_SP, &prev_sp) < 0)
-	abort ();
+          || unw_get_reg (&tmp, UNW_REG_SP, &prev_sp) < 0)
+        abort ();
 
       if (sp == prev_sp)
-	/* got a NULL-frame; keep looking... */
-	return 0;
+        /* got a NULL-frame; keep looking... */
+        return 0;
     }
   return 1;
 }
@@ -93,7 +93,7 @@ resume_restores_sigmask (unw_cursor_t *c, unw_word_t *wp)
   else
     {
       if (sigprocmask (SIG_BLOCK, NULL, &current_mask) < 0)
-	abort ();
+        abort ();
       mp = &current_mask;
     }
   memcpy (&sc->sc_mask, mp, sizeof (sc->sc_mask));
diff --git a/frysk-imports/libunwind/src/setjmp/siglongjmp.c b/frysk-imports/libunwind/src/setjmp/siglongjmp.c
index 9a091fa..0e286f6 100644
--- a/frysk-imports/libunwind/src/setjmp/siglongjmp.c
+++ b/frysk-imports/libunwind/src/setjmp/siglongjmp.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003-2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -31,6 +31,28 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #include "jmpbuf.h"
 #include "setjmp_i.h"
 
+#if !defined(_NSIG) && defined(_SIG_MAXSIG)
+# define _NSIG (_SIG_MAXSIG - 1)
+#endif
+
+#if defined(__GLIBC__)
+#if __GLIBC_PREREQ(2, 4)
+
+/* Starting with glibc-2.4, {sig,}setjmp in GLIBC obfuscates the
+   register values in jmp_buf by XORing them with a "random"
+   canary value.
+
+   This makes it impossible to implement longjmp, as we
+   can never match wp[JB_SP], unless we decode the canary first.
+
+   Doing so is possible, but doesn't appear to be worth the trouble,
+   so we simply defer to glibc siglongjmp here.  */
+
+#define siglongjmp __nonworking_siglongjmp
+static void siglongjmp (sigjmp_buf env, int val) UNUSED;
+#endif
+#endif /* __GLIBC_PREREQ */
+
 void
 siglongjmp (sigjmp_buf env, int val)
 {
@@ -48,12 +70,16 @@ siglongjmp (sigjmp_buf env, int val)
   do
     {
       if (unw_get_reg (&c, UNW_REG_SP, &sp) < 0)
-	abort ();
+        abort ();
+#ifdef __FreeBSD__
+      if (sp != wp[JB_SP] + sizeof(unw_word_t))
+#else
       if (sp != wp[JB_SP])
-	continue;
+#endif
+        continue;
 
       if (!bsp_match (&c, wp))
-	continue;
+        continue;
 
       /* found the right frame: */
 
@@ -61,34 +87,41 @@ siglongjmp (sigjmp_buf env, int val)
       cont = &_UI_longjmp_cont;
 
       /* Order of evaluation is important here: if unw_resume()
-	 restores signal mask, we must set it up appropriately, even
-	 if wp[JB_MASK_SAVED] is FALSE.  */
+         restores signal mask, we must set it up appropriately, even
+         if wp[JB_MASK_SAVED] is FALSE.  */
       if (!resume_restores_sigmask (&c, wp) && wp[JB_MASK_SAVED])
-	{
-	  /* sigmask was saved */
-	  if (UNW_NUM_EH_REGS < 4 || _NSIG >= 16 * sizeof (unw_word_t))
-	    /* signal mask doesn't fit into EH arguments and we can't
-	       put it on the stack without overwriting something
-	       else... */
-	    abort ();
-	  else
-	    if (unw_set_reg (&c, UNW_REG_EH + 2, wp[JB_MASK]) < 0
-		|| (_NSIG > 8 * sizeof (unw_word_t)
-		    && unw_set_reg (&c, UNW_REG_EH + 3, wp[JB_MASK + 1]) < 0))
-	      abort ();
-	  cont = &_UI_siglongjmp_cont;
-	}
+        {
+          /* sigmask was saved */
+#if defined(__linux__)
+          if (UNW_NUM_EH_REGS < 4 || _NSIG > 16 * sizeof (unw_word_t))
+            /* signal mask doesn't fit into EH arguments and we can't
+               put it on the stack without overwriting something
+               else... */
+            abort ();
+          else
+            if (unw_set_reg (&c, UNW_REG_EH + 2, wp[JB_MASK]) < 0
+                || (_NSIG > 8 * sizeof (unw_word_t)
+                    && unw_set_reg (&c, UNW_REG_EH + 3, wp[JB_MASK + 1]) < 0))
+              abort ();
+#elif defined(__FreeBSD__)
+          if (unw_set_reg (&c, UNW_REG_EH + 2, &wp[JB_MASK]) < 0)
+              abort();
+#else
+#error Port me
+#endif
+          cont = &_UI_siglongjmp_cont;
+        }
 
       if (unw_set_reg (&c, UNW_REG_EH + 0, wp[JB_RP]) < 0
-	  || unw_set_reg (&c, UNW_REG_EH + 1, val) < 0
-	  || unw_set_reg (&c, UNW_REG_IP, (unw_word_t) (uintptr_t) cont))
-	abort ();
+          || unw_set_reg (&c, UNW_REG_EH + 1, val) < 0
+          || unw_set_reg (&c, UNW_REG_IP, (unw_word_t) (uintptr_t) cont))
+        abort ();
 
       unw_resume (&c);
 
       abort ();
     }
-  while (unw_step (&c) >= 0);
+  while (unw_step (&c) > 0);
 
   abort ();
 }
diff --git a/frysk-imports/libunwind/src/setjmp/sigsetjmp.c b/frysk-imports/libunwind/src/setjmp/sigsetjmp.c
index 87df5ed..f84935d 100644
--- a/frysk-imports/libunwind/src/setjmp/sigsetjmp.c
+++ b/frysk-imports/libunwind/src/setjmp/sigsetjmp.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003-2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
diff --git a/frysk-imports/libunwind/src/sh/Gcreate_addr_space.c b/frysk-imports/libunwind/src/sh/Gcreate_addr_space.c
new file mode 100644
index 0000000..1907d04
--- /dev/null
+++ b/frysk-imports/libunwind/src/sh/Gcreate_addr_space.c
@@ -0,0 +1,59 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com>
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include <string.h>
+#include <stdlib.h>
+
+#include "unwind_i.h"
+
+PROTECTED unw_addr_space_t
+unw_create_addr_space (unw_accessors_t *a, int byte_order)
+{
+#ifdef UNW_LOCAL_ONLY
+  return NULL;
+#else
+  unw_addr_space_t as;
+
+  /* SH supports little-endian and big-endian. */
+  if (byte_order != 0 && byte_order != __LITTLE_ENDIAN
+      && byte_order != __BIG_ENDIAN)
+    return NULL;
+
+  as = malloc (sizeof (*as));
+  if (!as)
+    return NULL;
+
+  memset (as, 0, sizeof (*as));
+
+  as->acc = *a;
+
+  /* Default to little-endian for SH. */
+  if (byte_order == 0 || byte_order == __LITTLE_ENDIAN)
+    as->big_endian = 0;
+  else
+    as->big_endian = 1;
+
+  return as;
+#endif
+}
diff --git a/frysk-imports/libunwind/src/sh/Gget_proc_info.c b/frysk-imports/libunwind/src/sh/Gget_proc_info.c
new file mode 100644
index 0000000..de9199f
--- /dev/null
+++ b/frysk-imports/libunwind/src/sh/Gget_proc_info.c
@@ -0,0 +1,39 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "unwind_i.h"
+
+PROTECTED int
+unw_get_proc_info (unw_cursor_t *cursor, unw_proc_info_t *pi)
+{
+  struct cursor *c = (struct cursor *) cursor;
+  int ret;
+
+  ret = dwarf_make_proc_info (&c->dwarf);
+  if (ret < 0)
+    return ret;
+
+  *pi = c->dwarf.pi;
+  return 0;
+}
diff --git a/frysk-imports/libunwind/src/sh/Gget_save_loc.c b/frysk-imports/libunwind/src/sh/Gget_save_loc.c
new file mode 100644
index 0000000..7690a80
--- /dev/null
+++ b/frysk-imports/libunwind/src/sh/Gget_save_loc.c
@@ -0,0 +1,83 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+   Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com>
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "unwind_i.h"
+
+PROTECTED int
+unw_get_save_loc (unw_cursor_t *cursor, int reg, unw_save_loc_t *sloc)
+{
+  struct cursor *c = (struct cursor *) cursor;
+  dwarf_loc_t loc;
+
+  switch (reg)
+    {
+    case UNW_SH_R0:
+    case UNW_SH_R1:
+    case UNW_SH_R2:
+    case UNW_SH_R3:
+    case UNW_SH_R4:
+    case UNW_SH_R5:
+    case UNW_SH_R6:
+    case UNW_SH_R7:
+    case UNW_SH_R8:
+    case UNW_SH_R9:
+    case UNW_SH_R10:
+    case UNW_SH_R11:
+    case UNW_SH_R12:
+    case UNW_SH_R13:
+    case UNW_SH_R14:
+    case UNW_SH_R15:
+    case UNW_SH_PC:
+    case UNW_SH_PR:
+      loc = c->dwarf.loc[reg];
+      break;
+
+    default:
+      loc = DWARF_NULL_LOC;     /* default to "not saved" */
+      break;
+    }
+
+  memset (sloc, 0, sizeof (*sloc));
+
+  if (DWARF_IS_NULL_LOC (loc))
+    {
+      sloc->type = UNW_SLT_NONE;
+      return 0;
+    }
+
+#if !defined(UNW_LOCAL_ONLY)
+  if (DWARF_IS_REG_LOC (loc))
+    {
+      sloc->type = UNW_SLT_REG;
+      sloc->u.regnum = DWARF_GET_LOC (loc);
+    }
+  else
+#endif
+    {
+      sloc->type = UNW_SLT_MEMORY;
+      sloc->u.addr = DWARF_GET_LOC (loc);
+    }
+  return 0;
+}
diff --git a/frysk-imports/libunwind/src/sh/Gglobal.c b/frysk-imports/libunwind/src/sh/Gglobal.c
new file mode 100644
index 0000000..ed27333
--- /dev/null
+++ b/frysk-imports/libunwind/src/sh/Gglobal.c
@@ -0,0 +1,56 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+   Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com>
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "unwind_i.h"
+#include "dwarf_i.h"
+
+HIDDEN define_lock (sh_lock);
+HIDDEN int tdep_init_done;
+
+HIDDEN void
+tdep_init (void)
+{
+  intrmask_t saved_mask;
+
+  sigfillset (&unwi_full_mask);
+
+  lock_acquire (&sh_lock, saved_mask);
+  {
+    if (tdep_init_done)
+      /* another thread else beat us to it... */
+      goto out;
+
+    mi_init ();
+
+    dwarf_init ();
+
+#ifndef UNW_REMOTE_ONLY
+    sh_local_addr_space_init ();
+#endif
+    tdep_init_done = 1; /* signal that we're initialized... */
+  }
+ out:
+  lock_release (&sh_lock, saved_mask);
+}
diff --git a/frysk-imports/libunwind/src/sh/Ginit.c b/frysk-imports/libunwind/src/sh/Ginit.c
new file mode 100644
index 0000000..b380db1
--- /dev/null
+++ b/frysk-imports/libunwind/src/sh/Ginit.c
@@ -0,0 +1,186 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+   Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com>
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "unwind_i.h"
+
+#ifdef UNW_REMOTE_ONLY
+
+/* unw_local_addr_space is a NULL pointer in this case.  */
+PROTECTED unw_addr_space_t unw_local_addr_space;
+
+#else /* !UNW_REMOTE_ONLY */
+
+static struct unw_addr_space local_addr_space;
+
+PROTECTED unw_addr_space_t unw_local_addr_space = &local_addr_space;
+
+static inline void *
+uc_addr (ucontext_t *uc, int reg)
+{
+  if (reg >= UNW_SH_R0 && reg <= UNW_SH_PR)
+    return &uc->uc_mcontext.gregs[reg];
+  else
+    return NULL;
+}
+
+# ifdef UNW_LOCAL_ONLY
+
+HIDDEN void *
+tdep_uc_addr (ucontext_t *uc, int reg)
+{
+  return uc_addr (uc, reg);
+}
+
+# endif /* UNW_LOCAL_ONLY */
+
+HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
+
+/* XXX fix me: there is currently no way to locate the dyn-info list
+       by a remote unwinder.  On ia64, this is done via a special
+       unwind-table entry.  Perhaps something similar can be done with
+       DWARF2 unwind info.  */
+
+static void
+put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
+{
+  /* it's a no-op */
+}
+
+static int
+get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
+                        void *arg)
+{
+  *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
+  return 0;
+}
+
+static int
+access_mem (unw_addr_space_t as, unw_word_t addr, unw_word_t *val, int write,
+            void *arg)
+{
+  if (write)
+    {
+      Debug (16, "mem[%x] <- %x\n", addr, *val);
+      *(unw_word_t *) addr = *val;
+    }
+  else
+    {
+      *val = *(unw_word_t *) addr;
+      Debug (16, "mem[%x] -> %x\n", addr, *val);
+    }
+  return 0;
+}
+
+static int
+access_reg (unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val, int write,
+            void *arg)
+{
+  unw_word_t *addr;
+  ucontext_t *uc = arg;
+
+  if (unw_is_fpreg (reg))
+    goto badreg;
+
+  if (!(addr = uc_addr (uc, reg)))
+    goto badreg;
+
+  if (write)
+    {
+      *(unw_word_t *) addr = *val;
+      Debug (12, "%s <- %x\n", unw_regname (reg), *val);
+    }
+  else
+    {
+      *val = *(unw_word_t *) addr;
+      Debug (12, "%s -> %x\n", unw_regname (reg), *val);
+    }
+  return 0;
+
+ badreg:
+  Debug (1, "bad register number %u\n", reg);
+  return -UNW_EBADREG;
+}
+
+static int
+access_fpreg (unw_addr_space_t as, unw_regnum_t reg, unw_fpreg_t *val,
+              int write, void *arg)
+{
+  ucontext_t *uc = arg;
+  unw_fpreg_t *addr;
+
+  if (!unw_is_fpreg (reg))
+    goto badreg;
+
+  if (!(addr = uc_addr (uc, reg)))
+    goto badreg;
+
+  if (write)
+    {
+      Debug (12, "%s <- %08lx.%08lx.%08lx\n", unw_regname (reg),
+             ((long *)val)[0], ((long *)val)[1], ((long *)val)[2]);
+      *(unw_fpreg_t *) addr = *val;
+    }
+  else
+    {
+      *val = *(unw_fpreg_t *) addr;
+      Debug (12, "%s -> %08lx.%08lx.%08lx\n", unw_regname (reg),
+             ((long *)val)[0], ((long *)val)[1], ((long *)val)[2]);
+    }
+  return 0;
+
+ badreg:
+  Debug (1, "bad register number %u\n", reg);
+  /* attempt to access a non-preserved register */
+  return -UNW_EBADREG;
+}
+
+static int
+get_static_proc_name (unw_addr_space_t as, unw_word_t ip,
+                      char *buf, size_t buf_len, unw_word_t *offp,
+                      void *arg)
+{
+  return _Uelf32_get_proc_name (as, getpid (), ip, buf, buf_len, offp);
+}
+
+HIDDEN void
+sh_local_addr_space_init (void)
+{
+  memset (&local_addr_space, 0, sizeof (local_addr_space));
+  local_addr_space.caching_policy = UNW_CACHE_GLOBAL;
+  local_addr_space.acc.find_proc_info = dwarf_find_proc_info;
+  local_addr_space.acc.put_unwind_info = put_unwind_info;
+  local_addr_space.acc.get_dyn_info_list_addr = get_dyn_info_list_addr;
+  local_addr_space.acc.access_mem = access_mem;
+  local_addr_space.acc.access_reg = access_reg;
+  local_addr_space.acc.access_fpreg = access_fpreg;
+  local_addr_space.acc.resume = sh_local_resume;
+  local_addr_space.acc.get_proc_name = get_static_proc_name;
+  unw_flush_cache (&local_addr_space, 0, 0);
+}
+
+#endif /* !UNW_REMOTE_ONLY */
diff --git a/frysk-imports/libunwind/src/sh/Ginit_local.c b/frysk-imports/libunwind/src/sh/Ginit_local.c
new file mode 100644
index 0000000..e1cc30c
--- /dev/null
+++ b/frysk-imports/libunwind/src/sh/Ginit_local.c
@@ -0,0 +1,55 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+   Copyright 2011 Linaro Limited
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "unwind_i.h"
+#include "init.h"
+
+#ifdef UNW_REMOTE_ONLY
+
+PROTECTED int
+unw_init_local (unw_cursor_t *cursor, unw_context_t *uc)
+{
+  return -UNW_EINVAL;
+}
+
+#else /* !UNW_REMOTE_ONLY */
+
+PROTECTED int
+unw_init_local (unw_cursor_t *cursor, unw_context_t *uc)
+{
+  struct cursor *c = (struct cursor *) cursor;
+
+  if (!tdep_init_done)
+    tdep_init ();
+
+  Debug (1, "(cursor=%p)\n", c);
+
+  c->dwarf.as = unw_local_addr_space;
+  c->dwarf.as_arg = uc;
+
+  return common_init (c, 1);
+}
+
+#endif /* !UNW_REMOTE_ONLY */
diff --git a/frysk-imports/libunwind/src/sh/Ginit_remote.c b/frysk-imports/libunwind/src/sh/Ginit_remote.c
new file mode 100644
index 0000000..f284e99
--- /dev/null
+++ b/frysk-imports/libunwind/src/sh/Ginit_remote.c
@@ -0,0 +1,45 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "init.h"
+#include "unwind_i.h"
+
+PROTECTED int
+unw_init_remote (unw_cursor_t *cursor, unw_addr_space_t as, void *as_arg)
+{
+#ifdef UNW_LOCAL_ONLY
+  return -UNW_EINVAL;
+#else /* !UNW_LOCAL_ONLY */
+  struct cursor *c = (struct cursor *) cursor;
+
+  if (!tdep_init_done)
+    tdep_init ();
+
+  Debug (1, "(cursor=%p)\n", c);
+
+  c->dwarf.as = as;
+  c->dwarf.as_arg = as_arg;
+  return common_init (c, 0);
+#endif /* !UNW_LOCAL_ONLY */
+}
diff --git a/frysk-imports/libunwind/src/sh/Gis_signal_frame.c b/frysk-imports/libunwind/src/sh/Gis_signal_frame.c
new file mode 100644
index 0000000..9719f8e
--- /dev/null
+++ b/frysk-imports/libunwind/src/sh/Gis_signal_frame.c
@@ -0,0 +1,119 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com>
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "unwind_i.h"
+
+/* Disassembly of the Linux VDSO sigreturn functions:
+
+00000000 <__kernel_sigreturn>:
+   0:   05 93           mov.w   e <__kernel_sigreturn+0xe>,r3   ! 77
+   2:   10 c3           trapa   #16
+   4:   0b 20           or      r0,r0
+   6:   0b 20           or      r0,r0
+   8:   0b 20           or      r0,r0
+   a:   0b 20           or      r0,r0
+   c:   0b 20           or      r0,r0
+   e:   77 00           .word 0x0077
+  10:   09 00           nop
+  12:   09 00           nop
+  14:   09 00           nop
+  16:   09 00           nop
+  18:   09 00           nop
+  1a:   09 00           nop
+  1c:   09 00           nop
+  1e:   09 00           nop
+
+00000020 <__kernel_rt_sigreturn>:
+  20:   05 93           mov.w   2e <__kernel_rt_sigreturn+0xe>,r3       ! ad
+  22:   10 c3           trapa   #16
+  24:   0b 20           or      r0,r0
+  26:   0b 20           or      r0,r0
+  28:   0b 20           or      r0,r0
+  2a:   0b 20           or      r0,r0
+  2c:   0b 20           or      r0,r0
+  2e:   ad 00           mov.w   @(r0,r10),r0
+  30:   09 00           nop
+  32:   09 00           nop
+  34:   09 00           nop
+  36:   09 00           nop
+  38:   09 00           nop
+  3a:   09 00           nop
+  3c:   09 00           nop
+  3e:   09 00           nop
+*/
+
+PROTECTED int
+unw_is_signal_frame (unw_cursor_t *cursor)
+{
+#ifdef __linux__
+  struct cursor *c = (struct cursor *) cursor;
+  unw_word_t w0, ip;
+  unw_addr_space_t as;
+  unw_accessors_t *a;
+  void *arg;
+  int ret;
+
+  as = c->dwarf.as;
+  a = unw_get_accessors (as);
+  arg = c->dwarf.as_arg;
+
+  ip = c->dwarf.ip;
+
+  ret = (*a->access_mem) (as, ip, &w0, 0, arg);
+  if (ret < 0)
+    return ret;
+
+  if (w0 != 0xc3109305)
+    return 0;
+
+  ret = (*a->access_mem) (as, ip+4, &w0, 0, arg);
+  if (ret < 0)
+    return ret;
+
+  if (w0 != 0x200b200b)
+    return 0;
+
+  ret = (*a->access_mem) (as, ip+8, &w0, 0, arg);
+  if (ret < 0)
+    return ret;
+
+  if (w0 != 0x200b200b)
+    return 0;
+
+  ret = (*a->access_mem) (as, ip+12, &w0, 0, arg);
+  if (ret < 0)
+    return ret;
+
+  if (w0 == 0x0077200b)
+    return 1; /* non-RT */
+  else if (w0 == 0x00ad200b)
+    return 2; /* RT */
+
+  /* does not look like a signal frame */
+  return 0;
+
+#else
+  return -UNW_ENOINFO;
+#endif
+}
diff --git a/frysk-imports/libunwind/src/sh/Gregs.c b/frysk-imports/libunwind/src/sh/Gregs.c
new file mode 100644
index 0000000..fb4ca74
--- /dev/null
+++ b/frysk-imports/libunwind/src/sh/Gregs.c
@@ -0,0 +1,79 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+   Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com>
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "unwind_i.h"
+
+HIDDEN int
+tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
+                 int write)
+{
+  dwarf_loc_t loc = DWARF_NULL_LOC;
+
+  switch (reg)
+    {
+    case UNW_SH_R0:
+    case UNW_SH_R1:
+    case UNW_SH_R2:
+    case UNW_SH_R3:
+    case UNW_SH_R4:
+    case UNW_SH_R5:
+    case UNW_SH_R6:
+    case UNW_SH_R7:
+    case UNW_SH_R8:
+    case UNW_SH_R9:
+    case UNW_SH_R10:
+    case UNW_SH_R11:
+    case UNW_SH_R12:
+    case UNW_SH_R13:
+    case UNW_SH_R14:
+    case UNW_SH_PC:
+    case UNW_SH_PR:
+      loc = c->dwarf.loc[reg];
+      break;
+
+    case UNW_SH_R15:
+      if (write)
+        return -UNW_EREADONLYREG;
+      *valp = c->dwarf.cfa;
+      return 0;
+
+    default:
+      Debug (1, "bad register number %u\n", reg);
+      return -UNW_EBADREG;
+    }
+
+  if (write)
+    return dwarf_put (&c->dwarf, loc, *valp);
+  else
+    return dwarf_get (&c->dwarf, loc, valp);
+}
+
+HIDDEN int
+tdep_access_fpreg (struct cursor *c, unw_regnum_t reg, unw_fpreg_t *valp,
+                   int write)
+{
+  Debug (1, "bad register number %u\n", reg);
+  return -UNW_EBADREG;
+}
diff --git a/frysk-imports/libunwind/src/sh/Gresume.c b/frysk-imports/libunwind/src/sh/Gresume.c
new file mode 100644
index 0000000..b14e419
--- /dev/null
+++ b/frysk-imports/libunwind/src/sh/Gresume.c
@@ -0,0 +1,165 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+   Copyright 2011 Linaro Limited
+   Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com>
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "unwind_i.h"
+#include "offsets.h"
+
+#ifndef UNW_REMOTE_ONLY
+
+HIDDEN inline int
+sh_local_resume (unw_addr_space_t as, unw_cursor_t *cursor, void *arg)
+{
+#ifdef __linux__
+  struct cursor *c = (struct cursor *) cursor;
+  unw_tdep_context_t *uc = c->dwarf.as_arg;
+
+  if (c->sigcontext_format == SH_SCF_NONE)
+    {
+      /* Since there are no signals involved here we restore the non scratch
+         registers only.  */
+      unsigned long regs[8];
+      regs[0] = uc->uc_mcontext.gregs[8];
+      regs[1] = uc->uc_mcontext.gregs[9];
+      regs[2] = uc->uc_mcontext.gregs[10];
+      regs[3] = uc->uc_mcontext.gregs[11];
+      regs[4] = uc->uc_mcontext.gregs[12];
+      regs[5] = uc->uc_mcontext.gregs[13];
+      regs[6] = uc->uc_mcontext.gregs[14];
+      regs[7] = uc->uc_mcontext.gregs[15];
+      unsigned long pc = uc->uc_mcontext.pr;
+
+      struct regs_overlay {
+        char x[sizeof(regs)];
+      };
+
+      asm volatile (
+        "mov.l @%0+, r8\n"
+        "mov.l @%0+, r9\n"
+        "mov.l @%0+, r10\n"
+        "mov.l @%0+, r11\n"
+        "mov.l @%0+, r12\n"
+        "mov.l @%0+, r13\n"
+        "mov.l @%0+, r14\n"
+        "mov.l @%0,  r15\n"
+        "lds %1, pr\n"
+        "rts\n"
+        "nop\n"
+        :
+        : "r" (regs),
+          "r" (pc),
+          "m" (*(struct regs_overlay *)regs)
+      );
+    }
+  else
+    {
+      /* In case a signal frame is involved, we're using its trampoline which
+         calls sigreturn.  */
+      struct sigcontext *sc = (struct sigcontext *) c->sigcontext_addr;
+      sc->sc_regs[0] = uc->uc_mcontext.gregs[0];
+      sc->sc_regs[1] = uc->uc_mcontext.gregs[1];
+      sc->sc_regs[2] = uc->uc_mcontext.gregs[2];
+      sc->sc_regs[3] = uc->uc_mcontext.gregs[3];
+      sc->sc_regs[4] = uc->uc_mcontext.gregs[4];
+      sc->sc_regs[5] = uc->uc_mcontext.gregs[5];
+      sc->sc_regs[6] = uc->uc_mcontext.gregs[6];
+      sc->sc_regs[7] = uc->uc_mcontext.gregs[7];
+      sc->sc_regs[8] = uc->uc_mcontext.gregs[8];
+      sc->sc_regs[9] = uc->uc_mcontext.gregs[9];
+      sc->sc_regs[10] = uc->uc_mcontext.gregs[10];
+      sc->sc_regs[11] = uc->uc_mcontext.gregs[11];
+      sc->sc_regs[12] = uc->uc_mcontext.gregs[12];
+      sc->sc_regs[13] = uc->uc_mcontext.gregs[13];
+      sc->sc_regs[14] = uc->uc_mcontext.gregs[14];
+      sc->sc_regs[15] = uc->uc_mcontext.gregs[15];
+      sc->sc_pc = uc->uc_mcontext.pc;
+      sc->sc_pr = uc->uc_mcontext.pr;
+
+      /* Set the SP and the PC in order to continue execution at the modified
+         trampoline which restores the signal mask and the registers.  */
+      asm __volatile__ (
+        "mov %0, r15\n"
+        "lds %1, pr\n"
+        "rts\n"
+        "nop\n"
+        :
+        : "r" (c->sigcontext_sp),
+          "r" (c->sigcontext_pc)
+      );
+   }
+  unreachable();
+#endif
+  return -UNW_EINVAL;
+}
+
+#endif /* !UNW_REMOTE_ONLY */
+
+static inline void
+establish_machine_state (struct cursor *c)
+{
+  unw_addr_space_t as = c->dwarf.as;
+  void *arg = c->dwarf.as_arg;
+  unw_fpreg_t fpval;
+  unw_word_t val;
+  int reg;
+
+  Debug (8, "copying out cursor state\n");
+
+  for (reg = 0; reg <= UNW_REG_LAST; ++reg)
+    {
+      Debug (16, "copying %s %d\n", unw_regname (reg), reg);
+      if (unw_is_fpreg (reg))
+        {
+          if (tdep_access_fpreg (c, reg, &fpval, 0) >= 0)
+            as->acc.access_fpreg (as, reg, &fpval, 1, arg);
+        }
+      else
+        {
+          if (tdep_access_reg (c, reg, &val, 0) >= 0)
+            as->acc.access_reg (as, reg, &val, 1, arg);
+        }
+    }
+}
+
+PROTECTED int
+unw_resume (unw_cursor_t *cursor)
+{
+  struct cursor *c = (struct cursor *) cursor;
+
+  Debug (1, "(cursor=%p)\n", c);
+
+  if (!c->dwarf.ip)
+    {
+      /* This can happen easily when the frame-chain gets truncated
+         due to bad or missing unwind-info.  */
+      Debug (1, "refusing to resume execution at address 0\n");
+      return -UNW_EINVAL;
+    }
+
+  establish_machine_state (c);
+
+  return (*c->dwarf.as->acc.resume) (c->dwarf.as, (unw_cursor_t *) c,
+                                     c->dwarf.as_arg);
+}
diff --git a/frysk-imports/libunwind/src/sh/Gstep.c b/frysk-imports/libunwind/src/sh/Gstep.c
new file mode 100644
index 0000000..9bbb5ff
--- /dev/null
+++ b/frysk-imports/libunwind/src/sh/Gstep.c
@@ -0,0 +1,117 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+   Copyright 2011 Linaro Limited
+   Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com>
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "unwind_i.h"
+#include "offsets.h"
+
+PROTECTED int
+unw_handle_signal_frame (unw_cursor_t *cursor)
+{
+  struct cursor *c = (struct cursor *) cursor;
+  int ret;
+  unw_word_t sc_addr, sp, sp_addr = c->dwarf.cfa;
+  struct dwarf_loc sp_loc = DWARF_LOC (sp_addr, 0);
+
+  if ((ret = dwarf_get (&c->dwarf, sp_loc, &sp)) < 0)
+    return -UNW_EUNSPEC;
+
+  ret = unw_is_signal_frame (cursor);
+  Debug(1, "unw_is_signal_frame()=%d\n", ret);
+
+  /* Save the SP and PC to be able to return execution at this point
+     later in time (unw_resume).  */
+  c->sigcontext_sp = c->dwarf.cfa;
+  c->sigcontext_pc = c->dwarf.ip;
+
+  if (ret == 1)
+    {
+      /* Handle non-RT signal frame. */
+      c->sigcontext_format = SH_SCF_LINUX_SIGFRAME;
+      sc_addr = sp_addr;
+    }
+  else if (ret == 2)
+    {
+      /* Handle RT signal frame. */
+      c->sigcontext_format = SH_SCF_LINUX_RT_SIGFRAME;
+      sc_addr = sp_addr + sizeof (siginfo_t) + LINUX_UC_MCONTEXT_OFF;
+    }
+  else
+    return -UNW_EUNSPEC;
+
+  c->sigcontext_addr = sc_addr;
+
+  /* Update the dwarf cursor.
+     Set the location of the registers to the corresponding addresses of the
+     uc_mcontext / sigcontext structure contents.  */
+  c->dwarf.loc[UNW_SH_R0]  = DWARF_LOC (sc_addr + LINUX_SC_R0_OFF, 0);
+  c->dwarf.loc[UNW_SH_R1]  = DWARF_LOC (sc_addr + LINUX_SC_R1_OFF, 0);
+  c->dwarf.loc[UNW_SH_R2]  = DWARF_LOC (sc_addr + LINUX_SC_R2_OFF, 0);
+  c->dwarf.loc[UNW_SH_R3]  = DWARF_LOC (sc_addr + LINUX_SC_R3_OFF, 0);
+  c->dwarf.loc[UNW_SH_R4]  = DWARF_LOC (sc_addr + LINUX_SC_R4_OFF, 0);
+  c->dwarf.loc[UNW_SH_R5]  = DWARF_LOC (sc_addr + LINUX_SC_R5_OFF, 0);
+  c->dwarf.loc[UNW_SH_R6]  = DWARF_LOC (sc_addr + LINUX_SC_R6_OFF, 0);
+  c->dwarf.loc[UNW_SH_R7]  = DWARF_LOC (sc_addr + LINUX_SC_R7_OFF, 0);
+  c->dwarf.loc[UNW_SH_R8]  = DWARF_LOC (sc_addr + LINUX_SC_R8_OFF, 0);
+  c->dwarf.loc[UNW_SH_R9]  = DWARF_LOC (sc_addr + LINUX_SC_R9_OFF, 0);
+  c->dwarf.loc[UNW_SH_R10] = DWARF_LOC (sc_addr + LINUX_SC_R10_OFF, 0);
+  c->dwarf.loc[UNW_SH_R11] = DWARF_LOC (sc_addr + LINUX_SC_R11_OFF, 0);
+  c->dwarf.loc[UNW_SH_R12] = DWARF_LOC (sc_addr + LINUX_SC_R12_OFF, 0);
+  c->dwarf.loc[UNW_SH_R13] = DWARF_LOC (sc_addr + LINUX_SC_R13_OFF, 0);
+  c->dwarf.loc[UNW_SH_R14] = DWARF_LOC (sc_addr + LINUX_SC_R14_OFF, 0);
+  c->dwarf.loc[UNW_SH_R15] = DWARF_LOC (sc_addr + LINUX_SC_R15_OFF, 0);
+  c->dwarf.loc[UNW_SH_PR]  = DWARF_LOC (sc_addr + LINUX_SC_PR_OFF, 0);
+  c->dwarf.loc[UNW_SH_PC]  = DWARF_LOC (sc_addr + LINUX_SC_PC_OFF, 0);
+
+  /* Set SP/CFA and PC/IP.  */
+  dwarf_get (&c->dwarf, c->dwarf.loc[UNW_SH_R15], &c->dwarf.cfa);
+  dwarf_get (&c->dwarf, c->dwarf.loc[UNW_SH_PC], &c->dwarf.ip);
+
+  c->dwarf.pi_valid = 0;
+
+  return 1;
+}
+
+PROTECTED int
+unw_step (unw_cursor_t *cursor)
+{
+  struct cursor *c = (struct cursor *) cursor;
+  int ret;
+
+  Debug (1, "(cursor=%p)\n", c);
+
+  if (unw_is_signal_frame (cursor))
+    return unw_handle_signal_frame (cursor);
+
+  ret = dwarf_step (&c->dwarf);
+
+  if (unlikely (ret == -UNW_ESTOPUNWIND))
+    return ret;
+
+  if (unlikely (ret < 0))
+    return 0;
+
+  return (c->dwarf.ip == 0) ? 0 : 1;
+}
diff --git a/frysk-imports/libunwind/src/sh/Lcreate_addr_space.c b/frysk-imports/libunwind/src/sh/Lcreate_addr_space.c
new file mode 100644
index 0000000..0f2dc6b
--- /dev/null
+++ b/frysk-imports/libunwind/src/sh/Lcreate_addr_space.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Gcreate_addr_space.c"
+#endif
diff --git a/frysk-imports/libunwind/src/sh/Lget_proc_info.c b/frysk-imports/libunwind/src/sh/Lget_proc_info.c
new file mode 100644
index 0000000..69028b0
--- /dev/null
+++ b/frysk-imports/libunwind/src/sh/Lget_proc_info.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Gget_proc_info.c"
+#endif
diff --git a/frysk-imports/libunwind/src/sh/Lget_save_loc.c b/frysk-imports/libunwind/src/sh/Lget_save_loc.c
new file mode 100644
index 0000000..9ea048a
--- /dev/null
+++ b/frysk-imports/libunwind/src/sh/Lget_save_loc.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Gget_save_loc.c"
+#endif
diff --git a/frysk-imports/libunwind/src/sh/Lglobal.c b/frysk-imports/libunwind/src/sh/Lglobal.c
new file mode 100644
index 0000000..6d7b489
--- /dev/null
+++ b/frysk-imports/libunwind/src/sh/Lglobal.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Gglobal.c"
+#endif
diff --git a/frysk-imports/libunwind/src/sh/Linit.c b/frysk-imports/libunwind/src/sh/Linit.c
new file mode 100644
index 0000000..e9abfdd
--- /dev/null
+++ b/frysk-imports/libunwind/src/sh/Linit.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Ginit.c"
+#endif
diff --git a/frysk-imports/libunwind/src/sh/Linit_local.c b/frysk-imports/libunwind/src/sh/Linit_local.c
new file mode 100644
index 0000000..68a1687
--- /dev/null
+++ b/frysk-imports/libunwind/src/sh/Linit_local.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Ginit_local.c"
+#endif
diff --git a/frysk-imports/libunwind/src/sh/Linit_remote.c b/frysk-imports/libunwind/src/sh/Linit_remote.c
new file mode 100644
index 0000000..58cb04a
--- /dev/null
+++ b/frysk-imports/libunwind/src/sh/Linit_remote.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Ginit_remote.c"
+#endif
diff --git a/frysk-imports/libunwind/src/sh/Lis_signal_frame.c b/frysk-imports/libunwind/src/sh/Lis_signal_frame.c
new file mode 100644
index 0000000..b9a7c4f
--- /dev/null
+++ b/frysk-imports/libunwind/src/sh/Lis_signal_frame.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Gis_signal_frame.c"
+#endif
diff --git a/frysk-imports/libunwind/src/sh/Lregs.c b/frysk-imports/libunwind/src/sh/Lregs.c
new file mode 100644
index 0000000..2c9c75c
--- /dev/null
+++ b/frysk-imports/libunwind/src/sh/Lregs.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Gregs.c"
+#endif
diff --git a/frysk-imports/libunwind/src/sh/Lresume.c b/frysk-imports/libunwind/src/sh/Lresume.c
new file mode 100644
index 0000000..41a8cf0
--- /dev/null
+++ b/frysk-imports/libunwind/src/sh/Lresume.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Gresume.c"
+#endif
diff --git a/frysk-imports/libunwind/src/sh/Lstep.c b/frysk-imports/libunwind/src/sh/Lstep.c
new file mode 100644
index 0000000..c1ac3c7
--- /dev/null
+++ b/frysk-imports/libunwind/src/sh/Lstep.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Gstep.c"
+#endif
diff --git a/frysk-imports/libunwind/src/sh/gen-offsets.c b/frysk-imports/libunwind/src/sh/gen-offsets.c
new file mode 100644
index 0000000..16695a6
--- /dev/null
+++ b/frysk-imports/libunwind/src/sh/gen-offsets.c
@@ -0,0 +1,51 @@
+#include <stdio.h>
+#include <stddef.h>
+#include <ucontext.h>
+#include <asm/sigcontext.h>
+
+#define UC(N,X) \
+  printf ("#define LINUX_UC_" N "_OFF\t0x%X\n", offsetof (ucontext_t, X))
+
+#define SC(N,X) \
+  printf ("#define LINUX_SC_" N "_OFF\t0x%X\n", offsetof (struct sigcontext, X))
+
+int
+main (void)
+{
+  printf (
+"/* Linux-specific definitions: */\n\n"
+
+"/* Define various structure offsets to simplify cross-compilation.  */\n\n"
+
+"/* Offsets for SH Linux \"ucontext_t\":  */\n\n");
+
+  UC ("FLAGS", uc_flags);
+  UC ("LINK", uc_link);
+  UC ("STACK", uc_stack);
+  UC ("MCONTEXT", uc_mcontext);
+  UC ("SIGMASK", uc_sigmask);
+
+  printf ("\n/* Offsets for SH Linux \"struct sigcontext\":  */\n\n");
+
+  SC ("R0",  sc_regs[0]);
+  SC ("R1",  sc_regs[1]);
+  SC ("R2",  sc_regs[2]);
+  SC ("R3",  sc_regs[3]);
+  SC ("R4",  sc_regs[4]);
+  SC ("R5",  sc_regs[5]);
+  SC ("R6",  sc_regs[6]);
+  SC ("R7",  sc_regs[7]);
+  SC ("R8",  sc_regs[8]);
+  SC ("R9",  sc_regs[9]);
+  SC ("R10", sc_regs[10]);
+  SC ("R11", sc_regs[11]);
+  SC ("R12", sc_regs[12]);
+  SC ("R13", sc_regs[13]);
+  SC ("R14", sc_regs[14]);
+  SC ("R15", sc_regs[15]);
+
+  SC ("PC", sc_pc);
+  SC ("PR", sc_pr);
+
+  return 0;
+}
diff --git a/frysk-imports/libunwind/src/sh/init.h b/frysk-imports/libunwind/src/sh/init.h
new file mode 100644
index 0000000..a180258
--- /dev/null
+++ b/frysk-imports/libunwind/src/sh/init.h
@@ -0,0 +1,74 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com>
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "unwind_i.h"
+
+static inline int
+common_init (struct cursor *c, unsigned use_prev_instr)
+{
+  int ret;
+
+  c->dwarf.loc[UNW_SH_R0]  = DWARF_REG_LOC (&c->dwarf, UNW_SH_R0);
+  c->dwarf.loc[UNW_SH_R1]  = DWARF_REG_LOC (&c->dwarf, UNW_SH_R1);
+  c->dwarf.loc[UNW_SH_R2]  = DWARF_REG_LOC (&c->dwarf, UNW_SH_R2);
+  c->dwarf.loc[UNW_SH_R3]  = DWARF_REG_LOC (&c->dwarf, UNW_SH_R3);
+  c->dwarf.loc[UNW_SH_R4]  = DWARF_REG_LOC (&c->dwarf, UNW_SH_R4);
+  c->dwarf.loc[UNW_SH_R5]  = DWARF_REG_LOC (&c->dwarf, UNW_SH_R5);
+  c->dwarf.loc[UNW_SH_R6]  = DWARF_REG_LOC (&c->dwarf, UNW_SH_R6);
+  c->dwarf.loc[UNW_SH_R7]  = DWARF_REG_LOC (&c->dwarf, UNW_SH_R7);
+  c->dwarf.loc[UNW_SH_R8]  = DWARF_REG_LOC (&c->dwarf, UNW_SH_R8);
+  c->dwarf.loc[UNW_SH_R9]  = DWARF_REG_LOC (&c->dwarf, UNW_SH_R9);
+  c->dwarf.loc[UNW_SH_R10] = DWARF_REG_LOC (&c->dwarf, UNW_SH_R10);
+  c->dwarf.loc[UNW_SH_R11] = DWARF_REG_LOC (&c->dwarf, UNW_SH_R11);
+  c->dwarf.loc[UNW_SH_R12] = DWARF_REG_LOC (&c->dwarf, UNW_SH_R12);
+  c->dwarf.loc[UNW_SH_R13] = DWARF_REG_LOC (&c->dwarf, UNW_SH_R13);
+  c->dwarf.loc[UNW_SH_R14] = DWARF_REG_LOC (&c->dwarf, UNW_SH_R14);
+  c->dwarf.loc[UNW_SH_R15] = DWARF_REG_LOC (&c->dwarf, UNW_SH_R15);
+  c->dwarf.loc[UNW_SH_PC]  = DWARF_REG_LOC (&c->dwarf, UNW_SH_PC);
+  c->dwarf.loc[UNW_SH_PR]  = DWARF_REG_LOC (&c->dwarf, UNW_SH_PR);
+
+  ret = dwarf_get (&c->dwarf, c->dwarf.loc[UNW_SH_PC], &c->dwarf.ip);
+  if (ret < 0)
+    return ret;
+
+  ret = dwarf_get (&c->dwarf, c->dwarf.loc[UNW_TDEP_SP], &c->dwarf.cfa);
+  if (ret < 0)
+    return ret;
+
+  c->sigcontext_format = SH_SCF_NONE;
+  c->sigcontext_addr = 0;
+  c->sigcontext_sp = 0;
+  c->sigcontext_pc = 0;
+
+  c->dwarf.args_size = 0;
+  c->dwarf.ret_addr_column = 0;
+  c->dwarf.stash_frames = 0;
+  c->dwarf.use_prev_instr = use_prev_instr;
+  c->dwarf.pi_valid = 0;
+  c->dwarf.pi_is_dynamic = 0;
+  c->dwarf.hint = 0;
+  c->dwarf.prev_rs = 0;
+
+  return 0;
+}
diff --git a/frysk-imports/libunwind/src/sh/is_fpreg.c b/frysk-imports/libunwind/src/sh/is_fpreg.c
new file mode 100644
index 0000000..c351f81
--- /dev/null
+++ b/frysk-imports/libunwind/src/sh/is_fpreg.c
@@ -0,0 +1,32 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "libunwind_i.h"
+
+PROTECTED int
+unw_is_fpreg (int regnum)
+{
+  /* FIXME: Support FP.  */
+  return 0;
+}
diff --git a/frysk-imports/libunwind/src/sh/offsets.h b/frysk-imports/libunwind/src/sh/offsets.h
new file mode 100644
index 0000000..b02d8ae
--- /dev/null
+++ b/frysk-imports/libunwind/src/sh/offsets.h
@@ -0,0 +1,32 @@
+/* Linux-specific definitions: */
+
+/* Define various structure offsets to simplify cross-compilation.  */
+
+/* Offsets for SH Linux "ucontext_t":  */
+
+#define LINUX_UC_FLAGS_OFF      0x0
+#define LINUX_UC_LINK_OFF       0x4
+#define LINUX_UC_STACK_OFF      0x8
+#define LINUX_UC_MCONTEXT_OFF   0x14
+#define LINUX_UC_SIGMASK_OFF    0xFC
+
+/* Offsets for SH Linux "struct sigcontext":  */
+
+#define LINUX_SC_R0_OFF 0x4
+#define LINUX_SC_R1_OFF 0x8
+#define LINUX_SC_R2_OFF 0xC
+#define LINUX_SC_R3_OFF 0x10
+#define LINUX_SC_R4_OFF 0x14
+#define LINUX_SC_R5_OFF 0x18
+#define LINUX_SC_R6_OFF 0x1C
+#define LINUX_SC_R7_OFF 0x20
+#define LINUX_SC_R8_OFF 0x24
+#define LINUX_SC_R9_OFF 0x28
+#define LINUX_SC_R10_OFF        0x2C
+#define LINUX_SC_R11_OFF        0x30
+#define LINUX_SC_R12_OFF        0x34
+#define LINUX_SC_R13_OFF        0x38
+#define LINUX_SC_R14_OFF        0x3C
+#define LINUX_SC_R15_OFF        0x40
+#define LINUX_SC_PC_OFF 0x44
+#define LINUX_SC_PR_OFF 0x48
diff --git a/frysk-imports/libunwind/src/sh/regname.c b/frysk-imports/libunwind/src/sh/regname.c
new file mode 100644
index 0000000..dcab240
--- /dev/null
+++ b/frysk-imports/libunwind/src/sh/regname.c
@@ -0,0 +1,56 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com>
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "unwind_i.h"
+
+static const char *const regname[] =
+  {
+    [UNW_SH_R0]  = "r0",
+    [UNW_SH_R1]  = "r1",
+    [UNW_SH_R2]  = "r2",
+    [UNW_SH_R3]  = "r3",
+    [UNW_SH_R4]  = "r4",
+    [UNW_SH_R5]  = "r5",
+    [UNW_SH_R6]  = "r6",
+    [UNW_SH_R7]  = "r7",
+    [UNW_SH_R8]  = "r8",
+    [UNW_SH_R9]  = "r9",
+    [UNW_SH_R10] = "r10",
+    [UNW_SH_R11] = "r11",
+    [UNW_SH_R12] = "r12",
+    [UNW_SH_R13] = "r13",
+    [UNW_SH_R14] = "r14",
+    [UNW_SH_R15] = "r15",
+    [UNW_SH_PC]  = "pc",
+    [UNW_SH_PR]  = "pr",
+  };
+
+PROTECTED const char *
+unw_regname (unw_regnum_t reg)
+{
+  if (reg < (unw_regnum_t) ARRAY_SIZE (regname) && regname[reg] != NULL)
+    return regname[reg];
+  else
+    return "???";
+}
diff --git a/frysk-imports/libunwind/src/sh/siglongjmp.S b/frysk-imports/libunwind/src/sh/siglongjmp.S
new file mode 100644
index 0000000..9ca53d1
--- /dev/null
+++ b/frysk-imports/libunwind/src/sh/siglongjmp.S
@@ -0,0 +1,8 @@
+	/* Dummy implementation for now.  */
+
+	.globl _UI_siglongjmp_cont
+	.globl _UI_longjmp_cont
+
+_UI_siglongjmp_cont:
+_UI_longjmp_cont:
+	rts
diff --git a/frysk-imports/libunwind/src/sh/unwind_i.h b/frysk-imports/libunwind/src/sh/unwind_i.h
new file mode 100644
index 0000000..3066d84
--- /dev/null
+++ b/frysk-imports/libunwind/src/sh/unwind_i.h
@@ -0,0 +1,40 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com>
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#ifndef unwind_i_h
+#define unwind_i_h
+
+#include <libunwind-sh.h>
+
+#include "libunwind_i.h"
+
+#define sh_lock                         UNW_OBJ(lock)
+#define sh_local_resume                 UNW_OBJ(local_resume)
+#define sh_local_addr_space_init        UNW_OBJ(local_addr_space_init)
+
+extern void sh_local_addr_space_init (void);
+extern int sh_local_resume (unw_addr_space_t as, unw_cursor_t *cursor,
+                            void *arg);
+
+#endif /* unwind_i_h */
diff --git a/frysk-imports/libunwind/src/tilegx/Gcreate_addr_space.c b/frysk-imports/libunwind/src/tilegx/Gcreate_addr_space.c
new file mode 100644
index 0000000..a2821a3
--- /dev/null
+++ b/frysk-imports/libunwind/src/tilegx/Gcreate_addr_space.c
@@ -0,0 +1,65 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+   Copyright (C) 2014 Tilera Corp.
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include <stdlib.h>
+
+#include "unwind_i.h"
+
+PROTECTED unw_addr_space_t
+unw_create_addr_space (unw_accessors_t *a, int byte_order)
+{
+#ifdef UNW_LOCAL_ONLY
+  return NULL;
+#else
+  unw_addr_space_t as = malloc (sizeof (*as));
+
+  if (!as)
+    return NULL;
+
+  memset (as, 0, sizeof (*as));
+
+  as->acc = *a;
+
+  /*
+   * Tilegx supports only big or little-endian, not weird stuff like
+   * PDP_ENDIAN.
+   */
+  if (byte_order != 0
+      && byte_order != __LITTLE_ENDIAN
+      && byte_order != __BIG_ENDIAN)
+    return NULL;
+
+  if (byte_order == 0)
+    /* use host default: */
+    as->big_endian = (__BYTE_ORDER == __BIG_ENDIAN);
+  else
+    as->big_endian = (byte_order == __BIG_ENDIAN);
+
+  as->abi = UNW_TILEGX_ABI_N64;
+  as->addr_size = 8;
+
+  return as;
+#endif
+}
diff --git a/frysk-imports/libunwind/src/tilegx/Gget_proc_info.c b/frysk-imports/libunwind/src/tilegx/Gget_proc_info.c
new file mode 100644
index 0000000..f82700d
--- /dev/null
+++ b/frysk-imports/libunwind/src/tilegx/Gget_proc_info.c
@@ -0,0 +1,48 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+   Copyright (C) 2014 Tilera Corp.
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "unwind_i.h"
+
+PROTECTED int
+unw_get_proc_info (unw_cursor_t *cursor, unw_proc_info_t *pi)
+{
+  struct cursor *c = (struct cursor *) cursor;
+  int ret;
+
+  ret = dwarf_make_proc_info (&c->dwarf);
+
+  if (ret < 0)
+  {
+    /* On Tilegx, some routines i.e. _start() etc has no dwarf info.
+       Just simply mark the end of the frames. */
+    memset (pi, 0, sizeof (*pi));
+    pi->start_ip = c->dwarf.ip;
+    pi->end_ip = c->dwarf.ip + 1;
+    return 0;
+  }
+
+  *pi = c->dwarf.pi;
+  return 0;
+}
diff --git a/frysk-imports/libunwind/src/tilegx/Gget_save_loc.c b/frysk-imports/libunwind/src/tilegx/Gget_save_loc.c
new file mode 100644
index 0000000..ec474e1
--- /dev/null
+++ b/frysk-imports/libunwind/src/tilegx/Gget_save_loc.c
@@ -0,0 +1,62 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+   Copyright (C) 2014 Tilera Corp.
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "unwind_i.h"
+
+PROTECTED int
+unw_get_save_loc (unw_cursor_t *cursor, int reg, unw_save_loc_t *sloc)
+{
+  struct cursor *c = (struct cursor *) cursor;
+  dwarf_loc_t loc;
+
+  loc = DWARF_NULL_LOC;       /* default to "not saved" */
+
+  if (reg <= UNW_TILEGX_R55)
+    loc = c->dwarf.loc[reg - UNW_TILEGX_R0];
+  else
+    printf("\nInvalid register!");
+
+  memset (sloc, 0, sizeof (*sloc));
+
+  if (DWARF_IS_NULL_LOC (loc))
+    {
+      sloc->type = UNW_SLT_NONE;
+      return 0;
+    }
+
+#if !defined(UNW_LOCAL_ONLY)
+  if (DWARF_IS_REG_LOC (loc))
+    {
+      sloc->type = UNW_SLT_REG;
+      sloc->u.regnum = DWARF_GET_LOC (loc);
+    }
+  else
+#endif
+    {
+      sloc->type = UNW_SLT_MEMORY;
+      sloc->u.addr = DWARF_GET_LOC (loc);
+    }
+  return 0;
+}
diff --git a/frysk-imports/libunwind/src/tilegx/Gglobal.c b/frysk-imports/libunwind/src/tilegx/Gglobal.c
new file mode 100644
index 0000000..e18f50a
--- /dev/null
+++ b/frysk-imports/libunwind/src/tilegx/Gglobal.c
@@ -0,0 +1,64 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+   Copyright (C) 2014 Tilera Corp.
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "unwind_i.h"
+#include "dwarf_i.h"
+
+__attribute__((weak))
+pthread_mutex_t tilegx_lock = PTHREAD_MUTEX_INITIALIZER;
+HIDDEN int tdep_init_done;
+
+HIDDEN const uint8_t dwarf_to_unw_regnum_map[] =
+  {
+    0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
+    16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
+    32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
+    48, 49, 50, 51, 52, 53, 54, 55
+  };
+
+HIDDEN void
+tdep_init (void)
+{
+  intrmask_t saved_mask;
+
+  sigfillset (&unwi_full_mask);
+
+  lock_acquire (&tilegx_lock, saved_mask);
+
+  if (tdep_init_done)
+    /* another thread else beat us to it... */
+    goto out;
+
+  mi_init ();
+  dwarf_init ();
+
+#ifndef UNW_REMOTE_ONLY
+  tilegx_local_addr_space_init ();
+#endif
+  tdep_init_done = 1;  /* signal that we're initialized... */
+
+ out:
+  lock_release (&tilegx_lock, saved_mask);
+}
diff --git a/frysk-imports/libunwind/src/tilegx/Ginit.c b/frysk-imports/libunwind/src/tilegx/Ginit.c
new file mode 100644
index 0000000..df3ffca
--- /dev/null
+++ b/frysk-imports/libunwind/src/tilegx/Ginit.c
@@ -0,0 +1,167 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+   Copyright (C) 2014 Tilera Corp.
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "unwind_i.h"
+
+#ifdef UNW_REMOTE_ONLY
+
+/* unw_local_addr_space is a NULL pointer in this case.  */
+PROTECTED unw_addr_space_t unw_local_addr_space;
+
+#else /* !UNW_REMOTE_ONLY */
+
+static struct unw_addr_space local_addr_space;
+
+PROTECTED unw_addr_space_t unw_local_addr_space = &local_addr_space;
+
+/* Return the address of the 64-bit slot in UC for REG (even for o32,
+   where registers are 32-bit, the slots are still 64-bit).  */
+
+static inline void *
+uc_addr (ucontext_t *uc, int reg)
+{
+  if (reg >= UNW_TILEGX_R0 && reg < UNW_TILEGX_R0 + 56)
+    return &uc->uc_mcontext.gregs[reg - UNW_TILEGX_R0];
+  else if (reg == UNW_TILEGX_PC)
+    return &uc->uc_mcontext.pc;
+  else
+    return NULL;
+}
+
+# ifdef UNW_LOCAL_ONLY
+
+HIDDEN void *
+tdep_uc_addr (ucontext_t *uc, int reg)
+{
+  char *addr = uc_addr (uc, reg);
+  return addr;
+}
+
+# endif /* UNW_LOCAL_ONLY */
+
+HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
+
+/* XXX fix me: there is currently no way to locate the dyn-info list
+       by a remote unwinder.  On ia64, this is done via a special
+       unwind-table entry.  Perhaps something similar can be done with
+       DWARF2 unwind info.  */
+
+static void
+put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
+{
+  /* it's a no-op */
+}
+
+static int
+get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
+                        void *arg)
+{
+  *dyn_info_list_addr = (unw_word_t) (intptr_t) &_U_dyn_info_list;
+  return 0;
+}
+
+static int
+access_mem (unw_addr_space_t as, unw_word_t addr, unw_word_t *val, int write,
+            void *arg)
+{
+  if ((long long)addr & (sizeof(unw_word_t) - 1))
+    return 0;
+
+  if (write)
+    {
+      Debug (16, "mem[%llx] <- %llx\n", (long long) addr, (long long) *val);
+      *(unw_word_t *) (intptr_t) addr = *val;
+    }
+  else
+    {
+      *val = *(unw_word_t *) (intptr_t) addr;
+      Debug (16, "mem[%llx] -> %llx\n", (long long) addr, (long long) *val);
+    }
+  return 0;
+}
+
+static int
+access_reg (unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val, int write,
+            void *arg)
+{
+  unw_word_t *addr;
+  ucontext_t *uc = arg;
+
+  if (unw_is_fpreg (reg))
+    goto badreg;
+
+  Debug (16, "reg = %s\n", unw_regname (reg));
+  if (!(addr = uc_addr (uc, reg)))
+    goto badreg;
+
+  if (write)
+    {
+      *(unw_word_t *) (intptr_t) addr = (tilegx_reg_t) *val;
+      Debug (12, "%s <- %llx\n", unw_regname (reg), (long long) *val);
+    }
+  else
+    {
+      *val = (tilegx_reg_t) *(unw_word_t *) (intptr_t) addr;
+      Debug (12, "%s -> %llx\n", unw_regname (reg), (long long) *val);
+    }
+  return 0;
+
+ badreg:
+  Debug (1, "bad register number %u\n", reg);
+  return -UNW_EBADREG;
+}
+
+static int
+get_static_proc_name (unw_addr_space_t as, unw_word_t ip,
+                      char *buf, size_t buf_len, unw_word_t *offp,
+                      void *arg)
+{
+  return elf_w (get_proc_name) (as, getpid (), ip, buf, buf_len, offp);
+}
+
+__attribute__((weak)) void
+tilegx_local_addr_space_init (void)
+{
+  memset (&local_addr_space, 0, sizeof (local_addr_space));
+  local_addr_space.big_endian = (__BYTE_ORDER == __BIG_ENDIAN);
+
+  local_addr_space.abi = UNW_TILEGX_ABI_N64;
+  local_addr_space.addr_size = sizeof (void *);
+  local_addr_space.caching_policy = UNW_CACHE_GLOBAL;
+  local_addr_space.acc.find_proc_info = dwarf_find_proc_info;
+  local_addr_space.acc.put_unwind_info = put_unwind_info;
+  local_addr_space.acc.get_dyn_info_list_addr = get_dyn_info_list_addr;
+  local_addr_space.acc.access_mem = access_mem;
+  local_addr_space.acc.access_reg = access_reg;
+  local_addr_space.acc.access_fpreg = NULL;
+  local_addr_space.acc.resume = tilegx_local_resume;
+  local_addr_space.acc.get_proc_name = get_static_proc_name;
+  unw_flush_cache (&local_addr_space, 0, 0);
+}
+
+#endif /* !UNW_REMOTE_ONLY */
diff --git a/frysk-imports/libunwind/src/tilegx/Ginit_local.c b/frysk-imports/libunwind/src/tilegx/Ginit_local.c
new file mode 100644
index 0000000..f75c98f
--- /dev/null
+++ b/frysk-imports/libunwind/src/tilegx/Ginit_local.c
@@ -0,0 +1,57 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+   Copyright (C) 2014 Tilera Corp.
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "unwind_i.h"
+#include "init.h"
+
+#ifdef UNW_REMOTE_ONLY
+
+PROTECTED int
+unw_init_local (unw_cursor_t *cursor, ucontext_t *uc)
+{
+  return -UNW_EINVAL;
+}
+
+#else /* !UNW_REMOTE_ONLY */
+
+PROTECTED int
+unw_init_local (unw_cursor_t *cursor, ucontext_t *uc)
+{
+  struct cursor *c = (struct cursor *) cursor;
+
+  if (!tdep_init_done)
+    tdep_init ();
+
+  memset(c, 0, sizeof(unw_cursor_t));
+
+  Debug (1, "(cursor=%p)\n", c);
+
+  c->dwarf.as = unw_local_addr_space;
+
+  c->dwarf.as_arg = uc;
+  return common_init (c, 1);
+}
+
+#endif /* !UNW_REMOTE_ONLY */
diff --git a/frysk-imports/libunwind/src/tilegx/Ginit_remote.c b/frysk-imports/libunwind/src/tilegx/Ginit_remote.c
new file mode 100644
index 0000000..c554100
--- /dev/null
+++ b/frysk-imports/libunwind/src/tilegx/Ginit_remote.c
@@ -0,0 +1,47 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+   Copyright (C) 2014 Tilera Corp.
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "init.h"
+#include "unwind_i.h"
+
+PROTECTED int
+unw_init_remote (unw_cursor_t *cursor, unw_addr_space_t as, void *as_arg)
+{
+#ifdef UNW_LOCAL_ONLY
+  return -UNW_EINVAL;
+#else /* !UNW_LOCAL_ONLY */
+  struct cursor *c = (struct cursor *) cursor;
+
+  if (!tdep_init_done)
+    tdep_init ();
+
+  Debug (1, "(cursor=%p)\n", c);
+
+  c->dwarf.as = as;
+  c->dwarf.as_arg = as_arg;
+
+  return common_init (c, 0);
+#endif /* !UNW_LOCAL_ONLY */
+}
diff --git a/frysk-imports/libunwind/src/tilegx/Gis_signal_frame.c b/frysk-imports/libunwind/src/tilegx/Gis_signal_frame.c
new file mode 100644
index 0000000..96bd34a
--- /dev/null
+++ b/frysk-imports/libunwind/src/tilegx/Gis_signal_frame.c
@@ -0,0 +1,115 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+   Copyright (C) 2014 Tilera Corp.
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "unwind_i.h"
+#include <stdio.h>
+#include "offsets.h"
+
+#ifdef __linux__
+#include <sys/syscall.h>
+#include <arch/abi.h>
+#else
+# error "Only support Linux!"
+#endif
+
+#define  MOVELI_R10_RT_SIGRETURN                         \
+  ( 0x000007e051483000ULL    |                           \
+    ((unsigned long)__NR_rt_sigreturn << 43) |           \
+    ((unsigned long)TREG_SYSCALL_NR << 31) )
+#define  SWINT1      0x286b180051485000ULL
+
+PROTECTED int
+unw_is_signal_frame (unw_cursor_t *cursor)
+{
+  struct cursor *c = (struct cursor*) cursor;
+  unw_word_t w0, w1, ip;
+  unw_addr_space_t as;
+  unw_accessors_t *a;
+  void *arg;
+  int ret;
+
+  as = c->dwarf.as;
+  a = unw_get_accessors (as);
+  arg = c->dwarf.as_arg;
+
+  ip = c->dwarf.ip;
+
+  if (!ip || !a->access_mem || (ip & (sizeof(unw_word_t) - 1)))
+    return 0;
+
+  if ((ret = (*a->access_mem) (as, ip, &w0, 0, arg)) < 0)
+    return ret;
+
+  if ((ret = (*a->access_mem) (as, ip + 8, &w1, 0, arg)) < 0)
+    return ret;
+
+  /* Return 1 if the IP points to a RT sigreturn sequence. */
+  if (w0 == MOVELI_R10_RT_SIGRETURN &&
+      w1 ==  SWINT1)
+    {
+      return 1;
+    }
+  return 0;
+}
+
+
+PROTECTED int
+unw_handle_signal_frame (unw_cursor_t *cursor)
+{
+  int i;
+  struct cursor *c = (struct cursor *) cursor;
+  unw_word_t sc_addr, sp, sp_addr = c->dwarf.cfa;
+  struct dwarf_loc sp_loc = DWARF_LOC (sp_addr, 0);
+  int ret;
+
+  if ((ret = dwarf_get (&c->dwarf, sp_loc, &sp)) < 0)
+    return -UNW_EUNSPEC;
+
+  /* Save the SP and PC to be able to return execution at this point
+     later in time (unw_resume).  */
+  c->sigcontext_sp = c->dwarf.cfa;
+  c->sigcontext_pc = c->dwarf.ip;
+
+  c->sigcontext_addr = sp_addr + sizeof (siginfo_t) +
+    C_ABI_SAVE_AREA_SIZE;
+  sc_addr = c->sigcontext_addr + LINUX_UC_MCONTEXT_OFF;
+
+  /* Update the dwarf cursor.
+     Set the location of the registers to the corresponding addresses of the
+     uc_mcontext / sigcontext structure contents.  */
+
+#define  SC_REG_OFFSET(X)   (8 * X)
+
+  for (i = UNW_TILEGX_R0; i <= UNW_TILEGX_R55; i++)
+    {
+      c->dwarf.loc[i] = DWARF_LOC (sc_addr + SC_REG_OFFSET(i), 0);
+    }
+
+  /* Set SP/CFA and PC/IP.  */
+  dwarf_get (&c->dwarf, c->dwarf.loc[UNW_TILEGX_R54], &c->dwarf.cfa);
+  dwarf_get (&c->dwarf, c->dwarf.loc[UNW_TILEGX_R55], &c->dwarf.ip);
+
+  return 1;
+}
diff --git a/frysk-imports/libunwind/src/tilegx/Gregs.c b/frysk-imports/libunwind/src/tilegx/Gregs.c
new file mode 100644
index 0000000..53e7bf4
--- /dev/null
+++ b/frysk-imports/libunwind/src/tilegx/Gregs.c
@@ -0,0 +1,66 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+   Copyright (C) 2014 Tilera Corp.
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "unwind_i.h"
+
+HIDDEN int
+tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
+                 int write)
+{
+  dwarf_loc_t loc = DWARF_NULL_LOC;
+  
+  if (reg == UNW_TILEGX_R54 && !write)
+    {
+      reg = UNW_TILEGX_CFA;
+    }
+  
+  if (reg <= UNW_TILEGX_R55)
+    loc = c->dwarf.loc[reg - UNW_TILEGX_R0];
+  else if (reg == UNW_TILEGX_CFA)
+    {
+      if (write)
+        return -UNW_EREADONLYREG;
+      *valp = c->dwarf.cfa;
+      return 0;
+    }
+  else
+    {
+      Debug (1, "bad register number %u\n", reg);
+      return -UNW_EBADREG;
+    }
+  
+  if (write)
+    return dwarf_put (&c->dwarf, loc, *valp);
+  else
+    return dwarf_get (&c->dwarf, loc, valp);
+}
+
+HIDDEN int
+tdep_access_fpreg (struct cursor *c, unw_regnum_t reg, unw_fpreg_t *valp,
+                   int write)
+{
+  Debug (1, "bad register number %u\n", reg);
+  return -UNW_EBADREG;
+}
diff --git a/frysk-imports/libunwind/src/tilegx/Gresume.c b/frysk-imports/libunwind/src/tilegx/Gresume.c
new file mode 100644
index 0000000..f532fd8
--- /dev/null
+++ b/frysk-imports/libunwind/src/tilegx/Gresume.c
@@ -0,0 +1,94 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+   Copyright (C) 2014 Tilera Corp.
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+
+#include "unwind_i.h"
+#include "offsets.h"
+#include <ucontext.h>
+
+#ifndef UNW_REMOTE_ONLY
+
+HIDDEN inline int
+tilegx_local_resume (unw_addr_space_t as, unw_cursor_t *cursor, void *arg)
+{
+  int i;
+  struct cursor *c = (struct cursor *) cursor;
+  ucontext_t *uc = c->dwarf.as_arg;
+
+  Debug (1, "(cursor=%p\n", c);
+
+  return setcontext(uc);
+}
+
+#endif /* !UNW_REMOTE_ONLY */
+
+static inline void
+establish_machine_state (struct cursor *c)
+{
+  unw_addr_space_t as = c->dwarf.as;
+  void *arg = c->dwarf.as_arg;
+  unw_fpreg_t fpval;
+  unw_word_t val;
+  int reg;
+
+  Debug (8, "copying out cursor state\n");
+
+  for (reg = 0; reg <= UNW_REG_LAST; ++reg)
+    {
+      Debug (16, "copying %s %d\n", unw_regname (reg), reg);
+
+      if (unw_is_fpreg (reg))
+        {
+          Debug (1, "no fp!");
+          abort ();
+        }
+      else
+        {
+          if (tdep_access_reg (c, reg, &val, 0) >= 0)
+            as->acc.access_reg (as, reg, &val, 1, arg);
+        }
+    }
+}
+
+PROTECTED int
+unw_resume (unw_cursor_t *cursor)
+{
+  struct cursor *c = (struct cursor *) cursor;
+
+  Debug (1, "(cursor=%p) ip=0x%lx\n", c, c->dwarf.ip);
+
+  if (!c->dwarf.ip)
+    {
+      /* This can happen easily when the frame-chain gets truncated
+         due to bad or missing unwind-info.  */
+      Debug (1, "refusing to resume execution at address 0\n");
+      return -UNW_EINVAL;
+    }
+
+  establish_machine_state (c);
+
+  return (*c->dwarf.as->acc.resume) (c->dwarf.as, (unw_cursor_t *) c,
+                                     c->dwarf.as_arg);
+}
diff --git a/frysk-imports/libunwind/src/tilegx/Gstep.c b/frysk-imports/libunwind/src/tilegx/Gstep.c
new file mode 100644
index 0000000..0d8f8af
--- /dev/null
+++ b/frysk-imports/libunwind/src/tilegx/Gstep.c
@@ -0,0 +1,53 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+   Copyright (C) 2014 Tilera Corp.
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "unwind_i.h"
+#include "offsets.h"
+
+PROTECTED int
+unw_step (unw_cursor_t *cursor)
+{
+  struct cursor *c = (struct cursor *) cursor;
+  int ret;
+
+  Debug (1, "(cursor=%p, ip=0x%016lx, sp=0x%016lx)\n",
+         c, c->dwarf.ip, c->dwarf.cfa);
+
+  /* Special handling the singal frame. */
+  if (unw_is_signal_frame (cursor))
+    return unw_handle_signal_frame (cursor);
+
+  /* Try DWARF-based unwinding... */
+  ret = dwarf_step (&c->dwarf);
+
+  if (unlikely (ret == -UNW_ESTOPUNWIND))
+    return ret;
+
+  /* Dwarf unwinding didn't work, stop.  */
+  if (unlikely (ret < 0))
+    return 0;
+
+  return (c->dwarf.ip == 0) ? 0 : 1;
+}
diff --git a/frysk-imports/libunwind/src/tilegx/Lcreate_addr_space.c b/frysk-imports/libunwind/src/tilegx/Lcreate_addr_space.c
new file mode 100644
index 0000000..0f2dc6b
--- /dev/null
+++ b/frysk-imports/libunwind/src/tilegx/Lcreate_addr_space.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Gcreate_addr_space.c"
+#endif
diff --git a/frysk-imports/libunwind/src/tilegx/Lget_proc_info.c b/frysk-imports/libunwind/src/tilegx/Lget_proc_info.c
new file mode 100644
index 0000000..69028b0
--- /dev/null
+++ b/frysk-imports/libunwind/src/tilegx/Lget_proc_info.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Gget_proc_info.c"
+#endif
diff --git a/frysk-imports/libunwind/src/tilegx/Lget_save_loc.c b/frysk-imports/libunwind/src/tilegx/Lget_save_loc.c
new file mode 100644
index 0000000..9ea048a
--- /dev/null
+++ b/frysk-imports/libunwind/src/tilegx/Lget_save_loc.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Gget_save_loc.c"
+#endif
diff --git a/frysk-imports/libunwind/src/tilegx/Lglobal.c b/frysk-imports/libunwind/src/tilegx/Lglobal.c
new file mode 100644
index 0000000..6d7b489
--- /dev/null
+++ b/frysk-imports/libunwind/src/tilegx/Lglobal.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Gglobal.c"
+#endif
diff --git a/frysk-imports/libunwind/src/tilegx/Linit.c b/frysk-imports/libunwind/src/tilegx/Linit.c
new file mode 100644
index 0000000..e9abfdd
--- /dev/null
+++ b/frysk-imports/libunwind/src/tilegx/Linit.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Ginit.c"
+#endif
diff --git a/frysk-imports/libunwind/src/tilegx/Linit_local.c b/frysk-imports/libunwind/src/tilegx/Linit_local.c
new file mode 100644
index 0000000..68a1687
--- /dev/null
+++ b/frysk-imports/libunwind/src/tilegx/Linit_local.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Ginit_local.c"
+#endif
diff --git a/frysk-imports/libunwind/src/tilegx/Linit_remote.c b/frysk-imports/libunwind/src/tilegx/Linit_remote.c
new file mode 100644
index 0000000..58cb04a
--- /dev/null
+++ b/frysk-imports/libunwind/src/tilegx/Linit_remote.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Ginit_remote.c"
+#endif
diff --git a/frysk-imports/libunwind/src/tilegx/Lis_signal_frame.c b/frysk-imports/libunwind/src/tilegx/Lis_signal_frame.c
new file mode 100644
index 0000000..b9a7c4f
--- /dev/null
+++ b/frysk-imports/libunwind/src/tilegx/Lis_signal_frame.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Gis_signal_frame.c"
+#endif
diff --git a/frysk-imports/libunwind/src/tilegx/Lregs.c b/frysk-imports/libunwind/src/tilegx/Lregs.c
new file mode 100644
index 0000000..2c9c75c
--- /dev/null
+++ b/frysk-imports/libunwind/src/tilegx/Lregs.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Gregs.c"
+#endif
diff --git a/frysk-imports/libunwind/src/tilegx/Lresume.c b/frysk-imports/libunwind/src/tilegx/Lresume.c
new file mode 100644
index 0000000..41a8cf0
--- /dev/null
+++ b/frysk-imports/libunwind/src/tilegx/Lresume.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Gresume.c"
+#endif
diff --git a/frysk-imports/libunwind/src/tilegx/Lstep.c b/frysk-imports/libunwind/src/tilegx/Lstep.c
new file mode 100644
index 0000000..c1ac3c7
--- /dev/null
+++ b/frysk-imports/libunwind/src/tilegx/Lstep.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Gstep.c"
+#endif
diff --git a/frysk-imports/libunwind/src/tilegx/elfxx.c b/frysk-imports/libunwind/src/tilegx/elfxx.c
new file mode 100644
index 0000000..07d3d12
--- /dev/null
+++ b/frysk-imports/libunwind/src/tilegx/elfxx.c
@@ -0,0 +1,27 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "libunwind_i.h"
+
+#include "../src/elfxx.c"
diff --git a/frysk-imports/libunwind/src/tilegx/gen-offsets.c b/frysk-imports/libunwind/src/tilegx/gen-offsets.c
new file mode 100644
index 0000000..8704bb2
--- /dev/null
+++ b/frysk-imports/libunwind/src/tilegx/gen-offsets.c
@@ -0,0 +1,30 @@
+#include <stdio.h>
+#include <stddef.h>
+#include <ucontext.h>
+
+#define UC(N,X) \
+  printf ("#define LINUX_UC_" N "_OFF\t0x%X\n", offsetof (ucontext_t, X))
+
+#define SC(N,X) \
+  printf ("#define LINUX_SC_" N "_OFF\t0x%X\n", offsetof (struct sigcontext, X))
+
+int
+main (void)
+{
+  printf (
+"/* Linux-specific definitions: */\n\n"
+
+"/* Define various structure offsets to simplify cross-compilation.  */\n\n"
+
+"/* Offsets for TILEGX Linux \"ucontext_t\":  */\n\n");
+
+  UC ("FLAGS", uc_flags);
+  UC ("LINK", uc_link);
+  UC ("STACK", uc_stack);
+  UC ("MCONTEXT", uc_mcontext);
+  UC ("SIGMASK", uc_sigmask);
+
+  UC ("MCONTEXT_GREGS", uc_mcontext.gregs);
+
+  return 0;
+}
diff --git a/frysk-imports/libunwind/src/tilegx/getcontext.S b/frysk-imports/libunwind/src/tilegx/getcontext.S
new file mode 100644
index 0000000..fbc8654
--- /dev/null
+++ b/frysk-imports/libunwind/src/tilegx/getcontext.S
@@ -0,0 +1,36 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+   Copyright (C) 2014 Tilera Corp.
+        
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "offsets.h"
+#include <endian.h>
+
+        .text
+        # define REG(X)    LINUX_UC_MCONTEXT_GREGS + 8 * (X)
+        .global _Utilegx_getcontext
+        .type   _Utilegx_getcontext, %function
+        # This is a stub version of getcontext() for TILEGX.
+_Utilegx_getcontext:
+
+
diff --git a/frysk-imports/libunwind/src/tilegx/init.h b/frysk-imports/libunwind/src/tilegx/init.h
new file mode 100644
index 0000000..e75e590
--- /dev/null
+++ b/frysk-imports/libunwind/src/tilegx/init.h
@@ -0,0 +1,64 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+   Copyright (C) 2014 Tilera Corp.
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "unwind_i.h"
+
+static inline int
+common_init (struct cursor *c, unsigned use_prev_instr)
+{
+  int ret, i;
+
+  for (i = 0; i < 56; i++)
+    c->dwarf.loc[i] = DWARF_REG_LOC (&c->dwarf, UNW_TILEGX_R0 + i);
+  for (i = 56; i < DWARF_NUM_PRESERVED_REGS; ++i)
+    c->dwarf.loc[i] = DWARF_NULL_LOC;
+
+  if (use_prev_instr == 0)
+    ret = dwarf_get (&c->dwarf, DWARF_REG_LOC (&c->dwarf, UNW_TILEGX_PC),
+                     &c->dwarf.ip);
+  else
+    ret = dwarf_get (&c->dwarf, DWARF_REG_LOC (&c->dwarf, UNW_TILEGX_R55),
+                     &c->dwarf.ip);
+
+  if (ret < 0)
+    return ret;
+
+  ret = dwarf_get (&c->dwarf, DWARF_REG_LOC (&c->dwarf, UNW_TILEGX_R54),
+                   &c->dwarf.cfa);
+
+  if (ret < 0)
+    return ret;
+
+  c->dwarf.args_size = 0;
+  c->dwarf.ret_addr_column = 0;
+  c->dwarf.stash_frames = 0;
+  c->dwarf.use_prev_instr = use_prev_instr;
+  c->dwarf.pi_valid = 0;
+  c->dwarf.pi_is_dynamic = 0;
+  c->dwarf.hint = 0;
+  c->dwarf.prev_rs = 0;
+
+  return 0;
+}
diff --git a/frysk-imports/libunwind/src/tilegx/is_fpreg.c b/frysk-imports/libunwind/src/tilegx/is_fpreg.c
new file mode 100644
index 0000000..118e055
--- /dev/null
+++ b/frysk-imports/libunwind/src/tilegx/is_fpreg.c
@@ -0,0 +1,33 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "libunwind_i.h"
+
+/* TILEGX has no FP. */
+
+PROTECTED int
+unw_is_fpreg (int regnum)
+{
+  return 0;
+}
diff --git a/frysk-imports/libunwind/src/tilegx/offsets.h b/frysk-imports/libunwind/src/tilegx/offsets.h
new file mode 100644
index 0000000..6d30f1e
--- /dev/null
+++ b/frysk-imports/libunwind/src/tilegx/offsets.h
@@ -0,0 +1,12 @@
+/* Linux-specific definitions: */
+
+/* Define various structure offsets to simplify cross-compilation.  */
+
+/* Offsets for TILEGX Linux "ucontext_t":  */
+
+#define LINUX_UC_FLAGS_OFF      0x0
+#define LINUX_UC_LINK_OFF       0x8
+#define LINUX_UC_STACK_OFF      0x10
+#define LINUX_UC_MCONTEXT_OFF   0x28
+#define LINUX_UC_SIGMASK_OFF    0x228
+#define LINUX_UC_MCONTEXT_GREGS 0x28
diff --git a/frysk-imports/libunwind/src/tilegx/regname.c b/frysk-imports/libunwind/src/tilegx/regname.c
new file mode 100644
index 0000000..fd73804
--- /dev/null
+++ b/frysk-imports/libunwind/src/tilegx/regname.c
@@ -0,0 +1,55 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+   Copyright (C) 2014 Tilera Corp.
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "unwind_i.h"
+
+static const char *regname[] =
+  {
+    /* 0.  */
+    "r0",  "r1",  "r2",  "r3",  "r4",  "r5",  "r6",  "r7",
+    /* 8.  */
+    "r8",  "r9",  "r10", "r11",  "r12",  "r13",  "r14",  "r15",
+    /* 16.  */
+    "r16",  "r17",  "r18", "r19",  "r20",  "r21",  "r22",  "r23",
+    /* 24.  */
+    "r24",  "r25",  "r26", "r27",  "r28",  "r29",  "r30",  "r31",
+    /* 32.  */
+    "r32",  "r33",  "r34", "r35",  "r36",  "r37",  "r38",  "r39",
+    /* 40.  */
+    "r40",  "r41",  "r42", "r43",  "r44",  "r45",  "r46",  "r47",
+    /* 48.  */
+    "r48",  "r49",  "r50", "r51",  "r52",  "r53",  "r54",  "r55",
+    /* pc, cfa */
+    "pc",  "cfa"
+  };
+
+PROTECTED const char *
+unw_regname (unw_regnum_t reg)
+{
+  if (reg < (unw_regnum_t) ARRAY_SIZE (regname))
+    return regname[reg];
+  else
+    return "???";
+}
diff --git a/frysk-imports/libunwind/src/tilegx/siglongjmp.S b/frysk-imports/libunwind/src/tilegx/siglongjmp.S
new file mode 100644
index 0000000..bccb1c7
--- /dev/null
+++ b/frysk-imports/libunwind/src/tilegx/siglongjmp.S
@@ -0,0 +1,7 @@
+        /* Dummy implementation for now.  */
+        .globl _UI_siglongjmp_cont
+        .globl _UI_longjmp_cont
+
+_UI_siglongjmp_cont:
+_UI_longjmp_cont:
+        jrp      lr
diff --git a/frysk-imports/libunwind/src/tilegx/unwind_i.h b/frysk-imports/libunwind/src/tilegx/unwind_i.h
new file mode 100644
index 0000000..aac7be3
--- /dev/null
+++ b/frysk-imports/libunwind/src/tilegx/unwind_i.h
@@ -0,0 +1,44 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 CodeSourcery
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#ifndef unwind_i_h
+#define unwind_i_h
+
+#include <memory.h>
+#include <stdint.h>
+
+#include <libunwind-tilegx.h>
+
+#include "libunwind_i.h"
+
+#define tilegx_local_resume            UNW_OBJ(local_resume)
+#define tilegx_local_addr_space_init   UNW_OBJ(local_addr_space_init)
+
+extern int tilegx_local_resume (unw_addr_space_t as,
+                                unw_cursor_t *cursor,
+                                void *arg);
+
+extern void tilegx_local_addr_space_init (void);
+
+#endif /* unwind_i_h */
diff --git a/frysk-imports/libunwind/src/unwind/Backtrace.c b/frysk-imports/libunwind/src/unwind/Backtrace.c
index 99c20fc..50f1fb6 100644
--- a/frysk-imports/libunwind/src/unwind/Backtrace.c
+++ b/frysk-imports/libunwind/src/unwind/Backtrace.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003-2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -40,15 +40,15 @@ _Unwind_Backtrace (_Unwind_Trace_Fn trace, void *trace_parameter)
   while (1)
     {
       if ((ret = unw_step (&context.cursor)) <= 0)
-	{
-	  if (ret == 0)
-	    return _URC_END_OF_STACK;
-	  else
-	    return _URC_FATAL_PHASE1_ERROR;
-	}
+        {
+          if (ret == 0)
+            return _URC_END_OF_STACK;
+          else
+            return _URC_FATAL_PHASE1_ERROR;
+        }
 
       if ((*trace) (&context, trace_parameter) != _URC_NO_REASON)
-	return _URC_FATAL_PHASE1_ERROR;
+        return _URC_FATAL_PHASE1_ERROR;
     }
 }
 
diff --git a/frysk-imports/libunwind/src/unwind/DeleteException.c b/frysk-imports/libunwind/src/unwind/DeleteException.c
index 5104b73..79be65e 100644
--- a/frysk-imports/libunwind/src/unwind/DeleteException.c
+++ b/frysk-imports/libunwind/src/unwind/DeleteException.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003-2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
diff --git a/frysk-imports/libunwind/src/unwind/FindEnclosingFunction.c b/frysk-imports/libunwind/src/unwind/FindEnclosingFunction.c
index e639894..b9873da 100644
--- a/frysk-imports/libunwind/src/unwind/FindEnclosingFunction.c
+++ b/frysk-imports/libunwind/src/unwind/FindEnclosingFunction.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003-2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -31,7 +31,7 @@ _Unwind_FindEnclosingFunction (void *ip)
   unw_proc_info_t pi;
 
   if (unw_get_proc_info_by_ip (unw_local_addr_space,
-			       (unw_word_t) (uintptr_t) ip, &pi, 0)
+                               (unw_word_t) (uintptr_t) ip, &pi, 0)
       < 0)
     return NULL;
 
diff --git a/frysk-imports/libunwind/src/unwind/ForcedUnwind.c b/frysk-imports/libunwind/src/unwind/ForcedUnwind.c
index bd334d3..da8a60e 100644
--- a/frysk-imports/libunwind/src/unwind/ForcedUnwind.c
+++ b/frysk-imports/libunwind/src/unwind/ForcedUnwind.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003-2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -27,7 +27,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 PROTECTED _Unwind_Reason_Code
 _Unwind_ForcedUnwind (struct _Unwind_Exception *exception_object,
-		      _Unwind_Stop_Fn stop, void *stop_parameter)
+                      _Unwind_Stop_Fn stop, void *stop_parameter)
 {
   struct _Unwind_Context context;
   unw_context_t uc;
@@ -48,5 +48,5 @@ _Unwind_ForcedUnwind (struct _Unwind_Exception *exception_object,
 }
 
 _Unwind_Reason_Code __libunwind_Unwind_ForcedUnwind (struct _Unwind_Exception*,
-						     _Unwind_Stop_Fn, void *)
+                                                     _Unwind_Stop_Fn, void *)
      ALIAS (_Unwind_ForcedUnwind);
diff --git a/frysk-imports/libunwind/src/unwind/GetBSP.c b/frysk-imports/libunwind/src/unwind/GetBSP.c
index d53e401..253fde0 100644
--- a/frysk-imports/libunwind/src/unwind/GetBSP.c
+++ b/frysk-imports/libunwind/src/unwind/GetBSP.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003-2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
diff --git a/frysk-imports/libunwind/src/unwind/GetCFA.c b/frysk-imports/libunwind/src/unwind/GetCFA.c
index bd8559b..7975b1d 100644
--- a/frysk-imports/libunwind/src/unwind/GetCFA.c
+++ b/frysk-imports/libunwind/src/unwind/GetCFA.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003-2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
diff --git a/frysk-imports/libunwind/src/unwind/GetDataRelBase.c b/frysk-imports/libunwind/src/unwind/GetDataRelBase.c
index cb60476..9bdd4cb 100644
--- a/frysk-imports/libunwind/src/unwind/GetDataRelBase.c
+++ b/frysk-imports/libunwind/src/unwind/GetDataRelBase.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003-2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
diff --git a/frysk-imports/libunwind/src/unwind/GetGR.c b/frysk-imports/libunwind/src/unwind/GetGR.c
index 3a875e8..b7ab05c 100644
--- a/frysk-imports/libunwind/src/unwind/GetGR.c
+++ b/frysk-imports/libunwind/src/unwind/GetGR.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003-2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
diff --git a/frysk-imports/libunwind/src/unwind/GetIP.c b/frysk-imports/libunwind/src/unwind/GetIP.c
index 6fd48a2..e93853d 100644
--- a/frysk-imports/libunwind/src/unwind/GetIP.c
+++ b/frysk-imports/libunwind/src/unwind/GetIP.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003-2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
diff --git a/frysk-imports/libunwind/src/unwind/GetIPInfo.c b/frysk-imports/libunwind/src/unwind/GetIPInfo.c
new file mode 100644
index 0000000..9105396
--- /dev/null
+++ b/frysk-imports/libunwind/src/unwind/GetIPInfo.c
@@ -0,0 +1,42 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2009 Red Hat
+        Contributed by Jan Kratochvil <jan.kratochvil@redhat.com>
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "unwind-internal.h"
+
+/* gcc/unwind-dw2.c: Retrieve the return address and flag whether that IP is
+   before or after first not yet fully executed instruction.  */
+
+PROTECTED unsigned long
+_Unwind_GetIPInfo (struct _Unwind_Context *context, int *ip_before_insn)
+{
+  unw_word_t val;
+
+  unw_get_reg (&context->cursor, UNW_REG_IP, &val);
+  *ip_before_insn = unw_is_signal_frame (&context->cursor);
+  return val;
+}
+
+unsigned long __libunwind_Unwind_GetIPInfo (struct _Unwind_Context *, int *)
+     ALIAS (_Unwind_GetIPInfo);
diff --git a/frysk-imports/libunwind/src/unwind/GetLanguageSpecificData.c b/frysk-imports/libunwind/src/unwind/GetLanguageSpecificData.c
index eefcec7..df52c92 100644
--- a/frysk-imports/libunwind/src/unwind/GetLanguageSpecificData.c
+++ b/frysk-imports/libunwind/src/unwind/GetLanguageSpecificData.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003-2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
diff --git a/frysk-imports/libunwind/src/unwind/GetRegionStart.c b/frysk-imports/libunwind/src/unwind/GetRegionStart.c
index 11c3460..f0da344 100644
--- a/frysk-imports/libunwind/src/unwind/GetRegionStart.c
+++ b/frysk-imports/libunwind/src/unwind/GetRegionStart.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003-2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
diff --git a/frysk-imports/libunwind/src/unwind/GetTextRelBase.c b/frysk-imports/libunwind/src/unwind/GetTextRelBase.c
index a53ca9b..d0826e7 100644
--- a/frysk-imports/libunwind/src/unwind/GetTextRelBase.c
+++ b/frysk-imports/libunwind/src/unwind/GetTextRelBase.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003-2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
diff --git a/frysk-imports/libunwind/src/unwind/RaiseException.c b/frysk-imports/libunwind/src/unwind/RaiseException.c
index 5533876..cdf134a 100644
--- a/frysk-imports/libunwind/src/unwind/RaiseException.c
+++ b/frysk-imports/libunwind/src/unwind/RaiseException.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003-2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -28,7 +28,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 PROTECTED _Unwind_Reason_Code
 _Unwind_RaiseException (struct _Unwind_Exception *exception_object)
 {
-  unsigned long exception_class = exception_object->exception_class;
+  uint64_t exception_class = exception_object->exception_class;
   _Unwind_Personality_Fn personality;
   struct _Unwind_Context context;
   _Unwind_Reason_Code reason;
@@ -47,36 +47,36 @@ _Unwind_RaiseException (struct _Unwind_Exception *exception_object)
   while (1)
     {
       if ((ret = unw_step (&context.cursor)) <= 0)
-	{
-	  if (ret == 0)
-	    {
-	      Debug (1, "no handler found\n");
-	      return _URC_END_OF_STACK;
-	    }
-	  else
-	    return _URC_FATAL_PHASE1_ERROR;
-	}
+        {
+          if (ret == 0)
+            {
+              Debug (1, "no handler found\n");
+              return _URC_END_OF_STACK;
+            }
+          else
+            return _URC_FATAL_PHASE1_ERROR;
+        }
 
       if (unw_get_proc_info (&context.cursor, &pi) < 0)
-	return _URC_FATAL_PHASE1_ERROR;
+        return _URC_FATAL_PHASE1_ERROR;
 
       personality = (_Unwind_Personality_Fn) (uintptr_t) pi.handler;
       if (personality)
-	{
-	  reason = (*personality) (_U_VERSION, _UA_SEARCH_PHASE,
-				   exception_class, exception_object,
-				   &context);
-	  if (reason != _URC_CONTINUE_UNWIND)
-	    {
-	      if (reason == _URC_HANDLER_FOUND)
-		break;
-	      else
-		{
-		  Debug (1, "personality returned %d\n", reason);
-		  return _URC_FATAL_PHASE1_ERROR;
-		}
-	    }
-	}
+        {
+          reason = (*personality) (_U_VERSION, _UA_SEARCH_PHASE,
+                                   exception_class, exception_object,
+                                   &context);
+          if (reason != _URC_CONTINUE_UNWIND)
+            {
+              if (reason == _URC_HANDLER_FOUND)
+                break;
+              else
+                {
+                  Debug (1, "personality returned %d\n", reason);
+                  return _URC_FATAL_PHASE1_ERROR;
+                }
+            }
+        }
     }
 
   /* Exceptions are associated with IP-ranges.  If a given exception
@@ -86,8 +86,8 @@ _Unwind_RaiseException (struct _Unwind_Exception *exception_object)
      the exception.  */
   if (unw_get_reg (&context.cursor, UNW_REG_IP, &ip) < 0)
     return _URC_FATAL_PHASE1_ERROR;
-  exception_object->private_1 = 0;	/* clear "stop" pointer */
-  exception_object->private_2 = ip;	/* save frame marker */
+  exception_object->private_1 = 0;      /* clear "stop" pointer */
+  exception_object->private_2 = ip;     /* save frame marker */
 
   Debug (1, "found handler for IP=%lx; entering cleanup phase\n", (long) ip);
 
diff --git a/frysk-imports/libunwind/src/unwind/Resume.c b/frysk-imports/libunwind/src/unwind/Resume.c
index ddf9d2c..dd0a44b 100644
--- a/frysk-imports/libunwind/src/unwind/Resume.c
+++ b/frysk-imports/libunwind/src/unwind/Resume.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003-2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
diff --git a/frysk-imports/libunwind/src/unwind/Resume_or_Rethrow.c b/frysk-imports/libunwind/src/unwind/Resume_or_Rethrow.c
index ece0ced..d60e038 100644
--- a/frysk-imports/libunwind/src/unwind/Resume_or_Rethrow.c
+++ b/frysk-imports/libunwind/src/unwind/Resume_or_Rethrow.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003-2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -34,7 +34,7 @@ _Unwind_Resume_or_Rethrow (struct _Unwind_Exception *exception_object)
   if (exception_object->private_1)
     {
       if (_Unwind_InitContext (&context, &uc) < 0)
-	return _URC_FATAL_PHASE2_ERROR;
+        return _URC_FATAL_PHASE2_ERROR;
 
       return _Unwind_Phase2 (exception_object, &context);
     }
diff --git a/frysk-imports/libunwind/src/unwind/SetGR.c b/frysk-imports/libunwind/src/unwind/SetGR.c
index 056bfc7..143b354 100644
--- a/frysk-imports/libunwind/src/unwind/SetGR.c
+++ b/frysk-imports/libunwind/src/unwind/SetGR.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003-2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -24,11 +24,17 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 #include "unwind-internal.h"
+#ifdef UNW_TARGET_X86
+#include "dwarf_i.h"
+#endif
 
 PROTECTED void
 _Unwind_SetGR (struct _Unwind_Context *context, int index,
-	       unsigned long new_value)
+               unsigned long new_value)
 {
+#ifdef UNW_TARGET_X86
+  index = dwarf_to_unw_regnum(index);
+#endif
   unw_set_reg (&context->cursor, index, new_value);
 #ifdef UNW_TARGET_IA64
   if (index >= UNW_IA64_GR && index <= UNW_IA64_GR + 127)
diff --git a/frysk-imports/libunwind/src/unwind/SetIP.c b/frysk-imports/libunwind/src/unwind/SetIP.c
index 0652a14..c55ab97 100644
--- a/frysk-imports/libunwind/src/unwind/SetIP.c
+++ b/frysk-imports/libunwind/src/unwind/SetIP.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003-2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
diff --git a/frysk-imports/libunwind/src/unwind/libunwind.pc.in b/frysk-imports/libunwind/src/unwind/libunwind.pc.in
new file mode 100644
index 0000000..1505c5d
--- /dev/null
+++ b/frysk-imports/libunwind/src/unwind/libunwind.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: libunwind
+Description: libunwind base library
+Version: @VERSION@
+Libs: -L${libdir} -lunwind
+Libs.private: @LIBLZMA@
+Cflags: -I${includedir}
diff --git a/frysk-imports/libunwind/src/unwind/unwind-internal.h b/frysk-imports/libunwind/src/unwind/unwind-internal.h
index 169bad5..c68fc3c 100644
--- a/frysk-imports/libunwind/src/unwind/unwind-internal.h
+++ b/frysk-imports/libunwind/src/unwind/unwind-internal.h
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003, 2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -35,31 +35,31 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #include "libunwind_i.h"
 
 /* The version of the _Unwind_*() interface implemented by this code.  */
-#define _U_VERSION	1
+#define _U_VERSION      1
 
 typedef _Unwind_Reason_Code (*_Unwind_Personality_Fn)
-	(int, _Unwind_Action, unsigned long, struct _Unwind_Exception *,
-	 struct _Unwind_Context *);
+        (int, _Unwind_Action, uint64_t, struct _Unwind_Exception *,
+         struct _Unwind_Context *);
 
 struct _Unwind_Context {
   unw_cursor_t cursor;
-  int end_of_stack;	/* set to 1 if the end of stack was reached */
+  int end_of_stack;     /* set to 1 if the end of stack was reached */
 };
 
 /* This must be a macro because unw_getcontext() must be invoked from
    the callee, even if optimization (and hence inlining) is turned
    off.  The macro arguments MUST NOT have any side-effects. */
-#define _Unwind_InitContext(context, uc)				     \
-  ((context)->end_of_stack = 0,						     \
+#define _Unwind_InitContext(context, uc)                                     \
+  ((context)->end_of_stack = 0,                                              \
    ((unw_getcontext (uc) < 0 || unw_init_local (&(context)->cursor, uc) < 0) \
     ? -1 : 0))
 
 static _Unwind_Reason_Code ALWAYS_INLINE
 _Unwind_Phase2 (struct _Unwind_Exception *exception_object,
-		struct _Unwind_Context *context)
+                struct _Unwind_Context *context)
 {
   _Unwind_Stop_Fn stop = (_Unwind_Stop_Fn) exception_object->private_1;
-  unsigned long exception_class = exception_object->exception_class;
+  uint64_t exception_class = exception_object->exception_class;
   void *stop_parameter = (void *) exception_object->private_2;
   _Unwind_Personality_Fn personality;
   _Unwind_Reason_Code reason;
@@ -76,65 +76,65 @@ _Unwind_Phase2 (struct _Unwind_Exception *exception_object,
     {
       ret = unw_step (&context->cursor);
       if (ret <= 0)
-	{
-	  if (ret == 0)
-	    {
-	      actions |= _UA_END_OF_STACK;
-	      context->end_of_stack = 1;
-	    }
-	  else
-	    return _URC_FATAL_PHASE2_ERROR;
-	}
+        {
+          if (ret == 0)
+            {
+              actions |= _UA_END_OF_STACK;
+              context->end_of_stack = 1;
+            }
+          else
+            return _URC_FATAL_PHASE2_ERROR;
+        }
 
       if (stop)
-	{
-	  reason = (*stop) (_U_VERSION, actions, exception_class,
-			    exception_object, context, stop_parameter);
-	  if (reason != _URC_NO_REASON)
-	    /* Stop function may return _URC_FATAL_PHASE2_ERROR if
-	       it's unable to handle end-of-stack condition or
-	       _URC_FATAL_PHASE2_ERROR if something is wrong.  Not
-	       that it matters: the resulting state is indeterminate
-	       anyhow so we must return _URC_FATAL_PHASE2_ERROR... */
-	    return _URC_FATAL_PHASE2_ERROR;
-	}
+        {
+          reason = (*stop) (_U_VERSION, actions, exception_class,
+                            exception_object, context, stop_parameter);
+          if (reason != _URC_NO_REASON)
+            /* Stop function may return _URC_FATAL_PHASE2_ERROR if
+               it's unable to handle end-of-stack condition or
+               _URC_FATAL_PHASE2_ERROR if something is wrong.  Not
+               that it matters: the resulting state is indeterminate
+               anyhow so we must return _URC_FATAL_PHASE2_ERROR... */
+            return _URC_FATAL_PHASE2_ERROR;
+        }
 
       if (context->end_of_stack
-	  || unw_get_proc_info (&context->cursor, &pi) < 0)
-	return _URC_FATAL_PHASE2_ERROR;
+          || unw_get_proc_info (&context->cursor, &pi) < 0)
+        return _URC_FATAL_PHASE2_ERROR;
 
       personality = (_Unwind_Personality_Fn) (uintptr_t) pi.handler;
       if (personality)
-	{
-	  if (!stop)
-	    {
-	      if (unw_get_reg (&context->cursor, UNW_REG_IP, &ip) < 0)
-		return _URC_FATAL_PHASE2_ERROR;
-
-	      if ((unsigned long) stop_parameter == ip)
-		actions |= _UA_HANDLER_FRAME;
-	    }
-
-	  reason = (*personality) (_U_VERSION, actions, exception_class,
-				   exception_object, context);
-	  if (reason != _URC_CONTINUE_UNWIND)
-	    {
-	      if (reason == _URC_INSTALL_CONTEXT)
-		{
-		  /* we may regain control via _Unwind_Resume() */
-		  unw_resume (&context->cursor);
-		  abort ();
-		}
-	      else
-		return _URC_FATAL_PHASE2_ERROR;
-	    }
-	  if (actions & _UA_HANDLER_FRAME)
-	    /* The personality routine for the handler-frame changed
-	       it's mind; that's a no-no... */
-	    abort ();
-	}
+        {
+          if (!stop)
+            {
+              if (unw_get_reg (&context->cursor, UNW_REG_IP, &ip) < 0)
+                return _URC_FATAL_PHASE2_ERROR;
+
+              if ((unsigned long) stop_parameter == ip)
+                actions |= _UA_HANDLER_FRAME;
+            }
+
+          reason = (*personality) (_U_VERSION, actions, exception_class,
+                                   exception_object, context);
+          if (reason != _URC_CONTINUE_UNWIND)
+            {
+              if (reason == _URC_INSTALL_CONTEXT)
+                {
+                  /* we may regain control via _Unwind_Resume() */
+                  unw_resume (&context->cursor);
+                  abort ();
+                }
+              else
+                return _URC_FATAL_PHASE2_ERROR;
+            }
+          if (actions & _UA_HANDLER_FRAME)
+            /* The personality routine for the handler-frame changed
+               it's mind; that's a no-no... */
+            abort ();
+        }
     }
-  return _URC_FATAL_PHASE2_ERROR;	/* shouldn't be reached */
+  return _URC_FATAL_PHASE2_ERROR;       /* shouldn't be reached */
 }
 
 #endif /* unwind_internal_h */
diff --git a/frysk-imports/libunwind/src/x86/Gcreate_addr_space.c b/frysk-imports/libunwind/src/x86/Gcreate_addr_space.c
index fd850c4..45fec6d 100644
--- a/frysk-imports/libunwind/src/x86/Gcreate_addr_space.c
+++ b/frysk-imports/libunwind/src/x86/Gcreate_addr_space.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -27,14 +27,25 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 #include "unwind_i.h"
 
+#if defined(_LITTLE_ENDIAN) && !defined(__LITTLE_ENDIAN)
+#define __LITTLE_ENDIAN _LITTLE_ENDIAN
+#endif
+
 PROTECTED unw_addr_space_t
 unw_create_addr_space (unw_accessors_t *a, int byte_order)
 {
 #ifdef UNW_LOCAL_ONLY
   return NULL;
 #else
-  unw_addr_space_t as = malloc (sizeof (*as));
+  unw_addr_space_t as;
 
+  /*
+   * x86 supports only little-endian.
+   */
+  if (byte_order != 0 && byte_order != __LITTLE_ENDIAN)
+    return NULL;
+
+  as = malloc (sizeof (*as));
   if (!as)
     return NULL;
 
@@ -42,11 +53,6 @@ unw_create_addr_space (unw_accessors_t *a, int byte_order)
 
   as->acc = *a;
 
-  /*
-   * x86 supports only little-endian.
-   */
-  if (byte_order != 0 && byte_order != __LITTLE_ENDIAN)
-    return NULL;
   return as;
 #endif
 }
diff --git a/frysk-imports/libunwind/src/x86/Gfetch_proc_info_post.c b/frysk-imports/libunwind/src/x86/Gfetch_proc_info_post.c
deleted file mode 100644
index 7aa97b6..0000000
--- a/frysk-imports/libunwind/src/x86/Gfetch_proc_info_post.c
+++ /dev/null
@@ -1,51 +0,0 @@
-/* libunwind - a platform-independent unwind library
-   Copyright (c) 2006 Hewlett-Packard Development Company, L.P.
-	Contributed by Jan Kratochvil <jan.kratochvil@redhat.com>
-
-This file is part of libunwind.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
-
-#include "libunwind_i.h"
-
-HIDDEN int
-tdep_fetch_proc_info_post (struct dwarf_cursor *c, unw_word_t ip, int need_unwind_info)
-{
-  struct cursor *cursor = (struct cursor *) c;
-
-  /* Should happen only if `!need_unwind_info'.  */
-  if (!c->pi_valid)
-    return 0;
-  /* Should happen only if `!need_unwind_info'.  */
-  if (!c->pi.unwind_info)
-    return 0;
-
-  /* Reset the value for this frame.  */
-  cursor->sigcontext_format = X86_SCF_NONE;
-
-  /* Normal non-signal frames case.  */
-  if (!((struct dwarf_cie_info *) c->pi.unwind_info)->signal_frame)
-    return 0;
-
-  cursor->sigcontext_format = X86_SCF_LINUX_SIGFRAME;
-  cursor->sigcontext_addr = c->cfa + 4;
-
-  return 0;
-}
diff --git a/frysk-imports/libunwind/src/x86/Gget_proc_info.c b/frysk-imports/libunwind/src/x86/Gget_proc_info.c
index a533483..45b4cd5 100644
--- a/frysk-imports/libunwind/src/x86/Gget_proc_info.c
+++ b/frysk-imports/libunwind/src/x86/Gget_proc_info.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (c) 2002-2003 Hewlett-Packard Development Company, L.P.
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -33,8 +33,8 @@ unw_get_proc_info (unw_cursor_t *cursor, unw_proc_info_t *pi)
   if (dwarf_make_proc_info (&c->dwarf) < 0)
     {
       /* On x86, it's relatively common to be missing DWARF unwind
-	 info.  We don't want to fail in that case, because the
-	 frame-chain still would let us do a backtrace at least.  */
+         info.  We don't want to fail in that case, because the
+         frame-chain still would let us do a backtrace at least.  */
       memset (pi, 0, sizeof (*pi));
       pi->start_ip = c->dwarf.ip;
       pi->end_ip = c->dwarf.ip + 1;
diff --git a/frysk-imports/libunwind/src/x86/Gget_save_loc.c b/frysk-imports/libunwind/src/x86/Gget_save_loc.c
index 6e6f9dc..d440f9e 100644
--- a/frysk-imports/libunwind/src/x86/Gget_save_loc.c
+++ b/frysk-imports/libunwind/src/x86/Gget_save_loc.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -31,7 +31,7 @@ unw_get_save_loc (unw_cursor_t *cursor, int reg, unw_save_loc_t *sloc)
   struct cursor *c = (struct cursor *) cursor;
   dwarf_loc_t loc;
 
-  loc = DWARF_NULL_LOC;		/* default to "not saved" */
+  loc = DWARF_NULL_LOC;         /* default to "not saved" */
 
   switch (reg)
     {
@@ -109,7 +109,7 @@ unw_get_save_loc (unw_cursor_t *cursor, int reg, unw_save_loc_t *sloc)
       break;
     }
 
-  memset (sloc, 0, sizeof (sloc));
+  memset (sloc, 0, sizeof (*sloc));
 
   if (DWARF_IS_NULL_LOC (loc))
     {
diff --git a/frysk-imports/libunwind/src/x86/Gglobal.c b/frysk-imports/libunwind/src/x86/Gglobal.c
index e55644c..132b824 100644
--- a/frysk-imports/libunwind/src/x86/Gglobal.c
+++ b/frysk-imports/libunwind/src/x86/Gglobal.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (c) 2003, 2005 Hewlett-Packard Development Company, L.P.
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -26,12 +26,12 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #include "unwind_i.h"
 #include "dwarf_i.h"
 
-HIDDEN pthread_mutex_t x86_lock = PTHREAD_MUTEX_INITIALIZER;
-HIDDEN int tdep_needs_initialization = 1;
+HIDDEN define_lock (x86_lock);
+HIDDEN int tdep_init_done;
 
 /* See comments for svr4_dbx_register_map[] in gcc/config/i386/i386.c.  */
 
-HIDDEN uint8_t dwarf_to_unw_regnum_map[19] =
+HIDDEN const uint8_t dwarf_to_unw_regnum_map[19] =
   {
     UNW_X86_EAX, UNW_X86_ECX, UNW_X86_EDX, UNW_X86_EBX,
     UNW_X86_ESP, UNW_X86_EBP, UNW_X86_ESI, UNW_X86_EDI,
@@ -47,10 +47,9 @@ tdep_init (void)
 
   sigfillset (&unwi_full_mask);
 
-  sigprocmask (SIG_SETMASK, &unwi_full_mask, &saved_mask);
-  mutex_lock (&x86_lock);
+  lock_acquire (&x86_lock, saved_mask);
   {
-    if (!tdep_needs_initialization)
+    if (tdep_init_done)
       /* another thread else beat us to it... */
       goto out;
 
@@ -61,9 +60,8 @@ tdep_init (void)
 #ifndef UNW_REMOTE_ONLY
     x86_local_addr_space_init ();
 #endif
-    tdep_needs_initialization = 0;	/* signal that we're initialized... */
+    tdep_init_done = 1; /* signal that we're initialized... */
   }
  out:
-  mutex_unlock (&x86_lock);
-  sigprocmask (SIG_SETMASK, &saved_mask, NULL);
+  lock_release (&x86_lock, saved_mask);
 }
diff --git a/frysk-imports/libunwind/src/x86/Ginit.c b/frysk-imports/libunwind/src/x86/Ginit.c
index abc9e61..b05a08e 100644
--- a/frysk-imports/libunwind/src/x86/Ginit.c
+++ b/frysk-imports/libunwind/src/x86/Ginit.c
@@ -1,7 +1,7 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2002 Hewlett-Packard Co
    Copyright (C) 2007 David Mosberger-Tang
-	Contributed by David Mosberger-Tang <dmosberger@gmail.com>
+        Contributed by David Mosberger-Tang <dmosberger@gmail.com>
 
 This file is part of libunwind.
 
@@ -24,6 +24,10 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
 #include <stdlib.h>
 #include <string.h>
 
@@ -40,43 +44,12 @@ static struct unw_addr_space local_addr_space;
 
 PROTECTED unw_addr_space_t unw_local_addr_space = &local_addr_space;
 
-static inline void *
-uc_addr (ucontext_t *uc, int reg)
-{
-  void *addr;
-
-  switch (reg)
-    {
-    case UNW_X86_GS:  addr = &uc->uc_mcontext.gregs[REG_GS]; break;
-    case UNW_X86_FS:  addr = &uc->uc_mcontext.gregs[REG_FS]; break;
-    case UNW_X86_ES:  addr = &uc->uc_mcontext.gregs[REG_ES]; break;
-    case UNW_X86_DS:  addr = &uc->uc_mcontext.gregs[REG_DS]; break;
-    case UNW_X86_EAX: addr = &uc->uc_mcontext.gregs[REG_EAX]; break;
-    case UNW_X86_EBX: addr = &uc->uc_mcontext.gregs[REG_EBX]; break;
-    case UNW_X86_ECX: addr = &uc->uc_mcontext.gregs[REG_ECX]; break;
-    case UNW_X86_EDX: addr = &uc->uc_mcontext.gregs[REG_EDX]; break;
-    case UNW_X86_ESI: addr = &uc->uc_mcontext.gregs[REG_ESI]; break;
-    case UNW_X86_EDI: addr = &uc->uc_mcontext.gregs[REG_EDI]; break;
-    case UNW_X86_EBP: addr = &uc->uc_mcontext.gregs[REG_EBP]; break;
-    case UNW_X86_EIP: addr = &uc->uc_mcontext.gregs[REG_EIP]; break;
-    case UNW_X86_ESP: addr = &uc->uc_mcontext.gregs[REG_ESP]; break;
-    case UNW_X86_TRAPNO:  addr = &uc->uc_mcontext.gregs[REG_TRAPNO]; break;
-    case UNW_X86_CS:  addr = &uc->uc_mcontext.gregs[REG_CS]; break;
-    case UNW_X86_EFLAGS:  addr = &uc->uc_mcontext.gregs[REG_EFL]; break;
-    case UNW_X86_SS:  addr = &uc->uc_mcontext.gregs[REG_SS]; break;
-
-    default:
-      addr = NULL;
-    }
-  return addr;
-}
-
 # ifdef UNW_LOCAL_ONLY
 
 HIDDEN void *
 tdep_uc_addr (ucontext_t *uc, int reg)
 {
-  return uc_addr (uc, reg);
+  return x86_r_uc_addr (uc, reg);
 }
 
 # endif /* UNW_LOCAL_ONLY */
@@ -96,15 +69,72 @@ put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
 
 static int
 get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
-			void *arg)
+                        void *arg)
 {
   *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
   return 0;
 }
 
+#define PAGE_SIZE 4096
+#define PAGE_START(a)   ((a) & ~(PAGE_SIZE-1))
+
+/* Cache of already validated addresses */
+#define NLGA 4
+static unw_word_t last_good_addr[NLGA];
+static int lga_victim;
+
+static int
+validate_mem (unw_word_t addr)
+{
+  int i, victim;
+#ifdef HAVE_MINCORE
+  unsigned char mvec[2]; /* Unaligned access may cross page boundary */
+#endif
+  size_t len;
+
+  if (PAGE_START(addr + sizeof (unw_word_t) - 1) == PAGE_START(addr))
+    len = PAGE_SIZE;
+  else
+    len = PAGE_SIZE * 2;
+
+  addr = PAGE_START(addr);
+
+  if (addr == 0)
+    return -1;
+
+  for (i = 0; i < NLGA; i++)
+    {
+      if (last_good_addr[i] && (addr == last_good_addr[i]))
+        return 0;
+    }
+
+#ifdef HAVE_MINCORE
+  if (mincore ((void *) addr, len, mvec) == -1)
+#else
+  if (msync ((void *) addr, len, MS_ASYNC) == -1)
+#endif
+    return -1;
+
+  victim = lga_victim;
+  for (i = 0; i < NLGA; i++) {
+    if (!last_good_addr[victim]) {
+      last_good_addr[victim++] = addr;
+      return 0;
+    }
+    victim = (victim + 1) % NLGA;
+  }
+
+  /* All slots full. Evict the victim. */
+  last_good_addr[victim] = addr;
+  victim = (victim + 1) % NLGA;
+  lga_victim = victim;
+
+  return 0;
+}
+
 static int
 access_mem (unw_addr_space_t as, unw_word_t addr, unw_word_t *val, int write,
-	    void *arg)
+            void *arg)
 {
   if (write)
     {
@@ -113,6 +143,10 @@ access_mem (unw_addr_space_t as, unw_word_t addr, unw_word_t *val, int write,
     }
   else
     {
+      /* validate address */
+      const struct cursor *c = (const struct cursor *)arg;
+      if (c && c->validate && validate_mem(addr))
+        return -1;
       *val = *(unw_word_t *) addr;
       Debug (16, "mem[%x] -> %x\n", addr, *val);
     }
@@ -121,15 +155,15 @@ access_mem (unw_addr_space_t as, unw_word_t addr, unw_word_t *val, int write,
 
 static int
 access_reg (unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val, int write,
-	    void *arg)
+            void *arg)
 {
   unw_word_t *addr;
-  ucontext_t *uc = arg;
+  ucontext_t *uc = ((struct cursor *)arg)->uc;
 
   if (unw_is_fpreg (reg))
     goto badreg;
 
-  if (!(addr = uc_addr (uc, reg)))
+  if (!(addr = x86_r_uc_addr (uc, reg)))
     goto badreg;
 
   if (write)
@@ -151,28 +185,28 @@ access_reg (unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val, int write,
 
 static int
 access_fpreg (unw_addr_space_t as, unw_regnum_t reg, unw_fpreg_t *val,
-	      int write, void *arg)
+              int write, void *arg)
 {
-  ucontext_t *uc = arg;
+  ucontext_t *uc = ((struct cursor *)arg)->uc;
   unw_fpreg_t *addr;
 
   if (!unw_is_fpreg (reg))
     goto badreg;
 
-  if (!(addr = uc_addr (uc, reg)))
+  if (!(addr = x86_r_uc_addr (uc, reg)))
     goto badreg;
 
   if (write)
     {
       Debug (12, "%s <- %08lx.%08lx.%08lx\n", unw_regname (reg),
-	     ((long *)val)[0], ((long *)val)[1], ((long *)val)[2]);
+             ((long *)val)[0], ((long *)val)[1], ((long *)val)[2]);
       *(unw_fpreg_t *) addr = *val;
     }
   else
     {
       *val = *(unw_fpreg_t *) addr;
       Debug (12, "%s -> %08lx.%08lx.%08lx\n", unw_regname (reg),
-	     ((long *)val)[0], ((long *)val)[1], ((long *)val)[2]);
+             ((long *)val)[0], ((long *)val)[1], ((long *)val)[2]);
     }
   return 0;
 
@@ -184,8 +218,8 @@ access_fpreg (unw_addr_space_t as, unw_regnum_t reg, unw_fpreg_t *val,
 
 static int
 get_static_proc_name (unw_addr_space_t as, unw_word_t ip,
-		      char *buf, size_t buf_len, unw_word_t *offp,
-		      void *arg)
+                      char *buf, size_t buf_len, unw_word_t *offp,
+                      void *arg)
 {
   return _Uelf32_get_proc_name (as, getpid (), ip, buf, buf_len, offp);
 }
diff --git a/frysk-imports/libunwind/src/x86/Ginit_local.c b/frysk-imports/libunwind/src/x86/Ginit_local.c
index 7b86d6e..02fb994 100644
--- a/frysk-imports/libunwind/src/x86/Ginit_local.c
+++ b/frysk-imports/libunwind/src/x86/Ginit_local.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (c) 2002-2003 Hewlett-Packard Development Company, L.P.
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -41,14 +41,16 @@ unw_init_local (unw_cursor_t *cursor, ucontext_t *uc)
 {
   struct cursor *c = (struct cursor *) cursor;
 
-  if (tdep_needs_initialization)
+  if (!tdep_init_done)
     tdep_init ();
 
   Debug (1, "(cursor=%p)\n", c);
 
   c->dwarf.as = unw_local_addr_space;
-  c->dwarf.as_arg = uc;
-  return common_init (c);
+  c->dwarf.as_arg = c;
+  c->uc = uc;
+  c->validate = 0;
+  return common_init (c, 1);
 }
 
 #endif /* !UNW_REMOTE_ONLY */
diff --git a/frysk-imports/libunwind/src/x86/Ginit_remote.c b/frysk-imports/libunwind/src/x86/Ginit_remote.c
index 5d3827d..16b6395 100644
--- a/frysk-imports/libunwind/src/x86/Ginit_remote.c
+++ b/frysk-imports/libunwind/src/x86/Ginit_remote.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (c) 2003 Hewlett-Packard Development Company, L.P.
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -34,13 +34,23 @@ unw_init_remote (unw_cursor_t *cursor, unw_addr_space_t as, void *as_arg)
 #else /* !UNW_LOCAL_ONLY */
   struct cursor *c = (struct cursor *) cursor;
 
-  if (tdep_needs_initialization)
+  if (!tdep_init_done)
     tdep_init ();
 
   Debug (1, "(cursor=%p)\n", c);
 
   c->dwarf.as = as;
   c->dwarf.as_arg = as_arg;
-  return common_init (c);
+  if (as == unw_local_addr_space)
+    {
+      c->dwarf.as_arg = c;
+      c->uc = as_arg;
+    }
+  else
+    {
+      c->dwarf.as_arg = as_arg;
+      c->uc = 0;
+    }
+  return common_init (c, 0);
 #endif /* !UNW_LOCAL_ONLY */
 }
diff --git a/frysk-imports/libunwind/src/x86/Gis_signal_frame.c b/frysk-imports/libunwind/src/x86/Gis_signal_frame.c
deleted file mode 100644
index df381eb..0000000
--- a/frysk-imports/libunwind/src/x86/Gis_signal_frame.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/* libunwind - a platform-independent unwind library
-   Copyright (C) 2002-2003 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
-
-This file is part of libunwind.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
-
-#include "unwind_i.h"
-
-PROTECTED int
-unw_is_signal_frame (unw_cursor_t *cursor)
-{
-#ifdef __linux__
-  struct cursor *c = (struct cursor *) cursor;
-  unw_word_t w0, w1, ip;
-  unw_addr_space_t as;
-  unw_accessors_t *a;
-  void *arg;
-  int ret;
-
-  as = c->dwarf.as;
-  a = unw_get_accessors (as);
-  arg = c->dwarf.as_arg;
-
-  /* Check if EIP points at sigreturn() sequence.  On Linux, this is:
-
-    __restore:
-	0x58				pop %eax
-	0xb8 0x77 0x00 0x00 0x00	movl 0x77,%eax
-	0xcd 0x80			int 0x80
-
-     without SA_SIGINFO, and
-
-    __restore_rt:
-       0xb8 0xad 0x00 0x00 0x00        movl 0x80,%eax
-       0xcd 0x80                       int 0x80
-       0x90                            nop
-
-     if SA_SIGINFO is specified.
-  */
-  ip = c->dwarf.ip;
-  if ((ret = (*a->access_mem) (as, ip, &w0, 0, arg)) < 0
-      || (ret = (*a->access_mem) (as, ip + 4, &w1, 0, arg)) < 0)
-    return ret;
-  ret = ((w0 == 0x0077b858 && w1 == 0x80cd0000)
-	 || (w0 == 0x0000adb8 && w1 == 0x9080cd00));
-  Debug (16, "returning %d\n", ret);
-  return ret;
-#else
-  printf ("%s: implement me\n", __FUNCTION__);
-#endif
-  return -UNW_ENOINFO;
-}
diff --git a/frysk-imports/libunwind/src/x86/Gos-freebsd.c b/frysk-imports/libunwind/src/x86/Gos-freebsd.c
new file mode 100644
index 0000000..cf05f07
--- /dev/null
+++ b/frysk-imports/libunwind/src/x86/Gos-freebsd.c
@@ -0,0 +1,374 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2010 Konstantin Belousov <kib@freebsd.org>
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <sys/types.h>
+#include <signal.h>
+#include <stddef.h>
+#include <ucontext.h>
+#include <machine/sigframe.h>
+
+#include "unwind_i.h"
+#include "offsets.h"
+
+PROTECTED int
+unw_is_signal_frame (unw_cursor_t *cursor)
+{
+  struct cursor *c = (struct cursor *) cursor;
+  unw_word_t w0, w1, w2, w3, w4, w5, ip;
+  unw_addr_space_t as;
+  unw_accessors_t *a;
+  void *arg;
+  int ret;
+
+  as = c->dwarf.as;
+  a = unw_get_accessors (as);
+  arg = c->dwarf.as_arg;
+
+  /* Check if EIP points at sigreturn() sequence.  It can be:
+sigcode+4: from amd64 freebsd32 environment
+8d 44 24 20             lea    0x20(%esp),%eax
+50                      push   %eax
+b8 a1 01 00 00          mov    $0x1a1,%eax
+50                      push   %eax
+cd 80                   int    $0x80
+
+sigcode+4: from real i386
+8d 44 24 20             lea    0x20(%esp),%eax
+50                      push   %eax
+f7 40 54 00 02 00       testl  $0x20000,0x54(%eax)
+75 03                   jne    sigcode+21
+8e 68 14                mov    0x14(%eax),%gs
+b8 a1 01 00 00          mov    $0x1a1,%eax
+50                      push   %eax
+cd 80                   int    $0x80
+
+freebsd4_sigcode+4:
+XXX
+osigcode:
+XXX
+  */
+  ip = c->dwarf.ip;
+  ret = X86_SCF_NONE;
+  c->sigcontext_format = ret;
+  if ((*a->access_mem) (as, ip, &w0, 0, arg) < 0 ||
+      (*a->access_mem) (as, ip + 4, &w1, 0, arg) < 0 ||
+      (*a->access_mem) (as, ip + 8, &w2, 0, arg) < 0 ||
+      (*a->access_mem) (as, ip + 12, &w3, 0, arg) < 0)
+    return ret;
+  if (w0 == 0x2024448d && w1 == 0x01a1b850 && w2 == 0xcd500000 &&
+      (w3 & 0xff) == 0x80)
+    ret = X86_SCF_FREEBSD_SIGFRAME;
+  else {
+    if ((*a->access_mem) (as, ip + 16, &w4, 0, arg) < 0 ||
+        (*a->access_mem) (as, ip + 20, &w5, 0, arg) < 0)
+      return ret;
+    if (w0 == 0x2024448d && w1 == 0x5440f750 && w2 == 0x75000200 &&
+        w3 == 0x14688e03 && w4 == 0x0001a1b8 && w5 == 0x80cd5000)
+      ret = X86_SCF_FREEBSD_SIGFRAME;
+  }
+
+  /* Check for syscall */
+  if (ret == X86_SCF_NONE && (*a->access_mem) (as, ip - 2, &w0, 0, arg) >= 0 &&
+      (w0 & 0xffff) == 0x80cd)
+    ret = X86_SCF_FREEBSD_SYSCALL;
+  Debug (16, "returning %d\n", ret);
+  c->sigcontext_format = ret;
+  return (ret);
+}
+
+PROTECTED int
+unw_handle_signal_frame (unw_cursor_t *cursor)
+{
+  struct cursor *c = (struct cursor *) cursor;
+  int ret;
+
+  if (c->sigcontext_format == X86_SCF_FREEBSD_SIGFRAME) {
+    struct sigframe *sf;
+    uintptr_t uc_addr;
+    struct dwarf_loc esp_loc;
+
+    sf = (struct sigframe *)c->dwarf.cfa;
+    uc_addr = (uintptr_t)&(sf->sf_uc);
+    c->sigcontext_addr = c->dwarf.cfa;
+
+    esp_loc = DWARF_LOC (uc_addr + FREEBSD_UC_MCONTEXT_ESP_OFF, 0);
+    ret = dwarf_get (&c->dwarf, esp_loc, &c->dwarf.cfa);
+    if (ret < 0)
+    {
+            Debug (2, "returning 0\n");
+            return 0;
+    }
+
+    c->dwarf.loc[EIP] = DWARF_LOC (uc_addr + FREEBSD_UC_MCONTEXT_EIP_OFF, 0);
+    c->dwarf.loc[ESP] = DWARF_LOC (uc_addr + FREEBSD_UC_MCONTEXT_ESP_OFF, 0);
+    c->dwarf.loc[EAX] = DWARF_LOC (uc_addr + FREEBSD_UC_MCONTEXT_EAX_OFF, 0);
+    c->dwarf.loc[ECX] = DWARF_LOC (uc_addr + FREEBSD_UC_MCONTEXT_ECX_OFF, 0);
+    c->dwarf.loc[EDX] = DWARF_LOC (uc_addr + FREEBSD_UC_MCONTEXT_EDX_OFF, 0);
+    c->dwarf.loc[EBX] = DWARF_LOC (uc_addr + FREEBSD_UC_MCONTEXT_EBX_OFF, 0);
+    c->dwarf.loc[EBP] = DWARF_LOC (uc_addr + FREEBSD_UC_MCONTEXT_EBP_OFF, 0);
+    c->dwarf.loc[ESI] = DWARF_LOC (uc_addr + FREEBSD_UC_MCONTEXT_ESI_OFF, 0);
+    c->dwarf.loc[EDI] = DWARF_LOC (uc_addr + FREEBSD_UC_MCONTEXT_EDI_OFF, 0);
+    c->dwarf.loc[EFLAGS] = DWARF_LOC (uc_addr + FREEBSD_UC_MCONTEXT_EFLAGS_OFF, 0);
+    c->dwarf.loc[TRAPNO] = DWARF_LOC (uc_addr + FREEBSD_UC_MCONTEXT_TRAPNO_OFF, 0);
+    c->dwarf.loc[ST0] = DWARF_NULL_LOC;
+  } else if (c->sigcontext_format == X86_SCF_FREEBSD_SYSCALL) {
+    c->dwarf.loc[EIP] = DWARF_LOC (c->dwarf.cfa, 0);
+    c->dwarf.loc[EAX] = DWARF_NULL_LOC;
+    c->dwarf.cfa += 4;
+    c->dwarf.use_prev_instr = 1;
+  } else {
+    Debug (8, "Gstep: not handling frame format %d\n", c->sigcontext_format);
+    abort();
+  }
+  return 0;
+}
+
+HIDDEN dwarf_loc_t
+x86_get_scratch_loc (struct cursor *c, unw_regnum_t reg)
+{
+  unw_word_t addr = c->sigcontext_addr, off, xmm_off;
+  unw_word_t fpstate, fpformat;
+  int ret, is_fpstate = 0, is_xmmstate = 0;
+
+  switch (c->sigcontext_format)
+    {
+    case X86_SCF_NONE:
+      return DWARF_REG_LOC (&c->dwarf, reg);
+
+    case X86_SCF_FREEBSD_SIGFRAME:
+      addr += offsetof(struct sigframe, sf_uc) + FREEBSD_UC_MCONTEXT_OFF;
+      break;
+
+    case X86_SCF_FREEBSD_SIGFRAME4:
+      abort();
+      break;
+
+    case X86_SCF_FREEBSD_OSIGFRAME:
+      /* XXXKIB */
+      abort();
+      break;
+
+    case X86_SCF_FREEBSD_SYSCALL:
+      /* XXXKIB */
+      abort();
+      break;
+
+    default:
+      /* XXXKIB */
+      abort();
+      break;
+    }
+
+  off = 0; /* shut gcc warning */
+  switch (reg)
+    {
+    case UNW_X86_GS: off = FREEBSD_UC_MCONTEXT_GS_OFF; break;
+    case UNW_X86_FS: off = FREEBSD_UC_MCONTEXT_FS_OFF; break;
+    case UNW_X86_ES: off = FREEBSD_UC_MCONTEXT_ES_OFF; break;
+    case UNW_X86_DS: off = FREEBSD_UC_MCONTEXT_SS_OFF; break;
+    case UNW_X86_EDI: off = FREEBSD_UC_MCONTEXT_EDI_OFF; break;
+    case UNW_X86_ESI: off = FREEBSD_UC_MCONTEXT_ESI_OFF; break;
+    case UNW_X86_EBP: off = FREEBSD_UC_MCONTEXT_EBP_OFF; break;
+    case UNW_X86_ESP: off = FREEBSD_UC_MCONTEXT_ESP_OFF; break;
+    case UNW_X86_EBX: off = FREEBSD_UC_MCONTEXT_EBX_OFF; break;
+    case UNW_X86_EDX: off = FREEBSD_UC_MCONTEXT_EDX_OFF; break;
+    case UNW_X86_ECX: off = FREEBSD_UC_MCONTEXT_ECX_OFF; break;
+    case UNW_X86_EAX: off = FREEBSD_UC_MCONTEXT_EAX_OFF; break;
+    case UNW_X86_TRAPNO: off = FREEBSD_UC_MCONTEXT_TRAPNO_OFF; break;
+    case UNW_X86_EIP: off = FREEBSD_UC_MCONTEXT_EIP_OFF; break;
+    case UNW_X86_CS: off = FREEBSD_UC_MCONTEXT_CS_OFF; break;
+    case UNW_X86_EFLAGS: off = FREEBSD_UC_MCONTEXT_EFLAGS_OFF; break;
+    case UNW_X86_SS: off = FREEBSD_UC_MCONTEXT_SS_OFF; break;
+
+    case UNW_X86_FCW:
+      is_fpstate = 1;
+      off = FREEBSD_UC_MCONTEXT_CW_OFF;
+      xmm_off = FREEBSD_UC_MCONTEXT_CW_XMM_OFF;
+      break;
+    case UNW_X86_FSW:
+      is_fpstate = 1;
+      off = FREEBSD_UC_MCONTEXT_SW_OFF;
+      xmm_off = FREEBSD_UC_MCONTEXT_SW_XMM_OFF;
+      break;
+    case UNW_X86_FTW:
+      is_fpstate = 1;
+      xmm_off = FREEBSD_UC_MCONTEXT_TAG_XMM_OFF;
+      off = FREEBSD_UC_MCONTEXT_TAG_OFF;
+      break;
+    case UNW_X86_FCS:
+      is_fpstate = 1;
+      off = FREEBSD_UC_MCONTEXT_CSSEL_OFF;
+      xmm_off = FREEBSD_UC_MCONTEXT_CSSEL_XMM_OFF;
+      break;
+    case UNW_X86_FIP:
+      is_fpstate = 1;
+      off = FREEBSD_UC_MCONTEXT_IPOFF_OFF;
+      xmm_off = FREEBSD_UC_MCONTEXT_IPOFF_XMM_OFF;
+      break;
+    case UNW_X86_FEA:
+      is_fpstate = 1;
+      off = FREEBSD_UC_MCONTEXT_DATAOFF_OFF;
+      xmm_off = FREEBSD_UC_MCONTEXT_DATAOFF_XMM_OFF;
+      break;
+    case UNW_X86_FDS:
+      is_fpstate = 1;
+      off = FREEBSD_US_MCONTEXT_DATASEL_OFF;
+      xmm_off = FREEBSD_US_MCONTEXT_DATASEL_XMM_OFF;
+      break;
+    case UNW_X86_MXCSR:
+      is_fpstate = 1;
+      is_xmmstate = 1;
+      xmm_off = FREEBSD_UC_MCONTEXT_MXCSR_XMM_OFF;
+      break;
+
+      /* stacked fp registers */
+    case UNW_X86_ST0: case UNW_X86_ST1: case UNW_X86_ST2: case UNW_X86_ST3:
+    case UNW_X86_ST4: case UNW_X86_ST5: case UNW_X86_ST6: case UNW_X86_ST7:
+      is_fpstate = 1;
+      off = FREEBSD_UC_MCONTEXT_ST0_OFF + 10*(reg - UNW_X86_ST0);
+      xmm_off = FREEBSD_UC_MCONTEXT_ST0_XMM_OFF + 10*(reg - UNW_X86_ST0);
+      break;
+
+     /* SSE fp registers */
+    case UNW_X86_XMM0_lo: case UNW_X86_XMM0_hi:
+    case UNW_X86_XMM1_lo: case UNW_X86_XMM1_hi:
+    case UNW_X86_XMM2_lo: case UNW_X86_XMM2_hi:
+    case UNW_X86_XMM3_lo: case UNW_X86_XMM3_hi:
+    case UNW_X86_XMM4_lo: case UNW_X86_XMM4_hi:
+    case UNW_X86_XMM5_lo: case UNW_X86_XMM5_hi:
+    case UNW_X86_XMM6_lo: case UNW_X86_XMM6_hi:
+    case UNW_X86_XMM7_lo: case UNW_X86_XMM7_hi:
+      is_fpstate = 1;
+      is_xmmstate = 1;
+      xmm_off = FREEBSD_UC_MCONTEXT_XMM0_OFF + 8*(reg - UNW_X86_XMM0_lo);
+      break;
+    case UNW_X86_XMM0:
+    case UNW_X86_XMM1:
+    case UNW_X86_XMM2:
+    case UNW_X86_XMM3:
+    case UNW_X86_XMM4:
+    case UNW_X86_XMM5:
+    case UNW_X86_XMM6:
+    case UNW_X86_XMM7:
+      is_fpstate = 1;
+      is_xmmstate = 1;
+      xmm_off = FREEBSD_UC_MCONTEXT_XMM0_OFF + 16*(reg - UNW_X86_XMM0);
+      break;
+
+    case UNW_X86_FOP:
+    case UNW_X86_TSS:
+    case UNW_X86_LDT:
+    default:
+      return DWARF_REG_LOC (&c->dwarf, reg);
+    }
+
+  if (is_fpstate)
+    {
+      if ((ret = dwarf_get (&c->dwarf,
+           DWARF_MEM_LOC (&c->dwarf, addr + FREEBSD_UC_MCONTEXT_FPSTATE_OFF),
+           &fpstate)) < 0)
+        return DWARF_NULL_LOC;
+      if (fpstate == FREEBSD_UC_MCONTEXT_FPOWNED_NONE)
+        return DWARF_NULL_LOC;
+      if ((ret = dwarf_get (&c->dwarf,
+           DWARF_MEM_LOC (&c->dwarf, addr + FREEBSD_UC_MCONTEXT_FPFORMAT_OFF),
+           &fpformat)) < 0)
+        return DWARF_NULL_LOC;
+      if (fpformat == FREEBSD_UC_MCONTEXT_FPFMT_NODEV ||
+          (is_xmmstate && fpformat != FREEBSD_UC_MCONTEXT_FPFMT_XMM))
+        return DWARF_NULL_LOC;
+      if (is_xmmstate)
+        off = xmm_off;
+    }
+
+    return DWARF_MEM_LOC (c, addr + off);
+}
+
+#ifndef UNW_REMOTE_ONLY
+HIDDEN void *
+x86_r_uc_addr (ucontext_t *uc, int reg)
+{
+  void *addr;
+
+  switch (reg)
+    {
+    case UNW_X86_GS:  addr = &uc->uc_mcontext.mc_gs; break;
+    case UNW_X86_FS:  addr = &uc->uc_mcontext.mc_fs; break;
+    case UNW_X86_ES:  addr = &uc->uc_mcontext.mc_es; break;
+    case UNW_X86_DS:  addr = &uc->uc_mcontext.mc_ds; break;
+    case UNW_X86_EAX: addr = &uc->uc_mcontext.mc_eax; break;
+    case UNW_X86_EBX: addr = &uc->uc_mcontext.mc_ebx; break;
+    case UNW_X86_ECX: addr = &uc->uc_mcontext.mc_ecx; break;
+    case UNW_X86_EDX: addr = &uc->uc_mcontext.mc_edx; break;
+    case UNW_X86_ESI: addr = &uc->uc_mcontext.mc_esi; break;
+    case UNW_X86_EDI: addr = &uc->uc_mcontext.mc_edi; break;
+    case UNW_X86_EBP: addr = &uc->uc_mcontext.mc_ebp; break;
+    case UNW_X86_EIP: addr = &uc->uc_mcontext.mc_eip; break;
+    case UNW_X86_ESP: addr = &uc->uc_mcontext.mc_esp; break;
+    case UNW_X86_TRAPNO:  addr = &uc->uc_mcontext.mc_trapno; break;
+    case UNW_X86_CS:  addr = &uc->uc_mcontext.mc_cs; break;
+    case UNW_X86_EFLAGS:  addr = &uc->uc_mcontext.mc_eflags; break;
+    case UNW_X86_SS:  addr = &uc->uc_mcontext.mc_ss; break;
+
+    default:
+      addr = NULL;
+    }
+  return addr;
+}
+
+HIDDEN int
+x86_local_resume (unw_addr_space_t as, unw_cursor_t *cursor, void *arg)
+{
+  struct cursor *c = (struct cursor *) cursor;
+  ucontext_t *uc = c->uc;
+
+  /* Ensure c->pi is up-to-date.  On x86, it's relatively common to be
+     missing DWARF unwind info.  We don't want to fail in that case,
+     because the frame-chain still would let us do a backtrace at
+     least.  */
+  dwarf_make_proc_info (&c->dwarf);
+
+  if (c->sigcontext_format == X86_SCF_NONE) {
+      Debug (8, "resuming at ip=%x via setcontext()\n", c->dwarf.ip);
+      setcontext (uc);
+      abort();
+  } else if (c->sigcontext_format == X86_SCF_FREEBSD_SIGFRAME) {
+      struct sigcontext *sc = (struct sigcontext *) c->sigcontext_addr;
+
+      Debug (8, "resuming at ip=%x via sigreturn(%p)\n", c->dwarf.ip, sc);
+      sigreturn((ucontext_t *)((const char *)sc + FREEBSD_SC_UCONTEXT_OFF));
+      abort();
+  } else {
+      Debug (8, "resuming at ip=%x for sigcontext format %d not implemented\n",
+      c->dwarf.ip, c->sigcontext_format);
+      abort();
+  }
+  return -UNW_EINVAL;
+}
+
+#endif
diff --git a/frysk-imports/libunwind/src/x86/Gos-linux.c b/frysk-imports/libunwind/src/x86/Gos-linux.c
new file mode 100644
index 0000000..17aebc2
--- /dev/null
+++ b/frysk-imports/libunwind/src/x86/Gos-linux.c
@@ -0,0 +1,308 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2002-2004 Hewlett-Packard Co
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "unwind_i.h"
+#include "offsets.h"
+
+PROTECTED int
+unw_is_signal_frame (unw_cursor_t *cursor)
+{
+  struct cursor *c = (struct cursor *) cursor;
+  unw_word_t w0, w1, ip;
+  unw_addr_space_t as;
+  unw_accessors_t *a;
+  void *arg;
+  int ret;
+
+  as = c->dwarf.as;
+  a = unw_get_accessors (as);
+  arg = c->dwarf.as_arg;
+
+  /* Check if EIP points at sigreturn() sequence.  On Linux, this is:
+
+    __restore:
+        0x58                            pop %eax
+        0xb8 0x77 0x00 0x00 0x00        movl 0x77,%eax
+        0xcd 0x80                       int 0x80
+
+     without SA_SIGINFO, and
+
+    __restore_rt:
+       0xb8 0xad 0x00 0x00 0x00        movl 0xad,%eax
+       0xcd 0x80                       int 0x80
+       0x00                            
+
+     if SA_SIGINFO is specified.
+  */
+  ip = c->dwarf.ip;
+  if ((*a->access_mem) (as, ip, &w0, 0, arg) < 0
+      || (*a->access_mem) (as, ip + 4, &w1, 0, arg) < 0)
+    ret = 0;
+  else
+    ret = ((w0 == 0x0077b858 && w1 == 0x80cd0000)
+         || (w0 == 0x0000adb8 && (w1 & 0xffffff) == 0x80cd00));
+  Debug (16, "returning %d\n", ret);
+  return ret;
+}
+
+PROTECTED int
+unw_handle_signal_frame (unw_cursor_t *cursor)
+{
+  struct cursor *c = (struct cursor *) cursor;
+  int ret;
+
+  /* c->esp points at the arguments to the handler.  Without
+     SA_SIGINFO, the arguments consist of a signal number
+     followed by a struct sigcontext.  With SA_SIGINFO, the
+     arguments consist a signal number, a siginfo *, and a
+     ucontext *. */
+  unw_word_t sc_addr;
+  unw_word_t siginfo_ptr_addr = c->dwarf.cfa + 4;
+  unw_word_t sigcontext_ptr_addr = c->dwarf.cfa + 8;
+  unw_word_t siginfo_ptr, sigcontext_ptr;
+  struct dwarf_loc esp_loc, siginfo_ptr_loc, sigcontext_ptr_loc;
+
+  siginfo_ptr_loc = DWARF_LOC (siginfo_ptr_addr, 0);
+  sigcontext_ptr_loc = DWARF_LOC (sigcontext_ptr_addr, 0);
+  ret = (dwarf_get (&c->dwarf, siginfo_ptr_loc, &siginfo_ptr)
+         | dwarf_get (&c->dwarf, sigcontext_ptr_loc, &sigcontext_ptr));
+  if (ret < 0)
+    {
+      Debug (2, "returning 0\n");
+      return 0;
+    }
+  if (siginfo_ptr < c->dwarf.cfa
+      || siginfo_ptr > c->dwarf.cfa + 256
+      || sigcontext_ptr < c->dwarf.cfa
+      || sigcontext_ptr > c->dwarf.cfa + 256)
+    {
+      /* Not plausible for SA_SIGINFO signal */
+      c->sigcontext_format = X86_SCF_LINUX_SIGFRAME;
+      c->sigcontext_addr = sc_addr = c->dwarf.cfa + 4;
+    }
+  else
+    {
+      /* If SA_SIGINFO were not specified, we actually read
+         various segment pointers instead.  We believe that at
+         least fs and _fsh are always zero for linux, so it is
+         not just unlikely, but impossible that we would end
+         up here. */
+      c->sigcontext_format = X86_SCF_LINUX_RT_SIGFRAME;
+      c->sigcontext_addr = sigcontext_ptr;
+      sc_addr = sigcontext_ptr + LINUX_UC_MCONTEXT_OFF;
+    }
+  esp_loc = DWARF_LOC (sc_addr + LINUX_SC_ESP_OFF, 0);
+  ret = dwarf_get (&c->dwarf, esp_loc, &c->dwarf.cfa);
+  if (ret < 0)
+    {
+      Debug (2, "returning 0\n");
+      return 0;
+    }
+
+  c->dwarf.loc[EAX] = DWARF_LOC (sc_addr + LINUX_SC_EAX_OFF, 0);
+  c->dwarf.loc[ECX] = DWARF_LOC (sc_addr + LINUX_SC_ECX_OFF, 0);
+  c->dwarf.loc[EDX] = DWARF_LOC (sc_addr + LINUX_SC_EDX_OFF, 0);
+  c->dwarf.loc[EBX] = DWARF_LOC (sc_addr + LINUX_SC_EBX_OFF, 0);
+  c->dwarf.loc[EBP] = DWARF_LOC (sc_addr + LINUX_SC_EBP_OFF, 0);
+  c->dwarf.loc[ESI] = DWARF_LOC (sc_addr + LINUX_SC_ESI_OFF, 0);
+  c->dwarf.loc[EDI] = DWARF_LOC (sc_addr + LINUX_SC_EDI_OFF, 0);
+  c->dwarf.loc[EFLAGS] = DWARF_NULL_LOC;
+  c->dwarf.loc[TRAPNO] = DWARF_NULL_LOC;
+  c->dwarf.loc[ST0] = DWARF_NULL_LOC;
+  c->dwarf.loc[EIP] = DWARF_LOC (sc_addr + LINUX_SC_EIP_OFF, 0);
+  c->dwarf.loc[ESP] = DWARF_LOC (sc_addr + LINUX_SC_ESP_OFF, 0);
+
+  return 0;
+}
+
+HIDDEN dwarf_loc_t
+x86_get_scratch_loc (struct cursor *c, unw_regnum_t reg)
+{
+  unw_word_t addr = c->sigcontext_addr, fpstate_addr, off;
+  int ret, is_fpstate = 0;
+
+  switch (c->sigcontext_format)
+    {
+    case X86_SCF_NONE:
+      return DWARF_REG_LOC (&c->dwarf, reg);
+
+    case X86_SCF_LINUX_SIGFRAME:
+      break;
+
+    case X86_SCF_LINUX_RT_SIGFRAME:
+      addr += LINUX_UC_MCONTEXT_OFF;
+      break;
+
+    default:
+      return DWARF_NULL_LOC;
+    }
+
+  switch (reg)
+    {
+    case UNW_X86_GS: off = LINUX_SC_GS_OFF; break;
+    case UNW_X86_FS: off = LINUX_SC_FS_OFF; break;
+    case UNW_X86_ES: off = LINUX_SC_ES_OFF; break;
+    case UNW_X86_DS: off = LINUX_SC_DS_OFF; break;
+    case UNW_X86_EDI: off = LINUX_SC_EDI_OFF; break;
+    case UNW_X86_ESI: off = LINUX_SC_ESI_OFF; break;
+    case UNW_X86_EBP: off = LINUX_SC_EBP_OFF; break;
+    case UNW_X86_ESP: off = LINUX_SC_ESP_OFF; break;
+    case UNW_X86_EBX: off = LINUX_SC_EBX_OFF; break;
+    case UNW_X86_EDX: off = LINUX_SC_EDX_OFF; break;
+    case UNW_X86_ECX: off = LINUX_SC_ECX_OFF; break;
+    case UNW_X86_EAX: off = LINUX_SC_EAX_OFF; break;
+    case UNW_X86_TRAPNO: off = LINUX_SC_TRAPNO_OFF; break;
+    case UNW_X86_EIP: off = LINUX_SC_EIP_OFF; break;
+    case UNW_X86_CS: off = LINUX_SC_CS_OFF; break;
+    case UNW_X86_EFLAGS: off = LINUX_SC_EFLAGS_OFF; break;
+    case UNW_X86_SS: off = LINUX_SC_SS_OFF; break;
+
+      /* The following is probably not correct for all possible cases.
+         Somebody who understands this better should review this for
+         correctness.  */
+
+    case UNW_X86_FCW: is_fpstate = 1; off = LINUX_FPSTATE_CW_OFF; break;
+    case UNW_X86_FSW: is_fpstate = 1; off = LINUX_FPSTATE_SW_OFF; break;
+    case UNW_X86_FTW: is_fpstate = 1; off = LINUX_FPSTATE_TAG_OFF; break;
+    case UNW_X86_FCS: is_fpstate = 1; off = LINUX_FPSTATE_CSSEL_OFF; break;
+    case UNW_X86_FIP: is_fpstate = 1; off = LINUX_FPSTATE_IPOFF_OFF; break;
+    case UNW_X86_FEA: is_fpstate = 1; off = LINUX_FPSTATE_DATAOFF_OFF; break;
+    case UNW_X86_FDS: is_fpstate = 1; off = LINUX_FPSTATE_DATASEL_OFF; break;
+    case UNW_X86_MXCSR: is_fpstate = 1; off = LINUX_FPSTATE_MXCSR_OFF; break;
+
+      /* stacked fp registers */
+    case UNW_X86_ST0: case UNW_X86_ST1: case UNW_X86_ST2: case UNW_X86_ST3:
+    case UNW_X86_ST4: case UNW_X86_ST5: case UNW_X86_ST6: case UNW_X86_ST7:
+      is_fpstate = 1;
+      off = LINUX_FPSTATE_ST0_OFF + 10*(reg - UNW_X86_ST0);
+      break;
+
+     /* SSE fp registers */
+    case UNW_X86_XMM0_lo: case UNW_X86_XMM0_hi:
+    case UNW_X86_XMM1_lo: case UNW_X86_XMM1_hi:
+    case UNW_X86_XMM2_lo: case UNW_X86_XMM2_hi:
+    case UNW_X86_XMM3_lo: case UNW_X86_XMM3_hi:
+    case UNW_X86_XMM4_lo: case UNW_X86_XMM4_hi:
+    case UNW_X86_XMM5_lo: case UNW_X86_XMM5_hi:
+    case UNW_X86_XMM6_lo: case UNW_X86_XMM6_hi:
+    case UNW_X86_XMM7_lo: case UNW_X86_XMM7_hi:
+      is_fpstate = 1;
+      off = LINUX_FPSTATE_XMM0_OFF + 8*(reg - UNW_X86_XMM0_lo);
+      break;
+    case UNW_X86_XMM0:
+    case UNW_X86_XMM1:
+    case UNW_X86_XMM2:
+    case UNW_X86_XMM3:
+    case UNW_X86_XMM4:
+    case UNW_X86_XMM5:
+    case UNW_X86_XMM6:
+    case UNW_X86_XMM7:
+      is_fpstate = 1;
+      off = LINUX_FPSTATE_XMM0_OFF + 16*(reg - UNW_X86_XMM0);
+      break;
+
+    case UNW_X86_FOP:
+    case UNW_X86_TSS:
+    case UNW_X86_LDT:
+    default:
+      return DWARF_REG_LOC (&c->dwarf, reg);
+    }
+
+  if (is_fpstate)
+    {
+      if ((ret = dwarf_get (&c->dwarf,
+                            DWARF_MEM_LOC (&c->dwarf,
+                                           addr + LINUX_SC_FPSTATE_OFF),
+                            &fpstate_addr)) < 0)
+        return DWARF_NULL_LOC;
+
+      if (!fpstate_addr)
+        return DWARF_NULL_LOC;
+
+      return DWARF_MEM_LOC (c, fpstate_addr + off);
+    }
+  else
+    return DWARF_MEM_LOC (c, addr + off);
+}
+
+#ifndef UNW_REMOTE_ONLY
+HIDDEN void *
+x86_r_uc_addr (ucontext_t *uc, int reg)
+{
+  void *addr;
+
+  switch (reg)
+    {
+    case UNW_X86_GS:  addr = &uc->uc_mcontext.gregs[REG_GS]; break;
+    case UNW_X86_FS:  addr = &uc->uc_mcontext.gregs[REG_FS]; break;
+    case UNW_X86_ES:  addr = &uc->uc_mcontext.gregs[REG_ES]; break;
+    case UNW_X86_DS:  addr = &uc->uc_mcontext.gregs[REG_DS]; break;
+    case UNW_X86_EAX: addr = &uc->uc_mcontext.gregs[REG_EAX]; break;
+    case UNW_X86_EBX: addr = &uc->uc_mcontext.gregs[REG_EBX]; break;
+    case UNW_X86_ECX: addr = &uc->uc_mcontext.gregs[REG_ECX]; break;
+    case UNW_X86_EDX: addr = &uc->uc_mcontext.gregs[REG_EDX]; break;
+    case UNW_X86_ESI: addr = &uc->uc_mcontext.gregs[REG_ESI]; break;
+    case UNW_X86_EDI: addr = &uc->uc_mcontext.gregs[REG_EDI]; break;
+    case UNW_X86_EBP: addr = &uc->uc_mcontext.gregs[REG_EBP]; break;
+    case UNW_X86_EIP: addr = &uc->uc_mcontext.gregs[REG_EIP]; break;
+    case UNW_X86_ESP: addr = &uc->uc_mcontext.gregs[REG_ESP]; break;
+    case UNW_X86_TRAPNO:  addr = &uc->uc_mcontext.gregs[REG_TRAPNO]; break;
+    case UNW_X86_CS:  addr = &uc->uc_mcontext.gregs[REG_CS]; break;
+    case UNW_X86_EFLAGS:  addr = &uc->uc_mcontext.gregs[REG_EFL]; break;
+    case UNW_X86_SS:  addr = &uc->uc_mcontext.gregs[REG_SS]; break;
+
+    default:
+      addr = NULL;
+    }
+  return addr;
+}
+
+HIDDEN int
+x86_local_resume (unw_addr_space_t as, unw_cursor_t *cursor, void *arg)
+{
+  struct cursor *c = (struct cursor *) cursor;
+  ucontext_t *uc = c->uc;
+
+  /* Ensure c->pi is up-to-date.  On x86, it's relatively common to be
+     missing DWARF unwind info.  We don't want to fail in that case,
+     because the frame-chain still would let us do a backtrace at
+     least.  */
+  dwarf_make_proc_info (&c->dwarf);
+
+  if (unlikely (c->sigcontext_format != X86_SCF_NONE))
+    {
+      struct sigcontext *sc = (struct sigcontext *) c->sigcontext_addr;
+
+      Debug (8, "resuming at ip=%x via sigreturn(%p)\n", c->dwarf.ip, sc);
+      sigreturn (sc);
+    }
+  else
+    {
+      Debug (8, "resuming at ip=%x via setcontext()\n", c->dwarf.ip);
+      setcontext (uc);
+    }
+  return -UNW_EINVAL;
+}
+#endif
diff --git a/frysk-imports/libunwind/src/x86/Gregs.c b/frysk-imports/libunwind/src/x86/Gregs.c
index 78cfabc..4a95926 100644
--- a/frysk-imports/libunwind/src/x86/Gregs.c
+++ b/frysk-imports/libunwind/src/x86/Gregs.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (c) 2002-2004 Hewlett-Packard Development Company, L.P.
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -26,125 +26,18 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #include "offsets.h"
 #include "unwind_i.h"
 
-static inline dwarf_loc_t
-linux_scratch_loc (struct cursor *c, unw_regnum_t reg)
-{
-  unw_word_t addr = c->sigcontext_addr, fpstate_addr, off;
-  int ret, is_fpstate = 0;
-
-  switch (c->sigcontext_format)
-    {
-    case X86_SCF_NONE:
-      return DWARF_REG_LOC (&c->dwarf, reg);
-
-    case X86_SCF_LINUX_SIGFRAME:
-      break;
-
-    case X86_SCF_LINUX_RT_SIGFRAME:
-      addr += LINUX_UC_MCONTEXT_OFF;
-      break;
-    }
-
-  switch (reg)
-    {
-    case UNW_X86_GS: off = LINUX_SC_GS_OFF; break;
-    case UNW_X86_FS: off = LINUX_SC_FS_OFF; break;
-    case UNW_X86_ES: off = LINUX_SC_ES_OFF; break;
-    case UNW_X86_DS: off = LINUX_SC_DS_OFF; break;
-    case UNW_X86_EDI: off = LINUX_SC_EDI_OFF; break;
-    case UNW_X86_ESI: off = LINUX_SC_ESI_OFF; break;
-    case UNW_X86_EBP: off = LINUX_SC_EBP_OFF; break;
-    case UNW_X86_ESP: off = LINUX_SC_ESP_OFF; break;
-    case UNW_X86_EBX: off = LINUX_SC_EBX_OFF; break;
-    case UNW_X86_EDX: off = LINUX_SC_EDX_OFF; break;
-    case UNW_X86_ECX: off = LINUX_SC_ECX_OFF; break;
-    case UNW_X86_EAX: off = LINUX_SC_EAX_OFF; break;
-    case UNW_X86_TRAPNO: off = LINUX_SC_TRAPNO_OFF; break;
-    case UNW_X86_EIP: off = LINUX_SC_EIP_OFF; break;
-    case UNW_X86_CS: off = LINUX_SC_CS_OFF; break;
-    case UNW_X86_EFLAGS: off = LINUX_SC_EFLAGS_OFF; break;
-    case UNW_X86_SS: off = LINUX_SC_SS_OFF; break;
-
-      /* The following is probably not correct for all possible cases.
-	 Somebody who understands this better should review this for
-	 correctness.  */
-
-    case UNW_X86_FCW: is_fpstate = 1; off = LINUX_FPSTATE_CW_OFF; break;
-    case UNW_X86_FSW: is_fpstate = 1; off = LINUX_FPSTATE_SW_OFF; break;
-    case UNW_X86_FTW: is_fpstate = 1; off = LINUX_FPSTATE_TAG_OFF; break;
-    case UNW_X86_FCS: is_fpstate = 1; off = LINUX_FPSTATE_CSSEL_OFF; break;
-    case UNW_X86_FIP: is_fpstate = 1; off = LINUX_FPSTATE_IPOFF_OFF; break;
-    case UNW_X86_FEA: is_fpstate = 1; off = LINUX_FPSTATE_DATAOFF_OFF; break;
-    case UNW_X86_FDS: is_fpstate = 1; off = LINUX_FPSTATE_DATASEL_OFF; break;
-    case UNW_X86_MXCSR: is_fpstate = 1; off = LINUX_FPSTATE_MXCSR_OFF; break;
-
-      /* stacked fp registers */
-    case UNW_X86_ST0: case UNW_X86_ST1: case UNW_X86_ST2: case UNW_X86_ST3:
-    case UNW_X86_ST4: case UNW_X86_ST5: case UNW_X86_ST6: case UNW_X86_ST7:
-      is_fpstate = 1;
-      off = LINUX_FPSTATE_ST0_OFF + 10*(reg - UNW_X86_ST0);
-      break;
-
-     /* SSE fp registers */
-    case UNW_X86_XMM0_lo: case UNW_X86_XMM0_hi:
-    case UNW_X86_XMM1_lo: case UNW_X86_XMM1_hi:
-    case UNW_X86_XMM2_lo: case UNW_X86_XMM2_hi:
-    case UNW_X86_XMM3_lo: case UNW_X86_XMM3_hi:
-    case UNW_X86_XMM4_lo: case UNW_X86_XMM4_hi:
-    case UNW_X86_XMM5_lo: case UNW_X86_XMM5_hi:
-    case UNW_X86_XMM6_lo: case UNW_X86_XMM6_hi:
-    case UNW_X86_XMM7_lo: case UNW_X86_XMM7_hi:
-      is_fpstate = 1;
-      off = LINUX_FPSTATE_XMM0_OFF + 8*(reg - UNW_X86_XMM0_lo);
-      break;
-    case UNW_X86_XMM0:
-    case UNW_X86_XMM1:
-    case UNW_X86_XMM2:
-    case UNW_X86_XMM3:
-    case UNW_X86_XMM4:
-    case UNW_X86_XMM5:
-    case UNW_X86_XMM6:
-    case UNW_X86_XMM7:
-      is_fpstate = 1;
-      off = LINUX_FPSTATE_XMM0_OFF + 16*(reg - UNW_X86_XMM0);
-      break;
-
-    case UNW_X86_FOP:
-    case UNW_X86_TSS:
-    case UNW_X86_LDT:
-    default:
-      return DWARF_REG_LOC (&c->dwarf, reg);
-    }
-
-  if (is_fpstate)
-    {
-      if ((ret = dwarf_get (&c->dwarf,
-			    DWARF_MEM_LOC (&c->dwarf,
-					   addr + LINUX_SC_FPSTATE_OFF),
-			    &fpstate_addr)) < 0)
-	return DWARF_NULL_LOC;
-
-      if (!fpstate_addr)
-	return DWARF_NULL_LOC;
-
-      return DWARF_MEM_LOC (c, fpstate_addr + off);
-    }
-  else
-    return DWARF_MEM_LOC (c, addr + off);
-}
-
 HIDDEN dwarf_loc_t
 x86_scratch_loc (struct cursor *c, unw_regnum_t reg)
 {
   if (c->sigcontext_addr)
-    return linux_scratch_loc (c, reg);
+    return x86_get_scratch_loc (c, reg);
   else
     return DWARF_REG_LOC (&c->dwarf, reg);
 }
 
 HIDDEN int
 tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
-		 int write)
+                 int write)
 {
   dwarf_loc_t loc = DWARF_NULL_LOC;
   unsigned int mask;
@@ -155,14 +48,14 @@ tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
 
     case UNW_X86_EIP:
       if (write)
-	c->dwarf.ip = *valp;		/* also update the EIP cache */
+        c->dwarf.ip = *valp;            /* also update the EIP cache */
       loc = c->dwarf.loc[EIP];
       break;
 
     case UNW_X86_CFA:
     case UNW_X86_ESP:
       if (write)
-	return -UNW_EREADONLYREG;
+        return -UNW_EREADONLYREG;
       *valp = c->dwarf.cfa;
       return 0;
 
@@ -171,18 +64,18 @@ tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
       arg_num = reg - UNW_X86_EAX;
       mask = (1 << arg_num);
       if (write)
-	{
-	  c->dwarf.eh_args[arg_num] = *valp;
-	  c->dwarf.eh_valid_mask |= mask;
-	  return 0;
-	}
+        {
+          c->dwarf.eh_args[arg_num] = *valp;
+          c->dwarf.eh_valid_mask |= mask;
+          return 0;
+        }
       else if ((c->dwarf.eh_valid_mask & mask) != 0)
-	{
-	  *valp = c->dwarf.eh_args[arg_num];
-	  return 0;
-	}
+        {
+          *valp = c->dwarf.eh_args[arg_num];
+          return 0;
+        }
       else
-	loc = c->dwarf.loc[(reg == UNW_X86_EAX) ? EAX : EDX];
+        loc = c->dwarf.loc[(reg == UNW_X86_EAX) ? EAX : EDX];
       break;
 
     case UNW_X86_ECX: loc = c->dwarf.loc[ECX]; break;
@@ -227,7 +120,7 @@ tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
 
 HIDDEN int
 tdep_access_fpreg (struct cursor *c, unw_regnum_t reg, unw_fpreg_t *valp,
-		   int write)
+                   int write)
 {
   struct dwarf_loc loc = DWARF_NULL_LOC;
 
diff --git a/frysk-imports/libunwind/src/x86/Gresume.c b/frysk-imports/libunwind/src/x86/Gresume.c
index 6ea9346..cb3fb31 100644
--- a/frysk-imports/libunwind/src/x86/Gresume.c
+++ b/frysk-imports/libunwind/src/x86/Gresume.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (c) 2002-2004 Hewlett-Packard Development Company, L.P.
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -26,41 +26,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #include <stdlib.h>
 
 #include "unwind_i.h"
-
-#ifndef UNW_REMOTE_ONLY
-
-HIDDEN inline int
-x86_local_resume (unw_addr_space_t as, unw_cursor_t *cursor, void *arg)
-{
-#if defined(__linux)
-  struct cursor *c = (struct cursor *) cursor;
-  ucontext_t *uc = c->dwarf.as_arg;
-
-  /* Ensure c->pi is up-to-date.  On x86, it's relatively common to be
-     missing DWARF unwind info.  We don't want to fail in that case,
-     because the frame-chain still would let us do a backtrace at
-     least.  */
-  dwarf_make_proc_info (&c->dwarf);
-
-  if (unlikely (c->sigcontext_format != X86_SCF_NONE))
-    {
-      struct sigcontext *sc = (struct sigcontext *) c->sigcontext_addr;
-
-      Debug (8, "resuming at ip=%x via sigreturn(%p)\n", c->dwarf.ip, sc);
-      sigreturn (sc);
-    }
-  else
-    {
-      Debug (8, "resuming at ip=%x via setcontext()\n", c->dwarf.ip);
-      setcontext (uc);
-    }
-#else
-# warning Implement me!
-#endif
-  return -UNW_EINVAL;
-}
-
-#endif /* !UNW_REMOTE_ONLY */
+#include "offsets.h"
 
 /* This routine is responsible for copying the register values in
    cursor C and establishing them as the current machine state. */
@@ -69,9 +35,9 @@ static inline int
 establish_machine_state (struct cursor *c)
 {
   int (*access_reg) (unw_addr_space_t, unw_regnum_t, unw_word_t *,
-		     int write, void *);
+                     int write, void *);
   int (*access_fpreg) (unw_addr_space_t, unw_regnum_t, unw_fpreg_t *,
-		       int write, void *);
+                       int write, void *);
   unw_addr_space_t as = c->dwarf.as;
   void *arg = c->dwarf.as_arg;
   unw_fpreg_t fpval;
@@ -87,15 +53,15 @@ establish_machine_state (struct cursor *c)
     {
       Debug (16, "copying %s %d\n", unw_regname (reg), reg);
       if (unw_is_fpreg (reg))
-	{
-	  if (tdep_access_fpreg (c, reg, &fpval, 0) >= 0)
-	    (*access_fpreg) (as, reg, &fpval, 1, arg);
-	}
+        {
+          if (tdep_access_fpreg (c, reg, &fpval, 0) >= 0)
+            (*access_fpreg) (as, reg, &fpval, 1, arg);
+        }
       else
-	{
-	  if (tdep_access_reg (c, reg, &val, 0) >= 0)
-	    (*access_reg) (as, reg, &val, 1, arg);
-	}
+        {
+          if (tdep_access_reg (c, reg, &val, 0) >= 0)
+            (*access_reg) (as, reg, &val, 1, arg);
+        }
     }
   return 0;
 }
@@ -112,5 +78,5 @@ unw_resume (unw_cursor_t *cursor)
     return ret;
 
   return (*c->dwarf.as->acc.resume) (c->dwarf.as, (unw_cursor_t *) c,
-				     c->dwarf.as_arg);
+                                     c->dwarf.as_arg);
 }
diff --git a/frysk-imports/libunwind/src/x86/Gstep.c b/frysk-imports/libunwind/src/x86/Gstep.c
index c9083cb..10e2cbc 100644
--- a/frysk-imports/libunwind/src/x86/Gstep.c
+++ b/frysk-imports/libunwind/src/x86/Gstep.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2002-2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -26,301 +26,90 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #include "unwind_i.h"
 #include "offsets.h"
 
-/* Try to skip single-word (4 bytes) return address on stack left there in some
-   cases of the signal frame.
-   We cannot rely on the `UC_MCONTEXT_GREGS_ERR_ID_BIT' bit as in the x86_64 case
-   as this bit is not present if no execute-disable feature is present/used.
-   	http://www.intel.com/design/processor/manuals/253668.pdf
-   	page 5-55 (235/642)
-   If we detect `ip' points to `cr2' (we should execute at the address causing
-   the fault) we can pop the real `ip' from the stack instead.
-   If it is not detectable we would need to keep the return
-   address on stack and improve the code path
-   	dwarf_step() failed (ret=%d), trying frame-chain
-   below to disassemble the return address and not to pop two words
-   automatically as no stack frame pointer is present in these cases there:
-   	./test-ptrace-signull code_entry_point: err=0x4 || 0x14
-   	./test-ptrace-signull code_descriptor:  err=0x5 || 0x15  */
-
-static int
-code_descriptor_trap (struct cursor *c, struct dwarf_loc *eip_loc_pointer)
-{
-  unw_word_t trapno, cr2;
-  int i;
-
-  if (c->sigcontext_format == X86_SCF_NONE)
-    return -UNW_EBADFRAME;
-
-  i = dwarf_get (&c->dwarf, DWARF_LOC (c->sigcontext_addr + LINUX_SC_TRAPNO_OFF, 0), &trapno);
-  if (i < 0)
-    {
-      Debug (2, "failed to query [sigframe:trapno]; %d\n", i);
-      return i;
-    }
-  /* page fault */
-  if (trapno != LINUX_SC_TRAPNO_PF)
-    {
-      Debug (2, "[sigframe:trapno] %d not Page-Fault Exception\n", (int) trapno);
-      return -UNW_EBADFRAME;
-    }
-
-  i = dwarf_get (&c->dwarf, DWARF_LOC (c->sigcontext_addr + LINUX_SC_CR2_OFF, 0), &cr2);
-  if (i < 0)
-    {
-      Debug (2, "failed to query [sigframe:cr2]; %d\n", i);
-      return i;
-    }
-  if (cr2 != c->dwarf.ip)
-    {
-      Debug (2, "[sigframe:cr2] 0x%x not equal to ip 0x%x\n",
-	     (int) cr2, (int) c->dwarf.ip);
-      return -UNW_EBADFRAME;
-    }
-
-  Debug (1, "[sigframe] Page-Fault Exception, instruction fetch (cr2 = 0x%x)\n", (int) cr2);
-
-  *eip_loc_pointer = DWARF_LOC (c->dwarf.cfa, 0);
-  c->dwarf.cfa += 4;
-
-  return 1;
-}
-
-// A CALL instruction starts with 0xFF.
-static int
-is_call_instr_at (struct cursor *c, unw_word_t addr)
-{
-  int ret;
-  unw_word_t instr;
-  ret = dwarf_get (&c->dwarf, DWARF_LOC (addr, 0), &instr);
-  return ret >= 0 && ((instr & 0xff000000) == 0xff000000);
-}
-
-// Checks whether this looks like a plt entry like cursor and returns
-// the stack offset where the return address can be found, or -1 if
-// not detected (also tries to make sure this is the inner most frame).
-// When this function returns positively (zero included) addr will
-// contain the return address.
-static int
-init_stack_based_ret (struct cursor *c, unw_word_t *addr)
-{
-  // See if this looks "clean", everything in actual registers
-  // which indicates this is most likely an inner most frame just
-  // initted.
-  int ret;
-  unw_word_t ip, cfa;
-  ret = dwarf_get (&c->dwarf, c->dwarf.loc[EIP], &ip);
-  if (ret < 0)
-    return ret;
-
-  ret = dwarf_get (&c->dwarf, c->dwarf.loc[ESP], &cfa);
-  if (ret < 0)
-    return ret;
-  
-  if (c->sigcontext_format == X86_SCF_NONE
-      && DWARF_IS_REG_LOC(c->dwarf.loc[EAX])
-      && DWARF_IS_REG_LOC(c->dwarf.loc[ECX])
-      && DWARF_IS_REG_LOC(c->dwarf.loc[EDX])
-      && DWARF_IS_REG_LOC(c->dwarf.loc[EBX])
-      && DWARF_IS_REG_LOC(c->dwarf.loc[ESP])
-      && DWARF_IS_REG_LOC(c->dwarf.loc[EBP])
-      && DWARF_IS_REG_LOC(c->dwarf.loc[ESI])
-      && DWARF_IS_REG_LOC(c->dwarf.loc[EDI])
-      && DWARF_IS_REG_LOC(c->dwarf.loc[EIP])
-      && DWARF_IS_REG_LOC(c->dwarf.loc[EFLAGS])
-      && DWARF_IS_REG_LOC(c->dwarf.loc[TRAPNO])
-      && ip == c->dwarf.ip && cfa == c->dwarf.cfa)
-    {
-      // See if one of the top 3 elements on the stack contains a
-      // return address.
-      int i;
-      for (i = 0; i <= 8; i += 4)
-	{
-	  // fprintf(stderr, "trying %d\n", i);
-	  ret = dwarf_get (&c->dwarf, DWARF_LOC (c->dwarf.cfa + i, 0), addr);
-	  if (ret < 0)
-	    return ret;
-
-	  // fprintf(stderr, "addr at %d: 0x%x\n", i, *addr);
-	  // Sanity check the address, not too low, and must
-	  // come from a call instruction.
-	  if (*addr > 0 && is_call_instr_at(c, (*addr) - 5))
-	    return i;
-	}
-    }
-
-  return -1;
-}
-
 PROTECTED int
 unw_step (unw_cursor_t *cursor)
 {
   struct cursor *c = (struct cursor *) cursor;
   int ret, i;
-  struct dwarf_loc eip_loc;
-  int eip_loc_set = 0;
-  unw_word_t addr;
 
   Debug (1, "(cursor=%p, ip=0x%08x)\n", c, (unsigned) c->dwarf.ip);
 
   /* Try DWARF-based unwinding... */
   ret = dwarf_step (&c->dwarf);
 
-  /* Skip the faulty address left alone on the stack.  */
-  if (ret >= 0 && code_descriptor_trap (c, &eip_loc) > 0)
-    eip_loc_set = 1;
-
   if (ret < 0 && ret != -UNW_ENOINFO)
     {
       Debug (2, "returning %d\n", ret);
       return ret;
     }
 
-  if (c->sigcontext_format == X86_SCF_LINUX_SIGFRAME)
-    {
-      unw_word_t trapno, err, cr2;
-      int trapno_ret, err_ret, cr2_ret;
-
-      trapno_ret = dwarf_get (&c->dwarf, DWARF_LOC (c->sigcontext_addr + LINUX_SC_TRAPNO_OFF, 0), &trapno);
-      err_ret = dwarf_get (&c->dwarf, DWARF_LOC (c->sigcontext_addr + LINUX_SC_ERR_OFF, 0), &err);
-      cr2_ret = dwarf_get (&c->dwarf, DWARF_LOC (c->sigcontext_addr + LINUX_SC_CR2_OFF, 0), &cr2);
-
-      Debug (2, "x86 sigcontext (post-step): CFA = 0x%lx, trapno = %d, err = 0x%x, cr2 = 0x%x\n",
-	     (unsigned long) c->dwarf.cfa, (trapno_ret < 0 ? -1 : (int) trapno),
-	     (err_ret < 0 ? -1 : (int) err), (cr2_ret < 0 ? -1 : (int) cr2));
-    }
-
   if (unlikely (ret < 0))
     {
       /* DWARF failed, let's see if we can follow the frame-chain
-	 or skip over the signal trampoline.  */
+         or skip over the signal trampoline.  */
+      struct dwarf_loc ebp_loc, eip_loc;
+
+      /* We could get here because of missing/bad unwind information.
+         Validate all addresses before dereferencing. */
+      c->validate = 1;
 
       Debug (13, "dwarf_step() failed (ret=%d), trying frame-chain\n", ret);
 
-      if (c->dwarf.ip == 0)
+      if (unw_is_signal_frame (cursor))
         {
-	  Debug (13, "[EIP=0]\n");
-
-	  eip_loc = DWARF_LOC (c->dwarf.cfa, 0);
-	  c->dwarf.cfa += 4;
-	}
-      else if (unw_is_signal_frame (cursor) > 0)
-	{
-	  /* XXX This code is Linux-specific! */
-
-	  Debug (13, "Unwinding as non-CFI signal frame\n");
-
-	  /* c->esp points at the arguments to the handler.  Without
-	     SA_SIGINFO, the arguments consist of a signal number
-	     followed by a struct sigcontext.  With SA_SIGINFO, the
-	     arguments consist a signal number, a siginfo *, and a
-	     ucontext *. */
-	  unw_word_t sc_addr;
-	  unw_word_t siginfo_ptr_addr = c->dwarf.cfa + 4;
-	  unw_word_t sigcontext_ptr_addr = c->dwarf.cfa + 8;
-	  unw_word_t siginfo_ptr, sigcontext_ptr;
-	  struct dwarf_loc esp_loc, siginfo_ptr_loc, sigcontext_ptr_loc;
-
-	  siginfo_ptr_loc = DWARF_LOC (siginfo_ptr_addr, 0);
-	  sigcontext_ptr_loc = DWARF_LOC (sigcontext_ptr_addr, 0);
-	  ret = (dwarf_get (&c->dwarf, siginfo_ptr_loc, &siginfo_ptr)
-		 | dwarf_get (&c->dwarf, sigcontext_ptr_loc, &sigcontext_ptr));
-	  if (ret < 0)
-	    {
-	      Debug (2, "returning 0\n");
-	      return 0;
-	    }
-	  if (siginfo_ptr < c->dwarf.cfa
-	      || siginfo_ptr > c->dwarf.cfa + 256
-	      || sigcontext_ptr < c->dwarf.cfa
-	      || sigcontext_ptr > c->dwarf.cfa + 256)
-	    {
-	      /* Not plausible for SA_SIGINFO signal */
-	      c->sigcontext_format = X86_SCF_LINUX_SIGFRAME;
-	      c->sigcontext_addr = sc_addr = c->dwarf.cfa + 4;
-	    }
-	  else
-	    {
-	      /* If SA_SIGINFO were not specified, we actually read
-		 various segment pointers instead.  We believe that at
-		 least fs and _fsh are always zero for linux, so it is
-		 not just unlikely, but impossible that we would end
-		 up here. */
-	      c->sigcontext_format = X86_SCF_LINUX_RT_SIGFRAME;
-	      c->sigcontext_addr = sigcontext_ptr;
-	      sc_addr = sigcontext_ptr + LINUX_UC_MCONTEXT_OFF;
-	    }
-	  esp_loc = DWARF_LOC (sc_addr + LINUX_SC_ESP_OFF, 0);
-	  eip_loc = DWARF_LOC (sc_addr + LINUX_SC_EIP_OFF, 0);
-	  ret = dwarf_get (&c->dwarf, esp_loc, &c->dwarf.cfa);
-	  if (ret < 0)
-	    {
-	      Debug (2, "returning 0\n");
-	      return 0;
-	    }
-
-	  c->dwarf.loc[EAX] = DWARF_LOC (sc_addr + LINUX_SC_EAX_OFF, 0);
-	  c->dwarf.loc[ECX] = DWARF_LOC (sc_addr + LINUX_SC_ECX_OFF, 0);
-	  c->dwarf.loc[EDX] = DWARF_LOC (sc_addr + LINUX_SC_EDX_OFF, 0);
-	  c->dwarf.loc[EBX] = DWARF_LOC (sc_addr + LINUX_SC_EBX_OFF, 0);
-	  c->dwarf.loc[EBP] = DWARF_LOC (sc_addr + LINUX_SC_EBP_OFF, 0);
-	  c->dwarf.loc[ESI] = DWARF_LOC (sc_addr + LINUX_SC_ESI_OFF, 0);
-	  c->dwarf.loc[EDI] = DWARF_LOC (sc_addr + LINUX_SC_EDI_OFF, 0);
-	  c->dwarf.loc[EFLAGS] = DWARF_NULL_LOC;
-	  c->dwarf.loc[TRAPNO] = DWARF_NULL_LOC;
-	  c->dwarf.loc[ST0] = DWARF_NULL_LOC;
-	}
-      else if((ret = init_stack_based_ret(c, &addr)) >= 0)
-	{
-	  // fprintf(stderr, "init_stack_based_ret() %d (0x%x)\n", ret, addr);
-	  c->dwarf.cfa += ret;
-	  c->dwarf.loc[ESP] = DWARF_LOC (c->dwarf.cfa, 0);
-	  c->dwarf.loc[EIP] = DWARF_LOC (addr, 0);
-	  c->dwarf.ret_addr_column = EIP;
-	  c->dwarf.ip = addr;
-	  return 1;
-	}
+          ret = unw_handle_signal_frame(cursor);
+          if (ret < 0)
+            {
+              Debug (2, "returning 0\n");
+              return 0;
+            }
+        }
       else
-	{
-	  ret = dwarf_get (&c->dwarf, c->dwarf.loc[EBP], &c->dwarf.cfa);
-	  if (ret < 0)
-	    {
-	      Debug (2, "returning %d\n", ret);
-	      return ret;
-	    }
-
-	  Debug (13, "[EBP=0x%x] = 0x%x\n", DWARF_GET_LOC (c->dwarf.loc[EBP]),
-		 c->dwarf.cfa);
-
-	  /* Mark all registers unsaved, since we don't know where
-	     they are saved (if at all), except for the EBP and
-	     EIP.  */
-	  for (i = 0; i < DWARF_NUM_PRESERVED_REGS; ++i)
-	    c->dwarf.loc[i] = DWARF_NULL_LOC;
-
-	  c->dwarf.loc[EBP] = DWARF_LOC (c->dwarf.cfa, 0);
-	  eip_loc = DWARF_LOC (c->dwarf.cfa + 4, 0);
-	  c->dwarf.cfa += 8;
-	}
-      eip_loc_set = 1;
-    }
-  if (eip_loc_set)
-    {
-      c->dwarf.loc[EIP] = eip_loc;
+        {
+          ret = dwarf_get (&c->dwarf, c->dwarf.loc[EBP], &c->dwarf.cfa);
+          if (ret < 0)
+            {
+              Debug (2, "returning %d\n", ret);
+              return ret;
+            }
+
+          Debug (13, "[EBP=0x%x] = 0x%x\n", DWARF_GET_LOC (c->dwarf.loc[EBP]),
+                 c->dwarf.cfa);
+
+          ebp_loc = DWARF_LOC (c->dwarf.cfa, 0);
+          eip_loc = DWARF_LOC (c->dwarf.cfa + 4, 0);
+          c->dwarf.cfa += 8;
+
+          /* Mark all registers unsaved, since we don't know where
+             they are saved (if at all), except for the EBP and
+             EIP.  */
+          for (i = 0; i < DWARF_NUM_PRESERVED_REGS; ++i)
+            c->dwarf.loc[i] = DWARF_NULL_LOC;
+
+          c->dwarf.loc[EBP] = ebp_loc;
+          c->dwarf.loc[EIP] = eip_loc;
+          c->dwarf.use_prev_instr = 1;
+        }
       c->dwarf.ret_addr_column = EIP;
 
       if (!DWARF_IS_NULL_LOC (c->dwarf.loc[EBP]))
-	{
-	  ret = dwarf_get (&c->dwarf, c->dwarf.loc[EIP], &c->dwarf.ip);
-	  if (ret < 0)
-	    {
-	      Debug (2, "returning %d\n", ret);
-	      return ret;
-	    }
-	}
+        {
+          ret = dwarf_get (&c->dwarf, c->dwarf.loc[EIP], &c->dwarf.ip);
+          if (ret < 0)
+            {
+              Debug (13, "dwarf_get([EIP=0x%x]) failed\n", DWARF_GET_LOC (c->dwarf.loc[EIP]));
+              Debug (2, "returning %d\n", ret);
+              return ret;
+            }
+          else
+            {
+              Debug (13, "[EIP=0x%x] = 0x%x\n", DWARF_GET_LOC (c->dwarf.loc[EIP]),
+                c->dwarf.ip);
+            }
+        }
       else
-	c->dwarf.ip = 0;
+        c->dwarf.ip = 0;
     }
-
   ret = (c->dwarf.ip == 0) ? 0 : 1;
   Debug (2, "returning %d\n", ret);
   return ret;
diff --git a/frysk-imports/libunwind/src/x86/Lfetch_proc_info_post.c b/frysk-imports/libunwind/src/x86/Lfetch_proc_info_post.c
deleted file mode 100644
index c88239c..0000000
--- a/frysk-imports/libunwind/src/x86/Lfetch_proc_info_post.c
+++ /dev/null
@@ -1,5 +0,0 @@
-#define UNW_LOCAL_ONLY
-#include <libunwind.h>
-#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
-#include "Gfetch_proc_info_post.c"
-#endif
diff --git a/frysk-imports/libunwind/src/x86/Lis_signal_frame.c b/frysk-imports/libunwind/src/x86/Lis_signal_frame.c
deleted file mode 100644
index b9a7c4f..0000000
--- a/frysk-imports/libunwind/src/x86/Lis_signal_frame.c
+++ /dev/null
@@ -1,5 +0,0 @@
-#define UNW_LOCAL_ONLY
-#include <libunwind.h>
-#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
-#include "Gis_signal_frame.c"
-#endif
diff --git a/frysk-imports/libunwind/src/x86/Los-freebsd.c b/frysk-imports/libunwind/src/x86/Los-freebsd.c
new file mode 100644
index 0000000..a75a205
--- /dev/null
+++ b/frysk-imports/libunwind/src/x86/Los-freebsd.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Gos-freebsd.c"
+#endif
diff --git a/frysk-imports/libunwind/src/x86/Los-linux.c b/frysk-imports/libunwind/src/x86/Los-linux.c
new file mode 100644
index 0000000..3cc18aa
--- /dev/null
+++ b/frysk-imports/libunwind/src/x86/Los-linux.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Gos-linux.c"
+#endif
diff --git a/frysk-imports/libunwind/src/x86/getcontext-freebsd.S b/frysk-imports/libunwind/src/x86/getcontext-freebsd.S
new file mode 100644
index 0000000..670eff1
--- /dev/null
+++ b/frysk-imports/libunwind/src/x86/getcontext-freebsd.S
@@ -0,0 +1,112 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2010 Konstantin Belousov <kib@freebsd.org>
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "offsets.h"
+
+	.global _Ux86_getcontext
+	.type _Ux86_getcontext, @function
+_Ux86_getcontext:
+	.cfi_startproc
+	pushl	%eax
+	.cfi_adjust_cfa_offset 4
+	mov	8(%esp),%eax  /* ucontext_t* */
+	popl	FREEBSD_UC_MCONTEXT_EAX_OFF(%eax)
+	.cfi_adjust_cfa_offset 4
+	movl	%ebx, FREEBSD_UC_MCONTEXT_EBX_OFF(%eax)
+	movl	%ecx, FREEBSD_UC_MCONTEXT_ECX_OFF(%eax)
+	movl	%edx, FREEBSD_UC_MCONTEXT_EDX_OFF(%eax)
+	movl	%edi, FREEBSD_UC_MCONTEXT_EDI_OFF(%eax)
+	movl	%esi, FREEBSD_UC_MCONTEXT_ESI_OFF(%eax)
+	movl	%ebp, FREEBSD_UC_MCONTEXT_EBP_OFF(%eax)
+
+	movl	(%esp), %ecx
+	movl	%ecx, FREEBSD_UC_MCONTEXT_EIP_OFF(%eax)
+
+	leal	4(%esp), %ecx		/* Exclude the return address.  */
+	movl	%ecx, FREEBSD_UC_MCONTEXT_ESP_OFF(%eax)
+
+	xorl	%ecx, %ecx
+	movw	%fs, %cx
+	movl	%ecx, FREEBSD_UC_MCONTEXT_FS_OFF(%eax)
+	movw	%gs, %cx
+	movl	%ecx, FREEBSD_UC_MCONTEXT_GS_OFF(%eax)
+	movw	%ds, %cx
+	movl	%ecx, FREEBSD_UC_MCONTEXT_DS_OFF(%eax)
+	movw	%es, %cx
+	movl	%ecx, FREEBSD_UC_MCONTEXT_ES_OFF(%eax)
+	movw	%ss, %cx
+	movl	%ecx, FREEBSD_UC_MCONTEXT_SS_OFF(%eax)
+	movw	%cs, %cx
+	movl	%ecx, FREEBSD_UC_MCONTEXT_CS_OFF(%eax)
+
+	pushfl
+	.cfi_adjust_cfa_offset 4
+	popl	FREEBSD_UC_MCONTEXT_EFLAGS_OFF(%eax)
+	.cfi_adjust_cfa_offset -4
+
+	movl	$0, FREEBSD_UC_MCONTEXT_TRAPNO_OFF(%eax)
+
+	movl	$FREEBSD_UC_MCONTEXT_FPOWNED_FPU,\
+		FREEBSD_UC_MCONTEXT_OWNEDFP_OFF(%eax)
+	movl	$FREEBSD_UC_MCONTEXT_FPFMT_XMM,\
+		FREEBSD_UC_MCONTEXT_FPFORMAT_OFF(%eax)
+
+       /*
+	* Require CPU with fxsave implemented, and enabled by OS.
+	*
+	* If passed ucontext is not aligned to 16-byte boundary,
+	* save fpu context into temporary aligned location on stack
+	* and then copy.
+	*/
+	leal	FREEBSD_UC_MCONTEXT_FPSTATE_OFF(%eax), %edx
+	testl	$0xf, %edx
+	jne	2f
+	fxsave	(%edx)	/* fast path, passed ucontext save area was aligned */
+1:	movl	$FREEBSD_UC_MCONTEXT_MC_LEN_VAL,\
+		FREEBSD_UC_MCONTEXT_MC_LEN_OFF(%eax)
+
+	xorl	%eax, %eax
+	ret
+
+2:	movl	%edx, %edi	/* not aligned, do the dance */
+	subl	$512 + 16, %esp	/* save area and 16 bytes for alignment */
+	.cfi_adjust_cfa_offset 512 + 16
+	movl	%esp, %edx
+	orl	$0xf, %edx	/* align *%edx to 16-byte up */
+	incl	%edx
+	fxsave	(%edx)
+	movl	%edx, %esi	/* copy to the final destination */
+	movl	$512/4,%ecx
+	rep; movsl
+	addl	$512 + 16, %esp	/* restore the stack */
+	.cfi_adjust_cfa_offset -512 - 16
+	movl	FREEBSD_UC_MCONTEXT_ESI_OFF(%eax), %esi
+	movl	FREEBSD_UC_MCONTEXT_EDI_OFF(%eax), %edi
+	jmp	1b
+
+	.cfi_endproc
+	.size	_Ux86_getcontext, . - _Ux86_getcontext
+
+	/* We do not need executable stack.  */
+	.section        .note.GNU-stack,"",@progbits
diff --git a/frysk-imports/libunwind/src/x86/getcontext-linux.S b/frysk-imports/libunwind/src/x86/getcontext-linux.S
new file mode 100644
index 0000000..c469dad
--- /dev/null
+++ b/frysk-imports/libunwind/src/x86/getcontext-linux.S
@@ -0,0 +1,74 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2009 Google, Inc
+	Contributed by Paul Pluzhnikov <ppluzhnikov@google.com>
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "offsets.h"
+
+/*  int _Ux86_getcontext (ucontext_t *ucp)
+
+  Saves the machine context in UCP necessary for libunwind.
+  Unlike the libc implementation, we don't save the signal mask
+  and hence avoid the cost of a system call per unwind.
+
+*/
+
+	.global _Ux86_getcontext
+	.type _Ux86_getcontext, @function
+_Ux86_getcontext:
+	.cfi_startproc
+	mov	4(%esp),%eax  /* ucontext_t* */
+
+	/* EAX is not preserved. */
+	movl	$0, (LINUX_UC_MCONTEXT_OFF+LINUX_SC_EAX_OFF)(%eax)
+
+	movl	%ebx, (LINUX_UC_MCONTEXT_OFF+LINUX_SC_EBX_OFF)(%eax)
+	movl	%ecx, (LINUX_UC_MCONTEXT_OFF+LINUX_SC_ECX_OFF)(%eax)
+	movl	%edx, (LINUX_UC_MCONTEXT_OFF+LINUX_SC_EDX_OFF)(%eax)
+	movl	%edi, (LINUX_UC_MCONTEXT_OFF+LINUX_SC_EDI_OFF)(%eax)
+	movl	%esi, (LINUX_UC_MCONTEXT_OFF+LINUX_SC_ESI_OFF)(%eax)
+	movl	%ebp, (LINUX_UC_MCONTEXT_OFF+LINUX_SC_EBP_OFF)(%eax)
+
+	movl	(%esp), %ecx
+	movl	%ecx, (LINUX_UC_MCONTEXT_OFF+LINUX_SC_EIP_OFF)(%eax)
+
+	leal	4(%esp), %ecx		/* Exclude the return address.  */
+	movl	%ecx, (LINUX_UC_MCONTEXT_OFF+LINUX_SC_ESP_OFF)(%eax)
+
+	/* glibc getcontext saves FS, but not GS */
+	xorl	%ecx, %ecx
+	movw	%fs, %cx
+	movl	%ecx, (LINUX_UC_MCONTEXT_OFF+LINUX_SC_FS_OFF)(%eax)
+
+	leal	LINUX_UC_FPREGS_MEM_OFF(%eax), %ecx
+	movl	%ecx, (LINUX_UC_MCONTEXT_OFF+LINUX_SC_FPSTATE_OFF)(%eax)
+	fnstenv	(%ecx)
+	fldenv	(%ecx)
+
+	xor	%eax, %eax
+	ret
+	.cfi_endproc
+	.size	_Ux86_getcontext, . - _Ux86_getcontext
+
+	/* We do not need executable stack.  */
+	.section        .note.GNU-stack,"",@progbits
diff --git a/frysk-imports/libunwind/src/x86/init.h b/frysk-imports/libunwind/src/x86/init.h
index de97f5e..027aedc 100644
--- a/frysk-imports/libunwind/src/x86/init.h
+++ b/frysk-imports/libunwind/src/x86/init.h
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2002 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -26,7 +26,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #include "unwind_i.h"
 
 static inline int
-common_init (struct cursor *c)
+common_init (struct cursor *c, unsigned use_prev_instr)
 {
   int ret, i;
 
@@ -50,16 +50,17 @@ common_init (struct cursor *c)
     return ret;
 
   ret = dwarf_get (&c->dwarf, DWARF_REG_LOC (&c->dwarf, UNW_X86_ESP),
-		   &c->dwarf.cfa);
+                   &c->dwarf.cfa);
   if (ret < 0)
     return ret;
 
   c->sigcontext_format = X86_SCF_NONE;
   c->sigcontext_addr = 0;
 
-  c->dwarf.decrease_ip = 0;
   c->dwarf.args_size = 0;
   c->dwarf.ret_addr_column = 0;
+  c->dwarf.stash_frames = 0;
+  c->dwarf.use_prev_instr = use_prev_instr;
   c->dwarf.pi_valid = 0;
   c->dwarf.pi_is_dynamic = 0;
   c->dwarf.hint = 0;
diff --git a/frysk-imports/libunwind/src/x86/is_fpreg.c b/frysk-imports/libunwind/src/x86/is_fpreg.c
index 8f1536d..addf9bc 100644
--- a/frysk-imports/libunwind/src/x86/is_fpreg.c
+++ b/frysk-imports/libunwind/src/x86/is_fpreg.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (c) 2004-2005 Hewlett-Packard Development Company, L.P.
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -29,6 +29,6 @@ PROTECTED int
 unw_is_fpreg (int regnum)
 {
   return ((regnum >= UNW_X86_ST0 && regnum <= UNW_X86_ST7)
-	  || (regnum >= UNW_X86_XMM0_lo && regnum <= UNW_X86_XMM7_hi)
-	  || (regnum >= UNW_X86_XMM0 && regnum <= UNW_X86_XMM7));
+          || (regnum >= UNW_X86_XMM0_lo && regnum <= UNW_X86_XMM7_hi)
+          || (regnum >= UNW_X86_XMM0 && regnum <= UNW_X86_XMM7));
 }
diff --git a/frysk-imports/libunwind/src/x86/longjmp.S b/frysk-imports/libunwind/src/x86/longjmp.S
index a89139d..05173d0 100644
--- a/frysk-imports/libunwind/src/x86/longjmp.S
+++ b/frysk-imports/libunwind/src/x86/longjmp.S
@@ -35,7 +35,5 @@ _UI_longjmp_cont:
 	ret
 	.cfi_endproc
 	.size _UI_siglongjmp_cont, .-_UI_longjmp_cont
-#ifdef __linux__
 	/* We do not need executable stack.  */
 	.section	.note.GNU-stack,"",@progbits
-#endif
diff --git a/frysk-imports/libunwind/src/x86/offsets.h b/frysk-imports/libunwind/src/x86/offsets.h
index 371103b..e5aec7f 100644
--- a/frysk-imports/libunwind/src/x86/offsets.h
+++ b/frysk-imports/libunwind/src/x86/offsets.h
@@ -4,82 +4,137 @@
 
 /* Offsets for x86 Linux "ucontext_t":  */
 
-#define LINUX_UC_FLAGS_OFF	0x00
-#define LINUX_UC_LINK_OFF	0x04
-#define LINUX_UC_STACK_OFF	0x08
-#define LINUX_UC_MCONTEXT_OFF	0x14
-#define LINUX_UC_SIGMASK_OFF	0x6c
+#define LINUX_UC_FLAGS_OFF      0x00
+#define LINUX_UC_LINK_OFF       0x04
+#define LINUX_UC_STACK_OFF      0x08
+#define LINUX_UC_MCONTEXT_OFF   0x14
+#define LINUX_UC_SIGMASK_OFF    0x6c
+#define LINUX_UC_FPREGS_MEM_OFF 0xec
 
 /* The struct sigcontext is located at an offset of 4
    from the stack pointer in the signal frame.         */
 
 /* Offsets for x86 Linux "struct sigcontext":  */
 
-#define LINUX_SC_GS_OFF		0x00
-#define LINUX_SC_GSH_OFF	0x02
-#define LINUX_SC_FS_OFF		0x04
-#define LINUX_SC_FSH_OFF	0x06
-#define LINUX_SC_ES_OFF		0x08
-#define LINUX_SC_ESH_OFF	0x0a
-#define LINUX_SC_DS_OFF		0x0c
-#define LINUX_SC_DSH_OFF	0x0e
-#define LINUX_SC_EDI_OFF	0x10
-#define LINUX_SC_ESI_OFF	0x14
-#define LINUX_SC_EBP_OFF	0x18
-#define LINUX_SC_ESP_OFF	0x1c
-#define LINUX_SC_EBX_OFF	0x20
-#define LINUX_SC_EDX_OFF	0x24
-#define LINUX_SC_ECX_OFF	0x28
-#define LINUX_SC_EAX_OFF	0x2c
-#define LINUX_SC_TRAPNO_OFF	0x30
-#define LINUX_SC_ERR_OFF	0x34
-#define LINUX_SC_EIP_OFF	0x38
-#define LINUX_SC_CS_OFF		0x3c
-#define LINUX_SC_CSH_OFF	0x3e
-#define LINUX_SC_EFLAGS_OFF	0x40
-#define LINUX_SC_ESP_AT_SIGNAL_OFF	0x44
-#define LINUX_SC_SS_OFF		0x48
-#define LINUX_SC_SSH_OFF	0x4a
-#define LINUX_SC_FPSTATE_OFF	0x4c
-#define LINUX_SC_OLDMASK_OFF	0x50
-#define LINUX_SC_CR2_OFF	0x54
-
-#define LINUX_SC_TRAPNO_PF	14	/* Page-Fault Exception */
+#define LINUX_SC_GS_OFF         0x00
+#define LINUX_SC_GSH_OFF        0x02
+#define LINUX_SC_FS_OFF         0x04
+#define LINUX_SC_FSH_OFF        0x06
+#define LINUX_SC_ES_OFF         0x08
+#define LINUX_SC_ESH_OFF        0x0a
+#define LINUX_SC_DS_OFF         0x0c
+#define LINUX_SC_DSH_OFF        0x0e
+#define LINUX_SC_EDI_OFF        0x10
+#define LINUX_SC_ESI_OFF        0x14
+#define LINUX_SC_EBP_OFF        0x18
+#define LINUX_SC_ESP_OFF        0x1c
+#define LINUX_SC_EBX_OFF        0x20
+#define LINUX_SC_EDX_OFF        0x24
+#define LINUX_SC_ECX_OFF        0x28
+#define LINUX_SC_EAX_OFF        0x2c
+#define LINUX_SC_TRAPNO_OFF     0x30
+#define LINUX_SC_ERR_OFF        0x34
+#define LINUX_SC_EIP_OFF        0x38
+#define LINUX_SC_CS_OFF         0x3c
+#define LINUX_SC_CSH_OFF        0x3e
+#define LINUX_SC_EFLAGS_OFF     0x40
+#define LINUX_SC_ESP_AT_SIGNAL_OFF      0x44
+#define LINUX_SC_SS_OFF         0x48
+#define LINUX_SC_SSH_OFF        0x4a
+#define LINUX_SC_FPSTATE_OFF    0x4c
+#define LINUX_SC_OLDMASK_OFF    0x50
+#define LINUX_SC_CR2_OFF        0x54
 
 /* Offsets for x86 Linux "struct _fpstate":  */
 
-#define LINUX_FPSTATE_CW_OFF		0x000
-#define LINUX_FPSTATE_SW_OFF		0x004
-#define LINUX_FPSTATE_TAG_OFF		0x008
-#define LINUX_FPSTATE_IPOFF_OFF		0x00c
-#define LINUX_FPSTATE_CSSEL_OFF		0x010
-#define LINUX_FPSTATE_DATAOFF_OFF	0x014
-#define LINUX_FPSTATE_DATASEL_OFF	0x018
-#define LINUX_FPSTATE_ST0_OFF		0x01c
-#define LINUX_FPSTATE_ST1_OFF		0x026
-#define LINUX_FPSTATE_ST2_OFF		0x030
-#define LINUX_FPSTATE_ST3_OFF		0x03a
-#define LINUX_FPSTATE_ST4_OFF		0x044
-#define LINUX_FPSTATE_ST5_OFF		0x04e
-#define LINUX_FPSTATE_ST6_OFF		0x058
-#define LINUX_FPSTATE_ST7_OFF		0x062
-#define LINUX_FPSTATE_STATUS_OFF	0x06c
-#define LINUX_FPSTATE_MAGIC_OFF		0x06e
-#define LINUX_FPSTATE_FXSR_ENV_OFF	0x070
-#define LINUX_FPSTATE_MXCSR_OFF		0x088
-#define LINUX_FPSTATE_FXSR_ST0_OFF	0x090
-#define LINUX_FPSTATE_FXSR_ST1_OFF	0x0a0
-#define LINUX_FPSTATE_FXSR_ST2_OFF	0x0b0
-#define LINUX_FPSTATE_FXSR_ST3_OFF	0x0c0
-#define LINUX_FPSTATE_FXSR_ST4_OFF	0x0d0
-#define LINUX_FPSTATE_FXSR_ST5_OFF	0x0e0
-#define LINUX_FPSTATE_FXSR_ST6_OFF	0x0f0
-#define LINUX_FPSTATE_FXSR_ST7_OFF	0x100
-#define LINUX_FPSTATE_XMM0_OFF		0x110
-#define LINUX_FPSTATE_XMM1_OFF		0x120
-#define LINUX_FPSTATE_XMM2_OFF		0x130
-#define LINUX_FPSTATE_XMM3_OFF		0x140
-#define LINUX_FPSTATE_XMM4_OFF		0x150
-#define LINUX_FPSTATE_XMM5_OFF		0x160
-#define LINUX_FPSTATE_XMM6_OFF		0x170
-#define LINUX_FPSTATE_XMM7_OFF		0x180
+#define LINUX_FPSTATE_CW_OFF            0x000
+#define LINUX_FPSTATE_SW_OFF            0x004
+#define LINUX_FPSTATE_TAG_OFF           0x008
+#define LINUX_FPSTATE_IPOFF_OFF         0x00c
+#define LINUX_FPSTATE_CSSEL_OFF         0x010
+#define LINUX_FPSTATE_DATAOFF_OFF       0x014
+#define LINUX_FPSTATE_DATASEL_OFF       0x018
+#define LINUX_FPSTATE_ST0_OFF           0x01c
+#define LINUX_FPSTATE_ST1_OFF           0x026
+#define LINUX_FPSTATE_ST2_OFF           0x030
+#define LINUX_FPSTATE_ST3_OFF           0x03a
+#define LINUX_FPSTATE_ST4_OFF           0x044
+#define LINUX_FPSTATE_ST5_OFF           0x04e
+#define LINUX_FPSTATE_ST6_OFF           0x058
+#define LINUX_FPSTATE_ST7_OFF           0x062
+#define LINUX_FPSTATE_STATUS_OFF        0x06c
+#define LINUX_FPSTATE_MAGIC_OFF         0x06e
+#define LINUX_FPSTATE_FXSR_ENV_OFF      0x070
+#define LINUX_FPSTATE_MXCSR_OFF         0x088
+#define LINUX_FPSTATE_FXSR_ST0_OFF      0x090
+#define LINUX_FPSTATE_FXSR_ST1_OFF      0x0a0
+#define LINUX_FPSTATE_FXSR_ST2_OFF      0x0b0
+#define LINUX_FPSTATE_FXSR_ST3_OFF      0x0c0
+#define LINUX_FPSTATE_FXSR_ST4_OFF      0x0d0
+#define LINUX_FPSTATE_FXSR_ST5_OFF      0x0e0
+#define LINUX_FPSTATE_FXSR_ST6_OFF      0x0f0
+#define LINUX_FPSTATE_FXSR_ST7_OFF      0x100
+#define LINUX_FPSTATE_XMM0_OFF          0x110
+#define LINUX_FPSTATE_XMM1_OFF          0x120
+#define LINUX_FPSTATE_XMM2_OFF          0x130
+#define LINUX_FPSTATE_XMM3_OFF          0x140
+#define LINUX_FPSTATE_XMM4_OFF          0x150
+#define LINUX_FPSTATE_XMM5_OFF          0x160
+#define LINUX_FPSTATE_XMM6_OFF          0x170
+#define LINUX_FPSTATE_XMM7_OFF          0x180
+
+/* FreeBSD-specific definitions: */
+
+#define FREEBSD_SC_UCONTEXT_OFF         0x20
+#define FREEBSD_UC_MCONTEXT_OFF         0x10
+
+#define FREEBSD_UC_MCONTEXT_GS_OFF      0x14
+#define FREEBSD_UC_MCONTEXT_FS_OFF      0x18
+#define FREEBSD_UC_MCONTEXT_ES_OFF      0x1c
+#define FREEBSD_UC_MCONTEXT_DS_OFF      0x20
+#define FREEBSD_UC_MCONTEXT_EDI_OFF     0x24
+#define FREEBSD_UC_MCONTEXT_ESI_OFF     0x28
+#define FREEBSD_UC_MCONTEXT_EBP_OFF     0x2c
+#define FREEBSD_UC_MCONTEXT_EBX_OFF     0x34
+#define FREEBSD_UC_MCONTEXT_EDX_OFF     0x38
+#define FREEBSD_UC_MCONTEXT_ECX_OFF     0x3c
+#define FREEBSD_UC_MCONTEXT_EAX_OFF     0x40
+#define FREEBSD_UC_MCONTEXT_TRAPNO_OFF  0x44
+#define FREEBSD_UC_MCONTEXT_EIP_OFF     0x4c
+#define FREEBSD_UC_MCONTEXT_ESP_OFF     0x58
+#define FREEBSD_UC_MCONTEXT_CS_OFF      0x50
+#define FREEBSD_UC_MCONTEXT_EFLAGS_OFF  0x54
+#define FREEBSD_UC_MCONTEXT_SS_OFF      0x5c
+#define FREEBSD_UC_MCONTEXT_MC_LEN_OFF  0x60
+#define FREEBSD_UC_MCONTEXT_FPFORMAT_OFF 0x64
+#define FREEBSD_UC_MCONTEXT_OWNEDFP_OFF 0x68
+#define FREEBSD_UC_MCONTEXT_FPSTATE_OFF 0x70
+
+#define FREEBSD_UC_MCONTEXT_CW_OFF      0x70
+#define FREEBSD_UC_MCONTEXT_SW_OFF      0x74
+#define FREEBSD_UC_MCONTEXT_TAG_OFF     0x78
+#define FREEBSD_UC_MCONTEXT_IPOFF_OFF   0x7c
+#define FREEBSD_UC_MCONTEXT_CSSEL_OFF   0x80
+#define FREEBSD_UC_MCONTEXT_DATAOFF_OFF 0x84
+#define FREEBSD_US_MCONTEXT_DATASEL_OFF 0x88
+#define FREEBSD_UC_MCONTEXT_ST0_OFF     0x8c
+
+#define FREEBSD_UC_MCONTEXT_CW_XMM_OFF  0x70
+#define FREEBSD_UC_MCONTEXT_SW_XMM_OFF  0x72
+#define FREEBSD_UC_MCONTEXT_TAG_XMM_OFF 0x74
+#define FREEBSD_UC_MCONTEXT_IPOFF_XMM_OFF 0x78
+#define FREEBSD_UC_MCONTEXT_CSSEL_XMM_OFF 0x7c
+#define FREEBSD_UC_MCONTEXT_DATAOFF_XMM_OFF 0x80
+#define FREEBSD_US_MCONTEXT_DATASEL_XMM_OFF 0x84
+#define FREEBSD_UC_MCONTEXT_MXCSR_XMM_OFF 0x88
+#define FREEBSD_UC_MCONTEXT_ST0_XMM_OFF 0x90
+#define FREEBSD_UC_MCONTEXT_XMM0_OFF    0x110
+
+#define FREEBSD_UC_MCONTEXT_MC_LEN_VAL  0x280
+#define FREEBSD_UC_MCONTEXT_FPFMT_NODEV 0x10000
+#define FREEBSD_UC_MCONTEXT_FPFMT_387   0x10001
+#define FREEBSD_UC_MCONTEXT_FPFMT_XMM   0x10002
+#define FREEBSD_UC_MCONTEXT_FPOWNED_NONE 0x20000
+#define FREEBSD_UC_MCONTEXT_FPOWNED_FPU 0x20001
+#define FREEBSD_UC_MCONTEXT_FPOWNED_PCB 0x20002
+
diff --git a/frysk-imports/libunwind/src/x86/siglongjmp.S b/frysk-imports/libunwind/src/x86/siglongjmp.S
index 5aa1784..32bba3b 100644
--- a/frysk-imports/libunwind/src/x86/siglongjmp.S
+++ b/frysk-imports/libunwind/src/x86/siglongjmp.S
@@ -1,6 +1,7 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2004 Hewlett-Packard Co
 	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+   Copyright (C) 2011 Konstantin Belousov <kib@FreeBSD.org>
 
 This file is part of libunwind.
 
@@ -25,7 +26,11 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 	.globl _UI_siglongjmp_cont
 
+#if defined(__linux__)
 #define SIG_SETMASK 2
+#elif defined(__FreeBSD__)
+#define SIG_SETMASK 3
+#endif
 
 	/* Stack layout at this point:
 
@@ -39,6 +44,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 	.type _UI_siglongjmp_cont, @function
 _UI_siglongjmp_cont:
 	.cfi_startproc
+#ifdef __linux__
 	.cfi_register 8, 0	/* IP saved in EAX */
 	.cfi_def_cfa_offset 8
 	mov %esp, %ecx		/* pass address of signal mask in 3rd sc arg */
@@ -64,9 +70,23 @@ _UI_siglongjmp_cont:
 	lea 8(%esp), %esp	/* pop sigmask */
 	.cfi_adjust_cfa_offset -4
 	jmp *%edx
+#elif defined(__FreeBSD__)
+	pushl	%eax
+	pushl	%edx
+	pushl	$0
+	pushl	%ecx
+	pushl	$SIG_SETMASK
+	movl	$340,%eax
+	pushl	%eax
+	int	$0x80
+	addl	$16,%esp
+	popl	%eax
+	popl	%edx
+	jmp	*%edx
+#else
+#error Port me
+#endif
 	.cfi_endproc
 	.size _UI_siglongjmp_cont, .-_UI_siglongjmp_cont
-#ifdef __linux__
 	/* We do not need executable stack.  */
 	.section	.note.GNU-stack,"",@progbits
-#endif
diff --git a/frysk-imports/libunwind/src/x86/unwind_i.h b/frysk-imports/libunwind/src/x86/unwind_i.h
index 6347719..cd52824 100644
--- a/frysk-imports/libunwind/src/x86/unwind_i.h
+++ b/frysk-imports/libunwind/src/x86/unwind_i.h
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2002 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
 This file is part of libunwind.
 
@@ -26,7 +26,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #ifndef unwind_i_h
 #define unwind_i_h
 
-#include <memory.h>
 #include <stdint.h>
 
 #include <libunwind-x86.h>
@@ -34,27 +33,31 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #include "libunwind_i.h"
 
 /* DWARF column numbers: */
-#define EAX	0
-#define ECX	1
-#define EDX	2
-#define EBX	3
-#define ESP	4
-#define EBP	5
-#define ESI	6
-#define EDI	7
-#define EIP	8
-#define EFLAGS	9
-#define TRAPNO	10
-#define ST0	11
-
-#define x86_lock			UNW_OBJ(lock)
-#define x86_local_resume		UNW_OBJ(local_resume)
-#define x86_local_addr_space_init	UNW_OBJ(local_addr_space_init)
-#define x86_scratch_loc			UNW_OBJ(scratch_loc)
+#define EAX     0
+#define ECX     1
+#define EDX     2
+#define EBX     3
+#define ESP     4
+#define EBP     5
+#define ESI     6
+#define EDI     7
+#define EIP     8
+#define EFLAGS  9
+#define TRAPNO  10
+#define ST0     11
+
+#define x86_lock                        UNW_OBJ(lock)
+#define x86_local_resume                UNW_OBJ(local_resume)
+#define x86_local_addr_space_init       UNW_OBJ(local_addr_space_init)
+#define x86_scratch_loc                 UNW_OBJ(scratch_loc)
+#define x86_get_scratch_loc             UNW_OBJ(get_scratch_loc)
+#define x86_r_uc_addr                   UNW_OBJ(r_uc_addr)
 
 extern void x86_local_addr_space_init (void);
 extern int x86_local_resume (unw_addr_space_t as, unw_cursor_t *cursor,
-			     void *arg);
+                             void *arg);
 extern dwarf_loc_t x86_scratch_loc (struct cursor *c, unw_regnum_t reg);
+extern dwarf_loc_t x86_get_scratch_loc (struct cursor *c, unw_regnum_t reg);
+extern void *x86_r_uc_addr (ucontext_t *uc, int reg);
 
 #endif /* unwind_i_h */
diff --git a/frysk-imports/libunwind/src/x86_64/Gcreate_addr_space.c b/frysk-imports/libunwind/src/x86_64/Gcreate_addr_space.c
index 975387a..38ee5af 100644
--- a/frysk-imports/libunwind/src/x86_64/Gcreate_addr_space.c
+++ b/frysk-imports/libunwind/src/x86_64/Gcreate_addr_space.c
@@ -1,8 +1,9 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
    Modified for x86_64 by Max Asbock <masbock@us.ibm.com>
+   Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com>
 
 This file is part of libunwind.
 
@@ -29,14 +30,25 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 #include "unwind_i.h"
 
+#if defined(_LITTLE_ENDIAN) && !defined(__LITTLE_ENDIAN)
+#define __LITTLE_ENDIAN _LITTLE_ENDIAN
+#endif
+
 PROTECTED unw_addr_space_t
 unw_create_addr_space (unw_accessors_t *a, int byte_order)
 {
 #ifdef UNW_LOCAL_ONLY
   return NULL;
 #else
-  unw_addr_space_t as = malloc (sizeof (*as));
+  unw_addr_space_t as;
 
+  /*
+   * x86_64 supports only little-endian.
+   */
+  if (byte_order != 0 && byte_order != __LITTLE_ENDIAN)
+    return NULL;
+
+  as = malloc (sizeof (*as));
   if (!as)
     return NULL;
 
@@ -44,11 +56,6 @@ unw_create_addr_space (unw_accessors_t *a, int byte_order)
 
   as->acc = *a;
 
-  /*
-   * x86_64 supports only little-endian.
-   */
-  if (byte_order != 0 && byte_order != __LITTLE_ENDIAN)
-    return NULL;
   return as;
 #endif
 }
diff --git a/frysk-imports/libunwind/src/x86_64/Gfetch_proc_info_post.c b/frysk-imports/libunwind/src/x86_64/Gfetch_proc_info_post.c
deleted file mode 100644
index 952e5d5..0000000
--- a/frysk-imports/libunwind/src/x86_64/Gfetch_proc_info_post.c
+++ /dev/null
@@ -1,51 +0,0 @@
-/* libunwind - a platform-independent unwind library
-   Copyright (c) 2006 Hewlett-Packard Development Company, L.P.
-	Contributed by Jan Kratochvil <jan.kratochvil@redhat.com>
-
-This file is part of libunwind.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
-
-#include "libunwind_i.h"
-
-HIDDEN int
-tdep_fetch_proc_info_post (struct dwarf_cursor *c, unw_word_t ip, int need_unwind_info)
-{
-  struct cursor *cursor = (struct cursor *) c;
-
-  /* Should happen only if `!need_unwind_info'.  */
-  if (!c->pi_valid)
-    return 0;
-  /* Should happen only if `!need_unwind_info'.  */
-  if (!c->pi.unwind_info)
-    return 0;
-
-  /* Reset the value for this frame.  */
-  cursor->sigcontext_format = X86_64_SCF_NONE;
-
-  /* Normal non-signal frames case.  */
-  if (!((struct dwarf_cie_info *) c->pi.unwind_info)->signal_frame)
-    return 0;
-
-  cursor->sigcontext_format = X86_64_SCF_LINUX_RT_SIGFRAME;
-  cursor->sigcontext_addr = c->cfa;
-
-  return 0;
-}
diff --git a/frysk-imports/libunwind/src/x86_64/Gget_proc_info.c b/frysk-imports/libunwind/src/x86_64/Gget_proc_info.c
index 213666e..8def62d 100644
--- a/frysk-imports/libunwind/src/x86_64/Gget_proc_info.c
+++ b/frysk-imports/libunwind/src/x86_64/Gget_proc_info.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (c) 2002-2003 Hewlett-Packard Development Company, L.P.
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
    Modified for x86_64 by Max Asbock <masbock@us.ibm.com>
 
@@ -35,9 +35,9 @@ unw_get_proc_info (unw_cursor_t *cursor, unw_proc_info_t *pi)
   if (dwarf_make_proc_info (&c->dwarf) < 0)
     {
       /* On x86-64, some key routines such as _start() and _dl_start()
-	 are missing DWARF unwind info.  We don't want to fail in that
-	 case, because those frames are uninteresting and just mark
-	 the end of the frame-chain anyhow.  */
+         are missing DWARF unwind info.  We don't want to fail in that
+         case, because those frames are uninteresting and just mark
+         the end of the frame-chain anyhow.  */
       memset (pi, 0, sizeof (*pi));
       pi->start_ip = c->dwarf.ip;
       pi->end_ip = c->dwarf.ip + 1;
diff --git a/frysk-imports/libunwind/src/x86_64/Gget_save_loc.c b/frysk-imports/libunwind/src/x86_64/Gget_save_loc.c
index db81db3..b48fa91 100644
--- a/frysk-imports/libunwind/src/x86_64/Gget_save_loc.c
+++ b/frysk-imports/libunwind/src/x86_64/Gget_save_loc.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
    Modified for x86_64 by Max Asbock <masbock@us.ibm.com>
 
@@ -33,7 +33,7 @@ unw_get_save_loc (unw_cursor_t *cursor, int reg, unw_save_loc_t *sloc)
   struct cursor *c = (struct cursor *) cursor;
   dwarf_loc_t loc;
 
-  loc = DWARF_NULL_LOC;		/* default to "not saved" */
+  loc = DWARF_NULL_LOC;         /* default to "not saved" */
 
   switch (reg)
     {
@@ -49,7 +49,7 @@ unw_get_save_loc (unw_cursor_t *cursor, int reg, unw_save_loc_t *sloc)
       break;
     }
 
-  memset (sloc, 0, sizeof (sloc));
+  memset (sloc, 0, sizeof (*sloc));
 
   if (DWARF_IS_NULL_LOC (loc))
     {
diff --git a/frysk-imports/libunwind/src/x86_64/Gglobal.c b/frysk-imports/libunwind/src/x86_64/Gglobal.c
index ec14efe..8d1fbb4 100644
--- a/frysk-imports/libunwind/src/x86_64/Gglobal.c
+++ b/frysk-imports/libunwind/src/x86_64/Gglobal.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (c) 2003, 2005 Hewlett-Packard Development Company, L.P.
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
    Modified for x86_64 by Max Asbock <masbock@us.ibm.com>
 
@@ -25,15 +25,16 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
+#include "config.h"
 #include "unwind_i.h"
 #include "dwarf_i.h"
 
-HIDDEN pthread_mutex_t x86_64_lock = PTHREAD_MUTEX_INITIALIZER;
-HIDDEN int tdep_needs_initialization = 1;
+HIDDEN define_lock (x86_64_lock);
+HIDDEN int tdep_init_done;
 
 /* See comments for svr4_dbx_register_map[] in gcc/config/i386/i386.c.  */
 
-HIDDEN uint8_t dwarf_to_unw_regnum_map[17] =
+HIDDEN const uint8_t dwarf_to_unw_regnum_map[DWARF_NUM_PRESERVED_REGS] =
   {
     UNW_X86_64_RAX,
     UNW_X86_64_RDX,
@@ -51,7 +52,25 @@ HIDDEN uint8_t dwarf_to_unw_regnum_map[17] =
     UNW_X86_64_R13,
     UNW_X86_64_R14,
     UNW_X86_64_R15,
-    UNW_X86_64_RIP
+    UNW_X86_64_RIP,
+#ifdef CONFIG_MSABI_SUPPORT
+    UNW_X86_64_XMM0,
+    UNW_X86_64_XMM1,
+    UNW_X86_64_XMM2,
+    UNW_X86_64_XMM3,
+    UNW_X86_64_XMM4,
+    UNW_X86_64_XMM5,
+    UNW_X86_64_XMM6,
+    UNW_X86_64_XMM7,
+    UNW_X86_64_XMM8,
+    UNW_X86_64_XMM9,
+    UNW_X86_64_XMM10,
+    UNW_X86_64_XMM11,
+    UNW_X86_64_XMM12,
+    UNW_X86_64_XMM13,
+    UNW_X86_64_XMM14,
+    UNW_X86_64_XMM15
+#endif
   };
 
 HIDDEN void
@@ -61,10 +80,9 @@ tdep_init (void)
 
   sigfillset (&unwi_full_mask);
 
-  sigprocmask (SIG_SETMASK, &unwi_full_mask, &saved_mask);
-  mutex_lock (&x86_64_lock);
+  lock_acquire (&x86_64_lock, saved_mask);
   {
-    if (!tdep_needs_initialization)
+    if (tdep_init_done)
       /* another thread else beat us to it... */
       goto out;
 
@@ -72,12 +90,13 @@ tdep_init (void)
 
     dwarf_init ();
 
+    tdep_init_mem_validate ();
+
 #ifndef UNW_REMOTE_ONLY
     x86_64_local_addr_space_init ();
 #endif
-    tdep_needs_initialization = 0;	/* signal that we're initialized... */
+    tdep_init_done = 1; /* signal that we're initialized... */
   }
  out:
-  mutex_unlock (&x86_64_lock);
-  sigprocmask (SIG_SETMASK, &saved_mask, NULL);
+  lock_release (&x86_64_lock, saved_mask);
 }
diff --git a/frysk-imports/libunwind/src/x86_64/Ginit.c b/frysk-imports/libunwind/src/x86_64/Ginit.c
index 026e8d2..7827576 100644
--- a/frysk-imports/libunwind/src/x86_64/Ginit.c
+++ b/frysk-imports/libunwind/src/x86_64/Ginit.c
@@ -1,7 +1,7 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2002 Hewlett-Packard Co
    Copyright (C) 2007 David Mosberger-Tang
-	Contributed by David Mosberger-Tang <dmosberger@gmail.com>
+        Contributed by David Mosberger-Tang <dmosberger@gmail.com>
 
    Modified for x86_64 by Max Asbock <masbock@us.ibm.com>
 
@@ -26,6 +26,11 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <errno.h>
 #include <stdlib.h>
 #include <string.h>
 #include <sys/mman.h>
@@ -43,47 +48,6 @@ static struct unw_addr_space local_addr_space;
 
 PROTECTED unw_addr_space_t unw_local_addr_space = &local_addr_space;
 
-static inline void *
-uc_addr (ucontext_t *uc, int reg)
-{
-  void *addr;
-
-  switch (reg)
-    {
-    case UNW_X86_64_R8: addr = &uc->uc_mcontext.gregs[REG_R8]; break;
-    case UNW_X86_64_R9: addr = &uc->uc_mcontext.gregs[REG_R9]; break;
-    case UNW_X86_64_R10: addr = &uc->uc_mcontext.gregs[REG_R10]; break;
-    case UNW_X86_64_R11: addr = &uc->uc_mcontext.gregs[REG_R11]; break;
-    case UNW_X86_64_R12: addr = &uc->uc_mcontext.gregs[REG_R12]; break;
-    case UNW_X86_64_R13: addr = &uc->uc_mcontext.gregs[REG_R13]; break;
-    case UNW_X86_64_R14: addr = &uc->uc_mcontext.gregs[REG_R14]; break;
-    case UNW_X86_64_R15: addr = &uc->uc_mcontext.gregs[REG_R15]; break;
-    case UNW_X86_64_RDI: addr = &uc->uc_mcontext.gregs[REG_RDI]; break;
-    case UNW_X86_64_RSI: addr = &uc->uc_mcontext.gregs[REG_RSI]; break;
-    case UNW_X86_64_RBP: addr = &uc->uc_mcontext.gregs[REG_RBP]; break;
-    case UNW_X86_64_RBX: addr = &uc->uc_mcontext.gregs[REG_RBX]; break;
-    case UNW_X86_64_RDX: addr = &uc->uc_mcontext.gregs[REG_RDX]; break;
-    case UNW_X86_64_RAX: addr = &uc->uc_mcontext.gregs[REG_RAX]; break;
-    case UNW_X86_64_RCX: addr = &uc->uc_mcontext.gregs[REG_RCX]; break;
-    case UNW_X86_64_RSP: addr = &uc->uc_mcontext.gregs[REG_RSP]; break;
-    case UNW_X86_64_RIP: addr = &uc->uc_mcontext.gregs[REG_RIP]; break;
-
-    default:
-      addr = NULL;
-    }
-  return addr;
-}
-
-# ifdef UNW_LOCAL_ONLY
-
-HIDDEN void *
-tdep_uc_addr (ucontext_t *uc, int reg)
-{
-  return uc_addr (uc, reg);
-}
-
-# endif /* UNW_LOCAL_ONLY */
-
 HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
 
 /* XXX fix me: there is currently no way to locate the dyn-info list
@@ -99,14 +63,69 @@ put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
 
 static int
 get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
-			void *arg)
+                        void *arg)
 {
   *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
   return 0;
 }
 
 #define PAGE_SIZE 4096
-#define PAGE_START(a)	((a) & ~(PAGE_SIZE-1))
+#define PAGE_START(a)   ((a) & ~(PAGE_SIZE-1))
+
+static int (*mem_validate_func) (void *addr, size_t len);
+static int msync_validate (void *addr, size_t len)
+{
+  return msync (addr, len, MS_ASYNC);
+}
+
+#ifdef HAVE_MINCORE
+static int mincore_validate (void *addr, size_t len)
+{
+  unsigned char mvec[2]; /* Unaligned access may cross page boundary */
+  size_t i;
+
+  /* mincore could fail with EAGAIN but we conservatively return -1
+     instead of looping. */
+  if (mincore (addr, len, mvec) != 0)
+    {
+      return -1;
+    }
+
+  for (i = 0; i < (len + PAGE_SIZE - 1) / PAGE_SIZE; i++)
+    {
+      if (!(mvec[i] & 1)) return -1;
+    }
+
+  return 0;
+}
+#endif
+
+/* Initialise memory validation method. On linux kernels <2.6.21,
+   mincore() returns incorrect value for MAP_PRIVATE mappings,
+   such as stacks. If mincore() was available at compile time,
+   check if we can actually use it. If not, use msync() instead. */
+HIDDEN void
+tdep_init_mem_validate (void)
+{
+#ifdef HAVE_MINCORE
+  unsigned char present = 1;
+  unw_word_t addr = PAGE_START((unw_word_t)&present);
+  unsigned char mvec[1];
+  int ret;
+  while ((ret = mincore ((void*)addr, PAGE_SIZE, mvec)) == -1 &&
+         errno == EAGAIN) {}
+  if (ret == 0 && (mvec[0] & 1))
+    {
+      Debug(1, "using mincore to validate memory\n");
+      mem_validate_func = mincore_validate;
+    }
+  else
+#endif
+    {
+      Debug(1, "using msync to validate memory\n");
+      mem_validate_func = msync_validate;
+    }
+}
 
 /* Cache of already validated addresses */
 #define NLGA 4
@@ -117,16 +136,25 @@ static int
 validate_mem (unw_word_t addr)
 {
   int i, victim;
+  size_t len;
+
+  if (PAGE_START(addr + sizeof (unw_word_t) - 1) == PAGE_START(addr))
+    len = PAGE_SIZE;
+  else
+    len = PAGE_SIZE * 2;
 
   addr = PAGE_START(addr);
 
+  if (addr == 0)
+    return -1;
+
   for (i = 0; i < NLGA; i++)
     {
       if (last_good_addr[i] && (addr == last_good_addr[i]))
-	return 0;
+        return 0;
     }
 
-  if (msync ((void *) addr, 1, MS_SYNC) == -1)
+  if (mem_validate_func ((void *) addr, len) == -1)
     return -1;
 
   victim = lga_victim;
@@ -148,9 +176,9 @@ validate_mem (unw_word_t addr)
 
 static int
 access_mem (unw_addr_space_t as, unw_word_t addr, unw_word_t *val, int write,
-	    void *arg)
+            void *arg)
 {
-  if (write)
+  if (unlikely (write))
     {
       Debug (16, "mem[%016lx] <- %lx\n", addr, *val);
       *(unw_word_t *) addr = *val;
@@ -158,8 +186,12 @@ access_mem (unw_addr_space_t as, unw_word_t addr, unw_word_t *val, int write,
   else
     {
       /* validate address */
-      if (as->validate && validate_mem(addr))
+      const struct cursor *c = (const struct cursor *)arg;
+      if (likely (c != NULL) && unlikely (c->validate)
+          && unlikely (validate_mem (addr))) {
+        Debug (16, "mem[%016lx] -> invalid\n", addr);
         return -1;
+      }
       *val = *(unw_word_t *) addr;
       Debug (16, "mem[%016lx] -> %lx\n", addr, *val);
     }
@@ -168,15 +200,15 @@ access_mem (unw_addr_space_t as, unw_word_t addr, unw_word_t *val, int write,
 
 static int
 access_reg (unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val, int write,
-	    void *arg)
+            void *arg)
 {
   unw_word_t *addr;
-  ucontext_t *uc = arg;
+  ucontext_t *uc = ((struct cursor *)arg)->uc;
 
   if (unw_is_fpreg (reg))
     goto badreg;
 
-  if (!(addr = uc_addr (uc, reg)))
+  if (!(addr = x86_64_r_uc_addr (uc, reg)))
     goto badreg;
 
   if (write)
@@ -198,28 +230,28 @@ access_reg (unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val, int write,
 
 static int
 access_fpreg (unw_addr_space_t as, unw_regnum_t reg, unw_fpreg_t *val,
-	      int write, void *arg)
+              int write, void *arg)
 {
-  ucontext_t *uc = arg;
+  ucontext_t *uc = ((struct cursor *)arg)->uc;
   unw_fpreg_t *addr;
 
   if (!unw_is_fpreg (reg))
     goto badreg;
 
-  if (!(addr = uc_addr (uc, reg)))
+  if (!(addr = x86_64_r_uc_addr (uc, reg)))
     goto badreg;
 
   if (write)
     {
       Debug (12, "%s <- %08lx.%08lx.%08lx\n", unw_regname (reg),
-	     ((long *)val)[0], ((long *)val)[1], ((long *)val)[2]);
+             ((long *)val)[0], ((long *)val)[1], ((long *)val)[2]);
       *(unw_fpreg_t *) addr = *val;
     }
   else
     {
       *val = *(unw_fpreg_t *) addr;
       Debug (12, "%s -> %08lx.%08lx.%08lx\n", unw_regname (reg),
-	     ((long *)val)[0], ((long *)val)[1], ((long *)val)[2]);
+             ((long *)val)[0], ((long *)val)[1], ((long *)val)[2]);
     }
   return 0;
 
@@ -231,8 +263,8 @@ access_fpreg (unw_addr_space_t as, unw_regnum_t reg, unw_fpreg_t *val,
 
 static int
 get_static_proc_name (unw_addr_space_t as, unw_word_t ip,
-		      char *buf, size_t buf_len, unw_word_t *offp,
-		      void *arg)
+                      char *buf, size_t buf_len, unw_word_t *offp,
+                      void *arg)
 {
   return _Uelf64_get_proc_name (as, getpid (), ip, buf, buf_len, offp);
 }
@@ -252,7 +284,6 @@ x86_64_local_addr_space_init (void)
   local_addr_space.acc.get_proc_name = get_static_proc_name;
   unw_flush_cache (&local_addr_space, 0, 0);
 
-  local_addr_space.validate = 0;
   memset (last_good_addr, 0, sizeof (unw_word_t) * NLGA);
   lga_victim = 0;
 }
diff --git a/frysk-imports/libunwind/src/x86_64/Ginit_local.c b/frysk-imports/libunwind/src/x86_64/Ginit_local.c
index 9bb2513..0799389 100644
--- a/frysk-imports/libunwind/src/x86_64/Ginit_local.c
+++ b/frysk-imports/libunwind/src/x86_64/Ginit_local.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (c) 2002-2003 Hewlett-Packard Development Company, L.P.
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
    Modified for x86_64 by Max Asbock <masbock@us.ibm.com>
 
@@ -43,14 +43,16 @@ unw_init_local (unw_cursor_t *cursor, ucontext_t *uc)
 {
   struct cursor *c = (struct cursor *) cursor;
 
-  if (tdep_needs_initialization)
+  if (unlikely (!tdep_init_done))
     tdep_init ();
 
   Debug (1, "(cursor=%p)\n", c);
 
   c->dwarf.as = unw_local_addr_space;
-  c->dwarf.as_arg = uc;
-  return common_init (c);
+  c->dwarf.as_arg = c;
+  c->uc = uc;
+  c->validate = 0;
+  return common_init (c, 1);
 }
 
 #endif /* !UNW_REMOTE_ONLY */
diff --git a/frysk-imports/libunwind/src/x86_64/Ginit_remote.c b/frysk-imports/libunwind/src/x86_64/Ginit_remote.c
index 9b2fd23..f3b7bb9 100644
--- a/frysk-imports/libunwind/src/x86_64/Ginit_remote.c
+++ b/frysk-imports/libunwind/src/x86_64/Ginit_remote.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (c) 2003 Hewlett-Packard Development Company, L.P.
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
    Modified for x86_64 by Max Asbock <masbock@us.ibm.com>
 
@@ -36,13 +36,22 @@ unw_init_remote (unw_cursor_t *cursor, unw_addr_space_t as, void *as_arg)
 #else /* !UNW_LOCAL_ONLY */
   struct cursor *c = (struct cursor *) cursor;
 
-  if (tdep_needs_initialization)
+  if (!tdep_init_done)
     tdep_init ();
 
   Debug (1, "(cursor=%p)\n", c);
 
   c->dwarf.as = as;
-  c->dwarf.as_arg = as_arg;
-  return common_init (c);
+  if (as == unw_local_addr_space)
+    {
+      c->dwarf.as_arg = c;
+      c->uc = as_arg;
+    }
+  else
+    {
+      c->dwarf.as_arg = as_arg;
+      c->uc = NULL;
+    }
+  return common_init (c, 0);
 #endif /* !UNW_LOCAL_ONLY */
 }
diff --git a/frysk-imports/libunwind/src/x86_64/Gis_signal_frame.c b/frysk-imports/libunwind/src/x86_64/Gis_signal_frame.c
deleted file mode 100644
index c9bab90..0000000
--- a/frysk-imports/libunwind/src/x86_64/Gis_signal_frame.c
+++ /dev/null
@@ -1,69 +0,0 @@
-/* libunwind - a platform-independent unwind library
-   Copyright (C) 2002-2003 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
-
-   Modified for x86_64 by Max Asbock <masbock@us.ibm.com>
-
-This file is part of libunwind.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
-
-#include "unwind_i.h"
-
-#ifdef __linux__
-PROTECTED int
-unw_is_signal_frame (unw_cursor_t *cursor)
-{
-  struct cursor *c = (struct cursor *) cursor;
-  unw_word_t w0, w1, ip;
-  unw_addr_space_t as;
-  unw_accessors_t *a;
-  void *arg;
-  int ret;
-
-  as = c->dwarf.as;
-  a = unw_get_accessors (as);
-  as->validate = 1;	/* Don't trust the ip */
-  arg = c->dwarf.as_arg;
-
-  /* Check if RIP points at sigreturn sequence.
-     on x86_64 Linux that is (see libc.so):
-     48 c7 c0 0f 00 00 00 mov $0xf,%rax
-     0f 05                syscall
-     66                   data16
-  */
-
-  ip = c->dwarf.ip;
-  if ((ret = (*a->access_mem) (as, ip, &w0, 0, arg)) < 0
-      || (ret = (*a->access_mem) (as, ip + 8, &w1, 0, arg)) < 0)
-    return 0;
-  w1 &= 0xffffffff;
-  return (w0 == 0x0f0000000fc0c748 && w1 == 0x66666605);
-}
-
-#else /* __linux__ */
-
-PROTECTED int
-unw_is_signal_frame (unw_cursor_t *cursor)
-{
-  printf ("%s: implement me\n", __FUNCTION__);
-  return -UNW_ENOINFO;
-}
-#endif /* __linux__ */
diff --git a/frysk-imports/libunwind/src/x86_64/Gos-freebsd.c b/frysk-imports/libunwind/src/x86_64/Gos-freebsd.c
new file mode 100644
index 0000000..e7e8da1
--- /dev/null
+++ b/frysk-imports/libunwind/src/x86_64/Gos-freebsd.c
@@ -0,0 +1,200 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2010 Konstantin Belousov <kib@freebsd.org>
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <sys/ucontext.h>
+#include <machine/sigframe.h>
+#include <signal.h>
+#include <stddef.h>
+#include "unwind_i.h"
+#include "ucontext_i.h"
+
+PROTECTED int
+unw_is_signal_frame (unw_cursor_t *cursor)
+{
+  /* XXXKIB */
+  struct cursor *c = (struct cursor *) cursor;
+  unw_word_t w0, w1, w2, b0, ip;
+  unw_addr_space_t as;
+  unw_accessors_t *a;
+  void *arg;
+  int ret;
+
+  as = c->dwarf.as;
+  a = unw_get_accessors (as);
+  arg = c->dwarf.as_arg;
+
+  /* Check if RIP points at sigreturn sequence.
+48 8d 7c 24 10          lea     SIGF_UC(%rsp),%rdi
+6a 00                   pushq   $0
+48 c7 c0 a1 01 00 00    movq    $SYS_sigreturn,%rax
+0f 05                   syscall
+f4              0:      hlt
+eb fd                   jmp     0b
+  */
+
+  ip = c->dwarf.ip;
+  c->sigcontext_format = X86_64_SCF_NONE;
+  if ((ret = (*a->access_mem) (as, ip, &w0, 0, arg)) < 0
+      || (ret = (*a->access_mem) (as, ip + 8, &w1, 0, arg)) < 0
+      || (ret = (*a->access_mem) (as, ip + 16, &w2, 0, arg)) < 0)
+    return 0;
+  w2 &= 0xffffff;
+  if (w0 == 0x48006a10247c8d48 &&
+      w1 == 0x050f000001a1c0c7 &&
+      w2 == 0x0000000000fdebf4)
+   {
+     c->sigcontext_format = X86_64_SCF_FREEBSD_SIGFRAME;
+     return (c->sigcontext_format);
+   }
+  /* Check if RIP points at standard syscall sequence.
+49 89 ca        mov    %rcx,%r10
+0f 05           syscall
+  */
+  if ((ret = (*a->access_mem) (as, ip - 5, &b0, 0, arg)) < 0)
+    return (0);
+  Debug (12, "b0 0x%lx\n", b0);
+  if ((b0 & 0xffffffffffffff) == 0x050fca89490000 ||
+      (b0 & 0xffffffffff) == 0x050fca8949)
+   {
+    c->sigcontext_format = X86_64_SCF_FREEBSD_SYSCALL;
+    return (c->sigcontext_format);
+   }
+  return (X86_64_SCF_NONE);
+}
+
+PROTECTED int
+unw_handle_signal_frame (unw_cursor_t *cursor)
+{
+  struct cursor *c = (struct cursor *) cursor;
+  unw_word_t ucontext;
+  int ret;
+
+  if (c->sigcontext_format == X86_64_SCF_FREEBSD_SIGFRAME)
+   {
+    ucontext = c->dwarf.cfa + offsetof(struct sigframe, sf_uc);
+    c->sigcontext_addr = c->dwarf.cfa;
+    Debug(1, "signal frame, skip over trampoline\n");
+
+    struct dwarf_loc rsp_loc = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_RSP, 0);
+    ret = dwarf_get (&c->dwarf, rsp_loc, &c->dwarf.cfa);
+    if (ret < 0)
+     {
+       Debug (2, "returning %d\n", ret);
+       return ret;
+     }
+
+    c->dwarf.loc[RAX] = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_RAX, 0);
+    c->dwarf.loc[RDX] = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_RDX, 0);
+    c->dwarf.loc[RCX] = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_RCX, 0);
+    c->dwarf.loc[RBX] = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_RBX, 0);
+    c->dwarf.loc[RSI] = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_RSI, 0);
+    c->dwarf.loc[RDI] = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_RDI, 0);
+    c->dwarf.loc[RBP] = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_RBP, 0);
+    c->dwarf.loc[RSP] = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_RSP, 0);
+    c->dwarf.loc[ R8] = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R8, 0);
+    c->dwarf.loc[ R9] = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R9, 0);
+    c->dwarf.loc[R10] = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R10, 0);
+    c->dwarf.loc[R11] = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R11, 0);
+    c->dwarf.loc[R12] = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R12, 0);
+    c->dwarf.loc[R13] = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R13, 0);
+    c->dwarf.loc[R14] = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R14, 0);
+    c->dwarf.loc[R15] = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R15, 0);
+    c->dwarf.loc[RIP] = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_RIP, 0);
+
+    return 0;
+   }
+  else if (c->sigcontext_format == X86_64_SCF_FREEBSD_SYSCALL)
+   {
+    c->dwarf.loc[RCX] = c->dwarf.loc[R10];
+    /*  rsp_loc = DWARF_LOC(c->dwarf.cfa - 8, 0);       */
+    /*  rbp_loc = c->dwarf.loc[RBP];                    */
+    c->dwarf.loc[RIP] = DWARF_LOC (c->dwarf.cfa, 0);
+    ret = dwarf_get (&c->dwarf, c->dwarf.loc[RIP], &c->dwarf.ip);
+    Debug (1, "Frame Chain [RIP=0x%Lx] = 0x%Lx\n",
+           (unsigned long long) DWARF_GET_LOC (c->dwarf.loc[RIP]),
+           (unsigned long long) c->dwarf.ip);
+    if (ret < 0)
+     {
+       Debug (2, "returning %d\n", ret);
+       return ret;
+     }
+    c->dwarf.cfa += 8;
+    c->dwarf.use_prev_instr = 1;
+    return 1;
+   }
+  else
+    return -UNW_EBADFRAME;
+
+}
+
+#ifndef UNW_REMOTE_ONLY
+HIDDEN void *
+x86_64_r_uc_addr (ucontext_t *uc, int reg)
+{
+  /* NOTE: common_init() in init.h inlines these for fast path access. */
+  void *addr;
+
+  switch (reg)
+    {
+    case UNW_X86_64_R8: addr = &uc->uc_mcontext.mc_r8; break;
+    case UNW_X86_64_R9: addr = &uc->uc_mcontext.mc_r9; break;
+    case UNW_X86_64_R10: addr = &uc->uc_mcontext.mc_r10; break;
+    case UNW_X86_64_R11: addr = &uc->uc_mcontext.mc_r11; break;
+    case UNW_X86_64_R12: addr = &uc->uc_mcontext.mc_r12; break;
+    case UNW_X86_64_R13: addr = &uc->uc_mcontext.mc_r13; break;
+    case UNW_X86_64_R14: addr = &uc->uc_mcontext.mc_r14; break;
+    case UNW_X86_64_R15: addr = &uc->uc_mcontext.mc_r15; break;
+    case UNW_X86_64_RDI: addr = &uc->uc_mcontext.mc_rdi; break;
+    case UNW_X86_64_RSI: addr = &uc->uc_mcontext.mc_rsi; break;
+    case UNW_X86_64_RBP: addr = &uc->uc_mcontext.mc_rbp; break;
+    case UNW_X86_64_RBX: addr = &uc->uc_mcontext.mc_rbx; break;
+    case UNW_X86_64_RDX: addr = &uc->uc_mcontext.mc_rdx; break;
+    case UNW_X86_64_RAX: addr = &uc->uc_mcontext.mc_rax; break;
+    case UNW_X86_64_RCX: addr = &uc->uc_mcontext.mc_rcx; break;
+    case UNW_X86_64_RSP: addr = &uc->uc_mcontext.mc_rsp; break;
+    case UNW_X86_64_RIP: addr = &uc->uc_mcontext.mc_rip; break;
+
+    default:
+      addr = NULL;
+    }
+  return addr;
+}
+
+HIDDEN NORETURN void
+x86_64_sigreturn (unw_cursor_t *cursor)
+{
+  struct cursor *c = (struct cursor *) cursor;
+  ucontext_t *uc = (ucontext_t *)(c->sigcontext_addr +
+    offsetof(struct sigframe, sf_uc));
+
+  Debug (8, "resuming at ip=%llx via sigreturn(%p)\n",
+             (unsigned long long) c->dwarf.ip, uc);
+  sigreturn(uc);
+  abort();
+}
+#endif
diff --git a/frysk-imports/libunwind/src/x86_64/Gos-linux.c b/frysk-imports/libunwind/src/x86_64/Gos-linux.c
new file mode 100644
index 0000000..9e1acfc
--- /dev/null
+++ b/frysk-imports/libunwind/src/x86_64/Gos-linux.c
@@ -0,0 +1,154 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2002-2003 Hewlett-Packard Co
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+
+   Modified for x86_64 by Max Asbock <masbock@us.ibm.com>
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "unwind_i.h"
+#include "ucontext_i.h"
+
+#include <sys/syscall.h>
+
+HIDDEN void
+tdep_fetch_frame (struct dwarf_cursor *dw, unw_word_t ip, int need_unwind_info)
+{
+  struct cursor *c = (struct cursor *) dw;
+  assert(! need_unwind_info || dw->pi_valid);
+  assert(! need_unwind_info || dw->pi.unwind_info);
+  if (dw->pi_valid
+      && dw->pi.unwind_info
+      && ((struct dwarf_cie_info *) dw->pi.unwind_info)->signal_frame)
+    c->sigcontext_format = X86_64_SCF_LINUX_RT_SIGFRAME;
+  else
+    c->sigcontext_format = X86_64_SCF_NONE;
+
+  Debug(5, "fetch frame ip=0x%lx cfa=0x%lx format=%d\n",
+        dw->ip, dw->cfa, c->sigcontext_format);
+}
+
+HIDDEN void
+tdep_cache_frame (struct dwarf_cursor *dw, struct dwarf_reg_state *rs)
+{
+  struct cursor *c = (struct cursor *) dw;
+  rs->signal_frame = c->sigcontext_format;
+
+  Debug(5, "cache frame ip=0x%lx cfa=0x%lx format=%d\n",
+        dw->ip, dw->cfa, c->sigcontext_format);
+}
+
+HIDDEN void
+tdep_reuse_frame (struct dwarf_cursor *dw, struct dwarf_reg_state *rs)
+{
+  struct cursor *c = (struct cursor *) dw;
+  c->sigcontext_format = rs->signal_frame;
+  if (c->sigcontext_format == X86_64_SCF_LINUX_RT_SIGFRAME)
+  {
+    c->frame_info.frame_type = UNW_X86_64_FRAME_SIGRETURN;
+    /* Offset from cfa to ucontext_t in signal frame.  */
+    c->frame_info.cfa_reg_offset = 0;
+    c->sigcontext_addr = dw->cfa;
+  }
+  else
+    c->sigcontext_addr = 0;
+
+  Debug(5, "reuse frame ip=0x%lx cfa=0x%lx format=%d addr=0x%lx offset=%+d\n",
+        dw->ip, dw->cfa, c->sigcontext_format, c->sigcontext_addr,
+        (c->sigcontext_format == X86_64_SCF_LINUX_RT_SIGFRAME
+         ? c->frame_info.cfa_reg_offset : 0));
+}
+
+PROTECTED int
+unw_is_signal_frame (unw_cursor_t *cursor)
+{
+  struct cursor *c = (struct cursor *) cursor;
+  return c->sigcontext_format != X86_64_SCF_NONE;
+}
+
+PROTECTED int
+unw_handle_signal_frame (unw_cursor_t *cursor)
+{
+#if UNW_DEBUG /* To silence compiler warnings */
+  /* Should not get here because we now use kernel-provided dwarf
+     information for the signal trampoline and dwarf_step() works.
+     Hence unw_step() should never call this function. Maybe
+     restore old non-dwarf signal handling here, but then the
+     gating on unw_is_signal_frame() needs to be removed. */
+  struct cursor *c = (struct cursor *) cursor;
+  Debug(1, "old format signal frame? format=%d addr=0x%lx cfa=0x%lx\n",
+        c->sigcontext_format, c->sigcontext_addr, c->dwarf.cfa);
+#endif
+  return -UNW_EBADFRAME;
+}
+
+#ifndef UNW_REMOTE_ONLY
+HIDDEN void *
+x86_64_r_uc_addr (ucontext_t *uc, int reg)
+{
+  /* NOTE: common_init() in init.h inlines these for fast path access. */
+  void *addr;
+
+  switch (reg)
+    {
+    case UNW_X86_64_R8: addr = &uc->uc_mcontext.gregs[REG_R8]; break;
+    case UNW_X86_64_R9: addr = &uc->uc_mcontext.gregs[REG_R9]; break;
+    case UNW_X86_64_R10: addr = &uc->uc_mcontext.gregs[REG_R10]; break;
+    case UNW_X86_64_R11: addr = &uc->uc_mcontext.gregs[REG_R11]; break;
+    case UNW_X86_64_R12: addr = &uc->uc_mcontext.gregs[REG_R12]; break;
+    case UNW_X86_64_R13: addr = &uc->uc_mcontext.gregs[REG_R13]; break;
+    case UNW_X86_64_R14: addr = &uc->uc_mcontext.gregs[REG_R14]; break;
+    case UNW_X86_64_R15: addr = &uc->uc_mcontext.gregs[REG_R15]; break;
+    case UNW_X86_64_RDI: addr = &uc->uc_mcontext.gregs[REG_RDI]; break;
+    case UNW_X86_64_RSI: addr = &uc->uc_mcontext.gregs[REG_RSI]; break;
+    case UNW_X86_64_RBP: addr = &uc->uc_mcontext.gregs[REG_RBP]; break;
+    case UNW_X86_64_RBX: addr = &uc->uc_mcontext.gregs[REG_RBX]; break;
+    case UNW_X86_64_RDX: addr = &uc->uc_mcontext.gregs[REG_RDX]; break;
+    case UNW_X86_64_RAX: addr = &uc->uc_mcontext.gregs[REG_RAX]; break;
+    case UNW_X86_64_RCX: addr = &uc->uc_mcontext.gregs[REG_RCX]; break;
+    case UNW_X86_64_RSP: addr = &uc->uc_mcontext.gregs[REG_RSP]; break;
+    case UNW_X86_64_RIP: addr = &uc->uc_mcontext.gregs[REG_RIP]; break;
+
+    default:
+      addr = NULL;
+    }
+  return addr;
+}
+
+/* sigreturn() is a no-op on x86_64 glibc.  */
+HIDDEN NORETURN void
+x86_64_sigreturn (unw_cursor_t *cursor)
+{
+  struct cursor *c = (struct cursor *) cursor;
+  struct sigcontext *sc = (struct sigcontext *) c->sigcontext_addr;
+
+  Debug (8, "resuming at ip=%llx via sigreturn(%p)\n",
+             (unsigned long long) c->dwarf.ip, sc);
+  __asm__ __volatile__ ("mov %0, %%rsp;"
+                        "mov %1, %%rax;"
+                        "syscall"
+                        :: "r"(sc), "i"(SYS_rt_sigreturn)
+                        : "memory");
+  abort();
+}
+
+#endif
diff --git a/frysk-imports/libunwind/src/x86_64/Gregs.c b/frysk-imports/libunwind/src/x86_64/Gregs.c
index ddf7b7e..baf8a24 100644
--- a/frysk-imports/libunwind/src/x86_64/Gregs.c
+++ b/frysk-imports/libunwind/src/x86_64/Gregs.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (c) 2002-2004 Hewlett-Packard Development Company, L.P.
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
    Modified for x86_64 by Max Asbock <masbock@us.ibm.com>
 
@@ -41,6 +41,10 @@ linux_scratch_loc (struct cursor *c, unw_regnum_t reg)
     case X86_64_SCF_LINUX_RT_SIGFRAME:
       addr += LINUX_UC_MCONTEXT_OFF;
       break;
+
+    case X86_64_SCF_FREEBSD_SIGFRAME:
+      addr += FREEBSD_UC_MCONTEXT_OFF;
+      break;
     }
 
   return DWARF_REG_LOC (&c->dwarf, reg);
@@ -59,7 +63,7 @@ x86_64_scratch_loc (struct cursor *c, unw_regnum_t reg)
 
 HIDDEN int
 tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
-		 int write)
+                 int write)
 {
   dwarf_loc_t loc = DWARF_NULL_LOC;
   unsigned int mask;
@@ -70,14 +74,14 @@ tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
 
     case UNW_X86_64_RIP:
       if (write)
-	c->dwarf.ip = *valp;		/* also update the RIP cache */
+        c->dwarf.ip = *valp;            /* also update the RIP cache */
       loc = c->dwarf.loc[RIP];
       break;
 
     case UNW_X86_64_CFA:
     case UNW_X86_64_RSP:
       if (write)
-	return -UNW_EREADONLYREG;
+        return -UNW_EREADONLYREG;
       *valp = c->dwarf.cfa;
       return 0;
 
@@ -86,18 +90,18 @@ tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
       arg_num = reg - UNW_X86_64_RAX;
       mask = (1 << arg_num);
       if (write)
-	{
-	  c->dwarf.eh_args[arg_num] = *valp;
-	  c->dwarf.eh_valid_mask |= mask;
-	  return 0;
-	}
+        {
+          c->dwarf.eh_args[arg_num] = *valp;
+          c->dwarf.eh_valid_mask |= mask;
+          return 0;
+        }
       else if ((c->dwarf.eh_valid_mask & mask) != 0)
-	{
-	  *valp = c->dwarf.eh_args[arg_num];
-	  return 0;
-	}
+        {
+          *valp = c->dwarf.eh_args[arg_num];
+          return 0;
+        }
       else
-	loc = c->dwarf.loc[(reg == UNW_X86_64_RAX) ? RAX : RDX];
+        loc = c->dwarf.loc[(reg == UNW_X86_64_RAX) ? RAX : RDX];
       break;
 
     case UNW_X86_64_RCX: loc = c->dwarf.loc[RCX]; break;
@@ -128,7 +132,7 @@ tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
 
 HIDDEN int
 tdep_access_fpreg (struct cursor *c, unw_regnum_t reg, unw_fpreg_t *valp,
-		   int write)
+                   int write)
 {
       return -UNW_EBADREG;
 }
diff --git a/frysk-imports/libunwind/src/x86_64/Gresume.c b/frysk-imports/libunwind/src/x86_64/Gresume.c
index 4edc4da..6880d94 100644
--- a/frysk-imports/libunwind/src/x86_64/Gresume.c
+++ b/frysk-imports/libunwind/src/x86_64/Gresume.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (c) 2002-2004 Hewlett-Packard Development Company, L.P.
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
    Modified for x86_64 by Max Asbock <masbock@us.ibm.com>
 
@@ -27,31 +27,16 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 #include <stdlib.h>
 
+#include "offsets.h"
 #include "unwind_i.h"
 
 #ifndef UNW_REMOTE_ONLY
 
-#include <sys/syscall.h>
-
-/* sigreturn() is a no-op on x86_64 glibc.  */
-
-static NORETURN inline long
-my_rt_sigreturn (void *new_sp)
-{
-  __asm__ __volatile__ ("mov %0, %%rsp;"
-			"mov %1, %%rax;"
-			"syscall"
-			:: "r"(new_sp), "i"(SYS_rt_sigreturn)
-			: "memory");
-  abort ();
-}
-
 HIDDEN inline int
 x86_64_local_resume (unw_addr_space_t as, unw_cursor_t *cursor, void *arg)
 {
-#if defined(__linux)
   struct cursor *c = (struct cursor *) cursor;
-  ucontext_t *uc = c->dwarf.as_arg;
+  ucontext_t *uc = c->uc;
 
   /* Ensure c->pi is up-to-date.  On x86-64, it's relatively common to
      be missing DWARF unwind info.  We don't want to fail in that
@@ -61,21 +46,15 @@ x86_64_local_resume (unw_addr_space_t as, unw_cursor_t *cursor, void *arg)
 
   if (unlikely (c->sigcontext_format != X86_64_SCF_NONE))
     {
-      struct sigcontext *sc = (struct sigcontext *) c->sigcontext_addr;
-
-      Debug (8, "resuming at ip=%llx via sigreturn(%p)\n",
-	     (unsigned long long) c->dwarf.ip, sc);
-      my_rt_sigreturn (sc);
+      x86_64_sigreturn(cursor);
+      abort();
     }
   else
     {
       Debug (8, "resuming at ip=%llx via setcontext()\n",
-	     (unsigned long long) c->dwarf.ip);
-      _x86_64_setcontext (uc);
+             (unsigned long long) c->dwarf.ip);
+      setcontext (uc);
     }
-#else
-# warning Implement me!
-#endif
   return -UNW_EINVAL;
 }
 
@@ -88,9 +67,9 @@ static inline int
 establish_machine_state (struct cursor *c)
 {
   int (*access_reg) (unw_addr_space_t, unw_regnum_t, unw_word_t *,
-		     int write, void *);
+                     int write, void *);
   int (*access_fpreg) (unw_addr_space_t, unw_regnum_t, unw_fpreg_t *,
-		       int write, void *);
+                       int write, void *);
   unw_addr_space_t as = c->dwarf.as;
   void *arg = c->dwarf.as_arg;
   unw_fpreg_t fpval;
@@ -106,15 +85,15 @@ establish_machine_state (struct cursor *c)
     {
       Debug (16, "copying %s %d\n", unw_regname (reg), reg);
       if (unw_is_fpreg (reg))
-	{
-	  if (tdep_access_fpreg (c, reg, &fpval, 0) >= 0)
-	    (*access_fpreg) (as, reg, &fpval, 1, arg);
-	}
+        {
+          if (tdep_access_fpreg (c, reg, &fpval, 0) >= 0)
+            (*access_fpreg) (as, reg, &fpval, 1, arg);
+        }
       else
-	{
-	  if (tdep_access_reg (c, reg, &val, 0) >= 0)
-	    (*access_reg) (as, reg, &val, 1, arg);
-	}
+        {
+          if (tdep_access_reg (c, reg, &val, 0) >= 0)
+            (*access_reg) (as, reg, &val, 1, arg);
+        }
     }
   return 0;
 }
@@ -131,5 +110,5 @@ unw_resume (unw_cursor_t *cursor)
     return ret;
 
   return (*c->dwarf.as->acc.resume) (c->dwarf.as, (unw_cursor_t *) c,
-				     c->dwarf.as_arg);
+                                     c->dwarf.as_arg);
 }
diff --git a/frysk-imports/libunwind/src/x86_64/Gstash_frame.c b/frysk-imports/libunwind/src/x86_64/Gstash_frame.c
new file mode 100644
index 0000000..dc6c7c8
--- /dev/null
+++ b/frysk-imports/libunwind/src/x86_64/Gstash_frame.c
@@ -0,0 +1,98 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2010, 2011 by FERMI NATIONAL ACCELERATOR LABORATORY
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "unwind_i.h"
+#include "ucontext_i.h"
+
+HIDDEN void
+tdep_stash_frame (struct dwarf_cursor *d, struct dwarf_reg_state *rs)
+{
+  struct cursor *c = (struct cursor *) dwarf_to_cursor (d);
+  unw_tdep_frame_t *f = &c->frame_info;
+
+  Debug (4, "ip=0x%lx cfa=0x%lx type %d cfa [where=%d val=%ld] cfaoff=%ld"
+         " ra=0x%lx rbp [where=%d val=%ld @0x%lx] rsp [where=%d val=%ld @0x%lx]\n",
+         d->ip, d->cfa, f->frame_type,
+         rs->reg[DWARF_CFA_REG_COLUMN].where,
+         rs->reg[DWARF_CFA_REG_COLUMN].val,
+         rs->reg[DWARF_CFA_OFF_COLUMN].val,
+         DWARF_GET_LOC(d->loc[d->ret_addr_column]),
+         rs->reg[RBP].where, rs->reg[RBP].val, DWARF_GET_LOC(d->loc[RBP]),
+         rs->reg[RSP].where, rs->reg[RSP].val, DWARF_GET_LOC(d->loc[RSP]));
+
+  /* A standard frame is defined as:
+      - CFA is register-relative offset off RBP or RSP;
+      - Return address is saved at CFA-8;
+      - RBP is unsaved or saved at CFA+offset, offset != -1;
+      - RSP is unsaved or saved at CFA+offset, offset != -1.  */
+  if (f->frame_type == UNW_X86_64_FRAME_OTHER
+      && (rs->reg[DWARF_CFA_REG_COLUMN].where == DWARF_WHERE_REG)
+      && (rs->reg[DWARF_CFA_REG_COLUMN].val == RBP
+          || rs->reg[DWARF_CFA_REG_COLUMN].val == RSP)
+      && labs((long) rs->reg[DWARF_CFA_OFF_COLUMN].val) < (1 << 29)
+      && DWARF_GET_LOC(d->loc[d->ret_addr_column]) == d->cfa-8
+      && (rs->reg[RBP].where == DWARF_WHERE_UNDEF
+          || rs->reg[RBP].where == DWARF_WHERE_SAME
+          || (rs->reg[RBP].where == DWARF_WHERE_CFAREL
+              && labs((long) rs->reg[RBP].val) < (1 << 14)
+              && rs->reg[RBP].val+1 != 0))
+      && (rs->reg[RSP].where == DWARF_WHERE_UNDEF
+          || rs->reg[RSP].where == DWARF_WHERE_SAME
+          || (rs->reg[RSP].where == DWARF_WHERE_CFAREL
+              && labs((long) rs->reg[RSP].val) < (1 << 14)
+              && rs->reg[RSP].val+1 != 0)))
+  {
+    /* Save information for a standard frame. */
+    f->frame_type = UNW_X86_64_FRAME_STANDARD;
+    f->cfa_reg_rsp = (rs->reg[DWARF_CFA_REG_COLUMN].val == RSP);
+    f->cfa_reg_offset = rs->reg[DWARF_CFA_OFF_COLUMN].val;
+    if (rs->reg[RBP].where == DWARF_WHERE_CFAREL)
+      f->rbp_cfa_offset = rs->reg[RBP].val;
+    if (rs->reg[RSP].where == DWARF_WHERE_CFAREL)
+      f->rsp_cfa_offset = rs->reg[RSP].val;
+    Debug (4, " standard frame\n");
+  }
+
+  /* Signal frame was detected via augmentation in tdep_fetch_frame()  */
+  else if (f->frame_type == UNW_X86_64_FRAME_SIGRETURN)
+  {
+    /* Later we are going to fish out {RBP,RSP,RIP} from sigcontext via
+       their ucontext_t offsets.  Confirm DWARF info agrees with the
+       offsets we expect.  */
+
+#ifndef NDEBUG
+    const unw_word_t uc = c->sigcontext_addr;
+
+    assert (DWARF_GET_LOC(d->loc[RIP]) - uc == UC_MCONTEXT_GREGS_RIP);
+    assert (DWARF_GET_LOC(d->loc[RBP]) - uc == UC_MCONTEXT_GREGS_RBP);
+    assert (DWARF_GET_LOC(d->loc[RSP]) - uc == UC_MCONTEXT_GREGS_RSP);
+#endif
+
+    Debug (4, " sigreturn frame\n");
+  }
+
+  /* PLT and guessed RBP-walked frames are handled in unw_step(). */
+  else
+    Debug (4, " unusual frame\n");
+}
diff --git a/frysk-imports/libunwind/src/x86_64/Gstep.c b/frysk-imports/libunwind/src/x86_64/Gstep.c
index e5ed7b9..84b3728 100644
--- a/frysk-imports/libunwind/src/x86_64/Gstep.c
+++ b/frysk-imports/libunwind/src/x86_64/Gstep.c
@@ -1,12 +1,9 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2002-2004 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
    Modified for x86_64 by Max Asbock <masbock@us.ibm.com>
 
-   Copyright (C) 2008 Red Hat, Inc.
-	Contributed by Mark Wielaard <mwielaard@redhat.com>
-
 This file is part of libunwind.
 
 Permission is hereby granted, free of charge, to any person obtaining
@@ -29,135 +26,53 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 #include "unwind_i.h"
-#include "ucontext_i.h"
 #include <signal.h>
 
-/* Try to skip single-word (8 bytes) return address on stack left there in some
-   cases of the signal frame.
-   Unsure if the real return address gets pushed to the stack exactly when this
-   bit is set.  If it is not detectable we would need to keep the return
-   address on stack and improve the code path
-   	dwarf_step() failed (ret=%d), trying frame-chain
-   below to disassemble the return address and not to pop two words
-   automatically as no stack frame pointer is present in these cases there:
-   	./test-ptrace-signull code_entry_point: err=0x14
-   	./test-ptrace-signull code_descriptor:  err=0x15  */
-
+/* Recognise PLT entries such as:
+     3bdf0: ff 25 e2 49 13 00 jmpq   *0x1349e2(%rip)
+     3bdf6: 68 ae 03 00 00    pushq  $0x3ae
+     3bdfb: e9 00 c5 ff ff    jmpq   38300 <_init+0x18> */
 static int
-code_descriptor_trap (struct cursor *c, struct dwarf_loc *rip_loc_pointer)
+is_plt_entry (struct dwarf_cursor *c)
 {
-  unw_word_t trapno, err;
-  int i;
-
-  if (c->sigcontext_format != X86_64_SCF_LINUX_RT_SIGFRAME)
-    return -UNW_EBADFRAME;
-
-  i = dwarf_get (&c->dwarf, DWARF_LOC (c->sigcontext_addr + UC_MCONTEXT_GREGS_TRAPNO, 0), &trapno);
-  if (i < 0)
-    {
-      Debug (2, "failed to query [sigframe:trapno]; %d\n", i);
-      return i;
-    }
-  /* page fault */
-  if (trapno != UC_MCONTEXT_GREGS_TRAPNO_PF)
-    {
-      Debug (2, "[sigframe:trapno] %d not Page-Fault Exception\n", (int) trapno);
-      return -UNW_EBADFRAME;
-    }
-
-  i = dwarf_get (&c->dwarf, DWARF_LOC (c->sigcontext_addr + UC_MCONTEXT_GREGS_ERR, 0), &err);
-  if (i < 0)
-    {
-      Debug (2, "failed to query [sigframe:err]; %d\n", i);
-      return i;
-    }
-  if (!(err & (1 << UC_MCONTEXT_GREGS_ERR_ID_BIT)))
-    {
-      Debug (2, "[sigframe:err] 0x%x not &0x%x (instruction fetch)\n",
-	     (int) err, (1 << UC_MCONTEXT_GREGS_ERR_ID_BIT));
-      return -UNW_EBADFRAME;
-    }
-
-  Debug (1, "[sigframe] Page-Fault Exception, instruction fetch (err = 0x%x)\n", (int) err);
+  unw_word_t w0, w1;
+  unw_accessors_t *a;
+  int ret;
 
-  *rip_loc_pointer = DWARF_LOC (c->dwarf.cfa, 0);
-  c->dwarf.cfa += 8;
+  a = unw_get_accessors (c->as);
+  if ((ret = (*a->access_mem) (c->as, c->ip, &w0, 0, c->as_arg)) < 0
+      || (ret = (*a->access_mem) (c->as, c->ip + 8, &w1, 0, c->as_arg)) < 0)
+    return 0;
 
-  return 1;
-}
+  ret = (((w0 & 0xffff) == 0x25ff)
+         && (((w0 >> 48) & 0xff) == 0x68)
+         && (((w1 >> 24) & 0xff) == 0xe9));
 
-// A CALL instruction starts with 0xFF.
-static int
-is_call_instr_at (struct cursor *c, unw_word_t addr)
-{
-  int ret;
-  unw_word_t instr;
-  ret = dwarf_get (&c->dwarf, DWARF_LOC (addr, 0), &instr);
-  Debug (99, "ret %d, instr 0x%x\n", ret, instr);
-  return ret >= 0 && ((instr & 0xff000000) == 0xff000000);
-}
-
-// Checks whether this looks like a plt entry like cursor and returns
-// the stack offset where the return address can be found, or -1 if
-// not detected (also tries to make sure this is the inner most frame).
-// When this function returns positively (zero included) addr will
-// contain the return address.
-static int
-init_stack_based_ret (struct cursor *c, unw_word_t *addr)
-{
-  // See if this looks "clean", everything in actual registers
-  // which indicates this is most likely an inner most frame just
-  // initted.
-  int ret;
-  unw_word_t ip, cfa;
-  ret = dwarf_get (&c->dwarf, c->dwarf.loc[RIP], &ip);
-  if (ret < 0)
-    return ret;
-  
-  ret = dwarf_get (&c->dwarf, c->dwarf.loc[RSP], &cfa);
-  if (ret < 0)
-    return ret;
-  
-  // See if one of the top 3 elements on the stack contains a
-  // return address.
-  int i;
-  for (i = 0; i <= 16; i += 8)
-    {
-      Debug (99, "trying %d\n", i);
-      ret = dwarf_get (&c->dwarf, DWARF_LOC (c->dwarf.cfa + i, 0), addr);
-      if (ret < 0)
-	      return ret;
-      
-      Debug (99, "addr at %d: 0x%x\n", i, *addr);
-      // Sanity check the address, not too low, and must
-      // come from a call instruction.
-      if (*addr > 0 && is_call_instr_at(c, (*addr) - 5))
-	return i;
-    }
-  
-  return -1;
+  Debug (14, "ip=0x%lx => 0x%016lx 0x%016lx, ret = %d\n", c->ip, w0, w1, ret);
+  return ret;
 }
 
-
 PROTECTED int
 unw_step (unw_cursor_t *cursor)
 {
   struct cursor *c = (struct cursor *) cursor;
   int ret, i;
-  struct dwarf_loc rip_loc;
-  int rip_loc_set = 0;
-  unw_word_t prev_ip = c->dwarf.ip, prev_cfa = c->dwarf.cfa;
-  unw_word_t addr;
 
-  Debug (1, "(cursor=%p, ip=0x%016llx)\n",
-	 c, (unsigned long long) c->dwarf.ip);
+#if CONSERVATIVE_CHECKS
+  int val = c->validate;
+  c->validate = 1;
+#endif
+
+  Debug (1, "(cursor=%p, ip=0x%016lx, cfa=0x%016lx)\n",
+         c, c->dwarf.ip, c->dwarf.cfa);
 
   /* Try DWARF-based unwinding... */
+  c->sigcontext_format = X86_64_SCF_NONE;
   ret = dwarf_step (&c->dwarf);
 
-  /* Skip the faulty address left alone on the stack.  */
-  if (ret >= 0 && code_descriptor_trap (c, &rip_loc) > 0)
-    rip_loc_set = 1;
+#if CONSERVATIVE_CHECKS
+  c->validate = val;
+#endif
 
   if (ret < 0 && ret != -UNW_ENOINFO)
     {
@@ -165,166 +80,151 @@ unw_step (unw_cursor_t *cursor)
       return ret;
     }
 
-  if (c->sigcontext_format == X86_64_SCF_LINUX_RT_SIGFRAME)
+  if (likely (ret >= 0))
     {
-      unw_word_t trapno, err;
-      int trapno_ret, err_ret;
-
-      trapno_ret = dwarf_get (&c->dwarf, DWARF_LOC (c->sigcontext_addr + UC_MCONTEXT_GREGS_TRAPNO, 0), &trapno);
-      err_ret = dwarf_get (&c->dwarf, DWARF_LOC (c->sigcontext_addr + UC_MCONTEXT_GREGS_ERR, 0), &err);
-
-      Debug (2, "x86_64 sigcontext (post-step): CFA = 0x%lx, trapno = %d, err = 0x%x\n",
-	     (unsigned long) c->dwarf.cfa, (trapno_ret < 0 ? -1 : (int) trapno),
-	     (err_ret < 0 ? -1 : (int) err));
+      /* x86_64 ABI specifies that end of call-chain is marked with a
+         NULL RBP or undefined return address  */
+        if (DWARF_IS_NULL_LOC (c->dwarf.loc[RBP])
+            || DWARF_IS_NULL_LOC(c->dwarf.loc[c->dwarf.ret_addr_column]))
+          {
+            c->dwarf.ip = 0;
+            ret = 0;
+          }
     }
-
-  if (unlikely (ret < 0))
+  else
     {
       /* DWARF failed.  There isn't much of a usable frame-chain on x86-64,
-	 but we do need to handle two special-cases:
+         but we do need to handle two special-cases:
+
+          (i) signal trampoline: Old kernels and older libcs don't
+              export the vDSO needed to get proper unwind info for the
+              trampoline.  Recognize that case by looking at the code
+              and filling in things by hand.
 
-	  (i) signal trampoline: Old kernels and older libcs don't
-	      export the vDSO needed to get proper unwind info for the
-	      trampoline.  Recognize that case by looking at the code
-	      and filling in things by hand.
+          (ii) PLT (shared-library) call-stubs: PLT stubs are invoked
+              via CALLQ.  Try this for all non-signal trampoline
+              code.  */
 
-	  (ii) PLT (shared-library) call-stubs: PLT stubs are invoked
-	      via CALLQ.  Try this for all non-signal trampoline
-	      code.  */
+      unw_word_t prev_ip = c->dwarf.ip, prev_cfa = c->dwarf.cfa;
+      struct dwarf_loc rbp_loc, rsp_loc, rip_loc;
 
-      struct dwarf_loc rbp_loc, rsp_loc;
+      /* We could get here because of missing/bad unwind information.
+         Validate all addresses before dereferencing. */
+      c->validate = 1;
 
       Debug (13, "dwarf_step() failed (ret=%d), trying frame-chain\n", ret);
 
-      if (c->dwarf.ip == 0)
+      if (unw_is_signal_frame (cursor))
+        {
+          ret = unw_handle_signal_frame(cursor);
+          if (ret < 0)
+            {
+              Debug (2, "returning 0\n");
+              return 0;
+            }
+        }
+      else if (is_plt_entry (&c->dwarf))
         {
-	  Debug (1, "[RIP=0]\n");
-
-	  rip_loc = DWARF_LOC (c->dwarf.cfa, 0);
-	  c->dwarf.cfa += 8;
-	}
-      else if (unw_is_signal_frame (cursor))
-	{
-	  unw_word_t ucontext = c->dwarf.cfa;
-
-	  Debug(1, "signal frame, skip over trampoline\n");
-
-	  c->sigcontext_format = X86_64_SCF_LINUX_RT_SIGFRAME;
-	  c->sigcontext_addr = c->dwarf.cfa;
-
-	  rsp_loc = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_RSP, 0);
-	  rbp_loc = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_RBP, 0);
-	  rip_loc = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_RIP, 0);
-
-	  ret = dwarf_get (&c->dwarf, rsp_loc, &c->dwarf.cfa);
-	  if (ret < 0)
-	    {
-	      Debug (2, "returning %d\n", ret);
-	      return ret;
-	    }
-
-	  c->dwarf.loc[RAX] = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_RAX, 0);
-	  c->dwarf.loc[RDX] = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_RDX, 0);
-	  c->dwarf.loc[RCX] = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_RCX, 0);
-	  c->dwarf.loc[RBX] = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_RBX, 0);
-	  c->dwarf.loc[RSI] = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_RSI, 0);
-	  c->dwarf.loc[RDI] = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_RDI, 0);
-	  c->dwarf.loc[RBP] = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_RBP, 0);
-	  c->dwarf.loc[ R8] = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R8, 0);
-	  c->dwarf.loc[ R9] = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R9, 0);
-	  c->dwarf.loc[R10] = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R10, 0);
-	  c->dwarf.loc[R11] = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R11, 0);
-	  c->dwarf.loc[R12] = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R12, 0);
-	  c->dwarf.loc[R13] = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R13, 0);
-	  c->dwarf.loc[R14] = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R14, 0);
-	  c->dwarf.loc[R15] = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R15, 0);
-	  c->dwarf.loc[RIP] = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_RIP, 0);
-
-	  c->dwarf.loc[RBP] = rbp_loc;
-	  c->dwarf.loc[RSP] = rsp_loc;
-	}
-      else if((ret = init_stack_based_ret(c, &addr)) >= 0)
-	{
-	  Debug (99, "init_stack_based_ret() %d (0x%x)\n", ret, addr);
-	  c->dwarf.cfa += ret + 8;
-	  c->dwarf.loc[RSP] = DWARF_LOC (c->dwarf.cfa, 0);
-	  c->dwarf.loc[RIP] = DWARF_LOC (addr, 0);
-	  c->dwarf.ret_addr_column = RIP;
-	  c->dwarf.ip = addr;
-	  return 1;
-	}
+          /* Like regular frame, CFA = RSP+8, RA = [CFA-8], no regs saved. */
+          Debug (2, "found plt entry\n");
+          c->frame_info.cfa_reg_offset = 8;
+          c->frame_info.cfa_reg_rsp = -1;
+          c->frame_info.frame_type = UNW_X86_64_FRAME_STANDARD;
+          c->dwarf.loc[RIP] = DWARF_LOC (c->dwarf.cfa, 0);
+          c->dwarf.cfa += 8;
+        }
+      else if (DWARF_IS_NULL_LOC (c->dwarf.loc[RBP]))
+        {
+          for (i = 0; i < DWARF_NUM_PRESERVED_REGS; ++i)
+            c->dwarf.loc[i] = DWARF_NULL_LOC;
+        }
       else
-	{
-	  unw_word_t rbp;
-
-	  ret = dwarf_get (&c->dwarf, c->dwarf.loc[RBP], &rbp);
-	  if (ret < 0)
-	    {
-	      Debug (2, "returning %d\n", ret);
-	      return ret;
-	    }
-
-	  if (!rbp)
-	    {
-	      /* Looks like we may have reached the end of the call-chain.  */
-	      rbp_loc = DWARF_NULL_LOC;
-	      rsp_loc = DWARF_NULL_LOC;
-	      rip_loc = DWARF_NULL_LOC;
-	    }
-	  else
-	    {
-	      unw_word_t rbp1;
-	      Debug (1, "[RBP=0x%Lx] = 0x%Lx (cfa = 0x%Lx)\n",
-		     (unsigned long long) DWARF_GET_LOC (c->dwarf.loc[RBP]),
-		     (unsigned long long) rbp,
-		     (unsigned long long) c->dwarf.cfa);
-
-	      rbp_loc = DWARF_LOC(rbp, 0);
-	      rsp_loc = DWARF_NULL_LOC;
-	      rip_loc = DWARF_LOC (rbp + 8, 0);
-              /* Heuristic to recognize a bogus frame pointer */
-	      ret = dwarf_get (&c->dwarf, rbp_loc, &rbp1);
-              if (ret || ((rbp1 - rbp) > 0x4000))
-                rbp_loc = DWARF_NULL_LOC;
-	      c->dwarf.cfa += 16;
-	    }
-
-	  /* Mark all registers unsaved */
-	  for (i = 0; i < DWARF_NUM_PRESERVED_REGS; ++i)
-	    c->dwarf.loc[i] = DWARF_NULL_LOC;
-
-	  c->dwarf.loc[RBP] = rbp_loc;
-	  c->dwarf.loc[RSP] = rsp_loc;
-	}
-      rip_loc_set = 1;
-    }
-  if (rip_loc_set)
-    {
-      c->dwarf.loc[RIP] = rip_loc;
+        {
+          unw_word_t rbp;
+
+          ret = dwarf_get (&c->dwarf, c->dwarf.loc[RBP], &rbp);
+          if (ret < 0)
+            {
+              Debug (2, "returning %d [RBP=0x%lx]\n", ret,
+                     DWARF_GET_LOC (c->dwarf.loc[RBP]));
+              return ret;
+            }
+
+          if (!rbp)
+            {
+              /* Looks like we may have reached the end of the call-chain.  */
+              rbp_loc = DWARF_NULL_LOC;
+              rsp_loc = DWARF_NULL_LOC;
+              rip_loc = DWARF_NULL_LOC;
+            }
+          else
+            {
+              unw_word_t rbp1 = 0;
+              rbp_loc = DWARF_LOC(rbp, 0);
+              rsp_loc = DWARF_NULL_LOC;
+              rip_loc = DWARF_LOC (rbp + 8, 0);
+              ret = dwarf_get (&c->dwarf, rbp_loc, &rbp1);
+              Debug (1, "[RBP=0x%lx] = 0x%lx (cfa = 0x%lx) -> 0x%lx\n",
+                     (unsigned long) DWARF_GET_LOC (c->dwarf.loc[RBP]),
+                     rbp, c->dwarf.cfa, rbp1);
+
+              /* Heuristic to determine incorrect guess.  For RBP to be a
+                 valid frame it needs to be above current CFA, but don't
+                 let it go more than a little.  Note that we can't deduce
+                 anything about new RBP (rbp1) since it may not be a frame
+                 pointer in the frame above.  Just check we get the value. */
+              if (ret < 0
+                  || rbp < c->dwarf.cfa
+                  || (rbp - c->dwarf.cfa) > 0x4000)
+                {
+                  rip_loc = DWARF_NULL_LOC;
+                  rbp_loc = DWARF_NULL_LOC;
+                }
+
+              c->frame_info.frame_type = UNW_X86_64_FRAME_GUESSED;
+              c->frame_info.cfa_reg_rsp = 0;
+              c->frame_info.cfa_reg_offset = 16;
+              c->frame_info.rbp_cfa_offset = -16;
+              c->dwarf.cfa += 16;
+            }
+
+          /* Mark all registers unsaved */
+          for (i = 0; i < DWARF_NUM_PRESERVED_REGS; ++i)
+            c->dwarf.loc[i] = DWARF_NULL_LOC;
+
+          c->dwarf.loc[RBP] = rbp_loc;
+          c->dwarf.loc[RSP] = rsp_loc;
+          c->dwarf.loc[RIP] = rip_loc;
+          c->dwarf.use_prev_instr = 1;
+        }
+
       c->dwarf.ret_addr_column = RIP;
 
-      /* x86_64 ABI specifies that end of call-chain is marked with a
-	 NULL RBP.  */
-      if (!DWARF_IS_NULL_LOC (c->dwarf.loc[RBP]))
-	{
-	  ret = dwarf_get (&c->dwarf, c->dwarf.loc[RIP], &c->dwarf.ip);
-	  Debug (1, "Frame Chain [RIP=0x%Lx] = 0x%Lx\n",
-		     (unsigned long long) DWARF_GET_LOC (c->dwarf.loc[RIP]),
-		     (unsigned long long) c->dwarf.ip);
-	  if (ret < 0)
-	    {
-	      Debug (2, "returning %d\n", ret);
-	      return ret;
-	    }
-	}
+      if (DWARF_IS_NULL_LOC (c->dwarf.loc[RBP]))
+        {
+          ret = 0;
+          Debug (2, "NULL %%rbp loc, returning %d\n", ret);
+          return ret;
+        }
+      if (!DWARF_IS_NULL_LOC (c->dwarf.loc[RIP]))
+        {
+          ret = dwarf_get (&c->dwarf, c->dwarf.loc[RIP], &c->dwarf.ip);
+          Debug (1, "Frame Chain [RIP=0x%Lx] = 0x%Lx\n",
+                     (unsigned long long) DWARF_GET_LOC (c->dwarf.loc[RIP]),
+                     (unsigned long long) c->dwarf.ip);
+          if (ret < 0)
+            {
+              Debug (2, "returning %d\n", ret);
+              return ret;
+            }
+          ret = 1;
+        }
       else
-	c->dwarf.ip = 0;
-    }
+        c->dwarf.ip = 0;
 
-  if (c->dwarf.ip == prev_ip && c->dwarf.cfa == prev_cfa)
-    return -UNW_EBADFRAME;
-
-  ret = (c->dwarf.ip == 0) ? 0 : 1;
-  Debug (2, "dwarf.ip = 0x%x, returning %d\n", c->dwarf.ip, ret);
+      if (c->dwarf.ip == prev_ip && c->dwarf.cfa == prev_cfa)
+        return -UNW_EBADFRAME;
+    }
+  Debug (2, "returning %d\n", ret);
   return ret;
 }
diff --git a/frysk-imports/libunwind/src/x86_64/Gtrace.c b/frysk-imports/libunwind/src/x86_64/Gtrace.c
new file mode 100644
index 0000000..833d7a7
--- /dev/null
+++ b/frysk-imports/libunwind/src/x86_64/Gtrace.c
@@ -0,0 +1,533 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2010, 2011 by FERMI NATIONAL ACCELERATOR LABORATORY
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "unwind_i.h"
+#include "ucontext_i.h"
+#include <signal.h>
+#include <limits.h>
+
+#pragma weak pthread_once
+#pragma weak pthread_key_create
+#pragma weak pthread_getspecific
+#pragma weak pthread_setspecific
+
+/* Initial hash table size. Table expands by 2 bits (times four). */
+#define HASH_MIN_BITS 14
+
+typedef struct
+{
+  unw_tdep_frame_t *frames;
+  size_t log_size;
+  size_t used;
+  size_t dtor_count;  /* Counts how many times our destructor has already
+                         been called. */
+} unw_trace_cache_t;
+
+static const unw_tdep_frame_t empty_frame = { 0, UNW_X86_64_FRAME_OTHER, -1, -1, 0, -1, -1 };
+static define_lock (trace_init_lock);
+static pthread_once_t trace_cache_once = PTHREAD_ONCE_INIT;
+static sig_atomic_t trace_cache_once_happen;
+static pthread_key_t trace_cache_key;
+static struct mempool trace_cache_pool;
+static __thread  unw_trace_cache_t *tls_cache;
+static __thread  int tls_cache_destroyed;
+
+/* Free memory for a thread's trace cache. */
+static void
+trace_cache_free (void *arg)
+{
+  unw_trace_cache_t *cache = arg;
+  if (++cache->dtor_count < PTHREAD_DESTRUCTOR_ITERATIONS)
+  {
+    /* Not yet our turn to get destroyed. Re-install ourselves into the key. */
+    pthread_setspecific(trace_cache_key, cache);
+    Debug(5, "delayed freeing cache %p (%zx to go)\n", cache,
+          PTHREAD_DESTRUCTOR_ITERATIONS - cache->dtor_count);
+    return;
+  }
+  tls_cache_destroyed = 1;
+  tls_cache = NULL;
+  munmap (cache->frames, (1u << cache->log_size) * sizeof(unw_tdep_frame_t));
+  mempool_free (&trace_cache_pool, cache);
+  Debug(5, "freed cache %p\n", cache);
+}
+
+/* Initialise frame tracing for threaded use. */
+static void
+trace_cache_init_once (void)
+{
+  pthread_key_create (&trace_cache_key, &trace_cache_free);
+  mempool_init (&trace_cache_pool, sizeof (unw_trace_cache_t), 0);
+  trace_cache_once_happen = 1;
+}
+
+static unw_tdep_frame_t *
+trace_cache_buckets (size_t n)
+{
+  unw_tdep_frame_t *frames;
+  size_t i;
+
+  GET_MEMORY(frames, n * sizeof (unw_tdep_frame_t));
+  if (likely(frames != NULL))
+    for (i = 0; i < n; ++i)
+      frames[i] = empty_frame;
+
+  return frames;
+}
+
+/* Allocate and initialise hash table for frame cache lookups.
+   Returns the cache initialised with (1u << HASH_LOW_BITS) hash
+   buckets, or NULL if there was a memory allocation problem. */
+static unw_trace_cache_t *
+trace_cache_create (void)
+{
+  unw_trace_cache_t *cache;
+
+  if (tls_cache_destroyed)
+  {
+    /* The current thread is in the process of exiting. Don't recreate
+       cache, as we wouldn't have another chance to free it. */
+    Debug(5, "refusing to reallocate cache: "
+             "thread-locals are being deallocated\n");
+    return NULL;
+  }
+
+  if (! (cache = mempool_alloc(&trace_cache_pool)))
+  {
+    Debug(5, "failed to allocate cache\n");
+    return NULL;
+  }
+
+  if (! (cache->frames = trace_cache_buckets(1u << HASH_MIN_BITS)))
+  {
+    Debug(5, "failed to allocate buckets\n");
+    mempool_free(&trace_cache_pool, cache);
+    return NULL;
+  }
+
+  cache->log_size = HASH_MIN_BITS;
+  cache->used = 0;
+  cache->dtor_count = 0;
+  tls_cache_destroyed = 0;  /* Paranoia: should already be 0. */
+  Debug(5, "allocated cache %p\n", cache);
+  return cache;
+}
+
+/* Expand the hash table in the frame cache if possible. This always
+   quadruples the hash size, and clears all previous frame entries. */
+static int
+trace_cache_expand (unw_trace_cache_t *cache)
+{
+  size_t old_size = (1u << cache->log_size);
+  size_t new_log_size = cache->log_size + 2;
+  unw_tdep_frame_t *new_frames = trace_cache_buckets (1u << new_log_size);
+
+  if (unlikely(! new_frames))
+  {
+    Debug(5, "failed to expand cache to 2^%lu buckets\n", new_log_size);
+    return -UNW_ENOMEM;
+  }
+
+  Debug(5, "expanded cache from 2^%lu to 2^%lu buckets\n", cache->log_size, new_log_size);
+  munmap(cache->frames, old_size * sizeof(unw_tdep_frame_t));
+  cache->frames = new_frames;
+  cache->log_size = new_log_size;
+  cache->used = 0;
+  return 0;
+}
+
+static unw_trace_cache_t *
+trace_cache_get_unthreaded (void)
+{
+  unw_trace_cache_t *cache;
+  intrmask_t saved_mask;
+  static unw_trace_cache_t *global_cache = NULL;
+  lock_acquire (&trace_init_lock, saved_mask);
+  if (! global_cache)
+  {
+    mempool_init (&trace_cache_pool, sizeof (unw_trace_cache_t), 0);
+    global_cache = trace_cache_create ();
+  }
+  cache = global_cache;
+  lock_release (&trace_init_lock, saved_mask);
+  Debug(5, "using cache %p\n", cache);
+  return cache;
+}
+
+/* Get the frame cache for the current thread. Create it if there is none. */
+static unw_trace_cache_t *
+trace_cache_get (void)
+{
+  unw_trace_cache_t *cache;
+  if (likely (pthread_once != NULL))
+  {
+    pthread_once(&trace_cache_once, &trace_cache_init_once);
+    if (!trace_cache_once_happen)
+    {
+      return trace_cache_get_unthreaded();
+    }
+    if (! (cache = tls_cache))
+    {
+      cache = trace_cache_create();
+      pthread_setspecific(trace_cache_key, cache);
+      tls_cache = cache;
+    }
+    Debug(5, "using cache %p\n", cache);
+    return cache;
+  }
+  else
+  {
+    return trace_cache_get_unthreaded();
+  }
+}
+
+/* Initialise frame properties for address cache slot F at address
+   RIP using current CFA, RBP and RSP values.  Modifies CURSOR to
+   that location, performs one unw_step(), and fills F with what
+   was discovered about the location.  Returns F.
+
+   FIXME: This probably should tell DWARF handling to never evaluate
+   or use registers other than RBP, RSP and RIP in case there is
+   highly unusual unwind info which uses these creatively. */
+static unw_tdep_frame_t *
+trace_init_addr (unw_tdep_frame_t *f,
+                 unw_cursor_t *cursor,
+                 unw_word_t cfa,
+                 unw_word_t rip,
+                 unw_word_t rbp,
+                 unw_word_t rsp)
+{
+  struct cursor *c = (struct cursor *) cursor;
+  struct dwarf_cursor *d = &c->dwarf;
+  int ret = -UNW_EINVAL;
+
+  /* Initialise frame properties: unknown, not last. */
+  f->virtual_address = rip;
+  f->frame_type = UNW_X86_64_FRAME_OTHER;
+  f->last_frame = 0;
+  f->cfa_reg_rsp = -1;
+  f->cfa_reg_offset = 0;
+  f->rbp_cfa_offset = -1;
+  f->rsp_cfa_offset = -1;
+
+  /* Reinitialise cursor to this instruction - but undo next/prev RIP
+     adjustment because unw_step will redo it - and force RIP, RBP
+     RSP into register locations (=~ ucontext we keep), then set
+     their desired values. Then perform the step. */
+  d->ip = rip + d->use_prev_instr;
+  d->cfa = cfa;
+  d->loc[UNW_X86_64_RIP] = DWARF_REG_LOC (d, UNW_X86_64_RIP);
+  d->loc[UNW_X86_64_RBP] = DWARF_REG_LOC (d, UNW_X86_64_RBP);
+  d->loc[UNW_X86_64_RSP] = DWARF_REG_LOC (d, UNW_X86_64_RSP);
+  c->frame_info = *f;
+
+  if (likely(dwarf_put (d, d->loc[UNW_X86_64_RIP], rip) >= 0)
+      && likely(dwarf_put (d, d->loc[UNW_X86_64_RBP], rbp) >= 0)
+      && likely(dwarf_put (d, d->loc[UNW_X86_64_RSP], rsp) >= 0)
+      && likely((ret = unw_step (cursor)) >= 0))
+    *f = c->frame_info;
+
+  /* If unw_step() stopped voluntarily, remember that, even if it
+     otherwise could not determine anything useful.  This avoids
+     failing trace if we hit frames without unwind info, which is
+     common for the outermost frame (CRT stuff) on many systems.
+     This avoids failing trace in very common circumstances; failing
+     to unw_step() loop wouldn't produce any better result. */
+  if (ret == 0)
+    f->last_frame = -1;
+
+  Debug (3, "frame va %lx type %d last %d cfa %s+%d rbp @ cfa%+d rsp @ cfa%+d\n",
+         f->virtual_address, f->frame_type, f->last_frame,
+         f->cfa_reg_rsp ? "rsp" : "rbp", f->cfa_reg_offset,
+         f->rbp_cfa_offset, f->rsp_cfa_offset);
+
+  return f;
+}
+
+/* Look up and if necessary fill in frame attributes for address RIP
+   in CACHE using current CFA, RBP and RSP values.  Uses CURSOR to
+   perform any unwind steps necessary to fill the cache.  Returns the
+   frame cache slot which describes RIP. */
+static unw_tdep_frame_t *
+trace_lookup (unw_cursor_t *cursor,
+              unw_trace_cache_t *cache,
+              unw_word_t cfa,
+              unw_word_t rip,
+              unw_word_t rbp,
+              unw_word_t rsp)
+{
+  /* First look up for previously cached information using cache as
+     linear probing hash table with probe step of 1.  Majority of
+     lookups should be completed within few steps, but it is very
+     important the hash table does not fill up, or performance falls
+     off the cliff. */
+  uint64_t i, addr;
+  uint64_t cache_size = 1u << cache->log_size;
+  uint64_t slot = ((rip * 0x9e3779b97f4a7c16) >> 43) & (cache_size-1);
+  unw_tdep_frame_t *frame;
+
+  for (i = 0; i < 16; ++i)
+  {
+    frame = &cache->frames[slot];
+    addr = frame->virtual_address;
+
+    /* Return if we found the address. */
+    if (likely(addr == rip))
+    {
+      Debug (4, "found address after %ld steps\n", i);
+      return frame;
+    }
+
+    /* If slot is empty, reuse it. */
+    if (likely(! addr))
+      break;
+
+    /* Linear probe to next slot candidate, step = 1. */
+    if (++slot >= cache_size)
+      slot -= cache_size;
+  }
+
+  /* If we collided after 16 steps, or if the hash is more than half
+     full, force the hash to expand. Fill the selected slot, whether
+     it's free or collides. Note that hash expansion drops previous
+     contents; further lookups will refill the hash. */
+  Debug (4, "updating slot %lu after %ld steps, replacing 0x%lx\n", slot, i, addr);
+  if (unlikely(addr || cache->used >= cache_size / 2))
+  {
+    if (unlikely(trace_cache_expand (cache) < 0))
+      return NULL;
+
+    cache_size = 1u << cache->log_size;
+    slot = ((rip * 0x9e3779b97f4a7c16) >> 43) & (cache_size-1);
+    frame = &cache->frames[slot];
+    addr = frame->virtual_address;
+  }
+
+  if (! addr)
+    ++cache->used;
+
+  return trace_init_addr (frame, cursor, cfa, rip, rbp, rsp);
+}
+
+/* Fast stack backtrace for x86-64.
+
+   This is used by backtrace() implementation to accelerate frequent
+   queries for current stack, without any desire to unwind. It fills
+   BUFFER with the call tree from CURSOR upwards for at most SIZE
+   stack levels. The first frame, backtrace itself, is omitted. When
+   called, SIZE should give the maximum number of entries that can be
+   stored into BUFFER. Uses an internal thread-specific cache to
+   accelerate queries.
+
+   The caller should fall back to a unw_step() loop if this function
+   fails by returning -UNW_ESTOPUNWIND, meaning the routine hit a
+   stack frame that is too complex to be traced in the fast path.
+
+   This function is tuned for clients which only need to walk the
+   stack to get the call tree as fast as possible but without any
+   other details, for example profilers sampling the stack thousands
+   to millions of times per second.  The routine handles the most
+   common x86-64 ABI stack layouts: CFA is RBP or RSP plus/minus
+   constant offset, return address is at CFA-8, and RBP and RSP are
+   either unchanged or saved on stack at constant offset from the CFA;
+   the signal return frame; and frames without unwind info provided
+   they are at the outermost (final) frame or can conservatively be
+   assumed to be frame-pointer based.
+
+   Any other stack layout will cause the routine to give up. There
+   are only a handful of relatively rarely used functions which do
+   not have a stack in the standard form: vfork, longjmp, setcontext
+   and _dl_runtime_profile on common linux systems for example.
+
+   On success BUFFER and *SIZE reflect the trace progress up to *SIZE
+   stack levels or the outermost frame, which ever is less.  It may
+   stop short of outermost frame if unw_step() loop would also do so,
+   e.g. if there is no more unwind information; this is not reported
+   as an error.
+
+   The function returns a negative value for errors, -UNW_ESTOPUNWIND
+   if tracing stopped because of an unusual frame unwind info.  The
+   BUFFER and *SIZE reflect tracing progress up to the error frame.
+
+   Callers of this function would normally look like this:
+
+     unw_cursor_t     cur;
+     unw_context_t    ctx;
+     void             addrs[128];
+     int              depth = 128;
+     int              ret;
+
+     unw_getcontext(&ctx);
+     unw_init_local(&cur, &ctx);
+     if ((ret = unw_tdep_trace(&cur, addrs, &depth)) < 0)
+     {
+       depth = 0;
+       unw_getcontext(&ctx);
+       unw_init_local(&cur, &ctx);
+       while ((ret = unw_step(&cur)) > 0 && depth < 128)
+       {
+         unw_word_t ip;
+         unw_get_reg(&cur, UNW_REG_IP, &ip);
+         addresses[depth++] = (void *) ip;
+       }
+     }
+*/
+HIDDEN int
+tdep_trace (unw_cursor_t *cursor, void **buffer, int *size)
+{
+  struct cursor *c = (struct cursor *) cursor;
+  struct dwarf_cursor *d = &c->dwarf;
+  unw_trace_cache_t *cache;
+  unw_word_t rbp, rsp, rip, cfa;
+  int maxdepth = 0;
+  int depth = 0;
+  int ret;
+
+  /* Check input parametres. */
+  if (unlikely(! cursor || ! buffer || ! size || (maxdepth = *size) <= 0))
+    return -UNW_EINVAL;
+
+  Debug (1, "begin ip 0x%lx cfa 0x%lx\n", d->ip, d->cfa);
+
+  /* Tell core dwarf routines to call back to us. */
+  d->stash_frames = 1;
+
+  /* Determine initial register values. These are direct access safe
+     because we know they come from the initial machine context. */
+  rip = d->ip;
+  rsp = cfa = d->cfa;
+  ACCESS_MEM_FAST(ret, 0, d, DWARF_GET_LOC(d->loc[UNW_X86_64_RBP]), rbp);
+  assert(ret == 0);
+
+  /* Get frame cache. */
+  if (unlikely(! (cache = trace_cache_get())))
+  {
+    Debug (1, "returning %d, cannot get trace cache\n", -UNW_ENOMEM);
+    *size = 0;
+    d->stash_frames = 0;
+    return -UNW_ENOMEM;
+  }
+
+  /* Trace the stack upwards, starting from current RIP.  Adjust
+     the RIP address for previous/next instruction as the main
+     unwinding logic would also do.  We undo this before calling
+     back into unw_step(). */
+  while (depth < maxdepth)
+  {
+    rip -= d->use_prev_instr;
+    Debug (2, "depth %d cfa 0x%lx rip 0x%lx rsp 0x%lx rbp 0x%lx\n",
+           depth, cfa, rip, rsp, rbp);
+
+    /* See if we have this address cached.  If not, evaluate enough of
+       the dwarf unwind information to fill the cache line data, or to
+       decide this frame cannot be handled in fast trace mode.  We
+       cache negative results too to prevent unnecessary dwarf parsing
+       for common failures. */
+    unw_tdep_frame_t *f = trace_lookup (cursor, cache, cfa, rip, rbp, rsp);
+
+    /* If we don't have information for this frame, give up. */
+    if (unlikely(! f))
+    {
+      ret = -UNW_ENOINFO;
+      break;
+    }
+
+    Debug (3, "frame va %lx type %d last %d cfa %s+%d rbp @ cfa%+d rsp @ cfa%+d\n",
+           f->virtual_address, f->frame_type, f->last_frame,
+           f->cfa_reg_rsp ? "rsp" : "rbp", f->cfa_reg_offset,
+           f->rbp_cfa_offset, f->rsp_cfa_offset);
+
+    assert (f->virtual_address == rip);
+
+    /* Stop if this was the last frame.  In particular don't evaluate
+       new register values as it may not be safe - we don't normally
+       run with full validation on, and do not want to - and there's
+       enough bad unwind info floating around that we need to trust
+       what unw_step() previously said, in potentially bogus frames. */
+    if (f->last_frame)
+      break;
+
+    /* Evaluate CFA and registers for the next frame. */
+    switch (f->frame_type)
+    {
+    case UNW_X86_64_FRAME_GUESSED:
+      /* Fall thru to standard processing after forcing validation. */
+      c->validate = 1;
+
+    case UNW_X86_64_FRAME_STANDARD:
+      /* Advance standard traceable frame. */
+      cfa = (f->cfa_reg_rsp ? rsp : rbp) + f->cfa_reg_offset;
+      ACCESS_MEM_FAST(ret, c->validate, d, cfa - 8, rip);
+      if (likely(ret >= 0) && likely(f->rbp_cfa_offset != -1))
+        ACCESS_MEM_FAST(ret, c->validate, d, cfa + f->rbp_cfa_offset, rbp);
+
+      /* Don't bother reading RSP from DWARF, CFA becomes new RSP. */
+      rsp = cfa;
+
+      /* Next frame needs to back up for unwind info lookup. */
+      d->use_prev_instr = 1;
+      break;
+
+    case UNW_X86_64_FRAME_SIGRETURN:
+      cfa = cfa + f->cfa_reg_offset; /* cfa now points to ucontext_t.  */
+
+      ACCESS_MEM_FAST(ret, c->validate, d, cfa + UC_MCONTEXT_GREGS_RIP, rip);
+      if (likely(ret >= 0))
+        ACCESS_MEM_FAST(ret, c->validate, d, cfa + UC_MCONTEXT_GREGS_RBP, rbp);
+      if (likely(ret >= 0))
+        ACCESS_MEM_FAST(ret, c->validate, d, cfa + UC_MCONTEXT_GREGS_RSP, rsp);
+
+      /* Resume stack at signal restoration point. The stack is not
+         necessarily continuous here, especially with sigaltstack(). */
+      cfa = rsp;
+
+      /* Next frame should not back up. */
+      d->use_prev_instr = 0;
+      break;
+
+    default:
+      /* We cannot trace through this frame, give up and tell the
+         caller we had to stop.  Data collected so far may still be
+         useful to the caller, so let it know how far we got.  */
+      ret = -UNW_ESTOPUNWIND;
+      break;
+    }
+
+    Debug (4, "new cfa 0x%lx rip 0x%lx rsp 0x%lx rbp 0x%lx\n",
+           cfa, rip, rsp, rbp);
+
+    /* If we failed or ended up somewhere bogus, stop. */
+    if (unlikely(ret < 0 || rip < 0x4000))
+      break;
+
+    /* Record this address in stack trace. We skipped the first address. */
+    buffer[depth++] = (void *) (rip - d->use_prev_instr);
+  }
+
+#if UNW_DEBUG
+  Debug (1, "returning %d, depth %d\n", ret, depth);
+#endif
+  *size = depth;
+  return ret;
+}
diff --git a/frysk-imports/libunwind/src/x86_64/Lfetch_proc_info_post.c b/frysk-imports/libunwind/src/x86_64/Lfetch_proc_info_post.c
deleted file mode 100644
index c88239c..0000000
--- a/frysk-imports/libunwind/src/x86_64/Lfetch_proc_info_post.c
+++ /dev/null
@@ -1,5 +0,0 @@
-#define UNW_LOCAL_ONLY
-#include <libunwind.h>
-#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
-#include "Gfetch_proc_info_post.c"
-#endif
diff --git a/frysk-imports/libunwind/src/x86_64/Lglobal.c b/frysk-imports/libunwind/src/x86_64/Lglobal.c
index 6d7b489..8c43a67 100644
--- a/frysk-imports/libunwind/src/x86_64/Lglobal.c
+++ b/frysk-imports/libunwind/src/x86_64/Lglobal.c
@@ -1,4 +1,5 @@
 #define UNW_LOCAL_ONLY
+#include "config.h"
 #include <libunwind.h>
 #if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
 #include "Gglobal.c"
diff --git a/frysk-imports/libunwind/src/x86_64/Lis_signal_frame.c b/frysk-imports/libunwind/src/x86_64/Lis_signal_frame.c
deleted file mode 100644
index b9a7c4f..0000000
--- a/frysk-imports/libunwind/src/x86_64/Lis_signal_frame.c
+++ /dev/null
@@ -1,5 +0,0 @@
-#define UNW_LOCAL_ONLY
-#include <libunwind.h>
-#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
-#include "Gis_signal_frame.c"
-#endif
diff --git a/frysk-imports/libunwind/src/x86_64/Los-freebsd.c b/frysk-imports/libunwind/src/x86_64/Los-freebsd.c
new file mode 100644
index 0000000..a75a205
--- /dev/null
+++ b/frysk-imports/libunwind/src/x86_64/Los-freebsd.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Gos-freebsd.c"
+#endif
diff --git a/frysk-imports/libunwind/src/x86_64/Los-linux.c b/frysk-imports/libunwind/src/x86_64/Los-linux.c
new file mode 100644
index 0000000..3cc18aa
--- /dev/null
+++ b/frysk-imports/libunwind/src/x86_64/Los-linux.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Gos-linux.c"
+#endif
diff --git a/frysk-imports/libunwind/src/x86_64/Lstash_frame.c b/frysk-imports/libunwind/src/x86_64/Lstash_frame.c
new file mode 100644
index 0000000..7758780
--- /dev/null
+++ b/frysk-imports/libunwind/src/x86_64/Lstash_frame.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Gstash_frame.c"
+#endif
diff --git a/frysk-imports/libunwind/src/x86_64/Ltrace.c b/frysk-imports/libunwind/src/x86_64/Ltrace.c
new file mode 100644
index 0000000..fcd3f23
--- /dev/null
+++ b/frysk-imports/libunwind/src/x86_64/Ltrace.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Gtrace.c"
+#endif
diff --git a/frysk-imports/libunwind/src/x86_64/getcontext.S b/frysk-imports/libunwind/src/x86_64/getcontext.S
new file mode 100644
index 0000000..7a8b566
--- /dev/null
+++ b/frysk-imports/libunwind/src/x86_64/getcontext.S
@@ -0,0 +1,134 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2008 Google, Inc
+	Contributed by Paul Pluzhnikov <ppluzhnikov@google.com>
+   Copyright (C) 2010 Konstantin Belousov <kib@freebsd.org>
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include "ucontext_i.h"
+
+/*  int _Ux86_64_getcontext (ucontext_t *ucp)
+
+  Saves the machine context in UCP necessary for libunwind.  
+  Unlike the libc implementation, we don't save the signal mask
+  and hence avoid the cost of a system call per unwind.
+  
+*/
+
+	.global _Ux86_64_getcontext
+	.type _Ux86_64_getcontext, @function
+_Ux86_64_getcontext:
+	.cfi_startproc
+
+	/* Callee saved: RBX, RBP, R12-R15  */
+	movq %r12, UC_MCONTEXT_GREGS_R12(%rdi)
+	movq %r13, UC_MCONTEXT_GREGS_R13(%rdi)
+	movq %r14, UC_MCONTEXT_GREGS_R14(%rdi)
+	movq %r15, UC_MCONTEXT_GREGS_R15(%rdi)
+	movq %rbp, UC_MCONTEXT_GREGS_RBP(%rdi)
+	movq %rbx, UC_MCONTEXT_GREGS_RBX(%rdi)
+
+	/* Save argument registers (not strictly needed, but setcontext 
+	   restores them, so don't restore garbage).  */
+	movq %r8,  UC_MCONTEXT_GREGS_R8(%rdi)
+	movq %r9,  UC_MCONTEXT_GREGS_R9(%rdi)
+	movq %rdi, UC_MCONTEXT_GREGS_RDI(%rdi)
+	movq %rsi, UC_MCONTEXT_GREGS_RSI(%rdi)
+	movq %rdx, UC_MCONTEXT_GREGS_RDX(%rdi)
+	movq %rax, UC_MCONTEXT_GREGS_RAX(%rdi)
+	movq %rcx, UC_MCONTEXT_GREGS_RCX(%rdi)
+
+#if defined __linux__
+	/* Save fp state (not needed, except for setcontext not
+	   restoring garbage).  */
+	leaq UC_MCONTEXT_FPREGS_MEM(%rdi),%r8
+	movq %r8, UC_MCONTEXT_FPREGS_PTR(%rdi)
+	fnstenv (%r8)
+	stmxcsr FPREGS_OFFSET_MXCSR(%r8)
+#elif defined __FreeBSD__
+	fxsave UC_MCONTEXT_FPSTATE(%rdi)
+	movq $UC_MCONTEXT_FPOWNED_FPU,UC_MCONTEXT_OWNEDFP(%rdi)
+	movq $UC_MCONTEXT_FPFMT_XMM,UC_MCONTEXT_FPFORMAT(%rdi)
+	/* Save rflags and segment registers, so that sigreturn(2)
+	does not complain. */
+	pushfq
+	.cfi_adjust_cfa_offset 8
+	popq UC_MCONTEXT_RFLAGS(%rdi)
+	.cfi_adjust_cfa_offset -8
+	movl $0, UC_MCONTEXT_FLAGS(%rdi)
+	movw %cs, UC_MCONTEXT_CS(%rdi)
+	movw %ss, UC_MCONTEXT_SS(%rdi)
+#if 0
+	/* Setting the flags to 0 above disables restore of segment
+	   registers from the context */
+	movw %ds, UC_MCONTEXT_DS(%rdi)
+	movw %es, UC_MCONTEXT_ES(%rdi)
+	movw %fs, UC_MCONTEXT_FS(%rdi)
+	movw %gs, UC_MCONTEXT_GS(%rdi)
+#endif
+	movq $UC_MCONTEXT_MC_LEN_VAL, UC_MCONTEXT_MC_LEN(%rdi)
+#else
+#error Port me
+#endif
+
+	leaq 8(%rsp), %rax /* exclude this call.  */
+	movq %rax, UC_MCONTEXT_GREGS_RSP(%rdi)
+
+	movq 0(%rsp), %rax
+	movq %rax, UC_MCONTEXT_GREGS_RIP(%rdi)
+
+	xorq	%rax, %rax
+	retq
+	.cfi_endproc
+	.size _Ux86_64_getcontext, . - _Ux86_64_getcontext
+
+/*  int _Ux86_64_getcontext_trace (ucontext_t *ucp)
+
+  Saves limited machine context in UCP necessary for libunwind.
+  Unlike _Ux86_64_getcontext, saves only the parts needed for
+  fast trace. If fast trace fails, caller will have to get the
+  full context.
+*/
+
+	.global _Ux86_64_getcontext_trace
+	.hidden _Ux86_64_getcontext_trace
+	.type _Ux86_64_getcontext_trace, @function
+_Ux86_64_getcontext_trace:
+	.cfi_startproc
+
+	/* Save only RBP, RBX, RSP, RIP - exclude this call. */
+	movq %rbp, UC_MCONTEXT_GREGS_RBP(%rdi)
+	movq %rbx, UC_MCONTEXT_GREGS_RBX(%rdi)
+
+	leaq 8(%rsp), %rax
+	movq %rax, UC_MCONTEXT_GREGS_RSP(%rdi)
+
+	movq 0(%rsp), %rax
+	movq %rax, UC_MCONTEXT_GREGS_RIP(%rdi)
+
+	xorq	%rax, %rax
+	retq
+	.cfi_endproc
+	.size _Ux86_64_getcontext_trace, . - _Ux86_64_getcontext_trace
+
+      /* We do not need executable stack.  */
+      .section        .note.GNU-stack,"",@progbits
diff --git a/frysk-imports/libunwind/src/x86_64/init.h b/frysk-imports/libunwind/src/x86_64/init.h
index 1be5ddb..442b2bf 100644
--- a/frysk-imports/libunwind/src/x86_64/init.h
+++ b/frysk-imports/libunwind/src/x86_64/init.h
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2002 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
    Modified for x86_64 by Max Asbock <masbock@us.ibm.com>
 
@@ -27,44 +27,59 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 #include "unwind_i.h"
 
+/* Avoid a trip to x86_64_r_uc_addr() for purely local initialisation. */
+#if defined UNW_LOCAL_ONLY && defined __linux
+# define REG_INIT_LOC(c, rlc, ruc) \
+    DWARF_LOC ((unw_word_t) &c->uc->uc_mcontext.gregs[REG_ ## ruc], 0)
+
+#elif defined UNW_LOCAL_ONLY && defined __FreeBSD__
+# define REG_INIT_LOC(c, rlc, ruc) \
+    DWARF_LOC ((unw_word_t) &c->uc->uc_mcontext.mc_ ## rlc, 0)
+
+#else
+# define REG_INIT_LOC(c, rlc, ruc) \
+    DWARF_REG_LOC (&c->dwarf, UNW_X86_64_ ## ruc)
+#endif
+
 static inline int
-common_init (struct cursor *c)
+common_init (struct cursor *c, unsigned use_prev_instr)
 {
   int ret;
 
-  c->dwarf.loc[RAX] = DWARF_REG_LOC (&c->dwarf, UNW_X86_64_RAX);
-  c->dwarf.loc[RDX] = DWARF_REG_LOC (&c->dwarf, UNW_X86_64_RDX);
-  c->dwarf.loc[RCX] = DWARF_REG_LOC (&c->dwarf, UNW_X86_64_RCX);
-  c->dwarf.loc[RBX] = DWARF_REG_LOC (&c->dwarf, UNW_X86_64_RBX);
-  c->dwarf.loc[RSI] = DWARF_REG_LOC (&c->dwarf, UNW_X86_64_RSI);
-  c->dwarf.loc[RDI] = DWARF_REG_LOC (&c->dwarf, UNW_X86_64_RDI);
-  c->dwarf.loc[RBP] = DWARF_REG_LOC (&c->dwarf, UNW_X86_64_RBP);
-  c->dwarf.loc[RSP] = DWARF_REG_LOC (&c->dwarf, UNW_X86_64_RSP);
-  c->dwarf.loc[R8]  = DWARF_REG_LOC (&c->dwarf, UNW_X86_64_R8);
-  c->dwarf.loc[R9]  = DWARF_REG_LOC (&c->dwarf, UNW_X86_64_R9);
-  c->dwarf.loc[R10] = DWARF_REG_LOC (&c->dwarf, UNW_X86_64_R10);
-  c->dwarf.loc[R11] = DWARF_REG_LOC (&c->dwarf, UNW_X86_64_R11);
-  c->dwarf.loc[R12] = DWARF_REG_LOC (&c->dwarf, UNW_X86_64_R12);
-  c->dwarf.loc[R13] = DWARF_REG_LOC (&c->dwarf, UNW_X86_64_R13);
-  c->dwarf.loc[R14] = DWARF_REG_LOC (&c->dwarf, UNW_X86_64_R14);
-  c->dwarf.loc[R15] = DWARF_REG_LOC (&c->dwarf, UNW_X86_64_R15);
-  c->dwarf.loc[RIP] = DWARF_REG_LOC (&c->dwarf, UNW_X86_64_RIP);
+  c->dwarf.loc[RAX] = REG_INIT_LOC(c, rax, RAX);
+  c->dwarf.loc[RDX] = REG_INIT_LOC(c, rdx, RDX);
+  c->dwarf.loc[RCX] = REG_INIT_LOC(c, rcx, RCX);
+  c->dwarf.loc[RBX] = REG_INIT_LOC(c, rbx, RBX);
+  c->dwarf.loc[RSI] = REG_INIT_LOC(c, rsi, RSI);
+  c->dwarf.loc[RDI] = REG_INIT_LOC(c, rdi, RDI);
+  c->dwarf.loc[RBP] = REG_INIT_LOC(c, rbp, RBP);
+  c->dwarf.loc[RSP] = REG_INIT_LOC(c, rsp, RSP);
+  c->dwarf.loc[R8]  = REG_INIT_LOC(c, r8,  R8);
+  c->dwarf.loc[R9]  = REG_INIT_LOC(c, r9,  R9);
+  c->dwarf.loc[R10] = REG_INIT_LOC(c, r10, R10);
+  c->dwarf.loc[R11] = REG_INIT_LOC(c, r11, R11);
+  c->dwarf.loc[R12] = REG_INIT_LOC(c, r12, R12);
+  c->dwarf.loc[R13] = REG_INIT_LOC(c, r13, R13);
+  c->dwarf.loc[R14] = REG_INIT_LOC(c, r14, R14);
+  c->dwarf.loc[R15] = REG_INIT_LOC(c, r15, R15);
+  c->dwarf.loc[RIP] = REG_INIT_LOC(c, rip, RIP);
 
   ret = dwarf_get (&c->dwarf, c->dwarf.loc[RIP], &c->dwarf.ip);
   if (ret < 0)
     return ret;
 
   ret = dwarf_get (&c->dwarf, DWARF_REG_LOC (&c->dwarf, UNW_X86_64_RSP),
-		   &c->dwarf.cfa);
+                   &c->dwarf.cfa);
   if (ret < 0)
     return ret;
 
   c->sigcontext_format = X86_64_SCF_NONE;
   c->sigcontext_addr = 0;
 
-  c->dwarf.decrease_ip = 0;
   c->dwarf.args_size = 0;
   c->dwarf.ret_addr_column = RIP;
+  c->dwarf.stash_frames = 0;
+  c->dwarf.use_prev_instr = use_prev_instr;
   c->dwarf.pi_valid = 0;
   c->dwarf.pi_is_dynamic = 0;
   c->dwarf.hint = 0;
diff --git a/frysk-imports/libunwind/src/x86_64/is_fpreg.c b/frysk-imports/libunwind/src/x86_64/is_fpreg.c
index 030dd71..1188a61 100644
--- a/frysk-imports/libunwind/src/x86_64/is_fpreg.c
+++ b/frysk-imports/libunwind/src/x86_64/is_fpreg.c
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (c) 2004-2005 Hewlett-Packard Development Company, L.P.
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
    Modified for x86_64 by Max Asbock <masbock@us.ibm.com>
 
@@ -32,7 +32,7 @@ unw_is_fpreg (int regnum)
 {
 #if 0
   return ((regnum >= UNW_X86_ST0 && regnum <= UNW_X86_ST7)
-	  || (regnum >= UNW_X86_XMM0_lo && regnum <= UNW_X86_XMM7_hi));
+          || (regnum >= UNW_X86_XMM0_lo && regnum <= UNW_X86_XMM7_hi));
 #endif
   return 0;
 }
diff --git a/frysk-imports/libunwind/src/x86_64/longjmp.S b/frysk-imports/libunwind/src/x86_64/longjmp.S
index bda9d06..274778f 100644
--- a/frysk-imports/libunwind/src/x86_64/longjmp.S
+++ b/frysk-imports/libunwind/src/x86_64/longjmp.S
@@ -24,14 +24,11 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 	.globl _UI_longjmp_cont
-
 	.type _UI_longjmp_cont, @function
 _UI_longjmp_cont:
 	push %rax		/* push target IP as return address */
 	mov %rdx, %rax		/* set up return-value */
 	retq
 	.size _UI_longjmp_cont, .-_UI_longjmp_cont
-#ifdef __linux__
 	/* We do not need executable stack.  */
 	.section	.note.GNU-stack,"",@progbits
-#endif
diff --git a/frysk-imports/libunwind/src/x86_64/offsets.h b/frysk-imports/libunwind/src/x86_64/offsets.h
index 56ead69..0807960 100644
--- a/frysk-imports/libunwind/src/x86_64/offsets.h
+++ b/frysk-imports/libunwind/src/x86_64/offsets.h
@@ -1,29 +1,3 @@
-/* This used to be a generated file. But then it breaks cross compilation.
- * So use the method used by other architectures.
- */
-#ifndef OFFSETS_H
-#define OFFSETS_H
+/* FreeBSD specific definitions */
 
-#define REG_OFFSET_RAX	144
-#define REG_OFFSET_RBX	128
-#define REG_OFFSET_RCX	152
-#define REG_OFFSET_RDX	136
-#define REG_OFFSET_RDI	104
-#define REG_OFFSET_RSI	112
-#define REG_OFFSET_RSP	160
-#define REG_OFFSET_RBP	120
-#define REG_OFFSET_R8	40
-#define REG_OFFSET_R9	48
-#define REG_OFFSET_R10	56
-#define REG_OFFSET_R11	64
-#define REG_OFFSET_R12	72
-#define REG_OFFSET_R13	80
-#define REG_OFFSET_R14	88
-#define REG_OFFSET_R15	96
-#define REG_OFFSET_R15	96
-#define REG_OFFSET_R15	96
-#define REG_OFFSET_RIP	168
-#define REG_OFFSET_FPREGS_PTR	224
-#define FPREG_OFFSET_MXCR	24
-
-#endif /* OFFSETS_H */
+#define FREEBSD_UC_MCONTEXT_OFF         0x10
diff --git a/frysk-imports/libunwind/src/x86_64/setcontext.S b/frysk-imports/libunwind/src/x86_64/setcontext.S
index 9eeb1b8..1af8b67 100644
--- a/frysk-imports/libunwind/src/x86_64/setcontext.S
+++ b/frysk-imports/libunwind/src/x86_64/setcontext.S
@@ -1,6 +1,7 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2007 Google, Inc
 	Contributed by Arun Sharma <arun.sharma@google.com>
+   Copyright (C) 2010 Konstantin Belousov <kib@freebsd.org>
 
 This file is part of libunwind.
 
@@ -23,41 +24,88 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
-#include "offsets.h"
+#include "ucontext_i.h"
+#if defined __linux__
+#include <asm/unistd.h>
+#define	SIG_SETMASK   2
+#define	SIGSET_BYTE_SIZE   (64/8)
+#elif defined __FreeBSD__
+#include <sys/syscall.h>
+#endif
+
+/*  int _Ux86_64_setcontext (const ucontext_t *ucp)
 
-	.global _x86_64_setcontext
+  Restores the machine context provided.
+  Unlike the libc implementation, doesn't clobber %rax
+  
+*/
+	.global _Ux86_64_setcontext
+	.type _Ux86_64_setcontext, @function
 
-_x86_64_setcontext:
+_Ux86_64_setcontext:
+
+#if defined __linux__
+	/* restore signal mask
+           sigprocmask(SIG_SETMASK, ucp->uc_sigmask, NULL, sizeof(sigset_t)) */
+	push %rdi
+	mov $__NR_rt_sigprocmask, %rax
+	lea UC_SIGMASK(%rdi), %rsi
+	mov $SIG_SETMASK, %rdi
+	xor %rdx, %rdx
+	mov $SIGSET_BYTE_SIZE, %r10
+	syscall
+	pop %rdi
 
         /* restore fp state */
-	mov    REG_OFFSET_FPREGS_PTR(%rdi),%r8
+	mov    UC_MCONTEXT_FPREGS_PTR(%rdi),%r8
 	fldenv (%r8)
-	ldmxcsr FPREG_OFFSET_MXCR(%r8)
+	ldmxcsr FPREGS_OFFSET_MXCSR(%r8)
+#elif defined __FreeBSD__
+	/* restore signal mask */
+	pushq	%rdi
+	xorl	%edx,%edx
+	leaq	UC_SIGMASK(%rdi),%rsi
+	movl	$3,%edi/* SIG_SETMASK */
+	movl	$SYS_sigprocmask,%eax
+	movq	%rcx,%r10
+	syscall
+	popq	%rdi
+
+	/* restore fp state */
+	cmpq $UC_MCONTEXT_FPOWNED_FPU,UC_MCONTEXT_OWNEDFP(%rdi)
+	jne 1f
+	cmpq $UC_MCONTEXT_FPFMT_XMM,UC_MCONTEXT_FPFORMAT(%rdi)
+	jne 1f
+	fxrstor UC_MCONTEXT_FPSTATE(%rdi)
+1:
+#else
+#error Port me
+#endif
 
 	/* restore the rest of the state */
-	mov    REG_OFFSET_R8(%rdi),%r8
-	mov    REG_OFFSET_R9(%rdi),%r9
-	mov    REG_OFFSET_RBX(%rdi),%rbx
-	mov    REG_OFFSET_RBP(%rdi),%rbp
-	mov    REG_OFFSET_R12(%rdi),%r12
-	mov    REG_OFFSET_R13(%rdi),%r13
-	mov    REG_OFFSET_R14(%rdi),%r14
-	mov    REG_OFFSET_R15(%rdi),%r15
-	mov    REG_OFFSET_RSI(%rdi),%rsi
-	mov    REG_OFFSET_RDX(%rdi),%rdx
-	mov    REG_OFFSET_RAX(%rdi),%rax
-	mov    REG_OFFSET_RCX(%rdi),%rcx
-	mov    REG_OFFSET_RSP(%rdi),%rsp
+	mov    UC_MCONTEXT_GREGS_R8(%rdi),%r8
+	mov    UC_MCONTEXT_GREGS_R9(%rdi),%r9
+	mov    UC_MCONTEXT_GREGS_RBX(%rdi),%rbx
+	mov    UC_MCONTEXT_GREGS_RBP(%rdi),%rbp
+	mov    UC_MCONTEXT_GREGS_R12(%rdi),%r12
+	mov    UC_MCONTEXT_GREGS_R13(%rdi),%r13
+	mov    UC_MCONTEXT_GREGS_R14(%rdi),%r14
+	mov    UC_MCONTEXT_GREGS_R15(%rdi),%r15
+	mov    UC_MCONTEXT_GREGS_RSI(%rdi),%rsi
+	mov    UC_MCONTEXT_GREGS_RDX(%rdi),%rdx
+	mov    UC_MCONTEXT_GREGS_RAX(%rdi),%rax
+	mov    UC_MCONTEXT_GREGS_RCX(%rdi),%rcx
+	mov    UC_MCONTEXT_GREGS_RSP(%rdi),%rsp
 
         /* push the return address on the stack */
-	mov    REG_OFFSET_RIP(%rdi),%rcx
+	mov    UC_MCONTEXT_GREGS_RIP(%rdi),%rcx
 	push   %rcx
 
-	mov    REG_OFFSET_RCX(%rdi),%rcx
-	mov    REG_OFFSET_RDI(%rdi),%rdi
+	mov    UC_MCONTEXT_GREGS_RCX(%rdi),%rcx
+	mov    UC_MCONTEXT_GREGS_RDI(%rdi),%rdi
 	retq
 
-#ifdef __linux__
+	.size _Ux86_64_setcontext, . - _Ux86_64_setcontext
+
       /* We do not need executable stack.  */
       .section        .note.GNU-stack,"",@progbits
-#endif
diff --git a/frysk-imports/libunwind/src/x86_64/siglongjmp.S b/frysk-imports/libunwind/src/x86_64/siglongjmp.S
index 8ca7968..32489e5 100644
--- a/frysk-imports/libunwind/src/x86_64/siglongjmp.S
+++ b/frysk-imports/libunwind/src/x86_64/siglongjmp.S
@@ -24,10 +24,9 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 	.globl _UI_siglongjmp_cont
-
+	.type _UI_siglongjmp_cont, @function
 _UI_siglongjmp_cont:
 	retq
-#ifdef __linux__
+	.size _UI_siglongjmp_cont, . - _UI_siglongjmp_cont
 	/* We do not need executable stack.  */
 	.section	.note.GNU-stack,"",@progbits
-#endif
diff --git a/frysk-imports/libunwind/src/x86_64/ucontext_i.h b/frysk-imports/libunwind/src/x86_64/ucontext_i.h
index 7f26eaa..aded941 100644
--- a/frysk-imports/libunwind/src/x86_64/ucontext_i.h
+++ b/frysk-imports/libunwind/src/x86_64/ucontext_i.h
@@ -22,32 +22,61 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
-#define UC_MCONTEXT_GREGS_R8	0x28
-#define UC_MCONTEXT_GREGS_R9	0x30
-#define UC_MCONTEXT_GREGS_R10	0x38
-#define UC_MCONTEXT_GREGS_R11	0x40
-#define UC_MCONTEXT_GREGS_R12	0x48
-#define UC_MCONTEXT_GREGS_R13	0x50
-#define UC_MCONTEXT_GREGS_R14	0x58
-#define UC_MCONTEXT_GREGS_R15	0x60
-#define UC_MCONTEXT_GREGS_RDI	0x68
-#define UC_MCONTEXT_GREGS_RSI	0x70
-#define UC_MCONTEXT_GREGS_RBP	0x78
-#define UC_MCONTEXT_GREGS_RBX	0x80
-#define UC_MCONTEXT_GREGS_RDX	0x88
-#define UC_MCONTEXT_GREGS_RAX	0x90
-#define UC_MCONTEXT_GREGS_RCX	0x98
-#define UC_MCONTEXT_GREGS_RSP	0xa0
-#define UC_MCONTEXT_GREGS_RIP	0xa8
-#define UC_MCONTEXT_GREGS_ERR	0xc0
-#define UC_MCONTEXT_GREGS_TRAPNO	0xc8
+#if defined __linux__
+#define UC_MCONTEXT_GREGS_R8    0x28
+#define UC_MCONTEXT_GREGS_R9    0x30
+#define UC_MCONTEXT_GREGS_R10   0x38
+#define UC_MCONTEXT_GREGS_R11   0x40
+#define UC_MCONTEXT_GREGS_R12   0x48
+#define UC_MCONTEXT_GREGS_R13   0x50
+#define UC_MCONTEXT_GREGS_R14   0x58
+#define UC_MCONTEXT_GREGS_R15   0x60
+#define UC_MCONTEXT_GREGS_RDI   0x68
+#define UC_MCONTEXT_GREGS_RSI   0x70
+#define UC_MCONTEXT_GREGS_RBP   0x78
+#define UC_MCONTEXT_GREGS_RBX   0x80
+#define UC_MCONTEXT_GREGS_RDX   0x88
+#define UC_MCONTEXT_GREGS_RAX   0x90
+#define UC_MCONTEXT_GREGS_RCX   0x98
+#define UC_MCONTEXT_GREGS_RSP   0xa0
+#define UC_MCONTEXT_GREGS_RIP   0xa8
+#define UC_MCONTEXT_FPREGS_PTR  0x1a8
+#define UC_MCONTEXT_FPREGS_MEM  0xe0
+#define UC_SIGMASK              0x128
+#define FPREGS_OFFSET_MXCSR     0x18
+#elif defined __FreeBSD__
+#define UC_SIGMASK              0x0
+#define UC_MCONTEXT_GREGS_RDI   0x18
+#define UC_MCONTEXT_GREGS_RSI   0x20
+#define UC_MCONTEXT_GREGS_RDX   0x28
+#define UC_MCONTEXT_GREGS_RCX   0x30
+#define UC_MCONTEXT_GREGS_R8    0x38
+#define UC_MCONTEXT_GREGS_R9    0x40
+#define UC_MCONTEXT_GREGS_RAX   0x48
+#define UC_MCONTEXT_GREGS_RBX   0x50
+#define UC_MCONTEXT_GREGS_RBP   0x58
+#define UC_MCONTEXT_GREGS_R10   0x60
+#define UC_MCONTEXT_GREGS_R11   0x68
+#define UC_MCONTEXT_GREGS_R12   0x70
+#define UC_MCONTEXT_GREGS_R13   0x78
+#define UC_MCONTEXT_GREGS_R14   0x80
+#define UC_MCONTEXT_GREGS_R15   0x88
+#define UC_MCONTEXT_FS          0x94
+#define UC_MCONTEXT_GS          0x96
+#define UC_MCONTEXT_FLAGS       0xa0
+#define UC_MCONTEXT_ES          0xa4
+#define UC_MCONTEXT_DS          0xa6
+#define UC_MCONTEXT_GREGS_RIP   0xb0
+#define UC_MCONTEXT_CS          0xb8
+#define UC_MCONTEXT_RFLAGS      0xc0
+#define UC_MCONTEXT_GREGS_RSP   0xc8
+#define UC_MCONTEXT_SS          0xd0
+#define UC_MCONTEXT_MC_LEN      0xd8
+#define UC_MCONTEXT_FPFORMAT    0xe0
+#define UC_MCONTEXT_OWNEDFP     0xe8
+#define UC_MCONTEXT_FPSTATE     0xf0
+#define UC_MCONTEXT_FPOWNED_FPU 0x20001
+#define UC_MCONTEXT_FPFMT_XMM   0x10002
+#define UC_MCONTEXT_MC_LEN_VAL  0x320
 
-#define UC_MCONTEXT_GREGS_TRAPNO_PF 14	/* Page-Fault Exception */
-
-/* http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/24593.pdf
-   Publication # 24593, Revision 3.12, page 219 (261/488):  */
-#define UC_MCONTEXT_GREGS_ERR_P_BIT   0
-#define UC_MCONTEXT_GREGS_ERR_RW_BIT  1
-#define UC_MCONTEXT_GREGS_ERR_US_BIT  2
-#define UC_MCONTEXT_GREGS_ERR_RSV_BIT 3
-#define UC_MCONTEXT_GREGS_ERR_ID_BIT  4
+#endif
diff --git a/frysk-imports/libunwind/src/x86_64/unwind_i.h b/frysk-imports/libunwind/src/x86_64/unwind_i.h
index af779bb..4f81566 100644
--- a/frysk-imports/libunwind/src/x86_64/unwind_i.h
+++ b/frysk-imports/libunwind/src/x86_64/unwind_i.h
@@ -1,6 +1,6 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2002, 2005 Hewlett-Packard Co
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+        Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 
    Modified for x86_64 by Max Asbock <masbock@us.ibm.com>
 
@@ -28,7 +28,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #ifndef unwind_i_h
 #define unwind_i_h
 
-#include <memory.h>
 #include <stdint.h>
 
 #include <libunwind-x86_64.h>
@@ -37,36 +36,56 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #include <sys/ucontext.h>
 
 /* DWARF column numbers for x86_64: */
-#define RAX	0
-#define RDX	1
-#define RCX	2
-#define RBX	3
-#define RSI	4
-#define RDI	5
-#define RBP	6
-#define RSP	7
-#define R8	8
-#define R9	9
-#define R10	10
-#define R11	11
-#define R12	12
-#define R13	13
-#define R14	14
-#define R15	15
-#define RIP	16
-
-#define x86_64_lock			UNW_OBJ(lock)
-#define x86_64_local_resume		UNW_OBJ(local_resume)
-#define x86_64_local_addr_space_init	UNW_OBJ(local_addr_space_init)
+#define RAX     0
+#define RDX     1
+#define RCX     2
+#define RBX     3
+#define RSI     4
+#define RDI     5
+#define RBP     6
+#define RSP     7
+#define R8      8
+#define R9      9
+#define R10     10
+#define R11     11
+#define R12     12
+#define R13     13
+#define R14     14
+#define R15     15
+#define RIP     16
+
+#define x86_64_lock                     UNW_OBJ(lock)
+#define x86_64_local_resume             UNW_OBJ(local_resume)
+#define x86_64_local_addr_space_init    UNW_OBJ(local_addr_space_init)
+#define setcontext                      UNW_ARCH_OBJ (setcontext)
 #if 0
-#define x86_64_scratch_loc		UNW_OBJ(scratch_loc)
+#define x86_64_scratch_loc              UNW_OBJ(scratch_loc)
+#endif
+#define x86_64_r_uc_addr                UNW_OBJ(r_uc_addr)
+#define x86_64_sigreturn                UNW_OBJ(sigreturn)
+
+/* By-pass calls to access_mem() when known to be safe. */
+#ifdef UNW_LOCAL_ONLY
+# undef ACCESS_MEM_FAST
+# define ACCESS_MEM_FAST(ret,validate,cur,addr,to)                     \
+  do {                                                                 \
+    if (unlikely(validate))                                            \
+      (ret) = dwarf_get ((cur), DWARF_MEM_LOC ((cur), (addr)), &(to)); \
+    else                                                               \
+      (ret) = 0, (to) = *(unw_word_t *)(addr);                         \
+  } while (0)
 #endif
 
 extern void x86_64_local_addr_space_init (void);
 extern int x86_64_local_resume (unw_addr_space_t as, unw_cursor_t *cursor,
-			     void *arg);
+                             void *arg);
+extern int setcontext (const ucontext_t *ucp);
+
 #if 0
 extern dwarf_loc_t x86_64_scratch_loc (struct cursor *c, unw_regnum_t reg);
 #endif
 
+extern void *x86_64_r_uc_addr (ucontext_t *uc, int reg);
+extern NORETURN void x86_64_sigreturn (unw_cursor_t *cursor);
+
 #endif /* unwind_i_h */
diff --git a/frysk-imports/libunwind/tests/.gitignore b/frysk-imports/libunwind/tests/.gitignore
deleted file mode 100644
index 70845e0..0000000
--- a/frysk-imports/libunwind/tests/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-Makefile.in
diff --git a/frysk-imports/libunwind/tests/Gia64-test-nat.c b/frysk-imports/libunwind/tests/Gia64-test-nat.c
index 1e9e939..89df54e 100644
--- a/frysk-imports/libunwind/tests/Gia64-test-nat.c
+++ b/frysk-imports/libunwind/tests/Gia64-test-nat.c
@@ -31,6 +31,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #include <string.h>
 
 #include <libunwind.h>
+#include "compiler.h"
 
 #ifdef HAVE_SYS_UC_ACCESS_H
 # include <sys/uc_access.h>
@@ -38,8 +39,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 #include "tdep-ia64/rse.h"
 
-#define ARRAY_SIZE(a)	((int) (sizeof (a) / sizeof ((a)[0])))
-
 #define NUM_RUNS		1024
 //#define NUM_RUNS		1
 #define MAX_CHECKS		1024
@@ -588,9 +587,9 @@ run_check (int test)
     {
       if (test == 1)
 	/* Make first test once go through each test... */
-	index = i % ARRAY_SIZE (all_funcs);
+	index = i % (int) ARRAY_SIZE (all_funcs);
       else
-	index = random () % ARRAY_SIZE (all_funcs);
+	index = random () % (int) ARRAY_SIZE (all_funcs);
       funcs[i] = all_funcs[index].func;
       checks[i] = all_funcs[index].check;
     }
diff --git a/frysk-imports/libunwind/tests/Gia64-test-rbs.c b/frysk-imports/libunwind/tests/Gia64-test-rbs.c
index ba89f88..2181e70 100644
--- a/frysk-imports/libunwind/tests/Gia64-test-rbs.c
+++ b/frysk-imports/libunwind/tests/Gia64-test-rbs.c
@@ -32,14 +32,13 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #include <stdlib.h>
 
 #include <libunwind.h>
+#include "compiler.h"
 
 #include "ia64-test-rbs.h"
 
 #define panic(args...)							  \
 	do { fprintf (stderr, args); ++nerrors; return -9999; } while (0)
 
-#define ARRAY_SIZE(a)	((int) (sizeof (a) / sizeof ((a)[0])))
-
 /* The loadrs field in ar.rsc is 14 bits wide, which limits all ia64
    implementations to at most 2048 physical stacked registers
    (actually, slightly less than that, because loadrs also counts RNaT
@@ -138,7 +137,7 @@ run_check (int test)
 
   /* First, generate a set of 88 random values which loadup() will load
      into loc2-loc89 (r37-r124).  */
-  for (i = 0; i < ARRAY_SIZE (reg_values); ++i)
+  for (i = 0; i < (int) ARRAY_SIZE (reg_values); ++i)
     {
       reg_values[i] = random ();
       /* Generate NaTs with a reasonably probability (1/16th): */
@@ -150,7 +149,7 @@ run_check (int test)
   nfuncs = 0;
   do
     {
-      n = random () % ARRAY_SIZE (spill_funcs);
+      n = random () % (int) ARRAY_SIZE (spill_funcs);
       func[nfuncs++] = spill_funcs[n];
       nspills += 2 + n;
     }
diff --git a/frysk-imports/libunwind/tests/Gia64-test-stack.c b/frysk-imports/libunwind/tests/Gia64-test-stack.c
index 2b47f3d..05874b2 100644
--- a/frysk-imports/libunwind/tests/Gia64-test-stack.c
+++ b/frysk-imports/libunwind/tests/Gia64-test-stack.c
@@ -81,14 +81,15 @@ do_unwind_tests (void)
 	    {
 	      v0 = v1 = v2 = v3 = 0;
 	      n0 = n1 = n2 = n3 = 0;
-	      ((ret = unw_get_reg (&c, UNW_IA64_GR + reg, &v0)) < 0
+	      (void)
+	         ((ret = unw_get_reg (&c, UNW_IA64_GR  + reg, &v0)) < 0
 	       || (ret = unw_get_reg (&c, UNW_IA64_NAT + reg, &n0)) < 0
 	       || (ret = unw_get_reg (&c, UNW_IA64_GR  + reg + 1, &v1)) < 0
 	       || (ret = unw_get_reg (&c, UNW_IA64_NAT + reg + 1, &n1)) < 0
 	       || (ret = unw_get_reg (&c, UNW_IA64_GR  + reg + 2, &v2)) < 0
 	       || (ret = unw_get_reg (&c, UNW_IA64_NAT + reg + 2, &n2)) < 0
 	       || (ret = unw_get_reg (&c, UNW_IA64_GR  + reg + 3, &v3)) < 0
-	   || (ret = unw_get_reg (&c, UNW_IA64_NAT + reg + 3, &n3)) < 0);
+	       || (ret = unw_get_reg (&c, UNW_IA64_NAT + reg + 3, &n3)) < 0);
 	      if (reg < 100)
 		printf ("  r%d", reg);
 	      else
diff --git a/frysk-imports/libunwind/tests/Gperf-simple.c b/frysk-imports/libunwind/tests/Gperf-simple.c
index 239ad26..2173406 100644
--- a/frysk-imports/libunwind/tests/Gperf-simple.c
+++ b/frysk-imports/libunwind/tests/Gperf-simple.c
@@ -21,12 +21,13 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
-#include <memory.h>
+#include <string.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
 
 #include <libunwind.h>
+#include "compiler.h"
 
 #include <sys/resource.h>
 #include <sys/time.h>
@@ -53,7 +54,7 @@ gettime (void)
   return tv.tv_sec + 1e-6*tv.tv_usec;
 }
 
-static int __attribute__((noinline))
+static int NOINLINE
 measure_unwind (int maxlevel, double *step)
 {
   double stop, start;
@@ -88,7 +89,7 @@ measure_unwind (int maxlevel, double *step)
 
 static int f1 (int, int, double *);
 
-static int __attribute__((noinline))
+static int NOINLINE
 g1 (int level, int maxlevel, double *step)
 {
   if (level == maxlevel)
@@ -98,7 +99,7 @@ g1 (int level, int maxlevel, double *step)
     return f1 (level + 1, maxlevel, step) + level;
 }
 
-static int __attribute__((noinline))
+static int NOINLINE
 f1 (int level, int maxlevel, double *step)
 {
   if (level == maxlevel)
diff --git a/frysk-imports/libunwind/tests/Gperf-trace.c b/frysk-imports/libunwind/tests/Gperf-trace.c
new file mode 100644
index 0000000..cc4fac6
--- /dev/null
+++ b/frysk-imports/libunwind/tests/Gperf-trace.c
@@ -0,0 +1,248 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2003-2004 Hewlett-Packard Co
+	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <libunwind.h>
+#include "compiler.h"
+
+#include <sys/resource.h>
+#include <sys/time.h>
+
+#define panic(args...)							  \
+	do { fprintf (stderr, args); exit (-1); } while (0)
+
+long dummy;
+
+static long iterations = 10000;
+static int maxlevel = 100;
+
+#define KB	1024
+#define MB	(1024*1024)
+
+static char big[64*MB];	/* should be >> max. cache size */
+
+static inline double
+gettime (void)
+{
+  struct timeval tv;
+
+  gettimeofday (&tv, NULL);
+  return tv.tv_sec + 1e-6*tv.tv_usec;
+}
+
+static int NOINLINE
+measure_unwind (int maxlevel, double *step)
+{
+  double stop, start;
+  int level = 0;
+  void *buffer[128];
+
+  start = gettime ();
+  level = unw_backtrace(buffer, 128);
+  stop = gettime ();
+
+  if (level <= maxlevel)
+    panic ("Unwound only %d levels, expected at least %d levels\n",
+	   level, maxlevel);
+
+  *step = (stop - start) / (double) level;
+  return 0;
+}
+
+static int f1 (int, int, double *);
+
+static int NOINLINE
+g1 (int level, int maxlevel, double *step)
+{
+  if (level == maxlevel)
+    return measure_unwind (maxlevel, step);
+  else
+    /* defeat last-call/sibcall optimization */
+    return f1 (level + 1, maxlevel, step) + level;
+}
+
+static int NOINLINE
+f1 (int level, int maxlevel, double *step)
+{
+  if (level == maxlevel)
+    return measure_unwind (maxlevel, step);
+  else
+    /* defeat last-call/sibcall optimization */
+    return g1 (level + 1, maxlevel, step) + level;
+}
+
+static void
+doit (const char *label)
+{
+  double step, min_step, first_step, sum_step;
+  int i;
+
+  sum_step = first_step = 0.0;
+  min_step = 1e99;
+  for (i = 0; i < iterations; ++i)
+    {
+      f1 (0, maxlevel, &step);
+
+      sum_step += step;
+
+      if (step < min_step)
+	min_step = step;
+
+      if (i == 0)
+	first_step = step;
+    }
+  printf ("%s: unw_step : 1st=%9.3f min=%9.3f avg=%9.3f nsec\n", label,
+	  1e9*first_step, 1e9*min_step, 1e9*sum_step/iterations);
+}
+
+static long
+sum (void *buf, size_t size)
+{
+  long s = 0;
+  char *cp = buf;
+  size_t i;
+
+  for (i = 0; i < size; i += 8)
+    s += cp[i];
+  return s;
+}
+
+static void
+measure_init (void)
+{
+# define N	100
+# define M	10	/* must be at least 2 to get steady-state */
+  double stop, start, get_cold, get_warm, init_cold, init_warm, delta;
+  struct
+    {
+      unw_cursor_t c;
+      char padding[1024];	/* should be > 2 * max. cacheline size */
+    }
+  cursor[N];
+  struct
+    {
+      unw_context_t uc;
+      char padding[1024];	/* should be > 2 * max. cacheline size */
+    }
+  uc[N];
+  int i, j;
+
+  /* Run each test M times and take the minimum to filter out noise
+     such dynamic linker resolving overhead, context-switches,
+     page-in, cache, and TLB effects.  */
+
+  get_cold = 1e99;
+  for (j = 0; j < M; ++j)
+    {
+      dummy += sum (big, sizeof (big));			/* flush the cache */
+      for (i = 0; i < N; ++i)
+	uc[i].padding[511] = i;		/* warm up the TLB */
+      start = gettime ();
+      for (i = 0; i < N; ++i)
+	unw_getcontext (&uc[i].uc);
+      stop = gettime ();
+      delta = (stop - start) / N;
+      if (delta < get_cold)
+	get_cold = delta;
+    }
+
+  init_cold = 1e99;
+  for (j = 0; j < M; ++j)
+    {
+      dummy += sum (big, sizeof (big));	/* flush cache */
+      for (i = 0; i < N; ++i)
+	uc[i].padding[511] = i;		/* warm up the TLB */
+      start = gettime ();
+      for (i = 0; i < N; ++i)
+	unw_init_local (&cursor[i].c, &uc[i].uc);
+      stop = gettime ();
+      delta = (stop - start) / N;
+      if (delta < init_cold)
+	init_cold = delta;
+    }
+
+  get_warm = 1e99;
+  for (j = 0; j < M; ++j)
+    {
+      start = gettime ();
+      for (i = 0; i < N; ++i)
+	unw_getcontext (&uc[0].uc);
+      stop = gettime ();
+      delta = (stop - start) / N;
+      if (delta < get_warm)
+	get_warm = delta;
+    }
+
+  init_warm = 1e99;
+  for (j = 0; j < M; ++j)
+    {
+      start = gettime ();
+      for (i = 0; i < N; ++i)
+	unw_init_local (&cursor[0].c, &uc[0].uc);
+      stop = gettime ();
+      delta = (stop - start) / N;
+      if (delta < init_warm)
+	init_warm = delta;
+    }
+
+  printf ("unw_getcontext : cold avg=%9.3f nsec, warm avg=%9.3f nsec\n",
+	  1e9 * get_cold, 1e9 * get_warm);
+  printf ("unw_init_local : cold avg=%9.3f nsec, warm avg=%9.3f nsec\n",
+	  1e9 * init_cold, 1e9 * init_warm);
+}
+
+int
+main (int argc, char **argv)
+{
+  struct rlimit rlim;
+
+  rlim.rlim_cur = RLIM_INFINITY;
+  rlim.rlim_max = RLIM_INFINITY;
+  setrlimit (RLIMIT_STACK, &rlim);
+
+  memset (big, 0xaa, sizeof (big));
+
+  if (argc > 1)
+    {
+      maxlevel = atol (argv[1]);
+      if (argc > 2)
+	iterations = atol (argv[2]);
+    }
+
+  measure_init ();
+
+  unw_set_caching_policy (unw_local_addr_space, UNW_CACHE_NONE);
+  doit ("no cache        ");
+
+  unw_set_caching_policy (unw_local_addr_space, UNW_CACHE_GLOBAL);
+  doit ("global cache    ");
+
+  unw_set_caching_policy (unw_local_addr_space, UNW_CACHE_PER_THREAD);
+  doit ("per-thread cache");
+
+  return 0;
+}
diff --git a/frysk-imports/libunwind/tests/Gtest-bt.c b/frysk-imports/libunwind/tests/Gtest-bt.c
index 1256512..802dd08 100644
--- a/frysk-imports/libunwind/tests/Gtest-bt.c
+++ b/frysk-imports/libunwind/tests/Gtest-bt.c
@@ -25,6 +25,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 # include "config.h"
 #endif
 
+#include "compiler.h"
+
 #include <errno.h>
 #if HAVE_EXECINFO_H
 # include <execinfo.h>
@@ -38,30 +40,25 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #include <unistd.h>
 #include <libunwind.h>
 
-#if UNW_TARGET_X86 || UNW_TARGET_X86_64
-# define STACK_SIZE	(128*1024)	/* On x86/-64, SIGSTKSZ is too small */
-#else
-# define STACK_SIZE	SIGSTKSZ
-#endif
-
 #define panic(args...)				\
 	{ fprintf (stderr, args); exit (-1); }
 
-#ifndef HAVE_SIGHANDLER_T
-typedef RETSIGTYPE (*sighandler_t) (int);
-#endif
+#define SIG_STACK_SIZE 0x100000
 
 int verbose;
 int num_errors;
 
+/* These variables are global because they
+ * cause the signal stack to overflow */
+char buf[512], name[256];
+unw_cursor_t cursor;
+unw_context_t uc;
+
 static void
 do_backtrace (void)
 {
-  char buf[512], name[256];
   unw_word_t ip, sp, off;
-  unw_cursor_t cursor;
   unw_proc_info_t pi;
-  unw_context_t uc;
   int ret;
 
   if (verbose)
@@ -87,10 +84,12 @@ do_backtrace (void)
 	{
 	  printf ("%016lx %-32s (sp=%016lx)\n", (long) ip, buf, (long) sp);
 
-	  unw_get_proc_info (&cursor, &pi);
-	  printf ("\tproc=%lx-%lx\n\thandler=%lx lsda=%lx gp=%lx",
+	  if (unw_get_proc_info (&cursor, &pi) == 0)
+	    {
+	      printf ("\tproc=0x%lx-0x%lx\n\thandler=0x%lx lsda=0x%lx gp=0x%lx",
 		  (long) pi.start_ip, (long) pi.end_ip,
 		  (long) pi.handler, (long) pi.lsda, (long) pi.gp);
+	    }
 
 #if UNW_TARGET_IA64
 	  {
@@ -128,7 +127,7 @@ do_backtrace (void)
 }
 
 void
-foo (long val)
+foo (long val UNUSED)
 {
   do_backtrace ();
 }
@@ -165,11 +164,13 @@ bar (long v)
 }
 
 void
-sighandler (int signal, void *siginfo, void *context)
+sighandler (int signal, void *siginfo UNUSED, void *context)
 {
-  ucontext_t *uc = context;
+  ucontext_t *uc UNUSED;
   int sp;
 
+  uc = context;
+
   if (verbose)
     {
       printf ("sighandler: got signal %d, sp=%p", signal, &sp);
@@ -187,7 +188,17 @@ sighandler (int signal, void *siginfo, void *context)
       }
 # endif
 #elif UNW_TARGET_X86
+#if defined __linux__
       printf (" @ %lx", (unsigned long) uc->uc_mcontext.gregs[REG_EIP]);
+#elif defined __FreeBSD__
+      printf (" @ %lx", (unsigned long) uc->uc_mcontext.mc_eip);
+#endif
+#elif UNW_TARGET_X86_64
+#if defined __linux__
+      printf (" @ %lx", (unsigned long) uc->uc_mcontext.gregs[REG_RIP]);
+#elif defined __FreeBSD__
+      printf (" @ %lx", (unsigned long) uc->uc_mcontext.mc_rip);
+#endif
 #endif
       printf ("\n");
     }
@@ -195,7 +206,7 @@ sighandler (int signal, void *siginfo, void *context)
 }
 
 int
-main (int argc, char **argv)
+main (int argc, char **argv UNUSED)
 {
   struct sigaction act;
   stack_t stk;
@@ -219,10 +230,10 @@ main (int argc, char **argv)
 
   if (verbose)
     printf ("\nBacktrace across signal handler on alternate stack:\n");
-  stk.ss_sp = malloc (STACK_SIZE);
+  stk.ss_sp = malloc (SIG_STACK_SIZE);
   if (!stk.ss_sp)
-    panic ("failed to allocate SIGSTKSZ (%u) bytes\n", SIGSTKSZ);
-  stk.ss_size = STACK_SIZE;
+    panic ("failed to allocate %u bytes\n", SIG_STACK_SIZE);
+  stk.ss_size = SIG_STACK_SIZE;
   stk.ss_flags = 0;
   if (sigaltstack (&stk, NULL) < 0)
     panic ("sigaltstack: %s\n", strerror (errno));
@@ -241,5 +252,11 @@ main (int argc, char **argv)
     }
   if (verbose)
     printf ("SUCCESS.\n");
+
+  signal (SIGTERM, SIG_DFL);
+  stk.ss_flags = SS_DISABLE;
+  sigaltstack (&stk, NULL);
+  free (stk.ss_sp);
+
   return 0;
 }
diff --git a/frysk-imports/libunwind/tests/Gtest-concurrent.c b/frysk-imports/libunwind/tests/Gtest-concurrent.c
index 8166fc5..6f3447f 100644
--- a/frysk-imports/libunwind/tests/Gtest-concurrent.c
+++ b/frysk-imports/libunwind/tests/Gtest-concurrent.c
@@ -27,6 +27,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 # include "config.h"
 #endif
 
+#include "compiler.h"
+
 #include <libunwind.h>
 #include <limits.h>
 #include <pthread.h>
@@ -46,7 +48,7 @@ int got_usr1, got_usr2;
 char *sigusr1_sp;
 
 void
-handler (int sig)
+handler (int sig UNUSED)
 {
   unw_word_t ip;
   unw_context_t uc;
@@ -68,7 +70,7 @@ handler (int sig)
 }
 
 void *
-worker (void *arg)
+worker (void *arg UNUSED)
 {
   signal (SIGUSR1, handler);
 
@@ -102,7 +104,7 @@ doit (void)
 }
 
 int
-main (int argc, char **argv)
+main (int argc, char **argv UNUSED)
 {
   if (argc > 1)
     verbose = 1;
@@ -115,10 +117,12 @@ main (int argc, char **argv)
   if (verbose)
     printf ("Caching: global\n");
   unw_set_caching_policy (unw_local_addr_space, UNW_CACHE_GLOBAL);
+  doit ();
 
   if (verbose)
     printf ("Caching: per-thread\n");
   unw_set_caching_policy (unw_local_addr_space, UNW_CACHE_PER_THREAD);
+  doit ();
 
   if (nerrors)
     {
diff --git a/frysk-imports/libunwind/tests/Gtest-dyn1.c b/frysk-imports/libunwind/tests/Gtest-dyn1.c
index 2faa1f7..bc7dc9c 100644
--- a/frysk-imports/libunwind/tests/Gtest-dyn1.c
+++ b/frysk-imports/libunwind/tests/Gtest-dyn1.c
@@ -25,16 +25,23 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 /* This file tests dynamic code-generation via function-cloning.  */
 
+#include "flush-cache.h"
+
+#include "compiler.h"
+
 #include <libunwind.h>
-#include <malloc.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
-
+#include <signal.h>
 #include <sys/mman.h>
 
+#if UNW_TARGET_ARM
+#define MAX_FUNC_SIZE   96 	/* FIXME: arch/compiler dependent */
+#else
 #define MAX_FUNC_SIZE	2048	/* max. size of cloned function */
+#endif
 
 #define panic(args...)				\
 	{ fprintf (stderr, args); exit (-1); }
@@ -59,6 +66,20 @@ struct fdesc
 # define get_fdesc(fdesc,func)	(fdesc = *(struct fdesc *) &(func))
 # define get_funcp(fdesc)	((template_t) &(fdesc))
 # define get_gp(fdesc)		((fdesc).gp)
+#elif __arm__
+struct fdesc
+  {
+    long code;
+    long is_thumb;
+  };
+/* Workaround GCC bug: https://bugs.launchpad.net/gcc-linaro/+bug/721531 */
+# define get_fdesc(fdesc,func)  ({long tmp = (long) &(func); \
+                                  (fdesc).code = (long) &(func) & ~0x1; \
+                                  (fdesc).is_thumb = tmp & 0x1;})
+/*# define get_fdesc(fdesc,func)  ({(fdesc).code = (long) &(func) & ~0x1; \
+                                  (fdesc).is_thumb = (long) &(func) & 0x1;})*/
+# define get_funcp(fdesc)       ((template_t) ((fdesc).code | (fdesc).is_thumb))
+# define get_gp(fdesc)          (0)
 #else
 struct fdesc
   {
@@ -69,8 +90,6 @@ struct fdesc
 # define get_gp(fdesc)		(0)
 #endif
 
-extern void flush_cache (void *addr, size_t len);
-
 void
 template (int i, template_t self,
 	  int (*printer)(const char *, ...), const char *fmt, const char **arr)
@@ -116,7 +135,7 @@ sighandler (int signal)
       name[0] = '\0';
       off[0] = '\0';
       if (unw_get_proc_name (&cursor, name, sizeof (name), &offset) == 0
-	  && off > 0)
+	  && offset > 0)
 	snprintf (off, sizeof (off), "+0x%lx", (long) offset);
       if (verbose)
 	printf ("ip = %lx <%s%s>\n", (long) ip, name, off);
@@ -140,13 +159,13 @@ sighandler (int signal)
 }
 
 int
-dev_null (const char *format, ...)
+dev_null (const char *format UNUSED, ...)
 {
   return 0;
 }
 
 int
-main (int argc, char *argv[])
+main (int argc, char *argv[] UNUSED)
 {
   unw_dyn_region_info_t *region;
   unw_dyn_info_t di;
@@ -167,6 +186,7 @@ main (int argc, char *argv[])
   memcpy (mem, (void *) fdesc.code, MAX_FUNC_SIZE);
   mprotect ((void *) ((long) mem & ~(getpagesize () - 1)),
 	    2*getpagesize(), PROT_READ | PROT_WRITE | PROT_EXEC);
+
   flush_cache (mem, MAX_FUNC_SIZE);
 
   signal (SIGSEGV, sighandler);
diff --git a/frysk-imports/libunwind/tests/Gtest-exc.c b/frysk-imports/libunwind/tests/Gtest-exc.c
index 44b837d..1170bdd 100644
--- a/frysk-imports/libunwind/tests/Gtest-exc.c
+++ b/frysk-imports/libunwind/tests/Gtest-exc.c
@@ -97,7 +97,7 @@ a (int n)
 	    n, &stack, (unsigned long) get_bsp ());
 
   if (n > 0)
-    a (n - 1) + 1;
+    a (n - 1);
   else
     b (16);
 
diff --git a/frysk-imports/libunwind/tests/Gtest-init.cxx b/frysk-imports/libunwind/tests/Gtest-init.cxx
index d83ddbf..afded01 100644
--- a/frysk-imports/libunwind/tests/Gtest-init.cxx
+++ b/frysk-imports/libunwind/tests/Gtest-init.cxx
@@ -31,6 +31,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #include <unistd.h>
 
 #include <libunwind.h>
+#include "compiler.h"
 
 int verbose, errors;
 
@@ -45,7 +46,7 @@ class Test_Class {
 static Test_Class t;
 
 static void
-backtrace (void)
+do_backtrace (void)
 {
   char name[128], off[32];
   unw_word_t ip, offset;
@@ -62,7 +63,7 @@ backtrace (void)
       name[0] = '\0';
       off[0] = '\0';
       if (unw_get_proc_name (&cursor, name, sizeof (name), &offset) == 0
-	  && off > 0)
+	  && offset > 0)
 	snprintf (off, sizeof (off), "+0x%lx", (long) offset);
       if (verbose)
 	printf ("  [%lx] <%s%s>\n", (long) ip, name, off);
@@ -78,14 +79,14 @@ backtrace (void)
 static void
 b (void)
 {
-  backtrace();
+  do_backtrace();
 }
 
 static void
 a (void)
 {
   if (verbose)
-    printf ("backtrace() from atexit()-handler:\n");
+    printf ("do_backtrace() from atexit()-handler:\n");
   b();
   if (errors)
     abort ();	/* cannot portably call exit() from an atexit() handler */
@@ -94,12 +95,12 @@ a (void)
 Test_Class::Test_Class (void)
 {
   if (verbose)
-    printf ("backtrace() from constructor:\n");
+    printf ("do_backtrace() from constructor:\n");
   b();
 }
 
 int
-main (int argc, char **argv)
+main (int argc, char **argv UNUSED)
 {
   verbose = argc > 1;
   return atexit (a);
diff --git a/frysk-imports/libunwind/tests/Gtest-nomalloc.c b/frysk-imports/libunwind/tests/Gtest-nomalloc.c
new file mode 100644
index 0000000..5b97fc7
--- /dev/null
+++ b/frysk-imports/libunwind/tests/Gtest-nomalloc.c
@@ -0,0 +1,110 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2009 Google, Inc
+	Contributed by Arun Sharma <arun.sharma@google.com>
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <dlfcn.h>
+#include <libunwind.h>
+
+#define panic(args...)				\
+	{ fprintf (stderr, args); exit (-1); }
+
+int verbose;
+int num_errors;
+int in_unwind;
+
+void *
+malloc(size_t s)
+{
+  static void * (*func)();
+
+  if(!func)
+    func = (void *(*)()) dlsym(RTLD_NEXT, "malloc");
+
+  if (in_unwind) {
+    num_errors++;
+    return NULL;
+  } else {
+    return func(s);
+  }
+}
+
+static void
+do_backtrace (void)
+{
+  unw_word_t ip, sp;
+  unw_cursor_t cursor;
+  unw_context_t uc;
+  int ret;
+
+  in_unwind = 1;
+  unw_getcontext (&uc);
+  if (unw_init_local (&cursor, &uc) < 0)
+    panic ("unw_init_local failed!\n");
+
+  do
+    {
+      unw_get_reg (&cursor, UNW_REG_IP, &ip);
+      unw_get_reg (&cursor, UNW_REG_SP, &sp);
+
+      ret = unw_step (&cursor);
+      if (ret < 0)
+	{
+	  ++num_errors;
+	}
+    }
+  while (ret > 0);
+  in_unwind = 0;
+}
+
+void
+foo3 (void)
+{
+  do_backtrace ();
+}
+
+void
+foo2 (void)
+{
+  foo3 ();
+}
+
+void
+foo1 (void)
+{
+  foo2 ();
+}
+
+int
+main (void)
+{
+  foo1();
+
+  if (num_errors > 0)
+    {
+      fprintf (stderr, "FAILURE: detected %d errors\n", num_errors);
+      exit (-1);
+    }
+  return 0;
+}
diff --git a/frysk-imports/libunwind/tests/Gtest-resume-sig-rt.c b/frysk-imports/libunwind/tests/Gtest-resume-sig-rt.c
new file mode 100644
index 0000000..df515fc
--- /dev/null
+++ b/frysk-imports/libunwind/tests/Gtest-resume-sig-rt.c
@@ -0,0 +1,31 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2003-2004 Hewlett-Packard Co
+	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+   Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com>
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+/* The purpose of this test is to invoke different code paths in libunwind (on
+ * some architectures), that are executed when the SA_SIGINFO sigaction() flag
+ * is used.
+ */
+
+#define TEST_WITH_SIGINFO 1
+#include "Gtest-resume-sig.c"
diff --git a/frysk-imports/libunwind/tests/Gtest-resume-sig.c b/frysk-imports/libunwind/tests/Gtest-resume-sig.c
index a9a7688..147ecd0 100644
--- a/frysk-imports/libunwind/tests/Gtest-resume-sig.c
+++ b/frysk-imports/libunwind/tests/Gtest-resume-sig.c
@@ -27,12 +27,15 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 # include "config.h"
 #endif
 
+#include "compiler.h"
+
 #include <libunwind.h>
 #include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <unistd.h>
 #include <string.h>
+#include <unistd.h>
+#include <errno.h>
 
 #ifdef HAVE_IA64INTRIN_H
 # include <ia64intrin.h>
@@ -60,16 +63,22 @@ get_bsp (void)
 #endif
 }
 
+#ifdef TEST_WITH_SIGINFO
+void
+handler (int sig,
+         siginfo_t *si UNUSED,
+         void *ucontext UNUSED)
+#else
 void
 handler (int sig)
+#endif
 {
   unw_word_t ip;
-  sigset_t mask;
+  sigset_t mask, oldmask;
   unw_context_t uc;
   unw_cursor_t c;
   char foo;
   int ret;
-  int stepno;
 
 #if UNW_TARGET_IA64
   if (verbose)
@@ -86,49 +95,30 @@ handler (int sig)
 
       sigemptyset (&mask);
       sigaddset (&mask, SIGUSR2);
-      sigprocmask (SIG_BLOCK, &mask, NULL);
+      sigprocmask (SIG_BLOCK, &mask, &oldmask);
       kill (getpid (), SIGUSR2);	/* pend SIGUSR2 */
 
       signal (SIGUSR1, SIG_IGN);
-      signal (SIGUSR2, handler);
 
       if ((ret = unw_getcontext (&uc)) < 0)
 	panic ("unw_getcontext() failed: ret=%d\n", ret);
+#if UNW_TARGET_X86_64
+      /* unw_getcontext() doesn't save signal mask to avoid a syscall */
+      uc.uc_sigmask = oldmask; 
+#endif
       if ((ret = unw_init_local (&c, &uc)) < 0)
 	panic ("unw_init_local() failed: ret=%d\n", ret);
 
-      /* After fixing glibc's `__restore_rt' unwinding by CFI in:
-	 	http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/x86_64/sigaction.c.diff?cvsroot=glibc&r1=text&tr1=1.10&r2=text&tr2=1.12&f=u
-	 This test started failing as the original code stepped back directly
-	 out of `main' into `__libc_start_main' and so despite `SIGUSR2' was
-	 never hit (at least on GNU/Linux) the test PASSed due to exit code 0.
-	 Patch fixing the unwind is in Fedora Core glibc-2.5.90-11 upwards.
-	 Needing to implement also non-ia64 `resume_restores_sigmask'.  */
-
-      for (stepno = 0;; stepno++)
-        {
-	  char buf[512];
-
-	  if (stepno > 100)
-	    {
-	      panic ("Too many steps (%d)\n", stepno);
-	      break;
-	    }
-
-	  if ((ret = unw_get_proc_name (&c, buf, sizeof (buf), NULL)) < 0)
-	    panic ("unw_get_proc_name(%d) failed: ret=%d\n", stepno, ret);
-	  else
-	    {
-	      if (verbose)
-	        printf ("unw_get_proc_name(%d): %s\n", stepno, buf);
-	      if (!strcmp (buf, "kill") || !strcmp (buf, "main"))
-		break;
-	    }
-
-	  /* Step one frame behind `main' to get into `__libc_start_main'.  */
-	  if ((ret = unw_step (&c)) < 0)
-	    panic ("unw_step(%d) failed: ret=%d\n", stepno, ret);
-	}
+      if ((ret = unw_step (&c)) < 0)		/* step to signal trampoline */
+	panic ("unw_step(1) failed: ret=%d\n", ret);
+
+      if ((ret = unw_step (&c)) < 0)		/* step to kill() */
+	panic ("unw_step(2) failed: ret=%d\n", ret);
+
+#if defined(UNW_TARGET_TILEGX)
+      if ((ret = unw_step (&c)) < 0)		/* step to signal trampoline */
+	panic ("unw_step(2) failed: ret=%d\n", ret);
+#endif
 
       if ((ret = unw_get_reg (&c, UNW_REG_IP, &ip)) < 0)
 	panic ("unw_get_reg(IP) failed: ret=%d\n", ret);
@@ -142,10 +132,7 @@ handler (int sig)
       ++got_usr2;
       if (got_usr1)
 	{
-	  if (sigusr1_sp != &foo)
-	    panic ("Stack pointer changed from %p to %p between signals\n",
-		   sigusr1_sp, &foo);
-	  else if (verbose)
+	  if (verbose)
 	    printf ("OK: stack still at %p\n", &foo);
 	}
       signal (SIGUSR2, SIG_IGN);
@@ -155,15 +142,29 @@ handler (int sig)
 }
 
 int
-main (int argc, char **argv)
+main (int argc, char **argv UNUSED)
 {
+  struct sigaction sa;
   float d = 1.0;
   int n = 0;
 
   if (argc > 1)
     verbose = 1;
 
-  signal (SIGUSR1, handler);
+  memset (&sa, 0, sizeof(sa));
+#ifdef TEST_WITH_SIGINFO
+  sa.sa_sigaction = handler;
+  sa.sa_flags = SA_SIGINFO;
+#else
+  sa.sa_handler = handler;
+#endif
+
+  if (sigaction (SIGUSR1, &sa, NULL) != 0 ||
+      sigaction (SIGUSR2, &sa, NULL) != 0)
+    {
+      fprintf (stderr, "sigaction() failed: %s\n", strerror (errno));
+      return -1;
+    }
 
   /* Use the FPU a bit; otherwise we get spurious errors should the
      signal handler need to use the FPU for any reason.  This seems to
@@ -183,19 +184,10 @@ main (int argc, char **argv)
   if (!got_usr2)
     panic ("failed to get SIGUSR2\n");
 
-#ifdef __ia64__
-  if (!nerrors)
-    panic ("Unexpected PASS on non-ia64 platform\n");
-#endif /* !__ia64__ */
   if (nerrors)
     {
-#ifdef __ia64__
       fprintf (stderr, "FAILURE: detected %d errors\n", nerrors);
       exit (-1);
-#else /* !__ia64__ */
-      fprintf (stderr, "Known bug: non-ia64 `resume_restores_sigmask' not implemented\n");
-      exit (77);
-#endif /* !__ia64__ */
     }
 
   if (verbose)
diff --git a/frysk-imports/libunwind/tests/Gtest-trace.c b/frysk-imports/libunwind/tests/Gtest-trace.c
new file mode 100644
index 0000000..194379a
--- /dev/null
+++ b/frysk-imports/libunwind/tests/Gtest-trace.c
@@ -0,0 +1,277 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2010, 2011 by FERMI NATIONAL ACCELERATOR LABORATORY
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "compiler.h"
+
+#include <errno.h>
+#if HAVE_EXECINFO_H
+# include <execinfo.h>
+#else
+  extern int backtrace (void **, int);
+#endif
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <libunwind.h>
+
+#define panic(args...)				\
+	{ fprintf (stderr, args); exit (-1); }
+
+#define SIG_STACK_SIZE 0x100000
+
+int verbose;
+int num_errors;
+
+/* These variables are global because they
+ * cause the signal stack to overflow */
+char buf[512], name[256];
+void *addresses[3][128];
+unw_cursor_t cursor;
+unw_context_t uc;
+
+static void
+do_backtrace (void)
+{
+  unw_word_t ip;
+  int ret = -UNW_ENOINFO;
+  int depth = 0;
+  int i, n, m;
+
+  if (verbose)
+    printf ("\tnormal trace:\n");
+
+  unw_getcontext (&uc);
+  if (unw_init_local (&cursor, &uc) < 0)
+    panic ("unw_init_local failed!\n");
+
+  do
+    {
+      unw_get_reg (&cursor, UNW_REG_IP, &ip);
+      addresses[0][depth] = (void *) ip;
+    }
+  while ((ret = unw_step (&cursor)) > 0 && ++depth < 128);
+
+  if (ret < 0)
+    {
+      unw_get_reg (&cursor, UNW_REG_IP, &ip);
+      printf ("FAILURE: unw_step() returned %d for ip=%lx\n", ret, (long) ip);
+      ++num_errors;
+    }
+
+  if (verbose)
+    for (i = 0; i < depth; ++i)
+      printf ("\t #%-3d ip=%p\n", i, addresses[0][i]);
+
+  if (verbose)
+    printf ("\n\tvia backtrace():\n");
+
+  n = backtrace (addresses[1], 128);
+
+  if (verbose)
+    for (i = 0; i < n; ++i)
+	printf ("\t #%-3d ip=%p\n", i, addresses[1][i]);
+
+  if (verbose)
+    printf ("\n\tvia unw_backtrace():\n");
+
+  m = unw_backtrace (addresses[2], 128);
+
+  if (verbose)
+    for (i = 0; i < m; ++i)
+	printf ("\t #%-3d ip=%p\n", i, addresses[2][i]);
+
+  if (m != depth+1)
+    {
+      printf ("FAILURE: unw_step() loop and unw_backtrace() depths differ: %d vs. %d\n", depth, m);
+      ++num_errors;
+    }
+
+  if (n != depth+1)
+    {
+      printf ("FAILURE: unw_step() loop and backtrace() depths differ: %d vs. %d\n", depth, n);
+      ++num_errors;
+    }
+
+  if (n == m)
+    for (i = 1; i < n; ++i)
+      /* Allow one in difference in comparison, trace returns adjusted addresses. */
+      if (labs((unw_word_t) addresses[1][i] - (unw_word_t) addresses[2][i]) > 1)
+	{
+          printf ("FAILURE: backtrace() and unw_backtrace() addresses differ at %d: %p vs. %p\n",
+                  i, addresses[1][i], addresses[2][i]);
+          ++num_errors;
+	}
+
+  if (n == depth+1)
+    for (i = 1; i < depth; ++i)
+      /* Allow one in difference in comparison, trace returns adjusted addresses. */
+      if (labs((unw_word_t) addresses[0][i] - (unw_word_t) addresses[1][i]) > 1)
+	{
+          printf ("FAILURE: unw_step() loop and backtrace() addresses differ at %d: %p vs. %p\n",
+                  i, addresses[0][i], addresses[1][i]);
+          ++num_errors;
+	}
+}
+
+void
+foo (long val UNUSED)
+{
+  do_backtrace ();
+}
+
+void
+bar (long v)
+{
+  extern long f (long);
+  int arr[v];
+
+  /* This is a vain attempt to use up lots of registers to force
+     the frame-chain info to be saved on the memory stack on ia64.
+     It happens to work with gcc v3.3.4 and gcc v3.4.1 but perhaps
+     not with any other compiler.  */
+  foo (f (arr[0]) + (f (v) + (f (v) + (f (v) + (f (v) + (f (v) + (f (v)
+       + (f (v) + (f (v) + (f (v) + (f (v) + (f (v) + (f (v) + (f (v)
+       + (f (v) + (f (v) + (f (v) + (f (v) + (f (v) + (f (v) + (f (v)
+       + (f (v) + (f (v) + (f (v) + (f (v) + (f (v) + (f (v) + (f (v)
+       + (f (v) + (f (v) + (f (v) + (f (v) + (f (v) + (f (v) + (f (v)
+       + (f (v) + (f (v) + (f (v) + (f (v) + (f (v) + (f (v) + (f (v)
+       + (f (v) + (f (v) + (f (v) + (f (v) + (f (v) + (f (v) + (f (v)
+       + (f (v) + (f (v) + (f (v) + (f (v) + (f (v) + (f (v) + (f (v)
+       + (f (v) + (f (v) + (f (v) + (f (v) + (f (v) + (f (v) + (f (v)
+       + (f (v) + (f (v) + (f (v) + (f (v) + (f (v) + (f (v) + (f (v)
+       + (f (v) + (f (v) + (f (v) + (f (v) + (f (v) + (f (v) + (f (v)
+       + (f (v) + (f (v) + (f (v) + (f (v) + (f (v) + (f (v) + (f (v)
+       + (f (v) + (f (v) + (f (v) + (f (v) + (f (v) + (f (v) + (f (v)
+       + (f (v) + (f (v) + (f (v) + (f (v) + (f (v) + (f (v) + (f (v)
+       + (f (v) + (f (v) + (f (v) + (f (v) + (f (v) + (f (v) + (f (v)
+       + (f (v) + (f (v) + (f (v) + (f (v) + (f (v) + (f (v) + (f (v)
+       + (f (v) + (f (v) + (f (v) + (f (v) + (f (v) + (f (v) + f (v))
+       ))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+       )))))))))))))))))))))))))))))))))))))))))))))))))))))));
+}
+
+void
+sighandler (int signal, void *siginfo UNUSED, void *context)
+{
+  ucontext_t *uc UNUSED;
+  int sp;
+
+  uc = context;
+
+  if (verbose)
+    {
+      printf ("sighandler: got signal %d, sp=%p", signal, &sp);
+#if UNW_TARGET_IA64
+# if defined(__linux__)
+      printf (" @ %lx", uc->uc_mcontext.sc_ip);
+# else
+      {
+	uint16_t reason;
+	uint64_t ip;
+
+	__uc_get_reason (uc, &reason);
+	__uc_get_ip (uc, &ip);
+	printf (" @ %lx (reason=%d)", ip, reason);
+      }
+# endif
+#elif UNW_TARGET_X86
+#if defined __linux__
+      printf (" @ %lx", (unsigned long) uc->uc_mcontext.gregs[REG_EIP]);
+#elif defined __FreeBSD__
+      printf (" @ %lx", (unsigned long) uc->uc_mcontext.mc_eip);
+#endif
+#elif UNW_TARGET_X86_64
+#if defined __linux__
+      printf (" @ %lx", (unsigned long) uc->uc_mcontext.gregs[REG_RIP]);
+#elif defined __FreeBSD__
+      printf (" @ %lx", (unsigned long) uc->uc_mcontext.mc_rip);
+#endif
+#elif defined UNW_TARGET_ARM
+      printf (" @ %lx", (unsigned long) uc->uc_mcontext.arm_pc);
+#endif
+      printf ("\n");
+    }
+  do_backtrace();
+}
+
+int
+main (int argc, char **argv UNUSED)
+{
+  struct sigaction act;
+  stack_t stk;
+
+  verbose = (argc > 1);
+
+  if (verbose)
+    printf ("Normal backtrace:\n");
+
+  bar (1);
+
+  memset (&act, 0, sizeof (act));
+  act.sa_handler = (void (*)(int)) sighandler;
+  act.sa_flags = SA_SIGINFO;
+  if (sigaction (SIGTERM, &act, NULL) < 0)
+    panic ("sigaction: %s\n", strerror (errno));
+
+  if (verbose)
+    printf ("\nBacktrace across signal handler:\n");
+  kill (getpid (), SIGTERM);
+
+  if (verbose)
+    printf ("\nBacktrace across signal handler on alternate stack:\n");
+  stk.ss_sp = malloc (SIG_STACK_SIZE);
+  if (!stk.ss_sp)
+    panic ("failed to allocate %u bytes\n", SIG_STACK_SIZE);
+  stk.ss_size = SIG_STACK_SIZE;
+  stk.ss_flags = 0;
+  if (sigaltstack (&stk, NULL) < 0)
+    panic ("sigaltstack: %s\n", strerror (errno));
+
+  memset (&act, 0, sizeof (act));
+  act.sa_handler = (void (*)(int)) sighandler;
+  act.sa_flags = SA_ONSTACK | SA_SIGINFO;
+  if (sigaction (SIGTERM, &act, NULL) < 0)
+    panic ("sigaction: %s\n", strerror (errno));
+  kill (getpid (), SIGTERM);
+
+  if (num_errors > 0)
+    {
+      fprintf (stderr, "FAILURE: detected %d errors\n", num_errors);
+      exit (-1);
+    }
+
+  if (verbose)
+    printf ("SUCCESS.\n");
+
+  signal (SIGTERM, SIG_DFL);
+  stk.ss_flags = SS_DISABLE;
+  sigaltstack (&stk, NULL);
+  free (stk.ss_sp);
+
+  return 0;
+}
diff --git a/frysk-imports/libunwind/tests/Lperf-trace.c b/frysk-imports/libunwind/tests/Lperf-trace.c
new file mode 100644
index 0000000..1c3cf21
--- /dev/null
+++ b/frysk-imports/libunwind/tests/Lperf-trace.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if !defined(UNW_REMOTE_ONLY)
+#include "Gperf-trace.c"
+#endif
diff --git a/frysk-imports/libunwind/tests/Lrs-race.c b/frysk-imports/libunwind/tests/Lrs-race.c
new file mode 100644
index 0000000..6fe4972
--- /dev/null
+++ b/frysk-imports/libunwind/tests/Lrs-race.c
@@ -0,0 +1,1514 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2003-2005 Hewlett-Packard Co
+	Contributed by Paul Pluzhnikov <ppluzhnikov@google.com>
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+/*  Verify that register state caches work under all caching policies
+    in a multi-threaded environment with a large number IPs */
+
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#include "compiler.h"
+
+#include <stdio.h>
+#include <pthread.h>
+#include <stdlib.h>
+
+/* ITERS=1000, NTHREAD=10 caught some bugs in the past */
+#ifndef ITERS 
+#define ITERS 100
+#endif
+
+#ifndef NTHREAD
+#define NTHREAD 2
+#endif
+
+int verbose;
+
+void
+foo_0 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_1 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_2 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_3 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_4 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_5 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_6 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_7 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_8 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_9 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_10 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_11 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_12 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_13 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_14 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_15 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_16 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_17 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_18 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_19 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_20 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_21 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_22 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_23 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_24 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_25 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_26 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_27 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_28 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_29 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_30 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_31 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_32 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_33 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_34 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_35 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_36 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_37 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_38 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_39 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_40 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_41 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_42 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_43 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_44 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_45 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_46 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_47 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_48 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_49 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_50 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_51 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_52 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_53 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_54 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_55 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_56 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_57 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_58 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_59 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_60 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_61 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_62 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_63 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_64 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_65 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_66 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_67 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_68 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_69 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_70 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_71 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_72 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_73 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_74 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_75 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_76 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_77 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_78 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_79 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_80 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_81 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_82 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_83 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_84 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_85 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_86 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_87 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_88 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_89 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_90 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_91 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_92 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_93 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_94 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_95 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_96 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_97 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_98 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_99 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_100 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_101 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_102 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_103 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_104 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_105 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_106 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_107 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_108 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_109 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_110 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_111 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_112 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_113 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_114 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_115 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_116 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_117 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_118 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_119 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_120 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_121 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_122 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_123 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_124 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_125 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_126 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_127 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void
+foo_128 (void)
+{
+  void *buf[20];
+  int n;
+
+  if ((n = unw_backtrace (buf, 20)) < 3)
+    abort ();
+}
+
+void *
+bar(void *p UNUSED)
+{
+  int i;
+  for (i = 0; i < ITERS; ++i) {
+    foo_0 ();
+    foo_1 ();
+    foo_2 ();
+    foo_3 ();
+    foo_4 ();
+    foo_5 ();
+    foo_6 ();
+    foo_7 ();
+    foo_8 ();
+    foo_9 ();
+    foo_10 ();
+    foo_11 ();
+    foo_12 ();
+    foo_13 ();
+    foo_14 ();
+    foo_15 ();
+    foo_16 ();
+    foo_17 ();
+    foo_18 ();
+    foo_19 ();
+    foo_20 ();
+    foo_21 ();
+    foo_22 ();
+    foo_23 ();
+    foo_24 ();
+    foo_25 ();
+    foo_26 ();
+    foo_27 ();
+    foo_28 ();
+    foo_29 ();
+    foo_30 ();
+    foo_31 ();
+    foo_32 ();
+    foo_33 ();
+    foo_34 ();
+    foo_35 ();
+    foo_36 ();
+    foo_37 ();
+    foo_38 ();
+    foo_39 ();
+    foo_40 ();
+    foo_41 ();
+    foo_42 ();
+    foo_43 ();
+    foo_44 ();
+    foo_45 ();
+    foo_46 ();
+    foo_47 ();
+    foo_48 ();
+    foo_49 ();
+    foo_50 ();
+    foo_51 ();
+    foo_52 ();
+    foo_53 ();
+    foo_54 ();
+    foo_55 ();
+    foo_56 ();
+    foo_57 ();
+    foo_58 ();
+    foo_59 ();
+    foo_60 ();
+    foo_61 ();
+    foo_62 ();
+    foo_63 ();
+    foo_64 ();
+    foo_65 ();
+    foo_66 ();
+    foo_67 ();
+    foo_68 ();
+    foo_69 ();
+    foo_70 ();
+    foo_71 ();
+    foo_72 ();
+    foo_73 ();
+    foo_74 ();
+    foo_75 ();
+    foo_76 ();
+    foo_77 ();
+    foo_78 ();
+    foo_79 ();
+    foo_80 ();
+    foo_81 ();
+    foo_82 ();
+    foo_83 ();
+    foo_84 ();
+    foo_85 ();
+    foo_86 ();
+    foo_87 ();
+    foo_88 ();
+    foo_89 ();
+    foo_90 ();
+    foo_91 ();
+    foo_92 ();
+    foo_93 ();
+    foo_94 ();
+    foo_95 ();
+    foo_96 ();
+    foo_97 ();
+    foo_98 ();
+    foo_99 ();
+    foo_100 ();
+    foo_101 ();
+    foo_102 ();
+    foo_103 ();
+    foo_104 ();
+    foo_105 ();
+    foo_106 ();
+    foo_107 ();
+    foo_108 ();
+    foo_109 ();
+    foo_110 ();
+    foo_111 ();
+    foo_112 ();
+    foo_113 ();
+    foo_114 ();
+    foo_115 ();
+    foo_116 ();
+    foo_117 ();
+    foo_118 ();
+    foo_119 ();
+    foo_120 ();
+    foo_121 ();
+    foo_122 ();
+    foo_123 ();
+    foo_124 ();
+    foo_125 ();
+    foo_126 ();
+    foo_127 ();
+    foo_128 ();
+  }
+  return NULL;
+}
+
+int doit (void)
+{
+  pthread_t tid[NTHREAD];
+  int i;
+
+  for (i = 0; i < NTHREAD; ++i)
+    if (pthread_create (&tid[i], NULL, bar, NULL))
+      return 1;
+
+  for (i = 0; i < NTHREAD; ++i)
+    if (pthread_join (tid[i], NULL))
+      return 1;
+
+  return 0;
+}
+
+int
+main (int argc, char **argv UNUSED)
+{
+  if (argc > 1)
+    verbose = 1;
+
+  if (verbose)
+    printf ("Caching: none\n");
+  unw_set_caching_policy (unw_local_addr_space, UNW_CACHE_NONE);
+  doit ();
+
+  if (verbose)
+    printf ("Caching: global\n");
+  unw_set_caching_policy (unw_local_addr_space, UNW_CACHE_GLOBAL);
+  doit ();
+
+  if (verbose)
+    printf ("Caching: per-thread\n");
+  unw_set_caching_policy (unw_local_addr_space, UNW_CACHE_PER_THREAD);
+  doit ();
+
+  if (verbose)
+    printf ("SUCCESS\n");
+  return 0;
+}
diff --git a/frysk-imports/libunwind/tests/Ltest-cxx-exceptions.cxx b/frysk-imports/libunwind/tests/Ltest-cxx-exceptions.cxx
new file mode 100644
index 0000000..24bcd13
--- /dev/null
+++ b/frysk-imports/libunwind/tests/Ltest-cxx-exceptions.cxx
@@ -0,0 +1,80 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2010 stefan.demharter@gmx.net
+   Copyright (C) 2010 arun.sharma@google.com
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <libunwind.h>
+#include "compiler.h"
+
+#define panic(args...)				\
+	{ fprintf (stderr, args); exit (-1); }
+
+static int verbose;
+
+struct Test
+{
+  public: // --- ctor/dtor ---
+    Test() { ++counter_; }
+    ~Test() { -- counter_; }
+    Test(const Test&) { ++counter_; }
+
+  public: // --- static members ---
+    static int counter_;
+};
+
+int Test::counter_ = 0;
+
+// Called by foo
+extern "C" void bar()
+{
+  Test t;
+  try {
+    Test t;
+    throw 5;
+  } catch (...) {
+    Test t;
+    if (verbose)
+      printf("Throwing an int\n");
+    throw 6;
+  }
+}
+
+int main(int argc, char **argv UNUSED)
+{
+  if (argc > 1)
+    verbose = 1;
+  try {
+    Test t;
+    bar();
+  } catch (int) {
+    // Dtor of all Test-object has to be called.
+    if (Test::counter_ != 0)
+      panic("Counter non-zero\n");
+    return Test::counter_;
+  } catch (...) {
+    // An int was thrown - we should not get here.
+    panic("Int was thrown why are we here?\n");
+  }
+  exit(0);
+}
diff --git a/frysk-imports/libunwind/tests/Ltest-nocalloc.c b/frysk-imports/libunwind/tests/Ltest-nocalloc.c
new file mode 100644
index 0000000..f5c31b2
--- /dev/null
+++ b/frysk-imports/libunwind/tests/Ltest-nocalloc.c
@@ -0,0 +1,137 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2011 Google, Inc
+	Contributed by Paul Pluzhnikov <ppluzhnikov@google.com>
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <dlfcn.h>
+#include <pthread.h>
+
+#define panic(args...)				\
+	{ fprintf (stderr, args); exit (-1); }
+
+int num_mallocs;
+int num_callocs;
+int in_unwind;
+
+void *
+calloc(size_t n, size_t s)
+{
+  static void * (*func)(size_t, size_t);
+
+#ifdef __GLIBC__
+  /* In glibc, dlsym() calls calloc. Calling dlsym(RTLD_NEXT, "calloc") here
+     causes infinite recursion.  Instead, we simply use it by its other
+     name.  */
+  extern void *__libc_calloc(size_t, size_t);
+  if (!func)
+    func = &__libc_calloc;
+#else
+  if(!func)
+    func = dlsym(RTLD_NEXT, "calloc");
+#endif
+
+  if (in_unwind) {
+    num_callocs++;
+    return NULL;
+  } else {
+    return func(n, s);
+  }
+}
+
+void *
+malloc(size_t s)
+{
+  static void * (*func)(size_t);
+
+  if(!func)
+    func = dlsym(RTLD_NEXT, "malloc");
+
+  if (in_unwind) {
+    num_mallocs++;
+    return NULL;
+  } else {
+    return func(s);
+  }
+}
+
+static void
+do_backtrace (void)
+{
+  const int num_levels = 100;
+  void *pc[num_levels];
+
+  in_unwind = 1;
+  unw_backtrace(pc, num_levels);
+  in_unwind = 0;
+}
+
+void
+foo3 (void)
+{
+  do_backtrace ();
+}
+
+void
+foo2 (void)
+{
+  foo3 ();
+}
+
+void
+foo1 (void)
+{
+  foo2 ();
+}
+
+int
+main (void)
+{
+  int i, num_errors;
+
+  /* Create (and leak) 100 TSDs, then call backtrace()
+     and check that it doesn't call malloc()/calloc().  */
+  for (i = 0; i < 100; ++i) {
+    pthread_key_t key;
+    if (pthread_key_create (&key, NULL))
+      panic ("FAILURE: unable to create key %d\n", i);
+  }
+  /* Call backtrace right after thread creation,
+   * where we are sure that we're not inside malloc */
+  do_backtrace();
+  num_mallocs = num_callocs = 0;
+  foo1 ();
+  num_errors = num_mallocs + num_callocs;
+  if (num_errors > 0)
+    {
+      fprintf (stderr,
+	       "FAILURE: detected %d error%s (malloc: %d, calloc: %d)\n",
+	       num_errors, num_errors > 1 ? "s" : "",
+	       num_mallocs, num_callocs);
+      exit (-1);
+    }
+  return 0;
+}
diff --git a/frysk-imports/libunwind/tests/Ltest-nomalloc.c b/frysk-imports/libunwind/tests/Ltest-nomalloc.c
new file mode 100644
index 0000000..74d6331
--- /dev/null
+++ b/frysk-imports/libunwind/tests/Ltest-nomalloc.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if !defined(UNW_REMOTE_ONLY)
+#include "Gtest-nomalloc.c"
+#endif
diff --git a/frysk-imports/libunwind/tests/Ltest-resume-sig-rt.c b/frysk-imports/libunwind/tests/Ltest-resume-sig-rt.c
new file mode 100644
index 0000000..01fd6dc
--- /dev/null
+++ b/frysk-imports/libunwind/tests/Ltest-resume-sig-rt.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if !defined(UNW_REMOTE_ONLY)
+#include "Gtest-resume-sig-rt.c"
+#endif
diff --git a/frysk-imports/libunwind/tests/Ltest-trace.c b/frysk-imports/libunwind/tests/Ltest-trace.c
new file mode 100644
index 0000000..fb0e9c1
--- /dev/null
+++ b/frysk-imports/libunwind/tests/Ltest-trace.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if !defined(UNW_REMOTE_ONLY)
+#include "Gtest-trace.c"
+#endif
diff --git a/frysk-imports/libunwind/tests/Ltest-varargs.c b/frysk-imports/libunwind/tests/Ltest-varargs.c
new file mode 100644
index 0000000..17ac600
--- /dev/null
+++ b/frysk-imports/libunwind/tests/Ltest-varargs.c
@@ -0,0 +1,84 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#include "compiler.h"
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+int ok;
+int verbose;
+
+#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 3)
+void a (int, ...) __attribute__((optimize(0)));
+void b (void) __attribute__((optimize(0)));
+void c (void) __attribute__((optimize(0)));
+#endif
+
+void NOINLINE
+b (void)
+{
+  void *v[20];
+  int i, n;
+
+  n = unw_backtrace(v, 20);
+
+  /* Check that the number of addresses given by unw_backtrace() looks
+   * reasonable. If the compiler inlined everything, then this check will also
+   * break. */
+  if (n >= 7)
+    ok = 1;
+
+  if (verbose)
+    for (i = 0; i < n; ++i)
+      printf ("[%d] %p\n", i, v[i]);
+}
+
+void NOINLINE
+c (void)
+{
+    b ();
+}
+
+void NOINLINE
+a (int d, ...)
+{
+  switch (d)
+    {
+    case 5:
+      a (4, 2,4);
+      break;
+    case 4:
+      a (3, 1,3,5);
+      break;
+    case 3:
+      a (2, 11, 13, 17, 23);
+      break;
+    case 2:
+      a (1);
+      break;
+    case 1:
+      c ();
+    }
+}
+
+int
+main (int argc, char **argv UNUSED)
+{
+  if (argc > 1)
+    verbose = 1;
+
+  a (5, 3, 4, 5, 6);
+
+  if (!ok)
+    {
+      fprintf (stderr, "FAILURE: expected deeper backtrace.\n");
+      return 1;
+    }
+
+  if (verbose)
+    printf ("SUCCESS.\n");
+
+  return 0;
+}
diff --git a/frysk-imports/libunwind/tests/Makefile.am b/frysk-imports/libunwind/tests/Makefile.am
index 51cfe33..fe2dba8 100644
--- a/frysk-imports/libunwind/tests/Makefile.am
+++ b/frysk-imports/libunwind/tests/Makefile.am
@@ -1,8 +1,11 @@
 AM_CPPFLAGS = -I$(top_srcdir)/include
 
 EXTRA_DIST =	run-ia64-test-dyn1 run-ptrace-mapper run-ptrace-misc	\
-		run-check-namespace check-namespace.sh.in run-ptrace-signull 	\
-		run-ptrace-stepper
+		run-check-namespace run-coredump-unwind \
+		run-coredump-unwind-mdi check-namespace.sh.in \
+		Gtest-nomalloc.c
+
+MAINTAINERCLEANFILES = Makefile.in
 
 noinst_PROGRAMS_common =
 check_PROGRAMS_common = test-proc-info test-static-link \
@@ -17,7 +20,7 @@ if REMOTE_ONLY
 perf:
 
 else
- LIBUNWIND_local = ../src/libunwind.la
+ LIBUNWIND_local = $(top_builddir)/src/libunwind.la
 if ARCH_IA64
  noinst_PROGRAMS_arch = ia64-test-dyn1
  check_SCRIPTS_arch =	run-ia64-test-dyn1
@@ -26,30 +29,59 @@ if ARCH_IA64
 			Gia64-test-rbs Lia64-test-rbs			\
 			Gia64-test-readonly Lia64-test-readonly		\
 			ia64-test-setjmp ia64-test-sig
-else
+else #!ARCH_IA64
 if ARCH_PPC64
-if USE_ALTIVEC 
- noinst_PROGRAMS_arch_altivec = ppc64-test-altivec ppc64-test-wchar
+if USE_ALTIVEC
+ noinst_PROGRAMS_arch = ppc64-test-altivec
 endif #USE_ALTIVEC
- noinst_PROGRAMS_arch = $(noinst_PROGRAMS_arch_altivec) ppc64-test-wchar 
 endif #ARCH_PPC64
-endif #ARCH_IA64
- check_SCRIPTS_cdep =	run-ptrace-mapper run-ptrace-misc
+endif #!ARCH_IA64
+ check_SCRIPTS_cdep =
  check_PROGRAMS_cdep =	Gtest-bt Ltest-bt Gtest-exc Ltest-exc		 \
 			Gtest-init Ltest-init				 \
 			Gtest-concurrent Ltest-concurrent		 \
 			Gtest-resume-sig Ltest-resume-sig		 \
+			Gtest-resume-sig-rt Ltest-resume-sig-rt		 \
 			Gtest-dyn1 Ltest-dyn1				 \
+			Gtest-trace Ltest-trace				 \
 			test-async-sig test-flush-cache test-init-remote \
-			test-mem test-setjmp test-ptrace
- noinst_PROGRAMS_cdep = forker mapper test-ptrace-misc test-varargs	\
-			Gperf-simple Lperf-simple test-ptrace-stepper test-ptrace-signull
+			test-mem Ltest-varargs Ltest-nomalloc	 \
+			Ltest-nocalloc Lrs-race
+ noinst_PROGRAMS_cdep = forker Gperf-simple Lperf-simple \
+			Gperf-trace Lperf-trace
+
+if BUILD_PTRACE
+ check_SCRIPTS_cdep += run-ptrace-mapper run-ptrace-misc
+ check_PROGRAMS_cdep += test-ptrace
+ noinst_PROGRAMS_cdep += mapper test-ptrace-misc
+endif
+
+if BUILD_SETJMP
+ check_PROGRAMS_cdep += test-setjmp
+endif
+
+if SUPPORT_CXX_EXCEPTIONS
+ check_PROGRAMS_cdep += Ltest-cxx-exceptions
+endif
+
+if OS_LINUX
+if BUILD_COREDUMP
+ check_SCRIPTS_cdep += run-coredump-unwind
+ noinst_PROGRAMS_cdep += crasher test-coredump-unwind
 
-perf: perf-startup Gperf-simple Lperf-simple
+if HAVE_LZMA
+ check_SCRIPTS_cdep += run-coredump-unwind-mdi
+endif # HAVE_LZMA
+endif # BUILD_COREDUMP
+endif # OS_LINUX
+
+perf: perf-startup Gperf-simple Lperf-simple Lperf-trace
 	@echo "########## Basic performance of generic libunwind:"
 	@./Gperf-simple
 	@echo "########## Basic performance of local-only libunwind:"
 	@./Lperf-simple
+	@echo "########## Performance of fast unwind:"
+	@./Lperf-trace
 	@echo "########## Startup overhead:"
 	@$(srcdir)/perf-startup @arch@
 
@@ -62,9 +94,24 @@ check_SCRIPTS =	$(check_SCRIPTS_common) $(check_SCRIPTS_cdep) \
 
 
 TESTS = $(check_PROGRAMS) $(check_SCRIPTS)
-# Until http://sourceware.org/ml/libc-alpha/2006-11/msg00082.html
-# gets finally resolved, fix was present in RawHide glibc-2.5.90-11.
-XFAIL_TESTS = run-ptrace-signull
+XFAIL_TESTS =
+
+if !ARCH_IA64
+XFAIL_TESTS += Gtest-dyn1 Ltest-dyn1
+endif
+
+# Use if arch defines but does not support PTRACE_SINGLESTEP
+# ptrace request used in the tests.
+XFAIL_TESTS_PTRACE_SINGLESTEP = run-ptrace-mapper run-ptrace-misc
+
+if ARCH_MIPS
+XFAIL_TESTS += $(XFAIL_TESTS_PTRACE_SINGLESTEP)
+endif
+
+if ARCH_ARM
+# ARM Linux kernel >=2.6.39 removed PTRACE_SINGLESTEP emulation
+XFAIL_TESTS += $(XFAIL_TESTS_PTRACE_SINGLESTEP)
+endif
 
 noinst_PROGRAMS = $(noinst_PROGRAMS_common) $(noinst_PROGRAMS_cdep) \
 	$(noinst_PROGRAMS_arch)
@@ -79,29 +126,93 @@ Lia64_test_rbs_SOURCES = Lia64-test-rbs.c ia64-test-rbs-asm.S ia64-test-rbs.h
 Gia64_test_rbs_SOURCES = Gia64-test-rbs.c ia64-test-rbs-asm.S ia64-test-rbs.h
 Lia64_test_nat_SOURCES = Lia64-test-nat.c ia64-test-nat-asm.S
 Gia64_test_nat_SOURCES = Gia64-test-nat.c ia64-test-nat-asm.S
-ia64_test_dyn1_SOURCES = ia64-test-dyn1.c ia64-dyn-asm.S flush-cache.S
+ia64_test_dyn1_SOURCES = ia64-test-dyn1.c ia64-dyn-asm.S flush-cache.S \
+				flush-cache.h
 ppc64_test_altivec_SOURCES = ppc64-test-altivec.c  ppc64-test-altivec-utils.c
-ppc64_test_wchar_SOURCES = ppc64-test-wchar.c
 Gtest_init_SOURCES = Gtest-init.cxx
 Ltest_init_SOURCES = Ltest-init.cxx
-Gtest_dyn1_SOURCES = Gtest-dyn1.c flush-cache.S
-Ltest_dyn1_SOURCES = Ltest-dyn1.c flush-cache.S
+Ltest_cxx_exceptions_SOURCES = Ltest-cxx-exceptions.cxx
+
+Gtest_dyn1_SOURCES = Gtest-dyn1.c flush-cache.S flush-cache.h
+Ltest_dyn1_SOURCES = Ltest-dyn1.c flush-cache.S flush-cache.h
 test_static_link_SOURCES = test-static-link-loc.c test-static-link-gen.c
 test_static_link_LDFLAGS = -static
 forker_LDFLAGS = -static
 Gtest_bt_SOURCES = Gtest-bt.c ident.c
 Ltest_bt_SOURCES = Ltest-bt.c ident.c
 test_ptrace_misc_SOURCES = test-ptrace-misc.c ident.c
-test_ptrace_stepper_SOURCES = test-ptrace-stepper.c
-test_ptrace_signull_SOURCES = test-ptrace-signull.c
-
-LIBUNWIND = ../src/libunwind-$(arch).la $(LIBUNWIND_local)
-LDADD = $(LIBUNWIND)
-
-test_setjmp_LDADD = ../src/libunwind-setjmp.la $(LIBUNWIND_local)
-ia64_test_setjmp_LDADD = ../src/libunwind-setjmp.la $(LIBUNWIND_local)
-test_ptrace_LDADD = ../src/libunwind-ptrace.a $(LIBUNWIND)
-Ltest_concurrent_LDADD = $(LIBUNWIND) -lpthread
-Gtest_concurrent_LDADD = $(LIBUNWIND) -lpthread
-test_async_sig_LDADD = $(LIBUNWIND) -lpthread
-test_ptrace_stepper_LDADD = $(LIBUNWIND) -lpthread
+Ltest_nomalloc_SOURCES = Ltest-nomalloc.c
+Ltest_nocalloc_SOURCES = Ltest-nocalloc.c
+Gtest_trace_SOURCES = Gtest-trace.c ident.c
+Ltest_trace_SOURCES = Ltest-trace.c ident.c
+
+LIBUNWIND = $(top_builddir)/src/libunwind-$(arch).la
+LIBUNWIND_ptrace = $(top_builddir)/src/libunwind-ptrace.la
+LIBUNWIND_coredump = $(top_builddir)/src/libunwind-coredump.la
+
+if USE_ELF32
+LIBUNWIND_ELF = $(top_builddir)/src/libunwind-elf32.la
+endif
+if USE_ELF64
+LIBUNWIND_ELF = $(top_builddir)/src/libunwind-elf64.la
+endif
+if USE_ELFXX
+LIBUNWIND_ELF = $(top_builddir)/src/libunwind-elfxx.la
+endif
+
+LIBUNWIND_setjmp = $(top_builddir)/src/libunwind-setjmp.la	\
+		   $(LIBUNWIND_ELF) $(LIBUNWIND)
+
+test_async_sig_LDADD = $(LIBUNWIND_local) -lpthread
+test_flush_cache_LDADD = $(LIBUNWIND_local)
+test_init_remote_LDADD = $(LIBUNWIND) $(LIBUNWIND_local)
+test_mem_LDADD = $(LIBUNWIND) $(LIBUNWIND_local)
+test_ptrace_LDADD = $(LIBUNWIND_ptrace) $(LIBUNWIND)
+test_proc_info_LDADD = $(LIBUNWIND)
+test_static_link_LDADD = $(LIBUNWIND)
+test_strerror_LDADD = $(LIBUNWIND)
+Lrs_race_LDADD = $(LIBUNWIND_local) -lpthread
+Ltest_varargs_LDADD = $(LIBUNWIND_local)
+
+Gtest_bt_LDADD = $(LIBUNWIND) $(LIBUNWIND_local)
+Gtest_concurrent_LDADD = $(LIBUNWIND) $(LIBUNWIND_local) -lpthread
+Gtest_dyn1_LDADD = $(LIBUNWIND) $(LIBUNWIND_local)
+Gtest_exc_LDADD = $(LIBUNWIND) $(LIBUNWIND_local)
+Gtest_init_LDADD = $(LIBUNWIND) $(LIBUNWIND_local)
+Gtest_resume_sig_LDADD = $(LIBUNWIND) $(LIBUNWIND_local)
+Gtest_resume_sig_rt_LDADD = $(LIBUNWIND) $(LIBUNWIND_local)
+Gperf_simple_LDADD = $(LIBUNWIND) $(LIBUNWIND_local)
+Gtest_trace_LDADD=$(LIBUNWIND) $(LIBUNWIND_local)
+Gperf_trace_LDADD = $(LIBUNWIND) $(LIBUNWIND_local)
+
+Ltest_bt_LDADD = $(LIBUNWIND_local)
+Ltest_concurrent_LDADD = $(LIBUNWIND_local) -lpthread
+Ltest_dyn1_LDADD = $(LIBUNWIND_local)
+Ltest_exc_LDADD = $(LIBUNWIND_local)
+Ltest_init_LDADD = $(LIBUNWIND_local)
+Ltest_nomalloc_LDADD = $(LIBUNWIND_local) @DLLIB@
+Ltest_nocalloc_LDADD = $(LIBUNWIND_local) @DLLIB@ -lpthread
+Ltest_resume_sig_LDADD = $(LIBUNWIND_local)
+Ltest_resume_sig_rt_LDADD = $(LIBUNWIND_local)
+Lperf_simple_LDADD = $(LIBUNWIND_local)
+Ltest_trace_LDADD = $(LIBUNWIND_local)
+Lperf_trace_LDADD = $(LIBUNWIND_local)
+
+test_setjmp_LDADD = $(LIBUNWIND_setjmp)
+ia64_test_setjmp_LDADD = $(LIBUNWIND_setjmp)
+
+if BUILD_COREDUMP
+test_coredump_unwind_LDADD = $(LIBUNWIND_coredump) $(LIBUNWIND)
+endif
+
+Gia64_test_nat_LDADD = $(LIBUNWIND) $(LIBUNWIND_local)
+Gia64_test_stack_LDADD = $(LIBUNWIND) $(LIBUNWIND_local)
+Gia64_test_rbs_LDADD = $(LIBUNWIND) $(LIBUNWIND_local)
+Gia64_test_readonly_LDADD = $(LIBUNWIND) $(LIBUNWIND_local)
+Lia64_test_nat_LDADD = $(LIBUNWIND_local)
+Lia64_test_stack_LDADD = $(LIBUNWIND_local)
+Lia64_test_rbs_LDADD = $(LIBUNWIND_local)
+Lia64_test_readonly_LDADD = $(LIBUNWIND_local)
+ia64_test_dyn1_LDADD = $(LIBUNWIND)
+ia64_test_sig_LDADD = $(LIBUNWIND)
+ppc64_test_altivec_LDADD = $(LIBUNWIND)
diff --git a/frysk-imports/libunwind/tests/check-namespace.sh.in b/frysk-imports/libunwind/tests/check-namespace.sh.in
index dedc462..1ef74ab 100644
--- a/frysk-imports/libunwind/tests/check-namespace.sh.in
+++ b/frysk-imports/libunwind/tests/check-namespace.sh.in
@@ -13,7 +13,7 @@ num_errors=0
 LIBUNWIND=../src/.libs/libunwind.so
 LIBUNWIND_GENERIC=../src/.libs/libunwind-${plat}.so
 
-function fetch_symtab {
+fetch_symtab () {
     filename=$1
 
     if [ ! -r $filename ]; then
@@ -38,12 +38,12 @@ function fetch_symtab {
     IFS="$saved_IFS"
 }
 
-function ignore {
+ignore () {
     sym=$1
     symtab=`echo "$symtab" | grep -v " ${sym}\$"`
 }
 
-function match {
+match () {
     sym=$1
     if `echo "$symtab" | grep -q " ${sym}\$"`; then
 	symtab=`echo "$symtab" | grep -v " ${sym}\$"`
@@ -57,7 +57,7 @@ function match {
 # Filter out miscellaneous symbols that get defined by the
 # linker for each shared object.
 #
-function filter_misc {
+filter_misc () {
     ignore _DYNAMIC
     ignore _GLOBAL_OFFSET_TABLE_
     ignore __bss_start
@@ -69,9 +69,25 @@ function filter_misc {
     ignore _Uelf64_valid_object
     ignore _U.*debug_level
     ignore ICRT.INTERNAL	# ICC 8.x defines this
+
+    # Ignore symbols generated by the ARM Linux default linker script.
+    # For details see the binutils sources (src/ld/emulparams/armelf_linux.sh).
+    if [ ${plat} = "arm" ]; then
+	ignore __bss_start__
+	ignore __bss_end__
+	ignore __end__
+	ignore _bss_end__
+    fi
+
+    if [ ${plat} = "mips" ]; then
+	ignore _fbss
+	ignore _fdata
+	ignore _ftext
+	ignore _gp
+    fi
 }
 
-function check_local_unw_abi {
+check_local_unw_abi () {
     match _UL${plat}_create_addr_space
     match _UL${plat}_destroy_addr_space
     match _UL${plat}_get_fpreg
@@ -83,6 +99,7 @@ function check_local_unw_abi {
     match _UL${plat}_init_local
     match _UL${plat}_init_remote
     match _UL${plat}_is_signal_frame
+    match _UL${plat}_handle_signal_frame
     match _UL${plat}_local_addr_space
     match _UL${plat}_resume
     match _UL${plat}_set_caching_policy
@@ -92,6 +109,7 @@ function check_local_unw_abi {
 
     match _U${plat}_flush_cache
     match _U${plat}_get_accessors
+    match _U${plat}_getcontext
     match _U${plat}_regname
     match _U${plat}_strerror
 
@@ -99,44 +117,70 @@ function check_local_unw_abi {
     match _U_dyn_info_list_addr
     match _U_dyn_register
 
+    match unw_backtrace
     match backtrace
 
     case ${plat} in
+	arm)
+	    match _U${plat}_get_elf_image
+	    match _U${plat}_is_fpreg
+	    match _UL${plat}_search_unwind_table
+	    match _UL${plat}_dwarf_search_unwind_table
+	    match _UL${plat}_dwarf_find_unwind_table
+	    ;;
 	hppa)
 	    match _UL${plat}_dwarf_search_unwind_table
+	    match _UL${plat}_dwarf_find_unwind_table
 	    match _U${plat}_get_elf_image
 	    match _U${plat}_setcontext
-	    match _U${plat}_getcontext
 	    ;;
 	ia64)
 	    match _UL${plat}_search_unwind_table
 	    match _U${plat}_get_elf_image
-	    case ${os} in
-		hpux*)
-		    ;;
-		*)
-		    match _U${plat}_getcontext
-		    ;;
-	    esac
 	    ;;
 	x86)
 	    match _U${plat}_get_elf_image
 	    match _U${plat}_is_fpreg
 	    match _UL${plat}_dwarf_search_unwind_table
+	    match _UL${plat}_dwarf_find_unwind_table
 	    ;;
 	x86_64)
 	    match _U${plat}_get_elf_image
 	    match _U${plat}_is_fpreg
 	    match _UL${plat}_dwarf_search_unwind_table
+	    match _UL${plat}_dwarf_find_unwind_table
+	    match _U${plat}_setcontext
+	    ;;
+	ppc*)
+	    match _U${plat}_get_func_addr
+	    match _U${plat}_get_elf_image
+	    match _U${plat}_is_fpreg
+	    match _UL${plat}_dwarf_search_unwind_table
+	    match _UL${plat}_dwarf_find_unwind_table
 	    ;;
+        tilegx)
+            match _U${plat}_is_fpreg
+	    match _UL${plat}_dwarf_search_unwind_table
+	    match _UL${plat}_dwarf_find_unwind_table
+            match _UL${plat}_local_addr_space_init
+            match _U${plat}_get_elf_image
+            match ${plat}_lock     
+            ;;
+
 	*)
 	    match _U${plat}_is_fpreg
 	    match _UL${plat}_dwarf_search_unwind_table
+	    match _UL${plat}_dwarf_find_unwind_table
 	    ;;
     esac
+
+    if [ x@enable_debug_frame@ = xyes ]; then
+	match _UL${plat}_dwarf_find_debug_frame
+    fi
+
 }
 
-function check_generic_unw_abi {
+check_generic_unw_abi () {
     match _U${plat}_create_addr_space
     match _U${plat}_destroy_addr_space
     match _U${plat}_flush_cache
@@ -150,6 +194,7 @@ function check_generic_unw_abi {
     match _U${plat}_init_local
     match _U${plat}_init_remote
     match _U${plat}_is_signal_frame
+    match _U${plat}_handle_signal_frame
     match _U${plat}_local_addr_space
     match _U${plat}_regname
     match _U${plat}_resume
@@ -160,8 +205,16 @@ function check_generic_unw_abi {
     match _U${plat}_strerror
 
     case ${plat} in
+	arm)
+	    match _U${plat}_is_fpreg
+	    match _U${plat}_get_elf_image
+	    match _U${plat}_search_unwind_table
+	    match _U${plat}_dwarf_search_unwind_table
+	    match _U${plat}_dwarf_find_unwind_table
+	    ;;
 	hppa)
 	    match _U${plat}_dwarf_search_unwind_table
+	    match _U${plat}_dwarf_find_unwind_table
 	    match _U${plat}_get_elf_image
 	    ;;
 	ia64)
@@ -180,20 +233,42 @@ function check_generic_unw_abi {
 	    match _U${plat}_get_elf_image
 	    match _U${plat}_is_fpreg
 	    match _U${plat}_dwarf_search_unwind_table
+	    match _U${plat}_dwarf_find_unwind_table
 	    ;;
 	x86_64)
 	    match _U${plat}_get_elf_image
 	    match _U${plat}_is_fpreg
 	    match _U${plat}_dwarf_search_unwind_table
+	    match _U${plat}_dwarf_find_unwind_table
 	    ;;
+	ppc*)
+	    match _U${plat}_get_elf_image
+	    match _U${plat}_get_func_addr
+	    match _U${plat}_is_fpreg
+	    match _U${plat}_dwarf_search_unwind_table
+	    match _U${plat}_dwarf_find_unwind_table
+	    ;;
+        tilegx)
+            match _U${plat}_dwarf_search_unwind_table
+	    match _U${plat}_dwarf_find_unwind_table
+            match _U${plat}_get_elf_image
+            match _U${plat}_is_fpreg
+            match _U${plat}_local_addr_space_init
+            match ${plat}_lock
+            ;;
 	*)
 	    match _U${plat}_is_fpreg
 	    match _U${plat}_dwarf_search_unwind_table
+	    match _U${plat}_dwarf_find_unwind_table
 	    ;;
     esac
+
+    if [ x@enable_debug_frame@ = xyes ]; then
+	match _U${plat}_dwarf_find_debug_frame
+    fi
 }
 
-function check_cxx_abi {
+check_cxx_abi () {
     match _Unwind_Backtrace
     match _Unwind_DeleteException
     match _Unwind_FindEnclosingFunction
@@ -203,6 +278,7 @@ function check_cxx_abi {
     match _Unwind_GetDataRelBase
     match _Unwind_GetGR
     match _Unwind_GetIP
+    match _Unwind_GetIPInfo
     match _Unwind_GetLanguageSpecificData
     match _Unwind_GetRegionStart
     match _Unwind_GetTextRelBase
@@ -220,6 +296,7 @@ function check_cxx_abi {
     match __libunwind_Unwind_GetDataRelBase
     match __libunwind_Unwind_GetGR
     match __libunwind_Unwind_GetIP
+    match __libunwind_Unwind_GetIPInfo
     match __libunwind_Unwind_GetLanguageSpecificData
     match __libunwind_Unwind_GetRegionStart
     match __libunwind_Unwind_GetTextRelBase
@@ -237,9 +314,9 @@ function check_cxx_abi {
     esac
 }
 
-function check_empty {
+check_empty () {
     if [ -n "$symtab" ]; then
-	echo -e "  ERROR: Extraneous symbols:\n$symtab"
+	printf "  ERROR: Extraneous symbols:\n$symtab\n"
 	num_errors=`expr $num_errors + 1`
     fi
 }
@@ -248,7 +325,9 @@ if [ $plat = $build_plat ]; then
     fetch_symtab $LIBUNWIND
     filter_misc
     check_local_unw_abi
-    check_cxx_abi
+    if [ x@enable_cxx_exceptions@ = xyes ]; then
+      check_cxx_abi
+    fi
     check_empty
 fi
 
@@ -259,7 +338,7 @@ check_empty
 
 if [ $num_errors -gt 0 ]; then
     echo "FAILURE: Detected $num_errors errors"
-    exit -1
+    exit 1
 fi
 
 if $verbose; then
diff --git a/frysk-imports/libunwind/tests/crasher.c b/frysk-imports/libunwind/tests/crasher.c
new file mode 100644
index 0000000..24c7805
--- /dev/null
+++ b/frysk-imports/libunwind/tests/crasher.c
@@ -0,0 +1,124 @@
+/* This program should crash and produce coredump */
+
+#include "compiler.h"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <unistd.h>
+#ifdef __FreeBSD__
+#include <sys/types.h>
+#include <sys/sysctl.h>
+#include <sys/user.h>
+#endif
+
+#if defined(__linux__)
+void write_maps(char *fname)
+{
+    char buf[512], path[128];
+    char exec;
+    uintmax_t addr;
+    FILE *maps = fopen("/proc/self/maps", "r");
+    FILE *out = fopen(fname, "w");
+
+    if (!maps || !out)
+        exit(EXIT_FAILURE);
+
+    while (fgets(buf, sizeof(buf), maps))
+    {
+        if (sscanf(buf, "%jx-%*x %*c%*c%c%*c %*x %*s %*d /%126[^\n]", &addr, &exec, path+1) != 3)
+            continue;
+
+        if (exec != 'x')
+            continue;
+
+        path[0] = '/';
+        fprintf(out, "0x%jx:%s ", addr, path);
+    }
+    fprintf(out, "\n");
+
+    fclose(out);
+    fclose(maps);
+}
+#elif defined(__FreeBSD__)
+void
+write_maps(char *fname)
+{
+    FILE *out;
+    char *buf, *bp, *eb;
+    struct kinfo_vmentry *kv;
+    int mib[4], error;
+    size_t len;
+
+    out = fopen(fname, "w");
+    if (out == NULL)
+        exit(EXIT_FAILURE);
+
+    len = 0;
+    mib[0] = CTL_KERN;
+    mib[1] = KERN_PROC;
+    mib[2] = KERN_PROC_VMMAP;
+    mib[3] = getpid();
+    error = sysctl(mib, 4, NULL, &len, NULL, 0);
+    if (error == -1)
+	exit(EXIT_FAILURE);
+    len = len * 4 / 3;
+    buf = malloc(len);
+    if (buf == NULL)
+	exit(EXIT_FAILURE);
+    error = sysctl(mib, 4, buf, &len, NULL, 0);
+    if (error == -1)
+	    exit(EXIT_FAILURE);
+
+    for (bp = buf, eb = buf + len; bp < eb; bp += kv->kve_structsize) {
+        kv = (struct kinfo_vmentry *)(uintptr_t)bp;
+	if (kv->kve_type == KVME_TYPE_VNODE &&
+	  (kv->kve_protection & KVME_PROT_EXEC) != 0) {
+	    fprintf(out, "0x%jx:%s ", kv->kve_start, kv->kve_path);
+	}
+    }
+
+    fprintf(out, "\n");
+    fclose(out);
+    free(buf);
+}
+#else
+#error Port me
+#endif
+
+#ifdef __GNUC__
+int c(int x) NOINLINE ALIAS(b);
+#define compiler_barrier() asm volatile("");
+#else
+int c(int x);
+#define compiler_barrier()
+#endif
+
+int NOINLINE a(void)
+{
+  *(volatile int *)32 = 1;
+  return 1;
+}
+
+int NOINLINE b(int x)
+{
+  int r;
+
+  compiler_barrier();
+  
+  if (x)
+    r = a();
+  else
+    r = c(1);
+  return r + 1;
+}
+
+int
+main (int argc, char **argv)
+{
+  if (argc > 1)
+      write_maps(argv[1]);
+  b(0);
+  return 0;
+}
+
diff --git a/frysk-imports/libunwind/tests/flush-cache.S b/frysk-imports/libunwind/tests/flush-cache.S
index d996492..3ee4726 100644
--- a/frysk-imports/libunwind/tests/flush-cache.S
+++ b/frysk-imports/libunwind/tests/flush-cache.S
@@ -1,3 +1,9 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifndef HAVE__BUILTIN___CLEAR_CACHE
+
 #if defined(__ia64__)
 
 	.global flush_cache
@@ -66,11 +72,33 @@ flush_cache:
 	lwz    31, -4(11) ;
 	mr      1, 11     ;
 	blr
+#elif defined(__arm__)
+	.text
+	.globl flush_cache
+flush_cache:
+	bx    lr
+#elif defined(__tilegx__)
+        .text
+        .globl flush_cache
+flush_cache:
+
+        andi r0, r0, -64
+1:      {
+         flush r0 ;
+         addi  r0, r0, 64
+        }
+        {
+         bgtz r1, 1b ;
+         addi r1, r1, -64
+        }
+        jrp   lr
 #else
 # error Need flush_cache code for this architecture.
 #endif
 
-#ifdef __linux__
+#if defined ( __linux__) && !defined (__arm__)
         /* We do not need executable stack.  */
         .section        .note.GNU-stack,"",@progbits
 #endif
+
+#endif
diff --git a/frysk-imports/libunwind/tests/flush-cache.h b/frysk-imports/libunwind/tests/flush-cache.h
new file mode 100644
index 0000000..8227d85
--- /dev/null
+++ b/frysk-imports/libunwind/tests/flush-cache.h
@@ -0,0 +1,38 @@
+/* libunwind - a platform-independent unwind library
+   Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com>
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
+
+#ifndef FLUSH_CACHE_H
+#define FLUSH_CACHE_H
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifdef HAVE__BUILTIN___CLEAR_CACHE
+#define flush_cache(ADDR, LEN) \
+  __builtin___clear_cache((ADDR), (ADDR) + (LEN))
+#else
+#include <stddef.h>
+extern void flush_cache (void *addr, size_t len);
+#endif
+
+#endif /* FLUSH_CACHE_H */
diff --git a/frysk-imports/libunwind/tests/ia64-test-dyn1.c b/frysk-imports/libunwind/tests/ia64-test-dyn1.c
index c47097c..90127dd 100644
--- a/frysk-imports/libunwind/tests/ia64-test-dyn1.c
+++ b/frysk-imports/libunwind/tests/ia64-test-dyn1.c
@@ -1,3 +1,5 @@
+#include "flush-cache.h"
+
 #include <assert.h>
 #include <libunwind.h>
 #include <unistd.h>
@@ -20,8 +22,6 @@ int verbose;
 # define EXTRA			0
 #endif
 
-extern void flush_cache (void *addr, size_t len);
-
 int
 make_executable (void *addr, size_t len)
 {
diff --git a/frysk-imports/libunwind/tests/ia64-test-setjmp.c b/frysk-imports/libunwind/tests/ia64-test-setjmp.c
index be487b6..50eaa01 100644
--- a/frysk-imports/libunwind/tests/ia64-test-setjmp.c
+++ b/frysk-imports/libunwind/tests/ia64-test-setjmp.c
@@ -73,7 +73,8 @@ sighandler (int signal, void *siginfo, void *sigcontext)
 /* Direct call of doit () at the end of doit () would get optimized by GCC to
    a branch.  */
 static void doit (int n);
-static volatile void (*doit_pointer) (int n) = doit;
+typedef void (*doit_type) (int);
+static volatile doit_type doit_pointer = doit;
 
 static void
 doit (int n)
diff --git a/frysk-imports/libunwind/tests/mapper.c b/frysk-imports/libunwind/tests/mapper.c
index 1006a8c..905f319 100644
--- a/frysk-imports/libunwind/tests/mapper.c
+++ b/frysk-imports/libunwind/tests/mapper.c
@@ -36,8 +36,12 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 #include <sys/mman.h>
 
+#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON)
+# define MAP_ANONYMOUS MAP_ANON
+#endif
+
 int
-main (int argc, char **argv)
+main (void)
 {
   long n = 0;
 
@@ -47,7 +51,7 @@ main (int argc, char **argv)
   printf ("Starting mmap test...\n");
   for (n = 0; n < 30000; ++n)
     {
-      if (mmap (0, 1, (n & 1) ? PROT_READ : PROT_WRITE,
+      if (mmap (NULL, 1, (n & 1) ? PROT_READ : PROT_WRITE,
 		MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE,
 		-1, 0) == MAP_FAILED)
 	{
diff --git a/frysk-imports/libunwind/tests/perf-startup b/frysk-imports/libunwind/tests/perf-startup
index c370748..1c24e9a 100755
--- a/frysk-imports/libunwind/tests/perf-startup
+++ b/frysk-imports/libunwind/tests/perf-startup
@@ -5,15 +5,15 @@ LIBUNWIND_PLAT=../src/.libs/libunwind-$platform.so
 warmup=$(./forker 2000 /bin/true | cut -f1 -d' ')
 
 nsec1=$(./forker 2000 /bin/true | cut -f1 -d' ')
-echo -e \"/bin/true\""\t\t\t\t\t\t": $nsec1 nsec/execution
+printf "\"/bin/true\"\t\t\t\t\t\t: $nsec1 nsec/execution\n"
 
 nsec2=$(LD_PRELOAD=$LIBUNWIND ./forker 2000 /bin/true | cut -f1 -d' ')
-echo -e \"LD_PRELOAD=$LIBUNWIND /bin/true\""\t": $nsec2 nsec/execution
+printf "\"LD_PRELOAD=$LIBUNWIND /bin/true\"\t: $nsec2 nsec/execution\n"
 
 nsec3=$(LD_PRELOAD=$LIBUNWIND_PLAT ./forker 2000 /bin/true | cut -f1 -d' ')
-echo -e \"LD_PRELOAD=$LIBUNWIND_PLAT /bin/true\""\t": $nsec3 nsec/execution
+printf "\"LD_PRELOAD=$LIBUNWIND_PLAT /bin/true\"\t: $nsec3 nsec/execution\n"
 
 echo
 
-echo -e "Overhead of preloading $LIBUNWIND\t: " $(($nsec2 - $nsec1)) nsec
-echo -e "Overhead of preloading $LIBUNWIND_PLAT\t: " $(($nsec3 - $nsec1)) nsec
+printf "Overhead of preloading $LIBUNWIND\t: $(($nsec2 - $nsec1)) nsec\n"
+printf "Overhead of preloading $LIBUNWIND_PLAT\t: $(($nsec3 - $nsec1)) nsec\n"
diff --git a/frysk-imports/libunwind/tests/ppc64-test-wchar.c b/frysk-imports/libunwind/tests/ppc64-test-wchar.c
deleted file mode 100644
index 01d637c..0000000
--- a/frysk-imports/libunwind/tests/ppc64-test-wchar.c
+++ /dev/null
@@ -1,20 +0,0 @@
-#include <wchar.h>
-#include <stdio.h>
-main ()
-{
-  wchar_t *wstring =
-    L"Now is the time for all good men to come to the aid of their country";
-  int i;
-  int ret;
-
-  printf("wcslen(wstring) = %d\n", wcslen(wstring));
-  for (i = 0; i < wcslen (wstring); i++)
-    {
-      ret = printf ("%lc", wstring[i]);
-      if (ret != 1) {
-	printf("printf returned: %d\n", ret);
-	perror("Linux says");
-      }
-    }
-  printf("\n");
-}
diff --git a/frysk-imports/libunwind/tests/run-coredump-unwind b/frysk-imports/libunwind/tests/run-coredump-unwind
new file mode 100755
index 0000000..8d07742
--- /dev/null
+++ b/frysk-imports/libunwind/tests/run-coredump-unwind
@@ -0,0 +1,53 @@
+#!/bin/sh
+
+# this function is slight modification of the one used in RPM
+# found at https://bugzilla.redhat.com/show_bug.cgi?id=834073
+# written by Alexander Larsson <alexl@redhat.com>
+add_minidebug()
+{
+  debuginfo="$1" ## we don't have separate debuginfo file
+  binary="$1"
+
+  dynsyms=`mktemp`
+  funcsyms=`mktemp`
+  keep_symbols=`mktemp`
+  mini_debuginfo=`mktemp`
+
+  # Extract the dynamic symbols from the main binary, there is no need to also have these
+  # in the normal symbol table
+  nm -D "$binary" --format=posix --defined-only | awk '{ print $1 }' | sort > "$dynsyms"
+  # Extract all the text (i.e. function) symbols from the debuginfo 
+  nm "$debuginfo" --format=posix --defined-only | awk '{ if ($2 == "T" || $2 == "t") print $1 }' | sort > "$funcsyms"
+  # Keep all the function symbols not already in the dynamic symbol table
+  comm -13 "$dynsyms" "$funcsyms" > "$keep_symbols"
+  # Copy the full debuginfo, keeping only a minumal set of symbols and removing some unnecessary sections
+  objcopy -S --remove-section .gdb_index --remove-section .comment --keep-symbols="$keep_symbols" "$debuginfo" "$mini_debuginfo" &> /dev/null
+  #Inject the compressed data into the .gnu_debugdata section of the original binary
+  xz "$mini_debuginfo"
+  mini_debuginfo="${mini_debuginfo}.xz"
+  objcopy --add-section .gnu_debugdata="$mini_debuginfo" "$binary"
+  rm -f "$dynsyms" "$funcsyms" "$keep_symbols" "$mini_debuginfo"
+
+  strip "$binary" ## throw away the symbol table
+}
+
+
+TESTDIR=`pwd`
+TEMPDIR=`mktemp --tmpdir -d libunwind-test-XXXXXXXXXX`
+trap "rm -r -- $TEMPDIR" EXIT
+
+cp crasher $TEMPDIR/crasher
+if [ "$1" = "-minidebuginfo" ]; then
+  add_minidebug $TEMPDIR/crasher
+fi
+
+# create core dump
+(
+    cd $TEMPDIR
+    ulimit -c 10000
+    ./crasher backing_files
+) 2>/dev/null
+COREFILE=$TEMPDIR/core*
+
+# magic option -testcase enables checking for the specific contents of the stack
+./test-coredump-unwind $COREFILE -testcase `cat $TEMPDIR/backing_files`
diff --git a/frysk-imports/libunwind/tests/run-coredump-unwind-mdi b/frysk-imports/libunwind/tests/run-coredump-unwind-mdi
new file mode 100755
index 0000000..6b7f0c1
--- /dev/null
+++ b/frysk-imports/libunwind/tests/run-coredump-unwind-mdi
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+# This test intends to test the unw_get_proc_name function on binaries without
+# the symbol table but with so called MiniDebuginfo available. In particular,
+# it is tested using the coredump accessors. For more info about MiniDebugInfo
+# see e.g. http://fedoraproject.org/wiki/Features/MiniDebugInfo
+
+./run-coredump-unwind -minidebuginfo
diff --git a/frysk-imports/libunwind/tests/run-ptrace-mapper b/frysk-imports/libunwind/tests/run-ptrace-mapper
index f51cf9a..dc3010d 100755
--- a/frysk-imports/libunwind/tests/run-ptrace-mapper
+++ b/frysk-imports/libunwind/tests/run-ptrace-mapper
@@ -1,2 +1,2 @@
 #!/bin/sh
-./test-ptrace -c -n -t ./mapper
+./test-ptrace -c -n -t ./mapper $*
diff --git a/frysk-imports/libunwind/tests/run-ptrace-signull b/frysk-imports/libunwind/tests/run-ptrace-signull
deleted file mode 100755
index 45bff27..0000000
--- a/frysk-imports/libunwind/tests/run-ptrace-signull
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/bin/sh
-# $Id: run-ptrace-signull,v 1.4 2007/10/11 11:21:44 mark Exp $
-
-# On i?86 it assumes the default `/proc/sys/kernel/vdso' == 1.
-sigframe=__kernel_sigreturn
-if [ `uname -m` = x86_64 ]
-then
-	sigframe=__restore_rt 
-fi 
-   
-./test-ptrace -t -b keeper,$sigframe,bowler+,main+,__libc_start_main+,_start+  ./test-ptrace-signull data_read
-./test-ptrace -t -b keeper,$sigframe,bowler+,main+,__libc_start_main+,_start+  ./test-ptrace-signull data_write
-./test-ptrace -t -b keeper,$sigframe,bowler+,main+,__libc_start_main+,_start+ ./test-ptrace-signull code_entry_point
-./test-ptrace -t -b keeper,$sigframe,bowler+,main+,__libc_start_main+,_start+  ./test-ptrace-signull code_descriptor
diff --git a/frysk-imports/libunwind/tests/run-ptrace-stepper b/frysk-imports/libunwind/tests/run-ptrace-stepper
deleted file mode 100755
index e8cf3c4..0000000
--- a/frysk-imports/libunwind/tests/run-ptrace-stepper
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/bin/sh
-# 
-# 00000000080484ec jump                             (sp=00000000bfdfa32c)
-#         proc=00000000080484ec-000000000804851a
-#         handler=0 lsda=0
-# 000000000804855d foo+0x31                         (sp=00000000bfdfa330)
-#         proc=000000000804852c-00000000080485d5
-#         handler=0 lsda=0
-# 00000000009a8420 __kernel_sigreturn               (sp=00000000bfdfa350)
-#         proc=00000000009a841f-00000000009a8428
-#         handler=0 lsda=0
-# 00000000080485d5 lockup                           (sp=00000000bfdfa62c)
-#         proc=00000000080485d5-00000000080485da
-#         handler=0 lsda=0
-# 0000000008048632 prefoo+0x58                      (sp=00000000bfdfa630)
-#         proc=00000000080485da-0000000008048634
-#         handler=0 lsda=0
-# 0000000008048697 main+0x63                        (sp=00000000bfdfa660)
-#         proc=0000000008048634-00000000080486a5
-#         handler=0 lsda=0
-# 000000000082fdec __libc_start_main+0xdc           (sp=00000000bfdfa690)
-#         proc=000000000082fd10-000000000082fded
-#         handler=0 lsda=0
-# 0000000008048461 _start+0x21                      (sp=00000000bfdfa700)
-#         proc=0000000008048440-0000000008048462
-#         handler=0 lsda=0
-# ================
-
-sigframe=__kernel_sigreturn
-if [ `uname -m` = x86_64 ]
-then
-	sigframe=__restore_rt
-fi
-./test-ptrace -t -b jump,foo+,$sigframe,lockup,prefoo+,main+,__libc_start_main+,_start+ ./test-ptrace-stepper
diff --git a/frysk-imports/libunwind/tests/test-async-sig.c b/frysk-imports/libunwind/tests/test-async-sig.c
index 9309076..2ce8b4b 100644
--- a/frysk-imports/libunwind/tests/test-async-sig.c
+++ b/frysk-imports/libunwind/tests/test-async-sig.c
@@ -23,6 +23,13 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 /* Check whether basic unwinding truly is async-signal safe.  */
 
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "compiler.h"
+
+#include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -45,6 +52,14 @@ int verbose;
 int nerrors;
 int sigcount;
 
+#ifndef CONFIG_BLOCK_SIGNALS
+/* When libunwind is configured with --enable-block-signals=no, the caller
+   is responsible for preventing recursion via signal handlers.
+   We use a simple global here.  In a multithreaded program, one would use
+   a thread-local variable.  */
+int recurcount;
+#endif
+
 #define panic(args...)					\
 	{ ++nerrors; fprintf (stderr, args); return; }
 
@@ -58,6 +73,12 @@ do_backtrace (int may_print, int get_proc_name)
   int ret;
   int depth = 0;
 
+#ifndef CONFIG_BLOCK_SIGNALS
+  if (recurcount > 0)
+    return;
+  recurcount += 1;
+#endif
+
   unw_getcontext (&uc);
   if (unw_init_local (&cursor, &uc) < 0)
     panic ("unw_init_local failed!\n");
@@ -70,7 +91,8 @@ do_backtrace (int may_print, int get_proc_name)
       buf[0] = '\0';
       if (get_proc_name || (may_print && verbose))
 	{
-	  if (unw_get_proc_name (&cursor, name, sizeof (name), &off) == 0)
+	  ret = unw_get_proc_name (&cursor, name, sizeof (name), &off);
+	  if (ret == 0 && (may_print && verbose))
 	    {
 	      if (off)
 		snprintf (buf, sizeof (buf), "<%s+0x%lx>", name, (long) off);
@@ -102,6 +124,10 @@ do_backtrace (int may_print, int get_proc_name)
         }
     }
   while (ret > 0);
+
+#ifndef CONFIG_BLOCK_SIGNALS
+  recurcount -= 1;
+#endif
 }
 
 void
@@ -135,7 +161,7 @@ sighandler (int signal)
 }
 
 int
-main (int argc, char **argv)
+main (int argc, char **argv UNUSED)
 {
   struct sigaction act;
   long i = 0;
@@ -159,8 +185,9 @@ main (int argc, char **argv)
       do_backtrace (0, (i++ % 100) == 0);
       if (nerrors > nerrors_max)
         {
-	  panic ("Too many errors (%d)\n", nerrors);
+	  fprintf (stderr, "Too many errors (%d)\n", nerrors);
 	  exit (-1);
         }
     }
+  return (0);
 }
diff --git a/frysk-imports/libunwind/tests/test-coredump-unwind.c b/frysk-imports/libunwind/tests/test-coredump-unwind.c
new file mode 100644
index 0000000..5254708
--- /dev/null
+++ b/frysk-imports/libunwind/tests/test-coredump-unwind.c
@@ -0,0 +1,395 @@
+/*
+ * Example program for unwinding core dumps.
+ *
+ * Compile a-la:
+ * gcc -Os -Wall \
+ *    -Wl,--start-group \
+ *        -lunwind -lunwind-x86 -lunwind-coredump \
+ *        example-core-unwind.c \
+ *    -Wl,--end-group \
+ *    -oexample-core-unwind
+ *
+ * Run:
+ * eu-unstrip -n --core COREDUMP
+ *   figure out which virtual addresses in COREDUMP correspond to which mapped executable files
+ *   (binary and libraries), then supply them like this:
+ * ./example-core-unwind COREDUMP 0x400000:/bin/crashed_program 0x3458600000:/lib/libc.so.6 [...]
+ *
+ * Note: Program eu-unstrip is part of elfutils, virtual addresses of shared
+ * libraries can be determined by ldd (at least on linux).
+ */
+
+#include "compiler.h"
+
+#undef _GNU_SOURCE
+#define _GNU_SOURCE 1
+#undef __USE_GNU
+#define __USE_GNU 1
+
+#include <assert.h>
+#include <ctype.h>
+#include <dirent.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <inttypes.h>
+#include <setjmp.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <string.h>
+#include <syslog.h>
+#include <sys/poll.h>
+#include <sys/mman.h>
+#include <sys/socket.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <sys/param.h>
+#include <termios.h>
+#include <time.h>
+#include <unistd.h>
+#include <stdbool.h>
+#include <limits.h>
+#include <pwd.h>
+#include <grp.h>
+
+/* For SIGSEGV handler code */
+#include <execinfo.h>
+#include <sys/ucontext.h>
+
+#include <libunwind-coredump.h>
+
+
+/* Utility logging functions */
+
+enum {
+    LOGMODE_NONE = 0,
+    LOGMODE_STDIO = (1 << 0),
+    LOGMODE_SYSLOG = (1 << 1),
+    LOGMODE_BOTH = LOGMODE_SYSLOG + LOGMODE_STDIO,
+};
+const char *msg_prefix = "";
+const char *msg_eol = "\n";
+int logmode = LOGMODE_STDIO;
+int xfunc_error_retval = EXIT_FAILURE;
+
+void xfunc_die(void)
+{
+  exit(xfunc_error_retval);
+}
+
+static void verror_msg_helper(const char *s,
+                              va_list p,
+                              const char* strerr,
+                              int flags)
+{
+  char *msg;
+  int prefix_len, strerr_len, msgeol_len, used;
+
+  if (!logmode)
+    return;
+
+  used = vasprintf(&msg, s, p);
+  if (used < 0)
+    return;
+
+  /* This is ugly and costs +60 bytes compared to multiple
+   * fprintf's, but is guaranteed to do a single write.
+   * This is needed for e.g. when multiple children
+   * can produce log messages simultaneously. */
+
+  prefix_len = msg_prefix[0] ? strlen(msg_prefix) + 2 : 0;
+  strerr_len = strerr ? strlen(strerr) : 0;
+  msgeol_len = strlen(msg_eol);
+  /* +3 is for ": " before strerr and for terminating NUL */
+  char *msg1 = (char*) realloc(msg, prefix_len + used + strerr_len + msgeol_len + 3);
+  if (!msg1)
+    {
+      free(msg);
+      return;
+    }
+  msg = msg1;
+  /* TODO: maybe use writev instead of memmoving? Need full_writev? */
+  if (prefix_len)
+    {
+      char *p;
+      memmove(msg + prefix_len, msg, used);
+      used += prefix_len;
+      p = stpcpy(msg, msg_prefix);
+      p[0] = ':';
+      p[1] = ' ';
+    }
+  if (strerr)
+    {
+      if (s[0])
+        {
+          msg[used++] = ':';
+          msg[used++] = ' ';
+        }
+      strcpy(&msg[used], strerr);
+      used += strerr_len;
+    }
+  strcpy(&msg[used], msg_eol);
+
+  if (flags & LOGMODE_STDIO)
+    {
+      fflush(stdout);
+      used += write(STDERR_FILENO, msg, used + msgeol_len);
+    }
+  msg[used] = '\0'; /* remove msg_eol (usually "\n") */
+  if (flags & LOGMODE_SYSLOG)
+    {
+      syslog(LOG_ERR, "%s", msg + prefix_len);
+    }
+  free(msg);
+}
+
+void log_msg(const char *s, ...)
+{
+  va_list p;
+  va_start(p, s);
+  verror_msg_helper(s, p, NULL, logmode);
+  va_end(p);
+}
+/* It's a macro, not function, since it collides with log() from math.h */
+#undef log
+#define log(...) log_msg(__VA_ARGS__)
+
+void error_msg(const char *s, ...)
+{
+  va_list p;
+  va_start(p, s);
+  verror_msg_helper(s, p, NULL, logmode);
+  va_end(p);
+}
+
+void error_msg_and_die(const char *s, ...)
+{
+  va_list p;
+  va_start(p, s);
+  verror_msg_helper(s, p, NULL, logmode);
+  va_end(p);
+  xfunc_die();
+}
+
+void perror_msg(const char *s, ...)
+{
+  va_list p;
+  va_start(p, s);
+  /* Guard against "<error message>: Success" */
+  verror_msg_helper(s, p, errno ? strerror(errno) : NULL, logmode);
+  va_end(p);
+}
+
+void perror_msg_and_die(const char *s, ...)
+{
+  va_list p;
+  va_start(p, s);
+  /* Guard against "<error message>: Success" */
+  verror_msg_helper(s, p, errno ? strerror(errno) : NULL, logmode);
+  va_end(p);
+  xfunc_die();
+}
+
+void die_out_of_memory(void)
+{
+  error_msg_and_die("Out of memory, exiting");
+}
+
+/* End of utility logging functions */
+
+
+
+static
+void handle_sigsegv(int sig, siginfo_t *info, void *ucontext)
+{
+  long ip = 0;
+  ucontext_t *uc UNUSED;
+
+  uc = ucontext;
+#if defined(__linux__)
+#ifdef UNW_TARGET_X86
+	ip = uc->uc_mcontext.gregs[REG_EIP];
+#elif defined(UNW_TARGET_X86_64)
+	ip = uc->uc_mcontext.gregs[REG_RIP];
+#elif defined(UNW_TARGET_ARM)
+	ip = uc->uc_mcontext.arm_pc;
+#endif
+#elif defined(__FreeBSD__)
+#ifdef __i386__
+	ip = uc->uc_mcontext.mc_eip;
+#elif defined(__amd64__)
+	ip = uc->uc_mcontext.mc_rip;
+#else
+#error Port me
+#endif
+#else
+#error Port me
+#endif
+  dprintf(2, "signal:%d address:0x%lx ip:0x%lx\n",
+			sig,
+			/* this is void*, but using %p would print "(null)"
+			 * even for ptrs which are not exactly 0, but, say, 0x123:
+			 */
+			(long)info->si_addr,
+			ip);
+
+  {
+    /* glibc extension */
+    void *array[50];
+    int size;
+    size = backtrace(array, 50);
+#ifdef __linux__
+    backtrace_symbols_fd(array, size, 2);
+#endif
+  }
+
+  _exit(1);
+}
+
+static void install_sigsegv_handler(void)
+{
+  struct sigaction sa;
+  memset(&sa, 0, sizeof(sa));
+  sa.sa_sigaction = handle_sigsegv;
+  sa.sa_flags = SA_SIGINFO;
+  sigaction(SIGSEGV, &sa, NULL);
+  sigaction(SIGILL, &sa, NULL);
+  sigaction(SIGFPE, &sa, NULL);
+  sigaction(SIGBUS, &sa, NULL);
+}
+
+int
+main(int argc UNUSED, char **argv)
+{
+  unw_addr_space_t as;
+  struct UCD_info *ui;
+  unw_cursor_t c;
+  int ret;
+
+#define TEST_FRAMES 4
+#define TEST_NAME_LEN 32
+  int testcase = 0;
+  int test_cur = 0;
+  long test_start_ips[TEST_FRAMES];
+  char test_names[TEST_FRAMES][TEST_NAME_LEN];
+
+  install_sigsegv_handler();
+
+  const char *progname = strrchr(argv[0], '/');
+  if (progname)
+    progname++;
+  else
+    progname = argv[0];
+
+  if (!argv[1])
+    error_msg_and_die("Usage: %s COREDUMP [VADDR:BINARY_FILE]...", progname);
+
+  msg_prefix = progname;
+
+  as = unw_create_addr_space(&_UCD_accessors, 0);
+  if (!as)
+    error_msg_and_die("unw_create_addr_space() failed");
+
+  ui = _UCD_create(argv[1]);
+  if (!ui)
+    error_msg_and_die("_UCD_create('%s') failed", argv[1]);
+  ret = unw_init_remote(&c, as, ui);
+  if (ret < 0)
+    error_msg_and_die("unw_init_remote() failed: ret=%d\n", ret);
+
+  argv += 2;
+
+  /* Enable checks for the crasher test program? */
+  if (*argv && !strcmp(*argv, "-testcase"))
+  {
+    testcase = 1;
+    logmode = LOGMODE_NONE;
+    argv++;
+  }
+
+  while (*argv)
+    {
+      char *colon;
+      long vaddr = strtol(*argv, &colon, 16);
+      if (*colon != ':')
+        error_msg_and_die("Bad format: '%s'", *argv);
+      if (_UCD_add_backing_file_at_vaddr(ui, vaddr, colon + 1) < 0)
+        error_msg_and_die("Can't add backing file '%s'", colon + 1);
+      argv++;
+    }
+
+  for (;;)
+    {
+      unw_word_t ip;
+      ret = unw_get_reg(&c, UNW_REG_IP, &ip);
+      if (ret < 0)
+        error_msg_and_die("unw_get_reg(UNW_REG_IP) failed: ret=%d\n", ret);
+
+      unw_proc_info_t pi;
+      ret = unw_get_proc_info(&c, &pi);
+      if (ret < 0)
+        error_msg_and_die("unw_get_proc_info(ip=0x%lx) failed: ret=%d\n", (long) ip, ret);
+
+      if (!testcase)
+        printf("\tip=0x%08lx proc=%08lx-%08lx handler=0x%08lx lsda=0x%08lx\n",
+				(long) ip,
+				(long) pi.start_ip, (long) pi.end_ip,
+				(long) pi.handler, (long) pi.lsda);
+
+      if (testcase && test_cur < TEST_FRAMES)
+        {
+           unw_word_t off;
+
+           test_start_ips[test_cur] = (long) pi.start_ip;
+           if (unw_get_proc_name(&c, test_names[test_cur], sizeof(test_names[0]), &off) != 0)
+           {
+             test_names[test_cur][0] = '\0';
+           }
+           test_cur++;
+        }
+
+      log("step");
+      ret = unw_step(&c);
+      log("step done:%d", ret);
+      if (ret < 0)
+    	error_msg_and_die("FAILURE: unw_step() returned %d", ret);
+      if (ret == 0)
+        break;
+    }
+  log("stepping ended");
+
+  /* Check that the second and third frames are equal, but distinct of the
+   * others */
+  if (testcase &&
+       (test_cur != 4
+       || test_start_ips[1] != test_start_ips[2]
+       || test_start_ips[0] == test_start_ips[1]
+       || test_start_ips[2] == test_start_ips[3]
+       )
+     )
+    {
+      fprintf(stderr, "FAILURE: start IPs incorrect\n");
+      return -1;
+    }
+
+  if (testcase &&
+       (  strcmp(test_names[0], "a")
+       || strcmp(test_names[1], "b")
+       || strcmp(test_names[2], "b")
+       || strcmp(test_names[3], "main")
+       )
+     )
+    {
+      fprintf(stderr, "FAILURE: procedure names are missing/incorrect\n");
+      return -1;
+    }
+
+  _UCD_destroy(ui);
+  unw_destroy_addr_space(as);
+
+  return 0;
+}
diff --git a/frysk-imports/libunwind/tests/test-flush-cache.c b/frysk-imports/libunwind/tests/test-flush-cache.c
index 180b5c2..592162c 100644
--- a/frysk-imports/libunwind/tests/test-flush-cache.c
+++ b/frysk-imports/libunwind/tests/test-flush-cache.c
@@ -25,15 +25,6 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#if HAVE_EXECINFO_H
-# include <execinfo.h>
-#else
-  extern int backtrace (void **, int);
-#endif
 #include <stdio.h>
 #include <string.h>
 
@@ -50,7 +41,7 @@ f257 (void)
 
   if (verbose)
     printf ("First backtrace:\n");
-  n = backtrace (buffer, 300);
+  n = unw_backtrace (buffer, 300);
   if (verbose)
     for (i = 0; i < n; ++i)
       printf ("[%d] ip=%p\n", i, buffer[i]);
@@ -59,7 +50,7 @@ f257 (void)
 
   if (verbose)
     printf ("\nSecond backtrace:\n");
-  n = backtrace (buffer, 300);
+  n = unw_backtrace (buffer, 300);
   if (verbose)
     for (i = 0; i < n; ++i)
       printf ("[%d] ip=%p\n", i, buffer[i]);
diff --git a/frysk-imports/libunwind/tests/test-init-remote.c b/frysk-imports/libunwind/tests/test-init-remote.c
index ac036d1..66f2d6a 100644
--- a/frysk-imports/libunwind/tests/test-init-remote.c
+++ b/frysk-imports/libunwind/tests/test-init-remote.c
@@ -32,6 +32,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 # include "config.h"
 #endif
 
+#include "compiler.h"
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -91,7 +93,7 @@ foo (void)
 }
 
 int
-main (int argc, char **argv)
+main (int argc, char **argv UNUSED)
 {
   verbose = (argc > 1);
 
diff --git a/frysk-imports/libunwind/tests/test-mem.c b/frysk-imports/libunwind/tests/test-mem.c
index 4f7e58c..52c9774 100644
--- a/frysk-imports/libunwind/tests/test-mem.c
+++ b/frysk-imports/libunwind/tests/test-mem.c
@@ -25,6 +25,8 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
+#include "compiler.h"
+
 #include <libunwind.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -82,7 +84,7 @@ consume_some_stack_space (void)
 }
 
 int
-main (int argc, char **argv)
+main (int argc, char **argv UNUSED)
 {
   struct rlimit rlim;
 
diff --git a/frysk-imports/libunwind/tests/test-proc-info.c b/frysk-imports/libunwind/tests/test-proc-info.c
index 9e039c6..c4145bc 100644
--- a/frysk-imports/libunwind/tests/test-proc-info.c
+++ b/frysk-imports/libunwind/tests/test-proc-info.c
@@ -36,6 +36,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #include <string.h>
 
 #include <libunwind.h>
+#include "compiler.h"
 
 int errors;
 
@@ -43,15 +44,20 @@ int errors;
 	{ ++errors; fprintf (stderr, args); return -1; }
 
 static int
-find_proc_info (unw_addr_space_t as, unw_word_t ip, unw_proc_info_t *pip,
-		int need_unwind_info, void *arg)
+find_proc_info (unw_addr_space_t as UNUSED,
+                unw_word_t ip UNUSED,
+                unw_proc_info_t *pip UNUSED,
+                int need_unwind_info UNUSED,
+                void *arg UNUSED)
 {
   return -UNW_ESTOPUNWIND;
 }
 
 static int
-access_mem (unw_addr_space_t as, unw_word_t addr, unw_word_t *valp,
-	    int write, void *arg)
+access_mem (unw_addr_space_t as UNUSED,
+            unw_word_t addr UNUSED,
+            unw_word_t *valp, int write,
+            void *arg UNUSED)
 {
   if (!write)
     *valp = 0;
@@ -59,8 +65,10 @@ access_mem (unw_addr_space_t as, unw_word_t addr, unw_word_t *valp,
 }
 
 static int
-access_reg (unw_addr_space_t as, unw_regnum_t regnum, unw_word_t *valp,
-	    int write, void *arg)
+access_reg (unw_addr_space_t as UNUSED,
+            unw_regnum_t regnum UNUSED,
+            unw_word_t *valp, int write,
+            void *arg UNUSED)
 {
   if (!write)
     *valp = 32;
@@ -68,36 +76,48 @@ access_reg (unw_addr_space_t as, unw_regnum_t regnum, unw_word_t *valp,
 }
 
 static int
-access_fpreg (unw_addr_space_t as, unw_regnum_t regnum, unw_fpreg_t *valp,
-	      int write, void *arg)
+access_fpreg (unw_addr_space_t as UNUSED,
+              unw_regnum_t regnum UNUSED,
+              unw_fpreg_t *valp, int write,
+              void *arg UNUSED)
 {
   if (!write)
-    memset (valp, 0, sizeof (valp));
+    memset (valp, 0, sizeof (*valp));
   return 0;
 }
 
 static int
-get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dilap, void *arg)
+get_dyn_info_list_addr (unw_addr_space_t as UNUSED,
+                        unw_word_t *dilap UNUSED,
+                        void *arg UNUSED)
 {
   return -UNW_ENOINFO;
 }
 
 static void
-put_unwind_info (unw_addr_space_t as, unw_proc_info_t *pi, void *arg)
+put_unwind_info (unw_addr_space_t as UNUSED,
+                 unw_proc_info_t *pi UNUSED,
+                 void *arg UNUSED)
 {
   ++errors;
   fprintf (stderr, "%s() got called!\n", __FUNCTION__);
 }
 
 static int
-resume (unw_addr_space_t as, unw_cursor_t *reg, void *arg)
+resume (unw_addr_space_t as UNUSED,
+        unw_cursor_t *reg UNUSED,
+        void *arg UNUSED)
 {
   panic ("%s() got called!\n", __FUNCTION__);
 }
 
 static int
-get_proc_name (unw_addr_space_t as, unw_word_t ip, char *buf, size_t buf_len,
-	       unw_word_t *offp, void *arg)
+get_proc_name (unw_addr_space_t as UNUSED,
+               unw_word_t ip UNUSED,
+               char *buf UNUSED,
+               size_t buf_len UNUSED,
+               unw_word_t *offp UNUSED,
+               void *arg UNUSED)
 {
   panic ("%s() got called!\n", __FUNCTION__);
 }
@@ -143,6 +163,8 @@ main (int argc, char **argv)
     panic ("Second call to unw_step() returned %d instead of %d\n",
 	   ret, -UNW_ESTOPUNWIND);
 
+  unw_destroy_addr_space (as);
+
   if (verbose)
     printf ("SUCCESS\n");
   return 0;
diff --git a/frysk-imports/libunwind/tests/test-ptrace-misc.c b/frysk-imports/libunwind/tests/test-ptrace-misc.c
index 562636a..374059d 100644
--- a/frysk-imports/libunwind/tests/test-ptrace-misc.c
+++ b/frysk-imports/libunwind/tests/test-ptrace-misc.c
@@ -23,6 +23,8 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
+#include "compiler.h"
+
 #include <signal.h>
 #include <stdint.h>
 #include <stdio.h>
@@ -104,7 +106,7 @@ bar (int v)
 }
 
 int
-main (int argc, char **argv)
+main (int argc, char **argv UNUSED)
 {
   int val = argc;
 
diff --git a/frysk-imports/libunwind/tests/test-ptrace-signull.c b/frysk-imports/libunwind/tests/test-ptrace-signull.c
deleted file mode 100644
index 4fa6409..0000000
--- a/frysk-imports/libunwind/tests/test-ptrace-signull.c
+++ /dev/null
@@ -1,116 +0,0 @@
-/* This testcase is part of libunwind.
-
-   Copyright 1996, 1999, 2003, 2004, 2006 Free Software Foundation, Inc.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
- 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-   02111-1307, USA.  */
-
-#include <signal.h>
-#include <setjmp.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <assert.h>
-
-enum tests {
-  data_read, data_write, code_entry_point, code_descriptor, invalid
-};
-
-/* Some basic types and zero buffers.  */
-
-typedef long data_t;
-typedef long code_t (void);
-data_t *volatile data;
-code_t *volatile code;
-/* "desc" is intentionally initialized to a data object.  This is
-   needed to test function descriptors on arches like ia64.  */
-data_t zero[10];
-code_t *volatile desc = (code_t *) (void *) zero;
-
-sigjmp_buf env;
-
-extern void
-keeper (int sig)
-{
-#if 0
-  /* `-s' invocation.  */
-  alarm (0);
-#endif
-
-  raise(SIGUSR2);
-
-  siglongjmp (env, 1);
-}
-
-extern long
-bowler (enum tests test)
-{
-  signal(SIGUSR1,SIG_IGN);
-  signal(SIGUSR2,SIG_IGN);
-  raise(SIGUSR1);
-
-  switch (test)
-    {
-    case data_read:
-      /* Try to read address zero.  */
-      return (*data);
-    case data_write:
-      /* Try to write (the assignment) to address zero.  */
-      return (*data) = 1;
-    case code_entry_point:
-      /* For typical architectures, call a function at address
-	 zero.  */
-      return (*code) ();
-    case code_descriptor:
-      /* For atypical architectures that use function descriptors,
-	 call a function descriptor, the code field of which is zero
-	 (which has the effect of jumping to address zero).  */
-      return (*desc) ();
-    case invalid:;
-      /* FALLTHRU */
-    }
-  assert (0);
-}
-
-int
-main (int argc, char **argv)
-{
-  enum tests test = invalid;
-
-#define ARG(string)					\
-  do							\
-    {							\
-      if (argc == 2 && !strcmp (argv[1], #string ))	\
-	test = string;					\
-    }							\
-  while (0)
-
-  ARG (data_read);
-  ARG (data_write);
-  ARG (code_entry_point);
-  ARG (code_descriptor);
-
-  assert (test != invalid);
-
-  struct sigaction act;
-  memset (&act, 0, sizeof act);
-  act.sa_handler = keeper;
-  sigaction (SIGSEGV, &act, NULL);
-
-  if (!sigsetjmp (env, 1))
-    bowler (test);
-
-  return 0;
-}
diff --git a/frysk-imports/libunwind/tests/test-ptrace-stepper.c b/frysk-imports/libunwind/tests/test-ptrace-stepper.c
deleted file mode 100644
index 5f181b4..0000000
--- a/frysk-imports/libunwind/tests/test-ptrace-stepper.c
+++ /dev/null
@@ -1,111 +0,0 @@
-// gcc -g -o stepper -lpthread stepper.c
-
-#include <stdio.h>
-#include <sys/types.h>
-#include <signal.h>
-#include <unistd.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <pthread.h>
-#include <sys/time.h>
-#include <assert.h>
-/* For `UNW_TARGET_*'.  */
-#include <libunwind.h>
-
-volatile int lock;
-volatile pid_t pid;
-volatile int sig;
-
-void shazaam () {
-	volatile __attribute__((__unused__)) char a;
-	volatile __attribute__((__unused__)) char b;
-	volatile __attribute__((__unused__)) char c;
-	volatile __attribute__((__unused__)) char d;
-}
-
-void jump ()
-{
-	int z = 1;
-	int y = 2;
-	int x = 3;
-	volatile __attribute__((__unused__)) int w = (((((x + y + z) * 20) / 10) - 0) + 1);
-	return;
-}
-
-void *signal_parent (void* args)
-{
-  pthread_exit (NULL);
-}
-
-void foo ()
-{
-  int a = 0;
-  int b = 0;
-  int c = 0;
-  long d = 0;
-  lock = 0;
-  while (1)
-    {
-      jump ();
-      a++;
-      b++;
-      c++;
-      d = a;
-      if (a + b == 2)
-		{
-	 	 if (b + d == 2)
-	  	  {
-	 	     a = 0;
-	 	     b = 0;
-		     c = 0;
-		     d = 0;
-	 		 if (d == 0)
-				d = 1;
-	    	}
-		}
-		signal(SIGUSR1,SIG_IGN);
-		raise(SIGUSR1);
-		jump ();
-    }
-}
-
-#if defined (UNW_TARGET_X86_64) || defined (UNW_TARGET_X86)
-asm (".cfi_startproc\n.globl lockup\n.type lockup,@function\nlockup: jmp lockup\n.cfi_endproc");
-extern void lockup (void);
-#elif defined (UNW_TARGET_PPC64)
-asm (".cfi_startproc\n.globl lockup\n.type lockup,@function\nlockup: b   lockup\n.cfi_endproc");
-extern void lockup (void);
-#else
-#warning "FIXME: Test may not work."
-static void lockup (void)
-{
-  for (;;);
-}
-#endif
-
-void prefoo ()
-{
-int err;
-
-	signal (SIGALRM, (void (*)(int signo)) foo);
-	err = alarm (1);
-	assert (err == 0);
-	lockup ();
-}
-
-int main (int argc, char ** argv)
-{
-  
-  lock = 1;
-
-  pthread_t thread;
-  pthread_create (&thread, NULL, signal_parent, NULL);
-
-  /* Start the tracing by: ./test-ptrace -t ...  */
-  signal(SIGUSR1,SIG_IGN);
-  raise(SIGUSR1);
-
-  prefoo ();
-
-  return 0;
-}
diff --git a/frysk-imports/libunwind/tests/test-ptrace.c b/frysk-imports/libunwind/tests/test-ptrace.c
index 419518d..a5b71dd 100644
--- a/frysk-imports/libunwind/tests/test-ptrace.c
+++ b/frysk-imports/libunwind/tests/test-ptrace.c
@@ -28,7 +28,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 #ifdef HAVE_TTRACE
 
 int
-main (int argc, char **argv)
+main (void)
 {
   printf ("FAILURE: ttrace() not supported yet\n");
   return -1;
@@ -39,6 +39,7 @@ main (int argc, char **argv)
 #include <errno.h>
 #include <fcntl.h>
 #include <libunwind-ptrace.h>
+#include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -47,8 +48,11 @@ main (int argc, char **argv)
 #include <sys/ptrace.h>
 #include <sys/wait.h>
 
-int nerrors;
+extern char **environ;
+
 static const int nerrors_max = 100;
+
+int nerrors;
 int verbose;
 int print_names = 1;
 
@@ -60,8 +64,6 @@ enum
   }
 trace_mode = SYSCALL;
 
-static char *backtrace_check[64];
-
 #define panic(args...)						\
 	do { fprintf (stderr, args); ++nerrors; } while (0)
 
@@ -71,7 +73,7 @@ static struct UPT_info *ui;
 static int killed;
 
 void
-do_backtrace (pid_t target_pid)
+do_backtrace (void)
 {
   unw_word_t ip, sp, start_ip = 0, off;
   int n = 0, ret;
@@ -79,7 +81,6 @@ do_backtrace (pid_t target_pid)
   unw_cursor_t c;
   char buf[512];
   size_t len;
-  char **backtrace_ptr = NULL;
 
   ret = unw_init_remote (&c, as, ui);
   if (ret < 0)
@@ -87,8 +88,6 @@ do_backtrace (pid_t target_pid)
 
   do
     {
-      char buf2[512];
-
       if ((ret = unw_get_reg (&c, UNW_REG_IP, &ip)) < 0
 	  || (ret = unw_get_reg (&c, UNW_REG_SP, &sp)) < 0)
 	panic ("unw_get_reg/unw_get_proc_name() failed: ret=%d\n", ret);
@@ -100,38 +99,6 @@ do_backtrace (pid_t target_pid)
       if (print_names)
 	unw_get_proc_name (&c, buf, sizeof (buf), &off);
 
-      if (*backtrace_check != NULL)
-        {
-	  strcpy (buf2, buf);
-	  if (off)
-	    {
-	      char *s;
-
-	      s = buf2 + strlen (buf2);
-	      if (s < buf2 + sizeof (buf2) - 1)
-	      *s++ = '+';
-	      *s = 0;
-	    }
-        }
-      if (n == 0 && *backtrace_check != NULL)
-        {
-	  if (strcmp (*backtrace_check, buf2) == 0)
-	    backtrace_ptr = backtrace_check;
-	}
-      if (backtrace_ptr != NULL)
-        {
-	  if (*backtrace_ptr == NULL)
-	    panic ("Excessive backtrace on level==%d, got \"%s\"\n",
-	           n, buf);
-	  else
-	    {
-	      if (strcmp (*backtrace_ptr, buf2) != 0)
-		panic ("Backtrace does not match on level==%d, want \"%s\", got \"%s\"\n",
-		       n, *backtrace_ptr, buf);
-	      backtrace_ptr++;
-	    }
-        }
-
       if (verbose)
 	{
 	  if (off)
@@ -192,14 +159,6 @@ do_backtrace (pid_t target_pid)
 
   if (verbose)
     printf ("================\n\n");
-
-  if (backtrace_ptr != NULL)
-    {
-      if (*backtrace_ptr != NULL)
-	panic ("Too short backtrace on level==%d, want \"%s\"\n",
-	       n, *backtrace_ptr);
-      killed = 1;
-    }
 }
 
 static pid_t target_pid;
@@ -219,13 +178,13 @@ main (int argc, char **argv)
 
   if (argc == 1)
     {
-      char *args[] = { "self", "/bin/ls", "/usr", NULL };
+      static char *args[] = { "self", "/bin/ls", "/usr", NULL };
 
       /* automated test case */
       argv = args;
     }
-  else
-    while (argv[optind] && argv[optind][0] == '-')
+  else if (argc > 1)
+    while (argv[optind][0] == '-')
       {
 	if (strcmp (argv[optind], "-v") == 0)
 	  ++optind, verbose = 1;
@@ -243,44 +202,11 @@ main (int argc, char **argv)
 	else if (strcmp (argv[optind], "-n") == 0)
 	  /* Don't look-up and print symbol names.  */
 	  ++optind, print_names = 0;
-	else if (strcmp (argv[optind], "-b") == 0 && argv[optind + 1])
-	  {
-	    /* Check the backtrace if it matches this ','-delimited list
-	       after the first backtrace function is the first of the list.
-	       Omit the trailing numbers after "+" but "+" should be present.  */
-	    char *arg = argv[optind + 1];
-	    char *s;
-	    char **dp;
-
-	    optind += 2;
-	    dp = backtrace_check;
-	    if (*backtrace_check != NULL)
-	      panic ("-b specified twice is unsupported");
-	    else
-	      while (*arg)
-		{
-		  char end_orig;
-
-		  s = strchr (arg, ',');
-		  if (!s)
-		    s = arg + strlen (arg);
-		  end_orig = *s;
-		  *s = 0;
-		  if (dp >= backtrace_check - 1
-			    + (sizeof (backtrace_check) / sizeof (*backtrace_check)))
-		    panic ("Too many arguments to -b\n");
-		  else
-		    *dp++ = arg;
-		  if (end_orig)
-		    arg = s + 1;
-		  else
-		    break;
-		}
-	      *dp = NULL;
-	  }
+	else
+	  fprintf(stderr, "unrecognized option: %s\n", argv[optind++]);
+        if (optind >= argc)
+          break;
       }
-  if (*backtrace_check && !print_names)
-    panic ("Options -b and -n conflict\n");
 
   target_pid = fork ();
   if (!target_pid)
@@ -290,7 +216,18 @@ main (int argc, char **argv)
       if (!verbose)
 	dup2 (open ("/dev/null", O_WRONLY), 1);
 
+#if HAVE_DECL_PTRACE_TRACEME
       ptrace (PTRACE_TRACEME, 0, 0, 0);
+#elif HAVE_DECL_PT_TRACE_ME
+      ptrace (PT_TRACE_ME, 0, 0, 0);
+#else
+#error Trace me
+#endif
+
+      if ((argc > 1) && (optind == argc)) {
+        fprintf(stderr, "Need to specify a command line for the child\n");
+        exit (-1);
+      }
       execve (argv[optind], argv + optind, environ);
       _exit (-1);
     }
@@ -300,7 +237,7 @@ main (int argc, char **argv)
 
   while (nerrors <= nerrors_max)
     {
-      pid = wait4 (-1, &status,  0, 0);
+      pid = wait4 (-1, &status, 0, NULL);
       if (pid == -1)
 	{
 	  if (errno == EINTR)
@@ -355,24 +292,56 @@ main (int argc, char **argv)
 	{
 	case TRIGGER:
 	  if (state)
+#if HAVE_DECL_PTRACE_CONT
 	    ptrace (PTRACE_CONT, target_pid, 0, 0);
+#elif HAVE_DECL_PT_CONTINUE
+	    ptrace (PT_CONTINUE, target_pid, (caddr_t)1, 0);
+#else
+#error Port me
+#endif
 	  else
 	    {
-	      do_backtrace (target_pid);
-	      ptrace (PTRACE_SINGLESTEP, target_pid, 0, pending_sig);
+	      do_backtrace ();
+#if HAVE_DECL_PTRACE_SINGLESTEP
+	      if (ptrace (PTRACE_SINGLESTEP, target_pid, 0, pending_sig) < 0)
+          {
+            panic ("ptrace(PTRACE_SINGLESTEP) failed (errno=%d)\n", errno);
+            killed = 1;
+          }
+#elif HAVE_DECL_PT_STEP
+	      if (ptrace (PT_STEP, target_pid, (caddr_t)1, pending_sig) < 0)
+          {
+            panic ("ptrace(PT_STEP) failed (errno=%d)\n", errno);
+            killed = 1;
+          }
+#else
+#error Singlestep me
+#endif
 	    }
 	  break;
 
 	case SYSCALL:
 	  if (!state)
-	    do_backtrace (target_pid);
+	    do_backtrace ();
 	  state ^= 1;
+#if HAVE_DECL_PTRACE_SYSCALL
 	  ptrace (PTRACE_SYSCALL, target_pid, 0, pending_sig);
+#elif HAVE_DECL_PT_SYSCALL
+	  ptrace (PT_SYSCALL, target_pid, (caddr_t)1, pending_sig);
+#else
+#error Syscall me
+#endif
 	  break;
 
 	case INSTRUCTION:
-	  do_backtrace (target_pid);
-	  ptrace (PTRACE_SINGLESTEP, target_pid, 0, pending_sig);
+	  do_backtrace ();
+#if HAVE_DECL_PTRACE_SINGLESTEP
+	      ptrace (PTRACE_SINGLESTEP, target_pid, 0, pending_sig);
+#elif HAVE_DECL_PT_STEP
+	      ptrace (PT_STEP, target_pid, (caddr_t)1, pending_sig);
+#else
+#error Singlestep me
+#endif
 	  break;
 	}
       if (killed)
@@ -380,9 +349,7 @@ main (int argc, char **argv)
     }
 
   _UPT_destroy (ui);
-
-  if (*backtrace_check != NULL && !killed)
-    panic ("-b requested but the first function was never found\n");
+  unw_destroy_addr_space (as);
 
   if (nerrors)
     {
diff --git a/frysk-imports/libunwind/tests/test-setjmp.c b/frysk-imports/libunwind/tests/test-setjmp.c
index 65c343b..769b71b 100644
--- a/frysk-imports/libunwind/tests/test-setjmp.c
+++ b/frysk-imports/libunwind/tests/test-setjmp.c
@@ -23,6 +23,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 /* The setjmp()/longjmp(), sigsetjmp()/siglongjmp().  */
 
+#include "compiler.h"
+
 #include <setjmp.h>
 #include <signal.h>
 #include <stdio.h>
@@ -139,7 +141,7 @@ sighandler (int signal)
 }
 
 int
-main (int argc, char **argv)
+main (int argc, char **argv UNUSED)
 {
   volatile sigset_t sigset1, sigset2, sigset3;
   volatile struct sigaction act;
diff --git a/frysk-imports/libunwind/tests/test-static-link-loc.c b/frysk-imports/libunwind/tests/test-static-link-loc.c
index d4a8a68..4e47e45 100644
--- a/frysk-imports/libunwind/tests/test-static-link-loc.c
+++ b/frysk-imports/libunwind/tests/test-static-link-loc.c
@@ -33,6 +33,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
 #define UNW_LOCAL_ONLY
 #include <libunwind.h>
+#include "compiler.h"
 
 extern int test_generic (void);
 
@@ -87,7 +88,7 @@ test_local (void)
 #endif /* !UNW_REMOTE_ONLY */
 
 int
-main (int argc, char **argv)
+main (int argc, char **argv UNUSED)
 {
   if (argc > 1)
     verbose = 1;
diff --git a/frysk-imports/libunwind/tests/test-strerror.c b/frysk-imports/libunwind/tests/test-strerror.c
index 582d322..f7ae61e 100644
--- a/frysk-imports/libunwind/tests/test-strerror.c
+++ b/frysk-imports/libunwind/tests/test-strerror.c
@@ -1,8 +1,9 @@
+#include "compiler.h"
 #include <libunwind.h>
 #include <stdio.h>
 
 int
-main (int argc, char **argv)
+main (int argc, char **argv UNUSED)
 {
   int i, verbose = argc > 1;
   const char *msg;
diff --git a/frysk-imports/libunwind/tests/test-varargs.c b/frysk-imports/libunwind/tests/test-varargs.c
deleted file mode 100644
index b712f5d..0000000
--- a/frysk-imports/libunwind/tests/test-varargs.c
+++ /dev/null
@@ -1,52 +0,0 @@
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-extern int backtrace (void **, int);
-
-static void
-b (void)
-{
-  void *v[20];
-  int i, n;
-
-  n = backtrace(v, 20);
-  for (i = 0; i < n; ++i)
-    printf ("[%d] %p\n", i, v[i]);
-}
-
-static void
-c (void)
-{
-    b ();
-}
-
-static void
-a (int d, ...)
-{
-  switch (d)
-    {
-    case 5:
-      a (4, 2,4);
-      break;
-    case 4:
-      a (3, 1,3,5);
-      break;
-    case 3:
-      a (2, 11, 13, 17, 23);
-      break;
-    case 2:
-      a (1);
-      break;
-    case 1:
-      c ();
-    }
-}
-
-int
-main (int argc, char **argv)
-{
-  a (5, 3, 4, 5, 6);
-  return 0;
-}
diff --git a/frysk-sys/Makefile.am b/frysk-sys/Makefile.am
index c0eda26..6e8e9a2 100644
--- a/frysk-sys/Makefile.am
+++ b/frysk-sys/Makefile.am
@@ -48,7 +48,7 @@ GEN_CLASSPATH += ../frysk-imports/getopt.jar
 GEN_CLASSPATH += $(JUNIT_JAR)
 
 # Force a few dependencies
-lib/unwind/cni/Unwind%.cxx: lib/unwind/Unwind%.java lib/unwind/cni/UnwindH.hxx
+lib/unwind/jni/Unwind%.cxx: lib/unwind/Unwind%.java lib/unwind/jni/UnwindH.hxx
 lib/unwind/Unwind%.java: lib/unwind/Unwind.java
 
 
@@ -57,10 +57,11 @@ JNI_LIBRARY_LIST += -lstdc++
 JNI_LIBRARY_LIST += -laudit
 JNI_LIBRARY_LIST += -ldw
 # Bundle in the local libunwind code.
-JNI_OBJECT_LIST += ../frysk-imports/libunwind-i386/src/{,dwarf/,mi/,x86/}.libs/*.o
-JNI_OBJECT_LIST += ../frysk-imports/libunwind-x86_64/src/{,dwarf/,mi/,x86_64/}.libs/*.o
-JNI_OBJECT_LIST += ../frysk-imports/libunwind-ppc32/src/{,dwarf/,mi/,ppc32/}.libs/*.o
-JNI_OBJECT_LIST += ../frysk-imports/libunwind-ppc64/src/{,dwarf/,mi/,ppc64/}.libs/*.o
+JNI_OBJECT_LIST += ../frysk-imports/libunwind-*/src/dwarf/.libs/*.o
+JNI_OBJECT_LIST += ../frysk-imports/libunwind-*/src/mi/.libs/G*.o
+JNI_OBJECT_LIST += ../frysk-imports/libunwind-*/src/mi/.libs/{init,mempool,flush_cache}.o
+JNI_OBJECT_LIST += ../frysk-imports/libunwind-*/src/x86/.libs/*.o
+JNI_OBJECT_LIST += ../frysk-imports/libunwind-*/src/x86_64/.libs/*.o
 
 # jnixx's auto-detect algorithm misses hidden class references,
 # explicitly add them here.
@@ -75,6 +76,6 @@ JNIXX_CLASSES += lib.unwind.UnwindRegistersPPC64
 JNIXX_CLASSES += lib.unwind.UnwindRegistersX86
 JNIXX_CLASSES += lib.unwind.UnwindRegistersX8664
 # Some JAVAH files don't get generated as they are hidden includes
-lib/dwfl/cni/ElfSymbol.o: lib/dwfl/ElfSymbolVersion.h
-frysk/testbed/cni/ForkFactory.o: frysk/sys/UnhandledWaitBuilder.h
-lib/dwfl/cni/DwflModule.o: lib/dwfl/ElfSymbolVersion.h
+lib/dwfl/jni/ElfSymbol.o: lib/dwfl/ElfSymbolVersion.h
+frysk/testbed/jni/ForkFactory.o: frysk/sys/UnhandledWaitBuilder.h
+lib/dwfl/jni/DwflModule.o: lib/dwfl/ElfSymbolVersion.h
diff --git a/frysk-sys/lib/unwind/UnwindRegistersX8664.shenum b/frysk-sys/lib/unwind/UnwindRegistersX8664.shenum
index d8803d9..c5d9d44 100644
--- a/frysk-sys/lib/unwind/UnwindRegistersX8664.shenum
+++ b/frysk-sys/lib/unwind/UnwindRegistersX8664.shenum
@@ -2,6 +2,7 @@
 # This file is part of the program FRYSK.
 #
 # Copyright 2007, Red Hat Inc.
+# Copyright 2016, Andrew Cagney
 #
 # FRYSK is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
@@ -41,6 +42,9 @@
 # Generate a mkenum.sh table for the UNW_X86_64 encodings we are interested in.
 cat $(dirname $0)/../../../frysk-imports/libunwind/include/libunwind-x86_64.h | awk '
     /UNW_X86_64/ {
+        # deal with #ifdef with multiple defines
+        if ($1 in found) next;
+        found[$1] = 1
     	gsub(",","",$1)
     	gsub("UNW_X86_64_", "", $1)
 	printf "%s\n", $1
diff --git a/frysk-sys/lib/unwind/jni/UnwindH.hxx b/frysk-sys/lib/unwind/jni/UnwindH.hxx
index 509cc92..4d72423 100644
--- a/frysk-sys/lib/unwind/jni/UnwindH.hxx
+++ b/frysk-sys/lib/unwind/jni/UnwindH.hxx
@@ -140,17 +140,28 @@ get_dyn_info_list_addr(::unw_addr_space_t as, ::unw_word_t *dilap,
 static int
 access_mem(::unw_addr_space_t as, ::unw_word_t addr,
 	   ::unw_word_t *valp, int write, void *contextArg) {
+  // fprintf(stderr, "access_mem as: %p addr: %llx valp: %p write: %d context: %p\n", as, (long long) addr, valp, write, contextArg);
   UNW_CONTEXT;
   try {
     jnixx::jbyteArray jtmp
       = jnixx::jbyteArray::NewByteArray(env, sizeof(unw_word_t));
+    // fprintf(stderr, "access_mem have jtmp\n");
     jbyteArrayElements tmp = jbyteArrayElements(env, jtmp);
-    memcpy(tmp.elements(), valp, sizeof(unw_word_t));
-    tmp.release();
+    // fprintf(stderr, "access_mem have tmp\n");
+    {
+      jbyte *elements = tmp.elements();
+      // fprintf(stderr, "access_mem %llx copy-in %p to %p\n", (long long) addr, valp, elements);
+      memcpy(elements, valp, sizeof(unw_word_t));
+      tmp.release();
+    }
     int ret = addressSpace.accessMem(env, (jlong) addr,
 				     jtmp, (jboolean) write);
-    memcpy(valp, tmp.elements(), sizeof(unw_word_t));
-    tmp.release();
+    {
+      jbyte *elements = tmp.elements();
+      // fprintf(stderr, "access_mem %llx copy-out %p to %p\n", (long long) addr, elements, valp);
+      memcpy(valp, elements, sizeof(unw_word_t));
+      tmp.release();
+    }
     jtmp.DeleteLocalRef(env);
     return ret;
   } catch (Throwable t) {
@@ -271,10 +282,10 @@ TARGET::createAddressSpace(jnixx::env env, ByteOrder byteOrder) {
     resume,
     get_proc_name
   };
-  jlong unwAddressSpace
-    = (jlong) unw_create_addr_space(&accessors, (int) byteOrder.hashCode(env));
-  logf(FINE, "createAddressSpace at %lx", (long)unwAddressSpace);
-  return unwAddressSpace;
+  unw_addr_space_t as = unw_create_addr_space(&accessors, (int) byteOrder.hashCode(env));
+  unw_set_caching_policy(as, UNW_CACHE_NONE);
+  logf(FINE, "createAddressSpace at %p", as);
+ return (jlong) as;
 }
 
 void
@@ -466,19 +477,98 @@ TARGET::destroyProcInfo(jnixx::env env, jlong unwProcInfo) {
   ::free(UNW_PROC_INFO);
 }
 
+/**
+ * The following are local memory image address space memory accessors
+ * used by unw_get_unwind_table and run_cfi_program to access and
+ * interpret the eh_frame_hdr.  The BYTES pointer contains a SIZE byte
+ * memory mapped image.  BASE, BOUND, and OFFSET define how to map
+ * accesses to that address.  While perhaps not the most efficient,
+ * this should help with debugging.
+ */
+#define IMAGE_MAGIC 0xfeed
+struct image {
+  int magic;
+  char *name;
+  char *bytes;
+  size_t size;
+  unw_word_t base;
+  unw_word_t bound;
+  unw_word_t offset;
+  image(const char *name, char* bytes, size_t size, unw_word_t base, unw_word_t bound, unw_word_t offset) {
+    this->magic = IMAGE_MAGIC;
+    this->name = strdup(name);
+    this->bytes = bytes;
+    this->size = size;
+    this->base = base;
+    this->bound = bound;
+    this->offset = offset;
+  }
+};
+
+static int 
+image_access_mem(unw_addr_space_t as, unw_word_t addr,
+		 unw_word_t *val, int write, void *arg) {
+  struct image *image = (struct image*) arg;
+  if (image->magic != IMAGE_MAGIC) {
+    fprintf(stderr, "%s: bad magic number\n", __func__);
+    return -UNW_EINVAL;
+  }
+  // Writing is not supported
+  if (write)
+    return -UNW_EINVAL;
+  if (addr < image->base || addr > image->bound - sizeof(unw_word_t)) {
+    fprintf(stderr, "%s: addr %llx out of bounds [%llx..%llx)\n", __func__,
+	    (long long) addr, (long long) image->base, (long long) image->bound);
+    return -UNW_EINVAL;
+  }
+  unw_word_t offset = (addr - image->base) + image->offset;
+  if (offset < 0 || offset > image->size - sizeof(unw_word_t)) {
+    fprintf(stderr, "%s: offset: %llx out of bounds [0..%llx)\n", __func__,
+	    (long long) offset, (long long) image->size);
+    return -UNW_EINVAL;
+  }
+  if (offset & (sizeof(unw_word_t) - 1)) {
+    fprintf(stderr, "%s: offset: %llx not aligned to word boundary %zx\n", __func__,
+	    (long long) offset, sizeof(unw_word_t) - 1);
+    return -UNW_EINVAL;
+  }
+  // fprintf(stderr, "%s: %s addr: %llx offset: %llx\n", __func__, image->name, (long long) addr, (long long) offset);
+  *val = *(unw_word_t *) (image->bytes + offset);
+  return UNW_ESUCCESS;
+}
+
+static void
+image_put_unwind_info(::unw_addr_space_t as, ::unw_proc_info_t *proc_info,
+		      void *arg) {
+  struct image *image = (struct image*) arg;
+  if (image->magic != IMAGE_MAGIC) {
+    fprintf(stderr, "%s: bad magic number\n", __func__);
+    return;
+  }
+  munmap(image->bytes, image->size);
+  ::free(image->name);
+  ::free(image);
+}
+
+static unw_accessors_t image_accessors = {
+  NULL, image_put_unwind_info, NULL, image_access_mem, NULL, NULL, NULL, NULL
+};
+
 // Return NULL when eh_frame_hdr cannot be found.
 // Also fills in ip->start_ip, ip->end_ip and ip->gp.
 // peh_vaddr will point to the address of the eh_frame_hdr in the main
 // address space of the inferior.
-static char *
-get_eh_frame_hdr_addr(jnixx::env env, unw_proc_info_t *pi,
-		      char *image, size_t size,
-		      unsigned long segbase, unw_word_t *peh_vaddr)
+static struct image *
+get_eh_frame_hdr_addr(jnixx::env env, frysk::rsl::Log fine, const char *name,
+		      unw_proc_info_t *pi,
+		      char *bytes,  size_t size,
+		      unw_word_t segbase, unw_word_t segbound,
+		      unw_word_t segoffset, unw_word_t *peh_vaddr)
 {
   if (elf_version(EV_CURRENT) == EV_NONE)
     return NULL;
 
-  Elf *elf = elf_memory(image, size);
+  Elf *elf = elf_memory(bytes, size);
   if (elf == NULL)
     return NULL;
 
@@ -494,8 +584,14 @@ get_eh_frame_hdr_addr(jnixx::env env, unw_proc_info_t *pi,
       
       switch (phdr.p_type) {
         case PT_LOAD:
-          if (phdr.p_vaddr == segbase)
-            ptxt_ndx = i;
+	  if ((long long)segoffset == (long long) -1) {
+	    // I suspect this was to handle the old pre-link hack?
+	    if (phdr.p_vaddr == segbase)
+	      ptxt_ndx = i;
+	  } else {
+	    if (phdr.p_offset == segoffset)
+	      ptxt_ndx = i;
+	  }
           break;
 	  
         case PT_GNU_EH_FRAME:
@@ -537,10 +633,11 @@ get_eh_frame_hdr_addr(jnixx::env env, unw_proc_info_t *pi,
   if (gelf_getphdr (elf, peh_hdr_ndx, &peh_hdr) == NULL)
     return NULL;
 
+  /* For dynamicly linked executables and shared libraries, DT_PLTGOT
+     is the value that data-relative addresses are relative to for
+     that object.  We call this the "gp". */
+  unw_word_t gp = 0;
   if (pdyn_ndx != -1) {
-      /* For dynamicly linked executables and shared libraries,
-	 DT_PLTGOT is the value that data-relative addresses are
-	 relative to for that object.  We call this the "gp". */
       GElf_Phdr pdyn;
       if (gelf_getphdr (elf, pdyn_ndx, &pdyn) == NULL)
 	return NULL;
@@ -567,7 +664,7 @@ get_eh_frame_hdr_addr(jnixx::env env, unw_proc_info_t *pi,
 	  if (dyn.d_tag == DT_PLTGOT) {
 	      /* Assume that _DYNAMIC is writable and GLIBC has
 		 relocated it (true for x86 at least). */
-	      pi->gp = dyn.d_un.d_ptr;
+	      gp = dyn.d_un.d_ptr;
 	      break;
 	    }
 	}
@@ -575,128 +672,63 @@ get_eh_frame_hdr_addr(jnixx::env env, unw_proc_info_t *pi,
     /* Otherwise this is a static executable with no _DYNAMIC.  Assume
        that data-relative addresses are relative to 0, i.e.,
        absolute. */
-    pi->gp = 0;
+    gp = 0;
   }
 
+  pi->gp = gp;
   pi->start_ip = segbase;
-  pi->end_ip = segbase + ptxt.p_memsz;
-
-  *peh_vaddr = peh_hdr.p_vaddr;
+  if (segbound > segbase + ptxt.p_memsz) {
+    segbound = segbase + ptxt.p_memsz;
+    logf(env, fine, "adjusted segbound to %llx using p_memsz", (long long)segbound);
+  }
+  pi->end_ip = segbound;
+  pi->format = UNW_INFO_FORMAT_REMOTE_TABLE;
+  pi->flags = 0;
 
-  char *hdr;
   if (debug_frame_data != NULL && debug_frame_data->d_buf != NULL
       && debug_frame_data->d_size != 0) {
-      pi->format = UNW_INFO_FORMAT_TABLE;
-      pi->unwind_info_size = debug_frame_data->d_size / sizeof (unw_word_t);
-      hdr = (char *) debug_frame_data->d_buf;
-    } else {
-      pi->format = UNW_INFO_FORMAT_REMOTE_TABLE;
-      hdr = image + peh_hdr.p_offset;
-    }
-  return hdr;
-}
-
-/**
- * The following are local memory image address space memory accessors
- * used by unw_get_unwind_table and run_cfi_program to access and
- * interpret the eh_frame_hdr.  The arg pointer contains an image
- * descriptor, ADDR is the offset into the eh-frame table within the
- * image.
- */
-#define IMAGE_MAGIC 0xfeed
-struct image {
-  int magic;
-  void *bytes;
-  size_t size;
-  char *table;
-  image(void* bytes, size_t size) {
-    this->magic = IMAGE_MAGIC;
-    this->bytes = bytes;
-    this->size = size;
-  }
-};
-
-static int 
-image_access_mem(unw_addr_space_t as, unw_word_t addr,
-		 unw_word_t *val, int write, void *arg) {
-  struct image *image = (struct image*) arg;
-  if (image->magic != IMAGE_MAGIC) {
-    fprintf(stderr, "%s: bad magic number\n", __func__);
-    return -UNW_EINVAL;
-  }
-  // Writing is not supported
-  if (write)
-    return -UNW_EINVAL;
-  else
-    *val = *(unw_word_t *) (image->table + addr);
-  return UNW_ESUCCESS;
-}
-  
-static void
-image_put_unwind_info(::unw_addr_space_t as, ::unw_proc_info_t *proc_info,
-		      void *arg) {
-  struct image *image = (struct image*) arg;
-  if (image->magic != IMAGE_MAGIC) {
-    fprintf(stderr, "%s: bad magic number\n", __func__);
-    return;
+    pi->flags |= UNW_PI_FLAG_DEBUG_FRAME;
+    *peh_vaddr = 0;
+    logf(env, fine, "frame table at %llx", (long long) *peh_vaddr);
+    return new image(name, bytes, size, 0, size, 0);
+  } else {
+    // There was code setting this to just "peh_hdr.p_vaddr", I
+    // suspect that is pre-link related.
+    *peh_vaddr = segbase + peh_hdr.p_vaddr;
+    logf(env, fine, "unwind table at %llx", (long long) *peh_vaddr);
+    return new image(name, bytes, size, segbase, segbound, segoffset);
   }
-  munmap(image->bytes, image->size);
-  ::free(image);
 }
 
-static unw_accessors_t image_accessors = {
-  NULL, image_put_unwind_info, NULL, image_access_mem, NULL, NULL, NULL, NULL
-};
-
 static jint
 fillProcInfoFromImage(jnixx::env env, frysk::rsl::Log fine,
 		      const char* name,
-		      unw_proc_info_t* unwProcInfo,
-		      jlong ip,
+		      unw_proc_info_t* pi,
 		      jboolean needUnwindInfo,
-		      void *bytes,
-		      long size,
-		      long segbase) {
-  logf(env, fine, "fillProcInfoFromImage"
-       " %s unwProcInfo %lx, ip %lx, bytes %p, size %ld, segBase %lx",
-       name, (long) UNW_PROC_INFO, (long)ip, bytes, size, segbase);
+		      void *bytes, size_t size, unw_word_t ip,
+		      unw_word_t segbase, unw_word_t segbound, unw_word_t segoffset) {
+  logf(env, fine,
+       "fillProcInfoFromImage %s pi: %p bytes: %p size: %zd ip: %llx segbase: %llx segbound: %llx segoffset: %llx",
+       name, pi, bytes, size, (long long) ip,
+       (long long) segbase, (long long) segbound, (long long) segoffset);
   
-  unw_word_t peh_vaddr = 0;
-  char *eh_table_hdr = get_eh_frame_hdr_addr(env, UNW_PROC_INFO,
-					     (char *) bytes,
-					     size, segbase,
-					     &peh_vaddr);
-  if (eh_table_hdr == NULL) {
+  unw_word_t peh_vaddr;
+  struct image *image = get_eh_frame_hdr_addr(env, fine, name, pi, (char*)bytes, size,
+					      segbase, segbound, segoffset,
+					      &peh_vaddr);
+  if (image == NULL) {
     logf(env, fine, "get_eh_frame_hdr failed");
     munmap(bytes, size);
     return -UNW_ENOINFO;
   }
 
-  struct image *image = new struct image(bytes, size);
-
-  int ret;
-  if (UNW_PROC_INFO->format == UNW_INFO_FORMAT_REMOTE_TABLE) {
-    // address adjustment
-    image->table = eh_table_hdr - peh_vaddr;
-    ret = unw_get_unwind_table((unw_word_t) ip,
-			       UNW_PROC_INFO,
-			       (int) needUnwindInfo,
-			       &image_accessors,
-			       // virtual address
-			       peh_vaddr,
-			       image);
-  } else {
-    image->table = eh_table_hdr;
-    ret = unw_get_unwind_table((unw_word_t) ip,
-                               UNW_PROC_INFO,
-                               (int) needUnwindInfo,
-                               &image_accessors,
-                               // virtual address
-                               0,
-                               // address adjustment
-                               image);
-  }
-  logf(env, fine, "Post unw_get_unwind_table %d", ret);
+  unw_addr_space_t image_as = unw_create_addr_space(&image_accessors, 0);
+  unw_set_caching_policy(image_as, UNW_CACHE_NONE);
+  int ret = unw_get_unwind_table((unw_word_t) ip, pi,
+				 (int) needUnwindInfo,
+				 peh_vaddr,
+				 image_as, image);
+  logf(env, fine, "post unw_get_unwind_table %d", ret);
   return ret;
 }
 
@@ -706,21 +738,19 @@ TARGET::fillProcInfoFromVDSO(jnixx::env env, jlong unwProcInfo, jlong ip,
 			     AddressSpace addressSpace,
 			     jlong lowAddress, jlong highAddress,
 			     jlong offset) {
-  logf(FINE, "fillProcInfoFromVDSO"
-       " segbase: 0x%lx, highAddress: 0x%lx, mapoff: 0x%lx",
-       (unsigned long) lowAddress, (unsigned long) highAddress,
-       (unsigned long) offset);
-  void *image;
-  size_t size;
+  logf(FINE, "fillProcInfoFromVDSO segbase: %llx segbound: %llx segoffset: %llx",
+       (long long) lowAddress, (long long) highAddress, (long long) offset);
+    void *image;
   unw_word_t magic;
   unw_accessors_t *a;
-  unsigned long segbase = (unsigned long) lowAddress;
-  unsigned long hi = (unsigned long) highAddress;
 
-  size = hi - segbase;
+  unw_word_t segbase = (unw_word_t) lowAddress;
+  unw_word_t segbound = (unw_word_t) highAddress;
+  unw_word_t segoffset = (unw_word_t) offset;
+  unw_word_t size = (unw_word_t) (segbound - segbase);
   if (size > MAX_VDSO_SIZE)
     return -UNW_ENOINFO;
-  logf(FINE, "checked size, 0x%lx", (unsigned long) size);
+  logf(FINE, "checked size, 0x%llx", (long long) size);
 
   logf(FINE, "checking access_mem");
   unw_addr_space_t as = (unw_addr_space_t) addressSpace.GetUnwAddressSpace(env);
@@ -735,7 +765,7 @@ TARGET::fillProcInfoFromVDSO(jnixx::env env, jlong unwProcInfo, jlong ip,
     return -UNW_ENOINFO;
   if (sizeof (magic) >= SELFMAG) {
     // Read the VDSO from the target.
-    int ret = (*a->access_mem) (as, (unw_word_t) segbase, &magic,
+    int ret = (*a->access_mem) (as, segbase, &magic,
 				0, (void *) addressSpace._object);
     if (ret < 0) {
       logf(FINE, "error accessing VDSO %d", ret);
@@ -754,6 +784,7 @@ TARGET::fillProcInfoFromVDSO(jnixx::env env, jlong unwProcInfo, jlong ip,
     return -UNW_ENOINFO;
 
   logf(FINE, "checked magic");
+  unw_word_t hi;
   if (sizeof (magic) >= SELFMAG) {
     *(unw_word_t *)image = magic;
     hi = sizeof (magic);
@@ -764,8 +795,8 @@ TARGET::fillProcInfoFromVDSO(jnixx::env env, jlong unwProcInfo, jlong ip,
   logf(FINE, "reading in VDSO");
   for (; hi < size; hi += sizeof (unw_word_t)) {
     logf(env, GetFinest(env),
-	 "Reading memory segbase: 0x%lx, image: %p, hi: 0x%lx, at: 0x%lx to location: %p",
-	 segbase , image , hi, segbase+hi, (char *) image + hi);
+	 "Reading memory segbase: 0x%llx, image: %p, hi: 0x%llx, at: 0x%llx to location: %p",
+	 (long long) segbase, image, (long long) hi, (long long) segbase + hi, (char *) image + hi);
     int ret = (*a->access_mem) (as, segbase + hi,
 				(unw_word_t *) ((char *) image + hi),
 				0, (void *) addressSpace._object);
@@ -776,8 +807,9 @@ TARGET::fillProcInfoFromVDSO(jnixx::env env, jlong unwProcInfo, jlong ip,
     }
   }
 
-  return fillProcInfoFromImage(FINE, "[vdso]", UNW_PROC_INFO, ip,
-			       needUnwindInfo, image, size, segbase);
+  return fillProcInfoFromImage(FINE, "[vdso]", UNW_PROC_INFO,
+			       needUnwindInfo, image, size,
+			       ip, segbase, segbound, segoffset);
 }
 
 jint
@@ -785,8 +817,8 @@ TARGET::fillProcInfoFromElfImage(jnixx::env env, jlong unwProcInfo, jlong ip,
 				 bool needUnwindInfo,
 				 AddressSpace addressSpace,
 				 String elfImageName,
-				 jlong segbase, jlong hi,
-				 jlong mapoff) {
+				 jlong segbase, jlong segbound,
+				 jlong segoffset) {
   logf(FINE, "fillProcInfoFromElfImage");
   struct stat stat;
   void *image;		/* pointer to mmap'd image */
@@ -821,8 +853,9 @@ TARGET::fillProcInfoFromElfImage(jnixx::env env, jlong unwProcInfo, jlong ip,
   }
   ::close(fd);
   
-  return fillProcInfoFromImage(FINE, name.elements(), UNW_PROC_INFO, ip,
-			       needUnwindInfo, image, size, segbase);
+  return fillProcInfoFromImage(FINE, name.elements(), UNW_PROC_INFO,
+			       needUnwindInfo, image, size,
+			       ip, segbase, segbound, segoffset);
 }
 
 jint