This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [PATCH 2/2] amd64-linux: expose system register FS_BASE and GS_BASE for Linux.
On 11/03/2016 09:47 AM, Walfred Tedeschi wrote:
> This patch allows examination of the registers FS_BASE and GS_BASE
> for Linux Systems running on 64bit. Tests for simple read and write
> of the new registers is also added with this patch.
>
> Tests were performed on:
> x86_64 RHEL 5.3 - For the older ptrace calls.
> x86_64 Ubuntu 16.10 - For the new ptrace calls.
>
> 2016-04-26 Walfred Tedeschi <walfred.tedeschi@intel.com>
> Richard Henderson <rth@redhat.com>
What changed compared to Richard's original version?
>
> diff --git a/gdb/amd64-linux-tdep.c b/gdb/amd64-linux-tdep.c
> index 3f2a92b..a8a0b79 100644
> --- a/gdb/amd64-linux-tdep.c
> +++ b/gdb/amd64-linux-tdep.c
> @@ -103,7 +103,14 @@ int amd64_linux_gregset_reg_offset[] =
> -1, -1, -1, -1, -1, -1, -1, -1,
> -1, -1, -1, -1, -1, -1, -1, -1,
> -1, -1, -1, -1, -1, -1, -1, -1,
> + /* System register added at the end. */
> +#ifdef HAVE_STRUCT_USER_REGS_STRUCT_FS_BASE
> + 21 * 8, 22 * 8, /* fs_base and gs_base. */
> +#else
> + -1, -1, /* fs_base and gs_base. */
> +#endif
> 15 * 8 /* "orig_rax" */
> +
Spurious new line?
How's this meant to work for cross debugging, and core debugging?
I don't think it makes sense to put a host-specific
"#ifdef HAVE_STRUCT_USER_REGS_STRUCT_FS_BASE" check in a tdep file.
> diff --git a/gdb/features/Makefile b/gdb/features/Makefile
> index 30eed5d..c87f29f 100644
> --- a/gdb/features/Makefile
> +++ b/gdb/features/Makefile
> @@ -259,7 +259,7 @@ $(outdir)/i386/i386-linux.dat: i386/32bit-core.xml i386/32bit-sse.xml \
> i386/32bit-linux.xml
> $(outdir)/i386/amd64.dat: i386/64bit-core.xml i386/64bit-sse.xml
> $(outdir)/i386/amd64-linux.dat: i386/64bit-core.xml i386/64bit-sse.xml \
> - i386/64bit-linux.xml
> + i386/64bit-linux.xml i386/64bit-segments.xml
> $(outdir)/i386/i386-avx.dat: i386/32bit-core.xml i386/32bit-avx.xml
> $(outdir)/i386/i386-avx-linux.dat: i386/32bit-core.xml i386/32bit-avx.xml \
> i386/32bit-linux.xml
> @@ -279,11 +279,11 @@ $(outdir)/i386/i386-mmx.dat: i386/32bit-core.xml
> $(outdir)/i386/i386-mmx-linux.dat: i386/32bit-core.xml i386/32bit-linux.xml
> $(outdir)/i386/amd64-avx.dat: i386/64bit-core.xml i386/64bit-avx.xml
> $(outdir)/i386/amd64-avx-linux.dat: i386/64bit-core.xml i386/64bit-avx.xml \
> - i386/64bit-linux.xml
> + i386/64bit-linux.xml i386/64bit-segments.xml
Is indentation on these two changes above correct? Can't tell from
the mail client.
> +++ b/gdb/features/i386/64bit-segments.xml
> @@ -0,0 +1,12 @@
> +<?xml version="1.0"?>
> +<!-- Copyright (C) 2016 Free Software Foundation, Inc.
> +
> + Copying and distribution of this file, with or without modification,
> + are permitted in any medium without royalty provided the copyright
> + notice and this notice are preserved. -->
> +
> +<!DOCTYPE feature SYSTEM "gdb-target.dtd">
> +<feature name="org.gnu.gdb.i386.segments">
> + <reg name="fs_base" bitsize="64" type="int" regnum="58"/>
> + <reg name="gs_base" bitsize="64" type="int" regnum="59"/>
#1 - Why is "regnum" hard coded?
#2 - Is bitsize 64 and type "int" really correct?
> --- a/gdb/gdbserver/linux-x86-low.c
> +++ b/gdb/gdbserver/linux-x86-low.c
> @@ -133,6 +133,11 @@ static const int x86_64_regmap[] =
> -1,
> -1, -1, -1, -1, -1, -1, -1, -1,
> ORIG_RAX * 8,
> +#ifdef HAVE_STRUCT_USER_REGS_STRUCT_FS_BASE
> + 21 * 8, 22 * 8,
> +#else
> + -1, -1,
> +#endif
> -1, -1, -1, -1, /* MPX registers BND0 ... BND3. */
It's curious that above this was put after orig_rax, while
here:
--- a/gdb/amd64-linux-tdep.c
+++ b/gdb/amd64-linux-tdep.c
@@ -103,7 +103,14 @@ int amd64_linux_gregset_reg_offset[] =
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
+ /* System register added at the end. */
+#ifdef HAVE_STRUCT_USER_REGS_STRUCT_FS_BASE
+ 21 * 8, 22 * 8, /* fs_base and gs_base. */
+#else
+ -1, -1, /* fs_base and gs_base. */
+#endif
15 * 8 /* "orig_rax" */
+
It was put before.
> +++ b/gdb/testsuite/gdb.arch/amd64-gs_base.c
> @@ -0,0 +1,33 @@
> +/* Unwinder test program for fs_base and gs_base.
What aspect of the unwinder is being tested?
> +
> +int
> +func (int a)
> +{
> + return a * a;
> +}
> +
> +int
> +main (void)
> +{
> + volatile int a;
> + a = 10;
> + a = func (a);
Is any of this relevant for the test?
> + return a;
> +}
> diff --git a/gdb/testsuite/gdb.arch/amd64-gs_base.exp b/gdb/testsuite/gdb.arch/amd64-gs_base.exp
> new file mode 100644
> index 0000000..ccd6b87
> --- /dev/null
> +++ b/gdb/testsuite/gdb.arch/amd64-gs_base.exp
> @@ -0,0 +1,57 @@
> +# Copyright 2016 Free Software Foundation, Inc.
> +
> +# This file is part of the GDB testsuite.
> +
> +# This program is free software; you can redistribute it and/or modify
> +# it under the terms of the GNU General Public License as published by
> +# the Free Software Foundation; either version 3 of the License, or
> +# (at your option) any later version.
> +#
> +# This program is distributed in the hope that it will be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> +# GNU General Public License for more details.
> +#
> +# You should have received a copy of the GNU General Public License
> +# along with this program. If not, see <http://www.gnu.org/licenses/>.
> +
> +if { ![istarget "x86_64-*linux*"] } then {
> + verbose "Skipping x86_64 fs_base and gs_base tests."
> + return
> +}
> +
> +standard_testfile
> +
> +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" \
> + executable { debug }] != "" } {
> + untested ${testfile}.exp
> + return -1
> +}
> +
> +
> +
> +gdb_exit
> +gdb_start
> +gdb_reinitialize_dir $srcdir/$subdir
> +gdb_load ${binfile}
> +
> +runto func
> +
Use prepare_for_testing and handle runto failure.
> +gdb_test "info register sys" $info_reg_out\
> + "info registers fs_base and gs_base with value "
Spurious space after "value".
Thanks,
Pedro Alves