| OLD | NEW |
| 1 /* Functions specific to running gdb native on IA-64 running | 1 /* Functions specific to running gdb native on IA-64 running |
| 2 GNU/Linux. | 2 GNU/Linux. |
| 3 | 3 |
| 4 Copyright (C) 1999-2012 Free Software Foundation, Inc. | 4 Copyright (C) 1999-2012 Free Software Foundation, Inc. |
| 5 | 5 |
| 6 This file is part of GDB. | 6 This file is part of GDB. |
| 7 | 7 |
| 8 This program is free software; you can redistribute it and/or modify | 8 This program is free software; you can redistribute it and/or modify |
| 9 it under the terms of the GNU General Public License as published by | 9 it under the terms of the GNU General Public License as published by |
| 10 the Free Software Foundation; either version 3 of the License, or | 10 the Free Software Foundation; either version 3 of the License, or |
| (...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 265 -1, -1, -1, | 265 -1, -1, -1, |
| 266 PT_AR_UNAT, | 266 PT_AR_UNAT, |
| 267 -1, -1, -1, | 267 -1, -1, -1, |
| 268 PT_AR_FPSR, | 268 PT_AR_FPSR, |
| 269 -1, -1, -1, | 269 -1, -1, -1, |
| 270 -1, /* Not available: ITC */ | 270 -1, /* Not available: ITC */ |
| 271 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | 271 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| 272 -1, -1, -1, -1, -1, -1, -1, -1, -1, | 272 -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| 273 PT_AR_PFS, | 273 PT_AR_PFS, |
| 274 PT_AR_LC, | 274 PT_AR_LC, |
| 275 -1,»» /* Not available: EC, the Epilog Count register. */ | 275 PT_AR_EC, |
| 276 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | 276 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| 277 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | 277 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| 278 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | 278 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| 279 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | 279 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| 280 -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, | 281 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| 282 -1, | 282 -1, |
| 283 /* nat bits - not fetched directly; instead we obtain these bits from | 283 /* nat bits - not fetched directly; instead we obtain these bits from |
| 284 either rnat or unat or from memory. */ | 284 either rnat or unat or from memory. */ |
| 285 -1, -1, -1, -1, -1, -1, -1, -1, | 285 -1, -1, -1, -1, -1, -1, -1, -1, |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 440 | 440 |
| 441 /* Given a pointer to a floating point register set in /proc format | 441 /* Given a pointer to a floating point register set in /proc format |
| 442 (fpregset_t *), unpack the register contents and supply them as gdb's | 442 (fpregset_t *), unpack the register contents and supply them as gdb's |
| 443 idea of the current floating point register values. */ | 443 idea of the current floating point register values. */ |
| 444 | 444 |
| 445 void | 445 void |
| 446 supply_fpregset (struct regcache *regcache, const fpregset_t *fpregsetp) | 446 supply_fpregset (struct regcache *regcache, const fpregset_t *fpregsetp) |
| 447 { | 447 { |
| 448 int regi; | 448 int regi; |
| 449 const char *from; | 449 const char *from; |
| 450 const gdb_byte f_zero[16] = { 0 }; |
| 451 const gdb_byte f_one[16] = |
| 452 { 0, 0, 0, 0, 0, 0, 0, 0x80, 0xff, 0xff, 0, 0, 0, 0, 0, 0 }; |
| 450 | 453 |
| 451 for (regi = IA64_FR0_REGNUM; regi <= IA64_FR127_REGNUM; regi++) | 454 /* Kernel generated cores have fr1==0 instead of 1.0. Older GDBs |
| 455 did the same. So ignore whatever might be recorded in fpregset_t |
| 456 for fr0/fr1 and always supply their expected values. */ |
| 457 |
| 458 /* fr0 is always read as zero. */ |
| 459 regcache_raw_supply (regcache, IA64_FR0_REGNUM, f_zero); |
| 460 /* fr1 is always read as one (1.0). */ |
| 461 regcache_raw_supply (regcache, IA64_FR1_REGNUM, f_one); |
| 462 |
| 463 for (regi = IA64_FR2_REGNUM; regi <= IA64_FR127_REGNUM; regi++) |
| 452 { | 464 { |
| 453 from = (const char *) &((*fpregsetp)[regi - IA64_FR0_REGNUM]); | 465 from = (const char *) &((*fpregsetp)[regi - IA64_FR0_REGNUM]); |
| 454 regcache_raw_supply (regcache, regi, from); | 466 regcache_raw_supply (regcache, regi, from); |
| 455 } | 467 } |
| 456 } | 468 } |
| 457 | 469 |
| 458 /* Given a pointer to a floating point register set in /proc format | 470 /* Given a pointer to a floating point register set in /proc format |
| 459 (fpregset_t *), update the register specified by REGNO from gdb's idea | 471 (fpregset_t *), update the register specified by REGNO from gdb's idea |
| 460 of the current floating point register set. If REGNO is -1, update | 472 of the current floating point register set. If REGNO is -1, update |
| 461 them all. */ | 473 them all. */ |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 610 ALL_LWPS (lp) | 622 ALL_LWPS (lp) |
| 611 store_debug_register_pair (lp->ptid, idx, &dbr_addr, &dbr_mask); | 623 store_debug_register_pair (lp->ptid, idx, &dbr_addr, &dbr_mask); |
| 612 | 624 |
| 613 return 0; | 625 return 0; |
| 614 } | 626 } |
| 615 } | 627 } |
| 616 return -1; | 628 return -1; |
| 617 } | 629 } |
| 618 | 630 |
| 619 static void | 631 static void |
| 620 ia64_linux_new_thread (ptid_t ptid) | 632 ia64_linux_new_thread (struct lwp_info *lp) |
| 621 { | 633 { |
| 622 int i, any; | 634 int i, any; |
| 623 | 635 |
| 624 any = 0; | 636 any = 0; |
| 625 for (i = 0; i < 8; i++) | 637 for (i = 0; i < 8; i++) |
| 626 { | 638 { |
| 627 if (debug_registers[i] != 0) | 639 if (debug_registers[i] != 0) |
| 628 any = 1; | 640 any = 1; |
| 629 store_debug_register (ptid, i, debug_registers[i]); | 641 store_debug_register (lp->ptid, i, debug_registers[i]); |
| 630 } | 642 } |
| 631 | 643 |
| 632 if (any) | 644 if (any) |
| 633 enable_watchpoints_in_psr (ptid); | 645 enable_watchpoints_in_psr (lp->ptid); |
| 634 } | 646 } |
| 635 | 647 |
| 636 static int | 648 static int |
| 637 ia64_linux_stopped_data_address (struct target_ops *ops, CORE_ADDR *addr_p) | 649 ia64_linux_stopped_data_address (struct target_ops *ops, CORE_ADDR *addr_p) |
| 638 { | 650 { |
| 639 CORE_ADDR psr; | 651 CORE_ADDR psr; |
| 640 struct siginfo *siginfo_p; | 652 siginfo_t siginfo; |
| 641 struct regcache *regcache = get_current_regcache (); | 653 struct regcache *regcache = get_current_regcache (); |
| 642 | 654 |
| 643 siginfo_p = linux_nat_get_siginfo (inferior_ptid); | 655 if (!linux_nat_get_siginfo (inferior_ptid, &siginfo)) |
| 656 return 0; |
| 644 | 657 |
| 645 if (siginfo_p->si_signo != SIGTRAP | 658 if (siginfo.si_signo != SIGTRAP |
| 646 || (siginfo_p->si_code & 0xffff) != 0x0004 /* TRAP_HWBKPT */) | 659 || (siginfo.si_code & 0xffff) != 0x0004 /* TRAP_HWBKPT */) |
| 647 return 0; | 660 return 0; |
| 648 | 661 |
| 649 regcache_cooked_read_unsigned (regcache, IA64_PSR_REGNUM, &psr); | 662 regcache_cooked_read_unsigned (regcache, IA64_PSR_REGNUM, &psr); |
| 650 psr |= IA64_PSR_DD; /* Set the dd bit - this will disable the watchpoint | 663 psr |= IA64_PSR_DD; /* Set the dd bit - this will disable the watchpoint |
| 651 for the next instruction. */ | 664 for the next instruction. */ |
| 652 regcache_cooked_write_unsigned (regcache, IA64_PSR_REGNUM, psr); | 665 regcache_cooked_write_unsigned (regcache, IA64_PSR_REGNUM, psr); |
| 653 | 666 |
| 654 *addr_p = (CORE_ADDR)siginfo_p->si_addr; | 667 *addr_p = (CORE_ADDR) siginfo.si_addr; |
| 655 return 1; | 668 return 1; |
| 656 } | 669 } |
| 657 | 670 |
| 658 static int | 671 static int |
| 659 ia64_linux_stopped_by_watchpoint (void) | 672 ia64_linux_stopped_by_watchpoint (void) |
| 660 { | 673 { |
| 661 CORE_ADDR addr; | 674 CORE_ADDR addr; |
| 662 return ia64_linux_stopped_data_address (¤t_target, &addr); | 675 return ia64_linux_stopped_data_address (¤t_target, &addr); |
| 663 } | 676 } |
| 664 | 677 |
| 665 static int | 678 static int |
| 666 ia64_linux_can_use_hw_breakpoint (int type, int cnt, int othertype) | 679 ia64_linux_can_use_hw_breakpoint (int type, int cnt, int othertype) |
| 667 { | 680 { |
| 668 return 1; | 681 return 1; |
| 669 } | 682 } |
| 670 | 683 |
| 671 | 684 |
| 672 /* Fetch register REGNUM from the inferior. */ | 685 /* Fetch register REGNUM from the inferior. */ |
| 673 | 686 |
| 674 static void | 687 static void |
| 675 ia64_linux_fetch_register (struct regcache *regcache, int regnum) | 688 ia64_linux_fetch_register (struct regcache *regcache, int regnum) |
| 676 { | 689 { |
| 677 struct gdbarch *gdbarch = get_regcache_arch (regcache); | 690 struct gdbarch *gdbarch = get_regcache_arch (regcache); |
| 678 CORE_ADDR addr; | 691 CORE_ADDR addr; |
| 679 size_t size; | 692 size_t size; |
| 680 PTRACE_TYPE_RET *buf; | 693 PTRACE_TYPE_RET *buf; |
| 681 int pid, i; | 694 int pid, i; |
| 682 | 695 |
| 696 /* r0 cannot be fetched but is always zero. */ |
| 697 if (regnum == IA64_GR0_REGNUM) |
| 698 { |
| 699 const gdb_byte zero[8] = { 0 }; |
| 700 |
| 701 gdb_assert (sizeof (zero) == register_size (gdbarch, regnum)); |
| 702 regcache_raw_supply (regcache, regnum, zero); |
| 703 return; |
| 704 } |
| 705 |
| 706 /* fr0 cannot be fetched but is always zero. */ |
| 707 if (regnum == IA64_FR0_REGNUM) |
| 708 { |
| 709 const gdb_byte f_zero[16] = { 0 }; |
| 710 |
| 711 gdb_assert (sizeof (f_zero) == register_size (gdbarch, regnum)); |
| 712 regcache_raw_supply (regcache, regnum, f_zero); |
| 713 return; |
| 714 } |
| 715 |
| 716 /* fr1 cannot be fetched but is always one (1.0). */ |
| 717 if (regnum == IA64_FR1_REGNUM) |
| 718 { |
| 719 const gdb_byte f_one[16] = |
| 720 { 0, 0, 0, 0, 0, 0, 0, 0x80, 0xff, 0xff, 0, 0, 0, 0, 0, 0 }; |
| 721 |
| 722 gdb_assert (sizeof (f_one) == register_size (gdbarch, regnum)); |
| 723 regcache_raw_supply (regcache, regnum, f_one); |
| 724 return; |
| 725 } |
| 726 |
| 683 if (ia64_cannot_fetch_register (gdbarch, regnum)) | 727 if (ia64_cannot_fetch_register (gdbarch, regnum)) |
| 684 { | 728 { |
| 685 regcache_raw_supply (regcache, regnum, NULL); | 729 regcache_raw_supply (regcache, regnum, NULL); |
| 686 return; | 730 return; |
| 687 } | 731 } |
| 688 | 732 |
| 689 /* Cater for systems like GNU/Linux, that implement threads as | 733 /* Cater for systems like GNU/Linux, that implement threads as |
| 690 separate processes. */ | 734 separate processes. */ |
| 691 pid = ptid_get_lwp (inferior_ptid); | 735 pid = ptid_get_lwp (inferior_ptid); |
| 692 if (pid == 0) | 736 if (pid == 0) |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 853 t->to_stopped_by_watchpoint = ia64_linux_stopped_by_watchpoint; | 897 t->to_stopped_by_watchpoint = ia64_linux_stopped_by_watchpoint; |
| 854 t->to_stopped_data_address = ia64_linux_stopped_data_address; | 898 t->to_stopped_data_address = ia64_linux_stopped_data_address; |
| 855 t->to_insert_watchpoint = ia64_linux_insert_watchpoint; | 899 t->to_insert_watchpoint = ia64_linux_insert_watchpoint; |
| 856 t->to_remove_watchpoint = ia64_linux_remove_watchpoint; | 900 t->to_remove_watchpoint = ia64_linux_remove_watchpoint; |
| 857 | 901 |
| 858 /* Register the target. */ | 902 /* Register the target. */ |
| 859 linux_nat_add_target (t); | 903 linux_nat_add_target (t); |
| 860 linux_nat_set_new_thread (t, ia64_linux_new_thread); | 904 linux_nat_set_new_thread (t, ia64_linux_new_thread); |
| 861 linux_nat_set_status_is_event (t, ia64_linux_status_is_event); | 905 linux_nat_set_status_is_event (t, ia64_linux_status_is_event); |
| 862 } | 906 } |
| OLD | NEW |