lkml.org 
[lkml]   [2020]   [May]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [patch V4 part 1 23/36] bug: Annotate WARN/BUG/stackfail as noinstr safe
    ----- On May 5, 2020, at 9:16 AM, Thomas Gleixner tglx@linutronix.de wrote:

    > Warnings, bugs and stack protection fails from noinstr sections, e.g. low
    > level and early entry code, are likely to be fatal.
    >
    > Mark them as "safe" to be invoked from noinstr protected code to avoid
    > annotating all usage sites. Getting the information out is important.

    Why instrument at the x86 level (and miss other architectures) when this
    could perhaps be done directly in the macro WARN_ON_ONCE(condition) in
    generic code ?

    >
    > Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    > ---
    > arch/x86/include/asm/bug.h | 3 +++
    > include/asm-generic/bug.h | 9 +++++++--
    > kernel/panic.c | 4 +++-
    > 3 files changed, 13 insertions(+), 3 deletions(-)
    >
    > --- a/arch/x86/include/asm/bug.h
    > +++ b/arch/x86/include/asm/bug.h
    > @@ -70,13 +70,16 @@ do { \
    > #define HAVE_ARCH_BUG
    > #define BUG() \
    > do { \
    > + instr_begin(); \
    > _BUG_FLAGS(ASM_UD2, 0); \
    > unreachable(); \
    > } while (0)
    >
    > #define __WARN_FLAGS(flags) \
    > do { \
    > + instr_begin(); \
    > _BUG_FLAGS(ASM_UD2, BUGFLAG_WARNING|(flags)); \
    > + instr_end(); \
    > annotate_reachable(); \
    > } while (0)

    riscv, arm64, s390, powerpc, parisc and sh also have __WARN_FLAGS.

    >
    > --- a/include/asm-generic/bug.h
    > +++ b/include/asm-generic/bug.h
    > @@ -83,14 +83,19 @@ extern __printf(4, 5)
    > void warn_slowpath_fmt(const char *file, const int line, unsigned taint,
    > const char *fmt, ...);
    > #define __WARN() __WARN_printf(TAINT_WARN, NULL)
    > -#define __WARN_printf(taint, arg...) \
    > - warn_slowpath_fmt(__FILE__, __LINE__, taint, arg)
    > +#define __WARN_printf(taint, arg...) do { \
    > + instr_begin(); \
    > + warn_slowpath_fmt(__FILE__, __LINE__, taint, arg); \
    > + instr_end(); \
    > + } while (0)
    > #else
    > extern __printf(1, 2) void __warn_printk(const char *fmt, ...);
    > #define __WARN() __WARN_FLAGS(BUGFLAG_TAINT(TAINT_WARN))
    > #define __WARN_printf(taint, arg...) do { \
    > + instr_begin(); \
    > __warn_printk(arg); \
    > __WARN_FLAGS(BUGFLAG_NO_CUT_HERE | BUGFLAG_TAINT(taint));\
    > + instr_end(); \
    > } while (0)
    > #define WARN_ON_ONCE(condition) ({ \

    Moving the instr_begin/end here should fix it ?

    Thanks,

    Mathieu

    > int __ret_warn_on = !!(condition); \
    > --- a/kernel/panic.c
    > +++ b/kernel/panic.c
    > @@ -662,10 +662,12 @@ device_initcall(register_warn_debugfs);
    > * Called when gcc's -fstack-protector feature is used, and
    > * gcc detects corruption of the on-stack canary value
    > */
    > -__visible void __stack_chk_fail(void)
    > +__visible noinstr void __stack_chk_fail(void)
    > {
    > + instr_begin();
    > panic("stack-protector: Kernel stack is corrupted in: %pB",
    > __builtin_return_address(0));
    > + instr_end();
    > }
    > EXPORT_SYMBOL(__stack_chk_fail);

    --
    Mathieu Desnoyers
    EfficiOS Inc.
    http://www.efficios.com

    \
     
     \ /
      Last update: 2020-05-14 01:12    [W:4.019 / U:0.304 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site