1#ifndef _LINUX_UPROBES_H
2#define _LINUX_UPROBES_H
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27#include <linux/errno.h>
28#include <linux/rbtree.h>
29#include <linux/rh_kabi.h>
30
31struct vm_area_struct;
32struct mm_struct;
33struct inode;
34
35#ifdef CONFIG_ARCH_SUPPORTS_UPROBES
36# include <asm/uprobes.h>
37#endif
38
39#define UPROBE_HANDLER_REMOVE 1
40#define UPROBE_HANDLER_MASK 1
41
42#define MAX_URETPROBE_DEPTH 64
43
44enum uprobe_filter_ctx {
45 UPROBE_FILTER_REGISTER,
46 UPROBE_FILTER_UNREGISTER,
47 UPROBE_FILTER_MMAP,
48};
49
50struct uprobe_consumer {
51 int (*handler)(struct uprobe_consumer *self, struct pt_regs *regs);
52 int (*ret_handler)(struct uprobe_consumer *self,
53 unsigned long func,
54 struct pt_regs *regs);
55 bool (*filter)(struct uprobe_consumer *self,
56 enum uprobe_filter_ctx ctx,
57 struct mm_struct *mm);
58
59 struct uprobe_consumer *next;
60};
61
62#ifdef CONFIG_UPROBES
63enum uprobe_task_state {
64 UTASK_RUNNING,
65 UTASK_SSTEP,
66 UTASK_SSTEP_ACK,
67 UTASK_SSTEP_TRAPPED,
68};
69
70
71
72
73struct uprobe_task {
74 enum uprobe_task_state state;
75 struct arch_uprobe_task autask;
76
77 struct return_instance *return_instances;
78 unsigned int depth;
79 struct uprobe *active_uprobe;
80
81 unsigned long xol_vaddr;
82 unsigned long vaddr;
83};
84
85#ifndef __GENKSYMS__
86struct return_instance {
87 struct uprobe *uprobe;
88 unsigned long func;
89 unsigned long stack;
90 unsigned long orig_ret_vaddr;
91 bool chained;
92
93 struct return_instance *next;
94};
95#endif
96
97enum rp_check {
98 RP_CHECK_CALL,
99 RP_CHECK_CHAIN_CALL,
100 RP_CHECK_RET,
101};
102
103
104
105
106
107
108struct xol_area {
109 wait_queue_head_t wq;
110 atomic_t slot_count;
111 unsigned long *bitmap;
112 struct page *page;
113
114
115
116
117
118
119 unsigned long vaddr;
120};
121
122struct uprobes_state {
123#ifdef CONFIG_S390
124 RH_KABI_EXTEND(struct xol_area *xol_area)
125#else
126 struct xol_area *xol_area;
127#endif
128};
129
130extern int __weak set_swbp(struct arch_uprobe *aup, struct mm_struct *mm, unsigned long vaddr);
131extern int __weak set_orig_insn(struct arch_uprobe *aup, struct mm_struct *mm, unsigned long vaddr);
132extern bool __weak is_swbp_insn(uprobe_opcode_t *insn);
133extern bool __weak is_trap_insn(uprobe_opcode_t *insn);
134extern int uprobe_register(struct inode *inode, loff_t offset, struct uprobe_consumer *uc);
135extern int uprobe_apply(struct inode *inode, loff_t offset, struct uprobe_consumer *uc, bool);
136extern void uprobe_unregister(struct inode *inode, loff_t offset, struct uprobe_consumer *uc);
137extern int uprobe_mmap(struct vm_area_struct *vma);
138extern void uprobe_munmap(struct vm_area_struct *vma, unsigned long start, unsigned long end);
139extern void uprobe_start_dup_mmap(void);
140extern void uprobe_end_dup_mmap(void);
141extern void uprobe_dup_mmap(struct mm_struct *oldmm, struct mm_struct *newmm);
142extern void uprobe_free_utask(struct task_struct *t);
143extern void uprobe_copy_process(struct task_struct *t, unsigned long flags);
144extern unsigned long __weak uprobe_get_swbp_addr(struct pt_regs *regs);
145extern int uprobe_post_sstep_notifier(struct pt_regs *regs);
146extern int uprobe_pre_sstep_notifier(struct pt_regs *regs);
147extern void uprobe_notify_resume(struct pt_regs *regs);
148extern bool uprobe_deny_signal(void);
149extern bool __weak arch_uprobe_skip_sstep(struct arch_uprobe *aup, struct pt_regs *regs);
150extern bool arch_uretprobe_is_alive(struct return_instance *ret, enum rp_check ctx, struct pt_regs *regs);
151extern void uprobe_clear_state(struct mm_struct *mm);
152#else
153struct uprobes_state {
154};
155static inline int
156uprobe_register(struct inode *inode, loff_t offset, struct uprobe_consumer *uc)
157{
158 return -ENOSYS;
159}
160static inline int
161uprobe_apply(struct inode *inode, loff_t offset, struct uprobe_consumer *uc, bool add)
162{
163 return -ENOSYS;
164}
165static inline void
166uprobe_unregister(struct inode *inode, loff_t offset, struct uprobe_consumer *uc)
167{
168}
169static inline int uprobe_mmap(struct vm_area_struct *vma)
170{
171 return 0;
172}
173static inline void
174uprobe_munmap(struct vm_area_struct *vma, unsigned long start, unsigned long end)
175{
176}
177static inline void uprobe_start_dup_mmap(void)
178{
179}
180static inline void uprobe_end_dup_mmap(void)
181{
182}
183static inline void
184uprobe_dup_mmap(struct mm_struct *oldmm, struct mm_struct *newmm)
185{
186}
187static inline void uprobe_notify_resume(struct pt_regs *regs)
188{
189}
190static inline bool uprobe_deny_signal(void)
191{
192 return false;
193}
194static inline unsigned long uprobe_get_swbp_addr(struct pt_regs *regs)
195{
196 return 0;
197}
198static inline void uprobe_free_utask(struct task_struct *t)
199{
200}
201static inline void uprobe_copy_process(struct task_struct *t, unsigned long flags)
202{
203}
204static inline void uprobe_clear_state(struct mm_struct *mm)
205{
206}
207#endif
208#endif
209