1*91f16700Schasinglulu/* 2*91f16700Schasinglulu * Copyright (c) 2019, Arm Limited. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu#include <arch.h> 8*91f16700Schasinglulu#include <asm_macros.S> 9*91f16700Schasinglulu#include <lib/el3_runtime/cpu_data.h> 10*91f16700Schasinglulu 11*91f16700Schasinglulu .global pauth_init_enable_el1 12*91f16700Schasinglulu .global pauth_disable_el1 13*91f16700Schasinglulu .global pauth_init_enable_el3 14*91f16700Schasinglulu .global pauth_disable_el3 15*91f16700Schasinglulu .globl pauth_load_bl31_apiakey 16*91f16700Schasinglulu .globl pauth_load_bl1_apiakey_enable 17*91f16700Schasinglulu 18*91f16700Schasinglulu/* ------------------------------------------------------------- 19*91f16700Schasinglulu * Program APIAKey_EL1 and enable pointer authentication in EL1 20*91f16700Schasinglulu * ------------------------------------------------------------- 21*91f16700Schasinglulu */ 22*91f16700Schasinglulufunc pauth_init_enable_el1 23*91f16700Schasinglulu stp x29, x30, [sp, #-16]! 24*91f16700Schasinglulu 25*91f16700Schasinglulu /* Initialize platform key */ 26*91f16700Schasinglulu bl plat_init_apkey 27*91f16700Schasinglulu 28*91f16700Schasinglulu /* Program instruction key A used by the Trusted Firmware */ 29*91f16700Schasinglulu msr APIAKeyLo_EL1, x0 30*91f16700Schasinglulu msr APIAKeyHi_EL1, x1 31*91f16700Schasinglulu 32*91f16700Schasinglulu /* Enable pointer authentication */ 33*91f16700Schasinglulu mrs x0, sctlr_el1 34*91f16700Schasinglulu orr x0, x0, #SCTLR_EnIA_BIT 35*91f16700Schasinglulu 36*91f16700Schasinglulu#if ENABLE_BTI 37*91f16700Schasinglulu /* Enable PAC branch type compatibility */ 38*91f16700Schasinglulu bic x0, x0, #(SCTLR_BT0_BIT | SCTLR_BT1_BIT) 39*91f16700Schasinglulu#endif 40*91f16700Schasinglulu msr sctlr_el1, x0 41*91f16700Schasinglulu isb 42*91f16700Schasinglulu 43*91f16700Schasinglulu ldp x29, x30, [sp], #16 44*91f16700Schasinglulu ret 45*91f16700Schasingluluendfunc pauth_init_enable_el1 46*91f16700Schasinglulu 47*91f16700Schasinglulu/* ------------------------------------------------------------- 48*91f16700Schasinglulu * Disable pointer authentication in EL1 49*91f16700Schasinglulu * ------------------------------------------------------------- 50*91f16700Schasinglulu */ 51*91f16700Schasinglulufunc pauth_disable_el1 52*91f16700Schasinglulu mrs x0, sctlr_el1 53*91f16700Schasinglulu bic x0, x0, #SCTLR_EnIA_BIT 54*91f16700Schasinglulu msr sctlr_el1, x0 55*91f16700Schasinglulu isb 56*91f16700Schasinglulu ret 57*91f16700Schasingluluendfunc pauth_disable_el1 58*91f16700Schasinglulu 59*91f16700Schasinglulu/* ------------------------------------------------------------- 60*91f16700Schasinglulu * Program APIAKey_EL1 and enable pointer authentication in EL3 61*91f16700Schasinglulu * ------------------------------------------------------------- 62*91f16700Schasinglulu */ 63*91f16700Schasinglulufunc pauth_init_enable_el3 64*91f16700Schasinglulu stp x29, x30, [sp, #-16]! 65*91f16700Schasinglulu 66*91f16700Schasinglulu /* Initialize platform key */ 67*91f16700Schasinglulu bl plat_init_apkey 68*91f16700Schasinglulu 69*91f16700Schasinglulu /* Program instruction key A used by the Trusted Firmware */ 70*91f16700Schasinglulu msr APIAKeyLo_EL1, x0 71*91f16700Schasinglulu msr APIAKeyHi_EL1, x1 72*91f16700Schasinglulu 73*91f16700Schasinglulu /* Enable pointer authentication */ 74*91f16700Schasinglulu mrs x0, sctlr_el3 75*91f16700Schasinglulu orr x0, x0, #SCTLR_EnIA_BIT 76*91f16700Schasinglulu 77*91f16700Schasinglulu#if ENABLE_BTI 78*91f16700Schasinglulu /* Enable PAC branch type compatibility */ 79*91f16700Schasinglulu bic x0, x0, #SCTLR_BT_BIT 80*91f16700Schasinglulu#endif 81*91f16700Schasinglulu msr sctlr_el3, x0 82*91f16700Schasinglulu isb 83*91f16700Schasinglulu 84*91f16700Schasinglulu ldp x29, x30, [sp], #16 85*91f16700Schasinglulu ret 86*91f16700Schasingluluendfunc pauth_init_enable_el3 87*91f16700Schasinglulu 88*91f16700Schasinglulu/* ------------------------------------------------------------- 89*91f16700Schasinglulu * Disable pointer authentication in EL3 90*91f16700Schasinglulu * ------------------------------------------------------------- 91*91f16700Schasinglulu */ 92*91f16700Schasinglulufunc pauth_disable_el3 93*91f16700Schasinglulu mrs x0, sctlr_el3 94*91f16700Schasinglulu bic x0, x0, #SCTLR_EnIA_BIT 95*91f16700Schasinglulu msr sctlr_el3, x0 96*91f16700Schasinglulu isb 97*91f16700Schasinglulu ret 98*91f16700Schasingluluendfunc pauth_disable_el3 99*91f16700Schasinglulu 100*91f16700Schasinglulu/* ------------------------------------------------------------- 101*91f16700Schasinglulu * The following functions strictly follow the AArch64 PCS 102*91f16700Schasinglulu * to use x9-x17 (temporary caller-saved registers) to load 103*91f16700Schasinglulu * the APIAKey_EL1 and enable pointer authentication. 104*91f16700Schasinglulu * ------------------------------------------------------------- 105*91f16700Schasinglulu */ 106*91f16700Schasinglulufunc pauth_load_bl31_apiakey 107*91f16700Schasinglulu /* tpidr_el3 contains the address of cpu_data structure */ 108*91f16700Schasinglulu mrs x9, tpidr_el3 109*91f16700Schasinglulu 110*91f16700Schasinglulu /* Load apiakey from cpu_data */ 111*91f16700Schasinglulu ldp x10, x11, [x9, #CPU_DATA_APIAKEY_OFFSET] 112*91f16700Schasinglulu 113*91f16700Schasinglulu /* Program instruction key A */ 114*91f16700Schasinglulu msr APIAKeyLo_EL1, x10 115*91f16700Schasinglulu msr APIAKeyHi_EL1, x11 116*91f16700Schasinglulu isb 117*91f16700Schasinglulu ret 118*91f16700Schasingluluendfunc pauth_load_bl31_apiakey 119*91f16700Schasinglulu 120*91f16700Schasinglulufunc pauth_load_bl1_apiakey_enable 121*91f16700Schasinglulu /* Load instruction key A used by the Trusted Firmware */ 122*91f16700Schasinglulu adrp x9, bl1_apiakey 123*91f16700Schasinglulu add x9, x9, :lo12:bl1_apiakey 124*91f16700Schasinglulu ldp x10, x11, [x9] 125*91f16700Schasinglulu 126*91f16700Schasinglulu /* Program instruction key A */ 127*91f16700Schasinglulu msr APIAKeyLo_EL1, x10 128*91f16700Schasinglulu msr APIAKeyHi_EL1, x11 129*91f16700Schasinglulu 130*91f16700Schasinglulu /* Enable pointer authentication */ 131*91f16700Schasinglulu mrs x9, sctlr_el3 132*91f16700Schasinglulu orr x9, x9, #SCTLR_EnIA_BIT 133*91f16700Schasinglulu 134*91f16700Schasinglulu#if ENABLE_BTI 135*91f16700Schasinglulu /* Enable PAC branch type compatibility */ 136*91f16700Schasinglulu bic x9, x9, #SCTLR_BT_BIT 137*91f16700Schasinglulu#endif 138*91f16700Schasinglulu msr sctlr_el3, x9 139*91f16700Schasinglulu isb 140*91f16700Schasinglulu ret 141*91f16700Schasingluluendfunc pauth_load_bl1_apiakey_enable 142