/* * Copyright (c) 2019, Arm Limited. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ #include #include #include .global pauth_init_enable_el1 .global pauth_disable_el1 .global pauth_init_enable_el3 .global pauth_disable_el3 .globl pauth_load_bl31_apiakey .globl pauth_load_bl1_apiakey_enable /* ------------------------------------------------------------- * Program APIAKey_EL1 and enable pointer authentication in EL1 * ------------------------------------------------------------- */ func pauth_init_enable_el1 stp x29, x30, [sp, #-16]! /* Initialize platform key */ bl plat_init_apkey /* Program instruction key A used by the Trusted Firmware */ msr APIAKeyLo_EL1, x0 msr APIAKeyHi_EL1, x1 /* Enable pointer authentication */ mrs x0, sctlr_el1 orr x0, x0, #SCTLR_EnIA_BIT #if ENABLE_BTI /* Enable PAC branch type compatibility */ bic x0, x0, #(SCTLR_BT0_BIT | SCTLR_BT1_BIT) #endif msr sctlr_el1, x0 isb ldp x29, x30, [sp], #16 ret endfunc pauth_init_enable_el1 /* ------------------------------------------------------------- * Disable pointer authentication in EL1 * ------------------------------------------------------------- */ func pauth_disable_el1 mrs x0, sctlr_el1 bic x0, x0, #SCTLR_EnIA_BIT msr sctlr_el1, x0 isb ret endfunc pauth_disable_el1 /* ------------------------------------------------------------- * Program APIAKey_EL1 and enable pointer authentication in EL3 * ------------------------------------------------------------- */ func pauth_init_enable_el3 stp x29, x30, [sp, #-16]! /* Initialize platform key */ bl plat_init_apkey /* Program instruction key A used by the Trusted Firmware */ msr APIAKeyLo_EL1, x0 msr APIAKeyHi_EL1, x1 /* Enable pointer authentication */ mrs x0, sctlr_el3 orr x0, x0, #SCTLR_EnIA_BIT #if ENABLE_BTI /* Enable PAC branch type compatibility */ bic x0, x0, #SCTLR_BT_BIT #endif msr sctlr_el3, x0 isb ldp x29, x30, [sp], #16 ret endfunc pauth_init_enable_el3 /* ------------------------------------------------------------- * Disable pointer authentication in EL3 * ------------------------------------------------------------- */ func pauth_disable_el3 mrs x0, sctlr_el3 bic x0, x0, #SCTLR_EnIA_BIT msr sctlr_el3, x0 isb ret endfunc pauth_disable_el3 /* ------------------------------------------------------------- * The following functions strictly follow the AArch64 PCS * to use x9-x17 (temporary caller-saved registers) to load * the APIAKey_EL1 and enable pointer authentication. * ------------------------------------------------------------- */ func pauth_load_bl31_apiakey /* tpidr_el3 contains the address of cpu_data structure */ mrs x9, tpidr_el3 /* Load apiakey from cpu_data */ ldp x10, x11, [x9, #CPU_DATA_APIAKEY_OFFSET] /* Program instruction key A */ msr APIAKeyLo_EL1, x10 msr APIAKeyHi_EL1, x11 isb ret endfunc pauth_load_bl31_apiakey func pauth_load_bl1_apiakey_enable /* Load instruction key A used by the Trusted Firmware */ adrp x9, bl1_apiakey add x9, x9, :lo12:bl1_apiakey ldp x10, x11, [x9] /* Program instruction key A */ msr APIAKeyLo_EL1, x10 msr APIAKeyHi_EL1, x11 /* Enable pointer authentication */ mrs x9, sctlr_el3 orr x9, x9, #SCTLR_EnIA_BIT #if ENABLE_BTI /* Enable PAC branch type compatibility */ bic x9, x9, #SCTLR_BT_BIT #endif msr sctlr_el3, x9 isb ret endfunc pauth_load_bl1_apiakey_enable