linux/arch/arm64/include/asm/asm_pointer_auth.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef __ASM_ASM_POINTER_AUTH_H
   3#define __ASM_ASM_POINTER_AUTH_H
   4
   5#include <asm/alternative.h>
   6#include <asm/asm-offsets.h>
   7#include <asm/cpufeature.h>
   8#include <asm/sysreg.h>
   9
  10#ifdef CONFIG_ARM64_PTR_AUTH_KERNEL
  11
  12        .macro __ptrauth_keys_install_kernel_nosync tsk, tmp1, tmp2, tmp3
  13        mov     \tmp1, #THREAD_KEYS_KERNEL
  14        add     \tmp1, \tsk, \tmp1
  15        ldp     \tmp2, \tmp3, [\tmp1, #PTRAUTH_KERNEL_KEY_APIA]
  16        msr_s   SYS_APIAKEYLO_EL1, \tmp2
  17        msr_s   SYS_APIAKEYHI_EL1, \tmp3
  18        .endm
  19
  20        .macro ptrauth_keys_install_kernel_nosync tsk, tmp1, tmp2, tmp3
  21alternative_if ARM64_HAS_ADDRESS_AUTH
  22        __ptrauth_keys_install_kernel_nosync \tsk, \tmp1, \tmp2, \tmp3
  23alternative_else_nop_endif
  24        .endm
  25
  26        .macro ptrauth_keys_install_kernel tsk, tmp1, tmp2, tmp3
  27alternative_if ARM64_HAS_ADDRESS_AUTH
  28        __ptrauth_keys_install_kernel_nosync \tsk, \tmp1, \tmp2, \tmp3
  29        isb
  30alternative_else_nop_endif
  31        .endm
  32
  33#else /* CONFIG_ARM64_PTR_AUTH_KERNEL */
  34
  35        .macro __ptrauth_keys_install_kernel_nosync tsk, tmp1, tmp2, tmp3
  36        .endm
  37
  38        .macro ptrauth_keys_install_kernel_nosync tsk, tmp1, tmp2, tmp3
  39        .endm
  40
  41        .macro ptrauth_keys_install_kernel tsk, tmp1, tmp2, tmp3
  42        .endm
  43
  44#endif /* CONFIG_ARM64_PTR_AUTH_KERNEL */
  45
  46#ifdef CONFIG_ARM64_PTR_AUTH
  47/*
  48 * thread.keys_user.ap* as offset exceeds the #imm offset range
  49 * so use the base value of ldp as thread.keys_user and offset as
  50 * thread.keys_user.ap*.
  51 */
  52        .macro __ptrauth_keys_install_user tsk, tmp1, tmp2, tmp3
  53        mov     \tmp1, #THREAD_KEYS_USER
  54        add     \tmp1, \tsk, \tmp1
  55        ldp     \tmp2, \tmp3, [\tmp1, #PTRAUTH_USER_KEY_APIA]
  56        msr_s   SYS_APIAKEYLO_EL1, \tmp2
  57        msr_s   SYS_APIAKEYHI_EL1, \tmp3
  58        .endm
  59
  60        .macro __ptrauth_keys_init_cpu tsk, tmp1, tmp2, tmp3
  61        mrs     \tmp1, id_aa64isar1_el1
  62        ubfx    \tmp1, \tmp1, #ID_AA64ISAR1_APA_SHIFT, #8
  63        cbz     \tmp1, .Lno_addr_auth\@
  64        mov_q   \tmp1, (SCTLR_ELx_ENIA | SCTLR_ELx_ENIB | \
  65                        SCTLR_ELx_ENDA | SCTLR_ELx_ENDB)
  66        mrs     \tmp2, sctlr_el1
  67        orr     \tmp2, \tmp2, \tmp1
  68        msr     sctlr_el1, \tmp2
  69        __ptrauth_keys_install_kernel_nosync \tsk, \tmp1, \tmp2, \tmp3
  70        isb
  71.Lno_addr_auth\@:
  72        .endm
  73
  74        .macro ptrauth_keys_init_cpu tsk, tmp1, tmp2, tmp3
  75alternative_if_not ARM64_HAS_ADDRESS_AUTH
  76        b       .Lno_addr_auth\@
  77alternative_else_nop_endif
  78        __ptrauth_keys_init_cpu \tsk, \tmp1, \tmp2, \tmp3
  79.Lno_addr_auth\@:
  80        .endm
  81
  82#else /* !CONFIG_ARM64_PTR_AUTH */
  83
  84        .macro ptrauth_keys_install_user tsk, tmp1, tmp2, tmp3
  85        .endm
  86
  87#endif /* CONFIG_ARM64_PTR_AUTH */
  88
  89#endif /* __ASM_ASM_POINTER_AUTH_H */
  90