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"
21 #include <sys/syscall.h>
22 #include <sys/resource.h>
25 #include "qemu-common.h"
28 #include "qemu/timer.h"
29 #include "qemu/envlist.h"
36 static const char *filename
;
37 static const char *argv0
;
38 static int gdbstub_port
;
39 static envlist_t
*envlist
;
40 static const char *cpu_model
;
41 unsigned long mmap_min_addr
;
42 unsigned long guest_base
;
45 #define EXCP_DUMP(env, fmt, ...) \
47 CPUState *cs = ENV_GET_CPU(env); \
48 fprintf(stderr, fmt , ## __VA_ARGS__); \
49 cpu_dump_state(cs, stderr, fprintf, 0); \
50 if (qemu_log_separate()) { \
51 qemu_log(fmt, ## __VA_ARGS__); \
52 log_cpu_state(cs, 0); \
56 #if (TARGET_LONG_BITS == 32) && (HOST_LONG_BITS == 64)
58 * When running 32-on-64 we should make sure we can fit all of the possible
59 * guest address space into a contiguous chunk of virtual host memory.
61 * This way we will never overlap with our own libraries or binaries or stack
62 * or anything else that QEMU maps.
65 /* MIPS only supports 31 bits of virtual address space for user space */
66 unsigned long reserved_va
= 0x77000000;
68 unsigned long reserved_va
= 0xf7000000;
71 unsigned long reserved_va
;
74 static void usage(int exitcode
);
76 static const char *interp_prefix
= CONFIG_QEMU_INTERP_PREFIX
;
77 const char *qemu_uname_release
;
79 /* XXX: on x86 MAP_GROWSDOWN only works if ESP <= address + 32, so
80 we allocate a bigger stack. Need a better solution, for example
81 by remapping the process stack directly at the right place */
82 unsigned long guest_stack_size
= 8 * 1024 * 1024UL;
84 void gemu_log(const char *fmt
, ...)
89 vfprintf(stderr
, fmt
, ap
);
93 #if defined(TARGET_I386)
94 int cpu_get_pic_interrupt(CPUX86State
*env
)
100 /***********************************************************/
101 /* Helper routines for implementing atomic operations. */
103 /* To implement exclusive operations we force all cpus to syncronise.
104 We don't require a full sync, only that no cpus are executing guest code.
105 The alternative is to map target atomic ops onto host equivalents,
106 which requires quite a lot of per host/target work. */
107 static pthread_mutex_t cpu_list_mutex
= PTHREAD_MUTEX_INITIALIZER
;
108 static pthread_mutex_t exclusive_lock
= PTHREAD_MUTEX_INITIALIZER
;
109 static pthread_cond_t exclusive_cond
= PTHREAD_COND_INITIALIZER
;
110 static pthread_cond_t exclusive_resume
= PTHREAD_COND_INITIALIZER
;
111 static int pending_cpus
;
113 /* Make sure everything is in a consistent state for calling fork(). */
114 void fork_start(void)
116 qemu_mutex_lock(&tcg_ctx
.tb_ctx
.tb_lock
);
117 pthread_mutex_lock(&exclusive_lock
);
121 void fork_end(int child
)
123 mmap_fork_end(child
);
125 CPUState
*cpu
, *next_cpu
;
126 /* Child processes created by fork() only have a single thread.
127 Discard information about the parent threads. */
128 CPU_FOREACH_SAFE(cpu
, next_cpu
) {
129 if (cpu
!= thread_cpu
) {
130 QTAILQ_REMOVE(&cpus
, thread_cpu
, node
);
134 pthread_mutex_init(&exclusive_lock
, NULL
);
135 pthread_mutex_init(&cpu_list_mutex
, NULL
);
136 pthread_cond_init(&exclusive_cond
, NULL
);
137 pthread_cond_init(&exclusive_resume
, NULL
);
138 qemu_mutex_init(&tcg_ctx
.tb_ctx
.tb_lock
);
139 gdbserver_fork(thread_cpu
);
141 pthread_mutex_unlock(&exclusive_lock
);
142 qemu_mutex_unlock(&tcg_ctx
.tb_ctx
.tb_lock
);
146 /* Wait for pending exclusive operations to complete. The exclusive lock
148 static inline void exclusive_idle(void)
150 while (pending_cpus
) {
151 pthread_cond_wait(&exclusive_resume
, &exclusive_lock
);
155 /* Start an exclusive operation.
156 Must only be called from outside cpu_arm_exec. */
157 static inline void start_exclusive(void)
161 pthread_mutex_lock(&exclusive_lock
);
165 /* Make all other cpus stop executing. */
166 CPU_FOREACH(other_cpu
) {
167 if (other_cpu
->running
) {
172 if (pending_cpus
> 1) {
173 pthread_cond_wait(&exclusive_cond
, &exclusive_lock
);
177 /* Finish an exclusive operation. */
178 static inline void __attribute__((unused
)) end_exclusive(void)
181 pthread_cond_broadcast(&exclusive_resume
);
182 pthread_mutex_unlock(&exclusive_lock
);
185 /* Wait for exclusive ops to finish, and begin cpu execution. */
186 static inline void cpu_exec_start(CPUState
*cpu
)
188 pthread_mutex_lock(&exclusive_lock
);
191 pthread_mutex_unlock(&exclusive_lock
);
194 /* Mark cpu as not executing, and release pending exclusive ops. */
195 static inline void cpu_exec_end(CPUState
*cpu
)
197 pthread_mutex_lock(&exclusive_lock
);
198 cpu
->running
= false;
199 if (pending_cpus
> 1) {
201 if (pending_cpus
== 1) {
202 pthread_cond_signal(&exclusive_cond
);
206 pthread_mutex_unlock(&exclusive_lock
);
209 void cpu_list_lock(void)
211 pthread_mutex_lock(&cpu_list_mutex
);
214 void cpu_list_unlock(void)
216 pthread_mutex_unlock(&cpu_list_mutex
);
221 /***********************************************************/
222 /* CPUX86 core interface */
224 uint64_t cpu_get_tsc(CPUX86State
*env
)
226 return cpu_get_host_ticks();
229 static void write_dt(void *ptr
, unsigned long addr
, unsigned long limit
,
234 e1
= (addr
<< 16) | (limit
& 0xffff);
235 e2
= ((addr
>> 16) & 0xff) | (addr
& 0xff000000) | (limit
& 0x000f0000);
242 static uint64_t *idt_table
;
244 static void set_gate64(void *ptr
, unsigned int type
, unsigned int dpl
,
245 uint64_t addr
, unsigned int sel
)
248 e1
= (addr
& 0xffff) | (sel
<< 16);
249 e2
= (addr
& 0xffff0000) | 0x8000 | (dpl
<< 13) | (type
<< 8);
253 p
[2] = tswap32(addr
>> 32);
256 /* only dpl matters as we do only user space emulation */
257 static void set_idt(int n
, unsigned int dpl
)
259 set_gate64(idt_table
+ n
* 2, 0, dpl
, 0, 0);
262 static void set_gate(void *ptr
, unsigned int type
, unsigned int dpl
,
263 uint32_t addr
, unsigned int sel
)
266 e1
= (addr
& 0xffff) | (sel
<< 16);
267 e2
= (addr
& 0xffff0000) | 0x8000 | (dpl
<< 13) | (type
<< 8);
273 /* only dpl matters as we do only user space emulation */
274 static void set_idt(int n
, unsigned int dpl
)
276 set_gate(idt_table
+ n
, 0, dpl
, 0, 0);
280 void cpu_loop(CPUX86State
*env
)
282 CPUState
*cs
= CPU(x86_env_get_cpu(env
));
285 target_siginfo_t info
;
289 trapnr
= cpu_x86_exec(cs
);
293 /* linux syscall from int $0x80 */
294 env
->regs
[R_EAX
] = do_syscall(env
,
306 /* linux syscall from syscall instruction */
307 env
->regs
[R_EAX
] = do_syscall(env
,
320 info
.si_signo
= TARGET_SIGBUS
;
322 info
.si_code
= TARGET_SI_KERNEL
;
323 info
._sifields
._sigfault
._addr
= 0;
324 queue_signal(env
, info
.si_signo
, &info
);
327 /* XXX: potential problem if ABI32 */
328 #ifndef TARGET_X86_64
329 if (env
->eflags
& VM_MASK
) {
330 handle_vm86_fault(env
);
334 info
.si_signo
= TARGET_SIGSEGV
;
336 info
.si_code
= TARGET_SI_KERNEL
;
337 info
._sifields
._sigfault
._addr
= 0;
338 queue_signal(env
, info
.si_signo
, &info
);
342 info
.si_signo
= TARGET_SIGSEGV
;
344 if (!(env
->error_code
& 1))
345 info
.si_code
= TARGET_SEGV_MAPERR
;
347 info
.si_code
= TARGET_SEGV_ACCERR
;
348 info
._sifields
._sigfault
._addr
= env
->cr
[2];
349 queue_signal(env
, info
.si_signo
, &info
);
352 #ifndef TARGET_X86_64
353 if (env
->eflags
& VM_MASK
) {
354 handle_vm86_trap(env
, trapnr
);
358 /* division by zero */
359 info
.si_signo
= TARGET_SIGFPE
;
361 info
.si_code
= TARGET_FPE_INTDIV
;
362 info
._sifields
._sigfault
._addr
= env
->eip
;
363 queue_signal(env
, info
.si_signo
, &info
);
368 #ifndef TARGET_X86_64
369 if (env
->eflags
& VM_MASK
) {
370 handle_vm86_trap(env
, trapnr
);
374 info
.si_signo
= TARGET_SIGTRAP
;
376 if (trapnr
== EXCP01_DB
) {
377 info
.si_code
= TARGET_TRAP_BRKPT
;
378 info
._sifields
._sigfault
._addr
= env
->eip
;
380 info
.si_code
= TARGET_SI_KERNEL
;
381 info
._sifields
._sigfault
._addr
= 0;
383 queue_signal(env
, info
.si_signo
, &info
);
388 #ifndef TARGET_X86_64
389 if (env
->eflags
& VM_MASK
) {
390 handle_vm86_trap(env
, trapnr
);
394 info
.si_signo
= TARGET_SIGSEGV
;
396 info
.si_code
= TARGET_SI_KERNEL
;
397 info
._sifields
._sigfault
._addr
= 0;
398 queue_signal(env
, info
.si_signo
, &info
);
402 info
.si_signo
= TARGET_SIGILL
;
404 info
.si_code
= TARGET_ILL_ILLOPN
;
405 info
._sifields
._sigfault
._addr
= env
->eip
;
406 queue_signal(env
, info
.si_signo
, &info
);
409 /* just indicate that signals should be handled asap */
415 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
420 info
.si_code
= TARGET_TRAP_BRKPT
;
421 queue_signal(env
, info
.si_signo
, &info
);
426 pc
= env
->segs
[R_CS
].base
+ env
->eip
;
427 EXCP_DUMP(env
, "qemu: 0x%08lx: unhandled CPU exception 0x%x - aborting\n",
431 process_pending_signals(env
);
438 #define get_user_code_u32(x, gaddr, doswap) \
439 ({ abi_long __r = get_user_u32((x), (gaddr)); \
440 if (!__r && (doswap)) { \
446 #define get_user_code_u16(x, gaddr, doswap) \
447 ({ abi_long __r = get_user_u16((x), (gaddr)); \
448 if (!__r && (doswap)) { \
455 /* Commpage handling -- there is no commpage for AArch64 */
458 * See the Linux kernel's Documentation/arm/kernel_user_helpers.txt
460 * r0 = pointer to oldval
461 * r1 = pointer to newval
462 * r2 = pointer to target value
465 * r0 = 0 if *ptr was changed, non-0 if no exchange happened
466 * C set if *ptr was changed, clear if no exchange happened
468 * Note segv's in kernel helpers are a bit tricky, we can set the
469 * data address sensibly but the PC address is just the entry point.
471 static void arm_kernel_cmpxchg64_helper(CPUARMState
*env
)
473 uint64_t oldval
, newval
, val
;
475 target_siginfo_t info
;
477 /* Based on the 32 bit code in do_kernel_trap */
479 /* XXX: This only works between threads, not between processes.
480 It's probably possible to implement this with native host
481 operations. However things like ldrex/strex are much harder so
482 there's not much point trying. */
484 cpsr
= cpsr_read(env
);
487 if (get_user_u64(oldval
, env
->regs
[0])) {
488 env
->exception
.vaddress
= env
->regs
[0];
492 if (get_user_u64(newval
, env
->regs
[1])) {
493 env
->exception
.vaddress
= env
->regs
[1];
497 if (get_user_u64(val
, addr
)) {
498 env
->exception
.vaddress
= addr
;
505 if (put_user_u64(val
, addr
)) {
506 env
->exception
.vaddress
= addr
;
516 cpsr_write(env
, cpsr
, CPSR_C
);
522 /* We get the PC of the entry address - which is as good as anything,
523 on a real kernel what you get depends on which mode it uses. */
524 info
.si_signo
= TARGET_SIGSEGV
;
526 /* XXX: check env->error_code */
527 info
.si_code
= TARGET_SEGV_MAPERR
;
528 info
._sifields
._sigfault
._addr
= env
->exception
.vaddress
;
529 queue_signal(env
, info
.si_signo
, &info
);
532 /* Handle a jump to the kernel code page. */
534 do_kernel_trap(CPUARMState
*env
)
540 switch (env
->regs
[15]) {
541 case 0xffff0fa0: /* __kernel_memory_barrier */
542 /* ??? No-op. Will need to do better for SMP. */
544 case 0xffff0fc0: /* __kernel_cmpxchg */
545 /* XXX: This only works between threads, not between processes.
546 It's probably possible to implement this with native host
547 operations. However things like ldrex/strex are much harder so
548 there's not much point trying. */
550 cpsr
= cpsr_read(env
);
552 /* FIXME: This should SEGV if the access fails. */
553 if (get_user_u32(val
, addr
))
555 if (val
== env
->regs
[0]) {
557 /* FIXME: Check for segfaults. */
558 put_user_u32(val
, addr
);
565 cpsr_write(env
, cpsr
, CPSR_C
);
568 case 0xffff0fe0: /* __kernel_get_tls */
569 env
->regs
[0] = cpu_get_tls(env
);
571 case 0xffff0f60: /* __kernel_cmpxchg64 */
572 arm_kernel_cmpxchg64_helper(env
);
578 /* Jump back to the caller. */
579 addr
= env
->regs
[14];
584 env
->regs
[15] = addr
;
589 /* Store exclusive handling for AArch32 */
590 static int do_strex(CPUARMState
*env
)
598 if (env
->exclusive_addr
!= env
->exclusive_test
) {
601 /* We know we're always AArch32 so the address is in uint32_t range
602 * unless it was the -1 exclusive-monitor-lost value (which won't
603 * match exclusive_test above).
605 assert(extract64(env
->exclusive_addr
, 32, 32) == 0);
606 addr
= env
->exclusive_addr
;
607 size
= env
->exclusive_info
& 0xf;
610 segv
= get_user_u8(val
, addr
);
613 segv
= get_user_u16(val
, addr
);
617 segv
= get_user_u32(val
, addr
);
623 env
->exception
.vaddress
= addr
;
628 segv
= get_user_u32(valhi
, addr
+ 4);
630 env
->exception
.vaddress
= addr
+ 4;
633 val
= deposit64(val
, 32, 32, valhi
);
635 if (val
!= env
->exclusive_val
) {
639 val
= env
->regs
[(env
->exclusive_info
>> 8) & 0xf];
642 segv
= put_user_u8(val
, addr
);
645 segv
= put_user_u16(val
, addr
);
649 segv
= put_user_u32(val
, addr
);
653 env
->exception
.vaddress
= addr
;
657 val
= env
->regs
[(env
->exclusive_info
>> 12) & 0xf];
658 segv
= put_user_u32(val
, addr
+ 4);
660 env
->exception
.vaddress
= addr
+ 4;
667 env
->regs
[(env
->exclusive_info
>> 4) & 0xf] = rc
;
673 void cpu_loop(CPUARMState
*env
)
675 CPUState
*cs
= CPU(arm_env_get_cpu(env
));
677 unsigned int n
, insn
;
678 target_siginfo_t info
;
683 trapnr
= cpu_arm_exec(cs
);
688 TaskState
*ts
= cs
->opaque
;
692 /* we handle the FPU emulation here, as Linux */
693 /* we get the opcode */
694 /* FIXME - what to do if get_user() fails? */
695 get_user_code_u32(opcode
, env
->regs
[15], env
->bswap_code
);
697 rc
= EmulateAll(opcode
, &ts
->fpa
, env
);
698 if (rc
== 0) { /* illegal instruction */
699 info
.si_signo
= TARGET_SIGILL
;
701 info
.si_code
= TARGET_ILL_ILLOPN
;
702 info
._sifields
._sigfault
._addr
= env
->regs
[15];
703 queue_signal(env
, info
.si_signo
, &info
);
704 } else if (rc
< 0) { /* FP exception */
707 /* translate softfloat flags to FPSR flags */
708 if (-rc
& float_flag_invalid
)
710 if (-rc
& float_flag_divbyzero
)
712 if (-rc
& float_flag_overflow
)
714 if (-rc
& float_flag_underflow
)
716 if (-rc
& float_flag_inexact
)
719 FPSR fpsr
= ts
->fpa
.fpsr
;
720 //printf("fpsr 0x%x, arm_fpe 0x%x\n",fpsr,arm_fpe);
722 if (fpsr
& (arm_fpe
<< 16)) { /* exception enabled? */
723 info
.si_signo
= TARGET_SIGFPE
;
726 /* ordered by priority, least first */
727 if (arm_fpe
& BIT_IXC
) info
.si_code
= TARGET_FPE_FLTRES
;
728 if (arm_fpe
& BIT_UFC
) info
.si_code
= TARGET_FPE_FLTUND
;
729 if (arm_fpe
& BIT_OFC
) info
.si_code
= TARGET_FPE_FLTOVF
;
730 if (arm_fpe
& BIT_DZC
) info
.si_code
= TARGET_FPE_FLTDIV
;
731 if (arm_fpe
& BIT_IOC
) info
.si_code
= TARGET_FPE_FLTINV
;
733 info
._sifields
._sigfault
._addr
= env
->regs
[15];
734 queue_signal(env
, info
.si_signo
, &info
);
739 /* accumulate unenabled exceptions */
740 if ((!(fpsr
& BIT_IXE
)) && (arm_fpe
& BIT_IXC
))
742 if ((!(fpsr
& BIT_UFE
)) && (arm_fpe
& BIT_UFC
))
744 if ((!(fpsr
& BIT_OFE
)) && (arm_fpe
& BIT_OFC
))
746 if ((!(fpsr
& BIT_DZE
)) && (arm_fpe
& BIT_DZC
))
748 if ((!(fpsr
& BIT_IOE
)) && (arm_fpe
& BIT_IOC
))
751 } else { /* everything OK */
762 if (trapnr
== EXCP_BKPT
) {
764 /* FIXME - what to do if get_user() fails? */
765 get_user_code_u16(insn
, env
->regs
[15], env
->bswap_code
);
769 /* FIXME - what to do if get_user() fails? */
770 get_user_code_u32(insn
, env
->regs
[15], env
->bswap_code
);
771 n
= (insn
& 0xf) | ((insn
>> 4) & 0xff0);
776 /* FIXME - what to do if get_user() fails? */
777 get_user_code_u16(insn
, env
->regs
[15] - 2,
781 /* FIXME - what to do if get_user() fails? */
782 get_user_code_u32(insn
, env
->regs
[15] - 4,
788 if (n
== ARM_NR_cacheflush
) {
790 } else if (n
== ARM_NR_semihosting
791 || n
== ARM_NR_thumb_semihosting
) {
792 env
->regs
[0] = do_arm_semihosting (env
);
793 } else if (n
== 0 || n
>= ARM_SYSCALL_BASE
|| env
->thumb
) {
795 if (env
->thumb
|| n
== 0) {
798 n
-= ARM_SYSCALL_BASE
;
801 if ( n
> ARM_NR_BASE
) {
803 case ARM_NR_cacheflush
:
807 cpu_set_tls(env
, env
->regs
[0]);
810 case ARM_NR_breakpoint
:
811 env
->regs
[15] -= env
->thumb
? 2 : 4;
814 gemu_log("qemu: Unsupported ARM syscall: 0x%x\n",
816 env
->regs
[0] = -TARGET_ENOSYS
;
820 env
->regs
[0] = do_syscall(env
,
836 /* just indicate that signals should be handled asap */
839 if (!do_strex(env
)) {
842 /* fall through for segv */
843 case EXCP_PREFETCH_ABORT
:
844 case EXCP_DATA_ABORT
:
845 addr
= env
->exception
.vaddress
;
847 info
.si_signo
= TARGET_SIGSEGV
;
849 /* XXX: check env->error_code */
850 info
.si_code
= TARGET_SEGV_MAPERR
;
851 info
._sifields
._sigfault
._addr
= addr
;
852 queue_signal(env
, info
.si_signo
, &info
);
860 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
865 info
.si_code
= TARGET_TRAP_BRKPT
;
866 queue_signal(env
, info
.si_signo
, &info
);
870 case EXCP_KERNEL_TRAP
:
871 if (do_kernel_trap(env
))
876 EXCP_DUMP(env
, "qemu: unhandled CPU exception 0x%x - aborting\n", trapnr
);
879 process_pending_signals(env
);
886 * Handle AArch64 store-release exclusive
888 * rs = gets the status result of store exclusive
889 * rt = is the register that is stored
890 * rt2 = is the second register store (in STP)
893 static int do_strex_a64(CPUARMState
*env
)
904 /* size | is_pair << 2 | (rs << 4) | (rt << 9) | (rt2 << 14)); */
905 size
= extract32(env
->exclusive_info
, 0, 2);
906 is_pair
= extract32(env
->exclusive_info
, 2, 1);
907 rs
= extract32(env
->exclusive_info
, 4, 5);
908 rt
= extract32(env
->exclusive_info
, 9, 5);
909 rt2
= extract32(env
->exclusive_info
, 14, 5);
911 addr
= env
->exclusive_addr
;
913 if (addr
!= env
->exclusive_test
) {
919 segv
= get_user_u8(val
, addr
);
922 segv
= get_user_u16(val
, addr
);
925 segv
= get_user_u32(val
, addr
);
928 segv
= get_user_u64(val
, addr
);
934 env
->exception
.vaddress
= addr
;
937 if (val
!= env
->exclusive_val
) {
942 segv
= get_user_u32(val
, addr
+ 4);
944 segv
= get_user_u64(val
, addr
+ 8);
947 env
->exception
.vaddress
= addr
+ (size
== 2 ? 4 : 8);
950 if (val
!= env
->exclusive_high
) {
954 /* handle the zero register */
955 val
= rt
== 31 ? 0 : env
->xregs
[rt
];
958 segv
= put_user_u8(val
, addr
);
961 segv
= put_user_u16(val
, addr
);
964 segv
= put_user_u32(val
, addr
);
967 segv
= put_user_u64(val
, addr
);
974 /* handle the zero register */
975 val
= rt2
== 31 ? 0 : env
->xregs
[rt2
];
977 segv
= put_user_u32(val
, addr
+ 4);
979 segv
= put_user_u64(val
, addr
+ 8);
982 env
->exception
.vaddress
= addr
+ (size
== 2 ? 4 : 8);
989 /* rs == 31 encodes a write to the ZR, thus throwing away
990 * the status return. This is rather silly but valid.
996 /* instruction faulted, PC does not advance */
997 /* either way a strex releases any exclusive lock we have */
998 env
->exclusive_addr
= -1;
1003 /* AArch64 main loop */
1004 void cpu_loop(CPUARMState
*env
)
1006 CPUState
*cs
= CPU(arm_env_get_cpu(env
));
1008 target_siginfo_t info
;
1012 trapnr
= cpu_arm_exec(cs
);
1017 env
->xregs
[0] = do_syscall(env
,
1027 case EXCP_INTERRUPT
:
1028 /* just indicate that signals should be handled asap */
1031 info
.si_signo
= TARGET_SIGILL
;
1033 info
.si_code
= TARGET_ILL_ILLOPN
;
1034 info
._sifields
._sigfault
._addr
= env
->pc
;
1035 queue_signal(env
, info
.si_signo
, &info
);
1038 if (!do_strex_a64(env
)) {
1041 /* fall through for segv */
1042 case EXCP_PREFETCH_ABORT
:
1043 case EXCP_DATA_ABORT
:
1044 info
.si_signo
= TARGET_SIGSEGV
;
1046 /* XXX: check env->error_code */
1047 info
.si_code
= TARGET_SEGV_MAPERR
;
1048 info
._sifields
._sigfault
._addr
= env
->exception
.vaddress
;
1049 queue_signal(env
, info
.si_signo
, &info
);
1053 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
1055 info
.si_signo
= sig
;
1057 info
.si_code
= TARGET_TRAP_BRKPT
;
1058 queue_signal(env
, info
.si_signo
, &info
);
1062 env
->xregs
[0] = do_arm_semihosting(env
);
1065 EXCP_DUMP(env
, "qemu: unhandled CPU exception 0x%x - aborting\n", trapnr
);
1068 process_pending_signals(env
);
1069 /* Exception return on AArch64 always clears the exclusive monitor,
1070 * so any return to running guest code implies this.
1071 * A strex (successful or otherwise) also clears the monitor, so
1072 * we don't need to specialcase EXCP_STREX.
1074 env
->exclusive_addr
= -1;
1077 #endif /* ndef TARGET_ABI32 */
1081 #ifdef TARGET_UNICORE32
1083 void cpu_loop(CPUUniCore32State
*env
)
1085 CPUState
*cs
= CPU(uc32_env_get_cpu(env
));
1087 unsigned int n
, insn
;
1088 target_siginfo_t info
;
1092 trapnr
= uc32_cpu_exec(cs
);
1095 case UC32_EXCP_PRIV
:
1098 get_user_u32(insn
, env
->regs
[31] - 4);
1099 n
= insn
& 0xffffff;
1101 if (n
>= UC32_SYSCALL_BASE
) {
1103 n
-= UC32_SYSCALL_BASE
;
1104 if (n
== UC32_SYSCALL_NR_set_tls
) {
1105 cpu_set_tls(env
, env
->regs
[0]);
1108 env
->regs
[0] = do_syscall(env
,
1123 case UC32_EXCP_DTRAP
:
1124 case UC32_EXCP_ITRAP
:
1125 info
.si_signo
= TARGET_SIGSEGV
;
1127 /* XXX: check env->error_code */
1128 info
.si_code
= TARGET_SEGV_MAPERR
;
1129 info
._sifields
._sigfault
._addr
= env
->cp0
.c4_faultaddr
;
1130 queue_signal(env
, info
.si_signo
, &info
);
1132 case EXCP_INTERRUPT
:
1133 /* just indicate that signals should be handled asap */
1139 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
1141 info
.si_signo
= sig
;
1143 info
.si_code
= TARGET_TRAP_BRKPT
;
1144 queue_signal(env
, info
.si_signo
, &info
);
1151 process_pending_signals(env
);
1155 EXCP_DUMP(env
, "qemu: unhandled CPU exception 0x%x - aborting\n", trapnr
);
1161 #define SPARC64_STACK_BIAS 2047
1165 /* WARNING: dealing with register windows _is_ complicated. More info
1166 can be found at http://www.sics.se/~psm/sparcstack.html */
1167 static inline int get_reg_index(CPUSPARCState
*env
, int cwp
, int index
)
1169 index
= (index
+ cwp
* 16) % (16 * env
->nwindows
);
1170 /* wrap handling : if cwp is on the last window, then we use the
1171 registers 'after' the end */
1172 if (index
< 8 && env
->cwp
== env
->nwindows
- 1)
1173 index
+= 16 * env
->nwindows
;
1177 /* save the register window 'cwp1' */
1178 static inline void save_window_offset(CPUSPARCState
*env
, int cwp1
)
1183 sp_ptr
= env
->regbase
[get_reg_index(env
, cwp1
, 6)];
1184 #ifdef TARGET_SPARC64
1186 sp_ptr
+= SPARC64_STACK_BIAS
;
1188 #if defined(DEBUG_WIN)
1189 printf("win_overflow: sp_ptr=0x" TARGET_ABI_FMT_lx
" save_cwp=%d\n",
1192 for(i
= 0; i
< 16; i
++) {
1193 /* FIXME - what to do if put_user() fails? */
1194 put_user_ual(env
->regbase
[get_reg_index(env
, cwp1
, 8 + i
)], sp_ptr
);
1195 sp_ptr
+= sizeof(abi_ulong
);
1199 static void save_window(CPUSPARCState
*env
)
1201 #ifndef TARGET_SPARC64
1202 unsigned int new_wim
;
1203 new_wim
= ((env
->wim
>> 1) | (env
->wim
<< (env
->nwindows
- 1))) &
1204 ((1LL << env
->nwindows
) - 1);
1205 save_window_offset(env
, cpu_cwp_dec(env
, env
->cwp
- 2));
1208 save_window_offset(env
, cpu_cwp_dec(env
, env
->cwp
- 2));
1214 static void restore_window(CPUSPARCState
*env
)
1216 #ifndef TARGET_SPARC64
1217 unsigned int new_wim
;
1219 unsigned int i
, cwp1
;
1222 #ifndef TARGET_SPARC64
1223 new_wim
= ((env
->wim
<< 1) | (env
->wim
>> (env
->nwindows
- 1))) &
1224 ((1LL << env
->nwindows
) - 1);
1227 /* restore the invalid window */
1228 cwp1
= cpu_cwp_inc(env
, env
->cwp
+ 1);
1229 sp_ptr
= env
->regbase
[get_reg_index(env
, cwp1
, 6)];
1230 #ifdef TARGET_SPARC64
1232 sp_ptr
+= SPARC64_STACK_BIAS
;
1234 #if defined(DEBUG_WIN)
1235 printf("win_underflow: sp_ptr=0x" TARGET_ABI_FMT_lx
" load_cwp=%d\n",
1238 for(i
= 0; i
< 16; i
++) {
1239 /* FIXME - what to do if get_user() fails? */
1240 get_user_ual(env
->regbase
[get_reg_index(env
, cwp1
, 8 + i
)], sp_ptr
);
1241 sp_ptr
+= sizeof(abi_ulong
);
1243 #ifdef TARGET_SPARC64
1245 if (env
->cleanwin
< env
->nwindows
- 1)
1253 static void flush_windows(CPUSPARCState
*env
)
1259 /* if restore would invoke restore_window(), then we can stop */
1260 cwp1
= cpu_cwp_inc(env
, env
->cwp
+ offset
);
1261 #ifndef TARGET_SPARC64
1262 if (env
->wim
& (1 << cwp1
))
1265 if (env
->canrestore
== 0)
1270 save_window_offset(env
, cwp1
);
1273 cwp1
= cpu_cwp_inc(env
, env
->cwp
+ 1);
1274 #ifndef TARGET_SPARC64
1275 /* set wim so that restore will reload the registers */
1276 env
->wim
= 1 << cwp1
;
1278 #if defined(DEBUG_WIN)
1279 printf("flush_windows: nb=%d\n", offset
- 1);
1283 void cpu_loop (CPUSPARCState
*env
)
1285 CPUState
*cs
= CPU(sparc_env_get_cpu(env
));
1288 target_siginfo_t info
;
1292 trapnr
= cpu_sparc_exec(cs
);
1295 /* Compute PSR before exposing state. */
1296 if (env
->cc_op
!= CC_OP_FLAGS
) {
1301 #ifndef TARGET_SPARC64
1308 ret
= do_syscall (env
, env
->gregs
[1],
1309 env
->regwptr
[0], env
->regwptr
[1],
1310 env
->regwptr
[2], env
->regwptr
[3],
1311 env
->regwptr
[4], env
->regwptr
[5],
1313 if ((abi_ulong
)ret
>= (abi_ulong
)(-515)) {
1314 #if defined(TARGET_SPARC64) && !defined(TARGET_ABI32)
1315 env
->xcc
|= PSR_CARRY
;
1317 env
->psr
|= PSR_CARRY
;
1321 #if defined(TARGET_SPARC64) && !defined(TARGET_ABI32)
1322 env
->xcc
&= ~PSR_CARRY
;
1324 env
->psr
&= ~PSR_CARRY
;
1327 env
->regwptr
[0] = ret
;
1328 /* next instruction */
1330 env
->npc
= env
->npc
+ 4;
1332 case 0x83: /* flush windows */
1337 /* next instruction */
1339 env
->npc
= env
->npc
+ 4;
1341 #ifndef TARGET_SPARC64
1342 case TT_WIN_OVF
: /* window overflow */
1345 case TT_WIN_UNF
: /* window underflow */
1346 restore_window(env
);
1351 info
.si_signo
= TARGET_SIGSEGV
;
1353 /* XXX: check env->error_code */
1354 info
.si_code
= TARGET_SEGV_MAPERR
;
1355 info
._sifields
._sigfault
._addr
= env
->mmuregs
[4];
1356 queue_signal(env
, info
.si_signo
, &info
);
1360 case TT_SPILL
: /* window overflow */
1363 case TT_FILL
: /* window underflow */
1364 restore_window(env
);
1369 info
.si_signo
= TARGET_SIGSEGV
;
1371 /* XXX: check env->error_code */
1372 info
.si_code
= TARGET_SEGV_MAPERR
;
1373 if (trapnr
== TT_DFAULT
)
1374 info
._sifields
._sigfault
._addr
= env
->dmmuregs
[4];
1376 info
._sifields
._sigfault
._addr
= cpu_tsptr(env
)->tpc
;
1377 queue_signal(env
, info
.si_signo
, &info
);
1380 #ifndef TARGET_ABI32
1383 sparc64_get_context(env
);
1387 sparc64_set_context(env
);
1391 case EXCP_INTERRUPT
:
1392 /* just indicate that signals should be handled asap */
1396 info
.si_signo
= TARGET_SIGILL
;
1398 info
.si_code
= TARGET_ILL_ILLOPC
;
1399 info
._sifields
._sigfault
._addr
= env
->pc
;
1400 queue_signal(env
, info
.si_signo
, &info
);
1407 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
1410 info
.si_signo
= sig
;
1412 info
.si_code
= TARGET_TRAP_BRKPT
;
1413 queue_signal(env
, info
.si_signo
, &info
);
1418 printf ("Unhandled trap: 0x%x\n", trapnr
);
1419 cpu_dump_state(cs
, stderr
, fprintf
, 0);
1422 process_pending_signals (env
);
1429 static inline uint64_t cpu_ppc_get_tb(CPUPPCState
*env
)
1431 return cpu_get_host_ticks();
1434 uint64_t cpu_ppc_load_tbl(CPUPPCState
*env
)
1436 return cpu_ppc_get_tb(env
);
1439 uint32_t cpu_ppc_load_tbu(CPUPPCState
*env
)
1441 return cpu_ppc_get_tb(env
) >> 32;
1444 uint64_t cpu_ppc_load_atbl(CPUPPCState
*env
)
1446 return cpu_ppc_get_tb(env
);
1449 uint32_t cpu_ppc_load_atbu(CPUPPCState
*env
)
1451 return cpu_ppc_get_tb(env
) >> 32;
1454 uint32_t cpu_ppc601_load_rtcu(CPUPPCState
*env
)
1455 __attribute__ (( alias ("cpu_ppc_load_tbu") ));
1457 uint32_t cpu_ppc601_load_rtcl(CPUPPCState
*env
)
1459 return cpu_ppc_load_tbl(env
) & 0x3FFFFF80;
1462 /* XXX: to be fixed */
1463 int ppc_dcr_read (ppc_dcr_t
*dcr_env
, int dcrn
, uint32_t *valp
)
1468 int ppc_dcr_write (ppc_dcr_t
*dcr_env
, int dcrn
, uint32_t val
)
1473 static int do_store_exclusive(CPUPPCState
*env
)
1476 target_ulong page_addr
;
1477 target_ulong val
, val2
__attribute__((unused
)) = 0;
1481 addr
= env
->reserve_ea
;
1482 page_addr
= addr
& TARGET_PAGE_MASK
;
1485 flags
= page_get_flags(page_addr
);
1486 if ((flags
& PAGE_READ
) == 0) {
1489 int reg
= env
->reserve_info
& 0x1f;
1490 int size
= env
->reserve_info
>> 5;
1493 if (addr
== env
->reserve_addr
) {
1495 case 1: segv
= get_user_u8(val
, addr
); break;
1496 case 2: segv
= get_user_u16(val
, addr
); break;
1497 case 4: segv
= get_user_u32(val
, addr
); break;
1498 #if defined(TARGET_PPC64)
1499 case 8: segv
= get_user_u64(val
, addr
); break;
1501 segv
= get_user_u64(val
, addr
);
1503 segv
= get_user_u64(val2
, addr
+ 8);
1510 if (!segv
&& val
== env
->reserve_val
) {
1511 val
= env
->gpr
[reg
];
1513 case 1: segv
= put_user_u8(val
, addr
); break;
1514 case 2: segv
= put_user_u16(val
, addr
); break;
1515 case 4: segv
= put_user_u32(val
, addr
); break;
1516 #if defined(TARGET_PPC64)
1517 case 8: segv
= put_user_u64(val
, addr
); break;
1519 if (val2
== env
->reserve_val2
) {
1522 val
= env
->gpr
[reg
+1];
1524 val2
= env
->gpr
[reg
+1];
1526 segv
= put_user_u64(val
, addr
);
1528 segv
= put_user_u64(val2
, addr
+ 8);
1541 env
->crf
[0] = (stored
<< 1) | xer_so
;
1542 env
->reserve_addr
= (target_ulong
)-1;
1552 void cpu_loop(CPUPPCState
*env
)
1554 CPUState
*cs
= CPU(ppc_env_get_cpu(env
));
1555 target_siginfo_t info
;
1561 trapnr
= cpu_ppc_exec(cs
);
1564 case POWERPC_EXCP_NONE
:
1567 case POWERPC_EXCP_CRITICAL
: /* Critical input */
1568 cpu_abort(cs
, "Critical interrupt while in user mode. "
1571 case POWERPC_EXCP_MCHECK
: /* Machine check exception */
1572 cpu_abort(cs
, "Machine check exception while in user mode. "
1575 case POWERPC_EXCP_DSI
: /* Data storage exception */
1576 EXCP_DUMP(env
, "Invalid data memory access: 0x" TARGET_FMT_lx
"\n",
1578 /* XXX: check this. Seems bugged */
1579 switch (env
->error_code
& 0xFF000000) {
1581 info
.si_signo
= TARGET_SIGSEGV
;
1583 info
.si_code
= TARGET_SEGV_MAPERR
;
1586 info
.si_signo
= TARGET_SIGILL
;
1588 info
.si_code
= TARGET_ILL_ILLADR
;
1591 info
.si_signo
= TARGET_SIGSEGV
;
1593 info
.si_code
= TARGET_SEGV_ACCERR
;
1596 /* Let's send a regular segfault... */
1597 EXCP_DUMP(env
, "Invalid segfault errno (%02x)\n",
1599 info
.si_signo
= TARGET_SIGSEGV
;
1601 info
.si_code
= TARGET_SEGV_MAPERR
;
1604 info
._sifields
._sigfault
._addr
= env
->nip
;
1605 queue_signal(env
, info
.si_signo
, &info
);
1607 case POWERPC_EXCP_ISI
: /* Instruction storage exception */
1608 EXCP_DUMP(env
, "Invalid instruction fetch: 0x\n" TARGET_FMT_lx
1609 "\n", env
->spr
[SPR_SRR0
]);
1610 /* XXX: check this */
1611 switch (env
->error_code
& 0xFF000000) {
1613 info
.si_signo
= TARGET_SIGSEGV
;
1615 info
.si_code
= TARGET_SEGV_MAPERR
;
1619 info
.si_signo
= TARGET_SIGSEGV
;
1621 info
.si_code
= TARGET_SEGV_ACCERR
;
1624 /* Let's send a regular segfault... */
1625 EXCP_DUMP(env
, "Invalid segfault errno (%02x)\n",
1627 info
.si_signo
= TARGET_SIGSEGV
;
1629 info
.si_code
= TARGET_SEGV_MAPERR
;
1632 info
._sifields
._sigfault
._addr
= env
->nip
- 4;
1633 queue_signal(env
, info
.si_signo
, &info
);
1635 case POWERPC_EXCP_EXTERNAL
: /* External input */
1636 cpu_abort(cs
, "External interrupt while in user mode. "
1639 case POWERPC_EXCP_ALIGN
: /* Alignment exception */
1640 EXCP_DUMP(env
, "Unaligned memory access\n");
1641 /* XXX: check this */
1642 info
.si_signo
= TARGET_SIGBUS
;
1644 info
.si_code
= TARGET_BUS_ADRALN
;
1645 info
._sifields
._sigfault
._addr
= env
->nip
;
1646 queue_signal(env
, info
.si_signo
, &info
);
1648 case POWERPC_EXCP_PROGRAM
: /* Program exception */
1649 /* XXX: check this */
1650 switch (env
->error_code
& ~0xF) {
1651 case POWERPC_EXCP_FP
:
1652 EXCP_DUMP(env
, "Floating point program exception\n");
1653 info
.si_signo
= TARGET_SIGFPE
;
1655 switch (env
->error_code
& 0xF) {
1656 case POWERPC_EXCP_FP_OX
:
1657 info
.si_code
= TARGET_FPE_FLTOVF
;
1659 case POWERPC_EXCP_FP_UX
:
1660 info
.si_code
= TARGET_FPE_FLTUND
;
1662 case POWERPC_EXCP_FP_ZX
:
1663 case POWERPC_EXCP_FP_VXZDZ
:
1664 info
.si_code
= TARGET_FPE_FLTDIV
;
1666 case POWERPC_EXCP_FP_XX
:
1667 info
.si_code
= TARGET_FPE_FLTRES
;
1669 case POWERPC_EXCP_FP_VXSOFT
:
1670 info
.si_code
= TARGET_FPE_FLTINV
;
1672 case POWERPC_EXCP_FP_VXSNAN
:
1673 case POWERPC_EXCP_FP_VXISI
:
1674 case POWERPC_EXCP_FP_VXIDI
:
1675 case POWERPC_EXCP_FP_VXIMZ
:
1676 case POWERPC_EXCP_FP_VXVC
:
1677 case POWERPC_EXCP_FP_VXSQRT
:
1678 case POWERPC_EXCP_FP_VXCVI
:
1679 info
.si_code
= TARGET_FPE_FLTSUB
;
1682 EXCP_DUMP(env
, "Unknown floating point exception (%02x)\n",
1687 case POWERPC_EXCP_INVAL
:
1688 EXCP_DUMP(env
, "Invalid instruction\n");
1689 info
.si_signo
= TARGET_SIGILL
;
1691 switch (env
->error_code
& 0xF) {
1692 case POWERPC_EXCP_INVAL_INVAL
:
1693 info
.si_code
= TARGET_ILL_ILLOPC
;
1695 case POWERPC_EXCP_INVAL_LSWX
:
1696 info
.si_code
= TARGET_ILL_ILLOPN
;
1698 case POWERPC_EXCP_INVAL_SPR
:
1699 info
.si_code
= TARGET_ILL_PRVREG
;
1701 case POWERPC_EXCP_INVAL_FP
:
1702 info
.si_code
= TARGET_ILL_COPROC
;
1705 EXCP_DUMP(env
, "Unknown invalid operation (%02x)\n",
1706 env
->error_code
& 0xF);
1707 info
.si_code
= TARGET_ILL_ILLADR
;
1711 case POWERPC_EXCP_PRIV
:
1712 EXCP_DUMP(env
, "Privilege violation\n");
1713 info
.si_signo
= TARGET_SIGILL
;
1715 switch (env
->error_code
& 0xF) {
1716 case POWERPC_EXCP_PRIV_OPC
:
1717 info
.si_code
= TARGET_ILL_PRVOPC
;
1719 case POWERPC_EXCP_PRIV_REG
:
1720 info
.si_code
= TARGET_ILL_PRVREG
;
1723 EXCP_DUMP(env
, "Unknown privilege violation (%02x)\n",
1724 env
->error_code
& 0xF);
1725 info
.si_code
= TARGET_ILL_PRVOPC
;
1729 case POWERPC_EXCP_TRAP
:
1730 cpu_abort(cs
, "Tried to call a TRAP\n");
1733 /* Should not happen ! */
1734 cpu_abort(cs
, "Unknown program exception (%02x)\n",
1738 info
._sifields
._sigfault
._addr
= env
->nip
- 4;
1739 queue_signal(env
, info
.si_signo
, &info
);
1741 case POWERPC_EXCP_FPU
: /* Floating-point unavailable exception */
1742 EXCP_DUMP(env
, "No floating point allowed\n");
1743 info
.si_signo
= TARGET_SIGILL
;
1745 info
.si_code
= TARGET_ILL_COPROC
;
1746 info
._sifields
._sigfault
._addr
= env
->nip
- 4;
1747 queue_signal(env
, info
.si_signo
, &info
);
1749 case POWERPC_EXCP_SYSCALL
: /* System call exception */
1750 cpu_abort(cs
, "Syscall exception while in user mode. "
1753 case POWERPC_EXCP_APU
: /* Auxiliary processor unavailable */
1754 EXCP_DUMP(env
, "No APU instruction allowed\n");
1755 info
.si_signo
= TARGET_SIGILL
;
1757 info
.si_code
= TARGET_ILL_COPROC
;
1758 info
._sifields
._sigfault
._addr
= env
->nip
- 4;
1759 queue_signal(env
, info
.si_signo
, &info
);
1761 case POWERPC_EXCP_DECR
: /* Decrementer exception */
1762 cpu_abort(cs
, "Decrementer interrupt while in user mode. "
1765 case POWERPC_EXCP_FIT
: /* Fixed-interval timer interrupt */
1766 cpu_abort(cs
, "Fix interval timer interrupt while in user mode. "
1769 case POWERPC_EXCP_WDT
: /* Watchdog timer interrupt */
1770 cpu_abort(cs
, "Watchdog timer interrupt while in user mode. "
1773 case POWERPC_EXCP_DTLB
: /* Data TLB error */
1774 cpu_abort(cs
, "Data TLB exception while in user mode. "
1777 case POWERPC_EXCP_ITLB
: /* Instruction TLB error */
1778 cpu_abort(cs
, "Instruction TLB exception while in user mode. "
1781 case POWERPC_EXCP_SPEU
: /* SPE/embedded floating-point unavail. */
1782 EXCP_DUMP(env
, "No SPE/floating-point instruction allowed\n");
1783 info
.si_signo
= TARGET_SIGILL
;
1785 info
.si_code
= TARGET_ILL_COPROC
;
1786 info
._sifields
._sigfault
._addr
= env
->nip
- 4;
1787 queue_signal(env
, info
.si_signo
, &info
);
1789 case POWERPC_EXCP_EFPDI
: /* Embedded floating-point data IRQ */
1790 cpu_abort(cs
, "Embedded floating-point data IRQ not handled\n");
1792 case POWERPC_EXCP_EFPRI
: /* Embedded floating-point round IRQ */
1793 cpu_abort(cs
, "Embedded floating-point round IRQ not handled\n");
1795 case POWERPC_EXCP_EPERFM
: /* Embedded performance monitor IRQ */
1796 cpu_abort(cs
, "Performance monitor exception not handled\n");
1798 case POWERPC_EXCP_DOORI
: /* Embedded doorbell interrupt */
1799 cpu_abort(cs
, "Doorbell interrupt while in user mode. "
1802 case POWERPC_EXCP_DOORCI
: /* Embedded doorbell critical interrupt */
1803 cpu_abort(cs
, "Doorbell critical interrupt while in user mode. "
1806 case POWERPC_EXCP_RESET
: /* System reset exception */
1807 cpu_abort(cs
, "Reset interrupt while in user mode. "
1810 case POWERPC_EXCP_DSEG
: /* Data segment exception */
1811 cpu_abort(cs
, "Data segment exception while in user mode. "
1814 case POWERPC_EXCP_ISEG
: /* Instruction segment exception */
1815 cpu_abort(cs
, "Instruction segment exception "
1816 "while in user mode. Aborting\n");
1818 /* PowerPC 64 with hypervisor mode support */
1819 case POWERPC_EXCP_HDECR
: /* Hypervisor decrementer exception */
1820 cpu_abort(cs
, "Hypervisor decrementer interrupt "
1821 "while in user mode. Aborting\n");
1823 case POWERPC_EXCP_TRACE
: /* Trace exception */
1825 * we use this exception to emulate step-by-step execution mode.
1828 /* PowerPC 64 with hypervisor mode support */
1829 case POWERPC_EXCP_HDSI
: /* Hypervisor data storage exception */
1830 cpu_abort(cs
, "Hypervisor data storage exception "
1831 "while in user mode. Aborting\n");
1833 case POWERPC_EXCP_HISI
: /* Hypervisor instruction storage excp */
1834 cpu_abort(cs
, "Hypervisor instruction storage exception "
1835 "while in user mode. Aborting\n");
1837 case POWERPC_EXCP_HDSEG
: /* Hypervisor data segment exception */
1838 cpu_abort(cs
, "Hypervisor data segment exception "
1839 "while in user mode. Aborting\n");
1841 case POWERPC_EXCP_HISEG
: /* Hypervisor instruction segment excp */
1842 cpu_abort(cs
, "Hypervisor instruction segment exception "
1843 "while in user mode. Aborting\n");
1845 case POWERPC_EXCP_VPU
: /* Vector unavailable exception */
1846 EXCP_DUMP(env
, "No Altivec instructions allowed\n");
1847 info
.si_signo
= TARGET_SIGILL
;
1849 info
.si_code
= TARGET_ILL_COPROC
;
1850 info
._sifields
._sigfault
._addr
= env
->nip
- 4;
1851 queue_signal(env
, info
.si_signo
, &info
);
1853 case POWERPC_EXCP_PIT
: /* Programmable interval timer IRQ */
1854 cpu_abort(cs
, "Programmable interval timer interrupt "
1855 "while in user mode. Aborting\n");
1857 case POWERPC_EXCP_IO
: /* IO error exception */
1858 cpu_abort(cs
, "IO error exception while in user mode. "
1861 case POWERPC_EXCP_RUNM
: /* Run mode exception */
1862 cpu_abort(cs
, "Run mode exception while in user mode. "
1865 case POWERPC_EXCP_EMUL
: /* Emulation trap exception */
1866 cpu_abort(cs
, "Emulation trap exception not handled\n");
1868 case POWERPC_EXCP_IFTLB
: /* Instruction fetch TLB error */
1869 cpu_abort(cs
, "Instruction fetch TLB exception "
1870 "while in user-mode. Aborting");
1872 case POWERPC_EXCP_DLTLB
: /* Data load TLB miss */
1873 cpu_abort(cs
, "Data load TLB exception while in user-mode. "
1876 case POWERPC_EXCP_DSTLB
: /* Data store TLB miss */
1877 cpu_abort(cs
, "Data store TLB exception while in user-mode. "
1880 case POWERPC_EXCP_FPA
: /* Floating-point assist exception */
1881 cpu_abort(cs
, "Floating-point assist exception not handled\n");
1883 case POWERPC_EXCP_IABR
: /* Instruction address breakpoint */
1884 cpu_abort(cs
, "Instruction address breakpoint exception "
1887 case POWERPC_EXCP_SMI
: /* System management interrupt */
1888 cpu_abort(cs
, "System management interrupt while in user mode. "
1891 case POWERPC_EXCP_THERM
: /* Thermal interrupt */
1892 cpu_abort(cs
, "Thermal interrupt interrupt while in user mode. "
1895 case POWERPC_EXCP_PERFM
: /* Embedded performance monitor IRQ */
1896 cpu_abort(cs
, "Performance monitor exception not handled\n");
1898 case POWERPC_EXCP_VPUA
: /* Vector assist exception */
1899 cpu_abort(cs
, "Vector assist exception not handled\n");
1901 case POWERPC_EXCP_SOFTP
: /* Soft patch exception */
1902 cpu_abort(cs
, "Soft patch exception not handled\n");
1904 case POWERPC_EXCP_MAINT
: /* Maintenance exception */
1905 cpu_abort(cs
, "Maintenance exception while in user mode. "
1908 case POWERPC_EXCP_STOP
: /* stop translation */
1909 /* We did invalidate the instruction cache. Go on */
1911 case POWERPC_EXCP_BRANCH
: /* branch instruction: */
1912 /* We just stopped because of a branch. Go on */
1914 case POWERPC_EXCP_SYSCALL_USER
:
1915 /* system call in user-mode emulation */
1917 * PPC ABI uses overflow flag in cr0 to signal an error
1920 env
->crf
[0] &= ~0x1;
1921 ret
= do_syscall(env
, env
->gpr
[0], env
->gpr
[3], env
->gpr
[4],
1922 env
->gpr
[5], env
->gpr
[6], env
->gpr
[7],
1924 if (ret
== (target_ulong
)(-TARGET_QEMU_ESIGRETURN
)) {
1925 /* Returning from a successful sigreturn syscall.
1926 Avoid corrupting register state. */
1929 if (ret
> (target_ulong
)(-515)) {
1935 case POWERPC_EXCP_STCX
:
1936 if (do_store_exclusive(env
)) {
1937 info
.si_signo
= TARGET_SIGSEGV
;
1939 info
.si_code
= TARGET_SEGV_MAPERR
;
1940 info
._sifields
._sigfault
._addr
= env
->nip
;
1941 queue_signal(env
, info
.si_signo
, &info
);
1948 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
1950 info
.si_signo
= sig
;
1952 info
.si_code
= TARGET_TRAP_BRKPT
;
1953 queue_signal(env
, info
.si_signo
, &info
);
1957 case EXCP_INTERRUPT
:
1958 /* just indicate that signals should be handled asap */
1961 cpu_abort(cs
, "Unknown exception 0x%d. Aborting\n", trapnr
);
1964 process_pending_signals(env
);
1971 # ifdef TARGET_ABI_MIPSO32
1972 # define MIPS_SYS(name, args) args,
1973 static const uint8_t mips_syscall_args
[] = {
1974 MIPS_SYS(sys_syscall
, 8) /* 4000 */
1975 MIPS_SYS(sys_exit
, 1)
1976 MIPS_SYS(sys_fork
, 0)
1977 MIPS_SYS(sys_read
, 3)
1978 MIPS_SYS(sys_write
, 3)
1979 MIPS_SYS(sys_open
, 3) /* 4005 */
1980 MIPS_SYS(sys_close
, 1)
1981 MIPS_SYS(sys_waitpid
, 3)
1982 MIPS_SYS(sys_creat
, 2)
1983 MIPS_SYS(sys_link
, 2)
1984 MIPS_SYS(sys_unlink
, 1) /* 4010 */
1985 MIPS_SYS(sys_execve
, 0)
1986 MIPS_SYS(sys_chdir
, 1)
1987 MIPS_SYS(sys_time
, 1)
1988 MIPS_SYS(sys_mknod
, 3)
1989 MIPS_SYS(sys_chmod
, 2) /* 4015 */
1990 MIPS_SYS(sys_lchown
, 3)
1991 MIPS_SYS(sys_ni_syscall
, 0)
1992 MIPS_SYS(sys_ni_syscall
, 0) /* was sys_stat */
1993 MIPS_SYS(sys_lseek
, 3)
1994 MIPS_SYS(sys_getpid
, 0) /* 4020 */
1995 MIPS_SYS(sys_mount
, 5)
1996 MIPS_SYS(sys_umount
, 1)
1997 MIPS_SYS(sys_setuid
, 1)
1998 MIPS_SYS(sys_getuid
, 0)
1999 MIPS_SYS(sys_stime
, 1) /* 4025 */
2000 MIPS_SYS(sys_ptrace
, 4)
2001 MIPS_SYS(sys_alarm
, 1)
2002 MIPS_SYS(sys_ni_syscall
, 0) /* was sys_fstat */
2003 MIPS_SYS(sys_pause
, 0)
2004 MIPS_SYS(sys_utime
, 2) /* 4030 */
2005 MIPS_SYS(sys_ni_syscall
, 0)
2006 MIPS_SYS(sys_ni_syscall
, 0)
2007 MIPS_SYS(sys_access
, 2)
2008 MIPS_SYS(sys_nice
, 1)
2009 MIPS_SYS(sys_ni_syscall
, 0) /* 4035 */
2010 MIPS_SYS(sys_sync
, 0)
2011 MIPS_SYS(sys_kill
, 2)
2012 MIPS_SYS(sys_rename
, 2)
2013 MIPS_SYS(sys_mkdir
, 2)
2014 MIPS_SYS(sys_rmdir
, 1) /* 4040 */
2015 MIPS_SYS(sys_dup
, 1)
2016 MIPS_SYS(sys_pipe
, 0)
2017 MIPS_SYS(sys_times
, 1)
2018 MIPS_SYS(sys_ni_syscall
, 0)
2019 MIPS_SYS(sys_brk
, 1) /* 4045 */
2020 MIPS_SYS(sys_setgid
, 1)
2021 MIPS_SYS(sys_getgid
, 0)
2022 MIPS_SYS(sys_ni_syscall
, 0) /* was signal(2) */
2023 MIPS_SYS(sys_geteuid
, 0)
2024 MIPS_SYS(sys_getegid
, 0) /* 4050 */
2025 MIPS_SYS(sys_acct
, 0)
2026 MIPS_SYS(sys_umount2
, 2)
2027 MIPS_SYS(sys_ni_syscall
, 0)
2028 MIPS_SYS(sys_ioctl
, 3)
2029 MIPS_SYS(sys_fcntl
, 3) /* 4055 */
2030 MIPS_SYS(sys_ni_syscall
, 2)
2031 MIPS_SYS(sys_setpgid
, 2)
2032 MIPS_SYS(sys_ni_syscall
, 0)
2033 MIPS_SYS(sys_olduname
, 1)
2034 MIPS_SYS(sys_umask
, 1) /* 4060 */
2035 MIPS_SYS(sys_chroot
, 1)
2036 MIPS_SYS(sys_ustat
, 2)
2037 MIPS_SYS(sys_dup2
, 2)
2038 MIPS_SYS(sys_getppid
, 0)
2039 MIPS_SYS(sys_getpgrp
, 0) /* 4065 */
2040 MIPS_SYS(sys_setsid
, 0)
2041 MIPS_SYS(sys_sigaction
, 3)
2042 MIPS_SYS(sys_sgetmask
, 0)
2043 MIPS_SYS(sys_ssetmask
, 1)
2044 MIPS_SYS(sys_setreuid
, 2) /* 4070 */
2045 MIPS_SYS(sys_setregid
, 2)
2046 MIPS_SYS(sys_sigsuspend
, 0)
2047 MIPS_SYS(sys_sigpending
, 1)
2048 MIPS_SYS(sys_sethostname
, 2)
2049 MIPS_SYS(sys_setrlimit
, 2) /* 4075 */
2050 MIPS_SYS(sys_getrlimit
, 2)
2051 MIPS_SYS(sys_getrusage
, 2)
2052 MIPS_SYS(sys_gettimeofday
, 2)
2053 MIPS_SYS(sys_settimeofday
, 2)
2054 MIPS_SYS(sys_getgroups
, 2) /* 4080 */
2055 MIPS_SYS(sys_setgroups
, 2)
2056 MIPS_SYS(sys_ni_syscall
, 0) /* old_select */
2057 MIPS_SYS(sys_symlink
, 2)
2058 MIPS_SYS(sys_ni_syscall
, 0) /* was sys_lstat */
2059 MIPS_SYS(sys_readlink
, 3) /* 4085 */
2060 MIPS_SYS(sys_uselib
, 1)
2061 MIPS_SYS(sys_swapon
, 2)
2062 MIPS_SYS(sys_reboot
, 3)
2063 MIPS_SYS(old_readdir
, 3)
2064 MIPS_SYS(old_mmap
, 6) /* 4090 */
2065 MIPS_SYS(sys_munmap
, 2)
2066 MIPS_SYS(sys_truncate
, 2)
2067 MIPS_SYS(sys_ftruncate
, 2)
2068 MIPS_SYS(sys_fchmod
, 2)
2069 MIPS_SYS(sys_fchown
, 3) /* 4095 */
2070 MIPS_SYS(sys_getpriority
, 2)
2071 MIPS_SYS(sys_setpriority
, 3)
2072 MIPS_SYS(sys_ni_syscall
, 0)
2073 MIPS_SYS(sys_statfs
, 2)
2074 MIPS_SYS(sys_fstatfs
, 2) /* 4100 */
2075 MIPS_SYS(sys_ni_syscall
, 0) /* was ioperm(2) */
2076 MIPS_SYS(sys_socketcall
, 2)
2077 MIPS_SYS(sys_syslog
, 3)
2078 MIPS_SYS(sys_setitimer
, 3)
2079 MIPS_SYS(sys_getitimer
, 2) /* 4105 */
2080 MIPS_SYS(sys_newstat
, 2)
2081 MIPS_SYS(sys_newlstat
, 2)
2082 MIPS_SYS(sys_newfstat
, 2)
2083 MIPS_SYS(sys_uname
, 1)
2084 MIPS_SYS(sys_ni_syscall
, 0) /* 4110 was iopl(2) */
2085 MIPS_SYS(sys_vhangup
, 0)
2086 MIPS_SYS(sys_ni_syscall
, 0) /* was sys_idle() */
2087 MIPS_SYS(sys_ni_syscall
, 0) /* was sys_vm86 */
2088 MIPS_SYS(sys_wait4
, 4)
2089 MIPS_SYS(sys_swapoff
, 1) /* 4115 */
2090 MIPS_SYS(sys_sysinfo
, 1)
2091 MIPS_SYS(sys_ipc
, 6)
2092 MIPS_SYS(sys_fsync
, 1)
2093 MIPS_SYS(sys_sigreturn
, 0)
2094 MIPS_SYS(sys_clone
, 6) /* 4120 */
2095 MIPS_SYS(sys_setdomainname
, 2)
2096 MIPS_SYS(sys_newuname
, 1)
2097 MIPS_SYS(sys_ni_syscall
, 0) /* sys_modify_ldt */
2098 MIPS_SYS(sys_adjtimex
, 1)
2099 MIPS_SYS(sys_mprotect
, 3) /* 4125 */
2100 MIPS_SYS(sys_sigprocmask
, 3)
2101 MIPS_SYS(sys_ni_syscall
, 0) /* was create_module */
2102 MIPS_SYS(sys_init_module
, 5)
2103 MIPS_SYS(sys_delete_module
, 1)
2104 MIPS_SYS(sys_ni_syscall
, 0) /* 4130 was get_kernel_syms */
2105 MIPS_SYS(sys_quotactl
, 0)
2106 MIPS_SYS(sys_getpgid
, 1)
2107 MIPS_SYS(sys_fchdir
, 1)
2108 MIPS_SYS(sys_bdflush
, 2)
2109 MIPS_SYS(sys_sysfs
, 3) /* 4135 */
2110 MIPS_SYS(sys_personality
, 1)
2111 MIPS_SYS(sys_ni_syscall
, 0) /* for afs_syscall */
2112 MIPS_SYS(sys_setfsuid
, 1)
2113 MIPS_SYS(sys_setfsgid
, 1)
2114 MIPS_SYS(sys_llseek
, 5) /* 4140 */
2115 MIPS_SYS(sys_getdents
, 3)
2116 MIPS_SYS(sys_select
, 5)
2117 MIPS_SYS(sys_flock
, 2)
2118 MIPS_SYS(sys_msync
, 3)
2119 MIPS_SYS(sys_readv
, 3) /* 4145 */
2120 MIPS_SYS(sys_writev
, 3)
2121 MIPS_SYS(sys_cacheflush
, 3)
2122 MIPS_SYS(sys_cachectl
, 3)
2123 MIPS_SYS(sys_sysmips
, 4)
2124 MIPS_SYS(sys_ni_syscall
, 0) /* 4150 */
2125 MIPS_SYS(sys_getsid
, 1)
2126 MIPS_SYS(sys_fdatasync
, 0)
2127 MIPS_SYS(sys_sysctl
, 1)
2128 MIPS_SYS(sys_mlock
, 2)
2129 MIPS_SYS(sys_munlock
, 2) /* 4155 */
2130 MIPS_SYS(sys_mlockall
, 1)
2131 MIPS_SYS(sys_munlockall
, 0)
2132 MIPS_SYS(sys_sched_setparam
, 2)
2133 MIPS_SYS(sys_sched_getparam
, 2)
2134 MIPS_SYS(sys_sched_setscheduler
, 3) /* 4160 */
2135 MIPS_SYS(sys_sched_getscheduler
, 1)
2136 MIPS_SYS(sys_sched_yield
, 0)
2137 MIPS_SYS(sys_sched_get_priority_max
, 1)
2138 MIPS_SYS(sys_sched_get_priority_min
, 1)
2139 MIPS_SYS(sys_sched_rr_get_interval
, 2) /* 4165 */
2140 MIPS_SYS(sys_nanosleep
, 2)
2141 MIPS_SYS(sys_mremap
, 5)
2142 MIPS_SYS(sys_accept
, 3)
2143 MIPS_SYS(sys_bind
, 3)
2144 MIPS_SYS(sys_connect
, 3) /* 4170 */
2145 MIPS_SYS(sys_getpeername
, 3)
2146 MIPS_SYS(sys_getsockname
, 3)
2147 MIPS_SYS(sys_getsockopt
, 5)
2148 MIPS_SYS(sys_listen
, 2)
2149 MIPS_SYS(sys_recv
, 4) /* 4175 */
2150 MIPS_SYS(sys_recvfrom
, 6)
2151 MIPS_SYS(sys_recvmsg
, 3)
2152 MIPS_SYS(sys_send
, 4)
2153 MIPS_SYS(sys_sendmsg
, 3)
2154 MIPS_SYS(sys_sendto
, 6) /* 4180 */
2155 MIPS_SYS(sys_setsockopt
, 5)
2156 MIPS_SYS(sys_shutdown
, 2)
2157 MIPS_SYS(sys_socket
, 3)
2158 MIPS_SYS(sys_socketpair
, 4)
2159 MIPS_SYS(sys_setresuid
, 3) /* 4185 */
2160 MIPS_SYS(sys_getresuid
, 3)
2161 MIPS_SYS(sys_ni_syscall
, 0) /* was sys_query_module */
2162 MIPS_SYS(sys_poll
, 3)
2163 MIPS_SYS(sys_nfsservctl
, 3)
2164 MIPS_SYS(sys_setresgid
, 3) /* 4190 */
2165 MIPS_SYS(sys_getresgid
, 3)
2166 MIPS_SYS(sys_prctl
, 5)
2167 MIPS_SYS(sys_rt_sigreturn
, 0)
2168 MIPS_SYS(sys_rt_sigaction
, 4)
2169 MIPS_SYS(sys_rt_sigprocmask
, 4) /* 4195 */
2170 MIPS_SYS(sys_rt_sigpending
, 2)
2171 MIPS_SYS(sys_rt_sigtimedwait
, 4)
2172 MIPS_SYS(sys_rt_sigqueueinfo
, 3)
2173 MIPS_SYS(sys_rt_sigsuspend
, 0)
2174 MIPS_SYS(sys_pread64
, 6) /* 4200 */
2175 MIPS_SYS(sys_pwrite64
, 6)
2176 MIPS_SYS(sys_chown
, 3)
2177 MIPS_SYS(sys_getcwd
, 2)
2178 MIPS_SYS(sys_capget
, 2)
2179 MIPS_SYS(sys_capset
, 2) /* 4205 */
2180 MIPS_SYS(sys_sigaltstack
, 2)
2181 MIPS_SYS(sys_sendfile
, 4)
2182 MIPS_SYS(sys_ni_syscall
, 0)
2183 MIPS_SYS(sys_ni_syscall
, 0)
2184 MIPS_SYS(sys_mmap2
, 6) /* 4210 */
2185 MIPS_SYS(sys_truncate64
, 4)
2186 MIPS_SYS(sys_ftruncate64
, 4)
2187 MIPS_SYS(sys_stat64
, 2)
2188 MIPS_SYS(sys_lstat64
, 2)
2189 MIPS_SYS(sys_fstat64
, 2) /* 4215 */
2190 MIPS_SYS(sys_pivot_root
, 2)
2191 MIPS_SYS(sys_mincore
, 3)
2192 MIPS_SYS(sys_madvise
, 3)
2193 MIPS_SYS(sys_getdents64
, 3)
2194 MIPS_SYS(sys_fcntl64
, 3) /* 4220 */
2195 MIPS_SYS(sys_ni_syscall
, 0)
2196 MIPS_SYS(sys_gettid
, 0)
2197 MIPS_SYS(sys_readahead
, 5)
2198 MIPS_SYS(sys_setxattr
, 5)
2199 MIPS_SYS(sys_lsetxattr
, 5) /* 4225 */
2200 MIPS_SYS(sys_fsetxattr
, 5)
2201 MIPS_SYS(sys_getxattr
, 4)
2202 MIPS_SYS(sys_lgetxattr
, 4)
2203 MIPS_SYS(sys_fgetxattr
, 4)
2204 MIPS_SYS(sys_listxattr
, 3) /* 4230 */
2205 MIPS_SYS(sys_llistxattr
, 3)
2206 MIPS_SYS(sys_flistxattr
, 3)
2207 MIPS_SYS(sys_removexattr
, 2)
2208 MIPS_SYS(sys_lremovexattr
, 2)
2209 MIPS_SYS(sys_fremovexattr
, 2) /* 4235 */
2210 MIPS_SYS(sys_tkill
, 2)
2211 MIPS_SYS(sys_sendfile64
, 5)
2212 MIPS_SYS(sys_futex
, 6)
2213 MIPS_SYS(sys_sched_setaffinity
, 3)
2214 MIPS_SYS(sys_sched_getaffinity
, 3) /* 4240 */
2215 MIPS_SYS(sys_io_setup
, 2)
2216 MIPS_SYS(sys_io_destroy
, 1)
2217 MIPS_SYS(sys_io_getevents
, 5)
2218 MIPS_SYS(sys_io_submit
, 3)
2219 MIPS_SYS(sys_io_cancel
, 3) /* 4245 */
2220 MIPS_SYS(sys_exit_group
, 1)
2221 MIPS_SYS(sys_lookup_dcookie
, 3)
2222 MIPS_SYS(sys_epoll_create
, 1)
2223 MIPS_SYS(sys_epoll_ctl
, 4)
2224 MIPS_SYS(sys_epoll_wait
, 3) /* 4250 */
2225 MIPS_SYS(sys_remap_file_pages
, 5)
2226 MIPS_SYS(sys_set_tid_address
, 1)
2227 MIPS_SYS(sys_restart_syscall
, 0)
2228 MIPS_SYS(sys_fadvise64_64
, 7)
2229 MIPS_SYS(sys_statfs64
, 3) /* 4255 */
2230 MIPS_SYS(sys_fstatfs64
, 2)
2231 MIPS_SYS(sys_timer_create
, 3)
2232 MIPS_SYS(sys_timer_settime
, 4)
2233 MIPS_SYS(sys_timer_gettime
, 2)
2234 MIPS_SYS(sys_timer_getoverrun
, 1) /* 4260 */
2235 MIPS_SYS(sys_timer_delete
, 1)
2236 MIPS_SYS(sys_clock_settime
, 2)
2237 MIPS_SYS(sys_clock_gettime
, 2)
2238 MIPS_SYS(sys_clock_getres
, 2)
2239 MIPS_SYS(sys_clock_nanosleep
, 4) /* 4265 */
2240 MIPS_SYS(sys_tgkill
, 3)
2241 MIPS_SYS(sys_utimes
, 2)
2242 MIPS_SYS(sys_mbind
, 4)
2243 MIPS_SYS(sys_ni_syscall
, 0) /* sys_get_mempolicy */
2244 MIPS_SYS(sys_ni_syscall
, 0) /* 4270 sys_set_mempolicy */
2245 MIPS_SYS(sys_mq_open
, 4)
2246 MIPS_SYS(sys_mq_unlink
, 1)
2247 MIPS_SYS(sys_mq_timedsend
, 5)
2248 MIPS_SYS(sys_mq_timedreceive
, 5)
2249 MIPS_SYS(sys_mq_notify
, 2) /* 4275 */
2250 MIPS_SYS(sys_mq_getsetattr
, 3)
2251 MIPS_SYS(sys_ni_syscall
, 0) /* sys_vserver */
2252 MIPS_SYS(sys_waitid
, 4)
2253 MIPS_SYS(sys_ni_syscall
, 0) /* available, was setaltroot */
2254 MIPS_SYS(sys_add_key
, 5)
2255 MIPS_SYS(sys_request_key
, 4)
2256 MIPS_SYS(sys_keyctl
, 5)
2257 MIPS_SYS(sys_set_thread_area
, 1)
2258 MIPS_SYS(sys_inotify_init
, 0)
2259 MIPS_SYS(sys_inotify_add_watch
, 3) /* 4285 */
2260 MIPS_SYS(sys_inotify_rm_watch
, 2)
2261 MIPS_SYS(sys_migrate_pages
, 4)
2262 MIPS_SYS(sys_openat
, 4)
2263 MIPS_SYS(sys_mkdirat
, 3)
2264 MIPS_SYS(sys_mknodat
, 4) /* 4290 */
2265 MIPS_SYS(sys_fchownat
, 5)
2266 MIPS_SYS(sys_futimesat
, 3)
2267 MIPS_SYS(sys_fstatat64
, 4)
2268 MIPS_SYS(sys_unlinkat
, 3)
2269 MIPS_SYS(sys_renameat
, 4) /* 4295 */
2270 MIPS_SYS(sys_linkat
, 5)
2271 MIPS_SYS(sys_symlinkat
, 3)
2272 MIPS_SYS(sys_readlinkat
, 4)
2273 MIPS_SYS(sys_fchmodat
, 3)
2274 MIPS_SYS(sys_faccessat
, 3) /* 4300 */
2275 MIPS_SYS(sys_pselect6
, 6)
2276 MIPS_SYS(sys_ppoll
, 5)
2277 MIPS_SYS(sys_unshare
, 1)
2278 MIPS_SYS(sys_splice
, 6)
2279 MIPS_SYS(sys_sync_file_range
, 7) /* 4305 */
2280 MIPS_SYS(sys_tee
, 4)
2281 MIPS_SYS(sys_vmsplice
, 4)
2282 MIPS_SYS(sys_move_pages
, 6)
2283 MIPS_SYS(sys_set_robust_list
, 2)
2284 MIPS_SYS(sys_get_robust_list
, 3) /* 4310 */
2285 MIPS_SYS(sys_kexec_load
, 4)
2286 MIPS_SYS(sys_getcpu
, 3)
2287 MIPS_SYS(sys_epoll_pwait
, 6)
2288 MIPS_SYS(sys_ioprio_set
, 3)
2289 MIPS_SYS(sys_ioprio_get
, 2)
2290 MIPS_SYS(sys_utimensat
, 4)
2291 MIPS_SYS(sys_signalfd
, 3)
2292 MIPS_SYS(sys_ni_syscall
, 0) /* was timerfd */
2293 MIPS_SYS(sys_eventfd
, 1)
2294 MIPS_SYS(sys_fallocate
, 6) /* 4320 */
2295 MIPS_SYS(sys_timerfd_create
, 2)
2296 MIPS_SYS(sys_timerfd_gettime
, 2)
2297 MIPS_SYS(sys_timerfd_settime
, 4)
2298 MIPS_SYS(sys_signalfd4
, 4)
2299 MIPS_SYS(sys_eventfd2
, 2) /* 4325 */
2300 MIPS_SYS(sys_epoll_create1
, 1)
2301 MIPS_SYS(sys_dup3
, 3)
2302 MIPS_SYS(sys_pipe2
, 2)
2303 MIPS_SYS(sys_inotify_init1
, 1)
2304 MIPS_SYS(sys_preadv
, 6) /* 4330 */
2305 MIPS_SYS(sys_pwritev
, 6)
2306 MIPS_SYS(sys_rt_tgsigqueueinfo
, 4)
2307 MIPS_SYS(sys_perf_event_open
, 5)
2308 MIPS_SYS(sys_accept4
, 4)
2309 MIPS_SYS(sys_recvmmsg
, 5) /* 4335 */
2310 MIPS_SYS(sys_fanotify_init
, 2)
2311 MIPS_SYS(sys_fanotify_mark
, 6)
2312 MIPS_SYS(sys_prlimit64
, 4)
2313 MIPS_SYS(sys_name_to_handle_at
, 5)
2314 MIPS_SYS(sys_open_by_handle_at
, 3) /* 4340 */
2315 MIPS_SYS(sys_clock_adjtime
, 2)
2316 MIPS_SYS(sys_syncfs
, 1)
2321 static int do_store_exclusive(CPUMIPSState
*env
)
2324 target_ulong page_addr
;
2332 page_addr
= addr
& TARGET_PAGE_MASK
;
2335 flags
= page_get_flags(page_addr
);
2336 if ((flags
& PAGE_READ
) == 0) {
2339 reg
= env
->llreg
& 0x1f;
2340 d
= (env
->llreg
& 0x20) != 0;
2342 segv
= get_user_s64(val
, addr
);
2344 segv
= get_user_s32(val
, addr
);
2347 if (val
!= env
->llval
) {
2348 env
->active_tc
.gpr
[reg
] = 0;
2351 segv
= put_user_u64(env
->llnewval
, addr
);
2353 segv
= put_user_u32(env
->llnewval
, addr
);
2356 env
->active_tc
.gpr
[reg
] = 1;
2363 env
->active_tc
.PC
+= 4;
2376 static int do_break(CPUMIPSState
*env
, target_siginfo_t
*info
,
2384 info
->si_signo
= TARGET_SIGFPE
;
2386 info
->si_code
= (code
== BRK_OVERFLOW
) ? FPE_INTOVF
: FPE_INTDIV
;
2387 queue_signal(env
, info
->si_signo
, &*info
);
2391 info
->si_signo
= TARGET_SIGTRAP
;
2393 queue_signal(env
, info
->si_signo
, &*info
);
2401 void cpu_loop(CPUMIPSState
*env
)
2403 CPUState
*cs
= CPU(mips_env_get_cpu(env
));
2404 target_siginfo_t info
;
2407 # ifdef TARGET_ABI_MIPSO32
2408 unsigned int syscall_num
;
2413 trapnr
= cpu_mips_exec(cs
);
2417 env
->active_tc
.PC
+= 4;
2418 # ifdef TARGET_ABI_MIPSO32
2419 syscall_num
= env
->active_tc
.gpr
[2] - 4000;
2420 if (syscall_num
>= sizeof(mips_syscall_args
)) {
2421 ret
= -TARGET_ENOSYS
;
2425 abi_ulong arg5
= 0, arg6
= 0, arg7
= 0, arg8
= 0;
2427 nb_args
= mips_syscall_args
[syscall_num
];
2428 sp_reg
= env
->active_tc
.gpr
[29];
2430 /* these arguments are taken from the stack */
2432 if ((ret
= get_user_ual(arg8
, sp_reg
+ 28)) != 0) {
2436 if ((ret
= get_user_ual(arg7
, sp_reg
+ 24)) != 0) {
2440 if ((ret
= get_user_ual(arg6
, sp_reg
+ 20)) != 0) {
2444 if ((ret
= get_user_ual(arg5
, sp_reg
+ 16)) != 0) {
2450 ret
= do_syscall(env
, env
->active_tc
.gpr
[2],
2451 env
->active_tc
.gpr
[4],
2452 env
->active_tc
.gpr
[5],
2453 env
->active_tc
.gpr
[6],
2454 env
->active_tc
.gpr
[7],
2455 arg5
, arg6
, arg7
, arg8
);
2459 ret
= do_syscall(env
, env
->active_tc
.gpr
[2],
2460 env
->active_tc
.gpr
[4], env
->active_tc
.gpr
[5],
2461 env
->active_tc
.gpr
[6], env
->active_tc
.gpr
[7],
2462 env
->active_tc
.gpr
[8], env
->active_tc
.gpr
[9],
2463 env
->active_tc
.gpr
[10], env
->active_tc
.gpr
[11]);
2465 if (ret
== -TARGET_QEMU_ESIGRETURN
) {
2466 /* Returning from a successful sigreturn syscall.
2467 Avoid clobbering register state. */
2470 if ((abi_ulong
)ret
>= (abi_ulong
)-1133) {
2471 env
->active_tc
.gpr
[7] = 1; /* error flag */
2474 env
->active_tc
.gpr
[7] = 0; /* error flag */
2476 env
->active_tc
.gpr
[2] = ret
;
2482 info
.si_signo
= TARGET_SIGSEGV
;
2484 /* XXX: check env->error_code */
2485 info
.si_code
= TARGET_SEGV_MAPERR
;
2486 info
._sifields
._sigfault
._addr
= env
->CP0_BadVAddr
;
2487 queue_signal(env
, info
.si_signo
, &info
);
2491 info
.si_signo
= TARGET_SIGILL
;
2494 queue_signal(env
, info
.si_signo
, &info
);
2496 case EXCP_INTERRUPT
:
2497 /* just indicate that signals should be handled asap */
2503 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
2506 info
.si_signo
= sig
;
2508 info
.si_code
= TARGET_TRAP_BRKPT
;
2509 queue_signal(env
, info
.si_signo
, &info
);
2514 if (do_store_exclusive(env
)) {
2515 info
.si_signo
= TARGET_SIGSEGV
;
2517 info
.si_code
= TARGET_SEGV_MAPERR
;
2518 info
._sifields
._sigfault
._addr
= env
->active_tc
.PC
;
2519 queue_signal(env
, info
.si_signo
, &info
);
2523 info
.si_signo
= TARGET_SIGILL
;
2525 info
.si_code
= TARGET_ILL_ILLOPC
;
2526 queue_signal(env
, info
.si_signo
, &info
);
2528 /* The code below was inspired by the MIPS Linux kernel trap
2529 * handling code in arch/mips/kernel/traps.c.
2533 abi_ulong trap_instr
;
2536 if (env
->hflags
& MIPS_HFLAG_M16
) {
2537 if (env
->insn_flags
& ASE_MICROMIPS
) {
2538 /* microMIPS mode */
2539 ret
= get_user_u16(trap_instr
, env
->active_tc
.PC
);
2544 if ((trap_instr
>> 10) == 0x11) {
2545 /* 16-bit instruction */
2546 code
= trap_instr
& 0xf;
2548 /* 32-bit instruction */
2551 ret
= get_user_u16(instr_lo
,
2552 env
->active_tc
.PC
+ 2);
2556 trap_instr
= (trap_instr
<< 16) | instr_lo
;
2557 code
= ((trap_instr
>> 6) & ((1 << 20) - 1));
2558 /* Unfortunately, microMIPS also suffers from
2559 the old assembler bug... */
2560 if (code
>= (1 << 10)) {
2566 ret
= get_user_u16(trap_instr
, env
->active_tc
.PC
);
2570 code
= (trap_instr
>> 6) & 0x3f;
2573 ret
= get_user_u32(trap_instr
, env
->active_tc
.PC
);
2578 /* As described in the original Linux kernel code, the
2579 * below checks on 'code' are to work around an old
2582 code
= ((trap_instr
>> 6) & ((1 << 20) - 1));
2583 if (code
>= (1 << 10)) {
2588 if (do_break(env
, &info
, code
) != 0) {
2595 abi_ulong trap_instr
;
2596 unsigned int code
= 0;
2598 if (env
->hflags
& MIPS_HFLAG_M16
) {
2599 /* microMIPS mode */
2602 ret
= get_user_u16(instr
[0], env
->active_tc
.PC
) ||
2603 get_user_u16(instr
[1], env
->active_tc
.PC
+ 2);
2605 trap_instr
= (instr
[0] << 16) | instr
[1];
2607 ret
= get_user_u32(trap_instr
, env
->active_tc
.PC
);
2614 /* The immediate versions don't provide a code. */
2615 if (!(trap_instr
& 0xFC000000)) {
2616 if (env
->hflags
& MIPS_HFLAG_M16
) {
2617 /* microMIPS mode */
2618 code
= ((trap_instr
>> 12) & ((1 << 4) - 1));
2620 code
= ((trap_instr
>> 6) & ((1 << 10) - 1));
2624 if (do_break(env
, &info
, code
) != 0) {
2631 EXCP_DUMP(env
, "qemu: unhandled CPU exception 0x%x - aborting\n", trapnr
);
2634 process_pending_signals(env
);
2639 #ifdef TARGET_OPENRISC
2641 void cpu_loop(CPUOpenRISCState
*env
)
2643 CPUState
*cs
= CPU(openrisc_env_get_cpu(env
));
2648 trapnr
= cpu_openrisc_exec(cs
);
2654 qemu_log_mask(CPU_LOG_INT
, "\nReset request, exit, pc is %#x\n", env
->pc
);
2658 qemu_log_mask(CPU_LOG_INT
, "\nBus error, exit, pc is %#x\n", env
->pc
);
2659 gdbsig
= TARGET_SIGBUS
;
2663 cpu_dump_state(cs
, stderr
, fprintf
, 0);
2664 gdbsig
= TARGET_SIGSEGV
;
2667 qemu_log_mask(CPU_LOG_INT
, "\nTick time interrupt pc is %#x\n", env
->pc
);
2670 qemu_log_mask(CPU_LOG_INT
, "\nAlignment pc is %#x\n", env
->pc
);
2671 gdbsig
= TARGET_SIGBUS
;
2674 qemu_log_mask(CPU_LOG_INT
, "\nIllegal instructionpc is %#x\n", env
->pc
);
2675 gdbsig
= TARGET_SIGILL
;
2678 qemu_log_mask(CPU_LOG_INT
, "\nExternal interruptpc is %#x\n", env
->pc
);
2682 qemu_log_mask(CPU_LOG_INT
, "\nTLB miss\n");
2685 qemu_log_mask(CPU_LOG_INT
, "\nRange\n");
2686 gdbsig
= TARGET_SIGSEGV
;
2689 env
->pc
+= 4; /* 0xc00; */
2690 env
->gpr
[11] = do_syscall(env
,
2691 env
->gpr
[11], /* return value */
2692 env
->gpr
[3], /* r3 - r7 are params */
2700 qemu_log_mask(CPU_LOG_INT
, "\nFloating point error\n");
2703 qemu_log_mask(CPU_LOG_INT
, "\nTrap\n");
2704 gdbsig
= TARGET_SIGTRAP
;
2707 qemu_log_mask(CPU_LOG_INT
, "\nNR\n");
2710 EXCP_DUMP(env
, "\nqemu: unhandled CPU exception %#x - aborting\n",
2712 gdbsig
= TARGET_SIGILL
;
2716 gdb_handlesig(cs
, gdbsig
);
2717 if (gdbsig
!= TARGET_SIGTRAP
) {
2722 process_pending_signals(env
);
2726 #endif /* TARGET_OPENRISC */
2729 void cpu_loop(CPUSH4State
*env
)
2731 CPUState
*cs
= CPU(sh_env_get_cpu(env
));
2733 target_siginfo_t info
;
2737 trapnr
= cpu_sh4_exec(cs
);
2743 ret
= do_syscall(env
,
2752 env
->gregs
[0] = ret
;
2754 case EXCP_INTERRUPT
:
2755 /* just indicate that signals should be handled asap */
2761 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
2764 info
.si_signo
= sig
;
2766 info
.si_code
= TARGET_TRAP_BRKPT
;
2767 queue_signal(env
, info
.si_signo
, &info
);
2773 info
.si_signo
= TARGET_SIGSEGV
;
2775 info
.si_code
= TARGET_SEGV_MAPERR
;
2776 info
._sifields
._sigfault
._addr
= env
->tea
;
2777 queue_signal(env
, info
.si_signo
, &info
);
2781 printf ("Unhandled trap: 0x%x\n", trapnr
);
2782 cpu_dump_state(cs
, stderr
, fprintf
, 0);
2785 process_pending_signals (env
);
2791 void cpu_loop(CPUCRISState
*env
)
2793 CPUState
*cs
= CPU(cris_env_get_cpu(env
));
2795 target_siginfo_t info
;
2799 trapnr
= cpu_cris_exec(cs
);
2804 info
.si_signo
= TARGET_SIGSEGV
;
2806 /* XXX: check env->error_code */
2807 info
.si_code
= TARGET_SEGV_MAPERR
;
2808 info
._sifields
._sigfault
._addr
= env
->pregs
[PR_EDA
];
2809 queue_signal(env
, info
.si_signo
, &info
);
2812 case EXCP_INTERRUPT
:
2813 /* just indicate that signals should be handled asap */
2816 ret
= do_syscall(env
,
2825 env
->regs
[10] = ret
;
2831 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
2834 info
.si_signo
= sig
;
2836 info
.si_code
= TARGET_TRAP_BRKPT
;
2837 queue_signal(env
, info
.si_signo
, &info
);
2842 printf ("Unhandled trap: 0x%x\n", trapnr
);
2843 cpu_dump_state(cs
, stderr
, fprintf
, 0);
2846 process_pending_signals (env
);
2851 #ifdef TARGET_MICROBLAZE
2852 void cpu_loop(CPUMBState
*env
)
2854 CPUState
*cs
= CPU(mb_env_get_cpu(env
));
2856 target_siginfo_t info
;
2860 trapnr
= cpu_mb_exec(cs
);
2865 info
.si_signo
= TARGET_SIGSEGV
;
2867 /* XXX: check env->error_code */
2868 info
.si_code
= TARGET_SEGV_MAPERR
;
2869 info
._sifields
._sigfault
._addr
= 0;
2870 queue_signal(env
, info
.si_signo
, &info
);
2873 case EXCP_INTERRUPT
:
2874 /* just indicate that signals should be handled asap */
2877 /* Return address is 4 bytes after the call. */
2879 env
->sregs
[SR_PC
] = env
->regs
[14];
2880 ret
= do_syscall(env
,
2892 env
->regs
[17] = env
->sregs
[SR_PC
] + 4;
2893 if (env
->iflags
& D_FLAG
) {
2894 env
->sregs
[SR_ESR
] |= 1 << 12;
2895 env
->sregs
[SR_PC
] -= 4;
2896 /* FIXME: if branch was immed, replay the imm as well. */
2899 env
->iflags
&= ~(IMM_FLAG
| D_FLAG
);
2901 switch (env
->sregs
[SR_ESR
] & 31) {
2902 case ESR_EC_DIVZERO
:
2903 info
.si_signo
= TARGET_SIGFPE
;
2905 info
.si_code
= TARGET_FPE_FLTDIV
;
2906 info
._sifields
._sigfault
._addr
= 0;
2907 queue_signal(env
, info
.si_signo
, &info
);
2910 info
.si_signo
= TARGET_SIGFPE
;
2912 if (env
->sregs
[SR_FSR
] & FSR_IO
) {
2913 info
.si_code
= TARGET_FPE_FLTINV
;
2915 if (env
->sregs
[SR_FSR
] & FSR_DZ
) {
2916 info
.si_code
= TARGET_FPE_FLTDIV
;
2918 info
._sifields
._sigfault
._addr
= 0;
2919 queue_signal(env
, info
.si_signo
, &info
);
2922 printf ("Unhandled hw-exception: 0x%x\n",
2923 env
->sregs
[SR_ESR
] & ESR_EC_MASK
);
2924 cpu_dump_state(cs
, stderr
, fprintf
, 0);
2933 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
2936 info
.si_signo
= sig
;
2938 info
.si_code
= TARGET_TRAP_BRKPT
;
2939 queue_signal(env
, info
.si_signo
, &info
);
2944 printf ("Unhandled trap: 0x%x\n", trapnr
);
2945 cpu_dump_state(cs
, stderr
, fprintf
, 0);
2948 process_pending_signals (env
);
2955 void cpu_loop(CPUM68KState
*env
)
2957 CPUState
*cs
= CPU(m68k_env_get_cpu(env
));
2960 target_siginfo_t info
;
2961 TaskState
*ts
= cs
->opaque
;
2965 trapnr
= cpu_m68k_exec(cs
);
2970 if (ts
->sim_syscalls
) {
2972 get_user_u16(nr
, env
->pc
+ 2);
2974 do_m68k_simcall(env
, nr
);
2980 case EXCP_HALT_INSN
:
2981 /* Semihosing syscall. */
2983 do_m68k_semihosting(env
, env
->dregs
[0]);
2987 case EXCP_UNSUPPORTED
:
2989 info
.si_signo
= TARGET_SIGILL
;
2991 info
.si_code
= TARGET_ILL_ILLOPN
;
2992 info
._sifields
._sigfault
._addr
= env
->pc
;
2993 queue_signal(env
, info
.si_signo
, &info
);
2997 ts
->sim_syscalls
= 0;
3000 env
->dregs
[0] = do_syscall(env
,
3011 case EXCP_INTERRUPT
:
3012 /* just indicate that signals should be handled asap */
3016 info
.si_signo
= TARGET_SIGSEGV
;
3018 /* XXX: check env->error_code */
3019 info
.si_code
= TARGET_SEGV_MAPERR
;
3020 info
._sifields
._sigfault
._addr
= env
->mmu
.ar
;
3021 queue_signal(env
, info
.si_signo
, &info
);
3028 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
3031 info
.si_signo
= sig
;
3033 info
.si_code
= TARGET_TRAP_BRKPT
;
3034 queue_signal(env
, info
.si_signo
, &info
);
3039 EXCP_DUMP(env
, "qemu: unhandled CPU exception 0x%x - aborting\n", trapnr
);
3042 process_pending_signals(env
);
3045 #endif /* TARGET_M68K */
3048 static void do_store_exclusive(CPUAlphaState
*env
, int reg
, int quad
)
3050 target_ulong addr
, val
, tmp
;
3051 target_siginfo_t info
;
3054 addr
= env
->lock_addr
;
3055 tmp
= env
->lock_st_addr
;
3056 env
->lock_addr
= -1;
3057 env
->lock_st_addr
= 0;
3063 if (quad
? get_user_s64(val
, addr
) : get_user_s32(val
, addr
)) {
3067 if (val
== env
->lock_value
) {
3069 if (quad
? put_user_u64(tmp
, addr
) : put_user_u32(tmp
, addr
)) {
3086 info
.si_signo
= TARGET_SIGSEGV
;
3088 info
.si_code
= TARGET_SEGV_MAPERR
;
3089 info
._sifields
._sigfault
._addr
= addr
;
3090 queue_signal(env
, TARGET_SIGSEGV
, &info
);
3093 void cpu_loop(CPUAlphaState
*env
)
3095 CPUState
*cs
= CPU(alpha_env_get_cpu(env
));
3097 target_siginfo_t info
;
3102 trapnr
= cpu_alpha_exec(cs
);
3105 /* All of the traps imply a transition through PALcode, which
3106 implies an REI instruction has been executed. Which means
3107 that the intr_flag should be cleared. */
3112 fprintf(stderr
, "Reset requested. Exit\n");
3116 fprintf(stderr
, "Machine check exception. Exit\n");
3119 case EXCP_SMP_INTERRUPT
:
3120 case EXCP_CLK_INTERRUPT
:
3121 case EXCP_DEV_INTERRUPT
:
3122 fprintf(stderr
, "External interrupt. Exit\n");
3126 env
->lock_addr
= -1;
3127 info
.si_signo
= TARGET_SIGSEGV
;
3129 info
.si_code
= (page_get_flags(env
->trap_arg0
) & PAGE_VALID
3130 ? TARGET_SEGV_ACCERR
: TARGET_SEGV_MAPERR
);
3131 info
._sifields
._sigfault
._addr
= env
->trap_arg0
;
3132 queue_signal(env
, info
.si_signo
, &info
);
3135 env
->lock_addr
= -1;
3136 info
.si_signo
= TARGET_SIGBUS
;
3138 info
.si_code
= TARGET_BUS_ADRALN
;
3139 info
._sifields
._sigfault
._addr
= env
->trap_arg0
;
3140 queue_signal(env
, info
.si_signo
, &info
);
3144 env
->lock_addr
= -1;
3145 info
.si_signo
= TARGET_SIGILL
;
3147 info
.si_code
= TARGET_ILL_ILLOPC
;
3148 info
._sifields
._sigfault
._addr
= env
->pc
;
3149 queue_signal(env
, info
.si_signo
, &info
);
3152 env
->lock_addr
= -1;
3153 info
.si_signo
= TARGET_SIGFPE
;
3155 info
.si_code
= TARGET_FPE_FLTINV
;
3156 info
._sifields
._sigfault
._addr
= env
->pc
;
3157 queue_signal(env
, info
.si_signo
, &info
);
3160 /* No-op. Linux simply re-enables the FPU. */
3163 env
->lock_addr
= -1;
3164 switch (env
->error_code
) {
3167 info
.si_signo
= TARGET_SIGTRAP
;
3169 info
.si_code
= TARGET_TRAP_BRKPT
;
3170 info
._sifields
._sigfault
._addr
= env
->pc
;
3171 queue_signal(env
, info
.si_signo
, &info
);
3175 info
.si_signo
= TARGET_SIGTRAP
;
3178 info
._sifields
._sigfault
._addr
= env
->pc
;
3179 queue_signal(env
, info
.si_signo
, &info
);
3183 trapnr
= env
->ir
[IR_V0
];
3184 sysret
= do_syscall(env
, trapnr
,
3185 env
->ir
[IR_A0
], env
->ir
[IR_A1
],
3186 env
->ir
[IR_A2
], env
->ir
[IR_A3
],
3187 env
->ir
[IR_A4
], env
->ir
[IR_A5
],
3189 if (trapnr
== TARGET_NR_sigreturn
3190 || trapnr
== TARGET_NR_rt_sigreturn
) {
3193 /* Syscall writes 0 to V0 to bypass error check, similar
3194 to how this is handled internal to Linux kernel.
3195 (Ab)use trapnr temporarily as boolean indicating error. */
3196 trapnr
= (env
->ir
[IR_V0
] != 0 && sysret
< 0);
3197 env
->ir
[IR_V0
] = (trapnr
? -sysret
: sysret
);
3198 env
->ir
[IR_A3
] = trapnr
;
3202 /* ??? We can probably elide the code using page_unprotect
3203 that is checking for self-modifying code. Instead we
3204 could simply call tb_flush here. Until we work out the
3205 changes required to turn off the extra write protection,
3206 this can be a no-op. */
3210 /* Handled in the translator for usermode. */
3214 /* Handled in the translator for usermode. */
3218 info
.si_signo
= TARGET_SIGFPE
;
3219 switch (env
->ir
[IR_A0
]) {
3220 case TARGET_GEN_INTOVF
:
3221 info
.si_code
= TARGET_FPE_INTOVF
;
3223 case TARGET_GEN_INTDIV
:
3224 info
.si_code
= TARGET_FPE_INTDIV
;
3226 case TARGET_GEN_FLTOVF
:
3227 info
.si_code
= TARGET_FPE_FLTOVF
;
3229 case TARGET_GEN_FLTUND
:
3230 info
.si_code
= TARGET_FPE_FLTUND
;
3232 case TARGET_GEN_FLTINV
:
3233 info
.si_code
= TARGET_FPE_FLTINV
;
3235 case TARGET_GEN_FLTINE
:
3236 info
.si_code
= TARGET_FPE_FLTRES
;
3238 case TARGET_GEN_ROPRAND
:
3242 info
.si_signo
= TARGET_SIGTRAP
;
3247 info
._sifields
._sigfault
._addr
= env
->pc
;
3248 queue_signal(env
, info
.si_signo
, &info
);
3255 info
.si_signo
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
3256 if (info
.si_signo
) {
3257 env
->lock_addr
= -1;
3259 info
.si_code
= TARGET_TRAP_BRKPT
;
3260 queue_signal(env
, info
.si_signo
, &info
);
3265 do_store_exclusive(env
, env
->error_code
, trapnr
- EXCP_STL_C
);
3267 case EXCP_INTERRUPT
:
3268 /* Just indicate that signals should be handled asap. */
3271 printf ("Unhandled trap: 0x%x\n", trapnr
);
3272 cpu_dump_state(cs
, stderr
, fprintf
, 0);
3275 process_pending_signals (env
);
3278 #endif /* TARGET_ALPHA */
3281 void cpu_loop(CPUS390XState
*env
)
3283 CPUState
*cs
= CPU(s390_env_get_cpu(env
));
3285 target_siginfo_t info
;
3290 trapnr
= cpu_s390x_exec(cs
);
3293 case EXCP_INTERRUPT
:
3294 /* Just indicate that signals should be handled asap. */
3298 n
= env
->int_svc_code
;
3300 /* syscalls > 255 */
3303 env
->psw
.addr
+= env
->int_svc_ilen
;
3304 env
->regs
[2] = do_syscall(env
, n
, env
->regs
[2], env
->regs
[3],
3305 env
->regs
[4], env
->regs
[5],
3306 env
->regs
[6], env
->regs
[7], 0, 0);
3310 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
3312 n
= TARGET_TRAP_BRKPT
;
3317 n
= env
->int_pgm_code
;
3320 case PGM_PRIVILEGED
:
3321 sig
= TARGET_SIGILL
;
3322 n
= TARGET_ILL_ILLOPC
;
3324 case PGM_PROTECTION
:
3325 case PGM_ADDRESSING
:
3326 sig
= TARGET_SIGSEGV
;
3327 /* XXX: check env->error_code */
3328 n
= TARGET_SEGV_MAPERR
;
3329 addr
= env
->__excp_addr
;
3332 case PGM_SPECIFICATION
:
3333 case PGM_SPECIAL_OP
:
3336 sig
= TARGET_SIGILL
;
3337 n
= TARGET_ILL_ILLOPN
;
3340 case PGM_FIXPT_OVERFLOW
:
3341 sig
= TARGET_SIGFPE
;
3342 n
= TARGET_FPE_INTOVF
;
3344 case PGM_FIXPT_DIVIDE
:
3345 sig
= TARGET_SIGFPE
;
3346 n
= TARGET_FPE_INTDIV
;
3350 n
= (env
->fpc
>> 8) & 0xff;
3352 /* compare-and-trap */
3355 /* An IEEE exception, simulated or otherwise. */
3357 n
= TARGET_FPE_FLTINV
;
3358 } else if (n
& 0x40) {
3359 n
= TARGET_FPE_FLTDIV
;
3360 } else if (n
& 0x20) {
3361 n
= TARGET_FPE_FLTOVF
;
3362 } else if (n
& 0x10) {
3363 n
= TARGET_FPE_FLTUND
;
3364 } else if (n
& 0x08) {
3365 n
= TARGET_FPE_FLTRES
;
3367 /* ??? Quantum exception; BFP, DFP error. */
3370 sig
= TARGET_SIGFPE
;
3375 fprintf(stderr
, "Unhandled program exception: %#x\n", n
);
3376 cpu_dump_state(cs
, stderr
, fprintf
, 0);
3382 addr
= env
->psw
.addr
;
3384 info
.si_signo
= sig
;
3387 info
._sifields
._sigfault
._addr
= addr
;
3388 queue_signal(env
, info
.si_signo
, &info
);
3392 fprintf(stderr
, "Unhandled trap: 0x%x\n", trapnr
);
3393 cpu_dump_state(cs
, stderr
, fprintf
, 0);
3396 process_pending_signals (env
);
3400 #endif /* TARGET_S390X */
3402 #ifdef TARGET_TILEGX
3404 static void gen_sigill_reg(CPUTLGState
*env
)
3406 target_siginfo_t info
;
3408 info
.si_signo
= TARGET_SIGILL
;
3410 info
.si_code
= TARGET_ILL_PRVREG
;
3411 info
._sifields
._sigfault
._addr
= env
->pc
;
3412 queue_signal(env
, info
.si_signo
, &info
);
3415 static void do_signal(CPUTLGState
*env
, int signo
, int sigcode
)
3417 target_siginfo_t info
;
3419 info
.si_signo
= signo
;
3421 info
._sifields
._sigfault
._addr
= env
->pc
;
3423 if (signo
== TARGET_SIGSEGV
) {
3424 /* The passed in sigcode is a dummy; check for a page mapping
3425 and pass either MAPERR or ACCERR. */
3426 target_ulong addr
= env
->excaddr
;
3427 info
._sifields
._sigfault
._addr
= addr
;
3428 if (page_check_range(addr
, 1, PAGE_VALID
) < 0) {
3429 sigcode
= TARGET_SEGV_MAPERR
;
3431 sigcode
= TARGET_SEGV_ACCERR
;
3434 info
.si_code
= sigcode
;
3436 queue_signal(env
, info
.si_signo
, &info
);
3439 static void gen_sigsegv_maperr(CPUTLGState
*env
, target_ulong addr
)
3441 env
->excaddr
= addr
;
3442 do_signal(env
, TARGET_SIGSEGV
, 0);
3445 static void set_regval(CPUTLGState
*env
, uint8_t reg
, uint64_t val
)
3447 if (unlikely(reg
>= TILEGX_R_COUNT
)) {
3458 gen_sigill_reg(env
);
3461 g_assert_not_reached();
3464 env
->regs
[reg
] = val
;
3468 * Compare the 8-byte contents of the CmpValue SPR with the 8-byte value in
3469 * memory at the address held in the first source register. If the values are
3470 * not equal, then no memory operation is performed. If the values are equal,
3471 * the 8-byte quantity from the second source register is written into memory
3472 * at the address held in the first source register. In either case, the result
3473 * of the instruction is the value read from memory. The compare and write to
3474 * memory are atomic and thus can be used for synchronization purposes. This
3475 * instruction only operates for addresses aligned to a 8-byte boundary.
3476 * Unaligned memory access causes an Unaligned Data Reference interrupt.
3478 * Functional Description (64-bit)
3479 * uint64_t memVal = memoryReadDoubleWord (rf[SrcA]);
3480 * rf[Dest] = memVal;
3481 * if (memVal == SPR[CmpValueSPR])
3482 * memoryWriteDoubleWord (rf[SrcA], rf[SrcB]);
3484 * Functional Description (32-bit)
3485 * uint64_t memVal = signExtend32 (memoryReadWord (rf[SrcA]));
3486 * rf[Dest] = memVal;
3487 * if (memVal == signExtend32 (SPR[CmpValueSPR]))
3488 * memoryWriteWord (rf[SrcA], rf[SrcB]);
3491 * This function also processes exch and exch4 which need not process SPR.
3493 static void do_exch(CPUTLGState
*env
, bool quad
, bool cmp
)
3496 target_long val
, sprval
;
3500 addr
= env
->atomic_srca
;
3501 if (quad
? get_user_s64(val
, addr
) : get_user_s32(val
, addr
)) {
3502 goto sigsegv_maperr
;
3507 sprval
= env
->spregs
[TILEGX_SPR_CMPEXCH
];
3509 sprval
= sextract64(env
->spregs
[TILEGX_SPR_CMPEXCH
], 0, 32);
3513 if (!cmp
|| val
== sprval
) {
3514 target_long valb
= env
->atomic_srcb
;
3515 if (quad
? put_user_u64(valb
, addr
) : put_user_u32(valb
, addr
)) {
3516 goto sigsegv_maperr
;
3520 set_regval(env
, env
->atomic_dstr
, val
);
3526 gen_sigsegv_maperr(env
, addr
);
3529 static void do_fetch(CPUTLGState
*env
, int trapnr
, bool quad
)
3533 target_long val
, valb
;
3537 addr
= env
->atomic_srca
;
3538 valb
= env
->atomic_srcb
;
3539 if (quad
? get_user_s64(val
, addr
) : get_user_s32(val
, addr
)) {
3540 goto sigsegv_maperr
;
3544 case TILEGX_EXCP_OPCODE_FETCHADD
:
3545 case TILEGX_EXCP_OPCODE_FETCHADD4
:
3548 case TILEGX_EXCP_OPCODE_FETCHADDGEZ
:
3554 case TILEGX_EXCP_OPCODE_FETCHADDGEZ4
:
3556 if ((int32_t)valb
< 0) {
3560 case TILEGX_EXCP_OPCODE_FETCHAND
:
3561 case TILEGX_EXCP_OPCODE_FETCHAND4
:
3564 case TILEGX_EXCP_OPCODE_FETCHOR
:
3565 case TILEGX_EXCP_OPCODE_FETCHOR4
:
3569 g_assert_not_reached();
3573 if (quad
? put_user_u64(valb
, addr
) : put_user_u32(valb
, addr
)) {
3574 goto sigsegv_maperr
;
3578 set_regval(env
, env
->atomic_dstr
, val
);
3584 gen_sigsegv_maperr(env
, addr
);
3587 void cpu_loop(CPUTLGState
*env
)
3589 CPUState
*cs
= CPU(tilegx_env_get_cpu(env
));
3594 trapnr
= cpu_tilegx_exec(cs
);
3597 case TILEGX_EXCP_SYSCALL
:
3598 env
->regs
[TILEGX_R_RE
] = do_syscall(env
, env
->regs
[TILEGX_R_NR
],
3599 env
->regs
[0], env
->regs
[1],
3600 env
->regs
[2], env
->regs
[3],
3601 env
->regs
[4], env
->regs
[5],
3602 env
->regs
[6], env
->regs
[7]);
3603 env
->regs
[TILEGX_R_ERR
] = TILEGX_IS_ERRNO(env
->regs
[TILEGX_R_RE
])
3604 ? - env
->regs
[TILEGX_R_RE
]
3607 case TILEGX_EXCP_OPCODE_EXCH
:
3608 do_exch(env
, true, false);
3610 case TILEGX_EXCP_OPCODE_EXCH4
:
3611 do_exch(env
, false, false);
3613 case TILEGX_EXCP_OPCODE_CMPEXCH
:
3614 do_exch(env
, true, true);
3616 case TILEGX_EXCP_OPCODE_CMPEXCH4
:
3617 do_exch(env
, false, true);
3619 case TILEGX_EXCP_OPCODE_FETCHADD
:
3620 case TILEGX_EXCP_OPCODE_FETCHADDGEZ
:
3621 case TILEGX_EXCP_OPCODE_FETCHAND
:
3622 case TILEGX_EXCP_OPCODE_FETCHOR
:
3623 do_fetch(env
, trapnr
, true);
3625 case TILEGX_EXCP_OPCODE_FETCHADD4
:
3626 case TILEGX_EXCP_OPCODE_FETCHADDGEZ4
:
3627 case TILEGX_EXCP_OPCODE_FETCHAND4
:
3628 case TILEGX_EXCP_OPCODE_FETCHOR4
:
3629 do_fetch(env
, trapnr
, false);
3631 case TILEGX_EXCP_SIGNAL
:
3632 do_signal(env
, env
->signo
, env
->sigcode
);
3634 case TILEGX_EXCP_REG_IDN_ACCESS
:
3635 case TILEGX_EXCP_REG_UDN_ACCESS
:
3636 gen_sigill_reg(env
);
3639 fprintf(stderr
, "trapnr is %d[0x%x].\n", trapnr
, trapnr
);
3640 g_assert_not_reached();
3642 process_pending_signals(env
);
3648 THREAD CPUState
*thread_cpu
;
3650 void task_settid(TaskState
*ts
)
3652 if (ts
->ts_tid
== 0) {
3653 ts
->ts_tid
= (pid_t
)syscall(SYS_gettid
);
3657 void stop_all_tasks(void)
3660 * We trust that when using NPTL, start_exclusive()
3661 * handles thread stopping correctly.
3666 /* Assumes contents are already zeroed. */
3667 void init_task_state(TaskState
*ts
)
3672 ts
->first_free
= ts
->sigqueue_table
;
3673 for (i
= 0; i
< MAX_SIGQUEUE_SIZE
- 1; i
++) {
3674 ts
->sigqueue_table
[i
].next
= &ts
->sigqueue_table
[i
+ 1];
3676 ts
->sigqueue_table
[i
].next
= NULL
;
3679 CPUArchState
*cpu_copy(CPUArchState
*env
)
3681 CPUState
*cpu
= ENV_GET_CPU(env
);
3682 CPUState
*new_cpu
= cpu_init(cpu_model
);
3683 CPUArchState
*new_env
= new_cpu
->env_ptr
;
3687 /* Reset non arch specific state */
3690 memcpy(new_env
, env
, sizeof(CPUArchState
));
3692 /* Clone all break/watchpoints.
3693 Note: Once we support ptrace with hw-debug register access, make sure
3694 BP_CPU break/watchpoints are handled correctly on clone. */
3695 QTAILQ_INIT(&new_cpu
->breakpoints
);
3696 QTAILQ_INIT(&new_cpu
->watchpoints
);
3697 QTAILQ_FOREACH(bp
, &cpu
->breakpoints
, entry
) {
3698 cpu_breakpoint_insert(new_cpu
, bp
->pc
, bp
->flags
, NULL
);
3700 QTAILQ_FOREACH(wp
, &cpu
->watchpoints
, entry
) {
3701 cpu_watchpoint_insert(new_cpu
, wp
->vaddr
, wp
->len
, wp
->flags
, NULL
);
3707 static void handle_arg_help(const char *arg
)
3709 usage(EXIT_SUCCESS
);
3712 static void handle_arg_log(const char *arg
)
3716 mask
= qemu_str_to_log_mask(arg
);
3718 qemu_print_log_usage(stdout
);
3724 static void handle_arg_log_filename(const char *arg
)
3726 qemu_set_log_filename(arg
);
3729 static void handle_arg_set_env(const char *arg
)
3731 char *r
, *p
, *token
;
3732 r
= p
= strdup(arg
);
3733 while ((token
= strsep(&p
, ",")) != NULL
) {
3734 if (envlist_setenv(envlist
, token
) != 0) {
3735 usage(EXIT_FAILURE
);
3741 static void handle_arg_unset_env(const char *arg
)
3743 char *r
, *p
, *token
;
3744 r
= p
= strdup(arg
);
3745 while ((token
= strsep(&p
, ",")) != NULL
) {
3746 if (envlist_unsetenv(envlist
, token
) != 0) {
3747 usage(EXIT_FAILURE
);
3753 static void handle_arg_argv0(const char *arg
)
3755 argv0
= strdup(arg
);
3758 static void handle_arg_stack_size(const char *arg
)
3761 guest_stack_size
= strtoul(arg
, &p
, 0);
3762 if (guest_stack_size
== 0) {
3763 usage(EXIT_FAILURE
);
3767 guest_stack_size
*= 1024 * 1024;
3768 } else if (*p
== 'k' || *p
== 'K') {
3769 guest_stack_size
*= 1024;
3773 static void handle_arg_ld_prefix(const char *arg
)
3775 interp_prefix
= strdup(arg
);
3778 static void handle_arg_pagesize(const char *arg
)
3780 qemu_host_page_size
= atoi(arg
);
3781 if (qemu_host_page_size
== 0 ||
3782 (qemu_host_page_size
& (qemu_host_page_size
- 1)) != 0) {
3783 fprintf(stderr
, "page size must be a power of two\n");
3788 static void handle_arg_randseed(const char *arg
)
3790 unsigned long long seed
;
3792 if (parse_uint_full(arg
, &seed
, 0) != 0 || seed
> UINT_MAX
) {
3793 fprintf(stderr
, "Invalid seed number: %s\n", arg
);
3799 static void handle_arg_gdb(const char *arg
)
3801 gdbstub_port
= atoi(arg
);
3804 static void handle_arg_uname(const char *arg
)
3806 qemu_uname_release
= strdup(arg
);
3809 static void handle_arg_cpu(const char *arg
)
3811 cpu_model
= strdup(arg
);
3812 if (cpu_model
== NULL
|| is_help_option(cpu_model
)) {
3813 /* XXX: implement xxx_cpu_list for targets that still miss it */
3814 #if defined(cpu_list)
3815 cpu_list(stdout
, &fprintf
);
3821 static void handle_arg_guest_base(const char *arg
)
3823 guest_base
= strtol(arg
, NULL
, 0);
3824 have_guest_base
= 1;
3827 static void handle_arg_reserved_va(const char *arg
)
3831 reserved_va
= strtoul(arg
, &p
, 0);
3845 unsigned long unshifted
= reserved_va
;
3847 reserved_va
<<= shift
;
3848 if (((reserved_va
>> shift
) != unshifted
)
3849 #if HOST_LONG_BITS > TARGET_VIRT_ADDR_SPACE_BITS
3850 || (reserved_va
> (1ul << TARGET_VIRT_ADDR_SPACE_BITS
))
3853 fprintf(stderr
, "Reserved virtual address too big\n");
3858 fprintf(stderr
, "Unrecognised -R size suffix '%s'\n", p
);
3863 static void handle_arg_singlestep(const char *arg
)
3868 static void handle_arg_strace(const char *arg
)
3873 static void handle_arg_version(const char *arg
)
3875 printf("qemu-" TARGET_NAME
" version " QEMU_VERSION QEMU_PKGVERSION
3876 ", Copyright (c) 2003-2008 Fabrice Bellard\n");
3880 struct qemu_argument
{
3884 void (*handle_opt
)(const char *arg
);
3885 const char *example
;
3889 static const struct qemu_argument arg_table
[] = {
3890 {"h", "", false, handle_arg_help
,
3891 "", "print this help"},
3892 {"help", "", false, handle_arg_help
,
3894 {"g", "QEMU_GDB", true, handle_arg_gdb
,
3895 "port", "wait gdb connection to 'port'"},
3896 {"L", "QEMU_LD_PREFIX", true, handle_arg_ld_prefix
,
3897 "path", "set the elf interpreter prefix to 'path'"},
3898 {"s", "QEMU_STACK_SIZE", true, handle_arg_stack_size
,
3899 "size", "set the stack size to 'size' bytes"},
3900 {"cpu", "QEMU_CPU", true, handle_arg_cpu
,
3901 "model", "select CPU (-cpu help for list)"},
3902 {"E", "QEMU_SET_ENV", true, handle_arg_set_env
,
3903 "var=value", "sets targets environment variable (see below)"},
3904 {"U", "QEMU_UNSET_ENV", true, handle_arg_unset_env
,
3905 "var", "unsets targets environment variable (see below)"},
3906 {"0", "QEMU_ARGV0", true, handle_arg_argv0
,
3907 "argv0", "forces target process argv[0] to be 'argv0'"},
3908 {"r", "QEMU_UNAME", true, handle_arg_uname
,
3909 "uname", "set qemu uname release string to 'uname'"},
3910 {"B", "QEMU_GUEST_BASE", true, handle_arg_guest_base
,
3911 "address", "set guest_base address to 'address'"},
3912 {"R", "QEMU_RESERVED_VA", true, handle_arg_reserved_va
,
3913 "size", "reserve 'size' bytes for guest virtual address space"},
3914 {"d", "QEMU_LOG", true, handle_arg_log
,
3915 "item[,...]", "enable logging of specified items "
3916 "(use '-d help' for a list of items)"},
3917 {"D", "QEMU_LOG_FILENAME", true, handle_arg_log_filename
,
3918 "logfile", "write logs to 'logfile' (default stderr)"},
3919 {"p", "QEMU_PAGESIZE", true, handle_arg_pagesize
,
3920 "pagesize", "set the host page size to 'pagesize'"},
3921 {"singlestep", "QEMU_SINGLESTEP", false, handle_arg_singlestep
,
3922 "", "run in singlestep mode"},
3923 {"strace", "QEMU_STRACE", false, handle_arg_strace
,
3924 "", "log system calls"},
3925 {"seed", "QEMU_RAND_SEED", true, handle_arg_randseed
,
3926 "", "Seed for pseudo-random number generator"},
3927 {"version", "QEMU_VERSION", false, handle_arg_version
,
3928 "", "display version information and exit"},
3929 {NULL
, NULL
, false, NULL
, NULL
, NULL
}
3932 static void usage(int exitcode
)
3934 const struct qemu_argument
*arginfo
;
3938 printf("usage: qemu-" TARGET_NAME
" [options] program [arguments...]\n"
3939 "Linux CPU emulator (compiled for " TARGET_NAME
" emulation)\n"
3941 "Options and associated environment variables:\n"
3944 /* Calculate column widths. We must always have at least enough space
3945 * for the column header.
3947 maxarglen
= strlen("Argument");
3948 maxenvlen
= strlen("Env-variable");
3950 for (arginfo
= arg_table
; arginfo
->handle_opt
!= NULL
; arginfo
++) {
3951 int arglen
= strlen(arginfo
->argv
);
3952 if (arginfo
->has_arg
) {
3953 arglen
+= strlen(arginfo
->example
) + 1;
3955 if (strlen(arginfo
->env
) > maxenvlen
) {
3956 maxenvlen
= strlen(arginfo
->env
);
3958 if (arglen
> maxarglen
) {
3963 printf("%-*s %-*s Description\n", maxarglen
+1, "Argument",
3964 maxenvlen
, "Env-variable");
3966 for (arginfo
= arg_table
; arginfo
->handle_opt
!= NULL
; arginfo
++) {
3967 if (arginfo
->has_arg
) {
3968 printf("-%s %-*s %-*s %s\n", arginfo
->argv
,
3969 (int)(maxarglen
- strlen(arginfo
->argv
) - 1),
3970 arginfo
->example
, maxenvlen
, arginfo
->env
, arginfo
->help
);
3972 printf("-%-*s %-*s %s\n", maxarglen
, arginfo
->argv
,
3973 maxenvlen
, arginfo
->env
,
3980 "QEMU_LD_PREFIX = %s\n"
3981 "QEMU_STACK_SIZE = %ld byte\n",
3986 "You can use -E and -U options or the QEMU_SET_ENV and\n"
3987 "QEMU_UNSET_ENV environment variables to set and unset\n"
3988 "environment variables for the target process.\n"
3989 "It is possible to provide several variables by separating them\n"
3990 "by commas in getsubopt(3) style. Additionally it is possible to\n"
3991 "provide the -E and -U options multiple times.\n"
3992 "The following lines are equivalent:\n"
3993 " -E var1=val2 -E var2=val2 -U LD_PRELOAD -U LD_DEBUG\n"
3994 " -E var1=val2,var2=val2 -U LD_PRELOAD,LD_DEBUG\n"
3995 " QEMU_SET_ENV=var1=val2,var2=val2 QEMU_UNSET_ENV=LD_PRELOAD,LD_DEBUG\n"
3996 "Note that if you provide several changes to a single variable\n"
3997 "the last change will stay in effect.\n");
4002 static int parse_args(int argc
, char **argv
)
4006 const struct qemu_argument
*arginfo
;
4008 for (arginfo
= arg_table
; arginfo
->handle_opt
!= NULL
; arginfo
++) {
4009 if (arginfo
->env
== NULL
) {
4013 r
= getenv(arginfo
->env
);
4015 arginfo
->handle_opt(r
);
4021 if (optind
>= argc
) {
4030 if (!strcmp(r
, "-")) {
4033 /* Treat --foo the same as -foo. */
4038 for (arginfo
= arg_table
; arginfo
->handle_opt
!= NULL
; arginfo
++) {
4039 if (!strcmp(r
, arginfo
->argv
)) {
4040 if (arginfo
->has_arg
) {
4041 if (optind
>= argc
) {
4042 (void) fprintf(stderr
,
4043 "qemu: missing argument for option '%s'\n", r
);
4046 arginfo
->handle_opt(argv
[optind
]);
4049 arginfo
->handle_opt(NULL
);
4055 /* no option matched the current argv */
4056 if (arginfo
->handle_opt
== NULL
) {
4057 (void) fprintf(stderr
, "qemu: unknown option '%s'\n", r
);
4062 if (optind
>= argc
) {
4063 (void) fprintf(stderr
, "qemu: no user program specified\n");
4067 filename
= argv
[optind
];
4068 exec_path
= argv
[optind
];
4073 int main(int argc
, char **argv
, char **envp
)
4075 struct target_pt_regs regs1
, *regs
= ®s1
;
4076 struct image_info info1
, *info
= &info1
;
4077 struct linux_binprm bprm
;
4082 char **target_environ
, **wrk
;
4089 module_call_init(MODULE_INIT_QOM
);
4091 if ((envlist
= envlist_create()) == NULL
) {
4092 (void) fprintf(stderr
, "Unable to allocate envlist\n");
4096 /* add current environment into the list */
4097 for (wrk
= environ
; *wrk
!= NULL
; wrk
++) {
4098 (void) envlist_setenv(envlist
, *wrk
);
4101 /* Read the stack limit from the kernel. If it's "unlimited",
4102 then we can do little else besides use the default. */
4105 if (getrlimit(RLIMIT_STACK
, &lim
) == 0
4106 && lim
.rlim_cur
!= RLIM_INFINITY
4107 && lim
.rlim_cur
== (target_long
)lim
.rlim_cur
) {
4108 guest_stack_size
= lim
.rlim_cur
;
4113 #if defined(cpudef_setup)
4114 cpudef_setup(); /* parse cpu definitions in target config file (TBD) */
4119 optind
= parse_args(argc
, argv
);
4122 memset(regs
, 0, sizeof(struct target_pt_regs
));
4124 /* Zero out image_info */
4125 memset(info
, 0, sizeof(struct image_info
));
4127 memset(&bprm
, 0, sizeof (bprm
));
4129 /* Scan interp_prefix dir for replacement files. */
4130 init_paths(interp_prefix
);
4132 init_qemu_uname_release();
4134 if (cpu_model
== NULL
) {
4135 #if defined(TARGET_I386)
4136 #ifdef TARGET_X86_64
4137 cpu_model
= "qemu64";
4139 cpu_model
= "qemu32";
4141 #elif defined(TARGET_ARM)
4143 #elif defined(TARGET_UNICORE32)
4145 #elif defined(TARGET_M68K)
4147 #elif defined(TARGET_SPARC)
4148 #ifdef TARGET_SPARC64
4149 cpu_model
= "TI UltraSparc II";
4151 cpu_model
= "Fujitsu MB86904";
4153 #elif defined(TARGET_MIPS)
4154 #if defined(TARGET_ABI_MIPSN32) || defined(TARGET_ABI_MIPSN64)
4159 #elif defined TARGET_OPENRISC
4160 cpu_model
= "or1200";
4161 #elif defined(TARGET_PPC)
4162 # ifdef TARGET_PPC64
4163 cpu_model
= "POWER7";
4167 #elif defined TARGET_SH4
4168 cpu_model
= TYPE_SH7785_CPU
;
4174 /* NOTE: we need to init the CPU at this stage to get
4175 qemu_host_page_size */
4176 cpu
= cpu_init(cpu_model
);
4178 fprintf(stderr
, "Unable to find CPU definition\n");
4186 if (getenv("QEMU_STRACE")) {
4190 if (getenv("QEMU_RAND_SEED")) {
4191 handle_arg_randseed(getenv("QEMU_RAND_SEED"));
4194 target_environ
= envlist_to_environ(envlist
, NULL
);
4195 envlist_free(envlist
);
4198 * Now that page sizes are configured in cpu_init() we can do
4199 * proper page alignment for guest_base.
4201 guest_base
= HOST_PAGE_ALIGN(guest_base
);
4203 if (reserved_va
|| have_guest_base
) {
4204 guest_base
= init_guest_space(guest_base
, reserved_va
, 0,
4206 if (guest_base
== (unsigned long)-1) {
4207 fprintf(stderr
, "Unable to reserve 0x%lx bytes of virtual address "
4208 "space for use as guest address space (check your virtual "
4209 "memory ulimit setting or reserve less using -R option)\n",
4215 mmap_next_start
= reserved_va
;
4220 * Read in mmap_min_addr kernel parameter. This value is used
4221 * When loading the ELF image to determine whether guest_base
4222 * is needed. It is also used in mmap_find_vma.
4227 if ((fp
= fopen("/proc/sys/vm/mmap_min_addr", "r")) != NULL
) {
4229 if (fscanf(fp
, "%lu", &tmp
) == 1) {
4230 mmap_min_addr
= tmp
;
4231 qemu_log_mask(CPU_LOG_PAGE
, "host mmap_min_addr=0x%lx\n", mmap_min_addr
);
4238 * Prepare copy of argv vector for target.
4240 target_argc
= argc
- optind
;
4241 target_argv
= calloc(target_argc
+ 1, sizeof (char *));
4242 if (target_argv
== NULL
) {
4243 (void) fprintf(stderr
, "Unable to allocate memory for target_argv\n");
4248 * If argv0 is specified (using '-0' switch) we replace
4249 * argv[0] pointer with the given one.
4252 if (argv0
!= NULL
) {
4253 target_argv
[i
++] = strdup(argv0
);
4255 for (; i
< target_argc
; i
++) {
4256 target_argv
[i
] = strdup(argv
[optind
+ i
]);
4258 target_argv
[target_argc
] = NULL
;
4260 ts
= g_new0(TaskState
, 1);
4261 init_task_state(ts
);
4262 /* build Task State */
4268 execfd
= qemu_getauxval(AT_EXECFD
);
4270 execfd
= open(filename
, O_RDONLY
);
4272 printf("Error while loading %s: %s\n", filename
, strerror(errno
));
4273 _exit(EXIT_FAILURE
);
4277 ret
= loader_exec(execfd
, filename
, target_argv
, target_environ
, regs
,
4280 printf("Error while loading %s: %s\n", filename
, strerror(-ret
));
4281 _exit(EXIT_FAILURE
);
4284 for (wrk
= target_environ
; *wrk
; wrk
++) {
4288 free(target_environ
);
4290 if (qemu_loglevel_mask(CPU_LOG_PAGE
)) {
4291 qemu_log("guest_base 0x%lx\n", guest_base
);
4294 qemu_log("start_brk 0x" TARGET_ABI_FMT_lx
"\n", info
->start_brk
);
4295 qemu_log("end_code 0x" TARGET_ABI_FMT_lx
"\n", info
->end_code
);
4296 qemu_log("start_code 0x" TARGET_ABI_FMT_lx
"\n",
4298 qemu_log("start_data 0x" TARGET_ABI_FMT_lx
"\n",
4300 qemu_log("end_data 0x" TARGET_ABI_FMT_lx
"\n", info
->end_data
);
4301 qemu_log("start_stack 0x" TARGET_ABI_FMT_lx
"\n",
4303 qemu_log("brk 0x" TARGET_ABI_FMT_lx
"\n", info
->brk
);
4304 qemu_log("entry 0x" TARGET_ABI_FMT_lx
"\n", info
->entry
);
4307 target_set_brk(info
->brk
);
4311 /* Now that we've loaded the binary, GUEST_BASE is fixed. Delay
4312 generating the prologue until now so that the prologue can take
4313 the real value of GUEST_BASE into account. */
4314 tcg_prologue_init(&tcg_ctx
);
4316 #if defined(TARGET_I386)
4317 env
->cr
[0] = CR0_PG_MASK
| CR0_WP_MASK
| CR0_PE_MASK
;
4318 env
->hflags
|= HF_PE_MASK
| HF_CPL_MASK
;
4319 if (env
->features
[FEAT_1_EDX
] & CPUID_SSE
) {
4320 env
->cr
[4] |= CR4_OSFXSR_MASK
;
4321 env
->hflags
|= HF_OSFXSR_MASK
;
4323 #ifndef TARGET_ABI32
4324 /* enable 64 bit mode if possible */
4325 if (!(env
->features
[FEAT_8000_0001_EDX
] & CPUID_EXT2_LM
)) {
4326 fprintf(stderr
, "The selected x86 CPU does not support 64 bit mode\n");
4329 env
->cr
[4] |= CR4_PAE_MASK
;
4330 env
->efer
|= MSR_EFER_LMA
| MSR_EFER_LME
;
4331 env
->hflags
|= HF_LMA_MASK
;
4334 /* flags setup : we activate the IRQs by default as in user mode */
4335 env
->eflags
|= IF_MASK
;
4337 /* linux register setup */
4338 #ifndef TARGET_ABI32
4339 env
->regs
[R_EAX
] = regs
->rax
;
4340 env
->regs
[R_EBX
] = regs
->rbx
;
4341 env
->regs
[R_ECX
] = regs
->rcx
;
4342 env
->regs
[R_EDX
] = regs
->rdx
;
4343 env
->regs
[R_ESI
] = regs
->rsi
;
4344 env
->regs
[R_EDI
] = regs
->rdi
;
4345 env
->regs
[R_EBP
] = regs
->rbp
;
4346 env
->regs
[R_ESP
] = regs
->rsp
;
4347 env
->eip
= regs
->rip
;
4349 env
->regs
[R_EAX
] = regs
->eax
;
4350 env
->regs
[R_EBX
] = regs
->ebx
;
4351 env
->regs
[R_ECX
] = regs
->ecx
;
4352 env
->regs
[R_EDX
] = regs
->edx
;
4353 env
->regs
[R_ESI
] = regs
->esi
;
4354 env
->regs
[R_EDI
] = regs
->edi
;
4355 env
->regs
[R_EBP
] = regs
->ebp
;
4356 env
->regs
[R_ESP
] = regs
->esp
;
4357 env
->eip
= regs
->eip
;
4360 /* linux interrupt setup */
4361 #ifndef TARGET_ABI32
4362 env
->idt
.limit
= 511;
4364 env
->idt
.limit
= 255;
4366 env
->idt
.base
= target_mmap(0, sizeof(uint64_t) * (env
->idt
.limit
+ 1),
4367 PROT_READ
|PROT_WRITE
,
4368 MAP_ANONYMOUS
|MAP_PRIVATE
, -1, 0);
4369 idt_table
= g2h(env
->idt
.base
);
4392 /* linux segment setup */
4394 uint64_t *gdt_table
;
4395 env
->gdt
.base
= target_mmap(0, sizeof(uint64_t) * TARGET_GDT_ENTRIES
,
4396 PROT_READ
|PROT_WRITE
,
4397 MAP_ANONYMOUS
|MAP_PRIVATE
, -1, 0);
4398 env
->gdt
.limit
= sizeof(uint64_t) * TARGET_GDT_ENTRIES
- 1;
4399 gdt_table
= g2h(env
->gdt
.base
);
4401 write_dt(&gdt_table
[__USER_CS
>> 3], 0, 0xfffff,
4402 DESC_G_MASK
| DESC_B_MASK
| DESC_P_MASK
| DESC_S_MASK
|
4403 (3 << DESC_DPL_SHIFT
) | (0xa << DESC_TYPE_SHIFT
));
4405 /* 64 bit code segment */
4406 write_dt(&gdt_table
[__USER_CS
>> 3], 0, 0xfffff,
4407 DESC_G_MASK
| DESC_B_MASK
| DESC_P_MASK
| DESC_S_MASK
|
4409 (3 << DESC_DPL_SHIFT
) | (0xa << DESC_TYPE_SHIFT
));
4411 write_dt(&gdt_table
[__USER_DS
>> 3], 0, 0xfffff,
4412 DESC_G_MASK
| DESC_B_MASK
| DESC_P_MASK
| DESC_S_MASK
|
4413 (3 << DESC_DPL_SHIFT
) | (0x2 << DESC_TYPE_SHIFT
));
4415 cpu_x86_load_seg(env
, R_CS
, __USER_CS
);
4416 cpu_x86_load_seg(env
, R_SS
, __USER_DS
);
4418 cpu_x86_load_seg(env
, R_DS
, __USER_DS
);
4419 cpu_x86_load_seg(env
, R_ES
, __USER_DS
);
4420 cpu_x86_load_seg(env
, R_FS
, __USER_DS
);
4421 cpu_x86_load_seg(env
, R_GS
, __USER_DS
);
4422 /* This hack makes Wine work... */
4423 env
->segs
[R_FS
].selector
= 0;
4425 cpu_x86_load_seg(env
, R_DS
, 0);
4426 cpu_x86_load_seg(env
, R_ES
, 0);
4427 cpu_x86_load_seg(env
, R_FS
, 0);
4428 cpu_x86_load_seg(env
, R_GS
, 0);
4430 #elif defined(TARGET_AARCH64)
4434 if (!(arm_feature(env
, ARM_FEATURE_AARCH64
))) {
4436 "The selected ARM CPU does not support 64 bit mode\n");
4440 for (i
= 0; i
< 31; i
++) {
4441 env
->xregs
[i
] = regs
->regs
[i
];
4444 env
->xregs
[31] = regs
->sp
;
4446 #elif defined(TARGET_ARM)
4449 cpsr_write(env
, regs
->uregs
[16], 0xffffffff);
4450 for(i
= 0; i
< 16; i
++) {
4451 env
->regs
[i
] = regs
->uregs
[i
];
4454 if (EF_ARM_EABI_VERSION(info
->elf_flags
) >= EF_ARM_EABI_VER4
4455 && (info
->elf_flags
& EF_ARM_BE8
)) {
4456 env
->bswap_code
= 1;
4459 #elif defined(TARGET_UNICORE32)
4462 cpu_asr_write(env
, regs
->uregs
[32], 0xffffffff);
4463 for (i
= 0; i
< 32; i
++) {
4464 env
->regs
[i
] = regs
->uregs
[i
];
4467 #elif defined(TARGET_SPARC)
4471 env
->npc
= regs
->npc
;
4473 for(i
= 0; i
< 8; i
++)
4474 env
->gregs
[i
] = regs
->u_regs
[i
];
4475 for(i
= 0; i
< 8; i
++)
4476 env
->regwptr
[i
] = regs
->u_regs
[i
+ 8];
4478 #elif defined(TARGET_PPC)
4482 #if defined(TARGET_PPC64)
4483 #if defined(TARGET_ABI32)
4484 env
->msr
&= ~((target_ulong
)1 << MSR_SF
);
4486 env
->msr
|= (target_ulong
)1 << MSR_SF
;
4489 env
->nip
= regs
->nip
;
4490 for(i
= 0; i
< 32; i
++) {
4491 env
->gpr
[i
] = regs
->gpr
[i
];
4494 #elif defined(TARGET_M68K)
4497 env
->dregs
[0] = regs
->d0
;
4498 env
->dregs
[1] = regs
->d1
;
4499 env
->dregs
[2] = regs
->d2
;
4500 env
->dregs
[3] = regs
->d3
;
4501 env
->dregs
[4] = regs
->d4
;
4502 env
->dregs
[5] = regs
->d5
;
4503 env
->dregs
[6] = regs
->d6
;
4504 env
->dregs
[7] = regs
->d7
;
4505 env
->aregs
[0] = regs
->a0
;
4506 env
->aregs
[1] = regs
->a1
;
4507 env
->aregs
[2] = regs
->a2
;
4508 env
->aregs
[3] = regs
->a3
;
4509 env
->aregs
[4] = regs
->a4
;
4510 env
->aregs
[5] = regs
->a5
;
4511 env
->aregs
[6] = regs
->a6
;
4512 env
->aregs
[7] = regs
->usp
;
4514 ts
->sim_syscalls
= 1;
4516 #elif defined(TARGET_MICROBLAZE)
4518 env
->regs
[0] = regs
->r0
;
4519 env
->regs
[1] = regs
->r1
;
4520 env
->regs
[2] = regs
->r2
;
4521 env
->regs
[3] = regs
->r3
;
4522 env
->regs
[4] = regs
->r4
;
4523 env
->regs
[5] = regs
->r5
;
4524 env
->regs
[6] = regs
->r6
;
4525 env
->regs
[7] = regs
->r7
;
4526 env
->regs
[8] = regs
->r8
;
4527 env
->regs
[9] = regs
->r9
;
4528 env
->regs
[10] = regs
->r10
;
4529 env
->regs
[11] = regs
->r11
;
4530 env
->regs
[12] = regs
->r12
;
4531 env
->regs
[13] = regs
->r13
;
4532 env
->regs
[14] = regs
->r14
;
4533 env
->regs
[15] = regs
->r15
;
4534 env
->regs
[16] = regs
->r16
;
4535 env
->regs
[17] = regs
->r17
;
4536 env
->regs
[18] = regs
->r18
;
4537 env
->regs
[19] = regs
->r19
;
4538 env
->regs
[20] = regs
->r20
;
4539 env
->regs
[21] = regs
->r21
;
4540 env
->regs
[22] = regs
->r22
;
4541 env
->regs
[23] = regs
->r23
;
4542 env
->regs
[24] = regs
->r24
;
4543 env
->regs
[25] = regs
->r25
;
4544 env
->regs
[26] = regs
->r26
;
4545 env
->regs
[27] = regs
->r27
;
4546 env
->regs
[28] = regs
->r28
;
4547 env
->regs
[29] = regs
->r29
;
4548 env
->regs
[30] = regs
->r30
;
4549 env
->regs
[31] = regs
->r31
;
4550 env
->sregs
[SR_PC
] = regs
->pc
;
4552 #elif defined(TARGET_MIPS)
4556 for(i
= 0; i
< 32; i
++) {
4557 env
->active_tc
.gpr
[i
] = regs
->regs
[i
];
4559 env
->active_tc
.PC
= regs
->cp0_epc
& ~(target_ulong
)1;
4560 if (regs
->cp0_epc
& 1) {
4561 env
->hflags
|= MIPS_HFLAG_M16
;
4564 #elif defined(TARGET_OPENRISC)
4568 for (i
= 0; i
< 32; i
++) {
4569 env
->gpr
[i
] = regs
->gpr
[i
];
4575 #elif defined(TARGET_SH4)
4579 for(i
= 0; i
< 16; i
++) {
4580 env
->gregs
[i
] = regs
->regs
[i
];
4584 #elif defined(TARGET_ALPHA)
4588 for(i
= 0; i
< 28; i
++) {
4589 env
->ir
[i
] = ((abi_ulong
*)regs
)[i
];
4591 env
->ir
[IR_SP
] = regs
->usp
;
4594 #elif defined(TARGET_CRIS)
4596 env
->regs
[0] = regs
->r0
;
4597 env
->regs
[1] = regs
->r1
;
4598 env
->regs
[2] = regs
->r2
;
4599 env
->regs
[3] = regs
->r3
;
4600 env
->regs
[4] = regs
->r4
;
4601 env
->regs
[5] = regs
->r5
;
4602 env
->regs
[6] = regs
->r6
;
4603 env
->regs
[7] = regs
->r7
;
4604 env
->regs
[8] = regs
->r8
;
4605 env
->regs
[9] = regs
->r9
;
4606 env
->regs
[10] = regs
->r10
;
4607 env
->regs
[11] = regs
->r11
;
4608 env
->regs
[12] = regs
->r12
;
4609 env
->regs
[13] = regs
->r13
;
4610 env
->regs
[14] = info
->start_stack
;
4611 env
->regs
[15] = regs
->acr
;
4612 env
->pc
= regs
->erp
;
4614 #elif defined(TARGET_S390X)
4617 for (i
= 0; i
< 16; i
++) {
4618 env
->regs
[i
] = regs
->gprs
[i
];
4620 env
->psw
.mask
= regs
->psw
.mask
;
4621 env
->psw
.addr
= regs
->psw
.addr
;
4623 #elif defined(TARGET_TILEGX)
4626 for (i
= 0; i
< TILEGX_R_COUNT
; i
++) {
4627 env
->regs
[i
] = regs
->regs
[i
];
4629 for (i
= 0; i
< TILEGX_SPR_COUNT
; i
++) {
4635 #error unsupported target CPU
4638 #if defined(TARGET_ARM) || defined(TARGET_M68K) || defined(TARGET_UNICORE32)
4639 ts
->stack_base
= info
->start_stack
;
4640 ts
->heap_base
= info
->brk
;
4641 /* This will be filled in on the first SYS_HEAPINFO call. */
4646 if (gdbserver_start(gdbstub_port
) < 0) {
4647 fprintf(stderr
, "qemu: could not open gdbserver on port %d\n",
4651 gdb_handlesig(cpu
, 0);