]> git.proxmox.com Git - qemu.git/commitdiff
Merge branch 's390-reorg' of git://repo.or.cz/qemu/rth
authorBlue Swirl <blauwirbel@gmail.com>
Sat, 12 Jan 2013 12:46:57 +0000 (12:46 +0000)
committerBlue Swirl <blauwirbel@gmail.com>
Sat, 12 Jan 2013 12:46:57 +0000 (12:46 +0000)
* 's390-reorg' of git://repo.or.cz/qemu/rth: (149 commits)
  target-s390: Claim maintainership
  target-s390: Use noreturn for exception and load_psw
  target-s390: Use TCG_CALL_NO_WG for misc helpers
  target-s390: Use TCG_CALL_NO_WG for integer helpers
  target-s390: Use TCG_CALL_NO_WG for floating-point helpers
  target-s390: Use TCG_CALL_NO_WG for memory helpers
  target-s390: Perform COMPARE AND SWAP inline
  target-s390: Optimize get_address
  target-s390: Optimize ADDC/SUBB
  target-s390: Optimize ADDU/SUBU CC testing
  target-s390: Tidy comparisons
  target-s390: Optmize emitting discards
  target-s390: Optimize XC
  target-s390: Fix cpu_clone_regs
  target-s390: Implement LOAD/SET FP AND SIGNAL
  target-s390: Implement SET ROUNDING MODE
  target-s390: Use uint64_to_float128
  target-s390: Implement LCDFR
  target-s390: Check insn operand specifications
  target-s390: Implement CPSDR
  ...

1  2 
MAINTAINERS
linux-user/main.c

diff --combined MAINTAINERS
index 2991e1d2b3fc46ef054b76c67c689051500671fc,4b7553efea9a4687d30c13d13601fdc3f79aeb05..35c260d549b9dfe330c44271ea14467bb0f4d87c
@@@ -98,6 -98,7 +98,7 @@@ S: Maintaine
  F: target-ppc/
  
  S390
+ M: Richard Henderson <rth@twiddle.net>
  M: Alexander Graf <agraf@suse.de>
  S: Maintained
  F: target-s390x/
@@@ -396,7 -397,6 +397,7 @@@ L: qemu-ppc@nongnu.or
  S: Odd Fixes
  F: hw/ppc_prep.c
  F: hw/prep_pci.[hc]
 +F: hw/pc87312.[hc]
  
  sPAPR
  M: David Gibson <david@gibson.dropbear.id.au>
diff --combined linux-user/main.c
index 9ade1bfabd8fa3e9dbb1072012f42264761d0f3b,15bacb9a3034890062051f3ffaa99461217b6766..0181bc211257ec10424f36c2b3a5a5b511fcc3cd
@@@ -57,12 -57,7 +57,12 @@@ int have_guest_base
   * This way we will never overlap with our own libraries or binaries or stack
   * or anything else that QEMU maps.
   */
 +# ifdef TARGET_MIPS
 +/* MIPS only supports 31 bits of virtual address space for user space */
 +unsigned long reserved_va = 0x77000000;
 +# else
  unsigned long reserved_va = 0xf7000000;
 +# endif
  #else
  unsigned long reserved_va;
  #endif
@@@ -2938,71 -2933,115 +2938,115 @@@ void cpu_loop(CPUAlphaState *env
  #ifdef TARGET_S390X
  void cpu_loop(CPUS390XState *env)
  {
-     int trapnr;
+     int trapnr, n, sig;
      target_siginfo_t info;
+     target_ulong addr;
  
      while (1) {
-         trapnr = cpu_s390x_exec (env);
+         trapnr = cpu_s390x_exec(env);
          switch (trapnr) {
          case EXCP_INTERRUPT:
-             /* just indicate that signals should be handled asap */
+             /* Just indicate that signals should be handled asap.  */
              break;
-         case EXCP_DEBUG:
-             {
-                 int sig;
  
-                 sig = gdb_handlesig (env, TARGET_SIGTRAP);
-                 if (sig) {
-                     info.si_signo = sig;
-                     info.si_errno = 0;
-                     info.si_code = TARGET_TRAP_BRKPT;
-                     queue_signal(env, info.si_signo, &info);
-                 }
+         case EXCP_SVC:
+             n = env->int_svc_code;
+             if (!n) {
+                 /* syscalls > 255 */
+                 n = env->regs[1];
              }
+             env->psw.addr += env->int_svc_ilen;
+             env->regs[2] = do_syscall(env, n, env->regs[2], env->regs[3],
+                                       env->regs[4], env->regs[5],
+                                       env->regs[6], env->regs[7], 0, 0);
              break;
-         case EXCP_SVC:
-             {
-                 int n = env->int_svc_code;
-                 if (!n) {
-                     /* syscalls > 255 */
-                     n = env->regs[1];
-                 }
-                 env->psw.addr += env->int_svc_ilc;
-                 env->regs[2] = do_syscall(env, n,
-                            env->regs[2],
-                            env->regs[3],
-                            env->regs[4],
-                            env->regs[5],
-                            env->regs[6],
-                            env->regs[7],
-                            0, 0);
+         case EXCP_DEBUG:
+             sig = gdb_handlesig(env, TARGET_SIGTRAP);
+             if (sig) {
+                 n = TARGET_TRAP_BRKPT;
+                 goto do_signal_pc;
              }
              break;
-         case EXCP_ADDR:
-             {
-                 info.si_signo = SIGSEGV;
-                 info.si_errno = 0;
+         case EXCP_PGM:
+             n = env->int_pgm_code;
+             switch (n) {
+             case PGM_OPERATION:
+             case PGM_PRIVILEGED:
+                 sig = SIGILL;
+                 n = TARGET_ILL_ILLOPC;
+                 goto do_signal_pc;
+             case PGM_PROTECTION:
+             case PGM_ADDRESSING:
+                 sig = SIGSEGV;
                  /* XXX: check env->error_code */
-                 info.si_code = TARGET_SEGV_MAPERR;
-                 info._sifields._sigfault._addr = env->__excp_addr;
-                 queue_signal(env, info.si_signo, &info);
+                 n = TARGET_SEGV_MAPERR;
+                 addr = env->__excp_addr;
+                 goto do_signal;
+             case PGM_EXECUTE:
+             case PGM_SPECIFICATION:
+             case PGM_SPECIAL_OP:
+             case PGM_OPERAND:
+             do_sigill_opn:
+                 sig = SIGILL;
+                 n = TARGET_ILL_ILLOPN;
+                 goto do_signal_pc;
+             case PGM_FIXPT_OVERFLOW:
+                 sig = SIGFPE;
+                 n = TARGET_FPE_INTOVF;
+                 goto do_signal_pc;
+             case PGM_FIXPT_DIVIDE:
+                 sig = SIGFPE;
+                 n = TARGET_FPE_INTDIV;
+                 goto do_signal_pc;
+             case PGM_DATA:
+                 n = (env->fpc >> 8) & 0xff;
+                 if (n == 0xff) {
+                     /* compare-and-trap */
+                     goto do_sigill_opn;
+                 } else {
+                     /* An IEEE exception, simulated or otherwise.  */
+                     if (n & 0x80) {
+                         n = TARGET_FPE_FLTINV;
+                     } else if (n & 0x40) {
+                         n = TARGET_FPE_FLTDIV;
+                     } else if (n & 0x20) {
+                         n = TARGET_FPE_FLTOVF;
+                     } else if (n & 0x10) {
+                         n = TARGET_FPE_FLTUND;
+                     } else if (n & 0x08) {
+                         n = TARGET_FPE_FLTRES;
+                     } else {
+                         /* ??? Quantum exception; BFP, DFP error.  */
+                         goto do_sigill_opn;
+                     }
+                     sig = SIGFPE;
+                     goto do_signal_pc;
+                 }
+             default:
+                 fprintf(stderr, "Unhandled program exception: %#x\n", n);
+                 cpu_dump_state(env, stderr, fprintf, 0);
+                 exit(1);
              }
              break;
-         case EXCP_SPEC:
-             {
-                 fprintf(stderr,"specification exception insn 0x%08x%04x\n", ldl(env->psw.addr), lduw(env->psw.addr + 4));
-                 info.si_signo = SIGILL;
-                 info.si_errno = 0;
-                 info.si_code = TARGET_ILL_ILLOPC;
-                 info._sifields._sigfault._addr = env->__excp_addr;
-                 queue_signal(env, info.si_signo, &info);
-             }
+         do_signal_pc:
+             addr = env->psw.addr;
+         do_signal:
+             info.si_signo = sig;
+             info.si_errno = 0;
+             info.si_code = n;
+             info._sifields._sigfault._addr = addr;
+             queue_signal(env, info.si_signo, &info);
              break;
          default:
-             printf ("Unhandled trap: 0x%x\n", trapnr);
+             fprintf(stderr, "Unhandled trap: 0x%x\n", trapnr);
              cpu_dump_state(env, stderr, fprintf, 0);
-             exit (1);
+             exit(1);
          }
          process_pending_signals (env);
      }