[PATCH 0/2] Add SCFI support for aarch64

Indu Bhagat indu.bhagat@oracle.com
Wed May 1 18:20:45 GMT 2024


Ping.

On 4/11/24 12:44 AM, Indu Bhagat wrote:
> Hello,
> 
> This patch series extends GAS support for SCFI to aarch64.
> 
> Since Binutils 2.42, GAS has experimental support for synthesizing CFI (SCFI)
> for hand-written asm for the x86 backend.  This is invoked via
> --scfi=experimental on the hand-written asm.  SCFI aims to relieve users from
> the overhead of writing and maintaining CFI directives in hand-written asm.
> 
> One of the ways of hardening the SCFI feature in GAS is to extend support to
> another major architecture.  This would also allow exercising SCFI on more
> workloads.
> 
> Background
> -----------
> Some background notes on SCFI are present on the wiki
> https://sourceware.org/binutils/wiki/gas/SCFI.  I will refrain from repeating
> some of that content here for sake of brevity.
> 
> Additionally, the commit log for the first commit which added the support on
> x86 may also be helpful in reviewing this series.
>   - gas: x86: synthesize CFI for hand-written asm
>     c7defc5386cc53a4abbb7c53a924cdac3f16aa33
> 
> For synthesizing (DWARF) CFI, the SCFI machinery requires the programmer
> to adhere to some pre-requisites for their asm:
>     - Hand-written asm block must begin with a .type   foo, %function
> It is highly recommended to, additionally, also ensure that:
>     - Hand-written asm block ends with a .size foo, .-foo
> 
> ginsns, SCFI constraints, etc.
> ------------------------------
> ginsn is an acronym for generic GAS instruction.  This is intended to be
> architecture-neutral abstraction that can be used to convey and keep semantic
> information about machine instructions in an arch-neutral way in GAS.  ginsn
> specification and associated interfaces can be seen in gas/ginsn.c and
> gas/ginsn.h.
> 
> The SCFI algorithm itself is implemented as a couple of passes.  The following
> is a gross over-simplification of the overall process; simplified to hopefully
> aid the review process:
> 
>   - Create the GCFG (control flow graph) of the ginsns.
>   - Process each basic block and make a note of how each instruction changes the
>     SCFI state (CFA, callee-saved registers, RA).  This is done via two passes:
>     forward_flow_scfi_state () and backward_flow_scfi_state ().
>   - Translate SCFI ops to equivalent DWARF CFI ops or directives.
> 
> The above is implemented in gas/scfi.h and gas/scfi.c.  Also see the
> gas/scfidw2gen.h and gas/scfidw2gen.c where SCFI ops are processed to finally
> create the DWARF CFI directives.
> 
> Lastly, I think stating some specifics of SCFI core algorithm itself may be
> helpful for the review process: Basically the SCFI machinery encodes some rules
> specified in the standard ABI calling convention (e.g., set of callee-saved
> registers,  how the return address is managed etc).  Apart from the rules, the
> SCFI machinery employs some heuristics.  Few examples of heuristics:
> 
>     - The base register for CFA tracking may be either REG_SP or REG_FP.
>     - If the base register for CFA tracking is REG_SP, the precise amount of
>       stack usage (and hence, the value of REG_SP) must be known at all times.
>     - If using dynamic stack allocation, the function must switch to
>       FP-based CFA.  This means using instructions like the following (in
>       AMD64) in prologue:
>          pushq   %rbp
>          movq    %rsp, %rbp
>       and analogous instructions in epilogue.  In case of aarch64, this simply
>       means creation of the frame record.
>     - Save and Restore of callee-saved registers must be symmetrical.
>       However, the SCFI machinery at this time only warns if any such
>       asymmetry is seen.
> 
> These heuristics/rules are architecture-independent and are meant to
> employed for all architectures/ABIs using SCFI in the future.
> 
> The SCFI paper published sometime ago
> (https://sourceware.org/pipermail/binutils/2023-September/129558.html) may be a
> useful resource to get additional understanding of the above.
> 
> Known limitations
> -----------------
> These are planned to be worked on in the near future:
> 
>   - The current SCFI machinery does not currently synthesize the PAC-related
>     aarch64-specific CFI directives: .cfi_b_key_frame.  Other opcodes used when
>     pointer authentication is enabled also need to be handled (braa, brab,
>     retaa, etc.).
> 
>   - Supporting the following pattern:
>     mov x16,4266
>     add sp, x16, sp
>     ...
> 
>   - Not a limitation per se, but a note that ATM, that predicated insns are
>     skipped from ginsn translation.  IIUC, these instructions are not such that
>     can be used alongside stack management ops. To be double-checked.
> 
> Thanks,
> 
> Indu Bhagat (2):
>    gas: aarch64: add experimental support for SCFI
>    gas: aarch64: testsuite: add new tests for SCFI
> 
>   gas/config/tc-aarch64.c                       | 744 ++++++++++++++++++
>   gas/config/tc-aarch64.h                       |  20 +
>   gas/testsuite/gas/scfi/README                 |   2 +-
>   gas/testsuite/gas/scfi/aarch64/ginsn-cofi-1.l |  30 +
>   gas/testsuite/gas/scfi/aarch64/ginsn-cofi-1.s |  16 +
>   gas/testsuite/gas/scfi/aarch64/ginsn-ldst-1.l |  40 +
>   gas/testsuite/gas/scfi/aarch64/ginsn-ldst-1.s |  21 +
>   gas/testsuite/gas/scfi/aarch64/ginsn-misc-1.l |  32 +
>   gas/testsuite/gas/scfi/aarch64/ginsn-misc-1.s |  15 +
>   .../gas/scfi/aarch64/scfi-aarch64.exp         |  60 ++
>   gas/testsuite/gas/scfi/aarch64/scfi-cb-1.d    |  20 +
>   gas/testsuite/gas/scfi/aarch64/scfi-cb-1.l    |   2 +
>   gas/testsuite/gas/scfi/aarch64/scfi-cb-1.s    |  14 +
>   gas/testsuite/gas/scfi/aarch64/scfi-cfg-1.d   |  31 +
>   gas/testsuite/gas/scfi/aarch64/scfi-cfg-1.l   |   2 +
>   gas/testsuite/gas/scfi/aarch64/scfi-cfg-1.s   |  46 ++
>   gas/testsuite/gas/scfi/aarch64/scfi-cfg-2.d   |  40 +
>   gas/testsuite/gas/scfi/aarch64/scfi-cfg-2.l   |   2 +
>   gas/testsuite/gas/scfi/aarch64/scfi-cfg-2.s   |  42 +
>   gas/testsuite/gas/scfi/aarch64/scfi-cfg-3.d   |  32 +
>   gas/testsuite/gas/scfi/aarch64/scfi-cfg-3.l   |   2 +
>   gas/testsuite/gas/scfi/aarch64/scfi-cfg-3.s   |  34 +
>   .../gas/scfi/aarch64/scfi-cond-br-1.d         |  20 +
>   .../gas/scfi/aarch64/scfi-cond-br-1.l         |   2 +
>   .../gas/scfi/aarch64/scfi-cond-br-1.s         |  13 +
>   gas/testsuite/gas/scfi/aarch64/scfi-diag-1.l  |   2 +
>   gas/testsuite/gas/scfi/aarch64/scfi-diag-1.s  |   6 +
>   gas/testsuite/gas/scfi/aarch64/scfi-diag-2.l  |   3 +
>   gas/testsuite/gas/scfi/aarch64/scfi-diag-2.s  |  25 +
>   gas/testsuite/gas/scfi/aarch64/scfi-ldrp-1.d  |  59 ++
>   gas/testsuite/gas/scfi/aarch64/scfi-ldrp-1.l  |   2 +
>   gas/testsuite/gas/scfi/aarch64/scfi-ldrp-1.s  |  52 ++
>   gas/testsuite/gas/scfi/aarch64/scfi-ldrp-2.d  |  33 +
>   gas/testsuite/gas/scfi/aarch64/scfi-ldrp-2.l  |   2 +
>   gas/testsuite/gas/scfi/aarch64/scfi-ldrp-2.s  |  26 +
>   gas/testsuite/gas/scfi/aarch64/scfi-strp-1.d  |  39 +
>   gas/testsuite/gas/scfi/aarch64/scfi-strp-1.l  |   2 +
>   gas/testsuite/gas/scfi/aarch64/scfi-strp-1.s  |  37 +
>   gas/testsuite/gas/scfi/aarch64/scfi-strp-2.d  |  35 +
>   gas/testsuite/gas/scfi/aarch64/scfi-strp-2.l  |   2 +
>   gas/testsuite/gas/scfi/aarch64/scfi-strp-2.s  |  30 +
>   .../gas/scfi/aarch64/scfi-unsupported-1.l     |   4 +
>   .../gas/scfi/aarch64/scfi-unsupported-1.s     |  31 +
>   43 files changed, 1671 insertions(+), 1 deletion(-)
>   create mode 100644 gas/testsuite/gas/scfi/aarch64/ginsn-cofi-1.l
>   create mode 100644 gas/testsuite/gas/scfi/aarch64/ginsn-cofi-1.s
>   create mode 100644 gas/testsuite/gas/scfi/aarch64/ginsn-ldst-1.l
>   create mode 100644 gas/testsuite/gas/scfi/aarch64/ginsn-ldst-1.s
>   create mode 100644 gas/testsuite/gas/scfi/aarch64/ginsn-misc-1.l
>   create mode 100644 gas/testsuite/gas/scfi/aarch64/ginsn-misc-1.s
>   create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-aarch64.exp
>   create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-cb-1.d
>   create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-cb-1.l
>   create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-cb-1.s
>   create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-cfg-1.d
>   create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-cfg-1.l
>   create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-cfg-1.s
>   create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-cfg-2.d
>   create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-cfg-2.l
>   create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-cfg-2.s
>   create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-cfg-3.d
>   create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-cfg-3.l
>   create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-cfg-3.s
>   create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-cond-br-1.d
>   create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-cond-br-1.l
>   create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-cond-br-1.s
>   create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-diag-1.l
>   create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-diag-1.s
>   create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-diag-2.l
>   create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-diag-2.s
>   create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-ldrp-1.d
>   create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-ldrp-1.l
>   create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-ldrp-1.s
>   create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-ldrp-2.d
>   create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-ldrp-2.l
>   create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-ldrp-2.s
>   create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-strp-1.d
>   create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-strp-1.l
>   create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-strp-1.s
>   create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-strp-2.d
>   create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-strp-2.l
>   create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-strp-2.s
>   create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-unsupported-1.l
>   create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-unsupported-1.s
> 



More information about the Binutils mailing list