summaryrefslogtreecommitdiff
path: root/src/pal/src/libunwind/src/ppc64
diff options
context:
space:
mode:
Diffstat (limited to 'src/pal/src/libunwind/src/ppc64')
-rw-r--r--src/pal/src/libunwind/src/ppc64/Gapply_reg_state.c37
-rw-r--r--src/pal/src/libunwind/src/ppc64/Gcreate_addr_space.c71
-rw-r--r--src/pal/src/libunwind/src/ppc64/Gglobal.c182
-rw-r--r--src/pal/src/libunwind/src/ppc64/Ginit.c229
-rw-r--r--src/pal/src/libunwind/src/ppc64/Greg_states_iterate.c37
-rw-r--r--src/pal/src/libunwind/src/ppc64/Gregs.c141
-rw-r--r--src/pal/src/libunwind/src/ppc64/Gresume.c111
-rw-r--r--src/pal/src/libunwind/src/ppc64/Gstep.c466
-rw-r--r--src/pal/src/libunwind/src/ppc64/Lapply_reg_state.c5
-rw-r--r--src/pal/src/libunwind/src/ppc64/Lcreate_addr_space.c5
-rw-r--r--src/pal/src/libunwind/src/ppc64/Lglobal.c5
-rw-r--r--src/pal/src/libunwind/src/ppc64/Linit.c5
-rw-r--r--src/pal/src/libunwind/src/ppc64/Lreg_states_iterate.c5
-rw-r--r--src/pal/src/libunwind/src/ppc64/Lregs.c5
-rw-r--r--src/pal/src/libunwind/src/ppc64/Lresume.c5
-rw-r--r--src/pal/src/libunwind/src/ppc64/Lstep.c5
-rw-r--r--src/pal/src/libunwind/src/ppc64/get_func_addr.c51
-rw-r--r--src/pal/src/libunwind/src/ppc64/init.h82
-rw-r--r--src/pal/src/libunwind/src/ppc64/is_fpreg.c34
-rw-r--r--src/pal/src/libunwind/src/ppc64/regname.c164
-rw-r--r--src/pal/src/libunwind/src/ppc64/setcontext.S9
-rw-r--r--src/pal/src/libunwind/src/ppc64/ucontext_i.h173
-rw-r--r--src/pal/src/libunwind/src/ppc64/unwind_i.h52
23 files changed, 1879 insertions, 0 deletions
diff --git a/src/pal/src/libunwind/src/ppc64/Gapply_reg_state.c b/src/pal/src/libunwind/src/ppc64/Gapply_reg_state.c
new file mode 100644
index 0000000000..82f056da67
--- /dev/null
+++ b/src/pal/src/libunwind/src/ppc64/Gapply_reg_state.c
@@ -0,0 +1,37 @@
+/* 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>
+
+ 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"
+
+int
+unw_apply_reg_state (unw_cursor_t *cursor,
+ void *reg_states_data)
+{
+ struct cursor *c = (struct cursor *) cursor;
+
+ return dwarf_apply_reg_state (&c->dwarf, (dwarf_reg_state_t *)reg_states_data);
+}
diff --git a/src/pal/src/libunwind/src/ppc64/Gcreate_addr_space.c b/src/pal/src/libunwind/src/ppc64/Gcreate_addr_space.c
new file mode 100644
index 0000000000..bd48555d4e
--- /dev/null
+++ b/src/pal/src/libunwind/src/ppc64/Gcreate_addr_space.c
@@ -0,0 +1,71 @@
+/* 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>
+
+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 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;
+
+ memset (as, 0, sizeof (*as));
+
+ as->acc = *a;
+
+ 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/src/pal/src/libunwind/src/ppc64/Gglobal.c b/src/pal/src/libunwind/src/ppc64/Gglobal.c
new file mode 100644
index 0000000000..9d0b0f55a6
--- /dev/null
+++ b/src/pal/src/libunwind/src/ppc64/Gglobal.c
@@ -0,0 +1,182 @@
+/* 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"
+#include "dwarf_i.h"
+
+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. */
+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,
+ };
+
+HIDDEN void
+tdep_init (void)
+{
+ intrmask_t saved_mask;
+
+ sigfillset (&unwi_full_mask);
+
+ lock_acquire (&ppc64_lock, saved_mask);
+ {
+ if (tdep_init_done)
+ /* another thread else beat us to it... */
+ goto out;
+
+ mi_init ();
+
+ dwarf_init ();
+
+#ifndef UNW_REMOTE_ONLY
+ ppc64_local_addr_space_init ();
+#endif
+ tdep_init_done = 1; /* signal that we're initialized... */
+ }
+ out:
+ lock_release (&ppc64_lock, saved_mask);
+}
diff --git a/src/pal/src/libunwind/src/ppc64/Ginit.c b/src/pal/src/libunwind/src/ppc64/Ginit.c
new file mode 100644
index 0000000000..4c88cd6e77
--- /dev/null
+++ b/src/pal/src/libunwind/src/ppc64/Ginit.c
@@ -0,0 +1,229 @@
+/* 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 <string.h>
+
+#include "ucontext_i.h"
+#include "unwind_i.h"
+
+#ifdef UNW_REMOTE_ONLY
+
+/* unw_local_addr_space is a NULL pointer in this case. */
+unw_addr_space_t unw_local_addr_space;
+
+#else /* !UNW_REMOTE_ONLY */
+
+static struct unw_addr_space local_addr_space;
+
+unw_addr_space_t unw_local_addr_space = &local_addr_space;
+
+static void *
+uc_addr (ucontext_t *uc, int reg)
+{
+ void *addr;
+
+ if ((unsigned) (reg - UNW_PPC64_R0) < 32)
+ addr = &uc->uc_mcontext.gp_regs[reg - UNW_PPC64_R0];
+
+ else if ((unsigned) (reg - UNW_PPC64_F0) < 32)
+ addr = &uc->uc_mcontext.fp_regs[reg - UNW_PPC64_F0];
+
+ else if ((unsigned) (reg - UNW_PPC64_V0) < 32)
+ addr = (uc->uc_mcontext.v_regs == 0) ? NULL : &uc->uc_mcontext.v_regs->vrregs[reg - UNW_PPC64_V0][0];
+
+ else
+ {
+ 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;
+ }
+ addr = &uc->uc_mcontext.gp_regs[gregs_idx];
+ }
+ 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;
+
+
+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 (12, "mem[%lx] <- %lx\n", addr, *val);
+ *(unw_word_t *) addr = *val;
+ }
+ else
+ {
+ *val = *(unw_word_t *) addr;
+ Debug (12, "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_PPC64_F0 <= reg && reg <= UNW_PPC64_F31)
+ goto badreg;
+ if (UNW_PPC64_V0 <= reg && reg <= UNW_PPC64_V31)
+ goto badreg;
+
+ addr = uc_addr (uc, reg);
+ if (!addr)
+ 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;
+
+ /* Allow only 32 fregs and 32 vregs */
+ if (!(((unsigned) (reg - UNW_PPC64_F0) < 32)
+ ||((unsigned) (reg - UNW_PPC64_V0) < 32)))
+ goto badreg;
+
+ addr = uc_addr (uc, reg);
+ if (!addr)
+ goto badreg;
+
+ if (write)
+ {
+ Debug (12, "%s <- %016Lf\n", unw_regname (reg), *val);
+ *(unw_fpreg_t *) addr = *val;
+ }
+ else
+ {
+ *val = *(unw_fpreg_t *) addr;
+ Debug (12, "%s -> %016Lf\n", unw_regname (reg), *val);
+ }
+ 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
+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 = UNWI_DEFAULT_CACHING_POLICY;
+ 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 = ppc64_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/src/pal/src/libunwind/src/ppc64/Greg_states_iterate.c b/src/pal/src/libunwind/src/ppc64/Greg_states_iterate.c
new file mode 100644
index 0000000000..a17dc1b561
--- /dev/null
+++ b/src/pal/src/libunwind/src/ppc64/Greg_states_iterate.c
@@ -0,0 +1,37 @@
+/* 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>
+
+ 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"
+
+int
+unw_reg_states_iterate (unw_cursor_t *cursor,
+ unw_reg_states_callback cb, void *token)
+{
+ struct cursor *c = (struct cursor *) cursor;
+
+ return dwarf_reg_states_iterate (&c->dwarf, cb, token);
+}
diff --git a/src/pal/src/libunwind/src/ppc64/Gregs.c b/src/pal/src/libunwind/src/ppc64/Gregs.c
new file mode 100644
index 0000000000..1cb5d9dc65
--- /dev/null
+++ b/src/pal/src/libunwind/src/ppc64/Gregs.c
@@ -0,0 +1,141 @@
+/* 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"
+
+HIDDEN int
+tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
+ 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 */
+ }
+ else
+ *valp = c->dwarf.ip;
+ return 0;
+
+ case UNW_TDEP_SP:
+ if (write)
+ return -UNW_EREADONLYREG;
+ *valp = c->dwarf.cfa;
+ return 0;
+
+ default:
+ return -UNW_EBADREG;
+ break;
+ }
+
+ 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)
+{
+ struct dwarf_loc loc;
+
+ if ((unsigned) (reg - UNW_PPC64_F0) < 32)
+ {
+ loc = c->dwarf.loc[reg];
+ if (write)
+ return dwarf_putfp (&c->dwarf, loc, *valp);
+ else
+ return dwarf_getfp (&c->dwarf, loc, valp);
+ }
+ else
+ if ((unsigned) (reg - UNW_PPC64_V0) < 32)
+ {
+ loc = c->dwarf.loc[reg];
+ if (write)
+ return dwarf_putvr (&c->dwarf, loc, *valp);
+ else
+ return dwarf_getvr (&c->dwarf, loc, valp);
+ }
+
+ return -UNW_EBADREG;
+}
+
diff --git a/src/pal/src/libunwind/src/ppc64/Gresume.c b/src/pal/src/libunwind/src/ppc64/Gresume.c
new file mode 100644
index 0000000000..0d832d0d97
--- /dev/null
+++ b/src/pal/src/libunwind/src/ppc64/Gresume.c
@@ -0,0 +1,111 @@
+/* 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 "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)
+{
+ /* XXX: empty stub. */
+ abort ();
+}
+
+HIDDEN inline int
+ppc64_local_resume (unw_addr_space_t as, unw_cursor_t *cursor, void *arg)
+{
+ 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;
+}
+
+#endif /* !UNW_REMOTE_ONLY */
+
+/* This routine is responsible for copying the register values in
+ cursor C and establishing them as the current machine state. */
+
+static inline int
+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);
+ }
+ }
+ return 0;
+}
+
+int
+unw_resume (unw_cursor_t *cursor)
+{
+ struct cursor *c = (struct cursor *) cursor;
+ int ret;
+
+ Debug (1, "(cursor=%p)\n", c);
+
+ if ((ret = establish_machine_state (c)) < 0)
+ return ret;
+
+ return (*c->dwarf.as->acc.resume) (c->dwarf.as, (unw_cursor_t *) c,
+ c->dwarf.as_arg);
+}
diff --git a/src/pal/src/libunwind/src/ppc64/Gstep.c b/src/pal/src/libunwind/src/ppc64/Gstep.c
new file mode 100644
index 0000000000..f44e959105
--- /dev/null
+++ b/src/pal/src/libunwind/src/ppc64/Gstep.c
@@ -0,0 +1,466 @@
+/* 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"
+#include "ucontext_i.h"
+#include "remote.h"
+#include <signal.h>
+
+/* This definition originates in /usr/include/asm-ppc64/ptrace.h, but is
+ defined there only when __KERNEL__ is defined. We reproduce it here for
+ our use at the user level in order to locate the ucontext record, which
+ appears to be at this offset relative to the stack pointer when in the
+ context of the signal handler return trampoline code -
+ __kernel_sigtramp_rt64. */
+#define __SIGNAL_FRAMESIZE 128
+
+/* This definition comes from the document "64-bit PowerPC ELF Application
+ Binary Interface Supplement 1.9", section 3.2.2.
+ http://www.linux-foundation.org/spec/ELF/ppc64/PPC-elf64abi-1.9.html#STACK */
+
+typedef struct
+{
+ long unsigned back_chain;
+ long unsigned cr_save;
+ long unsigned lr_save;
+ /* many more fields here, but they are unused by this code */
+} stack_frame_t;
+
+
+int
+unw_step (unw_cursor_t * cursor)
+{
+ struct cursor *c = (struct cursor *) 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, i;
+
+ Debug (1, "(cursor=%p, ip=0x%016lx)\n", c, (unsigned long) c->dwarf.ip);
+
+ /* Try DWARF-based unwinding... */
+
+ ret = dwarf_step (&c->dwarf);
+
+ if (ret < 0 && ret != -UNW_ENOINFO)
+ {
+ Debug (2, "returning %d\n", ret);
+ return ret;
+ }
+
+ if (unlikely (ret < 0))
+ {
+ if (likely (unw_is_signal_frame (cursor) <= 0))
+ {
+ /* 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.
+
+ Note that there isn't any way to determined if SA_SIGINFO was
+ set in the sa_flags parameter to sigaction when the signal
+ handler was established. If it was not set, the ucontext
+ record is not required to be on the stack, in which case the
+ 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;
+ }
+ }
+
+ 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_int (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/src/pal/src/libunwind/src/ppc64/Lapply_reg_state.c b/src/pal/src/libunwind/src/ppc64/Lapply_reg_state.c
new file mode 100644
index 0000000000..7ebada480e
--- /dev/null
+++ b/src/pal/src/libunwind/src/ppc64/Lapply_reg_state.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Gapply_reg_state.c"
+#endif
diff --git a/src/pal/src/libunwind/src/ppc64/Lcreate_addr_space.c b/src/pal/src/libunwind/src/ppc64/Lcreate_addr_space.c
new file mode 100644
index 0000000000..0f2dc6be90
--- /dev/null
+++ b/src/pal/src/libunwind/src/ppc64/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/src/pal/src/libunwind/src/ppc64/Lglobal.c b/src/pal/src/libunwind/src/ppc64/Lglobal.c
new file mode 100644
index 0000000000..6d7b489e14
--- /dev/null
+++ b/src/pal/src/libunwind/src/ppc64/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/src/pal/src/libunwind/src/ppc64/Linit.c b/src/pal/src/libunwind/src/ppc64/Linit.c
new file mode 100644
index 0000000000..e9abfdd46a
--- /dev/null
+++ b/src/pal/src/libunwind/src/ppc64/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/src/pal/src/libunwind/src/ppc64/Lreg_states_iterate.c b/src/pal/src/libunwind/src/ppc64/Lreg_states_iterate.c
new file mode 100644
index 0000000000..f1eb1e79dc
--- /dev/null
+++ b/src/pal/src/libunwind/src/ppc64/Lreg_states_iterate.c
@@ -0,0 +1,5 @@
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
+#include "Greg_states_iterate.c"
+#endif
diff --git a/src/pal/src/libunwind/src/ppc64/Lregs.c b/src/pal/src/libunwind/src/ppc64/Lregs.c
new file mode 100644
index 0000000000..2c9c75cd7d
--- /dev/null
+++ b/src/pal/src/libunwind/src/ppc64/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/src/pal/src/libunwind/src/ppc64/Lresume.c b/src/pal/src/libunwind/src/ppc64/Lresume.c
new file mode 100644
index 0000000000..41a8cf003d
--- /dev/null
+++ b/src/pal/src/libunwind/src/ppc64/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/src/pal/src/libunwind/src/ppc64/Lstep.c b/src/pal/src/libunwind/src/ppc64/Lstep.c
new file mode 100644
index 0000000000..c1ac3c7547
--- /dev/null
+++ b/src/pal/src/libunwind/src/ppc64/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/src/pal/src/libunwind/src/ppc64/get_func_addr.c b/src/pal/src/libunwind/src/ppc64/get_func_addr.c
new file mode 100644
index 0000000000..80a58fa1f8
--- /dev/null
+++ b/src/pal/src/libunwind/src/ppc64/get_func_addr.c
@@ -0,0 +1,51 @@
+/* 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"
+
+int
+tdep_get_func_addr (unw_addr_space_t as, unw_word_t addr,
+ unw_word_t *entry_point)
+{
+ if (as->abi == UNW_PPC64_ABI_ELFv1)
+ {
+ unw_accessors_t *a;
+ int ret;
+
+ a = unw_get_accessors_int (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/src/pal/src/libunwind/src/ppc64/init.h b/src/pal/src/libunwind/src/ppc64/init.h
new file mode 100644
index 0000000000..9b8139343d
--- /dev/null
+++ b/src/pal/src/libunwind/src/ppc64/init.h
@@ -0,0 +1,82 @@
+/* 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"
+
+static inline int
+common_init_ppc64 (struct cursor *c, unsigned use_prev_instr)
+{
+ int ret;
+ int i;
+
+ for (i = UNW_PPC64_R0; i <= UNW_PPC64_R31; i++) {
+ c->dwarf.loc[i] = DWARF_REG_LOC (&c->dwarf, i);
+ }
+ for (i = UNW_PPC64_F0; i <= UNW_PPC64_F31; i++) {
+ c->dwarf.loc[i] = DWARF_FPREG_LOC (&c->dwarf, i);
+ }
+ for (i = UNW_PPC64_V0; i <= UNW_PPC64_V31; i++) {
+ c->dwarf.loc[i] = DWARF_VREG_LOC (&c->dwarf, i);
+ }
+
+ for (i = UNW_PPC64_CR0; i <= UNW_PPC64_CR7; i++) {
+ c->dwarf.loc[i] = DWARF_REG_LOC (&c->dwarf, i);
+ }
+ c->dwarf.loc[UNW_PPC64_ARG_POINTER] = DWARF_REG_LOC (&c->dwarf, UNW_PPC64_ARG_POINTER);
+ c->dwarf.loc[UNW_PPC64_CTR] = DWARF_REG_LOC (&c->dwarf, UNW_PPC64_CTR);
+ c->dwarf.loc[UNW_PPC64_VSCR] = DWARF_REG_LOC (&c->dwarf, UNW_PPC64_VSCR);
+
+ c->dwarf.loc[UNW_PPC64_XER] = DWARF_REG_LOC (&c->dwarf, UNW_PPC64_XER);
+ c->dwarf.loc[UNW_PPC64_LR] = DWARF_REG_LOC (&c->dwarf, UNW_PPC64_LR);
+ c->dwarf.loc[UNW_PPC64_VRSAVE] = DWARF_REG_LOC (&c->dwarf, UNW_PPC64_VRSAVE);
+ c->dwarf.loc[UNW_PPC64_SPEFSCR] = DWARF_REG_LOC (&c->dwarf, UNW_PPC64_SPEFSCR);
+ c->dwarf.loc[UNW_PPC64_SPE_ACC] = DWARF_REG_LOC (&c->dwarf, UNW_PPC64_SPE_ACC);
+
+ c->dwarf.loc[UNW_PPC64_NIP] = DWARF_REG_LOC (&c->dwarf, UNW_PPC64_NIP);
+
+ ret = dwarf_get (&c->dwarf, c->dwarf.loc[UNW_PPC64_NIP], &c->dwarf.ip);
+ if (ret < 0)
+ return ret;
+
+ ret = dwarf_get (&c->dwarf, DWARF_REG_LOC (&c->dwarf, UNW_PPC64_R1),
+ &c->dwarf.cfa);
+ if (ret < 0)
+ return ret;
+
+ c->sigcontext_format = PPC_SCF_NONE;
+ c->sigcontext_addr = 0;
+
+ c->dwarf.args_size = 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/src/pal/src/libunwind/src/ppc64/is_fpreg.c b/src/pal/src/libunwind/src/ppc64/is_fpreg.c
new file mode 100644
index 0000000000..653964a7da
--- /dev/null
+++ b/src/pal/src/libunwind/src/ppc64/is_fpreg.c
@@ -0,0 +1,34 @@
+/* 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 "libunwind_i.h"
+
+int
+unw_is_fpreg (int regnum)
+{
+ return (regnum >= UNW_PPC64_F0 && regnum <= UNW_PPC64_F31);
+}
diff --git a/src/pal/src/libunwind/src/ppc64/regname.c b/src/pal/src/libunwind/src/ppc64/regname.c
new file mode 100644
index 0000000000..58c6fa6d87
--- /dev/null
+++ b/src/pal/src/libunwind/src/ppc64/regname.c
@@ -0,0 +1,164 @@
+/* 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"
+
+static const char *regname[] =
+ {
+ [UNW_PPC64_R0]="GPR0",
+ [UNW_PPC64_R1]="GPR1",
+ [UNW_PPC64_R2]="GPR2",
+ [UNW_PPC64_R3]="GPR3",
+ [UNW_PPC64_R4]="GPR4",
+ [UNW_PPC64_R5]="GPR5",
+ [UNW_PPC64_R6]="GPR6",
+ [UNW_PPC64_R7]="GPR7",
+ [UNW_PPC64_R8]="GPR8",
+ [UNW_PPC64_R9]="GPR9",
+ [UNW_PPC64_R10]="GPR10",
+ [UNW_PPC64_R11]="GPR11",
+ [UNW_PPC64_R12]="GPR12",
+ [UNW_PPC64_R13]="GPR13",
+ [UNW_PPC64_R14]="GPR14",
+ [UNW_PPC64_R15]="GPR15",
+ [UNW_PPC64_R16]="GPR16",
+ [UNW_PPC64_R17]="GPR17",
+ [UNW_PPC64_R18]="GPR18",
+ [UNW_PPC64_R19]="GPR19",
+ [UNW_PPC64_R20]="GPR20",
+ [UNW_PPC64_R21]="GPR21",
+ [UNW_PPC64_R22]="GPR22",
+ [UNW_PPC64_R23]="GPR23",
+ [UNW_PPC64_R24]="GPR24",
+ [UNW_PPC64_R25]="GPR25",
+ [UNW_PPC64_R26]="GPR26",
+ [UNW_PPC64_R27]="GPR27",
+ [UNW_PPC64_R28]="GPR28",
+ [UNW_PPC64_R29]="GPR29",
+ [UNW_PPC64_R30]="GPR30",
+ [UNW_PPC64_R31]="GPR31",
+
+ [UNW_PPC64_F0]="FPR0",
+ [UNW_PPC64_F1]="FPR1",
+ [UNW_PPC64_F2]="FPR2",
+ [UNW_PPC64_F3]="FPR3",
+ [UNW_PPC64_F4]="FPR4",
+ [UNW_PPC64_F5]="FPR5",
+ [UNW_PPC64_F6]="FPR6",
+ [UNW_PPC64_F7]="FPR7",
+ [UNW_PPC64_F8]="FPR8",
+ [UNW_PPC64_F9]="FPR9",
+ [UNW_PPC64_F10]="FPR10",
+ [UNW_PPC64_F11]="FPR11",
+ [UNW_PPC64_F12]="FPR12",
+ [UNW_PPC64_F13]="FPR13",
+ [UNW_PPC64_F14]="FPR14",
+ [UNW_PPC64_F15]="FPR15",
+ [UNW_PPC64_F16]="FPR16",
+ [UNW_PPC64_F17]="FPR17",
+ [UNW_PPC64_F18]="FPR18",
+ [UNW_PPC64_F19]="FPR19",
+ [UNW_PPC64_F20]="FPR20",
+ [UNW_PPC64_F21]="FPR21",
+ [UNW_PPC64_F22]="FPR22",
+ [UNW_PPC64_F23]="FPR23",
+ [UNW_PPC64_F24]="FPR24",
+ [UNW_PPC64_F25]="FPR25",
+ [UNW_PPC64_F26]="FPR26",
+ [UNW_PPC64_F27]="FPR27",
+ [UNW_PPC64_F28]="FPR28",
+ [UNW_PPC64_F29]="FPR29",
+ [UNW_PPC64_F30]="FPR30",
+ [UNW_PPC64_F31]="FPR31",
+
+ [UNW_PPC64_LR]="LR",
+ [UNW_PPC64_CTR]="CTR",
+ [UNW_PPC64_ARG_POINTER]="ARG_POINTER",
+
+ [UNW_PPC64_CR0]="CR0",
+ [UNW_PPC64_CR1]="CR1",
+ [UNW_PPC64_CR2]="CR2",
+ [UNW_PPC64_CR3]="CR3",
+ [UNW_PPC64_CR4]="CR4",
+ [UNW_PPC64_CR5]="CR5",
+ [UNW_PPC64_CR6]="CR6",
+ [UNW_PPC64_CR7]="CR7",
+
+ [UNW_PPC64_XER]="XER",
+
+ [UNW_PPC64_V0]="VR0",
+ [UNW_PPC64_V1]="VR1",
+ [UNW_PPC64_V2]="VR2",
+ [UNW_PPC64_V3]="VR3",
+ [UNW_PPC64_V4]="VR4",
+ [UNW_PPC64_V5]="VR5",
+ [UNW_PPC64_V6]="VR6",
+ [UNW_PPC64_V7]="VR7",
+ [UNW_PPC64_V8]="VR8",
+ [UNW_PPC64_V9]="VR9",
+ [UNW_PPC64_V10]="VR10",
+ [UNW_PPC64_V11]="VR11",
+ [UNW_PPC64_V12]="VR12",
+ [UNW_PPC64_V13]="VR13",
+ [UNW_PPC64_V14]="VR14",
+ [UNW_PPC64_V15]="VR15",
+ [UNW_PPC64_V16]="VR16",
+ [UNW_PPC64_V17]="VR17",
+ [UNW_PPC64_V18]="VR18",
+ [UNW_PPC64_V19]="VR19",
+ [UNW_PPC64_V20]="VR20",
+ [UNW_PPC64_V21]="VR21",
+ [UNW_PPC64_V22]="VR22",
+ [UNW_PPC64_V23]="VR23",
+ [UNW_PPC64_V24]="VR24",
+ [UNW_PPC64_V25]="VR25",
+ [UNW_PPC64_V26]="VR26",
+ [UNW_PPC64_V27]="VR27",
+ [UNW_PPC64_V28]="VR28",
+ [UNW_PPC64_V29]="VR29",
+ [UNW_PPC64_V30]="VR30",
+ [UNW_PPC64_V31]="VR31",
+
+ [UNW_PPC64_VSCR]="VSCR",
+
+ [UNW_PPC64_VRSAVE]="VRSAVE",
+ [UNW_PPC64_SPE_ACC]="SPE_ACC",
+ [UNW_PPC64_SPEFSCR]="SPEFSCR",
+
+ [UNW_PPC64_FRAME_POINTER]="FRAME_POINTER",
+ [UNW_PPC64_NIP]="NIP",
+
+ };
+
+const char *
+unw_regname (unw_regnum_t reg)
+{
+ if (reg < (unw_regnum_t) ARRAY_SIZE (regname))
+ return regname[reg];
+ else
+ return "???";
+}
diff --git a/src/pal/src/libunwind/src/ppc64/setcontext.S b/src/pal/src/libunwind/src/ppc64/setcontext.S
new file mode 100644
index 0000000000..ffc2500a51
--- /dev/null
+++ b/src/pal/src/libunwind/src/ppc64/setcontext.S
@@ -0,0 +1,9 @@
+ .global _UI_setcontext
+
+_UI_setcontext:
+ blr
+
+#ifdef __linux__
+ /* We do not need executable stack. */
+ .section .note.GNU-stack,"",@progbits
+#endif
diff --git a/src/pal/src/libunwind/src/ppc64/ucontext_i.h b/src/pal/src/libunwind/src/ppc64/ucontext_i.h
new file mode 100644
index 0000000000..2ddfdb865a
--- /dev/null
+++ b/src/pal/src/libunwind/src/ppc64/ucontext_i.h
@@ -0,0 +1,173 @@
+/* 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>
+
+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 ucontext_i_h
+#define ucontext_i_h
+
+#include <ucontext.h>
+
+/* 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 VSCR_IDX 32
+#define VRSAVE_IDX 33
+
+/* These are dummy structures used only for obtaining the offsets of the
+ various structure members. */
+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)
+#define UC_MCONTEXT_GREGS_R2 ((void *)&dmy_ctxt.uc_mcontext.gp_regs[2] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_GREGS_R3 ((void *)&dmy_ctxt.uc_mcontext.gp_regs[3] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_GREGS_R4 ((void *)&dmy_ctxt.uc_mcontext.gp_regs[4] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_GREGS_R5 ((void *)&dmy_ctxt.uc_mcontext.gp_regs[5] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_GREGS_R6 ((void *)&dmy_ctxt.uc_mcontext.gp_regs[6] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_GREGS_R7 ((void *)&dmy_ctxt.uc_mcontext.gp_regs[7] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_GREGS_R8 ((void *)&dmy_ctxt.uc_mcontext.gp_regs[8] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_GREGS_R9 ((void *)&dmy_ctxt.uc_mcontext.gp_regs[9] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_GREGS_R10 ((void *)&dmy_ctxt.uc_mcontext.gp_regs[10] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_GREGS_R11 ((void *)&dmy_ctxt.uc_mcontext.gp_regs[11] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_GREGS_R12 ((void *)&dmy_ctxt.uc_mcontext.gp_regs[12] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_GREGS_R13 ((void *)&dmy_ctxt.uc_mcontext.gp_regs[13] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_GREGS_R14 ((void *)&dmy_ctxt.uc_mcontext.gp_regs[14] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_GREGS_R15 ((void *)&dmy_ctxt.uc_mcontext.gp_regs[15] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_GREGS_R16 ((void *)&dmy_ctxt.uc_mcontext.gp_regs[16] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_GREGS_R17 ((void *)&dmy_ctxt.uc_mcontext.gp_regs[17] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_GREGS_R18 ((void *)&dmy_ctxt.uc_mcontext.gp_regs[18] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_GREGS_R19 ((void *)&dmy_ctxt.uc_mcontext.gp_regs[19] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_GREGS_R20 ((void *)&dmy_ctxt.uc_mcontext.gp_regs[20] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_GREGS_R21 ((void *)&dmy_ctxt.uc_mcontext.gp_regs[21] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_GREGS_R22 ((void *)&dmy_ctxt.uc_mcontext.gp_regs[22] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_GREGS_R23 ((void *)&dmy_ctxt.uc_mcontext.gp_regs[23] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_GREGS_R24 ((void *)&dmy_ctxt.uc_mcontext.gp_regs[24] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_GREGS_R25 ((void *)&dmy_ctxt.uc_mcontext.gp_regs[25] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_GREGS_R26 ((void *)&dmy_ctxt.uc_mcontext.gp_regs[26] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_GREGS_R27 ((void *)&dmy_ctxt.uc_mcontext.gp_regs[27] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_GREGS_R28 ((void *)&dmy_ctxt.uc_mcontext.gp_regs[28] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_GREGS_R29 ((void *)&dmy_ctxt.uc_mcontext.gp_regs[29] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_GREGS_R30 ((void *)&dmy_ctxt.uc_mcontext.gp_regs[30] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_GREGS_R31 ((void *)&dmy_ctxt.uc_mcontext.gp_regs[31] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_GREGS_NIP ((void *)&dmy_ctxt.uc_mcontext.gp_regs[NIP_IDX] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_GREGS_MSR ((void *)&dmy_ctxt.uc_mcontext.gp_regs[MSR_IDX] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_GREGS_ORIG_GPR3 ((void *)&dmy_ctxt.uc_mcontext.gp_regs[ORIG_GPR3_IDX] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_GREGS_CTR ((void *)&dmy_ctxt.uc_mcontext.gp_regs[CTR_IDX] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_GREGS_LINK ((void *)&dmy_ctxt.uc_mcontext.gp_regs[LINK_IDX] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_GREGS_XER ((void *)&dmy_ctxt.uc_mcontext.gp_regs[XER_IDX] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_GREGS_CCR ((void *)&dmy_ctxt.uc_mcontext.gp_regs[CCR_IDX] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_GREGS_SOFTE ((void *)&dmy_ctxt.uc_mcontext.gp_regs[SOFTE_IDX] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_GREGS_TRAP ((void *)&dmy_ctxt.uc_mcontext.gp_regs[TRAP_IDX] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_GREGS_DAR ((void *)&dmy_ctxt.uc_mcontext.gp_regs[DAR_IDX] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_GREGS_DSISR ((void *)&dmy_ctxt.uc_mcontext.gp_regs[DSISR_IDX] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_GREGS_RESULT ((void *)&dmy_ctxt.uc_mcontext.gp_regs[RESULT_IDX] - (void *)&dmy_ctxt)
+
+#define UC_MCONTEXT_FREGS_R0 ((void *)&dmy_ctxt.uc_mcontext.fp_regs[0] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_FREGS_R1 ((void *)&dmy_ctxt.uc_mcontext.fp_regs[1] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_FREGS_R2 ((void *)&dmy_ctxt.uc_mcontext.fp_regs[2] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_FREGS_R3 ((void *)&dmy_ctxt.uc_mcontext.fp_regs[3] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_FREGS_R4 ((void *)&dmy_ctxt.uc_mcontext.fp_regs[4] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_FREGS_R5 ((void *)&dmy_ctxt.uc_mcontext.fp_regs[5] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_FREGS_R6 ((void *)&dmy_ctxt.uc_mcontext.fp_regs[6] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_FREGS_R7 ((void *)&dmy_ctxt.uc_mcontext.fp_regs[7] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_FREGS_R8 ((void *)&dmy_ctxt.uc_mcontext.fp_regs[8] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_FREGS_R9 ((void *)&dmy_ctxt.uc_mcontext.fp_regs[9] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_FREGS_R10 ((void *)&dmy_ctxt.uc_mcontext.fp_regs[10] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_FREGS_R11 ((void *)&dmy_ctxt.uc_mcontext.fp_regs[11] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_FREGS_R12 ((void *)&dmy_ctxt.uc_mcontext.fp_regs[12] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_FREGS_R13 ((void *)&dmy_ctxt.uc_mcontext.fp_regs[13] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_FREGS_R14 ((void *)&dmy_ctxt.uc_mcontext.fp_regs[14] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_FREGS_R15 ((void *)&dmy_ctxt.uc_mcontext.fp_regs[15] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_FREGS_R16 ((void *)&dmy_ctxt.uc_mcontext.fp_regs[16] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_FREGS_R17 ((void *)&dmy_ctxt.uc_mcontext.fp_regs[17] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_FREGS_R18 ((void *)&dmy_ctxt.uc_mcontext.fp_regs[18] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_FREGS_R19 ((void *)&dmy_ctxt.uc_mcontext.fp_regs[19] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_FREGS_R20 ((void *)&dmy_ctxt.uc_mcontext.fp_regs[20] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_FREGS_R21 ((void *)&dmy_ctxt.uc_mcontext.fp_regs[21] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_FREGS_R22 ((void *)&dmy_ctxt.uc_mcontext.fp_regs[22] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_FREGS_R23 ((void *)&dmy_ctxt.uc_mcontext.fp_regs[23] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_FREGS_R24 ((void *)&dmy_ctxt.uc_mcontext.fp_regs[24] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_FREGS_R25 ((void *)&dmy_ctxt.uc_mcontext.fp_regs[25] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_FREGS_R26 ((void *)&dmy_ctxt.uc_mcontext.fp_regs[26] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_FREGS_R27 ((void *)&dmy_ctxt.uc_mcontext.fp_regs[27] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_FREGS_R28 ((void *)&dmy_ctxt.uc_mcontext.fp_regs[28] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_FREGS_R29 ((void *)&dmy_ctxt.uc_mcontext.fp_regs[29] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_FREGS_R30 ((void *)&dmy_ctxt.uc_mcontext.fp_regs[30] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_FREGS_R31 ((void *)&dmy_ctxt.uc_mcontext.fp_regs[31] - (void *)&dmy_ctxt)
+#define UC_MCONTEXT_FREGS_FPSCR ((void *)&dmy_ctxt.uc_mcontext.fp_regs[32] - (void *)&dmy_ctxt)
+
+#define UC_MCONTEXT_V_REGS ((void *)&dmy_ctxt.uc_mcontext.v_regs - (void *)&dmy_ctxt)
+
+#define UC_MCONTEXT_VREGS_R0 ((void *)&dmy_vrregset.vrregs[0] - (void *)&dmy_vrregset)
+#define UC_MCONTEXT_VREGS_R1 ((void *)&dmy_vrregset.vrregs[1] - (void *)&dmy_vrregset)
+#define UC_MCONTEXT_VREGS_R2 ((void *)&dmy_vrregset.vrregs[2] - (void *)&dmy_vrregset)
+#define UC_MCONTEXT_VREGS_R3 ((void *)&dmy_vrregset.vrregs[3] - (void *)&dmy_vrregset)
+#define UC_MCONTEXT_VREGS_R4 ((void *)&dmy_vrregset.vrregs[4] - (void *)&dmy_vrregset)
+#define UC_MCONTEXT_VREGS_R5 ((void *)&dmy_vrregset.vrregs[5] - (void *)&dmy_vrregset)
+#define UC_MCONTEXT_VREGS_R6 ((void *)&dmy_vrregset.vrregs[6] - (void *)&dmy_vrregset)
+#define UC_MCONTEXT_VREGS_R7 ((void *)&dmy_vrregset.vrregs[7] - (void *)&dmy_vrregset)
+#define UC_MCONTEXT_VREGS_R8 ((void *)&dmy_vrregset.vrregs[8] - (void *)&dmy_vrregset)
+#define UC_MCONTEXT_VREGS_R9 ((void *)&dmy_vrregset.vrregs[9] - (void *)&dmy_vrregset)
+#define UC_MCONTEXT_VREGS_R10 ((void *)&dmy_vrregset.vrregs[10] - (void *)&dmy_vrregset)
+#define UC_MCONTEXT_VREGS_R11 ((void *)&dmy_vrregset.vrregs[11] - (void *)&dmy_vrregset)
+#define UC_MCONTEXT_VREGS_R12 ((void *)&dmy_vrregset.vrregs[12] - (void *)&dmy_vrregset)
+#define UC_MCONTEXT_VREGS_R13 ((void *)&dmy_vrregset.vrregs[13] - (void *)&dmy_vrregset)
+#define UC_MCONTEXT_VREGS_R14 ((void *)&dmy_vrregset.vrregs[14] - (void *)&dmy_vrregset)
+#define UC_MCONTEXT_VREGS_R15 ((void *)&dmy_vrregset.vrregs[15] - (void *)&dmy_vrregset)
+#define UC_MCONTEXT_VREGS_R16 ((void *)&dmy_vrregset.vrregs[16] - (void *)&dmy_vrregset)
+#define UC_MCONTEXT_VREGS_R17 ((void *)&dmy_vrregset.vrregs[17] - (void *)&dmy_vrregset)
+#define UC_MCONTEXT_VREGS_R18 ((void *)&dmy_vrregset.vrregs[18] - (void *)&dmy_vrregset)
+#define UC_MCONTEXT_VREGS_R19 ((void *)&dmy_vrregset.vrregs[19] - (void *)&dmy_vrregset)
+#define UC_MCONTEXT_VREGS_R20 ((void *)&dmy_vrregset.vrregs[20] - (void *)&dmy_vrregset)
+#define UC_MCONTEXT_VREGS_R21 ((void *)&dmy_vrregset.vrregs[21] - (void *)&dmy_vrregset)
+#define UC_MCONTEXT_VREGS_R22 ((void *)&dmy_vrregset.vrregs[22] - (void *)&dmy_vrregset)
+#define UC_MCONTEXT_VREGS_R23 ((void *)&dmy_vrregset.vrregs[23] - (void *)&dmy_vrregset)
+#define UC_MCONTEXT_VREGS_R24 ((void *)&dmy_vrregset.vrregs[24] - (void *)&dmy_vrregset)
+#define UC_MCONTEXT_VREGS_R25 ((void *)&dmy_vrregset.vrregs[25] - (void *)&dmy_vrregset)
+#define UC_MCONTEXT_VREGS_R26 ((void *)&dmy_vrregset.vrregs[26] - (void *)&dmy_vrregset)
+#define UC_MCONTEXT_VREGS_R27 ((void *)&dmy_vrregset.vrregs[27] - (void *)&dmy_vrregset)
+#define UC_MCONTEXT_VREGS_R28 ((void *)&dmy_vrregset.vrregs[28] - (void *)&dmy_vrregset)
+#define UC_MCONTEXT_VREGS_R29 ((void *)&dmy_vrregset.vrregs[29] - (void *)&dmy_vrregset)
+#define UC_MCONTEXT_VREGS_R30 ((void *)&dmy_vrregset.vrregs[30] - (void *)&dmy_vrregset)
+#define UC_MCONTEXT_VREGS_R31 ((void *)&dmy_vrregset.vrregs[31] - (void *)&dmy_vrregset)
+#define UC_MCONTEXT_VREGS_VSCR ((void *)&dmy_vrregset.vscr - (void *)&dmy_vrregset)
+#define UC_MCONTEXT_VREGS_VRSAVE ((void *)&dmy_vrregset.vrsave - (void *)&dmy_vrregset)
+
+#endif
diff --git a/src/pal/src/libunwind/src/ppc64/unwind_i.h b/src/pal/src/libunwind/src/ppc64/unwind_i.h
new file mode 100644
index 0000000000..26bbc2df83
--- /dev/null
+++ b/src/pal/src/libunwind/src/ppc64/unwind_i.h
@@ -0,0 +1,52 @@
+/* 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. */
+
+#ifndef unwind_i_h
+#define unwind_i_h
+
+#include <stdint.h>
+
+#include <libunwind-ppc64.h>
+
+#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)
+#if 0
+#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);
+#if 0
+extern dwarf_loc_t ppc64_scratch_loc (struct cursor *c, unw_regnum_t reg);
+#endif
+
+#endif /* unwind_i_h */