public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [PATCH 0/2] Support fs_base and gs_base for native FreeBSD/amd64
@ 2017-06-27 22:50 John Baldwin
  2017-06-27 22:51 ` [PATCH 2/2] Support the fs_base and gs_base registers on FreeBSD/amd64 native processes John Baldwin
                   ` (2 more replies)
  0 siblings, 3 replies; 18+ messages in thread
From: John Baldwin @ 2017-06-27 22:50 UTC (permalink / raw)
  To: gdb-patches

I did not add the fs_base and gs_base registers to the x32 descriptions
since I'm not aware of a platform supporting x32 other than Linux.

On the other hand, I wonder if we shouldn't just add fs_base and gs_base
to the "core" descriptions alongside "fs" and "gs" rather than using a
separate feature if they are always going to be present.

The manual dependencies for the various x86 regformat data files have
several inconsistencies (missing dependencies or in some cases wrong
dependencies), but I didn't do a fixup of those since Yao's patches
are going to replace all that anyway.

John Baldwin (2):
  Include the fs_base and gs_base registers in amd64 target
    descriptions.
  Support the fs_base and gs_base registers on FreeBSD/amd64 native
    processes.

 gdb/ChangeLog                                    |  32 ++++
 gdb/amd64-bsd-nat.c                              |  54 +++++++
 gdb/features/Makefile                            |  14 +-
 gdb/features/i386/amd64-avx-avx512.c             | 180 +++++++++++----------
 gdb/features/i386/amd64-avx-avx512.xml           |   1 +
 gdb/features/i386/amd64-avx-mpx-avx512-pku.c     | 194 ++++++++++++-----------
 gdb/features/i386/amd64-avx-mpx-avx512-pku.xml   |   1 +
 gdb/features/i386/amd64-avx-mpx.c                |  48 +++---
 gdb/features/i386/amd64-avx-mpx.xml              |   1 +
 gdb/features/i386/amd64-avx.c                    |  36 +++--
 gdb/features/i386/amd64-avx.xml                  |   1 +
 gdb/features/i386/amd64-mpx.c                    |  16 +-
 gdb/features/i386/amd64-mpx.xml                  |   1 +
 gdb/features/i386/amd64.c                        |   4 +
 gdb/features/i386/amd64.xml                      |   1 +
 gdb/regformats/i386/amd64-avx-avx512.dat         |   2 +
 gdb/regformats/i386/amd64-avx-mpx-avx512-pku.dat |   1 -
 gdb/regformats/i386/amd64-avx-mpx.dat            |   2 +
 gdb/regformats/i386/amd64-avx.dat                |   2 +
 gdb/regformats/i386/amd64-mpx.dat                |   2 +
 gdb/regformats/i386/amd64.dat                    |   2 +
 21 files changed, 361 insertions(+), 234 deletions(-)

-- 
2.11.0

^ permalink raw reply	[flat|nested] 18+ messages in thread

* [PATCH 1/2] Include the fs_base and gs_base registers in amd64 target descriptions.
  2017-06-27 22:50 [PATCH 0/2] Support fs_base and gs_base for native FreeBSD/amd64 John Baldwin
  2017-06-27 22:51 ` [PATCH 2/2] Support the fs_base and gs_base registers on FreeBSD/amd64 native processes John Baldwin
@ 2017-06-27 22:51 ` John Baldwin
  2017-07-11  8:03   ` Yao Qi
  2017-07-11  7:49 ` [PATCH 0/2] Support fs_base and gs_base for native FreeBSD/amd64 Yao Qi
  2 siblings, 1 reply; 18+ messages in thread
From: John Baldwin @ 2017-06-27 22:51 UTC (permalink / raw)
  To: gdb-patches

This permits these registers to be used with non-Linux targets.

gdb/ChangeLog:

	* features/Makefile (amd64.dat, amd64-avx.dat, amd64-mpx.dat)
	(amd64-avx-mpx.dat, amd64-avx-avx512.dat)
	(amd64-avx-mpx-avx512-pku.dat): Add i386/64bit-segments.xml in
	those rules.
	* features/i386/amd64-avx-avx512.xml: Add 64bit-segments.xml.
        * features/i386/amd64-avx-mpx-avx512-pku.xml: Add 64bit-segments.xml.
	* features/i386/amd64-avx-mpx.xml: Add 64bit-segments.xml.
	* features/i386/amd64-avx.xml: Add 64bit-segments.xml.
	* features/i386/amd64-mpx.xml: Add 64bit-segments.xml.
	* features/i386/amd64.xml: Add 64bit-segments.xml.
	* features/i386/amd64-avx-avx512.c: Regenerated.
	* features/i386/amd64-avx-mpx-avx512-pku.c: Regenerated.
	* features/i386/amd64-avx-mpx.c: Regenerated.
	* features/i386/amd64-avx.c: Regenerated.
	* features/i386/amd64-mpx.c: Regenerated.
	* features/i386/amd64.c: Regenerated.
	* regformats/i386/amd64-avx-avx512.dat: Regenerated.
	* regformats/i386/amd64-avx-mpx-avx512-pku.dat: Regenerated.
	* regformats/i386/amd64-avx-mpx.dat: Regenerated.
	* regformats/i386/amd64-avx.dat: Regenerated.
	* regformats/i386/amd64-mpx.dat: Regenerated.
	* regformats/i386/amd64.dat: Regenerated.
---
 gdb/ChangeLog                                    |  25 +++
 gdb/features/Makefile                            |  14 +-
 gdb/features/i386/amd64-avx-avx512.c             | 180 +++++++++++----------
 gdb/features/i386/amd64-avx-avx512.xml           |   1 +
 gdb/features/i386/amd64-avx-mpx-avx512-pku.c     | 194 ++++++++++++-----------
 gdb/features/i386/amd64-avx-mpx-avx512-pku.xml   |   1 +
 gdb/features/i386/amd64-avx-mpx.c                |  48 +++---
 gdb/features/i386/amd64-avx-mpx.xml              |   1 +
 gdb/features/i386/amd64-avx.c                    |  36 +++--
 gdb/features/i386/amd64-avx.xml                  |   1 +
 gdb/features/i386/amd64-mpx.c                    |  16 +-
 gdb/features/i386/amd64-mpx.xml                  |   1 +
 gdb/features/i386/amd64.c                        |   4 +
 gdb/features/i386/amd64.xml                      |   1 +
 gdb/regformats/i386/amd64-avx-avx512.dat         |   2 +
 gdb/regformats/i386/amd64-avx-mpx-avx512-pku.dat |   1 -
 gdb/regformats/i386/amd64-avx-mpx.dat            |   2 +
 gdb/regformats/i386/amd64-avx.dat                |   2 +
 gdb/regformats/i386/amd64-mpx.dat                |   2 +
 gdb/regformats/i386/amd64.dat                    |   2 +
 20 files changed, 300 insertions(+), 234 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 4e091d7e40..2196419fa3 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,28 @@
+2017-06-26  John Baldwin  <jhb@FreeBSD.org>
+
+	* features/Makefile (amd64.dat, amd64-avx.dat, amd64-mpx.dat)
+	(amd64-avx-mpx.dat, amd64-avx-avx512.dat)
+	(amd64-avx-mpx-avx512-pku.dat): Add i386/64bit-segments.xml in
+	those rules.
+	* features/i386/amd64-avx-avx512.xml: Add 64bit-segments.xml.
+        * features/i386/amd64-avx-mpx-avx512-pku.xml: Add 64bit-segments.xml.
+	* features/i386/amd64-avx-mpx.xml: Add 64bit-segments.xml.
+	* features/i386/amd64-avx.xml: Add 64bit-segments.xml.
+	* features/i386/amd64-mpx.xml: Add 64bit-segments.xml.
+	* features/i386/amd64.xml: Add 64bit-segments.xml.
+	* features/i386/amd64-avx-avx512.c: Regenerated.
+	* features/i386/amd64-avx-mpx-avx512-pku.c: Regenerated.
+	* features/i386/amd64-avx-mpx.c: Regenerated.
+	* features/i386/amd64-avx.c: Regenerated.
+	* features/i386/amd64-mpx.c: Regenerated.
+	* features/i386/amd64.c: Regenerated.
+	* regformats/i386/amd64-avx-avx512.dat: Regenerated.
+	* regformats/i386/amd64-avx-mpx-avx512-pku.dat: Regenerated.
+	* regformats/i386/amd64-avx-mpx.dat: Regenerated.
+	* regformats/i386/amd64-avx.dat: Regenerated.
+	* regformats/i386/amd64-mpx.dat: Regenerated.
+	* regformats/i386/amd64.dat: Regenerated.
+
 2017-06-19  John Baldwin  <jhb@FreeBSD.org>
 
 	* mips-tdep.c (print_gp_register_row): Don't error for unavailable
diff --git a/gdb/features/Makefile b/gdb/features/Makefile
index 3bc8b5ae85..199a315379 100644
--- a/gdb/features/Makefile
+++ b/gdb/features/Makefile
@@ -263,7 +263,8 @@ $(outdir)/arm/arm-with-iwmmxt.dat: arm/arm-core.xml arm/xscale-iwmmxt.xml
 $(outdir)/i386/i386.dat: i386/32bit-core.xml i386/32bit-sse.xml
 $(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.dat: i386/64bit-core.xml i386/64bit-sse.xml \
+			       i386/64bit-segments.xml
 $(outdir)/i386/amd64-linux.dat: i386/64bit-core.xml i386/64bit-sse.xml \
 			       i386/64bit-linux.xml i386/64bit-segments.xml
 $(outdir)/i386/i386-avx.dat: i386/32bit-core.xml i386/32bit-avx.xml
@@ -289,7 +290,8 @@ $(outdir)/i386/i386-avx-mpx-avx512-pku-linux.dat: i386/32bit-core.xml \
 			       i386/32bit-pkeys.xml i386/32bit-linux.xml
 $(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.dat: i386/64bit-core.xml i386/64bit-avx.xml \
+			       i386/64bit-segments.xml
 $(outdir)/i386/amd64-avx-linux.dat: i386/64bit-core.xml i386/64bit-avx.xml \
 			       i386/64bit-linux.xml i386/64bit-segments.xml
 $(outdir)/i386/amd64-mpx-linux.dat: i386/64bit-core.xml i386/64bit-avx.xml \
@@ -297,16 +299,16 @@ $(outdir)/i386/amd64-mpx-linux.dat: i386/64bit-core.xml i386/64bit-avx.xml \
 $(outdir)/i386/amd64-avx-mpx-linux.dat: i386/64bit-core.xml \
 			       i386/64bit-linux.xml i386/64bit-segments.xml i386/64bit-mpx.xml
 $(outdir)/i386/amd64-mpx.dat: i386/64bit-core.xml i386/64bit-avx.xml \
-			       i386/64bit-mpx.xml
+			       i386/64bit-segments.xml i386/64bit-mpx.xml
 $(outdir)/i386/amd64-avx-mpx.dat: i386/64bit-core.xml \
-			       i386/64bit-mpx.xml
+			       i386/64bit-segments.xml i386/64bit-mpx.xml
 $(outdir)/i386/amd64-avx-avx512.dat: i386/64bit-core.xml i386/64bit-avx.xml \
-			       i386/64bit-avx512.xml
+			       i386/64bit-avx512.xml i386/64bit-segments.xml
 $(outdir)/i386/amd64-avx-avx512-linux.dat: i386/64bit-core.xml i386/64bit-avx.xml \
 			       i386/64bit-avx512.xml i386/64bit-linux.xml
 $(outdir)/i386/amd64-avx-mpx-avx512-pku.dat: i386/64bit-core.xml \
 			       i386/64bit-avx.xml i386/64bit-mpx.xml i386/64bit-avx512.xml \
-			       i386/64bit-pkeys.xml
+			       i386/64bit-pkeys.xml i386/64bit-segments.xml 
 $(outdir)/i386/amd64-avx-mpx-avx512-pku-linux.dat: i386/64bit-core.xml \
 			       i386/64bit-avx.xml i386/64bit-mpx.xml i386/64bit-avx512.xml \
 			       i386/64bit-linux.xml i386/64bit-segments.xml \
diff --git a/gdb/features/i386/amd64-avx-avx512.c b/gdb/features/i386/amd64-avx-avx512.c
index 8a185c108d..f1ebde1071 100644
--- a/gdb/features/i386/amd64-avx-avx512.c
+++ b/gdb/features/i386/amd64-avx-avx512.c
@@ -146,23 +146,27 @@ initialize_tdesc_amd64_avx_avx512 (void)
   tdesc_create_reg (feature, "xmm15", 55, 1, NULL, 128, "vec128");
   tdesc_create_reg (feature, "mxcsr", 56, 1, "vector", 32, "i386_mxcsr");
 
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.segments");
+  tdesc_create_reg (feature, "fs_base", 57, 1, NULL, 64, "int");
+  tdesc_create_reg (feature, "gs_base", 58, 1, NULL, 64, "int");
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx");
-  tdesc_create_reg (feature, "ymm0h", 57, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm1h", 58, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm2h", 59, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm3h", 60, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm4h", 61, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm5h", 62, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm6h", 63, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm7h", 64, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm8h", 65, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm9h", 66, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm10h", 67, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm11h", 68, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm12h", 69, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm13h", 70, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm14h", 71, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm15h", 72, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm0h", 59, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm1h", 60, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm2h", 61, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm3h", 62, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm4h", 63, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm5h", 64, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm6h", 65, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm7h", 66, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm8h", 67, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm9h", 68, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm10h", 69, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm11h", 70, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm12h", 71, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm13h", 72, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm14h", 73, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm15h", 74, 1, NULL, 128, "uint128");
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx512");
   field_type = tdesc_named_type (feature, "ieee_single");
@@ -202,78 +206,78 @@ initialize_tdesc_amd64_avx_avx512 (void)
   field_type = tdesc_named_type (feature, "uint128");
   tdesc_create_vector (feature, "v2ui128", field_type, 2);
 
-  tdesc_create_reg (feature, "xmm16", 73, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm17", 74, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm18", 75, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm19", 76, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm20", 77, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm21", 78, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm22", 79, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm23", 80, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm24", 81, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm25", 82, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm26", 83, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm27", 84, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm28", 85, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm29", 86, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm30", 87, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm31", 88, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "ymm16h", 89, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm17h", 90, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm18h", 91, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm19h", 92, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm20h", 93, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm21h", 94, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm22h", 95, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm23h", 96, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm24h", 97, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm25h", 98, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm26h", 99, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm27h", 100, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm28h", 101, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm29h", 102, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm30h", 103, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm31h", 104, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "k0", 105, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k1", 106, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k2", 107, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k3", 108, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k4", 109, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k5", 110, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k6", 111, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k7", 112, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "zmm0h", 113, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm1h", 114, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm2h", 115, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm3h", 116, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm4h", 117, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm5h", 118, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm6h", 119, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm7h", 120, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm8h", 121, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm9h", 122, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm10h", 123, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm11h", 124, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm12h", 125, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm13h", 126, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm14h", 127, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm15h", 128, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm16h", 129, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm17h", 130, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm18h", 131, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm19h", 132, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm20h", 133, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm21h", 134, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm22h", 135, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm23h", 136, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm24h", 137, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm25h", 138, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm26h", 139, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm27h", 140, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm28h", 141, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm29h", 142, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm30h", 143, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm31h", 144, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "xmm16", 75, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm17", 76, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm18", 77, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm19", 78, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm20", 79, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm21", 80, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm22", 81, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm23", 82, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm24", 83, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm25", 84, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm26", 85, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm27", 86, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm28", 87, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm29", 88, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm30", 89, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm31", 90, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "ymm16h", 91, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm17h", 92, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm18h", 93, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm19h", 94, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm20h", 95, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm21h", 96, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm22h", 97, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm23h", 98, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm24h", 99, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm25h", 100, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm26h", 101, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm27h", 102, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm28h", 103, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm29h", 104, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm30h", 105, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm31h", 106, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "k0", 107, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k1", 108, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k2", 109, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k3", 110, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k4", 111, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k5", 112, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k6", 113, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k7", 114, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "zmm0h", 115, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm1h", 116, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm2h", 117, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm3h", 118, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm4h", 119, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm5h", 120, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm6h", 121, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm7h", 122, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm8h", 123, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm9h", 124, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm10h", 125, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm11h", 126, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm12h", 127, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm13h", 128, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm14h", 129, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm15h", 130, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm16h", 131, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm17h", 132, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm18h", 133, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm19h", 134, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm20h", 135, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm21h", 136, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm22h", 137, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm23h", 138, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm24h", 139, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm25h", 140, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm26h", 141, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm27h", 142, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm28h", 143, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm29h", 144, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm30h", 145, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm31h", 146, 1, NULL, 256, "v2ui128");
 
   tdesc_amd64_avx_avx512 = result;
 }
diff --git a/gdb/features/i386/amd64-avx-avx512.xml b/gdb/features/i386/amd64-avx-avx512.xml
index a4587433c8..fdf8136f74 100644
--- a/gdb/features/i386/amd64-avx-avx512.xml
+++ b/gdb/features/i386/amd64-avx-avx512.xml
@@ -12,6 +12,7 @@
   <architecture>i386:x86-64</architecture>
   <xi:include href="64bit-core.xml"/>
   <xi:include href="64bit-sse.xml"/>
+  <xi:include href="64bit-segments.xml"/>
   <xi:include href="64bit-avx.xml"/>
   <xi:include href="64bit-avx512.xml"/>
 </target>
diff --git a/gdb/features/i386/amd64-avx-mpx-avx512-pku.c b/gdb/features/i386/amd64-avx-mpx-avx512-pku.c
index dfe7d7778a..f119e52f5d 100644
--- a/gdb/features/i386/amd64-avx-mpx-avx512-pku.c
+++ b/gdb/features/i386/amd64-avx-mpx-avx512-pku.c
@@ -146,23 +146,27 @@ initialize_tdesc_amd64_avx_mpx_avx512_pku (void)
   tdesc_create_reg (feature, "xmm15", 55, 1, NULL, 128, "vec128");
   tdesc_create_reg (feature, "mxcsr", 56, 1, "vector", 32, "i386_mxcsr");
 
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.segments");
+  tdesc_create_reg (feature, "fs_base", 57, 1, NULL, 64, "int");
+  tdesc_create_reg (feature, "gs_base", 58, 1, NULL, 64, "int");
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx");
-  tdesc_create_reg (feature, "ymm0h", 57, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm1h", 58, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm2h", 59, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm3h", 60, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm4h", 61, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm5h", 62, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm6h", 63, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm7h", 64, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm8h", 65, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm9h", 66, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm10h", 67, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm11h", 68, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm12h", 69, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm13h", 70, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm14h", 71, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm15h", 72, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm0h", 59, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm1h", 60, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm2h", 61, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm3h", 62, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm4h", 63, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm5h", 64, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm6h", 65, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm7h", 66, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm8h", 67, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm9h", 68, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm10h", 69, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm11h", 70, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm12h", 71, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm13h", 72, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm14h", 73, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm15h", 74, 1, NULL, 128, "uint128");
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.mpx");
   type = tdesc_create_struct (feature, "br128");
@@ -195,12 +199,12 @@ initialize_tdesc_amd64_avx_mpx_avx512_pku (void)
   field_type = tdesc_named_type (feature, "_bndcfgu");
   tdesc_add_field (type, "config", field_type);
 
-  tdesc_create_reg (feature, "bnd0raw", 73, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bnd1raw", 74, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bnd2raw", 75, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bnd3raw", 76, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bndcfgu", 77, 1, NULL, 64, "cfgu");
-  tdesc_create_reg (feature, "bndstatus", 78, 1, NULL, 64, "status");
+  tdesc_create_reg (feature, "bnd0raw", 75, 1, NULL, 128, "br128");
+  tdesc_create_reg (feature, "bnd1raw", 76, 1, NULL, 128, "br128");
+  tdesc_create_reg (feature, "bnd2raw", 77, 1, NULL, 128, "br128");
+  tdesc_create_reg (feature, "bnd3raw", 78, 1, NULL, 128, "br128");
+  tdesc_create_reg (feature, "bndcfgu", 79, 1, NULL, 64, "cfgu");
+  tdesc_create_reg (feature, "bndstatus", 80, 1, NULL, 64, "status");
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx512");
   field_type = tdesc_named_type (feature, "ieee_single");
@@ -240,81 +244,81 @@ initialize_tdesc_amd64_avx_mpx_avx512_pku (void)
   field_type = tdesc_named_type (feature, "uint128");
   tdesc_create_vector (feature, "v2ui128", field_type, 2);
 
-  tdesc_create_reg (feature, "xmm16", 79, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm17", 80, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm18", 81, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm19", 82, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm20", 83, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm21", 84, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm22", 85, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm23", 86, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm24", 87, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm25", 88, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm26", 89, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm27", 90, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm28", 91, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm29", 92, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm30", 93, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm31", 94, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "ymm16h", 95, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm17h", 96, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm18h", 97, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm19h", 98, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm20h", 99, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm21h", 100, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm22h", 101, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm23h", 102, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm24h", 103, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm25h", 104, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm26h", 105, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm27h", 106, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm28h", 107, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm29h", 108, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm30h", 109, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm31h", 110, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "k0", 111, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k1", 112, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k2", 113, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k3", 114, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k4", 115, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k5", 116, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k6", 117, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k7", 118, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "zmm0h", 119, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm1h", 120, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm2h", 121, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm3h", 122, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm4h", 123, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm5h", 124, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm6h", 125, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm7h", 126, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm8h", 127, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm9h", 128, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm10h", 129, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm11h", 130, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm12h", 131, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm13h", 132, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm14h", 133, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm15h", 134, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm16h", 135, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm17h", 136, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm18h", 137, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm19h", 138, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm20h", 139, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm21h", 140, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm22h", 141, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm23h", 142, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm24h", 143, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm25h", 144, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm26h", 145, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm27h", 146, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm28h", 147, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm29h", 148, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm30h", 149, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm31h", 150, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "xmm16", 81, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm17", 82, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm18", 83, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm19", 84, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm20", 85, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm21", 86, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm22", 87, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm23", 88, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm24", 89, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm25", 90, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm26", 91, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm27", 92, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm28", 93, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm29", 94, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm30", 95, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm31", 96, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "ymm16h", 97, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm17h", 98, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm18h", 99, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm19h", 100, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm20h", 101, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm21h", 102, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm22h", 103, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm23h", 104, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm24h", 105, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm25h", 106, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm26h", 107, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm27h", 108, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm28h", 109, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm29h", 110, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm30h", 111, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm31h", 112, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "k0", 113, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k1", 114, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k2", 115, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k3", 116, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k4", 117, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k5", 118, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k6", 119, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k7", 120, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "zmm0h", 121, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm1h", 122, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm2h", 123, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm3h", 124, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm4h", 125, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm5h", 126, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm6h", 127, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm7h", 128, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm8h", 129, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm9h", 130, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm10h", 131, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm11h", 132, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm12h", 133, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm13h", 134, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm14h", 135, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm15h", 136, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm16h", 137, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm17h", 138, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm18h", 139, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm19h", 140, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm20h", 141, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm21h", 142, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm22h", 143, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm23h", 144, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm24h", 145, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm25h", 146, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm26h", 147, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm27h", 148, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm28h", 149, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm29h", 150, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm30h", 151, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm31h", 152, 1, NULL, 256, "v2ui128");
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.pkeys");
-  tdesc_create_reg (feature, "pkru", 151, 1, NULL, 32, "uint32");
+  tdesc_create_reg (feature, "pkru", 153, 1, NULL, 32, "uint32");
 
   tdesc_amd64_avx_mpx_avx512_pku = result;
 }
diff --git a/gdb/features/i386/amd64-avx-mpx-avx512-pku.xml b/gdb/features/i386/amd64-avx-mpx-avx512-pku.xml
index e769108873..d8203e3400 100644
--- a/gdb/features/i386/amd64-avx-mpx-avx512-pku.xml
+++ b/gdb/features/i386/amd64-avx-mpx-avx512-pku.xml
@@ -12,6 +12,7 @@
   <architecture>i386:x86-64</architecture>
   <xi:include href="64bit-core.xml"/>
   <xi:include href="64bit-sse.xml"/>
+  <xi:include href="64bit-segments.xml"/>
   <xi:include href="64bit-avx.xml"/>
   <xi:include href="64bit-mpx.xml"/>
   <xi:include href="64bit-avx512.xml"/>
diff --git a/gdb/features/i386/amd64-avx-mpx.c b/gdb/features/i386/amd64-avx-mpx.c
index ab56f42f13..0c5161fe8d 100644
--- a/gdb/features/i386/amd64-avx-mpx.c
+++ b/gdb/features/i386/amd64-avx-mpx.c
@@ -146,23 +146,27 @@ initialize_tdesc_amd64_avx_mpx (void)
   tdesc_create_reg (feature, "xmm15", 55, 1, NULL, 128, "vec128");
   tdesc_create_reg (feature, "mxcsr", 56, 1, "vector", 32, "i386_mxcsr");
 
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.segments");
+  tdesc_create_reg (feature, "fs_base", 57, 1, NULL, 64, "int");
+  tdesc_create_reg (feature, "gs_base", 58, 1, NULL, 64, "int");
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx");
-  tdesc_create_reg (feature, "ymm0h", 57, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm1h", 58, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm2h", 59, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm3h", 60, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm4h", 61, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm5h", 62, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm6h", 63, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm7h", 64, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm8h", 65, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm9h", 66, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm10h", 67, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm11h", 68, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm12h", 69, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm13h", 70, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm14h", 71, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm15h", 72, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm0h", 59, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm1h", 60, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm2h", 61, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm3h", 62, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm4h", 63, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm5h", 64, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm6h", 65, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm7h", 66, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm8h", 67, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm9h", 68, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm10h", 69, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm11h", 70, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm12h", 71, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm13h", 72, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm14h", 73, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm15h", 74, 1, NULL, 128, "uint128");
 
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.mpx");
   type = tdesc_create_struct (feature, "br128");
@@ -195,12 +199,12 @@ initialize_tdesc_amd64_avx_mpx (void)
   field_type = tdesc_named_type (feature, "_bndcfgu");
   tdesc_add_field (type, "config", field_type);
 
-  tdesc_create_reg (feature, "bnd0raw", 73, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bnd1raw", 74, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bnd2raw", 75, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bnd3raw", 76, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bndcfgu", 77, 1, NULL, 64, "cfgu");
-  tdesc_create_reg (feature, "bndstatus", 78, 1, NULL, 64, "status");
+  tdesc_create_reg (feature, "bnd0raw", 75, 1, NULL, 128, "br128");
+  tdesc_create_reg (feature, "bnd1raw", 76, 1, NULL, 128, "br128");
+  tdesc_create_reg (feature, "bnd2raw", 77, 1, NULL, 128, "br128");
+  tdesc_create_reg (feature, "bnd3raw", 78, 1, NULL, 128, "br128");
+  tdesc_create_reg (feature, "bndcfgu", 79, 1, NULL, 64, "cfgu");
+  tdesc_create_reg (feature, "bndstatus", 80, 1, NULL, 64, "status");
 
   tdesc_amd64_avx_mpx = result;
 }
diff --git a/gdb/features/i386/amd64-avx-mpx.xml b/gdb/features/i386/amd64-avx-mpx.xml
index 0001dc8413..001cc58fa6 100644
--- a/gdb/features/i386/amd64-avx-mpx.xml
+++ b/gdb/features/i386/amd64-avx-mpx.xml
@@ -12,6 +12,7 @@
   <architecture>i386:x86-64</architecture>
   <xi:include href="64bit-core.xml"/>
   <xi:include href="64bit-sse.xml"/>
+  <xi:include href="64bit-segments.xml"/>
   <xi:include href="64bit-avx.xml"/>
   <xi:include href="64bit-mpx.xml"/>
 </target>
diff --git a/gdb/features/i386/amd64-avx.c b/gdb/features/i386/amd64-avx.c
index 42bd69ab97..61d3ff56a4 100644
--- a/gdb/features/i386/amd64-avx.c
+++ b/gdb/features/i386/amd64-avx.c
@@ -146,23 +146,27 @@ initialize_tdesc_amd64_avx (void)
   tdesc_create_reg (feature, "xmm15", 55, 1, NULL, 128, "vec128");
   tdesc_create_reg (feature, "mxcsr", 56, 1, "vector", 32, "i386_mxcsr");
 
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.segments");
+  tdesc_create_reg (feature, "fs_base", 57, 1, NULL, 64, "int");
+  tdesc_create_reg (feature, "gs_base", 58, 1, NULL, 64, "int");
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx");
-  tdesc_create_reg (feature, "ymm0h", 57, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm1h", 58, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm2h", 59, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm3h", 60, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm4h", 61, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm5h", 62, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm6h", 63, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm7h", 64, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm8h", 65, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm9h", 66, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm10h", 67, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm11h", 68, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm12h", 69, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm13h", 70, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm14h", 71, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm15h", 72, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm0h", 59, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm1h", 60, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm2h", 61, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm3h", 62, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm4h", 63, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm5h", 64, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm6h", 65, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm7h", 66, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm8h", 67, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm9h", 68, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm10h", 69, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm11h", 70, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm12h", 71, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm13h", 72, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm14h", 73, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm15h", 74, 1, NULL, 128, "uint128");
 
   tdesc_amd64_avx = result;
 }
diff --git a/gdb/features/i386/amd64-avx.xml b/gdb/features/i386/amd64-avx.xml
index d3b63b8132..a0fec551d9 100644
--- a/gdb/features/i386/amd64-avx.xml
+++ b/gdb/features/i386/amd64-avx.xml
@@ -12,5 +12,6 @@
   <architecture>i386:x86-64</architecture>
   <xi:include href="64bit-core.xml"/>
   <xi:include href="64bit-sse.xml"/>
+  <xi:include href="64bit-segments.xml"/>
   <xi:include href="64bit-avx.xml"/>
 </target>
diff --git a/gdb/features/i386/amd64-mpx.c b/gdb/features/i386/amd64-mpx.c
index 41f0e7834b..026fdb8625 100644
--- a/gdb/features/i386/amd64-mpx.c
+++ b/gdb/features/i386/amd64-mpx.c
@@ -146,6 +146,10 @@ initialize_tdesc_amd64_mpx (void)
   tdesc_create_reg (feature, "xmm15", 55, 1, NULL, 128, "vec128");
   tdesc_create_reg (feature, "mxcsr", 56, 1, "vector", 32, "i386_mxcsr");
 
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.segments");
+  tdesc_create_reg (feature, "fs_base", 57, 1, NULL, 64, "int");
+  tdesc_create_reg (feature, "gs_base", 58, 1, NULL, 64, "int");
+
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.mpx");
   type = tdesc_create_struct (feature, "br128");
   field_type = tdesc_named_type (feature, "uint64");
@@ -177,12 +181,12 @@ initialize_tdesc_amd64_mpx (void)
   field_type = tdesc_named_type (feature, "_bndcfgu");
   tdesc_add_field (type, "config", field_type);
 
-  tdesc_create_reg (feature, "bnd0raw", 57, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bnd1raw", 58, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bnd2raw", 59, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bnd3raw", 60, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bndcfgu", 61, 1, NULL, 64, "cfgu");
-  tdesc_create_reg (feature, "bndstatus", 62, 1, NULL, 64, "status");
+  tdesc_create_reg (feature, "bnd0raw", 59, 1, NULL, 128, "br128");
+  tdesc_create_reg (feature, "bnd1raw", 60, 1, NULL, 128, "br128");
+  tdesc_create_reg (feature, "bnd2raw", 61, 1, NULL, 128, "br128");
+  tdesc_create_reg (feature, "bnd3raw", 62, 1, NULL, 128, "br128");
+  tdesc_create_reg (feature, "bndcfgu", 63, 1, NULL, 64, "cfgu");
+  tdesc_create_reg (feature, "bndstatus", 64, 1, NULL, 64, "status");
 
   tdesc_amd64_mpx = result;
 }
diff --git a/gdb/features/i386/amd64-mpx.xml b/gdb/features/i386/amd64-mpx.xml
index 7692006e9c..7e0253d661 100644
--- a/gdb/features/i386/amd64-mpx.xml
+++ b/gdb/features/i386/amd64-mpx.xml
@@ -12,5 +12,6 @@
   <architecture>i386:x86-64</architecture>
   <xi:include href="64bit-core.xml"/>
   <xi:include href="64bit-sse.xml"/>
+  <xi:include href="64bit-segments.xml"/>
   <xi:include href="64bit-mpx.xml"/>
 </target>
diff --git a/gdb/features/i386/amd64.c b/gdb/features/i386/amd64.c
index b875a9b322..31ab6ccfba 100644
--- a/gdb/features/i386/amd64.c
+++ b/gdb/features/i386/amd64.c
@@ -146,5 +146,9 @@ initialize_tdesc_amd64 (void)
   tdesc_create_reg (feature, "xmm15", 55, 1, NULL, 128, "vec128");
   tdesc_create_reg (feature, "mxcsr", 56, 1, "vector", 32, "i386_mxcsr");
 
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.segments");
+  tdesc_create_reg (feature, "fs_base", 57, 1, NULL, 64, "int");
+  tdesc_create_reg (feature, "gs_base", 58, 1, NULL, 64, "int");
+
   tdesc_amd64 = result;
 }
diff --git a/gdb/features/i386/amd64.xml b/gdb/features/i386/amd64.xml
index d11c07e234..1962a2af37 100644
--- a/gdb/features/i386/amd64.xml
+++ b/gdb/features/i386/amd64.xml
@@ -12,4 +12,5 @@
   <architecture>i386:x86-64</architecture>
   <xi:include href="64bit-core.xml"/>
   <xi:include href="64bit-sse.xml"/>
+  <xi:include href="64bit-segments.xml"/>
 </target>
diff --git a/gdb/regformats/i386/amd64-avx-avx512.dat b/gdb/regformats/i386/amd64-avx-avx512.dat
index b7938e6919..1fbe4733f5 100644
--- a/gdb/regformats/i386/amd64-avx-avx512.dat
+++ b/gdb/regformats/i386/amd64-avx-avx512.dat
@@ -60,6 +60,8 @@ expedite:rbp,rsp,rip
 128:xmm14
 128:xmm15
 32:mxcsr
+64:fs_base
+64:gs_base
 128:ymm0h
 128:ymm1h
 128:ymm2h
diff --git a/gdb/regformats/i386/amd64-avx-mpx-avx512-pku.dat b/gdb/regformats/i386/amd64-avx-mpx-avx512-pku.dat
index 88185fd8c3..23c3a4062e 100644
--- a/gdb/regformats/i386/amd64-avx-mpx-avx512-pku.dat
+++ b/gdb/regformats/i386/amd64-avx-mpx-avx512-pku.dat
@@ -60,7 +60,6 @@ expedite:rbp,rsp,rip
 128:xmm14
 128:xmm15
 32:mxcsr
-64:orig_rax
 64:fs_base
 64:gs_base
 128:ymm0h
diff --git a/gdb/regformats/i386/amd64-avx-mpx.dat b/gdb/regformats/i386/amd64-avx-mpx.dat
index d985641b01..655775b0f9 100644
--- a/gdb/regformats/i386/amd64-avx-mpx.dat
+++ b/gdb/regformats/i386/amd64-avx-mpx.dat
@@ -60,6 +60,8 @@ expedite:rbp,rsp,rip
 128:xmm14
 128:xmm15
 32:mxcsr
+64:fs_base
+64:gs_base
 128:ymm0h
 128:ymm1h
 128:ymm2h
diff --git a/gdb/regformats/i386/amd64-avx.dat b/gdb/regformats/i386/amd64-avx.dat
index 223233667a..8b9d81e743 100644
--- a/gdb/regformats/i386/amd64-avx.dat
+++ b/gdb/regformats/i386/amd64-avx.dat
@@ -60,6 +60,8 @@ expedite:rbp,rsp,rip
 128:xmm14
 128:xmm15
 32:mxcsr
+64:fs_base
+64:gs_base
 128:ymm0h
 128:ymm1h
 128:ymm2h
diff --git a/gdb/regformats/i386/amd64-mpx.dat b/gdb/regformats/i386/amd64-mpx.dat
index 43b87769c2..d5e60babd8 100644
--- a/gdb/regformats/i386/amd64-mpx.dat
+++ b/gdb/regformats/i386/amd64-mpx.dat
@@ -60,6 +60,8 @@ expedite:rbp,rsp,rip
 128:xmm14
 128:xmm15
 32:mxcsr
+64:fs_base
+64:gs_base
 128:bnd0raw
 128:bnd1raw
 128:bnd2raw
diff --git a/gdb/regformats/i386/amd64.dat b/gdb/regformats/i386/amd64.dat
index 0ff917019d..66f26ad094 100644
--- a/gdb/regformats/i386/amd64.dat
+++ b/gdb/regformats/i386/amd64.dat
@@ -60,3 +60,5 @@ expedite:rbp,rsp,rip
 128:xmm14
 128:xmm15
 32:mxcsr
+64:fs_base
+64:gs_base
-- 
2.11.0

^ permalink raw reply	[flat|nested] 18+ messages in thread

* [PATCH 2/2] Support the fs_base and gs_base registers on FreeBSD/amd64 native processes.
  2017-06-27 22:50 [PATCH 0/2] Support fs_base and gs_base for native FreeBSD/amd64 John Baldwin
@ 2017-06-27 22:51 ` John Baldwin
  2017-07-11  8:09   ` Yao Qi
  2017-06-27 22:51 ` [PATCH 1/2] Include the fs_base and gs_base registers in amd64 target descriptions John Baldwin
  2017-07-11  7:49 ` [PATCH 0/2] Support fs_base and gs_base for native FreeBSD/amd64 Yao Qi
  2 siblings, 1 reply; 18+ messages in thread
From: John Baldwin @ 2017-06-27 22:51 UTC (permalink / raw)
  To: gdb-patches

Use ptrace operations to fetch and store the fs_base and gs_base registers
for FreeBSD/amd64 processes.  Note that FreeBSD does not currently store the
value of these registers in core dumps, so these registers are only
available when inspecting a running process.

gdb/ChangeLog:

	* amd64-bsd-nat.c (amd64bsd_fetch_inferior_registers): Use
	PT_GETFSBASE and PT_GETGSBASE.
	(amd64bsd_store_inferior_registers): Use PT_SETFSBASE and
	PT_SETGSBASE.
---
 gdb/ChangeLog       |  7 +++++++
 gdb/amd64-bsd-nat.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 61 insertions(+)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 2196419fa3..09fe66a49a 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,12 @@
 2017-06-26  John Baldwin  <jhb@FreeBSD.org>
 
+	* amd64-bsd-nat.c (amd64bsd_fetch_inferior_registers): Use
+	PT_GETFSBASE and PT_GETGSBASE.
+	(amd64bsd_store_inferior_registers): Use PT_SETFSBASE and
+	PT_SETGSBASE.
+
+2017-06-26  John Baldwin  <jhb@FreeBSD.org>
+
 	* features/Makefile (amd64.dat, amd64-avx.dat, amd64-mpx.dat)
 	(amd64-avx-mpx.dat, amd64-avx-avx512.dat)
 	(amd64-avx-mpx-avx512-pku.dat): Add i386/64bit-segments.xml in
diff --git a/gdb/amd64-bsd-nat.c b/gdb/amd64-bsd-nat.c
index ca61a3551b..41dee84269 100644
--- a/gdb/amd64-bsd-nat.c
+++ b/gdb/amd64-bsd-nat.c
@@ -57,6 +57,33 @@ amd64bsd_fetch_inferior_registers (struct target_ops *ops,
 	return;
     }
 
+#ifdef PT_GETFSBASE
+  if (regnum == -1 || regnum == AMD64_FSBASE_REGNUM)
+    {
+      register_t base;
+
+      if (ptrace (PT_GETFSBASE, pid, (PTRACE_TYPE_ARG3) &base, 0) == -1)
+	perror_with_name (_("Couldn't get segment register fs_base"));
+
+      regcache_raw_supply (regcache, AMD64_FSBASE_REGNUM, &base);
+      if (regnum != -1)
+	return;
+    }
+#endif
+#ifdef PT_GETGSBASE
+  if (regnum == -1 || regnum == AMD64_GSBASE_REGNUM)
+    {
+      register_t base;
+
+      if (ptrace (PT_GETGSBASE, pid, (PTRACE_TYPE_ARG3) &base, 0) == -1)
+	perror_with_name (_("Couldn't get segment register gs_base"));
+
+      regcache_raw_supply (regcache, AMD64_GSBASE_REGNUM, &base);
+      if (regnum != -1)
+	return;
+    }
+#endif
+
   if (regnum == -1 || !amd64_native_gregset_supplies_p (gdbarch, regnum))
     {
       struct fpreg fpregs;
@@ -108,6 +135,33 @@ amd64bsd_store_inferior_registers (struct target_ops *ops,
 	return;
     }
 
+#ifdef PT_SETFSBASE
+  if (regnum == -1 || regnum == AMD64_FSBASE_REGNUM)
+    {
+      register_t base;
+
+      regcache_raw_collect (regcache, AMD64_FSBASE_REGNUM, &base);
+
+      if (ptrace (PT_SETFSBASE, pid, (PTRACE_TYPE_ARG3) &base, 0) == -1)
+	perror_with_name (_("Couldn't write segment register fs_base"));
+      if (regnum != -1)
+	return;
+    }
+#endif
+#ifdef PT_SETGSBASE
+  if (regnum == -1 || regnum == AMD64_GSBASE_REGNUM)
+    {
+      register_t base;
+
+      regcache_raw_collect (regcache, AMD64_GSBASE_REGNUM, &base);
+
+      if (ptrace (PT_SETGSBASE, pid, (PTRACE_TYPE_ARG3) &base, 0) == -1)
+	perror_with_name (_("Couldn't write segment register gs_base"));
+      if (regnum != -1)
+	return;
+    }
+#endif
+
   if (regnum == -1 || !amd64_native_gregset_supplies_p (gdbarch, regnum))
     {
       struct fpreg fpregs;
-- 
2.11.0

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 0/2] Support fs_base and gs_base for native FreeBSD/amd64
  2017-06-27 22:50 [PATCH 0/2] Support fs_base and gs_base for native FreeBSD/amd64 John Baldwin
  2017-06-27 22:51 ` [PATCH 2/2] Support the fs_base and gs_base registers on FreeBSD/amd64 native processes John Baldwin
  2017-06-27 22:51 ` [PATCH 1/2] Include the fs_base and gs_base registers in amd64 target descriptions John Baldwin
@ 2017-07-11  7:49 ` Yao Qi
  2017-07-11 16:26   ` John Baldwin
  2 siblings, 1 reply; 18+ messages in thread
From: Yao Qi @ 2017-07-11  7:49 UTC (permalink / raw)
  To: John Baldwin; +Cc: gdb-patches

John Baldwin <jhb@FreeBSD.org> writes:

> On the other hand, I wonder if we shouldn't just add fs_base and gs_base
> to the "core" descriptions alongside "fs" and "gs" rather than using a
> separate feature if they are always going to be present.

The feature org.gnu.gdb.i386.core and org.gnu.gdb.i386.segments are
already explicitly documented
https://sourceware.org/gdb/current/onlinedocs/gdb/i386-Features.html
I don't think we can modify org.gnu.gdb.i386.core.

-- 
Yao (齐尧)

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 1/2] Include the fs_base and gs_base registers in amd64 target descriptions.
  2017-06-27 22:51 ` [PATCH 1/2] Include the fs_base and gs_base registers in amd64 target descriptions John Baldwin
@ 2017-07-11  8:03   ` Yao Qi
  2017-07-11 16:26     ` John Baldwin
  2017-07-12 12:16     ` Phil Muldoon
  0 siblings, 2 replies; 18+ messages in thread
From: Yao Qi @ 2017-07-11  8:03 UTC (permalink / raw)
  To: John Baldwin; +Cc: gdb-patches

John Baldwin <jhb@FreeBSD.org> writes:

> This permits these registers to be used with non-Linux targets.

Some GDBserver uses these target description files, like
x86_64-*-mingw*, after this change, GDBserver will reply GDB the target
description including "64bit-segments.xml".  Then, GDB will request the
contents of 64bit-segments.xml from GDBserver, looks 64bit-segments.xml
is already builtin in GDBserver, so there isn't an issue here.

The patch is good to me.

P.S.  this is a good example to show the inflexibility in current target
description.  After we change it to my new approach of target
description, this change will be just two or three lines :)

-- 
Yao (齐尧)

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 2/2] Support the fs_base and gs_base registers on FreeBSD/amd64 native processes.
  2017-06-27 22:51 ` [PATCH 2/2] Support the fs_base and gs_base registers on FreeBSD/amd64 native processes John Baldwin
@ 2017-07-11  8:09   ` Yao Qi
  0 siblings, 0 replies; 18+ messages in thread
From: Yao Qi @ 2017-07-11  8:09 UTC (permalink / raw)
  To: John Baldwin; +Cc: gdb-patches

John Baldwin <jhb@FreeBSD.org> writes:

> Use ptrace operations to fetch and store the fs_base and gs_base registers
> for FreeBSD/amd64 processes.  Note that FreeBSD does not currently store the
> value of these registers in core dumps, so these registers are only
> available when inspecting a running process.
>
> gdb/ChangeLog:
>
> 	* amd64-bsd-nat.c (amd64bsd_fetch_inferior_registers): Use
> 	PT_GETFSBASE and PT_GETGSBASE.
> 	(amd64bsd_store_inferior_registers): Use PT_SETFSBASE and
> 	PT_SETGSBASE.

The patch is good to me.

-- 
Yao (齐尧)

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 0/2] Support fs_base and gs_base for native FreeBSD/amd64
  2017-07-11  7:49 ` [PATCH 0/2] Support fs_base and gs_base for native FreeBSD/amd64 Yao Qi
@ 2017-07-11 16:26   ` John Baldwin
  0 siblings, 0 replies; 18+ messages in thread
From: John Baldwin @ 2017-07-11 16:26 UTC (permalink / raw)
  To: Yao Qi; +Cc: gdb-patches

On Tuesday, July 11, 2017 08:48:32 AM Yao Qi wrote:
> John Baldwin <jhb@FreeBSD.org> writes:
> 
> > On the other hand, I wonder if we shouldn't just add fs_base and gs_base
> > to the "core" descriptions alongside "fs" and "gs" rather than using a
> > separate feature if they are always going to be present.
> 
> The feature org.gnu.gdb.i386.core and org.gnu.gdb.i386.segments are
> already explicitly documented
> https://sourceware.org/gdb/current/onlinedocs/gdb/i386-Features.html
> I don't think we can modify org.gnu.gdb.i386.core.

Ok.

-- 
John Baldwin

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 1/2] Include the fs_base and gs_base registers in amd64 target descriptions.
  2017-07-11  8:03   ` Yao Qi
@ 2017-07-11 16:26     ` John Baldwin
  2017-07-12 12:16     ` Phil Muldoon
  1 sibling, 0 replies; 18+ messages in thread
From: John Baldwin @ 2017-07-11 16:26 UTC (permalink / raw)
  To: Yao Qi; +Cc: gdb-patches

On Tuesday, July 11, 2017 09:01:25 AM Yao Qi wrote:
> John Baldwin <jhb@FreeBSD.org> writes:
> 
> > This permits these registers to be used with non-Linux targets.
> 
> Some GDBserver uses these target description files, like
> x86_64-*-mingw*, after this change, GDBserver will reply GDB the target
> description including "64bit-segments.xml".  Then, GDB will request the
> contents of 64bit-segments.xml from GDBserver, looks 64bit-segments.xml
> is already builtin in GDBserver, so there isn't an issue here.
> 
> The patch is good to me.
> 
> P.S.  this is a good example to show the inflexibility in current target
> description.  After we change it to my new approach of target
> description, this change will be just two or three lines :)

Agreed. :)  The combinatorics with XSAVE on x86 is especially bad.

-- 
John Baldwin

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 1/2] Include the fs_base and gs_base registers in amd64 target descriptions.
  2017-07-11  8:03   ` Yao Qi
  2017-07-11 16:26     ` John Baldwin
@ 2017-07-12 12:16     ` Phil Muldoon
  2017-07-12 13:02       ` Yao Qi
  1 sibling, 1 reply; 18+ messages in thread
From: Phil Muldoon @ 2017-07-12 12:16 UTC (permalink / raw)
  To: Yao Qi, John Baldwin; +Cc: gdb-patches

On 11/07/17 09:01, Yao Qi wrote:
> John Baldwin <jhb@FreeBSD.org> writes:
> 
>> This permits these registers to be used with non-Linux targets.
> 
> Some GDBserver uses these target description files, like
> x86_64-*-mingw*, after this change, GDBserver will reply GDB the target
> description including "64bit-segments.xml".  Then, GDB will request the
> contents of 64bit-segments.xml from GDBserver, looks 64bit-segments.xml
> is already builtin in GDBserver, so there isn't an issue here.
> 
> The patch is good to me.
> 
> P.S.  this is a good example to show the inflexibility in current target
> description.  After we change it to my new approach of target
> description, this change will be just two or three lines :)
> 

This commit: 48aeef91c248291dd03583798904612426b1f40a along with
related commit: 0aa37b654c0f31e446ab47826f0bcbec15d0112f seems to
cause substantial testsuite failures for me on x8664/Fedora/Linux.

Backtrace of a trivial: file helloworld

(gdb) bt
#0  0x0000000000937b51 in htab_remove_elt_with_hash (htab=0x133f5d0, element=0xf0a180, hash=2401929989)
    at ../../binutils-gdb/libiberty/hashtab.c:728
#1  0x0000000000937b1b in htab_remove_elt (htab=0x133f5d0, element=0xf0a180) at ../../binutils-gdb/libiberty/hashtab.c:714
#2  0x00000000007b7c02 in tdesc_use_registers (gdbarch=0x1346ac0, target_desc=0xf2f540, early_data=0x133f5a0)
    at ../../binutils-gdb/gdb/target-descriptions.c:1328
#3  0x000000000045079c in i386_gdbarch_init (info=..., arches=0x0) at ../../binutils-gdb/gdb/i386-tdep.c:8634
#4  0x00000000006be323 in gdbarch_find_by_info (info=...) at ../../binutils-gdb/gdb/gdbarch.c:5394
#5  0x00000000005bddd9 in set_gdbarch_from_file (abfd=0x133d1d0) at ../../binutils-gdb/gdb/arch-utils.c:618
#6  0x000000000069777d in exec_file_attach (filename=0x13301d0 "/home/pmuldoon/td", from_tty=1) at ../../binutils-gdb/gdb/exec.c:380

Does anyone else see this?

Cheers

Phil

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 1/2] Include the fs_base and gs_base registers in amd64 target descriptions.
  2017-07-12 12:16     ` Phil Muldoon
@ 2017-07-12 13:02       ` Yao Qi
  2017-07-12 13:51         ` Simon Marchi
  2017-07-12 16:23         ` Keith Seitz
  0 siblings, 2 replies; 18+ messages in thread
From: Yao Qi @ 2017-07-12 13:02 UTC (permalink / raw)
  To: Phil Muldoon; +Cc: John Baldwin, gdb-patches

On Wed, Jul 12, 2017 at 1:16 PM, Phil Muldoon <pmuldoon@redhat.com> wrote:
>
> Does anyone else see this?
>

I don't see the issue you posted here, but there are
some regressions shown in buildbot.
https://sourceware.org/ml/gdb-testers/2017-q3/msg00370.html

John, could you take a look?

-- 
Yao (齐尧)

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 1/2] Include the fs_base and gs_base registers in amd64 target descriptions.
  2017-07-12 13:02       ` Yao Qi
@ 2017-07-12 13:51         ` Simon Marchi
  2017-07-12 20:03           ` John Baldwin
  2017-07-12 16:23         ` Keith Seitz
  1 sibling, 1 reply; 18+ messages in thread
From: Simon Marchi @ 2017-07-12 13:51 UTC (permalink / raw)
  To: Yao Qi; +Cc: Phil Muldoon, John Baldwin, gdb-patches

On 2017-07-12 15:02, Yao Qi wrote:
> On Wed, Jul 12, 2017 at 1:16 PM, Phil Muldoon <pmuldoon@redhat.com> 
> wrote:
>> 
>> Does anyone else see this?
>> 
> 
> I don't see the issue you posted here, but there are
> some regressions shown in buildbot.
> https://sourceware.org/ml/gdb-testers/2017-q3/msg00370.html
> 
> John, could you take a look?

I looked around, I don't know exactly what's wrong but I might have some 
pointers.

 From what I understand, tdesc_use_registers adds the registers listed in 
the target description to a hash table, and then removes some of those 
same registers that are also specified by the architecture, so it's left 
with the registers for which we need to assign a number.  The hash table 
hash the pointer itself, it does not look at what it points to.

I added some prints where we add and remove the registers from the htab. 
  For rax, it looks good:

ADDING 0x237a510 rax
REMOVING 0x237a510 rax

We add and remov the same pointer.  For fs_base, the pointers are 
different:

ADDING 0x237d840 fs_base
REMOVING 0x23a5d70 fs_base

It suggests that something is wrong here, I would expect those two 
pointers to be equal.  I don't know enough about how the reg objects are 
created to know why it this happens.

Despite that, a segfault happens when we are calling htab_remove_elt 
with an element that does not exist in the hash table.  This case should 
be handled correctly, since this function allows that:

707 /* This function deletes an element with the given value from hash
708    table (the hash is computed from the element).  If there is no 
matching
709    element in the hash table, this function does nothing.  */
710
711 void
712 htab_remove_elt (htab_t htab, PTR element)

The problem seems to be in htab_remove_elt_with_hash:

727   slot = htab_find_slot_with_hash (htab, element, hash, NO_INSERT);
728   if (*slot == HTAB_EMPTY_ENTRY)
729     return;

htab_find_slot_with_hash can return NULL if you pass NO_INSERT and the 
element is non-existent.  So it looks like it's missing a slot != NULL 
on line 728.

Hope that helps.

Simon

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 1/2] Include the fs_base and gs_base registers in amd64 target descriptions.
  2017-07-12 13:02       ` Yao Qi
  2017-07-12 13:51         ` Simon Marchi
@ 2017-07-12 16:23         ` Keith Seitz
  1 sibling, 0 replies; 18+ messages in thread
From: Keith Seitz @ 2017-07-12 16:23 UTC (permalink / raw)
  To: gdb-patches; +Cc: Phil Muldoon, John Baldwin

On 07/12/2017 06:02 AM, Yao Qi wrote:
> On Wed, Jul 12, 2017 at 1:16 PM, Phil Muldoon <pmuldoon@redhat.com> wrote:
>>
>> Does anyone else see this?
>>

Yes, I do, too -- I ran into it yesterday while rebasing patches for posting. FWIW, buildbot sees it, too (snippet from x86_64/-m32 linux):

set architecture i386:x64-32
ERROR: Process no longer exists
UNRESOLVED: gdb.base/all-architectures-2.exp: tests: osabi=GNU/Linux: arch=i386:x64-32: endian=auto: set architecture i386:x64-32
ERROR: Couldn't send set endian auto to GDB.
UNRESOLVED: gdb.base/all-architectures-2.exp: tests: osabi=GNU/Linux: arch=i386:x64-32:intel: endian=auto: set endian
ERROR: Couldn't send set architecture i386:x64-32:intel to GDB.
UNRESOLVED: gdb.base/all-architectures-2.exp: tests: osabi=GNU/Linux: arch=i386:x64-32:intel: endian=auto: set architecture i386:x64-32:intel
ERROR: Couldn't send show endian to GDB.
UNRESOLVED: gdb.base/all-architectures-2.exp: tests: osabi=GNU/Linux: arch=i386:x64-32:intel: endian=auto: show endian
ERROR: Couldn't send ptype 1.0L to GDB.
...

In fact right now, HEAD is unusable:

$ ./gdb gdb
Segmentation fault
$ ./gdb --version | head -1
GNU gdb (GDB) 8.0.50.20170711-git

> I don't see the issue you posted here, but there are
> some regressions shown in buildbot.
> https://sourceware.org/ml/gdb-testers/2017-q3/msg00370.html
> 
> John, could you take a look?

I'm not normally one to suggest this, but I think this is an exceptional case. Please consider reverting this patch until this issue is resolved.

Keith

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 1/2] Include the fs_base and gs_base registers in amd64 target descriptions.
  2017-07-12 13:51         ` Simon Marchi
@ 2017-07-12 20:03           ` John Baldwin
  2017-07-13 16:55             ` Yao Qi
  0 siblings, 1 reply; 18+ messages in thread
From: John Baldwin @ 2017-07-12 20:03 UTC (permalink / raw)
  To: gdb-patches, Simon Marchi; +Cc: Yao Qi, Phil Muldoon

On Wednesday, July 12, 2017 03:50:58 PM Simon Marchi wrote:
> On 2017-07-12 15:02, Yao Qi wrote:
> > On Wed, Jul 12, 2017 at 1:16 PM, Phil Muldoon <pmuldoon@redhat.com> 
> > wrote:
> >> 
> >> Does anyone else see this?
> >> 
> > 
> > I don't see the issue you posted here, but there are
> > some regressions shown in buildbot.
> > https://sourceware.org/ml/gdb-testers/2017-q3/msg00370.html
> > 
> > John, could you take a look?
> 
> I looked around, I don't know exactly what's wrong but I might have some 
> pointers.
> 
>  From what I understand, tdesc_use_registers adds the registers listed in 
> the target description to a hash table, and then removes some of those 
> same registers that are also specified by the architecture, so it's left 
> with the registers for which we need to assign a number.  The hash table 
> hash the pointer itself, it does not look at what it points to.
> 
> I added some prints where we add and remove the registers from the htab. 
>   For rax, it looks good:
> 
> ADDING 0x237a510 rax
> REMOVING 0x237a510 rax
> 
> We add and remov the same pointer.  For fs_base, the pointers are 
> different:
> 
> ADDING 0x237d840 fs_base
> REMOVING 0x23a5d70 fs_base
> 
> It suggests that something is wrong here, I would expect those two 
> pointers to be equal.  I don't know enough about how the reg objects are 
> created to know why it this happens.

I'm not sure why these should actually be equal at all.  In theory we
are resolving two different target descriptions which should have each
called tdesc_create_reg().  I don't see anything that follows a
singleton-like pattern so that if two tdesc's create the same register
with the same name they point to the same 'struct tdesc_reg *' though
that seems to be what is happening for other registers other than
fs_base and gs_base.

I noticed that amd64_init_abi() in amd64-tdep.c invokes
tdesc_numbered_register earlier than is done for other registers on x86.
In particular, all the other registers are "added" via
tdesc_numbered_register in i386_validate_tdesc() which is called after
gdbarch_init_abi() (and thus after any OS-dependent hooks have had a
chance to complete).  On a whim I tried deferring adding fs_base and
gs_base until i386_validate_tdesc().  This does seem to fix the crash
for me on a CentOS 7 VM I have lying around.  The fs_base and gs_base
registers still work for me on FreeBSD.  They do not show up in
info registers on the CentOS VM, but perhaps it is too old to have
the relevant ptrace ops (I know it's too old to have the updated
struct user_reg).  What I don't really understand though is why this
works.  I also don't fully understand why 'data->arch_regs' is supposed
to always hold the same pointer values as in 'target_desc' in
tdesc_use_registers().

diff --git a/gdb/amd64-tdep.c b/gdb/amd64-tdep.c
index 9ff7dfc513..3196ef75a1 100644
--- a/gdb/amd64-tdep.c
+++ b/gdb/amd64-tdep.c
@@ -3061,15 +3061,7 @@ amd64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 
   if (tdesc_find_feature (tdesc, "org.gnu.gdb.i386.segments") != NULL)
     {
-      const struct tdesc_feature *feature =
-	  tdesc_find_feature (tdesc, "org.gnu.gdb.i386.segments");
-      struct tdesc_arch_data *tdesc_data_segments =
-	  (struct tdesc_arch_data *) info.tdep_info;
-
-      tdesc_numbered_register (feature, tdesc_data_segments,
-		       AMD64_FSBASE_REGNUM, "fs_base");
-      tdesc_numbered_register (feature, tdesc_data_segments,
-		       AMD64_GSBASE_REGNUM, "gs_base");
+      tdep->fsbase_regnum = AMD64_FSBASE_REGNUM;
     }
 
   if (tdesc_find_feature (tdesc, "org.gnu.gdb.i386.pkeys") != NULL)
diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c
index bd728f03dc..1c8263cc87 100644
--- a/gdb/i386-tdep.c
+++ b/gdb/i386-tdep.c
@@ -8199,7 +8199,7 @@ i386_validate_tdesc_p (struct gdbarch_tdep *tdep,
   const struct tdesc_feature *feature_core;
 
   const struct tdesc_feature *feature_sse, *feature_avx, *feature_mpx,
-			     *feature_avx512, *feature_pkeys;
+    *feature_avx512, *feature_pkeys, *feature_segments;
   int i, num_regs, valid_p;
 
   if (! tdesc_has_registers (tdesc))
@@ -8225,6 +8225,9 @@ i386_validate_tdesc_p (struct gdbarch_tdep *tdep,
   /* Try PKEYS  */
   feature_pkeys = tdesc_find_feature (tdesc, "org.gnu.gdb.i386.pkeys");
 
+  /* Try segment base registers.  */
+  feature_segments = tdesc_find_feature (tdesc, "org.gnu.gdb.i386.segments");
+
   valid_p = 1;
 
   /* The XCR0 bits.  */
@@ -8347,6 +8350,14 @@ i386_validate_tdesc_p (struct gdbarch_tdep *tdep,
 					    tdep->pkeys_register_names[i]);
     }
 
+  if (feature_segments && tdep->fsbase_regnum >= 0)
+    {
+      valid_p &= tdesc_numbered_register (feature_segments, tdesc_data,
+					  tdep->fsbase_regnum, "fs_base");
+      valid_p &= tdesc_numbered_register (feature_segments, tdesc_data,
+					  tdep->fsbase_regnum + 1, "gs_base");
+    }
+
   return valid_p;
 }
 
@@ -8591,6 +8602,9 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   tdep->pkru_regnum = -1;
   tdep->num_pkeys_regs = 0;
 
+  /* No segment base registers. */
+  tdep->fsbase_regnum = -1;
+
   tdesc_data = tdesc_data_alloc ();
 
   set_gdbarch_relocate_instruction (gdbarch, i386_relocate_instruction);
diff --git a/gdb/i386-tdep.h b/gdb/i386-tdep.h
index 1ce89fcf65..a887a47752 100644
--- a/gdb/i386-tdep.h
+++ b/gdb/i386-tdep.h
@@ -198,6 +198,10 @@ struct gdbarch_tdep
   /* PKEYS register names.  */
   const char **pkeys_register_names;
 
+  /* Register number for %fs_base.  Set this to -1 indicate the absence of
+     segment base registers.  */
+  int fsbase_regnum;
+
   /* Target description.  */
   const struct target_desc *tdesc;
 

-- 
John Baldwin

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 1/2] Include the fs_base and gs_base registers in amd64 target descriptions.
  2017-07-12 20:03           ` John Baldwin
@ 2017-07-13 16:55             ` Yao Qi
  2017-07-13 17:04               ` John Baldwin
  2017-07-13 18:40               ` Pedro Alves
  0 siblings, 2 replies; 18+ messages in thread
From: Yao Qi @ 2017-07-13 16:55 UTC (permalink / raw)
  To: John Baldwin; +Cc: gdb-patches, Simon Marchi, Phil Muldoon

John Baldwin <jhb@freebsd.org> writes:

> I'm not sure why these should actually be equal at all.  In theory we
> are resolving two different target descriptions which should have each
> called tdesc_create_reg().  I don't see anything that follows a
> singleton-like pattern so that if two tdesc's create the same register
> with the same name they point to the same 'struct tdesc_reg *' though
> that seems to be what is happening for other registers other than
> fs_base and gs_base.

The tdesc_reg is created for each target description, so there are
multiple tdesc_reg objects created.  That is, the tdesc_reg of "fs_base"
are different among these tdesc_amd64_*_linux.  However, the tdesc_reg
is a singleton in each target description.  Note that we can't use
singleton for each register globally, because tdesc_reg.target_regnum
can be different in different target descriptions.  For example,
fs_base's regnum is 57 in "bare-metal" amd64 target descriptions, while
it is 58 in "linux" amd64 target descriptions, because of 64bit-linux.xml.

>
> I noticed that amd64_init_abi() in amd64-tdep.c invokes
> tdesc_numbered_register earlier than is done for other registers on x86.
> In particular, all the other registers are "added" via
> tdesc_numbered_register in i386_validate_tdesc() which is called after
> gdbarch_init_abi() (and thus after any OS-dependent hooks have had a
> chance to complete).  On a whim I tried deferring adding fs_base and
> gs_base until i386_validate_tdesc().  This does seem to fix the crash
> for me on a CentOS 7 VM I have lying around.  The fs_base and gs_base
> registers still work for me on FreeBSD.  They do not show up in
> info registers on the CentOS VM, but perhaps it is too old to have
> the relevant ptrace ops (I know it's too old to have the updated

Your patch fixes the crash, but I can't see fs_base and gs_base on my
machine either.

> struct user_reg).  What I don't really understand though is why this
> works.  I also don't fully understand why 'data->arch_regs' is supposed
> to always hold the same pointer values as in 'target_desc' in
> tdesc_use_registers().

because each tdesc_reg is a singleton among the target description.  The
reason Simon observed that we have different "fs_base" tdesc_reg added
and removed from the hash table is that they are from different target
descriptions.  GDB crashes in tdesc_use_registers.  The arguments tdesc
and tdesc_data are not consistent, tdesc is amd64 linux target
description, but tdesc_data was got when tdesc is amd64 target
description, so the tdesc_reg in tdesc_data are from amd64 target
description as well.  So, we push a "fs_base" from one target
description and want to remove a "fs_base" from another target
description.

Does this answer your question?  I think maybe there is some "better"
fix that is to keep tdesc and tdes_data consistent.  However, I don't
think it further.  Since current GDB trunk is unusable on x86_64-linux,
it is better get a fix soon.

>
> diff --git a/gdb/amd64-tdep.c b/gdb/amd64-tdep.c
> index 9ff7dfc513..3196ef75a1 100644
> --- a/gdb/amd64-tdep.c
> +++ b/gdb/amd64-tdep.c
> @@ -3061,15 +3061,7 @@ amd64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>  
>    if (tdesc_find_feature (tdesc, "org.gnu.gdb.i386.segments") != NULL)
>      {
> -      const struct tdesc_feature *feature =
> -	  tdesc_find_feature (tdesc, "org.gnu.gdb.i386.segments");
> -      struct tdesc_arch_data *tdesc_data_segments =
> -	  (struct tdesc_arch_data *) info.tdep_info;
> -
> -      tdesc_numbered_register (feature, tdesc_data_segments,
> -		       AMD64_FSBASE_REGNUM, "fs_base");
> -      tdesc_numbered_register (feature, tdesc_data_segments,
> -		       AMD64_GSBASE_REGNUM, "gs_base");
> +      tdep->fsbase_regnum = AMD64_FSBASE_REGNUM;
>      }
>  

There is one line, so braces are not needed.

>    if (tdesc_find_feature (tdesc, "org.gnu.gdb.i386.pkeys") != NULL)
> diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c
> index bd728f03dc..1c8263cc87 100644
> --- a/gdb/i386-tdep.c
> +++ b/gdb/i386-tdep.c
> @@ -8199,7 +8199,7 @@ i386_validate_tdesc_p (struct gdbarch_tdep *tdep,
>    const struct tdesc_feature *feature_core;
>  
>    const struct tdesc_feature *feature_sse, *feature_avx, *feature_mpx,
> -			     *feature_avx512, *feature_pkeys;
> +    *feature_avx512, *feature_pkeys, *feature_segments;

Indentation looks wrong.  Did you run regression test on x86_64-linux?

-- 
Yao (齐尧)

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 1/2] Include the fs_base and gs_base registers in amd64 target descriptions.
  2017-07-13 16:55             ` Yao Qi
@ 2017-07-13 17:04               ` John Baldwin
  2017-07-13 18:40               ` Pedro Alves
  1 sibling, 0 replies; 18+ messages in thread
From: John Baldwin @ 2017-07-13 17:04 UTC (permalink / raw)
  To: Yao Qi; +Cc: gdb-patches, Simon Marchi, Phil Muldoon

On Thursday, July 13, 2017 05:55:06 PM Yao Qi wrote:
> John Baldwin <jhb@freebsd.org> writes:
> Your patch fixes the crash, but I can't see fs_base and gs_base on my
> machine either.

Ok.  I assume yours is newer than my (ancient) VM and thus this patch
doesn't work.
 
> > struct user_reg).  What I don't really understand though is why this
> > works.  I also don't fully understand why 'data->arch_regs' is supposed
> > to always hold the same pointer values as in 'target_desc' in
> > tdesc_use_registers().
> 
> because each tdesc_reg is a singleton among the target description.  The
> reason Simon observed that we have different "fs_base" tdesc_reg added
> and removed from the hash table is that they are from different target
> descriptions.  GDB crashes in tdesc_use_registers.  The arguments tdesc
> and tdesc_data are not consistent, tdesc is amd64 linux target
> description, but tdesc_data was got when tdesc is amd64 target
> description, so the tdesc_reg in tdesc_data are from amd64 target
> description as well.  So, we push a "fs_base" from one target
> description and want to remove a "fs_base" from another target
> description.
> 
> Does this answer your question?  I think maybe there is some "better"
> fix that is to keep tdesc and tdes_data consistent.  However, I don't
> think it further.  Since current GDB trunk is unusable on x86_64-linux,
> it is better get a fix soon.

Ok.  I think then that the hash table in tdesc_use_registers shouldn't
be using the 'tdesc_reg' as the key but instead use the register name?
This should be fairly simple to implement via a std::unordered_map<>.
I'll try that in a bit, but if that doesn't resolve it we should revert
the commits until we have a real fix.

-- 
John Baldwin

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 1/2] Include the fs_base and gs_base registers in amd64 target descriptions.
  2017-07-13 16:55             ` Yao Qi
  2017-07-13 17:04               ` John Baldwin
@ 2017-07-13 18:40               ` Pedro Alves
  2017-07-13 19:59                 ` Pedro Alves
  1 sibling, 1 reply; 18+ messages in thread
From: Pedro Alves @ 2017-07-13 18:40 UTC (permalink / raw)
  To: Yao Qi, John Baldwin; +Cc: gdb-patches, Simon Marchi, Phil Muldoon

On 07/13/2017 05:55 PM, Yao Qi wrote:

> because each tdesc_reg is a singleton among the target description.  The
> reason Simon observed that we have different "fs_base" tdesc_reg added
> and removed from the hash table is that they are from different target
> descriptions.  GDB crashes in tdesc_use_registers.  The arguments tdesc
> and tdesc_data are not consistent, tdesc is amd64 linux target
> description, but tdesc_data was got when tdesc is amd64 target
> description, so the tdesc_reg in tdesc_data are from amd64 target
> description as well.  So, we push a "fs_base" from one target
> description and want to remove a "fs_base" from another target
> description.
> 
> Does this answer your question?  I think maybe there is some "better"
> fix that is to keep tdesc and tdes_data consistent.  However, I don't
> think it further.  Since current GDB trunk is unusable on x86_64-linux,
> it is better get a fix soon.

Yeah.  It seems to me that the problem is that
amd64_linux_init_abi uses amd64_init_abi as helper, but
they don't coordinate on which fallback tdesc to use.

So amd64_init_abi does:

  if (! tdesc_has_registers (tdesc))
    tdesc = tdesc_amd64;

and creates a register in the "tdesc_amd64" architecture.

and then after, amd64_linux_init_abi does:

  if (! tdesc_has_registers (tdesc))
    tdesc = tdesc_amd64_linux;
  tdep->tdesc = tdesc;

But when amd64_init_abi is being called as helper, it should
fallback to tdesc_amd64_linux instead.

Notice that amd64_linux_init_abi also calls tdesc_numbered_register,
for orig_rax.  So if some other foo_init_abi routine would use 
amd64_linux_init_abi as helper, then that tdesc_numbered_register call
would be problematic in the same way.

It seems to me that the proper fix is to make sure
that amd64_linux_init_abi and amd64_init_abi agree.  Something like
this patch below.  Fixes the crash for me.

From d5775b549291675d9bb5c095b837eca16733aa61 Mon Sep 17 00:00:00 2001
From: Pedro Alves <palves@redhat.com>
Date: Thu, 13 Jul 2017 19:09:13 +0100
Subject: [PATCH] fix

---
 gdb/amd64-linux-tdep.c |  9 +++------
 gdb/amd64-tdep.c       | 16 ++++++++--------
 gdb/amd64-tdep.h       |  5 ++++-
 3 files changed, 15 insertions(+), 15 deletions(-)

diff --git a/gdb/amd64-linux-tdep.c b/gdb/amd64-linux-tdep.c
index 4ef0f78..7863d58 100644
--- a/gdb/amd64-linux-tdep.c
+++ b/gdb/amd64-linux-tdep.c
@@ -1863,7 +1863,6 @@ static void
 amd64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
-  const struct target_desc *tdesc = info.target_desc;
   struct tdesc_arch_data *tdesc_data
     = (struct tdesc_arch_data *) info.tdep_info;
   const struct tdesc_feature *feature;
@@ -1875,15 +1874,13 @@ amd64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
   tdep->gregset_num_regs = ARRAY_SIZE (amd64_linux_gregset_reg_offset);
   tdep->sizeof_gregset = 27 * 8;
 
-  amd64_init_abi (info, gdbarch);
+  amd64_init_abi (info, gdbarch, tdesc_amd64_linux);
+
+  const target_desc *tdesc = tdep->tdesc;
 
   /* Reserve a number for orig_rax.  */
   set_gdbarch_num_regs (gdbarch, AMD64_LINUX_NUM_REGS);
 
-  if (! tdesc_has_registers (tdesc))
-    tdesc = tdesc_amd64_linux;
-  tdep->tdesc = tdesc;
-
   feature = tdesc_find_feature (tdesc, "org.gnu.gdb.i386.linux");
   if (feature == NULL)
     return;
diff --git a/gdb/amd64-tdep.c b/gdb/amd64-tdep.c
index 9ff7dfc..de89f95 100644
--- a/gdb/amd64-tdep.c
+++ b/gdb/amd64-tdep.c
@@ -3005,7 +3005,8 @@ static const int amd64_record_regmap[] =
 };
 
 void
-amd64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
+amd64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch,
+		target_desc *default_tdesc)
 {
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
   const struct target_desc *tdesc = info.target_desc;
@@ -3022,7 +3023,11 @@ amd64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
   tdep->fpregset = &amd64_fpregset;
 
   if (! tdesc_has_registers (tdesc))
-    tdesc = tdesc_amd64;
+    {
+      if (default_tdesc == NULL)
+	default_tdesc = tdesc_amd64;
+      tdesc = default_tdesc;
+    }
   tdep->tdesc = tdesc;
 
   tdep->num_core_regs = AMD64_NUM_GREGS + I387_NUM_REGS;
@@ -3199,13 +3204,8 @@ void
 amd64_x32_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
-  const struct target_desc *tdesc = info.target_desc;
 
-  amd64_init_abi (info, gdbarch);
-
-  if (! tdesc_has_registers (tdesc))
-    tdesc = tdesc_x32;
-  tdep->tdesc = tdesc;
+  amd64_init_abi (info, gdbarch, tdesc_x32);
 
   tdep->num_dword_regs = 17;
   set_tdesc_pseudo_register_type (gdbarch, amd64_x32_pseudo_register_type);
diff --git a/gdb/amd64-tdep.h b/gdb/amd64-tdep.h
index 87f0ba3..9f946af 100644
--- a/gdb/amd64-tdep.h
+++ b/gdb/amd64-tdep.h
@@ -97,7 +97,10 @@ extern void amd64_displaced_step_fixup (struct gdbarch *gdbarch,
 					CORE_ADDR from, CORE_ADDR to,
 					struct regcache *regs);
 
-extern void amd64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch);
+extern void amd64_init_abi (struct gdbarch_info info,
+			    struct gdbarch *gdbarch,
+			    target_desc *default_tdesc = NULL);
+
 extern void amd64_x32_init_abi (struct gdbarch_info info,
 				struct gdbarch *gdbarch);
 extern const struct target_desc *amd64_target_description (uint64_t xcr0);
-- 
2.5.5


^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 1/2] Include the fs_base and gs_base registers in amd64 target descriptions.
  2017-07-13 18:40               ` Pedro Alves
@ 2017-07-13 19:59                 ` Pedro Alves
  0 siblings, 0 replies; 18+ messages in thread
From: Pedro Alves @ 2017-07-13 19:59 UTC (permalink / raw)
  To: Yao Qi, John Baldwin; +Cc: gdb-patches, Simon Marchi, Phil Muldoon

On 07/13/2017 07:40 PM, Pedro Alves wrote:

> It seems to me that the proper fix is to make sure
> that amd64_linux_init_abi and amd64_init_abi agree.  Something like
> this patch below.  Fixes the crash for me.

OK, as discussed on IRC, I've pushed this in.

From c55a47e7237ebac17df73183d214d90400a49455 Mon Sep 17 00:00:00 2001
From: Pedro Alves <palves@redhat.com>
Date: Thu, 13 Jul 2017 20:56:42 +0100
Subject: [PATCH] Fix x86-64 GNU/Linux crashes

Ref: https://sourceware.org/ml/gdb-patches/2017-07/msg00162.html

Debugging x86-64 GNU/Linux programs currently crashes GDB in
tdesc_use_registers during gdbarch initialization:

  Program received signal SIGSEGV, Segmentation fault.
  0x0000000001093eaf in htab_remove_elt_with_hash (htab=0x2ef9fa0, element=0x26af960, hash=557151073) at src/libiberty/hashtab.c:728
  728       if (*slot == HTAB_EMPTY_ENTRY)
  (top-gdb) p slot
  $1 = (void **) 0x0
  (top-gdb) bt
  #0  0x0000000001093eaf in htab_remove_elt_with_hash (htab=0x2ef9fa0, element=0x26af960, hash=557151073) at src/libiberty/hashtab.c:728
  #1  0x0000000001093e79 in htab_remove_elt (htab=0x2ef9fa0, element=0x26af960) at src/libiberty/hashtab.c:714
  #2  0x00000000009121b0 in tdesc_use_registers (gdbarch=0x3001240, target_desc=0x2659cb0, early_data=0x2881cb0)
      at src/gdb/target-descriptions.c:1328
  #3  0x000000000047c93e in i386_gdbarch_init (info=..., arches=0x0) at src/gdb/i386-tdep.c:8634
  #4  0x0000000000818d5f in gdbarch_find_by_info (info=...) at src/gdb/gdbarch.c:5394
  #5  0x00000000007198a8 in set_gdbarch_from_file (abfd=0x2f48250) at src/gdb/arch-utils.c:618
  #6  0x00000000007f21cb in exec_file_attach (filename=0x7fffffffddb0 "/home/pedro/gdb/tests/threads", from_tty=1) at src/gdb/exec.c:380
  #7  0x0000000000865c18 in catch_command_errors_const (command=0x7f1d83 <exec_file_attach(char const*, int)>, arg=0x7fffffffddb0 "/home/pedro/gdb/tests/threads",
      from_tty=1) at src/gdb/main.c:403
  #8  0x00000000008669cf in captured_main_1 (context=0x7fffffffd860) at src/gdb/main.c:1035
  #9  0x0000000000866de2 in captured_main (data=0x7fffffffd860) at src/gdb/main.c:1142
  #10 0x0000000000866e24 in gdb_main (args=0x7fffffffd860) at src/gdb/main.c:1160
  #11 0x000000000041312d in main (argc=3, argv=0x7fffffffd968) at src/gdb/gdb.c:32

The direct cause of the crash is that we tried to remove an element
from the hash which supposedly exists, but does not.  (htab_remove_elt
shouldn't really crash in this case, but that's secondary.)

The real problem is that early_data passed to tdesc_use_registers
includes regs from a target description that is not the target_desc,
which violates its assumptions.  The registers in question are the
fs_base/gs_base registers, added by amd64_init_abi:

      tdesc_numbered_register (feature, tdesc_data_segments,
		       AMD64_FSBASE_REGNUM, "fs_base");
      tdesc_numbered_register (feature, tdesc_data_segments,
		       AMD64_GSBASE_REGNUM, "gs_base");

and that happens because amd64_linux_init_abi uses amd64_init_abi as
helper, but they don't coordinate on which fallback tdesc to use.

amd64_init_abi does:

  if (! tdesc_has_registers (tdesc))
    tdesc = tdesc_amd64;

and then adds the fs_base/gs_base registers of the "tdesc_amd64" tdesc
to the tdesc_arch_data.

After amd64_init_abi returns, amd64_linux_init_abi does:

  if (! tdesc_has_registers (tdesc))
    tdesc = tdesc_amd64_linux;
  tdep->tdesc = tdesc;

and we end up tdesc_amd64_linux installed in tdep->tdesc.

The fix is to make sure that amd64_linux_init_abi and amd64_init_abi
agree on default tdesc, by adding a "default tdesc" parameter to
amd64_init_abi, instead of having amd64_init_abi hardcode a default.
With this, amd64_init_abi creates the fs_base/gs_base registers using
the tdesc_amd64_linux tdesc.

Tested on x86-64 GNU/Linux, -m64.  I don't have an x32 setup handy.

Thanks to John Baldwin, Yao Qi and Simon Marchi for the investigation.

gdb/ChangeLog:
2017-07-13  Pedro Alves  <palves@redhat.com>

	* amd64-darwin-tdep.c (x86_darwin_init_abi_64): Pass tdesc_amd64
	as default tdesc.
	* amd64-dicos-tdep.c (amd64_dicos_init_abi):
	* amd64-fbsd-tdep.c (amd64fbsd_init_abi):
	* amd64-linux-tdep.c (amd64_linux_init_abi): Pass
	tdesc_amd64_linux as default tdesc.  Get final tdesc from the
	tdep.
	(amd64_x32_linux_init_abi): Pass tdesc_x32_linux as default tdesc.
	Get final tdesc from the tdep.
	* amd64-nbsd-tdep.c (amd64nbsd_init_abi): Pass tdesc_amd64 as
	default tdesc.
	* amd64-obsd-tdep.c (amd64obsd_init_abi): Likewise.
	* amd64-sol2-tdep.c (amd64_sol2_init_abi): Likewise.
	* amd64-tdep.c (amd64_init_abi): Add 'default_tdesc' parameter.
	Use it as default tdesc.
	(amd64_x32_init_abi): Add 'default_tdesc' parameter, and pass it
	down to amd_init_abi.  No longer handle fallback tdesc here.
	* amd64-tdep.h (tdesc_x32): Declare.
	(amd64_init_abi, amd64_x32_init_abi): Add 'default_tdesc'
	parameter.
	* amd64-windows-tdep.c (amd64_windows_init_abi): Pass tdesc_amd64
	as default tdesc.
---
 gdb/ChangeLog            | 25 +++++++++++++++++++++++++
 gdb/amd64-darwin-tdep.c  |  2 +-
 gdb/amd64-dicos-tdep.c   |  2 +-
 gdb/amd64-fbsd-tdep.c    |  2 +-
 gdb/amd64-linux-tdep.c   | 16 +++++-----------
 gdb/amd64-nbsd-tdep.c    |  2 +-
 gdb/amd64-obsd-tdep.c    |  2 +-
 gdb/amd64-sol2-tdep.c    |  2 +-
 gdb/amd64-tdep.c         | 15 ++++++---------
 gdb/amd64-tdep.h         | 13 +++++++++++--
 gdb/amd64-windows-tdep.c |  2 +-
 11 files changed, 54 insertions(+), 29 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 37fe06e..3210957 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,28 @@
+2017-07-13  Pedro Alves  <palves@redhat.com>
+
+	* amd64-darwin-tdep.c (x86_darwin_init_abi_64): Pass tdesc_amd64
+	as default tdesc.
+	* amd64-dicos-tdep.c (amd64_dicos_init_abi):
+	* amd64-fbsd-tdep.c (amd64fbsd_init_abi):
+	* amd64-linux-tdep.c (amd64_linux_init_abi): Pass
+	tdesc_amd64_linux as default tdesc.  Get final tdesc from the
+	tdep.
+	(amd64_x32_linux_init_abi): Pass tdesc_x32_linux as default tdesc.
+	Get final tdesc from the tdep.
+	* amd64-nbsd-tdep.c (amd64nbsd_init_abi): Pass tdesc_amd64 as
+	default tdesc.
+	* amd64-obsd-tdep.c (amd64obsd_init_abi): Likewise.
+	* amd64-sol2-tdep.c (amd64_sol2_init_abi): Likewise.
+	* amd64-tdep.c (amd64_init_abi): Add 'default_tdesc' parameter.
+	Use it as default tdesc.
+	(amd64_x32_init_abi): Add 'default_tdesc' parameter, and pass it
+	down to amd_init_abi.  No longer handle fallback tdesc here.
+	* amd64-tdep.h (tdesc_x32): Declare.
+	(amd64_init_abi, amd64_x32_init_abi): Add 'default_tdesc'
+	parameter.
+	* amd64-windows-tdep.c (amd64_windows_init_abi): Pass tdesc_amd64
+	as default tdesc.
+
 2017-07-13  Andreas Arnez  <arnez@linux.vnet.ibm.com>
 
 	* s390-linux-tdep.c (s390_process_record): Add support for
diff --git a/gdb/amd64-darwin-tdep.c b/gdb/amd64-darwin-tdep.c
index db400cd..be26d9e 100644
--- a/gdb/amd64-darwin-tdep.c
+++ b/gdb/amd64-darwin-tdep.c
@@ -99,7 +99,7 @@ x86_darwin_init_abi_64 (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
 
-  amd64_init_abi (info, gdbarch);
+  amd64_init_abi (info, gdbarch, tdesc_amd64);
 
   tdep->struct_return = reg_struct_return;
 
diff --git a/gdb/amd64-dicos-tdep.c b/gdb/amd64-dicos-tdep.c
index ee40891..7bdb167 100644
--- a/gdb/amd64-dicos-tdep.c
+++ b/gdb/amd64-dicos-tdep.c
@@ -25,7 +25,7 @@
 static void
 amd64_dicos_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  amd64_init_abi (info, gdbarch);
+  amd64_init_abi (info, gdbarch, tdesc_amd64);
 
   dicos_init_abi (gdbarch);
 }
diff --git a/gdb/amd64-fbsd-tdep.c b/gdb/amd64-fbsd-tdep.c
index 48bb209..ad4d787 100644
--- a/gdb/amd64-fbsd-tdep.c
+++ b/gdb/amd64-fbsd-tdep.c
@@ -217,7 +217,7 @@ amd64fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
   tdep->gregset_num_regs = ARRAY_SIZE (amd64fbsd_r_reg_offset);
   tdep->sizeof_gregset = 22 * 8;
 
-  amd64_init_abi (info, gdbarch);
+  amd64_init_abi (info, gdbarch, tdesc_amd64);
 
   tdep->sigtramp_p = amd64fbsd_sigtramp_p;
   tdep->sigtramp_start = amd64fbsd_sigtramp_start_addr;
diff --git a/gdb/amd64-linux-tdep.c b/gdb/amd64-linux-tdep.c
index 4ef0f78..cf24789 100644
--- a/gdb/amd64-linux-tdep.c
+++ b/gdb/amd64-linux-tdep.c
@@ -1863,7 +1863,6 @@ static void
 amd64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
-  const struct target_desc *tdesc = info.target_desc;
   struct tdesc_arch_data *tdesc_data
     = (struct tdesc_arch_data *) info.tdep_info;
   const struct tdesc_feature *feature;
@@ -1875,15 +1874,13 @@ amd64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
   tdep->gregset_num_regs = ARRAY_SIZE (amd64_linux_gregset_reg_offset);
   tdep->sizeof_gregset = 27 * 8;
 
-  amd64_init_abi (info, gdbarch);
+  amd64_init_abi (info, gdbarch, tdesc_amd64_linux);
+
+  const target_desc *tdesc = tdep->tdesc;
 
   /* Reserve a number for orig_rax.  */
   set_gdbarch_num_regs (gdbarch, AMD64_LINUX_NUM_REGS);
 
-  if (! tdesc_has_registers (tdesc))
-    tdesc = tdesc_amd64_linux;
-  tdep->tdesc = tdesc;
-
   feature = tdesc_find_feature (tdesc, "org.gnu.gdb.i386.linux");
   if (feature == NULL)
     return;
@@ -2080,7 +2077,6 @@ static void
 amd64_x32_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
-  const struct target_desc *tdesc = info.target_desc;
   struct tdesc_arch_data *tdesc_data
     = (struct tdesc_arch_data *) info.tdep_info;
   const struct tdesc_feature *feature;
@@ -2092,14 +2088,12 @@ amd64_x32_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
   tdep->gregset_num_regs = ARRAY_SIZE (amd64_linux_gregset_reg_offset);
   tdep->sizeof_gregset = 27 * 8;
 
-  amd64_x32_init_abi (info, gdbarch);
+  amd64_x32_init_abi (info, gdbarch, tdesc_x32_linux);
 
   /* Reserve a number for orig_rax.  */
   set_gdbarch_num_regs (gdbarch, AMD64_LINUX_NUM_REGS);
 
-  if (! tdesc_has_registers (tdesc))
-    tdesc = tdesc_x32_linux;
-  tdep->tdesc = tdesc;
+  const target_desc *tdesc = tdep->tdesc;
 
   feature = tdesc_find_feature (tdesc, "org.gnu.gdb.i386.linux");
   if (feature == NULL)
diff --git a/gdb/amd64-nbsd-tdep.c b/gdb/amd64-nbsd-tdep.c
index db6f19f..02bf427 100644
--- a/gdb/amd64-nbsd-tdep.c
+++ b/gdb/amd64-nbsd-tdep.c
@@ -103,7 +103,7 @@ amd64nbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
   tdep->gregset_num_regs = ARRAY_SIZE (amd64nbsd_r_reg_offset);
   tdep->sizeof_gregset = 26 * 8;
 
-  amd64_init_abi (info, gdbarch);
+  amd64_init_abi (info, gdbarch, tdesc_amd64);
 
   tdep->jb_pc_offset = 7 * 8;
 
diff --git a/gdb/amd64-obsd-tdep.c b/gdb/amd64-obsd-tdep.c
index 72895b6..ad90c20 100644
--- a/gdb/amd64-obsd-tdep.c
+++ b/gdb/amd64-obsd-tdep.c
@@ -419,7 +419,7 @@ amd64obsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
 
-  amd64_init_abi (info, gdbarch);
+  amd64_init_abi (info, gdbarch, tdesc_amd64);
   obsd_init_abi (info, gdbarch);
 
   /* Initialize general-purpose register set details.  */
diff --git a/gdb/amd64-sol2-tdep.c b/gdb/amd64-sol2-tdep.c
index 51fe9db..ca474db 100644
--- a/gdb/amd64-sol2-tdep.c
+++ b/gdb/amd64-sol2-tdep.c
@@ -99,7 +99,7 @@ amd64_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
   tdep->gregset_num_regs = ARRAY_SIZE (amd64_sol2_gregset_reg_offset);
   tdep->sizeof_gregset = 28 * 8;
 
-  amd64_init_abi (info, gdbarch);
+  amd64_init_abi (info, gdbarch, tdesc_amd64);
 
   tdep->sigtramp_p = amd64_sol2_sigtramp_p;
   tdep->sigcontext_addr = amd64_sol2_mcontext_addr;
diff --git a/gdb/amd64-tdep.c b/gdb/amd64-tdep.c
index 9ff7dfc..6171bc5 100644
--- a/gdb/amd64-tdep.c
+++ b/gdb/amd64-tdep.c
@@ -3005,7 +3005,8 @@ static const int amd64_record_regmap[] =
 };
 
 void
-amd64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
+amd64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch,
+		target_desc *default_tdesc)
 {
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
   const struct target_desc *tdesc = info.target_desc;
@@ -3022,7 +3023,7 @@ amd64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
   tdep->fpregset = &amd64_fpregset;
 
   if (! tdesc_has_registers (tdesc))
-    tdesc = tdesc_amd64;
+    tdesc = default_tdesc;
   tdep->tdesc = tdesc;
 
   tdep->num_core_regs = AMD64_NUM_GREGS + I387_NUM_REGS;
@@ -3196,16 +3197,12 @@ amd64_x32_pseudo_register_type (struct gdbarch *gdbarch, int regnum)
 }
 
 void
-amd64_x32_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
+amd64_x32_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch,
+		    target_desc *default_tdesc)
 {
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
-  const struct target_desc *tdesc = info.target_desc;
-
-  amd64_init_abi (info, gdbarch);
 
-  if (! tdesc_has_registers (tdesc))
-    tdesc = tdesc_x32;
-  tdep->tdesc = tdesc;
+  amd64_init_abi (info, gdbarch, default_tdesc);
 
   tdep->num_dword_regs = 17;
   set_tdesc_pseudo_register_type (gdbarch, amd64_x32_pseudo_register_type);
diff --git a/gdb/amd64-tdep.h b/gdb/amd64-tdep.h
index 87f0ba3..d4c6c9a 100644
--- a/gdb/amd64-tdep.h
+++ b/gdb/amd64-tdep.h
@@ -88,6 +88,7 @@ enum amd64_regnum
 #define AMD64_NUM_REGS		(AMD64_GSBASE_REGNUM + 1)
 
 extern struct target_desc *tdesc_amd64;
+extern struct target_desc *tdesc_x32;
 
 extern struct displaced_step_closure *amd64_displaced_step_copy_insn
   (struct gdbarch *gdbarch, CORE_ADDR from, CORE_ADDR to,
@@ -97,9 +98,17 @@ extern void amd64_displaced_step_fixup (struct gdbarch *gdbarch,
 					CORE_ADDR from, CORE_ADDR to,
 					struct regcache *regs);
 
-extern void amd64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch);
+/* Initialize the ABI for amd64.  Uses DEFAULT_TDESC as fallback
+   tdesc, if INFO does not specify one.  */
+extern void amd64_init_abi (struct gdbarch_info info,
+			    struct gdbarch *gdbarch,
+			    target_desc *default_tdesc);
+
+/* Initialize the ABI for x32.  Uses DEFAULT_TDESC as fallback tdesc,
+   if INFO does not specify one.  */
 extern void amd64_x32_init_abi (struct gdbarch_info info,
-				struct gdbarch *gdbarch);
+				struct gdbarch *gdbarch,
+				target_desc *default_tdesc);
 extern const struct target_desc *amd64_target_description (uint64_t xcr0);
 
 /* Fill register REGNUM in REGCACHE with the appropriate
diff --git a/gdb/amd64-windows-tdep.c b/gdb/amd64-windows-tdep.c
index f1acdb9..9158282 100644
--- a/gdb/amd64-windows-tdep.c
+++ b/gdb/amd64-windows-tdep.c
@@ -1224,7 +1224,7 @@ amd64_windows_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
   */
   frame_unwind_append_unwinder (gdbarch, &amd64_windows_frame_unwind);
 
-  amd64_init_abi (info, gdbarch);
+  amd64_init_abi (info, gdbarch, tdesc_amd64);
 
   windows_init_abi (info, gdbarch);
 
-- 
2.5.5

^ permalink raw reply	[flat|nested] 18+ messages in thread

* [PATCH 0/2] Support fs_base and gs_base for native FreeBSD/amd64
@ 2017-06-27 12:19 John Baldwin
  0 siblings, 0 replies; 18+ messages in thread
From: John Baldwin @ 2017-06-27 12:19 UTC (permalink / raw)
  To: gdb-patches

I did not add the fs_base and gs_base registers to the x32 descriptions
since I'm not aware of a platform supporting x32 other than Linux.

On the other hand, I wonder if we shouldn't just add fs_base and gs_base
to the "core" descriptions alongside "fs" and "gs" rather than using a
separate feature if they are always going to be present.

The manual dependencies for the various x86 regformat data files have
several inconsistencies (missing dependencies or in some cases wrong
dependencies), but I didn't do a fixup of those since Yao's patches
are going to replace all that anyway.

John Baldwin (2):
  Include the fs_base and gs_base registers in amd64 target
    descriptions.
  Support the fs_base and gs_base registers on FreeBSD/amd64 native
    processes.

 gdb/ChangeLog                                    |  32 ++++
 gdb/amd64-bsd-nat.c                              |  54 +++++++
 gdb/features/Makefile                            |  14 +-
 gdb/features/i386/amd64-avx-avx512.c             | 180 +++++++++++----------
 gdb/features/i386/amd64-avx-avx512.xml           |   1 +
 gdb/features/i386/amd64-avx-mpx-avx512-pku.c     | 194 ++++++++++++-----------
 gdb/features/i386/amd64-avx-mpx-avx512-pku.xml   |   1 +
 gdb/features/i386/amd64-avx-mpx.c                |  48 +++---
 gdb/features/i386/amd64-avx-mpx.xml              |   1 +
 gdb/features/i386/amd64-avx.c                    |  36 +++--
 gdb/features/i386/amd64-avx.xml                  |   1 +
 gdb/features/i386/amd64-mpx.c                    |  16 +-
 gdb/features/i386/amd64-mpx.xml                  |   1 +
 gdb/features/i386/amd64.c                        |   4 +
 gdb/features/i386/amd64.xml                      |   1 +
 gdb/regformats/i386/amd64-avx-avx512.dat         |   2 +
 gdb/regformats/i386/amd64-avx-mpx-avx512-pku.dat |   1 -
 gdb/regformats/i386/amd64-avx-mpx.dat            |   2 +
 gdb/regformats/i386/amd64-avx.dat                |   2 +
 gdb/regformats/i386/amd64-mpx.dat                |   2 +
 gdb/regformats/i386/amd64.dat                    |   2 +
 21 files changed, 361 insertions(+), 234 deletions(-)

-- 
2.13.0

^ permalink raw reply	[flat|nested] 18+ messages in thread

end of thread, other threads:[~2017-07-13 19:59 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-06-27 22:50 [PATCH 0/2] Support fs_base and gs_base for native FreeBSD/amd64 John Baldwin
2017-06-27 22:51 ` [PATCH 2/2] Support the fs_base and gs_base registers on FreeBSD/amd64 native processes John Baldwin
2017-07-11  8:09   ` Yao Qi
2017-06-27 22:51 ` [PATCH 1/2] Include the fs_base and gs_base registers in amd64 target descriptions John Baldwin
2017-07-11  8:03   ` Yao Qi
2017-07-11 16:26     ` John Baldwin
2017-07-12 12:16     ` Phil Muldoon
2017-07-12 13:02       ` Yao Qi
2017-07-12 13:51         ` Simon Marchi
2017-07-12 20:03           ` John Baldwin
2017-07-13 16:55             ` Yao Qi
2017-07-13 17:04               ` John Baldwin
2017-07-13 18:40               ` Pedro Alves
2017-07-13 19:59                 ` Pedro Alves
2017-07-12 16:23         ` Keith Seitz
2017-07-11  7:49 ` [PATCH 0/2] Support fs_base and gs_base for native FreeBSD/amd64 Yao Qi
2017-07-11 16:26   ` John Baldwin
  -- strict thread matches above, loose matches on Subject: below --
2017-06-27 12:19 John Baldwin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).