• Linus Walleij's avatar
    ARM: 9391/2: hw_breakpoint: Handle CFI breakpoints · c3f89986
    Linus Walleij authored
    This registers a breakpoint handler for the new breakpoint type
    (0x03) inserted by LLVM CLANG for CFI breakpoints.
    
    If we are in permissive mode, just print a backtrace and continue.
    
    Example with CONFIG_CFI_PERMISSIVE enabled:
    
    > echo CFI_FORWARD_PROTO > /sys/kernel/debug/provoke-crash/DIRECT
    lkdtm: Performing direct entry CFI_FORWARD_PROTO
    lkdtm: Calling matched prototype ...
    lkdtm: Calling mismatched prototype ...
    CFI failure at lkdtm_indirect_call+0x40/0x4c (target: 0x0; expected type: 0x00000000)
    WARNING: CPU: 1 PID: 112 at lkdtm_indirect_call+0x40/0x4c
    CPU: 1 PID: 112 Comm: sh Not tainted 6.8.0-rc1+ #150
    Hardware name: ARM-Versatile Express
    (...)
    lkdtm: FAIL: survived mismatched prototype function call!
    lkdtm: Unexpected! This kernel (6.8.0-rc1+ armv7l) was built with CONFIG_CFI_CLANG=y
    
    As you can see the LKDTM test fails, but I expect that this would be
    expected behaviour in the permissive mode.
    
    We are currently not implementing target and type for the CFI
    breakpoint as this requires additional operand bundling compiler
    extensions.
    
    CPUs without breakpoint support cannot handle breakpoints naturally,
    in these cases the permissive mode will not work, CFI will fall over
    on an undefined instruction:
    
    Internal error: Oops - undefined instruction: 0 [#1] PREEMPT ARM
    CPU: 0 PID: 186 Comm: ash Tainted: G        W          6.9.0-rc1+ #7
    Hardware name: Gemini (Device Tree)
    PC is at lkdtm_indirect_call+0x38/0x4c
    LR is at lkdtm_CFI_FORWARD_PROTO+0x30/0x6c
    
    This is reasonable I think: it's the best CFI can do to ascertain
    the the control flow is not broken on these CPUs.
    Reviewed-by: default avatarKees Cook <keescook@chromium.org>
    Tested-by: default avatarKees Cook <keescook@chromium.org>
    Reviewed-by: default avatarSami Tolvanen <samitolvanen@google.com>
    Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    Signed-off-by: default avatarRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
    c3f89986
hw_breakpoint.c 30.1 KB