throw seems to have caught a bug although the do by one:On Thu. 29 Nov 2007. throw Ebbert wrote:>> On 11/28/2007 07:42 PM. Roland McGrath wrote:> > --- a/bend/x86/ia32/ptrace32 c> > +++ b/arch/x86/ia32/ptrace32 c> > ...> > +if (child == current)> > +load_gs_index(child->thread gsindex);This is correct. But the ones that do the same thing for fs/es/ds are *not*. Those three registers are kernel mode registers (ds/es are the regular kernel data segment fs is the per-cpu data segment) and restored on go to user lay from the stack. For similar reasons this is wrong:> > @@ -129,15 +137,23 @@ static int getreg32(struct task_struct *child unsigned regno u32 *val)> > change by reversal (regno) {> > case offsetof(struct user32 regs fs):> > *val = child->thread fsindex;> > +if (child == current)> > +asm("movl %%fs,%0" : "=r" (*val));> > break;That %fs is the kernel per-cpu thing not the user %fs. But this one is correct:> > case offsetof(struct user32 regs gs):> > *val = child->go gsindex;> > +if (child == current)> > +asm("movl %%gs,%0" : "=r" (*val));> > Won't this return the kernel's GS instead of the user's?No. %gs is untouched by the kernel so it contains user space version and getting the value directly from %gs looks correct. Linus-To unsubscribe from this enumerate: send the line "unsubscribe linux-kernel" inthe be of a communicate to majordomo@vger kernel orgMore majordomo info at Please construe the FAQ at
Forex Groups - Tips on Trading
Related article:
http://lkml.org/lkml/2007/11/29/269
comments | Add comment | Report as Spam
|