All of lore.kernel.org
 help / color / mirror / Atom feed
From: Laurent Vivier <laurent@vivier.eu>
To: qemu-devel@nongnu.org
Cc: "Richard Henderson" <richard.henderson@linaro.org>,
	"Philippe Mathieu-Daudé" <f4bug@amsat.org>,
	"Laurent Vivier" <laurent@vivier.eu>
Subject: [PULL 14/30] linux-user/mips: Improve do_break
Date: Tue, 11 Jan 2022 20:52:31 +0100	[thread overview]
Message-ID: <20220111195247.1737641-15-laurent@vivier.eu> (raw)
In-Reply-To: <20220111195247.1737641-1-laurent@vivier.eu>

From: Richard Henderson <richard.henderson@linaro.org>

Rename to do_tr_or_bp, as per the kernel function.
Add a 'trap' argument, akin to the kernel's si_code, but clearer.
The return value is always 0, so change the return value to void.
Use force_sig and force_sig_fault.

Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Message-Id: <20220107213243.212806-15-richard.henderson@linaro.org>
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
---
 linux-user/mips/cpu_loop.c | 46 +++++++++++++++++++++-----------------
 1 file changed, 26 insertions(+), 20 deletions(-)

diff --git a/linux-user/mips/cpu_loop.c b/linux-user/mips/cpu_loop.c
index 32f9fc1c1c7c..4fa24cc07452 100644
--- a/linux-user/mips/cpu_loop.c
+++ b/linux-user/mips/cpu_loop.c
@@ -40,29 +40,25 @@ enum {
     BRK_DIVZERO = 7
 };
 
-static int do_break(CPUMIPSState *env, target_siginfo_t *info,
-                    unsigned int code)
+static void do_tr_or_bp(CPUMIPSState *env, unsigned int code, bool trap)
 {
-    int ret = -1;
+    target_ulong pc = env->active_tc.PC;
 
     switch (code) {
     case BRK_OVERFLOW:
+        force_sig_fault(TARGET_SIGFPE, TARGET_FPE_INTOVF, pc);
+        break;
     case BRK_DIVZERO:
-        info->si_signo = TARGET_SIGFPE;
-        info->si_errno = 0;
-        info->si_code = (code == BRK_OVERFLOW) ? FPE_INTOVF : FPE_INTDIV;
-        queue_signal(env, info->si_signo, QEMU_SI_FAULT, &*info);
-        ret = 0;
+        force_sig_fault(TARGET_SIGFPE, TARGET_FPE_INTDIV, pc);
         break;
     default:
-        info->si_signo = TARGET_SIGTRAP;
-        info->si_errno = 0;
-        queue_signal(env, info->si_signo, QEMU_SI_FAULT, &*info);
-        ret = 0;
+        if (trap) {
+            force_sig(TARGET_SIGTRAP);
+        } else {
+            force_sig_fault(TARGET_SIGTRAP, TARGET_TRAP_BRKPT, pc);
+        }
         break;
     }
-
-    return ret;
 }
 
 void cpu_loop(CPUMIPSState *env)
@@ -205,6 +201,13 @@ done_syscall:
                 abi_ulong trap_instr;
                 unsigned int code;
 
+                /*
+                 * FIXME: It would be better to decode the trap number
+                 * during translate, and store it in error_code while
+                 * raising the exception.  We should not be re-reading
+                 * the opcode here.
+                 */
+
                 if (env->hflags & MIPS_HFLAG_M16) {
                     if (env->insn_flags & ASE_MICROMIPS) {
                         /* microMIPS mode */
@@ -257,9 +260,7 @@ done_syscall:
                     }
                 }
 
-                if (do_break(env, &info, code) != 0) {
-                    goto error;
-                }
+                do_tr_or_bp(env, code, false);
             }
             break;
         case EXCP_TRAP:
@@ -267,6 +268,13 @@ done_syscall:
                 abi_ulong trap_instr;
                 unsigned int code = 0;
 
+                /*
+                 * FIXME: It would be better to decode the trap number
+                 * during translate, and store it in error_code while
+                 * raising the exception.  We should not be re-reading
+                 * the opcode here.
+                 */
+
                 if (env->hflags & MIPS_HFLAG_M16) {
                     /* microMIPS mode */
                     abi_ulong instr[2];
@@ -293,9 +301,7 @@ done_syscall:
                     }
                 }
 
-                if (do_break(env, &info, code) != 0) {
-                    goto error;
-                }
+                do_tr_or_bp(env, code, true);
             }
             break;
         case EXCP_ATOMIC:
-- 
2.33.1



  parent reply	other threads:[~2022-01-11 20:17 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-01-11 19:52 [PULL 00/30] Linux user for 7.0 patches Laurent Vivier
2022-01-11 19:52 ` [PULL 01/30] linux-user/alpha: Set TRAP_UNK for bugchk and unknown gentrap Laurent Vivier
2022-01-11 19:52 ` [PULL 02/30] linux-user/alpha: Set FPE_FLTUNK for gentrap ROPRAND Laurent Vivier
2022-01-11 19:52 ` [PULL 03/30] linux-user/alpha: Use force_sig_fault Laurent Vivier
2022-01-11 19:52 ` [PULL 04/30] linux-user/cris: " Laurent Vivier
2022-01-11 19:52 ` [PULL 05/30] linux-user/hppa: " Laurent Vivier
2022-01-11 19:52 ` [PULL 06/30] linux-user/hppa: Use the proper si_code for PRIV_OPR, PRIV_REG, OVERFLOW Laurent Vivier
2022-01-11 19:52 ` [PULL 07/30] linux-user: Remove TARGET_NSIGFPE Laurent Vivier
2022-01-11 19:52 ` [PULL 08/30] linux-user/hppa: Set FPE_CONDTRAP for COND Laurent Vivier
2022-01-11 19:52 ` [PULL 09/30] linux-user/i386: Split out maybe_handle_vm86_trap Laurent Vivier
2022-01-11 19:52 ` [PULL 10/30] linux-user/i386: Use force_sig, force_sig_fault Laurent Vivier
2022-01-11 19:52 ` [PULL 11/30] linux-user/m68k: Use force_sig_fault Laurent Vivier
2022-01-11 19:52 ` [PULL 12/30] linux-user/microblaze: " Laurent Vivier
2022-01-11 19:52 ` [PULL 13/30] linux-user/microblaze: Fix SIGFPE si_codes Laurent Vivier
2022-01-11 19:52 ` Laurent Vivier [this message]
2022-01-11 19:52 ` [PULL 15/30] linux-user/mips: Use force_sig_fault Laurent Vivier
2022-01-11 19:52 ` [PULL 16/30] target/mips: Extract break code into env->error_code Laurent Vivier
2022-01-11 19:52 ` [PULL 17/30] target/mips: Extract trap " Laurent Vivier
2022-01-11 19:52 ` [PULL 18/30] linux-user/openrisc: Use force_sig_fault Laurent Vivier
2022-01-11 19:52 ` [PULL 19/30] linux-user/ppc: " Laurent Vivier
2022-01-11 19:52 ` [PULL 20/30] linux-user/riscv: " Laurent Vivier
2022-01-11 19:52 ` [PULL 21/30] linux-user/s390x: " Laurent Vivier
2022-01-11 19:52 ` [PULL 22/30] linux-user/sh4: " Laurent Vivier
2022-01-11 19:52 ` [PULL 23/30] linux-user/sparc: " Laurent Vivier
2022-01-11 19:52 ` [PULL 24/30] linux-user/xtensa: " Laurent Vivier
2022-01-11 19:52 ` [PULL 25/30] linux-user/arm: Move target_oabi_flock64 out of target_structs.h Laurent Vivier
2022-01-11 19:52 ` [PULL 26/30] linux-user: Move target_struct.h generic definitions to generic/ Laurent Vivier
2022-01-11 19:52 ` [PULL 27/30] linux-user: Do not special-case NULL for PR_GET_PDEATHSIG Laurent Vivier
2022-01-11 19:52 ` [PULL 28/30] linux-user: Map signal number in PR_GET_PDEATHSIG Laurent Vivier
2022-01-11 19:52 ` [PULL 29/30] linux-user: Implement PR_SET_PDEATHSIG Laurent Vivier
2022-01-11 19:52 ` [PULL 30/30] linux-user: Implement capability prctls Laurent Vivier
2022-01-12 16:03 ` [PULL 00/30] Linux user for 7.0 patches Peter Maydell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220111195247.1737641-15-laurent@vivier.eu \
    --to=laurent@vivier.eu \
    --cc=f4bug@amsat.org \
    --cc=qemu-devel@nongnu.org \
    --cc=richard.henderson@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.