From 5ffd2cb722440053267d0db52df8bbd278fd6d91 Mon Sep 17 00:00:00 2001 From: Ulrich Weigand Date: Sun, 26 Nov 2017 17:15:25 +0100 Subject: [PATCH] [spu] Fix single-stepping regression Switching spu_software_single_step to use a regcache instead of a frame: https://sourceware.org/ml/gdb-patches/2016-11/msg00355.html cause a serious regression to SPU single-stepping. There were two separate problems: - SPU_LSLR_REGNUM is a pseudo register, so we must use the "cooked" regcache methods instead of the "raw" ones to access it. - When accessing a branch target register, we must only use the first four bytes of the 16-byte vector register. This was done automatically by the frame routines, but not by the regcache routines. gdb/ChangeLog: 2017-11-26 Ulrich Weigand * spu-tdep.c (spu_software_single_step): Access SPU_LSLR_REGNUM as "cooked" register. Access only first four bytes of branch target registers. --- gdb/ChangeLog | 6 ++++++ gdb/spu-tdep.c | 9 ++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 613a5ae6bb5..6223f0dc2a0 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2017-11-26 Ulrich Weigand + + * spu-tdep.c (spu_software_single_step): Access SPU_LSLR_REGNUM as + "cooked" register. Access only first four bytes of branch target + registers. + 2017-11-25 Sergio Durigan Junior PR gdb/22491 diff --git a/gdb/spu-tdep.c b/gdb/spu-tdep.c index ecdc7fc4397..34a536a2603 100644 --- a/gdb/spu-tdep.c +++ b/gdb/spu-tdep.c @@ -1632,8 +1632,8 @@ spu_software_single_step (struct regcache *regcache) insn = extract_unsigned_integer (buf, 4, byte_order); /* Get local store limit. */ - lslr = regcache_raw_get_unsigned (regcache, SPU_LSLR_REGNUM); - if (!lslr) + if ((regcache_cooked_read_unsigned (regcache, SPU_LSLR_REGNUM, &lslr) + != REG_VALID) || !lslr) lslr = (ULONGEST) -1; /* Next sequential instruction is at PC + 4, except if the current @@ -1653,7 +1653,10 @@ spu_software_single_step (struct regcache *regcache) if (reg == SPU_PC_REGNUM) target += SPUADDR_ADDR (pc); else if (reg != -1) - target += regcache_raw_get_unsigned (regcache, reg) & -4; + { + regcache_raw_read_part (regcache, reg, 0, 4, buf); + target += extract_unsigned_integer (buf, 4, byte_order) & -4; + } target = target & lslr; if (target != next_pc) -- 2.30.2