diff --git a/gdb-6.3-ia64-sigtramp-frame-20050708.patch b/gdb-6.3-ia64-sigtramp-frame-20050708.patch new file mode 100644 index 0000000..868eab8 --- /dev/null +++ b/gdb-6.3-ia64-sigtramp-frame-20050708.patch @@ -0,0 +1,149 @@ +2005-07-08 Jeff Johnston + + * ia64-tdep.c (ia64_sigtramp_frame_prev_register): Build + pseudo-registers the same as ia64_pseudo_register_read. + +--- gdb-6.3/gdb/ia64-tdep.c.fix 2005-07-08 20:26:37.000000000 -0400 ++++ gdb-6.3/gdb/ia64-tdep.c 2005-07-08 20:27:41.000000000 -0400 +@@ -2037,7 +2037,100 @@ ia64_sigtramp_frame_prev_register (struc + pc &= ~0xf; + store_unsigned_integer (valuep, 8, pc); + } +- else if ((regnum >= IA64_GR32_REGNUM && regnum <= IA64_GR127_REGNUM) || ++ else if (IA64_NAT0_REGNUM <= regnum && regnum <= IA64_NAT31_REGNUM) ++ { ++ /* NAT pseudo registers 0-31: get them from UNAT. ++ * "copied" from ia64_pseudo_register_read() */ ++ CORE_ADDR addr = 0; ++ ULONGEST unatN_val; ++ ULONGEST unat; ++ read_memory (cache->saved_regs[IA64_UNAT_REGNUM], (char *) &unat, ++ register_size (current_gdbarch, IA64_UNAT_REGNUM)); ++ unatN_val = (unat & (1LL << (regnum - IA64_NAT0_REGNUM))) != 0; ++ store_unsigned_integer (valuep, register_size (current_gdbarch, regnum), ++ unatN_val); ++ *lvalp = lval_memory; ++ *addrp = cache->saved_regs[IA64_UNAT_REGNUM]; ++ } ++ else if (IA64_NAT32_REGNUM <= regnum && regnum <= IA64_NAT127_REGNUM) ++ { ++ /* NAT pseudo registers 32-127. ++ * "copied" from ia64_pseudo_register_read() ++ * FIXME: Not currently tested -- cannot get the frame to include ++ * NAT32-NAT127. */ ++ ULONGEST bsp; ++ ULONGEST cfm; ++ ULONGEST natN_val = 0; ++ CORE_ADDR gr_addr = 0, nat_addr = 0; ++ ++ read_memory (cache->saved_regs[IA64_BSP_REGNUM], (char *) &bsp, ++ register_size (current_gdbarch, IA64_BSP_REGNUM)); ++ read_memory (cache->saved_regs[IA64_CFM_REGNUM], (char *) &cfm, ++ register_size (current_gdbarch, IA64_CFM_REGNUM)); ++ ++ /* The bsp points at the end of the register frame so we ++ subtract the size of frame from it to get start of register frame. */ ++ bsp = rse_address_add (bsp, -(cfm & 0x7f)); ++ ++ if ((cfm & 0x7f) > regnum - V32_REGNUM) ++ gr_addr = rse_address_add (bsp, (regnum - V32_REGNUM)); ++ ++ if (gr_addr != 0) ++ { ++ /* Compute address of nat collection bits */ ++ CORE_ADDR nat_collection; ++ nat_addr = gr_addr | 0x1f8; ++ int nat_bit; ++ /* If our nat collection address is bigger than bsp, we have to get ++ the nat collection from rnat. Otherwise, we fetch the nat ++ collection from the computed address. FIXME: Do not know if ++ RNAT can be not stored in the frame--being extra cautious. */ ++ if (nat_addr >= bsp) ++ { ++ nat_addr = cache->saved_regs[IA64_RNAT_REGNUM]; ++ if (nat_addr != 0) ++ read_memory (nat_addr, (char *) &nat_collection, ++ register_size (current_gdbarch, IA64_RNAT_REGNUM)); ++ } ++ else ++ nat_collection = read_memory_integer (nat_addr, 8); ++ if (nat_addr != 0) ++ { ++ nat_bit = (gr_addr >> 3) & 0x3f; ++ natN_val = (nat_collection >> nat_bit) & 1; ++ *lvalp = lval_memory; ++ *addrp = nat_addr; ++ store_unsigned_integer (valuep, ++ register_size (current_gdbarch, regnum), ++ natN_val); ++ } ++ } ++ } ++ else if (regnum == VBOF_REGNUM) ++ { ++ /* BOF pseudo register. ++ * "copied" from ia64_pseudo_register_read() ++ * ++ * A virtual register frame start is provided for user convenience. ++ * It can be calculated as the bsp - sof (sizeof frame). */ ++ ULONGEST bsp; ++ ULONGEST cfm; ++ ULONGEST bof; ++ ++ read_memory (cache->saved_regs[IA64_BSP_REGNUM], (char *) &bsp, ++ register_size (current_gdbarch, IA64_BSP_REGNUM)); ++ read_memory (cache->saved_regs[IA64_CFM_REGNUM], (char *) &cfm, ++ register_size (current_gdbarch, IA64_CFM_REGNUM)); ++ ++ /* The bsp points at the end of the register frame so we ++ subtract the size of frame from it to get beginning of frame. */ ++ bof = rse_address_add (bsp, -(cfm & 0x7f)); ++ ++ store_unsigned_integer (valuep, register_size (current_gdbarch, regnum), bof); ++ *lvalp = lval_memory; ++ *addrp = 0; // NOTE: pseudo reg not a anywhere really... ++ } ++ else if ((regnum >= IA64_GR32_REGNUM && regnum <= IA64_GR127_REGNUM) || + (regnum >= V32_REGNUM && regnum <= V127_REGNUM)) + { + CORE_ADDR addr = 0; +@@ -2051,6 +2144,39 @@ ia64_sigtramp_frame_prev_register (struc + read_memory (addr, valuep, register_size (current_gdbarch, regnum)); + } + } ++ else if (VP0_REGNUM <= regnum && regnum <= VP63_REGNUM) ++ { ++ /* VP 0-63. ++ * "copied" from ia64_pseudo_register_read() ++ * ++ * FIXME: Not currently tested--cannot get the frame to include PR. */ ++ CORE_ADDR pr_addr = 0; ++ ++ pr_addr = cache->saved_regs[IA64_PR_REGNUM]; ++ if (pr_addr != 0) ++ { ++ ULONGEST pr; ++ ULONGEST cfm; ++ ULONGEST prN_val; ++ read_memory (pr_addr, (char *) &pr, ++ register_size (current_gdbarch, IA64_PR_REGNUM)); ++ read_memory (cache->saved_regs[IA64_CFM_REGNUM], (char *) &cfm, ++ register_size (current_gdbarch, IA64_CFM_REGNUM)); ++ ++ /* Get the register rename base for this frame and adjust the ++ * register name to take rotation into account. */ ++ if (VP16_REGNUM <= regnum && regnum <= VP63_REGNUM) ++ { ++ int rrb_pr = (cfm >> 32) & 0x3f; ++ regnum = VP16_REGNUM + ((regnum - VP16_REGNUM) + rrb_pr) % 48; ++ } ++ prN_val = (pr & (1LL << (regnum - VP0_REGNUM))) != 0; ++ store_unsigned_integer (valuep, register_size (current_gdbarch, regnum), ++ prN_val); ++ *lvalp = lval_memory; ++ *addrp = pr_addr; ++ } ++ } + else + { + /* All other registers not listed above. */ diff --git a/gdb.spec b/gdb.spec index 53c2f4e..2f6146a 100644 --- a/gdb.spec +++ b/gdb.spec @@ -11,7 +11,7 @@ Name: gdb Version: 6.3.0.0 # The release always contains a leading reserved number, start it at 0. -Release: 1.34 +Release: 1.37 License: GPL Group: Development/Debuggers @@ -222,6 +222,9 @@ Patch156: gdb-6.3-sarestart-20050518.patch # Security errata for bfd overflow and untrusted .gdbinit Patch157: gdb-6.3-security-errata-20050610.patch +# IA64 sigtramp prev register patch +Patch158: gdb-6.3-ia64-sigtramp-frame-20050708.patch + %ifarch ia64 BuildRequires: ncurses-devel glibc-devel gcc make gzip texinfo dejagnu libunwind >= 0.96-3 %else @@ -311,6 +314,7 @@ and printing their data. %patch155 -p1 %patch156 -p1 %patch157 -p1 +%patch158 -p1 # Change the version that gets printed at GDB startup, so it is RedHat # specific. @@ -479,6 +483,13 @@ fi # don't include the files in include, they are part of binutils %changelog +* Fri Jul 08 2005 Jeff Johnston 6.3.0.0-1.37 +- Bump up release number. + +* Fri Jul 08 2005 Jeff Johnston 6.3.0.0-1.35 +- Build pseudo-registers properly for sigtramp frame. +- Bugzilla 160339 + * Fri Jul 08 2005 Jeff Johnston 6.3.0.0-1.34 - Bump up release number.