x86: introduce ENTRY(KPROBE_ENTRY)_X86 assembly helpers to catch unbalanced declaration v3
Impact: make ENTRY()/END() macros more capable It's usefull to catch unbalanced or messed or mixed declarations of ENTRY and KPROBES. These macros would help a bit. For example the following code would compile without problems ENTRY_X86(mcount) retq END_X86(mcount) But if you forget and mess the following form ENTRY_X86(mcount) retq END(mcount) ENTRY_X86(ftrace_caller) The assembler will issue the following message: Error: ENTRY_X86/KPROBE_X86 unbalanced,missed,mixed Actually the checking is performed at every _X86 macro so maybe it's good idea to put ENTRY_KPROBE_FINAL_X86 at the end of .S file to be sure you didn't miss anything. Signed-off-by: Cyrill Gorcunov <gorcunov@gmail.com> Cc: Alexander van Heukelum <heukelum@mailshack.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
6efdcfaf16
commit
3b6c52b5b6
1 changed files with 60 additions and 0 deletions
|
@ -57,5 +57,65 @@
|
||||||
#define __ALIGN_STR ".align 16,0x90"
|
#define __ALIGN_STR ".align 16,0x90"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* to check ENTRY_X86/END_X86 and
|
||||||
|
* KPROBE_ENTRY_X86/KPROBE_END_X86
|
||||||
|
* unbalanced-missed-mixed appearance
|
||||||
|
*/
|
||||||
|
#define __set_entry_x86 .set ENTRY_X86_IN, 0
|
||||||
|
#define __unset_entry_x86 .set ENTRY_X86_IN, 1
|
||||||
|
#define __set_kprobe_x86 .set KPROBE_X86_IN, 0
|
||||||
|
#define __unset_kprobe_x86 .set KPROBE_X86_IN, 1
|
||||||
|
|
||||||
|
#define __macro_err_x86 .error "ENTRY_X86/KPROBE_X86 unbalanced,missed,mixed"
|
||||||
|
|
||||||
|
#define __check_entry_x86 \
|
||||||
|
.ifdef ENTRY_X86_IN; \
|
||||||
|
.ifeq ENTRY_X86_IN; \
|
||||||
|
__macro_err_x86; \
|
||||||
|
.abort; \
|
||||||
|
.endif; \
|
||||||
|
.endif
|
||||||
|
|
||||||
|
#define __check_kprobe_x86 \
|
||||||
|
.ifdef KPROBE_X86_IN; \
|
||||||
|
.ifeq KPROBE_X86_IN; \
|
||||||
|
__macro_err_x86; \
|
||||||
|
.abort; \
|
||||||
|
.endif; \
|
||||||
|
.endif
|
||||||
|
|
||||||
|
#define __check_entry_kprobe_x86 \
|
||||||
|
__check_entry_x86; \
|
||||||
|
__check_kprobe_x86
|
||||||
|
|
||||||
|
#define ENTRY_KPROBE_FINAL_X86 __check_entry_kprobe_x86
|
||||||
|
|
||||||
|
#define ENTRY_X86(name) \
|
||||||
|
__check_entry_kprobe_x86; \
|
||||||
|
__set_entry_x86; \
|
||||||
|
.globl name; \
|
||||||
|
__ALIGN; \
|
||||||
|
name:
|
||||||
|
|
||||||
|
#define END_X86(name) \
|
||||||
|
__unset_entry_x86; \
|
||||||
|
__check_entry_kprobe_x86; \
|
||||||
|
.size name, .-name
|
||||||
|
|
||||||
|
#define KPROBE_ENTRY_X86(name) \
|
||||||
|
__check_entry_kprobe_x86; \
|
||||||
|
__set_kprobe_x86; \
|
||||||
|
.pushsection .kprobes.text, "ax"; \
|
||||||
|
.globl name; \
|
||||||
|
__ALIGN; \
|
||||||
|
name:
|
||||||
|
|
||||||
|
#define KPROBE_END_X86(name) \
|
||||||
|
__unset_kprobe_x86; \
|
||||||
|
__check_entry_kprobe_x86; \
|
||||||
|
.size name, .-name; \
|
||||||
|
.popsection
|
||||||
|
|
||||||
#endif /* _ASM_X86_LINKAGE_H */
|
#endif /* _ASM_X86_LINKAGE_H */
|
||||||
|
|
||||||
|
|
Reference in a new issue