| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717 |
- /*
- * Copyright (c) 2009-2023 Arm Limited. All rights reserved.
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Licensed under the Apache License, Version 2.0 (the License); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an AS IS BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- /*
- * CMSIS-Core(M) Compiler GCC Header File
- */
- #ifndef __CMSIS_GCC_M_H
- #define __CMSIS_GCC_M_H
- #ifndef __CMSIS_GCC_H
- #error "This file must not be included directly"
- #endif
- #include <arm_acle.h>
- /* ######################### Startup and Lowlevel Init ######################## */
- #ifndef __PROGRAM_START
- /**
- \brief Initializes data and bss sections
- \details This default implementations initialized all data and additional bss
- sections relying on .copy.table and .zero.table specified properly
- in the used linker script.
- */
- __STATIC_FORCEINLINE __NO_RETURN void __cmsis_start(void)
- {
- extern void _start(void) __NO_RETURN;
- typedef struct __copy_table {
- uint32_t const* src;
- uint32_t* dest;
- uint32_t wlen;
- } __copy_table_t;
- typedef struct __zero_table {
- uint32_t* dest;
- uint32_t wlen;
- } __zero_table_t;
- extern const __copy_table_t __copy_table_start__;
- extern const __copy_table_t __copy_table_end__;
- extern const __zero_table_t __zero_table_start__;
- extern const __zero_table_t __zero_table_end__;
- for (__copy_table_t const* pTable = &__copy_table_start__; pTable < &__copy_table_end__; ++pTable) {
- for(uint32_t i=0u; i<pTable->wlen; ++i) {
- pTable->dest[i] = pTable->src[i];
- }
- }
- for (__zero_table_t const* pTable = &__zero_table_start__; pTable < &__zero_table_end__; ++pTable) {
- for(uint32_t i=0u; i<pTable->wlen; ++i) {
- pTable->dest[i] = 0u;
- }
- }
- _start();
- }
- #define __PROGRAM_START __cmsis_start
- #endif
- #ifndef __INITIAL_SP
- #define __INITIAL_SP __StackTop
- #endif
- #ifndef __STACK_LIMIT
- #define __STACK_LIMIT __StackLimit
- #endif
- #ifndef __VECTOR_TABLE
- #define __VECTOR_TABLE __Vectors
- #endif
- #ifndef __VECTOR_TABLE_ATTRIBUTE
- #define __VECTOR_TABLE_ATTRIBUTE __attribute__((used, section(".vectors")))
- #endif
- #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)
- #ifndef __STACK_SEAL
- #define __STACK_SEAL __StackSeal
- #endif
- #ifndef __TZ_STACK_SEAL_SIZE
- #define __TZ_STACK_SEAL_SIZE 8U
- #endif
- #ifndef __TZ_STACK_SEAL_VALUE
- #define __TZ_STACK_SEAL_VALUE 0xFEF5EDA5FEF5EDA5ULL
- #endif
- __STATIC_FORCEINLINE void __TZ_set_STACKSEAL_S (uint32_t* stackTop) {
- *((uint64_t *)stackTop) = __TZ_STACK_SEAL_VALUE;
- }
- #endif
- /* ########################### Core Function Access ########################### */
- /** \ingroup CMSIS_Core_FunctionInterface
- \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions
- @{
- */
- /**
- \brief Get Control Register
- \details Returns the content of the Control Register.
- \return Control Register value
- */
- __STATIC_FORCEINLINE uint32_t __get_CONTROL(void)
- {
- uint32_t result;
- __ASM volatile ("MRS %0, control" : "=r" (result) );
- return (result);
- }
- #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)
- /**
- \brief Get Control Register (non-secure)
- \details Returns the content of the non-secure Control Register when in secure mode.
- \return non-secure Control Register value
- */
- __STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void)
- {
- uint32_t result;
- __ASM volatile ("MRS %0, control_ns" : "=r" (result) );
- return (result);
- }
- #endif
- /**
- \brief Set Control Register
- \details Writes the given value to the Control Register.
- \param [in] control Control Register value to set
- */
- __STATIC_FORCEINLINE void __set_CONTROL(uint32_t control)
- {
- __ASM volatile ("MSR control, %0" : : "r" (control) : "memory");
- __ISB();
- }
- #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)
- /**
- \brief Set Control Register (non-secure)
- \details Writes the given value to the non-secure Control Register when in secure state.
- \param [in] control Control Register value to set
- */
- __STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control)
- {
- __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory");
- __ISB();
- }
- #endif
- /**
- \brief Get IPSR Register
- \details Returns the content of the IPSR Register.
- \return IPSR Register value
- */
- __STATIC_FORCEINLINE uint32_t __get_IPSR(void)
- {
- uint32_t result;
- __ASM volatile ("MRS %0, ipsr" : "=r" (result) );
- return (result);
- }
- /**
- \brief Get APSR Register
- \details Returns the content of the APSR Register.
- \return APSR Register value
- */
- __STATIC_FORCEINLINE uint32_t __get_APSR(void)
- {
- uint32_t result;
- __ASM volatile ("MRS %0, apsr" : "=r" (result) );
- return (result);
- }
- /**
- \brief Get xPSR Register
- \details Returns the content of the xPSR Register.
- \return xPSR Register value
- */
- __STATIC_FORCEINLINE uint32_t __get_xPSR(void)
- {
- uint32_t result;
- __ASM volatile ("MRS %0, xpsr" : "=r" (result) );
- return (result);
- }
- /**
- \brief Get Process Stack Pointer
- \details Returns the current value of the Process Stack Pointer (PSP).
- \return PSP Register value
- */
- __STATIC_FORCEINLINE uint32_t __get_PSP(void)
- {
- uint32_t result;
- __ASM volatile ("MRS %0, psp" : "=r" (result) );
- return (result);
- }
- #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)
- /**
- \brief Get Process Stack Pointer (non-secure)
- \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state.
- \return PSP Register value
- */
- __STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void)
- {
- uint32_t result;
- __ASM volatile ("MRS %0, psp_ns" : "=r" (result) );
- return (result);
- }
- #endif
- /**
- \brief Set Process Stack Pointer
- \details Assigns the given value to the Process Stack Pointer (PSP).
- \param [in] topOfProcStack Process Stack Pointer value to set
- */
- __STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack)
- {
- __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : );
- }
- #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)
- /**
- \brief Set Process Stack Pointer (non-secure)
- \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state.
- \param [in] topOfProcStack Process Stack Pointer value to set
- */
- __STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack)
- {
- __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : );
- }
- #endif
- /**
- \brief Get Main Stack Pointer
- \details Returns the current value of the Main Stack Pointer (MSP).
- \return MSP Register value
- */
- __STATIC_FORCEINLINE uint32_t __get_MSP(void)
- {
- uint32_t result;
- __ASM volatile ("MRS %0, msp" : "=r" (result) );
- return (result);
- }
- #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)
- /**
- \brief Get Main Stack Pointer (non-secure)
- \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state.
- \return MSP Register value
- */
- __STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void)
- {
- uint32_t result;
- __ASM volatile ("MRS %0, msp_ns" : "=r" (result) );
- return (result);
- }
- #endif
- /**
- \brief Set Main Stack Pointer
- \details Assigns the given value to the Main Stack Pointer (MSP).
- \param [in] topOfMainStack Main Stack Pointer value to set
- */
- __STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack)
- {
- __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : );
- }
- #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)
- /**
- \brief Set Main Stack Pointer (non-secure)
- \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state.
- \param [in] topOfMainStack Main Stack Pointer value to set
- */
- __STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack)
- {
- __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : );
- }
- #endif
- #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)
- /**
- \brief Get Stack Pointer (non-secure)
- \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state.
- \return SP Register value
- */
- __STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void)
- {
- uint32_t result;
- __ASM volatile ("MRS %0, sp_ns" : "=r" (result) );
- return (result);
- }
- /**
- \brief Set Stack Pointer (non-secure)
- \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state.
- \param [in] topOfStack Stack Pointer value to set
- */
- __STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack)
- {
- __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : );
- }
- #endif
- /**
- \brief Get Priority Mask
- \details Returns the current state of the priority mask bit from the Priority Mask Register.
- \return Priority Mask value
- */
- __STATIC_FORCEINLINE uint32_t __get_PRIMASK(void)
- {
- uint32_t result;
- __ASM volatile ("MRS %0, primask" : "=r" (result) );
- return (result);
- }
- #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)
- /**
- \brief Get Priority Mask (non-secure)
- \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state.
- \return Priority Mask value
- */
- __STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void)
- {
- uint32_t result;
- __ASM volatile ("MRS %0, primask_ns" : "=r" (result) );
- return (result);
- }
- #endif
- /**
- \brief Set Priority Mask
- \details Assigns the given value to the Priority Mask Register.
- \param [in] priMask Priority Mask
- */
- __STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask)
- {
- __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory");
- }
- #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)
- /**
- \brief Set Priority Mask (non-secure)
- \details Assigns the given value to the non-secure Priority Mask Register when in secure state.
- \param [in] priMask Priority Mask
- */
- __STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask)
- {
- __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory");
- }
- #endif
- #if (__ARM_ARCH_ISA_THUMB >= 2)
- /**
- \brief Get Base Priority
- \details Returns the current value of the Base Priority register.
- \return Base Priority register value
- */
- __STATIC_FORCEINLINE uint32_t __get_BASEPRI(void)
- {
- uint32_t result;
- __ASM volatile ("MRS %0, basepri" : "=r" (result) );
- return (result);
- }
- #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)
- /**
- \brief Get Base Priority (non-secure)
- \details Returns the current value of the non-secure Base Priority register when in secure state.
- \return Base Priority register value
- */
- __STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void)
- {
- uint32_t result;
- __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) );
- return (result);
- }
- #endif
- /**
- \brief Set Base Priority
- \details Assigns the given value to the Base Priority register.
- \param [in] basePri Base Priority value to set
- */
- __STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri)
- {
- __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory");
- }
- #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)
- /**
- \brief Set Base Priority (non-secure)
- \details Assigns the given value to the non-secure Base Priority register when in secure state.
- \param [in] basePri Base Priority value to set
- */
- __STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri)
- {
- __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory");
- }
- #endif
- /**
- \brief Set Base Priority with condition
- \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled,
- or the new value increases the BASEPRI priority level.
- \param [in] basePri Base Priority value to set
- */
- __STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri)
- {
- __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory");
- }
- /**
- \brief Get Fault Mask
- \details Returns the current value of the Fault Mask register.
- \return Fault Mask register value
- */
- __STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void)
- {
- uint32_t result;
- __ASM volatile ("MRS %0, faultmask" : "=r" (result) );
- return (result);
- }
- #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)
- /**
- \brief Get Fault Mask (non-secure)
- \details Returns the current value of the non-secure Fault Mask register when in secure state.
- \return Fault Mask register value
- */
- __STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void)
- {
- uint32_t result;
- __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) );
- return (result);
- }
- #endif
- /**
- \brief Set Fault Mask
- \details Assigns the given value to the Fault Mask register.
- \param [in] faultMask Fault Mask value to set
- */
- __STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask)
- {
- __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory");
- }
- #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)
- /**
- \brief Set Fault Mask (non-secure)
- \details Assigns the given value to the non-secure Fault Mask register when in secure state.
- \param [in] faultMask Fault Mask value to set
- */
- __STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask)
- {
- __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory");
- }
- #endif
- #endif /* (__ARM_ARCH_ISA_THUMB >= 2) */
- #if (__ARM_ARCH >= 8)
- /**
- \brief Get Process Stack Pointer Limit
- Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure
- Stack Pointer Limit register hence zero is returned always in non-secure
- mode.
- \details Returns the current value of the Process Stack Pointer Limit (PSPLIM).
- \return PSPLIM Register value
- */
- __STATIC_FORCEINLINE uint32_t __get_PSPLIM(void)
- {
- #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
- !(defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) && \
- (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3)))
- /* without main extensions, the non-secure PSPLIM is RAZ/WI */
- return (0U);
- #else
- uint32_t result;
- __ASM volatile ("MRS %0, psplim" : "=r" (result) );
- return (result);
- #endif
- }
- #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)
- /**
- \brief Get Process Stack Pointer Limit (non-secure)
- Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure
- Stack Pointer Limit register hence zero is returned always.
- \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state.
- \return PSPLIM Register value
- */
- __STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void)
- {
- #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
- !(defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)))
- /* without main extensions, the non-secure PSPLIM is RAZ/WI */
- return (0U);
- #else
- uint32_t result;
- __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) );
- return (result);
- #endif
- }
- #endif
- /**
- \brief Set Process Stack Pointer Limit
- Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure
- Stack Pointer Limit register hence the write is silently ignored in non-secure
- mode.
- \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM).
- \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set
- */
- __STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit)
- {
- #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
- !(defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) && \
- (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3)))
- /* without main extensions, the non-secure PSPLIM is RAZ/WI */
- (void)ProcStackPtrLimit;
- #else
- __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit));
- #endif
- }
- #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)
- /**
- \brief Set Process Stack Pointer (non-secure)
- Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure
- Stack Pointer Limit register hence the write is silently ignored.
- \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state.
- \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set
- */
- __STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit)
- {
- #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
- !(defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)))
- /* without main extensions, the non-secure PSPLIM is RAZ/WI */
- (void)ProcStackPtrLimit;
- #else
- __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit));
- #endif
- }
- #endif
- /**
- \brief Get Main Stack Pointer Limit
- Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure
- Stack Pointer Limit register hence zero is returned always.
- \details Returns the current value of the Main Stack Pointer Limit (MSPLIM).
- \return MSPLIM Register value
- */
- __STATIC_FORCEINLINE uint32_t __get_MSPLIM(void)
- {
- #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
- !(defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) && \
- (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3)))
- /* without main extensions, the non-secure MSPLIM is RAZ/WI */
- return (0U);
- #else
- uint32_t result;
- __ASM volatile ("MRS %0, msplim" : "=r" (result) );
- return (result);
- #endif
- }
- #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)
- /**
- \brief Get Main Stack Pointer Limit (non-secure)
- Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure
- Stack Pointer Limit register hence zero is returned always.
- \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state.
- \return MSPLIM Register value
- */
- __STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void)
- {
- #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
- !(defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)))
- /* without main extensions, the non-secure MSPLIM is RAZ/WI */
- return (0U);
- #else
- uint32_t result;
- __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) );
- return (result);
- #endif
- }
- #endif
- /**
- \brief Set Main Stack Pointer Limit
- Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure
- Stack Pointer Limit register hence the write is silently ignored.
- \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM).
- \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set
- */
- __STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit)
- {
- #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
- !(defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) && \
- (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3)))
- /* without main extensions, the non-secure MSPLIM is RAZ/WI */
- (void)MainStackPtrLimit;
- #else
- __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit));
- #endif
- }
- #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)
- /**
- \brief Set Main Stack Pointer Limit (non-secure)
- Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure
- Stack Pointer Limit register hence the write is silently ignored.
- \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state.
- \param [in] MainStackPtrLimit Main Stack Pointer value to set
- */
- __STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit)
- {
- #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
- !(defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)))
- /* without main extensions, the non-secure MSPLIM is RAZ/WI */
- (void)MainStackPtrLimit;
- #else
- __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit));
- #endif
- }
- #endif
- #endif /* (__ARM_ARCH >= 8) */
- /*@} end of CMSIS_Core_RegAccFunctions */
- #endif /* __CMSIS_GCC_M_H */
|