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 * 6 * Copyright (C) 1995 - 2000, 2001 by Ralf Baechle 7 * Copyright (C) 1999, 2000 Silicon Graphics, Inc. 8 * Copyright (C) 2001 MIPS Technologies, Inc. 9 * Copyright (C) 2004 Thiemo Seufer 10 * 11 * Hairy, the userspace application uses a different argument passing 12 * convention than the kernel, so we have to translate things from o32 13 * to ABI64 calling convention. 64-bit syscalls are also processed 14 * here for now. 15 */ 16#include <linux/errno.h> 17#include <asm/asm.h> 18#include <asm/asmmacro.h> 19#include <asm/irqflags.h> 20#include <asm/mipsregs.h> 21#include <asm/regdef.h> 22#include <asm/stackframe.h> 23#include <asm/thread_info.h> 24#include <asm/unistd.h> 25#include <asm/sysmips.h> 26 27 .align 5 28NESTED(handle_sys, PT_SIZE, sp) 29 .set noat 30 SAVE_SOME 31 TRACE_IRQS_ON_RELOAD 32 STI 33 .set at 34 ld t1, PT_EPC(sp) # skip syscall on return 35 36 dsubu t0, v0, __NR_O32_Linux # check syscall number 37 sltiu t0, t0, __NR_O32_Linux_syscalls + 1 38 daddiu t1, 4 # skip to next instruction 39 sd t1, PT_EPC(sp) 40 beqz t0, not_o32_scall 41#if 0 42 SAVE_ALL 43 move a1, v0 44 PRINT("Scall %ld\n") 45 RESTORE_ALL 46#endif 47 48 /* We don't want to stumble over broken sign extensions from 49 userland. O32 does never use the upper half. */ 50 sll a0, a0, 0 51 sll a1, a1, 0 52 sll a2, a2, 0 53 sll a3, a3, 0 54 55 dsll t0, v0, 3 # offset into table 56 ld t2, (sys_call_table - (__NR_O32_Linux * 8))(t0) 57 58 sd a3, PT_R26(sp) # save a3 for syscall restarting 59 60 /* 61 * More than four arguments. Try to deal with it by copying the 62 * stack arguments from the user stack to the kernel stack. 63 * This Sucks (TM). 64 * 65 * We intentionally keep the kernel stack a little below the top of 66 * userspace so we don't have to do a slower byte accurate check here. 67 */ 68 ld t0, PT_R29(sp) # get old user stack pointer 69 daddu t1, t0, 32 70 bltz t1, bad_stack 71 721: lw a4, 16(t0) # argument #5 from usp 732: lw a5, 20(t0) # argument #6 from usp 743: lw a6, 24(t0) # argument #7 from usp 754: lw a7, 28(t0) # argument #8 from usp (for indirect syscalls) 76 77 .section __ex_table,"a" 78 PTR 1b, bad_stack 79 PTR 2b, bad_stack 80 PTR 3b, bad_stack 81 PTR 4b, bad_stack 82 .previous 83 84 li t1, _TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT 85 LONG_L t0, TI_FLAGS($28) # syscall tracing enabled? 86 and t0, t1, t0 87 bnez t0, trace_a_syscall 88 89 jalr t2 # Do The Real Thing (TM) 90 91 li t0, -EMAXERRNO - 1 # error? 92 sltu t0, t0, v0 93 sd t0, PT_R7(sp) # set error flag 94 beqz t0, 1f 95 96 ld t1, PT_R2(sp) # syscall number 97 dnegu v0 # error 98 sd t1, PT_R0(sp) # save it for syscall restarting 991: sd v0, PT_R2(sp) # result 100 101o32_syscall_exit: 102 j syscall_exit_partial 103 104/* ------------------------------------------------------------------------ */ 105 106trace_a_syscall: 107 SAVE_STATIC 108 sd a4, PT_R8(sp) # Save argument registers 109 sd a5, PT_R9(sp) 110 sd a6, PT_R10(sp) 111 sd a7, PT_R11(sp) # For indirect syscalls 112 113 move s0, t2 # Save syscall pointer 114 move a0, sp 115 jal syscall_trace_enter 116 117 move t0, s0 118 RESTORE_STATIC 119 ld a0, PT_R4(sp) # Restore argument registers 120 ld a1, PT_R5(sp) 121 ld a2, PT_R6(sp) 122 ld a3, PT_R7(sp) 123 ld a4, PT_R8(sp) 124 ld a5, PT_R9(sp) 125 ld a6, PT_R10(sp) 126 ld a7, PT_R11(sp) # For indirect syscalls 127 jalr t0 128 129 li t0, -EMAXERRNO - 1 # error? 130 sltu t0, t0, v0 131 sd t0, PT_R7(sp) # set error flag 132 beqz t0, 1f 133 134 ld t1, PT_R2(sp) # syscall number 135 dnegu v0 # error 136 sd t1, PT_R0(sp) # save it for syscall restarting 1371: sd v0, PT_R2(sp) # result 138 139 j syscall_exit 140 141/* ------------------------------------------------------------------------ */ 142 143 /* 144 * The stackpointer for a call with more than 4 arguments is bad. 145 */ 146bad_stack: 147 li v0, EFAULT 148 sd v0, PT_R2(sp) 149 li t0, 1 # set error flag 150 sd t0, PT_R7(sp) 151 j o32_syscall_exit 152 153not_o32_scall: 154 /* 155 * This is not an o32 compatibility syscall, pass it on 156 * to the 64-bit syscall handlers. 157 */ 158#ifdef CONFIG_MIPS32_N32 159 j handle_sysn32 160#else 161 j handle_sys64 162#endif 163 END(handle_sys) 164 165LEAF(sys32_syscall) 166 subu t0, a0, __NR_O32_Linux # check syscall number 167 sltiu v0, t0, __NR_O32_Linux_syscalls + 1 168 beqz t0, einval # do not recurse 169 dsll t1, t0, 3 170 beqz v0, einval 171 ld t2, sys_call_table(t1) # syscall routine 172 173 move a0, a1 # shift argument registers 174 move a1, a2 175 move a2, a3 176 move a3, a4 177 move a4, a5 178 move a5, a6 179 move a6, a7 180 sd a0, PT_R4(sp) # ... and push back a0 - a3, some 181 sd a1, PT_R5(sp) # syscalls expect them there 182 sd a2, PT_R6(sp) 183 sd a3, PT_R7(sp) 184 sd a3, PT_R26(sp) # update a3 for syscall restarting 185 jr t2 186 /* Unreached */ 187 188einval: li v0, -ENOSYS 189 jr ra 190 END(sys32_syscall) 191 192 .align 3 193 .type sys_call_table,@object 194sys_call_table: 195 PTR sys32_syscall /* 4000 */ 196 PTR sys_exit 197 PTR __sys_fork 198 PTR sys_read 199 PTR sys_write 200 PTR compat_sys_open /* 4005 */ 201 PTR sys_close 202 PTR sys_waitpid 203 PTR sys_creat 204 PTR sys_link 205 PTR sys_unlink /* 4010 */ 206 PTR compat_sys_execve 207 PTR sys_chdir 208 PTR compat_sys_time 209 PTR sys_mknod 210 PTR sys_chmod /* 4015 */ 211 PTR sys_lchown 212 PTR sys_ni_syscall 213 PTR sys_ni_syscall /* was sys_stat */ 214 PTR sys_lseek 215 PTR sys_getpid /* 4020 */ 216 PTR compat_sys_mount 217 PTR sys_oldumount 218 PTR sys_setuid 219 PTR sys_getuid 220 PTR compat_sys_stime /* 4025 */ 221 PTR compat_sys_ptrace 222 PTR sys_alarm 223 PTR sys_ni_syscall /* was sys_fstat */ 224 PTR sys_pause 225 PTR compat_sys_utime /* 4030 */ 226 PTR sys_ni_syscall 227 PTR sys_ni_syscall 228 PTR sys_access 229 PTR sys_nice 230 PTR sys_ni_syscall /* 4035 */ 231 PTR sys_sync 232 PTR sys_kill 233 PTR sys_rename 234 PTR sys_mkdir 235 PTR sys_rmdir /* 4040 */ 236 PTR sys_dup 237 PTR sysm_pipe 238 PTR compat_sys_times 239 PTR sys_ni_syscall 240 PTR sys_brk /* 4045 */ 241 PTR sys_setgid 242 PTR sys_getgid 243 PTR sys_ni_syscall /* was signal 2 */ 244 PTR sys_geteuid 245 PTR sys_getegid /* 4050 */ 246 PTR sys_acct 247 PTR sys_umount 248 PTR sys_ni_syscall 249 PTR compat_sys_ioctl 250 PTR compat_sys_fcntl /* 4055 */ 251 PTR sys_ni_syscall 252 PTR sys_setpgid 253 PTR sys_ni_syscall 254 PTR sys_olduname 255 PTR sys_umask /* 4060 */ 256 PTR sys_chroot 257 PTR compat_sys_ustat 258 PTR sys_dup2 259 PTR sys_getppid 260 PTR sys_getpgrp /* 4065 */ 261 PTR sys_setsid 262 PTR sys_32_sigaction 263 PTR sys_sgetmask 264 PTR sys_ssetmask 265 PTR sys_setreuid /* 4070 */ 266 PTR sys_setregid 267 PTR sys32_sigsuspend 268 PTR compat_sys_sigpending 269 PTR sys_sethostname 270 PTR compat_sys_setrlimit /* 4075 */ 271 PTR compat_sys_getrlimit 272 PTR compat_sys_getrusage 273 PTR compat_sys_gettimeofday 274 PTR compat_sys_settimeofday 275 PTR sys_getgroups /* 4080 */ 276 PTR sys_setgroups 277 PTR sys_ni_syscall /* old_select */ 278 PTR sys_symlink 279 PTR sys_ni_syscall /* was sys_lstat */ 280 PTR sys_readlink /* 4085 */ 281 PTR sys_uselib 282 PTR sys_swapon 283 PTR sys_reboot 284 PTR compat_sys_old_readdir 285 PTR sys_mips_mmap /* 4090 */ 286 PTR sys_munmap 287 PTR compat_sys_truncate 288 PTR compat_sys_ftruncate 289 PTR sys_fchmod 290 PTR sys_fchown /* 4095 */ 291 PTR sys_getpriority 292 PTR sys_setpriority 293 PTR sys_ni_syscall 294 PTR compat_sys_statfs 295 PTR compat_sys_fstatfs /* 4100 */ 296 PTR sys_ni_syscall /* sys_ioperm */ 297 PTR compat_sys_socketcall 298 PTR sys_syslog 299 PTR compat_sys_setitimer 300 PTR compat_sys_getitimer /* 4105 */ 301 PTR compat_sys_newstat 302 PTR compat_sys_newlstat 303 PTR compat_sys_newfstat 304 PTR sys_uname 305 PTR sys_ni_syscall /* sys_ioperm *//* 4110 */ 306 PTR sys_vhangup 307 PTR sys_ni_syscall /* was sys_idle */ 308 PTR sys_ni_syscall /* sys_vm86 */ 309 PTR compat_sys_wait4 310 PTR sys_swapoff /* 4115 */ 311 PTR compat_sys_sysinfo 312 PTR compat_sys_ipc 313 PTR sys_fsync 314 PTR sys32_sigreturn 315 PTR __sys_clone /* 4120 */ 316 PTR sys_setdomainname 317 PTR sys_newuname 318 PTR sys_ni_syscall /* sys_modify_ldt */ 319 PTR compat_sys_adjtimex 320 PTR sys_mprotect /* 4125 */ 321 PTR compat_sys_sigprocmask 322 PTR sys_ni_syscall /* was creat_module */ 323 PTR sys_init_module 324 PTR sys_delete_module 325 PTR sys_ni_syscall /* 4130, get_kernel_syms */ 326 PTR sys_quotactl 327 PTR sys_getpgid 328 PTR sys_fchdir 329 PTR sys_bdflush 330 PTR sys_sysfs /* 4135 */ 331 PTR sys_32_personality 332 PTR sys_ni_syscall /* for afs_syscall */ 333 PTR sys_setfsuid 334 PTR sys_setfsgid 335 PTR sys_32_llseek /* 4140 */ 336 PTR compat_sys_getdents 337 PTR compat_sys_select 338 PTR sys_flock 339 PTR sys_msync 340 PTR compat_sys_readv /* 4145 */ 341 PTR compat_sys_writev 342 PTR sys_cacheflush 343 PTR sys_cachectl 344 PTR sys_sysmips 345 PTR sys_ni_syscall /* 4150 */ 346 PTR sys_getsid 347 PTR sys_fdatasync 348 PTR compat_sys_sysctl 349 PTR sys_mlock 350 PTR sys_munlock /* 4155 */ 351 PTR sys_mlockall 352 PTR sys_munlockall 353 PTR sys_sched_setparam 354 PTR sys_sched_getparam 355 PTR sys_sched_setscheduler /* 4160 */ 356 PTR sys_sched_getscheduler 357 PTR sys_sched_yield 358 PTR sys_sched_get_priority_max 359 PTR sys_sched_get_priority_min 360 PTR compat_sys_sched_rr_get_interval /* 4165 */ 361 PTR compat_sys_nanosleep 362 PTR sys_mremap 363 PTR sys_accept 364 PTR sys_bind 365 PTR sys_connect /* 4170 */ 366 PTR sys_getpeername 367 PTR sys_getsockname 368 PTR sys_getsockopt 369 PTR sys_listen 370 PTR compat_sys_recv /* 4175 */ 371 PTR compat_sys_recvfrom 372 PTR compat_sys_recvmsg 373 PTR sys_send 374 PTR compat_sys_sendmsg 375 PTR sys_sendto /* 4180 */ 376 PTR compat_sys_setsockopt 377 PTR sys_shutdown 378 PTR sys_socket 379 PTR sys_socketpair 380 PTR sys_setresuid /* 4185 */ 381 PTR sys_getresuid 382 PTR sys_ni_syscall /* was query_module */ 383 PTR sys_poll 384 PTR sys_ni_syscall /* was nfsservctl */ 385 PTR sys_setresgid /* 4190 */ 386 PTR sys_getresgid 387 PTR sys_prctl 388 PTR sys32_rt_sigreturn 389 PTR compat_sys_rt_sigaction 390 PTR compat_sys_rt_sigprocmask /* 4195 */ 391 PTR compat_sys_rt_sigpending 392 PTR compat_sys_rt_sigtimedwait 393 PTR compat_sys_rt_sigqueueinfo 394 PTR compat_sys_rt_sigsuspend 395 PTR sys_32_pread /* 4200 */ 396 PTR sys_32_pwrite 397 PTR sys_chown 398 PTR sys_getcwd 399 PTR sys_capget 400 PTR sys_capset /* 4205 */ 401 PTR compat_sys_sigaltstack 402 PTR compat_sys_sendfile 403 PTR sys_ni_syscall 404 PTR sys_ni_syscall 405 PTR sys_mips_mmap2 /* 4210 */ 406 PTR sys_32_truncate64 407 PTR sys_32_ftruncate64 408 PTR sys_newstat 409 PTR sys_newlstat 410 PTR sys_newfstat /* 4215 */ 411 PTR sys_pivot_root 412 PTR sys_mincore 413 PTR sys_madvise 414 PTR sys_getdents64 415 PTR compat_sys_fcntl64 /* 4220 */ 416 PTR sys_ni_syscall 417 PTR sys_gettid 418 PTR sys32_readahead 419 PTR sys_setxattr 420 PTR sys_lsetxattr /* 4225 */ 421 PTR sys_fsetxattr 422 PTR sys_getxattr 423 PTR sys_lgetxattr 424 PTR sys_fgetxattr 425 PTR sys_listxattr /* 4230 */ 426 PTR sys_llistxattr 427 PTR sys_flistxattr 428 PTR sys_removexattr 429 PTR sys_lremovexattr 430 PTR sys_fremovexattr /* 4235 */ 431 PTR sys_tkill 432 PTR sys_sendfile64 433 PTR compat_sys_futex 434 PTR compat_sys_sched_setaffinity 435 PTR compat_sys_sched_getaffinity /* 4240 */ 436 PTR compat_sys_io_setup 437 PTR sys_io_destroy 438 PTR compat_sys_io_getevents 439 PTR compat_sys_io_submit 440 PTR sys_io_cancel /* 4245 */ 441 PTR sys_exit_group 442 PTR compat_sys_lookup_dcookie 443 PTR sys_epoll_create 444 PTR sys_epoll_ctl 445 PTR sys_epoll_wait /* 4250 */ 446 PTR sys_remap_file_pages 447 PTR sys_set_tid_address 448 PTR sys_restart_syscall 449 PTR sys32_fadvise64_64 450 PTR compat_sys_statfs64 /* 4255 */ 451 PTR compat_sys_fstatfs64 452 PTR compat_sys_timer_create 453 PTR compat_sys_timer_settime 454 PTR compat_sys_timer_gettime 455 PTR sys_timer_getoverrun /* 4260 */ 456 PTR sys_timer_delete 457 PTR compat_sys_clock_settime 458 PTR compat_sys_clock_gettime 459 PTR compat_sys_clock_getres 460 PTR compat_sys_clock_nanosleep /* 4265 */ 461 PTR sys_tgkill 462 PTR compat_sys_utimes 463 PTR sys_ni_syscall /* sys_mbind */ 464 PTR sys_ni_syscall /* sys_get_mempolicy */ 465 PTR sys_ni_syscall /* 4270 sys_set_mempolicy */ 466 PTR compat_sys_mq_open 467 PTR sys_mq_unlink 468 PTR compat_sys_mq_timedsend 469 PTR compat_sys_mq_timedreceive 470 PTR compat_sys_mq_notify /* 4275 */ 471 PTR compat_sys_mq_getsetattr 472 PTR sys_ni_syscall /* sys_vserver */ 473 PTR compat_sys_waitid 474 PTR sys_ni_syscall /* available, was setaltroot */ 475 PTR sys_add_key /* 4280 */ 476 PTR sys_request_key 477 PTR sys_keyctl 478 PTR sys_set_thread_area 479 PTR sys_inotify_init 480 PTR sys_inotify_add_watch /* 4285 */ 481 PTR sys_inotify_rm_watch 482 PTR sys_migrate_pages 483 PTR compat_sys_openat 484 PTR sys_mkdirat 485 PTR sys_mknodat /* 4290 */ 486 PTR sys_fchownat 487 PTR compat_sys_futimesat 488 PTR sys_newfstatat 489 PTR sys_unlinkat 490 PTR sys_renameat /* 4295 */ 491 PTR sys_linkat 492 PTR sys_symlinkat 493 PTR sys_readlinkat 494 PTR sys_fchmodat 495 PTR sys_faccessat /* 4300 */ 496 PTR compat_sys_pselect6 497 PTR compat_sys_ppoll 498 PTR sys_unshare 499 PTR sys_splice 500 PTR sys32_sync_file_range /* 4305 */ 501 PTR sys_tee 502 PTR compat_sys_vmsplice 503 PTR compat_sys_move_pages 504 PTR compat_sys_set_robust_list 505 PTR compat_sys_get_robust_list /* 4310 */ 506 PTR compat_sys_kexec_load 507 PTR sys_getcpu 508 PTR compat_sys_epoll_pwait 509 PTR sys_ioprio_set 510 PTR sys_ioprio_get /* 4315 */ 511 PTR compat_sys_utimensat 512 PTR compat_sys_signalfd 513 PTR sys_ni_syscall /* was timerfd */ 514 PTR sys_eventfd 515 PTR sys32_fallocate /* 4320 */ 516 PTR sys_timerfd_create 517 PTR compat_sys_timerfd_gettime 518 PTR compat_sys_timerfd_settime 519 PTR compat_sys_signalfd4 520 PTR sys_eventfd2 /* 4325 */ 521 PTR sys_epoll_create1 522 PTR sys_dup3 523 PTR sys_pipe2 524 PTR sys_inotify_init1 525 PTR compat_sys_preadv /* 4330 */ 526 PTR compat_sys_pwritev 527 PTR compat_sys_rt_tgsigqueueinfo 528 PTR sys_perf_event_open 529 PTR sys_accept4 530 PTR compat_sys_recvmmsg /* 4335 */ 531 PTR sys_fanotify_init 532 PTR compat_sys_fanotify_mark 533 PTR sys_prlimit64 534 PTR sys_name_to_handle_at 535 PTR compat_sys_open_by_handle_at /* 4340 */ 536 PTR compat_sys_clock_adjtime 537 PTR sys_syncfs 538 PTR compat_sys_sendmmsg 539 PTR sys_setns 540 PTR compat_sys_process_vm_readv /* 4345 */ 541 PTR compat_sys_process_vm_writev 542 PTR sys_kcmp 543 PTR sys_finit_module 544 .size sys_call_table,.-sys_call_table 545