blob: af06548faf219df03184cf32ca46dfa22751b6f5 [file] [log] [blame]
Etienne Carriere9b7b70d2020-05-16 10:27:23 +02001// SPDX-License-Identifier: GPL-2.0
Pascal Brandc639ac82015-07-02 08:53:34 +02002/*
3 * Copyright (c) 2014, STMicroelectronics International N.V.
Pascal Brandc639ac82015-07-02 08:53:34 +02004 */
5
6#include <stdio.h>
7#include <string.h>
8#include <stdlib.h>
9#include <sys/types.h>
10#include <unistd.h>
11
12#include "xtest_test.h"
13#include "xtest_helpers.h"
Pascal Brandc639ac82015-07-02 08:53:34 +020014#include "tee_api_defines.h"
15#include "tee_client_api.h"
16
17#define OFFSET0 0
18
19#define PARAM_0 0
20#define PARAM_1 1
21#define PARAM_2 2
22#define PARAM_3 3
23
24struct xtest_session {
25 ADBG_Case_t *c;
26 TEEC_Session session;
27 TEEC_Context context;
28};
29
30/* Compares two memories and checks if their length and content is the same */
31#define EXPECT_SHARED_MEM_BUFFER(c, exp_buf, exp_blen, op, param_num, shrm) \
32 do { \
33 if ((exp_buf) == NULL) { \
34 ADBG_EXPECT((c), exp_blen, \
35 (op)->params[(param_num)].memref.size); \
36 } else { \
37 ADBG_EXPECT_COMPARE_POINTER((c), (shrm), ==, \
38 (op)->params[(param_num)].memref.parent); \
39 ADBG_EXPECT_BUFFER((c), (exp_buf), (exp_blen), \
40 (shrm)->buffer, \
41 (op)->params[(param_num)].memref.size); \
42 } \
43 } while (0)
44
45/*
46 * Compares the content of the memory cells in OP with the expected value
47 * contained.
48 */
49#define EXPECT_OP_TMP_MEM_BUFFER(c, exp_buf, exp_blen, op, param_num, buf) \
50 do { \
51 if ((exp_buf) == NULL) { \
52 ADBG_EXPECT((c), exp_blen, \
53 (op)->params[(param_num)].tmpref.size); \
54 } else { \
55 ADBG_EXPECT_COMPARE_POINTER((c), (buf), ==, \
56 (op)->params[(param_num)].tmpref.buffer); \
57 ADBG_EXPECT_BUFFER((c), (exp_buf), (exp_blen), \
58 (buf), \
59 (op)->params[(param_num)].memref.size); \
60 } \
61 } while (0)
62
Pascal Brandc639ac82015-07-02 08:53:34 +020063/* Registers the TEEC_SharedMemory to the TEE. */
64static TEEC_Result RegisterSharedMemory(TEEC_Context *ctx,
Jerome Forissierde0c4432017-05-23 11:38:08 +020065 TEEC_SharedMemory *shm, size_t size,
Pascal Brandc639ac82015-07-02 08:53:34 +020066 uint32_t flags)
67{
68 shm->flags = flags;
69 shm->size = size;
70 return TEEC_RegisterSharedMemory(ctx, shm);
71}
72
73/* Allocates shared memory inside of the TEE. */
74static TEEC_Result AllocateSharedMemory(TEEC_Context *ctx,
Jerome Forissierde0c4432017-05-23 11:38:08 +020075 TEEC_SharedMemory *shm, size_t size,
Pascal Brandc639ac82015-07-02 08:53:34 +020076 uint32_t flags)
77{
78 shm->flags = flags;
79 shm->size = size;
80 return TEEC_AllocateSharedMemory(ctx, shm);
81}
82
83static void CloseSession_null(struct xtest_session *cs)
84{
85 Do_ADBG_BeginSubCase(cs->c, "CloseSession_null");
86 {
87 /* In reality doesn't test anything. */
88 TEEC_CloseSession(NULL);
89 }
90 Do_ADBG_EndSubCase(cs->c, "CloseSession_null");
91}
92
93static void Allocate_In(struct xtest_session *cs)
94{
95 Do_ADBG_BeginSubCase(cs->c, "Allocate_In");
96 {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010097 TEEC_SharedMemory shm = { };
Jerome Forissierde0c4432017-05-23 11:38:08 +020098 size_t size = 1024;
Pascal Brandc639ac82015-07-02 08:53:34 +020099
Jens Wiklander72c55452016-10-27 20:44:35 +0200100 if (!ADBG_EXPECT(cs->c, TEEC_SUCCESS,
Etienne Carriereb11820c2020-05-26 11:55:33 +0200101 TEEC_InitializeContext(xtest_tee_name, &cs->context)))
Jens Wiklander72c55452016-10-27 20:44:35 +0200102 goto out;
103
104 if (!ADBG_EXPECT_TEEC_SUCCESS(cs->c,
Pascal Brandc639ac82015-07-02 08:53:34 +0200105 AllocateSharedMemory(&cs->context, &shm, size,
Jens Wiklander72c55452016-10-27 20:44:35 +0200106 TEEC_MEM_INPUT)))
107 goto out_final;
108
Pascal Brandc639ac82015-07-02 08:53:34 +0200109 TEEC_ReleaseSharedMemory(&shm);
Jens Wiklander72c55452016-10-27 20:44:35 +0200110out_final:
Pascal Brandc639ac82015-07-02 08:53:34 +0200111 TEEC_FinalizeContext(&cs->context);
112 }
Jens Wiklander72c55452016-10-27 20:44:35 +0200113out:
Pascal Brandc639ac82015-07-02 08:53:34 +0200114 Do_ADBG_EndSubCase(cs->c, "Allocate_In");
115}
116
117static void Allocate_out_of_memory(struct xtest_session *cs)
118{
119 Do_ADBG_BeginSubCase(cs->c, "Allocate_out_of_memory");
120 {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100121 TEEC_SharedMemory shm = { };
Jerome Forissierde0c4432017-05-23 11:38:08 +0200122 size_t SIZE_OVER_MEMORY_CAPACITY = SIZE_MAX;
Pascal Brandc639ac82015-07-02 08:53:34 +0200123
Jens Wiklander72c55452016-10-27 20:44:35 +0200124 if (!ADBG_EXPECT(cs->c, TEEC_SUCCESS,
Etienne Carriereb11820c2020-05-26 11:55:33 +0200125 TEEC_InitializeContext(xtest_tee_name, &cs->context)))
Jens Wiklander72c55452016-10-27 20:44:35 +0200126 goto out;
127
Pascal Brandc639ac82015-07-02 08:53:34 +0200128 ADBG_EXPECT_TEEC_RESULT(cs->c, TEEC_ERROR_OUT_OF_MEMORY,
129 AllocateSharedMemory(&cs->context, &shm,
130 SIZE_OVER_MEMORY_CAPACITY,
131 TEEC_MEM_INPUT));
Pascal Brandc639ac82015-07-02 08:53:34 +0200132 TEEC_FinalizeContext(&cs->context);
133 }
Jens Wiklander72c55452016-10-27 20:44:35 +0200134out:
Pascal Brandc639ac82015-07-02 08:53:34 +0200135 Do_ADBG_EndSubCase(cs->c, "Allocate_out_of_memory");
136}
137
138static void OpenSession_error_notExistingTA(struct xtest_session *cs)
139{
140 Do_ADBG_BeginSubCase(cs->c, "OpenSession_error_notExistingTA");
141 {
142 TEEC_UUID NONEXISTING_TA_UUID = { 0x534D1192, 0x6143, 0x234C,
143 { 0x47, 0x55, 0x53, 0x52,
144 0x54, 0x4F, 0x4F, 0x59 } };
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100145 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200146
Jens Wiklander72c55452016-10-27 20:44:35 +0200147 if (!ADBG_EXPECT(cs->c, TEEC_SUCCESS,
Etienne Carriereb11820c2020-05-26 11:55:33 +0200148 TEEC_InitializeContext(xtest_tee_name, &cs->context)))
Jens Wiklander72c55452016-10-27 20:44:35 +0200149 goto out;
Pascal Brandc639ac82015-07-02 08:53:34 +0200150
151 ADBG_EXPECT_COMPARE_UNSIGNED(cs->c, TEEC_SUCCESS, !=,
152 TEEC_OpenSession(&cs->context, &cs->session,
153 &NONEXISTING_TA_UUID,
154 TEEC_LOGIN_PUBLIC, NULL, NULL,
155 &ret_orig));
156 ADBG_EXPECT_COMPARE_UNSIGNED(cs->c, TEEC_ORIGIN_TRUSTED_APP, !=,
157 ret_orig);
158 TEEC_FinalizeContext(&cs->context);
159 }
Jens Wiklander72c55452016-10-27 20:44:35 +0200160out:
Pascal Brandc639ac82015-07-02 08:53:34 +0200161 Do_ADBG_EndSubCase(cs->c, "OpenSession_error_notExistingTA");
162}
163
164static void Allocate_InOut(struct xtest_session *cs)
165{
166 Do_ADBG_BeginSubCase(cs->c, "Allocate_InOut");
167 {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100168 TEEC_SharedMemory shm = { };
Pascal Brandc639ac82015-07-02 08:53:34 +0200169 uint8_t val[] = { 54, 76, 98, 32 };
170
Jens Wiklander72c55452016-10-27 20:44:35 +0200171 if (!ADBG_EXPECT(cs->c, TEEC_SUCCESS,
Etienne Carriereb11820c2020-05-26 11:55:33 +0200172 TEEC_InitializeContext(xtest_tee_name, &cs->context)))
Jens Wiklander72c55452016-10-27 20:44:35 +0200173 goto out;
Pascal Brandc639ac82015-07-02 08:53:34 +0200174
Jens Wiklander72c55452016-10-27 20:44:35 +0200175 if (!ADBG_EXPECT_TEEC_SUCCESS(cs->c,
Pascal Brandc639ac82015-07-02 08:53:34 +0200176 AllocateSharedMemory(&cs->context, &shm, sizeof(val),
Jens Wiklander72c55452016-10-27 20:44:35 +0200177 TEEC_MEM_INPUT | TEEC_MEM_OUTPUT)))
178 goto out_final;
Pascal Brandc639ac82015-07-02 08:53:34 +0200179
180 TEEC_ReleaseSharedMemory(&shm);
Jens Wiklander72c55452016-10-27 20:44:35 +0200181out_final:
Pascal Brandc639ac82015-07-02 08:53:34 +0200182 TEEC_FinalizeContext(&cs->context);
183 }
Jens Wiklander72c55452016-10-27 20:44:35 +0200184out:
Pascal Brandc639ac82015-07-02 08:53:34 +0200185 Do_ADBG_EndSubCase(cs->c, "Allocate_InOut");
186}
187
188static void Register_In(struct xtest_session *cs)
189{
190 Do_ADBG_BeginSubCase(cs->c, "Register_In");
191 {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100192 TEEC_SharedMemory shm = { };
Pascal Brandc639ac82015-07-02 08:53:34 +0200193 uint8_t val[] = { 32, 65, 43, 21, 98 };
194
Jens Wiklander72c55452016-10-27 20:44:35 +0200195 if (!ADBG_EXPECT(cs->c, TEEC_SUCCESS,
Etienne Carriereb11820c2020-05-26 11:55:33 +0200196 TEEC_InitializeContext(xtest_tee_name, &cs->context)))
Jens Wiklander72c55452016-10-27 20:44:35 +0200197 goto out;
Pascal Brandc639ac82015-07-02 08:53:34 +0200198
199 shm.buffer = val;
200
Jens Wiklander72c55452016-10-27 20:44:35 +0200201 if (!ADBG_EXPECT_TEEC_SUCCESS(cs->c,
Pascal Brandc639ac82015-07-02 08:53:34 +0200202 RegisterSharedMemory(&cs->context, &shm, sizeof(val),
Jens Wiklander72c55452016-10-27 20:44:35 +0200203 TEEC_MEM_INPUT)))
204 goto out_final;
205
Pascal Brandc639ac82015-07-02 08:53:34 +0200206 TEEC_ReleaseSharedMemory(&shm);
Jens Wiklander72c55452016-10-27 20:44:35 +0200207out_final:
Pascal Brandc639ac82015-07-02 08:53:34 +0200208 TEEC_FinalizeContext(&cs->context);
209 }
Jens Wiklander72c55452016-10-27 20:44:35 +0200210out:
Pascal Brandc639ac82015-07-02 08:53:34 +0200211 Do_ADBG_EndSubCase(cs->c, "Register_In");
212}
213
214static void Register_notZeroLength_Out(struct xtest_session *cs)
215{
216 Do_ADBG_BeginSubCase(cs->c, "Register_notZeroLength_Out");
217 {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100218 TEEC_SharedMemory shm = { };
Pascal Brandc639ac82015-07-02 08:53:34 +0200219 uint8_t val[] = { 56, 67, 78, 99 };
220
Jens Wiklander72c55452016-10-27 20:44:35 +0200221 if (!ADBG_EXPECT(cs->c, TEEC_SUCCESS,
Etienne Carriereb11820c2020-05-26 11:55:33 +0200222 TEEC_InitializeContext(xtest_tee_name, &cs->context)))
Jens Wiklander72c55452016-10-27 20:44:35 +0200223 goto out;
Pascal Brandc639ac82015-07-02 08:53:34 +0200224
225 shm.buffer = val;
226
Jens Wiklander72c55452016-10-27 20:44:35 +0200227 if (!ADBG_EXPECT_TEEC_SUCCESS(cs->c,
228 RegisterSharedMemory(&cs->context, &shm, sizeof(val),
229 TEEC_MEM_OUTPUT)))
230 goto out_final;
231
Pascal Brandc639ac82015-07-02 08:53:34 +0200232 TEEC_ReleaseSharedMemory(&shm);
Jens Wiklander72c55452016-10-27 20:44:35 +0200233out_final:
Pascal Brandc639ac82015-07-02 08:53:34 +0200234 TEEC_FinalizeContext(&cs->context);
235 }
Jens Wiklander72c55452016-10-27 20:44:35 +0200236out:
Pascal Brandc639ac82015-07-02 08:53:34 +0200237 Do_ADBG_EndSubCase(cs->c, "Register_notZeroLength_Out");
238}
239
240static void Register_InOut(struct xtest_session *cs)
241{
242 Do_ADBG_BeginSubCase(cs->c, "Register_InOut");
243 {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100244 TEEC_SharedMemory shm = { };
Pascal Brandc639ac82015-07-02 08:53:34 +0200245 uint8_t val[] = { 54, 76, 23, 98, 255, 23, 86 };
246
Jens Wiklander72c55452016-10-27 20:44:35 +0200247 if (!ADBG_EXPECT(cs->c, TEEC_SUCCESS,
Etienne Carriereb11820c2020-05-26 11:55:33 +0200248 TEEC_InitializeContext(xtest_tee_name, &cs->context)))
Jens Wiklander72c55452016-10-27 20:44:35 +0200249 goto out;
Pascal Brandc639ac82015-07-02 08:53:34 +0200250
251 shm.buffer = val;
Jens Wiklander72c55452016-10-27 20:44:35 +0200252 if (!ADBG_EXPECT_TEEC_SUCCESS(cs->c,
Pascal Brandc639ac82015-07-02 08:53:34 +0200253 RegisterSharedMemory(&cs->context, &shm, sizeof(val),
Jens Wiklander72c55452016-10-27 20:44:35 +0200254 TEEC_MEM_INPUT | TEEC_MEM_OUTPUT)))
255 goto out_final;
Pascal Brandc639ac82015-07-02 08:53:34 +0200256
257 TEEC_ReleaseSharedMemory(&shm);
Jens Wiklander72c55452016-10-27 20:44:35 +0200258out_final:
Pascal Brandc639ac82015-07-02 08:53:34 +0200259 TEEC_FinalizeContext(&cs->context);
260 }
Jens Wiklander72c55452016-10-27 20:44:35 +0200261out:
Pascal Brandc639ac82015-07-02 08:53:34 +0200262 Do_ADBG_EndSubCase(cs->c, "Register_InOut");
263}
264
265static void Register_zeroLength_Out(struct xtest_session *cs)
266{
267 Do_ADBG_BeginSubCase(cs->c, "Register_zeroLength_Out");
268 {
269 uint8_t val[] = { 65, 76, 98, 32 };
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100270 TEEC_SharedMemory shm = { };
Pascal Brandc639ac82015-07-02 08:53:34 +0200271
Jens Wiklander72c55452016-10-27 20:44:35 +0200272 if (!ADBG_EXPECT(cs->c, TEEC_SUCCESS,
Etienne Carriereb11820c2020-05-26 11:55:33 +0200273 TEEC_InitializeContext(xtest_tee_name, &cs->context)))
Jens Wiklander72c55452016-10-27 20:44:35 +0200274 goto out;
Pascal Brandc639ac82015-07-02 08:53:34 +0200275
276 shm.buffer = val;
Jens Wiklander72c55452016-10-27 20:44:35 +0200277 if (!ADBG_EXPECT_TEEC_SUCCESS(cs->c,
278 RegisterSharedMemory(&cs->context, &shm, 0,
279 TEEC_MEM_OUTPUT)))
280 goto out_final;
Pascal Brandc639ac82015-07-02 08:53:34 +0200281
282 TEEC_ReleaseSharedMemory(&shm);
Jens Wiklander72c55452016-10-27 20:44:35 +0200283out_final:
Pascal Brandc639ac82015-07-02 08:53:34 +0200284 TEEC_FinalizeContext(&cs->context);
285 }
Jens Wiklander72c55452016-10-27 20:44:35 +0200286out:
Pascal Brandc639ac82015-07-02 08:53:34 +0200287 Do_ADBG_EndSubCase(cs->c, "Register_zeroLength_Out");
288}
289
290static void Allocate_Out(struct xtest_session *cs)
291{
292 Do_ADBG_BeginSubCase(cs->c, "Allocate_Out");
293 {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100294 TEEC_SharedMemory shm = { };
Pascal Brandc639ac82015-07-02 08:53:34 +0200295
Jens Wiklander72c55452016-10-27 20:44:35 +0200296 if (!ADBG_EXPECT(cs->c, TEEC_SUCCESS,
Etienne Carriereb11820c2020-05-26 11:55:33 +0200297 TEEC_InitializeContext(xtest_tee_name, &cs->context)))
Jens Wiklander72c55452016-10-27 20:44:35 +0200298 goto out;
Pascal Brandc639ac82015-07-02 08:53:34 +0200299
Jens Wiklander72c55452016-10-27 20:44:35 +0200300 if (!ADBG_EXPECT_TEEC_SUCCESS(cs->c,
Pascal Brandc639ac82015-07-02 08:53:34 +0200301 AllocateSharedMemory(&cs->context, &shm, 0,
Jens Wiklander72c55452016-10-27 20:44:35 +0200302 TEEC_MEM_OUTPUT)))
303 goto out_final;
Pascal Brandc639ac82015-07-02 08:53:34 +0200304
305 TEEC_ReleaseSharedMemory(&shm);
Jens Wiklander72c55452016-10-27 20:44:35 +0200306out_final:
Pascal Brandc639ac82015-07-02 08:53:34 +0200307 TEEC_FinalizeContext(&cs->context);
308 }
Jens Wiklander72c55452016-10-27 20:44:35 +0200309out:
Pascal Brandc639ac82015-07-02 08:53:34 +0200310 Do_ADBG_EndSubCase(cs->c, "Allocate_Out");
311}
312
313static void FinalizeContext_null(struct xtest_session *cs)
314{
315 Do_ADBG_BeginSubCase(cs->c, "FinalizeContext_null");
316 {
317 TEEC_FinalizeContext(NULL);
318 }
319 Do_ADBG_EndSubCase(cs->c, "FinalizeContext_null");
320}
321
322static void InitializeContext_NotExistingTEE(struct xtest_session *cs)
323{
324 Do_ADBG_BeginSubCase(cs->c, "InitializeContext_NotExistingTEE");
325 {
Jens Wiklander72c55452016-10-27 20:44:35 +0200326 if (!ADBG_EXPECT_COMPARE_UNSIGNED(cs->c, TEEC_SUCCESS, !=,
Pascal Brandc639ac82015-07-02 08:53:34 +0200327 TEEC_InitializeContext("Invalid TEE name",
Jens Wiklander72c55452016-10-27 20:44:35 +0200328 &cs->context)))
329 TEEC_FinalizeContext(&cs->context);
Pascal Brandc639ac82015-07-02 08:53:34 +0200330 }
331 Do_ADBG_EndSubCase(cs->c, "InitializeContext_NotExistingTEE");
332}
333
334static void AllocateThenRegister_SameMemory(struct xtest_session *cs)
335{
336 Do_ADBG_BeginSubCase(cs->c, "AllocateThenRegister_SameMemory");
337 {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100338 TEEC_SharedMemory shm = { };
Jerome Forissierde0c4432017-05-23 11:38:08 +0200339 size_t size_allocation = 32;
Pascal Brandc639ac82015-07-02 08:53:34 +0200340
Jens Wiklander72c55452016-10-27 20:44:35 +0200341 if (!ADBG_EXPECT(cs->c, TEEC_SUCCESS,
Etienne Carriereb11820c2020-05-26 11:55:33 +0200342 TEEC_InitializeContext(xtest_tee_name, &cs->context)))
Jens Wiklander72c55452016-10-27 20:44:35 +0200343 goto out;
Pascal Brandc639ac82015-07-02 08:53:34 +0200344
Jens Wiklander72c55452016-10-27 20:44:35 +0200345 if (!ADBG_EXPECT_TEEC_SUCCESS(cs->c,
Pascal Brandc639ac82015-07-02 08:53:34 +0200346 AllocateSharedMemory(&cs->context, &shm,
Jens Wiklander72c55452016-10-27 20:44:35 +0200347 size_allocation, TEEC_MEM_INPUT)))
348 goto out_final;
Pascal Brandc639ac82015-07-02 08:53:34 +0200349
350 ADBG_EXPECT_TEEC_SUCCESS(cs->c,
351 RegisterSharedMemory(&cs->context, &shm,
352 size_allocation, TEEC_MEM_INPUT));
Jens Wiklander72c55452016-10-27 20:44:35 +0200353
354 TEEC_ReleaseSharedMemory(&shm);
355out_final:
356 TEEC_FinalizeContext(&cs->context);
Pascal Brandc639ac82015-07-02 08:53:34 +0200357 }
Jens Wiklander72c55452016-10-27 20:44:35 +0200358out:
Pascal Brandc639ac82015-07-02 08:53:34 +0200359 Do_ADBG_EndSubCase(cs->c, "AllocateThenRegister_SameMemory");
360}
361
362static void AllocateSameMemory_twice(struct xtest_session *cs)
363{
364 Do_ADBG_BeginSubCase(cs->c, "AllocateSameMemory_twice");
365 {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100366 TEEC_SharedMemory shm = { };
Jerome Forissierde0c4432017-05-23 11:38:08 +0200367 size_t size_allocation = 32;
Pascal Brandc639ac82015-07-02 08:53:34 +0200368
Jens Wiklander72c55452016-10-27 20:44:35 +0200369 if (!ADBG_EXPECT(cs->c, TEEC_SUCCESS,
Etienne Carriereb11820c2020-05-26 11:55:33 +0200370 TEEC_InitializeContext(xtest_tee_name, &cs->context)))
Jens Wiklander72c55452016-10-27 20:44:35 +0200371 goto out;
Pascal Brandc639ac82015-07-02 08:53:34 +0200372
Jens Wiklander72c55452016-10-27 20:44:35 +0200373 if (!ADBG_EXPECT_TEEC_SUCCESS(cs->c,
Pascal Brandc639ac82015-07-02 08:53:34 +0200374 AllocateSharedMemory(&cs->context, &shm,
Jens Wiklander72c55452016-10-27 20:44:35 +0200375 size_allocation, TEEC_MEM_INPUT)))
376 goto out_final;
Pascal Brandc639ac82015-07-02 08:53:34 +0200377
378 ADBG_EXPECT_TEEC_SUCCESS(cs->c,
379 AllocateSharedMemory(&cs->context, &shm,
380 size_allocation, TEEC_MEM_INPUT));
381
382 TEEC_ReleaseSharedMemory(&shm);
Jens Wiklander72c55452016-10-27 20:44:35 +0200383out_final:
Pascal Brandc639ac82015-07-02 08:53:34 +0200384 TEEC_FinalizeContext(&cs->context);
385 }
Jens Wiklander72c55452016-10-27 20:44:35 +0200386out:
Pascal Brandc639ac82015-07-02 08:53:34 +0200387 Do_ADBG_EndSubCase(cs->c, "AllocateSameMemory_twice");
388}
389
390static void RegisterSameMemory_twice(struct xtest_session *cs)
391{
392 Do_ADBG_BeginSubCase(cs->c, "RegisterSameMemory_twice");
393 {
394 uint8_t val[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100395 TEEC_SharedMemory shm = { };
Pascal Brandc639ac82015-07-02 08:53:34 +0200396
Jens Wiklander72c55452016-10-27 20:44:35 +0200397 if (!ADBG_EXPECT(cs->c, TEEC_SUCCESS,
Etienne Carriereb11820c2020-05-26 11:55:33 +0200398 TEEC_InitializeContext(xtest_tee_name, &cs->context)))
Jens Wiklander72c55452016-10-27 20:44:35 +0200399 goto out;
Pascal Brandc639ac82015-07-02 08:53:34 +0200400
401 shm.buffer = val;
Jens Wiklander72c55452016-10-27 20:44:35 +0200402 if (!ADBG_EXPECT_TEEC_SUCCESS(cs->c,
Pascal Brandc639ac82015-07-02 08:53:34 +0200403 RegisterSharedMemory(&cs->context, &shm, sizeof(val),
Jens Wiklander72c55452016-10-27 20:44:35 +0200404 TEEC_MEM_INPUT)))
405 goto out_final;
Pascal Brandc639ac82015-07-02 08:53:34 +0200406
407 ADBG_EXPECT_TEEC_SUCCESS(cs->c,
408 RegisterSharedMemory(&cs->context, &shm, sizeof(val),
409 TEEC_MEM_INPUT));
410
411 TEEC_ReleaseSharedMemory(&shm);
Jens Wiklander72c55452016-10-27 20:44:35 +0200412out_final:
Pascal Brandc639ac82015-07-02 08:53:34 +0200413 TEEC_FinalizeContext(&cs->context);
414 }
Jens Wiklander72c55452016-10-27 20:44:35 +0200415out:
Pascal Brandc639ac82015-07-02 08:53:34 +0200416 Do_ADBG_EndSubCase(cs->c, "RegisterSameMemory_twice");
417}
418
Jerome Forissiercefbe022017-05-23 11:02:35 +0200419#ifndef MIN
420#define MIN(a,b) ((a) < (b) ? (a) : (b))
421#endif
422
423static void Allocate_sharedMemory_32k(struct xtest_session *cs)
Pascal Brandc639ac82015-07-02 08:53:34 +0200424{
Jerome Forissiercefbe022017-05-23 11:02:35 +0200425 Do_ADBG_BeginSubCase(cs->c, "Allocate_sharedMemory_32k");
Pascal Brandc639ac82015-07-02 08:53:34 +0200426 {
Jerome Forissierde0c4432017-05-23 11:38:08 +0200427 size_t size = MIN(32 * 1024,
428 TEEC_CONFIG_SHAREDMEM_MAX_SIZE);
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100429 TEEC_SharedMemory shm = { };
Pascal Brandc639ac82015-07-02 08:53:34 +0200430
Jens Wiklander72c55452016-10-27 20:44:35 +0200431 if (!ADBG_EXPECT(cs->c, TEEC_SUCCESS,
Etienne Carriereb11820c2020-05-26 11:55:33 +0200432 TEEC_InitializeContext(xtest_tee_name, &cs->context)))
Jens Wiklander72c55452016-10-27 20:44:35 +0200433 goto out;
Pascal Brandc639ac82015-07-02 08:53:34 +0200434
Jens Wiklander72c55452016-10-27 20:44:35 +0200435 if (!ADBG_EXPECT_TEEC_SUCCESS(cs->c,
Jerome Forissiercefbe022017-05-23 11:02:35 +0200436 AllocateSharedMemory(&cs->context, &shm, size,
Jens Wiklander72c55452016-10-27 20:44:35 +0200437 TEEC_MEM_INPUT)))
438 goto out_final;
Pascal Brandc639ac82015-07-02 08:53:34 +0200439
440 TEEC_ReleaseSharedMemory(&shm);
Jens Wiklander72c55452016-10-27 20:44:35 +0200441out_final:
442 TEEC_FinalizeContext(&cs->context);
Pascal Brandc639ac82015-07-02 08:53:34 +0200443 }
Jens Wiklander72c55452016-10-27 20:44:35 +0200444out:
Jerome Forissiercefbe022017-05-23 11:02:35 +0200445 Do_ADBG_EndSubCase(cs->c, "Allocate_sharedMemory_32k");
Pascal Brandc639ac82015-07-02 08:53:34 +0200446}
447
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100448#define SHM_32K_SIZE MIN(32 * 1024, TEEC_CONFIG_SHAREDMEM_MAX_SIZE)
449
Jerome Forissiercefbe022017-05-23 11:02:35 +0200450static void Register_sharedMemory_32k(struct xtest_session *cs)
Pascal Brandc639ac82015-07-02 08:53:34 +0200451{
Jerome Forissiercefbe022017-05-23 11:02:35 +0200452 Do_ADBG_BeginSubCase(cs->c, "Register_sharedMemory_32k");
Pascal Brandc639ac82015-07-02 08:53:34 +0200453 {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100454 uint8_t val[SHM_32K_SIZE] = { };
455 TEEC_SharedMemory shm = { };
Pascal Brandc639ac82015-07-02 08:53:34 +0200456
Jens Wiklander72c55452016-10-27 20:44:35 +0200457 if (!ADBG_EXPECT(cs->c, TEEC_SUCCESS,
Etienne Carriereb11820c2020-05-26 11:55:33 +0200458 TEEC_InitializeContext(xtest_tee_name, &cs->context)))
Jens Wiklander72c55452016-10-27 20:44:35 +0200459 goto out;
Pascal Brandc639ac82015-07-02 08:53:34 +0200460
461 shm.buffer = val;
Jens Wiklander72c55452016-10-27 20:44:35 +0200462 if (!ADBG_EXPECT_TEEC_SUCCESS(cs->c,
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100463 RegisterSharedMemory(&cs->context, &shm, SHM_32K_SIZE,
Jens Wiklander72c55452016-10-27 20:44:35 +0200464 TEEC_MEM_INPUT)))
465 goto out_final;
Pascal Brandc639ac82015-07-02 08:53:34 +0200466
467 TEEC_ReleaseSharedMemory(&shm);
Jens Wiklander72c55452016-10-27 20:44:35 +0200468out_final:
Pascal Brandc639ac82015-07-02 08:53:34 +0200469 TEEC_FinalizeContext(&cs->context);
470 }
Jens Wiklander72c55452016-10-27 20:44:35 +0200471out:
Jerome Forissiercefbe022017-05-23 11:02:35 +0200472 Do_ADBG_EndSubCase(cs->c, "Register_sharedMemory_32k");
Pascal Brandc639ac82015-07-02 08:53:34 +0200473}
474
475static void xtest_teec_TEE(ADBG_Case_t *c)
476{
477 struct xtest_session connection = { c };
478
479 CloseSession_null(&connection);
480
481 Allocate_In(&connection);
482
483 Allocate_out_of_memory(&connection);
484
485 OpenSession_error_notExistingTA(&connection);
486
487 Allocate_InOut(&connection);
488
489 Register_In(&connection);
490
491 Register_notZeroLength_Out(&connection);
492
493 Register_InOut(&connection);
494
495 Register_zeroLength_Out(&connection);
496
497 Allocate_Out(&connection);
498
499 FinalizeContext_null(&connection);
500
501 InitializeContext_NotExistingTEE(&connection);
502
503 AllocateThenRegister_SameMemory(&connection);
504
505 AllocateSameMemory_twice(&connection);
506
507 RegisterSameMemory_twice(&connection);
508
Jerome Forissiercefbe022017-05-23 11:02:35 +0200509 Allocate_sharedMemory_32k(&connection);
Pascal Brandc639ac82015-07-02 08:53:34 +0200510
Jerome Forissiercefbe022017-05-23 11:02:35 +0200511 Register_sharedMemory_32k(&connection);
Pascal Brandc639ac82015-07-02 08:53:34 +0200512}
513
Jens Wiklander74abfe32017-01-03 14:17:47 +0100514ADBG_CASE_DEFINE(regression, 5006, xtest_teec_TEE,
Jens Wiklander25a57fe2016-12-26 21:46:24 +0100515 "Tests for Global platform TEEC");