diff options
author | Paul Mackerras <paulus@samba.org> | 2008-01-30 19:25:51 -0500 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2008-01-30 19:25:51 -0500 |
commit | bd45ac0c5daae35e7c71138172e63df5cf644cf6 (patch) | |
tree | 5eb5a599bf6a9d7a8a34e802db932aa9e9555de4 /arch/x86/kernel/kprobes.c | |
parent | 4eece4ccf997c0e6d8fdad3d842e37b16b8d705f (diff) | |
parent | 5bdeae46be6dfe9efa44a548bd622af325f4bdb4 (diff) |
Merge branch 'linux-2.6'
Diffstat (limited to 'arch/x86/kernel/kprobes.c')
-rw-r--r-- | arch/x86/kernel/kprobes.c | 1066 |
1 files changed, 1066 insertions, 0 deletions
diff --git a/arch/x86/kernel/kprobes.c b/arch/x86/kernel/kprobes.c new file mode 100644 index 000000000000..a99e764fd66a --- /dev/null +++ b/arch/x86/kernel/kprobes.c | |||
@@ -0,0 +1,1066 @@ | |||
1 | /* | ||
2 | * Kernel Probes (KProbes) | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License as published by | ||
6 | * the Free Software Foundation; either version 2 of the License, or | ||
7 | * (at your option) any later version. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program; if not, write to the Free Software | ||
16 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
17 | * | ||
18 | * Copyright (C) IBM Corporation, 2002, 2004 | ||
19 | * | ||
20 | * 2002-Oct Created by Vamsi Krishna S <vamsi_krishna@in.ibm.com> Kernel | ||
21 | * Probes initial implementation ( includes contributions from | ||
22 | * Rusty Russell). | ||
23 | * 2004-July Suparna Bhattacharya <suparna@in.ibm.com> added jumper probes | ||
24 | * interface to access function arguments. | ||
25 | * 2004-Oct Jim Keniston <jkenisto@us.ibm.com> and Prasanna S Panchamukhi | ||
26 | * <prasanna@in.ibm.com> adapted for x86_64 from i386. | ||
27 | * 2005-Mar Roland McGrath <roland@redhat.com> | ||
28 | * Fixed to handle %rip-relative addressing mode correctly. | ||
29 | * 2005-May Hien Nguyen <hien@us.ibm.com>, Jim Keniston | ||
30 | * <jkenisto@us.ibm.com> and Prasanna S Panchamukhi | ||
31 | * <prasanna@in.ibm.com> added function-return probes. | ||
32 | * 2005-May Rusty Lynch <rusty.lynch@intel.com> | ||
33 | * Added function return probes functionality | ||
34 | * 2006-Feb Masami Hiramatsu <hiramatu@sdl.hitachi.co.jp> added | ||
35 | * kprobe-booster and kretprobe-booster for i386. | ||
36 | * 2007-Dec Masami Hiramatsu <mhiramat@redhat.com> added kprobe-booster | ||
37 | * and kretprobe-booster for x86-64 | ||
38 | * 2007-Dec Masami Hiramatsu <mhiramat@redhat.com>, Arjan van de Ven | ||
39 | * <arjan@infradead.org> and Jim Keniston <jkenisto@us.ibm.com> | ||
40 | * unified x86 kprobes code. | ||
41 | */ | ||
42 | |||
43 | #include <linux/kprobes.h> | ||
44 | #include <linux/ptrace.h> | ||
45 | #include <linux/string.h> | ||
46 | #include <linux/slab.h> | ||
47 | #include <linux/hardirq.h> | ||
48 | #include <linux/preempt.h> | ||
49 | #include <linux/module.h> | ||
50 | #include <linux/kdebug.h> | ||
51 | |||
52 | #include <asm/cacheflush.h> | ||
53 | #include <asm/desc.h> | ||
54 | #include <asm/pgtable.h> | ||
55 | #include <asm/uaccess.h> | ||
56 | #include <asm/alternative.h> | ||
57 | |||
58 | void jprobe_return_end(void); | ||
59 | |||
60 | DEFINE_PER_CPU(struct kprobe *, current_kprobe) = NULL; | ||
61 | DEFINE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk); | ||
62 | |||
63 | #ifdef CONFIG_X86_64 | ||
64 | #define stack_addr(regs) ((unsigned long *)regs->sp) | ||
65 | #else | ||
66 | /* | ||
67 | * "®s->sp" looks wrong, but it's correct for x86_32. x86_32 CPUs | ||
68 | * don't save the ss and esp registers if the CPU is already in kernel | ||
69 | * mode when it traps. So for kprobes, regs->sp and regs->ss are not | ||
70 | * the [nonexistent] saved stack pointer and ss register, but rather | ||
71 | * the top 8 bytes of the pre-int3 stack. So ®s->sp happens to | ||
72 | * point to the top of the pre-int3 stack. | ||
73 | */ | ||
74 | #define stack_addr(regs) ((unsigned long *)®s->sp) | ||
75 | #endif | ||
76 | |||
77 | #define W(row, b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, ba, bb, bc, bd, be, bf)\ | ||
78 | (((b0##UL << 0x0)|(b1##UL << 0x1)|(b2##UL << 0x2)|(b3##UL << 0x3) | \ | ||
79 | (b4##UL << 0x4)|(b5##UL << 0x5)|(b6##UL << 0x6)|(b7##UL << 0x7) | \ | ||
80 | (b8##UL << 0x8)|(b9##UL << 0x9)|(ba##UL << 0xa)|(bb##UL << 0xb) | \ | ||
81 | (bc##UL << 0xc)|(bd##UL << 0xd)|(be##UL << 0xe)|(bf##UL << 0xf)) \ | ||
82 | << (row % 32)) | ||
83 | /* | ||
84 | * Undefined/reserved opcodes, conditional jump, Opcode Extension | ||
85 | * Groups, and some special opcodes can not boost. | ||
86 | */ | ||
87 | static const u32 twobyte_is_boostable[256 / 32] = { | ||
88 | /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ | ||
89 | /* ---------------------------------------------- */ | ||
90 | W(0x00, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0) | /* 00 */ | ||
91 | W(0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) , /* 10 */ | ||
92 | W(0x20, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) | /* 20 */ | ||
93 | W(0x30, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) , /* 30 */ | ||
94 | W(0x40, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) | /* 40 */ | ||
95 | W(0x50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) , /* 50 */ | ||
96 | W(0x60, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1) | /* 60 */ | ||
97 | W(0x70, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1) , /* 70 */ | ||
98 | W(0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) | /* 80 */ | ||
99 | W(0x90, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) , /* 90 */ | ||
100 | W(0xa0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1) | /* a0 */ | ||
101 | W(0xb0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1) , /* b0 */ | ||
102 | W(0xc0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1) | /* c0 */ | ||
103 | W(0xd0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1) , /* d0 */ | ||
104 | W(0xe0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1) | /* e0 */ | ||
105 | W(0xf0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0) /* f0 */ | ||
106 | /* ----------------------------------------------- */ | ||
107 | /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ | ||
108 | }; | ||
109 | static const u32 onebyte_has_modrm[256 / 32] = { | ||
110 | /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ | ||
111 | /* ----------------------------------------------- */ | ||
112 | W(0x00, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0) | /* 00 */ | ||
113 | W(0x10, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0) , /* 10 */ | ||
114 | W(0x20, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0) | /* 20 */ | ||
115 | W(0x30, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0) , /* 30 */ | ||
116 | W(0x40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) | /* 40 */ | ||
117 | W(0x50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) , /* 50 */ | ||
118 | W(0x60, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0) | /* 60 */ | ||
119 | W(0x70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) , /* 70 */ | ||
120 | W(0x80, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) | /* 80 */ | ||
121 | W(0x90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) , /* 90 */ | ||
122 | W(0xa0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) | /* a0 */ | ||
123 | W(0xb0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) , /* b0 */ | ||
124 | W(0xc0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0) | /* c0 */ | ||
125 | W(0xd0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1) , /* d0 */ | ||
126 | W(0xe0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) | /* e0 */ | ||
127 | W(0xf0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1) /* f0 */ | ||
128 | /* ----------------------------------------------- */ | ||
129 | /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ | ||
130 | }; | ||
131 | static const u32 twobyte_has_modrm[256 / 32] = { | ||
132 | /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ | ||
133 | /* ----------------------------------------------- */ | ||
134 | W(0x00, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1) | /* 0f */ | ||
135 | W(0x10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0) , /* 1f */ | ||
136 | W(0x20, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1) | /* 2f */ | ||
137 | W(0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) , /* 3f */ | ||
138 | W(0x40, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) | /* 4f */ | ||
139 | W(0x50, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) , /* 5f */ | ||
140 | W(0x60, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) | /* 6f */ | ||
141 | W(0x70, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1) , /* 7f */ | ||
142 | W(0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) | /* 8f */ | ||
143 | W(0x90, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) , /* 9f */ | ||
144 | W(0xa0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1) | /* af */ | ||
145 | W(0xb0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1) , /* bf */ | ||
146 | W(0xc0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0) | /* cf */ | ||
147 | W(0xd0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) , /* df */ | ||
148 | W(0xe0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) | /* ef */ | ||
149 | W(0xf0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0) /* ff */ | ||
150 | /* ----------------------------------------------- */ | ||
151 | /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ | ||
152 | }; | ||
153 | #undef W | ||
154 | |||
155 | struct kretprobe_blackpoint kretprobe_blacklist[] = { | ||
156 | {"__switch_to", }, /* This function switches only current task, but | ||
157 | doesn't switch kernel stack.*/ | ||
158 | {NULL, NULL} /* Terminator */ | ||
159 | }; | ||
160 | const int kretprobe_blacklist_size = ARRAY_SIZE(kretprobe_blacklist); | ||
161 | |||
162 | /* Insert a jump instruction at address 'from', which jumps to address 'to'.*/ | ||
163 | static void __kprobes set_jmp_op(void *from, void *to) | ||
164 | { | ||
165 | struct __arch_jmp_op { | ||
166 | char op; | ||
167 | s32 raddr; | ||
168 | } __attribute__((packed)) * jop; | ||
169 | jop = (struct __arch_jmp_op *)from; | ||
170 | jop->raddr = (s32)((long)(to) - ((long)(from) + 5)); | ||
171 | jop->op = RELATIVEJUMP_INSTRUCTION; | ||
172 | } | ||
173 | |||
174 | /* | ||
175 | * Check for the REX prefix which can only exist on X86_64 | ||
176 | * X86_32 always returns 0 | ||
177 | */ | ||
178 | static int __kprobes is_REX_prefix(kprobe_opcode_t *insn) | ||
179 | { | ||
180 | #ifdef CONFIG_X86_64 | ||
181 | if ((*insn & 0xf0) == 0x40) | ||
182 | return 1; | ||
183 | #endif | ||
184 | return 0; | ||
185 | } | ||
186 | |||
187 | /* | ||
188 | * Returns non-zero if opcode is boostable. | ||
189 | * RIP relative instructions are adjusted at copying time in 64 bits mode | ||
190 | */ | ||
191 | static int __kprobes can_boost(kprobe_opcode_t *opcodes) | ||
192 | { | ||
193 | kprobe_opcode_t opcode; | ||
194 | kprobe_opcode_t *orig_opcodes = opcodes; | ||
195 | |||
196 | retry: | ||
197 | if (opcodes - orig_opcodes > MAX_INSN_SIZE - 1) | ||
198 | return 0; | ||
199 | opcode = *(opcodes++); | ||
200 | |||
201 | /* 2nd-byte opcode */ | ||
202 | if (opcode == 0x0f) { | ||
203 | if (opcodes - orig_opcodes > MAX_INSN_SIZE - 1) | ||
204 | return 0; | ||
205 | return test_bit(*opcodes, | ||
206 | (unsigned long *)twobyte_is_boostable); | ||
207 | } | ||
208 | |||
209 | switch (opcode & 0xf0) { | ||
210 | #ifdef CONFIG_X86_64 | ||
211 | case 0x40: | ||
212 | goto retry; /* REX prefix is boostable */ | ||
213 | #endif | ||
214 | case 0x60: | ||
215 | if (0x63 < opcode && opcode < 0x67) | ||
216 | goto retry; /* prefixes */ | ||
217 | /* can't boost Address-size override and bound */ | ||
218 | return (opcode != 0x62 && opcode != 0x67); | ||
219 | case 0x70: | ||
220 | return 0; /* can't boost conditional jump */ | ||
221 | case 0xc0: | ||
222 | /* can't boost software-interruptions */ | ||
223 | return (0xc1 < opcode && opcode < 0xcc) || opcode == 0xcf; | ||
224 | case 0xd0: | ||
225 | /* can boost AA* and XLAT */ | ||
226 | return (opcode == 0xd4 || opcode == 0xd5 || opcode == 0xd7); | ||
227 | case 0xe0: | ||
228 | /* can boost in/out and absolute jmps */ | ||
229 | return ((opcode & 0x04) || opcode == 0xea); | ||
230 | case 0xf0: | ||
231 | if ((opcode & 0x0c) == 0 && opcode != 0xf1) | ||
232 | goto retry; /* lock/rep(ne) prefix */ | ||
233 | /* clear and set flags are boostable */ | ||
234 | return (opcode == 0xf5 || (0xf7 < opcode && opcode < 0xfe)); | ||
235 | default: | ||
236 | /* segment override prefixes are boostable */ | ||
237 | if (opcode == 0x26 || opcode == 0x36 || opcode == 0x3e) | ||
238 | goto retry; /* prefixes */ | ||
239 | /* CS override prefix and call are not boostable */ | ||
240 | return (opcode != 0x2e && opcode != 0x9a); | ||
241 | } | ||
242 | } | ||
243 | |||
244 | /* | ||
245 | * Returns non-zero if opcode modifies the interrupt flag. | ||
246 | */ | ||
247 | static int __kprobes is_IF_modifier(kprobe_opcode_t *insn) | ||
248 | { | ||
249 | switch (*insn) { | ||
250 | case 0xfa: /* cli */ | ||
251 | case 0xfb: /* sti */ | ||
252 | case 0xcf: /* iret/iretd */ | ||
253 | case 0x9d: /* popf/popfd */ | ||
254 | return 1; | ||
255 | } | ||
256 | |||
257 | /* | ||
258 | * on X86_64, 0x40-0x4f are REX prefixes so we need to look | ||
259 | * at the next byte instead.. but of course not recurse infinitely | ||
260 | */ | ||
261 | if (is_REX_prefix(insn)) | ||
262 | return is_IF_modifier(++insn); | ||
263 | |||
264 | return 0; | ||
265 | } | ||
266 | |||
267 | /* | ||
268 | * Adjust the displacement if the instruction uses the %rip-relative | ||
269 | * addressing mode. | ||
270 | * If it does, Return the address of the 32-bit displacement word. | ||
271 | * If not, return null. | ||
272 | * Only applicable to 64-bit x86. | ||
273 | */ | ||
274 | static void __kprobes fix_riprel(struct kprobe *p) | ||
275 | { | ||
276 | #ifdef CONFIG_X86_64 | ||
277 | u8 *insn = p->ainsn.insn; | ||
278 | s64 disp; | ||
279 | int need_modrm; | ||
280 | |||
281 | /* Skip legacy instruction prefixes. */ | ||
282 | while (1) { | ||
283 | switch (*insn) { | ||
284 | case 0x66: | ||
285 | case 0x67: | ||
286 | case 0x2e: | ||
287 | case 0x3e: | ||
288 | case 0x26: | ||
289 | case 0x64: | ||
290 | case 0x65: | ||
291 | case 0x36: | ||
292 | case 0xf0: | ||
293 | case 0xf3: | ||
294 | case 0xf2: | ||
295 | ++insn; | ||
296 | continue; | ||
297 | } | ||
298 | break; | ||
299 | } | ||
300 | |||
301 | /* Skip REX instruction prefix. */ | ||
302 | if (is_REX_prefix(insn)) | ||
303 | ++insn; | ||
304 | |||
305 | if (*insn == 0x0f) { | ||
306 | /* Two-byte opcode. */ | ||
307 | ++insn; | ||
308 | need_modrm = test_bit(*insn, | ||
309 | (unsigned long *)twobyte_has_modrm); | ||
310 | } else | ||
311 | /* One-byte opcode. */ | ||
312 | need_modrm = test_bit(*insn, | ||
313 | (unsigned long *)onebyte_has_modrm); | ||
314 | |||
315 | if (need_modrm) { | ||
316 | u8 modrm = *++insn; | ||
317 | if ((modrm & 0xc7) == 0x05) { | ||
318 | /* %rip+disp32 addressing mode */ | ||
319 | /* Displacement follows ModRM byte. */ | ||
320 | ++insn; | ||
321 | /* | ||
322 | * The copied instruction uses the %rip-relative | ||
323 | * addressing mode. Adjust the displacement for the | ||
324 | * difference between the original location of this | ||
325 | * instruction and the location of the copy that will | ||
326 | * actually be run. The tricky bit here is making sure | ||
327 | * that the sign extension happens correctly in this | ||
328 | * calculation, since we need a signed 32-bit result to | ||
329 | * be sign-extended to 64 bits when it's added to the | ||
330 | * %rip value and yield the same 64-bit result that the | ||
331 | * sign-extension of the original signed 32-bit | ||
332 | * displacement would have given. | ||
333 | */ | ||
334 | disp = (u8 *) p->addr + *((s32 *) insn) - | ||
335 | (u8 *) p->ainsn.insn; | ||
336 | BUG_ON((s64) (s32) disp != disp); /* Sanity check. */ | ||
337 | *(s32 *)insn = (s32) disp; | ||
338 | } | ||
339 | } | ||
340 | #endif | ||
341 | } | ||
342 | |||
343 | static void __kprobes arch_copy_kprobe(struct kprobe *p) | ||
344 | { | ||
345 | memcpy(p->ainsn.insn, p->addr, MAX_INSN_SIZE * sizeof(kprobe_opcode_t)); | ||
346 | |||
347 | fix_riprel(p); | ||
348 | |||
349 | if (can_boost(p->addr)) | ||
350 | p->ainsn.boostable = 0; | ||
351 | else | ||
352 | p->ainsn.boostable = -1; | ||
353 | |||
354 | p->opcode = *p->addr; | ||
355 | } | ||
356 | |||
357 | int __kprobes arch_prepare_kprobe(struct kprobe *p) | ||
358 | { | ||
359 | /* insn: must be on special executable page on x86. */ | ||
360 | p->ainsn.insn = get_insn_slot(); | ||
361 | if (!p->ainsn.insn) | ||
362 | return -ENOMEM; | ||
363 | arch_copy_kprobe(p); | ||
364 | return 0; | ||
365 | } | ||
366 | |||
367 | void __kprobes arch_arm_kprobe(struct kprobe *p) | ||
368 | { | ||
369 | text_poke(p->addr, ((unsigned char []){BREAKPOINT_INSTRUCTION}), 1); | ||
370 | } | ||
371 | |||
372 | void __kprobes arch_disarm_kprobe(struct kprobe *p) | ||
373 | { | ||
374 | text_poke(p->addr, &p->opcode, 1); | ||
375 | } | ||
376 | |||
377 | void __kprobes arch_remove_kprobe(struct kprobe *p) | ||
378 | { | ||
379 | mutex_lock(&kprobe_mutex); | ||
380 | free_insn_slot(p->ainsn.insn, (p->ainsn.boostable == 1)); | ||
381 | mutex_unlock(&kprobe_mutex); | ||
382 | } | ||
383 | |||
384 | static void __kprobes save_previous_kprobe(struct kprobe_ctlblk *kcb) | ||
385 | { | ||
386 | kcb->prev_kprobe.kp = kprobe_running(); | ||
387 | kcb->prev_kprobe.status = kcb->kprobe_status; | ||
388 | kcb->prev_kprobe.old_flags = kcb->kprobe_old_flags; | ||
389 | kcb->prev_kprobe.saved_flags = kcb->kprobe_saved_flags; | ||
390 | } | ||
391 | |||
392 | static void __kprobes restore_previous_kprobe(struct kprobe_ctlblk *kcb) | ||
393 | { | ||
394 | __get_cpu_var(current_kprobe) = kcb->prev_kprobe.kp; | ||
395 | kcb->kprobe_status = kcb->prev_kprobe.status; | ||
396 | kcb->kprobe_old_flags = kcb->prev_kprobe.old_flags; | ||
397 | kcb->kprobe_saved_flags = kcb->prev_kprobe.saved_flags; | ||
398 | } | ||
399 | |||
400 | static void __kprobes set_current_kprobe(struct kprobe *p, struct pt_regs *regs, | ||
401 | struct kprobe_ctlblk *kcb) | ||
402 | { | ||
403 | __get_cpu_var(current_kprobe) = p; | ||
404 | kcb->kprobe_saved_flags = kcb->kprobe_old_flags | ||
405 | = (regs->flags & (X86_EFLAGS_TF | X86_EFLAGS_IF)); | ||
406 | if (is_IF_modifier(p->ainsn.insn)) | ||
407 | kcb->kprobe_saved_flags &= ~X86_EFLAGS_IF; | ||
408 | } | ||
409 | |||
410 | static void __kprobes clear_btf(void) | ||
411 | { | ||
412 | if (test_thread_flag(TIF_DEBUGCTLMSR)) | ||
413 | wrmsrl(MSR_IA32_DEBUGCTLMSR, 0); | ||
414 | } | ||
415 | |||
416 | static void __kprobes restore_btf(void) | ||
417 | { | ||
418 | if (test_thread_flag(TIF_DEBUGCTLMSR)) | ||
419 | wrmsrl(MSR_IA32_DEBUGCTLMSR, current->thread.debugctlmsr); | ||
420 | } | ||
421 | |||
422 | static void __kprobes prepare_singlestep(struct kprobe *p, struct pt_regs *regs) | ||
423 | { | ||
424 | clear_btf(); | ||
425 | regs->flags |= X86_EFLAGS_TF; | ||
426 | regs->flags &= ~X86_EFLAGS_IF; | ||
427 | /* single step inline if the instruction is an int3 */ | ||
428 | if (p->opcode == BREAKPOINT_INSTRUCTION) | ||
429 | regs->ip = (unsigned long)p->addr; | ||
430 | else | ||
431 | regs->ip = (unsigned long)p->ainsn.insn; | ||
432 | } | ||
433 | |||
434 | /* Called with kretprobe_lock held */ | ||
435 | void __kprobes arch_prepare_kretprobe(struct kretprobe_instance *ri, | ||
436 | struct pt_regs *regs) | ||
437 | { | ||
438 | unsigned long *sara = stack_addr(regs); | ||
439 | |||
440 | ri->ret_addr = (kprobe_opcode_t *) *sara; | ||
441 | |||
442 | /* Replace the return addr with trampoline addr */ | ||
443 | *sara = (unsigned long) &kretprobe_trampoline; | ||
444 | } | ||
445 | |||
446 | static void __kprobes setup_singlestep(struct kprobe *p, struct pt_regs *regs, | ||
447 | struct kprobe_ctlblk *kcb) | ||
448 | { | ||
449 | #if !defined(CONFIG_PREEMPT) || defined(CONFIG_PM) | ||
450 | if (p->ainsn.boostable == 1 && !p->post_handler) { | ||
451 | /* Boost up -- we can execute copied instructions directly */ | ||
452 | reset_current_kprobe(); | ||
453 | regs->ip = (unsigned long)p->ainsn.insn; | ||
454 | preempt_enable_no_resched(); | ||
455 | return; | ||
456 | } | ||
457 | #endif | ||
458 | prepare_singlestep(p, regs); | ||
459 | kcb->kprobe_status = KPROBE_HIT_SS; | ||
460 | } | ||
461 | |||
462 | /* | ||
463 | * We have reentered the kprobe_handler(), since another probe was hit while | ||
464 | * within the handler. We save the original kprobes variables and just single | ||
465 | * step on the instruction of the new probe without calling any user handlers. | ||
466 | */ | ||
467 | static int __kprobes reenter_kprobe(struct kprobe *p, struct pt_regs *regs, | ||
468 | struct kprobe_ctlblk *kcb) | ||
469 | { | ||
470 | switch (kcb->kprobe_status) { | ||
471 | case KPROBE_HIT_SSDONE: | ||
472 | #ifdef CONFIG_X86_64 | ||
473 | /* TODO: Provide re-entrancy from post_kprobes_handler() and | ||
474 | * avoid exception stack corruption while single-stepping on | ||
475 | * the instruction of the new probe. | ||
476 | */ | ||
477 | arch_disarm_kprobe(p); | ||
478 | regs->ip = (unsigned long)p->addr; | ||
479 | reset_current_kprobe(); | ||
480 | preempt_enable_no_resched(); | ||
481 | break; | ||
482 | #endif | ||
483 | case KPROBE_HIT_ACTIVE: | ||
484 | save_previous_kprobe(kcb); | ||
485 | set_current_kprobe(p, regs, kcb); | ||
486 | kprobes_inc_nmissed_count(p); | ||
487 | prepare_singlestep(p, regs); | ||
488 | kcb->kprobe_status = KPROBE_REENTER; | ||
489 | break; | ||
490 | case KPROBE_HIT_SS: | ||
491 | if (p == kprobe_running()) { | ||
492 | regs->flags &= ~TF_MASK; | ||
493 | regs->flags |= kcb->kprobe_saved_flags; | ||
494 | return 0; | ||
495 | } else { | ||
496 | /* A probe has been hit in the codepath leading up | ||
497 | * to, or just after, single-stepping of a probed | ||
498 | * instruction. This entire codepath should strictly | ||
499 | * reside in .kprobes.text section. Raise a warning | ||
500 | * to highlight this peculiar case. | ||
501 | */ | ||
502 | } | ||
503 | default: | ||
504 | /* impossible cases */ | ||
505 | WARN_ON(1); | ||
506 | return 0; | ||
507 | } | ||
508 | |||
509 | return 1; | ||
510 | } | ||
511 | |||
512 | /* | ||
513 | * Interrupts are disabled on entry as trap3 is an interrupt gate and they | ||
514 | * remain disabled thorough out this function. | ||
515 | */ | ||
516 | static int __kprobes kprobe_handler(struct pt_regs *regs) | ||
517 | { | ||
518 | kprobe_opcode_t *addr; | ||
519 | struct kprobe *p; | ||
520 | struct kprobe_ctlblk *kcb; | ||
521 | |||
522 | addr = (kprobe_opcode_t *)(regs->ip - sizeof(kprobe_opcode_t)); | ||
523 | if (*addr != BREAKPOINT_INSTRUCTION) { | ||
524 | /* | ||
525 | * The breakpoint instruction was removed right | ||
526 | * after we hit it. Another cpu has removed | ||
527 | * either a probepoint or a debugger breakpoint | ||
528 | * at this address. In either case, no further | ||
529 | * handling of this interrupt is appropriate. | ||
530 | * Back up over the (now missing) int3 and run | ||
531 | * the original instruction. | ||
532 | */ | ||
533 | regs->ip = (unsigned long)addr; | ||
534 | return 1; | ||
535 | } | ||
536 | |||
537 | /* | ||
538 | * We don't want to be preempted for the entire | ||
539 | * duration of kprobe processing. We conditionally | ||
540 | * re-enable preemption at the end of this function, | ||
541 | * and also in reenter_kprobe() and setup_singlestep(). | ||
542 | */ | ||
543 | preempt_disable(); | ||
544 | |||
545 | kcb = get_kprobe_ctlblk(); | ||
546 | p = get_kprobe(addr); | ||
547 | |||
548 | if (p) { | ||
549 | if (kprobe_running()) { | ||
550 | if (reenter_kprobe(p, regs, kcb)) | ||
551 | return 1; | ||
552 | } else { | ||
553 | set_current_kprobe(p, regs, kcb); | ||
554 | kcb->kprobe_status = KPROBE_HIT_ACTIVE; | ||
555 | |||
556 | /* | ||
557 | * If we have no pre-handler or it returned 0, we | ||
558 | * continue with normal processing. If we have a | ||
559 | * pre-handler and it returned non-zero, it prepped | ||
560 | * for calling the break_handler below on re-entry | ||
561 | * for jprobe processing, so get out doing nothing | ||
562 | * more here. | ||
563 | */ | ||
564 | if (!p->pre_handler || !p->pre_handler(p, regs)) | ||
565 | setup_singlestep(p, regs, kcb); | ||
566 | return 1; | ||
567 | } | ||
568 | } else if (kprobe_running()) { | ||
569 | p = __get_cpu_var(current_kprobe); | ||
570 | if (p->break_handler && p->break_handler(p, regs)) { | ||
571 | setup_singlestep(p, regs, kcb); | ||
572 | return 1; | ||
573 | } | ||
574 | } /* else: not a kprobe fault; let the kernel handle it */ | ||
575 | |||
576 | preempt_enable_no_resched(); | ||
577 | return 0; | ||
578 | } | ||
579 | |||
580 | /* | ||
581 | * When a retprobed function returns, this code saves registers and | ||
582 | * calls trampoline_handler() runs, which calls the kretprobe's handler. | ||
583 | */ | ||
584 | void __kprobes kretprobe_trampoline_holder(void) | ||
585 | { | ||
586 | asm volatile ( | ||
587 | ".global kretprobe_trampoline\n" | ||
588 | "kretprobe_trampoline: \n" | ||
589 | #ifdef CONFIG_X86_64 | ||
590 | /* We don't bother saving the ss register */ | ||
591 | " pushq %rsp\n" | ||
592 | " pushfq\n" | ||
593 | /* | ||
594 | * Skip cs, ip, orig_ax. | ||
595 | * trampoline_handler() will plug in these values | ||
596 | */ | ||
597 | " subq $24, %rsp\n" | ||
598 | " pushq %rdi\n" | ||
599 | " pushq %rsi\n" | ||
600 | " pushq %rdx\n" | ||
601 | " pushq %rcx\n" | ||
602 | " pushq %rax\n" | ||
603 | " pushq %r8\n" | ||
604 | " pushq %r9\n" | ||
605 | " pushq %r10\n" | ||
606 | " pushq %r11\n" | ||
607 | " pushq %rbx\n" | ||
608 | " pushq %rbp\n" | ||
609 | " pushq %r12\n" | ||
610 | " pushq %r13\n" | ||
611 | " pushq %r14\n" | ||
612 | " pushq %r15\n" | ||
613 | " movq %rsp, %rdi\n" | ||
614 | " call trampoline_handler\n" | ||
615 | /* Replace saved sp with true return address. */ | ||
616 | " movq %rax, 152(%rsp)\n" | ||
617 | " popq %r15\n" | ||
618 | " popq %r14\n" | ||
619 | " popq %r13\n" | ||
620 | " popq %r12\n" | ||
621 | " popq %rbp\n" | ||
622 | " popq %rbx\n" | ||
623 | " popq %r11\n" | ||
624 | " popq %r10\n" | ||
625 | " popq %r9\n" | ||
626 | " popq %r8\n" | ||
627 | " popq %rax\n" | ||
628 | " popq %rcx\n" | ||
629 | " popq %rdx\n" | ||
630 | " popq %rsi\n" | ||
631 | " popq %rdi\n" | ||
632 | /* Skip orig_ax, ip, cs */ | ||
633 | " addq $24, %rsp\n" | ||
634 | " popfq\n" | ||
635 | #else | ||
636 | " pushf\n" | ||
637 | /* | ||
638 | * Skip cs, ip, orig_ax. | ||
639 | * trampoline_handler() will plug in these values | ||
640 | */ | ||
641 | " subl $12, %esp\n" | ||
642 | " pushl %fs\n" | ||
643 | " pushl %ds\n" | ||
644 | " pushl %es\n" | ||
645 | " pushl %eax\n" | ||
646 | " pushl %ebp\n" | ||
647 | " pushl %edi\n" | ||
648 | " pushl %esi\n" | ||
649 | " pushl %edx\n" | ||
650 | " pushl %ecx\n" | ||
651 | " pushl %ebx\n" | ||
652 | " movl %esp, %eax\n" | ||
653 | " call trampoline_handler\n" | ||
654 | /* Move flags to cs */ | ||
655 | " movl 52(%esp), %edx\n" | ||
656 | " movl %edx, 48(%esp)\n" | ||
657 | /* Replace saved flags with true return address. */ | ||
658 | " movl %eax, 52(%esp)\n" | ||
659 | " popl %ebx\n" | ||
660 | " popl %ecx\n" | ||
661 | " popl %edx\n" | ||
662 | " popl %esi\n" | ||
663 | " popl %edi\n" | ||
664 | " popl %ebp\n" | ||
665 | " popl %eax\n" | ||
666 | /* Skip ip, orig_ax, es, ds, fs */ | ||
667 | " addl $20, %esp\n" | ||
668 | " popf\n" | ||
669 | #endif | ||
670 | " ret\n"); | ||
671 | } | ||
672 | |||
673 | /* | ||
674 | * Called from kretprobe_trampoline | ||
675 | */ | ||
676 | void * __kprobes trampoline_handler(struct pt_regs *regs) | ||
677 | { | ||
678 | struct kretprobe_instance *ri = NULL; | ||
679 | struct hlist_head *head, empty_rp; | ||
680 | struct hlist_node *node, *tmp; | ||
681 | unsigned long flags, orig_ret_address = 0; | ||
682 | unsigned long trampoline_address = (unsigned long)&kretprobe_trampoline; | ||
683 | |||
684 | INIT_HLIST_HEAD(&empty_rp); | ||
685 | spin_lock_irqsave(&kretprobe_lock, flags); | ||
686 | head = kretprobe_inst_table_head(current); | ||
687 | /* fixup registers */ | ||
688 | #ifdef CONFIG_X86_64 | ||
689 | regs->cs = __KERNEL_CS; | ||
690 | #else | ||
691 | regs->cs = __KERNEL_CS | get_kernel_rpl(); | ||
692 | #endif | ||
693 | regs->ip = trampoline_address; | ||
694 | regs->orig_ax = ~0UL; | ||
695 | |||
696 | /* | ||
697 | * It is possible to have multiple instances associated with a given | ||
698 | * task either because multiple functions in the call path have | ||
699 | * return probes installed on them, and/or more then one | ||
700 | * return probe was registered for a target function. | ||
701 | * | ||
702 | * We can handle this because: | ||
703 | * - instances are always pushed into the head of the list | ||
704 | * - when multiple return probes are registered for the same | ||
705 | * function, the (chronologically) first instance's ret_addr | ||
706 | * will be the real return address, and all the rest will | ||
707 | * point to kretprobe_trampoline. | ||
708 | */ | ||
709 | hlist_for_each_entry_safe(ri, node, tmp, head, hlist) { | ||
710 | if (ri->task != current) | ||
711 | /* another task is sharing our hash bucket */ | ||
712 | continue; | ||
713 | |||
714 | if (ri->rp && ri->rp->handler) { | ||
715 | __get_cpu_var(current_kprobe) = &ri->rp->kp; | ||
716 | get_kprobe_ctlblk()->kprobe_status = KPROBE_HIT_ACTIVE; | ||
717 | ri->rp->handler(ri, regs); | ||
718 | __get_cpu_var(current_kprobe) = NULL; | ||
719 | } | ||
720 | |||
721 | orig_ret_address = (unsigned long)ri->ret_addr; | ||
722 | recycle_rp_inst(ri, &empty_rp); | ||
723 | |||
724 | if (orig_ret_address != trampoline_address) | ||
725 | /* | ||
726 | * This is the real return address. Any other | ||
727 | * instances associated with this task are for | ||
728 | * other calls deeper on the call stack | ||
729 | */ | ||
730 | break; | ||
731 | } | ||
732 | |||
733 | kretprobe_assert(ri, orig_ret_address, trampoline_address); | ||
734 | |||
735 | spin_unlock_irqrestore(&kretprobe_lock, flags); | ||
736 | |||
737 | hlist_for_each_entry_safe(ri, node, tmp, &empty_rp, hlist) { | ||
738 | hlist_del(&ri->hlist); | ||
739 | kfree(ri); | ||
740 | } | ||
741 | return (void *)orig_ret_address; | ||
742 | } | ||
743 | |||
744 | /* | ||
745 | * Called after single-stepping. p->addr is the address of the | ||
746 | * instruction whose first byte has been replaced by the "int 3" | ||
747 | * instruction. To avoid the SMP problems that can occur when we | ||
748 | * temporarily put back the original opcode to single-step, we | ||
749 | * single-stepped a copy of the instruction. The address of this | ||
750 | * copy is p->ainsn.insn. | ||
751 | * | ||
752 | * This function prepares to return from the post-single-step | ||
753 | * interrupt. We have to fix up the stack as follows: | ||
754 | * | ||
755 | * 0) Except in the case of absolute or indirect jump or call instructions, | ||
756 | * the new ip is relative to the copied instruction. We need to make | ||
757 | * it relative to the original instruction. | ||
758 | * | ||
759 | * 1) If the single-stepped instruction was pushfl, then the TF and IF | ||
760 | * flags are set in the just-pushed flags, and may need to be cleared. | ||
761 | * | ||
762 | * 2) If the single-stepped instruction was a call, the return address | ||
763 | * that is atop the stack is the address following the copied instruction. | ||
764 | * We need to make it the address following the original instruction. | ||
765 | * | ||
766 | * If this is the first time we've single-stepped the instruction at | ||
767 | * this probepoint, and the instruction is boostable, boost it: add a | ||
768 | * jump instruction after the copied instruction, that jumps to the next | ||
769 | * instruction after the probepoint. | ||
770 | */ | ||
771 | static void __kprobes resume_execution(struct kprobe *p, | ||
772 | struct pt_regs *regs, struct kprobe_ctlblk *kcb) | ||
773 | { | ||
774 | unsigned long *tos = stack_addr(regs); | ||
775 | unsigned long copy_ip = (unsigned long)p->ainsn.insn; | ||
776 | unsigned long orig_ip = (unsigned long)p->addr; | ||
777 | kprobe_opcode_t *insn = p->ainsn.insn; | ||
778 | |||
779 | /*skip the REX prefix*/ | ||
780 | if (is_REX_prefix(insn)) | ||
781 | insn++; | ||
782 | |||
783 | regs->flags &= ~X86_EFLAGS_TF; | ||
784 | switch (*insn) { | ||
785 | case 0x9c: /* pushfl */ | ||
786 | *tos &= ~(X86_EFLAGS_TF | X86_EFLAGS_IF); | ||
787 | *tos |= kcb->kprobe_old_flags; | ||
788 | break; | ||
789 | case 0xc2: /* iret/ret/lret */ | ||
790 | case 0xc3: | ||
791 | case 0xca: | ||
792 | case 0xcb: | ||
793 | case 0xcf: | ||
794 | case 0xea: /* jmp absolute -- ip is correct */ | ||
795 | /* ip is already adjusted, no more changes required */ | ||
796 | p->ainsn.boostable = 1; | ||
797 | goto no_change; | ||
798 | case 0xe8: /* call relative - Fix return addr */ | ||
799 | *tos = orig_ip + (*tos - copy_ip); | ||
800 | break; | ||
801 | #ifdef CONFIG_X86_32 | ||
802 | case 0x9a: /* call absolute -- same as call absolute, indirect */ | ||
803 | *tos = orig_ip + (*tos - copy_ip); | ||
804 | goto no_change; | ||
805 | #endif | ||
806 | case 0xff: | ||
807 | if ((insn[1] & 0x30) == 0x10) { | ||
808 | /* | ||
809 | * call absolute, indirect | ||
810 | * Fix return addr; ip is correct. | ||
811 | * But this is not boostable | ||
812 | */ | ||
813 | *tos = orig_ip + (*tos - copy_ip); | ||
814 | goto no_change; | ||
815 | } else if (((insn[1] & 0x31) == 0x20) || | ||
816 | ((insn[1] & 0x31) == 0x21)) { | ||
817 | /* | ||
818 | * jmp near and far, absolute indirect | ||
819 | * ip is correct. And this is boostable | ||
820 | */ | ||
821 | p->ainsn.boostable = 1; | ||
822 | goto no_change; | ||
823 | } | ||
824 | default: | ||
825 | break; | ||
826 | } | ||
827 | |||
828 | if (p->ainsn.boostable == 0) { | ||
829 | if ((regs->ip > copy_ip) && | ||
830 | (regs->ip - copy_ip) + 5 < MAX_INSN_SIZE) { | ||
831 | /* | ||
832 | * These instructions can be executed directly if it | ||
833 | * jumps back to correct address. | ||
834 | */ | ||
835 | set_jmp_op((void *)regs->ip, | ||
836 | (void *)orig_ip + (regs->ip - copy_ip)); | ||
837 | p->ainsn.boostable = 1; | ||
838 | } else { | ||
839 | p->ainsn.boostable = -1; | ||
840 | } | ||
841 | } | ||
842 | |||
843 | regs->ip += orig_ip - copy_ip; | ||
844 | |||
845 | no_change: | ||
846 | restore_btf(); | ||
847 | } | ||
848 | |||
849 | /* | ||
850 | * Interrupts are disabled on entry as trap1 is an interrupt gate and they | ||
851 | * remain disabled thoroughout this function. | ||
852 | */ | ||
853 | static int __kprobes post_kprobe_handler(struct pt_regs *regs) | ||
854 | { | ||
855 | struct kprobe *cur = kprobe_running(); | ||
856 | struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); | ||
857 | |||
858 | if (!cur) | ||
859 | return 0; | ||
860 | |||
861 | if ((kcb->kprobe_status != KPROBE_REENTER) && cur->post_handler) { | ||
862 | kcb->kprobe_status = KPROBE_HIT_SSDONE; | ||
863 | cur->post_handler(cur, regs, 0); | ||
864 | } | ||
865 | |||
866 | resume_execution(cur, regs, kcb); | ||
867 | regs->flags |= kcb->kprobe_saved_flags; | ||
868 | trace_hardirqs_fixup_flags(regs->flags); | ||
869 | |||
870 | /* Restore back the original saved kprobes variables and continue. */ | ||
871 | if (kcb->kprobe_status == KPROBE_REENTER) { | ||
872 | restore_previous_kprobe(kcb); | ||
873 | goto out; | ||
874 | } | ||
875 | reset_current_kprobe(); | ||
876 | out: | ||
877 | preempt_enable_no_resched(); | ||
878 | |||
879 | /* | ||
880 | * if somebody else is singlestepping across a probe point, flags | ||
881 | * will have TF set, in which case, continue the remaining processing | ||
882 | * of do_debug, as if this is not a probe hit. | ||
883 | */ | ||
884 | if (regs->flags & X86_EFLAGS_TF) | ||
885 | return 0; | ||
886 | |||
887 | return 1; | ||
888 | } | ||
889 | |||
890 | int __kprobes kprobe_fault_handler(struct pt_regs *regs, int trapnr) | ||
891 | { | ||
892 | struct kprobe *cur = kprobe_running(); | ||
893 | struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); | ||
894 | |||
895 | switch (kcb->kprobe_status) { | ||
896 | case KPROBE_HIT_SS: | ||
897 | case KPROBE_REENTER: | ||
898 | /* | ||
899 | * We are here because the instruction being single | ||
900 | * stepped caused a page fault. We reset the current | ||
901 | * kprobe and the ip points back to the probe address | ||
902 | * and allow the page fault handler to continue as a | ||
903 | * normal page fault. | ||
904 | */ | ||
905 | regs->ip = (unsigned long)cur->addr; | ||
906 | regs->flags |= kcb->kprobe_old_flags; | ||
907 | if (kcb->kprobe_status == KPROBE_REENTER) | ||
908 | restore_previous_kprobe(kcb); | ||
909 | else | ||
910 | reset_current_kprobe(); | ||
911 | preempt_enable_no_resched(); | ||
912 | break; | ||
913 | case KPROBE_HIT_ACTIVE: | ||
914 | case KPROBE_HIT_SSDONE: | ||
915 | /* | ||
916 | * We increment the nmissed count for accounting, | ||
917 | * we can also use npre/npostfault count for accounting | ||
918 | * these specific fault cases. | ||
919 | */ | ||
920 | kprobes_inc_nmissed_count(cur); | ||
921 | |||
922 | /* | ||
923 | * We come here because instructions in the pre/post | ||
924 | * handler caused the page_fault, this could happen | ||
925 | * if handler tries to access user space by | ||
926 | * copy_from_user(), get_user() etc. Let the | ||
927 | * user-specified handler try to fix it first. | ||
928 | */ | ||
929 | if (cur->fault_handler && cur->fault_handler(cur, regs, trapnr)) | ||
930 | return 1; | ||
931 | |||
932 | /* | ||
933 | * In case the user-specified fault handler returned | ||
934 | * zero, try to fix up. | ||
935 | */ | ||
936 | if (fixup_exception(regs)) | ||
937 | return 1; | ||
938 | |||
939 | /* | ||
940 | * fixup routine could not handle it, | ||
941 | * Let do_page_fault() fix it. | ||
942 | */ | ||
943 | break; | ||
944 | default: | ||
945 | break; | ||
946 | } | ||
947 | return 0; | ||
948 | } | ||
949 | |||
950 | /* | ||
951 | * Wrapper routine for handling exceptions. | ||
952 | */ | ||
953 | int __kprobes kprobe_exceptions_notify(struct notifier_block *self, | ||
954 | unsigned long val, void *data) | ||
955 | { | ||
956 | struct die_args *args = data; | ||
957 | int ret = NOTIFY_DONE; | ||
958 | |||
959 | if (args->regs && user_mode_vm(args->regs)) | ||
960 | return ret; | ||
961 | |||
962 | switch (val) { | ||
963 | case DIE_INT3: | ||
964 | if (kprobe_handler(args->regs)) | ||
965 | ret = NOTIFY_STOP; | ||
966 | break; | ||
967 | case DIE_DEBUG: | ||
968 | if (post_kprobe_handler(args->regs)) | ||
969 | ret = NOTIFY_STOP; | ||
970 | break; | ||
971 | case DIE_GPF: | ||
972 | /* | ||
973 | * To be potentially processing a kprobe fault and to | ||
974 | * trust the result from kprobe_running(), we have | ||
975 | * be non-preemptible. | ||
976 | */ | ||
977 | if (!preemptible() && kprobe_running() && | ||
978 | kprobe_fault_handler(args->regs, args->trapnr)) | ||
979 | ret = NOTIFY_STOP; | ||
980 | break; | ||
981 | default: | ||
982 | break; | ||
983 | } | ||
984 | return ret; | ||
985 | } | ||
986 | |||
987 | int __kprobes setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs) | ||
988 | { | ||
989 | struct jprobe *jp = container_of(p, struct jprobe, kp); | ||
990 | unsigned long addr; | ||
991 | struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); | ||
992 | |||
993 | kcb->jprobe_saved_regs = *regs; | ||
994 | kcb->jprobe_saved_sp = stack_addr(regs); | ||
995 | addr = (unsigned long)(kcb->jprobe_saved_sp); | ||
996 | |||
997 | /* | ||
998 | * As Linus pointed out, gcc assumes that the callee | ||
999 | * owns the argument space and could overwrite it, e.g. | ||
1000 | * tailcall optimization. So, to be absolutely safe | ||
1001 | * we also save and restore enough stack bytes to cover | ||
1002 | * the argument area. | ||
1003 | */ | ||
1004 | memcpy(kcb->jprobes_stack, (kprobe_opcode_t *)addr, | ||
1005 | MIN_STACK_SIZE(addr)); | ||
1006 | regs->flags &= ~X86_EFLAGS_IF; | ||
1007 | trace_hardirqs_off(); | ||
1008 | regs->ip = (unsigned long)(jp->entry); | ||
1009 | return 1; | ||
1010 | } | ||
1011 | |||
1012 | void __kprobes jprobe_return(void) | ||
1013 | { | ||
1014 | struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); | ||
1015 | |||
1016 | asm volatile ( | ||
1017 | #ifdef CONFIG_X86_64 | ||
1018 | " xchg %%rbx,%%rsp \n" | ||
1019 | #else | ||
1020 | " xchgl %%ebx,%%esp \n" | ||
1021 | #endif | ||
1022 | " int3 \n" | ||
1023 | " .globl jprobe_return_end\n" | ||
1024 | " jprobe_return_end: \n" | ||
1025 | " nop \n"::"b" | ||
1026 | (kcb->jprobe_saved_sp):"memory"); | ||
1027 | } | ||
1028 | |||
1029 | int __kprobes longjmp_break_handler(struct kprobe *p, struct pt_regs *regs) | ||
1030 | { | ||
1031 | struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); | ||
1032 | u8 *addr = (u8 *) (regs->ip - 1); | ||
1033 | struct jprobe *jp = container_of(p, struct jprobe, kp); | ||
1034 | |||
1035 | if ((addr > (u8 *) jprobe_return) && | ||
1036 | (addr < (u8 *) jprobe_return_end)) { | ||
1037 | if (stack_addr(regs) != kcb->jprobe_saved_sp) { | ||
1038 | struct pt_regs *saved_regs = &kcb->jprobe_saved_regs; | ||
1039 | printk(KERN_ERR | ||
1040 | "current sp %p does not match saved sp %p\n", | ||
1041 | stack_addr(regs), kcb->jprobe_saved_sp); | ||
1042 | printk(KERN_ERR "Saved registers for jprobe %p\n", jp); | ||
1043 | show_registers(saved_regs); | ||
1044 | printk(KERN_ERR "Current registers\n"); | ||
1045 | show_registers(regs); | ||
1046 | BUG(); | ||
1047 | } | ||
1048 | *regs = kcb->jprobe_saved_regs; | ||
1049 | memcpy((kprobe_opcode_t *)(kcb->jprobe_saved_sp), | ||
1050 | kcb->jprobes_stack, | ||
1051 | MIN_STACK_SIZE(kcb->jprobe_saved_sp)); | ||
1052 | preempt_enable_no_resched(); | ||
1053 | return 1; | ||
1054 | } | ||
1055 | return 0; | ||
1056 | } | ||
1057 | |||
1058 | int __init arch_init_kprobes(void) | ||
1059 | { | ||
1060 | return 0; | ||
1061 | } | ||
1062 | |||
1063 | int __kprobes arch_trampoline_kprobe(struct kprobe *p) | ||
1064 | { | ||
1065 | return 0; | ||
1066 | } | ||