Skip to content

Commit aad3a0d

Browse files
committed
Merge tag 'ftrace-v6.13' of git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace
Pull ftrace updates from Steven Rostedt: - Restructure the function graph shadow stack to prepare it for use with kretprobes With the goal of merging the shadow stack logic of function graph and kretprobes, some more restructuring of the function shadow stack is required. Move out function graph specific fields from the fgraph infrastructure and store it on the new stack variables that can pass data from the entry callback to the exit callback. Hopefully, with this change, the merge of kretprobes to use fgraph shadow stacks will be ready by the next merge window. - Make shadow stack 4k instead of using PAGE_SIZE. Some architectures have very large PAGE_SIZE values which make its use for shadow stacks waste a lot of memory. - Give shadow stacks its own kmem cache. When function graph is started, every task on the system gets a shadow stack. In the future, shadow stacks may not be 4K in size. Have it have its own kmem cache so that whatever size it becomes will still be efficient in allocations. - Initialize profiler graph ops as it will be needed for new updates to fgraph - Convert to use guard(mutex) for several ftrace and fgraph functions - Add more comments and documentation - Show function return address in function graph tracer Add an option to show the caller of a function at each entry of the function graph tracer, similar to what the function tracer does. - Abstract out ftrace_regs from being used directly like pt_regs ftrace_regs was created to store a partial pt_regs. It holds only the registers and stack information to get to the function arguments and return values. On several archs, it is simply a wrapper around pt_regs. But some users would access ftrace_regs directly to get the pt_regs which will not work on all archs. Make ftrace_regs an abstract structure that requires all access to its fields be through accessor functions. - Show how long it takes to do function code modifications When code modification for function hooks happen, it always had the time recorded in how long it took to do the conversion. But this value was never exported. Recently the code was touched due to new ROX modification handling that caused a large slow down in doing the modifications and had a significant impact on boot times. Expose the timings in the dyn_ftrace_total_info file. This file was created a while ago to show information about memory usage and such to implement dynamic function tracing. It's also an appropriate file to store the timings of this modification as well. This will make it easier to see the impact of changes to code modification on boot up timings. - Other clean ups and small fixes * tag 'ftrace-v6.13' of git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace: (22 commits) ftrace: Show timings of how long nop patching took ftrace: Use guard to take ftrace_lock in ftrace_graph_set_hash() ftrace: Use guard to take the ftrace_lock in release_probe() ftrace: Use guard to lock ftrace_lock in cache_mod() ftrace: Use guard for match_records() fgraph: Use guard(mutex)(&ftrace_lock) for unregister_ftrace_graph() fgraph: Give ret_stack its own kmem cache fgraph: Separate size of ret_stack from PAGE_SIZE ftrace: Rename ftrace_regs_return_value to ftrace_regs_get_return_value selftests/ftrace: Fix check of return value in fgraph-retval.tc test ftrace: Use arch_ftrace_regs() for ftrace_regs_*() macros ftrace: Consolidate ftrace_regs accessor functions for archs using pt_regs ftrace: Make ftrace_regs abstract from direct use fgragh: No need to invoke the function call_filter_check_discard() fgraph: Simplify return address printing in function graph tracer function_graph: Remove unnecessary initialization in ftrace_graph_ret_addr() function_graph: Support recording and printing the function return address ftrace: Have calltime be saved in the fgraph storage ftrace: Use a running sleeptime instead of saving on shadow stack fgraph: Use fgraph data to store subtime for profiler ...
2 parents 8f7c8b8 + 36a367b commit aad3a0d

File tree

29 files changed

+632
-332
lines changed

29 files changed

+632
-332
lines changed

arch/arm64/include/asm/ftrace.h

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -54,16 +54,19 @@ 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;
60+
struct ftrace_regs;
61+
#define arch_ftrace_regs(fregs) ((struct __arch_ftrace_regs *)(fregs))
5962

6063
#define arch_ftrace_get_regs(regs) NULL
6164

6265
/*
6366
* Note: sizeof(struct ftrace_regs) must be a multiple of 16 to ensure correct
6467
* stack alignment
6568
*/
66-
struct ftrace_regs {
69+
struct __arch_ftrace_regs {
6770
/* x0 - x8 */
6871
unsigned long regs[9];
6972

@@ -83,47 +86,47 @@ struct ftrace_regs {
8386
static __always_inline unsigned long
8487
ftrace_regs_get_instruction_pointer(const struct ftrace_regs *fregs)
8588
{
86-
return fregs->pc;
89+
return arch_ftrace_regs(fregs)->pc;
8790
}
8891

8992
static __always_inline void
9093
ftrace_regs_set_instruction_pointer(struct ftrace_regs *fregs,
9194
unsigned long pc)
9295
{
93-
fregs->pc = pc;
96+
arch_ftrace_regs(fregs)->pc = pc;
9497
}
9598

9699
static __always_inline unsigned long
97100
ftrace_regs_get_stack_pointer(const struct ftrace_regs *fregs)
98101
{
99-
return fregs->sp;
102+
return arch_ftrace_regs(fregs)->sp;
100103
}
101104

102105
static __always_inline unsigned long
103106
ftrace_regs_get_argument(struct ftrace_regs *fregs, unsigned int n)
104107
{
105108
if (n < 8)
106-
return fregs->regs[n];
109+
return arch_ftrace_regs(fregs)->regs[n];
107110
return 0;
108111
}
109112

110113
static __always_inline unsigned long
111114
ftrace_regs_get_return_value(const struct ftrace_regs *fregs)
112115
{
113-
return fregs->regs[0];
116+
return arch_ftrace_regs(fregs)->regs[0];
114117
}
115118

116119
static __always_inline void
117120
ftrace_regs_set_return_value(struct ftrace_regs *fregs,
118121
unsigned long ret)
119122
{
120-
fregs->regs[0] = ret;
123+
arch_ftrace_regs(fregs)->regs[0] = ret;
121124
}
122125

123126
static __always_inline void
124127
ftrace_override_function_with_return(struct ftrace_regs *fregs)
125128
{
126-
fregs->pc = fregs->lr;
129+
arch_ftrace_regs(fregs)->pc = arch_ftrace_regs(fregs)->lr;
127130
}
128131

129132
int ftrace_regs_query_register_offset(const char *name);
@@ -143,7 +146,7 @@ static inline void arch_ftrace_set_direct_caller(struct ftrace_regs *fregs,
143146
* The ftrace trampoline will return to this address instead of the
144147
* instrumented function.
145148
*/
146-
fregs->direct_tramp = addr;
149+
arch_ftrace_regs(fregs)->direct_tramp = addr;
147150
}
148151
#endif /* CONFIG_DYNAMIC_FTRACE_WITH_DIRECT_CALLS */
149152

arch/arm64/kernel/asm-offsets.c

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -80,19 +80,19 @@ int main(void)
8080
DEFINE(PT_REGS_SIZE, sizeof(struct pt_regs));
8181
BLANK();
8282
#ifdef CONFIG_DYNAMIC_FTRACE_WITH_ARGS
83-
DEFINE(FREGS_X0, offsetof(struct ftrace_regs, regs[0]));
84-
DEFINE(FREGS_X2, offsetof(struct ftrace_regs, regs[2]));
85-
DEFINE(FREGS_X4, offsetof(struct ftrace_regs, regs[4]));
86-
DEFINE(FREGS_X6, offsetof(struct ftrace_regs, regs[6]));
87-
DEFINE(FREGS_X8, offsetof(struct ftrace_regs, regs[8]));
88-
DEFINE(FREGS_FP, offsetof(struct ftrace_regs, fp));
89-
DEFINE(FREGS_LR, offsetof(struct ftrace_regs, lr));
90-
DEFINE(FREGS_SP, offsetof(struct ftrace_regs, sp));
91-
DEFINE(FREGS_PC, offsetof(struct ftrace_regs, pc));
83+
DEFINE(FREGS_X0, offsetof(struct __arch_ftrace_regs, regs[0]));
84+
DEFINE(FREGS_X2, offsetof(struct __arch_ftrace_regs, regs[2]));
85+
DEFINE(FREGS_X4, offsetof(struct __arch_ftrace_regs, regs[4]));
86+
DEFINE(FREGS_X6, offsetof(struct __arch_ftrace_regs, regs[6]));
87+
DEFINE(FREGS_X8, offsetof(struct __arch_ftrace_regs, regs[8]));
88+
DEFINE(FREGS_FP, offsetof(struct __arch_ftrace_regs, fp));
89+
DEFINE(FREGS_LR, offsetof(struct __arch_ftrace_regs, lr));
90+
DEFINE(FREGS_SP, offsetof(struct __arch_ftrace_regs, sp));
91+
DEFINE(FREGS_PC, offsetof(struct __arch_ftrace_regs, pc));
9292
#ifdef CONFIG_DYNAMIC_FTRACE_WITH_DIRECT_CALLS
93-
DEFINE(FREGS_DIRECT_TRAMP, offsetof(struct ftrace_regs, direct_tramp));
93+
DEFINE(FREGS_DIRECT_TRAMP, offsetof(struct __arch_ftrace_regs, direct_tramp));
9494
#endif
95-
DEFINE(FREGS_SIZE, sizeof(struct ftrace_regs));
95+
DEFINE(FREGS_SIZE, sizeof(struct __arch_ftrace_regs));
9696
BLANK();
9797
#endif
9898
DEFINE(CPU_BOOT_TASK, offsetof(struct secondary_data, task));

arch/arm64/kernel/ftrace.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@ struct fregs_offset {
2323
int offset;
2424
};
2525

26-
#define FREGS_OFFSET(n, field) \
27-
{ \
28-
.name = n, \
29-
.offset = offsetof(struct ftrace_regs, field), \
26+
#define FREGS_OFFSET(n, field) \
27+
{ \
28+
.name = n, \
29+
.offset = offsetof(struct __arch_ftrace_regs, field), \
3030
}
3131

3232
static const struct fregs_offset fregs_offsets[] = {
@@ -481,7 +481,7 @@ void prepare_ftrace_return(unsigned long self_addr, unsigned long *parent,
481481
void ftrace_graph_func(unsigned long ip, unsigned long parent_ip,
482482
struct ftrace_ops *op, struct ftrace_regs *fregs)
483483
{
484-
prepare_ftrace_return(ip, &fregs->lr, fregs->fp);
484+
prepare_ftrace_return(ip, &arch_ftrace_regs(fregs)->lr, arch_ftrace_regs(fregs)->fp);
485485
}
486486
#else
487487
/*

arch/loongarch/include/asm/ftrace.h

Lines changed: 4 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -44,40 +44,19 @@ void prepare_ftrace_return(unsigned long self_addr, unsigned long *parent);
4444
#ifdef CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS
4545
struct ftrace_ops;
4646

47-
struct ftrace_regs {
48-
struct pt_regs regs;
49-
};
47+
#include <linux/ftrace_regs.h>
5048

5149
static __always_inline struct pt_regs *arch_ftrace_get_regs(struct ftrace_regs *fregs)
5250
{
53-
return &fregs->regs;
54-
}
55-
56-
static __always_inline unsigned long
57-
ftrace_regs_get_instruction_pointer(struct ftrace_regs *fregs)
58-
{
59-
return instruction_pointer(&fregs->regs);
51+
return &arch_ftrace_regs(fregs)->regs;
6052
}
6153

6254
static __always_inline void
6355
ftrace_regs_set_instruction_pointer(struct ftrace_regs *fregs, unsigned long ip)
6456
{
65-
instruction_pointer_set(&fregs->regs, ip);
57+
instruction_pointer_set(&arch_ftrace_regs(fregs)->regs, ip);
6658
}
6759

68-
#define ftrace_regs_get_argument(fregs, n) \
69-
regs_get_kernel_argument(&(fregs)->regs, n)
70-
#define ftrace_regs_get_stack_pointer(fregs) \
71-
kernel_stack_pointer(&(fregs)->regs)
72-
#define ftrace_regs_return_value(fregs) \
73-
regs_return_value(&(fregs)->regs)
74-
#define ftrace_regs_set_return_value(fregs, ret) \
75-
regs_set_return_value(&(fregs)->regs, ret)
76-
#define ftrace_override_function_with_return(fregs) \
77-
override_function_with_return(&(fregs)->regs)
78-
#define ftrace_regs_query_register_offset(name) \
79-
regs_query_register_offset(name)
80-
8160
#define ftrace_graph_func ftrace_graph_func
8261
void ftrace_graph_func(unsigned long ip, unsigned long parent_ip,
8362
struct ftrace_ops *op, struct ftrace_regs *fregs);
@@ -90,7 +69,7 @@ __arch_ftrace_set_direct_caller(struct pt_regs *regs, unsigned long addr)
9069
}
9170

9271
#define arch_ftrace_set_direct_caller(fregs, addr) \
93-
__arch_ftrace_set_direct_caller(&(fregs)->regs, addr)
72+
__arch_ftrace_set_direct_caller(&arch_ftrace_regs(fregs)->regs, addr)
9473
#endif /* CONFIG_DYNAMIC_FTRACE_WITH_DIRECT_CALLS */
9574

9675
#endif

arch/loongarch/kernel/ftrace_dyn.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ void prepare_ftrace_return(unsigned long self_addr, unsigned long *parent)
241241
void ftrace_graph_func(unsigned long ip, unsigned long parent_ip,
242242
struct ftrace_ops *op, struct ftrace_regs *fregs)
243243
{
244-
struct pt_regs *regs = &fregs->regs;
244+
struct pt_regs *regs = &arch_ftrace_regs(fregs)->regs;
245245
unsigned long *parent = (unsigned long *)&regs->regs[1];
246246

247247
prepare_ftrace_return(ip, (unsigned long *)parent);

arch/powerpc/include/asm/ftrace.h

Lines changed: 3 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -32,42 +32,21 @@ 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-
struct pt_regs regs;
37-
};
35+
#include <linux/ftrace_regs.h>
3836

3937
static __always_inline struct pt_regs *arch_ftrace_get_regs(struct ftrace_regs *fregs)
4038
{
4139
/* We clear regs.msr in ftrace_call */
42-
return fregs->regs.msr ? &fregs->regs : NULL;
40+
return arch_ftrace_regs(fregs)->regs.msr ? &arch_ftrace_regs(fregs)->regs : NULL;
4341
}
4442

4543
static __always_inline void
4644
ftrace_regs_set_instruction_pointer(struct ftrace_regs *fregs,
4745
unsigned long ip)
4846
{
49-
regs_set_return_ip(&fregs->regs, ip);
47+
regs_set_return_ip(&arch_ftrace_regs(fregs)->regs, ip);
5048
}
5149

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

7352
#define ftrace_graph_func ftrace_graph_func

arch/powerpc/kernel/trace/ftrace.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,7 @@ int __init ftrace_dyn_arch_init(void)
421421
void ftrace_graph_func(unsigned long ip, unsigned long parent_ip,
422422
struct ftrace_ops *op, struct ftrace_regs *fregs)
423423
{
424-
unsigned long sp = fregs->regs.gpr[1];
424+
unsigned long sp = arch_ftrace_regs(fregs)->regs.gpr[1];
425425
int bit;
426426

427427
if (unlikely(ftrace_graph_is_dead()))
@@ -439,6 +439,6 @@ void ftrace_graph_func(unsigned long ip, unsigned long parent_ip,
439439

440440
ftrace_test_recursion_unlock(bit);
441441
out:
442-
fregs->regs.link = parent_ip;
442+
arch_ftrace_regs(fregs)->regs.link = parent_ip;
443443
}
444444
#endif /* CONFIG_FUNCTION_GRAPH_TRACER */

arch/powerpc/kernel/trace/ftrace_64_pg.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -829,7 +829,7 @@ __prepare_ftrace_return(unsigned long parent, unsigned long ip, unsigned long sp
829829
void ftrace_graph_func(unsigned long ip, unsigned long parent_ip,
830830
struct ftrace_ops *op, struct ftrace_regs *fregs)
831831
{
832-
fregs->regs.link = __prepare_ftrace_return(parent_ip, ip, fregs->regs.gpr[1]);
832+
arch_ftrace_regs(fregs)->regs.link = __prepare_ftrace_return(parent_ip, ip, arch_ftrace_regs(fregs)->regs.gpr[1]);
833833
}
834834
#else
835835
unsigned long prepare_ftrace_return(unsigned long parent, unsigned long ip,

arch/riscv/include/asm/ftrace.h

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,12 @@ 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;
129-
struct ftrace_regs {
130+
struct ftrace_regs;
131+
#define arch_ftrace_regs(fregs) ((struct __arch_ftrace_regs *)(fregs))
132+
133+
struct __arch_ftrace_regs {
130134
unsigned long epc;
131135
unsigned long ra;
132136
unsigned long sp;
@@ -150,42 +154,42 @@ struct ftrace_regs {
150154
static __always_inline unsigned long ftrace_regs_get_instruction_pointer(const struct ftrace_regs
151155
*fregs)
152156
{
153-
return fregs->epc;
157+
return arch_ftrace_regs(fregs)->epc;
154158
}
155159

156160
static __always_inline void ftrace_regs_set_instruction_pointer(struct ftrace_regs *fregs,
157161
unsigned long pc)
158162
{
159-
fregs->epc = pc;
163+
arch_ftrace_regs(fregs)->epc = pc;
160164
}
161165

162166
static __always_inline unsigned long ftrace_regs_get_stack_pointer(const struct ftrace_regs *fregs)
163167
{
164-
return fregs->sp;
168+
return arch_ftrace_regs(fregs)->sp;
165169
}
166170

167171
static __always_inline unsigned long ftrace_regs_get_argument(struct ftrace_regs *fregs,
168172
unsigned int n)
169173
{
170174
if (n < 8)
171-
return fregs->args[n];
175+
return arch_ftrace_regs(fregs)->args[n];
172176
return 0;
173177
}
174178

175179
static __always_inline unsigned long ftrace_regs_get_return_value(const struct ftrace_regs *fregs)
176180
{
177-
return fregs->a0;
181+
return arch_ftrace_regs(fregs)->a0;
178182
}
179183

180184
static __always_inline void ftrace_regs_set_return_value(struct ftrace_regs *fregs,
181185
unsigned long ret)
182186
{
183-
fregs->a0 = ret;
187+
arch_ftrace_regs(fregs)->a0 = ret;
184188
}
185189

186190
static __always_inline void ftrace_override_function_with_return(struct ftrace_regs *fregs)
187191
{
188-
fregs->epc = fregs->ra;
192+
arch_ftrace_regs(fregs)->epc = arch_ftrace_regs(fregs)->ra;
189193
}
190194

191195
int ftrace_regs_query_register_offset(const char *name);
@@ -196,7 +200,7 @@ void ftrace_graph_func(unsigned long ip, unsigned long parent_ip,
196200

197201
static inline void arch_ftrace_set_direct_caller(struct ftrace_regs *fregs, unsigned long addr)
198202
{
199-
fregs->t1 = addr;
203+
arch_ftrace_regs(fregs)->t1 = addr;
200204
}
201205
#endif /* CONFIG_DYNAMIC_FTRACE_WITH_ARGS */
202206

arch/riscv/kernel/asm-offsets.c

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -496,19 +496,19 @@ void asm_offsets(void)
496496
OFFSET(STACKFRAME_RA, stackframe, ra);
497497

498498
#ifdef CONFIG_DYNAMIC_FTRACE_WITH_ARGS
499-
DEFINE(FREGS_SIZE_ON_STACK, ALIGN(sizeof(struct ftrace_regs), STACK_ALIGN));
500-
DEFINE(FREGS_EPC, offsetof(struct ftrace_regs, epc));
501-
DEFINE(FREGS_RA, offsetof(struct ftrace_regs, ra));
502-
DEFINE(FREGS_SP, offsetof(struct ftrace_regs, sp));
503-
DEFINE(FREGS_S0, offsetof(struct ftrace_regs, s0));
504-
DEFINE(FREGS_T1, offsetof(struct ftrace_regs, t1));
505-
DEFINE(FREGS_A0, offsetof(struct ftrace_regs, a0));
506-
DEFINE(FREGS_A1, offsetof(struct ftrace_regs, a1));
507-
DEFINE(FREGS_A2, offsetof(struct ftrace_regs, a2));
508-
DEFINE(FREGS_A3, offsetof(struct ftrace_regs, a3));
509-
DEFINE(FREGS_A4, offsetof(struct ftrace_regs, a4));
510-
DEFINE(FREGS_A5, offsetof(struct ftrace_regs, a5));
511-
DEFINE(FREGS_A6, offsetof(struct ftrace_regs, a6));
512-
DEFINE(FREGS_A7, offsetof(struct ftrace_regs, a7));
499+
DEFINE(FREGS_SIZE_ON_STACK, ALIGN(sizeof(struct __arch_ftrace_regs), STACK_ALIGN));
500+
DEFINE(FREGS_EPC, offsetof(struct __arch_ftrace_regs, epc));
501+
DEFINE(FREGS_RA, offsetof(struct __arch_ftrace_regs, ra));
502+
DEFINE(FREGS_SP, offsetof(struct __arch_ftrace_regs, sp));
503+
DEFINE(FREGS_S0, offsetof(struct __arch_ftrace_regs, s0));
504+
DEFINE(FREGS_T1, offsetof(struct __arch_ftrace_regs, t1));
505+
DEFINE(FREGS_A0, offsetof(struct __arch_ftrace_regs, a0));
506+
DEFINE(FREGS_A1, offsetof(struct __arch_ftrace_regs, a1));
507+
DEFINE(FREGS_A2, offsetof(struct __arch_ftrace_regs, a2));
508+
DEFINE(FREGS_A3, offsetof(struct __arch_ftrace_regs, a3));
509+
DEFINE(FREGS_A4, offsetof(struct __arch_ftrace_regs, a4));
510+
DEFINE(FREGS_A5, offsetof(struct __arch_ftrace_regs, a5));
511+
DEFINE(FREGS_A6, offsetof(struct __arch_ftrace_regs, a6));
512+
DEFINE(FREGS_A7, offsetof(struct __arch_ftrace_regs, a7));
513513
#endif
514514
}

0 commit comments

Comments
 (0)