Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
raspberrypi-kernel
提交
9e0d5c45
R
raspberrypi-kernel
项目概览
openeuler
/
raspberrypi-kernel
通知
14
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
raspberrypi-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
9e0d5c45
编写于
8月 17, 2018
作者:
H
Helge Deller
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
parisc: Consolidate unwind initialization calls
Signed-off-by:
N
Helge Deller
<
deller@gmx.de
>
上级
54c770da
变更
4
显示空白变更内容
内联
并排
Showing
4 changed file
with
36 addition
and
57 deletion
+36
-57
arch/parisc/include/asm/unwind.h
arch/parisc/include/asm/unwind.h
+4
-2
arch/parisc/kernel/stacktrace.c
arch/parisc/kernel/stacktrace.c
+1
-14
arch/parisc/kernel/traps.c
arch/parisc/kernel/traps.c
+5
-30
arch/parisc/kernel/unwind.c
arch/parisc/kernel/unwind.c
+26
-11
未找到文件。
arch/parisc/include/asm/unwind.h
浏览文件 @
9e0d5c45
...
@@ -73,8 +73,10 @@ unwind_table_remove(struct unwind_table *table);
...
@@ -73,8 +73,10 @@ unwind_table_remove(struct unwind_table *table);
void
unwind_frame_init
(
struct
unwind_frame_info
*
info
,
struct
task_struct
*
t
,
void
unwind_frame_init
(
struct
unwind_frame_info
*
info
,
struct
task_struct
*
t
,
struct
pt_regs
*
regs
);
struct
pt_regs
*
regs
);
void
unwind_frame_init_from_blocked_task
(
struct
unwind_frame_info
*
info
,
struct
task_struct
*
t
);
void
unwind_frame_init_from_blocked_task
(
struct
unwind_frame_info
*
info
,
void
unwind_frame_init_running
(
struct
unwind_frame_info
*
info
,
struct
pt_regs
*
regs
);
struct
task_struct
*
t
);
void
unwind_frame_init_task
(
struct
unwind_frame_info
*
info
,
struct
task_struct
*
task
,
struct
pt_regs
*
regs
);
int
unwind_once
(
struct
unwind_frame_info
*
info
);
int
unwind_once
(
struct
unwind_frame_info
*
info
);
int
unwind_to_user
(
struct
unwind_frame_info
*
info
);
int
unwind_to_user
(
struct
unwind_frame_info
*
info
);
...
...
arch/parisc/kernel/stacktrace.c
浏览文件 @
9e0d5c45
...
@@ -16,20 +16,7 @@ static void dump_trace(struct task_struct *task, struct stack_trace *trace)
...
@@ -16,20 +16,7 @@ static void dump_trace(struct task_struct *task, struct stack_trace *trace)
{
{
struct
unwind_frame_info
info
;
struct
unwind_frame_info
info
;
/* initialize unwind info */
unwind_frame_init_task
(
&
info
,
task
,
NULL
);
if
(
task
==
current
)
{
unsigned
long
sp
;
struct
pt_regs
r
;
HERE:
asm
volatile
(
"copy %%r30, %0"
:
"=r"
(
sp
));
memset
(
&
r
,
0
,
sizeof
(
struct
pt_regs
));
r
.
iaoq
[
0
]
=
(
unsigned
long
)
&&
HERE
;
r
.
gr
[
2
]
=
(
unsigned
long
)
__builtin_return_address
(
0
);
r
.
gr
[
30
]
=
sp
;
unwind_frame_init
(
&
info
,
task
,
&
r
);
}
else
{
unwind_frame_init_from_blocked_task
(
&
info
,
task
);
}
/* unwind stack and save entries in stack_trace struct */
/* unwind stack and save entries in stack_trace struct */
trace
->
nr_entries
=
0
;
trace
->
nr_entries
=
0
;
...
...
arch/parisc/kernel/traps.c
浏览文件 @
9e0d5c45
...
@@ -45,7 +45,7 @@
...
@@ -45,7 +45,7 @@
#include "../math-emu/math-emu.h"
/* for handle_fpe() */
#include "../math-emu/math-emu.h"
/* for handle_fpe() */
static
void
parisc_show_stack
(
struct
task_struct
*
task
,
unsigned
long
*
sp
,
static
void
parisc_show_stack
(
struct
task_struct
*
task
,
struct
pt_regs
*
regs
);
struct
pt_regs
*
regs
);
static
int
printbinary
(
char
*
buf
,
unsigned
long
x
,
int
nbits
)
static
int
printbinary
(
char
*
buf
,
unsigned
long
x
,
int
nbits
)
...
@@ -152,7 +152,7 @@ void show_regs(struct pt_regs *regs)
...
@@ -152,7 +152,7 @@ void show_regs(struct pt_regs *regs)
printk
(
"%s IAOQ[1]: %pS
\n
"
,
level
,
(
void
*
)
regs
->
iaoq
[
1
]);
printk
(
"%s IAOQ[1]: %pS
\n
"
,
level
,
(
void
*
)
regs
->
iaoq
[
1
]);
printk
(
"%s RP(r2): %pS
\n
"
,
level
,
(
void
*
)
regs
->
gr
[
2
]);
printk
(
"%s RP(r2): %pS
\n
"
,
level
,
(
void
*
)
regs
->
gr
[
2
]);
parisc_show_stack
(
current
,
NULL
,
regs
);
parisc_show_stack
(
current
,
regs
);
}
}
}
}
...
@@ -185,44 +185,19 @@ static void do_show_stack(struct unwind_frame_info *info)
...
@@ -185,44 +185,19 @@ static void do_show_stack(struct unwind_frame_info *info)
printk
(
KERN_CRIT
"
\n
"
);
printk
(
KERN_CRIT
"
\n
"
);
}
}
static
void
parisc_show_stack
(
struct
task_struct
*
task
,
unsigned
long
*
sp
,
static
void
parisc_show_stack
(
struct
task_struct
*
task
,
struct
pt_regs
*
regs
)
struct
pt_regs
*
regs
)
{
{
struct
unwind_frame_info
info
;
struct
unwind_frame_info
info
;
struct
task_struct
*
t
;
t
=
task
?
task
:
current
;
unwind_frame_init_task
(
&
info
,
task
,
regs
);
if
(
regs
)
{
unwind_frame_init
(
&
info
,
t
,
regs
);
goto
show_stack
;
}
if
(
t
==
current
)
{
unsigned
long
sp
;
HERE:
asm
volatile
(
"copy %%r30, %0"
:
"=r"
(
sp
));
{
struct
pt_regs
r
;
memset
(
&
r
,
0
,
sizeof
(
struct
pt_regs
));
r
.
iaoq
[
0
]
=
(
unsigned
long
)
&&
HERE
;
r
.
gr
[
2
]
=
(
unsigned
long
)
__builtin_return_address
(
0
);
r
.
gr
[
30
]
=
sp
;
unwind_frame_init
(
&
info
,
current
,
&
r
);
}
}
else
{
unwind_frame_init_from_blocked_task
(
&
info
,
t
);
}
show_stack:
do_show_stack
(
&
info
);
do_show_stack
(
&
info
);
}
}
void
show_stack
(
struct
task_struct
*
t
,
unsigned
long
*
sp
)
void
show_stack
(
struct
task_struct
*
t
,
unsigned
long
*
sp
)
{
{
return
parisc_show_stack
(
t
,
sp
,
NULL
);
parisc_show_stack
(
t
,
NULL
);
}
}
int
is_valid_bugaddr
(
unsigned
long
iaoq
)
int
is_valid_bugaddr
(
unsigned
long
iaoq
)
...
...
arch/parisc/kernel/unwind.c
浏览文件 @
9e0d5c45
...
@@ -403,9 +403,31 @@ void unwind_frame_init_from_blocked_task(struct unwind_frame_info *info, struct
...
@@ -403,9 +403,31 @@ void unwind_frame_init_from_blocked_task(struct unwind_frame_info *info, struct
kfree
(
r2
);
kfree
(
r2
);
}
}
void
unwind_frame_init_running
(
struct
unwind_frame_info
*
info
,
struct
pt_regs
*
regs
)
#define get_parisc_stackpointer() ({ \
unsigned long sp; \
__asm__("copy %%r30, %0" : "=r"(sp)); \
(sp); \
})
void
unwind_frame_init_task
(
struct
unwind_frame_info
*
info
,
struct
task_struct
*
task
,
struct
pt_regs
*
regs
)
{
{
unwind_frame_init
(
info
,
current
,
regs
);
task
=
task
?
task
:
current
;
if
(
task
==
current
)
{
struct
pt_regs
r
;
if
(
!
regs
)
{
memset
(
&
r
,
0
,
sizeof
(
r
));
r
.
iaoq
[
0
]
=
_THIS_IP_
;
r
.
gr
[
2
]
=
_RET_IP_
;
r
.
gr
[
30
]
=
get_parisc_stackpointer
();
regs
=
&
r
;
}
unwind_frame_init
(
info
,
task
,
&
r
);
}
else
{
unwind_frame_init_from_blocked_task
(
info
,
task
);
}
}
}
int
unwind_once
(
struct
unwind_frame_info
*
next_frame
)
int
unwind_once
(
struct
unwind_frame_info
*
next_frame
)
...
@@ -442,19 +464,12 @@ int unwind_to_user(struct unwind_frame_info *info)
...
@@ -442,19 +464,12 @@ int unwind_to_user(struct unwind_frame_info *info)
unsigned
long
return_address
(
unsigned
int
level
)
unsigned
long
return_address
(
unsigned
int
level
)
{
{
struct
unwind_frame_info
info
;
struct
unwind_frame_info
info
;
struct
pt_regs
r
;
unsigned
long
sp
;
/* initialize unwind info */
/* initialize unwind info */
asm
volatile
(
"copy %%r30, %0"
:
"=r"
(
sp
));
unwind_frame_init_task
(
&
info
,
current
,
NULL
);
memset
(
&
r
,
0
,
sizeof
(
struct
pt_regs
));
r
.
iaoq
[
0
]
=
_THIS_IP_
;
r
.
gr
[
2
]
=
_RET_IP_
;
r
.
gr
[
30
]
=
sp
;
unwind_frame_init
(
&
info
,
current
,
&
r
);
/* unwind stack */
/* unwind stack */
++
level
;
level
+=
2
;
do
{
do
{
if
(
unwind_once
(
&
info
)
<
0
||
info
.
ip
==
0
)
if
(
unwind_once
(
&
info
)
<
0
||
info
.
ip
==
0
)
return
0
;
return
0
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录