blob: 039543f8cfe05f567dd90aca38a3ac380e5d866c [file] [log] [blame]
Pascal Brandc639ac82015-07-02 08:53:34 +02001/*
2 * Copyright (c) 2014, STMicroelectronics International N.V.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License Version 2 as
6 * published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 */
13
14#include <stdio.h>
15#include <string.h>
16#include <stdlib.h>
17#include <sys/types.h>
18#include <unistd.h>
19
20#include "xtest_test.h"
21#include "xtest_helpers.h"
Pascal Brandc639ac82015-07-02 08:53:34 +020022#include "tee_api_defines.h"
23#include "tee_client_api.h"
24
25#define OFFSET0 0
26
27#define PARAM_0 0
28#define PARAM_1 1
29#define PARAM_2 2
30#define PARAM_3 3
31
32struct xtest_session {
33 ADBG_Case_t *c;
34 TEEC_Session session;
35 TEEC_Context context;
36};
37
38/* Compares two memories and checks if their length and content is the same */
39#define EXPECT_SHARED_MEM_BUFFER(c, exp_buf, exp_blen, op, param_num, shrm) \
40 do { \
41 if ((exp_buf) == NULL) { \
42 ADBG_EXPECT((c), exp_blen, \
43 (op)->params[(param_num)].memref.size); \
44 } else { \
45 ADBG_EXPECT_COMPARE_POINTER((c), (shrm), ==, \
46 (op)->params[(param_num)].memref.parent); \
47 ADBG_EXPECT_BUFFER((c), (exp_buf), (exp_blen), \
48 (shrm)->buffer, \
49 (op)->params[(param_num)].memref.size); \
50 } \
51 } while (0)
52
53/*
54 * Compares the content of the memory cells in OP with the expected value
55 * contained.
56 */
57#define EXPECT_OP_TMP_MEM_BUFFER(c, exp_buf, exp_blen, op, param_num, buf) \
58 do { \
59 if ((exp_buf) == NULL) { \
60 ADBG_EXPECT((c), exp_blen, \
61 (op)->params[(param_num)].tmpref.size); \
62 } else { \
63 ADBG_EXPECT_COMPARE_POINTER((c), (buf), ==, \
64 (op)->params[(param_num)].tmpref.buffer); \
65 ADBG_EXPECT_BUFFER((c), (exp_buf), (exp_blen), \
66 (buf), \
67 (op)->params[(param_num)].memref.size); \
68 } \
69 } while (0)
70
Pascal Brandc639ac82015-07-02 08:53:34 +020071/* Registers the TEEC_SharedMemory to the TEE. */
72static TEEC_Result RegisterSharedMemory(TEEC_Context *ctx,
Jerome Forissierde0c4432017-05-23 11:38:08 +020073 TEEC_SharedMemory *shm, size_t size,
Pascal Brandc639ac82015-07-02 08:53:34 +020074 uint32_t flags)
75{
76 shm->flags = flags;
77 shm->size = size;
78 return TEEC_RegisterSharedMemory(ctx, shm);
79}
80
81/* Allocates shared memory inside of the TEE. */
82static TEEC_Result AllocateSharedMemory(TEEC_Context *ctx,
Jerome Forissierde0c4432017-05-23 11:38:08 +020083 TEEC_SharedMemory *shm, size_t size,
Pascal Brandc639ac82015-07-02 08:53:34 +020084 uint32_t flags)
85{
86 shm->flags = flags;
87 shm->size = size;
88 return TEEC_AllocateSharedMemory(ctx, shm);
89}
90
91static void CloseSession_null(struct xtest_session *cs)
92{
93 Do_ADBG_BeginSubCase(cs->c, "CloseSession_null");
94 {
95 /* In reality doesn't test anything. */
96 TEEC_CloseSession(NULL);
97 }
98 Do_ADBG_EndSubCase(cs->c, "CloseSession_null");
99}
100
101static void Allocate_In(struct xtest_session *cs)
102{
103 Do_ADBG_BeginSubCase(cs->c, "Allocate_In");
104 {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100105 TEEC_SharedMemory shm = { };
Jerome Forissierde0c4432017-05-23 11:38:08 +0200106 size_t size = 1024;
Pascal Brandc639ac82015-07-02 08:53:34 +0200107
Jens Wiklander72c55452016-10-27 20:44:35 +0200108 if (!ADBG_EXPECT(cs->c, TEEC_SUCCESS,
109 TEEC_InitializeContext(_device, &cs->context)))
110 goto out;
111
112 if (!ADBG_EXPECT_TEEC_SUCCESS(cs->c,
Pascal Brandc639ac82015-07-02 08:53:34 +0200113 AllocateSharedMemory(&cs->context, &shm, size,
Jens Wiklander72c55452016-10-27 20:44:35 +0200114 TEEC_MEM_INPUT)))
115 goto out_final;
116
Pascal Brandc639ac82015-07-02 08:53:34 +0200117 TEEC_ReleaseSharedMemory(&shm);
Jens Wiklander72c55452016-10-27 20:44:35 +0200118out_final:
Pascal Brandc639ac82015-07-02 08:53:34 +0200119 TEEC_FinalizeContext(&cs->context);
120 }
Jens Wiklander72c55452016-10-27 20:44:35 +0200121out:
Pascal Brandc639ac82015-07-02 08:53:34 +0200122 Do_ADBG_EndSubCase(cs->c, "Allocate_In");
123}
124
125static void Allocate_out_of_memory(struct xtest_session *cs)
126{
127 Do_ADBG_BeginSubCase(cs->c, "Allocate_out_of_memory");
128 {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100129 TEEC_SharedMemory shm = { };
Jerome Forissierde0c4432017-05-23 11:38:08 +0200130 size_t SIZE_OVER_MEMORY_CAPACITY = SIZE_MAX;
Pascal Brandc639ac82015-07-02 08:53:34 +0200131
Jens Wiklander72c55452016-10-27 20:44:35 +0200132 if (!ADBG_EXPECT(cs->c, TEEC_SUCCESS,
133 TEEC_InitializeContext(_device, &cs->context)))
134 goto out;
135
Pascal Brandc639ac82015-07-02 08:53:34 +0200136 ADBG_EXPECT_TEEC_RESULT(cs->c, TEEC_ERROR_OUT_OF_MEMORY,
137 AllocateSharedMemory(&cs->context, &shm,
138 SIZE_OVER_MEMORY_CAPACITY,
139 TEEC_MEM_INPUT));
Pascal Brandc639ac82015-07-02 08:53:34 +0200140 TEEC_FinalizeContext(&cs->context);
141 }
Jens Wiklander72c55452016-10-27 20:44:35 +0200142out:
Pascal Brandc639ac82015-07-02 08:53:34 +0200143 Do_ADBG_EndSubCase(cs->c, "Allocate_out_of_memory");
144}
145
146static void OpenSession_error_notExistingTA(struct xtest_session *cs)
147{
148 Do_ADBG_BeginSubCase(cs->c, "OpenSession_error_notExistingTA");
149 {
150 TEEC_UUID NONEXISTING_TA_UUID = { 0x534D1192, 0x6143, 0x234C,
151 { 0x47, 0x55, 0x53, 0x52,
152 0x54, 0x4F, 0x4F, 0x59 } };
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100153 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200154
Jens Wiklander72c55452016-10-27 20:44:35 +0200155 if (!ADBG_EXPECT(cs->c, TEEC_SUCCESS,
156 TEEC_InitializeContext(_device, &cs->context)))
157 goto out;
Pascal Brandc639ac82015-07-02 08:53:34 +0200158
159 ADBG_EXPECT_COMPARE_UNSIGNED(cs->c, TEEC_SUCCESS, !=,
160 TEEC_OpenSession(&cs->context, &cs->session,
161 &NONEXISTING_TA_UUID,
162 TEEC_LOGIN_PUBLIC, NULL, NULL,
163 &ret_orig));
164 ADBG_EXPECT_COMPARE_UNSIGNED(cs->c, TEEC_ORIGIN_TRUSTED_APP, !=,
165 ret_orig);
166 TEEC_FinalizeContext(&cs->context);
167 }
Jens Wiklander72c55452016-10-27 20:44:35 +0200168out:
Pascal Brandc639ac82015-07-02 08:53:34 +0200169 Do_ADBG_EndSubCase(cs->c, "OpenSession_error_notExistingTA");
170}
171
172static void Allocate_InOut(struct xtest_session *cs)
173{
174 Do_ADBG_BeginSubCase(cs->c, "Allocate_InOut");
175 {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100176 TEEC_SharedMemory shm = { };
Pascal Brandc639ac82015-07-02 08:53:34 +0200177 uint8_t val[] = { 54, 76, 98, 32 };
178
Jens Wiklander72c55452016-10-27 20:44:35 +0200179 if (!ADBG_EXPECT(cs->c, TEEC_SUCCESS,
180 TEEC_InitializeContext(_device, &cs->context)))
181 goto out;
Pascal Brandc639ac82015-07-02 08:53:34 +0200182
Jens Wiklander72c55452016-10-27 20:44:35 +0200183 if (!ADBG_EXPECT_TEEC_SUCCESS(cs->c,
Pascal Brandc639ac82015-07-02 08:53:34 +0200184 AllocateSharedMemory(&cs->context, &shm, sizeof(val),
Jens Wiklander72c55452016-10-27 20:44:35 +0200185 TEEC_MEM_INPUT | TEEC_MEM_OUTPUT)))
186 goto out_final;
Pascal Brandc639ac82015-07-02 08:53:34 +0200187
188 TEEC_ReleaseSharedMemory(&shm);
Jens Wiklander72c55452016-10-27 20:44:35 +0200189out_final:
Pascal Brandc639ac82015-07-02 08:53:34 +0200190 TEEC_FinalizeContext(&cs->context);
191 }
Jens Wiklander72c55452016-10-27 20:44:35 +0200192out:
Pascal Brandc639ac82015-07-02 08:53:34 +0200193 Do_ADBG_EndSubCase(cs->c, "Allocate_InOut");
194}
195
196static void Register_In(struct xtest_session *cs)
197{
198 Do_ADBG_BeginSubCase(cs->c, "Register_In");
199 {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100200 TEEC_SharedMemory shm = { };
Pascal Brandc639ac82015-07-02 08:53:34 +0200201 uint8_t val[] = { 32, 65, 43, 21, 98 };
202
Jens Wiklander72c55452016-10-27 20:44:35 +0200203 if (!ADBG_EXPECT(cs->c, TEEC_SUCCESS,
204 TEEC_InitializeContext(_device, &cs->context)))
205 goto out;
Pascal Brandc639ac82015-07-02 08:53:34 +0200206
207 shm.buffer = val;
208
Jens Wiklander72c55452016-10-27 20:44:35 +0200209 if (!ADBG_EXPECT_TEEC_SUCCESS(cs->c,
Pascal Brandc639ac82015-07-02 08:53:34 +0200210 RegisterSharedMemory(&cs->context, &shm, sizeof(val),
Jens Wiklander72c55452016-10-27 20:44:35 +0200211 TEEC_MEM_INPUT)))
212 goto out_final;
213
Pascal Brandc639ac82015-07-02 08:53:34 +0200214 TEEC_ReleaseSharedMemory(&shm);
Jens Wiklander72c55452016-10-27 20:44:35 +0200215out_final:
Pascal Brandc639ac82015-07-02 08:53:34 +0200216 TEEC_FinalizeContext(&cs->context);
217 }
Jens Wiklander72c55452016-10-27 20:44:35 +0200218out:
Pascal Brandc639ac82015-07-02 08:53:34 +0200219 Do_ADBG_EndSubCase(cs->c, "Register_In");
220}
221
222static void Register_notZeroLength_Out(struct xtest_session *cs)
223{
224 Do_ADBG_BeginSubCase(cs->c, "Register_notZeroLength_Out");
225 {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100226 TEEC_SharedMemory shm = { };
Pascal Brandc639ac82015-07-02 08:53:34 +0200227 uint8_t val[] = { 56, 67, 78, 99 };
228
Jens Wiklander72c55452016-10-27 20:44:35 +0200229 if (!ADBG_EXPECT(cs->c, TEEC_SUCCESS,
230 TEEC_InitializeContext(_device, &cs->context)))
231 goto out;
Pascal Brandc639ac82015-07-02 08:53:34 +0200232
233 shm.buffer = val;
234
Jens Wiklander72c55452016-10-27 20:44:35 +0200235 if (!ADBG_EXPECT_TEEC_SUCCESS(cs->c,
236 RegisterSharedMemory(&cs->context, &shm, sizeof(val),
237 TEEC_MEM_OUTPUT)))
238 goto out_final;
239
Pascal Brandc639ac82015-07-02 08:53:34 +0200240 TEEC_ReleaseSharedMemory(&shm);
Jens Wiklander72c55452016-10-27 20:44:35 +0200241out_final:
Pascal Brandc639ac82015-07-02 08:53:34 +0200242 TEEC_FinalizeContext(&cs->context);
243 }
Jens Wiklander72c55452016-10-27 20:44:35 +0200244out:
Pascal Brandc639ac82015-07-02 08:53:34 +0200245 Do_ADBG_EndSubCase(cs->c, "Register_notZeroLength_Out");
246}
247
248static void Register_InOut(struct xtest_session *cs)
249{
250 Do_ADBG_BeginSubCase(cs->c, "Register_InOut");
251 {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100252 TEEC_SharedMemory shm = { };
Pascal Brandc639ac82015-07-02 08:53:34 +0200253 uint8_t val[] = { 54, 76, 23, 98, 255, 23, 86 };
254
Jens Wiklander72c55452016-10-27 20:44:35 +0200255 if (!ADBG_EXPECT(cs->c, TEEC_SUCCESS,
256 TEEC_InitializeContext(_device, &cs->context)))
257 goto out;
Pascal Brandc639ac82015-07-02 08:53:34 +0200258
259 shm.buffer = val;
Jens Wiklander72c55452016-10-27 20:44:35 +0200260 if (!ADBG_EXPECT_TEEC_SUCCESS(cs->c,
Pascal Brandc639ac82015-07-02 08:53:34 +0200261 RegisterSharedMemory(&cs->context, &shm, sizeof(val),
Jens Wiklander72c55452016-10-27 20:44:35 +0200262 TEEC_MEM_INPUT | TEEC_MEM_OUTPUT)))
263 goto out_final;
Pascal Brandc639ac82015-07-02 08:53:34 +0200264
265 TEEC_ReleaseSharedMemory(&shm);
Jens Wiklander72c55452016-10-27 20:44:35 +0200266out_final:
Pascal Brandc639ac82015-07-02 08:53:34 +0200267 TEEC_FinalizeContext(&cs->context);
268 }
Jens Wiklander72c55452016-10-27 20:44:35 +0200269out:
Pascal Brandc639ac82015-07-02 08:53:34 +0200270 Do_ADBG_EndSubCase(cs->c, "Register_InOut");
271}
272
273static void Register_zeroLength_Out(struct xtest_session *cs)
274{
275 Do_ADBG_BeginSubCase(cs->c, "Register_zeroLength_Out");
276 {
277 uint8_t val[] = { 65, 76, 98, 32 };
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100278 TEEC_SharedMemory shm = { };
Pascal Brandc639ac82015-07-02 08:53:34 +0200279
Jens Wiklander72c55452016-10-27 20:44:35 +0200280 if (!ADBG_EXPECT(cs->c, TEEC_SUCCESS,
281 TEEC_InitializeContext(_device, &cs->context)))
282 goto out;
Pascal Brandc639ac82015-07-02 08:53:34 +0200283
284 shm.buffer = val;
Jens Wiklander72c55452016-10-27 20:44:35 +0200285 if (!ADBG_EXPECT_TEEC_SUCCESS(cs->c,
286 RegisterSharedMemory(&cs->context, &shm, 0,
287 TEEC_MEM_OUTPUT)))
288 goto out_final;
Pascal Brandc639ac82015-07-02 08:53:34 +0200289
290 TEEC_ReleaseSharedMemory(&shm);
Jens Wiklander72c55452016-10-27 20:44:35 +0200291out_final:
Pascal Brandc639ac82015-07-02 08:53:34 +0200292 TEEC_FinalizeContext(&cs->context);
293 }
Jens Wiklander72c55452016-10-27 20:44:35 +0200294out:
Pascal Brandc639ac82015-07-02 08:53:34 +0200295 Do_ADBG_EndSubCase(cs->c, "Register_zeroLength_Out");
296}
297
298static void Allocate_Out(struct xtest_session *cs)
299{
300 Do_ADBG_BeginSubCase(cs->c, "Allocate_Out");
301 {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100302 TEEC_SharedMemory shm = { };
Pascal Brandc639ac82015-07-02 08:53:34 +0200303
Jens Wiklander72c55452016-10-27 20:44:35 +0200304 if (!ADBG_EXPECT(cs->c, TEEC_SUCCESS,
305 TEEC_InitializeContext(_device, &cs->context)))
306 goto out;
Pascal Brandc639ac82015-07-02 08:53:34 +0200307
Jens Wiklander72c55452016-10-27 20:44:35 +0200308 if (!ADBG_EXPECT_TEEC_SUCCESS(cs->c,
Pascal Brandc639ac82015-07-02 08:53:34 +0200309 AllocateSharedMemory(&cs->context, &shm, 0,
Jens Wiklander72c55452016-10-27 20:44:35 +0200310 TEEC_MEM_OUTPUT)))
311 goto out_final;
Pascal Brandc639ac82015-07-02 08:53:34 +0200312
313 TEEC_ReleaseSharedMemory(&shm);
Jens Wiklander72c55452016-10-27 20:44:35 +0200314out_final:
Pascal Brandc639ac82015-07-02 08:53:34 +0200315 TEEC_FinalizeContext(&cs->context);
316 }
Jens Wiklander72c55452016-10-27 20:44:35 +0200317out:
Pascal Brandc639ac82015-07-02 08:53:34 +0200318 Do_ADBG_EndSubCase(cs->c, "Allocate_Out");
319}
320
321static void FinalizeContext_null(struct xtest_session *cs)
322{
323 Do_ADBG_BeginSubCase(cs->c, "FinalizeContext_null");
324 {
325 TEEC_FinalizeContext(NULL);
326 }
327 Do_ADBG_EndSubCase(cs->c, "FinalizeContext_null");
328}
329
330static void InitializeContext_NotExistingTEE(struct xtest_session *cs)
331{
332 Do_ADBG_BeginSubCase(cs->c, "InitializeContext_NotExistingTEE");
333 {
Jens Wiklander72c55452016-10-27 20:44:35 +0200334 if (!ADBG_EXPECT_COMPARE_UNSIGNED(cs->c, TEEC_SUCCESS, !=,
Pascal Brandc639ac82015-07-02 08:53:34 +0200335 TEEC_InitializeContext("Invalid TEE name",
Jens Wiklander72c55452016-10-27 20:44:35 +0200336 &cs->context)))
337 TEEC_FinalizeContext(&cs->context);
Pascal Brandc639ac82015-07-02 08:53:34 +0200338 }
339 Do_ADBG_EndSubCase(cs->c, "InitializeContext_NotExistingTEE");
340}
341
342static void AllocateThenRegister_SameMemory(struct xtest_session *cs)
343{
344 Do_ADBG_BeginSubCase(cs->c, "AllocateThenRegister_SameMemory");
345 {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100346 TEEC_SharedMemory shm = { };
Jerome Forissierde0c4432017-05-23 11:38:08 +0200347 size_t size_allocation = 32;
Pascal Brandc639ac82015-07-02 08:53:34 +0200348
Jens Wiklander72c55452016-10-27 20:44:35 +0200349 if (!ADBG_EXPECT(cs->c, TEEC_SUCCESS,
350 TEEC_InitializeContext(_device, &cs->context)))
351 goto out;
Pascal Brandc639ac82015-07-02 08:53:34 +0200352
Jens Wiklander72c55452016-10-27 20:44:35 +0200353 if (!ADBG_EXPECT_TEEC_SUCCESS(cs->c,
Pascal Brandc639ac82015-07-02 08:53:34 +0200354 AllocateSharedMemory(&cs->context, &shm,
Jens Wiklander72c55452016-10-27 20:44:35 +0200355 size_allocation, TEEC_MEM_INPUT)))
356 goto out_final;
Pascal Brandc639ac82015-07-02 08:53:34 +0200357
358 ADBG_EXPECT_TEEC_SUCCESS(cs->c,
359 RegisterSharedMemory(&cs->context, &shm,
360 size_allocation, TEEC_MEM_INPUT));
Jens Wiklander72c55452016-10-27 20:44:35 +0200361
362 TEEC_ReleaseSharedMemory(&shm);
363out_final:
364 TEEC_FinalizeContext(&cs->context);
Pascal Brandc639ac82015-07-02 08:53:34 +0200365 }
Jens Wiklander72c55452016-10-27 20:44:35 +0200366out:
Pascal Brandc639ac82015-07-02 08:53:34 +0200367 Do_ADBG_EndSubCase(cs->c, "AllocateThenRegister_SameMemory");
368}
369
370static void AllocateSameMemory_twice(struct xtest_session *cs)
371{
372 Do_ADBG_BeginSubCase(cs->c, "AllocateSameMemory_twice");
373 {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100374 TEEC_SharedMemory shm = { };
Jerome Forissierde0c4432017-05-23 11:38:08 +0200375 size_t size_allocation = 32;
Pascal Brandc639ac82015-07-02 08:53:34 +0200376
Jens Wiklander72c55452016-10-27 20:44:35 +0200377 if (!ADBG_EXPECT(cs->c, TEEC_SUCCESS,
378 TEEC_InitializeContext(_device, &cs->context)))
379 goto out;
Pascal Brandc639ac82015-07-02 08:53:34 +0200380
Jens Wiklander72c55452016-10-27 20:44:35 +0200381 if (!ADBG_EXPECT_TEEC_SUCCESS(cs->c,
Pascal Brandc639ac82015-07-02 08:53:34 +0200382 AllocateSharedMemory(&cs->context, &shm,
Jens Wiklander72c55452016-10-27 20:44:35 +0200383 size_allocation, TEEC_MEM_INPUT)))
384 goto out_final;
Pascal Brandc639ac82015-07-02 08:53:34 +0200385
386 ADBG_EXPECT_TEEC_SUCCESS(cs->c,
387 AllocateSharedMemory(&cs->context, &shm,
388 size_allocation, TEEC_MEM_INPUT));
389
390 TEEC_ReleaseSharedMemory(&shm);
Jens Wiklander72c55452016-10-27 20:44:35 +0200391out_final:
Pascal Brandc639ac82015-07-02 08:53:34 +0200392 TEEC_FinalizeContext(&cs->context);
393 }
Jens Wiklander72c55452016-10-27 20:44:35 +0200394out:
Pascal Brandc639ac82015-07-02 08:53:34 +0200395 Do_ADBG_EndSubCase(cs->c, "AllocateSameMemory_twice");
396}
397
398static void RegisterSameMemory_twice(struct xtest_session *cs)
399{
400 Do_ADBG_BeginSubCase(cs->c, "RegisterSameMemory_twice");
401 {
402 uint8_t val[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100403 TEEC_SharedMemory shm = { };
Pascal Brandc639ac82015-07-02 08:53:34 +0200404
Jens Wiklander72c55452016-10-27 20:44:35 +0200405 if (!ADBG_EXPECT(cs->c, TEEC_SUCCESS,
406 TEEC_InitializeContext(_device, &cs->context)))
407 goto out;
Pascal Brandc639ac82015-07-02 08:53:34 +0200408
409 shm.buffer = val;
Jens Wiklander72c55452016-10-27 20:44:35 +0200410 if (!ADBG_EXPECT_TEEC_SUCCESS(cs->c,
Pascal Brandc639ac82015-07-02 08:53:34 +0200411 RegisterSharedMemory(&cs->context, &shm, sizeof(val),
Jens Wiklander72c55452016-10-27 20:44:35 +0200412 TEEC_MEM_INPUT)))
413 goto out_final;
Pascal Brandc639ac82015-07-02 08:53:34 +0200414
415 ADBG_EXPECT_TEEC_SUCCESS(cs->c,
416 RegisterSharedMemory(&cs->context, &shm, sizeof(val),
417 TEEC_MEM_INPUT));
418
419 TEEC_ReleaseSharedMemory(&shm);
Jens Wiklander72c55452016-10-27 20:44:35 +0200420out_final:
Pascal Brandc639ac82015-07-02 08:53:34 +0200421 TEEC_FinalizeContext(&cs->context);
422 }
Jens Wiklander72c55452016-10-27 20:44:35 +0200423out:
Pascal Brandc639ac82015-07-02 08:53:34 +0200424 Do_ADBG_EndSubCase(cs->c, "RegisterSameMemory_twice");
425}
426
Jerome Forissiercefbe022017-05-23 11:02:35 +0200427#ifndef MIN
428#define MIN(a,b) ((a) < (b) ? (a) : (b))
429#endif
430
431static void Allocate_sharedMemory_32k(struct xtest_session *cs)
Pascal Brandc639ac82015-07-02 08:53:34 +0200432{
Jerome Forissiercefbe022017-05-23 11:02:35 +0200433 Do_ADBG_BeginSubCase(cs->c, "Allocate_sharedMemory_32k");
Pascal Brandc639ac82015-07-02 08:53:34 +0200434 {
Jerome Forissierde0c4432017-05-23 11:38:08 +0200435 size_t size = MIN(32 * 1024,
436 TEEC_CONFIG_SHAREDMEM_MAX_SIZE);
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100437 TEEC_SharedMemory shm = { };
Pascal Brandc639ac82015-07-02 08:53:34 +0200438
Jens Wiklander72c55452016-10-27 20:44:35 +0200439 if (!ADBG_EXPECT(cs->c, TEEC_SUCCESS,
440 TEEC_InitializeContext(_device, &cs->context)))
441 goto out;
Pascal Brandc639ac82015-07-02 08:53:34 +0200442
Jens Wiklander72c55452016-10-27 20:44:35 +0200443 if (!ADBG_EXPECT_TEEC_SUCCESS(cs->c,
Jerome Forissiercefbe022017-05-23 11:02:35 +0200444 AllocateSharedMemory(&cs->context, &shm, size,
Jens Wiklander72c55452016-10-27 20:44:35 +0200445 TEEC_MEM_INPUT)))
446 goto out_final;
Pascal Brandc639ac82015-07-02 08:53:34 +0200447
448 TEEC_ReleaseSharedMemory(&shm);
Jens Wiklander72c55452016-10-27 20:44:35 +0200449out_final:
450 TEEC_FinalizeContext(&cs->context);
Pascal Brandc639ac82015-07-02 08:53:34 +0200451 }
Jens Wiklander72c55452016-10-27 20:44:35 +0200452out:
Jerome Forissiercefbe022017-05-23 11:02:35 +0200453 Do_ADBG_EndSubCase(cs->c, "Allocate_sharedMemory_32k");
Pascal Brandc639ac82015-07-02 08:53:34 +0200454}
455
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100456#define SHM_32K_SIZE MIN(32 * 1024, TEEC_CONFIG_SHAREDMEM_MAX_SIZE)
457
Jerome Forissiercefbe022017-05-23 11:02:35 +0200458static void Register_sharedMemory_32k(struct xtest_session *cs)
Pascal Brandc639ac82015-07-02 08:53:34 +0200459{
Jerome Forissiercefbe022017-05-23 11:02:35 +0200460 Do_ADBG_BeginSubCase(cs->c, "Register_sharedMemory_32k");
Pascal Brandc639ac82015-07-02 08:53:34 +0200461 {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100462 uint8_t val[SHM_32K_SIZE] = { };
463 TEEC_SharedMemory shm = { };
Pascal Brandc639ac82015-07-02 08:53:34 +0200464
Jens Wiklander72c55452016-10-27 20:44:35 +0200465 if (!ADBG_EXPECT(cs->c, TEEC_SUCCESS,
466 TEEC_InitializeContext(_device, &cs->context)))
467 goto out;
Pascal Brandc639ac82015-07-02 08:53:34 +0200468
469 shm.buffer = val;
Jens Wiklander72c55452016-10-27 20:44:35 +0200470 if (!ADBG_EXPECT_TEEC_SUCCESS(cs->c,
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100471 RegisterSharedMemory(&cs->context, &shm, SHM_32K_SIZE,
Jens Wiklander72c55452016-10-27 20:44:35 +0200472 TEEC_MEM_INPUT)))
473 goto out_final;
Pascal Brandc639ac82015-07-02 08:53:34 +0200474
475 TEEC_ReleaseSharedMemory(&shm);
Jens Wiklander72c55452016-10-27 20:44:35 +0200476out_final:
Pascal Brandc639ac82015-07-02 08:53:34 +0200477 TEEC_FinalizeContext(&cs->context);
478 }
Jens Wiklander72c55452016-10-27 20:44:35 +0200479out:
Jerome Forissiercefbe022017-05-23 11:02:35 +0200480 Do_ADBG_EndSubCase(cs->c, "Register_sharedMemory_32k");
Pascal Brandc639ac82015-07-02 08:53:34 +0200481}
482
483static void xtest_teec_TEE(ADBG_Case_t *c)
484{
485 struct xtest_session connection = { c };
486
487 CloseSession_null(&connection);
488
489 Allocate_In(&connection);
490
491 Allocate_out_of_memory(&connection);
492
493 OpenSession_error_notExistingTA(&connection);
494
495 Allocate_InOut(&connection);
496
497 Register_In(&connection);
498
499 Register_notZeroLength_Out(&connection);
500
501 Register_InOut(&connection);
502
503 Register_zeroLength_Out(&connection);
504
505 Allocate_Out(&connection);
506
507 FinalizeContext_null(&connection);
508
509 InitializeContext_NotExistingTEE(&connection);
510
511 AllocateThenRegister_SameMemory(&connection);
512
513 AllocateSameMemory_twice(&connection);
514
515 RegisterSameMemory_twice(&connection);
516
Jerome Forissiercefbe022017-05-23 11:02:35 +0200517 Allocate_sharedMemory_32k(&connection);
Pascal Brandc639ac82015-07-02 08:53:34 +0200518
Jerome Forissiercefbe022017-05-23 11:02:35 +0200519 Register_sharedMemory_32k(&connection);
Pascal Brandc639ac82015-07-02 08:53:34 +0200520}
521
Jens Wiklander74abfe32017-01-03 14:17:47 +0100522ADBG_CASE_DEFINE(regression, 5006, xtest_teec_TEE,
Jens Wiklander25a57fe2016-12-26 21:46:24 +0100523 "Tests for Global platform TEEC");