[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