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/>.
26 #include <sys/syscall.h>
27 #include <sys/resource.h>
30 #include "qemu-common.h"
31 #include "qemu/cache-utils.h"
34 #include "qemu/timer.h"
35 #include "qemu/envlist.h"
45 const char *cpu_model
;
46 unsigned long mmap_min_addr
;
47 #if defined(CONFIG_USE_GUEST_BASE)
48 unsigned long guest_base
;
50 #if (TARGET_LONG_BITS == 32) && (HOST_LONG_BITS == 64)
52 * When running 32-on-64 we should make sure we can fit all of the possible
53 * guest address space into a contiguous chunk of virtual host memory.
55 * This way we will never overlap with our own libraries or binaries or stack
56 * or anything else that QEMU maps.
59 /* MIPS only supports 31 bits of virtual address space for user space */
60 unsigned long reserved_va
= 0x77000000;
62 unsigned long reserved_va
= 0xf7000000;
65 unsigned long reserved_va
;
69 static void usage(void);
71 static const char *interp_prefix
= CONFIG_QEMU_INTERP_PREFIX
;
72 const char *qemu_uname_release
= CONFIG_UNAME_RELEASE
;
74 /* XXX: on x86 MAP_GROWSDOWN only works if ESP <= address + 32, so
75 we allocate a bigger stack. Need a better solution, for example
76 by remapping the process stack directly at the right place */
77 unsigned long guest_stack_size
= 8 * 1024 * 1024UL;
79 void gemu_log(const char *fmt
, ...)
84 vfprintf(stderr
, fmt
, ap
);
88 #if defined(TARGET_I386)
89 int cpu_get_pic_interrupt(CPUX86State
*env
)
95 /***********************************************************/
96 /* Helper routines for implementing atomic operations. */
98 /* To implement exclusive operations we force all cpus to syncronise.
99 We don't require a full sync, only that no cpus are executing guest code.
100 The alternative is to map target atomic ops onto host equivalents,
101 which requires quite a lot of per host/target work. */
102 static pthread_mutex_t cpu_list_mutex
= PTHREAD_MUTEX_INITIALIZER
;
103 static pthread_mutex_t exclusive_lock
= PTHREAD_MUTEX_INITIALIZER
;
104 static pthread_cond_t exclusive_cond
= PTHREAD_COND_INITIALIZER
;
105 static pthread_cond_t exclusive_resume
= PTHREAD_COND_INITIALIZER
;
106 static int pending_cpus
;
108 /* Make sure everything is in a consistent state for calling fork(). */
109 void fork_start(void)
111 pthread_mutex_lock(&tcg_ctx
.tb_ctx
.tb_lock
);
112 pthread_mutex_lock(&exclusive_lock
);
116 void fork_end(int child
)
118 mmap_fork_end(child
);
120 CPUState
*cpu
, *next_cpu
;
121 /* Child processes created by fork() only have a single thread.
122 Discard information about the parent threads. */
123 CPU_FOREACH_SAFE(cpu
, next_cpu
) {
124 if (cpu
!= thread_cpu
) {
125 QTAILQ_REMOVE(&cpus
, thread_cpu
, node
);
129 pthread_mutex_init(&exclusive_lock
, NULL
);
130 pthread_mutex_init(&cpu_list_mutex
, NULL
);
131 pthread_cond_init(&exclusive_cond
, NULL
);
132 pthread_cond_init(&exclusive_resume
, NULL
);
133 pthread_mutex_init(&tcg_ctx
.tb_ctx
.tb_lock
, NULL
);
134 gdbserver_fork((CPUArchState
*)thread_cpu
->env_ptr
);
136 pthread_mutex_unlock(&exclusive_lock
);
137 pthread_mutex_unlock(&tcg_ctx
.tb_ctx
.tb_lock
);
141 /* Wait for pending exclusive operations to complete. The exclusive lock
143 static inline void exclusive_idle(void)
145 while (pending_cpus
) {
146 pthread_cond_wait(&exclusive_resume
, &exclusive_lock
);
150 /* Start an exclusive operation.
151 Must only be called from outside cpu_arm_exec. */
152 static inline void start_exclusive(void)
156 pthread_mutex_lock(&exclusive_lock
);
160 /* Make all other cpus stop executing. */
161 CPU_FOREACH(other_cpu
) {
162 if (other_cpu
->running
) {
167 if (pending_cpus
> 1) {
168 pthread_cond_wait(&exclusive_cond
, &exclusive_lock
);
172 /* Finish an exclusive operation. */
173 static inline void end_exclusive(void)
176 pthread_cond_broadcast(&exclusive_resume
);
177 pthread_mutex_unlock(&exclusive_lock
);
180 /* Wait for exclusive ops to finish, and begin cpu execution. */
181 static inline void cpu_exec_start(CPUState
*cpu
)
183 pthread_mutex_lock(&exclusive_lock
);
186 pthread_mutex_unlock(&exclusive_lock
);
189 /* Mark cpu as not executing, and release pending exclusive ops. */
190 static inline void cpu_exec_end(CPUState
*cpu
)
192 pthread_mutex_lock(&exclusive_lock
);
193 cpu
->running
= false;
194 if (pending_cpus
> 1) {
196 if (pending_cpus
== 1) {
197 pthread_cond_signal(&exclusive_cond
);
201 pthread_mutex_unlock(&exclusive_lock
);
204 void cpu_list_lock(void)
206 pthread_mutex_lock(&cpu_list_mutex
);
209 void cpu_list_unlock(void)
211 pthread_mutex_unlock(&cpu_list_mutex
);
216 /***********************************************************/
217 /* CPUX86 core interface */
219 void cpu_smm_update(CPUX86State
*env
)
223 uint64_t cpu_get_tsc(CPUX86State
*env
)
225 return cpu_get_real_ticks();
228 static void write_dt(void *ptr
, unsigned long addr
, unsigned long limit
,
233 e1
= (addr
<< 16) | (limit
& 0xffff);
234 e2
= ((addr
>> 16) & 0xff) | (addr
& 0xff000000) | (limit
& 0x000f0000);
241 static uint64_t *idt_table
;
243 static void set_gate64(void *ptr
, unsigned int type
, unsigned int dpl
,
244 uint64_t addr
, unsigned int sel
)
247 e1
= (addr
& 0xffff) | (sel
<< 16);
248 e2
= (addr
& 0xffff0000) | 0x8000 | (dpl
<< 13) | (type
<< 8);
252 p
[2] = tswap32(addr
>> 32);
255 /* only dpl matters as we do only user space emulation */
256 static void set_idt(int n
, unsigned int dpl
)
258 set_gate64(idt_table
+ n
* 2, 0, dpl
, 0, 0);
261 static void set_gate(void *ptr
, unsigned int type
, unsigned int dpl
,
262 uint32_t addr
, unsigned int sel
)
265 e1
= (addr
& 0xffff) | (sel
<< 16);
266 e2
= (addr
& 0xffff0000) | 0x8000 | (dpl
<< 13) | (type
<< 8);
272 /* only dpl matters as we do only user space emulation */
273 static void set_idt(int n
, unsigned int dpl
)
275 set_gate(idt_table
+ n
, 0, dpl
, 0, 0);
279 void cpu_loop(CPUX86State
*env
)
281 CPUState
*cs
= CPU(x86_env_get_cpu(env
));
284 target_siginfo_t info
;
287 trapnr
= cpu_x86_exec(env
);
290 /* linux syscall from int $0x80 */
291 env
->regs
[R_EAX
] = do_syscall(env
,
303 /* linux syscall from syscall instruction */
304 env
->regs
[R_EAX
] = do_syscall(env
,
313 env
->eip
= env
->exception_next_eip
;
318 info
.si_signo
= SIGBUS
;
320 info
.si_code
= TARGET_SI_KERNEL
;
321 info
._sifields
._sigfault
._addr
= 0;
322 queue_signal(env
, info
.si_signo
, &info
);
325 /* XXX: potential problem if ABI32 */
326 #ifndef TARGET_X86_64
327 if (env
->eflags
& VM_MASK
) {
328 handle_vm86_fault(env
);
332 info
.si_signo
= SIGSEGV
;
334 info
.si_code
= TARGET_SI_KERNEL
;
335 info
._sifields
._sigfault
._addr
= 0;
336 queue_signal(env
, info
.si_signo
, &info
);
340 info
.si_signo
= SIGSEGV
;
342 if (!(env
->error_code
& 1))
343 info
.si_code
= TARGET_SEGV_MAPERR
;
345 info
.si_code
= TARGET_SEGV_ACCERR
;
346 info
._sifields
._sigfault
._addr
= env
->cr
[2];
347 queue_signal(env
, info
.si_signo
, &info
);
350 #ifndef TARGET_X86_64
351 if (env
->eflags
& VM_MASK
) {
352 handle_vm86_trap(env
, trapnr
);
356 /* division by zero */
357 info
.si_signo
= SIGFPE
;
359 info
.si_code
= TARGET_FPE_INTDIV
;
360 info
._sifields
._sigfault
._addr
= env
->eip
;
361 queue_signal(env
, info
.si_signo
, &info
);
366 #ifndef TARGET_X86_64
367 if (env
->eflags
& VM_MASK
) {
368 handle_vm86_trap(env
, trapnr
);
372 info
.si_signo
= SIGTRAP
;
374 if (trapnr
== EXCP01_DB
) {
375 info
.si_code
= TARGET_TRAP_BRKPT
;
376 info
._sifields
._sigfault
._addr
= env
->eip
;
378 info
.si_code
= TARGET_SI_KERNEL
;
379 info
._sifields
._sigfault
._addr
= 0;
381 queue_signal(env
, info
.si_signo
, &info
);
386 #ifndef TARGET_X86_64
387 if (env
->eflags
& VM_MASK
) {
388 handle_vm86_trap(env
, trapnr
);
392 info
.si_signo
= SIGSEGV
;
394 info
.si_code
= TARGET_SI_KERNEL
;
395 info
._sifields
._sigfault
._addr
= 0;
396 queue_signal(env
, info
.si_signo
, &info
);
400 info
.si_signo
= SIGILL
;
402 info
.si_code
= TARGET_ILL_ILLOPN
;
403 info
._sifields
._sigfault
._addr
= env
->eip
;
404 queue_signal(env
, info
.si_signo
, &info
);
407 /* just indicate that signals should be handled asap */
413 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
418 info
.si_code
= TARGET_TRAP_BRKPT
;
419 queue_signal(env
, info
.si_signo
, &info
);
424 pc
= env
->segs
[R_CS
].base
+ env
->eip
;
425 fprintf(stderr
, "qemu: 0x%08lx: unhandled CPU exception 0x%x - aborting\n",
429 process_pending_signals(env
);
436 #define get_user_code_u32(x, gaddr, doswap) \
437 ({ abi_long __r = get_user_u32((x), (gaddr)); \
438 if (!__r && (doswap)) { \
444 #define get_user_code_u16(x, gaddr, doswap) \
445 ({ abi_long __r = get_user_u16((x), (gaddr)); \
446 if (!__r && (doswap)) { \
453 * See the Linux kernel's Documentation/arm/kernel_user_helpers.txt
455 * r0 = pointer to oldval
456 * r1 = pointer to newval
457 * r2 = pointer to target value
460 * r0 = 0 if *ptr was changed, non-0 if no exchange happened
461 * C set if *ptr was changed, clear if no exchange happened
463 * Note segv's in kernel helpers are a bit tricky, we can set the
464 * data address sensibly but the PC address is just the entry point.
466 static void arm_kernel_cmpxchg64_helper(CPUARMState
*env
)
468 uint64_t oldval
, newval
, val
;
470 target_siginfo_t info
;
472 /* Based on the 32 bit code in do_kernel_trap */
474 /* XXX: This only works between threads, not between processes.
475 It's probably possible to implement this with native host
476 operations. However things like ldrex/strex are much harder so
477 there's not much point trying. */
479 cpsr
= cpsr_read(env
);
482 if (get_user_u64(oldval
, env
->regs
[0])) {
483 env
->cp15
.c6_data
= env
->regs
[0];
487 if (get_user_u64(newval
, env
->regs
[1])) {
488 env
->cp15
.c6_data
= env
->regs
[1];
492 if (get_user_u64(val
, addr
)) {
493 env
->cp15
.c6_data
= addr
;
500 if (put_user_u64(val
, addr
)) {
501 env
->cp15
.c6_data
= addr
;
511 cpsr_write(env
, cpsr
, CPSR_C
);
517 /* We get the PC of the entry address - which is as good as anything,
518 on a real kernel what you get depends on which mode it uses. */
519 info
.si_signo
= SIGSEGV
;
521 /* XXX: check env->error_code */
522 info
.si_code
= TARGET_SEGV_MAPERR
;
523 info
._sifields
._sigfault
._addr
= env
->cp15
.c6_data
;
524 queue_signal(env
, info
.si_signo
, &info
);
529 /* Handle a jump to the kernel code page. */
531 do_kernel_trap(CPUARMState
*env
)
537 switch (env
->regs
[15]) {
538 case 0xffff0fa0: /* __kernel_memory_barrier */
539 /* ??? No-op. Will need to do better for SMP. */
541 case 0xffff0fc0: /* __kernel_cmpxchg */
542 /* XXX: This only works between threads, not between processes.
543 It's probably possible to implement this with native host
544 operations. However things like ldrex/strex are much harder so
545 there's not much point trying. */
547 cpsr
= cpsr_read(env
);
549 /* FIXME: This should SEGV if the access fails. */
550 if (get_user_u32(val
, addr
))
552 if (val
== env
->regs
[0]) {
554 /* FIXME: Check for segfaults. */
555 put_user_u32(val
, addr
);
562 cpsr_write(env
, cpsr
, CPSR_C
);
565 case 0xffff0fe0: /* __kernel_get_tls */
566 env
->regs
[0] = env
->cp15
.c13_tls2
;
568 case 0xffff0f60: /* __kernel_cmpxchg64 */
569 arm_kernel_cmpxchg64_helper(env
);
575 /* Jump back to the caller. */
576 addr
= env
->regs
[14];
581 env
->regs
[15] = addr
;
586 static int do_strex(CPUARMState
*env
)
594 addr
= env
->exclusive_addr
;
595 if (addr
!= env
->exclusive_test
) {
598 size
= env
->exclusive_info
& 0xf;
601 segv
= get_user_u8(val
, addr
);
604 segv
= get_user_u16(val
, addr
);
608 segv
= get_user_u32(val
, addr
);
614 env
->cp15
.c6_data
= addr
;
617 if (val
!= env
->exclusive_val
) {
621 segv
= get_user_u32(val
, addr
+ 4);
623 env
->cp15
.c6_data
= addr
+ 4;
626 if (val
!= env
->exclusive_high
) {
630 val
= env
->regs
[(env
->exclusive_info
>> 8) & 0xf];
633 segv
= put_user_u8(val
, addr
);
636 segv
= put_user_u16(val
, addr
);
640 segv
= put_user_u32(val
, addr
);
644 env
->cp15
.c6_data
= addr
;
648 val
= env
->regs
[(env
->exclusive_info
>> 12) & 0xf];
649 segv
= put_user_u32(val
, addr
+ 4);
651 env
->cp15
.c6_data
= addr
+ 4;
658 env
->regs
[(env
->exclusive_info
>> 4) & 0xf] = rc
;
664 void cpu_loop(CPUARMState
*env
)
666 CPUState
*cs
= CPU(arm_env_get_cpu(env
));
668 unsigned int n
, insn
;
669 target_siginfo_t info
;
674 trapnr
= cpu_arm_exec(env
);
679 TaskState
*ts
= env
->opaque
;
683 /* we handle the FPU emulation here, as Linux */
684 /* we get the opcode */
685 /* FIXME - what to do if get_user() fails? */
686 get_user_code_u32(opcode
, env
->regs
[15], env
->bswap_code
);
688 rc
= EmulateAll(opcode
, &ts
->fpa
, env
);
689 if (rc
== 0) { /* illegal instruction */
690 info
.si_signo
= SIGILL
;
692 info
.si_code
= TARGET_ILL_ILLOPN
;
693 info
._sifields
._sigfault
._addr
= env
->regs
[15];
694 queue_signal(env
, info
.si_signo
, &info
);
695 } else if (rc
< 0) { /* FP exception */
698 /* translate softfloat flags to FPSR flags */
699 if (-rc
& float_flag_invalid
)
701 if (-rc
& float_flag_divbyzero
)
703 if (-rc
& float_flag_overflow
)
705 if (-rc
& float_flag_underflow
)
707 if (-rc
& float_flag_inexact
)
710 FPSR fpsr
= ts
->fpa
.fpsr
;
711 //printf("fpsr 0x%x, arm_fpe 0x%x\n",fpsr,arm_fpe);
713 if (fpsr
& (arm_fpe
<< 16)) { /* exception enabled? */
714 info
.si_signo
= SIGFPE
;
717 /* ordered by priority, least first */
718 if (arm_fpe
& BIT_IXC
) info
.si_code
= TARGET_FPE_FLTRES
;
719 if (arm_fpe
& BIT_UFC
) info
.si_code
= TARGET_FPE_FLTUND
;
720 if (arm_fpe
& BIT_OFC
) info
.si_code
= TARGET_FPE_FLTOVF
;
721 if (arm_fpe
& BIT_DZC
) info
.si_code
= TARGET_FPE_FLTDIV
;
722 if (arm_fpe
& BIT_IOC
) info
.si_code
= TARGET_FPE_FLTINV
;
724 info
._sifields
._sigfault
._addr
= env
->regs
[15];
725 queue_signal(env
, info
.si_signo
, &info
);
730 /* accumulate unenabled exceptions */
731 if ((!(fpsr
& BIT_IXE
)) && (arm_fpe
& BIT_IXC
))
733 if ((!(fpsr
& BIT_UFE
)) && (arm_fpe
& BIT_UFC
))
735 if ((!(fpsr
& BIT_OFE
)) && (arm_fpe
& BIT_OFC
))
737 if ((!(fpsr
& BIT_DZE
)) && (arm_fpe
& BIT_DZC
))
739 if ((!(fpsr
& BIT_IOE
)) && (arm_fpe
& BIT_IOC
))
742 } else { /* everything OK */
753 if (trapnr
== EXCP_BKPT
) {
755 /* FIXME - what to do if get_user() fails? */
756 get_user_code_u16(insn
, env
->regs
[15], env
->bswap_code
);
760 /* FIXME - what to do if get_user() fails? */
761 get_user_code_u32(insn
, env
->regs
[15], env
->bswap_code
);
762 n
= (insn
& 0xf) | ((insn
>> 4) & 0xff0);
767 /* FIXME - what to do if get_user() fails? */
768 get_user_code_u16(insn
, env
->regs
[15] - 2,
772 /* FIXME - what to do if get_user() fails? */
773 get_user_code_u32(insn
, env
->regs
[15] - 4,
779 if (n
== ARM_NR_cacheflush
) {
781 } else if (n
== ARM_NR_semihosting
782 || n
== ARM_NR_thumb_semihosting
) {
783 env
->regs
[0] = do_arm_semihosting (env
);
784 } else if (n
== 0 || n
>= ARM_SYSCALL_BASE
|| env
->thumb
) {
786 if (env
->thumb
|| n
== 0) {
789 n
-= ARM_SYSCALL_BASE
;
792 if ( n
> ARM_NR_BASE
) {
794 case ARM_NR_cacheflush
:
798 cpu_set_tls(env
, env
->regs
[0]);
802 gemu_log("qemu: Unsupported ARM syscall: 0x%x\n",
804 env
->regs
[0] = -TARGET_ENOSYS
;
808 env
->regs
[0] = do_syscall(env
,
824 /* just indicate that signals should be handled asap */
826 case EXCP_PREFETCH_ABORT
:
827 addr
= env
->cp15
.c6_insn
;
829 case EXCP_DATA_ABORT
:
830 addr
= env
->cp15
.c6_data
;
833 info
.si_signo
= SIGSEGV
;
835 /* XXX: check env->error_code */
836 info
.si_code
= TARGET_SEGV_MAPERR
;
837 info
._sifields
._sigfault
._addr
= addr
;
838 queue_signal(env
, info
.si_signo
, &info
);
845 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
850 info
.si_code
= TARGET_TRAP_BRKPT
;
851 queue_signal(env
, info
.si_signo
, &info
);
855 case EXCP_KERNEL_TRAP
:
856 if (do_kernel_trap(env
))
861 addr
= env
->cp15
.c6_data
;
867 fprintf(stderr
, "qemu: unhandled CPU exception 0x%x - aborting\n",
869 cpu_dump_state(cs
, stderr
, fprintf
, 0);
872 process_pending_signals(env
);
878 #ifdef TARGET_UNICORE32
880 void cpu_loop(CPUUniCore32State
*env
)
882 CPUState
*cs
= CPU(uc32_env_get_cpu(env
));
884 unsigned int n
, insn
;
885 target_siginfo_t info
;
889 trapnr
= uc32_cpu_exec(env
);
895 get_user_u32(insn
, env
->regs
[31] - 4);
898 if (n
>= UC32_SYSCALL_BASE
) {
900 n
-= UC32_SYSCALL_BASE
;
901 if (n
== UC32_SYSCALL_NR_set_tls
) {
902 cpu_set_tls(env
, env
->regs
[0]);
905 env
->regs
[0] = do_syscall(env
,
920 case UC32_EXCP_DTRAP
:
921 case UC32_EXCP_ITRAP
:
922 info
.si_signo
= SIGSEGV
;
924 /* XXX: check env->error_code */
925 info
.si_code
= TARGET_SEGV_MAPERR
;
926 info
._sifields
._sigfault
._addr
= env
->cp0
.c4_faultaddr
;
927 queue_signal(env
, info
.si_signo
, &info
);
930 /* just indicate that signals should be handled asap */
936 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
940 info
.si_code
= TARGET_TRAP_BRKPT
;
941 queue_signal(env
, info
.si_signo
, &info
);
948 process_pending_signals(env
);
952 fprintf(stderr
, "qemu: unhandled CPU exception 0x%x - aborting\n", trapnr
);
953 cpu_dump_state(cs
, stderr
, fprintf
, 0);
959 #define SPARC64_STACK_BIAS 2047
963 /* WARNING: dealing with register windows _is_ complicated. More info
964 can be found at http://www.sics.se/~psm/sparcstack.html */
965 static inline int get_reg_index(CPUSPARCState
*env
, int cwp
, int index
)
967 index
= (index
+ cwp
* 16) % (16 * env
->nwindows
);
968 /* wrap handling : if cwp is on the last window, then we use the
969 registers 'after' the end */
970 if (index
< 8 && env
->cwp
== env
->nwindows
- 1)
971 index
+= 16 * env
->nwindows
;
975 /* save the register window 'cwp1' */
976 static inline void save_window_offset(CPUSPARCState
*env
, int cwp1
)
981 sp_ptr
= env
->regbase
[get_reg_index(env
, cwp1
, 6)];
982 #ifdef TARGET_SPARC64
984 sp_ptr
+= SPARC64_STACK_BIAS
;
986 #if defined(DEBUG_WIN)
987 printf("win_overflow: sp_ptr=0x" TARGET_ABI_FMT_lx
" save_cwp=%d\n",
990 for(i
= 0; i
< 16; i
++) {
991 /* FIXME - what to do if put_user() fails? */
992 put_user_ual(env
->regbase
[get_reg_index(env
, cwp1
, 8 + i
)], sp_ptr
);
993 sp_ptr
+= sizeof(abi_ulong
);
997 static void save_window(CPUSPARCState
*env
)
999 #ifndef TARGET_SPARC64
1000 unsigned int new_wim
;
1001 new_wim
= ((env
->wim
>> 1) | (env
->wim
<< (env
->nwindows
- 1))) &
1002 ((1LL << env
->nwindows
) - 1);
1003 save_window_offset(env
, cpu_cwp_dec(env
, env
->cwp
- 2));
1006 save_window_offset(env
, cpu_cwp_dec(env
, env
->cwp
- 2));
1012 static void restore_window(CPUSPARCState
*env
)
1014 #ifndef TARGET_SPARC64
1015 unsigned int new_wim
;
1017 unsigned int i
, cwp1
;
1020 #ifndef TARGET_SPARC64
1021 new_wim
= ((env
->wim
<< 1) | (env
->wim
>> (env
->nwindows
- 1))) &
1022 ((1LL << env
->nwindows
) - 1);
1025 /* restore the invalid window */
1026 cwp1
= cpu_cwp_inc(env
, env
->cwp
+ 1);
1027 sp_ptr
= env
->regbase
[get_reg_index(env
, cwp1
, 6)];
1028 #ifdef TARGET_SPARC64
1030 sp_ptr
+= SPARC64_STACK_BIAS
;
1032 #if defined(DEBUG_WIN)
1033 printf("win_underflow: sp_ptr=0x" TARGET_ABI_FMT_lx
" load_cwp=%d\n",
1036 for(i
= 0; i
< 16; i
++) {
1037 /* FIXME - what to do if get_user() fails? */
1038 get_user_ual(env
->regbase
[get_reg_index(env
, cwp1
, 8 + i
)], sp_ptr
);
1039 sp_ptr
+= sizeof(abi_ulong
);
1041 #ifdef TARGET_SPARC64
1043 if (env
->cleanwin
< env
->nwindows
- 1)
1051 static void flush_windows(CPUSPARCState
*env
)
1057 /* if restore would invoke restore_window(), then we can stop */
1058 cwp1
= cpu_cwp_inc(env
, env
->cwp
+ offset
);
1059 #ifndef TARGET_SPARC64
1060 if (env
->wim
& (1 << cwp1
))
1063 if (env
->canrestore
== 0)
1068 save_window_offset(env
, cwp1
);
1071 cwp1
= cpu_cwp_inc(env
, env
->cwp
+ 1);
1072 #ifndef TARGET_SPARC64
1073 /* set wim so that restore will reload the registers */
1074 env
->wim
= 1 << cwp1
;
1076 #if defined(DEBUG_WIN)
1077 printf("flush_windows: nb=%d\n", offset
- 1);
1081 void cpu_loop (CPUSPARCState
*env
)
1083 CPUState
*cs
= CPU(sparc_env_get_cpu(env
));
1086 target_siginfo_t info
;
1089 trapnr
= cpu_sparc_exec (env
);
1091 /* Compute PSR before exposing state. */
1092 if (env
->cc_op
!= CC_OP_FLAGS
) {
1097 #ifndef TARGET_SPARC64
1104 ret
= do_syscall (env
, env
->gregs
[1],
1105 env
->regwptr
[0], env
->regwptr
[1],
1106 env
->regwptr
[2], env
->regwptr
[3],
1107 env
->regwptr
[4], env
->regwptr
[5],
1109 if ((abi_ulong
)ret
>= (abi_ulong
)(-515)) {
1110 #if defined(TARGET_SPARC64) && !defined(TARGET_ABI32)
1111 env
->xcc
|= PSR_CARRY
;
1113 env
->psr
|= PSR_CARRY
;
1117 #if defined(TARGET_SPARC64) && !defined(TARGET_ABI32)
1118 env
->xcc
&= ~PSR_CARRY
;
1120 env
->psr
&= ~PSR_CARRY
;
1123 env
->regwptr
[0] = ret
;
1124 /* next instruction */
1126 env
->npc
= env
->npc
+ 4;
1128 case 0x83: /* flush windows */
1133 /* next instruction */
1135 env
->npc
= env
->npc
+ 4;
1137 #ifndef TARGET_SPARC64
1138 case TT_WIN_OVF
: /* window overflow */
1141 case TT_WIN_UNF
: /* window underflow */
1142 restore_window(env
);
1147 info
.si_signo
= TARGET_SIGSEGV
;
1149 /* XXX: check env->error_code */
1150 info
.si_code
= TARGET_SEGV_MAPERR
;
1151 info
._sifields
._sigfault
._addr
= env
->mmuregs
[4];
1152 queue_signal(env
, info
.si_signo
, &info
);
1156 case TT_SPILL
: /* window overflow */
1159 case TT_FILL
: /* window underflow */
1160 restore_window(env
);
1165 info
.si_signo
= TARGET_SIGSEGV
;
1167 /* XXX: check env->error_code */
1168 info
.si_code
= TARGET_SEGV_MAPERR
;
1169 if (trapnr
== TT_DFAULT
)
1170 info
._sifields
._sigfault
._addr
= env
->dmmuregs
[4];
1172 info
._sifields
._sigfault
._addr
= cpu_tsptr(env
)->tpc
;
1173 queue_signal(env
, info
.si_signo
, &info
);
1176 #ifndef TARGET_ABI32
1179 sparc64_get_context(env
);
1183 sparc64_set_context(env
);
1187 case EXCP_INTERRUPT
:
1188 /* just indicate that signals should be handled asap */
1192 info
.si_signo
= TARGET_SIGILL
;
1194 info
.si_code
= TARGET_ILL_ILLOPC
;
1195 info
._sifields
._sigfault
._addr
= env
->pc
;
1196 queue_signal(env
, info
.si_signo
, &info
);
1203 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
1206 info
.si_signo
= sig
;
1208 info
.si_code
= TARGET_TRAP_BRKPT
;
1209 queue_signal(env
, info
.si_signo
, &info
);
1214 printf ("Unhandled trap: 0x%x\n", trapnr
);
1215 cpu_dump_state(cs
, stderr
, fprintf
, 0);
1218 process_pending_signals (env
);
1225 static inline uint64_t cpu_ppc_get_tb(CPUPPCState
*env
)
1231 uint64_t cpu_ppc_load_tbl(CPUPPCState
*env
)
1233 return cpu_ppc_get_tb(env
);
1236 uint32_t cpu_ppc_load_tbu(CPUPPCState
*env
)
1238 return cpu_ppc_get_tb(env
) >> 32;
1241 uint64_t cpu_ppc_load_atbl(CPUPPCState
*env
)
1243 return cpu_ppc_get_tb(env
);
1246 uint32_t cpu_ppc_load_atbu(CPUPPCState
*env
)
1248 return cpu_ppc_get_tb(env
) >> 32;
1251 uint32_t cpu_ppc601_load_rtcu(CPUPPCState
*env
)
1252 __attribute__ (( alias ("cpu_ppc_load_tbu") ));
1254 uint32_t cpu_ppc601_load_rtcl(CPUPPCState
*env
)
1256 return cpu_ppc_load_tbl(env
) & 0x3FFFFF80;
1259 /* XXX: to be fixed */
1260 int ppc_dcr_read (ppc_dcr_t
*dcr_env
, int dcrn
, uint32_t *valp
)
1265 int ppc_dcr_write (ppc_dcr_t
*dcr_env
, int dcrn
, uint32_t val
)
1270 #define EXCP_DUMP(env, fmt, ...) \
1272 CPUState *cs = ENV_GET_CPU(env); \
1273 fprintf(stderr, fmt , ## __VA_ARGS__); \
1274 cpu_dump_state(cs, stderr, fprintf, 0); \
1275 qemu_log(fmt, ## __VA_ARGS__); \
1276 if (qemu_log_enabled()) { \
1277 log_cpu_state(cs, 0); \
1281 static int do_store_exclusive(CPUPPCState
*env
)
1284 target_ulong page_addr
;
1289 addr
= env
->reserve_ea
;
1290 page_addr
= addr
& TARGET_PAGE_MASK
;
1293 flags
= page_get_flags(page_addr
);
1294 if ((flags
& PAGE_READ
) == 0) {
1297 int reg
= env
->reserve_info
& 0x1f;
1298 int size
= (env
->reserve_info
>> 5) & 0xf;
1301 if (addr
== env
->reserve_addr
) {
1303 case 1: segv
= get_user_u8(val
, addr
); break;
1304 case 2: segv
= get_user_u16(val
, addr
); break;
1305 case 4: segv
= get_user_u32(val
, addr
); break;
1306 #if defined(TARGET_PPC64)
1307 case 8: segv
= get_user_u64(val
, addr
); break;
1311 if (!segv
&& val
== env
->reserve_val
) {
1312 val
= env
->gpr
[reg
];
1314 case 1: segv
= put_user_u8(val
, addr
); break;
1315 case 2: segv
= put_user_u16(val
, addr
); break;
1316 case 4: segv
= put_user_u32(val
, addr
); break;
1317 #if defined(TARGET_PPC64)
1318 case 8: segv
= put_user_u64(val
, addr
); break;
1327 env
->crf
[0] = (stored
<< 1) | xer_so
;
1328 env
->reserve_addr
= (target_ulong
)-1;
1338 void cpu_loop(CPUPPCState
*env
)
1340 CPUState
*cs
= CPU(ppc_env_get_cpu(env
));
1341 target_siginfo_t info
;
1347 trapnr
= cpu_ppc_exec(env
);
1350 case POWERPC_EXCP_NONE
:
1353 case POWERPC_EXCP_CRITICAL
: /* Critical input */
1354 cpu_abort(env
, "Critical interrupt while in user mode. "
1357 case POWERPC_EXCP_MCHECK
: /* Machine check exception */
1358 cpu_abort(env
, "Machine check exception while in user mode. "
1361 case POWERPC_EXCP_DSI
: /* Data storage exception */
1362 EXCP_DUMP(env
, "Invalid data memory access: 0x" TARGET_FMT_lx
"\n",
1364 /* XXX: check this. Seems bugged */
1365 switch (env
->error_code
& 0xFF000000) {
1367 info
.si_signo
= TARGET_SIGSEGV
;
1369 info
.si_code
= TARGET_SEGV_MAPERR
;
1372 info
.si_signo
= TARGET_SIGILL
;
1374 info
.si_code
= TARGET_ILL_ILLADR
;
1377 info
.si_signo
= TARGET_SIGSEGV
;
1379 info
.si_code
= TARGET_SEGV_ACCERR
;
1382 /* Let's send a regular segfault... */
1383 EXCP_DUMP(env
, "Invalid segfault errno (%02x)\n",
1385 info
.si_signo
= TARGET_SIGSEGV
;
1387 info
.si_code
= TARGET_SEGV_MAPERR
;
1390 info
._sifields
._sigfault
._addr
= env
->nip
;
1391 queue_signal(env
, info
.si_signo
, &info
);
1393 case POWERPC_EXCP_ISI
: /* Instruction storage exception */
1394 EXCP_DUMP(env
, "Invalid instruction fetch: 0x\n" TARGET_FMT_lx
1395 "\n", env
->spr
[SPR_SRR0
]);
1396 /* XXX: check this */
1397 switch (env
->error_code
& 0xFF000000) {
1399 info
.si_signo
= TARGET_SIGSEGV
;
1401 info
.si_code
= TARGET_SEGV_MAPERR
;
1405 info
.si_signo
= TARGET_SIGSEGV
;
1407 info
.si_code
= TARGET_SEGV_ACCERR
;
1410 /* Let's send a regular segfault... */
1411 EXCP_DUMP(env
, "Invalid segfault errno (%02x)\n",
1413 info
.si_signo
= TARGET_SIGSEGV
;
1415 info
.si_code
= TARGET_SEGV_MAPERR
;
1418 info
._sifields
._sigfault
._addr
= env
->nip
- 4;
1419 queue_signal(env
, info
.si_signo
, &info
);
1421 case POWERPC_EXCP_EXTERNAL
: /* External input */
1422 cpu_abort(env
, "External interrupt while in user mode. "
1425 case POWERPC_EXCP_ALIGN
: /* Alignment exception */
1426 EXCP_DUMP(env
, "Unaligned memory access\n");
1427 /* XXX: check this */
1428 info
.si_signo
= TARGET_SIGBUS
;
1430 info
.si_code
= TARGET_BUS_ADRALN
;
1431 info
._sifields
._sigfault
._addr
= env
->nip
- 4;
1432 queue_signal(env
, info
.si_signo
, &info
);
1434 case POWERPC_EXCP_PROGRAM
: /* Program exception */
1435 /* XXX: check this */
1436 switch (env
->error_code
& ~0xF) {
1437 case POWERPC_EXCP_FP
:
1438 EXCP_DUMP(env
, "Floating point program exception\n");
1439 info
.si_signo
= TARGET_SIGFPE
;
1441 switch (env
->error_code
& 0xF) {
1442 case POWERPC_EXCP_FP_OX
:
1443 info
.si_code
= TARGET_FPE_FLTOVF
;
1445 case POWERPC_EXCP_FP_UX
:
1446 info
.si_code
= TARGET_FPE_FLTUND
;
1448 case POWERPC_EXCP_FP_ZX
:
1449 case POWERPC_EXCP_FP_VXZDZ
:
1450 info
.si_code
= TARGET_FPE_FLTDIV
;
1452 case POWERPC_EXCP_FP_XX
:
1453 info
.si_code
= TARGET_FPE_FLTRES
;
1455 case POWERPC_EXCP_FP_VXSOFT
:
1456 info
.si_code
= TARGET_FPE_FLTINV
;
1458 case POWERPC_EXCP_FP_VXSNAN
:
1459 case POWERPC_EXCP_FP_VXISI
:
1460 case POWERPC_EXCP_FP_VXIDI
:
1461 case POWERPC_EXCP_FP_VXIMZ
:
1462 case POWERPC_EXCP_FP_VXVC
:
1463 case POWERPC_EXCP_FP_VXSQRT
:
1464 case POWERPC_EXCP_FP_VXCVI
:
1465 info
.si_code
= TARGET_FPE_FLTSUB
;
1468 EXCP_DUMP(env
, "Unknown floating point exception (%02x)\n",
1473 case POWERPC_EXCP_INVAL
:
1474 EXCP_DUMP(env
, "Invalid instruction\n");
1475 info
.si_signo
= TARGET_SIGILL
;
1477 switch (env
->error_code
& 0xF) {
1478 case POWERPC_EXCP_INVAL_INVAL
:
1479 info
.si_code
= TARGET_ILL_ILLOPC
;
1481 case POWERPC_EXCP_INVAL_LSWX
:
1482 info
.si_code
= TARGET_ILL_ILLOPN
;
1484 case POWERPC_EXCP_INVAL_SPR
:
1485 info
.si_code
= TARGET_ILL_PRVREG
;
1487 case POWERPC_EXCP_INVAL_FP
:
1488 info
.si_code
= TARGET_ILL_COPROC
;
1491 EXCP_DUMP(env
, "Unknown invalid operation (%02x)\n",
1492 env
->error_code
& 0xF);
1493 info
.si_code
= TARGET_ILL_ILLADR
;
1497 case POWERPC_EXCP_PRIV
:
1498 EXCP_DUMP(env
, "Privilege violation\n");
1499 info
.si_signo
= TARGET_SIGILL
;
1501 switch (env
->error_code
& 0xF) {
1502 case POWERPC_EXCP_PRIV_OPC
:
1503 info
.si_code
= TARGET_ILL_PRVOPC
;
1505 case POWERPC_EXCP_PRIV_REG
:
1506 info
.si_code
= TARGET_ILL_PRVREG
;
1509 EXCP_DUMP(env
, "Unknown privilege violation (%02x)\n",
1510 env
->error_code
& 0xF);
1511 info
.si_code
= TARGET_ILL_PRVOPC
;
1515 case POWERPC_EXCP_TRAP
:
1516 cpu_abort(env
, "Tried to call a TRAP\n");
1519 /* Should not happen ! */
1520 cpu_abort(env
, "Unknown program exception (%02x)\n",
1524 info
._sifields
._sigfault
._addr
= env
->nip
- 4;
1525 queue_signal(env
, info
.si_signo
, &info
);
1527 case POWERPC_EXCP_FPU
: /* Floating-point unavailable exception */
1528 EXCP_DUMP(env
, "No floating point allowed\n");
1529 info
.si_signo
= TARGET_SIGILL
;
1531 info
.si_code
= TARGET_ILL_COPROC
;
1532 info
._sifields
._sigfault
._addr
= env
->nip
- 4;
1533 queue_signal(env
, info
.si_signo
, &info
);
1535 case POWERPC_EXCP_SYSCALL
: /* System call exception */
1536 cpu_abort(env
, "Syscall exception while in user mode. "
1539 case POWERPC_EXCP_APU
: /* Auxiliary processor unavailable */
1540 EXCP_DUMP(env
, "No APU instruction allowed\n");
1541 info
.si_signo
= TARGET_SIGILL
;
1543 info
.si_code
= TARGET_ILL_COPROC
;
1544 info
._sifields
._sigfault
._addr
= env
->nip
- 4;
1545 queue_signal(env
, info
.si_signo
, &info
);
1547 case POWERPC_EXCP_DECR
: /* Decrementer exception */
1548 cpu_abort(env
, "Decrementer interrupt while in user mode. "
1551 case POWERPC_EXCP_FIT
: /* Fixed-interval timer interrupt */
1552 cpu_abort(env
, "Fix interval timer interrupt while in user mode. "
1555 case POWERPC_EXCP_WDT
: /* Watchdog timer interrupt */
1556 cpu_abort(env
, "Watchdog timer interrupt while in user mode. "
1559 case POWERPC_EXCP_DTLB
: /* Data TLB error */
1560 cpu_abort(env
, "Data TLB exception while in user mode. "
1563 case POWERPC_EXCP_ITLB
: /* Instruction TLB error */
1564 cpu_abort(env
, "Instruction TLB exception while in user mode. "
1567 case POWERPC_EXCP_SPEU
: /* SPE/embedded floating-point unavail. */
1568 EXCP_DUMP(env
, "No SPE/floating-point instruction allowed\n");
1569 info
.si_signo
= TARGET_SIGILL
;
1571 info
.si_code
= TARGET_ILL_COPROC
;
1572 info
._sifields
._sigfault
._addr
= env
->nip
- 4;
1573 queue_signal(env
, info
.si_signo
, &info
);
1575 case POWERPC_EXCP_EFPDI
: /* Embedded floating-point data IRQ */
1576 cpu_abort(env
, "Embedded floating-point data IRQ not handled\n");
1578 case POWERPC_EXCP_EFPRI
: /* Embedded floating-point round IRQ */
1579 cpu_abort(env
, "Embedded floating-point round IRQ not handled\n");
1581 case POWERPC_EXCP_EPERFM
: /* Embedded performance monitor IRQ */
1582 cpu_abort(env
, "Performance monitor exception not handled\n");
1584 case POWERPC_EXCP_DOORI
: /* Embedded doorbell interrupt */
1585 cpu_abort(env
, "Doorbell interrupt while in user mode. "
1588 case POWERPC_EXCP_DOORCI
: /* Embedded doorbell critical interrupt */
1589 cpu_abort(env
, "Doorbell critical interrupt while in user mode. "
1592 case POWERPC_EXCP_RESET
: /* System reset exception */
1593 cpu_abort(env
, "Reset interrupt while in user mode. "
1596 case POWERPC_EXCP_DSEG
: /* Data segment exception */
1597 cpu_abort(env
, "Data segment exception while in user mode. "
1600 case POWERPC_EXCP_ISEG
: /* Instruction segment exception */
1601 cpu_abort(env
, "Instruction segment exception "
1602 "while in user mode. Aborting\n");
1604 /* PowerPC 64 with hypervisor mode support */
1605 case POWERPC_EXCP_HDECR
: /* Hypervisor decrementer exception */
1606 cpu_abort(env
, "Hypervisor decrementer interrupt "
1607 "while in user mode. Aborting\n");
1609 case POWERPC_EXCP_TRACE
: /* Trace exception */
1611 * we use this exception to emulate step-by-step execution mode.
1614 /* PowerPC 64 with hypervisor mode support */
1615 case POWERPC_EXCP_HDSI
: /* Hypervisor data storage exception */
1616 cpu_abort(env
, "Hypervisor data storage exception "
1617 "while in user mode. Aborting\n");
1619 case POWERPC_EXCP_HISI
: /* Hypervisor instruction storage excp */
1620 cpu_abort(env
, "Hypervisor instruction storage exception "
1621 "while in user mode. Aborting\n");
1623 case POWERPC_EXCP_HDSEG
: /* Hypervisor data segment exception */
1624 cpu_abort(env
, "Hypervisor data segment exception "
1625 "while in user mode. Aborting\n");
1627 case POWERPC_EXCP_HISEG
: /* Hypervisor instruction segment excp */
1628 cpu_abort(env
, "Hypervisor instruction segment exception "
1629 "while in user mode. Aborting\n");
1631 case POWERPC_EXCP_VPU
: /* Vector unavailable exception */
1632 EXCP_DUMP(env
, "No Altivec instructions allowed\n");
1633 info
.si_signo
= TARGET_SIGILL
;
1635 info
.si_code
= TARGET_ILL_COPROC
;
1636 info
._sifields
._sigfault
._addr
= env
->nip
- 4;
1637 queue_signal(env
, info
.si_signo
, &info
);
1639 case POWERPC_EXCP_PIT
: /* Programmable interval timer IRQ */
1640 cpu_abort(env
, "Programmable interval timer interrupt "
1641 "while in user mode. Aborting\n");
1643 case POWERPC_EXCP_IO
: /* IO error exception */
1644 cpu_abort(env
, "IO error exception while in user mode. "
1647 case POWERPC_EXCP_RUNM
: /* Run mode exception */
1648 cpu_abort(env
, "Run mode exception while in user mode. "
1651 case POWERPC_EXCP_EMUL
: /* Emulation trap exception */
1652 cpu_abort(env
, "Emulation trap exception not handled\n");
1654 case POWERPC_EXCP_IFTLB
: /* Instruction fetch TLB error */
1655 cpu_abort(env
, "Instruction fetch TLB exception "
1656 "while in user-mode. Aborting");
1658 case POWERPC_EXCP_DLTLB
: /* Data load TLB miss */
1659 cpu_abort(env
, "Data load TLB exception while in user-mode. "
1662 case POWERPC_EXCP_DSTLB
: /* Data store TLB miss */
1663 cpu_abort(env
, "Data store TLB exception while in user-mode. "
1666 case POWERPC_EXCP_FPA
: /* Floating-point assist exception */
1667 cpu_abort(env
, "Floating-point assist exception not handled\n");
1669 case POWERPC_EXCP_IABR
: /* Instruction address breakpoint */
1670 cpu_abort(env
, "Instruction address breakpoint exception "
1673 case POWERPC_EXCP_SMI
: /* System management interrupt */
1674 cpu_abort(env
, "System management interrupt while in user mode. "
1677 case POWERPC_EXCP_THERM
: /* Thermal interrupt */
1678 cpu_abort(env
, "Thermal interrupt interrupt while in user mode. "
1681 case POWERPC_EXCP_PERFM
: /* Embedded performance monitor IRQ */
1682 cpu_abort(env
, "Performance monitor exception not handled\n");
1684 case POWERPC_EXCP_VPUA
: /* Vector assist exception */
1685 cpu_abort(env
, "Vector assist exception not handled\n");
1687 case POWERPC_EXCP_SOFTP
: /* Soft patch exception */
1688 cpu_abort(env
, "Soft patch exception not handled\n");
1690 case POWERPC_EXCP_MAINT
: /* Maintenance exception */
1691 cpu_abort(env
, "Maintenance exception while in user mode. "
1694 case POWERPC_EXCP_STOP
: /* stop translation */
1695 /* We did invalidate the instruction cache. Go on */
1697 case POWERPC_EXCP_BRANCH
: /* branch instruction: */
1698 /* We just stopped because of a branch. Go on */
1700 case POWERPC_EXCP_SYSCALL_USER
:
1701 /* system call in user-mode emulation */
1703 * PPC ABI uses overflow flag in cr0 to signal an error
1706 env
->crf
[0] &= ~0x1;
1707 ret
= do_syscall(env
, env
->gpr
[0], env
->gpr
[3], env
->gpr
[4],
1708 env
->gpr
[5], env
->gpr
[6], env
->gpr
[7],
1710 if (ret
== (target_ulong
)(-TARGET_QEMU_ESIGRETURN
)) {
1711 /* Returning from a successful sigreturn syscall.
1712 Avoid corrupting register state. */
1715 if (ret
> (target_ulong
)(-515)) {
1721 case POWERPC_EXCP_STCX
:
1722 if (do_store_exclusive(env
)) {
1723 info
.si_signo
= TARGET_SIGSEGV
;
1725 info
.si_code
= TARGET_SEGV_MAPERR
;
1726 info
._sifields
._sigfault
._addr
= env
->nip
;
1727 queue_signal(env
, info
.si_signo
, &info
);
1734 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
1736 info
.si_signo
= sig
;
1738 info
.si_code
= TARGET_TRAP_BRKPT
;
1739 queue_signal(env
, info
.si_signo
, &info
);
1743 case EXCP_INTERRUPT
:
1744 /* just indicate that signals should be handled asap */
1747 cpu_abort(env
, "Unknown exception 0x%d. Aborting\n", trapnr
);
1750 process_pending_signals(env
);
1757 # ifdef TARGET_ABI_MIPSO32
1758 # define MIPS_SYS(name, args) args,
1759 static const uint8_t mips_syscall_args
[] = {
1760 MIPS_SYS(sys_syscall
, 8) /* 4000 */
1761 MIPS_SYS(sys_exit
, 1)
1762 MIPS_SYS(sys_fork
, 0)
1763 MIPS_SYS(sys_read
, 3)
1764 MIPS_SYS(sys_write
, 3)
1765 MIPS_SYS(sys_open
, 3) /* 4005 */
1766 MIPS_SYS(sys_close
, 1)
1767 MIPS_SYS(sys_waitpid
, 3)
1768 MIPS_SYS(sys_creat
, 2)
1769 MIPS_SYS(sys_link
, 2)
1770 MIPS_SYS(sys_unlink
, 1) /* 4010 */
1771 MIPS_SYS(sys_execve
, 0)
1772 MIPS_SYS(sys_chdir
, 1)
1773 MIPS_SYS(sys_time
, 1)
1774 MIPS_SYS(sys_mknod
, 3)
1775 MIPS_SYS(sys_chmod
, 2) /* 4015 */
1776 MIPS_SYS(sys_lchown
, 3)
1777 MIPS_SYS(sys_ni_syscall
, 0)
1778 MIPS_SYS(sys_ni_syscall
, 0) /* was sys_stat */
1779 MIPS_SYS(sys_lseek
, 3)
1780 MIPS_SYS(sys_getpid
, 0) /* 4020 */
1781 MIPS_SYS(sys_mount
, 5)
1782 MIPS_SYS(sys_oldumount
, 1)
1783 MIPS_SYS(sys_setuid
, 1)
1784 MIPS_SYS(sys_getuid
, 0)
1785 MIPS_SYS(sys_stime
, 1) /* 4025 */
1786 MIPS_SYS(sys_ptrace
, 4)
1787 MIPS_SYS(sys_alarm
, 1)
1788 MIPS_SYS(sys_ni_syscall
, 0) /* was sys_fstat */
1789 MIPS_SYS(sys_pause
, 0)
1790 MIPS_SYS(sys_utime
, 2) /* 4030 */
1791 MIPS_SYS(sys_ni_syscall
, 0)
1792 MIPS_SYS(sys_ni_syscall
, 0)
1793 MIPS_SYS(sys_access
, 2)
1794 MIPS_SYS(sys_nice
, 1)
1795 MIPS_SYS(sys_ni_syscall
, 0) /* 4035 */
1796 MIPS_SYS(sys_sync
, 0)
1797 MIPS_SYS(sys_kill
, 2)
1798 MIPS_SYS(sys_rename
, 2)
1799 MIPS_SYS(sys_mkdir
, 2)
1800 MIPS_SYS(sys_rmdir
, 1) /* 4040 */
1801 MIPS_SYS(sys_dup
, 1)
1802 MIPS_SYS(sys_pipe
, 0)
1803 MIPS_SYS(sys_times
, 1)
1804 MIPS_SYS(sys_ni_syscall
, 0)
1805 MIPS_SYS(sys_brk
, 1) /* 4045 */
1806 MIPS_SYS(sys_setgid
, 1)
1807 MIPS_SYS(sys_getgid
, 0)
1808 MIPS_SYS(sys_ni_syscall
, 0) /* was signal(2) */
1809 MIPS_SYS(sys_geteuid
, 0)
1810 MIPS_SYS(sys_getegid
, 0) /* 4050 */
1811 MIPS_SYS(sys_acct
, 0)
1812 MIPS_SYS(sys_umount
, 2)
1813 MIPS_SYS(sys_ni_syscall
, 0)
1814 MIPS_SYS(sys_ioctl
, 3)
1815 MIPS_SYS(sys_fcntl
, 3) /* 4055 */
1816 MIPS_SYS(sys_ni_syscall
, 2)
1817 MIPS_SYS(sys_setpgid
, 2)
1818 MIPS_SYS(sys_ni_syscall
, 0)
1819 MIPS_SYS(sys_olduname
, 1)
1820 MIPS_SYS(sys_umask
, 1) /* 4060 */
1821 MIPS_SYS(sys_chroot
, 1)
1822 MIPS_SYS(sys_ustat
, 2)
1823 MIPS_SYS(sys_dup2
, 2)
1824 MIPS_SYS(sys_getppid
, 0)
1825 MIPS_SYS(sys_getpgrp
, 0) /* 4065 */
1826 MIPS_SYS(sys_setsid
, 0)
1827 MIPS_SYS(sys_sigaction
, 3)
1828 MIPS_SYS(sys_sgetmask
, 0)
1829 MIPS_SYS(sys_ssetmask
, 1)
1830 MIPS_SYS(sys_setreuid
, 2) /* 4070 */
1831 MIPS_SYS(sys_setregid
, 2)
1832 MIPS_SYS(sys_sigsuspend
, 0)
1833 MIPS_SYS(sys_sigpending
, 1)
1834 MIPS_SYS(sys_sethostname
, 2)
1835 MIPS_SYS(sys_setrlimit
, 2) /* 4075 */
1836 MIPS_SYS(sys_getrlimit
, 2)
1837 MIPS_SYS(sys_getrusage
, 2)
1838 MIPS_SYS(sys_gettimeofday
, 2)
1839 MIPS_SYS(sys_settimeofday
, 2)
1840 MIPS_SYS(sys_getgroups
, 2) /* 4080 */
1841 MIPS_SYS(sys_setgroups
, 2)
1842 MIPS_SYS(sys_ni_syscall
, 0) /* old_select */
1843 MIPS_SYS(sys_symlink
, 2)
1844 MIPS_SYS(sys_ni_syscall
, 0) /* was sys_lstat */
1845 MIPS_SYS(sys_readlink
, 3) /* 4085 */
1846 MIPS_SYS(sys_uselib
, 1)
1847 MIPS_SYS(sys_swapon
, 2)
1848 MIPS_SYS(sys_reboot
, 3)
1849 MIPS_SYS(old_readdir
, 3)
1850 MIPS_SYS(old_mmap
, 6) /* 4090 */
1851 MIPS_SYS(sys_munmap
, 2)
1852 MIPS_SYS(sys_truncate
, 2)
1853 MIPS_SYS(sys_ftruncate
, 2)
1854 MIPS_SYS(sys_fchmod
, 2)
1855 MIPS_SYS(sys_fchown
, 3) /* 4095 */
1856 MIPS_SYS(sys_getpriority
, 2)
1857 MIPS_SYS(sys_setpriority
, 3)
1858 MIPS_SYS(sys_ni_syscall
, 0)
1859 MIPS_SYS(sys_statfs
, 2)
1860 MIPS_SYS(sys_fstatfs
, 2) /* 4100 */
1861 MIPS_SYS(sys_ni_syscall
, 0) /* was ioperm(2) */
1862 MIPS_SYS(sys_socketcall
, 2)
1863 MIPS_SYS(sys_syslog
, 3)
1864 MIPS_SYS(sys_setitimer
, 3)
1865 MIPS_SYS(sys_getitimer
, 2) /* 4105 */
1866 MIPS_SYS(sys_newstat
, 2)
1867 MIPS_SYS(sys_newlstat
, 2)
1868 MIPS_SYS(sys_newfstat
, 2)
1869 MIPS_SYS(sys_uname
, 1)
1870 MIPS_SYS(sys_ni_syscall
, 0) /* 4110 was iopl(2) */
1871 MIPS_SYS(sys_vhangup
, 0)
1872 MIPS_SYS(sys_ni_syscall
, 0) /* was sys_idle() */
1873 MIPS_SYS(sys_ni_syscall
, 0) /* was sys_vm86 */
1874 MIPS_SYS(sys_wait4
, 4)
1875 MIPS_SYS(sys_swapoff
, 1) /* 4115 */
1876 MIPS_SYS(sys_sysinfo
, 1)
1877 MIPS_SYS(sys_ipc
, 6)
1878 MIPS_SYS(sys_fsync
, 1)
1879 MIPS_SYS(sys_sigreturn
, 0)
1880 MIPS_SYS(sys_clone
, 6) /* 4120 */
1881 MIPS_SYS(sys_setdomainname
, 2)
1882 MIPS_SYS(sys_newuname
, 1)
1883 MIPS_SYS(sys_ni_syscall
, 0) /* sys_modify_ldt */
1884 MIPS_SYS(sys_adjtimex
, 1)
1885 MIPS_SYS(sys_mprotect
, 3) /* 4125 */
1886 MIPS_SYS(sys_sigprocmask
, 3)
1887 MIPS_SYS(sys_ni_syscall
, 0) /* was create_module */
1888 MIPS_SYS(sys_init_module
, 5)
1889 MIPS_SYS(sys_delete_module
, 1)
1890 MIPS_SYS(sys_ni_syscall
, 0) /* 4130 was get_kernel_syms */
1891 MIPS_SYS(sys_quotactl
, 0)
1892 MIPS_SYS(sys_getpgid
, 1)
1893 MIPS_SYS(sys_fchdir
, 1)
1894 MIPS_SYS(sys_bdflush
, 2)
1895 MIPS_SYS(sys_sysfs
, 3) /* 4135 */
1896 MIPS_SYS(sys_personality
, 1)
1897 MIPS_SYS(sys_ni_syscall
, 0) /* for afs_syscall */
1898 MIPS_SYS(sys_setfsuid
, 1)
1899 MIPS_SYS(sys_setfsgid
, 1)
1900 MIPS_SYS(sys_llseek
, 5) /* 4140 */
1901 MIPS_SYS(sys_getdents
, 3)
1902 MIPS_SYS(sys_select
, 5)
1903 MIPS_SYS(sys_flock
, 2)
1904 MIPS_SYS(sys_msync
, 3)
1905 MIPS_SYS(sys_readv
, 3) /* 4145 */
1906 MIPS_SYS(sys_writev
, 3)
1907 MIPS_SYS(sys_cacheflush
, 3)
1908 MIPS_SYS(sys_cachectl
, 3)
1909 MIPS_SYS(sys_sysmips
, 4)
1910 MIPS_SYS(sys_ni_syscall
, 0) /* 4150 */
1911 MIPS_SYS(sys_getsid
, 1)
1912 MIPS_SYS(sys_fdatasync
, 0)
1913 MIPS_SYS(sys_sysctl
, 1)
1914 MIPS_SYS(sys_mlock
, 2)
1915 MIPS_SYS(sys_munlock
, 2) /* 4155 */
1916 MIPS_SYS(sys_mlockall
, 1)
1917 MIPS_SYS(sys_munlockall
, 0)
1918 MIPS_SYS(sys_sched_setparam
, 2)
1919 MIPS_SYS(sys_sched_getparam
, 2)
1920 MIPS_SYS(sys_sched_setscheduler
, 3) /* 4160 */
1921 MIPS_SYS(sys_sched_getscheduler
, 1)
1922 MIPS_SYS(sys_sched_yield
, 0)
1923 MIPS_SYS(sys_sched_get_priority_max
, 1)
1924 MIPS_SYS(sys_sched_get_priority_min
, 1)
1925 MIPS_SYS(sys_sched_rr_get_interval
, 2) /* 4165 */
1926 MIPS_SYS(sys_nanosleep
, 2)
1927 MIPS_SYS(sys_mremap
, 5)
1928 MIPS_SYS(sys_accept
, 3)
1929 MIPS_SYS(sys_bind
, 3)
1930 MIPS_SYS(sys_connect
, 3) /* 4170 */
1931 MIPS_SYS(sys_getpeername
, 3)
1932 MIPS_SYS(sys_getsockname
, 3)
1933 MIPS_SYS(sys_getsockopt
, 5)
1934 MIPS_SYS(sys_listen
, 2)
1935 MIPS_SYS(sys_recv
, 4) /* 4175 */
1936 MIPS_SYS(sys_recvfrom
, 6)
1937 MIPS_SYS(sys_recvmsg
, 3)
1938 MIPS_SYS(sys_send
, 4)
1939 MIPS_SYS(sys_sendmsg
, 3)
1940 MIPS_SYS(sys_sendto
, 6) /* 4180 */
1941 MIPS_SYS(sys_setsockopt
, 5)
1942 MIPS_SYS(sys_shutdown
, 2)
1943 MIPS_SYS(sys_socket
, 3)
1944 MIPS_SYS(sys_socketpair
, 4)
1945 MIPS_SYS(sys_setresuid
, 3) /* 4185 */
1946 MIPS_SYS(sys_getresuid
, 3)
1947 MIPS_SYS(sys_ni_syscall
, 0) /* was sys_query_module */
1948 MIPS_SYS(sys_poll
, 3)
1949 MIPS_SYS(sys_nfsservctl
, 3)
1950 MIPS_SYS(sys_setresgid
, 3) /* 4190 */
1951 MIPS_SYS(sys_getresgid
, 3)
1952 MIPS_SYS(sys_prctl
, 5)
1953 MIPS_SYS(sys_rt_sigreturn
, 0)
1954 MIPS_SYS(sys_rt_sigaction
, 4)
1955 MIPS_SYS(sys_rt_sigprocmask
, 4) /* 4195 */
1956 MIPS_SYS(sys_rt_sigpending
, 2)
1957 MIPS_SYS(sys_rt_sigtimedwait
, 4)
1958 MIPS_SYS(sys_rt_sigqueueinfo
, 3)
1959 MIPS_SYS(sys_rt_sigsuspend
, 0)
1960 MIPS_SYS(sys_pread64
, 6) /* 4200 */
1961 MIPS_SYS(sys_pwrite64
, 6)
1962 MIPS_SYS(sys_chown
, 3)
1963 MIPS_SYS(sys_getcwd
, 2)
1964 MIPS_SYS(sys_capget
, 2)
1965 MIPS_SYS(sys_capset
, 2) /* 4205 */
1966 MIPS_SYS(sys_sigaltstack
, 2)
1967 MIPS_SYS(sys_sendfile
, 4)
1968 MIPS_SYS(sys_ni_syscall
, 0)
1969 MIPS_SYS(sys_ni_syscall
, 0)
1970 MIPS_SYS(sys_mmap2
, 6) /* 4210 */
1971 MIPS_SYS(sys_truncate64
, 4)
1972 MIPS_SYS(sys_ftruncate64
, 4)
1973 MIPS_SYS(sys_stat64
, 2)
1974 MIPS_SYS(sys_lstat64
, 2)
1975 MIPS_SYS(sys_fstat64
, 2) /* 4215 */
1976 MIPS_SYS(sys_pivot_root
, 2)
1977 MIPS_SYS(sys_mincore
, 3)
1978 MIPS_SYS(sys_madvise
, 3)
1979 MIPS_SYS(sys_getdents64
, 3)
1980 MIPS_SYS(sys_fcntl64
, 3) /* 4220 */
1981 MIPS_SYS(sys_ni_syscall
, 0)
1982 MIPS_SYS(sys_gettid
, 0)
1983 MIPS_SYS(sys_readahead
, 5)
1984 MIPS_SYS(sys_setxattr
, 5)
1985 MIPS_SYS(sys_lsetxattr
, 5) /* 4225 */
1986 MIPS_SYS(sys_fsetxattr
, 5)
1987 MIPS_SYS(sys_getxattr
, 4)
1988 MIPS_SYS(sys_lgetxattr
, 4)
1989 MIPS_SYS(sys_fgetxattr
, 4)
1990 MIPS_SYS(sys_listxattr
, 3) /* 4230 */
1991 MIPS_SYS(sys_llistxattr
, 3)
1992 MIPS_SYS(sys_flistxattr
, 3)
1993 MIPS_SYS(sys_removexattr
, 2)
1994 MIPS_SYS(sys_lremovexattr
, 2)
1995 MIPS_SYS(sys_fremovexattr
, 2) /* 4235 */
1996 MIPS_SYS(sys_tkill
, 2)
1997 MIPS_SYS(sys_sendfile64
, 5)
1998 MIPS_SYS(sys_futex
, 6)
1999 MIPS_SYS(sys_sched_setaffinity
, 3)
2000 MIPS_SYS(sys_sched_getaffinity
, 3) /* 4240 */
2001 MIPS_SYS(sys_io_setup
, 2)
2002 MIPS_SYS(sys_io_destroy
, 1)
2003 MIPS_SYS(sys_io_getevents
, 5)
2004 MIPS_SYS(sys_io_submit
, 3)
2005 MIPS_SYS(sys_io_cancel
, 3) /* 4245 */
2006 MIPS_SYS(sys_exit_group
, 1)
2007 MIPS_SYS(sys_lookup_dcookie
, 3)
2008 MIPS_SYS(sys_epoll_create
, 1)
2009 MIPS_SYS(sys_epoll_ctl
, 4)
2010 MIPS_SYS(sys_epoll_wait
, 3) /* 4250 */
2011 MIPS_SYS(sys_remap_file_pages
, 5)
2012 MIPS_SYS(sys_set_tid_address
, 1)
2013 MIPS_SYS(sys_restart_syscall
, 0)
2014 MIPS_SYS(sys_fadvise64_64
, 7)
2015 MIPS_SYS(sys_statfs64
, 3) /* 4255 */
2016 MIPS_SYS(sys_fstatfs64
, 2)
2017 MIPS_SYS(sys_timer_create
, 3)
2018 MIPS_SYS(sys_timer_settime
, 4)
2019 MIPS_SYS(sys_timer_gettime
, 2)
2020 MIPS_SYS(sys_timer_getoverrun
, 1) /* 4260 */
2021 MIPS_SYS(sys_timer_delete
, 1)
2022 MIPS_SYS(sys_clock_settime
, 2)
2023 MIPS_SYS(sys_clock_gettime
, 2)
2024 MIPS_SYS(sys_clock_getres
, 2)
2025 MIPS_SYS(sys_clock_nanosleep
, 4) /* 4265 */
2026 MIPS_SYS(sys_tgkill
, 3)
2027 MIPS_SYS(sys_utimes
, 2)
2028 MIPS_SYS(sys_mbind
, 4)
2029 MIPS_SYS(sys_ni_syscall
, 0) /* sys_get_mempolicy */
2030 MIPS_SYS(sys_ni_syscall
, 0) /* 4270 sys_set_mempolicy */
2031 MIPS_SYS(sys_mq_open
, 4)
2032 MIPS_SYS(sys_mq_unlink
, 1)
2033 MIPS_SYS(sys_mq_timedsend
, 5)
2034 MIPS_SYS(sys_mq_timedreceive
, 5)
2035 MIPS_SYS(sys_mq_notify
, 2) /* 4275 */
2036 MIPS_SYS(sys_mq_getsetattr
, 3)
2037 MIPS_SYS(sys_ni_syscall
, 0) /* sys_vserver */
2038 MIPS_SYS(sys_waitid
, 4)
2039 MIPS_SYS(sys_ni_syscall
, 0) /* available, was setaltroot */
2040 MIPS_SYS(sys_add_key
, 5)
2041 MIPS_SYS(sys_request_key
, 4)
2042 MIPS_SYS(sys_keyctl
, 5)
2043 MIPS_SYS(sys_set_thread_area
, 1)
2044 MIPS_SYS(sys_inotify_init
, 0)
2045 MIPS_SYS(sys_inotify_add_watch
, 3) /* 4285 */
2046 MIPS_SYS(sys_inotify_rm_watch
, 2)
2047 MIPS_SYS(sys_migrate_pages
, 4)
2048 MIPS_SYS(sys_openat
, 4)
2049 MIPS_SYS(sys_mkdirat
, 3)
2050 MIPS_SYS(sys_mknodat
, 4) /* 4290 */
2051 MIPS_SYS(sys_fchownat
, 5)
2052 MIPS_SYS(sys_futimesat
, 3)
2053 MIPS_SYS(sys_fstatat64
, 4)
2054 MIPS_SYS(sys_unlinkat
, 3)
2055 MIPS_SYS(sys_renameat
, 4) /* 4295 */
2056 MIPS_SYS(sys_linkat
, 5)
2057 MIPS_SYS(sys_symlinkat
, 3)
2058 MIPS_SYS(sys_readlinkat
, 4)
2059 MIPS_SYS(sys_fchmodat
, 3)
2060 MIPS_SYS(sys_faccessat
, 3) /* 4300 */
2061 MIPS_SYS(sys_pselect6
, 6)
2062 MIPS_SYS(sys_ppoll
, 5)
2063 MIPS_SYS(sys_unshare
, 1)
2064 MIPS_SYS(sys_splice
, 6)
2065 MIPS_SYS(sys_sync_file_range
, 7) /* 4305 */
2066 MIPS_SYS(sys_tee
, 4)
2067 MIPS_SYS(sys_vmsplice
, 4)
2068 MIPS_SYS(sys_move_pages
, 6)
2069 MIPS_SYS(sys_set_robust_list
, 2)
2070 MIPS_SYS(sys_get_robust_list
, 3) /* 4310 */
2071 MIPS_SYS(sys_kexec_load
, 4)
2072 MIPS_SYS(sys_getcpu
, 3)
2073 MIPS_SYS(sys_epoll_pwait
, 6)
2074 MIPS_SYS(sys_ioprio_set
, 3)
2075 MIPS_SYS(sys_ioprio_get
, 2)
2076 MIPS_SYS(sys_utimensat
, 4)
2077 MIPS_SYS(sys_signalfd
, 3)
2078 MIPS_SYS(sys_ni_syscall
, 0) /* was timerfd */
2079 MIPS_SYS(sys_eventfd
, 1)
2080 MIPS_SYS(sys_fallocate
, 6) /* 4320 */
2081 MIPS_SYS(sys_timerfd_create
, 2)
2082 MIPS_SYS(sys_timerfd_gettime
, 2)
2083 MIPS_SYS(sys_timerfd_settime
, 4)
2084 MIPS_SYS(sys_signalfd4
, 4)
2085 MIPS_SYS(sys_eventfd2
, 2) /* 4325 */
2086 MIPS_SYS(sys_epoll_create1
, 1)
2087 MIPS_SYS(sys_dup3
, 3)
2088 MIPS_SYS(sys_pipe2
, 2)
2089 MIPS_SYS(sys_inotify_init1
, 1)
2090 MIPS_SYS(sys_preadv
, 6) /* 4330 */
2091 MIPS_SYS(sys_pwritev
, 6)
2092 MIPS_SYS(sys_rt_tgsigqueueinfo
, 4)
2093 MIPS_SYS(sys_perf_event_open
, 5)
2094 MIPS_SYS(sys_accept4
, 4)
2095 MIPS_SYS(sys_recvmmsg
, 5) /* 4335 */
2096 MIPS_SYS(sys_fanotify_init
, 2)
2097 MIPS_SYS(sys_fanotify_mark
, 6)
2098 MIPS_SYS(sys_prlimit64
, 4)
2099 MIPS_SYS(sys_name_to_handle_at
, 5)
2100 MIPS_SYS(sys_open_by_handle_at
, 3) /* 4340 */
2101 MIPS_SYS(sys_clock_adjtime
, 2)
2102 MIPS_SYS(sys_syncfs
, 1)
2107 static int do_store_exclusive(CPUMIPSState
*env
)
2110 target_ulong page_addr
;
2118 page_addr
= addr
& TARGET_PAGE_MASK
;
2121 flags
= page_get_flags(page_addr
);
2122 if ((flags
& PAGE_READ
) == 0) {
2125 reg
= env
->llreg
& 0x1f;
2126 d
= (env
->llreg
& 0x20) != 0;
2128 segv
= get_user_s64(val
, addr
);
2130 segv
= get_user_s32(val
, addr
);
2133 if (val
!= env
->llval
) {
2134 env
->active_tc
.gpr
[reg
] = 0;
2137 segv
= put_user_u64(env
->llnewval
, addr
);
2139 segv
= put_user_u32(env
->llnewval
, addr
);
2142 env
->active_tc
.gpr
[reg
] = 1;
2149 env
->active_tc
.PC
+= 4;
2162 static int do_break(CPUMIPSState
*env
, target_siginfo_t
*info
,
2170 info
->si_signo
= TARGET_SIGFPE
;
2172 info
->si_code
= (code
== BRK_OVERFLOW
) ? FPE_INTOVF
: FPE_INTDIV
;
2173 queue_signal(env
, info
->si_signo
, &*info
);
2183 void cpu_loop(CPUMIPSState
*env
)
2185 CPUState
*cs
= CPU(mips_env_get_cpu(env
));
2186 target_siginfo_t info
;
2189 # ifdef TARGET_ABI_MIPSO32
2190 unsigned int syscall_num
;
2195 trapnr
= cpu_mips_exec(env
);
2199 env
->active_tc
.PC
+= 4;
2200 # ifdef TARGET_ABI_MIPSO32
2201 syscall_num
= env
->active_tc
.gpr
[2] - 4000;
2202 if (syscall_num
>= sizeof(mips_syscall_args
)) {
2203 ret
= -TARGET_ENOSYS
;
2207 abi_ulong arg5
= 0, arg6
= 0, arg7
= 0, arg8
= 0;
2209 nb_args
= mips_syscall_args
[syscall_num
];
2210 sp_reg
= env
->active_tc
.gpr
[29];
2212 /* these arguments are taken from the stack */
2214 if ((ret
= get_user_ual(arg8
, sp_reg
+ 28)) != 0) {
2218 if ((ret
= get_user_ual(arg7
, sp_reg
+ 24)) != 0) {
2222 if ((ret
= get_user_ual(arg6
, sp_reg
+ 20)) != 0) {
2226 if ((ret
= get_user_ual(arg5
, sp_reg
+ 16)) != 0) {
2232 ret
= do_syscall(env
, env
->active_tc
.gpr
[2],
2233 env
->active_tc
.gpr
[4],
2234 env
->active_tc
.gpr
[5],
2235 env
->active_tc
.gpr
[6],
2236 env
->active_tc
.gpr
[7],
2237 arg5
, arg6
, arg7
, arg8
);
2241 ret
= do_syscall(env
, env
->active_tc
.gpr
[2],
2242 env
->active_tc
.gpr
[4], env
->active_tc
.gpr
[5],
2243 env
->active_tc
.gpr
[6], env
->active_tc
.gpr
[7],
2244 env
->active_tc
.gpr
[8], env
->active_tc
.gpr
[9],
2245 env
->active_tc
.gpr
[10], env
->active_tc
.gpr
[11]);
2247 if (ret
== -TARGET_QEMU_ESIGRETURN
) {
2248 /* Returning from a successful sigreturn syscall.
2249 Avoid clobbering register state. */
2252 if ((abi_ulong
)ret
>= (abi_ulong
)-1133) {
2253 env
->active_tc
.gpr
[7] = 1; /* error flag */
2256 env
->active_tc
.gpr
[7] = 0; /* error flag */
2258 env
->active_tc
.gpr
[2] = ret
;
2264 info
.si_signo
= TARGET_SIGSEGV
;
2266 /* XXX: check env->error_code */
2267 info
.si_code
= TARGET_SEGV_MAPERR
;
2268 info
._sifields
._sigfault
._addr
= env
->CP0_BadVAddr
;
2269 queue_signal(env
, info
.si_signo
, &info
);
2273 info
.si_signo
= TARGET_SIGILL
;
2276 queue_signal(env
, info
.si_signo
, &info
);
2278 case EXCP_INTERRUPT
:
2279 /* just indicate that signals should be handled asap */
2285 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
2288 info
.si_signo
= sig
;
2290 info
.si_code
= TARGET_TRAP_BRKPT
;
2291 queue_signal(env
, info
.si_signo
, &info
);
2296 if (do_store_exclusive(env
)) {
2297 info
.si_signo
= TARGET_SIGSEGV
;
2299 info
.si_code
= TARGET_SEGV_MAPERR
;
2300 info
._sifields
._sigfault
._addr
= env
->active_tc
.PC
;
2301 queue_signal(env
, info
.si_signo
, &info
);
2305 info
.si_signo
= TARGET_SIGILL
;
2307 info
.si_code
= TARGET_ILL_ILLOPC
;
2308 queue_signal(env
, info
.si_signo
, &info
);
2310 /* The code below was inspired by the MIPS Linux kernel trap
2311 * handling code in arch/mips/kernel/traps.c.
2315 abi_ulong trap_instr
;
2318 if (env
->hflags
& MIPS_HFLAG_M16
) {
2319 if (env
->insn_flags
& ASE_MICROMIPS
) {
2320 /* microMIPS mode */
2323 ret
= get_user_u16(instr
[0], env
->active_tc
.PC
) ||
2324 get_user_u16(instr
[1], env
->active_tc
.PC
+ 2);
2326 trap_instr
= (instr
[0] << 16) | instr
[1];
2329 ret
= get_user_u16(trap_instr
, env
->active_tc
.PC
);
2333 code
= (trap_instr
>> 6) & 0x3f;
2334 if (do_break(env
, &info
, code
) != 0) {
2340 ret
= get_user_ual(trap_instr
, env
->active_tc
.PC
);
2347 /* As described in the original Linux kernel code, the
2348 * below checks on 'code' are to work around an old
2351 code
= ((trap_instr
>> 6) & ((1 << 20) - 1));
2352 if (code
>= (1 << 10)) {
2356 if (do_break(env
, &info
, code
) != 0) {
2363 abi_ulong trap_instr
;
2364 unsigned int code
= 0;
2366 if (env
->hflags
& MIPS_HFLAG_M16
) {
2367 /* microMIPS mode */
2370 ret
= get_user_u16(instr
[0], env
->active_tc
.PC
) ||
2371 get_user_u16(instr
[1], env
->active_tc
.PC
+ 2);
2373 trap_instr
= (instr
[0] << 16) | instr
[1];
2375 ret
= get_user_ual(trap_instr
, env
->active_tc
.PC
);
2382 /* The immediate versions don't provide a code. */
2383 if (!(trap_instr
& 0xFC000000)) {
2384 if (env
->hflags
& MIPS_HFLAG_M16
) {
2385 /* microMIPS mode */
2386 code
= ((trap_instr
>> 12) & ((1 << 4) - 1));
2388 code
= ((trap_instr
>> 6) & ((1 << 10) - 1));
2392 if (do_break(env
, &info
, code
) != 0) {
2399 fprintf(stderr
, "qemu: unhandled CPU exception 0x%x - aborting\n",
2401 cpu_dump_state(cs
, stderr
, fprintf
, 0);
2404 process_pending_signals(env
);
2409 #ifdef TARGET_OPENRISC
2411 void cpu_loop(CPUOpenRISCState
*env
)
2413 CPUState
*cs
= CPU(openrisc_env_get_cpu(env
));
2417 trapnr
= cpu_exec(env
);
2422 qemu_log("\nReset request, exit, pc is %#x\n", env
->pc
);
2426 qemu_log("\nBus error, exit, pc is %#x\n", env
->pc
);
2431 cpu_dump_state(cs
, stderr
, fprintf
, 0);
2432 gdbsig
= TARGET_SIGSEGV
;
2435 qemu_log("\nTick time interrupt pc is %#x\n", env
->pc
);
2438 qemu_log("\nAlignment pc is %#x\n", env
->pc
);
2442 qemu_log("\nIllegal instructionpc is %#x\n", env
->pc
);
2446 qemu_log("\nExternal interruptpc is %#x\n", env
->pc
);
2450 qemu_log("\nTLB miss\n");
2453 qemu_log("\nRange\n");
2457 env
->pc
+= 4; /* 0xc00; */
2458 env
->gpr
[11] = do_syscall(env
,
2459 env
->gpr
[11], /* return value */
2460 env
->gpr
[3], /* r3 - r7 are params */
2468 qemu_log("\nFloating point error\n");
2471 qemu_log("\nTrap\n");
2478 qemu_log("\nqemu: unhandled CPU exception %#x - aborting\n",
2480 cpu_dump_state(cs
, stderr
, fprintf
, 0);
2481 gdbsig
= TARGET_SIGILL
;
2485 gdb_handlesig(cs
, gdbsig
);
2486 if (gdbsig
!= TARGET_SIGTRAP
) {
2491 process_pending_signals(env
);
2495 #endif /* TARGET_OPENRISC */
2498 void cpu_loop(CPUSH4State
*env
)
2500 CPUState
*cs
= CPU(sh_env_get_cpu(env
));
2502 target_siginfo_t info
;
2505 trapnr
= cpu_sh4_exec (env
);
2510 ret
= do_syscall(env
,
2519 env
->gregs
[0] = ret
;
2521 case EXCP_INTERRUPT
:
2522 /* just indicate that signals should be handled asap */
2528 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
2531 info
.si_signo
= sig
;
2533 info
.si_code
= TARGET_TRAP_BRKPT
;
2534 queue_signal(env
, info
.si_signo
, &info
);
2540 info
.si_signo
= SIGSEGV
;
2542 info
.si_code
= TARGET_SEGV_MAPERR
;
2543 info
._sifields
._sigfault
._addr
= env
->tea
;
2544 queue_signal(env
, info
.si_signo
, &info
);
2548 printf ("Unhandled trap: 0x%x\n", trapnr
);
2549 cpu_dump_state(cs
, stderr
, fprintf
, 0);
2552 process_pending_signals (env
);
2558 void cpu_loop(CPUCRISState
*env
)
2560 CPUState
*cs
= CPU(cris_env_get_cpu(env
));
2562 target_siginfo_t info
;
2565 trapnr
= cpu_cris_exec (env
);
2569 info
.si_signo
= SIGSEGV
;
2571 /* XXX: check env->error_code */
2572 info
.si_code
= TARGET_SEGV_MAPERR
;
2573 info
._sifields
._sigfault
._addr
= env
->pregs
[PR_EDA
];
2574 queue_signal(env
, info
.si_signo
, &info
);
2577 case EXCP_INTERRUPT
:
2578 /* just indicate that signals should be handled asap */
2581 ret
= do_syscall(env
,
2590 env
->regs
[10] = ret
;
2596 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
2599 info
.si_signo
= sig
;
2601 info
.si_code
= TARGET_TRAP_BRKPT
;
2602 queue_signal(env
, info
.si_signo
, &info
);
2607 printf ("Unhandled trap: 0x%x\n", trapnr
);
2608 cpu_dump_state(cs
, stderr
, fprintf
, 0);
2611 process_pending_signals (env
);
2616 #ifdef TARGET_MICROBLAZE
2617 void cpu_loop(CPUMBState
*env
)
2619 CPUState
*cs
= CPU(mb_env_get_cpu(env
));
2621 target_siginfo_t info
;
2624 trapnr
= cpu_mb_exec (env
);
2628 info
.si_signo
= SIGSEGV
;
2630 /* XXX: check env->error_code */
2631 info
.si_code
= TARGET_SEGV_MAPERR
;
2632 info
._sifields
._sigfault
._addr
= 0;
2633 queue_signal(env
, info
.si_signo
, &info
);
2636 case EXCP_INTERRUPT
:
2637 /* just indicate that signals should be handled asap */
2640 /* Return address is 4 bytes after the call. */
2642 env
->sregs
[SR_PC
] = env
->regs
[14];
2643 ret
= do_syscall(env
,
2655 env
->regs
[17] = env
->sregs
[SR_PC
] + 4;
2656 if (env
->iflags
& D_FLAG
) {
2657 env
->sregs
[SR_ESR
] |= 1 << 12;
2658 env
->sregs
[SR_PC
] -= 4;
2659 /* FIXME: if branch was immed, replay the imm as well. */
2662 env
->iflags
&= ~(IMM_FLAG
| D_FLAG
);
2664 switch (env
->sregs
[SR_ESR
] & 31) {
2665 case ESR_EC_DIVZERO
:
2666 info
.si_signo
= SIGFPE
;
2668 info
.si_code
= TARGET_FPE_FLTDIV
;
2669 info
._sifields
._sigfault
._addr
= 0;
2670 queue_signal(env
, info
.si_signo
, &info
);
2673 info
.si_signo
= SIGFPE
;
2675 if (env
->sregs
[SR_FSR
] & FSR_IO
) {
2676 info
.si_code
= TARGET_FPE_FLTINV
;
2678 if (env
->sregs
[SR_FSR
] & FSR_DZ
) {
2679 info
.si_code
= TARGET_FPE_FLTDIV
;
2681 info
._sifields
._sigfault
._addr
= 0;
2682 queue_signal(env
, info
.si_signo
, &info
);
2685 printf ("Unhandled hw-exception: 0x%x\n",
2686 env
->sregs
[SR_ESR
] & ESR_EC_MASK
);
2687 cpu_dump_state(cs
, stderr
, fprintf
, 0);
2696 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
2699 info
.si_signo
= sig
;
2701 info
.si_code
= TARGET_TRAP_BRKPT
;
2702 queue_signal(env
, info
.si_signo
, &info
);
2707 printf ("Unhandled trap: 0x%x\n", trapnr
);
2708 cpu_dump_state(cs
, stderr
, fprintf
, 0);
2711 process_pending_signals (env
);
2718 void cpu_loop(CPUM68KState
*env
)
2720 CPUState
*cs
= CPU(m68k_env_get_cpu(env
));
2723 target_siginfo_t info
;
2724 TaskState
*ts
= env
->opaque
;
2727 trapnr
= cpu_m68k_exec(env
);
2731 if (ts
->sim_syscalls
) {
2733 nr
= lduw(env
->pc
+ 2);
2735 do_m68k_simcall(env
, nr
);
2741 case EXCP_HALT_INSN
:
2742 /* Semihosing syscall. */
2744 do_m68k_semihosting(env
, env
->dregs
[0]);
2748 case EXCP_UNSUPPORTED
:
2750 info
.si_signo
= SIGILL
;
2752 info
.si_code
= TARGET_ILL_ILLOPN
;
2753 info
._sifields
._sigfault
._addr
= env
->pc
;
2754 queue_signal(env
, info
.si_signo
, &info
);
2758 ts
->sim_syscalls
= 0;
2761 env
->dregs
[0] = do_syscall(env
,
2772 case EXCP_INTERRUPT
:
2773 /* just indicate that signals should be handled asap */
2777 info
.si_signo
= SIGSEGV
;
2779 /* XXX: check env->error_code */
2780 info
.si_code
= TARGET_SEGV_MAPERR
;
2781 info
._sifields
._sigfault
._addr
= env
->mmu
.ar
;
2782 queue_signal(env
, info
.si_signo
, &info
);
2789 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
2792 info
.si_signo
= sig
;
2794 info
.si_code
= TARGET_TRAP_BRKPT
;
2795 queue_signal(env
, info
.si_signo
, &info
);
2800 fprintf(stderr
, "qemu: unhandled CPU exception 0x%x - aborting\n",
2802 cpu_dump_state(cs
, stderr
, fprintf
, 0);
2805 process_pending_signals(env
);
2808 #endif /* TARGET_M68K */
2811 static void do_store_exclusive(CPUAlphaState
*env
, int reg
, int quad
)
2813 target_ulong addr
, val
, tmp
;
2814 target_siginfo_t info
;
2817 addr
= env
->lock_addr
;
2818 tmp
= env
->lock_st_addr
;
2819 env
->lock_addr
= -1;
2820 env
->lock_st_addr
= 0;
2826 if (quad
? get_user_s64(val
, addr
) : get_user_s32(val
, addr
)) {
2830 if (val
== env
->lock_value
) {
2832 if (quad
? put_user_u64(tmp
, addr
) : put_user_u32(tmp
, addr
)) {
2849 info
.si_signo
= TARGET_SIGSEGV
;
2851 info
.si_code
= TARGET_SEGV_MAPERR
;
2852 info
._sifields
._sigfault
._addr
= addr
;
2853 queue_signal(env
, TARGET_SIGSEGV
, &info
);
2856 void cpu_loop(CPUAlphaState
*env
)
2858 CPUState
*cs
= CPU(alpha_env_get_cpu(env
));
2860 target_siginfo_t info
;
2864 trapnr
= cpu_alpha_exec (env
);
2866 /* All of the traps imply a transition through PALcode, which
2867 implies an REI instruction has been executed. Which means
2868 that the intr_flag should be cleared. */
2873 fprintf(stderr
, "Reset requested. Exit\n");
2877 fprintf(stderr
, "Machine check exception. Exit\n");
2880 case EXCP_SMP_INTERRUPT
:
2881 case EXCP_CLK_INTERRUPT
:
2882 case EXCP_DEV_INTERRUPT
:
2883 fprintf(stderr
, "External interrupt. Exit\n");
2887 env
->lock_addr
= -1;
2888 info
.si_signo
= TARGET_SIGSEGV
;
2890 info
.si_code
= (page_get_flags(env
->trap_arg0
) & PAGE_VALID
2891 ? TARGET_SEGV_ACCERR
: TARGET_SEGV_MAPERR
);
2892 info
._sifields
._sigfault
._addr
= env
->trap_arg0
;
2893 queue_signal(env
, info
.si_signo
, &info
);
2896 env
->lock_addr
= -1;
2897 info
.si_signo
= TARGET_SIGBUS
;
2899 info
.si_code
= TARGET_BUS_ADRALN
;
2900 info
._sifields
._sigfault
._addr
= env
->trap_arg0
;
2901 queue_signal(env
, info
.si_signo
, &info
);
2905 env
->lock_addr
= -1;
2906 info
.si_signo
= TARGET_SIGILL
;
2908 info
.si_code
= TARGET_ILL_ILLOPC
;
2909 info
._sifields
._sigfault
._addr
= env
->pc
;
2910 queue_signal(env
, info
.si_signo
, &info
);
2913 env
->lock_addr
= -1;
2914 info
.si_signo
= TARGET_SIGFPE
;
2916 info
.si_code
= TARGET_FPE_FLTINV
;
2917 info
._sifields
._sigfault
._addr
= env
->pc
;
2918 queue_signal(env
, info
.si_signo
, &info
);
2921 /* No-op. Linux simply re-enables the FPU. */
2924 env
->lock_addr
= -1;
2925 switch (env
->error_code
) {
2928 info
.si_signo
= TARGET_SIGTRAP
;
2930 info
.si_code
= TARGET_TRAP_BRKPT
;
2931 info
._sifields
._sigfault
._addr
= env
->pc
;
2932 queue_signal(env
, info
.si_signo
, &info
);
2936 info
.si_signo
= TARGET_SIGTRAP
;
2939 info
._sifields
._sigfault
._addr
= env
->pc
;
2940 queue_signal(env
, info
.si_signo
, &info
);
2944 trapnr
= env
->ir
[IR_V0
];
2945 sysret
= do_syscall(env
, trapnr
,
2946 env
->ir
[IR_A0
], env
->ir
[IR_A1
],
2947 env
->ir
[IR_A2
], env
->ir
[IR_A3
],
2948 env
->ir
[IR_A4
], env
->ir
[IR_A5
],
2950 if (trapnr
== TARGET_NR_sigreturn
2951 || trapnr
== TARGET_NR_rt_sigreturn
) {
2954 /* Syscall writes 0 to V0 to bypass error check, similar
2955 to how this is handled internal to Linux kernel.
2956 (Ab)use trapnr temporarily as boolean indicating error. */
2957 trapnr
= (env
->ir
[IR_V0
] != 0 && sysret
< 0);
2958 env
->ir
[IR_V0
] = (trapnr
? -sysret
: sysret
);
2959 env
->ir
[IR_A3
] = trapnr
;
2963 /* ??? We can probably elide the code using page_unprotect
2964 that is checking for self-modifying code. Instead we
2965 could simply call tb_flush here. Until we work out the
2966 changes required to turn off the extra write protection,
2967 this can be a no-op. */
2971 /* Handled in the translator for usermode. */
2975 /* Handled in the translator for usermode. */
2979 info
.si_signo
= TARGET_SIGFPE
;
2980 switch (env
->ir
[IR_A0
]) {
2981 case TARGET_GEN_INTOVF
:
2982 info
.si_code
= TARGET_FPE_INTOVF
;
2984 case TARGET_GEN_INTDIV
:
2985 info
.si_code
= TARGET_FPE_INTDIV
;
2987 case TARGET_GEN_FLTOVF
:
2988 info
.si_code
= TARGET_FPE_FLTOVF
;
2990 case TARGET_GEN_FLTUND
:
2991 info
.si_code
= TARGET_FPE_FLTUND
;
2993 case TARGET_GEN_FLTINV
:
2994 info
.si_code
= TARGET_FPE_FLTINV
;
2996 case TARGET_GEN_FLTINE
:
2997 info
.si_code
= TARGET_FPE_FLTRES
;
2999 case TARGET_GEN_ROPRAND
:
3003 info
.si_signo
= TARGET_SIGTRAP
;
3008 info
._sifields
._sigfault
._addr
= env
->pc
;
3009 queue_signal(env
, info
.si_signo
, &info
);
3016 info
.si_signo
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
3017 if (info
.si_signo
) {
3018 env
->lock_addr
= -1;
3020 info
.si_code
= TARGET_TRAP_BRKPT
;
3021 queue_signal(env
, info
.si_signo
, &info
);
3026 do_store_exclusive(env
, env
->error_code
, trapnr
- EXCP_STL_C
);
3028 case EXCP_INTERRUPT
:
3029 /* Just indicate that signals should be handled asap. */
3032 printf ("Unhandled trap: 0x%x\n", trapnr
);
3033 cpu_dump_state(cs
, stderr
, fprintf
, 0);
3036 process_pending_signals (env
);
3039 #endif /* TARGET_ALPHA */
3042 void cpu_loop(CPUS390XState
*env
)
3044 CPUState
*cs
= CPU(s390_env_get_cpu(env
));
3046 target_siginfo_t info
;
3050 trapnr
= cpu_s390x_exec(env
);
3052 case EXCP_INTERRUPT
:
3053 /* Just indicate that signals should be handled asap. */
3057 n
= env
->int_svc_code
;
3059 /* syscalls > 255 */
3062 env
->psw
.addr
+= env
->int_svc_ilen
;
3063 env
->regs
[2] = do_syscall(env
, n
, env
->regs
[2], env
->regs
[3],
3064 env
->regs
[4], env
->regs
[5],
3065 env
->regs
[6], env
->regs
[7], 0, 0);
3069 sig
= gdb_handlesig(cs
, TARGET_SIGTRAP
);
3071 n
= TARGET_TRAP_BRKPT
;
3076 n
= env
->int_pgm_code
;
3079 case PGM_PRIVILEGED
:
3081 n
= TARGET_ILL_ILLOPC
;
3083 case PGM_PROTECTION
:
3084 case PGM_ADDRESSING
:
3086 /* XXX: check env->error_code */
3087 n
= TARGET_SEGV_MAPERR
;
3088 addr
= env
->__excp_addr
;
3091 case PGM_SPECIFICATION
:
3092 case PGM_SPECIAL_OP
:
3096 n
= TARGET_ILL_ILLOPN
;
3099 case PGM_FIXPT_OVERFLOW
:
3101 n
= TARGET_FPE_INTOVF
;
3103 case PGM_FIXPT_DIVIDE
:
3105 n
= TARGET_FPE_INTDIV
;
3109 n
= (env
->fpc
>> 8) & 0xff;
3111 /* compare-and-trap */
3114 /* An IEEE exception, simulated or otherwise. */
3116 n
= TARGET_FPE_FLTINV
;
3117 } else if (n
& 0x40) {
3118 n
= TARGET_FPE_FLTDIV
;
3119 } else if (n
& 0x20) {
3120 n
= TARGET_FPE_FLTOVF
;
3121 } else if (n
& 0x10) {
3122 n
= TARGET_FPE_FLTUND
;
3123 } else if (n
& 0x08) {
3124 n
= TARGET_FPE_FLTRES
;
3126 /* ??? Quantum exception; BFP, DFP error. */
3134 fprintf(stderr
, "Unhandled program exception: %#x\n", n
);
3135 cpu_dump_state(cs
, stderr
, fprintf
, 0);
3141 addr
= env
->psw
.addr
;
3143 info
.si_signo
= sig
;
3146 info
._sifields
._sigfault
._addr
= addr
;
3147 queue_signal(env
, info
.si_signo
, &info
);
3151 fprintf(stderr
, "Unhandled trap: 0x%x\n", trapnr
);
3152 cpu_dump_state(cs
, stderr
, fprintf
, 0);
3155 process_pending_signals (env
);
3159 #endif /* TARGET_S390X */
3161 THREAD CPUState
*thread_cpu
;
3163 void task_settid(TaskState
*ts
)
3165 if (ts
->ts_tid
== 0) {
3166 ts
->ts_tid
= (pid_t
)syscall(SYS_gettid
);
3170 void stop_all_tasks(void)
3173 * We trust that when using NPTL, start_exclusive()
3174 * handles thread stopping correctly.
3179 /* Assumes contents are already zeroed. */
3180 void init_task_state(TaskState
*ts
)
3185 ts
->first_free
= ts
->sigqueue_table
;
3186 for (i
= 0; i
< MAX_SIGQUEUE_SIZE
- 1; i
++) {
3187 ts
->sigqueue_table
[i
].next
= &ts
->sigqueue_table
[i
+ 1];
3189 ts
->sigqueue_table
[i
].next
= NULL
;
3192 static void handle_arg_help(const char *arg
)
3197 static void handle_arg_log(const char *arg
)
3201 mask
= qemu_str_to_log_mask(arg
);
3203 qemu_print_log_usage(stdout
);
3209 static void handle_arg_log_filename(const char *arg
)
3211 qemu_set_log_filename(arg
);
3214 static void handle_arg_set_env(const char *arg
)
3216 char *r
, *p
, *token
;
3217 r
= p
= strdup(arg
);
3218 while ((token
= strsep(&p
, ",")) != NULL
) {
3219 if (envlist_setenv(envlist
, token
) != 0) {
3226 static void handle_arg_unset_env(const char *arg
)
3228 char *r
, *p
, *token
;
3229 r
= p
= strdup(arg
);
3230 while ((token
= strsep(&p
, ",")) != NULL
) {
3231 if (envlist_unsetenv(envlist
, token
) != 0) {
3238 static void handle_arg_argv0(const char *arg
)
3240 argv0
= strdup(arg
);
3243 static void handle_arg_stack_size(const char *arg
)
3246 guest_stack_size
= strtoul(arg
, &p
, 0);
3247 if (guest_stack_size
== 0) {
3252 guest_stack_size
*= 1024 * 1024;
3253 } else if (*p
== 'k' || *p
== 'K') {
3254 guest_stack_size
*= 1024;
3258 static void handle_arg_ld_prefix(const char *arg
)
3260 interp_prefix
= strdup(arg
);
3263 static void handle_arg_pagesize(const char *arg
)
3265 qemu_host_page_size
= atoi(arg
);
3266 if (qemu_host_page_size
== 0 ||
3267 (qemu_host_page_size
& (qemu_host_page_size
- 1)) != 0) {
3268 fprintf(stderr
, "page size must be a power of two\n");
3273 static void handle_arg_gdb(const char *arg
)
3275 gdbstub_port
= atoi(arg
);
3278 static void handle_arg_uname(const char *arg
)
3280 qemu_uname_release
= strdup(arg
);
3283 static void handle_arg_cpu(const char *arg
)
3285 cpu_model
= strdup(arg
);
3286 if (cpu_model
== NULL
|| is_help_option(cpu_model
)) {
3287 /* XXX: implement xxx_cpu_list for targets that still miss it */
3288 #if defined(cpu_list)
3289 cpu_list(stdout
, &fprintf
);
3295 #if defined(CONFIG_USE_GUEST_BASE)
3296 static void handle_arg_guest_base(const char *arg
)
3298 guest_base
= strtol(arg
, NULL
, 0);
3299 have_guest_base
= 1;
3302 static void handle_arg_reserved_va(const char *arg
)
3306 reserved_va
= strtoul(arg
, &p
, 0);
3320 unsigned long unshifted
= reserved_va
;
3322 reserved_va
<<= shift
;
3323 if (((reserved_va
>> shift
) != unshifted
)
3324 #if HOST_LONG_BITS > TARGET_VIRT_ADDR_SPACE_BITS
3325 || (reserved_va
> (1ul << TARGET_VIRT_ADDR_SPACE_BITS
))
3328 fprintf(stderr
, "Reserved virtual address too big\n");
3333 fprintf(stderr
, "Unrecognised -R size suffix '%s'\n", p
);
3339 static void handle_arg_singlestep(const char *arg
)
3344 static void handle_arg_strace(const char *arg
)
3349 static void handle_arg_version(const char *arg
)
3351 printf("qemu-" TARGET_NAME
" version " QEMU_VERSION QEMU_PKGVERSION
3352 ", Copyright (c) 2003-2008 Fabrice Bellard\n");
3356 struct qemu_argument
{
3360 void (*handle_opt
)(const char *arg
);
3361 const char *example
;
3365 static const struct qemu_argument arg_table
[] = {
3366 {"h", "", false, handle_arg_help
,
3367 "", "print this help"},
3368 {"g", "QEMU_GDB", true, handle_arg_gdb
,
3369 "port", "wait gdb connection to 'port'"},
3370 {"L", "QEMU_LD_PREFIX", true, handle_arg_ld_prefix
,
3371 "path", "set the elf interpreter prefix to 'path'"},
3372 {"s", "QEMU_STACK_SIZE", true, handle_arg_stack_size
,
3373 "size", "set the stack size to 'size' bytes"},
3374 {"cpu", "QEMU_CPU", true, handle_arg_cpu
,
3375 "model", "select CPU (-cpu help for list)"},
3376 {"E", "QEMU_SET_ENV", true, handle_arg_set_env
,
3377 "var=value", "sets targets environment variable (see below)"},
3378 {"U", "QEMU_UNSET_ENV", true, handle_arg_unset_env
,
3379 "var", "unsets targets environment variable (see below)"},
3380 {"0", "QEMU_ARGV0", true, handle_arg_argv0
,
3381 "argv0", "forces target process argv[0] to be 'argv0'"},
3382 {"r", "QEMU_UNAME", true, handle_arg_uname
,
3383 "uname", "set qemu uname release string to 'uname'"},
3384 #if defined(CONFIG_USE_GUEST_BASE)
3385 {"B", "QEMU_GUEST_BASE", true, handle_arg_guest_base
,
3386 "address", "set guest_base address to 'address'"},
3387 {"R", "QEMU_RESERVED_VA", true, handle_arg_reserved_va
,
3388 "size", "reserve 'size' bytes for guest virtual address space"},
3390 {"d", "QEMU_LOG", true, handle_arg_log
,
3391 "item[,...]", "enable logging of specified items "
3392 "(use '-d help' for a list of items)"},
3393 {"D", "QEMU_LOG_FILENAME", true, handle_arg_log_filename
,
3394 "logfile", "write logs to 'logfile' (default stderr)"},
3395 {"p", "QEMU_PAGESIZE", true, handle_arg_pagesize
,
3396 "pagesize", "set the host page size to 'pagesize'"},
3397 {"singlestep", "QEMU_SINGLESTEP", false, handle_arg_singlestep
,
3398 "", "run in singlestep mode"},
3399 {"strace", "QEMU_STRACE", false, handle_arg_strace
,
3400 "", "log system calls"},
3401 {"version", "QEMU_VERSION", false, handle_arg_version
,
3402 "", "display version information and exit"},
3403 {NULL
, NULL
, false, NULL
, NULL
, NULL
}
3406 static void usage(void)
3408 const struct qemu_argument
*arginfo
;
3412 printf("usage: qemu-" TARGET_NAME
" [options] program [arguments...]\n"
3413 "Linux CPU emulator (compiled for " TARGET_NAME
" emulation)\n"
3415 "Options and associated environment variables:\n"
3418 /* Calculate column widths. We must always have at least enough space
3419 * for the column header.
3421 maxarglen
= strlen("Argument");
3422 maxenvlen
= strlen("Env-variable");
3424 for (arginfo
= arg_table
; arginfo
->handle_opt
!= NULL
; arginfo
++) {
3425 int arglen
= strlen(arginfo
->argv
);
3426 if (arginfo
->has_arg
) {
3427 arglen
+= strlen(arginfo
->example
) + 1;
3429 if (strlen(arginfo
->env
) > maxenvlen
) {
3430 maxenvlen
= strlen(arginfo
->env
);
3432 if (arglen
> maxarglen
) {
3437 printf("%-*s %-*s Description\n", maxarglen
+1, "Argument",
3438 maxenvlen
, "Env-variable");
3440 for (arginfo
= arg_table
; arginfo
->handle_opt
!= NULL
; arginfo
++) {
3441 if (arginfo
->has_arg
) {
3442 printf("-%s %-*s %-*s %s\n", arginfo
->argv
,
3443 (int)(maxarglen
- strlen(arginfo
->argv
) - 1),
3444 arginfo
->example
, maxenvlen
, arginfo
->env
, arginfo
->help
);
3446 printf("-%-*s %-*s %s\n", maxarglen
, arginfo
->argv
,
3447 maxenvlen
, arginfo
->env
,
3454 "QEMU_LD_PREFIX = %s\n"
3455 "QEMU_STACK_SIZE = %ld byte\n",
3460 "You can use -E and -U options or the QEMU_SET_ENV and\n"
3461 "QEMU_UNSET_ENV environment variables to set and unset\n"
3462 "environment variables for the target process.\n"
3463 "It is possible to provide several variables by separating them\n"
3464 "by commas in getsubopt(3) style. Additionally it is possible to\n"
3465 "provide the -E and -U options multiple times.\n"
3466 "The following lines are equivalent:\n"
3467 " -E var1=val2 -E var2=val2 -U LD_PRELOAD -U LD_DEBUG\n"
3468 " -E var1=val2,var2=val2 -U LD_PRELOAD,LD_DEBUG\n"
3469 " QEMU_SET_ENV=var1=val2,var2=val2 QEMU_UNSET_ENV=LD_PRELOAD,LD_DEBUG\n"
3470 "Note that if you provide several changes to a single variable\n"
3471 "the last change will stay in effect.\n");
3476 static int parse_args(int argc
, char **argv
)
3480 const struct qemu_argument
*arginfo
;
3482 for (arginfo
= arg_table
; arginfo
->handle_opt
!= NULL
; arginfo
++) {
3483 if (arginfo
->env
== NULL
) {
3487 r
= getenv(arginfo
->env
);
3489 arginfo
->handle_opt(r
);
3495 if (optind
>= argc
) {
3504 if (!strcmp(r
, "-")) {
3508 for (arginfo
= arg_table
; arginfo
->handle_opt
!= NULL
; arginfo
++) {
3509 if (!strcmp(r
, arginfo
->argv
)) {
3510 if (arginfo
->has_arg
) {
3511 if (optind
>= argc
) {
3514 arginfo
->handle_opt(argv
[optind
]);
3517 arginfo
->handle_opt(NULL
);
3523 /* no option matched the current argv */
3524 if (arginfo
->handle_opt
== NULL
) {
3529 if (optind
>= argc
) {
3533 filename
= argv
[optind
];
3534 exec_path
= argv
[optind
];
3539 int main(int argc
, char **argv
, char **envp
)
3541 struct target_pt_regs regs1
, *regs
= ®s1
;
3542 struct image_info info1
, *info
= &info1
;
3543 struct linux_binprm bprm
;
3548 char **target_environ
, **wrk
;
3554 module_call_init(MODULE_INIT_QOM
);
3556 qemu_cache_utils_init(envp
);
3558 if ((envlist
= envlist_create()) == NULL
) {
3559 (void) fprintf(stderr
, "Unable to allocate envlist\n");
3563 /* add current environment into the list */
3564 for (wrk
= environ
; *wrk
!= NULL
; wrk
++) {
3565 (void) envlist_setenv(envlist
, *wrk
);
3568 /* Read the stack limit from the kernel. If it's "unlimited",
3569 then we can do little else besides use the default. */
3572 if (getrlimit(RLIMIT_STACK
, &lim
) == 0
3573 && lim
.rlim_cur
!= RLIM_INFINITY
3574 && lim
.rlim_cur
== (target_long
)lim
.rlim_cur
) {
3575 guest_stack_size
= lim
.rlim_cur
;
3580 #if defined(cpudef_setup)
3581 cpudef_setup(); /* parse cpu definitions in target config file (TBD) */
3584 optind
= parse_args(argc
, argv
);
3587 memset(regs
, 0, sizeof(struct target_pt_regs
));
3589 /* Zero out image_info */
3590 memset(info
, 0, sizeof(struct image_info
));
3592 memset(&bprm
, 0, sizeof (bprm
));
3594 /* Scan interp_prefix dir for replacement files. */
3595 init_paths(interp_prefix
);
3597 if (cpu_model
== NULL
) {
3598 #if defined(TARGET_I386)
3599 #ifdef TARGET_X86_64
3600 cpu_model
= "qemu64";
3602 cpu_model
= "qemu32";
3604 #elif defined(TARGET_ARM)
3606 #elif defined(TARGET_UNICORE32)
3608 #elif defined(TARGET_M68K)
3610 #elif defined(TARGET_SPARC)
3611 #ifdef TARGET_SPARC64
3612 cpu_model
= "TI UltraSparc II";
3614 cpu_model
= "Fujitsu MB86904";
3616 #elif defined(TARGET_MIPS)
3617 #if defined(TARGET_ABI_MIPSN32) || defined(TARGET_ABI_MIPSN64)
3622 #elif defined TARGET_OPENRISC
3623 cpu_model
= "or1200";
3624 #elif defined(TARGET_PPC)
3626 cpu_model
= "970fx";
3635 cpu_exec_init_all();
3636 /* NOTE: we need to init the CPU at this stage to get
3637 qemu_host_page_size */
3638 env
= cpu_init(cpu_model
);
3640 fprintf(stderr
, "Unable to find CPU definition\n");
3643 cpu
= ENV_GET_CPU(env
);
3648 if (getenv("QEMU_STRACE")) {
3652 target_environ
= envlist_to_environ(envlist
, NULL
);
3653 envlist_free(envlist
);
3655 #if defined(CONFIG_USE_GUEST_BASE)
3657 * Now that page sizes are configured in cpu_init() we can do
3658 * proper page alignment for guest_base.
3660 guest_base
= HOST_PAGE_ALIGN(guest_base
);
3662 if (reserved_va
|| have_guest_base
) {
3663 guest_base
= init_guest_space(guest_base
, reserved_va
, 0,
3665 if (guest_base
== (unsigned long)-1) {
3666 fprintf(stderr
, "Unable to reserve 0x%lx bytes of virtual address "
3667 "space for use as guest address space (check your virtual "
3668 "memory ulimit setting or reserve less using -R option)\n",
3674 mmap_next_start
= reserved_va
;
3677 #endif /* CONFIG_USE_GUEST_BASE */
3680 * Read in mmap_min_addr kernel parameter. This value is used
3681 * When loading the ELF image to determine whether guest_base
3682 * is needed. It is also used in mmap_find_vma.
3687 if ((fp
= fopen("/proc/sys/vm/mmap_min_addr", "r")) != NULL
) {
3689 if (fscanf(fp
, "%lu", &tmp
) == 1) {
3690 mmap_min_addr
= tmp
;
3691 qemu_log("host mmap_min_addr=0x%lx\n", mmap_min_addr
);
3698 * Prepare copy of argv vector for target.
3700 target_argc
= argc
- optind
;
3701 target_argv
= calloc(target_argc
+ 1, sizeof (char *));
3702 if (target_argv
== NULL
) {
3703 (void) fprintf(stderr
, "Unable to allocate memory for target_argv\n");
3708 * If argv0 is specified (using '-0' switch) we replace
3709 * argv[0] pointer with the given one.
3712 if (argv0
!= NULL
) {
3713 target_argv
[i
++] = strdup(argv0
);
3715 for (; i
< target_argc
; i
++) {
3716 target_argv
[i
] = strdup(argv
[optind
+ i
]);
3718 target_argv
[target_argc
] = NULL
;
3720 ts
= g_malloc0 (sizeof(TaskState
));
3721 init_task_state(ts
);
3722 /* build Task State */
3728 ret
= loader_exec(filename
, target_argv
, target_environ
, regs
,
3731 printf("Error while loading %s: %s\n", filename
, strerror(-ret
));
3735 for (wrk
= target_environ
; *wrk
; wrk
++) {
3739 free(target_environ
);
3741 if (qemu_log_enabled()) {
3742 #if defined(CONFIG_USE_GUEST_BASE)
3743 qemu_log("guest_base 0x%lx\n", guest_base
);
3747 qemu_log("start_brk 0x" TARGET_ABI_FMT_lx
"\n", info
->start_brk
);
3748 qemu_log("end_code 0x" TARGET_ABI_FMT_lx
"\n", info
->end_code
);
3749 qemu_log("start_code 0x" TARGET_ABI_FMT_lx
"\n",
3751 qemu_log("start_data 0x" TARGET_ABI_FMT_lx
"\n",
3753 qemu_log("end_data 0x" TARGET_ABI_FMT_lx
"\n", info
->end_data
);
3754 qemu_log("start_stack 0x" TARGET_ABI_FMT_lx
"\n",
3756 qemu_log("brk 0x" TARGET_ABI_FMT_lx
"\n", info
->brk
);
3757 qemu_log("entry 0x" TARGET_ABI_FMT_lx
"\n", info
->entry
);
3760 target_set_brk(info
->brk
);
3764 #if defined(CONFIG_USE_GUEST_BASE)
3765 /* Now that we've loaded the binary, GUEST_BASE is fixed. Delay
3766 generating the prologue until now so that the prologue can take
3767 the real value of GUEST_BASE into account. */
3768 tcg_prologue_init(&tcg_ctx
);
3771 #if defined(TARGET_I386)
3772 cpu_x86_set_cpl(env
, 3);
3774 env
->cr
[0] = CR0_PG_MASK
| CR0_WP_MASK
| CR0_PE_MASK
;
3775 env
->hflags
|= HF_PE_MASK
;
3776 if (env
->features
[FEAT_1_EDX
] & CPUID_SSE
) {
3777 env
->cr
[4] |= CR4_OSFXSR_MASK
;
3778 env
->hflags
|= HF_OSFXSR_MASK
;
3780 #ifndef TARGET_ABI32
3781 /* enable 64 bit mode if possible */
3782 if (!(env
->features
[FEAT_8000_0001_EDX
] & CPUID_EXT2_LM
)) {
3783 fprintf(stderr
, "The selected x86 CPU does not support 64 bit mode\n");
3786 env
->cr
[4] |= CR4_PAE_MASK
;
3787 env
->efer
|= MSR_EFER_LMA
| MSR_EFER_LME
;
3788 env
->hflags
|= HF_LMA_MASK
;
3791 /* flags setup : we activate the IRQs by default as in user mode */
3792 env
->eflags
|= IF_MASK
;
3794 /* linux register setup */
3795 #ifndef TARGET_ABI32
3796 env
->regs
[R_EAX
] = regs
->rax
;
3797 env
->regs
[R_EBX
] = regs
->rbx
;
3798 env
->regs
[R_ECX
] = regs
->rcx
;
3799 env
->regs
[R_EDX
] = regs
->rdx
;
3800 env
->regs
[R_ESI
] = regs
->rsi
;
3801 env
->regs
[R_EDI
] = regs
->rdi
;
3802 env
->regs
[R_EBP
] = regs
->rbp
;
3803 env
->regs
[R_ESP
] = regs
->rsp
;
3804 env
->eip
= regs
->rip
;
3806 env
->regs
[R_EAX
] = regs
->eax
;
3807 env
->regs
[R_EBX
] = regs
->ebx
;
3808 env
->regs
[R_ECX
] = regs
->ecx
;
3809 env
->regs
[R_EDX
] = regs
->edx
;
3810 env
->regs
[R_ESI
] = regs
->esi
;
3811 env
->regs
[R_EDI
] = regs
->edi
;
3812 env
->regs
[R_EBP
] = regs
->ebp
;
3813 env
->regs
[R_ESP
] = regs
->esp
;
3814 env
->eip
= regs
->eip
;
3817 /* linux interrupt setup */
3818 #ifndef TARGET_ABI32
3819 env
->idt
.limit
= 511;
3821 env
->idt
.limit
= 255;
3823 env
->idt
.base
= target_mmap(0, sizeof(uint64_t) * (env
->idt
.limit
+ 1),
3824 PROT_READ
|PROT_WRITE
,
3825 MAP_ANONYMOUS
|MAP_PRIVATE
, -1, 0);
3826 idt_table
= g2h(env
->idt
.base
);
3849 /* linux segment setup */
3851 uint64_t *gdt_table
;
3852 env
->gdt
.base
= target_mmap(0, sizeof(uint64_t) * TARGET_GDT_ENTRIES
,
3853 PROT_READ
|PROT_WRITE
,
3854 MAP_ANONYMOUS
|MAP_PRIVATE
, -1, 0);
3855 env
->gdt
.limit
= sizeof(uint64_t) * TARGET_GDT_ENTRIES
- 1;
3856 gdt_table
= g2h(env
->gdt
.base
);
3858 write_dt(&gdt_table
[__USER_CS
>> 3], 0, 0xfffff,
3859 DESC_G_MASK
| DESC_B_MASK
| DESC_P_MASK
| DESC_S_MASK
|
3860 (3 << DESC_DPL_SHIFT
) | (0xa << DESC_TYPE_SHIFT
));
3862 /* 64 bit code segment */
3863 write_dt(&gdt_table
[__USER_CS
>> 3], 0, 0xfffff,
3864 DESC_G_MASK
| DESC_B_MASK
| DESC_P_MASK
| DESC_S_MASK
|
3866 (3 << DESC_DPL_SHIFT
) | (0xa << DESC_TYPE_SHIFT
));
3868 write_dt(&gdt_table
[__USER_DS
>> 3], 0, 0xfffff,
3869 DESC_G_MASK
| DESC_B_MASK
| DESC_P_MASK
| DESC_S_MASK
|
3870 (3 << DESC_DPL_SHIFT
) | (0x2 << DESC_TYPE_SHIFT
));
3872 cpu_x86_load_seg(env
, R_CS
, __USER_CS
);
3873 cpu_x86_load_seg(env
, R_SS
, __USER_DS
);
3875 cpu_x86_load_seg(env
, R_DS
, __USER_DS
);
3876 cpu_x86_load_seg(env
, R_ES
, __USER_DS
);
3877 cpu_x86_load_seg(env
, R_FS
, __USER_DS
);
3878 cpu_x86_load_seg(env
, R_GS
, __USER_DS
);
3879 /* This hack makes Wine work... */
3880 env
->segs
[R_FS
].selector
= 0;
3882 cpu_x86_load_seg(env
, R_DS
, 0);
3883 cpu_x86_load_seg(env
, R_ES
, 0);
3884 cpu_x86_load_seg(env
, R_FS
, 0);
3885 cpu_x86_load_seg(env
, R_GS
, 0);
3887 #elif defined(TARGET_ARM)
3890 cpsr_write(env
, regs
->uregs
[16], 0xffffffff);
3891 for(i
= 0; i
< 16; i
++) {
3892 env
->regs
[i
] = regs
->uregs
[i
];
3895 if (EF_ARM_EABI_VERSION(info
->elf_flags
) >= EF_ARM_EABI_VER4
3896 && (info
->elf_flags
& EF_ARM_BE8
)) {
3897 env
->bswap_code
= 1;
3900 #elif defined(TARGET_UNICORE32)
3903 cpu_asr_write(env
, regs
->uregs
[32], 0xffffffff);
3904 for (i
= 0; i
< 32; i
++) {
3905 env
->regs
[i
] = regs
->uregs
[i
];
3908 #elif defined(TARGET_SPARC)
3912 env
->npc
= regs
->npc
;
3914 for(i
= 0; i
< 8; i
++)
3915 env
->gregs
[i
] = regs
->u_regs
[i
];
3916 for(i
= 0; i
< 8; i
++)
3917 env
->regwptr
[i
] = regs
->u_regs
[i
+ 8];
3919 #elif defined(TARGET_PPC)
3923 #if defined(TARGET_PPC64)
3924 #if defined(TARGET_ABI32)
3925 env
->msr
&= ~((target_ulong
)1 << MSR_SF
);
3927 env
->msr
|= (target_ulong
)1 << MSR_SF
;
3930 env
->nip
= regs
->nip
;
3931 for(i
= 0; i
< 32; i
++) {
3932 env
->gpr
[i
] = regs
->gpr
[i
];
3935 #elif defined(TARGET_M68K)
3938 env
->dregs
[0] = regs
->d0
;
3939 env
->dregs
[1] = regs
->d1
;
3940 env
->dregs
[2] = regs
->d2
;
3941 env
->dregs
[3] = regs
->d3
;
3942 env
->dregs
[4] = regs
->d4
;
3943 env
->dregs
[5] = regs
->d5
;
3944 env
->dregs
[6] = regs
->d6
;
3945 env
->dregs
[7] = regs
->d7
;
3946 env
->aregs
[0] = regs
->a0
;
3947 env
->aregs
[1] = regs
->a1
;
3948 env
->aregs
[2] = regs
->a2
;
3949 env
->aregs
[3] = regs
->a3
;
3950 env
->aregs
[4] = regs
->a4
;
3951 env
->aregs
[5] = regs
->a5
;
3952 env
->aregs
[6] = regs
->a6
;
3953 env
->aregs
[7] = regs
->usp
;
3955 ts
->sim_syscalls
= 1;
3957 #elif defined(TARGET_MICROBLAZE)
3959 env
->regs
[0] = regs
->r0
;
3960 env
->regs
[1] = regs
->r1
;
3961 env
->regs
[2] = regs
->r2
;
3962 env
->regs
[3] = regs
->r3
;
3963 env
->regs
[4] = regs
->r4
;
3964 env
->regs
[5] = regs
->r5
;
3965 env
->regs
[6] = regs
->r6
;
3966 env
->regs
[7] = regs
->r7
;
3967 env
->regs
[8] = regs
->r8
;
3968 env
->regs
[9] = regs
->r9
;
3969 env
->regs
[10] = regs
->r10
;
3970 env
->regs
[11] = regs
->r11
;
3971 env
->regs
[12] = regs
->r12
;
3972 env
->regs
[13] = regs
->r13
;
3973 env
->regs
[14] = regs
->r14
;
3974 env
->regs
[15] = regs
->r15
;
3975 env
->regs
[16] = regs
->r16
;
3976 env
->regs
[17] = regs
->r17
;
3977 env
->regs
[18] = regs
->r18
;
3978 env
->regs
[19] = regs
->r19
;
3979 env
->regs
[20] = regs
->r20
;
3980 env
->regs
[21] = regs
->r21
;
3981 env
->regs
[22] = regs
->r22
;
3982 env
->regs
[23] = regs
->r23
;
3983 env
->regs
[24] = regs
->r24
;
3984 env
->regs
[25] = regs
->r25
;
3985 env
->regs
[26] = regs
->r26
;
3986 env
->regs
[27] = regs
->r27
;
3987 env
->regs
[28] = regs
->r28
;
3988 env
->regs
[29] = regs
->r29
;
3989 env
->regs
[30] = regs
->r30
;
3990 env
->regs
[31] = regs
->r31
;
3991 env
->sregs
[SR_PC
] = regs
->pc
;
3993 #elif defined(TARGET_MIPS)
3997 for(i
= 0; i
< 32; i
++) {
3998 env
->active_tc
.gpr
[i
] = regs
->regs
[i
];
4000 env
->active_tc
.PC
= regs
->cp0_epc
& ~(target_ulong
)1;
4001 if (regs
->cp0_epc
& 1) {
4002 env
->hflags
|= MIPS_HFLAG_M16
;
4005 #elif defined(TARGET_OPENRISC)
4009 for (i
= 0; i
< 32; i
++) {
4010 env
->gpr
[i
] = regs
->gpr
[i
];
4016 #elif defined(TARGET_SH4)
4020 for(i
= 0; i
< 16; i
++) {
4021 env
->gregs
[i
] = regs
->regs
[i
];
4025 #elif defined(TARGET_ALPHA)
4029 for(i
= 0; i
< 28; i
++) {
4030 env
->ir
[i
] = ((abi_ulong
*)regs
)[i
];
4032 env
->ir
[IR_SP
] = regs
->usp
;
4035 #elif defined(TARGET_CRIS)
4037 env
->regs
[0] = regs
->r0
;
4038 env
->regs
[1] = regs
->r1
;
4039 env
->regs
[2] = regs
->r2
;
4040 env
->regs
[3] = regs
->r3
;
4041 env
->regs
[4] = regs
->r4
;
4042 env
->regs
[5] = regs
->r5
;
4043 env
->regs
[6] = regs
->r6
;
4044 env
->regs
[7] = regs
->r7
;
4045 env
->regs
[8] = regs
->r8
;
4046 env
->regs
[9] = regs
->r9
;
4047 env
->regs
[10] = regs
->r10
;
4048 env
->regs
[11] = regs
->r11
;
4049 env
->regs
[12] = regs
->r12
;
4050 env
->regs
[13] = regs
->r13
;
4051 env
->regs
[14] = info
->start_stack
;
4052 env
->regs
[15] = regs
->acr
;
4053 env
->pc
= regs
->erp
;
4055 #elif defined(TARGET_S390X)
4058 for (i
= 0; i
< 16; i
++) {
4059 env
->regs
[i
] = regs
->gprs
[i
];
4061 env
->psw
.mask
= regs
->psw
.mask
;
4062 env
->psw
.addr
= regs
->psw
.addr
;
4065 #error unsupported target CPU
4068 #if defined(TARGET_ARM) || defined(TARGET_M68K) || defined(TARGET_UNICORE32)
4069 ts
->stack_base
= info
->start_stack
;
4070 ts
->heap_base
= info
->brk
;
4071 /* This will be filled in on the first SYS_HEAPINFO call. */
4076 if (gdbserver_start(gdbstub_port
) < 0) {
4077 fprintf(stderr
, "qemu: could not open gdbserver on port %d\n",
4081 gdb_handlesig(cpu
, 0);