1
0
Fork 0
mirror of https://github.com/tobast/libunwind-eh_elf.git synced 2024-11-26 17:17:39 +01:00

Include <asm/ptrace_offsets.h> only if we have it.

Issue warning for platforms using ttrace() instead of ptrace() (HP-UX
is the only platform that does that).

(Logical change 1.63)
This commit is contained in:
mostang.com!davidm 2003-03-19 19:25:18 +00:00
parent 0f3adfb3e6
commit d933d89e38

View file

@ -27,7 +27,9 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
#if UNW_TARGET_IA64 #if UNW_TARGET_IA64
# include <elf.h> # include <elf.h>
# include <asm/ptrace_offsets.h> # ifdef HAVE_ASM_PTRACE_OFFSETS_H
# include <asm/ptrace_offsets.h>
# endif
# include "ia64/rse.h" # include "ia64/rse.h"
#endif #endif
@ -51,9 +53,13 @@ _UPT_access_reg (unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val,
/* The Linux ptrace represents the statc NaT bits as a single word. */ /* The Linux ptrace represents the statc NaT bits as a single word. */
mask = ((unw_word_t) 1) << (reg - UNW_IA64_NAT); mask = ((unw_word_t) 1) << (reg - UNW_IA64_NAT);
errno = 0; errno = 0;
#ifdef HAVE_TTRACE
# warning No support for ttrace() yet.
#else
nat_bits = ptrace (PTRACE_PEEKUSER, pid, PT_NAT_BITS, 0); nat_bits = ptrace (PTRACE_PEEKUSER, pid, PT_NAT_BITS, 0);
if (errno) if (errno)
return -UNW_EBADREG; return -UNW_EBADREG;
#endif
if (write) if (write)
{ {
@ -61,10 +67,14 @@ _UPT_access_reg (unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val,
nat_bits |= mask; nat_bits |= mask;
else else
nat_bits &= ~mask; nat_bits &= ~mask;
#ifdef HAVE_TTRACE
# warning No support for ttrace() yet.
#else
errno = 0; errno = 0;
ptrace (PTRACE_POKEUSER, pid, PT_NAT_BITS, nat_bits); ptrace (PTRACE_POKEUSER, pid, PT_NAT_BITS, nat_bits);
if (errno) if (errno)
return -UNW_EBADREG; return -UNW_EBADREG;
#endif
} }
goto out; goto out;
} }
@ -82,26 +92,38 @@ _UPT_access_reg (unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val,
unsigned long ip, psr; unsigned long ip, psr;
/* distribute bundle-addr. & slot-number across PT_IIP & PT_IPSR. */ /* distribute bundle-addr. & slot-number across PT_IIP & PT_IPSR. */
#ifdef HAVE_TTRACE
# warning No support for ttrace() yet.
#else
errno = 0; errno = 0;
psr = ptrace (PTRACE_PEEKUSER, pid, PT_CR_IPSR, 0); psr = ptrace (PTRACE_PEEKUSER, pid, PT_CR_IPSR, 0);
if (errno) if (errno)
return -UNW_EBADREG; return -UNW_EBADREG;
#endif
if (write) if (write)
{ {
ip = *val & ~0xfUL; ip = *val & ~0xfUL;
psr = (psr & ~0x3UL << 41) | (*val & 0x3); psr = (psr & ~0x3UL << 41) | (*val & 0x3);
#ifdef HAVE_TTRACE
# warning No support for ttrace() yet.
#else
errno = 0; errno = 0;
ptrace (PTRACE_POKEUSER, pid, PT_CR_IIP, ip); ptrace (PTRACE_POKEUSER, pid, PT_CR_IIP, ip);
ptrace (PTRACE_POKEUSER, pid, PT_CR_IPSR, psr); ptrace (PTRACE_POKEUSER, pid, PT_CR_IPSR, psr);
if (errno) if (errno)
return -UNW_EBADREG; return -UNW_EBADREG;
#endif
} }
else else
{ {
#ifdef HAVE_TTRACE
# warning No support for ttrace() yet.
#else
errno = 0; errno = 0;
ip = ptrace (PTRACE_PEEKUSER, pid, PT_CR_IIP, 0); ip = ptrace (PTRACE_PEEKUSER, pid, PT_CR_IIP, 0);
if (errno) if (errno)
return -UNW_EBADREG; return -UNW_EBADREG;
#endif
*val = ip + ((psr >> 41) & 0x3); *val = ip + ((psr >> 41) & 0x3);
} }
goto out; goto out;
@ -116,28 +138,40 @@ _UPT_access_reg (unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val,
{ {
unsigned long sof, cfm, bsp; unsigned long sof, cfm, bsp;
#ifdef HAVE_TTRACE
# warning No support for ttrace() yet.
#else
/* Account for the fact that ptrace() expects bsp to point /* Account for the fact that ptrace() expects bsp to point
_after_ the current register frame. */ _after_ the current register frame. */
errno = 0; errno = 0;
cfm = ptrace (PTRACE_PEEKUSER, pid, PT_CFM, 0); cfm = ptrace (PTRACE_PEEKUSER, pid, PT_CFM, 0);
if (errno) if (errno)
return -UNW_EBADREG; return -UNW_EBADREG;
#endif
sof = (cfm & 0x7f); sof = (cfm & 0x7f);
if (write) if (write)
{ {
bsp = ia64_rse_skip_regs (*val, sof); bsp = ia64_rse_skip_regs (*val, sof);
#ifdef HAVE_TTRACE
# warning No support for ttrace() yet.
#else
errno = 0; errno = 0;
ptrace (PTRACE_POKEUSER, pid, PT_AR_BSP, bsp); ptrace (PTRACE_POKEUSER, pid, PT_AR_BSP, bsp);
if (errno) if (errno)
return -UNW_EBADREG; return -UNW_EBADREG;
#endif
} }
else else
{ {
#ifdef HAVE_TTRACE
# warning No support for ttrace() yet.
#else
errno = 0; errno = 0;
bsp = ptrace (PTRACE_PEEKUSER, pid, PT_AR_BSP, 0); bsp = ptrace (PTRACE_PEEKUSER, pid, PT_AR_BSP, 0);
if (errno) if (errno)
return -UNW_EBADREG; return -UNW_EBADREG;
#endif
*val = ia64_rse_skip_regs (bsp, -sof); *val = ia64_rse_skip_regs (bsp, -sof);
} }
goto out; goto out;
@ -150,9 +184,13 @@ _UPT_access_reg (unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val,
{ {
unsigned long new_sof, old_sof, cfm, bsp; unsigned long new_sof, old_sof, cfm, bsp;
#ifdef HAVE_TTRACE
# warning No support for ttrace() yet.
#else
errno = 0; errno = 0;
bsp = ptrace (PTRACE_PEEKUSER, pid, PT_AR_BSP, 0); bsp = ptrace (PTRACE_PEEKUSER, pid, PT_AR_BSP, 0);
cfm = ptrace (PTRACE_PEEKUSER, pid, PT_CFM, 0); cfm = ptrace (PTRACE_PEEKUSER, pid, PT_CFM, 0);
#endif
if (errno) if (errno)
return -UNW_EBADREG; return -UNW_EBADREG;
old_sof = (cfm & 0x7f); old_sof = (cfm & 0x7f);
@ -160,15 +198,23 @@ _UPT_access_reg (unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val,
if (old_sof != new_sof) if (old_sof != new_sof)
{ {
bsp = ia64_rse_skip_regs (bsp, -old_sof + new_sof); bsp = ia64_rse_skip_regs (bsp, -old_sof + new_sof);
#ifdef HAVE_TTRACE
# warning No support for ttrace() yet.
#else
errno = 0; errno = 0;
ptrace (PTRACE_POKEUSER, pid, PT_AR_BSP, 0); ptrace (PTRACE_POKEUSER, pid, PT_AR_BSP, 0);
if (errno) if (errno)
return -UNW_EBADREG; return -UNW_EBADREG;
#endif
} }
#ifdef HAVE_TTRACE
# warning No support for ttrace() yet.
#else
errno = 0; errno = 0;
ptrace (PTRACE_POKEUSER, pid, PT_CFM, *val); ptrace (PTRACE_POKEUSER, pid, PT_CFM, *val);
if (errno) if (errno)
return -UNW_EBADREG; return -UNW_EBADREG;
#endif
goto out; goto out;
} }
break; break;
@ -178,6 +224,9 @@ _UPT_access_reg (unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val,
if ((unsigned) reg >= sizeof (_UPT_reg_offset) / sizeof (_UPT_reg_offset[0])) if ((unsigned) reg >= sizeof (_UPT_reg_offset) / sizeof (_UPT_reg_offset[0]))
return -UNW_EBADREG; return -UNW_EBADREG;
#ifdef HAVE_TTRACE
# warning No support for ttrace() yet.
#else
errno = 0; errno = 0;
if (write) if (write)
ptrace (PTRACE_POKEUSER, pid, _UPT_reg_offset[reg], *val); ptrace (PTRACE_POKEUSER, pid, _UPT_reg_offset[reg], *val);
@ -185,6 +234,7 @@ _UPT_access_reg (unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val,
*val = ptrace (PTRACE_PEEKUSER, pid, _UPT_reg_offset[reg], 0); *val = ptrace (PTRACE_PEEKUSER, pid, _UPT_reg_offset[reg], 0);
if (errno) if (errno)
return -UNW_EBADREG; return -UNW_EBADREG;
#endif
out: out:
#if DEBUG #if DEBUG