From nobody Tue Feb 10 02:00:47 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1525080377269264.93810001243014; Mon, 30 Apr 2018 02:26:17 -0700 (PDT) Received: from localhost ([::1]:58607 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fD54Z-0002JW-Cw for importer@patchew.org; Mon, 30 Apr 2018 05:26:15 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33146) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fD4qL-0006YX-6T for qemu-devel@nongnu.org; Mon, 30 Apr 2018 05:11:41 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fD4qF-0006Qo-MW for qemu-devel@nongnu.org; Mon, 30 Apr 2018 05:11:33 -0400 Received: from mout.kundenserver.de ([217.72.192.73]:38975) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fD4qF-0006PR-6h; Mon, 30 Apr 2018 05:11:27 -0400 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue102 [212.227.15.183]) with ESMTPSA (Nemesis) id 0Lcxeq-1eUya13UgK-00i99A; Mon, 30 Apr 2018 11:11:22 +0200 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Mon, 30 Apr 2018 11:10:31 +0200 Message-Id: <20180430091037.13878-37-laurent@vivier.eu> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180430091037.13878-1-laurent@vivier.eu> References: <20180430091037.13878-1-laurent@vivier.eu> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:7xycHgQSAfukIQm5ppAR+8/tEqaSrowwiQcH1eYmWH+gkPAyT8h /+QKFx0itcp3ySDT6LM0wyx5/S7MgUsqj8HID4XhpDMkFpgOIumyQG3xwgKele/PbgwKA8M zR74Zq1ybGonGbWsl2af7NxwuYsU9C52G4hodT+hiWig3OdSxBlJp8FvCwdrw7fvD1PzlBP QojqKIh7FyKj4rgp3GpVw== X-UI-Out-Filterresults: notjunk:1;V01:K0:qUAhJZzYZwA=:GoEBrYqzVjtCtnc/FCAV/3 K/lhMFeHujMzn8X91Cb+w00agIlk7Qr/En5sSv8Bxt1GxApyaoQqfk7qLbZQ089jc0Xe5E7nc SuDqS/aoGZAq+wRCnTMOT1VFkbWHAUvoP4+ybE78QevcCLDvU1zW3unx9bN/dr2kA+qrkt2kw im04WMAo7Rs3AX55Q+/cn+OaD6N2D3f2mC2TTAH+o+SiLnIaUFjM0uPCSWUqYEprjDTR+sWza Vp05e0uXv5PZNGX9atoq2B88oXKA/Vp7S/UrLqFeoafQM4+GpoX4TJtgwjkt3WOzxnbZMRAMX RSLjcXdBYPSHCCG9Wgs5XYmkBaFgvKegYr8oa7bVLLeQmYTucQnp2PHahV5qVrdI8dXqc7Rgi DptpxmSjYKJm5+ejtswskjmMZqDNFx0S5PJdvLlsolRifmsxnsGFmJUmfwMPp4vgu5iWQyq62 o7rBT1LU+HlJsX1KnAaF94Sea84CVdknIz9wIYk8Ks0xT3PhKOk5v9yR/1ElbDHGvpxVJBSmM KFTzJg4oDIKcxQggUSSeuvfBOWzARnzGgThLyHt+3Em3Q07yBZKQyN2/nYrVyO7DRAMtB6yiW 4HNWwotrG1hyiREuIgp66HwGwsWGAzSkaIztQBNAYP2ri654PWNZSstpkK1DWKc5OzubBky1R Gk8ZNOkvOTx7YowBDJE03G54N2UtSEl4I/EFyxSQMkQWxhXT45H761h3orCwsAD8dq+BOz0nr DiJEmAKl3fs/g7iR X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 217.72.192.73 Subject: [Qemu-devel] [PULL 36/42] linux-user: move alpha cpu loop to alpha directory X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: qemu-s390x@nongnu.org, Riku Voipio , Laurent Vivier , Cornelia Huck Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 No code change, only move code from main.c to alpha/cpu_loop.c. Signed-off-by: Laurent Vivier Reviewed-by: Richard Henderson Reviewed-by: Philippe Mathieu-Daud=C3=A9 Message-Id: <20180411185651.21351-15-laurent@vivier.eu> --- linux-user/alpha/cpu_loop.c | 199 ++++++++++++++++++++++++++++++++++++++++= ++ linux-user/main.c | 204 ----------------------------------------= ---- 2 files changed, 199 insertions(+), 204 deletions(-) diff --git a/linux-user/alpha/cpu_loop.c b/linux-user/alpha/cpu_loop.c index b7700a5561..b87fcaea87 100644 --- a/linux-user/alpha/cpu_loop.c +++ b/linux-user/alpha/cpu_loop.c @@ -21,6 +21,205 @@ #include "qemu.h" #include "cpu_loop-common.h" =20 +void cpu_loop(CPUAlphaState *env) +{ + CPUState *cs =3D CPU(alpha_env_get_cpu(env)); + int trapnr; + target_siginfo_t info; + abi_long sysret; + + while (1) { + bool arch_interrupt =3D true; + + cpu_exec_start(cs); + trapnr =3D cpu_exec(cs); + cpu_exec_end(cs); + process_queued_cpu_work(cs); + + switch (trapnr) { + case EXCP_RESET: + fprintf(stderr, "Reset requested. Exit\n"); + exit(EXIT_FAILURE); + break; + case EXCP_MCHK: + fprintf(stderr, "Machine check exception. Exit\n"); + exit(EXIT_FAILURE); + break; + case EXCP_SMP_INTERRUPT: + case EXCP_CLK_INTERRUPT: + case EXCP_DEV_INTERRUPT: + fprintf(stderr, "External interrupt. Exit\n"); + exit(EXIT_FAILURE); + break; + case EXCP_MMFAULT: + info.si_signo =3D TARGET_SIGSEGV; + info.si_errno =3D 0; + info.si_code =3D (page_get_flags(env->trap_arg0) & PAGE_VALID + ? TARGET_SEGV_ACCERR : TARGET_SEGV_MAPERR); + info._sifields._sigfault._addr =3D env->trap_arg0; + queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info); + break; + case EXCP_UNALIGN: + info.si_signo =3D TARGET_SIGBUS; + info.si_errno =3D 0; + info.si_code =3D TARGET_BUS_ADRALN; + info._sifields._sigfault._addr =3D env->trap_arg0; + queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info); + break; + case EXCP_OPCDEC: + do_sigill: + info.si_signo =3D TARGET_SIGILL; + info.si_errno =3D 0; + info.si_code =3D TARGET_ILL_ILLOPC; + info._sifields._sigfault._addr =3D env->pc; + queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info); + break; + case EXCP_ARITH: + info.si_signo =3D TARGET_SIGFPE; + info.si_errno =3D 0; + info.si_code =3D TARGET_FPE_FLTINV; + info._sifields._sigfault._addr =3D env->pc; + queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info); + break; + case EXCP_FEN: + /* No-op. Linux simply re-enables the FPU. */ + break; + case EXCP_CALL_PAL: + switch (env->error_code) { + case 0x80: + /* BPT */ + info.si_signo =3D TARGET_SIGTRAP; + info.si_errno =3D 0; + info.si_code =3D TARGET_TRAP_BRKPT; + info._sifields._sigfault._addr =3D env->pc; + queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info); + break; + case 0x81: + /* BUGCHK */ + info.si_signo =3D TARGET_SIGTRAP; + info.si_errno =3D 0; + info.si_code =3D 0; + info._sifields._sigfault._addr =3D env->pc; + queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info); + break; + case 0x83: + /* CALLSYS */ + trapnr =3D env->ir[IR_V0]; + sysret =3D do_syscall(env, trapnr, + env->ir[IR_A0], env->ir[IR_A1], + env->ir[IR_A2], env->ir[IR_A3], + env->ir[IR_A4], env->ir[IR_A5], + 0, 0); + if (sysret =3D=3D -TARGET_ERESTARTSYS) { + env->pc -=3D 4; + break; + } + if (sysret =3D=3D -TARGET_QEMU_ESIGRETURN) { + break; + } + /* Syscall writes 0 to V0 to bypass error check, similar + to how this is handled internal to Linux kernel. + (Ab)use trapnr temporarily as boolean indicating error.= */ + trapnr =3D (env->ir[IR_V0] !=3D 0 && sysret < 0); + env->ir[IR_V0] =3D (trapnr ? -sysret : sysret); + env->ir[IR_A3] =3D trapnr; + break; + case 0x86: + /* IMB */ + /* ??? We can probably elide the code using page_unprotect + that is checking for self-modifying code. Instead we + could simply call tb_flush here. Until we work out the + changes required to turn off the extra write protection, + this can be a no-op. */ + break; + case 0x9E: + /* RDUNIQUE */ + /* Handled in the translator for usermode. */ + abort(); + case 0x9F: + /* WRUNIQUE */ + /* Handled in the translator for usermode. */ + abort(); + case 0xAA: + /* GENTRAP */ + info.si_signo =3D TARGET_SIGFPE; + switch (env->ir[IR_A0]) { + case TARGET_GEN_INTOVF: + info.si_code =3D TARGET_FPE_INTOVF; + break; + case TARGET_GEN_INTDIV: + info.si_code =3D TARGET_FPE_INTDIV; + break; + case TARGET_GEN_FLTOVF: + info.si_code =3D TARGET_FPE_FLTOVF; + break; + case TARGET_GEN_FLTUND: + info.si_code =3D TARGET_FPE_FLTUND; + break; + case TARGET_GEN_FLTINV: + info.si_code =3D TARGET_FPE_FLTINV; + break; + case TARGET_GEN_FLTINE: + info.si_code =3D TARGET_FPE_FLTRES; + break; + case TARGET_GEN_ROPRAND: + info.si_code =3D 0; + break; + default: + info.si_signo =3D TARGET_SIGTRAP; + info.si_code =3D 0; + break; + } + info.si_errno =3D 0; + info._sifields._sigfault._addr =3D env->pc; + queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info); + break; + default: + goto do_sigill; + } + break; + case EXCP_DEBUG: + info.si_signo =3D gdb_handlesig(cs, TARGET_SIGTRAP); + if (info.si_signo) { + info.si_errno =3D 0; + info.si_code =3D TARGET_TRAP_BRKPT; + queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info); + } else { + arch_interrupt =3D false; + } + break; + case EXCP_INTERRUPT: + /* Just indicate that signals should be handled asap. */ + break; + case EXCP_ATOMIC: + cpu_exec_step_atomic(cs); + arch_interrupt =3D false; + break; + default: + printf ("Unhandled trap: 0x%x\n", trapnr); + cpu_dump_state(cs, stderr, fprintf, 0); + exit(EXIT_FAILURE); + } + process_pending_signals (env); + + /* Most of the traps imply a transition through PALcode, which + implies an REI instruction has been executed. Which means + that RX and LOCK_ADDR should be cleared. But there are a + few exceptions for traps internal to QEMU. */ + if (arch_interrupt) { + env->flags &=3D ~ENV_FLAG_RX_FLAG; + env->lock_addr =3D -1; + } + } +} + void target_cpu_copy_regs(CPUArchState *env, struct target_pt_regs *regs) { + int i; + + for(i =3D 0; i < 28; i++) { + env->ir[i] =3D ((abi_ulong *)regs)[i]; + } + env->ir[IR_SP] =3D regs->usp; + env->pc =3D regs->pc; } diff --git a/linux-user/main.c b/linux-user/main.c index 7c223a5629..37cf3a7d6f 100644 --- a/linux-user/main.c +++ b/linux-user/main.c @@ -149,200 +149,6 @@ void fork_end(int child) } } =20 -#ifdef TARGET_ALPHA -void cpu_loop(CPUAlphaState *env) -{ - CPUState *cs =3D CPU(alpha_env_get_cpu(env)); - int trapnr; - target_siginfo_t info; - abi_long sysret; - - while (1) { - bool arch_interrupt =3D true; - - cpu_exec_start(cs); - trapnr =3D cpu_exec(cs); - cpu_exec_end(cs); - process_queued_cpu_work(cs); - - switch (trapnr) { - case EXCP_RESET: - fprintf(stderr, "Reset requested. Exit\n"); - exit(EXIT_FAILURE); - break; - case EXCP_MCHK: - fprintf(stderr, "Machine check exception. Exit\n"); - exit(EXIT_FAILURE); - break; - case EXCP_SMP_INTERRUPT: - case EXCP_CLK_INTERRUPT: - case EXCP_DEV_INTERRUPT: - fprintf(stderr, "External interrupt. Exit\n"); - exit(EXIT_FAILURE); - break; - case EXCP_MMFAULT: - info.si_signo =3D TARGET_SIGSEGV; - info.si_errno =3D 0; - info.si_code =3D (page_get_flags(env->trap_arg0) & PAGE_VALID - ? TARGET_SEGV_ACCERR : TARGET_SEGV_MAPERR); - info._sifields._sigfault._addr =3D env->trap_arg0; - queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info); - break; - case EXCP_UNALIGN: - info.si_signo =3D TARGET_SIGBUS; - info.si_errno =3D 0; - info.si_code =3D TARGET_BUS_ADRALN; - info._sifields._sigfault._addr =3D env->trap_arg0; - queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info); - break; - case EXCP_OPCDEC: - do_sigill: - info.si_signo =3D TARGET_SIGILL; - info.si_errno =3D 0; - info.si_code =3D TARGET_ILL_ILLOPC; - info._sifields._sigfault._addr =3D env->pc; - queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info); - break; - case EXCP_ARITH: - info.si_signo =3D TARGET_SIGFPE; - info.si_errno =3D 0; - info.si_code =3D TARGET_FPE_FLTINV; - info._sifields._sigfault._addr =3D env->pc; - queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info); - break; - case EXCP_FEN: - /* No-op. Linux simply re-enables the FPU. */ - break; - case EXCP_CALL_PAL: - switch (env->error_code) { - case 0x80: - /* BPT */ - info.si_signo =3D TARGET_SIGTRAP; - info.si_errno =3D 0; - info.si_code =3D TARGET_TRAP_BRKPT; - info._sifields._sigfault._addr =3D env->pc; - queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info); - break; - case 0x81: - /* BUGCHK */ - info.si_signo =3D TARGET_SIGTRAP; - info.si_errno =3D 0; - info.si_code =3D 0; - info._sifields._sigfault._addr =3D env->pc; - queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info); - break; - case 0x83: - /* CALLSYS */ - trapnr =3D env->ir[IR_V0]; - sysret =3D do_syscall(env, trapnr, - env->ir[IR_A0], env->ir[IR_A1], - env->ir[IR_A2], env->ir[IR_A3], - env->ir[IR_A4], env->ir[IR_A5], - 0, 0); - if (sysret =3D=3D -TARGET_ERESTARTSYS) { - env->pc -=3D 4; - break; - } - if (sysret =3D=3D -TARGET_QEMU_ESIGRETURN) { - break; - } - /* Syscall writes 0 to V0 to bypass error check, similar - to how this is handled internal to Linux kernel. - (Ab)use trapnr temporarily as boolean indicating error.= */ - trapnr =3D (env->ir[IR_V0] !=3D 0 && sysret < 0); - env->ir[IR_V0] =3D (trapnr ? -sysret : sysret); - env->ir[IR_A3] =3D trapnr; - break; - case 0x86: - /* IMB */ - /* ??? We can probably elide the code using page_unprotect - that is checking for self-modifying code. Instead we - could simply call tb_flush here. Until we work out the - changes required to turn off the extra write protection, - this can be a no-op. */ - break; - case 0x9E: - /* RDUNIQUE */ - /* Handled in the translator for usermode. */ - abort(); - case 0x9F: - /* WRUNIQUE */ - /* Handled in the translator for usermode. */ - abort(); - case 0xAA: - /* GENTRAP */ - info.si_signo =3D TARGET_SIGFPE; - switch (env->ir[IR_A0]) { - case TARGET_GEN_INTOVF: - info.si_code =3D TARGET_FPE_INTOVF; - break; - case TARGET_GEN_INTDIV: - info.si_code =3D TARGET_FPE_INTDIV; - break; - case TARGET_GEN_FLTOVF: - info.si_code =3D TARGET_FPE_FLTOVF; - break; - case TARGET_GEN_FLTUND: - info.si_code =3D TARGET_FPE_FLTUND; - break; - case TARGET_GEN_FLTINV: - info.si_code =3D TARGET_FPE_FLTINV; - break; - case TARGET_GEN_FLTINE: - info.si_code =3D TARGET_FPE_FLTRES; - break; - case TARGET_GEN_ROPRAND: - info.si_code =3D 0; - break; - default: - info.si_signo =3D TARGET_SIGTRAP; - info.si_code =3D 0; - break; - } - info.si_errno =3D 0; - info._sifields._sigfault._addr =3D env->pc; - queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info); - break; - default: - goto do_sigill; - } - break; - case EXCP_DEBUG: - info.si_signo =3D gdb_handlesig(cs, TARGET_SIGTRAP); - if (info.si_signo) { - info.si_errno =3D 0; - info.si_code =3D TARGET_TRAP_BRKPT; - queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info); - } else { - arch_interrupt =3D false; - } - break; - case EXCP_INTERRUPT: - /* Just indicate that signals should be handled asap. */ - break; - case EXCP_ATOMIC: - cpu_exec_step_atomic(cs); - arch_interrupt =3D false; - break; - default: - printf ("Unhandled trap: 0x%x\n", trapnr); - cpu_dump_state(cs, stderr, fprintf, 0); - exit(EXIT_FAILURE); - } - process_pending_signals (env); - - /* Most of the traps imply a transition through PALcode, which - implies an REI instruction has been executed. Which means - that RX and LOCK_ADDR should be cleared. But there are a - few exceptions for traps internal to QEMU. */ - if (arch_interrupt) { - env->flags &=3D ~ENV_FLAG_RX_FLAG; - env->lock_addr =3D -1; - } - } -} -#endif /* TARGET_ALPHA */ - #ifdef TARGET_S390X =20 /* s390x masks the fault address it reports in si_addr for SIGSEGV and SIG= BUS */ @@ -1914,16 +1720,6 @@ int main(int argc, char **argv, char **envp) env->pc =3D regs->sepc; env->gpr[xSP] =3D regs->sp; } -#elif defined(TARGET_ALPHA) - { - int i; - - for(i =3D 0; i < 28; i++) { - env->ir[i] =3D ((abi_ulong *)regs)[i]; - } - env->ir[IR_SP] =3D regs->usp; - env->pc =3D regs->pc; - } #elif defined(TARGET_S390X) { int i; --=20 2.14.3