gdb/ * arm-tdep.c (thumb2_copy_load_literal): Use register r2 and r3. (thumb2_copy_block_xfer): Set dsc->u.block.xfer_addr. (thumb_process_displaced_32bit_insn): Extract correct value for rn. --- gdb/arm-tdep.c | 23 +++++++++++++---------- 1 files changed, 13 insertions(+), 10 deletions(-) diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c index 67d41d2..6d76999 100644 --- a/gdb/arm-tdep.c +++ b/gdb/arm-tdep.c @@ -6367,21 +6367,23 @@ thumb2_copy_load_literal (struct gdbarch *gdbarch, uint16_t insn1, /* Rewrite instruction LDR Rt imm12 into: - Prepare: tmp[0] <- r0, tmp[1] <- r1, tmp[2] <- r2, r1 <- pc, r2 <- imm12 + Prepare: tmp[0] <- r0, tmp[1] <- r2, tmp[2] <- r3, r2 <- pc, r3 <- imm12 - LDR R0, R1, R2, + LDR R0, R2, R3, - Cleanup: rt <- r0, r0 <- tmp[0], r1 <- tmp[1], r2 <- tmp[2]. */ + Cleanup: rt <- r0, r0 <- tmp[0], r2 <- tmp[1], r3 <- tmp[2]. */ dsc->tmp[0] = displaced_read_reg (regs, dsc, 0); - dsc->tmp[1] = displaced_read_reg (regs, dsc, 1); dsc->tmp[2] = displaced_read_reg (regs, dsc, 2); + dsc->tmp[3] = displaced_read_reg (regs, dsc, 3); pc_val = displaced_read_reg (regs, dsc, ARM_PC_REGNUM); - displaced_write_reg (regs, dsc, 1, pc_val, CANNOT_WRITE_PC); - displaced_write_reg (regs, dsc, 2, imm12, CANNOT_WRITE_PC); + pc_val = pc_val & 0xfffffffc; + + displaced_write_reg (regs, dsc, 2, pc_val, CANNOT_WRITE_PC); + displaced_write_reg (regs, dsc, 3, imm12, CANNOT_WRITE_PC); dsc->rd = rt; @@ -6390,9 +6392,9 @@ thumb2_copy_load_literal (struct gdbarch *gdbarch, uint16_t insn1, dsc->u.ldst.writeback = 0; dsc->u.ldst.restore_r4 = 0; - /* LDR R0, R1, R2 */ - dsc->modinsn[0] = 0xf851; - dsc->modinsn[1] = 0x2; + /* LDR R0, R2, R3 */ + dsc->modinsn[0] = 0xf852; + dsc->modinsn[1] = 0x3; dsc->numinsns = 2; dsc->cleanup = &cleanup_load; @@ -6875,6 +6877,7 @@ thumb2_copy_block_xfer (struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2, dsc->u.block.before = bit (insn1, 8); dsc->u.block.writeback = writeback; dsc->u.block.cond = INST_AL; + dsc->u.block.xfer_addr = displaced_read_reg (regs, dsc, rn); if (load) { @@ -8126,7 +8129,7 @@ thumb_process_displaced_32bit_insn (struct gdbarch *gdbarch, uint16_t insn1, if (bit (insn1, 9)) /* Data processing (plain binary imm). */ { int op = bits (insn1, 4, 8); - int rn = bits (insn1, 0, 4); + int rn = bits (insn1, 0, 3); if ((op == 0 || op == 0xa) && rn == 0xf) err = thumb_copy_pc_relative_32bit (gdbarch, insn1, insn2, regs, dsc); -- 1.7.0.4