@@ -258,14 +258,50 @@ struct signal_ucontext
258258 struct rt_hw_stack_frame frame ;
259259};
260260
261- void * arch_signal_ucontext_restore (rt_base_t user_sp )
261+ void arch_syscall_restart (void * sp , void * ksp );
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 )sys_id ;
270+
271+ if (rc == - ERESTART )
272+ {
273+ LOG_D ("%s(rc=%ld,sys_id=%ld,pid=%d)" , __func__ , rc , sys_id , lwp_self ()-> pid );
274+ LOG_D ("%s: restart rc = %ld" , lwp_get_syscall_name (sys_id ), rc );
275+
276+ /* t0 stores the copy of user's first syscall argument */
277+ exp_frame -> a0 = exp_frame -> t0 ;
278+ /* adjust for epc auto-increment in syscall_handler */
279+ exp_frame -> epc -= 4 ;
280+ /* copy exception frame from user stack to kernel stack */
281+ lwp_memcpy (ksp - sizeof (* eframe ), eframe , sizeof (* eframe ));
282+
283+ arch_syscall_restart (eframe , ksp );
284+ }
285+
286+ return ;
287+ }
288+
289+ static void arch_signal_post_action (struct signal_ucontext * new_sp , rt_base_t kernel_sp )
290+ {
291+ arch_signal_check_erestart (& new_sp -> frame , (void * )kernel_sp );
292+
293+ return ;
294+ }
295+
296+ void * arch_signal_ucontext_restore (rt_base_t user_sp , rt_base_t kernel_sp )
262297{
263298 struct signal_ucontext * new_sp ;
264299 new_sp = (void * )user_sp ;
265300
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 , kernel_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
@@ -354,4 +396,4 @@ int arch_backtrace_uthread(rt_thread_t thread)
354396 return -1 ;
355397 }
356398 return -1 ;
357- }
399+ }
0 commit comments