Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1763926AbXK2SKy (ORCPT ); Thu, 29 Nov 2007 13:10:54 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1761861AbXK2SKi (ORCPT ); Thu, 29 Nov 2007 13:10:38 -0500 Received: from smtp2.linux-foundation.org ([207.189.120.14]:38044 "EHLO smtp2.linux-foundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1763627AbXK2SKh (ORCPT ); Thu, 29 Nov 2007 13:10:37 -0500 Date: Thu, 29 Nov 2007 10:09:00 -0800 (PST) From: Linus Torvalds To: Chuck Ebbert cc: Roland McGrath , Andrew Morton , linux-kernel@vger.kernel.org, Thomas Gleixner , Ingo Molnar , "H. Peter Anvin" Subject: Re: [PATCH x86/mm 6/6] x86-64 ia32 ptrace get/putreg32 current task In-Reply-To: <474EF824.3020806@redhat.com> Message-ID: References: <20071129003849.428E026F8E7@magilla.localdomain> <20071129004222.E49AD26F8E7@magilla.localdomain> <474EF824.3020806@redhat.com> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1574 Lines: 50 Chuck seems to have caught a bug, although the wrong one: On Thu, 29 Nov 2007, Chuck Ebbert wrote: > > On 11/28/2007 07:42 PM, Roland McGrath wrote: > > --- a/arch/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 return to user space from the stack. For similar reasons, this is wrong: > > @@ -129,15 +137,23 @@ static int getreg32(struct task_struct *child, unsigned regno, u32 *val) > > switch (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->thread.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 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/