From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9040 invoked by alias); 2 May 2012 17:57:49 -0000 Received: (qmail 9030 invoked by uid 22791); 2 May 2012 17:57:48 -0000 X-SWARE-Spam-Status: No, hits=-3.5 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,RCVD_IN_HOSTKARMA_NO,RCVD_IN_HOSTKARMA_W,RCVD_IN_HOSTKARMA_WL,TW_EG X-Spam-Check-By: sourceware.org Received: from rock.gnat.com (HELO rock.gnat.com) (205.232.38.15) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 02 May 2012 17:57:35 +0000 Received: from localhost (localhost.localdomain [127.0.0.1]) by filtered-rock.gnat.com (Postfix) with ESMTP id 9B6E51C6AAF; Wed, 2 May 2012 13:57:34 -0400 (EDT) Received: from rock.gnat.com ([127.0.0.1]) by localhost (rock.gnat.com [127.0.0.1]) (amavisd-new, port 10024) with LMTP id ObP6xKKB8eUy; Wed, 2 May 2012 13:57:34 -0400 (EDT) Received: from joel.gnat.com (localhost.localdomain [127.0.0.1]) by rock.gnat.com (Postfix) with ESMTP id 614FF1C6AAD; Wed, 2 May 2012 13:57:34 -0400 (EDT) Received: by joel.gnat.com (Postfix, from userid 1000) id A7B12145616; Wed, 2 May 2012 10:57:24 -0700 (PDT) Date: Wed, 02 May 2012 17:57:00 -0000 From: Joel Brobecker To: Mark Kettenis Cc: gdb-patches@sourceware.org Subject: Re: Invalid segment resister value on x86_64-windows Message-ID: <20120502175724.GW10958@adacore.com> References: <1335913461-1628-1-git-send-email-brobecker@adacore.com> <201205021009.q42A9G4s021744@glazunov.sibelius.xs4all.nl> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="Pd0ReVV5GZGQvF3a" Content-Disposition: inline In-Reply-To: <201205021009.q42A9G4s021744@glazunov.sibelius.xs4all.nl> User-Agent: Mutt/1.5.20 (2009-06-14) Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2012-05/txt/msg00026.txt.bz2 --Pd0ReVV5GZGQvF3a Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-length: 1339 > I'm not sure we can make those changes. The default layout for the > registers in the target description is chosen such that it is > compatible with the "old" register cache layout used for stubs that > didn't provide a target description. That layout is still extensively > used by kernel stubs such as the ones in the Linux and NetBSD kernels. > I don't think breaking those would be acceptable, as kernel debugging > is where the segment registers actually matter! That's something I was concerned about. Here is another approach, which adds special handling for those registers for Windows. The issue was that the same code was used for both 32bit and 64bit Windows, so I needed to extend the tdep structure to be able to determine whether register N was a segment register or not. Does the attached patch look good to you? gdb/ChangeLog: * i386-tdep.h (struct gdbarch_tdep): New field `first_segment_regnum'. * amd64-tdep.c (amd64_init_abi): Set tdep->first_segment_regnum. * i386-tdep.c (i386_gdbarch_init): Likewise. * windows-nat.c (do_windows_fetch_inferior_registers): Only read the first 16 bits of segment register values. Tested on x86-windows and x86_64-windows using AdaCore's testsuite. Tested on x86_64-linux with the official testsuite (JIC). Thank you, -- Joel --Pd0ReVV5GZGQvF3a Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="segment-registers-windows.diff" Content-length: 2931 commit 657e5f87523009cab319c427829543b0231923af Author: Joel Brobecker Date: Wed May 2 09:00:11 2012 -0700 Segment register reading on Windows targets. gdb/ChangeLog: * i386-tdep.h (struct gdbarch_tdep): New field `first_segment_regnum'. * amd64-tdep.c (amd64_init_abi): Set tdep->first_segment_regnum. * i386-tdep.c (i386_gdbarch_init): Likewise. * windows-nat.c (do_windows_fetch_inferior_registers): Only read the first 16 bits of segment register values. diff --git a/gdb/amd64-tdep.c b/gdb/amd64-tdep.c index 685fa48..27988bf 100644 --- a/gdb/amd64-tdep.c +++ b/gdb/amd64-tdep.c @@ -2585,6 +2585,8 @@ amd64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); const struct target_desc *tdesc = info.target_desc; + tdep->first_segment_regnum = AMD64_CS_REGNUM; + /* AMD64 generally uses `fxsave' instead of `fsave' for saving its floating-point registers. */ tdep->sizeof_fpregset = I387_SIZEOF_FXSAVE; diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c index 769ef42..e6457f6 100644 --- a/gdb/i386-tdep.c +++ b/gdb/i386-tdep.c @@ -7613,6 +7613,8 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) tdep->gregset_num_regs = I386_NUM_GREGS; tdep->sizeof_gregset = 0; + tdep->first_segment_regnum = I386_CS_REGNUM; + /* Floating-point registers. */ tdep->fpregset = NULL; tdep->sizeof_fpregset = I387_SIZEOF_FSAVE; diff --git a/gdb/i386-tdep.h b/gdb/i386-tdep.h index f297ae7..e2acbbc 100644 --- a/gdb/i386-tdep.h +++ b/gdb/i386-tdep.h @@ -75,6 +75,10 @@ struct gdbarch_tdep int gregset_num_regs; size_t sizeof_gregset; + /* Register number for the first segment register. Its value + depends on whether we're debugging on an x86 or amd64 target. */ + int first_segment_regnum; + /* The general-purpose registers used to pass integers when making function calls. This only applies to amd64, as all parameters are passed through the stack on x86. */ diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c index f536ed1..a265462 100644 --- a/gdb/windows-nat.c +++ b/gdb/windows-nat.c @@ -456,6 +456,15 @@ do_windows_fetch_inferior_registers (struct regcache *regcache, int r) l = (*((long *) context_offset) >> 16) & ((1 << 11) - 1); regcache_raw_supply (regcache, r, (char *) &l); } + else if (r >= tdep->first_segment_regnum + && r < tdep->first_segment_regnum + 6) + { + /* GDB treats segment registers as 32bit registers, but they are + in fact only 16 bits long. Make sure we do not read extra + bits from our source buffer. */ + l = *((long *) context_offset) & 0xffff; + regcache_raw_supply (regcache, r, (char *) &l); + } else if (r >= 0) regcache_raw_supply (regcache, r, context_offset); else --Pd0ReVV5GZGQvF3a--