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
);
779 * Handle AArch64 store-release exclusive
781 * rs = gets the status result of store exclusive
782 * rt = is the register that is stored
783 * rt2 = is the second register store (in STP)
786 static int do_strex_a64(CPUARMState
*env
)
797 /* size | is_pair << 2 | (rs << 4) | (rt << 9) | (rt2 << 14)); */
798 size
= extract32(env
->exclusive_info
, 0, 2);
799 is_pair
= extract32(env
->exclusive_info
, 2, 1);
800 rs
= extract32(env
->exclusive_info
, 4, 5);
801 rt
= extract32(env
->exclusive_info
, 9, 5);
802 rt2
= extract32(env
->exclusive_info
, 14, 5);
804 addr
= env
->exclusive_addr
;
806 if (addr
!= env
->exclusive_test
) {
812 segv
= get_user_u8(val
, addr
);
815 segv
= get_user_u16(val
, addr
);
818 segv
= get_user_u32(val
, addr
);
821 segv
= get_user_u64(val
, addr
);
827 env
->exception
.vaddress
= addr
;
830 if (val
!= env
->exclusive_val
) {
835 segv
= get_user_u32(val
, addr
+ 4);
837 segv
= get_user_u64(val
, addr
+ 8);
840 env
->exception
.vaddress
= addr
+ (size
== 2 ? 4 : 8);
843 if (val
!= env
->exclusive_high
) {
847 /* handle the zero register */
848 val
= rt
== 31 ? 0 : env
->xregs
[rt
];
851 segv
= put_user_u8(val
, addr
);
854 segv
= put_user_u16(val
, addr
);
857 segv
= put_user_u32(val
, addr
);
860 segv
= put_user_u64(val
, addr
);
867 /* handle the zero register */
868 val
= rt2
== 31 ? 0 : env
->xregs
[rt2
];
870 segv
= put_user_u32(val
, addr
+ 4);
872 segv
= put_user_u64(val
, addr
+ 8);
875 env
->exception
.vaddress
= addr
+ (size
== 2 ? 4 : 8);
882 /* rs == 31 encodes a write to the ZR, thus throwing away
883 * the status return. This is rather silly but valid.
889 /* instruction faulted, PC does not advance */
890 /* either way a strex releases any exclusive lock we have */
891 env
->exclusive_addr
= -1;
896 /* AArch64 main loop */
897 void cpu_loop(CPUARMState
*env
)
899 CPUState
*cs
= CPU(arm_env_get_cpu(env
));
902 target_siginfo_t info
;
906 trapnr
= cpu_exec(cs
);
908 process_queued_cpu_work(cs
);
912 ret
= do_syscall(env
,
921 if (ret
== -TARGET_ERESTARTSYS
) {
923 } else if (ret
!= -TARGET_QEMU_ESIGRETURN
) {
928 /* just indicate that signals should be handled asap */
931 info
.si_signo
= TARGET_SIGILL
;
933 info
.si_code
= TARGET_ILL_ILLOPN
;
934 info
._sifields
._sigfault
._addr
= env
->pc
;
935 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
938 if (!do_strex_a64(env
)) {
941 /* fall through for segv */
942 case EXCP_PREFETCH_ABORT
:
943 case EXCP_DATA_ABORT
:
944 info
.si_signo
= TARGET_SIGSEGV
;
946 /* XXX: check env->error_code */
947 info
.si_code
= TARGET_SEGV_MAPERR
;
948 info
._sifields
._sigfault
._addr
= env
->exception
.vaddress
;
949 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
953 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
957 info
.si_code
= TARGET_TRAP_BRKPT
;
958 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
962 env
->xregs
[0] = do_arm_semihosting(env
);
965 /* nothing to do here for user-mode, just resume guest code */
968 cpu_exec_step_atomic(cs
);
971 EXCP_DUMP(env
, "qemu: unhandled CPU exception 0x%x - aborting\n", trapnr
);
974 process_pending_signals(env
);
975 /* Exception return on AArch64 always clears the exclusive monitor,
976 * so any return to running guest code implies this.
977 * A strex (successful or otherwise) also clears the monitor, so
978 * we don't need to specialcase EXCP_STREX.
980 env
->exclusive_addr
= -1;
983 #endif /* ndef TARGET_ABI32 */
987 #ifdef TARGET_UNICORE32
989 void cpu_loop(CPUUniCore32State
*env
)
991 CPUState
*cs
= CPU(uc32_env_get_cpu(env
));
993 unsigned int n
, insn
;
994 target_siginfo_t info
;
998 trapnr
= cpu_exec(cs
);
1000 process_queued_cpu_work(cs
);
1003 case UC32_EXCP_PRIV
:
1006 get_user_u32(insn
, env
->regs
[31] - 4);
1007 n
= insn
& 0xffffff;
1009 if (n
>= UC32_SYSCALL_BASE
) {
1011 n
-= UC32_SYSCALL_BASE
;
1012 if (n
== UC32_SYSCALL_NR_set_tls
) {
1013 cpu_set_tls(env
, env
->regs
[0]);
1016 abi_long ret
= do_syscall(env
,
1025 if (ret
== -TARGET_ERESTARTSYS
) {
1027 } else if (ret
!= -TARGET_QEMU_ESIGRETURN
) {
1036 case UC32_EXCP_DTRAP
:
1037 case UC32_EXCP_ITRAP
:
1038 info
.si_signo
= TARGET_SIGSEGV
;
1040 /* XXX: check env->error_code */
1041 info
.si_code
= TARGET_SEGV_MAPERR
;
1042 info
._sifields
._sigfault
._addr
= env
->cp0
.c4_faultaddr
;
1043 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
1045 case EXCP_INTERRUPT
:
1046 /* just indicate that signals should be handled asap */
1052 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
1054 info
.si_signo
= sig
;
1056 info
.si_code
= TARGET_TRAP_BRKPT
;
1057 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
1062 cpu_exec_step_atomic(cs
);
1067 process_pending_signals(env
);
1071 EXCP_DUMP(env
, "qemu: unhandled CPU exception 0x%x - aborting\n", trapnr
);
1077 #define SPARC64_STACK_BIAS 2047
1081 /* WARNING: dealing with register windows _is_ complicated. More info
1082 can be found at http://www.sics.se/~psm/sparcstack.html */
1083 static inline int get_reg_index(CPUSPARCState
*env
, int cwp
, int index
)
1085 index
= (index
+ cwp
* 16) % (16 * env
->nwindows
);
1086 /* wrap handling : if cwp is on the last window, then we use the
1087 registers 'after' the end */
1088 if (index
< 8 && env
->cwp
== env
->nwindows
- 1)
1089 index
+= 16 * env
->nwindows
;
1093 /* save the register window 'cwp1' */
1094 static inline void save_window_offset(CPUSPARCState
*env
, int cwp1
)
1099 sp_ptr
= env
->regbase
[get_reg_index(env
, cwp1
, 6)];
1100 #ifdef TARGET_SPARC64
1102 sp_ptr
+= SPARC64_STACK_BIAS
;
1104 #if defined(DEBUG_WIN)
1105 printf("win_overflow: sp_ptr=0x" TARGET_ABI_FMT_lx
" save_cwp=%d\n",
1108 for(i
= 0; i
< 16; i
++) {
1109 /* FIXME - what to do if put_user() fails? */
1110 put_user_ual(env
->regbase
[get_reg_index(env
, cwp1
, 8 + i
)], sp_ptr
);
1111 sp_ptr
+= sizeof(abi_ulong
);
1115 static void save_window(CPUSPARCState
*env
)
1117 #ifndef TARGET_SPARC64
1118 unsigned int new_wim
;
1119 new_wim
= ((env
->wim
>> 1) | (env
->wim
<< (env
->nwindows
- 1))) &
1120 ((1LL << env
->nwindows
) - 1);
1121 save_window_offset(env
, cpu_cwp_dec(env
, env
->cwp
- 2));
1124 save_window_offset(env
, cpu_cwp_dec(env
, env
->cwp
- 2));
1130 static void restore_window(CPUSPARCState
*env
)
1132 #ifndef TARGET_SPARC64
1133 unsigned int new_wim
;
1135 unsigned int i
, cwp1
;
1138 #ifndef TARGET_SPARC64
1139 new_wim
= ((env
->wim
<< 1) | (env
->wim
>> (env
->nwindows
- 1))) &
1140 ((1LL << env
->nwindows
) - 1);
1143 /* restore the invalid window */
1144 cwp1
= cpu_cwp_inc(env
, env
->cwp
+ 1);
1145 sp_ptr
= env
->regbase
[get_reg_index(env
, cwp1
, 6)];
1146 #ifdef TARGET_SPARC64
1148 sp_ptr
+= SPARC64_STACK_BIAS
;
1150 #if defined(DEBUG_WIN)
1151 printf("win_underflow: sp_ptr=0x" TARGET_ABI_FMT_lx
" load_cwp=%d\n",
1154 for(i
= 0; i
< 16; i
++) {
1155 /* FIXME - what to do if get_user() fails? */
1156 get_user_ual(env
->regbase
[get_reg_index(env
, cwp1
, 8 + i
)], sp_ptr
);
1157 sp_ptr
+= sizeof(abi_ulong
);
1159 #ifdef TARGET_SPARC64
1161 if (env
->cleanwin
< env
->nwindows
- 1)
1169 static void flush_windows(CPUSPARCState
*env
)
1175 /* if restore would invoke restore_window(), then we can stop */
1176 cwp1
= cpu_cwp_inc(env
, env
->cwp
+ offset
);
1177 #ifndef TARGET_SPARC64
1178 if (env
->wim
& (1 << cwp1
))
1181 if (env
->canrestore
== 0)
1186 save_window_offset(env
, cwp1
);
1189 cwp1
= cpu_cwp_inc(env
, env
->cwp
+ 1);
1190 #ifndef TARGET_SPARC64
1191 /* set wim so that restore will reload the registers */
1192 env
->wim
= 1 << cwp1
;
1194 #if defined(DEBUG_WIN)
1195 printf("flush_windows: nb=%d\n", offset
- 1);
1199 void cpu_loop (CPUSPARCState
*env
)
1201 CPUState
*cs
= CPU(sparc_env_get_cpu(env
));
1204 target_siginfo_t info
;
1208 trapnr
= cpu_exec(cs
);
1210 process_queued_cpu_work(cs
);
1212 /* Compute PSR before exposing state. */
1213 if (env
->cc_op
!= CC_OP_FLAGS
) {
1218 #ifndef TARGET_SPARC64
1225 ret
= do_syscall (env
, env
->gregs
[1],
1226 env
->regwptr
[0], env
->regwptr
[1],
1227 env
->regwptr
[2], env
->regwptr
[3],
1228 env
->regwptr
[4], env
->regwptr
[5],
1230 if (ret
== -TARGET_ERESTARTSYS
|| ret
== -TARGET_QEMU_ESIGRETURN
) {
1233 if ((abi_ulong
)ret
>= (abi_ulong
)(-515)) {
1234 #if defined(TARGET_SPARC64) && !defined(TARGET_ABI32)
1235 env
->xcc
|= PSR_CARRY
;
1237 env
->psr
|= PSR_CARRY
;
1241 #if defined(TARGET_SPARC64) && !defined(TARGET_ABI32)
1242 env
->xcc
&= ~PSR_CARRY
;
1244 env
->psr
&= ~PSR_CARRY
;
1247 env
->regwptr
[0] = ret
;
1248 /* next instruction */
1250 env
->npc
= env
->npc
+ 4;
1252 case 0x83: /* flush windows */
1257 /* next instruction */
1259 env
->npc
= env
->npc
+ 4;
1261 #ifndef TARGET_SPARC64
1262 case TT_WIN_OVF
: /* window overflow */
1265 case TT_WIN_UNF
: /* window underflow */
1266 restore_window(env
);
1271 info
.si_signo
= TARGET_SIGSEGV
;
1273 /* XXX: check env->error_code */
1274 info
.si_code
= TARGET_SEGV_MAPERR
;
1275 info
._sifields
._sigfault
._addr
= env
->mmuregs
[4];
1276 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
1280 case TT_SPILL
: /* window overflow */
1283 case TT_FILL
: /* window underflow */
1284 restore_window(env
);
1289 info
.si_signo
= TARGET_SIGSEGV
;
1291 /* XXX: check env->error_code */
1292 info
.si_code
= TARGET_SEGV_MAPERR
;
1293 if (trapnr
== TT_DFAULT
)
1294 info
._sifields
._sigfault
._addr
= env
->dmmuregs
[4];
1296 info
._sifields
._sigfault
._addr
= cpu_tsptr(env
)->tpc
;
1297 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
1300 #ifndef TARGET_ABI32
1303 sparc64_get_context(env
);
1307 sparc64_set_context(env
);
1311 case EXCP_INTERRUPT
:
1312 /* just indicate that signals should be handled asap */
1316 info
.si_signo
= TARGET_SIGILL
;
1318 info
.si_code
= TARGET_ILL_ILLOPC
;
1319 info
._sifields
._sigfault
._addr
= env
->pc
;
1320 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
1327 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
1330 info
.si_signo
= sig
;
1332 info
.si_code
= TARGET_TRAP_BRKPT
;
1333 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
1338 cpu_exec_step_atomic(cs
);
1341 printf ("Unhandled trap: 0x%x\n", trapnr
);
1342 cpu_dump_state(cs
, stderr
, fprintf
, 0);
1345 process_pending_signals (env
);
1352 static inline uint64_t cpu_ppc_get_tb(CPUPPCState
*env
)
1354 return cpu_get_host_ticks();
1357 uint64_t cpu_ppc_load_tbl(CPUPPCState
*env
)
1359 return cpu_ppc_get_tb(env
);
1362 uint32_t cpu_ppc_load_tbu(CPUPPCState
*env
)
1364 return cpu_ppc_get_tb(env
) >> 32;
1367 uint64_t cpu_ppc_load_atbl(CPUPPCState
*env
)
1369 return cpu_ppc_get_tb(env
);
1372 uint32_t cpu_ppc_load_atbu(CPUPPCState
*env
)
1374 return cpu_ppc_get_tb(env
) >> 32;
1377 uint32_t cpu_ppc601_load_rtcu(CPUPPCState
*env
)
1378 __attribute__ (( alias ("cpu_ppc_load_tbu") ));
1380 uint32_t cpu_ppc601_load_rtcl(CPUPPCState
*env
)
1382 return cpu_ppc_load_tbl(env
) & 0x3FFFFF80;
1385 /* XXX: to be fixed */
1386 int ppc_dcr_read (ppc_dcr_t
*dcr_env
, int dcrn
, uint32_t *valp
)
1391 int ppc_dcr_write (ppc_dcr_t
*dcr_env
, int dcrn
, uint32_t val
)
1396 static int do_store_exclusive(CPUPPCState
*env
)
1399 target_ulong page_addr
;
1400 target_ulong val
, val2
__attribute__((unused
)) = 0;
1404 addr
= env
->reserve_ea
;
1405 page_addr
= addr
& TARGET_PAGE_MASK
;
1408 flags
= page_get_flags(page_addr
);
1409 if ((flags
& PAGE_READ
) == 0) {
1412 int reg
= env
->reserve_info
& 0x1f;
1413 int size
= env
->reserve_info
>> 5;
1416 if (addr
== env
->reserve_addr
) {
1418 case 1: segv
= get_user_u8(val
, addr
); break;
1419 case 2: segv
= get_user_u16(val
, addr
); break;
1420 case 4: segv
= get_user_u32(val
, addr
); break;
1421 #if defined(TARGET_PPC64)
1422 case 8: segv
= get_user_u64(val
, addr
); break;
1424 segv
= get_user_u64(val
, addr
);
1426 segv
= get_user_u64(val2
, addr
+ 8);
1433 if (!segv
&& val
== env
->reserve_val
) {
1434 val
= env
->gpr
[reg
];
1436 case 1: segv
= put_user_u8(val
, addr
); break;
1437 case 2: segv
= put_user_u16(val
, addr
); break;
1438 case 4: segv
= put_user_u32(val
, addr
); break;
1439 #if defined(TARGET_PPC64)
1440 case 8: segv
= put_user_u64(val
, addr
); break;
1442 if (val2
== env
->reserve_val2
) {
1445 val
= env
->gpr
[reg
+1];
1447 val2
= env
->gpr
[reg
+1];
1449 segv
= put_user_u64(val
, addr
);
1451 segv
= put_user_u64(val2
, addr
+ 8);
1464 env
->crf
[0] = (stored
<< 1) | xer_so
;
1465 env
->reserve_addr
= (target_ulong
)-1;
1475 void cpu_loop(CPUPPCState
*env
)
1477 CPUState
*cs
= CPU(ppc_env_get_cpu(env
));
1478 target_siginfo_t info
;
1484 trapnr
= cpu_exec(cs
);
1486 process_queued_cpu_work(cs
);
1489 case POWERPC_EXCP_NONE
:
1492 case POWERPC_EXCP_CRITICAL
: /* Critical input */
1493 cpu_abort(cs
, "Critical interrupt while in user mode. "
1496 case POWERPC_EXCP_MCHECK
: /* Machine check exception */
1497 cpu_abort(cs
, "Machine check exception while in user mode. "
1500 case POWERPC_EXCP_DSI
: /* Data storage exception */
1501 /* XXX: check this. Seems bugged */
1502 switch (env
->error_code
& 0xFF000000) {
1505 info
.si_signo
= TARGET_SIGSEGV
;
1507 info
.si_code
= TARGET_SEGV_MAPERR
;
1510 info
.si_signo
= TARGET_SIGILL
;
1512 info
.si_code
= TARGET_ILL_ILLADR
;
1515 info
.si_signo
= TARGET_SIGSEGV
;
1517 info
.si_code
= TARGET_SEGV_ACCERR
;
1520 /* Let's send a regular segfault... */
1521 EXCP_DUMP(env
, "Invalid segfault errno (%02x)\n",
1523 info
.si_signo
= TARGET_SIGSEGV
;
1525 info
.si_code
= TARGET_SEGV_MAPERR
;
1528 info
._sifields
._sigfault
._addr
= env
->nip
;
1529 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
1531 case POWERPC_EXCP_ISI
: /* Instruction storage exception */
1532 /* XXX: check this */
1533 switch (env
->error_code
& 0xFF000000) {
1535 info
.si_signo
= TARGET_SIGSEGV
;
1537 info
.si_code
= TARGET_SEGV_MAPERR
;
1541 info
.si_signo
= TARGET_SIGSEGV
;
1543 info
.si_code
= TARGET_SEGV_ACCERR
;
1546 /* Let's send a regular segfault... */
1547 EXCP_DUMP(env
, "Invalid segfault errno (%02x)\n",
1549 info
.si_signo
= TARGET_SIGSEGV
;
1551 info
.si_code
= TARGET_SEGV_MAPERR
;
1554 info
._sifields
._sigfault
._addr
= env
->nip
- 4;
1555 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
1557 case POWERPC_EXCP_EXTERNAL
: /* External input */
1558 cpu_abort(cs
, "External interrupt while in user mode. "
1561 case POWERPC_EXCP_ALIGN
: /* Alignment exception */
1562 /* XXX: check this */
1563 info
.si_signo
= TARGET_SIGBUS
;
1565 info
.si_code
= TARGET_BUS_ADRALN
;
1566 info
._sifields
._sigfault
._addr
= env
->nip
;
1567 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
1569 case POWERPC_EXCP_PROGRAM
: /* Program exception */
1570 case POWERPC_EXCP_HV_EMU
: /* HV emulation */
1571 /* XXX: check this */
1572 switch (env
->error_code
& ~0xF) {
1573 case POWERPC_EXCP_FP
:
1574 info
.si_signo
= TARGET_SIGFPE
;
1576 switch (env
->error_code
& 0xF) {
1577 case POWERPC_EXCP_FP_OX
:
1578 info
.si_code
= TARGET_FPE_FLTOVF
;
1580 case POWERPC_EXCP_FP_UX
:
1581 info
.si_code
= TARGET_FPE_FLTUND
;
1583 case POWERPC_EXCP_FP_ZX
:
1584 case POWERPC_EXCP_FP_VXZDZ
:
1585 info
.si_code
= TARGET_FPE_FLTDIV
;
1587 case POWERPC_EXCP_FP_XX
:
1588 info
.si_code
= TARGET_FPE_FLTRES
;
1590 case POWERPC_EXCP_FP_VXSOFT
:
1591 info
.si_code
= TARGET_FPE_FLTINV
;
1593 case POWERPC_EXCP_FP_VXSNAN
:
1594 case POWERPC_EXCP_FP_VXISI
:
1595 case POWERPC_EXCP_FP_VXIDI
:
1596 case POWERPC_EXCP_FP_VXIMZ
:
1597 case POWERPC_EXCP_FP_VXVC
:
1598 case POWERPC_EXCP_FP_VXSQRT
:
1599 case POWERPC_EXCP_FP_VXCVI
:
1600 info
.si_code
= TARGET_FPE_FLTSUB
;
1603 EXCP_DUMP(env
, "Unknown floating point exception (%02x)\n",
1608 case POWERPC_EXCP_INVAL
:
1609 info
.si_signo
= TARGET_SIGILL
;
1611 switch (env
->error_code
& 0xF) {
1612 case POWERPC_EXCP_INVAL_INVAL
:
1613 info
.si_code
= TARGET_ILL_ILLOPC
;
1615 case POWERPC_EXCP_INVAL_LSWX
:
1616 info
.si_code
= TARGET_ILL_ILLOPN
;
1618 case POWERPC_EXCP_INVAL_SPR
:
1619 info
.si_code
= TARGET_ILL_PRVREG
;
1621 case POWERPC_EXCP_INVAL_FP
:
1622 info
.si_code
= TARGET_ILL_COPROC
;
1625 EXCP_DUMP(env
, "Unknown invalid operation (%02x)\n",
1626 env
->error_code
& 0xF);
1627 info
.si_code
= TARGET_ILL_ILLADR
;
1631 case POWERPC_EXCP_PRIV
:
1632 info
.si_signo
= TARGET_SIGILL
;
1634 switch (env
->error_code
& 0xF) {
1635 case POWERPC_EXCP_PRIV_OPC
:
1636 info
.si_code
= TARGET_ILL_PRVOPC
;
1638 case POWERPC_EXCP_PRIV_REG
:
1639 info
.si_code
= TARGET_ILL_PRVREG
;
1642 EXCP_DUMP(env
, "Unknown privilege violation (%02x)\n",
1643 env
->error_code
& 0xF);
1644 info
.si_code
= TARGET_ILL_PRVOPC
;
1648 case POWERPC_EXCP_TRAP
:
1649 cpu_abort(cs
, "Tried to call a TRAP\n");
1652 /* Should not happen ! */
1653 cpu_abort(cs
, "Unknown program exception (%02x)\n",
1657 info
._sifields
._sigfault
._addr
= env
->nip
;
1658 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
1660 case POWERPC_EXCP_FPU
: /* Floating-point unavailable exception */
1661 info
.si_signo
= TARGET_SIGILL
;
1663 info
.si_code
= TARGET_ILL_COPROC
;
1664 info
._sifields
._sigfault
._addr
= env
->nip
;
1665 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
1667 case POWERPC_EXCP_SYSCALL
: /* System call exception */
1668 cpu_abort(cs
, "Syscall exception while in user mode. "
1671 case POWERPC_EXCP_APU
: /* Auxiliary processor unavailable */
1672 info
.si_signo
= TARGET_SIGILL
;
1674 info
.si_code
= TARGET_ILL_COPROC
;
1675 info
._sifields
._sigfault
._addr
= env
->nip
;
1676 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
1678 case POWERPC_EXCP_DECR
: /* Decrementer exception */
1679 cpu_abort(cs
, "Decrementer interrupt while in user mode. "
1682 case POWERPC_EXCP_FIT
: /* Fixed-interval timer interrupt */
1683 cpu_abort(cs
, "Fix interval timer interrupt while in user mode. "
1686 case POWERPC_EXCP_WDT
: /* Watchdog timer interrupt */
1687 cpu_abort(cs
, "Watchdog timer interrupt while in user mode. "
1690 case POWERPC_EXCP_DTLB
: /* Data TLB error */
1691 cpu_abort(cs
, "Data TLB exception while in user mode. "
1694 case POWERPC_EXCP_ITLB
: /* Instruction TLB error */
1695 cpu_abort(cs
, "Instruction TLB exception while in user mode. "
1698 case POWERPC_EXCP_SPEU
: /* SPE/embedded floating-point unavail. */
1699 info
.si_signo
= TARGET_SIGILL
;
1701 info
.si_code
= TARGET_ILL_COPROC
;
1702 info
._sifields
._sigfault
._addr
= env
->nip
;
1703 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
1705 case POWERPC_EXCP_EFPDI
: /* Embedded floating-point data IRQ */
1706 cpu_abort(cs
, "Embedded floating-point data IRQ not handled\n");
1708 case POWERPC_EXCP_EFPRI
: /* Embedded floating-point round IRQ */
1709 cpu_abort(cs
, "Embedded floating-point round IRQ not handled\n");
1711 case POWERPC_EXCP_EPERFM
: /* Embedded performance monitor IRQ */
1712 cpu_abort(cs
, "Performance monitor exception not handled\n");
1714 case POWERPC_EXCP_DOORI
: /* Embedded doorbell interrupt */
1715 cpu_abort(cs
, "Doorbell interrupt while in user mode. "
1718 case POWERPC_EXCP_DOORCI
: /* Embedded doorbell critical interrupt */
1719 cpu_abort(cs
, "Doorbell critical interrupt while in user mode. "
1722 case POWERPC_EXCP_RESET
: /* System reset exception */
1723 cpu_abort(cs
, "Reset interrupt while in user mode. "
1726 case POWERPC_EXCP_DSEG
: /* Data segment exception */
1727 cpu_abort(cs
, "Data segment exception while in user mode. "
1730 case POWERPC_EXCP_ISEG
: /* Instruction segment exception */
1731 cpu_abort(cs
, "Instruction segment exception "
1732 "while in user mode. Aborting\n");
1734 /* PowerPC 64 with hypervisor mode support */
1735 case POWERPC_EXCP_HDECR
: /* Hypervisor decrementer exception */
1736 cpu_abort(cs
, "Hypervisor decrementer interrupt "
1737 "while in user mode. Aborting\n");
1739 case POWERPC_EXCP_TRACE
: /* Trace exception */
1741 * we use this exception to emulate step-by-step execution mode.
1744 /* PowerPC 64 with hypervisor mode support */
1745 case POWERPC_EXCP_HDSI
: /* Hypervisor data storage exception */
1746 cpu_abort(cs
, "Hypervisor data storage exception "
1747 "while in user mode. Aborting\n");
1749 case POWERPC_EXCP_HISI
: /* Hypervisor instruction storage excp */
1750 cpu_abort(cs
, "Hypervisor instruction storage exception "
1751 "while in user mode. Aborting\n");
1753 case POWERPC_EXCP_HDSEG
: /* Hypervisor data segment exception */
1754 cpu_abort(cs
, "Hypervisor data segment exception "
1755 "while in user mode. Aborting\n");
1757 case POWERPC_EXCP_HISEG
: /* Hypervisor instruction segment excp */
1758 cpu_abort(cs
, "Hypervisor instruction segment exception "
1759 "while in user mode. Aborting\n");
1761 case POWERPC_EXCP_VPU
: /* Vector unavailable exception */
1762 info
.si_signo
= TARGET_SIGILL
;
1764 info
.si_code
= TARGET_ILL_COPROC
;
1765 info
._sifields
._sigfault
._addr
= env
->nip
;
1766 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
1768 case POWERPC_EXCP_PIT
: /* Programmable interval timer IRQ */
1769 cpu_abort(cs
, "Programmable interval timer interrupt "
1770 "while in user mode. Aborting\n");
1772 case POWERPC_EXCP_IO
: /* IO error exception */
1773 cpu_abort(cs
, "IO error exception while in user mode. "
1776 case POWERPC_EXCP_RUNM
: /* Run mode exception */
1777 cpu_abort(cs
, "Run mode exception while in user mode. "
1780 case POWERPC_EXCP_EMUL
: /* Emulation trap exception */
1781 cpu_abort(cs
, "Emulation trap exception not handled\n");
1783 case POWERPC_EXCP_IFTLB
: /* Instruction fetch TLB error */
1784 cpu_abort(cs
, "Instruction fetch TLB exception "
1785 "while in user-mode. Aborting");
1787 case POWERPC_EXCP_DLTLB
: /* Data load TLB miss */
1788 cpu_abort(cs
, "Data load TLB exception while in user-mode. "
1791 case POWERPC_EXCP_DSTLB
: /* Data store TLB miss */
1792 cpu_abort(cs
, "Data store TLB exception while in user-mode. "
1795 case POWERPC_EXCP_FPA
: /* Floating-point assist exception */
1796 cpu_abort(cs
, "Floating-point assist exception not handled\n");
1798 case POWERPC_EXCP_IABR
: /* Instruction address breakpoint */
1799 cpu_abort(cs
, "Instruction address breakpoint exception "
1802 case POWERPC_EXCP_SMI
: /* System management interrupt */
1803 cpu_abort(cs
, "System management interrupt while in user mode. "
1806 case POWERPC_EXCP_THERM
: /* Thermal interrupt */
1807 cpu_abort(cs
, "Thermal interrupt interrupt while in user mode. "
1810 case POWERPC_EXCP_PERFM
: /* Embedded performance monitor IRQ */
1811 cpu_abort(cs
, "Performance monitor exception not handled\n");
1813 case POWERPC_EXCP_VPUA
: /* Vector assist exception */
1814 cpu_abort(cs
, "Vector assist exception not handled\n");
1816 case POWERPC_EXCP_SOFTP
: /* Soft patch exception */
1817 cpu_abort(cs
, "Soft patch exception not handled\n");
1819 case POWERPC_EXCP_MAINT
: /* Maintenance exception */
1820 cpu_abort(cs
, "Maintenance exception while in user mode. "
1823 case POWERPC_EXCP_STOP
: /* stop translation */
1824 /* We did invalidate the instruction cache. Go on */
1826 case POWERPC_EXCP_BRANCH
: /* branch instruction: */
1827 /* We just stopped because of a branch. Go on */
1829 case POWERPC_EXCP_SYSCALL_USER
:
1830 /* system call in user-mode emulation */
1832 * PPC ABI uses overflow flag in cr0 to signal an error
1835 env
->crf
[0] &= ~0x1;
1836 ret
= do_syscall(env
, env
->gpr
[0], env
->gpr
[3], env
->gpr
[4],
1837 env
->gpr
[5], env
->gpr
[6], env
->gpr
[7],
1839 if (ret
== -TARGET_ERESTARTSYS
) {
1842 if (ret
== (target_ulong
)(-TARGET_QEMU_ESIGRETURN
)) {
1843 /* Returning from a successful sigreturn syscall.
1844 Avoid corrupting register state. */
1848 if (ret
> (target_ulong
)(-515)) {
1854 case POWERPC_EXCP_STCX
:
1855 if (do_store_exclusive(env
)) {
1856 info
.si_signo
= TARGET_SIGSEGV
;
1858 info
.si_code
= TARGET_SEGV_MAPERR
;
1859 info
._sifields
._sigfault
._addr
= env
->nip
;
1860 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
1867 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
1869 info
.si_signo
= sig
;
1871 info
.si_code
= TARGET_TRAP_BRKPT
;
1872 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
1876 case EXCP_INTERRUPT
:
1877 /* just indicate that signals should be handled asap */
1880 cpu_exec_step_atomic(cs
);
1883 cpu_abort(cs
, "Unknown exception 0x%x. Aborting\n", trapnr
);
1886 process_pending_signals(env
);
1893 # ifdef TARGET_ABI_MIPSO32
1894 # define MIPS_SYS(name, args) args,
1895 static const uint8_t mips_syscall_args
[] = {
1896 MIPS_SYS(sys_syscall
, 8) /* 4000 */
1897 MIPS_SYS(sys_exit
, 1)
1898 MIPS_SYS(sys_fork
, 0)
1899 MIPS_SYS(sys_read
, 3)
1900 MIPS_SYS(sys_write
, 3)
1901 MIPS_SYS(sys_open
, 3) /* 4005 */
1902 MIPS_SYS(sys_close
, 1)
1903 MIPS_SYS(sys_waitpid
, 3)
1904 MIPS_SYS(sys_creat
, 2)
1905 MIPS_SYS(sys_link
, 2)
1906 MIPS_SYS(sys_unlink
, 1) /* 4010 */
1907 MIPS_SYS(sys_execve
, 0)
1908 MIPS_SYS(sys_chdir
, 1)
1909 MIPS_SYS(sys_time
, 1)
1910 MIPS_SYS(sys_mknod
, 3)
1911 MIPS_SYS(sys_chmod
, 2) /* 4015 */
1912 MIPS_SYS(sys_lchown
, 3)
1913 MIPS_SYS(sys_ni_syscall
, 0)
1914 MIPS_SYS(sys_ni_syscall
, 0) /* was sys_stat */
1915 MIPS_SYS(sys_lseek
, 3)
1916 MIPS_SYS(sys_getpid
, 0) /* 4020 */
1917 MIPS_SYS(sys_mount
, 5)
1918 MIPS_SYS(sys_umount
, 1)
1919 MIPS_SYS(sys_setuid
, 1)
1920 MIPS_SYS(sys_getuid
, 0)
1921 MIPS_SYS(sys_stime
, 1) /* 4025 */
1922 MIPS_SYS(sys_ptrace
, 4)
1923 MIPS_SYS(sys_alarm
, 1)
1924 MIPS_SYS(sys_ni_syscall
, 0) /* was sys_fstat */
1925 MIPS_SYS(sys_pause
, 0)
1926 MIPS_SYS(sys_utime
, 2) /* 4030 */
1927 MIPS_SYS(sys_ni_syscall
, 0)
1928 MIPS_SYS(sys_ni_syscall
, 0)
1929 MIPS_SYS(sys_access
, 2)
1930 MIPS_SYS(sys_nice
, 1)
1931 MIPS_SYS(sys_ni_syscall
, 0) /* 4035 */
1932 MIPS_SYS(sys_sync
, 0)
1933 MIPS_SYS(sys_kill
, 2)
1934 MIPS_SYS(sys_rename
, 2)
1935 MIPS_SYS(sys_mkdir
, 2)
1936 MIPS_SYS(sys_rmdir
, 1) /* 4040 */
1937 MIPS_SYS(sys_dup
, 1)
1938 MIPS_SYS(sys_pipe
, 0)
1939 MIPS_SYS(sys_times
, 1)
1940 MIPS_SYS(sys_ni_syscall
, 0)
1941 MIPS_SYS(sys_brk
, 1) /* 4045 */
1942 MIPS_SYS(sys_setgid
, 1)
1943 MIPS_SYS(sys_getgid
, 0)
1944 MIPS_SYS(sys_ni_syscall
, 0) /* was signal(2) */
1945 MIPS_SYS(sys_geteuid
, 0)
1946 MIPS_SYS(sys_getegid
, 0) /* 4050 */
1947 MIPS_SYS(sys_acct
, 0)
1948 MIPS_SYS(sys_umount2
, 2)
1949 MIPS_SYS(sys_ni_syscall
, 0)
1950 MIPS_SYS(sys_ioctl
, 3)
1951 MIPS_SYS(sys_fcntl
, 3) /* 4055 */
1952 MIPS_SYS(sys_ni_syscall
, 2)
1953 MIPS_SYS(sys_setpgid
, 2)
1954 MIPS_SYS(sys_ni_syscall
, 0)
1955 MIPS_SYS(sys_olduname
, 1)
1956 MIPS_SYS(sys_umask
, 1) /* 4060 */
1957 MIPS_SYS(sys_chroot
, 1)
1958 MIPS_SYS(sys_ustat
, 2)
1959 MIPS_SYS(sys_dup2
, 2)
1960 MIPS_SYS(sys_getppid
, 0)
1961 MIPS_SYS(sys_getpgrp
, 0) /* 4065 */
1962 MIPS_SYS(sys_setsid
, 0)
1963 MIPS_SYS(sys_sigaction
, 3)
1964 MIPS_SYS(sys_sgetmask
, 0)
1965 MIPS_SYS(sys_ssetmask
, 1)
1966 MIPS_SYS(sys_setreuid
, 2) /* 4070 */
1967 MIPS_SYS(sys_setregid
, 2)
1968 MIPS_SYS(sys_sigsuspend
, 0)
1969 MIPS_SYS(sys_sigpending
, 1)
1970 MIPS_SYS(sys_sethostname
, 2)
1971 MIPS_SYS(sys_setrlimit
, 2) /* 4075 */
1972 MIPS_SYS(sys_getrlimit
, 2)
1973 MIPS_SYS(sys_getrusage
, 2)
1974 MIPS_SYS(sys_gettimeofday
, 2)
1975 MIPS_SYS(sys_settimeofday
, 2)
1976 MIPS_SYS(sys_getgroups
, 2) /* 4080 */
1977 MIPS_SYS(sys_setgroups
, 2)
1978 MIPS_SYS(sys_ni_syscall
, 0) /* old_select */
1979 MIPS_SYS(sys_symlink
, 2)
1980 MIPS_SYS(sys_ni_syscall
, 0) /* was sys_lstat */
1981 MIPS_SYS(sys_readlink
, 3) /* 4085 */
1982 MIPS_SYS(sys_uselib
, 1)
1983 MIPS_SYS(sys_swapon
, 2)
1984 MIPS_SYS(sys_reboot
, 3)
1985 MIPS_SYS(old_readdir
, 3)
1986 MIPS_SYS(old_mmap
, 6) /* 4090 */
1987 MIPS_SYS(sys_munmap
, 2)
1988 MIPS_SYS(sys_truncate
, 2)
1989 MIPS_SYS(sys_ftruncate
, 2)
1990 MIPS_SYS(sys_fchmod
, 2)
1991 MIPS_SYS(sys_fchown
, 3) /* 4095 */
1992 MIPS_SYS(sys_getpriority
, 2)
1993 MIPS_SYS(sys_setpriority
, 3)
1994 MIPS_SYS(sys_ni_syscall
, 0)
1995 MIPS_SYS(sys_statfs
, 2)
1996 MIPS_SYS(sys_fstatfs
, 2) /* 4100 */
1997 MIPS_SYS(sys_ni_syscall
, 0) /* was ioperm(2) */
1998 MIPS_SYS(sys_socketcall
, 2)
1999 MIPS_SYS(sys_syslog
, 3)
2000 MIPS_SYS(sys_setitimer
, 3)
2001 MIPS_SYS(sys_getitimer
, 2) /* 4105 */
2002 MIPS_SYS(sys_newstat
, 2)
2003 MIPS_SYS(sys_newlstat
, 2)
2004 MIPS_SYS(sys_newfstat
, 2)
2005 MIPS_SYS(sys_uname
, 1)
2006 MIPS_SYS(sys_ni_syscall
, 0) /* 4110 was iopl(2) */
2007 MIPS_SYS(sys_vhangup
, 0)
2008 MIPS_SYS(sys_ni_syscall
, 0) /* was sys_idle() */
2009 MIPS_SYS(sys_ni_syscall
, 0) /* was sys_vm86 */
2010 MIPS_SYS(sys_wait4
, 4)
2011 MIPS_SYS(sys_swapoff
, 1) /* 4115 */
2012 MIPS_SYS(sys_sysinfo
, 1)
2013 MIPS_SYS(sys_ipc
, 6)
2014 MIPS_SYS(sys_fsync
, 1)
2015 MIPS_SYS(sys_sigreturn
, 0)
2016 MIPS_SYS(sys_clone
, 6) /* 4120 */
2017 MIPS_SYS(sys_setdomainname
, 2)
2018 MIPS_SYS(sys_newuname
, 1)
2019 MIPS_SYS(sys_ni_syscall
, 0) /* sys_modify_ldt */
2020 MIPS_SYS(sys_adjtimex
, 1)
2021 MIPS_SYS(sys_mprotect
, 3) /* 4125 */
2022 MIPS_SYS(sys_sigprocmask
, 3)
2023 MIPS_SYS(sys_ni_syscall
, 0) /* was create_module */
2024 MIPS_SYS(sys_init_module
, 5)
2025 MIPS_SYS(sys_delete_module
, 1)
2026 MIPS_SYS(sys_ni_syscall
, 0) /* 4130 was get_kernel_syms */
2027 MIPS_SYS(sys_quotactl
, 0)
2028 MIPS_SYS(sys_getpgid
, 1)
2029 MIPS_SYS(sys_fchdir
, 1)
2030 MIPS_SYS(sys_bdflush
, 2)
2031 MIPS_SYS(sys_sysfs
, 3) /* 4135 */
2032 MIPS_SYS(sys_personality
, 1)
2033 MIPS_SYS(sys_ni_syscall
, 0) /* for afs_syscall */
2034 MIPS_SYS(sys_setfsuid
, 1)
2035 MIPS_SYS(sys_setfsgid
, 1)
2036 MIPS_SYS(sys_llseek
, 5) /* 4140 */
2037 MIPS_SYS(sys_getdents
, 3)
2038 MIPS_SYS(sys_select
, 5)
2039 MIPS_SYS(sys_flock
, 2)
2040 MIPS_SYS(sys_msync
, 3)
2041 MIPS_SYS(sys_readv
, 3) /* 4145 */
2042 MIPS_SYS(sys_writev
, 3)
2043 MIPS_SYS(sys_cacheflush
, 3)
2044 MIPS_SYS(sys_cachectl
, 3)
2045 MIPS_SYS(sys_sysmips
, 4)
2046 MIPS_SYS(sys_ni_syscall
, 0) /* 4150 */
2047 MIPS_SYS(sys_getsid
, 1)
2048 MIPS_SYS(sys_fdatasync
, 0)
2049 MIPS_SYS(sys_sysctl
, 1)
2050 MIPS_SYS(sys_mlock
, 2)
2051 MIPS_SYS(sys_munlock
, 2) /* 4155 */
2052 MIPS_SYS(sys_mlockall
, 1)
2053 MIPS_SYS(sys_munlockall
, 0)
2054 MIPS_SYS(sys_sched_setparam
, 2)
2055 MIPS_SYS(sys_sched_getparam
, 2)
2056 MIPS_SYS(sys_sched_setscheduler
, 3) /* 4160 */
2057 MIPS_SYS(sys_sched_getscheduler
, 1)
2058 MIPS_SYS(sys_sched_yield
, 0)
2059 MIPS_SYS(sys_sched_get_priority_max
, 1)
2060 MIPS_SYS(sys_sched_get_priority_min
, 1)
2061 MIPS_SYS(sys_sched_rr_get_interval
, 2) /* 4165 */
2062 MIPS_SYS(sys_nanosleep
, 2)
2063 MIPS_SYS(sys_mremap
, 5)
2064 MIPS_SYS(sys_accept
, 3)
2065 MIPS_SYS(sys_bind
, 3)
2066 MIPS_SYS(sys_connect
, 3) /* 4170 */
2067 MIPS_SYS(sys_getpeername
, 3)
2068 MIPS_SYS(sys_getsockname
, 3)
2069 MIPS_SYS(sys_getsockopt
, 5)
2070 MIPS_SYS(sys_listen
, 2)
2071 MIPS_SYS(sys_recv
, 4) /* 4175 */
2072 MIPS_SYS(sys_recvfrom
, 6)
2073 MIPS_SYS(sys_recvmsg
, 3)
2074 MIPS_SYS(sys_send
, 4)
2075 MIPS_SYS(sys_sendmsg
, 3)
2076 MIPS_SYS(sys_sendto
, 6) /* 4180 */
2077 MIPS_SYS(sys_setsockopt
, 5)
2078 MIPS_SYS(sys_shutdown
, 2)
2079 MIPS_SYS(sys_socket
, 3)
2080 MIPS_SYS(sys_socketpair
, 4)
2081 MIPS_SYS(sys_setresuid
, 3) /* 4185 */
2082 MIPS_SYS(sys_getresuid
, 3)
2083 MIPS_SYS(sys_ni_syscall
, 0) /* was sys_query_module */
2084 MIPS_SYS(sys_poll
, 3)
2085 MIPS_SYS(sys_nfsservctl
, 3)
2086 MIPS_SYS(sys_setresgid
, 3) /* 4190 */
2087 MIPS_SYS(sys_getresgid
, 3)
2088 MIPS_SYS(sys_prctl
, 5)
2089 MIPS_SYS(sys_rt_sigreturn
, 0)
2090 MIPS_SYS(sys_rt_sigaction
, 4)
2091 MIPS_SYS(sys_rt_sigprocmask
, 4) /* 4195 */
2092 MIPS_SYS(sys_rt_sigpending
, 2)
2093 MIPS_SYS(sys_rt_sigtimedwait
, 4)
2094 MIPS_SYS(sys_rt_sigqueueinfo
, 3)
2095 MIPS_SYS(sys_rt_sigsuspend
, 0)
2096 MIPS_SYS(sys_pread64
, 6) /* 4200 */
2097 MIPS_SYS(sys_pwrite64
, 6)
2098 MIPS_SYS(sys_chown
, 3)
2099 MIPS_SYS(sys_getcwd
, 2)
2100 MIPS_SYS(sys_capget
, 2)
2101 MIPS_SYS(sys_capset
, 2) /* 4205 */
2102 MIPS_SYS(sys_sigaltstack
, 2)
2103 MIPS_SYS(sys_sendfile
, 4)
2104 MIPS_SYS(sys_ni_syscall
, 0)
2105 MIPS_SYS(sys_ni_syscall
, 0)
2106 MIPS_SYS(sys_mmap2
, 6) /* 4210 */
2107 MIPS_SYS(sys_truncate64
, 4)
2108 MIPS_SYS(sys_ftruncate64
, 4)
2109 MIPS_SYS(sys_stat64
, 2)
2110 MIPS_SYS(sys_lstat64
, 2)
2111 MIPS_SYS(sys_fstat64
, 2) /* 4215 */
2112 MIPS_SYS(sys_pivot_root
, 2)
2113 MIPS_SYS(sys_mincore
, 3)
2114 MIPS_SYS(sys_madvise
, 3)
2115 MIPS_SYS(sys_getdents64
, 3)
2116 MIPS_SYS(sys_fcntl64
, 3) /* 4220 */
2117 MIPS_SYS(sys_ni_syscall
, 0)
2118 MIPS_SYS(sys_gettid
, 0)
2119 MIPS_SYS(sys_readahead
, 5)
2120 MIPS_SYS(sys_setxattr
, 5)
2121 MIPS_SYS(sys_lsetxattr
, 5) /* 4225 */
2122 MIPS_SYS(sys_fsetxattr
, 5)
2123 MIPS_SYS(sys_getxattr
, 4)
2124 MIPS_SYS(sys_lgetxattr
, 4)
2125 MIPS_SYS(sys_fgetxattr
, 4)
2126 MIPS_SYS(sys_listxattr
, 3) /* 4230 */
2127 MIPS_SYS(sys_llistxattr
, 3)
2128 MIPS_SYS(sys_flistxattr
, 3)
2129 MIPS_SYS(sys_removexattr
, 2)
2130 MIPS_SYS(sys_lremovexattr
, 2)
2131 MIPS_SYS(sys_fremovexattr
, 2) /* 4235 */
2132 MIPS_SYS(sys_tkill
, 2)
2133 MIPS_SYS(sys_sendfile64
, 5)
2134 MIPS_SYS(sys_futex
, 6)
2135 MIPS_SYS(sys_sched_setaffinity
, 3)
2136 MIPS_SYS(sys_sched_getaffinity
, 3) /* 4240 */
2137 MIPS_SYS(sys_io_setup
, 2)
2138 MIPS_SYS(sys_io_destroy
, 1)
2139 MIPS_SYS(sys_io_getevents
, 5)
2140 MIPS_SYS(sys_io_submit
, 3)
2141 MIPS_SYS(sys_io_cancel
, 3) /* 4245 */
2142 MIPS_SYS(sys_exit_group
, 1)
2143 MIPS_SYS(sys_lookup_dcookie
, 3)
2144 MIPS_SYS(sys_epoll_create
, 1)
2145 MIPS_SYS(sys_epoll_ctl
, 4)
2146 MIPS_SYS(sys_epoll_wait
, 3) /* 4250 */
2147 MIPS_SYS(sys_remap_file_pages
, 5)
2148 MIPS_SYS(sys_set_tid_address
, 1)
2149 MIPS_SYS(sys_restart_syscall
, 0)
2150 MIPS_SYS(sys_fadvise64_64
, 7)
2151 MIPS_SYS(sys_statfs64
, 3) /* 4255 */
2152 MIPS_SYS(sys_fstatfs64
, 2)
2153 MIPS_SYS(sys_timer_create
, 3)
2154 MIPS_SYS(sys_timer_settime
, 4)
2155 MIPS_SYS(sys_timer_gettime
, 2)
2156 MIPS_SYS(sys_timer_getoverrun
, 1) /* 4260 */
2157 MIPS_SYS(sys_timer_delete
, 1)
2158 MIPS_SYS(sys_clock_settime
, 2)
2159 MIPS_SYS(sys_clock_gettime
, 2)
2160 MIPS_SYS(sys_clock_getres
, 2)
2161 MIPS_SYS(sys_clock_nanosleep
, 4) /* 4265 */
2162 MIPS_SYS(sys_tgkill
, 3)
2163 MIPS_SYS(sys_utimes
, 2)
2164 MIPS_SYS(sys_mbind
, 4)
2165 MIPS_SYS(sys_ni_syscall
, 0) /* sys_get_mempolicy */
2166 MIPS_SYS(sys_ni_syscall
, 0) /* 4270 sys_set_mempolicy */
2167 MIPS_SYS(sys_mq_open
, 4)
2168 MIPS_SYS(sys_mq_unlink
, 1)
2169 MIPS_SYS(sys_mq_timedsend
, 5)
2170 MIPS_SYS(sys_mq_timedreceive
, 5)
2171 MIPS_SYS(sys_mq_notify
, 2) /* 4275 */
2172 MIPS_SYS(sys_mq_getsetattr
, 3)
2173 MIPS_SYS(sys_ni_syscall
, 0) /* sys_vserver */
2174 MIPS_SYS(sys_waitid
, 4)
2175 MIPS_SYS(sys_ni_syscall
, 0) /* available, was setaltroot */
2176 MIPS_SYS(sys_add_key
, 5)
2177 MIPS_SYS(sys_request_key
, 4)
2178 MIPS_SYS(sys_keyctl
, 5)
2179 MIPS_SYS(sys_set_thread_area
, 1)
2180 MIPS_SYS(sys_inotify_init
, 0)
2181 MIPS_SYS(sys_inotify_add_watch
, 3) /* 4285 */
2182 MIPS_SYS(sys_inotify_rm_watch
, 2)
2183 MIPS_SYS(sys_migrate_pages
, 4)
2184 MIPS_SYS(sys_openat
, 4)
2185 MIPS_SYS(sys_mkdirat
, 3)
2186 MIPS_SYS(sys_mknodat
, 4) /* 4290 */
2187 MIPS_SYS(sys_fchownat
, 5)
2188 MIPS_SYS(sys_futimesat
, 3)
2189 MIPS_SYS(sys_fstatat64
, 4)
2190 MIPS_SYS(sys_unlinkat
, 3)
2191 MIPS_SYS(sys_renameat
, 4) /* 4295 */
2192 MIPS_SYS(sys_linkat
, 5)
2193 MIPS_SYS(sys_symlinkat
, 3)
2194 MIPS_SYS(sys_readlinkat
, 4)
2195 MIPS_SYS(sys_fchmodat
, 3)
2196 MIPS_SYS(sys_faccessat
, 3) /* 4300 */
2197 MIPS_SYS(sys_pselect6
, 6)
2198 MIPS_SYS(sys_ppoll
, 5)
2199 MIPS_SYS(sys_unshare
, 1)
2200 MIPS_SYS(sys_splice
, 6)
2201 MIPS_SYS(sys_sync_file_range
, 7) /* 4305 */
2202 MIPS_SYS(sys_tee
, 4)
2203 MIPS_SYS(sys_vmsplice
, 4)
2204 MIPS_SYS(sys_move_pages
, 6)
2205 MIPS_SYS(sys_set_robust_list
, 2)
2206 MIPS_SYS(sys_get_robust_list
, 3) /* 4310 */
2207 MIPS_SYS(sys_kexec_load
, 4)
2208 MIPS_SYS(sys_getcpu
, 3)
2209 MIPS_SYS(sys_epoll_pwait
, 6)
2210 MIPS_SYS(sys_ioprio_set
, 3)
2211 MIPS_SYS(sys_ioprio_get
, 2)
2212 MIPS_SYS(sys_utimensat
, 4)
2213 MIPS_SYS(sys_signalfd
, 3)
2214 MIPS_SYS(sys_ni_syscall
, 0) /* was timerfd */
2215 MIPS_SYS(sys_eventfd
, 1)
2216 MIPS_SYS(sys_fallocate
, 6) /* 4320 */
2217 MIPS_SYS(sys_timerfd_create
, 2)
2218 MIPS_SYS(sys_timerfd_gettime
, 2)
2219 MIPS_SYS(sys_timerfd_settime
, 4)
2220 MIPS_SYS(sys_signalfd4
, 4)
2221 MIPS_SYS(sys_eventfd2
, 2) /* 4325 */
2222 MIPS_SYS(sys_epoll_create1
, 1)
2223 MIPS_SYS(sys_dup3
, 3)
2224 MIPS_SYS(sys_pipe2
, 2)
2225 MIPS_SYS(sys_inotify_init1
, 1)
2226 MIPS_SYS(sys_preadv
, 5) /* 4330 */
2227 MIPS_SYS(sys_pwritev
, 5)
2228 MIPS_SYS(sys_rt_tgsigqueueinfo
, 4)
2229 MIPS_SYS(sys_perf_event_open
, 5)
2230 MIPS_SYS(sys_accept4
, 4)
2231 MIPS_SYS(sys_recvmmsg
, 5) /* 4335 */
2232 MIPS_SYS(sys_fanotify_init
, 2)
2233 MIPS_SYS(sys_fanotify_mark
, 6)
2234 MIPS_SYS(sys_prlimit64
, 4)
2235 MIPS_SYS(sys_name_to_handle_at
, 5)
2236 MIPS_SYS(sys_open_by_handle_at
, 3) /* 4340 */
2237 MIPS_SYS(sys_clock_adjtime
, 2)
2238 MIPS_SYS(sys_syncfs
, 1)
2239 MIPS_SYS(sys_sendmmsg
, 4)
2240 MIPS_SYS(sys_setns
, 2)
2241 MIPS_SYS(sys_process_vm_readv
, 6) /* 345 */
2242 MIPS_SYS(sys_process_vm_writev
, 6)
2243 MIPS_SYS(sys_kcmp
, 5)
2244 MIPS_SYS(sys_finit_module
, 3)
2245 MIPS_SYS(sys_sched_setattr
, 2)
2246 MIPS_SYS(sys_sched_getattr
, 3) /* 350 */
2247 MIPS_SYS(sys_renameat2
, 5)
2248 MIPS_SYS(sys_seccomp
, 3)
2249 MIPS_SYS(sys_getrandom
, 3)
2250 MIPS_SYS(sys_memfd_create
, 2)
2251 MIPS_SYS(sys_bpf
, 3) /* 355 */
2252 MIPS_SYS(sys_execveat
, 5)
2253 MIPS_SYS(sys_userfaultfd
, 1)
2254 MIPS_SYS(sys_membarrier
, 2)
2255 MIPS_SYS(sys_mlock2
, 3)
2256 MIPS_SYS(sys_copy_file_range
, 6) /* 360 */
2257 MIPS_SYS(sys_preadv2
, 6)
2258 MIPS_SYS(sys_pwritev2
, 6)
2263 static int do_store_exclusive(CPUMIPSState
*env
)
2266 target_ulong page_addr
;
2274 page_addr
= addr
& TARGET_PAGE_MASK
;
2277 flags
= page_get_flags(page_addr
);
2278 if ((flags
& PAGE_READ
) == 0) {
2281 reg
= env
->llreg
& 0x1f;
2282 d
= (env
->llreg
& 0x20) != 0;
2284 segv
= get_user_s64(val
, addr
);
2286 segv
= get_user_s32(val
, addr
);
2289 if (val
!= env
->llval
) {
2290 env
->active_tc
.gpr
[reg
] = 0;
2293 segv
= put_user_u64(env
->llnewval
, addr
);
2295 segv
= put_user_u32(env
->llnewval
, addr
);
2298 env
->active_tc
.gpr
[reg
] = 1;
2305 env
->active_tc
.PC
+= 4;
2318 static int do_break(CPUMIPSState
*env
, target_siginfo_t
*info
,
2326 info
->si_signo
= TARGET_SIGFPE
;
2328 info
->si_code
= (code
== BRK_OVERFLOW
) ? FPE_INTOVF
: FPE_INTDIV
;
2329 queue_signal(env
, info
->si_signo
, QEMU_SI_FAULT
, &*info
);
2333 info
->si_signo
= TARGET_SIGTRAP
;
2335 queue_signal(env
, info
->si_signo
, QEMU_SI_FAULT
, &*info
);
2343 void cpu_loop(CPUMIPSState
*env
)
2345 CPUState
*cs
= CPU(mips_env_get_cpu(env
));
2346 target_siginfo_t info
;
2349 # ifdef TARGET_ABI_MIPSO32
2350 unsigned int syscall_num
;
2355 trapnr
= cpu_exec(cs
);
2357 process_queued_cpu_work(cs
);
2361 env
->active_tc
.PC
+= 4;
2362 # ifdef TARGET_ABI_MIPSO32
2363 syscall_num
= env
->active_tc
.gpr
[2] - 4000;
2364 if (syscall_num
>= sizeof(mips_syscall_args
)) {
2365 ret
= -TARGET_ENOSYS
;
2369 abi_ulong arg5
= 0, arg6
= 0, arg7
= 0, arg8
= 0;
2371 nb_args
= mips_syscall_args
[syscall_num
];
2372 sp_reg
= env
->active_tc
.gpr
[29];
2374 /* these arguments are taken from the stack */
2376 if ((ret
= get_user_ual(arg8
, sp_reg
+ 28)) != 0) {
2380 if ((ret
= get_user_ual(arg7
, sp_reg
+ 24)) != 0) {
2384 if ((ret
= get_user_ual(arg6
, sp_reg
+ 20)) != 0) {
2388 if ((ret
= get_user_ual(arg5
, sp_reg
+ 16)) != 0) {
2394 ret
= do_syscall(env
, env
->active_tc
.gpr
[2],
2395 env
->active_tc
.gpr
[4],
2396 env
->active_tc
.gpr
[5],
2397 env
->active_tc
.gpr
[6],
2398 env
->active_tc
.gpr
[7],
2399 arg5
, arg6
, arg7
, arg8
);
2403 ret
= do_syscall(env
, env
->active_tc
.gpr
[2],
2404 env
->active_tc
.gpr
[4], env
->active_tc
.gpr
[5],
2405 env
->active_tc
.gpr
[6], env
->active_tc
.gpr
[7],
2406 env
->active_tc
.gpr
[8], env
->active_tc
.gpr
[9],
2407 env
->active_tc
.gpr
[10], env
->active_tc
.gpr
[11]);
2409 if (ret
== -TARGET_ERESTARTSYS
) {
2410 env
->active_tc
.PC
-= 4;
2413 if (ret
== -TARGET_QEMU_ESIGRETURN
) {
2414 /* Returning from a successful sigreturn syscall.
2415 Avoid clobbering register state. */
2418 if ((abi_ulong
)ret
>= (abi_ulong
)-1133) {
2419 env
->active_tc
.gpr
[7] = 1; /* error flag */
2422 env
->active_tc
.gpr
[7] = 0; /* error flag */
2424 env
->active_tc
.gpr
[2] = ret
;
2430 info
.si_signo
= TARGET_SIGSEGV
;
2432 /* XXX: check env->error_code */
2433 info
.si_code
= TARGET_SEGV_MAPERR
;
2434 info
._sifields
._sigfault
._addr
= env
->CP0_BadVAddr
;
2435 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
2439 info
.si_signo
= TARGET_SIGILL
;
2442 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
2444 case EXCP_INTERRUPT
:
2445 /* just indicate that signals should be handled asap */
2451 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
2454 info
.si_signo
= sig
;
2456 info
.si_code
= TARGET_TRAP_BRKPT
;
2457 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
2462 if (do_store_exclusive(env
)) {
2463 info
.si_signo
= TARGET_SIGSEGV
;
2465 info
.si_code
= TARGET_SEGV_MAPERR
;
2466 info
._sifields
._sigfault
._addr
= env
->active_tc
.PC
;
2467 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
2471 info
.si_signo
= TARGET_SIGILL
;
2473 info
.si_code
= TARGET_ILL_ILLOPC
;
2474 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
2476 /* The code below was inspired by the MIPS Linux kernel trap
2477 * handling code in arch/mips/kernel/traps.c.
2481 abi_ulong trap_instr
;
2484 if (env
->hflags
& MIPS_HFLAG_M16
) {
2485 if (env
->insn_flags
& ASE_MICROMIPS
) {
2486 /* microMIPS mode */
2487 ret
= get_user_u16(trap_instr
, env
->active_tc
.PC
);
2492 if ((trap_instr
>> 10) == 0x11) {
2493 /* 16-bit instruction */
2494 code
= trap_instr
& 0xf;
2496 /* 32-bit instruction */
2499 ret
= get_user_u16(instr_lo
,
2500 env
->active_tc
.PC
+ 2);
2504 trap_instr
= (trap_instr
<< 16) | instr_lo
;
2505 code
= ((trap_instr
>> 6) & ((1 << 20) - 1));
2506 /* Unfortunately, microMIPS also suffers from
2507 the old assembler bug... */
2508 if (code
>= (1 << 10)) {
2514 ret
= get_user_u16(trap_instr
, env
->active_tc
.PC
);
2518 code
= (trap_instr
>> 6) & 0x3f;
2521 ret
= get_user_u32(trap_instr
, env
->active_tc
.PC
);
2526 /* As described in the original Linux kernel code, the
2527 * below checks on 'code' are to work around an old
2530 code
= ((trap_instr
>> 6) & ((1 << 20) - 1));
2531 if (code
>= (1 << 10)) {
2536 if (do_break(env
, &info
, code
) != 0) {
2543 abi_ulong trap_instr
;
2544 unsigned int code
= 0;
2546 if (env
->hflags
& MIPS_HFLAG_M16
) {
2547 /* microMIPS mode */
2550 ret
= get_user_u16(instr
[0], env
->active_tc
.PC
) ||
2551 get_user_u16(instr
[1], env
->active_tc
.PC
+ 2);
2553 trap_instr
= (instr
[0] << 16) | instr
[1];
2555 ret
= get_user_u32(trap_instr
, env
->active_tc
.PC
);
2562 /* The immediate versions don't provide a code. */
2563 if (!(trap_instr
& 0xFC000000)) {
2564 if (env
->hflags
& MIPS_HFLAG_M16
) {
2565 /* microMIPS mode */
2566 code
= ((trap_instr
>> 12) & ((1 << 4) - 1));
2568 code
= ((trap_instr
>> 6) & ((1 << 10) - 1));
2572 if (do_break(env
, &info
, code
) != 0) {
2578 cpu_exec_step_atomic(cs
);
2582 EXCP_DUMP(env
, "qemu: unhandled CPU exception 0x%x - aborting\n", trapnr
);
2585 process_pending_signals(env
);
2590 #ifdef TARGET_OPENRISC
2592 void cpu_loop(CPUOpenRISCState
*env
)
2594 CPUState
*cs
= CPU(openrisc_env_get_cpu(env
));
2600 trapnr
= cpu_exec(cs
);
2602 process_queued_cpu_work(cs
);
2607 qemu_log_mask(CPU_LOG_INT
, "\nReset request, exit, pc is %#x\n", env
->pc
);
2611 qemu_log_mask(CPU_LOG_INT
, "\nBus error, exit, pc is %#x\n", env
->pc
);
2612 gdbsig
= TARGET_SIGBUS
;
2616 cpu_dump_state(cs
, stderr
, fprintf
, 0);
2617 gdbsig
= TARGET_SIGSEGV
;
2620 qemu_log_mask(CPU_LOG_INT
, "\nTick time interrupt pc is %#x\n", env
->pc
);
2623 qemu_log_mask(CPU_LOG_INT
, "\nAlignment pc is %#x\n", env
->pc
);
2624 gdbsig
= TARGET_SIGBUS
;
2627 qemu_log_mask(CPU_LOG_INT
, "\nIllegal instructionpc is %#x\n", env
->pc
);
2628 gdbsig
= TARGET_SIGILL
;
2631 qemu_log_mask(CPU_LOG_INT
, "\nExternal interruptpc is %#x\n", env
->pc
);
2635 qemu_log_mask(CPU_LOG_INT
, "\nTLB miss\n");
2638 qemu_log_mask(CPU_LOG_INT
, "\nRange\n");
2639 gdbsig
= TARGET_SIGSEGV
;
2642 env
->pc
+= 4; /* 0xc00; */
2643 ret
= do_syscall(env
,
2644 env
->gpr
[11], /* return value */
2645 env
->gpr
[3], /* r3 - r7 are params */
2651 if (ret
== -TARGET_ERESTARTSYS
) {
2653 } else if (ret
!= -TARGET_QEMU_ESIGRETURN
) {
2658 qemu_log_mask(CPU_LOG_INT
, "\nFloating point error\n");
2661 qemu_log_mask(CPU_LOG_INT
, "\nTrap\n");
2662 gdbsig
= TARGET_SIGTRAP
;
2665 qemu_log_mask(CPU_LOG_INT
, "\nNR\n");
2668 cpu_exec_step_atomic(cs
);
2671 EXCP_DUMP(env
, "\nqemu: unhandled CPU exception %#x - aborting\n",
2673 gdbsig
= TARGET_SIGILL
;
2677 gdb_handlesig(cs
, gdbsig
);
2678 if (gdbsig
!= TARGET_SIGTRAP
) {
2683 process_pending_signals(env
);
2687 #endif /* TARGET_OPENRISC */
2690 void cpu_loop(CPUSH4State
*env
)
2692 CPUState
*cs
= CPU(sh_env_get_cpu(env
));
2694 target_siginfo_t info
;
2698 trapnr
= cpu_exec(cs
);
2700 process_queued_cpu_work(cs
);
2705 ret
= do_syscall(env
,
2714 if (ret
== -TARGET_ERESTARTSYS
) {
2716 } else if (ret
!= -TARGET_QEMU_ESIGRETURN
) {
2717 env
->gregs
[0] = ret
;
2720 case EXCP_INTERRUPT
:
2721 /* just indicate that signals should be handled asap */
2727 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
2730 info
.si_signo
= sig
;
2732 info
.si_code
= TARGET_TRAP_BRKPT
;
2733 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
2739 info
.si_signo
= TARGET_SIGSEGV
;
2741 info
.si_code
= TARGET_SEGV_MAPERR
;
2742 info
._sifields
._sigfault
._addr
= env
->tea
;
2743 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
2747 cpu_exec_step_atomic(cs
);
2750 printf ("Unhandled trap: 0x%x\n", trapnr
);
2751 cpu_dump_state(cs
, stderr
, fprintf
, 0);
2754 process_pending_signals (env
);
2760 void cpu_loop(CPUCRISState
*env
)
2762 CPUState
*cs
= CPU(cris_env_get_cpu(env
));
2764 target_siginfo_t info
;
2768 trapnr
= cpu_exec(cs
);
2770 process_queued_cpu_work(cs
);
2775 info
.si_signo
= TARGET_SIGSEGV
;
2777 /* XXX: check env->error_code */
2778 info
.si_code
= TARGET_SEGV_MAPERR
;
2779 info
._sifields
._sigfault
._addr
= env
->pregs
[PR_EDA
];
2780 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
2783 case EXCP_INTERRUPT
:
2784 /* just indicate that signals should be handled asap */
2787 ret
= do_syscall(env
,
2796 if (ret
== -TARGET_ERESTARTSYS
) {
2798 } else if (ret
!= -TARGET_QEMU_ESIGRETURN
) {
2799 env
->regs
[10] = ret
;
2806 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
2809 info
.si_signo
= sig
;
2811 info
.si_code
= TARGET_TRAP_BRKPT
;
2812 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
2817 cpu_exec_step_atomic(cs
);
2820 printf ("Unhandled trap: 0x%x\n", trapnr
);
2821 cpu_dump_state(cs
, stderr
, fprintf
, 0);
2824 process_pending_signals (env
);
2829 #ifdef TARGET_MICROBLAZE
2830 void cpu_loop(CPUMBState
*env
)
2832 CPUState
*cs
= CPU(mb_env_get_cpu(env
));
2834 target_siginfo_t info
;
2838 trapnr
= cpu_exec(cs
);
2840 process_queued_cpu_work(cs
);
2845 info
.si_signo
= TARGET_SIGSEGV
;
2847 /* XXX: check env->error_code */
2848 info
.si_code
= TARGET_SEGV_MAPERR
;
2849 info
._sifields
._sigfault
._addr
= 0;
2850 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
2853 case EXCP_INTERRUPT
:
2854 /* just indicate that signals should be handled asap */
2857 /* Return address is 4 bytes after the call. */
2859 env
->sregs
[SR_PC
] = env
->regs
[14];
2860 ret
= do_syscall(env
,
2869 if (ret
== -TARGET_ERESTARTSYS
) {
2870 /* Wind back to before the syscall. */
2871 env
->sregs
[SR_PC
] -= 4;
2872 } else if (ret
!= -TARGET_QEMU_ESIGRETURN
) {
2875 /* All syscall exits result in guest r14 being equal to the
2876 * PC we return to, because the kernel syscall exit "rtbd" does
2877 * this. (This is true even for sigreturn(); note that r14 is
2878 * not a userspace-usable register, as the kernel may clobber it
2881 env
->regs
[14] = env
->sregs
[SR_PC
];
2884 env
->regs
[17] = env
->sregs
[SR_PC
] + 4;
2885 if (env
->iflags
& D_FLAG
) {
2886 env
->sregs
[SR_ESR
] |= 1 << 12;
2887 env
->sregs
[SR_PC
] -= 4;
2888 /* FIXME: if branch was immed, replay the imm as well. */
2891 env
->iflags
&= ~(IMM_FLAG
| D_FLAG
);
2893 switch (env
->sregs
[SR_ESR
] & 31) {
2894 case ESR_EC_DIVZERO
:
2895 info
.si_signo
= TARGET_SIGFPE
;
2897 info
.si_code
= TARGET_FPE_FLTDIV
;
2898 info
._sifields
._sigfault
._addr
= 0;
2899 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
2902 info
.si_signo
= TARGET_SIGFPE
;
2904 if (env
->sregs
[SR_FSR
] & FSR_IO
) {
2905 info
.si_code
= TARGET_FPE_FLTINV
;
2907 if (env
->sregs
[SR_FSR
] & FSR_DZ
) {
2908 info
.si_code
= TARGET_FPE_FLTDIV
;
2910 info
._sifields
._sigfault
._addr
= 0;
2911 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
2914 printf ("Unhandled hw-exception: 0x%x\n",
2915 env
->sregs
[SR_ESR
] & ESR_EC_MASK
);
2916 cpu_dump_state(cs
, stderr
, fprintf
, 0);
2925 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
2928 info
.si_signo
= sig
;
2930 info
.si_code
= TARGET_TRAP_BRKPT
;
2931 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
2936 cpu_exec_step_atomic(cs
);
2939 printf ("Unhandled trap: 0x%x\n", trapnr
);
2940 cpu_dump_state(cs
, stderr
, fprintf
, 0);
2943 process_pending_signals (env
);
2950 void cpu_loop(CPUM68KState
*env
)
2952 CPUState
*cs
= CPU(m68k_env_get_cpu(env
));
2955 target_siginfo_t info
;
2956 TaskState
*ts
= cs
->opaque
;
2960 trapnr
= cpu_exec(cs
);
2962 process_queued_cpu_work(cs
);
2967 if (ts
->sim_syscalls
) {
2969 get_user_u16(nr
, env
->pc
+ 2);
2971 do_m68k_simcall(env
, nr
);
2977 case EXCP_HALT_INSN
:
2978 /* Semihosing syscall. */
2980 do_m68k_semihosting(env
, env
->dregs
[0]);
2984 case EXCP_UNSUPPORTED
:
2986 info
.si_signo
= TARGET_SIGILL
;
2988 info
.si_code
= TARGET_ILL_ILLOPN
;
2989 info
._sifields
._sigfault
._addr
= env
->pc
;
2990 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
2995 ts
->sim_syscalls
= 0;
2998 ret
= do_syscall(env
,
3007 if (ret
== -TARGET_ERESTARTSYS
) {
3009 } else if (ret
!= -TARGET_QEMU_ESIGRETURN
) {
3010 env
->dregs
[0] = ret
;
3014 case EXCP_INTERRUPT
:
3015 /* just indicate that signals should be handled asap */
3019 info
.si_signo
= TARGET_SIGSEGV
;
3021 /* XXX: check env->error_code */
3022 info
.si_code
= TARGET_SEGV_MAPERR
;
3023 info
._sifields
._sigfault
._addr
= env
->mmu
.ar
;
3024 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
3031 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
3034 info
.si_signo
= sig
;
3036 info
.si_code
= TARGET_TRAP_BRKPT
;
3037 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
3042 cpu_exec_step_atomic(cs
);
3045 EXCP_DUMP(env
, "qemu: unhandled CPU exception 0x%x - aborting\n", trapnr
);
3048 process_pending_signals(env
);
3051 #endif /* TARGET_M68K */
3054 static void do_store_exclusive(CPUAlphaState
*env
, int reg
, int quad
)
3056 target_ulong addr
, val
, tmp
;
3057 target_siginfo_t info
;
3060 addr
= env
->lock_addr
;
3061 tmp
= env
->lock_st_addr
;
3062 env
->lock_addr
= -1;
3063 env
->lock_st_addr
= 0;
3069 if (quad
? get_user_s64(val
, addr
) : get_user_s32(val
, addr
)) {
3073 if (val
== env
->lock_value
) {
3075 if (quad
? put_user_u64(tmp
, addr
) : put_user_u32(tmp
, addr
)) {
3092 info
.si_signo
= TARGET_SIGSEGV
;
3094 info
.si_code
= TARGET_SEGV_MAPERR
;
3095 info
._sifields
._sigfault
._addr
= addr
;
3096 queue_signal(env
, TARGET_SIGSEGV
, QEMU_SI_FAULT
, &info
);
3099 void cpu_loop(CPUAlphaState
*env
)
3101 CPUState
*cs
= CPU(alpha_env_get_cpu(env
));
3103 target_siginfo_t info
;
3108 trapnr
= cpu_exec(cs
);
3110 process_queued_cpu_work(cs
);
3112 /* All of the traps imply a transition through PALcode, which
3113 implies an REI instruction has been executed. Which means
3114 that the intr_flag should be cleared. */
3119 fprintf(stderr
, "Reset requested. Exit\n");
3123 fprintf(stderr
, "Machine check exception. Exit\n");
3126 case EXCP_SMP_INTERRUPT
:
3127 case EXCP_CLK_INTERRUPT
:
3128 case EXCP_DEV_INTERRUPT
:
3129 fprintf(stderr
, "External interrupt. Exit\n");
3133 env
->lock_addr
= -1;
3134 info
.si_signo
= TARGET_SIGSEGV
;
3136 info
.si_code
= (page_get_flags(env
->trap_arg0
) & PAGE_VALID
3137 ? TARGET_SEGV_ACCERR
: TARGET_SEGV_MAPERR
);
3138 info
._sifields
._sigfault
._addr
= env
->trap_arg0
;
3139 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
3142 env
->lock_addr
= -1;
3143 info
.si_signo
= TARGET_SIGBUS
;
3145 info
.si_code
= TARGET_BUS_ADRALN
;
3146 info
._sifields
._sigfault
._addr
= env
->trap_arg0
;
3147 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
3151 env
->lock_addr
= -1;
3152 info
.si_signo
= TARGET_SIGILL
;
3154 info
.si_code
= TARGET_ILL_ILLOPC
;
3155 info
._sifields
._sigfault
._addr
= env
->pc
;
3156 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
3159 env
->lock_addr
= -1;
3160 info
.si_signo
= TARGET_SIGFPE
;
3162 info
.si_code
= TARGET_FPE_FLTINV
;
3163 info
._sifields
._sigfault
._addr
= env
->pc
;
3164 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
3167 /* No-op. Linux simply re-enables the FPU. */
3170 env
->lock_addr
= -1;
3171 switch (env
->error_code
) {
3174 info
.si_signo
= TARGET_SIGTRAP
;
3176 info
.si_code
= TARGET_TRAP_BRKPT
;
3177 info
._sifields
._sigfault
._addr
= env
->pc
;
3178 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
3182 info
.si_signo
= TARGET_SIGTRAP
;
3185 info
._sifields
._sigfault
._addr
= env
->pc
;
3186 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
3190 trapnr
= env
->ir
[IR_V0
];
3191 sysret
= do_syscall(env
, trapnr
,
3192 env
->ir
[IR_A0
], env
->ir
[IR_A1
],
3193 env
->ir
[IR_A2
], env
->ir
[IR_A3
],
3194 env
->ir
[IR_A4
], env
->ir
[IR_A5
],
3196 if (sysret
== -TARGET_ERESTARTSYS
) {
3200 if (sysret
== -TARGET_QEMU_ESIGRETURN
) {
3203 /* Syscall writes 0 to V0 to bypass error check, similar
3204 to how this is handled internal to Linux kernel.
3205 (Ab)use trapnr temporarily as boolean indicating error. */
3206 trapnr
= (env
->ir
[IR_V0
] != 0 && sysret
< 0);
3207 env
->ir
[IR_V0
] = (trapnr
? -sysret
: sysret
);
3208 env
->ir
[IR_A3
] = trapnr
;
3212 /* ??? We can probably elide the code using page_unprotect
3213 that is checking for self-modifying code. Instead we
3214 could simply call tb_flush here. Until we work out the
3215 changes required to turn off the extra write protection,
3216 this can be a no-op. */
3220 /* Handled in the translator for usermode. */
3224 /* Handled in the translator for usermode. */
3228 info
.si_signo
= TARGET_SIGFPE
;
3229 switch (env
->ir
[IR_A0
]) {
3230 case TARGET_GEN_INTOVF
:
3231 info
.si_code
= TARGET_FPE_INTOVF
;
3233 case TARGET_GEN_INTDIV
:
3234 info
.si_code
= TARGET_FPE_INTDIV
;
3236 case TARGET_GEN_FLTOVF
:
3237 info
.si_code
= TARGET_FPE_FLTOVF
;
3239 case TARGET_GEN_FLTUND
:
3240 info
.si_code
= TARGET_FPE_FLTUND
;
3242 case TARGET_GEN_FLTINV
:
3243 info
.si_code
= TARGET_FPE_FLTINV
;
3245 case TARGET_GEN_FLTINE
:
3246 info
.si_code
= TARGET_FPE_FLTRES
;
3248 case TARGET_GEN_ROPRAND
:
3252 info
.si_signo
= TARGET_SIGTRAP
;
3257 info
._sifields
._sigfault
._addr
= env
->pc
;
3258 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
3265 info
.si_signo
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
3266 if (info
.si_signo
) {
3267 env
->lock_addr
= -1;
3269 info
.si_code
= TARGET_TRAP_BRKPT
;
3270 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
3275 do_store_exclusive(env
, env
->error_code
, trapnr
- EXCP_STL_C
);
3277 case EXCP_INTERRUPT
:
3278 /* Just indicate that signals should be handled asap. */
3281 cpu_exec_step_atomic(cs
);
3284 printf ("Unhandled trap: 0x%x\n", trapnr
);
3285 cpu_dump_state(cs
, stderr
, fprintf
, 0);
3288 process_pending_signals (env
);
3291 #endif /* TARGET_ALPHA */
3294 void cpu_loop(CPUS390XState
*env
)
3296 CPUState
*cs
= CPU(s390_env_get_cpu(env
));
3298 target_siginfo_t info
;
3304 trapnr
= cpu_exec(cs
);
3306 process_queued_cpu_work(cs
);
3309 case EXCP_INTERRUPT
:
3310 /* Just indicate that signals should be handled asap. */
3314 n
= env
->int_svc_code
;
3316 /* syscalls > 255 */
3319 env
->psw
.addr
+= env
->int_svc_ilen
;
3320 ret
= do_syscall(env
, n
, env
->regs
[2], env
->regs
[3],
3321 env
->regs
[4], env
->regs
[5],
3322 env
->regs
[6], env
->regs
[7], 0, 0);
3323 if (ret
== -TARGET_ERESTARTSYS
) {
3324 env
->psw
.addr
-= env
->int_svc_ilen
;
3325 } else if (ret
!= -TARGET_QEMU_ESIGRETURN
) {
3331 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
3333 n
= TARGET_TRAP_BRKPT
;
3338 n
= env
->int_pgm_code
;
3341 case PGM_PRIVILEGED
:
3342 sig
= TARGET_SIGILL
;
3343 n
= TARGET_ILL_ILLOPC
;
3345 case PGM_PROTECTION
:
3346 case PGM_ADDRESSING
:
3347 sig
= TARGET_SIGSEGV
;
3348 /* XXX: check env->error_code */
3349 n
= TARGET_SEGV_MAPERR
;
3350 addr
= env
->__excp_addr
;
3353 case PGM_SPECIFICATION
:
3354 case PGM_SPECIAL_OP
:
3357 sig
= TARGET_SIGILL
;
3358 n
= TARGET_ILL_ILLOPN
;
3361 case PGM_FIXPT_OVERFLOW
:
3362 sig
= TARGET_SIGFPE
;
3363 n
= TARGET_FPE_INTOVF
;
3365 case PGM_FIXPT_DIVIDE
:
3366 sig
= TARGET_SIGFPE
;
3367 n
= TARGET_FPE_INTDIV
;
3371 n
= (env
->fpc
>> 8) & 0xff;
3373 /* compare-and-trap */
3376 /* An IEEE exception, simulated or otherwise. */
3378 n
= TARGET_FPE_FLTINV
;
3379 } else if (n
& 0x40) {
3380 n
= TARGET_FPE_FLTDIV
;
3381 } else if (n
& 0x20) {
3382 n
= TARGET_FPE_FLTOVF
;
3383 } else if (n
& 0x10) {
3384 n
= TARGET_FPE_FLTUND
;
3385 } else if (n
& 0x08) {
3386 n
= TARGET_FPE_FLTRES
;
3388 /* ??? Quantum exception; BFP, DFP error. */
3391 sig
= TARGET_SIGFPE
;
3396 fprintf(stderr
, "Unhandled program exception: %#x\n", n
);
3397 cpu_dump_state(cs
, stderr
, fprintf
, 0);
3403 addr
= env
->psw
.addr
;
3405 info
.si_signo
= sig
;
3408 info
._sifields
._sigfault
._addr
= addr
;
3409 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
3413 cpu_exec_step_atomic(cs
);
3416 fprintf(stderr
, "Unhandled trap: 0x%x\n", trapnr
);
3417 cpu_dump_state(cs
, stderr
, fprintf
, 0);
3420 process_pending_signals (env
);
3424 #endif /* TARGET_S390X */
3426 #ifdef TARGET_TILEGX
3428 static void gen_sigill_reg(CPUTLGState
*env
)
3430 target_siginfo_t info
;
3432 info
.si_signo
= TARGET_SIGILL
;
3434 info
.si_code
= TARGET_ILL_PRVREG
;
3435 info
._sifields
._sigfault
._addr
= env
->pc
;
3436 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
3439 static void do_signal(CPUTLGState
*env
, int signo
, int sigcode
)
3441 target_siginfo_t info
;
3443 info
.si_signo
= signo
;
3445 info
._sifields
._sigfault
._addr
= env
->pc
;
3447 if (signo
== TARGET_SIGSEGV
) {
3448 /* The passed in sigcode is a dummy; check for a page mapping
3449 and pass either MAPERR or ACCERR. */
3450 target_ulong addr
= env
->excaddr
;
3451 info
._sifields
._sigfault
._addr
= addr
;
3452 if (page_check_range(addr
, 1, PAGE_VALID
) < 0) {
3453 sigcode
= TARGET_SEGV_MAPERR
;
3455 sigcode
= TARGET_SEGV_ACCERR
;
3458 info
.si_code
= sigcode
;
3460 queue_signal(env
, info
.si_signo
, QEMU_SI_FAULT
, &info
);
3463 static void gen_sigsegv_maperr(CPUTLGState
*env
, target_ulong addr
)
3465 env
->excaddr
= addr
;
3466 do_signal(env
, TARGET_SIGSEGV
, 0);
3469 static void set_regval(CPUTLGState
*env
, uint8_t reg
, uint64_t val
)
3471 if (unlikely(reg
>= TILEGX_R_COUNT
)) {
3482 gen_sigill_reg(env
);
3485 g_assert_not_reached();
3488 env
->regs
[reg
] = val
;
3492 * Compare the 8-byte contents of the CmpValue SPR with the 8-byte value in
3493 * memory at the address held in the first source register. If the values are
3494 * not equal, then no memory operation is performed. If the values are equal,
3495 * the 8-byte quantity from the second source register is written into memory
3496 * at the address held in the first source register. In either case, the result
3497 * of the instruction is the value read from memory. The compare and write to
3498 * memory are atomic and thus can be used for synchronization purposes. This
3499 * instruction only operates for addresses aligned to a 8-byte boundary.
3500 * Unaligned memory access causes an Unaligned Data Reference interrupt.
3502 * Functional Description (64-bit)
3503 * uint64_t memVal = memoryReadDoubleWord (rf[SrcA]);
3504 * rf[Dest] = memVal;
3505 * if (memVal == SPR[CmpValueSPR])
3506 * memoryWriteDoubleWord (rf[SrcA], rf[SrcB]);
3508 * Functional Description (32-bit)
3509 * uint64_t memVal = signExtend32 (memoryReadWord (rf[SrcA]));
3510 * rf[Dest] = memVal;
3511 * if (memVal == signExtend32 (SPR[CmpValueSPR]))
3512 * memoryWriteWord (rf[SrcA], rf[SrcB]);
3515 * This function also processes exch and exch4 which need not process SPR.
3517 static void do_exch(CPUTLGState
*env
, bool quad
, bool cmp
)
3520 target_long val
, sprval
;
3524 addr
= env
->atomic_srca
;
3525 if (quad
? get_user_s64(val
, addr
) : get_user_s32(val
, addr
)) {
3526 goto sigsegv_maperr
;
3531 sprval
= env
->spregs
[TILEGX_SPR_CMPEXCH
];
3533 sprval
= sextract64(env
->spregs
[TILEGX_SPR_CMPEXCH
], 0, 32);
3537 if (!cmp
|| val
== sprval
) {
3538 target_long valb
= env
->atomic_srcb
;
3539 if (quad
? put_user_u64(valb
, addr
) : put_user_u32(valb
, addr
)) {
3540 goto sigsegv_maperr
;
3544 set_regval(env
, env
->atomic_dstr
, val
);
3550 gen_sigsegv_maperr(env
, addr
);
3553 static void do_fetch(CPUTLGState
*env
, int trapnr
, bool quad
)
3557 target_long val
, valb
;
3561 addr
= env
->atomic_srca
;
3562 valb
= env
->atomic_srcb
;
3563 if (quad
? get_user_s64(val
, addr
) : get_user_s32(val
, addr
)) {
3564 goto sigsegv_maperr
;
3568 case TILEGX_EXCP_OPCODE_FETCHADD
:
3569 case TILEGX_EXCP_OPCODE_FETCHADD4
:
3572 case TILEGX_EXCP_OPCODE_FETCHADDGEZ
:
3578 case TILEGX_EXCP_OPCODE_FETCHADDGEZ4
:
3580 if ((int32_t)valb
< 0) {
3584 case TILEGX_EXCP_OPCODE_FETCHAND
:
3585 case TILEGX_EXCP_OPCODE_FETCHAND4
:
3588 case TILEGX_EXCP_OPCODE_FETCHOR
:
3589 case TILEGX_EXCP_OPCODE_FETCHOR4
:
3593 g_assert_not_reached();
3597 if (quad
? put_user_u64(valb
, addr
) : put_user_u32(valb
, addr
)) {
3598 goto sigsegv_maperr
;
3602 set_regval(env
, env
->atomic_dstr
, val
);
3608 gen_sigsegv_maperr(env
, addr
);
3611 void cpu_loop(CPUTLGState
*env
)
3613 CPUState
*cs
= CPU(tilegx_env_get_cpu(env
));
3618 trapnr
= cpu_exec(cs
);
3620 process_queued_cpu_work(cs
);
3623 case TILEGX_EXCP_SYSCALL
:
3625 abi_ulong ret
= do_syscall(env
, env
->regs
[TILEGX_R_NR
],
3626 env
->regs
[0], env
->regs
[1],
3627 env
->regs
[2], env
->regs
[3],
3628 env
->regs
[4], env
->regs
[5],
3629 env
->regs
[6], env
->regs
[7]);
3630 if (ret
== -TARGET_ERESTARTSYS
) {
3632 } else if (ret
!= -TARGET_QEMU_ESIGRETURN
) {
3633 env
->regs
[TILEGX_R_RE
] = ret
;
3634 env
->regs
[TILEGX_R_ERR
] = TILEGX_IS_ERRNO(ret
) ? -ret
: 0;
3638 case TILEGX_EXCP_OPCODE_EXCH
:
3639 do_exch(env
, true, false);
3641 case TILEGX_EXCP_OPCODE_EXCH4
:
3642 do_exch(env
, false, false);
3644 case TILEGX_EXCP_OPCODE_CMPEXCH
:
3645 do_exch(env
, true, true);
3647 case TILEGX_EXCP_OPCODE_CMPEXCH4
:
3648 do_exch(env
, false, true);
3650 case TILEGX_EXCP_OPCODE_FETCHADD
:
3651 case TILEGX_EXCP_OPCODE_FETCHADDGEZ
:
3652 case TILEGX_EXCP_OPCODE_FETCHAND
:
3653 case TILEGX_EXCP_OPCODE_FETCHOR
:
3654 do_fetch(env
, trapnr
, true);
3656 case TILEGX_EXCP_OPCODE_FETCHADD4
:
3657 case TILEGX_EXCP_OPCODE_FETCHADDGEZ4
:
3658 case TILEGX_EXCP_OPCODE_FETCHAND4
:
3659 case TILEGX_EXCP_OPCODE_FETCHOR4
:
3660 do_fetch(env
, trapnr
, false);
3662 case TILEGX_EXCP_SIGNAL
:
3663 do_signal(env
, env
->signo
, env
->sigcode
);
3665 case TILEGX_EXCP_REG_IDN_ACCESS
:
3666 case TILEGX_EXCP_REG_UDN_ACCESS
:
3667 gen_sigill_reg(env
);
3670 cpu_exec_step_atomic(cs
);
3673 fprintf(stderr
, "trapnr is %d[0x%x].\n", trapnr
, trapnr
);
3674 g_assert_not_reached();
3676 process_pending_signals(env
);
3682 THREAD CPUState
*thread_cpu
;
3684 bool qemu_cpu_is_self(CPUState
*cpu
)
3686 return thread_cpu
== cpu
;
3689 void qemu_cpu_kick(CPUState
*cpu
)
3694 void task_settid(TaskState
*ts
)
3696 if (ts
->ts_tid
== 0) {
3697 ts
->ts_tid
= (pid_t
)syscall(SYS_gettid
);
3701 void stop_all_tasks(void)
3704 * We trust that when using NPTL, start_exclusive()
3705 * handles thread stopping correctly.
3710 /* Assumes contents are already zeroed. */
3711 void init_task_state(TaskState
*ts
)
3716 CPUArchState
*cpu_copy(CPUArchState
*env
)
3718 CPUState
*cpu
= ENV_GET_CPU(env
);
3719 CPUState
*new_cpu
= cpu_init(cpu_model
);
3720 CPUArchState
*new_env
= new_cpu
->env_ptr
;
3724 /* Reset non arch specific state */
3727 memcpy(new_env
, env
, sizeof(CPUArchState
));
3729 /* Clone all break/watchpoints.
3730 Note: Once we support ptrace with hw-debug register access, make sure
3731 BP_CPU break/watchpoints are handled correctly on clone. */
3732 QTAILQ_INIT(&new_cpu
->breakpoints
);
3733 QTAILQ_INIT(&new_cpu
->watchpoints
);
3734 QTAILQ_FOREACH(bp
, &cpu
->breakpoints
, entry
) {
3735 cpu_breakpoint_insert(new_cpu
, bp
->pc
, bp
->flags
, NULL
);
3737 QTAILQ_FOREACH(wp
, &cpu
->watchpoints
, entry
) {
3738 cpu_watchpoint_insert(new_cpu
, wp
->vaddr
, wp
->len
, wp
->flags
, NULL
);
3744 static void handle_arg_help(const char *arg
)
3746 usage(EXIT_SUCCESS
);
3749 static void handle_arg_log(const char *arg
)
3753 mask
= qemu_str_to_log_mask(arg
);
3755 qemu_print_log_usage(stdout
);
3758 qemu_log_needs_buffers();
3762 static void handle_arg_log_filename(const char *arg
)
3764 qemu_set_log_filename(arg
, &error_fatal
);
3767 static void handle_arg_set_env(const char *arg
)
3769 char *r
, *p
, *token
;
3770 r
= p
= strdup(arg
);
3771 while ((token
= strsep(&p
, ",")) != NULL
) {
3772 if (envlist_setenv(envlist
, token
) != 0) {
3773 usage(EXIT_FAILURE
);
3779 static void handle_arg_unset_env(const char *arg
)
3781 char *r
, *p
, *token
;
3782 r
= p
= strdup(arg
);
3783 while ((token
= strsep(&p
, ",")) != NULL
) {
3784 if (envlist_unsetenv(envlist
, token
) != 0) {
3785 usage(EXIT_FAILURE
);
3791 static void handle_arg_argv0(const char *arg
)
3793 argv0
= strdup(arg
);
3796 static void handle_arg_stack_size(const char *arg
)
3799 guest_stack_size
= strtoul(arg
, &p
, 0);
3800 if (guest_stack_size
== 0) {
3801 usage(EXIT_FAILURE
);
3805 guest_stack_size
*= 1024 * 1024;
3806 } else if (*p
== 'k' || *p
== 'K') {
3807 guest_stack_size
*= 1024;
3811 static void handle_arg_ld_prefix(const char *arg
)
3813 interp_prefix
= strdup(arg
);
3816 static void handle_arg_pagesize(const char *arg
)
3818 qemu_host_page_size
= atoi(arg
);
3819 if (qemu_host_page_size
== 0 ||
3820 (qemu_host_page_size
& (qemu_host_page_size
- 1)) != 0) {
3821 fprintf(stderr
, "page size must be a power of two\n");
3826 static void handle_arg_randseed(const char *arg
)
3828 unsigned long long seed
;
3830 if (parse_uint_full(arg
, &seed
, 0) != 0 || seed
> UINT_MAX
) {
3831 fprintf(stderr
, "Invalid seed number: %s\n", arg
);
3837 static void handle_arg_gdb(const char *arg
)
3839 gdbstub_port
= atoi(arg
);
3842 static void handle_arg_uname(const char *arg
)
3844 qemu_uname_release
= strdup(arg
);
3847 static void handle_arg_cpu(const char *arg
)
3849 cpu_model
= strdup(arg
);
3850 if (cpu_model
== NULL
|| is_help_option(cpu_model
)) {
3851 /* XXX: implement xxx_cpu_list for targets that still miss it */
3852 #if defined(cpu_list)
3853 cpu_list(stdout
, &fprintf
);
3859 static void handle_arg_guest_base(const char *arg
)
3861 guest_base
= strtol(arg
, NULL
, 0);
3862 have_guest_base
= 1;
3865 static void handle_arg_reserved_va(const char *arg
)
3869 reserved_va
= strtoul(arg
, &p
, 0);
3883 unsigned long unshifted
= reserved_va
;
3885 reserved_va
<<= shift
;
3886 if (((reserved_va
>> shift
) != unshifted
)
3887 #if HOST_LONG_BITS > TARGET_VIRT_ADDR_SPACE_BITS
3888 || (reserved_va
> (1ul << TARGET_VIRT_ADDR_SPACE_BITS
))
3891 fprintf(stderr
, "Reserved virtual address too big\n");
3896 fprintf(stderr
, "Unrecognised -R size suffix '%s'\n", p
);
3901 static void handle_arg_singlestep(const char *arg
)
3906 static void handle_arg_strace(const char *arg
)
3911 static void handle_arg_version(const char *arg
)
3913 printf("qemu-" TARGET_NAME
" version " QEMU_VERSION QEMU_PKGVERSION
3914 "\n" QEMU_COPYRIGHT
"\n");
3918 static char *trace_file
;
3919 static void handle_arg_trace(const char *arg
)
3922 trace_file
= trace_opt_parse(arg
);
3925 struct qemu_argument
{
3929 void (*handle_opt
)(const char *arg
);
3930 const char *example
;
3934 static const struct qemu_argument arg_table
[] = {
3935 {"h", "", false, handle_arg_help
,
3936 "", "print this help"},
3937 {"help", "", false, handle_arg_help
,
3939 {"g", "QEMU_GDB", true, handle_arg_gdb
,
3940 "port", "wait gdb connection to 'port'"},
3941 {"L", "QEMU_LD_PREFIX", true, handle_arg_ld_prefix
,
3942 "path", "set the elf interpreter prefix to 'path'"},
3943 {"s", "QEMU_STACK_SIZE", true, handle_arg_stack_size
,
3944 "size", "set the stack size to 'size' bytes"},
3945 {"cpu", "QEMU_CPU", true, handle_arg_cpu
,
3946 "model", "select CPU (-cpu help for list)"},
3947 {"E", "QEMU_SET_ENV", true, handle_arg_set_env
,
3948 "var=value", "sets targets environment variable (see below)"},
3949 {"U", "QEMU_UNSET_ENV", true, handle_arg_unset_env
,
3950 "var", "unsets targets environment variable (see below)"},
3951 {"0", "QEMU_ARGV0", true, handle_arg_argv0
,
3952 "argv0", "forces target process argv[0] to be 'argv0'"},
3953 {"r", "QEMU_UNAME", true, handle_arg_uname
,
3954 "uname", "set qemu uname release string to 'uname'"},
3955 {"B", "QEMU_GUEST_BASE", true, handle_arg_guest_base
,
3956 "address", "set guest_base address to 'address'"},
3957 {"R", "QEMU_RESERVED_VA", true, handle_arg_reserved_va
,
3958 "size", "reserve 'size' bytes for guest virtual address space"},
3959 {"d", "QEMU_LOG", true, handle_arg_log
,
3960 "item[,...]", "enable logging of specified items "
3961 "(use '-d help' for a list of items)"},
3962 {"D", "QEMU_LOG_FILENAME", true, handle_arg_log_filename
,
3963 "logfile", "write logs to 'logfile' (default stderr)"},
3964 {"p", "QEMU_PAGESIZE", true, handle_arg_pagesize
,
3965 "pagesize", "set the host page size to 'pagesize'"},
3966 {"singlestep", "QEMU_SINGLESTEP", false, handle_arg_singlestep
,
3967 "", "run in singlestep mode"},
3968 {"strace", "QEMU_STRACE", false, handle_arg_strace
,
3969 "", "log system calls"},
3970 {"seed", "QEMU_RAND_SEED", true, handle_arg_randseed
,
3971 "", "Seed for pseudo-random number generator"},
3972 {"trace", "QEMU_TRACE", true, handle_arg_trace
,
3973 "", "[[enable=]<pattern>][,events=<file>][,file=<file>]"},
3974 {"version", "QEMU_VERSION", false, handle_arg_version
,
3975 "", "display version information and exit"},
3976 {NULL
, NULL
, false, NULL
, NULL
, NULL
}
3979 static void usage(int exitcode
)
3981 const struct qemu_argument
*arginfo
;
3985 printf("usage: qemu-" TARGET_NAME
" [options] program [arguments...]\n"
3986 "Linux CPU emulator (compiled for " TARGET_NAME
" emulation)\n"
3988 "Options and associated environment variables:\n"
3991 /* Calculate column widths. We must always have at least enough space
3992 * for the column header.
3994 maxarglen
= strlen("Argument");
3995 maxenvlen
= strlen("Env-variable");
3997 for (arginfo
= arg_table
; arginfo
->handle_opt
!= NULL
; arginfo
++) {
3998 int arglen
= strlen(arginfo
->argv
);
3999 if (arginfo
->has_arg
) {
4000 arglen
+= strlen(arginfo
->example
) + 1;
4002 if (strlen(arginfo
->env
) > maxenvlen
) {
4003 maxenvlen
= strlen(arginfo
->env
);
4005 if (arglen
> maxarglen
) {
4010 printf("%-*s %-*s Description\n", maxarglen
+1, "Argument",
4011 maxenvlen
, "Env-variable");
4013 for (arginfo
= arg_table
; arginfo
->handle_opt
!= NULL
; arginfo
++) {
4014 if (arginfo
->has_arg
) {
4015 printf("-%s %-*s %-*s %s\n", arginfo
->argv
,
4016 (int)(maxarglen
- strlen(arginfo
->argv
) - 1),
4017 arginfo
->example
, maxenvlen
, arginfo
->env
, arginfo
->help
);
4019 printf("-%-*s %-*s %s\n", maxarglen
, arginfo
->argv
,
4020 maxenvlen
, arginfo
->env
,
4027 "QEMU_LD_PREFIX = %s\n"
4028 "QEMU_STACK_SIZE = %ld byte\n",
4033 "You can use -E and -U options or the QEMU_SET_ENV and\n"
4034 "QEMU_UNSET_ENV environment variables to set and unset\n"
4035 "environment variables for the target process.\n"
4036 "It is possible to provide several variables by separating them\n"
4037 "by commas in getsubopt(3) style. Additionally it is possible to\n"
4038 "provide the -E and -U options multiple times.\n"
4039 "The following lines are equivalent:\n"
4040 " -E var1=val2 -E var2=val2 -U LD_PRELOAD -U LD_DEBUG\n"
4041 " -E var1=val2,var2=val2 -U LD_PRELOAD,LD_DEBUG\n"
4042 " QEMU_SET_ENV=var1=val2,var2=val2 QEMU_UNSET_ENV=LD_PRELOAD,LD_DEBUG\n"
4043 "Note that if you provide several changes to a single variable\n"
4044 "the last change will stay in effect.\n");
4049 static int parse_args(int argc
, char **argv
)
4053 const struct qemu_argument
*arginfo
;
4055 for (arginfo
= arg_table
; arginfo
->handle_opt
!= NULL
; arginfo
++) {
4056 if (arginfo
->env
== NULL
) {
4060 r
= getenv(arginfo
->env
);
4062 arginfo
->handle_opt(r
);
4068 if (optind
>= argc
) {
4077 if (!strcmp(r
, "-")) {
4080 /* Treat --foo the same as -foo. */
4085 for (arginfo
= arg_table
; arginfo
->handle_opt
!= NULL
; arginfo
++) {
4086 if (!strcmp(r
, arginfo
->argv
)) {
4087 if (arginfo
->has_arg
) {
4088 if (optind
>= argc
) {
4089 (void) fprintf(stderr
,
4090 "qemu: missing argument for option '%s'\n", r
);
4093 arginfo
->handle_opt(argv
[optind
]);
4096 arginfo
->handle_opt(NULL
);
4102 /* no option matched the current argv */
4103 if (arginfo
->handle_opt
== NULL
) {
4104 (void) fprintf(stderr
, "qemu: unknown option '%s'\n", r
);
4109 if (optind
>= argc
) {
4110 (void) fprintf(stderr
, "qemu: no user program specified\n");
4114 filename
= argv
[optind
];
4115 exec_path
= argv
[optind
];
4120 int main(int argc
, char **argv
, char **envp
)
4122 struct target_pt_regs regs1
, *regs
= ®s1
;
4123 struct image_info info1
, *info
= &info1
;
4124 struct linux_binprm bprm
;
4129 char **target_environ
, **wrk
;
4136 module_call_init(MODULE_INIT_TRACE
);
4137 qemu_init_cpu_list();
4138 module_call_init(MODULE_INIT_QOM
);
4140 if ((envlist
= envlist_create()) == NULL
) {
4141 (void) fprintf(stderr
, "Unable to allocate envlist\n");
4145 /* add current environment into the list */
4146 for (wrk
= environ
; *wrk
!= NULL
; wrk
++) {
4147 (void) envlist_setenv(envlist
, *wrk
);
4150 /* Read the stack limit from the kernel. If it's "unlimited",
4151 then we can do little else besides use the default. */
4154 if (getrlimit(RLIMIT_STACK
, &lim
) == 0
4155 && lim
.rlim_cur
!= RLIM_INFINITY
4156 && lim
.rlim_cur
== (target_long
)lim
.rlim_cur
) {
4157 guest_stack_size
= lim
.rlim_cur
;
4165 qemu_add_opts(&qemu_trace_opts
);
4167 optind
= parse_args(argc
, argv
);
4169 if (!trace_init_backends()) {
4172 trace_init_file(trace_file
);
4175 memset(regs
, 0, sizeof(struct target_pt_regs
));
4177 /* Zero out image_info */
4178 memset(info
, 0, sizeof(struct image_info
));
4180 memset(&bprm
, 0, sizeof (bprm
));
4182 /* Scan interp_prefix dir for replacement files. */
4183 init_paths(interp_prefix
);
4185 init_qemu_uname_release();
4187 if (cpu_model
== NULL
) {
4188 #if defined(TARGET_I386)
4189 #ifdef TARGET_X86_64
4190 cpu_model
= "qemu64";
4192 cpu_model
= "qemu32";
4194 #elif defined(TARGET_ARM)
4196 #elif defined(TARGET_UNICORE32)
4198 #elif defined(TARGET_M68K)
4200 #elif defined(TARGET_SPARC)
4201 #ifdef TARGET_SPARC64
4202 cpu_model
= "TI UltraSparc II";
4204 cpu_model
= "Fujitsu MB86904";
4206 #elif defined(TARGET_MIPS)
4207 #if defined(TARGET_ABI_MIPSN32) || defined(TARGET_ABI_MIPSN64)
4212 #elif defined TARGET_OPENRISC
4213 cpu_model
= "or1200";
4214 #elif defined(TARGET_PPC)
4215 # ifdef TARGET_PPC64
4216 cpu_model
= "POWER8";
4220 #elif defined TARGET_SH4
4221 cpu_model
= TYPE_SH7785_CPU
;
4227 /* NOTE: we need to init the CPU at this stage to get
4228 qemu_host_page_size */
4229 cpu
= cpu_init(cpu_model
);
4231 fprintf(stderr
, "Unable to find CPU definition\n");
4239 if (getenv("QEMU_STRACE")) {
4243 if (getenv("QEMU_RAND_SEED")) {
4244 handle_arg_randseed(getenv("QEMU_RAND_SEED"));
4247 target_environ
= envlist_to_environ(envlist
, NULL
);
4248 envlist_free(envlist
);
4251 * Now that page sizes are configured in cpu_init() we can do
4252 * proper page alignment for guest_base.
4254 guest_base
= HOST_PAGE_ALIGN(guest_base
);
4256 if (reserved_va
|| have_guest_base
) {
4257 guest_base
= init_guest_space(guest_base
, reserved_va
, 0,
4259 if (guest_base
== (unsigned long)-1) {
4260 fprintf(stderr
, "Unable to reserve 0x%lx bytes of virtual address "
4261 "space for use as guest address space (check your virtual "
4262 "memory ulimit setting or reserve less using -R option)\n",
4268 mmap_next_start
= reserved_va
;
4273 * Read in mmap_min_addr kernel parameter. This value is used
4274 * When loading the ELF image to determine whether guest_base
4275 * is needed. It is also used in mmap_find_vma.
4280 if ((fp
= fopen("/proc/sys/vm/mmap_min_addr", "r")) != NULL
) {
4282 if (fscanf(fp
, "%lu", &tmp
) == 1) {
4283 mmap_min_addr
= tmp
;
4284 qemu_log_mask(CPU_LOG_PAGE
, "host mmap_min_addr=0x%lx\n", mmap_min_addr
);
4291 * Prepare copy of argv vector for target.
4293 target_argc
= argc
- optind
;
4294 target_argv
= calloc(target_argc
+ 1, sizeof (char *));
4295 if (target_argv
== NULL
) {
4296 (void) fprintf(stderr
, "Unable to allocate memory for target_argv\n");
4301 * If argv0 is specified (using '-0' switch) we replace
4302 * argv[0] pointer with the given one.
4305 if (argv0
!= NULL
) {
4306 target_argv
[i
++] = strdup(argv0
);
4308 for (; i
< target_argc
; i
++) {
4309 target_argv
[i
] = strdup(argv
[optind
+ i
]);
4311 target_argv
[target_argc
] = NULL
;
4313 ts
= g_new0(TaskState
, 1);
4314 init_task_state(ts
);
4315 /* build Task State */
4321 execfd
= qemu_getauxval(AT_EXECFD
);
4323 execfd
= open(filename
, O_RDONLY
);
4325 printf("Error while loading %s: %s\n", filename
, strerror(errno
));
4326 _exit(EXIT_FAILURE
);
4330 ret
= loader_exec(execfd
, filename
, target_argv
, target_environ
, regs
,
4333 printf("Error while loading %s: %s\n", filename
, strerror(-ret
));
4334 _exit(EXIT_FAILURE
);
4337 for (wrk
= target_environ
; *wrk
; wrk
++) {
4341 free(target_environ
);
4343 if (qemu_loglevel_mask(CPU_LOG_PAGE
)) {
4344 qemu_log("guest_base 0x%lx\n", guest_base
);
4347 qemu_log("start_brk 0x" TARGET_ABI_FMT_lx
"\n", info
->start_brk
);
4348 qemu_log("end_code 0x" TARGET_ABI_FMT_lx
"\n", info
->end_code
);
4349 qemu_log("start_code 0x" TARGET_ABI_FMT_lx
"\n",
4351 qemu_log("start_data 0x" TARGET_ABI_FMT_lx
"\n",
4353 qemu_log("end_data 0x" TARGET_ABI_FMT_lx
"\n", info
->end_data
);
4354 qemu_log("start_stack 0x" TARGET_ABI_FMT_lx
"\n",
4356 qemu_log("brk 0x" TARGET_ABI_FMT_lx
"\n", info
->brk
);
4357 qemu_log("entry 0x" TARGET_ABI_FMT_lx
"\n", info
->entry
);
4360 target_set_brk(info
->brk
);
4364 /* Now that we've loaded the binary, GUEST_BASE is fixed. Delay
4365 generating the prologue until now so that the prologue can take
4366 the real value of GUEST_BASE into account. */
4367 tcg_prologue_init(&tcg_ctx
);
4369 #if defined(TARGET_I386)
4370 env
->cr
[0] = CR0_PG_MASK
| CR0_WP_MASK
| CR0_PE_MASK
;
4371 env
->hflags
|= HF_PE_MASK
| HF_CPL_MASK
;
4372 if (env
->features
[FEAT_1_EDX
] & CPUID_SSE
) {
4373 env
->cr
[4] |= CR4_OSFXSR_MASK
;
4374 env
->hflags
|= HF_OSFXSR_MASK
;
4376 #ifndef TARGET_ABI32
4377 /* enable 64 bit mode if possible */
4378 if (!(env
->features
[FEAT_8000_0001_EDX
] & CPUID_EXT2_LM
)) {
4379 fprintf(stderr
, "The selected x86 CPU does not support 64 bit mode\n");
4382 env
->cr
[4] |= CR4_PAE_MASK
;
4383 env
->efer
|= MSR_EFER_LMA
| MSR_EFER_LME
;
4384 env
->hflags
|= HF_LMA_MASK
;
4387 /* flags setup : we activate the IRQs by default as in user mode */
4388 env
->eflags
|= IF_MASK
;
4390 /* linux register setup */
4391 #ifndef TARGET_ABI32
4392 env
->regs
[R_EAX
] = regs
->rax
;
4393 env
->regs
[R_EBX
] = regs
->rbx
;
4394 env
->regs
[R_ECX
] = regs
->rcx
;
4395 env
->regs
[R_EDX
] = regs
->rdx
;
4396 env
->regs
[R_ESI
] = regs
->rsi
;
4397 env
->regs
[R_EDI
] = regs
->rdi
;
4398 env
->regs
[R_EBP
] = regs
->rbp
;
4399 env
->regs
[R_ESP
] = regs
->rsp
;
4400 env
->eip
= regs
->rip
;
4402 env
->regs
[R_EAX
] = regs
->eax
;
4403 env
->regs
[R_EBX
] = regs
->ebx
;
4404 env
->regs
[R_ECX
] = regs
->ecx
;
4405 env
->regs
[R_EDX
] = regs
->edx
;
4406 env
->regs
[R_ESI
] = regs
->esi
;
4407 env
->regs
[R_EDI
] = regs
->edi
;
4408 env
->regs
[R_EBP
] = regs
->ebp
;
4409 env
->regs
[R_ESP
] = regs
->esp
;
4410 env
->eip
= regs
->eip
;
4413 /* linux interrupt setup */
4414 #ifndef TARGET_ABI32
4415 env
->idt
.limit
= 511;
4417 env
->idt
.limit
= 255;
4419 env
->idt
.base
= target_mmap(0, sizeof(uint64_t) * (env
->idt
.limit
+ 1),
4420 PROT_READ
|PROT_WRITE
,
4421 MAP_ANONYMOUS
|MAP_PRIVATE
, -1, 0);
4422 idt_table
= g2h(env
->idt
.base
);
4445 /* linux segment setup */
4447 uint64_t *gdt_table
;
4448 env
->gdt
.base
= target_mmap(0, sizeof(uint64_t) * TARGET_GDT_ENTRIES
,
4449 PROT_READ
|PROT_WRITE
,
4450 MAP_ANONYMOUS
|MAP_PRIVATE
, -1, 0);
4451 env
->gdt
.limit
= sizeof(uint64_t) * TARGET_GDT_ENTRIES
- 1;
4452 gdt_table
= g2h(env
->gdt
.base
);
4454 write_dt(&gdt_table
[__USER_CS
>> 3], 0, 0xfffff,
4455 DESC_G_MASK
| DESC_B_MASK
| DESC_P_MASK
| DESC_S_MASK
|
4456 (3 << DESC_DPL_SHIFT
) | (0xa << DESC_TYPE_SHIFT
));
4458 /* 64 bit code segment */
4459 write_dt(&gdt_table
[__USER_CS
>> 3], 0, 0xfffff,
4460 DESC_G_MASK
| DESC_B_MASK
| DESC_P_MASK
| DESC_S_MASK
|
4462 (3 << DESC_DPL_SHIFT
) | (0xa << DESC_TYPE_SHIFT
));
4464 write_dt(&gdt_table
[__USER_DS
>> 3], 0, 0xfffff,
4465 DESC_G_MASK
| DESC_B_MASK
| DESC_P_MASK
| DESC_S_MASK
|
4466 (3 << DESC_DPL_SHIFT
) | (0x2 << DESC_TYPE_SHIFT
));
4468 cpu_x86_load_seg(env
, R_CS
, __USER_CS
);
4469 cpu_x86_load_seg(env
, R_SS
, __USER_DS
);
4471 cpu_x86_load_seg(env
, R_DS
, __USER_DS
);
4472 cpu_x86_load_seg(env
, R_ES
, __USER_DS
);
4473 cpu_x86_load_seg(env
, R_FS
, __USER_DS
);
4474 cpu_x86_load_seg(env
, R_GS
, __USER_DS
);
4475 /* This hack makes Wine work... */
4476 env
->segs
[R_FS
].selector
= 0;
4478 cpu_x86_load_seg(env
, R_DS
, 0);
4479 cpu_x86_load_seg(env
, R_ES
, 0);
4480 cpu_x86_load_seg(env
, R_FS
, 0);
4481 cpu_x86_load_seg(env
, R_GS
, 0);
4483 #elif defined(TARGET_AARCH64)
4487 if (!(arm_feature(env
, ARM_FEATURE_AARCH64
))) {
4489 "The selected ARM CPU does not support 64 bit mode\n");
4493 for (i
= 0; i
< 31; i
++) {
4494 env
->xregs
[i
] = regs
->regs
[i
];
4497 env
->xregs
[31] = regs
->sp
;
4499 #elif defined(TARGET_ARM)
4502 cpsr_write(env
, regs
->uregs
[16], CPSR_USER
| CPSR_EXEC
,
4504 for(i
= 0; i
< 16; i
++) {
4505 env
->regs
[i
] = regs
->uregs
[i
];
4507 #ifdef TARGET_WORDS_BIGENDIAN
4509 if (EF_ARM_EABI_VERSION(info
->elf_flags
) >= EF_ARM_EABI_VER4
4510 && (info
->elf_flags
& EF_ARM_BE8
)) {
4511 env
->uncached_cpsr
|= CPSR_E
;
4512 env
->cp15
.sctlr_el
[1] |= SCTLR_E0E
;
4514 env
->cp15
.sctlr_el
[1] |= SCTLR_B
;
4518 #elif defined(TARGET_UNICORE32)
4521 cpu_asr_write(env
, regs
->uregs
[32], 0xffffffff);
4522 for (i
= 0; i
< 32; i
++) {
4523 env
->regs
[i
] = regs
->uregs
[i
];
4526 #elif defined(TARGET_SPARC)
4530 env
->npc
= regs
->npc
;
4532 for(i
= 0; i
< 8; i
++)
4533 env
->gregs
[i
] = regs
->u_regs
[i
];
4534 for(i
= 0; i
< 8; i
++)
4535 env
->regwptr
[i
] = regs
->u_regs
[i
+ 8];
4537 #elif defined(TARGET_PPC)
4541 #if defined(TARGET_PPC64)
4542 int flag
= (env
->insns_flags2
& PPC2_BOOKE206
) ? MSR_CM
: MSR_SF
;
4543 #if defined(TARGET_ABI32)
4544 env
->msr
&= ~((target_ulong
)1 << flag
);
4546 env
->msr
|= (target_ulong
)1 << flag
;
4549 env
->nip
= regs
->nip
;
4550 for(i
= 0; i
< 32; i
++) {
4551 env
->gpr
[i
] = regs
->gpr
[i
];
4554 #elif defined(TARGET_M68K)
4557 env
->dregs
[0] = regs
->d0
;
4558 env
->dregs
[1] = regs
->d1
;
4559 env
->dregs
[2] = regs
->d2
;
4560 env
->dregs
[3] = regs
->d3
;
4561 env
->dregs
[4] = regs
->d4
;
4562 env
->dregs
[5] = regs
->d5
;
4563 env
->dregs
[6] = regs
->d6
;
4564 env
->dregs
[7] = regs
->d7
;
4565 env
->aregs
[0] = regs
->a0
;
4566 env
->aregs
[1] = regs
->a1
;
4567 env
->aregs
[2] = regs
->a2
;
4568 env
->aregs
[3] = regs
->a3
;
4569 env
->aregs
[4] = regs
->a4
;
4570 env
->aregs
[5] = regs
->a5
;
4571 env
->aregs
[6] = regs
->a6
;
4572 env
->aregs
[7] = regs
->usp
;
4574 ts
->sim_syscalls
= 1;
4576 #elif defined(TARGET_MICROBLAZE)
4578 env
->regs
[0] = regs
->r0
;
4579 env
->regs
[1] = regs
->r1
;
4580 env
->regs
[2] = regs
->r2
;
4581 env
->regs
[3] = regs
->r3
;
4582 env
->regs
[4] = regs
->r4
;
4583 env
->regs
[5] = regs
->r5
;
4584 env
->regs
[6] = regs
->r6
;
4585 env
->regs
[7] = regs
->r7
;
4586 env
->regs
[8] = regs
->r8
;
4587 env
->regs
[9] = regs
->r9
;
4588 env
->regs
[10] = regs
->r10
;
4589 env
->regs
[11] = regs
->r11
;
4590 env
->regs
[12] = regs
->r12
;
4591 env
->regs
[13] = regs
->r13
;
4592 env
->regs
[14] = regs
->r14
;
4593 env
->regs
[15] = regs
->r15
;
4594 env
->regs
[16] = regs
->r16
;
4595 env
->regs
[17] = regs
->r17
;
4596 env
->regs
[18] = regs
->r18
;
4597 env
->regs
[19] = regs
->r19
;
4598 env
->regs
[20] = regs
->r20
;
4599 env
->regs
[21] = regs
->r21
;
4600 env
->regs
[22] = regs
->r22
;
4601 env
->regs
[23] = regs
->r23
;
4602 env
->regs
[24] = regs
->r24
;
4603 env
->regs
[25] = regs
->r25
;
4604 env
->regs
[26] = regs
->r26
;
4605 env
->regs
[27] = regs
->r27
;
4606 env
->regs
[28] = regs
->r28
;
4607 env
->regs
[29] = regs
->r29
;
4608 env
->regs
[30] = regs
->r30
;
4609 env
->regs
[31] = regs
->r31
;
4610 env
->sregs
[SR_PC
] = regs
->pc
;
4612 #elif defined(TARGET_MIPS)
4616 for(i
= 0; i
< 32; i
++) {
4617 env
->active_tc
.gpr
[i
] = regs
->regs
[i
];
4619 env
->active_tc
.PC
= regs
->cp0_epc
& ~(target_ulong
)1;
4620 if (regs
->cp0_epc
& 1) {
4621 env
->hflags
|= MIPS_HFLAG_M16
;
4623 if (((info
->elf_flags
& EF_MIPS_NAN2008
) != 0) !=
4624 ((env
->active_fpu
.fcr31
& (1 << FCR31_NAN2008
)) != 0)) {
4625 if ((env
->active_fpu
.fcr31_rw_bitmask
&
4626 (1 << FCR31_NAN2008
)) == 0) {
4627 fprintf(stderr
, "ELF binary's NaN mode not supported by CPU\n");
4630 if ((info
->elf_flags
& EF_MIPS_NAN2008
) != 0) {
4631 env
->active_fpu
.fcr31
|= (1 << FCR31_NAN2008
);
4633 env
->active_fpu
.fcr31
&= ~(1 << FCR31_NAN2008
);
4635 restore_snan_bit_mode(env
);
4638 #elif defined(TARGET_OPENRISC)
4642 for (i
= 0; i
< 32; i
++) {
4643 env
->gpr
[i
] = regs
->gpr
[i
];
4649 #elif defined(TARGET_SH4)
4653 for(i
= 0; i
< 16; i
++) {
4654 env
->gregs
[i
] = regs
->regs
[i
];
4658 #elif defined(TARGET_ALPHA)
4662 for(i
= 0; i
< 28; i
++) {
4663 env
->ir
[i
] = ((abi_ulong
*)regs
)[i
];
4665 env
->ir
[IR_SP
] = regs
->usp
;
4668 #elif defined(TARGET_CRIS)
4670 env
->regs
[0] = regs
->r0
;
4671 env
->regs
[1] = regs
->r1
;
4672 env
->regs
[2] = regs
->r2
;
4673 env
->regs
[3] = regs
->r3
;
4674 env
->regs
[4] = regs
->r4
;
4675 env
->regs
[5] = regs
->r5
;
4676 env
->regs
[6] = regs
->r6
;
4677 env
->regs
[7] = regs
->r7
;
4678 env
->regs
[8] = regs
->r8
;
4679 env
->regs
[9] = regs
->r9
;
4680 env
->regs
[10] = regs
->r10
;
4681 env
->regs
[11] = regs
->r11
;
4682 env
->regs
[12] = regs
->r12
;
4683 env
->regs
[13] = regs
->r13
;
4684 env
->regs
[14] = info
->start_stack
;
4685 env
->regs
[15] = regs
->acr
;
4686 env
->pc
= regs
->erp
;
4688 #elif defined(TARGET_S390X)
4691 for (i
= 0; i
< 16; i
++) {
4692 env
->regs
[i
] = regs
->gprs
[i
];
4694 env
->psw
.mask
= regs
->psw
.mask
;
4695 env
->psw
.addr
= regs
->psw
.addr
;
4697 #elif defined(TARGET_TILEGX)
4700 for (i
= 0; i
< TILEGX_R_COUNT
; i
++) {
4701 env
->regs
[i
] = regs
->regs
[i
];
4703 for (i
= 0; i
< TILEGX_SPR_COUNT
; i
++) {
4709 #error unsupported target CPU
4712 #if defined(TARGET_ARM) || defined(TARGET_M68K) || defined(TARGET_UNICORE32)
4713 ts
->stack_base
= info
->start_stack
;
4714 ts
->heap_base
= info
->brk
;
4715 /* This will be filled in on the first SYS_HEAPINFO call. */
4720 if (gdbserver_start(gdbstub_port
) < 0) {
4721 fprintf(stderr
, "qemu: could not open gdbserver on port %d\n",
4725 gdb_handlesig(cpu
, 0);