@@ -242,6 +242,12 @@ static void restore_fpu(struct target_siginfo_fpu *fpu, CPUSPARCState *env)
242
242
}
243
243
244
244
#ifdef TARGET_ARCH_HAS_SETUP_FRAME
245
+ static void install_sigtramp (uint32_t * tramp , int syscall )
246
+ {
247
+ __put_user (0x82102000u + syscall , & tramp [0 ]); /* mov syscall, %g1 */
248
+ __put_user (0x91d02010u , & tramp [1 ]); /* t 0x10 */
249
+ }
250
+
245
251
void setup_frame (int sig , struct target_sigaction * ka ,
246
252
target_sigset_t * set , CPUSPARCState * env )
247
253
{
@@ -291,13 +297,9 @@ void setup_frame(int sig, struct target_sigaction *ka,
291
297
if (ka -> ka_restorer ) {
292
298
env -> regwptr [WREG_O7 ] = ka -> ka_restorer ;
293
299
} else {
294
- env -> regwptr [WREG_O7 ] = sf_addr +
295
- offsetof(struct target_signal_frame , insns ) - 2 * 4 ;
296
-
297
- /* mov __NR_sigreturn, %g1 */
298
- __put_user (0x821020d8u , & sf -> insns [0 ]);
299
- /* t 0x10 */
300
- __put_user (0x91d02010u , & sf -> insns [1 ]);
300
+ /* Not used, but retain for ABI compatibility. */
301
+ install_sigtramp (sf -> insns , TARGET_NR_sigreturn );
302
+ env -> regwptr [WREG_O7 ] = default_sigreturn ;
301
303
}
302
304
unlock_user (sf , sf_addr , sf_size );
303
305
}
@@ -358,13 +360,9 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
358
360
if (ka -> ka_restorer ) {
359
361
env -> regwptr [WREG_O7 ] = ka -> ka_restorer ;
360
362
} else {
361
- env -> regwptr [WREG_O7 ] =
362
- sf_addr + offsetof(struct target_rt_signal_frame , insns ) - 2 * 4 ;
363
-
364
- /* mov __NR_rt_sigreturn, %g1 */
365
- __put_user (0x82102065u , & sf -> insns [0 ]);
366
- /* t 0x10 */
367
- __put_user (0x91d02010u , & sf -> insns [1 ]);
363
+ /* Not used, but retain for ABI compatibility. */
364
+ install_sigtramp (sf -> insns , TARGET_NR_rt_sigreturn );
365
+ env -> regwptr [WREG_O7 ] = default_rt_sigreturn ;
368
366
}
369
367
#else
370
368
env -> regwptr [WREG_O7 ] = ka -> ka_restorer ;
@@ -775,4 +773,18 @@ void sparc64_get_context(CPUSPARCState *env)
775
773
unlock_user_struct (ucp , ucp_addr , 1 );
776
774
force_sig (TARGET_SIGSEGV );
777
775
}
776
+ #else
777
+ void setup_sigtramp (abi_ulong sigtramp_page )
778
+ {
779
+ uint32_t * tramp = lock_user (VERIFY_WRITE , sigtramp_page , 2 * 8 , 0 );
780
+ assert (tramp != NULL );
781
+
782
+ default_sigreturn = sigtramp_page ;
783
+ install_sigtramp (tramp , TARGET_NR_sigreturn );
784
+
785
+ default_rt_sigreturn = sigtramp_page + 8 ;
786
+ install_sigtramp (tramp + 2 , TARGET_NR_rt_sigreturn );
787
+
788
+ unlock_user (tramp , sigtramp_page , 2 * 8 );
789
+ }
778
790
#endif
0 commit comments