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)
395 static int do_store_exclusive(CPUMIPSState
*env
)
398 target_ulong page_addr
;
406 page_addr
= addr
& TARGET_PAGE_MASK
;
409 flags
= page_get_flags(page_addr
);
410 if ((flags
& PAGE_READ
) == 0) {
413 reg
= env
->llreg
& 0x1f;
414 d
= (env
->llreg
& 0x20) != 0;
416 segv
= get_user_s64(val
, addr
);
418 segv
= get_user_s32(val
, addr
);
421 if (val
!= env
->llval
) {
422 env
->active_tc
.gpr
[reg
] = 0;
425 segv
= put_user_u64(env
->llnewval
, addr
);
427 segv
= put_user_u32(env
->llnewval
, addr
);
430 env
->active_tc
.gpr
[reg
] = 1;
437 env
->active_tc
.PC
+= 4;
450 static int do_break(CPUMIPSState
*env
, target_siginfo_t
*info
,
458 info
->si_signo
= TARGET_SIGFPE
;
460 info
->si_code
= (code
== BRK_OVERFLOW
) ? FPE_INTOVF
: FPE_INTDIV
;
461 queue_signal(env
, info
->si_signo
, QEMU_SI_FAULT
, &*info
);
465 info
->si_signo
= TARGET_SIGTRAP
;
467 queue_signal(env
, info
->si_signo
, QEMU_SI_FAULT
, &*info
);
475 void cpu_loop(CPUMIPSState
*env
)
477 CPUState
*cs
= CPU(mips_env_get_cpu(env
));
478 target_siginfo_t info
;
481 # ifdef TARGET_ABI_MIPSO32
482 unsigned int syscall_num
;
487 trapnr
= cpu_exec(cs
);
489 process_queued_cpu_work(cs
);
493 env
->active_tc
.PC
+= 4;
494 # ifdef TARGET_ABI_MIPSO32
495 syscall_num
= env
->active_tc
.gpr
[2] - 4000;
496 if (syscall_num
>= sizeof(mips_syscall_args
)) {
497 ret
= -TARGET_ENOSYS
;
501 abi_ulong arg5
= 0, arg6
= 0, arg7
= 0, arg8
= 0;
503 nb_args
= mips_syscall_args
[syscall_num
];
504 sp_reg
= env
->active_tc
.gpr
[29];
506 /* these arguments are taken from the stack */
508 if ((ret
= get_user_ual(arg8
, sp_reg
+ 28)) != 0) {
512 if ((ret
= get_user_ual(arg7
, sp_reg
+ 24)) != 0) {
516 if ((ret
= get_user_ual(arg6
, sp_reg
+ 20)) != 0) {
520 if ((ret
= get_user_ual(arg5
, sp_reg
+ 16)) != 0) {
526 ret
= do_syscall(env
, env
->active_tc
.gpr
[2],
527 env
->active_tc
.gpr
[4],
528 env
->active_tc
.gpr
[5],
529 env
->active_tc
.gpr
[6],
530 env
->active_tc
.gpr
[7],
531 arg5
, arg6
, arg7
, arg8
);
535 ret
= do_syscall(env
, env
->active_tc
.gpr
[2],
536 env
->active_tc
.gpr
[4], env
->active_tc
.gpr
[5],
537 env
->active_tc
.gpr
[6], env
->active_tc
.gpr
[7],
538 env
->active_tc
.gpr
[8], env
->active_tc
.gpr
[9],
539 env
->active_tc
.gpr
[10], env
->active_tc
.gpr
[11]);
541 if (ret
== -TARGET_ERESTARTSYS
) {
542 env
->active_tc
.PC
-= 4;
545 if (ret
== -TARGET_QEMU_ESIGRETURN
) {
546 /* Returning from a successful sigreturn syscall.
547 Avoid clobbering register state. */
550 if ((abi_ulong
)ret
>= (abi_ulong
)-1133) {
551 env
->active_tc
.gpr
[7] = 1; /* error flag */
554 env
->active_tc
.gpr
[7] = 0; /* error flag */
556 env
->active_tc
.gpr
[2] = ret
;
562 info
.si_signo
= TARGET_SIGSEGV
;
564 /* XXX: check env->error_code */
565 info
.si_code
= TARGET_SEGV_MAPERR
;
566 info
._sifields
._sigfault
._addr
= env
->CP0_BadVAddr
;
567 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
571 info
.si_signo
= TARGET_SIGILL
;
574 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
577 /* just indicate that signals should be handled asap */
583 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
588 info
.si_code
= TARGET_TRAP_BRKPT
;
589 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
594 if (do_store_exclusive(env
)) {
595 info
.si_signo
= TARGET_SIGSEGV
;
597 info
.si_code
= TARGET_SEGV_MAPERR
;
598 info
._sifields
._sigfault
._addr
= env
->active_tc
.PC
;
599 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
603 info
.si_signo
= TARGET_SIGILL
;
605 info
.si_code
= TARGET_ILL_ILLOPC
;
606 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
608 /* The code below was inspired by the MIPS Linux kernel trap
609 * handling code in arch/mips/kernel/traps.c.
613 abi_ulong trap_instr
;
616 if (env
->hflags
& MIPS_HFLAG_M16
) {
617 if (env
->insn_flags
& ASE_MICROMIPS
) {
619 ret
= get_user_u16(trap_instr
, env
->active_tc
.PC
);
624 if ((trap_instr
>> 10) == 0x11) {
625 /* 16-bit instruction */
626 code
= trap_instr
& 0xf;
628 /* 32-bit instruction */
631 ret
= get_user_u16(instr_lo
,
632 env
->active_tc
.PC
+ 2);
636 trap_instr
= (trap_instr
<< 16) | instr_lo
;
637 code
= ((trap_instr
>> 6) & ((1 << 20) - 1));
638 /* Unfortunately, microMIPS also suffers from
639 the old assembler bug... */
640 if (code
>= (1 << 10)) {
646 ret
= get_user_u16(trap_instr
, env
->active_tc
.PC
);
650 code
= (trap_instr
>> 6) & 0x3f;
653 ret
= get_user_u32(trap_instr
, env
->active_tc
.PC
);
658 /* As described in the original Linux kernel code, the
659 * below checks on 'code' are to work around an old
662 code
= ((trap_instr
>> 6) & ((1 << 20) - 1));
663 if (code
>= (1 << 10)) {
668 if (do_break(env
, &info
, code
) != 0) {
675 abi_ulong trap_instr
;
676 unsigned int code
= 0;
678 if (env
->hflags
& MIPS_HFLAG_M16
) {
682 ret
= get_user_u16(instr
[0], env
->active_tc
.PC
) ||
683 get_user_u16(instr
[1], env
->active_tc
.PC
+ 2);
685 trap_instr
= (instr
[0] << 16) | instr
[1];
687 ret
= get_user_u32(trap_instr
, env
->active_tc
.PC
);
694 /* The immediate versions don't provide a code. */
695 if (!(trap_instr
& 0xFC000000)) {
696 if (env
->hflags
& MIPS_HFLAG_M16
) {
698 code
= ((trap_instr
>> 12) & ((1 << 4) - 1));
700 code
= ((trap_instr
>> 6) & ((1 << 10) - 1));
704 if (do_break(env
, &info
, code
) != 0) {
710 cpu_exec_step_atomic(cs
);
714 EXCP_DUMP(env
, "qemu: unhandled CPU exception 0x%x - aborting\n", trapnr
);
717 process_pending_signals(env
);
721 void target_cpu_copy_regs(CPUArchState
*env
, struct target_pt_regs
*regs
)
723 CPUState
*cpu
= ENV_GET_CPU(env
);
724 TaskState
*ts
= cpu
->opaque
;
725 struct image_info
*info
= ts
->info
;
728 for(i
= 0; i
< 32; i
++) {
729 env
->active_tc
.gpr
[i
] = regs
->regs
[i
];
731 env
->active_tc
.PC
= regs
->cp0_epc
& ~(target_ulong
)1;
732 if (regs
->cp0_epc
& 1) {
733 env
->hflags
|= MIPS_HFLAG_M16
;
735 if (((info
->elf_flags
& EF_MIPS_NAN2008
) != 0) !=
736 ((env
->active_fpu
.fcr31
& (1 << FCR31_NAN2008
)) != 0)) {
737 if ((env
->active_fpu
.fcr31_rw_bitmask
&
738 (1 << FCR31_NAN2008
)) == 0) {
739 fprintf(stderr
, "ELF binary's NaN mode not supported by CPU\n");
742 if ((info
->elf_flags
& EF_MIPS_NAN2008
) != 0) {
743 env
->active_fpu
.fcr31
|= (1 << FCR31_NAN2008
);
745 env
->active_fpu
.fcr31
&= ~(1 << FCR31_NAN2008
);
747 restore_snan_bit_mode(env
);