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