]> git.proxmox.com Git - qemu.git/blob - linux-user/main.c
cpu: Make first_cpu and next_cpu CPUState
[qemu.git] / linux-user / main.c
1 /*
2 * qemu user main
3 *
4 * Copyright (c) 2003-2008 Fabrice Bellard
5 *
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.
10 *
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.
15 *
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/>.
18 */
19 #include <stdlib.h>
20 #include <stdio.h>
21 #include <stdarg.h>
22 #include <string.h>
23 #include <errno.h>
24 #include <unistd.h>
25 #include <sys/mman.h>
26 #include <sys/syscall.h>
27 #include <sys/resource.h>
28
29 #include "qemu.h"
30 #include "qemu-common.h"
31 #include "qemu/cache-utils.h"
32 #include "cpu.h"
33 #include "tcg.h"
34 #include "qemu/timer.h"
35 #include "qemu/envlist.h"
36 #include "elf.h"
37
38 char *exec_path;
39
40 int singlestep;
41 const char *filename;
42 const char *argv0;
43 int gdbstub_port;
44 envlist_t *envlist;
45 const char *cpu_model;
46 unsigned long mmap_min_addr;
47 #if defined(CONFIG_USE_GUEST_BASE)
48 unsigned long guest_base;
49 int have_guest_base;
50 #if (TARGET_LONG_BITS == 32) && (HOST_LONG_BITS == 64)
51 /*
52 * When running 32-on-64 we should make sure we can fit all of the possible
53 * guest address space into a contiguous chunk of virtual host memory.
54 *
55 * This way we will never overlap with our own libraries or binaries or stack
56 * or anything else that QEMU maps.
57 */
58 # ifdef TARGET_MIPS
59 /* MIPS only supports 31 bits of virtual address space for user space */
60 unsigned long reserved_va = 0x77000000;
61 # else
62 unsigned long reserved_va = 0xf7000000;
63 # endif
64 #else
65 unsigned long reserved_va;
66 #endif
67 #endif
68
69 static void usage(void);
70
71 static const char *interp_prefix = CONFIG_QEMU_INTERP_PREFIX;
72 const char *qemu_uname_release = CONFIG_UNAME_RELEASE;
73
74 /* XXX: on x86 MAP_GROWSDOWN only works if ESP <= address + 32, so
75 we allocate a bigger stack. Need a better solution, for example
76 by remapping the process stack directly at the right place */
77 unsigned long guest_stack_size = 8 * 1024 * 1024UL;
78
79 void gemu_log(const char *fmt, ...)
80 {
81 va_list ap;
82
83 va_start(ap, fmt);
84 vfprintf(stderr, fmt, ap);
85 va_end(ap);
86 }
87
88 #if defined(TARGET_I386)
89 int cpu_get_pic_interrupt(CPUX86State *env)
90 {
91 return -1;
92 }
93 #endif
94
95 #if defined(CONFIG_USE_NPTL)
96 /***********************************************************/
97 /* Helper routines for implementing atomic operations. */
98
99 /* To implement exclusive operations we force all cpus to syncronise.
100 We don't require a full sync, only that no cpus are executing guest code.
101 The alternative is to map target atomic ops onto host equivalents,
102 which requires quite a lot of per host/target work. */
103 static pthread_mutex_t cpu_list_mutex = PTHREAD_MUTEX_INITIALIZER;
104 static pthread_mutex_t exclusive_lock = PTHREAD_MUTEX_INITIALIZER;
105 static pthread_cond_t exclusive_cond = PTHREAD_COND_INITIALIZER;
106 static pthread_cond_t exclusive_resume = PTHREAD_COND_INITIALIZER;
107 static int pending_cpus;
108
109 /* Make sure everything is in a consistent state for calling fork(). */
110 void fork_start(void)
111 {
112 pthread_mutex_lock(&tcg_ctx.tb_ctx.tb_lock);
113 pthread_mutex_lock(&exclusive_lock);
114 mmap_fork_start();
115 }
116
117 void fork_end(int child)
118 {
119 mmap_fork_end(child);
120 if (child) {
121 /* Child processes created by fork() only have a single thread.
122 Discard information about the parent threads. */
123 first_cpu = ENV_GET_CPU(thread_env);
124 first_cpu->next_cpu = NULL;
125 pending_cpus = 0;
126 pthread_mutex_init(&exclusive_lock, NULL);
127 pthread_mutex_init(&cpu_list_mutex, NULL);
128 pthread_cond_init(&exclusive_cond, NULL);
129 pthread_cond_init(&exclusive_resume, NULL);
130 pthread_mutex_init(&tcg_ctx.tb_ctx.tb_lock, NULL);
131 gdbserver_fork(thread_env);
132 } else {
133 pthread_mutex_unlock(&exclusive_lock);
134 pthread_mutex_unlock(&tcg_ctx.tb_ctx.tb_lock);
135 }
136 }
137
138 /* Wait for pending exclusive operations to complete. The exclusive lock
139 must be held. */
140 static inline void exclusive_idle(void)
141 {
142 while (pending_cpus) {
143 pthread_cond_wait(&exclusive_resume, &exclusive_lock);
144 }
145 }
146
147 /* Start an exclusive operation.
148 Must only be called from outside cpu_arm_exec. */
149 static inline void start_exclusive(void)
150 {
151 CPUState *other_cpu;
152
153 pthread_mutex_lock(&exclusive_lock);
154 exclusive_idle();
155
156 pending_cpus = 1;
157 /* Make all other cpus stop executing. */
158 for (other_cpu = first_cpu; other_cpu; other_cpu = other_cpu->next_cpu) {
159 if (other_cpu->running) {
160 pending_cpus++;
161 cpu_exit(other_cpu);
162 }
163 }
164 if (pending_cpus > 1) {
165 pthread_cond_wait(&exclusive_cond, &exclusive_lock);
166 }
167 }
168
169 /* Finish an exclusive operation. */
170 static inline void end_exclusive(void)
171 {
172 pending_cpus = 0;
173 pthread_cond_broadcast(&exclusive_resume);
174 pthread_mutex_unlock(&exclusive_lock);
175 }
176
177 /* Wait for exclusive ops to finish, and begin cpu execution. */
178 static inline void cpu_exec_start(CPUState *cpu)
179 {
180 pthread_mutex_lock(&exclusive_lock);
181 exclusive_idle();
182 cpu->running = true;
183 pthread_mutex_unlock(&exclusive_lock);
184 }
185
186 /* Mark cpu as not executing, and release pending exclusive ops. */
187 static inline void cpu_exec_end(CPUState *cpu)
188 {
189 pthread_mutex_lock(&exclusive_lock);
190 cpu->running = false;
191 if (pending_cpus > 1) {
192 pending_cpus--;
193 if (pending_cpus == 1) {
194 pthread_cond_signal(&exclusive_cond);
195 }
196 }
197 exclusive_idle();
198 pthread_mutex_unlock(&exclusive_lock);
199 }
200
201 void cpu_list_lock(void)
202 {
203 pthread_mutex_lock(&cpu_list_mutex);
204 }
205
206 void cpu_list_unlock(void)
207 {
208 pthread_mutex_unlock(&cpu_list_mutex);
209 }
210 #else /* if !CONFIG_USE_NPTL */
211 /* These are no-ops because we are not threadsafe. */
212 static inline void cpu_exec_start(CPUState *cpu)
213 {
214 }
215
216 static inline void cpu_exec_end(CPUState *cpu)
217 {
218 }
219
220 static inline void start_exclusive(void)
221 {
222 }
223
224 static inline void end_exclusive(void)
225 {
226 }
227
228 void fork_start(void)
229 {
230 }
231
232 void fork_end(int child)
233 {
234 if (child) {
235 gdbserver_fork(thread_env);
236 }
237 }
238
239 void cpu_list_lock(void)
240 {
241 }
242
243 void cpu_list_unlock(void)
244 {
245 }
246 #endif
247
248
249 #ifdef TARGET_I386
250 /***********************************************************/
251 /* CPUX86 core interface */
252
253 void cpu_smm_update(CPUX86State *env)
254 {
255 }
256
257 uint64_t cpu_get_tsc(CPUX86State *env)
258 {
259 return cpu_get_real_ticks();
260 }
261
262 static void write_dt(void *ptr, unsigned long addr, unsigned long limit,
263 int flags)
264 {
265 unsigned int e1, e2;
266 uint32_t *p;
267 e1 = (addr << 16) | (limit & 0xffff);
268 e2 = ((addr >> 16) & 0xff) | (addr & 0xff000000) | (limit & 0x000f0000);
269 e2 |= flags;
270 p = ptr;
271 p[0] = tswap32(e1);
272 p[1] = tswap32(e2);
273 }
274
275 static uint64_t *idt_table;
276 #ifdef TARGET_X86_64
277 static void set_gate64(void *ptr, unsigned int type, unsigned int dpl,
278 uint64_t addr, unsigned int sel)
279 {
280 uint32_t *p, e1, e2;
281 e1 = (addr & 0xffff) | (sel << 16);
282 e2 = (addr & 0xffff0000) | 0x8000 | (dpl << 13) | (type << 8);
283 p = ptr;
284 p[0] = tswap32(e1);
285 p[1] = tswap32(e2);
286 p[2] = tswap32(addr >> 32);
287 p[3] = 0;
288 }
289 /* only dpl matters as we do only user space emulation */
290 static void set_idt(int n, unsigned int dpl)
291 {
292 set_gate64(idt_table + n * 2, 0, dpl, 0, 0);
293 }
294 #else
295 static void set_gate(void *ptr, unsigned int type, unsigned int dpl,
296 uint32_t addr, unsigned int sel)
297 {
298 uint32_t *p, e1, e2;
299 e1 = (addr & 0xffff) | (sel << 16);
300 e2 = (addr & 0xffff0000) | 0x8000 | (dpl << 13) | (type << 8);
301 p = ptr;
302 p[0] = tswap32(e1);
303 p[1] = tswap32(e2);
304 }
305
306 /* only dpl matters as we do only user space emulation */
307 static void set_idt(int n, unsigned int dpl)
308 {
309 set_gate(idt_table + n, 0, dpl, 0, 0);
310 }
311 #endif
312
313 void cpu_loop(CPUX86State *env)
314 {
315 int trapnr;
316 abi_ulong pc;
317 target_siginfo_t info;
318
319 for(;;) {
320 trapnr = cpu_x86_exec(env);
321 switch(trapnr) {
322 case 0x80:
323 /* linux syscall from int $0x80 */
324 env->regs[R_EAX] = do_syscall(env,
325 env->regs[R_EAX],
326 env->regs[R_EBX],
327 env->regs[R_ECX],
328 env->regs[R_EDX],
329 env->regs[R_ESI],
330 env->regs[R_EDI],
331 env->regs[R_EBP],
332 0, 0);
333 break;
334 #ifndef TARGET_ABI32
335 case EXCP_SYSCALL:
336 /* linux syscall from syscall instruction */
337 env->regs[R_EAX] = do_syscall(env,
338 env->regs[R_EAX],
339 env->regs[R_EDI],
340 env->regs[R_ESI],
341 env->regs[R_EDX],
342 env->regs[10],
343 env->regs[8],
344 env->regs[9],
345 0, 0);
346 env->eip = env->exception_next_eip;
347 break;
348 #endif
349 case EXCP0B_NOSEG:
350 case EXCP0C_STACK:
351 info.si_signo = SIGBUS;
352 info.si_errno = 0;
353 info.si_code = TARGET_SI_KERNEL;
354 info._sifields._sigfault._addr = 0;
355 queue_signal(env, info.si_signo, &info);
356 break;
357 case EXCP0D_GPF:
358 /* XXX: potential problem if ABI32 */
359 #ifndef TARGET_X86_64
360 if (env->eflags & VM_MASK) {
361 handle_vm86_fault(env);
362 } else
363 #endif
364 {
365 info.si_signo = SIGSEGV;
366 info.si_errno = 0;
367 info.si_code = TARGET_SI_KERNEL;
368 info._sifields._sigfault._addr = 0;
369 queue_signal(env, info.si_signo, &info);
370 }
371 break;
372 case EXCP0E_PAGE:
373 info.si_signo = SIGSEGV;
374 info.si_errno = 0;
375 if (!(env->error_code & 1))
376 info.si_code = TARGET_SEGV_MAPERR;
377 else
378 info.si_code = TARGET_SEGV_ACCERR;
379 info._sifields._sigfault._addr = env->cr[2];
380 queue_signal(env, info.si_signo, &info);
381 break;
382 case EXCP00_DIVZ:
383 #ifndef TARGET_X86_64
384 if (env->eflags & VM_MASK) {
385 handle_vm86_trap(env, trapnr);
386 } else
387 #endif
388 {
389 /* division by zero */
390 info.si_signo = SIGFPE;
391 info.si_errno = 0;
392 info.si_code = TARGET_FPE_INTDIV;
393 info._sifields._sigfault._addr = env->eip;
394 queue_signal(env, info.si_signo, &info);
395 }
396 break;
397 case EXCP01_DB:
398 case EXCP03_INT3:
399 #ifndef TARGET_X86_64
400 if (env->eflags & VM_MASK) {
401 handle_vm86_trap(env, trapnr);
402 } else
403 #endif
404 {
405 info.si_signo = SIGTRAP;
406 info.si_errno = 0;
407 if (trapnr == EXCP01_DB) {
408 info.si_code = TARGET_TRAP_BRKPT;
409 info._sifields._sigfault._addr = env->eip;
410 } else {
411 info.si_code = TARGET_SI_KERNEL;
412 info._sifields._sigfault._addr = 0;
413 }
414 queue_signal(env, info.si_signo, &info);
415 }
416 break;
417 case EXCP04_INTO:
418 case EXCP05_BOUND:
419 #ifndef TARGET_X86_64
420 if (env->eflags & VM_MASK) {
421 handle_vm86_trap(env, trapnr);
422 } else
423 #endif
424 {
425 info.si_signo = SIGSEGV;
426 info.si_errno = 0;
427 info.si_code = TARGET_SI_KERNEL;
428 info._sifields._sigfault._addr = 0;
429 queue_signal(env, info.si_signo, &info);
430 }
431 break;
432 case EXCP06_ILLOP:
433 info.si_signo = SIGILL;
434 info.si_errno = 0;
435 info.si_code = TARGET_ILL_ILLOPN;
436 info._sifields._sigfault._addr = env->eip;
437 queue_signal(env, info.si_signo, &info);
438 break;
439 case EXCP_INTERRUPT:
440 /* just indicate that signals should be handled asap */
441 break;
442 case EXCP_DEBUG:
443 {
444 int sig;
445
446 sig = gdb_handlesig (env, TARGET_SIGTRAP);
447 if (sig)
448 {
449 info.si_signo = sig;
450 info.si_errno = 0;
451 info.si_code = TARGET_TRAP_BRKPT;
452 queue_signal(env, info.si_signo, &info);
453 }
454 }
455 break;
456 default:
457 pc = env->segs[R_CS].base + env->eip;
458 fprintf(stderr, "qemu: 0x%08lx: unhandled CPU exception 0x%x - aborting\n",
459 (long)pc, trapnr);
460 abort();
461 }
462 process_pending_signals(env);
463 }
464 }
465 #endif
466
467 #ifdef TARGET_ARM
468
469 #define get_user_code_u32(x, gaddr, doswap) \
470 ({ abi_long __r = get_user_u32((x), (gaddr)); \
471 if (!__r && (doswap)) { \
472 (x) = bswap32(x); \
473 } \
474 __r; \
475 })
476
477 #define get_user_code_u16(x, gaddr, doswap) \
478 ({ abi_long __r = get_user_u16((x), (gaddr)); \
479 if (!__r && (doswap)) { \
480 (x) = bswap16(x); \
481 } \
482 __r; \
483 })
484
485 /*
486 * See the Linux kernel's Documentation/arm/kernel_user_helpers.txt
487 * Input:
488 * r0 = pointer to oldval
489 * r1 = pointer to newval
490 * r2 = pointer to target value
491 *
492 * Output:
493 * r0 = 0 if *ptr was changed, non-0 if no exchange happened
494 * C set if *ptr was changed, clear if no exchange happened
495 *
496 * Note segv's in kernel helpers are a bit tricky, we can set the
497 * data address sensibly but the PC address is just the entry point.
498 */
499 static void arm_kernel_cmpxchg64_helper(CPUARMState *env)
500 {
501 uint64_t oldval, newval, val;
502 uint32_t addr, cpsr;
503 target_siginfo_t info;
504
505 /* Based on the 32 bit code in do_kernel_trap */
506
507 /* XXX: This only works between threads, not between processes.
508 It's probably possible to implement this with native host
509 operations. However things like ldrex/strex are much harder so
510 there's not much point trying. */
511 start_exclusive();
512 cpsr = cpsr_read(env);
513 addr = env->regs[2];
514
515 if (get_user_u64(oldval, env->regs[0])) {
516 env->cp15.c6_data = env->regs[0];
517 goto segv;
518 };
519
520 if (get_user_u64(newval, env->regs[1])) {
521 env->cp15.c6_data = env->regs[1];
522 goto segv;
523 };
524
525 if (get_user_u64(val, addr)) {
526 env->cp15.c6_data = addr;
527 goto segv;
528 }
529
530 if (val == oldval) {
531 val = newval;
532
533 if (put_user_u64(val, addr)) {
534 env->cp15.c6_data = addr;
535 goto segv;
536 };
537
538 env->regs[0] = 0;
539 cpsr |= CPSR_C;
540 } else {
541 env->regs[0] = -1;
542 cpsr &= ~CPSR_C;
543 }
544 cpsr_write(env, cpsr, CPSR_C);
545 end_exclusive();
546 return;
547
548 segv:
549 end_exclusive();
550 /* We get the PC of the entry address - which is as good as anything,
551 on a real kernel what you get depends on which mode it uses. */
552 info.si_signo = SIGSEGV;
553 info.si_errno = 0;
554 /* XXX: check env->error_code */
555 info.si_code = TARGET_SEGV_MAPERR;
556 info._sifields._sigfault._addr = env->cp15.c6_data;
557 queue_signal(env, info.si_signo, &info);
558
559 end_exclusive();
560 }
561
562 /* Handle a jump to the kernel code page. */
563 static int
564 do_kernel_trap(CPUARMState *env)
565 {
566 uint32_t addr;
567 uint32_t cpsr;
568 uint32_t val;
569
570 switch (env->regs[15]) {
571 case 0xffff0fa0: /* __kernel_memory_barrier */
572 /* ??? No-op. Will need to do better for SMP. */
573 break;
574 case 0xffff0fc0: /* __kernel_cmpxchg */
575 /* XXX: This only works between threads, not between processes.
576 It's probably possible to implement this with native host
577 operations. However things like ldrex/strex are much harder so
578 there's not much point trying. */
579 start_exclusive();
580 cpsr = cpsr_read(env);
581 addr = env->regs[2];
582 /* FIXME: This should SEGV if the access fails. */
583 if (get_user_u32(val, addr))
584 val = ~env->regs[0];
585 if (val == env->regs[0]) {
586 val = env->regs[1];
587 /* FIXME: Check for segfaults. */
588 put_user_u32(val, addr);
589 env->regs[0] = 0;
590 cpsr |= CPSR_C;
591 } else {
592 env->regs[0] = -1;
593 cpsr &= ~CPSR_C;
594 }
595 cpsr_write(env, cpsr, CPSR_C);
596 end_exclusive();
597 break;
598 case 0xffff0fe0: /* __kernel_get_tls */
599 env->regs[0] = env->cp15.c13_tls2;
600 break;
601 case 0xffff0f60: /* __kernel_cmpxchg64 */
602 arm_kernel_cmpxchg64_helper(env);
603 break;
604
605 default:
606 return 1;
607 }
608 /* Jump back to the caller. */
609 addr = env->regs[14];
610 if (addr & 1) {
611 env->thumb = 1;
612 addr &= ~1;
613 }
614 env->regs[15] = addr;
615
616 return 0;
617 }
618
619 static int do_strex(CPUARMState *env)
620 {
621 uint32_t val;
622 int size;
623 int rc = 1;
624 int segv = 0;
625 uint32_t addr;
626 start_exclusive();
627 addr = env->exclusive_addr;
628 if (addr != env->exclusive_test) {
629 goto fail;
630 }
631 size = env->exclusive_info & 0xf;
632 switch (size) {
633 case 0:
634 segv = get_user_u8(val, addr);
635 break;
636 case 1:
637 segv = get_user_u16(val, addr);
638 break;
639 case 2:
640 case 3:
641 segv = get_user_u32(val, addr);
642 break;
643 default:
644 abort();
645 }
646 if (segv) {
647 env->cp15.c6_data = addr;
648 goto done;
649 }
650 if (val != env->exclusive_val) {
651 goto fail;
652 }
653 if (size == 3) {
654 segv = get_user_u32(val, addr + 4);
655 if (segv) {
656 env->cp15.c6_data = addr + 4;
657 goto done;
658 }
659 if (val != env->exclusive_high) {
660 goto fail;
661 }
662 }
663 val = env->regs[(env->exclusive_info >> 8) & 0xf];
664 switch (size) {
665 case 0:
666 segv = put_user_u8(val, addr);
667 break;
668 case 1:
669 segv = put_user_u16(val, addr);
670 break;
671 case 2:
672 case 3:
673 segv = put_user_u32(val, addr);
674 break;
675 }
676 if (segv) {
677 env->cp15.c6_data = addr;
678 goto done;
679 }
680 if (size == 3) {
681 val = env->regs[(env->exclusive_info >> 12) & 0xf];
682 segv = put_user_u32(val, addr + 4);
683 if (segv) {
684 env->cp15.c6_data = addr + 4;
685 goto done;
686 }
687 }
688 rc = 0;
689 fail:
690 env->regs[15] += 4;
691 env->regs[(env->exclusive_info >> 4) & 0xf] = rc;
692 done:
693 end_exclusive();
694 return segv;
695 }
696
697 void cpu_loop(CPUARMState *env)
698 {
699 CPUState *cs = CPU(arm_env_get_cpu(env));
700 int trapnr;
701 unsigned int n, insn;
702 target_siginfo_t info;
703 uint32_t addr;
704
705 for(;;) {
706 cpu_exec_start(cs);
707 trapnr = cpu_arm_exec(env);
708 cpu_exec_end(cs);
709 switch(trapnr) {
710 case EXCP_UDEF:
711 {
712 TaskState *ts = env->opaque;
713 uint32_t opcode;
714 int rc;
715
716 /* we handle the FPU emulation here, as Linux */
717 /* we get the opcode */
718 /* FIXME - what to do if get_user() fails? */
719 get_user_code_u32(opcode, env->regs[15], env->bswap_code);
720
721 rc = EmulateAll(opcode, &ts->fpa, env);
722 if (rc == 0) { /* illegal instruction */
723 info.si_signo = SIGILL;
724 info.si_errno = 0;
725 info.si_code = TARGET_ILL_ILLOPN;
726 info._sifields._sigfault._addr = env->regs[15];
727 queue_signal(env, info.si_signo, &info);
728 } else if (rc < 0) { /* FP exception */
729 int arm_fpe=0;
730
731 /* translate softfloat flags to FPSR flags */
732 if (-rc & float_flag_invalid)
733 arm_fpe |= BIT_IOC;
734 if (-rc & float_flag_divbyzero)
735 arm_fpe |= BIT_DZC;
736 if (-rc & float_flag_overflow)
737 arm_fpe |= BIT_OFC;
738 if (-rc & float_flag_underflow)
739 arm_fpe |= BIT_UFC;
740 if (-rc & float_flag_inexact)
741 arm_fpe |= BIT_IXC;
742
743 FPSR fpsr = ts->fpa.fpsr;
744 //printf("fpsr 0x%x, arm_fpe 0x%x\n",fpsr,arm_fpe);
745
746 if (fpsr & (arm_fpe << 16)) { /* exception enabled? */
747 info.si_signo = SIGFPE;
748 info.si_errno = 0;
749
750 /* ordered by priority, least first */
751 if (arm_fpe & BIT_IXC) info.si_code = TARGET_FPE_FLTRES;
752 if (arm_fpe & BIT_UFC) info.si_code = TARGET_FPE_FLTUND;
753 if (arm_fpe & BIT_OFC) info.si_code = TARGET_FPE_FLTOVF;
754 if (arm_fpe & BIT_DZC) info.si_code = TARGET_FPE_FLTDIV;
755 if (arm_fpe & BIT_IOC) info.si_code = TARGET_FPE_FLTINV;
756
757 info._sifields._sigfault._addr = env->regs[15];
758 queue_signal(env, info.si_signo, &info);
759 } else {
760 env->regs[15] += 4;
761 }
762
763 /* accumulate unenabled exceptions */
764 if ((!(fpsr & BIT_IXE)) && (arm_fpe & BIT_IXC))
765 fpsr |= BIT_IXC;
766 if ((!(fpsr & BIT_UFE)) && (arm_fpe & BIT_UFC))
767 fpsr |= BIT_UFC;
768 if ((!(fpsr & BIT_OFE)) && (arm_fpe & BIT_OFC))
769 fpsr |= BIT_OFC;
770 if ((!(fpsr & BIT_DZE)) && (arm_fpe & BIT_DZC))
771 fpsr |= BIT_DZC;
772 if ((!(fpsr & BIT_IOE)) && (arm_fpe & BIT_IOC))
773 fpsr |= BIT_IOC;
774 ts->fpa.fpsr=fpsr;
775 } else { /* everything OK */
776 /* increment PC */
777 env->regs[15] += 4;
778 }
779 }
780 break;
781 case EXCP_SWI:
782 case EXCP_BKPT:
783 {
784 env->eabi = 1;
785 /* system call */
786 if (trapnr == EXCP_BKPT) {
787 if (env->thumb) {
788 /* FIXME - what to do if get_user() fails? */
789 get_user_code_u16(insn, env->regs[15], env->bswap_code);
790 n = insn & 0xff;
791 env->regs[15] += 2;
792 } else {
793 /* FIXME - what to do if get_user() fails? */
794 get_user_code_u32(insn, env->regs[15], env->bswap_code);
795 n = (insn & 0xf) | ((insn >> 4) & 0xff0);
796 env->regs[15] += 4;
797 }
798 } else {
799 if (env->thumb) {
800 /* FIXME - what to do if get_user() fails? */
801 get_user_code_u16(insn, env->regs[15] - 2,
802 env->bswap_code);
803 n = insn & 0xff;
804 } else {
805 /* FIXME - what to do if get_user() fails? */
806 get_user_code_u32(insn, env->regs[15] - 4,
807 env->bswap_code);
808 n = insn & 0xffffff;
809 }
810 }
811
812 if (n == ARM_NR_cacheflush) {
813 /* nop */
814 } else if (n == ARM_NR_semihosting
815 || n == ARM_NR_thumb_semihosting) {
816 env->regs[0] = do_arm_semihosting (env);
817 } else if (n == 0 || n >= ARM_SYSCALL_BASE || env->thumb) {
818 /* linux syscall */
819 if (env->thumb || n == 0) {
820 n = env->regs[7];
821 } else {
822 n -= ARM_SYSCALL_BASE;
823 env->eabi = 0;
824 }
825 if ( n > ARM_NR_BASE) {
826 switch (n) {
827 case ARM_NR_cacheflush:
828 /* nop */
829 break;
830 case ARM_NR_set_tls:
831 cpu_set_tls(env, env->regs[0]);
832 env->regs[0] = 0;
833 break;
834 default:
835 gemu_log("qemu: Unsupported ARM syscall: 0x%x\n",
836 n);
837 env->regs[0] = -TARGET_ENOSYS;
838 break;
839 }
840 } else {
841 env->regs[0] = do_syscall(env,
842 n,
843 env->regs[0],
844 env->regs[1],
845 env->regs[2],
846 env->regs[3],
847 env->regs[4],
848 env->regs[5],
849 0, 0);
850 }
851 } else {
852 goto error;
853 }
854 }
855 break;
856 case EXCP_INTERRUPT:
857 /* just indicate that signals should be handled asap */
858 break;
859 case EXCP_PREFETCH_ABORT:
860 addr = env->cp15.c6_insn;
861 goto do_segv;
862 case EXCP_DATA_ABORT:
863 addr = env->cp15.c6_data;
864 do_segv:
865 {
866 info.si_signo = SIGSEGV;
867 info.si_errno = 0;
868 /* XXX: check env->error_code */
869 info.si_code = TARGET_SEGV_MAPERR;
870 info._sifields._sigfault._addr = addr;
871 queue_signal(env, info.si_signo, &info);
872 }
873 break;
874 case EXCP_DEBUG:
875 {
876 int sig;
877
878 sig = gdb_handlesig (env, TARGET_SIGTRAP);
879 if (sig)
880 {
881 info.si_signo = sig;
882 info.si_errno = 0;
883 info.si_code = TARGET_TRAP_BRKPT;
884 queue_signal(env, info.si_signo, &info);
885 }
886 }
887 break;
888 case EXCP_KERNEL_TRAP:
889 if (do_kernel_trap(env))
890 goto error;
891 break;
892 case EXCP_STREX:
893 if (do_strex(env)) {
894 addr = env->cp15.c6_data;
895 goto do_segv;
896 }
897 break;
898 default:
899 error:
900 fprintf(stderr, "qemu: unhandled CPU exception 0x%x - aborting\n",
901 trapnr);
902 cpu_dump_state(cs, stderr, fprintf, 0);
903 abort();
904 }
905 process_pending_signals(env);
906 }
907 }
908
909 #endif
910
911 #ifdef TARGET_UNICORE32
912
913 void cpu_loop(CPUUniCore32State *env)
914 {
915 CPUState *cs = CPU(uc32_env_get_cpu(env));
916 int trapnr;
917 unsigned int n, insn;
918 target_siginfo_t info;
919
920 for (;;) {
921 cpu_exec_start(cs);
922 trapnr = uc32_cpu_exec(env);
923 cpu_exec_end(cs);
924 switch (trapnr) {
925 case UC32_EXCP_PRIV:
926 {
927 /* system call */
928 get_user_u32(insn, env->regs[31] - 4);
929 n = insn & 0xffffff;
930
931 if (n >= UC32_SYSCALL_BASE) {
932 /* linux syscall */
933 n -= UC32_SYSCALL_BASE;
934 if (n == UC32_SYSCALL_NR_set_tls) {
935 cpu_set_tls(env, env->regs[0]);
936 env->regs[0] = 0;
937 } else {
938 env->regs[0] = do_syscall(env,
939 n,
940 env->regs[0],
941 env->regs[1],
942 env->regs[2],
943 env->regs[3],
944 env->regs[4],
945 env->regs[5],
946 0, 0);
947 }
948 } else {
949 goto error;
950 }
951 }
952 break;
953 case UC32_EXCP_DTRAP:
954 case UC32_EXCP_ITRAP:
955 info.si_signo = SIGSEGV;
956 info.si_errno = 0;
957 /* XXX: check env->error_code */
958 info.si_code = TARGET_SEGV_MAPERR;
959 info._sifields._sigfault._addr = env->cp0.c4_faultaddr;
960 queue_signal(env, info.si_signo, &info);
961 break;
962 case EXCP_INTERRUPT:
963 /* just indicate that signals should be handled asap */
964 break;
965 case EXCP_DEBUG:
966 {
967 int sig;
968
969 sig = gdb_handlesig(env, TARGET_SIGTRAP);
970 if (sig) {
971 info.si_signo = sig;
972 info.si_errno = 0;
973 info.si_code = TARGET_TRAP_BRKPT;
974 queue_signal(env, info.si_signo, &info);
975 }
976 }
977 break;
978 default:
979 goto error;
980 }
981 process_pending_signals(env);
982 }
983
984 error:
985 fprintf(stderr, "qemu: unhandled CPU exception 0x%x - aborting\n", trapnr);
986 cpu_dump_state(cs, stderr, fprintf, 0);
987 abort();
988 }
989 #endif
990
991 #ifdef TARGET_SPARC
992 #define SPARC64_STACK_BIAS 2047
993
994 //#define DEBUG_WIN
995
996 /* WARNING: dealing with register windows _is_ complicated. More info
997 can be found at http://www.sics.se/~psm/sparcstack.html */
998 static inline int get_reg_index(CPUSPARCState *env, int cwp, int index)
999 {
1000 index = (index + cwp * 16) % (16 * env->nwindows);
1001 /* wrap handling : if cwp is on the last window, then we use the
1002 registers 'after' the end */
1003 if (index < 8 && env->cwp == env->nwindows - 1)
1004 index += 16 * env->nwindows;
1005 return index;
1006 }
1007
1008 /* save the register window 'cwp1' */
1009 static inline void save_window_offset(CPUSPARCState *env, int cwp1)
1010 {
1011 unsigned int i;
1012 abi_ulong sp_ptr;
1013
1014 sp_ptr = env->regbase[get_reg_index(env, cwp1, 6)];
1015 #ifdef TARGET_SPARC64
1016 if (sp_ptr & 3)
1017 sp_ptr += SPARC64_STACK_BIAS;
1018 #endif
1019 #if defined(DEBUG_WIN)
1020 printf("win_overflow: sp_ptr=0x" TARGET_ABI_FMT_lx " save_cwp=%d\n",
1021 sp_ptr, cwp1);
1022 #endif
1023 for(i = 0; i < 16; i++) {
1024 /* FIXME - what to do if put_user() fails? */
1025 put_user_ual(env->regbase[get_reg_index(env, cwp1, 8 + i)], sp_ptr);
1026 sp_ptr += sizeof(abi_ulong);
1027 }
1028 }
1029
1030 static void save_window(CPUSPARCState *env)
1031 {
1032 #ifndef TARGET_SPARC64
1033 unsigned int new_wim;
1034 new_wim = ((env->wim >> 1) | (env->wim << (env->nwindows - 1))) &
1035 ((1LL << env->nwindows) - 1);
1036 save_window_offset(env, cpu_cwp_dec(env, env->cwp - 2));
1037 env->wim = new_wim;
1038 #else
1039 save_window_offset(env, cpu_cwp_dec(env, env->cwp - 2));
1040 env->cansave++;
1041 env->canrestore--;
1042 #endif
1043 }
1044
1045 static void restore_window(CPUSPARCState *env)
1046 {
1047 #ifndef TARGET_SPARC64
1048 unsigned int new_wim;
1049 #endif
1050 unsigned int i, cwp1;
1051 abi_ulong sp_ptr;
1052
1053 #ifndef TARGET_SPARC64
1054 new_wim = ((env->wim << 1) | (env->wim >> (env->nwindows - 1))) &
1055 ((1LL << env->nwindows) - 1);
1056 #endif
1057
1058 /* restore the invalid window */
1059 cwp1 = cpu_cwp_inc(env, env->cwp + 1);
1060 sp_ptr = env->regbase[get_reg_index(env, cwp1, 6)];
1061 #ifdef TARGET_SPARC64
1062 if (sp_ptr & 3)
1063 sp_ptr += SPARC64_STACK_BIAS;
1064 #endif
1065 #if defined(DEBUG_WIN)
1066 printf("win_underflow: sp_ptr=0x" TARGET_ABI_FMT_lx " load_cwp=%d\n",
1067 sp_ptr, cwp1);
1068 #endif
1069 for(i = 0; i < 16; i++) {
1070 /* FIXME - what to do if get_user() fails? */
1071 get_user_ual(env->regbase[get_reg_index(env, cwp1, 8 + i)], sp_ptr);
1072 sp_ptr += sizeof(abi_ulong);
1073 }
1074 #ifdef TARGET_SPARC64
1075 env->canrestore++;
1076 if (env->cleanwin < env->nwindows - 1)
1077 env->cleanwin++;
1078 env->cansave--;
1079 #else
1080 env->wim = new_wim;
1081 #endif
1082 }
1083
1084 static void flush_windows(CPUSPARCState *env)
1085 {
1086 int offset, cwp1;
1087
1088 offset = 1;
1089 for(;;) {
1090 /* if restore would invoke restore_window(), then we can stop */
1091 cwp1 = cpu_cwp_inc(env, env->cwp + offset);
1092 #ifndef TARGET_SPARC64
1093 if (env->wim & (1 << cwp1))
1094 break;
1095 #else
1096 if (env->canrestore == 0)
1097 break;
1098 env->cansave++;
1099 env->canrestore--;
1100 #endif
1101 save_window_offset(env, cwp1);
1102 offset++;
1103 }
1104 cwp1 = cpu_cwp_inc(env, env->cwp + 1);
1105 #ifndef TARGET_SPARC64
1106 /* set wim so that restore will reload the registers */
1107 env->wim = 1 << cwp1;
1108 #endif
1109 #if defined(DEBUG_WIN)
1110 printf("flush_windows: nb=%d\n", offset - 1);
1111 #endif
1112 }
1113
1114 void cpu_loop (CPUSPARCState *env)
1115 {
1116 CPUState *cs = CPU(sparc_env_get_cpu(env));
1117 int trapnr;
1118 abi_long ret;
1119 target_siginfo_t info;
1120
1121 while (1) {
1122 trapnr = cpu_sparc_exec (env);
1123
1124 /* Compute PSR before exposing state. */
1125 if (env->cc_op != CC_OP_FLAGS) {
1126 cpu_get_psr(env);
1127 }
1128
1129 switch (trapnr) {
1130 #ifndef TARGET_SPARC64
1131 case 0x88:
1132 case 0x90:
1133 #else
1134 case 0x110:
1135 case 0x16d:
1136 #endif
1137 ret = do_syscall (env, env->gregs[1],
1138 env->regwptr[0], env->regwptr[1],
1139 env->regwptr[2], env->regwptr[3],
1140 env->regwptr[4], env->regwptr[5],
1141 0, 0);
1142 if ((abi_ulong)ret >= (abi_ulong)(-515)) {
1143 #if defined(TARGET_SPARC64) && !defined(TARGET_ABI32)
1144 env->xcc |= PSR_CARRY;
1145 #else
1146 env->psr |= PSR_CARRY;
1147 #endif
1148 ret = -ret;
1149 } else {
1150 #if defined(TARGET_SPARC64) && !defined(TARGET_ABI32)
1151 env->xcc &= ~PSR_CARRY;
1152 #else
1153 env->psr &= ~PSR_CARRY;
1154 #endif
1155 }
1156 env->regwptr[0] = ret;
1157 /* next instruction */
1158 env->pc = env->npc;
1159 env->npc = env->npc + 4;
1160 break;
1161 case 0x83: /* flush windows */
1162 #ifdef TARGET_ABI32
1163 case 0x103:
1164 #endif
1165 flush_windows(env);
1166 /* next instruction */
1167 env->pc = env->npc;
1168 env->npc = env->npc + 4;
1169 break;
1170 #ifndef TARGET_SPARC64
1171 case TT_WIN_OVF: /* window overflow */
1172 save_window(env);
1173 break;
1174 case TT_WIN_UNF: /* window underflow */
1175 restore_window(env);
1176 break;
1177 case TT_TFAULT:
1178 case TT_DFAULT:
1179 {
1180 info.si_signo = TARGET_SIGSEGV;
1181 info.si_errno = 0;
1182 /* XXX: check env->error_code */
1183 info.si_code = TARGET_SEGV_MAPERR;
1184 info._sifields._sigfault._addr = env->mmuregs[4];
1185 queue_signal(env, info.si_signo, &info);
1186 }
1187 break;
1188 #else
1189 case TT_SPILL: /* window overflow */
1190 save_window(env);
1191 break;
1192 case TT_FILL: /* window underflow */
1193 restore_window(env);
1194 break;
1195 case TT_TFAULT:
1196 case TT_DFAULT:
1197 {
1198 info.si_signo = TARGET_SIGSEGV;
1199 info.si_errno = 0;
1200 /* XXX: check env->error_code */
1201 info.si_code = TARGET_SEGV_MAPERR;
1202 if (trapnr == TT_DFAULT)
1203 info._sifields._sigfault._addr = env->dmmuregs[4];
1204 else
1205 info._sifields._sigfault._addr = cpu_tsptr(env)->tpc;
1206 queue_signal(env, info.si_signo, &info);
1207 }
1208 break;
1209 #ifndef TARGET_ABI32
1210 case 0x16e:
1211 flush_windows(env);
1212 sparc64_get_context(env);
1213 break;
1214 case 0x16f:
1215 flush_windows(env);
1216 sparc64_set_context(env);
1217 break;
1218 #endif
1219 #endif
1220 case EXCP_INTERRUPT:
1221 /* just indicate that signals should be handled asap */
1222 break;
1223 case TT_ILL_INSN:
1224 {
1225 info.si_signo = TARGET_SIGILL;
1226 info.si_errno = 0;
1227 info.si_code = TARGET_ILL_ILLOPC;
1228 info._sifields._sigfault._addr = env->pc;
1229 queue_signal(env, info.si_signo, &info);
1230 }
1231 break;
1232 case EXCP_DEBUG:
1233 {
1234 int sig;
1235
1236 sig = gdb_handlesig (env, TARGET_SIGTRAP);
1237 if (sig)
1238 {
1239 info.si_signo = sig;
1240 info.si_errno = 0;
1241 info.si_code = TARGET_TRAP_BRKPT;
1242 queue_signal(env, info.si_signo, &info);
1243 }
1244 }
1245 break;
1246 default:
1247 printf ("Unhandled trap: 0x%x\n", trapnr);
1248 cpu_dump_state(cs, stderr, fprintf, 0);
1249 exit (1);
1250 }
1251 process_pending_signals (env);
1252 }
1253 }
1254
1255 #endif
1256
1257 #ifdef TARGET_PPC
1258 static inline uint64_t cpu_ppc_get_tb(CPUPPCState *env)
1259 {
1260 /* TO FIX */
1261 return 0;
1262 }
1263
1264 uint64_t cpu_ppc_load_tbl(CPUPPCState *env)
1265 {
1266 return cpu_ppc_get_tb(env);
1267 }
1268
1269 uint32_t cpu_ppc_load_tbu(CPUPPCState *env)
1270 {
1271 return cpu_ppc_get_tb(env) >> 32;
1272 }
1273
1274 uint64_t cpu_ppc_load_atbl(CPUPPCState *env)
1275 {
1276 return cpu_ppc_get_tb(env);
1277 }
1278
1279 uint32_t cpu_ppc_load_atbu(CPUPPCState *env)
1280 {
1281 return cpu_ppc_get_tb(env) >> 32;
1282 }
1283
1284 uint32_t cpu_ppc601_load_rtcu(CPUPPCState *env)
1285 __attribute__ (( alias ("cpu_ppc_load_tbu") ));
1286
1287 uint32_t cpu_ppc601_load_rtcl(CPUPPCState *env)
1288 {
1289 return cpu_ppc_load_tbl(env) & 0x3FFFFF80;
1290 }
1291
1292 /* XXX: to be fixed */
1293 int ppc_dcr_read (ppc_dcr_t *dcr_env, int dcrn, uint32_t *valp)
1294 {
1295 return -1;
1296 }
1297
1298 int ppc_dcr_write (ppc_dcr_t *dcr_env, int dcrn, uint32_t val)
1299 {
1300 return -1;
1301 }
1302
1303 #define EXCP_DUMP(env, fmt, ...) \
1304 do { \
1305 fprintf(stderr, fmt , ## __VA_ARGS__); \
1306 cpu_dump_state(ENV_GET_CPU(env), stderr, fprintf, 0); \
1307 qemu_log(fmt, ## __VA_ARGS__); \
1308 if (qemu_log_enabled()) { \
1309 log_cpu_state(env, 0); \
1310 } \
1311 } while (0)
1312
1313 static int do_store_exclusive(CPUPPCState *env)
1314 {
1315 target_ulong addr;
1316 target_ulong page_addr;
1317 target_ulong val;
1318 int flags;
1319 int segv = 0;
1320
1321 addr = env->reserve_ea;
1322 page_addr = addr & TARGET_PAGE_MASK;
1323 start_exclusive();
1324 mmap_lock();
1325 flags = page_get_flags(page_addr);
1326 if ((flags & PAGE_READ) == 0) {
1327 segv = 1;
1328 } else {
1329 int reg = env->reserve_info & 0x1f;
1330 int size = (env->reserve_info >> 5) & 0xf;
1331 int stored = 0;
1332
1333 if (addr == env->reserve_addr) {
1334 switch (size) {
1335 case 1: segv = get_user_u8(val, addr); break;
1336 case 2: segv = get_user_u16(val, addr); break;
1337 case 4: segv = get_user_u32(val, addr); break;
1338 #if defined(TARGET_PPC64)
1339 case 8: segv = get_user_u64(val, addr); break;
1340 #endif
1341 default: abort();
1342 }
1343 if (!segv && val == env->reserve_val) {
1344 val = env->gpr[reg];
1345 switch (size) {
1346 case 1: segv = put_user_u8(val, addr); break;
1347 case 2: segv = put_user_u16(val, addr); break;
1348 case 4: segv = put_user_u32(val, addr); break;
1349 #if defined(TARGET_PPC64)
1350 case 8: segv = put_user_u64(val, addr); break;
1351 #endif
1352 default: abort();
1353 }
1354 if (!segv) {
1355 stored = 1;
1356 }
1357 }
1358 }
1359 env->crf[0] = (stored << 1) | xer_so;
1360 env->reserve_addr = (target_ulong)-1;
1361 }
1362 if (!segv) {
1363 env->nip += 4;
1364 }
1365 mmap_unlock();
1366 end_exclusive();
1367 return segv;
1368 }
1369
1370 void cpu_loop(CPUPPCState *env)
1371 {
1372 CPUState *cs = CPU(ppc_env_get_cpu(env));
1373 target_siginfo_t info;
1374 int trapnr;
1375 target_ulong ret;
1376
1377 for(;;) {
1378 cpu_exec_start(cs);
1379 trapnr = cpu_ppc_exec(env);
1380 cpu_exec_end(cs);
1381 switch(trapnr) {
1382 case POWERPC_EXCP_NONE:
1383 /* Just go on */
1384 break;
1385 case POWERPC_EXCP_CRITICAL: /* Critical input */
1386 cpu_abort(env, "Critical interrupt while in user mode. "
1387 "Aborting\n");
1388 break;
1389 case POWERPC_EXCP_MCHECK: /* Machine check exception */
1390 cpu_abort(env, "Machine check exception while in user mode. "
1391 "Aborting\n");
1392 break;
1393 case POWERPC_EXCP_DSI: /* Data storage exception */
1394 EXCP_DUMP(env, "Invalid data memory access: 0x" TARGET_FMT_lx "\n",
1395 env->spr[SPR_DAR]);
1396 /* XXX: check this. Seems bugged */
1397 switch (env->error_code & 0xFF000000) {
1398 case 0x40000000:
1399 info.si_signo = TARGET_SIGSEGV;
1400 info.si_errno = 0;
1401 info.si_code = TARGET_SEGV_MAPERR;
1402 break;
1403 case 0x04000000:
1404 info.si_signo = TARGET_SIGILL;
1405 info.si_errno = 0;
1406 info.si_code = TARGET_ILL_ILLADR;
1407 break;
1408 case 0x08000000:
1409 info.si_signo = TARGET_SIGSEGV;
1410 info.si_errno = 0;
1411 info.si_code = TARGET_SEGV_ACCERR;
1412 break;
1413 default:
1414 /* Let's send a regular segfault... */
1415 EXCP_DUMP(env, "Invalid segfault errno (%02x)\n",
1416 env->error_code);
1417 info.si_signo = TARGET_SIGSEGV;
1418 info.si_errno = 0;
1419 info.si_code = TARGET_SEGV_MAPERR;
1420 break;
1421 }
1422 info._sifields._sigfault._addr = env->nip;
1423 queue_signal(env, info.si_signo, &info);
1424 break;
1425 case POWERPC_EXCP_ISI: /* Instruction storage exception */
1426 EXCP_DUMP(env, "Invalid instruction fetch: 0x\n" TARGET_FMT_lx
1427 "\n", env->spr[SPR_SRR0]);
1428 /* XXX: check this */
1429 switch (env->error_code & 0xFF000000) {
1430 case 0x40000000:
1431 info.si_signo = TARGET_SIGSEGV;
1432 info.si_errno = 0;
1433 info.si_code = TARGET_SEGV_MAPERR;
1434 break;
1435 case 0x10000000:
1436 case 0x08000000:
1437 info.si_signo = TARGET_SIGSEGV;
1438 info.si_errno = 0;
1439 info.si_code = TARGET_SEGV_ACCERR;
1440 break;
1441 default:
1442 /* Let's send a regular segfault... */
1443 EXCP_DUMP(env, "Invalid segfault errno (%02x)\n",
1444 env->error_code);
1445 info.si_signo = TARGET_SIGSEGV;
1446 info.si_errno = 0;
1447 info.si_code = TARGET_SEGV_MAPERR;
1448 break;
1449 }
1450 info._sifields._sigfault._addr = env->nip - 4;
1451 queue_signal(env, info.si_signo, &info);
1452 break;
1453 case POWERPC_EXCP_EXTERNAL: /* External input */
1454 cpu_abort(env, "External interrupt while in user mode. "
1455 "Aborting\n");
1456 break;
1457 case POWERPC_EXCP_ALIGN: /* Alignment exception */
1458 EXCP_DUMP(env, "Unaligned memory access\n");
1459 /* XXX: check this */
1460 info.si_signo = TARGET_SIGBUS;
1461 info.si_errno = 0;
1462 info.si_code = TARGET_BUS_ADRALN;
1463 info._sifields._sigfault._addr = env->nip - 4;
1464 queue_signal(env, info.si_signo, &info);
1465 break;
1466 case POWERPC_EXCP_PROGRAM: /* Program exception */
1467 /* XXX: check this */
1468 switch (env->error_code & ~0xF) {
1469 case POWERPC_EXCP_FP:
1470 EXCP_DUMP(env, "Floating point program exception\n");
1471 info.si_signo = TARGET_SIGFPE;
1472 info.si_errno = 0;
1473 switch (env->error_code & 0xF) {
1474 case POWERPC_EXCP_FP_OX:
1475 info.si_code = TARGET_FPE_FLTOVF;
1476 break;
1477 case POWERPC_EXCP_FP_UX:
1478 info.si_code = TARGET_FPE_FLTUND;
1479 break;
1480 case POWERPC_EXCP_FP_ZX:
1481 case POWERPC_EXCP_FP_VXZDZ:
1482 info.si_code = TARGET_FPE_FLTDIV;
1483 break;
1484 case POWERPC_EXCP_FP_XX:
1485 info.si_code = TARGET_FPE_FLTRES;
1486 break;
1487 case POWERPC_EXCP_FP_VXSOFT:
1488 info.si_code = TARGET_FPE_FLTINV;
1489 break;
1490 case POWERPC_EXCP_FP_VXSNAN:
1491 case POWERPC_EXCP_FP_VXISI:
1492 case POWERPC_EXCP_FP_VXIDI:
1493 case POWERPC_EXCP_FP_VXIMZ:
1494 case POWERPC_EXCP_FP_VXVC:
1495 case POWERPC_EXCP_FP_VXSQRT:
1496 case POWERPC_EXCP_FP_VXCVI:
1497 info.si_code = TARGET_FPE_FLTSUB;
1498 break;
1499 default:
1500 EXCP_DUMP(env, "Unknown floating point exception (%02x)\n",
1501 env->error_code);
1502 break;
1503 }
1504 break;
1505 case POWERPC_EXCP_INVAL:
1506 EXCP_DUMP(env, "Invalid instruction\n");
1507 info.si_signo = TARGET_SIGILL;
1508 info.si_errno = 0;
1509 switch (env->error_code & 0xF) {
1510 case POWERPC_EXCP_INVAL_INVAL:
1511 info.si_code = TARGET_ILL_ILLOPC;
1512 break;
1513 case POWERPC_EXCP_INVAL_LSWX:
1514 info.si_code = TARGET_ILL_ILLOPN;
1515 break;
1516 case POWERPC_EXCP_INVAL_SPR:
1517 info.si_code = TARGET_ILL_PRVREG;
1518 break;
1519 case POWERPC_EXCP_INVAL_FP:
1520 info.si_code = TARGET_ILL_COPROC;
1521 break;
1522 default:
1523 EXCP_DUMP(env, "Unknown invalid operation (%02x)\n",
1524 env->error_code & 0xF);
1525 info.si_code = TARGET_ILL_ILLADR;
1526 break;
1527 }
1528 break;
1529 case POWERPC_EXCP_PRIV:
1530 EXCP_DUMP(env, "Privilege violation\n");
1531 info.si_signo = TARGET_SIGILL;
1532 info.si_errno = 0;
1533 switch (env->error_code & 0xF) {
1534 case POWERPC_EXCP_PRIV_OPC:
1535 info.si_code = TARGET_ILL_PRVOPC;
1536 break;
1537 case POWERPC_EXCP_PRIV_REG:
1538 info.si_code = TARGET_ILL_PRVREG;
1539 break;
1540 default:
1541 EXCP_DUMP(env, "Unknown privilege violation (%02x)\n",
1542 env->error_code & 0xF);
1543 info.si_code = TARGET_ILL_PRVOPC;
1544 break;
1545 }
1546 break;
1547 case POWERPC_EXCP_TRAP:
1548 cpu_abort(env, "Tried to call a TRAP\n");
1549 break;
1550 default:
1551 /* Should not happen ! */
1552 cpu_abort(env, "Unknown program exception (%02x)\n",
1553 env->error_code);
1554 break;
1555 }
1556 info._sifields._sigfault._addr = env->nip - 4;
1557 queue_signal(env, info.si_signo, &info);
1558 break;
1559 case POWERPC_EXCP_FPU: /* Floating-point unavailable exception */
1560 EXCP_DUMP(env, "No floating point allowed\n");
1561 info.si_signo = TARGET_SIGILL;
1562 info.si_errno = 0;
1563 info.si_code = TARGET_ILL_COPROC;
1564 info._sifields._sigfault._addr = env->nip - 4;
1565 queue_signal(env, info.si_signo, &info);
1566 break;
1567 case POWERPC_EXCP_SYSCALL: /* System call exception */
1568 cpu_abort(env, "Syscall exception while in user mode. "
1569 "Aborting\n");
1570 break;
1571 case POWERPC_EXCP_APU: /* Auxiliary processor unavailable */
1572 EXCP_DUMP(env, "No APU instruction allowed\n");
1573 info.si_signo = TARGET_SIGILL;
1574 info.si_errno = 0;
1575 info.si_code = TARGET_ILL_COPROC;
1576 info._sifields._sigfault._addr = env->nip - 4;
1577 queue_signal(env, info.si_signo, &info);
1578 break;
1579 case POWERPC_EXCP_DECR: /* Decrementer exception */
1580 cpu_abort(env, "Decrementer interrupt while in user mode. "
1581 "Aborting\n");
1582 break;
1583 case POWERPC_EXCP_FIT: /* Fixed-interval timer interrupt */
1584 cpu_abort(env, "Fix interval timer interrupt while in user mode. "
1585 "Aborting\n");
1586 break;
1587 case POWERPC_EXCP_WDT: /* Watchdog timer interrupt */
1588 cpu_abort(env, "Watchdog timer interrupt while in user mode. "
1589 "Aborting\n");
1590 break;
1591 case POWERPC_EXCP_DTLB: /* Data TLB error */
1592 cpu_abort(env, "Data TLB exception while in user mode. "
1593 "Aborting\n");
1594 break;
1595 case POWERPC_EXCP_ITLB: /* Instruction TLB error */
1596 cpu_abort(env, "Instruction TLB exception while in user mode. "
1597 "Aborting\n");
1598 break;
1599 case POWERPC_EXCP_SPEU: /* SPE/embedded floating-point unavail. */
1600 EXCP_DUMP(env, "No SPE/floating-point instruction allowed\n");
1601 info.si_signo = TARGET_SIGILL;
1602 info.si_errno = 0;
1603 info.si_code = TARGET_ILL_COPROC;
1604 info._sifields._sigfault._addr = env->nip - 4;
1605 queue_signal(env, info.si_signo, &info);
1606 break;
1607 case POWERPC_EXCP_EFPDI: /* Embedded floating-point data IRQ */
1608 cpu_abort(env, "Embedded floating-point data IRQ not handled\n");
1609 break;
1610 case POWERPC_EXCP_EFPRI: /* Embedded floating-point round IRQ */
1611 cpu_abort(env, "Embedded floating-point round IRQ not handled\n");
1612 break;
1613 case POWERPC_EXCP_EPERFM: /* Embedded performance monitor IRQ */
1614 cpu_abort(env, "Performance monitor exception not handled\n");
1615 break;
1616 case POWERPC_EXCP_DOORI: /* Embedded doorbell interrupt */
1617 cpu_abort(env, "Doorbell interrupt while in user mode. "
1618 "Aborting\n");
1619 break;
1620 case POWERPC_EXCP_DOORCI: /* Embedded doorbell critical interrupt */
1621 cpu_abort(env, "Doorbell critical interrupt while in user mode. "
1622 "Aborting\n");
1623 break;
1624 case POWERPC_EXCP_RESET: /* System reset exception */
1625 cpu_abort(env, "Reset interrupt while in user mode. "
1626 "Aborting\n");
1627 break;
1628 case POWERPC_EXCP_DSEG: /* Data segment exception */
1629 cpu_abort(env, "Data segment exception while in user mode. "
1630 "Aborting\n");
1631 break;
1632 case POWERPC_EXCP_ISEG: /* Instruction segment exception */
1633 cpu_abort(env, "Instruction segment exception "
1634 "while in user mode. Aborting\n");
1635 break;
1636 /* PowerPC 64 with hypervisor mode support */
1637 case POWERPC_EXCP_HDECR: /* Hypervisor decrementer exception */
1638 cpu_abort(env, "Hypervisor decrementer interrupt "
1639 "while in user mode. Aborting\n");
1640 break;
1641 case POWERPC_EXCP_TRACE: /* Trace exception */
1642 /* Nothing to do:
1643 * we use this exception to emulate step-by-step execution mode.
1644 */
1645 break;
1646 /* PowerPC 64 with hypervisor mode support */
1647 case POWERPC_EXCP_HDSI: /* Hypervisor data storage exception */
1648 cpu_abort(env, "Hypervisor data storage exception "
1649 "while in user mode. Aborting\n");
1650 break;
1651 case POWERPC_EXCP_HISI: /* Hypervisor instruction storage excp */
1652 cpu_abort(env, "Hypervisor instruction storage exception "
1653 "while in user mode. Aborting\n");
1654 break;
1655 case POWERPC_EXCP_HDSEG: /* Hypervisor data segment exception */
1656 cpu_abort(env, "Hypervisor data segment exception "
1657 "while in user mode. Aborting\n");
1658 break;
1659 case POWERPC_EXCP_HISEG: /* Hypervisor instruction segment excp */
1660 cpu_abort(env, "Hypervisor instruction segment exception "
1661 "while in user mode. Aborting\n");
1662 break;
1663 case POWERPC_EXCP_VPU: /* Vector unavailable exception */
1664 EXCP_DUMP(env, "No Altivec instructions allowed\n");
1665 info.si_signo = TARGET_SIGILL;
1666 info.si_errno = 0;
1667 info.si_code = TARGET_ILL_COPROC;
1668 info._sifields._sigfault._addr = env->nip - 4;
1669 queue_signal(env, info.si_signo, &info);
1670 break;
1671 case POWERPC_EXCP_PIT: /* Programmable interval timer IRQ */
1672 cpu_abort(env, "Programmable interval timer interrupt "
1673 "while in user mode. Aborting\n");
1674 break;
1675 case POWERPC_EXCP_IO: /* IO error exception */
1676 cpu_abort(env, "IO error exception while in user mode. "
1677 "Aborting\n");
1678 break;
1679 case POWERPC_EXCP_RUNM: /* Run mode exception */
1680 cpu_abort(env, "Run mode exception while in user mode. "
1681 "Aborting\n");
1682 break;
1683 case POWERPC_EXCP_EMUL: /* Emulation trap exception */
1684 cpu_abort(env, "Emulation trap exception not handled\n");
1685 break;
1686 case POWERPC_EXCP_IFTLB: /* Instruction fetch TLB error */
1687 cpu_abort(env, "Instruction fetch TLB exception "
1688 "while in user-mode. Aborting");
1689 break;
1690 case POWERPC_EXCP_DLTLB: /* Data load TLB miss */
1691 cpu_abort(env, "Data load TLB exception while in user-mode. "
1692 "Aborting");
1693 break;
1694 case POWERPC_EXCP_DSTLB: /* Data store TLB miss */
1695 cpu_abort(env, "Data store TLB exception while in user-mode. "
1696 "Aborting");
1697 break;
1698 case POWERPC_EXCP_FPA: /* Floating-point assist exception */
1699 cpu_abort(env, "Floating-point assist exception not handled\n");
1700 break;
1701 case POWERPC_EXCP_IABR: /* Instruction address breakpoint */
1702 cpu_abort(env, "Instruction address breakpoint exception "
1703 "not handled\n");
1704 break;
1705 case POWERPC_EXCP_SMI: /* System management interrupt */
1706 cpu_abort(env, "System management interrupt while in user mode. "
1707 "Aborting\n");
1708 break;
1709 case POWERPC_EXCP_THERM: /* Thermal interrupt */
1710 cpu_abort(env, "Thermal interrupt interrupt while in user mode. "
1711 "Aborting\n");
1712 break;
1713 case POWERPC_EXCP_PERFM: /* Embedded performance monitor IRQ */
1714 cpu_abort(env, "Performance monitor exception not handled\n");
1715 break;
1716 case POWERPC_EXCP_VPUA: /* Vector assist exception */
1717 cpu_abort(env, "Vector assist exception not handled\n");
1718 break;
1719 case POWERPC_EXCP_SOFTP: /* Soft patch exception */
1720 cpu_abort(env, "Soft patch exception not handled\n");
1721 break;
1722 case POWERPC_EXCP_MAINT: /* Maintenance exception */
1723 cpu_abort(env, "Maintenance exception while in user mode. "
1724 "Aborting\n");
1725 break;
1726 case POWERPC_EXCP_STOP: /* stop translation */
1727 /* We did invalidate the instruction cache. Go on */
1728 break;
1729 case POWERPC_EXCP_BRANCH: /* branch instruction: */
1730 /* We just stopped because of a branch. Go on */
1731 break;
1732 case POWERPC_EXCP_SYSCALL_USER:
1733 /* system call in user-mode emulation */
1734 /* WARNING:
1735 * PPC ABI uses overflow flag in cr0 to signal an error
1736 * in syscalls.
1737 */
1738 env->crf[0] &= ~0x1;
1739 ret = do_syscall(env, env->gpr[0], env->gpr[3], env->gpr[4],
1740 env->gpr[5], env->gpr[6], env->gpr[7],
1741 env->gpr[8], 0, 0);
1742 if (ret == (target_ulong)(-TARGET_QEMU_ESIGRETURN)) {
1743 /* Returning from a successful sigreturn syscall.
1744 Avoid corrupting register state. */
1745 break;
1746 }
1747 if (ret > (target_ulong)(-515)) {
1748 env->crf[0] |= 0x1;
1749 ret = -ret;
1750 }
1751 env->gpr[3] = ret;
1752 break;
1753 case POWERPC_EXCP_STCX:
1754 if (do_store_exclusive(env)) {
1755 info.si_signo = TARGET_SIGSEGV;
1756 info.si_errno = 0;
1757 info.si_code = TARGET_SEGV_MAPERR;
1758 info._sifields._sigfault._addr = env->nip;
1759 queue_signal(env, info.si_signo, &info);
1760 }
1761 break;
1762 case EXCP_DEBUG:
1763 {
1764 int sig;
1765
1766 sig = gdb_handlesig(env, TARGET_SIGTRAP);
1767 if (sig) {
1768 info.si_signo = sig;
1769 info.si_errno = 0;
1770 info.si_code = TARGET_TRAP_BRKPT;
1771 queue_signal(env, info.si_signo, &info);
1772 }
1773 }
1774 break;
1775 case EXCP_INTERRUPT:
1776 /* just indicate that signals should be handled asap */
1777 break;
1778 default:
1779 cpu_abort(env, "Unknown exception 0x%d. Aborting\n", trapnr);
1780 break;
1781 }
1782 process_pending_signals(env);
1783 }
1784 }
1785 #endif
1786
1787 #ifdef TARGET_MIPS
1788
1789 # ifdef TARGET_ABI_MIPSO32
1790 # define MIPS_SYS(name, args) args,
1791 static const uint8_t mips_syscall_args[] = {
1792 MIPS_SYS(sys_syscall , 8) /* 4000 */
1793 MIPS_SYS(sys_exit , 1)
1794 MIPS_SYS(sys_fork , 0)
1795 MIPS_SYS(sys_read , 3)
1796 MIPS_SYS(sys_write , 3)
1797 MIPS_SYS(sys_open , 3) /* 4005 */
1798 MIPS_SYS(sys_close , 1)
1799 MIPS_SYS(sys_waitpid , 3)
1800 MIPS_SYS(sys_creat , 2)
1801 MIPS_SYS(sys_link , 2)
1802 MIPS_SYS(sys_unlink , 1) /* 4010 */
1803 MIPS_SYS(sys_execve , 0)
1804 MIPS_SYS(sys_chdir , 1)
1805 MIPS_SYS(sys_time , 1)
1806 MIPS_SYS(sys_mknod , 3)
1807 MIPS_SYS(sys_chmod , 2) /* 4015 */
1808 MIPS_SYS(sys_lchown , 3)
1809 MIPS_SYS(sys_ni_syscall , 0)
1810 MIPS_SYS(sys_ni_syscall , 0) /* was sys_stat */
1811 MIPS_SYS(sys_lseek , 3)
1812 MIPS_SYS(sys_getpid , 0) /* 4020 */
1813 MIPS_SYS(sys_mount , 5)
1814 MIPS_SYS(sys_oldumount , 1)
1815 MIPS_SYS(sys_setuid , 1)
1816 MIPS_SYS(sys_getuid , 0)
1817 MIPS_SYS(sys_stime , 1) /* 4025 */
1818 MIPS_SYS(sys_ptrace , 4)
1819 MIPS_SYS(sys_alarm , 1)
1820 MIPS_SYS(sys_ni_syscall , 0) /* was sys_fstat */
1821 MIPS_SYS(sys_pause , 0)
1822 MIPS_SYS(sys_utime , 2) /* 4030 */
1823 MIPS_SYS(sys_ni_syscall , 0)
1824 MIPS_SYS(sys_ni_syscall , 0)
1825 MIPS_SYS(sys_access , 2)
1826 MIPS_SYS(sys_nice , 1)
1827 MIPS_SYS(sys_ni_syscall , 0) /* 4035 */
1828 MIPS_SYS(sys_sync , 0)
1829 MIPS_SYS(sys_kill , 2)
1830 MIPS_SYS(sys_rename , 2)
1831 MIPS_SYS(sys_mkdir , 2)
1832 MIPS_SYS(sys_rmdir , 1) /* 4040 */
1833 MIPS_SYS(sys_dup , 1)
1834 MIPS_SYS(sys_pipe , 0)
1835 MIPS_SYS(sys_times , 1)
1836 MIPS_SYS(sys_ni_syscall , 0)
1837 MIPS_SYS(sys_brk , 1) /* 4045 */
1838 MIPS_SYS(sys_setgid , 1)
1839 MIPS_SYS(sys_getgid , 0)
1840 MIPS_SYS(sys_ni_syscall , 0) /* was signal(2) */
1841 MIPS_SYS(sys_geteuid , 0)
1842 MIPS_SYS(sys_getegid , 0) /* 4050 */
1843 MIPS_SYS(sys_acct , 0)
1844 MIPS_SYS(sys_umount , 2)
1845 MIPS_SYS(sys_ni_syscall , 0)
1846 MIPS_SYS(sys_ioctl , 3)
1847 MIPS_SYS(sys_fcntl , 3) /* 4055 */
1848 MIPS_SYS(sys_ni_syscall , 2)
1849 MIPS_SYS(sys_setpgid , 2)
1850 MIPS_SYS(sys_ni_syscall , 0)
1851 MIPS_SYS(sys_olduname , 1)
1852 MIPS_SYS(sys_umask , 1) /* 4060 */
1853 MIPS_SYS(sys_chroot , 1)
1854 MIPS_SYS(sys_ustat , 2)
1855 MIPS_SYS(sys_dup2 , 2)
1856 MIPS_SYS(sys_getppid , 0)
1857 MIPS_SYS(sys_getpgrp , 0) /* 4065 */
1858 MIPS_SYS(sys_setsid , 0)
1859 MIPS_SYS(sys_sigaction , 3)
1860 MIPS_SYS(sys_sgetmask , 0)
1861 MIPS_SYS(sys_ssetmask , 1)
1862 MIPS_SYS(sys_setreuid , 2) /* 4070 */
1863 MIPS_SYS(sys_setregid , 2)
1864 MIPS_SYS(sys_sigsuspend , 0)
1865 MIPS_SYS(sys_sigpending , 1)
1866 MIPS_SYS(sys_sethostname , 2)
1867 MIPS_SYS(sys_setrlimit , 2) /* 4075 */
1868 MIPS_SYS(sys_getrlimit , 2)
1869 MIPS_SYS(sys_getrusage , 2)
1870 MIPS_SYS(sys_gettimeofday, 2)
1871 MIPS_SYS(sys_settimeofday, 2)
1872 MIPS_SYS(sys_getgroups , 2) /* 4080 */
1873 MIPS_SYS(sys_setgroups , 2)
1874 MIPS_SYS(sys_ni_syscall , 0) /* old_select */
1875 MIPS_SYS(sys_symlink , 2)
1876 MIPS_SYS(sys_ni_syscall , 0) /* was sys_lstat */
1877 MIPS_SYS(sys_readlink , 3) /* 4085 */
1878 MIPS_SYS(sys_uselib , 1)
1879 MIPS_SYS(sys_swapon , 2)
1880 MIPS_SYS(sys_reboot , 3)
1881 MIPS_SYS(old_readdir , 3)
1882 MIPS_SYS(old_mmap , 6) /* 4090 */
1883 MIPS_SYS(sys_munmap , 2)
1884 MIPS_SYS(sys_truncate , 2)
1885 MIPS_SYS(sys_ftruncate , 2)
1886 MIPS_SYS(sys_fchmod , 2)
1887 MIPS_SYS(sys_fchown , 3) /* 4095 */
1888 MIPS_SYS(sys_getpriority , 2)
1889 MIPS_SYS(sys_setpriority , 3)
1890 MIPS_SYS(sys_ni_syscall , 0)
1891 MIPS_SYS(sys_statfs , 2)
1892 MIPS_SYS(sys_fstatfs , 2) /* 4100 */
1893 MIPS_SYS(sys_ni_syscall , 0) /* was ioperm(2) */
1894 MIPS_SYS(sys_socketcall , 2)
1895 MIPS_SYS(sys_syslog , 3)
1896 MIPS_SYS(sys_setitimer , 3)
1897 MIPS_SYS(sys_getitimer , 2) /* 4105 */
1898 MIPS_SYS(sys_newstat , 2)
1899 MIPS_SYS(sys_newlstat , 2)
1900 MIPS_SYS(sys_newfstat , 2)
1901 MIPS_SYS(sys_uname , 1)
1902 MIPS_SYS(sys_ni_syscall , 0) /* 4110 was iopl(2) */
1903 MIPS_SYS(sys_vhangup , 0)
1904 MIPS_SYS(sys_ni_syscall , 0) /* was sys_idle() */
1905 MIPS_SYS(sys_ni_syscall , 0) /* was sys_vm86 */
1906 MIPS_SYS(sys_wait4 , 4)
1907 MIPS_SYS(sys_swapoff , 1) /* 4115 */
1908 MIPS_SYS(sys_sysinfo , 1)
1909 MIPS_SYS(sys_ipc , 6)
1910 MIPS_SYS(sys_fsync , 1)
1911 MIPS_SYS(sys_sigreturn , 0)
1912 MIPS_SYS(sys_clone , 6) /* 4120 */
1913 MIPS_SYS(sys_setdomainname, 2)
1914 MIPS_SYS(sys_newuname , 1)
1915 MIPS_SYS(sys_ni_syscall , 0) /* sys_modify_ldt */
1916 MIPS_SYS(sys_adjtimex , 1)
1917 MIPS_SYS(sys_mprotect , 3) /* 4125 */
1918 MIPS_SYS(sys_sigprocmask , 3)
1919 MIPS_SYS(sys_ni_syscall , 0) /* was create_module */
1920 MIPS_SYS(sys_init_module , 5)
1921 MIPS_SYS(sys_delete_module, 1)
1922 MIPS_SYS(sys_ni_syscall , 0) /* 4130 was get_kernel_syms */
1923 MIPS_SYS(sys_quotactl , 0)
1924 MIPS_SYS(sys_getpgid , 1)
1925 MIPS_SYS(sys_fchdir , 1)
1926 MIPS_SYS(sys_bdflush , 2)
1927 MIPS_SYS(sys_sysfs , 3) /* 4135 */
1928 MIPS_SYS(sys_personality , 1)
1929 MIPS_SYS(sys_ni_syscall , 0) /* for afs_syscall */
1930 MIPS_SYS(sys_setfsuid , 1)
1931 MIPS_SYS(sys_setfsgid , 1)
1932 MIPS_SYS(sys_llseek , 5) /* 4140 */
1933 MIPS_SYS(sys_getdents , 3)
1934 MIPS_SYS(sys_select , 5)
1935 MIPS_SYS(sys_flock , 2)
1936 MIPS_SYS(sys_msync , 3)
1937 MIPS_SYS(sys_readv , 3) /* 4145 */
1938 MIPS_SYS(sys_writev , 3)
1939 MIPS_SYS(sys_cacheflush , 3)
1940 MIPS_SYS(sys_cachectl , 3)
1941 MIPS_SYS(sys_sysmips , 4)
1942 MIPS_SYS(sys_ni_syscall , 0) /* 4150 */
1943 MIPS_SYS(sys_getsid , 1)
1944 MIPS_SYS(sys_fdatasync , 0)
1945 MIPS_SYS(sys_sysctl , 1)
1946 MIPS_SYS(sys_mlock , 2)
1947 MIPS_SYS(sys_munlock , 2) /* 4155 */
1948 MIPS_SYS(sys_mlockall , 1)
1949 MIPS_SYS(sys_munlockall , 0)
1950 MIPS_SYS(sys_sched_setparam, 2)
1951 MIPS_SYS(sys_sched_getparam, 2)
1952 MIPS_SYS(sys_sched_setscheduler, 3) /* 4160 */
1953 MIPS_SYS(sys_sched_getscheduler, 1)
1954 MIPS_SYS(sys_sched_yield , 0)
1955 MIPS_SYS(sys_sched_get_priority_max, 1)
1956 MIPS_SYS(sys_sched_get_priority_min, 1)
1957 MIPS_SYS(sys_sched_rr_get_interval, 2) /* 4165 */
1958 MIPS_SYS(sys_nanosleep, 2)
1959 MIPS_SYS(sys_mremap , 4)
1960 MIPS_SYS(sys_accept , 3)
1961 MIPS_SYS(sys_bind , 3)
1962 MIPS_SYS(sys_connect , 3) /* 4170 */
1963 MIPS_SYS(sys_getpeername , 3)
1964 MIPS_SYS(sys_getsockname , 3)
1965 MIPS_SYS(sys_getsockopt , 5)
1966 MIPS_SYS(sys_listen , 2)
1967 MIPS_SYS(sys_recv , 4) /* 4175 */
1968 MIPS_SYS(sys_recvfrom , 6)
1969 MIPS_SYS(sys_recvmsg , 3)
1970 MIPS_SYS(sys_send , 4)
1971 MIPS_SYS(sys_sendmsg , 3)
1972 MIPS_SYS(sys_sendto , 6) /* 4180 */
1973 MIPS_SYS(sys_setsockopt , 5)
1974 MIPS_SYS(sys_shutdown , 2)
1975 MIPS_SYS(sys_socket , 3)
1976 MIPS_SYS(sys_socketpair , 4)
1977 MIPS_SYS(sys_setresuid , 3) /* 4185 */
1978 MIPS_SYS(sys_getresuid , 3)
1979 MIPS_SYS(sys_ni_syscall , 0) /* was sys_query_module */
1980 MIPS_SYS(sys_poll , 3)
1981 MIPS_SYS(sys_nfsservctl , 3)
1982 MIPS_SYS(sys_setresgid , 3) /* 4190 */
1983 MIPS_SYS(sys_getresgid , 3)
1984 MIPS_SYS(sys_prctl , 5)
1985 MIPS_SYS(sys_rt_sigreturn, 0)
1986 MIPS_SYS(sys_rt_sigaction, 4)
1987 MIPS_SYS(sys_rt_sigprocmask, 4) /* 4195 */
1988 MIPS_SYS(sys_rt_sigpending, 2)
1989 MIPS_SYS(sys_rt_sigtimedwait, 4)
1990 MIPS_SYS(sys_rt_sigqueueinfo, 3)
1991 MIPS_SYS(sys_rt_sigsuspend, 0)
1992 MIPS_SYS(sys_pread64 , 6) /* 4200 */
1993 MIPS_SYS(sys_pwrite64 , 6)
1994 MIPS_SYS(sys_chown , 3)
1995 MIPS_SYS(sys_getcwd , 2)
1996 MIPS_SYS(sys_capget , 2)
1997 MIPS_SYS(sys_capset , 2) /* 4205 */
1998 MIPS_SYS(sys_sigaltstack , 2)
1999 MIPS_SYS(sys_sendfile , 4)
2000 MIPS_SYS(sys_ni_syscall , 0)
2001 MIPS_SYS(sys_ni_syscall , 0)
2002 MIPS_SYS(sys_mmap2 , 6) /* 4210 */
2003 MIPS_SYS(sys_truncate64 , 4)
2004 MIPS_SYS(sys_ftruncate64 , 4)
2005 MIPS_SYS(sys_stat64 , 2)
2006 MIPS_SYS(sys_lstat64 , 2)
2007 MIPS_SYS(sys_fstat64 , 2) /* 4215 */
2008 MIPS_SYS(sys_pivot_root , 2)
2009 MIPS_SYS(sys_mincore , 3)
2010 MIPS_SYS(sys_madvise , 3)
2011 MIPS_SYS(sys_getdents64 , 3)
2012 MIPS_SYS(sys_fcntl64 , 3) /* 4220 */
2013 MIPS_SYS(sys_ni_syscall , 0)
2014 MIPS_SYS(sys_gettid , 0)
2015 MIPS_SYS(sys_readahead , 5)
2016 MIPS_SYS(sys_setxattr , 5)
2017 MIPS_SYS(sys_lsetxattr , 5) /* 4225 */
2018 MIPS_SYS(sys_fsetxattr , 5)
2019 MIPS_SYS(sys_getxattr , 4)
2020 MIPS_SYS(sys_lgetxattr , 4)
2021 MIPS_SYS(sys_fgetxattr , 4)
2022 MIPS_SYS(sys_listxattr , 3) /* 4230 */
2023 MIPS_SYS(sys_llistxattr , 3)
2024 MIPS_SYS(sys_flistxattr , 3)
2025 MIPS_SYS(sys_removexattr , 2)
2026 MIPS_SYS(sys_lremovexattr, 2)
2027 MIPS_SYS(sys_fremovexattr, 2) /* 4235 */
2028 MIPS_SYS(sys_tkill , 2)
2029 MIPS_SYS(sys_sendfile64 , 5)
2030 MIPS_SYS(sys_futex , 2)
2031 MIPS_SYS(sys_sched_setaffinity, 3)
2032 MIPS_SYS(sys_sched_getaffinity, 3) /* 4240 */
2033 MIPS_SYS(sys_io_setup , 2)
2034 MIPS_SYS(sys_io_destroy , 1)
2035 MIPS_SYS(sys_io_getevents, 5)
2036 MIPS_SYS(sys_io_submit , 3)
2037 MIPS_SYS(sys_io_cancel , 3) /* 4245 */
2038 MIPS_SYS(sys_exit_group , 1)
2039 MIPS_SYS(sys_lookup_dcookie, 3)
2040 MIPS_SYS(sys_epoll_create, 1)
2041 MIPS_SYS(sys_epoll_ctl , 4)
2042 MIPS_SYS(sys_epoll_wait , 3) /* 4250 */
2043 MIPS_SYS(sys_remap_file_pages, 5)
2044 MIPS_SYS(sys_set_tid_address, 1)
2045 MIPS_SYS(sys_restart_syscall, 0)
2046 MIPS_SYS(sys_fadvise64_64, 7)
2047 MIPS_SYS(sys_statfs64 , 3) /* 4255 */
2048 MIPS_SYS(sys_fstatfs64 , 2)
2049 MIPS_SYS(sys_timer_create, 3)
2050 MIPS_SYS(sys_timer_settime, 4)
2051 MIPS_SYS(sys_timer_gettime, 2)
2052 MIPS_SYS(sys_timer_getoverrun, 1) /* 4260 */
2053 MIPS_SYS(sys_timer_delete, 1)
2054 MIPS_SYS(sys_clock_settime, 2)
2055 MIPS_SYS(sys_clock_gettime, 2)
2056 MIPS_SYS(sys_clock_getres, 2)
2057 MIPS_SYS(sys_clock_nanosleep, 4) /* 4265 */
2058 MIPS_SYS(sys_tgkill , 3)
2059 MIPS_SYS(sys_utimes , 2)
2060 MIPS_SYS(sys_mbind , 4)
2061 MIPS_SYS(sys_ni_syscall , 0) /* sys_get_mempolicy */
2062 MIPS_SYS(sys_ni_syscall , 0) /* 4270 sys_set_mempolicy */
2063 MIPS_SYS(sys_mq_open , 4)
2064 MIPS_SYS(sys_mq_unlink , 1)
2065 MIPS_SYS(sys_mq_timedsend, 5)
2066 MIPS_SYS(sys_mq_timedreceive, 5)
2067 MIPS_SYS(sys_mq_notify , 2) /* 4275 */
2068 MIPS_SYS(sys_mq_getsetattr, 3)
2069 MIPS_SYS(sys_ni_syscall , 0) /* sys_vserver */
2070 MIPS_SYS(sys_waitid , 4)
2071 MIPS_SYS(sys_ni_syscall , 0) /* available, was setaltroot */
2072 MIPS_SYS(sys_add_key , 5)
2073 MIPS_SYS(sys_request_key, 4)
2074 MIPS_SYS(sys_keyctl , 5)
2075 MIPS_SYS(sys_set_thread_area, 1)
2076 MIPS_SYS(sys_inotify_init, 0)
2077 MIPS_SYS(sys_inotify_add_watch, 3) /* 4285 */
2078 MIPS_SYS(sys_inotify_rm_watch, 2)
2079 MIPS_SYS(sys_migrate_pages, 4)
2080 MIPS_SYS(sys_openat, 4)
2081 MIPS_SYS(sys_mkdirat, 3)
2082 MIPS_SYS(sys_mknodat, 4) /* 4290 */
2083 MIPS_SYS(sys_fchownat, 5)
2084 MIPS_SYS(sys_futimesat, 3)
2085 MIPS_SYS(sys_fstatat64, 4)
2086 MIPS_SYS(sys_unlinkat, 3)
2087 MIPS_SYS(sys_renameat, 4) /* 4295 */
2088 MIPS_SYS(sys_linkat, 5)
2089 MIPS_SYS(sys_symlinkat, 3)
2090 MIPS_SYS(sys_readlinkat, 4)
2091 MIPS_SYS(sys_fchmodat, 3)
2092 MIPS_SYS(sys_faccessat, 3) /* 4300 */
2093 MIPS_SYS(sys_pselect6, 6)
2094 MIPS_SYS(sys_ppoll, 5)
2095 MIPS_SYS(sys_unshare, 1)
2096 MIPS_SYS(sys_splice, 4)
2097 MIPS_SYS(sys_sync_file_range, 7) /* 4305 */
2098 MIPS_SYS(sys_tee, 4)
2099 MIPS_SYS(sys_vmsplice, 4)
2100 MIPS_SYS(sys_move_pages, 6)
2101 MIPS_SYS(sys_set_robust_list, 2)
2102 MIPS_SYS(sys_get_robust_list, 3) /* 4310 */
2103 MIPS_SYS(sys_kexec_load, 4)
2104 MIPS_SYS(sys_getcpu, 3)
2105 MIPS_SYS(sys_epoll_pwait, 6)
2106 MIPS_SYS(sys_ioprio_set, 3)
2107 MIPS_SYS(sys_ioprio_get, 2)
2108 MIPS_SYS(sys_utimensat, 4)
2109 MIPS_SYS(sys_signalfd, 3)
2110 MIPS_SYS(sys_ni_syscall, 0) /* was timerfd */
2111 MIPS_SYS(sys_eventfd, 1)
2112 MIPS_SYS(sys_fallocate, 6) /* 4320 */
2113 MIPS_SYS(sys_timerfd_create, 2)
2114 MIPS_SYS(sys_timerfd_gettime, 2)
2115 MIPS_SYS(sys_timerfd_settime, 4)
2116 MIPS_SYS(sys_signalfd4, 4)
2117 MIPS_SYS(sys_eventfd2, 2) /* 4325 */
2118 MIPS_SYS(sys_epoll_create1, 1)
2119 MIPS_SYS(sys_dup3, 3)
2120 MIPS_SYS(sys_pipe2, 2)
2121 MIPS_SYS(sys_inotify_init1, 1)
2122 MIPS_SYS(sys_preadv, 6) /* 4330 */
2123 MIPS_SYS(sys_pwritev, 6)
2124 MIPS_SYS(sys_rt_tgsigqueueinfo, 4)
2125 MIPS_SYS(sys_perf_event_open, 5)
2126 MIPS_SYS(sys_accept4, 4)
2127 MIPS_SYS(sys_recvmmsg, 5) /* 4335 */
2128 MIPS_SYS(sys_fanotify_init, 2)
2129 MIPS_SYS(sys_fanotify_mark, 6)
2130 MIPS_SYS(sys_prlimit64, 4)
2131 MIPS_SYS(sys_name_to_handle_at, 5)
2132 MIPS_SYS(sys_open_by_handle_at, 3) /* 4340 */
2133 MIPS_SYS(sys_clock_adjtime, 2)
2134 MIPS_SYS(sys_syncfs, 1)
2135 };
2136 # undef MIPS_SYS
2137 # endif /* O32 */
2138
2139 static int do_store_exclusive(CPUMIPSState *env)
2140 {
2141 target_ulong addr;
2142 target_ulong page_addr;
2143 target_ulong val;
2144 int flags;
2145 int segv = 0;
2146 int reg;
2147 int d;
2148
2149 addr = env->lladdr;
2150 page_addr = addr & TARGET_PAGE_MASK;
2151 start_exclusive();
2152 mmap_lock();
2153 flags = page_get_flags(page_addr);
2154 if ((flags & PAGE_READ) == 0) {
2155 segv = 1;
2156 } else {
2157 reg = env->llreg & 0x1f;
2158 d = (env->llreg & 0x20) != 0;
2159 if (d) {
2160 segv = get_user_s64(val, addr);
2161 } else {
2162 segv = get_user_s32(val, addr);
2163 }
2164 if (!segv) {
2165 if (val != env->llval) {
2166 env->active_tc.gpr[reg] = 0;
2167 } else {
2168 if (d) {
2169 segv = put_user_u64(env->llnewval, addr);
2170 } else {
2171 segv = put_user_u32(env->llnewval, addr);
2172 }
2173 if (!segv) {
2174 env->active_tc.gpr[reg] = 1;
2175 }
2176 }
2177 }
2178 }
2179 env->lladdr = -1;
2180 if (!segv) {
2181 env->active_tc.PC += 4;
2182 }
2183 mmap_unlock();
2184 end_exclusive();
2185 return segv;
2186 }
2187
2188 /* Break codes */
2189 enum {
2190 BRK_OVERFLOW = 6,
2191 BRK_DIVZERO = 7
2192 };
2193
2194 static int do_break(CPUMIPSState *env, target_siginfo_t *info,
2195 unsigned int code)
2196 {
2197 int ret = -1;
2198
2199 switch (code) {
2200 case BRK_OVERFLOW:
2201 case BRK_DIVZERO:
2202 info->si_signo = TARGET_SIGFPE;
2203 info->si_errno = 0;
2204 info->si_code = (code == BRK_OVERFLOW) ? FPE_INTOVF : FPE_INTDIV;
2205 queue_signal(env, info->si_signo, &*info);
2206 ret = 0;
2207 break;
2208 default:
2209 break;
2210 }
2211
2212 return ret;
2213 }
2214
2215 void cpu_loop(CPUMIPSState *env)
2216 {
2217 CPUState *cs = CPU(mips_env_get_cpu(env));
2218 target_siginfo_t info;
2219 int trapnr;
2220 abi_long ret;
2221 # ifdef TARGET_ABI_MIPSO32
2222 unsigned int syscall_num;
2223 # endif
2224
2225 for(;;) {
2226 cpu_exec_start(cs);
2227 trapnr = cpu_mips_exec(env);
2228 cpu_exec_end(cs);
2229 switch(trapnr) {
2230 case EXCP_SYSCALL:
2231 env->active_tc.PC += 4;
2232 # ifdef TARGET_ABI_MIPSO32
2233 syscall_num = env->active_tc.gpr[2] - 4000;
2234 if (syscall_num >= sizeof(mips_syscall_args)) {
2235 ret = -TARGET_ENOSYS;
2236 } else {
2237 int nb_args;
2238 abi_ulong sp_reg;
2239 abi_ulong arg5 = 0, arg6 = 0, arg7 = 0, arg8 = 0;
2240
2241 nb_args = mips_syscall_args[syscall_num];
2242 sp_reg = env->active_tc.gpr[29];
2243 switch (nb_args) {
2244 /* these arguments are taken from the stack */
2245 case 8:
2246 if ((ret = get_user_ual(arg8, sp_reg + 28)) != 0) {
2247 goto done_syscall;
2248 }
2249 case 7:
2250 if ((ret = get_user_ual(arg7, sp_reg + 24)) != 0) {
2251 goto done_syscall;
2252 }
2253 case 6:
2254 if ((ret = get_user_ual(arg6, sp_reg + 20)) != 0) {
2255 goto done_syscall;
2256 }
2257 case 5:
2258 if ((ret = get_user_ual(arg5, sp_reg + 16)) != 0) {
2259 goto done_syscall;
2260 }
2261 default:
2262 break;
2263 }
2264 ret = do_syscall(env, env->active_tc.gpr[2],
2265 env->active_tc.gpr[4],
2266 env->active_tc.gpr[5],
2267 env->active_tc.gpr[6],
2268 env->active_tc.gpr[7],
2269 arg5, arg6, arg7, arg8);
2270 }
2271 done_syscall:
2272 # else
2273 ret = do_syscall(env, env->active_tc.gpr[2],
2274 env->active_tc.gpr[4], env->active_tc.gpr[5],
2275 env->active_tc.gpr[6], env->active_tc.gpr[7],
2276 env->active_tc.gpr[8], env->active_tc.gpr[9],
2277 env->active_tc.gpr[10], env->active_tc.gpr[11]);
2278 # endif /* O32 */
2279 if (ret == -TARGET_QEMU_ESIGRETURN) {
2280 /* Returning from a successful sigreturn syscall.
2281 Avoid clobbering register state. */
2282 break;
2283 }
2284 if ((abi_ulong)ret >= (abi_ulong)-1133) {
2285 env->active_tc.gpr[7] = 1; /* error flag */
2286 ret = -ret;
2287 } else {
2288 env->active_tc.gpr[7] = 0; /* error flag */
2289 }
2290 env->active_tc.gpr[2] = ret;
2291 break;
2292 case EXCP_TLBL:
2293 case EXCP_TLBS:
2294 case EXCP_AdEL:
2295 case EXCP_AdES:
2296 info.si_signo = TARGET_SIGSEGV;
2297 info.si_errno = 0;
2298 /* XXX: check env->error_code */
2299 info.si_code = TARGET_SEGV_MAPERR;
2300 info._sifields._sigfault._addr = env->CP0_BadVAddr;
2301 queue_signal(env, info.si_signo, &info);
2302 break;
2303 case EXCP_CpU:
2304 case EXCP_RI:
2305 info.si_signo = TARGET_SIGILL;
2306 info.si_errno = 0;
2307 info.si_code = 0;
2308 queue_signal(env, info.si_signo, &info);
2309 break;
2310 case EXCP_INTERRUPT:
2311 /* just indicate that signals should be handled asap */
2312 break;
2313 case EXCP_DEBUG:
2314 {
2315 int sig;
2316
2317 sig = gdb_handlesig (env, TARGET_SIGTRAP);
2318 if (sig)
2319 {
2320 info.si_signo = sig;
2321 info.si_errno = 0;
2322 info.si_code = TARGET_TRAP_BRKPT;
2323 queue_signal(env, info.si_signo, &info);
2324 }
2325 }
2326 break;
2327 case EXCP_SC:
2328 if (do_store_exclusive(env)) {
2329 info.si_signo = TARGET_SIGSEGV;
2330 info.si_errno = 0;
2331 info.si_code = TARGET_SEGV_MAPERR;
2332 info._sifields._sigfault._addr = env->active_tc.PC;
2333 queue_signal(env, info.si_signo, &info);
2334 }
2335 break;
2336 case EXCP_DSPDIS:
2337 info.si_signo = TARGET_SIGILL;
2338 info.si_errno = 0;
2339 info.si_code = TARGET_ILL_ILLOPC;
2340 queue_signal(env, info.si_signo, &info);
2341 break;
2342 /* The code below was inspired by the MIPS Linux kernel trap
2343 * handling code in arch/mips/kernel/traps.c.
2344 */
2345 case EXCP_BREAK:
2346 {
2347 abi_ulong trap_instr;
2348 unsigned int code;
2349
2350 ret = get_user_ual(trap_instr, env->active_tc.PC);
2351 if (ret != 0) {
2352 goto error;
2353 }
2354
2355 /* As described in the original Linux kernel code, the
2356 * below checks on 'code' are to work around an old
2357 * assembly bug.
2358 */
2359 code = ((trap_instr >> 6) & ((1 << 20) - 1));
2360 if (code >= (1 << 10)) {
2361 code >>= 10;
2362 }
2363
2364 if (do_break(env, &info, code) != 0) {
2365 goto error;
2366 }
2367 }
2368 break;
2369 case EXCP_TRAP:
2370 {
2371 abi_ulong trap_instr;
2372 unsigned int code = 0;
2373
2374 ret = get_user_ual(trap_instr, env->active_tc.PC);
2375 if (ret != 0) {
2376 goto error;
2377 }
2378
2379 /* The immediate versions don't provide a code. */
2380 if (!(trap_instr & 0xFC000000)) {
2381 code = ((trap_instr >> 6) & ((1 << 10) - 1));
2382 }
2383
2384 if (do_break(env, &info, code) != 0) {
2385 goto error;
2386 }
2387 }
2388 break;
2389 default:
2390 error:
2391 fprintf(stderr, "qemu: unhandled CPU exception 0x%x - aborting\n",
2392 trapnr);
2393 cpu_dump_state(cs, stderr, fprintf, 0);
2394 abort();
2395 }
2396 process_pending_signals(env);
2397 }
2398 }
2399 #endif
2400
2401 #ifdef TARGET_OPENRISC
2402
2403 void cpu_loop(CPUOpenRISCState *env)
2404 {
2405 CPUState *cs = CPU(openrisc_env_get_cpu(env));
2406 int trapnr, gdbsig;
2407
2408 for (;;) {
2409 trapnr = cpu_exec(env);
2410 gdbsig = 0;
2411
2412 switch (trapnr) {
2413 case EXCP_RESET:
2414 qemu_log("\nReset request, exit, pc is %#x\n", env->pc);
2415 exit(1);
2416 break;
2417 case EXCP_BUSERR:
2418 qemu_log("\nBus error, exit, pc is %#x\n", env->pc);
2419 gdbsig = SIGBUS;
2420 break;
2421 case EXCP_DPF:
2422 case EXCP_IPF:
2423 cpu_dump_state(cs, stderr, fprintf, 0);
2424 gdbsig = TARGET_SIGSEGV;
2425 break;
2426 case EXCP_TICK:
2427 qemu_log("\nTick time interrupt pc is %#x\n", env->pc);
2428 break;
2429 case EXCP_ALIGN:
2430 qemu_log("\nAlignment pc is %#x\n", env->pc);
2431 gdbsig = SIGBUS;
2432 break;
2433 case EXCP_ILLEGAL:
2434 qemu_log("\nIllegal instructionpc is %#x\n", env->pc);
2435 gdbsig = SIGILL;
2436 break;
2437 case EXCP_INT:
2438 qemu_log("\nExternal interruptpc is %#x\n", env->pc);
2439 break;
2440 case EXCP_DTLBMISS:
2441 case EXCP_ITLBMISS:
2442 qemu_log("\nTLB miss\n");
2443 break;
2444 case EXCP_RANGE:
2445 qemu_log("\nRange\n");
2446 gdbsig = SIGSEGV;
2447 break;
2448 case EXCP_SYSCALL:
2449 env->pc += 4; /* 0xc00; */
2450 env->gpr[11] = do_syscall(env,
2451 env->gpr[11], /* return value */
2452 env->gpr[3], /* r3 - r7 are params */
2453 env->gpr[4],
2454 env->gpr[5],
2455 env->gpr[6],
2456 env->gpr[7],
2457 env->gpr[8], 0, 0);
2458 break;
2459 case EXCP_FPE:
2460 qemu_log("\nFloating point error\n");
2461 break;
2462 case EXCP_TRAP:
2463 qemu_log("\nTrap\n");
2464 gdbsig = SIGTRAP;
2465 break;
2466 case EXCP_NR:
2467 qemu_log("\nNR\n");
2468 break;
2469 default:
2470 qemu_log("\nqemu: unhandled CPU exception %#x - aborting\n",
2471 trapnr);
2472 cpu_dump_state(cs, stderr, fprintf, 0);
2473 gdbsig = TARGET_SIGILL;
2474 break;
2475 }
2476 if (gdbsig) {
2477 gdb_handlesig(env, gdbsig);
2478 if (gdbsig != TARGET_SIGTRAP) {
2479 exit(1);
2480 }
2481 }
2482
2483 process_pending_signals(env);
2484 }
2485 }
2486
2487 #endif /* TARGET_OPENRISC */
2488
2489 #ifdef TARGET_SH4
2490 void cpu_loop(CPUSH4State *env)
2491 {
2492 CPUState *cs = CPU(sh_env_get_cpu(env));
2493 int trapnr, ret;
2494 target_siginfo_t info;
2495
2496 while (1) {
2497 trapnr = cpu_sh4_exec (env);
2498
2499 switch (trapnr) {
2500 case 0x160:
2501 env->pc += 2;
2502 ret = do_syscall(env,
2503 env->gregs[3],
2504 env->gregs[4],
2505 env->gregs[5],
2506 env->gregs[6],
2507 env->gregs[7],
2508 env->gregs[0],
2509 env->gregs[1],
2510 0, 0);
2511 env->gregs[0] = ret;
2512 break;
2513 case EXCP_INTERRUPT:
2514 /* just indicate that signals should be handled asap */
2515 break;
2516 case EXCP_DEBUG:
2517 {
2518 int sig;
2519
2520 sig = gdb_handlesig (env, TARGET_SIGTRAP);
2521 if (sig)
2522 {
2523 info.si_signo = sig;
2524 info.si_errno = 0;
2525 info.si_code = TARGET_TRAP_BRKPT;
2526 queue_signal(env, info.si_signo, &info);
2527 }
2528 }
2529 break;
2530 case 0xa0:
2531 case 0xc0:
2532 info.si_signo = SIGSEGV;
2533 info.si_errno = 0;
2534 info.si_code = TARGET_SEGV_MAPERR;
2535 info._sifields._sigfault._addr = env->tea;
2536 queue_signal(env, info.si_signo, &info);
2537 break;
2538
2539 default:
2540 printf ("Unhandled trap: 0x%x\n", trapnr);
2541 cpu_dump_state(cs, stderr, fprintf, 0);
2542 exit (1);
2543 }
2544 process_pending_signals (env);
2545 }
2546 }
2547 #endif
2548
2549 #ifdef TARGET_CRIS
2550 void cpu_loop(CPUCRISState *env)
2551 {
2552 CPUState *cs = CPU(cris_env_get_cpu(env));
2553 int trapnr, ret;
2554 target_siginfo_t info;
2555
2556 while (1) {
2557 trapnr = cpu_cris_exec (env);
2558 switch (trapnr) {
2559 case 0xaa:
2560 {
2561 info.si_signo = SIGSEGV;
2562 info.si_errno = 0;
2563 /* XXX: check env->error_code */
2564 info.si_code = TARGET_SEGV_MAPERR;
2565 info._sifields._sigfault._addr = env->pregs[PR_EDA];
2566 queue_signal(env, info.si_signo, &info);
2567 }
2568 break;
2569 case EXCP_INTERRUPT:
2570 /* just indicate that signals should be handled asap */
2571 break;
2572 case EXCP_BREAK:
2573 ret = do_syscall(env,
2574 env->regs[9],
2575 env->regs[10],
2576 env->regs[11],
2577 env->regs[12],
2578 env->regs[13],
2579 env->pregs[7],
2580 env->pregs[11],
2581 0, 0);
2582 env->regs[10] = ret;
2583 break;
2584 case EXCP_DEBUG:
2585 {
2586 int sig;
2587
2588 sig = gdb_handlesig (env, TARGET_SIGTRAP);
2589 if (sig)
2590 {
2591 info.si_signo = sig;
2592 info.si_errno = 0;
2593 info.si_code = TARGET_TRAP_BRKPT;
2594 queue_signal(env, info.si_signo, &info);
2595 }
2596 }
2597 break;
2598 default:
2599 printf ("Unhandled trap: 0x%x\n", trapnr);
2600 cpu_dump_state(cs, stderr, fprintf, 0);
2601 exit (1);
2602 }
2603 process_pending_signals (env);
2604 }
2605 }
2606 #endif
2607
2608 #ifdef TARGET_MICROBLAZE
2609 void cpu_loop(CPUMBState *env)
2610 {
2611 CPUState *cs = CPU(mb_env_get_cpu(env));
2612 int trapnr, ret;
2613 target_siginfo_t info;
2614
2615 while (1) {
2616 trapnr = cpu_mb_exec (env);
2617 switch (trapnr) {
2618 case 0xaa:
2619 {
2620 info.si_signo = SIGSEGV;
2621 info.si_errno = 0;
2622 /* XXX: check env->error_code */
2623 info.si_code = TARGET_SEGV_MAPERR;
2624 info._sifields._sigfault._addr = 0;
2625 queue_signal(env, info.si_signo, &info);
2626 }
2627 break;
2628 case EXCP_INTERRUPT:
2629 /* just indicate that signals should be handled asap */
2630 break;
2631 case EXCP_BREAK:
2632 /* Return address is 4 bytes after the call. */
2633 env->regs[14] += 4;
2634 env->sregs[SR_PC] = env->regs[14];
2635 ret = do_syscall(env,
2636 env->regs[12],
2637 env->regs[5],
2638 env->regs[6],
2639 env->regs[7],
2640 env->regs[8],
2641 env->regs[9],
2642 env->regs[10],
2643 0, 0);
2644 env->regs[3] = ret;
2645 break;
2646 case EXCP_HW_EXCP:
2647 env->regs[17] = env->sregs[SR_PC] + 4;
2648 if (env->iflags & D_FLAG) {
2649 env->sregs[SR_ESR] |= 1 << 12;
2650 env->sregs[SR_PC] -= 4;
2651 /* FIXME: if branch was immed, replay the imm as well. */
2652 }
2653
2654 env->iflags &= ~(IMM_FLAG | D_FLAG);
2655
2656 switch (env->sregs[SR_ESR] & 31) {
2657 case ESR_EC_DIVZERO:
2658 info.si_signo = SIGFPE;
2659 info.si_errno = 0;
2660 info.si_code = TARGET_FPE_FLTDIV;
2661 info._sifields._sigfault._addr = 0;
2662 queue_signal(env, info.si_signo, &info);
2663 break;
2664 case ESR_EC_FPU:
2665 info.si_signo = SIGFPE;
2666 info.si_errno = 0;
2667 if (env->sregs[SR_FSR] & FSR_IO) {
2668 info.si_code = TARGET_FPE_FLTINV;
2669 }
2670 if (env->sregs[SR_FSR] & FSR_DZ) {
2671 info.si_code = TARGET_FPE_FLTDIV;
2672 }
2673 info._sifields._sigfault._addr = 0;
2674 queue_signal(env, info.si_signo, &info);
2675 break;
2676 default:
2677 printf ("Unhandled hw-exception: 0x%x\n",
2678 env->sregs[SR_ESR] & ESR_EC_MASK);
2679 cpu_dump_state(cs, stderr, fprintf, 0);
2680 exit (1);
2681 break;
2682 }
2683 break;
2684 case EXCP_DEBUG:
2685 {
2686 int sig;
2687
2688 sig = gdb_handlesig (env, TARGET_SIGTRAP);
2689 if (sig)
2690 {
2691 info.si_signo = sig;
2692 info.si_errno = 0;
2693 info.si_code = TARGET_TRAP_BRKPT;
2694 queue_signal(env, info.si_signo, &info);
2695 }
2696 }
2697 break;
2698 default:
2699 printf ("Unhandled trap: 0x%x\n", trapnr);
2700 cpu_dump_state(cs, stderr, fprintf, 0);
2701 exit (1);
2702 }
2703 process_pending_signals (env);
2704 }
2705 }
2706 #endif
2707
2708 #ifdef TARGET_M68K
2709
2710 void cpu_loop(CPUM68KState *env)
2711 {
2712 CPUState *cs = CPU(m68k_env_get_cpu(env));
2713 int trapnr;
2714 unsigned int n;
2715 target_siginfo_t info;
2716 TaskState *ts = env->opaque;
2717
2718 for(;;) {
2719 trapnr = cpu_m68k_exec(env);
2720 switch(trapnr) {
2721 case EXCP_ILLEGAL:
2722 {
2723 if (ts->sim_syscalls) {
2724 uint16_t nr;
2725 nr = lduw(env->pc + 2);
2726 env->pc += 4;
2727 do_m68k_simcall(env, nr);
2728 } else {
2729 goto do_sigill;
2730 }
2731 }
2732 break;
2733 case EXCP_HALT_INSN:
2734 /* Semihosing syscall. */
2735 env->pc += 4;
2736 do_m68k_semihosting(env, env->dregs[0]);
2737 break;
2738 case EXCP_LINEA:
2739 case EXCP_LINEF:
2740 case EXCP_UNSUPPORTED:
2741 do_sigill:
2742 info.si_signo = SIGILL;
2743 info.si_errno = 0;
2744 info.si_code = TARGET_ILL_ILLOPN;
2745 info._sifields._sigfault._addr = env->pc;
2746 queue_signal(env, info.si_signo, &info);
2747 break;
2748 case EXCP_TRAP0:
2749 {
2750 ts->sim_syscalls = 0;
2751 n = env->dregs[0];
2752 env->pc += 2;
2753 env->dregs[0] = do_syscall(env,
2754 n,
2755 env->dregs[1],
2756 env->dregs[2],
2757 env->dregs[3],
2758 env->dregs[4],
2759 env->dregs[5],
2760 env->aregs[0],
2761 0, 0);
2762 }
2763 break;
2764 case EXCP_INTERRUPT:
2765 /* just indicate that signals should be handled asap */
2766 break;
2767 case EXCP_ACCESS:
2768 {
2769 info.si_signo = SIGSEGV;
2770 info.si_errno = 0;
2771 /* XXX: check env->error_code */
2772 info.si_code = TARGET_SEGV_MAPERR;
2773 info._sifields._sigfault._addr = env->mmu.ar;
2774 queue_signal(env, info.si_signo, &info);
2775 }
2776 break;
2777 case EXCP_DEBUG:
2778 {
2779 int sig;
2780
2781 sig = gdb_handlesig (env, TARGET_SIGTRAP);
2782 if (sig)
2783 {
2784 info.si_signo = sig;
2785 info.si_errno = 0;
2786 info.si_code = TARGET_TRAP_BRKPT;
2787 queue_signal(env, info.si_signo, &info);
2788 }
2789 }
2790 break;
2791 default:
2792 fprintf(stderr, "qemu: unhandled CPU exception 0x%x - aborting\n",
2793 trapnr);
2794 cpu_dump_state(cs, stderr, fprintf, 0);
2795 abort();
2796 }
2797 process_pending_signals(env);
2798 }
2799 }
2800 #endif /* TARGET_M68K */
2801
2802 #ifdef TARGET_ALPHA
2803 static void do_store_exclusive(CPUAlphaState *env, int reg, int quad)
2804 {
2805 target_ulong addr, val, tmp;
2806 target_siginfo_t info;
2807 int ret = 0;
2808
2809 addr = env->lock_addr;
2810 tmp = env->lock_st_addr;
2811 env->lock_addr = -1;
2812 env->lock_st_addr = 0;
2813
2814 start_exclusive();
2815 mmap_lock();
2816
2817 if (addr == tmp) {
2818 if (quad ? get_user_s64(val, addr) : get_user_s32(val, addr)) {
2819 goto do_sigsegv;
2820 }
2821
2822 if (val == env->lock_value) {
2823 tmp = env->ir[reg];
2824 if (quad ? put_user_u64(tmp, addr) : put_user_u32(tmp, addr)) {
2825 goto do_sigsegv;
2826 }
2827 ret = 1;
2828 }
2829 }
2830 env->ir[reg] = ret;
2831 env->pc += 4;
2832
2833 mmap_unlock();
2834 end_exclusive();
2835 return;
2836
2837 do_sigsegv:
2838 mmap_unlock();
2839 end_exclusive();
2840
2841 info.si_signo = TARGET_SIGSEGV;
2842 info.si_errno = 0;
2843 info.si_code = TARGET_SEGV_MAPERR;
2844 info._sifields._sigfault._addr = addr;
2845 queue_signal(env, TARGET_SIGSEGV, &info);
2846 }
2847
2848 void cpu_loop(CPUAlphaState *env)
2849 {
2850 CPUState *cs = CPU(alpha_env_get_cpu(env));
2851 int trapnr;
2852 target_siginfo_t info;
2853 abi_long sysret;
2854
2855 while (1) {
2856 trapnr = cpu_alpha_exec (env);
2857
2858 /* All of the traps imply a transition through PALcode, which
2859 implies an REI instruction has been executed. Which means
2860 that the intr_flag should be cleared. */
2861 env->intr_flag = 0;
2862
2863 switch (trapnr) {
2864 case EXCP_RESET:
2865 fprintf(stderr, "Reset requested. Exit\n");
2866 exit(1);
2867 break;
2868 case EXCP_MCHK:
2869 fprintf(stderr, "Machine check exception. Exit\n");
2870 exit(1);
2871 break;
2872 case EXCP_SMP_INTERRUPT:
2873 case EXCP_CLK_INTERRUPT:
2874 case EXCP_DEV_INTERRUPT:
2875 fprintf(stderr, "External interrupt. Exit\n");
2876 exit(1);
2877 break;
2878 case EXCP_MMFAULT:
2879 env->lock_addr = -1;
2880 info.si_signo = TARGET_SIGSEGV;
2881 info.si_errno = 0;
2882 info.si_code = (page_get_flags(env->trap_arg0) & PAGE_VALID
2883 ? TARGET_SEGV_ACCERR : TARGET_SEGV_MAPERR);
2884 info._sifields._sigfault._addr = env->trap_arg0;
2885 queue_signal(env, info.si_signo, &info);
2886 break;
2887 case EXCP_UNALIGN:
2888 env->lock_addr = -1;
2889 info.si_signo = TARGET_SIGBUS;
2890 info.si_errno = 0;
2891 info.si_code = TARGET_BUS_ADRALN;
2892 info._sifields._sigfault._addr = env->trap_arg0;
2893 queue_signal(env, info.si_signo, &info);
2894 break;
2895 case EXCP_OPCDEC:
2896 do_sigill:
2897 env->lock_addr = -1;
2898 info.si_signo = TARGET_SIGILL;
2899 info.si_errno = 0;
2900 info.si_code = TARGET_ILL_ILLOPC;
2901 info._sifields._sigfault._addr = env->pc;
2902 queue_signal(env, info.si_signo, &info);
2903 break;
2904 case EXCP_ARITH:
2905 env->lock_addr = -1;
2906 info.si_signo = TARGET_SIGFPE;
2907 info.si_errno = 0;
2908 info.si_code = TARGET_FPE_FLTINV;
2909 info._sifields._sigfault._addr = env->pc;
2910 queue_signal(env, info.si_signo, &info);
2911 break;
2912 case EXCP_FEN:
2913 /* No-op. Linux simply re-enables the FPU. */
2914 break;
2915 case EXCP_CALL_PAL:
2916 env->lock_addr = -1;
2917 switch (env->error_code) {
2918 case 0x80:
2919 /* BPT */
2920 info.si_signo = TARGET_SIGTRAP;
2921 info.si_errno = 0;
2922 info.si_code = TARGET_TRAP_BRKPT;
2923 info._sifields._sigfault._addr = env->pc;
2924 queue_signal(env, info.si_signo, &info);
2925 break;
2926 case 0x81:
2927 /* BUGCHK */
2928 info.si_signo = TARGET_SIGTRAP;
2929 info.si_errno = 0;
2930 info.si_code = 0;
2931 info._sifields._sigfault._addr = env->pc;
2932 queue_signal(env, info.si_signo, &info);
2933 break;
2934 case 0x83:
2935 /* CALLSYS */
2936 trapnr = env->ir[IR_V0];
2937 sysret = do_syscall(env, trapnr,
2938 env->ir[IR_A0], env->ir[IR_A1],
2939 env->ir[IR_A2], env->ir[IR_A3],
2940 env->ir[IR_A4], env->ir[IR_A5],
2941 0, 0);
2942 if (trapnr == TARGET_NR_sigreturn
2943 || trapnr == TARGET_NR_rt_sigreturn) {
2944 break;
2945 }
2946 /* Syscall writes 0 to V0 to bypass error check, similar
2947 to how this is handled internal to Linux kernel.
2948 (Ab)use trapnr temporarily as boolean indicating error. */
2949 trapnr = (env->ir[IR_V0] != 0 && sysret < 0);
2950 env->ir[IR_V0] = (trapnr ? -sysret : sysret);
2951 env->ir[IR_A3] = trapnr;
2952 break;
2953 case 0x86:
2954 /* IMB */
2955 /* ??? We can probably elide the code using page_unprotect
2956 that is checking for self-modifying code. Instead we
2957 could simply call tb_flush here. Until we work out the
2958 changes required to turn off the extra write protection,
2959 this can be a no-op. */
2960 break;
2961 case 0x9E:
2962 /* RDUNIQUE */
2963 /* Handled in the translator for usermode. */
2964 abort();
2965 case 0x9F:
2966 /* WRUNIQUE */
2967 /* Handled in the translator for usermode. */
2968 abort();
2969 case 0xAA:
2970 /* GENTRAP */
2971 info.si_signo = TARGET_SIGFPE;
2972 switch (env->ir[IR_A0]) {
2973 case TARGET_GEN_INTOVF:
2974 info.si_code = TARGET_FPE_INTOVF;
2975 break;
2976 case TARGET_GEN_INTDIV:
2977 info.si_code = TARGET_FPE_INTDIV;
2978 break;
2979 case TARGET_GEN_FLTOVF:
2980 info.si_code = TARGET_FPE_FLTOVF;
2981 break;
2982 case TARGET_GEN_FLTUND:
2983 info.si_code = TARGET_FPE_FLTUND;
2984 break;
2985 case TARGET_GEN_FLTINV:
2986 info.si_code = TARGET_FPE_FLTINV;
2987 break;
2988 case TARGET_GEN_FLTINE:
2989 info.si_code = TARGET_FPE_FLTRES;
2990 break;
2991 case TARGET_GEN_ROPRAND:
2992 info.si_code = 0;
2993 break;
2994 default:
2995 info.si_signo = TARGET_SIGTRAP;
2996 info.si_code = 0;
2997 break;
2998 }
2999 info.si_errno = 0;
3000 info._sifields._sigfault._addr = env->pc;
3001 queue_signal(env, info.si_signo, &info);
3002 break;
3003 default:
3004 goto do_sigill;
3005 }
3006 break;
3007 case EXCP_DEBUG:
3008 info.si_signo = gdb_handlesig (env, TARGET_SIGTRAP);
3009 if (info.si_signo) {
3010 env->lock_addr = -1;
3011 info.si_errno = 0;
3012 info.si_code = TARGET_TRAP_BRKPT;
3013 queue_signal(env, info.si_signo, &info);
3014 }
3015 break;
3016 case EXCP_STL_C:
3017 case EXCP_STQ_C:
3018 do_store_exclusive(env, env->error_code, trapnr - EXCP_STL_C);
3019 break;
3020 case EXCP_INTERRUPT:
3021 /* Just indicate that signals should be handled asap. */
3022 break;
3023 default:
3024 printf ("Unhandled trap: 0x%x\n", trapnr);
3025 cpu_dump_state(cs, stderr, fprintf, 0);
3026 exit (1);
3027 }
3028 process_pending_signals (env);
3029 }
3030 }
3031 #endif /* TARGET_ALPHA */
3032
3033 #ifdef TARGET_S390X
3034 void cpu_loop(CPUS390XState *env)
3035 {
3036 CPUState *cs = CPU(s390_env_get_cpu(env));
3037 int trapnr, n, sig;
3038 target_siginfo_t info;
3039 target_ulong addr;
3040
3041 while (1) {
3042 trapnr = cpu_s390x_exec(env);
3043 switch (trapnr) {
3044 case EXCP_INTERRUPT:
3045 /* Just indicate that signals should be handled asap. */
3046 break;
3047
3048 case EXCP_SVC:
3049 n = env->int_svc_code;
3050 if (!n) {
3051 /* syscalls > 255 */
3052 n = env->regs[1];
3053 }
3054 env->psw.addr += env->int_svc_ilen;
3055 env->regs[2] = do_syscall(env, n, env->regs[2], env->regs[3],
3056 env->regs[4], env->regs[5],
3057 env->regs[6], env->regs[7], 0, 0);
3058 break;
3059
3060 case EXCP_DEBUG:
3061 sig = gdb_handlesig(env, TARGET_SIGTRAP);
3062 if (sig) {
3063 n = TARGET_TRAP_BRKPT;
3064 goto do_signal_pc;
3065 }
3066 break;
3067 case EXCP_PGM:
3068 n = env->int_pgm_code;
3069 switch (n) {
3070 case PGM_OPERATION:
3071 case PGM_PRIVILEGED:
3072 sig = SIGILL;
3073 n = TARGET_ILL_ILLOPC;
3074 goto do_signal_pc;
3075 case PGM_PROTECTION:
3076 case PGM_ADDRESSING:
3077 sig = SIGSEGV;
3078 /* XXX: check env->error_code */
3079 n = TARGET_SEGV_MAPERR;
3080 addr = env->__excp_addr;
3081 goto do_signal;
3082 case PGM_EXECUTE:
3083 case PGM_SPECIFICATION:
3084 case PGM_SPECIAL_OP:
3085 case PGM_OPERAND:
3086 do_sigill_opn:
3087 sig = SIGILL;
3088 n = TARGET_ILL_ILLOPN;
3089 goto do_signal_pc;
3090
3091 case PGM_FIXPT_OVERFLOW:
3092 sig = SIGFPE;
3093 n = TARGET_FPE_INTOVF;
3094 goto do_signal_pc;
3095 case PGM_FIXPT_DIVIDE:
3096 sig = SIGFPE;
3097 n = TARGET_FPE_INTDIV;
3098 goto do_signal_pc;
3099
3100 case PGM_DATA:
3101 n = (env->fpc >> 8) & 0xff;
3102 if (n == 0xff) {
3103 /* compare-and-trap */
3104 goto do_sigill_opn;
3105 } else {
3106 /* An IEEE exception, simulated or otherwise. */
3107 if (n & 0x80) {
3108 n = TARGET_FPE_FLTINV;
3109 } else if (n & 0x40) {
3110 n = TARGET_FPE_FLTDIV;
3111 } else if (n & 0x20) {
3112 n = TARGET_FPE_FLTOVF;
3113 } else if (n & 0x10) {
3114 n = TARGET_FPE_FLTUND;
3115 } else if (n & 0x08) {
3116 n = TARGET_FPE_FLTRES;
3117 } else {
3118 /* ??? Quantum exception; BFP, DFP error. */
3119 goto do_sigill_opn;
3120 }
3121 sig = SIGFPE;
3122 goto do_signal_pc;
3123 }
3124
3125 default:
3126 fprintf(stderr, "Unhandled program exception: %#x\n", n);
3127 cpu_dump_state(cs, stderr, fprintf, 0);
3128 exit(1);
3129 }
3130 break;
3131
3132 do_signal_pc:
3133 addr = env->psw.addr;
3134 do_signal:
3135 info.si_signo = sig;
3136 info.si_errno = 0;
3137 info.si_code = n;
3138 info._sifields._sigfault._addr = addr;
3139 queue_signal(env, info.si_signo, &info);
3140 break;
3141
3142 default:
3143 fprintf(stderr, "Unhandled trap: 0x%x\n", trapnr);
3144 cpu_dump_state(cs, stderr, fprintf, 0);
3145 exit(1);
3146 }
3147 process_pending_signals (env);
3148 }
3149 }
3150
3151 #endif /* TARGET_S390X */
3152
3153 THREAD CPUArchState *thread_env;
3154
3155 void task_settid(TaskState *ts)
3156 {
3157 if (ts->ts_tid == 0) {
3158 #ifdef CONFIG_USE_NPTL
3159 ts->ts_tid = (pid_t)syscall(SYS_gettid);
3160 #else
3161 /* when no threads are used, tid becomes pid */
3162 ts->ts_tid = getpid();
3163 #endif
3164 }
3165 }
3166
3167 void stop_all_tasks(void)
3168 {
3169 /*
3170 * We trust that when using NPTL, start_exclusive()
3171 * handles thread stopping correctly.
3172 */
3173 start_exclusive();
3174 }
3175
3176 /* Assumes contents are already zeroed. */
3177 void init_task_state(TaskState *ts)
3178 {
3179 int i;
3180
3181 ts->used = 1;
3182 ts->first_free = ts->sigqueue_table;
3183 for (i = 0; i < MAX_SIGQUEUE_SIZE - 1; i++) {
3184 ts->sigqueue_table[i].next = &ts->sigqueue_table[i + 1];
3185 }
3186 ts->sigqueue_table[i].next = NULL;
3187 }
3188
3189 static void handle_arg_help(const char *arg)
3190 {
3191 usage();
3192 }
3193
3194 static void handle_arg_log(const char *arg)
3195 {
3196 int mask;
3197
3198 mask = qemu_str_to_log_mask(arg);
3199 if (!mask) {
3200 qemu_print_log_usage(stdout);
3201 exit(1);
3202 }
3203 qemu_set_log(mask);
3204 }
3205
3206 static void handle_arg_log_filename(const char *arg)
3207 {
3208 qemu_set_log_filename(arg);
3209 }
3210
3211 static void handle_arg_set_env(const char *arg)
3212 {
3213 char *r, *p, *token;
3214 r = p = strdup(arg);
3215 while ((token = strsep(&p, ",")) != NULL) {
3216 if (envlist_setenv(envlist, token) != 0) {
3217 usage();
3218 }
3219 }
3220 free(r);
3221 }
3222
3223 static void handle_arg_unset_env(const char *arg)
3224 {
3225 char *r, *p, *token;
3226 r = p = strdup(arg);
3227 while ((token = strsep(&p, ",")) != NULL) {
3228 if (envlist_unsetenv(envlist, token) != 0) {
3229 usage();
3230 }
3231 }
3232 free(r);
3233 }
3234
3235 static void handle_arg_argv0(const char *arg)
3236 {
3237 argv0 = strdup(arg);
3238 }
3239
3240 static void handle_arg_stack_size(const char *arg)
3241 {
3242 char *p;
3243 guest_stack_size = strtoul(arg, &p, 0);
3244 if (guest_stack_size == 0) {
3245 usage();
3246 }
3247
3248 if (*p == 'M') {
3249 guest_stack_size *= 1024 * 1024;
3250 } else if (*p == 'k' || *p == 'K') {
3251 guest_stack_size *= 1024;
3252 }
3253 }
3254
3255 static void handle_arg_ld_prefix(const char *arg)
3256 {
3257 interp_prefix = strdup(arg);
3258 }
3259
3260 static void handle_arg_pagesize(const char *arg)
3261 {
3262 qemu_host_page_size = atoi(arg);
3263 if (qemu_host_page_size == 0 ||
3264 (qemu_host_page_size & (qemu_host_page_size - 1)) != 0) {
3265 fprintf(stderr, "page size must be a power of two\n");
3266 exit(1);
3267 }
3268 }
3269
3270 static void handle_arg_gdb(const char *arg)
3271 {
3272 gdbstub_port = atoi(arg);
3273 }
3274
3275 static void handle_arg_uname(const char *arg)
3276 {
3277 qemu_uname_release = strdup(arg);
3278 }
3279
3280 static void handle_arg_cpu(const char *arg)
3281 {
3282 cpu_model = strdup(arg);
3283 if (cpu_model == NULL || is_help_option(cpu_model)) {
3284 /* XXX: implement xxx_cpu_list for targets that still miss it */
3285 #if defined(cpu_list)
3286 cpu_list(stdout, &fprintf);
3287 #endif
3288 exit(1);
3289 }
3290 }
3291
3292 #if defined(CONFIG_USE_GUEST_BASE)
3293 static void handle_arg_guest_base(const char *arg)
3294 {
3295 guest_base = strtol(arg, NULL, 0);
3296 have_guest_base = 1;
3297 }
3298
3299 static void handle_arg_reserved_va(const char *arg)
3300 {
3301 char *p;
3302 int shift = 0;
3303 reserved_va = strtoul(arg, &p, 0);
3304 switch (*p) {
3305 case 'k':
3306 case 'K':
3307 shift = 10;
3308 break;
3309 case 'M':
3310 shift = 20;
3311 break;
3312 case 'G':
3313 shift = 30;
3314 break;
3315 }
3316 if (shift) {
3317 unsigned long unshifted = reserved_va;
3318 p++;
3319 reserved_va <<= shift;
3320 if (((reserved_va >> shift) != unshifted)
3321 #if HOST_LONG_BITS > TARGET_VIRT_ADDR_SPACE_BITS
3322 || (reserved_va > (1ul << TARGET_VIRT_ADDR_SPACE_BITS))
3323 #endif
3324 ) {
3325 fprintf(stderr, "Reserved virtual address too big\n");
3326 exit(1);
3327 }
3328 }
3329 if (*p) {
3330 fprintf(stderr, "Unrecognised -R size suffix '%s'\n", p);
3331 exit(1);
3332 }
3333 }
3334 #endif
3335
3336 static void handle_arg_singlestep(const char *arg)
3337 {
3338 singlestep = 1;
3339 }
3340
3341 static void handle_arg_strace(const char *arg)
3342 {
3343 do_strace = 1;
3344 }
3345
3346 static void handle_arg_version(const char *arg)
3347 {
3348 printf("qemu-" TARGET_NAME " version " QEMU_VERSION QEMU_PKGVERSION
3349 ", Copyright (c) 2003-2008 Fabrice Bellard\n");
3350 exit(0);
3351 }
3352
3353 struct qemu_argument {
3354 const char *argv;
3355 const char *env;
3356 bool has_arg;
3357 void (*handle_opt)(const char *arg);
3358 const char *example;
3359 const char *help;
3360 };
3361
3362 static const struct qemu_argument arg_table[] = {
3363 {"h", "", false, handle_arg_help,
3364 "", "print this help"},
3365 {"g", "QEMU_GDB", true, handle_arg_gdb,
3366 "port", "wait gdb connection to 'port'"},
3367 {"L", "QEMU_LD_PREFIX", true, handle_arg_ld_prefix,
3368 "path", "set the elf interpreter prefix to 'path'"},
3369 {"s", "QEMU_STACK_SIZE", true, handle_arg_stack_size,
3370 "size", "set the stack size to 'size' bytes"},
3371 {"cpu", "QEMU_CPU", true, handle_arg_cpu,
3372 "model", "select CPU (-cpu help for list)"},
3373 {"E", "QEMU_SET_ENV", true, handle_arg_set_env,
3374 "var=value", "sets targets environment variable (see below)"},
3375 {"U", "QEMU_UNSET_ENV", true, handle_arg_unset_env,
3376 "var", "unsets targets environment variable (see below)"},
3377 {"0", "QEMU_ARGV0", true, handle_arg_argv0,
3378 "argv0", "forces target process argv[0] to be 'argv0'"},
3379 {"r", "QEMU_UNAME", true, handle_arg_uname,
3380 "uname", "set qemu uname release string to 'uname'"},
3381 #if defined(CONFIG_USE_GUEST_BASE)
3382 {"B", "QEMU_GUEST_BASE", true, handle_arg_guest_base,
3383 "address", "set guest_base address to 'address'"},
3384 {"R", "QEMU_RESERVED_VA", true, handle_arg_reserved_va,
3385 "size", "reserve 'size' bytes for guest virtual address space"},
3386 #endif
3387 {"d", "QEMU_LOG", true, handle_arg_log,
3388 "item[,...]", "enable logging of specified items "
3389 "(use '-d help' for a list of items)"},
3390 {"D", "QEMU_LOG_FILENAME", true, handle_arg_log_filename,
3391 "logfile", "write logs to 'logfile' (default stderr)"},
3392 {"p", "QEMU_PAGESIZE", true, handle_arg_pagesize,
3393 "pagesize", "set the host page size to 'pagesize'"},
3394 {"singlestep", "QEMU_SINGLESTEP", false, handle_arg_singlestep,
3395 "", "run in singlestep mode"},
3396 {"strace", "QEMU_STRACE", false, handle_arg_strace,
3397 "", "log system calls"},
3398 {"version", "QEMU_VERSION", false, handle_arg_version,
3399 "", "display version information and exit"},
3400 {NULL, NULL, false, NULL, NULL, NULL}
3401 };
3402
3403 static void usage(void)
3404 {
3405 const struct qemu_argument *arginfo;
3406 int maxarglen;
3407 int maxenvlen;
3408
3409 printf("usage: qemu-" TARGET_NAME " [options] program [arguments...]\n"
3410 "Linux CPU emulator (compiled for " TARGET_NAME " emulation)\n"
3411 "\n"
3412 "Options and associated environment variables:\n"
3413 "\n");
3414
3415 /* Calculate column widths. We must always have at least enough space
3416 * for the column header.
3417 */
3418 maxarglen = strlen("Argument");
3419 maxenvlen = strlen("Env-variable");
3420
3421 for (arginfo = arg_table; arginfo->handle_opt != NULL; arginfo++) {
3422 int arglen = strlen(arginfo->argv);
3423 if (arginfo->has_arg) {
3424 arglen += strlen(arginfo->example) + 1;
3425 }
3426 if (strlen(arginfo->env) > maxenvlen) {
3427 maxenvlen = strlen(arginfo->env);
3428 }
3429 if (arglen > maxarglen) {
3430 maxarglen = arglen;
3431 }
3432 }
3433
3434 printf("%-*s %-*s Description\n", maxarglen+1, "Argument",
3435 maxenvlen, "Env-variable");
3436
3437 for (arginfo = arg_table; arginfo->handle_opt != NULL; arginfo++) {
3438 if (arginfo->has_arg) {
3439 printf("-%s %-*s %-*s %s\n", arginfo->argv,
3440 (int)(maxarglen - strlen(arginfo->argv) - 1),
3441 arginfo->example, maxenvlen, arginfo->env, arginfo->help);
3442 } else {
3443 printf("-%-*s %-*s %s\n", maxarglen, arginfo->argv,
3444 maxenvlen, arginfo->env,
3445 arginfo->help);
3446 }
3447 }
3448
3449 printf("\n"
3450 "Defaults:\n"
3451 "QEMU_LD_PREFIX = %s\n"
3452 "QEMU_STACK_SIZE = %ld byte\n",
3453 interp_prefix,
3454 guest_stack_size);
3455
3456 printf("\n"
3457 "You can use -E and -U options or the QEMU_SET_ENV and\n"
3458 "QEMU_UNSET_ENV environment variables to set and unset\n"
3459 "environment variables for the target process.\n"
3460 "It is possible to provide several variables by separating them\n"
3461 "by commas in getsubopt(3) style. Additionally it is possible to\n"
3462 "provide the -E and -U options multiple times.\n"
3463 "The following lines are equivalent:\n"
3464 " -E var1=val2 -E var2=val2 -U LD_PRELOAD -U LD_DEBUG\n"
3465 " -E var1=val2,var2=val2 -U LD_PRELOAD,LD_DEBUG\n"
3466 " QEMU_SET_ENV=var1=val2,var2=val2 QEMU_UNSET_ENV=LD_PRELOAD,LD_DEBUG\n"
3467 "Note that if you provide several changes to a single variable\n"
3468 "the last change will stay in effect.\n");
3469
3470 exit(1);
3471 }
3472
3473 static int parse_args(int argc, char **argv)
3474 {
3475 const char *r;
3476 int optind;
3477 const struct qemu_argument *arginfo;
3478
3479 for (arginfo = arg_table; arginfo->handle_opt != NULL; arginfo++) {
3480 if (arginfo->env == NULL) {
3481 continue;
3482 }
3483
3484 r = getenv(arginfo->env);
3485 if (r != NULL) {
3486 arginfo->handle_opt(r);
3487 }
3488 }
3489
3490 optind = 1;
3491 for (;;) {
3492 if (optind >= argc) {
3493 break;
3494 }
3495 r = argv[optind];
3496 if (r[0] != '-') {
3497 break;
3498 }
3499 optind++;
3500 r++;
3501 if (!strcmp(r, "-")) {
3502 break;
3503 }
3504
3505 for (arginfo = arg_table; arginfo->handle_opt != NULL; arginfo++) {
3506 if (!strcmp(r, arginfo->argv)) {
3507 if (arginfo->has_arg) {
3508 if (optind >= argc) {
3509 usage();
3510 }
3511 arginfo->handle_opt(argv[optind]);
3512 optind++;
3513 } else {
3514 arginfo->handle_opt(NULL);
3515 }
3516 break;
3517 }
3518 }
3519
3520 /* no option matched the current argv */
3521 if (arginfo->handle_opt == NULL) {
3522 usage();
3523 }
3524 }
3525
3526 if (optind >= argc) {
3527 usage();
3528 }
3529
3530 filename = argv[optind];
3531 exec_path = argv[optind];
3532
3533 return optind;
3534 }
3535
3536 int main(int argc, char **argv, char **envp)
3537 {
3538 struct target_pt_regs regs1, *regs = &regs1;
3539 struct image_info info1, *info = &info1;
3540 struct linux_binprm bprm;
3541 TaskState *ts;
3542 CPUArchState *env;
3543 int optind;
3544 char **target_environ, **wrk;
3545 char **target_argv;
3546 int target_argc;
3547 int i;
3548 int ret;
3549
3550 module_call_init(MODULE_INIT_QOM);
3551
3552 qemu_cache_utils_init(envp);
3553
3554 if ((envlist = envlist_create()) == NULL) {
3555 (void) fprintf(stderr, "Unable to allocate envlist\n");
3556 exit(1);
3557 }
3558
3559 /* add current environment into the list */
3560 for (wrk = environ; *wrk != NULL; wrk++) {
3561 (void) envlist_setenv(envlist, *wrk);
3562 }
3563
3564 /* Read the stack limit from the kernel. If it's "unlimited",
3565 then we can do little else besides use the default. */
3566 {
3567 struct rlimit lim;
3568 if (getrlimit(RLIMIT_STACK, &lim) == 0
3569 && lim.rlim_cur != RLIM_INFINITY
3570 && lim.rlim_cur == (target_long)lim.rlim_cur) {
3571 guest_stack_size = lim.rlim_cur;
3572 }
3573 }
3574
3575 cpu_model = NULL;
3576 #if defined(cpudef_setup)
3577 cpudef_setup(); /* parse cpu definitions in target config file (TBD) */
3578 #endif
3579
3580 optind = parse_args(argc, argv);
3581
3582 /* Zero out regs */
3583 memset(regs, 0, sizeof(struct target_pt_regs));
3584
3585 /* Zero out image_info */
3586 memset(info, 0, sizeof(struct image_info));
3587
3588 memset(&bprm, 0, sizeof (bprm));
3589
3590 /* Scan interp_prefix dir for replacement files. */
3591 init_paths(interp_prefix);
3592
3593 if (cpu_model == NULL) {
3594 #if defined(TARGET_I386)
3595 #ifdef TARGET_X86_64
3596 cpu_model = "qemu64";
3597 #else
3598 cpu_model = "qemu32";
3599 #endif
3600 #elif defined(TARGET_ARM)
3601 cpu_model = "any";
3602 #elif defined(TARGET_UNICORE32)
3603 cpu_model = "any";
3604 #elif defined(TARGET_M68K)
3605 cpu_model = "any";
3606 #elif defined(TARGET_SPARC)
3607 #ifdef TARGET_SPARC64
3608 cpu_model = "TI UltraSparc II";
3609 #else
3610 cpu_model = "Fujitsu MB86904";
3611 #endif
3612 #elif defined(TARGET_MIPS)
3613 #if defined(TARGET_ABI_MIPSN32) || defined(TARGET_ABI_MIPSN64)
3614 cpu_model = "20Kc";
3615 #else
3616 cpu_model = "24Kf";
3617 #endif
3618 #elif defined TARGET_OPENRISC
3619 cpu_model = "or1200";
3620 #elif defined(TARGET_PPC)
3621 #ifdef TARGET_PPC64
3622 cpu_model = "970fx";
3623 #else
3624 cpu_model = "750";
3625 #endif
3626 #else
3627 cpu_model = "any";
3628 #endif
3629 }
3630 tcg_exec_init(0);
3631 cpu_exec_init_all();
3632 /* NOTE: we need to init the CPU at this stage to get
3633 qemu_host_page_size */
3634 env = cpu_init(cpu_model);
3635 if (!env) {
3636 fprintf(stderr, "Unable to find CPU definition\n");
3637 exit(1);
3638 }
3639 #if defined(TARGET_SPARC) || defined(TARGET_PPC)
3640 cpu_reset(ENV_GET_CPU(env));
3641 #endif
3642
3643 thread_env = env;
3644
3645 if (getenv("QEMU_STRACE")) {
3646 do_strace = 1;
3647 }
3648
3649 target_environ = envlist_to_environ(envlist, NULL);
3650 envlist_free(envlist);
3651
3652 #if defined(CONFIG_USE_GUEST_BASE)
3653 /*
3654 * Now that page sizes are configured in cpu_init() we can do
3655 * proper page alignment for guest_base.
3656 */
3657 guest_base = HOST_PAGE_ALIGN(guest_base);
3658
3659 if (reserved_va || have_guest_base) {
3660 guest_base = init_guest_space(guest_base, reserved_va, 0,
3661 have_guest_base);
3662 if (guest_base == (unsigned long)-1) {
3663 fprintf(stderr, "Unable to reserve 0x%lx bytes of virtual address "
3664 "space for use as guest address space (check your virtual "
3665 "memory ulimit setting or reserve less using -R option)\n",
3666 reserved_va);
3667 exit(1);
3668 }
3669
3670 if (reserved_va) {
3671 mmap_next_start = reserved_va;
3672 }
3673 }
3674 #endif /* CONFIG_USE_GUEST_BASE */
3675
3676 /*
3677 * Read in mmap_min_addr kernel parameter. This value is used
3678 * When loading the ELF image to determine whether guest_base
3679 * is needed. It is also used in mmap_find_vma.
3680 */
3681 {
3682 FILE *fp;
3683
3684 if ((fp = fopen("/proc/sys/vm/mmap_min_addr", "r")) != NULL) {
3685 unsigned long tmp;
3686 if (fscanf(fp, "%lu", &tmp) == 1) {
3687 mmap_min_addr = tmp;
3688 qemu_log("host mmap_min_addr=0x%lx\n", mmap_min_addr);
3689 }
3690 fclose(fp);
3691 }
3692 }
3693
3694 /*
3695 * Prepare copy of argv vector for target.
3696 */
3697 target_argc = argc - optind;
3698 target_argv = calloc(target_argc + 1, sizeof (char *));
3699 if (target_argv == NULL) {
3700 (void) fprintf(stderr, "Unable to allocate memory for target_argv\n");
3701 exit(1);
3702 }
3703
3704 /*
3705 * If argv0 is specified (using '-0' switch) we replace
3706 * argv[0] pointer with the given one.
3707 */
3708 i = 0;
3709 if (argv0 != NULL) {
3710 target_argv[i++] = strdup(argv0);
3711 }
3712 for (; i < target_argc; i++) {
3713 target_argv[i] = strdup(argv[optind + i]);
3714 }
3715 target_argv[target_argc] = NULL;
3716
3717 ts = g_malloc0 (sizeof(TaskState));
3718 init_task_state(ts);
3719 /* build Task State */
3720 ts->info = info;
3721 ts->bprm = &bprm;
3722 env->opaque = ts;
3723 task_settid(ts);
3724
3725 ret = loader_exec(filename, target_argv, target_environ, regs,
3726 info, &bprm);
3727 if (ret != 0) {
3728 printf("Error while loading %s: %s\n", filename, strerror(-ret));
3729 _exit(1);
3730 }
3731
3732 for (wrk = target_environ; *wrk; wrk++) {
3733 free(*wrk);
3734 }
3735
3736 free(target_environ);
3737
3738 if (qemu_log_enabled()) {
3739 #if defined(CONFIG_USE_GUEST_BASE)
3740 qemu_log("guest_base 0x%lx\n", guest_base);
3741 #endif
3742 log_page_dump();
3743
3744 qemu_log("start_brk 0x" TARGET_ABI_FMT_lx "\n", info->start_brk);
3745 qemu_log("end_code 0x" TARGET_ABI_FMT_lx "\n", info->end_code);
3746 qemu_log("start_code 0x" TARGET_ABI_FMT_lx "\n",
3747 info->start_code);
3748 qemu_log("start_data 0x" TARGET_ABI_FMT_lx "\n",
3749 info->start_data);
3750 qemu_log("end_data 0x" TARGET_ABI_FMT_lx "\n", info->end_data);
3751 qemu_log("start_stack 0x" TARGET_ABI_FMT_lx "\n",
3752 info->start_stack);
3753 qemu_log("brk 0x" TARGET_ABI_FMT_lx "\n", info->brk);
3754 qemu_log("entry 0x" TARGET_ABI_FMT_lx "\n", info->entry);
3755 }
3756
3757 target_set_brk(info->brk);
3758 syscall_init();
3759 signal_init();
3760
3761 #if defined(CONFIG_USE_GUEST_BASE)
3762 /* Now that we've loaded the binary, GUEST_BASE is fixed. Delay
3763 generating the prologue until now so that the prologue can take
3764 the real value of GUEST_BASE into account. */
3765 tcg_prologue_init(&tcg_ctx);
3766 #endif
3767
3768 #if defined(TARGET_I386)
3769 cpu_x86_set_cpl(env, 3);
3770
3771 env->cr[0] = CR0_PG_MASK | CR0_WP_MASK | CR0_PE_MASK;
3772 env->hflags |= HF_PE_MASK;
3773 if (env->features[FEAT_1_EDX] & CPUID_SSE) {
3774 env->cr[4] |= CR4_OSFXSR_MASK;
3775 env->hflags |= HF_OSFXSR_MASK;
3776 }
3777 #ifndef TARGET_ABI32
3778 /* enable 64 bit mode if possible */
3779 if (!(env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM)) {
3780 fprintf(stderr, "The selected x86 CPU does not support 64 bit mode\n");
3781 exit(1);
3782 }
3783 env->cr[4] |= CR4_PAE_MASK;
3784 env->efer |= MSR_EFER_LMA | MSR_EFER_LME;
3785 env->hflags |= HF_LMA_MASK;
3786 #endif
3787
3788 /* flags setup : we activate the IRQs by default as in user mode */
3789 env->eflags |= IF_MASK;
3790
3791 /* linux register setup */
3792 #ifndef TARGET_ABI32
3793 env->regs[R_EAX] = regs->rax;
3794 env->regs[R_EBX] = regs->rbx;
3795 env->regs[R_ECX] = regs->rcx;
3796 env->regs[R_EDX] = regs->rdx;
3797 env->regs[R_ESI] = regs->rsi;
3798 env->regs[R_EDI] = regs->rdi;
3799 env->regs[R_EBP] = regs->rbp;
3800 env->regs[R_ESP] = regs->rsp;
3801 env->eip = regs->rip;
3802 #else
3803 env->regs[R_EAX] = regs->eax;
3804 env->regs[R_EBX] = regs->ebx;
3805 env->regs[R_ECX] = regs->ecx;
3806 env->regs[R_EDX] = regs->edx;
3807 env->regs[R_ESI] = regs->esi;
3808 env->regs[R_EDI] = regs->edi;
3809 env->regs[R_EBP] = regs->ebp;
3810 env->regs[R_ESP] = regs->esp;
3811 env->eip = regs->eip;
3812 #endif
3813
3814 /* linux interrupt setup */
3815 #ifndef TARGET_ABI32
3816 env->idt.limit = 511;
3817 #else
3818 env->idt.limit = 255;
3819 #endif
3820 env->idt.base = target_mmap(0, sizeof(uint64_t) * (env->idt.limit + 1),
3821 PROT_READ|PROT_WRITE,
3822 MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
3823 idt_table = g2h(env->idt.base);
3824 set_idt(0, 0);
3825 set_idt(1, 0);
3826 set_idt(2, 0);
3827 set_idt(3, 3);
3828 set_idt(4, 3);
3829 set_idt(5, 0);
3830 set_idt(6, 0);
3831 set_idt(7, 0);
3832 set_idt(8, 0);
3833 set_idt(9, 0);
3834 set_idt(10, 0);
3835 set_idt(11, 0);
3836 set_idt(12, 0);
3837 set_idt(13, 0);
3838 set_idt(14, 0);
3839 set_idt(15, 0);
3840 set_idt(16, 0);
3841 set_idt(17, 0);
3842 set_idt(18, 0);
3843 set_idt(19, 0);
3844 set_idt(0x80, 3);
3845
3846 /* linux segment setup */
3847 {
3848 uint64_t *gdt_table;
3849 env->gdt.base = target_mmap(0, sizeof(uint64_t) * TARGET_GDT_ENTRIES,
3850 PROT_READ|PROT_WRITE,
3851 MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
3852 env->gdt.limit = sizeof(uint64_t) * TARGET_GDT_ENTRIES - 1;
3853 gdt_table = g2h(env->gdt.base);
3854 #ifdef TARGET_ABI32
3855 write_dt(&gdt_table[__USER_CS >> 3], 0, 0xfffff,
3856 DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | DESC_S_MASK |
3857 (3 << DESC_DPL_SHIFT) | (0xa << DESC_TYPE_SHIFT));
3858 #else
3859 /* 64 bit code segment */
3860 write_dt(&gdt_table[__USER_CS >> 3], 0, 0xfffff,
3861 DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | DESC_S_MASK |
3862 DESC_L_MASK |
3863 (3 << DESC_DPL_SHIFT) | (0xa << DESC_TYPE_SHIFT));
3864 #endif
3865 write_dt(&gdt_table[__USER_DS >> 3], 0, 0xfffff,
3866 DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | DESC_S_MASK |
3867 (3 << DESC_DPL_SHIFT) | (0x2 << DESC_TYPE_SHIFT));
3868 }
3869 cpu_x86_load_seg(env, R_CS, __USER_CS);
3870 cpu_x86_load_seg(env, R_SS, __USER_DS);
3871 #ifdef TARGET_ABI32
3872 cpu_x86_load_seg(env, R_DS, __USER_DS);
3873 cpu_x86_load_seg(env, R_ES, __USER_DS);
3874 cpu_x86_load_seg(env, R_FS, __USER_DS);
3875 cpu_x86_load_seg(env, R_GS, __USER_DS);
3876 /* This hack makes Wine work... */
3877 env->segs[R_FS].selector = 0;
3878 #else
3879 cpu_x86_load_seg(env, R_DS, 0);
3880 cpu_x86_load_seg(env, R_ES, 0);
3881 cpu_x86_load_seg(env, R_FS, 0);
3882 cpu_x86_load_seg(env, R_GS, 0);
3883 #endif
3884 #elif defined(TARGET_ARM)
3885 {
3886 int i;
3887 cpsr_write(env, regs->uregs[16], 0xffffffff);
3888 for(i = 0; i < 16; i++) {
3889 env->regs[i] = regs->uregs[i];
3890 }
3891 /* Enable BE8. */
3892 if (EF_ARM_EABI_VERSION(info->elf_flags) >= EF_ARM_EABI_VER4
3893 && (info->elf_flags & EF_ARM_BE8)) {
3894 env->bswap_code = 1;
3895 }
3896 }
3897 #elif defined(TARGET_UNICORE32)
3898 {
3899 int i;
3900 cpu_asr_write(env, regs->uregs[32], 0xffffffff);
3901 for (i = 0; i < 32; i++) {
3902 env->regs[i] = regs->uregs[i];
3903 }
3904 }
3905 #elif defined(TARGET_SPARC)
3906 {
3907 int i;
3908 env->pc = regs->pc;
3909 env->npc = regs->npc;
3910 env->y = regs->y;
3911 for(i = 0; i < 8; i++)
3912 env->gregs[i] = regs->u_regs[i];
3913 for(i = 0; i < 8; i++)
3914 env->regwptr[i] = regs->u_regs[i + 8];
3915 }
3916 #elif defined(TARGET_PPC)
3917 {
3918 int i;
3919
3920 #if defined(TARGET_PPC64)
3921 #if defined(TARGET_ABI32)
3922 env->msr &= ~((target_ulong)1 << MSR_SF);
3923 #else
3924 env->msr |= (target_ulong)1 << MSR_SF;
3925 #endif
3926 #endif
3927 env->nip = regs->nip;
3928 for(i = 0; i < 32; i++) {
3929 env->gpr[i] = regs->gpr[i];
3930 }
3931 }
3932 #elif defined(TARGET_M68K)
3933 {
3934 env->pc = regs->pc;
3935 env->dregs[0] = regs->d0;
3936 env->dregs[1] = regs->d1;
3937 env->dregs[2] = regs->d2;
3938 env->dregs[3] = regs->d3;
3939 env->dregs[4] = regs->d4;
3940 env->dregs[5] = regs->d5;
3941 env->dregs[6] = regs->d6;
3942 env->dregs[7] = regs->d7;
3943 env->aregs[0] = regs->a0;
3944 env->aregs[1] = regs->a1;
3945 env->aregs[2] = regs->a2;
3946 env->aregs[3] = regs->a3;
3947 env->aregs[4] = regs->a4;
3948 env->aregs[5] = regs->a5;
3949 env->aregs[6] = regs->a6;
3950 env->aregs[7] = regs->usp;
3951 env->sr = regs->sr;
3952 ts->sim_syscalls = 1;
3953 }
3954 #elif defined(TARGET_MICROBLAZE)
3955 {
3956 env->regs[0] = regs->r0;
3957 env->regs[1] = regs->r1;
3958 env->regs[2] = regs->r2;
3959 env->regs[3] = regs->r3;
3960 env->regs[4] = regs->r4;
3961 env->regs[5] = regs->r5;
3962 env->regs[6] = regs->r6;
3963 env->regs[7] = regs->r7;
3964 env->regs[8] = regs->r8;
3965 env->regs[9] = regs->r9;
3966 env->regs[10] = regs->r10;
3967 env->regs[11] = regs->r11;
3968 env->regs[12] = regs->r12;
3969 env->regs[13] = regs->r13;
3970 env->regs[14] = regs->r14;
3971 env->regs[15] = regs->r15;
3972 env->regs[16] = regs->r16;
3973 env->regs[17] = regs->r17;
3974 env->regs[18] = regs->r18;
3975 env->regs[19] = regs->r19;
3976 env->regs[20] = regs->r20;
3977 env->regs[21] = regs->r21;
3978 env->regs[22] = regs->r22;
3979 env->regs[23] = regs->r23;
3980 env->regs[24] = regs->r24;
3981 env->regs[25] = regs->r25;
3982 env->regs[26] = regs->r26;
3983 env->regs[27] = regs->r27;
3984 env->regs[28] = regs->r28;
3985 env->regs[29] = regs->r29;
3986 env->regs[30] = regs->r30;
3987 env->regs[31] = regs->r31;
3988 env->sregs[SR_PC] = regs->pc;
3989 }
3990 #elif defined(TARGET_MIPS)
3991 {
3992 int i;
3993
3994 for(i = 0; i < 32; i++) {
3995 env->active_tc.gpr[i] = regs->regs[i];
3996 }
3997 env->active_tc.PC = regs->cp0_epc & ~(target_ulong)1;
3998 if (regs->cp0_epc & 1) {
3999 env->hflags |= MIPS_HFLAG_M16;
4000 }
4001 }
4002 #elif defined(TARGET_OPENRISC)
4003 {
4004 int i;
4005
4006 for (i = 0; i < 32; i++) {
4007 env->gpr[i] = regs->gpr[i];
4008 }
4009
4010 env->sr = regs->sr;
4011 env->pc = regs->pc;
4012 }
4013 #elif defined(TARGET_SH4)
4014 {
4015 int i;
4016
4017 for(i = 0; i < 16; i++) {
4018 env->gregs[i] = regs->regs[i];
4019 }
4020 env->pc = regs->pc;
4021 }
4022 #elif defined(TARGET_ALPHA)
4023 {
4024 int i;
4025
4026 for(i = 0; i < 28; i++) {
4027 env->ir[i] = ((abi_ulong *)regs)[i];
4028 }
4029 env->ir[IR_SP] = regs->usp;
4030 env->pc = regs->pc;
4031 }
4032 #elif defined(TARGET_CRIS)
4033 {
4034 env->regs[0] = regs->r0;
4035 env->regs[1] = regs->r1;
4036 env->regs[2] = regs->r2;
4037 env->regs[3] = regs->r3;
4038 env->regs[4] = regs->r4;
4039 env->regs[5] = regs->r5;
4040 env->regs[6] = regs->r6;
4041 env->regs[7] = regs->r7;
4042 env->regs[8] = regs->r8;
4043 env->regs[9] = regs->r9;
4044 env->regs[10] = regs->r10;
4045 env->regs[11] = regs->r11;
4046 env->regs[12] = regs->r12;
4047 env->regs[13] = regs->r13;
4048 env->regs[14] = info->start_stack;
4049 env->regs[15] = regs->acr;
4050 env->pc = regs->erp;
4051 }
4052 #elif defined(TARGET_S390X)
4053 {
4054 int i;
4055 for (i = 0; i < 16; i++) {
4056 env->regs[i] = regs->gprs[i];
4057 }
4058 env->psw.mask = regs->psw.mask;
4059 env->psw.addr = regs->psw.addr;
4060 }
4061 #else
4062 #error unsupported target CPU
4063 #endif
4064
4065 #if defined(TARGET_ARM) || defined(TARGET_M68K) || defined(TARGET_UNICORE32)
4066 ts->stack_base = info->start_stack;
4067 ts->heap_base = info->brk;
4068 /* This will be filled in on the first SYS_HEAPINFO call. */
4069 ts->heap_limit = 0;
4070 #endif
4071
4072 if (gdbstub_port) {
4073 if (gdbserver_start(gdbstub_port) < 0) {
4074 fprintf(stderr, "qemu: could not open gdbserver on port %d\n",
4075 gdbstub_port);
4076 exit(1);
4077 }
4078 gdb_handlesig(env, 0);
4079 }
4080 cpu_loop(env);
4081 /* never exits */
4082 return 0;
4083 }