tcg: Add clz and ctz opcodes
[qemu/ar7.git] / linux-user / main.c
blobc1d5eb4d6fbe89b6a6e11141449694812e550990
1 /*
2 * qemu user main
4 * Copyright (c) 2003-2008 Fabrice Bellard
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, see <http://www.gnu.org/licenses/>.
19 #include "qemu/osdep.h"
20 #include "qemu-version.h"
21 #include <sys/syscall.h>
22 #include <sys/resource.h>
24 #include "qapi/error.h"
25 #include "qemu.h"
26 #include "qemu/path.h"
27 #include "qemu/config-file.h"
28 #include "qemu/cutils.h"
29 #include "qemu/help_option.h"
30 #include "cpu.h"
31 #include "exec/exec-all.h"
32 #include "tcg.h"
33 #include "qemu/timer.h"
34 #include "qemu/envlist.h"
35 #include "elf.h"
36 #include "exec/log.h"
37 #include "trace/control.h"
38 #include "glib-compat.h"
40 char *exec_path;
42 int singlestep;
43 static const char *filename;
44 static const char *argv0;
45 static int gdbstub_port;
46 static envlist_t *envlist;
47 static const char *cpu_model;
48 unsigned long mmap_min_addr;
49 unsigned long guest_base;
50 int have_guest_base;
52 #define EXCP_DUMP(env, fmt, ...) \
53 do { \
54 CPUState *cs = ENV_GET_CPU(env); \
55 fprintf(stderr, fmt , ## __VA_ARGS__); \
56 cpu_dump_state(cs, stderr, fprintf, 0); \
57 if (qemu_log_separate()) { \
58 qemu_log(fmt, ## __VA_ARGS__); \
59 log_cpu_state(cs, 0); \
60 } \
61 } while (0)
63 #if (TARGET_LONG_BITS == 32) && (HOST_LONG_BITS == 64)
65 * When running 32-on-64 we should make sure we can fit all of the possible
66 * guest address space into a contiguous chunk of virtual host memory.
68 * This way we will never overlap with our own libraries or binaries or stack
69 * or anything else that QEMU maps.
71 # ifdef TARGET_MIPS
72 /* MIPS only supports 31 bits of virtual address space for user space */
73 unsigned long reserved_va = 0x77000000;
74 # else
75 unsigned long reserved_va = 0xf7000000;
76 # endif
77 #else
78 unsigned long reserved_va;
79 #endif
81 static void usage(int exitcode);
83 static const char *interp_prefix = CONFIG_QEMU_INTERP_PREFIX;
84 const char *qemu_uname_release;
86 /* XXX: on x86 MAP_GROWSDOWN only works if ESP <= address + 32, so
87 we allocate a bigger stack. Need a better solution, for example
88 by remapping the process stack directly at the right place */
89 unsigned long guest_stack_size = 8 * 1024 * 1024UL;
91 void gemu_log(const char *fmt, ...)
93 va_list ap;
95 va_start(ap, fmt);
96 vfprintf(stderr, fmt, ap);
97 va_end(ap);
100 #if defined(TARGET_I386)
101 int cpu_get_pic_interrupt(CPUX86State *env)
103 return -1;
105 #endif
107 /***********************************************************/
108 /* Helper routines for implementing atomic operations. */
110 /* Make sure everything is in a consistent state for calling fork(). */
111 void fork_start(void)
113 cpu_list_lock();
114 qemu_mutex_lock(&tcg_ctx.tb_ctx.tb_lock);
115 mmap_fork_start();
118 void fork_end(int child)
120 mmap_fork_end(child);
121 if (child) {
122 CPUState *cpu, *next_cpu;
123 /* Child processes created by fork() only have a single thread.
124 Discard information about the parent threads. */
125 CPU_FOREACH_SAFE(cpu, next_cpu) {
126 if (cpu != thread_cpu) {
127 QTAILQ_REMOVE(&cpus, cpu, node);
130 qemu_mutex_init(&tcg_ctx.tb_ctx.tb_lock);
131 qemu_init_cpu_list();
132 gdbserver_fork(thread_cpu);
133 } else {
134 qemu_mutex_unlock(&tcg_ctx.tb_ctx.tb_lock);
135 cpu_list_unlock();
139 #ifdef TARGET_I386
140 /***********************************************************/
141 /* CPUX86 core interface */
143 uint64_t cpu_get_tsc(CPUX86State *env)
145 return cpu_get_host_ticks();
148 static void write_dt(void *ptr, unsigned long addr, unsigned long limit,
149 int flags)
151 unsigned int e1, e2;
152 uint32_t *p;
153 e1 = (addr << 16) | (limit & 0xffff);
154 e2 = ((addr >> 16) & 0xff) | (addr & 0xff000000) | (limit & 0x000f0000);
155 e2 |= flags;
156 p = ptr;
157 p[0] = tswap32(e1);
158 p[1] = tswap32(e2);
161 static uint64_t *idt_table;
162 #ifdef TARGET_X86_64
163 static void set_gate64(void *ptr, unsigned int type, unsigned int dpl,
164 uint64_t addr, unsigned int sel)
166 uint32_t *p, e1, e2;
167 e1 = (addr & 0xffff) | (sel << 16);
168 e2 = (addr & 0xffff0000) | 0x8000 | (dpl << 13) | (type << 8);
169 p = ptr;
170 p[0] = tswap32(e1);
171 p[1] = tswap32(e2);
172 p[2] = tswap32(addr >> 32);
173 p[3] = 0;
175 /* only dpl matters as we do only user space emulation */
176 static void set_idt(int n, unsigned int dpl)
178 set_gate64(idt_table + n * 2, 0, dpl, 0, 0);
180 #else
181 static void set_gate(void *ptr, unsigned int type, unsigned int dpl,
182 uint32_t addr, unsigned int sel)
184 uint32_t *p, e1, e2;
185 e1 = (addr & 0xffff) | (sel << 16);
186 e2 = (addr & 0xffff0000) | 0x8000 | (dpl << 13) | (type << 8);
187 p = ptr;
188 p[0] = tswap32(e1);
189 p[1] = tswap32(e2);
192 /* only dpl matters as we do only user space emulation */
193 static void set_idt(int n, unsigned int dpl)
195 set_gate(idt_table + n, 0, dpl, 0, 0);
197 #endif
199 void cpu_loop(CPUX86State *env)
201 CPUState *cs = CPU(x86_env_get_cpu(env));
202 int trapnr;
203 abi_ulong pc;
204 abi_ulong ret;
205 target_siginfo_t info;
207 for(;;) {
208 cpu_exec_start(cs);
209 trapnr = cpu_exec(cs);
210 cpu_exec_end(cs);
211 process_queued_cpu_work(cs);
213 switch(trapnr) {
214 case 0x80:
215 /* linux syscall from int $0x80 */
216 ret = do_syscall(env,
217 env->regs[R_EAX],
218 env->regs[R_EBX],
219 env->regs[R_ECX],
220 env->regs[R_EDX],
221 env->regs[R_ESI],
222 env->regs[R_EDI],
223 env->regs[R_EBP],
224 0, 0);
225 if (ret == -TARGET_ERESTARTSYS) {
226 env->eip -= 2;
227 } else if (ret != -TARGET_QEMU_ESIGRETURN) {
228 env->regs[R_EAX] = ret;
230 break;
231 #ifndef TARGET_ABI32
232 case EXCP_SYSCALL:
233 /* linux syscall from syscall instruction */
234 ret = do_syscall(env,
235 env->regs[R_EAX],
236 env->regs[R_EDI],
237 env->regs[R_ESI],
238 env->regs[R_EDX],
239 env->regs[10],
240 env->regs[8],
241 env->regs[9],
242 0, 0);
243 if (ret == -TARGET_ERESTARTSYS) {
244 env->eip -= 2;
245 } else if (ret != -TARGET_QEMU_ESIGRETURN) {
246 env->regs[R_EAX] = ret;
248 break;
249 #endif
250 case EXCP0B_NOSEG:
251 case EXCP0C_STACK:
252 info.si_signo = TARGET_SIGBUS;
253 info.si_errno = 0;
254 info.si_code = TARGET_SI_KERNEL;
255 info._sifields._sigfault._addr = 0;
256 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
257 break;
258 case EXCP0D_GPF:
259 /* XXX: potential problem if ABI32 */
260 #ifndef TARGET_X86_64
261 if (env->eflags & VM_MASK) {
262 handle_vm86_fault(env);
263 } else
264 #endif
266 info.si_signo = TARGET_SIGSEGV;
267 info.si_errno = 0;
268 info.si_code = TARGET_SI_KERNEL;
269 info._sifields._sigfault._addr = 0;
270 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
272 break;
273 case EXCP0E_PAGE:
274 info.si_signo = TARGET_SIGSEGV;
275 info.si_errno = 0;
276 if (!(env->error_code & 1))
277 info.si_code = TARGET_SEGV_MAPERR;
278 else
279 info.si_code = TARGET_SEGV_ACCERR;
280 info._sifields._sigfault._addr = env->cr[2];
281 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
282 break;
283 case EXCP00_DIVZ:
284 #ifndef TARGET_X86_64
285 if (env->eflags & VM_MASK) {
286 handle_vm86_trap(env, trapnr);
287 } else
288 #endif
290 /* division by zero */
291 info.si_signo = TARGET_SIGFPE;
292 info.si_errno = 0;
293 info.si_code = TARGET_FPE_INTDIV;
294 info._sifields._sigfault._addr = env->eip;
295 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
297 break;
298 case EXCP01_DB:
299 case EXCP03_INT3:
300 #ifndef TARGET_X86_64
301 if (env->eflags & VM_MASK) {
302 handle_vm86_trap(env, trapnr);
303 } else
304 #endif
306 info.si_signo = TARGET_SIGTRAP;
307 info.si_errno = 0;
308 if (trapnr == EXCP01_DB) {
309 info.si_code = TARGET_TRAP_BRKPT;
310 info._sifields._sigfault._addr = env->eip;
311 } else {
312 info.si_code = TARGET_SI_KERNEL;
313 info._sifields._sigfault._addr = 0;
315 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
317 break;
318 case EXCP04_INTO:
319 case EXCP05_BOUND:
320 #ifndef TARGET_X86_64
321 if (env->eflags & VM_MASK) {
322 handle_vm86_trap(env, trapnr);
323 } else
324 #endif
326 info.si_signo = TARGET_SIGSEGV;
327 info.si_errno = 0;
328 info.si_code = TARGET_SI_KERNEL;
329 info._sifields._sigfault._addr = 0;
330 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
332 break;
333 case EXCP06_ILLOP:
334 info.si_signo = TARGET_SIGILL;
335 info.si_errno = 0;
336 info.si_code = TARGET_ILL_ILLOPN;
337 info._sifields._sigfault._addr = env->eip;
338 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
339 break;
340 case EXCP_INTERRUPT:
341 /* just indicate that signals should be handled asap */
342 break;
343 case EXCP_DEBUG:
345 int sig;
347 sig = gdb_handlesig(cs, TARGET_SIGTRAP);
348 if (sig)
350 info.si_signo = sig;
351 info.si_errno = 0;
352 info.si_code = TARGET_TRAP_BRKPT;
353 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
356 break;
357 case EXCP_ATOMIC:
358 cpu_exec_step_atomic(cs);
359 break;
360 default:
361 pc = env->segs[R_CS].base + env->eip;
362 EXCP_DUMP(env, "qemu: 0x%08lx: unhandled CPU exception 0x%x - aborting\n",
363 (long)pc, trapnr);
364 abort();
366 process_pending_signals(env);
369 #endif
371 #ifdef TARGET_ARM
373 #define get_user_code_u32(x, gaddr, env) \
374 ({ abi_long __r = get_user_u32((x), (gaddr)); \
375 if (!__r && bswap_code(arm_sctlr_b(env))) { \
376 (x) = bswap32(x); \
378 __r; \
381 #define get_user_code_u16(x, gaddr, env) \
382 ({ abi_long __r = get_user_u16((x), (gaddr)); \
383 if (!__r && bswap_code(arm_sctlr_b(env))) { \
384 (x) = bswap16(x); \
386 __r; \
389 #define get_user_data_u32(x, gaddr, env) \
390 ({ abi_long __r = get_user_u32((x), (gaddr)); \
391 if (!__r && arm_cpu_bswap_data(env)) { \
392 (x) = bswap32(x); \
394 __r; \
397 #define get_user_data_u16(x, gaddr, env) \
398 ({ abi_long __r = get_user_u16((x), (gaddr)); \
399 if (!__r && arm_cpu_bswap_data(env)) { \
400 (x) = bswap16(x); \
402 __r; \
405 #define put_user_data_u32(x, gaddr, env) \
406 ({ typeof(x) __x = (x); \
407 if (arm_cpu_bswap_data(env)) { \
408 __x = bswap32(__x); \
410 put_user_u32(__x, (gaddr)); \
413 #define put_user_data_u16(x, gaddr, env) \
414 ({ typeof(x) __x = (x); \
415 if (arm_cpu_bswap_data(env)) { \
416 __x = bswap16(__x); \
418 put_user_u16(__x, (gaddr)); \
421 #ifdef TARGET_ABI32
422 /* Commpage handling -- there is no commpage for AArch64 */
425 * See the Linux kernel's Documentation/arm/kernel_user_helpers.txt
426 * Input:
427 * r0 = pointer to oldval
428 * r1 = pointer to newval
429 * r2 = pointer to target value
431 * Output:
432 * r0 = 0 if *ptr was changed, non-0 if no exchange happened
433 * C set if *ptr was changed, clear if no exchange happened
435 * Note segv's in kernel helpers are a bit tricky, we can set the
436 * data address sensibly but the PC address is just the entry point.
438 static void arm_kernel_cmpxchg64_helper(CPUARMState *env)
440 uint64_t oldval, newval, val;
441 uint32_t addr, cpsr;
442 target_siginfo_t info;
444 /* Based on the 32 bit code in do_kernel_trap */
446 /* XXX: This only works between threads, not between processes.
447 It's probably possible to implement this with native host
448 operations. However things like ldrex/strex are much harder so
449 there's not much point trying. */
450 start_exclusive();
451 cpsr = cpsr_read(env);
452 addr = env->regs[2];
454 if (get_user_u64(oldval, env->regs[0])) {
455 env->exception.vaddress = env->regs[0];
456 goto segv;
459 if (get_user_u64(newval, env->regs[1])) {
460 env->exception.vaddress = env->regs[1];
461 goto segv;
464 if (get_user_u64(val, addr)) {
465 env->exception.vaddress = addr;
466 goto segv;
469 if (val == oldval) {
470 val = newval;
472 if (put_user_u64(val, addr)) {
473 env->exception.vaddress = addr;
474 goto segv;
477 env->regs[0] = 0;
478 cpsr |= CPSR_C;
479 } else {
480 env->regs[0] = -1;
481 cpsr &= ~CPSR_C;
483 cpsr_write(env, cpsr, CPSR_C, CPSRWriteByInstr);
484 end_exclusive();
485 return;
487 segv:
488 end_exclusive();
489 /* We get the PC of the entry address - which is as good as anything,
490 on a real kernel what you get depends on which mode it uses. */
491 info.si_signo = TARGET_SIGSEGV;
492 info.si_errno = 0;
493 /* XXX: check env->error_code */
494 info.si_code = TARGET_SEGV_MAPERR;
495 info._sifields._sigfault._addr = env->exception.vaddress;
496 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
499 /* Handle a jump to the kernel code page. */
500 static int
501 do_kernel_trap(CPUARMState *env)
503 uint32_t addr;
504 uint32_t cpsr;
505 uint32_t val;
507 switch (env->regs[15]) {
508 case 0xffff0fa0: /* __kernel_memory_barrier */
509 /* ??? No-op. Will need to do better for SMP. */
510 break;
511 case 0xffff0fc0: /* __kernel_cmpxchg */
512 /* XXX: This only works between threads, not between processes.
513 It's probably possible to implement this with native host
514 operations. However things like ldrex/strex are much harder so
515 there's not much point trying. */
516 start_exclusive();
517 cpsr = cpsr_read(env);
518 addr = env->regs[2];
519 /* FIXME: This should SEGV if the access fails. */
520 if (get_user_u32(val, addr))
521 val = ~env->regs[0];
522 if (val == env->regs[0]) {
523 val = env->regs[1];
524 /* FIXME: Check for segfaults. */
525 put_user_u32(val, addr);
526 env->regs[0] = 0;
527 cpsr |= CPSR_C;
528 } else {
529 env->regs[0] = -1;
530 cpsr &= ~CPSR_C;
532 cpsr_write(env, cpsr, CPSR_C, CPSRWriteByInstr);
533 end_exclusive();
534 break;
535 case 0xffff0fe0: /* __kernel_get_tls */
536 env->regs[0] = cpu_get_tls(env);
537 break;
538 case 0xffff0f60: /* __kernel_cmpxchg64 */
539 arm_kernel_cmpxchg64_helper(env);
540 break;
542 default:
543 return 1;
545 /* Jump back to the caller. */
546 addr = env->regs[14];
547 if (addr & 1) {
548 env->thumb = 1;
549 addr &= ~1;
551 env->regs[15] = addr;
553 return 0;
556 void cpu_loop(CPUARMState *env)
558 CPUState *cs = CPU(arm_env_get_cpu(env));
559 int trapnr;
560 unsigned int n, insn;
561 target_siginfo_t info;
562 uint32_t addr;
563 abi_ulong ret;
565 for(;;) {
566 cpu_exec_start(cs);
567 trapnr = cpu_exec(cs);
568 cpu_exec_end(cs);
569 process_queued_cpu_work(cs);
571 switch(trapnr) {
572 case EXCP_UDEF:
574 TaskState *ts = cs->opaque;
575 uint32_t opcode;
576 int rc;
578 /* we handle the FPU emulation here, as Linux */
579 /* we get the opcode */
580 /* FIXME - what to do if get_user() fails? */
581 get_user_code_u32(opcode, env->regs[15], env);
583 rc = EmulateAll(opcode, &ts->fpa, env);
584 if (rc == 0) { /* illegal instruction */
585 info.si_signo = TARGET_SIGILL;
586 info.si_errno = 0;
587 info.si_code = TARGET_ILL_ILLOPN;
588 info._sifields._sigfault._addr = env->regs[15];
589 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
590 } else if (rc < 0) { /* FP exception */
591 int arm_fpe=0;
593 /* translate softfloat flags to FPSR flags */
594 if (-rc & float_flag_invalid)
595 arm_fpe |= BIT_IOC;
596 if (-rc & float_flag_divbyzero)
597 arm_fpe |= BIT_DZC;
598 if (-rc & float_flag_overflow)
599 arm_fpe |= BIT_OFC;
600 if (-rc & float_flag_underflow)
601 arm_fpe |= BIT_UFC;
602 if (-rc & float_flag_inexact)
603 arm_fpe |= BIT_IXC;
605 FPSR fpsr = ts->fpa.fpsr;
606 //printf("fpsr 0x%x, arm_fpe 0x%x\n",fpsr,arm_fpe);
608 if (fpsr & (arm_fpe << 16)) { /* exception enabled? */
609 info.si_signo = TARGET_SIGFPE;
610 info.si_errno = 0;
612 /* ordered by priority, least first */
613 if (arm_fpe & BIT_IXC) info.si_code = TARGET_FPE_FLTRES;
614 if (arm_fpe & BIT_UFC) info.si_code = TARGET_FPE_FLTUND;
615 if (arm_fpe & BIT_OFC) info.si_code = TARGET_FPE_FLTOVF;
616 if (arm_fpe & BIT_DZC) info.si_code = TARGET_FPE_FLTDIV;
617 if (arm_fpe & BIT_IOC) info.si_code = TARGET_FPE_FLTINV;
619 info._sifields._sigfault._addr = env->regs[15];
620 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
621 } else {
622 env->regs[15] += 4;
625 /* accumulate unenabled exceptions */
626 if ((!(fpsr & BIT_IXE)) && (arm_fpe & BIT_IXC))
627 fpsr |= BIT_IXC;
628 if ((!(fpsr & BIT_UFE)) && (arm_fpe & BIT_UFC))
629 fpsr |= BIT_UFC;
630 if ((!(fpsr & BIT_OFE)) && (arm_fpe & BIT_OFC))
631 fpsr |= BIT_OFC;
632 if ((!(fpsr & BIT_DZE)) && (arm_fpe & BIT_DZC))
633 fpsr |= BIT_DZC;
634 if ((!(fpsr & BIT_IOE)) && (arm_fpe & BIT_IOC))
635 fpsr |= BIT_IOC;
636 ts->fpa.fpsr=fpsr;
637 } else { /* everything OK */
638 /* increment PC */
639 env->regs[15] += 4;
642 break;
643 case EXCP_SWI:
644 case EXCP_BKPT:
646 env->eabi = 1;
647 /* system call */
648 if (trapnr == EXCP_BKPT) {
649 if (env->thumb) {
650 /* FIXME - what to do if get_user() fails? */
651 get_user_code_u16(insn, env->regs[15], env);
652 n = insn & 0xff;
653 env->regs[15] += 2;
654 } else {
655 /* FIXME - what to do if get_user() fails? */
656 get_user_code_u32(insn, env->regs[15], env);
657 n = (insn & 0xf) | ((insn >> 4) & 0xff0);
658 env->regs[15] += 4;
660 } else {
661 if (env->thumb) {
662 /* FIXME - what to do if get_user() fails? */
663 get_user_code_u16(insn, env->regs[15] - 2, env);
664 n = insn & 0xff;
665 } else {
666 /* FIXME - what to do if get_user() fails? */
667 get_user_code_u32(insn, env->regs[15] - 4, env);
668 n = insn & 0xffffff;
672 if (n == ARM_NR_cacheflush) {
673 /* nop */
674 } else if (n == ARM_NR_semihosting
675 || n == ARM_NR_thumb_semihosting) {
676 env->regs[0] = do_arm_semihosting (env);
677 } else if (n == 0 || n >= ARM_SYSCALL_BASE || env->thumb) {
678 /* linux syscall */
679 if (env->thumb || n == 0) {
680 n = env->regs[7];
681 } else {
682 n -= ARM_SYSCALL_BASE;
683 env->eabi = 0;
685 if ( n > ARM_NR_BASE) {
686 switch (n) {
687 case ARM_NR_cacheflush:
688 /* nop */
689 break;
690 case ARM_NR_set_tls:
691 cpu_set_tls(env, env->regs[0]);
692 env->regs[0] = 0;
693 break;
694 case ARM_NR_breakpoint:
695 env->regs[15] -= env->thumb ? 2 : 4;
696 goto excp_debug;
697 default:
698 gemu_log("qemu: Unsupported ARM syscall: 0x%x\n",
700 env->regs[0] = -TARGET_ENOSYS;
701 break;
703 } else {
704 ret = do_syscall(env,
706 env->regs[0],
707 env->regs[1],
708 env->regs[2],
709 env->regs[3],
710 env->regs[4],
711 env->regs[5],
712 0, 0);
713 if (ret == -TARGET_ERESTARTSYS) {
714 env->regs[15] -= env->thumb ? 2 : 4;
715 } else if (ret != -TARGET_QEMU_ESIGRETURN) {
716 env->regs[0] = ret;
719 } else {
720 goto error;
723 break;
724 case EXCP_SEMIHOST:
725 env->regs[0] = do_arm_semihosting(env);
726 break;
727 case EXCP_INTERRUPT:
728 /* just indicate that signals should be handled asap */
729 break;
730 case EXCP_PREFETCH_ABORT:
731 case EXCP_DATA_ABORT:
732 addr = env->exception.vaddress;
734 info.si_signo = TARGET_SIGSEGV;
735 info.si_errno = 0;
736 /* XXX: check env->error_code */
737 info.si_code = TARGET_SEGV_MAPERR;
738 info._sifields._sigfault._addr = addr;
739 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
741 break;
742 case EXCP_DEBUG:
743 excp_debug:
745 int sig;
747 sig = gdb_handlesig(cs, TARGET_SIGTRAP);
748 if (sig)
750 info.si_signo = sig;
751 info.si_errno = 0;
752 info.si_code = TARGET_TRAP_BRKPT;
753 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
756 break;
757 case EXCP_KERNEL_TRAP:
758 if (do_kernel_trap(env))
759 goto error;
760 break;
761 case EXCP_YIELD:
762 /* nothing to do here for user-mode, just resume guest code */
763 break;
764 case EXCP_ATOMIC:
765 cpu_exec_step_atomic(cs);
766 break;
767 default:
768 error:
769 EXCP_DUMP(env, "qemu: unhandled CPU exception 0x%x - aborting\n", trapnr);
770 abort();
772 process_pending_signals(env);
776 #else
778 /* AArch64 main loop */
779 void cpu_loop(CPUARMState *env)
781 CPUState *cs = CPU(arm_env_get_cpu(env));
782 int trapnr, sig;
783 abi_long ret;
784 target_siginfo_t info;
786 for (;;) {
787 cpu_exec_start(cs);
788 trapnr = cpu_exec(cs);
789 cpu_exec_end(cs);
790 process_queued_cpu_work(cs);
792 switch (trapnr) {
793 case EXCP_SWI:
794 ret = do_syscall(env,
795 env->xregs[8],
796 env->xregs[0],
797 env->xregs[1],
798 env->xregs[2],
799 env->xregs[3],
800 env->xregs[4],
801 env->xregs[5],
802 0, 0);
803 if (ret == -TARGET_ERESTARTSYS) {
804 env->pc -= 4;
805 } else if (ret != -TARGET_QEMU_ESIGRETURN) {
806 env->xregs[0] = ret;
808 break;
809 case EXCP_INTERRUPT:
810 /* just indicate that signals should be handled asap */
811 break;
812 case EXCP_UDEF:
813 info.si_signo = TARGET_SIGILL;
814 info.si_errno = 0;
815 info.si_code = TARGET_ILL_ILLOPN;
816 info._sifields._sigfault._addr = env->pc;
817 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
818 break;
819 case EXCP_PREFETCH_ABORT:
820 case EXCP_DATA_ABORT:
821 info.si_signo = TARGET_SIGSEGV;
822 info.si_errno = 0;
823 /* XXX: check env->error_code */
824 info.si_code = TARGET_SEGV_MAPERR;
825 info._sifields._sigfault._addr = env->exception.vaddress;
826 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
827 break;
828 case EXCP_DEBUG:
829 case EXCP_BKPT:
830 sig = gdb_handlesig(cs, TARGET_SIGTRAP);
831 if (sig) {
832 info.si_signo = sig;
833 info.si_errno = 0;
834 info.si_code = TARGET_TRAP_BRKPT;
835 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
837 break;
838 case EXCP_SEMIHOST:
839 env->xregs[0] = do_arm_semihosting(env);
840 break;
841 case EXCP_YIELD:
842 /* nothing to do here for user-mode, just resume guest code */
843 break;
844 case EXCP_ATOMIC:
845 cpu_exec_step_atomic(cs);
846 break;
847 default:
848 EXCP_DUMP(env, "qemu: unhandled CPU exception 0x%x - aborting\n", trapnr);
849 abort();
851 process_pending_signals(env);
852 /* Exception return on AArch64 always clears the exclusive monitor,
853 * so any return to running guest code implies this.
855 env->exclusive_addr = -1;
858 #endif /* ndef TARGET_ABI32 */
860 #endif
862 #ifdef TARGET_UNICORE32
864 void cpu_loop(CPUUniCore32State *env)
866 CPUState *cs = CPU(uc32_env_get_cpu(env));
867 int trapnr;
868 unsigned int n, insn;
869 target_siginfo_t info;
871 for (;;) {
872 cpu_exec_start(cs);
873 trapnr = cpu_exec(cs);
874 cpu_exec_end(cs);
875 process_queued_cpu_work(cs);
877 switch (trapnr) {
878 case UC32_EXCP_PRIV:
880 /* system call */
881 get_user_u32(insn, env->regs[31] - 4);
882 n = insn & 0xffffff;
884 if (n >= UC32_SYSCALL_BASE) {
885 /* linux syscall */
886 n -= UC32_SYSCALL_BASE;
887 if (n == UC32_SYSCALL_NR_set_tls) {
888 cpu_set_tls(env, env->regs[0]);
889 env->regs[0] = 0;
890 } else {
891 abi_long ret = do_syscall(env,
893 env->regs[0],
894 env->regs[1],
895 env->regs[2],
896 env->regs[3],
897 env->regs[4],
898 env->regs[5],
899 0, 0);
900 if (ret == -TARGET_ERESTARTSYS) {
901 env->regs[31] -= 4;
902 } else if (ret != -TARGET_QEMU_ESIGRETURN) {
903 env->regs[0] = ret;
906 } else {
907 goto error;
910 break;
911 case UC32_EXCP_DTRAP:
912 case UC32_EXCP_ITRAP:
913 info.si_signo = TARGET_SIGSEGV;
914 info.si_errno = 0;
915 /* XXX: check env->error_code */
916 info.si_code = TARGET_SEGV_MAPERR;
917 info._sifields._sigfault._addr = env->cp0.c4_faultaddr;
918 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
919 break;
920 case EXCP_INTERRUPT:
921 /* just indicate that signals should be handled asap */
922 break;
923 case EXCP_DEBUG:
925 int sig;
927 sig = gdb_handlesig(cs, TARGET_SIGTRAP);
928 if (sig) {
929 info.si_signo = sig;
930 info.si_errno = 0;
931 info.si_code = TARGET_TRAP_BRKPT;
932 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
935 break;
936 case EXCP_ATOMIC:
937 cpu_exec_step_atomic(cs);
938 break;
939 default:
940 goto error;
942 process_pending_signals(env);
945 error:
946 EXCP_DUMP(env, "qemu: unhandled CPU exception 0x%x - aborting\n", trapnr);
947 abort();
949 #endif
951 #ifdef TARGET_SPARC
952 #define SPARC64_STACK_BIAS 2047
954 //#define DEBUG_WIN
956 /* WARNING: dealing with register windows _is_ complicated. More info
957 can be found at http://www.sics.se/~psm/sparcstack.html */
958 static inline int get_reg_index(CPUSPARCState *env, int cwp, int index)
960 index = (index + cwp * 16) % (16 * env->nwindows);
961 /* wrap handling : if cwp is on the last window, then we use the
962 registers 'after' the end */
963 if (index < 8 && env->cwp == env->nwindows - 1)
964 index += 16 * env->nwindows;
965 return index;
968 /* save the register window 'cwp1' */
969 static inline void save_window_offset(CPUSPARCState *env, int cwp1)
971 unsigned int i;
972 abi_ulong sp_ptr;
974 sp_ptr = env->regbase[get_reg_index(env, cwp1, 6)];
975 #ifdef TARGET_SPARC64
976 if (sp_ptr & 3)
977 sp_ptr += SPARC64_STACK_BIAS;
978 #endif
979 #if defined(DEBUG_WIN)
980 printf("win_overflow: sp_ptr=0x" TARGET_ABI_FMT_lx " save_cwp=%d\n",
981 sp_ptr, cwp1);
982 #endif
983 for(i = 0; i < 16; i++) {
984 /* FIXME - what to do if put_user() fails? */
985 put_user_ual(env->regbase[get_reg_index(env, cwp1, 8 + i)], sp_ptr);
986 sp_ptr += sizeof(abi_ulong);
990 static void save_window(CPUSPARCState *env)
992 #ifndef TARGET_SPARC64
993 unsigned int new_wim;
994 new_wim = ((env->wim >> 1) | (env->wim << (env->nwindows - 1))) &
995 ((1LL << env->nwindows) - 1);
996 save_window_offset(env, cpu_cwp_dec(env, env->cwp - 2));
997 env->wim = new_wim;
998 #else
999 save_window_offset(env, cpu_cwp_dec(env, env->cwp - 2));
1000 env->cansave++;
1001 env->canrestore--;
1002 #endif
1005 static void restore_window(CPUSPARCState *env)
1007 #ifndef TARGET_SPARC64
1008 unsigned int new_wim;
1009 #endif
1010 unsigned int i, cwp1;
1011 abi_ulong sp_ptr;
1013 #ifndef TARGET_SPARC64
1014 new_wim = ((env->wim << 1) | (env->wim >> (env->nwindows - 1))) &
1015 ((1LL << env->nwindows) - 1);
1016 #endif
1018 /* restore the invalid window */
1019 cwp1 = cpu_cwp_inc(env, env->cwp + 1);
1020 sp_ptr = env->regbase[get_reg_index(env, cwp1, 6)];
1021 #ifdef TARGET_SPARC64
1022 if (sp_ptr & 3)
1023 sp_ptr += SPARC64_STACK_BIAS;
1024 #endif
1025 #if defined(DEBUG_WIN)
1026 printf("win_underflow: sp_ptr=0x" TARGET_ABI_FMT_lx " load_cwp=%d\n",
1027 sp_ptr, cwp1);
1028 #endif
1029 for(i = 0; i < 16; i++) {
1030 /* FIXME - what to do if get_user() fails? */
1031 get_user_ual(env->regbase[get_reg_index(env, cwp1, 8 + i)], sp_ptr);
1032 sp_ptr += sizeof(abi_ulong);
1034 #ifdef TARGET_SPARC64
1035 env->canrestore++;
1036 if (env->cleanwin < env->nwindows - 1)
1037 env->cleanwin++;
1038 env->cansave--;
1039 #else
1040 env->wim = new_wim;
1041 #endif
1044 static void flush_windows(CPUSPARCState *env)
1046 int offset, cwp1;
1048 offset = 1;
1049 for(;;) {
1050 /* if restore would invoke restore_window(), then we can stop */
1051 cwp1 = cpu_cwp_inc(env, env->cwp + offset);
1052 #ifndef TARGET_SPARC64
1053 if (env->wim & (1 << cwp1))
1054 break;
1055 #else
1056 if (env->canrestore == 0)
1057 break;
1058 env->cansave++;
1059 env->canrestore--;
1060 #endif
1061 save_window_offset(env, cwp1);
1062 offset++;
1064 cwp1 = cpu_cwp_inc(env, env->cwp + 1);
1065 #ifndef TARGET_SPARC64
1066 /* set wim so that restore will reload the registers */
1067 env->wim = 1 << cwp1;
1068 #endif
1069 #if defined(DEBUG_WIN)
1070 printf("flush_windows: nb=%d\n", offset - 1);
1071 #endif
1074 void cpu_loop (CPUSPARCState *env)
1076 CPUState *cs = CPU(sparc_env_get_cpu(env));
1077 int trapnr;
1078 abi_long ret;
1079 target_siginfo_t info;
1081 while (1) {
1082 cpu_exec_start(cs);
1083 trapnr = cpu_exec(cs);
1084 cpu_exec_end(cs);
1085 process_queued_cpu_work(cs);
1087 /* Compute PSR before exposing state. */
1088 if (env->cc_op != CC_OP_FLAGS) {
1089 cpu_get_psr(env);
1092 switch (trapnr) {
1093 #ifndef TARGET_SPARC64
1094 case 0x88:
1095 case 0x90:
1096 #else
1097 case 0x110:
1098 case 0x16d:
1099 #endif
1100 ret = do_syscall (env, env->gregs[1],
1101 env->regwptr[0], env->regwptr[1],
1102 env->regwptr[2], env->regwptr[3],
1103 env->regwptr[4], env->regwptr[5],
1104 0, 0);
1105 if (ret == -TARGET_ERESTARTSYS || ret == -TARGET_QEMU_ESIGRETURN) {
1106 break;
1108 if ((abi_ulong)ret >= (abi_ulong)(-515)) {
1109 #if defined(TARGET_SPARC64) && !defined(TARGET_ABI32)
1110 env->xcc |= PSR_CARRY;
1111 #else
1112 env->psr |= PSR_CARRY;
1113 #endif
1114 ret = -ret;
1115 } else {
1116 #if defined(TARGET_SPARC64) && !defined(TARGET_ABI32)
1117 env->xcc &= ~PSR_CARRY;
1118 #else
1119 env->psr &= ~PSR_CARRY;
1120 #endif
1122 env->regwptr[0] = ret;
1123 /* next instruction */
1124 env->pc = env->npc;
1125 env->npc = env->npc + 4;
1126 break;
1127 case 0x83: /* flush windows */
1128 #ifdef TARGET_ABI32
1129 case 0x103:
1130 #endif
1131 flush_windows(env);
1132 /* next instruction */
1133 env->pc = env->npc;
1134 env->npc = env->npc + 4;
1135 break;
1136 #ifndef TARGET_SPARC64
1137 case TT_WIN_OVF: /* window overflow */
1138 save_window(env);
1139 break;
1140 case TT_WIN_UNF: /* window underflow */
1141 restore_window(env);
1142 break;
1143 case TT_TFAULT:
1144 case TT_DFAULT:
1146 info.si_signo = TARGET_SIGSEGV;
1147 info.si_errno = 0;
1148 /* XXX: check env->error_code */
1149 info.si_code = TARGET_SEGV_MAPERR;
1150 info._sifields._sigfault._addr = env->mmuregs[4];
1151 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
1153 break;
1154 #else
1155 case TT_SPILL: /* window overflow */
1156 save_window(env);
1157 break;
1158 case TT_FILL: /* window underflow */
1159 restore_window(env);
1160 break;
1161 case TT_TFAULT:
1162 case TT_DFAULT:
1164 info.si_signo = TARGET_SIGSEGV;
1165 info.si_errno = 0;
1166 /* XXX: check env->error_code */
1167 info.si_code = TARGET_SEGV_MAPERR;
1168 if (trapnr == TT_DFAULT)
1169 info._sifields._sigfault._addr = env->dmmuregs[4];
1170 else
1171 info._sifields._sigfault._addr = cpu_tsptr(env)->tpc;
1172 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
1174 break;
1175 #ifndef TARGET_ABI32
1176 case 0x16e:
1177 flush_windows(env);
1178 sparc64_get_context(env);
1179 break;
1180 case 0x16f:
1181 flush_windows(env);
1182 sparc64_set_context(env);
1183 break;
1184 #endif
1185 #endif
1186 case EXCP_INTERRUPT:
1187 /* just indicate that signals should be handled asap */
1188 break;
1189 case TT_ILL_INSN:
1191 info.si_signo = TARGET_SIGILL;
1192 info.si_errno = 0;
1193 info.si_code = TARGET_ILL_ILLOPC;
1194 info._sifields._sigfault._addr = env->pc;
1195 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
1197 break;
1198 case EXCP_DEBUG:
1200 int sig;
1202 sig = gdb_handlesig(cs, TARGET_SIGTRAP);
1203 if (sig)
1205 info.si_signo = sig;
1206 info.si_errno = 0;
1207 info.si_code = TARGET_TRAP_BRKPT;
1208 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
1211 break;
1212 case EXCP_ATOMIC:
1213 cpu_exec_step_atomic(cs);
1214 break;
1215 default:
1216 printf ("Unhandled trap: 0x%x\n", trapnr);
1217 cpu_dump_state(cs, stderr, fprintf, 0);
1218 exit(EXIT_FAILURE);
1220 process_pending_signals (env);
1224 #endif
1226 #ifdef TARGET_PPC
1227 static inline uint64_t cpu_ppc_get_tb(CPUPPCState *env)
1229 return cpu_get_host_ticks();
1232 uint64_t cpu_ppc_load_tbl(CPUPPCState *env)
1234 return cpu_ppc_get_tb(env);
1237 uint32_t cpu_ppc_load_tbu(CPUPPCState *env)
1239 return cpu_ppc_get_tb(env) >> 32;
1242 uint64_t cpu_ppc_load_atbl(CPUPPCState *env)
1244 return cpu_ppc_get_tb(env);
1247 uint32_t cpu_ppc_load_atbu(CPUPPCState *env)
1249 return cpu_ppc_get_tb(env) >> 32;
1252 uint32_t cpu_ppc601_load_rtcu(CPUPPCState *env)
1253 __attribute__ (( alias ("cpu_ppc_load_tbu") ));
1255 uint32_t cpu_ppc601_load_rtcl(CPUPPCState *env)
1257 return cpu_ppc_load_tbl(env) & 0x3FFFFF80;
1260 /* XXX: to be fixed */
1261 int ppc_dcr_read (ppc_dcr_t *dcr_env, int dcrn, uint32_t *valp)
1263 return -1;
1266 int ppc_dcr_write (ppc_dcr_t *dcr_env, int dcrn, uint32_t val)
1268 return -1;
1271 static int do_store_exclusive(CPUPPCState *env)
1273 target_ulong addr;
1274 target_ulong page_addr;
1275 target_ulong val, val2 __attribute__((unused)) = 0;
1276 int flags;
1277 int segv = 0;
1279 addr = env->reserve_ea;
1280 page_addr = addr & TARGET_PAGE_MASK;
1281 start_exclusive();
1282 mmap_lock();
1283 flags = page_get_flags(page_addr);
1284 if ((flags & PAGE_READ) == 0) {
1285 segv = 1;
1286 } else {
1287 int reg = env->reserve_info & 0x1f;
1288 int size = env->reserve_info >> 5;
1289 int stored = 0;
1291 if (addr == env->reserve_addr) {
1292 switch (size) {
1293 case 1: segv = get_user_u8(val, addr); break;
1294 case 2: segv = get_user_u16(val, addr); break;
1295 case 4: segv = get_user_u32(val, addr); break;
1296 #if defined(TARGET_PPC64)
1297 case 8: segv = get_user_u64(val, addr); break;
1298 case 16: {
1299 segv = get_user_u64(val, addr);
1300 if (!segv) {
1301 segv = get_user_u64(val2, addr + 8);
1303 break;
1305 #endif
1306 default: abort();
1308 if (!segv && val == env->reserve_val) {
1309 val = env->gpr[reg];
1310 switch (size) {
1311 case 1: segv = put_user_u8(val, addr); break;
1312 case 2: segv = put_user_u16(val, addr); break;
1313 case 4: segv = put_user_u32(val, addr); break;
1314 #if defined(TARGET_PPC64)
1315 case 8: segv = put_user_u64(val, addr); break;
1316 case 16: {
1317 if (val2 == env->reserve_val2) {
1318 if (msr_le) {
1319 val2 = val;
1320 val = env->gpr[reg+1];
1321 } else {
1322 val2 = env->gpr[reg+1];
1324 segv = put_user_u64(val, addr);
1325 if (!segv) {
1326 segv = put_user_u64(val2, addr + 8);
1329 break;
1331 #endif
1332 default: abort();
1334 if (!segv) {
1335 stored = 1;
1339 env->crf[0] = (stored << 1) | xer_so;
1340 env->reserve_addr = (target_ulong)-1;
1342 if (!segv) {
1343 env->nip += 4;
1345 mmap_unlock();
1346 end_exclusive();
1347 return segv;
1350 void cpu_loop(CPUPPCState *env)
1352 CPUState *cs = CPU(ppc_env_get_cpu(env));
1353 target_siginfo_t info;
1354 int trapnr;
1355 target_ulong ret;
1357 for(;;) {
1358 cpu_exec_start(cs);
1359 trapnr = cpu_exec(cs);
1360 cpu_exec_end(cs);
1361 process_queued_cpu_work(cs);
1363 switch(trapnr) {
1364 case POWERPC_EXCP_NONE:
1365 /* Just go on */
1366 break;
1367 case POWERPC_EXCP_CRITICAL: /* Critical input */
1368 cpu_abort(cs, "Critical interrupt while in user mode. "
1369 "Aborting\n");
1370 break;
1371 case POWERPC_EXCP_MCHECK: /* Machine check exception */
1372 cpu_abort(cs, "Machine check exception while in user mode. "
1373 "Aborting\n");
1374 break;
1375 case POWERPC_EXCP_DSI: /* Data storage exception */
1376 /* XXX: check this. Seems bugged */
1377 switch (env->error_code & 0xFF000000) {
1378 case 0x40000000:
1379 case 0x42000000:
1380 info.si_signo = TARGET_SIGSEGV;
1381 info.si_errno = 0;
1382 info.si_code = TARGET_SEGV_MAPERR;
1383 break;
1384 case 0x04000000:
1385 info.si_signo = TARGET_SIGILL;
1386 info.si_errno = 0;
1387 info.si_code = TARGET_ILL_ILLADR;
1388 break;
1389 case 0x08000000:
1390 info.si_signo = TARGET_SIGSEGV;
1391 info.si_errno = 0;
1392 info.si_code = TARGET_SEGV_ACCERR;
1393 break;
1394 default:
1395 /* Let's send a regular segfault... */
1396 EXCP_DUMP(env, "Invalid segfault errno (%02x)\n",
1397 env->error_code);
1398 info.si_signo = TARGET_SIGSEGV;
1399 info.si_errno = 0;
1400 info.si_code = TARGET_SEGV_MAPERR;
1401 break;
1403 info._sifields._sigfault._addr = env->nip;
1404 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
1405 break;
1406 case POWERPC_EXCP_ISI: /* Instruction storage exception */
1407 /* XXX: check this */
1408 switch (env->error_code & 0xFF000000) {
1409 case 0x40000000:
1410 info.si_signo = TARGET_SIGSEGV;
1411 info.si_errno = 0;
1412 info.si_code = TARGET_SEGV_MAPERR;
1413 break;
1414 case 0x10000000:
1415 case 0x08000000:
1416 info.si_signo = TARGET_SIGSEGV;
1417 info.si_errno = 0;
1418 info.si_code = TARGET_SEGV_ACCERR;
1419 break;
1420 default:
1421 /* Let's send a regular segfault... */
1422 EXCP_DUMP(env, "Invalid segfault errno (%02x)\n",
1423 env->error_code);
1424 info.si_signo = TARGET_SIGSEGV;
1425 info.si_errno = 0;
1426 info.si_code = TARGET_SEGV_MAPERR;
1427 break;
1429 info._sifields._sigfault._addr = env->nip - 4;
1430 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
1431 break;
1432 case POWERPC_EXCP_EXTERNAL: /* External input */
1433 cpu_abort(cs, "External interrupt while in user mode. "
1434 "Aborting\n");
1435 break;
1436 case POWERPC_EXCP_ALIGN: /* Alignment exception */
1437 /* XXX: check this */
1438 info.si_signo = TARGET_SIGBUS;
1439 info.si_errno = 0;
1440 info.si_code = TARGET_BUS_ADRALN;
1441 info._sifields._sigfault._addr = env->nip;
1442 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
1443 break;
1444 case POWERPC_EXCP_PROGRAM: /* Program exception */
1445 case POWERPC_EXCP_HV_EMU: /* HV emulation */
1446 /* XXX: check this */
1447 switch (env->error_code & ~0xF) {
1448 case POWERPC_EXCP_FP:
1449 info.si_signo = TARGET_SIGFPE;
1450 info.si_errno = 0;
1451 switch (env->error_code & 0xF) {
1452 case POWERPC_EXCP_FP_OX:
1453 info.si_code = TARGET_FPE_FLTOVF;
1454 break;
1455 case POWERPC_EXCP_FP_UX:
1456 info.si_code = TARGET_FPE_FLTUND;
1457 break;
1458 case POWERPC_EXCP_FP_ZX:
1459 case POWERPC_EXCP_FP_VXZDZ:
1460 info.si_code = TARGET_FPE_FLTDIV;
1461 break;
1462 case POWERPC_EXCP_FP_XX:
1463 info.si_code = TARGET_FPE_FLTRES;
1464 break;
1465 case POWERPC_EXCP_FP_VXSOFT:
1466 info.si_code = TARGET_FPE_FLTINV;
1467 break;
1468 case POWERPC_EXCP_FP_VXSNAN:
1469 case POWERPC_EXCP_FP_VXISI:
1470 case POWERPC_EXCP_FP_VXIDI:
1471 case POWERPC_EXCP_FP_VXIMZ:
1472 case POWERPC_EXCP_FP_VXVC:
1473 case POWERPC_EXCP_FP_VXSQRT:
1474 case POWERPC_EXCP_FP_VXCVI:
1475 info.si_code = TARGET_FPE_FLTSUB;
1476 break;
1477 default:
1478 EXCP_DUMP(env, "Unknown floating point exception (%02x)\n",
1479 env->error_code);
1480 break;
1482 break;
1483 case POWERPC_EXCP_INVAL:
1484 info.si_signo = TARGET_SIGILL;
1485 info.si_errno = 0;
1486 switch (env->error_code & 0xF) {
1487 case POWERPC_EXCP_INVAL_INVAL:
1488 info.si_code = TARGET_ILL_ILLOPC;
1489 break;
1490 case POWERPC_EXCP_INVAL_LSWX:
1491 info.si_code = TARGET_ILL_ILLOPN;
1492 break;
1493 case POWERPC_EXCP_INVAL_SPR:
1494 info.si_code = TARGET_ILL_PRVREG;
1495 break;
1496 case POWERPC_EXCP_INVAL_FP:
1497 info.si_code = TARGET_ILL_COPROC;
1498 break;
1499 default:
1500 EXCP_DUMP(env, "Unknown invalid operation (%02x)\n",
1501 env->error_code & 0xF);
1502 info.si_code = TARGET_ILL_ILLADR;
1503 break;
1505 break;
1506 case POWERPC_EXCP_PRIV:
1507 info.si_signo = TARGET_SIGILL;
1508 info.si_errno = 0;
1509 switch (env->error_code & 0xF) {
1510 case POWERPC_EXCP_PRIV_OPC:
1511 info.si_code = TARGET_ILL_PRVOPC;
1512 break;
1513 case POWERPC_EXCP_PRIV_REG:
1514 info.si_code = TARGET_ILL_PRVREG;
1515 break;
1516 default:
1517 EXCP_DUMP(env, "Unknown privilege violation (%02x)\n",
1518 env->error_code & 0xF);
1519 info.si_code = TARGET_ILL_PRVOPC;
1520 break;
1522 break;
1523 case POWERPC_EXCP_TRAP:
1524 cpu_abort(cs, "Tried to call a TRAP\n");
1525 break;
1526 default:
1527 /* Should not happen ! */
1528 cpu_abort(cs, "Unknown program exception (%02x)\n",
1529 env->error_code);
1530 break;
1532 info._sifields._sigfault._addr = env->nip;
1533 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
1534 break;
1535 case POWERPC_EXCP_FPU: /* Floating-point unavailable exception */
1536 info.si_signo = TARGET_SIGILL;
1537 info.si_errno = 0;
1538 info.si_code = TARGET_ILL_COPROC;
1539 info._sifields._sigfault._addr = env->nip;
1540 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
1541 break;
1542 case POWERPC_EXCP_SYSCALL: /* System call exception */
1543 cpu_abort(cs, "Syscall exception while in user mode. "
1544 "Aborting\n");
1545 break;
1546 case POWERPC_EXCP_APU: /* Auxiliary processor unavailable */
1547 info.si_signo = TARGET_SIGILL;
1548 info.si_errno = 0;
1549 info.si_code = TARGET_ILL_COPROC;
1550 info._sifields._sigfault._addr = env->nip;
1551 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
1552 break;
1553 case POWERPC_EXCP_DECR: /* Decrementer exception */
1554 cpu_abort(cs, "Decrementer interrupt while in user mode. "
1555 "Aborting\n");
1556 break;
1557 case POWERPC_EXCP_FIT: /* Fixed-interval timer interrupt */
1558 cpu_abort(cs, "Fix interval timer interrupt while in user mode. "
1559 "Aborting\n");
1560 break;
1561 case POWERPC_EXCP_WDT: /* Watchdog timer interrupt */
1562 cpu_abort(cs, "Watchdog timer interrupt while in user mode. "
1563 "Aborting\n");
1564 break;
1565 case POWERPC_EXCP_DTLB: /* Data TLB error */
1566 cpu_abort(cs, "Data TLB exception while in user mode. "
1567 "Aborting\n");
1568 break;
1569 case POWERPC_EXCP_ITLB: /* Instruction TLB error */
1570 cpu_abort(cs, "Instruction TLB exception while in user mode. "
1571 "Aborting\n");
1572 break;
1573 case POWERPC_EXCP_SPEU: /* SPE/embedded floating-point unavail. */
1574 info.si_signo = TARGET_SIGILL;
1575 info.si_errno = 0;
1576 info.si_code = TARGET_ILL_COPROC;
1577 info._sifields._sigfault._addr = env->nip;
1578 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
1579 break;
1580 case POWERPC_EXCP_EFPDI: /* Embedded floating-point data IRQ */
1581 cpu_abort(cs, "Embedded floating-point data IRQ not handled\n");
1582 break;
1583 case POWERPC_EXCP_EFPRI: /* Embedded floating-point round IRQ */
1584 cpu_abort(cs, "Embedded floating-point round IRQ not handled\n");
1585 break;
1586 case POWERPC_EXCP_EPERFM: /* Embedded performance monitor IRQ */
1587 cpu_abort(cs, "Performance monitor exception not handled\n");
1588 break;
1589 case POWERPC_EXCP_DOORI: /* Embedded doorbell interrupt */
1590 cpu_abort(cs, "Doorbell interrupt while in user mode. "
1591 "Aborting\n");
1592 break;
1593 case POWERPC_EXCP_DOORCI: /* Embedded doorbell critical interrupt */
1594 cpu_abort(cs, "Doorbell critical interrupt while in user mode. "
1595 "Aborting\n");
1596 break;
1597 case POWERPC_EXCP_RESET: /* System reset exception */
1598 cpu_abort(cs, "Reset interrupt while in user mode. "
1599 "Aborting\n");
1600 break;
1601 case POWERPC_EXCP_DSEG: /* Data segment exception */
1602 cpu_abort(cs, "Data segment exception while in user mode. "
1603 "Aborting\n");
1604 break;
1605 case POWERPC_EXCP_ISEG: /* Instruction segment exception */
1606 cpu_abort(cs, "Instruction segment exception "
1607 "while in user mode. Aborting\n");
1608 break;
1609 /* PowerPC 64 with hypervisor mode support */
1610 case POWERPC_EXCP_HDECR: /* Hypervisor decrementer exception */
1611 cpu_abort(cs, "Hypervisor decrementer interrupt "
1612 "while in user mode. Aborting\n");
1613 break;
1614 case POWERPC_EXCP_TRACE: /* Trace exception */
1615 /* Nothing to do:
1616 * we use this exception to emulate step-by-step execution mode.
1618 break;
1619 /* PowerPC 64 with hypervisor mode support */
1620 case POWERPC_EXCP_HDSI: /* Hypervisor data storage exception */
1621 cpu_abort(cs, "Hypervisor data storage exception "
1622 "while in user mode. Aborting\n");
1623 break;
1624 case POWERPC_EXCP_HISI: /* Hypervisor instruction storage excp */
1625 cpu_abort(cs, "Hypervisor instruction storage exception "
1626 "while in user mode. Aborting\n");
1627 break;
1628 case POWERPC_EXCP_HDSEG: /* Hypervisor data segment exception */
1629 cpu_abort(cs, "Hypervisor data segment exception "
1630 "while in user mode. Aborting\n");
1631 break;
1632 case POWERPC_EXCP_HISEG: /* Hypervisor instruction segment excp */
1633 cpu_abort(cs, "Hypervisor instruction segment exception "
1634 "while in user mode. Aborting\n");
1635 break;
1636 case POWERPC_EXCP_VPU: /* Vector unavailable exception */
1637 info.si_signo = TARGET_SIGILL;
1638 info.si_errno = 0;
1639 info.si_code = TARGET_ILL_COPROC;
1640 info._sifields._sigfault._addr = env->nip;
1641 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
1642 break;
1643 case POWERPC_EXCP_PIT: /* Programmable interval timer IRQ */
1644 cpu_abort(cs, "Programmable interval timer interrupt "
1645 "while in user mode. Aborting\n");
1646 break;
1647 case POWERPC_EXCP_IO: /* IO error exception */
1648 cpu_abort(cs, "IO error exception while in user mode. "
1649 "Aborting\n");
1650 break;
1651 case POWERPC_EXCP_RUNM: /* Run mode exception */
1652 cpu_abort(cs, "Run mode exception while in user mode. "
1653 "Aborting\n");
1654 break;
1655 case POWERPC_EXCP_EMUL: /* Emulation trap exception */
1656 cpu_abort(cs, "Emulation trap exception not handled\n");
1657 break;
1658 case POWERPC_EXCP_IFTLB: /* Instruction fetch TLB error */
1659 cpu_abort(cs, "Instruction fetch TLB exception "
1660 "while in user-mode. Aborting");
1661 break;
1662 case POWERPC_EXCP_DLTLB: /* Data load TLB miss */
1663 cpu_abort(cs, "Data load TLB exception while in user-mode. "
1664 "Aborting");
1665 break;
1666 case POWERPC_EXCP_DSTLB: /* Data store TLB miss */
1667 cpu_abort(cs, "Data store TLB exception while in user-mode. "
1668 "Aborting");
1669 break;
1670 case POWERPC_EXCP_FPA: /* Floating-point assist exception */
1671 cpu_abort(cs, "Floating-point assist exception not handled\n");
1672 break;
1673 case POWERPC_EXCP_IABR: /* Instruction address breakpoint */
1674 cpu_abort(cs, "Instruction address breakpoint exception "
1675 "not handled\n");
1676 break;
1677 case POWERPC_EXCP_SMI: /* System management interrupt */
1678 cpu_abort(cs, "System management interrupt while in user mode. "
1679 "Aborting\n");
1680 break;
1681 case POWERPC_EXCP_THERM: /* Thermal interrupt */
1682 cpu_abort(cs, "Thermal interrupt interrupt while in user mode. "
1683 "Aborting\n");
1684 break;
1685 case POWERPC_EXCP_PERFM: /* Embedded performance monitor IRQ */
1686 cpu_abort(cs, "Performance monitor exception not handled\n");
1687 break;
1688 case POWERPC_EXCP_VPUA: /* Vector assist exception */
1689 cpu_abort(cs, "Vector assist exception not handled\n");
1690 break;
1691 case POWERPC_EXCP_SOFTP: /* Soft patch exception */
1692 cpu_abort(cs, "Soft patch exception not handled\n");
1693 break;
1694 case POWERPC_EXCP_MAINT: /* Maintenance exception */
1695 cpu_abort(cs, "Maintenance exception while in user mode. "
1696 "Aborting\n");
1697 break;
1698 case POWERPC_EXCP_STOP: /* stop translation */
1699 /* We did invalidate the instruction cache. Go on */
1700 break;
1701 case POWERPC_EXCP_BRANCH: /* branch instruction: */
1702 /* We just stopped because of a branch. Go on */
1703 break;
1704 case POWERPC_EXCP_SYSCALL_USER:
1705 /* system call in user-mode emulation */
1706 /* WARNING:
1707 * PPC ABI uses overflow flag in cr0 to signal an error
1708 * in syscalls.
1710 env->crf[0] &= ~0x1;
1711 ret = do_syscall(env, env->gpr[0], env->gpr[3], env->gpr[4],
1712 env->gpr[5], env->gpr[6], env->gpr[7],
1713 env->gpr[8], 0, 0);
1714 if (ret == -TARGET_ERESTARTSYS) {
1715 break;
1717 if (ret == (target_ulong)(-TARGET_QEMU_ESIGRETURN)) {
1718 /* Returning from a successful sigreturn syscall.
1719 Avoid corrupting register state. */
1720 break;
1722 env->nip += 4;
1723 if (ret > (target_ulong)(-515)) {
1724 env->crf[0] |= 0x1;
1725 ret = -ret;
1727 env->gpr[3] = ret;
1728 break;
1729 case POWERPC_EXCP_STCX:
1730 if (do_store_exclusive(env)) {
1731 info.si_signo = TARGET_SIGSEGV;
1732 info.si_errno = 0;
1733 info.si_code = TARGET_SEGV_MAPERR;
1734 info._sifields._sigfault._addr = env->nip;
1735 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
1737 break;
1738 case EXCP_DEBUG:
1740 int sig;
1742 sig = gdb_handlesig(cs, TARGET_SIGTRAP);
1743 if (sig) {
1744 info.si_signo = sig;
1745 info.si_errno = 0;
1746 info.si_code = TARGET_TRAP_BRKPT;
1747 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
1750 break;
1751 case EXCP_INTERRUPT:
1752 /* just indicate that signals should be handled asap */
1753 break;
1754 case EXCP_ATOMIC:
1755 cpu_exec_step_atomic(cs);
1756 break;
1757 default:
1758 cpu_abort(cs, "Unknown exception 0x%x. Aborting\n", trapnr);
1759 break;
1761 process_pending_signals(env);
1764 #endif
1766 #ifdef TARGET_MIPS
1768 # ifdef TARGET_ABI_MIPSO32
1769 # define MIPS_SYS(name, args) args,
1770 static const uint8_t mips_syscall_args[] = {
1771 MIPS_SYS(sys_syscall , 8) /* 4000 */
1772 MIPS_SYS(sys_exit , 1)
1773 MIPS_SYS(sys_fork , 0)
1774 MIPS_SYS(sys_read , 3)
1775 MIPS_SYS(sys_write , 3)
1776 MIPS_SYS(sys_open , 3) /* 4005 */
1777 MIPS_SYS(sys_close , 1)
1778 MIPS_SYS(sys_waitpid , 3)
1779 MIPS_SYS(sys_creat , 2)
1780 MIPS_SYS(sys_link , 2)
1781 MIPS_SYS(sys_unlink , 1) /* 4010 */
1782 MIPS_SYS(sys_execve , 0)
1783 MIPS_SYS(sys_chdir , 1)
1784 MIPS_SYS(sys_time , 1)
1785 MIPS_SYS(sys_mknod , 3)
1786 MIPS_SYS(sys_chmod , 2) /* 4015 */
1787 MIPS_SYS(sys_lchown , 3)
1788 MIPS_SYS(sys_ni_syscall , 0)
1789 MIPS_SYS(sys_ni_syscall , 0) /* was sys_stat */
1790 MIPS_SYS(sys_lseek , 3)
1791 MIPS_SYS(sys_getpid , 0) /* 4020 */
1792 MIPS_SYS(sys_mount , 5)
1793 MIPS_SYS(sys_umount , 1)
1794 MIPS_SYS(sys_setuid , 1)
1795 MIPS_SYS(sys_getuid , 0)
1796 MIPS_SYS(sys_stime , 1) /* 4025 */
1797 MIPS_SYS(sys_ptrace , 4)
1798 MIPS_SYS(sys_alarm , 1)
1799 MIPS_SYS(sys_ni_syscall , 0) /* was sys_fstat */
1800 MIPS_SYS(sys_pause , 0)
1801 MIPS_SYS(sys_utime , 2) /* 4030 */
1802 MIPS_SYS(sys_ni_syscall , 0)
1803 MIPS_SYS(sys_ni_syscall , 0)
1804 MIPS_SYS(sys_access , 2)
1805 MIPS_SYS(sys_nice , 1)
1806 MIPS_SYS(sys_ni_syscall , 0) /* 4035 */
1807 MIPS_SYS(sys_sync , 0)
1808 MIPS_SYS(sys_kill , 2)
1809 MIPS_SYS(sys_rename , 2)
1810 MIPS_SYS(sys_mkdir , 2)
1811 MIPS_SYS(sys_rmdir , 1) /* 4040 */
1812 MIPS_SYS(sys_dup , 1)
1813 MIPS_SYS(sys_pipe , 0)
1814 MIPS_SYS(sys_times , 1)
1815 MIPS_SYS(sys_ni_syscall , 0)
1816 MIPS_SYS(sys_brk , 1) /* 4045 */
1817 MIPS_SYS(sys_setgid , 1)
1818 MIPS_SYS(sys_getgid , 0)
1819 MIPS_SYS(sys_ni_syscall , 0) /* was signal(2) */
1820 MIPS_SYS(sys_geteuid , 0)
1821 MIPS_SYS(sys_getegid , 0) /* 4050 */
1822 MIPS_SYS(sys_acct , 0)
1823 MIPS_SYS(sys_umount2 , 2)
1824 MIPS_SYS(sys_ni_syscall , 0)
1825 MIPS_SYS(sys_ioctl , 3)
1826 MIPS_SYS(sys_fcntl , 3) /* 4055 */
1827 MIPS_SYS(sys_ni_syscall , 2)
1828 MIPS_SYS(sys_setpgid , 2)
1829 MIPS_SYS(sys_ni_syscall , 0)
1830 MIPS_SYS(sys_olduname , 1)
1831 MIPS_SYS(sys_umask , 1) /* 4060 */
1832 MIPS_SYS(sys_chroot , 1)
1833 MIPS_SYS(sys_ustat , 2)
1834 MIPS_SYS(sys_dup2 , 2)
1835 MIPS_SYS(sys_getppid , 0)
1836 MIPS_SYS(sys_getpgrp , 0) /* 4065 */
1837 MIPS_SYS(sys_setsid , 0)
1838 MIPS_SYS(sys_sigaction , 3)
1839 MIPS_SYS(sys_sgetmask , 0)
1840 MIPS_SYS(sys_ssetmask , 1)
1841 MIPS_SYS(sys_setreuid , 2) /* 4070 */
1842 MIPS_SYS(sys_setregid , 2)
1843 MIPS_SYS(sys_sigsuspend , 0)
1844 MIPS_SYS(sys_sigpending , 1)
1845 MIPS_SYS(sys_sethostname , 2)
1846 MIPS_SYS(sys_setrlimit , 2) /* 4075 */
1847 MIPS_SYS(sys_getrlimit , 2)
1848 MIPS_SYS(sys_getrusage , 2)
1849 MIPS_SYS(sys_gettimeofday, 2)
1850 MIPS_SYS(sys_settimeofday, 2)
1851 MIPS_SYS(sys_getgroups , 2) /* 4080 */
1852 MIPS_SYS(sys_setgroups , 2)
1853 MIPS_SYS(sys_ni_syscall , 0) /* old_select */
1854 MIPS_SYS(sys_symlink , 2)
1855 MIPS_SYS(sys_ni_syscall , 0) /* was sys_lstat */
1856 MIPS_SYS(sys_readlink , 3) /* 4085 */
1857 MIPS_SYS(sys_uselib , 1)
1858 MIPS_SYS(sys_swapon , 2)
1859 MIPS_SYS(sys_reboot , 3)
1860 MIPS_SYS(old_readdir , 3)
1861 MIPS_SYS(old_mmap , 6) /* 4090 */
1862 MIPS_SYS(sys_munmap , 2)
1863 MIPS_SYS(sys_truncate , 2)
1864 MIPS_SYS(sys_ftruncate , 2)
1865 MIPS_SYS(sys_fchmod , 2)
1866 MIPS_SYS(sys_fchown , 3) /* 4095 */
1867 MIPS_SYS(sys_getpriority , 2)
1868 MIPS_SYS(sys_setpriority , 3)
1869 MIPS_SYS(sys_ni_syscall , 0)
1870 MIPS_SYS(sys_statfs , 2)
1871 MIPS_SYS(sys_fstatfs , 2) /* 4100 */
1872 MIPS_SYS(sys_ni_syscall , 0) /* was ioperm(2) */
1873 MIPS_SYS(sys_socketcall , 2)
1874 MIPS_SYS(sys_syslog , 3)
1875 MIPS_SYS(sys_setitimer , 3)
1876 MIPS_SYS(sys_getitimer , 2) /* 4105 */
1877 MIPS_SYS(sys_newstat , 2)
1878 MIPS_SYS(sys_newlstat , 2)
1879 MIPS_SYS(sys_newfstat , 2)
1880 MIPS_SYS(sys_uname , 1)
1881 MIPS_SYS(sys_ni_syscall , 0) /* 4110 was iopl(2) */
1882 MIPS_SYS(sys_vhangup , 0)
1883 MIPS_SYS(sys_ni_syscall , 0) /* was sys_idle() */
1884 MIPS_SYS(sys_ni_syscall , 0) /* was sys_vm86 */
1885 MIPS_SYS(sys_wait4 , 4)
1886 MIPS_SYS(sys_swapoff , 1) /* 4115 */
1887 MIPS_SYS(sys_sysinfo , 1)
1888 MIPS_SYS(sys_ipc , 6)
1889 MIPS_SYS(sys_fsync , 1)
1890 MIPS_SYS(sys_sigreturn , 0)
1891 MIPS_SYS(sys_clone , 6) /* 4120 */
1892 MIPS_SYS(sys_setdomainname, 2)
1893 MIPS_SYS(sys_newuname , 1)
1894 MIPS_SYS(sys_ni_syscall , 0) /* sys_modify_ldt */
1895 MIPS_SYS(sys_adjtimex , 1)
1896 MIPS_SYS(sys_mprotect , 3) /* 4125 */
1897 MIPS_SYS(sys_sigprocmask , 3)
1898 MIPS_SYS(sys_ni_syscall , 0) /* was create_module */
1899 MIPS_SYS(sys_init_module , 5)
1900 MIPS_SYS(sys_delete_module, 1)
1901 MIPS_SYS(sys_ni_syscall , 0) /* 4130 was get_kernel_syms */
1902 MIPS_SYS(sys_quotactl , 0)
1903 MIPS_SYS(sys_getpgid , 1)
1904 MIPS_SYS(sys_fchdir , 1)
1905 MIPS_SYS(sys_bdflush , 2)
1906 MIPS_SYS(sys_sysfs , 3) /* 4135 */
1907 MIPS_SYS(sys_personality , 1)
1908 MIPS_SYS(sys_ni_syscall , 0) /* for afs_syscall */
1909 MIPS_SYS(sys_setfsuid , 1)
1910 MIPS_SYS(sys_setfsgid , 1)
1911 MIPS_SYS(sys_llseek , 5) /* 4140 */
1912 MIPS_SYS(sys_getdents , 3)
1913 MIPS_SYS(sys_select , 5)
1914 MIPS_SYS(sys_flock , 2)
1915 MIPS_SYS(sys_msync , 3)
1916 MIPS_SYS(sys_readv , 3) /* 4145 */
1917 MIPS_SYS(sys_writev , 3)
1918 MIPS_SYS(sys_cacheflush , 3)
1919 MIPS_SYS(sys_cachectl , 3)
1920 MIPS_SYS(sys_sysmips , 4)
1921 MIPS_SYS(sys_ni_syscall , 0) /* 4150 */
1922 MIPS_SYS(sys_getsid , 1)
1923 MIPS_SYS(sys_fdatasync , 0)
1924 MIPS_SYS(sys_sysctl , 1)
1925 MIPS_SYS(sys_mlock , 2)
1926 MIPS_SYS(sys_munlock , 2) /* 4155 */
1927 MIPS_SYS(sys_mlockall , 1)
1928 MIPS_SYS(sys_munlockall , 0)
1929 MIPS_SYS(sys_sched_setparam, 2)
1930 MIPS_SYS(sys_sched_getparam, 2)
1931 MIPS_SYS(sys_sched_setscheduler, 3) /* 4160 */
1932 MIPS_SYS(sys_sched_getscheduler, 1)
1933 MIPS_SYS(sys_sched_yield , 0)
1934 MIPS_SYS(sys_sched_get_priority_max, 1)
1935 MIPS_SYS(sys_sched_get_priority_min, 1)
1936 MIPS_SYS(sys_sched_rr_get_interval, 2) /* 4165 */
1937 MIPS_SYS(sys_nanosleep, 2)
1938 MIPS_SYS(sys_mremap , 5)
1939 MIPS_SYS(sys_accept , 3)
1940 MIPS_SYS(sys_bind , 3)
1941 MIPS_SYS(sys_connect , 3) /* 4170 */
1942 MIPS_SYS(sys_getpeername , 3)
1943 MIPS_SYS(sys_getsockname , 3)
1944 MIPS_SYS(sys_getsockopt , 5)
1945 MIPS_SYS(sys_listen , 2)
1946 MIPS_SYS(sys_recv , 4) /* 4175 */
1947 MIPS_SYS(sys_recvfrom , 6)
1948 MIPS_SYS(sys_recvmsg , 3)
1949 MIPS_SYS(sys_send , 4)
1950 MIPS_SYS(sys_sendmsg , 3)
1951 MIPS_SYS(sys_sendto , 6) /* 4180 */
1952 MIPS_SYS(sys_setsockopt , 5)
1953 MIPS_SYS(sys_shutdown , 2)
1954 MIPS_SYS(sys_socket , 3)
1955 MIPS_SYS(sys_socketpair , 4)
1956 MIPS_SYS(sys_setresuid , 3) /* 4185 */
1957 MIPS_SYS(sys_getresuid , 3)
1958 MIPS_SYS(sys_ni_syscall , 0) /* was sys_query_module */
1959 MIPS_SYS(sys_poll , 3)
1960 MIPS_SYS(sys_nfsservctl , 3)
1961 MIPS_SYS(sys_setresgid , 3) /* 4190 */
1962 MIPS_SYS(sys_getresgid , 3)
1963 MIPS_SYS(sys_prctl , 5)
1964 MIPS_SYS(sys_rt_sigreturn, 0)
1965 MIPS_SYS(sys_rt_sigaction, 4)
1966 MIPS_SYS(sys_rt_sigprocmask, 4) /* 4195 */
1967 MIPS_SYS(sys_rt_sigpending, 2)
1968 MIPS_SYS(sys_rt_sigtimedwait, 4)
1969 MIPS_SYS(sys_rt_sigqueueinfo, 3)
1970 MIPS_SYS(sys_rt_sigsuspend, 0)
1971 MIPS_SYS(sys_pread64 , 6) /* 4200 */
1972 MIPS_SYS(sys_pwrite64 , 6)
1973 MIPS_SYS(sys_chown , 3)
1974 MIPS_SYS(sys_getcwd , 2)
1975 MIPS_SYS(sys_capget , 2)
1976 MIPS_SYS(sys_capset , 2) /* 4205 */
1977 MIPS_SYS(sys_sigaltstack , 2)
1978 MIPS_SYS(sys_sendfile , 4)
1979 MIPS_SYS(sys_ni_syscall , 0)
1980 MIPS_SYS(sys_ni_syscall , 0)
1981 MIPS_SYS(sys_mmap2 , 6) /* 4210 */
1982 MIPS_SYS(sys_truncate64 , 4)
1983 MIPS_SYS(sys_ftruncate64 , 4)
1984 MIPS_SYS(sys_stat64 , 2)
1985 MIPS_SYS(sys_lstat64 , 2)
1986 MIPS_SYS(sys_fstat64 , 2) /* 4215 */
1987 MIPS_SYS(sys_pivot_root , 2)
1988 MIPS_SYS(sys_mincore , 3)
1989 MIPS_SYS(sys_madvise , 3)
1990 MIPS_SYS(sys_getdents64 , 3)
1991 MIPS_SYS(sys_fcntl64 , 3) /* 4220 */
1992 MIPS_SYS(sys_ni_syscall , 0)
1993 MIPS_SYS(sys_gettid , 0)
1994 MIPS_SYS(sys_readahead , 5)
1995 MIPS_SYS(sys_setxattr , 5)
1996 MIPS_SYS(sys_lsetxattr , 5) /* 4225 */
1997 MIPS_SYS(sys_fsetxattr , 5)
1998 MIPS_SYS(sys_getxattr , 4)
1999 MIPS_SYS(sys_lgetxattr , 4)
2000 MIPS_SYS(sys_fgetxattr , 4)
2001 MIPS_SYS(sys_listxattr , 3) /* 4230 */
2002 MIPS_SYS(sys_llistxattr , 3)
2003 MIPS_SYS(sys_flistxattr , 3)
2004 MIPS_SYS(sys_removexattr , 2)
2005 MIPS_SYS(sys_lremovexattr, 2)
2006 MIPS_SYS(sys_fremovexattr, 2) /* 4235 */
2007 MIPS_SYS(sys_tkill , 2)
2008 MIPS_SYS(sys_sendfile64 , 5)
2009 MIPS_SYS(sys_futex , 6)
2010 MIPS_SYS(sys_sched_setaffinity, 3)
2011 MIPS_SYS(sys_sched_getaffinity, 3) /* 4240 */
2012 MIPS_SYS(sys_io_setup , 2)
2013 MIPS_SYS(sys_io_destroy , 1)
2014 MIPS_SYS(sys_io_getevents, 5)
2015 MIPS_SYS(sys_io_submit , 3)
2016 MIPS_SYS(sys_io_cancel , 3) /* 4245 */
2017 MIPS_SYS(sys_exit_group , 1)
2018 MIPS_SYS(sys_lookup_dcookie, 3)
2019 MIPS_SYS(sys_epoll_create, 1)
2020 MIPS_SYS(sys_epoll_ctl , 4)
2021 MIPS_SYS(sys_epoll_wait , 3) /* 4250 */
2022 MIPS_SYS(sys_remap_file_pages, 5)
2023 MIPS_SYS(sys_set_tid_address, 1)
2024 MIPS_SYS(sys_restart_syscall, 0)
2025 MIPS_SYS(sys_fadvise64_64, 7)
2026 MIPS_SYS(sys_statfs64 , 3) /* 4255 */
2027 MIPS_SYS(sys_fstatfs64 , 2)
2028 MIPS_SYS(sys_timer_create, 3)
2029 MIPS_SYS(sys_timer_settime, 4)
2030 MIPS_SYS(sys_timer_gettime, 2)
2031 MIPS_SYS(sys_timer_getoverrun, 1) /* 4260 */
2032 MIPS_SYS(sys_timer_delete, 1)
2033 MIPS_SYS(sys_clock_settime, 2)
2034 MIPS_SYS(sys_clock_gettime, 2)
2035 MIPS_SYS(sys_clock_getres, 2)
2036 MIPS_SYS(sys_clock_nanosleep, 4) /* 4265 */
2037 MIPS_SYS(sys_tgkill , 3)
2038 MIPS_SYS(sys_utimes , 2)
2039 MIPS_SYS(sys_mbind , 4)
2040 MIPS_SYS(sys_ni_syscall , 0) /* sys_get_mempolicy */
2041 MIPS_SYS(sys_ni_syscall , 0) /* 4270 sys_set_mempolicy */
2042 MIPS_SYS(sys_mq_open , 4)
2043 MIPS_SYS(sys_mq_unlink , 1)
2044 MIPS_SYS(sys_mq_timedsend, 5)
2045 MIPS_SYS(sys_mq_timedreceive, 5)
2046 MIPS_SYS(sys_mq_notify , 2) /* 4275 */
2047 MIPS_SYS(sys_mq_getsetattr, 3)
2048 MIPS_SYS(sys_ni_syscall , 0) /* sys_vserver */
2049 MIPS_SYS(sys_waitid , 4)
2050 MIPS_SYS(sys_ni_syscall , 0) /* available, was setaltroot */
2051 MIPS_SYS(sys_add_key , 5)
2052 MIPS_SYS(sys_request_key, 4)
2053 MIPS_SYS(sys_keyctl , 5)
2054 MIPS_SYS(sys_set_thread_area, 1)
2055 MIPS_SYS(sys_inotify_init, 0)
2056 MIPS_SYS(sys_inotify_add_watch, 3) /* 4285 */
2057 MIPS_SYS(sys_inotify_rm_watch, 2)
2058 MIPS_SYS(sys_migrate_pages, 4)
2059 MIPS_SYS(sys_openat, 4)
2060 MIPS_SYS(sys_mkdirat, 3)
2061 MIPS_SYS(sys_mknodat, 4) /* 4290 */
2062 MIPS_SYS(sys_fchownat, 5)
2063 MIPS_SYS(sys_futimesat, 3)
2064 MIPS_SYS(sys_fstatat64, 4)
2065 MIPS_SYS(sys_unlinkat, 3)
2066 MIPS_SYS(sys_renameat, 4) /* 4295 */
2067 MIPS_SYS(sys_linkat, 5)
2068 MIPS_SYS(sys_symlinkat, 3)
2069 MIPS_SYS(sys_readlinkat, 4)
2070 MIPS_SYS(sys_fchmodat, 3)
2071 MIPS_SYS(sys_faccessat, 3) /* 4300 */
2072 MIPS_SYS(sys_pselect6, 6)
2073 MIPS_SYS(sys_ppoll, 5)
2074 MIPS_SYS(sys_unshare, 1)
2075 MIPS_SYS(sys_splice, 6)
2076 MIPS_SYS(sys_sync_file_range, 7) /* 4305 */
2077 MIPS_SYS(sys_tee, 4)
2078 MIPS_SYS(sys_vmsplice, 4)
2079 MIPS_SYS(sys_move_pages, 6)
2080 MIPS_SYS(sys_set_robust_list, 2)
2081 MIPS_SYS(sys_get_robust_list, 3) /* 4310 */
2082 MIPS_SYS(sys_kexec_load, 4)
2083 MIPS_SYS(sys_getcpu, 3)
2084 MIPS_SYS(sys_epoll_pwait, 6)
2085 MIPS_SYS(sys_ioprio_set, 3)
2086 MIPS_SYS(sys_ioprio_get, 2)
2087 MIPS_SYS(sys_utimensat, 4)
2088 MIPS_SYS(sys_signalfd, 3)
2089 MIPS_SYS(sys_ni_syscall, 0) /* was timerfd */
2090 MIPS_SYS(sys_eventfd, 1)
2091 MIPS_SYS(sys_fallocate, 6) /* 4320 */
2092 MIPS_SYS(sys_timerfd_create, 2)
2093 MIPS_SYS(sys_timerfd_gettime, 2)
2094 MIPS_SYS(sys_timerfd_settime, 4)
2095 MIPS_SYS(sys_signalfd4, 4)
2096 MIPS_SYS(sys_eventfd2, 2) /* 4325 */
2097 MIPS_SYS(sys_epoll_create1, 1)
2098 MIPS_SYS(sys_dup3, 3)
2099 MIPS_SYS(sys_pipe2, 2)
2100 MIPS_SYS(sys_inotify_init1, 1)
2101 MIPS_SYS(sys_preadv, 5) /* 4330 */
2102 MIPS_SYS(sys_pwritev, 5)
2103 MIPS_SYS(sys_rt_tgsigqueueinfo, 4)
2104 MIPS_SYS(sys_perf_event_open, 5)
2105 MIPS_SYS(sys_accept4, 4)
2106 MIPS_SYS(sys_recvmmsg, 5) /* 4335 */
2107 MIPS_SYS(sys_fanotify_init, 2)
2108 MIPS_SYS(sys_fanotify_mark, 6)
2109 MIPS_SYS(sys_prlimit64, 4)
2110 MIPS_SYS(sys_name_to_handle_at, 5)
2111 MIPS_SYS(sys_open_by_handle_at, 3) /* 4340 */
2112 MIPS_SYS(sys_clock_adjtime, 2)
2113 MIPS_SYS(sys_syncfs, 1)
2114 MIPS_SYS(sys_sendmmsg, 4)
2115 MIPS_SYS(sys_setns, 2)
2116 MIPS_SYS(sys_process_vm_readv, 6) /* 345 */
2117 MIPS_SYS(sys_process_vm_writev, 6)
2118 MIPS_SYS(sys_kcmp, 5)
2119 MIPS_SYS(sys_finit_module, 3)
2120 MIPS_SYS(sys_sched_setattr, 2)
2121 MIPS_SYS(sys_sched_getattr, 3) /* 350 */
2122 MIPS_SYS(sys_renameat2, 5)
2123 MIPS_SYS(sys_seccomp, 3)
2124 MIPS_SYS(sys_getrandom, 3)
2125 MIPS_SYS(sys_memfd_create, 2)
2126 MIPS_SYS(sys_bpf, 3) /* 355 */
2127 MIPS_SYS(sys_execveat, 5)
2128 MIPS_SYS(sys_userfaultfd, 1)
2129 MIPS_SYS(sys_membarrier, 2)
2130 MIPS_SYS(sys_mlock2, 3)
2131 MIPS_SYS(sys_copy_file_range, 6) /* 360 */
2132 MIPS_SYS(sys_preadv2, 6)
2133 MIPS_SYS(sys_pwritev2, 6)
2135 # undef MIPS_SYS
2136 # endif /* O32 */
2138 static int do_store_exclusive(CPUMIPSState *env)
2140 target_ulong addr;
2141 target_ulong page_addr;
2142 target_ulong val;
2143 int flags;
2144 int segv = 0;
2145 int reg;
2146 int d;
2148 addr = env->lladdr;
2149 page_addr = addr & TARGET_PAGE_MASK;
2150 start_exclusive();
2151 mmap_lock();
2152 flags = page_get_flags(page_addr);
2153 if ((flags & PAGE_READ) == 0) {
2154 segv = 1;
2155 } else {
2156 reg = env->llreg & 0x1f;
2157 d = (env->llreg & 0x20) != 0;
2158 if (d) {
2159 segv = get_user_s64(val, addr);
2160 } else {
2161 segv = get_user_s32(val, addr);
2163 if (!segv) {
2164 if (val != env->llval) {
2165 env->active_tc.gpr[reg] = 0;
2166 } else {
2167 if (d) {
2168 segv = put_user_u64(env->llnewval, addr);
2169 } else {
2170 segv = put_user_u32(env->llnewval, addr);
2172 if (!segv) {
2173 env->active_tc.gpr[reg] = 1;
2178 env->lladdr = -1;
2179 if (!segv) {
2180 env->active_tc.PC += 4;
2182 mmap_unlock();
2183 end_exclusive();
2184 return segv;
2187 /* Break codes */
2188 enum {
2189 BRK_OVERFLOW = 6,
2190 BRK_DIVZERO = 7
2193 static int do_break(CPUMIPSState *env, target_siginfo_t *info,
2194 unsigned int code)
2196 int ret = -1;
2198 switch (code) {
2199 case BRK_OVERFLOW:
2200 case BRK_DIVZERO:
2201 info->si_signo = TARGET_SIGFPE;
2202 info->si_errno = 0;
2203 info->si_code = (code == BRK_OVERFLOW) ? FPE_INTOVF : FPE_INTDIV;
2204 queue_signal(env, info->si_signo, QEMU_SI_FAULT, &*info);
2205 ret = 0;
2206 break;
2207 default:
2208 info->si_signo = TARGET_SIGTRAP;
2209 info->si_errno = 0;
2210 queue_signal(env, info->si_signo, QEMU_SI_FAULT, &*info);
2211 ret = 0;
2212 break;
2215 return ret;
2218 void cpu_loop(CPUMIPSState *env)
2220 CPUState *cs = CPU(mips_env_get_cpu(env));
2221 target_siginfo_t info;
2222 int trapnr;
2223 abi_long ret;
2224 # ifdef TARGET_ABI_MIPSO32
2225 unsigned int syscall_num;
2226 # endif
2228 for(;;) {
2229 cpu_exec_start(cs);
2230 trapnr = cpu_exec(cs);
2231 cpu_exec_end(cs);
2232 process_queued_cpu_work(cs);
2234 switch(trapnr) {
2235 case EXCP_SYSCALL:
2236 env->active_tc.PC += 4;
2237 # ifdef TARGET_ABI_MIPSO32
2238 syscall_num = env->active_tc.gpr[2] - 4000;
2239 if (syscall_num >= sizeof(mips_syscall_args)) {
2240 ret = -TARGET_ENOSYS;
2241 } else {
2242 int nb_args;
2243 abi_ulong sp_reg;
2244 abi_ulong arg5 = 0, arg6 = 0, arg7 = 0, arg8 = 0;
2246 nb_args = mips_syscall_args[syscall_num];
2247 sp_reg = env->active_tc.gpr[29];
2248 switch (nb_args) {
2249 /* these arguments are taken from the stack */
2250 case 8:
2251 if ((ret = get_user_ual(arg8, sp_reg + 28)) != 0) {
2252 goto done_syscall;
2254 case 7:
2255 if ((ret = get_user_ual(arg7, sp_reg + 24)) != 0) {
2256 goto done_syscall;
2258 case 6:
2259 if ((ret = get_user_ual(arg6, sp_reg + 20)) != 0) {
2260 goto done_syscall;
2262 case 5:
2263 if ((ret = get_user_ual(arg5, sp_reg + 16)) != 0) {
2264 goto done_syscall;
2266 default:
2267 break;
2269 ret = do_syscall(env, env->active_tc.gpr[2],
2270 env->active_tc.gpr[4],
2271 env->active_tc.gpr[5],
2272 env->active_tc.gpr[6],
2273 env->active_tc.gpr[7],
2274 arg5, arg6, arg7, arg8);
2276 done_syscall:
2277 # else
2278 ret = do_syscall(env, env->active_tc.gpr[2],
2279 env->active_tc.gpr[4], env->active_tc.gpr[5],
2280 env->active_tc.gpr[6], env->active_tc.gpr[7],
2281 env->active_tc.gpr[8], env->active_tc.gpr[9],
2282 env->active_tc.gpr[10], env->active_tc.gpr[11]);
2283 # endif /* O32 */
2284 if (ret == -TARGET_ERESTARTSYS) {
2285 env->active_tc.PC -= 4;
2286 break;
2288 if (ret == -TARGET_QEMU_ESIGRETURN) {
2289 /* Returning from a successful sigreturn syscall.
2290 Avoid clobbering register state. */
2291 break;
2293 if ((abi_ulong)ret >= (abi_ulong)-1133) {
2294 env->active_tc.gpr[7] = 1; /* error flag */
2295 ret = -ret;
2296 } else {
2297 env->active_tc.gpr[7] = 0; /* error flag */
2299 env->active_tc.gpr[2] = ret;
2300 break;
2301 case EXCP_TLBL:
2302 case EXCP_TLBS:
2303 case EXCP_AdEL:
2304 case EXCP_AdES:
2305 info.si_signo = TARGET_SIGSEGV;
2306 info.si_errno = 0;
2307 /* XXX: check env->error_code */
2308 info.si_code = TARGET_SEGV_MAPERR;
2309 info._sifields._sigfault._addr = env->CP0_BadVAddr;
2310 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
2311 break;
2312 case EXCP_CpU:
2313 case EXCP_RI:
2314 info.si_signo = TARGET_SIGILL;
2315 info.si_errno = 0;
2316 info.si_code = 0;
2317 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
2318 break;
2319 case EXCP_INTERRUPT:
2320 /* just indicate that signals should be handled asap */
2321 break;
2322 case EXCP_DEBUG:
2324 int sig;
2326 sig = gdb_handlesig(cs, TARGET_SIGTRAP);
2327 if (sig)
2329 info.si_signo = sig;
2330 info.si_errno = 0;
2331 info.si_code = TARGET_TRAP_BRKPT;
2332 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
2335 break;
2336 case EXCP_SC:
2337 if (do_store_exclusive(env)) {
2338 info.si_signo = TARGET_SIGSEGV;
2339 info.si_errno = 0;
2340 info.si_code = TARGET_SEGV_MAPERR;
2341 info._sifields._sigfault._addr = env->active_tc.PC;
2342 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
2344 break;
2345 case EXCP_DSPDIS:
2346 info.si_signo = TARGET_SIGILL;
2347 info.si_errno = 0;
2348 info.si_code = TARGET_ILL_ILLOPC;
2349 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
2350 break;
2351 /* The code below was inspired by the MIPS Linux kernel trap
2352 * handling code in arch/mips/kernel/traps.c.
2354 case EXCP_BREAK:
2356 abi_ulong trap_instr;
2357 unsigned int code;
2359 if (env->hflags & MIPS_HFLAG_M16) {
2360 if (env->insn_flags & ASE_MICROMIPS) {
2361 /* microMIPS mode */
2362 ret = get_user_u16(trap_instr, env->active_tc.PC);
2363 if (ret != 0) {
2364 goto error;
2367 if ((trap_instr >> 10) == 0x11) {
2368 /* 16-bit instruction */
2369 code = trap_instr & 0xf;
2370 } else {
2371 /* 32-bit instruction */
2372 abi_ulong instr_lo;
2374 ret = get_user_u16(instr_lo,
2375 env->active_tc.PC + 2);
2376 if (ret != 0) {
2377 goto error;
2379 trap_instr = (trap_instr << 16) | instr_lo;
2380 code = ((trap_instr >> 6) & ((1 << 20) - 1));
2381 /* Unfortunately, microMIPS also suffers from
2382 the old assembler bug... */
2383 if (code >= (1 << 10)) {
2384 code >>= 10;
2387 } else {
2388 /* MIPS16e mode */
2389 ret = get_user_u16(trap_instr, env->active_tc.PC);
2390 if (ret != 0) {
2391 goto error;
2393 code = (trap_instr >> 6) & 0x3f;
2395 } else {
2396 ret = get_user_u32(trap_instr, env->active_tc.PC);
2397 if (ret != 0) {
2398 goto error;
2401 /* As described in the original Linux kernel code, the
2402 * below checks on 'code' are to work around an old
2403 * assembly bug.
2405 code = ((trap_instr >> 6) & ((1 << 20) - 1));
2406 if (code >= (1 << 10)) {
2407 code >>= 10;
2411 if (do_break(env, &info, code) != 0) {
2412 goto error;
2415 break;
2416 case EXCP_TRAP:
2418 abi_ulong trap_instr;
2419 unsigned int code = 0;
2421 if (env->hflags & MIPS_HFLAG_M16) {
2422 /* microMIPS mode */
2423 abi_ulong instr[2];
2425 ret = get_user_u16(instr[0], env->active_tc.PC) ||
2426 get_user_u16(instr[1], env->active_tc.PC + 2);
2428 trap_instr = (instr[0] << 16) | instr[1];
2429 } else {
2430 ret = get_user_u32(trap_instr, env->active_tc.PC);
2433 if (ret != 0) {
2434 goto error;
2437 /* The immediate versions don't provide a code. */
2438 if (!(trap_instr & 0xFC000000)) {
2439 if (env->hflags & MIPS_HFLAG_M16) {
2440 /* microMIPS mode */
2441 code = ((trap_instr >> 12) & ((1 << 4) - 1));
2442 } else {
2443 code = ((trap_instr >> 6) & ((1 << 10) - 1));
2447 if (do_break(env, &info, code) != 0) {
2448 goto error;
2451 break;
2452 case EXCP_ATOMIC:
2453 cpu_exec_step_atomic(cs);
2454 break;
2455 default:
2456 error:
2457 EXCP_DUMP(env, "qemu: unhandled CPU exception 0x%x - aborting\n", trapnr);
2458 abort();
2460 process_pending_signals(env);
2463 #endif
2465 #ifdef TARGET_OPENRISC
2467 void cpu_loop(CPUOpenRISCState *env)
2469 CPUState *cs = CPU(openrisc_env_get_cpu(env));
2470 int trapnr, gdbsig;
2471 abi_long ret;
2473 for (;;) {
2474 cpu_exec_start(cs);
2475 trapnr = cpu_exec(cs);
2476 cpu_exec_end(cs);
2477 process_queued_cpu_work(cs);
2478 gdbsig = 0;
2480 switch (trapnr) {
2481 case EXCP_RESET:
2482 qemu_log_mask(CPU_LOG_INT, "\nReset request, exit, pc is %#x\n", env->pc);
2483 exit(EXIT_FAILURE);
2484 break;
2485 case EXCP_BUSERR:
2486 qemu_log_mask(CPU_LOG_INT, "\nBus error, exit, pc is %#x\n", env->pc);
2487 gdbsig = TARGET_SIGBUS;
2488 break;
2489 case EXCP_DPF:
2490 case EXCP_IPF:
2491 cpu_dump_state(cs, stderr, fprintf, 0);
2492 gdbsig = TARGET_SIGSEGV;
2493 break;
2494 case EXCP_TICK:
2495 qemu_log_mask(CPU_LOG_INT, "\nTick time interrupt pc is %#x\n", env->pc);
2496 break;
2497 case EXCP_ALIGN:
2498 qemu_log_mask(CPU_LOG_INT, "\nAlignment pc is %#x\n", env->pc);
2499 gdbsig = TARGET_SIGBUS;
2500 break;
2501 case EXCP_ILLEGAL:
2502 qemu_log_mask(CPU_LOG_INT, "\nIllegal instructionpc is %#x\n", env->pc);
2503 gdbsig = TARGET_SIGILL;
2504 break;
2505 case EXCP_INT:
2506 qemu_log_mask(CPU_LOG_INT, "\nExternal interruptpc is %#x\n", env->pc);
2507 break;
2508 case EXCP_DTLBMISS:
2509 case EXCP_ITLBMISS:
2510 qemu_log_mask(CPU_LOG_INT, "\nTLB miss\n");
2511 break;
2512 case EXCP_RANGE:
2513 qemu_log_mask(CPU_LOG_INT, "\nRange\n");
2514 gdbsig = TARGET_SIGSEGV;
2515 break;
2516 case EXCP_SYSCALL:
2517 env->pc += 4; /* 0xc00; */
2518 ret = do_syscall(env,
2519 env->gpr[11], /* return value */
2520 env->gpr[3], /* r3 - r7 are params */
2521 env->gpr[4],
2522 env->gpr[5],
2523 env->gpr[6],
2524 env->gpr[7],
2525 env->gpr[8], 0, 0);
2526 if (ret == -TARGET_ERESTARTSYS) {
2527 env->pc -= 4;
2528 } else if (ret != -TARGET_QEMU_ESIGRETURN) {
2529 env->gpr[11] = ret;
2531 break;
2532 case EXCP_FPE:
2533 qemu_log_mask(CPU_LOG_INT, "\nFloating point error\n");
2534 break;
2535 case EXCP_TRAP:
2536 qemu_log_mask(CPU_LOG_INT, "\nTrap\n");
2537 gdbsig = TARGET_SIGTRAP;
2538 break;
2539 case EXCP_NR:
2540 qemu_log_mask(CPU_LOG_INT, "\nNR\n");
2541 break;
2542 case EXCP_ATOMIC:
2543 cpu_exec_step_atomic(cs);
2544 break;
2545 default:
2546 EXCP_DUMP(env, "\nqemu: unhandled CPU exception %#x - aborting\n",
2547 trapnr);
2548 gdbsig = TARGET_SIGILL;
2549 break;
2551 if (gdbsig) {
2552 gdb_handlesig(cs, gdbsig);
2553 if (gdbsig != TARGET_SIGTRAP) {
2554 exit(EXIT_FAILURE);
2558 process_pending_signals(env);
2562 #endif /* TARGET_OPENRISC */
2564 #ifdef TARGET_SH4
2565 void cpu_loop(CPUSH4State *env)
2567 CPUState *cs = CPU(sh_env_get_cpu(env));
2568 int trapnr, ret;
2569 target_siginfo_t info;
2571 while (1) {
2572 cpu_exec_start(cs);
2573 trapnr = cpu_exec(cs);
2574 cpu_exec_end(cs);
2575 process_queued_cpu_work(cs);
2577 switch (trapnr) {
2578 case 0x160:
2579 env->pc += 2;
2580 ret = do_syscall(env,
2581 env->gregs[3],
2582 env->gregs[4],
2583 env->gregs[5],
2584 env->gregs[6],
2585 env->gregs[7],
2586 env->gregs[0],
2587 env->gregs[1],
2588 0, 0);
2589 if (ret == -TARGET_ERESTARTSYS) {
2590 env->pc -= 2;
2591 } else if (ret != -TARGET_QEMU_ESIGRETURN) {
2592 env->gregs[0] = ret;
2594 break;
2595 case EXCP_INTERRUPT:
2596 /* just indicate that signals should be handled asap */
2597 break;
2598 case EXCP_DEBUG:
2600 int sig;
2602 sig = gdb_handlesig(cs, TARGET_SIGTRAP);
2603 if (sig)
2605 info.si_signo = sig;
2606 info.si_errno = 0;
2607 info.si_code = TARGET_TRAP_BRKPT;
2608 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
2611 break;
2612 case 0xa0:
2613 case 0xc0:
2614 info.si_signo = TARGET_SIGSEGV;
2615 info.si_errno = 0;
2616 info.si_code = TARGET_SEGV_MAPERR;
2617 info._sifields._sigfault._addr = env->tea;
2618 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
2619 break;
2621 case EXCP_ATOMIC:
2622 cpu_exec_step_atomic(cs);
2623 break;
2624 default:
2625 printf ("Unhandled trap: 0x%x\n", trapnr);
2626 cpu_dump_state(cs, stderr, fprintf, 0);
2627 exit(EXIT_FAILURE);
2629 process_pending_signals (env);
2632 #endif
2634 #ifdef TARGET_CRIS
2635 void cpu_loop(CPUCRISState *env)
2637 CPUState *cs = CPU(cris_env_get_cpu(env));
2638 int trapnr, ret;
2639 target_siginfo_t info;
2641 while (1) {
2642 cpu_exec_start(cs);
2643 trapnr = cpu_exec(cs);
2644 cpu_exec_end(cs);
2645 process_queued_cpu_work(cs);
2647 switch (trapnr) {
2648 case 0xaa:
2650 info.si_signo = TARGET_SIGSEGV;
2651 info.si_errno = 0;
2652 /* XXX: check env->error_code */
2653 info.si_code = TARGET_SEGV_MAPERR;
2654 info._sifields._sigfault._addr = env->pregs[PR_EDA];
2655 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
2657 break;
2658 case EXCP_INTERRUPT:
2659 /* just indicate that signals should be handled asap */
2660 break;
2661 case EXCP_BREAK:
2662 ret = do_syscall(env,
2663 env->regs[9],
2664 env->regs[10],
2665 env->regs[11],
2666 env->regs[12],
2667 env->regs[13],
2668 env->pregs[7],
2669 env->pregs[11],
2670 0, 0);
2671 if (ret == -TARGET_ERESTARTSYS) {
2672 env->pc -= 2;
2673 } else if (ret != -TARGET_QEMU_ESIGRETURN) {
2674 env->regs[10] = ret;
2676 break;
2677 case EXCP_DEBUG:
2679 int sig;
2681 sig = gdb_handlesig(cs, TARGET_SIGTRAP);
2682 if (sig)
2684 info.si_signo = sig;
2685 info.si_errno = 0;
2686 info.si_code = TARGET_TRAP_BRKPT;
2687 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
2690 break;
2691 case EXCP_ATOMIC:
2692 cpu_exec_step_atomic(cs);
2693 break;
2694 default:
2695 printf ("Unhandled trap: 0x%x\n", trapnr);
2696 cpu_dump_state(cs, stderr, fprintf, 0);
2697 exit(EXIT_FAILURE);
2699 process_pending_signals (env);
2702 #endif
2704 #ifdef TARGET_MICROBLAZE
2705 void cpu_loop(CPUMBState *env)
2707 CPUState *cs = CPU(mb_env_get_cpu(env));
2708 int trapnr, ret;
2709 target_siginfo_t info;
2711 while (1) {
2712 cpu_exec_start(cs);
2713 trapnr = cpu_exec(cs);
2714 cpu_exec_end(cs);
2715 process_queued_cpu_work(cs);
2717 switch (trapnr) {
2718 case 0xaa:
2720 info.si_signo = TARGET_SIGSEGV;
2721 info.si_errno = 0;
2722 /* XXX: check env->error_code */
2723 info.si_code = TARGET_SEGV_MAPERR;
2724 info._sifields._sigfault._addr = 0;
2725 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
2727 break;
2728 case EXCP_INTERRUPT:
2729 /* just indicate that signals should be handled asap */
2730 break;
2731 case EXCP_BREAK:
2732 /* Return address is 4 bytes after the call. */
2733 env->regs[14] += 4;
2734 env->sregs[SR_PC] = env->regs[14];
2735 ret = do_syscall(env,
2736 env->regs[12],
2737 env->regs[5],
2738 env->regs[6],
2739 env->regs[7],
2740 env->regs[8],
2741 env->regs[9],
2742 env->regs[10],
2743 0, 0);
2744 if (ret == -TARGET_ERESTARTSYS) {
2745 /* Wind back to before the syscall. */
2746 env->sregs[SR_PC] -= 4;
2747 } else if (ret != -TARGET_QEMU_ESIGRETURN) {
2748 env->regs[3] = ret;
2750 /* All syscall exits result in guest r14 being equal to the
2751 * PC we return to, because the kernel syscall exit "rtbd" does
2752 * this. (This is true even for sigreturn(); note that r14 is
2753 * not a userspace-usable register, as the kernel may clobber it
2754 * at any point.)
2756 env->regs[14] = env->sregs[SR_PC];
2757 break;
2758 case EXCP_HW_EXCP:
2759 env->regs[17] = env->sregs[SR_PC] + 4;
2760 if (env->iflags & D_FLAG) {
2761 env->sregs[SR_ESR] |= 1 << 12;
2762 env->sregs[SR_PC] -= 4;
2763 /* FIXME: if branch was immed, replay the imm as well. */
2766 env->iflags &= ~(IMM_FLAG | D_FLAG);
2768 switch (env->sregs[SR_ESR] & 31) {
2769 case ESR_EC_DIVZERO:
2770 info.si_signo = TARGET_SIGFPE;
2771 info.si_errno = 0;
2772 info.si_code = TARGET_FPE_FLTDIV;
2773 info._sifields._sigfault._addr = 0;
2774 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
2775 break;
2776 case ESR_EC_FPU:
2777 info.si_signo = TARGET_SIGFPE;
2778 info.si_errno = 0;
2779 if (env->sregs[SR_FSR] & FSR_IO) {
2780 info.si_code = TARGET_FPE_FLTINV;
2782 if (env->sregs[SR_FSR] & FSR_DZ) {
2783 info.si_code = TARGET_FPE_FLTDIV;
2785 info._sifields._sigfault._addr = 0;
2786 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
2787 break;
2788 default:
2789 printf ("Unhandled hw-exception: 0x%x\n",
2790 env->sregs[SR_ESR] & ESR_EC_MASK);
2791 cpu_dump_state(cs, stderr, fprintf, 0);
2792 exit(EXIT_FAILURE);
2793 break;
2795 break;
2796 case EXCP_DEBUG:
2798 int sig;
2800 sig = gdb_handlesig(cs, TARGET_SIGTRAP);
2801 if (sig)
2803 info.si_signo = sig;
2804 info.si_errno = 0;
2805 info.si_code = TARGET_TRAP_BRKPT;
2806 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
2809 break;
2810 case EXCP_ATOMIC:
2811 cpu_exec_step_atomic(cs);
2812 break;
2813 default:
2814 printf ("Unhandled trap: 0x%x\n", trapnr);
2815 cpu_dump_state(cs, stderr, fprintf, 0);
2816 exit(EXIT_FAILURE);
2818 process_pending_signals (env);
2821 #endif
2823 #ifdef TARGET_M68K
2825 void cpu_loop(CPUM68KState *env)
2827 CPUState *cs = CPU(m68k_env_get_cpu(env));
2828 int trapnr;
2829 unsigned int n;
2830 target_siginfo_t info;
2831 TaskState *ts = cs->opaque;
2833 for(;;) {
2834 cpu_exec_start(cs);
2835 trapnr = cpu_exec(cs);
2836 cpu_exec_end(cs);
2837 process_queued_cpu_work(cs);
2839 switch(trapnr) {
2840 case EXCP_ILLEGAL:
2842 if (ts->sim_syscalls) {
2843 uint16_t nr;
2844 get_user_u16(nr, env->pc + 2);
2845 env->pc += 4;
2846 do_m68k_simcall(env, nr);
2847 } else {
2848 goto do_sigill;
2851 break;
2852 case EXCP_HALT_INSN:
2853 /* Semihosing syscall. */
2854 env->pc += 4;
2855 do_m68k_semihosting(env, env->dregs[0]);
2856 break;
2857 case EXCP_LINEA:
2858 case EXCP_LINEF:
2859 case EXCP_UNSUPPORTED:
2860 do_sigill:
2861 info.si_signo = TARGET_SIGILL;
2862 info.si_errno = 0;
2863 info.si_code = TARGET_ILL_ILLOPN;
2864 info._sifields._sigfault._addr = env->pc;
2865 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
2866 break;
2867 case EXCP_DIV0:
2868 info.si_signo = TARGET_SIGFPE;
2869 info.si_errno = 0;
2870 info.si_code = TARGET_FPE_INTDIV;
2871 info._sifields._sigfault._addr = env->pc;
2872 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
2873 break;
2874 case EXCP_TRAP0:
2876 abi_long ret;
2877 ts->sim_syscalls = 0;
2878 n = env->dregs[0];
2879 env->pc += 2;
2880 ret = do_syscall(env,
2882 env->dregs[1],
2883 env->dregs[2],
2884 env->dregs[3],
2885 env->dregs[4],
2886 env->dregs[5],
2887 env->aregs[0],
2888 0, 0);
2889 if (ret == -TARGET_ERESTARTSYS) {
2890 env->pc -= 2;
2891 } else if (ret != -TARGET_QEMU_ESIGRETURN) {
2892 env->dregs[0] = ret;
2895 break;
2896 case EXCP_INTERRUPT:
2897 /* just indicate that signals should be handled asap */
2898 break;
2899 case EXCP_ACCESS:
2901 info.si_signo = TARGET_SIGSEGV;
2902 info.si_errno = 0;
2903 /* XXX: check env->error_code */
2904 info.si_code = TARGET_SEGV_MAPERR;
2905 info._sifields._sigfault._addr = env->mmu.ar;
2906 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
2908 break;
2909 case EXCP_DEBUG:
2911 int sig;
2913 sig = gdb_handlesig(cs, TARGET_SIGTRAP);
2914 if (sig)
2916 info.si_signo = sig;
2917 info.si_errno = 0;
2918 info.si_code = TARGET_TRAP_BRKPT;
2919 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
2922 break;
2923 case EXCP_ATOMIC:
2924 cpu_exec_step_atomic(cs);
2925 break;
2926 default:
2927 EXCP_DUMP(env, "qemu: unhandled CPU exception 0x%x - aborting\n", trapnr);
2928 abort();
2930 process_pending_signals(env);
2933 #endif /* TARGET_M68K */
2935 #ifdef TARGET_ALPHA
2936 void cpu_loop(CPUAlphaState *env)
2938 CPUState *cs = CPU(alpha_env_get_cpu(env));
2939 int trapnr;
2940 target_siginfo_t info;
2941 abi_long sysret;
2943 while (1) {
2944 cpu_exec_start(cs);
2945 trapnr = cpu_exec(cs);
2946 cpu_exec_end(cs);
2947 process_queued_cpu_work(cs);
2949 /* All of the traps imply a transition through PALcode, which
2950 implies an REI instruction has been executed. Which means
2951 that the intr_flag should be cleared. */
2952 env->intr_flag = 0;
2954 switch (trapnr) {
2955 case EXCP_RESET:
2956 fprintf(stderr, "Reset requested. Exit\n");
2957 exit(EXIT_FAILURE);
2958 break;
2959 case EXCP_MCHK:
2960 fprintf(stderr, "Machine check exception. Exit\n");
2961 exit(EXIT_FAILURE);
2962 break;
2963 case EXCP_SMP_INTERRUPT:
2964 case EXCP_CLK_INTERRUPT:
2965 case EXCP_DEV_INTERRUPT:
2966 fprintf(stderr, "External interrupt. Exit\n");
2967 exit(EXIT_FAILURE);
2968 break;
2969 case EXCP_MMFAULT:
2970 env->lock_addr = -1;
2971 info.si_signo = TARGET_SIGSEGV;
2972 info.si_errno = 0;
2973 info.si_code = (page_get_flags(env->trap_arg0) & PAGE_VALID
2974 ? TARGET_SEGV_ACCERR : TARGET_SEGV_MAPERR);
2975 info._sifields._sigfault._addr = env->trap_arg0;
2976 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
2977 break;
2978 case EXCP_UNALIGN:
2979 env->lock_addr = -1;
2980 info.si_signo = TARGET_SIGBUS;
2981 info.si_errno = 0;
2982 info.si_code = TARGET_BUS_ADRALN;
2983 info._sifields._sigfault._addr = env->trap_arg0;
2984 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
2985 break;
2986 case EXCP_OPCDEC:
2987 do_sigill:
2988 env->lock_addr = -1;
2989 info.si_signo = TARGET_SIGILL;
2990 info.si_errno = 0;
2991 info.si_code = TARGET_ILL_ILLOPC;
2992 info._sifields._sigfault._addr = env->pc;
2993 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
2994 break;
2995 case EXCP_ARITH:
2996 env->lock_addr = -1;
2997 info.si_signo = TARGET_SIGFPE;
2998 info.si_errno = 0;
2999 info.si_code = TARGET_FPE_FLTINV;
3000 info._sifields._sigfault._addr = env->pc;
3001 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
3002 break;
3003 case EXCP_FEN:
3004 /* No-op. Linux simply re-enables the FPU. */
3005 break;
3006 case EXCP_CALL_PAL:
3007 env->lock_addr = -1;
3008 switch (env->error_code) {
3009 case 0x80:
3010 /* BPT */
3011 info.si_signo = TARGET_SIGTRAP;
3012 info.si_errno = 0;
3013 info.si_code = TARGET_TRAP_BRKPT;
3014 info._sifields._sigfault._addr = env->pc;
3015 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
3016 break;
3017 case 0x81:
3018 /* BUGCHK */
3019 info.si_signo = TARGET_SIGTRAP;
3020 info.si_errno = 0;
3021 info.si_code = 0;
3022 info._sifields._sigfault._addr = env->pc;
3023 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
3024 break;
3025 case 0x83:
3026 /* CALLSYS */
3027 trapnr = env->ir[IR_V0];
3028 sysret = do_syscall(env, trapnr,
3029 env->ir[IR_A0], env->ir[IR_A1],
3030 env->ir[IR_A2], env->ir[IR_A3],
3031 env->ir[IR_A4], env->ir[IR_A5],
3032 0, 0);
3033 if (sysret == -TARGET_ERESTARTSYS) {
3034 env->pc -= 4;
3035 break;
3037 if (sysret == -TARGET_QEMU_ESIGRETURN) {
3038 break;
3040 /* Syscall writes 0 to V0 to bypass error check, similar
3041 to how this is handled internal to Linux kernel.
3042 (Ab)use trapnr temporarily as boolean indicating error. */
3043 trapnr = (env->ir[IR_V0] != 0 && sysret < 0);
3044 env->ir[IR_V0] = (trapnr ? -sysret : sysret);
3045 env->ir[IR_A3] = trapnr;
3046 break;
3047 case 0x86:
3048 /* IMB */
3049 /* ??? We can probably elide the code using page_unprotect
3050 that is checking for self-modifying code. Instead we
3051 could simply call tb_flush here. Until we work out the
3052 changes required to turn off the extra write protection,
3053 this can be a no-op. */
3054 break;
3055 case 0x9E:
3056 /* RDUNIQUE */
3057 /* Handled in the translator for usermode. */
3058 abort();
3059 case 0x9F:
3060 /* WRUNIQUE */
3061 /* Handled in the translator for usermode. */
3062 abort();
3063 case 0xAA:
3064 /* GENTRAP */
3065 info.si_signo = TARGET_SIGFPE;
3066 switch (env->ir[IR_A0]) {
3067 case TARGET_GEN_INTOVF:
3068 info.si_code = TARGET_FPE_INTOVF;
3069 break;
3070 case TARGET_GEN_INTDIV:
3071 info.si_code = TARGET_FPE_INTDIV;
3072 break;
3073 case TARGET_GEN_FLTOVF:
3074 info.si_code = TARGET_FPE_FLTOVF;
3075 break;
3076 case TARGET_GEN_FLTUND:
3077 info.si_code = TARGET_FPE_FLTUND;
3078 break;
3079 case TARGET_GEN_FLTINV:
3080 info.si_code = TARGET_FPE_FLTINV;
3081 break;
3082 case TARGET_GEN_FLTINE:
3083 info.si_code = TARGET_FPE_FLTRES;
3084 break;
3085 case TARGET_GEN_ROPRAND:
3086 info.si_code = 0;
3087 break;
3088 default:
3089 info.si_signo = TARGET_SIGTRAP;
3090 info.si_code = 0;
3091 break;
3093 info.si_errno = 0;
3094 info._sifields._sigfault._addr = env->pc;
3095 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
3096 break;
3097 default:
3098 goto do_sigill;
3100 break;
3101 case EXCP_DEBUG:
3102 info.si_signo = gdb_handlesig(cs, TARGET_SIGTRAP);
3103 if (info.si_signo) {
3104 env->lock_addr = -1;
3105 info.si_errno = 0;
3106 info.si_code = TARGET_TRAP_BRKPT;
3107 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
3109 break;
3110 case EXCP_INTERRUPT:
3111 /* Just indicate that signals should be handled asap. */
3112 break;
3113 case EXCP_ATOMIC:
3114 cpu_exec_step_atomic(cs);
3115 break;
3116 default:
3117 printf ("Unhandled trap: 0x%x\n", trapnr);
3118 cpu_dump_state(cs, stderr, fprintf, 0);
3119 exit(EXIT_FAILURE);
3121 process_pending_signals (env);
3124 #endif /* TARGET_ALPHA */
3126 #ifdef TARGET_S390X
3127 void cpu_loop(CPUS390XState *env)
3129 CPUState *cs = CPU(s390_env_get_cpu(env));
3130 int trapnr, n, sig;
3131 target_siginfo_t info;
3132 target_ulong addr;
3133 abi_long ret;
3135 while (1) {
3136 cpu_exec_start(cs);
3137 trapnr = cpu_exec(cs);
3138 cpu_exec_end(cs);
3139 process_queued_cpu_work(cs);
3141 switch (trapnr) {
3142 case EXCP_INTERRUPT:
3143 /* Just indicate that signals should be handled asap. */
3144 break;
3146 case EXCP_SVC:
3147 n = env->int_svc_code;
3148 if (!n) {
3149 /* syscalls > 255 */
3150 n = env->regs[1];
3152 env->psw.addr += env->int_svc_ilen;
3153 ret = do_syscall(env, n, env->regs[2], env->regs[3],
3154 env->regs[4], env->regs[5],
3155 env->regs[6], env->regs[7], 0, 0);
3156 if (ret == -TARGET_ERESTARTSYS) {
3157 env->psw.addr -= env->int_svc_ilen;
3158 } else if (ret != -TARGET_QEMU_ESIGRETURN) {
3159 env->regs[2] = ret;
3161 break;
3163 case EXCP_DEBUG:
3164 sig = gdb_handlesig(cs, TARGET_SIGTRAP);
3165 if (sig) {
3166 n = TARGET_TRAP_BRKPT;
3167 goto do_signal_pc;
3169 break;
3170 case EXCP_PGM:
3171 n = env->int_pgm_code;
3172 switch (n) {
3173 case PGM_OPERATION:
3174 case PGM_PRIVILEGED:
3175 sig = TARGET_SIGILL;
3176 n = TARGET_ILL_ILLOPC;
3177 goto do_signal_pc;
3178 case PGM_PROTECTION:
3179 case PGM_ADDRESSING:
3180 sig = TARGET_SIGSEGV;
3181 /* XXX: check env->error_code */
3182 n = TARGET_SEGV_MAPERR;
3183 addr = env->__excp_addr;
3184 goto do_signal;
3185 case PGM_EXECUTE:
3186 case PGM_SPECIFICATION:
3187 case PGM_SPECIAL_OP:
3188 case PGM_OPERAND:
3189 do_sigill_opn:
3190 sig = TARGET_SIGILL;
3191 n = TARGET_ILL_ILLOPN;
3192 goto do_signal_pc;
3194 case PGM_FIXPT_OVERFLOW:
3195 sig = TARGET_SIGFPE;
3196 n = TARGET_FPE_INTOVF;
3197 goto do_signal_pc;
3198 case PGM_FIXPT_DIVIDE:
3199 sig = TARGET_SIGFPE;
3200 n = TARGET_FPE_INTDIV;
3201 goto do_signal_pc;
3203 case PGM_DATA:
3204 n = (env->fpc >> 8) & 0xff;
3205 if (n == 0xff) {
3206 /* compare-and-trap */
3207 goto do_sigill_opn;
3208 } else {
3209 /* An IEEE exception, simulated or otherwise. */
3210 if (n & 0x80) {
3211 n = TARGET_FPE_FLTINV;
3212 } else if (n & 0x40) {
3213 n = TARGET_FPE_FLTDIV;
3214 } else if (n & 0x20) {
3215 n = TARGET_FPE_FLTOVF;
3216 } else if (n & 0x10) {
3217 n = TARGET_FPE_FLTUND;
3218 } else if (n & 0x08) {
3219 n = TARGET_FPE_FLTRES;
3220 } else {
3221 /* ??? Quantum exception; BFP, DFP error. */
3222 goto do_sigill_opn;
3224 sig = TARGET_SIGFPE;
3225 goto do_signal_pc;
3228 default:
3229 fprintf(stderr, "Unhandled program exception: %#x\n", n);
3230 cpu_dump_state(cs, stderr, fprintf, 0);
3231 exit(EXIT_FAILURE);
3233 break;
3235 do_signal_pc:
3236 addr = env->psw.addr;
3237 do_signal:
3238 info.si_signo = sig;
3239 info.si_errno = 0;
3240 info.si_code = n;
3241 info._sifields._sigfault._addr = addr;
3242 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
3243 break;
3245 case EXCP_ATOMIC:
3246 cpu_exec_step_atomic(cs);
3247 break;
3248 default:
3249 fprintf(stderr, "Unhandled trap: 0x%x\n", trapnr);
3250 cpu_dump_state(cs, stderr, fprintf, 0);
3251 exit(EXIT_FAILURE);
3253 process_pending_signals (env);
3257 #endif /* TARGET_S390X */
3259 #ifdef TARGET_TILEGX
3261 static void gen_sigill_reg(CPUTLGState *env)
3263 target_siginfo_t info;
3265 info.si_signo = TARGET_SIGILL;
3266 info.si_errno = 0;
3267 info.si_code = TARGET_ILL_PRVREG;
3268 info._sifields._sigfault._addr = env->pc;
3269 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
3272 static void do_signal(CPUTLGState *env, int signo, int sigcode)
3274 target_siginfo_t info;
3276 info.si_signo = signo;
3277 info.si_errno = 0;
3278 info._sifields._sigfault._addr = env->pc;
3280 if (signo == TARGET_SIGSEGV) {
3281 /* The passed in sigcode is a dummy; check for a page mapping
3282 and pass either MAPERR or ACCERR. */
3283 target_ulong addr = env->excaddr;
3284 info._sifields._sigfault._addr = addr;
3285 if (page_check_range(addr, 1, PAGE_VALID) < 0) {
3286 sigcode = TARGET_SEGV_MAPERR;
3287 } else {
3288 sigcode = TARGET_SEGV_ACCERR;
3291 info.si_code = sigcode;
3293 queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
3296 static void gen_sigsegv_maperr(CPUTLGState *env, target_ulong addr)
3298 env->excaddr = addr;
3299 do_signal(env, TARGET_SIGSEGV, 0);
3302 static void set_regval(CPUTLGState *env, uint8_t reg, uint64_t val)
3304 if (unlikely(reg >= TILEGX_R_COUNT)) {
3305 switch (reg) {
3306 case TILEGX_R_SN:
3307 case TILEGX_R_ZERO:
3308 return;
3309 case TILEGX_R_IDN0:
3310 case TILEGX_R_IDN1:
3311 case TILEGX_R_UDN0:
3312 case TILEGX_R_UDN1:
3313 case TILEGX_R_UDN2:
3314 case TILEGX_R_UDN3:
3315 gen_sigill_reg(env);
3316 return;
3317 default:
3318 g_assert_not_reached();
3321 env->regs[reg] = val;
3325 * Compare the 8-byte contents of the CmpValue SPR with the 8-byte value in
3326 * memory at the address held in the first source register. If the values are
3327 * not equal, then no memory operation is performed. If the values are equal,
3328 * the 8-byte quantity from the second source register is written into memory
3329 * at the address held in the first source register. In either case, the result
3330 * of the instruction is the value read from memory. The compare and write to
3331 * memory are atomic and thus can be used for synchronization purposes. This
3332 * instruction only operates for addresses aligned to a 8-byte boundary.
3333 * Unaligned memory access causes an Unaligned Data Reference interrupt.
3335 * Functional Description (64-bit)
3336 * uint64_t memVal = memoryReadDoubleWord (rf[SrcA]);
3337 * rf[Dest] = memVal;
3338 * if (memVal == SPR[CmpValueSPR])
3339 * memoryWriteDoubleWord (rf[SrcA], rf[SrcB]);
3341 * Functional Description (32-bit)
3342 * uint64_t memVal = signExtend32 (memoryReadWord (rf[SrcA]));
3343 * rf[Dest] = memVal;
3344 * if (memVal == signExtend32 (SPR[CmpValueSPR]))
3345 * memoryWriteWord (rf[SrcA], rf[SrcB]);
3348 * This function also processes exch and exch4 which need not process SPR.
3350 static void do_exch(CPUTLGState *env, bool quad, bool cmp)
3352 target_ulong addr;
3353 target_long val, sprval;
3355 start_exclusive();
3357 addr = env->atomic_srca;
3358 if (quad ? get_user_s64(val, addr) : get_user_s32(val, addr)) {
3359 goto sigsegv_maperr;
3362 if (cmp) {
3363 if (quad) {
3364 sprval = env->spregs[TILEGX_SPR_CMPEXCH];
3365 } else {
3366 sprval = sextract64(env->spregs[TILEGX_SPR_CMPEXCH], 0, 32);
3370 if (!cmp || val == sprval) {
3371 target_long valb = env->atomic_srcb;
3372 if (quad ? put_user_u64(valb, addr) : put_user_u32(valb, addr)) {
3373 goto sigsegv_maperr;
3377 set_regval(env, env->atomic_dstr, val);
3378 end_exclusive();
3379 return;
3381 sigsegv_maperr:
3382 end_exclusive();
3383 gen_sigsegv_maperr(env, addr);
3386 static void do_fetch(CPUTLGState *env, int trapnr, bool quad)
3388 int8_t write = 1;
3389 target_ulong addr;
3390 target_long val, valb;
3392 start_exclusive();
3394 addr = env->atomic_srca;
3395 valb = env->atomic_srcb;
3396 if (quad ? get_user_s64(val, addr) : get_user_s32(val, addr)) {
3397 goto sigsegv_maperr;
3400 switch (trapnr) {
3401 case TILEGX_EXCP_OPCODE_FETCHADD:
3402 case TILEGX_EXCP_OPCODE_FETCHADD4:
3403 valb += val;
3404 break;
3405 case TILEGX_EXCP_OPCODE_FETCHADDGEZ:
3406 valb += val;
3407 if (valb < 0) {
3408 write = 0;
3410 break;
3411 case TILEGX_EXCP_OPCODE_FETCHADDGEZ4:
3412 valb += val;
3413 if ((int32_t)valb < 0) {
3414 write = 0;
3416 break;
3417 case TILEGX_EXCP_OPCODE_FETCHAND:
3418 case TILEGX_EXCP_OPCODE_FETCHAND4:
3419 valb &= val;
3420 break;
3421 case TILEGX_EXCP_OPCODE_FETCHOR:
3422 case TILEGX_EXCP_OPCODE_FETCHOR4:
3423 valb |= val;
3424 break;
3425 default:
3426 g_assert_not_reached();
3429 if (write) {
3430 if (quad ? put_user_u64(valb, addr) : put_user_u32(valb, addr)) {
3431 goto sigsegv_maperr;
3435 set_regval(env, env->atomic_dstr, val);
3436 end_exclusive();
3437 return;
3439 sigsegv_maperr:
3440 end_exclusive();
3441 gen_sigsegv_maperr(env, addr);
3444 void cpu_loop(CPUTLGState *env)
3446 CPUState *cs = CPU(tilegx_env_get_cpu(env));
3447 int trapnr;
3449 while (1) {
3450 cpu_exec_start(cs);
3451 trapnr = cpu_exec(cs);
3452 cpu_exec_end(cs);
3453 process_queued_cpu_work(cs);
3455 switch (trapnr) {
3456 case TILEGX_EXCP_SYSCALL:
3458 abi_ulong ret = do_syscall(env, env->regs[TILEGX_R_NR],
3459 env->regs[0], env->regs[1],
3460 env->regs[2], env->regs[3],
3461 env->regs[4], env->regs[5],
3462 env->regs[6], env->regs[7]);
3463 if (ret == -TARGET_ERESTARTSYS) {
3464 env->pc -= 8;
3465 } else if (ret != -TARGET_QEMU_ESIGRETURN) {
3466 env->regs[TILEGX_R_RE] = ret;
3467 env->regs[TILEGX_R_ERR] = TILEGX_IS_ERRNO(ret) ? -ret : 0;
3469 break;
3471 case TILEGX_EXCP_OPCODE_EXCH:
3472 do_exch(env, true, false);
3473 break;
3474 case TILEGX_EXCP_OPCODE_EXCH4:
3475 do_exch(env, false, false);
3476 break;
3477 case TILEGX_EXCP_OPCODE_CMPEXCH:
3478 do_exch(env, true, true);
3479 break;
3480 case TILEGX_EXCP_OPCODE_CMPEXCH4:
3481 do_exch(env, false, true);
3482 break;
3483 case TILEGX_EXCP_OPCODE_FETCHADD:
3484 case TILEGX_EXCP_OPCODE_FETCHADDGEZ:
3485 case TILEGX_EXCP_OPCODE_FETCHAND:
3486 case TILEGX_EXCP_OPCODE_FETCHOR:
3487 do_fetch(env, trapnr, true);
3488 break;
3489 case TILEGX_EXCP_OPCODE_FETCHADD4:
3490 case TILEGX_EXCP_OPCODE_FETCHADDGEZ4:
3491 case TILEGX_EXCP_OPCODE_FETCHAND4:
3492 case TILEGX_EXCP_OPCODE_FETCHOR4:
3493 do_fetch(env, trapnr, false);
3494 break;
3495 case TILEGX_EXCP_SIGNAL:
3496 do_signal(env, env->signo, env->sigcode);
3497 break;
3498 case TILEGX_EXCP_REG_IDN_ACCESS:
3499 case TILEGX_EXCP_REG_UDN_ACCESS:
3500 gen_sigill_reg(env);
3501 break;
3502 case EXCP_ATOMIC:
3503 cpu_exec_step_atomic(cs);
3504 break;
3505 default:
3506 fprintf(stderr, "trapnr is %d[0x%x].\n", trapnr, trapnr);
3507 g_assert_not_reached();
3509 process_pending_signals(env);
3513 #endif
3515 THREAD CPUState *thread_cpu;
3517 bool qemu_cpu_is_self(CPUState *cpu)
3519 return thread_cpu == cpu;
3522 void qemu_cpu_kick(CPUState *cpu)
3524 cpu_exit(cpu);
3527 void task_settid(TaskState *ts)
3529 if (ts->ts_tid == 0) {
3530 ts->ts_tid = (pid_t)syscall(SYS_gettid);
3534 void stop_all_tasks(void)
3537 * We trust that when using NPTL, start_exclusive()
3538 * handles thread stopping correctly.
3540 start_exclusive();
3543 /* Assumes contents are already zeroed. */
3544 void init_task_state(TaskState *ts)
3546 ts->used = 1;
3549 CPUArchState *cpu_copy(CPUArchState *env)
3551 CPUState *cpu = ENV_GET_CPU(env);
3552 CPUState *new_cpu = cpu_init(cpu_model);
3553 CPUArchState *new_env = new_cpu->env_ptr;
3554 CPUBreakpoint *bp;
3555 CPUWatchpoint *wp;
3557 /* Reset non arch specific state */
3558 cpu_reset(new_cpu);
3560 memcpy(new_env, env, sizeof(CPUArchState));
3562 /* Clone all break/watchpoints.
3563 Note: Once we support ptrace with hw-debug register access, make sure
3564 BP_CPU break/watchpoints are handled correctly on clone. */
3565 QTAILQ_INIT(&new_cpu->breakpoints);
3566 QTAILQ_INIT(&new_cpu->watchpoints);
3567 QTAILQ_FOREACH(bp, &cpu->breakpoints, entry) {
3568 cpu_breakpoint_insert(new_cpu, bp->pc, bp->flags, NULL);
3570 QTAILQ_FOREACH(wp, &cpu->watchpoints, entry) {
3571 cpu_watchpoint_insert(new_cpu, wp->vaddr, wp->len, wp->flags, NULL);
3574 return new_env;
3577 static void handle_arg_help(const char *arg)
3579 usage(EXIT_SUCCESS);
3582 static void handle_arg_log(const char *arg)
3584 int mask;
3586 mask = qemu_str_to_log_mask(arg);
3587 if (!mask) {
3588 qemu_print_log_usage(stdout);
3589 exit(EXIT_FAILURE);
3591 qemu_log_needs_buffers();
3592 qemu_set_log(mask);
3595 static void handle_arg_log_filename(const char *arg)
3597 qemu_set_log_filename(arg, &error_fatal);
3600 static void handle_arg_set_env(const char *arg)
3602 char *r, *p, *token;
3603 r = p = strdup(arg);
3604 while ((token = strsep(&p, ",")) != NULL) {
3605 if (envlist_setenv(envlist, token) != 0) {
3606 usage(EXIT_FAILURE);
3609 free(r);
3612 static void handle_arg_unset_env(const char *arg)
3614 char *r, *p, *token;
3615 r = p = strdup(arg);
3616 while ((token = strsep(&p, ",")) != NULL) {
3617 if (envlist_unsetenv(envlist, token) != 0) {
3618 usage(EXIT_FAILURE);
3621 free(r);
3624 static void handle_arg_argv0(const char *arg)
3626 argv0 = strdup(arg);
3629 static void handle_arg_stack_size(const char *arg)
3631 char *p;
3632 guest_stack_size = strtoul(arg, &p, 0);
3633 if (guest_stack_size == 0) {
3634 usage(EXIT_FAILURE);
3637 if (*p == 'M') {
3638 guest_stack_size *= 1024 * 1024;
3639 } else if (*p == 'k' || *p == 'K') {
3640 guest_stack_size *= 1024;
3644 static void handle_arg_ld_prefix(const char *arg)
3646 interp_prefix = strdup(arg);
3649 static void handle_arg_pagesize(const char *arg)
3651 qemu_host_page_size = atoi(arg);
3652 if (qemu_host_page_size == 0 ||
3653 (qemu_host_page_size & (qemu_host_page_size - 1)) != 0) {
3654 fprintf(stderr, "page size must be a power of two\n");
3655 exit(EXIT_FAILURE);
3659 static void handle_arg_randseed(const char *arg)
3661 unsigned long long seed;
3663 if (parse_uint_full(arg, &seed, 0) != 0 || seed > UINT_MAX) {
3664 fprintf(stderr, "Invalid seed number: %s\n", arg);
3665 exit(EXIT_FAILURE);
3667 srand(seed);
3670 static void handle_arg_gdb(const char *arg)
3672 gdbstub_port = atoi(arg);
3675 static void handle_arg_uname(const char *arg)
3677 qemu_uname_release = strdup(arg);
3680 static void handle_arg_cpu(const char *arg)
3682 cpu_model = strdup(arg);
3683 if (cpu_model == NULL || is_help_option(cpu_model)) {
3684 /* XXX: implement xxx_cpu_list for targets that still miss it */
3685 #if defined(cpu_list)
3686 cpu_list(stdout, &fprintf);
3687 #endif
3688 exit(EXIT_FAILURE);
3692 static void handle_arg_guest_base(const char *arg)
3694 guest_base = strtol(arg, NULL, 0);
3695 have_guest_base = 1;
3698 static void handle_arg_reserved_va(const char *arg)
3700 char *p;
3701 int shift = 0;
3702 reserved_va = strtoul(arg, &p, 0);
3703 switch (*p) {
3704 case 'k':
3705 case 'K':
3706 shift = 10;
3707 break;
3708 case 'M':
3709 shift = 20;
3710 break;
3711 case 'G':
3712 shift = 30;
3713 break;
3715 if (shift) {
3716 unsigned long unshifted = reserved_va;
3717 p++;
3718 reserved_va <<= shift;
3719 if (((reserved_va >> shift) != unshifted)
3720 #if HOST_LONG_BITS > TARGET_VIRT_ADDR_SPACE_BITS
3721 || (reserved_va > (1ul << TARGET_VIRT_ADDR_SPACE_BITS))
3722 #endif
3724 fprintf(stderr, "Reserved virtual address too big\n");
3725 exit(EXIT_FAILURE);
3728 if (*p) {
3729 fprintf(stderr, "Unrecognised -R size suffix '%s'\n", p);
3730 exit(EXIT_FAILURE);
3734 static void handle_arg_singlestep(const char *arg)
3736 singlestep = 1;
3739 static void handle_arg_strace(const char *arg)
3741 do_strace = 1;
3744 static void handle_arg_version(const char *arg)
3746 printf("qemu-" TARGET_NAME " version " QEMU_VERSION QEMU_PKGVERSION
3747 "\n" QEMU_COPYRIGHT "\n");
3748 exit(EXIT_SUCCESS);
3751 static char *trace_file;
3752 static void handle_arg_trace(const char *arg)
3754 g_free(trace_file);
3755 trace_file = trace_opt_parse(arg);
3758 struct qemu_argument {
3759 const char *argv;
3760 const char *env;
3761 bool has_arg;
3762 void (*handle_opt)(const char *arg);
3763 const char *example;
3764 const char *help;
3767 static const struct qemu_argument arg_table[] = {
3768 {"h", "", false, handle_arg_help,
3769 "", "print this help"},
3770 {"help", "", false, handle_arg_help,
3771 "", ""},
3772 {"g", "QEMU_GDB", true, handle_arg_gdb,
3773 "port", "wait gdb connection to 'port'"},
3774 {"L", "QEMU_LD_PREFIX", true, handle_arg_ld_prefix,
3775 "path", "set the elf interpreter prefix to 'path'"},
3776 {"s", "QEMU_STACK_SIZE", true, handle_arg_stack_size,
3777 "size", "set the stack size to 'size' bytes"},
3778 {"cpu", "QEMU_CPU", true, handle_arg_cpu,
3779 "model", "select CPU (-cpu help for list)"},
3780 {"E", "QEMU_SET_ENV", true, handle_arg_set_env,
3781 "var=value", "sets targets environment variable (see below)"},
3782 {"U", "QEMU_UNSET_ENV", true, handle_arg_unset_env,
3783 "var", "unsets targets environment variable (see below)"},
3784 {"0", "QEMU_ARGV0", true, handle_arg_argv0,
3785 "argv0", "forces target process argv[0] to be 'argv0'"},
3786 {"r", "QEMU_UNAME", true, handle_arg_uname,
3787 "uname", "set qemu uname release string to 'uname'"},
3788 {"B", "QEMU_GUEST_BASE", true, handle_arg_guest_base,
3789 "address", "set guest_base address to 'address'"},
3790 {"R", "QEMU_RESERVED_VA", true, handle_arg_reserved_va,
3791 "size", "reserve 'size' bytes for guest virtual address space"},
3792 {"d", "QEMU_LOG", true, handle_arg_log,
3793 "item[,...]", "enable logging of specified items "
3794 "(use '-d help' for a list of items)"},
3795 {"D", "QEMU_LOG_FILENAME", true, handle_arg_log_filename,
3796 "logfile", "write logs to 'logfile' (default stderr)"},
3797 {"p", "QEMU_PAGESIZE", true, handle_arg_pagesize,
3798 "pagesize", "set the host page size to 'pagesize'"},
3799 {"singlestep", "QEMU_SINGLESTEP", false, handle_arg_singlestep,
3800 "", "run in singlestep mode"},
3801 {"strace", "QEMU_STRACE", false, handle_arg_strace,
3802 "", "log system calls"},
3803 {"seed", "QEMU_RAND_SEED", true, handle_arg_randseed,
3804 "", "Seed for pseudo-random number generator"},
3805 {"trace", "QEMU_TRACE", true, handle_arg_trace,
3806 "", "[[enable=]<pattern>][,events=<file>][,file=<file>]"},
3807 {"version", "QEMU_VERSION", false, handle_arg_version,
3808 "", "display version information and exit"},
3809 {NULL, NULL, false, NULL, NULL, NULL}
3812 static void usage(int exitcode)
3814 const struct qemu_argument *arginfo;
3815 int maxarglen;
3816 int maxenvlen;
3818 printf("usage: qemu-" TARGET_NAME " [options] program [arguments...]\n"
3819 "Linux CPU emulator (compiled for " TARGET_NAME " emulation)\n"
3820 "\n"
3821 "Options and associated environment variables:\n"
3822 "\n");
3824 /* Calculate column widths. We must always have at least enough space
3825 * for the column header.
3827 maxarglen = strlen("Argument");
3828 maxenvlen = strlen("Env-variable");
3830 for (arginfo = arg_table; arginfo->handle_opt != NULL; arginfo++) {
3831 int arglen = strlen(arginfo->argv);
3832 if (arginfo->has_arg) {
3833 arglen += strlen(arginfo->example) + 1;
3835 if (strlen(arginfo->env) > maxenvlen) {
3836 maxenvlen = strlen(arginfo->env);
3838 if (arglen > maxarglen) {
3839 maxarglen = arglen;
3843 printf("%-*s %-*s Description\n", maxarglen+1, "Argument",
3844 maxenvlen, "Env-variable");
3846 for (arginfo = arg_table; arginfo->handle_opt != NULL; arginfo++) {
3847 if (arginfo->has_arg) {
3848 printf("-%s %-*s %-*s %s\n", arginfo->argv,
3849 (int)(maxarglen - strlen(arginfo->argv) - 1),
3850 arginfo->example, maxenvlen, arginfo->env, arginfo->help);
3851 } else {
3852 printf("-%-*s %-*s %s\n", maxarglen, arginfo->argv,
3853 maxenvlen, arginfo->env,
3854 arginfo->help);
3858 printf("\n"
3859 "Defaults:\n"
3860 "QEMU_LD_PREFIX = %s\n"
3861 "QEMU_STACK_SIZE = %ld byte\n",
3862 interp_prefix,
3863 guest_stack_size);
3865 printf("\n"
3866 "You can use -E and -U options or the QEMU_SET_ENV and\n"
3867 "QEMU_UNSET_ENV environment variables to set and unset\n"
3868 "environment variables for the target process.\n"
3869 "It is possible to provide several variables by separating them\n"
3870 "by commas in getsubopt(3) style. Additionally it is possible to\n"
3871 "provide the -E and -U options multiple times.\n"
3872 "The following lines are equivalent:\n"
3873 " -E var1=val2 -E var2=val2 -U LD_PRELOAD -U LD_DEBUG\n"
3874 " -E var1=val2,var2=val2 -U LD_PRELOAD,LD_DEBUG\n"
3875 " QEMU_SET_ENV=var1=val2,var2=val2 QEMU_UNSET_ENV=LD_PRELOAD,LD_DEBUG\n"
3876 "Note that if you provide several changes to a single variable\n"
3877 "the last change will stay in effect.\n");
3879 exit(exitcode);
3882 static int parse_args(int argc, char **argv)
3884 const char *r;
3885 int optind;
3886 const struct qemu_argument *arginfo;
3888 for (arginfo = arg_table; arginfo->handle_opt != NULL; arginfo++) {
3889 if (arginfo->env == NULL) {
3890 continue;
3893 r = getenv(arginfo->env);
3894 if (r != NULL) {
3895 arginfo->handle_opt(r);
3899 optind = 1;
3900 for (;;) {
3901 if (optind >= argc) {
3902 break;
3904 r = argv[optind];
3905 if (r[0] != '-') {
3906 break;
3908 optind++;
3909 r++;
3910 if (!strcmp(r, "-")) {
3911 break;
3913 /* Treat --foo the same as -foo. */
3914 if (r[0] == '-') {
3915 r++;
3918 for (arginfo = arg_table; arginfo->handle_opt != NULL; arginfo++) {
3919 if (!strcmp(r, arginfo->argv)) {
3920 if (arginfo->has_arg) {
3921 if (optind >= argc) {
3922 (void) fprintf(stderr,
3923 "qemu: missing argument for option '%s'\n", r);
3924 exit(EXIT_FAILURE);
3926 arginfo->handle_opt(argv[optind]);
3927 optind++;
3928 } else {
3929 arginfo->handle_opt(NULL);
3931 break;
3935 /* no option matched the current argv */
3936 if (arginfo->handle_opt == NULL) {
3937 (void) fprintf(stderr, "qemu: unknown option '%s'\n", r);
3938 exit(EXIT_FAILURE);
3942 if (optind >= argc) {
3943 (void) fprintf(stderr, "qemu: no user program specified\n");
3944 exit(EXIT_FAILURE);
3947 filename = argv[optind];
3948 exec_path = argv[optind];
3950 return optind;
3953 int main(int argc, char **argv, char **envp)
3955 struct target_pt_regs regs1, *regs = &regs1;
3956 struct image_info info1, *info = &info1;
3957 struct linux_binprm bprm;
3958 TaskState *ts;
3959 CPUArchState *env;
3960 CPUState *cpu;
3961 int optind;
3962 char **target_environ, **wrk;
3963 char **target_argv;
3964 int target_argc;
3965 int i;
3966 int ret;
3967 int execfd;
3969 module_call_init(MODULE_INIT_TRACE);
3970 qemu_init_cpu_list();
3971 module_call_init(MODULE_INIT_QOM);
3973 if ((envlist = envlist_create()) == NULL) {
3974 (void) fprintf(stderr, "Unable to allocate envlist\n");
3975 exit(EXIT_FAILURE);
3978 /* add current environment into the list */
3979 for (wrk = environ; *wrk != NULL; wrk++) {
3980 (void) envlist_setenv(envlist, *wrk);
3983 /* Read the stack limit from the kernel. If it's "unlimited",
3984 then we can do little else besides use the default. */
3986 struct rlimit lim;
3987 if (getrlimit(RLIMIT_STACK, &lim) == 0
3988 && lim.rlim_cur != RLIM_INFINITY
3989 && lim.rlim_cur == (target_long)lim.rlim_cur) {
3990 guest_stack_size = lim.rlim_cur;
3994 cpu_model = NULL;
3996 srand(time(NULL));
3998 qemu_add_opts(&qemu_trace_opts);
4000 optind = parse_args(argc, argv);
4002 if (!trace_init_backends()) {
4003 exit(1);
4005 trace_init_file(trace_file);
4007 /* Zero out regs */
4008 memset(regs, 0, sizeof(struct target_pt_regs));
4010 /* Zero out image_info */
4011 memset(info, 0, sizeof(struct image_info));
4013 memset(&bprm, 0, sizeof (bprm));
4015 /* Scan interp_prefix dir for replacement files. */
4016 init_paths(interp_prefix);
4018 init_qemu_uname_release();
4020 if (cpu_model == NULL) {
4021 #if defined(TARGET_I386)
4022 #ifdef TARGET_X86_64
4023 cpu_model = "qemu64";
4024 #else
4025 cpu_model = "qemu32";
4026 #endif
4027 #elif defined(TARGET_ARM)
4028 cpu_model = "any";
4029 #elif defined(TARGET_UNICORE32)
4030 cpu_model = "any";
4031 #elif defined(TARGET_M68K)
4032 cpu_model = "any";
4033 #elif defined(TARGET_SPARC)
4034 #ifdef TARGET_SPARC64
4035 cpu_model = "TI UltraSparc II";
4036 #else
4037 cpu_model = "Fujitsu MB86904";
4038 #endif
4039 #elif defined(TARGET_MIPS)
4040 #if defined(TARGET_ABI_MIPSN32) || defined(TARGET_ABI_MIPSN64)
4041 cpu_model = "5KEf";
4042 #else
4043 cpu_model = "24Kf";
4044 #endif
4045 #elif defined TARGET_OPENRISC
4046 cpu_model = "or1200";
4047 #elif defined(TARGET_PPC)
4048 # ifdef TARGET_PPC64
4049 cpu_model = "POWER8";
4050 # else
4051 cpu_model = "750";
4052 # endif
4053 #elif defined TARGET_SH4
4054 cpu_model = TYPE_SH7785_CPU;
4055 #else
4056 cpu_model = "any";
4057 #endif
4059 tcg_exec_init(0);
4060 /* NOTE: we need to init the CPU at this stage to get
4061 qemu_host_page_size */
4062 cpu = cpu_init(cpu_model);
4063 if (!cpu) {
4064 fprintf(stderr, "Unable to find CPU definition\n");
4065 exit(EXIT_FAILURE);
4067 env = cpu->env_ptr;
4068 cpu_reset(cpu);
4070 thread_cpu = cpu;
4072 if (getenv("QEMU_STRACE")) {
4073 do_strace = 1;
4076 if (getenv("QEMU_RAND_SEED")) {
4077 handle_arg_randseed(getenv("QEMU_RAND_SEED"));
4080 target_environ = envlist_to_environ(envlist, NULL);
4081 envlist_free(envlist);
4084 * Now that page sizes are configured in cpu_init() we can do
4085 * proper page alignment for guest_base.
4087 guest_base = HOST_PAGE_ALIGN(guest_base);
4089 if (reserved_va || have_guest_base) {
4090 guest_base = init_guest_space(guest_base, reserved_va, 0,
4091 have_guest_base);
4092 if (guest_base == (unsigned long)-1) {
4093 fprintf(stderr, "Unable to reserve 0x%lx bytes of virtual address "
4094 "space for use as guest address space (check your virtual "
4095 "memory ulimit setting or reserve less using -R option)\n",
4096 reserved_va);
4097 exit(EXIT_FAILURE);
4100 if (reserved_va) {
4101 mmap_next_start = reserved_va;
4106 * Read in mmap_min_addr kernel parameter. This value is used
4107 * When loading the ELF image to determine whether guest_base
4108 * is needed. It is also used in mmap_find_vma.
4111 FILE *fp;
4113 if ((fp = fopen("/proc/sys/vm/mmap_min_addr", "r")) != NULL) {
4114 unsigned long tmp;
4115 if (fscanf(fp, "%lu", &tmp) == 1) {
4116 mmap_min_addr = tmp;
4117 qemu_log_mask(CPU_LOG_PAGE, "host mmap_min_addr=0x%lx\n", mmap_min_addr);
4119 fclose(fp);
4124 * Prepare copy of argv vector for target.
4126 target_argc = argc - optind;
4127 target_argv = calloc(target_argc + 1, sizeof (char *));
4128 if (target_argv == NULL) {
4129 (void) fprintf(stderr, "Unable to allocate memory for target_argv\n");
4130 exit(EXIT_FAILURE);
4134 * If argv0 is specified (using '-0' switch) we replace
4135 * argv[0] pointer with the given one.
4137 i = 0;
4138 if (argv0 != NULL) {
4139 target_argv[i++] = strdup(argv0);
4141 for (; i < target_argc; i++) {
4142 target_argv[i] = strdup(argv[optind + i]);
4144 target_argv[target_argc] = NULL;
4146 ts = g_new0(TaskState, 1);
4147 init_task_state(ts);
4148 /* build Task State */
4149 ts->info = info;
4150 ts->bprm = &bprm;
4151 cpu->opaque = ts;
4152 task_settid(ts);
4154 execfd = qemu_getauxval(AT_EXECFD);
4155 if (execfd == 0) {
4156 execfd = open(filename, O_RDONLY);
4157 if (execfd < 0) {
4158 printf("Error while loading %s: %s\n", filename, strerror(errno));
4159 _exit(EXIT_FAILURE);
4163 ret = loader_exec(execfd, filename, target_argv, target_environ, regs,
4164 info, &bprm);
4165 if (ret != 0) {
4166 printf("Error while loading %s: %s\n", filename, strerror(-ret));
4167 _exit(EXIT_FAILURE);
4170 for (wrk = target_environ; *wrk; wrk++) {
4171 free(*wrk);
4174 free(target_environ);
4176 if (qemu_loglevel_mask(CPU_LOG_PAGE)) {
4177 qemu_log("guest_base 0x%lx\n", guest_base);
4178 log_page_dump();
4180 qemu_log("start_brk 0x" TARGET_ABI_FMT_lx "\n", info->start_brk);
4181 qemu_log("end_code 0x" TARGET_ABI_FMT_lx "\n", info->end_code);
4182 qemu_log("start_code 0x" TARGET_ABI_FMT_lx "\n",
4183 info->start_code);
4184 qemu_log("start_data 0x" TARGET_ABI_FMT_lx "\n",
4185 info->start_data);
4186 qemu_log("end_data 0x" TARGET_ABI_FMT_lx "\n", info->end_data);
4187 qemu_log("start_stack 0x" TARGET_ABI_FMT_lx "\n",
4188 info->start_stack);
4189 qemu_log("brk 0x" TARGET_ABI_FMT_lx "\n", info->brk);
4190 qemu_log("entry 0x" TARGET_ABI_FMT_lx "\n", info->entry);
4193 target_set_brk(info->brk);
4194 syscall_init();
4195 signal_init();
4197 /* Now that we've loaded the binary, GUEST_BASE is fixed. Delay
4198 generating the prologue until now so that the prologue can take
4199 the real value of GUEST_BASE into account. */
4200 tcg_prologue_init(&tcg_ctx);
4202 #if defined(TARGET_I386)
4203 env->cr[0] = CR0_PG_MASK | CR0_WP_MASK | CR0_PE_MASK;
4204 env->hflags |= HF_PE_MASK | HF_CPL_MASK;
4205 if (env->features[FEAT_1_EDX] & CPUID_SSE) {
4206 env->cr[4] |= CR4_OSFXSR_MASK;
4207 env->hflags |= HF_OSFXSR_MASK;
4209 #ifndef TARGET_ABI32
4210 /* enable 64 bit mode if possible */
4211 if (!(env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM)) {
4212 fprintf(stderr, "The selected x86 CPU does not support 64 bit mode\n");
4213 exit(EXIT_FAILURE);
4215 env->cr[4] |= CR4_PAE_MASK;
4216 env->efer |= MSR_EFER_LMA | MSR_EFER_LME;
4217 env->hflags |= HF_LMA_MASK;
4218 #endif
4220 /* flags setup : we activate the IRQs by default as in user mode */
4221 env->eflags |= IF_MASK;
4223 /* linux register setup */
4224 #ifndef TARGET_ABI32
4225 env->regs[R_EAX] = regs->rax;
4226 env->regs[R_EBX] = regs->rbx;
4227 env->regs[R_ECX] = regs->rcx;
4228 env->regs[R_EDX] = regs->rdx;
4229 env->regs[R_ESI] = regs->rsi;
4230 env->regs[R_EDI] = regs->rdi;
4231 env->regs[R_EBP] = regs->rbp;
4232 env->regs[R_ESP] = regs->rsp;
4233 env->eip = regs->rip;
4234 #else
4235 env->regs[R_EAX] = regs->eax;
4236 env->regs[R_EBX] = regs->ebx;
4237 env->regs[R_ECX] = regs->ecx;
4238 env->regs[R_EDX] = regs->edx;
4239 env->regs[R_ESI] = regs->esi;
4240 env->regs[R_EDI] = regs->edi;
4241 env->regs[R_EBP] = regs->ebp;
4242 env->regs[R_ESP] = regs->esp;
4243 env->eip = regs->eip;
4244 #endif
4246 /* linux interrupt setup */
4247 #ifndef TARGET_ABI32
4248 env->idt.limit = 511;
4249 #else
4250 env->idt.limit = 255;
4251 #endif
4252 env->idt.base = target_mmap(0, sizeof(uint64_t) * (env->idt.limit + 1),
4253 PROT_READ|PROT_WRITE,
4254 MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
4255 idt_table = g2h(env->idt.base);
4256 set_idt(0, 0);
4257 set_idt(1, 0);
4258 set_idt(2, 0);
4259 set_idt(3, 3);
4260 set_idt(4, 3);
4261 set_idt(5, 0);
4262 set_idt(6, 0);
4263 set_idt(7, 0);
4264 set_idt(8, 0);
4265 set_idt(9, 0);
4266 set_idt(10, 0);
4267 set_idt(11, 0);
4268 set_idt(12, 0);
4269 set_idt(13, 0);
4270 set_idt(14, 0);
4271 set_idt(15, 0);
4272 set_idt(16, 0);
4273 set_idt(17, 0);
4274 set_idt(18, 0);
4275 set_idt(19, 0);
4276 set_idt(0x80, 3);
4278 /* linux segment setup */
4280 uint64_t *gdt_table;
4281 env->gdt.base = target_mmap(0, sizeof(uint64_t) * TARGET_GDT_ENTRIES,
4282 PROT_READ|PROT_WRITE,
4283 MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
4284 env->gdt.limit = sizeof(uint64_t) * TARGET_GDT_ENTRIES - 1;
4285 gdt_table = g2h(env->gdt.base);
4286 #ifdef TARGET_ABI32
4287 write_dt(&gdt_table[__USER_CS >> 3], 0, 0xfffff,
4288 DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | DESC_S_MASK |
4289 (3 << DESC_DPL_SHIFT) | (0xa << DESC_TYPE_SHIFT));
4290 #else
4291 /* 64 bit code segment */
4292 write_dt(&gdt_table[__USER_CS >> 3], 0, 0xfffff,
4293 DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | DESC_S_MASK |
4294 DESC_L_MASK |
4295 (3 << DESC_DPL_SHIFT) | (0xa << DESC_TYPE_SHIFT));
4296 #endif
4297 write_dt(&gdt_table[__USER_DS >> 3], 0, 0xfffff,
4298 DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | DESC_S_MASK |
4299 (3 << DESC_DPL_SHIFT) | (0x2 << DESC_TYPE_SHIFT));
4301 cpu_x86_load_seg(env, R_CS, __USER_CS);
4302 cpu_x86_load_seg(env, R_SS, __USER_DS);
4303 #ifdef TARGET_ABI32
4304 cpu_x86_load_seg(env, R_DS, __USER_DS);
4305 cpu_x86_load_seg(env, R_ES, __USER_DS);
4306 cpu_x86_load_seg(env, R_FS, __USER_DS);
4307 cpu_x86_load_seg(env, R_GS, __USER_DS);
4308 /* This hack makes Wine work... */
4309 env->segs[R_FS].selector = 0;
4310 #else
4311 cpu_x86_load_seg(env, R_DS, 0);
4312 cpu_x86_load_seg(env, R_ES, 0);
4313 cpu_x86_load_seg(env, R_FS, 0);
4314 cpu_x86_load_seg(env, R_GS, 0);
4315 #endif
4316 #elif defined(TARGET_AARCH64)
4318 int i;
4320 if (!(arm_feature(env, ARM_FEATURE_AARCH64))) {
4321 fprintf(stderr,
4322 "The selected ARM CPU does not support 64 bit mode\n");
4323 exit(EXIT_FAILURE);
4326 for (i = 0; i < 31; i++) {
4327 env->xregs[i] = regs->regs[i];
4329 env->pc = regs->pc;
4330 env->xregs[31] = regs->sp;
4332 #elif defined(TARGET_ARM)
4334 int i;
4335 cpsr_write(env, regs->uregs[16], CPSR_USER | CPSR_EXEC,
4336 CPSRWriteByInstr);
4337 for(i = 0; i < 16; i++) {
4338 env->regs[i] = regs->uregs[i];
4340 #ifdef TARGET_WORDS_BIGENDIAN
4341 /* Enable BE8. */
4342 if (EF_ARM_EABI_VERSION(info->elf_flags) >= EF_ARM_EABI_VER4
4343 && (info->elf_flags & EF_ARM_BE8)) {
4344 env->uncached_cpsr |= CPSR_E;
4345 env->cp15.sctlr_el[1] |= SCTLR_E0E;
4346 } else {
4347 env->cp15.sctlr_el[1] |= SCTLR_B;
4349 #endif
4351 #elif defined(TARGET_UNICORE32)
4353 int i;
4354 cpu_asr_write(env, regs->uregs[32], 0xffffffff);
4355 for (i = 0; i < 32; i++) {
4356 env->regs[i] = regs->uregs[i];
4359 #elif defined(TARGET_SPARC)
4361 int i;
4362 env->pc = regs->pc;
4363 env->npc = regs->npc;
4364 env->y = regs->y;
4365 for(i = 0; i < 8; i++)
4366 env->gregs[i] = regs->u_regs[i];
4367 for(i = 0; i < 8; i++)
4368 env->regwptr[i] = regs->u_regs[i + 8];
4370 #elif defined(TARGET_PPC)
4372 int i;
4374 #if defined(TARGET_PPC64)
4375 int flag = (env->insns_flags2 & PPC2_BOOKE206) ? MSR_CM : MSR_SF;
4376 #if defined(TARGET_ABI32)
4377 env->msr &= ~((target_ulong)1 << flag);
4378 #else
4379 env->msr |= (target_ulong)1 << flag;
4380 #endif
4381 #endif
4382 env->nip = regs->nip;
4383 for(i = 0; i < 32; i++) {
4384 env->gpr[i] = regs->gpr[i];
4387 #elif defined(TARGET_M68K)
4389 env->pc = regs->pc;
4390 env->dregs[0] = regs->d0;
4391 env->dregs[1] = regs->d1;
4392 env->dregs[2] = regs->d2;
4393 env->dregs[3] = regs->d3;
4394 env->dregs[4] = regs->d4;
4395 env->dregs[5] = regs->d5;
4396 env->dregs[6] = regs->d6;
4397 env->dregs[7] = regs->d7;
4398 env->aregs[0] = regs->a0;
4399 env->aregs[1] = regs->a1;
4400 env->aregs[2] = regs->a2;
4401 env->aregs[3] = regs->a3;
4402 env->aregs[4] = regs->a4;
4403 env->aregs[5] = regs->a5;
4404 env->aregs[6] = regs->a6;
4405 env->aregs[7] = regs->usp;
4406 env->sr = regs->sr;
4407 ts->sim_syscalls = 1;
4409 #elif defined(TARGET_MICROBLAZE)
4411 env->regs[0] = regs->r0;
4412 env->regs[1] = regs->r1;
4413 env->regs[2] = regs->r2;
4414 env->regs[3] = regs->r3;
4415 env->regs[4] = regs->r4;
4416 env->regs[5] = regs->r5;
4417 env->regs[6] = regs->r6;
4418 env->regs[7] = regs->r7;
4419 env->regs[8] = regs->r8;
4420 env->regs[9] = regs->r9;
4421 env->regs[10] = regs->r10;
4422 env->regs[11] = regs->r11;
4423 env->regs[12] = regs->r12;
4424 env->regs[13] = regs->r13;
4425 env->regs[14] = regs->r14;
4426 env->regs[15] = regs->r15;
4427 env->regs[16] = regs->r16;
4428 env->regs[17] = regs->r17;
4429 env->regs[18] = regs->r18;
4430 env->regs[19] = regs->r19;
4431 env->regs[20] = regs->r20;
4432 env->regs[21] = regs->r21;
4433 env->regs[22] = regs->r22;
4434 env->regs[23] = regs->r23;
4435 env->regs[24] = regs->r24;
4436 env->regs[25] = regs->r25;
4437 env->regs[26] = regs->r26;
4438 env->regs[27] = regs->r27;
4439 env->regs[28] = regs->r28;
4440 env->regs[29] = regs->r29;
4441 env->regs[30] = regs->r30;
4442 env->regs[31] = regs->r31;
4443 env->sregs[SR_PC] = regs->pc;
4445 #elif defined(TARGET_MIPS)
4447 int i;
4449 for(i = 0; i < 32; i++) {
4450 env->active_tc.gpr[i] = regs->regs[i];
4452 env->active_tc.PC = regs->cp0_epc & ~(target_ulong)1;
4453 if (regs->cp0_epc & 1) {
4454 env->hflags |= MIPS_HFLAG_M16;
4456 if (((info->elf_flags & EF_MIPS_NAN2008) != 0) !=
4457 ((env->active_fpu.fcr31 & (1 << FCR31_NAN2008)) != 0)) {
4458 if ((env->active_fpu.fcr31_rw_bitmask &
4459 (1 << FCR31_NAN2008)) == 0) {
4460 fprintf(stderr, "ELF binary's NaN mode not supported by CPU\n");
4461 exit(1);
4463 if ((info->elf_flags & EF_MIPS_NAN2008) != 0) {
4464 env->active_fpu.fcr31 |= (1 << FCR31_NAN2008);
4465 } else {
4466 env->active_fpu.fcr31 &= ~(1 << FCR31_NAN2008);
4468 restore_snan_bit_mode(env);
4471 #elif defined(TARGET_OPENRISC)
4473 int i;
4475 for (i = 0; i < 32; i++) {
4476 env->gpr[i] = regs->gpr[i];
4479 env->sr = regs->sr;
4480 env->pc = regs->pc;
4482 #elif defined(TARGET_SH4)
4484 int i;
4486 for(i = 0; i < 16; i++) {
4487 env->gregs[i] = regs->regs[i];
4489 env->pc = regs->pc;
4491 #elif defined(TARGET_ALPHA)
4493 int i;
4495 for(i = 0; i < 28; i++) {
4496 env->ir[i] = ((abi_ulong *)regs)[i];
4498 env->ir[IR_SP] = regs->usp;
4499 env->pc = regs->pc;
4501 #elif defined(TARGET_CRIS)
4503 env->regs[0] = regs->r0;
4504 env->regs[1] = regs->r1;
4505 env->regs[2] = regs->r2;
4506 env->regs[3] = regs->r3;
4507 env->regs[4] = regs->r4;
4508 env->regs[5] = regs->r5;
4509 env->regs[6] = regs->r6;
4510 env->regs[7] = regs->r7;
4511 env->regs[8] = regs->r8;
4512 env->regs[9] = regs->r9;
4513 env->regs[10] = regs->r10;
4514 env->regs[11] = regs->r11;
4515 env->regs[12] = regs->r12;
4516 env->regs[13] = regs->r13;
4517 env->regs[14] = info->start_stack;
4518 env->regs[15] = regs->acr;
4519 env->pc = regs->erp;
4521 #elif defined(TARGET_S390X)
4523 int i;
4524 for (i = 0; i < 16; i++) {
4525 env->regs[i] = regs->gprs[i];
4527 env->psw.mask = regs->psw.mask;
4528 env->psw.addr = regs->psw.addr;
4530 #elif defined(TARGET_TILEGX)
4532 int i;
4533 for (i = 0; i < TILEGX_R_COUNT; i++) {
4534 env->regs[i] = regs->regs[i];
4536 for (i = 0; i < TILEGX_SPR_COUNT; i++) {
4537 env->spregs[i] = 0;
4539 env->pc = regs->pc;
4541 #else
4542 #error unsupported target CPU
4543 #endif
4545 #if defined(TARGET_ARM) || defined(TARGET_M68K) || defined(TARGET_UNICORE32)
4546 ts->stack_base = info->start_stack;
4547 ts->heap_base = info->brk;
4548 /* This will be filled in on the first SYS_HEAPINFO call. */
4549 ts->heap_limit = 0;
4550 #endif
4552 if (gdbstub_port) {
4553 if (gdbserver_start(gdbstub_port) < 0) {
4554 fprintf(stderr, "qemu: could not open gdbserver on port %d\n",
4555 gdbstub_port);
4556 exit(EXIT_FAILURE);
4558 gdb_handlesig(cpu, 0);
4560 cpu_loop(env);
4561 /* never exits */
4562 return 0;