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