powerpc/ptrace: create ppc_gethwdinfo()
authorChristophe Leroy <christophe.leroy@c-s.fr>
Fri, 28 Feb 2020 00:14:48 +0000 (00:14 +0000)
committerMichael Ellerman <mpe@ellerman.id.au>
Wed, 1 Apr 2020 03:30:49 +0000 (14:30 +1100)
Create ippc_gethwdinfo() to handle PPC_PTRACE_GETHWDBGINFO and
reduce ifdef mess

Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/82fefcc1ec75b96cece792878217a5d85ecda0c2.1582848567.git.christophe.leroy@c-s.fr
arch/powerpc/kernel/ptrace/ptrace-adv.c
arch/powerpc/kernel/ptrace/ptrace-decl.h
arch/powerpc/kernel/ptrace/ptrace-noadv.c
arch/powerpc/kernel/ptrace/ptrace.c

index c71bedd54a8bc2896d2c348d71f116102ba3dfff..3990c01ef8cfa9303dd7513c52389635b148292c 100644 (file)
@@ -56,6 +56,21 @@ void user_disable_single_step(struct task_struct *task)
        clear_tsk_thread_flag(task, TIF_SINGLESTEP);
 }
 
+void ppc_gethwdinfo(struct ppc_debug_info *dbginfo)
+{
+       dbginfo->version = 1;
+       dbginfo->num_instruction_bps = CONFIG_PPC_ADV_DEBUG_IACS;
+       dbginfo->num_data_bps = CONFIG_PPC_ADV_DEBUG_DACS;
+       dbginfo->num_condition_regs = CONFIG_PPC_ADV_DEBUG_DVCS;
+       dbginfo->data_bp_alignment = 4;
+       dbginfo->sizeof_condition = 4;
+       dbginfo->features = PPC_DEBUG_FEATURE_INSN_BP_RANGE |
+                           PPC_DEBUG_FEATURE_INSN_BP_MASK;
+       if (IS_ENABLED(CONFIG_PPC_ADV_DEBUG_DAC_RANGE))
+               dbginfo->features |= PPC_DEBUG_FEATURE_DATA_BP_RANGE |
+                                    PPC_DEBUG_FEATURE_DATA_BP_MASK;
+}
+
 int ptrace_get_debugreg(struct task_struct *child, unsigned long addr,
                        unsigned long __user *datalp)
 {
index 4b4b6a1d508ab1b53ecfb15e33ff4a7de4a23391..3c8a81999292527c58eee9a1759ef80f43b74c03 100644 (file)
@@ -176,6 +176,7 @@ int tm_cgpr32_set(struct task_struct *target, const struct user_regset *regset,
 extern const struct user_regset_view user_ppc_native_view;
 
 /* ptrace-(no)adv */
+void ppc_gethwdinfo(struct ppc_debug_info *dbginfo);
 int ptrace_get_debugreg(struct task_struct *child, unsigned long addr,
                        unsigned long __user *datalp);
 int ptrace_set_debugreg(struct task_struct *task, unsigned long addr, unsigned long data);
index a6ad492badc66f0a6017e64fb3e8610f5d9c06a7..f87e7c5c3bf3af3f22350a8bc7f0167dc6675286 100644 (file)
@@ -39,6 +39,26 @@ void user_disable_single_step(struct task_struct *task)
        clear_tsk_thread_flag(task, TIF_SINGLESTEP);
 }
 
+void ppc_gethwdinfo(struct ppc_debug_info *dbginfo)
+{
+       dbginfo->version = 1;
+       dbginfo->num_instruction_bps = 0;
+       if (ppc_breakpoint_available())
+               dbginfo->num_data_bps = 1;
+       else
+               dbginfo->num_data_bps = 0;
+       dbginfo->num_condition_regs = 0;
+       dbginfo->data_bp_alignment = sizeof(long);
+       dbginfo->sizeof_condition = 0;
+       if (IS_ENABLED(CONFIG_HAVE_HW_BREAKPOINT)) {
+               dbginfo->features = PPC_DEBUG_FEATURE_DATA_BP_RANGE;
+               if (dawr_enabled())
+                       dbginfo->features |= PPC_DEBUG_FEATURE_DATA_BP_DAWR;
+       } else {
+               dbginfo->features = 0;
+       }
+}
+
 int ptrace_get_debugreg(struct task_struct *child, unsigned long addr,
                        unsigned long __user *datalp)
 {
index d6e1a301d20eacbbd757b6cc33418c06bbff42ab..a44f6e5e05ffc7cccb9b24de124191c916aae989 100644 (file)
@@ -139,37 +139,7 @@ long arch_ptrace(struct task_struct *child, long request,
        case PPC_PTRACE_GETHWDBGINFO: {
                struct ppc_debug_info dbginfo;
 
-               dbginfo.version = 1;
-#ifdef CONFIG_PPC_ADV_DEBUG_REGS
-               dbginfo.num_instruction_bps = CONFIG_PPC_ADV_DEBUG_IACS;
-               dbginfo.num_data_bps = CONFIG_PPC_ADV_DEBUG_DACS;
-               dbginfo.num_condition_regs = CONFIG_PPC_ADV_DEBUG_DVCS;
-               dbginfo.data_bp_alignment = 4;
-               dbginfo.sizeof_condition = 4;
-               dbginfo.features = PPC_DEBUG_FEATURE_INSN_BP_RANGE |
-                                  PPC_DEBUG_FEATURE_INSN_BP_MASK;
-#ifdef CONFIG_PPC_ADV_DEBUG_DAC_RANGE
-               dbginfo.features |=
-                                  PPC_DEBUG_FEATURE_DATA_BP_RANGE |
-                                  PPC_DEBUG_FEATURE_DATA_BP_MASK;
-#endif
-#else /* !CONFIG_PPC_ADV_DEBUG_REGS */
-               dbginfo.num_instruction_bps = 0;
-               if (ppc_breakpoint_available())
-                       dbginfo.num_data_bps = 1;
-               else
-                       dbginfo.num_data_bps = 0;
-               dbginfo.num_condition_regs = 0;
-               dbginfo.data_bp_alignment = sizeof(long);
-               dbginfo.sizeof_condition = 0;
-#ifdef CONFIG_HAVE_HW_BREAKPOINT
-               dbginfo.features = PPC_DEBUG_FEATURE_DATA_BP_RANGE;
-               if (dawr_enabled())
-                       dbginfo.features |= PPC_DEBUG_FEATURE_DATA_BP_DAWR;
-#else
-               dbginfo.features = 0;
-#endif /* CONFIG_HAVE_HW_BREAKPOINT */
-#endif /* CONFIG_PPC_ADV_DEBUG_REGS */
+               ppc_gethwdinfo(&dbginfo);
 
                if (copy_to_user(datavp, &dbginfo,
                                 sizeof(struct ppc_debug_info)))