[FIX] Remove dependencies from old driver
authorAlexander Aksenov <a.aksenov@samsung.com>
Mon, 15 Jul 2013 12:41:23 +0000 (16:41 +0400)
committerAlexander Aksenov <a.aksenov@samsung.com>
Mon, 15 Jul 2013 12:41:23 +0000 (16:41 +0400)
15 files changed:
build.sh
kprobe/dbi_insn_slots.c
uprobe/swap_uprobes.h
us_manager/Kbuild
us_manager/helper.c
us_manager/sspt/ip.c
us_manager/sspt/ip.h
us_manager/sspt/sspt.h
us_manager/sspt/sspt_file.c
us_manager/sspt/sspt_proc.c
us_manager/sspt/us_proc_types.h [new file with mode: 0644]
us_manager/us_def_handler.c [new file with mode: 0644]
us_manager/us_def_handler.h [new file with mode: 0644]
us_manager/us_manager.c
us_manager/us_slot_manager.c

index f5fbc94..4e51c49 100755 (executable)
--- a/build.sh
+++ b/build.sh
@@ -34,9 +34,6 @@ ks_features_dir=${modules_dir}/ks_features
 sampler_dir=${modules_dir}/sampler
 parser_dir=${modules_dir}/parser
 
-driver_dir=${modules_dir}/driver
-common_dir=${modules_dir}/../common
-
 install_dir="/opt/swap/sdk"
 
 rm ${kprobe_arch_dir}/asm
index 7a02e4b..e3d508b 100644 (file)
@@ -50,7 +50,7 @@
 #include <linux/rculist.h>
 #include <linux/slab.h>
 #include <linux/spinlock.h>
-#include <dbi_kprobes_deps.h>
+#include <kprobe/dbi_kprobes_deps.h>
 
 struct chunk {
        unsigned long *data;
index 0980228..7fad2fe 100644 (file)
@@ -27,7 +27,7 @@
  *
  */
 
-#include "dbi_kprobes.h"
+#include <kprobe/dbi_kprobes.h>
 
 struct uprobe {
        struct kprobe kp;
index b2addfc..9d52c7c 100644 (file)
@@ -5,4 +5,4 @@ swap_us_manager-y := us_manager.o us_slot_manager.o helper.o \
                      sspt/ip.o sspt/sspt_page.o sspt/sspt_file.o sspt/sspt_proc.o \
                      pf/proc_filters.o pf/pf_group.o \
                      img/img_proc.o img/img_file.o img/img_ip.o \
-                     ../driver/us_def_handler.o
+                     us_def_handler.o
index d7a2149..1507b4c 100644 (file)
@@ -1,9 +1,7 @@
 #include <dbi_kprobes.h>
 #include <dbi_kprobes_deps.h>
 #include <ksyms.h>
-#include "us_proc_inst.h"
 #include "us_slot_manager.h"
-#include "storage.h"
 #include "sspt/sspt.h"
 #include "helper.h"
 
index 71d7d09..1946137 100644 (file)
@@ -27,8 +27,7 @@
 #include "sspt_page.h"
 #include "sspt_file.h"
 
-/* FIXME: */
-#include "../../driver/us_def_handler.h"
+#include "us_def_handler.h"
 
 struct us_ip *create_ip(unsigned long offset, const char *args)
 {
index 3e09cf1..358e84b 100644 (file)
@@ -27,7 +27,7 @@
 
 #include <linux/list.h>
 //#include "../../kprobe/dbi_kprobes.h"
-#include <swap_uprobes.h>
+#include <uprobe/swap_uprobes.h>
 
 // TODO: tmp struct ip_data
 struct ip_data {
index 1e71141..a373842 100644 (file)
 #include "sspt_file.h"
 #include "sspt_proc.h"
 #include "sspt_debug.h"
+#include "us_proc_types.h"
 #include <swap_uprobes.h>
 #include "us_def_handler.h"
 
 
-#include "../../driver/storage.h"
-
-#include "picl.h"
-#include "../../common/ec_probe.h"
-
 #include <us_manager.h>
 #include <pf/pf_group.h>
 
@@ -109,10 +105,6 @@ static inline int sspt_register_usprobe(struct us_ip *ip)
 
        ret = dbi_register_ujprobe(&ip->jprobe);
        if (ret) {
-               if (ret == -ENOEXEC) {
-                       pack_event_info(ERR_MSG_ID, RECORD_ENTRY, "dp",
-                                       0x1, ip->jprobe.up.kp.addr);
-               }
                printk("dbi_register_ujprobe() failure %d\n", ret);
                return ret;
        }
index 03400a8..7407834 100644 (file)
@@ -26,7 +26,6 @@
 #include "sspt_file.h"
 #include "sspt_page.h"
 #include "sspt_proc.h"
-#include <storage.h>
 #include <linux/slab.h>
 #include <linux/list.h>
 #include <linux/hash.h>
@@ -234,7 +233,7 @@ void sspt_file_set_mapping(struct sspt_file *file, struct vm_area_struct *vma)
        file->vm_start = vma->vm_start;
        file->vm_end = vma->vm_end;
 
-       ptr_pack_task_event_info(task, DYN_LIB_PROBE_ID, RECORD_ENTRY, "dspdd",
-                                task->tgid, file->dentry->d_iname, vma->vm_start,
-                                vma->vm_end - vma->vm_start, 0);
+//     ptr_pack_task_event_info(task, DYN_LIB_PROBE_ID, RECORD_ENTRY, "dspdd",
+//                              task->tgid, file->dentry->d_iname, vma->vm_start,
+//                              vma->vm_end - vma->vm_start, 0);
 }
index 496e7d2..69e71c1 100644 (file)
@@ -28,7 +28,6 @@
 #include <linux/slab.h>
 #include <linux/list.h>
 #include <us_slot_manager.h>
-#include <us_proc_inst.h>
 #include <writer/swap_writer_module.h>
 
 #define mm_read_lock(task, mm, atomic, lock)                   \
diff --git a/us_manager/sspt/us_proc_types.h b/us_manager/sspt/us_proc_types.h
new file mode 100644 (file)
index 0000000..6195a67
--- /dev/null
@@ -0,0 +1,59 @@
+typedef struct
+{
+       struct list_head list;
+       char *name;
+       int installed;
+       struct jprobe jprobe;
+       struct kretprobe retprobe;
+       unsigned long offset;
+       unsigned long got_addr;
+
+       unsigned flag_retprobe:1;
+       unsigned flag_got:1;
+} us_proc_ip_t;
+
+typedef struct
+{
+       int installed;
+       struct jprobe jprobe;
+       unsigned long addr;
+       struct list_head list;
+} us_proc_vtp_t;
+
+typedef struct
+{
+       unsigned func_addr;
+       unsigned got_addr;
+       unsigned real_func_addr;
+} us_proc_plt_t;
+
+typedef struct
+{
+       char *path;
+       char *path_dyn;
+       struct dentry *m_f_dentry;
+       unsigned ips_count;
+       us_proc_ip_t *p_ips;
+       unsigned vtps_count;
+       us_proc_vtp_t *p_vtps;
+       int loaded;
+       unsigned plt_count;
+       us_proc_plt_t *p_plt;
+       unsigned long vma_start;
+       unsigned long vma_end;
+       unsigned vma_flag;
+} us_proc_lib_t;
+
+typedef struct {
+       char *path;
+       struct dentry *m_f_dentry;
+       pid_t tgid;
+       unsigned unres_ips_count;
+       unsigned unres_vtps_count;
+       int is_plt;
+       unsigned libs_count;
+       us_proc_lib_t *p_libs;
+
+       // new_dpf
+       struct sspt_proc *pp;
+} inst_us_proc_t;
diff --git a/us_manager/us_def_handler.c b/us_manager/us_def_handler.c
new file mode 100644 (file)
index 0000000..3fb52ca
--- /dev/null
@@ -0,0 +1,101 @@
+#include <linux/module.h>
+#include <asm/percpu.h>
+//#include <ec_probe.h>
+//#include <picl.h>
+#include <swap_uprobes.h>
+#include <sspt/ip.h>
+#include <dbi_kprobes_deps.h>
+//#include "storage.h"
+//#include "us_proc_inst.h"
+#include <sspt/sspt.h>
+#include <writer/swap_writer_module.h>
+
+DEFINE_PER_CPU(struct us_ip *, gpCurIp) = NULL;
+EXPORT_PER_CPU_SYMBOL_GPL(gpCurIp);
+DEFINE_PER_CPU(struct pt_regs *, gpUserRegs) = NULL;
+EXPORT_PER_CPU_SYMBOL_GPL(gpUserRegs);
+
+unsigned long ujprobe_event_pre_handler(struct us_ip *ip, struct pt_regs *regs)
+{
+       __get_cpu_var(gpCurIp) = ip;
+       __get_cpu_var(gpUserRegs) = regs;
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(ujprobe_event_pre_handler);
+
+void ujprobe_event_handler(unsigned long arg0, unsigned long arg1,
+                          unsigned long arg2, unsigned long arg3,
+                          unsigned long arg4, unsigned long arg5)
+{
+       struct us_ip *ip = __get_cpu_var(gpCurIp);
+       struct us_ip *regs = __get_cpu_var(gpUserRegs);
+       unsigned long addr = (unsigned long)ip->jprobe.up.kp.addr;
+
+#if defined(CONFIG_ARM)
+       addr = ip->offset & 0x01 ? addr | 0x01 : addr;
+#endif
+
+       entry_event(ip->jprobe.args, regs, PT_US, PST_NONE);
+
+       swap_ujprobe_return();
+}
+EXPORT_SYMBOL_GPL(ujprobe_event_handler);
+
+static void send_plt(struct us_ip *ip)
+{
+       unsigned long addr = (unsigned long)ip->jprobe.up.kp.addr;
+       struct vm_area_struct *vma = find_vma(current->mm, addr);
+
+       if (vma && check_vma(vma)) {
+               char *name = NULL;
+               unsigned long real_addr;
+               unsigned long real_got = current->mm->exe_file == vma->vm_file ?
+                                        ip->got_addr :
+                                        ip->got_addr + vma->vm_start;
+
+               if (!read_proc_vm_atomic(current, real_got, &real_addr, sizeof(real_addr))) {
+                       printk("Failed to read got %lx at memory address %lx!\n", ip->got_addr, real_got);
+                       return;
+               }
+
+               vma = find_vma(current->mm, real_addr);
+               if (vma && (vma->vm_start <= real_addr) && (vma->vm_end > real_addr)) {
+                       name = vma->vm_file ? vma->vm_file->f_dentry->d_iname : NULL;
+               } else {
+                       printk("Failed to get vma, includes %lx address\n", real_addr);
+                       return;
+               }
+
+//             if (name)
+//                     pack_event_info(PLT_ADDR_PROBE_ID, RECORD_RET, "ppsp",
+//                                     addr, real_addr, name,
+//                                     real_addr - vma->vm_start);
+//             else
+//                     pack_event_info(PLT_ADDR_PROBE_ID, RECORD_RET, "ppp",
+//                                     addr, real_addr,
+//                                     real_addr - vma->vm_start);
+       }
+}
+
+int uretprobe_event_handler(struct uretprobe_instance *probe,
+                           struct pt_regs *regs,
+                           struct us_ip *ip)
+{
+       int retval = regs_return_value(regs);
+       unsigned long addr = (unsigned long)ip->jprobe.up.kp.addr;
+
+       if (ip->got_addr && ip->flag_got == 0) {
+               send_plt(ip);
+               ip->flag_got = 1;
+       }
+
+#if defined(CONFIG_ARM)
+       addr = ip->offset & 0x01 ? addr | 0x01 : addr;
+#endif
+
+       exit_event(regs);
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(uretprobe_event_handler);
diff --git a/us_manager/us_def_handler.h b/us_manager/us_def_handler.h
new file mode 100644 (file)
index 0000000..3628ac0
--- /dev/null
@@ -0,0 +1,21 @@
+#ifndef _US_DEF_HANDLER_H
+#define _US_DEF_HANDLER_H
+
+#include <asm/percpu.h>
+
+struct us_ip;
+struct pt_regs;
+struct uretprobe_instance;
+
+DECLARE_PER_CPU(struct us_ip *, gpCurIp);
+DECLARE_PER_CPU(struct pt_regs *, gpUserRegs);
+
+unsigned long ujprobe_event_pre_handler(struct us_ip *ip,
+                                       struct pt_regs *regs);
+void ujprobe_event_handler(unsigned long arg0, unsigned long arg1,
+                          unsigned long arg2, unsigned long arg3,
+                          unsigned long arg4, unsigned long arg5);
+int uretprobe_event_handler(struct uretprobe_instance *p,
+                           struct pt_regs *regs, struct us_ip *ip);
+
+#endif /* _US_DEF_HANDLER_H */
index 05501f8..53ddebc 100644 (file)
@@ -1,7 +1,7 @@
 #include <linux/module.h>
-#include <sspt/sspt.h>
-#include <sspt/sspt_proc.h>
-#include <sspt/sspt_page.h>
+#include <us_manager/sspt/sspt.h>
+#include <us_manager/sspt/sspt_proc.h>
+#include <us_manager/sspt/sspt_page.h>
 #include <helper.h>
 #include "pf/proc_filters.h"
 
index 0131223..3f96b35 100644 (file)
@@ -28,7 +28,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(NULL, 0, len, prot, flags, 0);
+               ret = do_mmap(NULL, 0, len, prot, flags, 0);
                current_thread_info()->task = otask;
                if (!atomic) {
                        downgrade_write (&mm->mmap_sem);
@@ -79,7 +79,7 @@ struct slot_manager *create_sm_us(struct task_struct *task)
        sm->slot_size = UPROBES_TRAMP_LEN;
        sm->alloc = sm_alloc_us;
        sm->free = sm_free_us;
-       INIT_HLIST_NODE(&sm->page_list);
+       INIT_HLIST_HEAD(&sm->page_list);
        sm->data = task;
 
        return sm;