0.7.1-alt1
[qemu] / qemu / linux-user / main.c
index d0f662c..622d06e 100644 (file)
@@ -552,6 +552,7 @@ void cpu_loop (CPUSPARCState *env)
             env->pc = env->npc;
             env->npc = env->npc + 4;
             break;
+#ifndef TARGET_SPARC64
         case TT_WIN_OVF: /* window overflow */
             save_window(env);
             break;
@@ -569,6 +570,9 @@ void cpu_loop (CPUSPARCState *env)
                 queue_signal(info.si_signo, &info);
             }
             break;
+#else
+           // XXX
+#endif
        case 0x100: // XXX, why do we get these?
            break;
         case EXCP_DEBUG:
@@ -696,33 +700,28 @@ void cpu_loop(CPUPPCState *env)
             info._sifields._sigfault._addr = env->nip - 4;
             queue_signal(info.si_signo, &info);
         case EXCP_DSI:
-            fprintf(stderr, "Invalid data memory access: 0x%08x\n", env->spr[DAR]);
+            fprintf(stderr, "Invalid data memory access: 0x%08x\n",
+                    env->spr[SPR_DAR]);
             if (loglevel) {
                 fprintf(logfile, "Invalid data memory access: 0x%08x\n",
-                        env->spr[DAR]);
+                        env->spr[SPR_DAR]);
             }
-            switch (env->error_code & 0xF) {
-            case EXCP_DSI_TRANSLATE:
+            switch (env->error_code & 0xFF000000) {
+            case 0x40000000:
                 info.si_signo = TARGET_SIGSEGV;
                 info.si_errno = 0;
                 info.si_code = TARGET_SEGV_MAPERR;
                 break;
-            case EXCP_DSI_NOTSUP:
-            case EXCP_DSI_EXTERNAL:
+            case 0x04000000:
                 info.si_signo = TARGET_SIGILL;
                 info.si_errno = 0;
                 info.si_code = TARGET_ILL_ILLADR;
                 break;
-            case EXCP_DSI_PROT: 
+            case 0x08000000:
                 info.si_signo = TARGET_SIGSEGV;
                 info.si_errno = 0;
                 info.si_code = TARGET_SEGV_ACCERR;
                 break;
-            case EXCP_DSI_DABR:
-                info.si_signo = TARGET_SIGTRAP;
-                info.si_errno = 0;
-                info.si_code = TARGET_TRAP_BRKPT;
-                break;
             default:
                 /* Let's send a regular segfault... */
                 fprintf(stderr, "Invalid segfault errno (%02x)\n",
@@ -743,19 +742,14 @@ void cpu_loop(CPUPPCState *env)
             fprintf(stderr, "Invalid instruction fetch\n");
             if (loglevel)
                 fprintf(logfile, "Invalid instruction fetch\n");
-            switch (env->error_code) {
-            case EXCP_ISI_TRANSLATE:
+            switch (env->error_code & 0xFF000000) {
+            case 0x40000000:
                 info.si_signo = TARGET_SIGSEGV;
             info.si_errno = 0;
                 info.si_code = TARGET_SEGV_MAPERR;
                 break;
-            case EXCP_ISI_GUARD:
-                info.si_signo = TARGET_SIGILL;
-                info.si_errno = 0;
-                info.si_code = TARGET_ILL_ILLADR;
-                break;
-            case EXCP_ISI_NOEXEC:
-            case EXCP_ISI_PROT:
+            case 0x10000000:
+            case 0x08000000:
                 info.si_signo = TARGET_SIGSEGV;
                 info.si_errno = 0;
                 info.si_code = TARGET_SEGV_ACCERR;
@@ -925,18 +919,6 @@ void cpu_loop(CPUPPCState *env)
             if (loglevel)
                 fprintf(logfile, "Decrementer exception\n");
             abort();
-        case EXCP_RESA: /* Implementation specific          */
-            /* Should not happen ! */
-            fprintf(stderr, "RESA exception should never happen !\n");
-            if (loglevel)
-                fprintf(logfile, "RESA exception should never happen !\n");
-            abort();
-        case EXCP_RESB: /* Implementation specific          */
-            /* Should not happen ! */
-            fprintf(stderr, "RESB exception should never happen !\n");
-            if (loglevel)
-                fprintf(logfile, "RESB exception should never happen !\n");
-            abort();
         case EXCP_TRACE:
             /* Do nothing: we use this to trace execution */
             break;
@@ -958,12 +940,6 @@ void cpu_loop(CPUPPCState *env)
         case EXCP_BRANCH:
             /* We stopped because of a jump... */
             break;
-        case EXCP_RFI:
-            /* Should not occur: we always are in user mode */
-            fprintf(stderr, "Return from interrupt ?\n");
-            if (loglevel)
-                fprintf(logfile, "Return from interrupt ?\n");
-            abort();
         case EXCP_INTERRUPT:
             /* Don't know why this should ever happen... */
             break;
@@ -997,7 +973,7 @@ void cpu_loop(CPUPPCState *env)
 
 void usage(void)
 {
-    printf("qemu-" TARGET_ARCH " version " QEMU_VERSION ", Copyright (c) 2003-2004 Fabrice Bellard\n"
+    printf("qemu-" TARGET_ARCH " version " QEMU_VERSION ", Copyright (c) 2003-2005 Fabrice Bellard\n"
            "usage: qemu-" TARGET_ARCH " [-h] [-g] [-d opts] [-L path] [-s size] program [arguments...]\n"
            "Linux CPU emulator (compiled for %s emulation)\n"
            "\n"
@@ -1239,7 +1215,25 @@ int main(int argc, char **argv)
     }
 #elif defined(TARGET_PPC)
     {
+        ppc_def_t *def;
         int i;
+
+        /* Choose and initialise CPU */
+        /* XXX: CPU model (or PVR) should be provided on command line */
+        //        ppc_find_by_name("750gx", &def);
+        //        ppc_find_by_name("750fx", &def);
+        //        ppc_find_by_name("750p", &def);
+        ppc_find_by_name("750", &def);
+        //        ppc_find_by_name("G3", &def);
+        //        ppc_find_by_name("604r", &def);
+        //        ppc_find_by_name("604e", &def);
+        //        ppc_find_by_name("604", &def);
+        if (def == NULL) {
+            cpu_abort(cpu_single_env,
+                      "Unable to find PowerPC CPU definition\n");
+        }
+        cpu_ppc_register(cpu_single_env, def);
+
         for (i = 0; i < 32; i++) {
             if (i != 12 && i != 6 && i != 13)
                 env->msr[i] = (regs->msr >> i) & 1;