All of lore.kernel.org
 help / color / mirror / Atom feed
From: Richard Henderson <richard.henderson@linaro.org>
To: qemu-devel@nongnu.org
Cc: alex.bennee@linaro.org, laurent@vivier.eu,
	"Philippe Mathieu-Daudé" <f4bug@amsat.org>
Subject: [PATCH v4 27/41] target/i386: Implement x86_cpu_record_sigsegv
Date: Wed,  6 Oct 2021 10:22:53 -0700	[thread overview]
Message-ID: <20211006172307.780893-28-richard.henderson@linaro.org> (raw)
In-Reply-To: <20211006172307.780893-1-richard.henderson@linaro.org>

Record cr2, error_code, and exception_index.  That last means
that we must exit to cpu_loop ourselves, instead of letting
exception_index being overwritten.

Use the maperr parameter to properly set PG_ERROR_P_MASK.

Reviewed by: Warner Losh <imp@bsdimp.com>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 target/i386/tcg/helper-tcg.h       |  6 ++++++
 target/i386/tcg/tcg-cpu.c          |  3 ++-
 target/i386/tcg/user/excp_helper.c | 23 +++++++++++++++++------
 3 files changed, 25 insertions(+), 7 deletions(-)

diff --git a/target/i386/tcg/helper-tcg.h b/target/i386/tcg/helper-tcg.h
index 60ca09e95e..0a4401e917 100644
--- a/target/i386/tcg/helper-tcg.h
+++ b/target/i386/tcg/helper-tcg.h
@@ -43,9 +43,15 @@ bool x86_cpu_exec_interrupt(CPUState *cpu, int int_req);
 #endif
 
 /* helper.c */
+#ifdef CONFIG_USER_ONLY
+void x86_cpu_record_sigsegv(CPUState *cs, vaddr addr,
+                            MMUAccessType access_type,
+                            bool maperr, uintptr_t ra);
+#else
 bool x86_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
                       MMUAccessType access_type, int mmu_idx,
                       bool probe, uintptr_t retaddr);
+#endif
 
 void breakpoint_handler(CPUState *cs);
 
diff --git a/target/i386/tcg/tcg-cpu.c b/target/i386/tcg/tcg-cpu.c
index 3ecfae34cb..6fdfdf9598 100644
--- a/target/i386/tcg/tcg-cpu.c
+++ b/target/i386/tcg/tcg-cpu.c
@@ -72,10 +72,11 @@ static const struct TCGCPUOps x86_tcg_ops = {
     .synchronize_from_tb = x86_cpu_synchronize_from_tb,
     .cpu_exec_enter = x86_cpu_exec_enter,
     .cpu_exec_exit = x86_cpu_exec_exit,
-    .tlb_fill = x86_cpu_tlb_fill,
 #ifdef CONFIG_USER_ONLY
     .fake_user_interrupt = x86_cpu_do_interrupt,
+    .record_sigsegv = x86_cpu_record_sigsegv,
 #else
+    .tlb_fill = x86_cpu_tlb_fill,
     .do_interrupt = x86_cpu_do_interrupt,
     .cpu_exec_interrupt = x86_cpu_exec_interrupt,
     .debug_excp_handler = breakpoint_handler,
diff --git a/target/i386/tcg/user/excp_helper.c b/target/i386/tcg/user/excp_helper.c
index a89b5228fd..cd507e2a1b 100644
--- a/target/i386/tcg/user/excp_helper.c
+++ b/target/i386/tcg/user/excp_helper.c
@@ -22,18 +22,29 @@
 #include "exec/exec-all.h"
 #include "tcg/helper-tcg.h"
 
-bool x86_cpu_tlb_fill(CPUState *cs, vaddr addr, int size,
-                      MMUAccessType access_type, int mmu_idx,
-                      bool probe, uintptr_t retaddr)
+void x86_cpu_record_sigsegv(CPUState *cs, vaddr addr,
+                            MMUAccessType access_type,
+                            bool maperr, uintptr_t ra)
 {
     X86CPU *cpu = X86_CPU(cs);
     CPUX86State *env = &cpu->env;
 
+    /*
+     * The error_code that hw reports as part of the exception frame
+     * is copied to linux sigcontext.err.  The exception_index is
+     * copied to linux sigcontext.trapno.  Short of inventing a new
+     * place to store the trapno, we cannot let our caller raise the
+     * signal and set exception_index to EXCP_INTERRUPT.
+     */
     env->cr[2] = addr;
-    env->error_code = (access_type == MMU_DATA_STORE) << PG_ERROR_W_BIT;
-    env->error_code |= PG_ERROR_U_MASK;
+    env->error_code = ((access_type == MMU_DATA_STORE) << PG_ERROR_W_BIT)
+                    | (maperr ? 0 : PG_ERROR_P_MASK)
+                    | PG_ERROR_U_MASK;
     cs->exception_index = EXCP0E_PAGE;
+
+    /* Disable do_interrupt_user. */
     env->exception_is_int = 0;
     env->exception_next_eip = -1;
-    cpu_loop_exit_restore(cs, retaddr);
+
+    cpu_loop_exit_restore(cs, ra);
 }
-- 
2.25.1



  parent reply	other threads:[~2021-10-06 17:55 UTC|newest]

Thread overview: 52+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-10-06 17:22 [PATCH v4 00/41] linux-user: Streamline handling of SIGSEGV Richard Henderson
2021-10-06 17:22 ` [PATCH v4 01/41] accel/tcg: Split out adjust_signal_pc Richard Henderson
2021-10-06 17:22 ` [PATCH v4 02/41] accel/tcg: Move clear_helper_retaddr to cpu loop Richard Henderson
2021-10-06 17:22 ` [PATCH v4 03/41] accel/tcg: Split out handle_sigsegv_accerr_write Richard Henderson
2021-10-06 17:22 ` [PATCH v4 04/41] accel/tcg: Fold cpu_exit_tb_from_sighandler into caller Richard Henderson
2021-10-06 17:22 ` [PATCH v4 05/41] configure: Merge riscv32 and riscv64 host architectures Richard Henderson
2021-10-06 17:22 ` [PATCH v4 06/41] linux-user: Reorg handling for SIGSEGV Richard Henderson
2021-10-06 17:22 ` [PATCH v4 07/41] linux-user/host/x86: Populate host_signal.h Richard Henderson
2021-10-06 17:22 ` [PATCH v4 08/41] linux-user/host/ppc: " Richard Henderson
2021-10-06 17:22 ` [PATCH v4 09/41] linux-user/host/alpha: " Richard Henderson
2021-10-06 17:22 ` [PATCH v4 10/41] linux-user/host/sparc: " Richard Henderson
2021-10-06 17:22 ` [PATCH v4 11/41] linux-user/host/arm: " Richard Henderson
2021-10-06 17:22 ` [PATCH v4 12/41] linux-user/host/aarch64: " Richard Henderson
2021-10-06 17:22 ` [PATCH v4 13/41] linux-user/host/s390: " Richard Henderson
2021-10-06 17:22 ` [PATCH v4 14/41] linux-user/host/mips: " Richard Henderson
2021-10-06 17:22 ` [PATCH v4 15/41] linux-user/host/riscv: " Richard Henderson
2021-10-06 17:22   ` Richard Henderson
2021-10-06 21:33   ` Alistair Francis
2021-10-06 21:33     ` Alistair Francis
2021-10-06 17:22 ` [PATCH v4 16/41] target/arm: Fixup comment re handle_cpu_signal Richard Henderson
2021-10-06 17:22 ` [PATCH v4 17/41] linux-user/host/riscv: Improve host_signal_write Richard Henderson
2021-10-06 17:22   ` Richard Henderson
2021-10-06 21:35   ` Alistair Francis
2021-10-06 21:35     ` Alistair Francis
2021-10-06 17:22 ` [PATCH v4 18/41] linux-user/signal: Drop HOST_SIGNAL_PLACEHOLDER Richard Henderson
2021-10-06 17:22 ` [PATCH v4 19/41] hw/core: Add TCGCPUOps.record_sigsegv Richard Henderson
2021-10-06 17:22 ` [PATCH v4 20/41] linux-user: Add cpu_loop_exit_sigsegv Richard Henderson
2021-10-06 17:22 ` [PATCH v4 21/41] target/alpha: Implement alpha_cpu_record_sigsegv Richard Henderson
2021-10-06 17:22 ` [PATCH v4 22/41] target/arm: Use cpu_loop_exit_sigsegv for mte tag lookup Richard Henderson
2021-10-06 17:22 ` [PATCH v4 23/41] target/arm: Implement arm_cpu_record_sigsegv Richard Henderson
2021-10-06 17:22 ` [PATCH v4 24/41] target/cris: Make cris_cpu_tlb_fill sysemu only Richard Henderson
2021-10-06 17:22 ` [PATCH v4 25/41] target/hexagon: Remove hexagon_cpu_tlb_fill Richard Henderson
2021-10-06 17:22 ` [PATCH v4 26/41] target/hppa: Make hppa_cpu_tlb_fill sysemu only Richard Henderson
2021-10-06 17:22 ` Richard Henderson [this message]
2021-10-06 17:22 ` [PATCH v4 28/41] target/m68k: Make m68k_cpu_tlb_fill " Richard Henderson
2021-10-06 17:22 ` [PATCH v4 29/41] target/microblaze: Make mb_cpu_tlb_fill " Richard Henderson
2021-10-06 17:22 ` [PATCH v4 30/41] target/mips: Make mips_cpu_tlb_fill " Richard Henderson
2021-10-06 17:22 ` [PATCH v4 31/41] target/nios2: Implement nios2_cpu_record_sigsegv Richard Henderson
2021-10-06 17:22 ` [PATCH v4 32/41] linux-user/openrisc: Adjust signal for EXCP_RANGE, EXCP_FPE Richard Henderson
2021-10-06 20:52   ` Stafford Horne
2021-10-06 17:22 ` [PATCH v4 33/41] target/openrisc: Make openrisc_cpu_tlb_fill sysemu only Richard Henderson
2021-10-06 17:23 ` [PATCH v4 34/41] target/ppc: Implement ppc_cpu_record_sigsegv Richard Henderson
2021-10-06 17:23 ` [PATCH v4 35/41] target/riscv: Make riscv_cpu_tlb_fill sysemu only Richard Henderson
2021-10-06 17:23   ` Richard Henderson
2021-10-06 21:36   ` Alistair Francis
2021-10-06 21:36     ` Alistair Francis
2021-10-06 17:23 ` [PATCH v4 36/41] target/s390x: Use probe_access_flags in s390_probe_access Richard Henderson
2021-10-06 17:23 ` [PATCH v4 37/41] target/s390x: Implement s390_cpu_record_sigsegv Richard Henderson
2021-10-06 17:23 ` [PATCH v4 38/41] target/sh4: Make sh4_cpu_tlb_fill sysemu only Richard Henderson
2021-10-06 17:23 ` [PATCH v4 39/41] target/sparc: Make sparc_cpu_tlb_fill " Richard Henderson
2021-10-06 17:23 ` [PATCH v4 40/41] target/xtensa: Make xtensa_cpu_tlb_fill " Richard Henderson
2021-10-06 17:23 ` [PATCH v4 41/41] accel/tcg: Restrict TCGCPUOps::tlb_fill() to sysemu Richard Henderson

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=20211006172307.780893-28-richard.henderson@linaro.org \
    --to=richard.henderson@linaro.org \
    --cc=alex.bennee@linaro.org \
    --cc=f4bug@amsat.org \
    --cc=laurent@vivier.eu \
    --cc=qemu-devel@nongnu.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.