Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
a610d6e6
K
Kernel
项目概览
openeuler
/
Kernel
12 个月 前同步成功
通知
5
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
Kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
a610d6e6
编写于
5月 21, 2012
作者:
A
Al Viro
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
pull clearing RESTORE_SIGMASK into block_sigmask()
Signed-off-by:
N
Al Viro
<
viro@zeniv.linux.org.uk
>
上级
5754f412
变更
34
隐藏空白更改
内联
并排
Showing
34 changed file
with
130 addition
and
387 deletion
+130
-387
arch/alpha/kernel/signal.c
arch/alpha/kernel/signal.c
+0
-5
arch/arm/kernel/signal.c
arch/arm/kernel/signal.c
+3
-15
arch/avr32/kernel/signal.c
arch/avr32/kernel/signal.c
+4
-7
arch/blackfin/kernel/signal.c
arch/blackfin/kernel/signal.c
+7
-17
arch/c6x/kernel/signal.c
arch/c6x/kernel/signal.c
+6
-17
arch/cris/arch-v10/kernel/signal.c
arch/cris/arch-v10/kernel/signal.c
+2
-12
arch/cris/arch-v32/kernel/signal.c
arch/cris/arch-v32/kernel/signal.c
+2
-13
arch/frv/kernel/signal.c
arch/frv/kernel/signal.c
+7
-17
arch/h8300/kernel/signal.c
arch/h8300/kernel/signal.c
+1
-3
arch/hexagon/kernel/signal.c
arch/hexagon/kernel/signal.c
+6
-20
arch/ia64/kernel/signal.c
arch/ia64/kernel/signal.c
+1
-9
arch/m32r/kernel/signal.c
arch/m32r/kernel/signal.c
+3
-5
arch/m68k/kernel/signal.c
arch/m68k/kernel/signal.c
+0
-2
arch/microblaze/kernel/signal.c
arch/microblaze/kernel/signal.c
+3
-14
arch/mips/kernel/signal.c
arch/mips/kernel/signal.c
+3
-15
arch/mn10300/kernel/signal.c
arch/mn10300/kernel/signal.c
+5
-13
arch/openrisc/kernel/signal.c
arch/openrisc/kernel/signal.c
+0
-2
arch/parisc/kernel/signal.c
arch/parisc/kernel/signal.c
+4
-6
arch/powerpc/kernel/signal.c
arch/powerpc/kernel/signal.c
+0
-7
arch/s390/kernel/compat_signal.c
arch/s390/kernel/compat_signal.c
+7
-3
arch/s390/kernel/entry.h
arch/s390/kernel/entry.h
+1
-1
arch/s390/kernel/signal.c
arch/s390/kernel/signal.c
+11
-21
arch/score/kernel/signal.c
arch/score/kernel/signal.c
+5
-19
arch/sh/kernel/signal_32.c
arch/sh/kernel/signal_32.c
+7
-19
arch/sh/kernel/signal_64.c
arch/sh/kernel/signal_64.c
+8
-16
arch/sparc/kernel/signal32.c
arch/sparc/kernel/signal32.c
+3
-12
arch/sparc/kernel/signal_32.c
arch/sparc/kernel/signal_32.c
+3
-13
arch/sparc/kernel/signal_64.c
arch/sparc/kernel/signal_64.c
+3
-12
arch/tile/kernel/signal.c
arch/tile/kernel/signal.c
+5
-20
arch/um/kernel/signal.c
arch/um/kernel/signal.c
+2
-14
arch/unicore32/kernel/signal.c
arch/unicore32/kernel/signal.c
+3
-15
arch/x86/kernel/signal.c
arch/x86/kernel/signal.c
+9
-22
arch/xtensa/kernel/signal.c
arch/xtensa/kernel/signal.c
+0
-1
kernel/signal.c
kernel/signal.c
+6
-0
未找到文件。
arch/alpha/kernel/signal.c
浏览文件 @
a610d6e6
...
...
@@ -481,11 +481,6 @@ handle_signal(int sig, struct k_sigaction *ka, siginfo_t *info,
return
;
}
block_sigmask
(
ka
,
sig
);
/* A signal was successfully delivered, and the
saved sigmask was stored on the signal frame,
and will be restored by sigreturn. So we can
simply clear the restore sigmask flag. */
clear_thread_flag
(
TIF_RESTORE_SIGMASK
);
}
static
inline
void
...
...
arch/arm/kernel/signal.c
浏览文件 @
a610d6e6
...
...
@@ -528,7 +528,7 @@ setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info,
/*
* OK, we're invoking a handler
*/
static
int
static
void
handle_signal
(
unsigned
long
sig
,
struct
k_sigaction
*
ka
,
siginfo_t
*
info
,
struct
pt_regs
*
regs
)
{
...
...
@@ -559,17 +559,14 @@ handle_signal(unsigned long sig, struct k_sigaction *ka,
if
(
ret
!=
0
)
{
force_sigsegv
(
sig
,
tsk
);
return
ret
;
return
;
}
/*
* Block the signal if we were successful.
*/
block_sigmask
(
ka
,
sig
);
tracehook_signal_handler
(
sig
,
info
,
ka
,
regs
,
0
);
return
0
;
}
/*
...
...
@@ -633,16 +630,7 @@ static void do_signal(struct pt_regs *regs, int syscall)
clear_thread_flag
(
TIF_SYSCALL_RESTARTSYS
);
}
if
(
handle_signal
(
signr
,
&
ka
,
&
info
,
regs
)
==
0
)
{
/*
* A signal was successfully delivered; the saved
* sigmask will have been stored in the signal frame,
* and will be restored by sigreturn, so we can simply
* clear the TIF_RESTORE_SIGMASK flag.
*/
if
(
test_thread_flag
(
TIF_RESTORE_SIGMASK
))
clear_thread_flag
(
TIF_RESTORE_SIGMASK
);
}
handle_signal
(
signr
,
&
ka
,
&
info
,
regs
);
return
;
}
...
...
arch/avr32/kernel/signal.c
浏览文件 @
a610d6e6
...
...
@@ -238,16 +238,13 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info,
*/
ret
|=
!
valid_user_regs
(
regs
);
if
(
ret
!=
0
)
{
force_sigsegv
(
sig
,
current
);
return
;
}
/*
* Block the signal if we were successful.
*/
block_sigmask
(
ka
,
sig
);
clear_thread_flag
(
TIF_RESTORE_SIGMASK
);
if
(
ret
!=
0
)
force_sigsegv
(
sig
,
current
);
else
block_sigmask
(
ka
,
sig
);
}
/*
...
...
arch/blackfin/kernel/signal.c
浏览文件 @
a610d6e6
...
...
@@ -247,7 +247,7 @@ handle_restart(struct pt_regs *regs, struct k_sigaction *ka, int has_handler)
/*
* OK, we're invoking a handler
*/
static
int
static
void
handle_signal
(
int
sig
,
siginfo_t
*
info
,
struct
k_sigaction
*
ka
,
struct
pt_regs
*
regs
)
{
...
...
@@ -260,11 +260,12 @@ handle_signal(int sig, siginfo_t *info, struct k_sigaction *ka,
/* set up the stack frame */
ret
=
setup_rt_frame
(
sig
,
ka
,
info
,
sigmask_to_save
(),
regs
);
if
(
ret
)
return
;
if
(
ret
==
0
)
block_sigmask
(
ka
,
sig
);
return
ret
;
block_sigmask
(
ka
,
sig
);
tracehook_signal_handler
(
sig
,
info
,
ka
,
regs
,
test_thread_flag
(
TIF_SINGLESTEP
));
}
/*
...
...
@@ -290,18 +291,7 @@ asmlinkage void do_signal(struct pt_regs *regs)
signr
=
get_signal_to_deliver
(
&
info
,
&
ka
,
regs
,
NULL
);
if
(
signr
>
0
)
{
/* Whee! Actually deliver the signal. */
if
(
handle_signal
(
signr
,
&
info
,
&
ka
,
regs
)
==
0
)
{
/* a signal was successfully delivered; the saved
* sigmask will have been stored in the signal frame,
* and will be restored by sigreturn, so we can simply
* clear the TIF_RESTORE_SIGMASK flag */
if
(
test_thread_flag
(
TIF_RESTORE_SIGMASK
))
clear_thread_flag
(
TIF_RESTORE_SIGMASK
);
tracehook_signal_handler
(
signr
,
&
info
,
&
ka
,
regs
,
test_thread_flag
(
TIF_SINGLESTEP
));
}
handle_signal
(
signr
,
&
info
,
&
ka
,
regs
);
return
;
}
...
...
arch/c6x/kernel/signal.c
浏览文件 @
a610d6e6
...
...
@@ -248,7 +248,7 @@ handle_restart(struct pt_regs *regs, struct k_sigaction *ka, int has_handler)
/*
* handle the actual delivery of a signal to userspace
*/
static
int
handle_signal
(
int
sig
,
static
void
handle_signal
(
int
sig
,
siginfo_t
*
info
,
struct
k_sigaction
*
ka
,
struct
pt_regs
*
regs
,
int
syscall
)
{
...
...
@@ -277,11 +277,10 @@ static int handle_signal(int sig,
}
/* Set up the stack frame */
ret
=
setup_rt_frame
(
sig
,
ka
,
info
,
sigmask_to_save
(),
regs
);
if
(
ret
==
0
)
block_sigmask
(
ka
,
sig
);
return
ret
;
if
(
setup_rt_frame
(
sig
,
ka
,
info
,
sigmask_to_save
(),
regs
)
<
0
)
return
;
block_sigmask
(
ka
,
sig
);
tracehook_signal_handler
(
sig
,
info
,
ka
,
regs
,
0
);
}
/*
...
...
@@ -300,17 +299,7 @@ static void do_signal(struct pt_regs *regs, int syscall)
signr
=
get_signal_to_deliver
(
&
info
,
&
ka
,
regs
,
NULL
);
if
(
signr
>
0
)
{
if
(
handle_signal
(
signr
,
&
info
,
&
ka
,
regs
,
syscall
)
==
0
)
{
/* a signal was successfully delivered; the saved
* sigmask will have been stored in the signal frame,
* and will be restored by sigreturn, so we can simply
* clear the TIF_RESTORE_SIGMASK flag */
if
(
test_thread_flag
(
TIF_RESTORE_SIGMASK
))
clear_thread_flag
(
TIF_RESTORE_SIGMASK
);
tracehook_signal_handler
(
signr
,
&
info
,
&
ka
,
regs
,
0
);
}
handle_signal
(
signr
,
&
info
,
&
ka
,
regs
,
syscall
);
return
;
}
...
...
arch/cris/arch-v10/kernel/signal.c
浏览文件 @
a610d6e6
...
...
@@ -415,7 +415,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
* OK, we're invoking a handler
*/
static
inline
int
handle_signal
(
int
canrestart
,
unsigned
long
sig
,
static
inline
void
handle_signal
(
int
canrestart
,
unsigned
long
sig
,
siginfo_t
*
info
,
struct
k_sigaction
*
ka
,
struct
pt_regs
*
regs
)
{
...
...
@@ -458,8 +458,6 @@ static inline int handle_signal(int canrestart, unsigned long sig,
if
(
ret
==
0
)
block_sigmask
(
ka
,
sig
);
return
ret
;
}
/*
...
...
@@ -492,15 +490,7 @@ void do_signal(int canrestart, struct pt_regs *regs)
signr
=
get_signal_to_deliver
(
&
info
,
&
ka
,
regs
,
NULL
);
if
(
signr
>
0
)
{
/* Whee! Actually deliver the signal. */
if
(
handle_signal
(
canrestart
,
signr
,
&
info
,
&
ka
,
regs
))
{
/* a signal was successfully delivered; the saved
* sigmask will have been stored in the signal frame,
* and will be restored by sigreturn, so we can simply
* clear the TIF_RESTORE_SIGMASK flag */
if
(
test_thread_flag
(
TIF_RESTORE_SIGMASK
))
clear_thread_flag
(
TIF_RESTORE_SIGMASK
);
}
handle_signal
(
canrestart
,
signr
,
&
info
,
&
ka
,
regs
);
return
;
}
...
...
arch/cris/arch-v32/kernel/signal.c
浏览文件 @
a610d6e6
...
...
@@ -434,7 +434,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
}
/* Invoke a signal handler to, well, handle the signal. */
static
inline
int
static
inline
void
handle_signal
(
int
canrestart
,
unsigned
long
sig
,
siginfo_t
*
info
,
struct
k_sigaction
*
ka
,
struct
pt_regs
*
regs
)
...
...
@@ -491,8 +491,6 @@ handle_signal(int canrestart, unsigned long sig,
if
(
ret
==
0
)
block_sigmask
(
ka
,
sig
);
return
ret
;
}
/*
...
...
@@ -525,16 +523,7 @@ do_signal(int canrestart, struct pt_regs *regs)
if
(
signr
>
0
)
{
/* Whee! Actually deliver the signal. */
if
(
handle_signal
(
canrestart
,
signr
,
&
info
,
&
ka
,
regs
))
{
/* a signal was successfully delivered; the saved
* sigmask will have been stored in the signal frame,
* and will be restored by sigreturn, so we can simply
* clear the TIF_RESTORE_SIGMASK flag */
if
(
test_thread_flag
(
TIF_RESTORE_SIGMASK
))
clear_thread_flag
(
TIF_RESTORE_SIGMASK
);
}
handle_signal
(
canrestart
,
signr
,
&
info
,
&
ka
,
regs
);
return
;
}
...
...
arch/frv/kernel/signal.c
浏览文件 @
a610d6e6
...
...
@@ -426,7 +426,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
/*
* OK, we're invoking a handler
*/
static
int
handle_signal
(
unsigned
long
sig
,
siginfo_t
*
info
,
static
void
handle_signal
(
unsigned
long
sig
,
siginfo_t
*
info
,
struct
k_sigaction
*
ka
)
{
sigset_t
*
oldset
=
sigmask_to_save
();
...
...
@@ -461,11 +461,12 @@ static int handle_signal(unsigned long sig, siginfo_t *info,
else
ret
=
setup_frame
(
sig
,
ka
,
oldset
);
if
(
ret
==
0
)
block_sigmask
(
ka
,
sig
);
return
ret
;
if
(
ret
)
return
;
block_sigmask
(
ka
,
sig
);
tracehook_signal_handler
(
sig
,
info
,
ka
,
__frame
,
test_thread_flag
(
TIF_SINGLESTEP
));
}
/* end handle_signal() */
/*****************************************************************************/
...
...
@@ -495,18 +496,7 @@ static void do_signal(void)
signr
=
get_signal_to_deliver
(
&
info
,
&
ka
,
__frame
,
NULL
);
if
(
signr
>
0
)
{
if
(
handle_signal
(
signr
,
&
info
,
&
ka
)
==
0
)
{
/* a signal was successfully delivered; the saved
* sigmask will have been stored in the signal frame,
* and will be restored by sigreturn, so we can simply
* clear the TIF_RESTORE_SIGMASK flag */
if
(
test_thread_flag
(
TIF_RESTORE_SIGMASK
))
clear_thread_flag
(
TIF_RESTORE_SIGMASK
);
tracehook_signal_handler
(
signr
,
&
info
,
&
ka
,
__frame
,
test_thread_flag
(
TIF_SINGLESTEP
));
}
handle_signal
(
signr
,
&
info
,
&
ka
);
return
;
}
...
...
arch/h8300/kernel/signal.c
浏览文件 @
a610d6e6
...
...
@@ -442,10 +442,8 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
else
ret
=
setup_frame
(
sig
,
ka
,
oldset
,
regs
);
if
(
!
ret
)
{
if
(
!
ret
)
block_sigmask
(
ka
,
sig
);
clear_thread_flag
(
TIF_RESTORE_SIGMASK
);
}
}
/*
...
...
arch/hexagon/kernel/signal.c
浏览文件 @
a610d6e6
...
...
@@ -149,11 +149,9 @@ static int setup_rt_frame(int signr, struct k_sigaction *ka, siginfo_t *info,
/*
* Setup invocation of signal handler
*/
static
int
handle_signal
(
int
sig
,
siginfo_t
*
info
,
struct
k_sigaction
*
ka
,
static
void
handle_signal
(
int
sig
,
siginfo_t
*
info
,
struct
k_sigaction
*
ka
,
struct
pt_regs
*
regs
)
{
int
rc
;
/*
* If we're handling a signal that aborted a system call,
* set up the error return value before adding the signal
...
...
@@ -186,15 +184,13 @@ static int handle_signal(int sig, siginfo_t *info, struct k_sigaction *ka,
* Set up the stack frame; not doing the SA_SIGINFO thing. We
* only set up the rt_frame flavor.
*/
rc
=
setup_rt_frame
(
sig
,
ka
,
info
,
sigmask_to_save
(),
regs
);
/* If there was an error on setup, no signal was delivered. */
if
(
rc
)
return
rc
;
if
(
setup_rt_frame
(
sig
,
ka
,
info
,
sigmask_to_save
(),
regs
)
<
0
)
return
;
block_sigmask
(
ka
,
sig
);
return
0
;
tracehook_signal_handler
(
sig
,
info
,
ka
,
regs
,
test_thread_flag
(
TIF_SINGLESTEP
))
;
}
/*
...
...
@@ -215,17 +211,7 @@ static void do_signal(struct pt_regs *regs)
signo
=
get_signal_to_deliver
(
&
info
,
&
sigact
,
regs
,
NULL
);
if
(
signo
>
0
)
{
if
(
handle_signal
(
signo
,
&
info
,
&
sigact
,
regs
)
==
0
)
{
/*
* Successful delivery case. The saved sigmask is
* stored in the signal frame, and will be restored
* by sigreturn. We can clear the TIF flag.
*/
clear_thread_flag
(
TIF_RESTORE_SIGMASK
);
tracehook_signal_handler
(
signo
,
&
info
,
&
sigact
,
regs
,
test_thread_flag
(
TIF_SINGLESTEP
));
}
handle_signal
(
signo
,
&
info
,
&
sigact
,
regs
);
return
;
}
...
...
arch/ia64/kernel/signal.c
浏览文件 @
a610d6e6
...
...
@@ -501,16 +501,8 @@ ia64_do_signal (struct sigscratch *scr, long in_syscall)
* Whee! Actually deliver the signal. If the delivery failed, we need to
* continue to iterate in this loop so we can deliver the SIGSEGV...
*/
if
(
handle_signal
(
signr
,
&
ka
,
&
info
,
scr
))
{
/*
* A signal was successfully delivered; the saved
* sigmask will have been stored in the signal frame,
* and will be restored by sigreturn, so we can simply
* clear the TS_RESTORE_SIGMASK flag.
*/
current_thread_info
()
->
status
&=
~
TS_RESTORE_SIGMASK
;
if
(
handle_signal
(
signr
,
&
ka
,
&
info
,
scr
))
return
;
}
}
/* Did we come from a system call? */
...
...
arch/m32r/kernel/signal.c
浏览文件 @
a610d6e6
...
...
@@ -267,7 +267,7 @@ static int prev_insn(struct pt_regs *regs)
* OK, we're invoking a handler
*/
static
int
static
void
handle_signal
(
unsigned
long
sig
,
struct
k_sigaction
*
ka
,
siginfo_t
*
info
,
struct
pt_regs
*
regs
)
{
...
...
@@ -295,10 +295,9 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info,
/* Set up the stack frame */
if
(
setup_rt_frame
(
sig
,
ka
,
info
,
sigmask_to_save
(),
regs
))
return
-
EFAULT
;
return
;
block_sigmask
(
ka
,
sig
);
return
0
;
}
/*
...
...
@@ -333,8 +332,7 @@ static void do_signal(struct pt_regs *regs)
*/
/* Whee! Actually deliver the signal. */
if
(
handle_signal
(
signr
,
&
ka
,
&
info
,
regs
)
==
0
)
clear_thread_flag
(
TIF_RESTORE_SIGMASK
);
handle_signal
(
signr
,
&
ka
,
&
info
,
regs
);
return
;
}
...
...
arch/m68k/kernel/signal.c
浏览文件 @
a610d6e6
...
...
@@ -1147,8 +1147,6 @@ handle_signal(int sig, struct k_sigaction *ka, siginfo_t *info,
regs
->
sr
&=
~
0x8000
;
send_sig
(
SIGTRAP
,
current
,
1
);
}
clear_thread_flag
(
TIF_RESTORE_SIGMASK
);
}
/*
...
...
arch/microblaze/kernel/signal.c
浏览文件 @
a610d6e6
...
...
@@ -310,7 +310,7 @@ handle_restart(struct pt_regs *regs, struct k_sigaction *ka, int has_handler)
* OK, we're invoking a handler
*/
static
int
static
void
handle_signal
(
unsigned
long
sig
,
struct
k_sigaction
*
ka
,
siginfo_t
*
info
,
struct
pt_regs
*
regs
)
{
...
...
@@ -324,11 +324,9 @@ handle_signal(unsigned long sig, struct k_sigaction *ka,
ret
=
setup_rt_frame
(
sig
,
ka
,
NULL
,
oldset
,
regs
);
if
(
ret
)
return
ret
;
return
;
block_sigmask
(
ka
,
sig
);
return
0
;
}
/*
...
...
@@ -356,16 +354,7 @@ static void do_signal(struct pt_regs *regs, int in_syscall)
/* Whee! Actually deliver the signal. */
if
(
in_syscall
)
handle_restart
(
regs
,
&
ka
,
1
);
if
(
!
handle_signal
(
signr
,
&
ka
,
&
info
,
oldset
,
regs
))
{
/*
* A signal was successfully delivered; the saved
* sigmask will have been stored in the signal frame,
* and will be restored by sigreturn, so we can simply
* clear the TS_RESTORE_SIGMASK flag.
*/
current_thread_info
()
->
status
&=
~
TS_RESTORE_SIGMASK
;
}
handle_signal
(
signr
,
&
ka
,
&
info
,
regs
);
return
;
}
...
...
arch/mips/kernel/signal.c
浏览文件 @
a610d6e6
...
...
@@ -514,7 +514,7 @@ struct mips_abi mips_abi = {
.
restart
=
__NR_restart_syscall
};
static
int
handle_signal
(
unsigned
long
sig
,
siginfo_t
*
info
,
static
void
handle_signal
(
unsigned
long
sig
,
siginfo_t
*
info
,
struct
k_sigaction
*
ka
,
struct
pt_regs
*
regs
)
{
sigset_t
*
oldset
=
sigmask_to_save
();
...
...
@@ -551,11 +551,9 @@ static int handle_signal(unsigned long sig, siginfo_t *info,
ka
,
regs
,
sig
,
oldset
);
if
(
ret
)
return
ret
;
return
;
block_sigmask
(
ka
,
sig
);
return
ret
;
}
static
void
do_signal
(
struct
pt_regs
*
regs
)
...
...
@@ -575,17 +573,7 @@ static void do_signal(struct pt_regs *regs)
signr
=
get_signal_to_deliver
(
&
info
,
&
ka
,
regs
,
NULL
);
if
(
signr
>
0
)
{
/* Whee! Actually deliver the signal. */
if
(
handle_signal
(
signr
,
&
info
,
&
ka
,
regs
)
==
0
)
{
/*
* A signal was successfully delivered; the saved
* sigmask will have been stored in the signal frame,
* and will be restored by sigreturn, so we can simply
* clear the TIF_RESTORE_SIGMASK flag.
*/
if
(
test_thread_flag
(
TIF_RESTORE_SIGMASK
))
clear_thread_flag
(
TIF_RESTORE_SIGMASK
);
}
handle_signal
(
signr
,
&
info
,
&
ka
,
regs
);
return
;
}
...
...
arch/mn10300/kernel/signal.c
浏览文件 @
a610d6e6
...
...
@@ -462,11 +462,12 @@ static int handle_signal(int sig,
ret
=
setup_rt_frame
(
sig
,
ka
,
info
,
oldset
,
regs
);
else
ret
=
setup_frame
(
sig
,
ka
,
oldset
,
regs
);
if
(
ret
)
return
;
if
(
ret
==
0
)
block_sigmask
(
ka
,
sig
);
return
ret
;
block_sigmask
(
ka
,
sig
);
tracehook_signal_handler
(
sig
,
info
,
ka
,
regs
,
test_thread_flag
(
TIF_SINGLESTEP
));
}
/*
...
...
@@ -486,15 +487,6 @@ static void do_signal(struct pt_regs *regs)
signr
=
get_signal_to_deliver
(
&
info
,
&
ka
,
regs
,
NULL
);
if
(
signr
>
0
)
{
if
(
handle_signal
(
signr
,
&
info
,
&
ka
,
regs
)
==
0
)
{
/* a signal was successfully delivered; the saved
* sigmask will have been stored in the signal frame,
* and will be restored by sigreturn, so we can simply
* clear the TIF_RESTORE_SIGMASK flag */
if
(
test_thread_flag
(
TIF_RESTORE_SIGMASK
))
clear_thread_flag
(
TIF_RESTORE_SIGMASK
);
tracehook_signal_handler
(
signr
,
&
info
,
&
ka
,
regs
,
test_thread_flag
(
TIF_SINGLESTEP
));
}
return
;
...
...
arch/openrisc/kernel/signal.c
浏览文件 @
a610d6e6
...
...
@@ -263,8 +263,6 @@ handle_signal(unsigned long sig,
return
;
block_sigmask
(
ka
,
sig
);
clear_thread_flag
(
TIF_RESTORE_SIGMASK
);
tracehook_signal_handler
(
sig
,
info
,
ka
,
regs
,
test_thread_flag
(
TIF_SINGLESTEP
));
}
...
...
arch/parisc/kernel/signal.c
浏览文件 @
a610d6e6
...
...
@@ -459,6 +459,9 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
test_thread_flag
(
TIF_SINGLESTEP
)
||
test_thread_flag
(
TIF_BLOCKSTEP
));
DBG
(
1
,
KERN_DEBUG
"do_signal: Exit (success), regs->gr[28] = %ld
\n
"
,
regs
->
gr
[
28
]);
return
1
;
}
...
...
@@ -593,13 +596,8 @@ do_signal(struct pt_regs *regs, long in_syscall)
/* Whee! Actually deliver the signal. If the
delivery failed, we need to continue to iterate in
this loop so we can deliver the SIGSEGV... */
if
(
handle_signal
(
signr
,
&
info
,
&
ka
,
regs
,
in_syscall
))
{
DBG
(
1
,
KERN_DEBUG
"do_signal: Exit (success), regs->gr[28] = %ld
\n
"
,
regs
->
gr
[
28
]);
if
(
test_thread_flag
(
TIF_RESTORE_SIGMASK
))
clear_thread_flag
(
TIF_RESTORE_SIGMASK
);
if
(
handle_signal
(
signr
,
&
info
,
&
ka
,
regs
,
in_syscall
))
return
;
}
}
/* end of while(1) looping forever if we can't force a signal */
...
...
arch/powerpc/kernel/signal.c
浏览文件 @
a610d6e6
...
...
@@ -159,13 +159,6 @@ static int do_signal(struct pt_regs *regs)
regs
->
trap
=
0
;
if
(
ret
)
{
block_sigmask
(
&
ka
,
signr
);
/*
* A signal was successfully delivered; the saved sigmask is in
* its frame, and we can clear the TLF_RESTORE_SIGMASK flag.
*/
current_thread_info
()
->
local_flags
&=
~
_TLF_RESTORE_SIGMASK
;
/*
* Let tracing know that we've done the handler setup.
*/
...
...
arch/s390/kernel/compat_signal.c
浏览文件 @
a610d6e6
...
...
@@ -572,7 +572,7 @@ static int setup_rt_frame32(int sig, struct k_sigaction *ka, siginfo_t *info,
* OK, we're invoking a handler
*/
int
handle_signal32
(
unsigned
long
sig
,
struct
k_sigaction
*
ka
,
void
handle_signal32
(
unsigned
long
sig
,
struct
k_sigaction
*
ka
,
siginfo_t
*
info
,
sigset_t
*
oldset
,
struct
pt_regs
*
regs
)
{
int
ret
;
...
...
@@ -583,8 +583,12 @@ int handle_signal32(unsigned long sig, struct k_sigaction *ka,
else
ret
=
setup_frame32
(
sig
,
ka
,
oldset
,
regs
);
if
(
ret
)
return
ret
;
return
;
block_sigmask
(
ka
,
sig
);
return
0
;
/*
* Let tracing know that we've done the handler setup.
*/
tracehook_signal_handler
(
sig
,
info
,
ka
,
regs
,
test_thread_flag
(
TIF_SINGLE_STEP
));
}
arch/s390/kernel/entry.h
浏览文件 @
a610d6e6
...
...
@@ -31,7 +31,7 @@ void do_per_trap(struct pt_regs *regs);
void
syscall_trace
(
struct
pt_regs
*
regs
,
int
entryexit
);
void
kernel_stack_overflow
(
struct
pt_regs
*
regs
);
void
do_signal
(
struct
pt_regs
*
regs
);
int
handle_signal32
(
unsigned
long
sig
,
struct
k_sigaction
*
ka
,
void
handle_signal32
(
unsigned
long
sig
,
struct
k_sigaction
*
ka
,
siginfo_t
*
info
,
sigset_t
*
oldset
,
struct
pt_regs
*
regs
);
void
do_notify_resume
(
struct
pt_regs
*
regs
);
...
...
arch/s390/kernel/signal.c
浏览文件 @
a610d6e6
...
...
@@ -367,7 +367,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
return
-
EFAULT
;
}
static
int
handle_signal
(
unsigned
long
sig
,
struct
k_sigaction
*
ka
,
static
void
handle_signal
(
unsigned
long
sig
,
struct
k_sigaction
*
ka
,
siginfo_t
*
info
,
sigset_t
*
oldset
,
struct
pt_regs
*
regs
)
{
...
...
@@ -379,9 +379,13 @@ static int handle_signal(unsigned long sig, struct k_sigaction *ka,
else
ret
=
setup_frame
(
sig
,
ka
,
oldset
,
regs
);
if
(
ret
)
return
ret
;
return
;
block_sigmask
(
ka
,
sig
);
return
0
;
/*
* Let tracing know that we've done the handler setup.
*/
tracehook_signal_handler
(
sig
,
info
,
ka
,
regs
,
test_thread_flag
(
TIF_SINGLE_STEP
));
}
/*
...
...
@@ -436,24 +440,10 @@ void do_signal(struct pt_regs *regs)
/* No longer in a system call */
clear_thread_flag
(
TIF_SYSCALL
);
if
((
is_compat_task
()
?
handle_signal32
(
signr
,
&
ka
,
&
info
,
oldset
,
regs
)
:
handle_signal
(
signr
,
&
ka
,
&
info
,
oldset
,
regs
))
==
0
)
{
/*
* A signal was successfully delivered; the saved
* sigmask will have been stored in the signal frame,
* and will be restored by sigreturn, so we can simply
* clear the TIF_RESTORE_SIGMASK flag.
*/
if
(
test_thread_flag
(
TIF_RESTORE_SIGMASK
))
clear_thread_flag
(
TIF_RESTORE_SIGMASK
);
/*
* Let tracing know that we've done the handler setup.
*/
tracehook_signal_handler
(
signr
,
&
info
,
&
ka
,
regs
,
test_thread_flag
(
TIF_SINGLE_STEP
));
}
if
(
is_compat_task
())
handle_signal32
(
signr
,
&
ka
,
&
info
,
oldset
,
regs
);
else
handle_signal
(
signr
,
&
ka
,
&
info
,
oldset
,
regs
);
return
;
}
...
...
arch/score/kernel/signal.c
浏览文件 @
a610d6e6
...
...
@@ -241,11 +241,9 @@ static int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
return
-
EFAULT
;
}
static
int
handle_signal
(
unsigned
long
sig
,
siginfo_t
*
info
,
static
void
handle_signal
(
unsigned
long
sig
,
siginfo_t
*
info
,
struct
k_sigaction
*
ka
,
struct
pt_regs
*
regs
)
{
int
ret
;
if
(
regs
->
is_syscall
)
{
switch
(
regs
->
regs
[
4
])
{
case
ERESTART_RESTARTBLOCK
:
...
...
@@ -269,12 +267,10 @@ static int handle_signal(unsigned long sig, siginfo_t *info,
/*
* Set up the stack frame
*/
ret
=
setup_rt_frame
(
ka
,
regs
,
sig
,
sigmask_to_save
(),
info
);
if
(
ret
==
0
)
block_sigmask
(
ka
,
sig
);
if
(
setup_rt_frame
(
ka
,
regs
,
sig
,
sigmask_to_save
(),
info
)
<
0
)
return
;
return
ret
;
block_sigmask
(
ka
,
sig
)
;
}
static
void
do_signal
(
struct
pt_regs
*
regs
)
...
...
@@ -294,17 +290,7 @@ static void do_signal(struct pt_regs *regs)
signr
=
get_signal_to_deliver
(
&
info
,
&
ka
,
regs
,
NULL
);
if
(
signr
>
0
)
{
/* Actually deliver the signal. */
if
(
handle_signal
(
signr
,
&
info
,
&
ka
,
regs
)
==
0
)
{
/*
* A signal was successfully delivered; the saved
* sigmask will have been stored in the signal frame,
* and will be restored by sigreturn, so we can simply
* clear the TIF_RESTORE_SIGMASK flag.
*/
if
(
test_thread_flag
(
TIF_RESTORE_SIGMASK
))
clear_thread_flag
(
TIF_RESTORE_SIGMASK
);
}
handle_signal
(
signr
,
&
info
,
&
ka
,
regs
);
return
;
}
...
...
arch/sh/kernel/signal_32.c
浏览文件 @
a610d6e6
...
...
@@ -522,7 +522,7 @@ handle_syscall_restart(unsigned long save_r0, struct pt_regs *regs,
/*
* OK, we're invoking a handler
*/
static
int
static
void
handle_signal
(
unsigned
long
sig
,
struct
k_sigaction
*
ka
,
siginfo_t
*
info
,
struct
pt_regs
*
regs
,
unsigned
int
save_r0
)
{
...
...
@@ -535,10 +535,11 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info,
else
ret
=
setup_frame
(
sig
,
ka
,
oldset
,
regs
);
if
(
ret
==
0
)
block_sigmask
(
ka
,
sig
);
return
ret
;
if
(
ret
)
return
;
block_sigmask
(
ka
,
sig
);
tracehook_signal_handler
(
sig
,
info
,
ka
,
regs
,
test_thread_flag
(
TIF_SINGLESTEP
));
}
/*
...
...
@@ -570,20 +571,7 @@ static void do_signal(struct pt_regs *regs, unsigned int save_r0)
handle_syscall_restart
(
save_r0
,
regs
,
&
ka
.
sa
);
/* Whee! Actually deliver the signal. */
if
(
handle_signal
(
signr
,
&
ka
,
&
info
,
regs
,
save_r0
)
==
0
)
{
/*
* A signal was successfully delivered; the saved
* sigmask will have been stored in the signal frame,
* and will be restored by sigreturn, so we can simply
* clear the TS_RESTORE_SIGMASK flag
*/
current_thread_info
()
->
status
&=
~
TS_RESTORE_SIGMASK
;
tracehook_signal_handler
(
signr
,
&
info
,
&
ka
,
regs
,
test_thread_flag
(
TIF_SINGLESTEP
));
}
handle_signal
(
signr
,
&
ka
,
&
info
,
regs
,
save_r0
);
return
;
}
...
...
arch/sh/kernel/signal_64.c
浏览文件 @
a610d6e6
...
...
@@ -43,7 +43,7 @@
#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
static
int
static
void
handle_signal
(
unsigned
long
sig
,
siginfo_t
*
info
,
struct
k_sigaction
*
ka
,
struct
pt_regs
*
regs
);
...
...
@@ -103,17 +103,7 @@ static void do_signal(struct pt_regs *regs)
handle_syscall_restart
(
regs
,
&
ka
.
sa
);
/* Whee! Actually deliver the signal. */
if
(
handle_signal
(
signr
,
&
info
,
&
ka
,
regs
)
==
0
)
{
/*
* If a signal was successfully delivered, the
* saved sigmask is in its frame, and we can
* clear the TS_RESTORE_SIGMASK flag.
*/
current_thread_info
()
->
status
&=
~
TS_RESTORE_SIGMASK
;
tracehook_signal_handler
(
signr
,
&
info
,
&
ka
,
regs
,
test_thread_flag
(
TIF_SINGLESTEP
));
}
handle_signal
(
signr
,
&
info
,
&
ka
,
regs
);
return
;
}
...
...
@@ -648,7 +638,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
/*
* OK, we're invoking a handler
*/
static
int
static
void
handle_signal
(
unsigned
long
sig
,
siginfo_t
*
info
,
struct
k_sigaction
*
ka
,
struct
pt_regs
*
regs
)
{
...
...
@@ -661,10 +651,12 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
else
ret
=
setup_frame
(
sig
,
ka
,
oldset
,
regs
);
if
(
ret
==
0
)
block_sigmask
(
ka
,
sig
)
;
if
(
ret
)
return
;
return
ret
;
block_sigmask
(
ka
,
sig
);
tracehook_signal_handler
(
sig
,
info
,
ka
,
regs
,
test_thread_flag
(
TIF_SINGLESTEP
));
}
asmlinkage
void
do_notify_resume
(
struct
pt_regs
*
regs
,
unsigned
long
thread_info_flags
)
...
...
arch/sparc/kernel/signal32.c
浏览文件 @
a610d6e6
...
...
@@ -775,7 +775,7 @@ static int setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs,
return
-
EFAULT
;
}
static
inline
int
handle_signal32
(
unsigned
long
signr
,
struct
k_sigaction
*
ka
,
static
inline
void
handle_signal32
(
unsigned
long
signr
,
struct
k_sigaction
*
ka
,
siginfo_t
*
info
,
sigset_t
*
oldset
,
struct
pt_regs
*
regs
)
{
...
...
@@ -787,12 +787,10 @@ static inline int handle_signal32(unsigned long signr, struct k_sigaction *ka,
err
=
setup_frame32
(
ka
,
regs
,
signr
,
oldset
);
if
(
err
)
return
err
;
return
;
block_sigmask
(
ka
,
signr
);
tracehook_signal_handler
(
signr
,
info
,
ka
,
regs
,
0
);
return
0
;
}
static
inline
void
syscall_restart32
(
unsigned
long
orig_i0
,
struct
pt_regs
*
regs
,
...
...
@@ -841,14 +839,7 @@ void do_signal32(sigset_t *oldset, struct pt_regs * regs)
if
(
signr
>
0
)
{
if
(
restart_syscall
)
syscall_restart32
(
orig_i0
,
regs
,
&
ka
.
sa
);
if
(
handle_signal32
(
signr
,
&
ka
,
&
info
,
oldset
,
regs
)
==
0
)
{
/* A signal was successfully delivered; the saved
* sigmask will have been stored in the signal frame,
* and will be restored by sigreturn, so we can simply
* clear the TS_RESTORE_SIGMASK flag.
*/
current_thread_info
()
->
status
&=
~
TS_RESTORE_SIGMASK
;
}
handle_signal32
(
signr
,
&
ka
,
&
info
,
oldset
,
regs
);
return
;
}
if
(
restart_syscall
&&
...
...
arch/sparc/kernel/signal_32.c
浏览文件 @
a610d6e6
...
...
@@ -449,7 +449,7 @@ static int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
return
-
EFAULT
;
}
static
inline
int
static
inline
void
handle_signal
(
unsigned
long
signr
,
struct
k_sigaction
*
ka
,
siginfo_t
*
info
,
struct
pt_regs
*
regs
)
{
...
...
@@ -462,12 +462,10 @@ handle_signal(unsigned long signr, struct k_sigaction *ka,
err
=
setup_frame
(
ka
,
regs
,
signr
,
oldset
);
if
(
err
)
return
err
;
return
;
block_sigmask
(
ka
,
signr
);
tracehook_signal_handler
(
signr
,
info
,
ka
,
regs
,
0
);
return
0
;
}
static
inline
void
syscall_restart
(
unsigned
long
orig_i0
,
struct
pt_regs
*
regs
,
...
...
@@ -539,15 +537,7 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0)
if
(
signr
>
0
)
{
if
(
restart_syscall
)
syscall_restart
(
orig_i0
,
regs
,
&
ka
.
sa
);
if
(
handle_signal
(
signr
,
&
ka
,
&
info
,
regs
)
==
0
)
{
/* a signal was successfully delivered; the saved
* sigmask will have been stored in the signal frame,
* and will be restored by sigreturn, so we can simply
* clear the TIF_RESTORE_SIGMASK flag.
*/
if
(
test_thread_flag
(
TIF_RESTORE_SIGMASK
))
clear_thread_flag
(
TIF_RESTORE_SIGMASK
);
}
handle_signal
(
signr
,
&
ka
,
&
info
,
regs
);
return
;
}
if
(
restart_syscall
&&
...
...
arch/sparc/kernel/signal_64.c
浏览文件 @
a610d6e6
...
...
@@ -466,7 +466,7 @@ setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
return
-
EFAULT
;
}
static
inline
int
handle_signal
(
unsigned
long
signr
,
struct
k_sigaction
*
ka
,
static
inline
void
handle_signal
(
unsigned
long
signr
,
struct
k_sigaction
*
ka
,
siginfo_t
*
info
,
sigset_t
*
oldset
,
struct
pt_regs
*
regs
)
{
...
...
@@ -475,12 +475,10 @@ static inline int handle_signal(unsigned long signr, struct k_sigaction *ka,
err
=
setup_rt_frame
(
ka
,
regs
,
signr
,
oldset
,
(
ka
->
sa
.
sa_flags
&
SA_SIGINFO
)
?
info
:
NULL
);
if
(
err
)
return
err
;
return
;
block_sigmask
(
ka
,
signr
);
tracehook_signal_handler
(
signr
,
info
,
ka
,
regs
,
0
);
return
0
;
}
static
inline
void
syscall_restart
(
unsigned
long
orig_i0
,
struct
pt_regs
*
regs
,
...
...
@@ -558,14 +556,7 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0)
if
(
signr
>
0
)
{
if
(
restart_syscall
)
syscall_restart
(
orig_i0
,
regs
,
&
ka
.
sa
);
if
(
handle_signal
(
signr
,
&
ka
,
&
info
,
oldset
,
regs
)
==
0
)
{
/* A signal was successfully delivered; the saved
* sigmask will have been stored in the signal frame,
* and will be restored by sigreturn, so we can simply
* clear the TS_RESTORE_SIGMASK flag.
*/
current_thread_info
()
->
status
&=
~
TS_RESTORE_SIGMASK
;
}
handle_signal
(
signr
,
&
ka
,
&
info
,
oldset
,
regs
);
return
;
}
if
(
restart_syscall
&&
...
...
arch/tile/kernel/signal.c
浏览文件 @
a610d6e6
...
...
@@ -242,7 +242,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
* OK, we're invoking a handler
*/
static
int
handle_signal
(
unsigned
long
sig
,
siginfo_t
*
info
,
static
void
handle_signal
(
unsigned
long
sig
,
siginfo_t
*
info
,
struct
k_sigaction
*
ka
,
struct
pt_regs
*
regs
)
{
...
...
@@ -279,15 +279,9 @@ static int handle_signal(unsigned long sig, siginfo_t *info,
else
#endif
ret
=
setup_rt_frame
(
sig
,
ka
,
info
,
oldset
,
regs
);
if
(
ret
==
0
)
{
/* This code is only called from system calls or from
* the work_pending path in the return-to-user code, and
* either way we can re-enable interrupts unconditionally.
*/
block_sigmask
(
ka
,
sig
);
}
return
ret
;
if
(
ret
)
return
;
block_sigmask
(
ka
,
sig
);
}
/*
...
...
@@ -311,16 +305,7 @@ void do_signal(struct pt_regs *regs)
signr
=
get_signal_to_deliver
(
&
info
,
&
ka
,
regs
,
NULL
);
if
(
signr
>
0
)
{
/* Whee! Actually deliver the signal. */
if
(
handle_signal
(
signr
,
&
info
,
&
ka
,
regs
)
==
0
)
{
/*
* A signal was successfully delivered; the saved
* sigmask will have been stored in the signal frame,
* and will be restored by sigreturn, so we can simply
* clear the TS_RESTORE_SIGMASK flag.
*/
current_thread_info
()
->
status
&=
~
TS_RESTORE_SIGMASK
;
}
handle_signal
(
signr
,
&
info
,
&
ka
,
regs
);
goto
done
;
}
...
...
arch/um/kernel/signal.c
浏览文件 @
a610d6e6
...
...
@@ -22,7 +22,7 @@ EXPORT_SYMBOL(unblock_signals);
/*
* OK, we're invoking a handler
*/
static
int
handle_signal
(
struct
pt_regs
*
regs
,
unsigned
long
signr
,
static
void
handle_signal
(
struct
pt_regs
*
regs
,
unsigned
long
signr
,
struct
k_sigaction
*
ka
,
siginfo_t
*
info
)
{
sigset_t
*
oldset
=
sigmask_to_save
();
...
...
@@ -66,8 +66,6 @@ static int handle_signal(struct pt_regs *regs, unsigned long signr,
force_sigsegv
(
signr
,
current
);
else
block_sigmask
(
ka
,
signr
);
return
err
;
}
static
int
kern_do_signal
(
struct
pt_regs
*
regs
)
...
...
@@ -79,17 +77,7 @@ static int kern_do_signal(struct pt_regs *regs)
while
((
sig
=
get_signal_to_deliver
(
&
info
,
&
ka_copy
,
regs
,
NULL
))
>
0
)
{
handled_sig
=
1
;
/* Whee! Actually deliver the signal. */
if
(
!
handle_signal
(
regs
,
sig
,
&
ka_copy
,
&
info
))
{
/*
* a signal was successfully delivered; the saved
* sigmask will have been stored in the signal frame,
* and will be restored by sigreturn, so we can simply
* clear the TIF_RESTORE_SIGMASK flag
*/
if
(
test_thread_flag
(
TIF_RESTORE_SIGMASK
))
clear_thread_flag
(
TIF_RESTORE_SIGMASK
);
break
;
}
handle_signal
(
regs
,
sig
,
&
ka_copy
,
&
info
);
}
/* Did we come from a system call? */
...
...
arch/unicore32/kernel/signal.c
浏览文件 @
a610d6e6
...
...
@@ -312,7 +312,7 @@ static inline void setup_syscall_restart(struct pt_regs *regs)
/*
* OK, we're invoking a handler
*/
static
int
handle_signal
(
unsigned
long
sig
,
struct
k_sigaction
*
ka
,
static
void
handle_signal
(
unsigned
long
sig
,
struct
k_sigaction
*
ka
,
siginfo_t
*
info
,
struct
pt_regs
*
regs
,
int
syscall
)
{
struct
thread_info
*
thread
=
current_thread_info
();
...
...
@@ -363,15 +363,13 @@ static int handle_signal(unsigned long sig, struct k_sigaction *ka,
if
(
ret
!=
0
)
{
force_sigsegv
(
sig
,
tsk
);
return
ret
;
return
;
}
/*
* Block the signal if we were successful.
*/
block_sigmask
(
ka
,
sig
);
return
0
;
}
/*
...
...
@@ -403,17 +401,7 @@ static void do_signal(struct pt_regs *regs, int syscall)
signr
=
get_signal_to_deliver
(
&
info
,
&
ka
,
regs
,
NULL
);
if
(
signr
>
0
)
{
if
(
handle_signal
(
signr
,
&
ka
,
&
info
,
regs
,
syscall
)
==
0
)
{
/*
* A signal was successfully delivered; the saved
* sigmask will have been stored in the signal frame,
* and will be restored by sigreturn, so we can simply
* clear the TIF_RESTORE_SIGMASK flag.
*/
if
(
test_thread_flag
(
TIF_RESTORE_SIGMASK
))
clear_thread_flag
(
TIF_RESTORE_SIGMASK
);
}
handle_signal
(
signr
,
&
ka
,
&
info
,
regs
,
syscall
);
return
;
}
...
...
arch/x86/kernel/signal.c
浏览文件 @
a610d6e6
...
...
@@ -648,38 +648,27 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
{
int
usig
=
signr_convert
(
sig
);
sigset_t
*
set
=
sigmask_to_save
();
int
ret
;
/* Set up the stack frame */
if
(
is_ia32
)
{
if
(
ka
->
sa
.
sa_flags
&
SA_SIGINFO
)
ret
=
ia32_setup_rt_frame
(
usig
,
ka
,
info
,
set
,
regs
);
ret
urn
ia32_setup_rt_frame
(
usig
,
ka
,
info
,
set
,
regs
);
else
ret
=
ia32_setup_frame
(
usig
,
ka
,
set
,
regs
);
ret
urn
ia32_setup_frame
(
usig
,
ka
,
set
,
regs
);
#ifdef CONFIG_X86_X32_ABI
}
else
if
(
is_x32
)
{
ret
=
x32_setup_rt_frame
(
usig
,
ka
,
info
,
ret
urn
x32_setup_rt_frame
(
usig
,
ka
,
info
,
(
compat_sigset_t
*
)
set
,
regs
);
#endif
}
else
{
ret
=
__setup_rt_frame
(
sig
,
ka
,
info
,
set
,
regs
);
ret
urn
__setup_rt_frame
(
sig
,
ka
,
info
,
set
,
regs
);
}
if
(
ret
)
{
force_sigsegv
(
sig
,
current
);
return
-
EFAULT
;
}
current_thread_info
()
->
status
&=
~
TS_RESTORE_SIGMASK
;
return
ret
;
}
static
int
static
void
handle_signal
(
unsigned
long
sig
,
siginfo_t
*
info
,
struct
k_sigaction
*
ka
,
struct
pt_regs
*
regs
)
{
int
ret
;
/* Are we from a system call? */
if
(
syscall_get_nr
(
current
,
regs
)
>=
0
)
{
/* If so, check system call restarting.. */
...
...
@@ -710,10 +699,10 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
likely
(
test_and_clear_thread_flag
(
TIF_FORCED_TF
)))
regs
->
flags
&=
~
X86_EFLAGS_TF
;
ret
=
setup_rt_frame
(
sig
,
ka
,
info
,
regs
);
if
(
ret
)
return
ret
;
if
(
setup_rt_frame
(
sig
,
ka
,
info
,
regs
)
<
0
)
{
force_sigsegv
(
sig
,
current
);
return
;
}
/*
* Clear the direction flag as per the ABI for function entry.
...
...
@@ -732,8 +721,6 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
tracehook_signal_handler
(
sig
,
info
,
ka
,
regs
,
test_thread_flag
(
TIF_SINGLESTEP
));
return
0
;
}
#ifdef CONFIG_X86_32
...
...
arch/xtensa/kernel/signal.c
浏览文件 @
a610d6e6
...
...
@@ -499,7 +499,6 @@ static void do_signal(struct pt_regs *regs)
if
(
ret
)
return
;
clear_thread_flag
(
TIF_RESTORE_SIGMASK
);
block_sigmask
(
&
ka
,
signr
);
if
(
current
->
ptrace
&
PT_SINGLESTEP
)
task_pt_regs
(
current
)
->
icountlevel
=
1
;
...
...
kernel/signal.c
浏览文件 @
a610d6e6
...
...
@@ -2382,6 +2382,12 @@ void block_sigmask(struct k_sigaction *ka, int signr)
{
sigset_t
blocked
;
/* A signal was successfully delivered, and the
saved sigmask was stored on the signal frame,
and will be restored by sigreturn. So we can
simply clear the restore sigmask flag. */
clear_restore_sigmask
();
sigorsets
(
&
blocked
,
&
current
->
blocked
,
&
ka
->
sa
.
sa_mask
);
if
(
!
(
ka
->
sa
.
sa_flags
&
SA_NODEFER
))
sigaddset
(
&
blocked
,
signr
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录