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