gdb/ia64-linux-nat.c - gdb
Global variables defined
Functions defined
Macros defined
Source code
- #include "defs.h"
- #include "inferior.h"
- #include "target.h"
- #include "gdbcore.h"
- #include "regcache.h"
- #include "ia64-tdep.h"
- #include "linux-nat.h"
- #include <signal.h>
- #include <sys/ptrace.h>
- #include "gdb_wait.h"
- #ifdef HAVE_SYS_REG_H
- #include <sys/reg.h>
- #endif
- #include <sys/syscall.h>
- #include <sys/user.h>
- #include <asm/ptrace_offsets.h>
- #include <sys/procfs.h>
- #include "gregset.h"
- static int u_offsets[] =
- {
-
- -1,
- PT_R1,
- PT_R2,
- PT_R3,
- PT_R4,
- PT_R5,
- PT_R6,
- PT_R7,
- PT_R8,
- PT_R9,
- PT_R10,
- PT_R11,
- PT_R12,
- PT_R13,
- PT_R14,
- PT_R15,
- PT_R16,
- PT_R17,
- PT_R18,
- PT_R19,
- PT_R20,
- PT_R21,
- PT_R22,
- PT_R23,
- PT_R24,
- PT_R25,
- PT_R26,
- PT_R27,
- PT_R28,
- PT_R29,
- PT_R30,
- PT_R31,
-
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-
- -1, -1,
- PT_F2,
- PT_F3,
- PT_F4,
- PT_F5,
- PT_F6,
- PT_F7,
- PT_F8,
- PT_F9,
- PT_F10,
- PT_F11,
- PT_F12,
- PT_F13,
- PT_F14,
- PT_F15,
- PT_F16,
- PT_F17,
- PT_F18,
- PT_F19,
- PT_F20,
- PT_F21,
- PT_F22,
- PT_F23,
- PT_F24,
- PT_F25,
- PT_F26,
- PT_F27,
- PT_F28,
- PT_F29,
- PT_F30,
- PT_F31,
- PT_F32,
- PT_F33,
- PT_F34,
- PT_F35,
- PT_F36,
- PT_F37,
- PT_F38,
- PT_F39,
- PT_F40,
- PT_F41,
- PT_F42,
- PT_F43,
- PT_F44,
- PT_F45,
- PT_F46,
- PT_F47,
- PT_F48,
- PT_F49,
- PT_F50,
- PT_F51,
- PT_F52,
- PT_F53,
- PT_F54,
- PT_F55,
- PT_F56,
- PT_F57,
- PT_F58,
- PT_F59,
- PT_F60,
- PT_F61,
- PT_F62,
- PT_F63,
- PT_F64,
- PT_F65,
- PT_F66,
- PT_F67,
- PT_F68,
- PT_F69,
- PT_F70,
- PT_F71,
- PT_F72,
- PT_F73,
- PT_F74,
- PT_F75,
- PT_F76,
- PT_F77,
- PT_F78,
- PT_F79,
- PT_F80,
- PT_F81,
- PT_F82,
- PT_F83,
- PT_F84,
- PT_F85,
- PT_F86,
- PT_F87,
- PT_F88,
- PT_F89,
- PT_F90,
- PT_F91,
- PT_F92,
- PT_F93,
- PT_F94,
- PT_F95,
- PT_F96,
- PT_F97,
- PT_F98,
- PT_F99,
- PT_F100,
- PT_F101,
- PT_F102,
- PT_F103,
- PT_F104,
- PT_F105,
- PT_F106,
- PT_F107,
- PT_F108,
- PT_F109,
- PT_F110,
- PT_F111,
- PT_F112,
- PT_F113,
- PT_F114,
- PT_F115,
- PT_F116,
- PT_F117,
- PT_F118,
- PT_F119,
- PT_F120,
- PT_F121,
- PT_F122,
- PT_F123,
- PT_F124,
- PT_F125,
- PT_F126,
- PT_F127,
-
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
-
- PT_B0,
- PT_B1,
- PT_B2,
- PT_B3,
- PT_B4,
- PT_B5,
- PT_B6,
- PT_B7,
-
- -1, -1,
-
- PT_PR,
- PT_CR_IIP,
- PT_CR_IPSR,
- PT_CFM,
-
- -1, -1, -1, -1, -1, -1, -1, -1,
-
- -1, -1, -1, -1, -1, -1, -1, -1,
- PT_AR_RSC,
- PT_AR_BSP,
- PT_AR_BSPSTORE,
- PT_AR_RNAT,
- -1,
- -1,
- -1, -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- PT_AR_CCV,
- -1, -1, -1,
- PT_AR_UNAT,
- -1, -1, -1,
- PT_AR_FPSR,
- -1, -1, -1,
- -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1,
- PT_AR_PFS,
- PT_AR_LC,
- PT_AR_EC,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1,
-
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- };
- static CORE_ADDR
- ia64_register_addr (struct gdbarch *gdbarch, int regno)
- {
- CORE_ADDR addr;
- if (regno < 0 || regno >= gdbarch_num_regs (gdbarch))
- error (_("Invalid register number %d."), regno);
- if (u_offsets[regno] == -1)
- addr = 0;
- else
- addr = (CORE_ADDR) u_offsets[regno];
- return addr;
- }
- static int
- ia64_cannot_fetch_register (struct gdbarch *gdbarch, int regno)
- {
- return regno < 0
- || regno >= gdbarch_num_regs (gdbarch)
- || u_offsets[regno] == -1;
- }
- static int
- ia64_cannot_store_register (struct gdbarch *gdbarch, int regno)
- {
-
- return regno < 0
- || regno >= gdbarch_num_regs (gdbarch)
- || u_offsets[regno] == -1
- || regno == IA64_BSPSTORE_REGNUM;
- }
- void
- supply_gregset (struct regcache *regcache, const gregset_t *gregsetp)
- {
- int regi;
- const greg_t *regp = (const greg_t *) gregsetp;
- for (regi = IA64_GR0_REGNUM; regi <= IA64_GR31_REGNUM; regi++)
- {
- regcache_raw_supply (regcache, regi, regp + (regi - IA64_GR0_REGNUM));
- }
- FIXME
- regcache_raw_supply (regcache, IA64_PR_REGNUM, regp + 33);
- for (regi = IA64_BR0_REGNUM; regi <= IA64_BR7_REGNUM; regi++)
- {
- regcache_raw_supply (regcache, regi,
- regp + 34 + (regi - IA64_BR0_REGNUM));
- }
- regcache_raw_supply (regcache, IA64_IP_REGNUM, regp + 42);
- regcache_raw_supply (regcache, IA64_CFM_REGNUM, regp + 43);
- regcache_raw_supply (regcache, IA64_PSR_REGNUM, regp + 44);
- regcache_raw_supply (regcache, IA64_RSC_REGNUM, regp + 45);
- regcache_raw_supply (regcache, IA64_BSP_REGNUM, regp + 46);
- regcache_raw_supply (regcache, IA64_BSPSTORE_REGNUM, regp + 47);
- regcache_raw_supply (regcache, IA64_RNAT_REGNUM, regp + 48);
- regcache_raw_supply (regcache, IA64_CCV_REGNUM, regp + 49);
- regcache_raw_supply (regcache, IA64_UNAT_REGNUM, regp + 50);
- regcache_raw_supply (regcache, IA64_FPSR_REGNUM, regp + 51);
- regcache_raw_supply (regcache, IA64_PFS_REGNUM, regp + 52);
- regcache_raw_supply (regcache, IA64_LC_REGNUM, regp + 53);
- regcache_raw_supply (regcache, IA64_EC_REGNUM, regp + 54);
- }
- void
- fill_gregset (const struct regcache *regcache, gregset_t *gregsetp, int regno)
- {
- int regi;
- greg_t *regp = (greg_t *) gregsetp;
- #define COPY_REG(_idx_,_regi_) \
- if ((regno == -1) || regno == _regi_) \
- regcache_raw_collect (regcache, _regi_, regp + _idx_)
- for (regi = IA64_GR0_REGNUM; regi <= IA64_GR31_REGNUM; regi++)
- {
- COPY_REG (regi - IA64_GR0_REGNUM, regi);
- }
- FIXME
- COPY_REG (33, IA64_PR_REGNUM);
- for (regi = IA64_BR0_REGNUM; regi <= IA64_BR7_REGNUM; regi++)
- {
- COPY_REG (34 + (regi - IA64_BR0_REGNUM), regi);
- }
- COPY_REG (42, IA64_IP_REGNUM);
- COPY_REG (43, IA64_CFM_REGNUM);
- COPY_REG (44, IA64_PSR_REGNUM);
- COPY_REG (45, IA64_RSC_REGNUM);
- COPY_REG (46, IA64_BSP_REGNUM);
- COPY_REG (47, IA64_BSPSTORE_REGNUM);
- COPY_REG (48, IA64_RNAT_REGNUM);
- COPY_REG (49, IA64_CCV_REGNUM);
- COPY_REG (50, IA64_UNAT_REGNUM);
- COPY_REG (51, IA64_FPSR_REGNUM);
- COPY_REG (52, IA64_PFS_REGNUM);
- COPY_REG (53, IA64_LC_REGNUM);
- COPY_REG (54, IA64_EC_REGNUM);
- }
- void
- supply_fpregset (struct regcache *regcache, const fpregset_t *fpregsetp)
- {
- int regi;
- const char *from;
- const gdb_byte f_zero[16] = { 0 };
- const gdb_byte f_one[16] =
- { 0, 0, 0, 0, 0, 0, 0, 0x80, 0xff, 0xff, 0, 0, 0, 0, 0, 0 };
-
-
- regcache_raw_supply (regcache, IA64_FR0_REGNUM, f_zero);
-
- regcache_raw_supply (regcache, IA64_FR1_REGNUM, f_one);
- for (regi = IA64_FR2_REGNUM; regi <= IA64_FR127_REGNUM; regi++)
- {
- from = (const char *) &((*fpregsetp)[regi - IA64_FR0_REGNUM]);
- regcache_raw_supply (regcache, regi, from);
- }
- }
- void
- fill_fpregset (const struct regcache *regcache,
- fpregset_t *fpregsetp, int regno)
- {
- int regi;
- for (regi = IA64_FR0_REGNUM; regi <= IA64_FR127_REGNUM; regi++)
- {
- if ((regno == -1) || (regno == regi))
- regcache_raw_collect (regcache, regi,
- &((*fpregsetp)[regi - IA64_FR0_REGNUM]));
- }
- }
- #define IA64_PSR_DB (1UL << 24)
- #define IA64_PSR_DD (1UL << 39)
- static void
- enable_watchpoints_in_psr (ptid_t ptid)
- {
- struct regcache *regcache = get_thread_regcache (ptid);
- ULONGEST psr;
- regcache_cooked_read_unsigned (regcache, IA64_PSR_REGNUM, &psr);
- if (!(psr & IA64_PSR_DB))
- {
- psr |= IA64_PSR_DB;
- regcache_cooked_write_unsigned (regcache, IA64_PSR_REGNUM, psr);
- }
- }
- static long debug_registers[8];
- static void
- store_debug_register (ptid_t ptid, int idx, long val)
- {
- int tid;
- tid = ptid_get_lwp (ptid);
- if (tid == 0)
- tid = ptid_get_pid (ptid);
- (void) ptrace (PT_WRITE_U, tid, (PTRACE_TYPE_ARG3) (PT_DBR + 8 * idx), val);
- }
- static void
- store_debug_register_pair (ptid_t ptid, int idx, long *dbr_addr,
- long *dbr_mask)
- {
- if (dbr_addr)
- store_debug_register (ptid, 2 * idx, *dbr_addr);
- if (dbr_mask)
- store_debug_register (ptid, 2 * idx + 1, *dbr_mask);
- }
- static int
- is_power_of_2 (int val)
- {
- int i, onecount;
- onecount = 0;
- for (i = 0; i < 8 * sizeof (val); i++)
- if (val & (1 << i))
- onecount++;
- return onecount <= 1;
- }
- static int
- ia64_linux_insert_watchpoint (struct target_ops *self,
- CORE_ADDR addr, int len, int rw,
- struct expression *cond)
- {
- struct lwp_info *lp;
- int idx;
- long dbr_addr, dbr_mask;
- int max_watchpoints = 4;
- if (len <= 0 || !is_power_of_2 (len))
- return -1;
- for (idx = 0; idx < max_watchpoints; idx++)
- {
- dbr_mask = debug_registers[idx * 2 + 1];
- if ((dbr_mask & (0x3UL << 62)) == 0)
- {
-
- break;
- }
- }
- if (idx == max_watchpoints)
- return -1;
- dbr_addr = (long) addr;
- dbr_mask = (~(len - 1) & 0x00ffffffffffffffL);
- dbr_mask |= 0x0800000000000000L;
- switch (rw)
- {
- case hw_write:
- dbr_mask |= (1L << 62);
- break;
- case hw_read:
- dbr_mask |= (1L << 63);
- break;
- case hw_access:
- dbr_mask |= (3L << 62);
- break;
- default:
- return -1;
- }
- debug_registers[2 * idx] = dbr_addr;
- debug_registers[2 * idx + 1] = dbr_mask;
- ALL_LWPS (lp)
- {
- store_debug_register_pair (lp->ptid, idx, &dbr_addr, &dbr_mask);
- enable_watchpoints_in_psr (lp->ptid);
- }
- return 0;
- }
- static int
- ia64_linux_remove_watchpoint (struct target_ops *self,
- CORE_ADDR addr, int len, int type,
- struct expression *cond)
- {
- int idx;
- long dbr_addr, dbr_mask;
- int max_watchpoints = 4;
- if (len <= 0 || !is_power_of_2 (len))
- return -1;
- for (idx = 0; idx < max_watchpoints; idx++)
- {
- dbr_addr = debug_registers[2 * idx];
- dbr_mask = debug_registers[2 * idx + 1];
- if ((dbr_mask & (0x3UL << 62)) && addr == (CORE_ADDR) dbr_addr)
- {
- struct lwp_info *lp;
- debug_registers[2 * idx] = 0;
- debug_registers[2 * idx + 1] = 0;
- dbr_addr = 0;
- dbr_mask = 0;
- ALL_LWPS (lp)
- store_debug_register_pair (lp->ptid, idx, &dbr_addr, &dbr_mask);
- return 0;
- }
- }
- return -1;
- }
- static void
- ia64_linux_new_thread (struct lwp_info *lp)
- {
- int i, any;
- any = 0;
- for (i = 0; i < 8; i++)
- {
- if (debug_registers[i] != 0)
- any = 1;
- store_debug_register (lp->ptid, i, debug_registers[i]);
- }
- if (any)
- enable_watchpoints_in_psr (lp->ptid);
- }
- static int
- ia64_linux_stopped_data_address (struct target_ops *ops, CORE_ADDR *addr_p)
- {
- CORE_ADDR psr;
- siginfo_t siginfo;
- struct regcache *regcache = get_current_regcache ();
- if (!linux_nat_get_siginfo (inferior_ptid, &siginfo))
- return 0;
- if (siginfo.si_signo != SIGTRAP
- || (siginfo.si_code & 0xffff) != 0x0004 )
- return 0;
- regcache_cooked_read_unsigned (regcache, IA64_PSR_REGNUM, &psr);
- psr |= IA64_PSR_DD;
- regcache_cooked_write_unsigned (regcache, IA64_PSR_REGNUM, psr);
- *addr_p = (CORE_ADDR) siginfo.si_addr;
- return 1;
- }
- static int
- ia64_linux_stopped_by_watchpoint (struct target_ops *ops)
- {
- CORE_ADDR addr;
- return ia64_linux_stopped_data_address (ops, &addr);
- }
- static int
- ia64_linux_can_use_hw_breakpoint (struct target_ops *self,
- int type, int cnt, int othertype)
- {
- return 1;
- }
- static void
- ia64_linux_fetch_register (struct regcache *regcache, int regnum)
- {
- struct gdbarch *gdbarch = get_regcache_arch (regcache);
- CORE_ADDR addr;
- size_t size;
- PTRACE_TYPE_RET *buf;
- int pid, i;
-
- if (regnum == IA64_GR0_REGNUM)
- {
- const gdb_byte zero[8] = { 0 };
- gdb_assert (sizeof (zero) == register_size (gdbarch, regnum));
- regcache_raw_supply (regcache, regnum, zero);
- return;
- }
-
- if (regnum == IA64_FR0_REGNUM)
- {
- const gdb_byte f_zero[16] = { 0 };
- gdb_assert (sizeof (f_zero) == register_size (gdbarch, regnum));
- regcache_raw_supply (regcache, regnum, f_zero);
- return;
- }
-
- if (regnum == IA64_FR1_REGNUM)
- {
- const gdb_byte f_one[16] =
- { 0, 0, 0, 0, 0, 0, 0, 0x80, 0xff, 0xff, 0, 0, 0, 0, 0, 0 };
- gdb_assert (sizeof (f_one) == register_size (gdbarch, regnum));
- regcache_raw_supply (regcache, regnum, f_one);
- return;
- }
- if (ia64_cannot_fetch_register (gdbarch, regnum))
- {
- regcache_raw_supply (regcache, regnum, NULL);
- return;
- }
-
- pid = ptid_get_lwp (inferior_ptid);
- if (pid == 0)
- pid = ptid_get_pid (inferior_ptid);
-
- addr = ia64_register_addr (gdbarch, regnum);
- size = register_size (gdbarch, regnum);
- gdb_assert ((size % sizeof (PTRACE_TYPE_RET)) == 0);
- buf = alloca (size);
-
- for (i = 0; i < size / sizeof (PTRACE_TYPE_RET); i++)
- {
- errno = 0;
- buf[i] = ptrace (PT_READ_U, pid, (PTRACE_TYPE_ARG3)addr, 0);
- if (errno != 0)
- error (_("Couldn't read register %s (#%d): %s."),
- gdbarch_register_name (gdbarch, regnum),
- regnum, safe_strerror (errno));
- addr += sizeof (PTRACE_TYPE_RET);
- }
- regcache_raw_supply (regcache, regnum, buf);
- }
- static void
- ia64_linux_fetch_registers (struct target_ops *ops,
- struct regcache *regcache, int regnum)
- {
- if (regnum == -1)
- for (regnum = 0;
- regnum < gdbarch_num_regs (get_regcache_arch (regcache));
- regnum++)
- ia64_linux_fetch_register (regcache, regnum);
- else
- ia64_linux_fetch_register (regcache, regnum);
- }
- static void
- ia64_linux_store_register (const struct regcache *regcache, int regnum)
- {
- struct gdbarch *gdbarch = get_regcache_arch (regcache);
- CORE_ADDR addr;
- size_t size;
- PTRACE_TYPE_RET *buf;
- int pid, i;
- if (ia64_cannot_store_register (gdbarch, regnum))
- return;
-
- pid = ptid_get_lwp (inferior_ptid);
- if (pid == 0)
- pid = ptid_get_pid (inferior_ptid);
-
- addr = ia64_register_addr (gdbarch, regnum);
- size = register_size (gdbarch, regnum);
- gdb_assert ((size % sizeof (PTRACE_TYPE_RET)) == 0);
- buf = alloca (size);
-
- regcache_raw_collect (regcache, regnum, buf);
- for (i = 0; i < size / sizeof (PTRACE_TYPE_RET); i++)
- {
- errno = 0;
- ptrace (PT_WRITE_U, pid, (PTRACE_TYPE_ARG3)addr, buf[i]);
- if (errno != 0)
- error (_("Couldn't write register %s (#%d): %s."),
- gdbarch_register_name (gdbarch, regnum),
- regnum, safe_strerror (errno));
- addr += sizeof (PTRACE_TYPE_RET);
- }
- }
- static void
- ia64_linux_store_registers (struct target_ops *ops,
- struct regcache *regcache, int regnum)
- {
- if (regnum == -1)
- for (regnum = 0;
- regnum < gdbarch_num_regs (get_regcache_arch (regcache));
- regnum++)
- ia64_linux_store_register (regcache, regnum);
- else
- ia64_linux_store_register (regcache, regnum);
- }
- static target_xfer_partial_ftype *super_xfer_partial;
- static enum target_xfer_status
- ia64_linux_xfer_partial (struct target_ops *ops,
- enum target_object object,
- const char *annex,
- gdb_byte *readbuf, const gdb_byte *writebuf,
- ULONGEST offset, ULONGEST len,
- ULONGEST *xfered_len)
- {
- if (object == TARGET_OBJECT_UNWIND_TABLE && readbuf != NULL)
- {
- static long gate_table_size;
- gdb_byte *tmp_buf;
- long res;
-
- if (gate_table_size == 0)
- gate_table_size = syscall (__NR_getunwind, NULL, 0);
- if (gate_table_size < 0)
- return TARGET_XFER_E_IO;
- if (offset >= gate_table_size)
- return TARGET_XFER_EOF;
- tmp_buf = alloca (gate_table_size);
- res = syscall (__NR_getunwind, tmp_buf, gate_table_size);
- if (res < 0)
- return TARGET_XFER_E_IO;
- gdb_assert (res == gate_table_size);
- if (offset + len > gate_table_size)
- len = gate_table_size - offset;
- memcpy (readbuf, tmp_buf + offset, len);
- *xfered_len = len;
- return TARGET_XFER_OK;
- }
- return super_xfer_partial (ops, object, annex, readbuf, writebuf,
- offset, len, xfered_len);
- }
- static int
- ia64_linux_status_is_event (int status)
- {
- return WIFSTOPPED (status) && (WSTOPSIG (status) == SIGTRAP
- || WSTOPSIG (status) == SIGILL);
- }
- void _initialize_ia64_linux_nat (void);
- void
- _initialize_ia64_linux_nat (void)
- {
- struct target_ops *t;
-
- t = linux_target ();
-
- t->to_fetch_registers = ia64_linux_fetch_registers;
- t->to_store_registers = ia64_linux_store_registers;
-
- super_xfer_partial = t->to_xfer_partial;
- t->to_xfer_partial = ia64_linux_xfer_partial;
-
-
- t->to_have_steppable_watchpoint = 1;
- t->to_can_use_hw_breakpoint = ia64_linux_can_use_hw_breakpoint;
- t->to_stopped_by_watchpoint = ia64_linux_stopped_by_watchpoint;
- t->to_stopped_data_address = ia64_linux_stopped_data_address;
- t->to_insert_watchpoint = ia64_linux_insert_watchpoint;
- t->to_remove_watchpoint = ia64_linux_remove_watchpoint;
-
- linux_nat_add_target (t);
- linux_nat_set_new_thread (t, ia64_linux_new_thread);
- linux_nat_set_status_is_event (t, ia64_linux_status_is_event);
- }