]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
s390: Fix BC instruction breakpoint handling
authorGiancarlo Frix <gfrix@rocketsoftware.com>
Sun, 6 Dec 2020 10:27:52 +0000 (14:27 +0400)
committerJoel Brobecker <brobecker@adacore.com>
Sun, 6 Dec 2020 10:27:52 +0000 (14:27 +0400)
This fixes a long-lived bug in the s390 port.

When trying to step over a breakpoint set on a BC (branch on condition)
instruction with displaced stepping on IBM Z, gdb would incorrectly
adjust the pc regardless of whether or not the branch was taken. Since
the branch target is an absolute address, this would cause the inferior
to jump around wildly whenever the branch was taken, either crashing it
or causing it to behave unpredictably.

It turns out that the logic to handle BC instructions correctly was in
the code, but that the enum value representing its opcode has always
been incorrect.

This patch corrects the enum value to the actual opcode, fixing the
stepping problem. The enum value is also used in the prologue analysis
code, so this also fixes a minor bug where more of the prologue would
be read than was necessary.

gdb/ChangeLog:

        PR breakpoints/27009
        * s390-tdep.h (op_bc): Correct BC opcode value.

gdb/ChangeLog
gdb/s390-tdep.h

index d8b67c6733bd9067cf52b2251872e1ea4d536fc8..21115067e58a003fbf6054210f42ae53158d3760 100644 (file)
@@ -1,3 +1,8 @@
+2020-12-06  Giancarlo Frix  <gfrix@rocketsoftware.com>  (tiny change)
+
+       PR breakpoints/27009
+       * s390-tdep.h (op_bc): Correct BC opcode value.
+
 2020-12-06  Joel Brobecker  <brobecker@adacore.com>
 
        * gmp-utils.h (gdb_mpz::safe_export): New private method.
index c0ea9cf6dc934872bed7869b732c04b0ce65bfdd..fc8918fe77ba2c3de77f2efd124674605b93e3b4 100644 (file)
@@ -117,7 +117,7 @@ enum
   op_basr  = 0x0d,
   op_bas   = 0x4d,
   op_bcr   = 0x07,
-  op_bc    = 0x0d,
+  op_bc    = 0x47,
   op_bctr  = 0x06,
   op_bctgr = 0xb946,
   op_bct   = 0x46,