@@ -52,7 +52,6 @@ struct target_sigframe
52
52
{
53
53
struct target_sigcontext sc ;
54
54
target_ulong extramask [TARGET_NSIG_WORDS - 1 ];
55
- uint16_t retcode [3 ];
56
55
};
57
56
58
57
@@ -68,7 +67,6 @@ struct target_rt_sigframe
68
67
{
69
68
struct target_siginfo info ;
70
69
struct target_ucontext uc ;
71
- uint16_t retcode [3 ];
72
70
};
73
71
74
72
@@ -190,15 +188,9 @@ void setup_frame(int sig, struct target_sigaction *ka,
190
188
/* Set up to return from userspace. If provided, use a stub
191
189
already in userspace. */
192
190
if (ka -> sa_flags & TARGET_SA_RESTORER ) {
193
- regs -> pr = ( unsigned long ) ka -> sa_restorer ;
191
+ regs -> pr = ka -> sa_restorer ;
194
192
} else {
195
- /* Generate return code (system call to sigreturn) */
196
- abi_ulong retcode_addr = frame_addr +
197
- offsetof(struct target_sigframe , retcode );
198
- __put_user (MOVW (2 ), & frame -> retcode [0 ]);
199
- __put_user (TRAP_NOARG , & frame -> retcode [1 ]);
200
- __put_user ((TARGET_NR_sigreturn ), & frame -> retcode [2 ]);
201
- regs -> pr = (unsigned long ) retcode_addr ;
193
+ regs -> pr = default_sigreturn ;
202
194
}
203
195
204
196
/* Set up registers for signal handler */
@@ -248,15 +240,9 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
248
240
/* Set up to return from userspace. If provided, use a stub
249
241
already in userspace. */
250
242
if (ka -> sa_flags & TARGET_SA_RESTORER ) {
251
- regs -> pr = ( unsigned long ) ka -> sa_restorer ;
243
+ regs -> pr = ka -> sa_restorer ;
252
244
} else {
253
- /* Generate return code (system call to sigreturn) */
254
- abi_ulong retcode_addr = frame_addr +
255
- offsetof(struct target_rt_sigframe , retcode );
256
- __put_user (MOVW (2 ), & frame -> retcode [0 ]);
257
- __put_user (TRAP_NOARG , & frame -> retcode [1 ]);
258
- __put_user ((TARGET_NR_rt_sigreturn ), & frame -> retcode [2 ]);
259
- regs -> pr = (unsigned long ) retcode_addr ;
245
+ regs -> pr = default_rt_sigreturn ;
260
246
}
261
247
262
248
/* Set up registers for signal handler */
@@ -334,3 +320,21 @@ long do_rt_sigreturn(CPUSH4State *regs)
334
320
force_sig (TARGET_SIGSEGV );
335
321
return - TARGET_QEMU_ESIGRETURN ;
336
322
}
323
+
324
+ void setup_sigtramp (abi_ulong sigtramp_page )
325
+ {
326
+ uint16_t * tramp = lock_user (VERIFY_WRITE , sigtramp_page , 2 * 6 , 0 );
327
+ assert (tramp != NULL );
328
+
329
+ default_sigreturn = sigtramp_page ;
330
+ __put_user (MOVW (2 ), & tramp [0 ]);
331
+ __put_user (TRAP_NOARG , & tramp [1 ]);
332
+ __put_user (TARGET_NR_sigreturn , & tramp [2 ]);
333
+
334
+ default_rt_sigreturn = sigtramp_page + 6 ;
335
+ __put_user (MOVW (2 ), & tramp [3 ]);
336
+ __put_user (TRAP_NOARG , & tramp [4 ]);
337
+ __put_user (TARGET_NR_rt_sigreturn , & tramp [5 ]);
338
+
339
+ unlock_user (tramp , sigtramp_page , 2 * 6 );
340
+ }
0 commit comments