xref: /arm-trusted-firmware/lib/extensions/pauth/pauth_helpers.S (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
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