@ -128,6 +128,29 @@ static int setup_sigcontext(struct target_rt_sigframe *frame,
return 1 ;
}
static void install_sigtramp ( uint8_t * tramp )
{
# ifdef TARGET_WORDS_BIGENDIAN
/* Generate instruction: MOVI a2, __NR_rt_sigreturn */
__put_user ( 0x22 , & tramp [ 0 ] ) ;
__put_user ( 0x0a , & tramp [ 1 ] ) ;
__put_user ( TARGET_NR_rt_sigreturn , & tramp [ 2 ] ) ;
/* Generate instruction: SYSCALL */
__put_user ( 0x00 , & tramp [ 3 ] ) ;
__put_user ( 0x05 , & tramp [ 4 ] ) ;
__put_user ( 0x00 , & tramp [ 5 ] ) ;
# else
/* Generate instruction: MOVI a2, __NR_rt_sigreturn */
__put_user ( 0x22 , & tramp [ 0 ] ) ;
__put_user ( 0xa0 , & tramp [ 1 ] ) ;
__put_user ( TARGET_NR_rt_sigreturn , & tramp [ 2 ] ) ;
/* Generate instruction: SYSCALL */
__put_user ( 0x00 , & tramp [ 3 ] ) ;
__put_user ( 0x50 , & tramp [ 4 ] ) ;
__put_user ( 0x00 , & tramp [ 5 ] ) ;
# endif
}
void setup_rt_frame ( int sig , struct target_sigaction * ka ,
target_siginfo_t * info ,
target_sigset_t * set , CPUXtensaState * env )
@ -164,26 +187,9 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
if ( ka - > sa_flags & TARGET_SA_RESTORER ) {
ra = ka - > sa_restorer ;
} else {
ra = frame_addr + offsetof ( struct target_rt_sigframe , retcode ) ;
# ifdef TARGET_WORDS_BIGENDIAN
/* Generate instruction: MOVI a2, __NR_rt_sigreturn */
__put_user ( 0x22 , & frame - > retcode [ 0 ] ) ;
__put_user ( 0x0a , & frame - > retcode [ 1 ] ) ;
__put_user ( TARGET_NR_rt_sigreturn , & frame - > retcode [ 2 ] ) ;
/* Generate instruction: SYSCALL */
__put_user ( 0x00 , & frame - > retcode [ 3 ] ) ;
__put_user ( 0x05 , & frame - > retcode [ 4 ] ) ;
__put_user ( 0x00 , & frame - > retcode [ 5 ] ) ;
# else
/* Generate instruction: MOVI a2, __NR_rt_sigreturn */
__put_user ( 0x22 , & frame - > retcode [ 0 ] ) ;
__put_user ( 0xa0 , & frame - > retcode [ 1 ] ) ;
__put_user ( TARGET_NR_rt_sigreturn , & frame - > retcode [ 2 ] ) ;
/* Generate instruction: SYSCALL */
__put_user ( 0x00 , & frame - > retcode [ 3 ] ) ;
__put_user ( 0x50 , & frame - > retcode [ 4 ] ) ;
__put_user ( 0x00 , & frame - > retcode [ 5 ] ) ;
# endif
/* Not used, but retain for ABI compatibility. */
install_sigtramp ( frame - > retcode ) ;
ra = default_rt_sigreturn ;
}
memset ( env - > regs , 0 , sizeof ( env - > regs ) ) ;
env - > pc = ka - > _sa_handler ;
@ -264,3 +270,13 @@ badframe:
force_sig ( TARGET_SIGSEGV ) ;
return - TARGET_QEMU_ESIGRETURN ;
}
void setup_sigtramp ( abi_ulong sigtramp_page )
{
uint8_t * tramp = lock_user ( VERIFY_WRITE , sigtramp_page , 6 , 0 ) ;
assert ( tramp ! = NULL ) ;
default_rt_sigreturn = sigtramp_page ;
install_sigtramp ( tramp ) ;
unlock_user ( tramp , sigtramp_page , 6 ) ;
}