xtest: SDP basic tests TA to pseudo TA with SDP memref

This change relies on the OP-TEE core pseudo TA used for pseudo TA
invocation test. Its API is available from pta_invoke_tests.h.

Signed-off-by: Etienne Carriere <etienne.carriere@linaro.org>
Reviewed-by: Jerome Forissier <jerome.forissier@linaro.org>
diff --git a/host/xtest/sdp_basic.c b/host/xtest/sdp_basic.c
index e9d5443..61f33ce 100644
--- a/host/xtest/sdp_basic.c
+++ b/host/xtest/sdp_basic.c
@@ -27,6 +27,7 @@
 
 #include <err.h>
 #include <fcntl.h>
+#include <pta_invoke_tests.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -85,6 +86,13 @@
 
 #define DEFAULT_ION_HEAP_TYPE	ION_HEAP_TYPE_UNMAPPED
 
+enum test_target_ta {
+	TEST_NS_TO_TA,
+	TEST_NS_TO_PTA,
+	TEST_TA_TO_TA,
+	TEST_TA_TO_PTA,
+};
+
 int allocate_ion_buffer(size_t size, int heap_id)
 {
 	struct ion_allocation_data alloc_data;
@@ -142,20 +150,36 @@
 	TEEC_FinalizeContext(&ctx->ctx);
 }
 
-static int create_tee_ctx(struct tee_ctx *ctx)
+static int create_tee_ctx(struct tee_ctx *ctx, enum test_target_ta target_ta)
 {
 	TEEC_Result teerc;
-	TEEC_UUID uuid = TA_SDP_BASIC_UUID;
+	TEEC_UUID ta_uuid = TA_SDP_BASIC_UUID;
+	TEEC_UUID pta_uuid = PTA_INVOKE_TESTS_UUID;
+	TEEC_UUID *uuid;
 	uint32_t err_origin;
 
+	switch (target_ta) {
+	case TEST_NS_TO_TA:
+	case TEST_TA_TO_TA:
+	case TEST_TA_TO_PTA:
+		uuid = &ta_uuid;
+		break;
+	case TEST_NS_TO_PTA:
+		uuid = &pta_uuid;
+		break;
+	default:
+		return -1;
+	}
+
 	teerc = TEEC_InitializeContext(NULL, &ctx->ctx);
 	if (teerc != TEEC_SUCCESS)
 		return -1;
 
-	teerc = TEEC_OpenSession(&ctx->ctx, &ctx->sess, &uuid,
+	teerc = TEEC_OpenSession(&ctx->ctx, &ctx->sess, uuid,
 			       TEEC_LOGIN_PUBLIC, NULL, NULL, &err_origin);
 	if (teerc != TEEC_SUCCESS)
-		fprintf(stderr, "Error: open session to SDP test TA failed %x %d\n",
+		fprintf(stderr, "Error: open session to target test %s failed %x %d\n",
+			(target_ta == TEST_NS_TO_PTA) ? "pTA" : "TA",
 			teerc, err_origin);
 
 	return (teerc == TEEC_SUCCESS) ? 0 : -1;
@@ -200,8 +224,24 @@
 	TEEC_Result teerc;
 	TEEC_Operation op;
 	uint32_t err_origin;
-	unsigned cmd = ind ? TA_SDP_BASIC_CMD_INVOKE_INJECT :
-				TA_SDP_BASIC_CMD_INJECT;
+	unsigned cmd;
+
+	switch (ind) {
+	case TEST_NS_TO_TA:
+		cmd = TA_SDP_BASIC_CMD_INJECT;
+		break;
+	case TEST_TA_TO_TA:
+		cmd = TA_SDP_BASIC_CMD_INVOKE_INJECT;
+		break;
+	case TEST_TA_TO_PTA:
+		cmd = TA_SDP_BASIC_CMD_PTA_INJECT;
+		break;
+	case TEST_NS_TO_PTA:
+		cmd = PTA_INVOKE_TESTS_CMD_COPY_NSEC_TO_SEC;
+		break;
+	default:
+		return -1;
+	}
 
 	memset(&op, 0, sizeof(op));
 	op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
@@ -230,8 +270,24 @@
 	TEEC_Result teerc;
 	TEEC_Operation op;
 	uint32_t err_origin;
-	unsigned cmd = ind ? TA_SDP_BASIC_CMD_INVOKE_TRANSFORM :
-				TA_SDP_BASIC_CMD_TRANSFORM;
+	unsigned cmd;
+
+	switch (ind) {
+	case TEST_NS_TO_TA:
+		cmd = TA_SDP_BASIC_CMD_TRANSFORM;
+		break;
+	case TEST_TA_TO_TA:
+		cmd = TA_SDP_BASIC_CMD_INVOKE_TRANSFORM;
+		break;
+	case TEST_TA_TO_PTA:
+		cmd = TA_SDP_BASIC_CMD_PTA_TRANSFORM;
+		break;
+	case TEST_NS_TO_PTA:
+		cmd = PTA_INVOKE_TESTS_CMD_READ_MODIFY_SEC;
+		break;
+	default:
+		return -1;
+	}
 
 	memset(&op, 0, sizeof(op));
 	op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INOUT,
@@ -255,8 +311,24 @@
 	TEEC_Result teerc;
 	TEEC_Operation op;
 	uint32_t err_origin;
-	unsigned cmd = ind ? TA_SDP_BASIC_CMD_INVOKE_DUMP :
-				TA_SDP_BASIC_CMD_DUMP;
+	unsigned cmd;
+
+	switch (ind) {
+	case TEST_NS_TO_TA:
+		cmd = TA_SDP_BASIC_CMD_DUMP;
+		break;
+	case TEST_TA_TO_TA:
+		cmd = TA_SDP_BASIC_CMD_INVOKE_DUMP;
+		break;
+	case TEST_TA_TO_PTA:
+		cmd = TA_SDP_BASIC_CMD_PTA_DUMP;
+		break;
+	case TEST_NS_TO_PTA:
+		cmd = PTA_INVOKE_TESTS_CMD_COPY_SEC_TO_NSEC;
+		break;
+	default:
+		return -1;
+	}
 
 	memset(&op, 0, sizeof(op));
 	op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INPUT,
@@ -350,7 +422,9 @@
 }
 
 
-static int sdp_basic_test(size_t size, size_t loop, int ion_heap, int rnd_offset)
+static int sdp_basic_test(enum test_target_ta ta,
+			  size_t size, size_t loop, int ion_heap,
+			  int rnd_offset)
 {
 	struct tee_ctx *ctx = NULL;
 	unsigned char *test_buf = NULL;
@@ -389,7 +463,7 @@
 	ctx = malloc(sizeof(*ctx));
 	if (!ctx)
 		goto out;
-	if (create_tee_ctx(ctx))
+	if (create_tee_ctx(ctx, ta))
 		goto out;
 	if (tee_register_buffer(ctx, &shm_ref, fd))
 		goto out;
@@ -408,43 +482,15 @@
 		offset = (unsigned int)*ref_buf;
 
 		/* TA writes into SDP buffer */
-		if (inject_sdp_data(ctx, test_buf, offset, size, shm_ref, 0))
+		if (inject_sdp_data(ctx, test_buf, offset, size, shm_ref, ta))
 			goto out;
 
 		/* TA reads/writes into SDP buffer */
-		if (transform_sdp_data(ctx, offset, size, shm_ref, 0))
+		if (transform_sdp_data(ctx, offset, size, shm_ref, ta))
 			goto out;
 
 		/* TA reads into SDP buffer */
-		if (dump_sdp_data(ctx, test_buf, offset, size, shm_ref, 0))
-			goto out;
-
-		/* check dumped data are the expected ones */
-		if (check_sdp_dumped(ctx, ref_buf, size, test_buf)) {
-			fprintf(stderr, "check SDP data: %d errors\n", err);
-			goto out;
-		}
-	}
-
-	/* invoke trusted application with secure buffer as memref parameter */
-	for (loop_cnt = loop; loop_cnt; loop_cnt--) {
-		/* get an buffer of random-like values */
-		if (get_random_bytes((char *)ref_buf, size))
-			goto out;
-		memcpy(test_buf, ref_buf, size);
-		/* random offset [0 255] */
-		offset = (unsigned int)*ref_buf;
-
-		/* TA writes into SDP buffer */
-		if (inject_sdp_data(ctx, test_buf, offset, size, shm_ref, 1))
-			goto out;
-
-		/* TA reads/writes into SDP buffer */
-		if (transform_sdp_data(ctx, offset, size, shm_ref, 1))
-			goto out;
-
-		/* TA reads into SDP buffer */
-		if (dump_sdp_data(ctx, test_buf, offset, size, shm_ref, 1))
+		if (dump_sdp_data(ctx, test_buf, offset, size, shm_ref, ta))
 			goto out;
 
 		/* check dumped data are the expected ones */
@@ -537,9 +583,19 @@
 		}
 	}
 
-	verbose("Secure Data Path basic accesses from trusted applications\n");
+	verbose("\nSecure Data Path basic accesses: NS invokes SDP TA\n");
+	if (sdp_basic_test(TEST_NS_TO_TA,
+			   test_size, test_loop, ion_heap, rnd_offset))
+		return 1;
 
-	if (sdp_basic_test(test_size, test_loop, ion_heap, rnd_offset))
+	verbose("\nSecure Data Path basic accesses: SDP TA invokes SDP TA\n");
+	if (sdp_basic_test(TEST_TA_TO_TA,
+			   test_size, test_loop, ion_heap, rnd_offset))
+		return 1;
+
+	verbose("\nSecure Data Path basic accesses: SDP TA invokes SDP pTA\n");
+	if (sdp_basic_test(TEST_TA_TO_PTA,
+			   test_size, test_loop, ion_heap, rnd_offset))
 		return 1;
 
 	return 0;