bug: Annotate WARN/BUG/stackfail as noinstr safe
authorThomas Gleixner <tglx@linutronix.de>
Fri, 13 Mar 2020 12:49:51 +0000 (13:49 +0100)
committerThomas Gleixner <tglx@linutronix.de>
Thu, 11 Jun 2020 13:14:36 +0000 (15:14 +0200)
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.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Alexandre Chartre <alexandre.chartre@oracle.com>
Acked-by: Peter Zijlstra <peterz@infradead.org>
Link: https://lkml.kernel.org/r/20200505134100.376598577@linutronix.de
arch/x86/include/asm/bug.h
include/asm-generic/bug.h
kernel/panic.c

index facba9bc30caa4b9c7058c0b68efe122aa885dab..fb34ff641e0a1bc94a12b3e02521817fae12b3ea 100644 (file)
@@ -70,14 +70,17 @@ do {                                                                        \
 #define HAVE_ARCH_BUG
 #define BUG()                                                  \
 do {                                                           \
+       instrumentation_begin();                                \
        _BUG_FLAGS(ASM_UD2, 0);                                 \
        unreachable();                                          \
 } while (0)
 
 #define __WARN_FLAGS(flags)                                    \
 do {                                                           \
+       instrumentation_begin();                                \
        _BUG_FLAGS(ASM_UD2, BUGFLAG_WARNING|(flags));           \
        annotate_reachable();                                   \
+       instrumentation_end();                                  \
 } while (0)
 
 #include <asm-generic/bug.h>
index 384b5c835ced334a19d2552c914cc65be19d69a3..c94e33ae3e7b819919cc7238c9aecfbd85386f47 100644 (file)
@@ -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 {                              \
+               instrumentation_begin();                                \
+               warn_slowpath_fmt(__FILE__, __LINE__, taint, arg);      \
+               instrumentation_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 {                              \
+               instrumentation_begin();                                \
                __warn_printk(arg);                                     \
                __WARN_FLAGS(BUGFLAG_NO_CUT_HERE | BUGFLAG_TAINT(taint));\
+               instrumentation_end();                                  \
        } while (0)
 #define WARN_ON_ONCE(condition) ({                             \
        int __ret_warn_on = !!(condition);                      \
index 85568bbfb12b7f35807ad63f18b7379e03a3059b..e2157ca387c8322827bcf06a77359f206b19743b 100644 (file)
@@ -680,10 +680,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)
 {
+       instrumentation_begin();
        panic("stack-protector: Kernel stack is corrupted in: %pB",
                __builtin_return_address(0));
+       instrumentation_end();
 }
 EXPORT_SYMBOL(__stack_chk_fail);