Commit 5916d5f9 authored by Thomas Gleixner's avatar Thomas Gleixner

bug: Annotate WARN/BUG/stackfail as noinstr safe

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: default avatarThomas Gleixner <tglx@linutronix.de>
Reviewed-by: default avatarAlexandre Chartre <alexandre.chartre@oracle.com>
Acked-by: default avatarPeter Zijlstra <peterz@infradead.org>
Link: https://lkml.kernel.org/r/20200505134100.376598577@linutronix.de

parent 126f21f0
...@@ -70,14 +70,17 @@ do { \ ...@@ -70,14 +70,17 @@ do { \
#define HAVE_ARCH_BUG #define HAVE_ARCH_BUG
#define BUG() \ #define BUG() \
do { \ do { \
instrumentation_begin(); \
_BUG_FLAGS(ASM_UD2, 0); \ _BUG_FLAGS(ASM_UD2, 0); \
unreachable(); \ unreachable(); \
} while (0) } while (0)
#define __WARN_FLAGS(flags) \ #define __WARN_FLAGS(flags) \
do { \ do { \
instrumentation_begin(); \
_BUG_FLAGS(ASM_UD2, BUGFLAG_WARNING|(flags)); \ _BUG_FLAGS(ASM_UD2, BUGFLAG_WARNING|(flags)); \
annotate_reachable(); \ annotate_reachable(); \
instrumentation_end(); \
} while (0) } while (0)
#include <asm-generic/bug.h> #include <asm-generic/bug.h>
......
...@@ -83,14 +83,19 @@ extern __printf(4, 5) ...@@ -83,14 +83,19 @@ extern __printf(4, 5)
void warn_slowpath_fmt(const char *file, const int line, unsigned taint, void warn_slowpath_fmt(const char *file, const int line, unsigned taint,
const char *fmt, ...); const char *fmt, ...);
#define __WARN() __WARN_printf(TAINT_WARN, NULL) #define __WARN() __WARN_printf(TAINT_WARN, NULL)
#define __WARN_printf(taint, arg...) \ #define __WARN_printf(taint, arg...) do { \
warn_slowpath_fmt(__FILE__, __LINE__, taint, arg) instrumentation_begin(); \
warn_slowpath_fmt(__FILE__, __LINE__, taint, arg); \
instrumentation_end(); \
} while (0)
#else #else
extern __printf(1, 2) void __warn_printk(const char *fmt, ...); extern __printf(1, 2) void __warn_printk(const char *fmt, ...);
#define __WARN() __WARN_FLAGS(BUGFLAG_TAINT(TAINT_WARN)) #define __WARN() __WARN_FLAGS(BUGFLAG_TAINT(TAINT_WARN))
#define __WARN_printf(taint, arg...) do { \ #define __WARN_printf(taint, arg...) do { \
instrumentation_begin(); \
__warn_printk(arg); \ __warn_printk(arg); \
__WARN_FLAGS(BUGFLAG_NO_CUT_HERE | BUGFLAG_TAINT(taint));\ __WARN_FLAGS(BUGFLAG_NO_CUT_HERE | BUGFLAG_TAINT(taint));\
instrumentation_end(); \
} while (0) } while (0)
#define WARN_ON_ONCE(condition) ({ \ #define WARN_ON_ONCE(condition) ({ \
int __ret_warn_on = !!(condition); \ int __ret_warn_on = !!(condition); \
......
...@@ -680,10 +680,12 @@ device_initcall(register_warn_debugfs); ...@@ -680,10 +680,12 @@ device_initcall(register_warn_debugfs);
* Called when gcc's -fstack-protector feature is used, and * Called when gcc's -fstack-protector feature is used, and
* gcc detects corruption of the on-stack canary value * 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", panic("stack-protector: Kernel stack is corrupted in: %pB",
__builtin_return_address(0)); __builtin_return_address(0));
instrumentation_end();
} }
EXPORT_SYMBOL(__stack_chk_fail); EXPORT_SYMBOL(__stack_chk_fail);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment