From nobody Tue Feb 10 04:55:25 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 1525080664943279.649478646493; Mon, 30 Apr 2018 02:31:04 -0700 (PDT) Received: from localhost ([::1]:58645 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fD59D-0006TW-UB for importer@patchew.org; Mon, 30 Apr 2018 05:31:04 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33281) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fD4qS-0006i1-Mt for qemu-devel@nongnu.org; Mon, 30 Apr 2018 05:11:48 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fD4qL-0006WG-F1 for qemu-devel@nongnu.org; Mon, 30 Apr 2018 05:11:40 -0400 Received: from mout.kundenserver.de ([217.72.192.73]:34925) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fD4qA-0006LF-Ep; Mon, 30 Apr 2018 05:11:22 -0400 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue102 [212.227.15.183]) with ESMTPSA (Nemesis) id 0MTQ1P-1elGZm2J4p-00SP75; Mon, 30 Apr 2018 11:11:17 +0200 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Mon, 30 Apr 2018 11:10:25 +0200 Message-Id: <20180430091037.13878-31-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> X-Provags-ID: V03:K1:trWk/5tcv7ePZcw57qUHdp2CgjZrc+xylxzcqJZvnq+G1gQt1CN ddYarBC+khyn1Ly86iFwuoW8nzvyeQ/PGca4A1ZZnMJnXIJX704pVWgsDVqfhoI31iSVy8C jcoXRt1V9t7VnQpiUnioDPF4Cu0RgZzbWYFsHSGslUljpLWoryJtcFtz9rHAgz6cPXt8xDh b94CYDM4oaePSNDdCsVYg== X-UI-Out-Filterresults: notjunk:1;V01:K0:Whr1FOxo7pA=:WrljGqRmpZQFsDP+XXNxPH qtPkR2Vx7Wccb4UfIq52YiR2s+5nBVFY14Tkl+VcqBpai9Xqi9zRkdfGf8jqW4949gka3PQxo 7ne2uPVAcSKxx6gMV6FITYWbZ3w0VjRuVUIL0/dXkk1xX7L52ymZz6VB6XaKwE9UTC0iyOG8w rdhdQFxRQDjXMszPIx1/icuGLs69U4zUBjR0diHGGJ/wBAUsX8UtbE+eUTepIt2RYZFZEQTGG wcJwFxUNVO0GZzvwaAGerSGpa3ir8zePDEw843vldPJ8E0t0j1yJ7u/BZeHHWvuSFlwVvyiDZ CzQX01XYMQz7UhZBAl/PfgiOSqT0LFnb0LjYfJpLN19v0JdH2BTfvszK61vgYyUBfbUj5uprA x1/YsZekPuIWQtki9KcPtIO7stnEWVV9UP/kFWeA8S/9PR+rS/O7c/k/lAOZUAtEL6a/5Al5g AiWffD56Q4xLTBE8RHu1bnAiOUk4RQr5fCsVgAzWJmCKeFr8r+DxnUHQ5eg9sHIok5JSNDrjU 5cerPzjoDlkOJK5cyVxR6tSOALFRY1N1bwZOoCIIVy5Y6Wb+JeJWS5U3kkTEjtJq7/jFpdWvb bw7vNU9Nuq2XiMadl8agcMYOoXZZVycj7n+G9SE7d1pbbouhoGZo6XTWnSaoyS8w5RLT5K3au Jze2YEV1wuaYcydhw+mUARxilfZCtwQY81K4EguItIterxcN/Bj8bMTwViZOGVfdiKtM= 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 30/42] linux-user: move nios2 cpu loop to nios2 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 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" No code change, only move code from main.c to nios2/cpu_loop.c. Signed-off-by: Laurent Vivier Reviewed-by: Richard Henderson Message-Id: <20180411185651.21351-9-laurent@vivier.eu> --- linux-user/main.c | 133 ----------------------------------------= ---- linux-user/nios2/cpu_loop.c | 126 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 126 insertions(+), 133 deletions(-) diff --git a/linux-user/main.c b/linux-user/main.c index a760c19379..88f807549f 100644 --- a/linux-user/main.c +++ b/linux-user/main.c @@ -149,109 +149,6 @@ void fork_end(int child) } } =20 -#ifdef TARGET_NIOS2 - -void cpu_loop(CPUNios2State *env) -{ - CPUState *cs =3D ENV_GET_CPU(env); - Nios2CPU *cpu =3D NIOS2_CPU(cs); - target_siginfo_t info; - int trapnr, gdbsig, ret; - - for (;;) { - cpu_exec_start(cs); - trapnr =3D cpu_exec(cs); - cpu_exec_end(cs); - gdbsig =3D 0; - - switch (trapnr) { - case EXCP_INTERRUPT: - /* just indicate that signals should be handled asap */ - break; - case EXCP_TRAP: - if (env->regs[R_AT] =3D=3D 0) { - abi_long ret; - qemu_log_mask(CPU_LOG_INT, "\nSyscall\n"); - - ret =3D do_syscall(env, env->regs[2], - env->regs[4], env->regs[5], env->regs[6], - env->regs[7], env->regs[8], env->regs[9], - 0, 0); - - if (env->regs[2] =3D=3D 0) { /* FIXME: syscall 0 workar= ound */ - ret =3D 0; - } - - env->regs[2] =3D abs(ret); - /* Return value is 0..4096 */ - env->regs[7] =3D (ret > 0xfffffffffffff000ULL); - env->regs[CR_ESTATUS] =3D env->regs[CR_STATUS]; - env->regs[CR_STATUS] &=3D ~0x3; - env->regs[R_EA] =3D env->regs[R_PC] + 4; - env->regs[R_PC] +=3D 4; - break; - } else { - qemu_log_mask(CPU_LOG_INT, "\nTrap\n"); - - env->regs[CR_ESTATUS] =3D env->regs[CR_STATUS]; - env->regs[CR_STATUS] &=3D ~0x3; - env->regs[R_EA] =3D env->regs[R_PC] + 4; - env->regs[R_PC] =3D cpu->exception_addr; - - gdbsig =3D TARGET_SIGTRAP; - break; - } - case 0xaa: - switch (env->regs[R_PC]) { - /*case 0x1000:*/ /* TODO:__kuser_helper_version */ - case 0x1004: /* __kuser_cmpxchg */ - start_exclusive(); - if (env->regs[4] & 0x3) { - goto kuser_fail; - } - ret =3D get_user_u32(env->regs[2], env->regs[4]); - if (ret) { - end_exclusive(); - goto kuser_fail; - } - env->regs[2] -=3D env->regs[5]; - if (env->regs[2] =3D=3D 0) { - put_user_u32(env->regs[6], env->regs[4]); - } - end_exclusive(); - env->regs[R_PC] =3D env->regs[R_RA]; - break; - /*case 0x1040:*/ /* TODO:__kuser_sigtramp */ - default: - ; -kuser_fail: - info.si_signo =3D TARGET_SIGSEGV; - info.si_errno =3D 0; - /* TODO: check env->error_code */ - info.si_code =3D TARGET_SEGV_MAPERR; - info._sifields._sigfault._addr =3D env->regs[R_PC]; - queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info); - } - break; - default: - EXCP_DUMP(env, "\nqemu: unhandled CPU exception %#x - aborting= \n", - trapnr); - gdbsig =3D TARGET_SIGILL; - break; - } - if (gdbsig) { - gdb_handlesig(cs, gdbsig); - if (gdbsig !=3D TARGET_SIGTRAP) { - exit(EXIT_FAILURE); - } - } - - process_pending_signals(env); - } -} - -#endif /* TARGET_NIOS2 */ - #ifdef TARGET_OPENRISC =20 void cpu_loop(CPUOpenRISCState *env) @@ -2545,36 +2442,6 @@ int main(int argc, char **argv, char **envp) env->regs[31] =3D regs->r31; =20 env->sregs[SR_PC] =3D regs->pc; } -#elif defined(TARGET_NIOS2) - { - env->regs[0] =3D 0; - env->regs[1] =3D regs->r1; - env->regs[2] =3D regs->r2; - env->regs[3] =3D regs->r3; - env->regs[4] =3D regs->r4; - env->regs[5] =3D regs->r5; - env->regs[6] =3D regs->r6; - env->regs[7] =3D regs->r7; - env->regs[8] =3D regs->r8; - env->regs[9] =3D regs->r9; - env->regs[10] =3D regs->r10; - env->regs[11] =3D regs->r11; - env->regs[12] =3D regs->r12; - env->regs[13] =3D regs->r13; - env->regs[14] =3D regs->r14; - env->regs[15] =3D regs->r15; - /* TODO: unsigned long orig_r2; */ - env->regs[R_RA] =3D regs->ra; - env->regs[R_FP] =3D regs->fp; - env->regs[R_SP] =3D regs->sp; - env->regs[R_GP] =3D regs->gp; - env->regs[CR_ESTATUS] =3D regs->estatus; - env->regs[R_EA] =3D regs->ea; - /* TODO: unsigned long orig_r7; */ - - /* Emulate eret when starting thread. */ - env->regs[R_PC] =3D regs->ea; - } #elif defined(TARGET_OPENRISC) { int i; diff --git a/linux-user/nios2/cpu_loop.c b/linux-user/nios2/cpu_loop.c index b7700a5561..dac7a06181 100644 --- a/linux-user/nios2/cpu_loop.c +++ b/linux-user/nios2/cpu_loop.c @@ -21,6 +21,132 @@ #include "qemu.h" #include "cpu_loop-common.h" =20 +void cpu_loop(CPUNios2State *env) +{ + CPUState *cs =3D ENV_GET_CPU(env); + Nios2CPU *cpu =3D NIOS2_CPU(cs); + target_siginfo_t info; + int trapnr, gdbsig, ret; + + for (;;) { + cpu_exec_start(cs); + trapnr =3D cpu_exec(cs); + cpu_exec_end(cs); + gdbsig =3D 0; + + switch (trapnr) { + case EXCP_INTERRUPT: + /* just indicate that signals should be handled asap */ + break; + case EXCP_TRAP: + if (env->regs[R_AT] =3D=3D 0) { + abi_long ret; + qemu_log_mask(CPU_LOG_INT, "\nSyscall\n"); + + ret =3D do_syscall(env, env->regs[2], + env->regs[4], env->regs[5], env->regs[6], + env->regs[7], env->regs[8], env->regs[9], + 0, 0); + + if (env->regs[2] =3D=3D 0) { /* FIXME: syscall 0 workar= ound */ + ret =3D 0; + } + + env->regs[2] =3D abs(ret); + /* Return value is 0..4096 */ + env->regs[7] =3D (ret > 0xfffffffffffff000ULL); + env->regs[CR_ESTATUS] =3D env->regs[CR_STATUS]; + env->regs[CR_STATUS] &=3D ~0x3; + env->regs[R_EA] =3D env->regs[R_PC] + 4; + env->regs[R_PC] +=3D 4; + break; + } else { + qemu_log_mask(CPU_LOG_INT, "\nTrap\n"); + + env->regs[CR_ESTATUS] =3D env->regs[CR_STATUS]; + env->regs[CR_STATUS] &=3D ~0x3; + env->regs[R_EA] =3D env->regs[R_PC] + 4; + env->regs[R_PC] =3D cpu->exception_addr; + + gdbsig =3D TARGET_SIGTRAP; + break; + } + case 0xaa: + switch (env->regs[R_PC]) { + /*case 0x1000:*/ /* TODO:__kuser_helper_version */ + case 0x1004: /* __kuser_cmpxchg */ + start_exclusive(); + if (env->regs[4] & 0x3) { + goto kuser_fail; + } + ret =3D get_user_u32(env->regs[2], env->regs[4]); + if (ret) { + end_exclusive(); + goto kuser_fail; + } + env->regs[2] -=3D env->regs[5]; + if (env->regs[2] =3D=3D 0) { + put_user_u32(env->regs[6], env->regs[4]); + } + end_exclusive(); + env->regs[R_PC] =3D env->regs[R_RA]; + break; + /*case 0x1040:*/ /* TODO:__kuser_sigtramp */ + default: + ; +kuser_fail: + info.si_signo =3D TARGET_SIGSEGV; + info.si_errno =3D 0; + /* TODO: check env->error_code */ + info.si_code =3D TARGET_SEGV_MAPERR; + info._sifields._sigfault._addr =3D env->regs[R_PC]; + queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info); + } + break; + default: + EXCP_DUMP(env, "\nqemu: unhandled CPU exception %#x - aborting= \n", + trapnr); + gdbsig =3D TARGET_SIGILL; + break; + } + if (gdbsig) { + gdb_handlesig(cs, gdbsig); + if (gdbsig !=3D TARGET_SIGTRAP) { + exit(EXIT_FAILURE); + } + } + + process_pending_signals(env); + } +} + void target_cpu_copy_regs(CPUArchState *env, struct target_pt_regs *regs) { + env->regs[0] =3D 0; + env->regs[1] =3D regs->r1; + env->regs[2] =3D regs->r2; + env->regs[3] =3D regs->r3; + env->regs[4] =3D regs->r4; + env->regs[5] =3D regs->r5; + env->regs[6] =3D regs->r6; + env->regs[7] =3D regs->r7; + env->regs[8] =3D regs->r8; + env->regs[9] =3D regs->r9; + env->regs[10] =3D regs->r10; + env->regs[11] =3D regs->r11; + env->regs[12] =3D regs->r12; + env->regs[13] =3D regs->r13; + env->regs[14] =3D regs->r14; + env->regs[15] =3D regs->r15; + /* TODO: unsigned long orig_r2; */ + env->regs[R_RA] =3D regs->ra; + env->regs[R_FP] =3D regs->fp; + env->regs[R_SP] =3D regs->sp; + env->regs[R_GP] =3D regs->gp; + env->regs[CR_ESTATUS] =3D regs->estatus; + env->regs[R_EA] =3D regs->ea; + /* TODO: unsigned long orig_r7; */ + + /* Emulate eret when starting thread. */ + env->regs[R_PC] =3D regs->ea; } --=20 2.14.3