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_SYS(name, args) args,
29 static const uint8_t mips_syscall_args
[] = {
30 MIPS_SYS(sys_syscall
, 8) /* 4000 */
31 MIPS_SYS(sys_exit
, 1)
32 MIPS_SYS(sys_fork
, 0)
33 MIPS_SYS(sys_read
, 3)
34 MIPS_SYS(sys_write
, 3)
35 MIPS_SYS(sys_open
, 3) /* 4005 */
36 MIPS_SYS(sys_close
, 1)
37 MIPS_SYS(sys_waitpid
, 3)
38 MIPS_SYS(sys_creat
, 2)
39 MIPS_SYS(sys_link
, 2)
40 MIPS_SYS(sys_unlink
, 1) /* 4010 */
41 MIPS_SYS(sys_execve
, 0)
42 MIPS_SYS(sys_chdir
, 1)
43 MIPS_SYS(sys_time
, 1)
44 MIPS_SYS(sys_mknod
, 3)
45 MIPS_SYS(sys_chmod
, 2) /* 4015 */
46 MIPS_SYS(sys_lchown
, 3)
47 MIPS_SYS(sys_ni_syscall
, 0)
48 MIPS_SYS(sys_ni_syscall
, 0) /* was sys_stat */
49 MIPS_SYS(sys_lseek
, 3)
50 MIPS_SYS(sys_getpid
, 0) /* 4020 */
51 MIPS_SYS(sys_mount
, 5)
52 MIPS_SYS(sys_umount
, 1)
53 MIPS_SYS(sys_setuid
, 1)
54 MIPS_SYS(sys_getuid
, 0)
55 MIPS_SYS(sys_stime
, 1) /* 4025 */
56 MIPS_SYS(sys_ptrace
, 4)
57 MIPS_SYS(sys_alarm
, 1)
58 MIPS_SYS(sys_ni_syscall
, 0) /* was sys_fstat */
59 MIPS_SYS(sys_pause
, 0)
60 MIPS_SYS(sys_utime
, 2) /* 4030 */
61 MIPS_SYS(sys_ni_syscall
, 0)
62 MIPS_SYS(sys_ni_syscall
, 0)
63 MIPS_SYS(sys_access
, 2)
64 MIPS_SYS(sys_nice
, 1)
65 MIPS_SYS(sys_ni_syscall
, 0) /* 4035 */
66 MIPS_SYS(sys_sync
, 0)
67 MIPS_SYS(sys_kill
, 2)
68 MIPS_SYS(sys_rename
, 2)
69 MIPS_SYS(sys_mkdir
, 2)
70 MIPS_SYS(sys_rmdir
, 1) /* 4040 */
72 MIPS_SYS(sys_pipe
, 0)
73 MIPS_SYS(sys_times
, 1)
74 MIPS_SYS(sys_ni_syscall
, 0)
75 MIPS_SYS(sys_brk
, 1) /* 4045 */
76 MIPS_SYS(sys_setgid
, 1)
77 MIPS_SYS(sys_getgid
, 0)
78 MIPS_SYS(sys_ni_syscall
, 0) /* was signal(2) */
79 MIPS_SYS(sys_geteuid
, 0)
80 MIPS_SYS(sys_getegid
, 0) /* 4050 */
81 MIPS_SYS(sys_acct
, 0)
82 MIPS_SYS(sys_umount2
, 2)
83 MIPS_SYS(sys_ni_syscall
, 0)
84 MIPS_SYS(sys_ioctl
, 3)
85 MIPS_SYS(sys_fcntl
, 3) /* 4055 */
86 MIPS_SYS(sys_ni_syscall
, 2)
87 MIPS_SYS(sys_setpgid
, 2)
88 MIPS_SYS(sys_ni_syscall
, 0)
89 MIPS_SYS(sys_olduname
, 1)
90 MIPS_SYS(sys_umask
, 1) /* 4060 */
91 MIPS_SYS(sys_chroot
, 1)
92 MIPS_SYS(sys_ustat
, 2)
93 MIPS_SYS(sys_dup2
, 2)
94 MIPS_SYS(sys_getppid
, 0)
95 MIPS_SYS(sys_getpgrp
, 0) /* 4065 */
96 MIPS_SYS(sys_setsid
, 0)
97 MIPS_SYS(sys_sigaction
, 3)
98 MIPS_SYS(sys_sgetmask
, 0)
99 MIPS_SYS(sys_ssetmask
, 1)
100 MIPS_SYS(sys_setreuid
, 2) /* 4070 */
101 MIPS_SYS(sys_setregid
, 2)
102 MIPS_SYS(sys_sigsuspend
, 0)
103 MIPS_SYS(sys_sigpending
, 1)
104 MIPS_SYS(sys_sethostname
, 2)
105 MIPS_SYS(sys_setrlimit
, 2) /* 4075 */
106 MIPS_SYS(sys_getrlimit
, 2)
107 MIPS_SYS(sys_getrusage
, 2)
108 MIPS_SYS(sys_gettimeofday
, 2)
109 MIPS_SYS(sys_settimeofday
, 2)
110 MIPS_SYS(sys_getgroups
, 2) /* 4080 */
111 MIPS_SYS(sys_setgroups
, 2)
112 MIPS_SYS(sys_ni_syscall
, 0) /* old_select */
113 MIPS_SYS(sys_symlink
, 2)
114 MIPS_SYS(sys_ni_syscall
, 0) /* was sys_lstat */
115 MIPS_SYS(sys_readlink
, 3) /* 4085 */
116 MIPS_SYS(sys_uselib
, 1)
117 MIPS_SYS(sys_swapon
, 2)
118 MIPS_SYS(sys_reboot
, 3)
119 MIPS_SYS(old_readdir
, 3)
120 MIPS_SYS(old_mmap
, 6) /* 4090 */
121 MIPS_SYS(sys_munmap
, 2)
122 MIPS_SYS(sys_truncate
, 2)
123 MIPS_SYS(sys_ftruncate
, 2)
124 MIPS_SYS(sys_fchmod
, 2)
125 MIPS_SYS(sys_fchown
, 3) /* 4095 */
126 MIPS_SYS(sys_getpriority
, 2)
127 MIPS_SYS(sys_setpriority
, 3)
128 MIPS_SYS(sys_ni_syscall
, 0)
129 MIPS_SYS(sys_statfs
, 2)
130 MIPS_SYS(sys_fstatfs
, 2) /* 4100 */
131 MIPS_SYS(sys_ni_syscall
, 0) /* was ioperm(2) */
132 MIPS_SYS(sys_socketcall
, 2)
133 MIPS_SYS(sys_syslog
, 3)
134 MIPS_SYS(sys_setitimer
, 3)
135 MIPS_SYS(sys_getitimer
, 2) /* 4105 */
136 MIPS_SYS(sys_newstat
, 2)
137 MIPS_SYS(sys_newlstat
, 2)
138 MIPS_SYS(sys_newfstat
, 2)
139 MIPS_SYS(sys_uname
, 1)
140 MIPS_SYS(sys_ni_syscall
, 0) /* 4110 was iopl(2) */
141 MIPS_SYS(sys_vhangup
, 0)
142 MIPS_SYS(sys_ni_syscall
, 0) /* was sys_idle() */
143 MIPS_SYS(sys_ni_syscall
, 0) /* was sys_vm86 */
144 MIPS_SYS(sys_wait4
, 4)
145 MIPS_SYS(sys_swapoff
, 1) /* 4115 */
146 MIPS_SYS(sys_sysinfo
, 1)
147 MIPS_SYS(sys_ipc
, 6)
148 MIPS_SYS(sys_fsync
, 1)
149 MIPS_SYS(sys_sigreturn
, 0)
150 MIPS_SYS(sys_clone
, 6) /* 4120 */
151 MIPS_SYS(sys_setdomainname
, 2)
152 MIPS_SYS(sys_newuname
, 1)
153 MIPS_SYS(sys_ni_syscall
, 0) /* sys_modify_ldt */
154 MIPS_SYS(sys_adjtimex
, 1)
155 MIPS_SYS(sys_mprotect
, 3) /* 4125 */
156 MIPS_SYS(sys_sigprocmask
, 3)
157 MIPS_SYS(sys_ni_syscall
, 0) /* was create_module */
158 MIPS_SYS(sys_init_module
, 5)
159 MIPS_SYS(sys_delete_module
, 1)
160 MIPS_SYS(sys_ni_syscall
, 0) /* 4130 was get_kernel_syms */
161 MIPS_SYS(sys_quotactl
, 0)
162 MIPS_SYS(sys_getpgid
, 1)
163 MIPS_SYS(sys_fchdir
, 1)
164 MIPS_SYS(sys_bdflush
, 2)
165 MIPS_SYS(sys_sysfs
, 3) /* 4135 */
166 MIPS_SYS(sys_personality
, 1)
167 MIPS_SYS(sys_ni_syscall
, 0) /* for afs_syscall */
168 MIPS_SYS(sys_setfsuid
, 1)
169 MIPS_SYS(sys_setfsgid
, 1)
170 MIPS_SYS(sys_llseek
, 5) /* 4140 */
171 MIPS_SYS(sys_getdents
, 3)
172 MIPS_SYS(sys_select
, 5)
173 MIPS_SYS(sys_flock
, 2)
174 MIPS_SYS(sys_msync
, 3)
175 MIPS_SYS(sys_readv
, 3) /* 4145 */
176 MIPS_SYS(sys_writev
, 3)
177 MIPS_SYS(sys_cacheflush
, 3)
178 MIPS_SYS(sys_cachectl
, 3)
179 MIPS_SYS(sys_sysmips
, 4)
180 MIPS_SYS(sys_ni_syscall
, 0) /* 4150 */
181 MIPS_SYS(sys_getsid
, 1)
182 MIPS_SYS(sys_fdatasync
, 0)
183 MIPS_SYS(sys_sysctl
, 1)
184 MIPS_SYS(sys_mlock
, 2)
185 MIPS_SYS(sys_munlock
, 2) /* 4155 */
186 MIPS_SYS(sys_mlockall
, 1)
187 MIPS_SYS(sys_munlockall
, 0)
188 MIPS_SYS(sys_sched_setparam
, 2)
189 MIPS_SYS(sys_sched_getparam
, 2)
190 MIPS_SYS(sys_sched_setscheduler
, 3) /* 4160 */
191 MIPS_SYS(sys_sched_getscheduler
, 1)
192 MIPS_SYS(sys_sched_yield
, 0)
193 MIPS_SYS(sys_sched_get_priority_max
, 1)
194 MIPS_SYS(sys_sched_get_priority_min
, 1)
195 MIPS_SYS(sys_sched_rr_get_interval
, 2) /* 4165 */
196 MIPS_SYS(sys_nanosleep
, 2)
197 MIPS_SYS(sys_mremap
, 5)
198 MIPS_SYS(sys_accept
, 3)
199 MIPS_SYS(sys_bind
, 3)
200 MIPS_SYS(sys_connect
, 3) /* 4170 */
201 MIPS_SYS(sys_getpeername
, 3)
202 MIPS_SYS(sys_getsockname
, 3)
203 MIPS_SYS(sys_getsockopt
, 5)
204 MIPS_SYS(sys_listen
, 2)
205 MIPS_SYS(sys_recv
, 4) /* 4175 */
206 MIPS_SYS(sys_recvfrom
, 6)
207 MIPS_SYS(sys_recvmsg
, 3)
208 MIPS_SYS(sys_send
, 4)
209 MIPS_SYS(sys_sendmsg
, 3)
210 MIPS_SYS(sys_sendto
, 6) /* 4180 */
211 MIPS_SYS(sys_setsockopt
, 5)
212 MIPS_SYS(sys_shutdown
, 2)
213 MIPS_SYS(sys_socket
, 3)
214 MIPS_SYS(sys_socketpair
, 4)
215 MIPS_SYS(sys_setresuid
, 3) /* 4185 */
216 MIPS_SYS(sys_getresuid
, 3)
217 MIPS_SYS(sys_ni_syscall
, 0) /* was sys_query_module */
218 MIPS_SYS(sys_poll
, 3)
219 MIPS_SYS(sys_nfsservctl
, 3)
220 MIPS_SYS(sys_setresgid
, 3) /* 4190 */
221 MIPS_SYS(sys_getresgid
, 3)
222 MIPS_SYS(sys_prctl
, 5)
223 MIPS_SYS(sys_rt_sigreturn
, 0)
224 MIPS_SYS(sys_rt_sigaction
, 4)
225 MIPS_SYS(sys_rt_sigprocmask
, 4) /* 4195 */
226 MIPS_SYS(sys_rt_sigpending
, 2)
227 MIPS_SYS(sys_rt_sigtimedwait
, 4)
228 MIPS_SYS(sys_rt_sigqueueinfo
, 3)
229 MIPS_SYS(sys_rt_sigsuspend
, 0)
230 MIPS_SYS(sys_pread64
, 6) /* 4200 */
231 MIPS_SYS(sys_pwrite64
, 6)
232 MIPS_SYS(sys_chown
, 3)
233 MIPS_SYS(sys_getcwd
, 2)
234 MIPS_SYS(sys_capget
, 2)
235 MIPS_SYS(sys_capset
, 2) /* 4205 */
236 MIPS_SYS(sys_sigaltstack
, 2)
237 MIPS_SYS(sys_sendfile
, 4)
238 MIPS_SYS(sys_ni_syscall
, 0)
239 MIPS_SYS(sys_ni_syscall
, 0)
240 MIPS_SYS(sys_mmap2
, 6) /* 4210 */
241 MIPS_SYS(sys_truncate64
, 4)
242 MIPS_SYS(sys_ftruncate64
, 4)
243 MIPS_SYS(sys_stat64
, 2)
244 MIPS_SYS(sys_lstat64
, 2)
245 MIPS_SYS(sys_fstat64
, 2) /* 4215 */
246 MIPS_SYS(sys_pivot_root
, 2)
247 MIPS_SYS(sys_mincore
, 3)
248 MIPS_SYS(sys_madvise
, 3)
249 MIPS_SYS(sys_getdents64
, 3)
250 MIPS_SYS(sys_fcntl64
, 3) /* 4220 */
251 MIPS_SYS(sys_ni_syscall
, 0)
252 MIPS_SYS(sys_gettid
, 0)
253 MIPS_SYS(sys_readahead
, 5)
254 MIPS_SYS(sys_setxattr
, 5)
255 MIPS_SYS(sys_lsetxattr
, 5) /* 4225 */
256 MIPS_SYS(sys_fsetxattr
, 5)
257 MIPS_SYS(sys_getxattr
, 4)
258 MIPS_SYS(sys_lgetxattr
, 4)
259 MIPS_SYS(sys_fgetxattr
, 4)
260 MIPS_SYS(sys_listxattr
, 3) /* 4230 */
261 MIPS_SYS(sys_llistxattr
, 3)
262 MIPS_SYS(sys_flistxattr
, 3)
263 MIPS_SYS(sys_removexattr
, 2)
264 MIPS_SYS(sys_lremovexattr
, 2)
265 MIPS_SYS(sys_fremovexattr
, 2) /* 4235 */
266 MIPS_SYS(sys_tkill
, 2)
267 MIPS_SYS(sys_sendfile64
, 5)
268 MIPS_SYS(sys_futex
, 6)
269 MIPS_SYS(sys_sched_setaffinity
, 3)
270 MIPS_SYS(sys_sched_getaffinity
, 3) /* 4240 */
271 MIPS_SYS(sys_io_setup
, 2)
272 MIPS_SYS(sys_io_destroy
, 1)
273 MIPS_SYS(sys_io_getevents
, 5)
274 MIPS_SYS(sys_io_submit
, 3)
275 MIPS_SYS(sys_io_cancel
, 3) /* 4245 */
276 MIPS_SYS(sys_exit_group
, 1)
277 MIPS_SYS(sys_lookup_dcookie
, 3)
278 MIPS_SYS(sys_epoll_create
, 1)
279 MIPS_SYS(sys_epoll_ctl
, 4)
280 MIPS_SYS(sys_epoll_wait
, 3) /* 4250 */
281 MIPS_SYS(sys_remap_file_pages
, 5)
282 MIPS_SYS(sys_set_tid_address
, 1)
283 MIPS_SYS(sys_restart_syscall
, 0)
284 MIPS_SYS(sys_fadvise64_64
, 7)
285 MIPS_SYS(sys_statfs64
, 3) /* 4255 */
286 MIPS_SYS(sys_fstatfs64
, 2)
287 MIPS_SYS(sys_timer_create
, 3)
288 MIPS_SYS(sys_timer_settime
, 4)
289 MIPS_SYS(sys_timer_gettime
, 2)
290 MIPS_SYS(sys_timer_getoverrun
, 1) /* 4260 */
291 MIPS_SYS(sys_timer_delete
, 1)
292 MIPS_SYS(sys_clock_settime
, 2)
293 MIPS_SYS(sys_clock_gettime
, 2)
294 MIPS_SYS(sys_clock_getres
, 2)
295 MIPS_SYS(sys_clock_nanosleep
, 4) /* 4265 */
296 MIPS_SYS(sys_tgkill
, 3)
297 MIPS_SYS(sys_utimes
, 2)
298 MIPS_SYS(sys_mbind
, 4)
299 MIPS_SYS(sys_ni_syscall
, 0) /* sys_get_mempolicy */
300 MIPS_SYS(sys_ni_syscall
, 0) /* 4270 sys_set_mempolicy */
301 MIPS_SYS(sys_mq_open
, 4)
302 MIPS_SYS(sys_mq_unlink
, 1)
303 MIPS_SYS(sys_mq_timedsend
, 5)
304 MIPS_SYS(sys_mq_timedreceive
, 5)
305 MIPS_SYS(sys_mq_notify
, 2) /* 4275 */
306 MIPS_SYS(sys_mq_getsetattr
, 3)
307 MIPS_SYS(sys_ni_syscall
, 0) /* sys_vserver */
308 MIPS_SYS(sys_waitid
, 4)
309 MIPS_SYS(sys_ni_syscall
, 0) /* available, was setaltroot */
310 MIPS_SYS(sys_add_key
, 5)
311 MIPS_SYS(sys_request_key
, 4)
312 MIPS_SYS(sys_keyctl
, 5)
313 MIPS_SYS(sys_set_thread_area
, 1)
314 MIPS_SYS(sys_inotify_init
, 0)
315 MIPS_SYS(sys_inotify_add_watch
, 3) /* 4285 */
316 MIPS_SYS(sys_inotify_rm_watch
, 2)
317 MIPS_SYS(sys_migrate_pages
, 4)
318 MIPS_SYS(sys_openat
, 4)
319 MIPS_SYS(sys_mkdirat
, 3)
320 MIPS_SYS(sys_mknodat
, 4) /* 4290 */
321 MIPS_SYS(sys_fchownat
, 5)
322 MIPS_SYS(sys_futimesat
, 3)
323 MIPS_SYS(sys_fstatat64
, 4)
324 MIPS_SYS(sys_unlinkat
, 3)
325 MIPS_SYS(sys_renameat
, 4) /* 4295 */
326 MIPS_SYS(sys_linkat
, 5)
327 MIPS_SYS(sys_symlinkat
, 3)
328 MIPS_SYS(sys_readlinkat
, 4)
329 MIPS_SYS(sys_fchmodat
, 3)
330 MIPS_SYS(sys_faccessat
, 3) /* 4300 */
331 MIPS_SYS(sys_pselect6
, 6)
332 MIPS_SYS(sys_ppoll
, 5)
333 MIPS_SYS(sys_unshare
, 1)
334 MIPS_SYS(sys_splice
, 6)
335 MIPS_SYS(sys_sync_file_range
, 7) /* 4305 */
337 MIPS_SYS(sys_vmsplice
, 4)
338 MIPS_SYS(sys_move_pages
, 6)
339 MIPS_SYS(sys_set_robust_list
, 2)
340 MIPS_SYS(sys_get_robust_list
, 3) /* 4310 */
341 MIPS_SYS(sys_kexec_load
, 4)
342 MIPS_SYS(sys_getcpu
, 3)
343 MIPS_SYS(sys_epoll_pwait
, 6)
344 MIPS_SYS(sys_ioprio_set
, 3)
345 MIPS_SYS(sys_ioprio_get
, 2)
346 MIPS_SYS(sys_utimensat
, 4)
347 MIPS_SYS(sys_signalfd
, 3)
348 MIPS_SYS(sys_ni_syscall
, 0) /* was timerfd */
349 MIPS_SYS(sys_eventfd
, 1)
350 MIPS_SYS(sys_fallocate
, 6) /* 4320 */
351 MIPS_SYS(sys_timerfd_create
, 2)
352 MIPS_SYS(sys_timerfd_gettime
, 2)
353 MIPS_SYS(sys_timerfd_settime
, 4)
354 MIPS_SYS(sys_signalfd4
, 4)
355 MIPS_SYS(sys_eventfd2
, 2) /* 4325 */
356 MIPS_SYS(sys_epoll_create1
, 1)
357 MIPS_SYS(sys_dup3
, 3)
358 MIPS_SYS(sys_pipe2
, 2)
359 MIPS_SYS(sys_inotify_init1
, 1)
360 MIPS_SYS(sys_preadv
, 5) /* 4330 */
361 MIPS_SYS(sys_pwritev
, 5)
362 MIPS_SYS(sys_rt_tgsigqueueinfo
, 4)
363 MIPS_SYS(sys_perf_event_open
, 5)
364 MIPS_SYS(sys_accept4
, 4)
365 MIPS_SYS(sys_recvmmsg
, 5) /* 4335 */
366 MIPS_SYS(sys_fanotify_init
, 2)
367 MIPS_SYS(sys_fanotify_mark
, 6)
368 MIPS_SYS(sys_prlimit64
, 4)
369 MIPS_SYS(sys_name_to_handle_at
, 5)
370 MIPS_SYS(sys_open_by_handle_at
, 3) /* 4340 */
371 MIPS_SYS(sys_clock_adjtime
, 2)
372 MIPS_SYS(sys_syncfs
, 1)
373 MIPS_SYS(sys_sendmmsg
, 4)
374 MIPS_SYS(sys_setns
, 2)
375 MIPS_SYS(sys_process_vm_readv
, 6) /* 345 */
376 MIPS_SYS(sys_process_vm_writev
, 6)
377 MIPS_SYS(sys_kcmp
, 5)
378 MIPS_SYS(sys_finit_module
, 3)
379 MIPS_SYS(sys_sched_setattr
, 2)
380 MIPS_SYS(sys_sched_getattr
, 3) /* 350 */
381 MIPS_SYS(sys_renameat2
, 5)
382 MIPS_SYS(sys_seccomp
, 3)
383 MIPS_SYS(sys_getrandom
, 3)
384 MIPS_SYS(sys_memfd_create
, 2)
385 MIPS_SYS(sys_bpf
, 3) /* 355 */
386 MIPS_SYS(sys_execveat
, 5)
387 MIPS_SYS(sys_userfaultfd
, 1)
388 MIPS_SYS(sys_membarrier
, 2)
389 MIPS_SYS(sys_mlock2
, 3)
390 MIPS_SYS(sys_copy_file_range
, 6) /* 360 */
391 MIPS_SYS(sys_preadv2
, 6)
392 MIPS_SYS(sys_pwritev2
, 6)
403 static int do_break(CPUMIPSState
*env
, target_siginfo_t
*info
,
411 info
->si_signo
= TARGET_SIGFPE
;
413 info
->si_code
= (code
== BRK_OVERFLOW
) ? FPE_INTOVF
: FPE_INTDIV
;
414 queue_signal(env
, info
->si_signo
, QEMU_SI_FAULT
, &*info
);
418 info
->si_signo
= TARGET_SIGTRAP
;
420 queue_signal(env
, info
->si_signo
, QEMU_SI_FAULT
, &*info
);
428 void cpu_loop(CPUMIPSState
*env
)
430 CPUState
*cs
= env_cpu(env
);
431 target_siginfo_t info
;
434 # ifdef TARGET_ABI_MIPSO32
435 unsigned int syscall_num
;
440 trapnr
= cpu_exec(cs
);
442 process_queued_cpu_work(cs
);
446 env
->active_tc
.PC
+= 4;
447 # ifdef TARGET_ABI_MIPSO32
448 syscall_num
= env
->active_tc
.gpr
[2] - 4000;
449 if (syscall_num
>= sizeof(mips_syscall_args
)) {
450 ret
= -TARGET_ENOSYS
;
454 abi_ulong arg5
= 0, arg6
= 0, arg7
= 0, arg8
= 0;
456 nb_args
= mips_syscall_args
[syscall_num
];
457 sp_reg
= env
->active_tc
.gpr
[29];
459 /* these arguments are taken from the stack */
461 if ((ret
= get_user_ual(arg8
, sp_reg
+ 28)) != 0) {
465 if ((ret
= get_user_ual(arg7
, sp_reg
+ 24)) != 0) {
469 if ((ret
= get_user_ual(arg6
, sp_reg
+ 20)) != 0) {
473 if ((ret
= get_user_ual(arg5
, sp_reg
+ 16)) != 0) {
479 ret
= do_syscall(env
, env
->active_tc
.gpr
[2],
480 env
->active_tc
.gpr
[4],
481 env
->active_tc
.gpr
[5],
482 env
->active_tc
.gpr
[6],
483 env
->active_tc
.gpr
[7],
484 arg5
, arg6
, arg7
, arg8
);
488 ret
= do_syscall(env
, env
->active_tc
.gpr
[2],
489 env
->active_tc
.gpr
[4], env
->active_tc
.gpr
[5],
490 env
->active_tc
.gpr
[6], env
->active_tc
.gpr
[7],
491 env
->active_tc
.gpr
[8], env
->active_tc
.gpr
[9],
492 env
->active_tc
.gpr
[10], env
->active_tc
.gpr
[11]);
494 if (ret
== -TARGET_ERESTARTSYS
) {
495 env
->active_tc
.PC
-= 4;
498 if (ret
== -TARGET_QEMU_ESIGRETURN
) {
499 /* Returning from a successful sigreturn syscall.
500 Avoid clobbering register state. */
503 if ((abi_ulong
)ret
>= (abi_ulong
)-1133) {
504 env
->active_tc
.gpr
[7] = 1; /* error flag */
507 env
->active_tc
.gpr
[7] = 0; /* error flag */
509 env
->active_tc
.gpr
[2] = ret
;
515 info
.si_signo
= TARGET_SIGSEGV
;
517 /* XXX: check env->error_code */
518 info
.si_code
= TARGET_SEGV_MAPERR
;
519 info
._sifields
._sigfault
._addr
= env
->CP0_BadVAddr
;
520 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
524 info
.si_signo
= TARGET_SIGILL
;
527 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
530 /* just indicate that signals should be handled asap */
533 info
.si_signo
= TARGET_SIGTRAP
;
535 info
.si_code
= TARGET_TRAP_BRKPT
;
536 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
539 info
.si_signo
= TARGET_SIGILL
;
541 info
.si_code
= TARGET_ILL_ILLOPC
;
542 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
545 info
.si_signo
= TARGET_SIGFPE
;
547 info
.si_code
= TARGET_FPE_FLTUNK
;
548 if (GET_FP_CAUSE(env
->active_fpu
.fcr31
) & FP_INVALID
) {
549 info
.si_code
= TARGET_FPE_FLTINV
;
550 } else if (GET_FP_CAUSE(env
->active_fpu
.fcr31
) & FP_DIV0
) {
551 info
.si_code
= TARGET_FPE_FLTDIV
;
552 } else if (GET_FP_CAUSE(env
->active_fpu
.fcr31
) & FP_OVERFLOW
) {
553 info
.si_code
= TARGET_FPE_FLTOVF
;
554 } else if (GET_FP_CAUSE(env
->active_fpu
.fcr31
) & FP_UNDERFLOW
) {
555 info
.si_code
= TARGET_FPE_FLTUND
;
556 } else if (GET_FP_CAUSE(env
->active_fpu
.fcr31
) & FP_INEXACT
) {
557 info
.si_code
= TARGET_FPE_FLTRES
;
559 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
561 /* The code below was inspired by the MIPS Linux kernel trap
562 * handling code in arch/mips/kernel/traps.c.
566 abi_ulong trap_instr
;
569 if (env
->hflags
& MIPS_HFLAG_M16
) {
570 if (env
->insn_flags
& ASE_MICROMIPS
) {
572 ret
= get_user_u16(trap_instr
, env
->active_tc
.PC
);
577 if ((trap_instr
>> 10) == 0x11) {
578 /* 16-bit instruction */
579 code
= trap_instr
& 0xf;
581 /* 32-bit instruction */
584 ret
= get_user_u16(instr_lo
,
585 env
->active_tc
.PC
+ 2);
589 trap_instr
= (trap_instr
<< 16) | instr_lo
;
590 code
= ((trap_instr
>> 6) & ((1 << 20) - 1));
591 /* Unfortunately, microMIPS also suffers from
592 the old assembler bug... */
593 if (code
>= (1 << 10)) {
599 ret
= get_user_u16(trap_instr
, env
->active_tc
.PC
);
603 code
= (trap_instr
>> 6) & 0x3f;
606 ret
= get_user_u32(trap_instr
, env
->active_tc
.PC
);
611 /* As described in the original Linux kernel code, the
612 * below checks on 'code' are to work around an old
615 code
= ((trap_instr
>> 6) & ((1 << 20) - 1));
616 if (code
>= (1 << 10)) {
621 if (do_break(env
, &info
, code
) != 0) {
628 abi_ulong trap_instr
;
629 unsigned int code
= 0;
631 if (env
->hflags
& MIPS_HFLAG_M16
) {
635 ret
= get_user_u16(instr
[0], env
->active_tc
.PC
) ||
636 get_user_u16(instr
[1], env
->active_tc
.PC
+ 2);
638 trap_instr
= (instr
[0] << 16) | instr
[1];
640 ret
= get_user_u32(trap_instr
, env
->active_tc
.PC
);
647 /* The immediate versions don't provide a code. */
648 if (!(trap_instr
& 0xFC000000)) {
649 if (env
->hflags
& MIPS_HFLAG_M16
) {
651 code
= ((trap_instr
>> 12) & ((1 << 4) - 1));
653 code
= ((trap_instr
>> 6) & ((1 << 10) - 1));
657 if (do_break(env
, &info
, code
) != 0) {
663 cpu_exec_step_atomic(cs
);
667 EXCP_DUMP(env
, "qemu: unhandled CPU exception 0x%x - aborting\n", trapnr
);
670 process_pending_signals(env
);
674 void target_cpu_copy_regs(CPUArchState
*env
, struct target_pt_regs
*regs
)
676 CPUState
*cpu
= env_cpu(env
);
677 TaskState
*ts
= cpu
->opaque
;
678 struct image_info
*info
= ts
->info
;
689 static const struct mode_req fpu_reqs
[] = {
690 [MIPS_ABI_FP_ANY
] = { true, true, true, true, true },
691 [MIPS_ABI_FP_DOUBLE
] = { false, false, false, true, true },
692 [MIPS_ABI_FP_SINGLE
] = { true, false, false, false, false },
693 [MIPS_ABI_FP_SOFT
] = { false, true, false, false, false },
694 [MIPS_ABI_FP_OLD_64
] = { false, false, false, false, false },
695 [MIPS_ABI_FP_XX
] = { false, false, true, true, true },
696 [MIPS_ABI_FP_64
] = { false, false, true, false, false },
697 [MIPS_ABI_FP_64A
] = { false, false, true, false, true }
701 * Mode requirements when .MIPS.abiflags is not present in the ELF.
702 * Not present means that everything is acceptable except FR1.
704 static struct mode_req none_req
= { true, true, false, true, true };
706 struct mode_req prog_req
;
707 struct mode_req interp_req
;
709 for(i
= 0; i
< 32; i
++) {
710 env
->active_tc
.gpr
[i
] = regs
->regs
[i
];
712 env
->active_tc
.PC
= regs
->cp0_epc
& ~(target_ulong
)1;
713 if (regs
->cp0_epc
& 1) {
714 env
->hflags
|= MIPS_HFLAG_M16
;
717 #ifdef TARGET_ABI_MIPSO32
718 # define MAX_FP_ABI MIPS_ABI_FP_64A
720 # define MAX_FP_ABI MIPS_ABI_FP_SOFT
722 if ((info
->fp_abi
> MAX_FP_ABI
&& info
->fp_abi
!= MIPS_ABI_FP_UNKNOWN
)
723 || (info
->interp_fp_abi
> MAX_FP_ABI
&&
724 info
->interp_fp_abi
!= MIPS_ABI_FP_UNKNOWN
)) {
725 fprintf(stderr
, "qemu: Unexpected FPU mode\n");
729 prog_req
= (info
->fp_abi
== MIPS_ABI_FP_UNKNOWN
) ? none_req
730 : fpu_reqs
[info
->fp_abi
];
731 interp_req
= (info
->interp_fp_abi
== MIPS_ABI_FP_UNKNOWN
) ? none_req
732 : fpu_reqs
[info
->interp_fp_abi
];
734 prog_req
.single
&= interp_req
.single
;
735 prog_req
.soft
&= interp_req
.soft
;
736 prog_req
.fr1
&= interp_req
.fr1
;
737 prog_req
.frdefault
&= interp_req
.frdefault
;
738 prog_req
.fre
&= interp_req
.fre
;
740 bool cpu_has_mips_r2_r6
= env
->insn_flags
& ISA_MIPS32R2
||
741 env
->insn_flags
& ISA_MIPS64R2
||
742 env
->insn_flags
& ISA_MIPS32R6
||
743 env
->insn_flags
& ISA_MIPS64R6
;
745 if (prog_req
.fre
&& !prog_req
.frdefault
&& !prog_req
.fr1
) {
746 env
->CP0_Config5
|= (1 << CP0C5_FRE
);
747 if (env
->active_fpu
.fcr0
& (1 << FCR0_FREP
)) {
748 env
->hflags
|= MIPS_HFLAG_FRE
;
750 } else if ((prog_req
.fr1
&& prog_req
.frdefault
) ||
751 (prog_req
.single
&& !prog_req
.frdefault
)) {
752 if ((env
->active_fpu
.fcr0
& (1 << FCR0_F64
)
753 && cpu_has_mips_r2_r6
) || prog_req
.fr1
) {
754 env
->CP0_Status
|= (1 << CP0St_FR
);
755 env
->hflags
|= MIPS_HFLAG_F64
;
757 } else if (!prog_req
.fre
&& !prog_req
.frdefault
&&
758 !prog_req
.fr1
&& !prog_req
.single
&& !prog_req
.soft
) {
759 fprintf(stderr
, "qemu: Can't find a matching FPU mode\n");
763 if (env
->insn_flags
& ISA_NANOMIPS32
) {
766 if (((info
->elf_flags
& EF_MIPS_NAN2008
) != 0) !=
767 ((env
->active_fpu
.fcr31
& (1 << FCR31_NAN2008
)) != 0)) {
768 if ((env
->active_fpu
.fcr31_rw_bitmask
&
769 (1 << FCR31_NAN2008
)) == 0) {
770 fprintf(stderr
, "ELF binary's NaN mode not supported by CPU\n");
773 if ((info
->elf_flags
& EF_MIPS_NAN2008
) != 0) {
774 env
->active_fpu
.fcr31
|= (1 << FCR31_NAN2008
);
776 env
->active_fpu
.fcr31
&= ~(1 << FCR31_NAN2008
);
778 restore_snan_bit_mode(env
);