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