@@ -17,7 +17,7 @@ DEFINE_PER_CPU(struct kprobe *, current_kprobe) = NULL;
17
17
DEFINE_PER_CPU (struct kprobe_ctlblk , kprobe_ctlblk );
18
18
19
19
static void __kprobes
20
- post_kprobe_handler (struct kprobe_ctlblk * , struct pt_regs * );
20
+ post_kprobe_handler (struct kprobe * , struct kprobe_ctlblk * , struct pt_regs * );
21
21
22
22
static void __kprobes arch_prepare_ss_slot (struct kprobe * p )
23
23
{
@@ -43,7 +43,7 @@ static void __kprobes arch_simulate_insn(struct kprobe *p, struct pt_regs *regs)
43
43
p -> ainsn .api .handler ((u32 )p -> opcode ,
44
44
(unsigned long )p -> addr , regs );
45
45
46
- post_kprobe_handler (kcb , regs );
46
+ post_kprobe_handler (p , kcb , regs );
47
47
}
48
48
49
49
int __kprobes arch_prepare_kprobe (struct kprobe * p )
@@ -149,21 +149,6 @@ static void __kprobes kprobes_restore_local_irqflag(struct kprobe_ctlblk *kcb,
149
149
regs -> status = kcb -> saved_status ;
150
150
}
151
151
152
- static void __kprobes
153
- set_ss_context (struct kprobe_ctlblk * kcb , unsigned long addr , struct kprobe * p )
154
- {
155
- unsigned long offset = GET_INSN_LENGTH (p -> opcode );
156
-
157
- kcb -> ss_ctx .ss_pending = true;
158
- kcb -> ss_ctx .match_addr = addr + offset ;
159
- }
160
-
161
- static void __kprobes clear_ss_context (struct kprobe_ctlblk * kcb )
162
- {
163
- kcb -> ss_ctx .ss_pending = false;
164
- kcb -> ss_ctx .match_addr = 0 ;
165
- }
166
-
167
152
static void __kprobes setup_singlestep (struct kprobe * p ,
168
153
struct pt_regs * regs ,
169
154
struct kprobe_ctlblk * kcb , int reenter )
@@ -182,8 +167,6 @@ static void __kprobes setup_singlestep(struct kprobe *p,
182
167
/* prepare for single stepping */
183
168
slot = (unsigned long )p -> ainsn .api .insn ;
184
169
185
- set_ss_context (kcb , slot , p ); /* mark pending ss */
186
-
187
170
/* IRQs and single stepping do not mix well. */
188
171
kprobes_save_local_irqflag (kcb , regs );
189
172
@@ -219,13 +202,8 @@ static int __kprobes reenter_kprobe(struct kprobe *p,
219
202
}
220
203
221
204
static void __kprobes
222
- post_kprobe_handler (struct kprobe_ctlblk * kcb , struct pt_regs * regs )
205
+ post_kprobe_handler (struct kprobe * cur , struct kprobe_ctlblk * kcb , struct pt_regs * regs )
223
206
{
224
- struct kprobe * cur = kprobe_running ();
225
-
226
- if (!cur )
227
- return ;
228
-
229
207
/* return addr restore if non-branching insn */
230
208
if (cur -> ainsn .api .restore != 0 )
231
209
regs -> epc = cur -> ainsn .api .restore ;
@@ -357,16 +335,16 @@ bool __kprobes
357
335
kprobe_single_step_handler (struct pt_regs * regs )
358
336
{
359
337
struct kprobe_ctlblk * kcb = get_kprobe_ctlblk ();
338
+ unsigned long addr = instruction_pointer (regs );
339
+ struct kprobe * cur = kprobe_running ();
360
340
361
- if ((kcb -> ss_ctx .ss_pending )
362
- && (kcb -> ss_ctx .match_addr == instruction_pointer (regs ))) {
363
- clear_ss_context (kcb ); /* clear pending ss */
364
-
341
+ if (cur && (kcb -> kprobe_status & (KPROBE_HIT_SS | KPROBE_REENTER )) &&
342
+ ((unsigned long )& cur -> ainsn .api .insn [0 ] + GET_INSN_LENGTH (cur -> opcode ) == addr )) {
365
343
kprobes_restore_local_irqflag (kcb , regs );
366
-
367
- post_kprobe_handler (kcb , regs );
344
+ post_kprobe_handler (cur , kcb , regs );
368
345
return true;
369
346
}
347
+ /* not ours, kprobes should ignore it */
370
348
return false;
371
349
}
372
350
0 commit comments