• Mark Rutland's avatar
    kasan: add functions to clear stack poison · e3ae1163
    Mark Rutland authored
    Functions which the compiler has instrumented for ASAN place poison on
    the stack shadow upon entry and remove this poison prior to returning.
    
    In some cases (e.g. hotplug and idle), CPUs may exit the kernel a
    number of levels deep in C code.  If there are any instrumented
    functions on this critical path, these will leave portions of the idle
    thread stack shadow poisoned.
    
    If a CPU returns to the kernel via a different path (e.g. a cold
    entry), then depending on stack frame layout subsequent calls to
    instrumented functions may use regions of the stack with stale poison,
    resulting in (spurious) KASAN splats to the console.
    
    Contemporary GCCs always add stack shadow poisoning when ASAN is
    enabled, even when asked to not instrument a function [1], so we can't
    simply annotate functions on the critical path to avoid poisoning.
    
    Instead, this series explicitly removes any stale poison before it can
    be hit.  In the common hotplug case we clear the entire stack shadow in
    common code, before a CPU is brought online.
    
    On architectures which perform a cold return as part of cpu idle may
    retain an architecture-specific amount of stack contents.  To retain the
    poison for this retained context, the arch code must call the core KASAN
    code, passing a "watermark" stack pointer value beyond which shadow will
    be cleared.  Architectures which don't perform a cold return as part of
    idle do not need any additional code.
    
    This patch (of 3):
    
    Functions which the compiler has instrumented for KASAN place poison on
    the stack shadow upon entry and remove this poision prior to returning.
    
    In some cases (e.g.  hotplug and idle), CPUs may exit the kernel a number
    of levels deep in C code.  If there are any instrumented functions on this
    critical path, these will leave portions of the stack shadow poisoned.
    
    If a CPU returns to the kernel via a different path (e.g.  a cold entry),
    then depending on stack frame layout subsequent calls to instrumented
    functions may use regions of the stack with stale poison, resulting in
    (spurious) KASAN splats to the console.
    
    To avoid this, we must clear stale poison from the stack prior to
    instrumented functions being called.  This patch adds functions to the
    KASAN core for removing poison from (portions of) a task's stack.  These
    will be used by subsequent patches to avoid problems with hotplug and
    idle.
    Signed-off-by: default avatarMark Rutland <mark.rutland@arm.com>
    Acked-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    Reviewed-by: default avatarAndrey Ryabinin <aryabinin@virtuozzo.com>
    Cc: Alexander Potapenko <glider@google.com>
    Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Cc: Will Deacon <will.deacon@arm.com>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    e3ae1163
kasan.c 13.4 KB