File Index
Files and directories
Sign in
FILE

ftrace.h

File preview with syntax highlighting.

linux-6.19.14/arch/s390/include/asm/ftrace.h C
  1/* SPDX-License-Identifier: GPL-2.0 */
  2#ifndef _ASM_S390_FTRACE_H
  3#define _ASM_S390_FTRACE_H
  4
  5#define ARCH_SUPPORTS_FTRACE_OPS 1
  6#define MCOUNT_INSN_SIZE	6
  7
  8#ifndef __ASSEMBLER__
  9#include <asm/stacktrace.h>
 10
 11static __always_inline unsigned long return_address(unsigned int n)
 12{
 13	struct stack_frame *sf;
 14
 15	if (!n)
 16		return (unsigned long)__builtin_return_address(0);
 17
 18	sf = (struct stack_frame *)current_frame_address();
 19	do {
 20		sf = (struct stack_frame *)sf->back_chain;
 21		if (!sf)
 22			return 0;
 23	} while (--n);
 24	return sf->gprs[8];
 25}
 26#define ftrace_return_address(n) return_address(n)
 27
 28void ftrace_caller(void);
 29
 30extern void *ftrace_func;
 31
 32struct dyn_arch_ftrace { };
 33
 34#define MCOUNT_ADDR 0
 35#define FTRACE_ADDR ((unsigned long)ftrace_caller)
 36
 37#define KPROBE_ON_FTRACE_NOP	0
 38#define KPROBE_ON_FTRACE_CALL	1
 39
 40struct module;
 41struct dyn_ftrace;
 42struct ftrace_ops;
 43
 44bool ftrace_need_init_nop(void);
 45#define ftrace_need_init_nop ftrace_need_init_nop
 46
 47int ftrace_init_nop(struct module *mod, struct dyn_ftrace *rec);
 48#define ftrace_init_nop ftrace_init_nop
 49
 50static inline unsigned long ftrace_call_adjust(unsigned long addr)
 51{
 52	return addr;
 53}
 54#define ftrace_get_symaddr(fentry_ip) ((unsigned long)(fentry_ip))
 55
 56#include <linux/ftrace_regs.h>
 57
 58static __always_inline struct pt_regs *arch_ftrace_get_regs(struct ftrace_regs *fregs)
 59{
 60	struct pt_regs *regs = &arch_ftrace_regs(fregs)->regs;
 61
 62	if (test_pt_regs_flag(regs, PIF_FTRACE_FULL_REGS))
 63		return regs;
 64	return NULL;
 65}
 66
 67static __always_inline void
 68ftrace_regs_set_instruction_pointer(struct ftrace_regs *fregs,
 69				    unsigned long ip)
 70{
 71	arch_ftrace_regs(fregs)->regs.psw.addr = ip;
 72}
 73
 74#undef ftrace_regs_get_frame_pointer
 75static __always_inline unsigned long
 76ftrace_regs_get_frame_pointer(struct ftrace_regs *fregs)
 77{
 78	return ftrace_regs_get_stack_pointer(fregs);
 79}
 80
 81static __always_inline unsigned long
 82ftrace_regs_get_return_address(const struct ftrace_regs *fregs)
 83{
 84	return arch_ftrace_regs(fregs)->regs.gprs[14];
 85}
 86
 87#define arch_ftrace_fill_perf_regs(fregs, _regs)	 do {		\
 88		(_regs)->psw.mask = 0;					\
 89		(_regs)->psw.addr = arch_ftrace_regs(fregs)->regs.psw.addr;		\
 90		(_regs)->gprs[15] = arch_ftrace_regs(fregs)->regs.gprs[15];		\
 91	} while (0)
 92
 93#ifdef CONFIG_DYNAMIC_FTRACE_WITH_DIRECT_CALLS
 94/*
 95 * When an ftrace registered caller is tracing a function that is
 96 * also set by a register_ftrace_direct() call, it needs to be
 97 * differentiated in the ftrace_caller trampoline. To do this,
 98 * place the direct caller in the ORIG_GPR2 part of pt_regs. This
 99 * tells the ftrace_caller that there's a direct caller.
100 */
101static inline void arch_ftrace_set_direct_caller(struct ftrace_regs *fregs, unsigned long addr)
102{
103	struct pt_regs *regs = &arch_ftrace_regs(fregs)->regs;
104	regs->orig_gpr2 = addr;
105}
106#endif /* CONFIG_DYNAMIC_FTRACE_WITH_DIRECT_CALLS */
107
108#define ARCH_HAS_SYSCALL_MATCH_SYM_NAME
109static inline bool arch_syscall_match_sym_name(const char *sym,
110					       const char *name)
111{
112	/* Skip the __s390x_ prefix. */
113	return !strcmp(sym + 7, name) || !strcmp(sym + 8, name);
114}
115
116void ftrace_graph_func(unsigned long ip, unsigned long parent_ip,
117		       struct ftrace_ops *op, struct ftrace_regs *fregs);
118#define ftrace_graph_func ftrace_graph_func
119
120#endif /* __ASSEMBLER__ */
121
122#ifdef CONFIG_FUNCTION_TRACER
123
124#define FTRACE_NOP_INSN .word 0xc004, 0x0000, 0x0000 /* brcl 0,0 */
125
126#ifndef CC_USING_HOTPATCH
127
128#define FTRACE_GEN_MCOUNT_RECORD(name)		\
129	.section __mcount_loc, "a", @progbits;	\
130	.quad name;				\
131	.previous;
132
133#else /* !CC_USING_HOTPATCH */
134
135#define FTRACE_GEN_MCOUNT_RECORD(name)
136
137#endif /* !CC_USING_HOTPATCH */
138
139#define FTRACE_GEN_NOP_ASM(name)		\
140	FTRACE_GEN_MCOUNT_RECORD(name)		\
141	FTRACE_NOP_INSN
142
143#else /* CONFIG_FUNCTION_TRACER */
144
145#define FTRACE_GEN_NOP_ASM(name)
146
147#endif /* CONFIG_FUNCTION_TRACER */
148
149#endif /* _ASM_S390_FTRACE_H */
~/ Read-only file preview.