#include <asm/hw_breakpoint.h>
 #include <asm/processor.h>
 #include <asm/sstep.h>
+#include <asm/debug.h>
 #include <linux/uaccess.h>
 
 /*
         * HW_BREAKPOINT_ALIGN by rounding off to the lower address, the
         * 'symbolsize' should satisfy the check below.
         */
+       if (!ppc_breakpoint_available())
+               return -ENODEV;
        length_max = 8; /* DABR */
        if (cpu_has_feature(CPU_FTR_DAWR)) {
                length_max = 512 ; /* 64 doublewords */
 
 #include <asm/switch_to.h>
 #include <asm/tm.h>
 #include <asm/asm-prototypes.h>
+#include <asm/debug.h>
 
 #define CREATE_TRACE_POINTS
 #include <trace/events/syscalls.h>
        struct perf_event_attr attr;
 #endif /* CONFIG_HAVE_HW_BREAKPOINT */
 #ifndef CONFIG_PPC_ADV_DEBUG_REGS
+       bool set_bp = true;
        struct arch_hw_breakpoint hw_brk;
 #endif
 
        hw_brk.address = data & (~HW_BRK_TYPE_DABR);
        hw_brk.type = (data & HW_BRK_TYPE_DABR) | HW_BRK_TYPE_PRIV_ALL;
        hw_brk.len = 8;
+       set_bp = (data) && (hw_brk.type & HW_BRK_TYPE_RDWR);
 #ifdef CONFIG_HAVE_HW_BREAKPOINT
        bp = thread->ptrace_bps[0];
-       if ((!data) || !(hw_brk.type & HW_BRK_TYPE_RDWR)) {
+       if (!set_bp) {
                if (bp) {
                        unregister_hw_breakpoint(bp);
                        thread->ptrace_bps[0] = NULL;
                return PTR_ERR(bp);
        }
 
+#else /* !CONFIG_HAVE_HW_BREAKPOINT */
+       if (set_bp && (!ppc_breakpoint_available()))
+               return -ENODEV;
 #endif /* CONFIG_HAVE_HW_BREAKPOINT */
        task->thread.hw_brk = hw_brk;
 #else /* CONFIG_PPC_ADV_DEBUG_REGS */
        if (child->thread.hw_brk.address)
                return -ENOSPC;
 
+       if (!ppc_breakpoint_available())
+               return -ENODEV;
+
        child->thread.hw_brk = brk;
 
        return 1;
 #endif
 #else /* !CONFIG_PPC_ADV_DEBUG_REGS */
                dbginfo.num_instruction_bps = 0;
-               dbginfo.num_data_bps = 1;
+               if (ppc_breakpoint_available())
+                       dbginfo.num_data_bps = 1;
+               else
+                       dbginfo.num_data_bps = 0;
                dbginfo.num_condition_regs = 0;
 #ifdef CONFIG_PPC64
                dbginfo.data_bp_alignment = 8;