xref: /linux/arch/s390/include/asm/kprobes.h (revision 0b8061c340b643e01da431dd60c75a41bb1d31ec)
1 /* SPDX-License-Identifier: GPL-2.0+ */
2 #ifndef _ASM_S390_KPROBES_H
3 #define _ASM_S390_KPROBES_H
4 /*
5  *  Kernel Probes (KProbes)
6  *
7  * Copyright IBM Corp. 2002, 2006
8  *
9  * 2002-Oct	Created by Vamsi Krishna S <vamsi_krishna@in.ibm.com> Kernel
10  *		Probes initial implementation ( includes suggestions from
11  *		Rusty Russell).
12  * 2004-Nov	Modified for PPC64 by Ananth N Mavinakayanahalli
13  *		<ananth@in.ibm.com>
14  * 2005-Dec	Used as a template for s390 by Mike Grundy
15  *		<grundym@us.ibm.com>
16  */
17 #include <linux/types.h>
18 #include <asm-generic/kprobes.h>
19 
20 #define BREAKPOINT_INSTRUCTION	0x0002
21 
22 #define FIXUP_PSW_NORMAL	0x08
23 #define FIXUP_BRANCH_NOT_TAKEN	0x04
24 #define FIXUP_RETURN_REGISTER	0x02
25 #define FIXUP_NOT_REQUIRED	0x01
26 
27 int probe_is_prohibited_opcode(u16 *insn);
28 int probe_get_fixup_type(u16 *insn);
29 int probe_is_insn_relative_long(u16 *insn);
30 
31 #ifdef CONFIG_KPROBES
32 #include <linux/ptrace.h>
33 #include <linux/percpu.h>
34 #include <linux/sched/task_stack.h>
35 
36 #define __ARCH_WANT_KPROBES_INSN_SLOT
37 
38 struct pt_regs;
39 struct kprobe;
40 
41 typedef u16 kprobe_opcode_t;
42 
43 /* Maximum instruction size is 3 (16bit) halfwords: */
44 #define MAX_INSN_SIZE		0x0003
45 #define MAX_STACK_SIZE		64
46 #define MIN_STACK_SIZE(ADDR) (((MAX_STACK_SIZE) < \
47 	(((unsigned long)task_stack_page(current)) + THREAD_SIZE - (ADDR))) \
48 	? (MAX_STACK_SIZE) \
49 	: (((unsigned long)task_stack_page(current)) + THREAD_SIZE - (ADDR)))
50 
51 #define kretprobe_blacklist_size 0
52 
53 /* Architecture specific copy of original instruction */
54 struct arch_specific_insn {
55 	/* copy of original instruction */
56 	kprobe_opcode_t *insn;
57 };
58 
59 struct prev_kprobe {
60 	struct kprobe *kp;
61 	unsigned long status;
62 };
63 
64 /* per-cpu kprobe control block */
65 struct kprobe_ctlblk {
66 	unsigned long kprobe_status;
67 	unsigned long kprobe_saved_imask;
68 	unsigned long kprobe_saved_ctl[3];
69 	struct prev_kprobe prev_kprobe;
70 };
71 
72 void arch_remove_kprobe(struct kprobe *p);
73 void kretprobe_trampoline(void);
74 
75 int kprobe_fault_handler(struct pt_regs *regs, int trapnr);
76 int kprobe_exceptions_notify(struct notifier_block *self,
77 	unsigned long val, void *data);
78 
79 #define flush_insn_slot(p)	do { } while (0)
80 
81 #endif /* CONFIG_KPROBES */
82 #endif	/* _ASM_S390_KPROBES_H */
83