]>
Commit | Line | Data |
---|---|---|
2cb7cef9 BS |
1 | From: Gerald Schaefer <geraldsc@de.ibm.com> |
2 | Subject: kernel: Add missing wrapper functions for 31 bit compat syscalls. | |
3 | References: bnc#466462,LTC#51229 | |
4 | ||
5 | Symptom: Some 31 bit system calls not work as expected on 64 bit Linux. | |
6 | Therefore programs like e.g. 31 bit java may not work correctly. | |
7 | Problem: Wrapper functions for the following compat system calls are | |
8 | missing: readahead, sendfile64, tkill, tgkill and | |
9 | keyctl. Due to the missing wrappers, the 31 bit system call | |
10 | parameter registers are not correctly expanded to 64 bit. | |
11 | Solution: Add wrapper functions that do the correct 31 bit to 64 bit | |
12 | conversion. | |
13 | ||
14 | Acked-by: Hannes Reinecke <hare@suse.de> | |
15 | --- | |
16 | arch/s390/kernel/compat_wrapper.S | 38 ++++++++++++++++++++++++++++++++++++++ | |
17 | arch/s390/kernel/syscalls.S | 10 +++++----- | |
18 | 2 files changed, 43 insertions(+), 5 deletions(-) | |
19 | ||
20 | Index: linux-sles11/arch/s390/kernel/compat_wrapper.S | |
21 | =================================================================== | |
22 | --- linux-sles11.orig/arch/s390/kernel/compat_wrapper.S | |
23 | +++ linux-sles11/arch/s390/kernel/compat_wrapper.S | |
24 | @@ -1769,3 +1769,41 @@ sys_dup3_wrapper: | |
25 | sys_epoll_create1_wrapper: | |
26 | lgfr %r2,%r2 # int | |
27 | jg sys_epoll_create1 # branch to system call | |
28 | + | |
29 | + .globl sys32_readahead_wrapper | |
30 | +sys32_readahead_wrapper: | |
31 | + lgfr %r2,%r2 # int | |
32 | + llgfr %r3,%r3 # u32 | |
33 | + llgfr %r4,%r4 # u32 | |
34 | + lgfr %r5,%r5 # s32 | |
35 | + jg sys32_readahead # branch to system call | |
36 | + | |
37 | + .globl sys32_sendfile64_wrapper | |
38 | +sys32_sendfile64_wrapper: | |
39 | + lgfr %r2,%r2 # int | |
40 | + lgfr %r3,%r3 # int | |
41 | + llgtr %r4,%r4 # compat_loff_t * | |
42 | + lgfr %r5,%r5 # s32 | |
43 | + jg sys32_sendfile64 # branch to system call | |
44 | + | |
45 | + .globl sys_tkill_wrapper | |
46 | +sys_tkill_wrapper: | |
47 | + lgfr %r2,%r2 # pid_t | |
48 | + lgfr %r3,%r3 # int | |
49 | + jg sys_tkill # branch to system call | |
50 | + | |
51 | + .globl sys_tgkill_wrapper | |
52 | +sys_tgkill_wrapper: | |
53 | + lgfr %r2,%r2 # pid_t | |
54 | + lgfr %r3,%r3 # pid_t | |
55 | + lgfr %r4,%r4 # int | |
56 | + jg sys_tgkill # branch to system call | |
57 | + | |
58 | + .globl compat_sys_keyctl_wrapper | |
59 | +compat_sys_keyctl_wrapper: | |
60 | + llgfr %r2,%r2 # u32 | |
61 | + llgfr %r3,%r3 # u32 | |
62 | + llgfr %r4,%r4 # u32 | |
63 | + llgfr %r5,%r5 # u32 | |
64 | + llgfr %r6,%r6 # u32 | |
65 | + jg compat_sys_keyctl # branch to system call | |
66 | Index: linux-sles11/arch/s390/kernel/syscalls.S | |
67 | =================================================================== | |
68 | --- linux-sles11.orig/arch/s390/kernel/syscalls.S | |
69 | +++ linux-sles11/arch/s390/kernel/syscalls.S | |
70 | @@ -230,8 +230,8 @@ SYSCALL(sys_mincore,sys_mincore,sys32_mi | |
71 | SYSCALL(sys_madvise,sys_madvise,sys32_madvise_wrapper) | |
72 | SYSCALL(sys_getdents64,sys_getdents64,sys32_getdents64_wrapper) /* 220 */ | |
73 | SYSCALL(sys_fcntl64,sys_ni_syscall,compat_sys_fcntl64_wrapper) | |
74 | -SYSCALL(sys_readahead,sys_readahead,sys32_readahead) | |
75 | -SYSCALL(sys_sendfile64,sys_ni_syscall,sys32_sendfile64) | |
76 | +SYSCALL(sys_readahead,sys_readahead,sys32_readahead_wrapper) | |
77 | +SYSCALL(sys_sendfile64,sys_ni_syscall,sys32_sendfile64_wrapper) | |
78 | SYSCALL(sys_setxattr,sys_setxattr,sys32_setxattr_wrapper) | |
79 | SYSCALL(sys_lsetxattr,sys_lsetxattr,sys32_lsetxattr_wrapper) /* 225 */ | |
80 | SYSCALL(sys_fsetxattr,sys_fsetxattr,sys32_fsetxattr_wrapper) | |
81 | @@ -245,11 +245,11 @@ SYSCALL(sys_removexattr,sys_removexattr, | |
82 | SYSCALL(sys_lremovexattr,sys_lremovexattr,sys32_lremovexattr_wrapper) | |
83 | SYSCALL(sys_fremovexattr,sys_fremovexattr,sys32_fremovexattr_wrapper) /* 235 */ | |
84 | SYSCALL(sys_gettid,sys_gettid,sys_gettid) | |
85 | -SYSCALL(sys_tkill,sys_tkill,sys_tkill) | |
86 | +SYSCALL(sys_tkill,sys_tkill,sys_tkill_wrapper) | |
87 | SYSCALL(sys_futex,sys_futex,compat_sys_futex_wrapper) | |
88 | SYSCALL(sys_sched_setaffinity,sys_sched_setaffinity,sys32_sched_setaffinity_wrapper) | |
89 | SYSCALL(sys_sched_getaffinity,sys_sched_getaffinity,sys32_sched_getaffinity_wrapper) /* 240 */ | |
90 | -SYSCALL(sys_tgkill,sys_tgkill,sys_tgkill) | |
91 | +SYSCALL(sys_tgkill,sys_tgkill,sys_tgkill_wrapper) | |
92 | NI_SYSCALL /* reserved for TUX */ | |
93 | SYSCALL(sys_io_setup,sys_io_setup,sys32_io_setup_wrapper) | |
94 | SYSCALL(sys_io_destroy,sys_io_destroy,sys32_io_destroy_wrapper) | |
95 | @@ -288,7 +288,7 @@ SYSCALL(sys_mq_getsetattr,sys_mq_getseta | |
96 | SYSCALL(sys_kexec_load,sys_kexec_load,compat_sys_kexec_load_wrapper) | |
97 | SYSCALL(sys_add_key,sys_add_key,compat_sys_add_key_wrapper) | |
98 | SYSCALL(sys_request_key,sys_request_key,compat_sys_request_key_wrapper) | |
99 | -SYSCALL(sys_keyctl,sys_keyctl,compat_sys_keyctl) /* 280 */ | |
100 | +SYSCALL(sys_keyctl,sys_keyctl,compat_sys_keyctl_wrapper) /* 280 */ | |
101 | SYSCALL(sys_waitid,sys_waitid,compat_sys_waitid_wrapper) | |
102 | SYSCALL(sys_ioprio_set,sys_ioprio_set,sys_ioprio_set_wrapper) | |
103 | SYSCALL(sys_ioprio_get,sys_ioprio_get,sys_ioprio_get_wrapper) |