4 * Copyright (c) 2003-2008 Fabrice Bellard
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.
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.
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/>.
20 #include "qemu/osdep.h"
21 #include "qemu-common.h"
23 #include "cpu_loop-common.h"
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 */
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 */
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 */
478 static int do_break(CPUMIPSState
*env
, target_siginfo_t
*info
,
486 info
->si_signo
= TARGET_SIGFPE
;
488 info
->si_code
= (code
== BRK_OVERFLOW
) ? FPE_INTOVF
: FPE_INTDIV
;
489 queue_signal(env
, info
->si_signo
, QEMU_SI_FAULT
, &*info
);
493 info
->si_signo
= TARGET_SIGTRAP
;
495 queue_signal(env
, info
->si_signo
, QEMU_SI_FAULT
, &*info
);
503 void cpu_loop(CPUMIPSState
*env
)
505 CPUState
*cs
= env_cpu(env
);
506 target_siginfo_t info
;
509 # ifdef TARGET_ABI_MIPSO32
510 unsigned int syscall_num
;
515 trapnr
= cpu_exec(cs
);
517 process_queued_cpu_work(cs
);
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
;
532 /* syscall_num is valid */
535 abi_ulong arg5
= 0, arg6
= 0, arg7
= 0, arg8
= 0;
537 nb_args
= mips_syscall_args
[syscall_num
];
538 sp_reg
= env
->active_tc
.gpr
[29];
540 /* these arguments are taken from the stack */
542 if ((ret
= get_user_ual(arg8
, sp_reg
+ 28)) != 0) {
546 if ((ret
= get_user_ual(arg7
, sp_reg
+ 24)) != 0) {
550 if ((ret
= get_user_ual(arg6
, sp_reg
+ 20)) != 0) {
554 if ((ret
= get_user_ual(arg5
, sp_reg
+ 16)) != 0) {
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
);
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]);
575 if (ret
== -TARGET_ERESTARTSYS
) {
576 env
->active_tc
.PC
-= 4;
579 if (ret
== -TARGET_QEMU_ESIGRETURN
) {
580 /* Returning from a successful sigreturn syscall.
581 Avoid clobbering register state. */
584 if ((abi_ulong
)ret
>= (abi_ulong
)-1133) {
585 env
->active_tc
.gpr
[7] = 1; /* error flag */
588 env
->active_tc
.gpr
[7] = 0; /* error flag */
590 env
->active_tc
.gpr
[2] = ret
;
596 info
.si_signo
= TARGET_SIGSEGV
;
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
);
605 info
.si_signo
= TARGET_SIGILL
;
608 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
611 /* just indicate that signals should be handled asap */
614 info
.si_signo
= TARGET_SIGTRAP
;
616 info
.si_code
= TARGET_TRAP_BRKPT
;
617 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
620 info
.si_signo
= TARGET_SIGILL
;
622 info
.si_code
= TARGET_ILL_ILLOPC
;
623 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
626 info
.si_signo
= TARGET_SIGFPE
;
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
;
640 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
642 /* The code below was inspired by the MIPS Linux kernel trap
643 * handling code in arch/mips/kernel/traps.c.
647 abi_ulong trap_instr
;
650 if (env
->hflags
& MIPS_HFLAG_M16
) {
651 if (env
->insn_flags
& ASE_MICROMIPS
) {
653 ret
= get_user_u16(trap_instr
, env
->active_tc
.PC
);
658 if ((trap_instr
>> 10) == 0x11) {
659 /* 16-bit instruction */
660 code
= trap_instr
& 0xf;
662 /* 32-bit instruction */
665 ret
= get_user_u16(instr_lo
,
666 env
->active_tc
.PC
+ 2);
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)) {
680 ret
= get_user_u16(trap_instr
, env
->active_tc
.PC
);
684 code
= (trap_instr
>> 6) & 0x3f;
687 ret
= get_user_u32(trap_instr
, env
->active_tc
.PC
);
692 /* As described in the original Linux kernel code, the
693 * below checks on 'code' are to work around an old
696 code
= ((trap_instr
>> 6) & ((1 << 20) - 1));
697 if (code
>= (1 << 10)) {
702 if (do_break(env
, &info
, code
) != 0) {
709 abi_ulong trap_instr
;
710 unsigned int code
= 0;
712 if (env
->hflags
& MIPS_HFLAG_M16
) {
716 ret
= get_user_u16(instr
[0], env
->active_tc
.PC
) ||
717 get_user_u16(instr
[1], env
->active_tc
.PC
+ 2);
719 trap_instr
= (instr
[0] << 16) | instr
[1];
721 ret
= get_user_u32(trap_instr
, env
->active_tc
.PC
);
728 /* The immediate versions don't provide a code. */
729 if (!(trap_instr
& 0xFC000000)) {
730 if (env
->hflags
& MIPS_HFLAG_M16
) {
732 code
= ((trap_instr
>> 12) & ((1 << 4) - 1));
734 code
= ((trap_instr
>> 6) & ((1 << 10) - 1));
738 if (do_break(env
, &info
, code
) != 0) {
744 cpu_exec_step_atomic(cs
);
748 EXCP_DUMP(env
, "qemu: unhandled CPU exception 0x%x - aborting\n", trapnr
);
751 process_pending_signals(env
);
755 void target_cpu_copy_regs(CPUArchState
*env
, struct target_pt_regs
*regs
)
757 CPUState
*cpu
= env_cpu(env
);
758 TaskState
*ts
= cpu
->opaque
;
759 struct image_info
*info
= ts
->info
;
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 }
782 * Mode requirements when .MIPS.abiflags is not present in the ELF.
783 * Not present means that everything is acceptable except FR1.
785 static struct mode_req none_req
= { true, true, false, true, true };
787 struct mode_req prog_req
;
788 struct mode_req interp_req
;
790 for(i
= 0; i
< 32; i
++) {
791 env
->active_tc
.gpr
[i
] = regs
->regs
[i
];
793 env
->active_tc
.PC
= regs
->cp0_epc
& ~(target_ulong
)1;
794 if (regs
->cp0_epc
& 1) {
795 env
->hflags
|= MIPS_HFLAG_M16
;
798 #ifdef TARGET_ABI_MIPSO32
799 # define MAX_FP_ABI MIPS_ABI_FP_64A
801 # define MAX_FP_ABI MIPS_ABI_FP_SOFT
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");
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
];
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
;
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
;
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
;
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
;
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");
844 if (env
->insn_flags
& ISA_NANOMIPS32
) {
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");
854 if ((info
->elf_flags
& EF_MIPS_NAN2008
) != 0) {
855 env
->active_fpu
.fcr31
|= (1 << FCR31_NAN2008
);
857 env
->active_fpu
.fcr31
&= ~(1 << FCR31_NAN2008
);
859 restore_snan_bit_mode(env
);