From 296cfb88895e35d8bfc5ce43449e65a92d87354d Mon Sep 17 00:00:00 2001 From: Giancarlo Frix Date: Sun, 6 Dec 2020 14:27:52 +0400 Subject: [PATCH] s390: Fix BC instruction breakpoint handling 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 | 5 +++++ gdb/s390-tdep.h | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d8b67c6733b..21115067e58 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2020-12-06 Giancarlo Frix (tiny change) + + PR breakpoints/27009 + * s390-tdep.h (op_bc): Correct BC opcode value. + 2020-12-06 Joel Brobecker * gmp-utils.h (gdb_mpz::safe_export): New private method. diff --git a/gdb/s390-tdep.h b/gdb/s390-tdep.h index c0ea9cf6dc9..fc8918fe77b 100644 --- a/gdb/s390-tdep.h +++ b/gdb/s390-tdep.h @@ -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, -- 2.30.2