This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [patch] Fix PR tdep/12352: Handle str pc, [Rd, #imm] in displaced stepping
- From: Richard Earnshaw <Richard dot Earnshaw at buzzard dot freeserve dot co dot uk>
- To: Yao Qi <yao at codesourcery dot com>
- Cc: gdb-patches at sourceware dot org, julian at codesourcery dot com
- Date: Sat, 22 Jan 2011 15:07:10 +0000
- Subject: Re: [patch] Fix PR tdep/12352: Handle str pc, [Rd, #imm] in displaced stepping
- References: <4D1A1343.8020204@codesourcery.com>
On 28/12/10 16:41, Yao Qi wrote:
> When I read arm-tdep.c:copy_ldr_str_ldrb_strb, I feel pretty hard to
> understand two lines of code,
>
> dsc->modinsn[0] = 0xe58ff014; /* str pc, [pc, #20]. */
> dsc->modinsn[1] = 0xe59f4010; /* ldr r4, [pc, #16]. */
Hmm, looks like a rather convoluted way of moving the PC into R4.
Julian, I think this patch was yours... can you remember why "MOV R4,
PC" wasn't sufficient?
>
> Shall program get SIGSEGV when executing `str pc, [pc, #20]' during
> displaced stepping? A simple test case confirmed my guess, which is
> included in arm-disp-step.S in this patch.
>
> If it is a bug here, this patch is to address it. These two lines of
> code is to compute the offset of `str pc'. In this patch, we can do
> this in a different way,
>
> str pc, [sp, #-4]
> ldr r4, [sp, #-4]
>
> OK for mainline and 7.2 branch?
>
No, code must not write below the stack -- the value can get corrupted
if an interrupt occurs. (I'm not sure if that's possible in this
specific case as the debugger ought to be in control; but it's bad
practice to violate the ABI in this way).
R.