lkml.org 
[lkml]   [2008]   [Nov]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[RFC -tip] x86: introduce ENTRY(KPROBE)_X86 assembly helpers to catch unbalanced declaration
    It's usefull to catch unbalanced, missed or mixed declarations of ENTRY and
    KPROBES. These macros would help a bit (at least I hope so).

    For example the following code would compile without problems

    ENTRY_X86(mcount)
    retq
    END_X86(mcount)

    But if you forget and mix 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>
    ---
    arch/x86/include/asm/linkage.h | 60 +++++++++++++++++++++++++++++++++++++++++
    1 file changed, 60 insertions(+)

    Index: linux-2.6.git/arch/x86/include/asm/linkage.h
    ===================================================================
    --- linux-2.6.git.orig/arch/x86/include/asm/linkage.h
    +++ linux-2.6.git/arch/x86/include/asm/linkage.h
    @@ -57,5 +57,65 @@
    #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; \
    + __x86_macro_err; \
    + .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 */


    \
     
     \ /
      Last update: 2008-11-23 17:59    [W:0.022 / U:0.252 seconds]
    ©2003-2017 Jasper Spaans. hosted at Digital OceanAdvertise on this site