aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Arnez <arnez@linux.vnet.ibm.com>2014-10-09 11:32:22 +0000
committerUlrich Weigand <ulrich.weigand@de.ibm.com>2014-10-15 17:32:38 +0200
commit8fa0c4f8ed9e520c39132bc62d51a490a17c537f (patch)
treefde84582439d703515edcd607e1302c5abfb45a6
parent3666da817e330c563c261cbe9086f4825f74de42 (diff)
downloadgdb-8fa0c4f8ed9e520c39132bc62d51a490a17c537f.zip
gdb-8fa0c4f8ed9e520c39132bc62d51a490a17c537f.tar.gz
gdb-8fa0c4f8ed9e520c39132bc62d51a490a17c537f.tar.bz2
Remove non-address bits for longjmp resume breakpoint
On 32-bit S390 targets the longjmp target address "naturally" has the most significant bit set. That bit indicates the addressing mode and is not part of the address itself. Thus, in analogy with similar cases (like when computing the caller PC in insert_step_resume_breakpoint_at_caller), this change removes non-address bits from the longjmp target address before using it as a breakpoint address. Note that there are two ways for determining the longjmp target address: via a probe or via a gdbarch method. This change only affects the probe method, because it is assumed that the address returned by the gdbarch method is usable as-is. This change was tested together with a patch that enables longjmp probes in glibc for S/390: https://sourceware.org/ml/libc-alpha/2014-10/msg00277.html gdb/ChangeLog: * gdb/infrun.c (process_event_stop_test): Apply gdbarch_addr_bits_remove to longjmp resume address.
-rw-r--r--gdb/ChangeLog5
-rw-r--r--gdb/infrun.c5
2 files changed, 9 insertions, 1 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 977590a..a43e36e 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,8 @@
+2014-10-15 Andreas Arnez <arnez@linux.vnet.ibm.com>
+
+ * gdb/infrun.c (process_event_stop_test): Apply
+ gdbarch_addr_bits_remove to longjmp resume address.
+
2014-10-15 Pedro Alves <palves@redhat.com>
* regformats/microblaze.dat: Delete file.
diff --git a/gdb/infrun.c b/gdb/infrun.c
index 5536350..6132274 100644
--- a/gdb/infrun.c
+++ b/gdb/infrun.c
@@ -4596,7 +4596,10 @@ process_event_stop_test (struct execution_control_state *ecs)
is the third argument to the probe. */
arg_value = probe_safe_evaluate_at_pc (frame, 2);
if (arg_value)
- jmp_buf_pc = value_as_address (arg_value);
+ {
+ jmp_buf_pc = value_as_address (arg_value);
+ jmp_buf_pc = gdbarch_addr_bits_remove (gdbarch, jmp_buf_pc);
+ }
else if (!gdbarch_get_longjmp_target_p (gdbarch)
|| !gdbarch_get_longjmp_target (gdbarch,
frame, &jmp_buf_pc))