• Daniel Thompson's avatar
    arm64: cacheflush: Fix KGDB trap detection · ab8ad279
    Daniel Thompson authored
    flush_icache_range() contains a bodge to avoid issuing IPIs when the kgdb
    trap handler is running because issuing IPIs is unsafe (and not needed)
    in this execution context. However the current test, based on
    kgdb_connected is flawed: it both over-matches and under-matches.
    
    The over match occurs because kgdb_connected is set when gdb attaches
    to the stub and remains set during normal running. This is relatively
    harmelss because in almost all cases irq_disabled() will be false.
    
    The under match is more serious. When kdb is used instead of kgdb to access
    the debugger then kgdb_connected is not set in all the places that the
    debug core updates sw breakpoints (and hence flushes the icache). This
    can lead to deadlock.
    
    Fix by replacing the ad-hoc check with the proper kgdb macro. This also
    allows us to drop the #ifdef wrapper.
    
    Fixes: 3b8c9f1c ("arm64: IPI each CPU after invalidating the I-cache for kernel mappings")
    Signed-off-by: default avatarDaniel Thompson <daniel.thompson@linaro.org>
    Reviewed-by: default avatarDouglas Anderson <dianders@chromium.org>
    Link: https://lore.kernel.org/r/20200504170518.2959478-1-daniel.thompson@linaro.orgSigned-off-by: default avatarWill Deacon <will@kernel.org>
    ab8ad279
cacheflush.h 5.54 KB