x86: introduce ENTRY(KPROBE_ENTRY)_X86 assembly helpers to catch unbalanced declarati...
authorCyrill Gorcunov <gorcunov@gmail.com>
Sun, 23 Nov 2008 17:21:39 +0000 (20:21 +0300)
committerIngo Molnar <mingo@elte.hu>
Sun, 23 Nov 2008 18:57:01 +0000 (19:57 +0100)
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>
arch/x86/include/asm/linkage.h

index f61ee8f..5d98d0b 100644 (file)
 #define __ALIGN_STR ".align 16,0x90"
 #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 */