@@ -68,7 +68,6 @@ typedef struct {
68
68
target_sigregs sregs ;
69
69
int signo ;
70
70
target_sigregs_ext sregs_ext ;
71
- uint16_t retcode ;
72
71
} sigframe ;
73
72
74
73
#define TARGET_UC_VXRS 2
@@ -85,7 +84,6 @@ struct target_ucontext {
85
84
86
85
typedef struct {
87
86
uint8_t callee_used_stack [__SIGNAL_FRAMESIZE ];
88
- uint16_t retcode ;
89
87
struct target_siginfo info ;
90
88
struct target_ucontext uc ;
91
89
} rt_sigframe ;
@@ -209,9 +207,7 @@ void setup_frame(int sig, struct target_sigaction *ka,
209
207
if (ka -> sa_flags & TARGET_SA_RESTORER ) {
210
208
restorer = ka -> sa_restorer ;
211
209
} else {
212
- restorer = frame_addr + offsetof(sigframe , retcode );
213
- __put_user (S390_SYSCALL_OPCODE | TARGET_NR_sigreturn ,
214
- & frame -> retcode );
210
+ restorer = default_sigreturn ;
215
211
}
216
212
217
213
/* Set up registers for signal handler */
@@ -262,9 +258,7 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
262
258
if (ka -> sa_flags & TARGET_SA_RESTORER ) {
263
259
restorer = ka -> sa_restorer ;
264
260
} else {
265
- restorer = frame_addr + offsetof(typeof (* frame ), retcode );
266
- __put_user (S390_SYSCALL_OPCODE | TARGET_NR_rt_sigreturn ,
267
- & frame -> retcode );
261
+ restorer = default_rt_sigreturn ;
268
262
}
269
263
270
264
/* Create siginfo on the signal stack. */
@@ -405,3 +399,17 @@ long do_rt_sigreturn(CPUS390XState *env)
405
399
unlock_user_struct (frame , frame_addr , 0 );
406
400
return - TARGET_QEMU_ESIGRETURN ;
407
401
}
402
+
403
+ void setup_sigtramp (abi_ulong sigtramp_page )
404
+ {
405
+ uint16_t * tramp = lock_user (VERIFY_WRITE , sigtramp_page , 2 + 2 , 0 );
406
+ assert (tramp != NULL );
407
+
408
+ default_sigreturn = sigtramp_page ;
409
+ __put_user (S390_SYSCALL_OPCODE | TARGET_NR_sigreturn , & tramp [0 ]);
410
+
411
+ default_rt_sigreturn = sigtramp_page + 2 ;
412
+ __put_user (S390_SYSCALL_OPCODE | TARGET_NR_rt_sigreturn , & tramp [1 ]);
413
+
414
+ unlock_user (tramp , sigtramp_page , 2 + 2 );
415
+ }
0 commit comments