Skip to content

Commit af9264d

Browse files
committed
Merge tag '20231119-xtensa-1' of https://github.com/OSLL/qemu-xtensa into staging
target/xtensa fixes for v8.2: - fix signal delivery in FDPIC # -----BEGIN PGP SIGNATURE----- # # iQJHBAABCgAxFiEEK2eFS5jlMn3N6xfYUfnMkfg/oEQFAmVaXU4THGpjbXZia2Jj # QGdtYWlsLmNvbQAKCRBR+cyR+D+gRF13EACXNP0MPn2iWqxLPvxW9mDXaQu9cSlJ # BcAlHKbi21CDdqLYpyMoenRONtHMDKjEhR4Atv+DRhc2qQYKNogLgCM1PtGkb6+z # rNS6HBaUFsAKovS03JGcBDDYWS97bfN1AQRrrEzCV+SKq5Gq8Tr23LSgFHred0hS # OlGmb7/S+uMh1Uo+rqLKFvSkcWLyaPxOhw1BoaNWdifSotfRwK++PZUvv7slQk+/ # J2ePbjU/ZTBTmumn0tg8BP66UHmGQ+TcvGOdD0m6qlQoq5XaqAYgNb6/Cm16xIPJ # GQtmB1m74Dl1cQGYXlg3YFGluOJGidkT6In6dYzOEzjvOg9Rku+9bdCxIyRgQK7g # gXcQJaEdpBiex3c21XWhMfjpM1pQruRgIQ3xqYETBMKXXqvbgYdUT09JpuaoTUkP # oTymnBVL+9hyrlhPWXzn8M6IPUlyT7Hmnb0uVmHfTi8UNBhiGBRSN4x3CMDNi9oL # ziE3xKgEkii9WEY+qSCodLMvLJBzShpKTjmUhfJMYdK07uVzazhGhmtQ8qSi3Rm7 # 6hDfnnBwrnX/CBE1IMca280Aax3TMf8Sn1pJqsTHwlNFb3O5vcixRajJw7xNprkP # 5CcS+G2fRK7JIb18FI2aBf7DXD4kfasF8UAaiyQfkmD1/LITSGiDKfKFvaqjA7Ln # wVrNbrGvDRvdEw== # =sZPo # -----END PGP SIGNATURE----- # gpg: Signature made Sun 19 Nov 2023 14:09:02 EST # gpg: using RSA key 2B67854B98E5327DCDEB17D851F9CC91F83FA044 # gpg: issuer "[email protected]" # gpg: Good signature from "Max Filippov <[email protected]>" [unknown] # gpg: aka "Max Filippov <[email protected]>" [unknown] # gpg: aka "Max Filippov <[email protected]>" [unknown] # gpg: WARNING: The key's User ID is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # Primary key fingerprint: 2B67 854B 98E5 327D CDEB 17D8 51F9 CC91 F83F A044 * tag '20231119-xtensa-1' of https://github.com/OSLL/qemu-xtensa: linux-user: xtensa: fix signal delivery in FDPIC Signed-off-by: Stefan Hajnoczi <[email protected]>
2 parents 1817af9 + 1b173d0 commit af9264d

File tree

1 file changed

+26
-2
lines changed

1 file changed

+26
-2
lines changed

linux-user/xtensa/signal.c

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,9 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
157157
{
158158
abi_ulong frame_addr;
159159
struct target_rt_sigframe *frame;
160+
int is_fdpic = info_is_fdpic(((TaskState *)thread_cpu->opaque)->info);
161+
abi_ulong handler = 0;
162+
abi_ulong handler_fdpic_GOT = 0;
160163
uint32_t ra;
161164
bool abi_call0;
162165
unsigned base;
@@ -165,6 +168,17 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
165168
frame_addr = get_sigframe(ka, env, sizeof(*frame));
166169
trace_user_setup_rt_frame(env, frame_addr);
167170

171+
if (is_fdpic) {
172+
abi_ulong funcdesc_ptr = ka->_sa_handler;
173+
174+
if (get_user_ual(handler, funcdesc_ptr)
175+
|| get_user_ual(handler_fdpic_GOT, funcdesc_ptr + 4)) {
176+
goto give_sigsegv;
177+
}
178+
} else {
179+
handler = ka->_sa_handler;
180+
}
181+
168182
if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) {
169183
goto give_sigsegv;
170184
}
@@ -185,14 +199,21 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
185199
}
186200

187201
if (ka->sa_flags & TARGET_SA_RESTORER) {
188-
ra = ka->sa_restorer;
202+
if (is_fdpic) {
203+
if (get_user_ual(ra, ka->sa_restorer)) {
204+
unlock_user_struct(frame, frame_addr, 0);
205+
goto give_sigsegv;
206+
}
207+
} else {
208+
ra = ka->sa_restorer;
209+
}
189210
} else {
190211
/* Not used, but retain for ABI compatibility. */
191212
install_sigtramp(frame->retcode);
192213
ra = default_rt_sigreturn;
193214
}
194215
memset(env->regs, 0, sizeof(env->regs));
195-
env->pc = ka->_sa_handler;
216+
env->pc = handler;
196217
env->regs[1] = frame_addr;
197218
env->sregs[WINDOW_BASE] = 0;
198219
env->sregs[WINDOW_START] = 1;
@@ -212,6 +233,9 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
212233
env->regs[base + 3] = frame_addr + offsetof(struct target_rt_sigframe,
213234
info);
214235
env->regs[base + 4] = frame_addr + offsetof(struct target_rt_sigframe, uc);
236+
if (is_fdpic) {
237+
env->regs[base + 11] = handler_fdpic_GOT;
238+
}
215239
unlock_user_struct(frame, frame_addr, 1);
216240
return;
217241

0 commit comments

Comments
 (0)