[FIX] modules loading for kernel 4.4 71/75271/4
authorAnatolii Nikulin <nikulin.a@samsung.com>
Fri, 17 Jun 2016 07:57:30 +0000 (10:57 +0300)
committerDmitry Kovalenko <d.kovalenko@samsung.com>
Thu, 23 Jun 2016 11:36:55 +0000 (04:36 -0700)
Change-Id: I97bd9063f19ccead6579440f8f263190c34fa578
Signed-off-by: Anatolii Nikulin <nikulin.a@samsung.com>
kprobe/swap_kprobes_deps.c
kprobe/swap_kprobes_deps.h
loader/loader_module.c
loader/loader_pd.c
task_ctx/task_ctx.c
us_manager/helper.c
us_manager/us_manager_common.h
us_manager/us_slot_manager.c

index 22561e9..86ce257 100644 (file)
@@ -76,7 +76,20 @@ static inline void swap_kunmap_atomic(void *kvaddr)
 }
 #endif /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 36) */
 
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 3, 0)
+DECLARE_MOD_FUNC_DEP(do_mmap, unsigned long, struct file *file,
+                    unsigned long addr, unsigned long len, unsigned long prot,
+                    unsigned long flags, vm_flags_t vm_flags,
+                    unsigned long pgoff, unsigned long *populate);
+DECLARE_MOD_DEP_WRAPPER(swap_do_mmap,
+                       unsigned long,
+                       struct file *file, unsigned long addr,
+                       unsigned long len, unsigned long prot,
+                       unsigned long flags, vm_flags_t vm_flags,
+                       unsigned long pgoff, unsigned long *populate)
+IMP_MOD_DEP_WRAPPER(do_mmap, file, addr, len,
+                   prot, flags, vm_flags, pgoff, populate)
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)
 DECLARE_MOD_FUNC_DEP(do_mmap_pgoff, unsigned long, struct file *file,
                     unsigned long addr, unsigned long len, unsigned long prot,
                     unsigned long flags, unsigned long pgoff,
@@ -101,7 +114,9 @@ DECLARE_MOD_DEP_WRAPPER(swap_do_mmap_pgoff,
 IMP_MOD_DEP_WRAPPER(do_mmap_pgoff, file, addr, len, prot, flags, pgoff)
 #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0) */
 
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 3, 0)
+EXPORT_SYMBOL_GPL(swap_do_mmap);
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)
 EXPORT_SYMBOL_GPL(swap_do_mmap_pgoff);
 #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0) */
 
@@ -136,6 +151,7 @@ static DECLARE_MOD_FUNC_DEP(handle_mm_fault, int, struct mm_struct *mm,
                            unsigned int flags);
 #endif /* LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 30) */
 
+#ifdef __HAVE_ARCH_GATE_AREA
 #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38)
 static DECLARE_MOD_FUNC_DEP(get_gate_vma, struct vm_area_struct *,
                            struct mm_struct *mm);
@@ -144,7 +160,6 @@ static DECLARE_MOD_FUNC_DEP(get_gate_vma, struct vm_area_struct *,
                            struct task_struct *tsk);
 #endif /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) */
 
-#ifdef __HAVE_ARCH_GATE_AREA
 #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38)
 DECLARE_MOD_FUNC_DEP(in_gate_area, int, struct mm_struct *mm,
                     unsigned long addr);
@@ -152,13 +167,13 @@ DECLARE_MOD_FUNC_DEP(in_gate_area, int, struct mm_struct *mm,
 DECLARE_MOD_FUNC_DEP(in_gate_area, int, struct task_struct *task,
                     unsigned long addr);
 #endif /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) */
-#endif /* __HAVE_ARCH_GATE_AREA */
 
 #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38)
 static DECLARE_MOD_FUNC_DEP(in_gate_area_no_mm, int, unsigned long addr);
 #else /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) */
 static DECLARE_MOD_FUNC_DEP(in_gate_area_no_task, int, unsigned long addr);
 #endif /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) */
+#endif /* __HAVE_ARCH_GATE_AREA */
 
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)
 static DECLARE_MOD_FUNC_DEP(follow_page_mask, \
@@ -228,17 +243,22 @@ DECLARE_MOD_DEP_WRAPPER(swap_handle_mm_fault,
 }
 #endif /* LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 30) */
 
+struct vm_area_struct *swap_get_gate_vma(struct mm_struct *mm)
+{
+#ifdef __HAVE_ARCH_GATE_AREA
 #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38)
-DECLARE_MOD_DEP_WRAPPER(swap_get_gate_vma,
-                       struct vm_area_struct *,
-                       struct mm_struct *mm)
 IMP_MOD_DEP_WRAPPER(get_gate_vma, mm)
 #else /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) */
-DECLARE_MOD_DEP_WRAPPER(swap_get_gate_vma,
-                       struct vm_area_struct *,
-                       struct task_struct *tsk)
 IMP_MOD_DEP_WRAPPER(get_gate_vma, tsk)
 #endif /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) */
+#else /* __HAVE_ARCH_GATE_AREA */
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38)
+       return get_gate_vma(mm);
+#else /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) */
+       return get_gate_vma(tsk);
+#endif /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) */
+#endif /* __HAVE_ARCH_GATE_AREA */
+}
 
 #ifdef CONFIG_HUGETLB_PAGE
 
@@ -309,6 +329,7 @@ static inline int swap_in_gate_area(struct task_struct *task,
 }
 
 
+#ifdef __HAVE_ARCH_GATE_AREA
 #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38)
 DECLARE_MOD_DEP_WRAPPER(swap_in_gate_area_no_mm, int, unsigned long addr)
 IMP_MOD_DEP_WRAPPER(in_gate_area_no_mm, addr)
@@ -316,14 +337,23 @@ IMP_MOD_DEP_WRAPPER(in_gate_area_no_mm, addr)
 DECLARE_MOD_DEP_WRAPPER(swap_in_gate_area_no_task, int, unsigned long addr)
 IMP_MOD_DEP_WRAPPER(in_gate_area_no_task, addr)
 #endif /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) */
+#endif /* __HAVE_ARCH_GATE_AREA */
 
 static inline int swap_in_gate_area_no_xxx(unsigned long addr)
 {
+#ifdef __HAVE_ARCH_GATE_AREA
 #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38)
        return swap_in_gate_area_no_mm(addr);
 #else /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) */
        return swap_in_gate_area_no_task(addr);
 #endif /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) */
+#else /* __HAVE_ARCH_GATE_AREA */
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38)
+       return in_gate_area_no_mm(addr);
+#else /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) */
+       return in_gate_area_no_task(addr);
+#endif /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) */
+#endif /* __HAVE_ARCH_GATE_AREA */
 }
 
 DECLARE_MOD_DEP_WRAPPER(swap__flush_anon_page,
@@ -369,7 +399,6 @@ int init_module_dependencies(void)
 #endif /* copy_to_user_page */
 
        INIT_MOD_DEP_VAR(find_extend_vma, find_extend_vma);
-       INIT_MOD_DEP_VAR(get_gate_vma, get_gate_vma);
 
 #ifdef CONFIG_HUGETLB_PAGE
        INIT_MOD_DEP_VAR(follow_hugetlb_page, follow_hugetlb_page);
@@ -377,6 +406,13 @@ int init_module_dependencies(void)
 
 #ifdef __HAVE_ARCH_GATE_AREA
        INIT_MOD_DEP_VAR(in_gate_area, in_gate_area);
+       INIT_MOD_DEP_VAR(get_gate_vma, get_gate_vma);
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)
+       INIT_MOD_DEP_VAR(in_gate_area_no_mm, in_gate_area_no_mm);
+#else /* (LINUX_VERSION_CODE > KERNEL_VERSION(3, 9, 0))  */
+       INIT_MOD_DEP_VAR(in_gate_area_no_task, in_gate_area_no_task);
+#endif /* (LINUX_VERSION_CODE > KERNEL_VERSION(3, 9, 0))  */
 #endif
 
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)
@@ -390,10 +426,6 @@ int init_module_dependencies(void)
 #ifndef is_zero_pfn
        swap_zero_pfn = page_to_pfn(ZERO_PAGE(0));
 #endif /* is_zero_pfn */
-
-       INIT_MOD_DEP_VAR(in_gate_area_no_mm, in_gate_area_no_mm);
-#else /* (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38))  */
-       INIT_MOD_DEP_VAR(in_gate_area_no_task, in_gate_area_no_task);
 #endif /* (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38))  */
 
 #if defined(ARCH_HAS_FLUSH_ANON_PAGE) && defined(CONFIG_ARM)
@@ -411,7 +443,9 @@ int init_module_dependencies(void)
 #else /*2.6.16 */
        INIT_MOD_DEP_VAR(put_task_struct, __put_task_struct_cb);
 #endif
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 3, 0)
+       INIT_MOD_DEP_VAR(do_mmap, do_mmap);
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)
        INIT_MOD_DEP_VAR(do_mmap_pgoff, do_mmap_pgoff);
 #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0) */
 
index f34a54e..54ab644 100644 (file)
@@ -142,7 +142,12 @@ int access_process_vm_atomic(struct task_struct *tsk, unsigned long addr,
        access_process_vm_atomic(tsk, addr, buf, len, 1)
 int page_present(struct mm_struct *mm, unsigned long addr);
 
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 3, 0)
+unsigned long swap_do_mmap(struct file *file, unsigned long addr,
+                          unsigned long len, unsigned long prot,
+                          unsigned long flags, vm_flags_t vm_flags,
+                          unsigned long pgoff, unsigned long *populate);
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)
 unsigned long swap_do_mmap_pgoff(struct file *file, unsigned long addr,
                                 unsigned long len, unsigned long prot,
                                 unsigned long flags, unsigned long pgoff,
index 8b46f5f..ff9e125 100644 (file)
@@ -397,7 +397,11 @@ static int mmap_ret_handler(struct kretprobe_instance *ri,
 }
 
 static struct kretprobe mmap_rp = {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 3, 0)
+       .kp.symbol_name = "do_mmap",
+#else /* (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 3, 0)) */
        .kp.symbol_name = "do_mmap_pgoff",
+#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 3, 0)) */
        .data_size = sizeof(struct mmap_priv),
        .entry_handler = mmap_entry_handler,
        .handler = mmap_ret_handler
index 0ee9ebe..418453f 100644 (file)
@@ -134,8 +134,8 @@ static struct pd_t *__create_pd(void)
                return NULL;
 
        down_write(&current->mm->mmap_sem);
-       page = swap_do_mmap(NULL, 0, PAGE_SIZE, PROT_READ | PROT_WRITE,
-                           MAP_ANONYMOUS | MAP_PRIVATE, 0);
+       page = __swap_do_mmap(NULL, 0, PAGE_SIZE, PROT_READ | PROT_WRITE,
+                             MAP_ANONYMOUS | MAP_PRIVATE, 0);
        up_write(&current->mm->mmap_sem);
        if (IS_ERR_VALUE(page)) {
                printk(KERN_ERR LOADER_PREFIX
index 2bbd046..fb12f1d 100644 (file)
@@ -264,7 +264,11 @@ static int taskctx_once(void)
        if (swap_signal_wake_up_state == NULL)
                goto not_found;
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 17, 0)
+       sym = "get_signal";
+#else /* (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 17, 0)) */
        sym = "get_signal_to_deliver";
+#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 17, 0)) */
        sig_kprobe.addr = swap_ksyms(sym);
        if (sig_kprobe.addr == 0)
                goto not_found;
index e8e6dc0..47e813a 100644 (file)
@@ -827,12 +827,20 @@ int once_helper(void)
        if (unmap_kretprobe.kp.addr == 0)
                goto not_found;
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 3, 0)
+       sym = "do_mmap";
+#else /* (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 3, 0)) */
        sym = "do_mmap_pgoff";
+#endif  /* (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 3, 0)) */
        mmap_kretprobe.kp.addr = swap_ksyms(sym);
        if (mmap_kretprobe.kp.addr == 0)
                goto not_found;
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 3, 0)
+       sym = "__set_task_comm";
+#else  /* (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 3, 0)) */
        sym = "set_task_comm";
+#endif  /* (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 3, 0)) */
        comm_kretprobe.kp.addr = swap_ksyms(sym);
        if (comm_kretprobe.kp.addr == 0)
                goto not_found;
index f190be2..4400e31 100644 (file)
 #include <kprobe/swap_kprobes_deps.h>
 
 
-static inline unsigned long swap_do_mmap(struct file *filp, unsigned long addr,
-                                        unsigned long len, unsigned long prot,
-                                        unsigned long flag,
-                                        unsigned long offset)
+static inline unsigned long __swap_do_mmap(struct file *filp,
+                                          unsigned long addr,
+                                          unsigned long len,
+                                          unsigned long prot,
+                                          unsigned long flag,
+                                          unsigned long offset)
 {
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)
+#if LINUX_VERSION_CODE > KERNEL_VERSION(4, 3, 0)
+       unsigned long populate;
+
+       return swap_do_mmap(filp, addr, len, prot,
+                                 flag, 0, offset, &populate);
+
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)
        unsigned long populate;
 
        return swap_do_mmap_pgoff(filp, addr, len, prot,
index 536d349..a48972f 100644 (file)
@@ -39,8 +39,9 @@ static void *sm_alloc_us(struct slot_manager *sm)
 {
        unsigned long addr;
 
-       addr = swap_do_mmap(NULL, 0, PAGE_SIZE, PROT_EXEC|PROT_READ|PROT_WRITE,
-                           MAP_ANONYMOUS|MAP_PRIVATE, 0);
+       addr = __swap_do_mmap(NULL, 0, PAGE_SIZE,
+                             PROT_EXEC | PROT_READ | PROT_WRITE,
+                             MAP_ANONYMOUS | MAP_PRIVATE, 0);
        return (void *)addr;
 }