ARM64: PC/IP not saved in signal frame

John Marino freebsdml at marino.st
Wed Feb 8 01:42:40 UTC 2017


On 2/7/2017 13:06, Andrew Turner wrote:
> On Tue, 7 Feb 2017 12:55:51 -0600
> John Marino <freebsdml at marino.st> wrote:
>
>> On 2/7/2017 12:47, John Marino wrote:
>>> Hi guys,
>>> I've been struggling to provide unwind support on the
>>> aarch64-*-freebsd* target of FreeBSD.  The only working example on
>>> this arch is aarch64-linux (attached).  I think I'm 99% done with
>>> the freebsd version (attached) but the last value that needs to be
>>> pass to the _Unwind_FrameState is the program counter offset.
>>>
>>> I know the PC is not register-based on aarch64.  Linux still saves
>>> the value in the signal context, but AFAICT FreeBSD does not.
>>>
>>> Can somebody
>>> A) confirm that the program counter is missing from the saved signal
>>> context
>>> B) confirm that it needs to be added for proper signal frame
>>> unwinding?
>>>
>>> Alternatively, maybe somebody can figure out a solution given the
>>> current freebsd structures, but I'm losing hope on that one. (line
>>> 99)
>>
>> Apparently attachments are stripped out on this mail list.
>> You can see the headers here:
>> https://leaf.dragonflybsd.org/~marino/linux-unwind.h
>> https://leaf.dragonflybsd.org/~marino/freebsd-unwind.h
>
> You want sc->REG_NAME(elr).
>

Hi Andrew,
After changing the .how field to REG_SAVED_OFFSET (from the original
  REG_SAVED_VAL_OFFSET) on the retaddr column, it worked!  I didn't 
expect that though.

Is linux just using a misnomer?  That is, is it referring to the 
Exception Link Register as the PC? I'm just trying to understand what 
happened and how you knew the correct answer. :)

John


More information about the freebsd-arm mailing list