[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 20/26] linux-user/riscv: Implement setup_sigtramp
From: |
Laurent Vivier |
Subject: |
[PULL 20/26] linux-user/riscv: Implement setup_sigtramp |
Date: |
Mon, 4 Oct 2021 09:44:15 +0200 |
From: Richard Henderson <richard.henderson@linaro.org>
Create and record the rt signal trampoline.
This fixes a bug wrt libgcc fallback unwinding. It expects
the stack pointer to point to the siginfo_t, whereas we had
inexplicably placed our private signal trampoline at the start
of the signal frame instead of the end. Now moot because we
have removed it from the stack frame entirely.
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Message-Id: <20210929130553.121567-21-richard.henderson@linaro.org>
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
---
linux-user/riscv/signal.c | 22 +++++++++++++---------
linux-user/riscv/target_signal.h | 2 ++
2 files changed, 15 insertions(+), 9 deletions(-)
diff --git a/linux-user/riscv/signal.c b/linux-user/riscv/signal.c
index f7f33bc90aed..a0f9542ce39a 100644
--- a/linux-user/riscv/signal.c
+++ b/linux-user/riscv/signal.c
@@ -47,7 +47,6 @@ struct target_ucontext {
};
struct target_rt_sigframe {
- uint32_t tramp[2]; /* not in kernel, which uses VDSO instead */
struct target_siginfo info;
struct target_ucontext uc;
};
@@ -105,12 +104,6 @@ static void setup_ucontext(struct target_ucontext *uc,
setup_sigcontext(&uc->uc_mcontext, env);
}
-static inline void install_sigtramp(uint32_t *tramp)
-{
- __put_user(0x08b00893, tramp + 0); /* li a7, 139 = __NR_rt_sigreturn */
- __put_user(0x00000073, tramp + 1); /* ecall */
-}
-
void setup_rt_frame(int sig, struct target_sigaction *ka,
target_siginfo_t *info,
target_sigset_t *set, CPURISCVState *env)
@@ -127,14 +120,13 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
setup_ucontext(&frame->uc, env, set);
tswap_siginfo(&frame->info, info);
- install_sigtramp(frame->tramp);
env->pc = ka->_sa_handler;
env->gpr[xSP] = frame_addr;
env->gpr[xA0] = sig;
env->gpr[xA1] = frame_addr + offsetof(struct target_rt_sigframe, info);
env->gpr[xA2] = frame_addr + offsetof(struct target_rt_sigframe, uc);
- env->gpr[xRA] = frame_addr + offsetof(struct target_rt_sigframe, tramp);
+ env->gpr[xRA] = default_rt_sigreturn;
return;
@@ -203,3 +195,15 @@ badframe:
force_sig(TARGET_SIGSEGV);
return 0;
}
+
+void setup_sigtramp(abi_ulong sigtramp_page)
+{
+ uint32_t *tramp = lock_user(VERIFY_WRITE, sigtramp_page, 8, 0);
+ assert(tramp != NULL);
+
+ __put_user(0x08b00893, tramp + 0); /* li a7, 139 = __NR_rt_sigreturn */
+ __put_user(0x00000073, tramp + 1); /* ecall */
+
+ default_rt_sigreturn = sigtramp_page;
+ unlock_user(tramp, sigtramp_page, 8);
+}
diff --git a/linux-user/riscv/target_signal.h b/linux-user/riscv/target_signal.h
index f113ba9a55f6..3e36fddc9dbb 100644
--- a/linux-user/riscv/target_signal.h
+++ b/linux-user/riscv/target_signal.h
@@ -15,4 +15,6 @@ typedef struct target_sigaltstack {
#include "../generic/signal.h"
+#define TARGET_ARCH_HAS_SIGTRAMP_PAGE 1
+
#endif /* RISCV_TARGET_SIGNAL_H */
--
2.31.1
- [PULL 14/26] linux-user/mips: Tidy install_sigtramp, (continued)
- [PULL 14/26] linux-user/mips: Tidy install_sigtramp, Laurent Vivier, 2021/10/04
- [PULL 04/26] linux-user/arm: Drop "_v2" from symbols in signal.c, Laurent Vivier, 2021/10/04
- [PULL 19/26] linux-user/ppc: Implement setup_sigtramp, Laurent Vivier, 2021/10/04
- [PULL 02/26] linux-user/aarch64: Implement setup_sigtramp, Laurent Vivier, 2021/10/04
- [PULL 03/26] linux-user/arm: Drop v1 signal frames, Laurent Vivier, 2021/10/04
- [PULL 15/26] linux-user/mips: Implement setup_sigtramp, Laurent Vivier, 2021/10/04
- [PULL 07/26] linux-user/cris: Implement setup_sigtramp, Laurent Vivier, 2021/10/04
- [PULL 06/26] linux-user/alpha: Implement setup_sigtramp, Laurent Vivier, 2021/10/04
- [PULL 18/26] linux-user/ppc: Simplify encode_trampoline, Laurent Vivier, 2021/10/04
- [PULL 10/26] linux-user/i386: Implement setup_sigtramp, Laurent Vivier, 2021/10/04
- [PULL 20/26] linux-user/riscv: Implement setup_sigtramp,
Laurent Vivier <=
- [PULL 13/26] linux-user/microblaze: Implement setup_sigtramp, Laurent Vivier, 2021/10/04
- [PULL 25/26] linux-user: Remove default for TARGET_ARCH_HAS_SIGTRAMP_PAGE, Laurent Vivier, 2021/10/04
- [PULL 12/26] linux-user/m68k: Implement setup_sigtramp, Laurent Vivier, 2021/10/04
- [PULL 23/26] linux-user/sparc: Implement setup_sigtramp, Laurent Vivier, 2021/10/04
- [PULL 17/26] linux-user/openrisc: Implement setup_sigtramp, Laurent Vivier, 2021/10/04
- [PULL 24/26] linux-user/xtensa: Implement setup_sigtramp, Laurent Vivier, 2021/10/04
- [PULL 09/26] linux-user/hppa: Document non-use of setup_sigtramp, Laurent Vivier, 2021/10/04
- [PULL 21/26] linux-user/s390x: Implement setup_sigtramp, Laurent Vivier, 2021/10/04
- [PULL 26/26] tests/tcg/multiarch: Re-enable signals test for most guests, Laurent Vivier, 2021/10/04
- [PULL 22/26] linux-user/sh4: Implement setup_sigtramp, Laurent Vivier, 2021/10/04