summaryrefslogtreecommitdiff
path: root/meta-arm/meta-arm/recipes-security/optee/optee-test/ffa_spmc-Add-arm_ffa_user-driver-compatibility-check.patch
blob: d333e860a7ea967ffd374e0886393d9b8365a14c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
From 6734d14cc249af37705129de7874533df9535cd3 Mon Sep 17 00:00:00 2001
From: Gabor Toth <gabor.toth2@arm.com>
Date: Fri, 3 Mar 2023 12:25:58 +0100
Subject: [PATCH 2/2] ffa_spmc: Add arm_ffa_user driver compatibility check

Check the version of the arm_ffa_user Kernel Driver and fail with a
meaningful message if incompatible driver is detected.

Upstream-Status: Backport

Signed-off-by: Gabor Toth <gabor.toth2@arm.com>
Acked-by: Jens Wiklander <jens.wiklander@linaro.org>
---
 host/xtest/ffa_spmc_1000.c | 68 ++++++++++++++++++++++++++++++++++----
 1 file changed, 61 insertions(+), 7 deletions(-)

diff --git a/host/xtest/ffa_spmc_1000.c b/host/xtest/ffa_spmc_1000.c
index 15f4a46..1839d03 100644
--- a/host/xtest/ffa_spmc_1000.c
+++ b/host/xtest/ffa_spmc_1000.c
@@ -1,11 +1,12 @@
 // SPDX-License-Identifier: BSD-3-Clause
 /*
- * Copyright (c) 2022, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2022-2023, Arm Limited and Contributors. All rights reserved.
  */
 #include <fcntl.h>
 #include <ffa.h>
 #include <stdio.h>
 #include <string.h>
+#include <errno.h>
 #include <sys/ioctl.h>
 #include <unistd.h>
 #include "include/uapi/linux/arm_ffa_user.h"
@@ -17,6 +18,10 @@
 #define INCORRECT_ENDPOINT_ID 0xffff
 #define NORMAL_WORLD_ENDPOINT_ID	0
 
+#define FFA_USER_REQ_VER_MAJOR 5
+#define FFA_USER_REQ_VER_MINOR 0
+#define FFA_USER_REQ_VER_PATCH 1
+
 /* Get the 32 least significant bits of a handle.*/
 #define MEM_SHARE_HANDLE_LOW(x) ((x) & 0xffffffff)
 /* Get the 32 most significant bits of a handle.*/
@@ -62,6 +67,50 @@ static struct ffa_ioctl_ep_desc test_endpoint3 = {
 	.uuid_ptr = (uint64_t)test_endpoint3_uuid,
 };
 
+static bool check_ffa_user_version(void)
+{
+	FILE *f = NULL;
+	int ver_major = -1;
+	int ver_minor = -1;
+	int ver_patch = -1;
+	int scan_cnt = 0;
+
+	f = fopen("/sys/module/arm_ffa_user/version", "r");
+	if (f) {
+		scan_cnt = fscanf(f, "%d.%d.%d",
+				  &ver_major, &ver_minor, &ver_patch);
+		fclose(f);
+		if (scan_cnt != 3) {
+			printf("error: failed to parse arm_ffa_user version\n");
+			return false;
+		}
+	} else {
+		printf("error: failed to read arm_ffa_user module info - %s\n",
+		       strerror(errno));
+		return false;
+	}
+
+	if (ver_major != FFA_USER_REQ_VER_MAJOR)
+		goto err;
+
+	if (ver_minor < FFA_USER_REQ_VER_MINOR)
+		goto err;
+
+	if (ver_minor == FFA_USER_REQ_VER_MINOR)
+		if (ver_patch < FFA_USER_REQ_VER_PATCH)
+			goto err;
+
+	return true;
+
+err:
+	printf("error: Incompatible arm_ffa_user driver detected.");
+	printf("Found v%d.%d.%d wanted >= v%d.%d.%d)\n",
+	       ver_major, ver_minor, ver_patch, FFA_USER_REQ_VER_MAJOR,
+		   FFA_USER_REQ_VER_MINOR, FFA_USER_REQ_VER_PATCH);
+
+	return false;
+}
+
 static void close_debugfs(void)
 {
 	int err = 0;
@@ -76,6 +125,9 @@ static void close_debugfs(void)
 
 static bool init_sp_xtest(ADBG_Case_t *c)
 {
+	if (!check_ffa_user_version())
+		return false;
+
 	if (ffa_fd < 0) {
 		ffa_fd = open(FFA_DRIVER_FS_PATH, O_RDWR);
 		if (ffa_fd < 0) {
@@ -83,6 +135,7 @@ static bool init_sp_xtest(ADBG_Case_t *c)
 			return false;
 		}
 	}
+
 	return true;
 }
 
@@ -99,7 +152,7 @@ static uint16_t get_endpoint_id(uint64_t endp)
 	struct ffa_ioctl_ep_desc sid = { .uuid_ptr = endp };
 
 	/* Get ID of destination SP based on UUID */
-	if(ioctl(ffa_fd, FFA_IOC_GET_PART_ID, &sid))
+	if (ioctl(ffa_fd, FFA_IOC_GET_PART_ID, &sid))
 		return INCORRECT_ENDPOINT_ID;
 
 	return sid.id;
@@ -213,14 +266,15 @@ static int set_up_mem(struct ffa_ioctl_ep_desc *endp,
 	rc = share_mem(endpoint, handle);
 	ADBG_EXPECT_COMPARE_SIGNED(c, rc, ==, 0);
 
-	if (!ADBG_EXPECT_TRUE(c, handle != NULL))
-	     return TEEC_ERROR_GENERIC;
+	if (!ADBG_EXPECT_NOT_NULL(c, handle))
+		return TEEC_ERROR_GENERIC;
 
 	/* SP will retrieve the memory region. */
 	memset(args, 0, sizeof(*args));
 	args->dst_id = endpoint;
 	args->args[MEM_SHARE_HANDLE_LOW_INDEX] = MEM_SHARE_HANDLE_LOW(*handle);
-	args->args[MEM_SHARE_HANDLE_HIGH_INDEX] = MEM_SHARE_HANDLE_HIGH(*handle);
+	args->args[MEM_SHARE_HANDLE_HIGH_INDEX] =
+		MEM_SHARE_HANDLE_HIGH(*handle);
 	args->args[MEM_SHARE_HANDLE_ENDPOINT_INDEX] = NORMAL_WORLD_ENDPOINT_ID;
 
 	rc = start_sp_test(endpoint, EP_RETRIEVE, args);
@@ -254,7 +308,7 @@ static void xtest_ffa_spmc_test_1002(ADBG_Case_t *c)
 	rc = start_sp_test(endpoint1_id, EP_TEST_SP, &args);
 	ADBG_EXPECT_COMPARE_SIGNED(c, rc, ==, 0);
 	if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, args.args[0], ==, SPMC_TEST_OK))
-	     goto out;
+		goto out;
 
 	/* Set up memory and have the SP retrieve it. */
 	Do_ADBG_BeginSubCase(c, "Test memory set-up");
@@ -469,7 +523,7 @@ static void xtest_ffa_spmc_test_1005(ADBG_Case_t *c)
 	memset(&args, 0, sizeof(args));
 	args.args[1] = endpoint2;
 	args.args[2] = endpoint3;
-	rc = start_sp_test(endpoint1, EP_SP_MEM_SHARING_MULTI,&args);
+	rc = start_sp_test(endpoint1, EP_SP_MEM_SHARING_MULTI, &args);
 	ADBG_EXPECT_COMPARE_SIGNED(c, rc, ==, 0);
 	ADBG_EXPECT_COMPARE_UNSIGNED(c, args.args[0], ==, SPMC_TEST_OK);
 
-- 
2.39.1.windows.1