Skip to content

Commit e4cf33c

Browse files
committed
ftrace: Consolidate ftrace_regs accessor functions for archs using pt_regs
Most architectures use pt_regs within ftrace_regs making a lot of the accessor functions just calls to the pt_regs internally. Instead of duplication this effort, use a HAVE_ARCH_FTRACE_REGS for architectures that have their own ftrace_regs that is not based on pt_regs and will define all the accessor functions, and for the architectures that just use pt_regs, it will leave it undefined, and the default accessor functions will be used. Note, this will also make it easier to add new accessor functions to ftrace_regs as it will mean having to touch less architectures. Cc: <[email protected]> Cc: "[email protected]" <[email protected]> Cc: Mathieu Desnoyers <[email protected]> Cc: Mark Rutland <[email protected]> Cc: Will Deacon <[email protected]> Cc: Huacai Chen <[email protected]> Cc: WANG Xuerui <[email protected]> Cc: Michael Ellerman <[email protected]> Cc: Nicholas Piggin <[email protected]> Cc: Christophe Leroy <[email protected]> Cc: Naveen N Rao <[email protected]> Cc: Madhavan Srinivasan <[email protected]> Cc: Paul Walmsley <[email protected]> Cc: Palmer Dabbelt <[email protected]> Cc: Albert Ou <[email protected]> Cc: Heiko Carstens <[email protected]> Cc: Vasily Gorbik <[email protected]> Cc: Alexander Gordeev <[email protected]> Cc: Christian Borntraeger <[email protected]> Cc: Sven Schnelle <[email protected]> Cc: Thomas Gleixner <[email protected]> Cc: Ingo Molnar <[email protected]> Cc: Borislav Petkov <[email protected]> Cc: Dave Hansen <[email protected]> Link: https://lore.kernel.org/[email protected] Acked-by: Masami Hiramatsu (Google) <[email protected]> Acked-by: Heiko Carstens <[email protected]> # s390 Acked-by: Catalin Marinas <[email protected]> Acked-by: Michael Ellerman <[email protected]> # powerpc Suggested-by: Masami Hiramatsu (Google) <[email protected]> Signed-off-by: Steven Rostedt (Google) <[email protected]>
1 parent 7888af4 commit e4cf33c

File tree

8 files changed

+49
-119
lines changed

8 files changed

+49
-119
lines changed

arch/arm64/include/asm/ftrace.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ extern void return_to_handler(void);
5454
unsigned long ftrace_call_adjust(unsigned long addr);
5555

5656
#ifdef CONFIG_DYNAMIC_FTRACE_WITH_ARGS
57+
#define HAVE_ARCH_FTRACE_REGS
5758
struct dyn_ftrace;
5859
struct ftrace_ops;
5960
struct ftrace_regs;

arch/loongarch/include/asm/ftrace.h

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -43,43 +43,20 @@ void prepare_ftrace_return(unsigned long self_addr, unsigned long *parent);
4343

4444
#ifdef CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS
4545
struct ftrace_ops;
46-
struct ftrace_regs;
47-
#define arch_ftrace_regs(fregs) ((struct __arch_ftrace_regs *)(fregs))
4846

49-
struct __arch_ftrace_regs {
50-
struct pt_regs regs;
51-
};
47+
#include <linux/ftrace_regs.h>
5248

5349
static __always_inline struct pt_regs *arch_ftrace_get_regs(struct ftrace_regs *fregs)
5450
{
5551
return &arch_ftrace_regs(fregs)->regs;
5652
}
5753

58-
static __always_inline unsigned long
59-
ftrace_regs_get_instruction_pointer(struct ftrace_regs *fregs)
60-
{
61-
return instruction_pointer(&arch_ftrace_regs(fregs)->regs);
62-
}
63-
6454
static __always_inline void
6555
ftrace_regs_set_instruction_pointer(struct ftrace_regs *fregs, unsigned long ip)
6656
{
6757
instruction_pointer_set(&arch_ftrace_regs(fregs)->regs, ip);
6858
}
6959

70-
#define ftrace_regs_get_argument(fregs, n) \
71-
regs_get_kernel_argument(&arch_ftrace_regs(fregs)->regs, n)
72-
#define ftrace_regs_get_stack_pointer(fregs) \
73-
kernel_stack_pointer(&arch_ftrace_regs(fregs)->regs)
74-
#define ftrace_regs_return_value(fregs) \
75-
regs_return_value(&arch_ftrace_regs(fregs)->regs)
76-
#define ftrace_regs_set_return_value(fregs, ret) \
77-
regs_set_return_value(&arch_ftrace_regs(fregs)->regs, ret)
78-
#define ftrace_override_function_with_return(fregs) \
79-
override_function_with_return(&arch_ftrace_regs(fregs)->regs)
80-
#define ftrace_regs_query_register_offset(name) \
81-
regs_query_register_offset(name)
82-
8360
#define ftrace_graph_func ftrace_graph_func
8461
void ftrace_graph_func(unsigned long ip, unsigned long parent_ip,
8562
struct ftrace_ops *op, struct ftrace_regs *fregs);

arch/powerpc/include/asm/ftrace.h

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,7 @@ struct dyn_arch_ftrace {
3232
int ftrace_init_nop(struct module *mod, struct dyn_ftrace *rec);
3333
#define ftrace_init_nop ftrace_init_nop
3434

35-
struct ftrace_regs;
36-
#define arch_ftrace_regs(fregs) ((struct __arch_ftrace_regs *)(fregs))
37-
38-
struct __arch_ftrace_regs {
39-
struct pt_regs regs;
40-
};
35+
#include <linux/ftrace_regs.h>
4136

4237
static __always_inline struct pt_regs *arch_ftrace_get_regs(struct ftrace_regs *fregs)
4338
{
@@ -52,25 +47,6 @@ ftrace_regs_set_instruction_pointer(struct ftrace_regs *fregs,
5247
regs_set_return_ip(&arch_ftrace_regs(fregs)->regs, ip);
5348
}
5449

55-
static __always_inline unsigned long
56-
ftrace_regs_get_instruction_pointer(struct ftrace_regs *fregs)
57-
{
58-
return instruction_pointer(&arch_ftrace_regs(fregs)->regs);
59-
}
60-
61-
#define ftrace_regs_get_argument(fregs, n) \
62-
regs_get_kernel_argument(&arch_ftrace_regs(fregs)->regs, n)
63-
#define ftrace_regs_get_stack_pointer(fregs) \
64-
kernel_stack_pointer(&arch_ftrace_regs(fregs)->regs)
65-
#define ftrace_regs_return_value(fregs) \
66-
regs_return_value(&arch_ftrace_regs(fregs)->regs)
67-
#define ftrace_regs_set_return_value(fregs, ret) \
68-
regs_set_return_value(&arch_ftrace_regs(fregs)->regs, ret)
69-
#define ftrace_override_function_with_return(fregs) \
70-
override_function_with_return(&arch_ftrace_regs(fregs)->regs)
71-
#define ftrace_regs_query_register_offset(name) \
72-
regs_query_register_offset(name)
73-
7450
struct ftrace_ops;
7551

7652
#define ftrace_graph_func ftrace_graph_func

arch/riscv/include/asm/ftrace.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ int ftrace_init_nop(struct module *mod, struct dyn_ftrace *rec);
125125

126126
#ifdef CONFIG_DYNAMIC_FTRACE_WITH_ARGS
127127
#define arch_ftrace_get_regs(regs) NULL
128+
#define HAVE_ARCH_FTRACE_REGS
128129
struct ftrace_ops;
129130
struct ftrace_regs;
130131
#define arch_ftrace_regs(fregs) ((struct __arch_ftrace_regs *)(fregs))

arch/s390/include/asm/ftrace.h

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,7 @@ static inline unsigned long ftrace_call_adjust(unsigned long addr)
5151
return addr;
5252
}
5353

54-
struct ftrace_regs;
55-
#define arch_ftrace_regs(fregs) ((struct __arch_ftrace_regs *)(fregs))
56-
57-
struct __arch_ftrace_regs {
58-
struct pt_regs regs;
59-
};
54+
#include <linux/ftrace_regs.h>
6055

6156
static __always_inline struct pt_regs *arch_ftrace_get_regs(struct ftrace_regs *fregs)
6257
{
@@ -84,32 +79,13 @@ static __always_inline unsigned long fgraph_ret_regs_frame_pointer(struct fgraph
8479
}
8580
#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
8681

87-
static __always_inline unsigned long
88-
ftrace_regs_get_instruction_pointer(const struct ftrace_regs *fregs)
89-
{
90-
return arch_ftrace_regs(fregs)->regs.psw.addr;
91-
}
92-
9382
static __always_inline void
9483
ftrace_regs_set_instruction_pointer(struct ftrace_regs *fregs,
9584
unsigned long ip)
9685
{
9786
arch_ftrace_regs(fregs)->regs.psw.addr = ip;
9887
}
9988

100-
#define ftrace_regs_get_argument(fregs, n) \
101-
regs_get_kernel_argument(&arch_ftrace_regs(fregs)->regs, n)
102-
#define ftrace_regs_get_stack_pointer(fregs) \
103-
kernel_stack_pointer(&arch_ftrace_regs(fregs)->regs)
104-
#define ftrace_regs_return_value(fregs) \
105-
regs_return_value(&arch_ftrace_regs(fregs)->regs)
106-
#define ftrace_regs_set_return_value(fregs, ret) \
107-
regs_set_return_value(&arch_ftrace_regs(fregs)->regs, ret)
108-
#define ftrace_override_function_with_return(fregs) \
109-
override_function_with_return(&arch_ftrace_regs(fregs)->regs)
110-
#define ftrace_regs_query_register_offset(name) \
111-
regs_query_register_offset(name)
112-
11389
#ifdef CONFIG_DYNAMIC_FTRACE_WITH_DIRECT_CALLS
11490
/*
11591
* When an ftrace registered caller is tracing a function that is

arch/x86/include/asm/ftrace.h

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,8 @@ static inline unsigned long ftrace_call_adjust(unsigned long addr)
3333
}
3434

3535
#ifdef CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS
36-
struct ftrace_regs;
37-
#define arch_ftrace_regs(fregs) ((struct __arch_ftrace_regs *)(fregs))
3836

39-
struct __arch_ftrace_regs {
40-
struct pt_regs regs;
41-
};
37+
#include <linux/ftrace_regs.h>
4238

4339
static __always_inline struct pt_regs *
4440
arch_ftrace_get_regs(struct ftrace_regs *fregs)
@@ -52,21 +48,6 @@ arch_ftrace_get_regs(struct ftrace_regs *fregs)
5248
#define ftrace_regs_set_instruction_pointer(fregs, _ip) \
5349
do { arch_ftrace_regs(fregs)->regs.ip = (_ip); } while (0)
5450

55-
#define ftrace_regs_get_instruction_pointer(fregs) \
56-
arch_ftrace_regs(fregs)->regs.ip)
57-
58-
#define ftrace_regs_get_argument(fregs, n) \
59-
regs_get_kernel_argument(&arch_ftrace_regs(fregs)->regs, n)
60-
#define ftrace_regs_get_stack_pointer(fregs) \
61-
kernel_stack_pointer(&arch_ftrace_regs(fregs)->regs)
62-
#define ftrace_regs_return_value(fregs) \
63-
regs_return_value(&arch_ftrace_regs(fregs)->regs)
64-
#define ftrace_regs_set_return_value(fregs, ret) \
65-
regs_set_return_value(&arch_ftrace_regs(fregs)->regs, ret)
66-
#define ftrace_override_function_with_return(fregs) \
67-
override_function_with_return(&arch_ftrace_regs(fregs)->regs)
68-
#define ftrace_regs_query_register_offset(name) \
69-
regs_query_register_offset(name)
7051

7152
struct ftrace_ops;
7253
#define ftrace_graph_func ftrace_graph_func

include/linux/ftrace.h

Lines changed: 7 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ static inline int ftrace_mod_get_kallsym(unsigned int symnum, unsigned long *val
113113

114114
#ifdef CONFIG_FUNCTION_TRACER
115115

116+
#include <linux/ftrace_regs.h>
117+
116118
extern int ftrace_enabled;
117119

118120
/**
@@ -150,14 +152,11 @@ struct ftrace_regs {
150152
#define ftrace_regs_size() sizeof(struct __arch_ftrace_regs)
151153

152154
#ifndef CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS
153-
154-
struct __arch_ftrace_regs {
155-
struct pt_regs regs;
156-
};
157-
158-
struct ftrace_regs;
159-
#define arch_ftrace_regs(fregs) ((struct __arch_ftrace_regs *)(fregs))
160-
155+
/*
156+
* Architectures that define HAVE_DYNAMIC_FTRACE_WITH_ARGS must define their own
157+
* arch_ftrace_get_regs() where it only returns pt_regs *if* it is fully
158+
* populated. It should return NULL otherwise.
159+
*/
161160
static inline struct pt_regs *arch_ftrace_get_regs(struct ftrace_regs *fregs)
162161
{
163162
return &arch_ftrace_regs(fregs)->regs;
@@ -191,23 +190,6 @@ static __always_inline bool ftrace_regs_has_args(struct ftrace_regs *fregs)
191190
return ftrace_get_regs(fregs) != NULL;
192191
}
193192

194-
#ifndef CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS
195-
#define ftrace_regs_get_instruction_pointer(fregs) \
196-
instruction_pointer(ftrace_get_regs(fregs))
197-
#define ftrace_regs_get_argument(fregs, n) \
198-
regs_get_kernel_argument(ftrace_get_regs(fregs), n)
199-
#define ftrace_regs_get_stack_pointer(fregs) \
200-
kernel_stack_pointer(ftrace_get_regs(fregs))
201-
#define ftrace_regs_return_value(fregs) \
202-
regs_return_value(ftrace_get_regs(fregs))
203-
#define ftrace_regs_set_return_value(fregs, ret) \
204-
regs_set_return_value(ftrace_get_regs(fregs), ret)
205-
#define ftrace_override_function_with_return(fregs) \
206-
override_function_with_return(ftrace_get_regs(fregs))
207-
#define ftrace_regs_query_register_offset(name) \
208-
regs_query_register_offset(name)
209-
#endif
210-
211193
typedef void (*ftrace_func_t)(unsigned long ip, unsigned long parent_ip,
212194
struct ftrace_ops *op, struct ftrace_regs *fregs);
213195

include/linux/ftrace_regs.h

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/* SPDX-License-Identifier: GPL-2.0 */
2+
#ifndef _LINUX_FTRACE_REGS_H
3+
#define _LINUX_FTRACE_REGS_H
4+
5+
/*
6+
* For archs that just copy pt_regs in ftrace regs, it can use this default.
7+
* If an architecture does not use pt_regs, it must define all the below
8+
* accessor functions.
9+
*/
10+
#ifndef HAVE_ARCH_FTRACE_REGS
11+
struct __arch_ftrace_regs {
12+
struct pt_regs regs;
13+
};
14+
15+
#define arch_ftrace_regs(fregs) ((struct __arch_ftrace_regs *)(fregs))
16+
17+
struct ftrace_regs;
18+
19+
#define ftrace_regs_get_instruction_pointer(fregs) \
20+
instruction_pointer(arch_ftrace_get_regs(fregs))
21+
#define ftrace_regs_get_argument(fregs, n) \
22+
regs_get_kernel_argument(arch_ftrace_get_regs(fregs), n)
23+
#define ftrace_regs_get_stack_pointer(fregs) \
24+
kernel_stack_pointer(arch_ftrace_get_regs(fregs))
25+
#define ftrace_regs_return_value(fregs) \
26+
regs_return_value(arch_ftrace_get_regs(fregs))
27+
#define ftrace_regs_set_return_value(fregs, ret) \
28+
regs_set_return_value(arch_ftrace_get_regs(fregs), ret)
29+
#define ftrace_override_function_with_return(fregs) \
30+
override_function_with_return(arch_ftrace_get_regs(fregs))
31+
#define ftrace_regs_query_register_offset(name) \
32+
regs_query_register_offset(name)
33+
34+
#endif /* HAVE_ARCH_FTRACE_REGS */
35+
36+
#endif /* _LINUX_FTRACE_REGS_H */

0 commit comments

Comments
 (0)