|
@@ -47,50 +47,41 @@ int arch_check_bp_in_kernelspace(struct arch_hw_breakpoint *hw)
|
|
|
/*
|
|
|
* 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)
|
|
|
{
|