This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [patch] Fix PR tdep/12352: Handle str pc, [Rd, #imm] in displaced stepping


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.



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]