Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
02829f73
K
Kernel
项目概览
openeuler
/
Kernel
大约 1 年 前同步成功
通知
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,发现更多精彩内容 >>
提交
02829f73
编写于
1月 19, 2006
作者:
L
Linus Torvalds
浏览文件
操作
浏览文件
下载
差异文件
Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6
上级
49799291
2d7d5f05
变更
17
显示空白变更内容
内联
并排
Showing
17 changed file
with
186 addition
and
422 deletion
+186
-422
arch/sparc/kernel/entry.S
arch/sparc/kernel/entry.S
+0
-56
arch/sparc/kernel/rtrap.S
arch/sparc/kernel/rtrap.S
+4
-5
arch/sparc/kernel/signal.c
arch/sparc/kernel/signal.c
+31
-86
arch/sparc/kernel/sparc_ksyms.c
arch/sparc/kernel/sparc_ksyms.c
+0
-2
arch/sparc/kernel/systbls.S
arch/sparc/kernel/systbls.S
+9
-1
arch/sparc64/kernel/entry.S
arch/sparc64/kernel/entry.S
+0
-23
arch/sparc64/kernel/rtrap.S
arch/sparc64/kernel/rtrap.S
+15
-18
arch/sparc64/kernel/signal.c
arch/sparc64/kernel/signal.c
+40
-111
arch/sparc64/kernel/signal32.c
arch/sparc64/kernel/signal32.c
+19
-103
arch/sparc64/kernel/sparc64_ksyms.c
arch/sparc64/kernel/sparc64_ksyms.c
+2
-2
arch/sparc64/kernel/systbls.S
arch/sparc64/kernel/systbls.S
+17
-4
arch/sparc64/solaris/entry64.S
arch/sparc64/solaris/entry64.S
+2
-0
include/asm-sparc/oplib.h
include/asm-sparc/oplib.h
+2
-0
include/asm-sparc/thread_info.h
include/asm-sparc/thread_info.h
+3
-2
include/asm-sparc/unistd.h
include/asm-sparc/unistd.h
+19
-3
include/asm-sparc64/thread_info.h
include/asm-sparc64/thread_info.h
+3
-3
include/asm-sparc64/unistd.h
include/asm-sparc64/unistd.h
+20
-3
未找到文件。
arch/sparc/kernel/entry.S
浏览文件 @
02829f73
...
@@ -1276,62 +1276,6 @@ sys_sigstack:
...
@@ -1276,62 +1276,6 @@ sys_sigstack:
call
do_sys_sigstack
call
do_sys_sigstack
mov
%
l5
,
%
o7
mov
%
l5
,
%
o7
.
align
4
.
globl
sys_sigpause
sys_sigpause
:
/
*
Note
:
%
o0
already
has
correct
value
...
*/
call
do_sigpause
add
%
sp
,
STACKFRAME_SZ
,
%
o1
ld
[%
curptr
+
TI_FLAGS
],
%
l5
andcc
%
l5
,
_TIF_SYSCALL_TRACE
,
%
g0
be
1
f
nop
call
syscall_trace
nop
1
:
/
*
We
are
returning
to
a
signal
handler
.
*/
RESTORE_ALL
.
align
4
.
globl
sys_sigsuspend
sys_sigsuspend
:
call
do_sigsuspend
add
%
sp
,
STACKFRAME_SZ
,
%
o0
ld
[%
curptr
+
TI_FLAGS
],
%
l5
andcc
%
l5
,
_TIF_SYSCALL_TRACE
,
%
g0
be
1
f
nop
call
syscall_trace
nop
1
:
/
*
We
are
returning
to
a
signal
handler
.
*/
RESTORE_ALL
.
align
4
.
globl
sys_rt_sigsuspend
sys_rt_sigsuspend
:
/
*
Note
:
%
o0
,
%
o1
already
have
correct
value
...
*/
call
do_rt_sigsuspend
add
%
sp
,
STACKFRAME_SZ
,
%
o2
ld
[%
curptr
+
TI_FLAGS
],
%
l5
andcc
%
l5
,
_TIF_SYSCALL_TRACE
,
%
g0
be
1
f
nop
call
syscall_trace
nop
1
:
/
*
We
are
returning
to
a
signal
handler
.
*/
RESTORE_ALL
.
align
4
.
align
4
.
globl
sys_sigreturn
.
globl
sys_sigreturn
sys_sigreturn
:
sys_sigreturn
:
...
...
arch/sparc/kernel/rtrap.S
浏览文件 @
02829f73
...
@@ -68,15 +68,14 @@ ret_trap_lockless_ipi:
...
@@ -68,15 +68,14 @@ ret_trap_lockless_ipi:
ld
[%
curptr
+
TI_FLAGS
],
%
g2
ld
[%
curptr
+
TI_FLAGS
],
%
g2
signal_p
:
signal_p
:
andcc
%
g2
,
(
_TIF_
NOTIFY_RESUME
|
_TIF_SIGPENDING
),
%
g0
andcc
%
g2
,
(
_TIF_
SIGPENDING
|
_TIF_RESTORE_SIGMASK
),
%
g0
bz
,
a
ret_trap_continue
bz
,
a
ret_trap_continue
ld
[%
sp
+
STACKFRAME_SZ
+
PT_PSR
],
%
t_psr
ld
[%
sp
+
STACKFRAME_SZ
+
PT_PSR
],
%
t_psr
clr
%
o0
mov
%
l5
,
%
o1
mov
%
l5
,
%
o2
mov
%
l6
,
%
o2
mov
%
l6
,
%
o3
call
do_signal
call
do_signal
add
%
sp
,
STACKFRAME_SZ
,
%
o
1
!
pt_regs
ptr
add
%
sp
,
STACKFRAME_SZ
,
%
o
0
!
pt_regs
ptr
/
*
Fall
through
.
*/
/
*
Fall
through
.
*/
ld
[%
sp
+
STACKFRAME_SZ
+
PT_PSR
],
%
t_psr
ld
[%
sp
+
STACKFRAME_SZ
+
PT_PSR
],
%
t_psr
...
...
arch/sparc/kernel/signal.c
浏览文件 @
02829f73
...
@@ -35,9 +35,6 @@ extern void fpsave(unsigned long *fpregs, unsigned long *fsr,
...
@@ -35,9 +35,6 @@ extern void fpsave(unsigned long *fpregs, unsigned long *fsr,
void
*
fpqueue
,
unsigned
long
*
fpqdepth
);
void
*
fpqueue
,
unsigned
long
*
fpqdepth
);
extern
void
fpload
(
unsigned
long
*
fpregs
,
unsigned
long
*
fsr
);
extern
void
fpload
(
unsigned
long
*
fpregs
,
unsigned
long
*
fsr
);
asmlinkage
int
do_signal
(
sigset_t
*
oldset
,
struct
pt_regs
*
regs
,
unsigned
long
orig_o0
,
int
restart_syscall
);
/* Signal frames: the original one (compatible with SunOS):
/* Signal frames: the original one (compatible with SunOS):
*
*
* Set up a signal frame... Make the stack look the way SunOS
* Set up a signal frame... Make the stack look the way SunOS
...
@@ -95,98 +92,30 @@ struct rt_signal_frame {
...
@@ -95,98 +92,30 @@ struct rt_signal_frame {
#define NF_ALIGNEDSZ (((sizeof(struct new_signal_frame) + 7) & (~7)))
#define NF_ALIGNEDSZ (((sizeof(struct new_signal_frame) + 7) & (~7)))
#define RT_ALIGNEDSZ (((sizeof(struct rt_signal_frame) + 7) & (~7)))
#define RT_ALIGNEDSZ (((sizeof(struct rt_signal_frame) + 7) & (~7)))
/*
static
int
_sigpause_common
(
old_sigset_t
set
)
* atomically swap in the new signal mask, and wait for a signal.
* This is really tricky on the Sparc, watch out...
*/
asmlinkage
void
_sigpause_common
(
old_sigset_t
set
,
struct
pt_regs
*
regs
)
{
{
sigset_t
saveset
;
set
&=
_BLOCKABLE
;
set
&=
_BLOCKABLE
;
spin_lock_irq
(
&
current
->
sighand
->
siglock
);
spin_lock_irq
(
&
current
->
sighand
->
siglock
);
saveset
=
current
->
blocked
;
current
->
saved_sigmask
=
current
->
blocked
;
siginitset
(
&
current
->
blocked
,
set
);
siginitset
(
&
current
->
blocked
,
set
);
recalc_sigpending
();
recalc_sigpending
();
spin_unlock_irq
(
&
current
->
sighand
->
siglock
);
spin_unlock_irq
(
&
current
->
sighand
->
siglock
);
regs
->
pc
=
regs
->
npc
;
regs
->
npc
+=
4
;
/* Condition codes and return value where set here for sigpause,
* and so got used by setup_frame, which again causes sigreturn()
* to return -EINTR.
*/
while
(
1
)
{
current
->
state
=
TASK_INTERRUPTIBLE
;
current
->
state
=
TASK_INTERRUPTIBLE
;
schedule
();
schedule
();
/*
set_thread_flag
(
TIF_RESTORE_SIGMASK
);
* Return -EINTR and set condition code here,
* so the interrupted system call actually returns
* these.
*/
regs
->
psr
|=
PSR_C
;
regs
->
u_regs
[
UREG_I0
]
=
EINTR
;
if
(
do_signal
(
&
saveset
,
regs
,
0
,
0
))
return
;
}
}
asmlinkage
void
do_sigpause
(
unsigned
int
set
,
struct
pt_regs
*
regs
)
return
-
ERESTARTNOHAND
;
{
_sigpause_common
(
set
,
regs
);
}
}
asmlinkage
void
do_sigsuspend
(
struct
pt_regs
*
regs
)
asmlinkage
int
sys_sigpause
(
unsigned
int
set
)
{
{
_sigpause_common
(
regs
->
u_regs
[
UREG_I0
],
regs
);
return
_sigpause_common
(
set
);
}
}
asmlinkage
void
do_rt_sigsuspend
(
sigset_t
__user
*
uset
,
size_t
sigsetsize
,
asmlinkage
int
sys_sigsuspend
(
old_sigset_t
set
)
struct
pt_regs
*
regs
)
{
{
sigset_t
oldset
,
set
;
return
_sigpause_common
(
set
);
/* XXX: Don't preclude handling different sized sigset_t's. */
if
(
sigsetsize
!=
sizeof
(
sigset_t
))
{
regs
->
psr
|=
PSR_C
;
regs
->
u_regs
[
UREG_I0
]
=
EINVAL
;
return
;
}
if
(
copy_from_user
(
&
set
,
uset
,
sizeof
(
set
)))
{
regs
->
psr
|=
PSR_C
;
regs
->
u_regs
[
UREG_I0
]
=
EFAULT
;
return
;
}
sigdelsetmask
(
&
set
,
~
_BLOCKABLE
);
spin_lock_irq
(
&
current
->
sighand
->
siglock
);
oldset
=
current
->
blocked
;
current
->
blocked
=
set
;
recalc_sigpending
();
spin_unlock_irq
(
&
current
->
sighand
->
siglock
);
regs
->
pc
=
regs
->
npc
;
regs
->
npc
+=
4
;
/* Condition codes and return value where set here for sigpause,
* and so got used by setup_frame, which again causes sigreturn()
* to return -EINTR.
*/
while
(
1
)
{
current
->
state
=
TASK_INTERRUPTIBLE
;
schedule
();
/*
* Return -EINTR and set condition code here,
* so the interrupted system call actually returns
* these.
*/
regs
->
psr
|=
PSR_C
;
regs
->
u_regs
[
UREG_I0
]
=
EINTR
;
if
(
do_signal
(
&
oldset
,
regs
,
0
,
0
))
return
;
}
}
}
static
inline
int
static
inline
int
...
@@ -1067,13 +996,13 @@ static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs,
...
@@ -1067,13 +996,13 @@ static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs,
* want to handle. Thus you cannot kill init even with a SIGKILL even by
* want to handle. Thus you cannot kill init even with a SIGKILL even by
* mistake.
* mistake.
*/
*/
asmlinkage
int
do_signal
(
sigset_t
*
oldset
,
struct
pt_regs
*
regs
,
asmlinkage
void
do_signal
(
struct
pt_regs
*
regs
,
unsigned
long
orig_i0
,
int
restart_syscall
)
unsigned
long
orig_i0
,
int
restart_syscall
)
{
{
siginfo_t
info
;
siginfo_t
info
;
struct
sparc_deliver_cookie
cookie
;
struct
sparc_deliver_cookie
cookie
;
struct
k_sigaction
ka
;
struct
k_sigaction
ka
;
int
signr
;
int
signr
;
sigset_t
*
oldset
;
/*
/*
* XXX Disable svr4 signal handling until solaris emulation works.
* XXX Disable svr4 signal handling until solaris emulation works.
...
@@ -1089,7 +1018,9 @@ asmlinkage int do_signal(sigset_t *oldset, struct pt_regs * regs,
...
@@ -1089,7 +1018,9 @@ asmlinkage int do_signal(sigset_t *oldset, struct pt_regs * regs,
cookie
.
restart_syscall
=
restart_syscall
;
cookie
.
restart_syscall
=
restart_syscall
;
cookie
.
orig_i0
=
orig_i0
;
cookie
.
orig_i0
=
orig_i0
;
if
(
!
oldset
)
if
(
test_thread_flag
(
TIF_RESTORE_SIGMASK
))
oldset
=
&
current
->
saved_sigmask
;
else
oldset
=
&
current
->
blocked
;
oldset
=
&
current
->
blocked
;
signr
=
get_signal_to_deliver
(
&
info
,
&
ka
,
regs
,
&
cookie
);
signr
=
get_signal_to_deliver
(
&
info
,
&
ka
,
regs
,
&
cookie
);
...
@@ -1098,7 +1029,14 @@ asmlinkage int do_signal(sigset_t *oldset, struct pt_regs * regs,
...
@@ -1098,7 +1029,14 @@ asmlinkage int do_signal(sigset_t *oldset, struct pt_regs * regs,
syscall_restart
(
cookie
.
orig_i0
,
regs
,
&
ka
.
sa
);
syscall_restart
(
cookie
.
orig_i0
,
regs
,
&
ka
.
sa
);
handle_signal
(
signr
,
&
ka
,
&
info
,
oldset
,
handle_signal
(
signr
,
&
ka
,
&
info
,
oldset
,
regs
,
svr4_signal
);
regs
,
svr4_signal
);
return
1
;
/* 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
;
}
}
if
(
cookie
.
restart_syscall
&&
if
(
cookie
.
restart_syscall
&&
(
regs
->
u_regs
[
UREG_I0
]
==
ERESTARTNOHAND
||
(
regs
->
u_regs
[
UREG_I0
]
==
ERESTARTNOHAND
||
...
@@ -1115,7 +1053,14 @@ asmlinkage int do_signal(sigset_t *oldset, struct pt_regs * regs,
...
@@ -1115,7 +1053,14 @@ asmlinkage int do_signal(sigset_t *oldset, struct pt_regs * regs,
regs
->
pc
-=
4
;
regs
->
pc
-=
4
;
regs
->
npc
-=
4
;
regs
->
npc
-=
4
;
}
}
return
0
;
/* 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
);
}
}
}
asmlinkage
int
asmlinkage
int
...
...
arch/sparc/kernel/sparc_ksyms.c
浏览文件 @
02829f73
...
@@ -66,7 +66,6 @@ struct poll {
...
@@ -66,7 +66,6 @@ struct poll {
extern
int
svr4_getcontext
(
svr4_ucontext_t
*
,
struct
pt_regs
*
);
extern
int
svr4_getcontext
(
svr4_ucontext_t
*
,
struct
pt_regs
*
);
extern
int
svr4_setcontext
(
svr4_ucontext_t
*
,
struct
pt_regs
*
);
extern
int
svr4_setcontext
(
svr4_ucontext_t
*
,
struct
pt_regs
*
);
void
_sigpause_common
(
unsigned
int
set
,
struct
pt_regs
*
);
extern
void
(
*
__copy_1page
)(
void
*
,
const
void
*
);
extern
void
(
*
__copy_1page
)(
void
*
,
const
void
*
);
extern
void
__memmove
(
void
*
,
const
void
*
,
__kernel_size_t
);
extern
void
__memmove
(
void
*
,
const
void
*
,
__kernel_size_t
);
extern
void
(
*
bzero_1page
)(
void
*
);
extern
void
(
*
bzero_1page
)(
void
*
);
...
@@ -227,7 +226,6 @@ EXPORT_SYMBOL(kunmap_atomic);
...
@@ -227,7 +226,6 @@ EXPORT_SYMBOL(kunmap_atomic);
/* Solaris/SunOS binary compatibility */
/* Solaris/SunOS binary compatibility */
EXPORT_SYMBOL
(
svr4_setcontext
);
EXPORT_SYMBOL
(
svr4_setcontext
);
EXPORT_SYMBOL
(
svr4_getcontext
);
EXPORT_SYMBOL
(
svr4_getcontext
);
EXPORT_SYMBOL
(
_sigpause_common
);
EXPORT_SYMBOL
(
dump_thread
);
EXPORT_SYMBOL
(
dump_thread
);
...
...
arch/sparc/kernel/systbls.S
浏览文件 @
02829f73
...
@@ -75,7 +75,10 @@ sys_call_table:
...
@@ -75,7 +75,10 @@ sys_call_table:
/*
265
*/
.
long
sys_timer_delete
,
sys_timer_create
,
sys_nis_syscall
,
sys_io_setup
,
sys_io_destroy
/*
265
*/
.
long
sys_timer_delete
,
sys_timer_create
,
sys_nis_syscall
,
sys_io_setup
,
sys_io_destroy
/*
270
*/
.
long
sys_io_submit
,
sys_io_cancel
,
sys_io_getevents
,
sys_mq_open
,
sys_mq_unlink
/*
270
*/
.
long
sys_io_submit
,
sys_io_cancel
,
sys_io_getevents
,
sys_mq_open
,
sys_mq_unlink
/*
275
*/
.
long
sys_mq_timedsend
,
sys_mq_timedreceive
,
sys_mq_notify
,
sys_mq_getsetattr
,
sys_waitid
/*
275
*/
.
long
sys_mq_timedsend
,
sys_mq_timedreceive
,
sys_mq_notify
,
sys_mq_getsetattr
,
sys_waitid
/*
280
*/
.
long
sys_ni_syscall
,
sys_add_key
,
sys_request_key
,
sys_keyctl
/*
280
*/
.
long
sys_ni_syscall
,
sys_add_key
,
sys_request_key
,
sys_keyctl
,
sys_openat
/*
285
*/
.
long
sys_mkdirat
,
sys_mknodat
,
sys_fchownat
,
sys_futimesat
,
sys_newfstatat
/*
290
*/
.
long
sys_unlinkat
,
sys_renameat
,
sys_linkat
,
sys_symlinkat
,
sys_readlinkat
/*
295
*/
.
long
sys_fchmodat
,
sys_faccessat
,
sys_pselect6
,
sys_ppoll
#ifdef CONFIG_SUNOS_EMUL
#ifdef CONFIG_SUNOS_EMUL
/
*
Now
the
SunOS
syscall
table
.
*/
/
*
Now
the
SunOS
syscall
table
.
*/
...
@@ -181,6 +184,11 @@ sunos_sys_table:
...
@@ -181,6 +184,11 @@ sunos_sys_table:
.
long
sunos_nosys
,
sunos_nosys
,
sunos_nosys
.
long
sunos_nosys
,
sunos_nosys
,
sunos_nosys
.
long
sunos_nosys
.
long
sunos_nosys
/*
280
*/
.
long
sunos_nosys
,
sunos_nosys
,
sunos_nosys
/*
280
*/
.
long
sunos_nosys
,
sunos_nosys
,
sunos_nosys
.
long
sunos_nosys
,
sunos_nosys
,
sunos_nosys
.
long
sunos_nosys
,
sunos_nosys
,
sunos_nosys
.
long
sunos_nosys
.
long
sunos_nosys
/*
290
*/
.
long
sunos_nosys
,
sunos_nosys
,
sunos_nosys
.
long
sunos_nosys
,
sunos_nosys
,
sunos_nosys
.
long
sunos_nosys
,
sunos_nosys
,
sunos_nosys
#endif
#endif
arch/sparc64/kernel/entry.S
浏览文件 @
02829f73
...
@@ -1416,7 +1416,6 @@ execve_merge:
...
@@ -1416,7 +1416,6 @@ execve_merge:
add
%
sp
,
PTREGS_OFF
,
%
o0
add
%
sp
,
PTREGS_OFF
,
%
o0
.
globl
sys_pipe
,
sys_sigpause
,
sys_nis_syscall
.
globl
sys_pipe
,
sys_sigpause
,
sys_nis_syscall
.
globl
sys_sigsuspend
,
sys_rt_sigsuspend
.
globl
sys_rt_sigreturn
.
globl
sys_rt_sigreturn
.
globl
sys_ptrace
.
globl
sys_ptrace
.
globl
sys_sigaltstack
.
globl
sys_sigaltstack
...
@@ -1440,28 +1439,6 @@ sys32_sigaltstack:
...
@@ -1440,28 +1439,6 @@ sys32_sigaltstack:
mov
%
i6
,
%
o2
mov
%
i6
,
%
o2
#endif
#endif
.
align
32
.
align
32
sys_sigsuspend
:
add
%
sp
,
PTREGS_OFF
,
%
o0
call
do_sigsuspend
add
%
o7
,
1
f
-
.
-
4
,
%
o7
nop
sys_rt_sigsuspend
:
/
*
NOTE
:
%
o0
,%
o1
have
a
correct
value
already
*/
add
%
sp
,
PTREGS_OFF
,
%
o2
call
do_rt_sigsuspend
add
%
o7
,
1
f
-
.
-
4
,
%
o7
nop
#ifdef CONFIG_COMPAT
.
globl
sys32_rt_sigsuspend
sys32_rt_sigsuspend
:
/
*
NOTE
:
%
o0
,%
o1
have
a
correct
value
already
*/
srl
%
o0
,
0
,
%
o0
add
%
sp
,
PTREGS_OFF
,
%
o2
call
do_rt_sigsuspend32
add
%
o7
,
1
f
-
.
-
4
,
%
o7
#endif
/
*
NOTE
:
%
o0
has
a
correct
value
already
*/
sys_sigpause
:
add
%
sp
,
PTREGS_OFF
,
%
o1
call
do_sigpause
add
%
o7
,
1
f
-
.
-
4
,
%
o7
nop
#ifdef CONFIG_COMPAT
#ifdef CONFIG_COMPAT
.
globl
sys32_sigreturn
.
globl
sys32_sigreturn
sys32_sigreturn
:
sys32_sigreturn
:
...
...
arch/sparc64/kernel/rtrap.S
浏览文件 @
02829f73
...
@@ -53,14 +53,13 @@ __handle_user_windows:
...
@@ -53,14 +53,13 @@ __handle_user_windows:
wrpr
%
g0
,
RTRAP_PSTATE_IRQOFF
,
%
pstate
wrpr
%
g0
,
RTRAP_PSTATE_IRQOFF
,
%
pstate
ldx
[%
g6
+
TI_FLAGS
],
%
l0
ldx
[%
g6
+
TI_FLAGS
],
%
l0
1
:
andcc
%
l0
,
(
_TIF_
NOTIFY_RESUME
|
_TIF_SIGPENDING
),
%
g0
1
:
andcc
%
l0
,
(
_TIF_
SIGPENDING
|
_TIF_RESTORE_SIGMASK
),
%
g0
be
,
pt
%
xcc
,
__handle_user_windows_continue
be
,
pt
%
xcc
,
__handle_user_windows_continue
nop
nop
clr
%
o0
mov
%
l5
,
%
o1
mov
%
l5
,
%
o2
mov
%
l6
,
%
o2
mov
%
l6
,
%
o3
add
%
sp
,
PTREGS_OFF
,
%
o0
add
%
sp
,
PTREGS_OFF
,
%
o1
mov
%
l0
,
%
o3
mov
%
l0
,
%
o4
call
do_notify_resume
call
do_notify_resume
wrpr
%
g0
,
RTRAP_PSTATE
,
%
pstate
wrpr
%
g0
,
RTRAP_PSTATE
,
%
pstate
...
@@ -96,15 +95,14 @@ __handle_perfctrs:
...
@@ -96,15 +95,14 @@ __handle_perfctrs:
wrpr
%
g0
,
RTRAP_PSTATE
,
%
pstate
wrpr
%
g0
,
RTRAP_PSTATE
,
%
pstate
wrpr
%
g0
,
RTRAP_PSTATE_IRQOFF
,
%
pstate
wrpr
%
g0
,
RTRAP_PSTATE_IRQOFF
,
%
pstate
ldx
[%
g6
+
TI_FLAGS
],
%
l0
ldx
[%
g6
+
TI_FLAGS
],
%
l0
1
:
andcc
%
l0
,
(
_TIF_
NOTIFY_RESUME
|
_TIF_SIGPENDING
),
%
g0
1
:
andcc
%
l0
,
(
_TIF_
SIGPENDING
|
_TIF_RESTORE_SIGMASK
),
%
g0
be
,
pt
%
xcc
,
__handle_perfctrs_continue
be
,
pt
%
xcc
,
__handle_perfctrs_continue
sethi
%
hi
(
TSTATE_PEF
),
%
o0
sethi
%
hi
(
TSTATE_PEF
),
%
o0
clr
%
o0
mov
%
l5
,
%
o1
mov
%
l5
,
%
o2
mov
%
l6
,
%
o2
mov
%
l6
,
%
o3
add
%
sp
,
PTREGS_OFF
,
%
o0
add
%
sp
,
PTREGS_OFF
,
%
o1
mov
%
l0
,
%
o3
mov
%
l0
,
%
o4
call
do_notify_resume
call
do_notify_resume
wrpr
%
g0
,
RTRAP_PSTATE
,
%
pstate
wrpr
%
g0
,
RTRAP_PSTATE
,
%
pstate
...
@@ -129,11 +127,10 @@ __handle_userfpu:
...
@@ -129,11 +127,10 @@ __handle_userfpu:
ba
,
a
,
pt
%
xcc
,
__handle_userfpu_continue
ba
,
a
,
pt
%
xcc
,
__handle_userfpu_continue
__handle_signal
:
__handle_signal
:
clr
%
o0
mov
%
l5
,
%
o1
mov
%
l5
,
%
o2
mov
%
l6
,
%
o2
mov
%
l6
,
%
o3
add
%
sp
,
PTREGS_OFF
,
%
o0
add
%
sp
,
PTREGS_OFF
,
%
o1
mov
%
l0
,
%
o3
mov
%
l0
,
%
o4
call
do_notify_resume
call
do_notify_resume
wrpr
%
g0
,
RTRAP_PSTATE
,
%
pstate
wrpr
%
g0
,
RTRAP_PSTATE
,
%
pstate
wrpr
%
g0
,
RTRAP_PSTATE_IRQOFF
,
%
pstate
wrpr
%
g0
,
RTRAP_PSTATE_IRQOFF
,
%
pstate
...
@@ -200,7 +197,7 @@ __handle_preemption_continue:
...
@@ -200,7 +197,7 @@ __handle_preemption_continue:
andcc
%
l1
,
%
o0
,
%
g0
andcc
%
l1
,
%
o0
,
%
g0
andcc
%
l0
,
_TIF_NEED_RESCHED
,
%
g0
andcc
%
l0
,
_TIF_NEED_RESCHED
,
%
g0
bne
,
pn
%
xcc
,
__handle_preemption
bne
,
pn
%
xcc
,
__handle_preemption
andcc
%
l0
,
(
_TIF_
NOTIFY_RESUME
|
_TIF_SIGPENDING
),
%
g0
andcc
%
l0
,
(
_TIF_
SIGPENDING
|
_TIF_RESTORE_SIGMASK
),
%
g0
bne
,
pn
%
xcc
,
__handle_signal
bne
,
pn
%
xcc
,
__handle_signal
__handle_signal_continue
:
__handle_signal_continue
:
ldub
[%
g6
+
TI_WSAVED
],
%
o2
ldub
[%
g6
+
TI_WSAVED
],
%
o2
...
...
arch/sparc64/kernel/signal.c
浏览文件 @
02829f73
...
@@ -36,9 +36,6 @@
...
@@ -36,9 +36,6 @@
#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
static
int
do_signal
(
sigset_t
*
oldset
,
struct
pt_regs
*
regs
,
unsigned
long
orig_o0
,
int
ret_from_syscall
);
/* {set, get}context() needed for 64-bit SparcLinux userland. */
/* {set, get}context() needed for 64-bit SparcLinux userland. */
asmlinkage
void
sparc64_set_context
(
struct
pt_regs
*
regs
)
asmlinkage
void
sparc64_set_context
(
struct
pt_regs
*
regs
)
{
{
...
@@ -242,114 +239,29 @@ struct rt_signal_frame {
...
@@ -242,114 +239,29 @@ struct rt_signal_frame {
/* Align macros */
/* Align macros */
#define RT_ALIGNEDSZ (((sizeof(struct rt_signal_frame) + 7) & (~7)))
#define RT_ALIGNEDSZ (((sizeof(struct rt_signal_frame) + 7) & (~7)))
/*
static
long
_sigpause_common
(
old_sigset_t
set
)
* atomically swap in the new signal mask, and wait for a signal.
* This is really tricky on the Sparc, watch out...
*/
asmlinkage
void
_sigpause_common
(
old_sigset_t
set
,
struct
pt_regs
*
regs
)
{
{
sigset_t
saveset
;
#ifdef CONFIG_SPARC32_COMPAT
if
(
test_thread_flag
(
TIF_32BIT
))
{
extern
asmlinkage
void
_sigpause32_common
(
compat_old_sigset_t
,
struct
pt_regs
*
);
_sigpause32_common
(
set
,
regs
);
return
;
}
#endif
set
&=
_BLOCKABLE
;
set
&=
_BLOCKABLE
;
spin_lock_irq
(
&
current
->
sighand
->
siglock
);
spin_lock_irq
(
&
current
->
sighand
->
siglock
);
saveset
=
current
->
blocked
;
current
->
saved_sigmask
=
current
->
blocked
;
siginitset
(
&
current
->
blocked
,
set
);
siginitset
(
&
current
->
blocked
,
set
);
recalc_sigpending
();
recalc_sigpending
();
spin_unlock_irq
(
&
current
->
sighand
->
siglock
);
spin_unlock_irq
(
&
current
->
sighand
->
siglock
);
if
(
test_thread_flag
(
TIF_32BIT
))
{
regs
->
tpc
=
(
regs
->
tnpc
&
0xffffffff
);
regs
->
tnpc
=
(
regs
->
tnpc
+
4
)
&
0xffffffff
;
}
else
{
regs
->
tpc
=
regs
->
tnpc
;
regs
->
tnpc
+=
4
;
}
/* Condition codes and return value where set here for sigpause,
* and so got used by setup_frame, which again causes sigreturn()
* to return -EINTR.
*/
while
(
1
)
{
current
->
state
=
TASK_INTERRUPTIBLE
;
current
->
state
=
TASK_INTERRUPTIBLE
;
schedule
();
schedule
();
/*
set_thread_flag
(
TIF_RESTORE_SIGMASK
);
* Return -EINTR and set condition code here,
return
-
ERESTARTNOHAND
;
* so the interrupted system call actually returns
* these.
*/
regs
->
tstate
|=
(
TSTATE_ICARRY
|
TSTATE_XCARRY
);
regs
->
u_regs
[
UREG_I0
]
=
EINTR
;
if
(
do_signal
(
&
saveset
,
regs
,
0
,
0
))
return
;
}
}
}
asmlinkage
void
do_sigpause
(
unsigned
int
set
,
struct
pt_regs
*
regs
)
asmlinkage
long
sys_sigpause
(
unsigned
int
set
)
{
{
_sigpause_common
(
set
,
regs
);
return
_sigpause_common
(
set
);
}
}
asmlinkage
void
do_sigsuspend
(
struct
pt_regs
*
regs
)
asmlinkage
long
sys_sigsuspend
(
old_sigset_t
set
)
{
{
_sigpause_common
(
regs
->
u_regs
[
UREG_I0
],
regs
);
return
_sigpause_common
(
set
);
}
asmlinkage
void
do_rt_sigsuspend
(
sigset_t
__user
*
uset
,
size_t
sigsetsize
,
struct
pt_regs
*
regs
)
{
sigset_t
oldset
,
set
;
/* XXX: Don't preclude handling different sized sigset_t's. */
if
(
sigsetsize
!=
sizeof
(
sigset_t
))
{
regs
->
tstate
|=
(
TSTATE_ICARRY
|
TSTATE_XCARRY
);
regs
->
u_regs
[
UREG_I0
]
=
EINVAL
;
return
;
}
if
(
copy_from_user
(
&
set
,
uset
,
sizeof
(
set
)))
{
regs
->
tstate
|=
(
TSTATE_ICARRY
|
TSTATE_XCARRY
);
regs
->
u_regs
[
UREG_I0
]
=
EFAULT
;
return
;
}
sigdelsetmask
(
&
set
,
~
_BLOCKABLE
);
spin_lock_irq
(
&
current
->
sighand
->
siglock
);
oldset
=
current
->
blocked
;
current
->
blocked
=
set
;
recalc_sigpending
();
spin_unlock_irq
(
&
current
->
sighand
->
siglock
);
if
(
test_thread_flag
(
TIF_32BIT
))
{
regs
->
tpc
=
(
regs
->
tnpc
&
0xffffffff
);
regs
->
tnpc
=
(
regs
->
tnpc
+
4
)
&
0xffffffff
;
}
else
{
regs
->
tpc
=
regs
->
tnpc
;
regs
->
tnpc
+=
4
;
}
/* Condition codes and return value where set here for sigpause,
* and so got used by setup_frame, which again causes sigreturn()
* to return -EINTR.
*/
while
(
1
)
{
current
->
state
=
TASK_INTERRUPTIBLE
;
schedule
();
/*
* Return -EINTR and set condition code here,
* so the interrupted system call actually returns
* these.
*/
regs
->
tstate
|=
(
TSTATE_ICARRY
|
TSTATE_XCARRY
);
regs
->
u_regs
[
UREG_I0
]
=
EINTR
;
if
(
do_signal
(
&
oldset
,
regs
,
0
,
0
))
return
;
}
}
}
static
inline
int
static
inline
int
...
@@ -607,26 +519,29 @@ static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs,
...
@@ -607,26 +519,29 @@ static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs,
* want to handle. Thus you cannot kill init even with a SIGKILL even by
* want to handle. Thus you cannot kill init even with a SIGKILL even by
* mistake.
* mistake.
*/
*/
static
int
do_signal
(
sigset_t
*
oldset
,
struct
pt_regs
*
regs
,
static
void
do_signal
(
struct
pt_regs
*
regs
,
unsigned
long
orig_i0
,
int
restart_syscall
)
unsigned
long
orig_i0
,
int
restart_syscall
)
{
{
siginfo_t
info
;
siginfo_t
info
;
struct
signal_deliver_cookie
cookie
;
struct
signal_deliver_cookie
cookie
;
struct
k_sigaction
ka
;
struct
k_sigaction
ka
;
int
signr
;
int
signr
;
sigset_t
*
oldset
;
cookie
.
restart_syscall
=
restart_syscall
;
cookie
.
restart_syscall
=
restart_syscall
;
cookie
.
orig_i0
=
orig_i0
;
cookie
.
orig_i0
=
orig_i0
;
if
(
!
oldset
)
if
(
test_thread_flag
(
TIF_RESTORE_SIGMASK
))
oldset
=
&
current
->
saved_sigmask
;
else
oldset
=
&
current
->
blocked
;
oldset
=
&
current
->
blocked
;
#ifdef CONFIG_SPARC32_COMPAT
#ifdef CONFIG_SPARC32_COMPAT
if
(
test_thread_flag
(
TIF_32BIT
))
{
if
(
test_thread_flag
(
TIF_32BIT
))
{
extern
int
do_signal32
(
sigset_t
*
,
struct
pt_regs
*
,
extern
void
do_signal32
(
sigset_t
*
,
struct
pt_regs
*
,
unsigned
long
,
int
);
unsigned
long
,
int
);
return
do_signal32
(
oldset
,
regs
,
orig_i0
,
do_signal32
(
oldset
,
regs
,
orig_i0
,
cookie
.
restart_syscall
);
cookie
.
restart_syscall
);
return
;
}
}
#endif
#endif
...
@@ -635,7 +550,15 @@ static int do_signal(sigset_t *oldset, struct pt_regs * regs,
...
@@ -635,7 +550,15 @@ static int do_signal(sigset_t *oldset, struct pt_regs * regs,
if
(
cookie
.
restart_syscall
)
if
(
cookie
.
restart_syscall
)
syscall_restart
(
orig_i0
,
regs
,
&
ka
.
sa
);
syscall_restart
(
orig_i0
,
regs
,
&
ka
.
sa
);
handle_signal
(
signr
,
&
ka
,
&
info
,
oldset
,
regs
);
handle_signal
(
signr
,
&
ka
,
&
info
,
oldset
,
regs
);
return
1
;
/* 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
;
}
}
if
(
cookie
.
restart_syscall
&&
if
(
cookie
.
restart_syscall
&&
(
regs
->
u_regs
[
UREG_I0
]
==
ERESTARTNOHAND
||
(
regs
->
u_regs
[
UREG_I0
]
==
ERESTARTNOHAND
||
...
@@ -652,15 +575,21 @@ static int do_signal(sigset_t *oldset, struct pt_regs * regs,
...
@@ -652,15 +575,21 @@ static int do_signal(sigset_t *oldset, struct pt_regs * regs,
regs
->
tpc
-=
4
;
regs
->
tpc
-=
4
;
regs
->
tnpc
-=
4
;
regs
->
tnpc
-=
4
;
}
}
return
0
;
/* 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
);
}
}
}
void
do_notify_resume
(
sigset_t
*
oldset
,
struct
pt_regs
*
regs
,
void
do_notify_resume
(
struct
pt_regs
*
regs
,
unsigned
long
orig_i0
,
int
restart_syscall
,
unsigned
long
orig_i0
,
int
restart_syscall
,
unsigned
long
thread_info_flags
)
unsigned
long
thread_info_flags
)
{
{
if
(
thread_info_flags
&
_TIF_SIGPENDING
)
if
(
thread_info_flags
&
(
_TIF_SIGPENDING
|
_TIF_RESTORE_SIGMASK
)
)
do_signal
(
oldset
,
regs
,
orig_i0
,
restart_syscall
);
do_signal
(
regs
,
orig_i0
,
restart_syscall
);
}
}
void
ptrace_signal_deliver
(
struct
pt_regs
*
regs
,
void
*
cookie
)
void
ptrace_signal_deliver
(
struct
pt_regs
*
regs
,
void
*
cookie
)
...
...
arch/sparc64/kernel/signal32.c
浏览文件 @
02829f73
...
@@ -32,9 +32,6 @@
...
@@ -32,9 +32,6 @@
#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
int
do_signal32
(
sigset_t
*
oldset
,
struct
pt_regs
*
regs
,
unsigned
long
orig_o0
,
int
ret_from_syscall
);
/* Signal frames: the original one (compatible with SunOS):
/* Signal frames: the original one (compatible with SunOS):
*
*
* Set up a signal frame... Make the stack look the way SunOS
* Set up a signal frame... Make the stack look the way SunOS
...
@@ -226,102 +223,6 @@ int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from)
...
@@ -226,102 +223,6 @@ int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from)
return
0
;
return
0
;
}
}
/*
* atomically swap in the new signal mask, and wait for a signal.
* This is really tricky on the Sparc, watch out...
*/
asmlinkage
void
_sigpause32_common
(
compat_old_sigset_t
set
,
struct
pt_regs
*
regs
)
{
sigset_t
saveset
;
set
&=
_BLOCKABLE
;
spin_lock_irq
(
&
current
->
sighand
->
siglock
);
saveset
=
current
->
blocked
;
siginitset
(
&
current
->
blocked
,
set
);
recalc_sigpending
();
spin_unlock_irq
(
&
current
->
sighand
->
siglock
);
regs
->
tpc
=
regs
->
tnpc
;
regs
->
tnpc
+=
4
;
if
(
test_thread_flag
(
TIF_32BIT
))
{
regs
->
tpc
&=
0xffffffff
;
regs
->
tnpc
&=
0xffffffff
;
}
/* Condition codes and return value where set here for sigpause,
* and so got used by setup_frame, which again causes sigreturn()
* to return -EINTR.
*/
while
(
1
)
{
current
->
state
=
TASK_INTERRUPTIBLE
;
schedule
();
/*
* Return -EINTR and set condition code here,
* so the interrupted system call actually returns
* these.
*/
regs
->
tstate
|=
TSTATE_ICARRY
;
regs
->
u_regs
[
UREG_I0
]
=
EINTR
;
if
(
do_signal32
(
&
saveset
,
regs
,
0
,
0
))
return
;
}
}
asmlinkage
void
do_rt_sigsuspend32
(
u32
uset
,
size_t
sigsetsize
,
struct
pt_regs
*
regs
)
{
sigset_t
oldset
,
set
;
compat_sigset_t
set32
;
/* XXX: Don't preclude handling different sized sigset_t's. */
if
(((
compat_size_t
)
sigsetsize
)
!=
sizeof
(
sigset_t
))
{
regs
->
tstate
|=
TSTATE_ICARRY
;
regs
->
u_regs
[
UREG_I0
]
=
EINVAL
;
return
;
}
if
(
copy_from_user
(
&
set32
,
compat_ptr
(
uset
),
sizeof
(
set32
)))
{
regs
->
tstate
|=
TSTATE_ICARRY
;
regs
->
u_regs
[
UREG_I0
]
=
EFAULT
;
return
;
}
switch
(
_NSIG_WORDS
)
{
case
4
:
set
.
sig
[
3
]
=
set32
.
sig
[
6
]
+
(((
long
)
set32
.
sig
[
7
])
<<
32
);
case
3
:
set
.
sig
[
2
]
=
set32
.
sig
[
4
]
+
(((
long
)
set32
.
sig
[
5
])
<<
32
);
case
2
:
set
.
sig
[
1
]
=
set32
.
sig
[
2
]
+
(((
long
)
set32
.
sig
[
3
])
<<
32
);
case
1
:
set
.
sig
[
0
]
=
set32
.
sig
[
0
]
+
(((
long
)
set32
.
sig
[
1
])
<<
32
);
}
sigdelsetmask
(
&
set
,
~
_BLOCKABLE
);
spin_lock_irq
(
&
current
->
sighand
->
siglock
);
oldset
=
current
->
blocked
;
current
->
blocked
=
set
;
recalc_sigpending
();
spin_unlock_irq
(
&
current
->
sighand
->
siglock
);
regs
->
tpc
=
regs
->
tnpc
;
regs
->
tnpc
+=
4
;
if
(
test_thread_flag
(
TIF_32BIT
))
{
regs
->
tpc
&=
0xffffffff
;
regs
->
tnpc
&=
0xffffffff
;
}
/* Condition codes and return value where set here for sigpause,
* and so got used by setup_frame, which again causes sigreturn()
* to return -EINTR.
*/
while
(
1
)
{
current
->
state
=
TASK_INTERRUPTIBLE
;
schedule
();
/*
* Return -EINTR and set condition code here,
* so the interrupted system call actually returns
* these.
*/
regs
->
tstate
|=
TSTATE_ICARRY
;
regs
->
u_regs
[
UREG_I0
]
=
EINTR
;
if
(
do_signal32
(
&
oldset
,
regs
,
0
,
0
))
return
;
}
}
static
int
restore_fpu_state32
(
struct
pt_regs
*
regs
,
__siginfo_fpu_t
__user
*
fpu
)
static
int
restore_fpu_state32
(
struct
pt_regs
*
regs
,
__siginfo_fpu_t
__user
*
fpu
)
{
{
unsigned
long
*
fpregs
=
current_thread_info
()
->
fpregs
;
unsigned
long
*
fpregs
=
current_thread_info
()
->
fpregs
;
...
@@ -1362,7 +1263,7 @@ static inline void syscall_restart32(unsigned long orig_i0, struct pt_regs *regs
...
@@ -1362,7 +1263,7 @@ static inline void syscall_restart32(unsigned long orig_i0, struct pt_regs *regs
* want to handle. Thus you cannot kill init even with a SIGKILL even by
* want to handle. Thus you cannot kill init even with a SIGKILL even by
* mistake.
* mistake.
*/
*/
int
do_signal32
(
sigset_t
*
oldset
,
struct
pt_regs
*
regs
,
void
do_signal32
(
sigset_t
*
oldset
,
struct
pt_regs
*
regs
,
unsigned
long
orig_i0
,
int
restart_syscall
)
unsigned
long
orig_i0
,
int
restart_syscall
)
{
{
siginfo_t
info
;
siginfo_t
info
;
...
@@ -1380,7 +1281,15 @@ int do_signal32(sigset_t *oldset, struct pt_regs * regs,
...
@@ -1380,7 +1281,15 @@ int do_signal32(sigset_t *oldset, struct pt_regs * regs,
syscall_restart32
(
orig_i0
,
regs
,
&
ka
.
sa
);
syscall_restart32
(
orig_i0
,
regs
,
&
ka
.
sa
);
handle_signal32
(
signr
,
&
ka
,
&
info
,
oldset
,
handle_signal32
(
signr
,
&
ka
,
&
info
,
oldset
,
regs
,
svr4_signal
);
regs
,
svr4_signal
);
return
1
;
/* 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
;
}
}
if
(
cookie
.
restart_syscall
&&
if
(
cookie
.
restart_syscall
&&
(
regs
->
u_regs
[
UREG_I0
]
==
ERESTARTNOHAND
||
(
regs
->
u_regs
[
UREG_I0
]
==
ERESTARTNOHAND
||
...
@@ -1397,7 +1306,14 @@ int do_signal32(sigset_t *oldset, struct pt_regs * regs,
...
@@ -1397,7 +1306,14 @@ int do_signal32(sigset_t *oldset, struct pt_regs * regs,
regs
->
tpc
-=
4
;
regs
->
tpc
-=
4
;
regs
->
tnpc
-=
4
;
regs
->
tnpc
-=
4
;
}
}
return
0
;
/* 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
);
}
}
}
struct
sigstack32
{
struct
sigstack32
{
...
...
arch/sparc64/kernel/sparc64_ksyms.c
浏览文件 @
02829f73
...
@@ -69,7 +69,6 @@ struct poll {
...
@@ -69,7 +69,6 @@ struct poll {
extern
void
die_if_kernel
(
char
*
str
,
struct
pt_regs
*
regs
);
extern
void
die_if_kernel
(
char
*
str
,
struct
pt_regs
*
regs
);
extern
pid_t
kernel_thread
(
int
(
*
fn
)(
void
*
),
void
*
arg
,
unsigned
long
flags
);
extern
pid_t
kernel_thread
(
int
(
*
fn
)(
void
*
),
void
*
arg
,
unsigned
long
flags
);
void
_sigpause_common
(
unsigned
int
set
,
struct
pt_regs
*
);
extern
void
*
__bzero
(
void
*
,
size_t
);
extern
void
*
__bzero
(
void
*
,
size_t
);
extern
void
*
__memscan_zero
(
void
*
,
size_t
);
extern
void
*
__memscan_zero
(
void
*
,
size_t
);
extern
void
*
__memscan_generic
(
void
*
,
int
,
size_t
);
extern
void
*
__memscan_generic
(
void
*
,
int
,
size_t
);
...
@@ -236,9 +235,10 @@ EXPORT_SYMBOL(pci_dma_supported);
...
@@ -236,9 +235,10 @@ EXPORT_SYMBOL(pci_dma_supported);
/* I/O device mmaping on Sparc64. */
/* I/O device mmaping on Sparc64. */
EXPORT_SYMBOL
(
io_remap_pfn_range
);
EXPORT_SYMBOL
(
io_remap_pfn_range
);
#ifdef CONFIG_COMPAT
/* Solaris/SunOS binary compatibility */
/* Solaris/SunOS binary compatibility */
EXPORT_SYMBOL
(
_sigpause_common
);
EXPORT_SYMBOL
(
verify_compat_iovec
);
EXPORT_SYMBOL
(
verify_compat_iovec
);
#endif
EXPORT_SYMBOL
(
dump_fpu
);
EXPORT_SYMBOL
(
dump_fpu
);
EXPORT_SYMBOL
(
pte_alloc_one_kernel
);
EXPORT_SYMBOL
(
pte_alloc_one_kernel
);
...
...
arch/sparc64/kernel/systbls.S
浏览文件 @
02829f73
...
@@ -41,7 +41,7 @@ sys_call_table32:
...
@@ -41,7 +41,7 @@ sys_call_table32:
/*
90
*/
.
word
sys_dup2
,
sys_setfsuid
,
compat_sys_fcntl
,
sys32_select
,
sys_setfsgid
/*
90
*/
.
word
sys_dup2
,
sys_setfsuid
,
compat_sys_fcntl
,
sys32_select
,
sys_setfsgid
.
word
sys_fsync
,
sys32_setpriority
,
sys_nis_syscall
,
sys_nis_syscall
,
sys_nis_syscall
.
word
sys_fsync
,
sys32_setpriority
,
sys_nis_syscall
,
sys_nis_syscall
,
sys_nis_syscall
/*
100
*/
.
word
sys32_getpriority
,
sys32_rt_sigreturn
,
sys32_rt_sigaction
,
sys32_rt_sigprocmask
,
sys32_rt_sigpending
/*
100
*/
.
word
sys32_getpriority
,
sys32_rt_sigreturn
,
sys32_rt_sigaction
,
sys32_rt_sigprocmask
,
sys32_rt_sigpending
.
word
compat_sys_rt_sigtimedwait
,
sys32_rt_sigqueueinfo
,
sys32
_rt_sigsuspend
,
sys_setresuid
,
sys_getresuid
.
word
compat_sys_rt_sigtimedwait
,
sys32_rt_sigqueueinfo
,
compat_sys
_rt_sigsuspend
,
sys_setresuid
,
sys_getresuid
/*
110
*/
.
word
sys_setresgid
,
sys_getresgid
,
sys_setregid
,
sys_nis_syscall
,
sys_nis_syscall
/*
110
*/
.
word
sys_setresgid
,
sys_getresgid
,
sys_setregid
,
sys_nis_syscall
,
sys_nis_syscall
.
word
sys32_getgroups
,
sys32_gettimeofday
,
sys32_getrusage
,
sys_nis_syscall
,
sys_getcwd
.
word
sys32_getgroups
,
sys32_gettimeofday
,
sys32_getrusage
,
sys_nis_syscall
,
sys_getcwd
/*
120
*/
.
word
compat_sys_readv
,
compat_sys_writev
,
sys32_settimeofday
,
sys32_fchown16
,
sys_fchmod
/*
120
*/
.
word
compat_sys_readv
,
compat_sys_writev
,
sys32_settimeofday
,
sys32_fchown16
,
sys_fchmod
...
@@ -76,7 +76,10 @@ sys_call_table32:
...
@@ -76,7 +76,10 @@ sys_call_table32:
.
word
sys_timer_delete
,
compat_sys_timer_create
,
sys_ni_syscall
,
compat_sys_io_setup
,
sys_io_destroy
.
word
sys_timer_delete
,
compat_sys_timer_create
,
sys_ni_syscall
,
compat_sys_io_setup
,
sys_io_destroy
/*
270
*/
.
word
sys32_io_submit
,
sys_io_cancel
,
compat_sys_io_getevents
,
sys32_mq_open
,
sys_mq_unlink
/*
270
*/
.
word
sys32_io_submit
,
sys_io_cancel
,
compat_sys_io_getevents
,
sys32_mq_open
,
sys_mq_unlink
.
word
compat_sys_mq_timedsend
,
compat_sys_mq_timedreceive
,
compat_sys_mq_notify
,
compat_sys_mq_getsetattr
,
compat_sys_waitid
.
word
compat_sys_mq_timedsend
,
compat_sys_mq_timedreceive
,
compat_sys_mq_notify
,
compat_sys_mq_getsetattr
,
compat_sys_waitid
/*
280
*/
.
word
sys_ni_syscall
,
sys_add_key
,
sys_request_key
,
sys_keyctl
/*
280
*/
.
word
sys_ni_syscall
,
sys_add_key
,
sys_request_key
,
sys_keyctl
,
compat_sys_openat
.
word
sys_mkdirat
,
sys_mknodat
,
sys_fchownat
,
sys_futimesat
,
compat_sys_newfstatat
/*
285
*/
.
word
sys_unlinkat
,
sys_renameat
,
sys_linkat
,
sys_symlinkat
,
sys_readlinkat
.
word
sys_fchmodat
,
sys_faccessat
,
compat_sys_pselect6
,
compat_sys_ppoll
#endif /* CONFIG_COMPAT */
#endif /* CONFIG_COMPAT */
...
@@ -142,7 +145,10 @@ sys_call_table:
...
@@ -142,7 +145,10 @@ sys_call_table:
.
word
sys_timer_delete
,
sys_timer_create
,
sys_ni_syscall
,
sys_io_setup
,
sys_io_destroy
.
word
sys_timer_delete
,
sys_timer_create
,
sys_ni_syscall
,
sys_io_setup
,
sys_io_destroy
/*
270
*/
.
word
sys_io_submit
,
sys_io_cancel
,
sys_io_getevents
,
sys_mq_open
,
sys_mq_unlink
/*
270
*/
.
word
sys_io_submit
,
sys_io_cancel
,
sys_io_getevents
,
sys_mq_open
,
sys_mq_unlink
.
word
sys_mq_timedsend
,
sys_mq_timedreceive
,
sys_mq_notify
,
sys_mq_getsetattr
,
sys_waitid
.
word
sys_mq_timedsend
,
sys_mq_timedreceive
,
sys_mq_notify
,
sys_mq_getsetattr
,
sys_waitid
/*
280
*/
.
word
sys_nis_syscall
,
sys_add_key
,
sys_request_key
,
sys_keyctl
/*
280
*/
.
word
sys_nis_syscall
,
sys_add_key
,
sys_request_key
,
sys_keyctl
,
sys_openat
.
word
sys_mkdirat
,
sys_mknodat
,
sys_fchownat
,
sys_futimesat
,
compat_sys_newfstatat
/*
285
*/
.
word
sys_unlinkat
,
sys_renameat
,
sys_linkat
,
sys_symlinkat
,
sys_readlinkat
.
word
sys_fchmodat
,
sys_faccessat
,
sys_pselect6
,
sys_ppoll
#if defined(CONFIG_SUNOS_EMUL) || defined(CONFIG_SOLARIS_EMUL) || \
#if defined(CONFIG_SUNOS_EMUL) || defined(CONFIG_SOLARIS_EMUL) || \
defined
(
CONFIG_SOLARIS_EMUL_MODULE
)
defined
(
CONFIG_SOLARIS_EMUL_MODULE
)
...
@@ -239,13 +245,20 @@ sunos_sys_table:
...
@@ -239,13 +245,20 @@ sunos_sys_table:
/*
250
*/
.
word
sunos_nosys
,
sunos_nosys
,
sunos_nosys
/*
250
*/
.
word
sunos_nosys
,
sunos_nosys
,
sunos_nosys
.
word
sunos_nosys
,
sunos_nosys
,
sunos_nosys
.
word
sunos_nosys
,
sunos_nosys
,
sunos_nosys
.
word
sunos_nosys
,
sunos_nosys
,
sunos_nosys
.
word
sunos_nosys
,
sunos_nosys
,
sunos_nosys
.
word
sunos_nosys
/*
260
*/
.
word
sunos_nosys
,
sunos_nosys
,
sunos_nosys
.
word
sunos_nosys
,
sunos_nosys
,
sunos_nosys
.
word
sunos_nosys
,
sunos_nosys
,
sunos_nosys
.
word
sunos_nosys
,
sunos_nosys
,
sunos_nosys
.
word
sunos_nosys
,
sunos_nosys
,
sunos_nosys
.
word
sunos_nosys
/*
270
*/
.
word
sunos_nosys
,
sunos_nosys
,
sunos_nosys
.
word
sunos_nosys
,
sunos_nosys
,
sunos_nosys
.
word
sunos_nosys
,
sunos_nosys
,
sunos_nosys
.
word
sunos_nosys
,
sunos_nosys
,
sunos_nosys
.
word
sunos_nosys
,
sunos_nosys
,
sunos_nosys
.
word
sunos_nosys
/*
280
*/
.
word
sunos_nosys
,
sunos_nosys
,
sunos_nosys
.
word
sunos_nosys
,
sunos_nosys
,
sunos_nosys
.
word
sunos_nosys
,
sunos_nosys
,
sunos_nosys
.
word
sunos_nosys
,
sunos_nosys
,
sunos_nosys
.
word
sunos_nosys
,
sunos_nosys
,
sunos_nosys
.
word
sunos_nosys
/*
290
*/
.
word
sunos_nosys
,
sunos_nosys
,
sunos_nosys
.
word
sunos_nosys
,
sunos_nosys
,
sunos_nosys
.
word
sunos_nosys
,
sunos_nosys
,
sunos_nosys
.
word
sunos_nosys
,
sunos_nosys
,
sunos_nosys
.
word
sunos_nosys
,
sunos_nosys
,
sunos_nosys
.
word
sunos_nosys
#endif
#endif
arch/sparc64/solaris/entry64.S
浏览文件 @
02829f73
...
@@ -180,6 +180,8 @@ solaris_sigsuspend:
...
@@ -180,6 +180,8 @@ solaris_sigsuspend:
nop
nop
call
sys_sigsuspend
call
sys_sigsuspend
stx
%
o0
,
[%
sp
+
PTREGS_OFF
+
PT_V9_I0
]
stx
%
o0
,
[%
sp
+
PTREGS_OFF
+
PT_V9_I0
]
b
,
pt
%
xcc
,
ret_from_solaris
nop
.
globl
solaris_getpid
.
globl
solaris_getpid
solaris_getpid
:
solaris_getpid
:
...
...
include/asm-sparc/oplib.h
浏览文件 @
02829f73
...
@@ -164,6 +164,7 @@ enum prom_input_device {
...
@@ -164,6 +164,7 @@ enum prom_input_device {
PROMDEV_IKBD
,
/* input from keyboard */
PROMDEV_IKBD
,
/* input from keyboard */
PROMDEV_ITTYA
,
/* input from ttya */
PROMDEV_ITTYA
,
/* input from ttya */
PROMDEV_ITTYB
,
/* input from ttyb */
PROMDEV_ITTYB
,
/* input from ttyb */
PROMDEV_IRSC
,
/* input from rsc */
PROMDEV_I_UNK
,
PROMDEV_I_UNK
,
};
};
...
@@ -175,6 +176,7 @@ enum prom_output_device {
...
@@ -175,6 +176,7 @@ enum prom_output_device {
PROMDEV_OSCREEN
,
/* to screen */
PROMDEV_OSCREEN
,
/* to screen */
PROMDEV_OTTYA
,
/* to ttya */
PROMDEV_OTTYA
,
/* to ttya */
PROMDEV_OTTYB
,
/* to ttyb */
PROMDEV_OTTYB
,
/* to ttyb */
PROMDEV_ORSC
,
/* to rsc */
PROMDEV_O_UNK
,
PROMDEV_O_UNK
,
};
};
...
...
include/asm-sparc/thread_info.h
浏览文件 @
02829f73
...
@@ -128,9 +128,10 @@ BTFIXUPDEF_CALL(void, free_thread_info, struct thread_info *)
...
@@ -128,9 +128,10 @@ BTFIXUPDEF_CALL(void, free_thread_info, struct thread_info *)
* thread information flag bit numbers
* thread information flag bit numbers
*/
*/
#define TIF_SYSCALL_TRACE 0
/* syscall trace active */
#define TIF_SYSCALL_TRACE 0
/* syscall trace active */
#define TIF_NOTIFY_RESUME 1
/* resumption notification requested
*/
/* flag bit 1 is available
*/
#define TIF_SIGPENDING 2
/* signal pending */
#define TIF_SIGPENDING 2
/* signal pending */
#define TIF_NEED_RESCHED 3
/* rescheduling necessary */
#define TIF_NEED_RESCHED 3
/* rescheduling necessary */
#define TIF_RESTORE_SIGMASK 4
/* restore signal mask in do_signal() */
#define TIF_USEDFPU 8
/* FPU was used by this task
#define TIF_USEDFPU 8
/* FPU was used by this task
* this quantum (SMP) */
* this quantum (SMP) */
#define TIF_POLLING_NRFLAG 9
/* true if poll_idle() is polling
#define TIF_POLLING_NRFLAG 9
/* true if poll_idle() is polling
...
@@ -139,9 +140,9 @@ BTFIXUPDEF_CALL(void, free_thread_info, struct thread_info *)
...
@@ -139,9 +140,9 @@ BTFIXUPDEF_CALL(void, free_thread_info, struct thread_info *)
/* as above, but as bit values */
/* as above, but as bit values */
#define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE)
#define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE)
#define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME)
#define _TIF_SIGPENDING (1<<TIF_SIGPENDING)
#define _TIF_SIGPENDING (1<<TIF_SIGPENDING)
#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED)
#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED)
#define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK)
#define _TIF_USEDFPU (1<<TIF_USEDFPU)
#define _TIF_USEDFPU (1<<TIF_USEDFPU)
#define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG)
#define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG)
...
...
include/asm-sparc/unistd.h
浏览文件 @
02829f73
...
@@ -300,11 +300,26 @@
...
@@ -300,11 +300,26 @@
#define __NR_add_key 281
#define __NR_add_key 281
#define __NR_request_key 282
#define __NR_request_key 282
#define __NR_keyctl 283
#define __NR_keyctl 283
#define __NR_openat 284
#define __NR_mkdirat 285
#define __NR_mknodat 286
#define __NR_fchownat 287
#define __NR_futimesat 288
#define __NR_newfstatat 289
#define __NR_unlinkat 290
#define __NR_renameat 291
#define __NR_linkat 292
#define __NR_symlinkat 293
#define __NR_readlinkat 294
#define __NR_fchmodat 295
#define __NR_faccessat 296
#define __NR_pselect6 297
#define __NR_ppoll 298
/* WARNING: You MAY NOT add syscall numbers larger than 2
83
, since
/* WARNING: You MAY NOT add syscall numbers larger than 2
98
, since
* all of the syscall tables in the Sparc kernel are
* all of the syscall tables in the Sparc kernel are
* sized to have 2
83
entries (starting at zero). Therefore
* sized to have 2
98
entries (starting at zero). Therefore
* find a free slot in the 0-2
82
range.
* find a free slot in the 0-2
98
range.
*/
*/
#define _syscall0(type,name) \
#define _syscall0(type,name) \
...
@@ -458,6 +473,7 @@ return -1; \
...
@@ -458,6 +473,7 @@ return -1; \
#define __ARCH_WANT_SYS_OLDUMOUNT
#define __ARCH_WANT_SYS_OLDUMOUNT
#define __ARCH_WANT_SYS_SIGPENDING
#define __ARCH_WANT_SYS_SIGPENDING
#define __ARCH_WANT_SYS_SIGPROCMASK
#define __ARCH_WANT_SYS_SIGPROCMASK
#define __ARCH_WANT_SYS_RT_SIGSUSPEND
#endif
#endif
#ifdef __KERNEL_SYSCALLS__
#ifdef __KERNEL_SYSCALLS__
...
...
include/asm-sparc64/thread_info.h
浏览文件 @
02829f73
...
@@ -221,7 +221,7 @@ register struct thread_info *current_thread_info_reg asm("g6");
...
@@ -221,7 +221,7 @@ register struct thread_info *current_thread_info_reg asm("g6");
* nop
* nop
*/
*/
#define TIF_SYSCALL_TRACE 0
/* syscall trace active */
#define TIF_SYSCALL_TRACE 0
/* syscall trace active */
#define TIF_
NOTIFY_RESUME 1
/* resumption notification requested
*/
#define TIF_
RESTORE_SIGMASK 1
/* restore signal mask in do_signal()
*/
#define TIF_SIGPENDING 2
/* signal pending */
#define TIF_SIGPENDING 2
/* signal pending */
#define TIF_NEED_RESCHED 3
/* rescheduling necessary */
#define TIF_NEED_RESCHED 3
/* rescheduling necessary */
#define TIF_PERFCTR 4
/* performance counters active */
#define TIF_PERFCTR 4
/* performance counters active */
...
@@ -241,7 +241,6 @@ register struct thread_info *current_thread_info_reg asm("g6");
...
@@ -241,7 +241,6 @@ register struct thread_info *current_thread_info_reg asm("g6");
#define TIF_POLLING_NRFLAG 14
#define TIF_POLLING_NRFLAG 14
#define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE)
#define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE)
#define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME)
#define _TIF_SIGPENDING (1<<TIF_SIGPENDING)
#define _TIF_SIGPENDING (1<<TIF_SIGPENDING)
#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED)
#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED)
#define _TIF_PERFCTR (1<<TIF_PERFCTR)
#define _TIF_PERFCTR (1<<TIF_PERFCTR)
...
@@ -250,11 +249,12 @@ register struct thread_info *current_thread_info_reg asm("g6");
...
@@ -250,11 +249,12 @@ register struct thread_info *current_thread_info_reg asm("g6");
#define _TIF_32BIT (1<<TIF_32BIT)
#define _TIF_32BIT (1<<TIF_32BIT)
#define _TIF_SECCOMP (1<<TIF_SECCOMP)
#define _TIF_SECCOMP (1<<TIF_SECCOMP)
#define _TIF_SYSCALL_AUDIT (1<<TIF_SYSCALL_AUDIT)
#define _TIF_SYSCALL_AUDIT (1<<TIF_SYSCALL_AUDIT)
#define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK)
#define _TIF_ABI_PENDING (1<<TIF_ABI_PENDING)
#define _TIF_ABI_PENDING (1<<TIF_ABI_PENDING)
#define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG)
#define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG)
#define _TIF_USER_WORK_MASK ((0xff << TI_FLAG_WSAVED_SHIFT) | \
#define _TIF_USER_WORK_MASK ((0xff << TI_FLAG_WSAVED_SHIFT) | \
(_TIF_
NOTIFY_RESUME | _TIF_SIGPENDING
| \
(_TIF_
SIGPENDING | _TIF_RESTORE_SIGMASK
| \
_TIF_NEED_RESCHED | _TIF_PERFCTR))
_TIF_NEED_RESCHED | _TIF_PERFCTR))
#endif
/* __KERNEL__ */
#endif
/* __KERNEL__ */
...
...
include/asm-sparc64/unistd.h
浏览文件 @
02829f73
...
@@ -302,11 +302,26 @@
...
@@ -302,11 +302,26 @@
#define __NR_add_key 281
#define __NR_add_key 281
#define __NR_request_key 282
#define __NR_request_key 282
#define __NR_keyctl 283
#define __NR_keyctl 283
#define __NR_openat 284
#define __NR_mkdirat 285
#define __NR_mknodat 286
#define __NR_fchownat 287
#define __NR_futimesat 288
#define __NR_newfstatat 289
#define __NR_unlinkat 290
#define __NR_renameat 291
#define __NR_linkat 292
#define __NR_symlinkat 293
#define __NR_readlinkat 294
#define __NR_fchmodat 295
#define __NR_faccessat 296
#define __NR_pselect6 297
#define __NR_ppoll 298
/* WARNING: You MAY NOT add syscall numbers larger than 2
83
, since
/* WARNING: You MAY NOT add syscall numbers larger than 2
98
, since
* all of the syscall tables in the Sparc kernel are
* all of the syscall tables in the Sparc kernel are
* sized to have 2
83
entries (starting at zero). Therefore
* sized to have 2
98
entries (starting at zero). Therefore
* find a free slot in the 0-2
82
range.
* find a free slot in the 0-2
98
range.
*/
*/
#define _syscall0(type,name) \
#define _syscall0(type,name) \
...
@@ -501,6 +516,8 @@ asmlinkage long sys_rt_sigaction(int sig,
...
@@ -501,6 +516,8 @@ asmlinkage long sys_rt_sigaction(int sig,
#define __ARCH_WANT_SYS_OLDUMOUNT
#define __ARCH_WANT_SYS_OLDUMOUNT
#define __ARCH_WANT_SYS_SIGPENDING
#define __ARCH_WANT_SYS_SIGPENDING
#define __ARCH_WANT_SYS_SIGPROCMASK
#define __ARCH_WANT_SYS_SIGPROCMASK
#define __ARCH_WANT_SYS_RT_SIGSUSPEND
#define __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND
#endif
#endif
/*
/*
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录