ARM64: implement functionality for set/get pc and lr 23/111123/5
authorVyacheslav Cherkashin <v.cherkashin@samsung.com>
Wed, 18 Jan 2017 12:42:48 +0000 (15:42 +0300)
committerVyacheslav Cherkashin <v.cherkashin@samsung.com>
Tue, 31 Jan 2017 07:21:26 +0000 (10:21 +0300)
Change-Id: I76f17020adf2cd344e0129cbe0e39de5274b6c32
Signed-off-by: Vyacheslav Cherkashin <v.cherkashin@samsung.com>
kprobe/arch/arm64/swap-asm/swap_kprobes.h
uprobe/arch/arm64/swap-asm/swap_uprobes.h

index 4222501..a2ee3f1 100644 (file)
@@ -97,13 +97,12 @@ static inline unsigned long swap_get_sarg(struct pt_regs *regs,
 
 static inline unsigned long swap_get_kpc(struct pt_regs *regs)
 {
-       WARN(1, "not implemented"); /* FIXME: to implement */
-       return 0xdeadc0de;
+       return regs->pc;
 }
 
 static inline void swap_set_kpc(struct pt_regs *regs, unsigned long val)
 {
-       WARN(1, "not implemented"); /* FIXME: to implement */
+       regs->pc = val;
 }
 
 
index 73032ed..a5fbe63 100644 (file)
@@ -156,6 +156,16 @@ static inline u64 swap_get_urp_double(struct pt_regs *regs)
        return swap_get_double(regs, 0);
 }
 
+static inline unsigned long swap_get_upc_arm64(struct pt_regs *regs)
+{
+       return regs->pc;
+}
+
+static inline void swap_set_upc_arm64(struct pt_regs *regs, unsigned long val)
+{
+       regs->pc = val;
+}
+
 static inline unsigned long swap_get_uarg_arm64(struct pt_regs *regs,
                                                unsigned long n)
 {
@@ -183,15 +193,31 @@ static inline void swap_put_uarg_arm64(struct pt_regs *regs, unsigned long n,
        }
 }
 
+static inline unsigned long swap_get_uret_addr_arm64(struct pt_regs *regs)
+{
+       return regs->regs[30];
+}
+
+static inline void swap_set_uret_addr_arm64(struct pt_regs *regs,
+                                           unsigned long val)
+{
+       regs->regs[30] = val;
+}
+
 static inline unsigned long swap_get_upc(struct pt_regs *regs)
 {
-       WARN(1, "not implemented"); /* FIXME: to implement */
-       return 0;
+       if (compat_user_mode(regs))
+               return swap_get_upc_arm(regs);
+       else
+               return swap_get_upc_arm64(regs);
 }
 
 static inline void swap_set_upc(struct pt_regs *regs, unsigned long val)
 {
-       WARN(1, "not implemented"); /* FIXME: to implement */
+       if (compat_user_mode(regs))
+               swap_set_upc_arm(regs, val);
+       else
+               swap_set_upc_arm64(regs, val);
 }
 
 static inline unsigned long swap_get_uarg(struct pt_regs *regs, unsigned long n)
@@ -205,18 +231,26 @@ static inline unsigned long swap_get_uarg(struct pt_regs *regs, unsigned long n)
 static inline void swap_put_uarg(struct pt_regs *regs, unsigned long n,
                                 unsigned long val)
 {
-       WARN(1, "not implemented"); /* FIXME: to implement */
+       if (compat_user_mode(regs))
+               return swap_put_uarg_arm(regs, n, val);
+       else
+               return swap_put_uarg_arm64(regs, n, val);
 }
 
 static inline unsigned long swap_get_uret_addr(struct pt_regs *regs)
 {
-       WARN(1, "not implemented"); /* FIXME: to implement */
-       return 0;
+       if (compat_user_mode(regs))
+               return swap_get_uret_addr_arm(regs);
+       else
+               return swap_get_uret_addr_arm64(regs);
 }
 
 static inline void swap_set_uret_addr(struct pt_regs *regs, unsigned long val)
 {
-       WARN(1, "not implemented"); /* FIXME: to implement */
+       if (compat_user_mode(regs))
+               swap_set_uret_addr_arm(regs, val);
+       else
+               swap_set_uret_addr_arm64(regs, val);
 }
 
 int arch_prepare_uprobe(struct uprobe *p);