Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
69b58a67
cloud-kernel
项目概览
openanolis
/
cloud-kernel
接近 2 年 前同步成功
通知
170
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看板
提交
69b58a67
编写于
10月 03, 2012
作者:
A
Al Viro
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
cris: switch to generic kernel_thread()
Signed-off-by:
N
Al Viro
<
viro@zeniv.linux.org.uk
>
上级
ddffeb8c
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
69 addition
and
115 deletion
+69
-115
arch/cris/Kconfig
arch/cris/Kconfig
+1
-0
arch/cris/arch-v10/kernel/entry.S
arch/cris/arch-v10/kernel/entry.S
+9
-1
arch/cris/arch-v10/kernel/process.c
arch/cris/arch-v10/kernel/process.c
+24
-59
arch/cris/arch-v32/kernel/entry.S
arch/cris/arch-v32/kernel/entry.S
+13
-0
arch/cris/arch-v32/kernel/process.c
arch/cris/arch-v32/kernel/process.c
+22
-52
arch/cris/include/asm/processor.h
arch/cris/include/asm/processor.h
+0
-2
arch/cris/kernel/crisksyms.c
arch/cris/kernel/crisksyms.c
+0
-1
未找到文件。
arch/cris/Kconfig
浏览文件 @
69b58a67
...
...
@@ -49,6 +49,7 @@ config CRIS
select GENERIC_SMP_IDLE_THREAD if ETRAX_ARCH_V32
select GENERIC_CMOS_UPDATE
select MODULES_USE_ELF_RELA
select GENERIC_KERNEL_THREAD
config HZ
int
...
...
arch/cris/arch-v10/kernel/entry.S
浏览文件 @
69b58a67
...
...
@@ -35,6 +35,7 @@
.
globl
system_call
.
globl
ret_from_intr
.
globl
ret_from_fork
.
globl
ret_from_kernel_thread
.
globl
resume
.
globl
multiple_interrupt
.
globl
hwbreakpoint
...
...
@@ -81,7 +82,14 @@ ret_from_fork:
jsr
schedule_tail
ba
ret_from_sys_call
nop
ret_from_kernel_thread
:
jsr
schedule_tail
move.d
$r2
,
$r10
; argument is here
jsr
$r1
; call the payload
moveq
0
,
$r10
jsr
sys_exit
; never returns
ret_from_intr
:
;; check for resched if preemptive kernel or if we're going back to user-mode
;; this test matches the user_regs(regs) macro
...
...
arch/cris/arch-v10/kernel/process.c
浏览文件 @
69b58a67
...
...
@@ -17,6 +17,7 @@
#include <arch/svinto.h>
#include <linux/init.h>
#include <arch/system.h>
#include <asm/ptrace.h>
#ifdef CONFIG_ETRAX_GPIO
void
etrax_gpio_wake_up_check
(
void
);
/* drivers/gpio.c */
...
...
@@ -81,31 +82,6 @@ unsigned long thread_saved_pc(struct task_struct *t)
return
task_pt_regs
(
t
)
->
irp
;
}
static
void
kernel_thread_helper
(
void
*
dummy
,
int
(
*
fn
)(
void
*
),
void
*
arg
)
{
fn
(
arg
);
do_exit
(
-
1
);
/* Should never be called, return bad exit value */
}
/*
* Create a kernel thread
*/
int
kernel_thread
(
int
(
*
fn
)(
void
*
),
void
*
arg
,
unsigned
long
flags
)
{
struct
pt_regs
regs
;
memset
(
&
regs
,
0
,
sizeof
(
regs
));
/* Don't use r10 since that is set to 0 in copy_thread */
regs
.
r11
=
(
unsigned
long
)
fn
;
regs
.
r12
=
(
unsigned
long
)
arg
;
regs
.
irp
=
(
unsigned
long
)
kernel_thread_helper
;
regs
.
dccr
=
1
<<
I_DCCR_BITNR
;
/* Ok, create the new process.. */
return
do_fork
(
flags
|
CLONE_VM
|
CLONE_UNTRACED
,
0
,
&
regs
,
0
,
NULL
,
NULL
);
}
/* setup the child's kernel stack with a pt_regs and switch_stack on it.
* it will be un-nested during _resume and _ret_from_sys_call when the
* new thread is scheduled.
...
...
@@ -115,29 +91,35 @@ int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
*
*/
asmlinkage
void
ret_from_fork
(
void
);
asmlinkage
void
ret_from_kernel_thread
(
void
);
int
copy_thread
(
unsigned
long
clone_flags
,
unsigned
long
usp
,
unsigned
long
unused
,
unsigned
long
arg
,
struct
task_struct
*
p
,
struct
pt_regs
*
regs
)
{
struct
pt_regs
*
childregs
;
struct
switch_stack
*
swstack
;
struct
pt_regs
*
childregs
=
task_pt_regs
(
p
)
;
struct
switch_stack
*
swstack
=
((
struct
switch_stack
*
)
childregs
)
-
1
;
/* put the pt_regs structure at the end of the new kernel stack page and fix it up
* remember that the task_struct doubles as the kernel stack for the task
*/
childregs
=
task_pt_regs
(
p
);
if
(
unlikely
(
p
->
flags
&
PF_KTHREAD
))
{
memset
(
swstack
,
0
,
sizeof
(
struct
switch_stack
)
+
sizeof
(
struct
pt_regs
));
swstack
->
r1
=
usp
;
swstack
->
r2
=
arg
;
childregs
->
dccr
=
1
<<
I_DCCR_BITNR
;
swstack
->
return_ip
=
(
unsigned
long
)
ret_from_kernel_thread
;
p
->
thread
.
ksp
=
(
unsigned
long
)
swstack
;
p
->
thread
.
usp
=
0
;
return
0
;
}
*
childregs
=
*
regs
;
/* struct copy of pt_regs */
p
->
set_child_tid
=
p
->
clear_child_tid
=
NULL
;
childregs
->
r10
=
0
;
/* child returns 0 after a fork/clone */
/* put the switch stack right below the pt_regs */
swstack
=
((
struct
switch_stack
*
)
childregs
)
-
1
;
/* put the switch stack right below the pt_regs */
swstack
->
r9
=
0
;
/* parameter to ret_from_sys_call, 0 == dont restart the syscall */
...
...
@@ -147,7 +129,7 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
/* fix the user-mode stackpointer */
p
->
thread
.
usp
=
usp
;
p
->
thread
.
usp
=
usp
;
/* and the kernel-mode one */
...
...
@@ -161,45 +143,28 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
return
0
;
}
/*
* Be aware of the "magic" 7th argument in the four system-calls below.
* They need the latest stackframe, which is put as the 7th argument by
* entry.S. The previous arguments are dummies or actually used, but need
* to be defined to reach the 7th argument.
*
* N.B.: Another method to get the stackframe is to use current_regs(). But
* it returns the latest stack-frame stacked when going from _user mode_ and
* some of these (at least sys_clone) are called from kernel-mode sometimes
* (for example during kernel_thread, above) and thus cannot use it. Thus,
* to be sure not to get any surprises, we use the method for the other calls
* as well.
*/
asmlinkage
int
sys_fork
(
long
r10
,
long
r11
,
long
r12
,
long
r13
,
long
mof
,
long
srp
,
struct
pt_regs
*
regs
)
asmlinkage
int
sys_fork
(
void
)
{
return
do_fork
(
SIGCHLD
,
rdusp
(),
regs
,
0
,
NULL
,
NULL
);
return
do_fork
(
SIGCHLD
,
rdusp
(),
current_pt_regs
()
,
0
,
NULL
,
NULL
);
}
/* if newusp is 0, we just grab the old usp */
/* FIXME: Is parent_tid/child_tid really third/fourth argument? Update lib? */
asmlinkage
int
sys_clone
(
unsigned
long
newusp
,
unsigned
long
flags
,
int
*
parent_tid
,
int
*
child_tid
,
long
mof
,
long
srp
,
struct
pt_regs
*
regs
)
int
*
parent_tid
,
int
*
child_tid
)
{
if
(
!
newusp
)
newusp
=
rdusp
();
return
do_fork
(
flags
,
newusp
,
regs
,
0
,
parent_tid
,
child_tid
);
return
do_fork
(
flags
,
newusp
,
current_pt_regs
()
,
0
,
parent_tid
,
child_tid
);
}
/* vfork is a system call in i386 because of register-pressure - maybe
* we can remove it and handle it in libc but we put it here until then.
*/
asmlinkage
int
sys_vfork
(
long
r10
,
long
r11
,
long
r12
,
long
r13
,
long
mof
,
long
srp
,
struct
pt_regs
*
regs
)
asmlinkage
int
sys_vfork
(
void
)
{
return
do_fork
(
CLONE_VFORK
|
CLONE_VM
|
SIGCHLD
,
rdusp
(),
regs
,
0
,
NULL
,
NULL
);
return
do_fork
(
CLONE_VFORK
|
CLONE_VM
|
SIGCHLD
,
rdusp
(),
current_pt_regs
()
,
0
,
NULL
,
NULL
);
}
/*
...
...
arch/cris/arch-v32/kernel/entry.S
浏览文件 @
69b58a67
...
...
@@ -31,6 +31,7 @@
.
globl
system_call
.
globl
ret_from_intr
.
globl
ret_from_fork
.
globl
ret_from_kernel_thread
.
globl
resume
.
globl
multiple_interrupt
.
globl
nmi_interrupt
...
...
@@ -84,6 +85,18 @@ ret_from_fork:
nop
.
size
ret_from_fork
,
.
-
ret_from_fork
.
type
ret_from_kernel_thread
,
@
function
ret_from_kernel_thread
:
jsr
schedule_tail
nop
move.d
$r2
,
$r10
jsr
$r1
nop
moveq
0
,
$r10
jsr
sys_exit
nop
.
size
ret_from_kernel_thread
,
.
-
ret_from_kernel_thread
.
type
ret_from_intr
,
@
function
ret_from_intr
:
;; Check for resched if preemptive kernel, or if we're going back to
...
...
arch/cris/arch-v32/kernel/process.c
浏览文件 @
69b58a67
...
...
@@ -16,6 +16,7 @@
#include <hwregs/reg_map.h>
#include <hwregs/timer_defs.h>
#include <hwregs/intr_vect_defs.h>
#include <asm/ptrace.h>
extern
void
stop_watchdog
(
void
);
...
...
@@ -94,31 +95,6 @@ unsigned long thread_saved_pc(struct task_struct *t)
return
task_pt_regs
(
t
)
->
erp
;
}
static
void
kernel_thread_helper
(
void
*
dummy
,
int
(
*
fn
)(
void
*
),
void
*
arg
)
{
fn
(
arg
);
do_exit
(
-
1
);
/* Should never be called, return bad exit value. */
}
/* Create a kernel thread. */
int
kernel_thread
(
int
(
*
fn
)(
void
*
),
void
*
arg
,
unsigned
long
flags
)
{
struct
pt_regs
regs
;
memset
(
&
regs
,
0
,
sizeof
(
regs
));
/* Don't use r10 since that is set to 0 in copy_thread. */
regs
.
r11
=
(
unsigned
long
)
fn
;
regs
.
r12
=
(
unsigned
long
)
arg
;
regs
.
erp
=
(
unsigned
long
)
kernel_thread_helper
;
regs
.
ccs
=
1
<<
(
I_CCS_BITNR
+
CCS_SHIFT
);
/* Create the new process. */
return
do_fork
(
flags
|
CLONE_VM
|
CLONE_UNTRACED
,
0
,
&
regs
,
0
,
NULL
,
NULL
);
}
/*
* Setup the child's kernel stack with a pt_regs and call switch_stack() on it.
* It will be unnested during _resume and _ret_from_sys_call when the new thread
...
...
@@ -129,23 +105,33 @@ kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
*/
extern
asmlinkage
void
ret_from_fork
(
void
);
extern
asmlinkage
void
ret_from_kernel_thread
(
void
);
int
copy_thread
(
unsigned
long
clone_flags
,
unsigned
long
usp
,
unsigned
long
unused
,
unsigned
long
arg
,
struct
task_struct
*
p
,
struct
pt_regs
*
regs
)
{
struct
pt_regs
*
childregs
;
struct
switch_stack
*
swstack
;
struct
pt_regs
*
childregs
=
task_pt_regs
(
p
)
;
struct
switch_stack
*
swstack
=
((
struct
switch_stack
*
)
childregs
)
-
1
;
/*
* Put the pt_regs structure at the end of the new kernel stack page and
* fix it up. Note: the task_struct doubles as the kernel stack for the
* task.
*/
childregs
=
task_pt_regs
(
p
);
if
(
unlikely
(
p
->
flags
&
PF_KTHREAD
))
{
memset
(
swstack
,
0
,
sizeof
(
struct
switch_stack
)
+
sizeof
(
struct
pt_regs
));
swstack
->
r1
=
usp
;
swstack
->
r2
=
arg
;
childregs
->
ccs
=
1
<<
(
I_CCS_BITNR
+
CCS_SHIFT
);
swstack
->
return_ip
=
(
unsigned
long
)
ret_from_kernel_thread
;
p
->
thread
.
ksp
=
(
unsigned
long
)
swstack
;
p
->
thread
.
usp
=
0
;
return
0
;
}
*
childregs
=
*
regs
;
/* Struct copy of pt_regs. */
p
->
set_child_tid
=
p
->
clear_child_tid
=
NULL
;
childregs
->
r10
=
0
;
/* Child returns 0 after a fork/clone. */
/* Set a new TLS ?
...
...
@@ -156,7 +142,6 @@ copy_thread(unsigned long clone_flags, unsigned long usp,
}
/* Put the switch stack right below the pt_regs. */
swstack
=
((
struct
switch_stack
*
)
childregs
)
-
1
;
/* Parameter to ret_from_sys_call. 0 is don't restart the syscall. */
swstack
->
r9
=
0
;
...
...
@@ -174,35 +159,21 @@ copy_thread(unsigned long clone_flags, unsigned long usp,
return
0
;
}
/*
* Be aware of the "magic" 7th argument in the four system-calls below.
* They need the latest stackframe, which is put as the 7th argument by
* entry.S. The previous arguments are dummies or actually used, but need
* to be defined to reach the 7th argument.
*
* N.B.: Another method to get the stackframe is to use current_regs(). But
* it returns the latest stack-frame stacked when going from _user mode_ and
* some of these (at least sys_clone) are called from kernel-mode sometimes
* (for example during kernel_thread, above) and thus cannot use it. Thus,
* to be sure not to get any surprises, we use the method for the other calls
* as well.
*/
asmlinkage
int
sys_fork
(
long
r10
,
long
r11
,
long
r12
,
long
r13
,
long
mof
,
long
srp
,
struct
pt_regs
*
regs
)
sys_fork
(
void
)
{
return
do_fork
(
SIGCHLD
,
rdusp
(),
regs
,
0
,
NULL
,
NULL
);
return
do_fork
(
SIGCHLD
,
rdusp
(),
current_pt_regs
()
,
0
,
NULL
,
NULL
);
}
/* FIXME: Is parent_tid/child_tid really third/fourth argument? Update lib? */
asmlinkage
int
sys_clone
(
unsigned
long
newusp
,
unsigned
long
flags
,
int
*
parent_tid
,
int
*
child_tid
,
unsigned
long
tls
,
long
srp
,
struct
pt_regs
*
regs
)
unsigned
long
tls
)
{
if
(
!
newusp
)
newusp
=
rdusp
();
return
do_fork
(
flags
,
newusp
,
regs
,
0
,
parent_tid
,
child_tid
);
return
do_fork
(
flags
,
newusp
,
current_pt_regs
()
,
0
,
parent_tid
,
child_tid
);
}
/*
...
...
@@ -210,10 +181,9 @@ sys_clone(unsigned long newusp, unsigned long flags, int *parent_tid, int *child
* we can remove it and handle it in libc but we put it here until then.
*/
asmlinkage
int
sys_vfork
(
long
r10
,
long
r11
,
long
r12
,
long
r13
,
long
mof
,
long
srp
,
struct
pt_regs
*
regs
)
sys_vfork
(
void
)
{
return
do_fork
(
CLONE_VFORK
|
CLONE_VM
|
SIGCHLD
,
rdusp
(),
regs
,
0
,
NULL
,
NULL
);
return
do_fork
(
CLONE_VFORK
|
CLONE_VM
|
SIGCHLD
,
rdusp
(),
current_pt_regs
()
,
0
,
NULL
,
NULL
);
}
/* sys_execve() executes a new program. */
...
...
arch/cris/include/asm/processor.h
浏览文件 @
69b58a67
...
...
@@ -49,8 +49,6 @@ struct task_struct;
#define task_pt_regs(task) user_regs(task_thread_info(task))
#define current_regs() task_pt_regs(current)
extern
int
kernel_thread
(
int
(
*
fn
)(
void
*
),
void
*
arg
,
unsigned
long
flags
);
unsigned
long
get_wchan
(
struct
task_struct
*
p
);
#define KSTK_ESP(tsk) ((tsk) == current ? rdusp() : (tsk)->thread.usp)
...
...
arch/cris/kernel/crisksyms.c
浏览文件 @
69b58a67
...
...
@@ -30,7 +30,6 @@ extern void __negdi2(void);
extern
void
iounmap
(
volatile
void
*
__iomem
);
/* Platform dependent support */
EXPORT_SYMBOL
(
kernel_thread
);
EXPORT_SYMBOL
(
get_cmos_time
);
EXPORT_SYMBOL
(
loops_per_usec
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录