From: Richard Henderson <richard.henderson@linaro.org> To: qemu-devel@nongnu.org Cc: qemu-riscv@nongnu.org, alex.bennee@linaro.org, laurent@vivier.eu Subject: [PATCH 16/21] linux-user/riscv: Implement setup_sigtramp Date: Tue, 15 Jun 2021 18:12:04 -0700 [thread overview] Message-ID: <20210616011209.1446045-17-richard.henderson@linaro.org> (raw) In-Reply-To: <20210616011209.1446045-1-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. Cc: qemu-riscv@nongnu.org Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- linux-user/riscv/target_signal.h | 2 ++ linux-user/riscv/signal.c | 22 +++++++++++++--------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/linux-user/riscv/target_signal.h b/linux-user/riscv/target_signal.h index f113ba9a55..3e36fddc9d 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 */ diff --git a/linux-user/riscv/signal.c b/linux-user/riscv/signal.c index 9405c7fd9a..4086dfa5d5 100644 --- a/linux-user/riscv/signal.c +++ b/linux-user/riscv/signal.c @@ -46,7 +46,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; }; @@ -104,12 +103,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) @@ -126,14 +119,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; @@ -202,3 +194,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); +} -- 2.25.1
WARNING: multiple messages have this Message-ID (diff)
From: Richard Henderson <richard.henderson@linaro.org> To: qemu-devel@nongnu.org Cc: laurent@vivier.eu, alex.bennee@linaro.org, qemu-riscv@nongnu.org Subject: [PATCH 16/21] linux-user/riscv: Implement setup_sigtramp Date: Tue, 15 Jun 2021 18:12:04 -0700 [thread overview] Message-ID: <20210616011209.1446045-17-richard.henderson@linaro.org> (raw) In-Reply-To: <20210616011209.1446045-1-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. Cc: qemu-riscv@nongnu.org Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- linux-user/riscv/target_signal.h | 2 ++ linux-user/riscv/signal.c | 22 +++++++++++++--------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/linux-user/riscv/target_signal.h b/linux-user/riscv/target_signal.h index f113ba9a55..3e36fddc9d 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 */ diff --git a/linux-user/riscv/signal.c b/linux-user/riscv/signal.c index 9405c7fd9a..4086dfa5d5 100644 --- a/linux-user/riscv/signal.c +++ b/linux-user/riscv/signal.c @@ -46,7 +46,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; }; @@ -104,12 +103,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) @@ -126,14 +119,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; @@ -202,3 +194,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); +} -- 2.25.1
next prev parent reply other threads:[~2021-06-16 1:23 UTC|newest] Thread overview: 53+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-06-16 1:11 [PATCH 00/21] linux-user: Move signal trampolines to new page Richard Henderson 2021-06-16 1:11 ` [PATCH 01/21] linux-user: Add infrastructure for a signal trampoline page Richard Henderson 2021-06-16 13:36 ` Max Filippov 2021-06-16 1:11 ` [PATCH 02/21] linux-user/aarch64: Implement setup_sigtramp Richard Henderson 2021-06-16 17:00 ` Philippe Mathieu-Daudé 2021-06-16 1:11 ` [PATCH 03/21] linux-user/arm: Force v2 frames for fdpic Richard Henderson 2021-06-16 17:01 ` Philippe Mathieu-Daudé 2021-06-16 1:11 ` [PATCH 04/21] linux-user/arm: Implement setup_sigtramp Richard Henderson 2021-06-16 13:46 ` Alex Bennée 2021-06-16 13:49 ` Alex Bennée 2021-06-16 17:40 ` Richard Henderson 2021-06-16 1:11 ` [PATCH 05/21] linux-user/alpha: " Richard Henderson 2021-06-16 16:56 ` Philippe Mathieu-Daudé 2021-06-16 1:11 ` [PATCH 06/21] linux-user/cris: " Richard Henderson 2021-06-16 16:37 ` Philippe Mathieu-Daudé 2021-06-16 1:11 ` [PATCH 07/21] linux-user/hexagon: " Richard Henderson 2021-06-16 8:07 ` Taylor Simpson 2021-06-16 15:05 ` Richard Henderson 2021-06-16 15:50 ` Richard Henderson 2021-06-16 21:37 ` Taylor Simpson 2021-06-16 23:15 ` Richard Henderson 2021-06-16 1:11 ` [PATCH 08/21] linux-user/hppa: Document non-use of setup_sigtramp Richard Henderson 2021-06-16 10:46 ` Philippe Mathieu-Daudé 2021-06-16 21:16 ` Alex Bennée 2021-06-16 1:11 ` [PATCH 09/21] linux-user/i386: Implement setup_sigtramp Richard Henderson 2021-06-16 1:11 ` [PATCH 10/21] linux-user/m68k: " Richard Henderson 2021-06-16 16:42 ` Philippe Mathieu-Daudé 2021-06-16 1:11 ` [PATCH 11/21] linux-user/microblaze: " Richard Henderson 2021-06-16 16:43 ` Philippe Mathieu-Daudé 2021-06-16 1:12 ` [PATCH 12/21] linux-user/mips: " Richard Henderson 2021-06-16 16:48 ` Philippe Mathieu-Daudé 2021-06-16 1:12 ` [PATCH 13/21] linux-user/nios2: Document non-use of setup_sigtramp Richard Henderson 2021-06-16 1:12 ` [PATCH 14/21] linux-user/openrisc: Implement setup_sigtramp Richard Henderson 2021-06-16 16:49 ` Philippe Mathieu-Daudé 2021-06-17 0:24 ` Stafford Horne 2021-06-16 1:12 ` [PATCH 15/21] linux-user/ppc: " Richard Henderson 2021-06-16 1:12 ` Richard Henderson [this message] 2021-06-16 1:12 ` [PATCH 16/21] linux-user/riscv: " Richard Henderson 2021-06-16 16:50 ` Philippe Mathieu-Daudé 2021-06-16 16:50 ` Philippe Mathieu-Daudé 2021-06-18 1:29 ` Alistair Francis 2021-06-18 1:29 ` Alistair Francis 2021-06-16 1:12 ` [PATCH 17/21] linux-user/s390x: " Richard Henderson 2021-06-16 16:52 ` Philippe Mathieu-Daudé 2021-06-16 1:12 ` [PATCH 18/21] linux-user/sh4: " Richard Henderson 2021-06-16 16:53 ` Philippe Mathieu-Daudé 2021-06-16 1:12 ` [PATCH 19/21] linux-user/sparc: " Richard Henderson 2021-06-16 1:12 ` [PATCH 20/21] linux-user/xtensa: " Richard Henderson 2021-06-16 13:35 ` Max Filippov 2021-06-16 1:12 ` [PATCH 21/21] linux-user: Remove default for TARGET_ARCH_HAS_SIGTRAMP_PAGE Richard Henderson 2021-06-16 16:54 ` Philippe Mathieu-Daudé 2021-06-16 15:05 ` [PATCH 00/21] linux-user: Move signal trampolines to new page Alex Bennée 2021-06-16 15:09 ` 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=20210616011209.1446045-17-richard.henderson@linaro.org \ --to=richard.henderson@linaro.org \ --cc=alex.bennee@linaro.org \ --cc=laurent@vivier.eu \ --cc=qemu-devel@nongnu.org \ --cc=qemu-riscv@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: linkBe 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.