Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
1ee76d7e
K
Kernel
项目概览
openeuler
/
Kernel
1 年多 前同步成功
通知
8
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看板
提交
1ee76d7e
编写于
6月 10, 2009
作者:
M
Mike Frysinger
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Blackfin: initial support for ftrace grapher
Signed-off-by:
N
Mike Frysinger
<
vapier@gentoo.org
>
上级
1c873be7
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
115 addition
and
0 deletion
+115
-0
arch/blackfin/Kconfig
arch/blackfin/Kconfig
+1
-0
arch/blackfin/kernel/Makefile
arch/blackfin/kernel/Makefile
+3
-0
arch/blackfin/kernel/ftrace-entry.S
arch/blackfin/kernel/ftrace-entry.S
+68
-0
arch/blackfin/kernel/ftrace.c
arch/blackfin/kernel/ftrace.c
+42
-0
arch/blackfin/kernel/vmlinux.lds.S
arch/blackfin/kernel/vmlinux.lds.S
+1
-0
未找到文件。
arch/blackfin/Kconfig
浏览文件 @
1ee76d7e
...
...
@@ -19,6 +19,7 @@ config RWSEM_XCHGADD_ALGORITHM
config BLACKFIN
def_bool y
select HAVE_FUNCTION_GRAPH_TRACER
select HAVE_FUNCTION_TRACER
select HAVE_IDE
select HAVE_KERNEL_GZIP
...
...
arch/blackfin/kernel/Makefile
浏览文件 @
1ee76d7e
...
...
@@ -16,6 +16,9 @@ else
endif
obj-$(CONFIG_FUNCTION_TRACER)
+=
ftrace-entry.o
obj-$(CONFIG_FUNCTION_GRAPH_TRACER)
+=
ftrace.o
CFLAGS_REMOVE_ftrace.o
=
-pg
obj-$(CONFIG_IPIPE)
+=
ipipe.o
obj-$(CONFIG_IPIPE_TRACE_MCOUNT)
+=
mcount.o
obj-$(CONFIG_BFIN_GPTIMERS)
+=
gptimers.o
...
...
arch/blackfin/kernel/ftrace-entry.S
浏览文件 @
1ee76d7e
...
...
@@ -35,6 +35,28 @@ ENTRY(__mcount)
cc
=
r2
==
r3
;
if
!
cc
jump
.
Ldo_trace
;
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
/
*
if
the
ftrace_graph_return
function
pointer
is
not
set
to
*
the
ftrace_stub
entry
,
call
prepare_ftrace_return
()
.
*/
p0.l
=
_ftrace_graph_return
;
p0.h
=
_ftrace_graph_return
;
r3
=
[
p0
]
;
cc
=
r2
==
r3
;
if
!
cc
jump
_ftrace_graph_caller
;
/
*
similarly
,
if
the
ftrace_graph_entry
function
pointer
is
not
*
set
to
the
ftrace_graph_entry_stub
entry
,
...
*/
p0.l
=
_ftrace_graph_entry
;
p0.h
=
_ftrace_graph_entry
;
r2.l
=
_ftrace_graph_entry_stub
;
r2.h
=
_ftrace_graph_entry_stub
;
r3
=
[
p0
]
;
cc
=
r2
==
r3
;
if
!
cc
jump
_ftrace_graph_caller
;
#endif
r2
=
[
sp
++]
;
rts
;
...
...
@@ -61,6 +83,7 @@ ENTRY(__mcount)
call
(
p0
)
;
/
*
restore
state
and
get
out
of
dodge
*/
.
Lfinish_trace
:
rets
=
[
sp
++]
;
r1
=
[
sp
++]
;
r0
=
[
sp
++]
;
...
...
@@ -70,3 +93,48 @@ ENTRY(__mcount)
_ftrace_stub
:
rts
;
ENDPROC
(
__mcount
)
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
/*
The
prepare_ftrace_return
()
function
is
similar
to
the
trace
function
*
except
it
takes
a
pointer
to
the
location
of
the
frompc
.
This
is
so
*
the
prepare_ftrace_return
()
can
hijack
it
temporarily
for
probing
*
purposes
.
*/
ENTRY
(
_ftrace_graph_caller
)
/
*
save
first
/
second
function
arg
and
the
return
register
*/
[--
sp
]
=
r0
;
[--
sp
]
=
r1
;
[--
sp
]
=
rets
;
r0
=
fp
;
r1
=
rets
;
r0
+=
4
;
r1
+=
-
MCOUNT_INSN_SIZE
;
call
_prepare_ftrace_return
;
jump
.
Lfinish_trace
;
ENDPROC
(
_ftrace_graph_caller
)
/*
Undo
the
rewrite
caused
by
ftrace_graph_caller
()
.
The
common
function
*
ftrace_return_to_handler
()
will
return
the
original
rets
so
we
can
*
restore
it
and
be
on
our
way
.
*/
ENTRY
(
_return_to_handler
)
/
*
make
sure
original
return
values
are
saved
*/
[--
sp
]
=
p0
;
[--
sp
]
=
r0
;
[--
sp
]
=
r1
;
/
*
get
original
return
address
*/
call
_ftrace_return_to_handler
;
rets
=
r0
;
/
*
anomaly
05000371
-
make
sure
we
have
at
least
three
instructions
*
between
rets
setting
and
the
return
*/
r1
=
[
sp
++]
;
r0
=
[
sp
++]
;
p0
=
[
sp
++]
;
rts
;
ENDPROC
(
_return_to_handler
)
#endif
arch/blackfin/kernel/ftrace.c
0 → 100644
浏览文件 @
1ee76d7e
/*
* ftrace graph code
*
* Copyright (C) 2009 Analog Devices Inc.
* Licensed under the GPL-2 or later.
*/
#include <linux/ftrace.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <asm/atomic.h>
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
/*
* Hook the return address and push it in the stack of return addrs
* in current thread info.
*/
void
prepare_ftrace_return
(
unsigned
long
*
parent
,
unsigned
long
self_addr
)
{
struct
ftrace_graph_ent
trace
;
unsigned
long
return_hooker
=
(
unsigned
long
)
&
return_to_handler
;
if
(
unlikely
(
atomic_read
(
&
current
->
tracing_graph_pause
)))
return
;
if
(
ftrace_push_return_trace
(
*
parent
,
self_addr
,
&
trace
.
depth
)
==
-
EBUSY
)
return
;
trace
.
func
=
self_addr
;
/* Only trace if the calling function expects to */
if
(
!
ftrace_graph_entry
(
&
trace
))
{
current
->
curr_ret_stack
--
;
return
;
}
/* all is well in the world ! hijack RETS ... */
*
parent
=
return_hooker
;
}
#endif
arch/blackfin/kernel/vmlinux.lds.S
浏览文件 @
1ee76d7e
...
...
@@ -54,6 +54,7 @@ SECTIONS
SCHED_TEXT
#endif
LOCK_TEXT
IRQENTRY_TEXT
KPROBES_TEXT
*(.
text
.*)
*(.
fixup
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录