* If so, DABR will be populated in single_step_dabr_instruction().
         */
        if (current->thread.last_hit_ubp != bp)
-               set_dabr(info->address | info->type | DABR_TRANSLATION, DABRX_ALL);
+               set_dabr(info->address | info->type | DABR_TRANSLATION, info->dabrx);
 
        return 0;
 }
 
        info->address = bp->attr.bp_addr;
        info->len = bp->attr.bp_len;
+       info->dabrx = DABRX_ALL;
+       if (bp->attr.exclude_user)
+               info->dabrx &= ~DABRX_USER;
+       if (bp->attr.exclude_kernel)
+               info->dabrx &= ~DABRX_KERNEL;
+       if (bp->attr.exclude_hv)
+               info->dabrx &= ~DABRX_HYP;
 
        /*
         * Since breakpoint length can be a maximum of HW_BREAKPOINT_LEN(8)
 
        info = counter_arch_bp(tsk->thread.last_hit_ubp);
        regs->msr &= ~MSR_SE;
-       set_dabr(info->address | info->type | DABR_TRANSLATION, DABRX_ALL);
+       set_dabr(info->address | info->type | DABR_TRANSLATION, info->dabrx);
        tsk->thread.last_hit_ubp = NULL;
 }
 
        if (!info->extraneous_interrupt)
                perf_bp_event(bp, regs);
 
-       set_dabr(info->address | info->type | DABR_TRANSLATION, DABRX_ALL);
+       set_dabr(info->address | info->type | DABR_TRANSLATION, info->dabrx);
 out:
        rcu_read_unlock();
        return rc;
        if (!info->extraneous_interrupt)
                perf_bp_event(bp, regs);
 
-       set_dabr(info->address | info->type | DABR_TRANSLATION, DABRX_ALL);
+       set_dabr(info->address | info->type | DABR_TRANSLATION, info->dabrx);
        current->thread.last_hit_ubp = NULL;
 
        /*
 
        if (dabrx == 0 && dabr == 0)
                dabrx = DABRX_USER;
        /* PAPR says we can only set kernel and user bits */
-       dabrx &= H_DABRX_KERNEL | H_DABRX_USER;
+       dabrx &= DABRX_KERNEL | DABRX_USER;
 
        return plpar_hcall_norets(H_SET_XDABR, dabr, dabrx);
 }