]> git.sur5r.net Git - freertos/blob - FreeRTOS/Source/portable/GCC/ARM_CM23/secure/secure_port_macros.h
Update version number in readiness for V10.3.0 release. Sync SVN with reviewed releas...
[freertos] / FreeRTOS / Source / portable / GCC / ARM_CM23 / secure / secure_port_macros.h
1 /*\r
2  * FreeRTOS Kernel V10.3.0\r
3  * Copyright (C) 2020 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r
4  *\r
5  * Permission is hereby granted, free of charge, to any person obtaining a copy of\r
6  * this software and associated documentation files (the "Software"), to deal in\r
7  * the Software without restriction, including without limitation the rights to\r
8  * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r
9  * the Software, and to permit persons to whom the Software is furnished to do so,\r
10  * subject to the following conditions:\r
11  *\r
12  * The above copyright notice and this permission notice shall be included in all\r
13  * copies or substantial portions of the Software.\r
14  *\r
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r
17  * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r
18  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
19  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
20  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
21  *\r
22  * http://www.FreeRTOS.org\r
23  * http://aws.amazon.com/freertos\r
24  *\r
25  * 1 tab == 4 spaces!\r
26  */\r
27 \r
28 #ifndef __SECURE_PORT_MACROS_H__\r
29 #define __SECURE_PORT_MACROS_H__\r
30 \r
31 /**\r
32  * @brief Byte alignment requirements.\r
33  */\r
34 #define secureportBYTE_ALIGNMENT                                        8\r
35 #define secureportBYTE_ALIGNMENT_MASK                           ( 0x0007 )\r
36 \r
37 /**\r
38  * @brief Macro to declare a function as non-secure callable.\r
39  */\r
40 #if defined( __IAR_SYSTEMS_ICC__ )\r
41         #define secureportNON_SECURE_CALLABLE                   __cmse_nonsecure_entry __root\r
42 #else\r
43         #define secureportNON_SECURE_CALLABLE                   __attribute__((cmse_nonsecure_entry)) __attribute__((used))\r
44 #endif\r
45 \r
46 /**\r
47  * @brief Set the secure PRIMASK value.\r
48  */\r
49 #define secureportSET_SECURE_PRIMASK( ulPrimaskValue ) \\r
50         __asm volatile ( "msr primask, %0" : : "r" ( ulPrimaskValue ) : "memory" )\r
51 \r
52 /**\r
53  * @brief Set the non-secure PRIMASK value.\r
54  */\r
55 #define secureportSET_NON_SECURE_PRIMASK( ulPrimaskValue ) \\r
56         __asm volatile ( "msr primask_ns, %0" : : "r" ( ulPrimaskValue ) : "memory" )\r
57 \r
58 /**\r
59  * @brief Read the PSP value in the given variable.\r
60  */\r
61 #define secureportREAD_PSP( pucOutCurrentStackPointer ) \\r
62         __asm volatile ( "mrs %0, psp"  : "=r" ( pucOutCurrentStackPointer ) )\r
63 \r
64 /**\r
65  * @brief Set the PSP to the given value.\r
66  */\r
67 #define secureportSET_PSP( pucCurrentStackPointer ) \\r
68         __asm volatile ( "msr psp, %0" : : "r" ( pucCurrentStackPointer ) )\r
69 \r
70 /**\r
71  * @brief Set the PSPLIM to the given value.\r
72  */\r
73 #define secureportSET_PSPLIM( pucStackLimit ) \\r
74         __asm volatile ( "msr psplim, %0" : : "r" ( pucStackLimit ) )\r
75 \r
76 /**\r
77  * @brief Set the NonSecure MSP to the given value.\r
78  */\r
79 #define secureportSET_MSP_NS( pucMainStackPointer ) \\r
80         __asm volatile ( "msr msp_ns, %0" : : "r" ( pucMainStackPointer ) )\r
81 \r
82 /**\r
83  * @brief Set the CONTROL register to the given value.\r
84  */\r
85 #define secureportSET_CONTROL( ulControl ) \\r
86         __asm volatile ( "msr control, %0" : : "r" ( ulControl ) : "memory" )\r
87 \r
88 /**\r
89  * @brief Read the Interrupt Program Status Register (IPSR) value in the given\r
90  * variable.\r
91  */\r
92 #define secureportREAD_IPSR( ulIPSR ) \\r
93         __asm volatile ( "mrs %0, ipsr"  : "=r" ( ulIPSR ) )\r
94 \r
95 /**\r
96  * @brief PRIMASK value to enable interrupts.\r
97  */\r
98 #define secureportPRIMASK_ENABLE_INTERRUPTS_VAL         0\r
99 \r
100 /**\r
101  * @brief PRIMASK value to disable interrupts.\r
102  */\r
103 #define secureportPRIMASK_DISABLE_INTERRUPTS_VAL        1\r
104 \r
105 /**\r
106  * @brief Disable secure interrupts.\r
107  */\r
108 #define secureportDISABLE_SECURE_INTERRUPTS()           secureportSET_SECURE_PRIMASK( secureportPRIMASK_DISABLE_INTERRUPTS_VAL )\r
109 \r
110 /**\r
111  * @brief Disable non-secure interrupts.\r
112  *\r
113  * This effectively disables context switches.\r
114  */\r
115 #define secureportDISABLE_NON_SECURE_INTERRUPTS()       secureportSET_NON_SECURE_PRIMASK( secureportPRIMASK_DISABLE_INTERRUPTS_VAL )\r
116 \r
117 /**\r
118  * @brief Enable non-secure interrupts.\r
119  */\r
120 #define secureportENABLE_NON_SECURE_INTERRUPTS()        secureportSET_NON_SECURE_PRIMASK( secureportPRIMASK_ENABLE_INTERRUPTS_VAL )\r
121 \r
122 /**\r
123  * @brief Assert definition.\r
124  */\r
125 #define secureportASSERT( x )                                           \\r
126         if( ( x ) == 0 )                                                                \\r
127         {                                                                                               \\r
128                 secureportDISABLE_SECURE_INTERRUPTS();          \\r
129                 secureportDISABLE_NON_SECURE_INTERRUPTS();      \\r
130                 for( ;; );                                                                      \\r
131         }\r
132 \r
133 #endif /* __SECURE_PORT_MACROS_H__ */\r