Patch "x86/ldt: Correct FPU emulation access to LDT" has been added to the 4.1-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
x86/ldt: Correct FPU emulation access to LDT
to the 4.1-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
x86-ldt-correct-fpu-emulation-access-to-ldt.patch
and it can be found in the queue-4.1 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
4809146b86c3d41ce588fdb767d021e2a80600ddMon Sep 17 00:00:00 2001
From: Juergen Gross <[email protected]>
Date: Thu, 6 Aug 2015 19:54:34 +0200
Subject: x86/ldt: Correct FPU emulation access to LDT
From: Juergen Gross <[email protected]>
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.
--- 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(-)
arch/x86/math-emu/fpu_entry.c +1 -2
@@ -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 *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 */
arch/x86/math-emu/fpu_system.h +18 -3
@@ -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 (¤t->mm->context.lock); +if (current->mm->context.ldt && seg < current->mm->context.ldt->size) + ret = current->mm->context.ldt->entries[seg]; +mutex_unlock (¤t->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)
arch/x86/math-emu/get_address.c +1 -2
@@ -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, 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
Patches currently in stable-queue which might be from [email protected] are
queue-4.1/x86-ldt-correct-ldt-access-in-single-stepping-logic.patch queue-4.1/x86-ldt-correct-fpu-emulation-access-to-ldt.patch queue-4.1/x86-ldt-further-fix-fpu-emulation.patch