lkml.org 
[lkml]   [2015]   [Sep]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.19.y-ckt 004/102] x86/ldt: Correct FPU emulation access to LDT
    Date
    3.19.8-ckt7 -stable review patch.  If anyone has any objections, please let me know.

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

    From: Juergen Gross <jgross@suse.com>

    commit 4809146b86c3d41ce588fdb767d021e2a80600dd upstream.

    Commit 37868fe113ff ("x86/ldt: Make modify_ldt synchronous")
    introduced a new struct ldt_struct anchored at mm->context.ldt.

    Adapt the x86 fpu emulation code to use that new structure.

    Signed-off-by: Juergen Gross <jgross@suse.com>
    Reviewed-by: Andy Lutomirski <luto@kernel.org>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: billm@melbpc.org.au
    Link: http://lkml.kernel.org/r/1438883674-1240-1-git-send-email-jgross@suse.com
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    Signed-off-by: Kamal Mostafa <kamal@canonical.com>
    ---
    arch/x86/math-emu/fpu_entry.c | 3 +--
    arch/x86/math-emu/fpu_system.h | 21 ++++++++++++++++++---
    arch/x86/math-emu/get_address.c | 3 +--
    3 files changed, 20 insertions(+), 7 deletions(-)

    diff --git a/arch/x86/math-emu/fpu_entry.c b/arch/x86/math-emu/fpu_entry.c
    index 9b86812..274a52b 100644
    --- a/arch/x86/math-emu/fpu_entry.c
    +++ b/arch/x86/math-emu/fpu_entry.c
    @@ -29,7 +29,6 @@

    #include <asm/uaccess.h>
    #include <asm/traps.h>
    -#include <asm/desc.h>
    #include <asm/user.h>
    #include <asm/i387.h>

    @@ -185,7 +184,7 @@ void math_emulate(struct math_emu_info *info)
    math_abort(FPU_info, SIGILL);
    }

    - code_descriptor = LDT_DESCRIPTOR(FPU_CS);
    + code_descriptor = FPU_get_ldt_descriptor(FPU_CS);
    if (SEG_D_SIZE(code_descriptor)) {
    /* The above test may be wrong, the book is not clear */
    /* Segmented 32 bit protected mode */
    diff --git a/arch/x86/math-emu/fpu_system.h b/arch/x86/math-emu/fpu_system.h
    index 2c61441..d342fce 100644
    --- a/arch/x86/math-emu/fpu_system.h
    +++ b/arch/x86/math-emu/fpu_system.h
    @@ -16,9 +16,24 @@
    #include <linux/kernel.h>
    #include <linux/mm.h>

    -/* s is always from a cpu register, and the cpu does bounds checking
    - * during register load --> no further bounds checks needed */
    -#define LDT_DESCRIPTOR(s) (((struct desc_struct *)current->mm->context.ldt)[(s) >> 3])
    +#include <asm/desc.h>
    +#include <asm/mmu_context.h>
    +
    +static inline struct desc_struct FPU_get_ldt_descriptor(unsigned seg)
    +{
    + static struct desc_struct zero_desc;
    + struct desc_struct ret = zero_desc;
    +
    +#ifdef CONFIG_MODIFY_LDT_SYSCALL
    + seg >>= 3;
    + mutex_lock(&current->mm->context.lock);
    + if (current->mm->context.ldt && seg < current->mm->context.ldt->size)
    + ret = current->mm->context.ldt->entries[seg];
    + mutex_unlock(&current->mm->context.lock);
    +#endif
    + return ret;
    +}
    +
    #define SEG_D_SIZE(x) ((x).b & (3 << 21))
    #define SEG_G_BIT(x) ((x).b & (1 << 23))
    #define SEG_GRANULARITY(x) (((x).b & (1 << 23)) ? 4096 : 1)
    diff --git a/arch/x86/math-emu/get_address.c b/arch/x86/math-emu/get_address.c
    index 6ef5e99..d13cab2 100644
    --- a/arch/x86/math-emu/get_address.c
    +++ b/arch/x86/math-emu/get_address.c
    @@ -20,7 +20,6 @@
    #include <linux/stddef.h>

    #include <asm/uaccess.h>
    -#include <asm/desc.h>

    #include "fpu_system.h"
    #include "exception.h"
    @@ -158,7 +157,7 @@ static long pm_address(u_char FPU_modrm, u_char segment,
    addr->selector = PM_REG_(segment);
    }

    - descriptor = LDT_DESCRIPTOR(PM_REG_(segment));
    + descriptor = FPU_get_ldt_descriptor(segment);
    base_address = SEG_BASE_ADDR(descriptor);
    address = base_address + offset;
    limit = base_address
    --
    1.9.1


    \
     
     \ /
      Last update: 2015-09-22 20:41    [W:4.155 / U:0.068 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site