From 03302ed7c632ef54f67e19e0164a13615a1c1890 Mon Sep 17 00:00:00 2001 From: Anil S Keshavamurthy Date: Mon, 9 Jan 2006 20:52:45 -0800 Subject: [PATCH] --- yaml --- r: 17605 b: refs/heads/master c: e597c2984c64609c6e1e1ac803f00f7550705860 h: refs/heads/master i: 17603: 8009501e1ab9a4ee9aaa45c8e004a83c92b4e0bd v: v3 --- [refs] | 2 +- trunk/arch/i386/kernel/kprobes.c | 4 ---- trunk/arch/ia64/kernel/kprobes.c | 4 ---- trunk/arch/powerpc/kernel/kprobes.c | 4 +++- trunk/arch/sparc64/kernel/kprobes.c | 4 ---- trunk/arch/x86_64/kernel/kprobes.c | 4 +++- trunk/include/asm-i386/kprobes.h | 1 + trunk/include/asm-ia64/kprobes.h | 1 + trunk/include/asm-powerpc/kprobes.h | 1 + trunk/include/asm-sparc64/kprobes.h | 1 + trunk/include/asm-x86_64/kprobes.h | 1 + trunk/include/linux/kprobes.h | 1 - trunk/kernel/kprobes.c | 4 +--- 13 files changed, 13 insertions(+), 19 deletions(-) diff --git a/[refs] b/[refs] index 2483d68990b5..db4d9c531d6d 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: f709b122343fb9a010b6cf2d5559641f1820f7c9 +refs/heads/master: e597c2984c64609c6e1e1ac803f00f7550705860 diff --git a/trunk/arch/i386/kernel/kprobes.c b/trunk/arch/i386/kernel/kprobes.c index 68fe10250486..2f372dbd34fd 100644 --- a/trunk/arch/i386/kernel/kprobes.c +++ b/trunk/arch/i386/kernel/kprobes.c @@ -77,10 +77,6 @@ void __kprobes arch_disarm_kprobe(struct kprobe *p) (unsigned long) p->addr + sizeof(kprobe_opcode_t)); } -void __kprobes arch_remove_kprobe(struct kprobe *p) -{ -} - static inline void save_previous_kprobe(struct kprobe_ctlblk *kcb) { kcb->prev_kprobe.kp = kprobe_running(); diff --git a/trunk/arch/ia64/kernel/kprobes.c b/trunk/arch/ia64/kernel/kprobes.c index 89a70400c4f6..4de7f6759093 100644 --- a/trunk/arch/ia64/kernel/kprobes.c +++ b/trunk/arch/ia64/kernel/kprobes.c @@ -467,10 +467,6 @@ void __kprobes arch_disarm_kprobe(struct kprobe *p) flush_icache_range(arm_addr, arm_addr + sizeof(bundle_t)); } -void __kprobes arch_remove_kprobe(struct kprobe *p) -{ -} - /* * We are resuming execution after a single step fault, so the pt_regs * structure reflects the register state after we executed the instruction diff --git a/trunk/arch/powerpc/kernel/kprobes.c b/trunk/arch/powerpc/kernel/kprobes.c index 2cd32dd6898b..93444e32fccd 100644 --- a/trunk/arch/powerpc/kernel/kprobes.c +++ b/trunk/arch/powerpc/kernel/kprobes.c @@ -80,9 +80,11 @@ void __kprobes arch_disarm_kprobe(struct kprobe *p) (unsigned long) p->addr + sizeof(kprobe_opcode_t)); } -void __kprobes arch_remove_kprobe(struct kprobe *p) +void __kprobes arch_remove_kprobe(struct kprobe *p, struct semaphore *s) { + down(s); free_insn_slot(p->ainsn.insn); + up(s); } static inline void prepare_singlestep(struct kprobe *p, struct pt_regs *regs) diff --git a/trunk/arch/sparc64/kernel/kprobes.c b/trunk/arch/sparc64/kernel/kprobes.c index bbd5aa6818ea..ff5e9d5cad50 100644 --- a/trunk/arch/sparc64/kernel/kprobes.c +++ b/trunk/arch/sparc64/kernel/kprobes.c @@ -61,10 +61,6 @@ void __kprobes arch_disarm_kprobe(struct kprobe *p) flushi(p->addr); } -void __kprobes arch_remove_kprobe(struct kprobe *p) -{ -} - static inline void save_previous_kprobe(struct kprobe_ctlblk *kcb) { kcb->prev_kprobe.kp = kprobe_running(); diff --git a/trunk/arch/x86_64/kernel/kprobes.c b/trunk/arch/x86_64/kernel/kprobes.c index 128e18190f99..61a6a9369cbd 100644 --- a/trunk/arch/x86_64/kernel/kprobes.c +++ b/trunk/arch/x86_64/kernel/kprobes.c @@ -220,9 +220,11 @@ void __kprobes arch_disarm_kprobe(struct kprobe *p) (unsigned long) p->addr + sizeof(kprobe_opcode_t)); } -void __kprobes arch_remove_kprobe(struct kprobe *p) +void __kprobes arch_remove_kprobe(struct kprobe *p, struct semaphore *s) { + down(s); free_insn_slot(p->ainsn.insn); + up(s); } static inline void save_previous_kprobe(struct kprobe_ctlblk *kcb) diff --git a/trunk/include/asm-i386/kprobes.h b/trunk/include/asm-i386/kprobes.h index f9e150fa1d44..dc559267ce3e 100644 --- a/trunk/include/asm-i386/kprobes.h +++ b/trunk/include/asm-i386/kprobes.h @@ -40,6 +40,7 @@ typedef u8 kprobe_opcode_t; #define JPROBE_ENTRY(pentry) (kprobe_opcode_t *)pentry #define ARCH_SUPPORTS_KRETPROBES +#define arch_remove_kprobe(p, s) do { } while(0) void kretprobe_trampoline(void); diff --git a/trunk/include/asm-ia64/kprobes.h b/trunk/include/asm-ia64/kprobes.h index 12a0b93020da..698508f4a0cf 100644 --- a/trunk/include/asm-ia64/kprobes.h +++ b/trunk/include/asm-ia64/kprobes.h @@ -89,6 +89,7 @@ struct kprobe_ctlblk { #define IP_RELATIVE_PREDICT_OPCODE (7) #define LONG_BRANCH_OPCODE (0xC) #define LONG_CALL_OPCODE (0xD) +#define arch_remove_kprobe(p, s) do { } while(0) typedef struct kprobe_opcode { bundle_t bundle; diff --git a/trunk/include/asm-powerpc/kprobes.h b/trunk/include/asm-powerpc/kprobes.h index 42ece411435a..89dee13c2a4c 100644 --- a/trunk/include/asm-powerpc/kprobes.h +++ b/trunk/include/asm-powerpc/kprobes.h @@ -50,6 +50,7 @@ typedef unsigned int kprobe_opcode_t; #define ARCH_SUPPORTS_KRETPROBES void kretprobe_trampoline(void); +extern void arch_remove_kprobe(struct kprobe *p, struct semaphore *s); /* Architecture specific copy of original instruction */ struct arch_specific_insn { diff --git a/trunk/include/asm-sparc64/kprobes.h b/trunk/include/asm-sparc64/kprobes.h index 1b47e0d2ee93..27fbdcba724b 100644 --- a/trunk/include/asm-sparc64/kprobes.h +++ b/trunk/include/asm-sparc64/kprobes.h @@ -12,6 +12,7 @@ typedef u32 kprobe_opcode_t; #define MAX_INSN_SIZE 2 #define JPROBE_ENTRY(pentry) (kprobe_opcode_t *)pentry +#define arch_remove_kprobe(p, s) do { } while(0) /* Architecture specific copy of original instruction*/ struct arch_specific_insn { diff --git a/trunk/include/asm-x86_64/kprobes.h b/trunk/include/asm-x86_64/kprobes.h index 9e2532adf42c..3a19ad179220 100644 --- a/trunk/include/asm-x86_64/kprobes.h +++ b/trunk/include/asm-x86_64/kprobes.h @@ -78,6 +78,7 @@ static inline void restore_interrupts(struct pt_regs *regs) local_irq_enable(); } +extern void arch_remove_kprobe(struct kprobe *p, struct semaphore *s); extern int post_kprobe_handler(struct pt_regs *regs); extern int kprobe_fault_handler(struct pt_regs *regs, int trapnr); extern int kprobe_handler(struct pt_regs *regs); diff --git a/trunk/include/linux/kprobes.h b/trunk/include/linux/kprobes.h index ad6e4fe970fd..59bf240cdb9d 100644 --- a/trunk/include/linux/kprobes.h +++ b/trunk/include/linux/kprobes.h @@ -152,7 +152,6 @@ extern spinlock_t kretprobe_lock; extern int arch_prepare_kprobe(struct kprobe *p); extern void arch_arm_kprobe(struct kprobe *p); extern void arch_disarm_kprobe(struct kprobe *p); -extern void arch_remove_kprobe(struct kprobe *p); extern int arch_init_kprobes(void); extern void show_registers(struct pt_regs *regs); extern kprobe_opcode_t *get_insn_slot(void); diff --git a/trunk/kernel/kprobes.c b/trunk/kernel/kprobes.c index f1c0e61a2cb4..19c42cbf91a0 100644 --- a/trunk/kernel/kprobes.c +++ b/trunk/kernel/kprobes.c @@ -532,9 +532,7 @@ void __kprobes unregister_kprobe(struct kprobe *p) list_del_rcu(&p->list); kfree(old_p); } - down(&kprobe_mutex); - arch_remove_kprobe(p); - up(&kprobe_mutex); + arch_remove_kprobe(p, &kprobe_mutex); } }