All of lore.kernel.org
 help / color / mirror / Atom feed
From: Laurent Vivier <laurent@vivier.eu>
To: qemu-devel@nongnu.org
Cc: Peter Maydell <peter.maydell@linaro.org>,
	Richard Henderson <richard.henderson@linaro.org>,
	Laurent Vivier <laurent@vivier.eu>
Subject: [PULL 10/30] linux-user/i386: Use force_sig, force_sig_fault
Date: Tue, 11 Jan 2022 20:52:27 +0100	[thread overview]
Message-ID: <20220111195247.1737641-11-laurent@vivier.eu> (raw)
In-Reply-To: <20220111195247.1737641-1-laurent@vivier.eu>

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

Replace the local gen_signal with the generic functions that match
how the kernel raises signals. Fill in the missing PC for SIGTRAP.

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Message-Id: <20220107213243.212806-11-richard.henderson@linaro.org>
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
---
 linux-user/i386/cpu_loop.c | 47 +++++++++++++++-----------------------
 1 file changed, 18 insertions(+), 29 deletions(-)

diff --git a/linux-user/i386/cpu_loop.c b/linux-user/i386/cpu_loop.c
index ac0f4e321111..29dfd7cd0c54 100644
--- a/linux-user/i386/cpu_loop.c
+++ b/linux-user/i386/cpu_loop.c
@@ -84,17 +84,6 @@ static void set_idt(int n, unsigned int dpl)
 }
 #endif
 
-static void gen_signal(CPUX86State *env, int sig, int code, abi_ptr addr)
-{
-    target_siginfo_t info = {
-        .si_signo = sig,
-        .si_code = code,
-        ._sifields._sigfault._addr = addr
-    };
-
-    queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
-}
-
 #ifdef TARGET_X86_64
 static bool write_ok_or_segv(CPUX86State *env, abi_ptr addr, size_t len)
 {
@@ -107,7 +96,7 @@ static bool write_ok_or_segv(CPUX86State *env, abi_ptr addr, size_t len)
     }
 
     env->error_code = PG_ERROR_W_MASK | PG_ERROR_U_MASK;
-    gen_signal(env, TARGET_SIGSEGV, TARGET_SEGV_MAPERR, addr);
+    force_sig_fault(TARGET_SIGSEGV, TARGET_SEGV_MAPERR, addr);
     return false;
 }
 
@@ -193,8 +182,7 @@ static void emulate_vsyscall(CPUX86State *env)
     return;
 
  sigsegv:
-    /* Like force_sig(SIGSEGV).  */
-    gen_signal(env, TARGET_SIGSEGV, TARGET_SI_KERNEL, 0);
+    force_sig(TARGET_SIGSEGV);
 }
 #endif
 
@@ -266,53 +254,54 @@ void cpu_loop(CPUX86State *env)
 #endif
         case EXCP0B_NOSEG:
         case EXCP0C_STACK:
-            gen_signal(env, TARGET_SIGBUS, TARGET_SI_KERNEL, 0);
+            force_sig(TARGET_SIGBUS);
             break;
         case EXCP0D_GPF:
             /* XXX: potential problem if ABI32 */
             if (maybe_handle_vm86_trap(env, trapnr)) {
                 break;
             }
-            gen_signal(env, TARGET_SIGSEGV, TARGET_SI_KERNEL, 0);
+            force_sig(TARGET_SIGSEGV);
             break;
         case EXCP0E_PAGE:
-            gen_signal(env, TARGET_SIGSEGV,
-                       (env->error_code & 1 ?
-                        TARGET_SEGV_ACCERR : TARGET_SEGV_MAPERR),
-                       env->cr[2]);
+            force_sig_fault(TARGET_SIGSEGV,
+                            (env->error_code & PG_ERROR_P_MASK ?
+                             TARGET_SEGV_ACCERR : TARGET_SEGV_MAPERR),
+                            env->cr[2]);
             break;
         case EXCP00_DIVZ:
             if (maybe_handle_vm86_trap(env, trapnr)) {
                 break;
             }
-            gen_signal(env, TARGET_SIGFPE, TARGET_FPE_INTDIV, env->eip);
+            force_sig_fault(TARGET_SIGFPE, TARGET_FPE_INTDIV, env->eip);
             break;
         case EXCP01_DB:
-        case EXCP03_INT3:
             if (maybe_handle_vm86_trap(env, trapnr)) {
                 break;
             }
-            if (trapnr == EXCP01_DB) {
-                gen_signal(env, TARGET_SIGTRAP, TARGET_TRAP_BRKPT, env->eip);
-            } else {
-                gen_signal(env, TARGET_SIGTRAP, TARGET_SI_KERNEL, 0);
+            force_sig_fault(TARGET_SIGTRAP, TARGET_TRAP_BRKPT, env->eip);
+            break;
+        case EXCP03_INT3:
+            if (maybe_handle_vm86_trap(env, trapnr)) {
+                break;
             }
+            force_sig(TARGET_SIGTRAP);
             break;
         case EXCP04_INTO:
         case EXCP05_BOUND:
             if (maybe_handle_vm86_trap(env, trapnr)) {
                 break;
             }
-            gen_signal(env, TARGET_SIGSEGV, TARGET_SI_KERNEL, 0);
+            force_sig(TARGET_SIGSEGV);
             break;
         case EXCP06_ILLOP:
-            gen_signal(env, TARGET_SIGILL, TARGET_ILL_ILLOPN, env->eip);
+            force_sig_fault(TARGET_SIGILL, TARGET_ILL_ILLOPN, env->eip);
             break;
         case EXCP_INTERRUPT:
             /* just indicate that signals should be handled asap */
             break;
         case EXCP_DEBUG:
-            gen_signal(env, TARGET_SIGTRAP, TARGET_TRAP_BRKPT, 0);
+            force_sig_fault(TARGET_SIGTRAP, TARGET_TRAP_BRKPT, env->eip);
             break;
         case EXCP_ATOMIC:
             cpu_exec_step_atomic(cs);
-- 
2.33.1



  parent reply	other threads:[~2022-01-11 20:02 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 ` Laurent Vivier [this message]
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 ` [PULL 14/30] linux-user/mips: Improve do_break Laurent Vivier
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-11-laurent@vivier.eu \
    --to=laurent@vivier.eu \
    --cc=peter.maydell@linaro.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.