[IMPROVE] Add swap_put_uarg() 58/33658/2
authorAlexander Aksenov <a.aksenov@samsung.com>
Fri, 28 Nov 2014 11:51:40 +0000 (14:51 +0300)
committerAlexander Aksenov <a.aksenov@samsung.com>
Tue, 24 Feb 2015 08:18:32 +0000 (11:18 +0300)
Change-Id: I87057e7b496c655b582aef86484403c0ff6a85e7
Signed-off-by: Alexander Aksenov <a.aksenov@samsung.com>
uprobe/arch/arm/swap-asm/swap_uprobes.h
uprobe/arch/x86/swap-asm/swap_uprobes.h

index 826e308..c519d12 100644 (file)
@@ -109,6 +109,27 @@ static inline unsigned long swap_get_uarg(struct pt_regs *regs, unsigned long n)
        return addr;
 }
 
+static inline void swap_put_uarg(struct pt_regs *regs, unsigned long n,
+                                 unsigned long val)
+{
+       u32 *ptr;
+
+       switch (n) {
+       case 0:
+               regs->ARM_r0 = val;
+       case 1:
+               regs->ARM_r1 = val;
+       case 2:
+               regs->ARM_r2 = val;
+       case 3:
+               regs->ARM_r3 = val;
+       }
+
+       ptr = (u32 *)regs->ARM_sp + n - 4;
+       if (put_user(val, ptr))
+               printk("failed to dereference a pointer, ptr=%p\n", ptr);
+}
+
 int swap_arch_init_uprobes(void);
 void swap_arch_exit_uprobes(void);
 
index 3ca6334..360c033 100644 (file)
@@ -103,6 +103,17 @@ static inline unsigned long swap_get_uarg(struct pt_regs *regs, unsigned long n)
        return addr;
 }
 
+static inline void swap_put_uarg(struct pt_regs *regs, unsigned long n,
+                                 unsigned long val)
+{
+       u32 *ptr;
+
+       /* 1 - return address saved on top of the stack */
+       ptr = (u32 *)regs->sp + n + 1;
+       if (put_user(val, ptr))
+               printk("failed to dereference a pointer, ptr=%p\n", ptr);
+}
+
 int swap_arch_init_uprobes(void);
 void swap_arch_exit_uprobes(void);