Messages in this thread | | | Date | Sun, 29 Aug 2010 21:41:06 +0300 | Subject | Re: [PATCH 06/11] x86-64: Fix %cs value in convert_from_fxsr() | From | Pekka Enberg <> |
| |
On Sat, Aug 28, 2010 at 7:04 PM, Brian Gerst <brgerst@gmail.com> wrote: > While %ds still contains the userspace selector, %cs is KERNEL_CS > at this point. Always get %cs from pt_regs. > > It actually is possible to get the correct segments for compat tasks, > but that involves using the [f]xsave instruction without a REX.W prefix. > > Signed-off-by: Brian Gerst <brgerst@gmail.com>
It might be just me but the above description doesn't explain anything. What's the problem here? What is this fixing?
> --- > arch/x86/kernel/i387.c | 18 ++++++++---------- > 1 files changed, 8 insertions(+), 10 deletions(-) > > diff --git a/arch/x86/kernel/i387.c b/arch/x86/kernel/i387.c > index c795675..b1a732d 100644 > --- a/arch/x86/kernel/i387.c > +++ b/arch/x86/kernel/i387.c > @@ -383,19 +383,17 @@ convert_from_fxsr(struct user_i387_ia32_struct *env, struct task_struct *tsk) > #ifdef CONFIG_X86_64 > env->fip = fxsave->rip; > env->foo = fxsave->rdp; > + /* > + * should be actually ds/cs at fpu exception time, but > + * that information is not available in 64bit mode. > + */ > + env->fcs = task_pt_regs(tsk)->cs; > if (tsk == current) { > - /* > - * should be actually ds/cs at fpu exception time, but > - * that information is not available in 64bit mode. > - */ > - asm("mov %%ds, %[fos]" : [fos] "=r" (env->fos)); > - asm("mov %%cs, %[fcs]" : [fcs] "=r" (env->fcs)); > + savesegment(ds, env->fos); > } else { > - struct pt_regs *regs = task_pt_regs(tsk); > - > - env->fos = 0xffff0000 | tsk->thread.ds; > - env->fcs = regs->cs; > + env->fos = tsk->thread.ds; > } > + env->fos |= 0xffff0000; > #else > env->fip = fxsave->fip; > env->fcs = (u16) fxsave->fcs | ((u32) fxsave->fop << 16); > -- > 1.7.2.2 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |