scall64-o32.S 11 KB

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