all-local:
cp $(top_srcdir)/src/modules/kprobe/Module.symvers $(driver_module_dir)
- CROSS_COMPILE=$(cross_compiler) $(MAKE) ARCH=arm memchecker=$(memchecker) $(AM_MAKEFLAGS) -C $(target_kernel_src) M=$(driver_module_dir) modules
+ $(MAKE) CROSS_COMPILE=$(cross_compiler) ARCH=arm memchecker=$(memchecker) $(AM_MAKEFLAGS) -C $(target_kernel_src) M=$(driver_module_dir) modules
clean-local:
- CROSS_COMPILE=$(cross_compiler) $(MAKE) ARCH=arm $(AM_MAKEFLAGS) -C $(target_kernel_src) M=$(driver_module_dir) clean
+ $(MAKE) CROSS_COMPILE=$(cross_compiler) ARCH=arm $(AM_MAKEFLAGS) -C $(target_kernel_src) M=$(driver_module_dir) clean
install-exec-local:
install -m 644 $(driver_module_dir)/$(module_name).ko $(prefix)
cross_compiler = $(subst gcc,,$(CC))
all-local:
- CROSS_COMPILE=$(cross_compiler) $(MAKE) ARCH=arm $(AM_MAKEFLAGS) -C $(target_kernel_src) M=$(kprobes_module_dir) modules
+ $(MAKE) CROSS_COMPILE=$(cross_compiler) ARCH=arm $(AM_MAKEFLAGS) -C $(target_kernel_src) M=$(kprobes_module_dir) modules
clean-local:
- CROSS_COMPILE=$(cross_compiler) $(MAKE) ARCH=arm $(AM_MAKEFLAGS) -C $(target_kernel_src) M=$(kprobes_module_dir) clean
+ $(MAKE) CROSS_COMPILE=$(cross_compiler) ARCH=arm $(AM_MAKEFLAGS) -C $(target_kernel_src) M=$(kprobes_module_dir) clean
install-exec-local:
install -m 644 $(kprobes_module_dir)/$(module_name).ko $(prefix)
#define GUP_FLAGS_IGNORE_VMA_PERMISSIONS 0x4
#define GUP_FLAGS_IGNORE_SIGKILL 0x8
-
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18)
static inline int use_zero_page(struct vm_area_struct *vma)
{
/*
*/
return !vma->vm_ops || !vma->vm_ops->fault;
}
+#endif
int __get_user_pages_uprobe(struct task_struct *tsk, struct mm_struct *mm,
unsigned long start, int len, int flags,
return i ? : -EFAULT;
if (is_vm_hugetlb_page(vma)) {
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,18)
+ i = follow_hugetlb_page(mm, vma, pages, vmas,
+ &start, &len, i);
+#else
i = follow_hugetlb_page(mm, vma, pages, vmas,
&start, &len, i, write);
+#endif
continue;
}
if (pages)
foll_flags |= FOLL_GET;
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18)
#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,30)
if (!write && use_zero_page(vma))
foll_flags |= FOLL_ANON;
#endif
+#endif
do {
struct page *page;
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18)
/*
* If we have a pending SIGKILL, don't keep faulting
* pages and potentially allocating memory, unless
if (unlikely(!ignore_sigkill &&
fatal_signal_pending(current)))
return i ? i : -ERESTARTSYS;
+#endif
if (write)
foll_flags |= FOLL_WRITE;
int ret;
ret = handle_mm_fault(mm, vma, start,
foll_flags & FOLL_WRITE);
+
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,18)
+ if (ret & VM_FAULT_WRITE)
+ foll_flags &= ~FOLL_WRITE;
+
+ switch (ret & ~VM_FAULT_WRITE) {
+ case VM_FAULT_MINOR:
+ tsk->min_flt++;
+ break;
+ case VM_FAULT_MAJOR:
+ tsk->maj_flt++;
+ break;
+ case VM_FAULT_SIGBUS:
+ return i ? i : -EFAULT;
+ case VM_FAULT_OOM:
+ return i ? i : -ENOMEM;
+ default:
+ BUG();
+ }
+
+#else
if (ret & VM_FAULT_ERROR) {
- if (ret & VM_FAULT_OOM)
- return i ? i : -ENOMEM;
- else if (ret & VM_FAULT_SIGBUS)
- return i ? i : -EFAULT;
- BUG();
+ if (ret & VM_FAULT_OOM)
+ return i ? i : -ENOMEM;
+ else if (ret & VM_FAULT_SIGBUS)
+ return i ? i : -EFAULT;
+ BUG();
}
if (ret & VM_FAULT_MAJOR)
- tsk->maj_flt++;
+ tsk->maj_flt++;
else
- tsk->min_flt++;
-
+ tsk->min_flt++;
+
/*
* The VM_FAULT_WRITE bit tells us that
* do_wp_page has broken COW when necessary,
*/
if ((ret & VM_FAULT_WRITE) &&
!(vma->vm_flags & VM_WRITE))
- foll_flags &= ~FOLL_WRITE;
-
+ foll_flags &= ~FOLL_WRITE;
+
//cond_resched();
+#endif
+
}
+
if (IS_ERR(page))
return i ? i : PTR_ERR(page);
if (pages) {
pages[i] = page;
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,18)
+ flush_anon_page(page, start);
+#else
flush_anon_page(vma, page, start);
+#endif
flush_dcache_page(page);
}
if (vmas)
DECLARE_MOD_FUNC_DEP(find_extend_vma, struct vm_area_struct *, struct mm_struct * mm, unsigned long addr);
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 18)
#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 30)
DECLARE_MOD_FUNC_DEP(handle_mm_fault, int, struct mm_struct *mm, struct vm_area_struct *vma, unsigned long address, int write_access);
#else
DECLARE_MOD_FUNC_DEP(handle_mm_fault, int, struct mm_struct *mm, struct vm_area_struct *vma, unsigned long address, unsigned int flags);
#endif
+#endif
DECLARE_MOD_FUNC_DEP(get_gate_vma, struct vm_area_struct *, struct task_struct *tsk);
DECLARE_MOD_FUNC_DEP(in_gate_area_no_task, int, unsigned long addr);
DECLARE_MOD_DEP_WRAPPER (find_extend_vma, struct vm_area_struct *, struct mm_struct * mm, unsigned long addr)
IMP_MOD_DEP_WRAPPER (find_extend_vma, mm, addr)
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 18)
#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 30)
DECLARE_MOD_DEP_WRAPPER (handle_mm_fault, int, struct mm_struct *mm, struct vm_area_struct *vma, unsigned long address, int write_access)
IMP_MOD_DEP_WRAPPER (handle_mm_fault, mm, vma, address, write_access)
DECLARE_MOD_DEP_WRAPPER (handle_mm_fault, int, struct mm_struct *mm, struct vm_area_struct *vma, unsigned long address, unsigned int flags)
IMP_MOD_DEP_WRAPPER (handle_mm_fault, mm, vma, address, flags)
#endif
+#endif
DECLARE_MOD_DEP_WRAPPER (get_gate_vma, struct vm_area_struct *, struct task_struct *tsk)
IMP_MOD_DEP_WRAPPER (get_gate_vma, tsk)
sched_addr = (kprobe_opcode_t *)kallsyms_search("__switch_to");//"schedule");
fork_addr = (kprobe_opcode_t *)kallsyms_search("do_fork");
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 18))
INIT_MOD_DEP_VAR(handle_mm_fault, handle_mm_fault);
+#endif
INIT_MOD_DEP_VAR(flush_ptrace_access, flush_ptrace_access);
INIT_MOD_DEP_VAR(find_extend_vma, find_extend_vma);
INIT_MOD_DEP_VAR(get_gate_vma, get_gate_vma);