#include "defs.h"
#include "arch-utils.h"
#define GATE_AREA_START 0xa000000000000100LL
#define GATE_AREA_END 0xa000000000010000LL
#define IA64_LINUX_SIGCONTEXT_OFFSET 192
int
ia64_linux_in_sigtramp (CORE_ADDR pc, char *func_name)
{
return (pc >= (CORE_ADDR) GATE_AREA_START && pc < (CORE_ADDR) GATE_AREA_END);
}
CORE_ADDR
ia64_linux_sigcontext_register_address (CORE_ADDR sp, int regno)
{
if (IA64_GR0_REGNUM <= regno && regno <= IA64_GR31_REGNUM)
return sp + IA64_LINUX_SIGCONTEXT_OFFSET + 200 + 8 * (regno - IA64_GR0_REGNUM);
else if (IA64_BR0_REGNUM <= regno && regno <= IA64_BR7_REGNUM)
return sp + IA64_LINUX_SIGCONTEXT_OFFSET + 136 + 8 * (regno - IA64_BR0_REGNUM);
else if (IA64_FR0_REGNUM <= regno && regno <= IA64_FR127_REGNUM)
return sp + IA64_LINUX_SIGCONTEXT_OFFSET + 464 + 16 * (regno - IA64_FR0_REGNUM);
else
switch (regno)
{
case IA64_IP_REGNUM :
return sp + IA64_LINUX_SIGCONTEXT_OFFSET + 40;
case IA64_CFM_REGNUM :
return sp + IA64_LINUX_SIGCONTEXT_OFFSET + 48;
case IA64_PSR_REGNUM :
return sp + IA64_LINUX_SIGCONTEXT_OFFSET + 56;
case IA64_BSP_REGNUM :
return sp + IA64_LINUX_SIGCONTEXT_OFFSET + 72;
case IA64_RNAT_REGNUM :
return sp + IA64_LINUX_SIGCONTEXT_OFFSET + 80;
case IA64_CCV_REGNUM :
return sp + IA64_LINUX_SIGCONTEXT_OFFSET + 88;
case IA64_UNAT_REGNUM :
return sp + IA64_LINUX_SIGCONTEXT_OFFSET + 96;
case IA64_FPSR_REGNUM :
return sp + IA64_LINUX_SIGCONTEXT_OFFSET + 104;
case IA64_PFS_REGNUM :
return sp + IA64_LINUX_SIGCONTEXT_OFFSET + 112;
case IA64_LC_REGNUM :
return sp + IA64_LINUX_SIGCONTEXT_OFFSET + 120;
case IA64_PR_REGNUM :
return sp + IA64_LINUX_SIGCONTEXT_OFFSET + 128;
default :
return 0;
}
}