aboutsummaryrefslogtreecommitdiffstats
path: root/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-os/0001-core-define-syscall_t-as-void-void.patch
blob: bad7b27c6653583802fee4156e8de7561d6acf5e (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
From f6d17e33e7b95c90a2521cfd37cd5cb511909fc4 Mon Sep 17 00:00:00 2001
From: Jerome Forissier <jerome.forissier@linaro.org>
Date: Thu, 5 Jul 2018 13:07:52 +0200
Subject: [PATCH] core: define syscall_t as void (*)(void)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

syscall_t is currently typedef'ed as TEE_Result (*)(void). It is used to
represent a pointer to any system call, in the syscall table for instance.
As such, the exact type behind syscall_t cannot reflect all the syscalls
since they have different prototypes. The current declaration with a
TEE_Result return type was probably chosen because it was a common
characteristic of all syscalls to return a TEE_Result.

However, this type causes compilation warnings with GCC 8.1:

core/arch/arm/tee/arch_svc.c:43:36: warning: cast between incompatible function types from ‘void (*)(long unsigned int)’ to ‘TEE_Result (*)(void)’ {aka ‘unsigned int (*)(void)’} [-Wcast-function-type]
 #define SYSCALL_ENTRY(_fn) { .fn = (syscall_t)_fn }
                                    ^
core/arch/arm/tee/arch_svc.c:50:2: note: in expansion of macro ‘SYSCALL_ENTRY’
  SYSCALL_ENTRY(syscall_sys_return),
  ^~~~~~~~~~~~~

The solution is to use 'void (*)(void)' instead, as explained in the GCC
documentation:

 -Wcast-function-type

  Warn when a function pointer is cast to an incompatible function
  pointer. [...] The function type void (*) (void) is special and matches
  everything, which can be used to suppress this warning. [...]

Link: [1] https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
Acked-by: Jens Wiklander <jens.wiklander@linaro.org>
---
 core/arch/arm/tee/arch_svc.c         | 2 +-
 core/arch/arm/tee/arch_svc_private.h | 7 +++++--
 2 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/core/arch/arm/tee/arch_svc.c b/core/arch/arm/tee/arch_svc.c
index eb142ec..b2dd193 100644
--- a/core/arch/arm/tee/arch_svc.c
+++ b/core/arch/arm/tee/arch_svc.c
@@ -208,7 +208,7 @@ void __weak tee_svc_handler(struct thread_svc_regs *regs)
 	}
 
 	if (scn > TEE_SCN_MAX)
-		scf = syscall_not_supported;
+		scf = (syscall_t)syscall_not_supported;
 	else
 		scf = tee_svc_syscall_table[scn].fn;
 
diff --git a/core/arch/arm/tee/arch_svc_private.h b/core/arch/arm/tee/arch_svc_private.h
index c0b3a73..695e733 100644
--- a/core/arch/arm/tee/arch_svc_private.h
+++ b/core/arch/arm/tee/arch_svc_private.h
@@ -7,8 +7,11 @@
 
 #include <tee_api_types.h>
 
-/* void argument but in reality it can be any number of arguments */
-typedef TEE_Result (*syscall_t)(void);
+/*
+ * Generic "pointer to function" type. Actual syscalls take zero or more
+ * arguments and return TEE_Result.
+ */
+typedef void (*syscall_t)(void);
 
 /* Helper function for tee_svc_handler() */
 uint32_t tee_svc_do_call(struct thread_svc_regs *regs, syscall_t func);
-- 
2.7.4