| /* |
| * Copyright (c) 2019-2020, Arm Limited. All rights reserved. |
| * |
| * SPDX-License-Identifier: MIT |
| * |
| * Permission is hereby granted, free of charge, to any person obtaining a copy of |
| * this software and associated documentation files (the "Software"), to deal in |
| * the Software without restriction, including without limitation the rights to |
| * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of |
| * the Software, and to permit persons to whom the Software is furnished to do so, |
| * subject to the following conditions: |
| * |
| * The above copyright notice and this permission notice shall be included in all |
| * copies or substantial portions of the Software. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS |
| * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR |
| * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER |
| * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
| * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
| * |
| */ |
| |
| /* |
| * This file contains the implementation of APIs which are defined in |
| * os_wrapper/mutex.h by TF-M(tag: TF-Mv1.1). The implementation is based |
| * on FreeRTOS mutex type semaphore. |
| */ |
| |
| #include "os_wrapper/mutex.h" |
| |
| #include "FreeRTOS.h" |
| #include "semphr.h" |
| #include "mpu_wrappers.h" |
| |
| #if( configSUPPORT_STATIC_ALLOCATION == 1 ) |
| /* |
| * In the static allocation, the RAM is required to hold the semaphore's |
| * state. |
| */ |
| StaticSemaphore_t xSecureMutexBuffer; |
| #endif |
| |
| void * os_wrapper_mutex_create( void ) |
| { |
| SemaphoreHandle_t xMutexHandle = NULL; |
| |
| #if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) |
| xMutexHandle = xSemaphoreCreateMutex(); |
| #elif( configSUPPORT_STATIC_ALLOCATION == 1 ) |
| xMutexHandle = xSemaphoreCreateMutexStatic( &xSecureMutexBuffer ); |
| #endif |
| return ( void * ) xMutexHandle; |
| } |
| /*-----------------------------------------------------------*/ |
| |
| uint32_t os_wrapper_mutex_acquire( void * handle, uint32_t timeout ) |
| { |
| BaseType_t xRet; |
| |
| if( ! handle ) |
| return OS_WRAPPER_ERROR; |
| |
| xRet = xSemaphoreTake( ( SemaphoreHandle_t ) handle, |
| ( timeout == OS_WRAPPER_WAIT_FOREVER ) ? |
| portMAX_DELAY : ( TickType_t ) timeout ); |
| |
| if( xRet != pdPASS ) |
| return OS_WRAPPER_ERROR; |
| else |
| return OS_WRAPPER_SUCCESS; |
| } |
| /*-----------------------------------------------------------*/ |
| |
| uint32_t os_wrapper_mutex_release( void * handle ) |
| { |
| BaseType_t xRet; |
| |
| if( !handle ) |
| return OS_WRAPPER_ERROR; |
| |
| xRet = xSemaphoreGive( ( SemaphoreHandle_t ) handle ); |
| |
| if( xRet != pdPASS ) |
| return OS_WRAPPER_ERROR; |
| else |
| return OS_WRAPPER_SUCCESS; |
| } |
| /*-----------------------------------------------------------*/ |
| |
| uint32_t os_wrapper_mutex_delete( void * handle ) |
| { |
| vSemaphoreDelete( ( SemaphoreHandle_t ) handle ); |
| |
| return OS_WRAPPER_SUCCESS; |
| } |
| /*-----------------------------------------------------------*/ |