Re: [RFC PATCH v2 11/12] powerpc/ptrace: create ppc_gethwdinfo()

2019-07-02 Thread Ravi Bangoria



On 6/28/19 9:18 PM, Christophe Leroy wrote:
> Create ippc_gethwdinfo() to handle PPC_PTRACE_GETHWDBGINFO and
> reduce ifdef mess
> 
> Signed-off-by: Christophe Leroy 
> ---

Reviewed-by: Ravi Bangoria 



[RFC PATCH v2 11/12] powerpc/ptrace: create ppc_gethwdinfo()

2019-06-28 Thread Christophe Leroy
Create ippc_gethwdinfo() to handle PPC_PTRACE_GETHWDBGINFO and
reduce ifdef mess

Signed-off-by: Christophe Leroy 
---
 arch/powerpc/kernel/ptrace/ptrace-adv.c   | 15 +++
 arch/powerpc/kernel/ptrace/ptrace-decl.h  |  1 +
 arch/powerpc/kernel/ptrace/ptrace-noadv.c | 20 +++
 arch/powerpc/kernel/ptrace/ptrace.c   | 32 +--
 4 files changed, 37 insertions(+), 31 deletions(-)

diff --git a/arch/powerpc/kernel/ptrace/ptrace-adv.c 
b/arch/powerpc/kernel/ptrace/ptrace-adv.c
index dcc765940344..f5f334484ebc 100644
--- a/arch/powerpc/kernel/ptrace/ptrace-adv.c
+++ b/arch/powerpc/kernel/ptrace/ptrace-adv.c
@@ -83,6 +83,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)
 {
diff --git a/arch/powerpc/kernel/ptrace/ptrace-decl.h 
b/arch/powerpc/kernel/ptrace/ptrace-decl.h
index 4b4b6a1d508a..3c8a81999292 100644
--- a/arch/powerpc/kernel/ptrace/ptrace-decl.h
+++ b/arch/powerpc/kernel/ptrace/ptrace-decl.h
@@ -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);
diff --git a/arch/powerpc/kernel/ptrace/ptrace-noadv.c 
b/arch/powerpc/kernel/ptrace/ptrace-noadv.c
index 985cca136f85..426fedd7ab6c 100644
--- a/arch/powerpc/kernel/ptrace/ptrace-noadv.c
+++ b/arch/powerpc/kernel/ptrace/ptrace-noadv.c
@@ -64,6 +64,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)
 {
diff --git a/arch/powerpc/kernel/ptrace/ptrace.c 
b/arch/powerpc/kernel/ptrace/ptrace.c
index e789afae6f56..31e8c5a9171e 100644
--- a/arch/powerpc/kernel/ptrace/ptrace.c
+++ b/arch/powerpc/kernel/ptrace/ptrace.c
@@ -159,37 +159,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);
-