{
struct pf_data *data = (struct pf_data *)ri->data;
+#ifdef CONFIG_ARM
+ data->addr = swap_get_karg(regs, 0);
+#else /* CONFIG_ARM */
data->addr = swap_get_karg(regs, 2);
+#endif /* CONFIG_ARM */
return 0;
}
+#ifdef CONFIG_ARM
+static unsigned long cb_pf(void *data)
+{
+ unsigned long page_addr = *(unsigned long *)data;
+
+ call_page_fault(current, page_addr);
+
+ 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)
{
/* TODO: check return value */
page_addr = ((struct pf_data *)ri->data)->addr & PAGE_MASK;
+
+#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 */
return 0;
}
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;
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);
+ sspt_proc_install(proc);
+ up_write(&task->mm->mmap_sem);
+#else /* CONFIG_ARM */
sspt_proc_install(proc);
+#endif /* CONFIG_ARM */
} else {
+#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 */
}
}
}
#include <us_manager/us_slot_manager.h>
#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) { \
if (!atomic) { \
mmput(mm); \
}
+#endif /* CONFIG_ARM */
+
static LIST_HEAD(proc_probes_list);
static DEFINE_RWLOCK(sspt_proc_rwlock);
{
struct vm_area_struct *vma;
- down_read(&mm->mmap_sem);
for (vma = mm->mmap; vma; vma = vma->vm_next) {
if (vma->vm_file && (vma->vm_flags & VM_EXEC) &&
(vma->vm_file->f_dentry == dentry))
vma = NULL;
out:
- up_read(&mm->mmap_sem);
return vma;
}
{
struct vm_area_struct *vma;
- down_read(&mm->mmap_sem);
for (vma = mm->mmap; vma; vma = vma->vm_next) {
if (check_vma(vma)) {
lib_obj = pack_lib_obj(lib_obj, vma);
++(*lib_cnt_p);
}
}
- up_read(&mm->mmap_sem);
return lib_obj;
}
return pack_proc_info_part(end_path, task->mm);
}
+/* called with down\up\_read(&task->mm->mmap_sem) */
int proc_info_msg(struct task_struct *task, struct dentry *dentry)
{
char *buf, *payload, *buf_end;