From 68c9b4988116495b7fe818f328cff046d0c70b86 Mon Sep 17 00:00:00 2001 From: Alexander Aksenov Date: Tue, 12 Feb 2013 16:00:15 +0400 Subject: [PATCH] Fix sparce warnings for kprobe module --- kprobe/arch/asm-arm/dbi_kprobes.c | 57 +++++++++++++++----------------------- kprobe/arch/asm-mips/dbi_kprobes.c | 11 -------- kprobe/arch/asm-x86/dbi_kprobes.c | 12 -------- kprobe/arch/dbi_kprobes.c | 9 +----- kprobe/dbi_insn_slots.c | 3 +- kprobe/dbi_insn_slots.h | 2 ++ kprobe/dbi_kprobes.c | 21 ++++++-------- kprobe/dbi_kprobes.h | 10 +++++++ kprobe/dbi_kprobes_deps.c | 10 +++---- kprobe/dbi_kprobes_deps.h | 3 +- kprobe/dbi_uprobes.c | 12 ++------ kprobe/dbi_uprobes.h | 2 +- 12 files changed, 54 insertions(+), 98 deletions(-) diff --git a/kprobe/arch/asm-arm/dbi_kprobes.c b/kprobe/arch/asm-arm/dbi_kprobes.c index 92c524d..77434f1 100644 --- a/kprobe/arch/asm-arm/dbi_kprobes.c +++ b/kprobe/arch/asm-arm/dbi_kprobes.c @@ -34,6 +34,7 @@ #include "dbi_kprobes.h" #include "../dbi_kprobes.h" +#include "../../dbi_kprobes.h" #include "../../dbi_kdebug.h" #include "../../dbi_insn_slots.h" @@ -54,21 +55,7 @@ #define SUPRESS_BUG_MESSAGES -extern unsigned long sched_addr; -extern unsigned long fork_addr; - extern struct kprobe * per_cpu__current_kprobe; -extern spinlock_t kretprobe_lock; -extern struct kretprobe *sched_rp; - -extern struct hlist_head kprobe_insn_pages; -extern struct hlist_head uprobe_insn_pages; - -extern struct kprobe *kprobe_running(void); -extern void reset_current_kprobe(void); -extern struct kprobe_ctlblk *get_kprobe_ctlblk(void); -extern struct kprobe * current_kprobe; - extern struct hlist_head kprobe_table[KPROBE_TABLE_SIZE]; #ifdef OVERHEAD_DEBUG @@ -87,7 +74,7 @@ static kprobe_opcode_t get_addr_b(kprobe_opcode_t insn, kprobe_opcode_t *addr) return (kprobe_opcode_t)((long)addr + 8 + branch_displacement(insn)); } -unsigned int arr_traps_template[] = { +static unsigned int arr_traps_template[] = { 0xe1a0c00d, // mov ip, sp 0xe92dd800, // stmdb sp!, {fp, ip, lr, pc} 0xe24cb004, // sub fp, ip, #4 ; 0x4 @@ -99,14 +86,14 @@ unsigned int arr_traps_template[] = { }; -struct kprobe trampoline_p = +static struct kprobe trampoline_p = { .addr = (kprobe_opcode_t *) & kretprobe_trampoline, .pre_handler = trampoline_probe_handler }; // is instruction Thumb2 and NOT a branch, etc... -int isThumb2(kprobe_opcode_t insn) +static int isThumb2(kprobe_opcode_t insn) { if(( (insn & 0xf800) == 0xe800 || (insn & 0xf800) == 0xf000 || @@ -115,7 +102,7 @@ int isThumb2(kprobe_opcode_t insn) } -int prep_pc_dep_insn_execbuf (kprobe_opcode_t * insns, kprobe_opcode_t insn, int uregs) +static int prep_pc_dep_insn_execbuf (kprobe_opcode_t * insns, kprobe_opcode_t insn, int uregs) { int i; @@ -180,7 +167,7 @@ int prep_pc_dep_insn_execbuf (kprobe_opcode_t * insns, kprobe_opcode_t insn, int -int prep_pc_dep_insn_execbuf_thumb (kprobe_opcode_t * insns, kprobe_opcode_t insn, int uregs) +static int prep_pc_dep_insn_execbuf_thumb (kprobe_opcode_t * insns, kprobe_opcode_t insn, int uregs) { unsigned char mreg = 0; unsigned char reg = 0; @@ -403,7 +390,7 @@ int prep_pc_dep_insn_execbuf_thumb (kprobe_opcode_t * insns, kprobe_opcode_t ins -int arch_check_insn_arm (struct arch_specific_insn *ainsn) +static int arch_check_insn_arm (struct arch_specific_insn *ainsn) { int ret = 0; @@ -448,7 +435,7 @@ int arch_check_insn_arm (struct arch_specific_insn *ainsn) return ret; } -int arch_check_insn_thumb (struct arch_specific_insn *ainsn) +static int arch_check_insn_thumb (struct arch_specific_insn *ainsn) { int ret = 0; @@ -674,8 +661,8 @@ int arch_prepare_uprobe (struct kprobe *p, struct task_struct *task, int atomic) return -EFAULT; } if ((p->safe_arm == -1) && (p->safe_thumb == -1)) { - printk("Error in %s at %d: failed arch_copy_trampoline_*_uprobe() (both) [tgid=%u, addr=%x, data=%x]\n", - __FILE__, __LINE__, task->tgid, p->addr, p->opcode); + printk("Error in %s at %d: failed arch_copy_trampoline_*_uprobe() (both) [tgid=%u, addr=%lx, data=%lx]\n", + __FILE__, __LINE__, task->tgid, (unsigned long)p->addr, (unsigned long)p->opcode); if (!write_proc_vm_atomic (task, (unsigned long) p->addr, &p->opcode, sizeof (p->opcode))) panic ("Failed to write memory %p!\n", p->addr); free_insn_slot(&uprobe_insn_pages, task, p->ainsn.insn_arm); @@ -1060,7 +1047,7 @@ int kprobe_handler(struct pt_regs *regs) struct kprobe *p = NULL, *p_run = NULL; int ret = 0, retprobe = 0, reenter = 0; - kprobe_opcode_t *ssaddr = 0; + kprobe_opcode_t *ssaddr = NULL; struct kprobe_ctlblk *kcb; #ifdef SUPRESS_BUG_MESSAGES @@ -1538,18 +1525,18 @@ void __arch_prepare_kretprobe (struct kretprobe *rp, struct pt_regs *regs) } -int asm_init_module_dependencies() +int asm_init_module_dependencies(void) { //No module dependencies return 0; } - -void (* do_kpro)(struct undef_hook *); -void (* undo_kpro)(struct undef_hook *); +typedef void (* kpro_type)(struct undef_hook *); +static kpro_type do_kpro; +static kpro_type undo_kpro; // kernel probes hook -struct undef_hook undef_ho_k = { +static struct undef_hook undef_ho_k = { .instr_mask = 0xffffffff, .instr_val = BREAKPOINT_INSTRUCTION, .cpsr_mask = MODE_MASK, @@ -1558,7 +1545,7 @@ struct undef_hook undef_ho_k = { }; // userspace probes hook (arm) -struct undef_hook undef_ho_u = { +static struct undef_hook undef_ho_u = { .instr_mask = 0xffffffff, .instr_val = BREAKPOINT_INSTRUCTION, .cpsr_mask = MODE_MASK, @@ -1567,7 +1554,7 @@ struct undef_hook undef_ho_u = { }; // userspace probes hook (thumb) -struct undef_hook undef_ho_u_t = { +static struct undef_hook undef_ho_u_t = { .instr_mask = 0xffffffff, .instr_val = BREAKPOINT_INSTRUCTION & 0x0000ffff, .cpsr_mask = MODE_MASK, @@ -1593,15 +1580,15 @@ int __init arch_init_kprobes (void) } arr_traps_template[NOTIFIER_CALL_CHAIN_INDEX] = arch_construct_brunch ((unsigned int)kprobe_handler, do_bp_handler + NOTIFIER_CALL_CHAIN_INDEX * 4, 1); // Register hooks (kprobe_handler) - do_kpro = swap_ksyms("register_undef_hook"); - if (do_kpro == 0) { + do_kpro = (kpro_type)swap_ksyms("register_undef_hook"); + if (do_kpro == NULL) { printk("no register_undef_hook symbol found!\n"); return -1; } // Unregister hooks (kprobe_handler) - undo_kpro = swap_ksyms("unregister_undef_hook"); - if (undo_kpro == 0) { + undo_kpro = (kpro_type)swap_ksyms("unregister_undef_hook"); + if (undo_kpro == NULL) { printk("no unregister_undef_hook symbol found!\n"); return -1; } diff --git a/kprobe/arch/asm-mips/dbi_kprobes.c b/kprobe/arch/asm-mips/dbi_kprobes.c index ac97010..8ebc022 100644 --- a/kprobe/arch/asm-mips/dbi_kprobes.c +++ b/kprobe/arch/asm-mips/dbi_kprobes.c @@ -43,18 +43,7 @@ unsigned int *arr_traps_original; -extern unsigned long sched_addr; - extern struct kprobe * per_cpu__current_kprobe; -extern spinlock_t kretprobe_lock; -extern struct kretprobe *sched_rp; - -extern struct hlist_head kprobe_insn_pages; -extern struct hlist_head uprobe_insn_pages; - -extern struct kprobe *kprobe_running (void); -extern struct kprobe_ctlblk *get_kprobe_ctlblk (void); -extern void reset_current_kprobe (void); #ifdef OVERHEAD_DEBUG unsigned long swap_sum_time = 0; diff --git a/kprobe/arch/asm-x86/dbi_kprobes.c b/kprobe/arch/asm-x86/dbi_kprobes.c index 5771243..28cb30f 100644 --- a/kprobe/arch/asm-x86/dbi_kprobes.c +++ b/kprobe/arch/asm-x86/dbi_kprobes.c @@ -63,24 +63,12 @@ #define SUPRESS_BUG_MESSAGES -extern unsigned long sched_addr; extern unsigned long exit_addr; -extern unsigned long fork_addr; extern struct kprobe * per_cpu__current_kprobe; extern struct kprobe * per_cpu__current_kprobe; -extern spinlock_t kretprobe_lock; -extern struct kretprobe *sched_rp; -extern struct hlist_head kprobe_insn_pages; -extern struct hlist_head uprobe_insn_pages; - -extern spinlock_t kretprobe_lock; - -extern struct kprobe *kprobe_running (void); -extern struct kprobe_ctlblk *get_kprobe_ctlblk (void); -extern void reset_current_kprobe (void); extern struct kprobe * current_kprobe; #ifdef OVERHEAD_DEBUG diff --git a/kprobe/arch/dbi_kprobes.c b/kprobe/arch/dbi_kprobes.c index 8c3ec7f..88fb2d1 100644 --- a/kprobe/arch/dbi_kprobes.c +++ b/kprobe/arch/dbi_kprobes.c @@ -59,13 +59,6 @@ #include -extern unsigned long sched_addr; -extern unsigned long fork_addr; - -extern struct hlist_head kprobe_insn_pages; -extern struct hlist_head uprobe_insn_pages; - - void arch_remove_kprobe (struct kprobe *p, struct task_struct *task) { // TODO: check boostable for x86 and MIPS @@ -105,7 +98,7 @@ void arch_disarm_uretprobe (struct kretprobe *p, struct task_struct *tsk) { } -int arch_init_module_dependencies() +int arch_init_module_dependencies(void) { sched_addr = swap_ksyms("__switch_to"); fork_addr = swap_ksyms("do_fork"); diff --git a/kprobe/dbi_insn_slots.c b/kprobe/dbi_insn_slots.c index b98672a..c912577 100644 --- a/kprobe/dbi_insn_slots.c +++ b/kprobe/dbi_insn_slots.c @@ -61,7 +61,6 @@ extern unsigned long do_mmap_pgoff(struct file *file, unsigned long addr, unsigned long len, unsigned long prot, unsigned long flags, unsigned long pgoff); -extern struct hlist_head uprobe_insn_slot_table[KPROBE_TABLE_SIZE]; struct hlist_head kprobe_insn_pages; struct hlist_head uprobe_insn_pages; @@ -171,7 +170,7 @@ static unsigned long alloc_user_pages(struct task_struct *task, unsigned long le } // FIXME: its seems to be bad decision to replace 'current' pointer temporarily current_thread_info()->task = task; - ret = do_mmap_pgoff(0, 0, len, prot, flags, 0); + ret = do_mmap_pgoff(NULL, 0, len, prot, flags, 0); current_thread_info()->task = otask; if (!atomic) { downgrade_write (&mm->mmap_sem); diff --git a/kprobe/dbi_insn_slots.h b/kprobe/dbi_insn_slots.h index 777c294..a18c520 100644 --- a/kprobe/dbi_insn_slots.h +++ b/kprobe/dbi_insn_slots.h @@ -54,5 +54,7 @@ kprobe_opcode_t *get_insn_slot(struct task_struct *task, int atomic); void free_insn_slot(struct hlist_head *page_list, struct task_struct *task, kprobe_opcode_t *slot); +extern struct hlist_head kprobe_insn_pages; +extern struct hlist_head uprobe_insn_pages; #endif /* _SRC_INSNS_SLOTS_H */ diff --git a/kprobe/dbi_kprobes.c b/kprobe/dbi_kprobes.c index 9d52be2..e7b1714 100644 --- a/kprobe/dbi_kprobes.c +++ b/kprobe/dbi_kprobes.c @@ -69,19 +69,14 @@ #include - -extern unsigned long sched_addr; -extern unsigned long fork_addr; -extern struct hlist_head kprobe_insn_pages; - DEFINE_PER_CPU (struct kprobe *, current_kprobe) = NULL; -DEFINE_PER_CPU (struct kprobe_ctlblk, kprobe_ctlblk); +static DEFINE_PER_CPU (struct kprobe_ctlblk, kprobe_ctlblk); DEFINE_SPINLOCK (kretprobe_lock); /* Protects kretprobe_inst_table */ -DEFINE_PER_CPU (struct kprobe *, kprobe_instance) = NULL; +static DEFINE_PER_CPU (struct kprobe *, kprobe_instance) = NULL; struct hlist_head kprobe_table[KPROBE_TABLE_SIZE]; -struct hlist_head kretprobe_inst_table[KPROBE_TABLE_SIZE]; +static struct hlist_head kretprobe_inst_table[KPROBE_TABLE_SIZE]; atomic_t kprobe_count; @@ -369,7 +364,7 @@ void copy_kprobe (struct kprobe *old_p, struct kprobe *p) * Add the new probe to old_p->list. Fail if this is the * second jprobe at the address - two jprobes can't coexist */ -int add_new_kprobe (struct kprobe *old_p, struct kprobe *p) +static int add_new_kprobe (struct kprobe *old_p, struct kprobe *p) { if (p->break_handler) { @@ -601,7 +596,7 @@ int dbi_register_jprobe (struct jprobe *jp) void dbi_unregister_jprobe (struct jprobe *jp) { - dbi_unregister_kprobe (&jp->kp, 0); + dbi_unregister_kprobe (&jp->kp, NULL); } /* @@ -726,7 +721,7 @@ void dbi_unregister_kretprobe (struct kretprobe *rp) unsigned long flags; struct kretprobe_instance *ri; - dbi_unregister_kprobe (&rp->kp, 0); + dbi_unregister_kprobe (&rp->kp, NULL); if ((unsigned long)rp->kp.addr == sched_addr) { unpatch_suspended_all_task_ret_addr(rp); @@ -899,7 +894,7 @@ static void unpatch_suspended_all_task_ret_addr(struct kretprobe *rp) rcu_read_unlock(); } -int __init init_kprobes (void) +static int __init init_kprobes (void) { int i, err = 0; @@ -921,7 +916,7 @@ int __init init_kprobes (void) return err; } -void __exit exit_kprobes (void) +static void __exit exit_kprobes (void) { dbi_arch_exit_kprobes (); } diff --git a/kprobe/dbi_kprobes.h b/kprobe/dbi_kprobes.h index 84e14a5..38872f5 100644 --- a/kprobe/dbi_kprobes.h +++ b/kprobe/dbi_kprobes.h @@ -268,6 +268,16 @@ int pre_handler_kretprobe (struct kprobe *p, struct pt_regs *regs, struct vm_are void set_normalized_timeval (struct timeval *tv, time_t sec, suseconds_t usec); #endif +extern DEFINE_PER_CPU (struct kprobe *, current_kprobe); +extern spinlock_t kretprobe_lock; +extern struct hlist_head kprobe_table[KPROBE_TABLE_SIZE]; +//extern struct hlist_head kretprobe_inst_table[KPROBE_TABLE_SIZE]; +extern atomic_t kprobe_count; +extern struct kretprobe *sched_rp; + +struct kprobe *kprobe_running (void); +void reset_current_kprobe (void); +struct kprobe_ctlblk *get_kprobe_ctlblk (void); #endif /* _DBI_KPROBES_H */ diff --git a/kprobe/dbi_kprobes_deps.c b/kprobe/dbi_kprobes_deps.c index e3c5736..dc9487c 100644 --- a/kprobe/dbi_kprobes_deps.c +++ b/kprobe/dbi_kprobes_deps.c @@ -40,7 +40,7 @@ unsigned long sched_addr; unsigned long fork_addr; #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 29) -struct mm_struct* init_mm_ptr; +static struct mm_struct* init_mm_ptr; struct mm_struct init_mm; #endif @@ -312,7 +312,7 @@ static inline int use_zero_page(struct vm_area_struct *vma) #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) -unsigned long zero_pfn __read_mostly; +static unsigned long zero_pfn __read_mostly; #ifndef is_zero_pfn static inline int is_zero_pfn(unsigned long pfn) @@ -327,7 +327,7 @@ static inline int stack_guard_page(struct vm_area_struct *vma, unsigned long add stack_guard_page_end(vma, addr+PAGE_SIZE); } -int __get_user_pages_uprobe(struct task_struct *tsk, struct mm_struct *mm, +static int __get_user_pages_uprobe(struct task_struct *tsk, struct mm_struct *mm, unsigned long start, int nr_pages, unsigned int gup_flags, struct page **pages, struct vm_area_struct **vmas, int *nonblocking) @@ -523,7 +523,7 @@ next_page: } #else /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) */ -int __get_user_pages_uprobe(struct task_struct *tsk, struct mm_struct *mm, +static int __get_user_pages_uprobe(struct task_struct *tsk, struct mm_struct *mm, unsigned long start, int len, int flags, struct page **pages, struct vm_area_struct **vmas) { @@ -748,7 +748,7 @@ int get_user_pages_uprobe(struct task_struct *tsk, struct mm_struct *mm, return __get_user_pages_uprobe(tsk, mm, start, len, flags, #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) - pages, vmas, 0); + pages, vmas, NULL); #else /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) */ pages, vmas); #endif /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) */ diff --git a/kprobe/dbi_kprobes_deps.h b/kprobe/dbi_kprobes_deps.h index 6f1f12d..7b8eff3 100644 --- a/kprobe/dbi_kprobes_deps.h +++ b/kprobe/dbi_kprobes_deps.h @@ -90,6 +90,7 @@ int page_present (struct mm_struct *mm, unsigned long addr); #define get_user_pages_atomic get_user_pages_uprobe - +extern unsigned long sched_addr; +extern unsigned long fork_addr; #endif /* _DBI_KPROBES_DEPS_H */ diff --git a/kprobe/dbi_uprobes.c b/kprobe/dbi_uprobes.c index 1843ada..7d916dc 100644 --- a/kprobe/dbi_uprobes.c +++ b/kprobe/dbi_uprobes.c @@ -33,14 +33,6 @@ #include #include - -extern atomic_t kprobe_count; -extern struct hlist_head kprobe_table[KPROBE_TABLE_SIZE]; -extern struct hlist_head kretprobe_inst_table[KPROBE_TABLE_SIZE]; -extern spinlock_t kretprobe_lock; - -extern struct kretprobe *sched_rp; - struct hlist_head uprobe_insn_slot_table[KPROBE_TABLE_SIZE]; @@ -359,8 +351,8 @@ void dbi_unregister_all_uprobes(struct task_struct *task, int atomic) head = &kprobe_table[i]; hlist_for_each_entry_safe(p, node, tnode, head, hlist) { if (p->tgid == task->tgid) { - printk("dbi_unregister_all_uprobes: delete uprobe at %p[%x] for %s/%d\n", - p->addr, p->opcode, task->comm, task->pid); + printk("dbi_unregister_all_uprobes: delete uprobe at %p[%lx] for %s/%d\n", + p->addr, (unsigned long)p->opcode, task->comm, task->pid); unregister_uprobe(p, task, atomic); } } diff --git a/kprobe/dbi_uprobes.h b/kprobe/dbi_uprobes.h index 5a8d2c6..aef1819 100644 --- a/kprobe/dbi_uprobes.h +++ b/kprobe/dbi_uprobes.h @@ -44,6 +44,6 @@ void init_uprobes_insn_slots(int i) ; void dbi_uprobe_return(void); - +extern struct hlist_head uprobe_insn_slot_table[KPROBE_TABLE_SIZE]; #endif /* _DBI_UPROBES_H */ -- 2.7.4