scall64-o32.S 13 KB

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