[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v6 13/24] linux-user: Add cpu loop for AArch64
From: |
Peter Maydell |
Subject: |
[Qemu-devel] [PATCH v6 13/24] linux-user: Add cpu loop for AArch64 |
Date: |
Tue, 3 Sep 2013 20:12:13 +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 03859bc..28cc58a 100644
--- a/linux-user/main.c
+++ b/linux-user/main.c
@@ -445,6 +445,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:
@@ -578,6 +581,7 @@ do_kernel_trap(CPUARMState *env)
return 0;
}
+#endif
static int do_strex(CPUARMState *env)
{
@@ -657,6 +661,7 @@ done:
return segv;
}
+#ifdef TARGET_ABI32
void cpu_loop(CPUARMState *env)
{
CPUState *cs = CPU(arm_env_get_cpu(env));
@@ -869,6 +874,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(cs, 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 v6 15/24] linux-user: Fix up AArch64 syscall handlers, (continued)
- [Qemu-devel] [PATCH v6 15/24] linux-user: Fix up AArch64 syscall handlers, Peter Maydell, 2013/09/03
- [Qemu-devel] [PATCH v6 24/24] default-configs: Add config for aarch64-softmmu, Peter Maydell, 2013/09/03
- [Qemu-devel] [PATCH v6 01/24] target-arm: Make '-cpu any' available in linux-user mode only, Peter Maydell, 2013/09/03
- [Qemu-devel] [PATCH v6 08/24] target-arm: Disable 32 bit CPUs in 64 bit linux-user builds, Peter Maydell, 2013/09/03
- [Qemu-devel] [PATCH v6 17/24] linux-user: Make sure NWFPE code is 32 bit ARM only, Peter Maydell, 2013/09/03
- [Qemu-devel] [PATCH v6 12/24] linux-user: Don't treat AArch64 cpu names specially, Peter Maydell, 2013/09/03
- [Qemu-devel] [PATCH v6 22/24] configure: Add handling code for AArch64 targets, Peter Maydell, 2013/09/03
- [Qemu-devel] [PATCH v6 04/24] target-arm: Export cpu_env, Peter Maydell, 2013/09/03
- [Qemu-devel] [PATCH v6 03/24] target-arm: Extract the disas struct to a header file, Peter Maydell, 2013/09/03
- [Qemu-devel] [PATCH v6 18/24] linux-user: Implement cpu_set_tls() and cpu_clone_regs() for AArch64, Peter Maydell, 2013/09/03
- [Qemu-devel] [PATCH v6 13/24] linux-user: Add cpu loop for AArch64,
Peter Maydell <=
- [Qemu-devel] [PATCH v6 07/24] target-arm: Add new AArch64CPUInfo base class and subclasses, Peter Maydell, 2013/09/03
- [Qemu-devel] [PATCH v6 21/24] linux-user: Add AArch64 support, Peter Maydell, 2013/09/03
- [Qemu-devel] [PATCH v6 20/24] linux-user: Allow targets to specify a minimum uname release, Peter Maydell, 2013/09/03
- [Qemu-devel] [PATCH v6 06/24] target-arm: Pass DisasContext* to gen_set_pc_im(), Peter Maydell, 2013/09/03
- [Qemu-devel] [PATCH v6 19/24] linux-user: Add AArch64 termbits.h definitions, Peter Maydell, 2013/09/03
- [Qemu-devel] [PATCH v6 11/24] target-arm: Add AArch64 gdbstub support, Peter Maydell, 2013/09/03
- [Qemu-devel] [PATCH v6 16/24] linux-user: Add signal handling for AArch64, Peter Maydell, 2013/09/03
- [Qemu-devel] [PATCH v6 10/24] target-arm: Add AArch64 translation stub, Peter Maydell, 2013/09/03
- [Qemu-devel] [PATCH v6 14/24] linux-user: Add syscall number definitions for AArch64, Peter Maydell, 2013/09/03
- [Qemu-devel] [PATCH v6 09/24] target-arm: Prepare translation for AArch64 code, Peter Maydell, 2013/09/03