2 * FreeRTOS Kernel <DEVELOPMENT BRANCH>
3 * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
5 * SPDX-License-Identifier: MIT
7 * Permission is hereby granted, free of charge, to any person obtaining a copy of
8 * this software and associated documentation files (the "Software"), to deal in
9 * the Software without restriction, including without limitation the rights to
10 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
11 * the Software, and to permit persons to whom the Software is furnished to do so,
12 * subject to the following conditions:
14 * The above copyright notice and this permission notice shall be included in all
15 * copies or substantial portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
19 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
20 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
21 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24 * https://www.FreeRTOS.org
25 * https://github.com/FreeRTOS
29 #ifndef MPU_WRAPPERS_H
30 #define MPU_WRAPPERS_H
32 /* This file redefines API functions to be called through a wrapper macro, but
33 * only for ports that are using the MPU. */
34 #if ( portUSING_MPU_WRAPPERS == 1 )
36 /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE will be defined when this file is
37 * included from queue.c or task.c to prevent it from having an effect within
39 #ifndef MPU_WRAPPERS_INCLUDED_FROM_API_FILE
42 * Map standard (non MPU) API functions to equivalents that start
43 * "MPU_". This will cause the application code to call the MPU_
44 * version, which wraps the non-MPU version with privilege promoting
45 * then demoting code, so the kernel code always runs will full
49 /* Map standard task.h API functions to the MPU equivalents. */
50 #define vTaskDelay MPU_vTaskDelay
51 #define xTaskDelayUntil MPU_xTaskDelayUntil
52 #define xTaskAbortDelay MPU_xTaskAbortDelay
53 #define uxTaskPriorityGet MPU_uxTaskPriorityGet
54 #define eTaskGetState MPU_eTaskGetState
55 #define vTaskGetInfo MPU_vTaskGetInfo
56 #define vTaskSuspend MPU_vTaskSuspend
57 #define vTaskResume MPU_vTaskResume
58 #define xTaskGetTickCount MPU_xTaskGetTickCount
59 #define uxTaskGetNumberOfTasks MPU_uxTaskGetNumberOfTasks
60 #define uxTaskGetStackHighWaterMark MPU_uxTaskGetStackHighWaterMark
61 #define uxTaskGetStackHighWaterMark2 MPU_uxTaskGetStackHighWaterMark2
62 #define vTaskSetApplicationTaskTag MPU_vTaskSetApplicationTaskTag
63 #define xTaskGetApplicationTaskTag MPU_xTaskGetApplicationTaskTag
64 #define vTaskSetThreadLocalStoragePointer MPU_vTaskSetThreadLocalStoragePointer
65 #define pvTaskGetThreadLocalStoragePointer MPU_pvTaskGetThreadLocalStoragePointer
66 #define xTaskGetIdleTaskHandle MPU_xTaskGetIdleTaskHandle
67 #define uxTaskGetSystemState MPU_uxTaskGetSystemState
68 #define ulTaskGetIdleRunTimeCounter MPU_ulTaskGetIdleRunTimeCounter
69 #define ulTaskGetIdleRunTimePercent MPU_ulTaskGetIdleRunTimePercent
70 #define xTaskGenericNotify MPU_xTaskGenericNotify
71 #define xTaskGenericNotifyWait MPU_xTaskGenericNotifyWait
72 #define ulTaskGenericNotifyTake MPU_ulTaskGenericNotifyTake
73 #define xTaskGenericNotifyStateClear MPU_xTaskGenericNotifyStateClear
74 #define ulTaskGenericNotifyValueClear MPU_ulTaskGenericNotifyValueClear
75 #define vTaskSetTimeOutState MPU_vTaskSetTimeOutState
76 #define xTaskCheckForTimeOut MPU_xTaskCheckForTimeOut
77 #define xTaskGetCurrentTaskHandle MPU_xTaskGetCurrentTaskHandle
78 #define xTaskGetSchedulerState MPU_xTaskGetSchedulerState
80 #if ( configUSE_MPU_WRAPPERS_V1 == 0 )
81 #define ulTaskGetRunTimeCounter MPU_ulTaskGetRunTimeCounter
82 #define ulTaskGetRunTimePercent MPU_ulTaskGetRunTimePercent
83 #endif /* #if ( configUSE_MPU_WRAPPERS_V1 == 0 ) */
85 /* Privileged only wrappers for Task APIs. These are needed so that
86 * the application can use opaque handles maintained in mpu_wrappers.c
87 * with all the APIs. */
88 #define xTaskCreate MPU_xTaskCreate
89 #define xTaskCreateStatic MPU_xTaskCreateStatic
90 #define vTaskDelete MPU_vTaskDelete
91 #define vTaskPrioritySet MPU_vTaskPrioritySet
92 #define xTaskGetHandle MPU_xTaskGetHandle
93 #define xTaskCallApplicationTaskHook MPU_xTaskCallApplicationTaskHook
95 #if ( configUSE_MPU_WRAPPERS_V1 == 0 )
96 #define pcTaskGetName MPU_pcTaskGetName
97 #define xTaskCreateRestricted MPU_xTaskCreateRestricted
98 #define xTaskCreateRestrictedStatic MPU_xTaskCreateRestrictedStatic
99 #define vTaskAllocateMPURegions MPU_vTaskAllocateMPURegions
100 #define xTaskGetStaticBuffers MPU_xTaskGetStaticBuffers
101 #define uxTaskPriorityGetFromISR MPU_uxTaskPriorityGetFromISR
102 #define xTaskResumeFromISR MPU_xTaskResumeFromISR
103 #define xTaskGetApplicationTaskTagFromISR MPU_xTaskGetApplicationTaskTagFromISR
104 #define xTaskGenericNotifyFromISR MPU_xTaskGenericNotifyFromISR
105 #define vTaskGenericNotifyGiveFromISR MPU_vTaskGenericNotifyGiveFromISR
106 #endif /* #if ( configUSE_MPU_WRAPPERS_V1 == 0 ) */
108 /* Map standard queue.h API functions to the MPU equivalents. */
109 #define xQueueGenericSend MPU_xQueueGenericSend
110 #define xQueueReceive MPU_xQueueReceive
111 #define xQueuePeek MPU_xQueuePeek
112 #define xQueueSemaphoreTake MPU_xQueueSemaphoreTake
113 #define uxQueueMessagesWaiting MPU_uxQueueMessagesWaiting
114 #define uxQueueSpacesAvailable MPU_uxQueueSpacesAvailable
115 #define xQueueGetMutexHolder MPU_xQueueGetMutexHolder
116 #define xQueueTakeMutexRecursive MPU_xQueueTakeMutexRecursive
117 #define xQueueGiveMutexRecursive MPU_xQueueGiveMutexRecursive
118 #define xQueueAddToSet MPU_xQueueAddToSet
119 #define xQueueSelectFromSet MPU_xQueueSelectFromSet
121 #if ( configQUEUE_REGISTRY_SIZE > 0 )
122 #define vQueueAddToRegistry MPU_vQueueAddToRegistry
123 #define vQueueUnregisterQueue MPU_vQueueUnregisterQueue
124 #define pcQueueGetName MPU_pcQueueGetName
125 #endif /* #if ( configQUEUE_REGISTRY_SIZE > 0 ) */
127 /* Privileged only wrappers for Queue APIs. These are needed so that
128 * the application can use opaque handles maintained in mpu_wrappers.c
129 * with all the APIs. */
130 #define vQueueDelete MPU_vQueueDelete
131 #define xQueueCreateMutex MPU_xQueueCreateMutex
132 #define xQueueCreateMutexStatic MPU_xQueueCreateMutexStatic
133 #define xQueueCreateCountingSemaphore MPU_xQueueCreateCountingSemaphore
134 #define xQueueCreateCountingSemaphoreStatic MPU_xQueueCreateCountingSemaphoreStatic
135 #define xQueueGenericCreate MPU_xQueueGenericCreate
136 #define xQueueGenericCreateStatic MPU_xQueueGenericCreateStatic
137 #define xQueueGenericReset MPU_xQueueGenericReset
138 #define xQueueCreateSet MPU_xQueueCreateSet
139 #define xQueueRemoveFromSet MPU_xQueueRemoveFromSet
141 #if ( configUSE_MPU_WRAPPERS_V1 == 0 )
142 #define xQueueGenericGetStaticBuffers MPU_xQueueGenericGetStaticBuffers
143 #define xQueueGenericSendFromISR MPU_xQueueGenericSendFromISR
144 #define xQueueGiveFromISR MPU_xQueueGiveFromISR
145 #define xQueuePeekFromISR MPU_xQueuePeekFromISR
146 #define xQueueReceiveFromISR MPU_xQueueReceiveFromISR
147 #define xQueueIsQueueEmptyFromISR MPU_xQueueIsQueueEmptyFromISR
148 #define xQueueIsQueueFullFromISR MPU_xQueueIsQueueFullFromISR
149 #define uxQueueMessagesWaitingFromISR MPU_uxQueueMessagesWaitingFromISR
150 #define xQueueGetMutexHolderFromISR MPU_xQueueGetMutexHolderFromISR
151 #define xQueueSelectFromSetFromISR MPU_xQueueSelectFromSetFromISR
152 #endif /* if ( configUSE_MPU_WRAPPERS_V1 == 0 ) */
154 /* Map standard timer.h API functions to the MPU equivalents. */
155 #define pvTimerGetTimerID MPU_pvTimerGetTimerID
156 #define vTimerSetTimerID MPU_vTimerSetTimerID
157 #define xTimerIsTimerActive MPU_xTimerIsTimerActive
158 #define xTimerGetTimerDaemonTaskHandle MPU_xTimerGetTimerDaemonTaskHandle
159 #define xTimerGenericCommandFromTask MPU_xTimerGenericCommandFromTask
160 #define pcTimerGetName MPU_pcTimerGetName
161 #define vTimerSetReloadMode MPU_vTimerSetReloadMode
162 #define uxTimerGetReloadMode MPU_uxTimerGetReloadMode
163 #define xTimerGetPeriod MPU_xTimerGetPeriod
164 #define xTimerGetExpiryTime MPU_xTimerGetExpiryTime
166 /* Privileged only wrappers for Timer APIs. These are needed so that
167 * the application can use opaque handles maintained in mpu_wrappers.c
168 * with all the APIs. */
169 #if ( configUSE_MPU_WRAPPERS_V1 == 0 )
170 #define xTimerGetReloadMode MPU_xTimerGetReloadMode
171 #define xTimerCreate MPU_xTimerCreate
172 #define xTimerCreateStatic MPU_xTimerCreateStatic
173 #define xTimerGetStaticBuffer MPU_xTimerGetStaticBuffer
174 #define xTimerGenericCommandFromISR MPU_xTimerGenericCommandFromISR
175 #endif /* #if ( configUSE_MPU_WRAPPERS_V1 == 0 ) */
177 /* Map standard event_group.h API functions to the MPU equivalents. */
178 #define xEventGroupWaitBits MPU_xEventGroupWaitBits
179 #define xEventGroupClearBits MPU_xEventGroupClearBits
180 #define xEventGroupSetBits MPU_xEventGroupSetBits
181 #define xEventGroupSync MPU_xEventGroupSync
183 #if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) )
184 #define uxEventGroupGetNumber MPU_uxEventGroupGetNumber
185 #define vEventGroupSetNumber MPU_vEventGroupSetNumber
186 #endif /* #if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
188 /* Privileged only wrappers for Event Group APIs. These are needed so that
189 * the application can use opaque handles maintained in mpu_wrappers.c
190 * with all the APIs. */
191 #define xEventGroupCreate MPU_xEventGroupCreate
192 #define xEventGroupCreateStatic MPU_xEventGroupCreateStatic
193 #define vEventGroupDelete MPU_vEventGroupDelete
195 #if ( configUSE_MPU_WRAPPERS_V1 == 0 )
196 #define xEventGroupGetStaticBuffer MPU_xEventGroupGetStaticBuffer
197 #define xEventGroupClearBitsFromISR MPU_xEventGroupClearBitsFromISR
198 #define xEventGroupSetBitsFromISR MPU_xEventGroupSetBitsFromISR
199 #define xEventGroupGetBitsFromISR MPU_xEventGroupGetBitsFromISR
200 #endif /* #if ( configUSE_MPU_WRAPPERS_V1 == 0 ) */
202 /* Map standard message/stream_buffer.h API functions to the MPU
204 #define xStreamBufferSend MPU_xStreamBufferSend
205 #define xStreamBufferReceive MPU_xStreamBufferReceive
206 #define xStreamBufferIsFull MPU_xStreamBufferIsFull
207 #define xStreamBufferIsEmpty MPU_xStreamBufferIsEmpty
208 #define xStreamBufferSpacesAvailable MPU_xStreamBufferSpacesAvailable
209 #define xStreamBufferBytesAvailable MPU_xStreamBufferBytesAvailable
210 #define xStreamBufferSetTriggerLevel MPU_xStreamBufferSetTriggerLevel
211 #define xStreamBufferNextMessageLengthBytes MPU_xStreamBufferNextMessageLengthBytes
213 /* Privileged only wrappers for Stream Buffer APIs. These are needed so that
214 * the application can use opaque handles maintained in mpu_wrappers.c
215 * with all the APIs. */
217 #define xStreamBufferGenericCreate MPU_xStreamBufferGenericCreate
218 #define xStreamBufferGenericCreateStatic MPU_xStreamBufferGenericCreateStatic
219 #define vStreamBufferDelete MPU_vStreamBufferDelete
220 #define xStreamBufferReset MPU_xStreamBufferReset
222 #if ( configUSE_MPU_WRAPPERS_V1 == 0 )
223 #define xStreamBufferGetStaticBuffers MPU_xStreamBufferGetStaticBuffers
224 #define xStreamBufferSendFromISR MPU_xStreamBufferSendFromISR
225 #define xStreamBufferReceiveFromISR MPU_xStreamBufferReceiveFromISR
226 #define xStreamBufferSendCompletedFromISR MPU_xStreamBufferSendCompletedFromISR
227 #define xStreamBufferReceiveCompletedFromISR MPU_xStreamBufferReceiveCompletedFromISR
228 #endif /* #if ( configUSE_MPU_WRAPPERS_V1 == 0 ) */
230 /* Remove the privileged function macro, but keep the PRIVILEGED_DATA
231 * macro so applications can place data in privileged access sections
232 * (useful when using statically allocated objects). */
233 #define PRIVILEGED_FUNCTION
234 #define PRIVILEGED_DATA __attribute__( ( section( "privileged_data" ) ) )
235 #define FREERTOS_SYSTEM_CALL
237 #else /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */
239 /* Ensure API functions go in the privileged execution section. */
240 #define PRIVILEGED_FUNCTION __attribute__( ( section( "privileged_functions" ) ) )
241 #define PRIVILEGED_DATA __attribute__( ( section( "privileged_data" ) ) )
242 #define FREERTOS_SYSTEM_CALL __attribute__( ( section( "freertos_system_calls" ) ) )
244 #endif /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */
246 #else /* portUSING_MPU_WRAPPERS */
248 #define PRIVILEGED_FUNCTION
249 #define PRIVILEGED_DATA
250 #define FREERTOS_SYSTEM_CALL
252 #endif /* portUSING_MPU_WRAPPERS */
255 #endif /* MPU_WRAPPERS_H */