Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
1b223c86
cloud-kernel
项目概览
openanolis
/
cloud-kernel
12 个月 前同步成功
通知
152
Star
36
Fork
7
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
10
列表
看板
标记
里程碑
合并请求
2
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
cloud-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
10
Issue
10
列表
看板
标记
里程碑
合并请求
2
合并请求
2
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
1b223c86
编写于
8月 03, 2006
作者:
R
Ralf Baechle
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[MIPS] IRIX: Crapectopy.
Signed-off-by:
N
Ralf Baechle
<
ralf@linux-mips.org
>
上级
048c6140
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
40 addition
and
15 deletion
+40
-15
arch/mips/kernel/irixsig.c
arch/mips/kernel/irixsig.c
+40
-15
未找到文件。
arch/mips/kernel/irixsig.c
浏览文件 @
1b223c86
...
...
@@ -17,6 +17,7 @@
#include <asm/ptrace.h>
#include <asm/uaccess.h>
#include <asm/unistd.h>
#undef DEBUG_SIG
...
...
@@ -172,11 +173,12 @@ static inline int handle_signal(unsigned long sig, siginfo_t *info,
return
ret
;
}
asmlinkage
int
do_irix_signal
(
sigset_t
*
oldset
,
struct
pt_regs
*
regs
)
void
do_irix_signal
(
struct
pt_regs
*
regs
)
{
struct
k_sigaction
ka
;
siginfo_t
info
;
int
signr
;
sigset_t
*
oldset
;
/*
* We want the common case to go fast, which is why we may in certain
...
...
@@ -184,14 +186,27 @@ asmlinkage int do_irix_signal(sigset_t *oldset, struct pt_regs *regs)
* if so.
*/
if
(
!
user_mode
(
regs
))
return
1
;
return
;
if
(
!
oldset
)
if
(
test_thread_flag
(
TIF_RESTORE_SIGMASK
))
oldset
=
&
current
->
saved_sigmask
;
else
oldset
=
&
current
->
blocked
;
signr
=
get_signal_to_deliver
(
&
info
,
&
ka
,
regs
,
NULL
);
if
(
signr
>
0
)
return
handle_signal
(
signr
,
&
info
,
&
ka
,
oldset
,
regs
);
if
(
signr
>
0
)
{
/* Whee! Actually deliver the signal. */
if
(
handle_signal
(
signr
,
&
info
,
&
ka
,
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
);
}
return
;
}
/*
* Who's code doesn't conform to the restartable syscall convention
...
...
@@ -204,8 +219,21 @@ asmlinkage int do_irix_signal(sigset_t *oldset, struct pt_regs *regs)
regs
->
regs
[
2
]
==
ERESTARTNOINTR
)
{
regs
->
cp0_epc
-=
8
;
}
if
(
regs
->
regs
[
2
]
==
ERESTART_RESTARTBLOCK
)
{
regs
->
regs
[
2
]
=
__NR_restart_syscall
;
regs
->
regs
[
7
]
=
regs
->
regs
[
26
];
regs
->
cp0_epc
-=
4
;
}
}
/*
* If there's no signal to deliver, we just put the saved sigmask
* back
*/
if
(
test_thread_flag
(
TIF_RESTORE_SIGMASK
))
{
clear_thread_flag
(
TIF_RESTORE_SIGMASK
);
sigprocmask
(
SIG_SETMASK
,
&
current
->
saved_sigmask
,
NULL
);
}
return
0
;
}
asmlinkage
void
...
...
@@ -409,7 +437,7 @@ asmlinkage int irix_sigprocmask(int how, irix_sigset_t __user *new,
asmlinkage
int
irix_sigsuspend
(
struct
pt_regs
*
regs
)
{
sigset_t
saveset
,
newset
;
sigset_t
newset
;
sigset_t
__user
*
uset
;
uset
=
(
sigset_t
__user
*
)
regs
->
regs
[
4
];
...
...
@@ -418,18 +446,15 @@ asmlinkage int irix_sigsuspend(struct pt_regs *regs)
sigdelsetmask
(
&
newset
,
~
_BLOCKABLE
);
spin_lock_irq
(
&
current
->
sighand
->
siglock
);
saveset
=
current
->
blocked
;
current
->
saved_sigmask
=
current
->
blocked
;
current
->
blocked
=
newset
;
recalc_sigpending
();
spin_unlock_irq
(
&
current
->
sighand
->
siglock
);
regs
->
regs
[
2
]
=
-
EINTR
;
while
(
1
)
{
current
->
state
=
TASK_INTERRUPTIBLE
;
schedule
();
if
(
do_irix_signal
(
&
saveset
,
regs
))
return
-
EINTR
;
}
current
->
state
=
TASK_INTERRUPTIBLE
;
schedule
();
set_thread_flag
(
TIF_RESTORE_SIGMASK
);
return
-
ERESTARTNOHAND
;
}
/* hate hate hate... */
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录