cpu_loop.c 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780
  1. /*
  2. * qemu user cpu loop
  3. *
  4. * Copyright (c) 2003-2008 Fabrice Bellard
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation; either version 2 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program; if not, see <http://www.gnu.org/licenses/>.
  18. */
  19. #include "qemu/osdep.h"
  20. #include "qemu-common.h"
  21. #include "qemu.h"
  22. #include "cpu_loop-common.h"
  23. #include "elf.h"
  24. #include "internal.h"
  25. # ifdef TARGET_ABI_MIPSO32
  26. # define MIPS_SYS(name, args) args,
  27. static const uint8_t mips_syscall_args[] = {
  28. MIPS_SYS(sys_syscall , 8) /* 4000 */
  29. MIPS_SYS(sys_exit , 1)
  30. MIPS_SYS(sys_fork , 0)
  31. MIPS_SYS(sys_read , 3)
  32. MIPS_SYS(sys_write , 3)
  33. MIPS_SYS(sys_open , 3) /* 4005 */
  34. MIPS_SYS(sys_close , 1)
  35. MIPS_SYS(sys_waitpid , 3)
  36. MIPS_SYS(sys_creat , 2)
  37. MIPS_SYS(sys_link , 2)
  38. MIPS_SYS(sys_unlink , 1) /* 4010 */
  39. MIPS_SYS(sys_execve , 0)
  40. MIPS_SYS(sys_chdir , 1)
  41. MIPS_SYS(sys_time , 1)
  42. MIPS_SYS(sys_mknod , 3)
  43. MIPS_SYS(sys_chmod , 2) /* 4015 */
  44. MIPS_SYS(sys_lchown , 3)
  45. MIPS_SYS(sys_ni_syscall , 0)
  46. MIPS_SYS(sys_ni_syscall , 0) /* was sys_stat */
  47. MIPS_SYS(sys_lseek , 3)
  48. MIPS_SYS(sys_getpid , 0) /* 4020 */
  49. MIPS_SYS(sys_mount , 5)
  50. MIPS_SYS(sys_umount , 1)
  51. MIPS_SYS(sys_setuid , 1)
  52. MIPS_SYS(sys_getuid , 0)
  53. MIPS_SYS(sys_stime , 1) /* 4025 */
  54. MIPS_SYS(sys_ptrace , 4)
  55. MIPS_SYS(sys_alarm , 1)
  56. MIPS_SYS(sys_ni_syscall , 0) /* was sys_fstat */
  57. MIPS_SYS(sys_pause , 0)
  58. MIPS_SYS(sys_utime , 2) /* 4030 */
  59. MIPS_SYS(sys_ni_syscall , 0)
  60. MIPS_SYS(sys_ni_syscall , 0)
  61. MIPS_SYS(sys_access , 2)
  62. MIPS_SYS(sys_nice , 1)
  63. MIPS_SYS(sys_ni_syscall , 0) /* 4035 */
  64. MIPS_SYS(sys_sync , 0)
  65. MIPS_SYS(sys_kill , 2)
  66. MIPS_SYS(sys_rename , 2)
  67. MIPS_SYS(sys_mkdir , 2)
  68. MIPS_SYS(sys_rmdir , 1) /* 4040 */
  69. MIPS_SYS(sys_dup , 1)
  70. MIPS_SYS(sys_pipe , 0)
  71. MIPS_SYS(sys_times , 1)
  72. MIPS_SYS(sys_ni_syscall , 0)
  73. MIPS_SYS(sys_brk , 1) /* 4045 */
  74. MIPS_SYS(sys_setgid , 1)
  75. MIPS_SYS(sys_getgid , 0)
  76. MIPS_SYS(sys_ni_syscall , 0) /* was signal(2) */
  77. MIPS_SYS(sys_geteuid , 0)
  78. MIPS_SYS(sys_getegid , 0) /* 4050 */
  79. MIPS_SYS(sys_acct , 0)
  80. MIPS_SYS(sys_umount2 , 2)
  81. MIPS_SYS(sys_ni_syscall , 0)
  82. MIPS_SYS(sys_ioctl , 3)
  83. MIPS_SYS(sys_fcntl , 3) /* 4055 */
  84. MIPS_SYS(sys_ni_syscall , 2)
  85. MIPS_SYS(sys_setpgid , 2)
  86. MIPS_SYS(sys_ni_syscall , 0)
  87. MIPS_SYS(sys_olduname , 1)
  88. MIPS_SYS(sys_umask , 1) /* 4060 */
  89. MIPS_SYS(sys_chroot , 1)
  90. MIPS_SYS(sys_ustat , 2)
  91. MIPS_SYS(sys_dup2 , 2)
  92. MIPS_SYS(sys_getppid , 0)
  93. MIPS_SYS(sys_getpgrp , 0) /* 4065 */
  94. MIPS_SYS(sys_setsid , 0)
  95. MIPS_SYS(sys_sigaction , 3)
  96. MIPS_SYS(sys_sgetmask , 0)
  97. MIPS_SYS(sys_ssetmask , 1)
  98. MIPS_SYS(sys_setreuid , 2) /* 4070 */
  99. MIPS_SYS(sys_setregid , 2)
  100. MIPS_SYS(sys_sigsuspend , 0)
  101. MIPS_SYS(sys_sigpending , 1)
  102. MIPS_SYS(sys_sethostname , 2)
  103. MIPS_SYS(sys_setrlimit , 2) /* 4075 */
  104. MIPS_SYS(sys_getrlimit , 2)
  105. MIPS_SYS(sys_getrusage , 2)
  106. MIPS_SYS(sys_gettimeofday, 2)
  107. MIPS_SYS(sys_settimeofday, 2)
  108. MIPS_SYS(sys_getgroups , 2) /* 4080 */
  109. MIPS_SYS(sys_setgroups , 2)
  110. MIPS_SYS(sys_ni_syscall , 0) /* old_select */
  111. MIPS_SYS(sys_symlink , 2)
  112. MIPS_SYS(sys_ni_syscall , 0) /* was sys_lstat */
  113. MIPS_SYS(sys_readlink , 3) /* 4085 */
  114. MIPS_SYS(sys_uselib , 1)
  115. MIPS_SYS(sys_swapon , 2)
  116. MIPS_SYS(sys_reboot , 3)
  117. MIPS_SYS(old_readdir , 3)
  118. MIPS_SYS(old_mmap , 6) /* 4090 */
  119. MIPS_SYS(sys_munmap , 2)
  120. MIPS_SYS(sys_truncate , 2)
  121. MIPS_SYS(sys_ftruncate , 2)
  122. MIPS_SYS(sys_fchmod , 2)
  123. MIPS_SYS(sys_fchown , 3) /* 4095 */
  124. MIPS_SYS(sys_getpriority , 2)
  125. MIPS_SYS(sys_setpriority , 3)
  126. MIPS_SYS(sys_ni_syscall , 0)
  127. MIPS_SYS(sys_statfs , 2)
  128. MIPS_SYS(sys_fstatfs , 2) /* 4100 */
  129. MIPS_SYS(sys_ni_syscall , 0) /* was ioperm(2) */
  130. MIPS_SYS(sys_socketcall , 2)
  131. MIPS_SYS(sys_syslog , 3)
  132. MIPS_SYS(sys_setitimer , 3)
  133. MIPS_SYS(sys_getitimer , 2) /* 4105 */
  134. MIPS_SYS(sys_newstat , 2)
  135. MIPS_SYS(sys_newlstat , 2)
  136. MIPS_SYS(sys_newfstat , 2)
  137. MIPS_SYS(sys_uname , 1)
  138. MIPS_SYS(sys_ni_syscall , 0) /* 4110 was iopl(2) */
  139. MIPS_SYS(sys_vhangup , 0)
  140. MIPS_SYS(sys_ni_syscall , 0) /* was sys_idle() */
  141. MIPS_SYS(sys_ni_syscall , 0) /* was sys_vm86 */
  142. MIPS_SYS(sys_wait4 , 4)
  143. MIPS_SYS(sys_swapoff , 1) /* 4115 */
  144. MIPS_SYS(sys_sysinfo , 1)
  145. MIPS_SYS(sys_ipc , 6)
  146. MIPS_SYS(sys_fsync , 1)
  147. MIPS_SYS(sys_sigreturn , 0)
  148. MIPS_SYS(sys_clone , 6) /* 4120 */
  149. MIPS_SYS(sys_setdomainname, 2)
  150. MIPS_SYS(sys_newuname , 1)
  151. MIPS_SYS(sys_ni_syscall , 0) /* sys_modify_ldt */
  152. MIPS_SYS(sys_adjtimex , 1)
  153. MIPS_SYS(sys_mprotect , 3) /* 4125 */
  154. MIPS_SYS(sys_sigprocmask , 3)
  155. MIPS_SYS(sys_ni_syscall , 0) /* was create_module */
  156. MIPS_SYS(sys_init_module , 5)
  157. MIPS_SYS(sys_delete_module, 1)
  158. MIPS_SYS(sys_ni_syscall , 0) /* 4130 was get_kernel_syms */
  159. MIPS_SYS(sys_quotactl , 0)
  160. MIPS_SYS(sys_getpgid , 1)
  161. MIPS_SYS(sys_fchdir , 1)
  162. MIPS_SYS(sys_bdflush , 2)
  163. MIPS_SYS(sys_sysfs , 3) /* 4135 */
  164. MIPS_SYS(sys_personality , 1)
  165. MIPS_SYS(sys_ni_syscall , 0) /* for afs_syscall */
  166. MIPS_SYS(sys_setfsuid , 1)
  167. MIPS_SYS(sys_setfsgid , 1)
  168. MIPS_SYS(sys_llseek , 5) /* 4140 */
  169. MIPS_SYS(sys_getdents , 3)
  170. MIPS_SYS(sys_select , 5)
  171. MIPS_SYS(sys_flock , 2)
  172. MIPS_SYS(sys_msync , 3)
  173. MIPS_SYS(sys_readv , 3) /* 4145 */
  174. MIPS_SYS(sys_writev , 3)
  175. MIPS_SYS(sys_cacheflush , 3)
  176. MIPS_SYS(sys_cachectl , 3)
  177. MIPS_SYS(sys_sysmips , 4)
  178. MIPS_SYS(sys_ni_syscall , 0) /* 4150 */
  179. MIPS_SYS(sys_getsid , 1)
  180. MIPS_SYS(sys_fdatasync , 0)
  181. MIPS_SYS(sys_sysctl , 1)
  182. MIPS_SYS(sys_mlock , 2)
  183. MIPS_SYS(sys_munlock , 2) /* 4155 */
  184. MIPS_SYS(sys_mlockall , 1)
  185. MIPS_SYS(sys_munlockall , 0)
  186. MIPS_SYS(sys_sched_setparam, 2)
  187. MIPS_SYS(sys_sched_getparam, 2)
  188. MIPS_SYS(sys_sched_setscheduler, 3) /* 4160 */
  189. MIPS_SYS(sys_sched_getscheduler, 1)
  190. MIPS_SYS(sys_sched_yield , 0)
  191. MIPS_SYS(sys_sched_get_priority_max, 1)
  192. MIPS_SYS(sys_sched_get_priority_min, 1)
  193. MIPS_SYS(sys_sched_rr_get_interval, 2) /* 4165 */
  194. MIPS_SYS(sys_nanosleep, 2)
  195. MIPS_SYS(sys_mremap , 5)
  196. MIPS_SYS(sys_accept , 3)
  197. MIPS_SYS(sys_bind , 3)
  198. MIPS_SYS(sys_connect , 3) /* 4170 */
  199. MIPS_SYS(sys_getpeername , 3)
  200. MIPS_SYS(sys_getsockname , 3)
  201. MIPS_SYS(sys_getsockopt , 5)
  202. MIPS_SYS(sys_listen , 2)
  203. MIPS_SYS(sys_recv , 4) /* 4175 */
  204. MIPS_SYS(sys_recvfrom , 6)
  205. MIPS_SYS(sys_recvmsg , 3)
  206. MIPS_SYS(sys_send , 4)
  207. MIPS_SYS(sys_sendmsg , 3)
  208. MIPS_SYS(sys_sendto , 6) /* 4180 */
  209. MIPS_SYS(sys_setsockopt , 5)
  210. MIPS_SYS(sys_shutdown , 2)
  211. MIPS_SYS(sys_socket , 3)
  212. MIPS_SYS(sys_socketpair , 4)
  213. MIPS_SYS(sys_setresuid , 3) /* 4185 */
  214. MIPS_SYS(sys_getresuid , 3)
  215. MIPS_SYS(sys_ni_syscall , 0) /* was sys_query_module */
  216. MIPS_SYS(sys_poll , 3)
  217. MIPS_SYS(sys_nfsservctl , 3)
  218. MIPS_SYS(sys_setresgid , 3) /* 4190 */
  219. MIPS_SYS(sys_getresgid , 3)
  220. MIPS_SYS(sys_prctl , 5)
  221. MIPS_SYS(sys_rt_sigreturn, 0)
  222. MIPS_SYS(sys_rt_sigaction, 4)
  223. MIPS_SYS(sys_rt_sigprocmask, 4) /* 4195 */
  224. MIPS_SYS(sys_rt_sigpending, 2)
  225. MIPS_SYS(sys_rt_sigtimedwait, 4)
  226. MIPS_SYS(sys_rt_sigqueueinfo, 3)
  227. MIPS_SYS(sys_rt_sigsuspend, 0)
  228. MIPS_SYS(sys_pread64 , 6) /* 4200 */
  229. MIPS_SYS(sys_pwrite64 , 6)
  230. MIPS_SYS(sys_chown , 3)
  231. MIPS_SYS(sys_getcwd , 2)
  232. MIPS_SYS(sys_capget , 2)
  233. MIPS_SYS(sys_capset , 2) /* 4205 */
  234. MIPS_SYS(sys_sigaltstack , 2)
  235. MIPS_SYS(sys_sendfile , 4)
  236. MIPS_SYS(sys_ni_syscall , 0)
  237. MIPS_SYS(sys_ni_syscall , 0)
  238. MIPS_SYS(sys_mmap2 , 6) /* 4210 */
  239. MIPS_SYS(sys_truncate64 , 4)
  240. MIPS_SYS(sys_ftruncate64 , 4)
  241. MIPS_SYS(sys_stat64 , 2)
  242. MIPS_SYS(sys_lstat64 , 2)
  243. MIPS_SYS(sys_fstat64 , 2) /* 4215 */
  244. MIPS_SYS(sys_pivot_root , 2)
  245. MIPS_SYS(sys_mincore , 3)
  246. MIPS_SYS(sys_madvise , 3)
  247. MIPS_SYS(sys_getdents64 , 3)
  248. MIPS_SYS(sys_fcntl64 , 3) /* 4220 */
  249. MIPS_SYS(sys_ni_syscall , 0)
  250. MIPS_SYS(sys_gettid , 0)
  251. MIPS_SYS(sys_readahead , 5)
  252. MIPS_SYS(sys_setxattr , 5)
  253. MIPS_SYS(sys_lsetxattr , 5) /* 4225 */
  254. MIPS_SYS(sys_fsetxattr , 5)
  255. MIPS_SYS(sys_getxattr , 4)
  256. MIPS_SYS(sys_lgetxattr , 4)
  257. MIPS_SYS(sys_fgetxattr , 4)
  258. MIPS_SYS(sys_listxattr , 3) /* 4230 */
  259. MIPS_SYS(sys_llistxattr , 3)
  260. MIPS_SYS(sys_flistxattr , 3)
  261. MIPS_SYS(sys_removexattr , 2)
  262. MIPS_SYS(sys_lremovexattr, 2)
  263. MIPS_SYS(sys_fremovexattr, 2) /* 4235 */
  264. MIPS_SYS(sys_tkill , 2)
  265. MIPS_SYS(sys_sendfile64 , 5)
  266. MIPS_SYS(sys_futex , 6)
  267. MIPS_SYS(sys_sched_setaffinity, 3)
  268. MIPS_SYS(sys_sched_getaffinity, 3) /* 4240 */
  269. MIPS_SYS(sys_io_setup , 2)
  270. MIPS_SYS(sys_io_destroy , 1)
  271. MIPS_SYS(sys_io_getevents, 5)
  272. MIPS_SYS(sys_io_submit , 3)
  273. MIPS_SYS(sys_io_cancel , 3) /* 4245 */
  274. MIPS_SYS(sys_exit_group , 1)
  275. MIPS_SYS(sys_lookup_dcookie, 3)
  276. MIPS_SYS(sys_epoll_create, 1)
  277. MIPS_SYS(sys_epoll_ctl , 4)
  278. MIPS_SYS(sys_epoll_wait , 3) /* 4250 */
  279. MIPS_SYS(sys_remap_file_pages, 5)
  280. MIPS_SYS(sys_set_tid_address, 1)
  281. MIPS_SYS(sys_restart_syscall, 0)
  282. MIPS_SYS(sys_fadvise64_64, 7)
  283. MIPS_SYS(sys_statfs64 , 3) /* 4255 */
  284. MIPS_SYS(sys_fstatfs64 , 2)
  285. MIPS_SYS(sys_timer_create, 3)
  286. MIPS_SYS(sys_timer_settime, 4)
  287. MIPS_SYS(sys_timer_gettime, 2)
  288. MIPS_SYS(sys_timer_getoverrun, 1) /* 4260 */
  289. MIPS_SYS(sys_timer_delete, 1)
  290. MIPS_SYS(sys_clock_settime, 2)
  291. MIPS_SYS(sys_clock_gettime, 2)
  292. MIPS_SYS(sys_clock_getres, 2)
  293. MIPS_SYS(sys_clock_nanosleep, 4) /* 4265 */
  294. MIPS_SYS(sys_tgkill , 3)
  295. MIPS_SYS(sys_utimes , 2)
  296. MIPS_SYS(sys_mbind , 4)
  297. MIPS_SYS(sys_ni_syscall , 0) /* sys_get_mempolicy */
  298. MIPS_SYS(sys_ni_syscall , 0) /* 4270 sys_set_mempolicy */
  299. MIPS_SYS(sys_mq_open , 4)
  300. MIPS_SYS(sys_mq_unlink , 1)
  301. MIPS_SYS(sys_mq_timedsend, 5)
  302. MIPS_SYS(sys_mq_timedreceive, 5)
  303. MIPS_SYS(sys_mq_notify , 2) /* 4275 */
  304. MIPS_SYS(sys_mq_getsetattr, 3)
  305. MIPS_SYS(sys_ni_syscall , 0) /* sys_vserver */
  306. MIPS_SYS(sys_waitid , 4)
  307. MIPS_SYS(sys_ni_syscall , 0) /* available, was setaltroot */
  308. MIPS_SYS(sys_add_key , 5)
  309. MIPS_SYS(sys_request_key, 4)
  310. MIPS_SYS(sys_keyctl , 5)
  311. MIPS_SYS(sys_set_thread_area, 1)
  312. MIPS_SYS(sys_inotify_init, 0)
  313. MIPS_SYS(sys_inotify_add_watch, 3) /* 4285 */
  314. MIPS_SYS(sys_inotify_rm_watch, 2)
  315. MIPS_SYS(sys_migrate_pages, 4)
  316. MIPS_SYS(sys_openat, 4)
  317. MIPS_SYS(sys_mkdirat, 3)
  318. MIPS_SYS(sys_mknodat, 4) /* 4290 */
  319. MIPS_SYS(sys_fchownat, 5)
  320. MIPS_SYS(sys_futimesat, 3)
  321. MIPS_SYS(sys_fstatat64, 4)
  322. MIPS_SYS(sys_unlinkat, 3)
  323. MIPS_SYS(sys_renameat, 4) /* 4295 */
  324. MIPS_SYS(sys_linkat, 5)
  325. MIPS_SYS(sys_symlinkat, 3)
  326. MIPS_SYS(sys_readlinkat, 4)
  327. MIPS_SYS(sys_fchmodat, 3)
  328. MIPS_SYS(sys_faccessat, 3) /* 4300 */
  329. MIPS_SYS(sys_pselect6, 6)
  330. MIPS_SYS(sys_ppoll, 5)
  331. MIPS_SYS(sys_unshare, 1)
  332. MIPS_SYS(sys_splice, 6)
  333. MIPS_SYS(sys_sync_file_range, 7) /* 4305 */
  334. MIPS_SYS(sys_tee, 4)
  335. MIPS_SYS(sys_vmsplice, 4)
  336. MIPS_SYS(sys_move_pages, 6)
  337. MIPS_SYS(sys_set_robust_list, 2)
  338. MIPS_SYS(sys_get_robust_list, 3) /* 4310 */
  339. MIPS_SYS(sys_kexec_load, 4)
  340. MIPS_SYS(sys_getcpu, 3)
  341. MIPS_SYS(sys_epoll_pwait, 6)
  342. MIPS_SYS(sys_ioprio_set, 3)
  343. MIPS_SYS(sys_ioprio_get, 2)
  344. MIPS_SYS(sys_utimensat, 4)
  345. MIPS_SYS(sys_signalfd, 3)
  346. MIPS_SYS(sys_ni_syscall, 0) /* was timerfd */
  347. MIPS_SYS(sys_eventfd, 1)
  348. MIPS_SYS(sys_fallocate, 6) /* 4320 */
  349. MIPS_SYS(sys_timerfd_create, 2)
  350. MIPS_SYS(sys_timerfd_gettime, 2)
  351. MIPS_SYS(sys_timerfd_settime, 4)
  352. MIPS_SYS(sys_signalfd4, 4)
  353. MIPS_SYS(sys_eventfd2, 2) /* 4325 */
  354. MIPS_SYS(sys_epoll_create1, 1)
  355. MIPS_SYS(sys_dup3, 3)
  356. MIPS_SYS(sys_pipe2, 2)
  357. MIPS_SYS(sys_inotify_init1, 1)
  358. MIPS_SYS(sys_preadv, 5) /* 4330 */
  359. MIPS_SYS(sys_pwritev, 5)
  360. MIPS_SYS(sys_rt_tgsigqueueinfo, 4)
  361. MIPS_SYS(sys_perf_event_open, 5)
  362. MIPS_SYS(sys_accept4, 4)
  363. MIPS_SYS(sys_recvmmsg, 5) /* 4335 */
  364. MIPS_SYS(sys_fanotify_init, 2)
  365. MIPS_SYS(sys_fanotify_mark, 6)
  366. MIPS_SYS(sys_prlimit64, 4)
  367. MIPS_SYS(sys_name_to_handle_at, 5)
  368. MIPS_SYS(sys_open_by_handle_at, 3) /* 4340 */
  369. MIPS_SYS(sys_clock_adjtime, 2)
  370. MIPS_SYS(sys_syncfs, 1)
  371. MIPS_SYS(sys_sendmmsg, 4)
  372. MIPS_SYS(sys_setns, 2)
  373. MIPS_SYS(sys_process_vm_readv, 6) /* 345 */
  374. MIPS_SYS(sys_process_vm_writev, 6)
  375. MIPS_SYS(sys_kcmp, 5)
  376. MIPS_SYS(sys_finit_module, 3)
  377. MIPS_SYS(sys_sched_setattr, 2)
  378. MIPS_SYS(sys_sched_getattr, 3) /* 350 */
  379. MIPS_SYS(sys_renameat2, 5)
  380. MIPS_SYS(sys_seccomp, 3)
  381. MIPS_SYS(sys_getrandom, 3)
  382. MIPS_SYS(sys_memfd_create, 2)
  383. MIPS_SYS(sys_bpf, 3) /* 355 */
  384. MIPS_SYS(sys_execveat, 5)
  385. MIPS_SYS(sys_userfaultfd, 1)
  386. MIPS_SYS(sys_membarrier, 2)
  387. MIPS_SYS(sys_mlock2, 3)
  388. MIPS_SYS(sys_copy_file_range, 6) /* 360 */
  389. MIPS_SYS(sys_preadv2, 6)
  390. MIPS_SYS(sys_pwritev2, 6)
  391. };
  392. # undef MIPS_SYS
  393. # endif /* O32 */
  394. /* Break codes */
  395. enum {
  396. BRK_OVERFLOW = 6,
  397. BRK_DIVZERO = 7
  398. };
  399. static int do_break(CPUMIPSState *env, target_siginfo_t *info,
  400. unsigned int code)
  401. {
  402. int ret = -1;
  403. switch (code) {
  404. case BRK_OVERFLOW:
  405. case BRK_DIVZERO:
  406. info->si_signo = TARGET_SIGFPE;
  407. info->si_errno = 0;
  408. info->si_code = (code == BRK_OVERFLOW) ? FPE_INTOVF : FPE_INTDIV;
  409. queue_signal(env, info->si_signo, QEMU_SI_FAULT, &*info);
  410. ret = 0;
  411. break;
  412. default:
  413. info->si_signo = TARGET_SIGTRAP;
  414. info->si_errno = 0;
  415. queue_signal(env, info->si_signo, QEMU_SI_FAULT, &*info);
  416. ret = 0;
  417. break;
  418. }
  419. return ret;
  420. }
  421. void cpu_loop(CPUMIPSState *env)
  422. {
  423. CPUState *cs = env_cpu(env);
  424. target_siginfo_t info;
  425. int trapnr;
  426. abi_long ret;
  427. # ifdef TARGET_ABI_MIPSO32
  428. unsigned int syscall_num;
  429. # endif
  430. for(;;) {
  431. cpu_exec_start(cs);
  432. trapnr = cpu_exec(cs);
  433. cpu_exec_end(cs);
  434. process_queued_cpu_work(cs);
  435. switch(trapnr) {
  436. case EXCP_SYSCALL:
  437. env->active_tc.PC += 4;
  438. # ifdef TARGET_ABI_MIPSO32
  439. syscall_num = env->active_tc.gpr[2] - 4000;
  440. if (syscall_num >= sizeof(mips_syscall_args)) {
  441. ret = -TARGET_ENOSYS;
  442. } else {
  443. int nb_args;
  444. abi_ulong sp_reg;
  445. abi_ulong arg5 = 0, arg6 = 0, arg7 = 0, arg8 = 0;
  446. nb_args = mips_syscall_args[syscall_num];
  447. sp_reg = env->active_tc.gpr[29];
  448. switch (nb_args) {
  449. /* these arguments are taken from the stack */
  450. case 8:
  451. if ((ret = get_user_ual(arg8, sp_reg + 28)) != 0) {
  452. goto done_syscall;
  453. }
  454. case 7:
  455. if ((ret = get_user_ual(arg7, sp_reg + 24)) != 0) {
  456. goto done_syscall;
  457. }
  458. case 6:
  459. if ((ret = get_user_ual(arg6, sp_reg + 20)) != 0) {
  460. goto done_syscall;
  461. }
  462. case 5:
  463. if ((ret = get_user_ual(arg5, sp_reg + 16)) != 0) {
  464. goto done_syscall;
  465. }
  466. default:
  467. break;
  468. }
  469. ret = do_syscall(env, env->active_tc.gpr[2],
  470. env->active_tc.gpr[4],
  471. env->active_tc.gpr[5],
  472. env->active_tc.gpr[6],
  473. env->active_tc.gpr[7],
  474. arg5, arg6, arg7, arg8);
  475. }
  476. done_syscall:
  477. # else
  478. ret = do_syscall(env, env->active_tc.gpr[2],
  479. env->active_tc.gpr[4], env->active_tc.gpr[5],
  480. env->active_tc.gpr[6], env->active_tc.gpr[7],
  481. env->active_tc.gpr[8], env->active_tc.gpr[9],
  482. env->active_tc.gpr[10], env->active_tc.gpr[11]);
  483. # endif /* O32 */
  484. if (ret == -TARGET_ERESTARTSYS) {
  485. env->active_tc.PC -= 4;
  486. break;
  487. }
  488. if (ret == -TARGET_QEMU_ESIGRETURN) {
  489. /* Returning from a successful sigreturn syscall.
  490. Avoid clobbering register state. */
  491. break;
  492. }
  493. if ((abi_ulong)ret >= (abi_ulong)-1133) {
  494. env->active_tc.gpr[7] = 1; /* error flag */
  495. ret = -ret;
  496. } else {
  497. env->active_tc.gpr[7] = 0; /* error flag */
  498. }
  499. env->active_tc.gpr[2] = ret;
  500. break;
  501. case EXCP_TLBL:
  502. case EXCP_TLBS:
  503. case EXCP_AdEL:
  504. case EXCP_AdES:
  505. info.si_signo = TARGET_SIGSEGV;
  506. info.si_errno = 0;
  507. /* XXX: check env->error_code */
  508. info.si_code = TARGET_SEGV_MAPERR;
  509. info._sifields._sigfault._addr = env->CP0_BadVAddr;
  510. queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
  511. break;
  512. case EXCP_CpU:
  513. case EXCP_RI:
  514. info.si_signo = TARGET_SIGILL;
  515. info.si_errno = 0;
  516. info.si_code = 0;
  517. queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
  518. break;
  519. case EXCP_INTERRUPT:
  520. /* just indicate that signals should be handled asap */
  521. break;
  522. case EXCP_DEBUG:
  523. info.si_signo = TARGET_SIGTRAP;
  524. info.si_errno = 0;
  525. info.si_code = TARGET_TRAP_BRKPT;
  526. queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
  527. break;
  528. case EXCP_DSPDIS:
  529. info.si_signo = TARGET_SIGILL;
  530. info.si_errno = 0;
  531. info.si_code = TARGET_ILL_ILLOPC;
  532. queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
  533. break;
  534. case EXCP_FPE:
  535. info.si_signo = TARGET_SIGFPE;
  536. info.si_errno = 0;
  537. info.si_code = TARGET_FPE_FLTUNK;
  538. if (GET_FP_CAUSE(env->active_fpu.fcr31) & FP_INVALID) {
  539. info.si_code = TARGET_FPE_FLTINV;
  540. } else if (GET_FP_CAUSE(env->active_fpu.fcr31) & FP_DIV0) {
  541. info.si_code = TARGET_FPE_FLTDIV;
  542. } else if (GET_FP_CAUSE(env->active_fpu.fcr31) & FP_OVERFLOW) {
  543. info.si_code = TARGET_FPE_FLTOVF;
  544. } else if (GET_FP_CAUSE(env->active_fpu.fcr31) & FP_UNDERFLOW) {
  545. info.si_code = TARGET_FPE_FLTUND;
  546. } else if (GET_FP_CAUSE(env->active_fpu.fcr31) & FP_INEXACT) {
  547. info.si_code = TARGET_FPE_FLTRES;
  548. }
  549. queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
  550. break;
  551. /* The code below was inspired by the MIPS Linux kernel trap
  552. * handling code in arch/mips/kernel/traps.c.
  553. */
  554. case EXCP_BREAK:
  555. {
  556. abi_ulong trap_instr;
  557. unsigned int code;
  558. if (env->hflags & MIPS_HFLAG_M16) {
  559. if (env->insn_flags & ASE_MICROMIPS) {
  560. /* microMIPS mode */
  561. ret = get_user_u16(trap_instr, env->active_tc.PC);
  562. if (ret != 0) {
  563. goto error;
  564. }
  565. if ((trap_instr >> 10) == 0x11) {
  566. /* 16-bit instruction */
  567. code = trap_instr & 0xf;
  568. } else {
  569. /* 32-bit instruction */
  570. abi_ulong instr_lo;
  571. ret = get_user_u16(instr_lo,
  572. env->active_tc.PC + 2);
  573. if (ret != 0) {
  574. goto error;
  575. }
  576. trap_instr = (trap_instr << 16) | instr_lo;
  577. code = ((trap_instr >> 6) & ((1 << 20) - 1));
  578. /* Unfortunately, microMIPS also suffers from
  579. the old assembler bug... */
  580. if (code >= (1 << 10)) {
  581. code >>= 10;
  582. }
  583. }
  584. } else {
  585. /* MIPS16e mode */
  586. ret = get_user_u16(trap_instr, env->active_tc.PC);
  587. if (ret != 0) {
  588. goto error;
  589. }
  590. code = (trap_instr >> 6) & 0x3f;
  591. }
  592. } else {
  593. ret = get_user_u32(trap_instr, env->active_tc.PC);
  594. if (ret != 0) {
  595. goto error;
  596. }
  597. /* As described in the original Linux kernel code, the
  598. * below checks on 'code' are to work around an old
  599. * assembly bug.
  600. */
  601. code = ((trap_instr >> 6) & ((1 << 20) - 1));
  602. if (code >= (1 << 10)) {
  603. code >>= 10;
  604. }
  605. }
  606. if (do_break(env, &info, code) != 0) {
  607. goto error;
  608. }
  609. }
  610. break;
  611. case EXCP_TRAP:
  612. {
  613. abi_ulong trap_instr;
  614. unsigned int code = 0;
  615. if (env->hflags & MIPS_HFLAG_M16) {
  616. /* microMIPS mode */
  617. abi_ulong instr[2];
  618. ret = get_user_u16(instr[0], env->active_tc.PC) ||
  619. get_user_u16(instr[1], env->active_tc.PC + 2);
  620. trap_instr = (instr[0] << 16) | instr[1];
  621. } else {
  622. ret = get_user_u32(trap_instr, env->active_tc.PC);
  623. }
  624. if (ret != 0) {
  625. goto error;
  626. }
  627. /* The immediate versions don't provide a code. */
  628. if (!(trap_instr & 0xFC000000)) {
  629. if (env->hflags & MIPS_HFLAG_M16) {
  630. /* microMIPS mode */
  631. code = ((trap_instr >> 12) & ((1 << 4) - 1));
  632. } else {
  633. code = ((trap_instr >> 6) & ((1 << 10) - 1));
  634. }
  635. }
  636. if (do_break(env, &info, code) != 0) {
  637. goto error;
  638. }
  639. }
  640. break;
  641. case EXCP_ATOMIC:
  642. cpu_exec_step_atomic(cs);
  643. break;
  644. default:
  645. error:
  646. EXCP_DUMP(env, "qemu: unhandled CPU exception 0x%x - aborting\n", trapnr);
  647. abort();
  648. }
  649. process_pending_signals(env);
  650. }
  651. }
  652. void target_cpu_copy_regs(CPUArchState *env, struct target_pt_regs *regs)
  653. {
  654. CPUState *cpu = env_cpu(env);
  655. TaskState *ts = cpu->opaque;
  656. struct image_info *info = ts->info;
  657. int i;
  658. struct mode_req {
  659. bool single;
  660. bool soft;
  661. bool fr1;
  662. bool frdefault;
  663. bool fre;
  664. };
  665. static const struct mode_req fpu_reqs[] = {
  666. [MIPS_ABI_FP_ANY] = { true, true, true, true, true },
  667. [MIPS_ABI_FP_DOUBLE] = { false, false, false, true, true },
  668. [MIPS_ABI_FP_SINGLE] = { true, false, false, false, false },
  669. [MIPS_ABI_FP_SOFT] = { false, true, false, false, false },
  670. [MIPS_ABI_FP_OLD_64] = { false, false, false, false, false },
  671. [MIPS_ABI_FP_XX] = { false, false, true, true, true },
  672. [MIPS_ABI_FP_64] = { false, false, true, false, false },
  673. [MIPS_ABI_FP_64A] = { false, false, true, false, true }
  674. };
  675. /*
  676. * Mode requirements when .MIPS.abiflags is not present in the ELF.
  677. * Not present means that everything is acceptable except FR1.
  678. */
  679. static struct mode_req none_req = { true, true, false, true, true };
  680. struct mode_req prog_req;
  681. struct mode_req interp_req;
  682. for(i = 0; i < 32; i++) {
  683. env->active_tc.gpr[i] = regs->regs[i];
  684. }
  685. env->active_tc.PC = regs->cp0_epc & ~(target_ulong)1;
  686. if (regs->cp0_epc & 1) {
  687. env->hflags |= MIPS_HFLAG_M16;
  688. }
  689. #ifdef TARGET_ABI_MIPSO32
  690. # define MAX_FP_ABI MIPS_ABI_FP_64A
  691. #else
  692. # define MAX_FP_ABI MIPS_ABI_FP_SOFT
  693. #endif
  694. if ((info->fp_abi > MAX_FP_ABI && info->fp_abi != MIPS_ABI_FP_UNKNOWN)
  695. || (info->interp_fp_abi > MAX_FP_ABI &&
  696. info->interp_fp_abi != MIPS_ABI_FP_UNKNOWN)) {
  697. fprintf(stderr, "qemu: Unexpected FPU mode\n");
  698. exit(1);
  699. }
  700. prog_req = (info->fp_abi == MIPS_ABI_FP_UNKNOWN) ? none_req
  701. : fpu_reqs[info->fp_abi];
  702. interp_req = (info->interp_fp_abi == MIPS_ABI_FP_UNKNOWN) ? none_req
  703. : fpu_reqs[info->interp_fp_abi];
  704. prog_req.single &= interp_req.single;
  705. prog_req.soft &= interp_req.soft;
  706. prog_req.fr1 &= interp_req.fr1;
  707. prog_req.frdefault &= interp_req.frdefault;
  708. prog_req.fre &= interp_req.fre;
  709. bool cpu_has_mips_r2_r6 = env->insn_flags & ISA_MIPS32R2 ||
  710. env->insn_flags & ISA_MIPS64R2 ||
  711. env->insn_flags & ISA_MIPS32R6 ||
  712. env->insn_flags & ISA_MIPS64R6;
  713. if (prog_req.fre && !prog_req.frdefault && !prog_req.fr1) {
  714. env->CP0_Config5 |= (1 << CP0C5_FRE);
  715. if (env->active_fpu.fcr0 & (1 << FCR0_FREP)) {
  716. env->hflags |= MIPS_HFLAG_FRE;
  717. }
  718. } else if ((prog_req.fr1 && prog_req.frdefault) ||
  719. (prog_req.single && !prog_req.frdefault)) {
  720. if ((env->active_fpu.fcr0 & (1 << FCR0_F64)
  721. && cpu_has_mips_r2_r6) || prog_req.fr1) {
  722. env->CP0_Status |= (1 << CP0St_FR);
  723. env->hflags |= MIPS_HFLAG_F64;
  724. }
  725. } else if (!prog_req.fre && !prog_req.frdefault &&
  726. !prog_req.fr1 && !prog_req.single && !prog_req.soft) {
  727. fprintf(stderr, "qemu: Can't find a matching FPU mode\n");
  728. exit(1);
  729. }
  730. if (env->insn_flags & ISA_NANOMIPS32) {
  731. return;
  732. }
  733. if (((info->elf_flags & EF_MIPS_NAN2008) != 0) !=
  734. ((env->active_fpu.fcr31 & (1 << FCR31_NAN2008)) != 0)) {
  735. if ((env->active_fpu.fcr31_rw_bitmask &
  736. (1 << FCR31_NAN2008)) == 0) {
  737. fprintf(stderr, "ELF binary's NaN mode not supported by CPU\n");
  738. exit(1);
  739. }
  740. if ((info->elf_flags & EF_MIPS_NAN2008) != 0) {
  741. env->active_fpu.fcr31 |= (1 << FCR31_NAN2008);
  742. } else {
  743. env->active_fpu.fcr31 &= ~(1 << FCR31_NAN2008);
  744. }
  745. restore_snan_bit_mode(env);
  746. }
  747. }