[IMPROVE] coordination of the use of the stack
authorVyacheslav Cherkashin <v.cherkashin@samsung.com>
Tue, 13 Oct 2015 15:06:33 +0000 (18:06 +0300)
committerVyacheslav Cherkashin <v.cherkashin@samsung.com>
Thu, 22 Oct 2015 10:05:12 +0000 (13:05 +0300)
Change-Id: Ib3b0b126ccb651b6cbaab99be0ccb50a9f79d100
Signed-off-by: Vyacheslav Cherkashin <v.cherkashin@samsung.com>
task_data/task_data.c
uprobe/arch/x86/swap-asm/swap_uprobes.c

index 4d8f0ab..d079b3c 100644 (file)
@@ -3,6 +3,7 @@
 #include <linux/sched.h>
 #include <linux/stop_machine.h>
 #include <linux/slab.h>
+#include <kprobe/swap_td_raw.h>
 #include <kprobe/swap_kprobes.h>
 #include <ksyms/ksyms.h>
 #include <master/swap_initializer.h>
@@ -16,7 +17,6 @@
 #define __DEFINE_TD_MAGIC(m) ((m) & TD_MAGIC_MASK)
 
 #define TD_MAGIC __DEFINE_TD_MAGIC(0xbebebebe)
-#define TD_OFFSET 1  /* skip STACK_END_MAGIC */
 #define TD_PREFIX "[TASK_DATA] "
 
 struct task_data {
@@ -30,9 +30,11 @@ struct task_data {
 static int __task_data_cbs_start_h = -1;
 static int __task_data_cbs_stop_h = -1;
 
+static struct td_raw td_raw;
+
 static inline struct task_data *__td(struct task_struct *task)
 {
-       return (struct task_data *)(end_of_stack(task) + TD_OFFSET);
+       return (struct task_data *)swap_td_raw(&td_raw, task);
 }
 
 static inline bool __td_check(struct task_data *td)
@@ -217,6 +219,10 @@ static int task_data_init(void)
 {
        int ret = 0;
 
+       ret = swap_td_raw_reg(&td_raw, sizeof(struct task_data));
+       if (ret)
+               return ret;
+
        __task_data_cbs_start_h = us_manager_reg_cb(START_CB, task_data_start);
        if (__task_data_cbs_start_h < 0) {
                ret = __task_data_cbs_start_h;
@@ -232,6 +238,9 @@ static int task_data_init(void)
        }
 
 out:
+       if (ret)
+               swap_td_raw_unreg(&td_raw);
+
        return ret;
 }
 
@@ -239,6 +248,7 @@ static void task_data_exit(void)
 {
        us_manager_unreg_cb(__task_data_cbs_start_h);
        us_manager_unreg_cb(__task_data_cbs_stop_h);
+       swap_td_raw_unreg(&td_raw);
 }
 
 SWAP_LIGHT_INIT_MODULE(task_data_once, task_data_init, task_data_exit,
index 70ddb3f..4aae5f1 100644 (file)
@@ -34,6 +34,7 @@
 #include <linux/kdebug.h>
 
 #include <kprobe/swap_slots.h>
+#include <kprobe/swap_td_raw.h>
 #include <uprobe/swap_uprobes.h>
 
 #include "swap_uprobes.h"
@@ -48,6 +49,10 @@ struct uprobe_ctlblk {
        struct uprobe *p;               /**< Pointer to the uprobe */
 };
 
+
+static struct td_raw td_raw;
+
+
 static unsigned long trampoline_addr(struct uprobe *up)
 {
        return (unsigned long)(up->ainsn.insn +
@@ -61,8 +66,7 @@ unsigned long arch_tramp_by_ri(struct uretprobe_instance *ri)
 
 static struct uprobe_ctlblk *current_ucb(void)
 {
-       /* FIXME hardcoded offset */
-       return (struct uprobe_ctlblk *)(end_of_stack(current) + 20);
+       return (struct uprobe_ctlblk *)swap_td_raw(&td_raw, current);
 }
 
 static struct uprobe *get_current_probe(void)
@@ -571,7 +575,17 @@ static struct notifier_block uprobe_exceptions_nb = {
  */
 int swap_arch_init_uprobes(void)
 {
-       return register_die_notifier(&uprobe_exceptions_nb);
+       int ret;
+
+       ret = swap_td_raw_reg(&td_raw, sizeof(struct uprobe_ctlblk));
+       if (ret)
+               return ret;
+
+       ret = register_die_notifier(&uprobe_exceptions_nb);
+       if (ret)
+               swap_td_raw_unreg(&td_raw);
+
+       return ret;
 }
 
 /**
@@ -582,5 +596,6 @@ int swap_arch_init_uprobes(void)
 void swap_arch_exit_uprobes(void)
 {
        unregister_die_notifier(&uprobe_exceptions_nb);
+       swap_td_raw_unreg(&td_raw);
 }