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/>.
19 #include "qemu/osdep.h"
20 #include "qemu-version.h"
21 #include <sys/syscall.h>
22 #include <sys/resource.h>
24 #include "qapi/error.h"
26 #include "qemu/path.h"
27 #include "qemu/config-file.h"
28 #include "qemu/cutils.h"
29 #include "qemu/help_option.h"
31 #include "exec/exec-all.h"
33 #include "qemu/timer.h"
34 #include "qemu/envlist.h"
37 #include "trace/control.h"
38 #include "glib-compat.h"
43 static const char *filename
;
44 static const char *argv0
;
45 static int gdbstub_port
;
46 static envlist_t
*envlist
;
47 static const char *cpu_model
;
48 unsigned long mmap_min_addr
;
49 unsigned long guest_base
;
52 #define EXCP_DUMP(env, fmt, ...) \
54 CPUState *cs = ENV_GET_CPU(env); \
55 fprintf(stderr, fmt , ## __VA_ARGS__); \
56 cpu_dump_state(cs, stderr, fprintf, 0); \
57 if (qemu_log_separate()) { \
58 qemu_log(fmt, ## __VA_ARGS__); \
59 log_cpu_state(cs, 0); \
63 #if (TARGET_LONG_BITS == 32) && (HOST_LONG_BITS == 64)
65 * When running 32-on-64 we should make sure we can fit all of the possible
66 * guest address space into a contiguous chunk of virtual host memory.
68 * This way we will never overlap with our own libraries or binaries or stack
69 * or anything else that QEMU maps.
72 /* MIPS only supports 31 bits of virtual address space for user space */
73 unsigned long reserved_va
= 0x77000000;
75 unsigned long reserved_va
= 0xf7000000;
78 unsigned long reserved_va
;
81 static void usage(int exitcode
);
83 static const char *interp_prefix
= CONFIG_QEMU_INTERP_PREFIX
;
84 const char *qemu_uname_release
;
86 /* XXX: on x86 MAP_GROWSDOWN only works if ESP <= address + 32, so
87 we allocate a bigger stack. Need a better solution, for example
88 by remapping the process stack directly at the right place */
89 unsigned long guest_stack_size
= 8 * 1024 * 1024UL;
91 void gemu_log(const char *fmt
, ...)
96 vfprintf(stderr
, fmt
, ap
);
100 #if defined(TARGET_I386)
101 int cpu_get_pic_interrupt(CPUX86State
*env
)
107 /***********************************************************/
108 /* Helper routines for implementing atomic operations. */
110 /* Make sure everything is in a consistent state for calling fork(). */
111 void fork_start(void)
114 qemu_mutex_lock(&tcg_ctx
.tb_ctx
.tb_lock
);
118 void fork_end(int child
)
120 mmap_fork_end(child
);
122 CPUState
*cpu
, *next_cpu
;
123 /* Child processes created by fork() only have a single thread.
124 Discard information about the parent threads. */
125 CPU_FOREACH_SAFE(cpu
, next_cpu
) {
126 if (cpu
!= thread_cpu
) {
127 QTAILQ_REMOVE(&cpus
, cpu
, node
);
130 qemu_mutex_init(&tcg_ctx
.tb_ctx
.tb_lock
);
131 qemu_init_cpu_list();
132 gdbserver_fork(thread_cpu
);
134 qemu_mutex_unlock(&tcg_ctx
.tb_ctx
.tb_lock
);
140 /***********************************************************/
141 /* CPUX86 core interface */
143 uint64_t cpu_get_tsc(CPUX86State
*env
)
145 return cpu_get_host_ticks();
148 static void write_dt(void *ptr
, unsigned long addr
, unsigned long limit
,
153 e1
= (addr
<< 16) | (limit
& 0xffff);
154 e2
= ((addr
>> 16) & 0xff) | (addr
& 0xff000000) | (limit
& 0x000f0000);
161 static uint64_t *idt_table
;
163 static void set_gate64(void *ptr
, unsigned int type
, unsigned int dpl
,
164 uint64_t addr
, unsigned int sel
)
167 e1
= (addr
& 0xffff) | (sel
<< 16);
168 e2
= (addr
& 0xffff0000) | 0x8000 | (dpl
<< 13) | (type
<< 8);
172 p
[2] = tswap32(addr
>> 32);
175 /* only dpl matters as we do only user space emulation */
176 static void set_idt(int n
, unsigned int dpl
)
178 set_gate64(idt_table
+ n
* 2, 0, dpl
, 0, 0);
181 static void set_gate(void *ptr
, unsigned int type
, unsigned int dpl
,
182 uint32_t addr
, unsigned int sel
)
185 e1
= (addr
& 0xffff) | (sel
<< 16);
186 e2
= (addr
& 0xffff0000) | 0x8000 | (dpl
<< 13) | (type
<< 8);
192 /* only dpl matters as we do only user space emulation */
193 static void set_idt(int n
, unsigned int dpl
)
195 set_gate(idt_table
+ n
, 0, dpl
, 0, 0);
199 void cpu_loop(CPUX86State
*env
)
201 CPUState
*cs
= CPU(x86_env_get_cpu(env
));
205 target_siginfo_t info
;
209 trapnr
= cpu_exec(cs
);
211 process_queued_cpu_work(cs
);
215 /* linux syscall from int $0x80 */
216 ret
= do_syscall(env
,
225 if (ret
== -TARGET_ERESTARTSYS
) {
227 } else if (ret
!= -TARGET_QEMU_ESIGRETURN
) {
228 env
->regs
[R_EAX
] = ret
;
233 /* linux syscall from syscall instruction */
234 ret
= do_syscall(env
,
243 if (ret
== -TARGET_ERESTARTSYS
) {
245 } else if (ret
!= -TARGET_QEMU_ESIGRETURN
) {
246 env
->regs
[R_EAX
] = ret
;
252 info
.si_signo
= TARGET_SIGBUS
;
254 info
.si_code
= TARGET_SI_KERNEL
;
255 info
._sifields
._sigfault
._addr
= 0;
256 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
259 /* XXX: potential problem if ABI32 */
260 #ifndef TARGET_X86_64
261 if (env
->eflags
& VM_MASK
) {
262 handle_vm86_fault(env
);
266 info
.si_signo
= TARGET_SIGSEGV
;
268 info
.si_code
= TARGET_SI_KERNEL
;
269 info
._sifields
._sigfault
._addr
= 0;
270 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
274 info
.si_signo
= TARGET_SIGSEGV
;
276 if (!(env
->error_code
& 1))
277 info
.si_code
= TARGET_SEGV_MAPERR
;
279 info
.si_code
= TARGET_SEGV_ACCERR
;
280 info
._sifields
._sigfault
._addr
= env
->cr
[2];
281 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
284 #ifndef TARGET_X86_64
285 if (env
->eflags
& VM_MASK
) {
286 handle_vm86_trap(env
, trapnr
);
290 /* division by zero */
291 info
.si_signo
= TARGET_SIGFPE
;
293 info
.si_code
= TARGET_FPE_INTDIV
;
294 info
._sifields
._sigfault
._addr
= env
->eip
;
295 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
300 #ifndef TARGET_X86_64
301 if (env
->eflags
& VM_MASK
) {
302 handle_vm86_trap(env
, trapnr
);
306 info
.si_signo
= TARGET_SIGTRAP
;
308 if (trapnr
== EXCP01_DB
) {
309 info
.si_code
= TARGET_TRAP_BRKPT
;
310 info
._sifields
._sigfault
._addr
= env
->eip
;
312 info
.si_code
= TARGET_SI_KERNEL
;
313 info
._sifields
._sigfault
._addr
= 0;
315 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
320 #ifndef TARGET_X86_64
321 if (env
->eflags
& VM_MASK
) {
322 handle_vm86_trap(env
, trapnr
);
326 info
.si_signo
= TARGET_SIGSEGV
;
328 info
.si_code
= TARGET_SI_KERNEL
;
329 info
._sifields
._sigfault
._addr
= 0;
330 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
334 info
.si_signo
= TARGET_SIGILL
;
336 info
.si_code
= TARGET_ILL_ILLOPN
;
337 info
._sifields
._sigfault
._addr
= env
->eip
;
338 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
341 /* just indicate that signals should be handled asap */
347 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
352 info
.si_code
= TARGET_TRAP_BRKPT
;
353 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
358 cpu_exec_step_atomic(cs
);
361 pc
= env
->segs
[R_CS
].base
+ env
->eip
;
362 EXCP_DUMP(env
, "qemu: 0x%08lx: unhandled CPU exception 0x%x - aborting\n",
366 process_pending_signals(env
);
373 #define get_user_code_u32(x, gaddr, env) \
374 ({ abi_long __r = get_user_u32((x), (gaddr)); \
375 if (!__r && bswap_code(arm_sctlr_b(env))) { \
381 #define get_user_code_u16(x, gaddr, env) \
382 ({ abi_long __r = get_user_u16((x), (gaddr)); \
383 if (!__r && bswap_code(arm_sctlr_b(env))) { \
389 #define get_user_data_u32(x, gaddr, env) \
390 ({ abi_long __r = get_user_u32((x), (gaddr)); \
391 if (!__r && arm_cpu_bswap_data(env)) { \
397 #define get_user_data_u16(x, gaddr, env) \
398 ({ abi_long __r = get_user_u16((x), (gaddr)); \
399 if (!__r && arm_cpu_bswap_data(env)) { \
405 #define put_user_data_u32(x, gaddr, env) \
406 ({ typeof(x) __x = (x); \
407 if (arm_cpu_bswap_data(env)) { \
408 __x = bswap32(__x); \
410 put_user_u32(__x, (gaddr)); \
413 #define put_user_data_u16(x, gaddr, env) \
414 ({ typeof(x) __x = (x); \
415 if (arm_cpu_bswap_data(env)) { \
416 __x = bswap16(__x); \
418 put_user_u16(__x, (gaddr)); \
422 /* Commpage handling -- there is no commpage for AArch64 */
425 * See the Linux kernel's Documentation/arm/kernel_user_helpers.txt
427 * r0 = pointer to oldval
428 * r1 = pointer to newval
429 * r2 = pointer to target value
432 * r0 = 0 if *ptr was changed, non-0 if no exchange happened
433 * C set if *ptr was changed, clear if no exchange happened
435 * Note segv's in kernel helpers are a bit tricky, we can set the
436 * data address sensibly but the PC address is just the entry point.
438 static void arm_kernel_cmpxchg64_helper(CPUARMState
*env
)
440 uint64_t oldval
, newval
, val
;
442 target_siginfo_t info
;
444 /* Based on the 32 bit code in do_kernel_trap */
446 /* XXX: This only works between threads, not between processes.
447 It's probably possible to implement this with native host
448 operations. However things like ldrex/strex are much harder so
449 there's not much point trying. */
451 cpsr
= cpsr_read(env
);
454 if (get_user_u64(oldval
, env
->regs
[0])) {
455 env
->exception
.vaddress
= env
->regs
[0];
459 if (get_user_u64(newval
, env
->regs
[1])) {
460 env
->exception
.vaddress
= env
->regs
[1];
464 if (get_user_u64(val
, addr
)) {
465 env
->exception
.vaddress
= addr
;
472 if (put_user_u64(val
, addr
)) {
473 env
->exception
.vaddress
= addr
;
483 cpsr_write(env
, cpsr
, CPSR_C
, CPSRWriteByInstr
);
489 /* We get the PC of the entry address - which is as good as anything,
490 on a real kernel what you get depends on which mode it uses. */
491 info
.si_signo
= TARGET_SIGSEGV
;
493 /* XXX: check env->error_code */
494 info
.si_code
= TARGET_SEGV_MAPERR
;
495 info
._sifields
._sigfault
._addr
= env
->exception
.vaddress
;
496 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
499 /* Handle a jump to the kernel code page. */
501 do_kernel_trap(CPUARMState
*env
)
507 switch (env
->regs
[15]) {
508 case 0xffff0fa0: /* __kernel_memory_barrier */
509 /* ??? No-op. Will need to do better for SMP. */
511 case 0xffff0fc0: /* __kernel_cmpxchg */
512 /* XXX: This only works between threads, not between processes.
513 It's probably possible to implement this with native host
514 operations. However things like ldrex/strex are much harder so
515 there's not much point trying. */
517 cpsr
= cpsr_read(env
);
519 /* FIXME: This should SEGV if the access fails. */
520 if (get_user_u32(val
, addr
))
522 if (val
== env
->regs
[0]) {
524 /* FIXME: Check for segfaults. */
525 put_user_u32(val
, addr
);
532 cpsr_write(env
, cpsr
, CPSR_C
, CPSRWriteByInstr
);
535 case 0xffff0fe0: /* __kernel_get_tls */
536 env
->regs
[0] = cpu_get_tls(env
);
538 case 0xffff0f60: /* __kernel_cmpxchg64 */
539 arm_kernel_cmpxchg64_helper(env
);
545 /* Jump back to the caller. */
546 addr
= env
->regs
[14];
551 env
->regs
[15] = addr
;
556 void cpu_loop(CPUARMState
*env
)
558 CPUState
*cs
= CPU(arm_env_get_cpu(env
));
560 unsigned int n
, insn
;
561 target_siginfo_t info
;
567 trapnr
= cpu_exec(cs
);
569 process_queued_cpu_work(cs
);
574 TaskState
*ts
= cs
->opaque
;
578 /* we handle the FPU emulation here, as Linux */
579 /* we get the opcode */
580 /* FIXME - what to do if get_user() fails? */
581 get_user_code_u32(opcode
, env
->regs
[15], env
);
583 rc
= EmulateAll(opcode
, &ts
->fpa
, env
);
584 if (rc
== 0) { /* illegal instruction */
585 info
.si_signo
= TARGET_SIGILL
;
587 info
.si_code
= TARGET_ILL_ILLOPN
;
588 info
._sifields
._sigfault
._addr
= env
->regs
[15];
589 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
590 } else if (rc
< 0) { /* FP exception */
593 /* translate softfloat flags to FPSR flags */
594 if (-rc
& float_flag_invalid
)
596 if (-rc
& float_flag_divbyzero
)
598 if (-rc
& float_flag_overflow
)
600 if (-rc
& float_flag_underflow
)
602 if (-rc
& float_flag_inexact
)
605 FPSR fpsr
= ts
->fpa
.fpsr
;
606 //printf("fpsr 0x%x, arm_fpe 0x%x\n",fpsr,arm_fpe);
608 if (fpsr
& (arm_fpe
<< 16)) { /* exception enabled? */
609 info
.si_signo
= TARGET_SIGFPE
;
612 /* ordered by priority, least first */
613 if (arm_fpe
& BIT_IXC
) info
.si_code
= TARGET_FPE_FLTRES
;
614 if (arm_fpe
& BIT_UFC
) info
.si_code
= TARGET_FPE_FLTUND
;
615 if (arm_fpe
& BIT_OFC
) info
.si_code
= TARGET_FPE_FLTOVF
;
616 if (arm_fpe
& BIT_DZC
) info
.si_code
= TARGET_FPE_FLTDIV
;
617 if (arm_fpe
& BIT_IOC
) info
.si_code
= TARGET_FPE_FLTINV
;
619 info
._sifields
._sigfault
._addr
= env
->regs
[15];
620 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
625 /* accumulate unenabled exceptions */
626 if ((!(fpsr
& BIT_IXE
)) && (arm_fpe
& BIT_IXC
))
628 if ((!(fpsr
& BIT_UFE
)) && (arm_fpe
& BIT_UFC
))
630 if ((!(fpsr
& BIT_OFE
)) && (arm_fpe
& BIT_OFC
))
632 if ((!(fpsr
& BIT_DZE
)) && (arm_fpe
& BIT_DZC
))
634 if ((!(fpsr
& BIT_IOE
)) && (arm_fpe
& BIT_IOC
))
637 } else { /* everything OK */
648 if (trapnr
== EXCP_BKPT
) {
650 /* FIXME - what to do if get_user() fails? */
651 get_user_code_u16(insn
, env
->regs
[15], env
);
655 /* FIXME - what to do if get_user() fails? */
656 get_user_code_u32(insn
, env
->regs
[15], env
);
657 n
= (insn
& 0xf) | ((insn
>> 4) & 0xff0);
662 /* FIXME - what to do if get_user() fails? */
663 get_user_code_u16(insn
, env
->regs
[15] - 2, env
);
666 /* FIXME - what to do if get_user() fails? */
667 get_user_code_u32(insn
, env
->regs
[15] - 4, env
);
672 if (n
== ARM_NR_cacheflush
) {
674 } else if (n
== ARM_NR_semihosting
675 || n
== ARM_NR_thumb_semihosting
) {
676 env
->regs
[0] = do_arm_semihosting (env
);
677 } else if (n
== 0 || n
>= ARM_SYSCALL_BASE
|| env
->thumb
) {
679 if (env
->thumb
|| n
== 0) {
682 n
-= ARM_SYSCALL_BASE
;
685 if ( n
> ARM_NR_BASE
) {
687 case ARM_NR_cacheflush
:
691 cpu_set_tls(env
, env
->regs
[0]);
694 case ARM_NR_breakpoint
:
695 env
->regs
[15] -= env
->thumb
? 2 : 4;
698 gemu_log("qemu: Unsupported ARM syscall: 0x%x\n",
700 env
->regs
[0] = -TARGET_ENOSYS
;
704 ret
= do_syscall(env
,
713 if (ret
== -TARGET_ERESTARTSYS
) {
714 env
->regs
[15] -= env
->thumb
? 2 : 4;
715 } else if (ret
!= -TARGET_QEMU_ESIGRETURN
) {
725 env
->regs
[0] = do_arm_semihosting(env
);
728 /* just indicate that signals should be handled asap */
730 case EXCP_PREFETCH_ABORT
:
731 case EXCP_DATA_ABORT
:
732 addr
= env
->exception
.vaddress
;
734 info
.si_signo
= TARGET_SIGSEGV
;
736 /* XXX: check env->error_code */
737 info
.si_code
= TARGET_SEGV_MAPERR
;
738 info
._sifields
._sigfault
._addr
= addr
;
739 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
747 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
752 info
.si_code
= TARGET_TRAP_BRKPT
;
753 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
757 case EXCP_KERNEL_TRAP
:
758 if (do_kernel_trap(env
))
762 /* nothing to do here for user-mode, just resume guest code */
765 cpu_exec_step_atomic(cs
);
769 EXCP_DUMP(env
, "qemu: unhandled CPU exception 0x%x - aborting\n", trapnr
);
772 process_pending_signals(env
);
778 /* AArch64 main loop */
779 void cpu_loop(CPUARMState
*env
)
781 CPUState
*cs
= CPU(arm_env_get_cpu(env
));
784 target_siginfo_t info
;
788 trapnr
= cpu_exec(cs
);
790 process_queued_cpu_work(cs
);
794 ret
= do_syscall(env
,
803 if (ret
== -TARGET_ERESTARTSYS
) {
805 } else if (ret
!= -TARGET_QEMU_ESIGRETURN
) {
810 /* just indicate that signals should be handled asap */
813 info
.si_signo
= TARGET_SIGILL
;
815 info
.si_code
= TARGET_ILL_ILLOPN
;
816 info
._sifields
._sigfault
._addr
= env
->pc
;
817 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
819 case EXCP_PREFETCH_ABORT
:
820 case EXCP_DATA_ABORT
:
821 info
.si_signo
= TARGET_SIGSEGV
;
823 /* XXX: check env->error_code */
824 info
.si_code
= TARGET_SEGV_MAPERR
;
825 info
._sifields
._sigfault
._addr
= env
->exception
.vaddress
;
826 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
830 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
834 info
.si_code
= TARGET_TRAP_BRKPT
;
835 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
839 env
->xregs
[0] = do_arm_semihosting(env
);
842 /* nothing to do here for user-mode, just resume guest code */
845 cpu_exec_step_atomic(cs
);
848 EXCP_DUMP(env
, "qemu: unhandled CPU exception 0x%x - aborting\n", trapnr
);
851 process_pending_signals(env
);
852 /* Exception return on AArch64 always clears the exclusive monitor,
853 * so any return to running guest code implies this.
855 env
->exclusive_addr
= -1;
858 #endif /* ndef TARGET_ABI32 */
862 #ifdef TARGET_UNICORE32
864 void cpu_loop(CPUUniCore32State
*env
)
866 CPUState
*cs
= CPU(uc32_env_get_cpu(env
));
868 unsigned int n
, insn
;
869 target_siginfo_t info
;
873 trapnr
= cpu_exec(cs
);
875 process_queued_cpu_work(cs
);
881 get_user_u32(insn
, env
->regs
[31] - 4);
884 if (n
>= UC32_SYSCALL_BASE
) {
886 n
-= UC32_SYSCALL_BASE
;
887 if (n
== UC32_SYSCALL_NR_set_tls
) {
888 cpu_set_tls(env
, env
->regs
[0]);
891 abi_long ret
= do_syscall(env
,
900 if (ret
== -TARGET_ERESTARTSYS
) {
902 } else if (ret
!= -TARGET_QEMU_ESIGRETURN
) {
911 case UC32_EXCP_DTRAP
:
912 case UC32_EXCP_ITRAP
:
913 info
.si_signo
= TARGET_SIGSEGV
;
915 /* XXX: check env->error_code */
916 info
.si_code
= TARGET_SEGV_MAPERR
;
917 info
._sifields
._sigfault
._addr
= env
->cp0
.c4_faultaddr
;
918 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
921 /* just indicate that signals should be handled asap */
927 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
931 info
.si_code
= TARGET_TRAP_BRKPT
;
932 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
937 cpu_exec_step_atomic(cs
);
942 process_pending_signals(env
);
946 EXCP_DUMP(env
, "qemu: unhandled CPU exception 0x%x - aborting\n", trapnr
);
952 #define SPARC64_STACK_BIAS 2047
956 /* WARNING: dealing with register windows _is_ complicated. More info
957 can be found at http://www.sics.se/~psm/sparcstack.html */
958 static inline int get_reg_index(CPUSPARCState
*env
, int cwp
, int index
)
960 index
= (index
+ cwp
* 16) % (16 * env
->nwindows
);
961 /* wrap handling : if cwp is on the last window, then we use the
962 registers 'after' the end */
963 if (index
< 8 && env
->cwp
== env
->nwindows
- 1)
964 index
+= 16 * env
->nwindows
;
968 /* save the register window 'cwp1' */
969 static inline void save_window_offset(CPUSPARCState
*env
, int cwp1
)
974 sp_ptr
= env
->regbase
[get_reg_index(env
, cwp1
, 6)];
975 #ifdef TARGET_SPARC64
977 sp_ptr
+= SPARC64_STACK_BIAS
;
979 #if defined(DEBUG_WIN)
980 printf("win_overflow: sp_ptr=0x" TARGET_ABI_FMT_lx
" save_cwp=%d\n",
983 for(i
= 0; i
< 16; i
++) {
984 /* FIXME - what to do if put_user() fails? */
985 put_user_ual(env
->regbase
[get_reg_index(env
, cwp1
, 8 + i
)], sp_ptr
);
986 sp_ptr
+= sizeof(abi_ulong
);
990 static void save_window(CPUSPARCState
*env
)
992 #ifndef TARGET_SPARC64
993 unsigned int new_wim
;
994 new_wim
= ((env
->wim
>> 1) | (env
->wim
<< (env
->nwindows
- 1))) &
995 ((1LL << env
->nwindows
) - 1);
996 save_window_offset(env
, cpu_cwp_dec(env
, env
->cwp
- 2));
999 save_window_offset(env
, cpu_cwp_dec(env
, env
->cwp
- 2));
1005 static void restore_window(CPUSPARCState
*env
)
1007 #ifndef TARGET_SPARC64
1008 unsigned int new_wim
;
1010 unsigned int i
, cwp1
;
1013 #ifndef TARGET_SPARC64
1014 new_wim
= ((env
->wim
<< 1) | (env
->wim
>> (env
->nwindows
- 1))) &
1015 ((1LL << env
->nwindows
) - 1);
1018 /* restore the invalid window */
1019 cwp1
= cpu_cwp_inc(env
, env
->cwp
+ 1);
1020 sp_ptr
= env
->regbase
[get_reg_index(env
, cwp1
, 6)];
1021 #ifdef TARGET_SPARC64
1023 sp_ptr
+= SPARC64_STACK_BIAS
;
1025 #if defined(DEBUG_WIN)
1026 printf("win_underflow: sp_ptr=0x" TARGET_ABI_FMT_lx
" load_cwp=%d\n",
1029 for(i
= 0; i
< 16; i
++) {
1030 /* FIXME - what to do if get_user() fails? */
1031 get_user_ual(env
->regbase
[get_reg_index(env
, cwp1
, 8 + i
)], sp_ptr
);
1032 sp_ptr
+= sizeof(abi_ulong
);
1034 #ifdef TARGET_SPARC64
1036 if (env
->cleanwin
< env
->nwindows
- 1)
1044 static void flush_windows(CPUSPARCState
*env
)
1050 /* if restore would invoke restore_window(), then we can stop */
1051 cwp1
= cpu_cwp_inc(env
, env
->cwp
+ offset
);
1052 #ifndef TARGET_SPARC64
1053 if (env
->wim
& (1 << cwp1
))
1056 if (env
->canrestore
== 0)
1061 save_window_offset(env
, cwp1
);
1064 cwp1
= cpu_cwp_inc(env
, env
->cwp
+ 1);
1065 #ifndef TARGET_SPARC64
1066 /* set wim so that restore will reload the registers */
1067 env
->wim
= 1 << cwp1
;
1069 #if defined(DEBUG_WIN)
1070 printf("flush_windows: nb=%d\n", offset
- 1);
1074 void cpu_loop (CPUSPARCState
*env
)
1076 CPUState
*cs
= CPU(sparc_env_get_cpu(env
));
1079 target_siginfo_t info
;
1083 trapnr
= cpu_exec(cs
);
1085 process_queued_cpu_work(cs
);
1087 /* Compute PSR before exposing state. */
1088 if (env
->cc_op
!= CC_OP_FLAGS
) {
1093 #ifndef TARGET_SPARC64
1100 ret
= do_syscall (env
, env
->gregs
[1],
1101 env
->regwptr
[0], env
->regwptr
[1],
1102 env
->regwptr
[2], env
->regwptr
[3],
1103 env
->regwptr
[4], env
->regwptr
[5],
1105 if (ret
== -TARGET_ERESTARTSYS
|| ret
== -TARGET_QEMU_ESIGRETURN
) {
1108 if ((abi_ulong
)ret
>= (abi_ulong
)(-515)) {
1109 #if defined(TARGET_SPARC64) && !defined(TARGET_ABI32)
1110 env
->xcc
|= PSR_CARRY
;
1112 env
->psr
|= PSR_CARRY
;
1116 #if defined(TARGET_SPARC64) && !defined(TARGET_ABI32)
1117 env
->xcc
&= ~PSR_CARRY
;
1119 env
->psr
&= ~PSR_CARRY
;
1122 env
->regwptr
[0] = ret
;
1123 /* next instruction */
1125 env
->npc
= env
->npc
+ 4;
1127 case 0x83: /* flush windows */
1132 /* next instruction */
1134 env
->npc
= env
->npc
+ 4;
1136 #ifndef TARGET_SPARC64
1137 case TT_WIN_OVF
: /* window overflow */
1140 case TT_WIN_UNF
: /* window underflow */
1141 restore_window(env
);
1146 info
.si_signo
= TARGET_SIGSEGV
;
1148 /* XXX: check env->error_code */
1149 info
.si_code
= TARGET_SEGV_MAPERR
;
1150 info
._sifields
._sigfault
._addr
= env
->mmuregs
[4];
1151 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
1155 case TT_SPILL
: /* window overflow */
1158 case TT_FILL
: /* window underflow */
1159 restore_window(env
);
1164 info
.si_signo
= TARGET_SIGSEGV
;
1166 /* XXX: check env->error_code */
1167 info
.si_code
= TARGET_SEGV_MAPERR
;
1168 if (trapnr
== TT_DFAULT
)
1169 info
._sifields
._sigfault
._addr
= env
->dmmuregs
[4];
1171 info
._sifields
._sigfault
._addr
= cpu_tsptr(env
)->tpc
;
1172 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
1175 #ifndef TARGET_ABI32
1178 sparc64_get_context(env
);
1182 sparc64_set_context(env
);
1186 case EXCP_INTERRUPT
:
1187 /* just indicate that signals should be handled asap */
1191 info
.si_signo
= TARGET_SIGILL
;
1193 info
.si_code
= TARGET_ILL_ILLOPC
;
1194 info
._sifields
._sigfault
._addr
= env
->pc
;
1195 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
1202 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
1205 info
.si_signo
= sig
;
1207 info
.si_code
= TARGET_TRAP_BRKPT
;
1208 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
1213 cpu_exec_step_atomic(cs
);
1216 printf ("Unhandled trap: 0x%x\n", trapnr
);
1217 cpu_dump_state(cs
, stderr
, fprintf
, 0);
1220 process_pending_signals (env
);
1227 static inline uint64_t cpu_ppc_get_tb(CPUPPCState
*env
)
1229 return cpu_get_host_ticks();
1232 uint64_t cpu_ppc_load_tbl(CPUPPCState
*env
)
1234 return cpu_ppc_get_tb(env
);
1237 uint32_t cpu_ppc_load_tbu(CPUPPCState
*env
)
1239 return cpu_ppc_get_tb(env
) >> 32;
1242 uint64_t cpu_ppc_load_atbl(CPUPPCState
*env
)
1244 return cpu_ppc_get_tb(env
);
1247 uint32_t cpu_ppc_load_atbu(CPUPPCState
*env
)
1249 return cpu_ppc_get_tb(env
) >> 32;
1252 uint32_t cpu_ppc601_load_rtcu(CPUPPCState
*env
)
1253 __attribute__ (( alias ("cpu_ppc_load_tbu") ));
1255 uint32_t cpu_ppc601_load_rtcl(CPUPPCState
*env
)
1257 return cpu_ppc_load_tbl(env
) & 0x3FFFFF80;
1260 /* XXX: to be fixed */
1261 int ppc_dcr_read (ppc_dcr_t
*dcr_env
, int dcrn
, uint32_t *valp
)
1266 int ppc_dcr_write (ppc_dcr_t
*dcr_env
, int dcrn
, uint32_t val
)
1271 static int do_store_exclusive(CPUPPCState
*env
)
1274 target_ulong page_addr
;
1275 target_ulong val
, val2
__attribute__((unused
)) = 0;
1279 addr
= env
->reserve_ea
;
1280 page_addr
= addr
& TARGET_PAGE_MASK
;
1283 flags
= page_get_flags(page_addr
);
1284 if ((flags
& PAGE_READ
) == 0) {
1287 int reg
= env
->reserve_info
& 0x1f;
1288 int size
= env
->reserve_info
>> 5;
1291 if (addr
== env
->reserve_addr
) {
1293 case 1: segv
= get_user_u8(val
, addr
); break;
1294 case 2: segv
= get_user_u16(val
, addr
); break;
1295 case 4: segv
= get_user_u32(val
, addr
); break;
1296 #if defined(TARGET_PPC64)
1297 case 8: segv
= get_user_u64(val
, addr
); break;
1299 segv
= get_user_u64(val
, addr
);
1301 segv
= get_user_u64(val2
, addr
+ 8);
1308 if (!segv
&& val
== env
->reserve_val
) {
1309 val
= env
->gpr
[reg
];
1311 case 1: segv
= put_user_u8(val
, addr
); break;
1312 case 2: segv
= put_user_u16(val
, addr
); break;
1313 case 4: segv
= put_user_u32(val
, addr
); break;
1314 #if defined(TARGET_PPC64)
1315 case 8: segv
= put_user_u64(val
, addr
); break;
1317 if (val2
== env
->reserve_val2
) {
1320 val
= env
->gpr
[reg
+1];
1322 val2
= env
->gpr
[reg
+1];
1324 segv
= put_user_u64(val
, addr
);
1326 segv
= put_user_u64(val2
, addr
+ 8);
1339 env
->crf
[0] = (stored
<< 1) | xer_so
;
1340 env
->reserve_addr
= (target_ulong
)-1;
1350 void cpu_loop(CPUPPCState
*env
)
1352 CPUState
*cs
= CPU(ppc_env_get_cpu(env
));
1353 target_siginfo_t info
;
1359 trapnr
= cpu_exec(cs
);
1361 process_queued_cpu_work(cs
);
1364 case POWERPC_EXCP_NONE
:
1367 case POWERPC_EXCP_CRITICAL
: /* Critical input */
1368 cpu_abort(cs
, "Critical interrupt while in user mode. "
1371 case POWERPC_EXCP_MCHECK
: /* Machine check exception */
1372 cpu_abort(cs
, "Machine check exception while in user mode. "
1375 case POWERPC_EXCP_DSI
: /* Data storage exception */
1376 /* XXX: check this. Seems bugged */
1377 switch (env
->error_code
& 0xFF000000) {
1380 info
.si_signo
= TARGET_SIGSEGV
;
1382 info
.si_code
= TARGET_SEGV_MAPERR
;
1385 info
.si_signo
= TARGET_SIGILL
;
1387 info
.si_code
= TARGET_ILL_ILLADR
;
1390 info
.si_signo
= TARGET_SIGSEGV
;
1392 info
.si_code
= TARGET_SEGV_ACCERR
;
1395 /* Let's send a regular segfault... */
1396 EXCP_DUMP(env
, "Invalid segfault errno (%02x)\n",
1398 info
.si_signo
= TARGET_SIGSEGV
;
1400 info
.si_code
= TARGET_SEGV_MAPERR
;
1403 info
._sifields
._sigfault
._addr
= env
->nip
;
1404 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
1406 case POWERPC_EXCP_ISI
: /* Instruction storage exception */
1407 /* XXX: check this */
1408 switch (env
->error_code
& 0xFF000000) {
1410 info
.si_signo
= TARGET_SIGSEGV
;
1412 info
.si_code
= TARGET_SEGV_MAPERR
;
1416 info
.si_signo
= TARGET_SIGSEGV
;
1418 info
.si_code
= TARGET_SEGV_ACCERR
;
1421 /* Let's send a regular segfault... */
1422 EXCP_DUMP(env
, "Invalid segfault errno (%02x)\n",
1424 info
.si_signo
= TARGET_SIGSEGV
;
1426 info
.si_code
= TARGET_SEGV_MAPERR
;
1429 info
._sifields
._sigfault
._addr
= env
->nip
- 4;
1430 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
1432 case POWERPC_EXCP_EXTERNAL
: /* External input */
1433 cpu_abort(cs
, "External interrupt while in user mode. "
1436 case POWERPC_EXCP_ALIGN
: /* Alignment exception */
1437 /* XXX: check this */
1438 info
.si_signo
= TARGET_SIGBUS
;
1440 info
.si_code
= TARGET_BUS_ADRALN
;
1441 info
._sifields
._sigfault
._addr
= env
->nip
;
1442 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
1444 case POWERPC_EXCP_PROGRAM
: /* Program exception */
1445 case POWERPC_EXCP_HV_EMU
: /* HV emulation */
1446 /* XXX: check this */
1447 switch (env
->error_code
& ~0xF) {
1448 case POWERPC_EXCP_FP
:
1449 info
.si_signo
= TARGET_SIGFPE
;
1451 switch (env
->error_code
& 0xF) {
1452 case POWERPC_EXCP_FP_OX
:
1453 info
.si_code
= TARGET_FPE_FLTOVF
;
1455 case POWERPC_EXCP_FP_UX
:
1456 info
.si_code
= TARGET_FPE_FLTUND
;
1458 case POWERPC_EXCP_FP_ZX
:
1459 case POWERPC_EXCP_FP_VXZDZ
:
1460 info
.si_code
= TARGET_FPE_FLTDIV
;
1462 case POWERPC_EXCP_FP_XX
:
1463 info
.si_code
= TARGET_FPE_FLTRES
;
1465 case POWERPC_EXCP_FP_VXSOFT
:
1466 info
.si_code
= TARGET_FPE_FLTINV
;
1468 case POWERPC_EXCP_FP_VXSNAN
:
1469 case POWERPC_EXCP_FP_VXISI
:
1470 case POWERPC_EXCP_FP_VXIDI
:
1471 case POWERPC_EXCP_FP_VXIMZ
:
1472 case POWERPC_EXCP_FP_VXVC
:
1473 case POWERPC_EXCP_FP_VXSQRT
:
1474 case POWERPC_EXCP_FP_VXCVI
:
1475 info
.si_code
= TARGET_FPE_FLTSUB
;
1478 EXCP_DUMP(env
, "Unknown floating point exception (%02x)\n",
1483 case POWERPC_EXCP_INVAL
:
1484 info
.si_signo
= TARGET_SIGILL
;
1486 switch (env
->error_code
& 0xF) {
1487 case POWERPC_EXCP_INVAL_INVAL
:
1488 info
.si_code
= TARGET_ILL_ILLOPC
;
1490 case POWERPC_EXCP_INVAL_LSWX
:
1491 info
.si_code
= TARGET_ILL_ILLOPN
;
1493 case POWERPC_EXCP_INVAL_SPR
:
1494 info
.si_code
= TARGET_ILL_PRVREG
;
1496 case POWERPC_EXCP_INVAL_FP
:
1497 info
.si_code
= TARGET_ILL_COPROC
;
1500 EXCP_DUMP(env
, "Unknown invalid operation (%02x)\n",
1501 env
->error_code
& 0xF);
1502 info
.si_code
= TARGET_ILL_ILLADR
;
1506 case POWERPC_EXCP_PRIV
:
1507 info
.si_signo
= TARGET_SIGILL
;
1509 switch (env
->error_code
& 0xF) {
1510 case POWERPC_EXCP_PRIV_OPC
:
1511 info
.si_code
= TARGET_ILL_PRVOPC
;
1513 case POWERPC_EXCP_PRIV_REG
:
1514 info
.si_code
= TARGET_ILL_PRVREG
;
1517 EXCP_DUMP(env
, "Unknown privilege violation (%02x)\n",
1518 env
->error_code
& 0xF);
1519 info
.si_code
= TARGET_ILL_PRVOPC
;
1523 case POWERPC_EXCP_TRAP
:
1524 cpu_abort(cs
, "Tried to call a TRAP\n");
1527 /* Should not happen ! */
1528 cpu_abort(cs
, "Unknown program exception (%02x)\n",
1532 info
._sifields
._sigfault
._addr
= env
->nip
;
1533 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
1535 case POWERPC_EXCP_FPU
: /* Floating-point unavailable exception */
1536 info
.si_signo
= TARGET_SIGILL
;
1538 info
.si_code
= TARGET_ILL_COPROC
;
1539 info
._sifields
._sigfault
._addr
= env
->nip
;
1540 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
1542 case POWERPC_EXCP_SYSCALL
: /* System call exception */
1543 cpu_abort(cs
, "Syscall exception while in user mode. "
1546 case POWERPC_EXCP_APU
: /* Auxiliary processor unavailable */
1547 info
.si_signo
= TARGET_SIGILL
;
1549 info
.si_code
= TARGET_ILL_COPROC
;
1550 info
._sifields
._sigfault
._addr
= env
->nip
;
1551 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
1553 case POWERPC_EXCP_DECR
: /* Decrementer exception */
1554 cpu_abort(cs
, "Decrementer interrupt while in user mode. "
1557 case POWERPC_EXCP_FIT
: /* Fixed-interval timer interrupt */
1558 cpu_abort(cs
, "Fix interval timer interrupt while in user mode. "
1561 case POWERPC_EXCP_WDT
: /* Watchdog timer interrupt */
1562 cpu_abort(cs
, "Watchdog timer interrupt while in user mode. "
1565 case POWERPC_EXCP_DTLB
: /* Data TLB error */
1566 cpu_abort(cs
, "Data TLB exception while in user mode. "
1569 case POWERPC_EXCP_ITLB
: /* Instruction TLB error */
1570 cpu_abort(cs
, "Instruction TLB exception while in user mode. "
1573 case POWERPC_EXCP_SPEU
: /* SPE/embedded floating-point unavail. */
1574 info
.si_signo
= TARGET_SIGILL
;
1576 info
.si_code
= TARGET_ILL_COPROC
;
1577 info
._sifields
._sigfault
._addr
= env
->nip
;
1578 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
1580 case POWERPC_EXCP_EFPDI
: /* Embedded floating-point data IRQ */
1581 cpu_abort(cs
, "Embedded floating-point data IRQ not handled\n");
1583 case POWERPC_EXCP_EFPRI
: /* Embedded floating-point round IRQ */
1584 cpu_abort(cs
, "Embedded floating-point round IRQ not handled\n");
1586 case POWERPC_EXCP_EPERFM
: /* Embedded performance monitor IRQ */
1587 cpu_abort(cs
, "Performance monitor exception not handled\n");
1589 case POWERPC_EXCP_DOORI
: /* Embedded doorbell interrupt */
1590 cpu_abort(cs
, "Doorbell interrupt while in user mode. "
1593 case POWERPC_EXCP_DOORCI
: /* Embedded doorbell critical interrupt */
1594 cpu_abort(cs
, "Doorbell critical interrupt while in user mode. "
1597 case POWERPC_EXCP_RESET
: /* System reset exception */
1598 cpu_abort(cs
, "Reset interrupt while in user mode. "
1601 case POWERPC_EXCP_DSEG
: /* Data segment exception */
1602 cpu_abort(cs
, "Data segment exception while in user mode. "
1605 case POWERPC_EXCP_ISEG
: /* Instruction segment exception */
1606 cpu_abort(cs
, "Instruction segment exception "
1607 "while in user mode. Aborting\n");
1609 /* PowerPC 64 with hypervisor mode support */
1610 case POWERPC_EXCP_HDECR
: /* Hypervisor decrementer exception */
1611 cpu_abort(cs
, "Hypervisor decrementer interrupt "
1612 "while in user mode. Aborting\n");
1614 case POWERPC_EXCP_TRACE
: /* Trace exception */
1616 * we use this exception to emulate step-by-step execution mode.
1619 /* PowerPC 64 with hypervisor mode support */
1620 case POWERPC_EXCP_HDSI
: /* Hypervisor data storage exception */
1621 cpu_abort(cs
, "Hypervisor data storage exception "
1622 "while in user mode. Aborting\n");
1624 case POWERPC_EXCP_HISI
: /* Hypervisor instruction storage excp */
1625 cpu_abort(cs
, "Hypervisor instruction storage exception "
1626 "while in user mode. Aborting\n");
1628 case POWERPC_EXCP_HDSEG
: /* Hypervisor data segment exception */
1629 cpu_abort(cs
, "Hypervisor data segment exception "
1630 "while in user mode. Aborting\n");
1632 case POWERPC_EXCP_HISEG
: /* Hypervisor instruction segment excp */
1633 cpu_abort(cs
, "Hypervisor instruction segment exception "
1634 "while in user mode. Aborting\n");
1636 case POWERPC_EXCP_VPU
: /* Vector unavailable exception */
1637 info
.si_signo
= TARGET_SIGILL
;
1639 info
.si_code
= TARGET_ILL_COPROC
;
1640 info
._sifields
._sigfault
._addr
= env
->nip
;
1641 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
1643 case POWERPC_EXCP_PIT
: /* Programmable interval timer IRQ */
1644 cpu_abort(cs
, "Programmable interval timer interrupt "
1645 "while in user mode. Aborting\n");
1647 case POWERPC_EXCP_IO
: /* IO error exception */
1648 cpu_abort(cs
, "IO error exception while in user mode. "
1651 case POWERPC_EXCP_RUNM
: /* Run mode exception */
1652 cpu_abort(cs
, "Run mode exception while in user mode. "
1655 case POWERPC_EXCP_EMUL
: /* Emulation trap exception */
1656 cpu_abort(cs
, "Emulation trap exception not handled\n");
1658 case POWERPC_EXCP_IFTLB
: /* Instruction fetch TLB error */
1659 cpu_abort(cs
, "Instruction fetch TLB exception "
1660 "while in user-mode. Aborting");
1662 case POWERPC_EXCP_DLTLB
: /* Data load TLB miss */
1663 cpu_abort(cs
, "Data load TLB exception while in user-mode. "
1666 case POWERPC_EXCP_DSTLB
: /* Data store TLB miss */
1667 cpu_abort(cs
, "Data store TLB exception while in user-mode. "
1670 case POWERPC_EXCP_FPA
: /* Floating-point assist exception */
1671 cpu_abort(cs
, "Floating-point assist exception not handled\n");
1673 case POWERPC_EXCP_IABR
: /* Instruction address breakpoint */
1674 cpu_abort(cs
, "Instruction address breakpoint exception "
1677 case POWERPC_EXCP_SMI
: /* System management interrupt */
1678 cpu_abort(cs
, "System management interrupt while in user mode. "
1681 case POWERPC_EXCP_THERM
: /* Thermal interrupt */
1682 cpu_abort(cs
, "Thermal interrupt interrupt while in user mode. "
1685 case POWERPC_EXCP_PERFM
: /* Embedded performance monitor IRQ */
1686 cpu_abort(cs
, "Performance monitor exception not handled\n");
1688 case POWERPC_EXCP_VPUA
: /* Vector assist exception */
1689 cpu_abort(cs
, "Vector assist exception not handled\n");
1691 case POWERPC_EXCP_SOFTP
: /* Soft patch exception */
1692 cpu_abort(cs
, "Soft patch exception not handled\n");
1694 case POWERPC_EXCP_MAINT
: /* Maintenance exception */
1695 cpu_abort(cs
, "Maintenance exception while in user mode. "
1698 case POWERPC_EXCP_STOP
: /* stop translation */
1699 /* We did invalidate the instruction cache. Go on */
1701 case POWERPC_EXCP_BRANCH
: /* branch instruction: */
1702 /* We just stopped because of a branch. Go on */
1704 case POWERPC_EXCP_SYSCALL_USER
:
1705 /* system call in user-mode emulation */
1707 * PPC ABI uses overflow flag in cr0 to signal an error
1710 env
->crf
[0] &= ~0x1;
1711 ret
= do_syscall(env
, env
->gpr
[0], env
->gpr
[3], env
->gpr
[4],
1712 env
->gpr
[5], env
->gpr
[6], env
->gpr
[7],
1714 if (ret
== -TARGET_ERESTARTSYS
) {
1717 if (ret
== (target_ulong
)(-TARGET_QEMU_ESIGRETURN
)) {
1718 /* Returning from a successful sigreturn syscall.
1719 Avoid corrupting register state. */
1723 if (ret
> (target_ulong
)(-515)) {
1729 case POWERPC_EXCP_STCX
:
1730 if (do_store_exclusive(env
)) {
1731 info
.si_signo
= TARGET_SIGSEGV
;
1733 info
.si_code
= TARGET_SEGV_MAPERR
;
1734 info
._sifields
._sigfault
._addr
= env
->nip
;
1735 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
1742 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
1744 info
.si_signo
= sig
;
1746 info
.si_code
= TARGET_TRAP_BRKPT
;
1747 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
1751 case EXCP_INTERRUPT
:
1752 /* just indicate that signals should be handled asap */
1755 cpu_exec_step_atomic(cs
);
1758 cpu_abort(cs
, "Unknown exception 0x%x. Aborting\n", trapnr
);
1761 process_pending_signals(env
);
1768 # ifdef TARGET_ABI_MIPSO32
1769 # define MIPS_SYS(name, args) args,
1770 static const uint8_t mips_syscall_args
[] = {
1771 MIPS_SYS(sys_syscall
, 8) /* 4000 */
1772 MIPS_SYS(sys_exit
, 1)
1773 MIPS_SYS(sys_fork
, 0)
1774 MIPS_SYS(sys_read
, 3)
1775 MIPS_SYS(sys_write
, 3)
1776 MIPS_SYS(sys_open
, 3) /* 4005 */
1777 MIPS_SYS(sys_close
, 1)
1778 MIPS_SYS(sys_waitpid
, 3)
1779 MIPS_SYS(sys_creat
, 2)
1780 MIPS_SYS(sys_link
, 2)
1781 MIPS_SYS(sys_unlink
, 1) /* 4010 */
1782 MIPS_SYS(sys_execve
, 0)
1783 MIPS_SYS(sys_chdir
, 1)
1784 MIPS_SYS(sys_time
, 1)
1785 MIPS_SYS(sys_mknod
, 3)
1786 MIPS_SYS(sys_chmod
, 2) /* 4015 */
1787 MIPS_SYS(sys_lchown
, 3)
1788 MIPS_SYS(sys_ni_syscall
, 0)
1789 MIPS_SYS(sys_ni_syscall
, 0) /* was sys_stat */
1790 MIPS_SYS(sys_lseek
, 3)
1791 MIPS_SYS(sys_getpid
, 0) /* 4020 */
1792 MIPS_SYS(sys_mount
, 5)
1793 MIPS_SYS(sys_umount
, 1)
1794 MIPS_SYS(sys_setuid
, 1)
1795 MIPS_SYS(sys_getuid
, 0)
1796 MIPS_SYS(sys_stime
, 1) /* 4025 */
1797 MIPS_SYS(sys_ptrace
, 4)
1798 MIPS_SYS(sys_alarm
, 1)
1799 MIPS_SYS(sys_ni_syscall
, 0) /* was sys_fstat */
1800 MIPS_SYS(sys_pause
, 0)
1801 MIPS_SYS(sys_utime
, 2) /* 4030 */
1802 MIPS_SYS(sys_ni_syscall
, 0)
1803 MIPS_SYS(sys_ni_syscall
, 0)
1804 MIPS_SYS(sys_access
, 2)
1805 MIPS_SYS(sys_nice
, 1)
1806 MIPS_SYS(sys_ni_syscall
, 0) /* 4035 */
1807 MIPS_SYS(sys_sync
, 0)
1808 MIPS_SYS(sys_kill
, 2)
1809 MIPS_SYS(sys_rename
, 2)
1810 MIPS_SYS(sys_mkdir
, 2)
1811 MIPS_SYS(sys_rmdir
, 1) /* 4040 */
1812 MIPS_SYS(sys_dup
, 1)
1813 MIPS_SYS(sys_pipe
, 0)
1814 MIPS_SYS(sys_times
, 1)
1815 MIPS_SYS(sys_ni_syscall
, 0)
1816 MIPS_SYS(sys_brk
, 1) /* 4045 */
1817 MIPS_SYS(sys_setgid
, 1)
1818 MIPS_SYS(sys_getgid
, 0)
1819 MIPS_SYS(sys_ni_syscall
, 0) /* was signal(2) */
1820 MIPS_SYS(sys_geteuid
, 0)
1821 MIPS_SYS(sys_getegid
, 0) /* 4050 */
1822 MIPS_SYS(sys_acct
, 0)
1823 MIPS_SYS(sys_umount2
, 2)
1824 MIPS_SYS(sys_ni_syscall
, 0)
1825 MIPS_SYS(sys_ioctl
, 3)
1826 MIPS_SYS(sys_fcntl
, 3) /* 4055 */
1827 MIPS_SYS(sys_ni_syscall
, 2)
1828 MIPS_SYS(sys_setpgid
, 2)
1829 MIPS_SYS(sys_ni_syscall
, 0)
1830 MIPS_SYS(sys_olduname
, 1)
1831 MIPS_SYS(sys_umask
, 1) /* 4060 */
1832 MIPS_SYS(sys_chroot
, 1)
1833 MIPS_SYS(sys_ustat
, 2)
1834 MIPS_SYS(sys_dup2
, 2)
1835 MIPS_SYS(sys_getppid
, 0)
1836 MIPS_SYS(sys_getpgrp
, 0) /* 4065 */
1837 MIPS_SYS(sys_setsid
, 0)
1838 MIPS_SYS(sys_sigaction
, 3)
1839 MIPS_SYS(sys_sgetmask
, 0)
1840 MIPS_SYS(sys_ssetmask
, 1)
1841 MIPS_SYS(sys_setreuid
, 2) /* 4070 */
1842 MIPS_SYS(sys_setregid
, 2)
1843 MIPS_SYS(sys_sigsuspend
, 0)
1844 MIPS_SYS(sys_sigpending
, 1)
1845 MIPS_SYS(sys_sethostname
, 2)
1846 MIPS_SYS(sys_setrlimit
, 2) /* 4075 */
1847 MIPS_SYS(sys_getrlimit
, 2)
1848 MIPS_SYS(sys_getrusage
, 2)
1849 MIPS_SYS(sys_gettimeofday
, 2)
1850 MIPS_SYS(sys_settimeofday
, 2)
1851 MIPS_SYS(sys_getgroups
, 2) /* 4080 */
1852 MIPS_SYS(sys_setgroups
, 2)
1853 MIPS_SYS(sys_ni_syscall
, 0) /* old_select */
1854 MIPS_SYS(sys_symlink
, 2)
1855 MIPS_SYS(sys_ni_syscall
, 0) /* was sys_lstat */
1856 MIPS_SYS(sys_readlink
, 3) /* 4085 */
1857 MIPS_SYS(sys_uselib
, 1)
1858 MIPS_SYS(sys_swapon
, 2)
1859 MIPS_SYS(sys_reboot
, 3)
1860 MIPS_SYS(old_readdir
, 3)
1861 MIPS_SYS(old_mmap
, 6) /* 4090 */
1862 MIPS_SYS(sys_munmap
, 2)
1863 MIPS_SYS(sys_truncate
, 2)
1864 MIPS_SYS(sys_ftruncate
, 2)
1865 MIPS_SYS(sys_fchmod
, 2)
1866 MIPS_SYS(sys_fchown
, 3) /* 4095 */
1867 MIPS_SYS(sys_getpriority
, 2)
1868 MIPS_SYS(sys_setpriority
, 3)
1869 MIPS_SYS(sys_ni_syscall
, 0)
1870 MIPS_SYS(sys_statfs
, 2)
1871 MIPS_SYS(sys_fstatfs
, 2) /* 4100 */
1872 MIPS_SYS(sys_ni_syscall
, 0) /* was ioperm(2) */
1873 MIPS_SYS(sys_socketcall
, 2)
1874 MIPS_SYS(sys_syslog
, 3)
1875 MIPS_SYS(sys_setitimer
, 3)
1876 MIPS_SYS(sys_getitimer
, 2) /* 4105 */
1877 MIPS_SYS(sys_newstat
, 2)
1878 MIPS_SYS(sys_newlstat
, 2)
1879 MIPS_SYS(sys_newfstat
, 2)
1880 MIPS_SYS(sys_uname
, 1)
1881 MIPS_SYS(sys_ni_syscall
, 0) /* 4110 was iopl(2) */
1882 MIPS_SYS(sys_vhangup
, 0)
1883 MIPS_SYS(sys_ni_syscall
, 0) /* was sys_idle() */
1884 MIPS_SYS(sys_ni_syscall
, 0) /* was sys_vm86 */
1885 MIPS_SYS(sys_wait4
, 4)
1886 MIPS_SYS(sys_swapoff
, 1) /* 4115 */
1887 MIPS_SYS(sys_sysinfo
, 1)
1888 MIPS_SYS(sys_ipc
, 6)
1889 MIPS_SYS(sys_fsync
, 1)
1890 MIPS_SYS(sys_sigreturn
, 0)
1891 MIPS_SYS(sys_clone
, 6) /* 4120 */
1892 MIPS_SYS(sys_setdomainname
, 2)
1893 MIPS_SYS(sys_newuname
, 1)
1894 MIPS_SYS(sys_ni_syscall
, 0) /* sys_modify_ldt */
1895 MIPS_SYS(sys_adjtimex
, 1)
1896 MIPS_SYS(sys_mprotect
, 3) /* 4125 */
1897 MIPS_SYS(sys_sigprocmask
, 3)
1898 MIPS_SYS(sys_ni_syscall
, 0) /* was create_module */
1899 MIPS_SYS(sys_init_module
, 5)
1900 MIPS_SYS(sys_delete_module
, 1)
1901 MIPS_SYS(sys_ni_syscall
, 0) /* 4130 was get_kernel_syms */
1902 MIPS_SYS(sys_quotactl
, 0)
1903 MIPS_SYS(sys_getpgid
, 1)
1904 MIPS_SYS(sys_fchdir
, 1)
1905 MIPS_SYS(sys_bdflush
, 2)
1906 MIPS_SYS(sys_sysfs
, 3) /* 4135 */
1907 MIPS_SYS(sys_personality
, 1)
1908 MIPS_SYS(sys_ni_syscall
, 0) /* for afs_syscall */
1909 MIPS_SYS(sys_setfsuid
, 1)
1910 MIPS_SYS(sys_setfsgid
, 1)
1911 MIPS_SYS(sys_llseek
, 5) /* 4140 */
1912 MIPS_SYS(sys_getdents
, 3)
1913 MIPS_SYS(sys_select
, 5)
1914 MIPS_SYS(sys_flock
, 2)
1915 MIPS_SYS(sys_msync
, 3)
1916 MIPS_SYS(sys_readv
, 3) /* 4145 */
1917 MIPS_SYS(sys_writev
, 3)
1918 MIPS_SYS(sys_cacheflush
, 3)
1919 MIPS_SYS(sys_cachectl
, 3)
1920 MIPS_SYS(sys_sysmips
, 4)
1921 MIPS_SYS(sys_ni_syscall
, 0) /* 4150 */
1922 MIPS_SYS(sys_getsid
, 1)
1923 MIPS_SYS(sys_fdatasync
, 0)
1924 MIPS_SYS(sys_sysctl
, 1)
1925 MIPS_SYS(sys_mlock
, 2)
1926 MIPS_SYS(sys_munlock
, 2) /* 4155 */
1927 MIPS_SYS(sys_mlockall
, 1)
1928 MIPS_SYS(sys_munlockall
, 0)
1929 MIPS_SYS(sys_sched_setparam
, 2)
1930 MIPS_SYS(sys_sched_getparam
, 2)
1931 MIPS_SYS(sys_sched_setscheduler
, 3) /* 4160 */
1932 MIPS_SYS(sys_sched_getscheduler
, 1)
1933 MIPS_SYS(sys_sched_yield
, 0)
1934 MIPS_SYS(sys_sched_get_priority_max
, 1)
1935 MIPS_SYS(sys_sched_get_priority_min
, 1)
1936 MIPS_SYS(sys_sched_rr_get_interval
, 2) /* 4165 */
1937 MIPS_SYS(sys_nanosleep
, 2)
1938 MIPS_SYS(sys_mremap
, 5)
1939 MIPS_SYS(sys_accept
, 3)
1940 MIPS_SYS(sys_bind
, 3)
1941 MIPS_SYS(sys_connect
, 3) /* 4170 */
1942 MIPS_SYS(sys_getpeername
, 3)
1943 MIPS_SYS(sys_getsockname
, 3)
1944 MIPS_SYS(sys_getsockopt
, 5)
1945 MIPS_SYS(sys_listen
, 2)
1946 MIPS_SYS(sys_recv
, 4) /* 4175 */
1947 MIPS_SYS(sys_recvfrom
, 6)
1948 MIPS_SYS(sys_recvmsg
, 3)
1949 MIPS_SYS(sys_send
, 4)
1950 MIPS_SYS(sys_sendmsg
, 3)
1951 MIPS_SYS(sys_sendto
, 6) /* 4180 */
1952 MIPS_SYS(sys_setsockopt
, 5)
1953 MIPS_SYS(sys_shutdown
, 2)
1954 MIPS_SYS(sys_socket
, 3)
1955 MIPS_SYS(sys_socketpair
, 4)
1956 MIPS_SYS(sys_setresuid
, 3) /* 4185 */
1957 MIPS_SYS(sys_getresuid
, 3)
1958 MIPS_SYS(sys_ni_syscall
, 0) /* was sys_query_module */
1959 MIPS_SYS(sys_poll
, 3)
1960 MIPS_SYS(sys_nfsservctl
, 3)
1961 MIPS_SYS(sys_setresgid
, 3) /* 4190 */
1962 MIPS_SYS(sys_getresgid
, 3)
1963 MIPS_SYS(sys_prctl
, 5)
1964 MIPS_SYS(sys_rt_sigreturn
, 0)
1965 MIPS_SYS(sys_rt_sigaction
, 4)
1966 MIPS_SYS(sys_rt_sigprocmask
, 4) /* 4195 */
1967 MIPS_SYS(sys_rt_sigpending
, 2)
1968 MIPS_SYS(sys_rt_sigtimedwait
, 4)
1969 MIPS_SYS(sys_rt_sigqueueinfo
, 3)
1970 MIPS_SYS(sys_rt_sigsuspend
, 0)
1971 MIPS_SYS(sys_pread64
, 6) /* 4200 */
1972 MIPS_SYS(sys_pwrite64
, 6)
1973 MIPS_SYS(sys_chown
, 3)
1974 MIPS_SYS(sys_getcwd
, 2)
1975 MIPS_SYS(sys_capget
, 2)
1976 MIPS_SYS(sys_capset
, 2) /* 4205 */
1977 MIPS_SYS(sys_sigaltstack
, 2)
1978 MIPS_SYS(sys_sendfile
, 4)
1979 MIPS_SYS(sys_ni_syscall
, 0)
1980 MIPS_SYS(sys_ni_syscall
, 0)
1981 MIPS_SYS(sys_mmap2
, 6) /* 4210 */
1982 MIPS_SYS(sys_truncate64
, 4)
1983 MIPS_SYS(sys_ftruncate64
, 4)
1984 MIPS_SYS(sys_stat64
, 2)
1985 MIPS_SYS(sys_lstat64
, 2)
1986 MIPS_SYS(sys_fstat64
, 2) /* 4215 */
1987 MIPS_SYS(sys_pivot_root
, 2)
1988 MIPS_SYS(sys_mincore
, 3)
1989 MIPS_SYS(sys_madvise
, 3)
1990 MIPS_SYS(sys_getdents64
, 3)
1991 MIPS_SYS(sys_fcntl64
, 3) /* 4220 */
1992 MIPS_SYS(sys_ni_syscall
, 0)
1993 MIPS_SYS(sys_gettid
, 0)
1994 MIPS_SYS(sys_readahead
, 5)
1995 MIPS_SYS(sys_setxattr
, 5)
1996 MIPS_SYS(sys_lsetxattr
, 5) /* 4225 */
1997 MIPS_SYS(sys_fsetxattr
, 5)
1998 MIPS_SYS(sys_getxattr
, 4)
1999 MIPS_SYS(sys_lgetxattr
, 4)
2000 MIPS_SYS(sys_fgetxattr
, 4)
2001 MIPS_SYS(sys_listxattr
, 3) /* 4230 */
2002 MIPS_SYS(sys_llistxattr
, 3)
2003 MIPS_SYS(sys_flistxattr
, 3)
2004 MIPS_SYS(sys_removexattr
, 2)
2005 MIPS_SYS(sys_lremovexattr
, 2)
2006 MIPS_SYS(sys_fremovexattr
, 2) /* 4235 */
2007 MIPS_SYS(sys_tkill
, 2)
2008 MIPS_SYS(sys_sendfile64
, 5)
2009 MIPS_SYS(sys_futex
, 6)
2010 MIPS_SYS(sys_sched_setaffinity
, 3)
2011 MIPS_SYS(sys_sched_getaffinity
, 3) /* 4240 */
2012 MIPS_SYS(sys_io_setup
, 2)
2013 MIPS_SYS(sys_io_destroy
, 1)
2014 MIPS_SYS(sys_io_getevents
, 5)
2015 MIPS_SYS(sys_io_submit
, 3)
2016 MIPS_SYS(sys_io_cancel
, 3) /* 4245 */
2017 MIPS_SYS(sys_exit_group
, 1)
2018 MIPS_SYS(sys_lookup_dcookie
, 3)
2019 MIPS_SYS(sys_epoll_create
, 1)
2020 MIPS_SYS(sys_epoll_ctl
, 4)
2021 MIPS_SYS(sys_epoll_wait
, 3) /* 4250 */
2022 MIPS_SYS(sys_remap_file_pages
, 5)
2023 MIPS_SYS(sys_set_tid_address
, 1)
2024 MIPS_SYS(sys_restart_syscall
, 0)
2025 MIPS_SYS(sys_fadvise64_64
, 7)
2026 MIPS_SYS(sys_statfs64
, 3) /* 4255 */
2027 MIPS_SYS(sys_fstatfs64
, 2)
2028 MIPS_SYS(sys_timer_create
, 3)
2029 MIPS_SYS(sys_timer_settime
, 4)
2030 MIPS_SYS(sys_timer_gettime
, 2)
2031 MIPS_SYS(sys_timer_getoverrun
, 1) /* 4260 */
2032 MIPS_SYS(sys_timer_delete
, 1)
2033 MIPS_SYS(sys_clock_settime
, 2)
2034 MIPS_SYS(sys_clock_gettime
, 2)
2035 MIPS_SYS(sys_clock_getres
, 2)
2036 MIPS_SYS(sys_clock_nanosleep
, 4) /* 4265 */
2037 MIPS_SYS(sys_tgkill
, 3)
2038 MIPS_SYS(sys_utimes
, 2)
2039 MIPS_SYS(sys_mbind
, 4)
2040 MIPS_SYS(sys_ni_syscall
, 0) /* sys_get_mempolicy */
2041 MIPS_SYS(sys_ni_syscall
, 0) /* 4270 sys_set_mempolicy */
2042 MIPS_SYS(sys_mq_open
, 4)
2043 MIPS_SYS(sys_mq_unlink
, 1)
2044 MIPS_SYS(sys_mq_timedsend
, 5)
2045 MIPS_SYS(sys_mq_timedreceive
, 5)
2046 MIPS_SYS(sys_mq_notify
, 2) /* 4275 */
2047 MIPS_SYS(sys_mq_getsetattr
, 3)
2048 MIPS_SYS(sys_ni_syscall
, 0) /* sys_vserver */
2049 MIPS_SYS(sys_waitid
, 4)
2050 MIPS_SYS(sys_ni_syscall
, 0) /* available, was setaltroot */
2051 MIPS_SYS(sys_add_key
, 5)
2052 MIPS_SYS(sys_request_key
, 4)
2053 MIPS_SYS(sys_keyctl
, 5)
2054 MIPS_SYS(sys_set_thread_area
, 1)
2055 MIPS_SYS(sys_inotify_init
, 0)
2056 MIPS_SYS(sys_inotify_add_watch
, 3) /* 4285 */
2057 MIPS_SYS(sys_inotify_rm_watch
, 2)
2058 MIPS_SYS(sys_migrate_pages
, 4)
2059 MIPS_SYS(sys_openat
, 4)
2060 MIPS_SYS(sys_mkdirat
, 3)
2061 MIPS_SYS(sys_mknodat
, 4) /* 4290 */
2062 MIPS_SYS(sys_fchownat
, 5)
2063 MIPS_SYS(sys_futimesat
, 3)
2064 MIPS_SYS(sys_fstatat64
, 4)
2065 MIPS_SYS(sys_unlinkat
, 3)
2066 MIPS_SYS(sys_renameat
, 4) /* 4295 */
2067 MIPS_SYS(sys_linkat
, 5)
2068 MIPS_SYS(sys_symlinkat
, 3)
2069 MIPS_SYS(sys_readlinkat
, 4)
2070 MIPS_SYS(sys_fchmodat
, 3)
2071 MIPS_SYS(sys_faccessat
, 3) /* 4300 */
2072 MIPS_SYS(sys_pselect6
, 6)
2073 MIPS_SYS(sys_ppoll
, 5)
2074 MIPS_SYS(sys_unshare
, 1)
2075 MIPS_SYS(sys_splice
, 6)
2076 MIPS_SYS(sys_sync_file_range
, 7) /* 4305 */
2077 MIPS_SYS(sys_tee
, 4)
2078 MIPS_SYS(sys_vmsplice
, 4)
2079 MIPS_SYS(sys_move_pages
, 6)
2080 MIPS_SYS(sys_set_robust_list
, 2)
2081 MIPS_SYS(sys_get_robust_list
, 3) /* 4310 */
2082 MIPS_SYS(sys_kexec_load
, 4)
2083 MIPS_SYS(sys_getcpu
, 3)
2084 MIPS_SYS(sys_epoll_pwait
, 6)
2085 MIPS_SYS(sys_ioprio_set
, 3)
2086 MIPS_SYS(sys_ioprio_get
, 2)
2087 MIPS_SYS(sys_utimensat
, 4)
2088 MIPS_SYS(sys_signalfd
, 3)
2089 MIPS_SYS(sys_ni_syscall
, 0) /* was timerfd */
2090 MIPS_SYS(sys_eventfd
, 1)
2091 MIPS_SYS(sys_fallocate
, 6) /* 4320 */
2092 MIPS_SYS(sys_timerfd_create
, 2)
2093 MIPS_SYS(sys_timerfd_gettime
, 2)
2094 MIPS_SYS(sys_timerfd_settime
, 4)
2095 MIPS_SYS(sys_signalfd4
, 4)
2096 MIPS_SYS(sys_eventfd2
, 2) /* 4325 */
2097 MIPS_SYS(sys_epoll_create1
, 1)
2098 MIPS_SYS(sys_dup3
, 3)
2099 MIPS_SYS(sys_pipe2
, 2)
2100 MIPS_SYS(sys_inotify_init1
, 1)
2101 MIPS_SYS(sys_preadv
, 5) /* 4330 */
2102 MIPS_SYS(sys_pwritev
, 5)
2103 MIPS_SYS(sys_rt_tgsigqueueinfo
, 4)
2104 MIPS_SYS(sys_perf_event_open
, 5)
2105 MIPS_SYS(sys_accept4
, 4)
2106 MIPS_SYS(sys_recvmmsg
, 5) /* 4335 */
2107 MIPS_SYS(sys_fanotify_init
, 2)
2108 MIPS_SYS(sys_fanotify_mark
, 6)
2109 MIPS_SYS(sys_prlimit64
, 4)
2110 MIPS_SYS(sys_name_to_handle_at
, 5)
2111 MIPS_SYS(sys_open_by_handle_at
, 3) /* 4340 */
2112 MIPS_SYS(sys_clock_adjtime
, 2)
2113 MIPS_SYS(sys_syncfs
, 1)
2114 MIPS_SYS(sys_sendmmsg
, 4)
2115 MIPS_SYS(sys_setns
, 2)
2116 MIPS_SYS(sys_process_vm_readv
, 6) /* 345 */
2117 MIPS_SYS(sys_process_vm_writev
, 6)
2118 MIPS_SYS(sys_kcmp
, 5)
2119 MIPS_SYS(sys_finit_module
, 3)
2120 MIPS_SYS(sys_sched_setattr
, 2)
2121 MIPS_SYS(sys_sched_getattr
, 3) /* 350 */
2122 MIPS_SYS(sys_renameat2
, 5)
2123 MIPS_SYS(sys_seccomp
, 3)
2124 MIPS_SYS(sys_getrandom
, 3)
2125 MIPS_SYS(sys_memfd_create
, 2)
2126 MIPS_SYS(sys_bpf
, 3) /* 355 */
2127 MIPS_SYS(sys_execveat
, 5)
2128 MIPS_SYS(sys_userfaultfd
, 1)
2129 MIPS_SYS(sys_membarrier
, 2)
2130 MIPS_SYS(sys_mlock2
, 3)
2131 MIPS_SYS(sys_copy_file_range
, 6) /* 360 */
2132 MIPS_SYS(sys_preadv2
, 6)
2133 MIPS_SYS(sys_pwritev2
, 6)
2138 static int do_store_exclusive(CPUMIPSState
*env
)
2141 target_ulong page_addr
;
2149 page_addr
= addr
& TARGET_PAGE_MASK
;
2152 flags
= page_get_flags(page_addr
);
2153 if ((flags
& PAGE_READ
) == 0) {
2156 reg
= env
->llreg
& 0x1f;
2157 d
= (env
->llreg
& 0x20) != 0;
2159 segv
= get_user_s64(val
, addr
);
2161 segv
= get_user_s32(val
, addr
);
2164 if (val
!= env
->llval
) {
2165 env
->active_tc
.gpr
[reg
] = 0;
2168 segv
= put_user_u64(env
->llnewval
, addr
);
2170 segv
= put_user_u32(env
->llnewval
, addr
);
2173 env
->active_tc
.gpr
[reg
] = 1;
2180 env
->active_tc
.PC
+= 4;
2193 static int do_break(CPUMIPSState
*env
, target_siginfo_t
*info
,
2201 info
->si_signo
= TARGET_SIGFPE
;
2203 info
->si_code
= (code
== BRK_OVERFLOW
) ? FPE_INTOVF
: FPE_INTDIV
;
2204 queue_signal(env
, info
->si_signo
, QEMU_SI_FAULT
, &*info
);
2208 info
->si_signo
= TARGET_SIGTRAP
;
2210 queue_signal(env
, info
->si_signo
, QEMU_SI_FAULT
, &*info
);
2218 void cpu_loop(CPUMIPSState
*env
)
2220 CPUState
*cs
= CPU(mips_env_get_cpu(env
));
2221 target_siginfo_t info
;
2224 # ifdef TARGET_ABI_MIPSO32
2225 unsigned int syscall_num
;
2230 trapnr
= cpu_exec(cs
);
2232 process_queued_cpu_work(cs
);
2236 env
->active_tc
.PC
+= 4;
2237 # ifdef TARGET_ABI_MIPSO32
2238 syscall_num
= env
->active_tc
.gpr
[2] - 4000;
2239 if (syscall_num
>= sizeof(mips_syscall_args
)) {
2240 ret
= -TARGET_ENOSYS
;
2244 abi_ulong arg5
= 0, arg6
= 0, arg7
= 0, arg8
= 0;
2246 nb_args
= mips_syscall_args
[syscall_num
];
2247 sp_reg
= env
->active_tc
.gpr
[29];
2249 /* these arguments are taken from the stack */
2251 if ((ret
= get_user_ual(arg8
, sp_reg
+ 28)) != 0) {
2255 if ((ret
= get_user_ual(arg7
, sp_reg
+ 24)) != 0) {
2259 if ((ret
= get_user_ual(arg6
, sp_reg
+ 20)) != 0) {
2263 if ((ret
= get_user_ual(arg5
, sp_reg
+ 16)) != 0) {
2269 ret
= do_syscall(env
, env
->active_tc
.gpr
[2],
2270 env
->active_tc
.gpr
[4],
2271 env
->active_tc
.gpr
[5],
2272 env
->active_tc
.gpr
[6],
2273 env
->active_tc
.gpr
[7],
2274 arg5
, arg6
, arg7
, arg8
);
2278 ret
= do_syscall(env
, env
->active_tc
.gpr
[2],
2279 env
->active_tc
.gpr
[4], env
->active_tc
.gpr
[5],
2280 env
->active_tc
.gpr
[6], env
->active_tc
.gpr
[7],
2281 env
->active_tc
.gpr
[8], env
->active_tc
.gpr
[9],
2282 env
->active_tc
.gpr
[10], env
->active_tc
.gpr
[11]);
2284 if (ret
== -TARGET_ERESTARTSYS
) {
2285 env
->active_tc
.PC
-= 4;
2288 if (ret
== -TARGET_QEMU_ESIGRETURN
) {
2289 /* Returning from a successful sigreturn syscall.
2290 Avoid clobbering register state. */
2293 if ((abi_ulong
)ret
>= (abi_ulong
)-1133) {
2294 env
->active_tc
.gpr
[7] = 1; /* error flag */
2297 env
->active_tc
.gpr
[7] = 0; /* error flag */
2299 env
->active_tc
.gpr
[2] = ret
;
2305 info
.si_signo
= TARGET_SIGSEGV
;
2307 /* XXX: check env->error_code */
2308 info
.si_code
= TARGET_SEGV_MAPERR
;
2309 info
._sifields
._sigfault
._addr
= env
->CP0_BadVAddr
;
2310 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
2314 info
.si_signo
= TARGET_SIGILL
;
2317 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
2319 case EXCP_INTERRUPT
:
2320 /* just indicate that signals should be handled asap */
2326 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
2329 info
.si_signo
= sig
;
2331 info
.si_code
= TARGET_TRAP_BRKPT
;
2332 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
2337 if (do_store_exclusive(env
)) {
2338 info
.si_signo
= TARGET_SIGSEGV
;
2340 info
.si_code
= TARGET_SEGV_MAPERR
;
2341 info
._sifields
._sigfault
._addr
= env
->active_tc
.PC
;
2342 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
2346 info
.si_signo
= TARGET_SIGILL
;
2348 info
.si_code
= TARGET_ILL_ILLOPC
;
2349 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
2351 /* The code below was inspired by the MIPS Linux kernel trap
2352 * handling code in arch/mips/kernel/traps.c.
2356 abi_ulong trap_instr
;
2359 if (env
->hflags
& MIPS_HFLAG_M16
) {
2360 if (env
->insn_flags
& ASE_MICROMIPS
) {
2361 /* microMIPS mode */
2362 ret
= get_user_u16(trap_instr
, env
->active_tc
.PC
);
2367 if ((trap_instr
>> 10) == 0x11) {
2368 /* 16-bit instruction */
2369 code
= trap_instr
& 0xf;
2371 /* 32-bit instruction */
2374 ret
= get_user_u16(instr_lo
,
2375 env
->active_tc
.PC
+ 2);
2379 trap_instr
= (trap_instr
<< 16) | instr_lo
;
2380 code
= ((trap_instr
>> 6) & ((1 << 20) - 1));
2381 /* Unfortunately, microMIPS also suffers from
2382 the old assembler bug... */
2383 if (code
>= (1 << 10)) {
2389 ret
= get_user_u16(trap_instr
, env
->active_tc
.PC
);
2393 code
= (trap_instr
>> 6) & 0x3f;
2396 ret
= get_user_u32(trap_instr
, env
->active_tc
.PC
);
2401 /* As described in the original Linux kernel code, the
2402 * below checks on 'code' are to work around an old
2405 code
= ((trap_instr
>> 6) & ((1 << 20) - 1));
2406 if (code
>= (1 << 10)) {
2411 if (do_break(env
, &info
, code
) != 0) {
2418 abi_ulong trap_instr
;
2419 unsigned int code
= 0;
2421 if (env
->hflags
& MIPS_HFLAG_M16
) {
2422 /* microMIPS mode */
2425 ret
= get_user_u16(instr
[0], env
->active_tc
.PC
) ||
2426 get_user_u16(instr
[1], env
->active_tc
.PC
+ 2);
2428 trap_instr
= (instr
[0] << 16) | instr
[1];
2430 ret
= get_user_u32(trap_instr
, env
->active_tc
.PC
);
2437 /* The immediate versions don't provide a code. */
2438 if (!(trap_instr
& 0xFC000000)) {
2439 if (env
->hflags
& MIPS_HFLAG_M16
) {
2440 /* microMIPS mode */
2441 code
= ((trap_instr
>> 12) & ((1 << 4) - 1));
2443 code
= ((trap_instr
>> 6) & ((1 << 10) - 1));
2447 if (do_break(env
, &info
, code
) != 0) {
2453 cpu_exec_step_atomic(cs
);
2457 EXCP_DUMP(env
, "qemu: unhandled CPU exception 0x%x - aborting\n", trapnr
);
2460 process_pending_signals(env
);
2465 #ifdef TARGET_OPENRISC
2467 void cpu_loop(CPUOpenRISCState
*env
)
2469 CPUState
*cs
= CPU(openrisc_env_get_cpu(env
));
2475 trapnr
= cpu_exec(cs
);
2477 process_queued_cpu_work(cs
);
2482 qemu_log_mask(CPU_LOG_INT
, "\nReset request, exit, pc is %#x\n", env
->pc
);
2486 qemu_log_mask(CPU_LOG_INT
, "\nBus error, exit, pc is %#x\n", env
->pc
);
2487 gdbsig
= TARGET_SIGBUS
;
2491 cpu_dump_state(cs
, stderr
, fprintf
, 0);
2492 gdbsig
= TARGET_SIGSEGV
;
2495 qemu_log_mask(CPU_LOG_INT
, "\nTick time interrupt pc is %#x\n", env
->pc
);
2498 qemu_log_mask(CPU_LOG_INT
, "\nAlignment pc is %#x\n", env
->pc
);
2499 gdbsig
= TARGET_SIGBUS
;
2502 qemu_log_mask(CPU_LOG_INT
, "\nIllegal instructionpc is %#x\n", env
->pc
);
2503 gdbsig
= TARGET_SIGILL
;
2506 qemu_log_mask(CPU_LOG_INT
, "\nExternal interruptpc is %#x\n", env
->pc
);
2510 qemu_log_mask(CPU_LOG_INT
, "\nTLB miss\n");
2513 qemu_log_mask(CPU_LOG_INT
, "\nRange\n");
2514 gdbsig
= TARGET_SIGSEGV
;
2517 env
->pc
+= 4; /* 0xc00; */
2518 ret
= do_syscall(env
,
2519 env
->gpr
[11], /* return value */
2520 env
->gpr
[3], /* r3 - r7 are params */
2526 if (ret
== -TARGET_ERESTARTSYS
) {
2528 } else if (ret
!= -TARGET_QEMU_ESIGRETURN
) {
2533 qemu_log_mask(CPU_LOG_INT
, "\nFloating point error\n");
2536 qemu_log_mask(CPU_LOG_INT
, "\nTrap\n");
2537 gdbsig
= TARGET_SIGTRAP
;
2540 qemu_log_mask(CPU_LOG_INT
, "\nNR\n");
2543 cpu_exec_step_atomic(cs
);
2546 EXCP_DUMP(env
, "\nqemu: unhandled CPU exception %#x - aborting\n",
2548 gdbsig
= TARGET_SIGILL
;
2552 gdb_handlesig(cs
, gdbsig
);
2553 if (gdbsig
!= TARGET_SIGTRAP
) {
2558 process_pending_signals(env
);
2562 #endif /* TARGET_OPENRISC */
2565 void cpu_loop(CPUSH4State
*env
)
2567 CPUState
*cs
= CPU(sh_env_get_cpu(env
));
2569 target_siginfo_t info
;
2573 trapnr
= cpu_exec(cs
);
2575 process_queued_cpu_work(cs
);
2580 ret
= do_syscall(env
,
2589 if (ret
== -TARGET_ERESTARTSYS
) {
2591 } else if (ret
!= -TARGET_QEMU_ESIGRETURN
) {
2592 env
->gregs
[0] = ret
;
2595 case EXCP_INTERRUPT
:
2596 /* just indicate that signals should be handled asap */
2602 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
2605 info
.si_signo
= sig
;
2607 info
.si_code
= TARGET_TRAP_BRKPT
;
2608 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
2614 info
.si_signo
= TARGET_SIGSEGV
;
2616 info
.si_code
= TARGET_SEGV_MAPERR
;
2617 info
._sifields
._sigfault
._addr
= env
->tea
;
2618 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
2622 cpu_exec_step_atomic(cs
);
2625 printf ("Unhandled trap: 0x%x\n", trapnr
);
2626 cpu_dump_state(cs
, stderr
, fprintf
, 0);
2629 process_pending_signals (env
);
2635 void cpu_loop(CPUCRISState
*env
)
2637 CPUState
*cs
= CPU(cris_env_get_cpu(env
));
2639 target_siginfo_t info
;
2643 trapnr
= cpu_exec(cs
);
2645 process_queued_cpu_work(cs
);
2650 info
.si_signo
= TARGET_SIGSEGV
;
2652 /* XXX: check env->error_code */
2653 info
.si_code
= TARGET_SEGV_MAPERR
;
2654 info
._sifields
._sigfault
._addr
= env
->pregs
[PR_EDA
];
2655 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
2658 case EXCP_INTERRUPT
:
2659 /* just indicate that signals should be handled asap */
2662 ret
= do_syscall(env
,
2671 if (ret
== -TARGET_ERESTARTSYS
) {
2673 } else if (ret
!= -TARGET_QEMU_ESIGRETURN
) {
2674 env
->regs
[10] = ret
;
2681 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
2684 info
.si_signo
= sig
;
2686 info
.si_code
= TARGET_TRAP_BRKPT
;
2687 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
2692 cpu_exec_step_atomic(cs
);
2695 printf ("Unhandled trap: 0x%x\n", trapnr
);
2696 cpu_dump_state(cs
, stderr
, fprintf
, 0);
2699 process_pending_signals (env
);
2704 #ifdef TARGET_MICROBLAZE
2705 void cpu_loop(CPUMBState
*env
)
2707 CPUState
*cs
= CPU(mb_env_get_cpu(env
));
2709 target_siginfo_t info
;
2713 trapnr
= cpu_exec(cs
);
2715 process_queued_cpu_work(cs
);
2720 info
.si_signo
= TARGET_SIGSEGV
;
2722 /* XXX: check env->error_code */
2723 info
.si_code
= TARGET_SEGV_MAPERR
;
2724 info
._sifields
._sigfault
._addr
= 0;
2725 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
2728 case EXCP_INTERRUPT
:
2729 /* just indicate that signals should be handled asap */
2732 /* Return address is 4 bytes after the call. */
2734 env
->sregs
[SR_PC
] = env
->regs
[14];
2735 ret
= do_syscall(env
,
2744 if (ret
== -TARGET_ERESTARTSYS
) {
2745 /* Wind back to before the syscall. */
2746 env
->sregs
[SR_PC
] -= 4;
2747 } else if (ret
!= -TARGET_QEMU_ESIGRETURN
) {
2750 /* All syscall exits result in guest r14 being equal to the
2751 * PC we return to, because the kernel syscall exit "rtbd" does
2752 * this. (This is true even for sigreturn(); note that r14 is
2753 * not a userspace-usable register, as the kernel may clobber it
2756 env
->regs
[14] = env
->sregs
[SR_PC
];
2759 env
->regs
[17] = env
->sregs
[SR_PC
] + 4;
2760 if (env
->iflags
& D_FLAG
) {
2761 env
->sregs
[SR_ESR
] |= 1 << 12;
2762 env
->sregs
[SR_PC
] -= 4;
2763 /* FIXME: if branch was immed, replay the imm as well. */
2766 env
->iflags
&= ~(IMM_FLAG
| D_FLAG
);
2768 switch (env
->sregs
[SR_ESR
] & 31) {
2769 case ESR_EC_DIVZERO
:
2770 info
.si_signo
= TARGET_SIGFPE
;
2772 info
.si_code
= TARGET_FPE_FLTDIV
;
2773 info
._sifields
._sigfault
._addr
= 0;
2774 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
2777 info
.si_signo
= TARGET_SIGFPE
;
2779 if (env
->sregs
[SR_FSR
] & FSR_IO
) {
2780 info
.si_code
= TARGET_FPE_FLTINV
;
2782 if (env
->sregs
[SR_FSR
] & FSR_DZ
) {
2783 info
.si_code
= TARGET_FPE_FLTDIV
;
2785 info
._sifields
._sigfault
._addr
= 0;
2786 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
2789 printf ("Unhandled hw-exception: 0x%x\n",
2790 env
->sregs
[SR_ESR
] & ESR_EC_MASK
);
2791 cpu_dump_state(cs
, stderr
, fprintf
, 0);
2800 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
2803 info
.si_signo
= sig
;
2805 info
.si_code
= TARGET_TRAP_BRKPT
;
2806 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
2811 cpu_exec_step_atomic(cs
);
2814 printf ("Unhandled trap: 0x%x\n", trapnr
);
2815 cpu_dump_state(cs
, stderr
, fprintf
, 0);
2818 process_pending_signals (env
);
2825 void cpu_loop(CPUM68KState
*env
)
2827 CPUState
*cs
= CPU(m68k_env_get_cpu(env
));
2830 target_siginfo_t info
;
2831 TaskState
*ts
= cs
->opaque
;
2835 trapnr
= cpu_exec(cs
);
2837 process_queued_cpu_work(cs
);
2842 if (ts
->sim_syscalls
) {
2844 get_user_u16(nr
, env
->pc
+ 2);
2846 do_m68k_simcall(env
, nr
);
2852 case EXCP_HALT_INSN
:
2853 /* Semihosing syscall. */
2855 do_m68k_semihosting(env
, env
->dregs
[0]);
2859 case EXCP_UNSUPPORTED
:
2861 info
.si_signo
= TARGET_SIGILL
;
2863 info
.si_code
= TARGET_ILL_ILLOPN
;
2864 info
._sifields
._sigfault
._addr
= env
->pc
;
2865 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
2868 info
.si_signo
= TARGET_SIGFPE
;
2870 info
.si_code
= TARGET_FPE_INTDIV
;
2871 info
._sifields
._sigfault
._addr
= env
->pc
;
2872 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
2877 ts
->sim_syscalls
= 0;
2880 ret
= do_syscall(env
,
2889 if (ret
== -TARGET_ERESTARTSYS
) {
2891 } else if (ret
!= -TARGET_QEMU_ESIGRETURN
) {
2892 env
->dregs
[0] = ret
;
2896 case EXCP_INTERRUPT
:
2897 /* just indicate that signals should be handled asap */
2901 info
.si_signo
= TARGET_SIGSEGV
;
2903 /* XXX: check env->error_code */
2904 info
.si_code
= TARGET_SEGV_MAPERR
;
2905 info
._sifields
._sigfault
._addr
= env
->mmu
.ar
;
2906 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
2913 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
2916 info
.si_signo
= sig
;
2918 info
.si_code
= TARGET_TRAP_BRKPT
;
2919 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
2924 cpu_exec_step_atomic(cs
);
2927 EXCP_DUMP(env
, "qemu: unhandled CPU exception 0x%x - aborting\n", trapnr
);
2930 process_pending_signals(env
);
2933 #endif /* TARGET_M68K */
2936 void cpu_loop(CPUAlphaState
*env
)
2938 CPUState
*cs
= CPU(alpha_env_get_cpu(env
));
2940 target_siginfo_t info
;
2945 trapnr
= cpu_exec(cs
);
2947 process_queued_cpu_work(cs
);
2949 /* All of the traps imply a transition through PALcode, which
2950 implies an REI instruction has been executed. Which means
2951 that the intr_flag should be cleared. */
2956 fprintf(stderr
, "Reset requested. Exit\n");
2960 fprintf(stderr
, "Machine check exception. Exit\n");
2963 case EXCP_SMP_INTERRUPT
:
2964 case EXCP_CLK_INTERRUPT
:
2965 case EXCP_DEV_INTERRUPT
:
2966 fprintf(stderr
, "External interrupt. Exit\n");
2970 env
->lock_addr
= -1;
2971 info
.si_signo
= TARGET_SIGSEGV
;
2973 info
.si_code
= (page_get_flags(env
->trap_arg0
) & PAGE_VALID
2974 ? TARGET_SEGV_ACCERR
: TARGET_SEGV_MAPERR
);
2975 info
._sifields
._sigfault
._addr
= env
->trap_arg0
;
2976 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
2979 env
->lock_addr
= -1;
2980 info
.si_signo
= TARGET_SIGBUS
;
2982 info
.si_code
= TARGET_BUS_ADRALN
;
2983 info
._sifields
._sigfault
._addr
= env
->trap_arg0
;
2984 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
2988 env
->lock_addr
= -1;
2989 info
.si_signo
= TARGET_SIGILL
;
2991 info
.si_code
= TARGET_ILL_ILLOPC
;
2992 info
._sifields
._sigfault
._addr
= env
->pc
;
2993 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
2996 env
->lock_addr
= -1;
2997 info
.si_signo
= TARGET_SIGFPE
;
2999 info
.si_code
= TARGET_FPE_FLTINV
;
3000 info
._sifields
._sigfault
._addr
= env
->pc
;
3001 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
3004 /* No-op. Linux simply re-enables the FPU. */
3007 env
->lock_addr
= -1;
3008 switch (env
->error_code
) {
3011 info
.si_signo
= TARGET_SIGTRAP
;
3013 info
.si_code
= TARGET_TRAP_BRKPT
;
3014 info
._sifields
._sigfault
._addr
= env
->pc
;
3015 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
3019 info
.si_signo
= TARGET_SIGTRAP
;
3022 info
._sifields
._sigfault
._addr
= env
->pc
;
3023 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
3027 trapnr
= env
->ir
[IR_V0
];
3028 sysret
= do_syscall(env
, trapnr
,
3029 env
->ir
[IR_A0
], env
->ir
[IR_A1
],
3030 env
->ir
[IR_A2
], env
->ir
[IR_A3
],
3031 env
->ir
[IR_A4
], env
->ir
[IR_A5
],
3033 if (sysret
== -TARGET_ERESTARTSYS
) {
3037 if (sysret
== -TARGET_QEMU_ESIGRETURN
) {
3040 /* Syscall writes 0 to V0 to bypass error check, similar
3041 to how this is handled internal to Linux kernel.
3042 (Ab)use trapnr temporarily as boolean indicating error. */
3043 trapnr
= (env
->ir
[IR_V0
] != 0 && sysret
< 0);
3044 env
->ir
[IR_V0
] = (trapnr
? -sysret
: sysret
);
3045 env
->ir
[IR_A3
] = trapnr
;
3049 /* ??? We can probably elide the code using page_unprotect
3050 that is checking for self-modifying code. Instead we
3051 could simply call tb_flush here. Until we work out the
3052 changes required to turn off the extra write protection,
3053 this can be a no-op. */
3057 /* Handled in the translator for usermode. */
3061 /* Handled in the translator for usermode. */
3065 info
.si_signo
= TARGET_SIGFPE
;
3066 switch (env
->ir
[IR_A0
]) {
3067 case TARGET_GEN_INTOVF
:
3068 info
.si_code
= TARGET_FPE_INTOVF
;
3070 case TARGET_GEN_INTDIV
:
3071 info
.si_code
= TARGET_FPE_INTDIV
;
3073 case TARGET_GEN_FLTOVF
:
3074 info
.si_code
= TARGET_FPE_FLTOVF
;
3076 case TARGET_GEN_FLTUND
:
3077 info
.si_code
= TARGET_FPE_FLTUND
;
3079 case TARGET_GEN_FLTINV
:
3080 info
.si_code
= TARGET_FPE_FLTINV
;
3082 case TARGET_GEN_FLTINE
:
3083 info
.si_code
= TARGET_FPE_FLTRES
;
3085 case TARGET_GEN_ROPRAND
:
3089 info
.si_signo
= TARGET_SIGTRAP
;
3094 info
._sifields
._sigfault
._addr
= env
->pc
;
3095 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
3102 info
.si_signo
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
3103 if (info
.si_signo
) {
3104 env
->lock_addr
= -1;
3106 info
.si_code
= TARGET_TRAP_BRKPT
;
3107 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
3110 case EXCP_INTERRUPT
:
3111 /* Just indicate that signals should be handled asap. */
3114 cpu_exec_step_atomic(cs
);
3117 printf ("Unhandled trap: 0x%x\n", trapnr
);
3118 cpu_dump_state(cs
, stderr
, fprintf
, 0);
3121 process_pending_signals (env
);
3124 #endif /* TARGET_ALPHA */
3127 void cpu_loop(CPUS390XState
*env
)
3129 CPUState
*cs
= CPU(s390_env_get_cpu(env
));
3131 target_siginfo_t info
;
3137 trapnr
= cpu_exec(cs
);
3139 process_queued_cpu_work(cs
);
3142 case EXCP_INTERRUPT
:
3143 /* Just indicate that signals should be handled asap. */
3147 n
= env
->int_svc_code
;
3149 /* syscalls > 255 */
3152 env
->psw
.addr
+= env
->int_svc_ilen
;
3153 ret
= do_syscall(env
, n
, env
->regs
[2], env
->regs
[3],
3154 env
->regs
[4], env
->regs
[5],
3155 env
->regs
[6], env
->regs
[7], 0, 0);
3156 if (ret
== -TARGET_ERESTARTSYS
) {
3157 env
->psw
.addr
-= env
->int_svc_ilen
;
3158 } else if (ret
!= -TARGET_QEMU_ESIGRETURN
) {
3164 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
3166 n
= TARGET_TRAP_BRKPT
;
3171 n
= env
->int_pgm_code
;
3174 case PGM_PRIVILEGED
:
3175 sig
= TARGET_SIGILL
;
3176 n
= TARGET_ILL_ILLOPC
;
3178 case PGM_PROTECTION
:
3179 case PGM_ADDRESSING
:
3180 sig
= TARGET_SIGSEGV
;
3181 /* XXX: check env->error_code */
3182 n
= TARGET_SEGV_MAPERR
;
3183 addr
= env
->__excp_addr
;
3186 case PGM_SPECIFICATION
:
3187 case PGM_SPECIAL_OP
:
3190 sig
= TARGET_SIGILL
;
3191 n
= TARGET_ILL_ILLOPN
;
3194 case PGM_FIXPT_OVERFLOW
:
3195 sig
= TARGET_SIGFPE
;
3196 n
= TARGET_FPE_INTOVF
;
3198 case PGM_FIXPT_DIVIDE
:
3199 sig
= TARGET_SIGFPE
;
3200 n
= TARGET_FPE_INTDIV
;
3204 n
= (env
->fpc
>> 8) & 0xff;
3206 /* compare-and-trap */
3209 /* An IEEE exception, simulated or otherwise. */
3211 n
= TARGET_FPE_FLTINV
;
3212 } else if (n
& 0x40) {
3213 n
= TARGET_FPE_FLTDIV
;
3214 } else if (n
& 0x20) {
3215 n
= TARGET_FPE_FLTOVF
;
3216 } else if (n
& 0x10) {
3217 n
= TARGET_FPE_FLTUND
;
3218 } else if (n
& 0x08) {
3219 n
= TARGET_FPE_FLTRES
;
3221 /* ??? Quantum exception; BFP, DFP error. */
3224 sig
= TARGET_SIGFPE
;
3229 fprintf(stderr
, "Unhandled program exception: %#x\n", n
);
3230 cpu_dump_state(cs
, stderr
, fprintf
, 0);
3236 addr
= env
->psw
.addr
;
3238 info
.si_signo
= sig
;
3241 info
._sifields
._sigfault
._addr
= addr
;
3242 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
3246 cpu_exec_step_atomic(cs
);
3249 fprintf(stderr
, "Unhandled trap: 0x%x\n", trapnr
);
3250 cpu_dump_state(cs
, stderr
, fprintf
, 0);
3253 process_pending_signals (env
);
3257 #endif /* TARGET_S390X */
3259 #ifdef TARGET_TILEGX
3261 static void gen_sigill_reg(CPUTLGState
*env
)
3263 target_siginfo_t info
;
3265 info
.si_signo
= TARGET_SIGILL
;
3267 info
.si_code
= TARGET_ILL_PRVREG
;
3268 info
._sifields
._sigfault
._addr
= env
->pc
;
3269 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
3272 static void do_signal(CPUTLGState
*env
, int signo
, int sigcode
)
3274 target_siginfo_t info
;
3276 info
.si_signo
= signo
;
3278 info
._sifields
._sigfault
._addr
= env
->pc
;
3280 if (signo
== TARGET_SIGSEGV
) {
3281 /* The passed in sigcode is a dummy; check for a page mapping
3282 and pass either MAPERR or ACCERR. */
3283 target_ulong addr
= env
->excaddr
;
3284 info
._sifields
._sigfault
._addr
= addr
;
3285 if (page_check_range(addr
, 1, PAGE_VALID
) < 0) {
3286 sigcode
= TARGET_SEGV_MAPERR
;
3288 sigcode
= TARGET_SEGV_ACCERR
;
3291 info
.si_code
= sigcode
;
3293 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
3296 static void gen_sigsegv_maperr(CPUTLGState
*env
, target_ulong addr
)
3298 env
->excaddr
= addr
;
3299 do_signal(env
, TARGET_SIGSEGV
, 0);
3302 static void set_regval(CPUTLGState
*env
, uint8_t reg
, uint64_t val
)
3304 if (unlikely(reg
>= TILEGX_R_COUNT
)) {
3315 gen_sigill_reg(env
);
3318 g_assert_not_reached();
3321 env
->regs
[reg
] = val
;
3325 * Compare the 8-byte contents of the CmpValue SPR with the 8-byte value in
3326 * memory at the address held in the first source register. If the values are
3327 * not equal, then no memory operation is performed. If the values are equal,
3328 * the 8-byte quantity from the second source register is written into memory
3329 * at the address held in the first source register. In either case, the result
3330 * of the instruction is the value read from memory. The compare and write to
3331 * memory are atomic and thus can be used for synchronization purposes. This
3332 * instruction only operates for addresses aligned to a 8-byte boundary.
3333 * Unaligned memory access causes an Unaligned Data Reference interrupt.
3335 * Functional Description (64-bit)
3336 * uint64_t memVal = memoryReadDoubleWord (rf[SrcA]);
3337 * rf[Dest] = memVal;
3338 * if (memVal == SPR[CmpValueSPR])
3339 * memoryWriteDoubleWord (rf[SrcA], rf[SrcB]);
3341 * Functional Description (32-bit)
3342 * uint64_t memVal = signExtend32 (memoryReadWord (rf[SrcA]));
3343 * rf[Dest] = memVal;
3344 * if (memVal == signExtend32 (SPR[CmpValueSPR]))
3345 * memoryWriteWord (rf[SrcA], rf[SrcB]);
3348 * This function also processes exch and exch4 which need not process SPR.
3350 static void do_exch(CPUTLGState
*env
, bool quad
, bool cmp
)
3353 target_long val
, sprval
;
3357 addr
= env
->atomic_srca
;
3358 if (quad
? get_user_s64(val
, addr
) : get_user_s32(val
, addr
)) {
3359 goto sigsegv_maperr
;
3364 sprval
= env
->spregs
[TILEGX_SPR_CMPEXCH
];
3366 sprval
= sextract64(env
->spregs
[TILEGX_SPR_CMPEXCH
], 0, 32);
3370 if (!cmp
|| val
== sprval
) {
3371 target_long valb
= env
->atomic_srcb
;
3372 if (quad
? put_user_u64(valb
, addr
) : put_user_u32(valb
, addr
)) {
3373 goto sigsegv_maperr
;
3377 set_regval(env
, env
->atomic_dstr
, val
);
3383 gen_sigsegv_maperr(env
, addr
);
3386 static void do_fetch(CPUTLGState
*env
, int trapnr
, bool quad
)
3390 target_long val
, valb
;
3394 addr
= env
->atomic_srca
;
3395 valb
= env
->atomic_srcb
;
3396 if (quad
? get_user_s64(val
, addr
) : get_user_s32(val
, addr
)) {
3397 goto sigsegv_maperr
;
3401 case TILEGX_EXCP_OPCODE_FETCHADD
:
3402 case TILEGX_EXCP_OPCODE_FETCHADD4
:
3405 case TILEGX_EXCP_OPCODE_FETCHADDGEZ
:
3411 case TILEGX_EXCP_OPCODE_FETCHADDGEZ4
:
3413 if ((int32_t)valb
< 0) {
3417 case TILEGX_EXCP_OPCODE_FETCHAND
:
3418 case TILEGX_EXCP_OPCODE_FETCHAND4
:
3421 case TILEGX_EXCP_OPCODE_FETCHOR
:
3422 case TILEGX_EXCP_OPCODE_FETCHOR4
:
3426 g_assert_not_reached();
3430 if (quad
? put_user_u64(valb
, addr
) : put_user_u32(valb
, addr
)) {
3431 goto sigsegv_maperr
;
3435 set_regval(env
, env
->atomic_dstr
, val
);
3441 gen_sigsegv_maperr(env
, addr
);
3444 void cpu_loop(CPUTLGState
*env
)
3446 CPUState
*cs
= CPU(tilegx_env_get_cpu(env
));
3451 trapnr
= cpu_exec(cs
);
3453 process_queued_cpu_work(cs
);
3456 case TILEGX_EXCP_SYSCALL
:
3458 abi_ulong ret
= do_syscall(env
, env
->regs
[TILEGX_R_NR
],
3459 env
->regs
[0], env
->regs
[1],
3460 env
->regs
[2], env
->regs
[3],
3461 env
->regs
[4], env
->regs
[5],
3462 env
->regs
[6], env
->regs
[7]);
3463 if (ret
== -TARGET_ERESTARTSYS
) {
3465 } else if (ret
!= -TARGET_QEMU_ESIGRETURN
) {
3466 env
->regs
[TILEGX_R_RE
] = ret
;
3467 env
->regs
[TILEGX_R_ERR
] = TILEGX_IS_ERRNO(ret
) ? -ret
: 0;
3471 case TILEGX_EXCP_OPCODE_EXCH
:
3472 do_exch(env
, true, false);
3474 case TILEGX_EXCP_OPCODE_EXCH4
:
3475 do_exch(env
, false, false);
3477 case TILEGX_EXCP_OPCODE_CMPEXCH
:
3478 do_exch(env
, true, true);
3480 case TILEGX_EXCP_OPCODE_CMPEXCH4
:
3481 do_exch(env
, false, true);
3483 case TILEGX_EXCP_OPCODE_FETCHADD
:
3484 case TILEGX_EXCP_OPCODE_FETCHADDGEZ
:
3485 case TILEGX_EXCP_OPCODE_FETCHAND
:
3486 case TILEGX_EXCP_OPCODE_FETCHOR
:
3487 do_fetch(env
, trapnr
, true);
3489 case TILEGX_EXCP_OPCODE_FETCHADD4
:
3490 case TILEGX_EXCP_OPCODE_FETCHADDGEZ4
:
3491 case TILEGX_EXCP_OPCODE_FETCHAND4
:
3492 case TILEGX_EXCP_OPCODE_FETCHOR4
:
3493 do_fetch(env
, trapnr
, false);
3495 case TILEGX_EXCP_SIGNAL
:
3496 do_signal(env
, env
->signo
, env
->sigcode
);
3498 case TILEGX_EXCP_REG_IDN_ACCESS
:
3499 case TILEGX_EXCP_REG_UDN_ACCESS
:
3500 gen_sigill_reg(env
);
3503 cpu_exec_step_atomic(cs
);
3506 fprintf(stderr
, "trapnr is %d[0x%x].\n", trapnr
, trapnr
);
3507 g_assert_not_reached();
3509 process_pending_signals(env
);
3515 THREAD CPUState
*thread_cpu
;
3517 bool qemu_cpu_is_self(CPUState
*cpu
)
3519 return thread_cpu
== cpu
;
3522 void qemu_cpu_kick(CPUState
*cpu
)
3527 void task_settid(TaskState
*ts
)
3529 if (ts
->ts_tid
== 0) {
3530 ts
->ts_tid
= (pid_t
)syscall(SYS_gettid
);
3534 void stop_all_tasks(void)
3537 * We trust that when using NPTL, start_exclusive()
3538 * handles thread stopping correctly.
3543 /* Assumes contents are already zeroed. */
3544 void init_task_state(TaskState
*ts
)
3549 CPUArchState
*cpu_copy(CPUArchState
*env
)
3551 CPUState
*cpu
= ENV_GET_CPU(env
);
3552 CPUState
*new_cpu
= cpu_init(cpu_model
);
3553 CPUArchState
*new_env
= new_cpu
->env_ptr
;
3557 /* Reset non arch specific state */
3560 memcpy(new_env
, env
, sizeof(CPUArchState
));
3562 /* Clone all break/watchpoints.
3563 Note: Once we support ptrace with hw-debug register access, make sure
3564 BP_CPU break/watchpoints are handled correctly on clone. */
3565 QTAILQ_INIT(&new_cpu
->breakpoints
);
3566 QTAILQ_INIT(&new_cpu
->watchpoints
);
3567 QTAILQ_FOREACH(bp
, &cpu
->breakpoints
, entry
) {
3568 cpu_breakpoint_insert(new_cpu
, bp
->pc
, bp
->flags
, NULL
);
3570 QTAILQ_FOREACH(wp
, &cpu
->watchpoints
, entry
) {
3571 cpu_watchpoint_insert(new_cpu
, wp
->vaddr
, wp
->len
, wp
->flags
, NULL
);
3577 static void handle_arg_help(const char *arg
)
3579 usage(EXIT_SUCCESS
);
3582 static void handle_arg_log(const char *arg
)
3586 mask
= qemu_str_to_log_mask(arg
);
3588 qemu_print_log_usage(stdout
);
3591 qemu_log_needs_buffers();
3595 static void handle_arg_log_filename(const char *arg
)
3597 qemu_set_log_filename(arg
, &error_fatal
);
3600 static void handle_arg_set_env(const char *arg
)
3602 char *r
, *p
, *token
;
3603 r
= p
= strdup(arg
);
3604 while ((token
= strsep(&p
, ",")) != NULL
) {
3605 if (envlist_setenv(envlist
, token
) != 0) {
3606 usage(EXIT_FAILURE
);
3612 static void handle_arg_unset_env(const char *arg
)
3614 char *r
, *p
, *token
;
3615 r
= p
= strdup(arg
);
3616 while ((token
= strsep(&p
, ",")) != NULL
) {
3617 if (envlist_unsetenv(envlist
, token
) != 0) {
3618 usage(EXIT_FAILURE
);
3624 static void handle_arg_argv0(const char *arg
)
3626 argv0
= strdup(arg
);
3629 static void handle_arg_stack_size(const char *arg
)
3632 guest_stack_size
= strtoul(arg
, &p
, 0);
3633 if (guest_stack_size
== 0) {
3634 usage(EXIT_FAILURE
);
3638 guest_stack_size
*= 1024 * 1024;
3639 } else if (*p
== 'k' || *p
== 'K') {
3640 guest_stack_size
*= 1024;
3644 static void handle_arg_ld_prefix(const char *arg
)
3646 interp_prefix
= strdup(arg
);
3649 static void handle_arg_pagesize(const char *arg
)
3651 qemu_host_page_size
= atoi(arg
);
3652 if (qemu_host_page_size
== 0 ||
3653 (qemu_host_page_size
& (qemu_host_page_size
- 1)) != 0) {
3654 fprintf(stderr
, "page size must be a power of two\n");
3659 static void handle_arg_randseed(const char *arg
)
3661 unsigned long long seed
;
3663 if (parse_uint_full(arg
, &seed
, 0) != 0 || seed
> UINT_MAX
) {
3664 fprintf(stderr
, "Invalid seed number: %s\n", arg
);
3670 static void handle_arg_gdb(const char *arg
)
3672 gdbstub_port
= atoi(arg
);
3675 static void handle_arg_uname(const char *arg
)
3677 qemu_uname_release
= strdup(arg
);
3680 static void handle_arg_cpu(const char *arg
)
3682 cpu_model
= strdup(arg
);
3683 if (cpu_model
== NULL
|| is_help_option(cpu_model
)) {
3684 /* XXX: implement xxx_cpu_list for targets that still miss it */
3685 #if defined(cpu_list)
3686 cpu_list(stdout
, &fprintf
);
3692 static void handle_arg_guest_base(const char *arg
)
3694 guest_base
= strtol(arg
, NULL
, 0);
3695 have_guest_base
= 1;
3698 static void handle_arg_reserved_va(const char *arg
)
3702 reserved_va
= strtoul(arg
, &p
, 0);
3716 unsigned long unshifted
= reserved_va
;
3718 reserved_va
<<= shift
;
3719 if (((reserved_va
>> shift
) != unshifted
)
3720 #if HOST_LONG_BITS > TARGET_VIRT_ADDR_SPACE_BITS
3721 || (reserved_va
> (1ul << TARGET_VIRT_ADDR_SPACE_BITS
))
3724 fprintf(stderr
, "Reserved virtual address too big\n");
3729 fprintf(stderr
, "Unrecognised -R size suffix '%s'\n", p
);
3734 static void handle_arg_singlestep(const char *arg
)
3739 static void handle_arg_strace(const char *arg
)
3744 static void handle_arg_version(const char *arg
)
3746 printf("qemu-" TARGET_NAME
" version " QEMU_VERSION QEMU_PKGVERSION
3747 "\n" QEMU_COPYRIGHT
"\n");
3751 static char *trace_file
;
3752 static void handle_arg_trace(const char *arg
)
3755 trace_file
= trace_opt_parse(arg
);
3758 struct qemu_argument
{
3762 void (*handle_opt
)(const char *arg
);
3763 const char *example
;
3767 static const struct qemu_argument arg_table
[] = {
3768 {"h", "", false, handle_arg_help
,
3769 "", "print this help"},
3770 {"help", "", false, handle_arg_help
,
3772 {"g", "QEMU_GDB", true, handle_arg_gdb
,
3773 "port", "wait gdb connection to 'port'"},
3774 {"L", "QEMU_LD_PREFIX", true, handle_arg_ld_prefix
,
3775 "path", "set the elf interpreter prefix to 'path'"},
3776 {"s", "QEMU_STACK_SIZE", true, handle_arg_stack_size
,
3777 "size", "set the stack size to 'size' bytes"},
3778 {"cpu", "QEMU_CPU", true, handle_arg_cpu
,
3779 "model", "select CPU (-cpu help for list)"},
3780 {"E", "QEMU_SET_ENV", true, handle_arg_set_env
,
3781 "var=value", "sets targets environment variable (see below)"},
3782 {"U", "QEMU_UNSET_ENV", true, handle_arg_unset_env
,
3783 "var", "unsets targets environment variable (see below)"},
3784 {"0", "QEMU_ARGV0", true, handle_arg_argv0
,
3785 "argv0", "forces target process argv[0] to be 'argv0'"},
3786 {"r", "QEMU_UNAME", true, handle_arg_uname
,
3787 "uname", "set qemu uname release string to 'uname'"},
3788 {"B", "QEMU_GUEST_BASE", true, handle_arg_guest_base
,
3789 "address", "set guest_base address to 'address'"},
3790 {"R", "QEMU_RESERVED_VA", true, handle_arg_reserved_va
,
3791 "size", "reserve 'size' bytes for guest virtual address space"},
3792 {"d", "QEMU_LOG", true, handle_arg_log
,
3793 "item[,...]", "enable logging of specified items "
3794 "(use '-d help' for a list of items)"},
3795 {"D", "QEMU_LOG_FILENAME", true, handle_arg_log_filename
,
3796 "logfile", "write logs to 'logfile' (default stderr)"},
3797 {"p", "QEMU_PAGESIZE", true, handle_arg_pagesize
,
3798 "pagesize", "set the host page size to 'pagesize'"},
3799 {"singlestep", "QEMU_SINGLESTEP", false, handle_arg_singlestep
,
3800 "", "run in singlestep mode"},
3801 {"strace", "QEMU_STRACE", false, handle_arg_strace
,
3802 "", "log system calls"},
3803 {"seed", "QEMU_RAND_SEED", true, handle_arg_randseed
,
3804 "", "Seed for pseudo-random number generator"},
3805 {"trace", "QEMU_TRACE", true, handle_arg_trace
,
3806 "", "[[enable=]<pattern>][,events=<file>][,file=<file>]"},
3807 {"version", "QEMU_VERSION", false, handle_arg_version
,
3808 "", "display version information and exit"},
3809 {NULL
, NULL
, false, NULL
, NULL
, NULL
}
3812 static void usage(int exitcode
)
3814 const struct qemu_argument
*arginfo
;
3818 printf("usage: qemu-" TARGET_NAME
" [options] program [arguments...]\n"
3819 "Linux CPU emulator (compiled for " TARGET_NAME
" emulation)\n"
3821 "Options and associated environment variables:\n"
3824 /* Calculate column widths. We must always have at least enough space
3825 * for the column header.
3827 maxarglen
= strlen("Argument");
3828 maxenvlen
= strlen("Env-variable");
3830 for (arginfo
= arg_table
; arginfo
->handle_opt
!= NULL
; arginfo
++) {
3831 int arglen
= strlen(arginfo
->argv
);
3832 if (arginfo
->has_arg
) {
3833 arglen
+= strlen(arginfo
->example
) + 1;
3835 if (strlen(arginfo
->env
) > maxenvlen
) {
3836 maxenvlen
= strlen(arginfo
->env
);
3838 if (arglen
> maxarglen
) {
3843 printf("%-*s %-*s Description\n", maxarglen
+1, "Argument",
3844 maxenvlen
, "Env-variable");
3846 for (arginfo
= arg_table
; arginfo
->handle_opt
!= NULL
; arginfo
++) {
3847 if (arginfo
->has_arg
) {
3848 printf("-%s %-*s %-*s %s\n", arginfo
->argv
,
3849 (int)(maxarglen
- strlen(arginfo
->argv
) - 1),
3850 arginfo
->example
, maxenvlen
, arginfo
->env
, arginfo
->help
);
3852 printf("-%-*s %-*s %s\n", maxarglen
, arginfo
->argv
,
3853 maxenvlen
, arginfo
->env
,
3860 "QEMU_LD_PREFIX = %s\n"
3861 "QEMU_STACK_SIZE = %ld byte\n",
3866 "You can use -E and -U options or the QEMU_SET_ENV and\n"
3867 "QEMU_UNSET_ENV environment variables to set and unset\n"
3868 "environment variables for the target process.\n"
3869 "It is possible to provide several variables by separating them\n"
3870 "by commas in getsubopt(3) style. Additionally it is possible to\n"
3871 "provide the -E and -U options multiple times.\n"
3872 "The following lines are equivalent:\n"
3873 " -E var1=val2 -E var2=val2 -U LD_PRELOAD -U LD_DEBUG\n"
3874 " -E var1=val2,var2=val2 -U LD_PRELOAD,LD_DEBUG\n"
3875 " QEMU_SET_ENV=var1=val2,var2=val2 QEMU_UNSET_ENV=LD_PRELOAD,LD_DEBUG\n"
3876 "Note that if you provide several changes to a single variable\n"
3877 "the last change will stay in effect.\n");
3882 static int parse_args(int argc
, char **argv
)
3886 const struct qemu_argument
*arginfo
;
3888 for (arginfo
= arg_table
; arginfo
->handle_opt
!= NULL
; arginfo
++) {
3889 if (arginfo
->env
== NULL
) {
3893 r
= getenv(arginfo
->env
);
3895 arginfo
->handle_opt(r
);
3901 if (optind
>= argc
) {
3910 if (!strcmp(r
, "-")) {
3913 /* Treat --foo the same as -foo. */
3918 for (arginfo
= arg_table
; arginfo
->handle_opt
!= NULL
; arginfo
++) {
3919 if (!strcmp(r
, arginfo
->argv
)) {
3920 if (arginfo
->has_arg
) {
3921 if (optind
>= argc
) {
3922 (void) fprintf(stderr
,
3923 "qemu: missing argument for option '%s'\n", r
);
3926 arginfo
->handle_opt(argv
[optind
]);
3929 arginfo
->handle_opt(NULL
);
3935 /* no option matched the current argv */
3936 if (arginfo
->handle_opt
== NULL
) {
3937 (void) fprintf(stderr
, "qemu: unknown option '%s'\n", r
);
3942 if (optind
>= argc
) {
3943 (void) fprintf(stderr
, "qemu: no user program specified\n");
3947 filename
= argv
[optind
];
3948 exec_path
= argv
[optind
];
3953 int main(int argc
, char **argv
, char **envp
)
3955 struct target_pt_regs regs1
, *regs
= ®s1
;
3956 struct image_info info1
, *info
= &info1
;
3957 struct linux_binprm bprm
;
3962 char **target_environ
, **wrk
;
3969 module_call_init(MODULE_INIT_TRACE
);
3970 qemu_init_cpu_list();
3971 module_call_init(MODULE_INIT_QOM
);
3973 if ((envlist
= envlist_create()) == NULL
) {
3974 (void) fprintf(stderr
, "Unable to allocate envlist\n");
3978 /* add current environment into the list */
3979 for (wrk
= environ
; *wrk
!= NULL
; wrk
++) {
3980 (void) envlist_setenv(envlist
, *wrk
);
3983 /* Read the stack limit from the kernel. If it's "unlimited",
3984 then we can do little else besides use the default. */
3987 if (getrlimit(RLIMIT_STACK
, &lim
) == 0
3988 && lim
.rlim_cur
!= RLIM_INFINITY
3989 && lim
.rlim_cur
== (target_long
)lim
.rlim_cur
) {
3990 guest_stack_size
= lim
.rlim_cur
;
3998 qemu_add_opts(&qemu_trace_opts
);
4000 optind
= parse_args(argc
, argv
);
4002 if (!trace_init_backends()) {
4005 trace_init_file(trace_file
);
4008 memset(regs
, 0, sizeof(struct target_pt_regs
));
4010 /* Zero out image_info */
4011 memset(info
, 0, sizeof(struct image_info
));
4013 memset(&bprm
, 0, sizeof (bprm
));
4015 /* Scan interp_prefix dir for replacement files. */
4016 init_paths(interp_prefix
);
4018 init_qemu_uname_release();
4020 if (cpu_model
== NULL
) {
4021 #if defined(TARGET_I386)
4022 #ifdef TARGET_X86_64
4023 cpu_model
= "qemu64";
4025 cpu_model
= "qemu32";
4027 #elif defined(TARGET_ARM)
4029 #elif defined(TARGET_UNICORE32)
4031 #elif defined(TARGET_M68K)
4033 #elif defined(TARGET_SPARC)
4034 #ifdef TARGET_SPARC64
4035 cpu_model
= "TI UltraSparc II";
4037 cpu_model
= "Fujitsu MB86904";
4039 #elif defined(TARGET_MIPS)
4040 #if defined(TARGET_ABI_MIPSN32) || defined(TARGET_ABI_MIPSN64)
4045 #elif defined TARGET_OPENRISC
4046 cpu_model
= "or1200";
4047 #elif defined(TARGET_PPC)
4048 # ifdef TARGET_PPC64
4049 cpu_model
= "POWER8";
4053 #elif defined TARGET_SH4
4054 cpu_model
= TYPE_SH7785_CPU
;
4060 /* NOTE: we need to init the CPU at this stage to get
4061 qemu_host_page_size */
4062 cpu
= cpu_init(cpu_model
);
4064 fprintf(stderr
, "Unable to find CPU definition\n");
4072 if (getenv("QEMU_STRACE")) {
4076 if (getenv("QEMU_RAND_SEED")) {
4077 handle_arg_randseed(getenv("QEMU_RAND_SEED"));
4080 target_environ
= envlist_to_environ(envlist
, NULL
);
4081 envlist_free(envlist
);
4084 * Now that page sizes are configured in cpu_init() we can do
4085 * proper page alignment for guest_base.
4087 guest_base
= HOST_PAGE_ALIGN(guest_base
);
4089 if (reserved_va
|| have_guest_base
) {
4090 guest_base
= init_guest_space(guest_base
, reserved_va
, 0,
4092 if (guest_base
== (unsigned long)-1) {
4093 fprintf(stderr
, "Unable to reserve 0x%lx bytes of virtual address "
4094 "space for use as guest address space (check your virtual "
4095 "memory ulimit setting or reserve less using -R option)\n",
4101 mmap_next_start
= reserved_va
;
4106 * Read in mmap_min_addr kernel parameter. This value is used
4107 * When loading the ELF image to determine whether guest_base
4108 * is needed. It is also used in mmap_find_vma.
4113 if ((fp
= fopen("/proc/sys/vm/mmap_min_addr", "r")) != NULL
) {
4115 if (fscanf(fp
, "%lu", &tmp
) == 1) {
4116 mmap_min_addr
= tmp
;
4117 qemu_log_mask(CPU_LOG_PAGE
, "host mmap_min_addr=0x%lx\n", mmap_min_addr
);
4124 * Prepare copy of argv vector for target.
4126 target_argc
= argc
- optind
;
4127 target_argv
= calloc(target_argc
+ 1, sizeof (char *));
4128 if (target_argv
== NULL
) {
4129 (void) fprintf(stderr
, "Unable to allocate memory for target_argv\n");
4134 * If argv0 is specified (using '-0' switch) we replace
4135 * argv[0] pointer with the given one.
4138 if (argv0
!= NULL
) {
4139 target_argv
[i
++] = strdup(argv0
);
4141 for (; i
< target_argc
; i
++) {
4142 target_argv
[i
] = strdup(argv
[optind
+ i
]);
4144 target_argv
[target_argc
] = NULL
;
4146 ts
= g_new0(TaskState
, 1);
4147 init_task_state(ts
);
4148 /* build Task State */
4154 execfd
= qemu_getauxval(AT_EXECFD
);
4156 execfd
= open(filename
, O_RDONLY
);
4158 printf("Error while loading %s: %s\n", filename
, strerror(errno
));
4159 _exit(EXIT_FAILURE
);
4163 ret
= loader_exec(execfd
, filename
, target_argv
, target_environ
, regs
,
4166 printf("Error while loading %s: %s\n", filename
, strerror(-ret
));
4167 _exit(EXIT_FAILURE
);
4170 for (wrk
= target_environ
; *wrk
; wrk
++) {
4174 free(target_environ
);
4176 if (qemu_loglevel_mask(CPU_LOG_PAGE
)) {
4177 qemu_log("guest_base 0x%lx\n", guest_base
);
4180 qemu_log("start_brk 0x" TARGET_ABI_FMT_lx
"\n", info
->start_brk
);
4181 qemu_log("end_code 0x" TARGET_ABI_FMT_lx
"\n", info
->end_code
);
4182 qemu_log("start_code 0x" TARGET_ABI_FMT_lx
"\n",
4184 qemu_log("start_data 0x" TARGET_ABI_FMT_lx
"\n",
4186 qemu_log("end_data 0x" TARGET_ABI_FMT_lx
"\n", info
->end_data
);
4187 qemu_log("start_stack 0x" TARGET_ABI_FMT_lx
"\n",
4189 qemu_log("brk 0x" TARGET_ABI_FMT_lx
"\n", info
->brk
);
4190 qemu_log("entry 0x" TARGET_ABI_FMT_lx
"\n", info
->entry
);
4193 target_set_brk(info
->brk
);
4197 /* Now that we've loaded the binary, GUEST_BASE is fixed. Delay
4198 generating the prologue until now so that the prologue can take
4199 the real value of GUEST_BASE into account. */
4200 tcg_prologue_init(&tcg_ctx
);
4202 #if defined(TARGET_I386)
4203 env
->cr
[0] = CR0_PG_MASK
| CR0_WP_MASK
| CR0_PE_MASK
;
4204 env
->hflags
|= HF_PE_MASK
| HF_CPL_MASK
;
4205 if (env
->features
[FEAT_1_EDX
] & CPUID_SSE
) {
4206 env
->cr
[4] |= CR4_OSFXSR_MASK
;
4207 env
->hflags
|= HF_OSFXSR_MASK
;
4209 #ifndef TARGET_ABI32
4210 /* enable 64 bit mode if possible */
4211 if (!(env
->features
[FEAT_8000_0001_EDX
] & CPUID_EXT2_LM
)) {
4212 fprintf(stderr
, "The selected x86 CPU does not support 64 bit mode\n");
4215 env
->cr
[4] |= CR4_PAE_MASK
;
4216 env
->efer
|= MSR_EFER_LMA
| MSR_EFER_LME
;
4217 env
->hflags
|= HF_LMA_MASK
;
4220 /* flags setup : we activate the IRQs by default as in user mode */
4221 env
->eflags
|= IF_MASK
;
4223 /* linux register setup */
4224 #ifndef TARGET_ABI32
4225 env
->regs
[R_EAX
] = regs
->rax
;
4226 env
->regs
[R_EBX
] = regs
->rbx
;
4227 env
->regs
[R_ECX
] = regs
->rcx
;
4228 env
->regs
[R_EDX
] = regs
->rdx
;
4229 env
->regs
[R_ESI
] = regs
->rsi
;
4230 env
->regs
[R_EDI
] = regs
->rdi
;
4231 env
->regs
[R_EBP
] = regs
->rbp
;
4232 env
->regs
[R_ESP
] = regs
->rsp
;
4233 env
->eip
= regs
->rip
;
4235 env
->regs
[R_EAX
] = regs
->eax
;
4236 env
->regs
[R_EBX
] = regs
->ebx
;
4237 env
->regs
[R_ECX
] = regs
->ecx
;
4238 env
->regs
[R_EDX
] = regs
->edx
;
4239 env
->regs
[R_ESI
] = regs
->esi
;
4240 env
->regs
[R_EDI
] = regs
->edi
;
4241 env
->regs
[R_EBP
] = regs
->ebp
;
4242 env
->regs
[R_ESP
] = regs
->esp
;
4243 env
->eip
= regs
->eip
;
4246 /* linux interrupt setup */
4247 #ifndef TARGET_ABI32
4248 env
->idt
.limit
= 511;
4250 env
->idt
.limit
= 255;
4252 env
->idt
.base
= target_mmap(0, sizeof(uint64_t) * (env
->idt
.limit
+ 1),
4253 PROT_READ
|PROT_WRITE
,
4254 MAP_ANONYMOUS
|MAP_PRIVATE
, -1, 0);
4255 idt_table
= g2h(env
->idt
.base
);
4278 /* linux segment setup */
4280 uint64_t *gdt_table
;
4281 env
->gdt
.base
= target_mmap(0, sizeof(uint64_t) * TARGET_GDT_ENTRIES
,
4282 PROT_READ
|PROT_WRITE
,
4283 MAP_ANONYMOUS
|MAP_PRIVATE
, -1, 0);
4284 env
->gdt
.limit
= sizeof(uint64_t) * TARGET_GDT_ENTRIES
- 1;
4285 gdt_table
= g2h(env
->gdt
.base
);
4287 write_dt(&gdt_table
[__USER_CS
>> 3], 0, 0xfffff,
4288 DESC_G_MASK
| DESC_B_MASK
| DESC_P_MASK
| DESC_S_MASK
|
4289 (3 << DESC_DPL_SHIFT
) | (0xa << DESC_TYPE_SHIFT
));
4291 /* 64 bit code segment */
4292 write_dt(&gdt_table
[__USER_CS
>> 3], 0, 0xfffff,
4293 DESC_G_MASK
| DESC_B_MASK
| DESC_P_MASK
| DESC_S_MASK
|
4295 (3 << DESC_DPL_SHIFT
) | (0xa << DESC_TYPE_SHIFT
));
4297 write_dt(&gdt_table
[__USER_DS
>> 3], 0, 0xfffff,
4298 DESC_G_MASK
| DESC_B_MASK
| DESC_P_MASK
| DESC_S_MASK
|
4299 (3 << DESC_DPL_SHIFT
) | (0x2 << DESC_TYPE_SHIFT
));
4301 cpu_x86_load_seg(env
, R_CS
, __USER_CS
);
4302 cpu_x86_load_seg(env
, R_SS
, __USER_DS
);
4304 cpu_x86_load_seg(env
, R_DS
, __USER_DS
);
4305 cpu_x86_load_seg(env
, R_ES
, __USER_DS
);
4306 cpu_x86_load_seg(env
, R_FS
, __USER_DS
);
4307 cpu_x86_load_seg(env
, R_GS
, __USER_DS
);
4308 /* This hack makes Wine work... */
4309 env
->segs
[R_FS
].selector
= 0;
4311 cpu_x86_load_seg(env
, R_DS
, 0);
4312 cpu_x86_load_seg(env
, R_ES
, 0);
4313 cpu_x86_load_seg(env
, R_FS
, 0);
4314 cpu_x86_load_seg(env
, R_GS
, 0);
4316 #elif defined(TARGET_AARCH64)
4320 if (!(arm_feature(env
, ARM_FEATURE_AARCH64
))) {
4322 "The selected ARM CPU does not support 64 bit mode\n");
4326 for (i
= 0; i
< 31; i
++) {
4327 env
->xregs
[i
] = regs
->regs
[i
];
4330 env
->xregs
[31] = regs
->sp
;
4332 #elif defined(TARGET_ARM)
4335 cpsr_write(env
, regs
->uregs
[16], CPSR_USER
| CPSR_EXEC
,
4337 for(i
= 0; i
< 16; i
++) {
4338 env
->regs
[i
] = regs
->uregs
[i
];
4340 #ifdef TARGET_WORDS_BIGENDIAN
4342 if (EF_ARM_EABI_VERSION(info
->elf_flags
) >= EF_ARM_EABI_VER4
4343 && (info
->elf_flags
& EF_ARM_BE8
)) {
4344 env
->uncached_cpsr
|= CPSR_E
;
4345 env
->cp15
.sctlr_el
[1] |= SCTLR_E0E
;
4347 env
->cp15
.sctlr_el
[1] |= SCTLR_B
;
4351 #elif defined(TARGET_UNICORE32)
4354 cpu_asr_write(env
, regs
->uregs
[32], 0xffffffff);
4355 for (i
= 0; i
< 32; i
++) {
4356 env
->regs
[i
] = regs
->uregs
[i
];
4359 #elif defined(TARGET_SPARC)
4363 env
->npc
= regs
->npc
;
4365 for(i
= 0; i
< 8; i
++)
4366 env
->gregs
[i
] = regs
->u_regs
[i
];
4367 for(i
= 0; i
< 8; i
++)
4368 env
->regwptr
[i
] = regs
->u_regs
[i
+ 8];
4370 #elif defined(TARGET_PPC)
4374 #if defined(TARGET_PPC64)
4375 int flag
= (env
->insns_flags2
& PPC2_BOOKE206
) ? MSR_CM
: MSR_SF
;
4376 #if defined(TARGET_ABI32)
4377 env
->msr
&= ~((target_ulong
)1 << flag
);
4379 env
->msr
|= (target_ulong
)1 << flag
;
4382 env
->nip
= regs
->nip
;
4383 for(i
= 0; i
< 32; i
++) {
4384 env
->gpr
[i
] = regs
->gpr
[i
];
4387 #elif defined(TARGET_M68K)
4390 env
->dregs
[0] = regs
->d0
;
4391 env
->dregs
[1] = regs
->d1
;
4392 env
->dregs
[2] = regs
->d2
;
4393 env
->dregs
[3] = regs
->d3
;
4394 env
->dregs
[4] = regs
->d4
;
4395 env
->dregs
[5] = regs
->d5
;
4396 env
->dregs
[6] = regs
->d6
;
4397 env
->dregs
[7] = regs
->d7
;
4398 env
->aregs
[0] = regs
->a0
;
4399 env
->aregs
[1] = regs
->a1
;
4400 env
->aregs
[2] = regs
->a2
;
4401 env
->aregs
[3] = regs
->a3
;
4402 env
->aregs
[4] = regs
->a4
;
4403 env
->aregs
[5] = regs
->a5
;
4404 env
->aregs
[6] = regs
->a6
;
4405 env
->aregs
[7] = regs
->usp
;
4407 ts
->sim_syscalls
= 1;
4409 #elif defined(TARGET_MICROBLAZE)
4411 env
->regs
[0] = regs
->r0
;
4412 env
->regs
[1] = regs
->r1
;
4413 env
->regs
[2] = regs
->r2
;
4414 env
->regs
[3] = regs
->r3
;
4415 env
->regs
[4] = regs
->r4
;
4416 env
->regs
[5] = regs
->r5
;
4417 env
->regs
[6] = regs
->r6
;
4418 env
->regs
[7] = regs
->r7
;
4419 env
->regs
[8] = regs
->r8
;
4420 env
->regs
[9] = regs
->r9
;
4421 env
->regs
[10] = regs
->r10
;
4422 env
->regs
[11] = regs
->r11
;
4423 env
->regs
[12] = regs
->r12
;
4424 env
->regs
[13] = regs
->r13
;
4425 env
->regs
[14] = regs
->r14
;
4426 env
->regs
[15] = regs
->r15
;
4427 env
->regs
[16] = regs
->r16
;
4428 env
->regs
[17] = regs
->r17
;
4429 env
->regs
[18] = regs
->r18
;
4430 env
->regs
[19] = regs
->r19
;
4431 env
->regs
[20] = regs
->r20
;
4432 env
->regs
[21] = regs
->r21
;
4433 env
->regs
[22] = regs
->r22
;
4434 env
->regs
[23] = regs
->r23
;
4435 env
->regs
[24] = regs
->r24
;
4436 env
->regs
[25] = regs
->r25
;
4437 env
->regs
[26] = regs
->r26
;
4438 env
->regs
[27] = regs
->r27
;
4439 env
->regs
[28] = regs
->r28
;
4440 env
->regs
[29] = regs
->r29
;
4441 env
->regs
[30] = regs
->r30
;
4442 env
->regs
[31] = regs
->r31
;
4443 env
->sregs
[SR_PC
] = regs
->pc
;
4445 #elif defined(TARGET_MIPS)
4449 for(i
= 0; i
< 32; i
++) {
4450 env
->active_tc
.gpr
[i
] = regs
->regs
[i
];
4452 env
->active_tc
.PC
= regs
->cp0_epc
& ~(target_ulong
)1;
4453 if (regs
->cp0_epc
& 1) {
4454 env
->hflags
|= MIPS_HFLAG_M16
;
4456 if (((info
->elf_flags
& EF_MIPS_NAN2008
) != 0) !=
4457 ((env
->active_fpu
.fcr31
& (1 << FCR31_NAN2008
)) != 0)) {
4458 if ((env
->active_fpu
.fcr31_rw_bitmask
&
4459 (1 << FCR31_NAN2008
)) == 0) {
4460 fprintf(stderr
, "ELF binary's NaN mode not supported by CPU\n");
4463 if ((info
->elf_flags
& EF_MIPS_NAN2008
) != 0) {
4464 env
->active_fpu
.fcr31
|= (1 << FCR31_NAN2008
);
4466 env
->active_fpu
.fcr31
&= ~(1 << FCR31_NAN2008
);
4468 restore_snan_bit_mode(env
);
4471 #elif defined(TARGET_OPENRISC)
4475 for (i
= 0; i
< 32; i
++) {
4476 env
->gpr
[i
] = regs
->gpr
[i
];
4482 #elif defined(TARGET_SH4)
4486 for(i
= 0; i
< 16; i
++) {
4487 env
->gregs
[i
] = regs
->regs
[i
];
4491 #elif defined(TARGET_ALPHA)
4495 for(i
= 0; i
< 28; i
++) {
4496 env
->ir
[i
] = ((abi_ulong
*)regs
)[i
];
4498 env
->ir
[IR_SP
] = regs
->usp
;
4501 #elif defined(TARGET_CRIS)
4503 env
->regs
[0] = regs
->r0
;
4504 env
->regs
[1] = regs
->r1
;
4505 env
->regs
[2] = regs
->r2
;
4506 env
->regs
[3] = regs
->r3
;
4507 env
->regs
[4] = regs
->r4
;
4508 env
->regs
[5] = regs
->r5
;
4509 env
->regs
[6] = regs
->r6
;
4510 env
->regs
[7] = regs
->r7
;
4511 env
->regs
[8] = regs
->r8
;
4512 env
->regs
[9] = regs
->r9
;
4513 env
->regs
[10] = regs
->r10
;
4514 env
->regs
[11] = regs
->r11
;
4515 env
->regs
[12] = regs
->r12
;
4516 env
->regs
[13] = regs
->r13
;
4517 env
->regs
[14] = info
->start_stack
;
4518 env
->regs
[15] = regs
->acr
;
4519 env
->pc
= regs
->erp
;
4521 #elif defined(TARGET_S390X)
4524 for (i
= 0; i
< 16; i
++) {
4525 env
->regs
[i
] = regs
->gprs
[i
];
4527 env
->psw
.mask
= regs
->psw
.mask
;
4528 env
->psw
.addr
= regs
->psw
.addr
;
4530 #elif defined(TARGET_TILEGX)
4533 for (i
= 0; i
< TILEGX_R_COUNT
; i
++) {
4534 env
->regs
[i
] = regs
->regs
[i
];
4536 for (i
= 0; i
< TILEGX_SPR_COUNT
; i
++) {
4542 #error unsupported target CPU
4545 #if defined(TARGET_ARM) || defined(TARGET_M68K) || defined(TARGET_UNICORE32)
4546 ts
->stack_base
= info
->start_stack
;
4547 ts
->heap_base
= info
->brk
;
4548 /* This will be filled in on the first SYS_HEAPINFO call. */
4553 if (gdbserver_start(gdbstub_port
) < 0) {
4554 fprintf(stderr
, "qemu: could not open gdbserver on port %d\n",
4558 gdb_handlesig(cpu
, 0);