1 /* Functions specific to running gdb native on IA-64 running
4 Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
5 Free Software Foundation, Inc.
7 This file is part of GDB.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 51 Franklin Street, Fifth Floor,
22 Boston, MA 02110-1301, USA. */
25 #include "gdb_string.h"
30 #include "ia64-tdep.h"
31 #include "linux-nat.h"
34 #include <sys/ptrace.h>
39 #include <sys/syscall.h>
42 #include <asm/ptrace_offsets.h>
43 #include <sys/procfs.h>
45 /* Prototypes for supply_gregset etc. */
48 /* These must match the order of the register names.
50 Some sort of lookup table is needed because the offsets associated
51 with the registers are all over the board. */
53 static int u_offsets
[] =
55 /* general registers */
56 -1, /* gr0 not available; i.e, it's always zero */
88 /* gr32 through gr127 not directly available via the ptrace interface */
89 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
90 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
91 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
92 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
93 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
94 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
95 /* Floating point registers */
96 -1, -1, /* f0 and f1 not available (f0 is +0.0 and f1 is +1.0) */
223 /* predicate registers - we don't fetch these individually */
224 -1, -1, -1, -1, -1, -1, -1, -1,
225 -1, -1, -1, -1, -1, -1, -1, -1,
226 -1, -1, -1, -1, -1, -1, -1, -1,
227 -1, -1, -1, -1, -1, -1, -1, -1,
228 -1, -1, -1, -1, -1, -1, -1, -1,
229 -1, -1, -1, -1, -1, -1, -1, -1,
230 -1, -1, -1, -1, -1, -1, -1, -1,
231 -1, -1, -1, -1, -1, -1, -1, -1,
232 /* branch registers */
241 /* virtual frame pointer and virtual return address pointer */
243 /* other registers */
246 PT_CR_IPSR
, /* psr */
248 /* kernel registers not visible via ptrace interface (?) */
249 -1, -1, -1, -1, -1, -1, -1, -1,
251 -1, -1, -1, -1, -1, -1, -1, -1,
257 -1, /* Not available: FCR, IA32 floating control register */
259 -1, /* Not available: EFLAG */
260 -1, /* Not available: CSD */
261 -1, /* Not available: SSD */
262 -1, /* Not available: CFLG */
263 -1, /* Not available: FSR */
264 -1, /* Not available: FIR */
265 -1, /* Not available: FDR */
273 -1, /* Not available: ITC */
274 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
275 -1, -1, -1, -1, -1, -1, -1, -1, -1,
278 -1, /* Not available: EC, the Epilog Count register */
279 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
280 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
281 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
282 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
283 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
284 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
286 /* nat bits - not fetched directly; instead we obtain these bits from
287 either rnat or unat or from memory. */
288 -1, -1, -1, -1, -1, -1, -1, -1,
289 -1, -1, -1, -1, -1, -1, -1, -1,
290 -1, -1, -1, -1, -1, -1, -1, -1,
291 -1, -1, -1, -1, -1, -1, -1, -1,
292 -1, -1, -1, -1, -1, -1, -1, -1,
293 -1, -1, -1, -1, -1, -1, -1, -1,
294 -1, -1, -1, -1, -1, -1, -1, -1,
295 -1, -1, -1, -1, -1, -1, -1, -1,
296 -1, -1, -1, -1, -1, -1, -1, -1,
297 -1, -1, -1, -1, -1, -1, -1, -1,
298 -1, -1, -1, -1, -1, -1, -1, -1,
299 -1, -1, -1, -1, -1, -1, -1, -1,
300 -1, -1, -1, -1, -1, -1, -1, -1,
301 -1, -1, -1, -1, -1, -1, -1, -1,
302 -1, -1, -1, -1, -1, -1, -1, -1,
303 -1, -1, -1, -1, -1, -1, -1, -1,
307 register_addr (int regno
, CORE_ADDR blockend
)
311 if (regno
< 0 || regno
>= NUM_REGS
)
312 error (_("Invalid register number %d."), regno
);
314 if (u_offsets
[regno
] == -1)
317 addr
= (CORE_ADDR
) u_offsets
[regno
];
322 int ia64_cannot_fetch_register (regno
)
325 return regno
< 0 || regno
>= NUM_REGS
|| u_offsets
[regno
] == -1;
328 int ia64_cannot_store_register (regno
)
331 /* Rationale behind not permitting stores to bspstore...
333 The IA-64 architecture provides bspstore and bsp which refer
334 memory locations in the RSE's backing store. bspstore is the
335 next location which will be written when the RSE needs to write
336 to memory. bsp is the address at which r32 in the current frame
337 would be found if it were written to the backing store.
339 The IA-64 architecture provides read-only access to bsp and
340 read/write access to bspstore (but only when the RSE is in
341 the enforced lazy mode). It should be noted that stores
342 to bspstore also affect the value of bsp. Changing bspstore
343 does not affect the number of dirty entries between bspstore
344 and bsp, so changing bspstore by N words will also cause bsp
345 to be changed by (roughly) N as well. (It could be N-1 or N+1
346 depending upon where the NaT collection bits fall.)
348 OTOH, the Linux kernel provides read/write access to bsp (and
349 currently read/write access to bspstore as well). But it
350 is definitely the case that if you change one, the other
351 will change at the same time. It is more useful to gdb to
352 be able to change bsp. So in order to prevent strange and
353 undesirable things from happening when a dummy stack frame
354 is popped (after calling an inferior function), we allow
355 bspstore to be read, but not written. (Note that popping
356 a (generic) dummy stack frame causes all registers that
357 were previously read from the inferior process to be written
360 return regno
< 0 || regno
>= NUM_REGS
|| u_offsets
[regno
] == -1
361 || regno
== IA64_BSPSTORE_REGNUM
;
365 supply_gregset (gregset_t
*gregsetp
)
368 greg_t
*regp
= (greg_t
*) gregsetp
;
370 for (regi
= IA64_GR0_REGNUM
; regi
<= IA64_GR31_REGNUM
; regi
++)
372 regcache_raw_supply (current_regcache
, regi
,
373 (char *) (regp
+ (regi
- IA64_GR0_REGNUM
)));
376 /* FIXME: NAT collection bits are at index 32; gotta deal with these
379 regcache_raw_supply (current_regcache
, IA64_PR_REGNUM
, (char *) (regp
+ 33));
381 for (regi
= IA64_BR0_REGNUM
; regi
<= IA64_BR7_REGNUM
; regi
++)
383 regcache_raw_supply (current_regcache
, regi
,
384 (char *) (regp
+ 34 + (regi
- IA64_BR0_REGNUM
)));
387 regcache_raw_supply (current_regcache
, IA64_IP_REGNUM
,
388 (char *) (regp
+ 42));
389 regcache_raw_supply (current_regcache
, IA64_CFM_REGNUM
,
390 (char *) (regp
+ 43));
391 regcache_raw_supply (current_regcache
, IA64_PSR_REGNUM
,
392 (char *) (regp
+ 44));
393 regcache_raw_supply (current_regcache
, IA64_RSC_REGNUM
,
394 (char *) (regp
+ 45));
395 regcache_raw_supply (current_regcache
, IA64_BSP_REGNUM
,
396 (char *) (regp
+ 46));
397 regcache_raw_supply (current_regcache
, IA64_BSPSTORE_REGNUM
,
398 (char *) (regp
+ 47));
399 regcache_raw_supply (current_regcache
, IA64_RNAT_REGNUM
,
400 (char *) (regp
+ 48));
401 regcache_raw_supply (current_regcache
, IA64_CCV_REGNUM
,
402 (char *) (regp
+ 49));
403 regcache_raw_supply (current_regcache
, IA64_UNAT_REGNUM
,
404 (char *) (regp
+ 50));
405 regcache_raw_supply (current_regcache
, IA64_FPSR_REGNUM
,
406 (char *) (regp
+ 51));
407 regcache_raw_supply (current_regcache
, IA64_PFS_REGNUM
,
408 (char *) (regp
+ 52));
409 regcache_raw_supply (current_regcache
, IA64_LC_REGNUM
,
410 (char *) (regp
+ 53));
411 regcache_raw_supply (current_regcache
, IA64_EC_REGNUM
,
412 (char *) (regp
+ 54));
416 fill_gregset (gregset_t
*gregsetp
, int regno
)
419 greg_t
*regp
= (greg_t
*) gregsetp
;
421 #define COPY_REG(_idx_,_regi_) \
422 if ((regno == -1) || regno == _regi_) \
423 regcache_raw_collect (current_regcache, _regi_, regp + _idx_)
425 for (regi
= IA64_GR0_REGNUM
; regi
<= IA64_GR31_REGNUM
; regi
++)
427 COPY_REG (regi
- IA64_GR0_REGNUM
, regi
);
430 /* FIXME: NAT collection bits at index 32? */
432 COPY_REG (33, IA64_PR_REGNUM
);
434 for (regi
= IA64_BR0_REGNUM
; regi
<= IA64_BR7_REGNUM
; regi
++)
436 COPY_REG (34 + (regi
- IA64_BR0_REGNUM
), regi
);
439 COPY_REG (42, IA64_IP_REGNUM
);
440 COPY_REG (43, IA64_CFM_REGNUM
);
441 COPY_REG (44, IA64_PSR_REGNUM
);
442 COPY_REG (45, IA64_RSC_REGNUM
);
443 COPY_REG (46, IA64_BSP_REGNUM
);
444 COPY_REG (47, IA64_BSPSTORE_REGNUM
);
445 COPY_REG (48, IA64_RNAT_REGNUM
);
446 COPY_REG (49, IA64_CCV_REGNUM
);
447 COPY_REG (50, IA64_UNAT_REGNUM
);
448 COPY_REG (51, IA64_FPSR_REGNUM
);
449 COPY_REG (52, IA64_PFS_REGNUM
);
450 COPY_REG (53, IA64_LC_REGNUM
);
451 COPY_REG (54, IA64_EC_REGNUM
);
454 /* Given a pointer to a floating point register set in /proc format
455 (fpregset_t *), unpack the register contents and supply them as gdb's
456 idea of the current floating point register values. */
459 supply_fpregset (fpregset_t
*fpregsetp
)
464 for (regi
= IA64_FR0_REGNUM
; regi
<= IA64_FR127_REGNUM
; regi
++)
466 from
= (char *) &((*fpregsetp
)[regi
- IA64_FR0_REGNUM
]);
467 regcache_raw_supply (current_regcache
, regi
, from
);
471 /* Given a pointer to a floating point register set in /proc format
472 (fpregset_t *), update the register specified by REGNO from gdb's idea
473 of the current floating point register set. If REGNO is -1, update
477 fill_fpregset (fpregset_t
*fpregsetp
, int regno
)
481 for (regi
= IA64_FR0_REGNUM
; regi
<= IA64_FR127_REGNUM
; regi
++)
483 if ((regno
== -1) || (regno
== regi
))
484 regcache_raw_collect (current_regcache
, regi
,
485 &((*fpregsetp
)[regi
- IA64_FR0_REGNUM
]));
489 #define IA64_PSR_DB (1UL << 24)
490 #define IA64_PSR_DD (1UL << 39)
493 enable_watchpoints_in_psr (ptid_t ptid
)
497 psr
= read_register_pid (IA64_PSR_REGNUM
, ptid
);
498 if (!(psr
& IA64_PSR_DB
))
500 psr
|= IA64_PSR_DB
; /* Set the db bit - this enables hardware
501 watchpoints and breakpoints. */
502 write_register_pid (IA64_PSR_REGNUM
, psr
, ptid
);
507 fetch_debug_register (ptid_t ptid
, int idx
)
516 val
= ptrace (PT_READ_U
, tid
, (PTRACE_TYPE_ARG3
) (PT_DBR
+ 8 * idx
), 0);
522 store_debug_register (ptid_t ptid
, int idx
, long val
)
530 (void) ptrace (PT_WRITE_U
, tid
, (PTRACE_TYPE_ARG3
) (PT_DBR
+ 8 * idx
), val
);
534 fetch_debug_register_pair (ptid_t ptid
, int idx
, long *dbr_addr
, long *dbr_mask
)
537 *dbr_addr
= fetch_debug_register (ptid
, 2 * idx
);
539 *dbr_mask
= fetch_debug_register (ptid
, 2 * idx
+ 1);
543 store_debug_register_pair (ptid_t ptid
, int idx
, long *dbr_addr
, long *dbr_mask
)
546 store_debug_register (ptid
, 2 * idx
, *dbr_addr
);
548 store_debug_register (ptid
, 2 * idx
+ 1, *dbr_mask
);
552 is_power_of_2 (int val
)
557 for (i
= 0; i
< 8 * sizeof (val
); i
++)
561 return onecount
<= 1;
565 ia64_linux_insert_watchpoint (ptid_t ptid
, CORE_ADDR addr
, int len
, int rw
)
568 long dbr_addr
, dbr_mask
;
569 int max_watchpoints
= 4;
571 if (len
<= 0 || !is_power_of_2 (len
))
574 for (idx
= 0; idx
< max_watchpoints
; idx
++)
576 fetch_debug_register_pair (ptid
, idx
, NULL
, &dbr_mask
);
577 if ((dbr_mask
& (0x3UL
<< 62)) == 0)
579 /* Exit loop if both r and w bits clear */
584 if (idx
== max_watchpoints
)
587 dbr_addr
= (long) addr
;
588 dbr_mask
= (~(len
- 1) & 0x00ffffffffffffffL
); /* construct mask to match */
589 dbr_mask
|= 0x0800000000000000L
; /* Only match privilege level 3 */
593 dbr_mask
|= (1L << 62); /* Set w bit */
596 dbr_mask
|= (1L << 63); /* Set r bit */
599 dbr_mask
|= (3L << 62); /* Set both r and w bits */
605 store_debug_register_pair (ptid
, idx
, &dbr_addr
, &dbr_mask
);
606 enable_watchpoints_in_psr (ptid
);
612 ia64_linux_remove_watchpoint (ptid_t ptid
, CORE_ADDR addr
, int len
)
615 long dbr_addr
, dbr_mask
;
616 int max_watchpoints
= 4;
618 if (len
<= 0 || !is_power_of_2 (len
))
621 for (idx
= 0; idx
< max_watchpoints
; idx
++)
623 fetch_debug_register_pair (ptid
, idx
, &dbr_addr
, &dbr_mask
);
624 if ((dbr_mask
& (0x3UL
<< 62)) && addr
== (CORE_ADDR
) dbr_addr
)
628 store_debug_register_pair (ptid
, idx
, &dbr_addr
, &dbr_mask
);
636 ia64_linux_stopped_data_address (CORE_ADDR
*addr_p
)
640 struct siginfo siginfo
;
641 ptid_t ptid
= inferior_ptid
;
648 ptrace (PTRACE_GETSIGINFO
, tid
, (PTRACE_TYPE_ARG3
) 0, &siginfo
);
650 if (errno
!= 0 || siginfo
.si_signo
!= SIGTRAP
||
651 (siginfo
.si_code
& 0xffff) != 0x0004 /* TRAP_HWBKPT */)
654 psr
= read_register_pid (IA64_PSR_REGNUM
, ptid
);
655 psr
|= IA64_PSR_DD
; /* Set the dd bit - this will disable the watchpoint
656 for the next instruction */
657 write_register_pid (IA64_PSR_REGNUM
, psr
, ptid
);
659 *addr_p
= (CORE_ADDR
)siginfo
.si_addr
;
664 ia64_linux_stopped_by_watchpoint (void)
667 return ia64_linux_stopped_data_address (&addr
);
670 static LONGEST (*super_xfer_partial
) (struct target_ops
*, enum target_object
,
671 const char *, gdb_byte
*, const gdb_byte
*,
675 ia64_linux_xfer_partial (struct target_ops
*ops
,
676 enum target_object object
,
678 gdb_byte
*readbuf
, const gdb_byte
*writebuf
,
679 ULONGEST offset
, LONGEST len
)
681 if (object
== TARGET_OBJECT_UNWIND_TABLE
&& writebuf
== NULL
&& offset
== 0)
682 return syscall (__NR_getunwind
, readbuf
, len
);
684 return super_xfer_partial (ops
, object
, annex
, readbuf
, writebuf
,
688 void _initialize_ia64_linux_nat (void);
691 _initialize_ia64_linux_nat (void)
693 struct target_ops
*t
= linux_target ();
695 /* Fill in the generic GNU/Linux methods. */
698 /* Override the default to_xfer_partial. */
699 super_xfer_partial
= t
->to_xfer_partial
;
700 t
->to_xfer_partial
= ia64_linux_xfer_partial
;
702 /* Register the target. */
703 linux_nat_add_target (t
);