|
1 | 1 | /*
|
2 | 2 | * Copyright (c) 2013-2014 Wind River Systems, Inc.
|
3 |
| - * Copyright (c) 2025 STMicroelectronics |
4 | 3 | *
|
5 | 4 | * SPDX-License-Identifier: Apache-2.0
|
6 | 5 | */
|
|
23 | 22 | #include <zephyr/linker/linker-defs.h>
|
24 | 23 | #include <zephyr/cache.h>
|
25 | 24 | #include <zephyr/arch/cache.h>
|
26 |
| -#include <zephyr/arch/arm/cortex_m/scb.h> |
27 |
| - |
28 |
| -/* For historical reasons, in Cortex-M family, CMSIS code calls System Handler Priority |
29 |
| - * register SHP or SHPR. This code defines the name of the register |
30 |
| - * according to the specific Cortex-M variant. |
31 |
| - */ |
32 |
| -#if defined(CONFIG_CPU_CORTEX_M0) || \ |
33 |
| - defined(CONFIG_CPU_CORTEX_M0PLUS) || \ |
34 |
| - defined(CONFIG_CPU_CORTEX_M1) || \ |
35 |
| - defined(CONFIG_CPU_CORTEX_M3) || \ |
36 |
| - defined(CONFIG_CPU_CORTEX_M4) |
37 |
| -#define SHPR_FIELD_NAME SHP |
38 |
| -#else |
39 |
| -#define SHPR_FIELD_NAME SHPR |
40 |
| -#endif |
41 | 25 |
|
42 | 26 | #if defined(CONFIG_CPU_HAS_NXP_SYSMPU)
|
43 | 27 | #include <fsl_sysmpu.h>
|
@@ -167,98 +151,3 @@ void z_arm_init_arch_hw_at_boot(void)
|
167 | 151 | barrier_isync_fence_full();
|
168 | 152 | }
|
169 | 153 | #endif /* CONFIG_INIT_ARCH_HW_AT_BOOT */
|
170 |
| - |
171 |
| -/** |
172 |
| - * @brief Save essential SCB registers into a provided context structure. |
173 |
| - * |
174 |
| - * This function reads the current values of critical System Control Block (SCB) |
175 |
| - * registers that are safe to backup, and stores them into the `context` structure. |
176 |
| - * Access to SCB registers requires atomicity and consistency, so calling code |
177 |
| - * should guarantee that interrupts are disabled. |
178 |
| - * |
179 |
| - * @param context Pointer to an `scb_context` structure where the register |
180 |
| - * values will be stored. Must not be NULL. |
181 |
| - */ |
182 |
| -void z_arm_save_scb_context(struct scb_context *context) |
183 |
| -{ |
184 |
| - __ASSERT_NO_MSG(context != NULL); |
185 |
| - |
186 |
| -#if defined(CONFIG_CPU_CORTEX_M_HAS_VTOR) |
187 |
| - context->vtor = SCB->VTOR; |
188 |
| -#endif |
189 |
| - context->aircr = SCB->AIRCR; |
190 |
| - context->scr = SCB->SCR; |
191 |
| - context->ccr = SCB->CCR; |
192 |
| - |
193 |
| - /* Backup System Handler Priority Registers */ |
194 |
| - volatile uint32_t *shpr = (volatile uint32_t *) SCB->SHPR_FIELD_NAME; |
195 |
| - |
196 |
| - for (int i = 0; i < SHPR_SIZE_W; i++) { |
197 |
| - context->shpr[i] = shpr[i]; |
198 |
| - } |
199 |
| - |
200 |
| - context->shcsr = SCB->SHCSR; |
201 |
| -#if defined(CPACR_PRESENT) |
202 |
| - context->cpacr = SCB->CPACR; |
203 |
| -#endif /* CPACR_PRESENT */ |
204 |
| -} |
205 |
| - |
206 |
| -/** |
207 |
| - * @brief Restores essential SCB registers from a provided context structure. |
208 |
| - * |
209 |
| - * This function writes the values from the `context` structure back to the |
210 |
| - * respective System Control Block (SCB) registers. Access to SCB registers |
211 |
| - * requires atomicity and consistency, so calling code should guarantee that |
212 |
| - * interrupts are disabled. |
213 |
| - * |
214 |
| - * @warning The ICSR register is NOT restored directly due to its volatile nature |
215 |
| - * and presence of read-only status bits and write-only clear/set bits. |
216 |
| - * Direct restoration can lead to undefined behavior or corrupt interrupt state. |
217 |
| - * If specific ICSR bits need to be managed as part of a context, |
218 |
| - * a separate, highly controlled mechanism should be implemented. |
219 |
| - * |
220 |
| - * @param context Pointer to a `scb_context` structure containing the |
221 |
| - * register values to be restored. Must not be NULL. |
222 |
| - */ |
223 |
| -void z_arm_restore_scb_context(const struct scb_context *context) |
224 |
| -{ |
225 |
| - __ASSERT_NO_MSG(context != NULL); |
226 |
| - |
227 |
| -#if defined(CONFIG_CPU_CORTEX_M_HAS_VTOR) |
228 |
| - /* Restore Vector Table Offset Register first if it was modified. */ |
229 |
| - SCB->VTOR = context->vtor; |
230 |
| -#endif |
231 |
| - /* Restore AIRCR: Must write the VECTKEY (0x05FA) along with the desired bits. |
232 |
| - * Ensure only the relevant modifiable bits are restored. |
233 |
| - */ |
234 |
| - SCB->AIRCR = (context->aircr & ~SCB_AIRCR_VECTKEY_Msk) | |
235 |
| - (0x05FAUL << SCB_AIRCR_VECTKEY_Pos); |
236 |
| - |
237 |
| - SCB->SCR = context->scr; |
238 |
| - SCB->CCR = context->ccr; |
239 |
| - |
240 |
| - /* Restore System Handler Priority Registers */ |
241 |
| - volatile uint32_t *shpr = (volatile uint32_t *) SCB->SHPR_FIELD_NAME; |
242 |
| - |
243 |
| - for (int i = 0; i < SHPR_SIZE_W; i++) { |
244 |
| - shpr[i] = context->shpr[i]; |
245 |
| - } |
246 |
| - |
247 |
| - /* Restore SHCSR */ |
248 |
| - SCB->SHCSR = context->shcsr; |
249 |
| - |
250 |
| -#if defined(CPACR_PRESENT) |
251 |
| - /* Restore CPACR */ |
252 |
| - SCB->CPACR = context->cpacr; |
253 |
| -#endif /* CPACR_PRESENT */ |
254 |
| - |
255 |
| - /** |
256 |
| - * Ensure that updates to the SCB are visible by executing a DSB followed by ISB. |
257 |
| - * This sequence is recommended in the M-profile Architecture Reference Manuals: |
258 |
| - * - ARMv6: DDI0419 Issue E - §B2.5 "Barrier support for system correctness" |
259 |
| - * - ARMv7: DDI0403 Issue E.e - §A3.7.3 "Memory barriers" (at end of section) |
260 |
| - * - ARMv8: DDI0553 Version B.Y - §B7.2.16 "Synchronization requirements [...]" |
261 |
| - */ |
262 |
| - __DSB(); |
263 |
| - __ISB(); |
264 |
| -} |
0 commit comments