@@ -203,9 +203,6 @@ struct target_func_ptr {
203
203
204
204
#endif
205
205
206
- /* We use the mc_pad field for the signal return trampoline. */
207
- #define tramp mc_pad
208
-
209
206
/* See arch/powerpc/kernel/signal.c. */
210
207
static target_ulong get_sigframe (struct target_sigaction * ka ,
211
208
CPUPPCState * env ,
@@ -436,12 +433,7 @@ void setup_frame(int sig, struct target_sigaction *ka,
436
433
/* Save user regs. */
437
434
save_user_regs (env , & frame -> mctx );
438
435
439
- /* Construct the trampoline code on the stack. */
440
- encode_trampoline (TARGET_NR_sigreturn , (uint32_t * )& frame -> mctx .tramp );
441
-
442
- /* The kernel checks for the presence of a VDSO here. We don't
443
- emulate a vdso, so use a sigreturn system call. */
444
- env -> lr = (target_ulong ) h2g (frame -> mctx .tramp );
436
+ env -> lr = default_sigreturn ;
445
437
446
438
/* Turn off all fp exceptions. */
447
439
env -> fpscr = 0 ;
@@ -477,7 +469,6 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
477
469
target_sigset_t * set , CPUPPCState * env )
478
470
{
479
471
struct target_rt_sigframe * rt_sf ;
480
- uint32_t * trampptr = 0 ;
481
472
struct target_mcontext * mctx = 0 ;
482
473
target_ulong rt_sf_addr , newsp = 0 ;
483
474
int i , err = 0 ;
@@ -507,22 +498,17 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
507
498
508
499
#if defined(TARGET_PPC64 )
509
500
mctx = & rt_sf -> uc .tuc_sigcontext .mcontext ;
510
- trampptr = & rt_sf -> trampoline [0 ];
511
501
512
502
sc = & rt_sf -> uc .tuc_sigcontext ;
513
503
__put_user (h2g (mctx ), & sc -> regs );
514
504
__put_user (sig , & sc -> signal );
515
505
#else
516
506
mctx = & rt_sf -> uc .tuc_mcontext ;
517
- trampptr = (uint32_t * )& rt_sf -> uc .tuc_mcontext .tramp ;
518
507
#endif
519
508
520
509
save_user_regs (env , mctx );
521
- encode_trampoline (TARGET_NR_rt_sigreturn , trampptr );
522
510
523
- /* The kernel checks for the presence of a VDSO here. We don't
524
- emulate a vdso, so use a sigreturn system call. */
525
- env -> lr = (target_ulong ) h2g (trampptr );
511
+ env -> lr = default_rt_sigreturn ;
526
512
527
513
/* Turn off all fp exceptions. */
528
514
env -> fpscr = 0 ;
@@ -720,3 +706,19 @@ abi_long do_swapcontext(CPUArchState *env, abi_ulong uold_ctx,
720
706
721
707
return 0 ;
722
708
}
709
+
710
+ void setup_sigtramp (abi_ulong sigtramp_page )
711
+ {
712
+ uint32_t * tramp = lock_user (VERIFY_WRITE , sigtramp_page , 2 * 8 , 0 );
713
+ assert (tramp != NULL );
714
+
715
+ #ifdef TARGET_ARCH_HAS_SETUP_FRAME
716
+ default_sigreturn = sigtramp_page ;
717
+ encode_trampoline (TARGET_NR_sigreturn , tramp + 0 );
718
+ #endif
719
+
720
+ default_rt_sigreturn = sigtramp_page + 8 ;
721
+ encode_trampoline (TARGET_NR_rt_sigreturn , tramp + 2 );
722
+
723
+ unlock_user (tramp , sigtramp_page , 2 * 8 );
724
+ }
0 commit comments