From: Max Filippov <jcmvbkbc@gmail.com>
To: qemu-devel@nongnu.org
Cc: Laurent Vivier <laurent@vivier.eu>,
Max Filippov <jcmvbkbc@gmail.com>,
qemu-stable@nongnu.org
Subject: [PATCH] linux-user: xtensa: fix signal delivery in FDPIC
Date: Sat, 11 Nov 2023 03:22:52 -0800 [thread overview]
Message-ID: <20231111112252.1387418-1-jcmvbkbc@gmail.com> (raw)
In FDPIC signal handlers are passed around as FD pointers. Actual code
address and GOT pointer must be fetched from memory by the QEMU code
that implements kernel signal delivery functionality. This change is
equivalent to the following kernel change:
9c2cc74fb31e ("xtensa: fix signal delivery to FDPIC process")
Cc: qemu-stable@nongnu.org
Fixes: d2796be69d7c ("linux-user: add support for xtensa FDPIC")
Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
---
linux-user/xtensa/signal.c | 28 ++++++++++++++++++++++++++--
1 file changed, 26 insertions(+), 2 deletions(-)
diff --git a/linux-user/xtensa/signal.c b/linux-user/xtensa/signal.c
index f5fb8b5cbebe..32dcfa522919 100644
--- a/linux-user/xtensa/signal.c
+++ b/linux-user/xtensa/signal.c
@@ -157,6 +157,9 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
{
abi_ulong frame_addr;
struct target_rt_sigframe *frame;
+ int is_fdpic = info_is_fdpic(((TaskState *)thread_cpu->opaque)->info);
+ abi_ulong handler = 0;
+ abi_ulong handler_fdpic_GOT = 0;
uint32_t ra;
bool abi_call0;
unsigned base;
@@ -165,6 +168,17 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
frame_addr = get_sigframe(ka, env, sizeof(*frame));
trace_user_setup_rt_frame(env, frame_addr);
+ if (is_fdpic) {
+ abi_ulong funcdesc_ptr = ka->_sa_handler;
+
+ if (get_user_ual(handler, funcdesc_ptr)
+ || get_user_ual(handler_fdpic_GOT, funcdesc_ptr + 4)) {
+ goto give_sigsegv;
+ }
+ } else {
+ handler = ka->_sa_handler;
+ }
+
if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) {
goto give_sigsegv;
}
@@ -185,14 +199,21 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
}
if (ka->sa_flags & TARGET_SA_RESTORER) {
- ra = ka->sa_restorer;
+ if (is_fdpic) {
+ if (get_user_ual(ra, ka->sa_restorer)) {
+ unlock_user_struct(frame, frame_addr, 0);
+ goto give_sigsegv;
+ }
+ } else {
+ ra = ka->sa_restorer;
+ }
} else {
/* Not used, but retain for ABI compatibility. */
install_sigtramp(frame->retcode);
ra = default_rt_sigreturn;
}
memset(env->regs, 0, sizeof(env->regs));
- env->pc = ka->_sa_handler;
+ env->pc = handler;
env->regs[1] = frame_addr;
env->sregs[WINDOW_BASE] = 0;
env->sregs[WINDOW_START] = 1;
@@ -212,6 +233,9 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
env->regs[base + 3] = frame_addr + offsetof(struct target_rt_sigframe,
info);
env->regs[base + 4] = frame_addr + offsetof(struct target_rt_sigframe, uc);
+ if (is_fdpic) {
+ env->regs[base + 11] = handler_fdpic_GOT;
+ }
unlock_user_struct(frame, frame_addr, 1);
return;
--
2.39.2
next reply other threads:[~2023-11-11 11:24 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-11-11 11:22 Max Filippov [this message]
2023-11-12 16:51 ` [PATCH] linux-user: xtensa: fix signal delivery in FDPIC Richard Henderson
2023-11-12 17:02 ` Max Filippov
2023-11-12 20:37 ` 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=20231111112252.1387418-1-jcmvbkbc@gmail.com \
--to=jcmvbkbc@gmail.com \
--cc=laurent@vivier.eu \
--cc=qemu-devel@nongnu.org \
--cc=qemu-stable@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).