lkml.org 
[lkml]   [2010]   [Aug]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    SubjectRe: [PATCH 06/11] x86-64: Fix %cs value in convert_from_fxsr()
    From
    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/

    \
     
     \ /
      Last update: 2010-08-29 20:49    [W:2.493 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site