mirror of
https://github.com/tobast/libunwind-eh_elf.git
synced 2024-11-17 13:47:37 +01:00
437 lines
17 KiB
C
437 lines
17 KiB
C
|
/* 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 <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;
|
||
|
|
||
|
|
||
|
PROTECTED 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;
|
||
|
|
||
|
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);
|
||
|
|
||
|
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)))
|
||
|
{
|
||
|
/* 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;
|
||
|
}
|
||
|
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 = PPC64_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;
|
||
|
}
|
||
|
}
|
||
|
return ret;
|
||
|
}
|