lkml.org 
[lkml]   [2015]   [Dec]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.19.y-ckt 007/128] x86: Make is_64bit_mm() widely available
    Date
    3.19.8-ckt12 -stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Dave Hansen <dave.hansen@linux.intel.com>

    commit b0e9b09b3bd64e67bba862e238d3757b2482b6de upstream.

    The uprobes code has a nice helper, is_64bit_mm(), that consults
    both the runtime and compile-time flags for 32-bit support.
    Instead of reinventing the wheel, pull it in to an x86 header so
    we can use it for MPX.

    I prefer passing the 'mm' around to test_thread_flag(TIF_IA32)
    because it makes it explicit where the context is coming from.

    Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
    Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Dave Hansen <dave@sr71.net>
    Cc: H. Peter Anvin <hpa@zytor.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Oleg Nesterov <oleg@redhat.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Link: http://lkml.kernel.org/r/20150607183704.F0209999@viggo.jf.intel.com
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    [ kamal: 3.19-stable prereq for "46561c3 x86/mpx: Do proper get_user() when
    running 32-bit binaries on 64-bit kernels" ]
    Signed-off-by: Kamal Mostafa <kamal@canonical.com>
    ---
    arch/x86/include/asm/mmu_context.h | 13 +++++++++++++
    arch/x86/kernel/uprobes.c | 10 +---------
    2 files changed, 14 insertions(+), 9 deletions(-)

    diff --git a/arch/x86/include/asm/mmu_context.h b/arch/x86/include/asm/mmu_context.h
    index 1ab38a4..acdeb2be 100644
    --- a/arch/x86/include/asm/mmu_context.h
    +++ b/arch/x86/include/asm/mmu_context.h
    @@ -165,6 +165,19 @@ static inline void arch_exit_mmap(struct mm_struct *mm)
    paravirt_arch_exit_mmap(mm);
    }

    +#ifdef CONFIG_X86_64
    +static inline bool is_64bit_mm(struct mm_struct *mm)
    +{
    + return !config_enabled(CONFIG_IA32_EMULATION) ||
    + !(mm->context.ia32_compat == TIF_IA32);
    +}
    +#else
    +static inline bool is_64bit_mm(struct mm_struct *mm)
    +{
    + return false;
    +}
    +#endif
    +
    static inline void arch_bprm_mm_init(struct mm_struct *mm,
    struct vm_area_struct *vma)
    {
    diff --git a/arch/x86/kernel/uprobes.c b/arch/x86/kernel/uprobes.c
    index 8b96a94..6b1ca70 100644
    --- a/arch/x86/kernel/uprobes.c
    +++ b/arch/x86/kernel/uprobes.c
    @@ -29,6 +29,7 @@
    #include <linux/kdebug.h>
    #include <asm/processor.h>
    #include <asm/insn.h>
    +#include <asm/mmu_context.h>

    /* Post-execution fixups. */

    @@ -245,11 +246,6 @@ static int uprobe_init_insn(struct arch_uprobe *auprobe, struct insn *insn, bool
    }

    #ifdef CONFIG_X86_64
    -static inline bool is_64bit_mm(struct mm_struct *mm)
    -{
    - return !config_enabled(CONFIG_IA32_EMULATION) ||
    - !(mm->context.ia32_compat == TIF_IA32);
    -}
    /*
    * If arch_uprobe->insn doesn't use rip-relative addressing, return
    * immediately. Otherwise, rewrite the instruction so that it accesses
    @@ -430,10 +426,6 @@ static void riprel_post_xol(struct arch_uprobe *auprobe, struct pt_regs *regs)
    }
    }
    #else /* 32-bit: */
    -static inline bool is_64bit_mm(struct mm_struct *mm)
    -{
    - return false;
    -}
    /*
    * No RIP-relative addressing on 32-bit
    */
    --
    1.9.1


    \
     
     \ /
      Last update: 2015-12-16 19:21    [W:4.541 / U:0.116 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site