xref: /openbmc/linux/arch/mips/kernel/scall32-o32.S (revision 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2)
1*1da177e4SLinus Torvalds/*
2*1da177e4SLinus Torvalds * This file is subject to the terms and conditions of the GNU General Public
3*1da177e4SLinus Torvalds * License.  See the file "COPYING" in the main directory of this archive
4*1da177e4SLinus Torvalds * for more details.
5*1da177e4SLinus Torvalds *
6*1da177e4SLinus Torvalds * Copyright (C) 1995, 96, 97, 98, 99, 2000, 01, 02 by Ralf Baechle
7*1da177e4SLinus Torvalds * Copyright (C) 2001 MIPS Technologies, Inc.
8*1da177e4SLinus Torvalds * Copyright (C) 2004 Thiemo Seufer
9*1da177e4SLinus Torvalds */
10*1da177e4SLinus Torvalds#include <linux/config.h>
11*1da177e4SLinus Torvalds#include <linux/errno.h>
12*1da177e4SLinus Torvalds#include <asm/asm.h>
13*1da177e4SLinus Torvalds#include <asm/asmmacro.h>
14*1da177e4SLinus Torvalds#include <asm/mipsregs.h>
15*1da177e4SLinus Torvalds#include <asm/regdef.h>
16*1da177e4SLinus Torvalds#include <asm/stackframe.h>
17*1da177e4SLinus Torvalds#include <asm/isadep.h>
18*1da177e4SLinus Torvalds#include <asm/sysmips.h>
19*1da177e4SLinus Torvalds#include <asm/thread_info.h>
20*1da177e4SLinus Torvalds#include <asm/unistd.h>
21*1da177e4SLinus Torvalds#include <asm/war.h>
22*1da177e4SLinus Torvalds#include <asm/offset.h>
23*1da177e4SLinus Torvalds
24*1da177e4SLinus Torvalds/* Highest syscall used of any syscall flavour */
25*1da177e4SLinus Torvalds#define MAX_SYSCALL_NO	__NR_O32_Linux + __NR_O32_Linux_syscalls
26*1da177e4SLinus Torvalds
27*1da177e4SLinus Torvalds	.align  5
28*1da177e4SLinus TorvaldsNESTED(handle_sys, PT_SIZE, sp)
29*1da177e4SLinus Torvalds	.set	noat
30*1da177e4SLinus Torvalds	SAVE_SOME
31*1da177e4SLinus Torvalds	STI
32*1da177e4SLinus Torvalds	.set	at
33*1da177e4SLinus Torvalds
34*1da177e4SLinus Torvalds	lw	t1, PT_EPC(sp)		# skip syscall on return
35*1da177e4SLinus Torvalds
36*1da177e4SLinus Torvalds#if defined(CONFIG_BINFMT_IRIX)
37*1da177e4SLinus Torvalds	sltiu	t0, v0, MAX_SYSCALL_NO + 1 # check syscall number
38*1da177e4SLinus Torvalds#else
39*1da177e4SLinus Torvalds	subu	v0, v0, __NR_O32_Linux	# check syscall number
40*1da177e4SLinus Torvalds	sltiu	t0, v0, __NR_O32_Linux_syscalls + 1
41*1da177e4SLinus Torvalds#endif
42*1da177e4SLinus Torvalds	addiu	t1, 4			# skip to next instruction
43*1da177e4SLinus Torvalds	sw	t1, PT_EPC(sp)
44*1da177e4SLinus Torvalds	beqz	t0, illegal_syscall
45*1da177e4SLinus Torvalds
46*1da177e4SLinus Torvalds	sll	t0, v0, 3
47*1da177e4SLinus Torvalds	la	t1, sys_call_table
48*1da177e4SLinus Torvalds	addu	t1, t0
49*1da177e4SLinus Torvalds	lw	t2, (t1)		# syscall routine
50*1da177e4SLinus Torvalds	lw	t3, 4(t1)		# >= 0 if we need stack arguments
51*1da177e4SLinus Torvalds	beqz	t2, illegal_syscall
52*1da177e4SLinus Torvalds
53*1da177e4SLinus Torvalds	sw	a3, PT_R26(sp)		# save a3 for syscall restarting
54*1da177e4SLinus Torvalds	bgez	t3, stackargs
55*1da177e4SLinus Torvalds
56*1da177e4SLinus Torvaldsstack_done:
57*1da177e4SLinus Torvalds	lw	t0, TI_FLAGS($28)	# syscall tracing enabled?
58*1da177e4SLinus Torvalds	li	t1, _TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT
59*1da177e4SLinus Torvalds	and	t0, t1
60*1da177e4SLinus Torvalds	bnez	t0, syscall_trace_entry	# -> yes
61*1da177e4SLinus Torvalds
62*1da177e4SLinus Torvalds	jalr	t2			# Do The Real Thing (TM)
63*1da177e4SLinus Torvalds
64*1da177e4SLinus Torvalds	li	t0, -EMAXERRNO - 1	# error?
65*1da177e4SLinus Torvalds	sltu	t0, t0, v0
66*1da177e4SLinus Torvalds	sw	t0, PT_R7(sp)		# set error flag
67*1da177e4SLinus Torvalds	beqz	t0, 1f
68*1da177e4SLinus Torvalds
69*1da177e4SLinus Torvalds	negu	v0			# error
70*1da177e4SLinus Torvalds	sw	v0, PT_R0(sp)		# set flag for syscall
71*1da177e4SLinus Torvalds					# restarting
72*1da177e4SLinus Torvalds1:	sw	v0, PT_R2(sp)		# result
73*1da177e4SLinus Torvalds
74*1da177e4SLinus Torvaldso32_syscall_exit:
75*1da177e4SLinus Torvalds	local_irq_disable		# make sure need_resched and
76*1da177e4SLinus Torvalds					# signals dont change between
77*1da177e4SLinus Torvalds					# sampling and return
78*1da177e4SLinus Torvalds	lw	a2, TI_FLAGS($28)	# current->work
79*1da177e4SLinus Torvalds	li	t0, _TIF_ALLWORK_MASK
80*1da177e4SLinus Torvalds	and	t0, a2
81*1da177e4SLinus Torvalds	bnez	t0, o32_syscall_exit_work
82*1da177e4SLinus Torvalds
83*1da177e4SLinus Torvalds	j	restore_partial
84*1da177e4SLinus Torvalds
85*1da177e4SLinus Torvaldso32_syscall_exit_work:
86*1da177e4SLinus Torvalds	j	syscall_exit_work_partial
87*1da177e4SLinus Torvalds
88*1da177e4SLinus Torvalds/* ------------------------------------------------------------------------ */
89*1da177e4SLinus Torvalds
90*1da177e4SLinus Torvaldssyscall_trace_entry:
91*1da177e4SLinus Torvalds	SAVE_STATIC
92*1da177e4SLinus Torvalds	move	s0, t2
93*1da177e4SLinus Torvalds	move	a0, sp
94*1da177e4SLinus Torvalds	li	a1, 0
95*1da177e4SLinus Torvalds	jal	do_syscall_trace
96*1da177e4SLinus Torvalds
97*1da177e4SLinus Torvalds	lw	a0, PT_R4(sp)		# Restore argument registers
98*1da177e4SLinus Torvalds	lw	a1, PT_R5(sp)
99*1da177e4SLinus Torvalds	lw	a2, PT_R6(sp)
100*1da177e4SLinus Torvalds	lw	a3, PT_R7(sp)
101*1da177e4SLinus Torvalds	jalr	s0
102*1da177e4SLinus Torvalds
103*1da177e4SLinus Torvalds	li	t0, -EMAXERRNO - 1	# error?
104*1da177e4SLinus Torvalds	sltu	t0, t0, v0
105*1da177e4SLinus Torvalds	sw	t0, PT_R7(sp)		# set error flag
106*1da177e4SLinus Torvalds	beqz	t0, 1f
107*1da177e4SLinus Torvalds
108*1da177e4SLinus Torvalds	negu	v0			# error
109*1da177e4SLinus Torvalds	sw	v0, PT_R0(sp)		# set flag for syscall
110*1da177e4SLinus Torvalds					# restarting
111*1da177e4SLinus Torvalds1:	sw	v0, PT_R2(sp)		# result
112*1da177e4SLinus Torvalds
113*1da177e4SLinus Torvalds	j	syscall_exit
114*1da177e4SLinus Torvalds
115*1da177e4SLinus Torvalds/* ------------------------------------------------------------------------ */
116*1da177e4SLinus Torvalds
117*1da177e4SLinus Torvalds	/*
118*1da177e4SLinus Torvalds	 * More than four arguments.  Try to deal with it by copying the
119*1da177e4SLinus Torvalds	 * stack arguments from the user stack to the kernel stack.
120*1da177e4SLinus Torvalds	 * This Sucks (TM).
121*1da177e4SLinus Torvalds	 */
122*1da177e4SLinus Torvaldsstackargs:
123*1da177e4SLinus Torvalds	lw	t0, PT_R29(sp)		# get old user stack pointer
124*1da177e4SLinus Torvalds
125*1da177e4SLinus Torvalds	/*
126*1da177e4SLinus Torvalds	 * We intentionally keep the kernel stack a little below the top of
127*1da177e4SLinus Torvalds	 * userspace so we don't have to do a slower byte accurate check here.
128*1da177e4SLinus Torvalds	 */
129*1da177e4SLinus Torvalds	lw	t5, TI_ADDR_LIMIT($28)
130*1da177e4SLinus Torvalds	addu	t4, t0, 32
131*1da177e4SLinus Torvalds	and	t5, t4
132*1da177e4SLinus Torvalds	bltz	t5, bad_stack		# -> sp is bad
133*1da177e4SLinus Torvalds
134*1da177e4SLinus Torvalds	/* Ok, copy the args from the luser stack to the kernel stack.
135*1da177e4SLinus Torvalds	 * t3 is the precomputed number of instruction bytes needed to
136*1da177e4SLinus Torvalds	 * load or store arguments 6-8.
137*1da177e4SLinus Torvalds	 */
138*1da177e4SLinus Torvalds
139*1da177e4SLinus Torvalds	la	t1, 5f			# load up to 3 arguments
140*1da177e4SLinus Torvalds	subu	t1, t3
141*1da177e4SLinus Torvalds1:	lw	t5, 16(t0)		# argument #5 from usp
142*1da177e4SLinus Torvalds	.set    push
143*1da177e4SLinus Torvalds	.set    noreorder
144*1da177e4SLinus Torvalds	.set	nomacro
145*1da177e4SLinus Torvalds	jr	t1
146*1da177e4SLinus Torvalds	 addiu	t1, 6f - 5f
147*1da177e4SLinus Torvalds
148*1da177e4SLinus Torvalds2:	lw	t8, 28(t0)		# argument #8 from usp
149*1da177e4SLinus Torvalds3:	lw	t7, 24(t0)		# argument #7 from usp
150*1da177e4SLinus Torvalds4:	lw	t6, 20(t0)		# argument #6 from usp
151*1da177e4SLinus Torvalds5:	jr	t1
152*1da177e4SLinus Torvalds	 sw	t5, 16(sp)		# argument #5 to ksp
153*1da177e4SLinus Torvalds
154*1da177e4SLinus Torvalds	sw	t8, 28(sp)		# argument #8 to ksp
155*1da177e4SLinus Torvalds	sw	t7, 24(sp)		# argument #7 to ksp
156*1da177e4SLinus Torvalds	sw	t6, 20(sp)		# argument #6 to ksp
157*1da177e4SLinus Torvalds6:	j	stack_done		# go back
158*1da177e4SLinus Torvalds	 nop
159*1da177e4SLinus Torvalds	.set	pop
160*1da177e4SLinus Torvalds
161*1da177e4SLinus Torvalds	.section __ex_table,"a"
162*1da177e4SLinus Torvalds	PTR	1b,bad_stack
163*1da177e4SLinus Torvalds	PTR	2b,bad_stack
164*1da177e4SLinus Torvalds	PTR	3b,bad_stack
165*1da177e4SLinus Torvalds	PTR	4b,bad_stack
166*1da177e4SLinus Torvalds	.previous
167*1da177e4SLinus Torvalds
168*1da177e4SLinus Torvalds	/*
169*1da177e4SLinus Torvalds	 * The stackpointer for a call with more than 4 arguments is bad.
170*1da177e4SLinus Torvalds	 * We probably should handle this case a bit more drastic.
171*1da177e4SLinus Torvalds	 */
172*1da177e4SLinus Torvaldsbad_stack:
173*1da177e4SLinus Torvalds	negu	v0				# error
174*1da177e4SLinus Torvalds	sw	v0, PT_R0(sp)
175*1da177e4SLinus Torvalds	sw	v0, PT_R2(sp)
176*1da177e4SLinus Torvalds	li	t0, 1				# set error flag
177*1da177e4SLinus Torvalds	sw	t0, PT_R7(sp)
178*1da177e4SLinus Torvalds	j	o32_syscall_exit
179*1da177e4SLinus Torvalds
180*1da177e4SLinus Torvalds	/*
181*1da177e4SLinus Torvalds	 * The system call does not exist in this kernel
182*1da177e4SLinus Torvalds	 */
183*1da177e4SLinus Torvaldsillegal_syscall:
184*1da177e4SLinus Torvalds	li	v0, -ENOSYS			# error
185*1da177e4SLinus Torvalds	sw	v0, PT_R2(sp)
186*1da177e4SLinus Torvalds	li	t0, 1				# set error flag
187*1da177e4SLinus Torvalds	sw	t0, PT_R7(sp)
188*1da177e4SLinus Torvalds	j	o32_syscall_exit
189*1da177e4SLinus Torvalds	END(handle_sys)
190*1da177e4SLinus Torvalds
191*1da177e4SLinus Torvalds	LEAF(mips_atomic_set)
192*1da177e4SLinus Torvalds	andi	v0, a1, 3			# must be word aligned
193*1da177e4SLinus Torvalds	bnez	v0, bad_alignment
194*1da177e4SLinus Torvalds
195*1da177e4SLinus Torvalds	lw	v1, TI_ADDR_LIMIT($28)		# in legal address range?
196*1da177e4SLinus Torvalds	addiu	a0, a1, 4
197*1da177e4SLinus Torvalds	or	a0, a0, a1
198*1da177e4SLinus Torvalds	and	a0, a0, v1
199*1da177e4SLinus Torvalds	bltz	a0, bad_address
200*1da177e4SLinus Torvalds
201*1da177e4SLinus Torvalds#ifdef CONFIG_CPU_HAS_LLSC
202*1da177e4SLinus Torvalds	/* Ok, this is the ll/sc case.  World is sane :-)  */
203*1da177e4SLinus Torvalds1:	ll	v0, (a1)
204*1da177e4SLinus Torvalds	move	a0, a2
205*1da177e4SLinus Torvalds2:	sc	a0, (a1)
206*1da177e4SLinus Torvalds#if R10000_LLSC_WAR
207*1da177e4SLinus Torvalds	beqzl	a0, 1b
208*1da177e4SLinus Torvalds#else
209*1da177e4SLinus Torvalds	beqz	a0, 1b
210*1da177e4SLinus Torvalds#endif
211*1da177e4SLinus Torvalds
212*1da177e4SLinus Torvalds	.section __ex_table,"a"
213*1da177e4SLinus Torvalds	PTR	1b, bad_stack
214*1da177e4SLinus Torvalds	PTR	2b, bad_stack
215*1da177e4SLinus Torvalds	.previous
216*1da177e4SLinus Torvalds#else
217*1da177e4SLinus Torvalds	sw	a1, 16(sp)
218*1da177e4SLinus Torvalds	sw	a2, 20(sp)
219*1da177e4SLinus Torvalds
220*1da177e4SLinus Torvalds	move	a0, sp
221*1da177e4SLinus Torvalds	move	a2, a1
222*1da177e4SLinus Torvalds	li	a1, 1
223*1da177e4SLinus Torvalds	jal	do_page_fault
224*1da177e4SLinus Torvalds
225*1da177e4SLinus Torvalds	lw	a1, 16(sp)
226*1da177e4SLinus Torvalds	lw	a2, 20(sp)
227*1da177e4SLinus Torvalds
228*1da177e4SLinus Torvalds	/*
229*1da177e4SLinus Torvalds	 * At this point the page should be readable and writable unless
230*1da177e4SLinus Torvalds	 * there was no more memory available.
231*1da177e4SLinus Torvalds	 */
232*1da177e4SLinus Torvalds1:	lw	v0, (a1)
233*1da177e4SLinus Torvalds2:	sw	a2, (a1)
234*1da177e4SLinus Torvalds
235*1da177e4SLinus Torvalds	.section __ex_table,"a"
236*1da177e4SLinus Torvalds	PTR	1b, no_mem
237*1da177e4SLinus Torvalds	PTR	2b, no_mem
238*1da177e4SLinus Torvalds	.previous
239*1da177e4SLinus Torvalds#endif
240*1da177e4SLinus Torvalds
241*1da177e4SLinus Torvalds	sw	zero, PT_R7(sp)		# success
242*1da177e4SLinus Torvalds	sw	v0, PT_R2(sp)		# result
243*1da177e4SLinus Torvalds
244*1da177e4SLinus Torvalds	/* Success, so skip usual error handling garbage.  */
245*1da177e4SLinus Torvalds	lw	a2, TI_FLAGS($28)	# syscall tracing enabled?
246*1da177e4SLinus Torvalds	li	t0, _TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT
247*1da177e4SLinus Torvalds	and	t0, a2, t0
248*1da177e4SLinus Torvalds	bnez	t0, 1f
249*1da177e4SLinus Torvalds
250*1da177e4SLinus Torvalds	j	o32_syscall_exit
251*1da177e4SLinus Torvalds
252*1da177e4SLinus Torvalds1:	SAVE_STATIC
253*1da177e4SLinus Torvalds	move	a0, sp
254*1da177e4SLinus Torvalds	li	a1, 1
255*1da177e4SLinus Torvalds	jal	do_syscall_trace
256*1da177e4SLinus Torvalds	j	syscall_exit
257*1da177e4SLinus Torvalds
258*1da177e4SLinus Torvaldsno_mem:	li	v0, -ENOMEM
259*1da177e4SLinus Torvalds	jr	ra
260*1da177e4SLinus Torvalds
261*1da177e4SLinus Torvaldsbad_address:
262*1da177e4SLinus Torvalds	li	v0, -EFAULT
263*1da177e4SLinus Torvalds	jr	ra
264*1da177e4SLinus Torvalds
265*1da177e4SLinus Torvaldsbad_alignment:
266*1da177e4SLinus Torvalds	li	v0, -EINVAL
267*1da177e4SLinus Torvalds	jr	ra
268*1da177e4SLinus Torvalds	END(mips_atomic_set)
269*1da177e4SLinus Torvalds
270*1da177e4SLinus Torvalds	LEAF(sys_sysmips)
271*1da177e4SLinus Torvalds	beq	a0, MIPS_ATOMIC_SET, mips_atomic_set
272*1da177e4SLinus Torvalds	j	_sys_sysmips
273*1da177e4SLinus Torvalds	END(sys_sysmips)
274*1da177e4SLinus Torvalds
275*1da177e4SLinus Torvalds	LEAF(sys_syscall)
276*1da177e4SLinus Torvalds#if defined(CONFIG_BINFMT_IRIX)
277*1da177e4SLinus Torvalds	sltiu	v0, a0, MAX_SYSCALL_NO + 1 # check syscall number
278*1da177e4SLinus Torvalds#else
279*1da177e4SLinus Torvalds	subu	t0, a0, __NR_O32_Linux	# check syscall number
280*1da177e4SLinus Torvalds	sltiu	v0, t0, __NR_O32_Linux_syscalls + 1
281*1da177e4SLinus Torvalds#endif
282*1da177e4SLinus Torvalds	sll	t1, t0, 3
283*1da177e4SLinus Torvalds	beqz	v0, einval
284*1da177e4SLinus Torvalds
285*1da177e4SLinus Torvalds	lw	t2, sys_call_table(t1)		# syscall routine
286*1da177e4SLinus Torvalds
287*1da177e4SLinus Torvalds#if defined(CONFIG_BINFMT_IRIX)
288*1da177e4SLinus Torvalds	li	v1, 4000			# nr of sys_syscall
289*1da177e4SLinus Torvalds#else
290*1da177e4SLinus Torvalds	li	v1, 4000 - __NR_O32_Linux	# index of sys_syscall
291*1da177e4SLinus Torvalds#endif
292*1da177e4SLinus Torvalds	beq	t0, v1, einval			# do not recurse
293*1da177e4SLinus Torvalds
294*1da177e4SLinus Torvalds	/* Some syscalls like execve get their arguments from struct pt_regs
295*1da177e4SLinus Torvalds	   and claim zero arguments in the syscall table. Thus we have to
296*1da177e4SLinus Torvalds	   assume the worst case and shuffle around all potential arguments.
297*1da177e4SLinus Torvalds	   If you want performance, don't use indirect syscalls. */
298*1da177e4SLinus Torvalds
299*1da177e4SLinus Torvalds	move	a0, a1				# shift argument registers
300*1da177e4SLinus Torvalds	move	a1, a2
301*1da177e4SLinus Torvalds	move	a2, a3
302*1da177e4SLinus Torvalds	lw	a3, 16(sp)
303*1da177e4SLinus Torvalds	lw	t4, 20(sp)
304*1da177e4SLinus Torvalds	lw	t5, 24(sp)
305*1da177e4SLinus Torvalds	lw	t6, 28(sp)
306*1da177e4SLinus Torvalds	sw	t4, 16(sp)
307*1da177e4SLinus Torvalds	sw	t5, 20(sp)
308*1da177e4SLinus Torvalds	sw	t6, 24(sp)
309*1da177e4SLinus Torvalds	sw	a0, PT_R4(sp)			# .. and push back a0 - a3, some
310*1da177e4SLinus Torvalds	sw	a1, PT_R5(sp)			# syscalls expect them there
311*1da177e4SLinus Torvalds	sw	a2, PT_R6(sp)
312*1da177e4SLinus Torvalds	sw	a3, PT_R7(sp)
313*1da177e4SLinus Torvalds	sw	a3, PT_R26(sp)			# update a3 for syscall restarting
314*1da177e4SLinus Torvalds	jr	t2
315*1da177e4SLinus Torvalds	/* Unreached */
316*1da177e4SLinus Torvalds
317*1da177e4SLinus Torvaldseinval:	li	v0, -EINVAL
318*1da177e4SLinus Torvalds	jr	ra
319*1da177e4SLinus Torvalds	END(sys_syscall)
320*1da177e4SLinus Torvalds
321*1da177e4SLinus Torvalds	.macro	fifty ptr, nargs, from=1, to=50
322*1da177e4SLinus Torvalds	sys	\ptr		\nargs
323*1da177e4SLinus Torvalds	.if	\to-\from
324*1da177e4SLinus Torvalds	fifty	\ptr,\nargs,"(\from+1)",\to
325*1da177e4SLinus Torvalds	.endif
326*1da177e4SLinus Torvalds	.endm
327*1da177e4SLinus Torvalds
328*1da177e4SLinus Torvalds	.macro	mille ptr, nargs, from=1, to=20
329*1da177e4SLinus Torvalds	fifty	\ptr,\nargs
330*1da177e4SLinus Torvalds	.if	\to-\from
331*1da177e4SLinus Torvalds	mille	\ptr,\nargs,"(\from+1)",\to
332*1da177e4SLinus Torvalds	.endif
333*1da177e4SLinus Torvalds	.endm
334*1da177e4SLinus Torvalds
335*1da177e4SLinus Torvalds	.macro	syscalltable
336*1da177e4SLinus Torvalds#if defined(CONFIG_BINFMT_IRIX)
337*1da177e4SLinus Torvalds	mille	sys_ni_syscall		0	/*    0 -  999 SVR4 flavour */
338*1da177e4SLinus Torvalds	mille	sys_ni_syscall		0	/* 1000 - 1999 32-bit IRIX */
339*1da177e4SLinus Torvalds	mille	sys_ni_syscall		0	/* 2000 - 2999 BSD43 flavour */
340*1da177e4SLinus Torvalds	mille	sys_ni_syscall		0	/* 3000 - 3999 POSIX flavour */
341*1da177e4SLinus Torvalds#endif
342*1da177e4SLinus Torvalds
343*1da177e4SLinus Torvalds	sys	sys_syscall		8	/* 4000 */
344*1da177e4SLinus Torvalds	sys	sys_exit		1
345*1da177e4SLinus Torvalds	sys	sys_fork		0
346*1da177e4SLinus Torvalds	sys	sys_read		3
347*1da177e4SLinus Torvalds	sys	sys_write		3
348*1da177e4SLinus Torvalds	sys	sys_open		3	/* 4005 */
349*1da177e4SLinus Torvalds	sys	sys_close		1
350*1da177e4SLinus Torvalds	sys	sys_waitpid		3
351*1da177e4SLinus Torvalds	sys	sys_creat		2
352*1da177e4SLinus Torvalds	sys	sys_link		2
353*1da177e4SLinus Torvalds	sys	sys_unlink		1	/* 4010 */
354*1da177e4SLinus Torvalds	sys	sys_execve		0
355*1da177e4SLinus Torvalds	sys	sys_chdir		1
356*1da177e4SLinus Torvalds	sys	sys_time		1
357*1da177e4SLinus Torvalds	sys	sys_mknod		3
358*1da177e4SLinus Torvalds	sys	sys_chmod		2	/* 4015 */
359*1da177e4SLinus Torvalds	sys	sys_lchown		3
360*1da177e4SLinus Torvalds	sys	sys_ni_syscall		0
361*1da177e4SLinus Torvalds	sys	sys_ni_syscall		0	/* was sys_stat */
362*1da177e4SLinus Torvalds	sys	sys_lseek		3
363*1da177e4SLinus Torvalds	sys	sys_getpid		0	/* 4020 */
364*1da177e4SLinus Torvalds	sys	sys_mount		5
365*1da177e4SLinus Torvalds	sys	sys_oldumount		1
366*1da177e4SLinus Torvalds	sys	sys_setuid		1
367*1da177e4SLinus Torvalds	sys	sys_getuid		0
368*1da177e4SLinus Torvalds	sys	sys_stime		1	/* 4025 */
369*1da177e4SLinus Torvalds	sys	sys_ptrace		4
370*1da177e4SLinus Torvalds	sys	sys_alarm		1
371*1da177e4SLinus Torvalds	sys	sys_ni_syscall		0	/* was sys_fstat */
372*1da177e4SLinus Torvalds	sys	sys_pause		0
373*1da177e4SLinus Torvalds	sys	sys_utime		2	/* 4030 */
374*1da177e4SLinus Torvalds	sys	sys_ni_syscall		0
375*1da177e4SLinus Torvalds	sys	sys_ni_syscall		0
376*1da177e4SLinus Torvalds	sys	sys_access		2
377*1da177e4SLinus Torvalds	sys	sys_nice		1
378*1da177e4SLinus Torvalds	sys	sys_ni_syscall		0	/* 4035 */
379*1da177e4SLinus Torvalds	sys	sys_sync		0
380*1da177e4SLinus Torvalds	sys	sys_kill		2
381*1da177e4SLinus Torvalds	sys	sys_rename		2
382*1da177e4SLinus Torvalds	sys	sys_mkdir		2
383*1da177e4SLinus Torvalds	sys	sys_rmdir		1	/* 4040 */
384*1da177e4SLinus Torvalds	sys	sys_dup			1
385*1da177e4SLinus Torvalds	sys	sys_pipe		0
386*1da177e4SLinus Torvalds	sys	sys_times		1
387*1da177e4SLinus Torvalds	sys	sys_ni_syscall		0
388*1da177e4SLinus Torvalds	sys	sys_brk			1	/* 4045 */
389*1da177e4SLinus Torvalds	sys	sys_setgid		1
390*1da177e4SLinus Torvalds	sys	sys_getgid		0
391*1da177e4SLinus Torvalds	sys	sys_ni_syscall		0	/* was signal(2) */
392*1da177e4SLinus Torvalds	sys	sys_geteuid		0
393*1da177e4SLinus Torvalds	sys	sys_getegid		0	/* 4050 */
394*1da177e4SLinus Torvalds	sys	sys_acct		1
395*1da177e4SLinus Torvalds	sys	sys_umount		2
396*1da177e4SLinus Torvalds	sys	sys_ni_syscall		0
397*1da177e4SLinus Torvalds	sys	sys_ioctl		3
398*1da177e4SLinus Torvalds	sys	sys_fcntl		3	/* 4055 */
399*1da177e4SLinus Torvalds	sys	sys_ni_syscall		2
400*1da177e4SLinus Torvalds	sys	sys_setpgid		2
401*1da177e4SLinus Torvalds	sys	sys_ni_syscall		0
402*1da177e4SLinus Torvalds	sys	sys_olduname		1
403*1da177e4SLinus Torvalds	sys	sys_umask		1	/* 4060 */
404*1da177e4SLinus Torvalds	sys	sys_chroot		1
405*1da177e4SLinus Torvalds	sys	sys_ustat		2
406*1da177e4SLinus Torvalds	sys	sys_dup2		2
407*1da177e4SLinus Torvalds	sys	sys_getppid		0
408*1da177e4SLinus Torvalds	sys	sys_getpgrp		0	/* 4065 */
409*1da177e4SLinus Torvalds	sys	sys_setsid		0
410*1da177e4SLinus Torvalds	sys	sys_sigaction		3
411*1da177e4SLinus Torvalds	sys	sys_sgetmask		0
412*1da177e4SLinus Torvalds	sys	sys_ssetmask		1
413*1da177e4SLinus Torvalds	sys	sys_setreuid		2	/* 4070 */
414*1da177e4SLinus Torvalds	sys	sys_setregid		2
415*1da177e4SLinus Torvalds	sys	sys_sigsuspend		0
416*1da177e4SLinus Torvalds	sys	sys_sigpending		1
417*1da177e4SLinus Torvalds	sys	sys_sethostname		2
418*1da177e4SLinus Torvalds	sys	sys_setrlimit		2	/* 4075 */
419*1da177e4SLinus Torvalds	sys	sys_getrlimit		2
420*1da177e4SLinus Torvalds	sys	sys_getrusage		2
421*1da177e4SLinus Torvalds	sys	sys_gettimeofday	2
422*1da177e4SLinus Torvalds	sys	sys_settimeofday	2
423*1da177e4SLinus Torvalds	sys	sys_getgroups		2	/* 4080 */
424*1da177e4SLinus Torvalds	sys	sys_setgroups		2
425*1da177e4SLinus Torvalds	sys	sys_ni_syscall		0	/* old_select */
426*1da177e4SLinus Torvalds	sys	sys_symlink		2
427*1da177e4SLinus Torvalds	sys	sys_ni_syscall		0	/* was sys_lstat */
428*1da177e4SLinus Torvalds	sys	sys_readlink		3	/* 4085 */
429*1da177e4SLinus Torvalds	sys	sys_uselib		1
430*1da177e4SLinus Torvalds	sys	sys_swapon		2
431*1da177e4SLinus Torvalds	sys	sys_reboot		3
432*1da177e4SLinus Torvalds	sys	old_readdir		3
433*1da177e4SLinus Torvalds	sys	old_mmap		6	/* 4090 */
434*1da177e4SLinus Torvalds	sys	sys_munmap		2
435*1da177e4SLinus Torvalds	sys	sys_truncate		2
436*1da177e4SLinus Torvalds	sys	sys_ftruncate		2
437*1da177e4SLinus Torvalds	sys	sys_fchmod		2
438*1da177e4SLinus Torvalds	sys	sys_fchown		3	/* 4095 */
439*1da177e4SLinus Torvalds	sys	sys_getpriority		2
440*1da177e4SLinus Torvalds	sys	sys_setpriority		3
441*1da177e4SLinus Torvalds	sys	sys_ni_syscall		0
442*1da177e4SLinus Torvalds	sys	sys_statfs		2
443*1da177e4SLinus Torvalds	sys	sys_fstatfs		2	/* 4100 */
444*1da177e4SLinus Torvalds	sys	sys_ni_syscall		0	/* was ioperm(2) */
445*1da177e4SLinus Torvalds	sys	sys_socketcall		2
446*1da177e4SLinus Torvalds	sys	sys_syslog		3
447*1da177e4SLinus Torvalds	sys	sys_setitimer		3
448*1da177e4SLinus Torvalds	sys	sys_getitimer		2	/* 4105 */
449*1da177e4SLinus Torvalds	sys	sys_newstat		2
450*1da177e4SLinus Torvalds	sys	sys_newlstat		2
451*1da177e4SLinus Torvalds	sys	sys_newfstat		2
452*1da177e4SLinus Torvalds	sys	sys_uname		1
453*1da177e4SLinus Torvalds	sys	sys_ni_syscall		0	/* 4110 was iopl(2) */
454*1da177e4SLinus Torvalds	sys	sys_vhangup		0
455*1da177e4SLinus Torvalds	sys	sys_ni_syscall		0	/* was sys_idle() */
456*1da177e4SLinus Torvalds	sys	sys_ni_syscall		0	/* was sys_vm86 */
457*1da177e4SLinus Torvalds	sys	sys_wait4		4
458*1da177e4SLinus Torvalds	sys	sys_swapoff		1	/* 4115 */
459*1da177e4SLinus Torvalds	sys	sys_sysinfo		1
460*1da177e4SLinus Torvalds	sys	sys_ipc			6
461*1da177e4SLinus Torvalds	sys	sys_fsync		1
462*1da177e4SLinus Torvalds	sys	sys_sigreturn		0
463*1da177e4SLinus Torvalds	sys	sys_clone		0	/* 4120 */
464*1da177e4SLinus Torvalds	sys	sys_setdomainname	2
465*1da177e4SLinus Torvalds	sys	sys_newuname		1
466*1da177e4SLinus Torvalds	sys	sys_ni_syscall		0	/* sys_modify_ldt */
467*1da177e4SLinus Torvalds	sys	sys_adjtimex		1
468*1da177e4SLinus Torvalds	sys	sys_mprotect		3	/* 4125 */
469*1da177e4SLinus Torvalds	sys	sys_sigprocmask		3
470*1da177e4SLinus Torvalds	sys	sys_ni_syscall		0	/* was create_module */
471*1da177e4SLinus Torvalds	sys	sys_init_module		5
472*1da177e4SLinus Torvalds	sys	sys_delete_module	1
473*1da177e4SLinus Torvalds	sys	sys_ni_syscall		0	/* 4130	was get_kernel_syms */
474*1da177e4SLinus Torvalds	sys	sys_quotactl		4
475*1da177e4SLinus Torvalds	sys	sys_getpgid		1
476*1da177e4SLinus Torvalds	sys	sys_fchdir		1
477*1da177e4SLinus Torvalds	sys	sys_bdflush		2
478*1da177e4SLinus Torvalds	sys	sys_sysfs		3	/* 4135 */
479*1da177e4SLinus Torvalds	sys	sys_personality		1
480*1da177e4SLinus Torvalds	sys	sys_ni_syscall		0	/* for afs_syscall */
481*1da177e4SLinus Torvalds	sys	sys_setfsuid		1
482*1da177e4SLinus Torvalds	sys	sys_setfsgid		1
483*1da177e4SLinus Torvalds	sys	sys_llseek		5	/* 4140 */
484*1da177e4SLinus Torvalds	sys	sys_getdents		3
485*1da177e4SLinus Torvalds	sys	sys_select		5
486*1da177e4SLinus Torvalds	sys	sys_flock		2
487*1da177e4SLinus Torvalds	sys	sys_msync		3
488*1da177e4SLinus Torvalds	sys	sys_readv		3	/* 4145 */
489*1da177e4SLinus Torvalds	sys	sys_writev		3
490*1da177e4SLinus Torvalds	sys	sys_cacheflush		3
491*1da177e4SLinus Torvalds	sys	sys_cachectl		3
492*1da177e4SLinus Torvalds	sys	sys_sysmips		4
493*1da177e4SLinus Torvalds	sys	sys_ni_syscall		0	/* 4150 */
494*1da177e4SLinus Torvalds	sys	sys_getsid		1
495*1da177e4SLinus Torvalds	sys	sys_fdatasync		1
496*1da177e4SLinus Torvalds	sys	sys_sysctl		1
497*1da177e4SLinus Torvalds	sys	sys_mlock		2
498*1da177e4SLinus Torvalds	sys	sys_munlock		2	/* 4155 */
499*1da177e4SLinus Torvalds	sys	sys_mlockall		1
500*1da177e4SLinus Torvalds	sys	sys_munlockall		0
501*1da177e4SLinus Torvalds	sys	sys_sched_setparam	2
502*1da177e4SLinus Torvalds	sys	sys_sched_getparam	2
503*1da177e4SLinus Torvalds	sys	sys_sched_setscheduler	3	/* 4160 */
504*1da177e4SLinus Torvalds	sys	sys_sched_getscheduler	1
505*1da177e4SLinus Torvalds	sys	sys_sched_yield		0
506*1da177e4SLinus Torvalds	sys	sys_sched_get_priority_max 1
507*1da177e4SLinus Torvalds	sys	sys_sched_get_priority_min 1
508*1da177e4SLinus Torvalds	sys	sys_sched_rr_get_interval 2	/* 4165 */
509*1da177e4SLinus Torvalds	sys	sys_nanosleep,		2
510*1da177e4SLinus Torvalds	sys	sys_mremap,		4
511*1da177e4SLinus Torvalds	sys	sys_accept		3
512*1da177e4SLinus Torvalds	sys	sys_bind		3
513*1da177e4SLinus Torvalds	sys	sys_connect		3	/* 4170 */
514*1da177e4SLinus Torvalds	sys	sys_getpeername		3
515*1da177e4SLinus Torvalds	sys	sys_getsockname		3
516*1da177e4SLinus Torvalds	sys	sys_getsockopt		5
517*1da177e4SLinus Torvalds	sys	sys_listen		2
518*1da177e4SLinus Torvalds	sys	sys_recv		4	/* 4175 */
519*1da177e4SLinus Torvalds	sys	sys_recvfrom		6
520*1da177e4SLinus Torvalds	sys	sys_recvmsg		3
521*1da177e4SLinus Torvalds	sys	sys_send		4
522*1da177e4SLinus Torvalds	sys	sys_sendmsg		3
523*1da177e4SLinus Torvalds	sys	sys_sendto		6	/* 4180 */
524*1da177e4SLinus Torvalds	sys	sys_setsockopt		5
525*1da177e4SLinus Torvalds	sys	sys_shutdown		2
526*1da177e4SLinus Torvalds	sys	sys_socket		3
527*1da177e4SLinus Torvalds	sys	sys_socketpair		4
528*1da177e4SLinus Torvalds	sys	sys_setresuid		3	/* 4185 */
529*1da177e4SLinus Torvalds	sys	sys_getresuid		3
530*1da177e4SLinus Torvalds	sys	sys_ni_syscall		0	/* was sys_query_module */
531*1da177e4SLinus Torvalds	sys	sys_poll		3
532*1da177e4SLinus Torvalds	sys	sys_nfsservctl		3
533*1da177e4SLinus Torvalds	sys	sys_setresgid		3	/* 4190 */
534*1da177e4SLinus Torvalds	sys	sys_getresgid		3
535*1da177e4SLinus Torvalds	sys	sys_prctl		5
536*1da177e4SLinus Torvalds	sys	sys_rt_sigreturn	0
537*1da177e4SLinus Torvalds	sys	sys_rt_sigaction	4
538*1da177e4SLinus Torvalds	sys	sys_rt_sigprocmask	4	/* 4195 */
539*1da177e4SLinus Torvalds	sys	sys_rt_sigpending	2
540*1da177e4SLinus Torvalds	sys	sys_rt_sigtimedwait	4
541*1da177e4SLinus Torvalds	sys	sys_rt_sigqueueinfo	3
542*1da177e4SLinus Torvalds	sys	sys_rt_sigsuspend	0
543*1da177e4SLinus Torvalds	sys	sys_pread64		6	/* 4200 */
544*1da177e4SLinus Torvalds	sys	sys_pwrite64		6
545*1da177e4SLinus Torvalds	sys	sys_chown		3
546*1da177e4SLinus Torvalds	sys	sys_getcwd		2
547*1da177e4SLinus Torvalds	sys	sys_capget		2
548*1da177e4SLinus Torvalds	sys	sys_capset		2	/* 4205 */
549*1da177e4SLinus Torvalds	sys	sys_sigaltstack		0
550*1da177e4SLinus Torvalds	sys	sys_sendfile		4
551*1da177e4SLinus Torvalds	sys	sys_ni_syscall		0
552*1da177e4SLinus Torvalds	sys	sys_ni_syscall		0
553*1da177e4SLinus Torvalds	sys	sys_mmap2		6	/* 4210 */
554*1da177e4SLinus Torvalds	sys	sys_truncate64		4
555*1da177e4SLinus Torvalds	sys	sys_ftruncate64		4
556*1da177e4SLinus Torvalds	sys	sys_stat64		2
557*1da177e4SLinus Torvalds	sys	sys_lstat64		2
558*1da177e4SLinus Torvalds	sys	sys_fstat64		2	/* 4215 */
559*1da177e4SLinus Torvalds	sys	sys_pivot_root		2
560*1da177e4SLinus Torvalds	sys	sys_mincore		3
561*1da177e4SLinus Torvalds	sys	sys_madvise		3
562*1da177e4SLinus Torvalds	sys	sys_getdents64		3
563*1da177e4SLinus Torvalds	sys	sys_fcntl64		3	/* 4220 */
564*1da177e4SLinus Torvalds	sys	sys_ni_syscall		0
565*1da177e4SLinus Torvalds	sys	sys_gettid		0
566*1da177e4SLinus Torvalds	sys	sys_readahead		5
567*1da177e4SLinus Torvalds	sys	sys_setxattr		5
568*1da177e4SLinus Torvalds	sys	sys_lsetxattr		5	/* 4225 */
569*1da177e4SLinus Torvalds	sys	sys_fsetxattr		5
570*1da177e4SLinus Torvalds	sys	sys_getxattr		4
571*1da177e4SLinus Torvalds	sys	sys_lgetxattr		4
572*1da177e4SLinus Torvalds	sys	sys_fgetxattr		4
573*1da177e4SLinus Torvalds	sys	sys_listxattr		3	/* 4230 */
574*1da177e4SLinus Torvalds	sys	sys_llistxattr		3
575*1da177e4SLinus Torvalds	sys	sys_flistxattr		3
576*1da177e4SLinus Torvalds	sys	sys_removexattr		2
577*1da177e4SLinus Torvalds	sys	sys_lremovexattr	2
578*1da177e4SLinus Torvalds	sys	sys_fremovexattr	2	/* 4235 */
579*1da177e4SLinus Torvalds	sys	sys_tkill		2
580*1da177e4SLinus Torvalds	sys	sys_sendfile64		5
581*1da177e4SLinus Torvalds	sys	sys_futex		2
582*1da177e4SLinus Torvalds	sys	sys_sched_setaffinity	3
583*1da177e4SLinus Torvalds	sys	sys_sched_getaffinity	3	/* 4240 */
584*1da177e4SLinus Torvalds	sys	sys_io_setup		2
585*1da177e4SLinus Torvalds	sys	sys_io_destroy		1
586*1da177e4SLinus Torvalds	sys	sys_io_getevents	5
587*1da177e4SLinus Torvalds	sys	sys_io_submit		3
588*1da177e4SLinus Torvalds	sys	sys_io_cancel		3	/* 4245 */
589*1da177e4SLinus Torvalds	sys	sys_exit_group		1
590*1da177e4SLinus Torvalds	sys	sys_lookup_dcookie	3
591*1da177e4SLinus Torvalds	sys	sys_epoll_create	1
592*1da177e4SLinus Torvalds	sys	sys_epoll_ctl		4
593*1da177e4SLinus Torvalds	sys	sys_epoll_wait		3	/* 4250 */
594*1da177e4SLinus Torvalds	sys	sys_remap_file_pages	5
595*1da177e4SLinus Torvalds	sys	sys_set_tid_address	1
596*1da177e4SLinus Torvalds	sys	sys_restart_syscall	0
597*1da177e4SLinus Torvalds	sys	sys_fadvise64_64	7
598*1da177e4SLinus Torvalds	sys	sys_statfs64		3	/* 4255 */
599*1da177e4SLinus Torvalds	sys	sys_fstatfs64		2
600*1da177e4SLinus Torvalds	sys	sys_timer_create	3
601*1da177e4SLinus Torvalds	sys	sys_timer_settime	4
602*1da177e4SLinus Torvalds	sys	sys_timer_gettime	2
603*1da177e4SLinus Torvalds	sys	sys_timer_getoverrun	1	/* 4260 */
604*1da177e4SLinus Torvalds	sys	sys_timer_delete	1
605*1da177e4SLinus Torvalds	sys	sys_clock_settime	2
606*1da177e4SLinus Torvalds	sys	sys_clock_gettime	2
607*1da177e4SLinus Torvalds	sys	sys_clock_getres	2
608*1da177e4SLinus Torvalds	sys	sys_clock_nanosleep	4	/* 4265 */
609*1da177e4SLinus Torvalds	sys	sys_tgkill		3
610*1da177e4SLinus Torvalds	sys	sys_utimes		2
611*1da177e4SLinus Torvalds	sys	sys_mbind		4
612*1da177e4SLinus Torvalds	sys	sys_ni_syscall		0	/* sys_get_mempolicy */
613*1da177e4SLinus Torvalds	sys	sys_ni_syscall		0	/* 4270 sys_set_mempolicy */
614*1da177e4SLinus Torvalds	sys	sys_mq_open		4
615*1da177e4SLinus Torvalds	sys	sys_mq_unlink		1
616*1da177e4SLinus Torvalds	sys	sys_mq_timedsend	5
617*1da177e4SLinus Torvalds	sys	sys_mq_timedreceive	5
618*1da177e4SLinus Torvalds	sys	sys_mq_notify		2	/* 4275 */
619*1da177e4SLinus Torvalds	sys	sys_mq_getsetattr	3
620*1da177e4SLinus Torvalds	sys	sys_ni_syscall		0	/* sys_vserver */
621*1da177e4SLinus Torvalds	sys	sys_waitid		4
622*1da177e4SLinus Torvalds	sys	sys_ni_syscall		0	/* available, was setaltroot */
623*1da177e4SLinus Torvalds	sys	sys_add_key		5
624*1da177e4SLinus Torvalds	sys	sys_request_key		4
625*1da177e4SLinus Torvalds	sys	sys_keyctl		5
626*1da177e4SLinus Torvalds
627*1da177e4SLinus Torvalds	.endm
628*1da177e4SLinus Torvalds
629*1da177e4SLinus Torvalds	/* We pre-compute the number of _instruction_ bytes needed to
630*1da177e4SLinus Torvalds	   load or store the arguments 6-8. Negative values are ignored. */
631*1da177e4SLinus Torvalds
632*1da177e4SLinus Torvalds	.macro  sys function, nargs
633*1da177e4SLinus Torvalds	PTR	\function
634*1da177e4SLinus Torvalds	LONG	(\nargs << 2) - (5 << 2)
635*1da177e4SLinus Torvalds	.endm
636*1da177e4SLinus Torvalds
637*1da177e4SLinus Torvalds	.align	3
638*1da177e4SLinus Torvalds	.type	sys_call_table,@object
639*1da177e4SLinus TorvaldsEXPORT(sys_call_table)
640*1da177e4SLinus Torvalds	syscalltable
641*1da177e4SLinus Torvalds	.size	sys_call_table, . - sys_call_table
642