@@ -258,6 +258,41 @@ struct signal_ucontext
258258 struct rt_hw_stack_frame frame ;
259259};
260260
261+ void arch_syscall_restart (void * sp );
262+
263+ void arch_signal_check_erestart (void * eframe , void * ksp )
264+ {
265+ struct rt_hw_stack_frame * exp_frame = eframe ;
266+ long rc = exp_frame -> a0 ;
267+ long sys_id = exp_frame -> a7 ;
268+
269+ (void )ksp ;
270+ (void )sys_id ;
271+
272+ if (rc == - ERESTART )
273+ {
274+ LOG_D ("%s(rc=%ld,sys_id=%ld,pid=%d)" , __func__ , rc , sys_id , lwp_self ()-> pid );
275+ LOG_D ("%s: restart rc = %ld" , lwp_get_syscall_name (sys_id ), rc );
276+
277+ /* t0 stores the copy of user's first syscall argument */
278+ exp_frame -> a0 = exp_frame -> t0 ;
279+
280+ /* adjust for epc auto-increment in syscall_handler */
281+ exp_frame -> epc -= 4 ;
282+
283+ arch_syscall_restart (eframe );
284+ }
285+
286+ return ;
287+ }
288+
289+ static void arch_signal_post_action (struct signal_ucontext * new_sp )
290+ {
291+ arch_signal_check_erestart (& new_sp -> frame ,0 );
292+
293+ return ;
294+ }
295+
261296void * arch_signal_ucontext_restore (rt_base_t user_sp )
262297{
263298 struct signal_ucontext * new_sp ;
@@ -266,6 +301,7 @@ void *arch_signal_ucontext_restore(rt_base_t user_sp)
266301 if (lwp_user_accessable (new_sp , sizeof (* new_sp )))
267302 {
268303 lwp_thread_signal_mask (rt_thread_self (), LWP_SIG_MASK_CMD_SET_MASK , & new_sp -> save_sigmask , RT_NULL );
304+ arch_signal_post_action (new_sp );
269305 }
270306 else
271307 {
@@ -320,7 +356,13 @@ void *arch_signal_ucontext_save(int signo, siginfo_t *psiginfo,
320356
321357void arch_syscall_set_errno (void * eframe , int expected , int code )
322358{
323- /* NO support */
359+ struct rt_hw_stack_frame * exp_frame = eframe ;
360+
361+ if (exp_frame -> a0 == - expected )
362+ {
363+ exp_frame -> a0 = - code ;
364+ }
365+
324366 return ;
325367}
326368
0 commit comments