ARCv2: ptrace: provide regset for accumulator/r30 regs
authorVineet Gupta <vgupta@synopsys.com>
Wed, 3 May 2017 18:21:31 +0000 (11:21 -0700)
committerVineet Gupta <vgupta@synopsys.com>
Wed, 3 May 2017 18:21:31 +0000 (11:21 -0700)
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
arch/arc/include/uapi/asm/elf.h
arch/arc/include/uapi/asm/ptrace.h
arch/arc/kernel/ptrace.c

index 0037a587320d51c4262e7c3b7b504a8dafb34ddc..06d95e611616a3f6ab884848f19cd065fb6a8680 100644 (file)
@@ -27,6 +27,7 @@ typedef unsigned long elf_greg_t;
 typedef unsigned long elf_fpregset_t;
 
 #define ELF_NGREG      (sizeof(struct user_regs_struct) / sizeof(elf_greg_t))
+#define ELF_ARCV2REG   (sizeof(struct user_regs_arcv2) / sizeof(elf_greg_t))
 
 typedef elf_greg_t elf_gregset_t[ELF_NGREG];
 
index 0b3ef63d4a03b3ef2ff119535ee3c020641e1888..dd206e6b482c11b2f605be711eb1ac8f9b2f9e47 100644 (file)
@@ -47,6 +47,11 @@ struct user_regs_struct {
        unsigned long efa;      /* break pt addr, for break points in delay slots */
        unsigned long stop_pc;  /* give dbg stop_pc after ensuring brkpt trap */
 };
+
+struct user_regs_arcv2 {
+       unsigned long r30, r58, r59;
+};
+
 #endif /* !__ASSEMBLY__ */
 
 #endif /* _UAPI__ASM_ARC_PTRACE_H */
index 31150060d38b41cf8191a3b8740c489a572d0fbc..5ee4676f135dee1d0bbc39d467e18281eb9cd1fe 100644 (file)
@@ -184,19 +184,75 @@ static int genregs_set(struct task_struct *target,
        return ret;
 }
 
+#ifdef CONFIG_ISA_ARCV2
+static int arcv2regs_get(struct task_struct *target,
+                      const struct user_regset *regset,
+                      unsigned int pos, unsigned int count,
+                      void *kbuf, void __user *ubuf)
+{
+       const struct pt_regs *regs = task_pt_regs(target);
+       int ret, copy_sz;
+
+       if (IS_ENABLED(CONFIG_ARC_HAS_ACCL_REGS))
+               copy_sz = sizeof(struct user_regs_arcv2);
+       else
+               copy_sz = 4;    /* r30 only */
+
+       /*
+        * itemized copy not needed like above as layout of regs (r30,r58,r59)
+        * is exactly same in kernel (pt_regs) and userspace (user_regs_arcv2)
+        */
+       ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf, &regs->r30,
+                                 0, copy_sz);
+
+       return ret;
+}
+
+static int arcv2regs_set(struct task_struct *target,
+                      const struct user_regset *regset,
+                      unsigned int pos, unsigned int count,
+                      const void *kbuf, const void __user *ubuf)
+{
+       const struct pt_regs *regs = task_pt_regs(target);
+       int ret, copy_sz;
+
+       if (IS_ENABLED(CONFIG_ARC_HAS_ACCL_REGS))
+               copy_sz = sizeof(struct user_regs_arcv2);
+       else
+               copy_sz = 4;    /* r30 only */
+
+       ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, (void *)&regs->r30,
+                                 0, copy_sz);
+
+       return ret;
+}
+
+#endif
+
 enum arc_getset {
-       REGSET_GENERAL,
+       REGSET_CMN,
+       REGSET_ARCV2,
 };
 
 static const struct user_regset arc_regsets[] = {
-       [REGSET_GENERAL] = {
+       [REGSET_CMN] = {
               .core_note_type = NT_PRSTATUS,
               .n = ELF_NGREG,
               .size = sizeof(unsigned long),
               .align = sizeof(unsigned long),
               .get = genregs_get,
               .set = genregs_set,
-       }
+       },
+#ifdef CONFIG_ISA_ARCV2
+       [REGSET_ARCV2] = {
+              .core_note_type = NT_ARC_V2,
+              .n = ELF_ARCV2REG,
+              .size = sizeof(unsigned long),
+              .align = sizeof(unsigned long),
+              .get = arcv2regs_get,
+              .set = arcv2regs_set,
+       },
+#endif
 };
 
 static const struct user_regset_view user_arc_view = {