* Re: AArch64 calling convention in assembly code
[not found] <CAN8C2CqGq4OUNXq5=ur87nqwVjYF-D6aAcVKGGB1pQT1S0b6Jg@mail.gmail.com>
@ 2018-08-01 13:28 ` Alexander Fedotov
2018-08-01 15:49 ` Richard Earnshaw (lists)
0 siblings, 1 reply; 5+ messages in thread
From: Alexander Fedotov @ 2018-08-01 13:28 UTC (permalink / raw)
To: newlib; +Cc: gdb
>>Pushing LR on the stack resolves a problem
FP of course, not LR.
So the correct code must be like this:
_cpu_init_hook:
stp x29, x30, [sp, #-16]!
mov x29, sp
bl _init_vectors
bl _flat_map
ldp x29, x30, [sp], #16
ret
But still my point is that GDB should catch such an error and do not hang.
Alex
On Tue, Jul 31, 2018 at 9:34 PM, Alexander Fedotov <alfedotov@gmail.com> wrote:
> Hello dear AArch64 maintainers
> Please look into code snippet below from newlib/libgloss/aarch64/rdimon-aem-el3.
>
> Seems to me this code violates AArch64 calling convention and actually
> breaks debugging in GDB. GDB tries to unwind call stack and got
> endless reentrancy...
>
> FUNCTION (_cpu_init_hook):
> sub sp, sp, #16
> str x30, [sp, xzr]
> bl _init_vectors
> bl _flat_map
> ldr x30, [sp, xzr]
> add sp, sp, #16
> ret
>
>
> We have couple of calls there (_init_vectors, _flat_map). If you'll
> try to step into any subroutine you will found that GDB hangs and
> can't step anymore.
>
> Pushing LR on the stack resolves a problem.
>
> So my message is that:
> 1. Current code in _cpu_init_hook is incorrect
> 2. GDB should handle this and do not hang
>
> Alex
--
Best regards,
AF
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: AArch64 calling convention in assembly code
2018-08-01 13:28 ` AArch64 calling convention in assembly code Alexander Fedotov
@ 2018-08-01 15:49 ` Richard Earnshaw (lists)
2018-08-01 15:56 ` Alexander Fedotov
0 siblings, 1 reply; 5+ messages in thread
From: Richard Earnshaw (lists) @ 2018-08-01 15:49 UTC (permalink / raw)
To: Alexander Fedotov, newlib; +Cc: gdb
On 01/08/18 14:28, Alexander Fedotov wrote:
>>> Pushing LR on the stack resolves a problem
> FP of course, not LR.
> So the correct code must be like this:
>
> _cpu_init_hook:
> stp x29, x30, [sp, #-16]!
> mov x29, sp
> bl _init_vectors
> bl _flat_map
> ldp x29, x30, [sp], #16
> ret
>
> But still my point is that GDB should catch such an error and do not hang.
>
> Alex
>
> On Tue, Jul 31, 2018 at 9:34 PM, Alexander Fedotov <alfedotov@gmail.com> wrote:
>> Hello dear AArch64 maintainers
>> Please look into code snippet below from newlib/libgloss/aarch64/rdimon-aem-el3.
>>
>> Seems to me this code violates AArch64 calling convention and actually
>> breaks debugging in GDB. GDB tries to unwind call stack and got
>> endless reentrancy...
>>
>> FUNCTION (_cpu_init_hook):
>> sub sp, sp, #16
>> str x30, [sp, xzr]
>> bl _init_vectors
>> bl _flat_map
>> ldr x30, [sp, xzr]
>> add sp, sp, #16
>> ret
>>
>>
>> We have couple of calls there (_init_vectors, _flat_map). If you'll
>> try to step into any subroutine you will found that GDB hangs and
>> can't step anymore.
>>
>> Pushing LR on the stack resolves a problem.
X30 is LR.
All we really need is a CFI unwind record that GDB can understand.
R.
>>
>> So my message is that:
>> 1. Current code in _cpu_init_hook is incorrect
>> 2. GDB should handle this and do not hang
>>
>> Alex
>
>
>
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: AArch64 calling convention in assembly code
2018-08-01 15:49 ` Richard Earnshaw (lists)
@ 2018-08-01 15:56 ` Alexander Fedotov
2018-08-01 16:19 ` Richard Earnshaw (lists)
0 siblings, 1 reply; 5+ messages in thread
From: Alexander Fedotov @ 2018-08-01 15:56 UTC (permalink / raw)
To: Richard Earnshaw (lists); +Cc: newlib, gdb
Yes, but X29 is not saved in original version. I can understand this
with 'frame-less functions" approach. So this code has a right for a
life.
I suspect that such a problem could happen if user will pass
"-fomit-frame-pointer" option to GCC as well.
>>All we really need is a CFI unwind record that GDB can understand.
For plain assembly code ?
Alex
On Wed, Aug 1, 2018 at 6:48 PM, Richard Earnshaw (lists)
<Richard.Earnshaw@arm.com> wrote:
> On 01/08/18 14:28, Alexander Fedotov wrote:
>>>> Pushing LR on the stack resolves a problem
>> FP of course, not LR.
>> So the correct code must be like this:
>>
>> _cpu_init_hook:
>> stp x29, x30, [sp, #-16]!
>> mov x29, sp
>> bl _init_vectors
>> bl _flat_map
>> ldp x29, x30, [sp], #16
>> ret
>>
>> But still my point is that GDB should catch such an error and do not hang.
>>
>> Alex
>>
>> On Tue, Jul 31, 2018 at 9:34 PM, Alexander Fedotov <alfedotov@gmail.com> wrote:
>>> Hello dear AArch64 maintainers
>>> Please look into code snippet below from newlib/libgloss/aarch64/rdimon-aem-el3.
>>>
>>> Seems to me this code violates AArch64 calling convention and actually
>>> breaks debugging in GDB. GDB tries to unwind call stack and got
>>> endless reentrancy...
>>>
>>> FUNCTION (_cpu_init_hook):
>>> sub sp, sp, #16
>>> str x30, [sp, xzr]
>>> bl _init_vectors
>>> bl _flat_map
>>> ldr x30, [sp, xzr]
>>> add sp, sp, #16
>>> ret
>>>
>>>
>>> We have couple of calls there (_init_vectors, _flat_map). If you'll
>>> try to step into any subroutine you will found that GDB hangs and
>>> can't step anymore.
>>>
>>> Pushing LR on the stack resolves a problem.
>
> X30 is LR.
>
> All we really need is a CFI unwind record that GDB can understand.
>
> R.
>
>>>
>>> So my message is that:
>>> 1. Current code in _cpu_init_hook is incorrect
>>> 2. GDB should handle this and do not hang
>>>
>>> Alex
>>
>>
>>
>
--
Best regards,
AF
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: AArch64 calling convention in assembly code
2018-08-01 15:56 ` Alexander Fedotov
@ 2018-08-01 16:19 ` Richard Earnshaw (lists)
2018-08-01 18:03 ` Jeff Johnston
0 siblings, 1 reply; 5+ messages in thread
From: Richard Earnshaw (lists) @ 2018-08-01 16:19 UTC (permalink / raw)
To: Alexander Fedotov; +Cc: newlib, gdb
[-- Attachment #1: Type: text/plain, Size: 2291 bytes --]
On 01/08/18 16:56, Alexander Fedotov wrote:
> Yes, but X29 is not saved in original version. I can understand this
> with 'frame-less functions" approach. So this code has a right for a
> life.
>
> I suspect that such a problem could happen if user will pass
> "-fomit-frame-pointer" option to GCC as well.
>
>>> All we really need is a CFI unwind record that GDB can understand.
> For plain assembly code ?
>
Yep, see attached. This also simplifies the entry/exit sequences slightly.
* aarch64/cpu-init/rdimon-aem-el3.S (cpu_init_hook): Simplify
entry/exit sequences. Add CFI unwind rules.
R.
> Alex
>
> On Wed, Aug 1, 2018 at 6:48 PM, Richard Earnshaw (lists)
> <Richard.Earnshaw@arm.com> wrote:
>> On 01/08/18 14:28, Alexander Fedotov wrote:
>>>>> Pushing LR on the stack resolves a problem
>>> FP of course, not LR.
>>> So the correct code must be like this:
>>>
>>> _cpu_init_hook:
>>> stp x29, x30, [sp, #-16]!
>>> mov x29, sp
>>> bl _init_vectors
>>> bl _flat_map
>>> ldp x29, x30, [sp], #16
>>> ret
>>>
>>> But still my point is that GDB should catch such an error and do not hang.
>>>
>>> Alex
>>>
>>> On Tue, Jul 31, 2018 at 9:34 PM, Alexander Fedotov <alfedotov@gmail.com> wrote:
>>>> Hello dear AArch64 maintainers
>>>> Please look into code snippet below from newlib/libgloss/aarch64/rdimon-aem-el3.
>>>>
>>>> Seems to me this code violates AArch64 calling convention and actually
>>>> breaks debugging in GDB. GDB tries to unwind call stack and got
>>>> endless reentrancy...
>>>>
>>>> FUNCTION (_cpu_init_hook):
>>>> sub sp, sp, #16
>>>> str x30, [sp, xzr]
>>>> bl _init_vectors
>>>> bl _flat_map
>>>> ldr x30, [sp, xzr]
>>>> add sp, sp, #16
>>>> ret
>>>>
>>>>
>>>> We have couple of calls there (_init_vectors, _flat_map). If you'll
>>>> try to step into any subroutine you will found that GDB hangs and
>>>> can't step anymore.
>>>>
>>>> Pushing LR on the stack resolves a problem.
>>
>> X30 is LR.
>>
>> All we really need is a CFI unwind record that GDB can understand.
>>
>> R.
>>
>>>>
>>>> So my message is that:
>>>> 1. Current code in _cpu_init_hook is incorrect
>>>> 2. GDB should handle this and do not hang
>>>>
>>>> Alex
>>>
>>>
>>>
>>
>
>
>
[-- Attachment #2: rdimon-cfi.patch --]
[-- Type: text/x-diff, Size: 725 bytes --]
diff --git a/libgloss/aarch64/cpu-init/rdimon-aem-el3.S b/libgloss/aarch64/cpu-init/rdimon-aem-el3.S
index 41db8f9..9edbccd 100644
--- a/libgloss/aarch64/cpu-init/rdimon-aem-el3.S
+++ b/libgloss/aarch64/cpu-init/rdimon-aem-el3.S
@@ -157,12 +157,16 @@ ttb:
.align 2
.global FUNCTION (_cpu_init_hook)
.type FUNCTION (_cpu_init_hook), %function
+ .cfi_sections .debug_frame
FUNCTION (_cpu_init_hook):
- sub sp, sp, #16
- str x30, [sp, xzr]
+ .cfi_startproc
+ str x30, [sp, -16]!
+ .cfi_def_cfa_offset 16
+ .cfi_offset 30, -16
bl _init_vectors
bl _flat_map
- ldr x30, [sp, xzr]
- add sp, sp, #16
+ ldr x30, [sp], 16
+ .cfi_restore 30
ret
+ .cfi_endproc
.size FUNCTION (_cpu_init_hook), .-FUNCTION (_cpu_init_hook)
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: AArch64 calling convention in assembly code
2018-08-01 16:19 ` Richard Earnshaw (lists)
@ 2018-08-01 18:03 ` Jeff Johnston
0 siblings, 0 replies; 5+ messages in thread
From: Jeff Johnston @ 2018-08-01 18:03 UTC (permalink / raw)
To: Richard Earnshaw (lists); +Cc: Alexander Fedotov, Newlib, gdb
I have pushed Richard's patch to master.
-- Jeff J.
On Wed, Aug 1, 2018 at 12:19 PM, Richard Earnshaw (lists) <
Richard.Earnshaw@arm.com> wrote:
> On 01/08/18 16:56, Alexander Fedotov wrote:
> > Yes, but X29 is not saved in original version. I can understand this
> > with 'frame-less functions" approach. So this code has a right for a
> > life.
> >
> > I suspect that such a problem could happen if user will pass
> > "-fomit-frame-pointer" option to GCC as well.
> >
> >>> All we really need is a CFI unwind record that GDB can understand.
> > For plain assembly code ?
> >
>
> Yep, see attached. This also simplifies the entry/exit sequences slightly.
>
>
> * aarch64/cpu-init/rdimon-aem-el3.S (cpu_init_hook): Simplify
> entry/exit sequences. Add CFI unwind rules.
>
> R.
>
> > Alex
> >
> > On Wed, Aug 1, 2018 at 6:48 PM, Richard Earnshaw (lists)
> > <Richard.Earnshaw@arm.com> wrote:
> >> On 01/08/18 14:28, Alexander Fedotov wrote:
> >>>>> Pushing LR on the stack resolves a problem
> >>> FP of course, not LR.
> >>> So the correct code must be like this:
> >>>
> >>> _cpu_init_hook:
> >>> stp x29, x30, [sp, #-16]!
> >>> mov x29, sp
> >>> bl _init_vectors
> >>> bl _flat_map
> >>> ldp x29, x30, [sp], #16
> >>> ret
> >>>
> >>> But still my point is that GDB should catch such an error and do not
> hang.
> >>>
> >>> Alex
> >>>
> >>> On Tue, Jul 31, 2018 at 9:34 PM, Alexander Fedotov <
> alfedotov@gmail.com> wrote:
> >>>> Hello dear AArch64 maintainers
> >>>> Please look into code snippet below from newlib/libgloss/aarch64/
> rdimon-aem-el3.
> >>>>
> >>>> Seems to me this code violates AArch64 calling convention and actually
> >>>> breaks debugging in GDB. GDB tries to unwind call stack and got
> >>>> endless reentrancy...
> >>>>
> >>>> FUNCTION (_cpu_init_hook):
> >>>> sub sp, sp, #16
> >>>> str x30, [sp, xzr]
> >>>> bl _init_vectors
> >>>> bl _flat_map
> >>>> ldr x30, [sp, xzr]
> >>>> add sp, sp, #16
> >>>> ret
> >>>>
> >>>>
> >>>> We have couple of calls there (_init_vectors, _flat_map). If you'll
> >>>> try to step into any subroutine you will found that GDB hangs and
> >>>> can't step anymore.
> >>>>
> >>>> Pushing LR on the stack resolves a problem.
> >>
> >> X30 is LR.
> >>
> >> All we really need is a CFI unwind record that GDB can understand.
> >>
> >> R.
> >>
> >>>>
> >>>> So my message is that:
> >>>> 1. Current code in _cpu_init_hook is incorrect
> >>>> 2. GDB should handle this and do not hang
> >>>>
> >>>> Alex
> >>>
> >>>
> >>>
> >>
> >
> >
> >
>
>
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2018-08-01 18:03 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
[not found] <CAN8C2CqGq4OUNXq5=ur87nqwVjYF-D6aAcVKGGB1pQT1S0b6Jg@mail.gmail.com>
2018-08-01 13:28 ` AArch64 calling convention in assembly code Alexander Fedotov
2018-08-01 15:49 ` Richard Earnshaw (lists)
2018-08-01 15:56 ` Alexander Fedotov
2018-08-01 16:19 ` Richard Earnshaw (lists)
2018-08-01 18:03 ` Jeff Johnston
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox