[IMPROVE] x86: apply jumper for US probes installing 41/32841/1 master
authorVyacheslav Cherkashin <v.cherkashin@samsung.com>
Tue, 12 Aug 2014 10:01:52 +0000 (14:01 +0400)
committerDmitry Kovalenko <d.kovalenko@samsung.com>
Fri, 26 Dec 2014 08:49:24 +0000 (00:49 -0800)
Change-Id: I0fdd2ada86df1cbcc7fbfd1d1fced9dde1c06a2c
Signed-off-by: Vyacheslav Cherkashin <v.cherkashin@samsung.com>
(cherry picked from commit 124bdcdf2740a06b7df64a2917b26f88aeb07e21)

us_manager/helper.c
us_manager/pf/pf_group.c
us_manager/sspt/sspt_proc.c

index 5b5d01a..6859999 100644 (file)
@@ -49,20 +49,21 @@ struct pf_data {
        unsigned long addr;
 };
 
-static int entry_handler_mf(struct kretprobe_instance *ri, struct pt_regs *regs)
+static int entry_handler_pf(struct kretprobe_instance *ri, struct pt_regs *regs)
 {
        struct pf_data *data = (struct pf_data *)ri->data;
 
-#ifdef CONFIG_ARM
+#if defined(CONFIG_ARM)
        data->addr = swap_get_karg(regs, 0);
-#else /* CONFIG_ARM */
-       data->addr = swap_get_karg(regs, 2);
-#endif /* CONFIG_ARM */
+#elif defined(CONFIG_X86_32)
+       data->addr = read_cr2();
+#else
+       #error "this architecture is not supported"
+#endif /* CONFIG_arch */
 
        return 0;
 }
 
-#ifdef CONFIG_ARM
 static unsigned long cb_pf(void *data)
 {
        unsigned long page_addr = *(unsigned long *)data;
@@ -71,34 +72,31 @@ static unsigned long cb_pf(void *data)
 
        return 0;
 }
-#endif /* CONFIG_ARM */
 
 /* Detects when IPs are really loaded into phy mem and installs probes. */
-static int ret_handler_mf(struct kretprobe_instance *ri, struct pt_regs *regs)
+static int ret_handler_pf(struct kretprobe_instance *ri, struct pt_regs *regs)
 {
        struct task_struct *task = current;
        unsigned long page_addr;
+       int ret;
 
        if (is_kthread(task))
                return 0;
 
        /* TODO: check return value */
        page_addr = ((struct pf_data *)ri->data)->addr & PAGE_MASK;
+       ret = set_jump_cb((unsigned long)ri->ret_addr, regs, cb_pf,
+                         &page_addr, sizeof(page_addr));
 
-#ifdef CONFIG_ARM
-       set_jump_cb((unsigned long)ri->ret_addr, regs, cb_pf,
-                   &page_addr, sizeof(page_addr));
-       ri->ret_addr = (unsigned long *)get_jump_addr();
-#else /* CONFIG_ARM */
-       call_page_fault(task, page_addr);
-#endif /* CONFIG_ARM */
+       if (ret == 0)
+               ri->ret_addr = (unsigned long *)get_jump_addr();
 
        return 0;
 }
 
 static struct kretprobe mf_kretprobe = {
-       .entry_handler = entry_handler_mf,
-       .handler = ret_handler_mf,
+       .entry_handler = entry_handler_pf,
+       .handler = ret_handler_pf,
        .data_size = sizeof(struct pf_data)
 };
 
@@ -656,12 +654,7 @@ int init_helper(void)
 {
        unsigned long addr;
 
-#ifdef CONFIG_ARM
        addr = swap_ksyms("do_page_fault");
-#else /* CONFIG_ARM */
-       addr = swap_ksyms("handle_mm_fault");
-#endif /* CONFIG_ARM */
-
        if (addr == 0) {
                printk("Cannot find address for handle_mm_fault function!\n");
                return -EINVAL;
index e5667b0..d967d6b 100644 (file)
@@ -190,31 +190,18 @@ static void first_install(struct task_struct *task, struct sspt_proc *proc,
                         NULL;
        }
 
-       down_read(&task->mm->mmap_sem);
-       proc_info_msg(task, dentry);
-       up_read(&task->mm->mmap_sem);
-
-#ifdef CONFIG_ARM
        down_write(&task->mm->mmap_sem);
+       proc_info_msg(task, dentry);
        sspt_proc_install(proc);
        up_write(&task->mm->mmap_sem);
-#else /* CONFIG_ARM */
-       sspt_proc_install(proc);
-#endif /* CONFIG_ARM */
 }
 
 static void subsequent_install(struct task_struct *task,
                               struct sspt_proc *proc, unsigned long page_addr)
 {
-       if (!page_addr)
-               return;
-#ifdef CONFIG_ARM
        down_write(&task->mm->mmap_sem);
        sspt_proc_install_page(proc, page_addr);
        up_write(&task->mm->mmap_sem);
-#else /* CONFIG_ARM */
-       sspt_proc_install_page(proc, page_addr);
-#endif /* CONFIG_ARM */
 }
 
 /**
index b76b136..baa0968 100644 (file)
 #include <writer/swap_writer_module.h>
 
 
-#ifdef CONFIG_ARM
-#define mm_read_lock(task, mm, atomic, lock)                   \
-       mm = task->mm;                                          \
-       lock = 0
-
-#define mm_read_unlock(mm, atomic, lock)
-#else /* CONFIG_ARM */
-#define mm_read_lock(task, mm, atomic, lock)                   \
-       mm = atomic ? task->active_mm : get_task_mm(task);      \
-       if (mm == NULL) {                                       \
-               /* FIXME: */                                    \
-               panic("ERRR mm_read_lock: mm == NULL\n");       \
-       }                                                       \
-                                                               \
-       if (atomic) {                                           \
-               lock = down_read_trylock(&mm->mmap_sem);        \
-       } else {                                                \
-               lock = 1;                                       \
-               down_read(&mm->mmap_sem);                       \
-       }
-
-#define mm_read_unlock(mm, atomic, lock)                       \
-       if (lock) {                                             \
-               up_read(&mm->mmap_sem);                         \
-       }                                                       \
-                                                               \
-       if (!atomic) {                                          \
-               mmput(mm);                                      \
-       }
-#endif /* CONFIG_ARM */
-
-
 static LIST_HEAD(proc_probes_list);
 static DEFINE_RWLOCK(sspt_proc_rwlock);
 
@@ -311,13 +279,8 @@ struct sspt_file *sspt_proc_find_file(struct sspt_proc *proc, struct dentry *den
  */
 void sspt_proc_install_page(struct sspt_proc *proc, unsigned long page_addr)
 {
-       int lock, atomic;
-       struct mm_struct *mm;
+       struct mm_struct *mm = proc->task->mm;
        struct vm_area_struct *vma;
-       struct task_struct *task = proc->task;
-
-       atomic = in_atomic();
-       mm_read_lock(task, mm, atomic, lock);
 
        vma = find_vma_intersection(mm, page_addr, page_addr + 1);
        if (vma && check_vma(vma)) {
@@ -336,8 +299,6 @@ void sspt_proc_install_page(struct sspt_proc *proc, unsigned long page_addr)
                        }
                }
        }
-
-       mm_read_unlock(mm, atomic, lock);
 }
 
 /**
@@ -348,16 +309,11 @@ void sspt_proc_install_page(struct sspt_proc *proc, unsigned long page_addr)
  */
 void sspt_proc_install(struct sspt_proc *proc)
 {
-       int lock, atomic;
        struct vm_area_struct *vma;
-       struct task_struct *task = proc->task;
-       struct mm_struct *mm;
+       struct mm_struct *mm = proc->task->mm;
 
        proc->first_install = 1;
 
-       atomic = in_atomic();
-       mm_read_lock(task, mm, atomic, lock);
-
        for (vma = mm->mmap; vma; vma = vma->vm_next) {
                if (check_vma(vma)) {
                        struct dentry *dentry = vma->vm_file->f_dentry;
@@ -372,8 +328,6 @@ void sspt_proc_install(struct sspt_proc *proc)
                        }
                }
        }
-
-       mm_read_unlock(mm, atomic, lock);
 }
 
 /**