lkml.org 
[lkml]   [2020]   [Feb]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH v4 18/27] x86/int3: Ensure that poke_int3_handler() is not traced
    From: Thomas Gleixner <tglx@linutronix.de>

    In order to ensure poke_int3_handler() is completely self contained --
    we call this while we're modifying other text, imagine the fun of
    hitting another INT3 -- ensure that everything it uses is not traced.

    The primary means here is to force inlining; bsearch() is notrace
    because all of lib/ is.

    Not-Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    ---
    arch/x86/include/asm/ptrace.h | 2 +-
    arch/x86/include/asm/text-patching.h | 11 +++++++----
    arch/x86/kernel/alternative.c | 11 +++++++----
    3 files changed, 15 insertions(+), 9 deletions(-)

    Index: linux-2.6/arch/x86/include/asm/ptrace.h
    ===================================================================
    --- linux-2.6.orig/arch/x86/include/asm/ptrace.h
    +++ linux-2.6/arch/x86/include/asm/ptrace.h
    @@ -123,7 +123,7 @@ static inline void regs_set_return_value
    * On x86_64, vm86 mode is mercifully nonexistent, and we don't need
    * the extra check.
    */
    -static inline int user_mode(struct pt_regs *regs)
    +static __always_inline int user_mode(struct pt_regs *regs)
    {
    #ifdef CONFIG_X86_32
    return ((regs->cs & SEGMENT_RPL_MASK) | (regs->flags & X86_VM_MASK)) >= USER_RPL;
    Index: linux-2.6/arch/x86/include/asm/text-patching.h
    ===================================================================
    --- linux-2.6.orig/arch/x86/include/asm/text-patching.h
    +++ linux-2.6/arch/x86/include/asm/text-patching.h
    @@ -64,7 +64,7 @@ extern void text_poke_finish(void);

    #define DISP32_SIZE 4

    -static inline int text_opcode_size(u8 opcode)
    +static __always_inline int text_opcode_size(u8 opcode)
    {
    int size = 0;

    @@ -118,12 +118,14 @@ extern __ro_after_init struct mm_struct
    extern __ro_after_init unsigned long poking_addr;

    #ifndef CONFIG_UML_X86
    -static inline void int3_emulate_jmp(struct pt_regs *regs, unsigned long ip)
    +static __always_inline
    +void int3_emulate_jmp(struct pt_regs *regs, unsigned long ip)
    {
    regs->ip = ip;
    }

    -static inline void int3_emulate_push(struct pt_regs *regs, unsigned long val)
    +static __always_inline
    +void int3_emulate_push(struct pt_regs *regs, unsigned long val)
    {
    /*
    * The int3 handler in entry_64.S adds a gap between the
    @@ -138,7 +140,8 @@ static inline void int3_emulate_push(str
    *(unsigned long *)regs->sp = val;
    }

    -static inline void int3_emulate_call(struct pt_regs *regs, unsigned long func)
    +static __always_inline
    +void int3_emulate_call(struct pt_regs *regs, unsigned long func)
    {
    int3_emulate_push(regs, regs->ip - INT3_INSN_SIZE + CALL_INSN_SIZE);
    int3_emulate_jmp(regs, func);
    Index: linux-2.6/arch/x86/kernel/alternative.c
    ===================================================================
    --- linux-2.6.orig/arch/x86/kernel/alternative.c
    +++ linux-2.6/arch/x86/kernel/alternative.c
    @@ -956,7 +956,8 @@ struct bp_patching_desc {

    static struct bp_patching_desc *bp_desc;

    -static inline struct bp_patching_desc *try_get_desc(struct bp_patching_desc **descp)
    +static __always_inline
    +struct bp_patching_desc *try_get_desc(struct bp_patching_desc **descp)
    {
    struct bp_patching_desc *desc = READ_ONCE(*descp); /* rcu_dereference */

    @@ -966,13 +967,13 @@ static inline struct bp_patching_desc *t
    return desc;
    }

    -static inline void put_desc(struct bp_patching_desc *desc)
    +static __always_inline void put_desc(struct bp_patching_desc *desc)
    {
    smp_mb__before_atomic();
    atomic_dec(&desc->refs);
    }

    -static inline void *text_poke_addr(struct text_poke_loc *tp)
    +static __always_inline void *text_poke_addr(struct text_poke_loc *tp)
    {
    return _stext + tp->rel_addr;
    }

    \
     
     \ /
      Last update: 2020-02-21 14:51    [W:4.028 / U:0.168 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site