1*963051aaSJerome Forissier // SPDX-License-Identifier: BSD-2-Clause 2*963051aaSJerome Forissier /* 3*963051aaSJerome Forissier * Copyright (c) 2017, Linaro Limited 4*963051aaSJerome Forissier */ 5*963051aaSJerome Forissier 6*963051aaSJerome Forissier #include <atomic.h> 7*963051aaSJerome Forissier #include <kernel/mutex.h> 8*963051aaSJerome Forissier #include <pta_invoke_tests.h> 9*963051aaSJerome Forissier #include <trace.h> 10*963051aaSJerome Forissier 11*963051aaSJerome Forissier #include "misc.h" 12*963051aaSJerome Forissier 13*963051aaSJerome Forissier static uint32_t before_lock_readers; 14*963051aaSJerome Forissier static uint32_t before_lock_writers; 15*963051aaSJerome Forissier static uint32_t during_lock_readers; 16*963051aaSJerome Forissier static uint32_t during_lock_writers; 17*963051aaSJerome Forissier 18*963051aaSJerome Forissier static uint64_t val0; 19*963051aaSJerome Forissier static uint64_t val1; 20*963051aaSJerome Forissier 21*963051aaSJerome Forissier struct mutex test_mutex = MUTEX_INITIALIZER; 22*963051aaSJerome Forissier mutex_test_writer(TEE_Param params[TEE_NUM_PARAMS])23*963051aaSJerome Forissierstatic TEE_Result mutex_test_writer(TEE_Param params[TEE_NUM_PARAMS]) 24*963051aaSJerome Forissier { 25*963051aaSJerome Forissier size_t n; 26*963051aaSJerome Forissier 27*963051aaSJerome Forissier params[1].value.a = atomic_inc32(&before_lock_writers); 28*963051aaSJerome Forissier 29*963051aaSJerome Forissier mutex_lock(&test_mutex); 30*963051aaSJerome Forissier 31*963051aaSJerome Forissier atomic_dec32(&before_lock_writers); 32*963051aaSJerome Forissier 33*963051aaSJerome Forissier params[1].value.b = atomic_inc32(&during_lock_writers); 34*963051aaSJerome Forissier 35*963051aaSJerome Forissier for (n = 0; n < params[0].value.b; n++) { 36*963051aaSJerome Forissier val0++; 37*963051aaSJerome Forissier val1++; 38*963051aaSJerome Forissier val1++; 39*963051aaSJerome Forissier } 40*963051aaSJerome Forissier 41*963051aaSJerome Forissier atomic_dec32(&during_lock_writers); 42*963051aaSJerome Forissier mutex_unlock(&test_mutex); 43*963051aaSJerome Forissier 44*963051aaSJerome Forissier return TEE_SUCCESS; 45*963051aaSJerome Forissier } 46*963051aaSJerome Forissier mutex_test_reader(TEE_Param params[TEE_NUM_PARAMS])47*963051aaSJerome Forissierstatic TEE_Result mutex_test_reader(TEE_Param params[TEE_NUM_PARAMS]) 48*963051aaSJerome Forissier { 49*963051aaSJerome Forissier TEE_Result res = TEE_SUCCESS; 50*963051aaSJerome Forissier size_t n; 51*963051aaSJerome Forissier 52*963051aaSJerome Forissier params[1].value.a = atomic_inc32(&before_lock_readers); 53*963051aaSJerome Forissier 54*963051aaSJerome Forissier mutex_read_lock(&test_mutex); 55*963051aaSJerome Forissier 56*963051aaSJerome Forissier atomic_dec32(&before_lock_readers); 57*963051aaSJerome Forissier 58*963051aaSJerome Forissier params[1].value.b = atomic_inc32(&during_lock_readers); 59*963051aaSJerome Forissier 60*963051aaSJerome Forissier for (n = 0; n < params[0].value.b; n++) { 61*963051aaSJerome Forissier if (val0 * 2 != val1) 62*963051aaSJerome Forissier res = TEE_ERROR_BAD_STATE; 63*963051aaSJerome Forissier } 64*963051aaSJerome Forissier 65*963051aaSJerome Forissier atomic_dec32(&during_lock_readers); 66*963051aaSJerome Forissier mutex_read_unlock(&test_mutex); 67*963051aaSJerome Forissier 68*963051aaSJerome Forissier return res; 69*963051aaSJerome Forissier } 70*963051aaSJerome Forissier core_mutex_tests(uint32_t param_types,TEE_Param params[TEE_NUM_PARAMS])71*963051aaSJerome ForissierTEE_Result core_mutex_tests(uint32_t param_types, 72*963051aaSJerome Forissier TEE_Param params[TEE_NUM_PARAMS]) 73*963051aaSJerome Forissier { 74*963051aaSJerome Forissier uint32_t exp_pt = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT, 75*963051aaSJerome Forissier TEE_PARAM_TYPE_VALUE_OUTPUT, 76*963051aaSJerome Forissier TEE_PARAM_TYPE_NONE, 77*963051aaSJerome Forissier TEE_PARAM_TYPE_NONE); 78*963051aaSJerome Forissier 79*963051aaSJerome Forissier if (exp_pt != param_types) { 80*963051aaSJerome Forissier DMSG("bad parameter types"); 81*963051aaSJerome Forissier return TEE_ERROR_BAD_PARAMETERS; 82*963051aaSJerome Forissier } 83*963051aaSJerome Forissier 84*963051aaSJerome Forissier switch (params[0].value.a) { 85*963051aaSJerome Forissier case PTA_MUTEX_TEST_WRITER: 86*963051aaSJerome Forissier return mutex_test_writer(params); 87*963051aaSJerome Forissier case PTA_MUTEX_TEST_READER: 88*963051aaSJerome Forissier return mutex_test_reader(params); 89*963051aaSJerome Forissier default: 90*963051aaSJerome Forissier return TEE_ERROR_BAD_PARAMETERS; 91*963051aaSJerome Forissier } 92*963051aaSJerome Forissier } 93