Skip to content

Commit cefe797

Browse files
Revert "arch: arm: cortex_m: Add API for scb save and restore"
This reverts commit a90a47b. This commit was written with CMSIS 5 in mind, where some Cortex-M cores have "SHP" in the SCB_Type, and some have "SHPR". This is not correct as Zephyr is *supposed* to be using CMSIS 6 for Cortex-M... but CI actually picks up CMSIS 5 instead (it includes both with CMSIS 5 taking priority). The end result is that Zephyr's CI builds this happily but it causes build failures on downstream users (e.g., example-application). Revert the commit now, as it is not used yet by anyone. The revised version using only "SHPR" shall be reintroduced once the CI issue has been fixed.
1 parent 6413185 commit cefe797

File tree

2 files changed

+0
-200
lines changed
  • arch/arm/core/cortex_m
  • include/zephyr/arch/arm/cortex_m

2 files changed

+0
-200
lines changed

arch/arm/core/cortex_m/scb.c

Lines changed: 0 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
/*
22
* Copyright (c) 2013-2014 Wind River Systems, Inc.
3-
* Copyright (c) 2025 STMicroelectronics
43
*
54
* SPDX-License-Identifier: Apache-2.0
65
*/
@@ -23,21 +22,6 @@
2322
#include <zephyr/linker/linker-defs.h>
2423
#include <zephyr/cache.h>
2524
#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
4125

4226
#if defined(CONFIG_CPU_HAS_NXP_SYSMPU)
4327
#include <fsl_sysmpu.h>
@@ -167,98 +151,3 @@ void z_arm_init_arch_hw_at_boot(void)
167151
barrier_isync_fence_full();
168152
}
169153
#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-
}

include/zephyr/arch/arm/cortex_m/scb.h

Lines changed: 0 additions & 89 deletions
This file was deleted.

0 commit comments

Comments
 (0)