#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>
#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 {
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)
{
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;
}
out:
+ if (ret)
+ swap_td_raw_unreg(&td_raw);
+
return ret;
}
{
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,
#include <linux/kdebug.h>
#include <kprobe/swap_slots.h>
+#include <kprobe/swap_td_raw.h>
#include <uprobe/swap_uprobes.h>
#include "swap_uprobes.h"
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 +
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)
*/
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;
}
/**
void swap_arch_exit_uprobes(void)
{
unregister_die_notifier(&uprobe_exceptions_nb);
+ swap_td_raw_unreg(&td_raw);
}