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 dnegu v0 # error 97 sd v0, PT_R0(sp) # flag for syscall restarting 981: sd v0, PT_R2(sp) # result 99 100o32_syscall_exit: 101 local_irq_disable # make need_resched and 102 # signals dont change between 103 # sampling and return 104 LONG_L a2, TI_FLAGS($28) 105 li t0, _TIF_ALLWORK_MASK 106 and t0, a2, t0 107 bnez t0, o32_syscall_exit_work 108 109 j restore_partial 110 111o32_syscall_exit_work: 112 j syscall_exit_work_partial 113 114/* ------------------------------------------------------------------------ */ 115 116trace_a_syscall: 117 SAVE_STATIC 118 sd a4, PT_R8(sp) # Save argument registers 119 sd a5, PT_R9(sp) 120 sd a6, PT_R10(sp) 121 sd a7, PT_R11(sp) # For indirect syscalls 122 123 move s0, t2 # Save syscall pointer 124 move a0, sp 125 li a1, 0 126 jal do_syscall_trace 127 128 move t0, s0 129 RESTORE_STATIC 130 ld a0, PT_R4(sp) # Restore argument registers 131 ld a1, PT_R5(sp) 132 ld a2, PT_R6(sp) 133 ld a3, PT_R7(sp) 134 ld a4, PT_R8(sp) 135 ld a5, PT_R9(sp) 136 ld a6, PT_R10(sp) 137 ld a7, PT_R11(sp) # For indirect syscalls 138 jalr t0 139 140 li t0, -EMAXERRNO - 1 # error? 141 sltu t0, t0, v0 142 sd t0, PT_R7(sp) # set error flag 143 beqz t0, 1f 144 145 dnegu v0 # error 146 sd v0, PT_R0(sp) # set flag for syscall restarting 1471: sd v0, PT_R2(sp) # result 148 149 j syscall_exit 150 151/* ------------------------------------------------------------------------ */ 152 153 /* 154 * The stackpointer for a call with more than 4 arguments is bad. 155 */ 156bad_stack: 157 dnegu v0 # error 158 sd v0, PT_R0(sp) 159 sd v0, PT_R2(sp) 160 li t0, 1 # set error flag 161 sd t0, PT_R7(sp) 162 j o32_syscall_exit 163 164not_o32_scall: 165 /* 166 * This is not an o32 compatibility syscall, pass it on 167 * to the 64-bit syscall handlers. 168 */ 169#ifdef CONFIG_MIPS32_N32 170 j handle_sysn32 171#else 172 j handle_sys64 173#endif 174 END(handle_sys) 175 176LEAF(sys32_syscall) 177 subu t0, a0, __NR_O32_Linux # check syscall number 178 sltiu v0, t0, __NR_O32_Linux_syscalls + 1 179 beqz t0, einval # do not recurse 180 dsll t1, t0, 3 181 beqz v0, einval 182 ld t2, sys_call_table(t1) # syscall routine 183 184 move a0, a1 # shift argument registers 185 move a1, a2 186 move a2, a3 187 move a3, a4 188 move a4, a5 189 move a5, a6 190 move a6, a7 191 sd a0, PT_R4(sp) # ... and push back a0 - a3, some 192 sd a1, PT_R5(sp) # syscalls expect them there 193 sd a2, PT_R6(sp) 194 sd a3, PT_R7(sp) 195 sd a3, PT_R26(sp) # update a3 for syscall restarting 196 jr t2 197 /* Unreached */ 198 199einval: li v0, -ENOSYS 200 jr ra 201 END(sys32_syscall) 202 203 .align 3 204 .type sys_call_table,@object 205sys_call_table: 206 PTR sys32_syscall /* 4000 */ 207 PTR sys_exit 208 PTR sys_fork 209 PTR sys_read 210 PTR sys_write 211 PTR compat_sys_open /* 4005 */ 212 PTR sys_close 213 PTR sys_waitpid 214 PTR sys_creat 215 PTR sys_link 216 PTR sys_unlink /* 4010 */ 217 PTR sys32_execve 218 PTR sys_chdir 219 PTR compat_sys_time 220 PTR sys_mknod 221 PTR sys_chmod /* 4015 */ 222 PTR sys_lchown 223 PTR sys_ni_syscall 224 PTR sys_ni_syscall /* was sys_stat */ 225 PTR sys_lseek 226 PTR sys_getpid /* 4020 */ 227 PTR compat_sys_mount 228 PTR sys_oldumount 229 PTR sys_setuid 230 PTR sys_getuid 231 PTR compat_sys_stime /* 4025 */ 232 PTR compat_sys_ptrace 233 PTR sys_alarm 234 PTR sys_ni_syscall /* was sys_fstat */ 235 PTR sys_pause 236 PTR compat_sys_utime /* 4030 */ 237 PTR sys_ni_syscall 238 PTR sys_ni_syscall 239 PTR sys_access 240 PTR sys_nice 241 PTR sys_ni_syscall /* 4035 */ 242 PTR sys_sync 243 PTR sys_kill 244 PTR sys_rename 245 PTR sys_mkdir 246 PTR sys_rmdir /* 4040 */ 247 PTR sys_dup 248 PTR sysm_pipe 249 PTR compat_sys_times 250 PTR sys_ni_syscall 251 PTR sys_brk /* 4045 */ 252 PTR sys_setgid 253 PTR sys_getgid 254 PTR sys_ni_syscall /* was signal 2 */ 255 PTR sys_geteuid 256 PTR sys_getegid /* 4050 */ 257 PTR sys_acct 258 PTR sys_umount 259 PTR sys_ni_syscall 260 PTR compat_sys_ioctl 261 PTR compat_sys_fcntl /* 4055 */ 262 PTR sys_ni_syscall 263 PTR sys_setpgid 264 PTR sys_ni_syscall 265 PTR sys_olduname 266 PTR sys_umask /* 4060 */ 267 PTR sys_chroot 268 PTR compat_sys_ustat 269 PTR sys_dup2 270 PTR sys_getppid 271 PTR sys_getpgrp /* 4065 */ 272 PTR sys_setsid 273 PTR sys_32_sigaction 274 PTR sys_sgetmask 275 PTR sys_ssetmask 276 PTR sys_setreuid /* 4070 */ 277 PTR sys_setregid 278 PTR sys32_sigsuspend 279 PTR compat_sys_sigpending 280 PTR sys_sethostname 281 PTR compat_sys_setrlimit /* 4075 */ 282 PTR compat_sys_getrlimit 283 PTR compat_sys_getrusage 284 PTR compat_sys_gettimeofday 285 PTR compat_sys_settimeofday 286 PTR sys_getgroups /* 4080 */ 287 PTR sys_setgroups 288 PTR sys_ni_syscall /* old_select */ 289 PTR sys_symlink 290 PTR sys_ni_syscall /* was sys_lstat */ 291 PTR sys_readlink /* 4085 */ 292 PTR sys_uselib 293 PTR sys_swapon 294 PTR sys_reboot 295 PTR compat_sys_old_readdir 296 PTR sys_mips_mmap /* 4090 */ 297 PTR sys_munmap 298 PTR sys_truncate 299 PTR sys_ftruncate 300 PTR sys_fchmod 301 PTR sys_fchown /* 4095 */ 302 PTR sys_getpriority 303 PTR sys_setpriority 304 PTR sys_ni_syscall 305 PTR compat_sys_statfs 306 PTR compat_sys_fstatfs /* 4100 */ 307 PTR sys_ni_syscall /* sys_ioperm */ 308 PTR compat_sys_socketcall 309 PTR sys_syslog 310 PTR compat_sys_setitimer 311 PTR compat_sys_getitimer /* 4105 */ 312 PTR compat_sys_newstat 313 PTR compat_sys_newlstat 314 PTR compat_sys_newfstat 315 PTR sys_uname 316 PTR sys_ni_syscall /* sys_ioperm *//* 4110 */ 317 PTR sys_vhangup 318 PTR sys_ni_syscall /* was sys_idle */ 319 PTR sys_ni_syscall /* sys_vm86 */ 320 PTR compat_sys_wait4 321 PTR sys_swapoff /* 4115 */ 322 PTR compat_sys_sysinfo 323 PTR sys_32_ipc 324 PTR sys_fsync 325 PTR sys32_sigreturn 326 PTR sys32_clone /* 4120 */ 327 PTR sys_setdomainname 328 PTR sys_newuname 329 PTR sys_ni_syscall /* sys_modify_ldt */ 330 PTR compat_sys_adjtimex 331 PTR sys_mprotect /* 4125 */ 332 PTR compat_sys_sigprocmask 333 PTR sys_ni_syscall /* was creat_module */ 334 PTR sys_init_module 335 PTR sys_delete_module 336 PTR sys_ni_syscall /* 4130, get_kernel_syms */ 337 PTR sys_quotactl 338 PTR sys_getpgid 339 PTR sys_fchdir 340 PTR sys_bdflush 341 PTR sys_sysfs /* 4135 */ 342 PTR sys_32_personality 343 PTR sys_ni_syscall /* for afs_syscall */ 344 PTR sys_setfsuid 345 PTR sys_setfsgid 346 PTR sys_32_llseek /* 4140 */ 347 PTR compat_sys_getdents 348 PTR compat_sys_select 349 PTR sys_flock 350 PTR sys_msync 351 PTR compat_sys_readv /* 4145 */ 352 PTR compat_sys_writev 353 PTR sys_cacheflush 354 PTR sys_cachectl 355 PTR sys_sysmips 356 PTR sys_ni_syscall /* 4150 */ 357 PTR sys_getsid 358 PTR sys_fdatasync 359 PTR compat_sys_sysctl 360 PTR sys_mlock 361 PTR sys_munlock /* 4155 */ 362 PTR sys_mlockall 363 PTR sys_munlockall 364 PTR sys_sched_setparam 365 PTR sys_sched_getparam 366 PTR sys_sched_setscheduler /* 4160 */ 367 PTR sys_sched_getscheduler 368 PTR sys_sched_yield 369 PTR sys_sched_get_priority_max 370 PTR sys_sched_get_priority_min 371 PTR sys_32_sched_rr_get_interval /* 4165 */ 372 PTR compat_sys_nanosleep 373 PTR sys_mremap 374 PTR sys_accept 375 PTR sys_bind 376 PTR sys_connect /* 4170 */ 377 PTR sys_getpeername 378 PTR sys_getsockname 379 PTR sys_getsockopt 380 PTR sys_listen 381 PTR compat_sys_recv /* 4175 */ 382 PTR compat_sys_recvfrom 383 PTR compat_sys_recvmsg 384 PTR sys_send 385 PTR compat_sys_sendmsg 386 PTR sys_sendto /* 4180 */ 387 PTR compat_sys_setsockopt 388 PTR sys_shutdown 389 PTR sys_socket 390 PTR sys_socketpair 391 PTR sys_setresuid /* 4185 */ 392 PTR sys_getresuid 393 PTR sys_ni_syscall /* was query_module */ 394 PTR sys_poll 395 PTR compat_sys_nfsservctl 396 PTR sys_setresgid /* 4190 */ 397 PTR sys_getresgid 398 PTR sys_prctl 399 PTR sys32_rt_sigreturn 400 PTR sys_32_rt_sigaction 401 PTR sys_32_rt_sigprocmask /* 4195 */ 402 PTR sys_32_rt_sigpending 403 PTR compat_sys_rt_sigtimedwait 404 PTR sys_32_rt_sigqueueinfo 405 PTR sys32_rt_sigsuspend 406 PTR sys_32_pread /* 4200 */ 407 PTR sys_32_pwrite 408 PTR sys_chown 409 PTR sys_getcwd 410 PTR sys_capget 411 PTR sys_capset /* 4205 */ 412 PTR sys32_sigaltstack 413 PTR sys_32_sendfile 414 PTR sys_ni_syscall 415 PTR sys_ni_syscall 416 PTR sys_mips_mmap2 /* 4210 */ 417 PTR sys_32_truncate64 418 PTR sys_32_ftruncate64 419 PTR sys_newstat 420 PTR sys_newlstat 421 PTR sys_newfstat /* 4215 */ 422 PTR sys_pivot_root 423 PTR sys_mincore 424 PTR sys_madvise 425 PTR sys_getdents64 426 PTR compat_sys_fcntl64 /* 4220 */ 427 PTR sys_ni_syscall 428 PTR sys_gettid 429 PTR sys32_readahead 430 PTR sys_setxattr 431 PTR sys_lsetxattr /* 4225 */ 432 PTR sys_fsetxattr 433 PTR sys_getxattr 434 PTR sys_lgetxattr 435 PTR sys_fgetxattr 436 PTR sys_listxattr /* 4230 */ 437 PTR sys_llistxattr 438 PTR sys_flistxattr 439 PTR sys_removexattr 440 PTR sys_lremovexattr 441 PTR sys_fremovexattr /* 4235 */ 442 PTR sys_tkill 443 PTR sys_sendfile64 444 PTR compat_sys_futex 445 PTR compat_sys_sched_setaffinity 446 PTR compat_sys_sched_getaffinity /* 4240 */ 447 PTR sys_io_setup 448 PTR sys_io_destroy 449 PTR sys_io_getevents 450 PTR sys_io_submit 451 PTR sys_io_cancel /* 4245 */ 452 PTR sys_exit_group 453 PTR sys32_lookup_dcookie 454 PTR sys_epoll_create 455 PTR sys_epoll_ctl 456 PTR sys_epoll_wait /* 4250 */ 457 PTR sys_remap_file_pages 458 PTR sys_set_tid_address 459 PTR sys_restart_syscall 460 PTR sys32_fadvise64_64 461 PTR compat_sys_statfs64 /* 4255 */ 462 PTR compat_sys_fstatfs64 463 PTR compat_sys_timer_create 464 PTR compat_sys_timer_settime 465 PTR compat_sys_timer_gettime 466 PTR sys_timer_getoverrun /* 4260 */ 467 PTR sys_timer_delete 468 PTR compat_sys_clock_settime 469 PTR compat_sys_clock_gettime 470 PTR compat_sys_clock_getres 471 PTR compat_sys_clock_nanosleep /* 4265 */ 472 PTR sys_tgkill 473 PTR compat_sys_utimes 474 PTR sys_ni_syscall /* sys_mbind */ 475 PTR sys_ni_syscall /* sys_get_mempolicy */ 476 PTR sys_ni_syscall /* 4270 sys_set_mempolicy */ 477 PTR compat_sys_mq_open 478 PTR sys_mq_unlink 479 PTR compat_sys_mq_timedsend 480 PTR compat_sys_mq_timedreceive 481 PTR compat_sys_mq_notify /* 4275 */ 482 PTR compat_sys_mq_getsetattr 483 PTR sys_ni_syscall /* sys_vserver */ 484 PTR sys_32_waitid 485 PTR sys_ni_syscall /* available, was setaltroot */ 486 PTR sys_add_key /* 4280 */ 487 PTR sys_request_key 488 PTR sys_keyctl 489 PTR sys_set_thread_area 490 PTR sys_inotify_init 491 PTR sys_inotify_add_watch /* 4285 */ 492 PTR sys_inotify_rm_watch 493 PTR sys_migrate_pages 494 PTR compat_sys_openat 495 PTR sys_mkdirat 496 PTR sys_mknodat /* 4290 */ 497 PTR sys_fchownat 498 PTR compat_sys_futimesat 499 PTR sys_newfstatat 500 PTR sys_unlinkat 501 PTR sys_renameat /* 4295 */ 502 PTR sys_linkat 503 PTR sys_symlinkat 504 PTR sys_readlinkat 505 PTR sys_fchmodat 506 PTR sys_faccessat /* 4300 */ 507 PTR compat_sys_pselect6 508 PTR compat_sys_ppoll 509 PTR sys_unshare 510 PTR sys_splice 511 PTR sys32_sync_file_range /* 4305 */ 512 PTR sys_tee 513 PTR compat_sys_vmsplice 514 PTR compat_sys_move_pages 515 PTR compat_sys_set_robust_list 516 PTR compat_sys_get_robust_list /* 4310 */ 517 PTR compat_sys_kexec_load 518 PTR sys_getcpu 519 PTR compat_sys_epoll_pwait 520 PTR sys_ioprio_set 521 PTR sys_ioprio_get /* 4315 */ 522 PTR compat_sys_utimensat 523 PTR compat_sys_signalfd 524 PTR sys_ni_syscall 525 PTR sys_eventfd 526 PTR sys32_fallocate /* 4320 */ 527 PTR sys_timerfd_create 528 PTR compat_sys_timerfd_gettime 529 PTR compat_sys_timerfd_settime 530 PTR compat_sys_signalfd4 531 PTR sys_eventfd2 /* 4325 */ 532 PTR sys_epoll_create1 533 PTR sys_dup3 534 PTR sys_pipe2 535 PTR sys_inotify_init1 536 PTR compat_sys_preadv /* 4330 */ 537 PTR compat_sys_pwritev 538 PTR compat_sys_rt_tgsigqueueinfo 539 PTR sys_perf_event_open 540 PTR sys_accept4 541 PTR compat_sys_recvmmsg 542 .size sys_call_table,.-sys_call_table 543