]> git.proxmox.com Git - mirror_qemu.git/blobdiff - linux-user/main.c
sparc64 marge (Blue Swirl)
[mirror_qemu.git] / linux-user / main.c
index 4d1f8ce88c2856cfed89690415e886e2fcc3e9a3..5601a23e674c514f105ccf333933d0b4fa3de766 100644 (file)
@@ -359,13 +359,27 @@ void cpu_loop(CPUARMState *env)
         case EXCP_SWI:
             {
                 /* system call */
-                insn = ldl((void *)(env->regs[15] - 4));
-                n = insn & 0xffffff;
+                if (env->thumb) {
+                    insn = lduw((void *)(env->regs[15] - 2));
+                    n = insn & 0xff;
+                } else {
+                    insn = ldl((void *)(env->regs[15] - 4));
+                    n = insn & 0xffffff;
+                }
+
                 if (n == ARM_NR_cacheflush) {
                     arm_cache_flush(env->regs[0], env->regs[1]);
-                } else if (n >= ARM_SYSCALL_BASE) {
+                } else if (n == ARM_NR_semihosting
+                           || n == ARM_NR_thumb_semihosting) {
+                    env->regs[0] = do_arm_semihosting (env);
+                } else if (n >= ARM_SYSCALL_BASE
+                           || (env->thumb && n == ARM_THUMB_SYSCALL)) {
                     /* linux syscall */
-                    n -= ARM_SYSCALL_BASE;
+                    if (env->thumb) {
+                        n = env->regs[7];
+                    } else {
+                        n -= ARM_SYSCALL_BASE;
+                    }
                     env->regs[0] = do_syscall(env, 
                                               n, 
                                               env->regs[0],
@@ -538,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;
@@ -555,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:
@@ -1207,6 +1225,10 @@ int main(int argc, char **argv)
             env->regs[i] = regs->uregs[i];
         }
         env->cpsr = regs->uregs[16];
+        ts->stack_base = info->start_stack;
+        ts->heap_base = info->brk;
+        /* This will be filled in on the first SYS_HEAPINFO call.  */
+        ts->heap_limit = 0;
     }
 #elif defined(TARGET_SPARC)
     {