[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH for 2.13 v2 15/19] linux-user: move s390x cpu lo
From: |
Philippe Mathieu-Daudé |
Subject: |
Re: [Qemu-devel] [PATCH for 2.13 v2 15/19] linux-user: move s390x cpu loop to s390x directory |
Date: |
Sun, 15 Apr 2018 23:20:49 -0300 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.7.0 |
On 04/11/2018 03:56 PM, Laurent Vivier wrote:
> No code change, only move code from main.c to
> s390x/cpu_loop.c.
>
> Signed-off-by: Laurent Vivier <address@hidden>
> Reviewed-by: Richard Henderson <address@hidden>
> Acked-by: Cornelia Huck <address@hidden>
Reviewed-by: Philippe Mathieu-Daudé <address@hidden>
> ---
> linux-user/main.c | 146
> --------------------------------------------
> linux-user/s390x/cpu_loop.c | 139 +++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 139 insertions(+), 146 deletions(-)
>
> diff --git a/linux-user/main.c b/linux-user/main.c
> index 37cf3a7d6f..7f6cfa5548 100644
> --- a/linux-user/main.c
> +++ b/linux-user/main.c
> @@ -149,143 +149,6 @@ void fork_end(int child)
> }
> }
>
> -#ifdef TARGET_S390X
> -
> -/* s390x masks the fault address it reports in si_addr for SIGSEGV and
> SIGBUS */
> -#define S390X_FAIL_ADDR_MASK -4096LL
> -
> -void cpu_loop(CPUS390XState *env)
> -{
> - CPUState *cs = CPU(s390_env_get_cpu(env));
> - int trapnr, n, sig;
> - target_siginfo_t info;
> - target_ulong addr;
> - abi_long ret;
> -
> - while (1) {
> - cpu_exec_start(cs);
> - trapnr = cpu_exec(cs);
> - cpu_exec_end(cs);
> - process_queued_cpu_work(cs);
> -
> - switch (trapnr) {
> - case EXCP_INTERRUPT:
> - /* Just indicate that signals should be handled asap. */
> - break;
> -
> - case EXCP_SVC:
> - n = env->int_svc_code;
> - if (!n) {
> - /* syscalls > 255 */
> - n = env->regs[1];
> - }
> - env->psw.addr += env->int_svc_ilen;
> - ret = do_syscall(env, n, env->regs[2], env->regs[3],
> - env->regs[4], env->regs[5],
> - env->regs[6], env->regs[7], 0, 0);
> - if (ret == -TARGET_ERESTARTSYS) {
> - env->psw.addr -= env->int_svc_ilen;
> - } else if (ret != -TARGET_QEMU_ESIGRETURN) {
> - env->regs[2] = ret;
> - }
> - break;
> -
> - case EXCP_DEBUG:
> - sig = gdb_handlesig(cs, TARGET_SIGTRAP);
> - if (sig) {
> - n = TARGET_TRAP_BRKPT;
> - goto do_signal_pc;
> - }
> - break;
> - case EXCP_PGM:
> - n = env->int_pgm_code;
> - switch (n) {
> - case PGM_OPERATION:
> - case PGM_PRIVILEGED:
> - sig = TARGET_SIGILL;
> - n = TARGET_ILL_ILLOPC;
> - goto do_signal_pc;
> - case PGM_PROTECTION:
> - case PGM_ADDRESSING:
> - sig = TARGET_SIGSEGV;
> - /* XXX: check env->error_code */
> - n = TARGET_SEGV_MAPERR;
> - addr = env->__excp_addr & S390X_FAIL_ADDR_MASK;
> - goto do_signal;
> - case PGM_EXECUTE:
> - case PGM_SPECIFICATION:
> - case PGM_SPECIAL_OP:
> - case PGM_OPERAND:
> - do_sigill_opn:
> - sig = TARGET_SIGILL;
> - n = TARGET_ILL_ILLOPN;
> - goto do_signal_pc;
> -
> - case PGM_FIXPT_OVERFLOW:
> - sig = TARGET_SIGFPE;
> - n = TARGET_FPE_INTOVF;
> - goto do_signal_pc;
> - case PGM_FIXPT_DIVIDE:
> - sig = TARGET_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 = TARGET_SIGFPE;
> - goto do_signal_pc;
> - }
> -
> - default:
> - fprintf(stderr, "Unhandled program exception: %#x\n", n);
> - cpu_dump_state(cs, stderr, fprintf, 0);
> - exit(EXIT_FAILURE);
> - }
> - break;
> -
> - 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, QEMU_SI_FAULT, &info);
> - break;
> -
> - case EXCP_ATOMIC:
> - cpu_exec_step_atomic(cs);
> - break;
> - default:
> - fprintf(stderr, "Unhandled trap: 0x%x\n", trapnr);
> - cpu_dump_state(cs, stderr, fprintf, 0);
> - exit(EXIT_FAILURE);
> - }
> - process_pending_signals (env);
> - }
> -}
> -
> -#endif /* TARGET_S390X */
> -
> #ifdef TARGET_TILEGX
>
> static void gen_sigill_reg(CPUTLGState *env)
> @@ -1720,15 +1583,6 @@ int main(int argc, char **argv, char **envp)
> env->pc = regs->sepc;
> env->gpr[xSP] = regs->sp;
> }
> -#elif defined(TARGET_S390X)
> - {
> - int i;
> - for (i = 0; i < 16; i++) {
> - env->regs[i] = regs->gprs[i];
> - }
> - env->psw.mask = regs->psw.mask;
> - env->psw.addr = regs->psw.addr;
> - }
> #elif defined(TARGET_TILEGX)
> {
> int i;
> diff --git a/linux-user/s390x/cpu_loop.c b/linux-user/s390x/cpu_loop.c
> index b7700a5561..99f5f1594f 100644
> --- a/linux-user/s390x/cpu_loop.c
> +++ b/linux-user/s390x/cpu_loop.c
> @@ -21,6 +21,145 @@
> #include "qemu.h"
> #include "cpu_loop-common.h"
>
> +/* s390x masks the fault address it reports in si_addr for SIGSEGV and
> SIGBUS */
> +#define S390X_FAIL_ADDR_MASK -4096LL
> +
> +void cpu_loop(CPUS390XState *env)
> +{
> + CPUState *cs = CPU(s390_env_get_cpu(env));
> + int trapnr, n, sig;
> + target_siginfo_t info;
> + target_ulong addr;
> + abi_long ret;
> +
> + while (1) {
> + cpu_exec_start(cs);
> + trapnr = cpu_exec(cs);
> + cpu_exec_end(cs);
> + process_queued_cpu_work(cs);
> +
> + switch (trapnr) {
> + case EXCP_INTERRUPT:
> + /* Just indicate that signals should be handled asap. */
> + break;
> +
> + case EXCP_SVC:
> + n = env->int_svc_code;
> + if (!n) {
> + /* syscalls > 255 */
> + n = env->regs[1];
> + }
> + env->psw.addr += env->int_svc_ilen;
> + ret = do_syscall(env, n, env->regs[2], env->regs[3],
> + env->regs[4], env->regs[5],
> + env->regs[6], env->regs[7], 0, 0);
> + if (ret == -TARGET_ERESTARTSYS) {
> + env->psw.addr -= env->int_svc_ilen;
> + } else if (ret != -TARGET_QEMU_ESIGRETURN) {
> + env->regs[2] = ret;
> + }
> + break;
> +
> + case EXCP_DEBUG:
> + sig = gdb_handlesig(cs, TARGET_SIGTRAP);
> + if (sig) {
> + n = TARGET_TRAP_BRKPT;
> + goto do_signal_pc;
> + }
> + break;
> + case EXCP_PGM:
> + n = env->int_pgm_code;
> + switch (n) {
> + case PGM_OPERATION:
> + case PGM_PRIVILEGED:
> + sig = TARGET_SIGILL;
> + n = TARGET_ILL_ILLOPC;
> + goto do_signal_pc;
> + case PGM_PROTECTION:
> + case PGM_ADDRESSING:
> + sig = TARGET_SIGSEGV;
> + /* XXX: check env->error_code */
> + n = TARGET_SEGV_MAPERR;
> + addr = env->__excp_addr & S390X_FAIL_ADDR_MASK;
> + goto do_signal;
> + case PGM_EXECUTE:
> + case PGM_SPECIFICATION:
> + case PGM_SPECIAL_OP:
> + case PGM_OPERAND:
> + do_sigill_opn:
> + sig = TARGET_SIGILL;
> + n = TARGET_ILL_ILLOPN;
> + goto do_signal_pc;
> +
> + case PGM_FIXPT_OVERFLOW:
> + sig = TARGET_SIGFPE;
> + n = TARGET_FPE_INTOVF;
> + goto do_signal_pc;
> + case PGM_FIXPT_DIVIDE:
> + sig = TARGET_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 = TARGET_SIGFPE;
> + goto do_signal_pc;
> + }
> +
> + default:
> + fprintf(stderr, "Unhandled program exception: %#x\n", n);
> + cpu_dump_state(cs, stderr, fprintf, 0);
> + exit(EXIT_FAILURE);
> + }
> + break;
> +
> + 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, QEMU_SI_FAULT, &info);
> + break;
> +
> + case EXCP_ATOMIC:
> + cpu_exec_step_atomic(cs);
> + break;
> + default:
> + fprintf(stderr, "Unhandled trap: 0x%x\n", trapnr);
> + cpu_dump_state(cs, stderr, fprintf, 0);
> + exit(EXIT_FAILURE);
> + }
> + process_pending_signals (env);
> + }
> +}
> +
> void target_cpu_copy_regs(CPUArchState *env, struct target_pt_regs *regs)
> {
> + int i;
> + for (i = 0; i < 16; i++) {
> + env->regs[i] = regs->gprs[i];
> + }
> + env->psw.mask = regs->psw.mask;
> + env->psw.addr = regs->psw.addr;
> }
>
- Re: [Qemu-devel] [PATCH for 2.13 v2 11/19] linux-user: move cris cpu loop to cris directory, (continued)
- [Qemu-devel] [PATCH for 2.13 v2 18/19] linux-user: move hppa cpu loop to hppa directory, Laurent Vivier, 2018/04/11
- [Qemu-devel] [PATCH for 2.13 v2 03/19] linux-user: move aarch64 cpu loop to aarch64 directory, Laurent Vivier, 2018/04/11
- [Qemu-devel] [PATCH for 2.13 v2 16/19] linux-user: move tilegx cpu loop to tilegx directory, Laurent Vivier, 2018/04/11
- [Qemu-devel] [PATCH for 2.13 v2 17/19] linux-user: move riscv cpu loop to riscv directory, Laurent Vivier, 2018/04/11
- [Qemu-devel] [PATCH for 2.13 v2 19/19] linux-user: move xtensa cpu loop to xtensa directory, Laurent Vivier, 2018/04/11
- [Qemu-devel] [PATCH for 2.13 v2 08/19] linux-user: move nios2 cpu loop to nios2 directory, Laurent Vivier, 2018/04/11
- [Qemu-devel] [PATCH for 2.13 v2 13/19] linux-user: move m68k cpu loop to m68k directory, Laurent Vivier, 2018/04/11
- [Qemu-devel] [PATCH for 2.13 v2 15/19] linux-user: move s390x cpu loop to s390x directory, Laurent Vivier, 2018/04/11
- Re: [Qemu-devel] [PATCH for 2.13 v2 15/19] linux-user: move s390x cpu loop to s390x directory,
Philippe Mathieu-Daudé <=
- [Qemu-devel] [PATCH for 2.13 v2 04/19] linux-user: move arm cpu loop to arm directory, Laurent Vivier, 2018/04/11
- [Qemu-devel] [PATCH for 2.13 v2 05/19] linux-user: move sparc/sparc64 cpu loop to sparc directory, Laurent Vivier, 2018/04/11
- [Qemu-devel] [PATCH for 2.13 v2 07/19] linux-user: move mips/mips64 cpu loop to mips directory, Laurent Vivier, 2018/04/11
- [Qemu-devel] [PATCH for 2.13 v2 14/19] linux-user: move alpha cpu loop to alpha directory, Laurent Vivier, 2018/04/11
- Re: [Qemu-devel] [PATCH for 2.13 v2 00/19] linux-user: move arch specific parts from main.c to arch directories, no-reply, 2018/04/11