Remote stub for ARM processor
Steven Johnson
sjohnson@neurizon.net
Sun Jun 27 23:50:00 GMT 2004
Modi Banti wrote:
> Hi,
>
> I am trying to buikd a remote stub for an ARM processor Simulator. I
> have couple of problems with this...
>
> 1) When a Simulator arrives at a breakpoint it sends the signal
> SIGTRAP 15 (register number): PC to GDB so the GDB stops and shows the
> instruction at PC but since for ARM processor PC point to current
> instruction + 8, so it shows me a wrong line. I am not sure while
> displaying the line GDB takes into account of Pipiline. I can overcome
> this problem tempararily by sending the signal SIGTRAP 15: PC- 8. so
> it works correctly but I am not sure if this is the correct way of
> doing it.
You have this problem with a simulator or the real ARM. I believe you
have to adjust the PC, to point to the actual line currently being
executed. I am not aware of any pipeline awareness in GDB. This is a
particular quirk of the ARM, and is made worse by Interrupts, where the
LR can have various offsets from the real return address, depending on
the IRQ/branch/Arm/thumb mode in question. So trying to find where you
came from can be problematic (not sure how GDB resolves this when it
does a stack trace?)
EG, LR after a BL = PC+4 in ARM, and PC+2 in thumb. but FIQ LR = PC+4
in both ARM and THUMB, but DABT LR = PC+8 for arm and thumb. I believe
its up to the stub/simulator to deal with this quirk and any problems it
might cause GDB's knowledge of the executing program, by adjusting
accordingly.
>
> 2) In reply to GDBs $s#73 (single step) command i send the same packet
> i.e SIGTRAP 15: PC - 8 . I am not sure if I need to send SIGTRAP or
> some other signal. Here also the 'n' command works prefectly fine with
> normal code but if it is a Function call then instead of stopping at
> next line GDB stops at line after that e. g for following code
> Mutex_lock(&mut);
> ++i;
> ++j;
> if I give 'n' command when GDB is at Mutex_lock(&mut) then it gives
> some series of $s#73 commands and finaly stops at ++j instead of
> stopping at ++i. this happens only in case of function call for normal
> statements it works perfectly fine. Here I am not sure whether SIGTRAP
> is a right signal and secondly sending PC -15 is correct or not ( if i
> send just PC here then insted og going to next instruction GDB steps
> in the function call).
> Can anybody help me with this or tell me which part of code in GDB
> handles this step instruction?
n wont stop on the function call. It should stop on the ++i; the GDB
manual says about "next":
"This is similar to `step', but function calls that appear
within the line of code are executed without stopping. Execution
stops when control reaches a different line of code at the
original stack level that was executing when you gave the `next'
command."
Im pretty sure the signal you send matters not in the reply.
Im sure you meant PC-8?? Maybe this has something to do with LR?
because a function call will use LR? Maybe you need to "adjust" LR as
well, depending on circumstances, otherwise LR wont point to the ++i; it
will point to the ++j; (potentially confusing GDB if it uses it).
Sorry I cant be more helpful or categoric, we (my company) are in the
process of writing a GDB target stub for ARM, id be interested to know
how you fare with this problem.
Steven
>
> Thanks and regards,
> Banti
>
>
>
>
More information about the Gdb
mailing list