Skip to content

Commit 121b32a

Browse files
Brian GerstKAGA-KOKO
authored andcommitted
x86/entry/32: Use IA32-specific wrappers for syscalls taking 64-bit arguments
For the 32-bit syscall interface, 64-bit arguments (loff_t) are passed via a pair of 32-bit registers. These register pairs end up in consecutive stack slots, which matches the C ABI for 64-bit arguments. But when accessing the registers directly from pt_regs, the wrapper needs to manually reassemble the 64-bit value. These wrappers already exist for 32-bit compat, so make them available to 32-bit native in preparation for enabling pt_regs-based syscalls. Signed-off-by: Brian Gerst <[email protected]> Signed-off-by: Thomas Gleixner <[email protected]> Reviewed-by: Dominik Brodowski <[email protected]> Link: https://lkml.kernel.org/r/[email protected]
1 parent 866128a commit 121b32a

File tree

5 files changed

+79
-75
lines changed

5 files changed

+79
-75
lines changed

arch/x86/entry/syscalls/syscall_32.tbl

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -191,8 +191,8 @@
191191
177 i386 rt_sigtimedwait sys_rt_sigtimedwait_time32 compat_sys_rt_sigtimedwait_time32
192192
178 i386 rt_sigqueueinfo sys_rt_sigqueueinfo compat_sys_rt_sigqueueinfo
193193
179 i386 rt_sigsuspend sys_rt_sigsuspend compat_sys_rt_sigsuspend
194-
180 i386 pread64 sys_pread64 compat_sys_ia32_pread64
195-
181 i386 pwrite64 sys_pwrite64 compat_sys_ia32_pwrite64
194+
180 i386 pread64 sys_ia32_pread64
195+
181 i386 pwrite64 sys_ia32_pwrite64
196196
182 i386 chown sys_chown16
197197
183 i386 getcwd sys_getcwd
198198
184 i386 capget sys_capget
@@ -204,8 +204,8 @@
204204
190 i386 vfork sys_vfork
205205
191 i386 ugetrlimit sys_getrlimit compat_sys_getrlimit
206206
192 i386 mmap2 sys_mmap_pgoff
207-
193 i386 truncate64 sys_truncate64 compat_sys_ia32_truncate64
208-
194 i386 ftruncate64 sys_ftruncate64 compat_sys_ia32_ftruncate64
207+
193 i386 truncate64 sys_ia32_truncate64
208+
194 i386 ftruncate64 sys_ia32_ftruncate64
209209
195 i386 stat64 sys_stat64 compat_sys_ia32_stat64
210210
196 i386 lstat64 sys_lstat64 compat_sys_ia32_lstat64
211211
197 i386 fstat64 sys_fstat64 compat_sys_ia32_fstat64
@@ -236,7 +236,7 @@
236236
# 222 is unused
237237
# 223 is unused
238238
224 i386 gettid sys_gettid
239-
225 i386 readahead sys_readahead compat_sys_ia32_readahead
239+
225 i386 readahead sys_ia32_readahead
240240
226 i386 setxattr sys_setxattr
241241
227 i386 lsetxattr sys_lsetxattr
242242
228 i386 fsetxattr sys_fsetxattr
@@ -261,7 +261,7 @@
261261
247 i386 io_getevents sys_io_getevents_time32
262262
248 i386 io_submit sys_io_submit compat_sys_io_submit
263263
249 i386 io_cancel sys_io_cancel
264-
250 i386 fadvise64 sys_fadvise64 compat_sys_ia32_fadvise64
264+
250 i386 fadvise64 sys_ia32_fadvise64
265265
# 251 is available for reuse (was briefly sys_set_zone_reclaim)
266266
252 i386 exit_group sys_exit_group
267267
253 i386 lookup_dcookie sys_lookup_dcookie compat_sys_lookup_dcookie
@@ -283,7 +283,7 @@
283283
269 i386 fstatfs64 sys_fstatfs64 compat_sys_fstatfs64
284284
270 i386 tgkill sys_tgkill
285285
271 i386 utimes sys_utimes_time32
286-
272 i386 fadvise64_64 sys_fadvise64_64 compat_sys_ia32_fadvise64_64
286+
272 i386 fadvise64_64 sys_ia32_fadvise64_64
287287
273 i386 vserver
288288
274 i386 mbind sys_mbind
289289
275 i386 get_mempolicy sys_get_mempolicy compat_sys_get_mempolicy
@@ -325,7 +325,7 @@
325325
311 i386 set_robust_list sys_set_robust_list compat_sys_set_robust_list
326326
312 i386 get_robust_list sys_get_robust_list compat_sys_get_robust_list
327327
313 i386 splice sys_splice
328-
314 i386 sync_file_range sys_sync_file_range compat_sys_ia32_sync_file_range
328+
314 i386 sync_file_range sys_ia32_sync_file_range
329329
315 i386 tee sys_tee
330330
316 i386 vmsplice sys_vmsplice compat_sys_vmsplice
331331
317 i386 move_pages sys_move_pages compat_sys_move_pages
@@ -335,7 +335,7 @@
335335
321 i386 signalfd sys_signalfd compat_sys_signalfd
336336
322 i386 timerfd_create sys_timerfd_create
337337
323 i386 eventfd sys_eventfd
338-
324 i386 fallocate sys_fallocate compat_sys_ia32_fallocate
338+
324 i386 fallocate sys_ia32_fallocate
339339
325 i386 timerfd_settime sys_timerfd_settime32
340340
326 i386 timerfd_gettime sys_timerfd_gettime32
341341
327 i386 signalfd4 sys_signalfd4 compat_sys_signalfd4

arch/x86/ia32/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
# Makefile for the ia32 kernel emulation subsystem.
44
#
55

6-
obj-$(CONFIG_IA32_EMULATION) := sys_ia32.o ia32_signal.o
6+
obj-$(CONFIG_IA32_EMULATION) := ia32_signal.o
77

88
obj-$(CONFIG_IA32_AOUT) += ia32_aout.o
99

arch/x86/kernel/Makefile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ obj-y += setup.o x86_init.o i8259.o irqinit.o
5353
obj-$(CONFIG_JUMP_LABEL) += jump_label.o
5454
obj-$(CONFIG_IRQ_WORK) += irq_work.o
5555
obj-y += probe_roms.o
56+
obj-$(CONFIG_X86_32) += sys_ia32.o
57+
obj-$(CONFIG_IA32_EMULATION) += sys_ia32.o
5658
obj-$(CONFIG_X86_64) += sys_x86_64.o
5759
obj-$(CONFIG_X86_ESPFIX64) += espfix_64.o
5860
obj-$(CONFIG_SYSFS) += ksysfs.o

arch/x86/ia32/sys_ia32.c renamed to arch/x86/kernel/sys_ia32.c

Lines changed: 66 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -51,20 +51,80 @@
5151

5252
#define AA(__x) ((unsigned long)(__x))
5353

54-
55-
COMPAT_SYSCALL_DEFINE3(ia32_truncate64, const char __user *, filename,
56-
unsigned long, offset_low, unsigned long, offset_high)
54+
SYSCALL_DEFINE3(ia32_truncate64, const char __user *, filename,
55+
unsigned long, offset_low, unsigned long, offset_high)
5756
{
5857
return ksys_truncate(filename,
5958
((loff_t) offset_high << 32) | offset_low);
6059
}
6160

62-
COMPAT_SYSCALL_DEFINE3(ia32_ftruncate64, unsigned int, fd,
63-
unsigned long, offset_low, unsigned long, offset_high)
61+
SYSCALL_DEFINE3(ia32_ftruncate64, unsigned int, fd,
62+
unsigned long, offset_low, unsigned long, offset_high)
6463
{
6564
return ksys_ftruncate(fd, ((loff_t) offset_high << 32) | offset_low);
6665
}
6766

67+
/* warning: next two assume little endian */
68+
SYSCALL_DEFINE5(ia32_pread64, unsigned int, fd, char __user *, ubuf,
69+
u32, count, u32, poslo, u32, poshi)
70+
{
71+
return ksys_pread64(fd, ubuf, count,
72+
((loff_t)AA(poshi) << 32) | AA(poslo));
73+
}
74+
75+
SYSCALL_DEFINE5(ia32_pwrite64, unsigned int, fd, const char __user *, ubuf,
76+
u32, count, u32, poslo, u32, poshi)
77+
{
78+
return ksys_pwrite64(fd, ubuf, count,
79+
((loff_t)AA(poshi) << 32) | AA(poslo));
80+
}
81+
82+
83+
/*
84+
* Some system calls that need sign extended arguments. This could be
85+
* done by a generic wrapper.
86+
*/
87+
SYSCALL_DEFINE6(ia32_fadvise64_64, int, fd, __u32, offset_low,
88+
__u32, offset_high, __u32, len_low, __u32, len_high,
89+
int, advice)
90+
{
91+
return ksys_fadvise64_64(fd,
92+
(((u64)offset_high)<<32) | offset_low,
93+
(((u64)len_high)<<32) | len_low,
94+
advice);
95+
}
96+
97+
SYSCALL_DEFINE4(ia32_readahead, int, fd, unsigned int, off_lo,
98+
unsigned int, off_hi, size_t, count)
99+
{
100+
return ksys_readahead(fd, ((u64)off_hi << 32) | off_lo, count);
101+
}
102+
103+
SYSCALL_DEFINE6(ia32_sync_file_range, int, fd, unsigned int, off_low,
104+
unsigned int, off_hi, unsigned int, n_low,
105+
unsigned int, n_hi, int, flags)
106+
{
107+
return ksys_sync_file_range(fd,
108+
((u64)off_hi << 32) | off_low,
109+
((u64)n_hi << 32) | n_low, flags);
110+
}
111+
112+
SYSCALL_DEFINE5(ia32_fadvise64, int, fd, unsigned int, offset_lo,
113+
unsigned int, offset_hi, size_t, len, int, advice)
114+
{
115+
return ksys_fadvise64_64(fd, ((u64)offset_hi << 32) | offset_lo,
116+
len, advice);
117+
}
118+
119+
SYSCALL_DEFINE6(ia32_fallocate, int, fd, int, mode,
120+
unsigned int, offset_lo, unsigned int, offset_hi,
121+
unsigned int, len_lo, unsigned int, len_hi)
122+
{
123+
return ksys_fallocate(fd, mode, ((u64)offset_hi << 32) | offset_lo,
124+
((u64)len_hi << 32) | len_lo);
125+
}
126+
127+
#ifdef CONFIG_IA32_EMULATION
68128
/*
69129
* Another set for IA32/LFS -- x86_64 struct stat is different due to
70130
* support for 64bit inode numbers.
@@ -170,66 +230,6 @@ COMPAT_SYSCALL_DEFINE1(ia32_mmap, struct mmap_arg_struct32 __user *, arg)
170230
a.offset>>PAGE_SHIFT);
171231
}
172232

173-
/* warning: next two assume little endian */
174-
COMPAT_SYSCALL_DEFINE5(ia32_pread64, unsigned int, fd, char __user *, ubuf,
175-
u32, count, u32, poslo, u32, poshi)
176-
{
177-
return ksys_pread64(fd, ubuf, count,
178-
((loff_t)AA(poshi) << 32) | AA(poslo));
179-
}
180-
181-
COMPAT_SYSCALL_DEFINE5(ia32_pwrite64, unsigned int, fd, const char __user *, ubuf,
182-
u32, count, u32, poslo, u32, poshi)
183-
{
184-
return ksys_pwrite64(fd, ubuf, count,
185-
((loff_t)AA(poshi) << 32) | AA(poslo));
186-
}
187-
188-
189-
/*
190-
* Some system calls that need sign extended arguments. This could be
191-
* done by a generic wrapper.
192-
*/
193-
COMPAT_SYSCALL_DEFINE6(ia32_fadvise64_64, int, fd, __u32, offset_low,
194-
__u32, offset_high, __u32, len_low, __u32, len_high,
195-
int, advice)
196-
{
197-
return ksys_fadvise64_64(fd,
198-
(((u64)offset_high)<<32) | offset_low,
199-
(((u64)len_high)<<32) | len_low,
200-
advice);
201-
}
202-
203-
COMPAT_SYSCALL_DEFINE4(ia32_readahead, int, fd, unsigned int, off_lo,
204-
unsigned int, off_hi, size_t, count)
205-
{
206-
return ksys_readahead(fd, ((u64)off_hi << 32) | off_lo, count);
207-
}
208-
209-
COMPAT_SYSCALL_DEFINE6(ia32_sync_file_range, int, fd, unsigned int, off_low,
210-
unsigned int, off_hi, unsigned int, n_low,
211-
unsigned int, n_hi, int, flags)
212-
{
213-
return ksys_sync_file_range(fd,
214-
((u64)off_hi << 32) | off_low,
215-
((u64)n_hi << 32) | n_low, flags);
216-
}
217-
218-
COMPAT_SYSCALL_DEFINE5(ia32_fadvise64, int, fd, unsigned int, offset_lo,
219-
unsigned int, offset_hi, size_t, len, int, advice)
220-
{
221-
return ksys_fadvise64_64(fd, ((u64)offset_hi << 32) | offset_lo,
222-
len, advice);
223-
}
224-
225-
COMPAT_SYSCALL_DEFINE6(ia32_fallocate, int, fd, int, mode,
226-
unsigned int, offset_lo, unsigned int, offset_hi,
227-
unsigned int, len_lo, unsigned int, len_hi)
228-
{
229-
return ksys_fallocate(fd, mode, ((u64)offset_hi << 32) | offset_lo,
230-
((u64)len_hi << 32) | len_lo);
231-
}
232-
233233
/*
234234
* The 32-bit clone ABI is CONFIG_CLONE_BACKWARDS
235235
*/
@@ -252,3 +252,4 @@ COMPAT_SYSCALL_DEFINE5(ia32_clone, unsigned long, clone_flags,
252252

253253
return _do_fork(&args);
254254
}
255+
#endif /* CONFIG_IA32_EMULATION */

arch/x86/um/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ obj-y += checksum_32.o syscalls_32.o
2121
obj-$(CONFIG_ELF_CORE) += elfcore.o
2222

2323
subarch-y = ../lib/string_32.o ../lib/atomic64_32.o ../lib/atomic64_cx8_32.o
24+
subarch-y += ../kernel/sys_ia32.o
2425

2526
else
2627

0 commit comments

Comments
 (0)