All of lore.kernel.org
 help / color / mirror / Atom feed
From: Laurent Vivier <laurent@vivier.eu>
To: qemu-devel@nongnu.org
Cc: Helge Deller <deller@gmx.de>, Laurent Vivier <laurent@vivier.eu>
Subject: [PULL 20/38] linux-user/hppa: Add signal trampoline for hppa target
Date: Wed, 28 Sep 2022 10:14:59 +0200	[thread overview]
Message-ID: <20220928081517.734954-21-laurent@vivier.eu> (raw)
In-Reply-To: <20220928081517.734954-1-laurent@vivier.eu>

From: Helge Deller <deller@gmx.de>

In Linux kernel v5.18 the vDSO for signal trampoline was added.
This code mimiks the bare minimum of this vDSO and thus avoids that the
parisc emulation needs executable stacks.

Signed-off-by: Helge Deller <deller@gmx.de>
Message-Id: <20220924114501.21767-4-deller@gmx.de>
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
---
 linux-user/hppa/signal.c        | 41 +++++++++++++++++++++++++--------
 linux-user/hppa/target_signal.h | 14 +----------
 2 files changed, 32 insertions(+), 23 deletions(-)

diff --git a/linux-user/hppa/signal.c b/linux-user/hppa/signal.c
index 962f551c0429..396e310dc92d 100644
--- a/linux-user/hppa/signal.c
+++ b/linux-user/hppa/signal.c
@@ -41,7 +41,7 @@ struct target_ucontext {
 };
 
 struct target_rt_sigframe {
-    abi_uint tramp[9];
+    abi_uint tramp[2];  /* syscall restart return address */
     target_siginfo_t info;
     struct target_ucontext uc;
     /* hidden location of upper halves of pa2.0 64-bit gregs */
@@ -101,9 +101,15 @@ static void restore_sigcontext(CPUArchState *env, struct target_sigcontext *sc)
     __get_user(env->cr[CR_SAR], &sc->sc_sar);
 }
 
-/* No, this doesn't look right, but it's copied straight from the kernel.  */
+#if TARGET_ABI_BITS == 32
+#define SIGFRAME                64
+#define FUNCTIONCALLFRAME       48
+#else
+#define SIGFRAME                128
+#define FUNCTIONCALLFRAME       96
+#endif
 #define PARISC_RT_SIGFRAME_SIZE32 \
-    ((sizeof(struct target_rt_sigframe) + 48 + 64) & -64)
+    ((sizeof(struct target_rt_sigframe) + FUNCTIONCALLFRAME + SIGFRAME) & -SIGFRAME)
 
 void setup_rt_frame(int sig, struct target_sigaction *ka,
                     target_siginfo_t *info,
@@ -118,7 +124,7 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
     if ((ka->sa_flags & TARGET_SA_ONSTACK) && !sas_ss_flags(sp)) {
         sp = (ts->sigaltstack_used.ss_sp + 0x7f) & ~0x3f;
     }
-    frame_addr = QEMU_ALIGN_UP(sp, 64);
+    frame_addr = QEMU_ALIGN_UP(sp, SIGFRAME);
     sp = frame_addr + PARISC_RT_SIGFRAME_SIZE32;
 
     trace_user_setup_rt_frame(env, frame_addr);
@@ -139,14 +145,9 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
 
     setup_sigcontext(&frame->uc.tuc_mcontext, env);
 
-    __put_user(0x34190000, frame->tramp + 0); /* ldi 0,%r25 */
-    __put_user(0x3414015a, frame->tramp + 1); /* ldi __NR_rt_sigreturn,%r20 */
-    __put_user(0xe4008200, frame->tramp + 2); /* be,l 0x100(%sr2,%r0) */
-    __put_user(0x08000240, frame->tramp + 3); /* nop */
-
     unlock_user_struct(frame, frame_addr, 1);
 
-    env->gr[2] = h2g(frame->tramp);
+    env->gr[2] = default_rt_sigreturn;
     env->gr[30] = sp;
     env->gr[26] = sig;
     env->gr[25] = h2g(&frame->info);
@@ -197,3 +198,23 @@ long do_rt_sigreturn(CPUArchState *env)
     force_sig(TARGET_SIGSEGV);
     return -QEMU_ESIGRETURN;
 }
+
+void setup_sigtramp(abi_ulong sigtramp_page)
+{
+    uint32_t *tramp = lock_user(VERIFY_WRITE, sigtramp_page, 6*4, 0);
+    abi_ulong SIGFRAME_CONTEXT_REGS32;
+    assert(tramp != NULL);
+
+    SIGFRAME_CONTEXT_REGS32 = offsetof(struct target_rt_sigframe, uc.tuc_mcontext);
+    SIGFRAME_CONTEXT_REGS32 -= PARISC_RT_SIGFRAME_SIZE32;
+
+    __put_user(SIGFRAME_CONTEXT_REGS32, tramp + 0);
+    __put_user(0x08000240, tramp + 1);  /* nop - b/c dwarf2 unwind routines */
+    __put_user(0x34190000, tramp + 2);  /* ldi 0, %r25 (in_syscall=0) */
+    __put_user(0x3414015a, tramp + 3);  /* ldi __NR_rt_sigreturn, %r20 */
+    __put_user(0xe4008200, tramp + 4);  /* ble 0x100(%sr2, %r0) */
+    __put_user(0x08000240, tramp + 5);  /* nop */
+
+    default_rt_sigreturn = (sigtramp_page + 8) | 3;
+    unlock_user(tramp, sigtramp_page, 6*4);
+}
diff --git a/linux-user/hppa/target_signal.h b/linux-user/hppa/target_signal.h
index af6c2fce589d..190bb3d653b6 100644
--- a/linux-user/hppa/target_signal.h
+++ b/linux-user/hppa/target_signal.h
@@ -70,18 +70,6 @@ typedef struct target_sigaltstack {
 /* mask for all SS_xxx flags */
 #define TARGET_SS_FLAG_BITS  TARGET_SS_AUTODISARM
 
-/*
- * We cannot use a bare sigtramp page for hppa-linux.
- *
- * Unlike other guests where we use the instructions at PC to validate
- * an offset from SP, the hppa libgcc signal frame fallback unwinding uses
- * the PC address itself to find the frame.  This is due to the fact that
- * the hppa grows the stack upward, and the frame is of unknown size.
- *
- * TODO: We should be able to use a VDSO to address this, by providing
- * proper unwind info for the sigtramp code, at which point the fallback
- * unwinder will not be used.
- */
-#define TARGET_ARCH_HAS_SIGTRAMP_PAGE 0
+#define TARGET_ARCH_HAS_SIGTRAMP_PAGE 1
 
 #endif /* HPPA_TARGET_SIGNAL_H */
-- 
2.37.3



  parent reply	other threads:[~2022-09-28 10:30 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-09-28  8:14 [PULL 00/38] Linux user for 7.2 patches Laurent Vivier
2022-09-28  8:14 ` [PULL 01/38] linux-user: use 'max' instead of 'qemu32' / 'qemu64' by default Laurent Vivier
2022-09-28  8:14 ` [PULL 02/38] linux-user: fix readlinkat handling with magic exe symlink Laurent Vivier
2022-09-28  8:14 ` [PULL 03/38] linux-user: Add missing signals in strace output Laurent Vivier
2022-09-28  8:14 ` [PULL 04/38] linux-user: Add missing clock_gettime64() syscall strace Laurent Vivier
2022-09-28  8:14 ` [PULL 05/38] linux-user: Add pidfd_open(), pidfd_send_signal() and pidfd_getfd() syscalls Laurent Vivier
2022-09-28  8:14 ` [PULL 06/38] linux-user: Log failing executable in EXCP_DUMP() Laurent Vivier
2022-09-28  8:14 ` [PULL 07/38] linux-user/hppa: Use EXCP_DUMP() to show enhanced debug info Laurent Vivier
2022-09-28  8:14 ` [PULL 08/38] linux-user/hppa: Dump IIR on register dump Laurent Vivier
2022-09-28  8:14 ` [PULL 09/38] linux-user: Fix strace of chmod() if mode == 0 Laurent Vivier
2022-09-28  8:14 ` [PULL 10/38] linux-user/hppa: Set TASK_UNMAPPED_BASE to 0xfa000000 for hppa arch Laurent Vivier
2022-09-28  8:14 ` [PULL 11/38] linux-user: Add strace for clock_nanosleep() Laurent Vivier
2022-09-28  8:14 ` [PULL 12/38] linux-user: Show timespec on strace for futex() Laurent Vivier
2022-09-28  8:14 ` [PULL 13/38] linux-user: Provide MADV_* definitions Laurent Vivier
2022-09-28  8:14 ` [PULL 14/38] linux-user: Fix madvise(MADV_DONTNEED) on alpha Laurent Vivier
2022-09-28  8:14 ` [PULL 15/38] linux-user: Implement stracing madvise() Laurent Vivier
2022-09-28  8:14 ` [PULL 16/38] linux-user: Passthrough MADV_DONTNEED for certain file mappings Laurent Vivier
2022-09-28  8:14 ` [PULL 17/38] tests/tcg/linux-test: Add linux-madvise test Laurent Vivier
2022-09-28  8:14 ` [PULL 18/38] linux-user: Fix TARGET_PROT_SEM for XTENSA Laurent Vivier
2022-09-28  8:14 ` [PULL 19/38] linux-user: Add proper strace format strings for getdents()/getdents64() Laurent Vivier
2022-09-28  8:14 ` Laurent Vivier [this message]
2022-09-28  8:15 ` [PULL 21/38] linux-user/hppa: Drop stack guard page on hppa target Laurent Vivier
2022-09-28  8:15 ` [PULL 22/38] linux-user/hppa: Increase guest stack size to 80MB for " Laurent Vivier
2022-09-28  8:15 ` [PULL 23/38] linux-user/hppa: Allow PROT_GROWSUP and PROT_GROWSDOWN in mprotect() Laurent Vivier
2022-09-28  8:15 ` [PULL 24/38] linux-user/hppa: Fix setup_sigcontext() Laurent Vivier
2022-09-28  8:15 ` [PULL 25/38] linux-user: fix bug about missing signum convert of sigqueue Laurent Vivier
2022-09-28  8:15 ` [PULL 26/38] linux-user: Don't assume 0 is not a valid host timer_t value Laurent Vivier
2022-09-28  8:23   ` Jon Alduan
2022-09-28 12:13     ` Peter Maydell
2022-09-28  8:15 ` [PULL 27/38] linux-user/s390x: Save/restore fpc when handling a signal Laurent Vivier
2022-09-28  8:15 ` [PULL 28/38] linux-user: Introduce stubs for ELF AT_BASE_PLATFORM Laurent Vivier
2022-09-28  8:15 ` [PULL 29/38] linux-user: Set ELF_BASE_PLATFORM for MIPS Laurent Vivier
2022-09-28  8:15 ` [PULL 30/38] linux-user: Combine do_futex and do_futex_time64 Laurent Vivier
2022-09-28  8:15 ` [PULL 31/38] linux-user: Sink call to do_safe_futex Laurent Vivier
2022-09-28  8:15 ` [PULL 32/38] linux-user: Implement FUTEX_WAKE_BITSET Laurent Vivier
2022-09-28  8:15 ` [PULL 33/38] linux-user: Convert signal number for FUTEX_FD Laurent Vivier
2022-09-28  8:15 ` [PULL 34/38] linux-user: Implement PI futexes Laurent Vivier
2022-09-28  8:15 ` [PULL 35/38] linux-user: Update print_futex_op Laurent Vivier
2022-09-28  8:15 ` [PULL 36/38] linux-user: Lock log around strace Laurent Vivier
2022-09-28  8:15 ` [PULL 37/38] linux-user: Log tid for strace Laurent Vivier
2022-09-28  8:15 ` [PULL 38/38] linux-user: Add parameters of getrandom() syscall " Laurent Vivier
2022-09-28 20:04 ` [PULL 00/38] Linux user for 7.2 patches Stefan Hajnoczi
2022-09-28 20:23   ` 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=20220928081517.734954-21-laurent@vivier.eu \
    --to=laurent@vivier.eu \
    --cc=deller@gmx.de \
    --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.