blob: f1020a11f4c2bd92fb47769fc2dd79406e0af732 [file] [log] [blame]
// SPDX-License-Identifier: BSD-2-Clause
/*
* Copyright (c) 2017, Linaro Limited
*/
#include <atomic.h>
#include <kernel/mutex.h>
#include <pta_invoke_tests.h>
#include <trace.h>
#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;
}
}