[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH for 2.13 17/19] linux-user: move riscv cpu loop
From: |
Michael Clark |
Subject: |
Re: [Qemu-devel] [PATCH for 2.13 17/19] linux-user: move riscv cpu loop to riscv directory |
Date: |
Mon, 26 Mar 2018 14:48:00 -0700 |
On Mon, Mar 26, 2018 at 12:16 PM, Laurent Vivier <address@hidden> wrote:
> No code change, only move code from main.c to
> riscv/cpu_loop.c.
>
> Signed-off-by: Laurent Vivier <address@hidden>
>
Reviewed-by: Michael Clark <address@hidden>
> ---
> linux-user/main.c | 101 +-----------------------------
> --------------
> linux-user/riscv/cpu_loop.c | 92 ++++++++++++++++++++++++++++++
> ++++++++++
> 2 files changed, 93 insertions(+), 100 deletions(-)
>
> diff --git a/linux-user/main.c b/linux-user/main.c
> index 3b3613cb89..78ff99bd00 100644
> --- a/linux-user/main.c
> +++ b/linux-user/main.c
> @@ -149,100 +149,6 @@ void fork_end(int child)
> }
> }
>
> -#ifdef TARGET_RISCV
> -
> -void cpu_loop(CPURISCVState *env)
> -{
> - CPUState *cs = CPU(riscv_env_get_cpu(env));
> - int trapnr, signum, sigcode;
> - target_ulong sigaddr;
> - target_ulong ret;
> -
> - for (;;) {
> - cpu_exec_start(cs);
> - trapnr = cpu_exec(cs);
> - cpu_exec_end(cs);
> - process_queued_cpu_work(cs);
> -
> - signum = 0;
> - sigcode = 0;
> - sigaddr = 0;
> -
> - switch (trapnr) {
> - case EXCP_INTERRUPT:
> - /* just indicate that signals should be handled asap */
> - break;
> - case EXCP_ATOMIC:
> - cpu_exec_step_atomic(cs);
> - break;
> - case RISCV_EXCP_U_ECALL:
> - env->pc += 4;
> - if (env->gpr[xA7] == TARGET_NR_arch_specific_syscall + 15) {
> - /* riscv_flush_icache_syscall is a no-op in QEMU as
> - self-modifying code is automatically detected */
> - ret = 0;
> - } else {
> - ret = do_syscall(env,
> - env->gpr[xA7],
> - env->gpr[xA0],
> - env->gpr[xA1],
> - env->gpr[xA2],
> - env->gpr[xA3],
> - env->gpr[xA4],
> - env->gpr[xA5],
> - 0, 0);
> - }
> - if (ret == -TARGET_ERESTARTSYS) {
> - env->pc -= 4;
> - } else if (ret != -TARGET_QEMU_ESIGRETURN) {
> - env->gpr[xA0] = ret;
> - }
> - if (cs->singlestep_enabled) {
> - goto gdbstep;
> - }
> - break;
> - case RISCV_EXCP_ILLEGAL_INST:
> - signum = TARGET_SIGILL;
> - sigcode = TARGET_ILL_ILLOPC;
> - break;
> - case RISCV_EXCP_BREAKPOINT:
> - signum = TARGET_SIGTRAP;
> - sigcode = TARGET_TRAP_BRKPT;
> - sigaddr = env->pc;
> - break;
> - case RISCV_EXCP_INST_PAGE_FAULT:
> - case RISCV_EXCP_LOAD_PAGE_FAULT:
> - case RISCV_EXCP_STORE_PAGE_FAULT:
> - signum = TARGET_SIGSEGV;
> - sigcode = TARGET_SEGV_MAPERR;
> - break;
> - case EXCP_DEBUG:
> - gdbstep:
> - signum = gdb_handlesig(cs, TARGET_SIGTRAP);
> - sigcode = TARGET_TRAP_BRKPT;
> - break;
> - default:
> - EXCP_DUMP(env, "\nqemu: unhandled CPU exception %#x -
> aborting\n",
> - trapnr);
> - exit(EXIT_FAILURE);
> - }
> -
> - if (signum) {
> - target_siginfo_t info = {
> - .si_signo = signum,
> - .si_errno = 0,
> - .si_code = sigcode,
> - ._sifields._sigfault._addr = sigaddr
> - };
> - queue_signal(env, info.si_signo, QEMU_SI_KILL, &info);
> - }
> -
> - process_pending_signals(env);
> - }
> -}
> -
> -#endif /* TARGET_RISCV */
> -
> #ifdef TARGET_HPPA
>
> static abi_ulong hppa_lws(CPUHPPAState *env)
> @@ -1319,12 +1225,7 @@ int main(int argc, char **argv, char **envp)
>
> target_cpu_copy_regs(env, regs);
>
> -#if defined(TARGET_RISCV)
> - {
> - env->pc = regs->sepc;
> - env->gpr[xSP] = regs->sp;
> - }
> -#elif defined(TARGET_HPPA)
> +#if defined(TARGET_HPPA)
> {
> int i;
> for (i = 1; i < 32; i++) {
> diff --git a/linux-user/riscv/cpu_loop.c b/linux-user/riscv/cpu_loop.c
> index b7700a5561..f137d39d7e 100644
> --- a/linux-user/riscv/cpu_loop.c
> +++ b/linux-user/riscv/cpu_loop.c
> @@ -21,6 +21,98 @@
> #include "qemu.h"
> #include "cpu_loop-common.h"
>
> +void cpu_loop(CPURISCVState *env)
> +{
> + CPUState *cs = CPU(riscv_env_get_cpu(env));
> + int trapnr, signum, sigcode;
> + target_ulong sigaddr;
> + target_ulong ret;
> +
> + for (;;) {
> + cpu_exec_start(cs);
> + trapnr = cpu_exec(cs);
> + cpu_exec_end(cs);
> + process_queued_cpu_work(cs);
> +
> + signum = 0;
> + sigcode = 0;
> + sigaddr = 0;
> +
> + switch (trapnr) {
> + case EXCP_INTERRUPT:
> + /* just indicate that signals should be handled asap */
> + break;
> + case EXCP_ATOMIC:
> + cpu_exec_step_atomic(cs);
> + break;
> + case RISCV_EXCP_U_ECALL:
> + env->pc += 4;
> + if (env->gpr[xA7] == TARGET_NR_arch_specific_syscall + 15) {
> + /* riscv_flush_icache_syscall is a no-op in QEMU as
> + self-modifying code is automatically detected */
> + ret = 0;
> + } else {
> + ret = do_syscall(env,
> + env->gpr[xA7],
> + env->gpr[xA0],
> + env->gpr[xA1],
> + env->gpr[xA2],
> + env->gpr[xA3],
> + env->gpr[xA4],
> + env->gpr[xA5],
> + 0, 0);
> + }
> + if (ret == -TARGET_ERESTARTSYS) {
> + env->pc -= 4;
> + } else if (ret != -TARGET_QEMU_ESIGRETURN) {
> + env->gpr[xA0] = ret;
> + }
> + if (cs->singlestep_enabled) {
> + goto gdbstep;
> + }
> + break;
> + case RISCV_EXCP_ILLEGAL_INST:
> + signum = TARGET_SIGILL;
> + sigcode = TARGET_ILL_ILLOPC;
> + break;
> + case RISCV_EXCP_BREAKPOINT:
> + signum = TARGET_SIGTRAP;
> + sigcode = TARGET_TRAP_BRKPT;
> + sigaddr = env->pc;
> + break;
> + case RISCV_EXCP_INST_PAGE_FAULT:
> + case RISCV_EXCP_LOAD_PAGE_FAULT:
> + case RISCV_EXCP_STORE_PAGE_FAULT:
> + signum = TARGET_SIGSEGV;
> + sigcode = TARGET_SEGV_MAPERR;
> + break;
> + case EXCP_DEBUG:
> + gdbstep:
> + signum = gdb_handlesig(cs, TARGET_SIGTRAP);
> + sigcode = TARGET_TRAP_BRKPT;
> + break;
> + default:
> + EXCP_DUMP(env, "\nqemu: unhandled CPU exception %#x -
> aborting\n",
> + trapnr);
> + exit(EXIT_FAILURE);
> + }
> +
> + if (signum) {
> + target_siginfo_t info = {
> + .si_signo = signum,
> + .si_errno = 0,
> + .si_code = sigcode,
> + ._sifields._sigfault._addr = sigaddr
> + };
> + queue_signal(env, info.si_signo, QEMU_SI_KILL, &info);
> + }
> +
> + process_pending_signals(env);
> + }
> +}
> +
> void target_cpu_copy_regs(CPUArchState *env, struct target_pt_regs *regs)
> {
> + env->pc = regs->sepc;
> + env->gpr[xSP] = regs->sp;
> }
> --
> 2.14.3
>
>
>
- [Qemu-devel] [PATCH for 2.13 02/19] linux-user: move i386/x86_64 cpu loop to i386 directory, (continued)
- [Qemu-devel] [PATCH for 2.13 02/19] linux-user: move i386/x86_64 cpu loop to i386 directory, Laurent Vivier, 2018/03/26
- [Qemu-devel] [PATCH for 2.13 10/19] linux-user: move sh4 cpu loop to sh4 directory, Laurent Vivier, 2018/03/26
- [Qemu-devel] [PATCH for 2.13 11/19] linux-user: move cris cpu loop to cris directory, Laurent Vivier, 2018/03/26
- [Qemu-devel] [PATCH for 2.13 15/19] linux-user: move s390x cpu loop to s390x directory, Laurent Vivier, 2018/03/26
- [Qemu-devel] [PATCH for 2.13 12/19] linux-user: move microblaze cpu loop to microblaze directory, Laurent Vivier, 2018/03/26
- [Qemu-devel] [PATCH for 2.13 13/19] linux-user: move m68k cpu loop to m68k directory, Laurent Vivier, 2018/03/26
- [Qemu-devel] [PATCH for 2.13 19/19] linux-user: move xtensa cpu loop to xtensa directory, Laurent Vivier, 2018/03/26
- [Qemu-devel] [PATCH for 2.13 16/19] linux-user: move tilegx cpu loop to tilegx directory, Laurent Vivier, 2018/03/26
- [Qemu-devel] [PATCH for 2.13 17/19] linux-user: move riscv cpu loop to riscv directory, Laurent Vivier, 2018/03/26
- Re: [Qemu-devel] [PATCH for 2.13 17/19] linux-user: move riscv cpu loop to riscv directory,
Michael Clark <=
- [Qemu-devel] [PATCH for 2.13 14/19] linux-user: move alpha cpu loop to alpha directory, Laurent Vivier, 2018/03/26
- [Qemu-devel] [PATCH for 2.13 07/19] linux-user: move mips/mips64 cpu loop to mips directory, Laurent Vivier, 2018/03/26
- [Qemu-devel] [PATCH for 2.13 18/19] linux-user: move hppa cpu loop to hppa directory, Laurent Vivier, 2018/03/26
- Re: [Qemu-devel] [PATCH for 2.13 00/19] linux-user: move arch specific parts from main.c to arch directories, Richard Henderson, 2018/03/28
- Re: [Qemu-devel] [PATCH for 2.13 00/19] linux-user: move arch specific parts from main.c to arch directories, no-reply, 2018/03/29
- Re: [Qemu-devel] [PATCH for 2.13 00/19] linux-user: move arch specific parts from main.c to arch directories, no-reply, 2018/03/31