/*===========================================================================* * do_sigreturn * *===========================================================================*/ PUBLIC int do_sigreturn() { /* A user signal handler is done. Restore context and check for * pending unblocked signals. */ int r; mp->mp_sigmask = (sigset_t) sig_set; sigdelset(&mp->mp_sigmask, SIGKILL); r = sys_sigreturn(who, (vir_bytes)sig_context, sig_flags); check_pending(); return(r); }
/*===========================================================================* * do_sigreturn * *===========================================================================*/ PUBLIC int do_sigreturn() { /* A user signal handler is done. Restore context and check for * pending unblocked signals. */ int r; mp->mp_sigmask = (sigset_t) m_in.sig_set; sigdelset(&mp->mp_sigmask, SIGKILL); r = sys_sigreturn(who, (struct sigmsg *) m_in.sig_context); check_pending(mp); return(r); }
/*===========================================================================* * do_sigreturn * *===========================================================================*/ int do_sigreturn(void) { /* A user signal handler is done. Restore context and check for * pending unblocked signals. */ int r; assert(!(mp->mp_flags & (PROC_STOPPED | VFS_CALL | UNPAUSED))); mp->mp_sigmask = m_in.m_lc_pm_sigset.set; sigdelset(&mp->mp_sigmask, SIGKILL); sigdelset(&mp->mp_sigmask, SIGSTOP); r = sys_sigreturn(who_e, (struct sigmsg *)m_in.m_lc_pm_sigset.ctx); check_pending(mp); return(r); }
static int signal_return(struct mm_struct *mm, struct pt_regs *regs, unsigned long address, unsigned long error_code) { u16 instruction; int rc; #ifdef CONFIG_COMPAT int compat; #endif pagefault_disable(); rc = __get_user(instruction, (u16 __user *) regs->psw.addr); pagefault_enable(); if (rc) return -EFAULT; up_read(&mm->mmap_sem); clear_tsk_thread_flag(current, TIF_SINGLE_STEP); #ifdef CONFIG_COMPAT compat = test_tsk_thread_flag(current, TIF_31BIT); if (compat && instruction == 0x0a77) sys32_sigreturn(regs); else if (compat && instruction == 0x0aad) sys32_rt_sigreturn(regs); else #endif if (instruction == 0x0a77) sys_sigreturn(regs); else if (instruction == 0x0aad) sys_rt_sigreturn(regs); else { current->thread.prot_addr = address; current->thread.trap_no = error_code; do_sigsegv(regs, error_code, SEGV_MAPERR, address); } return 0; }
/* Wrappers to put regs in place */ asmlinkage int sys_sigreturn_wrapper(void) { return sys_sigreturn(task_pt_regs(current)); }