ia64: add TIF_RESTORE_SIGMASK
PATCH 1/2 ia64: add TIF_RESTORE_SIGMASK
ia32 compat code not tested. :-(
please, point fingers if I broke something. --adobriyan
---------------------------------------
[PATCH] ia64: add TIF_RESTORE_SIGMASK
From: Alexey Kuznetsov <[email protected]>
Signed-off-by Alexey Kuznetsov <[email protected]>
Signed-off-by Alexey Dobriyan <[email protected]>
---
arch/ia64/ia32/ia32_entry.S | 39 ---------------------- arch/ia64/ia32/ia32_signal.c | 59 +++++----------------------------- arch/ia64/kernel/entry.S | 26 --------------- arch/ia64/kernel/process.c | 6 +-- arch/ia64/kernel/sigframe.h | 2 - arch/ia64/kernel/signal.c | 71 +++++++++++++---------------------------- include/asm-ia64/thread_info.h | 4 +- include/asm-ia64/unistd.h | 2 + 8 files changed, 43 insertions(+), 166 deletions(-)
arch/ia64/ia32/ia32_entry.S +1 -38
@@ -52,43 +52,6 @@ ENTRY(ia32_clone) br.ret.sptk.many rp END(ia32_clone) -ENTRY(sys32_rt_sigsuspend) - .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8) - alloc loc1=ar.pfs,8,2,3,0 // preserve all eight input regs - mov loc0=rp - mov out0=in0 // mask - mov out1=in1 // sigsetsize - mov out2=sp // out2 = &sigscratch - .fframe 16 - adds sp=-16,sp // allocate dummy "sigscratch" - ;; - .body - br.call.sptk.many rp=ia32_rt_sigsuspend -1: .restore sp - adds sp,sp - mov rp=loc0 - mov ar.pfs=loc1 - br.ret.sptk.many rp -END(sys32_rt_sigsuspend) - -ENTRY(sys32_sigsuspend) - .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8) - alloc loc1=ar.pfs,8,2,3,0 // preserve all eight input regs - mov loc0=rp - mov out0=in2 // mask (first two args are ignored) - ;; - mov out1=sp // out1 = &sigscratch - .fframe 16 - adds sp=-16,sp // allocate dummy "sigscratch" - .body - br.call.sptk.many rp=ia32_sigsuspend -1: .restore sp - adds sp,sp - mov rp=loc0 - mov ar.pfs=loc1 - br.ret.sptk.many rp -END(sys32_sigsuspend) - GLOBAL_ENTRY(ia32_ret_from_clone) PT_REGS_UNWIND_INFO(0) { /*
@@ -389,7 +352,7 @@ ia32_syscall_table: data8 sys_rt_sigpending data8 compat_sys_rt_sigtimedwait data8 sys32_rt_sigqueueinfo - data8 sys32_rt_sigsuspend + data8 compat_sys_rt_sigsuspend data8 sys32_pread /* 180 */ data8 sys32_pwrite data8 sys_chown /* 16-bit version */
arch/ia64/ia32/ia32_signal.c +10 -49
69 lines not on this page · raw message
arch/ia64/kernel/entry.S +0 -26
@@ -1202,32 +1202,6 @@ (pNonSys) mov out2=0 // out2=0 => no br.ret.sptk.many rp END(notify_resume_user) -GLOBAL_ENTRY(sys_rt_sigsuspend) - .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8) - alloc loc1=ar.pfs,8,2,3,0 // preserve all eight input regs in case of syscall restart! - mov r9=ar.unat - mov loc0=rp // save return address - mov out0=in0 // mask - mov out1=in1 // sigsetsize - adds out2=8,sp // out2=&sigscratch->ar_pfs - ;; - .fframe 16 - .spillsp ar.unat, 16 - st8 [sp]=r9,-16 // allocate space for ar.unat and save it - st8 [out2]=loc1,-8 // save ar.pfs, out2=&sigscratch - .body - br.call.sptk.many rp=ia64_rt_sigsuspend -.ret17: .restore sp - adds sp,sp // pop scratch stack space - ;; - ld8 r9=[sp] // load new unat from sw->caller_unat - mov rp=loc0 - ;; - mov ar.unat=r9 - mov ar.pfs=loc1 - br.ret.sptk.many rp -END(sys_rt_sigsuspend) - ENTRY(sys_rt_sigreturn) PT_REGS_UNWIND_INFO(0) /*
arch/ia64/kernel/process.c +3 -3
@@ -155,7 +155,7 @@ show_regs (struct pt_regs *regs) }void -do_notify_resume_user (sigset_t *oldset,struct sigscratch *scr,long in_syscall) +do_notify_resume_user (sigset_t *unused,struct sigscratch *scr,long in_syscall) {if (fsys_mode (current, &scr->pt)) {/* defer signal-handling etc. until we return to privilege-level 0. */
@@ -170,8 +170,8 @@ #ifdef CONFIG_PERFMON#endif /* deal with pending signal delivery */ -if (test_thread_flag (TIF_SIGPENDING )) -ia64_do_signal (oldset, scr, in_syscall); +if (test_thread_flag (TIF_SIGPENDING )||test_thread_flag (TIF_RESTORE_SIGMASK )) +ia64_do_signal (scr, in_syscall); }static int pal_halt =1 ;
arch/ia64/kernel/sigframe.h +1 -1
@@ -22,4 +22,4 @@ struct sigframe {struct sigcontext sc; }; -extern long ia64_do_signal (sigset_t *,struct sigscratch *,long ); +extern void ia64_do_signal (struct sigscratch *,long );
arch/ia64/kernel/signal.c +23 -48
102 lines not on this page · raw message
include/asm-ia64/thread_info.h +3 -1
@@ -84,6 +84,7 @@ #define TIF_SIGPENDING 1 /* signal pend#define TIF_NEED_RESCHED 2/* rescheduling necessary */ #define TIF_SYSCALL_TRACE 3/* syscall trace active */ #define TIF_SYSCALL_AUDIT 4/* syscall auditing active */ +#define TIF_RESTORE_SIGMASK 5/* restore signal mask in do_signal() */ #define TIF_POLLING_NRFLAG 16/* true if poll_idle() is polling TIF_NEED_RESCHED */ #define TIF_MEMDIE 17#define TIF_MCA_INIT 18/* this task is processing MCA or INIT */
@@ -94,6 +95,7 @@ #define _TIF_SYSCALL_TRACE (1 << TIF_SYS#define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT)#define _TIF_SYSCALL_TRACEAUDIT (_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT)#define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) +#define _TIF_RESTORE_SIGMASK (1 << TIF_RESTORE_SIGMASK)#define _TIF_SIGPENDING (1 << TIF_SIGPENDING)#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED)#define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG)
@@ -102,7 +104,7 @@ #define _TIF_DB_DISABLED (1 << TIF_DB_DI#define _TIF_FREEZE (1 << TIF_FREEZE)/* "work to do on user-return" bits */ -#define TIF_ALLWORK_MASK (_TIF_NOTIFY_RESUME|_TIF_SIGPENDING|_TIF_NEED_RESCHED|_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT) +#define TIF_ALLWORK_MASK (_TIF_NOTIFY_RESUME|_TIF_SIGPENDING|_TIF_NEED_RESCHED|_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_RESTORE_SIGMASK)/* like TIF_ALLWORK_BITS but sans TIF_SYSCALL_TRACE or TIF_SYSCALL_AUDIT */ #define TIF_WORK_MASK (TIF_ALLWORK_MASK&~(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT))
include/asm-ia64/unistd.h +2 -0
@@ -298,6 +298,7 @@ #ifdef __KERNEL__#define NR_syscalls 279/* length of syscall table */ #define __ARCH_WANT_SYS_RT_SIGACTION +#define __ARCH_WANT_SYS_RT_SIGSUSPEND#ifdef CONFIG_IA32_SUPPORT # define __ARCH_WANT_SYS_FADVISE64
@@ -308,6 +309,7 @@ # define __ARCH_WANT_SYS_OLD_GETRLIMIT# define __ARCH_WANT_SYS_OLDUMOUNT# define __ARCH_WANT_SYS_SIGPENDING# define __ARCH_WANT_SYS_SIGPROCMASK +# define __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND# define __ARCH_WANT_COMPAT_SYS_TIME#endif