[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v5 10/21] linux-user: Add cpu loop for AArch64
From: |
Peter Maydell |
Subject: |
[Qemu-devel] [PATCH v5 10/21] linux-user: Add cpu loop for AArch64 |
Date: |
Mon, 1 Jul 2013 18:35:09 +0100 |
Add the main linux-user cpu loop for AArch64. Since AArch64
has a different system call interface, doesn't need to worry
about FPA emulation and may in the future keep the prefetch/data
abort information in different system registers, it's simplest
just to use a completely separate loop from the 32 bit ARM
target, rather than peppering it with ifdefs.
Signed-off-by: Peter Maydell <address@hidden>
---
linux-user/main.c | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 82 insertions(+)
diff --git a/linux-user/main.c b/linux-user/main.c
index af82db8..8aba817 100644
--- a/linux-user/main.c
+++ b/linux-user/main.c
@@ -484,6 +484,9 @@ void cpu_loop(CPUX86State *env)
__r; \
})
+#ifdef TARGET_ABI32
+/* Commpage handling -- there is no commpage for AArch64 */
+
/*
* See the Linux kernel's Documentation/arm/kernel_user_helpers.txt
* Input:
@@ -617,6 +620,7 @@ do_kernel_trap(CPUARMState *env)
return 0;
}
+#endif
static int do_strex(CPUARMState *env)
{
@@ -696,6 +700,7 @@ done:
return segv;
}
+#ifdef TARGET_ABI32
void cpu_loop(CPUARMState *env)
{
CPUState *cs = CPU(arm_env_get_cpu(env));
@@ -908,6 +913,83 @@ void cpu_loop(CPUARMState *env)
}
}
+#else
+
+/* AArch64 main loop */
+void cpu_loop(CPUARMState *env)
+{
+ CPUState *cs = CPU(arm_env_get_cpu(env));
+ int trapnr, sig;
+ target_siginfo_t info;
+ uint32_t addr;
+
+ for (;;) {
+ cpu_exec_start(cs);
+ trapnr = cpu_arm_exec(env);
+ cpu_exec_end(cs);
+
+ switch (trapnr) {
+ case EXCP_SWI:
+ env->xregs[0] = do_syscall(env,
+ env->xregs[8],
+ env->xregs[0],
+ env->xregs[1],
+ env->xregs[2],
+ env->xregs[3],
+ env->xregs[4],
+ env->xregs[5],
+ 0, 0);
+ break;
+ case EXCP_INTERRUPT:
+ /* just indicate that signals should be handled asap */
+ break;
+ case EXCP_UDEF:
+ info.si_signo = SIGILL;
+ info.si_errno = 0;
+ info.si_code = TARGET_ILL_ILLOPN;
+ info._sifields._sigfault._addr = env->pc;
+ queue_signal(env, info.si_signo, &info);
+ break;
+ case EXCP_PREFETCH_ABORT:
+ addr = env->cp15.c6_insn;
+ goto do_segv;
+ case EXCP_DATA_ABORT:
+ addr = env->cp15.c6_data;
+ do_segv:
+ info.si_signo = SIGSEGV;
+ info.si_errno = 0;
+ /* XXX: check env->error_code */
+ info.si_code = TARGET_SEGV_MAPERR;
+ info._sifields._sigfault._addr = addr;
+ queue_signal(env, info.si_signo, &info);
+ break;
+ case EXCP_DEBUG:
+ case EXCP_BKPT:
+ 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);
+ }
+ break;
+ case EXCP_STREX:
+ if (do_strex(env)) {
+ addr = env->cp15.c6_data;
+ goto do_segv;
+ }
+ break;
+ default:
+ fprintf(stderr, "qemu: unhandled CPU exception 0x%x - aborting\n",
+ trapnr);
+ cpu_dump_state(cs, stderr, fprintf, 0);
+ abort();
+ }
+ process_pending_signals(env);
+ }
+}
+#endif /* ndef TARGET_ABI32 */
+
#endif
#ifdef TARGET_UNICORE32
--
1.7.9.5
- [Qemu-devel] [PATCH v5 05/21] target-arm: Pass DisasContext* to gen_set_pc_im(), (continued)
- [Qemu-devel] [PATCH v5 05/21] target-arm: Pass DisasContext* to gen_set_pc_im(), Peter Maydell, 2013/07/01
- [Qemu-devel] [PATCH v5 15/21] target-arm: Implement cpu_set_tls() and cpu_clone_regs() for AArch64, Peter Maydell, 2013/07/01
- [Qemu-devel] [PATCH v5 17/21] linux-user: Add AArch64 support, Peter Maydell, 2013/07/01
- [Qemu-devel] [PATCH v5 09/21] linux-user: Don't treat AArch64 cpu names specially, Peter Maydell, 2013/07/01
- [Qemu-devel] [PATCH v5 11/21] linux-user: Add syscall number definitions for AArch64, Peter Maydell, 2013/07/01
- [Qemu-devel] [PATCH v5 07/21] target-arm: Add AArch64 translation stub, Peter Maydell, 2013/07/01
- [Qemu-devel] [PATCH v5 08/21] gdbstub: Add AArch64 support, Peter Maydell, 2013/07/01
- [Qemu-devel] [PATCH v5 06/21] target-arm: Prepare translation for AArch64 code, Peter Maydell, 2013/07/01
- [Qemu-devel] [PATCH v5 20/21] default-configs: Add config for aarch64-linux-user, Peter Maydell, 2013/07/01
- [Qemu-devel] [PATCH v5 18/21] linux-user: AArch64 requires at least 3.8.0, Peter Maydell, 2013/07/01
- [Qemu-devel] [PATCH v5 10/21] linux-user: Add cpu loop for AArch64,
Peter Maydell <=
- [Qemu-devel] [PATCH v5 13/21] linux-user: Add signal handling for AArch64, Peter Maydell, 2013/07/01
- [Qemu-devel] [PATCH v5 14/21] linux-user: Make sure NWFPE code is 32 bit ARM only, Peter Maydell, 2013/07/01
- [Qemu-devel] [PATCH v5 03/21] target-arm: Export cpu_env, Peter Maydell, 2013/07/01
- [Qemu-devel] [PATCH v5 01/21] target-arm: Abstract out load/store from a vaddr in AArch32, Peter Maydell, 2013/07/01
- [Qemu-devel] [PATCH v5 21/21] default-configs: Add config for aarch64-softmmu, Peter Maydell, 2013/07/01
- [Qemu-devel] [PATCH v5 02/21] target-arm: Extract the disas struct to a header file, Peter Maydell, 2013/07/01
- [Qemu-devel] [PATCH v5 04/21] target-arm: Fix target_ulong/uint32_t confusions, Peter Maydell, 2013/07/01
- [Qemu-devel] [PATCH v5 16/21] linux-user: Add AArch64 termbits.h definitions, Peter Maydell, 2013/07/01
- [Qemu-devel] [PATCH v5 19/21] configure: Add handling code for AArch64 targets, Peter Maydell, 2013/07/01
- [Qemu-devel] [PATCH v5 12/21] linux-user: Fix up AArch64 syscall handlers, Peter Maydell, 2013/07/01