Commit c2e7c3d0 authored by Heiko Carstens's avatar Heiko Carstens

s390/compat: partial parameter conversion within syscall wrappers

Parameter conversion within the system call wrappers is only needed
for parameters which differ in size and have a size of eight bytes on
64 bit.
For system call parameters with a size of less than eight byte the
called system call itself will perform parameter conversion anyway.
So we can save the double conversion of e.g. int parameters.

The only types which need to be converted are therefore pointer and
(unsigned) long parameters.
Signed-off-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
parent ab4f8bba
...@@ -15,6 +15,9 @@ ...@@ -15,6 +15,9 @@
#define COMPAT_SYSCALL_WRAP6(name, ...) \ #define COMPAT_SYSCALL_WRAP6(name, ...) \
COMPAT_SYSCALL_WRAPx(6, _##name, __VA_ARGS__) COMPAT_SYSCALL_WRAPx(6, _##name, __VA_ARGS__)
#define __SC_COMPAT_TYPE(t, a) \
__typeof(__builtin_choose_expr(sizeof(t) > 4, 0L, (t)0)) a
#define __SC_COMPAT_CAST(t, a) \ #define __SC_COMPAT_CAST(t, a) \
({ \ ({ \
long __ReS = a; \ long __ReS = a; \
...@@ -30,10 +33,22 @@ ...@@ -30,10 +33,22 @@
(t)__ReS; \ (t)__ReS; \
}) })
/*
* The COMPAT_SYSCALL_WRAP macro generates system call wrappers to be used by
* compat tasks. These wrappers will only be used for system calls where only
* the system call arguments need sign or zero extension or zeroing of the upper
* 33 bits of pointers.
* Note: since the wrapper function will afterwards call a system call which
* again performs zero and sign extension for all system call arguments with
* a size of less than eight bytes, these compat wrappers only touch those
* system call arguments with a size of eight bytes ((unsigned) long and
* pointers). Zero and sign extension for e.g. int parameters will be done by
* the regular system call wrappers.
*/
#define COMPAT_SYSCALL_WRAPx(x, name, ...) \ #define COMPAT_SYSCALL_WRAPx(x, name, ...) \
asmlinkage long sys##name(__MAP(x,__SC_DECL,__VA_ARGS__)); \ asmlinkage long sys##name(__MAP(x,__SC_DECL,__VA_ARGS__)); \
asmlinkage long compat_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)); \ asmlinkage long compat_sys##name(__MAP(x,__SC_COMPAT_TYPE,__VA_ARGS__));\
asmlinkage long compat_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)) \ asmlinkage long compat_sys##name(__MAP(x,__SC_COMPAT_TYPE,__VA_ARGS__)) \
{ \ { \
return sys##name(__MAP(x,__SC_COMPAT_CAST,__VA_ARGS__)); \ return sys##name(__MAP(x,__SC_COMPAT_CAST,__VA_ARGS__)); \
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment