[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v4 17/21] LoongArch Linux User Emulation
From: |
Richard Henderson |
Subject: |
Re: [PATCH v4 17/21] LoongArch Linux User Emulation |
Date: |
Sun, 5 Sep 2021 12:04:38 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.13.0 |
On 9/2/21 2:41 PM, Song Gao wrote:
+#include "qemu/osdep.h"
+#include "qemu.h"
+#include "qemu-common.h"
+#include "cpu_loop-common.h"
+#include "elf.h"
+
+void cpu_loop(CPULoongArchState *env)
+{
+ CPUState *cs = env_cpu(env);
+ target_siginfo_t info;
+ int trapnr;
+ abi_long ret;
+
+ for (;;) {
+ cpu_exec_start(cs);
+ trapnr = cpu_exec(cs);
+ cpu_exec_end(cs);
+ process_queued_cpu_work(cs);
+
+ switch (trapnr) {
+ case EXCP_INTERRUPT:
+ /* just indicate that signals should be handled asap */
+ break;
+ case EXCP_SYSCALL:
+ env->pc += 4;
+ ret = do_syscall(env, env->gpr[11],
+ env->gpr[4], env->gpr[5],
+ env->gpr[6], env->gpr[7],
+ env->gpr[8], env->gpr[9],
+ -1, -1);
+ if (ret == -TARGET_ERESTARTSYS) {
+ env->pc -= 4;
+ break;
+ }
+ if (ret == -TARGET_QEMU_ESIGRETURN) {
+ /*
+ * Returning from a successful sigreturn syscall.
+ * Avoid clobbering register state.
+ */
+ break;
+ }
+ env->gpr[4] = ret;
+ break;
+ case EXCP_ADE:
+ info.si_signo = TARGET_SIGSEGV;
+ info.si_errno = 0;
+ info.si_code = TARGET_SEGV_MAPERR;
+ info._sifields._sigfault._addr = env->badaddr;
+ queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
+ break;
+ case EXCP_INE:
+ info.si_signo = TARGET_SIGILL;
+ info.si_errno = 0;
+ info.si_code = 0;
+ queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
Missing _addr = pc.
+ break;
+ case EXCP_FPE:
+ info.si_signo = TARGET_SIGFPE;
+ info.si_errno = 0;
+ info.si_code = TARGET_FPE_FLTUNK;
+ if (GET_FP_CAUSE(env->fcsr0) & FP_INVALID) {
+ info.si_code = TARGET_FPE_FLTINV;
+ } else if (GET_FP_CAUSE(env->fcsr0) & FP_DIV0) {
+ info.si_code = TARGET_FPE_FLTDIV;
+ } else if (GET_FP_CAUSE(env->fcsr0) & FP_OVERFLOW) {
+ info.si_code = TARGET_FPE_FLTOVF;
+ } else if (GET_FP_CAUSE(env->fcsr0) & FP_UNDERFLOW) {
+ info.si_code = TARGET_FPE_FLTUND;
+ } else if (GET_FP_CAUSE(env->fcsr0) & FP_INEXACT) {
+ info.si_code = TARGET_FPE_FLTRES;
+ }
+ queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
Likewise.
+ case EXCP_BREAK:
+ info.si_signo = TARGET_SIGTRAP;
+ info.si_code = TARGET_TRAP_BRKPT;
+ queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
Likewise.
Note that there are a set of patches on list that introduce a force_sig_fault(signo, code,
addr) function, so that none of these parameters get missed.
Missing an entry for EXCP_DEBUG, which should share code with EXCP_BREAK.
+struct sigframe {
+ uint32_t sf_ass[4]; /* argument save space for o32 */
Surely there is no "o32" for loongarch?
+ uint32_t sf_code[2]; /* signal trampoline */
Note that there are patches on-list for moving the signal trampoline off of the
stack.
diff --git a/linux-user/loongarch64/termbits.h
b/linux-user/loongarch64/termbits.h
new file mode 100644
index 0000000..33e74ed
--- /dev/null
+++ b/linux-user/loongarch64/termbits.h
@@ -0,0 +1,229 @@
+#ifndef LINUX_USER_LOONGARCH_TERMBITS_H
+#define LINUX_USER_LOONGARCH_TERMBITS_H
+
+#define TARGET_NCCS 19
Surely you should be using generic/termbits.h?
We will prefer not to merge a linux-user port that is not upstream, because the ABI may
change in between. Can you provide a pointer to your kernel port in the meantime?
r~
- Re: [PATCH v4 20/21] target/loongarch: 'make check-tcg' support, (continued)
- [PATCH v4 15/21] target/loongarch: Add branch instruction translation, Song Gao, 2021/09/02
- [PATCH v4 18/21] default-configs: Add loongarch linux-user support, Song Gao, 2021/09/02
- [PATCH v4 19/21] target/loongarch: Add target build suport, Song Gao, 2021/09/02
- [PATCH v4 21/21] scripts: add loongarch64 binfmt config, Song Gao, 2021/09/02
- [PATCH v4 16/21] target/loongarch: Add disassembler, Song Gao, 2021/09/02
- [PATCH v4 17/21] LoongArch Linux User Emulation, Song Gao, 2021/09/02
- Re: [PATCH v4 17/21] LoongArch Linux User Emulation,
Richard Henderson <=