aboutsummaryrefslogtreecommitdiff
path: root/arch/arm64/kernel/sys32.S
blob: 5e4dc93cc31fd19c36d2c073c5bc59aff4f1b716 (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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
/*
 * Compat system call wrappers
 *
 * Copyright (C) 2012 ARM Ltd.
 * Authors: Will Deacon <will.deacon@arm.com>
 *	    Catalin Marinas <catalin.marinas@arm.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#include <linux/linkage.h>

#include <asm/assembler.h>
#include <asm/asm-offsets.h>

/*
 * System call wrappers for the AArch32 compatibility layer.
 */
compat_sys_fork_wrapper:
	mov	x0, sp
	b	compat_sys_fork
ENDPROC(compat_sys_fork_wrapper)

compat_sys_vfork_wrapper:
	mov	x0, sp
	b	compat_sys_vfork
ENDPROC(compat_sys_vfork_wrapper)

compat_sys_execve_wrapper:
	mov	x3, sp
	b	compat_sys_execve
ENDPROC(compat_sys_execve_wrapper)

compat_sys_clone_wrapper:
	mov	x5, sp
	b	compat_sys_clone
ENDPROC(compat_sys_clone_wrapper)

compat_sys_sigreturn_wrapper:
	mov	x0, sp
	mov	x27, #0		// prevent syscall restart handling (why)
	b	compat_sys_sigreturn
ENDPROC(compat_sys_sigreturn_wrapper)

compat_sys_rt_sigreturn_wrapper:
	mov	x0, sp
	mov	x27, #0		// prevent syscall restart handling (why)
	b	compat_sys_rt_sigreturn
ENDPROC(compat_sys_rt_sigreturn_wrapper)

compat_sys_sigaltstack_wrapper:
	ldr	x2, [sp, #S_COMPAT_SP]
	b	compat_do_sigaltstack
ENDPROC(compat_sys_sigaltstack_wrapper)

compat_sys_statfs64_wrapper:
	mov	w3, #84
	cmp	w1, #88
	csel	w1, w3, w1, eq
	b	compat_sys_statfs64
ENDPROC(compat_sys_statfs64_wrapper)

compat_sys_fstatfs64_wrapper:
	mov	w3, #84
	cmp	w1, #88
	csel	w1, w3, w1, eq
	b	compat_sys_fstatfs64
ENDPROC(compat_sys_fstatfs64_wrapper)

/*
 * Wrappers for AArch32 syscalls that either take 64-bit parameters
 * in registers or that take 32-bit parameters which require sign
 * extension.
 */
compat_sys_lseek_wrapper:
	sxtw	x1, w1
	b	sys_lseek
ENDPROC(compat_sys_lseek_wrapper)

compat_sys_pread64_wrapper:
	orr	x3, x4, x5, lsl #32
	b	sys_pread64
ENDPROC(compat_sys_pread64_wrapper)

compat_sys_pwrite64_wrapper:
	orr	x3, x4, x5, lsl #32
	b	sys_pwrite64
ENDPROC(compat_sys_pwrite64_wrapper)

compat_sys_truncate64_wrapper:
	orr	x1, x2, x3, lsl #32
	b	sys_truncate
ENDPROC(compat_sys_truncate64_wrapper)

compat_sys_ftruncate64_wrapper:
	orr	x1, x2, x3, lsl #32
	b	sys_ftruncate
ENDPROC(compat_sys_ftruncate64_wrapper)

compat_sys_readahead_wrapper:
	orr	x1, x2, x3, lsl #32
	mov	w2, w4
	b	sys_readahead
ENDPROC(compat_sys_readahead_wrapper)

compat_sys_lookup_dcookie:
	orr	x0, x0, x1, lsl #32
	mov	w1, w2
	mov	w2, w3
	b	sys_lookup_dcookie
ENDPROC(compat_sys_lookup_dcookie)

compat_sys_fadvise64_64_wrapper:
	mov	w6, w1
	orr	x1, x2, x3, lsl #32
	orr	x2, x4, x5, lsl #32
	mov	w3, w6
	b	sys_fadvise64_64
ENDPROC(compat_sys_fadvise64_64_wrapper)

compat_sys_sync_file_range2_wrapper:
	orr	x2, x2, x3, lsl #32
	orr	x3, x4, x5, lsl #32
	b	sys_sync_file_range2
ENDPROC(compat_sys_sync_file_range2_wrapper)

compat_sys_fallocate_wrapper:
	orr	x2, x2, x3, lsl #32
	orr	x3, x4, x5, lsl #32
	b	sys_fallocate
ENDPROC(compat_sys_fallocate_wrapper)

compat_sys_fanotify_mark_wrapper:
	orr	x2, x2, x3, lsl #32
	mov	w3, w4
	mov	w4, w5
	b	sys_fanotify_mark
ENDPROC(compat_sys_fanotify_mark_wrapper)

/*
 * Use the compat system call wrappers.
 */
#define sys_fork		compat_sys_fork_wrapper
#define sys_open		compat_sys_open
#define sys_execve		compat_sys_execve_wrapper
#define sys_lseek		compat_sys_lseek_wrapper
#define sys_mount		compat_sys_mount
#define sys_ptrace		compat_sys_ptrace
#define sys_times		compat_sys_times
#define sys_ioctl		compat_sys_ioctl
#define sys_fcntl		compat_sys_fcntl
#define sys_ustat		compat_sys_ustat
#define sys_sigaction		compat_sys_sigaction
#define sys_sigsuspend		compat_sys_sigsuspend
#define sys_sigpending		compat_sys_sigpending
#define sys_setrlimit		compat_sys_setrlimit
#define sys_getrusage		compat_sys_getrusage
#define sys_gettimeofday	compat_sys_gettimeofday
#define sys_settimeofday	compat_sys_settimeofday
#define sys_statfs		compat_sys_statfs
#define sys_fstatfs		compat_sys_fstatfs
#define sys_setitimer		compat_sys_setitimer
#define sys_getitimer		compat_sys_getitimer
#define sys_newstat		compat_sys_newstat
#define sys_newlstat		compat_sys_newlstat
#define sys_newfstat		compat_sys_newfstat
#define sys_wait4		compat_sys_wait4
#define sys_sysinfo		compat_sys_sysinfo
#define sys_sigreturn		compat_sys_sigreturn_wrapper
#define sys_clone		compat_sys_clone_wrapper
#define sys_adjtimex		compat_sys_adjtimex
#define sys_sigprocmask		compat_sys_sigprocmask
#define sys_getdents		compat_sys_getdents
#define sys_select		compat_sys_select
#define sys_readv		compat_sys_readv
#define sys_writev		compat_sys_writev
#define sys_sysctl		compat_sys_sysctl
#define sys_sched_rr_get_interval compat_sys_sched_rr_get_interval
#define sys_nanosleep		compat_sys_nanosleep
#define sys_rt_sigreturn	compat_sys_rt_sigreturn_wrapper
#define sys_rt_sigaction	compat_sys_rt_sigaction
#define sys_rt_sigprocmask	compat_sys_rt_sigprocmask
#define sys_rt_sigpending	compat_sys_rt_sigpending
#define sys_rt_sigtimedwait	compat_sys_rt_sigtimedwait
#define sys_rt_sigqueueinfo	compat_sys_rt_sigqueueinfo
#define sys_rt_sigsuspend	compat_sys_rt_sigsuspend
#define sys_pread64		compat_sys_pread64_wrapper
#define sys_pwrite64		compat_sys_pwrite64_wrapper
#define sys_sigaltstack		compat_sys_sigaltstack_wrapper
#define sys_sendfile		compat_sys_sendfile
#define sys_vfork		compat_sys_vfork_wrapper
#define sys_getrlimit		compat_sys_getrlimit
#define sys_mmap2		sys_mmap_pgoff
#define sys_truncate64		compat_sys_truncate64_wrapper
#define sys_ftruncate64		compat_sys_ftruncate64_wrapper
#define sys_getdents64		compat_sys_getdents64
#define sys_fcntl64		compat_sys_fcntl64
#define sys_readahead		compat_sys_readahead_wrapper
#define sys_futex		compat_sys_futex
#define sys_sched_setaffinity	compat_sys_sched_setaffinity
#define sys_sched_getaffinity	compat_sys_sched_getaffinity
#define sys_io_setup		compat_sys_io_setup
#define sys_io_getevents	compat_sys_io_getevents
#define sys_io_submit		compat_sys_io_submit
#define sys_lookup_dcookie	compat_sys_lookup_dcookie
#define sys_timer_create	compat_sys_timer_create
#define sys_timer_settime	compat_sys_timer_settime
#define sys_timer_gettime	compat_sys_timer_gettime
#define sys_clock_settime	compat_sys_clock_settime
#define sys_clock_gettime	compat_sys_clock_gettime
#define sys_clock_getres	compat_sys_clock_getres
#define sys_clock_nanosleep	compat_sys_clock_nanosleep
#define sys_statfs64		compat_sys_statfs64_wrapper
#define sys_fstatfs64		compat_sys_fstatfs64_wrapper
#define sys_utimes		compat_sys_utimes
#define sys_fadvise64_64	compat_sys_fadvise64_64_wrapper
#define sys_mq_open		compat_sys_mq_open
#define sys_mq_timedsend	compat_sys_mq_timedsend
#define sys_mq_timedreceive	compat_sys_mq_timedreceive
#define sys_mq_notify		compat_sys_mq_notify
#define sys_mq_getsetattr	compat_sys_mq_getsetattr
#define sys_waitid		compat_sys_waitid
#define sys_recv		compat_sys_recv
#define sys_recvfrom		compat_sys_recvfrom
#define sys_setsockopt		compat_sys_setsockopt
#define sys_getsockopt		compat_sys_getsockopt
#define sys_sendmsg		compat_sys_sendmsg
#define sys_recvmsg		compat_sys_recvmsg
#define sys_semctl		compat_sys_semctl
#define sys_msgsnd		compat_sys_msgsnd
#define sys_msgrcv		compat_sys_msgrcv
#define sys_msgctl		compat_sys_msgctl
#define sys_shmat		compat_sys_shmat
#define sys_shmctl		compat_sys_shmctl
#define sys_keyctl		compat_sys_keyctl
#define sys_semtimedop		compat_sys_semtimedop
#define sys_mbind		compat_sys_mbind
#define sys_get_mempolicy	compat_sys_get_mempolicy
#define sys_set_mempolicy	compat_sys_set_mempolicy
#define sys_openat		compat_sys_openat
#define sys_futimesat		compat_sys_futimesat
#define sys_pselect6		compat_sys_pselect6
#define sys_ppoll		compat_sys_ppoll
#define sys_set_robust_list	compat_sys_set_robust_list
#define sys_get_robust_list	compat_sys_get_robust_list
#define sys_sync_file_range2	compat_sys_sync_file_range2_wrapper
#define sys_vmsplice		compat_sys_vmsplice
#define sys_move_pages		compat_sys_move_pages
#define sys_epoll_pwait		compat_sys_epoll_pwait
#define sys_kexec_load		compat_sys_kexec_load
#define sys_utimensat		compat_sys_utimensat
#define sys_signalfd		compat_sys_signalfd
#define sys_fallocate		compat_sys_fallocate_wrapper
#define sys_timerfd_settime	compat_sys_timerfd_settime
#define sys_timerfd_gettime	compat_sys_timerfd_gettime
#define sys_signalfd4		compat_sys_signalfd4
#define sys_preadv		compat_sys_preadv
#define sys_pwritev		compat_sys_pwritev
#define sys_rt_tgsigqueueinfo	compat_sys_rt_tgsigqueueinfo
#define sys_recvmmsg		compat_sys_recvmmsg
#define sys_fanotify_mark	compat_sys_fanotify_mark_wrapper

#undef __SYSCALL
#define __SYSCALL(x, y)		.quad	y	// x
#define __SYSCALL_COMPAT

/*
 * The system calls table must be 4KB aligned.
 */
	.align	12
ENTRY(compat_sys_call_table)
#include <asm/unistd.h>