[PATCH,V6 0/9] Add experimental SCFI support for aarch64

Indu Bhagat indu.bhagat@oracle.com
Thu Jul 18 08:21:04 GMT 2024


Hi,

This patch series extends GAS support for SCFI to aarch64.

For more details on background, motivation and short notes on design,
please see the link to V1 posting:
https://sourceware.org/pipermail/binutils/2024-April/133557.html

The V6 version addresses the review comments on V5:
  - Use a different constant for invalid DWARF register number in
    tc-aarch64-ginsn.c.  Adjust callers of ginsn_dw2_regnum () to take
    appropriate action if invalid DWARF register number is seen.
  - Other several comments around improving code quality and fixes for
    issues identified during review.  More details in each commit log. 

Link to V5 posting: https://sourceware.org/pipermail/binutils/2024-July/135678.html
The V5 version addressed the review comments on V4:
  - Subclass flags: Fix some mis-classifications.
  - Ginsn creation: Code improvements and bugfixes.
  - Testsuite: added more ops and testcases.
  - Punt on S and W registers.

Link to V4 posting: https://sourceware.org/pipermail/binutils/2024-July/135276.html
The V4 version addressed the review comments on the V3 series:
  - Subclass flags: Add subclass flags for only those iclasses where
    SCFI may need them.  All insns in these iclasses must have a
    non-zero subclass.  All other iclasses must have a zero subclass.
    Enforce these checks on subclass flags in aarch64-gen.c.
  - Include FP/Advanced SIMD registers into the set of callee-saved
    registers: D8-D15.  Ensure both D and Q registers are handled on
    little-endian and big-endian.  Z registers are skipped from handling at
    this time.  Added this to the set of known limitations to be addressed
    in a future patch.
  - Added more testcases. 

Link to V3 posting: https://sourceware.org/pipermail/binutils/2024-June/134842.html
The V3 version addressed the review comments on V2:
  - Use F_LDST_SWAP for lse_atomic ld/st ops.

Link to V2 posting: https://sourceware.org/pipermail/binutils/2024-June/134461.html
The V2 version addressed the review comments on V1:
  - Carve out the ginsn creation functionality for aarch64 in a separate file.
  - Add additional flags in aarch64 insn definition to indicate
    subclasses.

Although self-explanatory, here is the outline of the patches:
  - Patch 1 fixes a bug I ran into while testing the series.
  - Patch 7 is new in V5. 
  - Patch 3 to 6 now specify subclass flags only for instructions where
    SCFI needs further classfication within an iclass.
  - Patch 8 and 9 implement the aarch64 ginsn creation and SCFI
    testsuite respectively.

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.

 - Functions involving save / restore of Z registers are not allowed for
   SCFI.  The SCFI machinery currently issues an error as no ginsns are
   created for such insns (which may may cause incorrectly synthesized
   CFI, hence the error).  Need to address this for little-endian and
   big-endian.

Thanks,

Indu Bhagat (9):
  gas: scfi: make scfi_state_restore_reg function more precise
  include: opcodes: aarch64: define new subclasses
  opcodes: aarch64: add flags to denote subclasses of ldst insns
  opcodes: aarch64: add flags to denote subclasses of arithmetic insns
  opcodes: aarch64: add flags to denote subclasses of uncond branches
  opcodes: aarch64: denote subclasses for insns of iclass dp_2src
  opcodes: aarch64: enforce checks on subclass flags in aarch64-gen.c
  gas: aarch64: add experimental support for SCFI
  gas: aarch64: testsuite: add new tests for SCFI

 gas/config/tc-aarch64-ginsn.c                 | 910 ++++++++++++++++++
 gas/config/tc-aarch64.c                       |  15 +
 gas/config/tc-aarch64.h                       |  21 +
 gas/scfi.c                                    |   9 +-
 gas/testsuite/gas/scfi/README                 |   2 +-
 .../gas/scfi/aarch64/ginsn-arith-1.l          |  40 +
 .../gas/scfi/aarch64/ginsn-arith-1.s          |  19 +
 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 |  89 ++
 gas/testsuite/gas/scfi/aarch64/ginsn-ldst-1.s |  47 +
 gas/testsuite/gas/scfi/aarch64/ginsn-misc-1.l |  47 +
 gas/testsuite/gas/scfi/aarch64/ginsn-misc-1.s |  32 +
 .../gas/scfi/aarch64/scfi-aarch64.exp         |  74 ++
 .../gas/scfi/aarch64/scfi-callee-saved-fp-1.d |  57 ++
 .../gas/scfi/aarch64/scfi-callee-saved-fp-1.l |   2 +
 .../gas/scfi/aarch64/scfi-callee-saved-fp-1.s |  50 +
 .../gas/scfi/aarch64/scfi-callee-saved-fp-2.d |  57 ++
 .../gas/scfi/aarch64/scfi-callee-saved-fp-2.l |   2 +
 .../gas/scfi/aarch64/scfi-callee-saved-fp-2.s |  50 +
 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/testsuite/gas/scfi/aarch64/scfi-cfg-4.d   |  41 +
 gas/testsuite/gas/scfi/aarch64/scfi-cfg-4.l   |   2 +
 gas/testsuite/gas/scfi/aarch64/scfi-cfg-4.s   |  41 +
 .../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-diag-3.l  |   3 +
 gas/testsuite/gas/scfi/aarch64/scfi-diag-3.s  |   8 +
 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/scfi/aarch64/scfi-ldstnap-1.d         |  39 +
 .../gas/scfi/aarch64/scfi-ldstnap-1.l         |   2 +
 .../gas/scfi/aarch64/scfi-ldstnap-1.s         |  30 +
 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 +
 .../gas/scfi/aarch64/scfi-unsupported-2.l     |   2 +
 .../gas/scfi/aarch64/scfi-unsupported-2.s     |   8 +
 include/opcode/aarch64.h                      |  35 +-
 opcodes/aarch64-gen.c                         |  19 +
 opcodes/aarch64-tbl.h                         | 202 ++--
 66 files changed, 2585 insertions(+), 108 deletions(-)
 create mode 100644 gas/config/tc-aarch64-ginsn.c
 create mode 100644 gas/testsuite/gas/scfi/aarch64/ginsn-arith-1.l
 create mode 100644 gas/testsuite/gas/scfi/aarch64/ginsn-arith-1.s
 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-callee-saved-fp-1.d
 create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-callee-saved-fp-1.l
 create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-callee-saved-fp-1.s
 create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-callee-saved-fp-2.d
 create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-callee-saved-fp-2.l
 create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-callee-saved-fp-2.s
 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-cfg-4.d
 create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-cfg-4.l
 create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-cfg-4.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-diag-3.l
 create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-diag-3.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-ldstnap-1.d
 create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-ldstnap-1.l
 create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-ldstnap-1.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
 create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-unsupported-2.l
 create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-unsupported-2.s

-- 
2.43.0



More information about the Binutils mailing list