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