Messages in this thread | | | Date | Fri, 7 Jul 2006 13:23:33 -0400 | From | Mike Grundy <> | Subject | Re: [PATCH] kprobes for s390 architecture |
| |
On Wed, Jun 28, 2006 at 07:58:57AM +0200, Heiko Carstens wrote: > On Tue, Jun 27, 2006 at 05:23:09PM +0200, Martin Schwidefsky wrote: > > On Sat, 2006-06-24 at 13:36 +0200, Heiko Carstens wrote: > > > Just do a compare and swap operation on the instruction you want to replace, > > > then do an smp_call_function() with the wait parameter set to 1 and passing > > > a pointer to a function that does nothing but return. > > Not good enough. An instruction can be fetched multiple times for a > > single execution (see the other mail). So you have a half executed > > instruction, the cache line is invalidated, a new instruction is written > > and the cache line is recreated to finished the half executed > > instruction. That can easiliy happen on millicoded instructions. > > Yes, looks like I was too optimistic. Seems like we really have to go for > stop_machine_run() unless somebody comes up with a better idea...
ok, I tried, but my "better ideas" made things worse. stop_machine_run() wins:
void __kprobes arch_arm_kprobe(struct kprobe *p) { struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); unsigned long status = kcb->kprobe_status; struct ins_replace_args args;
args.ptr = p->addr; args.old = p->opcode; args.new = BREAKPOINT_INSTRUCTION;
kcb->kprobe_status = KPROBE_SWAP_INST; stop_machine_run(swap_instruction, &args, NR_CPUS); kcb->kprobe_status = status; }
It works, and I guess at this point is the only way to do it. I'll send out a full patch with this and the other cleanups later.
Mike - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |