This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/arch/x86/include/asm/bug.h b/arch/x86/include/asm/bug.h | |
index 84b87538a15d..6e3433c64eae 100644 | |
--- a/arch/x86/include/asm/bug.h | |
+++ b/arch/x86/include/asm/bug.h | |
@@ -22,7 +22,7 @@ | |
#ifdef CONFIG_DEBUG_BUGVERBOSE | |
-#define _BUG_FLAGS(ins, flags) \ | |
+#define _BUG_FLAGS(ins, flags, extra) \ | |
do { \ | |
asm_inline volatile("1:\t" ins "\n" \ | |
".pushsection __bug_table,\"aw\"\n" \ | |
@@ -31,7 +31,8 @@ do { \ | |
"\t.word %c1" "\t# bug_entry::line\n" \ | |
"\t.word %c2" "\t# bug_entry::flags\n" \ | |
"\t.org 2b+%c3\n" \ | |
- ".popsection" \ | |
+ ".popsection\n" \ | |
+ extra \ | |
: : "i" (__FILE__), "i" (__LINE__), \ | |
"i" (flags), \ | |
"i" (sizeof(struct bug_entry))); \ | |
@@ -39,14 +40,15 @@ do { \ | |
#else /* !CONFIG_DEBUG_BUGVERBOSE */ | |
-#define _BUG_FLAGS(ins, flags) \ | |
+#define _BUG_FLAGS(ins, flags, extra) \ | |
do { \ | |
asm_inline volatile("1:\t" ins "\n" \ | |
".pushsection __bug_table,\"aw\"\n" \ | |
"2:\t" __BUG_REL(1b) "\t# bug_entry::bug_addr\n" \ | |
"\t.word %c0" "\t# bug_entry::flags\n" \ | |
"\t.org 2b+%c1\n" \ | |
- ".popsection" \ | |
+ ".popsection\n" \ | |
+ extra \ | |
: : "i" (flags), \ | |
"i" (sizeof(struct bug_entry))); \ | |
} while (0) | |
} while (0) | |
@@ -55,7 +57,7 @@ do { \ | |
#else | |
-#define _BUG_FLAGS(ins, flags) asm volatile(ins) | |
+#define _BUG_FLAGS(ins, flags, extra) asm volatile(ins) | |
#endif /* CONFIG_GENERIC_BUG */ | |
@@ -63,7 +65,7 @@ do { \ | |
#define BUG() \ | |
do { \ | |
instrumentation_begin(); \ | |
- _BUG_FLAGS(ASM_UD2, 0); \ | |
+ _BUG_FLAGS(ASM_UD2, 0, ""); \ | |
unreachable(); \ | |
} while (0) | |
@@ -75,9 +77,9 @@ do { \ | |
*/ | |
#define __WARN_FLAGS(flags) \ | |
do { \ | |
+ __auto_type f = BUGFLAG_WARNING|(flags); \ | |
instrumentation_begin(); \ | |
- _BUG_FLAGS(ASM_UD2, BUGFLAG_WARNING|(flags)); \ | |
- annotate_reachable(); \ | |
+ _BUG_FLAGS(ASM_UD2, f, ASM_REACHABLE); \ | |
instrumentation_end(); \ | |
} while (0) | |
diff --git a/include/linux/compiler.h b/include/linux/compiler.h | |
index 429dcebe2b99..161222b7f083 100644 | |
--- a/include/linux/compiler.h | |
+++ b/include/linux/compiler.h | |
@@ -133,6 +133,12 @@ void ftrace_likely_update(struct ftrace_likely_data *f, int val, | |
}) | |
#define annotate_unreachable() __annotate_unreachable(__COUNTER__) | |
+#define ASM_REACHABLE \ | |
+ "998:\n\t" \ | |
+ ".pushsection .discard.reachable\n\t" \ | |
+ ".long 998b - .\n\t" \ | |
+ ".popsection\n\t" | |
+ | |
#define ASM_UNREACHABLE \ | |
"999:\n\t" \ | |
".pushsection .discard.unreachable\n\t" \ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment