[PATCH v2 1/2] arm64: Add macro version of the BTI instruction

Ard Biesheuvel ardb at kernel.org
Tue Dec 7 11:02:16 PST 2021


On Tue, 7 Dec 2021 at 19:02, Mark Brown <broonie at kernel.org> wrote:
>
> BTI is only available from v8.5 so we need to encode it using HINT in
> generic code and for older toolchains. Add an assembler macro written
> by Mark Rutland which lets us use the mnemonic and update the existing
> users.
>
> Suggested-by: Mark Rutland <mark.rutland at arm.com>
> Signed-off-by: Mark Brown <broonie at kernel.org>
> ---
>  arch/arm64/crypto/aes-modes.S      | 10 +++++-----
>  arch/arm64/include/asm/assembler.h | 18 ++++++++++++++++++
>  arch/arm64/include/asm/linkage.h   |  7 +------
>  3 files changed, 24 insertions(+), 11 deletions(-)
>
> diff --git a/arch/arm64/crypto/aes-modes.S b/arch/arm64/crypto/aes-modes.S
> index b495de22bb38..ff01f0167ba2 100644
> --- a/arch/arm64/crypto/aes-modes.S
> +++ b/arch/arm64/crypto/aes-modes.S
> @@ -363,15 +363,15 @@ ST5(      mov             v4.16b, vctr.16b                )
>         adr             x16, 1f
>         sub             x16, x16, x12, lsl #3
>         br              x16
> -       hint            34                      // bti c
> +       bti             c
>         mov             v0.d[0], vctr.d[0]
> -       hint            34                      // bti c
> +       bti             c
>         mov             v1.d[0], vctr.d[0]
> -       hint            34                      // bti c
> +       bti             c
>         mov             v2.d[0], vctr.d[0]
> -       hint            34                      // bti c
> +       bti             c
>         mov             v3.d[0], vctr.d[0]
> -ST5(   hint            34                              )
> +ST5(   bti             c                               )
>  ST5(   mov             v4.d[0], vctr.d[0]              )
>  1:     b               2f
>         .previous
> diff --git a/arch/arm64/include/asm/assembler.h b/arch/arm64/include/asm/assembler.h
> index 136d13f3d6e9..87f296198366 100644
> --- a/arch/arm64/include/asm/assembler.h
> +++ b/arch/arm64/include/asm/assembler.h
> @@ -790,6 +790,24 @@ alternative_endif
>  .Lnoyield_\@:
>         .endm
>
> +/*
> + * Branch Target Identifier (BTI)
> + */
> +       .macro  bti, targets
> +       .equ    .L__bti_targets_c, 1
> +       .equ    .L__bti_targets_j, 2
> +       .equ    .L__bti_targets_jc,3

Can't we make these 34/36/38, respectively, and just do

hint #.Lbti_targets_\targets

here?

> +       .if     .L__bti_targets_\targets == .L__bti_targets_c
> +       hint    #34
> +       .elseif .L__bti_targets_\targets == .L__bti_targets_j
> +       hint    #36
> +       .elseif .L__bti_targets_\targets == .L__bti_targets_jc
> +       hint    #38
> +       .else
> +       .error  "Unsupported BTI targets '\targets\()'"
> +       .endif
> +       .endm
> +
>  /*
>   * This macro emits a program property note section identifying
>   * architecture features which require special handling, mainly for
> diff --git a/arch/arm64/include/asm/linkage.h b/arch/arm64/include/asm/linkage.h
> index 9906541a6861..c5d0c11d7709 100644
> --- a/arch/arm64/include/asm/linkage.h
> +++ b/arch/arm64/include/asm/linkage.h
> @@ -6,12 +6,7 @@
>
>  #if defined(CONFIG_ARM64_BTI_KERNEL) && defined(__aarch64__)
>
> -/*
> - * Since current versions of gas reject the BTI instruction unless we
> - * set the architecture version to v8.5 we use the hint instruction
> - * instead.
> - */
> -#define BTI_C hint 34 ;
> +#define BTI_C bti c ;
>
>  /*
>   * When using in-kernel BTI we need to ensure that PCS-conformant assembly
> --
> 2.30.2
>



More information about the linux-arm-kernel mailing list