-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge tag 'core-headers-2020-08-03' of git://git.kernel.org/pub/scm/l…
…inux/kernel/git/tip/tip Pull header cleanup from Ingo Molnar: "Separate out the instrumentation_begin()/end() bits from compiler.h" * tag 'core-headers-2020-08-03' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: compiler.h: Move instrumentation_begin()/end() to new <linux/instrumentation.h> header
- Loading branch information
Showing
5 changed files
with
61 additions
and
53 deletions.
There are no files selected for viewing
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
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
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
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
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
/* SPDX-License-Identifier: GPL-2.0 */ | ||
#ifndef __LINUX_INSTRUMENTATION_H | ||
#define __LINUX_INSTRUMENTATION_H | ||
|
||
#if defined(CONFIG_DEBUG_ENTRY) && defined(CONFIG_STACK_VALIDATION) | ||
|
||
/* Begin/end of an instrumentation safe region */ | ||
#define instrumentation_begin() ({ \ | ||
asm volatile("%c0: nop\n\t" \ | ||
".pushsection .discard.instr_begin\n\t" \ | ||
".long %c0b - .\n\t" \ | ||
".popsection\n\t" : : "i" (__COUNTER__)); \ | ||
}) | ||
|
||
/* | ||
* Because instrumentation_{begin,end}() can nest, objtool validation considers | ||
* _begin() a +1 and _end() a -1 and computes a sum over the instructions. | ||
* When the value is greater than 0, we consider instrumentation allowed. | ||
* | ||
* There is a problem with code like: | ||
* | ||
* noinstr void foo() | ||
* { | ||
* instrumentation_begin(); | ||
* ... | ||
* if (cond) { | ||
* instrumentation_begin(); | ||
* ... | ||
* instrumentation_end(); | ||
* } | ||
* bar(); | ||
* instrumentation_end(); | ||
* } | ||
* | ||
* If instrumentation_end() would be an empty label, like all the other | ||
* annotations, the inner _end(), which is at the end of a conditional block, | ||
* would land on the instruction after the block. | ||
* | ||
* If we then consider the sum of the !cond path, we'll see that the call to | ||
* bar() is with a 0-value, even though, we meant it to happen with a positive | ||
* value. | ||
* | ||
* To avoid this, have _end() be a NOP instruction, this ensures it will be | ||
* part of the condition block and does not escape. | ||
*/ | ||
#define instrumentation_end() ({ \ | ||
asm volatile("%c0: nop\n\t" \ | ||
".pushsection .discard.instr_end\n\t" \ | ||
".long %c0b - .\n\t" \ | ||
".popsection\n\t" : : "i" (__COUNTER__)); \ | ||
}) | ||
#else | ||
# define instrumentation_begin() do { } while(0) | ||
# define instrumentation_end() do { } while(0) | ||
#endif | ||
|
||
#endif /* __LINUX_INSTRUMENTATION_H */ |