From: Richard Earnshaw Date: Thu, 21 Oct 2021 16:29:41 +0000 (+0100) Subject: arm: add basic mitigation for Cortex-A AES errata X-Git-Tag: upstream/12.2.0~1933 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=bc13384e1956a9bc38b084f82e250743451aae61;p=platform%2Fupstream%2Fgcc.git arm: add basic mitigation for Cortex-A AES errata This patch adds the basic patterns for mitigation of the erratum, but no attempt is made at this point to optimize the results for the cases where the erratum mitigation is not needed. The mitigation is done by guaranteeing that the input operands are fed from a full-width operation by using an identity operation on the input values. gcc/ChangeLog: * config/arm/crypto.md (crypto_): Convert to define_expand. Add mitigation for the Cortex-A AES erratum when enabled. (*crypto__insn): New pattern, based on original crypto_ insn. (aes_op_protect): New pattern. * config/arm/unspecs.md (unspec): Add UNSPEC_AES_PROTECT. --- diff --git a/gcc/config/arm/crypto.md b/gcc/config/arm/crypto.md index 020dfba..fbee182 100644 --- a/gcc/config/arm/crypto.md +++ b/gcc/config/arm/crypto.md @@ -29,7 +29,28 @@ [(set_attr "type" "")] ) -(define_insn "crypto_" +(define_expand "crypto_" + [(set (match_operand: 0 "register_operand" "=w") + (unspec: + [(xor: + (match_operand: 1 "register_operand" "%0") + (match_operand: 2 "register_operand" "w"))] + CRYPTO_AES))] + "TARGET_CRYPTO" +{ + if (fix_aes_erratum_1742098) + { + rtx op1_protect = gen_reg_rtx (V16QImode); + emit_insn (gen_aes_op_protect (op1_protect, operands[1])); + operands[1] = op1_protect; + rtx op2_protect = gen_reg_rtx (V16QImode); + emit_insn (gen_aes_op_protect (op2_protect, operands[2])); + operands[2] = op2_protect; + } + /* Fall through to default expansion. */ +}) + +(define_insn "*crypto__insn" [(set (match_operand: 0 "register_operand" "=w") (unspec: [(xor: @@ -41,6 +62,19 @@ [(set_attr "type" "")] ) +; Mitigate against AES erratum on Cortex-A57 and Cortex-A72 by performing +; a 128-bit operation on an operand producer. This can be eliminated only +; if we know that the operand was produced by a full-width operation. +; V16QImode matches for the AES instructions. +(define_insn "aes_op_protect" + [(set (match_operand:V16QI 0 "register_operand" "=w") + (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "0")] + UNSPEC_AES_PROTECT))] + "TARGET_CRYPTO && fix_aes_erratum_1742098" + "vmov\\t%q0, %q1" + [(set_attr "type" "neon_move_q")] +) + ;; When AESE/AESMC fusion is enabled we really want to keep the two together ;; and enforce the register dependency without scheduling or register ;; allocation messing up the order or introducing moves inbetween. diff --git a/gcc/config/arm/unspecs.md b/gcc/config/arm/unspecs.md index 2782af0..7748e78 100644 --- a/gcc/config/arm/unspecs.md +++ b/gcc/config/arm/unspecs.md @@ -270,6 +270,7 @@ UNSPEC_AESE UNSPEC_AESIMC UNSPEC_AESMC + UNSPEC_AES_PROTECT UNSPEC_SHA1C UNSPEC_SHA1M UNSPEC_SHA1P