xref: /qemu/linux-user/hexagon/signal.c (revision 4d6d8a05)
1d2a56bd2STaylor Simpson /*
2d2a56bd2STaylor Simpson  *  Emulation of Linux signals
3d2a56bd2STaylor Simpson  *
4d2a56bd2STaylor Simpson  *  Copyright (c) 2003 Fabrice Bellard
5d2a56bd2STaylor Simpson  *  Copyright(c) 2019-2021 Qualcomm Innovation Center, Inc. All Rights Reserved.
6d2a56bd2STaylor Simpson  *
7d2a56bd2STaylor Simpson  *  This program is free software; you can redistribute it and/or modify
8d2a56bd2STaylor Simpson  *  it under the terms of the GNU General Public License as published by
9d2a56bd2STaylor Simpson  *  the Free Software Foundation; either version 2 of the License, or
10d2a56bd2STaylor Simpson  *  (at your option) any later version.
11d2a56bd2STaylor Simpson  *
12d2a56bd2STaylor Simpson  *  This program is distributed in the hope that it will be useful,
13d2a56bd2STaylor Simpson  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14d2a56bd2STaylor Simpson  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15d2a56bd2STaylor Simpson  *  GNU General Public License for more details.
16d2a56bd2STaylor Simpson  *
17d2a56bd2STaylor Simpson  *  You should have received a copy of the GNU General Public License
18d2a56bd2STaylor Simpson  *  along with this program; if not, see <http://www.gnu.org/licenses/>.
19d2a56bd2STaylor Simpson  */
20d2a56bd2STaylor Simpson #include "qemu/osdep.h"
21d2a56bd2STaylor Simpson #include "qemu.h"
223b249d26SPeter Maydell #include "user-internals.h"
23d2a56bd2STaylor Simpson #include "signal-common.h"
24d2a56bd2STaylor Simpson #include "linux-user/trace.h"
25d2a56bd2STaylor Simpson 
26d2a56bd2STaylor Simpson struct target_sigcontext {
27d2a56bd2STaylor Simpson     target_ulong r0,  r1,  r2,  r3;
28d2a56bd2STaylor Simpson     target_ulong r4,  r5,  r6,  r7;
29d2a56bd2STaylor Simpson     target_ulong r8,  r9, r10, r11;
30d2a56bd2STaylor Simpson     target_ulong r12, r13, r14, r15;
31d2a56bd2STaylor Simpson     target_ulong r16, r17, r18, r19;
32d2a56bd2STaylor Simpson     target_ulong r20, r21, r22, r23;
33d2a56bd2STaylor Simpson     target_ulong r24, r25, r26, r27;
34d2a56bd2STaylor Simpson     target_ulong r28, r29, r30, r31;
35d2a56bd2STaylor Simpson     target_ulong sa0;
36d2a56bd2STaylor Simpson     target_ulong lc0;
37d2a56bd2STaylor Simpson     target_ulong sa1;
38d2a56bd2STaylor Simpson     target_ulong lc1;
39d2a56bd2STaylor Simpson     target_ulong m0;
40d2a56bd2STaylor Simpson     target_ulong m1;
41d2a56bd2STaylor Simpson     target_ulong usr;
42d2a56bd2STaylor Simpson     target_ulong gp;
43d2a56bd2STaylor Simpson     target_ulong ugp;
44d2a56bd2STaylor Simpson     target_ulong pc;
45d2a56bd2STaylor Simpson     target_ulong cause;
46d2a56bd2STaylor Simpson     target_ulong badva;
47c979d901SMukilan Thiyagarajan     target_ulong pred[NUM_PREGS];
48d2a56bd2STaylor Simpson };
49d2a56bd2STaylor Simpson 
50d2a56bd2STaylor Simpson struct target_ucontext {
51d2a56bd2STaylor Simpson     unsigned long uc_flags;
52d2a56bd2STaylor Simpson     target_ulong uc_link; /* target pointer */
53d2a56bd2STaylor Simpson     target_stack_t uc_stack;
54d2a56bd2STaylor Simpson     struct target_sigcontext uc_mcontext;
55d2a56bd2STaylor Simpson     target_sigset_t uc_sigmask;
56d2a56bd2STaylor Simpson };
57d2a56bd2STaylor Simpson 
58d2a56bd2STaylor Simpson struct target_rt_sigframe {
59d2a56bd2STaylor Simpson     uint32_t tramp[2];
60d2a56bd2STaylor Simpson     struct target_siginfo info;
61d2a56bd2STaylor Simpson     struct target_ucontext uc;
62d2a56bd2STaylor Simpson };
63d2a56bd2STaylor Simpson 
get_sigframe(struct target_sigaction * ka,CPUHexagonState * regs,size_t framesize)64d2a56bd2STaylor Simpson static abi_ulong get_sigframe(struct target_sigaction *ka,
65d2a56bd2STaylor Simpson                               CPUHexagonState *regs, size_t framesize)
66d2a56bd2STaylor Simpson {
67d2a56bd2STaylor Simpson     abi_ulong sp = get_sp_from_cpustate(regs);
68d2a56bd2STaylor Simpson 
69d2a56bd2STaylor Simpson     /* This is the X/Open sanctioned signal stack switching.  */
70d2a56bd2STaylor Simpson     sp = target_sigsp(sp, ka) - framesize;
71d2a56bd2STaylor Simpson 
72d2a56bd2STaylor Simpson     sp = QEMU_ALIGN_DOWN(sp, 8);
73d2a56bd2STaylor Simpson 
74d2a56bd2STaylor Simpson     return sp;
75d2a56bd2STaylor Simpson }
76d2a56bd2STaylor Simpson 
setup_sigcontext(struct target_sigcontext * sc,CPUHexagonState * env)77d2a56bd2STaylor Simpson static void setup_sigcontext(struct target_sigcontext *sc, CPUHexagonState *env)
78d2a56bd2STaylor Simpson {
79d2a56bd2STaylor Simpson     __put_user(env->gpr[HEX_REG_R00], &sc->r0);
80d2a56bd2STaylor Simpson     __put_user(env->gpr[HEX_REG_R01], &sc->r1);
81d2a56bd2STaylor Simpson     __put_user(env->gpr[HEX_REG_R02], &sc->r2);
82d2a56bd2STaylor Simpson     __put_user(env->gpr[HEX_REG_R03], &sc->r3);
83d2a56bd2STaylor Simpson     __put_user(env->gpr[HEX_REG_R04], &sc->r4);
84d2a56bd2STaylor Simpson     __put_user(env->gpr[HEX_REG_R05], &sc->r5);
85d2a56bd2STaylor Simpson     __put_user(env->gpr[HEX_REG_R06], &sc->r6);
86d2a56bd2STaylor Simpson     __put_user(env->gpr[HEX_REG_R07], &sc->r7);
87d2a56bd2STaylor Simpson     __put_user(env->gpr[HEX_REG_R08], &sc->r8);
88d2a56bd2STaylor Simpson     __put_user(env->gpr[HEX_REG_R09], &sc->r9);
89d2a56bd2STaylor Simpson     __put_user(env->gpr[HEX_REG_R10], &sc->r10);
90d2a56bd2STaylor Simpson     __put_user(env->gpr[HEX_REG_R11], &sc->r11);
91d2a56bd2STaylor Simpson     __put_user(env->gpr[HEX_REG_R12], &sc->r12);
92d2a56bd2STaylor Simpson     __put_user(env->gpr[HEX_REG_R13], &sc->r13);
93d2a56bd2STaylor Simpson     __put_user(env->gpr[HEX_REG_R14], &sc->r14);
94d2a56bd2STaylor Simpson     __put_user(env->gpr[HEX_REG_R15], &sc->r15);
95d2a56bd2STaylor Simpson     __put_user(env->gpr[HEX_REG_R16], &sc->r16);
96d2a56bd2STaylor Simpson     __put_user(env->gpr[HEX_REG_R17], &sc->r17);
97d2a56bd2STaylor Simpson     __put_user(env->gpr[HEX_REG_R18], &sc->r18);
98d2a56bd2STaylor Simpson     __put_user(env->gpr[HEX_REG_R19], &sc->r19);
99d2a56bd2STaylor Simpson     __put_user(env->gpr[HEX_REG_R20], &sc->r20);
100d2a56bd2STaylor Simpson     __put_user(env->gpr[HEX_REG_R21], &sc->r21);
101d2a56bd2STaylor Simpson     __put_user(env->gpr[HEX_REG_R22], &sc->r22);
102d2a56bd2STaylor Simpson     __put_user(env->gpr[HEX_REG_R23], &sc->r23);
103d2a56bd2STaylor Simpson     __put_user(env->gpr[HEX_REG_R24], &sc->r24);
104d2a56bd2STaylor Simpson     __put_user(env->gpr[HEX_REG_R25], &sc->r25);
105d2a56bd2STaylor Simpson     __put_user(env->gpr[HEX_REG_R26], &sc->r26);
106d2a56bd2STaylor Simpson     __put_user(env->gpr[HEX_REG_R27], &sc->r27);
107d2a56bd2STaylor Simpson     __put_user(env->gpr[HEX_REG_R28], &sc->r28);
108d2a56bd2STaylor Simpson     __put_user(env->gpr[HEX_REG_R29], &sc->r29);
109d2a56bd2STaylor Simpson     __put_user(env->gpr[HEX_REG_R30], &sc->r30);
110d2a56bd2STaylor Simpson     __put_user(env->gpr[HEX_REG_R31], &sc->r31);
111d2a56bd2STaylor Simpson     __put_user(env->gpr[HEX_REG_SA0], &sc->sa0);
112d2a56bd2STaylor Simpson     __put_user(env->gpr[HEX_REG_LC0], &sc->lc0);
113d2a56bd2STaylor Simpson     __put_user(env->gpr[HEX_REG_SA1], &sc->sa1);
114d2a56bd2STaylor Simpson     __put_user(env->gpr[HEX_REG_LC1], &sc->lc1);
115d2a56bd2STaylor Simpson     __put_user(env->gpr[HEX_REG_M0], &sc->m0);
116d2a56bd2STaylor Simpson     __put_user(env->gpr[HEX_REG_M1], &sc->m1);
117d2a56bd2STaylor Simpson     __put_user(env->gpr[HEX_REG_USR], &sc->usr);
118d2a56bd2STaylor Simpson     __put_user(env->gpr[HEX_REG_GP], &sc->gp);
119d2a56bd2STaylor Simpson     __put_user(env->gpr[HEX_REG_UGP], &sc->ugp);
120d2a56bd2STaylor Simpson     __put_user(env->gpr[HEX_REG_PC], &sc->pc);
121c979d901SMukilan Thiyagarajan 
122c979d901SMukilan Thiyagarajan     int i;
123c979d901SMukilan Thiyagarajan     for (i = 0; i < NUM_PREGS; i++) {
124c979d901SMukilan Thiyagarajan         __put_user(env->pred[i], &(sc->pred[i]));
125c979d901SMukilan Thiyagarajan     }
126d2a56bd2STaylor Simpson }
127d2a56bd2STaylor Simpson 
setup_ucontext(struct target_ucontext * uc,CPUHexagonState * env,target_sigset_t * set)128d2a56bd2STaylor Simpson static void setup_ucontext(struct target_ucontext *uc,
129d2a56bd2STaylor Simpson                            CPUHexagonState *env, target_sigset_t *set)
130d2a56bd2STaylor Simpson {
131d2a56bd2STaylor Simpson     __put_user(0,    &(uc->uc_flags));
132d2a56bd2STaylor Simpson     __put_user(0,    &(uc->uc_link));
133d2a56bd2STaylor Simpson 
134d2a56bd2STaylor Simpson     target_save_altstack(&uc->uc_stack, env);
135d2a56bd2STaylor Simpson 
136d2a56bd2STaylor Simpson     int i;
137d2a56bd2STaylor Simpson     for (i = 0; i < TARGET_NSIG_WORDS; i++) {
138d2a56bd2STaylor Simpson         __put_user(set->sig[i], &(uc->uc_sigmask.sig[i]));
139d2a56bd2STaylor Simpson     }
140d2a56bd2STaylor Simpson 
141d2a56bd2STaylor Simpson     setup_sigcontext(&uc->uc_mcontext, env);
142d2a56bd2STaylor Simpson }
143d2a56bd2STaylor Simpson 
install_sigtramp(uint32_t * tramp)144d2a56bd2STaylor Simpson static inline void install_sigtramp(uint32_t *tramp)
145d2a56bd2STaylor Simpson {
146d2a56bd2STaylor Simpson     __put_user(0x7800d166, tramp + 0); /*  { r6=#__NR_rt_sigreturn } */
147d2a56bd2STaylor Simpson     __put_user(0x5400c004, tramp + 1); /*  { trap0(#1) } */
148d2a56bd2STaylor Simpson }
149d2a56bd2STaylor Simpson 
setup_rt_frame(int sig,struct target_sigaction * ka,target_siginfo_t * info,target_sigset_t * set,CPUHexagonState * env)150d2a56bd2STaylor Simpson void setup_rt_frame(int sig, struct target_sigaction *ka,
151d2a56bd2STaylor Simpson                     target_siginfo_t *info,
152d2a56bd2STaylor Simpson                     target_sigset_t *set, CPUHexagonState *env)
153d2a56bd2STaylor Simpson {
154d2a56bd2STaylor Simpson     abi_ulong frame_addr;
155d2a56bd2STaylor Simpson     struct target_rt_sigframe *frame;
156d2a56bd2STaylor Simpson 
157d2a56bd2STaylor Simpson     frame_addr = get_sigframe(ka, env, sizeof(*frame));
158d2a56bd2STaylor Simpson     trace_user_setup_rt_frame(env, frame_addr);
159d2a56bd2STaylor Simpson 
160d2a56bd2STaylor Simpson     if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) {
161d2a56bd2STaylor Simpson         goto badframe;
162d2a56bd2STaylor Simpson     }
163d2a56bd2STaylor Simpson 
164d2a56bd2STaylor Simpson     setup_ucontext(&frame->uc, env, set);
1654d6d8a05SGustavo Romero     frame->info = *info;
166c8ef02b1SRichard Henderson     /*
167c8ef02b1SRichard Henderson      * The on-stack signal trampoline is no longer executed;
168c8ef02b1SRichard Henderson      * however, the libgcc signal frame unwinding code checks
169c8ef02b1SRichard Henderson      * for the presence of these two numeric magic values.
170c8ef02b1SRichard Henderson      */
171d2a56bd2STaylor Simpson     install_sigtramp(frame->tramp);
172d2a56bd2STaylor Simpson 
173d2a56bd2STaylor Simpson     env->gpr[HEX_REG_PC] = ka->_sa_handler;
174d2a56bd2STaylor Simpson     env->gpr[HEX_REG_SP] = frame_addr;
175d2a56bd2STaylor Simpson     env->gpr[HEX_REG_R00] = sig;
176d2a56bd2STaylor Simpson     env->gpr[HEX_REG_R01] =
177d2a56bd2STaylor Simpson         frame_addr + offsetof(struct target_rt_sigframe, info);
178d2a56bd2STaylor Simpson     env->gpr[HEX_REG_R02] =
179d2a56bd2STaylor Simpson         frame_addr + offsetof(struct target_rt_sigframe, uc);
180c8ef02b1SRichard Henderson     env->gpr[HEX_REG_LR] = default_rt_sigreturn;
181d2a56bd2STaylor Simpson 
182d2a56bd2STaylor Simpson     return;
183d2a56bd2STaylor Simpson 
184d2a56bd2STaylor Simpson badframe:
185d2a56bd2STaylor Simpson     unlock_user_struct(frame, frame_addr, 1);
186d2a56bd2STaylor Simpson     if (sig == TARGET_SIGSEGV) {
187d2a56bd2STaylor Simpson         ka->_sa_handler = TARGET_SIG_DFL;
188d2a56bd2STaylor Simpson     }
189d2a56bd2STaylor Simpson     force_sig(TARGET_SIGSEGV);
190d2a56bd2STaylor Simpson }
191d2a56bd2STaylor Simpson 
restore_sigcontext(CPUHexagonState * env,struct target_sigcontext * sc)192d2a56bd2STaylor Simpson static void restore_sigcontext(CPUHexagonState *env,
193d2a56bd2STaylor Simpson                                struct target_sigcontext *sc)
194d2a56bd2STaylor Simpson {
195d2a56bd2STaylor Simpson     __get_user(env->gpr[HEX_REG_R00], &sc->r0);
196d2a56bd2STaylor Simpson     __get_user(env->gpr[HEX_REG_R01], &sc->r1);
197d2a56bd2STaylor Simpson     __get_user(env->gpr[HEX_REG_R02], &sc->r2);
198d2a56bd2STaylor Simpson     __get_user(env->gpr[HEX_REG_R03], &sc->r3);
199d2a56bd2STaylor Simpson     __get_user(env->gpr[HEX_REG_R04], &sc->r4);
200d2a56bd2STaylor Simpson     __get_user(env->gpr[HEX_REG_R05], &sc->r5);
201d2a56bd2STaylor Simpson     __get_user(env->gpr[HEX_REG_R06], &sc->r6);
202d2a56bd2STaylor Simpson     __get_user(env->gpr[HEX_REG_R07], &sc->r7);
203d2a56bd2STaylor Simpson     __get_user(env->gpr[HEX_REG_R08], &sc->r8);
204d2a56bd2STaylor Simpson     __get_user(env->gpr[HEX_REG_R09], &sc->r9);
205d2a56bd2STaylor Simpson     __get_user(env->gpr[HEX_REG_R10], &sc->r10);
206d2a56bd2STaylor Simpson     __get_user(env->gpr[HEX_REG_R11], &sc->r11);
207d2a56bd2STaylor Simpson     __get_user(env->gpr[HEX_REG_R12], &sc->r12);
208d2a56bd2STaylor Simpson     __get_user(env->gpr[HEX_REG_R13], &sc->r13);
209d2a56bd2STaylor Simpson     __get_user(env->gpr[HEX_REG_R14], &sc->r14);
210d2a56bd2STaylor Simpson     __get_user(env->gpr[HEX_REG_R15], &sc->r15);
211d2a56bd2STaylor Simpson     __get_user(env->gpr[HEX_REG_R16], &sc->r16);
212d2a56bd2STaylor Simpson     __get_user(env->gpr[HEX_REG_R17], &sc->r17);
213d2a56bd2STaylor Simpson     __get_user(env->gpr[HEX_REG_R18], &sc->r18);
214d2a56bd2STaylor Simpson     __get_user(env->gpr[HEX_REG_R19], &sc->r19);
215d2a56bd2STaylor Simpson     __get_user(env->gpr[HEX_REG_R20], &sc->r20);
216d2a56bd2STaylor Simpson     __get_user(env->gpr[HEX_REG_R21], &sc->r21);
217d2a56bd2STaylor Simpson     __get_user(env->gpr[HEX_REG_R22], &sc->r22);
218d2a56bd2STaylor Simpson     __get_user(env->gpr[HEX_REG_R23], &sc->r23);
219d2a56bd2STaylor Simpson     __get_user(env->gpr[HEX_REG_R24], &sc->r24);
220d2a56bd2STaylor Simpson     __get_user(env->gpr[HEX_REG_R25], &sc->r25);
221d2a56bd2STaylor Simpson     __get_user(env->gpr[HEX_REG_R26], &sc->r26);
222d2a56bd2STaylor Simpson     __get_user(env->gpr[HEX_REG_R27], &sc->r27);
223d2a56bd2STaylor Simpson     __get_user(env->gpr[HEX_REG_R28], &sc->r28);
224d2a56bd2STaylor Simpson     __get_user(env->gpr[HEX_REG_R29], &sc->r29);
225d2a56bd2STaylor Simpson     __get_user(env->gpr[HEX_REG_R30], &sc->r30);
226d2a56bd2STaylor Simpson     __get_user(env->gpr[HEX_REG_R31], &sc->r31);
227d2a56bd2STaylor Simpson     __get_user(env->gpr[HEX_REG_SA0], &sc->sa0);
228d2a56bd2STaylor Simpson     __get_user(env->gpr[HEX_REG_LC0], &sc->lc0);
229d2a56bd2STaylor Simpson     __get_user(env->gpr[HEX_REG_SA1], &sc->sa1);
230d2a56bd2STaylor Simpson     __get_user(env->gpr[HEX_REG_LC1], &sc->lc1);
231d2a56bd2STaylor Simpson     __get_user(env->gpr[HEX_REG_M0], &sc->m0);
232d2a56bd2STaylor Simpson     __get_user(env->gpr[HEX_REG_M1], &sc->m1);
233d2a56bd2STaylor Simpson     __get_user(env->gpr[HEX_REG_USR], &sc->usr);
234d2a56bd2STaylor Simpson     __get_user(env->gpr[HEX_REG_GP], &sc->gp);
235d2a56bd2STaylor Simpson     __get_user(env->gpr[HEX_REG_UGP], &sc->ugp);
236d2a56bd2STaylor Simpson     __get_user(env->gpr[HEX_REG_PC], &sc->pc);
237c979d901SMukilan Thiyagarajan 
238c979d901SMukilan Thiyagarajan     int i;
239c979d901SMukilan Thiyagarajan     for (i = 0; i < NUM_PREGS; i++) {
240c979d901SMukilan Thiyagarajan         __get_user(env->pred[i], &(sc->pred[i]));
241c979d901SMukilan Thiyagarajan     }
242d2a56bd2STaylor Simpson }
243d2a56bd2STaylor Simpson 
restore_ucontext(CPUHexagonState * env,struct target_ucontext * uc)244d2a56bd2STaylor Simpson static void restore_ucontext(CPUHexagonState *env, struct target_ucontext *uc)
245d2a56bd2STaylor Simpson {
246d2a56bd2STaylor Simpson     sigset_t blocked;
247d2a56bd2STaylor Simpson     target_sigset_t target_set;
248d2a56bd2STaylor Simpson     int i;
249d2a56bd2STaylor Simpson 
250d2a56bd2STaylor Simpson     target_sigemptyset(&target_set);
251d2a56bd2STaylor Simpson     for (i = 0; i < TARGET_NSIG_WORDS; i++) {
252d2a56bd2STaylor Simpson         __get_user(target_set.sig[i], &(uc->uc_sigmask.sig[i]));
253d2a56bd2STaylor Simpson     }
254d2a56bd2STaylor Simpson 
255d2a56bd2STaylor Simpson     target_to_host_sigset_internal(&blocked, &target_set);
256d2a56bd2STaylor Simpson     set_sigmask(&blocked);
257d2a56bd2STaylor Simpson 
258d2a56bd2STaylor Simpson     restore_sigcontext(env, &uc->uc_mcontext);
259d2a56bd2STaylor Simpson }
260d2a56bd2STaylor Simpson 
do_rt_sigreturn(CPUHexagonState * env)261d2a56bd2STaylor Simpson long do_rt_sigreturn(CPUHexagonState *env)
262d2a56bd2STaylor Simpson {
263d2a56bd2STaylor Simpson     struct target_rt_sigframe *frame;
264d2a56bd2STaylor Simpson     abi_ulong frame_addr;
265d2a56bd2STaylor Simpson 
266d2a56bd2STaylor Simpson     frame_addr = env->gpr[HEX_REG_SP];
267d2a56bd2STaylor Simpson     trace_user_do_sigreturn(env, frame_addr);
268d2a56bd2STaylor Simpson     if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1)) {
269d2a56bd2STaylor Simpson         goto badframe;
270d2a56bd2STaylor Simpson     }
271d2a56bd2STaylor Simpson 
272d2a56bd2STaylor Simpson     restore_ucontext(env, &frame->uc);
273ddc3e74dSRichard Henderson     target_restore_altstack(&frame->uc.uc_stack, env);
274d2a56bd2STaylor Simpson 
275d2a56bd2STaylor Simpson     unlock_user_struct(frame, frame_addr, 0);
27657a0c938SRichard Henderson     return -QEMU_ESIGRETURN;
277d2a56bd2STaylor Simpson 
278d2a56bd2STaylor Simpson badframe:
279d2a56bd2STaylor Simpson     unlock_user_struct(frame, frame_addr, 0);
280d2a56bd2STaylor Simpson     force_sig(TARGET_SIGSEGV);
281d2a56bd2STaylor Simpson     return 0;
282d2a56bd2STaylor Simpson }
283c8ef02b1SRichard Henderson 
setup_sigtramp(abi_ulong sigtramp_page)284c8ef02b1SRichard Henderson void setup_sigtramp(abi_ulong sigtramp_page)
285c8ef02b1SRichard Henderson {
286c8ef02b1SRichard Henderson     uint32_t *tramp = lock_user(VERIFY_WRITE, sigtramp_page, 4 * 2, 0);
287c8ef02b1SRichard Henderson     assert(tramp != NULL);
288c8ef02b1SRichard Henderson 
289c8ef02b1SRichard Henderson     default_rt_sigreturn = sigtramp_page;
290c8ef02b1SRichard Henderson     install_sigtramp(tramp);
291c8ef02b1SRichard Henderson 
292c8ef02b1SRichard Henderson     unlock_user(tramp, sigtramp_page, 4 * 2);
293c8ef02b1SRichard Henderson }
294