lkml.org 
[lkml]   [2005]   [Jul]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [4/6 PATCH] Kprobes : Prevent possible race conditions ppc64 changes
    On Thu, Jul 07, 2005 at 03:46:50PM +0530, Prasanna S Panchamukhi wrote:
    >
    > This patch contains the ppc64 architecture specific changes to
    > prevent the possible race conditions.

    Prasanna,

    Please cc or post this patch to linuxppc64-dev@ozlabs.org. This patch
    touches files I am not sure I can comment on with authority.

    Thanks,
    Ananth

    >
    > Signed-off-by: Prasanna S Panchamukhi <prasanna@in.ibm.com>
    >
    >
    > ---
    >
    > linux-2.6.13-rc1-mm1-prasanna/arch/ppc64/kernel/kprobes.c | 29 +++++-----
    > linux-2.6.13-rc1-mm1-prasanna/arch/ppc64/kernel/misc.S | 4 -
    > linux-2.6.13-rc1-mm1-prasanna/arch/ppc64/kernel/traps.c | 5 +
    > linux-2.6.13-rc1-mm1-prasanna/arch/ppc64/kernel/vmlinux.lds.S | 1
    > linux-2.6.13-rc1-mm1-prasanna/arch/ppc64/mm/fault.c | 5 +
    > linux-2.6.13-rc1-mm1-prasanna/include/asm-ppc64/processor.h | 14 ++++
    > 6 files changed, 38 insertions(+), 20 deletions(-)
    >
    > diff -puN arch/ppc64/kernel/kprobes.c~kprobes-exclude-functions-ppc64 arch/ppc64/kernel/kprobes.c
    > --- linux-2.6.13-rc1-mm1/arch/ppc64/kernel/kprobes.c~kprobes-exclude-functions-ppc64 2005-07-06 20:07:22.000000000 +0530
    > +++ linux-2.6.13-rc1-mm1-prasanna/arch/ppc64/kernel/kprobes.c 2005-07-06 20:07:22.000000000 +0530
    > @@ -44,7 +44,7 @@ static struct kprobe *kprobe_prev;
    > static unsigned long kprobe_status_prev, kprobe_saved_msr_prev;
    > static struct pt_regs jprobe_saved_regs;
    >
    > -int arch_prepare_kprobe(struct kprobe *p)
    > +int __kprobes arch_prepare_kprobe(struct kprobe *p)
    > {
    > int ret = 0;
    > kprobe_opcode_t insn = *p->addr;
    > @@ -68,27 +68,27 @@ int arch_prepare_kprobe(struct kprobe *p
    > return ret;
    > }
    >
    > -void arch_copy_kprobe(struct kprobe *p)
    > +void __kprobes arch_copy_kprobe(struct kprobe *p)
    > {
    > memcpy(p->ainsn.insn, p->addr, MAX_INSN_SIZE * sizeof(kprobe_opcode_t));
    > p->opcode = *p->addr;
    > }
    >
    > -void arch_arm_kprobe(struct kprobe *p)
    > +void __kprobes arch_arm_kprobe(struct kprobe *p)
    > {
    > *p->addr = BREAKPOINT_INSTRUCTION;
    > flush_icache_range((unsigned long) p->addr,
    > (unsigned long) p->addr + sizeof(kprobe_opcode_t));
    > }
    >
    > -void arch_disarm_kprobe(struct kprobe *p)
    > +void __kprobes arch_disarm_kprobe(struct kprobe *p)
    > {
    > *p->addr = p->opcode;
    > flush_icache_range((unsigned long) p->addr,
    > (unsigned long) p->addr + sizeof(kprobe_opcode_t));
    > }
    >
    > -void arch_remove_kprobe(struct kprobe *p)
    > +void __kprobes arch_remove_kprobe(struct kprobe *p)
    > {
    > up(&kprobe_mutex);
    > free_insn_slot(p->ainsn.insn);
    > @@ -122,7 +122,8 @@ static inline void restore_previous_kpro
    > kprobe_saved_msr = kprobe_saved_msr_prev;
    > }
    >
    > -void arch_prepare_kretprobe(struct kretprobe *rp, struct pt_regs *regs)
    > +void __kprobes arch_prepare_kretprobe(struct kretprobe *rp,
    > + struct pt_regs *regs)
    > {
    > struct kretprobe_instance *ri;
    >
    > @@ -244,7 +245,7 @@ void kretprobe_trampoline_holder(void)
    > /*
    > * Called when the probe at kretprobe trampoline is hit
    > */
    > -int trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs)
    > +int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs)
    > {
    > struct kretprobe_instance *ri = NULL;
    > struct hlist_head *head;
    > @@ -308,7 +309,7 @@ int trampoline_probe_handler(struct kpro
    > * single-stepped a copy of the instruction. The address of this
    > * copy is p->ainsn.insn.
    > */
    > -static void resume_execution(struct kprobe *p, struct pt_regs *regs)
    > +static void __kprobes resume_execution(struct kprobe *p, struct pt_regs *regs)
    > {
    > int ret;
    > unsigned int insn = *p->ainsn.insn;
    > @@ -373,8 +374,8 @@ static inline int kprobe_fault_handler(s
    > /*
    > * Wrapper routine to for handling exceptions.
    > */
    > -int kprobe_exceptions_notify(struct notifier_block *self, unsigned long val,
    > - void *data)
    > +int __kprobes kprobe_exceptions_notify(struct notifier_block *self,
    > + unsigned long val, void *data)
    > {
    > struct die_args *args = (struct die_args *)data;
    > int ret = NOTIFY_DONE;
    > @@ -406,7 +407,7 @@ int kprobe_exceptions_notify(struct noti
    > return ret;
    > }
    >
    > -int setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs)
    > +int __kprobes setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs)
    > {
    > struct jprobe *jp = container_of(p, struct jprobe, kp);
    >
    > @@ -419,16 +420,16 @@ int setjmp_pre_handler(struct kprobe *p,
    > return 1;
    > }
    >
    > -void jprobe_return(void)
    > +void __kprobes jprobe_return(void)
    > {
    > asm volatile("trap" ::: "memory");
    > }
    >
    > -void jprobe_return_end(void)
    > +void __kprobes jprobe_return_end(void)
    > {
    > };
    >
    > -int longjmp_break_handler(struct kprobe *p, struct pt_regs *regs)
    > +int __kprobes longjmp_break_handler(struct kprobe *p, struct pt_regs *regs)
    > {
    > /*
    > * FIXME - we should ideally be validating that we got here 'cos
    > diff -puN arch/ppc64/kernel/traps.c~kprobes-exclude-functions-ppc64 arch/ppc64/kernel/traps.c
    > --- linux-2.6.13-rc1-mm1/arch/ppc64/kernel/traps.c~kprobes-exclude-functions-ppc64 2005-07-06 20:07:22.000000000 +0530
    > +++ linux-2.6.13-rc1-mm1-prasanna/arch/ppc64/kernel/traps.c 2005-07-06 20:07:22.000000000 +0530
    > @@ -30,6 +30,7 @@
    > #include <linux/init.h>
    > #include <linux/module.h>
    > #include <linux/delay.h>
    > +#include <linux/kprobes.h>
    > #include <asm/kdebug.h>
    >
    > #include <asm/pgtable.h>
    > @@ -220,7 +221,7 @@ void instruction_breakpoint_exception(st
    > _exception(SIGTRAP, regs, TRAP_BRKPT, regs->nip);
    > }
    >
    > -void single_step_exception(struct pt_regs *regs)
    > +void __kprobes single_step_exception(struct pt_regs *regs)
    > {
    > regs->msr &= ~MSR_SE; /* Turn off 'trace' bit */
    >
    > @@ -398,7 +399,7 @@ check_bug_trap(struct pt_regs *regs)
    > return 0;
    > }
    >
    > -void program_check_exception(struct pt_regs *regs)
    > +void __kprobes program_check_exception(struct pt_regs *regs)
    > {
    > if (debugger_fault_handler(regs))
    > return;
    > diff -puN arch/ppc64/kernel/vmlinux.lds.S~kprobes-exclude-functions-ppc64 arch/ppc64/kernel/vmlinux.lds.S
    > --- linux-2.6.13-rc1-mm1/arch/ppc64/kernel/vmlinux.lds.S~kprobes-exclude-functions-ppc64 2005-07-06 20:07:22.000000000 +0530
    > +++ linux-2.6.13-rc1-mm1-prasanna/arch/ppc64/kernel/vmlinux.lds.S 2005-07-06 20:07:22.000000000 +0530
    > @@ -15,6 +15,7 @@ SECTIONS
    > *(.text .text.*)
    > SCHED_TEXT
    > LOCK_TEXT
    > + KPROBES_TEXT
    > *(.fixup)
    > . = ALIGN(4096);
    > _etext = .;
    > diff -puN arch/ppc64/mm/fault.c~kprobes-exclude-functions-ppc64 arch/ppc64/mm/fault.c
    > --- linux-2.6.13-rc1-mm1/arch/ppc64/mm/fault.c~kprobes-exclude-functions-ppc64 2005-07-06 20:07:22.000000000 +0530
    > +++ linux-2.6.13-rc1-mm1-prasanna/arch/ppc64/mm/fault.c 2005-07-06 20:07:22.000000000 +0530
    > @@ -29,6 +29,7 @@
    > #include <linux/interrupt.h>
    > #include <linux/smp_lock.h>
    > #include <linux/module.h>
    > +#include <linux/kprobes.h>
    >
    > #include <asm/page.h>
    > #include <asm/pgtable.h>
    > @@ -84,8 +85,8 @@ static int store_updates_sp(struct pt_re
    > * The return value is 0 if the fault was handled, or the signal
    > * number if this is a kernel fault that can't be handled here.
    > */
    > -int do_page_fault(struct pt_regs *regs, unsigned long address,
    > - unsigned long error_code)
    > +int __kprobes do_page_fault(struct pt_regs *regs, unsigned long address,
    > + unsigned long error_code)
    > {
    > struct vm_area_struct * vma;
    > struct mm_struct *mm = current->mm;
    > diff -puN arch/ppc64/kernel/misc.S~kprobes-exclude-functions-ppc64 arch/ppc64/kernel/misc.S
    > --- linux-2.6.13-rc1-mm1/arch/ppc64/kernel/misc.S~kprobes-exclude-functions-ppc64 2005-07-06 20:07:22.000000000 +0530
    > +++ linux-2.6.13-rc1-mm1-prasanna/arch/ppc64/kernel/misc.S 2005-07-07 10:24:00.000000000 +0530
    > @@ -183,7 +183,7 @@ PPC64_CACHES:
    > * flush all bytes from start through stop-1 inclusive
    > */
    >
    > -_GLOBAL(__flush_icache_range)
    > +_KPROBE(__flush_icache_range)
    >
    > /*
    > * Flush the data cache to memory
    > @@ -223,7 +223,7 @@ _GLOBAL(__flush_icache_range)
    > bdnz 2b
    > isync
    > blr
    > -
    > + .previous .text
    > /*
    > * Like above, but only do the D-cache.
    > *
    > diff -puN include/asm-ppc64/processor.h~kprobes-exclude-functions-ppc64 include/asm-ppc64/processor.h
    > --- linux-2.6.13-rc1-mm1/include/asm-ppc64/processor.h~kprobes-exclude-functions-ppc64 2005-07-06 20:07:22.000000000 +0530
    > +++ linux-2.6.13-rc1-mm1-prasanna/include/asm-ppc64/processor.h 2005-07-07 10:22:29.000000000 +0530
    > @@ -309,6 +309,20 @@ name: \
    > .type GLUE(.,name),@function; \
    > GLUE(.,name):
    >
    > +#define _KPROBE(name) \
    > + .section ".kprobes.text","a"; \
    > + .align 2 ; \
    > + .globl name; \
    > + .globl GLUE(.,name); \
    > + .section ".opd","aw"; \
    > +name: \
    > + .quad GLUE(.,name); \
    > + .quad .TOC.@tocbase; \
    > + .quad 0; \
    > + .previous; \
    > + .type GLUE(.,name),@function; \
    > +GLUE(.,name):
    > +
    > #define _STATIC(name) \
    > .section ".text"; \
    > .align 2 ; \
    >
    > _
    > --
    >
    > Prasanna S Panchamukhi
    > Linux Technology Center
    > India Software Labs, IBM Bangalore
    > Ph: 91-80-25044636
    > <prasanna@in.ibm.com>
    -
    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/

    \
     
     \ /
      Last update: 2005-07-08 16:17    [W:0.052 / U:31.548 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site