From f6d17e33e7b95c90a2521cfd37cd5cb511909fc4 Mon Sep 17 00:00:00 2001 From: Jerome Forissier 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 Acked-by: Jens Wiklander --- 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 -/* 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