// SPDX-License-Identifier: BSD-2-Clause /* * Copyright (c) 2017, Linaro Limited */ #include #include #include #include #include "misc.h" static uint32_t before_lock_readers; static uint32_t before_lock_writers; static uint32_t during_lock_readers; static uint32_t during_lock_writers; static uint64_t val0; static uint64_t val1; struct mutex test_mutex = MUTEX_INITIALIZER; static TEE_Result mutex_test_writer(TEE_Param params[TEE_NUM_PARAMS]) { size_t n; params[1].value.a = atomic_inc32(&before_lock_writers); mutex_lock(&test_mutex); atomic_dec32(&before_lock_writers); params[1].value.b = atomic_inc32(&during_lock_writers); for (n = 0; n < params[0].value.b; n++) { val0++; val1++; val1++; } atomic_dec32(&during_lock_writers); mutex_unlock(&test_mutex); return TEE_SUCCESS; } static TEE_Result mutex_test_reader(TEE_Param params[TEE_NUM_PARAMS]) { TEE_Result res = TEE_SUCCESS; size_t n; params[1].value.a = atomic_inc32(&before_lock_readers); mutex_read_lock(&test_mutex); atomic_dec32(&before_lock_readers); params[1].value.b = atomic_inc32(&during_lock_readers); for (n = 0; n < params[0].value.b; n++) { if (val0 * 2 != val1) res = TEE_ERROR_BAD_STATE; } atomic_dec32(&during_lock_readers); mutex_read_unlock(&test_mutex); return res; } TEE_Result core_mutex_tests(uint32_t param_types, TEE_Param params[TEE_NUM_PARAMS]) { uint32_t exp_pt = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_VALUE_OUTPUT, TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE); if (exp_pt != param_types) { DMSG("bad parameter types"); return TEE_ERROR_BAD_PARAMETERS; } switch (params[0].value.a) { case PTA_MUTEX_TEST_WRITER: return mutex_test_writer(params); case PTA_MUTEX_TEST_READER: return mutex_test_reader(params); default: return TEE_ERROR_BAD_PARAMETERS; } }