On 08/08, Frederic Weisbecker wrote:
>
> I'm all for fixing this. May be we can start by backporting a patch that
> ignores the value of gen_len for instruction breakpoints in x86?

Or perhaps we can start with the something like below.

But probably we should move "attr.bp_len == HW_BREAKPOINT_LEN_1" check
from arch_build_bp_info() to its caller, arch_validate_hwbkpt_settings().

Because:

> But this bp_len
> should rather be used for range breakpoints on archs that support it.

Yes, exactly, and we already have the patches for amd, so bp->len can
be actually != 1 but currently we can't support because it is checked
in arch_build_bp_info().

Oleg.

--- x/arch/x86/kernel/hw_breakpoint.c
+++ x/arch/x86/kernel/hw_breakpoint.c
@@ -208,19 +208,16 @@ int arch_bp_generic_fields(int x86_len, 
 {
        /* Type */
        switch (x86_type) {
-       case X86_BREAKPOINT_EXECUTE:
-               if (x86_len != X86_BREAKPOINT_LEN_X)
-                       return -EINVAL;
-
-               *gen_type = HW_BREAKPOINT_X;
-               *gen_len = sizeof(long);
-               return 0;
        case X86_BREAKPOINT_WRITE:
                *gen_type = HW_BREAKPOINT_W;
                break;
        case X86_BREAKPOINT_RW:
                *gen_type = HW_BREAKPOINT_W | HW_BREAKPOINT_R;
                break;
+       case X86_BREAKPOINT_EXECUTE:
+               *gen_type = HW_BREAKPOINT_X;
+               if (x86_len == X86_BREAKPOINT_LEN_1)
+                       break;
        default:
                return -EINVAL;
        }
@@ -265,15 +262,11 @@ static int arch_build_bp_info(struct per
                break;
        case HW_BREAKPOINT_X:
                info->type = X86_BREAKPOINT_EXECUTE;
-               /*
-                * x86 inst breakpoints need to have a specific undefined len.
-                * But we still need to check userspace is not trying to setup
-                * an unsupported length, to get a range breakpoint for example.
-                */
-               if (bp->attr.bp_len == sizeof(long)) {
-                       info->len = X86_BREAKPOINT_LEN_X;
-                       return 0;
-               }
+               /* until we change tools/perf */
+               if (bp->attr.bp_len == sizeof(long))
+                       bp->attr.bp_len = HW_BREAKPOINT_LEN_1;
+               if (bp->attr.bp_len == HW_BREAKPOINT_LEN_1)
+                       break;
        default:
                return -EINVAL;
        }

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to