MIPS: Move register dump routines out of ptrace code
authorMarcin Nowakowski <marcin.nowakowski@imgtec.com>
Mon, 21 Nov 2016 10:23:38 +0000 (11:23 +0100)
committerRalf Baechle <ralf@linux-mips.org>
Tue, 3 Jan 2017 15:34:44 +0000 (16:34 +0100)
Current register dump methods for MIPS are implemented inside ptrace
methods, but there will be other uses in the kernel for them, so keep
them separately in process.c and use those definitions for ptrace
instead.

Signed-off-by: Marcin Nowakowski <marcin.nowakowski@imgtec.com>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/14587/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
arch/mips/include/asm/elf.h
arch/mips/kernel/process.c
arch/mips/kernel/ptrace.c

index 2b3dc29736700b657ae2192ed484b6f9e79eb648..f61a4a14bb565647451076b79de1ceaaf49d789a 100644 (file)
@@ -210,6 +210,9 @@ typedef elf_greg_t elf_gregset_t[ELF_NGREG];
 typedef double elf_fpreg_t;
 typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
 
+void mips_dump_regs32(u32 *uregs, const struct pt_regs *regs);
+void mips_dump_regs64(u64 *uregs, const struct pt_regs *regs);
+
 #ifdef CONFIG_32BIT
 /*
  * This is used to ensure we don't load something for the wrong architecture.
index 3da0161bdf84dddb7d260650590b87ecf96c896c..803e255b6fc3768fdba165d61da9559f6bc079d1 100644 (file)
@@ -729,3 +729,47 @@ int mips_set_process_fp_mode(struct task_struct *task, unsigned int value)
 
        return 0;
 }
+
+#if defined(CONFIG_32BIT) || defined(CONFIG_MIPS32_O32)
+void mips_dump_regs32(u32 *uregs, const struct pt_regs *regs)
+{
+       unsigned int i;
+
+       for (i = MIPS32_EF_R1; i <= MIPS32_EF_R31; i++) {
+               /* k0/k1 are copied as zero. */
+               if (i == MIPS32_EF_R26 || i == MIPS32_EF_R27)
+                       uregs[i] = 0;
+               else
+                       uregs[i] = regs->regs[i - MIPS32_EF_R0];
+       }
+
+       uregs[MIPS32_EF_LO] = regs->lo;
+       uregs[MIPS32_EF_HI] = regs->hi;
+       uregs[MIPS32_EF_CP0_EPC] = regs->cp0_epc;
+       uregs[MIPS32_EF_CP0_BADVADDR] = regs->cp0_badvaddr;
+       uregs[MIPS32_EF_CP0_STATUS] = regs->cp0_status;
+       uregs[MIPS32_EF_CP0_CAUSE] = regs->cp0_cause;
+}
+#endif /* CONFIG_32BIT || CONFIG_MIPS32_O32 */
+
+#ifdef CONFIG_64BIT
+void mips_dump_regs64(u64 *uregs, const struct pt_regs *regs)
+{
+       unsigned int i;
+
+       for (i = MIPS64_EF_R1; i <= MIPS64_EF_R31; i++) {
+               /* k0/k1 are copied as zero. */
+               if (i == MIPS64_EF_R26 || i == MIPS64_EF_R27)
+                       uregs[i] = 0;
+               else
+                       uregs[i] = regs->regs[i - MIPS64_EF_R0];
+       }
+
+       uregs[MIPS64_EF_LO] = regs->lo;
+       uregs[MIPS64_EF_HI] = regs->hi;
+       uregs[MIPS64_EF_CP0_EPC] = regs->cp0_epc;
+       uregs[MIPS64_EF_CP0_BADVADDR] = regs->cp0_badvaddr;
+       uregs[MIPS64_EF_CP0_STATUS] = regs->cp0_status;
+       uregs[MIPS64_EF_CP0_CAUSE] = regs->cp0_cause;
+}
+#endif /* CONFIG_64BIT */
index c8ba2607213298ab0e4a846ca0fa26ee908b253e..fdef26382c376e5de3235108d05e1f107df7035b 100644 (file)
@@ -294,23 +294,8 @@ static int gpr32_get(struct task_struct *target,
 {
        struct pt_regs *regs = task_pt_regs(target);
        u32 uregs[ELF_NGREG] = {};
-       unsigned i;
-
-       for (i = MIPS32_EF_R1; i <= MIPS32_EF_R31; i++) {
-               /* k0/k1 are copied as zero. */
-               if (i == MIPS32_EF_R26 || i == MIPS32_EF_R27)
-                       continue;
-
-               uregs[i] = regs->regs[i - MIPS32_EF_R0];
-       }
-
-       uregs[MIPS32_EF_LO] = regs->lo;
-       uregs[MIPS32_EF_HI] = regs->hi;
-       uregs[MIPS32_EF_CP0_EPC] = regs->cp0_epc;
-       uregs[MIPS32_EF_CP0_BADVADDR] = regs->cp0_badvaddr;
-       uregs[MIPS32_EF_CP0_STATUS] = regs->cp0_status;
-       uregs[MIPS32_EF_CP0_CAUSE] = regs->cp0_cause;
 
+       mips_dump_regs32(uregs, regs);
        return user_regset_copyout(&pos, &count, &kbuf, &ubuf, uregs, 0,
                                   sizeof(uregs));
 }
@@ -373,23 +358,8 @@ static int gpr64_get(struct task_struct *target,
 {
        struct pt_regs *regs = task_pt_regs(target);
        u64 uregs[ELF_NGREG] = {};
-       unsigned i;
-
-       for (i = MIPS64_EF_R1; i <= MIPS64_EF_R31; i++) {
-               /* k0/k1 are copied as zero. */
-               if (i == MIPS64_EF_R26 || i == MIPS64_EF_R27)
-                       continue;
-
-               uregs[i] = regs->regs[i - MIPS64_EF_R0];
-       }
-
-       uregs[MIPS64_EF_LO] = regs->lo;
-       uregs[MIPS64_EF_HI] = regs->hi;
-       uregs[MIPS64_EF_CP0_EPC] = regs->cp0_epc;
-       uregs[MIPS64_EF_CP0_BADVADDR] = regs->cp0_badvaddr;
-       uregs[MIPS64_EF_CP0_STATUS] = regs->cp0_status;
-       uregs[MIPS64_EF_CP0_CAUSE] = regs->cp0_cause;
 
+       mips_dump_regs64(uregs, regs);
        return user_regset_copyout(&pos, &count, &kbuf, &ubuf, uregs, 0,
                                   sizeof(uregs));
 }