xref: /optee_os/core/pta/tests/mutex.c (revision 963051aae2b2c144feed2a82080cab35109de9b8)
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 Forissier static 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 Forissier static 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 Forissier TEE_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