arm64: Allow hw watchpoint of length 3,5,6 and 7
authorPratyush Anand <panand@redhat.com>
Mon, 14 Nov 2016 14:02:45 +0000 (19:32 +0530)
committerWill Deacon <will.deacon@arm.com>
Fri, 18 Nov 2016 17:26:14 +0000 (17:26 +0000)
Since, arm64 can support all offset within a double word limit. Therefore,
now support other lengths within that range as well.

Signed-off-by: Pratyush Anand <panand@redhat.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
arch/arm64/include/asm/hw_breakpoint.h
arch/arm64/kernel/hw_breakpoint.c

index d1c3b06ad307160c29585bd92a47ccfc70cbcfb5..b6b167ac082b69f04416a788efae6fba13c7343d 100644 (file)
@@ -77,7 +77,11 @@ static inline void decode_ctrl_reg(u32 reg,
 /* Lengths */
 #define ARM_BREAKPOINT_LEN_1   0x1
 #define ARM_BREAKPOINT_LEN_2   0x3
+#define ARM_BREAKPOINT_LEN_3   0x7
 #define ARM_BREAKPOINT_LEN_4   0xf
+#define ARM_BREAKPOINT_LEN_5   0x1f
+#define ARM_BREAKPOINT_LEN_6   0x3f
+#define ARM_BREAKPOINT_LEN_7   0x7f
 #define ARM_BREAKPOINT_LEN_8   0xff
 
 /* Kernel stepping */
index 13035d06b4980ade56cfe84a7da55646b2ed8550..1b3c747fedda51060d30fbd8a337870ca0291d6c 100644 (file)
@@ -317,9 +317,21 @@ static int get_hbp_len(u8 hbp_len)
        case ARM_BREAKPOINT_LEN_2:
                len_in_bytes = 2;
                break;
+       case ARM_BREAKPOINT_LEN_3:
+               len_in_bytes = 3;
+               break;
        case ARM_BREAKPOINT_LEN_4:
                len_in_bytes = 4;
                break;
+       case ARM_BREAKPOINT_LEN_5:
+               len_in_bytes = 5;
+               break;
+       case ARM_BREAKPOINT_LEN_6:
+               len_in_bytes = 6;
+               break;
+       case ARM_BREAKPOINT_LEN_7:
+               len_in_bytes = 7;
+               break;
        case ARM_BREAKPOINT_LEN_8:
                len_in_bytes = 8;
                break;
@@ -381,9 +393,21 @@ int arch_bp_generic_fields(struct arch_hw_breakpoint_ctrl ctrl,
        case ARM_BREAKPOINT_LEN_2:
                *gen_len = HW_BREAKPOINT_LEN_2;
                break;
+       case ARM_BREAKPOINT_LEN_3:
+               *gen_len = HW_BREAKPOINT_LEN_3;
+               break;
        case ARM_BREAKPOINT_LEN_4:
                *gen_len = HW_BREAKPOINT_LEN_4;
                break;
+       case ARM_BREAKPOINT_LEN_5:
+               *gen_len = HW_BREAKPOINT_LEN_5;
+               break;
+       case ARM_BREAKPOINT_LEN_6:
+               *gen_len = HW_BREAKPOINT_LEN_6;
+               break;
+       case ARM_BREAKPOINT_LEN_7:
+               *gen_len = HW_BREAKPOINT_LEN_7;
+               break;
        case ARM_BREAKPOINT_LEN_8:
                *gen_len = HW_BREAKPOINT_LEN_8;
                break;
@@ -427,9 +451,21 @@ static int arch_build_bp_info(struct perf_event *bp)
        case HW_BREAKPOINT_LEN_2:
                info->ctrl.len = ARM_BREAKPOINT_LEN_2;
                break;
+       case HW_BREAKPOINT_LEN_3:
+               info->ctrl.len = ARM_BREAKPOINT_LEN_3;
+               break;
        case HW_BREAKPOINT_LEN_4:
                info->ctrl.len = ARM_BREAKPOINT_LEN_4;
                break;
+       case HW_BREAKPOINT_LEN_5:
+               info->ctrl.len = ARM_BREAKPOINT_LEN_5;
+               break;
+       case HW_BREAKPOINT_LEN_6:
+               info->ctrl.len = ARM_BREAKPOINT_LEN_6;
+               break;
+       case HW_BREAKPOINT_LEN_7:
+               info->ctrl.len = ARM_BREAKPOINT_LEN_7;
+               break;
        case HW_BREAKPOINT_LEN_8:
                info->ctrl.len = ARM_BREAKPOINT_LEN_8;
                break;