^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) #ifndef _ASM_S390_FTRACE_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #define _ASM_S390_FTRACE_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #define ARCH_SUPPORTS_FTRACE_OPS 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #if defined(CC_USING_HOTPATCH) || defined(CC_USING_NOP_MCOUNT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #define MCOUNT_INSN_SIZE 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #define MCOUNT_INSN_SIZE 24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #define MCOUNT_RETURN_FIXUP 18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #define HAVE_FUNCTION_GRAPH_RET_ADDR_PTR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #ifndef __ASSEMBLY__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #ifdef CONFIG_CC_IS_CLANG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) /* https://bugs.llvm.org/show_bug.cgi?id=41424 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define ftrace_return_address(n) 0UL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #define ftrace_return_address(n) __builtin_return_address(n)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) void _mcount(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) void ftrace_caller(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) extern char ftrace_graph_caller_end;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) extern unsigned long ftrace_plt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) extern void *ftrace_func;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) struct dyn_arch_ftrace { };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #define MCOUNT_ADDR ((unsigned long)_mcount)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #define FTRACE_ADDR ((unsigned long)ftrace_caller)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define KPROBE_ON_FTRACE_NOP 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #define KPROBE_ON_FTRACE_CALL 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) static inline unsigned long ftrace_call_adjust(unsigned long addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) return addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) struct ftrace_insn {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) u16 opc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) s32 disp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) static inline void ftrace_generate_nop_insn(struct ftrace_insn *insn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #ifdef CONFIG_FUNCTION_TRACER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #if defined(CC_USING_HOTPATCH) || defined(CC_USING_NOP_MCOUNT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) /* brcl 0,0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) insn->opc = 0xc004;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) insn->disp = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) /* jg .+24 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) insn->opc = 0xc0f4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) insn->disp = MCOUNT_INSN_SIZE / 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) static inline int is_ftrace_nop(struct ftrace_insn *insn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) #ifdef CONFIG_FUNCTION_TRACER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) #if defined(CC_USING_HOTPATCH) || defined(CC_USING_NOP_MCOUNT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) if (insn->disp == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) if (insn->disp == MCOUNT_INSN_SIZE / 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) static inline void ftrace_generate_call_insn(struct ftrace_insn *insn,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) unsigned long ip)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) #ifdef CONFIG_FUNCTION_TRACER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) unsigned long target;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) /* brasl r0,ftrace_caller */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) target = is_module_addr((void *) ip) ? ftrace_plt : FTRACE_ADDR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) insn->opc = 0xc005;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) insn->disp = (target - ip) / 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) * Even though the system call numbers are identical for s390/s390x a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) * different system call table is used for compat tasks. This may lead
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) * to e.g. incorrect or missing trace event sysfs files.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) * Therefore simply do not trace compat system calls at all.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) * See kernel/trace/trace_syscalls.c.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) #define ARCH_TRACE_IGNORE_COMPAT_SYSCALLS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) static inline bool arch_trace_is_compat_syscall(struct pt_regs *regs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) return is_compat_task();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) #define ARCH_HAS_SYSCALL_MATCH_SYM_NAME
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) static inline bool arch_syscall_match_sym_name(const char *sym,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) const char *name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) * Skip __s390_ and __s390x_ prefix - due to compat wrappers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) * and aliasing some symbols of 64 bit system call functions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) * may get the __s390_ prefix instead of the __s390x_ prefix.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) return !strcmp(sym + 7, name) || !strcmp(sym + 8, name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) #endif /* __ASSEMBLY__ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) #endif /* _ASM_S390_FTRACE_H */