Merge branches 'work.misc' and 'work.dcache' of git://git.kernel.org/pub/scm/linux...
[sfrench/cifs-2.6.git] / arch / xtensa / kernel / hw_breakpoint.c
index b35656ab7dbd184ba4bb099c9f716ea4b7ee9657..c2e387c19cdac7090828ee53cdd9424691d12cac 100644 (file)
@@ -33,14 +33,13 @@ int hw_breakpoint_slots(int type)
        }
 }
 
-int arch_check_bp_in_kernelspace(struct perf_event *bp)
+int arch_check_bp_in_kernelspace(struct arch_hw_breakpoint *hw)
 {
        unsigned int len;
        unsigned long va;
-       struct arch_hw_breakpoint *info = counter_arch_bp(bp);
 
-       va = info->address;
-       len = bp->attr.bp_len;
+       va = hw->address;
+       len = hw->len;
 
        return (va >= TASK_SIZE) && ((va + len - 1) >= TASK_SIZE);
 }
@@ -48,50 +47,41 @@ int arch_check_bp_in_kernelspace(struct perf_event *bp)
 /*
  * Construct an arch_hw_breakpoint from a perf_event.
  */
-static int arch_build_bp_info(struct perf_event *bp)
+int hw_breakpoint_arch_parse(struct perf_event *bp,
+                            const struct perf_event_attr *attr,
+                            struct arch_hw_breakpoint *hw)
 {
-       struct arch_hw_breakpoint *info = counter_arch_bp(bp);
-
        /* Type */
-       switch (bp->attr.bp_type) {
+       switch (attr->bp_type) {
        case HW_BREAKPOINT_X:
-               info->type = XTENSA_BREAKPOINT_EXECUTE;
+               hw->type = XTENSA_BREAKPOINT_EXECUTE;
                break;
        case HW_BREAKPOINT_R:
-               info->type = XTENSA_BREAKPOINT_LOAD;
+               hw->type = XTENSA_BREAKPOINT_LOAD;
                break;
        case HW_BREAKPOINT_W:
-               info->type = XTENSA_BREAKPOINT_STORE;
+               hw->type = XTENSA_BREAKPOINT_STORE;
                break;
        case HW_BREAKPOINT_RW:
-               info->type = XTENSA_BREAKPOINT_LOAD | XTENSA_BREAKPOINT_STORE;
+               hw->type = XTENSA_BREAKPOINT_LOAD | XTENSA_BREAKPOINT_STORE;
                break;
        default:
                return -EINVAL;
        }
 
        /* Len */
-       info->len = bp->attr.bp_len;
-       if (info->len < 1 || info->len > 64 || !is_power_of_2(info->len))
+       hw->len = attr->bp_len;
+       if (hw->len < 1 || hw->len > 64 || !is_power_of_2(hw->len))
                return -EINVAL;
 
        /* Address */
-       info->address = bp->attr.bp_addr;
-       if (info->address & (info->len - 1))
+       hw->address = attr->bp_addr;
+       if (hw->address & (hw->len - 1))
                return -EINVAL;
 
        return 0;
 }
 
-int arch_validate_hwbkpt_settings(struct perf_event *bp)
-{
-       int ret;
-
-       /* Build the arch_hw_breakpoint. */
-       ret = arch_build_bp_info(bp);
-       return ret;
-}
-
 int hw_breakpoint_exceptions_notify(struct notifier_block *unused,
                                    unsigned long val, void *data)
 {