source: trunk/firmware/FSBL/CubeMX/Drivers/CMSIS/Include/m-profile/armv81m_pac.h

Last change on this file was 16, checked in by Zed, 5 weeks ago
File size: 5.7 KB
Line 
1/*
2 * Copyright (c) 2022 Arm Limited. All rights reserved.
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 *
6 * Licensed under the Apache License, Version 2.0 (the License); you may
7 * not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
14 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 */
18
19/*
20 * CMSIS-Core(M) PAC key functions for Armv8.1-M PAC extension
21 */
22
23#ifndef PAC_ARMV81_H
24#define PAC_ARMV81_H
25
26#if defined ( __ICCARM__ )
27 #pragma system_include /* treat file as system include file for MISRA check */
28#elif defined (__clang__)
29 #pragma clang system_header /* treat file as system include file */
30#endif
31
32/* ################### PAC Key functions ########################### */
33/**
34 \ingroup CMSIS_Core_FunctionInterface
35 \defgroup CMSIS_Core_PacKeyFunctions PAC Key functions
36 \brief Functions that access the PAC keys.
37 @{
38 */
39
40#if (defined (__ARM_FEATURE_PAUTH) && (__ARM_FEATURE_PAUTH == 1))
41
42/**
43 \brief read the PAC key used for privileged mode
44 \details Reads the PAC key stored in the PAC_KEY_P registers.
45 \param [out] pPacKey 128bit PAC key
46 */
47__STATIC_FORCEINLINE void __get_PAC_KEY_P (uint32_t* pPacKey) {
48 __ASM volatile (
49 "mrs r1, pac_key_p_0\n"
50 "str r1,[%0,#0]\n"
51 "mrs r1, pac_key_p_1\n"
52 "str r1,[%0,#4]\n"
53 "mrs r1, pac_key_p_2\n"
54 "str r1,[%0,#8]\n"
55 "mrs r1, pac_key_p_3\n"
56 "str r1,[%0,#12]\n"
57 : : "r" (pPacKey) : "memory", "r1"
58 );
59}
60
61/**
62 \brief write the PAC key used for privileged mode
63 \details writes the given PAC key to the PAC_KEY_P registers.
64 \param [in] pPacKey 128bit PAC key
65 */
66__STATIC_FORCEINLINE void __set_PAC_KEY_P (uint32_t* pPacKey) {
67 __ASM volatile (
68 "ldr r1,[%0,#0]\n"
69 "msr pac_key_p_0, r1\n"
70 "ldr r1,[%0,#4]\n"
71 "msr pac_key_p_1, r1\n"
72 "ldr r1,[%0,#8]\n"
73 "msr pac_key_p_2, r1\n"
74 "ldr r1,[%0,#12]\n"
75 "msr pac_key_p_3, r1\n"
76 : : "r" (pPacKey) : "memory", "r1"
77 );
78}
79
80/**
81 \brief read the PAC key used for unprivileged mode
82 \details Reads the PAC key stored in the PAC_KEY_U registers.
83 \param [out] pPacKey 128bit PAC key
84 */
85__STATIC_FORCEINLINE void __get_PAC_KEY_U (uint32_t* pPacKey) {
86 __ASM volatile (
87 "mrs r1, pac_key_u_0\n"
88 "str r1,[%0,#0]\n"
89 "mrs r1, pac_key_u_1\n"
90 "str r1,[%0,#4]\n"
91 "mrs r1, pac_key_u_2\n"
92 "str r1,[%0,#8]\n"
93 "mrs r1, pac_key_u_3\n"
94 "str r1,[%0,#12]\n"
95 : : "r" (pPacKey) : "memory", "r1"
96 );
97}
98
99/**
100 \brief write the PAC key used for unprivileged mode
101 \details writes the given PAC key to the PAC_KEY_U registers.
102 \param [in] pPacKey 128bit PAC key
103 */
104__STATIC_FORCEINLINE void __set_PAC_KEY_U (uint32_t* pPacKey) {
105 __ASM volatile (
106 "ldr r1,[%0,#0]\n"
107 "msr pac_key_u_0, r1\n"
108 "ldr r1,[%0,#4]\n"
109 "msr pac_key_u_1, r1\n"
110 "ldr r1,[%0,#8]\n"
111 "msr pac_key_u_2, r1\n"
112 "ldr r1,[%0,#12]\n"
113 "msr pac_key_u_3, r1\n"
114 : : "r" (pPacKey) : "memory", "r1"
115 );
116}
117
118#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))
119
120/**
121 \brief read the PAC key used for privileged mode (non-secure)
122 \details Reads the PAC key stored in the non-secure PAC_KEY_P registers when in secure mode.
123 \param [out] pPacKey 128bit PAC key
124 */
125__STATIC_FORCEINLINE void __TZ_get_PAC_KEY_P_NS (uint32_t* pPacKey) {
126 __ASM volatile (
127 "mrs r1, pac_key_p_0_ns\n"
128 "str r1,[%0,#0]\n"
129 "mrs r1, pac_key_p_1_ns\n"
130 "str r1,[%0,#4]\n"
131 "mrs r1, pac_key_p_2_ns\n"
132 "str r1,[%0,#8]\n"
133 "mrs r1, pac_key_p_3_ns\n"
134 "str r1,[%0,#12]\n"
135 : : "r" (pPacKey) : "memory", "r1"
136 );
137}
138
139/**
140 \brief write the PAC key used for privileged mode (non-secure)
141 \details writes the given PAC key to the non-secure PAC_KEY_P registers when in secure mode.
142 \param [in] pPacKey 128bit PAC key
143 */
144__STATIC_FORCEINLINE void __TZ_set_PAC_KEY_P_NS (uint32_t* pPacKey) {
145 __ASM volatile (
146 "ldr r1,[%0,#0]\n"
147 "msr pac_key_p_0_ns, r1\n"
148 "ldr r1,[%0,#4]\n"
149 "msr pac_key_p_1_ns, r1\n"
150 "ldr r1,[%0,#8]\n"
151 "msr pac_key_p_2_ns, r1\n"
152 "ldr r1,[%0,#12]\n"
153 "msr pac_key_p_3_ns, r1\n"
154 : : "r" (pPacKey) : "memory", "r1"
155 );
156}
157
158/**
159 \brief read the PAC key used for unprivileged mode (non-secure)
160 \details Reads the PAC key stored in the non-secure PAC_KEY_U registers when in secure mode.
161 \param [out] pPacKey 128bit PAC key
162 */
163__STATIC_FORCEINLINE void __TZ_get_PAC_KEY_U_NS (uint32_t* pPacKey) {
164 __ASM volatile (
165 "mrs r1, pac_key_u_0_ns\n"
166 "str r1,[%0,#0]\n"
167 "mrs r1, pac_key_u_1_ns\n"
168 "str r1,[%0,#4]\n"
169 "mrs r1, pac_key_u_2_ns\n"
170 "str r1,[%0,#8]\n"
171 "mrs r1, pac_key_u_3_ns\n"
172 "str r1,[%0,#12]\n"
173 : : "r" (pPacKey) : "memory", "r1"
174 );
175}
176
177/**
178 \brief write the PAC key used for unprivileged mode (non-secure)
179 \details writes the given PAC key to the non-secure PAC_KEY_U registers when in secure mode.
180 \param [in] pPacKey 128bit PAC key
181 */
182__STATIC_FORCEINLINE void __TZ_set_PAC_KEY_U_NS (uint32_t* pPacKey) {
183 __ASM volatile (
184 "ldr r1,[%0,#0]\n"
185 "msr pac_key_u_0_ns, r1\n"
186 "ldr r1,[%0,#4]\n"
187 "msr pac_key_u_1_ns, r1\n"
188 "ldr r1,[%0,#8]\n"
189 "msr pac_key_u_2_ns, r1\n"
190 "ldr r1,[%0,#12]\n"
191 "msr pac_key_u_3_ns, r1\n"
192 : : "r" (pPacKey) : "memory", "r1"
193 );
194}
195
196#endif /* (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) */
197
198#endif /* (defined (__ARM_FEATURE_PAUTH) && (__ARM_FEATURE_PAUTH == 1)) */
199
200/*@} end of CMSIS_Core_PacKeyFunctions */
201
202
203#endif /* PAC_ARMV81_H */
Note: See TracBrowser for help on using the repository browser.