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 v5 10/26] linux-user/i386: Implement setup_sigtramp
Date: Wed, 29 Sep 2021 09:05:37 -0400	[thread overview]
Message-ID: <20210929130553.121567-11-richard.henderson@linaro.org> (raw)
In-Reply-To: <20210929130553.121567-1-richard.henderson@linaro.org>

Create and record the two signal trampolines.
Use them when the guest does not use SA_RESTORER.
Note that x86_64 does not use this code.

Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 linux-user/i386/target_signal.h   |  2 ++
 linux-user/x86_64/target_signal.h |  3 ++
 linux-user/i386/signal.c          | 56 +++++++++++++++++++++----------
 3 files changed, 43 insertions(+), 18 deletions(-)

diff --git a/linux-user/i386/target_signal.h b/linux-user/i386/target_signal.h
index 50361af874..64d09f2e75 100644
--- a/linux-user/i386/target_signal.h
+++ b/linux-user/i386/target_signal.h
@@ -22,4 +22,6 @@ typedef struct target_sigaltstack {
 #include "../generic/signal.h"
 
 #define TARGET_ARCH_HAS_SETUP_FRAME
+#define TARGET_ARCH_HAS_SIGTRAMP_PAGE 1
+
 #endif /* I386_TARGET_SIGNAL_H */
diff --git a/linux-user/x86_64/target_signal.h b/linux-user/x86_64/target_signal.h
index 4ea74f20dd..4673c5a886 100644
--- a/linux-user/x86_64/target_signal.h
+++ b/linux-user/x86_64/target_signal.h
@@ -21,4 +21,7 @@ typedef struct target_sigaltstack {
 
 #include "../generic/signal.h"
 
+/* For x86_64, use of SA_RESTORER is mandatory. */
+#define TARGET_ARCH_HAS_SIGTRAMP_PAGE 0
+
 #endif /* X86_64_TARGET_SIGNAL_H */
diff --git a/linux-user/i386/signal.c b/linux-user/i386/signal.c
index 3b4b55fc0a..b38b5f108e 100644
--- a/linux-user/i386/signal.c
+++ b/linux-user/i386/signal.c
@@ -310,6 +310,22 @@ get_sigframe(struct target_sigaction *ka, CPUX86State *env, size_t frame_size)
 }
 
 #ifndef TARGET_X86_64
+static void install_sigtramp(void *tramp)
+{
+    /* This is popl %eax ; movl $syscall,%eax ; int $0x80 */
+    __put_user(0xb858, (uint16_t *)(tramp + 0));
+    __put_user(TARGET_NR_sigreturn, (int32_t *)(tramp + 2));
+    __put_user(0x80cd, (uint16_t *)(tramp + 6));
+}
+
+static void install_rt_sigtramp(void *tramp)
+{
+    /* This is movl $syscall,%eax ; int $0x80 */
+    __put_user(0xb8, (uint8_t *)(tramp + 0));
+    __put_user(TARGET_NR_rt_sigreturn, (int32_t *)(tramp + 1));
+    __put_user(0x80cd, (uint16_t *)(tramp + 5));
+}
+
 /* compare linux/arch/i386/kernel/signal.c:setup_frame() */
 void setup_frame(int sig, struct target_sigaction *ka,
                  target_sigset_t *set, CPUX86State *env)
@@ -338,16 +354,9 @@ void setup_frame(int sig, struct target_sigaction *ka,
     if (ka->sa_flags & TARGET_SA_RESTORER) {
         __put_user(ka->sa_restorer, &frame->pretcode);
     } else {
-        uint16_t val16;
-        abi_ulong retcode_addr;
-        retcode_addr = frame_addr + offsetof(struct sigframe, retcode);
-        __put_user(retcode_addr, &frame->pretcode);
-        /* This is popl %eax ; movl $,%eax ; int $0x80 */
-        val16 = 0xb858;
-        __put_user(val16, (uint16_t *)(frame->retcode+0));
-        __put_user(TARGET_NR_sigreturn, (int *)(frame->retcode+2));
-        val16 = 0x80cd;
-        __put_user(val16, (uint16_t *)(frame->retcode+6));
+        /* This is no longer used, but is retained for ABI compatibility. */
+        install_sigtramp(frame->retcode);
+        __put_user(default_sigreturn, &frame->pretcode);
     }
 
     /* Set up registers for signal handler */
@@ -416,14 +425,9 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
     if (ka->sa_flags & TARGET_SA_RESTORER) {
         __put_user(ka->sa_restorer, &frame->pretcode);
     } else {
-        uint16_t val16;
-        addr = frame_addr + offsetof(struct rt_sigframe, retcode);
-        __put_user(addr, &frame->pretcode);
-        /* This is movl $,%eax ; int $0x80 */
-        __put_user(0xb8, (char *)(frame->retcode+0));
-        __put_user(TARGET_NR_rt_sigreturn, (int *)(frame->retcode+1));
-        val16 = 0x80cd;
-        __put_user(val16, (uint16_t *)(frame->retcode+5));
+        /* This is no longer used, but is retained for ABI compatibility. */
+        install_rt_sigtramp(frame->retcode);
+        __put_user(default_rt_sigreturn, &frame->pretcode);
     }
 #else
     /* XXX: Would be slightly better to return -EFAULT here if test fails
@@ -592,3 +596,19 @@ badframe:
     force_sig(TARGET_SIGSEGV);
     return -TARGET_QEMU_ESIGRETURN;
 }
+
+#ifndef TARGET_X86_64
+void setup_sigtramp(abi_ulong sigtramp_page)
+{
+    uint16_t *tramp = lock_user(VERIFY_WRITE, sigtramp_page, 2 * 8, 0);
+    assert(tramp != NULL);
+
+    default_sigreturn = sigtramp_page;
+    install_sigtramp(tramp);
+
+    default_rt_sigreturn = sigtramp_page + 8;
+    install_rt_sigtramp(tramp + 8);
+
+    unlock_user(tramp, sigtramp_page, 2 * 8);
+}
+#endif
-- 
2.25.1



  parent reply	other threads:[~2021-09-29 13:20 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-29 13:05 [PATCH v5 00/26] linux-user: Move signal trampolines to new page Richard Henderson
2021-09-29 13:05 ` [PATCH v5 01/26] linux-user: Add infrastructure for a signal trampoline page Richard Henderson
2021-09-29 13:05 ` [PATCH v5 02/26] linux-user/aarch64: Implement setup_sigtramp Richard Henderson
2021-09-29 13:05 ` [PATCH v5 03/26] linux-user/arm: Drop v1 signal frames Richard Henderson
2021-09-29 13:05 ` [PATCH v5 04/26] linux-user/arm: Drop "_v2" from symbols in signal.c Richard Henderson
2021-09-29 13:05 ` [PATCH v5 05/26] linux-user/arm: Implement setup_sigtramp Richard Henderson
2021-09-29 13:45   ` Peter Maydell
2021-09-29 13:05 ` [PATCH v5 06/26] linux-user/alpha: " Richard Henderson
2021-09-29 13:05 ` [PATCH v5 07/26] linux-user/cris: " Richard Henderson
2021-09-29 13:05 ` [PATCH v5 08/26] linux-user/hexagon: " Richard Henderson
2021-09-29 13:05 ` [PATCH v5 09/26] linux-user/hppa: Document non-use of setup_sigtramp Richard Henderson
2021-09-29 13:05 ` Richard Henderson [this message]
2021-09-29 13:05 ` [PATCH v5 11/26] linux-user/x86_64: Raise SIGSEGV if SA_RESTORER not set Richard Henderson
2021-09-29 13:05 ` [PATCH v5 12/26] linux-user/m68k: Implement setup_sigtramp Richard Henderson
2021-09-29 13:05 ` [PATCH v5 13/26] linux-user/microblaze: " Richard Henderson
2021-09-29 13:05 ` [PATCH v5 14/26] linux-user/mips: Tidy install_sigtramp Richard Henderson
2021-09-29 13:05 ` [PATCH v5 15/26] linux-user/mips: Implement setup_sigtramp Richard Henderson
2021-09-29 13:05 ` [PATCH v5 16/26] linux-user/nios2: Document non-use of setup_sigtramp Richard Henderson
2021-09-29 13:05 ` [PATCH v5 17/26] linux-user/openrisc: Implement setup_sigtramp Richard Henderson
2021-09-29 13:05 ` [PATCH v5 18/26] linux-user/ppc: Simplify encode_trampoline Richard Henderson
2021-09-29 13:05 ` [PATCH v5 19/26] linux-user/ppc: Implement setup_sigtramp Richard Henderson
2021-09-29 13:05 ` [PATCH v5 20/26] linux-user/riscv: " Richard Henderson
2021-09-29 13:05 ` [PATCH v5 21/26] linux-user/s390x: " Richard Henderson
2022-04-28 18:15   ` s390x regression - " Ulrich Weigand
2022-04-29 18:14     ` Richard Henderson
2021-09-29 13:05 ` [PATCH v5 22/26] linux-user/sh4: " Richard Henderson
2021-09-29 13:05 ` [PATCH v5 23/26] linux-user/sparc: " Richard Henderson
2021-09-29 13:05 ` [PATCH v5 24/26] linux-user/xtensa: " Richard Henderson
2021-09-29 13:05 ` [PATCH v5 25/26] linux-user: Remove default for TARGET_ARCH_HAS_SIGTRAMP_PAGE Richard Henderson
2021-09-29 13:05 ` [PATCH v5 26/26] tests/tcg/multiarch: Re-enable signals test for most guests Richard Henderson
2021-09-29 13:45   ` Philippe Mathieu-Daudé
2021-10-01 10:04 ` [PATCH v5 00/26] linux-user: Move signal trampolines to new page Laurent Vivier

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=20210929130553.121567-11-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.